its-magic 0.1.2-9 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +1602 -755
  2. package/bin/its-magic.js +121 -11
  3. package/bin/postinstall.js +21 -0
  4. package/installer.ps1 +759 -0
  5. package/installer.py +981 -0
  6. package/installer.sh +649 -0
  7. package/package.json +18 -14
  8. package/scripts/check_intake_template_parity.py +284 -0
  9. package/scripts/doc_profile_lib.py +415 -0
  10. package/scripts/guard_installer_publish.py +88 -0
  11. package/scripts/intake_bug_routing_guard.py +67 -0
  12. package/scripts/intake_evidence_lib.py +802 -0
  13. package/scripts/intake_evidence_validate.py +73 -0
  14. package/scripts/materialize_codebase_map.py +184 -0
  15. package/scripts/remote_config_summary.py +243 -0
  16. package/template/.cursor/agents/curator.mdc +35 -0
  17. package/template/.cursor/agents/dev.mdc +29 -0
  18. package/template/.cursor/agents/po.mdc +141 -0
  19. package/template/.cursor/agents/qa.mdc +28 -0
  20. package/template/.cursor/agents/release.mdc +28 -0
  21. package/template/.cursor/agents/security.mdc +98 -0
  22. package/template/.cursor/agents/tech-lead.mdc +57 -0
  23. package/template/.cursor/commands/architecture.md +127 -0
  24. package/template/.cursor/commands/ask.md +55 -0
  25. package/template/.cursor/commands/auto.md +533 -0
  26. package/template/.cursor/commands/discovery.md +47 -0
  27. package/template/.cursor/commands/execute.md +343 -0
  28. package/template/.cursor/commands/intake.md +323 -0
  29. package/template/.cursor/commands/map-codebase.md +46 -0
  30. package/template/.cursor/commands/memory-audit.md +175 -0
  31. package/template/.cursor/commands/milestone-complete.md +51 -0
  32. package/template/.cursor/commands/milestone-start.md +59 -0
  33. package/template/.cursor/commands/pause.md +64 -0
  34. package/{.cursor/commands/gsd-phase-context.md → template/.cursor/commands/phase-context.md} +6 -2
  35. package/template/.cursor/commands/plan-verify.md +34 -0
  36. package/template/.cursor/commands/qa.md +226 -0
  37. package/template/.cursor/commands/quick.md +41 -0
  38. package/template/.cursor/commands/refresh-context.md +82 -0
  39. package/template/.cursor/commands/release.md +505 -0
  40. package/template/.cursor/commands/research.md +49 -0
  41. package/template/.cursor/commands/resume.md +67 -0
  42. package/template/.cursor/commands/security-review.md +81 -0
  43. package/template/.cursor/commands/sprint-plan.md +103 -0
  44. package/template/.cursor/commands/status-reconcile.md +95 -0
  45. package/template/.cursor/commands/verify-work.md +152 -0
  46. package/template/.cursor/dev-environment.json.example +22 -0
  47. package/{.cursor → template/.cursor}/hooks/README.md +3 -2
  48. package/{.cursor/hooks/gsd-hook.py → template/.cursor/hooks/hook.py} +15 -6
  49. package/template/.cursor/hooks.json +26 -0
  50. package/template/.cursor/remote.json +31 -0
  51. package/template/.cursor/rules/caveman.mdc +184 -0
  52. package/template/.cursor/rules/coding-standards.mdc +39 -0
  53. package/template/.cursor/rules/core.mdc +111 -0
  54. package/template/.cursor/rules/handoffs.mdc +27 -0
  55. package/template/.cursor/rules/quality.mdc +49 -0
  56. package/template/.cursor/scratchpad.local.example.md +323 -0
  57. package/template/.cursor/scratchpad.md +324 -0
  58. package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/SKILL.md +2 -2
  59. package/template/.cursorignore +6 -0
  60. package/template/.env.example +28 -0
  61. package/template/.github/workflows/ci.yml +194 -0
  62. package/{.github → template/.github}/workflows/deploy.yml +5 -2
  63. package/template/.its-magic-version +1 -0
  64. package/template/README.md +1602 -0
  65. package/template/decisions/DEC-0001.md +11 -0
  66. package/template/decisions/DEC-0002.md +11 -0
  67. package/template/docs/developer/README.md +44 -0
  68. package/template/docs/engineering/architecture.md +9 -0
  69. package/template/docs/engineering/artifact-ordering-policy.md +48 -0
  70. package/template/docs/engineering/artifact-ownership-policy.md +57 -0
  71. package/template/docs/engineering/auto-orchestration-reference.md +1211 -0
  72. package/{docs → template/docs}/engineering/codebase-map.md +0 -5
  73. package/template/docs/engineering/compatibility-report.md +20 -0
  74. package/template/docs/engineering/compatibility-signals.md +7 -0
  75. package/template/docs/engineering/component-scope-report.md +16 -0
  76. package/template/docs/engineering/component-scope.md +19 -0
  77. package/template/docs/engineering/context/installer-owned-paths.manifest +96 -0
  78. package/template/docs/engineering/context/readme-section-affinity.json +30 -0
  79. package/template/docs/engineering/decisions.md +16 -0
  80. package/template/docs/engineering/legacy-drift-audit.md +21 -0
  81. package/template/docs/engineering/manifests/components/api-gateway.manifest.yaml +12 -0
  82. package/template/docs/engineering/manifests/registry.manifest.yaml +20 -0
  83. package/template/docs/engineering/manifests/repo.manifest.yaml +11 -0
  84. package/template/docs/engineering/phase-context.md +16 -0
  85. package/template/docs/engineering/release-targets.json +123 -0
  86. package/template/docs/engineering/research.md +29 -0
  87. package/template/docs/engineering/runbook.md +2320 -0
  88. package/template/docs/engineering/runtime-connectivity.md +81 -0
  89. package/template/docs/engineering/security-review.md +33 -0
  90. package/template/docs/engineering/spec-pack/README.md +20 -0
  91. package/template/docs/engineering/state-archive/README.md +15 -0
  92. package/template/docs/engineering/state.md +20 -0
  93. package/template/docs/engineering/status-normalization-report.md +19 -0
  94. package/template/docs/engineering/token-cost-parity-manifest.md +16 -0
  95. package/template/docs/engineering/us-0084-remote-e2e.md +44 -0
  96. package/template/docs/product/acceptance.md +1 -0
  97. package/template/docs/product/backlog.md +5 -0
  98. package/template/docs/product/vision.md +11 -0
  99. package/template/docs/user-guides/README.md +40 -0
  100. package/{handoffs → template/handoffs}/dev_to_qa.md +0 -3
  101. package/{handoffs → template/handoffs}/po_to_tl.md +0 -3
  102. package/{handoffs → template/handoffs}/qa_to_dev.md +1 -2
  103. package/template/handoffs/release_notes.md +51 -0
  104. package/template/handoffs/release_queue.md +47 -0
  105. package/template/handoffs/release_to_dev.md +31 -0
  106. package/template/handoffs/releases/Sxxxx-release-notes.md +62 -0
  107. package/template/handoffs/resume_brief.md +14 -0
  108. package/{handoffs → template/handoffs}/tl_to_dev.md +0 -2
  109. package/template/handoffs/token_cost_runs/README.md +26 -0
  110. package/template/its_magic/.its-magic-version +1 -0
  111. package/template/its_magic/README.md +9 -0
  112. package/template/scripts/auto_outer_driver.py +521 -0
  113. package/template/scripts/caveman_compress_input.py +903 -0
  114. package/template/scripts/check_downstream_ci_guard.py +67 -0
  115. package/template/scripts/check_intake_template_parity.py +284 -0
  116. package/template/scripts/check_token_cost_parity.py +69 -0
  117. package/template/scripts/dev_environment_lib.py +463 -0
  118. package/template/scripts/doc_profile_lib.py +415 -0
  119. package/template/scripts/downstream_ci_guard_lib.py +222 -0
  120. package/template/scripts/enforce-triad-hot-surface.py +753 -0
  121. package/template/scripts/guard_installer_publish.py +88 -0
  122. package/template/scripts/intake_bug_resume_brief_refresh.py +303 -0
  123. package/template/scripts/intake_bug_routing_guard.py +67 -0
  124. package/template/scripts/intake_evidence_lib.py +802 -0
  125. package/template/scripts/intake_evidence_validate.py +73 -0
  126. package/template/scripts/materialize_codebase_map.py +184 -0
  127. package/template/scripts/pack_json_validate.py +130 -0
  128. package/template/scripts/project_readme_coverage_lib.py +417 -0
  129. package/template/scripts/readme_feature_coverage_lib.py +608 -0
  130. package/template/scripts/remote_config_summary.py +243 -0
  131. package/template/scripts/sync_push_gates.py +198 -0
  132. package/template/scripts/token_cost_compare.py +40 -0
  133. package/template/scripts/token_cost_lib.py +108 -0
  134. package/template/scripts/uat_probe_lib.py +868 -0
  135. package/template/scripts/validate-and-push.ps1 +280 -0
  136. package/template/scripts/validate-and-push.sh +243 -0
  137. package/template/scripts/validate_doc_profile.py +103 -0
  138. package/template/scripts/validate_project_readme_coverage.py +151 -0
  139. package/template/scripts/validate_readme_feature_coverage.py +140 -0
  140. package/template/sprints/S0001/progress.md +1 -0
  141. package/template/sprints/S0001/qa-findings.md +9 -0
  142. package/template/sprints/S0001/release-findings.md +24 -0
  143. package/template/sprints/S0001/sprint.md +9 -0
  144. package/template/sprints/S0001/summary.md +7 -0
  145. package/template/sprints/S0001/tasks.md +1 -0
  146. package/template/sprints/S0001/uat.json +6 -0
  147. package/template/sprints/S0001/uat.md +5 -0
  148. package/template/sprints/quick/Q0001/summary.md +1 -0
  149. package/{sprints → template/sprints}/quick/Q0001/task.json +0 -1
  150. package/.cursor/agents/curator.mdc +0 -21
  151. package/.cursor/agents/dev.mdc +0 -20
  152. package/.cursor/agents/po.mdc +0 -19
  153. package/.cursor/agents/qa.mdc +0 -19
  154. package/.cursor/agents/release.mdc +0 -19
  155. package/.cursor/agents/tech-lead.mdc +0 -21
  156. package/.cursor/commands/gsd-architecture.md +0 -29
  157. package/.cursor/commands/gsd-auto.md +0 -27
  158. package/.cursor/commands/gsd-discovery.md +0 -27
  159. package/.cursor/commands/gsd-execute.md +0 -32
  160. package/.cursor/commands/gsd-intake.md +0 -28
  161. package/.cursor/commands/gsd-map-codebase.md +0 -25
  162. package/.cursor/commands/gsd-milestone-complete.md +0 -24
  163. package/.cursor/commands/gsd-milestone-start.md +0 -26
  164. package/.cursor/commands/gsd-pause.md +0 -25
  165. package/.cursor/commands/gsd-plan-verify.md +0 -26
  166. package/.cursor/commands/gsd-qa.md +0 -28
  167. package/.cursor/commands/gsd-quick.md +0 -24
  168. package/.cursor/commands/gsd-refresh-context.md +0 -26
  169. package/.cursor/commands/gsd-release.md +0 -29
  170. package/.cursor/commands/gsd-research.md +0 -28
  171. package/.cursor/commands/gsd-resume.md +0 -26
  172. package/.cursor/commands/gsd-sprint-plan.md +0 -30
  173. package/.cursor/commands/gsd-verify-work.md +0 -25
  174. package/.cursor/hooks.json +0 -26
  175. package/.cursor/plans/cursor-gsd-team-kit_8cfee9b8.plan.md +0 -57
  176. package/.cursor/remote.json +0 -18
  177. package/.cursor/rules/gsd-core.mdc +0 -18
  178. package/.cursor/rules/gsd-handoffs.mdc +0 -10
  179. package/.cursor/rules/gsd-quality.mdc +0 -15
  180. package/.cursor/scratchpad.md +0 -34
  181. package/.github/workflows/ci.yml +0 -47
  182. package/decisions/DEC-0001.md +0 -21
  183. package/decisions/DEC-0002.md +0 -21
  184. package/docs/engineering/architecture.md +0 -354
  185. package/docs/engineering/decisions.md +0 -6
  186. package/docs/engineering/research.md +0 -11
  187. package/docs/engineering/runbook.md +0 -32
  188. package/docs/engineering/state.md +0 -33
  189. package/docs/product/acceptance.md +0 -6
  190. package/docs/product/backlog.md +0 -7
  191. package/docs/product/vision.md +0 -46
  192. package/gsd-installer.ps1 +0 -189
  193. package/gsd-installer.py +0 -195
  194. package/gsd-installer.sh +0 -201
  195. package/handoffs/release_notes.md +0 -14
  196. package/handoffs/resume_brief.md +0 -8
  197. package/milestones/M0001/milestone.json +0 -7
  198. package/milestones/M0001/phases.json +0 -9
  199. package/milestones/M0001/progress.md +0 -3
  200. package/milestones/M0001/summary.md +0 -3
  201. package/scripts/generate-release-notes.ps1 +0 -74
  202. package/scripts/generate-release-notes.sh +0 -63
  203. package/scripts/release-all.ps1 +0 -423
  204. package/scripts/release-all.sh +0 -226
  205. package/sprints/S0001/progress.md +0 -4
  206. package/sprints/S0001/qa-findings.md +0 -113
  207. package/sprints/S0001/sprint.md +0 -70
  208. package/sprints/S0001/summary.md +0 -46
  209. package/sprints/S0001/tasks.md +0 -35
  210. package/sprints/S0001/uat.json +0 -8
  211. package/sprints/S0001/uat.md +0 -8
  212. package/sprints/quick/Q0001/summary.md +0 -3
  213. /package/{.cursor/rules/gsd-escalation.mdc → template/.cursor/rules/escalation.mdc} +0 -0
  214. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.json +0 -0
  215. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.md +0 -0
  216. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.json +0 -0
  217. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.md +0 -0
  218. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.json +0 -0
  219. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.md +0 -0
  220. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.json +0 -0
  221. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.md +0 -0
  222. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/milestone.json +0 -0
  223. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/phase-context.json +0 -0
  224. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/plan-verify.json +0 -0
  225. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.json +0 -0
  226. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.md +0 -0
  227. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.json +0 -0
  228. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.md +0 -0
  229. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/uat.json +0 -0
  230. /package/{docs → template/docs}/engineering/context/phase-template.json +0 -0
  231. /package/{docs → template/docs}/engineering/dependencies.json +0 -0
  232. /package/{sprints → template/sprints}/S0001/plan-verify.json +0 -0
