# 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 - [ ] 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