@sdd-method/sdd-cli 1.43.0 → 1.44.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 (325) hide show
  1. package/NOTICE +1 -1
  2. package/README.md +13 -14
  3. package/dist/author-program.js +1 -1
  4. package/dist/author-program.js.map +1 -1
  5. package/dist/cli.js +0 -0
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/catalogue/aggregate.js +6 -6
  9. package/dist/lib/catalogue/aggregate.js.map +1 -1
  10. package/dist/lib/catalogue/build.js +1 -1
  11. package/dist/lib/catalogue/build.js.map +1 -1
  12. package/dist/lib/catalogue/builders/c4-components.js +1 -1
  13. package/dist/lib/catalogue/builders/c4-components.js.map +1 -1
  14. package/dist/lib/catalogue/builders/c4-containers.d.ts +1 -1
  15. package/dist/lib/catalogue/builders/c4-containers.js +1 -1
  16. package/dist/lib/catalogue/builders/c4-l1-candidates.js +1 -1
  17. package/dist/lib/catalogue/builders/c4-l1-candidates.js.map +1 -1
  18. package/dist/lib/catalogue/builders/container-dependency.d.ts +1 -1
  19. package/dist/lib/catalogue/builders/container-dependency.js +1 -1
  20. package/dist/lib/catalogue/builders/data-store-mapping.js +1 -1
  21. package/dist/lib/catalogue/builders/data-store-mapping.js.map +1 -1
  22. package/dist/lib/catalogue/builders/screen-tree.d.ts +1 -1
  23. package/dist/lib/catalogue/builders/screen-tree.js +1 -1
  24. package/dist/lib/catalogue/contract-path-resolution.d.ts +2 -2
  25. package/dist/lib/catalogue/contract-path-resolution.js +2 -2
  26. package/dist/lib/catalogue/dedupe-keyed-tables.d.ts +1 -1
  27. package/dist/lib/catalogue/dedupe-keyed-tables.js +0 -0
  28. package/dist/lib/catalogue/dedupe-keyed-tables.js.map +1 -1
  29. package/dist/lib/catalogue/scores-coverage.js +1 -1
  30. package/dist/lib/catalogue/scores-coverage.js.map +1 -1
  31. package/dist/lib/catalogue/service-contract-aliases-loader.d.ts +1 -1
  32. package/dist/lib/catalogue/service-contract-aliases-loader.js +1 -1
  33. package/dist/lib/ci-binding/index.d.ts.map +1 -1
  34. package/dist/lib/ci-binding/index.js +44 -5
  35. package/dist/lib/ci-binding/index.js.map +1 -1
  36. package/dist/lib/ci-binding/module.d.ts +10 -0
  37. package/dist/lib/ci-binding/module.d.ts.map +1 -1
  38. package/dist/lib/ci-binding/module.js +74 -2
  39. package/dist/lib/ci-binding/module.js.map +1 -1
  40. package/dist/lib/hooks-seed/entries.d.ts +35 -11
  41. package/dist/lib/hooks-seed/entries.d.ts.map +1 -1
  42. package/dist/lib/hooks-seed/entries.js +43 -21
  43. package/dist/lib/hooks-seed/entries.js.map +1 -1
  44. package/dist/lib/hooks-seed/index.d.ts +2 -1
  45. package/dist/lib/hooks-seed/index.d.ts.map +1 -1
  46. package/dist/lib/hooks-seed/index.js +1 -1
  47. package/dist/lib/hooks-seed/index.js.map +1 -1
  48. package/dist/lib/init/ci-workflow.js +26 -2
  49. package/dist/lib/init/ci-workflow.js.map +1 -1
  50. package/dist/lib/init/platform.d.ts.map +1 -1
  51. package/dist/lib/init/platform.js +1 -0
  52. package/dist/lib/init/platform.js.map +1 -1
  53. package/dist/lib/lock-file.d.ts +7 -0
  54. package/dist/lib/lock-file.d.ts.map +1 -1
  55. package/dist/lib/lock-file.js +10 -0
  56. package/dist/lib/lock-file.js.map +1 -1
  57. package/dist/lib/pack/builder.d.ts +14 -0
  58. package/dist/lib/pack/builder.d.ts.map +1 -1
  59. package/dist/lib/pack/builder.js +56 -4
  60. package/dist/lib/pack/builder.js.map +1 -1
  61. package/dist/lib/pack/index.d.ts +3 -1
  62. package/dist/lib/pack/index.d.ts.map +1 -1
  63. package/dist/lib/pack/index.js +1 -0
  64. package/dist/lib/pack/index.js.map +1 -1
  65. package/dist/lib/pack/publish-transform.js +1 -1
  66. package/dist/lib/pack/publish-transform.js.map +1 -1
  67. package/dist/lib/snapshot/targets.js +1 -1
  68. package/dist/lib/snapshot/targets.js.map +1 -1
  69. package/dist/lib/sync/index.d.ts +11 -0
  70. package/dist/lib/sync/index.d.ts.map +1 -1
  71. package/dist/lib/sync/index.js +26 -2
  72. package/dist/lib/sync/index.js.map +1 -1
  73. package/dist/lib/sync/settings-merge.d.ts +3 -1
  74. package/dist/lib/sync/settings-merge.d.ts.map +1 -1
  75. package/dist/lib/sync/settings-merge.js +1 -1
  76. package/dist/lib/sync/settings-merge.js.map +1 -1
  77. package/dist/lib/validate/plan.d.ts +10 -1
  78. package/dist/lib/validate/plan.d.ts.map +1 -1
  79. package/dist/lib/validate/plan.js +6 -3
  80. package/dist/lib/validate/plan.js.map +1 -1
  81. package/dist/maintain-program.js +1 -1
  82. package/dist/maintain-program.js.map +1 -1
  83. package/dist/maintain-version.json +2 -2
  84. package/dist/verbs/pack-build.d.ts.map +1 -1
  85. package/dist/verbs/pack-build.js +22 -0
  86. package/dist/verbs/pack-build.js.map +1 -1
  87. package/dist/verbs/plan.js +1 -1
  88. package/dist/verbs/plan.js.map +1 -1
  89. package/dist/verbs/sync.d.ts.map +1 -1
  90. package/dist/verbs/sync.js +17 -0
  91. package/dist/verbs/sync.js.map +1 -1
  92. package/dist/verbs/validate.d.ts.map +1 -1
  93. package/dist/verbs/validate.js +6 -1
  94. package/dist/verbs/validate.js.map +1 -1
  95. package/dist/verify-program.js +1 -1
  96. package/dist/verify-program.js.map +1 -1
  97. package/dist/verify-version.json +2 -2
  98. package/package.json +2 -10
  99. package/scripts/README.md +1 -1
  100. package/scripts/author-version.json +2 -2
  101. package/scripts/maintain-acceptance.mjs +3 -2
  102. package/scripts/maintain-version.json +2 -2
  103. package/scripts/publish-release.mjs +117 -0
  104. package/scripts/release-gate.mjs +18 -7
  105. package/scripts/verify-version.json +2 -2
  106. package/dist/lib/catalogue/advisory-container-type.d.ts +0 -13
  107. package/dist/lib/catalogue/advisory-container-type.d.ts.map +0 -1
  108. package/dist/lib/catalogue/advisory-container-type.js +0 -56
  109. package/dist/lib/catalogue/advisory-container-type.js.map +0 -1
  110. package/dist/lib/hooks-seed/copilot.d.ts +0 -93
  111. package/dist/lib/hooks-seed/copilot.d.ts.map +0 -1
  112. package/dist/lib/hooks-seed/copilot.js +0 -167
  113. package/dist/lib/hooks-seed/copilot.js.map +0 -1
  114. package/dist/lib/hooks-seed/lifecycle-mapping.d.ts +0 -12
  115. package/dist/lib/hooks-seed/lifecycle-mapping.d.ts.map +0 -1
  116. package/dist/lib/hooks-seed/lifecycle-mapping.js +0 -28
  117. package/dist/lib/hooks-seed/lifecycle-mapping.js.map +0 -1
  118. package/dist/lib/mcp/build-info.d.ts +0 -7
  119. package/dist/lib/mcp/build-info.d.ts.map +0 -1
  120. package/dist/lib/mcp/build-info.js +0 -10
  121. package/dist/lib/mcp/build-info.js.map +0 -1
  122. package/dist/lib/mcp/errors.d.ts +0 -23
  123. package/dist/lib/mcp/errors.d.ts.map +0 -1
  124. package/dist/lib/mcp/errors.js +0 -25
  125. package/dist/lib/mcp/errors.js.map +0 -1
  126. package/dist/lib/mcp/parse/frontmatter.d.ts +0 -22
  127. package/dist/lib/mcp/parse/frontmatter.d.ts.map +0 -1
  128. package/dist/lib/mcp/parse/frontmatter.js +0 -49
  129. package/dist/lib/mcp/parse/frontmatter.js.map +0 -1
  130. package/dist/lib/mcp/parse/gate-registry.d.ts +0 -78
  131. package/dist/lib/mcp/parse/gate-registry.d.ts.map +0 -1
  132. package/dist/lib/mcp/parse/gate-registry.js +0 -164
  133. package/dist/lib/mcp/parse/gate-registry.js.map +0 -1
  134. package/dist/lib/mcp/parse/paths.d.ts +0 -21
  135. package/dist/lib/mcp/parse/paths.d.ts.map +0 -1
  136. package/dist/lib/mcp/parse/paths.js +0 -84
  137. package/dist/lib/mcp/parse/paths.js.map +0 -1
  138. package/dist/lib/mcp/pin/errors.d.ts +0 -11
  139. package/dist/lib/mcp/pin/errors.d.ts.map +0 -1
  140. package/dist/lib/mcp/pin/errors.js +0 -32
  141. package/dist/lib/mcp/pin/errors.js.map +0 -1
  142. package/dist/lib/mcp/pin/index.d.ts +0 -18
  143. package/dist/lib/mcp/pin/index.d.ts.map +0 -1
  144. package/dist/lib/mcp/pin/index.js +0 -29
  145. package/dist/lib/mcp/pin/index.js.map +0 -1
  146. package/dist/lib/mcp/pin/read.d.ts +0 -24
  147. package/dist/lib/mcp/pin/read.d.ts.map +0 -1
  148. package/dist/lib/mcp/pin/read.js +0 -64
  149. package/dist/lib/mcp/pin/read.js.map +0 -1
  150. package/dist/lib/mcp/pin/resolve.d.ts +0 -12
  151. package/dist/lib/mcp/pin/resolve.d.ts.map +0 -1
  152. package/dist/lib/mcp/pin/resolve.js +0 -33
  153. package/dist/lib/mcp/pin/resolve.js.map +0 -1
  154. package/dist/lib/mcp/prompts/evaluate-cascade.d.ts +0 -14
  155. package/dist/lib/mcp/prompts/evaluate-cascade.d.ts.map +0 -1
  156. package/dist/lib/mcp/prompts/evaluate-cascade.js +0 -147
  157. package/dist/lib/mcp/prompts/evaluate-cascade.js.map +0 -1
  158. package/dist/lib/mcp/prompts/index.d.ts +0 -9
  159. package/dist/lib/mcp/prompts/index.d.ts.map +0 -1
  160. package/dist/lib/mcp/prompts/index.js +0 -23
  161. package/dist/lib/mcp/prompts/index.js.map +0 -1
  162. package/dist/lib/mcp/prompts/propose-adr.d.ts +0 -12
  163. package/dist/lib/mcp/prompts/propose-adr.d.ts.map +0 -1
  164. package/dist/lib/mcp/prompts/propose-adr.js +0 -100
  165. package/dist/lib/mcp/prompts/propose-adr.js.map +0 -1
  166. package/dist/lib/mcp/prompts/review-data-model-change.d.ts +0 -10
  167. package/dist/lib/mcp/prompts/review-data-model-change.d.ts.map +0 -1
  168. package/dist/lib/mcp/prompts/review-data-model-change.js +0 -134
  169. package/dist/lib/mcp/prompts/review-data-model-change.js.map +0 -1
  170. package/dist/lib/mcp/prompts/template-loader.d.ts +0 -29
  171. package/dist/lib/mcp/prompts/template-loader.d.ts.map +0 -1
  172. package/dist/lib/mcp/prompts/template-loader.js +0 -44
  173. package/dist/lib/mcp/prompts/template-loader.js.map +0 -1
  174. package/dist/lib/mcp/prompts/types.d.ts +0 -17
  175. package/dist/lib/mcp/prompts/types.d.ts.map +0 -1
  176. package/dist/lib/mcp/prompts/types.js +0 -10
  177. package/dist/lib/mcp/prompts/types.js.map +0 -1
  178. package/dist/lib/mcp/prompts/write-capability-spec.d.ts +0 -8
  179. package/dist/lib/mcp/prompts/write-capability-spec.d.ts.map +0 -1
  180. package/dist/lib/mcp/prompts/write-capability-spec.js +0 -85
  181. package/dist/lib/mcp/prompts/write-capability-spec.js.map +0 -1
  182. package/dist/lib/mcp/prompts/write-feature-spec.d.ts +0 -10
  183. package/dist/lib/mcp/prompts/write-feature-spec.d.ts.map +0 -1
  184. package/dist/lib/mcp/prompts/write-feature-spec.js +0 -94
  185. package/dist/lib/mcp/prompts/write-feature-spec.js.map +0 -1
  186. package/dist/lib/mcp/prompts/write-work-order.d.ts +0 -7
  187. package/dist/lib/mcp/prompts/write-work-order.d.ts.map +0 -1
  188. package/dist/lib/mcp/prompts/write-work-order.js +0 -69
  189. package/dist/lib/mcp/prompts/write-work-order.js.map +0 -1
  190. package/dist/lib/mcp/reader.d.ts +0 -37
  191. package/dist/lib/mcp/reader.d.ts.map +0 -1
  192. package/dist/lib/mcp/reader.js +0 -93
  193. package/dist/lib/mcp/reader.js.map +0 -1
  194. package/dist/lib/mcp/resources/adrs.d.ts +0 -3
  195. package/dist/lib/mcp/resources/adrs.d.ts.map +0 -1
  196. package/dist/lib/mcp/resources/adrs.js +0 -97
  197. package/dist/lib/mcp/resources/adrs.js.map +0 -1
  198. package/dist/lib/mcp/resources/catalogue.d.ts +0 -19
  199. package/dist/lib/mcp/resources/catalogue.d.ts.map +0 -1
  200. package/dist/lib/mcp/resources/catalogue.js +0 -240
  201. package/dist/lib/mcp/resources/catalogue.js.map +0 -1
  202. package/dist/lib/mcp/resources/data-models.d.ts +0 -14
  203. package/dist/lib/mcp/resources/data-models.d.ts.map +0 -1
  204. package/dist/lib/mcp/resources/data-models.js +0 -81
  205. package/dist/lib/mcp/resources/data-models.js.map +0 -1
  206. package/dist/lib/mcp/resources/gates.d.ts +0 -9
  207. package/dist/lib/mcp/resources/gates.d.ts.map +0 -1
  208. package/dist/lib/mcp/resources/gates.js +0 -76
  209. package/dist/lib/mcp/resources/gates.js.map +0 -1
  210. package/dist/lib/mcp/resources/glossary.d.ts +0 -16
  211. package/dist/lib/mcp/resources/glossary.d.ts.map +0 -1
  212. package/dist/lib/mcp/resources/glossary.js +0 -87
  213. package/dist/lib/mcp/resources/glossary.js.map +0 -1
  214. package/dist/lib/mcp/resources/specs.d.ts +0 -23
  215. package/dist/lib/mcp/resources/specs.d.ts.map +0 -1
  216. package/dist/lib/mcp/resources/specs.js +0 -151
  217. package/dist/lib/mcp/resources/specs.js.map +0 -1
  218. package/dist/lib/mcp/resources/version.d.ts +0 -3
  219. package/dist/lib/mcp/resources/version.d.ts.map +0 -1
  220. package/dist/lib/mcp/resources/version.js +0 -45
  221. package/dist/lib/mcp/resources/version.js.map +0 -1
  222. package/dist/lib/mcp/server.d.ts +0 -29
  223. package/dist/lib/mcp/server.d.ts.map +0 -1
  224. package/dist/lib/mcp/server.js +0 -108
  225. package/dist/lib/mcp/server.js.map +0 -1
  226. package/dist/lib/mcp/tools/cascade-impact.d.ts +0 -22
  227. package/dist/lib/mcp/tools/cascade-impact.d.ts.map +0 -1
  228. package/dist/lib/mcp/tools/cascade-impact.js +0 -53
  229. package/dist/lib/mcp/tools/cascade-impact.js.map +0 -1
  230. package/dist/lib/mcp/tools/catalogue.d.ts +0 -16
  231. package/dist/lib/mcp/tools/catalogue.d.ts.map +0 -1
  232. package/dist/lib/mcp/tools/catalogue.js +0 -268
  233. package/dist/lib/mcp/tools/catalogue.js.map +0 -1
  234. package/dist/lib/mcp/tools/find-consumers-of-contract.d.ts +0 -7
  235. package/dist/lib/mcp/tools/find-consumers-of-contract.d.ts.map +0 -1
  236. package/dist/lib/mcp/tools/find-consumers-of-contract.js +0 -70
  237. package/dist/lib/mcp/tools/find-consumers-of-contract.js.map +0 -1
  238. package/dist/lib/mcp/tools/find-consumers.d.ts +0 -7
  239. package/dist/lib/mcp/tools/find-consumers.d.ts.map +0 -1
  240. package/dist/lib/mcp/tools/find-consumers.js +0 -52
  241. package/dist/lib/mcp/tools/find-consumers.js.map +0 -1
  242. package/dist/lib/mcp/tools/find-dependencies.d.ts +0 -8
  243. package/dist/lib/mcp/tools/find-dependencies.d.ts.map +0 -1
  244. package/dist/lib/mcp/tools/find-dependencies.js +0 -101
  245. package/dist/lib/mcp/tools/find-dependencies.js.map +0 -1
  246. package/dist/lib/mcp/tools/find-dependents.d.ts +0 -8
  247. package/dist/lib/mcp/tools/find-dependents.d.ts.map +0 -1
  248. package/dist/lib/mcp/tools/find-dependents.js +0 -89
  249. package/dist/lib/mcp/tools/find-dependents.js.map +0 -1
  250. package/dist/lib/mcp/tools/find-producers.d.ts +0 -8
  251. package/dist/lib/mcp/tools/find-producers.d.ts.map +0 -1
  252. package/dist/lib/mcp/tools/find-producers.js +0 -57
  253. package/dist/lib/mcp/tools/find-producers.js.map +0 -1
  254. package/dist/lib/mcp/tools/find-related-specs.d.ts +0 -9
  255. package/dist/lib/mcp/tools/find-related-specs.d.ts.map +0 -1
  256. package/dist/lib/mcp/tools/find-related-specs.js +0 -92
  257. package/dist/lib/mcp/tools/find-related-specs.js.map +0 -1
  258. package/dist/lib/mcp/tools/list-adrs.d.ts +0 -3
  259. package/dist/lib/mcp/tools/list-adrs.d.ts.map +0 -1
  260. package/dist/lib/mcp/tools/list-adrs.js +0 -73
  261. package/dist/lib/mcp/tools/list-adrs.js.map +0 -1
  262. package/dist/lib/mcp/tools/query-gate-status.d.ts +0 -3
  263. package/dist/lib/mcp/tools/query-gate-status.d.ts.map +0 -1
  264. package/dist/lib/mcp/tools/query-gate-status.js +0 -68
  265. package/dist/lib/mcp/tools/query-gate-status.js.map +0 -1
  266. package/dist/lib/mcp/tools/search-specs.d.ts +0 -12
  267. package/dist/lib/mcp/tools/search-specs.d.ts.map +0 -1
  268. package/dist/lib/mcp/tools/search-specs.js +0 -151
  269. package/dist/lib/mcp/tools/search-specs.js.map +0 -1
  270. package/dist/lib/mcp/workspace.d.ts +0 -31
  271. package/dist/lib/mcp/workspace.d.ts.map +0 -1
  272. package/dist/lib/mcp/workspace.js +0 -146
  273. package/dist/lib/mcp/workspace.js.map +0 -1
  274. package/dist/lib/mcp-seed/entries.d.ts +0 -32
  275. package/dist/lib/mcp-seed/entries.d.ts.map +0 -1
  276. package/dist/lib/mcp-seed/entries.js +0 -14
  277. package/dist/lib/mcp-seed/entries.js.map +0 -1
  278. package/dist/lib/mcp-seed/index.d.ts +0 -36
  279. package/dist/lib/mcp-seed/index.d.ts.map +0 -1
  280. package/dist/lib/mcp-seed/index.js +0 -28
  281. package/dist/lib/mcp-seed/index.js.map +0 -1
  282. package/dist/lib/mcp-seed/merge.d.ts +0 -34
  283. package/dist/lib/mcp-seed/merge.d.ts.map +0 -1
  284. package/dist/lib/mcp-seed/merge.js +0 -99
  285. package/dist/lib/mcp-seed/merge.js.map +0 -1
  286. package/dist/lib/mcp-seed/types.d.ts +0 -24
  287. package/dist/lib/mcp-seed/types.d.ts.map +0 -1
  288. package/dist/lib/mcp-seed/types.js +0 -13
  289. package/dist/lib/mcp-seed/types.js.map +0 -1
  290. package/dist/lib/sdd-index/cascade.d.ts +0 -46
  291. package/dist/lib/sdd-index/cascade.d.ts.map +0 -1
  292. package/dist/lib/sdd-index/cascade.js +0 -91
  293. package/dist/lib/sdd-index/cascade.js.map +0 -1
  294. package/dist/lib/sdd-index/contracts.d.ts +0 -29
  295. package/dist/lib/sdd-index/contracts.d.ts.map +0 -1
  296. package/dist/lib/sdd-index/contracts.js +0 -216
  297. package/dist/lib/sdd-index/contracts.js.map +0 -1
  298. package/dist/lib/sdd-index/data-model.d.ts +0 -13
  299. package/dist/lib/sdd-index/data-model.d.ts.map +0 -1
  300. package/dist/lib/sdd-index/data-model.js +0 -23
  301. package/dist/lib/sdd-index/data-model.js.map +0 -1
  302. package/dist/lib/sdd-index/execution-map.d.ts +0 -34
  303. package/dist/lib/sdd-index/execution-map.d.ts.map +0 -1
  304. package/dist/lib/sdd-index/execution-map.js +0 -105
  305. package/dist/lib/sdd-index/execution-map.js.map +0 -1
  306. package/dist/lib/sdd-index/graph.d.ts +0 -28
  307. package/dist/lib/sdd-index/graph.d.ts.map +0 -1
  308. package/dist/lib/sdd-index/graph.js +0 -122
  309. package/dist/lib/sdd-index/graph.js.map +0 -1
  310. package/dist/lib/sdd-index/index.d.ts +0 -29
  311. package/dist/lib/sdd-index/index.d.ts.map +0 -1
  312. package/dist/lib/sdd-index/index.js +0 -79
  313. package/dist/lib/sdd-index/index.js.map +0 -1
  314. package/dist/lib/sdd-index/watch.d.ts +0 -24
  315. package/dist/lib/sdd-index/watch.d.ts.map +0 -1
  316. package/dist/lib/sdd-index/watch.js +0 -112
  317. package/dist/lib/sdd-index/watch.js.map +0 -1
  318. package/dist/lib/sync/copilot-hooks-merge.d.ts +0 -36
  319. package/dist/lib/sync/copilot-hooks-merge.d.ts.map +0 -1
  320. package/dist/lib/sync/copilot-hooks-merge.js +0 -108
  321. package/dist/lib/sync/copilot-hooks-merge.js.map +0 -1
  322. package/dist/verbs/mcp.d.ts +0 -3
  323. package/dist/verbs/mcp.d.ts.map +0 -1
  324. package/dist/verbs/mcp.js +0 -22
  325. package/dist/verbs/mcp.js.map +0 -1
