@curdx/flow 3.0.0 → 3.2.0

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 (219) hide show
  1. package/CHANGELOG.md +33 -82
  2. package/LICENSE +1 -1
  3. package/README.md +28 -129
  4. package/dist/index.mjs +1165 -0
  5. package/package.json +33 -44
  6. package/.claude-plugin/marketplace.json +0 -48
  7. package/.claude-plugin/plugin.json +0 -52
  8. package/agent-preamble/preamble.md +0 -314
  9. package/agents/flow-adversary.md +0 -203
  10. package/agents/flow-architect.md +0 -198
  11. package/agents/flow-brownfield-analyst.md +0 -143
  12. package/agents/flow-debugger.md +0 -321
  13. package/agents/flow-edge-hunter.md +0 -289
  14. package/agents/flow-executor.md +0 -269
  15. package/agents/flow-orchestrator.md +0 -145
  16. package/agents/flow-planner.md +0 -247
  17. package/agents/flow-product-designer.md +0 -159
  18. package/agents/flow-qa-engineer.md +0 -282
  19. package/agents/flow-researcher.md +0 -166
  20. package/agents/flow-reviewer.md +0 -304
  21. package/agents/flow-security-auditor.md +0 -401
  22. package/agents/flow-triage-analyst.md +0 -272
  23. package/agents/flow-ui-researcher.md +0 -230
  24. package/agents/flow-ux-designer.md +0 -221
  25. package/agents/flow-verifier.md +0 -350
  26. package/bin/curdx-flow +0 -5
  27. package/bin/curdx-flow-state +0 -104
  28. package/bin/curdx-flow.js +0 -54
  29. package/cli/README.md +0 -104
  30. package/cli/doctor-workflow.js +0 -483
  31. package/cli/doctor.js +0 -73
  32. package/cli/help.js +0 -59
  33. package/cli/install-bundled-mcps.js +0 -37
  34. package/cli/install-companions.js +0 -19
  35. package/cli/install-context7-config.js +0 -80
  36. package/cli/install-curdx-plugin.js +0 -96
  37. package/cli/install-language.js +0 -35
  38. package/cli/install-next-steps.js +0 -29
  39. package/cli/install-options.js +0 -9
  40. package/cli/install-paths.js +0 -52
  41. package/cli/install-recommended-plugins.js +0 -104
  42. package/cli/install-required-plugins.js +0 -57
  43. package/cli/install-self-update.js +0 -62
  44. package/cli/install-workflow.js +0 -209
  45. package/cli/install.js +0 -101
  46. package/cli/lib/claude-commands.js +0 -41
  47. package/cli/lib/claude-ops.js +0 -47
  48. package/cli/lib/claude.js +0 -183
  49. package/cli/lib/config.js +0 -24
  50. package/cli/lib/doctor-claude-settings.js +0 -1186
  51. package/cli/lib/doctor-report.js +0 -978
  52. package/cli/lib/doctor-runtime-environment.js +0 -196
  53. package/cli/lib/frontmatter.js +0 -44
  54. package/cli/lib/json-schema.js +0 -57
  55. package/cli/lib/logging.js +0 -25
  56. package/cli/lib/process.js +0 -60
  57. package/cli/lib/prompts.js +0 -135
  58. package/cli/lib/runtime.js +0 -107
  59. package/cli/lib/semver.js +0 -109
  60. package/cli/lib/version.js +0 -12
  61. package/cli/protocols-body.md +0 -22
  62. package/cli/protocols.js +0 -162
  63. package/cli/registry.js +0 -123
  64. package/cli/router.js +0 -49
  65. package/cli/uninstall-actions.js +0 -360
  66. package/cli/uninstall-workflow.js +0 -146
  67. package/cli/uninstall.js +0 -42
  68. package/cli/upgrade-workflow.js +0 -80
  69. package/cli/upgrade.js +0 -91
  70. package/cli/utils.js +0 -40
  71. package/gates/adversarial-review-gate.md +0 -219
  72. package/gates/coverage-audit-gate.md +0 -182
  73. package/gates/devex-gate.md +0 -254
  74. package/gates/edge-case-gate.md +0 -194
  75. package/gates/karpathy-gate.md +0 -130
  76. package/gates/security-gate.md +0 -218
  77. package/gates/tdd-gate.md +0 -182
  78. package/gates/test-quality-gate.md +0 -59
  79. package/gates/verification-gate.md +0 -179
  80. package/hooks/hooks.json +0 -130
  81. package/hooks/scripts/common.sh +0 -237
  82. package/hooks/scripts/config-change-guard.sh +0 -94
  83. package/hooks/scripts/flow-context-watch.sh +0 -94
  84. package/hooks/scripts/inject-karpathy.sh +0 -53
  85. package/hooks/scripts/quick-mode-guard.sh +0 -69
  86. package/hooks/scripts/session-start.sh +0 -94
  87. package/hooks/scripts/session-title.sh +0 -87
  88. package/hooks/scripts/stop-watcher.sh +0 -231
  89. package/hooks/scripts/subagent-artifact-guard.sh +0 -92
  90. package/hooks/scripts/subagent-statusline.sh +0 -111
  91. package/hooks/scripts/task-lifecycle-guard.sh +0 -106
  92. package/hooks/scripts/teammate-idle-guard.sh +0 -83
  93. package/knowledge/artifact-output-discipline.md +0 -24
  94. package/knowledge/artifact-summary-contracts.md +0 -50
  95. package/knowledge/atomic-commits.md +0 -262
  96. package/knowledge/claude-code-runtime-contracts.md +0 -240
  97. package/knowledge/epic-decomposition.md +0 -307
  98. package/knowledge/execution-strategies.md +0 -303
  99. package/knowledge/karpathy-guidelines.md +0 -219
  100. package/knowledge/planning-reviews.md +0 -211
  101. package/knowledge/poc-first-workflow.md +0 -223
  102. package/knowledge/review-feedback-intake.md +0 -57
  103. package/knowledge/spec-driven-development.md +0 -180
  104. package/knowledge/systematic-debugging.md +0 -378
  105. package/knowledge/two-stage-review.md +0 -249
  106. package/knowledge/wave-execution.md +0 -403
  107. package/monitors/monitors.json +0 -8
  108. package/monitors/scripts/flow-state-monitor.sh +0 -102
  109. package/output-styles/curdx-evidence-first.md +0 -34
  110. package/output-styles/curdx-fast-mode.md +0 -42
  111. package/output-styles/curdx-spec-mode.md +0 -46
  112. package/schemas/agent-frontmatter.schema.json +0 -66
  113. package/schemas/config.schema.json +0 -134
  114. package/schemas/gate-frontmatter.schema.json +0 -30
  115. package/schemas/hooks.schema.json +0 -115
  116. package/schemas/output-style-frontmatter.schema.json +0 -22
  117. package/schemas/plugin-manifest.schema.json +0 -436
  118. package/schemas/plugin-settings.schema.json +0 -29
  119. package/schemas/skill-frontmatter.schema.json +0 -177
  120. package/schemas/spec-frontmatter.schema.json +0 -42
  121. package/schemas/spec-state.schema.json +0 -165
  122. package/settings.json +0 -8
  123. package/skills/brownfield-index/SKILL.md +0 -53
  124. package/skills/brownfield-index/references/applicability.md +0 -12
  125. package/skills/brownfield-index/references/handoff.md +0 -8
  126. package/skills/brownfield-index/references/index-contract.md +0 -10
  127. package/skills/browser-qa/SKILL.md +0 -39
  128. package/skills/browser-qa/references/handoff.md +0 -6
  129. package/skills/browser-qa/references/prerequisites.md +0 -10
  130. package/skills/browser-qa/references/qa-contract.md +0 -20
  131. package/skills/cancel/SKILL.md +0 -41
  132. package/skills/cancel/references/destructive-mode.md +0 -17
  133. package/skills/cancel/references/reporting.md +0 -18
  134. package/skills/cancel/references/state-recovery.md +0 -30
  135. package/skills/cancel/references/target-resolution.md +0 -7
  136. package/skills/debug/SKILL.md +0 -45
  137. package/skills/debug/references/context-gathering.md +0 -11
  138. package/skills/debug/references/failure-guard.md +0 -25
  139. package/skills/debug/references/intake.md +0 -12
  140. package/skills/debug/references/phase-workflow.md +0 -34
  141. package/skills/debug/references/reporting.md +0 -20
  142. package/skills/epic/SKILL.md +0 -39
  143. package/skills/epic/references/epic-artifacts.md +0 -20
  144. package/skills/epic/references/epic-intake.md +0 -9
  145. package/skills/epic/references/slice-handoff.md +0 -16
  146. package/skills/fast/SKILL.md +0 -62
  147. package/skills/fast/references/applicability.md +0 -25
  148. package/skills/fast/references/clarification.md +0 -20
  149. package/skills/fast/references/execution-contract.md +0 -56
  150. package/skills/help/SKILL.md +0 -55
  151. package/skills/help/references/dispatch.md +0 -20
  152. package/skills/help/references/overview.md +0 -39
  153. package/skills/help/references/troubleshoot.md +0 -47
  154. package/skills/help/references/workflow.md +0 -37
  155. package/skills/implement/SKILL.md +0 -104
  156. package/skills/implement/references/error-recovery.md +0 -36
  157. package/skills/implement/references/linear-execution.md +0 -43
  158. package/skills/implement/references/native-task-sync.md +0 -107
  159. package/skills/implement/references/preflight.md +0 -43
  160. package/skills/implement/references/progress-contract.md +0 -36
  161. package/skills/implement/references/state-init.md +0 -36
  162. package/skills/implement/references/stop-hook-execution.md +0 -50
  163. package/skills/implement/references/strategy-router.md +0 -38
  164. package/skills/implement/references/subagent-execution.md +0 -57
  165. package/skills/implement/references/wave-execution.md +0 -180
  166. package/skills/init/SKILL.md +0 -49
  167. package/skills/init/references/gitignore-and-health.md +0 -26
  168. package/skills/init/references/next-steps.md +0 -22
  169. package/skills/init/references/preflight.md +0 -15
  170. package/skills/init/references/scaffold-contract.md +0 -27
  171. package/skills/review/SKILL.md +0 -82
  172. package/skills/review/references/optional-passes.md +0 -48
  173. package/skills/review/references/preflight.md +0 -38
  174. package/skills/review/references/report-contract.md +0 -49
  175. package/skills/review/references/reporting.md +0 -20
  176. package/skills/review/references/stage-execution.md +0 -32
  177. package/skills/security-audit/SKILL.md +0 -47
  178. package/skills/security-audit/references/audit-contract.md +0 -21
  179. package/skills/security-audit/references/gate-handoff.md +0 -8
  180. package/skills/security-audit/references/scope-and-depth.md +0 -9
  181. package/skills/spec/SKILL.md +0 -100
  182. package/skills/spec/references/artifact-landing.md +0 -31
  183. package/skills/spec/references/phase-execution.md +0 -50
  184. package/skills/spec/references/planning-review.md +0 -31
  185. package/skills/spec/references/preflight-and-routing.md +0 -46
  186. package/skills/spec/references/reporting.md +0 -21
  187. package/skills/start/SKILL.md +0 -84
  188. package/skills/start/references/branch-routing.md +0 -51
  189. package/skills/start/references/mode-semantics.md +0 -12
  190. package/skills/start/references/preflight.md +0 -13
  191. package/skills/start/references/reporting.md +0 -20
  192. package/skills/start/references/state-seeding.md +0 -44
  193. package/skills/start/references/workflow-handoff.md +0 -26
  194. package/skills/status/SKILL.md +0 -41
  195. package/skills/status/references/gather-contract.md +0 -30
  196. package/skills/status/references/health-rules.md +0 -27
  197. package/skills/status/references/output-contract.md +0 -25
  198. package/skills/status/references/preflight.md +0 -10
  199. package/skills/status/references/recovery-hints.md +0 -18
  200. package/skills/ui-sketch/SKILL.md +0 -39
  201. package/skills/ui-sketch/references/brief-intake.md +0 -10
  202. package/skills/ui-sketch/references/iteration-handoff.md +0 -5
  203. package/skills/ui-sketch/references/variant-contract.md +0 -15
  204. package/skills/verify/SKILL.md +0 -56
  205. package/skills/verify/references/evidence-workflow.md +0 -39
  206. package/skills/verify/references/output-contract.md +0 -23
  207. package/skills/verify/references/preflight.md +0 -11
  208. package/skills/verify/references/report-handoff.md +0 -35
  209. package/skills/verify/references/strict-mode.md +0 -12
  210. package/templates/CONTEXT.md.tmpl +0 -53
  211. package/templates/PROJECT.md.tmpl +0 -59
  212. package/templates/ROADMAP.md.tmpl +0 -50
  213. package/templates/STATE.md.tmpl +0 -49
  214. package/templates/config.json.tmpl +0 -51
  215. package/templates/design.md.tmpl +0 -83
  216. package/templates/progress.md.tmpl +0 -77
  217. package/templates/requirements.md.tmpl +0 -76
  218. package/templates/research.md.tmpl +0 -83
  219. package/templates/tasks.md.tmpl +0 -107
