@sdd-method/sdd-cli 0.9.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 (373) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +17 -0
  3. package/README.md +151 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +8 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +66 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/lib/bundle.d.ts +20 -0
  13. package/dist/lib/bundle.d.ts.map +1 -0
  14. package/dist/lib/bundle.js +75 -0
  15. package/dist/lib/bundle.js.map +1 -0
  16. package/dist/lib/generate-claude-md/index.d.ts +16 -0
  17. package/dist/lib/generate-claude-md/index.d.ts.map +1 -0
  18. package/dist/lib/generate-claude-md/index.js +89 -0
  19. package/dist/lib/generate-claude-md/index.js.map +1 -0
  20. package/dist/lib/hooks-seed/entries.d.ts +16 -0
  21. package/dist/lib/hooks-seed/entries.d.ts.map +1 -0
  22. package/dist/lib/hooks-seed/entries.js +47 -0
  23. package/dist/lib/hooks-seed/entries.js.map +1 -0
  24. package/dist/lib/hooks-seed/index.d.ts +17 -0
  25. package/dist/lib/hooks-seed/index.d.ts.map +1 -0
  26. package/dist/lib/hooks-seed/index.js +15 -0
  27. package/dist/lib/hooks-seed/index.js.map +1 -0
  28. package/dist/lib/hooks-seed/merge.d.ts +24 -0
  29. package/dist/lib/hooks-seed/merge.d.ts.map +1 -0
  30. package/dist/lib/hooks-seed/merge.js +73 -0
  31. package/dist/lib/hooks-seed/merge.js.map +1 -0
  32. package/dist/lib/hooks-seed/types.d.ts +27 -0
  33. package/dist/lib/hooks-seed/types.d.ts.map +1 -0
  34. package/dist/lib/hooks-seed/types.js +20 -0
  35. package/dist/lib/hooks-seed/types.js.map +1 -0
  36. package/dist/lib/init/app.d.ts +21 -0
  37. package/dist/lib/init/app.d.ts.map +1 -0
  38. package/dist/lib/init/app.js +132 -0
  39. package/dist/lib/init/app.js.map +1 -0
  40. package/dist/lib/init/ci-workflow.d.ts +29 -0
  41. package/dist/lib/init/ci-workflow.d.ts.map +1 -0
  42. package/dist/lib/init/ci-workflow.js +78 -0
  43. package/dist/lib/init/ci-workflow.js.map +1 -0
  44. package/dist/lib/init/claude-md.d.ts +19 -0
  45. package/dist/lib/init/claude-md.d.ts.map +1 -0
  46. package/dist/lib/init/claude-md.js +140 -0
  47. package/dist/lib/init/claude-md.js.map +1 -0
  48. package/dist/lib/init/index.d.ts +33 -0
  49. package/dist/lib/init/index.d.ts.map +1 -0
  50. package/dist/lib/init/index.js +232 -0
  51. package/dist/lib/init/index.js.map +1 -0
  52. package/dist/lib/init/integration.d.ts +53 -0
  53. package/dist/lib/init/integration.d.ts.map +1 -0
  54. package/dist/lib/init/integration.js +237 -0
  55. package/dist/lib/init/integration.js.map +1 -0
  56. package/dist/lib/init/platform.d.ts +26 -0
  57. package/dist/lib/init/platform.d.ts.map +1 -0
  58. package/dist/lib/init/platform.js +188 -0
  59. package/dist/lib/init/platform.js.map +1 -0
  60. package/dist/lib/list/discover.d.ts +8 -0
  61. package/dist/lib/list/discover.d.ts.map +1 -0
  62. package/dist/lib/list/discover.js +77 -0
  63. package/dist/lib/list/discover.js.map +1 -0
  64. package/dist/lib/list/format.d.ts +9 -0
  65. package/dist/lib/list/format.d.ts.map +1 -0
  66. package/dist/lib/list/format.js +44 -0
  67. package/dist/lib/list/format.js.map +1 -0
  68. package/dist/lib/list/index.d.ts +12 -0
  69. package/dist/lib/list/index.d.ts.map +1 -0
  70. package/dist/lib/list/index.js +15 -0
  71. package/dist/lib/list/index.js.map +1 -0
  72. package/dist/lib/lock-file.d.ts +14 -0
  73. package/dist/lib/lock-file.d.ts.map +1 -0
  74. package/dist/lib/lock-file.js +80 -0
  75. package/dist/lib/lock-file.js.map +1 -0
  76. package/dist/lib/mcp/build-info.d.ts +9 -0
  77. package/dist/lib/mcp/build-info.d.ts.map +1 -0
  78. package/dist/lib/mcp/build-info.js +10 -0
  79. package/dist/lib/mcp/build-info.js.map +1 -0
  80. package/dist/lib/mcp/errors.d.ts +23 -0
  81. package/dist/lib/mcp/errors.d.ts.map +1 -0
  82. package/dist/lib/mcp/errors.js +25 -0
  83. package/dist/lib/mcp/errors.js.map +1 -0
  84. package/dist/lib/mcp/parse/frontmatter.d.ts +22 -0
  85. package/dist/lib/mcp/parse/frontmatter.d.ts.map +1 -0
  86. package/dist/lib/mcp/parse/frontmatter.js +49 -0
  87. package/dist/lib/mcp/parse/frontmatter.js.map +1 -0
  88. package/dist/lib/mcp/parse/gate-registry.d.ts +19 -0
  89. package/dist/lib/mcp/parse/gate-registry.d.ts.map +1 -0
  90. package/dist/lib/mcp/parse/gate-registry.js +68 -0
  91. package/dist/lib/mcp/parse/gate-registry.js.map +1 -0
  92. package/dist/lib/mcp/parse/paths.d.ts +21 -0
  93. package/dist/lib/mcp/parse/paths.d.ts.map +1 -0
  94. package/dist/lib/mcp/parse/paths.js +83 -0
  95. package/dist/lib/mcp/parse/paths.js.map +1 -0
  96. package/dist/lib/mcp/pin/errors.d.ts +11 -0
  97. package/dist/lib/mcp/pin/errors.d.ts.map +1 -0
  98. package/dist/lib/mcp/pin/errors.js +32 -0
  99. package/dist/lib/mcp/pin/errors.js.map +1 -0
  100. package/dist/lib/mcp/pin/index.d.ts +18 -0
  101. package/dist/lib/mcp/pin/index.d.ts.map +1 -0
  102. package/dist/lib/mcp/pin/index.js +29 -0
  103. package/dist/lib/mcp/pin/index.js.map +1 -0
  104. package/dist/lib/mcp/pin/read.d.ts +24 -0
  105. package/dist/lib/mcp/pin/read.d.ts.map +1 -0
  106. package/dist/lib/mcp/pin/read.js +64 -0
  107. package/dist/lib/mcp/pin/read.js.map +1 -0
  108. package/dist/lib/mcp/pin/resolve.d.ts +12 -0
  109. package/dist/lib/mcp/pin/resolve.d.ts.map +1 -0
  110. package/dist/lib/mcp/pin/resolve.js +33 -0
  111. package/dist/lib/mcp/pin/resolve.js.map +1 -0
  112. package/dist/lib/mcp/prompts/evaluate-cascade.d.ts +14 -0
  113. package/dist/lib/mcp/prompts/evaluate-cascade.d.ts.map +1 -0
  114. package/dist/lib/mcp/prompts/evaluate-cascade.js +147 -0
  115. package/dist/lib/mcp/prompts/evaluate-cascade.js.map +1 -0
  116. package/dist/lib/mcp/prompts/index.d.ts +9 -0
  117. package/dist/lib/mcp/prompts/index.d.ts.map +1 -0
  118. package/dist/lib/mcp/prompts/index.js +23 -0
  119. package/dist/lib/mcp/prompts/index.js.map +1 -0
  120. package/dist/lib/mcp/prompts/propose-adr.d.ts +12 -0
  121. package/dist/lib/mcp/prompts/propose-adr.d.ts.map +1 -0
  122. package/dist/lib/mcp/prompts/propose-adr.js +94 -0
  123. package/dist/lib/mcp/prompts/propose-adr.js.map +1 -0
  124. package/dist/lib/mcp/prompts/review-data-model-change.d.ts +10 -0
  125. package/dist/lib/mcp/prompts/review-data-model-change.d.ts.map +1 -0
  126. package/dist/lib/mcp/prompts/review-data-model-change.js +134 -0
  127. package/dist/lib/mcp/prompts/review-data-model-change.js.map +1 -0
  128. package/dist/lib/mcp/prompts/template-loader.d.ts +29 -0
  129. package/dist/lib/mcp/prompts/template-loader.d.ts.map +1 -0
  130. package/dist/lib/mcp/prompts/template-loader.js +44 -0
  131. package/dist/lib/mcp/prompts/template-loader.js.map +1 -0
  132. package/dist/lib/mcp/prompts/types.d.ts +17 -0
  133. package/dist/lib/mcp/prompts/types.d.ts.map +1 -0
  134. package/dist/lib/mcp/prompts/types.js +10 -0
  135. package/dist/lib/mcp/prompts/types.js.map +1 -0
  136. package/dist/lib/mcp/prompts/write-capability-spec.d.ts +8 -0
  137. package/dist/lib/mcp/prompts/write-capability-spec.d.ts.map +1 -0
  138. package/dist/lib/mcp/prompts/write-capability-spec.js +85 -0
  139. package/dist/lib/mcp/prompts/write-capability-spec.js.map +1 -0
  140. package/dist/lib/mcp/prompts/write-feature-spec.d.ts +10 -0
  141. package/dist/lib/mcp/prompts/write-feature-spec.d.ts.map +1 -0
  142. package/dist/lib/mcp/prompts/write-feature-spec.js +94 -0
  143. package/dist/lib/mcp/prompts/write-feature-spec.js.map +1 -0
  144. package/dist/lib/mcp/prompts/write-work-order.d.ts +7 -0
  145. package/dist/lib/mcp/prompts/write-work-order.d.ts.map +1 -0
  146. package/dist/lib/mcp/prompts/write-work-order.js +69 -0
  147. package/dist/lib/mcp/prompts/write-work-order.js.map +1 -0
  148. package/dist/lib/mcp/reader.d.ts +37 -0
  149. package/dist/lib/mcp/reader.d.ts.map +1 -0
  150. package/dist/lib/mcp/reader.js +93 -0
  151. package/dist/lib/mcp/reader.js.map +1 -0
  152. package/dist/lib/mcp/resources/adrs.d.ts +3 -0
  153. package/dist/lib/mcp/resources/adrs.d.ts.map +1 -0
  154. package/dist/lib/mcp/resources/adrs.js +97 -0
  155. package/dist/lib/mcp/resources/adrs.js.map +1 -0
  156. package/dist/lib/mcp/resources/data-models.d.ts +14 -0
  157. package/dist/lib/mcp/resources/data-models.d.ts.map +1 -0
  158. package/dist/lib/mcp/resources/data-models.js +81 -0
  159. package/dist/lib/mcp/resources/data-models.js.map +1 -0
  160. package/dist/lib/mcp/resources/gates.d.ts +9 -0
  161. package/dist/lib/mcp/resources/gates.d.ts.map +1 -0
  162. package/dist/lib/mcp/resources/gates.js +90 -0
  163. package/dist/lib/mcp/resources/gates.js.map +1 -0
  164. package/dist/lib/mcp/resources/glossary.d.ts +16 -0
  165. package/dist/lib/mcp/resources/glossary.d.ts.map +1 -0
  166. package/dist/lib/mcp/resources/glossary.js +87 -0
  167. package/dist/lib/mcp/resources/glossary.js.map +1 -0
  168. package/dist/lib/mcp/resources/specs.d.ts +23 -0
  169. package/dist/lib/mcp/resources/specs.d.ts.map +1 -0
  170. package/dist/lib/mcp/resources/specs.js +151 -0
  171. package/dist/lib/mcp/resources/specs.js.map +1 -0
  172. package/dist/lib/mcp/resources/version.d.ts +3 -0
  173. package/dist/lib/mcp/resources/version.d.ts.map +1 -0
  174. package/dist/lib/mcp/resources/version.js +45 -0
  175. package/dist/lib/mcp/resources/version.js.map +1 -0
  176. package/dist/lib/mcp/server.d.ts +29 -0
  177. package/dist/lib/mcp/server.d.ts.map +1 -0
  178. package/dist/lib/mcp/server.js +104 -0
  179. package/dist/lib/mcp/server.js.map +1 -0
  180. package/dist/lib/mcp/tools/cascade-impact.d.ts +22 -0
  181. package/dist/lib/mcp/tools/cascade-impact.d.ts.map +1 -0
  182. package/dist/lib/mcp/tools/cascade-impact.js +53 -0
  183. package/dist/lib/mcp/tools/cascade-impact.js.map +1 -0
  184. package/dist/lib/mcp/tools/find-consumers-of-contract.d.ts +7 -0
  185. package/dist/lib/mcp/tools/find-consumers-of-contract.d.ts.map +1 -0
  186. package/dist/lib/mcp/tools/find-consumers-of-contract.js +70 -0
  187. package/dist/lib/mcp/tools/find-consumers-of-contract.js.map +1 -0
  188. package/dist/lib/mcp/tools/find-consumers.d.ts +7 -0
  189. package/dist/lib/mcp/tools/find-consumers.d.ts.map +1 -0
  190. package/dist/lib/mcp/tools/find-consumers.js +52 -0
  191. package/dist/lib/mcp/tools/find-consumers.js.map +1 -0
  192. package/dist/lib/mcp/tools/find-dependencies.d.ts +8 -0
  193. package/dist/lib/mcp/tools/find-dependencies.d.ts.map +1 -0
  194. package/dist/lib/mcp/tools/find-dependencies.js +89 -0
  195. package/dist/lib/mcp/tools/find-dependencies.js.map +1 -0
  196. package/dist/lib/mcp/tools/find-dependents.d.ts +8 -0
  197. package/dist/lib/mcp/tools/find-dependents.d.ts.map +1 -0
  198. package/dist/lib/mcp/tools/find-dependents.js +89 -0
  199. package/dist/lib/mcp/tools/find-dependents.js.map +1 -0
  200. package/dist/lib/mcp/tools/find-producers.d.ts +8 -0
  201. package/dist/lib/mcp/tools/find-producers.d.ts.map +1 -0
  202. package/dist/lib/mcp/tools/find-producers.js +57 -0
  203. package/dist/lib/mcp/tools/find-producers.js.map +1 -0
  204. package/dist/lib/mcp/tools/find-related-specs.d.ts +9 -0
  205. package/dist/lib/mcp/tools/find-related-specs.d.ts.map +1 -0
  206. package/dist/lib/mcp/tools/find-related-specs.js +92 -0
  207. package/dist/lib/mcp/tools/find-related-specs.js.map +1 -0
  208. package/dist/lib/mcp/tools/list-adrs.d.ts +3 -0
  209. package/dist/lib/mcp/tools/list-adrs.d.ts.map +1 -0
  210. package/dist/lib/mcp/tools/list-adrs.js +73 -0
  211. package/dist/lib/mcp/tools/list-adrs.js.map +1 -0
  212. package/dist/lib/mcp/tools/query-gate-status.d.ts +3 -0
  213. package/dist/lib/mcp/tools/query-gate-status.d.ts.map +1 -0
  214. package/dist/lib/mcp/tools/query-gate-status.js +82 -0
  215. package/dist/lib/mcp/tools/query-gate-status.js.map +1 -0
  216. package/dist/lib/mcp/tools/search-specs.d.ts +12 -0
  217. package/dist/lib/mcp/tools/search-specs.d.ts.map +1 -0
  218. package/dist/lib/mcp/tools/search-specs.js +151 -0
  219. package/dist/lib/mcp/tools/search-specs.js.map +1 -0
  220. package/dist/lib/mcp/workspace.d.ts +25 -0
  221. package/dist/lib/mcp/workspace.d.ts.map +1 -0
  222. package/dist/lib/mcp/workspace.js +129 -0
  223. package/dist/lib/mcp/workspace.js.map +1 -0
  224. package/dist/lib/mcp-seed/entries.d.ts +19 -0
  225. package/dist/lib/mcp-seed/entries.d.ts.map +1 -0
  226. package/dist/lib/mcp-seed/entries.js +14 -0
  227. package/dist/lib/mcp-seed/entries.js.map +1 -0
  228. package/dist/lib/mcp-seed/index.d.ts +36 -0
  229. package/dist/lib/mcp-seed/index.d.ts.map +1 -0
  230. package/dist/lib/mcp-seed/index.js +28 -0
  231. package/dist/lib/mcp-seed/index.js.map +1 -0
  232. package/dist/lib/mcp-seed/merge.d.ts +34 -0
  233. package/dist/lib/mcp-seed/merge.d.ts.map +1 -0
  234. package/dist/lib/mcp-seed/merge.js +99 -0
  235. package/dist/lib/mcp-seed/merge.js.map +1 -0
  236. package/dist/lib/mcp-seed/types.d.ts +24 -0
  237. package/dist/lib/mcp-seed/types.d.ts.map +1 -0
  238. package/dist/lib/mcp-seed/types.js +13 -0
  239. package/dist/lib/mcp-seed/types.js.map +1 -0
  240. package/dist/lib/plan/index.d.ts +19 -0
  241. package/dist/lib/plan/index.d.ts.map +1 -0
  242. package/dist/lib/plan/index.js +69 -0
  243. package/dist/lib/plan/index.js.map +1 -0
  244. package/dist/lib/plan/read-sdd.d.ts +46 -0
  245. package/dist/lib/plan/read-sdd.d.ts.map +1 -0
  246. package/dist/lib/plan/read-sdd.js +102 -0
  247. package/dist/lib/plan/read-sdd.js.map +1 -0
  248. package/dist/lib/plan/render-template.d.ts +8 -0
  249. package/dist/lib/plan/render-template.d.ts.map +1 -0
  250. package/dist/lib/plan/render-template.js +60 -0
  251. package/dist/lib/plan/render-template.js.map +1 -0
  252. package/dist/lib/repo-kind.d.ts +20 -0
  253. package/dist/lib/repo-kind.d.ts.map +1 -0
  254. package/dist/lib/repo-kind.js +73 -0
  255. package/dist/lib/repo-kind.js.map +1 -0
  256. package/dist/lib/scripts.d.ts +2 -0
  257. package/dist/lib/scripts.d.ts.map +1 -0
  258. package/dist/lib/scripts.js +7 -0
  259. package/dist/lib/scripts.js.map +1 -0
  260. package/dist/lib/sdd-index/cascade.d.ts +46 -0
  261. package/dist/lib/sdd-index/cascade.d.ts.map +1 -0
  262. package/dist/lib/sdd-index/cascade.js +91 -0
  263. package/dist/lib/sdd-index/cascade.js.map +1 -0
  264. package/dist/lib/sdd-index/contracts.d.ts +29 -0
  265. package/dist/lib/sdd-index/contracts.d.ts.map +1 -0
  266. package/dist/lib/sdd-index/contracts.js +216 -0
  267. package/dist/lib/sdd-index/contracts.js.map +1 -0
  268. package/dist/lib/sdd-index/data-model.d.ts +13 -0
  269. package/dist/lib/sdd-index/data-model.d.ts.map +1 -0
  270. package/dist/lib/sdd-index/data-model.js +23 -0
  271. package/dist/lib/sdd-index/data-model.js.map +1 -0
  272. package/dist/lib/sdd-index/execution-map.d.ts +34 -0
  273. package/dist/lib/sdd-index/execution-map.d.ts.map +1 -0
  274. package/dist/lib/sdd-index/execution-map.js +105 -0
  275. package/dist/lib/sdd-index/execution-map.js.map +1 -0
  276. package/dist/lib/sdd-index/graph.d.ts +28 -0
  277. package/dist/lib/sdd-index/graph.d.ts.map +1 -0
  278. package/dist/lib/sdd-index/graph.js +122 -0
  279. package/dist/lib/sdd-index/graph.js.map +1 -0
  280. package/dist/lib/sdd-index/index.d.ts +29 -0
  281. package/dist/lib/sdd-index/index.d.ts.map +1 -0
  282. package/dist/lib/sdd-index/index.js +79 -0
  283. package/dist/lib/sdd-index/index.js.map +1 -0
  284. package/dist/lib/sdd-index/repo-config.d.ts +23 -0
  285. package/dist/lib/sdd-index/repo-config.d.ts.map +1 -0
  286. package/dist/lib/sdd-index/repo-config.js +150 -0
  287. package/dist/lib/sdd-index/repo-config.js.map +1 -0
  288. package/dist/lib/sdd-index/types.d.ts +106 -0
  289. package/dist/lib/sdd-index/types.d.ts.map +1 -0
  290. package/dist/lib/sdd-index/types.js +13 -0
  291. package/dist/lib/sdd-index/types.js.map +1 -0
  292. package/dist/lib/sdd-index/watch.d.ts +24 -0
  293. package/dist/lib/sdd-index/watch.d.ts.map +1 -0
  294. package/dist/lib/sdd-index/watch.js +112 -0
  295. package/dist/lib/sdd-index/watch.js.map +1 -0
  296. package/dist/lib/spawn.d.ts +8 -0
  297. package/dist/lib/spawn.d.ts.map +1 -0
  298. package/dist/lib/spawn.js +16 -0
  299. package/dist/lib/spawn.js.map +1 -0
  300. package/dist/lib/sync/apply.d.ts +3 -0
  301. package/dist/lib/sync/apply.d.ts.map +1 -0
  302. package/dist/lib/sync/apply.js +16 -0
  303. package/dist/lib/sync/apply.js.map +1 -0
  304. package/dist/lib/sync/diff.d.ts +8 -0
  305. package/dist/lib/sync/diff.d.ts.map +1 -0
  306. package/dist/lib/sync/diff.js +48 -0
  307. package/dist/lib/sync/diff.js.map +1 -0
  308. package/dist/lib/sync/index.d.ts +17 -0
  309. package/dist/lib/sync/index.d.ts.map +1 -0
  310. package/dist/lib/sync/index.js +184 -0
  311. package/dist/lib/sync/index.js.map +1 -0
  312. package/dist/lib/sync/settings-merge.d.ts +45 -0
  313. package/dist/lib/sync/settings-merge.d.ts.map +1 -0
  314. package/dist/lib/sync/settings-merge.js +109 -0
  315. package/dist/lib/sync/settings-merge.js.map +1 -0
  316. package/dist/lib/sync/source-tag.d.ts +5 -0
  317. package/dist/lib/sync/source-tag.d.ts.map +1 -0
  318. package/dist/lib/sync/source-tag.js +34 -0
  319. package/dist/lib/sync/source-tag.js.map +1 -0
  320. package/dist/lib/sync/yaml-block-merge.d.ts +50 -0
  321. package/dist/lib/sync/yaml-block-merge.d.ts.map +1 -0
  322. package/dist/lib/sync/yaml-block-merge.js +113 -0
  323. package/dist/lib/sync/yaml-block-merge.js.map +1 -0
  324. package/dist/lib/validate/aggregate.d.ts +13 -0
  325. package/dist/lib/validate/aggregate.d.ts.map +1 -0
  326. package/dist/lib/validate/aggregate.js +35 -0
  327. package/dist/lib/validate/aggregate.js.map +1 -0
  328. package/dist/lib/validate/dispatch.d.ts +34 -0
  329. package/dist/lib/validate/dispatch.d.ts.map +1 -0
  330. package/dist/lib/validate/dispatch.js +167 -0
  331. package/dist/lib/validate/dispatch.js.map +1 -0
  332. package/dist/lib/validate/index.d.ts +13 -0
  333. package/dist/lib/validate/index.d.ts.map +1 -0
  334. package/dist/lib/validate/index.js +69 -0
  335. package/dist/lib/validate/index.js.map +1 -0
  336. package/dist/lib/validate/runner.d.ts +16 -0
  337. package/dist/lib/validate/runner.d.ts.map +1 -0
  338. package/dist/lib/validate/runner.js +66 -0
  339. package/dist/lib/validate/runner.js.map +1 -0
  340. package/dist/verbs/generate-claude-md.d.ts +3 -0
  341. package/dist/verbs/generate-claude-md.d.ts.map +1 -0
  342. package/dist/verbs/generate-claude-md.js +36 -0
  343. package/dist/verbs/generate-claude-md.js.map +1 -0
  344. package/dist/verbs/init.d.ts +3 -0
  345. package/dist/verbs/init.d.ts.map +1 -0
  346. package/dist/verbs/init.js +90 -0
  347. package/dist/verbs/init.js.map +1 -0
  348. package/dist/verbs/list.d.ts +3 -0
  349. package/dist/verbs/list.d.ts.map +1 -0
  350. package/dist/verbs/list.js +43 -0
  351. package/dist/verbs/list.js.map +1 -0
  352. package/dist/verbs/mcp.d.ts +3 -0
  353. package/dist/verbs/mcp.d.ts.map +1 -0
  354. package/dist/verbs/mcp.js +22 -0
  355. package/dist/verbs/mcp.js.map +1 -0
  356. package/dist/verbs/plan.d.ts +3 -0
  357. package/dist/verbs/plan.d.ts.map +1 -0
  358. package/dist/verbs/plan.js +41 -0
  359. package/dist/verbs/plan.js.map +1 -0
  360. package/dist/verbs/sync.d.ts +3 -0
  361. package/dist/verbs/sync.d.ts.map +1 -0
  362. package/dist/verbs/sync.js +27 -0
  363. package/dist/verbs/sync.js.map +1 -0
  364. package/dist/verbs/validate.d.ts +3 -0
  365. package/dist/verbs/validate.d.ts.map +1 -0
  366. package/dist/verbs/validate.js +21 -0
  367. package/dist/verbs/validate.js.map +1 -0
  368. package/package.json +61 -0
  369. package/scripts/README.md +48 -0
  370. package/scripts/sync-method-baseline.sh +258 -0
  371. package/scripts/validate-app-dependencies.sh +289 -0
  372. package/scripts/validate-app-docs.sh +185 -0
  373. package/scripts/validate-integration-docs.sh +222 -0
