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.
- package/README.md +1602 -755
- package/bin/its-magic.js +121 -11
- package/bin/postinstall.js +21 -0
- package/installer.ps1 +759 -0
- package/installer.py +981 -0
- package/installer.sh +649 -0
- package/package.json +18 -14
- package/scripts/check_intake_template_parity.py +284 -0
- package/scripts/doc_profile_lib.py +415 -0
- package/scripts/guard_installer_publish.py +88 -0
- package/scripts/intake_bug_routing_guard.py +67 -0
- package/scripts/intake_evidence_lib.py +802 -0
- package/scripts/intake_evidence_validate.py +73 -0
- package/scripts/materialize_codebase_map.py +184 -0
- package/scripts/remote_config_summary.py +243 -0
- package/template/.cursor/agents/curator.mdc +35 -0
- package/template/.cursor/agents/dev.mdc +29 -0
- package/template/.cursor/agents/po.mdc +141 -0
- package/template/.cursor/agents/qa.mdc +28 -0
- package/template/.cursor/agents/release.mdc +28 -0
- package/template/.cursor/agents/security.mdc +98 -0
- package/template/.cursor/agents/tech-lead.mdc +57 -0
- package/template/.cursor/commands/architecture.md +127 -0
- package/template/.cursor/commands/ask.md +55 -0
- package/template/.cursor/commands/auto.md +533 -0
- package/template/.cursor/commands/discovery.md +47 -0
- package/template/.cursor/commands/execute.md +343 -0
- package/template/.cursor/commands/intake.md +323 -0
- package/template/.cursor/commands/map-codebase.md +46 -0
- package/template/.cursor/commands/memory-audit.md +175 -0
- package/template/.cursor/commands/milestone-complete.md +51 -0
- package/template/.cursor/commands/milestone-start.md +59 -0
- package/template/.cursor/commands/pause.md +64 -0
- package/{.cursor/commands/gsd-phase-context.md → template/.cursor/commands/phase-context.md} +6 -2
- package/template/.cursor/commands/plan-verify.md +34 -0
- package/template/.cursor/commands/qa.md +226 -0
- package/template/.cursor/commands/quick.md +41 -0
- package/template/.cursor/commands/refresh-context.md +82 -0
- package/template/.cursor/commands/release.md +505 -0
- package/template/.cursor/commands/research.md +49 -0
- package/template/.cursor/commands/resume.md +67 -0
- package/template/.cursor/commands/security-review.md +81 -0
- package/template/.cursor/commands/sprint-plan.md +103 -0
- package/template/.cursor/commands/status-reconcile.md +95 -0
- package/template/.cursor/commands/verify-work.md +152 -0
- package/template/.cursor/dev-environment.json.example +22 -0
- package/{.cursor → template/.cursor}/hooks/README.md +3 -2
- package/{.cursor/hooks/gsd-hook.py → template/.cursor/hooks/hook.py} +15 -6
- package/template/.cursor/hooks.json +26 -0
- package/template/.cursor/remote.json +31 -0
- package/template/.cursor/rules/caveman.mdc +184 -0
- package/template/.cursor/rules/coding-standards.mdc +39 -0
- package/template/.cursor/rules/core.mdc +111 -0
- package/template/.cursor/rules/handoffs.mdc +27 -0
- package/template/.cursor/rules/quality.mdc +49 -0
- package/template/.cursor/scratchpad.local.example.md +323 -0
- package/template/.cursor/scratchpad.md +324 -0
- package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/SKILL.md +2 -2
- package/template/.cursorignore +6 -0
- package/template/.env.example +28 -0
- package/template/.github/workflows/ci.yml +194 -0
- package/{.github → template/.github}/workflows/deploy.yml +5 -2
- package/template/.its-magic-version +1 -0
- package/template/README.md +1602 -0
- package/template/decisions/DEC-0001.md +11 -0
- package/template/decisions/DEC-0002.md +11 -0
- package/template/docs/developer/README.md +44 -0
- package/template/docs/engineering/architecture.md +9 -0
- package/template/docs/engineering/artifact-ordering-policy.md +48 -0
- package/template/docs/engineering/artifact-ownership-policy.md +57 -0
- package/template/docs/engineering/auto-orchestration-reference.md +1211 -0
- package/{docs → template/docs}/engineering/codebase-map.md +0 -5
- package/template/docs/engineering/compatibility-report.md +20 -0
- package/template/docs/engineering/compatibility-signals.md +7 -0
- package/template/docs/engineering/component-scope-report.md +16 -0
- package/template/docs/engineering/component-scope.md +19 -0
- package/template/docs/engineering/context/installer-owned-paths.manifest +96 -0
- package/template/docs/engineering/context/readme-section-affinity.json +30 -0
- package/template/docs/engineering/decisions.md +16 -0
- package/template/docs/engineering/legacy-drift-audit.md +21 -0
- package/template/docs/engineering/manifests/components/api-gateway.manifest.yaml +12 -0
- package/template/docs/engineering/manifests/registry.manifest.yaml +20 -0
- package/template/docs/engineering/manifests/repo.manifest.yaml +11 -0
- package/template/docs/engineering/phase-context.md +16 -0
- package/template/docs/engineering/release-targets.json +123 -0
- package/template/docs/engineering/research.md +29 -0
- package/template/docs/engineering/runbook.md +2320 -0
- package/template/docs/engineering/runtime-connectivity.md +81 -0
- package/template/docs/engineering/security-review.md +33 -0
- package/template/docs/engineering/spec-pack/README.md +20 -0
- package/template/docs/engineering/state-archive/README.md +15 -0
- package/template/docs/engineering/state.md +20 -0
- package/template/docs/engineering/status-normalization-report.md +19 -0
- package/template/docs/engineering/token-cost-parity-manifest.md +16 -0
- package/template/docs/engineering/us-0084-remote-e2e.md +44 -0
- package/template/docs/product/acceptance.md +1 -0
- package/template/docs/product/backlog.md +5 -0
- package/template/docs/product/vision.md +11 -0
- package/template/docs/user-guides/README.md +40 -0
- package/{handoffs → template/handoffs}/dev_to_qa.md +0 -3
- package/{handoffs → template/handoffs}/po_to_tl.md +0 -3
- package/{handoffs → template/handoffs}/qa_to_dev.md +1 -2
- package/template/handoffs/release_notes.md +51 -0
- package/template/handoffs/release_queue.md +47 -0
- package/template/handoffs/release_to_dev.md +31 -0
- package/template/handoffs/releases/Sxxxx-release-notes.md +62 -0
- package/template/handoffs/resume_brief.md +14 -0
- package/{handoffs → template/handoffs}/tl_to_dev.md +0 -2
- package/template/handoffs/token_cost_runs/README.md +26 -0
- package/template/its_magic/.its-magic-version +1 -0
- package/template/its_magic/README.md +9 -0
- package/template/scripts/auto_outer_driver.py +521 -0
- package/template/scripts/caveman_compress_input.py +903 -0
- package/template/scripts/check_downstream_ci_guard.py +67 -0
- package/template/scripts/check_intake_template_parity.py +284 -0
- package/template/scripts/check_token_cost_parity.py +69 -0
- package/template/scripts/dev_environment_lib.py +463 -0
- package/template/scripts/doc_profile_lib.py +415 -0
- package/template/scripts/downstream_ci_guard_lib.py +222 -0
- package/template/scripts/enforce-triad-hot-surface.py +753 -0
- package/template/scripts/guard_installer_publish.py +88 -0
- package/template/scripts/intake_bug_resume_brief_refresh.py +303 -0
- package/template/scripts/intake_bug_routing_guard.py +67 -0
- package/template/scripts/intake_evidence_lib.py +802 -0
- package/template/scripts/intake_evidence_validate.py +73 -0
- package/template/scripts/materialize_codebase_map.py +184 -0
- package/template/scripts/pack_json_validate.py +130 -0
- package/template/scripts/project_readme_coverage_lib.py +417 -0
- package/template/scripts/readme_feature_coverage_lib.py +608 -0
- package/template/scripts/remote_config_summary.py +243 -0
- package/template/scripts/sync_push_gates.py +198 -0
- package/template/scripts/token_cost_compare.py +40 -0
- package/template/scripts/token_cost_lib.py +108 -0
- package/template/scripts/uat_probe_lib.py +868 -0
- package/template/scripts/validate-and-push.ps1 +280 -0
- package/template/scripts/validate-and-push.sh +243 -0
- package/template/scripts/validate_doc_profile.py +103 -0
- package/template/scripts/validate_project_readme_coverage.py +151 -0
- package/template/scripts/validate_readme_feature_coverage.py +140 -0
- package/template/sprints/S0001/progress.md +1 -0
- package/template/sprints/S0001/qa-findings.md +9 -0
- package/template/sprints/S0001/release-findings.md +24 -0
- package/template/sprints/S0001/sprint.md +9 -0
- package/template/sprints/S0001/summary.md +7 -0
- package/template/sprints/S0001/tasks.md +1 -0
- package/template/sprints/S0001/uat.json +6 -0
- package/template/sprints/S0001/uat.md +5 -0
- package/template/sprints/quick/Q0001/summary.md +1 -0
- package/{sprints → template/sprints}/quick/Q0001/task.json +0 -1
- package/.cursor/agents/curator.mdc +0 -21
- package/.cursor/agents/dev.mdc +0 -20
- package/.cursor/agents/po.mdc +0 -19
- package/.cursor/agents/qa.mdc +0 -19
- package/.cursor/agents/release.mdc +0 -19
- package/.cursor/agents/tech-lead.mdc +0 -21
- package/.cursor/commands/gsd-architecture.md +0 -29
- package/.cursor/commands/gsd-auto.md +0 -27
- package/.cursor/commands/gsd-discovery.md +0 -27
- package/.cursor/commands/gsd-execute.md +0 -32
- package/.cursor/commands/gsd-intake.md +0 -28
- package/.cursor/commands/gsd-map-codebase.md +0 -25
- package/.cursor/commands/gsd-milestone-complete.md +0 -24
- package/.cursor/commands/gsd-milestone-start.md +0 -26
- package/.cursor/commands/gsd-pause.md +0 -25
- package/.cursor/commands/gsd-plan-verify.md +0 -26
- package/.cursor/commands/gsd-qa.md +0 -28
- package/.cursor/commands/gsd-quick.md +0 -24
- package/.cursor/commands/gsd-refresh-context.md +0 -26
- package/.cursor/commands/gsd-release.md +0 -29
- package/.cursor/commands/gsd-research.md +0 -28
- package/.cursor/commands/gsd-resume.md +0 -26
- package/.cursor/commands/gsd-sprint-plan.md +0 -30
- package/.cursor/commands/gsd-verify-work.md +0 -25
- package/.cursor/hooks.json +0 -26
- package/.cursor/plans/cursor-gsd-team-kit_8cfee9b8.plan.md +0 -57
- package/.cursor/remote.json +0 -18
- package/.cursor/rules/gsd-core.mdc +0 -18
- package/.cursor/rules/gsd-handoffs.mdc +0 -10
- package/.cursor/rules/gsd-quality.mdc +0 -15
- package/.cursor/scratchpad.md +0 -34
- package/.github/workflows/ci.yml +0 -47
- package/decisions/DEC-0001.md +0 -21
- package/decisions/DEC-0002.md +0 -21
- package/docs/engineering/architecture.md +0 -354
- package/docs/engineering/decisions.md +0 -6
- package/docs/engineering/research.md +0 -11
- package/docs/engineering/runbook.md +0 -32
- package/docs/engineering/state.md +0 -33
- package/docs/product/acceptance.md +0 -6
- package/docs/product/backlog.md +0 -7
- package/docs/product/vision.md +0 -46
- package/gsd-installer.ps1 +0 -189
- package/gsd-installer.py +0 -195
- package/gsd-installer.sh +0 -201
- package/handoffs/release_notes.md +0 -14
- package/handoffs/resume_brief.md +0 -8
- package/milestones/M0001/milestone.json +0 -7
- package/milestones/M0001/phases.json +0 -9
- package/milestones/M0001/progress.md +0 -3
- package/milestones/M0001/summary.md +0 -3
- package/scripts/generate-release-notes.ps1 +0 -74
- package/scripts/generate-release-notes.sh +0 -63
- package/scripts/release-all.ps1 +0 -423
- package/scripts/release-all.sh +0 -226
- package/sprints/S0001/progress.md +0 -4
- package/sprints/S0001/qa-findings.md +0 -113
- package/sprints/S0001/sprint.md +0 -70
- package/sprints/S0001/summary.md +0 -46
- package/sprints/S0001/tasks.md +0 -35
- package/sprints/S0001/uat.json +0 -8
- package/sprints/S0001/uat.md +0 -8
- package/sprints/quick/Q0001/summary.md +0 -3
- /package/{.cursor/rules/gsd-escalation.mdc → template/.cursor/rules/escalation.mdc} +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/milestone.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/phase-context.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/plan-verify.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/uat.json +0 -0
- /package/{docs → template/docs}/engineering/context/phase-template.json +0 -0
- /package/{docs → template/docs}/engineering/dependencies.json +0 -0
- /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.
|
package/sprints/S0001/sprint.md
DELETED
|
@@ -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
|
package/sprints/S0001/summary.md
DELETED
|
@@ -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
|
-
|
package/sprints/S0001/tasks.md
DELETED
|
@@ -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`
|
package/sprints/S0001/uat.json
DELETED
package/sprints/S0001/uat.md
DELETED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.json
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.md
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.json
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.md
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.json
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.md
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.json
RENAMED
|
File without changes
|
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/milestone.json
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/phase-context.json
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/plan-verify.json
RENAMED
|
File without changes
|
/package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|