@howlil/ez-agents 2.0.0 → 3.0.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 (145) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +157 -110
  3. package/README.zh-CN.md +84 -84
  4. package/agents/ez-plan-checker.md +2 -2
  5. package/agents/ez-research-synthesizer.md +1 -1
  6. package/agents/ez-ui-auditor.md +0 -2
  7. package/agents/ez-ui-checker.md +2 -4
  8. package/agents/ez-ui-researcher.md +0 -2
  9. package/agents/ez-verifier.md +1 -1
  10. package/bin/install.js +211 -211
  11. package/commands/ez/debug.md +1 -1
  12. package/commands/ez/map-codebase.md +1 -1
  13. package/commands/ez/reapply-patches.md +3 -3
  14. package/commands/ez/research-phase.md +1 -1
  15. package/{get-shit-done → ez-agents}/bin/ez-tools.cjs +1 -1
  16. package/{get-shit-done → ez-agents}/bin/lib/assistant-adapter.cjs +205 -205
  17. package/{get-shit-done → ez-agents}/bin/lib/audit-exec.cjs +150 -150
  18. package/{get-shit-done → ez-agents}/bin/lib/auth.cjs +175 -175
  19. package/{get-shit-done → ez-agents}/bin/lib/circuit-breaker.cjs +118 -118
  20. package/{get-shit-done → ez-agents}/bin/lib/commands.cjs +666 -666
  21. package/{get-shit-done → ez-agents}/bin/lib/config.cjs +183 -183
  22. package/{get-shit-done → ez-agents}/bin/lib/core.cjs +495 -495
  23. package/{get-shit-done → ez-agents}/bin/lib/file-lock.cjs +236 -236
  24. package/{get-shit-done → ez-agents}/bin/lib/frontmatter.cjs +299 -299
  25. package/{get-shit-done → ez-agents}/bin/lib/fs-utils.cjs +153 -153
  26. package/{get-shit-done → ez-agents}/bin/lib/git-utils.cjs +203 -203
  27. package/{get-shit-done → ez-agents}/bin/lib/health-check.cjs +163 -163
  28. package/{get-shit-done → ez-agents}/bin/lib/index.cjs +113 -113
  29. package/{get-shit-done → ez-agents}/bin/lib/init.cjs +710 -710
  30. package/{get-shit-done → ez-agents}/bin/lib/logger.cjs +117 -117
  31. package/{get-shit-done → ez-agents}/bin/lib/milestone.cjs +241 -241
  32. package/{get-shit-done → ez-agents}/bin/lib/model-provider.cjs +146 -146
  33. package/{get-shit-done → ez-agents}/bin/lib/phase.cjs +908 -908
  34. package/{get-shit-done → ez-agents}/bin/lib/retry.cjs +119 -119
  35. package/{get-shit-done → ez-agents}/bin/lib/roadmap.cjs +305 -305
  36. package/{get-shit-done → ez-agents}/bin/lib/safe-exec.cjs +128 -128
  37. package/{get-shit-done → ez-agents}/bin/lib/safe-path.cjs +130 -130
  38. package/{get-shit-done → ez-agents}/bin/lib/state.cjs +721 -721
  39. package/{get-shit-done → ez-agents}/bin/lib/temp-file.cjs +239 -239
  40. package/{get-shit-done → ez-agents}/bin/lib/template.cjs +222 -222
  41. package/{get-shit-done → ez-agents}/bin/lib/test-file-lock.cjs +112 -112
  42. package/{get-shit-done → ez-agents}/bin/lib/test-graceful.cjs +93 -93
  43. package/{get-shit-done → ez-agents}/bin/lib/test-logger.cjs +60 -60
  44. package/{get-shit-done → ez-agents}/bin/lib/test-safe-exec.cjs +38 -38
  45. package/{get-shit-done → ez-agents}/bin/lib/test-safe-path.cjs +33 -33
  46. package/{get-shit-done → ez-agents}/bin/lib/test-temp-file.cjs +125 -125
  47. package/{get-shit-done → ez-agents}/bin/lib/timeout-exec.cjs +62 -62
  48. package/{get-shit-done → ez-agents}/bin/lib/verify.cjs +820 -820
  49. package/{get-shit-done → ez-agents}/references/checkpoints.md +776 -776
  50. package/{get-shit-done → ez-agents}/references/questioning.md +162 -162
  51. package/{get-shit-done → ez-agents}/references/tdd.md +263 -263
  52. package/{get-shit-done → ez-agents}/templates/codebase/concerns.md +310 -310
  53. package/{get-shit-done → ez-agents}/templates/codebase/conventions.md +307 -307
  54. package/{get-shit-done → ez-agents}/templates/codebase/integrations.md +280 -280
  55. package/{get-shit-done → ez-agents}/templates/codebase/stack.md +186 -186
  56. package/{get-shit-done → ez-agents}/templates/codebase/testing.md +480 -480
  57. package/{get-shit-done → ez-agents}/templates/config.json +37 -37
  58. package/{get-shit-done → ez-agents}/templates/continue-here.md +78 -78
  59. package/{get-shit-done → ez-agents}/templates/milestone-archive.md +123 -123
  60. package/{get-shit-done → ez-agents}/templates/milestone.md +115 -115
  61. package/{get-shit-done → ez-agents}/templates/requirements.md +231 -231
  62. package/{get-shit-done → ez-agents}/templates/research-project/ARCHITECTURE.md +204 -204
  63. package/{get-shit-done → ez-agents}/templates/research-project/FEATURES.md +147 -147
  64. package/{get-shit-done → ez-agents}/templates/research-project/PITFALLS.md +200 -200
  65. package/{get-shit-done → ez-agents}/templates/research-project/STACK.md +120 -120
  66. package/{get-shit-done → ez-agents}/templates/research-project/SUMMARY.md +170 -170
  67. package/{get-shit-done → ez-agents}/templates/retrospective.md +54 -54
  68. package/{get-shit-done → ez-agents}/templates/roadmap.md +202 -202
  69. package/{get-shit-done → ez-agents}/templates/summary-minimal.md +41 -41
  70. package/{get-shit-done → ez-agents}/templates/summary-standard.md +48 -48
  71. package/{get-shit-done → ez-agents}/templates/summary.md +248 -248
  72. package/{get-shit-done → ez-agents}/templates/user-setup.md +311 -311
  73. package/{get-shit-done → ez-agents}/templates/verification-report.md +322 -322
  74. package/{get-shit-done → ez-agents}/workflows/add-phase.md +112 -112
  75. package/{get-shit-done → ez-agents}/workflows/add-tests.md +351 -351
  76. package/{get-shit-done → ez-agents}/workflows/add-todo.md +158 -158
  77. package/{get-shit-done → ez-agents}/workflows/audit-milestone.md +332 -332
  78. package/{get-shit-done → ez-agents}/workflows/autonomous.md +743 -743
  79. package/{get-shit-done → ez-agents}/workflows/check-todos.md +177 -177
  80. package/{get-shit-done → ez-agents}/workflows/cleanup.md +152 -152
  81. package/{get-shit-done → ez-agents}/workflows/complete-milestone.md +766 -766
  82. package/ez-agents/workflows/debug.md +0 -0
  83. package/{get-shit-done → ez-agents}/workflows/diagnose-issues.md +219 -219
  84. package/{get-shit-done → ez-agents}/workflows/discovery-phase.md +289 -289
  85. package/{get-shit-done → ez-agents}/workflows/discuss-phase.md +762 -762
  86. package/{get-shit-done → ez-agents}/workflows/execute-phase.md +468 -468
  87. package/{get-shit-done → ez-agents}/workflows/execute-plan.md +483 -483
  88. package/{get-shit-done → ez-agents}/workflows/health.md +159 -159
  89. package/{get-shit-done → ez-agents}/workflows/help.md +492 -492
  90. package/{get-shit-done → ez-agents}/workflows/insert-phase.md +130 -130
  91. package/{get-shit-done → ez-agents}/workflows/list-phase-assumptions.md +178 -178
  92. package/{get-shit-done → ez-agents}/workflows/map-codebase.md +316 -316
  93. package/{get-shit-done → ez-agents}/workflows/new-milestone.md +384 -384
  94. package/{get-shit-done → ez-agents}/workflows/new-project.md +1111 -1111
  95. package/{get-shit-done → ez-agents}/workflows/node-repair.md +92 -92
  96. package/{get-shit-done → ez-agents}/workflows/pause-work.md +122 -122
  97. package/{get-shit-done → ez-agents}/workflows/plan-milestone-gaps.md +274 -274
  98. package/{get-shit-done → ez-agents}/workflows/plan-phase.md +651 -651
  99. package/{get-shit-done → ez-agents}/workflows/progress.md +382 -382
  100. package/{get-shit-done → ez-agents}/workflows/quick.md +610 -610
  101. package/{get-shit-done → ez-agents}/workflows/remove-phase.md +155 -155
  102. package/{get-shit-done → ez-agents}/workflows/research-phase.md +74 -74
  103. package/{get-shit-done → ez-agents}/workflows/resume-project.md +307 -307
  104. package/{get-shit-done → ez-agents}/workflows/set-profile.md +81 -81
  105. package/{get-shit-done → ez-agents}/workflows/settings.md +242 -242
  106. package/{get-shit-done → ez-agents}/workflows/stats.md +57 -57
  107. package/{get-shit-done → ez-agents}/workflows/transition.md +544 -544
  108. package/{get-shit-done → ez-agents}/workflows/ui-phase.md +290 -290
  109. package/{get-shit-done → ez-agents}/workflows/ui-review.md +157 -157
  110. package/{get-shit-done → ez-agents}/workflows/update.md +320 -320
  111. package/{get-shit-done → ez-agents}/workflows/validate-phase.md +167 -167
  112. package/{get-shit-done → ez-agents}/workflows/verify-phase.md +243 -243
  113. package/{get-shit-done → ez-agents}/workflows/verify-work.md +5 -5
  114. package/hooks/dist/ez-check-update.js +81 -0
  115. package/hooks/dist/ez-context-monitor.js +141 -0
  116. package/hooks/dist/ez-statusline.js +115 -0
  117. package/package.json +13 -3
  118. package/scripts/build-hooks.js +43 -43
  119. package/scripts/run-tests.cjs +29 -29
  120. /package/{get-shit-done → ez-agents}/references/continuation-format.md +0 -0
  121. /package/{get-shit-done → ez-agents}/references/decimal-phase-calculation.md +0 -0
  122. /package/{get-shit-done → ez-agents}/references/git-integration.md +0 -0
  123. /package/{get-shit-done → ez-agents}/references/git-planning-commit.md +0 -0
  124. /package/{get-shit-done → ez-agents}/references/model-profile-resolution.md +0 -0
  125. /package/{get-shit-done → ez-agents}/references/model-profiles.md +0 -0
  126. /package/{get-shit-done → ez-agents}/references/phase-argument-parsing.md +0 -0
  127. /package/{get-shit-done → ez-agents}/references/planning-config.md +0 -0
  128. /package/{get-shit-done → ez-agents}/references/ui-brand.md +0 -0
  129. /package/{get-shit-done → ez-agents}/references/verification-patterns.md +0 -0
  130. /package/{get-shit-done → ez-agents}/templates/DEBUG.md +0 -0
  131. /package/{get-shit-done → ez-agents}/templates/UAT.md +0 -0
  132. /package/{get-shit-done → ez-agents}/templates/UI-SPEC.md +0 -0
  133. /package/{get-shit-done → ez-agents}/templates/VALIDATION.md +0 -0
  134. /package/{get-shit-done → ez-agents}/templates/codebase/architecture.md +0 -0
  135. /package/{get-shit-done → ez-agents}/templates/codebase/structure.md +0 -0
  136. /package/{get-shit-done → ez-agents}/templates/context.md +0 -0
  137. /package/{get-shit-done → ez-agents}/templates/copilot-instructions.md +0 -0
  138. /package/{get-shit-done → ez-agents}/templates/debug-subagent-prompt.md +0 -0
  139. /package/{get-shit-done → ez-agents}/templates/discovery.md +0 -0
  140. /package/{get-shit-done → ez-agents}/templates/phase-prompt.md +0 -0
  141. /package/{get-shit-done → ez-agents}/templates/planner-subagent-prompt.md +0 -0
  142. /package/{get-shit-done → ez-agents}/templates/project.md +0 -0
  143. /package/{get-shit-done → ez-agents}/templates/research.md +0 -0
  144. /package/{get-shit-done → ez-agents}/templates/state.md +0 -0
  145. /package/{get-shit-done → ez-agents}/templates/summary-complex.md +0 -0
