mindforge-cc 2.0.0 → 2.1.1

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 (323) hide show
  1. package/.agent/bin/lib/commands.cjs +959 -0
  2. package/.agent/bin/lib/config.cjs +421 -0
  3. package/.agent/bin/lib/core.cjs +1166 -0
  4. package/.agent/bin/lib/frontmatter.cjs +307 -0
  5. package/.agent/bin/lib/init.cjs +1336 -0
  6. package/.agent/bin/lib/milestone.cjs +252 -0
  7. package/.agent/bin/lib/model-profiles.cjs +68 -0
  8. package/.agent/bin/lib/phase.cjs +888 -0
  9. package/.agent/bin/lib/profile-output.cjs +952 -0
  10. package/.agent/bin/lib/profile-pipeline.cjs +539 -0
  11. package/.agent/bin/lib/roadmap.cjs +329 -0
  12. package/.agent/bin/lib/security.cjs +356 -0
  13. package/.agent/bin/lib/state.cjs +969 -0
  14. package/.agent/bin/lib/template.cjs +222 -0
  15. package/.agent/bin/lib/uat.cjs +189 -0
  16. package/.agent/bin/lib/verify.cjs +851 -0
  17. package/.agent/bin/lib/workstream.cjs +491 -0
  18. package/.agent/bin/mindforge-tools.cjs +897 -0
  19. package/.agent/file-manifest.json +219 -0
  20. package/.agent/hooks/mindforge-check-update.js +114 -0
  21. package/.agent/hooks/mindforge-context-monitor.js +156 -0
  22. package/.agent/hooks/mindforge-prompt-guard.js +96 -0
  23. package/.agent/hooks/mindforge-statusline.js +119 -0
  24. package/.agent/hooks/mindforge-workflow-guard.js +94 -0
  25. package/.agent/mindforge/add-backlog.md +32 -0
  26. package/.agent/mindforge/agent.md +31 -0
  27. package/.agent/mindforge/discuss-phase.md +1 -1
  28. package/.agent/mindforge/do.md +31 -0
  29. package/.agent/mindforge/help.md +1 -1
  30. package/.agent/mindforge/learn.md +3 -2
  31. package/.agent/mindforge/note.md +35 -0
  32. package/.agent/mindforge/plant-seed.md +31 -0
  33. package/.agent/mindforge/research.md +3 -2
  34. package/.agent/mindforge/review-backlog.md +34 -0
  35. package/.agent/mindforge/session-report.md +39 -0
  36. package/.agent/mindforge/steer.md +1 -1
  37. package/.agent/mindforge/ui-phase.md +34 -0
  38. package/.agent/mindforge/ui-review.md +36 -0
  39. package/.agent/mindforge/validate-phase.md +31 -0
  40. package/.agent/mindforge/workstreams.md +35 -0
  41. package/.agent/settings.json +38 -0
  42. package/.agent/skills/mindforge-add-backlog/SKILL.md +72 -0
  43. package/.agent/skills/mindforge-add-phase/SKILL.md +39 -0
  44. package/.agent/skills/mindforge-add-tests/SKILL.md +28 -0
  45. package/.agent/skills/mindforge-add-todo/SKILL.md +42 -0
  46. package/.agent/skills/mindforge-audit-milestone/SKILL.md +29 -0
  47. package/.agent/skills/mindforge-audit-uat/SKILL.md +20 -0
  48. package/.agent/skills/mindforge-autonomous/SKILL.md +33 -0
  49. package/.agent/skills/mindforge-check-todos/SKILL.md +40 -0
  50. package/.agent/skills/mindforge-cleanup/SKILL.md +19 -0
  51. package/.agent/skills/mindforge-complete-milestone/SKILL.md +131 -0
  52. package/.agent/skills/mindforge-debug/SKILL.md +163 -0
  53. package/.agent/skills/mindforge-discuss-phase/SKILL.md +54 -0
  54. package/.agent/skills/mindforge-do/SKILL.md +26 -0
  55. package/.agent/skills/mindforge-execute-phase/SKILL.md +49 -0
  56. package/.agent/skills/mindforge-fast/SKILL.md +23 -0
  57. package/.agent/skills/mindforge-forensics/SKILL.md +49 -0
  58. package/.agent/skills/mindforge-health/SKILL.md +17 -0
  59. package/.agent/skills/mindforge-help/SKILL.md +23 -0
  60. package/.agent/skills/mindforge-insert-phase/SKILL.md +28 -0
  61. package/.agent/skills/mindforge-join-discord/SKILL.md +19 -0
  62. package/.agent/skills/mindforge-list-phase-assumptions/SKILL.md +41 -0
  63. package/.agent/skills/mindforge-list-workspaces/SKILL.md +17 -0
  64. package/.agent/skills/mindforge-manager/SKILL.md +32 -0
  65. package/.agent/skills/mindforge-map-codebase/SKILL.md +64 -0
  66. package/.agent/skills/mindforge-milestone-summary/SKILL.md +44 -0
  67. package/.agent/skills/mindforge-new-milestone/SKILL.md +38 -0
  68. package/.agent/skills/mindforge-new-project/SKILL.md +36 -0
  69. package/.agent/skills/mindforge-new-workspace/SKILL.md +39 -0
  70. package/.agent/skills/mindforge-next/SKILL.md +19 -0
  71. package/.agent/skills/mindforge-note/SKILL.md +29 -0
  72. package/.agent/skills/mindforge-pause-work/SKILL.md +35 -0
  73. package/.agent/skills/mindforge-plan-milestone-gaps/SKILL.md +28 -0
  74. package/.agent/skills/mindforge-plan-phase/SKILL.md +37 -0
  75. package/.agent/skills/mindforge-plant-seed/SKILL.md +22 -0
  76. package/.agent/skills/mindforge-pr-branch/SKILL.md +21 -0
  77. package/.agent/skills/mindforge-profile-user/SKILL.md +38 -0
  78. package/.agent/skills/mindforge-progress/SKILL.md +19 -0
  79. package/.agent/skills/mindforge-quick/SKILL.md +38 -0
  80. package/.agent/skills/mindforge-reapply-patches/SKILL.md +124 -0
  81. package/.agent/skills/mindforge-remove-phase/SKILL.md +26 -0
  82. package/.agent/skills/mindforge-remove-workspace/SKILL.md +22 -0
  83. package/.agent/skills/mindforge-research-phase/SKILL.md +186 -0
  84. package/.agent/skills/mindforge-resume-work/SKILL.md +35 -0
  85. package/.agent/skills/mindforge-review/SKILL.md +31 -0
  86. package/.agent/skills/mindforge-review-backlog/SKILL.md +58 -0
  87. package/.agent/skills/mindforge-session-report/SKILL.md +16 -0
  88. package/.agent/skills/mindforge-set-profile/SKILL.md +9 -0
  89. package/.agent/skills/mindforge-settings/SKILL.md +32 -0
  90. package/.agent/skills/mindforge-ship/SKILL.md +16 -0
  91. package/.agent/skills/mindforge-stats/SKILL.md +16 -0
  92. package/.agent/skills/mindforge-thread/SKILL.md +123 -0
  93. package/.agent/skills/mindforge-ui-phase/SKILL.md +24 -0
  94. package/.agent/skills/mindforge-ui-review/SKILL.md +24 -0
  95. package/.agent/skills/mindforge-update/SKILL.md +35 -0
  96. package/.agent/skills/mindforge-validate-phase/SKILL.md +26 -0
  97. package/.agent/skills/mindforge-verify-work/SKILL.md +30 -0
  98. package/.agent/skills/mindforge-workstreams/SKILL.md +65 -0
  99. package/.agent/workflows/mindforge-add-phase.md +112 -0
  100. package/.agent/workflows/mindforge-add-tests.md +351 -0
  101. package/.agent/workflows/mindforge-add-todo.md +158 -0
  102. package/.agent/workflows/mindforge-audit-milestone.md +332 -0
  103. package/.agent/workflows/mindforge-audit-uat.md +109 -0
  104. package/.agent/workflows/mindforge-autonomous.md +815 -0
  105. package/.agent/workflows/mindforge-check-todos.md +177 -0
  106. package/.agent/workflows/mindforge-cleanup.md +152 -0
  107. package/.agent/workflows/mindforge-complete-milestone.md +766 -0
  108. package/.agent/workflows/mindforge-diagnose-issues.md +220 -0
  109. package/.agent/workflows/mindforge-discovery-phase.md +289 -0
  110. package/.agent/workflows/mindforge-discuss-phase-assumptions.md +645 -0
  111. package/.agent/workflows/mindforge-discuss-phase.md +1047 -0
  112. package/.agent/workflows/mindforge-do.md +104 -0
  113. package/.agent/workflows/mindforge-execute-phase.md +838 -0
  114. package/.agent/workflows/mindforge-execute-plan.md +509 -0
  115. package/.agent/workflows/mindforge-fast.md +105 -0
  116. package/.agent/workflows/mindforge-forensics.md +265 -0
  117. package/.agent/workflows/mindforge-health.md +181 -0
  118. package/.agent/workflows/mindforge-help.md +606 -0
  119. package/.agent/workflows/mindforge-insert-phase.md +130 -0
  120. package/.agent/workflows/mindforge-list-phase-assumptions.md +178 -0
  121. package/.agent/workflows/mindforge-list-workspaces.md +56 -0
  122. package/.agent/workflows/mindforge-manager.md +360 -0
  123. package/.agent/workflows/mindforge-map-codebase.md +370 -0
  124. package/.agent/workflows/mindforge-milestone-summary.md +223 -0
  125. package/.agent/workflows/mindforge-new-milestone.md +469 -0
  126. package/.agent/workflows/mindforge-new-project.md +1226 -0
  127. package/.agent/workflows/mindforge-new-workspace.md +237 -0
  128. package/.agent/workflows/mindforge-next.md +97 -0
  129. package/.agent/workflows/mindforge-node-repair.md +92 -0
  130. package/.agent/workflows/mindforge-note.md +156 -0
  131. package/.agent/workflows/mindforge-pause-work.md +176 -0
  132. package/.agent/workflows/mindforge-plan-milestone-gaps.md +273 -0
  133. package/.agent/workflows/mindforge-plan-phase.md +848 -0
  134. package/.agent/workflows/mindforge-plant-seed.md +169 -0
  135. package/.agent/workflows/mindforge-pr-branch.md +129 -0
  136. package/.agent/workflows/mindforge-profile-user.md +450 -0
  137. package/.agent/workflows/mindforge-progress.md +507 -0
  138. package/.agent/workflows/mindforge-quick.md +732 -0
  139. package/.agent/workflows/mindforge-remove-phase.md +155 -0
  140. package/.agent/workflows/mindforge-remove-workspace.md +90 -0
  141. package/.agent/workflows/mindforge-research-phase.md +74 -0
  142. package/.agent/workflows/mindforge-resume-project.md +325 -0
  143. package/.agent/workflows/mindforge-review.md +228 -0
  144. package/.agent/workflows/mindforge-session-report.md +146 -0
  145. package/.agent/workflows/mindforge-settings.md +283 -0
  146. package/.agent/workflows/mindforge-ship.md +228 -0
  147. package/.agent/workflows/mindforge-stats.md +60 -0
  148. package/.agent/workflows/mindforge-transition.md +671 -0
  149. package/.agent/workflows/mindforge-ui-phase.md +290 -0
  150. package/.agent/workflows/mindforge-ui-review.md +157 -0
  151. package/.agent/workflows/mindforge-update.md +323 -0
  152. package/.agent/workflows/mindforge-validate-phase.md +167 -0
  153. package/.agent/workflows/mindforge-verify-phase.md +254 -0
  154. package/.agent/workflows/mindforge-verify-work.md +623 -0
  155. package/.claude/commands/mindforge/add-backlog.md +32 -0
  156. package/.claude/commands/mindforge/agent.md +31 -0
  157. package/.claude/commands/mindforge/approve.md +27 -15
  158. package/.claude/commands/mindforge/audit.md +30 -26
  159. package/.claude/commands/mindforge/auto.md +29 -18
  160. package/.claude/commands/mindforge/benchmark.md +26 -29
  161. package/.claude/commands/mindforge/browse.md +24 -22
  162. package/.claude/commands/mindforge/complete-milestone.md +28 -14
  163. package/.claude/commands/mindforge/costs.md +26 -9
  164. package/.claude/commands/mindforge/cross-review.md +27 -13
  165. package/.claude/commands/mindforge/dashboard.md +35 -98
  166. package/.claude/commands/mindforge/debug.md +34 -126
  167. package/.claude/commands/mindforge/discuss-phase.md +36 -138
  168. package/.claude/commands/mindforge/do.md +31 -0
  169. package/.claude/commands/mindforge/execute-phase.md +37 -190
  170. package/.claude/commands/mindforge/health.md +27 -17
  171. package/.claude/commands/mindforge/help.md +25 -19
  172. package/.claude/commands/mindforge/init-org.md +37 -131
  173. package/.claude/commands/mindforge/init-project.md +40 -155
  174. package/.claude/commands/mindforge/install-skill.md +32 -15
  175. package/.claude/commands/mindforge/learn.md +36 -142
  176. package/.claude/commands/mindforge/map-codebase.md +36 -298
  177. package/.claude/commands/mindforge/marketplace.md +33 -120
  178. package/.claude/commands/mindforge/metrics.md +29 -18
  179. package/.claude/commands/mindforge/migrate.md +33 -40
  180. package/.claude/commands/mindforge/milestone.md +35 -12
  181. package/.claude/commands/mindforge/new-runtime.md +25 -15
  182. package/.claude/commands/mindforge/next.md +34 -105
  183. package/.claude/commands/mindforge/note.md +35 -0
  184. package/.claude/commands/mindforge/plan-phase.md +34 -125
  185. package/.claude/commands/mindforge/plant-seed.md +31 -0
  186. package/.claude/commands/mindforge/plugins.md +30 -36
  187. package/.claude/commands/mindforge/pr-review.md +32 -41
  188. package/.claude/commands/mindforge/profile-team.md +26 -19
  189. package/.claude/commands/mindforge/publish-skill.md +28 -17
  190. package/.claude/commands/mindforge/qa.md +27 -12
  191. package/.claude/commands/mindforge/quick.md +35 -135
  192. package/.claude/commands/mindforge/release.md +27 -8
  193. package/.claude/commands/mindforge/remember.md +25 -10
  194. package/.claude/commands/mindforge/research.md +27 -9
  195. package/.claude/commands/mindforge/retrospective.md +28 -22
  196. package/.claude/commands/mindforge/review-backlog.md +34 -0
  197. package/.claude/commands/mindforge/review.md +37 -157
  198. package/.claude/commands/mindforge/security-scan.md +34 -233
  199. package/.claude/commands/mindforge/session-report.md +39 -0
  200. package/.claude/commands/mindforge/ship.md +34 -100
  201. package/.claude/commands/mindforge/skills.md +36 -141
  202. package/.claude/commands/mindforge/status.md +30 -104
  203. package/.claude/commands/mindforge/steer.md +25 -10
  204. package/.claude/commands/mindforge/sync-confluence.md +28 -9
  205. package/.claude/commands/mindforge/sync-jira.md +32 -12
  206. package/.claude/commands/mindforge/tokens.md +25 -6
  207. package/.claude/commands/mindforge/ui-phase.md +34 -0
  208. package/.claude/commands/mindforge/ui-review.md +36 -0
  209. package/.claude/commands/mindforge/update.md +33 -42
  210. package/.claude/commands/mindforge/validate-phase.md +31 -0
  211. package/.claude/commands/mindforge/verify-phase.md +30 -62
  212. package/.claude/commands/mindforge/workspace.md +28 -25
  213. package/.claude/commands/mindforge/workstreams.md +35 -0
  214. package/.mindforge/memory/decision-library.jsonl +0 -0
  215. package/.mindforge/memory/knowledge-base.jsonl +7 -0
  216. package/.mindforge/memory/pattern-library.jsonl +1 -0
  217. package/.mindforge/memory/team-preferences.jsonl +4 -0
  218. package/.mindforge/personas/advisor-researcher.md +89 -0
  219. package/.mindforge/personas/analyst.md +112 -52
  220. package/.mindforge/personas/architect.md +100 -67
  221. package/.mindforge/personas/assumptions-analyzer-extend.md +87 -0
  222. package/.mindforge/personas/assumptions-analyzer.md +109 -0
  223. package/.mindforge/personas/codebase-mapper-extend.md +93 -0
  224. package/.mindforge/personas/codebase-mapper.md +770 -0
  225. package/.mindforge/personas/coverage-specialist.md +104 -0
  226. package/.mindforge/personas/debug-specialist.md +118 -52
  227. package/.mindforge/personas/debugger.md +97 -0
  228. package/.mindforge/personas/decision-architect.md +102 -0
  229. package/.mindforge/personas/developer.md +97 -85
  230. package/.mindforge/personas/executor.md +88 -0
  231. package/.mindforge/personas/integration-checker.md +92 -0
  232. package/.mindforge/personas/nyquist-auditor.md +84 -0
  233. package/.mindforge/personas/phase-researcher.md +107 -0
  234. package/.mindforge/personas/plan-checker.md +92 -0
  235. package/.mindforge/personas/planner.md +105 -0
  236. package/.mindforge/personas/project-researcher.md +99 -0
  237. package/.mindforge/personas/qa-engineer.md +113 -61
  238. package/.mindforge/personas/release-manager.md +102 -64
  239. package/.mindforge/personas/research-agent.md +109 -24
  240. package/.mindforge/personas/research-synthesizer.md +101 -0
  241. package/.mindforge/personas/roadmapper-extend.md +100 -0
  242. package/.mindforge/personas/roadmapper.md +103 -0
  243. package/.mindforge/personas/security-reviewer.md +114 -91
  244. package/.mindforge/personas/tech-writer.md +118 -51
  245. package/.mindforge/personas/ui-auditor.md +94 -0
  246. package/.mindforge/personas/ui-checker.md +89 -0
  247. package/.mindforge/personas/ui-researcher.md +99 -0
  248. package/.mindforge/personas/user-profiler.md +93 -0
  249. package/.mindforge/personas/verifier.md +101 -0
  250. package/.planning/ROADMAP.md +10 -0
  251. package/.planning/browser-daemon.log +32 -0
  252. package/.planning/phases/01-migrate-gsd-to-mindforge/.gitkeep +0 -0
  253. package/CHANGELOG.md +41 -0
  254. package/MINDFORGE.md +2 -0
  255. package/README.md +40 -3
  256. package/bin/installer-core.js +3 -4
  257. package/docs/PERSONAS.md +611 -0
  258. package/docs/commands-reference.md +1 -0
  259. package/docs/{Context → context}/Master-Context.md +6 -13
  260. package/docs/references/checkpoints.md +778 -0
  261. package/docs/{reference → references}/commands.md +53 -43
  262. package/docs/references/continuation-format.md +249 -0
  263. package/docs/references/decimal-phase-calculation.md +64 -0
  264. package/docs/references/git-integration.md +295 -0
  265. package/docs/references/git-planning-commit.md +38 -0
  266. package/docs/references/model-profile-resolution.md +36 -0
  267. package/docs/references/model-profiles.md +139 -0
  268. package/docs/references/phase-argument-parsing.md +61 -0
  269. package/docs/references/planning-config.md +202 -0
  270. package/docs/references/questioning.md +162 -0
  271. package/docs/references/tdd.md +263 -0
  272. package/docs/references/ui-brand.md +160 -0
  273. package/docs/references/user-profiling.md +681 -0
  274. package/docs/references/verification-patterns.md +612 -0
  275. package/docs/references/workstream-flag.md +58 -0
  276. package/docs/skills-authoring-guide.md +1 -1
  277. package/docs/templates/Agents/CLAUDE-MD.md +122 -0
  278. package/docs/templates/Agents/COPILOT-INSTRUCTIONS.md +7 -0
  279. package/docs/templates/Agents/DEBUGGER-PROMPT.md +91 -0
  280. package/docs/templates/Agents/PLANNER-PROMPT.md +117 -0
  281. package/docs/templates/Execution/CONTINUE-HERE.md +78 -0
  282. package/docs/templates/Execution/DISCUSSION-LOG.md +63 -0
  283. package/docs/templates/Execution/PHASE-PROMPT.md +610 -0
  284. package/docs/templates/Execution/STATE.md +176 -0
  285. package/docs/templates/Execution/SUMMARY-COMPLEX.md +59 -0
  286. package/docs/templates/Execution/SUMMARY-MINIMAL.md +41 -0
  287. package/docs/templates/Execution/SUMMARY-STANDARD.md +48 -0
  288. package/docs/templates/Execution/SUMMARY.md +248 -0
  289. package/docs/templates/Profile/DEV-PREFERENCES.md +21 -0
  290. package/docs/templates/Profile/USER-PROFILE.md +146 -0
  291. package/docs/templates/Profile/USER-SETUP.md +311 -0
  292. package/docs/templates/Project/DISCOVERY.md +146 -0
  293. package/docs/templates/Project/MILESTONE-ARCHIVE.md +123 -0
  294. package/docs/templates/Project/MILESTONE.md +115 -0
  295. package/docs/templates/Project/PROJECT.md +206 -0
  296. package/docs/templates/Project/REQUIREMENTS.md +231 -0
  297. package/docs/templates/Project/RETROSPECTIVE.md +54 -0
  298. package/docs/templates/Project/ROADMAP.md +202 -0
  299. package/docs/templates/Quality/DEBUG.md +164 -0
  300. package/docs/templates/Quality/UAT.md +280 -0
  301. package/docs/templates/Quality/UI-SPEC.md +100 -0
  302. package/docs/templates/Quality/VALIDATION.md +76 -0
  303. package/docs/templates/Quality/VERIFICATION-REPORT.md +322 -0
  304. package/docs/templates/System/CONFIG.json +43 -0
  305. package/docs/templates/System/CONTEXT.md +352 -0
  306. package/docs/templates/codebase/architecture.md +255 -0
  307. package/docs/templates/codebase/concerns.md +310 -0
  308. package/docs/templates/codebase/conventions.md +307 -0
  309. package/docs/templates/codebase/integrations.md +280 -0
  310. package/docs/templates/codebase/stack.md +186 -0
  311. package/docs/templates/codebase/structure.md +285 -0
  312. package/docs/templates/codebase/testing.md +480 -0
  313. package/docs/templates/research/ARCHITECTURE.md +204 -0
  314. package/docs/templates/research/FEATURES.md +147 -0
  315. package/docs/templates/research/PITFALLS.md +200 -0
  316. package/docs/templates/research/STACK.md +120 -0
  317. package/docs/templates/research/SUMMARY.md +170 -0
  318. package/docs/user-guide.md +1 -1
  319. package/package.json +7 -2
  320. /package/docs/{reference → references}/audit-events.md +0 -0
  321. /package/docs/{reference → references}/config-reference.md +0 -0
  322. /package/docs/{reference → references}/sdk-api.md +0 -0
  323. /package/docs/{reference → references}/skills-api.md +0 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Template — Template selection and fill operations
