@warpgogol/forge 5.2.3 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/AGENTS.md +34 -2
  2. package/README.md +1 -1
  3. package/README.uk.md +8 -8
  4. package/bin/cli.ts +1 -0
  5. package/dist/bin/cli.js +1 -0
  6. package/dist/bin/cli.js.map +1 -1
  7. package/dist/os/adr/adr.module.d.ts.map +1 -1
  8. package/dist/os/adr/adr.module.js +8 -3
  9. package/dist/os/adr/adr.module.js.map +1 -1
  10. package/dist/os/adr/frontmatter-io.js +5 -5
  11. package/dist/os/adr/frontmatter-io.js.map +1 -1
  12. package/dist/os/adr/handlers/archive.d.ts.map +1 -1
  13. package/dist/os/adr/handlers/archive.js +10 -4
  14. package/dist/os/adr/handlers/archive.js.map +1 -1
  15. package/dist/os/adr/handlers/implement-stamp.d.ts.map +1 -1
  16. package/dist/os/adr/handlers/implement-stamp.js +10 -9
  17. package/dist/os/adr/handlers/implement-stamp.js.map +1 -1
  18. package/dist/os/adr/handlers/list-create.js +5 -5
  19. package/dist/os/adr/handlers/list-create.js.map +1 -1
  20. package/dist/os/adr/handlers/validate.js +1 -1
  21. package/dist/os/adr/handlers/validate.js.map +1 -1
  22. package/dist/os/audit/audit.module.js +3 -3
  23. package/dist/os/audit/audit.module.js.map +1 -1
  24. package/dist/os/audit/frontmatter-io.js +5 -5
  25. package/dist/os/audit/frontmatter-io.js.map +1 -1
  26. package/dist/os/audit/handlers/archive.d.ts.map +1 -1
  27. package/dist/os/audit/handlers/archive.js +10 -4
  28. package/dist/os/audit/handlers/archive.js.map +1 -1
  29. package/dist/os/compass/compass.module.d.ts.map +1 -1
  30. package/dist/os/compass/compass.module.js +17 -1
  31. package/dist/os/compass/compass.module.js.map +1 -1
  32. package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
  33. package/dist/os/compass/handlers/compass-audit-handler.js +12 -5
  34. package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
  35. package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -1
  36. package/dist/os/compass/handlers/compass-change-summary-handler.js +3 -2
  37. package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -1
  38. package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
  39. package/dist/os/compass/handlers/compass-inventory-handler.js +6 -4
  40. package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
  41. package/dist/os/compass/handlers/compass-inventory.d.ts.map +1 -1
  42. package/dist/os/compass/handlers/compass-inventory.js +10 -8
  43. package/dist/os/compass/handlers/compass-inventory.js.map +1 -1
  44. package/dist/os/compass/handlers/compass-migrate-handler.js +1 -1
  45. package/dist/os/compass/handlers/compass-migrate-handler.js.map +1 -1
  46. package/dist/os/compass/handlers/compass-migrate.d.ts.map +1 -1
  47. package/dist/os/compass/handlers/compass-migrate.js +6 -3
  48. package/dist/os/compass/handlers/compass-migrate.js.map +1 -1
  49. package/dist/os/compass/handlers/git-revision.d.ts.map +1 -1
  50. package/dist/os/compass/handlers/git-revision.js +9 -6
  51. package/dist/os/compass/handlers/git-revision.js.map +1 -1
  52. package/dist/os/compass/handlers/resolve-scan-root.js +1 -1
  53. package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -1
  54. package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
  55. package/dist/os/compass/handlers/summary-record.js +8 -4
  56. package/dist/os/compass/handlers/summary-record.js.map +1 -1
  57. package/dist/os/core/core.module.d.ts.map +1 -1
  58. package/dist/os/core/core.module.js +57 -4
  59. package/dist/os/core/core.module.js.map +1 -1
  60. package/dist/os/core/handlers/assets-helpers.d.ts.map +1 -1
  61. package/dist/os/core/handlers/assets-helpers.js +6 -3
  62. package/dist/os/core/handlers/assets-helpers.js.map +1 -1
  63. package/dist/os/core/handlers/build.js +1 -1
  64. package/dist/os/core/handlers/build.js.map +1 -1
  65. package/dist/os/core/handlers/determinism-check.d.ts.map +1 -1
  66. package/dist/os/core/handlers/determinism-check.js +10 -6
  67. package/dist/os/core/handlers/determinism-check.js.map +1 -1
  68. package/dist/os/core/handlers/dev.js +1 -1
  69. package/dist/os/core/handlers/dev.js.map +1 -1
  70. package/dist/os/core/handlers/file-size-lint.d.ts.map +1 -1
  71. package/dist/os/core/handlers/file-size-lint.js +11 -7
  72. package/dist/os/core/handlers/file-size-lint.js.map +1 -1
  73. package/dist/os/core/handlers/forge-autonomy-validate.d.ts.map +1 -1
  74. package/dist/os/core/handlers/forge-autonomy-validate.js +9 -5
  75. package/dist/os/core/handlers/forge-autonomy-validate.js.map +1 -1
  76. package/dist/os/core/handlers/knowledge-compact.js +1 -1
  77. package/dist/os/core/handlers/knowledge-compact.js.map +1 -1
  78. package/dist/os/core/handlers/package-health.js +1 -1
  79. package/dist/os/core/handlers/package-health.js.map +1 -1
  80. package/dist/os/core/handlers/pinned-check.js +2 -2
  81. package/dist/os/core/handlers/pinned-check.js.map +1 -1
  82. package/dist/os/core/handlers/pinned-init.d.ts.map +1 -1
  83. package/dist/os/core/handlers/pinned-init.js +9 -8
  84. package/dist/os/core/handlers/pinned-init.js.map +1 -1
  85. package/dist/os/core/handlers/pinned-validate.js +3 -3
  86. package/dist/os/core/handlers/pinned-validate.js.map +1 -1
  87. package/dist/os/core/handlers/profile-resolve.js +1 -1
  88. package/dist/os/core/handlers/profile-resolve.js.map +1 -1
  89. package/dist/os/core/handlers/public-surface.js +1 -1
  90. package/dist/os/core/handlers/public-surface.js.map +1 -1
  91. package/dist/os/core/handlers/release-prepare.d.ts.map +1 -1
  92. package/dist/os/core/handlers/release-prepare.js +10 -6
  93. package/dist/os/core/handlers/release-prepare.js.map +1 -1
  94. package/dist/os/core/handlers/release-publish.js +6 -6
  95. package/dist/os/core/handlers/release-publish.js.map +1 -1
  96. package/dist/os/core/handlers/validate.js +1 -1
  97. package/dist/os/core/handlers/validate.js.map +1 -1
  98. package/dist/os/exploration/exploration.module.d.ts.map +1 -1
  99. package/dist/os/exploration/exploration.module.js +1 -0
  100. package/dist/os/exploration/exploration.module.js.map +1 -1
  101. package/dist/os/exploration/frontmatter-io.js +4 -4
  102. package/dist/os/exploration/frontmatter-io.js.map +1 -1
  103. package/dist/os/exploration/handlers/archive.js +3 -3
  104. package/dist/os/exploration/handlers/archive.js.map +1 -1
  105. package/dist/os/mission/handlers/archive.d.ts.map +1 -1
  106. package/dist/os/mission/handlers/archive.js +22 -19
  107. package/dist/os/mission/handlers/archive.js.map +1 -1
  108. package/dist/os/mission/mission.module.js +3 -3
  109. package/dist/os/mission/mission.module.js.map +1 -1
  110. package/dist/os/naming/naming-convention.d.ts.map +1 -1
  111. package/dist/os/naming/naming-convention.js +7 -3
  112. package/dist/os/naming/naming-convention.js.map +1 -1
  113. package/dist/os/naming/naming.module.d.ts.map +1 -1
  114. package/dist/os/naming/naming.module.js +4 -3
  115. package/dist/os/naming/naming.module.js.map +1 -1
  116. package/dist/os/notes/notes.module.d.ts.map +1 -1
  117. package/dist/os/notes/notes.module.js +6 -3
  118. package/dist/os/notes/notes.module.js.map +1 -1
  119. package/dist/os/plan/frontmatter-io.js +5 -5
  120. package/dist/os/plan/frontmatter-io.js.map +1 -1
  121. package/dist/os/plan/handlers/archive.d.ts.map +1 -1
  122. package/dist/os/plan/handlers/archive.js +10 -4
  123. package/dist/os/plan/handlers/archive.js.map +1 -1
  124. package/dist/os/plan/plan.module.js +3 -3
  125. package/dist/os/plan/plan.module.js.map +1 -1
  126. package/dist/os/plugin/plugin.module.d.ts.map +1 -1
  127. package/dist/os/plugin/plugin.module.js +6 -3
  128. package/dist/os/plugin/plugin.module.js.map +1 -1
  129. package/dist/os/program/discovery.js +2 -2
  130. package/dist/os/program/discovery.js.map +1 -1
  131. package/dist/os/program/handlers/complete.js +1 -1
  132. package/dist/os/program/handlers/complete.js.map +1 -1
  133. package/dist/os/program/handlers/lease.js +1 -1
  134. package/dist/os/program/handlers/lease.js.map +1 -1
  135. package/dist/os/program/handlers/seal.js +1 -1
  136. package/dist/os/program/handlers/seal.js.map +1 -1
  137. package/dist/os/program/lease.js +1 -1
  138. package/dist/os/program/lease.js.map +1 -1
  139. package/dist/os/program/program.module.d.ts.map +1 -1
  140. package/dist/os/program/program.module.js +9 -3
  141. package/dist/os/program/program.module.js.map +1 -1
  142. package/dist/os/queue/index.js +1 -1
  143. package/dist/os/queue/manifest.d.ts.map +1 -1
  144. package/dist/os/queue/manifest.js +4 -8
  145. package/dist/os/queue/manifest.js.map +1 -1
  146. package/dist/os/rfc/acceptance.d.ts.map +1 -1
  147. package/dist/os/rfc/acceptance.js +10 -6
  148. package/dist/os/rfc/acceptance.js.map +1 -1
  149. package/dist/os/rfc/decision-log.d.ts.map +1 -1
  150. package/dist/os/rfc/decision-log.js +4 -3
  151. package/dist/os/rfc/decision-log.js.map +1 -1
  152. package/dist/os/rfc/dna-trace.d.ts.map +1 -1
  153. package/dist/os/rfc/dna-trace.js +7 -2
  154. package/dist/os/rfc/dna-trace.js.map +1 -1
  155. package/dist/os/rfc/frontmatter-io.js +5 -5
  156. package/dist/os/rfc/frontmatter-io.js.map +1 -1
  157. package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
  158. package/dist/os/rfc/handlers/archive.js +11 -5
  159. package/dist/os/rfc/handlers/archive.js.map +1 -1
  160. package/dist/os/rfc/handlers/check.d.ts.map +1 -1
  161. package/dist/os/rfc/handlers/check.js +6 -3
  162. package/dist/os/rfc/handlers/check.js.map +1 -1
  163. package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
  164. package/dist/os/rfc/handlers/implement-stamp.js +11 -10
  165. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
  166. package/dist/os/rfc/handlers/index-graph.js +3 -3
  167. package/dist/os/rfc/handlers/index-graph.js.map +1 -1
  168. package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
  169. package/dist/os/rfc/handlers/lifecycle.js +6 -2
  170. package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
  171. package/dist/os/rfc/handlers/list-create.d.ts.map +1 -1
  172. package/dist/os/rfc/handlers/list-create.js +7 -6
  173. package/dist/os/rfc/handlers/list-create.js.map +1 -1
  174. package/dist/os/rfc/handlers/shared.js +3 -3
  175. package/dist/os/rfc/handlers/shared.js.map +1 -1
  176. package/dist/os/rfc/handlers/supersede-propose.d.ts.map +1 -1
  177. package/dist/os/rfc/handlers/supersede-propose.js +7 -3
  178. package/dist/os/rfc/handlers/supersede-propose.js.map +1 -1
  179. package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
  180. package/dist/os/rfc/handlers/validate-rules.js +8 -5
  181. package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
  182. package/dist/os/rfc/rfc.module.d.ts.map +1 -1
  183. package/dist/os/rfc/rfc.module.js +44 -4
  184. package/dist/os/rfc/rfc.module.js.map +1 -1
  185. package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
  186. package/dist/os/rfc/verification-evidence.js +9 -5
  187. package/dist/os/rfc/verification-evidence.js.map +1 -1
  188. package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
  189. package/dist/os/rfc/verification-refresh.js +4 -3
  190. package/dist/os/rfc/verification-refresh.js.map +1 -1
  191. package/dist/os/session/frontmatter-io.js +12 -12
  192. package/dist/os/session/frontmatter-io.js.map +1 -1
  193. package/dist/os/session/handlers/archive.d.ts.map +1 -1
  194. package/dist/os/session/handlers/archive.js +10 -4
  195. package/dist/os/session/handlers/archive.js.map +1 -1
  196. package/dist/os/session/handlers/metrics-aggregate.d.ts.map +1 -1
  197. package/dist/os/session/handlers/metrics-aggregate.js +9 -5
  198. package/dist/os/session/handlers/metrics-aggregate.js.map +1 -1
  199. package/dist/os/session/handlers/metrics-rfc.d.ts.map +1 -1
  200. package/dist/os/session/handlers/metrics-rfc.js +11 -8
  201. package/dist/os/session/handlers/metrics-rfc.js.map +1 -1
  202. package/dist/os/session/handlers/metrics-session.d.ts.map +1 -1
  203. package/dist/os/session/handlers/metrics-session.js +6 -3
  204. package/dist/os/session/handlers/metrics-session.js.map +1 -1
  205. package/dist/os/session/handlers/save.d.ts.map +1 -1
  206. package/dist/os/session/handlers/save.js +14 -8
  207. package/dist/os/session/handlers/save.js.map +1 -1
  208. package/dist/os/session/session.module.d.ts.map +1 -1
  209. package/dist/os/session/session.module.js +6 -0
  210. package/dist/os/session/session.module.js.map +1 -1
  211. package/dist/os/spec/live-spec-list.js +4 -4
  212. package/dist/os/spec/live-spec-list.js.map +1 -1
  213. package/dist/os/spec/live-spec-merge.js +5 -5
  214. package/dist/os/spec/live-spec-merge.js.map +1 -1
  215. package/dist/os/spec/live-spec-show.js +3 -3
  216. package/dist/os/spec/live-spec-show.js.map +1 -1
  217. package/dist/os/spec/live-spec-validate.js +4 -4
  218. package/dist/os/spec/live-spec-validate.js.map +1 -1
  219. package/dist/os/spec/spec-materialize.js +9 -9
  220. package/dist/os/spec/spec-materialize.js.map +1 -1
  221. package/dist/os/spec/spec-status.js +9 -9
  222. package/dist/os/spec/spec-status.js.map +1 -1
  223. package/dist/os/spec/spec-validate.js +7 -7
  224. package/dist/os/spec/spec-validate.js.map +1 -1
  225. package/dist/os/spec/spec.module.d.ts.map +1 -1
  226. package/dist/os/spec/spec.module.js +8 -0
  227. package/dist/os/spec/spec.module.js.map +1 -1
  228. package/dist/os/werkstatt/handlers/lock.js +16 -16
  229. package/dist/os/werkstatt/handlers/lock.js.map +1 -1
  230. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +3 -3
  231. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -1
  232. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
  233. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +3 -2
  234. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
  235. package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
  236. package/dist/os/werkstatt/werkstatt.module.js +6 -2
  237. package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
  238. package/dist/os/workflow/handlers.d.ts.map +1 -1
  239. package/dist/os/workflow/handlers.js +8 -5
  240. package/dist/os/workflow/handlers.js.map +1 -1
  241. package/dist/os/workflow/workflow.module.d.ts.map +1 -1
  242. package/dist/os/workflow/workflow.module.js +6 -3
  243. package/dist/os/workflow/workflow.module.js.map +1 -1
  244. package/dist/src/compass/contract-registry.js +1 -1
  245. package/dist/src/compass/contract-registry.js.map +1 -1
  246. package/dist/src/config/forge-config.d.ts +10 -1
  247. package/dist/src/config/forge-config.d.ts.map +1 -1
  248. package/dist/src/config/forge-config.js +8 -1
  249. package/dist/src/config/forge-config.js.map +1 -1
  250. package/dist/src/knowledge/budgets.js +1 -1
  251. package/dist/src/knowledge/budgets.js.map +1 -1
  252. package/dist/src/knowledge/compact.js +1 -1
  253. package/dist/src/knowledge/compact.js.map +1 -1
  254. package/dist/src/knowledge/parse.js +1 -1
  255. package/dist/src/knowledge/parse.js.map +1 -1
  256. package/dist/src/knowledge/sync.d.ts.map +1 -1
  257. package/dist/src/knowledge/sync.js +3 -5
  258. package/dist/src/knowledge/sync.js.map +1 -1
  259. package/dist/src/migration-adapters/git-utils.js +2 -2
  260. package/dist/src/migration-adapters/git-utils.js.map +1 -1
  261. package/dist/src/migration-adapters/ignored-files.js +2 -2
  262. package/dist/src/migration-adapters/ignored-files.js.map +1 -1
  263. package/dist/src/migration-adapters/node-typescript-pnpm/index.js +1 -1
  264. package/dist/src/migration-adapters/node-typescript-pnpm/index.js.map +1 -1
  265. package/dist/src/migration-adapters/phaser-pnpm/index.js +1 -1
  266. package/dist/src/migration-adapters/phaser-pnpm/index.js.map +1 -1
  267. package/dist/src/onboarding/agents-generate.d.ts +2 -0
  268. package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
  269. package/dist/src/onboarding/agents-generate.js +73 -48
  270. package/dist/src/onboarding/agents-generate.js.map +1 -1
  271. package/dist/src/onboarding/create.d.ts.map +1 -1
  272. package/dist/src/onboarding/create.js +10 -10
  273. package/dist/src/onboarding/create.js.map +1 -1
  274. package/dist/src/onboarding/doctor.d.ts +6 -0
  275. package/dist/src/onboarding/doctor.d.ts.map +1 -1
  276. package/dist/src/onboarding/doctor.js +179 -61
  277. package/dist/src/onboarding/doctor.js.map +1 -1
  278. package/dist/src/onboarding/init.d.ts.map +1 -1
  279. package/dist/src/onboarding/init.js +30 -1
  280. package/dist/src/onboarding/init.js.map +1 -1
  281. package/dist/src/onboarding/invariant-engine.js +1 -1
  282. package/dist/src/onboarding/invariant-engine.js.map +1 -1
  283. package/dist/src/onboarding/memory-compact.d.ts +22 -0
  284. package/dist/src/onboarding/memory-compact.d.ts.map +1 -0
  285. package/dist/src/onboarding/memory-compact.js +148 -0
  286. package/dist/src/onboarding/memory-compact.js.map +1 -0
  287. package/dist/src/onboarding/memory-scaffold.d.ts +1 -0
  288. package/dist/src/onboarding/memory-scaffold.d.ts.map +1 -1
  289. package/dist/src/onboarding/memory-scaffold.js +2 -2
  290. package/dist/src/onboarding/memory-scaffold.js.map +1 -1
  291. package/dist/src/onboarding/nested-agents-generate.d.ts +4 -1
  292. package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -1
  293. package/dist/src/onboarding/nested-agents-generate.js +35 -6
  294. package/dist/src/onboarding/nested-agents-generate.js.map +1 -1
  295. package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -1
  296. package/dist/src/onboarding/nested-agents-templates.js +8 -12
  297. package/dist/src/onboarding/nested-agents-templates.js.map +1 -1
  298. package/dist/src/onboarding/npm-token-check.js +2 -2
  299. package/dist/src/onboarding/npm-token-check.js.map +1 -1
  300. package/dist/src/onboarding/prettierignore.d.ts +29 -0
  301. package/dist/src/onboarding/prettierignore.d.ts.map +1 -0
  302. package/dist/src/onboarding/prettierignore.js +231 -0
  303. package/dist/src/onboarding/prettierignore.js.map +1 -0
  304. package/dist/src/onboarding/profile-validate.d.ts.map +1 -1
  305. package/dist/src/onboarding/profile-validate.js +5 -4
  306. package/dist/src/onboarding/profile-validate.js.map +1 -1
  307. package/dist/src/onboarding/scaffold-project.d.ts.map +1 -1
  308. package/dist/src/onboarding/scaffold-project.js +35 -27
  309. package/dist/src/onboarding/scaffold-project.js.map +1 -1
  310. package/dist/src/onboarding/scaffold.js +1 -1
  311. package/dist/src/onboarding/scaffold.js.map +1 -1
  312. package/dist/src/onboarding/skill-markers.d.ts +27 -0
  313. package/dist/src/onboarding/skill-markers.d.ts.map +1 -0
  314. package/dist/src/onboarding/skill-markers.js +131 -0
  315. package/dist/src/onboarding/skill-markers.js.map +1 -0
  316. package/dist/src/onboarding/upgrade.d.ts +10 -0
  317. package/dist/src/onboarding/upgrade.d.ts.map +1 -1
  318. package/dist/src/onboarding/upgrade.js +215 -74
  319. package/dist/src/onboarding/upgrade.js.map +1 -1
  320. package/dist/src/onboarding/workspace-discovery.d.ts +1 -1
  321. package/dist/src/onboarding/workspace-discovery.d.ts.map +1 -1
  322. package/dist/src/onboarding/workspace-discovery.js +15 -3
  323. package/dist/src/onboarding/workspace-discovery.js.map +1 -1
  324. package/dist/src/pipeline-status.d.ts +6 -5
  325. package/dist/src/pipeline-status.d.ts.map +1 -1
  326. package/dist/src/pipeline-status.js +24 -19
  327. package/dist/src/pipeline-status.js.map +1 -1
  328. package/dist/src/profiles/stack-profile.js +1 -1
  329. package/dist/src/profiles/stack-profile.js.map +1 -1
  330. package/dist/src/registry.d.ts +1 -1
  331. package/dist/src/registry.d.ts.map +1 -1
  332. package/dist/src/registry.js +3 -3
  333. package/dist/src/registry.js.map +1 -1
  334. package/dist/src/skill-schema.d.ts +1 -1
  335. package/dist/src/skill-schema.d.ts.map +1 -1
  336. package/dist/src/skill-schema.js +4 -1
  337. package/dist/src/skill-schema.js.map +1 -1
  338. package/dist/src/types.d.ts +116 -0
  339. package/dist/src/types.d.ts.map +1 -1
  340. package/dist/src/utils/editable-region.d.ts +46 -0
  341. package/dist/src/utils/editable-region.d.ts.map +1 -0
  342. package/dist/src/utils/editable-region.js +125 -0
  343. package/dist/src/utils/editable-region.js.map +1 -0
  344. package/dist/src/utils/fs-idempotent.d.ts +2 -1
  345. package/dist/src/utils/fs-idempotent.d.ts.map +1 -1
  346. package/dist/src/utils/fs-idempotent.js +11 -7
  347. package/dist/src/utils/fs-idempotent.js.map +1 -1
  348. package/dist/src/utils/generated-marker.d.ts +17 -0
  349. package/dist/src/utils/generated-marker.d.ts.map +1 -1
  350. package/dist/src/utils/generated-marker.js +29 -1
  351. package/dist/src/utils/generated-marker.js.map +1 -1
  352. package/dist/src/utils/index.d.ts +3 -1
  353. package/dist/src/utils/index.d.ts.map +1 -1
  354. package/dist/src/utils/index.js +3 -1
  355. package/dist/src/utils/index.js.map +1 -1
  356. package/dist/src/utils/io.d.ts +9 -0
  357. package/dist/src/utils/io.d.ts.map +1 -0
  358. package/dist/src/utils/io.js +130 -0
  359. package/dist/src/utils/io.js.map +1 -0
  360. package/dist/src/utils/markdown-table.d.ts +21 -0
  361. package/dist/src/utils/markdown-table.d.ts.map +1 -0
  362. package/dist/src/utils/markdown-table.js +116 -0
  363. package/dist/src/utils/markdown-table.js.map +1 -0
  364. package/dist/src/utils/sync-fs.d.ts +5 -0
  365. package/dist/src/utils/sync-fs.d.ts.map +1 -0
  366. package/dist/src/utils/sync-fs.js +26 -0
  367. package/dist/src/utils/sync-fs.js.map +1 -0
  368. package/dist/src/validators/note-frontmatter-validate.js +1 -1
  369. package/dist/src/validators/note-frontmatter-validate.js.map +1 -1
  370. package/dist/src/validators/note-link-validate.js +1 -1
  371. package/dist/src/validators/note-link-validate.js.map +1 -1
  372. package/dist/src/validators/note-orphan-detect.js +1 -1
  373. package/dist/src/validators/note-orphan-detect.js.map +1 -1
  374. package/dist/src/validators/port-validate.js +1 -1
  375. package/dist/src/validators/port-validate.js.map +1 -1
  376. package/dist/src/validators/skill-validate.d.ts.map +1 -1
  377. package/dist/src/validators/skill-validate.js +34 -13
  378. package/dist/src/validators/skill-validate.js.map +1 -1
  379. package/docs/reference/forge-yaml.md +12 -0
  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 -9
  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 +58 -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.ts +27 -19
  421. package/os/mission/mission.module.ts +38 -39
  422. package/os/naming/naming-convention.ts +9 -3
  423. package/os/naming/naming.module.ts +25 -25
  424. package/os/notes/notes.module.ts +87 -85
  425. package/os/plan/frontmatter-io.ts +5 -5
  426. package/os/plan/handlers/archive.ts +8 -4
  427. package/os/plan/plan.module.ts +33 -34
  428. package/os/plugin/plugin.module.ts +8 -6
  429. package/os/program/discovery.ts +2 -2
  430. package/os/program/handlers/complete.ts +1 -1
  431. package/os/program/handlers/lease.ts +1 -1
  432. package/os/program/handlers/seal.ts +1 -1
  433. package/os/program/lease.ts +1 -1
  434. package/os/program/program.module.ts +198 -193
  435. package/os/queue/index.ts +1 -1
  436. package/os/queue/manifest.ts +10 -9
  437. package/os/queue/queue-validate.test.ts +6 -15
  438. package/os/rfc/acceptance.ts +12 -6
  439. package/os/rfc/decision-log.ts +4 -3
  440. package/os/rfc/dna-trace.ts +8 -2
  441. package/os/rfc/frontmatter-io.ts +5 -5
  442. package/os/rfc/handlers/archive.ts +9 -5
  443. package/os/rfc/handlers/check.ts +5 -3
  444. package/os/rfc/handlers/implement-stamp.ts +15 -10
  445. package/os/rfc/handlers/index-graph.ts +3 -3
  446. package/os/rfc/handlers/lifecycle.ts +7 -2
  447. package/os/rfc/handlers/list-create.ts +7 -6
  448. package/os/rfc/handlers/shared.ts +3 -3
  449. package/os/rfc/handlers/supersede-propose.ts +8 -3
  450. package/os/rfc/handlers/validate-rules-rfc1006.test.ts +18 -6
  451. package/os/rfc/handlers/validate-rules.ts +10 -5
  452. package/os/rfc/rfc-create-concurrent.test.ts +11 -3
  453. package/os/rfc/rfc.module.ts +413 -374
  454. package/os/rfc/verification-evidence.ts +11 -5
  455. package/os/rfc/verification-refresh.ts +4 -3
  456. package/os/session/frontmatter-io.ts +14 -14
  457. package/os/session/handlers/archive.ts +8 -4
  458. package/os/session/handlers/metrics-aggregate.ts +34 -13
  459. package/os/session/handlers/metrics-rfc.ts +13 -8
  460. package/os/session/handlers/metrics-session.ts +7 -3
  461. package/os/session/handlers/save.ts +12 -8
  462. package/os/session/session.module.ts +6 -0
  463. package/os/spec/live-spec-list.ts +4 -4
  464. package/os/spec/live-spec-merge.ts +5 -5
  465. package/os/spec/live-spec-show.ts +3 -3
  466. package/os/spec/live-spec-validate.ts +4 -4
  467. package/os/spec/spec-materialize.ts +9 -9
  468. package/os/spec/spec-status.ts +9 -9
  469. package/os/spec/spec-validate.ts +7 -7
  470. package/os/spec/spec.module.ts +8 -0
  471. package/os/werkstatt/handlers/lock.ts +16 -16
  472. package/os/werkstatt/handlers/werkstatt-lock-recover.ts +3 -3
  473. package/os/werkstatt/handlers/werkstatt-operation-validate.ts +4 -2
  474. package/os/werkstatt/werkstatt.module.ts +8 -5
  475. package/os/workflow/handlers.ts +7 -5
  476. package/os/workflow/workflow.module.ts +45 -44
  477. package/package.json +1 -1
  478. package/profiles/forge-shell.yaml +3 -0
  479. package/profiles/godot-game.yaml +3 -0
  480. package/profiles/phaser-game.yaml +3 -0
  481. package/profiles/site-workshop.yaml +567 -564
  482. package/skills/fo/fo-add-tests/SKILL.md +2 -2
  483. package/skills/fo/fo-architecture/SKILL.md +2 -2
  484. package/skills/fo/fo-compass-annotate/SKILL.md +2 -2
  485. package/skills/fo/fo-design-summit/SKILL.md +2 -2
  486. package/skills/fo/fo-doc-audit/SKILL.md +2 -2
  487. package/skills/fo/fo-explore/SKILL.md +2 -2
  488. package/skills/fo/fo-extract-dna/SKILL.md +2 -2
  489. package/skills/fo/fo-fix/SKILL.md +2 -2
  490. package/skills/fo/fo-handoff/SKILL.md +2 -2
  491. package/skills/fo/fo-harvest/SKILL.md +2 -2
  492. package/skills/fo/fo-idea/SKILL.md +2 -2
  493. package/skills/fo/fo-idea-audit/SKILL.md +2 -2
  494. package/skills/fo/fo-idea-create-adr/SKILL.md +3 -3
  495. package/skills/fo/fo-idea-create-rfc/SKILL.md +3 -3
  496. package/skills/fo/fo-idea-enhance/SKILL.md +2 -2
  497. package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +2 -2
  498. package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +1 -1
  499. package/skills/fo/fo-idea-implement/SKILL.md +2 -2
  500. package/skills/fo/fo-idea-plan/SKILL.md +2 -2
  501. package/skills/fo/fo-idea-status/SKILL.md +2 -2
  502. package/skills/fo/fo-knowledge-distill/SKILL.md +2 -2
  503. package/skills/fo/fo-memory-sync/SKILL.md +2 -2
  504. package/skills/fo/fo-qa/SKILL.md +2 -2
  505. package/skills/fo/fo-review/SKILL.md +2 -2
  506. package/skills/fo/fo-session-retro/SKILL.md +2 -2
  507. package/skills/fo/fo-session-save/SKILL.md +2 -2
  508. package/skills/fo/fo-spec-ingest/SKILL.md +2 -2
  509. package/skills/fo/fo-step-commit/SKILL.md +1 -1
  510. package/skills/fo/fo-triage/SKILL.md +2 -2
  511. package/skills/meta/forge-bootstrap/SKILL.md +1 -1
  512. package/skills/meta/port-to-forge/SKILL.md +1 -1
  513. package/skills/meta/skill-create/SKILL.md +1 -1
  514. package/skills/shared/grilling/SKILL.md +1 -1
  515. package/skills/shared/grilling/learned-principles.archive.md +17 -0
  516. package/skills/shared/grilling/learned-principles.md +0 -1
  517. package/skills/shared/knowledge/learned-principles.md +6 -0
  518. package/skills/shared/my-preferences/SKILL.md +1 -1
  519. package/skills/shared/windows-ai-tooling/SKILL.md +1 -1
  520. package/skills/shared/writing-great-skills/SKILL.md +1 -1
  521. package/src/compass/contract-registry.ts +1 -1
  522. package/src/config/forge-config.ts +12 -1
  523. package/src/knowledge/__tests__/sync.test.ts +2 -7
  524. package/src/knowledge/budgets.ts +1 -1
  525. package/src/knowledge/compact.ts +1 -1
  526. package/src/knowledge/parse.ts +1 -1
  527. package/src/knowledge/sync.ts +3 -5
  528. package/src/migration-adapters/git-utils.ts +2 -2
  529. package/src/migration-adapters/ignored-files.ts +2 -2
  530. package/src/migration-adapters/node-typescript-pnpm/index.ts +1 -1
  531. package/src/migration-adapters/phaser-pnpm/index.ts +1 -1
  532. package/src/onboarding/agents-generate.ts +91 -50
  533. package/src/onboarding/create.ts +10 -10
  534. package/src/onboarding/doctor.ts +199 -59
  535. package/src/onboarding/init.ts +38 -1
  536. package/src/onboarding/invariant-engine.ts +1 -1
  537. package/src/onboarding/memory-compact.ts +189 -0
  538. package/src/onboarding/memory-scaffold.ts +2 -2
  539. package/src/onboarding/nested-agents-generate.ts +50 -5
  540. package/src/onboarding/nested-agents-templates.ts +19 -13
  541. package/src/onboarding/npm-token-check.ts +2 -2
  542. package/src/onboarding/prettierignore.ts +263 -0
  543. package/src/onboarding/profile-validate.ts +5 -4
  544. package/src/onboarding/scaffold-project.ts +38 -27
  545. package/src/onboarding/scaffold.ts +1 -1
  546. package/src/onboarding/skill-markers.ts +162 -0
  547. package/src/onboarding/templates/behavioral-layer-core.md +2 -4
  548. package/src/onboarding/upgrade.ts +285 -89
  549. package/src/onboarding/workspace-discovery.ts +16 -2
  550. package/src/pipeline-status.test.ts +1 -4
  551. package/src/pipeline-status.ts +30 -13
  552. package/src/profiles/stack-profile.ts +1 -1
  553. package/src/registry.ts +4 -4
  554. package/src/skill-schema.ts +4 -1
  555. package/src/tests/acceptance-probe-kinds.test.ts +5 -15
  556. package/src/tests/agents-generate.test.ts +32 -7
  557. package/src/tests/contract-registry.test.ts +12 -6
  558. package/src/tests/doctor-dist-freshness.test.ts +110 -0
  559. package/src/tests/doctor-fix.test.ts +142 -0
  560. package/src/tests/doctor-nested-agents.test.ts +160 -0
  561. package/src/tests/editable-generated-region.test.ts +231 -0
  562. package/src/tests/file-size-lint.test.ts +8 -12
  563. package/src/tests/fixtures/agents-generate-business-before.txt +54 -54
  564. package/src/tests/markdown-table.test.ts +107 -0
  565. package/src/tests/memory-compact.test.ts +143 -0
  566. package/src/tests/prettierignore-manage.test.ts +134 -0
  567. package/src/tests/skill-agents-sync.test.ts +168 -0
  568. package/src/tests/skill-sync-marker.test.ts +134 -0
  569. package/src/tests/skill-validate.test.ts +12 -5
  570. package/src/tests/upgrade.test.ts +87 -41
  571. package/src/tests/workspace-discovery.test.ts +28 -0
  572. package/src/types.ts +123 -0
  573. package/src/utils/editable-region.ts +156 -0
  574. package/src/utils/fs-idempotent.ts +12 -6
  575. package/src/utils/generated-marker.ts +36 -2
  576. package/src/utils/index.ts +17 -0
  577. package/src/utils/io.ts +143 -0
  578. package/src/utils/markdown-table.ts +121 -0
  579. package/src/utils/sync-fs.ts +43 -0
  580. package/src/validators/note-frontmatter-validate.ts +1 -1
  581. package/src/validators/note-link-validate.ts +1 -1
  582. package/src/validators/note-orphan-detect.ts +1 -1
  583. package/src/validators/port-validate.ts +1 -1
  584. package/src/validators/skill-validate.ts +38 -13
