From f058a1b03a790d7d84cd9aadfd76de8734cf69ef Mon Sep 17 00:00:00 2001 From: Danilo Reyes Date: Thu, 18 Sep 2025 00:41:32 -0600 Subject: [PATCH] feat: Add detailed task specifications for GlowTrack mood and habit wellbeing grid --- specs/001-glowtrack-a-mood/tasks.md | 253 ++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 specs/001-glowtrack-a-mood/tasks.md diff --git a/specs/001-glowtrack-a-mood/tasks.md b/specs/001-glowtrack-a-mood/tasks.md new file mode 100644 index 0000000..a86d673 --- /dev/null +++ b/specs/001-glowtrack-a-mood/tasks.md @@ -0,0 +1,253 @@ +# 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 +- [ ] 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 + +- [ ] 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 + +- [ ] 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 + +- [ ] 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 + +- [ ] 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 \ No newline at end of file