3
+ */
4
+
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const { normalizePhaseName, findPhaseInternal, generateSlugInternal, normalizeMd, toPosixPath, output, error } = require('./core.cjs');
8
+ const { reconstructFrontmatter } = require('./frontmatter.cjs');
9
+
10
+ function cmdTemplateSelect(cwd, planPath, raw) {
11
+ if (!planPath) {
12
+ error('plan-path required');
13
+ }
14
+
15
+ try {
16
+ const fullPath = path.join(cwd, planPath);
17
+ const content = fs.readFileSync(fullPath, 'utf-8');
18
+
19
+ // Simple heuristics
20
+ const taskMatch = content.match(/###\s*Task\s*\d+/g) || [];
21
+ const taskCount = taskMatch.length;
22
+
23
+ const decisionMatch = content.match(/decision/gi) || [];
24
+ const hasDecisions = decisionMatch.length > 0;
25
+
26
+ // Count file mentions
27
+ const fileMentions = new Set();
28
+ const filePattern = /`([^`]+\.[a-zA-Z]+)`/g;
29
+ let m;
30
+ while ((m = filePattern.exec(content)) !== null) {
31
+ if (m[1].includes('/') && !m[1].startsWith('http')) {
32
+ fileMentions.add(m[1]);
33
+ }
34
+ }
35
+ const fileCount = fileMentions.size;
36
+
37
+ let template = 'templates/summary-standard.md';
38
+ let type = 'standard';
39
+
40
+ if (taskCount <= 2 && fileCount <= 3 && !hasDecisions) {
41
+ template = 'templates/summary-minimal.md';
42
+ type = 'minimal';
43
+ } else if (hasDecisions || fileCount > 6 || taskCount > 5) {
44
+ template = 'templates/summary-complex.md';
45
+ type = 'complex';
46
+ }
47
+
48
+ const result = { template, type, taskCount, fileCount, hasDecisions };
49
+ output(result, raw, template);
50
+ } catch (e) {
51
+ // Fallback to standard
52
+ output({ template: 'templates/summary-standard.md', type: 'standard', error: e.message }, raw, 'templates/summary-standard.md');
53
+ }
54
+ }
55
+
56
+ function cmdTemplateFill(cwd, templateType, options, raw) {
57
+ if (!templateType) { error('template type required: summary, plan, or verification'); }
58
+ if (!options.phase) { error('--phase required'); }
59
+
60
+ const phaseInfo = findPhaseInternal(cwd, options.phase);
61
+ if (!phaseInfo || !phaseInfo.found) { output({ error: 'Phase not found', phase: options.phase }, raw); return; }
62
+
63
+ const padded = normalizePhaseName(options.phase);
64
+ const today = new Date().toISOString().split('T')[0];
65
+ const phaseName = options.name || phaseInfo.phase_name || 'Unnamed';
66
+ const phaseSlug = phaseInfo.phase_slug || generateSlugInternal(phaseName);
67
+ const phaseId = `${padded}-${phaseSlug}`;
68
+ const planNum = (options.plan || '01').padStart(2, '0');
69
+ const fields = options.fields || {};
70
+
71
+ let frontmatter, body, fileName;
72
+
73
+ switch (templateType) {
74
+ case 'summary': {
75
+ frontmatter = {
76
+ phase: phaseId,
77
+ plan: planNum,
78
+ subsystem: '[primary category]',
79
+ tags: [],
80
+ provides: [],
81
+ affects: [],
82
+ 'tech-stack': { added: [], patterns: [] },
83
+ 'key-files': { created: [], modified: [] },
84
+ 'key-decisions': [],
85
+ 'patterns-established': [],
86
+ duration: '[X]min',
87
+ completed: today,
88
+ ...fields,
89
+ };
90
+ body = [
91
+ `# Phase ${options.phase}: ${phaseName} Summary`,
92
+ '',
93
+ '**[Substantive one-liner describing outcome]**',
94
+ '',
95
+ '## Performance',
96
+ '- **Duration:** [time]',
97
+ '- **Tasks:** [count completed]',
98
+ '- **Files modified:** [count]',
99
+ '',
100
+ '## Accomplishments',
101
+ '- [Key outcome 1]',
102
+ '- [Key outcome 2]',
103
+ '',
104
+ '## Task Commits',
105
+ '1. **Task 1: [task name]** - `hash`',
106
+ '',
107
+ '## Files Created/Modified',
108
+ '- `path/to/file.ts` - What it does',
109
+ '',
110
+ '## Decisions & Deviations',
111
+ '[Key decisions or "None - followed plan as specified"]',
112
+ '',
113
+ '## Next Phase Readiness',
114
+ '[What\'s ready for next phase]',
115
+ ].join('\n');
116
+ fileName = `${padded}-${planNum}-SUMMARY.md`;
117
+ break;
118
+ }
119
+ case 'plan': {
120
+ const planType = options.type || 'execute';
121
+ const wave = parseInt(options.wave) || 1;
122
+ frontmatter = {
123
+ phase: phaseId,
124
+ plan: planNum,
125
+ type: planType,
126
+ wave,
127
+ depends_on: [],
128
+ files_modified: [],
129
+ autonomous: true,
130
+ user_setup: [],
131
+ must_haves: { truths: [], artifacts: [], key_links: [] },
132
+ ...fields,
133
+ };
134
+ body = [
135
+ `# Phase ${options.phase} Plan ${planNum}: [Title]`,
136
+ '',
137
+ '## Objective',
138
+ '- **What:** [What this plan builds]',
139
+ '- **Why:** [Why it matters for the phase goal]',
140
+ '- **Output:** [Concrete deliverable]',
141
+ '',
142
+ '## Context',
143
+ '@.planning/PROJECT.md',
144
+ '@.planning/ROADMAP.md',
145
+ '@.planning/STATE.md',
146
+ '',
147
+ '## Tasks',
148
+ '',
149
+ '<task type="code">',
150
+ ' <name>[Task name]</name>',
151
+ ' <files>[file paths]</files>',
152
+ ' <action>[What to do]</action>',
153
+ ' <verify>[How to verify]</verify>',
154
+ ' <done>[Definition of done]</done>',
155
+ '</task>',
156
+ '',
157
+ '## Verification',
158
+ '[How to verify this plan achieved its objective]',
159
+ '',
160
+ '## Success Criteria',
161
+ '- [ ] [Criterion 1]',
162
+ '- [ ] [Criterion 2]',
163
+ ].join('\n');
164
+ fileName = `${padded}-${planNum}-PLAN.md`;
165
+ break;
166
+ }
167
+ case 'verification': {
168
+ frontmatter = {
169
+ phase: phaseId,
170
+ verified: new Date().toISOString(),
171
+ status: 'pending',
172
+ score: '0/0 must-haves verified',
173
+ ...fields,
174
+ };
175
+ body = [
176
+ `# Phase ${options.phase}: ${phaseName} — Verification`,
177
+ '',
178
+ '## Observable Truths',
179
+ '| # | Truth | Status | Evidence |',
180
+ '|---|-------|--------|----------|',
181
+ '| 1 | [Truth] | pending | |',
182
+ '',
183
+ '## Required Artifacts',
184
+ '| Artifact | Expected | Status | Details |',
185
+ '|----------|----------|--------|---------|',
186
+ '| [path] | [what] | pending | |',
187
+ '',
188
+ '## Key Link Verification',
189
+ '| From | To | Via | Status | Details |',
190
+ '|------|----|----|--------|---------|',
191
+ '| [source] | [target] | [connection] | pending | |',
192
+ '',
193
+ '## Requirements Coverage',
194
+ '| Requirement | Status | Blocking Issue |',
195
+ '|-------------|--------|----------------|',
196
+ '| [req] | pending | |',
197
+ '',
198
+ '## Result',
199
+ '[Pending verification]',
200
+ ].join('\n');
201
+ fileName = `${padded}-VERIFICATION.md`;
202
+ break;
203
+ }
204
+ default:
205
+ error(`Unknown template type: ${templateType}. Available: summary, plan, verification`);
206
+ return;
207
+ }
208
+
209
+ const fullContent = `---\n${reconstructFrontmatter(frontmatter)}\n---\n\n${body}\n`;
210
+ const outPath = path.join(cwd, phaseInfo.directory, fileName);
211
+
212
+ if (fs.existsSync(outPath)) {
213
+ output({ error: 'File already exists', path: toPosixPath(path.relative(cwd, outPath)) }, raw);
214
+ return;
215
+ }
216
+
217
+ fs.writeFileSync(outPath, normalizeMd(fullContent), 'utf-8');
218
+ const relPath = toPosixPath(path.relative(cwd, outPath));
219
+ output({ created: true, path: relPath, template: templateType }, raw, relPath);
220
+ }
221
+
222
+ module.exports = { cmdTemplateSelect, cmdTemplateFill };
@@ -0,0 +1,189 @@
1
+ /**
2
+ * UAT Audit — Cross-phase UAT/VERIFICATION scanner
3
+ *
4
+ * Reads all *-UAT.md and *-VERIFICATION.md files across all phases.
5
+ * Extracts non-passing items. Returns structured JSON for workflow consumption.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const { output, error, getMilestonePhaseFilter, planningDir, toPosixPath } = require('./core.cjs');
11
+ const { extractFrontmatter } = require('./frontmatter.cjs');
12
+
13
+ function cmdAuditUat(cwd, raw) {
14
+ const phasesDir = path.join(planningDir(cwd), 'phases');
15
+ if (!fs.existsSync(phasesDir)) {
16
+ error('No phases directory found in planning directory');
17
+ }
18
+
19
+ const isDirInMilestone = getMilestonePhaseFilter(cwd);
20
+ const results = [];
21
+
22
+ // Scan all phase directories
23
+ const dirs = fs.readdirSync(phasesDir, { withFileTypes: true })
24
+ .filter(e => e.isDirectory())
25
+ .map(e => e.name)
26
+ .filter(isDirInMilestone)
27
+ .sort();
28
+
29
+ for (const dir of dirs) {
30
+ const phaseMatch = dir.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);
31
+ const phaseNum = phaseMatch ? phaseMatch[1] : dir;
32
+ const phaseDir = path.join(phasesDir, dir);
33
+ const files = fs.readdirSync(phaseDir);
34
+
35
+ // Process UAT files
36
+ for (const file of files.filter(f => f.includes('-UAT') && f.endsWith('.md'))) {
37
+ const content = fs.readFileSync(path.join(phaseDir, file), 'utf-8');
38
+ const items = parseUatItems(content);
39
+ if (items.length > 0) {
40
+ results.push({
41
+ phase: phaseNum,
42
+ phase_dir: dir,
43
+ file,
44
+ file_path: toPosixPath(path.relative(cwd, path.join(phaseDir, file))),
45
+ type: 'uat',
46
+ status: (extractFrontmatter(content).status || 'unknown'),
47
+ items,
48
+ });
49
+ }
50
+ }
51
+
52
+ // Process VERIFICATION files
53
+ for (const file of files.filter(f => f.includes('-VERIFICATION') && f.endsWith('.md'))) {
54
+ const content = fs.readFileSync(path.join(phaseDir, file), 'utf-8');
55
+ const status = extractFrontmatter(content).status || 'unknown';
56
+ if (status === 'human_needed' || status === 'gaps_found') {
57
+ const items = parseVerificationItems(content, status);
58
+ if (items.length > 0) {
59
+ results.push({
60
+ phase: phaseNum,
61
+ phase_dir: dir,
62
+ file,
63
+ file_path: toPosixPath(path.relative(cwd, path.join(phaseDir, file))),
64
+ type: 'verification',
65
+ status,
66
+ items,
67
+ });
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ // Compute summary
74
+ const summary = {
75
+ total_files: results.length,
76
+ total_items: results.reduce((sum, r) => sum + r.items.length, 0),
77
+ by_category: {},
78
+ by_phase: {},
79
+ };
80
+
81
+ for (const r of results) {
82
+ if (!summary.by_phase[r.phase]) summary.by_phase[r.phase] = 0;
83
+ for (const item of r.items) {
84
+ summary.by_phase[r.phase]++;
85
+ const cat = item.category || 'unknown';
86
+ summary.by_category[cat] = (summary.by_category[cat] || 0) + 1;
87
+ }
88
+ }
89
+
90
+ output({ results, summary }, raw);
91
+ }
92
+
93
+ function parseUatItems(content) {
94
+ const items = [];
95
+ // Match test blocks: ### N. Name\nexpected: ...\nresult: ...\n
96
+ const testPattern = /###\s*(\d+)\.\s*([^\n]+)\nexpected:\s*([^\n]+)\nresult:\s*(\w+)(?:\n(?:reported|reason|blocked_by):\s*[^\n]*)?/g;
97
+ let match;
98
+ while ((match = testPattern.exec(content)) !== null) {
99
+ const [, num, name, expected, result] = match;
100
+ if (result === 'pending' || result === 'skipped' || result === 'blocked') {
101
+ // Extract optional fields — limit to current test block (up to next ### or EOF)
102
+ const afterMatch = content.slice(match.index);
103
+ const nextHeading = afterMatch.indexOf('\n###', 1);
104
+ const blockText = nextHeading > 0 ? afterMatch.slice(0, nextHeading) : afterMatch;
105
+ const reasonMatch = blockText.match(/reason:\s*(.+)/);
106
+ const blockedByMatch = blockText.match(/blocked_by:\s*(.+)/);
107
+
108
+ const item = {
109
+ test: parseInt(num, 10),
110
+ name: name.trim(),
111
+ expected: expected.trim(),
112
+ result,
113
+ category: categorizeItem(result, reasonMatch?.[1], blockedByMatch?.[1]),
114
+ };
115
+ if (reasonMatch) item.reason = reasonMatch[1].trim();
116
+ if (blockedByMatch) item.blocked_by = blockedByMatch[1].trim();
117
+ items.push(item);
118
+ }
119
+ }
120
+ return items;
121
+ }
122
+
123
+ function parseVerificationItems(content, status) {
124
+ const items = [];
125
+ if (status === 'human_needed') {
126
+ // Extract from human_verification section — look for numbered items or table rows
127
+ const hvSection = content.match(/##\s*Human Verification.*?\n([\s\S]*?)(?=\n##\s|\n---\s|$)/i);
128
+ if (hvSection) {
129
+ const lines = hvSection[1].split('\n');
130
+ for (const line of lines) {
131
+ // Match table rows: | N | description | ... |
132
+ const tableMatch = line.match(/\|\s*(\d+)\s*\|\s*([^|]+)/);
133
+ // Match bullet items: - description
134
+ const bulletMatch = line.match(/^[-*]\s+(.+)/);
135
+ // Match numbered items: 1. description
136
+ const numberedMatch = line.match(/^(\d+)\.\s+(.+)/);
137
+
138
+ if (tableMatch) {
139
+ items.push({
140
+ test: parseInt(tableMatch[1], 10),
141
+ name: tableMatch[2].trim(),
142
+ result: 'human_needed',
143
+ category: 'human_uat',
144
+ });
145
+ } else if (numberedMatch) {
146
+ items.push({
147
+ test: parseInt(numberedMatch[1], 10),
148
+ name: numberedMatch[2].trim(),
149
+ result: 'human_needed',
150
+ category: 'human_uat',
151
+ });
152
+ } else if (bulletMatch && bulletMatch[1].length > 10) {
153
+ items.push({
154
+ name: bulletMatch[1].trim(),
155
+ result: 'human_needed',
156
+ category: 'human_uat',
157
+ });
158
+ }
159
+ }
160
+ }
161
+ }
162
+ // gaps_found items are already handled by plan-phase --gaps pipeline
163
+ return items;
164
+ }
165
+
166
+ function categorizeItem(result, reason, blockedBy) {
167
+ if (result === 'blocked' || blockedBy) {
168
+ if (blockedBy) {
169
+ if (/server/i.test(blockedBy)) return 'server_blocked';
170
+ if (/device|physical/i.test(blockedBy)) return 'device_needed';
171
+ if (/build|release|preview/i.test(blockedBy)) return 'build_needed';
172
+ if (/third.party|twilio|stripe/i.test(blockedBy)) return 'third_party';
173
+ }
174
+ return 'blocked';
175
+ }
176
+ if (result === 'skipped') {
177
+ if (reason) {
178
+ if (/server|not running|not available/i.test(reason)) return 'server_blocked';
179
+ if (/simulator|physical|device/i.test(reason)) return 'device_needed';
180
+ if (/build|release|preview/i.test(reason)) return 'build_needed';
181
+ }
182
+ return 'skipped_unresolved';
183
+ }
184
+ if (result === 'pending') return 'pending';
185
+ if (result === 'human_needed') return 'human_uat';
186
+ return 'unknown';
187
+ }
188
+
189
+ module.exports = { cmdAuditUat };