@@ -6,8 +6,6 @@
6
6
  </non-goals>
7
7
  </MODULE_CONTRACT>
8
8
  <CHANGE_SUMMARY>
9
- <item>RFC-1088: register forge.file-size.lint command for portable SIZE-01 line-count validation.</item>
10
- <item>RFC-1088 fix: add writes field to forge.file-size.lint registration per fo-review.</item>
11
9
  <item>RFC-1089: rename forge.file-size.lint to file.size.lint (domain validator, no forge. prefix).</item>
12
10
  <item>RFC-1097: step 6 — compass.migrate codemod run
13
11
 
@@ -15,7 +13,9 @@ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten
15
13
  <item>RFC-1097: sweep — packages/forge + services clean
16
14
 
17
15
  Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
18
- <history>ADR-0021, RFC-0374, RFC-0521, RFC-0539, RFC-0542, RFC-0543, RFC-0544, RFC-0546, RFC-0640, RFC-0662, RFC-0674, RFC-0678, RFC-0679, RFC-0680, RFC-0711, RFC-0733, RFC-0877, RFC-0940, RFC-1080</history>
16
+ <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>
17
+ <item>RFC-1173: fixup: flip mutatesState to true on 19 commands that declare writes/generates — the codemod's name-suffix rules misclassified leitstand.dev-deploy, leitstand.certify, coverage.report and peers as read-only; declared writes imply mutation</item>
18
+ <history>ADR-0021, RFC-0374, RFC-0521, RFC-0539, RFC-0542, RFC-0543, RFC-0544, RFC-0546, RFC-0640, RFC-0662, RFC-0674, RFC-0678, RFC-0679, RFC-0680, RFC-0711, RFC-0733, RFC-0877, RFC-0940, RFC-1080, RFC-1088</history>
19
19
  </CHANGE_SUMMARY>
