@warpgogol/forge 4.2.4 → 5.1.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 (363) hide show
  1. package/AGENTS.md +14 -6
  2. package/CHANGELOG.md +72 -0
  3. package/README.md +8 -8
  4. package/README.uk.md +5 -5
  5. package/dist/os/adr/handlers/list-create.d.ts.map +1 -1
  6. package/dist/os/adr/handlers/list-create.js +4 -1
  7. package/dist/os/adr/handlers/list-create.js.map +1 -1
  8. package/dist/os/adr/handlers/validate.d.ts.map +1 -1
  9. package/dist/os/adr/handlers/validate.js +6 -1
  10. package/dist/os/adr/handlers/validate.js.map +1 -1
  11. package/dist/os/adr/types.d.ts.map +1 -1
  12. package/dist/os/adr/types.js +7 -3
  13. package/dist/os/adr/types.js.map +1 -1
  14. package/dist/os/compass/compass.module.d.ts.map +1 -1
  15. package/dist/os/compass/compass.module.js +76 -10
  16. package/dist/os/compass/compass.module.js.map +1 -1
  17. package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
  18. package/dist/os/compass/handlers/compass-audit-handler.js +7 -3
  19. package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
  20. package/dist/os/compass/handlers/compass-change-summary-handler.d.ts +1 -9
  21. package/dist/os/compass/handlers/compass-change-summary-handler.d.ts.map +1 -1
  22. package/dist/os/compass/handlers/compass-change-summary-handler.js +44 -186
  23. package/dist/os/compass/handlers/compass-change-summary-handler.js.map +1 -1
  24. package/dist/os/compass/handlers/compass-inventory-handler.d.ts +2 -0
  25. package/dist/os/compass/handlers/compass-inventory-handler.d.ts.map +1 -1
  26. package/dist/os/compass/handlers/compass-inventory-handler.js +24 -12
  27. package/dist/os/compass/handlers/compass-inventory-handler.js.map +1 -1
  28. package/dist/os/compass/handlers/compass-inventory.d.ts +7 -5
  29. package/dist/os/compass/handlers/compass-inventory.d.ts.map +1 -1
  30. package/dist/os/compass/handlers/compass-inventory.js +84 -241
  31. package/dist/os/compass/handlers/compass-inventory.js.map +1 -1
  32. package/dist/os/compass/handlers/compass-migrate-handler.d.ts +4 -0
  33. package/dist/os/compass/handlers/compass-migrate-handler.d.ts.map +1 -0
  34. package/dist/os/compass/handlers/compass-migrate-handler.js +100 -0
  35. package/dist/os/compass/handlers/compass-migrate-handler.js.map +1 -0
  36. package/dist/os/compass/handlers/compass-migrate.d.ts +34 -0
  37. package/dist/os/compass/handlers/compass-migrate.d.ts.map +1 -0
  38. package/dist/os/compass/handlers/compass-migrate.js +273 -0
  39. package/dist/os/compass/handlers/compass-migrate.js.map +1 -0
  40. package/dist/os/compass/handlers/resolve-scan-root.d.ts.map +1 -1
  41. package/dist/os/compass/handlers/resolve-scan-root.js +15 -8
  42. package/dist/os/compass/handlers/resolve-scan-root.js.map +1 -1
  43. package/dist/os/compass/handlers/summary-record.d.ts +46 -0
  44. package/dist/os/compass/handlers/summary-record.d.ts.map +1 -0
  45. package/dist/os/compass/handlers/summary-record.js +233 -0
  46. package/dist/os/compass/handlers/summary-record.js.map +1 -0
  47. package/dist/os/compass/index.d.ts +4 -1
  48. package/dist/os/compass/index.d.ts.map +1 -1
  49. package/dist/os/compass/index.js +9 -1
  50. package/dist/os/compass/index.js.map +1 -1
  51. package/dist/os/compass/policy.d.ts +65 -0
  52. package/dist/os/compass/policy.d.ts.map +1 -0
  53. package/dist/os/compass/policy.js +241 -0
  54. package/dist/os/compass/policy.js.map +1 -0
  55. package/dist/os/core/core.module.d.ts.map +1 -1
  56. package/dist/os/core/core.module.js +11 -23
  57. package/dist/os/core/core.module.js.map +1 -1
  58. package/dist/os/core/handlers/forge-autonomy-validate.d.ts.map +1 -1
  59. package/dist/os/core/handlers/forge-autonomy-validate.js +7 -1
  60. package/dist/os/core/handlers/forge-autonomy-validate.js.map +1 -1
  61. package/dist/os/core/handlers/package-health.d.ts.map +1 -1
  62. package/dist/os/core/handlers/package-health.js +6 -1
  63. package/dist/os/core/handlers/package-health.js.map +1 -1
  64. package/dist/os/core/handlers/pinned-check.d.ts.map +1 -1
  65. package/dist/os/core/handlers/pinned-check.js +6 -1
  66. package/dist/os/core/handlers/pinned-check.js.map +1 -1
  67. package/dist/os/core/handlers/pinned-validate.d.ts.map +1 -1
  68. package/dist/os/core/handlers/pinned-validate.js +6 -1
  69. package/dist/os/core/handlers/pinned-validate.js.map +1 -1
  70. package/dist/os/core/handlers/validate.d.ts.map +1 -1
  71. package/dist/os/core/handlers/validate.js +6 -1
  72. package/dist/os/core/handlers/validate.js.map +1 -1
  73. package/dist/os/exploration/exploration.module.d.ts.map +1 -1
  74. package/dist/os/exploration/exploration.module.js +6 -4
  75. package/dist/os/exploration/exploration.module.js.map +1 -1
  76. package/dist/os/exploration/handlers/list.d.ts.map +1 -1
  77. package/dist/os/exploration/handlers/list.js +4 -1
  78. package/dist/os/exploration/handlers/list.js.map +1 -1
  79. package/dist/os/mission/handlers/archive.d.ts.map +1 -1
  80. package/dist/os/mission/handlers/archive.js +7 -3
  81. package/dist/os/mission/handlers/archive.js.map +1 -1
  82. package/dist/os/mission/index.d.ts.map +1 -1
  83. package/dist/os/mission/index.js +13 -0
  84. package/dist/os/mission/index.js.map +1 -1
  85. package/dist/os/notes/index.d.ts.map +1 -1
  86. package/dist/os/notes/index.js +7 -1
  87. package/dist/os/notes/index.js.map +1 -1
  88. package/dist/os/rfc/frontmatter-io.d.ts.map +1 -1
  89. package/dist/os/rfc/frontmatter-io.js +6 -1
  90. package/dist/os/rfc/frontmatter-io.js.map +1 -1
  91. package/dist/os/rfc/handlers/archive.d.ts.map +1 -1
  92. package/dist/os/rfc/handlers/archive.js +6 -1
  93. package/dist/os/rfc/handlers/archive.js.map +1 -1
  94. package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
  95. package/dist/os/rfc/handlers/implement-stamp.js +7 -3
  96. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
  97. package/dist/os/rfc/handlers/index-graph.d.ts.map +1 -1
  98. package/dist/os/rfc/handlers/index-graph.js +6 -1
  99. package/dist/os/rfc/handlers/index-graph.js.map +1 -1
  100. package/dist/os/rfc/handlers/lifecycle.d.ts.map +1 -1
  101. package/dist/os/rfc/handlers/lifecycle.js +6 -1
  102. package/dist/os/rfc/handlers/lifecycle.js.map +1 -1
  103. package/dist/os/rfc/handlers/list-create.d.ts.map +1 -1
  104. package/dist/os/rfc/handlers/list-create.js +6 -1
  105. package/dist/os/rfc/handlers/list-create.js.map +1 -1
  106. package/dist/os/rfc/handlers/pipeline-status.d.ts.map +1 -1
  107. package/dist/os/rfc/handlers/pipeline-status.js +6 -1
  108. package/dist/os/rfc/handlers/pipeline-status.js.map +1 -1
  109. package/dist/os/rfc/handlers/supersede-propose.d.ts.map +1 -1
  110. package/dist/os/rfc/handlers/supersede-propose.js +6 -1
  111. package/dist/os/rfc/handlers/supersede-propose.js.map +1 -1
  112. package/dist/os/rfc/handlers/validate-rules.d.ts.map +1 -1
  113. package/dist/os/rfc/handlers/validate-rules.js +7 -3
  114. package/dist/os/rfc/handlers/validate-rules.js.map +1 -1
  115. package/dist/os/rfc/handlers/validate.d.ts.map +1 -1
  116. package/dist/os/rfc/handlers/validate.js +6 -1
  117. package/dist/os/rfc/handlers/validate.js.map +1 -1
  118. package/dist/os/rfc/index.d.ts.map +1 -1
  119. package/dist/os/rfc/index.js +6 -1
  120. package/dist/os/rfc/index.js.map +1 -1
  121. package/dist/os/rfc/rfc.module.d.ts.map +1 -1
  122. package/dist/os/rfc/rfc.module.js +6 -1
  123. package/dist/os/rfc/rfc.module.js.map +1 -1
  124. package/dist/os/rfc/types.d.ts +7 -4
  125. package/dist/os/rfc/types.d.ts.map +1 -1
  126. package/dist/os/rfc/types.js +7 -4
  127. package/dist/os/rfc/types.js.map +1 -1
  128. package/dist/os/session/handlers/save.d.ts.map +1 -1
  129. package/dist/os/session/handlers/save.js +6 -1
  130. package/dist/os/session/handlers/save.js.map +1 -1
  131. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.d.ts.map +1 -1
  132. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js +6 -1
  133. package/dist/os/werkstatt/handlers/werkstatt-lock-recover.js.map +1 -1
  134. package/dist/os/werkstatt/handlers/workspace-deps.js +3 -3
  135. package/dist/os/werkstatt/handlers/workspace-deps.js.map +1 -1
  136. package/dist/os/workflow/index.d.ts.map +1 -1
  137. package/dist/os/workflow/index.js +6 -1
  138. package/dist/os/workflow/index.js.map +1 -1
  139. package/dist/src/config/forge-config.d.ts +62 -4
  140. package/dist/src/config/forge-config.d.ts.map +1 -1
  141. package/dist/src/config/forge-config.js +35 -19
  142. package/dist/src/config/forge-config.js.map +1 -1
  143. package/dist/src/forge-module.d.ts.map +1 -1
  144. package/dist/src/forge-module.js +6 -1
  145. package/dist/src/forge-module.js.map +1 -1
  146. package/dist/src/index.d.ts.map +1 -1
  147. package/dist/src/index.js +10 -2
  148. package/dist/src/index.js.map +1 -1
  149. package/dist/src/migration-adapters/git-utils.d.ts.map +1 -1
  150. package/dist/src/migration-adapters/git-utils.js +6 -2
  151. package/dist/src/migration-adapters/git-utils.js.map +1 -1
  152. package/dist/src/migration-adapters/ignored-files.d.ts.map +1 -1
  153. package/dist/src/migration-adapters/ignored-files.js +6 -1
  154. package/dist/src/migration-adapters/ignored-files.js.map +1 -1
  155. package/dist/src/migration-adapters/index.d.ts.map +1 -1
  156. package/dist/src/migration-adapters/index.js +4 -1
  157. package/dist/src/migration-adapters/index.js.map +1 -1
  158. package/dist/src/migration-adapters/types.d.ts.map +1 -1
  159. package/dist/src/migration-adapters/types.js +6 -2
  160. package/dist/src/migration-adapters/types.js.map +1 -1
  161. package/dist/src/onboarding/agents-generate.d.ts.map +1 -1
  162. package/dist/src/onboarding/agents-generate.js +18 -14
  163. package/dist/src/onboarding/agents-generate.js.map +1 -1
  164. package/dist/src/onboarding/create.d.ts.map +1 -1
  165. package/dist/src/onboarding/create.js +7 -6
  166. package/dist/src/onboarding/create.js.map +1 -1
  167. package/dist/src/onboarding/doctor.d.ts.map +1 -1
  168. package/dist/src/onboarding/doctor.js +7 -13
  169. package/dist/src/onboarding/doctor.js.map +1 -1
  170. package/dist/src/onboarding/init.d.ts.map +1 -1
  171. package/dist/src/onboarding/init.js +7 -12
  172. package/dist/src/onboarding/init.js.map +1 -1
  173. package/dist/src/onboarding/invariant-engine.d.ts.map +1 -1
  174. package/dist/src/onboarding/invariant-engine.js +7 -2
  175. package/dist/src/onboarding/invariant-engine.js.map +1 -1
  176. package/dist/src/onboarding/nested-agents-generate.d.ts.map +1 -1
  177. package/dist/src/onboarding/nested-agents-generate.js +7 -2
  178. package/dist/src/onboarding/nested-agents-generate.js.map +1 -1
  179. package/dist/src/onboarding/nested-agents-templates.d.ts.map +1 -1
  180. package/dist/src/onboarding/nested-agents-templates.js +11 -3
  181. package/dist/src/onboarding/nested-agents-templates.js.map +1 -1
  182. package/dist/src/onboarding/scaffold-project.d.ts.map +1 -1
  183. package/dist/src/onboarding/scaffold-project.js +6 -1
  184. package/dist/src/onboarding/scaffold-project.js.map +1 -1
  185. package/dist/src/onboarding/upgrade.d.ts.map +1 -1
  186. package/dist/src/onboarding/upgrade.js +7 -3
  187. package/dist/src/onboarding/upgrade.js.map +1 -1
  188. package/dist/src/profiles/profile-schema.d.ts +54 -4
  189. package/dist/src/profiles/profile-schema.d.ts.map +1 -1
  190. package/dist/src/profiles/profile-schema.js +34 -14
  191. package/dist/src/profiles/profile-schema.js.map +1 -1
  192. package/dist/src/profiles/stack-profile.d.ts +24 -0
  193. package/dist/src/profiles/stack-profile.d.ts.map +1 -1
  194. package/dist/src/profiles/stack-profile.js +7 -3
  195. package/dist/src/profiles/stack-profile.js.map +1 -1
  196. package/dist/src/registry.d.ts.map +1 -1
  197. package/dist/src/registry.js +7 -9
  198. package/dist/src/registry.js.map +1 -1
  199. package/dist/src/types.d.ts.map +1 -1
  200. package/dist/src/types.js +6 -1
  201. package/dist/src/types.js.map +1 -1
  202. package/dist/src/utils/fs-atomic.d.ts.map +1 -1
  203. package/dist/src/utils/fs-atomic.js +13 -1
  204. package/dist/src/utils/fs-atomic.js.map +1 -1
  205. package/dist/src/utils/fs-idempotent.d.ts.map +1 -1
  206. package/dist/src/utils/fs-idempotent.js +13 -0
  207. package/dist/src/utils/fs-idempotent.js.map +1 -1
  208. package/dist/src/utils/fs-trash-sync.d.ts.map +1 -1
  209. package/dist/src/utils/fs-trash-sync.js +13 -1
  210. package/dist/src/utils/fs-trash-sync.js.map +1 -1
  211. package/dist/src/utils/fs-trash.d.ts.map +1 -1
  212. package/dist/src/utils/fs-trash.js +13 -1
  213. package/dist/src/utils/fs-trash.js.map +1 -1
  214. package/dist/src/utils/fs.d.ts.map +1 -1
  215. package/dist/src/utils/fs.js +14 -3
  216. package/dist/src/utils/fs.js.map +1 -1
  217. package/dist/src/utils/hash.d.ts.map +1 -1
  218. package/dist/src/utils/hash.js +12 -1
  219. package/dist/src/utils/hash.js.map +1 -1
  220. package/dist/src/utils/index.d.ts.map +1 -1
  221. package/dist/src/utils/index.js +13 -2
  222. package/dist/src/utils/index.js.map +1 -1
  223. package/dist/src/utils/string-utils.d.ts.map +1 -1
  224. package/dist/src/utils/string-utils.js +12 -1
  225. package/dist/src/utils/string-utils.js.map +1 -1
  226. package/dist/src/validators/port-validate.js +1 -1
  227. package/dist/src/validators/port-validate.js.map +1 -1
  228. package/dist/src/validators/skill-validate.d.ts.map +1 -1
  229. package/dist/src/validators/skill-validate.js +7 -8
  230. package/dist/src/validators/skill-validate.js.map +1 -1
  231. package/docs/getting-started.md +1 -1
  232. package/docs/reference/forge-yaml.md +38 -9
  233. package/docs/reference/profiles.md +8 -8
  234. package/os/adr/handlers/list-create.ts +4 -1
  235. package/os/adr/handlers/validate.ts +6 -1
  236. package/os/adr/types.ts +7 -3
  237. package/os/compass/compass.module.ts +79 -13
  238. package/os/compass/handlers/compass-audit-handler.ts +22 -3
  239. package/os/compass/handlers/compass-change-summary-handler.ts +55 -227
  240. package/os/compass/handlers/compass-inventory-handler.ts +30 -12
  241. package/os/compass/handlers/compass-inventory.ts +103 -240
  242. package/os/compass/handlers/compass-migrate-handler.ts +122 -0
  243. package/os/compass/handlers/compass-migrate.ts +361 -0
  244. package/os/compass/handlers/resolve-scan-root-package.test.ts +70 -0
  245. package/os/compass/handlers/resolve-scan-root.ts +15 -8
  246. package/os/compass/handlers/summary-record.ts +313 -0
  247. package/os/compass/handlers/tests/compass-migrate.test.ts +291 -0
  248. package/os/compass/handlers/tests/compass-policy.test.ts +249 -0
  249. package/os/compass/handlers/tests/compass-v2-contract.test.ts +9 -9
  250. package/os/compass/handlers/tests/summary-record.test.ts +224 -0
  251. package/os/compass/index.ts +23 -5
  252. package/os/compass/policy.ts +350 -0
  253. package/os/core/core.module.ts +11 -23
  254. package/os/core/handlers/forge-autonomy-validate.ts +7 -1
  255. package/os/core/handlers/package-health.ts +6 -1
  256. package/os/core/handlers/pinned-check.ts +6 -1
  257. package/os/core/handlers/pinned-validate.ts +6 -1
  258. package/os/core/handlers/validate.ts +6 -1
  259. package/os/exploration/exploration.module.ts +72 -71
  260. package/os/exploration/handlers/list.ts +4 -1
  261. package/os/mission/handlers/archive.ts +7 -3
  262. package/os/mission/index.ts +14 -0
  263. package/os/notes/index.ts +7 -1
  264. package/os/rfc/frontmatter-io.ts +6 -1
  265. package/os/rfc/handlers/archive.ts +6 -1
  266. package/os/rfc/handlers/implement-stamp.ts +7 -3
  267. package/os/rfc/handlers/index-graph.ts +6 -1
  268. package/os/rfc/handlers/lifecycle.ts +6 -1
  269. package/os/rfc/handlers/list-create.ts +6 -1
  270. package/os/rfc/handlers/pipeline-status.ts +6 -1
  271. package/os/rfc/handlers/supersede-propose.ts +6 -1
  272. package/os/rfc/handlers/validate-rules.ts +7 -3
  273. package/os/rfc/handlers/validate.ts +6 -1
  274. package/os/rfc/index.ts +6 -1
  275. package/os/rfc/rfc.module.ts +6 -1
  276. package/os/rfc/types.ts +7 -4
  277. package/os/session/handlers/save.ts +6 -1
  278. package/os/werkstatt/handlers/werkstatt-lock-recover.ts +6 -1
  279. package/os/werkstatt/handlers/workspace-deps.ts +3 -3
  280. package/os/workflow/index.ts +6 -1
  281. package/package.json +1 -1
  282. package/profiles/{godot-csharp.yaml → godot-game.yaml} +2 -2
  283. package/profiles/{knowledge-typescript-turborepo.yaml → knowledge.yaml} +1 -1
  284. package/profiles/{phaser-turborepo.yaml → phaser-game.yaml} +2 -2
  285. package/profiles/{typescript-turborepo.yaml → typescript.yaml} +2 -2
  286. package/skills/fo/fo-add-tests/SKILL.md +14 -0
  287. package/skills/fo/fo-architecture/SKILL.md +14 -0
  288. package/skills/fo/fo-compass-annotate/SKILL.md +14 -0
  289. package/skills/fo/fo-design-summit/SKILL.md +14 -0
  290. package/skills/fo/fo-doc-audit/SKILL.md +14 -0
  291. package/skills/fo/fo-explore/SKILL.md +14 -0
  292. package/skills/fo/fo-extract-dna/SKILL.md +14 -0
  293. package/skills/fo/fo-fix/SKILL.md +14 -0
  294. package/skills/fo/fo-handoff/SKILL.md +14 -0
  295. package/skills/fo/fo-harvest/SKILL.md +14 -0
  296. package/skills/fo/fo-idea/SKILL.md +14 -0
  297. package/skills/fo/fo-idea-audit/SKILL.md +14 -0
  298. package/skills/fo/fo-idea-create-adr/SKILL.md +14 -0
  299. package/skills/fo/fo-idea-create-rfc/SKILL.md +14 -0
  300. package/skills/fo/fo-idea-enhance/SKILL.md +14 -0
  301. package/skills/fo/fo-idea-i-just-want-to-see-the-plan/SKILL.md +14 -0
  302. package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +14 -0
  303. package/skills/fo/fo-idea-implement/SKILL.md +14 -0
  304. package/skills/fo/fo-idea-plan/SKILL.md +14 -0
  305. package/skills/fo/fo-idea-status/SKILL.md +14 -0
  306. package/skills/fo/fo-knowledge-distill/SKILL.md +14 -0
  307. package/skills/fo/fo-memory-sync/SKILL.md +14 -0
  308. package/skills/fo/fo-qa/SKILL.md +14 -0
  309. package/skills/fo/fo-review/SKILL.md +14 -0
  310. package/skills/fo/fo-session-retro/SKILL.md +14 -0
  311. package/skills/fo/fo-session-save/SKILL.md +14 -0
  312. package/skills/fo/fo-spec-ingest/SKILL.md +14 -0
  313. package/skills/fo/fo-step-commit/SKILL.md +14 -0
  314. package/skills/fo/fo-triage/SKILL.md +14 -0
  315. package/skills/meta/forge-bootstrap/SKILL.md +14 -0
  316. package/skills/meta/port-to-forge/SKILL.md +14 -0
  317. package/skills/meta/skill-create/SKILL.md +14 -0
  318. package/skills/shared/grilling/SKILL.md +14 -0
  319. package/skills/shared/my-preferences/SKILL.md +14 -0
  320. package/skills/shared/windows-ai-tooling/SKILL.md +14 -0
  321. package/skills/shared/writing-great-skills/SKILL.md +14 -0
  322. package/src/config/forge-config.ts +40 -23
  323. package/src/forge-module.ts +6 -1
  324. package/src/index.ts +10 -2
  325. package/src/migration-adapters/git-utils.ts +6 -2
  326. package/src/migration-adapters/ignored-files.ts +6 -1
  327. package/src/migration-adapters/index.ts +4 -1
  328. package/src/migration-adapters/types.ts +6 -2
  329. package/src/onboarding/agents-generate.ts +23 -14
  330. package/src/onboarding/create.ts +7 -6
  331. package/src/onboarding/doctor.ts +7 -13
  332. package/src/onboarding/init.ts +7 -12
  333. package/src/onboarding/invariant-engine.ts +7 -2
  334. package/src/onboarding/nested-agents-generate.ts +7 -2
  335. package/src/onboarding/nested-agents-templates.ts +11 -3
  336. package/src/onboarding/scaffold-project.ts +6 -1
  337. package/src/onboarding/upgrade.ts +7 -3
  338. package/src/profiles/profile-schema.ts +42 -18
  339. package/src/profiles/stack-profile.ts +7 -3
  340. package/src/registry.ts +7 -9
  341. package/src/tests/agents-generate-domain.test.ts +3 -3
  342. package/src/tests/agents-generate.test.ts +2 -2
  343. package/src/tests/create.test.ts +4 -4
  344. package/src/tests/forge-autonomy-validate.test.ts +1 -1
  345. package/src/tests/package-files.test.ts +53 -1
  346. package/src/tests/profile-schema.test.ts +4 -4
  347. package/src/tests/scaffold-project.test.ts +3 -3
  348. package/src/tests/stack-profile.test.ts +12 -12
  349. package/src/types.ts +6 -1
  350. package/src/utils/fs-atomic.ts +13 -1
  351. package/src/utils/fs-idempotent.ts +13 -0
  352. package/src/utils/fs-trash-sync.ts +13 -1
  353. package/src/utils/fs-trash.ts +13 -1
  354. package/src/utils/fs.ts +14 -3
  355. package/src/utils/hash.ts +12 -1
  356. package/src/utils/index.ts +13 -2
  357. package/src/utils/string-utils.ts +12 -1
  358. package/src/validators/port-validate.ts +1 -1
  359. package/src/validators/skill-validate.ts +7 -8
  360. package/skills/shared/extension-e2e-mitm/SKILL.md +0 -53
  361. package/skills/shared/extension-e2e-mitm/fixture-proxy.ts +0 -113
  362. package/src/types/werkstatt-engine-shims.d.ts +0 -1416
  363. package/src/types/werkstatt-shared-shims.d.ts +0 -5686