@@ -1,243 +1,243 @@
1
- <purpose>
2
- Verify phase goal achievement through goal-backward analysis. Check that the codebase delivers what the phase promised, not just that tasks completed.
3
-
4
- Executed by a verification subagent spawned from execute-phase.md.
5
- </purpose>
6
-
7
- <core_principle>
8
- **Task completion ≠ Goal achievement**
9
-
10
- A task "create chat component" can be marked complete when the component is a placeholder. The task was done — but the goal "working chat interface" was not achieved.
11
-
12
- Goal-backward verification:
13
- 1. What must be TRUE for the goal to be achieved?
14
- 2. What must EXIST for those truths to hold?
15
- 3. What must be WIRED for those artifacts to function?
16
-
17
- Then verify each level against the actual codebase.
18
- </core_principle>
19
-
20
- <required_reading>
21
- @~/.claude/get-shit-done/references/verification-patterns.md
22
- @~/.claude/get-shit-done/templates/verification-report.md
23
- </required_reading>
24
-
25
- <process>
26
-
27
- <step name="load_context" priority="first">
28
- Load phase operation context:
29
-
30
- ```bash
31
- INIT=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" init phase-op "${PHASE_ARG}")
32
- if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
33
- ```
34
-
35
- Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`, `has_plans`, `plan_count`.
36
-
37
- Then load phase details and list plans/summaries:
38
- ```bash
39
- node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" roadmap get-phase "${phase_number}"
40
- grep -E "^| ${phase_number}" .planning/REQUIREMENTS.md 2>/dev/null
41
- ls "$phase_dir"/*-SUMMARY.md "$phase_dir"/*-PLAN.md 2>/dev/null
42
- ```
43
-
44
- Extract **phase goal** from ROADMAP.md (the outcome to verify, not tasks) and **requirements** from REQUIREMENTS.md if it exists.
45
- </step>
46
-
47
- <step name="establish_must_haves">
48
- **Option A: Must-haves in PLAN frontmatter**
49
-
50
- Use gsd-tools to extract must_haves from each PLAN:
51
-
52
- ```bash
53
- for plan in "$PHASE_DIR"/*-PLAN.md; do
54
- MUST_HAVES=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" frontmatter get "$plan" --field must_haves)
55
- echo "=== $plan ===" && echo "$MUST_HAVES"
56
- done
57
- ```
58
-
59
- Returns JSON: `{ truths: [...], artifacts: [...], key_links: [...] }`
60
-
61
- Aggregate all must_haves across plans for phase-level verification.
62
-
63
- **Option B: Use Success Criteria from ROADMAP.md**
64
-
65
- If no must_haves in frontmatter (MUST_HAVES returns error or empty), check for Success Criteria:
66
-
67
- ```bash
68
- PHASE_DATA=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" roadmap get-phase "${phase_number}" --raw)
69
- ```
70
-
71
- Parse the `success_criteria` array from the JSON output. If non-empty:
72
- 1. Use each Success Criterion directly as a **truth** (they are already written as observable, testable behaviors)
73
- 2. Derive **artifacts** (concrete file paths for each truth)
74
- 3. Derive **key links** (critical wiring where stubs hide)
75
- 4. Document the must-haves before proceeding
76
-
77
- Success Criteria from ROADMAP.md are the contract — they override PLAN-level must_haves when both exist.
78
-
79
- **Option C: Derive from phase goal (fallback)**
80
-
81
- If no must_haves in frontmatter AND no Success Criteria in ROADMAP:
82
- 1. State the goal from ROADMAP.md
83
- 2. Derive **truths** (3-7 observable behaviors, each testable)
84
- 3. Derive **artifacts** (concrete file paths for each truth)
85
- 4. Derive **key links** (critical wiring where stubs hide)
86
- 5. Document derived must-haves before proceeding
87
- </step>
88
-
89
- <step name="verify_truths">
90
- For each observable truth, determine if the codebase enables it.
91
-
92
- **Status:** ✓ VERIFIED (all supporting artifacts pass) | ✗ FAILED (artifact missing/stub/unwired) | ? UNCERTAIN (needs human)
93
-
94
- For each truth: identify supporting artifacts → check artifact status → check wiring → determine truth status.
95
-
96
- **Example:** Truth "User can see existing messages" depends on Chat.tsx (renders), /api/chat GET (provides), Message model (schema). If Chat.tsx is a stub or API returns hardcoded [] → FAILED. If all exist, are substantive, and connected → VERIFIED.
97
- </step>
98
-
99
- <step name="verify_artifacts">
100
- Use gsd-tools for artifact verification against must_haves in each PLAN:
101
-
102
- ```bash
103
- for plan in "$PHASE_DIR"/*-PLAN.md; do
104
- ARTIFACT_RESULT=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" verify artifacts "$plan")
105
- echo "=== $plan ===" && echo "$ARTIFACT_RESULT"
106
- done
107
- ```
108
-
109
- Parse JSON result: `{ all_passed, passed, total, artifacts: [{path, exists, issues, passed}] }`
110
-
111
- **Artifact status from result:**
112
- - `exists=false` → MISSING
113
- - `issues` not empty → STUB (check issues for "Only N lines" or "Missing pattern")
114
- - `passed=true` → VERIFIED (Levels 1-2 pass)
115
-
116
- **Level 3 — Wired (manual check for artifacts that pass Levels 1-2):**
117
- ```bash
118
- grep -r "import.*$artifact_name" src/ --include="*.ts" --include="*.tsx" # IMPORTED
119
- grep -r "$artifact_name" src/ --include="*.ts" --include="*.tsx" | grep -v "import" # USED
120
- ```
121
- WIRED = imported AND used. ORPHANED = exists but not imported/used.
122
-
123
- | Exists | Substantive | Wired | Status |
124
- |--------|-------------|-------|--------|
125
- | ✓ | ✓ | ✓ | ✓ VERIFIED |
126
- | ✓ | ✓ | ✗ | ⚠️ ORPHANED |
127
- | ✓ | ✗ | - | ✗ STUB |
128
- | ✗ | - | - | ✗ MISSING |
129
- </step>
130
-
131
- <step name="verify_wiring">
132
- Use gsd-tools for key link verification against must_haves in each PLAN:
133
-
134
- ```bash
135
- for plan in "$PHASE_DIR"/*-PLAN.md; do
136
- LINKS_RESULT=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" verify key-links "$plan")
137
- echo "=== $plan ===" && echo "$LINKS_RESULT"
138
- done
139
- ```
140
-
141
- Parse JSON result: `{ all_verified, verified, total, links: [{from, to, via, verified, detail}] }`
142
-
143
- **Link status from result:**
144
- - `verified=true` → WIRED
145
- - `verified=false` with "not found" → NOT_WIRED
146
- - `verified=false` with "Pattern not found" → PARTIAL
147
-
148
- **Fallback patterns (if key_links not in must_haves):**
149
-
150
- | Pattern | Check | Status |
151
- |---------|-------|--------|
152
- | Component → API | fetch/axios call to API path, response used (await/.then/setState) | WIRED / PARTIAL (call but unused response) / NOT_WIRED |
153
- | API → Database | Prisma/DB query on model, result returned via res.json() | WIRED / PARTIAL (query but not returned) / NOT_WIRED |
154
- | Form → Handler | onSubmit with real implementation (fetch/axios/mutate/dispatch), not console.log/empty | WIRED / STUB (log-only/empty) / NOT_WIRED |
155
- | State → Render | useState variable appears in JSX (`{stateVar}` or `{stateVar.property}`) | WIRED / NOT_WIRED |
156
-
157
- Record status and evidence for each key link.
158
- </step>
159
-
160
- <step name="verify_requirements">
161
- If REQUIREMENTS.md exists:
162
- ```bash
163
- grep -E "Phase ${PHASE_NUM}" .planning/REQUIREMENTS.md 2>/dev/null
164
- ```
165
-
166
- For each requirement: parse description → identify supporting truths/artifacts → status: ✓ SATISFIED / ✗ BLOCKED / ? NEEDS HUMAN.
167
- </step>
168
-
169
- <step name="scan_antipatterns">
170
- Extract files modified in this phase from SUMMARY.md, scan each:
171
-
172
- | Pattern | Search | Severity |
173
- |---------|--------|----------|
174
- | TODO/FIXME/XXX/HACK | `grep -n -E "TODO\|FIXME\|XXX\|HACK"` | ⚠️ Warning |
175
- | Placeholder content | `grep -n -iE "placeholder\|coming soon\|will be here"` | 🛑 Blocker |
176
- | Empty returns | `grep -n -E "return null\|return \{\}\|return \[\]\|=> \{\}"` | ⚠️ Warning |
177
- | Log-only functions | Functions containing only console.log | ⚠️ Warning |
178
-
179
- Categorize: 🛑 Blocker (prevents goal) | ⚠️ Warning (incomplete) | ℹ️ Info (notable).
180
- </step>
181
-
182
- <step name="identify_human_verification">
183
- **Always needs human:** Visual appearance, user flow completion, real-time behavior (WebSocket/SSE), external service integration, performance feel, error message clarity.
184
-
185
- **Needs human if uncertain:** Complex wiring grep can't trace, dynamic state-dependent behavior, edge cases.
186
-
187
- Format each as: Test Name → What to do → Expected result → Why can't verify programmatically.
188
- </step>
189
-
190
- <step name="determine_status">
191
- **passed:** All truths VERIFIED, all artifacts pass levels 1-3, all key links WIRED, no blocker anti-patterns.
192
-
193
- **gaps_found:** Any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker found.
194
-
195
- **human_needed:** All automated checks pass but human verification items remain.
196
-
197
- **Score:** `verified_truths / total_truths`
198
- </step>
199
-
200
- <step name="generate_fix_plans">
201
- If gaps_found:
202
-
203
- 1. **Cluster related gaps:** API stub + component unwired → "Wire frontend to backend". Multiple missing → "Complete core implementation". Wiring only → "Connect existing components".
204
-
205
- 2. **Generate plan per cluster:** Objective, 2-3 tasks (files/action/verify each), re-verify step. Keep focused: single concern per plan.
206
-
207
- 3. **Order by dependency:** Fix missing → fix stubs → fix wiring → verify.
208
- </step>
209
-
210
- <step name="create_report">
211
- ```bash
212
- REPORT_PATH="$PHASE_DIR/${PHASE_NUM}-VERIFICATION.md"
213
- ```
214
-
215
- Fill template sections: frontmatter (phase/timestamp/status/score), goal achievement, artifact table, wiring table, requirements coverage, anti-patterns, human verification, gaps summary, fix plans (if gaps_found), metadata.
216
-
217
- See ~/.claude/get-shit-done/templates/verification-report.md for complete template.
218
- </step>
219
-
220
- <step name="return_to_orchestrator">
221
- Return status (`passed` | `gaps_found` | `human_needed`), score (N/M must-haves), report path.
222
-
223
- If gaps_found: list gaps + recommended fix plan names.
224
- If human_needed: list items requiring human testing.
225
-
226
- Orchestrator routes: `passed` → update_roadmap | `gaps_found` → create/execute fixes, re-verify | `human_needed` → present to user.
227
- </step>
228
-
229
- </process>
230
-
231
- <success_criteria>
232
- - [ ] Must-haves established (from frontmatter or derived)
233
- - [ ] All truths verified with status and evidence
234
- - [ ] All artifacts checked at all three levels
235
- - [ ] All key links verified
236
- - [ ] Requirements coverage assessed (if applicable)
237
- - [ ] Anti-patterns scanned and categorized
238
- - [ ] Human verification items identified
239
- - [ ] Overall status determined
240
- - [ ] Fix plans generated (if gaps_found)
241
- - [ ] VERIFICATION.md created with complete report
242
- - [ ] Results returned to orchestrator
243
- </success_criteria>
1
+ <purpose>
2
+ Verify phase goal achievement through goal-backward analysis. Check that the codebase delivers what the phase promised, not just that tasks completed.
3
+
4
+ Executed by a verification subagent spawned from execute-phase.md.
5
+ </purpose>
6
+
7
+ <core_principle>
8
+ **Task completion ≠ Goal achievement**
9
+
10
+ A task "create chat component" can be marked complete when the component is a placeholder. The task was done — but the goal "working chat interface" was not achieved.
11
+
12
+ Goal-backward verification:
13
+ 1. What must be TRUE for the goal to be achieved?
14
+ 2. What must EXIST for those truths to hold?
15
+ 3. What must be WIRED for those artifacts to function?
16
+
17
+ Then verify each level against the actual codebase.
18
+ </core_principle>
19
+
20
+ <required_reading>
21
+ @~/.claude/ez-agents/references/verification-patterns.md
22
+ @~/.claude/ez-agents/templates/verification-report.md
23
+ </required_reading>
24
+
25
+ <process>
26
+
27
+ <step name="load_context" priority="first">
28
+ Load phase operation context:
29
+
30
+ ```bash
31
+ INIT=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" init phase-op "${PHASE_ARG}")
32
+ if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
33
+ ```
34
+
35
+ Extract from init JSON: `phase_dir`, `phase_number`, `phase_name`, `has_plans`, `plan_count`.
36
+
37
+ Then load phase details and list plans/summaries:
38
+ ```bash
39
+ node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" roadmap get-phase "${phase_number}"
40
+ grep -E "^| ${phase_number}" .planning/REQUIREMENTS.md 2>/dev/null
41
+ ls "$phase_dir"/*-SUMMARY.md "$phase_dir"/*-PLAN.md 2>/dev/null
42
+ ```
43
+
44
+ Extract **phase goal** from ROADMAP.md (the outcome to verify, not tasks) and **requirements** from REQUIREMENTS.md if it exists.
45
+ </step>
46
+
47
+ <step name="establish_must_haves">
48
+ **Option A: Must-haves in PLAN frontmatter**
49
+
50
+ Use ez-tools to extract must_haves from each PLAN:
51
+
52
+ ```bash
53
+ for plan in "$PHASE_DIR"/*-PLAN.md; do
54
+ MUST_HAVES=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" frontmatter get "$plan" --field must_haves)
55
+ echo "=== $plan ===" && echo "$MUST_HAVES"
56
+ done
57
+ ```
58
+
59
+ Returns JSON: `{ truths: [...], artifacts: [...], key_links: [...] }`
60
+
61
+ Aggregate all must_haves across plans for phase-level verification.
62
+
63
+ **Option B: Use Success Criteria from ROADMAP.md**
64
+
65
+ If no must_haves in frontmatter (MUST_HAVES returns error or empty), check for Success Criteria:
66
+
67
+ ```bash
68
+ PHASE_DATA=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" roadmap get-phase "${phase_number}" --raw)
69
+ ```
70
+
71
+ Parse the `success_criteria` array from the JSON output. If non-empty:
72
+ 1. Use each Success Criterion directly as a **truth** (they are already written as observable, testable behaviors)
73
+ 2. Derive **artifacts** (concrete file paths for each truth)
74
+ 3. Derive **key links** (critical wiring where stubs hide)
75
+ 4. Document the must-haves before proceeding
76
+
77
+ Success Criteria from ROADMAP.md are the contract — they override PLAN-level must_haves when both exist.
78
+
79
+ **Option C: Derive from phase goal (fallback)**
80
+
81
+ If no must_haves in frontmatter AND no Success Criteria in ROADMAP:
82
+ 1. State the goal from ROADMAP.md
83
+ 2. Derive **truths** (3-7 observable behaviors, each testable)
84
+ 3. Derive **artifacts** (concrete file paths for each truth)
85
+ 4. Derive **key links** (critical wiring where stubs hide)
86
+ 5. Document derived must-haves before proceeding
87
+ </step>
88
+
89
+ <step name="verify_truths">
90
+ For each observable truth, determine if the codebase enables it.
91
+
92
+ **Status:** ✓ VERIFIED (all supporting artifacts pass) | ✗ FAILED (artifact missing/stub/unwired) | ? UNCERTAIN (needs human)
93
+
94
+ For each truth: identify supporting artifacts → check artifact status → check wiring → determine truth status.
95
+
96
+ **Example:** Truth "User can see existing messages" depends on Chat.tsx (renders), /api/chat GET (provides), Message model (schema). If Chat.tsx is a stub or API returns hardcoded [] → FAILED. If all exist, are substantive, and connected → VERIFIED.
97
+ </step>
98
+
99
+ <step name="verify_artifacts">
100
+ Use ez-tools for artifact verification against must_haves in each PLAN:
101
+
102
+ ```bash
103
+ for plan in "$PHASE_DIR"/*-PLAN.md; do
104
+ ARTIFACT_RESULT=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" verify artifacts "$plan")
105
+ echo "=== $plan ===" && echo "$ARTIFACT_RESULT"
106
+ done
107
+ ```
108
+
109
+ Parse JSON result: `{ all_passed, passed, total, artifacts: [{path, exists, issues, passed}] }`
110
+
111
+ **Artifact status from result:**
112
+ - `exists=false` → MISSING
113
+ - `issues` not empty → STUB (check issues for "Only N lines" or "Missing pattern")
114
+ - `passed=true` → VERIFIED (Levels 1-2 pass)
115
+
116
+ **Level 3 — Wired (manual check for artifacts that pass Levels 1-2):**
117
+ ```bash
118
+ grep -r "import.*$artifact_name" src/ --include="*.ts" --include="*.tsx" # IMPORTED
119
+ grep -r "$artifact_name" src/ --include="*.ts" --include="*.tsx" | grep -v "import" # USED
120
+ ```
121
+ WIRED = imported AND used. ORPHANED = exists but not imported/used.
122
+
123
+ | Exists | Substantive | Wired | Status |
124
+ |--------|-------------|-------|--------|
125
+ | ✓ | ✓ | ✓ | ✓ VERIFIED |
126
+ | ✓ | ✓ | ✗ | ⚠️ ORPHANED |
127
+ | ✓ | ✗ | - | ✗ STUB |
128
+ | ✗ | - | - | ✗ MISSING |
129
+ </step>
130
+
131
+ <step name="verify_wiring">
132
+ Use ez-tools for key link verification against must_haves in each PLAN:
133
+
134
+ ```bash
135
+ for plan in "$PHASE_DIR"/*-PLAN.md; do
136
+ LINKS_RESULT=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" verify key-links "$plan")
137
+ echo "=== $plan ===" && echo "$LINKS_RESULT"
138
+ done
139
+ ```
140
+
141
+ Parse JSON result: `{ all_verified, verified, total, links: [{from, to, via, verified, detail}] }`
142
+
143
+ **Link status from result:**
144
+ - `verified=true` → WIRED
145
+ - `verified=false` with "not found" → NOT_WIRED
146
+ - `verified=false` with "Pattern not found" → PARTIAL
147
+
148
+ **Fallback patterns (if key_links not in must_haves):**
149
+
150
+ | Pattern | Check | Status |
151
+ |---------|-------|--------|
152
+ | Component → API | fetch/axios call to API path, response used (await/.then/setState) | WIRED / PARTIAL (call but unused response) / NOT_WIRED |
153
+ | API → Database | Prisma/DB query on model, result returned via res.json() | WIRED / PARTIAL (query but not returned) / NOT_WIRED |
154
+ | Form → Handler | onSubmit with real implementation (fetch/axios/mutate/dispatch), not console.log/empty | WIRED / STUB (log-only/empty) / NOT_WIRED |
155
+ | State → Render | useState variable appears in JSX (`{stateVar}` or `{stateVar.property}`) | WIRED / NOT_WIRED |
156
+
157
+ Record status and evidence for each key link.
158
+ </step>
159
+
160
+ <step name="verify_requirements">
161
+ If REQUIREMENTS.md exists:
162
+ ```bash
163
+ grep -E "Phase ${PHASE_NUM}" .planning/REQUIREMENTS.md 2>/dev/null
164
+ ```
165
+
166
+ For each requirement: parse description → identify supporting truths/artifacts → status: ✓ SATISFIED / ✗ BLOCKED / ? NEEDS HUMAN.
167
+ </step>
168
+
169
+ <step name="scan_antipatterns">
170
+ Extract files modified in this phase from SUMMARY.md, scan each:
171
+
172
+ | Pattern | Search | Severity |
173
+ |---------|--------|----------|
174
+ | TODO/FIXME/XXX/HACK | `grep -n -E "TODO\|FIXME\|XXX\|HACK"` | ⚠️ Warning |
175
+ | Placeholder content | `grep -n -iE "placeholder\|coming soon\|will be here"` | 🛑 Blocker |
176
+ | Empty returns | `grep -n -E "return null\|return \{\}\|return \[\]\|=> \{\}"` | ⚠️ Warning |
177
+ | Log-only functions | Functions containing only console.log | ⚠️ Warning |
178
+
179
+ Categorize: 🛑 Blocker (prevents goal) | ⚠️ Warning (incomplete) | ℹ️ Info (notable).
180
+ </step>
181
+
182
+ <step name="identify_human_verification">
183
+ **Always needs human:** Visual appearance, user flow completion, real-time behavior (WebSocket/SSE), external service integration, performance feel, error message clarity.
184
+
185
+ **Needs human if uncertain:** Complex wiring grep can't trace, dynamic state-dependent behavior, edge cases.
186
+
187
+ Format each as: Test Name → What to do → Expected result → Why can't verify programmatically.
188
+ </step>
189
+
190
+ <step name="determine_status">
191
+ **passed:** All truths VERIFIED, all artifacts pass levels 1-3, all key links WIRED, no blocker anti-patterns.
192
+
193
+ **gaps_found:** Any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker found.
194
+
195
+ **human_needed:** All automated checks pass but human verification items remain.
196
+
197
+ **Score:** `verified_truths / total_truths`
198
+ </step>
199
+
200
+ <step name="generate_fix_plans">
201
+ If gaps_found:
202
+
203
+ 1. **Cluster related gaps:** API stub + component unwired → "Wire frontend to backend". Multiple missing → "Complete core implementation". Wiring only → "Connect existing components".
204
+
205
+ 2. **Generate plan per cluster:** Objective, 2-3 tasks (files/action/verify each), re-verify step. Keep focused: single concern per plan.
206
+
207
+ 3. **Order by dependency:** Fix missing → fix stubs → fix wiring → verify.
208
+ </step>
209
+
210
+ <step name="create_report">
211
+ ```bash
212
+ REPORT_PATH="$PHASE_DIR/${PHASE_NUM}-VERIFICATION.md"
213
+ ```
214
+
215
+ Fill template sections: frontmatter (phase/timestamp/status/score), goal achievement, artifact table, wiring table, requirements coverage, anti-patterns, human verification, gaps summary, fix plans (if gaps_found), metadata.
216
+
217
+ See ~/.claude/ez-agents/templates/verification-report.md for complete template.
218
+ </step>
219
+
220
+ <step name="return_to_orchestrator">
221
+ Return status (`passed` | `gaps_found` | `human_needed`), score (N/M must-haves), report path.
222
+
223
+ If gaps_found: list gaps + recommended fix plan names.
224
+ If human_needed: list items requiring human testing.
225
+
226
+ Orchestrator routes: `passed` → update_roadmap | `gaps_found` → create/execute fixes, re-verify | `human_needed` → present to user.
227
+ </step>
228
+
229
+ </process>
230
+
231
+ <success_criteria>
232
+ - [ ] Must-haves established (from frontmatter or derived)
233
+ - [ ] All truths verified with status and evidence
234
+ - [ ] All artifacts checked at all three levels
235
+ - [ ] All key links verified
236
+ - [ ] Requirements coverage assessed (if applicable)
237
+ - [ ] Anti-patterns scanned and categorized
238
+ - [ ] Human verification items identified
239
+ - [ ] Overall status determined
240
+ - [ ] Fix plans generated (if gaps_found)
241
+ - [ ] VERIFICATION.md created with complete report
242
+ - [ ] Results returned to orchestrator
243
+ </success_criteria>
@@ -15,7 +15,7 @@ No Pass/Fail buttons. No severity questions. Just: "Here's what should happen. D
15
15
  </philosophy>
16
16
 
17
17
  <template>
18
- @~/.claude/get-shit-done/templates/UAT.md
18
+ @~/.claude/ez-agents/templates/UAT.md
19
19
  </template>
20
20
 
21
21
  <process>
@@ -349,7 +349,7 @@ Spawning parallel debug agents to investigate each issue.
349
349
  ```
350
350
 
351
351
  - Load diagnose-issues workflow
352
- - Follow @~/.claude/get-shit-done/workflows/diagnose-issues.md
352
+ - Follow @~/.claude/ez-agents/workflows/diagnose-issues.md
353
353
  - Spawn parallel debug agents for each issue
354
354
  - Collect root causes
355
355
  - Update UAT.md with root causes
@@ -370,7 +370,7 @@ Display:
370
370
  ◆ Spawning planner for gap closure...
371
371
  ```
372
372
 
373
- Spawn gsd-planner in --gaps mode:
373
+ Spawn ez-planner in --gaps mode:
374
374
 
375
375
  ```
376
376
  Task(
@@ -577,8 +577,8 @@ Default to **major** if unclear. User can correct if needed.
577
577
  - [ ] Batched writes: on issue, every 5 passes, or completion
578
578
  - [ ] Committed on completion
579
579
  - [ ] If issues: parallel debug agents diagnose root causes
580
- - [ ] If issues: gsd-planner creates fix plans (gap_closure mode)
581
- - [ ] If issues: gsd-plan-checker verifies fix plans
580
+ - [ ] If issues: ez-planner creates fix plans (gap_closure mode)
581
+ - [ ] If issues: ez-plan-checker verifies fix plans
582
582
  - [ ] If issues: revision loop until plans pass (max 3 iterations)
583
583
  - [ ] Ready for `/ez:execute-phase --gaps-only` when complete
584
584
  </success_criteria>
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ // Check for EZ Agents updates in background, write result to cache
3
+ // Called by SessionStart hook - runs once per session
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const os = require('os');
8
+ const { spawn } = require('child_process');
9
+
10
+ const homeDir = os.homedir();
11
+ const cwd = process.cwd();
12
+
13
+ // Detect runtime config directory (supports Claude, OpenCode, Gemini)
14
+ // Respects CLAUDE_CONFIG_DIR for custom config directory setups
15
+ function detectConfigDir(baseDir) {
16
+ // Check env override first (supports multi-account setups)
17
+ const envDir = process.env.CLAUDE_CONFIG_DIR;
18
+ if (envDir && fs.existsSync(path.join(envDir, 'ez-agents', 'VERSION'))) {
19
+ return envDir;
20
+ }
21
+ for (const dir of ['.config/opencode', '.opencode', '.gemini', '.claude']) {
22
+ if (fs.existsSync(path.join(baseDir, dir, 'ez-agents', 'VERSION'))) {
23
+ return path.join(baseDir, dir);
24
+ }
25
+ }
26
+ return envDir || path.join(baseDir, '.claude');
27
+ }
28
+
29
+ const globalConfigDir = detectConfigDir(homeDir);
30
+ const projectConfigDir = detectConfigDir(cwd);
31
+ const cacheDir = path.join(globalConfigDir, 'cache');
32
+ const cacheFile = path.join(cacheDir, 'ez-update-check.json');
33
+
34
+ // VERSION file locations (check project first, then global)
35
+ const projectVersionFile = path.join(projectConfigDir, 'ez-agents', 'VERSION');
36
+ const globalVersionFile = path.join(globalConfigDir, 'ez-agents', 'VERSION');
37
+
38
+ // Ensure cache directory exists
39
+ if (!fs.existsSync(cacheDir)) {
40
+ fs.mkdirSync(cacheDir, { recursive: true });
41
+ }
42
+
43
+ // Run check in background (spawn background process, windowsHide prevents console flash)
44
+ const child = spawn(process.execPath, ['-e', `
45
+ const fs = require('fs');
46
+ const { execSync } = require('child_process');
47
+
48
+ const cacheFile = ${JSON.stringify(cacheFile)};
49
+ const projectVersionFile = ${JSON.stringify(projectVersionFile)};
50
+ const globalVersionFile = ${JSON.stringify(globalVersionFile)};
51
+
52
+ // Check project directory first (local install), then global
53
+ let installed = '0.0.0';
54
+ try {
55
+ if (fs.existsSync(projectVersionFile)) {
56
+ installed = fs.readFileSync(projectVersionFile, 'utf8').trim();
57
+ } else if (fs.existsSync(globalVersionFile)) {
58
+ installed = fs.readFileSync(globalVersionFile, 'utf8').trim();
59
+ }
60
+ } catch (e) {}
61
+
62
+ let latest = null;
63
+ try {
64
+ latest = execSync('npm view ez-agents version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
65
+ } catch (e) {}
66
+
67
+ const result = {
68
+ update_available: latest && installed !== latest,
69
+ installed,
70
+ latest: latest || 'unknown',
71
+ checked: Math.floor(Date.now() / 1000)
72
+ };
73
+
74
+ fs.writeFileSync(cacheFile, JSON.stringify(result));
75
+ `], {
76
+ stdio: 'ignore',
77
+ windowsHide: true,
78
+ detached: true // Required on Windows for proper process detachment
79
+ });
80
+
81
+ child.unref();