20
20
  */
21
21
 
@@ -27,6 +27,7 @@ import type {
27
27
  ForgeRuntimeContext,
28
28
  } from "../../src/types.ts";
29
29
  import path from "node:path";
30
+ import { execSync } from "../../src/utils/sync-fs.ts";
30
31
  import {
31
32
  FORGE_SKILLS,
32
33
  discoverPackSkills,
@@ -41,6 +42,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
41
42
  const { runPortValidate } = await import("../../src/validators/port-validate.ts");
42
43
  const { runDoctor } = await import("../../src/onboarding/doctor.ts");
43
44
  const { runAgentsGenerate } = await import("../../src/onboarding/agents-generate.ts");
45
+ const { runMemoryCompact } = await import("../../src/onboarding/memory-compact.ts");
44
46
  const { runScaffoldProject } = await import("../../src/onboarding/scaffold-project.ts");
45
47
  const { runUpgrade } = await import("../../src/onboarding/upgrade.ts");
46
48
  const { runCreate } = await import("../../src/onboarding/create.ts");
@@ -211,6 +213,9 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
211
213
  commands: [
212
214
  {
213
215
  name: "forge.doctor",
216
+ mutatesState: true,
217
+ writes: [".agents/memory/**"],
218
+ generates: [],
214
219
  description: "Diagnose forge state in an existing project.",
215
220
  scope: "workspace",
216
221
  supportsAllSites: false,
@@ -219,12 +224,17 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
219
224
  kind: "boolean",
220
225
  description: "Elevate domain invariant warnings to errors (RFC-0640).",
221
226
  },
227
+ fix: {
228
+ kind: "boolean",
229
+ description: "Apply safe remediations for warn/fail checks (RFC-1151).",
230
+ },
222
231
  },
223
232
  cacheable: false,
224
233
  execute: doctorWrapper,
225
234
  },
