@warpgogol/forge 5.2.3 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/AGENTS.md +34 -2
  2. package/README.md +1 -1
  3. package/README.uk.md +8 -8
  4. package/bin/cli.ts +1 -0
  5. package/dist/bin/cli.js +1 -0
  6. package/dist/bin/cli.js.map +1 -1
  7. package/dist/os/adr/adr.module.d.ts.map +1 -1
  8. package/dist/os/adr/adr.module.js +8 -3
  9. package/dist/os/adr/adr.module.js.map +1 -1
  10. package/dist/os/adr/frontmatter-io.js +5 -5
  11. package/dist/os/adr/frontmatter-io.js.map +1 -1
  12. package/dist/os/adr/handlers/archive.d.ts.map +1 -1
  13. package/dist/os/adr/handlers/archive.js +10 -4
  14. package/dist/os/adr/handlers/archive.js.map +1 -1
  15. package/dist/os/adr/handlers/implement-stamp.d.ts.map +1 -1
  16. package/dist/os/adr/handlers/implement-stamp.js +10 -9
  17. package/dist/os/adr/handlers/implement-stamp.js.map +1 -1
  18. package/dist/os/adr/handlers/list-create.js +5 -5
  19. package/dist/os/adr/handlers/list-create.js.map +1 -1
  20. package/dist/os/adr/handlers/validate.js +1 -1
  21. package/dist/os/adr/handlers/validate.js.map +1 -1
  22. package/dist/os/audit/audit.module.js +3 -3
  23. package/dist/os/audit/audit.module.js.map +1 -1
  24. package/dist/os/audit/frontmatter-io.js +5 -5
  25. package/dist/os/audit/frontmatter-io.js.map +1 -1
  26. package/dist/os/audit/handlers/archive.d.ts.map +1 -1
  27. package/dist/os/audit/handlers/archive.js +10 -4
  28. package/dist/os/audit/handlers/archive.js.map +1 -1
  29. package/dist/os/compass/compass.module.d.ts.map +1 -1
  30. package/dist/os/compass/compass.module.js +17 -1
  31. package/dist/os/compass/compass.module.js.map +1 -1
  32. package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
  33. package/dist/os/compass/handlers/compass-audit-handler.js +12 -5
  34. package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
  35. package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -1
  36. package/dist/os/compass/handlers/compass-change-summary-handler.js +3 -2
  37. package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -1
  38. package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
  39. package/dist/os/compass/handlers/compass-inventory-handler.js +6 -4
  40. package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
  41. package/dist/os/compass/handlers/compass-inventory.d.ts.map +1 -1
  42. package/dist/os/compass/handlers/compass-inventory.js +10 -8
  43. package/dist/os/compass/handlers/compass-inventory.js.map +1 -1
  44. package/dist/os/compass/handlers/compass-migrate-handler.js +1 -1
  45. package/dist/os/compass/handlers/compass-migrate-handler.js.map +1 -1
  46. package/dist/os/compass/handlers/compass-migrate.d.ts.map +1 -1
  47. package/dist/os/compass/handlers/compass-migrate.js +6 -3
  48. package/dist/os/compass/handlers/compass-migrate.js.map +1 -1
  49. package/dist/os/compass/handlers/git-revision.d.ts.map +1 -1
  50. package/dist/os/compass/handlers/git-revision.js +9 -6
  51. package/dist/os/compass/handlers/git-revision.js.map +1 -1
  52. package/dist/os/compass/handlers/resolve-scan-root.js +1 -1
  53. package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -1
  54. package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
  55. package/dist/os/compass/handlers/summary-record.js +8 -4
  56. package/dist/os/compass/handlers/summary-record.js.map +1 -1
  57. package/dist/os/core/core.module.d.ts.map +1 -1
  58. package/dist/os/core/core.module.js +57 -4
  59. package/dist/os/core/core.module.js.map +1 -1
  60. package/dist/os/core/handlers/assets-helpers.d.ts.map +1 -1
  61. package/dist/os/core/handlers/assets-helpers.js +6 -3
  62. package/dist/os/core/handlers/assets-helpers.js.map +1 -1
  63. package/dist/os/core/handlers/build.js +1 -1
  64. package/dist/os/core/handlers/build.js.map +1 -1
  65. package/dist/os/core/handlers/determinism-check.d.ts.map +1 -1
  66. package/dist/os/core/handlers/determinism-check.js +10 -6
  67. package/dist/os/core/handlers/determinism-check.js.map +1 -1
  68. package/dist/os/core/handlers/dev.js +1 -1
  69. package/dist/os/core/handlers/dev.js.map +1 -1
  70. package/dist/os/core/handlers/file-size-lint.d.ts.map +1 -1
  71. package/dist/os/core/handlers/file-size-lint.js +11 -7
  72. package/dist/os/core/handlers/file-size-lint.js.map +1 -1
  73. package/dist/os/core/handlers/forge-autonomy-validate.d.ts.map +1 -1
  74. package/dist/os/core/handlers/forge-autonomy-validate.js +9 -5
  75. package/dist/os/core/handlers/forge-autonomy-validate.js.map +1 -1
  76. package/dist/os/core/handlers/knowledge-compact.js +1 -1
  77. package/dist/os/core/handlers/knowledge-compact.js.map +1 -1
  78. package/dist/os/core/handlers/package-health.js +1 -1
  79. package/dist/os/core/handlers/package-health.js.map +1 -1
  80. package/dist/os/core/handlers/pinned-check.js +2 -2
  81. package/dist/os/core/handlers/pinned-check.js.map +1 -1
  82. package/dist/os/core/handlers/pinned-init.d.ts.map +1 -1
  83. package/dist/os/core/handlers/pinned-init.js +9 -8
  84. package/dist/os/core/handlers/pinned-init.js.map +1 -1
  85. package/dist/os/core/handlers/pinned-validate.js +3 -3
  86. package/dist/os/core/handlers/pinned-validate.js.map +1 -1
  87. package/dist/os/core/handlers/profile-resolve.js +1 -1
  88. package/dist/os/core/handlers/profile-resolve.js.map +1 -1
  89. package/dist/os/core/handlers/public-surface.js +1 -1
  90. package/dist/os/core/handlers/public-surface.js.map +1 -1
  91. package/dist/os/core/handlers/release-prepare.d.ts.map +1 -1
  92. package/dist/os/core/handlers/release-prepare.js +10 -6
  93. package/dist/os/core/handlers/release-prepare.js.map +1 -1
  94. package/dist/os/core/handlers/release-publish.js +6 -6
  95. package/dist/os/core/handlers/release-publish.js.map +1 -1
  96. package/dist/os/core/handlers/validate.js +1 -1
  97. package/dist/os/core/handlers/validate.js.map +1 -1
  98. package/dist/os/exploration/exploration.module.d.ts.map +1 -1
  99. package/dist/os/exploration/exploration.module.js +1 -0
  100. package/dist/os/exploration/exploration.module.js.map +1 -1
  101. package/dist/os/exploration/frontmatter-io.js +4 -4
  102. package/dist/os/exploration/frontmatter-io.js.map +1 -1
  103. package/dist/os/exploration/handlers/archive.js +3 -3
  104. package/dist/os/exploration/handlers/archive.js.map +1 -1
  105. package/dist/os/mission/handlers/archive.d.ts.map +1 -1
  106. package/dist/os/mission/handlers/archive.js +22 -19
  107. package/dist/os/mission/handlers/archive.js.map +1 -1
  108. package/dist/os/mission/mission.module.js +3 -3
  109. package/dist/os/mission/mission.module.js.map +1 -1
  110. package/dist/os/naming/naming-convention.d.ts.map +1 -1
  111. package/dist/os/naming/naming-convention.js +7 -3
  112. package/dist/os/naming/naming-convention.js.map +1 -1
  113. package/dist/os/naming/naming.module.d.ts.map +1 -1
  114. package/dist/os/naming/naming.module.js +4 -3
  115. package/dist/os/naming/naming.module.js.map +1 -1
  116. package/dist/os/notes/notes.module.d.ts.map +1 -1
  117. package/dist/os/notes/notes.module.js +6 -3
  118. package/dist/os/notes/notes.module.js.map +1 -1
  119. package/dist/os/plan/frontmatter-io.js +5 -5
  120. package/dist/os/plan/frontmatter-io.js.map +1 -1
  121. package/dist/os/plan/handlers/archive.d.ts.map +1 -1
  122. package/dist/os/plan/handlers/archive.js +10 -4
  123. package/dist/os/plan/handlers/archive.js.map +1 -1
  124. package/dist/os/plan/plan.module.js +3 -3
  125. package/dist/os/plan/plan.module.js.map +1 -1
  126. package/dist/os/plugin/plugin.module.d.ts.map +1 -1
  127. package/dist/os/plugin/plugin.module.js +6 -3
  128. package/dist/os/plugin/plugin.module.js.map +1 -1
  129. package/dist/os/program/discovery.js +2 -2
  130. package/dist/os/program/discovery.js.map +1 -1
  131. package/dist/os/program/handlers/complete.js +1 -1
  132. package/dist/os/program/handlers/complete.js.map +1 -1
  133. package/dist/os/program/handlers/lease.js +1 -1
  134. package/dist/os/program/handlers/lease.js.map +1 -1
  135. package/dist/os/program/handlers/seal.js +1 -1
  136. package/dist/os/program/handlers/seal.js.map +1 -1
  137. package/dist/os/program/lease.js +1 -1
  138. package/dist/os/program/lease.js.map +1 -1
  139. package/dist/os/program/program.module.d.ts.map +1 -1
  140. package/dist/os/program/program.module.js +9 -3
  141. package/dist/os/program/program.module.js.map +1 -1
  142. package/dist/os/queue/index.js +1 -1
  143. package/dist/os/queue/manifest.d.ts.map +1 -1
  144. package/dist/os/queue/manifest.js +4 -8
  145. package/dist/os/queue/manifest.js.map +1 -1
  146. package/dist/os/rfc/acceptance.d.ts.map +1 -1
  147. package/dist/os/rfc/acceptance.js +10 -6
  148. package/dist/os/rfc/acceptance.js.map +1 -1
  149. package/dist/os/rfc/decision-log.d.ts.map +1 -1
  150. package/dist/os/rfc/decision-log.js +4 -3
  151. package/dist/os/rfc/decision-log.js.map +1 -1
  152. package/dist/os/rfc/dna-trace.d.ts.map +1 -1
  153. package/dist/os/rfc/dna-trace.js +7 -2
  154. package/dist/os/rfc/dna-trace.js.map +1 -1
  155. package/dist/os/rfc/frontmatter-io.js +5 -5
  156. package/dist/os/rfc/frontmatter-io.js.map +1 -1
  157. package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
  158. package/dist/os/rfc/handlers/archive.js +11 -5
  159. package/dist/os/rfc/handlers/archive.js.map +1 -1
  160. package/dist/os/rfc/handlers/check.d.ts.map +1 -1
  161. package/dist/os/rfc/handlers/check.js +6 -3
  162. package/dist/os/rfc/handlers/check.js.map +1 -1
  163. package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
  164. package/dist/os/rfc/handlers/implement-stamp.js +11 -10
  165. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
  166. package/dist/os/rfc/handlers/index-graph.js +3 -3
  167. package/dist/os/rfc/handlers/index-graph.js.map +1 -1
  168. package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
  169. package/dist/os/rfc/handlers/lifecycle.js +6 -2
  170. package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
  171. package/dist/os/rfc/handlers/list-create.d.ts.map +1 -1
  172. package/dist/os/rfc/handlers/list-create.js +7 -6
  173. package/dist/os/rfc/handlers/list-create.js.map +1 -1
  174. package/dist/os/rfc/handlers/shared.js +3 -3
  175. package/dist/os/rfc/handlers/shared.js.map +1 -1
  176. package/dist/os/rfc/handlers/supersede-propose.d.ts.map +1 -1
  177. package/dist/os/rfc/handlers/supersede-propose.js +7 -3
  178. package/dist/os/rfc/handlers/supersede-propose.js.map +1 -1
  179. package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
  180. package/dist/os/rfc/handlers/validate-rules.js +8 -5
  181. package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
  182. package/dist/os/rfc/rfc.module.d.ts.map +1 -1
  183. package/dist/os/rfc/rfc.module.js +44 -4
  184. package/dist/os/rfc/rfc.module.js.map +1 -1
  185. package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
  186. package/dist/os/rfc/verification-evidence.js +9 -5
  187. package/dist/os/rfc/verification-evidence.js.map +1 -1
  188. package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
  189. package/dist/os/rfc/verification-refresh.js +4 -3
  190. package/dist/os/rfc/verification-refresh.js.map +1 -1
  191. package/dist/os/session/frontmatter-io.js +12 -12
  192. package/dist/os/session/frontmatter-io.js.map +1 -1
  193. package/dist/os/session/handlers/archive.d.ts.map +1 -1
  194. package/dist/os/session/handlers/archive.js +10 -4
  195. package/dist/os/session/handlers/archive.js.map +1 -1
  196. package/dist/os/session/handlers/metrics-aggregate.d.ts.map +1 -1
  197. package/dist/os/session/handlers/metrics-aggregate.js +9 -5
  198. package/dist/os/session/handlers/metrics-aggregate.js.map +1 -1
  199. package/dist/os/session/handlers/metrics-rfc.d.ts.map +1 -1
  200. package/dist/os/session/handlers/metrics-rfc.js +11 -8
  201. package/dist/os/session/handlers/metrics-rfc.js.map +1 -1
  202. package/dist/os/session/handlers/metrics-session.d.ts.map +1 -1
  203. package/dist/os/session/handlers/metrics-session.js +6 -3
  204. package/dist/os/session/handlers/metrics-session.js.map +1 -1
  205. package/dist/os/session/handlers/save.d.ts.map +1 -1
  206. package/dist/os/session/handlers/save.js +14 -8
  207. package/dist/os/session/handlers/save.js.map +1 -1
  208. package/dist/os/session/session.module.d.ts.map +1 -1
  209. package/dist/os/session/session.module.js +6 -0
  210. package/dist/os/session/session.module.js.map +1 -1
  211. package/dist/os/spec/live-spec-list.js +4 -4
  212. package/dist/os/spec/live-spec-list.js.map +1 -1
  213. package/dist/os/spec/live-spec-merge.js +5 -5
  214. package/dist/os/spec/live-spec-merge.js.map +1 -1
  215. package/dist/os/spec/live-spec-show.js +3 -3
  216. package/dist/os/spec/live-spec-show.js.map +1 -1
  217. package/dist/os/spec/live-spec-validate.js +4 -4
  218. package/dist/os/spec/live-spec-validate.js.map +1 -1
  219. package/dist/os/spec/spec-materialize.js +9 -9
  220. package/dist/os/spec/spec-materialize.js.map +1 -1
  221. package/dist/os/spec/spec-status.js +9 -9
  222. package/dist/os/spec/spec-status.js.map +1 -1
  223. package/dist/os/spec/spec-validate.js +7 -7
  224. package/dist/os/spec/spec-validate.js.map +1 -1
  225. package/dist/os/spec/spec.module.d.ts.map +1 -1
  226. package/dist/os/spec/spec.module.js +8 -0
  227. package/dist/os/spec/spec.module.js.map +1 -1
  228. package/dist/os/werkstatt/handlers/lock.js +16 -16
  229. package/dist/os/werkstatt/handlers/lock.js.map +1 -1
  230. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +3 -3
  231. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -1
  232. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
  233. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +3 -2
  234. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
  235. package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
  236. package/dist/os/werkstatt/werkstatt.module.js +6 -2
  237. package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
  238. package/dist/os/workflow/handlers.d.ts.map +1 -1
  239. package/dist/os/workflow/handlers.js +8 -5
  240. package/dist/os/workflow/handlers.js.map +1 -1
  241. package/dist/os/workflow/workflow.module.d.ts.map +1 -1
  242. package/dist/os/workflow/workflow.module.js +6 -3
  243. package/dist/os/workflow/workflow.module.js.map +1 -1
  244. package/dist/src/compass/contract-registry.js +1 -1
  245. package/dist/src/compass/contract-registry.js.map +1 -1
  246. package/dist/src/config/forge-config.d.ts +10 -1
  247. package/dist/src/config/forge-config.d.ts.map +1 -1
  248. package/dist/src/config/forge-config.js +8 -1
  249. package/dist/src/config/forge-config.js.map +1 -1
  250. package/dist/src/knowledge/budgets.js +1 -1
  251. package/dist/src/knowledge/budgets.js.map +1 -1
  252. package/dist/src/knowledge/compact.js +1 -1
  253. package/dist/src/knowledge/compact.js.map +1 -1
  254. package/dist/src/knowledge/parse.js +1 -1
  255. package/dist/src/knowledge/parse.js.map +1 -1
  256. package/dist/src/knowledge/sync.d.ts.map +1 -1
  257. package/dist/src/knowledge/sync.js +3 -5
  258. package/dist/src/knowledge/sync.js.map +1 -1
  259. package/dist/src/migration-adapters/git-utils.js +2 -2
  260. package/dist/src/migration-adapters/git-utils.js.map +1 -1
  261. package/dist/src/migration-adapters/ignored-files.js +2 -2
  262. package/dist/src/migration-adapters/ignored-files.js.map +1 -1
  263. package/dist/src/migration-adapters/node-typescript-pnpm/index.js +1 -1
  264. package/dist/src/migration-adapters/node-typescript-pnpm/index.js.map +1 -1
  265. package/dist/src/migration-adapters/phaser-pnpm/index.js +1 -1
  266. package/dist/src/migration-adapters/phaser-pnpm/index.js.map +1 -1
  267. package/dist/src/onboarding/agents-generate.d.ts +2 -0
  268. package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
  269. package/dist/src/onboarding/agents-generate.js +73 -48
  270. package/dist/src/onboarding/agents-generate.js.map +1 -1
  271. package/dist/src/onboarding/create.d.ts.map +1 -1
  272. package/dist/src/onboarding/create.js +10 -10
  273. package/dist/src/onboarding/create.js.map +1 -1
  274. package/dist/src/onboarding/doctor.d.ts +6 -0
  275. package/dist/src/onboarding/doctor.d.ts.map +1 -1
  276. package/dist/src/onboarding/doctor.js +179 -61
  277. package/dist/src/onboarding/doctor.js.map +1 -1
  278. package/dist/src/onboarding/init.d.ts.map +1 -1
  279. package/dist/src/onboarding/init.js +30 -1
  280. package/dist/src/onboarding/init.js.map +1 -1
  281. package/dist/src/onboarding/invariant-engine.js +1 -1
  282. package/dist/src/onboarding/invariant-engine.js.map +1 -1
  283. package/dist/src/onboarding/memory-compact.d.ts +22 -0
  284. package/dist/src/onboarding/memory-compact.d.ts.map +1 -0
  285. package/dist/src/onboarding/memory-compact.js +148 -0
  286. package/dist/src/onboarding/memory-compact.js.map +1 -0
  287. package/dist/src/onboarding/memory-scaffold.d.ts +1 -0
  288. package/dist/src/onboarding/memory-scaffold.d.ts.map +1 -1
  289. package/dist/src/onboarding/memory-scaffold.js +2 -2
  290. package/dist/src/onboarding/memory-scaffold.js.map +1 -1
  291. package/dist/src/onboarding/nested-agents-generate.d.ts +4 -1
  292. package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -1
  293. package/dist/src/onboarding/nested-agents-generate.js +35 -6
  294. package/dist/src/onboarding/nested-agents-generate.js.map +1 -1
  295. package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -1
  296. package/dist/src/onboarding/nested-agents-templates.js +8 -12
  297. package/dist/src/onboarding/nested-agents-templates.js.map +1 -1
  298. package/dist/src/onboarding/npm-token-check.js +2 -2
  299. package/dist/src/onboarding/npm-token-check.js.map +1 -1
  300. package/dist/src/onboarding/prettierignore.d.ts +29 -0
  301. package/dist/src/onboarding/prettierignore.d.ts.map +1 -0
  302. package/dist/src/onboarding/prettierignore.js +231 -0
  303. package/dist/src/onboarding/prettierignore.js.map +1 -0
  304. package/dist/src/onboarding/profile-validate.d.ts.map +1 -1
  305. package/dist/src/onboarding/profile-validate.js +5 -4
  306. package/dist/src/onboarding/profile-validate.js.map +1 -1
  307. package/dist/src/onboarding/scaffold-project.d.ts.map +1 -1
  308. package/dist/src/onboarding/scaffold-project.js +35 -27
  309. package/dist/src/onboarding/scaffold-project.js.map +1 -1
  310. package/dist/src/onboarding/scaffold.js +1 -1
  311. package/dist/src/onboarding/scaffold.js.map +1 -1
  312. package/dist/src/onboarding/skill-markers.d.ts +27 -0
  313. package/dist/src/onboarding/skill-markers.d.ts.map +1 -0
  314. package/dist/src/onboarding/skill-markers.js +131 -0
  315. package/dist/src/onboarding/skill-markers.js.map +1 -0
  316. package/dist/src/onboarding/upgrade.d.ts +10 -0
  317. package/dist/src/onboarding/upgrade.d.ts.map +1 -1
  318. package/dist/src/onboarding/upgrade.js +215 -74
  319. package/dist/src/onboarding/upgrade.js.map +1 -1
  320. package/dist/src/onboarding/workspace-discovery.d.ts +1 -1
  321. package/dist/src/onboarding/workspace-discovery.d.ts.map +1 -1
  322. package/dist/src/onboarding/workspace-discovery.js +15 -3
  323. package/dist/src/onboarding/workspace-discovery.js.map +1 -1
  324. package/dist/src/pipeline-status.d.ts +6 -5
  325. package/dist/src/pipeline-status.d.ts.map +1 -1
  326. package/dist/src/pipeline-status.js +24 -19
  327. package/dist/src/pipeline-status.js.map +1 -1
  328. package/dist/src/profiles/stack-profile.js +1 -1
  329. package/dist/src/profiles/stack-profile.js.map +1 -1
  330. package/dist/src/registry.d.ts +1 -1
  331. package/dist/src/registry.d.ts.map +1 -1
  332. package/dist/src/registry.js +3 -3
  333. package/dist/src/registry.js.map +1 -1
  334. package/dist/src/skill-schema.d.ts +1 -1
  335. package/dist/src/skill-schema.d.ts.map +1 -1
  336. package/dist/src/skill-schema.js +4 -1
  337. package/dist/src/skill-schema.js.map +1 -1
  338. package/dist/src/types.d.ts +116 -0
  339. package/dist/src/types.d.ts.map +1 -1
  340. package/dist/src/utils/editable-region.d.ts +46 -0
  341. package/dist/src/utils/editable-region.d.ts.map +1 -0
  342. package/dist/src/utils/editable-region.js +125 -0
  343. package/dist/src/utils/editable-region.js.map +1 -0
  344. package/dist/src/utils/fs-idempotent.d.ts +2 -1
  345. package/dist/src/utils/fs-idempotent.d.ts.map +1 -1
  346. package/dist/src/utils/fs-idempotent.js +11 -7
  347. package/dist/src/utils/fs-idempotent.js.map +1 -1
  348. package/dist/src/utils/generated-marker.d.ts +17 -0
  349. package/dist/src/utils/generated-marker.d.ts.map +1 -1
  350. package/dist/src/utils/generated-marker.js +29 -1
  351. package/dist/src/utils/generated-marker.js.map +1 -1
  352. package/dist/src/utils/index.d.ts +3 -1
  353. package/dist/src/utils/index.d.ts.map +1 -1
  354. package/dist/src/utils/index.js +3 -1
  355. package/dist/src/utils/index.js.map +1 -1
  356. package/dist/src/utils/io.d.ts +9 -0
  357. package/dist/src/utils/io.d.ts.map +1 -0
  358. package/dist/src/utils/io.js +130 -0
  359. package/dist/src/utils/io.js.map +1 -0
  360. package/dist/src/utils/markdown-table.d.ts +21 -0
  361. package/dist/src/utils/markdown-table.d.ts.map +1 -0
  362. package/dist/src/utils/markdown-table.js +116 -0
  363. package/dist/src/utils/markdown-table.js.map +1 -0
  364. package/dist/src/utils/sync-fs.d.ts +5 -0
  365. package/dist/src/utils/sync-fs.d.ts.map +1 -0
  366. package/dist/src/utils/sync-fs.js +26 -0
  367. package/dist/src/utils/sync-fs.js.map +1 -0
  368. package/dist/src/validators/note-frontmatter-validate.js +1 -1
  369. package/dist/src/validators/note-frontmatter-validate.js.map +1 -1
  370. package/dist/src/validators/note-link-validate.js +1 -1
  371. package/dist/src/validators/note-link-validate.js.map +1 -1
  372. package/dist/src/validators/note-orphan-detect.js +1 -1
  373. package/dist/src/validators/note-orphan-detect.js.map +1 -1
  374. package/dist/src/validators/port-validate.js +1 -1
  375. package/dist/src/validators/port-validate.js.map +1 -1
  376. package/dist/src/validators/skill-validate.d.ts.map +1 -1
  377. package/dist/src/validators/skill-validate.js +34 -13
  378. package/dist/src/validators/skill-validate.js.map +1 -1
  379. package/docs/reference/forge-yaml.md +12 -0
  380. package/os/adr/adr.module.ts +136 -132
  381. package/os/adr/frontmatter-io.ts +5 -5
  382. package/os/adr/handlers/archive.ts +8 -4
  383. package/os/adr/handlers/implement-stamp.ts +14 -9
  384. package/os/adr/handlers/list-create.ts +5 -5
  385. package/os/adr/handlers/validate.ts +1 -1
  386. package/os/audit/audit.module.ts +33 -34
  387. package/os/audit/frontmatter-io.ts +5 -5
  388. package/os/audit/handlers/archive.ts +8 -4
  389. package/os/compass/compass.module.ts +17 -1
  390. package/os/compass/handlers/compass-audit-handler.ts +13 -5
  391. package/os/compass/handlers/compass-change-summary-handler.ts +4 -2
  392. package/os/compass/handlers/compass-inventory-handler.ts +7 -4
  393. package/os/compass/handlers/compass-inventory.ts +11 -8
  394. package/os/compass/handlers/compass-migrate-handler.ts +1 -1
  395. package/os/compass/handlers/compass-migrate.ts +7 -3
  396. package/os/compass/handlers/git-revision.ts +11 -6
  397. package/os/compass/handlers/resolve-scan-root.ts +1 -1
  398. package/os/compass/handlers/summary-record.ts +10 -4
  399. package/os/compass/handlers/tests/compass-audit-plan.test.ts +2 -1
  400. package/os/core/core.module.ts +58 -4
  401. package/os/core/handlers/assets-helpers.ts +7 -3
  402. package/os/core/handlers/build.ts +1 -1
  403. package/os/core/handlers/determinism-check.ts +12 -6
  404. package/os/core/handlers/dev.ts +1 -1
  405. package/os/core/handlers/file-size-lint.ts +16 -9
  406. package/os/core/handlers/forge-autonomy-validate.ts +10 -5
  407. package/os/core/handlers/knowledge-compact.ts +1 -1
  408. package/os/core/handlers/package-health.ts +1 -1
  409. package/os/core/handlers/pinned-check.ts +2 -2
  410. package/os/core/handlers/pinned-init.ts +9 -8
  411. package/os/core/handlers/pinned-validate.ts +3 -3
  412. package/os/core/handlers/profile-resolve.ts +1 -1
  413. package/os/core/handlers/public-surface.ts +1 -1
  414. package/os/core/handlers/release-prepare.ts +11 -6
  415. package/os/core/handlers/release-publish.ts +6 -6
  416. package/os/core/handlers/validate.ts +1 -1
  417. package/os/exploration/exploration.module.ts +1 -0
  418. package/os/exploration/frontmatter-io.ts +4 -4
  419. package/os/exploration/handlers/archive.ts +3 -3
  420. package/os/mission/handlers/archive.ts +27 -19
  421. package/os/mission/mission.module.ts +38 -39
  422. package/os/naming/naming-convention.ts +9 -3
  423. package/os/naming/naming.module.ts +25 -25
  424. package/os/notes/notes.module.ts +87 -85
  425. package/os/plan/frontmatter-io.ts +5 -5
  426. package/os/plan/handlers/archive.ts +8 -4
  427. package/os/plan/plan.module.ts +33 -34
  428. package/os/plugin/plugin.module.ts +8 -6
  429. package/os/program/discovery.ts +2 -2
  430. package/os/program/handlers/complete.ts +1 -1
  431. package/os/program/handlers/lease.ts +1 -1
  432. package/os/program/handlers/seal.ts +1 -1
  433. package/os/program/lease.ts +1 -1
  434. package/os/program/program.module.ts +198 -193
  435. package/os/queue/index.ts +1 -1
  436. package/os/queue/manifest.ts +10 -9
  437. package/os/queue/queue-validate.test.ts +6 -15
  438. package/os/rfc/acceptance.ts +12 -6
  439. package/os/rfc/decision-log.ts +4 -3
  440. package/os/rfc/dna-trace.ts +8 -2
  441. package/os/rfc/frontmatter-io.ts +5 -5
  442. package/os/rfc/handlers/archive.ts +9 -5
  443. package/os/rfc/handlers/check.ts +5 -3
  444. package/os/rfc/handlers/implement-stamp.ts +15 -10
  445. package/os/rfc/handlers/index-graph.ts +3 -3
  446. package/os/rfc/handlers/lifecycle.ts +7 -2
  447. package/os/rfc/handlers/list-create.ts +7 -6
  448. package/os/rfc/handlers/shared.ts +3 -3
  449. package/os/rfc/handlers/supersede-propose.ts +8 -3
  450. package/os/rfc/handlers/validate-rules-rfc1006.test.ts +18 -6
  451. package/os/rfc/handlers/validate-rules.ts +10 -5
  452. package/os/rfc/rfc-create-concurrent.test.ts +11 -3
  453. package/os/rfc/rfc.module.ts +413 -374
  454. package/os/rfc/verification-evidence.ts +11 -5
  455. package/os/rfc/verification-refresh.ts +4 -3
  456. package/os/session/frontmatter-io.ts +14 -14
  457. package/os/session/handlers/archive.ts +8 -4
  458. package/os/session/handlers/metrics-aggregate.ts +34 -13
  459. package/os/session/handlers/metrics-rfc.ts +13 -8
  460. package/os/session/handlers/metrics-session.ts +7 -3
  461. package/os/session/handlers/save.ts +12 -8
  462. package/os/session/session.module.ts +6 -0
  463. package/os/spec/live-spec-list.ts +4 -4
  464. package/os/spec/live-spec-merge.ts +5 -5
  465. package/os/spec/live-spec-show.ts +3 -3
  466. package/os/spec/live-spec-validate.ts +4 -4
  467. package/os/spec/spec-materialize.ts +9 -9
  468. package/os/spec/spec-status.ts +9 -9
  469. package/os/spec/spec-validate.ts +7 -7
  470. package/os/spec/spec.module.ts +8 -0
  471. package/os/werkstatt/handlers/lock.ts +16 -16
  472. package/os/werkstatt/handlers/werkstatt-lock-recover.ts +3 -3
  473. package/os/werkstatt/handlers/werkstatt-operation-validate.ts +4 -2
  474. package/os/werkstatt/werkstatt.module.ts +8 -5
  475. package/os/workflow/handlers.ts +7 -5
  476. package/os/workflow/workflow.module.ts +45 -44
  477. package/package.json +1 -1
  478. package/profiles/forge-shell.yaml +3 -0
  479. package/profiles/godot-game.yaml +3 -0
  480. package/profiles/phaser-game.yaml +3 -0
  481. package/profiles/site-workshop.yaml +567 -564
  482. package/skills/fo/fo-add-tests/SKILL.md +2 -2
  483. package/skills/fo/fo-architecture/SKILL.md +2 -2
  484. package/skills/fo/fo-compass-annotate/SKILL.md +2 -2
  485. package/skills/fo/fo-design-summit/SKILL.md +2 -2
  486. package/skills/fo/fo-doc-audit/SKILL.md +2 -2
  487. package/skills/fo/fo-explore/SKILL.md +2 -2
  488. package/skills/fo/fo-extract-dna/SKILL.md +2 -2
  489. package/skills/fo/fo-fix/SKILL.md +2 -2
  490. package/skills/fo/fo-handoff/SKILL.md +2 -2
  491. package/skills/fo/fo-harvest/SKILL.md +2 -2
  492. package/skills/fo/fo-idea/SKILL.md +2 -2
  493. package/skills/fo/fo-idea-audit/SKILL.md +2 -2
  494. package/skills/fo/fo-idea-create-adr/SKILL.md +3 -3
  495. package/skills/fo/fo-idea-create-rfc/SKILL.md +3 -3
  496. package/skills/fo/fo-idea-enhance/SKILL.md +2 -2
  497. package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +2 -2
  498. package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +1 -1
  499. package/skills/fo/fo-idea-implement/SKILL.md +2 -2
  500. package/skills/fo/fo-idea-plan/SKILL.md +2 -2
  501. package/skills/fo/fo-idea-status/SKILL.md +2 -2
  502. package/skills/fo/fo-knowledge-distill/SKILL.md +2 -2
  503. package/skills/fo/fo-memory-sync/SKILL.md +2 -2
  504. package/skills/fo/fo-qa/SKILL.md +2 -2
  505. package/skills/fo/fo-review/SKILL.md +2 -2
  506. package/skills/fo/fo-session-retro/SKILL.md +2 -2
  507. package/skills/fo/fo-session-save/SKILL.md +2 -2
  508. package/skills/fo/fo-spec-ingest/SKILL.md +2 -2
  509. package/skills/fo/fo-step-commit/SKILL.md +1 -1
  510. package/skills/fo/fo-triage/SKILL.md +2 -2
  511. package/skills/meta/forge-bootstrap/SKILL.md +1 -1
  512. package/skills/meta/port-to-forge/SKILL.md +1 -1
  513. package/skills/meta/skill-create/SKILL.md +1 -1
  514. package/skills/shared/grilling/SKILL.md +1 -1
  515. package/skills/shared/grilling/learned-principles.archive.md +17 -0
  516. package/skills/shared/grilling/learned-principles.md +0 -1
  517. package/skills/shared/knowledge/learned-principles.md +6 -0
  518. package/skills/shared/my-preferences/SKILL.md +1 -1
  519. package/skills/shared/windows-ai-tooling/SKILL.md +1 -1
  520. package/skills/shared/writing-great-skills/SKILL.md +1 -1
  521. package/src/compass/contract-registry.ts +1 -1
  522. package/src/config/forge-config.ts +12 -1
  523. package/src/knowledge/__tests__/sync.test.ts +2 -7
  524. package/src/knowledge/budgets.ts +1 -1
  525. package/src/knowledge/compact.ts +1 -1
  526. package/src/knowledge/parse.ts +1 -1
  527. package/src/knowledge/sync.ts +3 -5
  528. package/src/migration-adapters/git-utils.ts +2 -2
  529. package/src/migration-adapters/ignored-files.ts +2 -2
  530. package/src/migration-adapters/node-typescript-pnpm/index.ts +1 -1
  531. package/src/migration-adapters/phaser-pnpm/index.ts +1 -1
  532. package/src/onboarding/agents-generate.ts +91 -50
  533. package/src/onboarding/create.ts +10 -10
  534. package/src/onboarding/doctor.ts +199 -59
  535. package/src/onboarding/init.ts +38 -1
  536. package/src/onboarding/invariant-engine.ts +1 -1
  537. package/src/onboarding/memory-compact.ts +189 -0
  538. package/src/onboarding/memory-scaffold.ts +2 -2
  539. package/src/onboarding/nested-agents-generate.ts +50 -5
  540. package/src/onboarding/nested-agents-templates.ts +19 -13
  541. package/src/onboarding/npm-token-check.ts +2 -2
  542. package/src/onboarding/prettierignore.ts +263 -0
  543. package/src/onboarding/profile-validate.ts +5 -4
  544. package/src/onboarding/scaffold-project.ts +38 -27
  545. package/src/onboarding/scaffold.ts +1 -1
  546. package/src/onboarding/skill-markers.ts +162 -0
  547. package/src/onboarding/templates/behavioral-layer-core.md +2 -4
  548. package/src/onboarding/upgrade.ts +285 -89
  549. package/src/onboarding/workspace-discovery.ts +16 -2
  550. package/src/pipeline-status.test.ts +1 -4
  551. package/src/pipeline-status.ts +30 -13
  552. package/src/profiles/stack-profile.ts +1 -1
  553. package/src/registry.ts +4 -4
  554. package/src/skill-schema.ts +4 -1
  555. package/src/tests/acceptance-probe-kinds.test.ts +5 -15
  556. package/src/tests/agents-generate.test.ts +32 -7
  557. package/src/tests/contract-registry.test.ts +12 -6
  558. package/src/tests/doctor-dist-freshness.test.ts +110 -0
  559. package/src/tests/doctor-fix.test.ts +142 -0
  560. package/src/tests/doctor-nested-agents.test.ts +160 -0
  561. package/src/tests/editable-generated-region.test.ts +231 -0
  562. package/src/tests/file-size-lint.test.ts +8 -12
  563. package/src/tests/fixtures/agents-generate-business-before.txt +54 -54
  564. package/src/tests/markdown-table.test.ts +107 -0
  565. package/src/tests/memory-compact.test.ts +143 -0
  566. package/src/tests/prettierignore-manage.test.ts +134 -0
  567. package/src/tests/skill-agents-sync.test.ts +168 -0
  568. package/src/tests/skill-sync-marker.test.ts +134 -0
  569. package/src/tests/skill-validate.test.ts +12 -5
  570. package/src/tests/upgrade.test.ts +87 -41
  571. package/src/tests/workspace-discovery.test.ts +28 -0
  572. package/src/types.ts +123 -0
  573. package/src/utils/editable-region.ts +156 -0
  574. package/src/utils/fs-idempotent.ts +12 -6
  575. package/src/utils/generated-marker.ts +36 -2
  576. package/src/utils/index.ts +17 -0
  577. package/src/utils/io.ts +143 -0
  578. package/src/utils/markdown-table.ts +121 -0
  579. package/src/utils/sync-fs.ts +43 -0
  580. package/src/validators/note-frontmatter-validate.ts +1 -1
  581. package/src/validators/note-link-validate.ts +1 -1
  582. package/src/validators/note-orphan-detect.ts +1 -1
  583. package/src/validators/port-validate.ts +1 -1
  584. package/src/validators/skill-validate.ts +38 -13
