253 lines
12 KiB
Markdown
253 lines
12 KiB
Markdown
# 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 (T001–T008) before Tests (T009–T015)
|
||
- Tests before Core (T016–T023)
|
||
- Models (T016) before Storage services (T017–T019)
|
||
- Storage services before UI wiring (T022–T023)
|
||
- Renderer (T020) and Theme (T021) before Grid UI (T022)
|
||
- PWA wiring (T008, T025) before Offline e2e (T015)
|
||
- Polish (T027–T030) 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 (T009–T015)
|
||
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 (T016–T019)
|
||
Task: "Implement models.ts, db.ts, export.ts, compute.ts in packages/storage"
|
||
|
||
# Group 3: Viz + theme (T020–T021)
|
||
Task: "Implement renderer.ts in packages/viz and tokens.css in packages/theme"
|
||
|
||
# Group 4: UI wiring (T022–T026)
|
||
Task: "Build minimal UI and wire storage/export/PNG + PWA"
|
||
|
||
# Group 5: Polish and build (T027–T030)
|
||
Task: "Add unit/perf tests, docs, and run final Nix build + e2e"
|
||
```
|
||
|
||
## Validation Checklist
|
||
- All contract files have corresponding tests (T009–T011) → 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 |