226
235
  {
227
236
  name: "forge.port.scaffold",
237
+ mutatesState: true,
228
238
  description: "Generate a skeleton for a new forge skill or command.",
229
239
  scope: "workspace",
230
240
  supportsAllSites: false,
@@ -237,6 +247,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
237
247
  },
238
248
  {
239
249
  name: "forge.skill.validate",
250
+ mutatesState: false,
240
251
  contract: "forge",
241
252
  rules: [],
242
253
  description:
@@ -249,6 +260,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
249
260
  },
250
261
  {
251
262
  name: "forge.skill.list",
263
+ mutatesState: false,
252
264
  description: "List all registered forge skills.",
253
265
  scope: "workspace",
254
266
  supportsAllSites: false,
@@ -258,6 +270,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
258
270
  },
259
271
  {
260
272
  name: "forge.port.validate",
273
+ mutatesState: false,
261
274
  contract: "forge",
262
275
  rules: [],
263
276
  description:
@@ -272,16 +285,31 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
272
285
  },
273
286
  {
274
287
  name: "forge.agents.generate",
288
+ mutatesState: true,
275
289
  description:
276
290
  "Regenerate AGENTS.md deterministically from forge.yaml and the skill registry.",
277
291
  scope: "workspace",
278
292
  supportsAllSites: false,
279
293
  flags: {},
294
+ writes: ["AGENTS.md", "**/AGENTS.md"],
295
+ generates: [],
280
296
  cacheable: false,
281
297
  execute: runAgentsGenerate,
282
298
  },