@@ -0,0 +1,97 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adrs.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/adrs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,OAAe;IACzD,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,sBAAsB,EACtB;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,2HAA2H;QAC7H,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAChE,OAAO;gBACL,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;gBAChC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI;gBAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI;gBAC3B,aAAa,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI;gBAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE;aACzC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,IAAI,CAC3B,MAAM,EACN,QAAQ,EACR,2BAA2B,CAC5B,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,OAAO;YACjB,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC;gBACtC,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,IAAI;YACR,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,IAAI,EAAE,OAAO;SACd,CAAC;QACF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,sBAAsB;oBAC3B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACrB,KAAK,EACL,IAAI,gBAAgB,CAAC,6BAA6B,EAAE;QAClD,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1B,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE;oBACxC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE;oBACpC,QAAQ,EAAE,eAAe;iBAC1B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,KAAK;QACZ,WAAW,EACT,6GAA6G;QAC/G,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,WAAW,GAAG,CAAC,IAAI,sDAAsD;gBAClF,WAAW,EACT,mGAAmG;gBACrG,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,0BAA0B,KAAK,WAAW,MAAM,mBAAmB,OAAO,GAAG;gBACtF,WAAW,EACT,yKAAyK;gBAC3K,OAAO,EAAE;oBACP,KAAK;oBACL,MAAM;oBACN,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,sBAAsB;iBAC7B;aACF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,IAAI;iBACX;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Domain data-model artefacts. In the method's conventions a data
3
+ * model lives at docs/domains/{domain}/architecture/data-model.mermaid.md.
4
+ * Absent in the canonical method repo; populated in adopter SDDs.
5
+ */
6
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ export declare function register(server: McpServer, sddRoot: string): void;
8
+ interface DiscoveredDataModel {
9
+ readonly domain: string;
10
+ readonly path: string;
11
+ }
12
+ export declare function discoverDataModels(sddRoot: string): DiscoveredDataModel[];
13
+ export {};
14
+ //# sourceMappingURL=data-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-models.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/data-models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,SAAS,EAEV,MAAM,yCAAyC,CAAC;AAIjD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoDjE;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAkBzE"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Domain data-model artefacts. In the method's conventions a data
3
+ * model lives at docs/domains/{domain}/architecture/data-model.mermaid.md.
4
+ * Absent in the canonical method repo; populated in adopter SDDs.
5
+ */
6
+ import { readFileSync, readdirSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { McpEnvelopeError } from "../errors.js";
10
+ import { safeIsDir, safeIsFile } from "../parse/paths.js";
11
+ export function register(server, sddRoot) {
12
+ server.registerResource("data-model", new ResourceTemplate("sdd://data-models/domain/{domain}", {
13
+ list: async () => {
14
+ const models = discoverDataModels(sddRoot);
15
+ return {
16
+ resources: models.map((m) => ({
17
+ uri: `sdd://data-models/domain/${m.domain}`,
18
+ name: `Data model: ${m.domain}`,
19
+ mimeType: "text/markdown",
20
+ })),
21
+ };
22
+ },
23
+ }), {
24
+ title: "Domain data model",
25
+ description: "Mermaid data model for a given domain, from docs/domains/{domain}/architecture/data-model.mermaid.md.",
26
+ mimeType: "text/markdown",
27
+ }, async (uri, { domain }) => {
28
+ if (typeof domain !== "string") {
29
+ throw new McpEnvelopeError({
30
+ code: "DATA_MODEL_URI_INVALID",
31
+ message: `Data-model URI ${uri.href} is missing the {domain} parameter.`,
32
+ remediation: "Use the shape sdd://data-models/domain/{domain}. List available domains via resources/list.",
33
+ context: { uri: uri.href },
34
+ });
35
+ }
36
+ const path = dataModelPath(sddRoot, domain);
37
+ if (!safeIsFile(path)) {
38
+ throw new McpEnvelopeError({
39
+ code: "DATA_MODEL_NOT_FOUND",
40
+ message: `No data model for domain ${domain} under SDD root ${sddRoot}.`,
41
+ remediation: "Domain data models are adopter-instantiated (ADR 0112) and may be absent in the canonical method repo. Query resources/list to see which data models this SDD exposes.",
42
+ context: { domain, expected_path: path, sdd_root: sddRoot },
43
+ });
44
+ }
45
+ return {
46
+ contents: [
47
+ {
48
+ uri: uri.href,
49
+ mimeType: "text/markdown",
50
+ text: readFileSync(path, "utf8"),
51
+ },
52
+ ],
53
+ };
54
+ });
55
+ }
56
+ export function discoverDataModels(sddRoot) {
57
+ const out = [];
58
+ const domainsRoot = join(sddRoot, "docs", "domains");
59
+ if (!safeIsDir(domainsRoot))
60
+ return out;
61
+ let domains;
62
+ try {
63
+ domains = readdirSync(domainsRoot);
64
+ }
65
+ catch {
66
+ return out;
67
+ }
68
+ for (const domain of domains) {
69
+ if (domain.startsWith("_"))
70
+ continue;
71
+ const path = dataModelPath(sddRoot, domain);
72
+ if (safeIsFile(path)) {
73
+ out.push({ domain, path });
74
+ }
75
+ }
76
+ return out;
77
+ }
78
+ function dataModelPath(sddRoot, domain) {
79
+ return join(sddRoot, "docs", "domains", domain, "architecture", "data-model.mermaid.md");
80
+ }
81
+ //# sourceMappingURL=data-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-models.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/data-models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,OAAe;IACzD,MAAM,CAAC,gBAAgB,CACrB,YAAY,EACZ,IAAI,gBAAgB,CAAC,mCAAmC,EAAE;QACxD,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO;gBACL,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5B,GAAG,EAAE,4BAA4B,CAAC,CAAC,MAAM,EAAE;oBAC3C,IAAI,EAAE,eAAe,CAAC,CAAC,MAAM,EAAE;oBAC/B,QAAQ,EAAE,eAAe;iBAC1B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,EACF;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,uGAAuG;QACzG,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,kBAAkB,GAAG,CAAC,IAAI,qCAAqC;gBACxE,WAAW,EACT,6FAA6F;gBAC/F,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,gBAAgB,CAAC;gBACzB,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,4BAA4B,MAAM,mBAAmB,OAAO,GAAG;gBACxE,WAAW,EACT,wKAAwK;gBAC1K,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC5D,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;iBACjC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,MAAc;IACpD,OAAO,IAAI,CACT,OAAO,EACP,MAAM,EACN,SAAS,EACT,MAAM,EACN,cAAc,EACd,uBAAuB,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Gate-registry resource. Each gate's YAML file is exposed under
3
+ * sdd://gates/{gate-name}. The payload includes schema metadata, the
4
+ * pass threshold, and all scored entries. Summary counts are computed
5
+ * on the fly for callers that want a quick overview.
6
+ */
7
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ export declare function register(server: McpServer, sddRoot: string): void;
9
+ //# sourceMappingURL=gates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/gates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA8DjE"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Gate-registry resource. Each gate's YAML file is exposed under
3
+ * sdd://gates/{gate-name}. The payload includes schema metadata, the
4
+ * pass threshold, and all scored entries. Summary counts are computed
5
+ * on the fly for callers that want a quick overview.
6
+ */
7
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ import { McpEnvelopeError } from "../errors.js";
9
+ import { listGates, readGateRegistry } from "../parse/gate-registry.js";
10
+ export function register(server, sddRoot) {
11
+ server.registerResource("gate", new ResourceTemplate("sdd://gates/{gate}", {
12
+ list: async () => {
13
+ const gates = listGates(sddRoot);
14
+ return {
15
+ resources: gates.map((gate) => ({
16
+ uri: `sdd://gates/${gate}`,
17
+ name: `Gate registry: ${gate}`,
18
+ mimeType: "application/json",
19
+ })),
20
+ };
21
+ },
22
+ }), {
23
+ title: "Gate registry",
24
+ description: "Structured view of orchestration/gate-registry/{gate}-scores.yaml. Includes schema version, pass threshold, per-artefact entries, and a small summary count.",
25
+ mimeType: "application/json",
26
+ }, async (uri, { gate }) => {
27
+ if (typeof gate !== "string") {
28
+ throw new McpEnvelopeError({
29
+ code: "GATE_URI_INVALID",
30
+ message: `Gate URI ${uri.href} is missing the {gate} parameter.`,
31
+ remediation: "Use the shape sdd://gates/{gate}. Call resources/list to see the gates this SDD exposes.",
32
+ context: { uri: uri.href },
33
+ });
34
+ }
35
+ const registry = readGateRegistry(sddRoot, gate);
36
+ if (!registry) {
37
+ throw new McpEnvelopeError({
38
+ code: "GATE_NOT_FOUND",
39
+ message: `No gate registry for ${gate} under SDD root ${sddRoot}.`,
40
+ remediation: "Check the spelling (e.g. adr-quality, contract-quality, intent-quality). resources/list lists the available gates.",
41
+ context: { gate, sdd_root: sddRoot },
42
+ });
43
+ }
44
+ const summary = summarise(registry.entries);
45
+ const payload = {
46
+ gate,
47
+ schema_version: registry.schemaVersion,
48
+ description: registry.description,
49
+ pass_threshold: registry.passThreshold,
50
+ summary,
51
+ entries: registry.entries,
52
+ path: registry.path,
53
+ };
54
+ return {
55
+ contents: [
56
+ {
57
+ uri: uri.href,
58
+ mimeType: "application/json",
59
+ text: JSON.stringify(payload, null, 2),
60
+ },
61
+ ],
62
+ };
63
+ });
64
+ }
65
+ function summarise(entries) {
66
+ let total = 0;
67
+ let pass = 0;
68
+ let conditional = 0;
69
+ let fail = 0;
70
+ let unscored = 0;
71
+ for (const value of Object.values(entries)) {
72
+ total++;
73
+ if (value && typeof value === "object") {
74
+ const gateVal = value["gate"];
75
+ if (gateVal === "pass")
76
+ pass++;
77
+ else if (gateVal === "conditional")
78
+ conditional++;
79
+ else if (gateVal === "fail")
80
+ fail++;
81
+ else
82
+ unscored++;
83
+ }
84
+ else {
85
+ unscored++;
86
+ }
87
+ }
88
+ return { total, pass, conditional, fail, unscored };
89
+ }
90
+ //# sourceMappingURL=gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/gates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Glossary resource. In adopter SDDs the platform glossary lives at
3
+ * docs/platform/reference/platform-glossary.md and per-domain
4
+ * glossaries at docs/domains/{domain}/reference/{domain}-glossary.md.
5
+ * Canonical method repo has no populated glossary; this server returns
6
+ * a structured NOT_FOUND when queried against such a repo.
7
+ */
8
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ export declare function register(server: McpServer, sddRoot: string): void;
10
+ interface DiscoveredGlossary {
11
+ readonly scope: string;
12
+ readonly path: string;
13
+ }
14
+ export declare function discoverGlossaries(sddRoot: string): DiscoveredGlossary[];
15
+ export {};
16
+ //# sourceMappingURL=glossary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glossary.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/glossary.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,SAAS,EAEV,MAAM,yCAAyC,CAAC;AAIjD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAoDjE;AAED,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAkCxE"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Glossary resource. In adopter SDDs the platform glossary lives at
3
+ * docs/platform/reference/platform-glossary.md and per-domain
4
+ * glossaries at docs/domains/{domain}/reference/{domain}-glossary.md.
5
+ * Canonical method repo has no populated glossary; this server returns
6
+ * a structured NOT_FOUND when queried against such a repo.
7
+ */
8
+ import { readFileSync, readdirSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { McpEnvelopeError } from "../errors.js";
12
+ import { safeIsDir, safeIsFile } from "../parse/paths.js";
13
+ export function register(server, sddRoot) {
14
+ server.registerResource("glossary", new ResourceTemplate("sdd://glossary/{scope}", {
15
+ list: async () => {
16
+ const entries = discoverGlossaries(sddRoot);
17
+ return {
18
+ resources: entries.map((e) => ({
19
+ uri: `sdd://glossary/${e.scope}`,
20
+ name: `Glossary: ${e.scope}`,
21
+ mimeType: "text/markdown",
22
+ })),
23
+ };
24
+ },
25
+ }), {
26
+ title: "Glossary",
27
+ description: "Glossary for the requested scope. Scope is `platform` or `<domain>` (e.g. `party`).",
28
+ mimeType: "text/markdown",
29
+ }, async (uri, { scope }) => {
30
+ if (typeof scope !== "string") {
31
+ throw new McpEnvelopeError({
32
+ code: "GLOSSARY_URI_INVALID",
33
+ message: `Glossary URI ${uri.href} is missing the {scope} parameter.`,
34
+ remediation: "Use the shape sdd://glossary/{scope}. Call resources/list to see the glossaries this SDD exposes.",
35
+ context: { uri: uri.href },
36
+ });
37
+ }
38
+ const path = glossaryPath(sddRoot, scope);
39
+ if (!path) {
40
+ throw new McpEnvelopeError({
41
+ code: "GLOSSARY_NOT_FOUND",
42
+ message: `No glossary for scope ${scope} under SDD root ${sddRoot}.`,
43
+ remediation: "Glossaries are adopter-instantiated. The canonical method repo does not ship a populated glossary; resources/list shows what this SDD exposes.",
44
+ context: { scope, sdd_root: sddRoot },
45
+ });
46
+ }
47
+ return {
48
+ contents: [
49
+ {
50
+ uri: uri.href,
51
+ mimeType: "text/markdown",
52
+ text: readFileSync(path, "utf8"),
53
+ },
54
+ ],
55
+ };
56
+ });
57
+ }
58
+ export function discoverGlossaries(sddRoot) {
59
+ const out = [];
60
+ const platformPath = join(sddRoot, "docs", "platform", "reference", "platform-glossary.md");
61
+ if (safeIsFile(platformPath)) {
62
+ out.push({ scope: "platform", path: platformPath });
63
+ }
64
+ const domainsRoot = join(sddRoot, "docs", "domains");
65
+ if (safeIsDir(domainsRoot)) {
66
+ let domains = [];
67
+ try {
68
+ domains = readdirSync(domainsRoot);
69
+ }
70
+ catch {
71
+ // ignore
72
+ }
73
+ for (const domain of domains) {
74
+ if (domain.startsWith("_"))
75
+ continue;
76
+ const domainGlossary = join(domainsRoot, domain, "reference", `${domain}-glossary.md`);
77
+ if (safeIsFile(domainGlossary)) {
78
+ out.push({ scope: domain, path: domainGlossary });
79
+ }
80
+ }
81
+ }
82
+ return out;
83
+ }
84
+ function glossaryPath(sddRoot, scope) {
85
+ return discoverGlossaries(sddRoot).find((g) => g.scope === scope)?.path;
86
+ }
87
+ //# sourceMappingURL=glossary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glossary.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/glossary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Capability and feature specs. The MCP plan references the URIs
3
+ * sdd://specs/capability/{domain}/{capability} and
4
+ * sdd://specs/feature/{domain}/{capability}/{feature}; the on-disk
5
+ * layout is adopter-driven (docs/domains/{d}/product/{capability}.md
6
+ * and similar). Phase 1 does a best-effort discovery under
7
+ * docs/domains/{d}/product/ and exposes found specs; absent specs
8
+ * surface as a structured NOT_FOUND with a pointer to the catalogue.
9
+ */
10
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ export declare function register(server: McpServer, sddRoot: string): void;
12
+ interface CapabilitySpec {
13
+ readonly domain: string;
14
+ readonly capability: string;
15
+ readonly path: string;
16
+ }
17
+ export declare function discoverCapabilitySpecs(sddRoot: string): CapabilitySpec[];
18
+ interface FeatureSpec extends CapabilitySpec {
19
+ readonly feature: string;
20
+ }
21
+ export declare function discoverFeatureSpecs(sddRoot: string): FeatureSpec[];
22
+ export {};
23
+ //# sourceMappingURL=specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,SAAS,EAEV,MAAM,yCAAyC,CAAC;AAKjD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA+EjE;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAiBzE;AAED,UAAU,WAAY,SAAQ,cAAc;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAsBnE"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Capability and feature specs. The MCP plan references the URIs
3
+ * sdd://specs/capability/{domain}/{capability} and
4
+ * sdd://specs/feature/{domain}/{capability}/{feature}; the on-disk
5
+ * layout is adopter-driven (docs/domains/{d}/product/{capability}.md
6
+ * and similar). Phase 1 does a best-effort discovery under
7
+ * docs/domains/{d}/product/ and exposes found specs; absent specs
8
+ * surface as a structured NOT_FOUND with a pointer to the catalogue.
9
+ */
10
+ import { readFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
13
+ import { McpEnvelopeError } from "../errors.js";
14
+ import { safeIsDir, safeIsFile } from "../parse/paths.js";
15
+ import { readdirSync } from "node:fs";
16
+ export function register(server, sddRoot) {
17
+ server.registerResource("capability-spec", new ResourceTemplate("sdd://specs/capability/{domain}/{capability}", {
18
+ list: async () => {
19
+ const specs = discoverCapabilitySpecs(sddRoot);
20
+ return {
21
+ resources: specs.map((s) => ({
22
+ uri: `sdd://specs/capability/${s.domain}/${s.capability}`,
23
+ name: `Capability spec: ${s.domain} / ${s.capability}`,
24
+ mimeType: "text/markdown",
25
+ })),
26
+ };
27
+ },
28
+ }), {
29
+ title: "Capability spec",
30
+ description: "Capability-level specification for a given domain. Read from the first matching docs/domains/{domain}/product/{capability}*.md file.",
31
+ mimeType: "text/markdown",
32
+ }, async (uri, { domain, capability }) => {
33
+ if (typeof domain !== "string" || typeof capability !== "string") {
34
+ throw invalidArgs(uri.href);
35
+ }
36
+ const path = findCapabilitySpec(sddRoot, domain, capability);
37
+ if (!path) {
38
+ throw notFound("CAPABILITY_SPEC_NOT_FOUND", `No capability spec found for ${domain}/${capability}.`, { domain, capability, sdd_root: sddRoot });
39
+ }
40
+ return readMarkdown(uri.href, path);
41
+ });
42
+ server.registerResource("feature-spec", new ResourceTemplate("sdd://specs/feature/{domain}/{capability}/{feature}", {
43
+ list: async () => {
44
+ const specs = discoverFeatureSpecs(sddRoot);
45
+ return {
46
+ resources: specs.map((s) => ({
47
+ uri: `sdd://specs/feature/${s.domain}/${s.capability}/${s.feature}`,
48
+ name: `Feature spec: ${s.domain} / ${s.capability} / ${s.feature}`,
49
+ mimeType: "text/markdown",
50
+ })),
51
+ };
52
+ },
53
+ }), {
54
+ title: "Feature spec",
55
+ description: "Feature-level specification nested under a capability. Read from docs/domains/{domain}/product/{capability}/{feature}*.md.",
56
+ mimeType: "text/markdown",
57
+ }, async (uri, { domain, capability, feature }) => {
58
+ if (typeof domain !== "string" ||
59
+ typeof capability !== "string" ||
60
+ typeof feature !== "string") {
61
+ throw invalidArgs(uri.href);
62
+ }
63
+ const path = findFeatureSpec(sddRoot, domain, capability, feature);
64
+ if (!path) {
65
+ throw notFound("FEATURE_SPEC_NOT_FOUND", `No feature spec found for ${domain}/${capability}/${feature}.`, { domain, capability, feature, sdd_root: sddRoot });
66
+ }
67
+ return readMarkdown(uri.href, path);
68
+ });
69
+ }
70
+ export function discoverCapabilitySpecs(sddRoot) {
71
+ const out = [];
72
+ const domainsRoot = join(sddRoot, "docs", "domains");
73
+ if (!safeIsDir(domainsRoot))
74
+ return out;
75
+ for (const domain of safeReaddir(domainsRoot)) {
76
+ if (domain.startsWith("_"))
77
+ continue;
78
+ const productDir = join(domainsRoot, domain, "product");
79
+ if (!safeIsDir(productDir))
80
+ continue;
81
+ for (const entry of safeReaddir(productDir)) {
82
+ const full = join(productDir, entry);
83
+ if (entry.endsWith(".md") && safeIsFile(full)) {
84
+ const slug = entry.replace(/\.md$/, "");
85
+ out.push({ domain, capability: slug, path: full });
86
+ }
87
+ }
88
+ }
89
+ return out;
90
+ }
91
+ export function discoverFeatureSpecs(sddRoot) {
92
+ const out = [];
93
+ const caps = discoverCapabilitySpecs(sddRoot);
94
+ for (const cap of caps) {
95
+ const nestedDir = join(sddRoot, "docs", "domains", cap.domain, "product", cap.capability);
96
+ if (!safeIsDir(nestedDir))
97
+ continue;
98
+ for (const entry of safeReaddir(nestedDir)) {
99
+ const full = join(nestedDir, entry);
100
+ if (entry.endsWith(".md") && safeIsFile(full)) {
101
+ const feature = entry.replace(/\.md$/, "");
102
+ out.push({ ...cap, feature, path: full });
103
+ }
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ function findCapabilitySpec(sddRoot, domain, capability) {
109
+ return discoverCapabilitySpecs(sddRoot).find((s) => s.domain === domain && s.capability === capability)?.path;
110
+ }
111
+ function findFeatureSpec(sddRoot, domain, capability, feature) {
112
+ return discoverFeatureSpecs(sddRoot).find((s) => s.domain === domain &&
113
+ s.capability === capability &&
114
+ s.feature === feature)?.path;
115
+ }
116
+ function readMarkdown(uri, path) {
117
+ return {
118
+ contents: [
119
+ {
120
+ uri,
121
+ mimeType: "text/markdown",
122
+ text: readFileSync(path, "utf8"),
123
+ },
124
+ ],
125
+ };
126
+ }
127
+ function invalidArgs(uri) {
128
+ return new McpEnvelopeError({
129
+ code: "SPEC_URI_INVALID",
130
+ message: `Spec URI ${uri} is missing required template parameters.`,
131
+ remediation: "Check the URI shape: sdd://specs/capability/{domain}/{capability} or sdd://specs/feature/{domain}/{capability}/{feature}.",
132
+ context: { uri },
133
+ });
134
+ }
135
+ function notFound(code, message, ctx) {
136
+ return new McpEnvelopeError({
137
+ code,
138
+ message,
139
+ remediation: "Spec files are adopter-instantiated and may be absent in the canonical method repo. Query the discovered list via the MCP resources/list operation to see which specs this SDD exposes.",
140
+ context: ctx,
141
+ });
142
+ }
143
+ function safeReaddir(dir) {
144
+ try {
145
+ return readdirSync(dir);
146
+ }
147
+ catch {
148
+ return [];
149
+ }
150
+ }
151
+ //# sourceMappingURL=specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs.js","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/specs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer, sddRoot: string): void;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/resources/version.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgCjE"}