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
@@ -4,7 +4,13 @@
4
4
  import { extname, basename, dirname } from "node:path";
5
5
  // ── Constants ─────────────────────────────────────────────────────────
6
6
  /** Directories that are considered "route/controller" layers. */
7
- export const ROUTE_DIRS = ["routes", "controllers", "handlers", "api", "endpoints"];
7
+ export const ROUTE_DIRS = [
8
+ "routes",
9
+ "controllers",
10
+ "handlers",
11
+ "api",
12
+ "endpoints",
13
+ ];
8
14
  /** ORM/DB client call patterns to flag in route files. */
9
15
  export const DB_CALL_PATTERNS = [
10
16
  /\bprisma\.\w+\.\w+\s*\(/, // prisma.user.findMany(
@@ -18,19 +24,34 @@ export const DB_CALL_PATTERNS = [
18
24
  ];
19
25
  /** Lines that are comments or imports — excluded from DB call detection. */
20
26
  export const COMMENT_OR_IMPORT = /^\s*(\/\/|\/\*|\*|#|import\s|require\s*\()/;
21
- /** Minimum instruction-file length to be considered substantive. */
22
- export const MIN_INSTRUCTION_FILE_LINES = 40;
23
- /** Keywords that indicate an instruction file covers architecture/conventions/decisions. */
27
+ /**
28
+ * Keywords that indicate an instruction file covers architecture/conventions/decisions.
29
+ * Intentionally broad to be tech-agnostic: web services, libraries, CLIs,
30
+ * GitHub Actions, and ML projects each use different vocabulary.
31
+ */
24
32
  export const INSTRUCTION_COVERAGE_KEYWORDS = [
33
+ // Web service / layered architecture terms
25
34
  "architecture",
35
+ "layer",
36
+ "repository",
37
+ "service",
38
+ // Universal design terms
26
39
  "convention",
27
40
  "decision",
41
+ "pattern",
42
+ "module",
43
+ "interface",
44
+ "constraint",
45
+ "behavior",
46
+ // Documentation/traceability
28
47
  "adr",
29
48
  "domain",
30
- "pattern",
31
- "layer",
32
- "repository",
33
- "service",
49
+ // Action/CLI/tool-specific
50
+ "workflow",
51
+ "input",
52
+ "output",
53
+ "command",
54
+ "tool",
34
55
  ];
35
56
  /** Minimum distinct keyword hits to award score 2 for Self-describing. */
36
57
  export const MIN_KEYWORD_HITS = 3;
@@ -67,7 +88,11 @@ export function collectDbViolations(lines, relPath, violations) {
67
88
  continue;
68
89
  const matchedPattern = DB_CALL_PATTERNS.find((p) => p.test(line));
69
90
  if (matchedPattern) {
70
- violations.push({ file: relPath, line: i + 1, snippet: line.slice(0, 120) });
91
+ violations.push({
92
+ file: relPath,
93
+ line: i + 1,
94
+ snippet: line.slice(0, 120),
95
+ });
71
96
  }
72
97
  }
73
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scorer-utils.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/scorer-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scorer-utils.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/scorer-utils.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  /**
2
- * Self-describing scorer: instruction file exists, is substantive, and covers
3
- * architecture / conventions / decisions.
2
+ * Self-describing scorer: instruction file exists and covers architecture/convention keywords.
3
+ *
4
+ * Sentinel-aware: a compact CLAUDE.md that navigates to the right docs is better
5
+ * than a verbose file that repeats them. Line count is irrelevant — keyword coverage
6
+ * is the signal.
4
7
  */
5
8
  import type { GsPropertyScore } from "../../shared/types.js";
6
9
  /**
7
10
  * Score the Self-describing GS property.
8
- * 2 = instruction file found, substantive, covers architecture/convention keywords.
9
- * 1 = file found but short or missing keywords.
11
+ * 2 = instruction file exists and covers ≥ MIN_KEYWORD_HITS architecture/convention keywords.
12
+ * 1 = file exists but covers fewer keywords (present but not describing the architecture).
10
13
  * 0 = no instruction file found.
11
14
  */
12
15
  export declare function scoreSelfDescribing(projectDir: string): GsPropertyScore;
@@ -1 +1 @@
1
- {"version":3,"file":"self-describing-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAwCvE"}
1
+ {"version":3,"file":"self-describing-scorer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAuCvE"}
@@ -1,14 +1,17 @@
1
1
  /**
2
- * Self-describing scorer: instruction file exists, is substantive, and covers
3
- * architecture / conventions / decisions.
2
+ * Self-describing scorer: instruction file exists and covers architecture/convention keywords.
3
+ *
4
+ * Sentinel-aware: a compact CLAUDE.md that navigates to the right docs is better
5
+ * than a verbose file that repeats them. Line count is irrelevant — keyword coverage
6
+ * is the signal.
4
7
  */
5
8
  import { existsSync, readFileSync } from "node:fs";
6
9
  import { join } from "node:path";
7
- import { gs, MIN_INSTRUCTION_FILE_LINES, INSTRUCTION_COVERAGE_KEYWORDS, MIN_KEYWORD_HITS } from "./scorer-utils.js";
10
+ import { gs, INSTRUCTION_COVERAGE_KEYWORDS, MIN_KEYWORD_HITS, } from "./scorer-utils.js";
8
11
  /**
9
12
  * Score the Self-describing GS property.
10
- * 2 = instruction file found, substantive, covers architecture/convention keywords.
11
- * 1 = file found but short or missing keywords.
13
+ * 2 = instruction file exists and covers ≥ MIN_KEYWORD_HITS architecture/convention keywords.
14
+ * 1 = file exists but covers fewer keywords (present but not describing the architecture).
12
15
  * 0 = no instruction file found.
13
16
  */
14
17
  export function scoreSelfDescribing(projectDir) {
@@ -28,24 +31,20 @@ export function scoreSelfDescribing(projectDir) {
28
31
  try {
29
32
  content = readFileSync(join(projectDir, found), "utf-8");
30
33
  }
31
- catch { /* empty */ }
32
- const lines = content.split("\n").filter((l) => l.trim().length > 0);
33
- if (lines.length < MIN_INSTRUCTION_FILE_LINES) {
34
- return gs("self-describing", 1, [
35
- `${found} found but only ${lines.length} non-empty lines (< ${MIN_INSTRUCTION_FILE_LINES} — treat as stub)`,
36
- ]);
34
+ catch {
35
+ /* empty */
37
36
  }
38
37
  const lower = content.toLowerCase();
39
38
  const hits = INSTRUCTION_COVERAGE_KEYWORDS.filter((kw) => lower.includes(kw));
40
- if (hits.length < MIN_KEYWORD_HITS) {
41
- return gs("self-describing", 1, [
42
- `${found} found (${lines.length} lines) but covers fewer than ${MIN_KEYWORD_HITS} architecture/convention keywords`,
43
- `Missing keywords: ${INSTRUCTION_COVERAGE_KEYWORDS.filter((kw) => !lower.includes(kw)).slice(0, 5).join(", ")}`,
39
+ if (hits.length >= MIN_KEYWORD_HITS) {
40
+ return gs("self-describing", 2, [
41
+ `${found} found — covers: ${hits.join(", ")}`,
44
42
  ]);
45
43
  }
46
- return gs("self-describing", 2, [
47
- `${found} found ${lines.length} non-empty lines`,
48
- `Covers: ${hits.join(", ")}`,
44
+ const missing = INSTRUCTION_COVERAGE_KEYWORDS.filter((kw) => !lower.includes(kw));
45
+ return gs("self-describing", 1, [
46
+ `${found} found but covers fewer than ${MIN_KEYWORD_HITS} architecture/convention keywords`,
47
+ `Add navigation or constraints referencing: ${missing.slice(0, 5).join(", ")}`,
49
48
  ]);
50
49
  }
51
50
  //# sourceMappingURL=self-describing-scorer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"self-describing-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,EAAE,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,gBAAgB,GAAG;QACvB,WAAW;QACX,eAAe;QACf,iCAAiC;QACjC,gBAAgB;QAChB,aAAa;QACb,gBAAgB;KACjB,CAAC;IAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErE,IAAI,KAAK,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE;YAC9B,GAAG,KAAK,mBAAmB,KAAK,CAAC,MAAM,uBAAuB,0BAA0B,mBAAmB;SAC5G,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E,IAAI,IAAI,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE;YAC9B,GAAG,KAAK,WAAW,KAAK,CAAC,MAAM,iCAAiC,gBAAgB,mCAAmC;YACnH,qBAAqB,6BAA6B,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAChH,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE;QAC9B,GAAG,KAAK,YAAY,KAAK,CAAC,MAAM,kBAAkB;QAClD,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"self-describing-scorer.js","sourceRoot":"","sources":["../../../src/analyzers/scorers/self-describing-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,EAAE,EACF,6BAA6B,EAC7B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,gBAAgB,GAAG;QACvB,WAAW;QACX,eAAe;QACf,iCAAiC;QACjC,gBAAgB;QAChB,aAAa;QACb,gBAAgB;KACjB,CAAC;IAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,WAAW;IACb,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE9E,IAAI,IAAI,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE;YAC9B,GAAG,KAAK,oBAAoB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,6BAA6B,CAAC,MAAM,CAClD,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC5B,CAAC;IACF,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE;QAC9B,GAAG,KAAK,gCAAgC,gBAAgB,mCAAmC;QAC3F,8CAA8C,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC"}
package/dist/cli/help.js CHANGED
@@ -5,57 +5,57 @@
5
5
  * Print usage help to stdout.
6
6
  */
7
7
  export function showHelp() {
8
- console.log(`
9
- ForgeCraft MCP — engineering standards for AI coding assistants
10
-
11
- USAGE
12
- npx forgecraft-mcp <command> [arguments] [flags]
13
- npx forgecraft-mcp serve (default — starts MCP server)
14
-
15
- COMMANDS
16
- setup <dir> First-time project setup (auto-detects stack)
17
- refresh <dir> Re-sync instruction files after project changes
18
- audit <dir> Check project against configured standards
19
- scaffold <dir> Generate project structure and instruction files
20
- review [dir] Generate code review checklist
21
- list [tags|hooks|skills] Discover available resources
22
- classify [dir] Suggest tags for a project
23
- generate <dir> Generate instruction files only
24
- convert <dir> Generate migration plan
25
- add-hook <name> <dir> Install a quality-gate hook
26
- add-module <name> <dir> Scaffold a feature module
27
- verify [dir] Run tests + score §4.3 GS properties + report layer violations
28
- advice [dir] Quality cycle checklist + tool stack + example configs for your tags
29
- metrics [dir] External quality report: LOC, coverage, layer violations, dead code, complexity
30
-
31
- CI / BARE GATE COMMANDS (exit codes: 0 = pass, 1 = fail)
32
- check-cascade [dir] Run cascade gate checks — exit 1 if required steps are incomplete
33
- violations [dir] Report active gate violations — exit 1 if any violations present
34
- status [dir] Print live project state snapshot (cascade + roadmap + git + Status.md)
35
-
36
- FLAGS (vary by command)
37
- --json Machine-readable JSON output (for CI/scripting)
38
- --tags <tags...> Project classification tags (or read from forgecraft.yaml)
39
- --tier <tier> Content depth: core | recommended | optional
40
- --targets <targets...> AI assistant targets: claude cursor copilot windsurf cline aider
41
- --name <name> Project name
42
- --description <text> Project description for tag detection
43
- --dry-run Preview without writing files
44
- --apply Apply changes (for refresh, default is preview)
45
- --add-tags <tags...> Add tags during refresh
46
- --remove-tags <tags...> Remove tags during refresh
47
- --no-anti-patterns Skip anti-pattern scanning (for audit)
48
- --language <lang> typescript | python (default: typescript)
49
- --scope <scope> comprehensive | focused (for review)
50
- --test-cmd <cmd> Test command override for verify (default: npm test)
51
- --timeout <ms> Test suite timeout in milliseconds (default: 120000)
52
- --threshold <n> Minimum GS score out of 12 for pass (default: 10)
53
- --mutation Run Stryker mutation testing (slow, opt-in; used by metrics)
54
- --coverage-dir <path> Path to existing coverage report directory (used by metrics)
55
- --force Overwrite existing files
56
- --compact Strip explanatory bullet tails and deduplicate lines (~20-40% smaller output)
57
- --tag <tag> Single tag filter (for add-hook)
58
- --check Drift-check mode for refresh: exit 1 if tag/tier drift detected (CI gate)
8
+ console.log(`
9
+ ForgeCraft MCP — engineering standards for AI coding assistants
10
+
11
+ USAGE
12
+ npx forgecraft-mcp <command> [arguments] [flags]
13
+ npx forgecraft-mcp serve (default — starts MCP server)
14
+
15
+ COMMANDS
16
+ setup <dir> First-time project setup (auto-detects stack)
17
+ refresh <dir> Re-sync instruction files after project changes
18
+ audit <dir> Check project against configured standards
19
+ scaffold <dir> Generate project structure and instruction files
20
+ review [dir] Generate code review checklist
21
+ list [tags|hooks|skills] Discover available resources
22
+ classify [dir] Suggest tags for a project
23
+ generate <dir> Generate instruction files only
24
+ convert <dir> Generate migration plan
25
+ add-hook <name> <dir> Install a quality-gate hook
26
+ add-module <name> <dir> Scaffold a feature module
27
+ verify [dir] Run tests + score §4.3 GS properties + report layer violations
28
+ advice [dir] Quality cycle checklist + tool stack + example configs for your tags
29
+ metrics [dir] External quality report: LOC, coverage, layer violations, dead code, complexity
30
+
31
+ CI / BARE GATE COMMANDS (exit codes: 0 = pass, 1 = fail)
32
+ check-cascade [dir] Run cascade gate checks — exit 1 if required steps are incomplete
33
+ violations [dir] Report active gate violations — exit 1 if any violations present
34
+ status [dir] Print live project state snapshot (cascade + roadmap + git + Status.md)
35
+
36
+ FLAGS (vary by command)
37
+ --json Machine-readable JSON output (for CI/scripting)
38
+ --tags <tags...> Project classification tags (or read from forgecraft.yaml)
39
+ --tier <tier> Content depth: core | recommended | optional
40
+ --targets <targets...> AI assistant targets: claude cursor copilot windsurf cline aider
41
+ --name <name> Project name
42
+ --description <text> Project description for tag detection
43
+ --dry-run Preview without writing files
44
+ --apply Apply changes (for refresh, default is preview)
45
+ --add-tags <tags...> Add tags during refresh
46
+ --remove-tags <tags...> Remove tags during refresh
47
+ --no-anti-patterns Skip anti-pattern scanning (for audit)
48
+ --language <lang> typescript | python (default: typescript)
49
+ --scope <scope> comprehensive | focused (for review)
50
+ --test-cmd <cmd> Test command override for verify (default: npm test)
51
+ --timeout <ms> Test suite timeout in milliseconds (default: 120000)
52
+ --threshold <n> Minimum GS score out of 12 for pass (default: 10)
53
+ --mutation Run Stryker mutation testing (slow, opt-in; used by metrics)
54
+ --coverage-dir <path> Path to existing coverage report directory (used by metrics)
55
+ --force Overwrite existing files
56
+ --compact Strip explanatory bullet tails and deduplicate lines (~20-40% smaller output)
57
+ --tag <tag> Single tag filter (for add-hook)
58
+ --check Drift-check mode for refresh: exit 1 if tag/tier drift detected (CI gate)
59
59
  `);
60
60
  }
61
61
  //# sourceMappingURL=help.js.map
@@ -0,0 +1,16 @@
1
+ export interface DetectResult {
2
+ applies: boolean;
3
+ evidence: string[];
4
+ }
5
+ export interface ScoreResult {
6
+ score: 0 | 1 | 2;
7
+ evidence: string[];
8
+ }
9
+ export interface Discipline {
10
+ name: string;
11
+ description: string;
12
+ detect(repoPath: string): DetectResult;
13
+ score(repoPath: string): ScoreResult;
14
+ }
15
+ export declare const DISCIPLINES: readonly Discipline[];
16
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/disciplines/catalog.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC;CACtC;AA+KD,eAAO,MAAM,WAAW,EAAE,SAAS,UAAU,EAO5C,CAAC"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Structural disciplines catalog.
3
+ *
4
+ * A "discipline" is a recognised way to organise a codebase — SOLID,
5
+ * hexagonal, layered, clean architecture, DDD, and TDD-as-a-practice.
6
+ * Each entry knows two things:
7
+ *
8
+ * 1. `detect(repoPath)` — does this discipline appear to apply at all?
9
+ * A heuristic scan of file names, directory structure, and well-known
10
+ * vocabulary. Cheap, read-only, no parsing.
11
+ * 2. `score(repoPath)` — given that it applies, how well is it followed?
12
+ * 0/1/2 scale, mirroring the existing GS scorer convention. Bodies
13
+ * are placeholders for now; calibration anchors come later.
14
+ *
15
+ * The catalog is intentionally additive: a repo can match many disciplines
16
+ * at once (e.g. a hexagonal codebase that also speaks DDD), and a repo
17
+ * with nothing recognisable matches none.
18
+ */
19
+ import { existsSync, readdirSync, statSync } from "node:fs";
20
+ import { join } from "node:path";
21
+ const TODO_PLACEHOLDER = {
22
+ score: 0,
23
+ evidence: ["TODO: scoring heuristic not yet implemented (skeleton)"],
24
+ };
25
+ function listDirsRecursive(repoPath, maxDepth = 3) {
26
+ const out = [];
27
+ function walk(dir, depth) {
28
+ if (depth > maxDepth)
29
+ return;
30
+ let entries;
31
+ try {
32
+ entries = readdirSync(dir, { withFileTypes: true, encoding: "utf8" });
33
+ }
34
+ catch {
35
+ return;
36
+ }
37
+ for (const e of entries) {
38
+ if (!e.isDirectory())
39
+ continue;
40
+ const name = e.name;
41
+ if (name === "node_modules" || name.startsWith("."))
42
+ continue;
43
+ const full = join(dir, name);
44
+ out.push(full);
45
+ walk(full, depth + 1);
46
+ }
47
+ }
48
+ walk(repoPath, 0);
49
+ return out;
50
+ }
51
+ function hasDirNamed(repoPath, names) {
52
+ const dirs = listDirsRecursive(repoPath);
53
+ const lower = new Set(names.map((n) => n.toLowerCase()));
54
+ const hits = [];
55
+ for (const d of dirs) {
56
+ const base = d.split(/[\\/]/).pop().toLowerCase();
57
+ if (lower.has(base))
58
+ hits.push(d);
59
+ }
60
+ return hits;
61
+ }
62
+ function hasAnyFile(repoPath, files) {
63
+ const hits = [];
64
+ for (const f of files) {
65
+ const full = join(repoPath, f);
66
+ if (existsSync(full) && safeIsFile(full))
67
+ hits.push(f);
68
+ }
69
+ return hits;
70
+ }
71
+ function safeIsFile(p) {
72
+ try {
73
+ return statSync(p).isFile();
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ const SOLID = {
80
+ name: "SOLID",
81
+ description: "Class-oriented design principles (SRP, OCP, LSP, ISP, DIP).",
82
+ detect(repoPath) {
83
+ const interfaceDirs = hasDirNamed(repoPath, ["interfaces", "abstractions"]);
84
+ const classy = hasAnyFile(repoPath, [
85
+ "tsconfig.json",
86
+ "pom.xml",
87
+ "build.gradle",
88
+ "*.csproj",
89
+ ]);
90
+ const evidence = [];
91
+ if (interfaceDirs.length > 0)
92
+ evidence.push(`interface dirs: ${interfaceDirs.length}`);
93
+ if (classy.length > 0)
94
+ evidence.push(`class-oriented project: ${classy.join(", ")}`);
95
+ return { applies: evidence.length > 0, evidence };
96
+ },
97
+ score: () => TODO_PLACEHOLDER,
98
+ };
99
+ const TDD = {
100
+ name: "TDD",
101
+ description: "Test-driven development practice (tests present and central).",
102
+ detect(repoPath) {
103
+ const testDirs = hasDirNamed(repoPath, [
104
+ "tests",
105
+ "test",
106
+ "__tests__",
107
+ "spec",
108
+ ]);
109
+ const configs = hasAnyFile(repoPath, [
110
+ "vitest.config.ts",
111
+ "vitest.config.js",
112
+ "jest.config.js",
113
+ "jest.config.ts",
114
+ "karma.conf.js",
115
+ "phpunit.xml",
116
+ ]);
117
+ const evidence = [];
118
+ if (testDirs.length > 0)
119
+ evidence.push(`test dirs: ${testDirs.length}`);
120
+ if (configs.length > 0)
121
+ evidence.push(`test configs: ${configs.join(", ")}`);
122
+ return { applies: testDirs.length > 0 || configs.length > 0, evidence };
123
+ },
124
+ score: () => TODO_PLACEHOLDER,
125
+ };
126
+ const HEXAGONAL = {
127
+ name: "Hexagonal",
128
+ description: "Ports & adapters — domain isolated behind explicit ports.",
129
+ detect(repoPath) {
130
+ const dirs = hasDirNamed(repoPath, ["ports", "adapters", "hexagon"]);
131
+ const evidence = dirs.length > 0 ? [`hexagonal dirs: ${dirs.length}`] : [];
132
+ return { applies: dirs.length >= 2, evidence };
133
+ },
134
+ score: () => TODO_PLACEHOLDER,
135
+ };
136
+ const LAYERED = {
137
+ name: "Layered",
138
+ description: "Classic n-tier separation (controllers / services / repositories).",
139
+ detect(repoPath) {
140
+ const dirs = hasDirNamed(repoPath, [
141
+ "controllers",
142
+ "services",
143
+ "repositories",
144
+ "dao",
145
+ "presentation",
146
+ "business",
147
+ "persistence",
148
+ ]);
149
+ const evidence = dirs.length > 0 ? [`layered dirs: ${dirs.length}`] : [];
150
+ return { applies: dirs.length >= 2, evidence };
151
+ },
152
+ score: () => TODO_PLACEHOLDER,
153
+ };
154
+ const CLEAN_ARCHITECTURE = {
155
+ name: "CleanArchitecture",
156
+ description: "Concentric rings — entities, use cases, interface adapters, frameworks.",
157
+ detect(repoPath) {
158
+ const dirs = hasDirNamed(repoPath, [
159
+ "entities",
160
+ "usecases",
161
+ "use-cases",
162
+ "interface-adapters",
163
+ "frameworks",
164
+ ]);
165
+ const evidence = dirs.length > 0 ? [`clean-arch dirs: ${dirs.length}`] : [];
166
+ return { applies: dirs.length >= 2, evidence };
167
+ },
168
+ score: () => TODO_PLACEHOLDER,
169
+ };
170
+ const DDD = {
171
+ name: "DDD",
172
+ description: "Domain-driven design vocabulary (aggregate, value object, repository).",
173
+ detect(repoPath) {
174
+ const dirs = hasDirNamed(repoPath, [
175
+ "aggregates",
176
+ "valueobjects",
177
+ "value-objects",
178
+ "domain",
179
+ "domainevents",
180
+ "domain-events",
181
+ "boundedcontexts",
182
+ ]);
183
+ const evidence = dirs.length > 0 ? [`ddd dirs: ${dirs.length}`] : [];
184
+ return { applies: dirs.length >= 1, evidence };
185
+ },
186
+ score: () => TODO_PLACEHOLDER,
187
+ };
188
+ export const DISCIPLINES = [
189
+ SOLID,
190
+ TDD,
191
+ HEXAGONAL,
192
+ LAYERED,
193
+ CLEAN_ARCHITECTURE,
194
+ DDD,
195
+ ];
196
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/disciplines/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface DetectedDiscipline {
2
+ name: string;
3
+ applies: boolean;
4
+ evidence: string[];
5
+ }
6
+ export interface ScoredDiscipline {
7
+ name: string;
8
+ score: 0 | 1 | 2;
9
+ evidence: string[];
10
+ }
11
+ export declare function detectApplicableDisciplines(repoPath: string): DetectedDiscipline[];
12
+ export declare function scoreApplicableDisciplines(repoPath: string): ScoredDiscipline[];
13
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/disciplines/runner.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,GACf,kBAAkB,EAAE,CAKtB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,GACf,gBAAgB,EAAE,CAapB"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Disciplines runner — apply the catalog to a concrete repo path.
3
+ *
4
+ * Two entry points:
5
+ * - detectApplicableDisciplines: which disciplines match this codebase?
6
+ * - scoreApplicableDisciplines: of those that match, how well are they
7
+ * followed? Score bodies are skeletons today (see `catalog.ts`); the
8
+ * runner shape is the contract callers can rely on.
9
+ *
10
+ * Detection and scoring are deliberately split so callers can render a
11
+ * "this repo speaks N disciplines" summary without paying for scoring.
12
+ */
13
+ import { DISCIPLINES } from "./catalog.js";
14
+ export function detectApplicableDisciplines(repoPath) {
15
+ return DISCIPLINES.map((d) => {
16
+ const r = d.detect(repoPath);
17
+ return { name: d.name, applies: r.applies, evidence: r.evidence };
18
+ });
19
+ }
20
+ export function scoreApplicableDisciplines(repoPath) {
21
+ const out = [];
22
+ for (const d of DISCIPLINES) {
23
+ const det = d.detect(repoPath);
24
+ if (!det.applies)
25
+ continue;
26
+ const sc = d.score(repoPath);
27
+ out.push({
28
+ name: d.name,
29
+ score: sc.score,
30
+ evidence: [...det.evidence, ...sc.evidence],
31
+ });
32
+ }
33
+ return out;
34
+ }
35
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/disciplines/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAc3C,MAAM,UAAU,2BAA2B,CACzC,QAAgB;IAEhB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAgB;IAEhB,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,SAAS;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/registry/composer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAW5B,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC;IAC3C,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACvC,gHAAgH;IAChH,QAAQ,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IACxD;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CAC7C;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,EAAE,EACjB,YAAY,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EACtC,OAAO,CAAC,EAAE,cAAc,GACvB,iBAAiB,CAgKnB"}
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/registry/composer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAW5B,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC;IAC3C,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACvC,gHAAgH;IAChH,QAAQ,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,CAAC;IACxD;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CAC7C;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,EAAE,EACjB,YAAY,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EACtC,OAAO,CAAC,EAAE,cAAc,GACvB,iBAAiB,CAsKnB"}
@@ -79,13 +79,18 @@ export function composeTemplates(activeTags, allTemplates, options) {
79
79
  }
80
80
  }
81
81
  }
82
- // Compose hooks (deduplicate by name — not tier-filtered)
82
+ // Compose hooks (deduplicate by name — stack-filtered, not tier-filtered)
83
83
  if (templateSet.hooks) {
84
84
  for (const hook of templateSet.hooks) {
85
- if (!seenHookNames.has(hook.name)) {
86
- seenHookNames.add(hook.name);
87
- hooks.push(hook);
85
+ if (seenHookNames.has(hook.name))
86
+ continue;
87
+ // Skip hooks that declare a stack restriction when no active tag matches
88
+ if (hook.stack?.length &&
89
+ !hook.stack.some((s) => orderedTags.includes(s))) {
90
+ continue;
88
91
  }
92
+ seenHookNames.add(hook.name);
93
+ hooks.push(hook);
89
94
  }
90
95
  }
91
96
  // Compose skills (deduplicate by id, filter by tier)