299
+ {
300
+ name: "memory.compact",
301
+ mutatesState: true,
302
+ description:
303
+ "Enforce the MEMORY.md character budget by removing oldest Environment notes bullets (RFC-1151).",
304
+ scope: "workspace",
305
+ supportsAllSites: false,
306
+ flags: {},
307
+ cacheable: false,
308
+ execute: runMemoryCompact,
309
+ },
283
310
  {
284
311
  name: "forge.upgrade",
312
+ mutatesState: true,
285
313
  description:
286
314
  "Additive sync for npm consumers: refresh .agents/skills/ from installed forge, add missing binding defaults, update forge.syncedVersion, run doctor.",
287
315
  scope: "workspace",
@@ -298,12 +326,14 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
298
326
  },
299
327
  },
300
328
  writes: [".agents/skills/**", "forge.yaml"],
329
+ generates: [],
301
330
  reads: ["forge.yaml", "packages/forge/skills/**", "packages/forge/package.json"],
302
331
  cacheable: false,
303
332
  execute: runUpgrade,
304
333
  },
305
334
  {
306
335
  name: "forge.scaffold",
336
+ mutatesState: true,
307
337
  description:
308
338
  "Create a working pnpm + Turborepo monorepo from a stack profile in an empty directory. Required flags: `--profile`, `--name`.",
309
339
  scope: "workspace",
@@ -326,6 +356,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
326
356
  },