@@ -1,85 +0,0 @@
1
- /**
2
- * write_capability_spec — scaffold a capability spec under
3
- * docs/domains/{domain}/product/{capability}.md, bound to
4
- * docs/method/methods/capability-spec-template.md.
5
- */
6
- import { z } from "zod";
7
- import { liveReader } from "../reader.js";
8
- import { loadTemplate, renderMissingTemplateMessage, templateAt, } from "./template-loader.js";
9
- export function register(server, sddRoot) {
10
- server.registerPrompt("write_capability_spec", {
11
- title: "Write a capability spec",
12
- description: "Scaffold a capability spec from the method template. Targets docs/domains/{domain}/product/{capability}.md.",
13
- argsSchema: {
14
- capability_name: z
15
- .string()
16
- .min(1)
17
- .describe("Human-readable capability name (e.g. 'Party Merge'). Will be slugged for the file name."),
18
- domain: z
19
- .string()
20
- .min(1)
21
- .describe("Domain folder name under docs/domains/ (e.g. 'party')."),
22
- classification: z
23
- .string()
24
- .optional()
25
- .describe("Optional: Outcome | Enabler-Runway | Hybrid (ADR 0056 classification)."),
26
- },
27
- }, (args) => {
28
- const reader = liveReader(sddRoot);
29
- const location = templateAt("capability-spec-template.md", "capability spec template");
30
- const loaded = loadTemplate(reader, location);
31
- if (loaded === null) {
32
- return {
33
- messages: [
34
- {
35
- role: "user",
36
- content: {
37
- type: "text",
38
- text: renderMissingTemplateMessage(location, reader.sddRoot, reader.pin),
39
- },
40
- },
41
- ],
42
- };
43
- }
44
- const slug = slugify(args.capability_name);
45
- const preamble = [
46
- `Please scaffold a capability spec for **${args.capability_name}** in the **${args.domain}** domain.`,
47
- "",
48
- "**Inputs:**",
49
- `- **Capability name:** ${args.capability_name}`,
50
- `- **Domain:** ${args.domain}`,
51
- args.classification
52
- ? `- **Classification:** ${args.classification}`
53
- : "- **Classification:** (not provided — pick one of Outcome / Enabler-Runway / Hybrid per ADR 0056)",
54
- "",
55
- "**Target path:**",
56
- `- \`docs/domains/${args.domain}/product/${slug}.md\``,
57
- "",
58
- "Fill the template below, replacing placeholders with concrete content or clear `TODO` notes. Leave the file structure — section headings and frontmatter fields — intact so downstream validators pass.",
59
- "",
60
- "**Template to fill** (verbatim from the SDD):",
61
- "",
62
- "```markdown",
63
- loaded.body.trimEnd(),
64
- "```",
65
- ].join("\n");
66
- return {
67
- messages: [
68
- {
69
- role: "user",
70
- content: { type: "text", text: preamble },
71
- },
72
- ],
73
- };
74
- });
75
- }
76
- function slugify(name) {
77
- return name
78
- .toLowerCase()
79
- .replace(/&/g, "")
80
- .replace(/[^a-z0-9 -]/g, "")
81
- .replace(/\s+/g, "-")
82
- .replace(/-+/g, "-")
83
- .replace(/^-|-$/g, "");
84
- }
85
- //# sourceMappingURL=write-capability-spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-capability-spec.js","sourceRoot":"","sources":["../../../../src/lib/mcp/prompts/write-capability-spec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,4BAA4B,EAC5B,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,OAAe;IACzD,MAAM,CAAC,cAAc,CACnB,uBAAuB,EACvB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,6GAA6G;QAC/G,UAAU,EAAE;YACV,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,yFAAyF,CAC1F;YACH,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,wDAAwD,CAAC;YACrE,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,wEAAwE,CACzE;SACJ;KACF,EACD,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,UAAU,CACzB,6BAA6B,EAC7B,0BAA0B,CAC3B,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,4BAA4B,CAChC,QAAQ,EACR,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,GAAG,CACX;yBACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG;YACf,2CAA2C,IAAI,CAAC,eAAe,eAAe,IAAI,CAAC,MAAM,YAAY;YACrG,EAAE;YACF,aAAa;YACb,0BAA0B,IAAI,CAAC,eAAe,EAAE;YAChD,iBAAiB,IAAI,CAAC,MAAM,EAAE;YAC9B,IAAI,CAAC,cAAc;gBACjB,CAAC,CAAC,yBAAyB,IAAI,CAAC,cAAc,EAAE;gBAChD,CAAC,CAAC,mGAAmG;YACvG,EAAE;YACF,kBAAkB;YAClB,oBAAoB,IAAI,CAAC,MAAM,YAAY,IAAI,OAAO;YACtD,EAAE;YACF,yMAAyM;YACzM,EAAE;YACF,+CAA+C;YAC/C,EAAE;YACF,aAAa;YACb,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;YACrB,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * write_feature_spec — scaffold a feature spec under
3
- * docs/domains/{domain}/product/features/{capability}/{feature}.md.
4
- *
5
- * Binds to docs/method/methods/feature-spec-template.md (default) or
6
- * app-feature-spec-template.md (when variant = "app").
7
- */
8
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
- export declare function register(server: McpServer, sddRoot: string): void;
10
- //# sourceMappingURL=write-feature-spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-feature-spec.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/prompts/write-feature-spec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA0FjE"}
@@ -1,94 +0,0 @@
1
- /**
2
- * write_feature_spec — scaffold a feature spec under
3
- * docs/domains/{domain}/product/features/{capability}/{feature}.md.
4
- *
5
- * Binds to docs/method/methods/feature-spec-template.md (default) or
6
- * app-feature-spec-template.md (when variant = "app").
7
- */
8
- import { z } from "zod";
9
- import { liveReader } from "../reader.js";
10
- import { loadTemplate, renderMissingTemplateMessage, templateAt, } from "./template-loader.js";
11
- export function register(server, sddRoot) {
12
- server.registerPrompt("write_feature_spec", {
13
- title: "Write a feature spec",
14
- description: "Scaffold a feature spec from the method template. Targets docs/domains/{domain}/product/features/{capability}/{feature}.md. Select `variant: \"app\"` for the application-profile template.",
15
- argsSchema: {
16
- feature_name: z
17
- .string()
18
- .min(1)
19
- .describe("Human-readable feature name. Will be slugged for the file."),
20
- capability: z
21
- .string()
22
- .min(1)
23
- .describe("Capability slug this feature belongs to (e.g. 'party-merge')."),
24
- domain: z
25
- .string()
26
- .min(1)
27
- .describe("Domain folder name under docs/domains/."),
28
- variant: z
29
- .enum(["platform", "app"])
30
- .optional()
31
- .describe("Which template variant to bind to. Default: platform."),
32
- },
33
- }, (args) => {
34
- const reader = liveReader(sddRoot);
35
- const variant = args.variant ?? "platform";
36
- const templateName = variant === "app"
37
- ? "app-feature-spec-template.md"
38
- : "feature-spec-template.md";
39
- const location = templateAt(templateName, `${variant} feature spec template`);
40
- const loaded = loadTemplate(reader, location);
41
- if (loaded === null) {
42
- return {
43
- messages: [
44
- {
45
- role: "user",
46
- content: {
47
- type: "text",
48
- text: renderMissingTemplateMessage(location, reader.sddRoot, reader.pin),
49
- },
50
- },
51
- ],
52
- };
53
- }
54
- const featureSlug = slugify(args.feature_name);
55
- const preamble = [
56
- `Please scaffold a **${variant}-profile** feature spec for **${args.feature_name}**, part of capability **${args.capability}** in domain **${args.domain}**.`,
57
- "",
58
- "**Inputs:**",
59
- `- **Feature name:** ${args.feature_name}`,
60
- `- **Capability:** ${args.capability}`,
61
- `- **Domain:** ${args.domain}`,
62
- `- **Variant:** ${variant}`,
63
- "",
64
- "**Target path:**",
65
- `- \`docs/domains/${args.domain}/product/features/${args.capability}/${featureSlug}.md\``,
66
- "",
67
- "Fill the template below, replacing placeholders with concrete content or clear `TODO` notes. Preserve section headings and frontmatter so downstream validators pass.",
68
- "",
69
- "**Template to fill** (verbatim from the SDD):",
70
- "",
71
- "```markdown",
72
- loaded.body.trimEnd(),
73
- "```",
74
- ].join("\n");
75
- return {
76
- messages: [
77
- {
78
- role: "user",
79
- content: { type: "text", text: preamble },
80
- },
81
- ],
82
- };
83
- });
84
- }
85
- function slugify(name) {
86
- return name
87
- .toLowerCase()
88
- .replace(/&/g, "")
89
- .replace(/[^a-z0-9 -]/g, "")
90
- .replace(/\s+/g, "-")
91
- .replace(/-+/g, "-")
92
- .replace(/^-|-$/g, "");
93
- }
94
- //# sourceMappingURL=write-feature-spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-feature-spec.js","sourceRoot":"","sources":["../../../../src/lib/mcp/prompts/write-feature-spec.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * write_work_order — scaffold a work-order document from
3
- * docs/method/methods/work-order-template.md.
4
- */
5
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
- export declare function register(server: McpServer, sddRoot: string): void;
7
- //# sourceMappingURL=write-work-order.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-work-order.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/prompts/write-work-order.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA8EjE"}
@@ -1,69 +0,0 @@
1
- /**
2
- * write_work_order — scaffold a work-order document from
3
- * docs/method/methods/work-order-template.md.
4
- */
5
- import { z } from "zod";
6
- import { liveReader } from "../reader.js";
7
- import { loadTemplate, renderMissingTemplateMessage, templateAt, } from "./template-loader.js";
8
- export function register(server, sddRoot) {
9
- server.registerPrompt("write_work_order", {
10
- title: "Write a work order",
11
- description: "Scaffold a work order from the method template. Work orders are the method's unit of delivery authorisation; see docs/method/methods/work-order-template.md for the shape.",
12
- argsSchema: {
13
- unit_id: z
14
- .string()
15
- .min(1)
16
- .describe("Work-order identifier (e.g. 'WO-2026-042' or a feature/capability slug)."),
17
- scope: z
18
- .string()
19
- .min(1)
20
- .describe("What the work order covers — can be a capability, a feature, an ADR, or a cross-scope initiative."),
21
- kind: z
22
- .string()
23
- .optional()
24
- .describe("Optional: feature | capability | migration | spike | other."),
25
- },
26
- }, (args) => {
27
- const reader = liveReader(sddRoot);
28
- const location = templateAt("work-order-template.md", "work order template");
29
- const loaded = loadTemplate(reader, location);
30
- if (loaded === null) {
31
- return {
32
- messages: [
33
- {
34
- role: "user",
35
- content: {
36
- type: "text",
37
- text: renderMissingTemplateMessage(location, reader.sddRoot, reader.pin),
38
- },
39
- },
40
- ],
41
- };
42
- }
43
- const preamble = [
44
- `Please scaffold a work order for **${args.unit_id}** covering **${args.scope}**.`,
45
- "",
46
- "**Inputs:**",
47
- `- **Unit ID:** ${args.unit_id}`,
48
- `- **Scope:** ${args.scope}`,
49
- args.kind ? `- **Kind:** ${args.kind}` : "- **Kind:** (not provided)",
50
- "",
51
- "Fill the template below; preserve section headings so downstream tooling recognises the shape.",
52
- "",
53
- "**Template to fill** (verbatim from the SDD):",
54
- "",
55
- "```markdown",
56
- loaded.body.trimEnd(),
57
- "```",
58
- ].join("\n");
59
- return {
60
- messages: [
61
- {
62
- role: "user",
63
- content: { type: "text", text: preamble },
64
- },
65
- ],
66
- };
67
- });
68
- }
69
- //# sourceMappingURL=write-work-order.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-work-order.js","sourceRoot":"","sources":["../../../../src/lib/mcp/prompts/write-work-order.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,4BAA4B,EAC5B,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,OAAe;IACzD,MAAM,CAAC,cAAc,CACnB,kBAAkB,EAClB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,4KAA4K;QAC9K,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,0EAA0E,CAC3E;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,mGAAmG,CACpG;YACH,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6DAA6D,CAAC;SAC3E;KACF,EACD,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,UAAU,CACzB,wBAAwB,EACxB,qBAAqB,CACtB,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,4BAA4B,CAChC,QAAQ,EACR,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,GAAG,CACX;yBACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,sCAAsC,IAAI,CAAC,OAAO,iBAAiB,IAAI,CAAC,KAAK,KAAK;YAClF,EAAE;YACF,aAAa;YACb,kBAAkB,IAAI,CAAC,OAAO,EAAE;YAChC,gBAAgB,IAAI,CAAC,KAAK,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,4BAA4B;YACrE,EAAE;YACF,gGAAgG;YAChG,EAAE;YACF,+CAA+C;YAC/C,EAAE;YACF,aAAa;YACb,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;YACrB,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,37 +0,0 @@
1
- /**
2
- * SDD content access abstraction. Phase 2 tools query against an
3
- * `SddReader` so that a single code path serves both live (working-tree)
4
- * reads and pinned (git object tree) reads.
5
- *
6
- * Live reads: wrap node:fs.
7
- * Pinned reads: wrap `git cat-file -p <sha>:<path>` (see src/lib/mcp/pin/).
8
- *
9
- * Relative paths are rooted at the SDD repo root; absolute paths are
10
- * rejected so that callers cannot accidentally escape the SDD.
11
- */
12
- export interface SddReader {
13
- /** Absolute path to the SDD root. Stable for the reader's lifetime. */
14
- readonly sddRoot: string;
15
- /**
16
- * Commit SHA echoed in tool responses. "HEAD" for a live reader; the
17
- * resolved SHA for a pinned reader.
18
- */
19
- readonly pin: string;
20
- /** Returns file contents as utf8, or null if the file does not exist. */
21
- readFile(relPath: string): string | null;
22
- /** Returns directory entry names (non-recursive), or [] if missing. */
23
- listDir(relPath: string): string[];
24
- /** True if the path exists and is a regular file. */
25
- isFile(relPath: string): boolean;
26
- /** True if the path exists and is a directory. */
27
- isDir(relPath: string): boolean;
28
- }
29
- export declare function liveReader(sddRoot: string, pin?: string): SddReader;
30
- /**
31
- * Recursive directory walk. Returns relative paths (from SDD root) of
32
- * every regular file under `relRoot` that matches the optional filter.
33
- * Depth-first, lexicographically sorted at each level for deterministic
34
- * index contents.
35
- */
36
- export declare function walkFiles(reader: SddReader, relRoot: string, filter?: (relPath: string) => boolean): string[];
37
- //# sourceMappingURL=reader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC,uEAAuE;IACvE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACnC,qDAAqD;IACrD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,kDAAkD;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,CA8CnE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACpC,MAAM,EAAE,CAmBV"}
@@ -1,93 +0,0 @@
1
- /**
2
- * SDD content access abstraction. Phase 2 tools query against an
3
- * `SddReader` so that a single code path serves both live (working-tree)
4
- * reads and pinned (git object tree) reads.
5
- *
6
- * Live reads: wrap node:fs.
7
- * Pinned reads: wrap `git cat-file -p <sha>:<path>` (see src/lib/mcp/pin/).
8
- *
9
- * Relative paths are rooted at the SDD repo root; absolute paths are
10
- * rejected so that callers cannot accidentally escape the SDD.
11
- */
12
- import { readdirSync, readFileSync, statSync } from "node:fs";
13
- import { isAbsolute, join } from "node:path";
14
- export function liveReader(sddRoot, pin = "HEAD") {
15
- const root = sddRoot;
16
- const check = (relPath) => {
17
- if (isAbsolute(relPath)) {
18
- throw new Error(`SddReader paths must be relative to the SDD root; got ${relPath}`);
19
- }
20
- return join(root, relPath);
21
- };
22
- return {
23
- sddRoot: root,
24
- pin,
25
- readFile(relPath) {
26
- const full = check(relPath);
27
- try {
28
- return readFileSync(full, "utf8");
29
- }
30
- catch {
31
- return null;
32
- }
33
- },
34
- listDir(relPath) {
35
- const full = check(relPath);
36
- try {
37
- return readdirSync(full);
38
- }
39
- catch {
40
- return [];
41
- }
42
- },
43
- isFile(relPath) {
44
- const full = check(relPath);
45
- try {
46
- return statSync(full).isFile();
47
- }
48
- catch {
49
- return false;
50
- }
51
- },
52
- isDir(relPath) {
53
- const full = check(relPath);
54
- try {
55
- return statSync(full).isDirectory();
56
- }
57
- catch {
58
- return false;
59
- }
60
- },
61
- };
62
- }
63
- /**
64
- * Recursive directory walk. Returns relative paths (from SDD root) of
65
- * every regular file under `relRoot` that matches the optional filter.
66
- * Depth-first, lexicographically sorted at each level for deterministic
67
- * index contents.
68
- */
69
- export function walkFiles(reader, relRoot, filter) {
70
- const out = [];
71
- if (!reader.isDir(relRoot))
72
- return out;
73
- const stack = [relRoot];
74
- while (stack.length > 0) {
75
- const dir = stack.pop();
76
- if (dir === undefined)
77
- break;
78
- const entries = reader.listDir(dir).sort();
79
- for (const entry of entries) {
80
- const child = dir === "" ? entry : `${dir}/${entry}`;
81
- if (reader.isDir(child)) {
82
- stack.push(child);
83
- }
84
- else if (reader.isFile(child)) {
85
- if (!filter || filter(child))
86
- out.push(child);
87
- }
88
- }
89
- }
90
- out.sort();
91
- return out;
92
- }
93
- //# sourceMappingURL=reader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/lib/mcp/reader.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function register(server: McpServer, sddRoot: string): void;
3
- //# sourceMappingURL=adrs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adrs.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/adrs.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EAEV,MAAM,yCAAyC,CAAC;AAKjD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA4GjE"}
@@ -1,97 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { McpEnvelopeError } from "../errors.js";
5
- import { parseAdrMetadata } from "../parse/frontmatter.js";
6
- import { discoverAdrs, findAdr, safeIsFile } from "../parse/paths.js";
7
- export function register(server, sddRoot) {
8
- server.registerResource("adr-catalogue", "sdd://adrs/catalogue", {
9
- title: "ADR catalogue",
10
- description: "Machine-readable summary of every ADR discovered under docs/method/adr, docs/platform/adr, and docs/domains/{domain}/adr.",
11
- mimeType: "application/json",
12
- }, async () => {
13
- const adrs = discoverAdrs(sddRoot);
14
- const entries = adrs.map((a) => {
15
- const metadata = parseAdrMetadata(readFileSync(a.path, "utf8"));
16
- return {
17
- number: a.number,
18
- scope: a.scope,
19
- title: metadata.title || a.title,
20
- status: metadata.status ?? null,
21
- date: metadata.date ?? null,
22
- decision_type: metadata.decisionType ?? null,
23
- path: a.path,
24
- uri: `sdd://adrs/${a.scope}/${a.number}`,
25
- };
26
- });
27
- const catalogueRelPath = join("docs", "method", "architecture-decisions.md");
28
- const cataloguePath = join(sddRoot, catalogueRelPath);
29
- const payload = {
30
- sdd_root: sddRoot,
31
- catalogue_doc: safeIsFile(cataloguePath)
32
- ? catalogueRelPath
33
- : null,
34
- total: entries.length,
35
- adrs: entries,
36
- };
37
- return {
38
- contents: [
39
- {
40
- uri: "sdd://adrs/catalogue",
41
- mimeType: "application/json",
42
- text: JSON.stringify(payload, null, 2),
43
- },
44
- ],
45
- };
46
- });
47
- server.registerResource("adr", new ResourceTemplate("sdd://adrs/{scope}/{number}", {
48
- list: async () => {
49
- const adrs = discoverAdrs(sddRoot);
50
- return {
51
- resources: adrs.map((a) => ({
52
- uri: `sdd://adrs/${a.scope}/${a.number}`,
53
- name: `ADR ${a.number} — ${a.title}`,
54
- mimeType: "text/markdown",
55
- })),
56
- };
57
- },
58
- }), {
59
- title: "ADR",
60
- description: "Full markdown body of an ADR identified by scope (method / platform / domain:<name>) and four-digit number.",
61
- mimeType: "text/markdown",
62
- }, async (uri, { scope, number }) => {
63
- if (typeof scope !== "string" || typeof number !== "string") {
64
- throw new McpEnvelopeError({
65
- code: "ADR_URI_INVALID",
66
- message: `ADR URI ${uri.href} is missing required {scope} or {number} parameters.`,
67
- remediation: "Use the shape sdd://adrs/{scope}/{number} where scope is one of: method, platform, domain:<name>.",
68
- context: { uri: uri.href },
69
- });
70
- }
71
- const adr = findAdr(sddRoot, scope, number);
72
- if (!adr) {
73
- throw new McpEnvelopeError({
74
- code: "ADR_NOT_FOUND",
75
- message: `No ADR found for scope=${scope} number=${number} under SDD root ${sddRoot}.`,
76
- remediation: "Verify the ADR number is zero-padded to 4 digits (e.g. 0128) and the scope matches where the ADR lives. Call sdd://adrs/catalogue to see every ADR the server can find.",
77
- context: {
78
- scope,
79
- number,
80
- sdd_root: sddRoot,
81
- hint: "sdd://adrs/catalogue",
82
- },
83
- });
84
- }
85
- const body = readFileSync(adr.path, "utf8");
86
- return {
87
- contents: [
88
- {
89
- uri: uri.href,
90
- mimeType: "text/markdown",
91
- text: body,
92
- },
93
- ],
94
- };
95
- });
96
- }
97
- //# sourceMappingURL=adrs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adrs.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/adrs.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Catalogue resources (sdd-mcp Phase 8).
3
- *
4
- * Exposes the canonical catalogue schema + metamodel + category taxonomy,
5
- * and the consumer repo's built catalogue rows, as read-only MCP resources.
6
- * Mirrors the resource pattern in resources/adrs.ts / resources/data-models.ts
7
- * and reuses the existing catalogue subsystem (schema-loader, csv-reader)
8
- * rather than re-parsing.
9
- *
10
- * URIs:
11
- * sdd://catalogue/schema — canonical schema (vendored), parsed to JSON
12
- * sdd://catalogue/metamodel — catalogue-metamodel.md (synced markdown)
13
- * sdd://catalogue/category-taxonomy — product-category-taxonomy.md (synced markdown)
14
- * sdd://catalogue — list of catalogue names present in catalogues/
15
- * sdd://catalogue/{name} — rows of one catalogue from catalogues/{name}.csv
16
- */
17
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
18
- export declare function register(server: McpServer, sddRoot: string): void;
19
- //# sourceMappingURL=catalogue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalogue.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/catalogue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EACL,SAAS,EAEV,MAAM,yCAAyC,CAAC;AAoFjD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA4LjE"}