@ybotok/loam 0.1.0-beta.2 → 0.2.0-alpha.1

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 (1026) hide show
  1. package/CHANGELOG.md +2570 -61
  2. package/COMPARISON.md +80 -63
  3. package/CONTRIBUTING.md +84 -0
  4. package/MIGRATING-from-OpenSpec.md +213 -54
  5. package/QUICKSTART.md +125 -0
  6. package/README.md +450 -150
  7. package/ROADMAP.md +494 -0
  8. package/SCHEMA.md +2362 -245
  9. package/SECURITY.md +21 -3
  10. package/WORKFLOW.md +701 -0
  11. package/dist/cli.js +113 -19
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/adopt/adopt.js +209 -0
  14. package/dist/commands/adopt/adopt.js.map +1 -0
  15. package/dist/commands/adopt/render.js +268 -0
  16. package/dist/commands/adopt/render.js.map +1 -0
  17. package/dist/commands/archive/archive.js +77 -0
  18. package/dist/commands/archive/archive.js.map +1 -0
  19. package/dist/commands/archive/plan/contracts/asyncapi.js +178 -0
  20. package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
  21. package/dist/commands/archive/plan/contracts/openapi.js +159 -0
  22. package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
  23. package/dist/commands/archive/plan/gate.js +317 -0
  24. package/dist/commands/archive/plan/gate.js.map +1 -0
  25. package/dist/commands/archive/plan/landscape.js +161 -0
  26. package/dist/commands/archive/plan/landscape.js.map +1 -0
  27. package/dist/commands/archive/plan/refusal.js +111 -0
  28. package/dist/commands/archive/plan/refusal.js.map +1 -0
  29. package/dist/commands/archive/plan/specs.js +237 -0
  30. package/dist/commands/archive/plan/specs.js.map +1 -0
  31. package/dist/commands/archive/plan/state.js +27 -0
  32. package/dist/commands/archive/plan/state.js.map +1 -0
  33. package/dist/commands/archive/run.js +251 -0
  34. package/dist/commands/archive/run.js.map +1 -0
  35. package/dist/commands/context/context.js +99 -0
  36. package/dist/commands/context/context.js.map +1 -0
  37. package/dist/commands/context/print.js +283 -0
  38. package/dist/commands/context/print.js.map +1 -0
  39. package/dist/commands/delta/delta.js +279 -0
  40. package/dist/commands/delta/delta.js.map +1 -0
  41. package/dist/commands/delta/print.js +205 -0
  42. package/dist/commands/delta/print.js.map +1 -0
  43. package/dist/commands/dependencies.js +9 -7
  44. package/dist/commands/dependencies.js.map +1 -1
  45. package/dist/commands/diff/diff.js +93 -0
  46. package/dist/commands/diff/diff.js.map +1 -0
  47. package/dist/commands/diff/print.js +38 -0
  48. package/dist/commands/diff/print.js.map +1 -0
  49. package/dist/commands/doctor.js +5 -4
  50. package/dist/commands/doctor.js.map +1 -1
  51. package/dist/commands/explain/explain.js +151 -0
  52. package/dist/commands/explain/explain.js.map +1 -0
  53. package/dist/commands/explore.js +29 -24
  54. package/dist/commands/explore.js.map +1 -1
  55. package/dist/commands/gate/gate.js +115 -0
  56. package/dist/commands/gate/gate.js.map +1 -0
  57. package/dist/commands/gate/print.js +54 -0
  58. package/dist/commands/gate/print.js.map +1 -0
  59. package/dist/commands/gherkin/commit.js +146 -0
  60. package/dist/commands/gherkin/commit.js.map +1 -0
  61. package/dist/commands/gherkin/gherkin.js +246 -0
  62. package/dist/commands/gherkin/gherkin.js.map +1 -0
  63. package/dist/commands/gherkin/reconcile.js +149 -0
  64. package/dist/commands/gherkin/reconcile.js.map +1 -0
  65. package/dist/commands/gherkin/render.js +77 -0
  66. package/dist/commands/gherkin/render.js.map +1 -0
  67. package/dist/commands/init/example.js +204 -0
  68. package/dist/commands/init/example.js.map +1 -0
  69. package/dist/commands/init/first-hour.js +28 -0
  70. package/dist/commands/init/first-hour.js.map +1 -0
  71. package/dist/commands/{init.js → init/init.js} +146 -71
  72. package/dist/commands/init/init.js.map +1 -0
  73. package/dist/commands/init/mcp.js +131 -0
  74. package/dist/commands/init/mcp.js.map +1 -0
  75. package/dist/commands/init/options.js +78 -0
  76. package/dist/commands/init/options.js.map +1 -0
  77. package/dist/commands/instructions.js +82 -14
  78. package/dist/commands/instructions.js.map +1 -1
  79. package/dist/commands/list/campaign/campaign.js +65 -0
  80. package/dist/commands/list/campaign/campaign.js.map +1 -0
  81. package/dist/commands/list/campaign/owners.js +65 -0
  82. package/dist/commands/list/campaign/owners.js.map +1 -0
  83. package/dist/commands/list/json.js +157 -0
  84. package/dist/commands/list/json.js.map +1 -0
  85. package/dist/commands/list/list.js +343 -0
  86. package/dist/commands/list/list.js.map +1 -0
  87. package/dist/commands/list/print.js +301 -0
  88. package/dist/commands/list/print.js.map +1 -0
  89. package/dist/commands/list/review.js +120 -0
  90. package/dist/commands/list/review.js.map +1 -0
  91. package/dist/commands/list/views.js +105 -0
  92. package/dist/commands/list/views.js.map +1 -0
  93. package/dist/commands/mcp/dispatch.js +183 -0
  94. package/dist/commands/mcp/dispatch.js.map +1 -0
  95. package/dist/commands/mcp/mcp.js +34 -0
  96. package/dist/commands/mcp/mcp.js.map +1 -0
  97. package/dist/commands/mcp/serve.js +55 -0
  98. package/dist/commands/mcp/serve.js.map +1 -0
  99. package/dist/commands/migrate-openspec/materialize/active.js +170 -0
  100. package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
  101. package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
  102. package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
  103. package/dist/commands/migrate-openspec/materialize/living.js +62 -0
  104. package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
  105. package/dist/commands/migrate-openspec/materialize/stage.js +142 -0
  106. package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
  107. package/dist/commands/migrate-openspec/materialize/target.js +219 -0
  108. package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
  109. package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
  110. package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
  111. package/dist/commands/migrate-openspec/openspec/decisions.js +91 -0
  112. package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
  113. package/dist/commands/migrate-openspec/openspec/error.js +19 -0
  114. package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
  115. package/dist/commands/migrate-openspec/openspec/mapping.js +170 -0
  116. package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
  117. package/dist/commands/migrate-openspec/openspec/paths.js +43 -0
  118. package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
  119. package/dist/commands/migrate-openspec/openspec/read.js +49 -0
  120. package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
  121. package/dist/commands/migrate-openspec/print.js +89 -0
  122. package/dist/commands/migrate-openspec/print.js.map +1 -0
  123. package/dist/commands/new/commit.js +76 -0
  124. package/dist/commands/new/commit.js.map +1 -0
  125. package/dist/commands/new/new.js +283 -0
  126. package/dist/commands/new/new.js.map +1 -0
  127. package/dist/commands/new/templates.js +355 -0
  128. package/dist/commands/new/templates.js.map +1 -0
  129. package/dist/commands/open.js +203 -0
  130. package/dist/commands/open.js.map +1 -0
  131. package/dist/commands/policy/format.js +152 -0
  132. package/dist/commands/policy/format.js.map +1 -0
  133. package/dist/commands/{docs-repo-gate.js → policy/gate.js} +11 -11
  134. package/dist/commands/policy/gate.js.map +1 -0
  135. package/dist/commands/rebase/edit.js +106 -0
  136. package/dist/commands/rebase/edit.js.map +1 -0
  137. package/dist/commands/rebase/living.js +185 -0
  138. package/dist/commands/rebase/living.js.map +1 -0
  139. package/dist/commands/rebase/plan.js +245 -0
  140. package/dist/commands/rebase/plan.js.map +1 -0
  141. package/dist/commands/rebase/rebase.js +275 -0
  142. package/dist/commands/rebase/rebase.js.map +1 -0
  143. package/dist/commands/seed/commit.js +192 -0
  144. package/dist/commands/seed/commit.js.map +1 -0
  145. package/dist/commands/seed/plan.js +133 -0
  146. package/dist/commands/seed/plan.js.map +1 -0
  147. package/dist/commands/seed/seed.js +172 -0
  148. package/dist/commands/seed/seed.js.map +1 -0
  149. package/dist/commands/show/feature.js +178 -0
  150. package/dist/commands/show/feature.js.map +1 -0
  151. package/dist/commands/show/marks.js +24 -0
  152. package/dist/commands/show/marks.js.map +1 -0
  153. package/dist/commands/{show.js → show/service.js} +63 -152
  154. package/dist/commands/show/service.js.map +1 -0
  155. package/dist/commands/show/show.js +77 -0
  156. package/dist/commands/show/show.js.map +1 -0
  157. package/dist/commands/status/json.js +45 -0
  158. package/dist/commands/status/json.js.map +1 -0
  159. package/dist/commands/status/print.js +157 -0
  160. package/dist/commands/status/print.js.map +1 -0
  161. package/dist/commands/status/status.js +119 -0
  162. package/dist/commands/status/status.js.map +1 -0
  163. package/dist/commands/steps/steps.js +189 -0
  164. package/dist/commands/steps/steps.js.map +1 -0
  165. package/dist/commands/subsystem/edit.js +192 -0
  166. package/dist/commands/subsystem/edit.js.map +1 -0
  167. package/dist/commands/subsystem/move.js +265 -0
  168. package/dist/commands/subsystem/move.js.map +1 -0
  169. package/dist/commands/subsystem/query.js +115 -0
  170. package/dist/commands/subsystem/query.js.map +1 -0
  171. package/dist/commands/subsystem/subsystem.js +101 -0
  172. package/dist/commands/subsystem/subsystem.js.map +1 -0
  173. package/dist/commands/subsystem/sync.js +103 -0
  174. package/dist/commands/subsystem/sync.js.map +1 -0
  175. package/dist/commands/subsystem/txn/txn.js +94 -0
  176. package/dist/commands/subsystem/txn/txn.js.map +1 -0
  177. package/dist/commands/subsystem/txn/views.js +70 -0
  178. package/dist/commands/subsystem/txn/views.js.map +1 -0
  179. package/dist/commands/unarchive/manifest.js +160 -0
  180. package/dist/commands/unarchive/manifest.js.map +1 -0
  181. package/dist/commands/{unarchive.js → unarchive/restore.js} +47 -160
  182. package/dist/commands/unarchive/restore.js.map +1 -0
  183. package/dist/commands/unarchive/unarchive.js +67 -0
  184. package/dist/commands/unarchive/unarchive.js.map +1 -0
  185. package/dist/commands/validate/arch-coverage.js +194 -0
  186. package/dist/commands/validate/arch-coverage.js.map +1 -0
  187. package/dist/commands/validate/checks/fleet-shape.js +296 -0
  188. package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
  189. package/dist/commands/validate/checks/health-deps.js +55 -0
  190. package/dist/commands/validate/checks/health-deps.js.map +1 -0
  191. package/dist/commands/validate/checks/requirements.js +254 -0
  192. package/dist/commands/validate/checks/requirements.js.map +1 -0
  193. package/dist/commands/validate/checks/sources.js +76 -0
  194. package/dist/commands/validate/checks/sources.js.map +1 -0
  195. package/dist/commands/validate/checks/vocabulary.js +31 -0
  196. package/dist/commands/validate/checks/vocabulary.js.map +1 -0
  197. package/dist/commands/validate/feature.js +216 -0
  198. package/dist/commands/validate/feature.js.map +1 -0
  199. package/dist/commands/validate/fleet/census.js +69 -0
  200. package/dist/commands/validate/fleet/census.js.map +1 -0
  201. package/dist/commands/validate/fleet/kind-tags.js +39 -0
  202. package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
  203. package/dist/commands/validate/fleet/landscape.js +353 -0
  204. package/dist/commands/validate/fleet/landscape.js.map +1 -0
  205. package/dist/commands/validate/fleet/load.js +52 -0
  206. package/dist/commands/validate/fleet/load.js.map +1 -0
  207. package/dist/commands/validate/fleet/obligations.js +236 -0
  208. package/dist/commands/validate/fleet/obligations.js.map +1 -0
  209. package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
  210. package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
  211. package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
  212. package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
  213. package/dist/commands/validate/fleet/scorecard/print.js +63 -0
  214. package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
  215. package/dist/commands/validate/fleet/scorecard/scorecard.js +156 -0
  216. package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
  217. package/dist/commands/validate/fleet/usecases/capability-tag.js +94 -0
  218. package/dist/commands/validate/fleet/usecases/capability-tag.js.map +1 -0
  219. package/dist/commands/validate/fleet/usecases/place.js +13 -0
  220. package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
  221. package/dist/commands/validate/fleet/usecases/requirement-tag.js +95 -0
  222. package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +1 -0
  223. package/dist/commands/validate/fleet/usecases/steps.js +197 -0
  224. package/dist/commands/validate/fleet/usecases/steps.js.map +1 -0
  225. package/dist/commands/validate/fleet/usecases/usecases.js +99 -0
  226. package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -0
  227. package/dist/commands/validate/fleet/views/ids.js +40 -0
  228. package/dist/commands/validate/fleet/views/ids.js.map +1 -0
  229. package/dist/commands/validate/fleet/views/stale.js +59 -0
  230. package/dist/commands/validate/fleet/views/stale.js.map +1 -0
  231. package/dist/commands/validate/links/corpus.js +92 -0
  232. package/dist/commands/validate/links/corpus.js.map +1 -0
  233. package/dist/commands/validate/links/glossary.js +75 -0
  234. package/dist/commands/validate/links/glossary.js.map +1 -0
  235. package/dist/commands/validate/report.js +269 -0
  236. package/dist/commands/validate/report.js.map +1 -0
  237. package/dist/commands/validate/service/api.js +338 -0
  238. package/dist/commands/validate/service/api.js.map +1 -0
  239. package/dist/commands/validate/service/events/events.js +219 -0
  240. package/dist/commands/validate/service/events/events.js.map +1 -0
  241. package/dist/commands/validate/service/events/message-producers.js +77 -0
  242. package/dist/commands/validate/service/events/message-producers.js.map +1 -0
  243. package/dist/commands/validate/service/evidence-pins.js +131 -0
  244. package/dist/commands/validate/service/evidence-pins.js.map +1 -0
  245. package/dist/commands/validate/service/service.js +250 -0
  246. package/dist/commands/validate/service/service.js.map +1 -0
  247. package/dist/commands/validate/service/specs.js +219 -0
  248. package/dist/commands/validate/service/specs.js.map +1 -0
  249. package/dist/commands/validate/service/spine.js +113 -0
  250. package/dist/commands/validate/service/spine.js.map +1 -0
  251. package/dist/commands/validate/validate.js +338 -0
  252. package/dist/commands/validate/validate.js.map +1 -0
  253. package/dist/commands/verify/cross/diff.js +182 -0
  254. package/dist/commands/verify/cross/diff.js.map +1 -0
  255. package/dist/commands/verify/evidence/contract.js +32 -0
  256. package/dist/commands/verify/evidence/contract.js.map +1 -0
  257. package/dist/commands/verify/evidence/pins.js +52 -0
  258. package/dist/commands/verify/evidence/pins.js.map +1 -0
  259. package/dist/commands/verify/evidence/read.js +72 -0
  260. package/dist/commands/verify/evidence/read.js.map +1 -0
  261. package/dist/commands/verify/frozen.js +241 -0
  262. package/dist/commands/verify/frozen.js.map +1 -0
  263. package/dist/commands/verify/record.js +226 -0
  264. package/dist/commands/verify/record.js.map +1 -0
  265. package/dist/commands/verify/report.js +223 -0
  266. package/dist/commands/verify/report.js.map +1 -0
  267. package/dist/commands/verify/results.js +246 -0
  268. package/dist/commands/verify/results.js.map +1 -0
  269. package/dist/commands/verify/verify.js +217 -0
  270. package/dist/commands/verify/verify.js.map +1 -0
  271. package/dist/commands/vouch/contract.js +11 -0
  272. package/dist/commands/vouch/contract.js.map +1 -0
  273. package/dist/commands/vouch/pack/contract.js +2 -0
  274. package/dist/commands/vouch/pack/contract.js.map +1 -0
  275. package/dist/commands/vouch/pack/pack.js +266 -0
  276. package/dist/commands/vouch/pack/pack.js.map +1 -0
  277. package/dist/commands/vouch/pack/print.js +271 -0
  278. package/dist/commands/vouch/pack/print.js.map +1 -0
  279. package/dist/commands/vouch/pack/sections.js +142 -0
  280. package/dist/commands/vouch/pack/sections.js.map +1 -0
  281. package/dist/commands/vouch/prompt/confirm.js +46 -0
  282. package/dist/commands/vouch/prompt/confirm.js.map +1 -0
  283. package/dist/commands/vouch/report.js +101 -0
  284. package/dist/commands/vouch/report.js.map +1 -0
  285. package/dist/commands/vouch/run.js +285 -0
  286. package/dist/commands/vouch/run.js.map +1 -0
  287. package/dist/commands/vouch/sample/plan.js +125 -0
  288. package/dist/commands/vouch/sample/plan.js.map +1 -0
  289. package/dist/commands/vouch/sample/print.js +109 -0
  290. package/dist/commands/vouch/sample/print.js.map +1 -0
  291. package/dist/commands/vouch/vet/verify.js +123 -0
  292. package/dist/commands/vouch/vet/verify.js.map +1 -0
  293. package/dist/commands/vouch/vouch.js +176 -0
  294. package/dist/commands/vouch/vouch.js.map +1 -0
  295. package/dist/core/agent/agents-md/artifacts.js +220 -0
  296. package/dist/core/agent/agents-md/artifacts.js.map +1 -0
  297. package/dist/core/agent/agents-md/command-map.js +324 -0
  298. package/dist/core/agent/agents-md/command-map.js.map +1 -0
  299. package/dist/core/agent/agents-md/cycle.js +165 -0
  300. package/dist/core/agent/agents-md/cycle.js.map +1 -0
  301. package/dist/core/agent/agents-md/map/explain.js +34 -0
  302. package/dist/core/agent/agents-md/map/explain.js.map +1 -0
  303. package/dist/core/agent/agents-md/map/lenses/context.js +41 -0
  304. package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
  305. package/dist/core/agent/agents-md/map/lenses/diff.js +46 -0
  306. package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
  307. package/dist/core/agent/agents-md/map/lenses/gate.js +57 -0
  308. package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
  309. package/dist/core/agent/agents-md/map/mcp.js +41 -0
  310. package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
  311. package/dist/core/agent/agents-md/map/status.js +62 -0
  312. package/dist/core/agent/agents-md/map/status.js.map +1 -0
  313. package/dist/core/agent/agents-md/map/subsystem.js +32 -0
  314. package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
  315. package/dist/core/agent/agents-md/map/usecases.js +60 -0
  316. package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
  317. package/dist/core/agent/agents-md/refusals.js +246 -0
  318. package/dist/core/agent/agents-md/refusals.js.map +1 -0
  319. package/dist/core/agent/agents-md/shipped/archive-gate.js +98 -0
  320. package/dist/core/agent/agents-md/shipped/archive-gate.js.map +1 -0
  321. package/dist/core/agent/agents-md/spine.js +40 -0
  322. package/dist/core/agent/agents-md/spine.js.map +1 -0
  323. package/dist/core/agent/agents-md.js +170 -0
  324. package/dist/core/agent/agents-md.js.map +1 -0
  325. package/dist/core/agent/agents-stamp.js +155 -0
  326. package/dist/core/agent/agents-stamp.js.map +1 -0
  327. package/dist/core/agent/contract.js +2 -0
  328. package/dist/core/agent/contract.js.map +1 -0
  329. package/dist/core/agent/protocol.js +193 -0
  330. package/dist/core/agent/protocol.js.map +1 -0
  331. package/dist/core/agent/scaffold.js +259 -0
  332. package/dist/core/agent/scaffold.js.map +1 -0
  333. package/dist/core/agent/support/report.js +103 -0
  334. package/dist/core/agent/support/report.js.map +1 -0
  335. package/dist/core/agent/tools/dialects.js +150 -0
  336. package/dist/core/agent/tools/dialects.js.map +1 -0
  337. package/dist/core/agent/tools/registry.js +228 -0
  338. package/dist/core/agent/tools/registry.js.map +1 -0
  339. package/dist/core/agent/workflows/adopt.js +133 -0
  340. package/dist/core/agent/workflows/adopt.js.map +1 -0
  341. package/dist/core/agent/workflows/check.js +334 -0
  342. package/dist/core/agent/workflows/check.js.map +1 -0
  343. package/dist/core/agent/workflows/closing.js +262 -0
  344. package/dist/core/agent/workflows/closing.js.map +1 -0
  345. package/dist/core/agent/workflows/feature.js +105 -0
  346. package/dist/core/agent/workflows/feature.js.map +1 -0
  347. package/dist/core/agent/workflows/implement.js +105 -0
  348. package/dist/core/agent/workflows/implement.js.map +1 -0
  349. package/dist/core/agent/workflows/reference/authoring.js +209 -0
  350. package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
  351. package/dist/core/agent/workflows/reference/codes.js +65 -0
  352. package/dist/core/agent/workflows/reference/codes.js.map +1 -0
  353. package/dist/core/agent/workflows/reference/done-check.js +188 -0
  354. package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
  355. package/dist/core/agent/workflows/reference/reference.js +16 -0
  356. package/dist/core/agent/workflows/reference/reference.js.map +1 -0
  357. package/dist/core/agent/workflows/reference/spine.js +297 -0
  358. package/dist/core/agent/workflows/reference/spine.js.map +1 -0
  359. package/dist/core/asyncapi/baseline/plan.js +110 -0
  360. package/dist/core/asyncapi/baseline/plan.js.map +1 -0
  361. package/dist/core/asyncapi/baseline/surfaces.js +54 -0
  362. package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
  363. package/dist/core/asyncapi/depth.js +164 -0
  364. package/dist/core/asyncapi/depth.js.map +1 -0
  365. package/dist/core/asyncapi/digest.js +141 -0
  366. package/dist/core/asyncapi/digest.js.map +1 -0
  367. package/dist/core/asyncapi/merge/components.js +91 -0
  368. package/dist/core/asyncapi/merge/components.js.map +1 -0
  369. package/dist/core/asyncapi/merge/error.js +33 -0
  370. package/dist/core/asyncapi/merge/error.js.map +1 -0
  371. package/dist/core/asyncapi/merge/markers.js +308 -0
  372. package/dist/core/asyncapi/merge/markers.js.map +1 -0
  373. package/dist/core/asyncapi/merge/merge.js +215 -0
  374. package/dist/core/asyncapi/merge/merge.js.map +1 -0
  375. package/dist/core/asyncapi/merge/pin.js +107 -0
  376. package/dist/core/asyncapi/merge/pin.js.map +1 -0
  377. package/dist/core/asyncapi/model.js +11 -0
  378. package/dist/core/asyncapi/model.js.map +1 -0
  379. package/dist/core/asyncapi/producers.js +50 -0
  380. package/dist/core/asyncapi/producers.js.map +1 -0
  381. package/dist/core/asyncapi/read.js +239 -0
  382. package/dist/core/asyncapi/read.js.map +1 -0
  383. package/dist/core/brief/brief.js +225 -0
  384. package/dist/core/brief/brief.js.map +1 -0
  385. package/dist/core/brief/checks.js +250 -0
  386. package/dist/core/brief/checks.js.map +1 -0
  387. package/dist/core/brief/landscape.js +194 -0
  388. package/dist/core/brief/landscape.js.map +1 -0
  389. package/dist/core/brief/targets.js +226 -0
  390. package/dist/core/brief/targets.js.map +1 -0
  391. package/dist/core/brief/unchecked.js +47 -0
  392. package/dist/core/brief/unchecked.js.map +1 -0
  393. package/dist/core/c4/arch.js +282 -0
  394. package/dist/core/c4/arch.js.map +1 -0
  395. package/dist/core/c4/likec4.js +88 -0
  396. package/dist/core/c4/likec4.js.map +1 -0
  397. package/dist/core/c4/parsed/dynamic-views.js +132 -0
  398. package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
  399. package/dist/core/c4/parsed/specification.js +78 -0
  400. package/dist/core/c4/parsed/specification.js.map +1 -0
  401. package/dist/core/c4/parsed/values.js +57 -0
  402. package/dist/core/c4/parsed/values.js.map +1 -0
  403. package/dist/core/c4/parsed/view-ids.js +75 -0
  404. package/dist/core/c4/parsed/view-ids.js.map +1 -0
  405. package/dist/core/c4/project/architecture.js +45 -0
  406. package/dist/core/c4/project/architecture.js.map +1 -0
  407. package/dist/core/c4/project/documents.js +58 -0
  408. package/dist/core/c4/project/documents.js.map +1 -0
  409. package/dist/core/c4/project/load.js +183 -0
  410. package/dist/core/c4/project/load.js.map +1 -0
  411. package/dist/core/c4/resolve/service.js +113 -0
  412. package/dist/core/c4/resolve/service.js.map +1 -0
  413. package/dist/core/c4/seed/fleet-file.js +201 -0
  414. package/dist/core/c4/seed/fleet-file.js.map +1 -0
  415. package/dist/core/c4/seed/items.js +91 -0
  416. package/dist/core/c4/seed/items.js.map +1 -0
  417. package/dist/core/c4/seed/stamp.js +48 -0
  418. package/dist/core/c4/seed/stamp.js.map +1 -0
  419. package/dist/core/c4/seed/template.js +109 -0
  420. package/dist/core/c4/seed/template.js.map +1 -0
  421. package/dist/core/c4/source-mask.js +82 -0
  422. package/dist/core/c4/source-mask.js.map +1 -0
  423. package/dist/core/c4/source-scan.js +227 -0
  424. package/dist/core/c4/source-scan.js.map +1 -0
  425. package/dist/core/c4/splice/authored-source.js +101 -0
  426. package/dist/core/c4/splice/authored-source.js.map +1 -0
  427. package/dist/core/c4/splice/contract.js +10 -0
  428. package/dist/core/c4/splice/contract.js.map +1 -0
  429. package/dist/core/c4/splice/delta-blocks.js +126 -0
  430. package/dist/core/c4/splice/delta-blocks.js.map +1 -0
  431. package/dist/core/c4/splice/identity/edges.js +36 -0
  432. package/dist/core/c4/splice/identity/edges.js.map +1 -0
  433. package/dist/core/c4/splice/landscape-merge.js +269 -0
  434. package/dist/core/c4/splice/landscape-merge.js.map +1 -0
  435. package/dist/core/c4/splice/placement.js +194 -0
  436. package/dist/core/c4/splice/placement.js.map +1 -0
  437. package/dist/core/c4/workspace.js +172 -0
  438. package/dist/core/c4/workspace.js.map +1 -0
  439. package/dist/core/capabilities/authoring/notes.js +141 -0
  440. package/dist/core/capabilities/authoring/notes.js.map +1 -0
  441. package/dist/core/capabilities/capabilities.js +124 -0
  442. package/dist/core/capabilities/capabilities.js.map +1 -0
  443. package/dist/core/capabilities/delta/doc.js +50 -0
  444. package/dist/core/capabilities/delta/doc.js.map +1 -0
  445. package/dist/core/capabilities/delta/overlay.js +129 -0
  446. package/dist/core/capabilities/delta/overlay.js.map +1 -0
  447. package/dist/core/capabilities/delta/summary.js +57 -0
  448. package/dist/core/capabilities/delta/summary.js.map +1 -0
  449. package/dist/core/capabilities/delta/tree.js +43 -0
  450. package/dist/core/capabilities/delta/tree.js.map +1 -0
  451. package/dist/core/capabilities/delta/uncovered.js +222 -0
  452. package/dist/core/capabilities/delta/uncovered.js.map +1 -0
  453. package/dist/core/capabilities/findings.js +342 -0
  454. package/dist/core/capabilities/findings.js.map +1 -0
  455. package/dist/core/capabilities/realizes/findings.js +181 -0
  456. package/dist/core/capabilities/realizes/findings.js.map +1 -0
  457. package/dist/core/capabilities/realizes/join.js +143 -0
  458. package/dist/core/capabilities/realizes/join.js.map +1 -0
  459. package/dist/core/capabilities/rollup.js +199 -0
  460. package/dist/core/capabilities/rollup.js.map +1 -0
  461. package/dist/core/capabilities/tree.js +126 -0
  462. package/dist/core/capabilities/tree.js.map +1 -0
  463. package/dist/core/capabilities/usecase-join.js +277 -0
  464. package/dist/core/capabilities/usecase-join.js.map +1 -0
  465. package/dist/core/coherence/authoring/scaffold.js +177 -0
  466. package/dist/core/coherence/authoring/scaffold.js.map +1 -0
  467. package/dist/core/coherence/authoring/sentinels.js +74 -0
  468. package/dist/core/coherence/authoring/sentinels.js.map +1 -0
  469. package/dist/core/coherence/coherence.js +251 -0
  470. package/dist/core/coherence/coherence.js.map +1 -0
  471. package/dist/core/coherence/declared.js +269 -0
  472. package/dist/core/coherence/declared.js.map +1 -0
  473. package/dist/core/coherence/events/declared.js +206 -0
  474. package/dist/core/coherence/events/declared.js.map +1 -0
  475. package/dist/core/coherence/events/events.js +204 -0
  476. package/dist/core/coherence/events/events.js.map +1 -0
  477. package/dist/core/coherence/events/grades.js +166 -0
  478. package/dist/core/coherence/events/grades.js.map +1 -0
  479. package/dist/core/coherence/events/lookups.js +122 -0
  480. package/dist/core/coherence/events/lookups.js.map +1 -0
  481. package/dist/core/coherence/events/merged.js +40 -0
  482. package/dist/core/coherence/events/merged.js.map +1 -0
  483. package/dist/core/coherence/living.js +198 -0
  484. package/dist/core/coherence/living.js.map +1 -0
  485. package/dist/core/coherence/lookups.js +155 -0
  486. package/dist/core/coherence/lookups.js.map +1 -0
  487. package/dist/core/coherence/pending.js +39 -0
  488. package/dist/core/coherence/pending.js.map +1 -0
  489. package/dist/core/conflict-markers.js +60 -0
  490. package/dist/core/conflict-markers.js.map +1 -0
  491. package/dist/core/delta/claims.js +73 -0
  492. package/dist/core/delta/claims.js.map +1 -0
  493. package/dist/core/delta/delta.js +296 -0
  494. package/dist/core/delta/delta.js.map +1 -0
  495. package/dist/core/delta/document.js +177 -0
  496. package/dist/core/delta/document.js.map +1 -0
  497. package/dist/core/delta/scope.js +48 -0
  498. package/dist/core/delta/scope.js.map +1 -0
  499. package/dist/core/delta/select.js +237 -0
  500. package/dist/core/delta/select.js.map +1 -0
  501. package/dist/core/dependencies/dependencies.js +141 -0
  502. package/dist/core/dependencies/dependencies.js.map +1 -0
  503. package/dist/core/dependencies/facts.js +165 -0
  504. package/dist/core/dependencies/facts.js.map +1 -0
  505. package/dist/core/dependencies/fanin.js +88 -0
  506. package/dist/core/dependencies/fanin.js.map +1 -0
  507. package/dist/core/dependencies/graph.js +106 -0
  508. package/dist/core/dependencies/graph.js.map +1 -0
  509. package/dist/core/diff/base-git.js +148 -0
  510. package/dist/core/diff/base-git.js.map +1 -0
  511. package/dist/core/diff/base-state.js +209 -0
  512. package/dist/core/diff/base-state.js.map +1 -0
  513. package/dist/core/diff/current-state.js +96 -0
  514. package/dist/core/diff/current-state.js.map +1 -0
  515. package/dist/core/diff/scope/changed-paths.js +188 -0
  516. package/dist/core/diff/scope/changed-paths.js.map +1 -0
  517. package/dist/core/diff/semantic.js +243 -0
  518. package/dist/core/diff/semantic.js.map +1 -0
  519. package/dist/core/diff/victims.js +247 -0
  520. package/dist/core/diff/victims.js.map +1 -0
  521. package/dist/core/docs.js +59 -55
  522. package/dist/core/docs.js.map +1 -1
  523. package/dist/core/doctor/agents.js +222 -0
  524. package/dist/core/doctor/agents.js.map +1 -0
  525. package/dist/core/doctor/config.js +135 -0
  526. package/dist/core/doctor/config.js.map +1 -0
  527. package/dist/core/doctor/doctor.js +275 -0
  528. package/dist/core/doctor/doctor.js.map +1 -0
  529. package/dist/core/doctor/report.js +13 -0
  530. package/dist/core/doctor/report.js.map +1 -0
  531. package/dist/core/doctor/residue.js +110 -0
  532. package/dist/core/doctor/residue.js.map +1 -0
  533. package/dist/core/document/apply.js +77 -0
  534. package/dist/core/document/apply.js.map +1 -0
  535. package/dist/core/{frontmatter.js → document/frontmatter.js} +48 -2
  536. package/dist/core/document/frontmatter.js.map +1 -0
  537. package/dist/core/document/grammar/directives.js +143 -0
  538. package/dist/core/document/grammar/directives.js.map +1 -0
  539. package/dist/core/document/parse.js +263 -0
  540. package/dist/core/document/parse.js.map +1 -0
  541. package/dist/core/document/scenarios.js +221 -0
  542. package/dist/core/document/scenarios.js.map +1 -0
  543. package/dist/core/document/spec.js +241 -0
  544. package/dist/core/document/spec.js.map +1 -0
  545. package/dist/core/{config.js → envelope/config.js} +79 -18
  546. package/dist/core/envelope/config.js.map +1 -0
  547. package/dist/core/envelope/json.js +175 -0
  548. package/dist/core/envelope/json.js.map +1 -0
  549. package/dist/core/{version.js → envelope/version.js} +3 -3
  550. package/dist/core/envelope/version.js.map +1 -0
  551. package/dist/core/explain/families.js +175 -0
  552. package/dist/core/explain/families.js.map +1 -0
  553. package/dist/core/explain/fix-tables.js +178 -0
  554. package/dist/core/explain/fix-tables.js.map +1 -0
  555. package/dist/core/explain/lookup.js +181 -0
  556. package/dist/core/explain/lookup.js.map +1 -0
  557. package/dist/core/explain/refusals.js +49 -0
  558. package/dist/core/explain/refusals.js.map +1 -0
  559. package/dist/core/explain/terms.js +144 -0
  560. package/dist/core/explain/terms.js.map +1 -0
  561. package/dist/core/explore/describe.js +105 -0
  562. package/dist/core/explore/describe.js.map +1 -0
  563. package/dist/core/{explore.js → explore/explore.js} +50 -101
  564. package/dist/core/explore/explore.js.map +1 -0
  565. package/dist/core/fleet-context.js +132 -77
  566. package/dist/core/fleet-context.js.map +1 -1
  567. package/dist/core/gate/checks.js +201 -0
  568. package/dist/core/gate/checks.js.map +1 -0
  569. package/dist/core/gate/partners.js +205 -0
  570. package/dist/core/gate/partners.js.map +1 -0
  571. package/dist/core/gate/report.js +47 -0
  572. package/dist/core/gate/report.js.map +1 -0
  573. package/dist/core/gate/verification.js +113 -0
  574. package/dist/core/gate/verification.js.map +1 -0
  575. package/dist/core/gherkin/digest.js +60 -0
  576. package/dist/core/gherkin/digest.js.map +1 -0
  577. package/dist/core/gherkin/emit.js +177 -0
  578. package/dist/core/gherkin/emit.js.map +1 -0
  579. package/dist/core/gherkin/read.js +76 -0
  580. package/dist/core/gherkin/read.js.map +1 -0
  581. package/dist/core/gherkin/stale.js +234 -0
  582. package/dist/core/gherkin/stale.js.map +1 -0
  583. package/dist/core/gherkin/stamp.js +77 -0
  584. package/dist/core/gherkin/stamp.js.map +1 -0
  585. package/dist/core/gherkin/steps/catalogue.js +154 -0
  586. package/dist/core/gherkin/steps/catalogue.js.map +1 -0
  587. package/dist/core/gherkin/steps/inventory.js +98 -0
  588. package/dist/core/gherkin/steps/inventory.js.map +1 -0
  589. package/dist/core/gherkin/steps/phrase.js +72 -0
  590. package/dist/core/gherkin/steps/phrase.js.map +1 -0
  591. package/dist/core/glossary/delta.js +106 -0
  592. package/dist/core/glossary/delta.js.map +1 -0
  593. package/dist/core/glossary/tree.js +86 -0
  594. package/dist/core/glossary/tree.js.map +1 -0
  595. package/dist/core/kernel/concurrency.js.map +1 -0
  596. package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
  597. package/dist/core/kernel/document-bytes.js.map +1 -0
  598. package/dist/core/kernel/fences.js +42 -0
  599. package/dist/core/kernel/fences.js.map +1 -0
  600. package/dist/core/kernel/ids/capability.js +72 -0
  601. package/dist/core/kernel/ids/capability.js.map +1 -0
  602. package/dist/core/kernel/ids/dirs.js +33 -0
  603. package/dist/core/kernel/ids/dirs.js.map +1 -0
  604. package/dist/core/kernel/ids/feature.js +75 -0
  605. package/dist/core/kernel/ids/feature.js.map +1 -0
  606. package/dist/core/kernel/ids/service.js +156 -0
  607. package/dist/core/kernel/ids/service.js.map +1 -0
  608. package/dist/core/kernel/ids/subsystem.js +63 -0
  609. package/dist/core/kernel/ids/subsystem.js.map +1 -0
  610. package/dist/core/{path-safety.js → kernel/path-safety.js} +18 -4
  611. package/dist/core/kernel/path-safety.js.map +1 -0
  612. package/dist/core/kernel/records.js.map +1 -0
  613. package/dist/core/links/backlinks.js +68 -0
  614. package/dist/core/links/backlinks.js.map +1 -0
  615. package/dist/core/links/case.js +74 -0
  616. package/dist/core/links/case.js.map +1 -0
  617. package/dist/core/links/corpus.js +104 -0
  618. package/dist/core/links/corpus.js.map +1 -0
  619. package/dist/core/links/findings.js +110 -0
  620. package/dist/core/links/findings.js.map +1 -0
  621. package/dist/core/links/parse.js +236 -0
  622. package/dist/core/links/parse.js.map +1 -0
  623. package/dist/core/mcp/argv.js +111 -0
  624. package/dist/core/mcp/argv.js.map +1 -0
  625. package/dist/core/mcp/author-tools.js +72 -0
  626. package/dist/core/mcp/author-tools.js.map +1 -0
  627. package/dist/core/mcp/framing.js +46 -0
  628. package/dist/core/mcp/framing.js.map +1 -0
  629. package/dist/core/mcp/protocol.js +280 -0
  630. package/dist/core/mcp/protocol.js.map +1 -0
  631. package/dist/core/mcp/tools.js +314 -0
  632. package/dist/core/mcp/tools.js.map +1 -0
  633. package/dist/core/obligations/obligations.js +106 -0
  634. package/dist/core/obligations/obligations.js.map +1 -0
  635. package/dist/core/openapi/baseline/gate.js +166 -0
  636. package/dist/core/openapi/baseline/gate.js.map +1 -0
  637. package/dist/core/openapi/baseline/plan.js +112 -0
  638. package/dist/core/openapi/baseline/plan.js.map +1 -0
  639. package/dist/core/openapi/baseline/record.js +175 -0
  640. package/dist/core/openapi/baseline/record.js.map +1 -0
  641. package/dist/core/openapi/depth.js +122 -0
  642. package/dist/core/openapi/depth.js.map +1 -0
  643. package/dist/core/openapi/digest.js +189 -0
  644. package/dist/core/openapi/digest.js.map +1 -0
  645. package/dist/core/{openapi.js → openapi/doc.js} +44 -106
  646. package/dist/core/openapi/doc.js.map +1 -0
  647. package/dist/core/openapi/merge/components.js +234 -0
  648. package/dist/core/openapi/merge/components.js.map +1 -0
  649. package/dist/core/openapi/merge/error.js +26 -0
  650. package/dist/core/openapi/merge/error.js.map +1 -0
  651. package/dist/core/openapi/merge/markers.js +208 -0
  652. package/dist/core/openapi/merge/markers.js.map +1 -0
  653. package/dist/core/openapi/merge/merge.js +256 -0
  654. package/dist/core/openapi/merge/merge.js.map +1 -0
  655. package/dist/core/openapi/merge/pin.js +128 -0
  656. package/dist/core/openapi/merge/pin.js.map +1 -0
  657. package/dist/core/openspec/decide/capabilities.js +244 -0
  658. package/dist/core/openspec/decide/capabilities.js.map +1 -0
  659. package/dist/core/openspec/decide/dispositions.js +63 -0
  660. package/dist/core/openspec/decide/dispositions.js.map +1 -0
  661. package/dist/core/openspec/decide/renames.js +179 -0
  662. package/dist/core/openspec/decide/renames.js.map +1 -0
  663. package/dist/core/openspec/decide/verdict.js +84 -0
  664. package/dist/core/openspec/decide/verdict.js.map +1 -0
  665. package/dist/core/openspec/inventory.js +221 -0
  666. package/dist/core/openspec/inventory.js.map +1 -0
  667. package/dist/core/openspec/model/mapping.js +76 -0
  668. package/dist/core/openspec/model/mapping.js.map +1 -0
  669. package/dist/core/openspec/model/model.js +65 -0
  670. package/dist/core/openspec/model/model.js.map +1 -0
  671. package/dist/core/openspec/scan/changes.js +235 -0
  672. package/dist/core/openspec/scan/changes.js.map +1 -0
  673. package/dist/core/openspec/scan/config.js +200 -0
  674. package/dist/core/openspec/scan/config.js.map +1 -0
  675. package/dist/core/openspec/scan/shape.js +260 -0
  676. package/dist/core/openspec/scan/shape.js.map +1 -0
  677. package/dist/core/openspec/scan/walk.js +133 -0
  678. package/dist/core/openspec/scan/walk.js.map +1 -0
  679. package/dist/core/openspec/scan/workspace.js +71 -0
  680. package/dist/core/openspec/scan/workspace.js.map +1 -0
  681. package/dist/core/owners/codeowners.js +141 -0
  682. package/dist/core/owners/codeowners.js.map +1 -0
  683. package/dist/core/pack/features.js +120 -0
  684. package/dist/core/pack/features.js.map +1 -0
  685. package/dist/core/pack/joins.js +112 -0
  686. package/dist/core/pack/joins.js.map +1 -0
  687. package/dist/core/pack/living.js +118 -0
  688. package/dist/core/pack/living.js.map +1 -0
  689. package/dist/core/pack/pack.js +76 -0
  690. package/dist/core/pack/pack.js.map +1 -0
  691. package/dist/core/permissions/permissions.js +87 -0
  692. package/dist/core/permissions/permissions.js.map +1 -0
  693. package/dist/core/projection/api.js +84 -0
  694. package/dist/core/projection/api.js.map +1 -0
  695. package/dist/core/projection/arch-slice.js +63 -0
  696. package/dist/core/projection/arch-slice.js.map +1 -0
  697. package/dist/core/projection/events.js +34 -0
  698. package/dist/core/projection/events.js.map +1 -0
  699. package/dist/core/provenance/findings.js +208 -0
  700. package/dist/core/provenance/findings.js.map +1 -0
  701. package/dist/core/provenance/git.js +225 -0
  702. package/dist/core/provenance/git.js.map +1 -0
  703. package/dist/core/provenance/gitq/moves.js +182 -0
  704. package/dist/core/provenance/gitq/moves.js.map +1 -0
  705. package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
  706. package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
  707. package/dist/core/provenance/sample/scope.js +238 -0
  708. package/dist/core/provenance/sample/scope.js.map +1 -0
  709. package/dist/core/provenance/sample/sections.js +61 -0
  710. package/dist/core/provenance/sample/sections.js.map +1 -0
  711. package/dist/core/provenance/sources.js +263 -0
  712. package/dist/core/provenance/sources.js.map +1 -0
  713. package/dist/core/provenance/stamp.js +232 -0
  714. package/dist/core/provenance/stamp.js.map +1 -0
  715. package/dist/core/provenance/walk.js +157 -0
  716. package/dist/core/provenance/walk.js.map +1 -0
  717. package/dist/core/repo/authored/paths.js +192 -0
  718. package/dist/core/repo/authored/paths.js.map +1 -0
  719. package/dist/core/repo/entries.js +126 -0
  720. package/dist/core/repo/entries.js.map +1 -0
  721. package/dist/core/repo/paths.js +236 -0
  722. package/dist/core/repo/paths.js.map +1 -0
  723. package/dist/core/repo/repo.js +248 -0
  724. package/dist/core/repo/repo.js.map +1 -0
  725. package/dist/core/repo/service-target.js +153 -0
  726. package/dist/core/repo/service-target.js.map +1 -0
  727. package/dist/core/repo/state.js +58 -0
  728. package/dist/core/repo/state.js.map +1 -0
  729. package/dist/core/repo/tree/find.js +52 -0
  730. package/dist/core/repo/tree/find.js.map +1 -0
  731. package/dist/core/repo/tree/fs.js +64 -0
  732. package/dist/core/repo/tree/fs.js.map +1 -0
  733. package/dist/core/repo/tree/marker.js +61 -0
  734. package/dist/core/repo/tree/marker.js.map +1 -0
  735. package/dist/core/repo/tree/views.js +172 -0
  736. package/dist/core/repo/tree/views.js.map +1 -0
  737. package/dist/core/repo/tree/walk.js +234 -0
  738. package/dist/core/repo/tree/walk.js.map +1 -0
  739. package/dist/core/results.js +99 -2
  740. package/dist/core/results.js.map +1 -1
  741. package/dist/core/scaffold/landscape.js +131 -0
  742. package/dist/core/scaffold/landscape.js.map +1 -0
  743. package/dist/core/scaffold/readme.js +84 -0
  744. package/dist/core/scaffold/readme.js.map +1 -0
  745. package/dist/core/staging/commit.js +241 -0
  746. package/dist/core/staging/commit.js.map +1 -0
  747. package/dist/core/staging/interrupted.js +96 -0
  748. package/dist/core/staging/interrupted.js.map +1 -0
  749. package/dist/core/staging/lock.js +206 -0
  750. package/dist/core/staging/lock.js.map +1 -0
  751. package/dist/core/staging/recovery/finding.js +35 -0
  752. package/dist/core/staging/recovery/finding.js.map +1 -0
  753. package/dist/core/staging/recovery/intent.js +98 -0
  754. package/dist/core/staging/recovery/intent.js.map +1 -0
  755. package/dist/core/staging/recovery/recover.js +126 -0
  756. package/dist/core/staging/recovery/recover.js.map +1 -0
  757. package/dist/core/staging/recovery/residue.js +62 -0
  758. package/dist/core/staging/recovery/residue.js.map +1 -0
  759. package/dist/core/staging/snapshot.js +202 -0
  760. package/dist/core/staging/snapshot.js.map +1 -0
  761. package/dist/core/staging/txn/forward.js +171 -0
  762. package/dist/core/staging/txn/forward.js.map +1 -0
  763. package/dist/core/staging/txn/journal.js +139 -0
  764. package/dist/core/staging/txn/journal.js.map +1 -0
  765. package/dist/core/staging/txn/transaction.js +75 -0
  766. package/dist/core/staging/txn/transaction.js.map +1 -0
  767. package/dist/core/staging/writes.js +113 -0
  768. package/dist/core/staging/writes.js.map +1 -0
  769. package/dist/core/status/actions/execution.js +49 -0
  770. package/dist/core/status/actions/execution.js.map +1 -0
  771. package/dist/core/status/contracts.js +102 -0
  772. package/dist/core/status/contracts.js.map +1 -0
  773. package/dist/core/status/feature/artifacts.js +171 -0
  774. package/dist/core/status/feature/artifacts.js.map +1 -0
  775. package/dist/core/status/feature/feature.js +207 -0
  776. package/dist/core/status/feature/feature.js.map +1 -0
  777. package/dist/core/status/feature/next.js +150 -0
  778. package/dist/core/status/feature/next.js.map +1 -0
  779. package/dist/core/status/feature/state.js +21 -0
  780. package/dist/core/status/feature/state.js.map +1 -0
  781. package/dist/core/status/fleet/fleet.js +187 -0
  782. package/dist/core/status/fleet/fleet.js.map +1 -0
  783. package/dist/core/status/fleet/next.js +207 -0
  784. package/dist/core/status/fleet/next.js.map +1 -0
  785. package/dist/core/status/interrupted.js +97 -0
  786. package/dist/core/status/interrupted.js.map +1 -0
  787. package/dist/core/status/report.js +31 -0
  788. package/dist/core/status/report.js.map +1 -0
  789. package/dist/core/status/scan.js +41 -0
  790. package/dist/core/status/scan.js.map +1 -0
  791. package/dist/core/status/verification.js +201 -0
  792. package/dist/core/status/verification.js.map +1 -0
  793. package/dist/core/usecases/capability.js +169 -0
  794. package/dist/core/usecases/capability.js.map +1 -0
  795. package/dist/core/usecases/delta/claims.js +116 -0
  796. package/dist/core/usecases/delta/claims.js.map +1 -0
  797. package/dist/core/usecases/delta/flows.js +103 -0
  798. package/dist/core/usecases/delta/flows.js.map +1 -0
  799. package/dist/core/usecases/delta/overlay.js +235 -0
  800. package/dist/core/usecases/delta/overlay.js.map +1 -0
  801. package/dist/core/usecases/fleet.js +137 -0
  802. package/dist/core/usecases/fleet.js.map +1 -0
  803. package/dist/core/usecases/operations.js +111 -0
  804. package/dist/core/usecases/operations.js.map +1 -0
  805. package/dist/core/usecases/place.js +44 -0
  806. package/dist/core/usecases/place.js.map +1 -0
  807. package/dist/core/usecases/touch.js +101 -0
  808. package/dist/core/usecases/touch.js.map +1 -0
  809. package/dist/core/verify/answers.js +173 -0
  810. package/dist/core/verify/answers.js.map +1 -0
  811. package/dist/core/verify/build.js +150 -0
  812. package/dist/core/verify/build.js.map +1 -0
  813. package/dist/core/verify/checklist.js +201 -0
  814. package/dist/core/verify/checklist.js.map +1 -0
  815. package/dist/core/verify/claims/identity.js +61 -0
  816. package/dist/core/verify/claims/identity.js.map +1 -0
  817. package/dist/core/verify/cross/diff.js +97 -0
  818. package/dist/core/verify/cross/diff.js.map +1 -0
  819. package/dist/core/verify/evidence/contract.js +169 -0
  820. package/dist/core/verify/evidence/contract.js.map +1 -0
  821. package/dist/core/verify/file.js +257 -0
  822. package/dist/core/verify/file.js.map +1 -0
  823. package/dist/core/verify/pins/lint.js +157 -0
  824. package/dist/core/verify/pins/lint.js.map +1 -0
  825. package/dist/core/verify/pins/pin.js +95 -0
  826. package/dist/core/verify/pins/pin.js.map +1 -0
  827. package/dist/core/verify/record.js +142 -0
  828. package/dist/core/verify/record.js.map +1 -0
  829. package/dist/core/verify/store/commit.js +89 -0
  830. package/dist/core/verify/store/commit.js.map +1 -0
  831. package/dist/core/verify/store/render.js +57 -0
  832. package/dist/core/verify/store/render.js.map +1 -0
  833. package/dist/core/vocabulary/health.js +91 -0
  834. package/dist/core/vocabulary/health.js.map +1 -0
  835. package/dist/core/vocabulary/issue.js +55 -0
  836. package/dist/core/vocabulary/issue.js.map +1 -0
  837. package/dist/core/vocabulary/maturity.js +145 -0
  838. package/dist/core/vocabulary/maturity.js.map +1 -0
  839. package/dist/core/{report.js → vocabulary/report.js} +30 -2
  840. package/dist/core/vocabulary/report.js.map +1 -0
  841. package/dist/core/vocabulary/steps.js +266 -0
  842. package/dist/core/vocabulary/steps.js.map +1 -0
  843. package/dist/core/workspace/discover.js +239 -0
  844. package/dist/core/workspace/discover.js.map +1 -0
  845. package/dist/core/workspace/render.js +52 -0
  846. package/dist/core/workspace/render.js.map +1 -0
  847. package/examples/README.md +189 -0
  848. package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
  849. package/examples/docs/architecture/capabilities.yaml +31 -0
  850. package/examples/docs/architecture/landscape.likec4 +280 -0
  851. package/examples/docs/architecture/obligations.yaml +23 -0
  852. package/examples/docs/architecture/permissions.yaml +50 -0
  853. package/examples/docs/architecture/subsystems.likec4 +11 -0
  854. package/examples/docs/architecture/usecases/order-notification.likec4 +65 -0
  855. package/examples/docs/capabilities/checkout/spec.md +55 -0
  856. package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
  857. package/examples/docs/capabilities/order-notifications/spec.md +43 -0
  858. package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
  859. package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
  860. package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
  861. package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
  862. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +129 -0
  863. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
  864. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
  865. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
  866. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
  867. package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
  868. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +28 -0
  869. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
  870. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
  871. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
  872. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
  873. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
  874. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
  875. package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
  876. package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
  877. package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
  878. package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
  879. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +70 -0
  880. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
  881. package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
  882. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
  883. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
  884. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
  885. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
  886. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
  887. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
  888. package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
  889. package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
  890. package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
  891. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
  892. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
  893. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
  894. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
  895. package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
  896. package/examples/docs/glossary/order.md +15 -0
  897. package/examples/docs/glossary/payments/authorization.md +14 -0
  898. package/examples/docs/likec4.config.json +9 -0
  899. package/examples/docs/loam.json +3 -0
  900. package/examples/docs/services/checkout-web/model.likec4 +109 -0
  901. package/examples/docs/services/checkout-web/spec.md +91 -0
  902. package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
  903. package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
  904. package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
  905. package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
  906. package/examples/docs/services/order-service/arch.spec.md +127 -0
  907. package/examples/docs/services/order-service/asyncapi.yaml +108 -0
  908. package/examples/docs/services/order-service/health.yaml +57 -0
  909. package/examples/docs/services/order-service/model.likec4 +138 -0
  910. package/examples/docs/services/order-service/openapi.yaml +257 -0
  911. package/examples/docs/services/order-service/runbook.md +62 -0
  912. package/examples/docs/services/order-service/spec.md +134 -0
  913. package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
  914. package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
  915. package/examples/docs/services/payment-service/arch.spec.md +73 -0
  916. package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
  917. package/examples/docs/services/payment-service/health.yaml +39 -0
  918. package/examples/docs/services/payment-service/model.likec4 +67 -0
  919. package/examples/docs/services/payment-service/openapi.yaml +151 -0
  920. package/examples/docs/services/payment-service/runbook.md +37 -0
  921. package/examples/docs/services/payment-service/spec.md +88 -0
  922. package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
  923. package/examples/docs/services/platform/identity-service/arch.spec.md +117 -0
  924. package/examples/docs/services/platform/identity-service/health.yaml +70 -0
  925. package/examples/docs/services/platform/identity-service/model.likec4 +83 -0
  926. package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
  927. package/examples/docs/services/platform/identity-service/runbook.md +95 -0
  928. package/examples/docs/services/platform/identity-service/spec.md +119 -0
  929. package/examples/docs/services/platform/notification-service/asyncapi.yaml +199 -0
  930. package/examples/docs/services/platform/notification-service/health.yaml +35 -0
  931. package/examples/docs/services/platform/notification-service/model.likec4 +118 -0
  932. package/examples/docs/services/platform/notification-service/runbook.md +48 -0
  933. package/examples/docs/services/platform/notification-service/spec.md +112 -0
  934. package/examples/docs/services/platform/subsystem.yaml +2 -0
  935. package/examples/fleet.yaml +57 -0
  936. package/package.json +19 -6
  937. package/dist/commands/adopt.js +0 -240
  938. package/dist/commands/adopt.js.map +0 -1
  939. package/dist/commands/archive.js +0 -1313
  940. package/dist/commands/archive.js.map +0 -1
  941. package/dist/commands/delta.js +0 -388
  942. package/dist/commands/delta.js.map +0 -1
  943. package/dist/commands/docs-repo-gate.js.map +0 -1
  944. package/dist/commands/format.js +0 -17
  945. package/dist/commands/format.js.map +0 -1
  946. package/dist/commands/gherkin.js +0 -309
  947. package/dist/commands/gherkin.js.map +0 -1
  948. package/dist/commands/init.js.map +0 -1
  949. package/dist/commands/list.js +0 -291
  950. package/dist/commands/list.js.map +0 -1
  951. package/dist/commands/migrate-openspec.js +0 -950
  952. package/dist/commands/migrate-openspec.js.map +0 -1
  953. package/dist/commands/new.js +0 -413
  954. package/dist/commands/new.js.map +0 -1
  955. package/dist/commands/rebase.js +0 -356
  956. package/dist/commands/rebase.js.map +0 -1
  957. package/dist/commands/show.js.map +0 -1
  958. package/dist/commands/status.js +0 -254
  959. package/dist/commands/status.js.map +0 -1
  960. package/dist/commands/unarchive.js.map +0 -1
  961. package/dist/commands/validate.js +0 -1591
  962. package/dist/commands/validate.js.map +0 -1
  963. package/dist/commands/verify.js +0 -775
  964. package/dist/commands/verify.js.map +0 -1
  965. package/dist/commands/vouch.js +0 -343
  966. package/dist/commands/vouch.js.map +0 -1
  967. package/dist/core/agent.js +0 -2065
  968. package/dist/core/agent.js.map +0 -1
  969. package/dist/core/agents-stamp.js +0 -68
  970. package/dist/core/agents-stamp.js.map +0 -1
  971. package/dist/core/arch.js +0 -130
  972. package/dist/core/arch.js.map +0 -1
  973. package/dist/core/brief.js +0 -733
  974. package/dist/core/brief.js.map +0 -1
  975. package/dist/core/coherence.js +0 -577
  976. package/dist/core/coherence.js.map +0 -1
  977. package/dist/core/concurrency.js.map +0 -1
  978. package/dist/core/config.js.map +0 -1
  979. package/dist/core/delta.js +0 -476
  980. package/dist/core/delta.js.map +0 -1
  981. package/dist/core/dependencies.js +0 -356
  982. package/dist/core/dependencies.js.map +0 -1
  983. package/dist/core/doctor.js +0 -559
  984. package/dist/core/doctor.js.map +0 -1
  985. package/dist/core/document-bytes.js.map +0 -1
  986. package/dist/core/explore.js.map +0 -1
  987. package/dist/core/frontmatter.js.map +0 -1
  988. package/dist/core/gherkin.js +0 -463
  989. package/dist/core/gherkin.js.map +0 -1
  990. package/dist/core/health.js +0 -67
  991. package/dist/core/health.js.map +0 -1
  992. package/dist/core/ids.js +0 -122
  993. package/dist/core/ids.js.map +0 -1
  994. package/dist/core/issue.js +0 -9
  995. package/dist/core/issue.js.map +0 -1
  996. package/dist/core/json.js +0 -74
  997. package/dist/core/json.js.map +0 -1
  998. package/dist/core/likec4.js +0 -479
  999. package/dist/core/likec4.js.map +0 -1
  1000. package/dist/core/maturity.js +0 -66
  1001. package/dist/core/maturity.js.map +0 -1
  1002. package/dist/core/openapi-merge.js +0 -552
  1003. package/dist/core/openapi-merge.js.map +0 -1
  1004. package/dist/core/openapi.js.map +0 -1
  1005. package/dist/core/openspec-inventory.js +0 -1440
  1006. package/dist/core/openspec-inventory.js.map +0 -1
  1007. package/dist/core/path-safety.js.map +0 -1
  1008. package/dist/core/provenance.js +0 -720
  1009. package/dist/core/provenance.js.map +0 -1
  1010. package/dist/core/records.js.map +0 -1
  1011. package/dist/core/repo.js +0 -436
  1012. package/dist/core/repo.js.map +0 -1
  1013. package/dist/core/report.js.map +0 -1
  1014. package/dist/core/spec.js +0 -481
  1015. package/dist/core/spec.js.map +0 -1
  1016. package/dist/core/staging.js +0 -890
  1017. package/dist/core/staging.js.map +0 -1
  1018. package/dist/core/status.js +0 -1104
  1019. package/dist/core/status.js.map +0 -1
  1020. package/dist/core/steps.js +0 -72
  1021. package/dist/core/steps.js.map +0 -1
  1022. package/dist/core/verify.js +0 -807
  1023. package/dist/core/verify.js.map +0 -1
  1024. package/dist/core/version.js.map +0 -1
  1025. /package/dist/core/{concurrency.js → kernel/concurrency.js} +0 -0
  1026. /package/dist/core/{records.js → kernel/records.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate-openspec.js","sourceRoot":"","sources":["../../src/commands/migrate-openspec.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { lstat, mkdir, readFile, readdir, realpath, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { findConfigPath, parseConfig } from \"../core/config.js\";\nimport { DOCS_SUBDIRS, docsRepoFiles } from \"../core/docs.js\";\nimport { decodeDocument, NotUtf8DocumentError } from \"../core/document-bytes.js\";\nimport { serviceIdProblem } from \"../core/ids.js\";\nimport { fail, emitJson, type ErrorCode } from \"../core/json.js\";\nimport {\n createOpenSpecMappingSkeleton,\n inventoryOpenSpec,\n isOpenSpecArtifactDisposition,\n OpenSpecRootError,\n type OpenSpecInventory,\n type OpenSpecArtifactDisposition,\n type OpenSpecMapping,\n type OpenSpecMappingSkeleton,\n} from \"../core/openspec-inventory.js\";\nimport { asRecord, dictionary, ownValue } from \"../core/records.js\";\nimport {\n parseRequirements,\n requirementIdProblems,\n serializeRequirements,\n type Requirement,\n} from \"../core/spec.js\";\nimport {\n message,\n planWrite,\n rollbackError,\n rollbackStaged,\n stageWrites,\n swapStaged,\n type PlannedWrite,\n} from \"../core/staging.js\";\n\ninterface AuditOpenSpecOptions {\n json?: boolean;\n writeMapping?: string;\n}\n\ninterface MigrateOpenSpecOptions {\n json?: boolean;\n map?: string;\n mapping?: string;\n apply?: boolean;\n target?: string;\n}\n\nclass OpenSpecCommandError extends Error {\n constructor(readonly code: ErrorCode, message: string) {\n super(message);\n this.name = \"OpenSpecCommandError\";\n }\n}\n\n/** Registers the read-only audit and the separate, mapping-driven migration planner. */\nexport function registerMigrateOpenSpec(program: Command): void {\n program\n .command(\"audit-openspec\")\n .argument(\"<root>\", \"OpenSpec root, Store checkout, or workspace containing openspec/\")\n .description(\"Audit an OpenSpec workspace without treating human mapping decisions as command failure\")\n .option(\"--write-mapping <path>\", \"write a non-overwriting, digest-bound decision skeleton outside the source workspace\")\n .option(\"--json\", \"emit the machine contract instead of the human view\")\n .action(async (root: string, opts: AuditOpenSpecOptions) => {\n const json = opts.json === true;\n try {\n const inventory = await inventoryOpenSpec(root);\n const skeleton = createOpenSpecMappingSkeleton(inventory);\n const mappingWritten = opts.writeMapping === undefined\n ? null\n : await writeMappingSkeleton(inventory, opts.writeMapping, skeleton);\n if (json) {\n emitJson({\n command: \"audit-openspec\",\n readOnly: mappingWritten === null,\n mappingWritten,\n mappingSkeleton: skeleton,\n ...inventory,\n });\n } else {\n printInventory(inventory, \"audit\");\n if (mappingWritten !== null) console.log(`\\n mapping skeleton ${mappingWritten}`);\n else console.log(\"\\n read-only audit: no files were created or changed\");\n }\n // Finding incompatibilities is a successful audit result. Root/YAML/IO\n // failures still exit 1 through the catch below; migration readiness has\n // its own boolean and migrate-openspec exit status.\n } catch (error) {\n reportCommandError(json, error);\n }\n });\n\n program\n .command(\"migrate-openspec\")\n .argument(\"<root>\", \"OpenSpec root, Store checkout, or workspace containing openspec/\")\n .description(\"Validate explicit migration mappings and optionally materialize staged migration docs\")\n .option(\"--map <path>\", \"YAML mapping created from `audit-openspec --write-mapping`\")\n .option(\"--mapping <path>\", \"deprecated alias for --map\")\n .option(\"--apply\", \"materialize staged migration docs; dry-run is the default\")\n .option(\"--target <directory>\", \"empty standalone target for --apply; never writes into the OpenSpec source or live loam docs\")\n .option(\"--json\", \"emit the machine contract instead of the human view\")\n .action(async (root: string, opts: MigrateOpenSpecOptions) => {\n const json = opts.json === true;\n try {\n if (opts.map !== undefined && opts.mapping !== undefined) {\n throw new OpenSpecCommandError(\"invalid-option\", \"Pass --map or its deprecated --mapping alias, not both.\");\n }\n const mapArg = opts.map ?? opts.mapping;\n if (mapArg === undefined) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n \"migrate-openspec requires --map <path>; run `loam audit-openspec <root> --write-mapping <path>` first.\",\n );\n }\n if (opts.apply === true && opts.target === undefined) {\n throw new OpenSpecCommandError(\"invalid-option\", \"--apply requires an explicit --target <empty-directory>.\");\n }\n if (opts.apply !== true && opts.target !== undefined) {\n throw new OpenSpecCommandError(\"invalid-option\", \"--target only has effect with explicit --apply.\");\n }\n const mappingPath = resolve(mapArg);\n const mapping = await readMapping(mappingPath);\n // Re-audit the source at the point of use. inventoryOpenSpec compares\n // the fresh digest and canonical root to the binding in the mapping.\n const inventory = await inventoryOpenSpec(root, { mapping });\n const target = opts.apply === true\n ? resolve(opts.target!)\n : join(dirname(mappingPath), \".loam-openspec-dry-run-target\");\n const planned = inventory.ready\n ? await planMigrationWrites(inventory, mapping, target)\n : null;\n let applied: { directory: string; files: string[]; followUpBlockers: string[] } | null = null;\n if (opts.apply === true) {\n if (!inventory.ready || planned === null) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n \"Migration cannot be applied until living/active shapes, capability mappings, change-to-feature decisions, active RENAMED identities, authored artifact dispositions, and source digest binding are resolved.\",\n );\n }\n applied = await writeMigrationTarget(inventory, mapping, target, planned);\n }\n\n if (json) {\n emitJson({\n command: \"migrate-openspec\",\n dryRun: applied === null,\n mappingPath,\n applied,\n ...inventory,\n });\n } else {\n printInventory(inventory, \"migration\");\n if (applied === null) console.log(\"\\n dry-run: no files were created or changed\");\n else {\n console.log(`\\n staged migration docs ${applied.directory}`);\n console.log(` follow-up blockers ${applied.followUpBlockers.length} (see FOLLOW-UP.md)`);\n }\n }\n if (!inventory.ready) process.exitCode = 1;\n } catch (error) {\n reportCommandError(json, error);\n }\n });\n}\n\nfunction reportCommandError(json: boolean, error: unknown): void {\n if (error instanceof OpenSpecRootError) {\n fail(json, \"unknown-target\", error.message);\n return;\n }\n if (error instanceof OpenSpecCommandError) {\n fail(json, error.code, error.message);\n return;\n }\n throw error;\n}\n\n/**\n * `Array.isArray` narrows an `unknown` to `any[]`, so the element check below it\n * proved nothing to tsc and the elements had to be asserted back to `string` at\n * the point of use. One predicate makes the narrowing carry the check.\n */\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction stringList(value: unknown, label: string): string[] {\n if (typeof value === \"string\") return value.trim() === \"\" ? [] : [value.trim()];\n if (!isStringArray(value)) {\n throw new OpenSpecCommandError(\"invalid-option\", `${label} must be a string or an array of service ids.`);\n }\n return [...new Set(value.map((item) => item.trim()).filter(Boolean))];\n}\n\n/**\n * The service ids a mapping may name, checked against the ONE grammar.\n *\n * This used to carry its own copy of the rule — the same alphabet regex, the\n * `.`/`..` tests, the trailing dot and the Windows device names — which is how\n * the two spellings drifted apart to begin with: for a while migrate was the\n * STRICTER of the two, so the primary authoring path accepted ids a migration\n * refused. ids.ts owns the grammar now, so a mapping can only ever name a\n * `services/<id>/` the authoring commands can still address.\n *\n * The refusal keeps migrate's own shape — `OpenSpecCommandError` with\n * `invalid-option`, not an `Issue` — and `serviceIdProblem`'s label carries the\n * mapping key, so the message still points at the line of the YAML to edit.\n */\nfunction serviceList(value: unknown, label: string): string[] {\n const services = stringList(value, label);\n for (const service of services) {\n const problem = serviceIdProblem(service, label);\n if (problem !== null) throw new OpenSpecCommandError(\"invalid-option\", problem);\n }\n return services;\n}\n\n/**\n * A document this command is about to migrate, decoded or refused BY NAME.\n *\n * Every other read on this path used `readFile(…, \"utf8\")`, which never fails:\n * bytes that are not UTF-8 become U+FFFD and a UTF-16 spec.md becomes text with\n * no headings in it. Downstream that is not a wrong answer but a silent one —\n * `parseRequirements` returns [], the capability materializes as a `spec.md`\n * with an empty `## Requirements`, and the migration reports success over a file\n * whose every requirement was dropped. Migration is the one command whose input\n * is somebody else's repository, written by tooling loam does not control, so\n * this is where lossy decoding is both most likely and least acceptable.\n *\n * The ingest scan already refuses non-UTF-8 artifacts up front\n * (`openspec.non-utf8-artifact`); holding the same rule at the point of use\n * means a read added later cannot quietly skip it, and it is what catches the\n * encoding the scan's `isUtf8` cannot see — UTF-16 written without a BOM, whose\n * bytes are valid UTF-8 with a NUL between every character.\n */\nfunction decodeSource(bytes: Buffer, path: string, label: string): string {\n try {\n return decodeDocument(bytes, path);\n } catch (error) {\n if (!(error instanceof NotUtf8DocumentError)) throw error;\n // `error.message` already opens with the path; the label says which of the\n // two inputs it is — the corpus being migrated, or the mapping about it.\n throw new OpenSpecCommandError(\"invalid-option\", `${label}: ${error.message}`);\n }\n}\n\n/** A path under the audited OpenSpec root, decoded the same way. */\nasync function readSourceArtifact(root: string, artifactPath: string): Promise<string> {\n const absolute = join(root, artifactPath);\n return decodeSource(await readFile(absolute), absolute, \"OpenSpec source artifact\");\n}\n\nasync function readMapping(path: string): Promise<OpenSpecMapping> {\n let bytes: Buffer;\n try {\n bytes = await readFile(path);\n } catch (error) {\n throw new OpenSpecCommandError(\"unknown-target\", `Cannot read OpenSpec mapping ${path}: ${message(error)}`);\n }\n // Decoded rather than assumed: a mapping saved as UTF-16 parses as YAML with\n // no capabilities block, and the refusal would name a missing decision\n // instead of the encoding that hid it.\n const raw = decodeSource(bytes, path, \"OpenSpec mapping\");\n let parsed: unknown;\n try {\n parsed = parseYaml(raw);\n } catch (error) {\n throw new OpenSpecCommandError(\"invalid-option\", `OpenSpec mapping ${path} is invalid YAML: ${message(error)}`);\n }\n const document = asRecord(parsed);\n if (document === null || document.version !== 1) {\n throw new OpenSpecCommandError(\"invalid-option\", `OpenSpec mapping ${path} must be a YAML mapping with version: 1.`);\n }\n const sourceNode = asRecord(document.source);\n const source = sourceNode !== null\n && typeof sourceNode.root === \"string\"\n && typeof sourceNode.inventoryDigest === \"string\"\n ? { root: sourceNode.root, inventoryDigest: sourceNode.inventoryDigest }\n : null;\n const capabilitiesNode = asRecord(document.capabilities);\n if (capabilitiesNode === null) {\n throw new OpenSpecCommandError(\"invalid-option\", `OpenSpec mapping ${path} must contain a capabilities mapping.`);\n }\n const capabilities = dictionary<OpenSpecMapping[\"capabilities\"][string]>();\n for (const [capability, value] of Object.entries(capabilitiesNode)) {\n const record = asRecord(value);\n const services = serviceList(record?.services ?? value, `capabilities.${capability}.services`);\n const requirementServices = dictionary<string[]>();\n if (record?.requirementServices !== undefined) {\n const allocations = asRecord(record.requirementServices);\n if (allocations === null) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `capabilities.${capability}.requirementServices must be a mapping.`,\n );\n }\n for (const [requirement, selected] of Object.entries(allocations)) {\n requirementServices[requirement] = serviceList(\n selected,\n `capabilities.${capability}.requirementServices.${requirement}`,\n );\n }\n }\n capabilities[capability] = { services, requirementServices };\n }\n\n const changesNode = asRecord(document.changes);\n if (changesNode === null) {\n throw new OpenSpecCommandError(\"invalid-option\", `OpenSpec mapping ${path} must contain a changes mapping.`);\n }\n const changes = dictionary<OpenSpecMapping[\"changes\"][string]>();\n for (const [change, value] of Object.entries(changesNode)) {\n const record = asRecord(value);\n if (record === null) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `changes.${change} must be a mapping with explicit feature and title fields.`,\n );\n }\n const featureValue = record.feature;\n if (featureValue !== null && typeof featureValue !== \"string\") {\n throw new OpenSpecCommandError(\"invalid-option\", `changes.${change}.feature must be a string or null.`);\n }\n if (typeof record.title !== \"string\") {\n throw new OpenSpecCommandError(\"invalid-option\", `changes.${change}.title must be a string.`);\n }\n changes[change] = {\n feature: typeof featureValue === \"string\" && featureValue.trim() !== \"\" ? featureValue.trim() : null,\n title: record.title,\n };\n }\n\n const renames = dictionary<string>();\n if (document.renames !== undefined) {\n const renamesNode = asRecord(document.renames);\n if (renamesNode === null) {\n throw new OpenSpecCommandError(\"invalid-option\", `OpenSpec mapping ${path} renames must be a mapping.`);\n }\n for (const [key, value] of Object.entries(renamesNode)) {\n const record = asRecord(value);\n const requirementId = record !== null && \"requirementId\" in record ? record.requirementId : value;\n // A freshly generated skeleton deliberately uses null: it remains a\n // needsIdentity decision rather than becoming a malformed mapping.\n if (requirementId === null || requirementId === \"\") continue;\n if (typeof requirementId !== \"string\") {\n throw new OpenSpecCommandError(\"invalid-option\", `renames.${key}.requirementId must be a string or null.`);\n }\n renames[key] = requirementId.trim();\n }\n }\n // Recorded as written. Naming the disposition union here only meant asserting\n // an unreviewed string into it: `mapping.invalid-artifact-disposition` is what\n // actually grades this value, and it has to see what the human typed to be\n // able to name it back to them.\n const artifacts = dictionary<string>();\n if (document.artifacts !== undefined) {\n const artifactsNode = asRecord(document.artifacts);\n if (artifactsNode === null) {\n throw new OpenSpecCommandError(\"invalid-option\", `OpenSpec mapping ${path} artifacts must be a mapping.`);\n }\n for (const [artifactPath, value] of Object.entries(artifactsNode)) {\n const record = asRecord(value);\n const disposition = record !== null && \"disposition\" in record ? record.disposition : value;\n if (disposition === null || disposition === \"\") continue;\n if (typeof disposition !== \"string\") {\n throw new OpenSpecCommandError(\"invalid-option\", `artifacts.${artifactPath}.disposition must be a string or null.`);\n }\n artifacts[artifactPath] = disposition;\n }\n }\n return { source, capabilities, changes, renames, artifacts };\n}\n\nfunction contains(parent: string, candidate: string): boolean {\n const rel = relative(parent, candidate);\n return rel === \"\" || (!rel.startsWith(`..${sep}`) && rel !== \"..\" && !isAbsolute(rel));\n}\n\n/** Resolve symlinks in the nearest existing ancestor of a not-yet-created path. */\nasync function canonicalForCreate(path: string): Promise<string> {\n let cursor = path;\n const suffix: string[] = [];\n while (!existsSync(cursor)) {\n const parent = dirname(cursor);\n if (parent === cursor) break;\n suffix.unshift(basename(cursor));\n cursor = parent;\n }\n return resolve(await realpath(cursor), ...suffix);\n}\n\nasync function writeMappingSkeleton(\n inventory: OpenSpecInventory,\n outputArg: string,\n skeleton: OpenSpecMappingSkeleton,\n): Promise<string> {\n const output = resolve(outputArg);\n const canonicalOutput = await canonicalForCreate(output);\n const canonicalSource = await realpath(inventory.inputRoot);\n if (contains(canonicalSource, canonicalOutput)) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Refusing to write the mapping inside the OpenSpec source workspace: ${output}`,\n );\n }\n if (existsSync(output)) {\n throw new OpenSpecCommandError(\"already-exists\", `Mapping output already exists; refusing to overwrite it: ${output}`);\n }\n await mkdir(dirname(output), { recursive: true });\n try {\n await writeFile(output, stringifyYaml(skeleton, { lineWidth: 0 }), { encoding: \"utf8\", flag: \"wx\" });\n } catch (error) {\n if (existsSync(output)) {\n throw new OpenSpecCommandError(\"already-exists\", `Mapping output already exists; refusing to overwrite it: ${output}`);\n }\n throw error;\n }\n return output;\n}\n\n/**\n * The other half of \"never writes into … live loam docs\". Overlap with the\n * OpenSpec source was the only thing checked, so `--target <docs>/features` on a\n * fresh fleet passed and put phantom features into every `loam list`.\n *\n * The line is the docs tree, not the repository: every enumerating command reads\n * `<docsDir>/services` and `<docsDir>/features`, so a target under docsDir joins\n * the live fleet, while a sibling of it is merely a directory. A config that\n * governs the target but cannot be parsed is refused too — an unreadable\n * docsDir cannot be shown to be somewhere else.\n */\nasync function assertOutsideLoamDocs(stage: string): Promise<void> {\n const canonicalStage = await canonicalForCreate(stage);\n const governing = findConfigPath(canonicalStage);\n if (governing !== null) {\n const docsDir = await governingDocsDir(governing);\n if (docsDir === null || contains(docsDir, canonicalStage)) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Refusing to stage a migration inside the live loam docs ${docsDir ?? `governed by ${governing}`}: ${stage}. Migrate into a standalone directory and cut over after review.`,\n );\n }\n }\n // A docs repo checked out without its loam.json — the landscape is the file\n // no docs repo is without, and `loam init` scaffolds it before anything else.\n for (let dir = canonicalStage; ; dir = dirname(dir)) {\n if (existsSync(join(dir, \"architecture\", \"landscape.likec4\"))) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Refusing to stage a migration inside a loam docs repository: ${join(dir, \"architecture\", \"landscape.likec4\")} is above ${stage}. Migrate into a standalone directory and cut over after review.`,\n );\n }\n if (dirname(dir) === dir) return;\n }\n}\n\n/**\n * Canonical docsDir of the config at `path`, or null when it cannot be read —\n * including \"read as UTF-8 it would have said something else\", which is why the\n * bytes go through `decodeDocument`. Null is the conservative answer here: the\n * caller refuses to stage rather than accept a docsDir it cannot establish.\n */\nasync function governingDocsDir(path: string): Promise<string | null> {\n try {\n return await canonicalForCreate(\n parseConfig(decodeDocument(await readFile(path), path), dirname(path)).docsDir,\n );\n } catch {\n return null;\n }\n}\n\nasync function assertEmptyNonOverlappingStage(inventory: OpenSpecInventory, stage: string): Promise<void> {\n const canonicalStage = await canonicalForCreate(stage);\n const canonicalSource = await realpath(inventory.inputRoot);\n if (contains(canonicalSource, canonicalStage) || contains(canonicalStage, canonicalSource)) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Staging directory must not overlap the OpenSpec source workspace: ${stage}`,\n );\n }\n await assertOutsideLoamDocs(stage);\n try {\n if ((await lstat(stage)).isSymbolicLink()) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Staging target must not be a symbolic link: ${stage}`,\n );\n }\n } catch (error) {\n if (error instanceof OpenSpecCommandError) throw error;\n const code = typeof error === \"object\" && error !== null && \"code\" in error ? error.code : null;\n if (code !== \"ENOENT\") throw error;\n }\n if (!existsSync(stage)) return;\n const info = await stat(stage);\n if (!info.isDirectory() || (await readdir(stage)).length > 0) {\n throw new OpenSpecCommandError(\"already-exists\", `Staging target must be absent or an empty directory: ${stage}`);\n }\n}\n\nfunction normalizedMapping(inventory: OpenSpecInventory, mapping: OpenSpecMapping): Record<string, unknown> {\n return {\n version: 1,\n source: { root: inventory.root, inventoryDigest: inventory.inventoryDigest },\n capabilities: Object.fromEntries(inventory.mappingDecisions.map((decision) => [\n decision.capability,\n {\n services: ownValue(mapping.capabilities, decision.capability)?.services ?? [],\n requirementServices: ownValue(mapping.capabilities, decision.capability)?.requirementServices ?? dictionary(),\n },\n ])),\n changes: Object.fromEntries(inventory.changeDecisions.map((decision) => [\n decision.change,\n {\n feature: ownValue(mapping.changes, decision.change)?.feature ?? null,\n // The decision's title, which is the mapping's own title trimmed.\n // `readMapping` trims `feature` but not `title`, and materialization\n // writes the trimmed one into the frontmatter, the H1 and the directory\n // slug — so recording the raw one made the plan disagree with the files\n // beside it about what the feature is called.\n title: decision.title,\n },\n ])),\n renames: Object.fromEntries(\n inventory.renamed\n .filter((rename) => rename.scope === \"active\")\n .map((rename) => [rename.key, {\n from: rename.from,\n to: rename.to,\n existingRequirementId: rename.existingRequirementId,\n requirementId: rename.requirementId,\n }]),\n ),\n artifacts: Object.fromEntries(inventory.artifactDecisions.map((decision) => [\n decision.path,\n {\n kind: decision.kind,\n disposition: ownValue(mapping.artifacts, decision.path) ?? null,\n },\n ])),\n };\n}\n\nasync function writeMigrationTarget(\n inventory: OpenSpecInventory,\n mapping: OpenSpecMapping,\n target: string,\n planned: { livingWrites: PlannedWrite[]; activeWrites: PlannedWrite[]; legacyWrites: PlannedWrite[] },\n): Promise<{ directory: string; files: string[]; followUpBlockers: string[] }> {\n await assertEmptyNonOverlappingStage(inventory, target);\n // All migration content was read while planning. Re-hash after those reads so\n // a source edit between audit and materialization cannot produce a mixed snapshot.\n const refreshed = await inventoryOpenSpec(inventory.inputRoot, { mapping });\n if (!refreshed.ready || refreshed.inventoryDigest !== inventory.inventoryDigest) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n \"OpenSpec source changed while the migration plan was being materialized; re-audit and review a new mapping.\",\n );\n }\n const followUpBlockers = [\n \"Model every staged service in architecture/landscape.likec4 and bind it with metadata { service '<id>' }; the scaffolded landscape is deliberately empty.\",\n \"Add each service model.likec4 and OpenAPI contract; migrated requirements have no Operations/Covers links yet unless authored upstream.\",\n \"Set truthful sources from each service repository, validate, and have a human run loam vouch; staged specs remain status: draft.\",\n ...(inventory.changes.active.length === 0\n ? []\n : [\n `Review ${inventory.changes.active.length} staged feature(s), add their LikeC4/OpenAPI deltas, and resolve any retained or manual-review OpenSpec artifacts recorded in migration-plan.json.`,\n // OpenSpec has no equivalent of `Based-On:`, so every migrated\n // MODIFIED/REMOVED requirement arrives unpinned (`delta.baseline-missing`,\n // a warning by design — a corpus that cannot archive is not a safety\n // property). Until someone runs this, two migrated features rewriting\n // one requirement still lose the loser's text silently.\n \"Run `loam rebase <FEAT>` per staged feature: OpenSpec deltas carry no Based-On, so no MODIFIED/REMOVED requirement is pinned to the living text it was written against.\",\n ]),\n \"Review config context/rules, Stores/references, custom schemas, and every artifact disposition in migration-plan.json.\",\n \"Review the verbatim OpenSpec living tree under legacy/openspec/specs/: Purpose prose, section prose, and capability design.md have no loam equivalent and were copied, not converted.\",\n // The cutover was undocumented, which is how a staged target that cannot\n // answer `loam validate` reads as finished work. Naming the two halves —\n // what is fleet content and what is review residue — is the whole procedure.\n \"Cut over only once `loam validate --all` here is green: services/ and features/ are the fleet content, while legacy/, mapping.yaml, migration-plan.json, FOLLOW-UP.md, and this repository's own loam.json/AGENTS.md are review residue that does not move.\",\n ];\n const plan = {\n version: 1,\n generatedBy: \"loam migrate-openspec\",\n source: { inputRoot: inventory.inputRoot, root: inventory.root },\n baselines: inventory.baselines,\n readiness: inventory.readiness,\n mapping: normalizedMapping(inventory, mapping),\n living: inventory.living,\n activeChanges: inventory.changes.active,\n archiveDiagnostics: inventory.archiveDiagnostics,\n artifactDisposition: inventory.artifacts.map((artifact) => ({\n ...artifact,\n disposition: ownValue(mapping.artifacts, artifact.path) ?? artifact.disposition,\n selectedDisposition: ownValue(mapping.artifacts, artifact.path) ?? null,\n })),\n followUpBlockers,\n note: \"Staged migration docs only. Living specs and mapped active changes were materialized without changing the OpenSpec source or live loam docs. The result is intentionally not expected to validate green until the listed architecture, API, provenance, and review work is completed.\",\n };\n const writes: PlannedWrite[] = [\n planWrite(join(target, \"migration-plan.json\"), `${JSON.stringify(plan, null, 2)}\\n`),\n planWrite(join(target, \"mapping.yaml\"), stringifyYaml(normalizedMapping(inventory, mapping), { lineWidth: 0 })),\n planWrite(join(target, \"FOLLOW-UP.md\"), renderFollowUp(followUpBlockers)),\n ...docsRepoScaffold(target),\n ...planned.livingWrites,\n ...planned.activeWrites,\n ...planned.legacyWrites,\n ];\n assertDistinctPlannedPaths(writes);\n for (const write of writes) write.exclusive = true;\n const staged = await stageWrites(writes);\n if (staged.some((item) => item.before !== null)) {\n await rollbackStaged(staged);\n throw new OpenSpecCommandError(\n \"already-exists\",\n \"Staging target changed after its emptiness check; refusing to overwrite a concurrently created file.\",\n );\n }\n try {\n await swapStaged(staged);\n } catch (error) {\n const failures = await rollbackStaged(staged);\n const code = typeof error === \"object\" && error !== null && \"code\" in error ? error.code : null;\n if (code === \"EEXIST\" && failures.length === 0) {\n throw new OpenSpecCommandError(\n \"already-exists\",\n \"Staging target changed during apply; the migration was rolled back without overwriting the concurrent file.\",\n );\n }\n throw rollbackError(error, failures);\n }\n // The skeleton `loam init` lays down, after the content that fills it. A docs\n // repo is recognised by `services/` plus AGENTS.md, and until now `services/`\n // existed only if some capability happened to route there: migrate a corpus\n // whose requirements all live under `changes/` — legitimate, and the shape a\n // greenfield OpenSpec workspace has — and the target came out with no\n // `services/` at all, so `loam init --docs <target> --service <id>` answered\n // \"not a docs repo\" and every read command refused it as `services-missing`.\n // Empty directories, created after the swap so a rolled-back apply leaves the\n // target as empty as it found it.\n for (const dir of DOCS_SUBDIRS) await mkdir(join(target, dir), { recursive: true });\n return { directory: target, files: writes.map((write) => write.path), followUpBlockers };\n}\n\n/**\n * The staged target is a real docs repo, not a folder of markdown.\n *\n * FOLLOW-UP.md tells the migrator to validate, rebase and vouch against this\n * directory, and every one of those commands resolves its fleet from loam.json:\n * without these three files none of the instructions it gives can be executed,\n * and the reviewer has no way to see what is still missing. The landscape is\n * laid down EMPTY for the same reason `loam init` lays it down empty — an absent\n * landscape silences every cross-service check, and a generated one would be a\n * guess presented as the map. Each staged service then shows up as exactly one\n * `landscape.service-unmodelled` error, which is the first follow-up item.\n *\n * The bytes come from `docs.ts`, so this IS the repo `loam init` makes rather\n * than a lookalike. Only the landscape's opening comment differs, and it differs\n * through a parameter: the migrator needs to be told why their map is empty,\n * and everything after that sentence is advice that does not depend on how the\n * repo was created.\n */\nfunction docsRepoScaffold(target: string): PlannedWrite[] {\n return docsRepoFiles({\n landscapePreamble: \"// Fleet map for a staged OpenSpec migration. It arrives EMPTY because\\n\"\n + \"// OpenSpec has no topology: loam has nothing to read here and will not\\n\"\n + \"// guess \\\"who calls whom\\\" into the source of truth. Every services/<id>/\\n\"\n + \"// staged beside this file needs an element and a binding below — until\\n\"\n + \"// then each one is a `landscape.service-unmodelled` error.\",\n }).map(([rel, content]) => planWrite(join(target, rel), content));\n}\n\nasync function planMigrationWrites(\n inventory: OpenSpecInventory,\n mapping: OpenSpecMapping,\n target: string,\n): Promise<{ livingWrites: PlannedWrite[]; activeWrites: PlannedWrite[]; legacyWrites: PlannedWrite[] }> {\n // One reading of the living corpus for both materializers. They each read and\n // parsed the whole of it independently, which is twice the work and, worse,\n // two readings: a rename resolved against one of them was written beside a\n // living spec built from the other.\n const livingByCapability = new Map<string, Requirement[]>();\n for (const capability of inventory.living.capabilities) {\n livingByCapability.set(\n capability.id,\n parseRequirements(await readSourceArtifact(inventory.root, capability.files[0]!)),\n );\n }\n const livingWrites = await materializeLivingSpecs(inventory, mapping, target, livingByCapability);\n const activeWrites = await materializeActiveChanges(inventory, mapping, target, livingByCapability);\n const legacyWrites = await copyLivingTree(inventory, target);\n assertDistinctPlannedPaths([...livingWrites, ...activeWrites, ...legacyWrites]);\n return { livingWrites, activeWrites, legacyWrites };\n}\n\n/**\n * The living tree, byte for byte, the way each change tree already gets\n * `legacy/openspec/`.\n *\n * `materializeLivingSpecs` emits frontmatter plus serialized requirements, so\n * everything a living spec holds AROUND its requirements has nowhere to land:\n * `## Purpose`, prose between `## Requirements` and the first requirement, and\n * the whole of `specs/<capability>/design.md` — which the summary counts under\n * `review-as-service-adr` while FOLLOW-UP.md tells the migrator to review prose\n * that had been written nowhere. (Prose inside a requirement body survives\n * serialization and is not the subject here.)\n */\nasync function copyLivingTree(inventory: OpenSpecInventory, target: string): Promise<PlannedWrite[]> {\n const writes: PlannedWrite[] = [];\n for (const artifact of inventory.artifacts) {\n if (artifact.scope !== \"living\") continue;\n const segments = safeArtifactRelative(artifact.path, \"specs/\", \"The OpenSpec living tree\");\n writes.push(planWrite(\n join(target, \"legacy\", \"openspec\", \"specs\", ...segments),\n await readSourceArtifact(inventory.root, artifact.path),\n ));\n }\n return writes;\n}\n\nfunction assertDistinctPlannedPaths(writes: PlannedWrite[]): void {\n const writePaths = new Map<string, string>();\n for (const write of writes) {\n const collisionKey = resolve(write.path).normalize(\"NFC\").toLowerCase();\n const existing = writePaths.get(collisionKey);\n if (existing !== undefined) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Migration paths '${existing}' and '${write.path}' collide after portable case/Unicode normalization; refine mappings before apply.`,\n );\n }\n writePaths.set(collisionKey, write.path);\n }\n}\n\nfunction assertMaterializedRequirementIds(where: string, requirements: Requirement[]): void {\n const problems = requirementIdProblems(requirements);\n if (problems.length === 0) return;\n const first = problems[0]!;\n const detail = first.kind === \"invalid\"\n ? `requirement '${first.requirement}' has invalid Requirement-ID '${first.value}'`\n : first.kind === \"repeated\"\n ? `requirement '${first.requirement}' declares Requirement-ID ${first.values.length} times`\n : `Requirement-ID '${first.id}' is shared by ${first.requirements.map((name) => `'${name}'`).join(\", \")}`;\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `${where} would materialize an invalid loam spec: ${detail}. Repair the source or refine routing before apply.`,\n );\n}\n\nasync function materializeLivingSpecs(\n inventory: OpenSpecInventory,\n mapping: OpenSpecMapping,\n target: string,\n livingByCapability: ReadonlyMap<string, Requirement[]>,\n): Promise<PlannedWrite[]> {\n const byService = new Map<string, Requirement[]>();\n const renameIds = new Map(\n inventory.renamed\n .filter((rename) => rename.scope === \"active\" && rename.from !== null && rename.requirementId !== null)\n .map((rename) => [`${rename.capability}\\0${rename.from}`, rename.requirementId!] as const),\n );\n for (const capability of inventory.living.capabilities) {\n const selected = ownValue(mapping.capabilities, capability.id);\n if (selected === undefined) continue; // readiness prevents this on --apply\n for (const parsed of livingByCapability.get(capability.id) ?? []) {\n const renamedId = renameIds.get(`${capability.id}\\0${parsed.name}`);\n const requirement = renamedId === undefined ? parsed : { ...parsed, id: renamedId };\n // The one spelling of the routing rule. Written out again here, it drifted\n // from the copy the delta side uses, so a split capability could route a\n // living requirement and its own delta to different services.\n const services = selectedServices(mapping, capability.id, requirement.name);\n for (const service of services) {\n const existing = byService.get(service) ?? [];\n const identity = requirement.id === undefined ? `heading '${requirement.name}'` : `Requirement-ID '${requirement.id}'`;\n if (existing.some((item) =>\n item.name === requirement.name\n || (item.id !== undefined && requirement.id !== undefined && item.id === requirement.id))) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Mapped living specs collide in service '${service}' on ${identity}; refine the capability/requirement allocation before --apply.`,\n );\n }\n existing.push({ ...requirement, kind: \"BASE\" });\n byService.set(service, existing);\n }\n }\n }\n return [...byService.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([service, requirements]) => {\n assertMaterializedRequirementIds(`Mapped living service '${service}'`, requirements);\n return planWrite(\n join(target, \"services\", service, \"spec.md\"),\n `---\\n${stringifyYaml({ service, status: \"draft\" }, { lineWidth: 0 }).trimEnd()}\\n---\\n\\n# ${service}\\n\\n<!-- Staged from OpenSpec. Purpose/section prose and capability design.md are preserved verbatim under legacy/openspec/specs/. Add truthful sources and complete C4/OpenAPI links before validation/vouch. -->\\n\\n## Requirements\\n\\n${serializeRequirements(requirements)}`,\n );\n });\n}\n\nfunction featureSlug(title: string, changeId: string): string {\n const slug = (text: string): string => text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug(title) || slug(changeId) || \"openspec-change\";\n}\n\nfunction selectedServices(\n mapping: OpenSpecMapping,\n capability: string,\n requirement: string,\n): string[] {\n const selected = ownValue(mapping.capabilities, capability);\n if (selected === undefined) return [];\n return selected.services.length === 1\n ? selected.services\n : ownValue(selected.requirementServices, requirement) ?? [];\n}\n\nfunction serializeDeltaRequirements(requirements: Requirement[]): string {\n const sections: string[] = [];\n for (const kind of [\"ADDED\", \"MODIFIED\", \"REMOVED\"] as const) {\n const group = requirements.filter((requirement) => requirement.kind === kind);\n if (group.length > 0) sections.push(`## ${kind} Requirements\\n\\n${serializeRequirements(group).trimEnd()}`);\n }\n return `${sections.join(\"\\n\\n\")}\\n`;\n}\n\nfunction migrationFrontmatter(feature: string, title: string): string {\n return `---\\n${stringifyYaml({ feature, title, status: \"proposed\" }, { lineWidth: 0 }).trimEnd()}\\n---`;\n}\n\ninterface AuthoredArtifactCopy {\n path: string;\n disposition: OpenSpecArtifactDisposition;\n raw: string;\n}\n\nfunction renderAuthoredBundle(heading: string, artifacts: AuthoredArtifactCopy[]): string {\n return `${heading}\\n\\n${artifacts.map((artifact) => [\n `<!-- OpenSpec source: ${artifact.path}; disposition: ${artifact.disposition}. -->`,\n artifact.raw.trimEnd(),\n ].join(\"\\n\\n\")).join(\"\\n\\n---\\n\\n\")}\\n`;\n}\n\nfunction safeArtifactRelative(artifactPath: string, prefix: string, owner: string): string[] {\n if (!artifactPath.startsWith(prefix)) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `${owner} contains an artifact outside its own directory: ${artifactPath}.`,\n );\n }\n const segments = artifactPath.slice(prefix.length).split(\"/\");\n if (segments.length === 0 || segments.some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")) {\n throw new OpenSpecCommandError(\"invalid-option\", `OpenSpec artifact has an unsafe relative path: ${artifactPath}.`);\n }\n return segments;\n}\n\nasync function materializeActiveChanges(\n inventory: OpenSpecInventory,\n mapping: OpenSpecMapping,\n target: string,\n livingByCapability: ReadonlyMap<string, Requirement[]>,\n): Promise<PlannedWrite[]> {\n const writes: PlannedWrite[] = [];\n const inventoryArtifactsByPath = new Map(inventory.artifacts.map((artifact) => [artifact.path, artifact]));\n\n for (const change of inventory.changes.active) {\n const decision = inventory.changeDecisions.find((item) => item.change === change.id);\n const feature = ownValue(mapping.changes, change.id)?.feature ?? null;\n if (decision === undefined || feature === null) continue; // readiness prevents this on --apply\n const featureDir = join(target, \"features\", `${feature}-${featureSlug(decision.title, change.id)}`);\n\n // Preserve the complete authored source change tree, including metadata,\n // rename syntax, custom artifacts, and original delta section ordering.\n for (const artifactPath of change.artifacts) {\n const segments = safeArtifactRelative(artifactPath, `changes/${change.id}/`, `OpenSpec change '${change.id}'`);\n writes.push(planWrite(\n join(featureDir, \"legacy\", \"openspec\", ...segments),\n await readSourceArtifact(inventory.root, artifactPath),\n ));\n }\n\n const authored: Array<AuthoredArtifactCopy & { kind: \"proposal\" | \"tasks\" | \"change-design\" }> = [];\n for (const artifactDecision of inventory.artifactDecisions) {\n const artifact = inventoryArtifactsByPath.get(artifactDecision.path);\n if (artifact?.changeId !== change.id) continue;\n const disposition = ownValue(mapping.artifacts, artifactDecision.path);\n if (disposition === undefined) continue; // readiness prevents this on --apply\n // The mapping holds the authored string; everything below compares it\n // against disposition literals, so this is where the value has to become\n // one of them or stop being routed. `mapping.invalid-artifact-disposition`\n // already refuses an unknown one, so readiness prevents this too — but a\n // silent skip is the right failure for a value nothing here can act on.\n if (!isOpenSpecArtifactDisposition(disposition)) continue;\n authored.push({\n path: artifactDecision.path,\n kind: artifactDecision.kind,\n disposition,\n raw: await readSourceArtifact(inventory.root, artifactDecision.path),\n });\n }\n\n const convertedProposals = authored.filter(\n (artifact) => artifact.kind === \"proposal\" && artifact.disposition === \"convert-to-intent\",\n );\n const retainedProposals = authored.filter(\n (artifact) => artifact.kind === \"proposal\" && artifact.disposition !== \"convert-to-intent\",\n );\n const intentBody = convertedProposals.length > 0\n ? renderAuthoredBundle(\"## Migrated OpenSpec proposal\", convertedProposals)\n : \"No proposal was converted into this intent. Review the retained OpenSpec artifacts and migration-plan.json before promotion.\\n\";\n writes.push(planWrite(\n join(featureDir, \"intent.md\"),\n `${migrationFrontmatter(feature, decision.title)}\\n\\n# ${decision.title}\\n\\n<!-- Staged from OpenSpec change '${change.id}'. This feature is deliberately not validation-green yet. -->\\n\\n${intentBody}`,\n ));\n if (retainedProposals.length > 0) {\n writes.push(planWrite(\n join(featureDir, \"legacy\", \"proposal.md\"),\n renderAuthoredBundle(\"# Retained OpenSpec proposal\", retainedProposals),\n ));\n }\n\n const tasks = authored.filter((artifact) => artifact.kind === \"tasks\");\n if (tasks.length > 0) {\n writes.push(planWrite(\n join(featureDir, \"legacy\", \"tasks.md\"),\n renderAuthoredBundle(\"# OpenSpec task checklist\", tasks),\n ));\n }\n const reviewedDesigns = authored.filter(\n (artifact) => artifact.kind === \"change-design\" && artifact.disposition === \"review-as-feature-adr\",\n );\n if (reviewedDesigns.length > 0) {\n writes.push(planWrite(\n join(featureDir, \"adrs\", \"openspec-design.md\"),\n renderAuthoredBundle(\"# OpenSpec design (review required)\", reviewedDesigns),\n ));\n }\n const retainedDesigns = authored.filter(\n (artifact) => artifact.kind === \"change-design\" && artifact.disposition !== \"review-as-feature-adr\",\n );\n if (retainedDesigns.length > 0) {\n writes.push(planWrite(\n join(featureDir, \"legacy\", \"design.md\"),\n renderAuthoredBundle(\"# Retained OpenSpec design\", retainedDesigns),\n ));\n }\n\n if (change.metadata.skipSpecs) continue;\n const deltaByService = new Map<string, Requirement[]>();\n const changeRenames = inventory.renamed.filter(\n (item) => item.scope === \"active\" && item.changeId === change.id,\n );\n const materializedRenameKeys = new Set<string>();\n const addDelta = (service: string, requirement: Requirement, origin: string): void => {\n const existing = deltaByService.get(service) ?? [];\n const collision = existing.find((item) =>\n item.name === requirement.name\n || (item.id !== undefined && requirement.id !== undefined && item.id === requirement.id));\n if (collision !== undefined) {\n const identity = requirement.id === undefined ? requirement.name : requirement.id;\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Active change '${change.id}' produces colliding requirement '${identity}' in service '${service}' while materializing ${origin}.`,\n );\n }\n existing.push(requirement);\n deltaByService.set(service, existing);\n };\n\n for (const spec of change.specs) {\n const requirements = parseRequirements(await readSourceArtifact(inventory.root, spec.path))\n .filter((requirement) => requirement.kind !== \"BASE\");\n for (const parsed of requirements) {\n const matchingRenames = changeRenames.filter((rename) =>\n rename.capability === spec.capability\n && rename.from !== null\n && rename.to !== null\n && (parsed.name === rename.from || parsed.name === rename.to));\n if (matchingRenames.length > 1) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Active change '${change.id}' requirement '${parsed.name}' matches multiple RENAMED pairs.`,\n );\n }\n const rename = matchingRenames[0];\n let requirement = parsed;\n let routingName = parsed.name;\n if (rename !== undefined && rename.from !== null && rename.to !== null && rename.requirementId !== null) {\n if (parsed.kind !== \"MODIFIED\") {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Active change '${change.id}' combines RENAMED '${rename.from}' → '${rename.to}' with ${parsed.kind} '${parsed.name}'; review the conflicting delta before --apply.`,\n );\n }\n if (parsed.id !== undefined && parsed.id !== rename.requirementId) {\n throw new OpenSpecCommandError(\n \"invalid-option\",\n `Active change '${change.id}' MODIFIED requirement '${parsed.name}' has Requirement-ID '${parsed.id}', but its RENAMED source resolves to '${rename.requirementId}'.`,\n );\n }\n const annotation = `OpenSpec-Living-Source: ${rename.capability} :: ${rename.from}`;\n requirement = {\n ...parsed,\n id: rename.requirementId,\n name: rename.to,\n text: parsed.text.includes(annotation) ? parsed.text : [...parsed.text, \"\", annotation],\n section: \"## MODIFIED Requirements\",\n };\n routingName = rename.from;\n materializedRenameKeys.add(rename.key);\n }\n for (const service of selectedServices(mapping, spec.capability, routingName)) {\n addDelta(service, requirement, spec.path);\n }\n }\n }\n for (const rename of changeRenames) {\n if (materializedRenameKeys.has(rename.key)) continue;\n if (rename.from === null || rename.to === null || rename.requirementId === null) continue;\n const source = (livingByCapability.get(rename.capability) ?? [])\n .filter((requirement) => requirement.name === rename.from)[0];\n if (source === undefined) continue; // readiness prevents this on --apply\n const annotation = `OpenSpec-Living-Source: ${rename.capability} :: ${rename.from}`;\n const text = source.text.includes(annotation) ? source.text : [...source.text, \"\", annotation];\n const modified: Requirement = {\n ...source,\n kind: \"MODIFIED\",\n id: rename.requirementId,\n name: rename.to,\n text,\n section: \"## MODIFIED Requirements\",\n };\n for (const service of selectedServices(mapping, rename.capability, rename.from)) {\n addDelta(service, modified, rename.path);\n }\n }\n for (const [service, requirements] of [...deltaByService].sort(([a], [b]) => a.localeCompare(b))) {\n assertMaterializedRequirementIds(\n `Active change '${change.id}' mapped to service '${service}'`,\n requirements,\n );\n writes.push(planWrite(\n join(featureDir, \"specs\", service, \"spec.md\"),\n serializeDeltaRequirements(requirements),\n ));\n }\n }\n return writes;\n}\n\nfunction renderFollowUp(blockers: string[]): string {\n return `# Staged OpenSpec migration: required follow-up\\n\\nThis target contains migrated living requirements, mapped active feature deltas, preserved source artifacts, and a review plan. It is deliberately not presented as a fully valid loam fleet. Complete every item before moving it into live docs.\\n\\n${blockers.map((item) => `- [ ] ${item}`).join(\"\\n\")}\\n`;\n}\n\nfunction plural(count: number, one: string, many = `${one}s`): string {\n return `${count} ${count === 1 ? one : many}`;\n}\n\nfunction printInventory(inventory: OpenSpecInventory, mode: \"audit\" | \"migration\"): void {\n const status = inventory.ready\n ? \"ready\"\n : inventory.mechanicallyCompatible\n ? \"compatible; explicit mapping/identity decisions remain\"\n : \"living or active blockers found\";\n console.log(`OpenSpec ${mode} inventory — ${status}`);\n console.log(` root ${inventory.root}`);\n console.log(\n ` baseline release ${inventory.baselines.release.version}@${inventory.baselines.release.commit} · main canary ${inventory.baselines.mainCanary.commit.slice(0, 7)}`,\n );\n console.log(\n ` living ${plural(inventory.living.capabilities.length, \"capability\", \"capabilities\")} · ${plural(inventory.living.specFiles, \"spec file\")} · ${plural(inventory.living.requirements, \"requirement\")} · ${plural(inventory.living.scenarios, \"scenario\")}`,\n );\n console.log(\n ` changes ${inventory.changes.counts.active} active · ${inventory.changes.counts.archived} archived`,\n );\n console.log(\n ` readiness living ${inventory.readiness.living.compatible ? \"ok\" : \"blocked\"} · active ${inventory.readiness.active.compatible ? \"ok\" : \"blocked\"} · source ${inventory.readiness.sourceCurrent ? \"current\" : \"stale\"} · capabilities ${inventory.readiness.mappingsResolved ? \"resolved\" : \"open\"} · changes ${inventory.readiness.changesResolved ? \"resolved\" : \"open\"} · dispositions ${inventory.readiness.dispositionsResolved ? \"resolved\" : \"open\"} · archive ${inventory.archiveDiagnostics.length} diagnostic(s)`,\n );\n\n if (inventory.needsMapping.length > 0) {\n console.log(\"\\n capability → service decisions\");\n for (const decision of inventory.needsMapping) {\n console.log(` ? ${decision.capability} → ${decision.suggestedService} [${decision.status}]`);\n }\n }\n if (inventory.needsChangeMapping.length > 0) {\n console.log(\"\\n change → feature decisions\");\n for (const decision of inventory.needsChangeMapping) {\n console.log(` ? ${decision.change} → ${decision.suggestedFeature} [${decision.status}]`);\n }\n }\n const activeRenames = inventory.renamed.filter((rename) => rename.scope === \"active\");\n if (activeRenames.length > 0) {\n console.log(\"\\n RENAMED identity decisions\");\n for (const rename of activeRenames) {\n console.log(\n ` ${rename.status === \"mapped\" ? \"✓\" : \"?\"} ${rename.key} ${rename.from ?? \"<missing FROM>\"} → ${rename.to ?? \"<missing TO>\"}${rename.requirementId ? ` [${rename.requirementId}]` : \"\"}`,\n );\n }\n }\n if (inventory.needsDisposition.length > 0) {\n console.log(`\\n authored artifact decisions (${inventory.needsDisposition.length})`);\n for (const decision of inventory.needsDisposition.slice(0, 12)) {\n console.log(` ? ${decision.path} → ${decision.suggestedDisposition} [${decision.status}]`);\n }\n if (inventory.needsDisposition.length > 12) {\n console.log(` … ${inventory.needsDisposition.length - 12} more in --json/mapping output`);\n }\n }\n if (inventory.mappingIssues.length > 0) {\n console.log(\"\\n mapping issues\");\n for (const item of inventory.mappingIssues) console.log(` ✗ ${item.code} ${item.message}`);\n }\n if (inventory.unsupported.length > 0) {\n console.log(\"\\n living/active blockers\");\n for (const item of inventory.unsupported) {\n console.log(` ✗ ${item.code} ${item.path} — ${item.message}`);\n }\n }\n if (inventory.archiveDiagnostics.length > 0) {\n console.log(`\\n archive diagnostics (non-blocking, ${inventory.archiveDiagnostics.length})`);\n for (const item of inventory.archiveDiagnostics.slice(0, 12)) {\n console.log(` · ${item.code} ${item.path} — ${item.message}`);\n }\n if (inventory.archiveDiagnostics.length > 12) {\n console.log(` … ${inventory.archiveDiagnostics.length - 12} more in --json output`);\n }\n }\n const dispositions = new Map<string, number>();\n for (const artifact of inventory.artifacts) {\n dispositions.set(artifact.disposition, (dispositions.get(artifact.disposition) ?? 0) + 1);\n }\n if (dispositions.size > 0) {\n console.log(\"\\n artifact disposition\");\n for (const [disposition, count] of [...dispositions].sort(([a], [b]) => a.localeCompare(b))) {\n console.log(` · ${disposition} ${count}`);\n }\n }\n}\n"]}