@@ -0,0 +1,160 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Unit tests for the nested-AGENTS.md doctor check — consumer-declared
4
+ workspace discovery exclusions via bindings.workspaces.skipDirs (RFC-1150).</purpose>
5
+ </MODULE_CONTRACT>
6
+ <CHANGE_SUMMARY>
7
+ <item>RFC-1150: initial nested-AGENTS.md skipDirs tests.</item>
8
+ </CHANGE_SUMMARY>
9
+ */
10
+
11
+ import { test, expect, beforeEach, afterEach } from "vitest";
12
+ import { mkdtemp, rm, mkdir, writeFile, appendFile } from "node:fs/promises";
13
+ import { tmpdir } from "node:os";
14
+ import { join } from "node:path";
15
+ import { runDoctor } from "../onboarding/doctor.ts";
16
+ import { generateNestedAgentsMd } from "../onboarding/nested-agents-generate.ts";
17
+ import { buildGeneratedHeader } from "../utils/index.ts";
18
+ import { loadForgeConfig } from "../config/forge-config.ts";
19
+ import type { ForgeCommandInput, ForgeRuntimeContext } from "../types.ts";
20
+
21
+ let tempDir: string;
22
+
23
+ beforeEach(async () => {
24
+ tempDir = await mkdtemp(join(tmpdir(), "doctor-nested-test-"));
25
+ });
26
+
27
+ afterEach(async () => {
28
+ await rm(tempDir, { recursive: true, force: true });
29
+ });
30
+
31
+ function makeContext(): ForgeRuntimeContext {
32
+ return {
33
+ workspaceRoot: tempDir,
34
+ logger: {
35
+ section: () => {},
36
+ success: () => {},
37
+ warn: () => {},
38
+ error: () => {},
39
+ info: () => {},
40
+ },
41
+ dryRun: false,
42
+ outputFormat: "json",
43
+ };
44
+ }
45
+
46
+ function forgeYaml(skipDirs: string[]): string {
47
+ const skip = skipDirs.length > 0 ? `\n workspaces:\n skipDirs: [${skipDirs.join(", ")}]` : "";
48
+ return `schema: "forge/config@1"
49
+ project:
50
+ name: test-project
51
+ stack: []
52
+ packageManager: pnpm
53
+ paths:
54
+ rfcsDir: docs/rfcs
55
+ adrsDir: docs/adrs
56
+ plansDir: docs/plans
57
+ auditsDir: docs/audits
58
+ specsDir: docs/specs
59
+ skillsDir: .agents/skills
60
+ sessionsDir: docs/sessions
61
+ bindings:
62
+ schema: forge/bindings@1
63
+ commands:
64
+ validateRfc: null
65
+ validateAdr: null
66
+ implementStamp: null
67
+ typecheck: null
68
+ test: null
69
+ scopedBuild: null
70
+ specValidate: null
71
+ sessionSave: null
72
+ paths:
73
+ invariantsFile: null
74
+ compassDocs: []
75
+ reviewsDir: null
76
+ handoffsDir: null
77
+ sessionsDir: null${skip}
78
+ `;
79
+ }
80
+
81
+ test("nested-AGENTS.md check excludes dirs declared in workspaces.skipDirs", async () => {
82
+ await writeFile(join(tempDir, "forge.yaml"), forgeYaml(["builds"]), "utf8");
83
+ // Artifact dir that would otherwise be discovered as a workspace
84
+ await mkdir(join(tempDir, "builds", "out"), { recursive: true });
85
+ await writeFile(join(tempDir, "builds", "out", "package.json"), "{}");
86
+ // Real workspace without AGENTS.md — must still be reported missing
87
+ await mkdir(join(tempDir, "packages", "real-pkg"), { recursive: true });
88
+ await writeFile(join(tempDir, "packages", "real-pkg", "package.json"), "{}");
89
+
90
+ const input: ForgeCommandInput = { argv: [], flags: {} };
91
+ const result = await runDoctor(input, makeContext());
92
+
93
+ const check = result.data!.checks.find((c) => c.name === "nested-AGENTS.md");
94
+ expect(check).toBeDefined();
95
+ // missing-only reports pass (warn requires stale>0) — assert on message
96
+ expect(check!.message).toContain("packages/real-pkg");
97
+ expect(check!.message).not.toContain("builds");
98
+ });
99
+
100
+ test("nested-AGENTS.md check reports artifact dir as missing without skipDirs", async () => {
101
+ await writeFile(join(tempDir, "forge.yaml"), forgeYaml([]), "utf8");
102
+ await mkdir(join(tempDir, "builds", "out"), { recursive: true });
103
+ await writeFile(join(tempDir, "builds", "out", "package.json"), "{}");
104
+
105
+ const input: ForgeCommandInput = { argv: [], flags: {} };
106
+ const result = await runDoctor(input, makeContext());
107
+
108
+ const check = result.data!.checks.find((c) => c.name === "nested-AGENTS.md");
109
+ expect(check).toBeDefined();
110
+ expect(check!.message).toContain("builds");
111
+ });
112
+
113
+ // RFC-1153: boundary-aware staleness -----------------------------------------
114
+
115
+ test("AC-8: custom content below the forge:custom boundary reports in-sync, not stale", async () => {
116
+ await writeFile(join(tempDir, "forge.yaml"), forgeYaml([]), "utf8");
117
+ await mkdir(join(tempDir, "packages", "pkg"), { recursive: true });
118
+ await writeFile(join(tempDir, "packages", "pkg", "package.json"), '{"name":"pkg"}', "utf8");
119
+
120
+ const config = loadForgeConfig(tempDir);
121
+ await generateNestedAgentsMd(tempDir, config, false);
122
+
123
+ // Operator appends a custom section below the marker
124
+ await appendFile(
125
+ join(tempDir, "packages", "pkg", "AGENTS.md"),
126
+ "\n## Custom rules\n\n- workspace-specific note\n",
127
+ "utf8",
128
+ );
129
+
130
+ const input: ForgeCommandInput = { argv: [], flags: {} };
131
+ const result = await runDoctor(input, makeContext());
132
+
133
+ const check = result.data!.checks.find((c) => c.name === "nested-AGENTS.md");
134
+ expect(check).toBeDefined();
135
+ expect(
136
+ check!.message,
137
+ "Below-boundary divergence must not count as stale — merge(expected, actual) compares only the head",
138
+ ).not.toContain("stale");
139
+ });
140
+
141
+ test("AC-6: divergent file without a resolvable boundary reports unmapped-customization", async () => {
142
+ await writeFile(join(tempDir, "forge.yaml"), forgeYaml([]), "utf8");
143
+ await mkdir(join(tempDir, "packages", "legacy"), { recursive: true });
144
+ await writeFile(join(tempDir, "packages", "legacy", "package.json"), '{"name":"legacy"}', "utf8");
145
+ // Marker-bearing (isGenerated) file that diverges and lacks footer/forge:custom
146
+ await writeFile(
147
+ join(tempDir, "packages", "legacy", "AGENTS.md"),
148
+ `${buildGeneratedHeader({ filePath: "AGENTS.md", ownerCommand: "forge.agents.generate", editable: true })}\n# Hand-maintained\n\ndivergent body\n`,
149
+ "utf8",
150
+ );
151
+
152
+ const input: ForgeCommandInput = { argv: [], flags: {} };
153
+ const result = await runDoctor(input, makeContext());
154
+
155
+ const check = result.data!.checks.find((c) => c.name === "nested-AGENTS.md");
156
+ expect(check).toBeDefined();
157
+ expect(check!.status).toBe("warn");
158
+ expect(check!.message).toContain("unmapped-customization");
159
+ expect(check!.message).not.toContain("stale");
160
+ });
@@ -0,0 +1,231 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Unit tests for the RFC-1153 preservation boundary — splitEditableGenerated
4
+ and mergeEditableGenerated (forge:custom marker + canonical-footer fallback),
5
+ plus an integration pass through generateNestedAgentsMd on a temp workspace.</purpose>
6
+ </MODULE_CONTRACT>
7
+ <CHANGE_SUMMARY>
8
+ <item>RFC-1153: initial boundary merge tests — marker, footer fallback, fail-closed, comment styles, CRLF, integration.</item>
9
+ </CHANGE_SUMMARY>
10
+ */
11
+
12
+ import { test, expect, beforeEach, afterEach } from "vitest";
13
+ import { mkdtemp, mkdir, rm, writeFile, readFile, appendFile } from "node:fs/promises";
14
+ import { tmpdir } from "node:os";
15
+ import { join } from "node:path";
16
+ import {
17
+ splitEditableGenerated,
18
+ mergeEditableGenerated,
19
+ canonicalFooterOf,
20
+ } from "../utils/editable-region.ts";
21
+ import {
22
+ CUSTOM_BOUNDARY_HINTS,
23
+ CUSTOM_BOUNDARY_MARKERS,
24
+ buildGeneratedHeader,
25
+ } from "../utils/generated-marker.ts";
26
+ import { generateNestedAgentsMd } from "../onboarding/nested-agents-generate.ts";
27
+ import { loadForgeConfig } from "../config/forge-config.ts";
28
+
29
+ const MD = "AGENTS.md";
30
+ const MD_MARKER = CUSTOM_BOUNDARY_MARKERS["block-html"]; // <!-- forge:custom -->
31
+ const MD_HINT = CUSTOM_BOUNDARY_HINTS["block-html"];
32
+
33
+ const FOOTER = "See the root `AGENTS.md` for project-wide rules, skills, and capabilities.";
34
+
35
+ function render(body: string): string {
36
+ return `${buildGeneratedHeader({ filePath: MD, ownerCommand: "forge.agents.generate", editable: true })}\n${body}\n\n${FOOTER}\n`;
37
+ }
38
+
39
+ test("AC-1: content below the forge:custom marker is preserved byte-identical", () => {
40
+ const tail = "\n## Workspace rules\n\n- always run pnpm test first\n- custom note\n";
41
+ const existing = `${render("old body v1")}${MD_MARKER}\n${MD_HINT}\n${tail}`;
42
+ const merged = mergeEditableGenerated(render("fresh body v2"), existing, MD);
43
+ expect(merged).not.toBeNull();
44
+ // Fresh head regenerated, tail below the marker verbatim
45
+ expect(merged).toContain("fresh body v2");
46
+ expect(merged).not.toContain("old body v1");
47
+ expect(
48
+ merged!.endsWith(tail.trimStart() === tail ? tail : `\n${tail}`) || merged!.includes(tail),
49
+ ).toBe(true);
50
+ expect(merged).toContain(MD_MARKER);
51
+ });
52
+
53
+ test("marker line itself belongs to the generated head — operator-placed marker also merges", () => {
54
+ const tail = "everything below survives\n";
55
+ const existing = `hand-tuned intro\n${MD_MARKER}\n${tail}`;
56
+ const merged = mergeEditableGenerated(render("body"), existing, MD);
57
+ expect(merged).toBe(`${render("body")}${MD_MARKER}\n${MD_HINT}\n${tail}`);
58
+ });
59
+
60
+ test("AC-2: footer fallback preserves text below the canonical template footer", () => {
61
+ const tail = "\noperator-appended rules\n";
62
+ const existing = `${render("stale body")}${tail}`; // marker-less, ends with footer + tail
63
+ const merged = mergeEditableGenerated(render("new body"), existing, MD);
64
+ expect(merged).not.toBeNull();
65
+ expect(merged!.endsWith(tail)).toBe(true);
66
+ });
67
+
68
+ test("AC-3: footer-fallback merge introduces the forge:custom marker as the new boundary", () => {
69
+ const existing = `${render("body")}\ncustom tail\n`;
70
+ const merged = mergeEditableGenerated(render("body"), existing, MD);
71
+ expect(merged).toContain(MD_MARKER);
72
+ expect(merged).toContain(MD_HINT);
73
+ });
74
+
75
+ test("AC-5: footer-less marker-less divergent content returns null — caller must skip", () => {
76
+ const existing = `${buildGeneratedHeader({ filePath: MD, ownerCommand: "forge.agents.generate", editable: true })}\n# Custom\n\ntotally divergent, no footer\n`;
77
+ expect(mergeEditableGenerated(render("body"), existing, MD)).toBeNull();
78
+ });
79
+
80
+ test("identical content is a clean regeneration — marker appended for future runs", () => {
81
+ const r = render("body");
82
+ const merged = mergeEditableGenerated(r, r, MD);
83
+ expect(merged).toBe(`${r}${MD_MARKER}\n${MD_HINT}\n`);
84
+ });
85
+
86
+ test("new file (existing null) gains the boundary marker and hint", () => {
87
+ const merged = mergeEditableGenerated(render("body"), null, MD);
88
+ expect(merged).toBe(`${render("body")}${MD_MARKER}\n${MD_HINT}\n`);
89
+ });
90
+
91
+ test("AC-4: boundary marker is emitted in the comment style of the target file", () => {
92
+ for (const [file, style] of [
93
+ ["AGENTS.md", "block-html"],
94
+ ["config.ts", "line-slash"],
95
+ ["data.yaml", "line-hash"],
96
+ ["styles.css", "block-css"],
97
+ ] as const) {
98
+ const merged = mergeEditableGenerated("content\n", null, file);
99
+ expect(merged, `marker for ${file} must use ${style} comment syntax`).toContain(
100
+ CUSTOM_BOUNDARY_MARKERS[style],
101
+ );
102
+ }
103
+ });
104
+
105
+ test("CRLF input normalizes to LF and still resolves the marker boundary", () => {
106
+ const tail = "preserved tail\n";
107
+ const existing = `a\r\nb\r\n${MD_MARKER}\r\n${tail}`;
108
+ const merged = mergeEditableGenerated("fresh\n", existing, MD);
109
+ expect(merged).toBe(`fresh\n${MD_MARKER}\n${MD_HINT}\n${tail}`);
110
+ expect(merged).not.toContain("\r\n");
111
+ });
112
+
113
+ test("mid-file marker freezes everything below the first occurrence", () => {
114
+ const tail = "mid doc\nfrozen rules\n";
115
+ const existing = `intro\n${MD_MARKER}\n${tail}`;
116
+ const merged = mergeEditableGenerated(render("body"), existing, MD);
117
+ expect(merged!.endsWith(tail)).toBe(true);
118
+ });
119
+
120
+ test("forge:custom token in prose is treated as a boundary (first occurrence wins)", () => {
121
+ const existing = `notes on the forge:custom feature\nkept anyway\n`;
122
+ const split = splitEditableGenerated(existing, MD);
123
+ expect(split.boundary).toBe("marker");
124
+ expect(split.customTail).toBe("kept anyway\n");
125
+ });
126
+
127
+ test("boundary none: split returns whole content as head", () => {
128
+ const split = splitEditableGenerated("plain\nfile\n", MD, FOOTER);
129
+ expect(split.boundary).toBe("none");
130
+ expect(split.customTail).toBeNull();
131
+ });
132
+
133
+ test("canonicalFooterOf returns the last non-empty line", () => {
134
+ expect(canonicalFooterOf("a\nb\n\n\n")).toBe("b");
135
+ expect(canonicalFooterOf("x\n")).toBe("x");
136
+ });
137
+
138
+ // --- Integration through the real write path -----------------------------
139
+
140
+ let tempDir: string;
141
+
142
+ beforeEach(async () => {
143
+ tempDir = await mkdtemp(join(tmpdir(), "editable-region-it-"));
144
+ });
145
+
146
+ afterEach(async () => {
147
+ await rm(tempDir, { recursive: true, force: true });
148
+ });
149
+
150
+ const FORGE_YAML = `schema: "forge/config@1"
151
+ project:
152
+ name: test-project
153
+ stack: []
154
+ packageManager: pnpm
155
+ paths:
156
+ rfcsDir: docs/rfcs
157
+ adrsDir: docs/adrs
158
+ plansDir: docs/plans
159
+ auditsDir: docs/audits
160
+ specsDir: docs/specs
161
+ skillsDir: .agents/skills
162
+ sessionsDir: docs/sessions
163
+ bindings:
164
+ schema: forge/bindings@1
165
+ commands:
166
+ validateRfc: null
167
+ validateAdr: null
168
+ implementStamp: null
169
+ typecheck: null
170
+ test: null
171
+ scopedBuild: null
172
+ specValidate: null
173
+ sessionSave: null
174
+ paths:
175
+ invariantsFile: null
176
+ compassDocs: []
177
+ reviewsDir: null
178
+ handoffsDir: null
179
+ sessionsDir: null
180
+ `;
181
+
182
+ test("generateNestedAgentsMd regenerates the head and preserves the custom tail", async () => {
183
+ await writeFile(join(tempDir, "forge.yaml"), FORGE_YAML, "utf8");
184
+ await mkdir(join(tempDir, "packages", "pkg"), { recursive: true });
185
+ await writeFile(join(tempDir, "packages", "pkg", "package.json"), '{"name":"pkg"}', "utf8");
186
+
187
+ const config = loadForgeConfig(tempDir);
188
+
189
+ // First run — fresh file gains the marker + hint
190
+ const first = await generateNestedAgentsMd(tempDir, config, false);
191
+ expect(first.generated).toContain(join("packages", "pkg", "AGENTS.md"));
192
+ const agentsPath = join(tempDir, "packages", "pkg", "AGENTS.md");
193
+ const initial = await readFile(agentsPath, "utf8");
194
+ expect(initial).toContain(MD_MARKER);
195
+ expect(initial).toContain(MD_HINT);
196
+
197
+ // Operator appends a custom section below the boundary
198
+ await appendFile(agentsPath, "\n## Workspace rules\n\n- never touch dist/\n", "utf8");
199
+
200
+ // Second run — head regenerated, tail preserved verbatim
201
+ const second = await generateNestedAgentsMd(tempDir, config, false);
202
+ expect(second.preserved).toContain(join("packages", "pkg", "AGENTS.md"));
203
+ const merged = await readFile(agentsPath, "utf8");
204
+ expect(merged).toContain("## Workspace rules");
205
+ expect(merged).toContain("- never touch dist/");
206
+ // Boundary sits between generated head and custom tail
207
+ expect(merged.indexOf(MD_MARKER)).toBeLessThan(merged.indexOf("## Workspace rules"));
208
+ });
209
+
210
+ test("generateNestedAgentsMd skips a divergent file without a resolvable boundary", async () => {
211
+ await writeFile(join(tempDir, "forge.yaml"), FORGE_YAML, "utf8");
212
+ await mkdir(join(tempDir, "packages", "legacy"), { recursive: true });
213
+ await writeFile(join(tempDir, "packages", "legacy", "package.json"), '{"name":"legacy"}', "utf8");
214
+ // Marker-bearing (isGenerated) file whose body diverges and lacks the footer
215
+ await writeFile(
216
+ join(tempDir, "packages", "legacy", "AGENTS.md"),
217
+ `${buildGeneratedHeader({ filePath: "AGENTS.md", ownerCommand: "forge.agents.generate", editable: true })}\n# Hand-maintained\n\ndivergent body\n`,
218
+ "utf8",
219
+ );
220
+
221
+ const config = loadForgeConfig(tempDir);
222
+ const result = await generateNestedAgentsMd(tempDir, config, false);
223
+ const skippedEntry = result.skipped.find((s) => s.includes("legacy"));
224
+ expect(
225
+ skippedEntry,
226
+ "Divergent file without forge:custom/footer boundary must be skipped as unmapped-customization",
227
+ ).toContain("unmapped-customization");
228
+ // File untouched
229
+ const content = await readFile(join(tempDir, "packages", "legacy", "AGENTS.md"), "utf8");
230
+ expect(content).toContain("divergent body");
231
+ });
@@ -31,7 +31,10 @@ function mockContext(workspaceRoot: string): ForgeRuntimeContext {
31
31
  };
