@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,89 +0,0 @@
1
- /**
2
- * find_dependents — given a service name, return services downstream
3
- * of it: those that name it as an internal dependency, consume a
4
- * contract it produces, or have an execution-map edge pointing at it.
5
- */
6
- import { z } from "zod";
7
- import { McpEnvelopeError } from "../errors.js";
8
- import { readerFor } from "../pin/index.js";
9
- import { getSddIndex } from "../../sdd-index/index.js";
10
- export function register(server, sddRoot) {
11
- server.registerTool("find_dependents", {
12
- title: "Find dependents",
13
- description: "List services downstream of a given service — those that depend on it directly (via repo-config), consume a contract it produces, or point at it in the execution-dependency-map.",
14
- inputSchema: {
15
- service: z
16
- .string()
17
- .min(1)
18
- .describe("Service id (matches the repo-config `repo` field)."),
19
- pin_to_commit: z
20
- .string()
21
- .optional()
22
- .describe("Optional commit SHA (or ref) to pin the SDD to."),
23
- },
24
- }, async ({ service, pin_to_commit }) => {
25
- const reader = readerFor(sddRoot, pin_to_commit);
26
- const index = getSddIndex(reader);
27
- if (!index.services.has(service)) {
28
- throw new McpEnvelopeError({
29
- code: "SERVICE_NOT_FOUND",
30
- message: `No service named '${service}' in the SDD index.`,
31
- remediation: `Check spelling. Known services: ${Array.from(index.services.keys()).sort().join(", ") || "(none)"}.`,
32
- context: {
33
- service,
34
- known: Array.from(index.services.keys()).sort(),
35
- },
36
- });
37
- }
38
- const directDependents = [];
39
- for (const [id, other] of index.services) {
40
- if (other.internalDependencies.includes(service)) {
41
- directDependents.push({
42
- service: id,
43
- domain: other.domain,
44
- via: "internal_dependency",
45
- });
46
- }
47
- }
48
- const contractsProduced = Array.from(index.contracts.values()).filter((c) => c.producers.includes(service));
49
- const contractDependents = [];
50
- for (const node of contractsProduced) {
51
- for (const consumer of node.consumers) {
52
- const consumerSvc = index.services.get(consumer);
53
- const ref = consumerSvc?.contracts.find((c) => c.path === node.path);
54
- contractDependents.push({
55
- service: consumer,
56
- contract_path: node.path,
57
- version_pin: ref?.version ?? null,
58
- stability: ref?.stability ?? null,
59
- });
60
- }
61
- }
62
- const executionEdges = index.executionEdges
63
- .filter((e) => e.to === service)
64
- .map((e) => ({
65
- from: e.from,
66
- kind: e.kind,
67
- note: e.note ?? null,
68
- }));
69
- const payload = {
70
- query: { service },
71
- dependents: {
72
- direct: directDependents,
73
- contract_consumers: contractDependents,
74
- execution_edges: executionEdges,
75
- },
76
- pin_to_commit: reader.pin,
77
- sources: [
78
- `sdd://repo-config/${index.services.get(service)?.domain}/${service}`,
79
- ...(contractsProduced.length > 0
80
- ? contractsProduced.map((c) => `sdd://contracts/${c.path}`)
81
- : []),
82
- ],
83
- };
84
- return {
85
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
86
- };
87
- });
88
- }
89
- //# sourceMappingURL=find-dependents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-dependents.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/find-dependents.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * find_producers — given an aggregate name or event name, return the
3
- * services that own / publish it. Backed by the SDD index's
4
- * `producers` map.
5
- */
6
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
- export declare function register(server: McpServer, sddRoot: string): void;
8
- //# sourceMappingURL=find-producers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-producers.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/find-producers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgEjE"}
@@ -1,57 +0,0 @@
1
- /**
2
- * find_producers — given an aggregate name or event name, return the
3
- * services that own / publish it. Backed by the SDD index's
4
- * `producers` map.
5
- */
6
- import { z } from "zod";
7
- import { readerFor } from "../pin/index.js";
8
- import { getSddIndex } from "../../sdd-index/index.js";
9
- export function register(server, sddRoot) {
10
- server.registerTool("find_producers", {
11
- title: "Find producers",
12
- description: "Given an aggregate name or event name, return the services that publish it. A service is classed as producer when it owns an aggregate the contract describes.",
13
- inputSchema: {
14
- target: z
15
- .string()
16
- .min(1)
17
- .describe("Aggregate name or event name. Case-sensitive."),
18
- pin_to_commit: z
19
- .string()
20
- .optional()
21
- .describe("Optional commit SHA (or ref) to pin the SDD to."),
22
- },
23
- }, async ({ target, pin_to_commit }) => {
24
- const reader = readerFor(sddRoot, pin_to_commit);
25
- const index = getSddIndex(reader);
26
- const producers = index.producers.get(target) ?? [];
27
- const matches = producers.map((serviceId) => {
28
- const svc = index.services.get(serviceId);
29
- const contracts = svc?.contracts ?? [];
30
- const refMatching = contracts.find((c) => {
31
- const node = index.contracts.get(c.path);
32
- return (node?.producedAggregates.includes(target) ||
33
- node?.producedEvents.includes(target));
34
- });
35
- return {
36
- service: serviceId,
37
- domain: svc?.domain ?? null,
38
- owns_aggregate: svc?.aggregates.includes(target) ?? false,
39
- contract_path: refMatching?.path ?? null,
40
- version_pin: refMatching?.version ?? null,
41
- stability: refMatching?.stability ?? null,
42
- };
43
- });
44
- const payload = {
45
- query: { target },
46
- matches,
47
- total: matches.length,
48
- pin_to_commit: reader.pin,
49
- sources: Array.from(new Set(matches.map((m) => m.contract_path).filter(Boolean))).map((p) => `sdd://contracts/${p}`),
50
- metadata_incomplete: matches.length > 0 && matches.every((m) => !m.contract_path),
51
- };
52
- return {
53
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
54
- };
55
- });
56
- }
57
- //# sourceMappingURL=find-producers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-producers.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/find-producers.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * find_related_specs — given an entity name (e.g. an aggregate, an
3
- * event, a ubiquitous term), return every spec / ADR / glossary that
4
- * references it by literal substring match. Case-insensitive; counts
5
- * occurrences per document; no tokenisation.
6
- */
7
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
- export declare function register(server: McpServer, sddRoot: string): void;
9
- //# sourceMappingURL=find-related-specs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-related-specs.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/find-related-specs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgGjE"}
@@ -1,92 +0,0 @@
1
- /**
2
- * find_related_specs — given an entity name (e.g. an aggregate, an
3
- * event, a ubiquitous term), return every spec / ADR / glossary that
4
- * references it by literal substring match. Case-insensitive; counts
5
- * occurrences per document; no tokenisation.
6
- */
7
- import { readFileSync } from "node:fs";
8
- import { z } from "zod";
9
- import { discoverAdrs } from "../parse/paths.js";
10
- import { readerFor } from "../pin/index.js";
11
- import { discoverCapabilitySpecs, discoverFeatureSpecs } from "../resources/specs.js";
12
- import { discoverGlossaries } from "../resources/glossary.js";
13
- export function register(server, sddRoot) {
14
- server.registerTool("find_related_specs", {
15
- title: "Find related specs",
16
- description: "Locate every ADR, spec, or glossary entry that references a given entity by literal substring match.",
17
- inputSchema: {
18
- entity_name: z
19
- .string()
20
- .min(1)
21
- .describe("Entity name to search for (case-insensitive substring)."),
22
- pin_to_commit: z
23
- .string()
24
- .optional()
25
- .describe("Optional commit SHA (or any ref) to pin the SDD to. When set, the server reads from a git worktree at that commit rather than the working tree."),
26
- },
27
- }, async ({ entity_name, pin_to_commit }) => {
28
- const reader = readerFor(sddRoot, pin_to_commit);
29
- const needle = entity_name.toLowerCase();
30
- const docs = [];
31
- for (const adr of discoverAdrs(reader.sddRoot)) {
32
- docs.push({
33
- uri: `sdd://adrs/${adr.scope}/${adr.number}`,
34
- path: adr.path,
35
- kind: "adr",
36
- });
37
- }
38
- for (const c of discoverCapabilitySpecs(reader.sddRoot)) {
39
- docs.push({
40
- uri: `sdd://specs/capability/${c.domain}/${c.capability}`,
41
- path: c.path,
42
- kind: "capability",
43
- });
44
- }
45
- for (const f of discoverFeatureSpecs(reader.sddRoot)) {
46
- docs.push({
47
- uri: `sdd://specs/feature/${f.domain}/${f.capability}/${f.feature}`,
48
- path: f.path,
49
- kind: "feature",
50
- });
51
- }
52
- for (const g of discoverGlossaries(reader.sddRoot)) {
53
- docs.push({
54
- uri: `sdd://glossary/${g.scope}`,
55
- path: g.path,
56
- kind: "glossary",
57
- });
58
- }
59
- const matches = [];
60
- for (const doc of docs) {
61
- let body;
62
- try {
63
- body = readFileSync(doc.path, "utf8");
64
- }
65
- catch {
66
- continue;
67
- }
68
- const lower = body.toLowerCase();
69
- let count = 0;
70
- let idx = 0;
71
- while ((idx = lower.indexOf(needle, idx)) !== -1) {
72
- count++;
73
- idx += needle.length;
74
- }
75
- if (count > 0) {
76
- matches.push({ uri: doc.uri, kind: doc.kind, occurrences: count });
77
- }
78
- }
79
- matches.sort((a, b) => b.occurrences - a.occurrences);
80
- const payload = {
81
- entity_name,
82
- total: matches.length,
83
- matches,
84
- sources: matches.map((m) => m.uri),
85
- pin_to_commit: reader.pin,
86
- };
87
- return {
88
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
89
- };
90
- });
91
- }
92
- //# sourceMappingURL=find-related-specs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-related-specs.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/find-related-specs.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function register(server: McpServer, sddRoot: string): void;
3
- //# sourceMappingURL=list-adrs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-adrs.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/list-adrs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA2EjE"}
@@ -1,73 +0,0 @@
1
- import { readFileSync } from "node:fs";
2
- import { z } from "zod";
3
- import { parseAdrMetadata } from "../parse/frontmatter.js";
4
- import { discoverAdrs } from "../parse/paths.js";
5
- import { readerFor } from "../pin/index.js";
6
- export function register(server, sddRoot) {
7
- server.registerTool("list_adrs", {
8
- title: "List ADRs",
9
- description: "Enumerate ADRs discovered under docs/method/adr, docs/platform/adr, and docs/domains/{domain}/adr. Optionally filter by scope prefix or status.",
10
- inputSchema: {
11
- scope: z
12
- .string()
13
- .optional()
14
- .describe("Filter by ADR scope: 'method', 'platform', or 'domain' (matches any domain:*)"),
15
- status: z
16
- .string()
17
- .optional()
18
- .describe("Filter by ADR status (Accepted / Proposed / Superseded / Deprecated / Deferred). Case-insensitive."),
19
- pin_to_commit: z
20
- .string()
21
- .optional()
22
- .describe("Optional commit SHA (or any ref) to pin the SDD to. When set, the server reads from a git worktree at that commit rather than the working tree."),
23
- },
24
- }, async ({ scope, status, pin_to_commit }) => {
25
- const reader = readerFor(sddRoot, pin_to_commit);
26
- const wantScope = scope?.toLowerCase();
27
- const wantStatus = status?.toLowerCase();
28
- const adrs = discoverAdrs(reader.sddRoot);
29
- const entries = adrs
30
- .map((a) => {
31
- const metadata = parseAdrMetadata(readFileSync(a.path, "utf8"));
32
- return {
33
- number: a.number,
34
- scope: a.scope,
35
- title: metadata.title || a.title,
36
- status: metadata.status ?? null,
37
- date: metadata.date ?? null,
38
- decision_type: metadata.decisionType ?? null,
39
- uri: `sdd://adrs/${a.scope}/${a.number}`,
40
- };
41
- })
42
- .filter((e) => {
43
- if (wantScope) {
44
- if (wantScope === "domain") {
45
- if (!e.scope.startsWith("domain:"))
46
- return false;
47
- }
48
- else if (e.scope !== wantScope) {
49
- return false;
50
- }
51
- }
52
- if (wantStatus && (e.status ?? "").toLowerCase() !== wantStatus) {
53
- return false;
54
- }
55
- return true;
56
- });
57
- const payload = {
58
- sdd_root: sddRoot,
59
- filters: {
60
- scope: scope ?? null,
61
- status: status ?? null,
62
- },
63
- count: entries.length,
64
- adrs: entries,
65
- sources: ["sdd://adrs/catalogue"],
66
- pin_to_commit: reader.pin,
67
- };
68
- return {
69
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
70
- };
71
- });
72
- }
73
- //# sourceMappingURL=list-adrs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-adrs.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/list-adrs.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function register(server: McpServer, sddRoot: string): void;
3
- //# sourceMappingURL=query-gate-status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-gate-status.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/query-gate-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgFjE"}
@@ -1,68 +0,0 @@
1
- import { z } from "zod";
2
- import { McpEnvelopeError } from "../errors.js";
3
- import { listGates, readGateRegistry, summariseGateEntries } from "../parse/gate-registry.js";
4
- import { readerFor } from "../pin/index.js";
5
- export function register(server, sddRoot) {
6
- server.registerTool("query_gate_status", {
7
- title: "Query gate status",
8
- description: "Read the status of a specific gate from orchestration/gate-registry/{gate}-scores.yaml. Returns summary counts plus scoped entries.",
9
- inputSchema: {
10
- gate: z
11
- .string()
12
- .describe("Gate name, e.g. adr-quality, contract-quality, intent-quality, feature-grounding, domain-architecture, c4-diagram, strategic-doc, traceability-manifest, user-story, work-order"),
13
- scope: z
14
- .string()
15
- .optional()
16
- .describe("Optional filter applied to entry keys (substring match, case-insensitive). Useful for narrowing e.g. to a specific domain or ADR number."),
17
- pin_to_commit: z
18
- .string()
19
- .optional()
20
- .describe("Optional commit SHA (or any ref) to pin the SDD to. When set, the server reads from a git worktree at that commit rather than the working tree."),
21
- },
22
- }, async ({ gate, scope, pin_to_commit }) => {
23
- const reader = readerFor(sddRoot, pin_to_commit);
24
- const registry = readGateRegistry(reader.sddRoot, gate);
25
- if (!registry) {
26
- throw new McpEnvelopeError({
27
- code: "GATE_NOT_FOUND",
28
- message: `No gate registry for ${gate} under SDD root ${reader.sddRoot}.`,
29
- remediation: `Check the gate name — available gates in this SDD: ${listGates(reader.sddRoot).join(", ") || "(none)"}.`,
30
- context: {
31
- gate,
32
- available: listGates(reader.sddRoot),
33
- sdd_root: reader.sddRoot,
34
- },
35
- });
36
- }
37
- // A malformed registry must never read as a clean, empty one. Reported
38
- // through the envelope contract like every other failure on this surface
39
- // — before the fix it threw a raw YAMLParseError straight through.
40
- if (registry.parseError !== null) {
41
- throw new McpEnvelopeError({
42
- code: "GATE_REGISTRY_UNPARSEABLE",
43
- message: `Gate registry ${registry.path} is not parseable YAML: ${registry.parseError}`,
44
- remediation: "Repair the registry. Two shapes account for every case seen so far: a container mixing mapping entries with sequence entries, and a duplicate key — the latter silently discards one of two judgments in parsers that tolerate it, so treat a duplicate as two contradictory verdicts, not a typo.",
45
- context: { gate, path: registry.path, parse_error: registry.parseError },
46
- });
47
- }
48
- const wantScope = scope?.toLowerCase();
49
- const entries = wantScope
50
- ? Object.fromEntries(Object.entries(registry.entries).filter(([k]) => k.toLowerCase().includes(wantScope)))
51
- : registry.entries;
52
- const summary = summariseGateEntries(entries);
53
- const payload = {
54
- gate,
55
- scope_filter: scope ?? null,
56
- schema_version: registry.schemaVersion,
57
- pass_threshold: registry.passThreshold,
58
- summary,
59
- entries,
60
- sources: [`sdd://gates/${gate}`],
61
- pin_to_commit: reader.pin,
62
- };
63
- return {
64
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
65
- };
66
- });
67
- }
68
- //# sourceMappingURL=query-gate-status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-gate-status.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/query-gate-status.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * search_specs — plain-text search across ADRs, capability specs,
3
- * feature specs, and glossaries. Scores by count of query-token
4
- * occurrences in each document body; returns top N with a snippet.
5
- *
6
- * Deliberately simple for Phase 1: no fuzzy matching, no stemming, no
7
- * BM25. Upgrade path is to drop in fuse.js or a proper index in a
8
- * later phase if precision becomes an issue.
9
- */
10
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
- export declare function register(server: McpServer, sddRoot: string): void;
12
- //# sourceMappingURL=search-specs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-specs.d.ts","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/search-specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAyGjE"}
@@ -1,151 +0,0 @@
1
- /**
2
- * search_specs — plain-text search across ADRs, capability specs,
3
- * feature specs, and glossaries. Scores by count of query-token
4
- * occurrences in each document body; returns top N with a snippet.
5
- *
6
- * Deliberately simple for Phase 1: no fuzzy matching, no stemming, no
7
- * BM25. Upgrade path is to drop in fuse.js or a proper index in a
8
- * later phase if precision becomes an issue.
9
- */
10
- import { readFileSync } from "node:fs";
11
- import { z } from "zod";
12
- import { discoverAdrs } from "../parse/paths.js";
13
- import { readerFor } from "../pin/index.js";
14
- import { discoverCapabilitySpecs, discoverFeatureSpecs } from "../resources/specs.js";
15
- import { discoverGlossaries } from "../resources/glossary.js";
16
- export function register(server, sddRoot) {
17
- server.registerTool("search_specs", {
18
- title: "Search specs",
19
- description: "Plain-text search across ADRs, capability specs, feature specs, and glossaries. Returns ranked matches with URIs and short snippets.",
20
- inputSchema: {
21
- query: z.string().min(1).describe("Free-text query. Tokenised by whitespace; case-insensitive."),
22
- limit: z
23
- .number()
24
- .int()
25
- .min(1)
26
- .max(50)
27
- .optional()
28
- .describe("Maximum number of hits to return. Default 10."),
29
- kinds: z
30
- .array(z.enum(["adr", "capability", "feature", "glossary"]))
31
- .optional()
32
- .describe("Restrict the search to specific document kinds."),
33
- pin_to_commit: z
34
- .string()
35
- .optional()
36
- .describe("Optional commit SHA (or any ref) to pin the SDD to. When set, the server reads from a git worktree at that commit rather than the working tree."),
37
- },
38
- }, async ({ query, limit, kinds, pin_to_commit }) => {
39
- const reader = readerFor(sddRoot, pin_to_commit);
40
- const tokens = query
41
- .toLowerCase()
42
- .split(/\s+/)
43
- .filter((t) => t.length > 0);
44
- if (tokens.length === 0) {
45
- return {
46
- content: [
47
- {
48
- type: "text",
49
- text: JSON.stringify({ query, matches: [], sources: [], pin_to_commit: reader.pin }, null, 2),
50
- },
51
- ],
52
- };
53
- }
54
- const activeKinds = new Set(kinds ?? ["adr", "capability", "feature", "glossary"]);
55
- const docs = collectDocuments(reader.sddRoot, activeKinds);
56
- const cap = limit ?? 10;
57
- const hits = [];
58
- for (const doc of docs) {
59
- let body;
60
- try {
61
- body = readFileSync(doc.path, "utf8");
62
- }
63
- catch {
64
- continue;
65
- }
66
- const lower = body.toLowerCase();
67
- let score = 0;
68
- for (const token of tokens) {
69
- let idx = 0;
70
- while ((idx = lower.indexOf(token, idx)) !== -1) {
71
- score++;
72
- idx += token.length;
73
- }
74
- }
75
- if (score === 0)
76
- continue;
77
- hits.push({
78
- uri: doc.uri,
79
- kind: doc.kind,
80
- score,
81
- snippet: buildSnippet(body, lower, tokens[0]),
82
- });
83
- }
84
- hits.sort((a, b) => b.score - a.score);
85
- const top = hits.slice(0, cap);
86
- const payload = {
87
- query,
88
- kinds: Array.from(activeKinds),
89
- limit: cap,
90
- total_hits: hits.length,
91
- returned: top.length,
92
- matches: top,
93
- sources: top.map((h) => h.uri),
94
- pin_to_commit: reader.pin,
95
- };
96
- return {
97
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
98
- };
99
- });
100
- }
101
- function collectDocuments(sddRoot, kinds) {
102
- const out = [];
103
- if (kinds.has("adr")) {
104
- for (const adr of discoverAdrs(sddRoot)) {
105
- out.push({
106
- uri: `sdd://adrs/${adr.scope}/${adr.number}`,
107
- path: adr.path,
108
- kind: "adr",
109
- });
110
- }
111
- }
112
- if (kinds.has("capability")) {
113
- for (const c of discoverCapabilitySpecs(sddRoot)) {
114
- out.push({
115
- uri: `sdd://specs/capability/${c.domain}/${c.capability}`,
116
- path: c.path,
117
- kind: "capability",
118
- });
119
- }
120
- }
121
- if (kinds.has("feature")) {
122
- for (const f of discoverFeatureSpecs(sddRoot)) {
123
- out.push({
124
- uri: `sdd://specs/feature/${f.domain}/${f.capability}/${f.feature}`,
125
- path: f.path,
126
- kind: "feature",
127
- });
128
- }
129
- }
130
- if (kinds.has("glossary")) {
131
- for (const g of discoverGlossaries(sddRoot)) {
132
- out.push({
133
- uri: `sdd://glossary/${g.scope}`,
134
- path: g.path,
135
- kind: "glossary",
136
- });
137
- }
138
- }
139
- return out;
140
- }
141
- function buildSnippet(body, bodyLower, firstToken) {
142
- const idx = bodyLower.indexOf(firstToken);
143
- if (idx === -1)
144
- return body.slice(0, 160);
145
- const start = Math.max(0, idx - 60);
146
- const end = Math.min(body.length, idx + firstToken.length + 60);
147
- const prefix = start === 0 ? "" : "…";
148
- const suffix = end === body.length ? "" : "…";
149
- return prefix + body.slice(start, end).replace(/\s+/g, " ").trim() + suffix;
150
- }
151
- //# sourceMappingURL=search-specs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-specs.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/search-specs.ts"],"names":[],"mappings":"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"}