@@ -1,413 +0,0 @@
1
- import { mkdir, writeFile } from "node:fs/promises";
2
- import { dirname, join } from "node:path";
3
- import { stringify as stringifyYaml } from "yaml";
4
- import { loadConfig } from "../core/config.js";
5
- import { FEATURE_ID_RULE, InvalidIdError, assertServiceId, isFeatureId } from "../core/ids.js";
6
- import { emitJson, fail, repoPath, reportNoConfig } from "../core/json.js";
7
- import { UnsafePathError, resolveInside } from "../core/path-safety.js";
8
- import { DocsRepoUnavailableError, featureIdFromDirName, featuresDir, listServices, nearestIds, resolveFeature, } from "../core/repo.js";
9
- import { docsRepoReady, reportDocsRepoError } from "./docs-repo-gate.js";
10
- export function registerNew(program) {
11
- program
12
- .command("new")
13
- .argument("<featureId>", "feature id, e.g. FEAT-101")
14
- .description("Scaffold a feature: intent, C4 delta, and a requirement delta per service")
15
- .option("--title <text>", "human title; also becomes the directory slug")
16
- // `--touches`, not `--service`: everywhere else `--service` selects the ONE
17
- // operating target (defaulting to config.service), while this is a repeatable
18
- // list of services the feature touches — a different arity and a different
19
- // meaning deserve a different name.
20
- .option("--touches <id>", "a service this feature touches (repeatable)", collect, [])
21
- .option("--new-service <id>", "a service this feature introduces (repeatable)", collect, [])
22
- .option("--json", "emit the machine contract instead of the human view")
23
- .action(async (featureId, opts) => {
24
- const json = opts.json === true;
25
- const dirName = featureDirName(featureId, opts.title);
26
- // The round-trip is checked beside the grammar, not inside it: the
27
- // grammar is a fact about the id, while `featureIdFromDirName` depends on
28
- // the TITLE this command is about to slug into the directory name. Only
29
- // `new` creates that directory, so only `new` owes that second half.
30
- if (!isFeatureId(featureId) || featureIdFromDirName(dirName) !== featureId) {
31
- return fail(json, "invalid-option", `'${featureId}' is not a usable feature id. ${FEATURE_ID_RULE}`);
32
- }
33
- // Service ids are validated BEFORE the config is even loaded, and long
34
- // before anything is written: every one of them is interpolated into
35
- // `specs/<id>/` under the new feature directory, so `--touches ../../x`
36
- // was a writer pointed outside the docs repo. One grammar (core/ids.ts),
37
- // the same one adopt/init/vouch refuse on, so a service that is legal to
38
- // create is legal to name here and nowhere the two disagree.
39
- for (const [label, ids] of [
40
- ["--touches", opts.touches],
41
- ["--new-service", opts.newService],
42
- ]) {
43
- for (const id of ids) {
44
- try {
45
- assertServiceId(id, label);
46
- }
47
- catch (err) {
48
- if (!(err instanceof InvalidIdError))
49
- throw err;
50
- return fail(json, "invalid-option", err.message);
51
- }
52
- }
53
- }
54
- const config = await loadConfig();
55
- if (!config) {
56
- reportNoConfig(json);
57
- return;
58
- }
59
- const { docsDir } = config;
60
- // Before a single file is scaffolded: a docsDir that is not a docs repo is
61
- // refused, never written into. `features/<id>/**` lands happily in any
62
- // directory, so without this gate `new` reported `ok: true` over a
63
- // scaffold that no enumeration downstream will ever see — and a docsDir
64
- // that is simply absent escaped as `internal` (the enumeration below
65
- // throws) carrying the very sentence `list` and `show` report as
66
- // `docs-missing`. See docs-repo-gate.ts's docsRepoReady. `services`, not
67
- // `docs`: every id named by --touches/--new-service is a claim about
68
- // `services/<id>/`, and the near-miss note below is computed against that
69
- // directory, so a run without it is guessing.
70
- if (!docsRepoReady(json, docsDir, "services"))
71
- return;
72
- let existing;
73
- try {
74
- existing = await resolveFeature(docsDir, featureId, "include");
75
- }
76
- catch (err) {
77
- // The gate above already refused both broken states, so reaching here
78
- // means the docs repo went away between that check and this read. Same
79
- // breach, same two codes — the alternative is a stack trace under
80
- // `internal` that names neither.
81
- if (!(err instanceof DocsRepoUnavailableError))
82
- throw err;
83
- reportDocsRepoError(json, err);
84
- return;
85
- }
86
- if (existing) {
87
- return fail(json, "already-exists", `Feature '${featureId}' already exists at ${repoPath(docsDir, existing.dir)}.`);
88
- }
89
- // A service named both ways is new — that is the more specific claim.
90
- const created = new Set(opts.newService);
91
- const touched = opts.touches.filter((s) => !created.has(s));
92
- const dir = join(featuresDir(docsDir), dirName);
93
- const files = {
94
- "intent.md": intentTemplate(featureId, opts.title),
95
- "delta.likec4": deltaTemplate(featureId, touched, [...created]),
96
- };
97
- for (const svc of [...touched, ...created]) {
98
- files[join("specs", svc, "spec.md")] = specTemplate(featureId, svc);
99
- }
100
- for (const svc of created) {
101
- files[join("specs", svc, "openapi.yaml")] = openapiTemplate(svc);
102
- // The architecture axis is scaffolded only for a service this feature
103
- // INTRODUCES, because that is the case where `c4.uncovered` will fire
104
- // the moment the delta is written: a brand-new tagged element nothing
105
- // covers. Handing an author a blank page for the outbox/retries/alerts
106
- // requirement is how that axis stays empty across a whole fleet.
107
- files[join("specs", svc, "arch.spec.md")] = archSpecTemplate(featureId, svc);
108
- }
109
- const written = [];
110
- for (const [rel, content] of Object.entries(files)) {
111
- // Belt and braces over the id check above: the id grammar is what makes
112
- // this safe, and `resolveInside` is what proves it at the moment of the
113
- // write — including the symlink cases a grammar cannot see.
114
- let path;
115
- try {
116
- path = resolveInside(docsDir, join("features", dirName, rel), "feature file");
117
- }
118
- catch (err) {
119
- if (!(err instanceof UnsafePathError))
120
- throw err;
121
- return fail(json, "invalid-option", err.message);
122
- }
123
- await mkdir(dirname(path), { recursive: true });
124
- await writeFile(path, content, "utf8");
125
- written.push(repoPath(docsDir, path));
126
- }
127
- const notes = await unknownServiceNotes(docsDir, touched);
128
- if (json) {
129
- emitJson({
130
- feature: featureId,
131
- path: repoPath(docsDir, dir),
132
- created: written,
133
- // Not an error and not a finding: `--touches` on a service that does
134
- // not exist yet is legal (adopt it later, or say `--new-service`).
135
- // It is reported because the silent alternative is a feature whose
136
- // spec delta will never merge into anything.
137
- notes,
138
- });
139
- return;
140
- }
141
- console.log(`${featureId} scaffolded at ${repoPath(docsDir, dir)}`);
142
- for (const w of written)
143
- console.log(` + ${w}`);
144
- for (const note of notes)
145
- console.log(`\n note: ${note}`);
146
- console.log(`\nNext: fill in the delta, then \`loam validate --feature ${featureId}\`.`);
147
- console.log("If this feature changes no architecture, delete delta.likec4 — a requirements-only\n" +
148
- "feature is complete without it, and an empty `model {}` validates clean too.");
149
- });
150
- }
151
- function collect(value, previous) {
152
- return [...previous, value];
153
- }
154
- /* ------------------------------------------------------------------ */
155
- /* Hints */
156
- /* ------------------------------------------------------------------ */
157
- /**
158
- * `--touches <id>` naming neither a living `services/<id>/` nor a `--new-service`
159
- * is almost always a typo, and it is silent by construction: the scaffold writes
160
- * `specs/<id>/spec.md` happily, `loam validate` grades a delta against a living
161
- * spec that is not there, and the mistake surfaces at archive time as a service
162
- * appearing from nowhere. A note, not a refusal — naming a service that will be
163
- * adopted next week is legitimate — but the near-miss is spelled out, because
164
- * `order-api` vs `orders-api` is exactly the pair a person cannot see.
165
- */
166
- async function unknownServiceNotes(docsDir, touched) {
167
- if (touched.length === 0)
168
- return [];
169
- let known;
170
- try {
171
- known = (await listServices(docsDir)).map((s) => s.id);
172
- }
173
- catch (err) {
174
- // No docs repo to compare against is a different diagnosis entirely, and
175
- // `loam doctor` owns it. Saying nothing here beats inventing a typo hint
176
- // out of an enumeration that never ran.
177
- if (!(err instanceof DocsRepoUnavailableError))
178
- throw err;
179
- return [];
180
- }
181
- const notes = [];
182
- for (const id of touched) {
183
- if (known.includes(id))
184
- continue;
185
- const near = nearestIds(id, known);
186
- notes.push(`--touches '${id}' matches no services/${id}/ in the docs repo` +
187
- (near.length === 0 ? "" : ` — did you mean ${near.map((n) => `'${n}'`).join(" or ")}?`) +
188
- ` If ${id} is introduced by this feature, pass --new-service ${id} instead.`);
189
- }
190
- return notes;
191
- }
192
- /* ------------------------------------------------------------------ */
193
- /* Naming */
194
- /* ------------------------------------------------------------------ */
195
- function featureDirName(featureId, title) {
196
- const slug = slugify(title ?? "");
197
- return slug ? `${featureId}-${slug}` : featureId;
198
- }
199
- function slugify(text) {
200
- return text
201
- .toLowerCase()
202
- .replace(/[^a-z0-9]+/g, "-")
203
- .replace(/^-+|-+$/g, "");
204
- }
205
- /** A LikeC4 identifier for a service name: `payment-split-service` -> `paymentSplitService`. */
206
- function identifier(name, taken) {
207
- const parts = name.split(/[^A-Za-z0-9]+/).filter((p) => p.length > 0);
208
- const head = (parts[0] ?? "svc").replace(/^\d+/, "") || "svc";
209
- const base = head[0].toLowerCase() +
210
- head.slice(1) +
211
- parts.slice(1).map((p) => p[0].toUpperCase() + p.slice(1)).join("");
212
- let id = base;
213
- for (let n = 2; taken.has(id); n += 1)
214
- id = `${base}${n}`;
215
- taken.add(id);
216
- return id;
217
- }
218
- /** `FEAT-101` -> `feat_101`: LikeC4 view names take no dashes. */
219
- function viewName(featureId) {
220
- return featureId.toLowerCase().replace(/[^a-z0-9]+/g, "_");
221
- }
222
- /* ------------------------------------------------------------------ */
223
- /* Templates */
224
- /* ------------------------------------------------------------------ */
225
- function intentTemplate(featureId, title) {
226
- const heading = title ?? featureId;
227
- // The frontmatter is SERIALIZED, never interpolated. A title is free text a
228
- // person types — `Checkout: split payments` used to be pasted straight after
229
- // `title: `, where the colon reopens the mapping and the file stops parsing;
230
- // `Orders #42 rework` lost everything from the `#` as a YAML comment, so the
231
- // feature quietly answered to a title nobody wrote. The yaml serializer is the
232
- // only thing that knows every case, and it is already how migrate-openspec
233
- // writes the same three keys.
234
- //
235
- // `owner` is deliberately NOT a key here. Scaffolding `owner:` writes an
236
- // explicit null, which is a claim ("this feature has no owner") rather than
237
- // the truth ("nobody has said yet") — and every reader then has to tell an
238
- // absent key from a null one. The prompt survives as a comment.
239
- const frontmatter = stringifyYaml({ feature: featureId, ...(title === undefined ? {} : { title }), status: "proposed" }, { lineWidth: 0 }).trimEnd();
240
- return `---
241
- ${frontmatter}
242
- # owner: <the team or person who answers for this>
243
- ---
244
-
245
- # ${heading}
246
-
247
- ## Why
248
-
249
- <!-- The problem in business terms. This is what a reviewer reads first, and what
250
- the requirement deltas below have to be justified by. -->
251
-
252
- ## Scope
253
-
254
- <!-- Which services this touches — and, more usefully, which it deliberately does not. -->
255
- `;
256
- }
257
- function deltaTemplate(featureId, touched, created) {
258
- const taken = new Set();
259
- const touchedIds = touched.map((s) => [identifier(s, taken), s]);
260
- const createdIds = created.map((s) => [identifier(s, taken), s]);
261
- const lines = [];
262
- if (touchedIds.length > 0) {
263
- // Context elements ship COMMENTED OUT, exactly like the example edge below.
264
- // Declared-and-untagged is the one shape `delta.nothing-tagged` exists to
265
- // refuse (an author who forgot the tags), so writing these live made every
266
- // `loam new --touches X` fail its own validator on the very first run —
267
- // which teaches people that the validator is noise. Uncomment a line when an
268
- // edge below actually needs the identifier.
269
- lines.push(" // Services this feature touches, as context for the diagram. Uncomment the");
270
- lines.push(" // ones an edge below names, and reuse the identifiers from");
271
- lines.push(" // architecture/landscape.likec4 so the merge lines up. They stay UNTAGGED:");
272
- lines.push(` // only #${featureId} is the change, and everything else here is context.`);
273
- for (const [id, name] of touchedIds)
274
- lines.push(` // ${id} = softwareSystem '${name}'`);
275
- lines.push("");
276
- }
277
- if (createdIds.length > 0) {
278
- lines.push(" // Services this feature introduces. The tag is what `loam archive` folds");
279
- lines.push(" // into the living landscape.");
280
- for (const [id, name] of createdIds) {
281
- lines.push(` ${id} = softwareSystem '${name}' {`);
282
- lines.push(` #${featureId}`);
283
- lines.push(` description 'TODO — what this service owns'`);
284
- lines.push(" }");
285
- }
286
- lines.push("");
287
- }
288
- // The example edge uses identifiers already declared above when there are two
289
- // to join; otherwise placeholders, so it never invents a service.
290
- const from = touchedIds[0]?.[0] ?? createdIds[0]?.[0] ?? "consumer";
291
- const to = createdIds[0]?.[0] ?? touchedIds[1]?.[0] ?? "provider";
292
- lines.push(" // New calls. `metadata { op }` is the spine: it names the OpenAPI operationId");
293
- lines.push(" // the call uses, and `loam validate` checks it against the target's contract.");
294
- lines.push(" // Uncomment and adjust (both endpoints have to be declared above):");
295
- lines.push(" //");
296
- lines.push(` // ${from} -> ${to} 'Calls createSplit' {`);
297
- lines.push(` // #${featureId}`);
298
- lines.push(" // metadata { op 'createSplit' }");
299
- lines.push(" // }");
300
- return `// ${featureId} — architecture delta.
301
- //
302
- // Everything tagged #${featureId} is exactly what \`loam archive\` folds into
303
- // architecture/landscape.likec4. Everything else here is context for the diagram.
304
- //
305
- // If ${featureId} changes no architecture, DELETE this file: a requirements-only
306
- // feature is complete without it, and an empty \`model {}\` is just as legal.
307
-
308
- specification {
309
- element softwareSystem
310
- tag ${featureId}
311
- }
312
-
313
- model {
314
- ${lines.join("\n")}
315
- }
316
-
317
- views {
318
- view ${viewName(featureId)} {
319
- include *
320
- }
321
- }
322
- `;
323
- }
324
- function specTemplate(featureId, service) {
325
- return `# ${service} — requirement delta for ${featureId}
326
-
327
- <!-- Sections: ADDED / MODIFIED / REMOVED. Delete the ones you do not need.
328
- A MODIFIED requirement carries its full new text, not a diff.
329
- Every requirement needs at least one scenario — \`loam validate\` gates on it. -->
330
-
331
- ## ADDED Requirements
332
-
333
- ### Requirement: TODO — name the behaviour
334
- Requirement-ID: ${featureId}.${service}.requirement
335
-
336
- The service SHALL <observable behaviour, testable without reading the code>.
337
-
338
- <!-- Operations: createSplit
339
- The operationIds this requirement governs. \`loam validate\` checks each one
340
- against the service's OpenAPI, and \`loam archive\` refuses to merge a
341
- requirement that governs an operation nobody defines. Uncomment when the
342
- contract exists. -->
343
-
344
- #### Scenario: TODO — name the case
345
- - **Given** <the starting state>
346
- - **When** <the trigger>
347
- - **Then** <the observable outcome>
348
- `;
349
- }
350
- /**
351
- * The architecture axis, scaffolded EMPTY on purpose.
352
- *
353
- * Same grammar as spec.md, so the template body has to be unparseable as
354
- * requirements or the scaffold would ship a requirement nobody wrote — the
355
- * headings are therefore indented inside an HTML comment, which puts them past
356
- * the line-anchored `## ADDED Requirements` / `### Requirement:` patterns
357
- * core/spec.ts matches on. Copy the block out of the comment and unindent it.
358
- */
359
- function archSpecTemplate(featureId, service) {
360
- return `# ${service} — architecture requirement delta for ${featureId}
361
-
362
- <!-- The architecture axis: the obligations no business scenario was ever going
363
- to mention — the outbox, the retries, the timeouts, the alerts.
364
-
365
- \`Covers:\` is to an arch requirement what \`Operations:\` is to a business
366
- one — it names the MODEL OBJECTS the scenarios below exercise, so coverage
367
- is derived instead of trusted. Three forms, comma-separated:
368
-
369
- Covers: ${service} a C4 element — its id, or the service a
370
- bound/titled element stands for
371
- Covers: consumer -> ${service} an edge, each side resolved the same way
372
- Covers: alert:<id>, sli:<id> a signal declared in health.yaml
373
-
374
- Every tagged element and edge in delta.likec4 wants one (\`c4.uncovered\`).
375
- Delete this file if ${featureId} adds no architectural obligation.
376
-
377
- Copy the block below out of this comment and unindent it:
378
-
379
- ## ADDED Requirements
380
-
381
- ### Requirement: TODO — name the architectural obligation
382
- Requirement-ID: ${featureId}.${service}.arch
383
-
384
- The service SHALL <the operational/integration behaviour, observable in test>.
385
-
386
- Covers: ${service}
387
-
388
- #### Scenario: TODO — name the case
389
- - **Given** <the starting state>
390
- - **When** <the trigger>
391
- - **Then** <the observable outcome>
392
- -->
393
- `;
394
- }
395
- function openapiTemplate(service) {
396
- return `openapi: 3.1.0
397
- info:
398
- title: ${service}
399
- version: "0.1"
400
-
401
- # The operations this feature adds. \`operationId\` is the token the C4 edge
402
- # (metadata { op }) and the requirement (Operations:) both point at — keep the
403
- # three spellings identical or \`loam validate\` will say so.
404
- paths: {}
405
- # /splits:
406
- # post:
407
- # operationId: createSplit
408
- # responses:
409
- # "201":
410
- # description: Created
411
- `;
412
- }
413
- //# sourceMappingURL=new.js.map