@warpgogol/forge 5.2.4 → 5.3.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 (590) hide show
  1. package/README.md +1 -1
  2. package/README.uk.md +8 -8
  3. package/bin/cli.ts +25 -33
  4. package/dist/bin/cli.js +21 -32
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/os/adr/adr.module.d.ts.map +1 -1
  7. package/dist/os/adr/adr.module.js +8 -3
  8. package/dist/os/adr/adr.module.js.map +1 -1
  9. package/dist/os/adr/frontmatter-io.js +5 -5
  10. package/dist/os/adr/frontmatter-io.js.map +1 -1
  11. package/dist/os/adr/handlers/archive.d.ts.map +1 -1
  12. package/dist/os/adr/handlers/archive.js +10 -4
  13. package/dist/os/adr/handlers/archive.js.map +1 -1
  14. package/dist/os/adr/handlers/implement-stamp.d.ts.map +1 -1
  15. package/dist/os/adr/handlers/implement-stamp.js +10 -10
  16. package/dist/os/adr/handlers/implement-stamp.js.map +1 -1
  17. package/dist/os/adr/handlers/list-create.js +5 -5
  18. package/dist/os/adr/handlers/list-create.js.map +1 -1
  19. package/dist/os/adr/handlers/validate.js +1 -1
  20. package/dist/os/adr/handlers/validate.js.map +1 -1
  21. package/dist/os/audit/audit.module.js +3 -3
  22. package/dist/os/audit/audit.module.js.map +1 -1
  23. package/dist/os/audit/frontmatter-io.js +5 -5
  24. package/dist/os/audit/frontmatter-io.js.map +1 -1
  25. package/dist/os/audit/handlers/archive.d.ts.map +1 -1
  26. package/dist/os/audit/handlers/archive.js +10 -4
  27. package/dist/os/audit/handlers/archive.js.map +1 -1
  28. package/dist/os/compass/compass.module.d.ts.map +1 -1
  29. package/dist/os/compass/compass.module.js +17 -1
  30. package/dist/os/compass/compass.module.js.map +1 -1
  31. package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
  32. package/dist/os/compass/handlers/compass-audit-handler.js +12 -5
  33. package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
  34. package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -1
  35. package/dist/os/compass/handlers/compass-change-summary-handler.js +3 -2
  36. package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -1
  37. package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
  38. package/dist/os/compass/handlers/compass-inventory-handler.js +6 -4
  39. package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
  40. package/dist/os/compass/handlers/compass-inventory.d.ts.map +1 -1
  41. package/dist/os/compass/handlers/compass-inventory.js +10 -8
  42. package/dist/os/compass/handlers/compass-inventory.js.map +1 -1
  43. package/dist/os/compass/handlers/compass-migrate-handler.js +1 -1
  44. package/dist/os/compass/handlers/compass-migrate-handler.js.map +1 -1
  45. package/dist/os/compass/handlers/compass-migrate.d.ts.map +1 -1
  46. package/dist/os/compass/handlers/compass-migrate.js +6 -3
  47. package/dist/os/compass/handlers/compass-migrate.js.map +1 -1
  48. package/dist/os/compass/handlers/git-revision.d.ts.map +1 -1
  49. package/dist/os/compass/handlers/git-revision.js +9 -6
  50. package/dist/os/compass/handlers/git-revision.js.map +1 -1
  51. package/dist/os/compass/handlers/resolve-scan-root.js +1 -1
  52. package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -1
  53. package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
  54. package/dist/os/compass/handlers/summary-record.js +8 -4
  55. package/dist/os/compass/handlers/summary-record.js.map +1 -1
  56. package/dist/os/core/core.module.d.ts.map +1 -1
  57. package/dist/os/core/core.module.js +43 -4
  58. package/dist/os/core/core.module.js.map +1 -1
  59. package/dist/os/core/handlers/assets-helpers.d.ts.map +1 -1
  60. package/dist/os/core/handlers/assets-helpers.js +6 -3
  61. package/dist/os/core/handlers/assets-helpers.js.map +1 -1
  62. package/dist/os/core/handlers/build.js +1 -1
  63. package/dist/os/core/handlers/build.js.map +1 -1
  64. package/dist/os/core/handlers/determinism-check.d.ts.map +1 -1
  65. package/dist/os/core/handlers/determinism-check.js +10 -6
  66. package/dist/os/core/handlers/determinism-check.js.map +1 -1
  67. package/dist/os/core/handlers/dev.js +1 -1
  68. package/dist/os/core/handlers/dev.js.map +1 -1
  69. package/dist/os/core/handlers/file-size-lint.d.ts.map +1 -1
  70. package/dist/os/core/handlers/file-size-lint.js +11 -7
  71. package/dist/os/core/handlers/file-size-lint.js.map +1 -1
  72. package/dist/os/core/handlers/forge-autonomy-validate.d.ts.map +1 -1
  73. package/dist/os/core/handlers/forge-autonomy-validate.js +9 -5
  74. package/dist/os/core/handlers/forge-autonomy-validate.js.map +1 -1
  75. package/dist/os/core/handlers/knowledge-compact.js +1 -1
  76. package/dist/os/core/handlers/knowledge-compact.js.map +1 -1
  77. package/dist/os/core/handlers/package-health.js +1 -1
  78. package/dist/os/core/handlers/package-health.js.map +1 -1
  79. package/dist/os/core/handlers/pinned-check.js +2 -2
  80. package/dist/os/core/handlers/pinned-check.js.map +1 -1
  81. package/dist/os/core/handlers/pinned-init.d.ts.map +1 -1
  82. package/dist/os/core/handlers/pinned-init.js +9 -8
  83. package/dist/os/core/handlers/pinned-init.js.map +1 -1
  84. package/dist/os/core/handlers/pinned-validate.js +3 -3
  85. package/dist/os/core/handlers/pinned-validate.js.map +1 -1
  86. package/dist/os/core/handlers/profile-resolve.js +1 -1
  87. package/dist/os/core/handlers/profile-resolve.js.map +1 -1
  88. package/dist/os/core/handlers/public-surface.js +1 -1
  89. package/dist/os/core/handlers/public-surface.js.map +1 -1
  90. package/dist/os/core/handlers/release-prepare.d.ts.map +1 -1
  91. package/dist/os/core/handlers/release-prepare.js +10 -6
  92. package/dist/os/core/handlers/release-prepare.js.map +1 -1
  93. package/dist/os/core/handlers/release-publish.js +6 -6
  94. package/dist/os/core/handlers/release-publish.js.map +1 -1
  95. package/dist/os/core/handlers/validate.js +1 -1
  96. package/dist/os/core/handlers/validate.js.map +1 -1
  97. package/dist/os/exploration/exploration.module.d.ts.map +1 -1
  98. package/dist/os/exploration/exploration.module.js +1 -0
  99. package/dist/os/exploration/exploration.module.js.map +1 -1
  100. package/dist/os/exploration/frontmatter-io.js +4 -4
  101. package/dist/os/exploration/frontmatter-io.js.map +1 -1
  102. package/dist/os/exploration/handlers/archive.js +3 -3
  103. package/dist/os/exploration/handlers/archive.js.map +1 -1
  104. package/dist/os/mission/handlers/archive.d.ts.map +1 -1
  105. package/dist/os/mission/handlers/archive.js +44 -23
  106. package/dist/os/mission/handlers/archive.js.map +1 -1
  107. package/dist/os/mission/mission.module.js +3 -3
  108. package/dist/os/mission/mission.module.js.map +1 -1
  109. package/dist/os/naming/naming-convention.d.ts.map +1 -1
  110. package/dist/os/naming/naming-convention.js +7 -3
  111. package/dist/os/naming/naming-convention.js.map +1 -1
  112. package/dist/os/naming/naming.module.d.ts.map +1 -1
  113. package/dist/os/naming/naming.module.js +4 -3
  114. package/dist/os/naming/naming.module.js.map +1 -1
  115. package/dist/os/notes/notes.module.d.ts.map +1 -1
  116. package/dist/os/notes/notes.module.js +6 -3
  117. package/dist/os/notes/notes.module.js.map +1 -1
  118. package/dist/os/plan/frontmatter-io.js +5 -5
  119. package/dist/os/plan/frontmatter-io.js.map +1 -1
  120. package/dist/os/plan/handlers/archive.d.ts.map +1 -1
  121. package/dist/os/plan/handlers/archive.js +10 -4
  122. package/dist/os/plan/handlers/archive.js.map +1 -1
  123. package/dist/os/plan/plan.module.js +3 -3
  124. package/dist/os/plan/plan.module.js.map +1 -1
  125. package/dist/os/plugin/plugin.module.d.ts.map +1 -1
  126. package/dist/os/plugin/plugin.module.js +6 -3
  127. package/dist/os/plugin/plugin.module.js.map +1 -1
  128. package/dist/os/program/discovery.js +2 -2
  129. package/dist/os/program/discovery.js.map +1 -1
  130. package/dist/os/program/handlers/complete.js +1 -1
  131. package/dist/os/program/handlers/complete.js.map +1 -1
  132. package/dist/os/program/handlers/lease.js +1 -1
  133. package/dist/os/program/handlers/lease.js.map +1 -1
  134. package/dist/os/program/handlers/seal.js +1 -1
  135. package/dist/os/program/handlers/seal.js.map +1 -1
  136. package/dist/os/program/lease.js +1 -1
  137. package/dist/os/program/lease.js.map +1 -1
  138. package/dist/os/program/program.module.d.ts.map +1 -1
  139. package/dist/os/program/program.module.js +9 -3
  140. package/dist/os/program/program.module.js.map +1 -1
  141. package/dist/os/queue/index.js +1 -1
  142. package/dist/os/queue/manifest.d.ts.map +1 -1
  143. package/dist/os/queue/manifest.js +4 -8
  144. package/dist/os/queue/manifest.js.map +1 -1
  145. package/dist/os/rfc/acceptance.d.ts.map +1 -1
  146. package/dist/os/rfc/acceptance.js +10 -6
  147. package/dist/os/rfc/acceptance.js.map +1 -1
  148. package/dist/os/rfc/decision-log.d.ts.map +1 -1
  149. package/dist/os/rfc/decision-log.js +4 -3
  150. package/dist/os/rfc/decision-log.js.map +1 -1
  151. package/dist/os/rfc/dna-trace.d.ts.map +1 -1
  152. package/dist/os/rfc/dna-trace.js +7 -2
  153. package/dist/os/rfc/dna-trace.js.map +1 -1
  154. package/dist/os/rfc/frontmatter-io.js +5 -5
  155. package/dist/os/rfc/frontmatter-io.js.map +1 -1
  156. package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
  157. package/dist/os/rfc/handlers/archive.js +11 -5
  158. package/dist/os/rfc/handlers/archive.js.map +1 -1
  159. package/dist/os/rfc/handlers/check.d.ts.map +1 -1
  160. package/dist/os/rfc/handlers/check.js +6 -3
  161. package/dist/os/rfc/handlers/check.js.map +1 -1
  162. package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
  163. package/dist/os/rfc/handlers/implement-stamp.js +11 -10
  164. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
  165. package/dist/os/rfc/handlers/index-graph.js +3 -3
  166. package/dist/os/rfc/handlers/index-graph.js.map +1 -1
  167. package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
  168. package/dist/os/rfc/handlers/lifecycle.js +6 -2
  169. package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
  170. package/dist/os/rfc/handlers/list-create.d.ts.map +1 -1
  171. package/dist/os/rfc/handlers/list-create.js +7 -6
  172. package/dist/os/rfc/handlers/list-create.js.map +1 -1
  173. package/dist/os/rfc/handlers/shared.js +3 -3
  174. package/dist/os/rfc/handlers/shared.js.map +1 -1
  175. package/dist/os/rfc/handlers/supersede-propose.d.ts.map +1 -1
  176. package/dist/os/rfc/handlers/supersede-propose.js +7 -3
  177. package/dist/os/rfc/handlers/supersede-propose.js.map +1 -1
  178. package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
  179. package/dist/os/rfc/handlers/validate-rules.js +8 -5
  180. package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
  181. package/dist/os/rfc/handlers/validate.d.ts.map +1 -1
  182. package/dist/os/rfc/handlers/validate.js +6 -1
  183. package/dist/os/rfc/handlers/validate.js.map +1 -1
  184. package/dist/os/rfc/rfc.module.d.ts.map +1 -1
  185. package/dist/os/rfc/rfc.module.js +44 -4
  186. package/dist/os/rfc/rfc.module.js.map +1 -1
  187. package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
  188. package/dist/os/rfc/verification-evidence.js +9 -5
  189. package/dist/os/rfc/verification-evidence.js.map +1 -1
  190. package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
  191. package/dist/os/rfc/verification-refresh.js +4 -3
  192. package/dist/os/rfc/verification-refresh.js.map +1 -1
  193. package/dist/os/session/frontmatter-io.js +12 -12
  194. package/dist/os/session/frontmatter-io.js.map +1 -1
  195. package/dist/os/session/handlers/archive.d.ts.map +1 -1
  196. package/dist/os/session/handlers/archive.js +10 -4
  197. package/dist/os/session/handlers/archive.js.map +1 -1
  198. package/dist/os/session/handlers/metrics-aggregate.d.ts.map +1 -1
  199. package/dist/os/session/handlers/metrics-aggregate.js +9 -5
  200. package/dist/os/session/handlers/metrics-aggregate.js.map +1 -1
  201. package/dist/os/session/handlers/metrics-rfc.d.ts.map +1 -1
  202. package/dist/os/session/handlers/metrics-rfc.js +11 -8
  203. package/dist/os/session/handlers/metrics-rfc.js.map +1 -1
  204. package/dist/os/session/handlers/metrics-session.d.ts.map +1 -1
  205. package/dist/os/session/handlers/metrics-session.js +6 -3
  206. package/dist/os/session/handlers/metrics-session.js.map +1 -1
  207. package/dist/os/session/handlers/save.d.ts.map +1 -1
  208. package/dist/os/session/handlers/save.js +14 -8
  209. package/dist/os/session/handlers/save.js.map +1 -1
  210. package/dist/os/session/session.module.d.ts.map +1 -1
  211. package/dist/os/session/session.module.js +6 -0
  212. package/dist/os/session/session.module.js.map +1 -1
  213. package/dist/os/spec/live-spec-list.js +4 -4
  214. package/dist/os/spec/live-spec-list.js.map +1 -1
  215. package/dist/os/spec/live-spec-merge.js +5 -5
  216. package/dist/os/spec/live-spec-merge.js.map +1 -1
  217. package/dist/os/spec/live-spec-show.js +3 -3
  218. package/dist/os/spec/live-spec-show.js.map +1 -1
  219. package/dist/os/spec/live-spec-validate.js +4 -4
  220. package/dist/os/spec/live-spec-validate.js.map +1 -1
  221. package/dist/os/spec/spec-materialize.js +9 -9
  222. package/dist/os/spec/spec-materialize.js.map +1 -1
  223. package/dist/os/spec/spec-status.js +9 -9
  224. package/dist/os/spec/spec-status.js.map +1 -1
  225. package/dist/os/spec/spec-validate.js +7 -7
  226. package/dist/os/spec/spec-validate.js.map +1 -1
  227. package/dist/os/spec/spec.module.d.ts.map +1 -1
  228. package/dist/os/spec/spec.module.js +8 -0
  229. package/dist/os/spec/spec.module.js.map +1 -1
  230. package/dist/os/werkstatt/handlers/lock.js +16 -16
  231. package/dist/os/werkstatt/handlers/lock.js.map +1 -1
  232. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +3 -3
  233. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -1
  234. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
  235. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +3 -2
  236. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
  237. package/dist/os/werkstatt/handlers/workspace-deps.d.ts.map +1 -1
  238. package/dist/os/werkstatt/handlers/workspace-deps.js +0 -1
  239. package/dist/os/werkstatt/handlers/workspace-deps.js.map +1 -1
  240. package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
  241. package/dist/os/werkstatt/werkstatt.module.js +6 -2
  242. package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
  243. package/dist/os/workflow/handlers.d.ts.map +1 -1
  244. package/dist/os/workflow/handlers.js +8 -5
  245. package/dist/os/workflow/handlers.js.map +1 -1
  246. package/dist/os/workflow/workflow.module.d.ts.map +1 -1
  247. package/dist/os/workflow/workflow.module.js +6 -3
  248. package/dist/os/workflow/workflow.module.js.map +1 -1
  249. package/dist/src/cli-flags.d.ts +28 -0
  250. package/dist/src/cli-flags.d.ts.map +1 -0
  251. package/dist/src/cli-flags.js +232 -0
  252. package/dist/src/cli-flags.js.map +1 -0
  253. package/dist/src/compass/contract-registry.js +1 -1
  254. package/dist/src/compass/contract-registry.js.map +1 -1
  255. package/dist/src/config/forge-config.d.ts +1 -1
  256. package/dist/src/config/forge-config.js +1 -1
  257. package/dist/src/config/forge-config.js.map +1 -1
  258. package/dist/src/knowledge/budgets.js +1 -1
  259. package/dist/src/knowledge/budgets.js.map +1 -1
  260. package/dist/src/knowledge/compact.js +1 -1
  261. package/dist/src/knowledge/compact.js.map +1 -1
  262. package/dist/src/knowledge/parse.js +1 -1
  263. package/dist/src/knowledge/parse.js.map +1 -1
  264. package/dist/src/knowledge/sync.d.ts.map +1 -1
  265. package/dist/src/knowledge/sync.js +3 -5
  266. package/dist/src/knowledge/sync.js.map +1 -1
  267. package/dist/src/migration-adapters/git-utils.js +2 -2
  268. package/dist/src/migration-adapters/git-utils.js.map +1 -1
  269. package/dist/src/migration-adapters/ignored-files.js +2 -2
  270. package/dist/src/migration-adapters/ignored-files.js.map +1 -1
  271. package/dist/src/migration-adapters/node-typescript-pnpm/index.js +1 -1
  272. package/dist/src/migration-adapters/node-typescript-pnpm/index.js.map +1 -1
  273. package/dist/src/migration-adapters/phaser-pnpm/index.js +1 -1
  274. package/dist/src/migration-adapters/phaser-pnpm/index.js.map +1 -1
  275. package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
  276. package/dist/src/onboarding/agents-generate.js +76 -34
  277. package/dist/src/onboarding/agents-generate.js.map +1 -1
  278. package/dist/src/onboarding/create.d.ts.map +1 -1
  279. package/dist/src/onboarding/create.js +10 -10
  280. package/dist/src/onboarding/create.js.map +1 -1
  281. package/dist/src/onboarding/doctor.d.ts.map +1 -1
  282. package/dist/src/onboarding/doctor.js +68 -59
  283. package/dist/src/onboarding/doctor.js.map +1 -1
  284. package/dist/src/onboarding/init.d.ts.map +1 -1
  285. package/dist/src/onboarding/init.js +30 -1
  286. package/dist/src/onboarding/init.js.map +1 -1
  287. package/dist/src/onboarding/invariant-engine.js +1 -1
  288. package/dist/src/onboarding/invariant-engine.js.map +1 -1
  289. package/dist/src/onboarding/memory-compact.d.ts.map +1 -1
  290. package/dist/src/onboarding/memory-compact.js +5 -4
  291. package/dist/src/onboarding/memory-compact.js.map +1 -1
  292. package/dist/src/onboarding/memory-scaffold.js +1 -1
  293. package/dist/src/onboarding/memory-scaffold.js.map +1 -1
  294. package/dist/src/onboarding/nested-agents-generate.d.ts +4 -1
  295. package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -1
  296. package/dist/src/onboarding/nested-agents-generate.js +34 -5
  297. package/dist/src/onboarding/nested-agents-generate.js.map +1 -1
  298. package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -1
  299. package/dist/src/onboarding/nested-agents-templates.js +8 -12
  300. package/dist/src/onboarding/nested-agents-templates.js.map +1 -1
  301. package/dist/src/onboarding/npm-token-check.js +2 -2
  302. package/dist/src/onboarding/npm-token-check.js.map +1 -1
  303. package/dist/src/onboarding/prettierignore.d.ts +29 -0
  304. package/dist/src/onboarding/prettierignore.d.ts.map +1 -0
  305. package/dist/src/onboarding/prettierignore.js +231 -0
  306. package/dist/src/onboarding/prettierignore.js.map +1 -0
  307. package/dist/src/onboarding/profile-validate.d.ts.map +1 -1
  308. package/dist/src/onboarding/profile-validate.js +5 -4
  309. package/dist/src/onboarding/profile-validate.js.map +1 -1
  310. package/dist/src/onboarding/scaffold-project.d.ts.map +1 -1
  311. package/dist/src/onboarding/scaffold-project.js +35 -27
  312. package/dist/src/onboarding/scaffold-project.js.map +1 -1
  313. package/dist/src/onboarding/scaffold.js +1 -1
  314. package/dist/src/onboarding/scaffold.js.map +1 -1
  315. package/dist/src/onboarding/skill-markers.d.ts +27 -0
  316. package/dist/src/onboarding/skill-markers.d.ts.map +1 -0
  317. package/dist/src/onboarding/skill-markers.js +131 -0
  318. package/dist/src/onboarding/skill-markers.js.map +1 -0
  319. package/dist/src/onboarding/upgrade.d.ts +10 -0
  320. package/dist/src/onboarding/upgrade.d.ts.map +1 -1
  321. package/dist/src/onboarding/upgrade.js +215 -74
  322. package/dist/src/onboarding/upgrade.js.map +1 -1
  323. package/dist/src/onboarding/workspace-discovery.js +1 -1
  324. package/dist/src/onboarding/workspace-discovery.js.map +1 -1
  325. package/dist/src/pipeline-status.d.ts +6 -5
  326. package/dist/src/pipeline-status.d.ts.map +1 -1
  327. package/dist/src/pipeline-status.js +24 -19
  328. package/dist/src/pipeline-status.js.map +1 -1
  329. package/dist/src/profiles/stack-profile.js +1 -1
  330. package/dist/src/profiles/stack-profile.js.map +1 -1
  331. package/dist/src/registry.d.ts +1 -1
  332. package/dist/src/registry.d.ts.map +1 -1
  333. package/dist/src/registry.js +3 -3
  334. package/dist/src/registry.js.map +1 -1
  335. package/dist/src/skill-schema.d.ts +1 -1
  336. package/dist/src/skill-schema.d.ts.map +1 -1
  337. package/dist/src/skill-schema.js +4 -1
  338. package/dist/src/skill-schema.js.map +1 -1
  339. package/dist/src/types.d.ts +116 -0
  340. package/dist/src/types.d.ts.map +1 -1
  341. package/dist/src/utils/editable-region.d.ts +46 -0
  342. package/dist/src/utils/editable-region.d.ts.map +1 -0
  343. package/dist/src/utils/editable-region.js +125 -0
  344. package/dist/src/utils/editable-region.js.map +1 -0
  345. package/dist/src/utils/fs-idempotent.d.ts +2 -1
  346. package/dist/src/utils/fs-idempotent.d.ts.map +1 -1
  347. package/dist/src/utils/fs-idempotent.js +11 -7
  348. package/dist/src/utils/fs-idempotent.js.map +1 -1
  349. package/dist/src/utils/generated-marker.d.ts +17 -0
  350. package/dist/src/utils/generated-marker.d.ts.map +1 -1
  351. package/dist/src/utils/generated-marker.js +29 -1
  352. package/dist/src/utils/generated-marker.js.map +1 -1
  353. package/dist/src/utils/index.d.ts +3 -1
  354. package/dist/src/utils/index.d.ts.map +1 -1
  355. package/dist/src/utils/index.js +3 -1
  356. package/dist/src/utils/index.js.map +1 -1
  357. package/dist/src/utils/io.d.ts +9 -0
  358. package/dist/src/utils/io.d.ts.map +1 -0
  359. package/dist/src/utils/io.js +130 -0
  360. package/dist/src/utils/io.js.map +1 -0
  361. package/dist/src/utils/markdown-table.d.ts +21 -0
  362. package/dist/src/utils/markdown-table.d.ts.map +1 -0
  363. package/dist/src/utils/markdown-table.js +116 -0
  364. package/dist/src/utils/markdown-table.js.map +1 -0
  365. package/dist/src/utils/sync-fs.d.ts +5 -0
  366. package/dist/src/utils/sync-fs.d.ts.map +1 -0
  367. package/dist/src/utils/sync-fs.js +26 -0
  368. package/dist/src/utils/sync-fs.js.map +1 -0
  369. package/dist/src/validators/note-frontmatter-validate.js +1 -1
  370. package/dist/src/validators/note-frontmatter-validate.js.map +1 -1
  371. package/dist/src/validators/note-link-validate.js +1 -1
  372. package/dist/src/validators/note-link-validate.js.map +1 -1
  373. package/dist/src/validators/note-orphan-detect.js +1 -1
  374. package/dist/src/validators/note-orphan-detect.js.map +1 -1
  375. package/dist/src/validators/port-validate.js +1 -1
  376. package/dist/src/validators/port-validate.js.map +1 -1
  377. package/dist/src/validators/skill-validate.d.ts.map +1 -1
  378. package/dist/src/validators/skill-validate.js +34 -13
  379. package/dist/src/validators/skill-validate.js.map +1 -1
  380. package/os/adr/adr.module.ts +136 -132
  381. package/os/adr/frontmatter-io.ts +5 -5
  382. package/os/adr/handlers/archive.ts +8 -4
  383. package/os/adr/handlers/implement-stamp.ts +14 -10
  384. package/os/adr/handlers/list-create.ts +5 -5
  385. package/os/adr/handlers/validate.ts +1 -1
  386. package/os/audit/audit.module.ts +33 -34
  387. package/os/audit/frontmatter-io.ts +5 -5
  388. package/os/audit/handlers/archive.ts +8 -4
  389. package/os/compass/compass.module.ts +17 -1
  390. package/os/compass/handlers/compass-audit-handler.ts +13 -5
  391. package/os/compass/handlers/compass-change-summary-handler.ts +4 -2
  392. package/os/compass/handlers/compass-inventory-handler.ts +7 -4
  393. package/os/compass/handlers/compass-inventory.ts +11 -8
  394. package/os/compass/handlers/compass-migrate-handler.ts +1 -1
  395. package/os/compass/handlers/compass-migrate.ts +7 -3
  396. package/os/compass/handlers/git-revision.ts +11 -6
  397. package/os/compass/handlers/resolve-scan-root.ts +1 -1
  398. package/os/compass/handlers/summary-record.ts +10 -4
  399. package/os/compass/handlers/tests/compass-audit-plan.test.ts +2 -1
  400. package/os/core/core.module.ts +43 -4
  401. package/os/core/handlers/assets-helpers.ts +7 -3
  402. package/os/core/handlers/build.ts +1 -1
  403. package/os/core/handlers/determinism-check.ts +12 -6
  404. package/os/core/handlers/dev.ts +1 -1
  405. package/os/core/handlers/file-size-lint.ts +16 -9
  406. package/os/core/handlers/forge-autonomy-validate.ts +10 -5
  407. package/os/core/handlers/knowledge-compact.ts +1 -1
  408. package/os/core/handlers/package-health.ts +1 -1
  409. package/os/core/handlers/pinned-check.ts +2 -2
  410. package/os/core/handlers/pinned-init.ts +9 -8
  411. package/os/core/handlers/pinned-validate.ts +3 -3
  412. package/os/core/handlers/profile-resolve.ts +1 -1
  413. package/os/core/handlers/public-surface.ts +1 -1
  414. package/os/core/handlers/release-prepare.ts +11 -6
  415. package/os/core/handlers/release-publish.ts +6 -6
  416. package/os/core/handlers/validate.ts +1 -1
  417. package/os/exploration/exploration.module.ts +1 -0
  418. package/os/exploration/frontmatter-io.ts +4 -4
  419. package/os/exploration/handlers/archive.ts +3 -3
  420. package/os/mission/handlers/archive.test.ts +38 -1
  421. package/os/mission/handlers/archive.ts +54 -23
  422. package/os/mission/mission.module.ts +38 -39
  423. package/os/naming/naming-convention.ts +9 -3
  424. package/os/naming/naming.module.ts +25 -25
  425. package/os/notes/notes.module.ts +87 -85
  426. package/os/plan/frontmatter-io.ts +5 -5
  427. package/os/plan/handlers/archive.ts +8 -4
  428. package/os/plan/plan.module.ts +33 -34
  429. package/os/plugin/plugin.module.ts +8 -6
  430. package/os/program/discovery.ts +2 -2
  431. package/os/program/handlers/complete.ts +1 -1
  432. package/os/program/handlers/lease.ts +1 -1
  433. package/os/program/handlers/seal.ts +1 -1
  434. package/os/program/lease.ts +1 -1
  435. package/os/program/program.module.ts +198 -193
  436. package/os/queue/index.ts +1 -1
  437. package/os/queue/manifest.ts +10 -9
  438. package/os/queue/queue-validate.test.ts +6 -15
  439. package/os/rfc/acceptance.ts +12 -6
  440. package/os/rfc/decision-log.ts +4 -3
  441. package/os/rfc/dna-trace.ts +8 -2
  442. package/os/rfc/frontmatter-io.ts +5 -5
  443. package/os/rfc/handlers/archive.ts +9 -5
  444. package/os/rfc/handlers/check.ts +5 -3
  445. package/os/rfc/handlers/implement-stamp.ts +15 -10
  446. package/os/rfc/handlers/index-graph.ts +3 -3
  447. package/os/rfc/handlers/lifecycle.ts +7 -2
  448. package/os/rfc/handlers/list-create.ts +7 -6
  449. package/os/rfc/handlers/shared.ts +3 -3
  450. package/os/rfc/handlers/supersede-propose.ts +8 -3
  451. package/os/rfc/handlers/validate-rules-rfc1006.test.ts +18 -6
  452. package/os/rfc/handlers/validate-rules.ts +10 -5
  453. package/os/rfc/handlers/validate.test.ts +71 -0
  454. package/os/rfc/handlers/validate.ts +6 -1
  455. package/os/rfc/rfc-create-concurrent.test.ts +11 -3
  456. package/os/rfc/rfc.module.ts +413 -374
  457. package/os/rfc/verification-evidence.ts +11 -5
  458. package/os/rfc/verification-refresh.ts +4 -3
  459. package/os/session/frontmatter-io.ts +14 -14
  460. package/os/session/handlers/archive.ts +8 -4
  461. package/os/session/handlers/metrics-aggregate.ts +34 -13
  462. package/os/session/handlers/metrics-rfc.ts +13 -8
  463. package/os/session/handlers/metrics-session.ts +7 -3
  464. package/os/session/handlers/save.ts +12 -8
  465. package/os/session/session.module.ts +6 -0
  466. package/os/spec/live-spec-list.ts +4 -4
  467. package/os/spec/live-spec-merge.ts +5 -5
  468. package/os/spec/live-spec-show.ts +3 -3
  469. package/os/spec/live-spec-validate.ts +4 -4
  470. package/os/spec/spec-materialize.ts +9 -9
  471. package/os/spec/spec-status.ts +9 -9
  472. package/os/spec/spec-validate.ts +7 -7
  473. package/os/spec/spec.module.ts +8 -0
  474. package/os/werkstatt/handlers/lock.ts +16 -16
  475. package/os/werkstatt/handlers/werkstatt-lock-recover.ts +3 -3
  476. package/os/werkstatt/handlers/werkstatt-operation-validate.ts +4 -2
  477. package/os/werkstatt/handlers/workspace-deps.ts +0 -1
  478. package/os/werkstatt/werkstatt.module.ts +8 -5
  479. package/os/workflow/handlers.ts +7 -5
  480. package/os/workflow/workflow.module.ts +45 -44
  481. package/package.json +1 -1
  482. package/profiles/forge-shell.yaml +1 -1
  483. package/profiles/godot-game.yaml +1 -1
  484. package/profiles/knowledge.yaml +1 -1
  485. package/profiles/phaser-game.yaml +1 -1
  486. package/profiles/site-workshop.yaml +1 -1
  487. package/profiles/typescript.yaml +1 -1
  488. package/skills/fo/fo-add-tests/SKILL.md +2 -2
  489. package/skills/fo/fo-architecture/SKILL.md +2 -2
  490. package/skills/fo/fo-compass-annotate/SKILL.md +2 -2
  491. package/skills/fo/fo-design-summit/SKILL.md +2 -2
  492. package/skills/fo/fo-doc-audit/SKILL.md +2 -2
  493. package/skills/fo/fo-explore/SKILL.md +2 -2
  494. package/skills/fo/fo-extract-dna/SKILL.md +2 -2
  495. package/skills/fo/fo-fix/SKILL.md +2 -2
  496. package/skills/fo/fo-handoff/SKILL.md +2 -2
  497. package/skills/fo/fo-harvest/SKILL.md +2 -2
  498. package/skills/fo/fo-idea/SKILL.md +2 -2
  499. package/skills/fo/fo-idea-audit/SKILL.md +2 -2
  500. package/skills/fo/fo-idea-create-adr/SKILL.md +3 -3
  501. package/skills/fo/fo-idea-create-rfc/SKILL.md +3 -3
  502. package/skills/fo/fo-idea-enhance/SKILL.md +2 -2
  503. package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +2 -2
  504. package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +1 -1
  505. package/skills/fo/fo-idea-implement/SKILL.md +2 -2
  506. package/skills/fo/fo-idea-plan/SKILL.md +2 -2
  507. package/skills/fo/fo-idea-status/SKILL.md +2 -2
  508. package/skills/fo/fo-knowledge-distill/SKILL.md +2 -2
  509. package/skills/fo/fo-memory-sync/SKILL.md +2 -2
  510. package/skills/fo/fo-qa/SKILL.md +2 -2
  511. package/skills/fo/fo-review/SKILL.md +2 -2
  512. package/skills/fo/fo-session-retro/SKILL.md +2 -2
  513. package/skills/fo/fo-session-save/SKILL.md +2 -2
  514. package/skills/fo/fo-spec-ingest/SKILL.md +2 -2
  515. package/skills/fo/fo-step-commit/SKILL.md +1 -1
  516. package/skills/fo/fo-triage/SKILL.md +2 -2
  517. package/skills/meta/forge-bootstrap/SKILL.md +1 -1
  518. package/skills/meta/port-to-forge/SKILL.md +1 -1
  519. package/skills/meta/skill-create/SKILL.md +1 -1
  520. package/skills/shared/grilling/SKILL.md +1 -1
  521. package/skills/shared/grilling/learned-principles.archive.md +17 -0
  522. package/skills/shared/grilling/learned-principles.md +0 -1
  523. package/skills/shared/knowledge/learned-principles.md +6 -0
  524. package/skills/shared/my-preferences/SKILL.md +1 -1
  525. package/skills/shared/windows-ai-tooling/SKILL.md +1 -1
  526. package/skills/shared/writing-great-skills/SKILL.md +1 -1
  527. package/src/cli-flags.ts +285 -0
  528. package/src/compass/contract-registry.ts +1 -1
  529. package/src/config/forge-config.ts +1 -1
  530. package/src/knowledge/__tests__/sync.test.ts +2 -7
  531. package/src/knowledge/budgets.ts +1 -1
  532. package/src/knowledge/compact.ts +1 -1
  533. package/src/knowledge/parse.ts +1 -1
  534. package/src/knowledge/sync.ts +3 -5
  535. package/src/migration-adapters/git-utils.ts +2 -2
  536. package/src/migration-adapters/ignored-files.ts +2 -2
  537. package/src/migration-adapters/node-typescript-pnpm/index.ts +1 -1
  538. package/src/migration-adapters/phaser-pnpm/index.ts +1 -1
  539. package/src/onboarding/agents-generate.ts +92 -36
  540. package/src/onboarding/create.ts +10 -10
  541. package/src/onboarding/doctor.ts +70 -55
  542. package/src/onboarding/init.ts +38 -1
  543. package/src/onboarding/invariant-engine.ts +1 -1
  544. package/src/onboarding/memory-compact.ts +5 -4
  545. package/src/onboarding/memory-scaffold.ts +1 -1
  546. package/src/onboarding/nested-agents-generate.ts +45 -4
  547. package/src/onboarding/nested-agents-templates.ts +19 -13
  548. package/src/onboarding/npm-token-check.ts +2 -2
  549. package/src/onboarding/prettierignore.ts +263 -0
  550. package/src/onboarding/profile-validate.ts +5 -4
  551. package/src/onboarding/scaffold-project.ts +38 -27
  552. package/src/onboarding/scaffold.ts +1 -1
  553. package/src/onboarding/skill-markers.ts +162 -0
  554. package/src/onboarding/templates/behavioral-layer-core.md +2 -4
  555. package/src/onboarding/upgrade.ts +285 -89
  556. package/src/onboarding/workspace-discovery.ts +1 -1
  557. package/src/pipeline-status.test.ts +1 -4
  558. package/src/pipeline-status.ts +30 -13
  559. package/src/profiles/stack-profile.ts +1 -1
  560. package/src/registry.ts +4 -4
  561. package/src/skill-schema.ts +4 -1
  562. package/src/tests/acceptance-probe-kinds.test.ts +5 -15
  563. package/src/tests/agents-generate.test.ts +28 -5
  564. package/src/tests/cli-flags.test.ts +169 -0
  565. package/src/tests/contract-registry.test.ts +12 -6
  566. package/src/tests/doctor-fix.test.ts +1 -4
  567. package/src/tests/doctor-nested-agents.test.ts +53 -1
  568. package/src/tests/editable-generated-region.test.ts +231 -0
  569. package/src/tests/file-size-lint.test.ts +8 -12
  570. package/src/tests/fixtures/agents-generate-business-before.txt +85 -56
  571. package/src/tests/markdown-table.test.ts +107 -0
  572. package/src/tests/prettierignore-manage.test.ts +134 -0
  573. package/src/tests/skill-agents-sync.test.ts +168 -0
  574. package/src/tests/skill-sync-marker.test.ts +134 -0
  575. package/src/tests/skill-validate.test.ts +12 -5
  576. package/src/tests/upgrade.test.ts +87 -41
  577. package/src/types.ts +123 -0
  578. package/src/utils/editable-region.ts +156 -0
  579. package/src/utils/fs-idempotent.ts +12 -6
  580. package/src/utils/generated-marker.ts +36 -2
  581. package/src/utils/index.ts +17 -0
  582. package/src/utils/io.ts +143 -0
  583. package/src/utils/markdown-table.ts +121 -0
  584. package/src/utils/sync-fs.ts +43 -0
  585. package/src/validators/note-frontmatter-validate.ts +1 -1
  586. package/src/validators/note-link-validate.ts +1 -1
  587. package/src/validators/note-orphan-detect.ts +1 -1
  588. package/src/validators/port-validate.ts +1 -1
  589. package/src/validators/skill-validate.ts +38 -13
  590. package/AGENTS.md +0 -502
