forgecraft-mcp 1.4.0 → 1.7.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 (418) hide show
  1. package/LICENSE +67 -0
  2. package/README.md +527 -525
  3. package/dist/analyzers/anchors/anchor-loader.d.ts +47 -0
  4. package/dist/analyzers/anchors/anchor-loader.d.ts.map +1 -0
  5. package/dist/analyzers/anchors/anchor-loader.js +113 -0
  6. package/dist/analyzers/anchors/anchor-loader.js.map +1 -0
  7. package/dist/analyzers/anti-pattern.d.ts.map +1 -1
  8. package/dist/analyzers/anti-pattern.js +38 -26
  9. package/dist/analyzers/anti-pattern.js.map +1 -1
  10. package/dist/analyzers/completeness-helpers.d.ts +5 -0
  11. package/dist/analyzers/completeness-helpers.d.ts.map +1 -1
  12. package/dist/analyzers/completeness-helpers.js +17 -0
  13. package/dist/analyzers/completeness-helpers.js.map +1 -1
  14. package/dist/analyzers/completeness.d.ts.map +1 -1
  15. package/dist/analyzers/completeness.js +4 -4
  16. package/dist/analyzers/completeness.js.map +1 -1
  17. package/dist/analyzers/gs-scorer.d.ts +3 -1
  18. package/dist/analyzers/gs-scorer.d.ts.map +1 -1
  19. package/dist/analyzers/gs-scorer.js +5 -2
  20. package/dist/analyzers/gs-scorer.js.map +1 -1
  21. package/dist/analyzers/package-json.d.ts.map +1 -1
  22. package/dist/analyzers/package-json.js +194 -34
  23. package/dist/analyzers/package-json.js.map +1 -1
  24. package/dist/analyzers/scorers/composable-scorer.d.ts +4 -2
  25. package/dist/analyzers/scorers/composable-scorer.d.ts.map +1 -1
  26. package/dist/analyzers/scorers/composable-scorer.js +50 -2
  27. package/dist/analyzers/scorers/composable-scorer.js.map +1 -1
  28. package/dist/analyzers/scorers/executable-scorer.d.ts +3 -2
  29. package/dist/analyzers/scorers/executable-scorer.d.ts.map +1 -1
  30. package/dist/analyzers/scorers/executable-scorer.js +64 -4
  31. package/dist/analyzers/scorers/executable-scorer.js.map +1 -1
  32. package/dist/analyzers/scorers/scorer-utils.d.ts +5 -3
  33. package/dist/analyzers/scorers/scorer-utils.d.ts.map +1 -1
  34. package/dist/analyzers/scorers/scorer-utils.js +34 -9
  35. package/dist/analyzers/scorers/scorer-utils.js.map +1 -1
  36. package/dist/analyzers/scorers/self-describing-scorer.d.ts +7 -4
  37. package/dist/analyzers/scorers/self-describing-scorer.d.ts.map +1 -1
  38. package/dist/analyzers/scorers/self-describing-scorer.js +17 -18
  39. package/dist/analyzers/scorers/self-describing-scorer.js.map +1 -1
  40. package/dist/cli/help.js +51 -51
  41. package/dist/disciplines/catalog.d.ts +16 -0
  42. package/dist/disciplines/catalog.d.ts.map +1 -0
  43. package/dist/disciplines/catalog.js +196 -0
  44. package/dist/disciplines/catalog.js.map +1 -0
  45. package/dist/disciplines/runner.d.ts +13 -0
  46. package/dist/disciplines/runner.d.ts.map +1 -0
  47. package/dist/disciplines/runner.js +35 -0
  48. package/dist/disciplines/runner.js.map +1 -0
  49. package/dist/registry/composer.d.ts.map +1 -1
  50. package/dist/registry/composer.js +9 -4
  51. package/dist/registry/composer.js.map +1 -1
  52. package/dist/registry/loader-tag.d.ts.map +1 -1
  53. package/dist/registry/loader-tag.js +1 -0
  54. package/dist/registry/loader-tag.js.map +1 -1
  55. package/dist/registry/remote-gates.js +1 -1
  56. package/dist/registry/remote-gates.js.map +1 -1
  57. package/dist/registry/renderer-skeletons.js +92 -92
  58. package/dist/registry/sentinel-renderer.js +299 -20
  59. package/dist/registry/sentinel-renderer.js.map +1 -1
  60. package/dist/sentinel/detect.d.ts +41 -0
  61. package/dist/sentinel/detect.d.ts.map +1 -0
  62. package/dist/sentinel/detect.js +122 -0
  63. package/dist/sentinel/detect.js.map +1 -0
  64. package/dist/sentinel/write.d.ts +54 -0
  65. package/dist/sentinel/write.d.ts.map +1 -0
  66. package/dist/sentinel/write.js +75 -0
  67. package/dist/sentinel/write.js.map +1 -0
  68. package/dist/shared/cnt-health.d.ts +16 -0
  69. package/dist/shared/cnt-health.d.ts.map +1 -1
  70. package/dist/shared/cnt-health.js +55 -8
  71. package/dist/shared/cnt-health.js.map +1 -1
  72. package/dist/shared/config.d.ts +14 -0
  73. package/dist/shared/config.d.ts.map +1 -1
  74. package/dist/shared/config.js +45 -0
  75. package/dist/shared/config.js.map +1 -1
  76. package/dist/shared/gs-score-logger.js +6 -6
  77. package/dist/shared/hook-installer.d.ts +58 -0
  78. package/dist/shared/hook-installer.d.ts.map +1 -0
  79. package/dist/shared/hook-installer.js +316 -0
  80. package/dist/shared/hook-installer.js.map +1 -0
  81. package/dist/shared/project-gates-helpers.d.ts +9 -0
  82. package/dist/shared/project-gates-helpers.d.ts.map +1 -1
  83. package/dist/shared/project-gates-helpers.js +35 -0
  84. package/dist/shared/project-gates-helpers.js.map +1 -1
  85. package/dist/shared/types/config.d.ts +7 -1
  86. package/dist/shared/types/config.d.ts.map +1 -1
  87. package/dist/shared/types/gates.d.ts +34 -0
  88. package/dist/shared/types/gates.d.ts.map +1 -1
  89. package/dist/shared/types/project.d.ts +68 -2
  90. package/dist/shared/types/project.d.ts.map +1 -1
  91. package/dist/shared/types/project.js +1 -0
  92. package/dist/shared/types/project.js.map +1 -1
  93. package/dist/shared/types/templates.d.ts +8 -1
  94. package/dist/shared/types/templates.d.ts.map +1 -1
  95. package/dist/shared/types/verify.d.ts +51 -1
  96. package/dist/shared/types/verify.d.ts.map +1 -1
  97. package/dist/shared/types/verify.js +37 -1
  98. package/dist/shared/types/verify.js.map +1 -1
  99. package/dist/tools/add-hook.d.ts.map +1 -1
  100. package/dist/tools/add-hook.js +8 -1
  101. package/dist/tools/add-hook.js.map +1 -1
  102. package/dist/tools/add-module.js +123 -123
  103. package/dist/tools/advice-registry.d.ts.map +1 -1
  104. package/dist/tools/advice-registry.js +108 -18
  105. package/dist/tools/advice-registry.js.map +1 -1
  106. package/dist/tools/advise-session-advisor.d.ts +16 -0
  107. package/dist/tools/advise-session-advisor.d.ts.map +1 -0
  108. package/dist/tools/advise-session-advisor.js +89 -0
  109. package/dist/tools/advise-session-advisor.js.map +1 -0
  110. package/dist/tools/advise-session-signals.d.ts +21 -0
  111. package/dist/tools/advise-session-signals.d.ts.map +1 -0
  112. package/dist/tools/advise-session-signals.js +113 -0
  113. package/dist/tools/advise-session-signals.js.map +1 -0
  114. package/dist/tools/advise-session.d.ts +22 -0
  115. package/dist/tools/advise-session.d.ts.map +1 -0
  116. package/dist/tools/advise-session.js +31 -0
  117. package/dist/tools/advise-session.js.map +1 -0
  118. package/dist/tools/analyze-harness.d.ts +18 -0
  119. package/dist/tools/analyze-harness.d.ts.map +1 -0
  120. package/dist/tools/analyze-harness.js +298 -0
  121. package/dist/tools/analyze-harness.js.map +1 -0
  122. package/dist/tools/audit.d.ts.map +1 -1
  123. package/dist/tools/audit.js +19 -0
  124. package/dist/tools/audit.js.map +1 -1
  125. package/dist/tools/change-request.d.ts +53 -0
  126. package/dist/tools/change-request.d.ts.map +1 -0
  127. package/dist/tools/change-request.js +395 -0
  128. package/dist/tools/change-request.js.map +1 -0
  129. package/dist/tools/check-cascade-contracts.d.ts +13 -0
  130. package/dist/tools/check-cascade-contracts.d.ts.map +1 -1
  131. package/dist/tools/check-cascade-contracts.js +73 -2
  132. package/dist/tools/check-cascade-contracts.js.map +1 -1
  133. package/dist/tools/check-cascade-report.js +64 -64
  134. package/dist/tools/check-cascade-steps.d.ts +3 -0
  135. package/dist/tools/check-cascade-steps.d.ts.map +1 -1
  136. package/dist/tools/check-cascade-steps.js +104 -15
  137. package/dist/tools/check-cascade-steps.js.map +1 -1
  138. package/dist/tools/check-cascade.d.ts +4 -3
  139. package/dist/tools/check-cascade.d.ts.map +1 -1
  140. package/dist/tools/check-cascade.js +30 -12
  141. package/dist/tools/check-cascade.js.map +1 -1
  142. package/dist/tools/check-derivation-chain.d.ts +37 -0
  143. package/dist/tools/check-derivation-chain.d.ts.map +1 -0
  144. package/dist/tools/check-derivation-chain.js +418 -0
  145. package/dist/tools/check-derivation-chain.js.map +1 -0
  146. package/dist/tools/check-spec-consistency.d.ts +25 -0
  147. package/dist/tools/check-spec-consistency.d.ts.map +1 -0
  148. package/dist/tools/check-spec-consistency.js +339 -0
  149. package/dist/tools/check-spec-consistency.js.map +1 -0
  150. package/dist/tools/check-t4.d.ts +54 -0
  151. package/dist/tools/check-t4.d.ts.map +1 -0
  152. package/dist/tools/check-t4.js +305 -0
  153. package/dist/tools/check-t4.js.map +1 -0
  154. package/dist/tools/close-cycle.d.ts +11 -0
  155. package/dist/tools/close-cycle.d.ts.map +1 -1
  156. package/dist/tools/close-cycle.js +364 -4
  157. package/dist/tools/close-cycle.js.map +1 -1
  158. package/dist/tools/cnt-add-routing.d.ts +31 -0
  159. package/dist/tools/cnt-add-routing.d.ts.map +1 -0
  160. package/dist/tools/cnt-add-routing.js +99 -0
  161. package/dist/tools/cnt-add-routing.js.map +1 -0
  162. package/dist/tools/configure-mcp.d.ts.map +1 -1
  163. package/dist/tools/configure-mcp.js +52 -2
  164. package/dist/tools/configure-mcp.js.map +1 -1
  165. package/dist/tools/consolidate-status.d.ts +31 -0
  166. package/dist/tools/consolidate-status.d.ts.map +1 -1
  167. package/dist/tools/consolidate-status.js +105 -0
  168. package/dist/tools/consolidate-status.js.map +1 -1
  169. package/dist/tools/executable-gates.d.ts +52 -0
  170. package/dist/tools/executable-gates.d.ts.map +1 -0
  171. package/dist/tools/executable-gates.js +333 -0
  172. package/dist/tools/executable-gates.js.map +1 -0
  173. package/dist/tools/extract-adrs-from-spec.d.ts +33 -0
  174. package/dist/tools/extract-adrs-from-spec.d.ts.map +1 -0
  175. package/dist/tools/extract-adrs-from-spec.js +410 -0
  176. package/dist/tools/extract-adrs-from-spec.js.map +1 -0
  177. package/dist/tools/extract-adrs-history.d.ts +47 -0
  178. package/dist/tools/extract-adrs-history.d.ts.map +1 -0
  179. package/dist/tools/extract-adrs-history.js +265 -0
  180. package/dist/tools/extract-adrs-history.js.map +1 -0
  181. package/dist/tools/forgecraft-dispatch-extended.d.ts.map +1 -1
  182. package/dist/tools/forgecraft-dispatch-extended.js +137 -0
  183. package/dist/tools/forgecraft-dispatch-extended.js.map +1 -1
  184. package/dist/tools/forgecraft-dispatch.d.ts.map +1 -1
  185. package/dist/tools/forgecraft-dispatch.js +16 -0
  186. package/dist/tools/forgecraft-dispatch.js.map +1 -1
  187. package/dist/tools/forgecraft-schema-params.d.ts +174 -2
  188. package/dist/tools/forgecraft-schema-params.d.ts.map +1 -1
  189. package/dist/tools/forgecraft-schema-params.js +197 -0
  190. package/dist/tools/forgecraft-schema-params.js.map +1 -1
  191. package/dist/tools/forgecraft-schema.d.ts +179 -7
  192. package/dist/tools/forgecraft-schema.d.ts.map +1 -1
  193. package/dist/tools/forgecraft-schema.js +37 -0
  194. package/dist/tools/forgecraft-schema.js.map +1 -1
  195. package/dist/tools/generate-adr.js +6 -6
  196. package/dist/tools/generate-adr.js.map +1 -1
  197. package/dist/tools/generate-decision.d.ts +77 -0
  198. package/dist/tools/generate-decision.d.ts.map +1 -0
  199. package/dist/tools/generate-decision.js +162 -0
  200. package/dist/tools/generate-decision.js.map +1 -0
  201. package/dist/tools/generate-env-probe.d.ts +49 -0
  202. package/dist/tools/generate-env-probe.d.ts.map +1 -0
  203. package/dist/tools/generate-env-probe.js +365 -0
  204. package/dist/tools/generate-env-probe.js.map +1 -0
  205. package/dist/tools/generate-harness.d.ts +53 -0
  206. package/dist/tools/generate-harness.d.ts.map +1 -0
  207. package/dist/tools/generate-harness.js +395 -0
  208. package/dist/tools/generate-harness.js.map +1 -0
  209. package/dist/tools/generate-roadmap.d.ts +1 -1
  210. package/dist/tools/generate-roadmap.d.ts.map +1 -1
  211. package/dist/tools/generate-roadmap.js +38 -4
  212. package/dist/tools/generate-roadmap.js.map +1 -1
  213. package/dist/tools/generate-session-prompt.d.ts +3 -3
  214. package/dist/tools/generate-session-prompt.d.ts.map +1 -1
  215. package/dist/tools/generate-session-prompt.js +9 -1
  216. package/dist/tools/generate-session-prompt.js.map +1 -1
  217. package/dist/tools/generate-slo-probe.d.ts +53 -0
  218. package/dist/tools/generate-slo-probe.d.ts.map +1 -0
  219. package/dist/tools/generate-slo-probe.js +366 -0
  220. package/dist/tools/generate-slo-probe.js.map +1 -0
  221. package/dist/tools/layer-status-gates.d.ts +24 -0
  222. package/dist/tools/layer-status-gates.d.ts.map +1 -0
  223. package/dist/tools/layer-status-gates.js +151 -0
  224. package/dist/tools/layer-status-gates.js.map +1 -0
  225. package/dist/tools/layer-status.d.ts +126 -0
  226. package/dist/tools/layer-status.d.ts.map +1 -0
  227. package/dist/tools/layer-status.js +647 -0
  228. package/dist/tools/layer-status.js.map +1 -0
  229. package/dist/tools/list.d.ts.map +1 -1
  230. package/dist/tools/list.js +9 -5
  231. package/dist/tools/list.js.map +1 -1
  232. package/dist/tools/postcondition-coverage.d.ts +57 -0
  233. package/dist/tools/postcondition-coverage.d.ts.map +1 -0
  234. package/dist/tools/postcondition-coverage.js +256 -0
  235. package/dist/tools/postcondition-coverage.js.map +1 -0
  236. package/dist/tools/probe-runners.d.ts +21 -0
  237. package/dist/tools/probe-runners.d.ts.map +1 -0
  238. package/dist/tools/probe-runners.js +246 -0
  239. package/dist/tools/probe-runners.js.map +1 -0
  240. package/dist/tools/probe-templates.d.ts +27 -0
  241. package/dist/tools/probe-templates.d.ts.map +1 -0
  242. package/dist/tools/probe-templates.js +279 -0
  243. package/dist/tools/probe-templates.js.map +1 -0
  244. package/dist/tools/propose-session.d.ts +28 -0
  245. package/dist/tools/propose-session.d.ts.map +1 -0
  246. package/dist/tools/propose-session.js +333 -0
  247. package/dist/tools/propose-session.js.map +1 -0
  248. package/dist/tools/refresh-output.js +14 -14
  249. package/dist/tools/review-stubs.d.ts +29 -0
  250. package/dist/tools/review-stubs.d.ts.map +1 -0
  251. package/dist/tools/review-stubs.js +173 -0
  252. package/dist/tools/review-stubs.js.map +1 -0
  253. package/dist/tools/roadmap-builder.d.ts +49 -1
  254. package/dist/tools/roadmap-builder.d.ts.map +1 -1
  255. package/dist/tools/roadmap-builder.js +210 -5
  256. package/dist/tools/roadmap-builder.js.map +1 -1
  257. package/dist/tools/run-env-probe.d.ts +57 -0
  258. package/dist/tools/run-env-probe.d.ts.map +1 -0
  259. package/dist/tools/run-env-probe.js +270 -0
  260. package/dist/tools/run-env-probe.js.map +1 -0
  261. package/dist/tools/run-harness.d.ts +52 -0
  262. package/dist/tools/run-harness.d.ts.map +1 -0
  263. package/dist/tools/run-harness.js +279 -0
  264. package/dist/tools/run-harness.js.map +1 -0
  265. package/dist/tools/run-slo-probe.d.ts +50 -0
  266. package/dist/tools/run-slo-probe.d.ts.map +1 -0
  267. package/dist/tools/run-slo-probe.js +281 -0
  268. package/dist/tools/run-slo-probe.js.map +1 -0
  269. package/dist/tools/scaffold-spec-stubs.js +115 -115
  270. package/dist/tools/scaffold-templates.js +62 -62
  271. package/dist/tools/scaffold-writer.d.ts.map +1 -1
  272. package/dist/tools/scaffold-writer.js +9 -0
  273. package/dist/tools/scaffold-writer.js.map +1 -1
  274. package/dist/tools/score-rubric.d.ts +19 -0
  275. package/dist/tools/score-rubric.d.ts.map +1 -0
  276. package/dist/tools/score-rubric.js +411 -0
  277. package/dist/tools/score-rubric.js.map +1 -0
  278. package/dist/tools/session-prompt-builders.d.ts +20 -0
  279. package/dist/tools/session-prompt-builders.d.ts.map +1 -1
  280. package/dist/tools/session-prompt-builders.js +78 -5
  281. package/dist/tools/session-prompt-builders.js.map +1 -1
  282. package/dist/tools/session-prompt-sections.d.ts +4 -2
  283. package/dist/tools/session-prompt-sections.d.ts.map +1 -1
  284. package/dist/tools/session-prompt-sections.js +22 -10
  285. package/dist/tools/session-prompt-sections.js.map +1 -1
  286. package/dist/tools/setup-artifact-writers.d.ts +69 -4
  287. package/dist/tools/setup-artifact-writers.d.ts.map +1 -1
  288. package/dist/tools/setup-artifact-writers.js +681 -5
  289. package/dist/tools/setup-artifact-writers.js.map +1 -1
  290. package/dist/tools/setup-cnt-builders.d.ts.map +1 -1
  291. package/dist/tools/setup-cnt-builders.js +162 -34
  292. package/dist/tools/setup-cnt-builders.js.map +1 -1
  293. package/dist/tools/setup-monitoring.d.ts +41 -0
  294. package/dist/tools/setup-monitoring.d.ts.map +1 -0
  295. package/dist/tools/setup-monitoring.js +364 -0
  296. package/dist/tools/setup-monitoring.js.map +1 -0
  297. package/dist/tools/setup-phase1.d.ts.map +1 -1
  298. package/dist/tools/setup-phase1.js +14 -1
  299. package/dist/tools/setup-phase1.js.map +1 -1
  300. package/dist/tools/setup-phase2.d.ts +14 -0
  301. package/dist/tools/setup-phase2.d.ts.map +1 -1
  302. package/dist/tools/setup-phase2.js +130 -3
  303. package/dist/tools/setup-phase2.js.map +1 -1
  304. package/dist/tools/setup-project.d.ts +8 -0
  305. package/dist/tools/setup-project.d.ts.map +1 -1
  306. package/dist/tools/setup-project.js +52 -2
  307. package/dist/tools/setup-project.js.map +1 -1
  308. package/dist/tools/spec-parser-tags.d.ts.map +1 -1
  309. package/dist/tools/spec-parser-tags.js +1 -0
  310. package/dist/tools/spec-parser-tags.js.map +1 -1
  311. package/dist/tools/verify-formatter.d.ts.map +1 -1
  312. package/dist/tools/verify-formatter.js +15 -1
  313. package/dist/tools/verify-formatter.js.map +1 -1
  314. package/dist/tools/verify.d.ts.map +1 -1
  315. package/dist/tools/verify.js +3 -0
  316. package/dist/tools/verify.js.map +1 -1
  317. package/package.json +98 -89
  318. package/templates/analytics/instructions.yaml +37 -37
  319. package/templates/analytics/mcp-servers.yaml +11 -11
  320. package/templates/analytics/structure.yaml +25 -25
  321. package/templates/api/harness/uc-template.hurl +20 -0
  322. package/templates/api/instructions.yaml +231 -231
  323. package/templates/api/mcp-servers.yaml +22 -22
  324. package/templates/api/nfr.yaml +23 -23
  325. package/templates/api/review.yaml +103 -103
  326. package/templates/api/structure.yaml +34 -34
  327. package/templates/api/verification.yaml +132 -132
  328. package/templates/cli/instructions.yaml +31 -31
  329. package/templates/cli/mcp-servers.yaml +11 -11
  330. package/templates/cli/review.yaml +53 -53
  331. package/templates/cli/structure.yaml +16 -16
  332. package/templates/data-lineage/instructions.yaml +28 -28
  333. package/templates/data-lineage/mcp-servers.yaml +22 -22
  334. package/templates/data-pipeline/instructions.yaml +84 -84
  335. package/templates/data-pipeline/mcp-servers.yaml +13 -13
  336. package/templates/data-pipeline/nfr.yaml +39 -39
  337. package/templates/data-pipeline/structure.yaml +23 -23
  338. package/templates/docs-manifest.yaml +227 -0
  339. package/templates/fintech/hooks.yaml +55 -55
  340. package/templates/fintech/instructions.yaml +112 -112
  341. package/templates/fintech/mcp-servers.yaml +13 -13
  342. package/templates/fintech/nfr.yaml +46 -46
  343. package/templates/fintech/playbook.yaml +210 -210
  344. package/templates/fintech/verification.yaml +239 -239
  345. package/templates/game/harness/uc-template.sim.ts +29 -0
  346. package/templates/game/instructions.yaml +289 -289
  347. package/templates/game/mcp-servers.yaml +38 -38
  348. package/templates/game/nfr.yaml +64 -64
  349. package/templates/game/playbook.yaml +214 -214
  350. package/templates/game/review.yaml +97 -97
  351. package/templates/game/structure.yaml +67 -67
  352. package/templates/game/verification.yaml +174 -174
  353. package/templates/healthcare/instructions.yaml +42 -42
  354. package/templates/healthcare/mcp-servers.yaml +13 -13
  355. package/templates/healthcare/nfr.yaml +47 -47
  356. package/templates/hipaa/instructions.yaml +41 -41
  357. package/templates/hipaa/mcp-servers.yaml +13 -13
  358. package/templates/infra/instructions.yaml +104 -104
  359. package/templates/infra/mcp-servers.yaml +20 -20
  360. package/templates/infra/nfr.yaml +46 -46
  361. package/templates/infra/review.yaml +65 -65
  362. package/templates/infra/structure.yaml +25 -25
  363. package/templates/library/instructions.yaml +36 -36
  364. package/templates/library/mcp-servers.yaml +20 -20
  365. package/templates/library/review.yaml +56 -56
  366. package/templates/library/structure.yaml +19 -19
  367. package/templates/medallion-architecture/instructions.yaml +41 -41
  368. package/templates/medallion-architecture/mcp-servers.yaml +22 -22
  369. package/templates/ml/instructions.yaml +85 -85
  370. package/templates/ml/mcp-servers.yaml +11 -11
  371. package/templates/ml/nfr.yaml +39 -39
  372. package/templates/ml/structure.yaml +25 -25
  373. package/templates/ml/verification.yaml +156 -156
  374. package/templates/mobile/instructions.yaml +44 -44
  375. package/templates/mobile/mcp-servers.yaml +11 -11
  376. package/templates/mobile/nfr.yaml +49 -49
  377. package/templates/mobile/structure.yaml +27 -27
  378. package/templates/mobile/verification.yaml +121 -121
  379. package/templates/observability-xray/instructions.yaml +40 -40
  380. package/templates/observability-xray/mcp-servers.yaml +15 -15
  381. package/templates/realtime/instructions.yaml +42 -42
  382. package/templates/realtime/mcp-servers.yaml +13 -13
  383. package/templates/soc2/instructions.yaml +41 -41
  384. package/templates/soc2/mcp-servers.yaml +24 -24
  385. package/templates/social/instructions.yaml +43 -43
  386. package/templates/social/mcp-servers.yaml +24 -24
  387. package/templates/state-machine/instructions.yaml +42 -42
  388. package/templates/state-machine/mcp-servers.yaml +11 -11
  389. package/templates/tools-registry.yaml +164 -164
  390. package/templates/universal/claude-md-blocks/layer-navigation.md +20 -0
  391. package/templates/universal/claude-md-blocks/nfr-contracts.md +22 -0
  392. package/templates/universal/hooks.yaml +879 -723
  393. package/templates/universal/instructions.yaml +1692 -1692
  394. package/templates/universal/mcp-servers.yaml +50 -50
  395. package/templates/universal/nfr.yaml +197 -197
  396. package/templates/universal/reference.yaml +326 -326
  397. package/templates/universal/review.yaml +204 -204
  398. package/templates/universal/skills.yaml +262 -262
  399. package/templates/universal/structure.yaml +67 -67
  400. package/templates/universal/verification.yaml +416 -416
  401. package/templates/web-next/hooks.yaml +114 -0
  402. package/templates/web-next/instructions.yaml +106 -0
  403. package/templates/web-react/harness/uc-template.spec.ts +35 -0
  404. package/templates/web-react/hooks.yaml +156 -44
  405. package/templates/web-react/instructions.yaml +296 -207
  406. package/templates/web-react/mcp-servers.yaml +20 -20
  407. package/templates/web-react/nfr.yaml +27 -27
  408. package/templates/web-react/review.yaml +94 -94
  409. package/templates/web-react/structure.yaml +46 -46
  410. package/templates/web-react/verification.yaml +126 -126
  411. package/templates/web-static/hooks.yaml +85 -0
  412. package/templates/web-static/instructions.yaml +204 -115
  413. package/templates/web-static/mcp-servers.yaml +20 -20
  414. package/templates/web3/instructions.yaml +44 -44
  415. package/templates/web3/mcp-servers.yaml +11 -11
  416. package/templates/web3/verification.yaml +159 -159
  417. package/templates/zero-trust/instructions.yaml +41 -41
  418. package/templates/zero-trust/mcp-servers.yaml +15 -15
