@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 @@
1
+ {"version":3,"file":"search-specs.js","sourceRoot":"","sources":["../../../../src/lib/mcp/tools/search-specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQ9D,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,OAAe;IACzD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,sIAAsI;QACxI,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6DAA6D,CAAC;YAChG,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,+CAA+C,CAAC;YAC5D,KAAK,EAAE,CAAC;iBACL,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;iBAC3D,QAAQ,EAAE;iBACV,QAAQ,CAAC,iDAAiD,CAAC;YAC9D,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,iJAAiJ,CAClJ;SACJ;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,KAAK;aACjB,WAAW,EAAE;aACb,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,EAAE,EAC9D,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,KAAK,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CACtD,CAAC;QACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE3D,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAKL,EAAE,CAAC;QAER,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,GAAG,GAAG,CAAC,CAAC;gBACZ,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBAChD,KAAK,EAAE,CAAC;oBACR,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,IAAI,KAAK,KAAK,CAAC;gBAAE,SAAS;YAC1B,IAAI,CAAC,IAAI,CAAC;gBACR,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK;gBACL,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAG;YACd,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;YAC9B,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,QAAQ,EAAE,GAAG,CAAC,MAAM;YACpB,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9B,aAAa,EAAE,MAAM,CAAC,GAAG;SAC1B,CAAC;QACF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAe,EACf,KAAkB;IAElB,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,cAAc,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE;gBAC5C,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,0BAA0B,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,EAAE;gBACzD,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,YAAY;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,uBAAuB,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,EAAE;gBACnE,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,kBAAkB,CAAC,CAAC,KAAK,EAAE;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CACnB,IAAY,EACZ,SAAiB,EACjB,UAAkB;IAElB,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SDD path resolution for the local stdio MCP server, per MCP plan
3
+ * §Discovery and seeding semantics / §Sibling-path resolution.
4
+ *
5
+ * Precedence:
6
+ * 1. SDD_REPO_PATH env var
7
+ * 2. --sdd-repo CLI flag (passed in by the caller)
8
+ * 3. Walk up to git root; scan siblings for the .sdd-repo-kind
9
+ * marker; fall through to the nested case (cwd IS the SDD)
10
+ *
11
+ * Ambiguous and missing cases surface structured errors — no guessing.
12
+ */
13
+ export declare const SDD_MARKER_FILE = ".sdd-repo-kind";
14
+ export interface ResolveOptions {
15
+ readonly cwd: string;
16
+ readonly env: NodeJS.ProcessEnv;
17
+ readonly flagPath?: string;
18
+ }
19
+ export interface ResolvedSdd {
20
+ readonly path: string;
21
+ readonly source: "env" | "flag" | "sibling" | "nested";
22
+ }
23
+ export declare function resolveSddRepo(opts: ResolveOptions): ResolvedSdd;
24
+ export declare function walkUpToGitRoot(startDir: string): string | undefined;
25
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;CACxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,WAAW,CA8DhE;AAsBD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUpE"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * SDD path resolution for the local stdio MCP server, per MCP plan
3
+ * §Discovery and seeding semantics / §Sibling-path resolution.
4
+ *
5
+ * Precedence:
6
+ * 1. SDD_REPO_PATH env var
7
+ * 2. --sdd-repo CLI flag (passed in by the caller)
8
+ * 3. Walk up to git root; scan siblings for the .sdd-repo-kind
9
+ * marker; fall through to the nested case (cwd IS the SDD)
10
+ *
11
+ * Ambiguous and missing cases surface structured errors — no guessing.
12
+ */
13
+ import { existsSync, readdirSync, statSync } from "node:fs";
14
+ import { dirname, join, resolve } from "node:path";
15
+ import { McpEnvelopeError } from "./errors.js";
16
+ export const SDD_MARKER_FILE = ".sdd-repo-kind";
17
+ export function resolveSddRepo(opts) {
18
+ const envPath = opts.env["SDD_REPO_PATH"];
19
+ if (envPath && envPath.trim().length > 0) {
20
+ const abs = resolve(envPath);
21
+ assertMarker(abs, "env");
22
+ return { path: abs, source: "env" };
23
+ }
24
+ if (opts.flagPath && opts.flagPath.trim().length > 0) {
25
+ const abs = resolve(opts.flagPath);
26
+ assertMarker(abs, "flag");
27
+ return { path: abs, source: "flag" };
28
+ }
29
+ const codeRepoRoot = walkUpToGitRoot(opts.cwd);
30
+ if (!codeRepoRoot) {
31
+ throw new McpEnvelopeError({
32
+ code: "NO_GIT_ROOT",
33
+ message: `Not inside a git repository (searched upward from ${opts.cwd}).`,
34
+ remediation: "Run sdd-cli mcp serve from inside a git repository whose sibling is the SDD, or pass --sdd-repo <path> / set SDD_REPO_PATH.",
35
+ context: { cwd: opts.cwd },
36
+ });
37
+ }
38
+ const candidates = findSiblingCandidates(codeRepoRoot);
39
+ if (existsSync(join(codeRepoRoot, SDD_MARKER_FILE))) {
40
+ candidates.push(codeRepoRoot);
41
+ }
42
+ if (candidates.length === 0) {
43
+ throw new McpEnvelopeError({
44
+ code: "NO_SDD_FOUND",
45
+ message: `No sibling SDD repository found. Searched siblings of ${codeRepoRoot} for the ${SDD_MARKER_FILE} marker.`,
46
+ remediation: `Check out the SDD repository as a sibling of this code repo (e.g. /parent/${dirname(codeRepoRoot)}), or pass --sdd-repo <path> / set SDD_REPO_PATH to point at the SDD directly.`,
47
+ context: { codeRepoRoot, searchedParent: dirname(codeRepoRoot) },
48
+ });
49
+ }
50
+ if (candidates.length > 1) {
51
+ throw new McpEnvelopeError({
52
+ code: "MULTIPLE_SDDS_FOUND",
53
+ message: `Multiple SDD repositories found as candidates; cannot auto-select.`,
54
+ remediation: "Pass --sdd-repo <path> or set SDD_REPO_PATH to disambiguate. Listing candidate paths in context.candidates.",
55
+ context: { candidates },
56
+ });
57
+ }
58
+ const only = candidates[0];
59
+ if (only === undefined) {
60
+ throw new McpEnvelopeError({
61
+ code: "NO_SDD_FOUND",
62
+ message: "SDD resolution produced an empty result unexpectedly.",
63
+ remediation: "Pass --sdd-repo <path> or set SDD_REPO_PATH to point at the SDD directly.",
64
+ });
65
+ }
66
+ const source = only === codeRepoRoot ? "nested" : "sibling";
67
+ return { path: only, source };
68
+ }
69
+ function assertMarker(path, sourceLabel) {
70
+ if (!existsSync(path) || !statSync(path).isDirectory()) {
71
+ throw new McpEnvelopeError({
72
+ code: "SDD_PATH_INVALID",
73
+ message: `SDD path ${path} (source: ${sourceLabel}) does not exist or is not a directory.`,
74
+ remediation: "Correct the SDD_REPO_PATH / --sdd-repo value to an existing SDD directory.",
75
+ context: { path, source: sourceLabel },
76
+ });
77
+ }
78
+ if (!existsSync(join(path, SDD_MARKER_FILE))) {
79
+ throw new McpEnvelopeError({
80
+ code: "SDD_MARKER_MISSING",
81
+ message: `SDD path ${path} (source: ${sourceLabel}) is missing the ${SDD_MARKER_FILE} marker file.`,
82
+ remediation: `Either the path is wrong, or the SDD needs a ${SDD_MARKER_FILE} file at its root containing one of: platform-product, application-product, integration-product, canonical-method.`,
83
+ context: { path, source: sourceLabel, expected_marker: SDD_MARKER_FILE },
84
+ });
85
+ }
86
+ }
87
+ export function walkUpToGitRoot(startDir) {
88
+ let current = resolve(startDir);
89
+ // Cap the walk at filesystem root to prevent runaway loops.
90
+ for (let i = 0; i < 64; i++) {
91
+ if (existsSync(join(current, ".git")))
92
+ return current;
93
+ const parent = dirname(current);
94
+ if (parent === current)
95
+ return undefined;
96
+ current = parent;
97
+ }
98
+ return undefined;
99
+ }
100
+ function findSiblingCandidates(codeRepoRoot) {
101
+ const parent = dirname(codeRepoRoot);
102
+ if (parent === codeRepoRoot)
103
+ return [];
104
+ let entries;
105
+ try {
106
+ entries = readdirSync(parent);
107
+ }
108
+ catch {
109
+ return [];
110
+ }
111
+ const candidates = [];
112
+ for (const entry of entries) {
113
+ const abs = join(parent, entry);
114
+ if (abs === codeRepoRoot)
115
+ continue;
116
+ try {
117
+ if (!statSync(abs).isDirectory())
118
+ continue;
119
+ }
120
+ catch {
121
+ continue;
122
+ }
123
+ if (existsSync(join(abs, SDD_MARKER_FILE))) {
124
+ candidates.push(abs);
125
+ }
126
+ }
127
+ return candidates;
128
+ }
129
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/lib/mcp/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAahD,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,qDAAqD,IAAI,CAAC,GAAG,IAAI;YAC1E,WAAW,EACT,6HAA6H;YAC/H,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAEvD,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QACpD,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,yDAAyD,YAAY,YAAY,eAAe,UAAU;YACnH,WAAW,EAAE,6EAA6E,OAAO,CAAC,YAAY,CAAC,gFAAgF;YAC/L,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE;SACjE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oEAAoE;YAC7E,WAAW,EACT,6GAA6G;YAC/G,OAAO,EAAE,EAAE,UAAU,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,uDAAuD;YAChE,WAAW,EACT,2EAA2E;SAC9E,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GACV,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,WAAmB;IACrD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,YAAY,IAAI,aAAa,WAAW,yCAAyC;YAC1F,WAAW,EACT,4EAA4E;YAC9E,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE;SACvC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,YAAY,IAAI,aAAa,WAAW,oBAAoB,eAAe,eAAe;YACnG,WAAW,EAAE,gDAAgD,eAAe,oHAAoH;YAChM,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE;SACzE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,4DAA4D;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAoB;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,EAAE,CAAC;IACvC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,KAAK,YAAY;YAAE,SAAS;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;gBAAE,SAAS;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Entry builders — produce the McpServerEntry blocks this plan owns.
3
+ */
4
+ import type { McpServerEntry } from "./types.js";
5
+ export interface SddMcpEntryOptions {
6
+ /**
7
+ * Absolute path to the SDD repo. Written as an env var so sdd-mcp
8
+ * doesn't fall back to sibling auto-discovery (which would error
9
+ * with MULTIPLE_SDDS_FOUND in an adopter app/integration repo where
10
+ * the app itself has a .sdd-repo-kind marker AND a platform
11
+ * SDD sits alongside).
12
+ *
13
+ * Omit for platform profiles where the repo IS the SDD — Phase 1's
14
+ * workspace resolver handles the nested case.
15
+ */
16
+ readonly sddRepoPath?: string;
17
+ }
18
+ export declare function buildSddMcpEntry(opts?: SddMcpEntryOptions): McpServerEntry;
19
+ //# sourceMappingURL=entries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entries.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp-seed/entries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,kBAAuB,GAAG,cAAc,CAS9E"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Entry builders — produce the McpServerEntry blocks this plan owns.
3
+ */
4
+ export function buildSddMcpEntry(opts = {}) {
5
+ const entry = {
6
+ command: "sdd-cli",
7
+ args: ["mcp", "serve"],
8
+ ...(opts.sddRepoPath !== undefined
9
+ ? { env: { SDD_REPO_PATH: opts.sddRepoPath } }
10
+ : {}),
11
+ };
12
+ return entry;
13
+ }
14
+ //# sourceMappingURL=entries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entries.js","sourceRoot":"","sources":["../../../src/lib/mcp-seed/entries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,MAAM,UAAU,gBAAgB,CAAC,OAA2B,EAAE;IAC5D,MAAM,KAAK,GAAmB;QAC5B,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;YAChC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE;YAC9C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Public facade for the MCP settings-seed library. Consumers:
3
+ *
4
+ * - `sdd-cli init` scaffolds (platform/app/integration) call
5
+ * `buildMethodManagedServers()` + `upsertMethodManagedServers()`
6
+ * to produce a correctly-seeded `.claude/settings.json`.
7
+ * - `sdd-cli sync` routes the same file through the merge path to
8
+ * upsert method-owned entries without clobbering adopter content.
9
+ *
10
+ * Scope: this module owns `mcpServers.<method-id>`. Hooks and other
11
+ * top-level keys belong to the enforcement-automation plan; we pass
12
+ * them through untouched.
13
+ */
14
+ export type { ClaudeSettings, McpServerEntry, MethodManagedServerId, } from "./types.js";
15
+ export { METHOD_MANAGED_SERVER_IDS } from "./types.js";
16
+ export { buildSddMcpEntry } from "./entries.js";
17
+ export type { SddMcpEntryOptions } from "./entries.js";
18
+ export { detectManagedDrift, upsertMethodManagedServers, } from "./merge.js";
19
+ export type { UpsertResult } from "./merge.js";
20
+ import type { McpServerEntry, MethodManagedServerId } from "./types.js";
21
+ export interface BuildMethodManagedOptions {
22
+ /**
23
+ * Explicit SDD repo path for `sdd-mcp`. Usually set at init time to
24
+ * the absolute path of the repo being scaffolded. Omit to let
25
+ * sdd-mcp's workspace resolver walk up + auto-discover (works for
26
+ * platform profiles where the target repo IS the SDD).
27
+ */
28
+ readonly sddRepoPath?: string;
29
+ }
30
+ /**
31
+ * Produce the full owned-servers map. Adding a new method-managed
32
+ * server id is a one-place change: add it here and to
33
+ * METHOD_MANAGED_SERVER_IDS.
34
+ */
35
+ export declare function buildMethodManagedServers(opts?: BuildMethodManagedOptions): Record<MethodManagedServerId, McpServerEntry>;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp-seed/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,YAAY,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,GAAE,yBAA8B,GACnC,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAM/C"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Public facade for the MCP settings-seed library. Consumers:
3
+ *
4
+ * - `sdd-cli init` scaffolds (platform/app/integration) call
5
+ * `buildMethodManagedServers()` + `upsertMethodManagedServers()`
6
+ * to produce a correctly-seeded `.claude/settings.json`.
7
+ * - `sdd-cli sync` routes the same file through the merge path to
8
+ * upsert method-owned entries without clobbering adopter content.
9
+ *
10
+ * Scope: this module owns `mcpServers.<method-id>`. Hooks and other
11
+ * top-level keys belong to the enforcement-automation plan; we pass
12
+ * them through untouched.
13
+ */
14
+ export { METHOD_MANAGED_SERVER_IDS } from "./types.js";
15
+ export { buildSddMcpEntry } from "./entries.js";
16
+ export { detectManagedDrift, upsertMethodManagedServers, } from "./merge.js";
17
+ import { buildSddMcpEntry } from "./entries.js";
18
+ /**
19
+ * Produce the full owned-servers map. Adding a new method-managed
20
+ * server id is a one-place change: add it here and to
21
+ * METHOD_MANAGED_SERVER_IDS.
22
+ */
23
+ export function buildMethodManagedServers(opts = {}) {
24
+ return {
25
+ "sdd-mcp": buildSddMcpEntry(opts.sddRepoPath !== undefined ? { sddRepoPath: opts.sddRepoPath } : {}),
26
+ };
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/mcp-seed/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAahD;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAkC,EAAE;IAEpC,OAAO;QACL,SAAS,EAAE,gBAAgB,CACzB,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CACxE;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Merge logic for the method-managed portion of `.claude/settings.json`.
3
+ *
4
+ * Ownership model: the method owns specific server ids (listed in
5
+ * `METHOD_MANAGED_SERVER_IDS`). On upsert, those ids are rewritten
6
+ * with the method-supplied entry; any other server ids the adopter
7
+ * has added under `mcpServers` survive untouched, as do all other
8
+ * top-level keys (hooks, permissions, env, …).
9
+ *
10
+ * The merge is conservative: if a method id exists with a value that
11
+ * is byte-identical to the method's current seed, we return the
12
+ * original object unmodified (stable output → no spurious writes).
13
+ */
14
+ import type { ClaudeSettings, McpServerEntry, MethodManagedServerId } from "./types.js";
15
+ export interface UpsertResult {
16
+ readonly settings: ClaudeSettings;
17
+ /** Ids that were newly added. */
18
+ readonly added: readonly string[];
19
+ /** Ids whose entry changed. */
20
+ readonly updated: readonly string[];
21
+ /** Ids that were already present and byte-equal. */
22
+ readonly unchanged: readonly string[];
23
+ /** Whether the returned settings differ from the input. */
24
+ readonly changed: boolean;
25
+ }
26
+ export declare function upsertMethodManagedServers(existing: ClaudeSettings, owned: Readonly<Record<MethodManagedServerId, McpServerEntry>>): UpsertResult;
27
+ /**
28
+ * Detect adopter-edited method-managed entries. Returns the ids whose
29
+ * current value differs from the method-supplied seed — these are the
30
+ * ones that a refuse-or-overwrite sync should flag unless
31
+ * `--allow-overwrite` is passed.
32
+ */
33
+ export declare function detectManagedDrift(existing: ClaudeSettings, owned: Readonly<Record<MethodManagedServerId, McpServerEntry>>): readonly string[];
34
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp-seed/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC,GAC7D,YAAY,CA8Cd;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC,GAC7D,SAAS,MAAM,EAAE,CAYnB"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Merge logic for the method-managed portion of `.claude/settings.json`.
3
+ *
4
+ * Ownership model: the method owns specific server ids (listed in
5
+ * `METHOD_MANAGED_SERVER_IDS`). On upsert, those ids are rewritten
6
+ * with the method-supplied entry; any other server ids the adopter
7
+ * has added under `mcpServers` survive untouched, as do all other
8
+ * top-level keys (hooks, permissions, env, …).
9
+ *
10
+ * The merge is conservative: if a method id exists with a value that
11
+ * is byte-identical to the method's current seed, we return the
12
+ * original object unmodified (stable output → no spurious writes).
13
+ */
14
+ export function upsertMethodManagedServers(existing, owned) {
15
+ const added = [];
16
+ const updated = [];
17
+ const unchanged = [];
18
+ const currentServers = isPlainObject(existing["mcpServers"])
19
+ ? existing["mcpServers"]
20
+ : {};
21
+ const nextServers = { ...currentServers };
22
+ for (const [id, entry] of Object.entries(owned)) {
23
+ const prior = currentServers[id];
24
+ if (prior === undefined) {
25
+ nextServers[id] = entry;
26
+ added.push(id);
27
+ }
28
+ else if (!entriesEqual(prior, entry)) {
29
+ nextServers[id] = entry;
30
+ updated.push(id);
31
+ }
32
+ else {
33
+ unchanged.push(id);
34
+ }
35
+ }
36
+ const changed = added.length > 0 || updated.length > 0;
37
+ if (!changed) {
38
+ return {
39
+ settings: existing,
40
+ added,
41
+ updated,
42
+ unchanged,
43
+ changed: false,
44
+ };
45
+ }
46
+ const nextSettings = {
47
+ ...existing,
48
+ mcpServers: nextServers,
49
+ };
50
+ return {
51
+ settings: nextSettings,
52
+ added,
53
+ updated,
54
+ unchanged,
55
+ changed: true,
56
+ };
57
+ }
58
+ /**
59
+ * Detect adopter-edited method-managed entries. Returns the ids whose
60
+ * current value differs from the method-supplied seed — these are the
61
+ * ones that a refuse-or-overwrite sync should flag unless
62
+ * `--allow-overwrite` is passed.
63
+ */
64
+ export function detectManagedDrift(existing, owned) {
65
+ const currentServers = isPlainObject(existing["mcpServers"])
66
+ ? existing["mcpServers"]
67
+ : {};
68
+ const drifted = [];
69
+ for (const [id, entry] of Object.entries(owned)) {
70
+ const prior = currentServers[id];
71
+ if (prior !== undefined && !entriesEqual(prior, entry)) {
72
+ drifted.push(id);
73
+ }
74
+ }
75
+ return drifted;
76
+ }
77
+ function entriesEqual(a, b) {
78
+ // Stable-order JSON comparison. The entry shape is small and flat
79
+ // enough that stringifying is cheaper than writing a structural
80
+ // walker.
81
+ return stableStringify(a) === stableStringify(b);
82
+ }
83
+ function stableStringify(value) {
84
+ if (value === null || typeof value !== "object")
85
+ return JSON.stringify(value);
86
+ if (Array.isArray(value)) {
87
+ return "[" + value.map((v) => stableStringify(v)).join(",") + "]";
88
+ }
89
+ const keys = Object.keys(value).sort();
90
+ return ("{" +
91
+ keys
92
+ .map((k) => JSON.stringify(k) + ":" + stableStringify(value[k]))
93
+ .join(",") +
94
+ "}");
95
+ }
96
+ function isPlainObject(v) {
97
+ return v !== null && typeof v === "object" && !Array.isArray(v);
98
+ }
99
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/lib/mcp-seed/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Types for the MCP settings-seed library. Mirrors the shape Claude
3
+ * Code expects at `.claude/settings.json`, restricted to the fields
4
+ * we read or write.
5
+ */
6
+ export interface McpServerEntry {
7
+ readonly command: string;
8
+ readonly args: readonly string[];
9
+ readonly env?: Readonly<Record<string, string>>;
10
+ readonly cwd?: string;
11
+ }
12
+ export interface ClaudeSettings {
13
+ readonly mcpServers?: Readonly<Record<string, McpServerEntry>>;
14
+ readonly [key: string]: unknown;
15
+ }
16
+ /**
17
+ * Server ids owned by this method plan. Sync upserts these and leaves
18
+ * everything else alone. When Phases 3+4 ship adopter servers, extend
19
+ * the list — or better, let each plan contribute its own list and
20
+ * combine at merge time.
21
+ */
22
+ export declare const METHOD_MANAGED_SERVER_IDS: readonly ["sdd-mcp"];
23
+ export type MethodManagedServerId = (typeof METHOD_MANAGED_SERVER_IDS)[number];
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp-seed/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAG/D,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,sBAAuB,CAAC;AAE9D,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Types for the MCP settings-seed library. Mirrors the shape Claude
3
+ * Code expects at `.claude/settings.json`, restricted to the fields
4
+ * we read or write.
5
+ */
6
+ /**
7
+ * Server ids owned by this method plan. Sync upserts these and leaves
8
+ * everything else alone. When Phases 3+4 ship adopter servers, extend
9
+ * the list — or better, let each plan contribute its own list and
10
+ * combine at merge time.
11
+ */
12
+ export const METHOD_MANAGED_SERVER_IDS = ["sdd-mcp"];
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/mcp-seed/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAS,CAAU,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface PlanPilotInputs {
2
+ sddRoot: string;
3
+ service: string;
4
+ capability: string;
5
+ domain: string;
6
+ outputPath?: string;
7
+ dryRun?: boolean;
8
+ today?: string;
9
+ platformCliVersionHint?: string;
10
+ }
11
+ export interface PlanPilotResult {
12
+ exitCode: number;
13
+ outputPath: string;
14
+ rendered: string;
15
+ /** True when the run was dry-run and no file was written. */
16
+ dryRun: boolean;
17
+ }
18
+ export declare function runPlanPilot(inputs: PlanPilotInputs, write: (s: string) => void): Promise<PlanPilotResult>;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/plan/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,eAAe,CAAC,CAwD1B"}
@@ -0,0 +1,69 @@
1
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { readSdd } from "./read-sdd.js";
4
+ import { renderPilotKickoff } from "./render-template.js";
5
+ export async function runPlanPilot(inputs, write) {
6
+ const templatePath = join(inputs.sddRoot, "docs/method/methods/pilot-kickoff-template.md");
7
+ if (!(await fileExists(templatePath))) {
8
+ const msg = `[FAIL] pilot-kickoff template not found at ${templatePath}. Sync the method baseline first (bundle v0.2.15+).\n`;
9
+ write(msg);
10
+ return {
11
+ exitCode: 1,
12
+ outputPath: inputs.outputPath ?? defaultOutputPath(inputs),
13
+ rendered: "",
14
+ dryRun: inputs.dryRun === true,
15
+ };
16
+ }
17
+ const snapshot = await readSdd({
18
+ sddRoot: inputs.sddRoot,
19
+ service: inputs.service,
20
+ capability: inputs.capability,
21
+ domain: inputs.domain,
22
+ });
23
+ const rendered = await renderPilotKickoff({
24
+ snapshot,
25
+ platformCliVersionHint: inputs.platformCliVersionHint ?? "0.5.0",
26
+ today: inputs.today ?? new Date().toISOString().slice(0, 10),
27
+ });
28
+ const outputPath = inputs.outputPath ?? defaultOutputPath(inputs);
29
+ const dryRun = inputs.dryRun === true;
30
+ if (dryRun) {
31
+ write(rendered);
32
+ write(`\n[INFO] dry-run: would write to ${outputPath}\n`);
33
+ return { exitCode: 0, outputPath, rendered, dryRun: true };
34
+ }
35
+ const outputAbs = resolveOutputAbs(inputs.sddRoot, outputPath);
36
+ if (await fileExists(outputAbs)) {
37
+ write(`[FAIL] refusing to overwrite existing file at ${outputAbs}. Move or rename, or re-run with --dry-run.\n`);
38
+ return { exitCode: 1, outputPath: outputAbs, rendered, dryRun: false };
39
+ }
40
+ await mkdir(dirname(outputAbs), { recursive: true });
41
+ await writeFile(outputAbs, rendered, "utf8");
42
+ write(`[PASS] pilot-kickoff scaffolded at ${outputAbs}\n` +
43
+ ` aggregates: ${snapshot.repoConfig.aggregates.length}\n` +
44
+ ` feature specs: ${snapshot.featureSpecCount}\n` +
45
+ ` capability spec: ${snapshot.capabilitySpecPresent ? "present" : "MISSING"}\n` +
46
+ ` traceability manifest: ${snapshot.traceabilityManifestPresent ? "present" : "MISSING"}\n`);
47
+ return { exitCode: 0, outputPath: outputAbs, rendered, dryRun: false };
48
+ }
49
+ function defaultOutputPath(inputs) {
50
+ return join("content/product/plans", `${inputs.service}-pilot-kickoff.md`);
51
+ }
52
+ function resolveOutputAbs(sddRoot, outputPath) {
53
+ if (outputPath.startsWith("/"))
54
+ return outputPath;
55
+ return join(sddRoot, outputPath);
56
+ }
57
+ async function fileExists(path) {
58
+ try {
59
+ await access(path);
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ // Keep readFile import in use; some test harness entry points trigger module
67
+ // tree-shake warnings otherwise.
68
+ void readFile;
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/plan/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export interface RepoConfig {
2
+ path: string;
3
+ description?: string;
4
+ serviceType?: string;
5
+ aggregates: string[];
6
+ internalDependencies: string[];
7
+ contracts: {
8
+ openapi: string[];
9
+ proto: string[];
10
+ avro: string[];
11
+ spicedb: string[];
12
+ };
13
+ }
14
+ export interface SddSnapshot {
15
+ sddRoot: string;
16
+ service: string;
17
+ capability: string;
18
+ domain: string;
19
+ repoConfig: RepoConfig;
20
+ featureSpecCount: number;
21
+ featureSpecRelativePaths: string[];
22
+ capabilitySpecPresent: boolean;
23
+ capabilitySpecPath: string;
24
+ traceabilityManifestPresent: boolean;
25
+ traceabilityManifestPath: string;
26
+ }
27
+ export interface ReadSddInputs {
28
+ sddRoot: string;
29
+ service: string;
30
+ capability: string;
31
+ domain: string;
32
+ }
33
+ /**
34
+ * Read everything `plan --pilot` needs from the SDD filesystem: the service's
35
+ * repo-config manifest (domain, service_type, aggregates, dependencies,
36
+ * contracts), the count of feature spec files under the capability, and
37
+ * presence of the capability spec + traceability manifest.
38
+ *
39
+ * Repo-config parsing delegates to the shared sdd-index module so the
40
+ * `plan --pilot` path and the MCP dependency-graph tools see the same
41
+ * view. The richer ADR 0110 shape (package/version/stability) is
42
+ * flattened back to path-strings here to preserve the legacy
43
+ * `RepoConfig` contract.
44
+ */
45
+ export declare function readSdd(inputs: ReadSddInputs): Promise<SddSnapshot>;
46
+ //# sourceMappingURL=read-sdd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-sdd.d.ts","sourceRoot":"","sources":["../../../src/lib/plan/read-sdd.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2BAA2B,EAAE,OAAO,CAAC;IACrC,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CA8DzE"}