@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
@@ -19,13 +19,13 @@ Sweep batch 4: 73 Compass headers on headerless engine files (certification, com
19
19
  </CHANGE_SUMMARY>
20
20
  */
21
21
 
22
- import { buildGeneratedHeader } from "../utils/index.ts";
22
+ import { alignMarkdownTable, buildGeneratedHeader } from "../utils/index.ts";
23
23
  import { resolveForgePackageRoot } from "../config/forge-config.ts";
24
24
  import type { ForgeConfig } from "../config/forge-config.ts";
25
25
  import type { WorkspaceDir, WorkspaceType } from "./workspace-discovery.ts";
26
26
  import type { ProfileWorkspaceType } from "../profiles/profile-schema.ts";
27
27
  import type { StackProfile } from "../profiles/stack-profile.ts";
28
- import fs from "node:fs";
28
+ import * as fs from "../utils/sync-fs.ts";
29
29
  import path from "node:path";
30
30
 
31
31
  export interface PackageInfo {
@@ -99,11 +99,13 @@ function buildScriptsTable(scripts: Record<string, string> | undefined): string[
99
99
  const lines: string[] = [];
100
100
  lines.push("## Scripts");
101
101
  lines.push("");
102
- lines.push("| Script | Command |");
103
- lines.push("| --- | --- |");
104
- for (const [name, cmd] of Object.entries(scripts)) {
105
- lines.push(`| \`${name}\` | \`${cmd}\` |`);
106
- }
102
+ // RFC-1154: emitted prettier-normal via alignMarkdownTable
103
+ lines.push(
104
+ alignMarkdownTable(
105
+ ["Script", "Command"],
106
+ Object.entries(scripts).map(([name, cmd]) => [`\`${name}\``, `\`${cmd}\``]),
107
+ ),
108
+ );
107
109
  lines.push("");
108
110
  return lines;
109
111
  }
@@ -222,12 +224,16 @@ export function buildNestedAgentsMd(
222
224
  if (entryPoints.length > 0) {
223
225
  lines.push("## Entry points");
224
226
  lines.push("");
225
- lines.push("| Entry point | Module |");
226
- lines.push("| --- | --- |");
227
- for (const ep of entryPoints) {
228
- const suffix = ep.name === "." ? "" : ep.name.replace(/^\.\//, "/");
229
- lines.push(`| \`${displayName}${suffix}\` | \`${ep.module}\` |`);
230
- }
227
+ // RFC-1154: emitted prettier-normal via alignMarkdownTable
228
+ lines.push(
229
+ alignMarkdownTable(
230
+ ["Entry point", "Module"],
231
+ entryPoints.map((ep) => {
232
+ const suffix = ep.name === "." ? "" : ep.name.replace(/^\.\//, "/");
233
+ return [`\`${displayName}${suffix}\``, `\`${ep.module}\``];
234
+ }),
235
+ ),
236
+ );
231
237
  lines.push("");
232
238
  }
233
239
  }
@@ -11,8 +11,8 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import { execSync } from "node:child_process";
15
- import fs from "node:fs";
14
+ import { execSync } from "../utils/sync-fs.ts";
15
+ import * as fs from "../utils/sync-fs.ts";
16
16
  import path from "node:path";
17
17
 
18
18
  /** Result of the npm-token probe (RFC-1125). */
@@ -0,0 +1,263 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ RFC-1154: managed `.prettierignore` block for forge-owned generated paths.
5
+ planPrettierignore detects whether a consumer project uses prettier (root
6
+ config file, package.json key, or existing .prettierignore) and computes the
7
+ delimited block entries — forge-synced skill dirs plus generated-artifact
8
+ globs. applyPrettierignore reconciles the block idempotently via
9
+ writeFileIfChanged; everything outside the delimited markers stays
10
+ operator-owned.
11
+ </purpose>
12
+ <non-goals>
13
+ <item>Do not detect prettier outside the project root — nested-only configs are out of scope (documented limitation).</item>
14
+ <item>Do not touch consumer entries outside the delimited block — the rest of the file is operator-owned.</item>
15
+ <item>Do not list unmarked skill dirs — .agents/skills entries come from .forge-managed markers only (AC-9).</item>
16
+ </non-goals>
17
+ <KEY_DECISIONS>
18
+ <item>Skill entries enumerate dirs carrying a .forge-managed marker — block membership equals the forge-owned set.</item>
19
+ <item>Unbalanced markers treat the file as operator-owned; a fresh block is appended, never merged.</item>
20
+ </KEY_DECISIONS>
21
+ </MODULE_CONTRACT>
22
+ <CHANGE_SUMMARY>
23
+ <item>RFC-1154: initial implementation — plan/apply + delimited-block reconcile.</item>
24
+ </CHANGE_SUMMARY>
25
+ */
26
+
27
+ import path from "node:path";
28
+ import type { WorkspaceIO } from "../types.ts";
29
+ import { resolveIo } from "../utils/io.ts";
30
+ import { writeFileIfChanged } from "../utils/fs-idempotent.ts";
31
+ import { fileExists } from "../utils/fs.ts";
32
+ import * as sfs from "../utils/sync-fs.ts";
33
+ import { SKILL_MARKER_FILE } from "./skill-markers.ts";
34
+
35
+ export const PRETTIERIGNORE_BLOCK_BEGIN = "# forge-managed generated paths (RFC-1154)";
36
+ export const PRETTIERIGNORE_BLOCK_END = "# end forge-managed";
37
+
38
+ /** Prettier config files probed at the project root (root-only detection). */
39
+ const PRETTIER_CONFIG_NAMES = [
40
+ ".prettierrc",
41
+ ".prettierrc.json",
42
+ ".prettierrc.yml",
43
+ ".prettierrc.yaml",
44
+ ".prettierrc.js",
45
+ ".prettierrc.cjs",
46
+ ".prettierrc.mjs",
47
+ ".prettierrc.toml",
48
+ "prettier.config.js",
49
+ "prettier.config.cjs",
50
+ "prettier.config.mjs",
51
+ "prettier.config.ts",
52
+ ];
53
+
54
+ /** Non-skill generated-artifact entries, in stable order. */
55
+ const FIXED_ENTRIES = [
56
+ "**/*.generated.yaml",
57
+ "docs/sessions/",
58
+ "docs/metrics/",
59
+ "docs/queues/session-*.yaml",
60
+ ];
61
+
62
+ export interface PrettierignorePlan {
63
+ applies: boolean; // consumer uses prettier
64
+ entries: string[]; // resolved ignore entries for this workspace
65
+ fileExists: boolean;
66
+ }
67
+
68
+ export type PrettierignoreResult = "written" | "updated" | "unchanged" | "skipped";
69
+
70
+ function packageJsonUsesPrettier(pkg: Record<string, unknown>): boolean {
71
+ if (typeof pkg["prettier"] !== "undefined") return true;
72
+ for (const depKey of ["dependencies", "devDependencies"]) {
73
+ const deps = pkg[depKey];
74
+ if (deps && typeof deps === "object" && "prettier" in deps) return true;
75
+ }
76
+ return false;
77
+ }
78
+
79
+ async function detectPrettier(workspaceRoot: string, io: WorkspaceIO): Promise<boolean> {
80
+ for (const name of PRETTIER_CONFIG_NAMES) {
81
+ if (await io.exists(path.join(workspaceRoot, name))) return true;
82
+ }
83
+ const pkgPath = path.join(workspaceRoot, "package.json");
84
+ if (await io.exists(pkgPath)) {
85
+ try {
86
+ if (packageJsonUsesPrettier(JSON.parse(await io.readFile(pkgPath)))) return true;
87
+ } catch {
88
+ // Unreadable package.json — other probes still apply
89
+ }
90
+ }
91
+ return fileExists(path.join(workspaceRoot, ".prettierignore"));
92
+ }
93
+
94
+ // Sync twin for runInit (sync call path — no WorkspaceIO).
95
+ function detectPrettierSync(workspaceRoot: string): boolean {
96
+ for (const name of PRETTIER_CONFIG_NAMES) {
97
+ if (sfs.existsSync(path.join(workspaceRoot, name))) return true;
98
+ }
99
+ const pkgPath = path.join(workspaceRoot, "package.json");
100
+ if (sfs.existsSync(pkgPath)) {
101
+ try {
102
+ if (packageJsonUsesPrettier(JSON.parse(sfs.readFileSync(pkgPath, "utf8")))) return true;
103
+ } catch {
104
+ // Unreadable package.json — other probes still apply
105
+ }
106
+ }
107
+ return sfs.existsSync(path.join(workspaceRoot, ".prettierignore"));
108
+ }
109
+
110
+ /**
111
+ * Skill-dir entries derive from `.forge-managed` markers under
112
+ * `agentsSkillsDir` — marker presence is the forge-ownership proof (AC-9:
113
+ * unmarked dirs are consumer-owned and never listed).
114
+ */
115
+ async function listManagedSkillEntries(
116
+ workspaceRoot: string,
117
+ skillsDirRel: string,
118
+ io: WorkspaceIO,
119
+ ): Promise<string[]> {
120
+ const entries: string[] = [];
121
+ const absDir = path.join(workspaceRoot, skillsDirRel);
122
+ let children;
123
+ try {
124
+ children = await io.readdir(absDir);
125
+ } catch {
126
+ return entries;
127
+ }
128
+ for (const child of children) {
129
+ if (!child.isDirectory) continue;
130
+ if (await io.exists(path.join(absDir, child.name, SKILL_MARKER_FILE))) {
131
+ entries.push(`${skillsDirRel.replace(/\/+$/, "")}/${child.name}/`);
132
+ }
133
+ }
134
+ return entries.sort();
135
+ }
136
+
137
+ // Sync twin for runInit.
138
+ function listManagedSkillEntriesSync(workspaceRoot: string, skillsDirRel: string): string[] {
139
+ const entries: string[] = [];
140
+ const absDir = path.join(workspaceRoot, skillsDirRel);
141
+ let children;
142
+ try {
143
+ children = sfs.readdirSync(absDir, { withFileTypes: true });
144
+ } catch {
145
+ return entries;
146
+ }
147
+ for (const child of children) {
148
+ if (!child.isDirectory()) continue;
149
+ if (sfs.existsSync(path.join(absDir, child.name, SKILL_MARKER_FILE))) {
150
+ entries.push(`${skillsDirRel.replace(/\/+$/, "")}/${child.name}/`);
151
+ }
152
+ }
153
+ return entries.sort();
154
+ }
155
+
156
+ export async function planPrettierignore(
157
+ workspaceRoot: string,
158
+ skillsDirRel = ".agents/skills",
159
+ io?: WorkspaceIO,
160
+ ): Promise<PrettierignorePlan> {
161
+ const fio = resolveIo(io);
162
+ const applies = await detectPrettier(workspaceRoot, fio);
163
+ const skillEntries = applies
164
+ ? await listManagedSkillEntries(workspaceRoot, skillsDirRel, fio)
165
+ : [];
166
+ return {
167
+ applies,
168
+ entries: [...skillEntries, ...FIXED_ENTRIES],
169
+ fileExists: await fileExists(path.join(workspaceRoot, ".prettierignore")),
170
+ };
171
+ }
172
+
173
+ // Sync twin for runInit.
174
+ export function planPrettierignoreSync(
175
+ workspaceRoot: string,
176
+ skillsDirRel = ".agents/skills",
177
+ ): PrettierignorePlan {
178
+ const applies = detectPrettierSync(workspaceRoot);
179
+ const skillEntries = applies ? listManagedSkillEntriesSync(workspaceRoot, skillsDirRel) : [];
180
+ return {
181
+ applies,
182
+ entries: [...skillEntries, ...FIXED_ENTRIES],
183
+ fileExists: sfs.existsSync(path.join(workspaceRoot, ".prettierignore")),
184
+ };
185
+ }
186
+
187
+ function renderBlock(entries: string[]): string {
188
+ return [PRETTIERIGNORE_BLOCK_BEGIN, ...entries, PRETTIERIGNORE_BLOCK_END].join("\n");
189
+ }
190
+
191
+ /**
192
+ * Pure reconcile: compute the next `.prettierignore` content from existing
193
+ * content + managed entries. Content outside the delimited block is preserved
194
+ * verbatim; unbalanced markers cause the whole file to be treated as
195
+ * operator-owned (fresh block appended).
196
+ */
197
+ export function reconcilePrettierignoreContent(
198
+ existing: string,
199
+ entries: string[],
200
+ ): { next: string; changed: Exclude<PrettierignoreResult, "skipped"> } {
201
+ const block = renderBlock(entries);
202
+ if (existing === "") {
203
+ return { next: block + "\n", changed: "written" };
204
+ }
205
+
206
+ const beginIdx = existing.indexOf(PRETTIERIGNORE_BLOCK_BEGIN);
207
+ const endIdx = existing.indexOf(PRETTIERIGNORE_BLOCK_END);
208
+ const balanced = beginIdx !== -1 && endIdx !== -1 && endIdx > beginIdx;
209
+ if (balanced) {
210
+ const before = existing.slice(0, beginIdx);
211
+ const after = existing.slice(endIdx + PRETTIERIGNORE_BLOCK_END.length).replace(/^\r?\n/, "");
212
+ let next = before + block + (after ? "\n" + after : "");
213
+ if (!next.endsWith("\n")) next += "\n";
214
+ return { next, changed: next === existing ? "unchanged" : "updated" };
215
+ }
216
+
217
+ const next = existing.endsWith("\n")
218
+ ? existing + "\n" + block + "\n"
219
+ : existing + "\n\n" + block + "\n";
220
+ return { next, changed: "updated" };
221
+ }
222
+
223
+ /**
224
+ * Reconcile the managed block in `.prettierignore` (async/io path — used by
225
+ * forge upgrade and kernel-driven callers).
226
+ */
227
+ export async function applyPrettierignore(
228
+ workspaceRoot: string,
229
+ plan: PrettierignorePlan,
230
+ io?: WorkspaceIO,
231
+ ): Promise<PrettierignoreResult> {
232
+ if (!plan.applies) return "skipped";
233
+
234
+ const fio = resolveIo(io);
235
+ const filePath = path.join(workspaceRoot, ".prettierignore");
236
+
237
+ let existing = "";
238
+ try {
239
+ existing = await fio.readFile(filePath);
240
+ } catch {
241
+ // File absent — create containing only the managed block
242
+ }
243
+
244
+ const { next, changed } = reconcilePrettierignoreContent(existing, plan.entries);
245
+ if (changed === "unchanged") return "unchanged";
246
+ const writeResult = await writeFileIfChanged(filePath, next, fio);
247
+ return writeResult === "unchanged" ? "unchanged" : changed;
248
+ }
249
+
250
+ /** Sync twin for runInit — same contract via sync-fs. */
251
+ export function applyPrettierignoreSync(
252
+ workspaceRoot: string,
253
+ plan: PrettierignorePlan,
254
+ ): PrettierignoreResult {
255
+ if (!plan.applies) return "skipped";
256
+
257
+ const filePath = path.join(workspaceRoot, ".prettierignore");
258
+ const existing = sfs.existsSync(filePath) ? sfs.readFileSync(filePath, "utf8") : "";
259
+ const { next, changed } = reconcilePrettierignoreContent(existing, plan.entries);
260
+ if (changed === "unchanged") return "unchanged";
261
+ sfs.writeFileSync(filePath, next, "utf8");
262
+ return changed;
263
+ }
@@ -11,7 +11,7 @@
11
11
  </CHANGE_SUMMARY>
12
12
  */
13
13
 
14
- import fs from "node:fs";
14
+ import { resolveIo } from "../utils/io.ts";
15
15
  import path from "node:path";
16
16
  import { parse as parseYaml } from "yaml";
17
17
  import { stackProfileSchema } from "../profiles/stack-profile.ts";
@@ -37,6 +37,7 @@ export async function runProfileValidate(
37
37
  context: ForgeRuntimeContext,
38
38
  ): Promise<ForgeCommandResult<ProfileValidateResult>> {
39
39
  const { workspaceRoot, logger, outputFormat } = context;
40
+ const fio = resolveIo(context.io);
40
41
  const filterId = input.flags["id"] as string | undefined;
41
42
 
42
43
  const forgeRoot = context.forgeRoot ?? path.join(workspaceRoot, "packages", "forge");
@@ -44,7 +45,7 @@ export async function runProfileValidate(
44
45
 
45
46
  const profileResults: ProfileValidateResult["profiles"] = [];
46
47
 
47
- if (!fs.existsSync(profilesDir)) {
48
+ if (!(await fio.exists(profilesDir))) {
48
49
  const result: ProfileValidateResult = {
49
50
  command: "forge.profile.validate",
50
51
  valid: true,
@@ -60,12 +61,12 @@ export async function runProfileValidate(
60
61
  };
61
62
  }
62
63
 
63
- const entries = fs.readdirSync(profilesDir);
64
+ const entries = (await fio.readdir(profilesDir)).map((e) => e.name);
64
65
  for (const entry of entries) {
65
66
  if (!entry.endsWith(".yaml") || entry.startsWith(".")) continue;
66
67
 
67
68
  const profilePath = path.join(profilesDir, entry);
68
- const raw = fs.readFileSync(profilePath, "utf8");
69
+ const raw = await fio.readFile(profilePath);
69
70
 
70
71
  let parsed: unknown;
71
72
  let parseError: string | null = null;
@@ -18,9 +18,8 @@ Sweep batch 4: 73 Compass headers on headerless engine files (certification, com
18
18
  </CHANGE_SUMMARY>
19
19
  */
20
20
 
21
- import fs from "node:fs";
22
21
  import path from "node:path";
23
- import { execSync } from "node:child_process";
22
+ import { resolveIo } from "../utils/io.ts";
24
23
  import { listStackProfiles, type StackProfile } from "../profiles/stack-profile.ts";
25
24
  import { checkNpmToken, workshopNeedsWarpgogolToken } from "./npm-token-check.ts";
26
25
  import { resolveForgeRoot } from "../config/forge-config.ts";
@@ -45,6 +44,18 @@ export async function runScaffoldProject(
45
44
  context: ForgeRuntimeContext,
46
45
  ): Promise<ForgeCommandResult<ScaffoldProjectResult>> {
47
46
  const { workspaceRoot, logger, outputFormat } = context;
47
+ const fio = resolveIo(context.io);
48
+ const execCommand = async (
49
+ cmd: string,
50
+ cwd: string,
51
+ timeoutMs: number,
52
+ ): Promise<{ ok: boolean; stdout: string; stderr: string }> => {
53
+ const parts = cmd.split(/\s+/).filter(Boolean);
54
+ const res = await fio
55
+ .exec(parts[0]!, parts.slice(1), { cwd, timeoutMs })
56
+ .catch((err: Error) => ({ exitCode: null, stdout: "", stderr: String(err) }));
57
+ return { ok: res.exitCode === 0, stdout: res.stdout, stderr: res.stderr };
58
+ };
48
59
  const profileId = input.flags["profile"] as string | undefined;
49
60
  const projectName = input.flags["name"] as string | undefined;
50
61
  const templateId = input.flags["template"] as string | undefined;
@@ -98,16 +109,16 @@ export async function runScaffoldProject(
98
109
  // Create workspace directories
99
110
  for (const dir of profile.workspace.dirs) {
100
111
  const dirPath = path.join(workspaceRoot, dir);
101
- fs.mkdirSync(dirPath, { recursive: true });
112
+ await fio.mkdir(dirPath);
102
113
  created.push(`${dir}/`);
103
114
  }
104
115
 
105
116
  // Create workspace files (with __PROJECT_NAME__ placeholder replacement)
106
117
  for (const file of profile.workspace.files) {
107
118
  const filePath = path.join(workspaceRoot, file.path);
108
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
119
+ await fio.mkdir(path.dirname(filePath));
109
120
  const content = file.content.replace(/__PROJECT_NAME__/g, effectiveProjectName);
110
- fs.writeFileSync(filePath, content, "utf8");
121
+ await fio.writeFile(filePath, content);
111
122
  created.push(file.path);
112
123
  }
113
124
 
@@ -117,13 +128,13 @@ export async function runScaffoldProject(
117
128
  // Profiles may already include .npmrc in workspace.files — append the setting if missing.
118
129
  const npmrcPath = path.join(workspaceRoot, ".npmrc");
119
130
  if (profile.install.length > 0) {
120
- if (fs.existsSync(npmrcPath)) {
121
- const existing = fs.readFileSync(npmrcPath, "utf8");
131
+ if (await fio.exists(npmrcPath)) {
132
+ const existing = await fio.readFile(npmrcPath);
122
133
  if (!existing.includes("ignore-workspace-root-check=true")) {
123
- fs.appendFileSync(npmrcPath, "ignore-workspace-root-check=true\n", "utf8");
134
+ await fio.appendFile(npmrcPath, "ignore-workspace-root-check=true\n");
124
135
  }
125
136
  } else {
126
- fs.writeFileSync(npmrcPath, "ignore-workspace-root-check=true\n", "utf8");
137
+ await fio.writeFile(npmrcPath, "ignore-workspace-root-check=true\n");
127
138
  created.push(".npmrc");
128
139
  }
129
140
  }
@@ -152,17 +163,17 @@ export async function runScaffoldProject(
152
163
  if (effectiveFirstWorkspace) {
153
164
  const wsPath = effectiveFirstWorkspace.path.replace("my-site", effectiveProjectName).replace("my-game", effectiveProjectName);
154
165
  const wsDir = path.join(workspaceRoot, wsPath);
155
- fs.mkdirSync(wsDir, { recursive: true });
166
+ await fio.mkdir(wsDir);
156
167
  created.push(`${wsPath}/`);
157
168
 
158
169
  for (const file of effectiveFirstWorkspace.files) {
159
170
  const filePath = path.join(wsDir, file.path);
160
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
171
+ await fio.mkdir(path.dirname(filePath));
161
172
  // Replace placeholder names (quoted and bare)
162
173
  const content = file.content
163
174
  .replace(/my-site/g, effectiveProjectName)
164
175
  .replace(/my-game/g, effectiveProjectName);
165
- fs.writeFileSync(filePath, content, "utf8");
176
+ await fio.writeFile(filePath, content);
166
177
  created.push(`${wsPath}/${file.path}`);
167
178
  }
168
179
  }
@@ -186,16 +197,17 @@ export async function runScaffoldProject(
186
197
  if (outputFormat === "pretty") {
187
198
  logger.info(`Running: ${cmd}`);
188
199
  }
189
- try {
190
- execSync(cmd, { cwd: workspaceRoot, stdio: "pipe", timeout: 60000 });
200
+ const res = await execCommand(cmd, workspaceRoot, 60000);
201
+ if (res.ok) {
191
202
  installLog.push(`${cmd} — ok`);
192
203
  if (outputFormat === "pretty") {
193
204
  logger.success(`Finished: ${cmd}`);
194
205
  }
195
- } catch (err) {
196
- const stderr = String((err as { stderr?: Buffer }).stderr ?? "").trim();
197
- const stdout = String((err as { stdout?: Buffer }).stdout ?? "").trim();
198
- const details = [stderr, stdout].filter(Boolean).join("\n");
206
+ if (outputFormat === "pretty") {
207
+ logger.success(`Finished: ${cmd}`);
208
+ }
209
+ } else {
210
+ const details = [res.stderr.trim(), res.stdout.trim()].filter(Boolean).join("\n");
199
211
  // pnpm v10 exits non-zero for ERR_PNPM_IGNORED_BUILDS even when install succeeded
200
212
  if (details.includes("ERR_PNPM_IGNORED_BUILDS")) {
201
213
  installLog.push(`${cmd} — ok (build scripts ignored)`);
@@ -203,7 +215,7 @@ export async function runScaffoldProject(
203
215
  logger.success(`Finished: ${cmd} (build scripts ignored — run 'pnpm approve-builds' later)`);
204
216
  }
205
217
  } else {
206
- installLog.push(`${cmd} — FAILED: ${details || (err as Error).message}`);
218
+ installLog.push(`${cmd} — FAILED: ${details || "non-zero exit"}`);
207
219
  if (outputFormat === "pretty") {
208
220
  logger.warn(`Install failed (non-fatal): ${cmd}`);
209
221
  if (details) logger.warn(details);
@@ -224,16 +236,14 @@ export async function runScaffoldProject(
224
236
  if (outputFormat === "pretty") {
225
237
  logger.info(`Running: ${cmd}`);
226
238
  }
227
- try {
228
- execSync(cmd, { cwd: wsDir, stdio: "pipe", timeout: 60000 });
239
+ const res2 = await execCommand(cmd, wsDir, 60000);
240
+ if (res2.ok) {
229
241
  installLog.push(`${cmd} — ok`);
230
242
  if (outputFormat === "pretty") {
231
243
  logger.success(`Finished: ${cmd}`);
232
244
  }
233
- } catch (err) {
234
- const stderr = String((err as { stderr?: Buffer }).stderr ?? "").trim();
235
- const stdout = String((err as { stdout?: Buffer }).stdout ?? "").trim();
236
- const details = [stderr, stdout].filter(Boolean).join("\n");
245
+ } else {
246
+ const details = [res2.stderr.trim(), res2.stdout.trim()].filter(Boolean).join("\n");
237
247
  // pnpm v10 exits non-zero for ERR_PNPM_IGNORED_BUILDS even when install succeeded
238
248
  if (details.includes("ERR_PNPM_IGNORED_BUILDS")) {
239
249
  installLog.push(`${cmd} — ok (build scripts ignored)`);
@@ -241,7 +251,7 @@ export async function runScaffoldProject(
241
251
  logger.success(`Finished: ${cmd} (build scripts ignored — run 'pnpm approve-builds' later)`);
242
252
  }
243
253
  } else {
244
- errors.push(`Install step failed: ${cmd}\n${details || (err as Error).message}`);
254
+ errors.push(`Install step failed: ${cmd}\n${details || "non-zero exit"}`);
245
255
  if (outputFormat === "pretty") {
246
256
  logger.error(`Install failed: ${cmd}`);
247
257
  if (details) logger.error(details);
@@ -262,7 +272,8 @@ export async function runScaffoldProject(
262
272
  if (outputFormat === "pretty") {
263
273
  logger.info("Formatting generated files with prettier...");
264
274
  }
265
- execSync("npx prettier --write .", { cwd: workspaceRoot, stdio: "pipe", timeout: 30000 });
275
+ const res3 = await execCommand("npx prettier --write .", workspaceRoot, 30000);
276
+ if (!res3.ok) throw new Error(res3.stderr || "prettier failed");
266
277
  installLog.push("prettier --write . — ok");
267
278
  if (outputFormat === "pretty") {
268
279
  logger.success("Formatting complete.");
@@ -10,7 +10,7 @@
10
10
  </CHANGE_SUMMARY>
11
11
  */
12
12
 
13
- import fs from "node:fs";
13
+ import * as fs from "../utils/sync-fs.ts";
14
14
  import path from "node:path";
15
15
  import { FORGE_SKILLS } from "../registry.ts";
16
16
  import { resolveForgeRoot } from "../config/forge-config.ts";