@@ -11,12 +11,16 @@ With --update-npm, also updates @warpgogol/forge from npm before syncing (skippe
11
11
  </non-goals>
12
12
  </MODULE_CONTRACT>
13
13
  <CHANGE_SUMMARY>
14
- <item>RFC-0543: initial forge.upgrade handler — 7-step additive sync flow.</item>
15
14
  <item>RFC-0611: added nested AGENTS.md generation after skill sync.</item>
16
15
  <item>RFC-0663: added syncSharedKnowledge step to sync shared knowledge layer to .agents/skills/shared-knowledge/.</item>
17
16
  <item>RFC-0664: added scaffoldMemoryLayer step to scaffold .agents/memory/ and .gitignore block.</item>
18
- <item>Added --update-npm flag: updates @warpgogol/forge from npm before syncing (skipped in monorepo).</item>
19
- <item>Added npm latest-version check: warns when a newer @warpgogol/forge is available on npm.</item>
17
+ <item>RFC-1097: step 6 — compass.migrate codemod run
18
+
19
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
20
+ <item>RFC-1097: sweep — werkstatt-engine clean
21
+
22
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
23
+ <history>RFC-0543</history>
20
24
  </CHANGE_SUMMARY>
21
25
  */
22
26
 
@@ -7,17 +7,16 @@
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
9
  <CHANGE_SUMMARY>
10
- <item>RFC-0638: initial domain-neutral profile schema extensions with six optional fields.</item>
11
- <item>RFC-0674: add profileDevServerSchema and devServer field for lifecycle commands.</item>
12
- <item>RFC-0675: add profileInvariantCheckSchema and check field to profileInvariantSchema for enforcement.</item>
13
- <item>RFC-0679: add profileAssetSchema and assets field for asset management commands.</item>
14
- <item>RFC-0680: add profileReleaseSchema and release field for release lifecycle commands.</item>
15
10
  <item>RFC-0694: replace html-attribute-pattern with attribute-pattern (elements array) for HTML+JSX support.</item>
16
- <item>Add prerequisites field for profile-declared system dependency checks (e.g. FFmpeg).</item>
17
- <item>Add templates field for multi-template profiles (e.g. React + HTML).</item>
18
11
  <item>ADR-0043: add scriptDir field for agent-generated script directory convention.</item>
19
12
  <item>RFC-0808: add link-resolution, frontmatter-required, path-exclusion check kinds for note vault validation.</item>
20
- <item>Add gitignore-entry and secret-scan check kinds for godot-csharp profile.</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — packages/forge + services clean
17
+
18
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
19
+ <history>RFC-0638, RFC-0674, RFC-0675, RFC-0679, RFC-0680</history>
21
20
  </CHANGE_SUMMARY>
22
21
  */
23
22
 
@@ -317,6 +316,39 @@ export interface ProfileTemplate {
317
316
  // Stack profile domain fields
318
317
  // ---------------------------------------------------------------------------
319
318
 
319
+ // RFC-1096: shared Compass policy override shape — used by both the stack
320
+ // profile `compass:` section and the consumer `bindings.compass` section.
321
+ export const compassPolicyOverridesSchema = z.object({
322
+ fileExtensions: z.array(z.string()).optional(),
323
+ testPatterns: z.array(z.string()).optional(),
324
+ scanRoots: z.array(z.string()).optional(),
325
+ ignoredDirs: z.array(z.string()).optional(),
326
+ ignoredDirPrefixes: z.array(z.string()).optional(),
327
+ highRiskPaths: z.array(z.string()).optional(),
328
+ idPattern: z.string().optional(),
329
+ purposeBoilerplatePatterns: z.array(z.string()).optional(),
330
+ layerRules: z
331
+ .array(
332
+ z.object({
333
+ pattern: z.string().min(1),
334
+ layer: z.string().min(1),
335
+ risk: z.enum(["high", "medium", "low"]),
336
+ }),
337
+ )
338
+ .optional(),
339
+ workspaceKinds: z.record(z.string(), z.enum(["app", "package", "service"])).optional(),
340
+ excludedPaths: z
341
+ .array(
342
+ z.object({
343
+ pattern: z.string().min(1),
344
+ reason: z.string().min(1),
345
+ }),
346
+ )
347
+ .optional(),
348
+ });
349
+
350
+ export type CompassPolicyOverrides = z.infer<typeof compassPolicyOverridesSchema>;
351
+
320
352
  export const stackProfileDomainFieldsSchema = z.object({
321
353
  domain: z.string().optional(),
322
354
  terminology: z.record(z.string(), z.string()).optional(),
@@ -331,12 +363,7 @@ export const stackProfileDomainFieldsSchema = z.object({
331
363
  templates: z.array(profileTemplateSchema).optional(),
332
364
  scriptDir: z.string().min(1).optional(),
333
365
  rootAgentsMdTemplate: z.string().optional(),
334
- compass: z
335
- .object({
336
- fileExtensions: z.array(z.string()).optional(),
337
- testPatterns: z.array(z.string()).optional(),
338
- })
339
- .optional(),
366
+ compass: compassPolicyOverridesSchema.optional(),
340
367
  });
341
368
 
342
369
  export interface StackProfileDomainFields {
@@ -353,8 +380,5 @@ export interface StackProfileDomainFields {
353
380
  templates?: ProfileTemplate[];
354
381
  scriptDir?: string;
355
382
  rootAgentsMdTemplate?: string;
356
- compass?: {
357
- fileExtensions?: string[];
358
- testPatterns?: string[];
359
- };
383
+ compass?: CompassPolicyOverrides;
360
384
  }
@@ -7,12 +7,16 @@
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
9
  <CHANGE_SUMMARY>
10
- <item>RFC-0392: initial stack profile module with zod schema, listStackProfiles, detectStack.</item>
11
- <item>RFC-0638: extended stackProfileSchema with optional domain-neutral fields (domain, terminology, artifacts, workspaceTypes, invariants, register).</item>
12
- <item>RFC-0674: add devServer field to stackProfileSchema for lifecycle commands.</item>
13
10
  <item>RFC-0679: add assets field to stackProfileSchema for asset management commands.</item>
14
11
  <item>RFC-0680: add release field to stackProfileSchema for release lifecycle commands.</item>
15
12
  <item>ADR-0043: add scriptDir field for agent-generated script directory convention.</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — packages/forge + services clean
17
+
18
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
19
+ <history>RFC-0392, RFC-0638, RFC-0674</history>
16
20
  </CHANGE_SUMMARY>
17
21
  */
18
22
 
package/src/registry.ts CHANGED
@@ -6,18 +6,16 @@
6
6
  </non-goals>
7
7
  </MODULE_CONTRACT>
8
8
  <CHANGE_SUMMARY>
9
- <item>RFC-0374: initial ForgeSkillEntry interface and FORGE_SKILLS registry (17 migrated + 3 meta = 20).</item>
10
- <item>Added fo-add-tests skill (11th fo skill) — absorbs tdd + PBT conventions from RFC-0347.</item>
11
- <item>Skill consolidation: added fo-architecture, fo-handoff, fo-triage, fo-qa (15 fo skills). Removed handoff, improve-codebase-architecture, to-spec from shared (absorbed into fo-). Shared skills reduced to 4 (grilling, my-preferences, windows-ai-tooling, writing-great-skills).</item>
12
- <item>Renamed skill prefix wg- → fo- across all skills, paths, and categories. Added fo-idea-status, fo-idea-i-just-want-to-see-the-plan, fo-idea-i-just-want-to-see-the-result (18 fo skills total).</item>
13
- <item>Added fo-doc-audit skill (19th fo skill) — centralized documentation audit replacing inline AGENTS/README update steps in fo-fix and fo-idea-implement.</item>
14
- <item>RFC-0395: added fo-spec-ingest skill (20th fo skill) — spec package ingest/authoring with validation, grilling, and acceptance gate.</item>
15
- <item>Added fo-session-retro skill (21st fo skill) — session-end insight triage, categorizes discoveries and routes to AGENTS.md / ADR / DNA / forge / memory.</item>
16
- <item>RFC-0523: expanded concerns enum from binary (document-only | implementation) to four-level taxonomy (read-only | document-only | content-mutation | code-mutation). All 30 skills reclassified.</item>
17
- <item>RFC-0524: added optional knowledge?: string[] field for cumulative knowledge system. Added knowledge arrays to fo-site-scan and grilling.</item>
18
9
  <item>RFC-0538: added fo-compass-annotate skill (22nd fo skill) — full-lifecycle Compass header management replacing removed compass.annotate, compass.clear, compass.markup.migrate, compass.invariant.add kernel commands.</item>
19
10
  <item>RFC-0539: added discoverPackSkills helper and PackSkillEntry interface for project-declared skill packs. Removed mission-complete and fo-site-scan entries (relocated to warpgogol-skills as wg- pack skills).</item>
20
11
  <item>RFC-0941: discoverPackSkills now requires forge.plugin.yaml manifest at each pack root — throws on missing or invalid manifest (fail-fast).</item>
12
+ <item>RFC-1097: step 6 — compass.migrate codemod run
13
+
14
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
15
+ <item>RFC-1097: sweep — packages/forge + services clean
16
+
17
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
18
+ <history>RFC-0374, RFC-0395, RFC-0523, RFC-0524</history>
21
19
  </CHANGE_SUMMARY>
22
20
  */
23
21
 
@@ -147,7 +147,7 @@ test("creative template contains {{dynamicSections}} marker", () => {
147
147
 
148
148
  test("selectRootTemplate with profile rootAgentsMdTemplate loads profile template", () => {
149
149
  const profile = {
150
- id: "godot-csharp",
150
+ id: "godot-game",
151
151
  rootAgentsMdTemplate: "root-agents-godot.md",
152
152
  } as StackProfile;
153
153
  const content = selectRootTemplate("creative", profile);
@@ -301,8 +301,8 @@ test("agents-generate with creative register uses creative template", async () =
301
301
  expect(rootDetail?.register).toBe("creative");
302
302
  });
303
303
 
304
- test("agents-generate with godot-csharp profile generates Godot-specific AGENTS.md", async () => {
305
- await makeForgeYaml(tempDir, "profile: godot-csharp");
304
+ test("agents-generate with godot-game profile generates Godot-specific AGENTS.md", async () => {
305
+ await makeForgeYaml(tempDir, "profile: godot-game");
306
306
  const ctx = makeContext(tempDir);
307
307
  ctx.dryRun = true;
308
308
 
@@ -417,7 +417,7 @@ test("agents-generate nested separates workspace and external dependencies", asy
417
417
  JSON.stringify({
418
418
  name: "@test/my-pkg",
419
419
  dependencies: {
420
- "@warpgogol/werkstatt-shared/share": "workspace:*",
420
+ "@warpgogol/werkstatt-shared": "workspace:*",
421
421
  zod: "^4.4.3",
422
422
  },
423
423
  }),
@@ -428,7 +428,7 @@ test("agents-generate nested separates workspace and external dependencies", asy
428
428
 
429
429
  const nested = await readFile(join(tempDir, "packages", "my-pkg", "AGENTS.md"), "utf8");
430
430
  expect(nested).toContain("**Workspace:**");
431
- expect(nested).toContain("- `@warpgogol/werkstatt-shared/share`");
431
+ expect(nested).toContain("- `@warpgogol/werkstatt-shared`");
432
432
  expect(nested).toContain("**External:**");
433
433
  expect(nested).toContain("- `zod` `^4.4.3`");
434
434
  });
@@ -290,9 +290,9 @@ test("forge create --in-place derives name from folder name when --name omitted"
290
290
  expect(pkgJson.name).toBe("my-derived-project");
291
291
  }, 120000);
292
292
 
293
- test("forge create --profile godot-csharp writes compass.fileExtensions into forge.yaml", async () => {
293
+ test("forge create --profile godot-game writes compass.fileExtensions into forge.yaml", async () => {
294
294
  const result = await runCreate(
295
- { argv: [], flags: { "in-place": true, profile: "godot-csharp", name: "my-game" } },
295
+ { argv: [], flags: { "in-place": true, profile: "godot-game", name: "my-game" } },
296
296
  makeContext(tempDir),
297
297
  );
298
298
  expect(result.exitCode).toBe(0);
@@ -346,9 +346,9 @@ test("forge create --in-place pins pre-user-prompt-wrapper.mjs in pinned.yaml (R
346
346
  expect(pinnedYaml).toContain("pre-user-prompt-wrapper.mjs");
347
347
  }, 120000);
348
348
 
349
- test("forge create --profile phaser-turborepo writes compass.fileExtensions into forge.yaml", async () => {
349
+ test("forge create --profile phaser-game writes compass.fileExtensions into forge.yaml", async () => {
350
350
  const result = await runCreate(
351
- { argv: [], flags: { "in-place": true, profile: "phaser-turborepo", name: "my-phaser-game" } },
351
+ { argv: [], flags: { "in-place": true, profile: "phaser-game", name: "my-phaser-game" } },
352
352
  makeContext(tempDir),
353
353
  );
354
354
  expect(result.exitCode).toBe(0);
@@ -94,7 +94,7 @@ describe("forge.autonomy.validate", () => {
94
94
  test("passes when @warpgogol/werkstatt-shared is imported (exempt)", async () => {
95
95
  writeFileSync(
96
96
  join(workspace, "packages", "forge", "os", "core", "handlers", "shared.ts"),
97
- `import { scanDirectoryForImports } from "@warpgogol/werkstatt-shared/share/import-scan";\nexport function bar() { return scanDirectoryForImports; }\n`,
97
+ `import { scanDirectoryForImports } from "@warpgogol/werkstatt-shared/node/import-scan";\nexport function bar() { return scanDirectoryForImports; }\n`,
98
98
  );
99
99
 
100
100
  const result = await runForgeAutonomyValidate({ argv: [], flags: {} }, makeContext(workspace));
@@ -10,8 +10,18 @@ but are missing from the published package.</purpose>
10
10
  */
11
11
 
12
12
  import { test, expect } from "vitest";
13
- import { readFileSync, readdirSync } from "node:fs";
13
+ import {
14
+ existsSync,
15
+ mkdirSync,
16
+ mkdtempSync,
17
+ readFileSync,
18
+ readdirSync,
19
+ rmSync,
20
+ writeFileSync,
21
+ } from "node:fs";
22
+ import { tmpdir } from "node:os";
14
23
  import { join } from "node:path";
24
+ import { resolveForgePackageRoot } from "../config/forge-config.ts";
15
25
 
16
26
  const PACKAGE_ROOT = join(import.meta.dirname, "..", "..");
17
27
 
@@ -52,3 +62,45 @@ test("root AGENTS.md templates exist and are readable", () => {
52
62
  expect(content.length).toBeGreaterThan(0);
53
63
  }
54
64
  });
65
+
66
+ // Regression: published 5.1.0 resolved templates/profiles via import.meta.dirname,
67
+ // which points at dist/src/onboarding/ in the compiled package — tsc never copies
68
+ // .md assets into dist/, so lookups silently failed. resolveForgePackageRoot must
69
+ // find the package root from both source and compiled layouts.
70
+ test("resolveForgePackageRoot finds package root from compiled dist layout", () => {
71
+ const tmp = mkdtempSync(join(tmpdir(), "forge-pkgroot-"));
72
+ try {
73
+ writeFileSync(join(tmp, "package.json"), JSON.stringify({ name: "@warpgogol/forge" }));
74
+ const distOnboarding = join(tmp, "dist", "src", "onboarding");
75
+ mkdirSync(distOnboarding, { recursive: true });
76
+ const srcTemplates = join(tmp, "src", "onboarding", "templates");
77
+ mkdirSync(srcTemplates, { recursive: true });
78
+
79
+ const root = resolveForgePackageRoot(distOnboarding);
80
+ expect(root).toBe(tmp);
81
+ expect(existsSync(join(root, "src", "onboarding", "templates"))).toBe(true);
82
+ expect(existsSync(join(root, "profiles"))).toBe(false);
83
+ } finally {
84
+ rmSync(tmp, { recursive: true, force: true });
85
+ }
86
+ });
87
+
88
+ test("resolveForgePackageRoot finds package root from source layout", () => {
89
+ const tmp = mkdtempSync(join(tmpdir(), "forge-pkgroot-"));
90
+ try {
91
+ writeFileSync(join(tmp, "package.json"), JSON.stringify({ name: "@warpgogol/forge" }));
92
+ const srcOnboarding = join(tmp, "src", "onboarding");
93
+ mkdirSync(srcOnboarding, { recursive: true });
94
+
95
+ expect(resolveForgePackageRoot(srcOnboarding)).toBe(tmp);
96
+ } finally {
97
+ rmSync(tmp, { recursive: true, force: true });
98
+ }
99
+ });
100
+
101
+ test("resolveForgePackageRoot resolves the real package root from src/onboarding", () => {
102
+ const root = resolveForgePackageRoot(join(PACKAGE_ROOT, "src", "onboarding"));
103
+ expect(root).toBe(PACKAGE_ROOT);
104
+ expect(existsSync(join(root, "src", "onboarding", "templates"))).toBe(true);
105
+ expect(existsSync(join(root, "profiles"))).toBe(true);
106
+ });
@@ -162,16 +162,16 @@ test("all shipped profiles parse without changes", () => {
162
162
  expect(profile.id).toBeDefined();
163
163
  expect(profile.workspace.dirs.length).toBeGreaterThan(0);
164
164
  // Domain fields should be undefined for existing software-domain profiles
165
- if (profile.id !== "godot-csharp") {
165
+ if (profile.id !== "godot-game") {
166
166
  expect(profile.domain).toBeUndefined();
167
167
  expect(profile.register).toBeUndefined();
168
168
  }
169
169
  }
170
170
  });
171
171
 
172
- test("shipped phaser-turborepo profile loads via loadStackProfile", () => {
173
- const profile = loadStackProfile(join(FORGE_ROOT, "profiles", "phaser-turborepo.yaml"));
174
- expect(profile.id).toBe("phaser-turborepo");
172
+ test("shipped phaser-game profile loads via loadStackProfile", () => {
173
+ const profile = loadStackProfile(join(FORGE_ROOT, "profiles", "phaser-game.yaml"));
174
+ expect(profile.id).toBe("phaser-game");
175
175
  });
176
176
 
177
177
  test("UNIVERSAL_TERMINOLOGY_KEYS contains the 7 documented keys", () => {
@@ -73,7 +73,7 @@ test("forge.scaffold fails on missing --profile", async () => {
73
73
 
74
74
  test("forge.scaffold derives name from folder when --name omitted", async () => {
75
75
  const result = await runScaffoldProject(
76
- { argv: [], flags: { profile: "phaser-turborepo" } },
76
+ { argv: [], flags: { profile: "phaser-game" } },
77
77
  { ...makeContext(tempDir), forgeRoot: FORGE_ROOT },
78
78
  );
79
79
  // Name is now derived from the folder name (consistent with forge.create)
@@ -89,7 +89,7 @@ test("forge.scaffold derives name from folder when --name omitted", async () =>
89
89
 
90
90
  test("forge.scaffold fails on non-kebab-case name", async () => {
91
91
  const result = await runScaffoldProject(
92
- { argv: [], flags: { profile: "phaser-turborepo", name: "MySite" } },
92
+ { argv: [], flags: { profile: "phaser-game", name: "MySite" } },
93
93
  { ...makeContext(tempDir), forgeRoot: FORGE_ROOT },
94
94
  );
95
95
  expect(result.exitCode).toBe(1);
@@ -129,7 +129,7 @@ test("forge.init --from detects stack from existing project", async () => {
129
129
  const result = runInit({ flags: { from: fakeProject } }, { workspaceRoot: WORKSPACE_ROOT });
130
130
  expect(result.status).toBe("pass");
131
131
  expect(result.detection).toBeDefined();
132
- expect(result.detection?.profile).toBe("phaser-turborepo");
132
+ expect(result.detection?.profile).toBe("phaser-game");
133
133
  });
134
134
 
135
135
  test("forge.init --from reports null when stack undetectable", async () => {
@@ -139,31 +139,31 @@ test("detectStack matches on exact filename", async () => {
139
139
  expect(match?.id).toBe("ts");
140
140
  });
141
141
 
142
- test("shipped phaser-turborepo profile validates", () => {
143
- const profile = loadStackProfile(join(FORGE_ROOT, "profiles", "phaser-turborepo.yaml"));
144
- expect(profile.id).toBe("phaser-turborepo");
142
+ test("shipped phaser-game profile validates", () => {
143
+ const profile = loadStackProfile(join(FORGE_ROOT, "profiles", "phaser-game.yaml"));
144
+ expect(profile.id).toBe("phaser-game");
145
145
  expect(profile.workspace.dirs.length).toBeGreaterThan(0);
146
146
  });
147
147
 
148
- test("shipped godot-csharp profile validates", () => {
149
- const profile = loadStackProfile(join(FORGE_ROOT, "profiles", "godot-csharp.yaml"));
150
- expect(profile.id).toBe("godot-csharp");
148
+ test("shipped godot-game profile validates", () => {
149
+ const profile = loadStackProfile(join(FORGE_ROOT, "profiles", "godot-game.yaml"));
150
+ expect(profile.id).toBe("godot-game");
151
151
  expect(profile.workspace.dirs.length).toBeGreaterThan(0);
152
152
  });
153
153
 
154
154
  test("listStackProfiles finds all shipped profiles", () => {
155
155
  const profiles = listStackProfiles(FORGE_ROOT);
156
156
  const ids = profiles.map((p) => p.id).sort();
157
- expect(ids).toContain("phaser-turborepo");
158
- expect(ids).toContain("godot-csharp");
157
+ expect(ids).toContain("phaser-game");
158
+ expect(ids).toContain("godot-game");
159
159
  expect(ids).toContain("forge-shell");
160
160
  });
161
161
 
162
162
  test("all shipped profiles include @warpgogol/forge in install steps or package.json template", () => {
163
163
  const profiles = listStackProfiles(FORGE_ROOT);
164
164
  for (const profile of profiles) {
165
- // knowledge-typescript-turborepo uses @warpgogol/werkstatt-knowledge plugin, not forge
166
- if (profile.id === "knowledge-typescript-turborepo") continue;
165
+ // knowledge uses @warpgogol/werkstatt-knowledge plugin, not forge
166
+ if (profile.id === "knowledge") continue;
167
167
  const hasForgeInInstall = profile.install.some((cmd) => cmd.includes("@warpgogol/forge"));
168
168
  const pkgFile = profile.workspace.files.find((f) => f.path === "package.json");
169
169
  const hasForgeInPkg = pkgFile?.content.includes("@warpgogol/forge") ?? false;
@@ -174,8 +174,8 @@ test("all shipped profiles include @warpgogol/forge in install steps or package.
174
174
  test("all shipped profiles include operator-profile.md in .gitignore content", () => {
175
175
  const profiles = listStackProfiles(FORGE_ROOT);
176
176
  for (const profile of profiles) {
177
- // knowledge-typescript-turborepo uses a different plugin and gitignore template
178
- if (profile.id === "knowledge-typescript-turborepo") continue;
177
+ // knowledge uses a different plugin and gitignore template
178
+ if (profile.id === "knowledge") continue;
179
179
  const gitignoreFile = profile.workspace.files.find((f) => f.path === ".gitignore");
180
180
  expect(gitignoreFile).toBeDefined();
181
181
  expect(gitignoreFile?.content).toContain("operator-profile.md");
package/src/types.ts CHANGED
@@ -9,8 +9,13 @@ can be registered in a Warpgogol kernel without direct dependency.</purpose>
9
9
  </non-goals>
10
10
  </MODULE_CONTRACT>
11
11
  <CHANGE_SUMMARY>
12
- <item>Initial canonical forge types: ForgeCommandInput, ForgeCommandResult, ForgeRuntimeContext, ForgeFlagSpec, Diagnostic, CommandRegistry, ForgeLogger.</item>
13
12
  <item>RFC-0518: add GateMetadata, GateSeverity, GatePhase, GateConditional types and optional gate field to ForgeCommandMetadata (structurally compatible with @warpgogol/site-kernel).</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — werkstatt-engine clean
17
+
18
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
14
19
  </CHANGE_SUMMARY>
15
20
  */
16
21
 
@@ -7,8 +7,20 @@ file then renames, with bounded retry for Windows EPERM/EBUSY.</purpose>
7
7
  <item>Do not fall back to non-atomic writes — fail loudly.</item>
8
8
  </non-goals>
9
9
  </MODULE_CONTRACT>
10
+ <KEY_DECISIONS>
11
+ <item>Writes go through temp-file plus rename so readers never observe partial content.</item>
12
+ <item>Bounded retry covers only Windows EPERM/EBUSY — every other failure is loud and immediate.</item>
13
+ </KEY_DECISIONS>
10
14
  <CHANGE_SUMMARY>
11
- <item>Moved from @warpgogol/site-kernel/fs-atomic to forge as canonical source (dependency inversion).</item>
15
+ <item>RFC-1097: step 6 — compass.migrate codemod run
16
+
17
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
18
+ <item>RFC-1097: sweep — packages/forge + services clean
19
+
20
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
21
+ <item>RFC-1097: sweep — werkstatt-engine clean
22
+
23
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
12
24
  </CHANGE_SUMMARY>
13
25
  */
14
26
 
@@ -8,9 +8,22 @@ Reduces unnecessary disk writes and git churn in Compass and Werkstatt commands.
8
8
  <item>Do not fall back to non-atomic writes — fail loudly.</item>
9
9
  </non-goals>
10
10
  </MODULE_CONTRACT>
11
+ <KEY_DECISIONS>
12
+ <item>Content is compared before writing — unchanged files cost zero disk I/O and zero git churn.</item>
13
+ <item>Idempotency composes on writeFileAtomic rather than reimplementing atomic writes.</item>
14
+ </KEY_DECISIONS>
11
15
  <CHANGE_SUMMARY>
12
16
  <item>RFC-0556: moved from @warpgogol/site-kernel/fs-idempotent to forge as canonical source (dependency inversion).</item>
13
17
  <item>RFC-0603: extended to accept Uint8Array (Buffer) content for idempotent binary file writes — PNG preview images.</item>
18
+ <item>RFC-1097: step 6 — compass.migrate codemod run
19
+
20
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
21
+ <item>RFC-1097: sweep — packages/forge + services clean
22
+
23
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
24
+ <item>RFC-1097: sweep — werkstatt-engine clean
25
+
26
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
14
27
  </CHANGE_SUMMARY>
15
28
  */
16
29
 
@@ -8,8 +8,20 @@ code paths that cannot use the async `trash` npm package.</purpose>
8
8
  <item>Requires `trash-put` (trash-cli) installed on Linux/macOS. On Windows, uses PowerShell Recycle Bin API (no external binary needed).</item>
9
9
  </non-goals>
10
10
  </MODULE_CONTRACT>
11
+ <KEY_DECISIONS>
12
+ <item>A synchronous shell-out exists only for call sites that cannot await — sync is a constraint, not a preference.</item>
13
+ <item>Windows goes through the PowerShell Recycle Bin API so no external binary is required there.</item>
14
+ </KEY_DECISIONS>
11
15
  <CHANGE_SUMMARY>
12
- <item>Initial implementation: sync wrapper for `trash-put` (Linux/macOS) and PowerShell Recycle Bin (Windows).</item>
16
+ <item>RFC-1097: step 6 — compass.migrate codemod run
17
+
18
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
19
+ <item>RFC-1097: sweep — packages/forge + services clean
20
+
21
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
22
+ <item>RFC-1097: sweep — werkstatt-engine clean
23
+
24
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
13
25
  </CHANGE_SUMMARY>
14
26
  */
15
27
 
@@ -10,8 +10,20 @@ Windows.</purpose>
10
10
  <item>Do not use for ephemeral cleanup (lock files, temp files, atomic write leftovers) — those are system-internal and should use fs.unlink directly.</item>
11
11
  </non-goals>
12
12
  </MODULE_CONTRACT>
13
+ <KEY_DECISIONS>
14
+ <item>Deletion targets the OS trash or recycle bin — recoverability is the contract, never permanent unlink.</item>
15
+ <item>The trash npm package is preferred over shelling out to trash-put on Linux.</item>
16
+ </KEY_DECISIONS>
13
17
  <CHANGE_SUMMARY>
14
- <item>Initial implementation: wraps npm `trash` package with glob disabled for safe path handling.</item>
18
+ <item>RFC-1097: step 6 — compass.migrate codemod run
19
+
20
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
21
+ <item>RFC-1097: sweep — packages/forge + services clean
22
+
23
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
24
+ <item>RFC-1097: sweep — werkstatt-engine clean
25
+
26
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
15
27
  </CHANGE_SUMMARY>
16
28
  */
17
29
 
package/src/utils/fs.ts CHANGED
@@ -1,13 +1,24 @@
1
1
  /*
2
2
  <MODULE_CONTRACT>
3
- <purpose>Trivial filesystem utilities — inlined from @warpgogol/share to avoid dependency.</purpose>
3
+ <purpose>Trivial fs filesystem utilities — inlined from @warpgogol/share to avoid dependency.</purpose>
4
4
  <non-goals>
5
5
  <item>Do not add non-filesystem utilities here — use dedicated utility modules.</item>
6
6
  <item>Do not introduce @warpgogol/* imports — this package must remain dependency-free.</item>
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
+ <KEY_DECISIONS>
10
+ <item>Helpers are inlined copies, not imports — dependency-free beats sharing a package for trivial functions.</item>
11
+ </KEY_DECISIONS>
9
12
  <CHANGE_SUMMARY>
10
- <item>Initial inline of collectFiles, fileExists from @warpgogol/werkstatt-shared/share/fs.</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — packages/forge + services clean
17
+
18
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
19
+ <item>RFC-1097: sweep — werkstatt-engine clean
20
+
21
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
11
22
  </CHANGE_SUMMARY>
12
23
  */
13
24
 
@@ -32,7 +43,7 @@ export async function collectFiles(
32
43
  const results: string[] = [];
33
44
 
34
45
  // fs.walk.lint: allow — this is the canonical collectFiles implementation,
35
- // inlined from @warpgogol/werkstatt-shared/share/fs to keep @warpgogol/forge dependency-free (RFC-0303).
46
+ // inlined from @warpgogol/werkstatt-shared/node/fs to keep @warpgogol/forge dependency-free (RFC-0303).
36
47
  async function walk(dir: string): Promise<void> {
37
48
  let entries;
38
49
  try {
package/src/utils/hash.ts CHANGED
@@ -6,8 +6,19 @@
6
6
  <item>Do not introduce @warpgogol/* imports — this package must remain dependency-free.</item>
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
+ <KEY_DECISIONS>
10
+ <item>The hash helper is an inlined copy — one function does not justify a package dependency.</item>
11
+ </KEY_DECISIONS>
9
12
  <CHANGE_SUMMARY>
10
- <item>Initial inline of byteHash from @warpgogol/fingerprint/primitives.</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — packages/forge + services clean
17
+
18
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
19
+ <item>RFC-1097: sweep — werkstatt-engine clean
20
+
21
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
11
22
  </CHANGE_SUMMARY>
12
23
  */
13
24
 
@@ -1,13 +1,24 @@
1
1
  /*
2
2
  <MODULE_CONTRACT>
3
- <purpose>Barrel export for forge utilities — canonical, autonomous, no @warpgogol/* dependencies.</purpose>
3
+ <purpose>Barrel index export for forge utilities — canonical, autonomous, no @warpgogol/* dependencies.</purpose>
4
4
  <non-goals>
5
5
  <item>Do not add non-utility exports here — use the appropriate forge module.</item>
6
6
  <item>Do not re-export from @warpgogol/* packages — this package must remain dependency-free.</item>
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
+ <KEY_DECISIONS>
10
+ <item>The barrel only re-exports — no logic lives here, so import cost stays flat.</item>
11
+ </KEY_DECISIONS>
9
12
  <CHANGE_SUMMARY>
10
- <item>Initial utility barrel: fs-atomic, generated-marker, string-utils, fs, hash.</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — packages/forge + services clean
17
+
18
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
19
+ <item>RFC-1097: sweep — werkstatt-engine clean
20
+
21
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
11
22
  </CHANGE_SUMMARY>
12
23
  */
13
24
 
@@ -6,8 +6,19 @@
6
6
  <item>Do not introduce @warpgogol/* imports — this package must remain dependency-free.</item>
7
7
  </non-goals>
8
8
  </MODULE_CONTRACT>
9
+ <KEY_DECISIONS>
10
+ <item>Helpers are inlined copies, not imports — dependency-free beats sharing a package for trivial functions.</item>
11
+ </KEY_DECISIONS>
9
12
  <CHANGE_SUMMARY>
10
- <item>Initial inline of toKebabCase from @warpgogol/werkstatt-shared/share/string-utils.</item>
13
+ <item>RFC-1097: step 6 — compass.migrate codemod run
14
+
15
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
16
+ <item>RFC-1097: sweep — packages/forge + services clean
17
+
18
+ Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
19
+ <item>RFC-1097: sweep — werkstatt-engine clean
20
+
21
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
11
22
  </CHANGE_SUMMARY>
12
23
  */
13
24