327
357
  {
328
358
  name: "forge.create",
359
+ mutatesState: true,
329
360
  description:
330
361
  "Create a forge project in-place: scaffold + init + binding defaults. The target directory must be empty (only .git/ tolerated). Usage: forge create --in-place --profile <profile-id> [--name <name>] [--package-manager pnpm]",
331
362
  scope: "workspace",
@@ -361,6 +392,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
361
392
  },
362
393
  {
363
394
  name: "forge.init",
395
+ mutatesState: true,
364
396
  description:
365
397
  "Deploy forge into a project: create forge.yaml, PREFERENCES.md, copy skills, create docs dirs. Hidden recovery command — normally called by forge.create.",
366
398
  scope: "workspace",
@@ -382,6 +414,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
382
414
  },
383
415
  {
384
416
  name: "forge.profile.validate",
417
+ mutatesState: false,
385
418
  contract: "forge",
386
419
  rules: [],
387
420
  description:
@@ -400,6 +433,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
400
433
  },
401
434
  {
402
435
  name: "forge.dev",
436
+ mutatesState: true,
403
437
  description:
404
438
  "Start the dev/preview server declared in the active stack profile. Use --dry-run to print the resolved command without executing.",
405
439
  scope: "workspace",
@@ -421,6 +455,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
421
455
  },
422
456
  {
423
457
  name: "forge.build",
458
+ mutatesState: true,
424
459
  description:
425
460
  "Execute produce commands for all artifacts declared in the active stack profile. Use --dry-run to print resolved commands.",
426
461
  scope: "workspace",
@@ -441,6 +476,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
441
476
  },
442
477
  {
443
478
  name: "forge.validate",
479
+ mutatesState: false,
444
480
  contract: "forge",
445
481
  rules: [],
446
482
  description:
@@ -467,6 +503,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
467
503
  },
468
504
  {
469
505
  name: "forge.determinism.check",
506
+ mutatesState: true,
470
507
  contract: "forge",
471
508
  rules: [],
472
509
  description:
@@ -489,11 +526,13 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
489
526
  },
490
527
  reads: ["forge.yaml", "packages/forge/profiles/*.yaml", "dist/.determinism-cache.json"],
491
528
  writes: ["dist/.determinism-cache.json"],
529
+ generates: [],
492
530
  cacheable: false,
493
531
  execute: runDeterminismCheck,
494
532
  },
495
533
  {
496
534
  name: "forge.assets.list",
535
+ mutatesState: false,
497
536
  description:
498
537
  "List all assets declared in the active stack profile, grouped by type. Use --dry-run to skip hashing, --type to filter by asset type.",
499
538
  scope: "workspace",
@@ -518,6 +557,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
518
557
  },
519
558
  {
520
559
  name: "forge.assets.check",
560
+ mutatesState: false,
521
561
  contract: "forge",
522
562
  rules: [],
523
563
  description:
@@ -544,6 +584,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
544
584
  },
545
585
  {
546
586
  name: "forge.release.prepare",
587
+ mutatesState: true,
547
588
  description:
548
589
  "Bundle built artifacts into a release package with a manifest. Use --dry-run to preview without writing.",
549
590
  scope: "workspace",
@@ -560,11 +601,13 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
560
601
  },
561
602
  reads: ["forge.yaml", "packages/forge/profiles/*.yaml", "dist/**"],
562
603
  writes: ["release/**"],
604
+ generates: [],
563
605
  cacheable: false,
564
606
  execute: runReleasePrepare,
565
607
  },
566
608
  {
567
609
  name: "forge.release.publish",
610
+ mutatesState: true,
568
611
  description:
569
612
  "Publish a prepared release to the declared target (local, R2, S3). Use --dry-run to preview without uploading.",
570
613
  scope: "workspace",
@@ -581,11 +624,13 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
581
624
  },
582
625
  reads: ["forge.yaml", "packages/forge/profiles/*.yaml", "release/**"],
583
626
  writes: ["release/published/**"],
627
+ generates: [],
584
628
  cacheable: false,
585
629
  execute: runReleasePublish,
586
630
  },
587
631
  {
588
632
  name: "forge.skill.knowledge.compact",
633
+ mutatesState: true,
589
634
  description:
590
635
  "Compact skill knowledge files: archive expired/superseded/aged L0 entries, mark stale L2 principles. " +
591
636
  "Usage: forge.skill.knowledge.compact --all-skills [--dry-run] [--json] | --skill <name> [--dry-run] [--json]",
@@ -621,6 +666,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
621
666
  },
622
667
  },
623
668
  writes: ["packages/forge/skills/**/*.md", "packages/forge/skills/**/*.archive.md"],
669
+ generates: [],
624
670
  reads: [
625
671
  "packages/forge/skills/**/*.md",
626
672
  "packages/forge/skills/**/*.archive.md",
@@ -631,6 +677,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
631
677
  },
