12 KiB
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)
- Load plan.md from feature directory → Extract tech stack, libraries, structure
- Load optional docs: data-model.md (entities), contracts/* (contract tests), research.md (decisions), quickstart.md (integration scenarios)
- Generate tasks by category: Setup → Tests → Core → Integration → Polish
- Apply rules: Different files = [P] parallel, same file = sequential; Tests before implementation (TDD)
- Number T001…; define dependencies; include parallel examples and Agent Task commands
Paths below are absolute to this repo.
Phase 3.1: Setup
-
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
- Create directories:
-
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
- Create /home/jawz/Development/Projects/GlowTrack/flake.nix providing:
-
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
-
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
-
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
- In /home/jawz/Development/Projects/GlowTrack/apps/web create a SvelteKit app:
-
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
-
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
-
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]
-
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
-
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
-
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]
-
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
-
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
-
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
-
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]
-
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
-
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
-
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
-
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
- apps/web components:
-
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