@@ -0,0 +1,50 @@
1
+ /**
2
+ * run_slo_probe tool handler.
3
+ *
4
+ * Scans tests/slo/ for probe files, executes each (.sh via bash, .k6.js via k6),
5
+ * reports PASS/FAIL/TOOL_MISSING/NOT_IMPLEMENTED/NO_PROBE/TIMEOUT/ERROR.
6
+ * Writes .forgecraft/slo-probe-run.json after execution.
7
+ */
8
+ import { z } from "zod";
9
+ import type { ToolResult } from "../shared/types.js";
10
+ import type { ProbeStatus } from "./run-harness.js";
11
+ export declare const runSloProbeSchema: z.ZodObject<{
12
+ project_dir: z.ZodString;
13
+ timeout_ms: z.ZodOptional<z.ZodNumber>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ project_dir: string;
16
+ timeout_ms?: number | undefined;
17
+ }, {
18
+ project_dir: string;
19
+ timeout_ms?: number | undefined;
20
+ }>;
21
+ export type RunSloProbeInput = z.infer<typeof runSloProbeSchema>;
22
+ export interface SloProbeResult {
23
+ service: string;
24
+ probeId: string;
25
+ probeFile: string | null;
26
+ probeType: string;
27
+ status: ProbeStatus;
28
+ durationMs: number;
29
+ output?: string;
30
+ }
31
+ export interface SloProbeRunJson {
32
+ timestamp: string;
33
+ passed: number;
34
+ failed: number;
35
+ errors: number;
36
+ notFound: number;
37
+ results: Array<{
38
+ service: string;
39
+ probeId: string;
40
+ status: string;
41
+ durationMs: number;
42
+ }>;
43
+ }
44
+ export declare function parseSloProbeFileName(fileName: string): {
45
+ service: string;
46
+ probeId: string;
47
+ probeType: string;
48
+ };
49
+ export declare function runSloProbeHandler(args: RunSloProbeInput): Promise<ToolResult>;
50
+ //# sourceMappingURL=run-slo-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-slo-probe.d.ts","sourceRoot":"","sources":["../../src/tools/run-slo-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,eAAO,MAAM,iBAAiB;;;;;;;;;EAM5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIjE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAID,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAiCA;AAuFD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CA8DrB"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * run_slo_probe tool handler.
3
+ *
4
+ * Scans tests/slo/ for probe files, executes each (.sh via bash, .k6.js via k6),
5
+ * reports PASS/FAIL/TOOL_MISSING/NOT_IMPLEMENTED/NO_PROBE/TIMEOUT/ERROR.
6
+ * Writes .forgecraft/slo-probe-run.json after execution.
7
+ */
8
+ import { z } from "zod";
9
+ import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
10
+ import { join, resolve } from "node:path";
11
+ import { spawnSync } from "node:child_process";
12
+ import { isToolAvailable, isNotImplementedOutput, combineOutput, } from "./probe-runners.js";
13
+ // ── Schema ───────────────────────────────────────────────────────────
14
+ export const runSloProbeSchema = z.object({
15
+ project_dir: z.string().describe("Absolute path to the project root."),
16
+ timeout_ms: z
17
+ .number()
18
+ .optional()
19
+ .describe("Timeout per probe in ms. Default: 15000."),
20
+ });
21
+ // ── Probe file parsing ────────────────────────────────────────────────
22
+ export function parseSloProbeFileName(fileName) {
23
+ const typeMap = {
24
+ ".alert.sh": "alert_exists",
25
+ ".metric.sh": "metric_present",
26
+ ".dashboard.sh": "dashboard_exists",
27
+ ".slo.sh": "slo_assertion",
28
+ ".k6.js": "synthetic_load",
29
+ };
30
+ let probeType = "unknown";
31
+ let baseName = fileName;
32
+ for (const [ext, type] of Object.entries(typeMap)) {
33
+ if (fileName.endsWith(ext)) {
34
+ probeType = type;
35
+ baseName = fileName.slice(0, fileName.length - ext.length);
36
+ break;
37
+ }
38
+ }
39
+ if (probeType === "unknown" && fileName.endsWith(".sh")) {
40
+ baseName = fileName.slice(0, -3);
41
+ }
42
+ const probeIdx = baseName.indexOf("-probe-");
43
+ if (probeIdx !== -1) {
44
+ return {
45
+ service: baseName.slice(0, probeIdx),
46
+ probeId: baseName.slice(probeIdx + 1),
47
+ probeType,
48
+ };
49
+ }
50
+ return { service: baseName, probeId: "unknown", probeType };
51
+ }
52
+ // ── Probe execution ───────────────────────────────────────────────────
53
+ function runSloProbeFile(probePath, fileName, timeoutMs) {
54
+ const start = Date.now();
55
+ if (fileName.endsWith(".k6.js")) {
56
+ if (!isToolAvailable("k6")) {
57
+ return {
58
+ status: "tool_missing",
59
+ durationMs: Date.now() - start,
60
+ output: "k6 not found (install: https://k6.io)",
61
+ };
62
+ }
63
+ try {
64
+ const result = spawnSync("k6", ["run", probePath], {
65
+ timeout: timeoutMs,
66
+ stdio: ["pipe", "pipe", "pipe"],
67
+ encoding: "utf-8",
68
+ });
69
+ const durationMs = Date.now() - start;
70
+ const output = combineOutput(result.stdout, result.stderr);
71
+ if (result.error?.message?.includes("ENOENT")) {
72
+ return { status: "tool_missing", durationMs, output: "k6 not found" };
73
+ }
74
+ if (result.signal === "SIGTERM" ||
75
+ result.error?.message?.includes("ETIMEDOUT")) {
76
+ return { status: "timeout", durationMs, output: "timed out" };
77
+ }
78
+ return {
79
+ status: result.status === 0 ? "pass" : "fail",
80
+ durationMs,
81
+ output,
82
+ };
83
+ }
84
+ catch (err) {
85
+ return {
86
+ status: "error",
87
+ durationMs: Date.now() - start,
88
+ output: String(err),
89
+ };
90
+ }
91
+ }
92
+ // All .sh files run via bash
93
+ try {
94
+ const result = spawnSync("bash", [probePath], {
95
+ timeout: timeoutMs,
96
+ stdio: ["pipe", "pipe", "pipe"],
97
+ encoding: "utf-8",
98
+ });
99
+ const durationMs = Date.now() - start;
100
+ const output = combineOutput(result.stdout, result.stderr);
101
+ if (result.error?.message?.includes("ENOENT")) {
102
+ return { status: "tool_missing", durationMs, output: "bash not found" };
103
+ }
104
+ if (result.signal === "SIGTERM" ||
105
+ result.error?.message?.includes("ETIMEDOUT")) {
106
+ return { status: "timeout", durationMs, output: "timed out" };
107
+ }
108
+ if (isNotImplementedOutput(output)) {
109
+ return { status: "not_implemented", durationMs, output };
110
+ }
111
+ return {
112
+ status: result.status === 0 ? "pass" : "fail",
113
+ durationMs,
114
+ output,
115
+ };
116
+ }
117
+ catch (err) {
118
+ return {
119
+ status: "error",
120
+ durationMs: Date.now() - start,
121
+ output: String(err),
122
+ };
123
+ }
124
+ }
125
+ // ── Handler ───────────────────────────────────────────────────────────
126
+ export async function runSloProbeHandler(args) {
127
+ const projectDir = resolve(args.project_dir);
128
+ const timeoutMs = args.timeout_ms ?? 15000;
129
+ const sloDir = join(projectDir, "tests", "slo");
130
+ if (!existsSync(sloDir)) {
131
+ const timestamp = new Date().toISOString();
132
+ writeSloProbeRunJson(projectDir, timestamp, []);
133
+ return {
134
+ content: [
135
+ {
136
+ type: "text",
137
+ text: formatSloRunReport([], timestamp),
138
+ },
139
+ ],
140
+ };
141
+ }
142
+ let probeFiles = [];
143
+ try {
144
+ probeFiles = readdirSync(sloDir).filter((f) => f.endsWith(".sh") || f.endsWith(".k6.js"));
145
+ }
146
+ catch {
147
+ probeFiles = [];
148
+ }
149
+ const results = [];
150
+ if (probeFiles.length === 0) {
151
+ const timestamp = new Date().toISOString();
152
+ writeSloProbeRunJson(projectDir, timestamp, []);
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: formatSloRunReport([], timestamp),
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ for (const fileName of probeFiles) {
163
+ const { service, probeId, probeType } = parseSloProbeFileName(fileName);
164
+ const probePath = join(sloDir, fileName);
165
+ const run = runSloProbeFile(probePath, fileName, timeoutMs);
166
+ results.push({
167
+ service,
168
+ probeId,
169
+ probeFile: fileName,
170
+ probeType,
171
+ ...run,
172
+ });
173
+ }
174
+ const timestamp = new Date().toISOString();
175
+ writeSloProbeRunJson(projectDir, timestamp, results);
176
+ return {
177
+ content: [{ type: "text", text: formatSloRunReport(results, timestamp) }],
178
+ };
179
+ }
180
+ // ── JSON writer ───────────────────────────────────────────────────────
181
+ function writeSloProbeRunJson(projectDir, timestamp, results) {
182
+ try {
183
+ const dir = join(projectDir, ".forgecraft");
184
+ mkdirSync(dir, { recursive: true });
185
+ const runJson = {
186
+ timestamp,
187
+ passed: results.filter((r) => r.status === "pass").length,
188
+ failed: results.filter((r) => r.status === "fail").length,
189
+ errors: results.filter((r) => ["error", "tool_missing", "not_implemented", "timeout"].includes(r.status)).length,
190
+ notFound: results.filter((r) => r.status === "no_probe").length,
191
+ results: results.map((r) => ({
192
+ service: r.service,
193
+ probeId: r.probeId,
194
+ status: r.status,
195
+ durationMs: r.durationMs,
196
+ })),
197
+ };
198
+ writeFileSync(join(dir, "slo-probe-run.json"), JSON.stringify(runJson, null, 2), "utf-8");
199
+ }
200
+ catch {
201
+ /* non-throwing */
202
+ }
203
+ }
204
+ // ── Report formatter ──────────────────────────────────────────────────
205
+ function formatSloRunReport(results, timestamp) {
206
+ if (results.length === 0) {
207
+ return [
208
+ "## SLO Probe Run Report",
209
+ `_Executed: ${timestamp}_`,
210
+ "",
211
+ "No probe files found. Run `generate_slo_probe` first.",
212
+ "",
213
+ buildSloLoopInstructions([]).join("\n"),
214
+ ].join("\n");
215
+ }
216
+ const passed = results.filter((r) => r.status === "pass").length;
217
+ const failed = results.filter((r) => r.status === "fail").length;
218
+ const errors = results.filter((r) => ["error", "tool_missing", "not_implemented", "timeout"].includes(r.status)).length;
219
+ const notFound = results.filter((r) => r.status === "no_probe").length;
220
+ const lines = [
221
+ "## SLO Probe Run Report",
222
+ `_Executed: ${timestamp}_`,
223
+ "",
224
+ `### Results: ${passed} passed / ${failed} failed / ${errors} errors / ${notFound} not found`,
225
+ "",
226
+ "| Service | Probe | Type | File | Status | Duration |",
227
+ "|---|---|---|---|---|---|",
228
+ ];
229
+ for (const r of results) {
230
+ const dur = r.durationMs > 0 ? `${(r.durationMs / 1000).toFixed(1)}s` : "—";
231
+ lines.push(`| ${r.service} | ${r.probeId} | ${r.probeType} | ${r.probeFile ?? "—"} | ${formatSloStatus(r.status)} | ${dur} |`);
232
+ }
233
+ lines.push(...buildSloLoopInstructions(results));
234
+ return lines.join("\n");
235
+ }
236
+ function buildSloLoopInstructions(results) {
237
+ const lines = [
238
+ "",
239
+ "### The Loop",
240
+ "",
241
+ "**SLO probe failures mean monitoring contracts are not verified — regenerate from NFR contracts, not patch dashboards.**",
242
+ "",
243
+ ];
244
+ const failed = results.filter((r) => r.status === "fail");
245
+ const notImpl = results.filter((r) => r.status === "not_implemented");
246
+ const noProbe = results.filter((r) => r.status === "no_probe");
247
+ const allPassing = results.length > 0 && results.every((r) => r.status === "pass");
248
+ if (failed.length > 0) {
249
+ lines.push(`❌ ${failed.length} probe${failed.length === 1 ? "" : "s"} failed — for each failing probe:`, " 1. Read the NFR contract in docs/nfr-contracts.md", " 2. Read the SLO spec in .forgecraft/slo/{service}.yaml", " 3. Update Prometheus rules / Grafana dashboards / alertmanager config to match contracts", " 4. Call run_slo_probe again — repeat until green", "");
250
+ }
251
+ if (notImpl.length > 0) {
252
+ lines.push(`⚠️ ${notImpl.length} probe${notImpl.length === 1 ? "" : "s"} not yet implemented — fill in the TODO sections:`);
253
+ for (const r of notImpl) {
254
+ lines.push(` - tests/slo/${r.probeFile ?? r.probeId}: implement the actual check`);
255
+ }
256
+ lines.push("");
257
+ }
258
+ if (noProbe.length > 0) {
259
+ lines.push(`📋 ${noProbe.length} service${noProbe.length === 1 ? "" : "s"} have no probe files — run:`, " generate_slo_probe (scaffolds probe files from .forgecraft/slo/ specs)", " Then implement the TODO sections", "");
260
+ }
261
+ if (allPassing) {
262
+ lines.push("✅ All SLO probes passing — L4 monitoring contracts verified.", " Call close_cycle to evaluate gates and advance the cycle.");
263
+ }
264
+ else if (results.length > 0) {
265
+ lines.push("Run layer_status to see full coverage picture.");
266
+ }
267
+ return lines;
268
+ }
269
+ function formatSloStatus(status) {
270
+ const map = {
271
+ pass: "✅ PASS",
272
+ fail: "❌ FAIL",
273
+ tool_missing: "⚠️ TOOL_MISSING",
274
+ not_implemented: "⏳ NOT_IMPLEMENTED",
275
+ timeout: "⏱ TIMEOUT",
276
+ no_probe: "❌ NO_PROBE",
277
+ error: "⚠️ ERROR",
278
+ };
279
+ return map[status] ?? status;
280
+ }
281
+ //# sourceMappingURL=run-slo-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-slo-probe.js","sourceRoot":"","sources":["../../src/tools/run-slo-probe.ts"],"names":[],"mappings":"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"}
@@ -7,20 +7,20 @@
7
7
  */
8
8
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
9
9
  import { dirname } from "node:path";
10
- export const USE_CASES_STUB = `<!-- UNFILLED: Use Cases -->
11
- # Use Cases
12
-
13
- ## UC-01: [Name]
14
- **Actor**: <!-- FILL: who? -->
15
- **Precondition**: <!-- FILL: what must be true before? -->
16
- **Steps**: <!-- FILL: numbered steps -->
17
- **Success**: <!-- FILL: what changed? -->
18
-
19
- ## UC-02: [Name]
20
- <!-- FILL -->
21
-
22
- ## UC-03: [Name]
23
- <!-- FILL -->
10
+ export const USE_CASES_STUB = `<!-- UNFILLED: Use Cases -->
11
+ # Use Cases
12
+
13
+ ## UC-01: [Name]
14
+ **Actor**: <!-- FILL: who? -->
15
+ **Precondition**: <!-- FILL: what must be true before? -->
16
+ **Steps**: <!-- FILL: numbered steps -->
17
+ **Success**: <!-- FILL: what changed? -->
18
+
19
+ ## UC-02: [Name]
20
+ <!-- FILL -->
21
+
22
+ ## UC-03: [Name]
23
+ <!-- FILL -->
24
24
  `;
25
25
  /**
26
26
  * Build the UNFILLED stub content for docs/diagrams/c4-context.md.
@@ -29,16 +29,16 @@ export const USE_CASES_STUB = `<!-- UNFILLED: Use Cases -->
29
29
  * @returns Stub content with UNFILLED markers
30
30
  */
31
31
  export function buildC4ContextStub(projectName) {
32
- return `<!-- UNFILLED: C4 Context Diagram -->
33
- <!-- Run \`forgecraft generate_diagram\` to auto-generate from your spec -->
34
- # System Context Diagram
35
- \`\`\`mermaid
36
- C4Context
37
- title System Context: ${projectName}
38
- Person(user, "User", "<!-- FILL: Who uses the system? -->")
39
- System(system, "${projectName}", "<!-- FILL: What does the system do in one sentence? -->")
40
- Rel(user, system, "<!-- FILL: Primary interaction -->")
41
- \`\`\`
32
+ return `<!-- UNFILLED: C4 Context Diagram -->
33
+ <!-- Run \`forgecraft generate_diagram\` to auto-generate from your spec -->
34
+ # System Context Diagram
35
+ \`\`\`mermaid
36
+ C4Context
37
+ title System Context: ${projectName}
38
+ Person(user, "User", "<!-- FILL: Who uses the system? -->")
39
+ System(system, "${projectName}", "<!-- FILL: What does the system do in one sentence? -->")
40
+ Rel(user, system, "<!-- FILL: Primary interaction -->")
41
+ \`\`\`
42
42
  `;
43
43
  }
44
44
  /**
@@ -51,32 +51,32 @@ C4Context
51
51
  * @returns Stub content with UNFILLED markers and structural Mermaid syntax
52
52
  */
53
53
  export function buildSequenceDiagramStub(feature) {
54
- return `<!-- UNFILLED: Sequence Diagram — ${feature} -->
55
- <!-- Replace participant labels and messages with real actors and contracts -->
56
- # Sequence Diagram: ${feature}
57
-
58
- \`\`\`mermaid
59
- sequenceDiagram
60
- participant Client as <!-- FILL: initiating actor, e.g. Browser / CLI / Service -->
61
- participant API as <!-- FILL: entry-point service, e.g. API Gateway -->
62
- participant Service as <!-- FILL: domain service, e.g. AuthService -->
63
- participant Store as <!-- FILL: persistence layer, e.g. Database -->
64
-
65
- Note over Client,Store: <!-- FILL: describe the primary flow in one sentence -->
66
-
67
- Client->>API: <!-- FILL: request, e.g. POST /login {credentials} -->
68
- API->>Service: <!-- FILL: delegate, e.g. authenticate(credentials) -->
69
- Service->>Store: <!-- FILL: query, e.g. findUserByEmail(email) -->
70
- Store-->>Service: <!-- FILL: result, e.g. User | null -->
71
-
72
- alt <!-- FILL: failure case, e.g. User not found or wrong password -->
73
- Service-->>API: <!-- FILL: error response, e.g. AuthError -->
74
- API-->>Client: <!-- FILL: HTTP error, e.g. 401 Unauthorized -->
75
- else <!-- FILL: success case -->
76
- Service-->>API: <!-- FILL: success result, e.g. JWT token -->
77
- API-->>Client: <!-- FILL: HTTP success, e.g. 200 OK {token} -->
78
- end
79
- \`\`\`
54
+ return `<!-- UNFILLED: Sequence Diagram — ${feature} -->
55
+ <!-- Replace participant labels and messages with real actors and contracts -->
56
+ # Sequence Diagram: ${feature}
57
+
58
+ \`\`\`mermaid
59
+ sequenceDiagram
60
+ participant Client as <!-- FILL: initiating actor, e.g. Browser / CLI / Service -->
61
+ participant API as <!-- FILL: entry-point service, e.g. API Gateway -->
62
+ participant Service as <!-- FILL: domain service, e.g. AuthService -->
63
+ participant Store as <!-- FILL: persistence layer, e.g. Database -->
64
+
65
+ Note over Client,Store: <!-- FILL: describe the primary flow in one sentence -->
66
+
67
+ Client->>API: <!-- FILL: request, e.g. POST /login {credentials} -->
68
+ API->>Service: <!-- FILL: delegate, e.g. authenticate(credentials) -->
69
+ Service->>Store: <!-- FILL: query, e.g. findUserByEmail(email) -->
70
+ Store-->>Service: <!-- FILL: result, e.g. User | null -->
71
+
72
+ alt <!-- FILL: failure case, e.g. User not found or wrong password -->
73
+ Service-->>API: <!-- FILL: error response, e.g. AuthError -->
74
+ API-->>Client: <!-- FILL: HTTP error, e.g. 401 Unauthorized -->
75
+ else <!-- FILL: success case -->
76
+ Service-->>API: <!-- FILL: success result, e.g. JWT token -->
77
+ API-->>Client: <!-- FILL: HTTP success, e.g. 200 OK {token} -->
78
+ end
79
+ \`\`\`
80
80
  `;
81
81
  }
82
82
  /**
@@ -90,30 +90,30 @@ sequenceDiagram
90
90
  * @returns Stub content with UNFILLED markers and structural Mermaid syntax
91
91
  */
92
92
  export function buildStateMachineDiagramStub(entityName) {
93
- return `<!-- UNFILLED: State Machine — ${entityName} -->
94
- <!-- Replace state names (Draft, Pending, Active, etc.) and transition labels -->
95
- <!-- with the actual lifecycle states of your domain entity. -->
96
- # State Machine: ${entityName}
97
-
98
- \`\`\`mermaid
99
- stateDiagram-v2
100
- [*] --> Draft
101
-
102
- Draft --> Pending: submit()
103
- Pending --> Active: approve()
104
- Pending --> Rejected: reject()
105
- Active --> Completed: complete()
106
- Active --> Cancelled: cancel()
107
-
108
- Completed --> [*]
109
- Rejected --> [*]
110
- Cancelled --> [*]
111
-
112
- note right of Active
113
- FILL: add invariant or constraint
114
- e.g. "requires valid payment method"
115
- end note
116
- \`\`\`
93
+ return `<!-- UNFILLED: State Machine — ${entityName} -->
94
+ <!-- Replace state names (Draft, Pending, Active, etc.) and transition labels -->
95
+ <!-- with the actual lifecycle states of your domain entity. -->
96
+ # State Machine: ${entityName}
97
+
98
+ \`\`\`mermaid
99
+ stateDiagram-v2
100
+ [*] --> Draft
101
+
102
+ Draft --> Pending: submit()
103
+ Pending --> Active: approve()
104
+ Pending --> Rejected: reject()
105
+ Active --> Completed: complete()
106
+ Active --> Cancelled: cancel()
107
+
108
+ Completed --> [*]
109
+ Rejected --> [*]
110
+ Cancelled --> [*]
111
+
112
+ note right of Active
113
+ FILL: add invariant or constraint
114
+ e.g. "requires valid payment method"
115
+ end note
116
+ \`\`\`
117
117
  `;
118
118
  }
119
119
  /**
@@ -126,29 +126,29 @@ stateDiagram-v2
126
126
  * @returns Stub content with UNFILLED markers and structural Mermaid syntax
127
127
  */
128
128
  export function buildFlowDiagramStub(ucName) {
129
- return `<!-- UNFILLED: Flow Diagram — ${ucName} -->
130
- <!-- Replace node labels and edge conditions with real user journey steps -->
131
- # Flow: ${ucName}
132
-
133
- \`\`\`mermaid
134
- flowchart TD
135
- Start([<!-- FILL: trigger, e.g. User opens registration page -->])
136
-
137
- Start --> Input[<!-- FILL: first action, e.g. Fill in name, email, password -->]
138
- Input --> Validate{<!-- FILL: validation check, e.g. All fields valid? -->}
139
-
140
- Validate -->|<!-- FILL: failure label, e.g. Invalid -->| Error[<!-- FILL: error action, e.g. Show validation errors -->]
141
- Error --> Input
142
-
143
- Validate -->|<!-- FILL: success label, e.g. Valid -->| Process[<!-- FILL: main action, e.g. Create account -->]
144
- Process --> Check{<!-- FILL: guard check, e.g. Email already exists? -->}
145
-
146
- Check -->|<!-- FILL: conflict label, e.g. Yes -->| Conflict[<!-- FILL: conflict action, e.g. Show duplicate email error -->]
147
- Conflict --> End([<!-- FILL: exit label, e.g. User corrects email -->])
148
-
149
- Check -->|<!-- FILL: proceed label, e.g. No -->| Success[<!-- FILL: success action, e.g. Send confirmation email -->]
150
- Success --> End
151
- \`\`\`
129
+ return `<!-- UNFILLED: Flow Diagram — ${ucName} -->
130
+ <!-- Replace node labels and edge conditions with real user journey steps -->
131
+ # Flow: ${ucName}
132
+
133
+ \`\`\`mermaid
134
+ flowchart TD
135
+ Start([<!-- FILL: trigger, e.g. User opens registration page -->])
136
+
137
+ Start --> Input[<!-- FILL: first action, e.g. Fill in name, email, password -->]
138
+ Input --> Validate{<!-- FILL: validation check, e.g. All fields valid? -->}
139
+
140
+ Validate -->|<!-- FILL: failure label, e.g. Invalid -->| Error[<!-- FILL: error action, e.g. Show validation errors -->]
141
+ Error --> Input
142
+
143
+ Validate -->|<!-- FILL: success label, e.g. Valid -->| Process[<!-- FILL: main action, e.g. Create account -->]
144
+ Process --> Check{<!-- FILL: guard check, e.g. Email already exists? -->}
145
+
146
+ Check -->|<!-- FILL: conflict label, e.g. Yes -->| Conflict[<!-- FILL: conflict action, e.g. Show duplicate email error -->]
147
+ Conflict --> End([<!-- FILL: exit label, e.g. User corrects email -->])
148
+
149
+ Check -->|<!-- FILL: proceed label, e.g. No -->| Success[<!-- FILL: success action, e.g. Send confirmation email -->]
150
+ Success --> End
151
+ \`\`\`
152
152
  `;
153
153
  }
154
154
  /**
@@ -161,24 +161,24 @@ flowchart TD
161
161
  * @returns Stub content with UNFILLED markers and structural Mermaid syntax
162
162
  */
163
163
  export function buildC4ContainerStub(projectName) {
164
- return `<!-- UNFILLED: C4 Container Diagram -->
165
- <!-- Replace container labels, technology fields, and relations with your stack -->
166
- # Container Diagram — ${projectName}
167
-
168
- \`\`\`mermaid
169
- C4Container
170
- title Container Diagram: ${projectName}
171
-
172
- Person(user, "<!-- FILL: actor name -->", "<!-- FILL: actor description -->")
173
-
174
- Container(web, "<!-- FILL: frontend name, e.g. Web Application -->", "<!-- FILL: technology, e.g. React -->", "<!-- FILL: responsibility -->")
175
- Container(api, "<!-- FILL: backend name, e.g. API Server -->", "<!-- FILL: technology, e.g. Node.js / Express -->", "<!-- FILL: responsibility -->")
176
- Container(db, "<!-- FILL: database name, e.g. Primary Database -->", "<!-- FILL: technology, e.g. PostgreSQL -->", "<!-- FILL: responsibility -->")
177
-
178
- Rel(user, web, "<!-- FILL: interaction, e.g. Uses -->", "<!-- FILL: protocol, e.g. HTTPS -->")
179
- Rel(web, api, "<!-- FILL: call, e.g. API calls -->", "<!-- FILL: protocol, e.g. REST / JSON -->")
180
- Rel(api, db, "<!-- FILL: query, e.g. Reads and writes -->", "<!-- FILL: protocol, e.g. SQL -->")
181
- \`\`\`
164
+ return `<!-- UNFILLED: C4 Container Diagram -->
165
+ <!-- Replace container labels, technology fields, and relations with your stack -->
166
+ # Container Diagram — ${projectName}
167
+
168
+ \`\`\`mermaid
169
+ C4Container
170
+ title Container Diagram: ${projectName}
171
+
172
+ Person(user, "<!-- FILL: actor name -->", "<!-- FILL: actor description -->")
173
+
174
+ Container(web, "<!-- FILL: frontend name, e.g. Web Application -->", "<!-- FILL: technology, e.g. React -->", "<!-- FILL: responsibility -->")
175
+ Container(api, "<!-- FILL: backend name, e.g. API Server -->", "<!-- FILL: technology, e.g. Node.js / Express -->", "<!-- FILL: responsibility -->")
176
+ Container(db, "<!-- FILL: database name, e.g. Primary Database -->", "<!-- FILL: technology, e.g. PostgreSQL -->", "<!-- FILL: responsibility -->")
177
+
178
+ Rel(user, web, "<!-- FILL: interaction, e.g. Uses -->", "<!-- FILL: protocol, e.g. HTTPS -->")
179
+ Rel(web, api, "<!-- FILL: call, e.g. API calls -->", "<!-- FILL: protocol, e.g. REST / JSON -->")
180
+ Rel(api, db, "<!-- FILL: query, e.g. Reads and writes -->", "<!-- FILL: protocol, e.g. SQL -->")
181
+ \`\`\`
182
182
  `;
183
183
  }
184
184
  /**