632
678
  {
633
679
  name: "pinned.validate",
680
+ mutatesState: true,
634
681
  contract: "pinned",
635
682
  rules: [],
636
683
  description:
@@ -641,6 +688,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
641
688
  scope: "workspace",
642
689
  reads: [".forge/pinned.yaml", ".forge/pinned-audit.log"],
643
690
  writes: [".forge/pinned-audit.log"],
691
+ generates: [],
644
692
  cacheable: false,
645
693
  flags: {
646
694
  "allow-pinned-override": {
@@ -675,6 +723,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
675
723
  ".gitignore",
676
724
  ".github/workflows/pinned-check.yml",
677
725
  ],
726
+ generates: [],
678
727
  reads: [".forge/pinned.yaml", ".git/hooks/pre-commit", ".gitignore"],
679
728
  cacheable: false,
680
729
  flags: {
@@ -687,6 +736,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
687
736
  },
688
737
  {
689
738
  name: "forge.package.health",
739
+ mutatesState: false,
690
740
  description:
691
741
  "Validate all published packages (private: false) for standalone extraction readiness. " +
692
742
  "Checks engines.node, embedded .github/workflows/ci.yml, extract.config.yaml, " +
@@ -710,6 +760,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
710
760
  },
711
761
  {
712
762
  name: "forge.autonomy.validate",
763
+ mutatesState: false,
713
764
  contract: "forge",
714
765
  rules: [],
715
766
  description:
@@ -725,6 +776,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
725
776
  },
726
777
  {
727
778
  name: "forge.public-surface.validate",
779
+ mutatesState: false,
728
780
  description:
729
781
  "Check consistency between README.md, package.json, and docs/ structure. " +
730
782
  "Enforces SURFACE-01..05 rules: README length, Node version match, " +
@@ -740,6 +792,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
740
792
  },
741
793
  {
742
794
  name: "file.size.lint",
795
+ mutatesState: true,
743
796
  contract: "file",
744
797
  rules: ["SIZE-01"],
745
798
  description:
@@ -748,6 +801,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
748
801
  supportsAllSites: false,
749
802
  reads: ["packages/*/src/**/*.ts", "packages/*/src/**/*.tsx"],
750
803
  writes: ["file-size-lint.baseline.yaml"],
804
+ generates: [],
751
805
  cacheable: false,
752
806
  flags: {
753
807
  "write-baseline": {
@@ -786,6 +840,7 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
786
840
  "missions/*",
787
841
  "missions/archive/**",
788
842
  ],
843
+ generates: [],
789
844
  reads: [
790
845
  "docs/rfcs/**/*.md",
791
846
  "docs/adrs/**/*.md",
@@ -927,7 +982,6 @@ export async function createForgeCoreModule(): Promise<ForgeModule> {
927
982
  // so the caller (or the next commit) includes it.
928
983
  if (!dryRun && totalMoved > 0) {
929
984
  try {
930
- const { execSync } = await import("node:child_process");
931
985
  const lockfileStatus = execSync("git status --porcelain pnpm-lock.yaml", {
932
986
  cwd: context.workspaceRoot,
933
987
  encoding: "utf-8",
@@ -11,11 +11,15 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import { readFile, stat } from "node:fs/promises";
15
14
  import { join, relative, extname } from "node:path";
15
+ import { ambientIo } from "../../../src/utils/io.ts";
16
16
  import { loadWorkspaceDeps } from "../../werkstatt/handlers/workspace-deps.ts";
17
17
  import type { ProfileAsset, ProfileAssetType } from "../../../src/profiles/profile-schema.ts";
18
18
 
19
+ // Ambient default for helper fns without a context param — handlers override
20
+ // with `const io = resolveIo(context.io)` inside their own scope.
21
+ const io = ambientIo;
22
+
19
23
  export interface AssetEntry {
20
24
  path: string;
21
25
  type: string;
@@ -63,7 +67,7 @@ export async function scanAssets(
63
67
  let hash = "";
64
68
 
65
69
  if (!options.dryRun) {
66
- const stats = await stat(absPath);
70
+ const stats = await io.stat(absPath);
67
71
  size = stats.size;
68
72
  hash = await byteHashFile(absPath);
69
73
  }
@@ -103,7 +107,7 @@ export async function extractReferences(
103
107
  for (const absPath of allFiles) {
104
108
  const relPath = relative(workspaceRoot, absPath);
105
109
  try {
106
- const content = await readFile(absPath, "utf8");
110
+ const content = await io.readFile(absPath);
107
111
 
108
112
  for (const assetType of assetsConfig.types) {
109
113
  if (!assetType.referencePattern) continue;
@@ -11,7 +11,7 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import { exec } from "node:child_process";
14
+ import { exec } from "../../../src/utils/sync-fs.ts";
15
15
  import { promisify } from "node:util";
16
16
  import type {
17
17
  ForgeCommandInput,
@@ -11,10 +11,11 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import { exec } from "node:child_process";
14
+ import { exec } from "../../../src/utils/sync-fs.ts";
15
+ import { ambientIo, resolveIo } from "../../../src/utils/io.ts";
15
16
  import { promisify } from "node:util";
16
- import { readFile, writeFile, mkdir } from "node:fs/promises";
17
- import { existsSync } from "node:fs";
17
+
18
+ import { existsSync } from "../../../src/utils/sync-fs.ts";
18
19
  import { join, relative, dirname } from "node:path";
19
20
  import { createHash } from "node:crypto";
20
21
  import { loadWorkspaceDeps } from "../../werkstatt/handlers/workspace-deps.ts";
@@ -25,6 +26,10 @@ import type {
25
26
  } from "../../../src/types.ts";
26
27
  import { resolveActiveProfile, resolveLifecycleFlags } from "./profile-resolve.ts";
27
28
 
29
+ // Ambient default for helper fns without a context param — handlers override
30
+ // with `const io = resolveIo(context.io)` inside their own scope.
31
+ const io = ambientIo;
32
+
28
33
  const execAsync = promisify(exec);
29
34
 
30
35
  export interface DeterminismCheckResult {
@@ -119,7 +124,7 @@ async function computeInputHash(workspaceRoot: string, inputPatterns: string[]):
119
124
 
120
125
  async function readCache(cachePath: string): Promise<CacheFile> {
121
126
  try {
122
- const content = await readFile(cachePath, "utf8");
127
+ const content = await io.readFile(cachePath);
123
128
  return JSON.parse(content) as CacheFile;
124
129
  } catch {
125
130
  return { entries: {} };
@@ -129,15 +134,16 @@ async function readCache(cachePath: string): Promise<CacheFile> {
129
134
  async function writeCache(cachePath: string, cache: CacheFile): Promise<void> {
130
135
  const dir = dirname(cachePath);
131
136
  if (!existsSync(dir)) {
132
- await mkdir(dir, { recursive: true });
137
+ await io.mkdir(dir);
133
138
  }
134
- await writeFile(cachePath, JSON.stringify(cache, null, 2) + "\n", "utf8");
139
+ await io.writeFile(cachePath, JSON.stringify(cache, null, 2) + "\n");
135
140
  }
136
141
 
137
142
  export async function runDeterminismCheck(
138
143
  input: ForgeCommandInput,
139
144
  context: ForgeRuntimeContext,
140
145
  ): Promise<ForgeCommandResult<ForgeDeterminismCheckResult>> {
146
+ const _io = resolveIo(context.io);
141
147
  const { workspaceRoot, logger } = context;
142
148
  const { dryRun, profileIdOverride } = resolveLifecycleFlags(input, context);
143
149
  const artifactFilter =
@@ -11,7 +11,7 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import { spawn } from "node:child_process";
14
+ import { spawn } from "../../../src/utils/sync-fs.ts";
15
15
  import type {
16
16
  ForgeCommandInput,
17
17
  ForgeCommandResult,
@@ -17,9 +17,13 @@ collectFiles and diagnosticsResult. Ratcheted baseline at workspace root.
17
17
  </CHANGE_SUMMARY>
18
18
  */
19
19
 
20
- import { readdir, readFile, writeFile } from "node:fs/promises";
21
20
  import { join, relative } from "node:path";
21
+ import { ambientIo, resolveIo } from "../../../src/utils/io.ts";
22
22
  import { parse as yamlParse, stringify as yamlStringify } from "yaml";
23
+
24
+ // Ambient default for helper fns without a context param — handlers override
25
+ // with `const io = resolveIo(context.io)` inside their own scope.
26
+ const io = ambientIo;
23
27
  import type {
24
28
  CheckResult,
25
29
  Diagnostic,
@@ -52,25 +56,26 @@ async function collectSourceFiles(root: string): Promise<string[]> {
52
56
  async function walk(dir: string): Promise<void> {
53
57
  let entries;
54
58
  try {
55
- entries = await readdir(dir, { withFileTypes: true });
59
+ entries = await io.readdir(dir);
56
60
  } catch {
57
61
  return;
58
62
  }
59
63
 
60
64
  for (const entry of entries) {
61
65
  if (entry.name.startsWith("-") || entry.name.startsWith("old-")) continue;
62
- if (entry.name === "tests" || entry.name === "node_modules" || entry.name === "dist") continue;
66
+ if (entry.name === "tests" || entry.name === "node_modules" || entry.name === "dist")
67
+ continue;
63
68
  if (entry.name === ".astro" || entry.name.endsWith(".d.ts")) continue;
64
69
  if (entry.name.endsWith(".generated.yaml")) continue;
65
70
 
66
71
  const full = join(dir, entry.name);
67
72
 
68
- if (entry.isDirectory()) {
73
+ if (entry.isDirectory) {
69
74
  await walk(full);
70
75
  continue;
71
76
  }
72
77
 
73
- if (!entry.isFile()) continue;
78
+ if (!entry.isFile) continue;
74
79
  if (!entry.name.endsWith(".ts") && !entry.name.endsWith(".tsx")) continue;
75
80
 
76
81
  results.push(full);
@@ -86,7 +91,7 @@ async function readBaseline(
86
91
  baselinePath: string,
87
92
  ): Promise<FileSizeLintBaseline | undefined> {
88
93
  try {
89
- const raw = await readFile(join(workspaceRoot, baselinePath), "utf8");
94
+ const raw = await io.readFile(join(workspaceRoot, baselinePath));
90
95
  return yamlParse(raw) as FileSizeLintBaseline;
91
96
  } catch {
92
97
  return undefined;
@@ -107,7 +112,7 @@ async function findOversizedFiles(workspaceRoot: string): Promise<Map<string, nu
107
112
  for (const filePath of files) {
108
113
  let source: string;
109
114
  try {
110
- source = await readFile(filePath, "utf8");
115
+ source = await io.readFile(filePath);
111
116
  } catch {
112
117
  continue;
113
118
  }
@@ -134,7 +139,8 @@ function diagnosticsResult(
134
139
  summary.error > 0 ? "fail" : summary.warning > 0 ? "warn" : "pass";
135
140
  const counts: string[] = [];
136
141
  if (summary.error > 0) counts.push(`${summary.error} error${summary.error === 1 ? "" : "s"}`);
137
- if (summary.warning > 0) counts.push(`${summary.warning} warning${summary.warning === 1 ? "" : "s"}`);
142
+ if (summary.warning > 0)
143
+ counts.push(`${summary.warning} warning${summary.warning === 1 ? "" : "s"}`);
138
144
  const summaryStr = counts.length > 0 ? `[${command}] ${counts.join(", ")}` : `[${command}]`;
139
145
  return {
140
146
  data: { command, status, diagnostics, summary },
@@ -156,6 +162,7 @@ export async function runFileSizeLint(
156
162
  input: ForgeCommandInput,
157
163
  context: ForgeRuntimeContext,
158
164
  ): Promise<ForgeCommandResult<CheckResult | { file: string; files: number }>> {
165
+ const io = resolveIo(context.io);
159
166
  const { workspaceRoot } = context;
160
167
  const baselinePath =
161
168
  (input.flags["baseline-path"] as string | undefined) ?? DEFAULT_BASELINE_PATH;
@@ -164,7 +171,7 @@ export async function runFileSizeLint(
164
171
  if (input.flags["write-baseline"] === true) {
165
172
  const ceilings: Record<string, number> = {};
166
173
  for (const [file, lines] of oversized) ceilings[file] = lines;
167
- await writeFile(join(workspaceRoot, baselinePath), renderBaseline(ceilings), "utf8");
174
+ await io.writeFile(join(workspaceRoot, baselinePath), renderBaseline(ceilings));
168
175
  return {
169
176
  data: { file: baselinePath, files: oversized.size },
170
177
  exitCode: 0,
@@ -24,8 +24,12 @@ Sweep batch 4: 73 Compass headers on headerless engine files (certification, com
24
24
  </CHANGE_SUMMARY>
25
25
  */
26
26
 
27
- import { readdir, readFile } from "node:fs/promises";
28
27
  import { join, relative } from "node:path";
28
+ import { ambientIo, resolveIo } from "../../../src/utils/io.ts";
29
+
30
+ // Ambient default for helper fns without a context param — handlers override
31
+ // with `const io = resolveIo(context.io)` inside their own scope.
32
+ const io = ambientIo;
29
33
  import type {
30
34
  ForgeCommandInput,
31
35
  ForgeCommandResult,
@@ -51,19 +55,19 @@ async function scanDirectoryForImports(
51
55
  ): Promise<{ violations: { file: string; specifier: string }[]; scannedFiles: number }> {
52
56
  let scannedFiles = 0;
53
57
  const violations: { file: string; specifier: string }[] = [];
54
- const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
58
+ const entries = await io.readdir(dir).catch(() => []);
55
59
 
56
60
  for (const entry of entries) {
57
61
  const fullPath = join(dir, entry.name);
58
62
 
59
- if (entry.isDirectory()) {
63
+ if (entry.isDirectory) {
60
64
  if (EXCLUDE_DIRS.has(entry.name)) continue;
61
65
  const subResult = await scanDirectoryForImports(fullPath, workspaceRoot, specifierFilter);
62
66
  scannedFiles += subResult.scannedFiles;
63
67
  violations.push(...subResult.violations);
64
68
  } else if (entry.name.endsWith(".ts") && !shouldExcludeFile(entry.name)) {
65
69
  scannedFiles++;
66
- const content = await readFile(fullPath, "utf8").catch(() => "");
70
+ const content = await io.readFile(fullPath).catch(() => "");
67
71
  let match: RegExpExecArray | null;
68
72
  const pattern = new RegExp(IMPORT_PATTERN.source, "g");
69
73
  while ((match = pattern.exec(content)) !== null) {
@@ -110,6 +114,7 @@ export async function runForgeAutonomyValidate(
110
114
  _input: ForgeCommandInput,
111
115
  context: ForgeRuntimeContext,
112
116
  ): Promise<ForgeCommandResult<ForgeAutonomyValidateResult>> {
117
+ const io = resolveIo(context.io);
113
118
  const workspaceRoot = context.workspaceRoot;
114
119
  const forgeOsDir = join(workspaceRoot, "packages", "forge", "os");
115
120
 
@@ -124,7 +129,7 @@ export async function runForgeAutonomyValidate(
124
129
  if (v.file.startsWith(ADAPTER_DIR_PREFIX)) continue;
125
130
 
126
131
  const fullPath = join(workspaceRoot, v.file);
127
- const content = await readFile(fullPath, "utf8").catch(() => "");
132
+ const content = await io.readFile(fullPath).catch(() => "");
128
133
  if (!isTypeOnlyImport(content, v.specifier)) {
129
134
  violations.push({
130
135
  ruleId: "FORGE-AUTONOMY-01",
@@ -11,7 +11,7 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import fs from "node:fs";
14
+ import * as fs from "../../../src/utils/sync-fs.ts";
15
15
  import path from "node:path";
16
16
  import type {
17
17
  ForgeCommandInput,
@@ -17,7 +17,7 @@ Sweep batch 4: 73 Compass headers on headerless engine files (certification, com
17
17
  </CHANGE_SUMMARY>
18
18
  */
19
19
 
20
- import fs from "node:fs";
20
+ import * as fs from "../../../src/utils/sync-fs.ts";
21
21
  import path from "node:path";
22
22
  import type {
23
23
  ForgeCommandInput,
@@ -21,7 +21,7 @@ Sweep batch 4: 73 Compass headers on headerless engine files (certification, com
21
21
  </CHANGE_SUMMARY>
22
22
  */
23
23
 
24
- import fs from "node:fs/promises";
24
+ import { ambientIo as fs } from "../../../src/utils/io.ts";
25
25
  import path from "node:path";
26
26
  import { parse as parseYaml } from "yaml";
27
27
  import type { PinnedEntry, PinnedManifest, PinnedMode, PinnedViolation } from "./pinned-types.ts";
@@ -55,7 +55,7 @@ export async function loadPinnedManifest(repoRoot: string): Promise<PinnedManife
55
55
 
56
56
  let content: string;
57
57
  try {
58
- content = await fs.readFile(manifestPath, "utf8");
58
+ content = await fs.readFile(manifestPath);
59
59
  } catch {
60
60
  return null;
61
61
  }