@@ -9,154 +9,158 @@
9
9
  <item>RFC-0366: register adr.create, adr.validate, and adr.list commands.</item>
10
10
  <item>RFC-0521: migrated from packages/os/site-kernel/src/adr/ to packages/forge/os/adr/ as forgeAdrModule.</item>
11
11
  <item>RFC-0727: register adr.implement.stamp command for atomic ADR status transition.</item>
12
+ <item>RFC-1173: declare mutatesState on all kernel commands — collectDeclarationDiagnostics emits error-severity MUTATES-STATE-DECLARED, command.manifest.validate is the blocking consumer in packages.check, sweep declares the flag on every command definition (factories hardcode false for read-only check specs)</item>
12
13
  </CHANGE_SUMMARY>
13
14
  */
14
15
 
15
16
  import type { ForgeModule } from "../../src/forge-module.ts";
16
17
 
17
18
  export async function createForgeAdrModule(): Promise<ForgeModule> {
18
- const { runAdrList, runAdrCreate } = await import("./handlers/list-create.ts");
19
- const { runAdrValidate } = await import("./handlers/validate.ts");
20
- const { runAdrArchive } = await import("./handlers/archive.ts");
21
- const { runAdrImplementStamp } = await import("./handlers/implement-stamp.ts");
19
+ const { runAdrList, runAdrCreate } = await import("./handlers/list-create.ts");
20
+ const { runAdrValidate } = await import("./handlers/validate.ts");
21
+ const { runAdrArchive } = await import("./handlers/archive.ts");
22
+ const { runAdrImplementStamp } = await import("./handlers/implement-stamp.ts");
22
23
  return {
23
- name: "forge-adr",
24
- version: "0.1.0",
25
- runtime: "autonomous",
24
+ name: "forge-adr",
25
+ version: "0.1.0",
26
+ runtime: "autonomous",
26
27
 
27
28
  declarations: [],
28
- commands: [
29
- {
30
- name: "adr.list",
31
- description:
32
- "List all ADRs. Filter with --status, --scope, --decider flags. " +
33
- "Use --json for machine-readable output. " +
34
- "Parses frontmatter on the fly — no index file needed.",
35
- scope: "workspace",
36
- flags: {
37
- status: {
38
- kind: "string",
39
- description: "Filter by ADR status (e.g. proposed, accepted, superseded).",
29
+ commands: [
30
+ {
31
+ name: "adr.list",
32
+ mutatesState: false,
33
+ description:
34
+ "List all ADRs. Filter with --status, --scope, --decider flags. " +
35
+ "Use --json for machine-readable output. " +
36
+ "Parses frontmatter on the fly — no index file needed.",
37
+ scope: "workspace",
38
+ flags: {
39
+ status: {
40
+ kind: "string",
41
+ description: "Filter by ADR status (e.g. proposed, accepted, superseded).",
42
+ },
43
+ scope: {
44
+ kind: "string",
45
+ description: "Filter by ADR scope (package, app, workspace).",
46
+ },
47
+ decider: { kind: "string", description: "Filter by decider string." },
40
48
  },
41
- scope: {
42
- kind: "string",
43
- description: "Filter by ADR scope (package, app, workspace).",
44
- },
45
- decider: { kind: "string", description: "Filter by decider string." },
49
+ reads: ["docs/adrs/**/*.md"],
50
+ execute: runAdrList,
46
51
  },
47
- reads: ["docs/adrs/**/*.md"],
48
- execute: runAdrList,
49
- },
50
- {
51
- name: "adr.create",
52
- description:
53
- "Create a new ADR draft from the template. " +
54
- 'Pass --title "Short title" (required). ' +
55
- "Optional: --scope, --decider, --status, --related. " +
56
- "Always creates status: proposed unless overridden. " +
57
- "AI agents are allowed to use this command.",
58
- scope: "workspace",
59
- mutatesState: true,
60
- writes: ["docs/adrs/adr-*.md"],
61
- reads: ["docs/adrs/**/*.md"],
62
- cacheable: false,
63
- flags: {
64
- title: { kind: "string", required: true, description: "Short imperative ADR title." },
65
- scope: {
66
- kind: "string",
67
- default: "package",
68
- description: "ADR scope: package | app | workspace.",
69
- },
70
- decider: {
71
- kind: "string",
72
- default: "architecture",
73
- description: "ADR decider, e.g. architecture or human:<handle>.",
74
- },
75
- status: {
76
- kind: "string",
77
- default: "proposed",
78
- description: "ADR status: proposed | accepted | superseded | rejected.",
52
+ {
53
+ name: "adr.create",
54
+ description:
55
+ "Create a new ADR draft from the template. " +
56
+ 'Pass --title "Short title" (required). ' +
57
+ "Optional: --scope, --decider, --status, --related. " +
58
+ "Always creates status: proposed unless overridden. " +
59
+ "AI agents are allowed to use this command.",
60
+ scope: "workspace",
61
+ mutatesState: true,
62
+ writes: ["docs/adrs/adr-*.md"],
63
+ generates: [],
64
+ reads: ["docs/adrs/**/*.md"],
65
+ cacheable: false,
66
+ flags: {
67
+ title: { kind: "string", required: true, description: "Short imperative ADR title." },
68
+ scope: {
69
+ kind: "string",
70
+ default: "package",
71
+ description: "ADR scope: package | app | workspace.",
72
+ },
73
+ decider: {
74
+ kind: "string",
75
+ default: "architecture",
76
+ description: "ADR decider, e.g. architecture or human:<handle>.",
77
+ },
78
+ status: {
79
+ kind: "string",
80
+ default: "proposed",
81
+ description: "ADR status: proposed | accepted | superseded | rejected.",
82
+ },
83
+ related: {
84
+ kind: "string",
85
+ description: "Comma-separated list of related RFC/ADR ids (e.g. RFC-0365,RFC-0001).",
86
+ },
79
87
  },
80
- related: {
81
- kind: "string",
82
- description: "Comma-separated list of related RFC/ADR ids (e.g. RFC-0365,RFC-0001).",
83
- },
84
- },
85
- execute: runAdrCreate,
86
- },
87
- {
88
- name: "adr.validate",
89
- contract: "adr",
90
- rules: [],
91
- description:
92
- "Validate ADR frontmatter schema, required markdown sections, " +
93
- "referential integrity (supersedes/supersededBy), and id/filename consistency. " +
94
- "Pass --id to validate a single file, or run without arguments for all.",
95
- scope: "workspace",
96
- flags: {
97
- id: { kind: "string", description: "Target a single ADR by id (e.g. ADR-0003)." },
88
+ execute: runAdrCreate,
98
89
  },
99
- reads: ["docs/adrs/**/*.md"],
100
- execute: runAdrValidate,
101
- },
102
- {
103
- name: "adr.archive",
104
- description:
105
- "Move terminal-status ADR files (implemented, rejected, superseded) into " +
106
- "docs/adrs/archive/<status>/ subdirectories. Bidirectional: moves non-terminal " +
107
- "files found in subdirectories back to root. Use --dry-run to preview. " +
108
- "Use --status to filter to a single terminal status. " +
109
- "Prefer the docs.archive umbrella command unless you need to archive only ADRs.",
110
- scope: "workspace",
111
- mutatesState: true,
112
- writes: ["docs/adrs/*.md", "docs/adrs/archive/**"],
113
- reads: ["docs/adrs/**/*.md"],
114
- cacheable: false,
115
- flags: {
116
- "dry-run": {
117
- kind: "boolean",
118
- description: "Preview what would be moved without touching the filesystem.",
119
- },
120
- status: {
121
- kind: "string",
122
- description: "Filter to a single terminal status (implemented, rejected, superseded).",
90
+ {
91
+ name: "adr.validate",
92
+ mutatesState: false,
93
+ contract: "adr",
94
+ rules: [],
95
+ description:
96
+ "Validate ADR frontmatter schema, required markdown sections, " +
97
+ "referential integrity (supersedes/supersededBy), and id/filename consistency. " +
98
+ "Pass --id to validate a single file, or run without arguments for all.",
99
+ scope: "workspace",
100
+ flags: {
101
+ id: { kind: "string", description: "Target a single ADR by id (e.g. ADR-0003)." },
123
102
  },
103
+ reads: ["docs/adrs/**/*.md"],
104
+ execute: runAdrValidate,
124
105
  },
125
- execute: runAdrArchive,
126
- },
127
- {
128
- name: "adr.implement.stamp",
129
- description:
130
- "Atomically transition an ADR from accepted/proposed to implemented. " +
131
- "Validates preconditions (status, implementation commit, file cleanliness, " +
132
- "concurrent safety) and mutates frontmatter in one atomic write. " +
133
- "Use --dry-run to preview without mutating. Required flags: `--id`, `--implementation-commit`.",
134
- scope: "workspace",
135
- mutatesState: true,
136
- writes: ["docs/adrs/*.md"],
137
- reads: ["docs/adrs/**/*.md"],
138
- cacheable: false,
139
- flags: {
140
- id: {
141
- kind: "string",
142
- required: true,
143
- description: "Target ADR id (e.g. ADR-0003).",
144
- },
145
- "implementation-commit": {
146
- kind: "string",
147
- required: true,
148
- description: "SHA of the implementation commit.",
106
+ {
107
+ name: "adr.archive",
108
+ description:
109
+ "Move terminal-status ADR files (implemented, rejected, superseded) into " +
110
+ "docs/adrs/archive/<status>/ subdirectories. Bidirectional: moves non-terminal " +
111
+ "files found in subdirectories back to root. Use --dry-run to preview. " +
112
+ "Use --status to filter to a single terminal status. " +
113
+ "Prefer the docs.archive umbrella command unless you need to archive only ADRs.",
114
+ scope: "workspace",
115
+ mutatesState: true,
116
+ writes: ["docs/adrs/*.md", "docs/adrs/archive/**"],
117
+ generates: [],
118
+ reads: ["docs/adrs/**/*.md"],
119
+ cacheable: false,
120
+ flags: {
121
+ "dry-run": {
122
+ kind: "boolean",
123
+ description: "Preview what would be moved without touching the filesystem.",
124
+ },
125
+ status: {
126
+ kind: "string",
127
+ description: "Filter to a single terminal status (implemented, rejected, superseded).",
128
+ },
149
129
  },
150
- "dry-run": {
151
- kind: "boolean",
152
- description: "Preview without mutating the ADR file.",
130
+ execute: runAdrArchive,
131
+ },
132
+ {
133
+ name: "adr.implement.stamp",
134
+ description:
135
+ "Atomically transition an ADR from accepted/proposed to implemented. " +
136
+ "Validates preconditions (status, implementation commit, file cleanliness, " +
137
+ "concurrent safety) and mutates frontmatter in one atomic write. " +
138
+ "Use --dry-run to preview without mutating. Required flags: `--id`, `--implementation-commit`.",
139
+ scope: "workspace",
140
+ mutatesState: true,
141
+ writes: ["docs/adrs/*.md"],
142
+ generates: [],
143
+ reads: ["docs/adrs/**/*.md"],
144
+ cacheable: false,
145
+ flags: {
146
+ id: {
147
+ kind: "string",
148
+ required: true,
149
+ description: "Target ADR id (e.g. ADR-0003).",
150
+ },
151
+ "implementation-commit": {
152
+ kind: "string",
153
+ required: true,
154
+ description: "SHA of the implementation commit.",
155
+ },
156
+ "dry-run": {
157
+ kind: "boolean",
158
+ description: "Preview without mutating the ADR file.",
159
+ },
153
160
  },
161
+ execute: runAdrImplementStamp,
154
162
  },
155
- execute: runAdrImplementStamp,
156
- }
157
- ],
158
- pipelines: [
159
-
160
- ]};
163
+ ],
164
+ pipelines: [],
165
+ };
161
166
  }
162
- ;
@@ -14,7 +14,7 @@ without validating the shape.
14
14
  </CHANGE_SUMMARY>
15
15
  */
16
16
 
17
- import fs from "node:fs/promises";
17
+ import { ambientIo as fs } from "../../src/utils/io.ts";
18
18
  import path from "node:path";
19
19
  import YAML from "yaml";
20
20
 
@@ -39,13 +39,13 @@ export async function listAdrFiles(adrDirPath: string): Promise<string[]> {
39
39
 
40
40
  async function scanDir(dirPath: string, relativePrefix: string): Promise<void> {
41
41
  try {
42
- const entries = await fs.readdir(dirPath, { withFileTypes: true });
42
+ const entries = await fs.readdir(dirPath);
43
43
  for (const entry of entries) {
44
44
  const relativePath = relativePrefix ? `${relativePrefix}/${entry.name}` : entry.name;
45
- if (entry.isDirectory()) {
45
+ if (entry.isDirectory) {
46
46
  await scanDir(path.join(dirPath, entry.name), relativePath);
47
47
  } else if (
48
- entry.isFile() &&
48
+ entry.isFile &&
49
49
  entry.name.endsWith(".md") &&
50
50
  !entry.name.startsWith("adr-0000") &&
51
51
  entry.name !== "README.md"
@@ -72,7 +72,7 @@ export async function readAndParseAdr(
72
72
  ): Promise<{ fileName: string; parsed: ParsedAdr } | undefined> {
73
73
  try {
74
74
  const filePath = path.join(adrDirPath, fileName);
75
- const content = await fs.readFile(filePath, "utf-8");
75
+ const content = await fs.readFile(filePath);
76
76
  return { fileName, parsed: parseAdrFile(content) };
77
77
  } catch {
78
78
  return undefined;
@@ -17,7 +17,7 @@ in subdirectories back to the root.
17
17
  </CHANGE_SUMMARY>
18
18
  */
19
19
 
20
- import fs from "node:fs/promises";
20
+ import { ambientIo as fs } from "../../../src/utils/io.ts";
21
21
  import path from "node:path";
22
22
  import { listAdrFiles, readAndParseAdr } from "../frontmatter-io.ts";
23
23
  import type {
@@ -129,7 +129,9 @@ export async function runAdrArchive(
129
129
  }
130
130
 
131
131
  try {
132
- await fs.access(targetPath);
132
+ await fs.exists(targetPath).then((ok) => {
133
+ if (!ok) throw Object.assign(new Error("ENOENT"), { code: "ENOENT" });
134
+ });
133
135
  skipped.push({ id, file: relFile, reason: "destination exists" });
134
136
  continue;
135
137
  } catch {
@@ -137,7 +139,7 @@ export async function runAdrArchive(
137
139
  }
138
140
 
139
141
  if (!dryRun) {
140
- await fs.mkdir(targetDir, { recursive: true });
142
+ await fs.mkdir(targetDir);
141
143
  try {
142
144
  await fs.rename(path.join(adrDirPath, fileName), targetPath);
143
145
  } catch (err) {
@@ -176,7 +178,9 @@ export async function runAdrArchive(
176
178
  }
177
179
 
178
180
  try {
179
- await fs.access(targetPath);
181
+ await fs.exists(targetPath).then((ok) => {
182
+ if (!ok) throw Object.assign(new Error("ENOENT"), { code: "ENOENT" });
183
+ });
180
184
  skipped.push({ id, file: relFile, reason: "destination exists" });
181
185
  continue;
182
186
  } catch {
@@ -13,12 +13,12 @@ and atomically mutates ADR frontmatter.
13
13
  </MODULE_CONTRACT>
14
14
  <CHANGE_SUMMARY>
15
15
  <item>RFC-0727: initial implementation — mirrors rfc.implement.stamp for ADRs.</item>
16
- <item>fix: add ADR-IMP-02 acceptance-criteria gate — block stamping post-cutoff ADRs with unchecked or evidence-less criteria (parity with rfc.implement.stamp RFC-IMP-02; prevents late adr.validate AV-17 failures).</item>
17
16
  </CHANGE_SUMMARY>
18
17
  */
19
18
 
20
- import { execFile } from "node:child_process";
21
- import { readFile, unlink, mkdir } from "node:fs/promises";
19
+ import { execFile, writeFileSync } from "../../../src/utils/sync-fs.ts";
20
+ import { ambientIo, resolveIo } from "../../../src/utils/io.ts";
21
+
22
22
  import { join, dirname } from "node:path";
23
23
 
24
24
  import { writeFileAtomic } from "../../../src/utils/fs-atomic.ts";
@@ -27,6 +27,10 @@ import { listAdrFiles, readAndParseAdr, adrFileMatchesId } from "../frontmatter-
27
27
  import { evaluateAcceptanceCriteria } from "../../rfc/handlers/validate-rules.ts";
28
28
  import { ADR_DIR, ADR_ACCEPTANCE_CRITERIA_CUTOFF } from "../types.ts";
29
29
  import type { AdrStatus, AdrImplementStampViolation, AdrImplementStampResult } from "../types.ts";
30
+
31
+ // Ambient default for helper fns without a context param — handlers override
32
+ // with `const io = resolveIo(context.io)` inside their own scope.
33
+ const io = ambientIo;
30
34
  import type {
31
35
  ForgeCommandInput,
32
36
  ForgeCommandResult,
@@ -98,15 +102,14 @@ async function acquireAdrLock(
98
102
  ): Promise<{ acquired: boolean; lockPath: string }> {
99
103
  const lockPath = lockFilePath(workspaceRoot, adrId);
100
104
  const lockDir = dirname(lockPath);
101
- await mkdir(lockDir, { recursive: true });
105
+ await io.mkdir(lockDir);
102
106
 
103
- const { open } = await import("node:fs/promises");
104
107
  try {
105
- const handle = await open(lockPath, "wx");
106
- await handle.writeFile(
108
+ writeFileSync(
109
+ lockPath,
107
110
  JSON.stringify({ pid: process.pid, acquiredAt: new Date().toISOString() }),
111
+ { flag: "wx" },
108
112
  );
109
- await handle.close();
110
113
  return { acquired: true, lockPath };
111
114
  } catch {
112
115
  return { acquired: false, lockPath };
@@ -115,7 +118,7 @@ async function acquireAdrLock(
115
118
 
116
119
  async function releaseAdrLock(lockPath: string): Promise<void> {
117
120
  try {
118
- await unlink(lockPath);
121
+ await io.rm(lockPath);
119
122
  } catch {
120
123
  // Lock file already removed — safe
121
124
  }
@@ -157,6 +160,7 @@ export async function runAdrImplementStamp(
157
160
  input: ForgeCommandInput,
158
161
  context: ForgeRuntimeContext,
159
162
  ): Promise<ForgeCommandResult<AdrImplementStampResult>> {
163
+ const io = resolveIo(context.io);
160
164
  const { workspaceRoot, logger, outputFormat, dryRun } = context;
161
165
  const adrDirPath = join(workspaceRoot, ADR_DIR);
162
166
 
@@ -276,7 +280,7 @@ export async function runAdrImplementStamp(
276
280
  try {
277
281
  // ── Atomic mutation ──────────────────────────────────────────────────────
278
282
  const adrFilePath = join(adrDirPath, targetFile);
279
- const adrSource = await readFile(adrFilePath, "utf-8");
283
+ const adrSource = await io.readFile(adrFilePath);
280
284
 
281
285
  const today = toIsoDate(new Date());
282
286
  const stampedAt = new Date().toISOString();
@@ -14,8 +14,8 @@ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PU
14
14
  </CHANGE_SUMMARY>
15
15
  */
16
16
 
17
- import fs from "node:fs/promises";
18
- import { existsSync } from "node:fs";
17
+ import { ambientIo as fs } from "../../../src/utils/io.ts";
18
+ import { existsSync } from "../../../src/utils/sync-fs.ts";
19
19
  import path from "node:path";
20
20
  import { fileURLToPath } from "node:url";
21
21
  import { toKebabCase } from "../../../src/utils/string-utils.ts";
@@ -152,7 +152,7 @@ export async function runAdrCreate(
152
152
  const templatePath = resolveAdrTemplate(workspaceRoot);
153
153
  let templateContent: string;
154
154
  try {
155
- templateContent = await fs.readFile(templatePath, "utf-8");
155
+ templateContent = await fs.readFile(templatePath);
156
156
  } catch {
157
157
  throw new Error(
158
158
  `ADR template not found at ${templatePath}. Ensure docs/adrs/ contains the template.`,
@@ -190,13 +190,13 @@ export async function runAdrCreate(
190
190
  }
191
191
 
192
192
  try {
193
- await fs.mkdir(adrDirPath, { recursive: true });
193
+ await fs.mkdir(adrDirPath);
194
194
  } catch {
195
195
  // ignore
196
196
  }
197
197
 
198
198
  const targetPath = path.join(adrDirPath, fileName);
199
- await fs.writeFile(targetPath, content, "utf-8");
199
+ await fs.writeFile(targetPath, content);
200
200
 
201
201
  const relativeFile = path.join(ADR_DIR, fileName);
202
202
 
@@ -19,7 +19,7 @@ Sweep batch 4: 73 Compass headers on headerless engine files (certification, com
19
19
  */
20
20
 
21
21
  import path from "node:path";
22
- import { execFile } from "node:child_process";
22
+ import { execFile } from "../../../src/utils/sync-fs.ts";
23
23
  import {
24
24
  listAdrFiles,
25
25
  readAndParseAdr,
@@ -13,42 +13,41 @@
13
13
  import type { ForgeModule } from "../../src/forge-module.ts";
14
14
 
15
15
  export async function createForgeAuditModule(): Promise<ForgeModule> {
16
- const { runAuditArchive } = await import("./handlers/archive.ts");
16
+ const { runAuditArchive } = await import("./handlers/archive.ts");
17
17
  return {
18
- name: "forge-audit",
19
- version: "0.1.0",
20
- runtime: "autonomous",
18
+ name: "forge-audit",
19
+ version: "0.1.0",
20
+ runtime: "autonomous",
21
21
  declarations: [],
22
- commands: [
23
- {
24
- name: "audit.archive",
25
- description:
26
- "Move audit files whose parent RFC has terminal status " +
27
- "(implemented, rejected, superseded) into docs/audits/archive/<status>/ " +
28
- "subdirectories. Bidirectional: moves non-terminal files found in " +
29
- "subdirectories back to root. Use --dry-run to preview. " +
30
- "Use --status to filter to a single terminal status. " +
31
- "Prefer the docs.archive umbrella command unless you need to archive only audits.",
32
- scope: "workspace",
33
- mutatesState: true,
34
- writes: ["docs/audits/*.md", "docs/audits/archive/**"],
35
- reads: ["docs/audits/**/*.md", "docs/rfcs/**/*.md"],
36
- cacheable: false,
37
- flags: {
38
- "dry-run": {
39
- kind: "boolean",
40
- description: "Preview what would be moved without touching the filesystem.",
41
- },
42
- status: {
43
- kind: "string",
44
- description: "Filter to a single terminal status (implemented, rejected, superseded).",
22
+ commands: [
23
+ {
24
+ name: "audit.archive",
25
+ description:
26
+ "Move audit files whose parent RFC has terminal status " +
27
+ "(implemented, rejected, superseded) into docs/audits/archive/<status>/ " +
28
+ "subdirectories. Bidirectional: moves non-terminal files found in " +
29
+ "subdirectories back to root. Use --dry-run to preview. " +
30
+ "Use --status to filter to a single terminal status. " +
31
+ "Prefer the docs.archive umbrella command unless you need to archive only audits.",
32
+ scope: "workspace",
33
+ mutatesState: true,
34
+ writes: ["docs/audits/*.md", "docs/audits/archive/**"],
35
+ generates: [],
36
+ reads: ["docs/audits/**/*.md", "docs/rfcs/**/*.md"],
37
+ cacheable: false,
38
+ flags: {
39
+ "dry-run": {
40
+ kind: "boolean",
41
+ description: "Preview what would be moved without touching the filesystem.",
42
+ },
43
+ status: {
44
+ kind: "string",
45
+ description: "Filter to a single terminal status (implemented, rejected, superseded).",
46
+ },
45
47
  },
48
+ execute: runAuditArchive,
46
49
  },
47
- execute: runAuditArchive,
48
- }
49
- ],
50
- pipelines: [
51
-
52
- ]};
50
+ ],
51
+ pipelines: [],
52
+ };
53
53
  }
54
- ;
@@ -15,7 +15,7 @@ are silently excluded.
15
15
  </CHANGE_SUMMARY>
16
16
  */
17
17
 
18
- import fs from "node:fs/promises";
18
+ import { ambientIo as fs } from "../../src/utils/io.ts";
19
19
  import path from "node:path";
20
20
  import YAML from "yaml";
21
21
  import { AUDIT_RFC_FILE_PATTERN } from "./types.ts";
@@ -41,13 +41,13 @@ export async function listAuditFiles(auditDirPath: string): Promise<string[]> {
41
41
 
42
42
  async function scanDir(dirPath: string, relativePrefix: string): Promise<void> {
43
43
  try {
44
- const entries = await fs.readdir(dirPath, { withFileTypes: true });
44
+ const entries = await fs.readdir(dirPath);
45
45
  for (const entry of entries) {
46
46
  const relativePath = relativePrefix ? `${relativePrefix}/${entry.name}` : entry.name;
47
- if (entry.isDirectory()) {
47
+ if (entry.isDirectory) {
48
48
  await scanDir(path.join(dirPath, entry.name), relativePath);
49
49
  } else if (
50
- entry.isFile() &&
50
+ entry.isFile &&
51
51
  entry.name.endsWith(".md") &&
52
52
  !entry.name.startsWith("audit-0000") &&
53
53
  entry.name !== "README.md" &&
@@ -71,7 +71,7 @@ export async function readAndParseAudit(
71
71
  ): Promise<{ fileName: string; parsed: ParsedAudit } | undefined> {
72
72
  try {
73
73
  const filePath = path.join(auditDirPath, fileName);
74
- const content = await fs.readFile(filePath, "utf-8");
74
+ const content = await fs.readFile(filePath);
75
75
  return { fileName, parsed: parseAuditFile(content) };
76
76
  } catch {
77
77
  return undefined;
@@ -17,7 +17,7 @@ files (not matching audit-rfc-XXXX-*) are silently excluded.
17
17
  </CHANGE_SUMMARY>
18
18
  */
19
19
 
20
- import fs from "node:fs/promises";
20
+ import { ambientIo as fs } from "../../../src/utils/io.ts";
21
21
  import path from "node:path";
22
22
  import { listAuditFiles, extractRfcIdFromAuditFile } from "../frontmatter-io.ts";
23
23
  import { loadRfcStatusMap } from "../../rfc/frontmatter-io.ts";
@@ -116,7 +116,9 @@ export async function runAuditArchive(
116
116
  }
117
117
 
118
118
  try {
119
- await fs.access(targetPath);
119
+ await fs.exists(targetPath).then((ok) => {
120
+ if (!ok) throw Object.assign(new Error("ENOENT"), { code: "ENOENT" });
121
+ });
120
122
  skipped.push({ id: rfcId, file: relFile, reason: "destination exists" });
121
123
  continue;
122
124
  } catch {
@@ -124,7 +126,7 @@ export async function runAuditArchive(
124
126
  }
125
127
 
126
128
  if (!dryRun) {
127
- await fs.mkdir(targetDir, { recursive: true });
129
+ await fs.mkdir(targetDir);
128
130
  try {
129
131
  await fs.rename(path.join(auditDirPath, fileName), targetPath);
130
132
  } catch (err) {
@@ -167,7 +169,9 @@ export async function runAuditArchive(
167
169
  }
168
170
 
169
171
  try {
170
- await fs.access(targetPath);
172
+ await fs.exists(targetPath).then((ok) => {
173
+ if (!ok) throw Object.assign(new Error("ENOENT"), { code: "ENOENT" });
174
+ });
171
175
  skipped.push({ id: rfcId, file: relFile, reason: "destination exists" });
172
176
  continue;
173
177
  } catch {