@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
@@ -11,8 +11,8 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import fs from "node:fs/promises";
15
- import { existsSync } from "node:fs";
14
+ import { ambientIo as fs } from "../../src/utils/io.ts";
15
+ import { existsSync } from "../../src/utils/sync-fs.ts";
16
16
  import path from "node:path";
17
17
  import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
18
18
  import { toKebabCase } from "../../src/utils/string-utils.ts";
@@ -63,7 +63,7 @@ interface SpecMaterializeResult {
63
63
 
64
64
  async function readYaml<T>(filePath: string): Promise<T | null> {
65
65
  try {
66
- const content = await fs.readFile(filePath, "utf8");
66
+ const content = await fs.readFile(filePath);
67
67
  return parseYaml(content) as T;
68
68
  } catch {
69
69
  return null;
@@ -163,11 +163,11 @@ export async function runSpecMaterialize(
163
163
  const amendmentsDir = path.join(specDir, "amendments");
164
164
  const amendments: SpecAmendment[] = [];
165
165
  if (existsSync(amendmentsDir)) {
166
- const amdEntries = await fs.readdir(amendmentsDir);
166
+ const amdEntries = (await fs.readdir(amendmentsDir)).map((e) => e.name);
167
167
  for (const entry of amdEntries) {
168
168
  if (!entry.endsWith(".md")) continue;
169
169
  try {
170
- const content = await fs.readFile(path.join(amendmentsDir, entry), "utf8");
170
+ const content = await fs.readFile(path.join(amendmentsDir, entry));
171
171
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
172
172
  if (!fmMatch) continue;
173
173
  const raw = parseYaml(fmMatch[1]) as unknown;
@@ -197,7 +197,7 @@ export async function runSpecMaterialize(
197
197
  const rfcStatuses = new Map<string, string>();
198
198
  for (const file of rfcFiles) {
199
199
  try {
200
- const content = await fs.readFile(path.join(rfcDir, file), "utf8");
200
+ const content = await fs.readFile(path.join(rfcDir, file));
201
201
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
202
202
  if (!fmMatch) continue;
203
203
  const fm = parseYaml(fmMatch[1]) as Record<string, unknown>;
@@ -283,7 +283,7 @@ export async function runSpecMaterialize(
283
283
  const templatePath = resolveRfcTemplate(workspaceRoot);
284
284
  let templateContent: string;
285
285
  try {
286
- templateContent = await fs.readFile(templatePath, "utf-8");
286
+ templateContent = await fs.readFile(templatePath);
287
287
  } catch {
288
288
  return {
289
289
  data: {
@@ -335,7 +335,7 @@ export async function runSpecMaterialize(
335
335
  content = content.replace(/^---\n\n# /m, `---\n${designSection}\n# `);
336
336
 
337
337
  const targetPath = path.join(rfcDir, fileName);
338
- await fs.writeFile(targetPath, content, "utf-8");
338
+ await fs.writeFile(targetPath, content);
339
339
  maxId = nextNum;
340
340
 
341
341
  created.push({
@@ -355,7 +355,7 @@ export async function runSpecMaterialize(
355
355
  }),
356
356
  };
357
357
  const yamlContent = stringifyYaml(updatedSpec);
358
- await fs.writeFile(forgeSpecPath, yamlContent, "utf-8");
358
+ await fs.writeFile(forgeSpecPath, yamlContent);
359
359
  }
360
360
 
361
361
  // Report skipped front nodes (beyond the materialized batch)
@@ -10,8 +10,8 @@
10
10
  </CHANGE_SUMMARY>
11
11
  */
12
12
 
13
- import fs from "node:fs/promises";
14
- import { existsSync } from "node:fs";
13
+ import { ambientIo as fs } from "../../src/utils/io.ts";
14
+ import { existsSync } from "../../src/utils/sync-fs.ts";
15
15
  import path from "node:path";
16
16
  import { parse as parseYaml } from "yaml";
17
17
  import { loadForgeConfig } from "../../src/config/forge-config.ts";
@@ -70,7 +70,7 @@ interface SpecStatusResult {
70
70
 
71
71
  async function readYaml<T>(filePath: string): Promise<T | null> {
72
72
  try {
73
- const content = await fs.readFile(filePath, "utf8");
73
+ const content = await fs.readFile(filePath);
74
74
  return parseYaml(content) as T;
75
75
  } catch {
76
76
  return null;
@@ -79,8 +79,8 @@ async function readYaml<T>(filePath: string): Promise<T | null> {
79
79
 
80
80
  async function listSpecDirs(specsDir: string): Promise<string[]> {
81
81
  if (!existsSync(specsDir)) return [];
82
- const entries = await fs.readdir(specsDir, { withFileTypes: true });
83
- return entries.filter((e) => e.isDirectory()).map((e) => e.name);
82
+ const entries = await fs.readdir(specsDir);
83
+ return entries.filter((e) => e.isDirectory).map((e) => e.name);
84
84
  }
85
85
 
86
86
  async function loadRfcStatuses(
@@ -88,11 +88,11 @@ async function loadRfcStatuses(
88
88
  ): Promise<Map<string, string>> {
89
89
  const statuses = new Map<string, string>();
90
90
  if (!existsSync(rfcDir)) return statuses;
91
- const files = await fs.readdir(rfcDir);
91
+ const files = (await fs.readdir(rfcDir)).map((e) => e.name);
92
92
  for (const file of files) {
93
93
  if (!file.endsWith(".md") || file.startsWith("rfc-0000")) continue;
94
94
  try {
95
- const content = await fs.readFile(path.join(rfcDir, file), "utf8");
95
+ const content = await fs.readFile(path.join(rfcDir, file));
96
96
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
97
97
  if (!fmMatch) continue;
98
98
  const fm = parseYaml(fmMatch[1]) as Record<string, unknown>;
@@ -110,13 +110,13 @@ async function loadAmendments(specDir: string): Promise<SpecAmendment[]> {
110
110
  const amendmentsDir = path.join(specDir, "amendments");
111
111
  if (!existsSync(amendmentsDir)) return [];
112
112
 
113
- const entries = await fs.readdir(amendmentsDir);
113
+ const entries = (await fs.readdir(amendmentsDir)).map((e) => e.name);
114
114
  const amendments: SpecAmendment[] = [];
115
115
 
116
116
  for (const entry of entries) {
117
117
  if (!entry.endsWith(".md")) continue;
118
118
  try {
119
- const content = await fs.readFile(path.join(amendmentsDir, entry), "utf8");
119
+ const content = await fs.readFile(path.join(amendmentsDir, entry));
120
120
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
121
121
  if (!fmMatch) continue;
122
122
  const raw = parseYaml(fmMatch[1]) as unknown;
@@ -13,8 +13,8 @@
13
13
  </CHANGE_SUMMARY>
14
14
  */
15
15
 
16
- import fs from "node:fs/promises";
17
- import { existsSync } from "node:fs";
16
+ import { ambientIo as fs } from "../../src/utils/io.ts";
17
+ import { existsSync } from "../../src/utils/sync-fs.ts";
18
18
  import path from "node:path";
19
19
  import { parse as parseYaml } from "yaml";
20
20
  import { byteHash } from "../../src/utils/hash.ts";
@@ -43,7 +43,7 @@ import {
43
43
 
44
44
  async function readYaml<T>(filePath: string): Promise<T | null> {
45
45
  try {
46
- const content = await fs.readFile(filePath, "utf8");
46
+ const content = await fs.readFile(filePath);
47
47
  return parseYaml(content) as T;
48
48
  } catch {
49
49
  return null;
@@ -52,8 +52,8 @@ async function readYaml<T>(filePath: string): Promise<T | null> {
52
52
 
53
53
  async function listSpecDirs(specsDir: string): Promise<string[]> {
54
54
  if (!existsSync(specsDir)) return [];
55
- const entries = await fs.readdir(specsDir, { withFileTypes: true });
56
- return entries.filter((e) => e.isDirectory()).map((e) => e.name);
55
+ const entries = await fs.readdir(specsDir);
56
+ return entries.filter((e) => e.isDirectory).map((e) => e.name);
57
57
  }
58
58
 
59
59
  async function listSnapshotFiles(
@@ -288,13 +288,13 @@ async function loadAmendments(specDir: string): Promise<SpecAmendment[]> {
288
288
  const amendmentsDir = path.join(specDir, "amendments");
289
289
  if (!existsSync(amendmentsDir)) return [];
290
290
 
291
- const entries = await fs.readdir(amendmentsDir);
291
+ const entries = (await fs.readdir(amendmentsDir)).map((e) => e.name);
292
292
  const amendments: SpecAmendment[] = [];
293
293
 
294
294
  for (const entry of entries) {
295
295
  if (!entry.endsWith(".md")) continue;
296
296
  try {
297
- const content = await fs.readFile(path.join(amendmentsDir, entry), "utf8");
297
+ const content = await fs.readFile(path.join(amendmentsDir, entry));
298
298
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
299
299
  if (!fmMatch) continue;
300
300
  const raw = parseYaml(fmMatch[1]) as unknown;
@@ -9,6 +9,7 @@
9
9
  <item>RFC-0394: initial forgeSpecModule registering spec.validate.</item>
10
10
  <item>RFC-0396: added spec.status and spec.materialize commands.</item>
11
11
  <item>RFC-0711: added spec.live.merge, spec.live.list, spec.live.show, spec.live.validate commands.</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
 
@@ -30,6 +31,7 @@ const { runSpecValidate } = await import("./spec-validate.ts");
30
31
  commands: [
31
32
  {
32
33
  name: "spec.validate",
34
+ mutatesState: false,
33
35
  contract: "spec",
34
36
  rules: [],
35
37
  description:
@@ -49,6 +51,7 @@ const { runSpecValidate } = await import("./spec-validate.ts");
49
51
  },
50
52
  {
51
53
  name: "spec.status",
54
+ mutatesState: false,
52
55
  description:
53
56
  "Show roadmap progress for vendored specs. " +
54
57
  "Without --spec, summarizes all specs; with it, full per-node table + computed front.",
@@ -70,6 +73,7 @@ const { runSpecValidate } = await import("./spec-validate.ts");
70
73
  scope: "workspace",
71
74
  mutatesState: true,
72
75
  writes: ["docs/rfcs/rfc-*.md", "docs/specs/*/forge-spec.yaml"],
76
+ generates: [],
73
77
  reads: ["docs/specs/**/*", "docs/rfcs/**/*.md"],
74
78
  flags: {
75
79
  spec: { kind: "string", required: true, description: "Spec id to materialize from." },
@@ -90,6 +94,7 @@ const { runSpecValidate } = await import("./spec-validate.ts");
90
94
  scope: "workspace",
91
95
  mutatesState: true,
92
96
  writes: ["docs/specs/live/*.md"],
97
+ generates: [],
93
98
  reads: ["docs/rfcs/**/*.md", "docs/specs/live/*.md"],
94
99
  flags: {
95
100
  id: { kind: "string", required: true, description: "RFC id to merge (e.g. RFC-0711)." },
@@ -99,6 +104,7 @@ const { runSpecValidate } = await import("./spec-validate.ts");
99
104
  },
100
105
  {
101
106
  name: "spec.live.list",
107
+ mutatesState: false,
102
108
  description:
103
109
  "List all living feature specs in docs/specs/live/. " +
104
110
  "Returns domain, title, lastMergedRfc, updatedAt, and historyCount for each spec.",
@@ -109,6 +115,7 @@ const { runSpecValidate } = await import("./spec-validate.ts");
109
115
  },
110
116
  {
111
117
  name: "spec.live.show",
118
+ mutatesState: false,
112
119
  description:
113
120
  "Show a single living feature spec by domain. " +
114
121
  "Requires --domain=<name>. Returns full frontmatter and body content.",
@@ -121,6 +128,7 @@ const { runSpecValidate } = await import("./spec-validate.ts");
121
128
  },
122
129
  {
123
130
  name: "spec.live.validate",
131
+ mutatesState: false,
124
132
  contract: "spec",
125
133
  rules: [],
126
134
  description:
@@ -13,8 +13,8 @@ heartbeat, status, and stale-lock removal.</purpose>
13
13
  </CHANGE_SUMMARY>
14
14
  */
15
15
 
16
- import fs from "node:fs/promises";
17
- import { existsSync } from "node:fs";
16
+ import { ambientIo as fs } from "../../../src/utils/io.ts";
17
+ import { existsSync } from "../../../src/utils/sync-fs.ts";
18
18
  import path from "node:path";
19
19
  import { werkstattLockSchema, type WerkstattLock } from "./schema.ts";
20
20
 
@@ -57,11 +57,11 @@ export async function acquireLock(
57
57
  const locksDir = resolveLocksDir(workspaceRoot);
58
58
 
59
59
  if (!existsSync(locksDir)) {
60
- await fs.mkdir(locksDir, { recursive: true });
60
+ await fs.mkdir(locksDir);
61
61
  }
62
62
 
63
63
  if (existsSync(lockPath)) {
64
- const raw = await fs.readFile(lockPath, "utf8");
64
+ const raw = await fs.readFile(lockPath);
65
65
  try {
66
66
  const existing = werkstattLockSchema.parse(JSON.parse(raw));
67
67
  if (existing.pid === process.pid && !isLockStale(existing)) {
@@ -71,7 +71,7 @@ export async function acquireLock(
71
71
  heartbeatAt: new Date().toISOString(),
72
72
  };
73
73
  werkstattLockSchema.parse(updated);
74
- await fs.writeFile(lockPath, JSON.stringify(updated, null, 2) + "\n", "utf8");
74
+ await fs.writeFile(lockPath, JSON.stringify(updated, null, 2) + "\n");
75
75
  return updated;
76
76
  }
77
77
  if (!isLockStale(existing)) {
@@ -98,7 +98,7 @@ export async function acquireLock(
98
98
  };
99
99
 
100
100
  werkstattLockSchema.parse(lock);
101
- await fs.writeFile(lockPath, JSON.stringify(lock, null, 2) + "\n", "utf8");
101
+ await fs.writeFile(lockPath, JSON.stringify(lock, null, 2) + "\n");
102
102
  return lock;
103
103
  }
104
104
 
@@ -106,19 +106,19 @@ export async function releaseLock(workspaceRoot: string, scope: string): Promise
106
106
  const lockPath = resolveLockPath(workspaceRoot, scope);
107
107
  if (!existsSync(lockPath)) return;
108
108
  try {
109
- const raw = await fs.readFile(lockPath, "utf8");
109
+ const raw = await fs.readFile(lockPath);
110
110
  const lock = werkstattLockSchema.parse(JSON.parse(raw));
111
111
  if (lock.pid === process.pid && (lock.depth ?? 1) > 1) {
112
112
  const decremented = { ...lock, depth: (lock.depth ?? 1) - 1 };
113
113
  werkstattLockSchema.parse(decremented);
114
- await fs.writeFile(lockPath, JSON.stringify(decremented, null, 2) + "\n", "utf8");
114
+ await fs.writeFile(lockPath, JSON.stringify(decremented, null, 2) + "\n");
115
115
  return;
116
116
  }
117
- await fs.unlink(lockPath);
117
+ await fs.rm(lockPath);
118
118
  } catch {
119
119
  // corrupt or missing — try direct delete
120
120
  try {
121
- await fs.unlink(lockPath);
121
+ await fs.rm(lockPath);
122
122
  } catch {
123
123
  /* already gone */
124
124
  }
@@ -128,10 +128,10 @@ export async function releaseLock(workspaceRoot: string, scope: string): Promise
128
128
  export async function heartbeatLock(workspaceRoot: string, scope: string): Promise<void> {
129
129
  const lockPath = resolveLockPath(workspaceRoot, scope);
130
130
  if (!existsSync(lockPath)) return;
131
- const raw = await fs.readFile(lockPath, "utf8");
131
+ const raw = await fs.readFile(lockPath);
132
132
  const lock = werkstattLockSchema.parse(JSON.parse(raw));
133
133
  lock.heartbeatAt = new Date().toISOString();
134
- await fs.writeFile(lockPath, JSON.stringify(lock, null, 2) + "\n", "utf8");
134
+ await fs.writeFile(lockPath, JSON.stringify(lock, null, 2) + "\n");
135
135
  }
136
136
 
137
137
  export async function readAllLocks(
@@ -140,12 +140,12 @@ export async function readAllLocks(
140
140
  const locksDir = resolveLocksDir(workspaceRoot);
141
141
  if (!existsSync(locksDir)) return [];
142
142
 
143
- const files = await fs.readdir(locksDir);
143
+ const files = (await fs.readdir(locksDir)).map((e) => e.name);
144
144
  const locks: Array<WerkstattLock & { stale: boolean }> = [];
145
145
 
146
146
  for (const file of files) {
147
147
  if (!file.endsWith(".lock.json")) continue;
148
- const raw = await fs.readFile(path.join(locksDir, file), "utf8");
148
+ const raw = await fs.readFile(path.join(locksDir, file));
149
149
  try {
150
150
  const lock = werkstattLockSchema.parse(JSON.parse(raw));
151
151
  locks.push({ ...lock, stale: isLockStale(lock) });
@@ -160,9 +160,9 @@ export async function readAllLocks(
160
160
  export async function removeStaleLock(workspaceRoot: string, scope: string): Promise<boolean> {
161
161
  const lockPath = resolveLockPath(workspaceRoot, scope);
162
162
  if (!existsSync(lockPath)) return false;
163
- const raw = await fs.readFile(lockPath, "utf8");
163
+ const raw = await fs.readFile(lockPath);
164
164
  const lock = werkstattLockSchema.parse(JSON.parse(raw));
165
165
  if (!isLockStale(lock)) return false;
166
- await fs.unlink(lockPath);
166
+ await fs.rm(lockPath);
167
167
  return true;
168
168
  }
@@ -19,8 +19,8 @@ Sweep batch 4: 73 Compass headers on headerless engine files (certification, com
19
19
  </CHANGE_SUMMARY>
20
20
  */
21
21
 
22
- import fs from "node:fs/promises";
23
- import { existsSync } from "node:fs";
22
+ import { ambientIo as fs } from "../../../src/utils/io.ts";
23
+ import { existsSync } from "../../../src/utils/sync-fs.ts";
24
24
  import path from "node:path";
25
25
  import type {
26
26
  ForgeCommandInput,
@@ -57,7 +57,7 @@ async function classifyArtifacts(
57
57
 
58
58
  let entries: string[];
59
59
  try {
60
- entries = await fs.readdir(rootPath);
60
+ entries = (await fs.readdir(rootPath)).map((e) => e.name);
61
61
  } catch {
62
62
  continue;
63
63
  }
@@ -16,7 +16,8 @@ helper module (RFC-0362 §6).</purpose>
16
16
  */
17
17
 
18
18
  import { basename, join, relative } from "node:path";
19
- import { readFile } from "node:fs/promises";
19
+ import { resolveIo } from "../../../src/utils/io.ts";
20
+
20
21
  import { collectFiles } from "../../../src/utils/fs.ts";
21
22
  import type {
22
23
  ForgeCommandInput,
@@ -43,6 +44,7 @@ export async function runWerkstattOperationValidate(
43
44
  _input: ForgeCommandInput,
44
45
  context: ForgeRuntimeContext,
45
46
  ): Promise<ForgeCommandResult<WerkstattOperationValidateData>> {
47
+ const io = resolveIo(context.io);
46
48
  const { workspaceRoot, logger } = context;
47
49
  const scanPath = join(workspaceRoot, SCAN_DIR);
48
50
  const allowlistPath = join(workspaceRoot, ALLOWLIST_DIR);
@@ -67,7 +69,7 @@ export async function runWerkstattOperationValidate(
67
69
 
68
70
  let content: string;
69
71
  try {
70
- content = await readFile(filePath, "utf8");
72
+ content = await io.readFile(filePath);
71
73
  } catch {
72
74
  continue;
73
75
  }
@@ -9,7 +9,6 @@
9
9
  <CHANGE_SUMMARY>
10
10
  <item>RFC-0682: extract dynamic-import helper so forge publishes without workspace:* deps.</item>
11
11
  <item>RFC-0940: moved from os/core/handlers/ to os/werkstatt/handlers/ — this module imports @warpgogol/werkstatt-engine and belongs in the adapter directory.</item>
12
- <item>2026-09-22: fingerprint import switched from @warpgogol/werkstatt-engine/fingerprint to @warpgogol/werkstatt-shared/fingerprint (canonical home since RFC-1104) — breaks the forge↔engine package cycle reported by turbo.</item>
13
12
  </CHANGE_SUMMARY>
14
13
  */
15
14
 
@@ -8,6 +8,7 @@
8
8
  <CHANGE_SUMMARY>
9
9
  <item>RFC-0374: initial forgeWerkstattModule registering 3 werkstatt commands.</item>
10
10
  <item>RFC-0556: removed dynamic imports of @warpgogol/site-kernel-handoff and @warpgogol/site-kernel-checks, all handlers now inlined in forge/os/werkstatt/handlers/.</item>
11
+ <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>
11
12
  </CHANGE_SUMMARY>
12
13
  */
13
14
 
@@ -20,10 +21,11 @@ export const forgeWerkstattModule: ForgeModule = {
20
21
  name: "forge-werkstatt",
21
22
  version: "0.1.0",
22
23
  runtime: "werkstatt-adapter",
23
- declarations: [],
24
+ declarations: [],
24
25
  commands: [
25
26
  {
26
27
  name: "werkstatt.lock.status",
28
+ mutatesState: false,
27
29
  description: "Report all Werkstatt locks, their age, owner, and staleness (RFC-0362).",
28
30
  scope: "workspace",
29
31
  supportsAllSites: false,
@@ -46,12 +48,14 @@ export const forgeWerkstattModule: ForgeModule = {
46
48
  },
47
49
  },
48
50
  writes: [".werkstatt/locks/**", "systems/**", "missions/**", "releases/**"],
51
+ generates: [],
49
52
  reads: [".werkstatt/locks/**"],
50
53
  cacheable: false,
51
54
  execute: runWerkstattLockRecover,
52
55
  },
53
56
  {
54
57
  name: "werkstatt.operation.validate",
58
+ mutatesState: false,
55
59
  contract: "werkstatt",
56
60
  rules: [],
57
61
  description:
@@ -61,8 +65,7 @@ export const forgeWerkstattModule: ForgeModule = {
61
65
  flags: {},
62
66
  reads: ["packages/os/site-kernel-handoff/src/**/*.ts"],
63
67
  execute: runWerkstattOperationValidate,
64
- }
68
+ },
65
69
  ],
66
- pipelines: [
67
-
68
- ]};
70
+ pipelines: [],
71
+ };
@@ -12,7 +12,7 @@
12
12
  </CHANGE_SUMMARY>
13
13
  */
14
14
 
15
- import fs from "node:fs/promises";
15
+ import { ambientIo as fs } from "../../src/utils/io.ts";
16
16
  import path from "node:path";
17
17
  import YAML from "yaml";
18
18
  import type {
@@ -82,7 +82,9 @@ const PENDING_ACCEPTED_RFC_COMMANDS = new Set([
82
82
 
83
83
  async function pathExists(target: string): Promise<boolean> {
84
84
  try {
85
- await fs.access(target);
85
+ await fs.exists(target).then((ok) => {
86
+ if (!ok) throw Object.assign(new Error("ENOENT"), { code: "ENOENT" });
87
+ });
86
88
  return true;
87
89
  } catch {
88
90
  return false;
@@ -91,9 +93,9 @@ async function pathExists(target: string): Promise<boolean> {
91
93
 
92
94
  async function readWorkflowFiles(workspaceRoot: string, dir: string) {
93
95
  const directory = path.join(workspaceRoot, dir);
94
- const entries = await fs.readdir(directory, { withFileTypes: true }).catch(() => []);
96
+ const entries = await fs.readdir(directory).catch(() => []);
95
97
  return entries
96
- .filter((entry) => entry.isFile() && entry.name.endsWith(".md") && entry.name !== "README.md")
98
+ .filter((entry) => entry.isFile && entry.name.endsWith(".md") && entry.name !== "README.md")
97
99
  .map((entry) => path.join(directory, entry.name))
98
100
  .sort();
99
101
  }
@@ -160,7 +162,7 @@ async function loadWorkflows(workspaceRoot: string, chain: WorkflowChain = "gree
160
162
  for (const file of files) {
161
163
  const relativeFile = path.relative(workspaceRoot, file).replace(/\\/g, "/");
162
164
  try {
163
- const source = await fs.readFile(file, "utf8");
165
+ const source = await fs.readFile(file);
164
166
  workflows.push({
165
167
  relativeFile,
166
168
  chain,
@@ -8,56 +8,57 @@
8
8
  <CHANGE_SUMMARY>
9
9
  <item>RFC-0075: Add workflow command module.</item>
10
10
  <item>RFC-0374: Migrated from packages/os/site-kernel/src/workflow/ to packages/forge/os/workflow/.</item>
11
+ <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>
11
12
  </CHANGE_SUMMARY>
12
13
  */
13
14
 
14
15
  import type { ForgeModule } from "../../src/forge-module.ts";
15
16
 
16
17
  export async function createForgeWorkflowModule(): Promise<ForgeModule> {
17
- const { runWorkflowLint, runWorkflowList, runWorkflowAmendList } =
18
- await import("./handlers.ts");
18
+ const { runWorkflowLint, runWorkflowList, runWorkflowAmendList } = await import("./handlers.ts");
19
19
  return {
20
- name: "workflow",
21
- version: "0.1.0",
22
- runtime: "autonomous",
20
+ name: "workflow",
21
+ version: "0.1.0",
22
+ runtime: "autonomous",
23
23
  declarations: [],
24
- commands: [
25
- {
26
- name: "workflow.lint",
27
- contract: "workflow",
28
- rules: [],
29
- description:
30
- "Validate .agents/workflows AND .agents/workflows-amend markdown frontmatter, command references, " +
31
- "and per-chain phase links (RFC-0075 + RFC-0136).",
32
- scope: "workspace",
33
- flags: {},
34
- supportsAllSites: true,
35
- reads: [".agents/workflows/**/*.md", ".windsurf/workflows/**/*.md"],
36
- execute: runWorkflowLint,
37
- },
38
- {
39
- name: "workflow.list",
40
- description:
41
- "List .agents/workflows entries with phase, IO summary, and next workflow (RFC-0075).",
42
- scope: "workspace",
43
- flags: {},
44
- supportsAllSites: true,
45
- reads: [".agents/workflows/**/*.md", ".windsurf/workflows/**/*.md"],
46
- execute: runWorkflowList,
47
- },
48
- {
49
- name: "workflow-amend.list",
50
- description:
51
- "List .agents/workflows-amend entries with phase, IO summary, and next workflow (RFC-0136).",
52
- scope: "workspace",
53
- flags: {},
54
- supportsAllSites: true,
55
- reads: [".agents/workflows-amend/**/*.md"],
56
- execute: runWorkflowAmendList,
57
- }
58
- ],
59
- pipelines: [
60
-
61
- ]};
24
+ commands: [
25
+ {
26
+ name: "workflow.lint",
27
+ mutatesState: false,
28
+ contract: "workflow",
29
+ rules: [],
30
+ description:
31
+ "Validate .agents/workflows AND .agents/workflows-amend markdown frontmatter, command references, " +
32
+ "and per-chain phase links (RFC-0075 + RFC-0136).",
33
+ scope: "workspace",
34
+ flags: {},
35
+ supportsAllSites: true,
36
+ reads: [".agents/workflows/**/*.md", ".windsurf/workflows/**/*.md"],
37
+ execute: runWorkflowLint,
38
+ },
39
+ {
40
+ name: "workflow.list",
41
+ mutatesState: false,
42
+ description:
43
+ "List .agents/workflows entries with phase, IO summary, and next workflow (RFC-0075).",
44
+ scope: "workspace",
45
+ flags: {},
46
+ supportsAllSites: true,
47
+ reads: [".agents/workflows/**/*.md", ".windsurf/workflows/**/*.md"],
48
+ execute: runWorkflowList,
49
+ },
50
+ {
51
+ name: "workflow-amend.list",
52
+ mutatesState: false,
53
+ description:
54
+ "List .agents/workflows-amend entries with phase, IO summary, and next workflow (RFC-0136).",
55
+ scope: "workspace",
56
+ flags: {},
57
+ supportsAllSites: true,
58
+ reads: [".agents/workflows-amend/**/*.md"],
59
+ execute: runWorkflowAmendList,
60
+ },
61
+ ],
62
+ pipelines: [],
63
+ };
62
64
  }
63
- ;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warpgogol/forge",
3
- "version": "5.2.4",
3
+ "version": "5.3.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -525,7 +525,7 @@ workspace:
525
525
  "hooks": {
526
526
  "pre_user_prompt": [
527
527
  {
528
- "command": "node $ROOT_WORKSPACE_PATH/hooks/pre-user-prompt-wrapper.mjs",
528
+ "command": "node \"${ROOT_WORKSPACE_PATH:-$PWD}/hooks/pre-user-prompt-wrapper.mjs\"",
529
529
  "show_output": true
530
530
  }
531
531
  ]
@@ -1002,7 +1002,7 @@ workspace:
1002
1002
  "hooks": {
1003
1003
  "pre_user_prompt": [
1004
1004
  {
1005
- "command": "node $ROOT_WORKSPACE_PATH/hooks/pre-user-prompt-wrapper.mjs",
1005
+ "command": "node \"${ROOT_WORKSPACE_PATH:-$PWD}/hooks/pre-user-prompt-wrapper.mjs\"",
1006
1006
  "show_output": true
1007
1007
  }
1008
1008
  ]
@@ -378,7 +378,7 @@ workspace:
378
378
  "hooks": {
379
379
  "pre_user_prompt": [
380
380
  {
381
- "command": "node $ROOT_WORKSPACE_PATH/hooks/pre-user-prompt-wrapper.mjs",
381
+ "command": "node \"${ROOT_WORKSPACE_PATH:-$PWD}/hooks/pre-user-prompt-wrapper.mjs\"",
382
382
  "show_output": true
383
383
  }
384
384
  ]
@@ -605,7 +605,7 @@ workspace:
605
605
  "hooks": {
606
606
  "pre_user_prompt": [
607
607
  {
608
- "command": "node $ROOT_WORKSPACE_PATH/hooks/pre-user-prompt-wrapper.mjs",
608
+ "command": "node \"${ROOT_WORKSPACE_PATH:-$PWD}/hooks/pre-user-prompt-wrapper.mjs\"",
609
609
  "show_output": true
610
610
  }
611
611
  ]
@@ -516,7 +516,7 @@ workspace:
516
516
  "hooks": {
517
517
  "pre_user_prompt": [
518
518
  {
519
- "command": "node $ROOT_WORKSPACE_PATH/hooks/pre-user-prompt-wrapper.mjs",
519
+ "command": "node \"${ROOT_WORKSPACE_PATH:-$PWD}/hooks/pre-user-prompt-wrapper.mjs\"",
520
520
  "show_output": true
521
521
  }
522
522
  ]