@@ -1,113 +0,0 @@
1
- # QA Findings — Webview UI → Backend Integration & Invalid Input Handling
2
-
3
- **Sprint:** S0001
4
- **Date:** 2026-02-06
5
- **Scope:** Verify the webview UI calls the backend correctly and handles invalid input.
6
- **Method:** Static code review of `examples/webview-app/` (frontend + backend + shared schema).
7
-
8
- ---
9
-
10
- ## Test Plan
11
-
12
- ### Area 1 — UI → Backend API Calls
13
-
14
- | # | Test Case | Frontend Entry Point | API Endpoint | Result |
15
- |---|-----------|---------------------|-------------|--------|
16
- | 1 | Initial page load fetches items | `loadItems()` on bootstrap (line 338) | `GET /api/v1/items` | PASS |
17
- | 2 | Filter change reloads items | `change` listeners → `loadItems()` (lines 301-304) | `GET /api/v1/items?status=…&category=…` | PASS |
18
- | 3 | Search input debounced reload | `input` → 300ms debounce → `loadItems()` (lines 305-308) | `GET /api/v1/items?search=…` | PASS |
19
- | 4 | Pagination prev/next | Button clicks update `currentMeta.page` → `loadItems()` (lines 315-320) | `GET /api/v1/items?page=N` | PASS |
20
- | 5 | Click item opens detail | `openDetail()` → `fetchItem(id)` (lines 215-230) | `GET /api/v1/items/:id` | PASS |
21
- | 6 | Delete item calls API | `handleDelete()` → `deleteItem(id)` (lines 263-275) | `DELETE /api/v1/items/:id` | PASS |
22
- | 7 | Clear/reset filters resets & reloads | `clearFilters()` → `loadItems()` (lines 252-259) | `GET /api/v1/items` (defaults) | PASS |
23
- | 8 | Keyboard nav (arrows) opens detail | `navigateItem()` → `openDetail()` (lines 329-334) | `GET /api/v1/items/:id` | PASS |
24
- | 9 | Request headers set Content-Type JSON | `apiFetch()` sets `Content-Type: application/json` (line 52) | All endpoints | PASS |
25
- | 10 | 204 response handled (delete) | `apiFetch()` returns null on 204 (line 56) | `DELETE /api/v1/items/:id` | PASS |
26
-
27
- ### Area 2 — Invalid Input Handling
28
-
29
- | # | Test Case | Frontend Behaviour | Backend Behaviour | Result |
30
- |---|-----------|--------------------|--------------------|--------|
31
- | 11 | API returns 400 validation error | `apiFetch()` throws structured Error with code/details (lines 60-64) | 400 + `VALIDATION_ERROR` envelope | PASS |
32
- | 12 | List load failure shows error in UI | `loadItems()` catch renders `.error-message` div (lines 208-211) | N/A | PASS |
33
- | 13 | Detail load failure feedback | `openDetail()` catch logs to console only (lines 227-229) | 404 `NOT_FOUND` | **FAIL** |
34
- | 14 | Delete failure shows alert | `handleDelete()` catch calls `alert()` (lines 272-274) | 404/400 | PASS |
35
- | 15 | Search maxlength enforced client-side | `<input maxlength="200">` (index.html line 50) | `validateQuery` checks ≤200 (validators.js line 149) | PASS |
36
- | 16 | XSS prevention | `escapeHtml()` used for title/category rendering (lines 143, 147) | N/A | PASS |
37
- | 17 | Invalid status in query params | Backend rejects with 400 | `validateQuery` checks enum (validators.js lines 137-146) | PASS |
38
- | 18 | Invalid sort/order params | Backend rejects with 400 | `validateQuery` checks enum (validators.js lines 167-171) | PASS |
39
- | 19 | Invalid page/pageSize params | Backend rejects with 400 | `validateQuery` checks integer + range (validators.js lines 159-164) | PASS |
40
- | 20 | Non-JSON backend response | `res.json()` throws SyntaxError — unhandled gracefully | N/A | **FAIL** |
41
- | 21 | Category filter not validated by backend | Unrecognized category returns empty list (no error) | No category enum validation in `validateQuery` | **WARN** |
42
- | 22 | POST/PATCH body validation (title required) | N/A (no create/edit UI) | `validateBody` enforces required + length (validators.js lines 82-124) | PASS |
43
-
44
- ---
45
-
46
- ## Findings
47
-
48
- ### F-001 — Silent failure on item detail fetch (Medium)
49
-
50
- **File:** `examples/webview-app/frontend/app.js` lines 224-229
51
- **Severity:** Medium
52
- **Category:** UX / Error handling
53
-
54
- `openDetail()` catches fetch errors but only logs to `console.error`. The user receives no visible feedback when a detail fetch fails (e.g., item deleted by another user, network error). Compare with `loadItems()` which renders an inline error message, and `handleDelete()` which shows an `alert()`.
55
-
56
- **Expected:** Display a user-visible error in the detail panel or a toast notification.
57
- **Recommendation:** Render an error state inside `$detailPanel` or show an inline banner, consistent with the error handling in `loadItems()`.
58
-
59
- ---
60
-
61
- ### F-002 — Non-JSON error responses crash `apiFetch` (Medium)
62
-
63
- **File:** `examples/webview-app/frontend/app.js` lines 49-68
64
- **Severity:** Medium
65
- **Category:** Robustness
66
-
67
- `apiFetch()` unconditionally calls `res.json()` for all non-204 responses (line 58). If the backend returns a non-JSON response (e.g., an HTML proxy error page, a 502 from a reverse proxy, or a plain-text 500), `res.json()` will throw a `SyntaxError` instead of the structured error the callers expect.
68
-
69
- **Expected:** Graceful handling of non-JSON responses with a fallback error message.
70
- **Recommendation:** Wrap `res.json()` in a try/catch or check the `Content-Type` header before parsing.
71
-
72
- ---
73
-
74
- ### F-003 — No loading/spinner state during API calls (Low)
75
-
76
- **File:** `examples/webview-app/frontend/app.js`
77
- **Severity:** Low
78
- **Category:** UX
79
-
80
- No loading indicator is shown during any API call (`loadItems`, `openDetail`, `handleDelete`). On slow connections or when the backend is unresponsive, the UI appears frozen with no feedback.
81
-
82
- **Expected:** A spinner or skeleton state while data is loading.
83
-
84
- ---
85
-
86
- ### F-004 — Category filter values not validated on backend (Low)
87
-
88
- **File:** `examples/webview-app/backend/validators.js` lines 132-185
89
- **Severity:** Low
90
- **Category:** Validation gap
91
-
92
- `validateQuery` validates `status` against the schema enum but does not validate the `category` query parameter against any allow-list. An arbitrary category value like `?category=XSS_ATTEMPT` would simply produce an empty result set (no crash), so this is low-severity. However, it is inconsistent with the `status` validation approach.
93
-
94
- ---
95
-
96
- ### F-005 — Soft-delete confirmation implies restorability but no restore UI exists (Low)
97
-
98
- **File:** `examples/webview-app/frontend/app.js` line 265
99
- **Severity:** Low
100
- **Category:** UX
101
-
102
- The delete confirmation says _"This action is reversible (soft delete)"_, which is technically true at the data layer. However, no UI exists to undelete items, making this effectively irreversible from the user's perspective.
103
-
104
- ---
105
-
106
- ## Verdict
107
-
108
- | Severity | Count |
109
- |----------|-------|
110
- | Medium | 2 (F-001, F-002) |
111
- | Low | 3 (F-003, F-004, F-005) |
112
-
113
- **Overall:** The UI correctly calls all documented backend endpoints. Filter, search, pagination, detail, and delete flows all route to the correct API paths with proper parameters. Backend validation is solid with structured error envelopes. Two medium-severity gaps exist in frontend error handling that should be addressed before release: silent detail fetch failures (F-001) and non-JSON response handling (F-002). No critical/blocking defects found.
@@ -1,70 +0,0 @@
1
- # Sprint S0001
2
-
3
- ## Goal
4
-
5
- Deliver a working vertical slice: filtered item list with detail panel, powered by a shared-schema REST API. Users can filter items by status/category/date, view details in a slide-over panel, and create/update items — all validated end-to-end with shared Zod schemas.
6
-
7
- ## Scope
8
-
9
- - **US-0002** — Filter Bar with Instant Results
10
- - **US-0003** — Slide-Over Detail Panel
11
- - **US-0004** — Empty-State & Filter Awareness
12
-
13
- ## User Stories → Task Mapping
14
-
15
- | Story | Tasks |
16
- |---------|--------------------------------|
17
- | US-0002 | T-015, T-016, T-017, T-018, T-019 |
18
- | US-0003 | T-010, T-016, T-020 |
19
- | US-0004 | T-021 |
20
- | Infra | T-001, T-002, T-003, T-007, T-008, T-022 |
21
-
22
- ## Build Order (dependency chain)
23
-
24
- ```
25
- T-001 Scaffold workspace
26
- └─ T-002 Shared Zod schemas + types
27
- ├─ T-003 tsconfig path aliases
28
- ├─ T-004 Backend validation middleware
29
- └─ T-005 Frontend form validation setup
30
-
31
- T-007 Express server + health check ─┐
32
- T-008 Drizzle schema + SQLite setup ──┤
33
- T-014 Error envelope ────────────────┘
34
-
35
- T-009 GET /items (filtered + paginated)
36
- T-010 GET /items/:id
37
- T-011 POST /items
38
- T-012 PATCH /items/:id
39
- T-013 DELETE /items/:id (soft)
40
-
41
- T-015 React + Vite + Tailwind shell ─┐
42
- T-022 Vite dev proxy ────────────────┘
43
-
44
- T-016 Typed API client + TanStack Query hooks
45
- T-006 Response validation on API client
46
-
47
- T-017 FilterBar component
48
- T-018 useFilters hook (URL sync)
49
- T-019 ItemList component
50
- T-020 DetailPanel component
51
- T-021 EmptyState component
52
- ```
53
-
54
- ## Risks
55
-
56
- | Risk | Likelihood | Impact | Mitigation |
57
- |------|-----------|--------|------------|
58
- | Shared schema drift if `/shared` is not built first | Medium | High | npm workspaces build order: shared → backend → frontend |
59
- | CORS misconfiguration between SPA and API | Medium | Low | Vite proxy for dev; explicit CORS middleware for prod |
60
- | SQLite → PostgreSQL dialect differences | Low | Medium | Drizzle ORM abstracts dialect; test against both in CI |
61
- | Filter query params exceed URL length | Low | Low | Start with 4 dimensions; add POST filter fallback if needed |
62
-
63
- ## Definition of Done
64
-
65
- - All 22 tasks complete and checked off in `tasks.md`
66
- - Shared schemas consumed by both frontend and backend without duplication
67
- - API returns structured error envelope for validation failures
68
- - Filter bar updates list instantly; active filters reflected in URL
69
- - Detail panel opens/closes with keyboard navigation (arrows, Escape)
70
- - Empty state renders with "Reset filters" action when no results match
@@ -1,46 +0,0 @@
1
- # Sprint Summary — S0001
2
-
3
- ## Goal
4
-
5
- Deliver a working vertical slice: filtered item list with detail panel, powered by a shared-schema REST API.
6
-
7
- ## Completed
8
-
9
- - GSD Workflow Kit: all slash commands, agent roles, rules, templates, and CI/CD workflows
10
- - Installers (PowerShell, Bash, Python) for kit distribution
11
- - Benchmark harness (scenario, live, headless, prompted modes)
12
- - Reference app (`examples/webview-app/`):
13
- - Express backend with full CRUD API (`/api/v1/items`)
14
- - Shared JSON Schema for cross-layer validation
15
- - Structured error envelopes (VALIDATION_ERROR, NOT_FOUND, INTERNAL_ERROR)
16
- - Frontend SPA with filter bar, sortable list, pagination
17
- - Slide-over detail panel with keyboard navigation
18
- - Empty state with filter awareness and reset action
19
- - XSS prevention, soft-delete, seed data (20 items)
20
- - Architecture decisions documented (DEC-0001, DEC-0002)
21
- - QA review completed — 22 test cases, 20 PASS, 2 FAIL, 1 WARN
22
-
23
- ## User Stories Delivered
24
-
25
- | Story | Title | Status |
26
- |---------|--------------------------------|-----------|
27
- | US-0002 | Filter Bar with Instant Results | Delivered |
28
- | US-0003 | Slide-Over Detail Panel | Delivered |
29
- | US-0004 | Empty-State & Filter Awareness | Delivered |
30
-
31
- ## Open Items
32
-
33
- - **F-001** (Medium): Silent failure on item detail fetch — needs visible user feedback
34
- - **F-002** (Medium): Non-JSON error responses crash `apiFetch` — needs try/catch or Content-Type check
35
- - **F-003** (Low): No loading/spinner state during API calls
36
- - **F-004** (Low): Category filter values not validated on backend
37
- - **F-005** (Low): Soft-delete confirmation implies restorability but no restore UI exists
38
-
39
- ## Metrics
40
-
41
- - QA test cases: 22
42
- - Pass: 20 | Fail: 2 | Warn: 1
43
- - Critical/blocking defects: 0
44
- - Medium findings: 2
45
- - Low findings: 3
46
-
@@ -1,35 +0,0 @@
1
- # Tasks — Sprint S0001
2
-
3
- ## Shared Schema
4
-
5
- - [ ] **T-001** Scaffold npm workspace with `frontend/`, `backend/`, `shared/` packages and root `package.json` with workspaces config
6
- - [ ] **T-002** Create shared Zod schemas: `shared/schemas/item.schema.ts` (CreateItemSchema, UpdateItemSchema, ItemStatus enum) and `shared/schemas/filter.schema.ts` (ItemFilterSchema with pagination, sort, date range); export inferred TypeScript types from `shared/types/`
7
- - [ ] **T-003** Configure `tsconfig.base.json` with path aliases (`@shared/*`) and per-package tsconfig files extending it
8
-
9
- ## Validation
10
-
11
- - [ ] **T-004** Implement backend validation middleware (`backend/src/middleware/validate.ts`) — generic Zod safeParse for body, query, and params; returns 400 with structured error details on failure
12
- - [ ] **T-005** Configure frontend form validation with `@hookform/resolvers/zod` using shared CreateItemSchema and UpdateItemSchema
13
- - [ ] **T-006** Add response validation on frontend API client — parse API responses through shared Zod schemas to catch contract drift at runtime
14
-
15
- ## API
16
-
17
- - [ ] **T-007** Stand up Express 5 server (`backend/src/server.ts`) with health check endpoint (`GET /api/v1/health`), CORS middleware, JSON body parser, and global error handler
18
- - [ ] **T-008** Create Drizzle ORM schema (`backend/src/db/schema.ts`) with items table (id, title, status, category, description, metadata, createdAt, updatedAt, deletedAt) and SQLite connection for dev
19
- - [ ] **T-009** Implement `GET /api/v1/items` — filtered list with status, category, dateFrom/dateTo, search, pagination (page/pageSize), sort, and order; uses validate middleware with ItemFilterSchema; returns data array + meta object
20
- - [ ] **T-010** Implement `GET /api/v1/items/:id` — single item with full details; returns 404 with error envelope if not found
21
- - [ ] **T-011** Implement `POST /api/v1/items` — create item; validates body with CreateItemSchema; returns 201 with created item
22
- - [ ] **T-012** Implement `PATCH /api/v1/items/:id` — partial update; validates body with UpdateItemSchema; returns updated item or 404
23
- - [ ] **T-013** Implement `DELETE /api/v1/items/:id` — soft delete (set deletedAt); returns 204 No Content or 404
24
- - [ ] **T-014** Implement structured error envelope middleware — consistent `{ error: { code, message, details } }` shape for VALIDATION_ERROR, NOT_FOUND, and INTERNAL_ERROR
25
-
26
- ## UI
27
-
28
- - [ ] **T-015** Scaffold React 18 + Vite + TypeScript app in `frontend/`; install and configure Tailwind CSS, React Router v6 with a root layout route
29
- - [ ] **T-016** Create typed API client (`frontend/src/api/client.ts`) and TanStack Query hooks (`useItems`, `useItem`, `useCreateItem`, `useUpdateItem`, `useDeleteItem`) wrapping all endpoints
30
- - [ ] **T-017** Build `FilterBar` component — horizontal chip-based multi-select for status, category, and date range (US-0002); active filters shown as filled chips with "x" dismiss; "Clear all" link when 2+ filters active
31
- - [ ] **T-018** Build `useFilters` hook — reads/writes filter state to URL search params via React Router `useSearchParams`; provides `setFilter`, `removeFilter`, `clearAll`, and `activeFilterCount`
32
- - [ ] **T-019** Build `ItemList` component — renders filtered items in a scrollable list; supports keyboard navigation (arrow keys to move focus); preserves scroll position when detail panel is open
33
- - [ ] **T-020** Build `DetailPanel` component — slide-over panel from the right showing full item details, metadata, and action buttons (edit, delete, status change); arrow keys for next/prev item; Escape to close (US-0003)
34
- - [ ] **T-021** Build `EmptyState` component — friendly illustration/message when filters return zero results; one-click "Reset filters" button; active filter count badge on filter bar (US-0004)
35
- - [ ] **T-022** Configure Vite dev proxy (`vite.config.ts`) to forward `/api` requests from `:5173` to Express on `:3000`
@@ -1,8 +0,0 @@
1
- {
2
- "sprint": "S0001",
3
- "steps": [],
4
- "summary": {
5
- "passed": 0,
6
- "failed": 0
7
- }
8
- }
@@ -1,8 +0,0 @@
1
- # UAT
2
-
3
- ## Steps
4
- - ...
5
-
6
- ## Results
7
- - ...
8
-
@@ -1,3 +0,0 @@
1
- # Quick Task Summary
2
-
3
- - ...