@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,258 @@
1
+ #!/bin/bash
2
+ #
3
+ # sync-method-baseline.sh
4
+ # Apply a built method baseline bundle to a target repository.
5
+ #
6
+ # Usage:
7
+ # ./orchestration/scripts/sync-method-baseline.sh --bundle dist/method-baseline/method-baseline-v0.1.0.tar.gz
8
+ # ./orchestration/scripts/sync-method-baseline.sh --bundle ... --target-repo /path/to/repo --dry-run
9
+
10
+ set -euo pipefail
11
+
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ BLUE='\033[0;34m'
15
+ NC='\033[0m'
16
+ REPO_KIND_FILE=".sdd-repo-kind"
17
+ PROTECTED_PREFIXES=("content/")
18
+
19
+ log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
20
+ log_fail() { echo -e "${RED}[FAIL]${NC} $1"; }
21
+ log_pass() { echo -e "${GREEN}[PASS]${NC} $1"; }
22
+ log_section() {
23
+ echo -e "\n${BLUE}═══════════════════════════════════════════════════════════${NC}"
24
+ echo -e "${BLUE} $1${NC}"
25
+ echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
26
+ }
27
+
28
+ usage() {
29
+ cat <<USAGE
30
+ Usage: $(basename "$0") --bundle <path.tar.gz> [--target-repo <dir>] [--dry-run] [--allow-overwrite] [--no-delete]
31
+
32
+ Options:
33
+ --bundle Required bundle archive generated by build-method-baseline-bundle.sh
34
+ --target-repo Target repository root (default: current working directory)
35
+ --dry-run Report plan only; do not modify files
36
+ --allow-overwrite Overwrite conflicting managed files (default: fail on conflict)
37
+ --no-delete Do not delete previously managed files removed from the incoming bundle
38
+ USAGE
39
+ }
40
+
41
+ BUNDLE=""
42
+ TARGET_REPO="$(pwd)"
43
+ DRY_RUN=0
44
+ ALLOW_OVERWRITE=0
45
+ NO_DELETE=0
46
+
47
+ while [[ $# -gt 0 ]]; do
48
+ case "$1" in
49
+ --bundle)
50
+ BUNDLE="${2:-}"
51
+ shift 2
52
+ ;;
53
+ --target-repo)
54
+ TARGET_REPO="${2:-}"
55
+ shift 2
56
+ ;;
57
+ --dry-run)
58
+ DRY_RUN=1
59
+ shift
60
+ ;;
61
+ --allow-overwrite)
62
+ ALLOW_OVERWRITE=1
63
+ shift
64
+ ;;
65
+ --no-delete)
66
+ NO_DELETE=1
67
+ shift
68
+ ;;
69
+ -h|--help)
70
+ usage
71
+ exit 0
72
+ ;;
73
+ *)
74
+ log_fail "Unknown argument: $1"
75
+ usage
76
+ exit 1
77
+ ;;
78
+ esac
79
+ done
80
+
81
+ if [[ -z "$BUNDLE" ]]; then
82
+ log_fail "--bundle is required"
83
+ usage
84
+ exit 1
85
+ fi
86
+
87
+ if [[ ! -f "$BUNDLE" ]]; then
88
+ log_fail "Bundle not found: $BUNDLE"
89
+ exit 1
90
+ fi
91
+
92
+ if [[ ! -d "$TARGET_REPO" ]]; then
93
+ log_fail "Target repo not found: $TARGET_REPO"
94
+ exit 1
95
+ fi
96
+
97
+ log_section "Sync Method Baseline"
98
+
99
+ TMP_DIR="$(mktemp -d)"
100
+ trap 'rm -rf "$TMP_DIR"' EXIT
101
+
102
+ tar -xzf "$BUNDLE" -C "$TMP_DIR"
103
+ BUNDLE_ROOT="$(find "$TMP_DIR" -mindepth 1 -maxdepth 1 -type d | head -n 1)"
104
+ if [[ -z "$BUNDLE_ROOT" ]]; then
105
+ log_fail "Could not find extracted bundle root"
106
+ exit 1
107
+ fi
108
+
109
+ MANAGED_PATHS_FILE="$BUNDLE_ROOT/MANAGED_PATHS.txt"
110
+ PAYLOAD_DIR="$BUNDLE_ROOT/payload"
111
+ MANIFEST_FILE="$BUNDLE_ROOT/BUNDLE_MANIFEST.yaml"
112
+ LOCK_FILE="$TARGET_REPO/method-baseline.lock"
113
+
114
+ if [[ ! -f "$MANAGED_PATHS_FILE" || ! -d "$PAYLOAD_DIR" || ! -f "$MANIFEST_FILE" ]]; then
115
+ log_fail "Bundle missing required files (MANAGED_PATHS.txt, payload/, or BUNDLE_MANIFEST.yaml)"
116
+ exit 1
117
+ fi
118
+
119
+ BUNDLE_VERSION="$(awk -F': ' '/^bundle_version:/{gsub(/"/,"",$2); print $2}' "$MANIFEST_FILE")"
120
+ SOURCE_COMMIT="$(awk -F': ' '/^source_commit:/{gsub(/"/,"",$2); print $2}' "$MANIFEST_FILE")"
121
+ BUNDLE_NAME="$(awk -F': ' '/^bundle_name:/{gsub(/"/,"",$2); print $2}' "$MANIFEST_FILE")"
122
+
123
+ case "$BUNDLE_NAME" in
124
+ platform-baseline)
125
+ REPO_KIND_VALUE="platform-product"
126
+ ;;
127
+ app-baseline)
128
+ REPO_KIND_VALUE="application-product"
129
+ ;;
130
+ integration-baseline)
131
+ REPO_KIND_VALUE="integration-product"
132
+ ;;
133
+ *)
134
+ log_fail "Unknown bundle_name in manifest: $BUNDLE_NAME"
135
+ exit 1
136
+ ;;
137
+ esac
138
+
139
+ mapfile -t INCOMING_PATHS < "$MANAGED_PATHS_FILE"
140
+
141
+ for p in "${INCOMING_PATHS[@]}"; do
142
+ if [[ ! -f "$PAYLOAD_DIR/$p" ]]; then
143
+ log_fail "Missing payload file listed in MANAGED_PATHS.txt: $p"
144
+ exit 1
145
+ fi
146
+ for prefix in "${PROTECTED_PREFIXES[@]}"; do
147
+ if [[ "$p" == "$prefix"* ]]; then
148
+ log_fail "Incoming bundle attempts to manage protected product-owned path: $p"
149
+ log_fail "Method baseline bundles must not manage files under: ${PROTECTED_PREFIXES[*]}"
150
+ exit 1
151
+ fi
152
+ done
153
+ done
154
+
155
+ # Detect conflicts unless caller explicitly allows overwrite.
156
+ CONFLICTS=()
157
+ for p in "${INCOMING_PATHS[@]}"; do
158
+ target_file="$TARGET_REPO/$p"
159
+ incoming_file="$PAYLOAD_DIR/$p"
160
+ if [[ -f "$target_file" ]] && ! cmp -s "$incoming_file" "$target_file"; then
161
+ CONFLICTS+=("$p")
162
+ fi
163
+ done
164
+
165
+ if [[ ${#CONFLICTS[@]} -gt 0 && "$ALLOW_OVERWRITE" -ne 1 ]]; then
166
+ log_fail "Found ${#CONFLICTS[@]} conflicting managed file(s). Re-run with --allow-overwrite to apply."
167
+ printf '%s\n' "${CONFLICTS[@]}" | sed 's/^/ - /'
168
+ exit 1
169
+ fi
170
+
171
+ # Load previously managed paths from lock file (if present).
172
+ PREV_PATHS=()
173
+ if [[ -f "$LOCK_FILE" ]]; then
174
+ while IFS= read -r p; do
175
+ PREV_PATHS+=("$p")
176
+ done < <(awk '
177
+ /^managed_paths:/ {in_list=1; next}
178
+ in_list && /^ - / {sub(/^ - /, ""); print; next}
179
+ in_list && !/^ - / {in_list=0}
180
+ ' "$LOCK_FILE")
181
+ fi
182
+
183
+ for p in "${PREV_PATHS[@]}"; do
184
+ for prefix in "${PROTECTED_PREFIXES[@]}"; do
185
+ if [[ "$p" == "$prefix"* ]]; then
186
+ log_fail "Existing lock file contains protected product-owned path: $p"
187
+ log_fail "Resolve this manually before refreshing the method baseline."
188
+ exit 1
189
+ fi
190
+ done
191
+ done
192
+
193
+ # Compute removal set: paths previously managed but not in incoming list.
194
+ REMOVE_PATHS=()
195
+ if [[ "$NO_DELETE" -ne 1 && ${#PREV_PATHS[@]} -gt 0 ]]; then
196
+ for prev in "${PREV_PATHS[@]}"; do
197
+ keep=0
198
+ for cur in "${INCOMING_PATHS[@]}"; do
199
+ if [[ "$prev" == "$cur" ]]; then
200
+ keep=1
201
+ break
202
+ fi
203
+ done
204
+ if [[ "$keep" -eq 0 ]]; then
205
+ REMOVE_PATHS+=("$prev")
206
+ fi
207
+ done
208
+ fi
209
+
210
+ log_info "Incoming managed files: ${#INCOMING_PATHS[@]}"
211
+ log_info "Conflicts: ${#CONFLICTS[@]}"
212
+ log_info "Removals from previous baseline: ${#REMOVE_PATHS[@]}"
213
+ log_info "Protected ownership prefixes: ${PROTECTED_PREFIXES[*]}"
214
+
215
+ if [[ "$DRY_RUN" -eq 1 ]]; then
216
+ log_info "Dry run enabled. No files modified."
217
+ if [[ ${#CONFLICTS[@]} -gt 0 ]]; then
218
+ log_info "Conflicting files:"
219
+ printf '%s\n' "${CONFLICTS[@]}" | sed 's/^/ - /'
220
+ fi
221
+ if [[ ${#REMOVE_PATHS[@]} -gt 0 ]]; then
222
+ log_info "Files that would be removed:"
223
+ printf '%s\n' "${REMOVE_PATHS[@]}" | sed 's/^/ - /'
224
+ fi
225
+ exit 0
226
+ fi
227
+
228
+ # Apply incoming managed files.
229
+ for p in "${INCOMING_PATHS[@]}"; do
230
+ mkdir -p "$TARGET_REPO/$(dirname "$p")"
231
+ cp "$PAYLOAD_DIR/$p" "$TARGET_REPO/$p"
232
+ done
233
+
234
+ # Remove files no longer managed by this baseline.
235
+ for p in "${REMOVE_PATHS[@]}"; do
236
+ rm -f "$TARGET_REPO/$p"
237
+ done
238
+
239
+ printf '%s\n' "$REPO_KIND_VALUE" > "$TARGET_REPO/$REPO_KIND_FILE"
240
+
241
+ SYNCED_AT_UTC="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
242
+ BUNDLE_SHA="$(sha256sum "$BUNDLE" | awk '{print $1}')"
243
+
244
+ {
245
+ echo "method_repo: sdd-method"
246
+ echo "bundle_version: \"$BUNDLE_VERSION\""
247
+ echo "source_commit: \"$SOURCE_COMMIT\""
248
+ echo "bundle_sha256: \"$BUNDLE_SHA\""
249
+ echo "synced_at_utc: \"$SYNCED_AT_UTC\""
250
+ echo "managed_paths:"
251
+ for p in "${INCOMING_PATHS[@]}"; do
252
+ echo " - $p"
253
+ done
254
+ } > "$LOCK_FILE"
255
+
256
+ log_pass "Method baseline synced to: $TARGET_REPO"
257
+ log_info "Updated lock file: method-baseline.lock"
258
+ log_info "Set repo kind marker: $REPO_KIND_FILE = $REPO_KIND_VALUE"
@@ -0,0 +1,289 @@
1
+ #!/bin/bash
2
+ #
3
+ # validate-app-dependencies.sh - Validate app platform dependency declarations
4
+ #
5
+ # Usage:
6
+ # ./validate-app-dependencies.sh --app-root <path> --platform-root <path>
7
+ #
8
+ # Checks (for each entry in app-platform-dependencies.yaml):
9
+ # 1. required_stability is a valid value (provisional | locked)
10
+ # 2. service_id exists in platform service-architecture.md
11
+ # 3. contract_path exists (as a file) when required_stability is "locked"
12
+ #
13
+ # Outputs a dependency status table.
14
+ # Used as the Stage 6 lock-in gate in the App Exploration Workflow.
15
+
16
+ set -euo pipefail
17
+
18
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
19
+ ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
20
+
21
+ RED='\033[0;31m'
22
+ GREEN='\033[0;32m'
23
+ YELLOW='\033[1;33m'
24
+ BLUE='\033[0;34m'
25
+ NC='\033[0m'
26
+
27
+ log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
28
+ log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
29
+ log_fail() { echo -e "${RED}[FAIL]${NC} $1"; }
30
+ log_pass() { echo -e "${GREEN}[PASS]${NC} $1"; }
31
+ log_section() {
32
+ echo -e "\n${BLUE}═══════════════════════════════════════════════════════════${NC}"
33
+ echo -e "${BLUE} $1${NC}"
34
+ echo -e "${BLUE}═══════════════════════════════════════════════════════════${NC}\n"
35
+ }
36
+
37
+ APP_ROOT=""
38
+ PLATFORM_ROOT=""
39
+
40
+ usage() {
41
+ cat <<USAGE
42
+ Usage: $(basename "$0") --app-root <path> --platform-root <path>
43
+
44
+ Options:
45
+ --app-root Path to the app repository root (must contain app-platform-dependencies.yaml)
46
+ --platform-root Path to the platform repository root (must contain docs/service-architecture.md)
47
+ USAGE
48
+ }
49
+
50
+ while [[ $# -gt 0 ]]; do
51
+ case "$1" in
52
+ --app-root)
53
+ APP_ROOT="${2:-}"
54
+ shift 2
55
+ ;;
56
+ --platform-root)
57
+ PLATFORM_ROOT="${2:-}"
58
+ shift 2
59
+ ;;
60
+ -h|--help)
61
+ usage
62
+ exit 0
63
+ ;;
64
+ *)
65
+ log_fail "Unknown argument: $1"
66
+ usage
67
+ exit 1
68
+ ;;
69
+ esac
70
+ done
71
+
72
+ if [[ -z "$APP_ROOT" ]]; then
73
+ log_fail "--app-root is required"
74
+ usage
75
+ exit 1
76
+ fi
77
+
78
+ if [[ -z "$PLATFORM_ROOT" ]]; then
79
+ log_fail "--platform-root is required"
80
+ usage
81
+ exit 1
82
+ fi
83
+
84
+ if [[ ! -d "$APP_ROOT" ]]; then
85
+ log_fail "App root not found: $APP_ROOT"
86
+ exit 1
87
+ fi
88
+
89
+ if [[ ! -d "$PLATFORM_ROOT" ]]; then
90
+ log_fail "Platform root not found: $PLATFORM_ROOT"
91
+ exit 1
92
+ fi
93
+
94
+ APP_DEPS_FILE="$APP_ROOT/app-platform-dependencies.yaml"
95
+ PLATFORM_SERVICE_ARCH="$PLATFORM_ROOT/docs/platform/service-architecture.md"
96
+
97
+ VALID_STABILITY_VALUES=("provisional" "locked")
98
+
99
+ FAILURES=0
100
+ WARNINGS=0
101
+ TOTAL_DEPS=0
102
+ PASSED_DEPS=0
103
+
104
+ # ──────────────────────────────────────────────────────────────────────────────
105
+ check_prerequisites() {
106
+ log_section "Prerequisites"
107
+
108
+ if [[ ! -f "$APP_DEPS_FILE" ]]; then
109
+ log_fail "app-platform-dependencies.yaml not found: $APP_DEPS_FILE"
110
+ exit 1
111
+ fi
112
+ log_pass "app-platform-dependencies.yaml found"
113
+
114
+ if ! command -v yq &>/dev/null; then
115
+ log_fail "yq is required but not installed. Install with: brew install yq"
116
+ exit 1
117
+ fi
118
+ log_pass "yq available"
119
+
120
+ if [[ ! -f "$PLATFORM_SERVICE_ARCH" ]]; then
121
+ log_warn "Platform service-architecture.md not found: $PLATFORM_SERVICE_ARCH"
122
+ log_warn "service_id validation will be skipped"
123
+ PLATFORM_SERVICE_ARCH=""
124
+ else
125
+ log_pass "Platform service-architecture.md found"
126
+ fi
127
+ }
128
+
129
+ # ──────────────────────────────────────────────────────────────────────────────
130
+ validate_dependency() {
131
+ local index="$1"
132
+ local dep_errors=0
133
+
134
+ local capability_id service_id contract_type required_stability contract_path
135
+
136
+ capability_id="$(yq e ".platform_dependencies[$index].capability_id // \"\"" "$APP_DEPS_FILE")"
137
+ service_id="$(yq e ".platform_dependencies[$index].service_id // \"\"" "$APP_DEPS_FILE")"
138
+ contract_type="$(yq e ".platform_dependencies[$index].contract_type // \"\"" "$APP_DEPS_FILE")"
139
+ required_stability="$(yq e ".platform_dependencies[$index].required_stability // \"\"" "$APP_DEPS_FILE")"
140
+ contract_path="$(yq e ".platform_dependencies[$index].contract_path // \"\"" "$APP_DEPS_FILE")"
141
+
142
+ local dep_label="${service_id:-dep[$index]}"
143
+ if [[ -n "$capability_id" && "$capability_id" != "null" ]]; then
144
+ dep_label="$capability_id / $service_id"
145
+ fi
146
+
147
+ # Check 1: required_stability is a valid value
148
+ local stability_valid=0
149
+ for v in "${VALID_STABILITY_VALUES[@]}"; do
150
+ if [[ "$required_stability" == "$v" ]]; then
151
+ stability_valid=1
152
+ break
153
+ fi
154
+ done
155
+
156
+ if [[ "$stability_valid" -eq 0 ]]; then
157
+ log_fail "$dep_label: invalid required_stability '$required_stability' (allowed: ${VALID_STABILITY_VALUES[*]})"
158
+ ((dep_errors++))
159
+ fi
160
+
161
+ # Check 2: service_id exists in platform service-architecture.md
162
+ if [[ -n "$PLATFORM_SERVICE_ARCH" ]]; then
163
+ if [[ -z "$service_id" || "$service_id" == "null" ]]; then
164
+ log_fail "$dep_label: service_id is empty or missing"
165
+ ((dep_errors++))
166
+ elif ! grep -q "$service_id" "$PLATFORM_SERVICE_ARCH" 2>/dev/null; then
167
+ log_fail "$dep_label: service_id '$service_id' not found in platform service-architecture.md"
168
+ ((dep_errors++))
169
+ fi
170
+ fi
171
+
172
+ # Check 3: contract_path exists when required_stability is locked
173
+ if [[ "$required_stability" == "locked" ]]; then
174
+ if [[ -z "$contract_path" || "$contract_path" == "null" ]]; then
175
+ log_fail "$dep_label: required_stability is 'locked' but contract_path is empty"
176
+ ((dep_errors++))
177
+ else
178
+ local full_contract_path="$PLATFORM_ROOT/$contract_path"
179
+ if [[ ! -f "$full_contract_path" ]]; then
180
+ log_fail "$dep_label: locked contract_path '$contract_path' does not exist in platform repo"
181
+ ((dep_errors++))
182
+ fi
183
+ fi
184
+ elif [[ "$required_stability" == "provisional" ]]; then
185
+ if [[ -n "$contract_path" && "$contract_path" != "null" ]]; then
186
+ local full_contract_path="$PLATFORM_ROOT/$contract_path"
187
+ if [[ ! -f "$full_contract_path" ]]; then
188
+ log_warn "$dep_label: contract_path '$contract_path' declared but not yet present (provisional — acceptable)"
189
+ ((WARNINGS++))
190
+ fi
191
+ fi
192
+ fi
193
+
194
+ if [[ "$dep_errors" -eq 0 ]]; then
195
+ log_pass "$dep_label: stability=$required_stability type=$contract_type"
196
+ ((PASSED_DEPS++))
197
+ return 0
198
+ fi
199
+
200
+ FAILURES=$((FAILURES + dep_errors))
201
+ return 1
202
+ }
203
+
204
+ # ──────────────────────────────────────────────────────────────────────────────
205
+ print_status_table() {
206
+ log_section "Dependency Status Table"
207
+
208
+ local app_id
209
+ app_id="$(yq e ".app_id // \"unknown\"" "$APP_DEPS_FILE")"
210
+ log_info "App: $app_id"
211
+
212
+ printf "\n %-30s %-15s %-12s %s\n" "Service ID" "Stability" "Contract" "Status"
213
+ printf " %-30s %-15s %-12s %s\n" "──────────────────────────────" "───────────────" "────────────" "──────────"
214
+
215
+ local count
216
+ count="$(yq e ".platform_dependencies | length" "$APP_DEPS_FILE")"
217
+
218
+ for ((i = 0; i < count; i++)); do
219
+ local service_id required_stability contract_type contract_path dep_status
220
+ service_id="$(yq e ".platform_dependencies[$i].service_id // \"(missing)\"" "$APP_DEPS_FILE")"
221
+ required_stability="$(yq e ".platform_dependencies[$i].required_stability // \"(missing)\"" "$APP_DEPS_FILE")"
222
+ contract_type="$(yq e ".platform_dependencies[$i].contract_type // \"(missing)\"" "$APP_DEPS_FILE")"
223
+ contract_path="$(yq e ".platform_dependencies[$i].contract_path // \"\"" "$APP_DEPS_FILE")"
224
+
225
+ # Determine display status
226
+ if [[ "$required_stability" == "locked" ]]; then
227
+ if [[ -n "$contract_path" && "$contract_path" != "null" && -f "$PLATFORM_ROOT/$contract_path" ]]; then
228
+ dep_status="${GREEN}LOCKED OK${NC}"
229
+ else
230
+ dep_status="${RED}LOCKED UNMET${NC}"
231
+ fi
232
+ elif [[ "$required_stability" == "provisional" ]]; then
233
+ dep_status="${YELLOW}PROVISIONAL${NC}"
234
+ else
235
+ dep_status="${RED}INVALID${NC}"
236
+ fi
237
+
238
+ printf " %-30s %-15s %-12s " "$service_id" "$required_stability" "$contract_type"
239
+ echo -e "$dep_status"
240
+ done
241
+ echo ""
242
+ }
243
+
244
+ # ──────────────────────────────────────────────────────────────────────────────
245
+ main() {
246
+ log_section "App Dependency Validation"
247
+ log_info "App root: $APP_ROOT"
248
+ log_info "Platform root: $PLATFORM_ROOT"
249
+
250
+ check_prerequisites
251
+
252
+ log_section "Validating Dependencies"
253
+
254
+ local dep_count
255
+ dep_count="$(yq e ".platform_dependencies | length" "$APP_DEPS_FILE")"
256
+ TOTAL_DEPS="$dep_count"
257
+
258
+ if [[ "$dep_count" -eq 0 ]]; then
259
+ log_warn "No platform_dependencies entries found in app-platform-dependencies.yaml"
260
+ log_info "If this app has no platform deps, this is acceptable."
261
+ exit 0
262
+ fi
263
+
264
+ for ((i = 0; i < dep_count; i++)); do
265
+ validate_dependency "$i" || true
266
+ done
267
+
268
+ print_status_table
269
+
270
+ log_section "Summary"
271
+ log_info "Total dependencies: $TOTAL_DEPS"
272
+ log_info "Passed: $PASSED_DEPS"
273
+ log_info "Warnings: $WARNINGS"
274
+ log_info "Failures: $FAILURES"
275
+
276
+ if [[ "$FAILURES" -gt 0 ]]; then
277
+ log_fail "$FAILURES dependency check(s) failed. Stage 6 lock-in gate NOT met."
278
+ exit 1
279
+ fi
280
+
281
+ if [[ "$WARNINGS" -gt 0 ]]; then
282
+ log_warn "All required checks passed with $WARNINGS warning(s)."
283
+ else
284
+ log_pass "All dependency checks passed. Stage 6 lock-in gate met."
285
+ fi
286
+ exit 0
287
+ }
288
+
289
+ main "$@"