Files
GlowTrack/specs/001-glowtrack-a-mood/tasks.md
2025-09-19 00:47:49 -06:00

253 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tasks: GlowTrack — Mood & Habit Wellbeing Grid
Input: /home/jawz/Development/Projects/GlowTrack/specs/001-glowtrack-a-mood/
Prerequisites: plan.md (required), research.md, data-model.md, contracts/
## Execution Flow (main)
1) Load plan.md from feature directory → Extract tech stack, libraries, structure
2) Load optional docs: data-model.md (entities), contracts/* (contract tests), research.md (decisions), quickstart.md (integration scenarios)
3) Generate tasks by category: Setup → Tests → Core → Integration → Polish
4) Apply rules: Different files = [P] parallel, same file = sequential; Tests before implementation (TDD)
5) Number T001…; define dependencies; include parallel examples and Agent Task commands
Paths below are absolute to this repo.
---
## Phase 3.1: Setup
- [X] T001 Create monorepo layout
- Create directories:
- /home/jawz/Development/Projects/GlowTrack/apps/web
- /home/jawz/Development/Projects/GlowTrack/packages/storage
- /home/jawz/Development/Projects/GlowTrack/packages/viz
- /home/jawz/Development/Projects/GlowTrack/packages/theme
- /home/jawz/Development/Projects/GlowTrack/tools/ci
- Add placeholder README.md in each new folder.
- Dependencies: none
- [X] T002 Initialize Nix flake (devShell + build outputs)
- Create /home/jawz/Development/Projects/GlowTrack/flake.nix providing:
- devShell with: nodejs (LTS 20+), pnpm, git, playwright browsers (via optional separate task), jq
- packages.app building static site from /apps/web (pnpm build)
- Add .envrc (optional) to auto-enter devShell
- Dependencies: T001
- [X] T003 Initialize pnpm workspaces
- Create /home/jawz/Development/Projects/GlowTrack/package.json (private workspace root) with scripts: lint, test, build, typecheck, format
- Create /home/jawz/Development/Projects/GlowTrack/pnpm-workspace.yaml listing apps/* and packages/*
- Dependencies: T001
- [X] T004 Configure linting, formatting, types
- Root: .editorconfig, .eslintrc.cjs, .prettierrc, .prettierignore, .npmrc (pnpm settings)
- Add dev deps: eslint, eslint-config-prettier, prettier, typescript, svelte-check
- Dependencies: T003
- [X] T005 Scaffold SvelteKit PWA (adapter-static)
- In /home/jawz/Development/Projects/GlowTrack/apps/web create a SvelteKit app:
- package.json, svelte.config.js (adapter-static), vite.config.ts, tsconfig.json
- src/app.d.ts, src/app.css, src/routes/+layout.svelte, src/routes/+page.svelte (hello grid)
- static/manifest.webmanifest (minimal)
- Add scripts: dev, build, preview, test, test:e2e, check
- Dependencies: T003, T004
- [X] T006 Tailwind CSS setup
- apps/web: tailwind.config.cjs, postcss.config.cjs; integrate @tailwindcss/forms
- Wire Tailwind into src/app.css and +layout.svelte
- Dependencies: T005
- [X] T007 Vitest + Playwright test harness
- apps/web: vitest config (vitest + svelte), playwright.config.ts with basic smoke project
- Root CI scripts in tools/ci (stub) and package scripts wiring
- Dependencies: T005
- [X] T008 PWA service worker wiring (SvelteKit)
- Enable service worker in SvelteKit config and add minimal SW handler
- Ensure static asset caching strategy is defined (runtime-minimal)
- Dependencies: T005
## Phase 3.2: Tests First (TDD) — MUST FAIL before 3.3
Contract files from /home/jawz/Development/Projects/GlowTrack/specs/001-glowtrack-a-mood/contracts/ → contract tests [P]
- [X] T009 [P] Contract test: export JSON schema
- Create /home/jawz/Development/Projects/GlowTrack/packages/storage/tests/contract/export.spec.ts
- Use Ajv to validate object from exportToJson() against export.schema.json at /home/jawz/Development/Projects/GlowTrack/specs/001-glowtrack-a-mood/contracts/export.schema.json
- Expect failure until export service implemented
- Dependencies: T007
- [X] T010 [P] Contract test: IndexedDB storage schema
- Create /home/jawz/Development/Projects/GlowTrack/packages/storage/tests/contract/schema.spec.ts
- Open DB via openDb() and assert stores/indexes per /home/jawz/Development/Projects/GlowTrack/specs/001-glowtrack-a-mood/contracts/storage.schema.md
- Expect failure until DB module/migrations implemented
- Dependencies: T007
- [X] T011 [P] Contract test: renderer API
- Create /home/jawz/Development/Projects/GlowTrack/packages/viz/tests/contract/renderer.spec.ts
- Assert renderGrid(container, days, theme, options) exists and draws required layers per /home/jawz/Development/Projects/GlowTrack/specs/001-glowtrack-a-mood/contracts/renderer.md
- Expect failure until viz renderer implemented
- Dependencies: T007
Integration scenarios from quickstart.md → e2e smoke tests [P]
- [X] T012 [P] E2E: mood + habits update tile
- Create /home/jawz/Development/Projects/GlowTrack/apps/web/tests/e2e/smoke.mood-habits.spec.ts
- Steps: open app → set day mood → add positive+negative habits → tile glow/luminance and glyphs update
- Dependencies: T007, T005
- [X] T013 [P] E2E: export/import JSON roundtrip
- Create /home/jawz/Development/Projects/GlowTrack/apps/web/tests/e2e/smoke.export-import.spec.ts
- Steps: create few days → export JSON → clear DB → import JSON → grid identical
- Dependencies: T007, T005
- [X] T014 [P] E2E: PNG export at screen resolution
- Create /home/jawz/Development/Projects/GlowTrack/apps/web/tests/e2e/smoke.png-export.spec.ts
- Steps: render month → export PNG (toBlob) → file within size/time budget
- Dependencies: T007, T005
- [X] T015 [P] E2E: offline PWA works
- Create /home/jawz/Development/Projects/GlowTrack/apps/web/tests/e2e/smoke.offline.spec.ts
- Steps: install SW → go offline → app loads and writes mood/entries; on reconnect, state persists
- Dependencies: T007, T008, T005
## Phase 3.3: Core Implementation (only after tests are failing)
From data-model.md → model creation tasks [P]
- [X] T016 [P] Define TypeScript models
- Create /home/jawz/Development/Projects/GlowTrack/packages/storage/src/models.ts
- Export interfaces: WellbeingGrid, GridSettings, ExportSettings, DayTile, Mood, HabitEntry, HabitDefinition
- Dependencies: T009-T015 (tests exist), T003
- [X] T017 [P] Implement IndexedDB schema v1
- Create /home/jawz/Development/Projects/GlowTrack/packages/storage/src/db.ts with openDb(name='glowtrack', version=1)
- Create stores: settings (key 'singleton'), habits (keyPath 'id', index by_type), days (keyPath 'date'), entries (keyPath 'id', indexes by_date, by_habit)
- Dependencies: T016, T010
- [X] T018 [P] Implement export/import service
- Create /home/jawz/Development/Projects/GlowTrack/packages/storage/src/export.ts with exportToJson(), importFromJson()
- Ensure JSON conforms to export.schema.json (version, app, exportedAt, data)
- Dependencies: T016, T009, T017
- [X] T019 [P] Compute helpers (netScore, derivations)
- Create /home/jawz/Development/Projects/GlowTrack/packages/storage/src/compute.ts implementing netScore, clamps, updates on entry CRUD
- Dependencies: T016
Renderer and theme [P]
- [ ] T020 [P] Renderer: minimal Canvas/SVG hybrid
- Create /home/jawz/Development/Projects/GlowTrack/packages/viz/src/renderer.ts exporting renderGrid(container, days, theme, options)
- Canvas tiles with glow luminance curve; SVG overlay for glyphs/focus rings
- Dependencies: T011, T016, T019
- [ ] T021 [P] Theme: CSS variables + palettes
- Create /home/jawz/Development/Projects/GlowTrack/packages/theme/src/tokens.css and /home/jawz/Development/Projects/GlowTrack/packages/theme/src/index.ts
- Provide color-blind modes: none, protanopia, deuteranopia, tritanopia
- Dependencies: T006
UI wiring
- [ ] T022 Minimal UI to edit and view grid
- apps/web components:
- /home/jawz/Development/Projects/GlowTrack/apps/web/src/lib/components/Grid.svelte (uses packages/viz)
- /home/jawz/Development/Projects/GlowTrack/apps/web/src/lib/components/DayEditor.svelte (set mood, add entries)
- /home/jawz/Development/Projects/GlowTrack/apps/web/src/routes/+page.svelte (compose editor + grid)
- Dependencies: T020, T021, T017, T019
- [ ] T023 Wire storage + export/import + PNG export
- Implement usage of openDb, exportToJson/importFromJson; add PNG export via renderer (toBlob)
- Add buttons: Export JSON, Import JSON, Export PNG
- Files: /home/jawz/Development/Projects/GlowTrack/apps/web/src/lib/actions/export.ts, import.ts, png.ts (or colocated in +page.svelte)
- Dependencies: T018, T020, T022
## Phase 3.4: Integration
- [ ] T024 Tailwind integration and base styles
- Ensure Tailwind classes purge safely; add base typography/forms styles in app.css
- Files: /home/jawz/Development/Projects/GlowTrack/apps/web/src/app.css, tailwind.config.cjs
- Dependencies: T006, T022
- [ ] T025 PWA manifest + SW behavior
- Ensure manifest.webmanifest, icons (placeholder), SW caching strategy aligned with offline write safety
- Files: /home/jawz/Development/Projects/GlowTrack/apps/web/static/manifest.webmanifest, src/service-worker.ts
- Dependencies: T008, T022
- [ ] T026 Basic logging and error UX
- Add simple structured console logs in dev; user-visible error toasts for import failures
- Files: /home/jawz/Development/Projects/GlowTrack/apps/web/src/lib/stores/toast.ts, components/Toast.svelte
- Dependencies: T022, T023
## Phase 3.5: Polish
- [ ] T027 [P] Unit tests for compute helpers
- Create /home/jawz/Development/Projects/GlowTrack/packages/storage/tests/unit/compute.spec.ts covering netScore, clamping, entry CRUD recompute
- Dependencies: T019
- [ ] T028 [P] Renderer perf sanity test
- Create /home/jawz/Development/Projects/GlowTrack/packages/viz/tests/perf/render.perf.spec.ts rendering 365 tiles under budget; assert frame time thresholds (coarse)
- Dependencies: T020
- [ ] T029 [P] Docs: READMEs and quickstart wiring
- Update /home/jawz/Development/Projects/GlowTrack/README.md and /home/jawz/Development/Projects/GlowTrack/apps/web/README.md; link to spec and tasks
- Dependencies: T022, T023
- [ ] T030 Final build + e2e pass via Nix
- Run nix build .#app and playwright e2e; attach artifacts
- Dependencies: T015, T025, T029
---
## Dependencies Summary
- Setup (T001T008) before Tests (T009T015)
- Tests before Core (T016T023)
- Models (T016) before Storage services (T017T019)
- Storage services before UI wiring (T022T023)
- Renderer (T020) and Theme (T021) before Grid UI (T022)
- PWA wiring (T008, T025) before Offline e2e (T015)
- Polish (T027T030) after Core/Integration
## Parallel Execution Examples
Launch independent [P] tasks together (different paths, no shared files):
```
Task: "T009 [P] Contract test: export JSON schema in /packages/storage/tests/contract/export.spec.ts"
Task: "T010 [P] Contract test: IndexedDB storage schema in /packages/storage/tests/contract/schema.spec.ts"
Task: "T011 [P] Contract test: renderer API in /packages/viz/tests/contract/renderer.spec.ts"
Task: "T012 [P] E2E mood+habits in /apps/web/tests/e2e/smoke.mood-habits.spec.ts"
Task: "T013 [P] E2E export/import in /apps/web/tests/e2e/smoke.export-import.spec.ts"
Task: "T014 [P] E2E PNG export in /apps/web/tests/e2e/smoke.png-export.spec.ts"
Task: "T027 [P] Unit tests compute in /packages/storage/tests/unit/compute.spec.ts"
Task: "T028 [P] Renderer perf test in /packages/viz/tests/perf/render.perf.spec.ts"
Task: "T029 [P] Docs updates in /README.md and /apps/web/README.md"
```
Agent Task commands (example grouping):
```
# Group 1: Contract + e2e tests (T009T015)
Task: "Create failing contract tests for export, storage, renderer"
Task: "Create failing e2e smoke tests for mood/habits, export/import, PNG, offline"
# Group 2: Models and services (T016T019)
Task: "Implement models.ts, db.ts, export.ts, compute.ts in packages/storage"
# Group 3: Viz + theme (T020T021)
Task: "Implement renderer.ts in packages/viz and tokens.css in packages/theme"
# Group 4: UI wiring (T022T026)
Task: "Build minimal UI and wire storage/export/PNG + PWA"
# Group 5: Polish and build (T027T030)
Task: "Add unit/perf tests, docs, and run final Nix build + e2e"
```
## Validation Checklist
- All contract files have corresponding tests (T009T011) → YES
- All entities have model tasks (T016) → YES
- All tests come before implementation → YES (Phase 3.2 precedes 3.3)
- [P] tasks are independent and avoid same-file edits → YES
- Each task specifies exact absolute file paths → YES
- No task with [P] modifies the same file as another [P] task → YES
Notes
- Use adapter-static for SvelteKit; no backend services
- Local-first via IndexedDB (idb) with versioned migrations
- Tailwind + CSS variables for theming and color-blind modes
- Reproducible dev via Nix; CI can reuse flake outputs