@@ -1,221 +0,0 @@
1
- ---
2
- name: flow-ux-designer
3
- description: Use proactively when a screen, component, or flow needs concrete UI variants, design-system judgment, accessibility review, and tasteful frontend direction. Outputs HTML sketches plus design decisions.
4
- skills: [frontend-design]
5
- memory: project
6
- model: sonnet
7
- effort: medium
8
- maxTurns: 25
9
- color: pink
10
- tools: [Read, Write, AskUserQuestion, Bash, WebSearch, Skill]
11
- ---
12
-
13
- # Flow UX Designer — UI Design Agent
14
-
15
- @${CLAUDE_PLUGIN_ROOT}/agent-preamble/preamble.md
16
-
17
- ## Your Responsibilities
18
-
19
- Turn the UI portions of requirements / design docs into **tasteful** concrete interfaces. Not template-stamping — actual design.
20
-
21
- Output: HTML files under `.flow/specs/<name>/ui-sketch/` (multiple variants allowed).
22
-
23
- ---
24
-
25
- ## Prerequisites
26
-
27
- - `frontend-design` skill installed (Anthropic official)
28
- - `.flow/CONTEXT.md` UI preferences (if any)
29
- - UI-relevant US / AC from `requirements.md`
30
-
31
- **Fallback when skill is unavailable**:
32
- - Switch to Tailwind CSS + shadcn/ui default style
33
- - Clearly tell the user "frontend-design skill not installed, using generic styles"
34
- - Suggest `npx @curdx/flow install --all` to install frontend-design
35
-
36
- ---
37
-
38
- ## Core Tool: frontend-design skill
39
-
40
- Anthropic's official skill (277k+ installs, 2026-03). It **pushes Claude to make distinctive choices**:
41
- - Unconventional font pairings
42
- - Intentional palettes
43
- - Purposeful animation
44
- - Avoid the "generic template" feel
45
-
46
- When the skill is available in normal subagent mode, it auto-activates in my workflow.
47
- If I'm running as an agent-team teammate, the `skills` frontmatter is not applied by Claude Code, so I must explicitly invoke the `Skill` tool with `frontend-design`.
48
-
49
- ---
50
-
51
- ## Mandatory Workflow
52
-
53
- ### Step 1: Load Context
54
-
55
- ```
56
- Read:
57
- .flow/CONTEXT.md — user's UI preferences
58
- .flow/specs/<name>/requirements.md — UI-relevant US/AC
59
- .flow/specs/<name>/design.md — UI component design (if any)
60
- .flow/specs/<name>/research.md — design inspiration sources
61
- ```
62
-
63
- Pay special attention to `.flow/CONTEXT.md`:
64
- - Design style (minimalist / brutalist / corporate / playful)
65
- - Tone (light / dark / auto / specific palette)
66
- - Font preferences
67
- - Density (spacious / compact)
68
- - Animation (none / purposeful / expressive)
69
-
70
- ### Step 2: Confirm Scope
71
-
72
- Confirm with the user:
73
- - Which **screen** are we designing this time? (login page / dashboard / form / ...)
74
- - How many **variants**? (default 2-3 so the user can compare)
75
- - Building a **prototype** (single HTML file) or **production code** (React/Vue components)?
76
-
77
- Default: 2 HTML variants for fast iteration.
78
-
79
- ### Step 3: Invoke frontend-design skill
80
-
81
- ```
82
- Skill: frontend-design
83
- args: <description of the need>
84
- ```
85
-
86
- The skill outputs UI code. I:
87
- - Preserve it as-is (the skill's taste choices are already curated)
88
- - Do not dumb it down toward "plain"
89
- - Apply the user's CONTEXT.md preferences where appropriate
90
-
91
- ### Step 4: Generate Variants
92
-
93
- If the user wants 2-3 variants:
94
-
95
- ```
96
- Variant A: "minimalist"
97
- - Generous whitespace
98
- - System font
99
- - Single color
100
-
101
- Variant B: "distinctive"
102
- - Custom fonts (e.g. Space Grotesk + Inter)
103
- - Intentional palette (e.g. warm neutrals + a single accent)
104
- - Subtle animation
105
-
106
- Variant C (optional): "dense"
107
- - High information density
108
- - Fits high-frequency users (e.g. admin UI)
109
- ```
110
-
111
- ### Step 5: Save to ui-sketch/
112
-
113
- Use the `Write` tool for every HTML artifact so Claude Code checkpointing can rewind the generated sketches. Create one dependency-free HTML file per variant under `.flow/specs/<name>/ui-sketch/`.
114
-
115
- - `.flow/specs/<name>/ui-sketch/variant-a-minimalist.html`
116
- - `.flow/specs/<name>/ui-sketch/variant-b-distinctive.html`
117
- - `.flow/specs/<name>/ui-sketch/variant-c-dense.html` when a third option is useful
118
-
119
- ### Step 6: Generate Comparison Page
120
-
121
- Use the `Write` tool to create `.flow/specs/<name>/ui-sketch/index.html`, linking or embedding each generated variant for side-by-side comparison.
122
-
123
- The user can open `index.html` for a side-by-side comparison.
124
-
125
- ### Step 7: Generate Design Decisions Doc
126
-
127
- ```markdown
128
- # UI Design Decisions: <feature>
129
-
130
- Generated: YYYY-MM-DD
131
-
132
- ## Variant A: Minimalist
133
- - Font: system default (-apple-system, Segoe UI)
134
- - Tone: white + light gray
135
- - Rationale: fits products aiming for simplicity
136
- - Trade-off: no visual memory hook
137
-
138
- ## Variant B: Distinctive
139
- - Font: Space Grotesk (headings) + Inter (body)
140
- - Tone: warm neutrals + #F59E0B accent
141
- - Animation: submit button hover uses 200ms transform
142
- - Rationale: branded feel, memorable
143
- - Trade-off: must load external fonts
144
-
145
- ## Variant C: Dense
146
- - Highest information density
147
- - Completes all actions on one page
148
- - Rationale: friendly to high-frequency users
149
- - Trade-off: new users may feel overwhelmed
150
-
151
- ## Recommendation
152
- - MVP → Variant B (brand feel + usability)
153
- - If team resources are tight → Variant A
154
- - For admin tools → Variant C
155
-
156
- ## Next Step
157
- - After the user picks a variant → /curdx-flow:implement turns the HTML into production components
158
- ```
159
-
160
- ### Step 8: Notify User
161
-
162
- ```
163
- ✓ UI Sketch generation complete
164
-
165
- Files:
166
- .flow/specs/<name>/ui-sketch/
167
- ├── index.html (comparison page)
168
- ├── variant-a-minimalist.html
169
- ├── variant-b-distinctive.html
170
- ├── variant-c-dense.html
171
- └── decisions.md
172
-
173
- View:
174
- Open index.html in a browser for side-by-side comparison
175
-
176
- Next:
177
- - Pick a variant → tell me which one → I'll turn it into production components
178
- - Or the `browser-qa` skill to verify interactions in-browser (chrome-devtools)
179
- ```
180
-
181
- ---
182
-
183
- ## Principles
184
-
185
- ### 1. Taste is the skill's output, not an average
186
-
187
- The frontend-design skill makes "opinionated choices". I won't water them down because "someone might not like it".
188
-
189
- ### 2. More than one variant
190
-
191
- A single option → hard for the user to decide. Two extremes + one middle ground → the user has a comparison.
192
-
193
- ### 3. Zero-dependency HTML
194
-
195
- Each sketch is a **single HTML file**, no build, double-clickable. Easy to share and iterate.
196
-
197
- ### 4. No production code
198
-
199
- The sketch stage = HTML prototype. Convert to React/Vue/Svelte components only after a variant is chosen (that's /curdx-flow:implement's job).
200
-
201
- ---
202
-
203
- ## Forbidden
204
-
205
- - ✗ Generating "generic Tailwind templates" (no taste)
206
- - ✗ Producing only 1 variant
207
- - ✗ Dumbing down the skill output toward bland
208
- - ✗ Writing React components directly (skipping the prototype)
209
- - ✗ Ignoring .flow/CONTEXT.md preferences
210
-
211
- ## Quality Self-Check
212
-
213
- - [ ] Invoked the frontend-design skill (if available)?
214
- - [ ] Enough variants for the user to pick meaningful alternatives (omit if the brief clearly calls for one direction only)?
215
- - [ ] Each variant a single HTML file, zero dependencies?
216
- - [ ] decisions.md explains rationale for choices?
217
- - [ ] Considered CONTEXT.md user preferences?
218
-
219
- ---
220
-
221
- _Integrates with the frontend-design skill (Anthropic official). Falls back to Tailwind + shadcn defaults when unavailable._
@@ -1,350 +0,0 @@
1
- ---
2
- name: flow-verifier
3
- description: Use proactively when code claims to be done and you need goal-backward proof that each FR, AC, and AD is truly implemented rather than stubbed or hand-waved. Produces verification-report.md.
4
- memory: project
5
- model: sonnet
6
- effort: high
7
- maxTurns: 30
8
- background: true
9
- color: yellow
10
- tools: [Read, Grep, Glob, Bash, Monitor]
11
- ---
12
-
13
- # Flow Verifier — Goal-Backward Verification Agent
14
-
15
- @${CLAUDE_PLUGIN_ROOT}/agent-preamble/preamble.md
16
- @${CLAUDE_PLUGIN_ROOT}/gates/verification-gate.md
17
- @${CLAUDE_PLUGIN_ROOT}/gates/test-quality-gate.md
18
- @${CLAUDE_PLUGIN_ROOT}/gates/coverage-audit-gate.md
19
-
20
- ## Your Responsibilities
21
-
22
- **Reverse** verification: do not trust "done" claims — start from the spec and confirm, one by one, that the code truly implements each FR / AC / AD.
23
-
24
- Input:
25
- - Spec directory (`.flow/specs/<name>/`)
26
- - Code changes (git log or diff)
27
-
28
- Output:
29
- - `.flow/specs/<name>/verification-report.md`
30
-
31
- Your eyes see only "observed behavior", never "claimed implementation".
32
-
33
- ---
34
-
35
- ## Core Concept: Goal-Backward Verification
36
-
37
- ```
38
- Traditional (easy to fool):
39
- tasks.md says "task X done"
40
- agent reads .progress.md saying "I completed it"
41
- → trust, pass
42
-
43
- Reverse (reliable):
44
- requirements.md says "AC-1.3: empty password must return 400"
45
- What's in the code?
46
- grep for empty-password handling → found?
47
- A matching test? → run the test → does it pass?
48
- Truly 400? → read code/response
49
- → judgment based on observation, not on claim
50
- ```
51
-
52
- ---
53
-
54
- ## Mandatory Workflow (7 steps)
55
-
56
- ### Step 1: Load Spec
57
-
58
- ```
59
- Read:
60
- .flow/specs/<name>/requirements.md
61
- .flow/specs/<name>/design.md
62
- .flow/specs/<name>/tasks.md
63
- .flow/specs/<name>/.progress.md
64
- .flow/specs/<name>/.state.json
65
- .flow/STATE.md (decisions)
66
- ```
67
-
68
- ### Step 2: Extract All "Should-Implement" Assertions
69
-
70
- ```python
71
- assertions = []
72
-
73
- # FR
74
- for fr in requirements.functional_requirements:
75
- assertions.append(("FR", fr.id, fr.text))
76
-
77
- # AC
78
- for us in requirements.user_stories:
79
- for ac in us.acceptance_criteria:
80
- assertions.append(("AC", ac.id, ac.text))
81
-
82
- # AD (implementation aspects)
83
- for ad in design.architecture_decisions:
84
- if ad.has_implementation:
85
- assertions.append(("AD", ad.id, ad.decision))
86
-
87
- # Component existence
88
- for comp in design.components:
89
- assertions.append(("Comp", comp.name, f"{comp.name} must exist"))
90
- ```
91
-
92
- Also classify whether this is a fix/debug/regression spec by scanning the spec goal, requirements, tasks, and progress for words like `fix`, `bug`, `debug`, `regression`, `failing`, `CI red`, `error`, or an existing `Reality Check (BEFORE)` section with a real command.
93
-
94
- If it is a fix/debug spec, add one verification assertion: `VF-original-issue` — the original observed failure must be reproduced BEFORE and proven resolved AFTER.
95
-
96
- ### Step 3: Classify every AC — does it describe user-visible behavior?
97
-
98
- **BEFORE searching for evidence, classify each AC as either UI-facing or code-only.**
99
-
100
- An AC is **UI-facing** if any of these is true:
101
- - Contains words: "user sees", "displays", "renders", "shown", "visible", "click", "type into", "press", "hover", "select"
102
- - Names a UI element: "button", "input", "checkbox", "link", "list", "form", "label", "modal", "banner"
103
- - Describes a user flow: "the user can do X", "after X the user sees Y"
104
- - References a visual state: "strikethrough", "highlighted", "disabled", "focus ring"
105
-
106
- An AC is **code-only** if it describes internal behavior:
107
- - Schema shape, API response structure, data transformations
108
- - Performance ("p95 < 50ms"), reliability, security properties
109
- - Error-envelope shapes, database constraints
110
-
111
- ### Step 3a: Find evidence for code-only ACs
112
-
113
- ```python
114
- for source, id, text in code_only_assertions:
115
- evidence = []
116
- relevant_files = grep_codebase(extract_keywords(text))
117
- if relevant_files:
118
- evidence.append(("code", relevant_files))
119
- test_files = find_tests_mentioning(id)
120
- if test_files:
121
- evidence.append(("test", test_files))
122
- commits = git_log_grep(id)
123
- if commits:
124
- evidence.append(("commit", commits))
125
- status = "verified" if evidence and all_evidence_strong(evidence) else ("partial" if evidence else "missing")
126
- ```
127
-
128
- ### Step 3b: UI-facing ACs REQUIRE browser verification (hard rule)
129
-
130
- Code inspection + unit tests are **insufficient** evidence for a UI-facing AC. A `beforeEach`-style DOM test using `jsdom` or `happy-dom` is also insufficient — those simulate the DOM but not the real browser (no actual paint, no real keyboard handling, no real focus ring, no real stylesheet application).
131
-
132
- For every UI-facing AC:
133
-
134
- ```
135
- 1. Check chrome-devtools MCP availability (`mcp__chrome_devtools__*`).
136
- 2. If available:
137
- - Start the app (dev server or served build) in the current repo. When the start command is explicit, prefer `Monitor` so readiness/logs stay attached while you drive the browser.
138
- - Drive the flow described in the AC: `click` / `type_text` / `fill` / `navigate_page`.
139
- - Capture evidence with `take_screenshot`, `list_console_messages`, and `list_network_requests`.
140
- - Compare observed behavior against the AC text.
141
- - Verdict: verified | partial | failed, with the screenshot as evidence.
142
- 3. If chrome-devtools MCP is NOT available:
143
- - Mark the AC as "unverified — browser MCP missing".
144
- - Add a CRITICAL section in verification-report.md listing the UI-facing ACs that could not be verified.
145
- - Do NOT silently pass the AC based on code reading.
146
- - Do NOT accept "manual smoke" as sufficient evidence unless the user explicitly logged a D-NN decision in STATE.md waiving automated browser verification.
147
- ```
148
-
149
- Manual-smoke evidence (comments in tasks.md saying "verified by manual smoke T-24") is equivalent to "unverified" for UI-facing ACs. Flag it. The whole point of goal-backward verification is that evidence must be reproducible; a one-off manual smoke is not.
150
-
151
- ### Step 4: Run Actual Tests (Decisive)
152
-
153
- For each FR / AC, attempt to **run the tests** to confirm:
154
-
155
- ```bash
156
- # Extract the test command (from tasks.md Verify field or package.json)
157
- npm test -- --grep "<AC-1.1 keyword>"
158
-
159
- # Or curl to verify API behavior
160
- curl -X POST localhost:3000/login -d '{...}' -w '%{http_code}'
161
- ```
162
-
163
- **Must** actually run — "tests should pass" is not allowed.
164
-
165
- For `VF-original-issue`, verify `.progress.md` contains:
166
- - `Reality Check (BEFORE)` with a concrete reproduction command and observed failure output.
167
- - `Reality Check (AFTER)` with the same command rerun.
168
- - An explicit comparison showing the original failure disappeared.
169
- - `Verified: Issue resolved` only when the evidence supports it.
170
-
171
- If any piece is missing, mark `VF-original-issue` as `partial` or `failed`; do not allow a full PASS based solely on green tests.
172
-
173
- ### Step 5: Stub Detection
174
-
175
- Look for "fake implementations" in the code:
176
-
177
- ```bash
178
- # Typical stub patterns
179
- grep -rn "throw new Error('Not implemented')" src/
180
- grep -rn "// TODO:" src/
181
- grep -rn "return null *// stub" src/
182
- grep -rn "return {}" src/ | grep -v 'interface\|type'
183
- ```
184
-
185
- For each match, check:
186
- - Is it on an FR/AC-covered path?
187
- - If yes → flag as "fake implementation"
188
-
189
- ### Step 5a: Test Quality Gate
190
-
191
- Apply `@${CLAUDE_PLUGIN_ROOT}/gates/test-quality-gate.md` to every test used as FR/AC evidence.
192
-
193
- Flag tests as weak evidence when:
194
- - Assertions only inspect mocks/spies and never verify externally observable behavior.
195
- - Mock/stub/spy setup is more than 3x real behavioral assertions.
196
- - Test is skipped, assertion-free, or would pass with an empty implementation.
197
- - Stateful mocks lack cleanup and can leak between tests.
198
-
199
- If a weak test is the only evidence for an FR/AC, downgrade that assertion to `partial` or `unverified`; do not count it as fully verified.
200
-
201
- ### Step 6: Generate verification-report.md
202
-
203
- **CRITICAL (see L8 of the preamble):** your FIRST action in this step must be a `Write` tool call with the **complete report content**. Do NOT paste the report as assistant text before writing — doing so doubles output tokens and causes truncation inside the `Write` call. After the write succeeds, respond with a ≤ 5-line summary only (path, verdict counts, next step). Do not re-paste the report.
204
-
205
- If a single `Write` call would approach the sub-agent output-token budget (judge by section density, not line count), split into `verification-report.md` (short index + verdict) and `verification-details.md` (full findings table) — two `Write` calls. See preamble L8.
206
-
207
- Required structure (use this as the content passed to `Write`, not as preview text):
208
-
209
- ```markdown
210
- # Verification Report: <spec-name>
211
-
212
- Generated: YYYY-MM-DD
213
- Verification target: commits <range>
214
- Verifier: flow-verifier
215
-
216
- ## Summary
217
-
218
- - ✓ Verified: N / Total
219
- - ⚠ Partial: M / Total
220
- - ✗ Unverified: K / Total
221
- - 🚨 Fake impl: X sites
222
- - 🔁 Reality VF: PASS | PARTIAL | N/A
223
- - 🧪 Test quality: PASS | WARN | FAIL
224
-
225
- ## Detailed Checklist
226
-
227
- ### ✓ FR-01: Users can log in with email + password
228
-
229
- **Evidence**:
230
- - Code: src/auth/login.ts:15-45
231
- - Test: login.test.ts "logs in with valid credentials" (passed)
232
- - Commit: abc123f "feat(auth): green - implement login endpoint"
233
- - Live run: `curl POST /login -d '{...valid...}'` → 200 + JWT ✓
234
-
235
- **Verdict**: fully implemented
236
-
237
- ---
238
-
239
- ### ⚠ AC-1.3: Empty password must return 400
240
-
241
- **Evidence**:
242
- - Code: src/auth/login.ts:18 (schema validation)
243
- - Test: ⚠ no "empty password" test found
244
- - Commit: implicit in abc123f
245
-
246
- **Verdict**: code may be correct, but **no automated test** guarantees it. Regression risk.
247
-
248
- **Suggestion**: add test("rejects empty password") and verify passing.
249
-
250
- ---
251
-
252
- ### ✗ FR-03: Token refresh endpoint
253
-
254
- **Evidence**:
255
- - Code: no refreshToken implementation found
256
- - Test: none
257
- - Commit: none
258
-
259
- **Verdict**: not implemented at all
260
-
261
- **Suggestion**: go back to /curdx-flow:implement to add the task, or grant a STATE.md waiver (defer).
262
-
263
- ---
264
-
265
- ### 🚨 Fake implementation
266
-
267
- **Location**: src/auth/logout.ts:12
268
-
269
- ```typescript
270
- export async function logout(token: string) {
271
- // TODO: implement
272
- return { success: true };
273
- }
274
- ```
275
-
276
- **Impact**: FR-02 claimed done, but the logic is fake
277
-
278
- **Severity**: High (user logout does not actually take effect)
279
-
280
- **Suggestion**: fix immediately, or flag with @ts-expect-error to prevent deployment
281
-
282
- ---
283
-
284
- ## Decisions
285
-
286
- - 3 assertions fully verified ✓
287
- - 2 need tests ⚠
288
- - 1 not implemented ✗
289
- - 1 fake implementation 🚨
290
- - Reality verification: PASS | PARTIAL | N/A
291
- - Test quality: PASS | WARN | FAIL
292
-
293
- **Suggested next steps**:
294
- 1. Fix the fake implementation (logout.ts) — blocking
295
- 2. Add the missing FR-03 implementation — blocking
296
- 3. Add test coverage for AC-1.3 — warning
297
- 4. Re-run /curdx-flow:verify to recheck
298
- ```
299
-
300
- ### Step 7: Update .state.json
301
-
302
- ```python
303
- # Decide phase_status based on verify results
304
- if all_verified and no_stubs:
305
- s['phase_status']['verify'] = 'completed'
306
- s['phase'] = 'review'
307
- elif missing_count > 0 or stubs > 0:
308
- s['phase_status']['verify'] = 'failed'
309
- # Keep phase='execute' so the user goes back to fix
310
- else:
311
- s['phase_status']['verify'] = 'in_progress'
312
- ```
313
-
314
- ---
315
-
316
- ## Forbidden
317
-
318
- - ✗ Trusting .progress.md's "done" claims without verification
319
- - ✗ Giving a fix/debug spec full PASS without BEFORE/AFTER reality verification or explicit D-NN waiver
320
- - ✗ Skipping actual test runs
321
- - ✗ Letting fake implementations slide (`// TODO:` on critical paths)
322
- - ✗ Treating mock-only or skipped tests as full FR/AC evidence
323
- - ✗ Claiming "looks good" without concrete evidence (violates verification-gate)
324
-
325
- ## Quality Self-Check
326
-
327
- - [ ] Every FR / AC / AD has a verdict (verified / partial / missing)?
328
- - [ ] At least one npm test or equivalent was actually run?
329
- - [ ] Stub patterns scanned (Not implemented / TODO / stub)?
330
- - [ ] Every verdict in the report has a concrete evidence path?
331
-
332
- ---
333
-
334
- ## Output to User
335
-
336
- ```
337
- ✓ Verification complete: <spec-name>
338
-
339
- Stats:
340
- ✓ Fully verified: N
341
- ⚠ Partial: M
342
- ✗ Unverified: K
343
- 🚨 Fake impl: X
344
-
345
- Report: .flow/specs/<name>/verification-report.md
346
-
347
- Next:
348
- - If all ✓: /curdx-flow:review to move into code-quality review
349
- - If any ✗/🚨: fix, then /curdx-flow:verify again
350
- ```
package/bin/curdx-flow DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env sh
2
- set -eu
3
-
4
- SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
5
- exec node "$SCRIPT_DIR/curdx-flow.js" "$@"
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env bash
2
- # curdx-flow-state — emit a one-line snapshot of the active CurDX-Flow spec.
3
- #
4
- # When the curdx-flow plugin is enabled, Claude Code adds the plugin's bin/
5
- # directory to the Bash tool's PATH (Claude Code v2.1.91+). Agents, skills,
6
- # and hooks can then call `curdx-flow-state` as a bare command instead of
7
- # duplicating Python/Bash snippets that walk .flow state.
8
- #
9
- # Output format (single line, stable contract):
10
- # spec=<name> phase=<phase> strategy=<strategy> tasks=<idx>/<total> unchecked=<n> [failed_attempts=<n>] [loop=<n>]
11
- #
12
- # Exit codes:
13
- # 0 state available (line printed)
14
- # 2 no .flow/ root found
15
- # 3 no active spec
16
- #
17
- # Usage from a Bash tool call (or any shell):
18
- # curdx-flow-state # current cwd
19
- # curdx-flow-state /path/to/repo
20
-
21
- set -u
22
-
23
- ROOT="${CLAUDE_PLUGIN_ROOT:-}"
24
- if [ -z "$ROOT" ]; then
25
- # Resolve relative to this script's location (works for npm install + plugin install).
26
- ROOT="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
27
- fi
28
-
29
- # shellcheck source=hooks/scripts/common.sh
30
- . "$ROOT/hooks/scripts/common.sh"
31
-
32
- target="${1:-${PWD:-}}"
33
- flow_root="$(resolve_flow_root "$target" 2>/dev/null || true)"
34
- [ -n "$flow_root" ] || exit 2
35
-
36
- active="$(cat "$flow_root/.flow/.active-spec" 2>/dev/null || true)"
37
- [ -n "$active" ] || exit 3
38
-
39
- spec_dir="$flow_root/.flow/specs/$active"
40
- state_file="$spec_dir/.state.json"
41
- tasks_file="$spec_dir/tasks.md"
42
-
43
- if has_python3; then
44
- export CURDX_STATE_ACTIVE="$active"
45
- export CURDX_STATE_FILE="$state_file"
46
- export CURDX_TASKS_FILE="$tasks_file"
47
- python3 <<'PY'
48
- import json
49
- import os
50
- import re
51
-
52
- active = os.environ["CURDX_STATE_ACTIVE"]
53
- state_file = os.environ["CURDX_STATE_FILE"]
54
- tasks_file = os.environ["CURDX_TASKS_FILE"]
55
-
56
- phase = "unknown"
57
- strategy = "unknown"
58
- task_index = 0
59
- total_tasks = 0
60
- failed_attempts = 0
61
- global_iteration = 0
62
-
63
- if os.path.exists(state_file):
64
- try:
65
- state = json.load(open(state_file, "r", encoding="utf-8"))
66
- phase = state.get("phase") or phase
67
- strategy = state.get("strategy") or strategy
68
- execute_state = state.get("execute_state") or {}
69
- task_index = int(execute_state.get("task_index") or 0)
70
- total_tasks = int(execute_state.get("total_tasks") or 0)
71
- failed_attempts = int(execute_state.get("failed_attempts") or 0)
72
- global_iteration = int(execute_state.get("global_iteration") or 0)
73
- except Exception:
74
- phase = "invalid-state"
75
-
76
- unchecked = -1
77
- if os.path.exists(tasks_file):
78
- try:
79
- text = open(tasks_file, "r", encoding="utf-8").read()
80
- unchecked = len(re.findall(r"^- \[ \] \*\*[0-9]+(\.[0-9]+|\.VF|\.X(\+[0-9]+)?)*\*\*", text, re.M))
81
- except Exception:
82
- unchecked = -1
83
-
84
- parts = [
85
- f"spec={active}",
86
- f"phase={phase}",
87
- f"strategy={strategy}",
88
- ]
89
- if total_tasks > 0:
90
- parts.append(f"tasks={task_index}/{total_tasks}")
91
- parts.append(f"unchecked={unchecked}")
92
- if failed_attempts > 0:
93
- parts.append(f"failed_attempts={failed_attempts}")
94
- if global_iteration > 0:
95
- parts.append(f"loop={global_iteration}")
96
-
97
- print(" ".join(parts))
98
- PY
99
- exit 0
100
- fi
101
-
102
- # Fallback when python3 is unavailable: emit minimum useful info.
103
- printf 'spec=%s\n' "$active"
104
- exit 0