32
32
  }
33
33
 
34
- function input(flags: Record<string, unknown> = {}): { argv: string[]; flags: Record<string, unknown> } {
34
+ function input(flags: Record<string, unknown> = {}): {
35
+ argv: string[];
36
+ flags: Record<string, unknown>;
37
+ } {
35
38
  return { argv: [], flags };
36
39
  }
37
40
 
@@ -108,16 +111,10 @@ describe("runFileSizeLint (RFC-1088, command-level)", () => {
108
111
  const big = Array.from({ length: 700 }, (_, i) => `const x${i} = ${i};`).join("\n");
109
112
  await writeFile(join(tempDir, "packages", "some-pkg", "src", "big.ts"), big, "utf8");
110
113
 
111
- const result = await runFileSizeLint(
112
- input({ "write-baseline": true }),
113
- mockContext(tempDir),
114
- );
114
+ const result = await runFileSizeLint(input({ "write-baseline": true }), mockContext(tempDir));
115
115
  expect(result.exitCode ?? 0).toBe(0);
116
116
 
117
- const baselineRaw = await readFile(
118
- join(tempDir, "file-size-lint.baseline.yaml"),
119
- "utf8",
120
- );
117
+ const baselineRaw = await readFile(join(tempDir, "file-size-lint.baseline.yaml"), "utf8");
121
118
  expect(baselineRaw).toContain("schemaVersion");
122
119
  expect(baselineRaw).toContain("threshold: 600");
123
120
  expect(baselineRaw).toContain("big.ts");
@@ -155,9 +152,8 @@ describe("runFileSizeLint (RFC-1088, command-level)", () => {
155
152
  const result = await runFileSizeLint(input(), mockContext(tempDir));
156
153
  expect(result.exitCode ?? 0).toBe(0);
157
154
 
158
- const diagnostics = (
159
- result.data as { diagnostics: Array<{ ruleId: string; message: string }> }
160
- ).diagnostics;
155
+ const diagnostics = (result.data as { diagnostics: Array<{ ruleId: string; message: string }> })
156
+ .diagnostics;
161
157
  const hit = diagnostics.find((d) => d.ruleId === "SIZE-01");
162
158
  expect(hit).toBeDefined();
163
159
  expect(hit!.message).toContain("grew from the baselined 700 to 800");
@@ -35,76 +35,76 @@
35
35
 
36
36
  ## Skills
37
37
 
38
- | Name | Category | Invocation | Concerns |
39
- | --- | --- | --- | --- |
40
- | fo-add-tests | fo | user | code-mutation |
41
- | fo-architecture | fo | user | document-only |
42
- | fo-compass-annotate | fo | user | content-mutation |
43
- | fo-design-summit | fo | user | document-only |
44
- | fo-doc-audit | fo | user | document-only |
45
- | fo-explore | fo | user | document-only |
46
- | fo-extract-dna | fo | user | document-only |
47
- | fo-fix | fo | user | code-mutation |
48
- | fo-handoff | fo | user | document-only |
49
- | fo-harvest | fo | user | code-mutation |
50
- | fo-idea | fo | user | document-only |
51
- | fo-idea-audit | fo | user | read-only |
52
- | fo-idea-create-adr | fo | user | document-only |
53
- | fo-idea-create-rfc | fo | user | document-only |
54
- | fo-idea-enhance | fo | user | document-only |
55
- | fo-idea-i-just-want-to-see-the-plan | fo | user | document-only |
56
- | fo-idea-i-just-want-to-see-the-result | fo | user | code-mutation |
57
- | fo-idea-implement | fo | user | code-mutation |
58
- | fo-idea-plan | fo | user | document-only |
59
- | fo-idea-status | fo | user | read-only |
60
- | fo-knowledge-distill | fo | user | document-only |
61
- | fo-memory-sync | fo | user | content-mutation |
62
- | fo-qa | fo | user | document-only |
63
- | fo-review | fo | user | read-only |
64
- | fo-session-retro | fo | user | document-only |
65
- | fo-session-save | fo | user | document-only |
66
- | fo-spec-ingest | fo | user | document-only |
67
- | fo-step-commit | fo | model | code-mutation |
68
- | fo-triage | fo | user | document-only |
69
- | forge-bootstrap | meta | user | content-mutation |
70
- | grilling | shared | user | read-only |
71
- | my-preferences | shared | user | document-only |
72
- | port-to-forge | meta | user | code-mutation |
73
- | skill-create | meta | user | document-only |
74
- | windows-ai-tooling | shared | user | code-mutation |
75
- | writing-great-skills | shared | user | read-only |
38
+ | Name | Category | Invocation | Concerns |
39
+ | ------------------------------------- | -------- | ---------- | ---------------- |
40
+ | fo-add-tests | fo | user | code-mutation |
41
+ | fo-architecture | fo | user | document-only |
42
+ | fo-compass-annotate | fo | user | content-mutation |
43
+ | fo-design-summit | fo | user | document-only |
44
+ | fo-doc-audit | fo | user | document-only |
45
+ | fo-explore | fo | user | document-only |
46
+ | fo-extract-dna | fo | user | document-only |
47
+ | fo-fix | fo | user | code-mutation |
48
+ | fo-handoff | fo | user | document-only |
49
+ | fo-harvest | fo | user | code-mutation |
50
+ | fo-idea | fo | user | document-only |
51
+ | fo-idea-audit | fo | user | read-only |
52
+ | fo-idea-create-adr | fo | user | document-only |
53
+ | fo-idea-create-rfc | fo | user | document-only |
54
+ | fo-idea-enhance | fo | user | document-only |
55
+ | fo-idea-i-just-want-to-see-the-plan | fo | user | document-only |
56
+ | fo-idea-i-just-want-to-see-the-result | fo | user | code-mutation |
57
+ | fo-idea-implement | fo | user | code-mutation |
58
+ | fo-idea-plan | fo | user | document-only |
59
+ | fo-idea-status | fo | user | read-only |
60
+ | fo-knowledge-distill | fo | user | document-only |
61
+ | fo-memory-sync | fo | user | content-mutation |
62
+ | fo-qa | fo | user | document-only |
63
+ | fo-review | fo | user | read-only |
64
+ | fo-session-retro | fo | user | document-only |
65
+ | fo-session-save | fo | user | document-only |
66
+ | fo-spec-ingest | fo | user | document-only |
67
+ | fo-step-commit | fo | model | code-mutation |
68
+ | fo-triage | fo | user | document-only |
69
+ | forge-bootstrap | meta | user | content-mutation |
70
+ | grilling | shared | user | read-only |
71
+ | my-preferences | shared | user | document-only |
72
+ | port-to-forge | meta | user | code-mutation |
73
+ | skill-create | meta | user | document-only |
74
+ | windows-ai-tooling | shared | user | code-mutation |
75
+ | writing-great-skills | shared | user | read-only |
76
76
 
77
77
  ## Capabilities
78
78
 
79
79
  Bindings resolved from `forge.yaml`:
80
80
 
81
- | Key | Status | Value |
82
- | --- | --- | --- |
83
- | commands.validateRfc | resolved | `pnpm exec forge rfc.validate` |
84
- | commands.validateAdr | resolved | `pnpm exec forge adr.validate` |
85
- | commands.typecheck | absent | — |
86
- | commands.test | absent | — |
87
- | commands.scopedBuild | absent | — |
81
+ | Key | Status | Value |
82
+ | --------------------- | -------- | ------------------------------- |
83
+ | commands.validateRfc | resolved | `pnpm exec forge rfc.validate` |
84
+ | commands.validateAdr | resolved | `pnpm exec forge adr.validate` |
85
+ | commands.typecheck | absent | — |
86
+ | commands.test | absent | — |
87
+ | commands.scopedBuild | absent | — |
88
88
  | commands.specValidate | resolved | `pnpm exec forge spec.validate` |
89
- | commands.sessionSave | resolved | `pnpm exec forge session.save` |
90
- | paths.invariantsFile | resolved | `docs/architecture-dna.md` |
91
- | paths.reviewsDir | resolved | `docs/reviews` |
92
- | paths.handoffsDir | resolved | `docs/handoffs` |
93
- | paths.sessionsDir | resolved | `docs/sessions` |
94
- | paths.compassDocs | resolved | `docs/requirements.xml` |
89
+ | commands.sessionSave | resolved | `pnpm exec forge session.save` |
90
+ | paths.invariantsFile | resolved | `docs/architecture-dna.md` |
91
+ | paths.reviewsDir | resolved | `docs/reviews` |
92
+ | paths.handoffsDir | resolved | `docs/handoffs` |
93
+ | paths.sessionsDir | resolved | `docs/sessions` |
94
+ | paths.compassDocs | resolved | `docs/requirements.xml` |
95
95
 
96
96
  <!-- forge:begin behavioral-layer -->
97
97
 
98
98
  ## Behavioral layer
99
99
 
100
- This section defines the agent's core behavioral contract. It is generated from skill `triggers` and fixed policy text. The agent MUST follow these behaviors in every session.
100
+ This section defines the agent's core behavioral contract. It is generated from skill `triggerPhrases` and fixed policy text. The agent MUST follow these behaviors in every session.
101
101
 
102
102
  ### Intent-to-skill routing
103
103
 
104
- When the operator expresses an intent in natural language, the agent routes to the matching skill. The routing table is generated from `triggers` fields in skill frontmatter.
104
+ When the operator expresses an intent in natural language, the agent routes to the matching skill. The routing table is generated from `triggerPhrases` fields in skill frontmatter.
105
105
 
106
106
  | Operator says something like | Skill |
107
- | --- | --- |
107
+ | ---------------------------- | ----- |
108
108
 
109
109
  The agent uses judgment to calibrate routing — minor edits (typo fixes, small CSS changes) do not require skill invocation, while significant changes (new features, architectural decisions) do.
110
110