safeword 0.78.2 → 0.78.4

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 (224) hide show
  1. package/codex-plugin/.codex-plugin/plugin.json +1 -1
  2. package/codex-plugin/hooks.json +5 -5
  3. package/codex-plugin/skills/bdd/references/SCENARIOS.md +3 -0
  4. package/codex-plugin/skills/bdd/references/TDD.md +11 -5
  5. package/codex-plugin/skills/closeout/SKILL.md +24 -16
  6. package/codex-plugin/skills/finish-review/SKILL.md +4 -3
  7. package/codex-plugin/skills/lint/SKILL.md +1 -1
  8. package/codex-plugin/skills/review-spec/SKILL.md +5 -1
  9. package/codex-plugin/skills/self-review/SKILL.md +2 -2
  10. package/codex-plugin/skills/ticket-system/SKILL.md +3 -0
  11. package/dist/{architecture-N5ZC4CDU.js → architecture-TCSDEFKH.js} +9 -9
  12. package/dist/{architecture-document-UBA5UT4J.js → architecture-document-L2ADWVMV.js} +6 -6
  13. package/dist/{architecture-monorepo-E4JUYJGV.js → architecture-monorepo-NKOQZBEY.js} +4 -4
  14. package/dist/{boundary-HLJILY7R.js → boundary-QP2H7C46.js} +6 -6
  15. package/dist/{chunk-NOTBZCKG.js → chunk-2XR7J5WL.js} +93 -42
  16. package/dist/chunk-2XR7J5WL.js.map +1 -0
  17. package/dist/{chunk-4CZS4YJV.js → chunk-3OKZ3X4O.js} +3 -3
  18. package/dist/{chunk-GZ36UZJG.js → chunk-73TABQRT.js} +10 -10
  19. package/dist/{chunk-4CKCRZDO.js → chunk-7ULZND56.js} +2 -2
  20. package/dist/{chunk-34NCOTP5.js → chunk-7XELS325.js} +2 -2
  21. package/dist/{chunk-USPVNZ63.js → chunk-BZWO3BVD.js} +11 -7
  22. package/dist/chunk-BZWO3BVD.js.map +1 -0
  23. package/dist/{chunk-BQTC6YGN.js → chunk-D5ENZR6N.js} +2 -2
  24. package/dist/{chunk-SME5SU3O.js → chunk-DBXX5K74.js} +258 -48
  25. package/dist/chunk-DBXX5K74.js.map +1 -0
  26. package/dist/{chunk-V63TSN3C.js → chunk-FOYGZ4MK.js} +31 -10
  27. package/dist/chunk-FOYGZ4MK.js.map +1 -0
  28. package/dist/{chunk-ZRV7TOCX.js → chunk-G5AFQXXW.js} +2 -2
  29. package/dist/{chunk-AXAGJLMP.js → chunk-G757F3EU.js} +4 -4
  30. package/dist/{chunk-KXHVFCDT.js → chunk-GFDINP7M.js} +153 -27
  31. package/dist/chunk-GFDINP7M.js.map +1 -0
  32. package/dist/{chunk-S2T356DA.js → chunk-HF3DXZEA.js} +7 -10
  33. package/dist/chunk-HF3DXZEA.js.map +1 -0
  34. package/dist/{chunk-NSZGI7HK.js → chunk-HNCUIXDY.js} +9 -9
  35. package/dist/{chunk-NSZGI7HK.js.map → chunk-HNCUIXDY.js.map} +1 -1
  36. package/dist/{chunk-BSOUMHMQ.js → chunk-IPTM5VE7.js} +101 -1094
  37. package/dist/chunk-IPTM5VE7.js.map +1 -0
  38. package/dist/chunk-JBOLNV2L.js +21 -0
  39. package/dist/chunk-JBOLNV2L.js.map +1 -0
  40. package/dist/chunk-JSR3HXFT.js +1231 -0
  41. package/dist/chunk-JSR3HXFT.js.map +1 -0
  42. package/dist/{chunk-BAVDDAN3.js → chunk-KS2ESRQL.js} +9 -9
  43. package/dist/chunk-LFC6CMMX.js +136 -0
  44. package/dist/chunk-LFC6CMMX.js.map +1 -0
  45. package/dist/{chunk-QTG2EXFT.js → chunk-LUNHU6Z3.js} +2 -2
  46. package/dist/{chunk-QTG2EXFT.js.map → chunk-LUNHU6Z3.js.map} +1 -1
  47. package/dist/{chunk-WVDRXD67.js → chunk-MLBZFB5A.js} +1 -1
  48. package/dist/chunk-MLBZFB5A.js.map +1 -0
  49. package/dist/{chunk-KFVEPQ7X.js → chunk-MVFHTUQ3.js} +2 -2
  50. package/dist/{chunk-TJ627SKI.js → chunk-O3GZ77F7.js} +15 -1
  51. package/dist/chunk-O3GZ77F7.js.map +1 -0
  52. package/dist/{chunk-Q5KLE6ZF.js → chunk-OKPRQGFG.js} +2 -2
  53. package/dist/{chunk-QUDIOBHP.js → chunk-PD7ZXRHV.js} +139 -18
  54. package/dist/chunk-PD7ZXRHV.js.map +1 -0
  55. package/dist/chunk-QAHJSG53.js +30 -0
  56. package/dist/chunk-QAHJSG53.js.map +1 -0
  57. package/dist/{chunk-3SOJBMM6.js → chunk-R6BSRNU4.js} +6 -6
  58. package/dist/{chunk-3SOJBMM6.js.map → chunk-R6BSRNU4.js.map} +1 -1
  59. package/dist/{chunk-J7UDLLTK.js → chunk-RQ7RZYNB.js} +39 -25
  60. package/dist/chunk-RQ7RZYNB.js.map +1 -0
  61. package/dist/{chunk-664YNAMR.js → chunk-RTFPKJJV.js} +5 -5
  62. package/dist/{chunk-GKR44BCH.js → chunk-RVDXBHUG.js} +2 -2
  63. package/dist/chunk-THLEVFEX.js +22 -0
  64. package/dist/chunk-THLEVFEX.js.map +1 -0
  65. package/dist/{chunk-A7Z27COA.js → chunk-VFWAZLEF.js} +3 -3
  66. package/dist/{chunk-I4KBHRZW.js → chunk-VJUPD7JI.js} +7 -7
  67. package/dist/{chunk-3EJNDIAO.js → chunk-VZ5B2SIO.js} +2 -2
  68. package/dist/chunk-WAMQTZAH.js +19 -0
  69. package/dist/chunk-WAMQTZAH.js.map +1 -0
  70. package/dist/{chunk-FDHJ63FZ.js → chunk-WVA4Q6BX.js} +1 -1
  71. package/dist/{chunk-FDHJ63FZ.js.map → chunk-WVA4Q6BX.js.map} +1 -1
  72. package/dist/{chunk-AV5LTEME.js → chunk-YZ5JGDOV.js} +30 -134
  73. package/dist/chunk-YZ5JGDOV.js.map +1 -0
  74. package/dist/{cleanup-X556LNWM.js → cleanup-JNLZ7AXA.js} +9 -9
  75. package/dist/{cleanup-command-RV2Q7G72.js → cleanup-command-MFAYNYRW.js} +15 -15
  76. package/dist/cli.js +152 -109
  77. package/dist/cli.js.map +1 -1
  78. package/dist/{clients-HP23HRN2.js → clients-7AJBKEWF.js} +2 -2
  79. package/dist/codex-bootstrap-KFNUS63Y.js +252 -0
  80. package/dist/codex-bootstrap-KFNUS63Y.js.map +1 -0
  81. package/dist/{codex-hook-IPX3PDXX.js → codex-hook-TNMYVOR7.js} +57 -49
  82. package/dist/codex-hook-TNMYVOR7.js.map +1 -0
  83. package/dist/{codify-J5ZLJ3HK.js → codify-RBWBRXQO.js} +11 -8
  84. package/dist/codify-RBWBRXQO.js.map +1 -0
  85. package/dist/{commands-L4AINARC.js → commands-4UXHBZFD.js} +127 -71
  86. package/dist/commands-4UXHBZFD.js.map +1 -0
  87. package/dist/{config-LUSJAK6B.js → config-GS7BTZJD.js} +2 -2
  88. package/dist/{configured-paths-SPQ5XWOM.js → configured-paths-CREUDQF3.js} +4 -4
  89. package/dist/contract-42CIWIWV.js +8 -0
  90. package/dist/{coordinator-SA75UB3C.js → coordinator-WOPGWDXK.js} +231 -144
  91. package/dist/coordinator-WOPGWDXK.js.map +1 -0
  92. package/dist/corpus-CAFYEMBO.js +15 -0
  93. package/dist/{doctor-DSC36R4U.js → doctor-AZP5D7QP.js} +21 -21
  94. package/dist/{feature-directories-VOHVV26X.js → feature-directories-6TLM7Y4H.js} +6 -6
  95. package/dist/{finalization-7SMLMVLV.js → finalization-AQT3SOP7.js} +4 -4
  96. package/dist/{gh-cli-ZMO7D2KE.js → gh-cli-XCQT5ST7.js} +2 -2
  97. package/dist/{github-rest-KGKS4V2H.js → github-rest-CXFJ2NFF.js} +2 -2
  98. package/dist/index.js +2 -2
  99. package/dist/{job-CDADLJDF.js → job-4POTQJZK.js} +20 -21
  100. package/dist/job-4POTQJZK.js.map +1 -0
  101. package/dist/{learning-sync-6BTHM6ZC.js → learning-sync-QVXBOP6J.js} +4 -4
  102. package/dist/{legacy-global-guidance-2JL4Y5EB.js → legacy-global-guidance-CPGUUNJI.js} +5 -5
  103. package/dist/{lint-gherkin-COSHVS6Z.js → lint-gherkin-LZ45NG4A.js} +7 -7
  104. package/dist/{operations-XVRQSLJG.js → operations-ODOA5CDG.js} +18 -16
  105. package/dist/{output-3LB2OEHN.js → output-QTZCFLAY.js} +2 -2
  106. package/dist/{packet-5WT5M3OS.js → packet-5G6RT2EW.js} +2 -2
  107. package/dist/presets/typescript/index.js +2 -2
  108. package/dist/{profile-UMKQ5JVO.js → profile-QGLZNLRU.js} +7 -7
  109. package/dist/{prompt-GWYDFMLO.js → prompt-UCTSCXSS.js} +2 -2
  110. package/dist/remove-UQPEXXNP.js +23 -0
  111. package/dist/{retro-IFSVU5KS.js → retro-ELKR6GHF.js} +8 -8
  112. package/dist/{retro-draft-spool-4S3TCHWL.js → retro-draft-spool-M75BTT32.js} +2 -2
  113. package/dist/{retro-extract-OSBFAXLU.js → retro-extract-RA6THOC4.js} +2 -2
  114. package/dist/{review-pr-6S2352CK.js → review-pr-MN6QESAJ.js} +2 -2
  115. package/dist/{review-pr-publication-CGHCRRUI.js → review-pr-publication-6AVOGWR2.js} +2 -2
  116. package/dist/{run-5JESKXUR.js → run-JFDGRAH2.js} +4 -4
  117. package/dist/{self-report-VPHBPPSJ.js → self-report-5APRPB5P.js} +2 -2
  118. package/dist/status-ATFG6Q3K.js +21 -0
  119. package/dist/{status-EX4L3ELO.js → status-HIQSP3F5.js} +21 -21
  120. package/dist/{sync-config-O7J7IDGE.js → sync-config-XPAJKBRO.js} +5 -5
  121. package/dist/{sync-tracker-U2GYOFUO.js → sync-tracker-3E5BWX73.js} +6 -6
  122. package/dist/{test-execution-6LIPMBIH.js → test-execution-VDECX7TO.js} +8 -7
  123. package/dist/{test-execution-6LIPMBIH.js.map → test-execution-VDECX7TO.js.map} +1 -1
  124. package/dist/{test-plan-VASHZXJ7.js → test-plan-2L7A7UZV.js} +7 -6
  125. package/dist/{test-plan-VASHZXJ7.js.map → test-plan-2L7A7UZV.js.map} +1 -1
  126. package/dist/{ticket-new-3YXDIWPC.js → ticket-new-HZKNZ5GO.js} +11 -11
  127. package/dist/ticket-new-HZKNZ5GO.js.map +1 -0
  128. package/dist/{ticket-sync-LLUBXZ2R.js → ticket-sync-4QJD3KOL.js} +5 -5
  129. package/dist/{tracker-map-HR4MBYG5.js → tracker-map-CFMFIEER.js} +2 -2
  130. package/dist/{tracker-sync-YDICZN66.js → tracker-sync-MOPJE6M7.js} +2 -2
  131. package/package.json +1 -1
  132. package/templates/SAFEWORD.md +2 -2
  133. package/templates/commands/lint.md +1 -1
  134. package/templates/scripts/closeout-cleanup.ts +127 -31
  135. package/templates/skills/bdd/SCENARIOS.md +3 -0
  136. package/templates/skills/bdd/TDD.md +11 -5
  137. package/templates/skills/closeout/SKILL.md +25 -17
  138. package/templates/skills/finish-review/SKILL.md +4 -3
  139. package/templates/skills/lint/SKILL.md +1 -1
  140. package/templates/skills/review-spec/SKILL.md +5 -1
  141. package/templates/skills/self-review/SKILL.md +2 -2
  142. package/templates/skills/ticket-system/SKILL.md +3 -0
  143. package/dist/chunk-6S7CTKGC.js +0 -128
  144. package/dist/chunk-6S7CTKGC.js.map +0 -1
  145. package/dist/chunk-AV5LTEME.js.map +0 -1
  146. package/dist/chunk-BSOUMHMQ.js.map +0 -1
  147. package/dist/chunk-J7UDLLTK.js.map +0 -1
  148. package/dist/chunk-KXHVFCDT.js.map +0 -1
  149. package/dist/chunk-NOTBZCKG.js.map +0 -1
  150. package/dist/chunk-QUDIOBHP.js.map +0 -1
  151. package/dist/chunk-S2T356DA.js.map +0 -1
  152. package/dist/chunk-SME5SU3O.js.map +0 -1
  153. package/dist/chunk-TJ627SKI.js.map +0 -1
  154. package/dist/chunk-USPVNZ63.js.map +0 -1
  155. package/dist/chunk-V63TSN3C.js.map +0 -1
  156. package/dist/chunk-WRUXO3WA.js +0 -48
  157. package/dist/chunk-WRUXO3WA.js.map +0 -1
  158. package/dist/chunk-WVDRXD67.js.map +0 -1
  159. package/dist/codex-bootstrap-MGY2D6HU.js +0 -178
  160. package/dist/codex-bootstrap-MGY2D6HU.js.map +0 -1
  161. package/dist/codex-hook-IPX3PDXX.js.map +0 -1
  162. package/dist/codify-J5ZLJ3HK.js.map +0 -1
  163. package/dist/commands-L4AINARC.js.map +0 -1
  164. package/dist/contract-KEZY6YC3.js +0 -8
  165. package/dist/coordinator-SA75UB3C.js.map +0 -1
  166. package/dist/corpus-PPOBTF4J.js +0 -15
  167. package/dist/job-CDADLJDF.js.map +0 -1
  168. package/dist/remove-E6HGNHOU.js +0 -22
  169. package/dist/status-7VIGNTUI.js +0 -21
  170. package/dist/ticket-new-3YXDIWPC.js.map +0 -1
  171. /package/dist/{architecture-N5ZC4CDU.js.map → architecture-TCSDEFKH.js.map} +0 -0
  172. /package/dist/{architecture-document-UBA5UT4J.js.map → architecture-document-L2ADWVMV.js.map} +0 -0
  173. /package/dist/{architecture-monorepo-E4JUYJGV.js.map → architecture-monorepo-NKOQZBEY.js.map} +0 -0
  174. /package/dist/{boundary-HLJILY7R.js.map → boundary-QP2H7C46.js.map} +0 -0
  175. /package/dist/{chunk-4CZS4YJV.js.map → chunk-3OKZ3X4O.js.map} +0 -0
  176. /package/dist/{chunk-GZ36UZJG.js.map → chunk-73TABQRT.js.map} +0 -0
  177. /package/dist/{chunk-4CKCRZDO.js.map → chunk-7ULZND56.js.map} +0 -0
  178. /package/dist/{chunk-34NCOTP5.js.map → chunk-7XELS325.js.map} +0 -0
  179. /package/dist/{chunk-BQTC6YGN.js.map → chunk-D5ENZR6N.js.map} +0 -0
  180. /package/dist/{chunk-ZRV7TOCX.js.map → chunk-G5AFQXXW.js.map} +0 -0
  181. /package/dist/{chunk-AXAGJLMP.js.map → chunk-G757F3EU.js.map} +0 -0
  182. /package/dist/{chunk-BAVDDAN3.js.map → chunk-KS2ESRQL.js.map} +0 -0
  183. /package/dist/{chunk-KFVEPQ7X.js.map → chunk-MVFHTUQ3.js.map} +0 -0
  184. /package/dist/{chunk-Q5KLE6ZF.js.map → chunk-OKPRQGFG.js.map} +0 -0
  185. /package/dist/{chunk-664YNAMR.js.map → chunk-RTFPKJJV.js.map} +0 -0
  186. /package/dist/{chunk-GKR44BCH.js.map → chunk-RVDXBHUG.js.map} +0 -0
  187. /package/dist/{chunk-A7Z27COA.js.map → chunk-VFWAZLEF.js.map} +0 -0
  188. /package/dist/{chunk-I4KBHRZW.js.map → chunk-VJUPD7JI.js.map} +0 -0
  189. /package/dist/{chunk-3EJNDIAO.js.map → chunk-VZ5B2SIO.js.map} +0 -0
  190. /package/dist/{cleanup-X556LNWM.js.map → cleanup-JNLZ7AXA.js.map} +0 -0
  191. /package/dist/{cleanup-command-RV2Q7G72.js.map → cleanup-command-MFAYNYRW.js.map} +0 -0
  192. /package/dist/{clients-HP23HRN2.js.map → clients-7AJBKEWF.js.map} +0 -0
  193. /package/dist/{config-LUSJAK6B.js.map → config-GS7BTZJD.js.map} +0 -0
  194. /package/dist/{configured-paths-SPQ5XWOM.js.map → configured-paths-CREUDQF3.js.map} +0 -0
  195. /package/dist/{contract-KEZY6YC3.js.map → contract-42CIWIWV.js.map} +0 -0
  196. /package/dist/{corpus-PPOBTF4J.js.map → corpus-CAFYEMBO.js.map} +0 -0
  197. /package/dist/{doctor-DSC36R4U.js.map → doctor-AZP5D7QP.js.map} +0 -0
  198. /package/dist/{feature-directories-VOHVV26X.js.map → feature-directories-6TLM7Y4H.js.map} +0 -0
  199. /package/dist/{finalization-7SMLMVLV.js.map → finalization-AQT3SOP7.js.map} +0 -0
  200. /package/dist/{gh-cli-ZMO7D2KE.js.map → gh-cli-XCQT5ST7.js.map} +0 -0
  201. /package/dist/{github-rest-KGKS4V2H.js.map → github-rest-CXFJ2NFF.js.map} +0 -0
  202. /package/dist/{learning-sync-6BTHM6ZC.js.map → learning-sync-QVXBOP6J.js.map} +0 -0
  203. /package/dist/{legacy-global-guidance-2JL4Y5EB.js.map → legacy-global-guidance-CPGUUNJI.js.map} +0 -0
  204. /package/dist/{lint-gherkin-COSHVS6Z.js.map → lint-gherkin-LZ45NG4A.js.map} +0 -0
  205. /package/dist/{operations-XVRQSLJG.js.map → operations-ODOA5CDG.js.map} +0 -0
  206. /package/dist/{output-3LB2OEHN.js.map → output-QTZCFLAY.js.map} +0 -0
  207. /package/dist/{packet-5WT5M3OS.js.map → packet-5G6RT2EW.js.map} +0 -0
  208. /package/dist/{profile-UMKQ5JVO.js.map → profile-QGLZNLRU.js.map} +0 -0
  209. /package/dist/{prompt-GWYDFMLO.js.map → prompt-UCTSCXSS.js.map} +0 -0
  210. /package/dist/{remove-E6HGNHOU.js.map → remove-UQPEXXNP.js.map} +0 -0
  211. /package/dist/{retro-IFSVU5KS.js.map → retro-ELKR6GHF.js.map} +0 -0
  212. /package/dist/{retro-draft-spool-4S3TCHWL.js.map → retro-draft-spool-M75BTT32.js.map} +0 -0
  213. /package/dist/{retro-extract-OSBFAXLU.js.map → retro-extract-RA6THOC4.js.map} +0 -0
  214. /package/dist/{review-pr-6S2352CK.js.map → review-pr-MN6QESAJ.js.map} +0 -0
  215. /package/dist/{review-pr-publication-CGHCRRUI.js.map → review-pr-publication-6AVOGWR2.js.map} +0 -0
  216. /package/dist/{run-5JESKXUR.js.map → run-JFDGRAH2.js.map} +0 -0
  217. /package/dist/{self-report-VPHBPPSJ.js.map → self-report-5APRPB5P.js.map} +0 -0
  218. /package/dist/{status-7VIGNTUI.js.map → status-ATFG6Q3K.js.map} +0 -0
  219. /package/dist/{status-EX4L3ELO.js.map → status-HIQSP3F5.js.map} +0 -0
  220. /package/dist/{sync-config-O7J7IDGE.js.map → sync-config-XPAJKBRO.js.map} +0 -0
  221. /package/dist/{sync-tracker-U2GYOFUO.js.map → sync-tracker-3E5BWX73.js.map} +0 -0
  222. /package/dist/{ticket-sync-LLUBXZ2R.js.map → ticket-sync-4QJD3KOL.js.map} +0 -0
  223. /package/dist/{tracker-map-HR4MBYG5.js.map → tracker-map-CFMFIEER.js.map} +0 -0
  224. /package/dist/{tracker-sync-YDICZN66.js.map → tracker-sync-MOPJE6M7.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lifecycle/commands.ts","../src/lifecycle/project-install.ts","../src/packs/install.ts","../src/utils/hook-nudge.ts","../src/utils/namespace-migration.ts","../src/utils/safeword-version-sync.ts","../src/utils/setup-workspaces.ts","../src/utils/stale-config-scan.ts","../src/utils/vendored-ignores-nudge.ts","../src/utils/eslint-auto-patch.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nimport { type AgentIntegration, parseAgentSelection } from '../cli-protocol/agent-selection.js';\nimport type { CommandInvocation } from '../cli-protocol/handler.js';\nimport { onlineRequired } from '../cli-protocol/online-required.js';\nimport { type CliPlan, createPlan, toWirePlan } from '../cli-protocol/plan.js';\nimport { createReconciliationPlan } from '../cli-protocol/reconciliation.js';\nimport {\n type CliResult,\n combinedResultState,\n combineEffects,\n createResult,\n type Effects,\n type NextAction,\n} from '../cli-protocol/result.js';\nimport { removeProject } from '../commands/remove.js';\nimport type { SafewordSchema } from '../schema.js';\nimport { hasCursorProjectAssets, observeCursorProject } from './cursor.js';\nimport { convergeSetup, createSetupPlan, type SetupPlanOptions } from './project-install.js';\nimport { projectLifecycleSchema } from './schema.js';\n\ninterface LifecycleInstallAdapters {\n readonly installClaude: () => Promise<CliResult>;\n readonly installCodex: () => Promise<CliResult>;\n}\n\n/** Reporting order for install surfaces: project first, then each integration. */\nconst LIFECYCLE_SURFACE_ORDER: readonly ('project' | AgentIntegration)[] = [\n 'project',\n 'claude',\n 'codex',\n 'cursor',\n];\n\ninterface SurfaceResult {\n readonly name: string;\n readonly result: CliResult;\n}\n\nfunction codexLegacyHandoffDeferred(result: CliResult): boolean {\n return result.findings.some(finding => finding.code === 'CODEX_PLUGIN_HANDOFF_DEFERRED');\n}\n\nfunction activationActionsFor(surface: SurfaceResult): string[] {\n if (surface.name === 'claude' && surface.result.changed) return ['run /reload-plugins'];\n if (surface.name === 'codex' && surface.result.state === 'action_required') {\n return ['restart Codex', 'start a new Codex task'];\n }\n return [];\n}\n\n/** One entry per distinct action: surfaces can independently suggest the same next step. */\nfunction uniqueNextActions(actions: readonly NextAction[]): NextAction[] {\n const seen = new Set<string>();\n return actions.filter(action => {\n const identity =\n 'command' in action ? `command:${action.command}` : `human:${action.instruction}`;\n if (seen.has(identity)) return false;\n seen.add(identity);\n return true;\n });\n}\n\nfunction projectReloadSuperseded(\n command: string,\n surface: SurfaceResult,\n surfaceByName: ReadonlyMap<string, SurfaceResult>,\n): boolean {\n if (command !== '/reload-plugins' || surface.name !== 'project') return false;\n return surfaceByName.has('claude');\n}\n\nfunction normalizedProjectInstallAction(\n action: Extract<NextAction, { readonly command: string }>,\n surface: SurfaceResult,\n surfaceByName: ReadonlyMap<string, SurfaceResult>,\n): NextAction[] | undefined {\n // The project surface computes its next action before the agent surfaces\n // run, so it can suggest installing an agent this very run already handled.\n // Drop that: the agent's own activation action is the accurate next step,\n // and repeating the install is not.\n const unifiedInstall = /^safeword install --agents=(claude|codex)$/u.exec(action.command);\n if (unifiedInstall === null || surface.name !== 'project') return undefined;\n const target = surfaceByName.get(unifiedInstall[1] ?? '');\n return target !== undefined && target.result.state !== 'failed' ? [] : [action];\n}\n\nfunction normalizedProfileInstallAction(\n action: Extract<NextAction, { readonly command: string }>,\n surface: SurfaceResult,\n): NextAction[] {\n const profileInstall = /^safeword (claude|codex) install$/u.exec(action.command);\n if (profileInstall === null) return [action];\n if (surface.result.state !== 'failed' || surface.name !== profileInstall[1]) return [];\n return [{ ...action, command: `safeword install --agents=${surface.name}` }];\n}\n\nfunction normalizedInstallNextAction(\n action: NextAction,\n surface: SurfaceResult,\n surfaceByName: ReadonlyMap<string, SurfaceResult>,\n): NextAction[] {\n if (!('command' in action)) return [action];\n if (projectReloadSuperseded(action.command, surface, surfaceByName)) return [];\n const projectAction = normalizedProjectInstallAction(action, surface, surfaceByName);\n return projectAction ?? normalizedProfileInstallAction(action, surface);\n}\n\nfunction normalizedInstallNextActions(\n surface: SurfaceResult,\n surfaceByName: ReadonlyMap<string, SurfaceResult>,\n): NextAction[] {\n return surface.result.nextActions.flatMap(action =>\n normalizedInstallNextAction(action, surface, surfaceByName),\n );\n}\n\nfunction combineInstallResults(\n agents: readonly string[],\n surfaces: readonly SurfaceResult[],\n): CliResult {\n const results = surfaces.map(surface => surface.result);\n const effects = combineEffects(results.map(result => result.effects));\n const surfaceByName = new Map(surfaces.map(surface => [surface.name, surface]));\n return createResult({\n state: combinedResultState(results),\n changed: results.some(result => result.changed),\n effects,\n findings: results.flatMap(result => result.findings),\n errors: results.flatMap(result => result.errors),\n recovery: results.flatMap(result => result.recovery),\n nextActions: uniqueNextActions(\n surfaces.flatMap(surface => normalizedInstallNextActions(surface, surfaceByName)),\n ),\n data: {\n command: 'install',\n operation: 'install',\n selected_agents: agents,\n surfaces: LIFECYCLE_SURFACE_ORDER.map(name => {\n const surface = surfaceByName.get(name);\n if (surface === undefined) return { name, selected: false };\n const activationActions = activationActionsFor(surface);\n return {\n name,\n selected: true,\n state: surface.result.state,\n ...(activationActions.length > 0 && { activation_actions: activationActions }),\n };\n }),\n },\n });\n}\n\nasync function installProjectSurface(\n invocation: CommandInvocation,\n agents: readonly string[],\n): Promise<CliResult> {\n const projectSchema = projectLifecycleSchema(invocation.cwd, agents);\n return convergeSetup(invocation.cwd, {\n noModify: invocation.options.modify === false,\n repairVersionMarker: invocation.options.repairVersionMarker === true,\n migrateNamespace:\n typeof invocation.options.migrateNamespace === 'boolean'\n ? invocation.options.migrateNamespace\n : undefined,\n progress: invocation.progress,\n schema: projectSchema,\n });\n}\n\nasync function installAgentSurfaces(\n cwd: string,\n agents: readonly string[],\n projectResult: CliResult,\n adapters: LifecycleInstallAdapters,\n): Promise<SurfaceResult[]> {\n const surfaces: SurfaceResult[] = [];\n if (agents.includes('claude')) {\n surfaces.push({ name: 'claude', result: await adapters.installClaude() });\n }\n if (agents.includes('codex')) {\n // Project convergence already attempted the legacy handoff. Its failure is\n // deliberately advisory: legacy hooks remain active and the project\n // bootstrap retries for the next task/developer. Retrying the same profile\n // mutation here only changes that safe, loud outcome into a fatal install.\n if (codexLegacyHandoffDeferred(projectResult)) {\n surfaces.push({ name: 'codex', result: createResult({ state: 'healthy' }) });\n } else {\n surfaces.push({ name: 'codex', result: await adapters.installCodex() });\n }\n }\n if (agents.includes('cursor')) {\n // Cursor has no host process; its outcome is read back from the assets the\n // project reconciliation just wrote, never mirrored from the project state.\n const observed = observeCursorProject(cwd, projectLifecycleSchema(cwd, agents));\n surfaces.push({\n name: 'cursor',\n result: { ...observed, changed: projectResult.changed },\n });\n }\n return surfaces;\n}\n\nexport async function installLifecycle(\n invocation: CommandInvocation,\n adapters: LifecycleInstallAdapters,\n): Promise<CliResult> {\n const parsed = parseAgentSelection(invocation.options.agents);\n if (!parsed.ok) {\n return createResult({\n state: 'failed',\n errors: [{ ...parsed.error, retryable: false }],\n data: { command: 'install' },\n });\n }\n const { agents } = parsed.selection;\n const scope = lifecycleScope(invocation.options.scope, 'install', agents);\n if (!scope.ok) return scope.result;\n const requiresProfileNetwork = agents.some(agent => agent === 'claude' || agent === 'codex');\n if (invocation.offline && requiresProfileNetwork) return onlineRequired('install');\n\n const projectResult = await installProjectSurface(invocation, agents);\n const surfaces = await installAgentSurfaces(invocation.cwd, agents, projectResult, adapters);\n return combineInstallResults(agents, [{ name: 'project', result: projectResult }, ...surfaces]);\n}\n\nconst EMPTY_SURFACE_EFFECTS: Effects = {\n files: [],\n packages: [],\n configuration: [],\n network: [],\n destructive: [],\n};\n\nfunction profileUninstallEffects(agent: 'claude' | 'codex', scope: 'project' | 'user'): Effects {\n let label = 'Codex profile plugin';\n if (agent === 'claude') {\n label = scope === 'project' ? 'Claude project plugin' : 'Claude profile plugin';\n }\n const operation = agent === 'claude' && scope === 'project' ? 'project' : 'profile';\n return {\n files: [],\n packages: [],\n configuration: [{ kind: 'deactivate', target: label, operation }],\n network: [],\n destructive: [{ kind: 'remove', target: label, operation }],\n };\n}\n\nfunction agentInstallEffects(\n agent: Exclude<AgentIntegration, 'cursor'>,\n scope: 'project' | 'user',\n): Effects {\n if (agent === 'claude') {\n return {\n files: [],\n packages: [],\n configuration: [\n { kind: 'add', target: 'safeword', operation: scope },\n { kind: 'enable', target: 'safeword marketplace auto-update', operation: scope },\n {\n kind: 'enable',\n target: 'safeword last-known-good marketplace fallback',\n operation: scope,\n },\n { kind: 'install', target: 'safeword@safeword', operation: scope },\n ],\n network: [\n { kind: 'add', target: 'Claude plugin marketplace', operation: scope },\n { kind: 'install', target: 'Claude plugin marketplace', operation: scope },\n ],\n destructive: [],\n };\n }\n return {\n files: [],\n packages: [],\n configuration: [{ kind: 'enable', target: 'Safeword Codex profile plugin' }],\n network: [],\n destructive: [],\n };\n}\n\ninterface PreparedLifecycle {\n readonly agents: readonly AgentIntegration[];\n readonly projectSchema: SafewordSchema;\n readonly projectPlan: CliPlan;\n readonly full: boolean;\n readonly scope: 'project' | 'user';\n readonly surfaces: readonly { readonly name: string; readonly effects: Effects }[];\n readonly plan: CliPlan;\n}\n\ninterface PrepareLifecycleOptions {\n readonly full?: boolean;\n readonly install?: SetupPlanOptions;\n readonly scope?: 'project' | 'user';\n}\n\ninterface ProfilePrecondition {\n readonly agent: 'claude' | 'codex';\n readonly observation: unknown;\n}\n\nfunction serializedProfilePreconditions(\n cwd: string,\n observations: readonly ProfilePrecondition[],\n): string {\n return JSON.stringify(observations, (_key, value: unknown) =>\n typeof value === 'string' ? value.replaceAll(cwd, '<project>') : value,\n );\n}\n\nasync function profilePreconditions(\n cwd: string,\n agents: readonly AgentIntegration[],\n scope: 'project' | 'user',\n operation: 'install' | 'uninstall',\n): Promise<ProfilePrecondition[]> {\n const observations: ProfilePrecondition[] = [];\n if (agents.includes('claude')) {\n const { claudeInstallRequiresMutation, observeClaudeProfile } =\n await import('../claude-plugin/profile.js');\n observations.push({\n agent: 'claude',\n observation: {\n ...observeClaudeProfile(cwd, scope),\n ...(operation === 'install' && {\n installRequired: claudeInstallRequiresMutation(cwd, scope),\n }),\n },\n });\n }\n if (agents.includes('codex')) {\n const { codexInstallRequiresMutation, observeCodexMigrationResult } =\n await import('../codex-plugin/operations.js');\n const observation = observeCodexMigrationResult(cwd);\n observations.push({\n agent: 'codex',\n observation: {\n ...observation,\n ...(operation === 'install' && {\n installRequired: codexInstallRequiresMutation(observation),\n }),\n },\n });\n }\n return observations;\n}\n\nfunction observedAgentEffects(\n operation: 'install' | 'uninstall',\n agent: AgentIntegration,\n observation: unknown,\n scope: 'project' | 'user',\n): Effects {\n if (agent === 'cursor') return EMPTY_SURFACE_EFFECTS;\n if (agent === 'claude') {\n const observed = observation as {\n readonly health?: string;\n readonly installRequired?: boolean;\n readonly plugin?: unknown;\n };\n if (operation === 'install') {\n return observed.installRequired === false\n ? EMPTY_SURFACE_EFFECTS\n : agentInstallEffects(agent, scope);\n }\n return observed.plugin === undefined\n ? EMPTY_SURFACE_EFFECTS\n : profileUninstallEffects(agent, scope);\n }\n const observed = observation as {\n readonly installRequired?: boolean;\n readonly plugin?: { readonly installed?: boolean };\n };\n if (operation === 'install') {\n return observed.installRequired === false\n ? EMPTY_SURFACE_EFFECTS\n : agentInstallEffects(agent, scope);\n }\n return observed.plugin?.installed === true\n ? profileUninstallEffects(agent, scope)\n : EMPTY_SURFACE_EFFECTS;\n}\n\nasync function prepareLifecycle(\n cwd: string,\n operation: 'install' | 'uninstall',\n agents: readonly AgentIntegration[],\n options: PrepareLifecycleOptions = {},\n): Promise<PreparedLifecycle> {\n const { full = false, install: installOptions = {}, scope = 'project' } = options;\n const uninstalling = operation === 'uninstall';\n const projectSchema = projectLifecycleSchema(cwd, agents);\n const uninstallOperation = full ? 'uninstall-full' : 'uninstall';\n const project = uninstalling\n ? await createReconciliationPlan(cwd, uninstallOperation, projectSchema)\n : {\n plan: await createSetupPlan(cwd, projectSchema, installOptions),\n dryRun: undefined,\n };\n const observations = await profilePreconditions(cwd, agents, scope, operation);\n const observationByAgent = new Map(\n observations.map(observation => [observation.agent, observation.observation]),\n );\n const surfaces = [\n { name: 'project', effects: project.plan.effects },\n ...agents.map(agent => ({\n name: agent,\n effects: observedAgentEffects(\n operation,\n agent,\n agent === 'cursor' ? undefined : observationByAgent.get(agent),\n scope,\n ),\n })),\n ];\n const preconditionDigest = createHash('sha256')\n .update(\n JSON.stringify([\n project.plan.preconditionDigest,\n agents,\n scope,\n serializedProfilePreconditions(cwd, observations),\n ]),\n )\n .digest('hex');\n return {\n agents,\n projectSchema,\n projectPlan: project.plan,\n full: uninstalling && full,\n scope,\n surfaces,\n plan: createPlan({\n command: operation,\n preconditionDigest,\n effects: combineEffects(surfaces.map(surface => surface.effects)),\n requiresConfirmation: uninstalling,\n verification: [{ description: 'Re-run safeword status', command: 'safeword status' }],\n }),\n };\n}\n\nfunction lifecyclePlanResult(\n operation: 'install' | 'uninstall',\n prepared: PreparedLifecycle,\n installOptions: SetupPlanOptions = {},\n): CliResult {\n const hasEffects = Object.values(prepared.plan.effects).some(effects => effects.length > 0);\n const selected = prepared.agents.length === 0 ? 'none' : prepared.agents.join(',');\n const scopeFlag = prepared.agents.includes('claude') ? ` --scope=${prepared.scope}` : '';\n const installFlags = installReplayFlags(installOptions);\n return createResult({\n state: hasEffects ? 'action_required' : 'healthy',\n findings: hasEffects\n ? [\n {\n code: 'LIFECYCLE_EFFECTS_PLANNED',\n message: `Safeword can ${operation} the selected lifecycle surfaces.`,\n severity: 'warning',\n },\n ]\n : [],\n nextActions: hasEffects\n ? [\n {\n command:\n operation === 'install'\n ? `safeword install --agents=${selected}${scopeFlag}${installFlags}`\n : `safeword uninstall --agents=${selected}${scopeFlag} --yes --plan ${prepared.plan.id}`,\n mutates: true,\n requiresHuman: operation === 'uninstall',\n },\n ]\n : [],\n data: {\n command: 'plan',\n operation,\n selected_agents: prepared.agents,\n surfaces: prepared.surfaces.map(surface => ({\n name: surface.name,\n selected: true,\n state: 'planned',\n })),\n plan: toWirePlan(prepared.plan),\n },\n });\n}\n\nfunction installReplayFlags(options: SetupPlanOptions): string {\n return [\n options.noModify === true ? '--no-modify' : undefined,\n options.migrateNamespace === true ? '--migrate-namespace' : undefined,\n options.migrateNamespace === false ? '--no-migrate-namespace' : undefined,\n options.repairVersionMarker === true ? '--repair-version-marker' : undefined,\n ]\n .filter(flag => flag !== undefined)\n .map(flag => ` ${flag}`)\n .join('');\n}\n\nfunction lifecycleScope(\n value: unknown,\n command: 'install' | 'plan' | 'uninstall',\n agents: readonly AgentIntegration[],\n):\n | { readonly ok: true; readonly value: 'project' | 'user' }\n | { readonly ok: false; readonly result: CliResult } {\n if (value === undefined || value === 'project') return { ok: true, value: 'project' };\n if (value === 'user' && agents.includes('claude')) return { ok: true, value: 'user' };\n const message =\n value === 'user'\n ? 'User scope requires Claude in the selected agents.'\n : 'Claude plugin scope must be either project or user.';\n return {\n ok: false,\n result: createResult({\n state: 'failed',\n errors: [\n {\n code: 'CLI_ARGUMENT_INVALID',\n message,\n retryable: false,\n },\n ],\n data: { command },\n }),\n };\n}\n\nexport async function planLifecycle(invocation: CommandInvocation): Promise<CliResult> {\n const parsed = parseAgentSelection(invocation.options.agents);\n if (!parsed.ok) {\n return createResult({\n state: 'failed',\n errors: [{ ...parsed.error, retryable: false }],\n data: { command: 'plan' },\n });\n }\n const operand = invocation.operands[0];\n const operation = operand === undefined ? 'install' : operand;\n if (operation !== 'install' && operation !== 'uninstall') {\n return createResult({\n state: 'failed',\n errors: [\n {\n code: 'LIFECYCLE_OPERATION_INVALID',\n message: 'Plan operation must be install or uninstall.',\n retryable: false,\n },\n ],\n data: { command: 'plan' },\n });\n }\n const scope = lifecycleScope(invocation.options.scope, 'plan', parsed.selection.agents);\n if (!scope.ok) return scope.result;\n const installOptions: SetupPlanOptions = {\n noModify: invocation.options.modify === false,\n repairVersionMarker: invocation.options.repairVersionMarker === true,\n ...(typeof invocation.options.migrateNamespace === 'boolean' && {\n migrateNamespace: invocation.options.migrateNamespace,\n }),\n };\n const prepared =\n operation === 'install'\n ? await prepareLifecycle(invocation.cwd, 'install', parsed.selection.agents, {\n install: installOptions,\n scope: scope.value,\n })\n : await prepareLifecycle(invocation.cwd, 'uninstall', parsed.selection.agents, {\n scope: scope.value,\n });\n return lifecyclePlanResult(operation, prepared, installOptions);\n}\n\nfunction staleUninstallPlan(plan: CliPlan): CliResult {\n return createResult({\n state: 'action_required',\n findings: [\n {\n code: 'PLAN_STALE',\n message: 'Selected project or profile state changed after this uninstall plan was created.',\n severity: 'warning',\n },\n ],\n nextActions: [{ command: 'safeword uninstall', mutates: false, requiresHuman: true }],\n data: { command: 'uninstall', plan: toWirePlan(plan) },\n });\n}\n\nasync function uninstallProfileSurfaces(\n cwd: string,\n agents: readonly AgentIntegration[],\n scope: 'project' | 'user',\n): Promise<SurfaceResult[]> {\n const completed: SurfaceResult[] = [];\n if (agents.includes('claude')) {\n const { uninstallClaudePlugin } = await import('../claude-plugin/profile.js');\n completed.push({ name: 'claude', result: uninstallClaudePlugin(cwd, scope) });\n }\n if (agents.includes('codex')) {\n const { uninstallCodexPlugin } = await import('../codex-plugin/operations.js');\n completed.push({ name: 'codex', result: uninstallCodexPlugin() });\n }\n return completed;\n}\n\nasync function applyPreparedLifecycle(\n cwd: string,\n prepared: PreparedLifecycle,\n): Promise<CliResult> {\n const cursorSelected = prepared.agents.includes('cursor');\n const cursorHadAssets = cursorSelected && hasCursorProjectAssets(cwd, prepared.projectSchema);\n const projectResult = await removeProject(cwd, {\n full: prepared.full,\n yes: true,\n plan: prepared.projectPlan.id,\n schema: prepared.projectSchema,\n });\n const completed: SurfaceResult[] = [\n {\n name: 'project',\n result: projectResult,\n },\n ];\n if (projectResult.state === 'failed' || projectResult.state === 'action_required') {\n return combinedUninstallResult(prepared, completed);\n }\n completed.push(...(await uninstallProfileSurfaces(cwd, prepared.agents, prepared.scope)));\n if (cursorSelected) {\n const cursorRemoved = cursorHadAssets && !hasCursorProjectAssets(cwd, prepared.projectSchema);\n completed.push({\n name: 'cursor',\n result: createResult({ state: cursorRemoved ? 'changed' : 'healthy' }),\n });\n }\n return combinedUninstallResult(prepared, completed);\n}\n\nfunction combinedUninstallResult(\n prepared: PreparedLifecycle,\n completed: readonly SurfaceResult[],\n): CliResult {\n const results = completed.map(surface => surface.result);\n return createResult({\n state: combinedResultState(results),\n changed: results.some(result => result.changed),\n effects: combineEffects(results.map(result => result.effects)),\n findings: results.flatMap(result => result.findings),\n errors: results.flatMap(result => result.errors),\n recovery: results.flatMap(result => result.recovery),\n nextActions: results.flatMap(result => result.nextActions),\n data: {\n command: 'uninstall',\n operation: 'uninstall',\n selected_agents: prepared.agents,\n surfaces: completed.map(surface => ({\n name: surface.name,\n selected: true,\n state: surface.result.state,\n })),\n },\n });\n}\n\nfunction uninstallPreview(prepared: PreparedLifecycle): CliResult {\n const selected = prepared.agents.length === 0 ? 'none' : prepared.agents.join(',');\n const fullFlag = prepared.full ? ' --full' : '';\n const scopeFlag = prepared.agents.includes('claude') ? ` --scope=${prepared.scope}` : '';\n return createResult({\n state: 'action_required',\n findings: [\n {\n code: 'CONFIRMATION_REQUIRED',\n message: 'Review and confirm the exact unified uninstall plan.',\n severity: 'warning',\n },\n ],\n nextActions: [\n {\n command: `safeword uninstall --agents=${selected}${scopeFlag}${fullFlag} --yes --plan ${prepared.plan.id}`,\n mutates: true,\n requiresHuman: true,\n },\n ],\n data: {\n command: 'uninstall',\n operation: 'uninstall',\n selected_agents: prepared.agents,\n surfaces: prepared.surfaces.map(surface => ({\n name: surface.name,\n selected: true,\n state: 'planned',\n })),\n plan: toWirePlan(prepared.plan),\n },\n });\n}\n\nexport async function uninstallLifecycle(invocation: CommandInvocation): Promise<CliResult> {\n const parsed = parseAgentSelection(invocation.options.agents);\n if (!parsed.ok) {\n return createResult({\n state: 'failed',\n errors: [{ ...parsed.error, retryable: false }],\n data: { command: 'uninstall' },\n });\n }\n const full = invocation.options.full === true;\n if (invocation.offline && full) return onlineRequired('uninstall');\n const scope = lifecycleScope(invocation.options.scope, 'uninstall', parsed.selection.agents);\n if (!scope.ok) return scope.result;\n const prepared = await prepareLifecycle(invocation.cwd, 'uninstall', parsed.selection.agents, {\n full,\n scope: scope.value,\n });\n const suppliedPlan =\n typeof invocation.options.plan === 'string' ? invocation.options.plan : undefined;\n if (invocation.options.yes === true && suppliedPlan !== undefined) {\n if (suppliedPlan !== prepared.plan.id) return staleUninstallPlan(prepared.plan);\n return applyPreparedLifecycle(invocation.cwd, prepared);\n }\n return uninstallPreview(prepared);\n}\n","import { createHash } from 'node:crypto';\nimport type { Stats } from 'node:fs';\nimport {\n closeSync,\n constants as fsConstants,\n existsSync,\n fstatSync,\n lstatSync,\n openSync,\n readdirSync,\n readFileSync,\n readlinkSync,\n readSync,\n} from 'node:fs';\nimport nodePath from 'node:path';\n\nimport { schemaForClaudeDelivery } from '../claude-plugin/delivery-schema.js';\nimport { CLAUDE_PLUGIN_ID } from '../claude-plugin/inventory.js';\nimport { diffFileSnapshots } from '../cli-protocol/file-effects.js';\nimport type { CliPlan } from '../cli-protocol/plan.js';\nimport { createPlan } from '../cli-protocol/plan.js';\nimport {\n createReconciliationPlan,\n effectsForReconciliation,\n preconditionDigestForPaths,\n} from '../cli-protocol/reconciliation.js';\nimport { buildReplayCommand } from '../cli-protocol/replay-command.js';\nimport {\n type CliResult,\n combineEffects,\n createResult,\n type Effect,\n type Effects,\n type Finding,\n} from '../cli-protocol/result.js';\nimport { writeDurableFile } from '../codex-plugin/durable-write.js';\nimport { codexFinalizationIsComplete } from '../codex-plugin/finalization.js';\nimport { CODEX_MIGRATION_SCHEMA } from '../codex-plugin/inventory.js';\nimport { automaticallyMigrateLegacyCodex } from '../codex-plugin/operations.js';\nimport {\n installCodexProjectBootstrap,\n preparedCodexProjectBootstrap,\n} from '../codex-plugin/project-bootstrap.js';\nimport {\n buildArchitecture,\n hasArchitectureDetected,\n inspectConfig,\n syncConfigCore,\n} from '../commands/sync-config.js';\nimport { checkHealth, type HealthStatus } from '../health.js';\nimport { installPack } from '../packs/install.js';\nimport { hasImportLinterScaffoldTarget } from '../packs/python/files.js';\nimport {\n detectPythonPackageManager,\n getMissingPythonToolDependencies,\n getPythonInstallCommand,\n getPythonTools,\n hasRuffDependency,\n installPythonDependencies,\n type PythonTool,\n} from '../packs/python/setup.js';\nimport { getMissingPacks } from '../packs/registry.js';\nimport { rustToolingTargets } from '../packs/rust/setup.js';\nimport { reconcile, ReconcileExecutionError, type ReconcileResult } from '../reconcile.js';\nimport type { SafewordSchema } from '../schema.js';\nimport { createProjectContext } from '../utils/context.js';\nimport { exists, writeJson } from '../utils/fs.js';\nimport { hookIntegrationNudge } from '../utils/hook-nudge.js';\nimport {\n type DependencyInstallResult,\n detectPackageManager,\n installDependencies,\n} from '../utils/install.js';\nimport {\n executeNamespaceMigration,\n NamespaceMergeIncompleteError,\n NamespaceStructuralCollisionError,\n planNamespaceMigration,\n} from '../utils/namespace-migration.js';\nimport {\n stripDeadConfigVersion,\n syncPackageJsonSafewordVersion,\n} from '../utils/safeword-version-sync.js';\nimport {\n setupWorkspaceFormatScripts,\n workspacePackageJsonTargets,\n} from '../utils/setup-workspaces.js';\nimport { scanStaleNamespaceConfigs } from '../utils/stale-config-scan.js';\nimport {\n applyVendoredIgnoresPolicy,\n shouldEmitVendoredIgnoresNudge,\n type VendoredIgnoresPolicyResult,\n} from '../utils/vendored-ignores-nudge.js';\nimport { compareVersions, isSafePackageVersion } from '../utils/version.js';\nimport { VERSION } from '../version.js';\n\nfunction ensurePackageJson(cwd: string): boolean {\n const packageJsonPath = nodePath.join(cwd, 'package.json');\n if (exists(packageJsonPath)) return false;\n writeJson(packageJsonPath, {\n name: nodePath.basename(cwd) || 'project',\n version: '0.1.0',\n private: true,\n scripts: {},\n });\n return true;\n}\n\nfunction configureArchitecture(cwd: string): Effect[] {\n const context = createProjectContext(cwd);\n if (!context.projectType.hasJsSource) return [];\n const architecture = buildArchitecture(cwd);\n if (!hasArchitectureDetected(architecture)) return [];\n const before = inspectConfig(cwd, architecture);\n const result = syncConfigCore(cwd, architecture);\n return [\n ...(result.generatedConfig\n ? [\n {\n kind: before.matches ? 'update' : 'create',\n target: '.safeword/depcruise-config.cjs',\n },\n ]\n : []),\n ...(result.createdMainConfig ? [{ kind: 'create', target: '.dependency-cruiser.cjs' }] : []),\n ];\n}\n\ninterface SetupAdapters {\n readonly configureArchitecture: typeof configureArchitecture;\n readonly configureWorkspaces: typeof setupWorkspaceFormatScripts;\n readonly configurePython: typeof configurePython;\n readonly executeNamespaceMigration: typeof executeNamespaceMigration;\n}\n\nconst EMPTY_LANGUAGES = {\n javascript: false,\n python: false,\n golang: false,\n rust: false,\n sql: false,\n} as const;\n\nconst DEFAULT_SETUP_ADAPTERS: SetupAdapters = {\n configureArchitecture,\n configureWorkspaces: setupWorkspaceFormatScripts,\n configurePython,\n executeNamespaceMigration,\n};\n\nconst JAVASCRIPT_PACKAGE_FILES = [\n 'package.json',\n 'bun.lock',\n 'bun.lockb',\n 'package-lock.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n] as const;\n\nconst PYTHON_PACKAGE_FILES = [\n 'pyproject.toml',\n 'uv.lock',\n 'poetry.lock',\n 'Pipfile',\n 'Pipfile.lock',\n] as const;\n\nfunction plannedFileEffect(cwd: string, target: string): Effect {\n return { kind: existsSync(nodePath.join(cwd, target)) ? 'update' : 'create', target };\n}\n\nfunction existingFileEffects(cwd: string, targets: readonly string[]): Effect[] {\n return targets.flatMap(target =>\n existsSync(nodePath.join(cwd, target)) ? [{ kind: 'update', target }] : [],\n );\n}\n\nfunction plannedJavaScriptPackageFiles(cwd: string): Effect[] {\n const lockfiles = {\n bun: 'bun.lock',\n npm: 'package-lock.json',\n pnpm: 'pnpm-lock.yaml',\n yarn: 'yarn.lock',\n } as const;\n const selectedLockfile = lockfiles[detectPackageManager(cwd)];\n return uniqueEffects([\n ...existingFileEffects(cwd, JAVASCRIPT_PACKAGE_FILES),\n plannedFileEffect(cwd, selectedLockfile),\n ]);\n}\n\nfunction configNeedsCompatibilityUpdate(cwd: string): boolean {\n if (getMissingPacks(cwd).length > 0) return true;\n try {\n const config = JSON.parse(\n readFileSync(nodePath.join(cwd, '.safeword/config.json'), 'utf8'),\n ) as Record<string, unknown>;\n return 'version' in config;\n } catch {\n return false;\n }\n}\n\nfunction plannedCodexBootstrapEffect(cwd: string): Effect[] {\n const target = '.codex/config.toml';\n const path = nodePath.join(cwd, target);\n const original = existsSync(path) ? readFileSync(path, 'utf8') : '';\n try {\n return preparedCodexProjectBootstrap(cwd) === original ? [] : [plannedFileEffect(cwd, target)];\n } catch {\n // Apply will fail before mutating an unsafe or malformed config. There is\n // no file effect to promise in that state.\n return [];\n }\n}\n\nfunction plannedArchitectureEffects(cwd: string): Effect[] {\n const architecture = buildArchitecture(cwd);\n if (!hasArchitectureDetected(architecture)) return [];\n const generated = inspectConfig(cwd, architecture);\n return [\n ...(generated.matches ? [] : [plannedFileEffect(cwd, '.safeword/depcruise-config.cjs')]),\n ...(existsSync(nodePath.join(cwd, '.dependency-cruiser.cjs'))\n ? []\n : [{ kind: 'create', target: '.dependency-cruiser.cjs' }]),\n ];\n}\n\nfunction plannedWorkspaceEffects(\n cwd: string,\n context: ReturnType<typeof createProjectContext>,\n): Effect[] {\n return workspacePackageJsonTargets(cwd, context).flatMap(target => {\n try {\n const manifest = JSON.parse(readFileSync(nodePath.join(cwd, target), 'utf8')) as {\n scripts?: Record<string, string>;\n };\n return manifest.scripts?.format === undefined ? [{ kind: 'update', target }] : [];\n } catch {\n return [];\n }\n });\n}\n\nfunction plannedEslintEffects(\n cwd: string,\n context: ReturnType<typeof createProjectContext>,\n): Effect[] {\n const target = context.projectType.existingEslintConfig;\n if (\n target === undefined ||\n !shouldEmitVendoredIgnoresNudge({\n cwd,\n existingEslintConfig: target,\n hasJavaScript: context.languages?.javascript ?? false,\n })\n ) {\n return [];\n }\n // The textual patch can bail on an unfamiliar export shape. Listing both\n // possible writes is deliberately conservative: a plan may be a superset,\n // but apply must never expand beyond it.\n return [{ kind: 'update', target }, plannedFileEffect(cwd, `${target}.safeword-bak`)];\n}\n\nfunction plannedPackEffects(cwd: string): Effect[] {\n return getMissingPacks(cwd).includes('rust')\n ? rustToolingTargets(cwd).map(target => ({ kind: 'update', target }))\n : [];\n}\n\nfunction plannedPythonEffects(cwd: string): Effects {\n if (!createProjectContext(cwd).languages?.python || hasRuffDependency(cwd)) {\n return emptyEffects();\n }\n const packageManager = detectPythonPackageManager(cwd);\n if (packageManager === 'pip') {\n return emptyEffects();\n }\n const tools = getPythonTools(hasImportLinterScaffoldTarget(cwd));\n const lockfiles = {\n uv: 'uv.lock',\n poetry: 'poetry.lock',\n pipenv: 'Pipfile.lock',\n } as const;\n return {\n files: uniqueEffects([\n ...existingFileEffects(cwd, PYTHON_PACKAGE_FILES),\n plannedFileEffect(cwd, lockfiles[packageManager]),\n ]),\n packages: tools.map(target => ({ kind: 'install', target })),\n configuration: [],\n network: tools.map(target => ({ kind: 'package-registry', target, operation: 'install' })),\n destructive: [],\n };\n}\n\nfunction staleSafewordRegistryDependency(cwd: string): boolean {\n try {\n const manifest = JSON.parse(readFileSync(nodePath.join(cwd, 'package.json'), 'utf8')) as Record<\n 'dependencies' | 'devDependencies' | 'optionalDependencies',\n Record<string, string> | undefined\n >;\n const spec =\n manifest.devDependencies?.safeword ??\n manifest.dependencies?.safeword ??\n manifest.optionalDependencies?.safeword;\n if (spec === undefined) return false;\n if (\n /^(?:file:|link:|portal:|workspace:|git\\+|github:|gitlab:|bitbucket:|https?:|\\.{0,2}\\/)/u.test(\n spec,\n )\n ) {\n return false;\n }\n return ![VERSION, `^${VERSION}`, `~${VERSION}`].includes(spec);\n } catch {\n return false;\n }\n}\n\nexport interface SetupPlanOptions {\n readonly migrateNamespace?: boolean;\n readonly noModify?: boolean;\n readonly repairVersionMarker?: boolean;\n}\n\nfunction plannedNamespaceEffects(cwd: string, migrate: boolean | undefined): Effect[] {\n if (migrate !== true || planNamespaceMigration(cwd) !== 'offer') return [];\n const movedFiles = snapshotFiles(cwd, ['.safeword-project']).keys().toArray();\n return [\n { kind: 'move', target: '.safeword-project → .project' },\n ...movedFiles.flatMap(target => [\n { kind: 'delete', target },\n { kind: 'create', target: target.replace(/^\\.safeword-project(?=\\/|$)/u, '.project') },\n ]),\n ...(existsSync(nodePath.join(cwd, '.safeword/config.json'))\n ? [{ kind: 'update', target: '.safeword/config.json' }]\n : []),\n ];\n}\n\nfunction plannedPackageJsonEffects(cwd: string, configured: boolean): Effect[] {\n return !configured && !existsSync(nodePath.join(cwd, 'package.json'))\n ? [\n { kind: 'create', target: 'package.json' },\n { kind: 'update', target: 'package.json' },\n ]\n : [];\n}\n\nfunction retargetLegacyNamespace(effect: Effect): Effect {\n return {\n ...effect,\n target: effect.target.replace(/^\\.safeword-project(?=\\/|$)/u, '.project'),\n };\n}\n\nfunction plannedReconciliationEffects(effects: Effects, migrate: boolean | undefined): Effects {\n if (migrate !== true) return effects;\n return {\n files: effects.files.map(effect => retargetLegacyNamespace(effect)),\n packages: effects.packages.map(effect => retargetLegacyNamespace(effect)),\n configuration: effects.configuration.map(effect => retargetLegacyNamespace(effect)),\n network: effects.network.map(effect => retargetLegacyNamespace(effect)),\n destructive: effects.destructive.map(effect => retargetLegacyNamespace(effect)),\n };\n}\n\nfunction setupPlanningContext(\n cwd: string,\n configured: boolean,\n): ReturnType<typeof createProjectContext> {\n const context = createProjectContext(cwd);\n if (configured || existsSync(nodePath.join(cwd, 'package.json'))) return context;\n return {\n ...context,\n languages: {\n ...EMPTY_LANGUAGES,\n ...context.languages,\n javascript: true,\n },\n };\n}\n\nfunction plannedOptionalEslintEffects(\n cwd: string,\n context: ReturnType<typeof createProjectContext>,\n noModify: boolean | undefined,\n): Effect[] {\n return noModify === true ? [] : plannedEslintEffects(cwd, context);\n}\n\nfunction setupPreconditionDigest(\n cwd: string,\n reconciliationDigest: string,\n effects: Effects,\n context: ReturnType<typeof createProjectContext>,\n options: SetupPlanOptions,\n): string {\n const observationTargets = [\n '.safeword',\n '.safeword-project',\n '.project',\n '.codex/config.toml',\n '.dependency-cruiser.cjs',\n 'Cargo.toml',\n ...JAVASCRIPT_PACKAGE_FILES,\n ...PYTHON_PACKAGE_FILES,\n ...effects.files.map(effect => effect.target),\n ...effects.destructive.map(effect => effect.target),\n ].filter(target => !target.includes(' → '));\n return createHash('sha256')\n .update(\n JSON.stringify([\n reconciliationDigest,\n effects,\n JSON.stringify(context, (_key, value: unknown) =>\n typeof value === 'string' ? value.replaceAll(cwd, '<project>') : value,\n ),\n options,\n preconditionDigestForPaths(cwd, observationTargets),\n ]),\n )\n .digest('hex');\n}\n\nfunction plannedVersionMarkerEffects(cwd: string, repair: boolean | undefined): Effect[] {\n if (repair !== true) return [];\n const target = '.safeword/version';\n const path = nodePath.join(cwd, target);\n const metadata = lstatSync(path, { throwIfNoEntry: false });\n if (metadata?.isFile() !== true || metadata.isSymbolicLink()) return [];\n const version = readFileSync(path, 'utf8').trim();\n return metadata.nlink > 1 || !isSafePackageVersion(version) ? [{ kind: 'update', target }] : [];\n}\n\n/** Read-only counterpart of convergeSetup's complete project mutation pipeline. */\nexport async function createSetupPlan(\n cwd: string,\n schema: SafewordSchema,\n options: SetupPlanOptions = {},\n): Promise<CliPlan> {\n const configured = existsSync(nodePath.join(cwd, '.safeword'));\n const context = setupPlanningContext(cwd, configured);\n const reconciliation = await createReconciliationPlan(\n cwd,\n configured ? 'upgrade' : 'install',\n schema,\n context,\n );\n const reconciliationEffects = plannedReconciliationEffects(\n reconciliation.plan.effects,\n options.migrateNamespace,\n );\n const reconciliationPackages = reconciliationEffects.packages.length > 0;\n const compatibilityFiles =\n !configured || configNeedsCompatibilityUpdate(cwd)\n ? [plannedFileEffect(cwd, '.safeword/config.json')]\n : [];\n const packageFiles = reconciliationPackages ? plannedJavaScriptPackageFiles(cwd) : [];\n const python = plannedPythonEffects(cwd);\n const staleSafeword = staleSafewordRegistryDependency(cwd);\n const compatibilityPackage = `safeword@${VERSION}`;\n const combined = combineEffects([\n reconciliationEffects,\n {\n files: uniqueEffects([\n ...plannedPackageJsonEffects(cwd, configured),\n ...plannedVersionMarkerEffects(cwd, options.repairVersionMarker),\n ...plannedNamespaceEffects(cwd, options.migrateNamespace),\n ...compatibilityFiles,\n ...plannedPackEffects(cwd),\n ...plannedCodexBootstrapEffect(cwd),\n ...plannedArchitectureEffects(cwd),\n ...plannedWorkspaceEffects(cwd, context),\n ...plannedOptionalEslintEffects(cwd, context, options.noModify),\n ...packageFiles,\n ...(staleSafeword ? plannedJavaScriptPackageFiles(cwd) : []),\n ]),\n packages: staleSafeword ? [{ kind: 'update', target: compatibilityPackage }] : [],\n network: staleSafeword\n ? [{ kind: 'package-registry', target: compatibilityPackage, operation: 'update' }]\n : [],\n },\n python,\n ]);\n const effects = mergeEffects(combined);\n return createPlan({\n command: 'setup',\n preconditionDigest: setupPreconditionDigest(\n cwd,\n reconciliation.plan.preconditionDigest,\n effects,\n context,\n options,\n ),\n effects,\n verification: [{ description: 'Re-run safeword status' }],\n });\n}\n\ninterface PythonSetupResult {\n readonly tools: readonly PythonTool[];\n readonly command?: string;\n readonly attempted: boolean;\n readonly installed: boolean;\n}\n\nfunction configurePython(\n cwd: string,\n context: ReturnType<typeof createProjectContext>,\n): PythonSetupResult {\n if (!context.languages?.python) {\n return { tools: [], attempted: false, installed: false };\n }\n const tools = getMissingPythonToolDependencies(cwd, hasImportLinterScaffoldTarget(cwd));\n if (tools.length === 0) return { tools, attempted: false, installed: false };\n\n const command = getPythonInstallCommand(cwd, tools);\n const shouldInstall =\n !process.env.SAFEWORD_SKIP_INSTALL && detectPythonPackageManager(cwd) !== 'pip';\n if (!shouldInstall) {\n return { tools, command, attempted: false, installed: false };\n }\n return {\n tools,\n command,\n attempted: true,\n installed: installPythonDependencies(cwd, [...tools]),\n };\n}\n\nclass SetupApplyError extends Error {\n readonly completedEffects: Partial<Effects>;\n\n constructor(cause: unknown, completedEffects: Partial<Effects>) {\n super(cause instanceof Error ? cause.message : String(cause), { cause });\n this.name = 'SetupApplyError';\n this.completedEffects = completedEffects;\n }\n}\n\nexport async function convergeSetup(\n cwd: string,\n options: {\n noModify?: boolean;\n migrateNamespace?: boolean;\n repairVersionMarker?: boolean;\n progress?: {\n readonly start: (message: string) => void;\n readonly stop: () => void;\n };\n adapters?: Partial<SetupAdapters>;\n schema?: SafewordSchema;\n },\n): Promise<CliResult> {\n const configured = existsSync(nodePath.join(cwd, '.safeword'));\n const versionGate: ProjectVersionGate = configured\n ? checkProjectVersion(cwd, options.repairVersionMarker === true)\n : { repaired: false };\n if (versionGate.refusal !== undefined) return versionGate.refusal;\n const versionMarkerEffects: Effect[] = versionGate.repaired\n ? [{ kind: 'update', target: '.safeword/version' }]\n : [];\n let namespaceMigration: NamespaceConvergence = { effects: [], findings: [] };\n let packageJsonCreated = false;\n\n try {\n const adapters = {\n ...DEFAULT_SETUP_ADAPTERS,\n ...options.adapters,\n };\n const namespaceTargets = ['.safeword-project', '.project', '.safeword/config.json'];\n const namespaceBefore = snapshotFiles(cwd, namespaceTargets);\n try {\n namespaceMigration = convergeNamespace(\n cwd,\n options.migrateNamespace,\n adapters.executeNamespaceMigration,\n );\n } catch (error) {\n namespaceMigration = {\n effects: diffFileSnapshots(namespaceBefore, snapshotFiles(cwd, namespaceTargets)),\n findings: [],\n };\n throw error;\n }\n namespaceMigration = {\n ...namespaceMigration,\n effects: uniqueEffects([\n ...namespaceMigration.effects,\n ...diffFileSnapshots(namespaceBefore, snapshotFiles(cwd, namespaceTargets)),\n ]),\n };\n packageJsonCreated = configured ? false : ensurePackageJson(cwd);\n options.progress?.start(\n configured ? 'Reconciling the Safeword upgrade…' : 'Setting up Safeword…',\n );\n return await applySetup(cwd, {\n configured,\n packageJsonCreated,\n noModify: options.noModify === true,\n namespaceMigration,\n preliminaryFileEffects: versionMarkerEffects,\n adapters,\n schema: options.schema,\n });\n } catch (setupError) {\n return setupFailure(setupError, {\n files: [\n ...versionMarkerEffects,\n ...(packageJsonCreated ? [{ kind: 'create', target: 'package.json' }] : []),\n ...namespaceMigration.effects,\n ],\n });\n }\n}\n\ninterface NamespaceConvergence {\n readonly effects: Effect[];\n readonly findings: Finding[];\n}\n\nfunction convergeNamespace(\n cwd: string,\n migrate: boolean | undefined,\n migrateNamespace: typeof executeNamespaceMigration,\n): NamespaceConvergence {\n const plan = planNamespaceMigration(cwd);\n if (plan !== 'offer' && plan !== 'both-dirs') {\n const messages: Partial<Record<typeof plan, string>> = {\n blocked: 'Namespace migration skipped: .project exists but is not a directory.',\n };\n const message = messages[plan];\n return {\n effects: [],\n findings:\n message === undefined\n ? []\n : [{ code: 'NAMESPACE_MIGRATION_BLOCKED', message, severity: 'warning' }],\n };\n }\n if (migrate === false) {\n return {\n effects: [],\n findings: [\n {\n code: 'NAMESPACE_MIGRATION_AVAILABLE',\n message:\n 'This project still uses .safeword-project because automatic namespace migration was explicitly disabled.',\n severity: 'info',\n },\n ],\n };\n }\n try {\n const migration = migrateNamespace(cwd);\n const staleConfigs = scanStaleNamespaceConfigs(cwd);\n return {\n effects: [{ kind: 'move', target: '.safeword-project → .project' }],\n findings: [\n {\n code: 'NAMESPACE_MIGRATED',\n message:\n migration.method === 'merge'\n ? `Project namespace merged into .project; ${migration.conflicts.length} conflicting file(s) were retained under .safeword/namespace-migration-conflicts-v1/.`\n : 'Project namespace moved to .project.',\n severity: 'info',\n },\n ...staleConfigs.map(target => ({\n code: 'STALE_NAMESPACE_REFERENCE',\n message: `${target} still references the old namespace (.safeword-project/ → .project/).`,\n severity: 'warning' as const,\n })),\n ],\n };\n } catch (migrationError) {\n if (\n migrationError instanceof NamespaceStructuralCollisionError ||\n migrationError instanceof NamespaceMergeIncompleteError\n ) {\n throw migrationError;\n }\n return {\n effects: [],\n findings: [\n {\n code: 'NAMESPACE_MIGRATION_FAILED',\n message:\n migrationError instanceof Error ? migrationError.message : String(migrationError),\n severity: 'warning',\n },\n ],\n };\n }\n}\n\ninterface ProjectVersionGate {\n readonly repaired: boolean;\n readonly refusal?: CliResult;\n}\n\ntype ProjectVersionMarker =\n | { readonly kind: 'version'; readonly value: string; readonly replaceEntry: boolean }\n | { readonly kind: 'gate'; readonly value: ProjectVersionGate };\n\nfunction versionRefusal(\n code: string,\n message: string,\n recovery: CliResult['recovery'] = [],\n): ProjectVersionGate {\n return {\n repaired: false,\n refusal: createResult({\n state: 'failed',\n errors: [{ code, message, retryable: false }],\n recovery,\n }),\n };\n}\n\nconst MAX_PROJECT_VERSION_BYTES = 256;\n\nfunction isSafeProjectVersionMetadata(metadata: Stats, allowMultipleLinks: boolean): boolean {\n return (\n metadata.isFile() &&\n !metadata.isSymbolicLink() &&\n metadata.size <= MAX_PROJECT_VERSION_BYTES &&\n (allowMultipleLinks || metadata.nlink === 1)\n );\n}\n\nfunction isSameProjectVersionFile(before: Stats, opened: Stats, after: Stats): boolean {\n return (\n opened.isFile() &&\n after.isFile() &&\n !after.isSymbolicLink() &&\n opened.dev === before.dev &&\n opened.ino === before.ino &&\n opened.dev === after.dev &&\n opened.ino === after.ino\n );\n}\n\nfunction readProjectVersionDescriptor(descriptor: number): string | undefined {\n const buffer = Buffer.alloc(MAX_PROJECT_VERSION_BYTES + 1);\n const count = readSync(descriptor, buffer, 0, buffer.length, 0);\n const final = fstatSync(descriptor);\n if (count > MAX_PROJECT_VERSION_BYTES || final.size > MAX_PROJECT_VERSION_BYTES) {\n return undefined;\n }\n return buffer.subarray(0, count).toString('utf8').trim();\n}\n\nfunction readProjectVersionFile(path: string, allowMultipleLinks: boolean): string | undefined {\n let descriptor: number | undefined;\n try {\n const before = lstatSync(path);\n if (!isSafeProjectVersionMetadata(before, allowMultipleLinks)) return undefined;\n descriptor = openSync(\n path,\n fsConstants.O_RDONLY | fsConstants.O_NONBLOCK | (fsConstants.O_NOFOLLOW ?? 0),\n );\n const opened = fstatSync(descriptor);\n const after = lstatSync(path);\n if (\n !isSameProjectVersionFile(before, opened, after) ||\n !isSafeProjectVersionMetadata(opened, allowMultipleLinks)\n ) {\n return undefined;\n }\n return readProjectVersionDescriptor(descriptor);\n } catch {\n return undefined;\n } finally {\n if (descriptor !== undefined) closeSync(descriptor);\n }\n}\n\nfunction readProjectVersionMarker(\n cwd: string,\n projectVersionPath: string,\n repairVersionMarker: boolean,\n): ProjectVersionMarker {\n const metadata = lstatSync(projectVersionPath, { throwIfNoEntry: false });\n if (metadata === undefined) {\n return { kind: 'version', value: '0.0.0', replaceEntry: false };\n }\n if (metadata.isFile() && metadata.nlink === 1) {\n const version = readProjectVersionFile(projectVersionPath, false);\n if (version === undefined) {\n return {\n kind: 'gate',\n value: versionRefusal(\n 'PROJECT_VERSION_MARKER_UNSAFE',\n 'Project version marker changed while it was being validated. Inspect .safeword/version and retry setup.',\n ),\n };\n }\n return {\n kind: 'version',\n value: version,\n replaceEntry: false,\n };\n }\n if (!metadata.isFile() || metadata.nlink <= 1) {\n return {\n kind: 'gate',\n value: versionRefusal(\n 'PROJECT_VERSION_MARKER_UNSAFE',\n 'Project version marker is not an ordinary regular file. Inspect .safeword/version and replace it manually before running install; symbolic links are never followed or repaired.',\n ),\n };\n }\n if (repairVersionMarker) {\n const version = readProjectVersionFile(projectVersionPath, true);\n if (version === undefined) {\n return {\n kind: 'gate',\n value: versionRefusal(\n 'PROJECT_VERSION_MARKER_UNSAFE',\n 'Project version marker changed while it was being validated. Inspect .safeword/version and retry setup.',\n ),\n };\n }\n return {\n kind: 'version',\n value: version,\n replaceEntry: true,\n };\n }\n const recoveryCommand = buildReplayCommand({\n command: 'safeword install --repair-version-marker',\n cwd,\n });\n return {\n kind: 'gate',\n value: versionRefusal(\n 'PROJECT_VERSION_MARKER_UNSAFE',\n `Project version marker has multiple directory entries. Inspect .safeword/version, then run \\`${recoveryCommand}\\` to replace only the project entry.`,\n [\n {\n command: recoveryCommand,\n description:\n 'Replace the linked project version marker without changing its other hardlink peers, then complete installation.',\n requiresHuman: true,\n },\n ],\n ),\n };\n}\n\nfunction checkProjectVersion(cwd: string, repairVersionMarker: boolean): ProjectVersionGate {\n const safewordDirectoryPath = nodePath.join(cwd, '.safeword');\n const safewordDirectoryMetadata = lstatSync(safewordDirectoryPath, {\n throwIfNoEntry: false,\n });\n if (safewordDirectoryMetadata?.isDirectory() !== true) {\n return versionRefusal(\n 'PROJECT_VERSION_UNSAFE',\n '.safeword must be an ordinary directory inside the project. Inspect and replace it manually before running install.',\n );\n }\n const projectVersionPath = nodePath.join(safewordDirectoryPath, 'version');\n const marker = readProjectVersionMarker(cwd, projectVersionPath, repairVersionMarker);\n if (marker.kind === 'gate') return marker.value;\n const projectVersion = marker.value;\n if (!isSafePackageVersion(projectVersion)) {\n if (repairVersionMarker) {\n writeDurableFile(projectVersionPath, `${VERSION}\\n`, { mode: 0o644 });\n return { repaired: true };\n }\n const recoveryCommand = buildReplayCommand({\n command: 'safeword install --repair-version-marker',\n cwd,\n });\n return versionRefusal(\n 'PROJECT_VERSION_UNSAFE',\n `Project version is not valid SemVer. Inspect .safeword/version, then run \\`${recoveryCommand}\\` to replace it.`,\n [\n {\n command: recoveryCommand,\n description:\n 'Replace the unreadable version marker with the current CLI version, then complete installation.',\n requiresHuman: true,\n },\n ],\n );\n }\n if (compareVersions(VERSION, projectVersion) < 0) {\n return versionRefusal(\n 'CLI_DOWNGRADE_REFUSED',\n `CLI v${VERSION} is older than project v${projectVersion}. Update the CLI first.`,\n );\n }\n if (marker.replaceEntry) {\n // Validate before mutation, then publish a fresh inode over only this\n // directory entry so a failed downgrade gate never changes the project.\n writeDurableFile(projectVersionPath, `${projectVersion}\\n`, { mode: 0o644 });\n return { repaired: true };\n }\n return { repaired: false };\n}\n\nfunction packageFindings(installation: DependencyInstallResult) {\n if (!installation.attempted || installation.installed) return [];\n return [\n {\n code: 'PACKAGE_INSTALL_FAILED',\n message: `Package installation failed. Run: ${installation.command ?? 'your package manager install command'}`,\n severity: 'warning' as const,\n },\n ];\n}\n\nfunction gitFindings(gitInitialized: boolean) {\n if (gitInitialized) return [];\n return [\n {\n code: 'GIT_NOT_INITIALIZED',\n message: 'Git initialization was skipped because this directory is not a Git repository.',\n severity: 'info' as const,\n },\n ];\n}\n\nfunction eslintFindings(eslintPolicy: VendoredIgnoresPolicyResult) {\n if (eslintPolicy.kind !== 'manual') return [];\n return [\n {\n code: 'ESLINT_MANUAL_CONFIGURATION_REQUIRED',\n message: 'Add safeword.configs.vendoredIgnores to the existing ESLint configuration.',\n severity: 'warning' as const,\n },\n ];\n}\n\nfunction pythonFindings(pythonSetup: PythonSetupResult): Finding[] {\n if (pythonSetup.tools.length === 0) return [];\n return [\n {\n code: pythonSetup.installed ? 'PYTHON_TOOLS_INSTALLED' : 'PYTHON_TOOLS_REQUIRED',\n message: pythonSetup.installed\n ? `Python tools installed (${pythonSetup.tools.join(', ')}).`\n : `Install Python tools: ${pythonSetup.command ?? pythonSetup.tools.join(' ')}`,\n severity: pythonSetup.installed ? 'info' : 'warning',\n },\n ];\n}\n\nfunction setupGuidanceFindings(\n context: ReturnType<typeof createProjectContext>,\n reconciliation: ReconcileResult,\n architectureEffects: readonly Effect[],\n) {\n const findings: Finding[] = [];\n if (architectureEffects.length > 0) {\n findings.push({\n code: 'ARCHITECTURE_DETECTED',\n message: 'Architecture detected; project-structure checks are configured.',\n severity: 'info',\n detail: architectureEffects.some(effect => effect.target === '.dependency-cruiser.cjs')\n ? '.dependency-cruiser.cjs extends rules from .safeword/depcruise-config.cjs; edit the wrapper to add project rules.'\n : undefined,\n });\n }\n const hookNudge = hookIntegrationNudge(context);\n if (hookNudge !== undefined) {\n findings.push({\n code: 'BOUNDARY_GATE_INTEGRATION_AVAILABLE',\n message: 'Boundary-gate hook integration is available; use --verbose for the exact snippet.',\n severity: 'info' as const,\n detail: hookNudge,\n });\n }\n if (context.languages?.golang && reconciliation.created.includes('.golangci.yml')) {\n findings.push({\n code: 'GO_TOOLS_AVAILABLE',\n message: 'Go tooling: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest',\n severity: 'info' as const,\n });\n }\n if (context.projectType.existingFormatter) {\n findings.push({\n code: 'EXISTING_FORMATTER_PRESERVED',\n message: 'Existing formatter detected; Safeword left it unchanged.',\n severity: 'info' as const,\n });\n }\n if (!context.projectType.scaffoldBddLane && context.projectType.existingCucumberHarness) {\n findings.push({\n code: 'EXISTING_CUCUMBER_HARNESS_PRESERVED',\n message: `Existing Cucumber harness preserved (${context.projectType.existingCucumberHarness}).`,\n severity: 'info' as const,\n });\n }\n return findings;\n}\n\ninterface SetupResultInput {\n readonly packageJsonCreated: boolean;\n readonly installation: DependencyInstallResult;\n readonly eslintPolicy: VendoredIgnoresPolicyResult;\n readonly gitInitialized: boolean;\n readonly guidanceFindings: ReturnType<typeof setupGuidanceFindings>;\n readonly pythonSetup: PythonSetupResult;\n readonly namespaceMigration: NamespaceConvergence;\n readonly completedEffects: CompletedSetupEffects;\n readonly claudeProjectPluginEnrolled: boolean;\n}\n\ninterface CompletedSetupEffects {\n readonly files: Effect[];\n readonly packages: Effect[];\n readonly network: Effect[];\n}\n\nfunction snapshotFiles(cwd: string, targets: readonly string[]): Map<string, string> {\n const snapshot = new Map<string, string>();\n const visit = (absolutePath: string): void => {\n if (!existsSync(absolutePath)) return;\n const stat = lstatSync(absolutePath);\n const relativePath = nodePath.relative(cwd, absolutePath);\n if (stat.isSymbolicLink()) {\n snapshot.set(relativePath, `link:${readlinkSync(absolutePath)}`);\n return;\n }\n if (stat.isDirectory()) {\n for (const entry of readdirSync(absolutePath)) visit(nodePath.join(absolutePath, entry));\n return;\n }\n if (stat.isFile()) snapshot.set(relativePath, readFileSync(absolutePath).toString('base64'));\n };\n for (const target of targets) {\n visit(nodePath.isAbsolute(target) ? target : nodePath.join(cwd, target));\n }\n return snapshot;\n}\n\nfunction observeFileStage<T>(\n cwd: string,\n targets: readonly string[],\n completedEffects: CompletedSetupEffects,\n action: () => T,\n): T {\n const before = snapshotFiles(cwd, targets);\n try {\n return action();\n } finally {\n completedEffects.files.push(...diffFileSnapshots(before, snapshotFiles(cwd, targets)));\n }\n}\n\nfunction uniqueEffects(effects: readonly Effect[]): Effect[] {\n const seen = new Set<string>();\n return effects.filter(effect => {\n const identity = `${effect.kind}\\0${effect.target}\\0${effect.operation ?? ''}`;\n if (seen.has(identity)) return false;\n seen.add(identity);\n return true;\n });\n}\n\nfunction emptyEffects(): Effects {\n return { files: [], packages: [], configuration: [], network: [], destructive: [] };\n}\n\nfunction setupResult(input: SetupResultInput): CliResult {\n const {\n packageJsonCreated,\n installation,\n eslintPolicy,\n gitInitialized,\n guidanceFindings,\n pythonSetup,\n namespaceMigration,\n completedEffects,\n claudeProjectPluginEnrolled,\n } = input;\n const files = uniqueEffects([\n ...(packageJsonCreated ? [{ kind: 'create', target: 'package.json' }] : []),\n ...namespaceMigration.effects,\n ...completedEffects.files,\n ]);\n const packages = uniqueEffects(completedEffects.packages);\n const network = uniqueEffects(completedEffects.network);\n const changed = files.length > 0 || packages.length > 0;\n const findings = [\n ...packageFindings(installation),\n ...gitFindings(gitInitialized),\n ...eslintFindings(eslintPolicy),\n ...guidanceFindings,\n ...namespaceMigration.findings,\n ...pythonFindings(pythonSetup),\n ];\n // A failed automatic Codex handoff is intentionally advisory: the legacy\n // project integration remains active and the SessionStart bootstrap retries\n // enrollment for the next task/developer. Keep the warning loud without\n // turning an otherwise successful setup into a blocking exit status.\n const actionRequired = findings.some(\n finding => finding.severity !== 'info' && finding.code !== 'CODEX_PLUGIN_HANDOFF_DEFERRED',\n );\n const handoffDeferred = findings.some(\n finding => finding.code === 'CODEX_PLUGIN_HANDOFF_DEFERRED',\n );\n // `.claude/settings.json` records enrollment but not the enrolled version, so\n // it can only prove \"already converged\" when this run changed nothing. A run\n // that rewrote delivered files may have moved the templates past the version\n // Claude installed, and `/reload-plugins` re-reads the old build — the\n // install command is what actually converges that case.\n const claudePluginReloadEligible = claudeProjectPluginEnrolled && !changed;\n const resultFindings = [\n ...findings,\n // Suppressed while a handoff is deferred: claiming enrollment succeeded\n // would contradict the warning this run just emitted.\n ...(actionRequired || handoffDeferred\n ? []\n : [\n {\n code: 'SETUP_CODEX_PLUGIN_HANDOFF',\n message:\n 'Codex bootstrap is enrolled for this project; each developer profile is checked automatically at task start.',\n severity: 'info' as const,\n },\n ]),\n ...(claudePluginReloadEligible\n ? [\n {\n code: 'SETUP_CLAUDE_PLUGIN_PRESERVED',\n message:\n 'The project-scoped Claude plugin remains enabled; reload plugins to activate any refreshed configuration.',\n severity: 'info' as const,\n },\n ]\n : []),\n ];\n let state: CliResult['state'] = changed ? 'changed' : 'healthy';\n if (actionRequired) state = 'action_required';\n const nextAction = setupNextAction({\n actionRequired,\n claudePluginReloadEligible,\n installCommand: installation.command,\n pythonInstallCommand: pythonSetup.installed ? undefined : pythonSetup.command,\n });\n return createResult({\n state,\n changed,\n effects: { files, packages, network },\n findings: resultFindings,\n nextActions: [nextAction],\n data: { configured: true, dependency_install: installation },\n });\n}\n\nfunction setupNextAction(input: {\n readonly actionRequired: boolean;\n readonly claudePluginReloadEligible: boolean;\n readonly installCommand?: string;\n readonly pythonInstallCommand?: string;\n}): { command: string; mutates: boolean; requiresHuman: boolean } {\n if (input.actionRequired) {\n return {\n command: input.pythonInstallCommand ?? input.installCommand ?? 'safeword install',\n mutates: true,\n requiresHuman: true,\n };\n }\n if (input.claudePluginReloadEligible) {\n return { command: '/reload-plugins', mutates: false, requiresHuman: true };\n }\n return { command: 'safeword install --agents=claude', mutates: true, requiresHuman: true };\n}\n\nfunction projectClaudePluginEnrolled(cwd: string): boolean {\n try {\n const settings = JSON.parse(\n readFileSync(nodePath.join(cwd, '.claude/settings.json'), 'utf8'),\n ) as { enabledPlugins?: Record<string, unknown> };\n return settings.enabledPlugins?.[CLAUDE_PLUGIN_ID] === true;\n } catch {\n return false;\n }\n}\n\nfunction applyCompatibilityMigrations(cwd: string, completedEffects: CompletedSetupEffects): void {\n const missingPacks = getMissingPacks(cwd);\n for (const packId of missingPacks) {\n const targets = [\n '.safeword/config.json',\n ...(packId === 'rust' ? rustToolingTargets(cwd) : []),\n ];\n observeFileStage(cwd, targets, completedEffects, () => installPack(packId, cwd));\n }\n observeFileStage(cwd, ['.safeword/config.json'], completedEffects, () =>\n stripDeadConfigVersion(nodePath.join(cwd, '.safeword')),\n );\n}\n\nfunction recordInstalledPackages(\n packagesToInstall: readonly string[],\n installation: DependencyInstallResult,\n completedEffects: CompletedSetupEffects,\n): void {\n if (!installation.attempted) return;\n for (const target of packagesToInstall) {\n if (installation.installed) completedEffects.packages.push({ kind: 'install', target });\n completedEffects.network.push({\n kind: 'package-registry',\n target,\n operation: 'install',\n });\n }\n}\n\nfunction applyPackageCompatibility(cwd: string, completedEffects: CompletedSetupEffects): void {\n if (!syncPackageJsonSafewordVersion(cwd, { report: false })) return;\n const compatibilityPackage = `safeword@${VERSION}`;\n completedEffects.packages.push({ kind: 'update', target: compatibilityPackage });\n completedEffects.network.push({\n kind: 'package-registry',\n target: compatibilityPackage,\n operation: 'update',\n });\n}\n\ninterface ApplySetupInput {\n readonly configured: boolean;\n readonly packageJsonCreated: boolean;\n readonly noModify: boolean;\n readonly namespaceMigration: NamespaceConvergence;\n readonly preliminaryFileEffects: readonly Effect[];\n readonly adapters: SetupAdapters;\n readonly schema?: SafewordSchema;\n}\n\n/**\n * Hand a legacy project-hook installation over to the native Codex plugin.\n * A failure here is reported, never fatal: the legacy protection stays in\n * place rather than leaving the project unguarded mid-setup.\n */\nfunction migrateLegacyCodexDuringSetup(\n cwd: string,\n completedEffects: CompletedSetupEffects,\n): Finding[] {\n const codexMigrationTargets = [\n CODEX_MIGRATION_SCHEMA.paths.config,\n CODEX_MIGRATION_SCHEMA.paths.backupRoot,\n CODEX_MIGRATION_SCHEMA.paths.pluginMarker,\n CODEX_MIGRATION_SCHEMA.paths.handoffReceipt,\n CODEX_MIGRATION_SCHEMA.paths.bootstrapSkill,\n ...CODEX_MIGRATION_SCHEMA.cleanupFiles,\n ];\n try {\n const migrated = observeFileStage(cwd, codexMigrationTargets, completedEffects, () =>\n automaticallyMigrateLegacyCodex(cwd),\n );\n if (!migrated) return [];\n const finalized = codexFinalizationIsComplete(cwd);\n return [\n {\n code: finalized ? 'CODEX_PLUGIN_HANDOFF_COMPLETE' : 'CODEX_PLUGIN_HANDOFF_PENDING_PROOF',\n message: finalized\n ? 'Codex verified the native profile plugin, backed up the legacy state, and retired the legacy project assets automatically.'\n : 'Codex enabled the native profile plugin and retained legacy project protection. After a restarted task records current hook proof, the next setup will finish the recoverable cleanup automatically.',\n severity: 'info',\n },\n ];\n } catch (error) {\n return [\n {\n code: 'CODEX_PLUGIN_HANDOFF_DEFERRED',\n message: `Codex native plugin handoff could not complete, so legacy project protection was retained: ${error instanceof Error ? error.message : String(error)}`,\n severity: 'warning',\n },\n ];\n }\n}\n\nasync function applySetup(cwd: string, input: ApplySetupInput): Promise<CliResult> {\n const {\n adapters,\n configured,\n namespaceMigration,\n noModify,\n packageJsonCreated,\n preliminaryFileEffects,\n } = input;\n const context = createProjectContext(cwd);\n const operation = configured ? 'upgrade' : 'install';\n const setupSchema = input.schema ?? schemaForClaudeDelivery(cwd);\n const result = await reconcile(setupSchema, operation, context);\n const completedEffects: CompletedSetupEffects = {\n files: [...preliminaryFileEffects, ...effectsForReconciliation(result, 'upgrade').files],\n packages: [],\n network: [],\n };\n\n try {\n applyCompatibilityMigrations(cwd, completedEffects);\n observeFileStage(cwd, ['.codex/config.toml'], completedEffects, () =>\n installCodexProjectBootstrap(cwd),\n );\n const codexHandoffFindings = migrateLegacyCodexDuringSetup(cwd, completedEffects);\n const architectureEffects = observeFileStage(\n cwd,\n ['.safeword/depcruise-config.cjs', '.dependency-cruiser.cjs'],\n completedEffects,\n () => adapters.configureArchitecture(cwd),\n );\n observeFileStage(cwd, workspacePackageJsonTargets(cwd, context), completedEffects, () =>\n adapters.configureWorkspaces(cwd, context),\n );\n const eslintConfig = context.projectType.existingEslintConfig;\n const eslintPolicy = observeFileStage(\n cwd,\n eslintConfig === undefined ? [] : [eslintConfig, `${eslintConfig}.safeword-bak`],\n completedEffects,\n () =>\n applyVendoredIgnoresPolicy({\n cwd,\n existingEslintConfig: eslintConfig,\n hasJavaScript: context.languages?.javascript ?? false,\n noModify,\n }),\n );\n const packageFiles = [\n 'package.json',\n 'bun.lock',\n 'bun.lockb',\n 'package-lock.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n ];\n const installation = observeFileStage(cwd, packageFiles, completedEffects, () =>\n installDependencies(cwd, result.packagesToInstall, 'missing packages', {\n report: false,\n }),\n );\n recordInstalledPackages(result.packagesToInstall, installation, completedEffects);\n const pythonSetup = observeFileStage(\n cwd,\n ['pyproject.toml', 'uv.lock', 'poetry.lock', 'Pipfile', 'Pipfile.lock'],\n completedEffects,\n () => adapters.configurePython(cwd, context),\n );\n if (pythonSetup.attempted) {\n for (const target of pythonSetup.tools) {\n if (pythonSetup.installed) completedEffects.packages.push({ kind: 'install', target });\n completedEffects.network.push({\n kind: 'package-registry',\n target,\n operation: 'install',\n });\n }\n }\n observeFileStage(cwd, ['package.json'], completedEffects, () => {\n applyPackageCompatibility(cwd, completedEffects);\n });\n const applied = setupResult({\n packageJsonCreated,\n installation,\n eslintPolicy,\n gitInitialized: context.isGitRepo,\n guidanceFindings: [\n ...setupGuidanceFindings(context, result, architectureEffects),\n ...codexHandoffFindings,\n ],\n pythonSetup,\n namespaceMigration,\n completedEffects,\n claudeProjectPluginEnrolled: projectClaudePluginEnrolled(cwd),\n });\n const health = await checkHealth(cwd, {\n skipPackageChecks: Boolean(process.env.SAFEWORD_SKIP_INSTALL),\n schema: setupSchema,\n });\n return verifiedSetupResult(applied, health, configured);\n } catch (setupError) {\n throw new SetupApplyError(setupError, completedEffects);\n }\n}\n\nfunction verifiedSetupResult(\n applied: CliResult,\n health: HealthStatus,\n wasConfigured: boolean,\n): CliResult {\n const healthProblems = [\n ...health.issues,\n ...health.missingPackages.map(packageName => `Missing package: ${packageName}`),\n ...health.missingPacks.map(pack => `Missing language pack: ${pack}`),\n ...health.missingPythonTools.map(tool => `Missing Python tool: ${tool}`),\n ];\n if (!health.configured || healthProblems.length > 0) {\n if (wasConfigured && health.configured) {\n return {\n ...applied,\n findings: [\n ...applied.findings,\n ...healthProblems.map(message => ({\n code: 'SETUP_POSTCONDITION_ADVISORY',\n message,\n severity: 'warning' as const,\n })),\n ...health.advisories.map(message => ({\n code: 'SETUP_HEALTH_ADVISORY',\n message,\n severity: 'info' as const,\n })),\n ],\n };\n }\n return {\n ...applied,\n ok: false,\n state: 'failed',\n findings: [\n ...applied.findings,\n ...health.advisories.map(message => ({\n code: 'SETUP_HEALTH_ADVISORY',\n message,\n severity: 'info' as const,\n })),\n ],\n errors: [\n ...applied.errors,\n ...(health.configured ? healthProblems : ['Safeword is not configured after install.']).map(\n message => ({\n code: 'SETUP_POSTCONDITION_FAILED',\n message,\n retryable: true,\n }),\n ),\n ],\n recovery: [\n ...applied.recovery,\n {\n command: 'safeword doctor --verbose',\n description: 'Inspect the failed install postcondition before retrying.',\n requiresHuman: true,\n },\n ],\n };\n }\n return {\n ...applied,\n findings: [\n ...applied.findings,\n ...health.advisories.map(message => ({\n code: 'SETUP_HEALTH_ADVISORY',\n message,\n severity: 'info' as const,\n })),\n {\n code: 'SETUP_POSTCONDITION_VERIFIED',\n message: 'Configuration is healthy',\n severity: 'info',\n },\n ],\n };\n}\n\nfunction setupFailure(setupError: unknown, initialEffects: Partial<Effects>): CliResult {\n const reconciliationEffects =\n setupError instanceof ReconcileExecutionError\n ? {\n files: [\n ...setupError.partial.created.map(target => ({ kind: 'create', target })),\n ...setupError.partial.updated.map(target => ({ kind: 'update', target })),\n ],\n }\n : {};\n const applyEffects = setupError instanceof SetupApplyError ? setupError.completedEffects : {};\n const effects = mergeEffects(initialEffects, reconciliationEffects, applyEffects);\n const changed = Object.values(effects).some(category => category.length > 0);\n return createResult({\n state: 'failed',\n changed,\n effects,\n errors: [\n {\n code: 'SETUP_FAILED',\n message: setupError instanceof Error ? setupError.message : String(setupError),\n retryable: true,\n },\n ],\n recovery: [\n {\n command: 'safeword status --verbose',\n description: 'Inspect the partial project state before retrying install.',\n requiresHuman: true,\n },\n ],\n });\n}\n\nfunction mergeEffects(...groups: readonly Partial<Effects>[]): Effects {\n const combined = combineEffects(groups);\n return {\n files: uniqueEffects(combined.files),\n packages: uniqueEffects(combined.packages),\n configuration: uniqueEffects(combined.configuration),\n network: uniqueEffects(combined.network),\n destructive: uniqueEffects(combined.destructive),\n };\n}\n","/**\n * Pack Installation\n *\n * Install language packs and update config.\n */\n\nimport { isGitRepo } from '../utils/git.js';\nimport { addInstalledPack, isPackInstalled } from './config.js';\nimport { LANGUAGE_PACKS } from './registry.js';\nimport type { SetupResult } from './types.js';\n\n/**\n * Install a language pack.\n *\n * Runs the pack's setup function and updates config.json.\n * Idempotent - does nothing if pack is already installed.\n *\n * @param packId - Pack ID to install (e.g., 'python')\n * @param cwd - Project root directory\n * @throws Error if pack ID is unknown\n */\nexport function installPack(packId: string, cwd: string): SetupResult {\n // Idempotent - skip if already installed\n if (isPackInstalled(cwd, packId)) {\n return { files: [] };\n }\n\n const pack = LANGUAGE_PACKS[packId];\n if (!pack) {\n throw new Error(`Unknown pack: ${packId}`);\n }\n\n const result = pack.setup(cwd, { isGitRepo: isGitRepo(cwd) });\n addInstalledPack(cwd, packId);\n return result;\n}\n","/**\n * Hook-integration nudges for non-husky worlds (ZJMZ50, #810 child 2).\n *\n * Husky hosts get the boundary shims appended by reconcile (schema\n * textPatches); every other world gets a printed, verbatim-usable snippet —\n * safeword never edits lefthook.yml or .pre-commit-config.yaml (user-owned\n * YAML). The nudge quiesces once the target config invokes the boundary\n * gate, and repeats on later setups until then (vendored-ignores precedent:\n * the quiesce signal is integration, not run count).\n */\n\nimport nodePath from 'node:path';\n\nimport type { ProjectContext } from '../packs/types.js';\nimport { boundaryShimCommand } from '../schema.js';\nimport { readFileSafe } from './fs.js';\nimport { gitToplevel } from './git.js';\nimport { LEFTHOOK_CONFIGS } from './hook-manager.js';\n\n/** Substring proving a config already invokes the gate — the quiesce signal. */\nconst BOUNDARY_INVOCATION = 'safeword boundary';\n\n// Both snippets interpolate the shared boundaryShimCommand (schema.ts): the\n// `[ -x ]` guard keeps a fresh clone (no node_modules) silent, and `|| true`\n// keeps a crashing gate from blocking — pre-commit and lefthook both treat a\n// non-zero hook as failure, so an unguarded entry would break warn-only.\nconst LEFTHOOK_SNIPPET = `Boundary gate: this repo uses lefthook, and safeword never edits lefthook.yml.\nTo wire the warn-only boundary gate, add:\n\npre-commit:\n commands:\n safeword-boundary:\n run: '${boundaryShimCommand('commit')}'\npre-push:\n commands:\n safeword-boundary:\n run: '${boundaryShimCommand('push')}'`;\n\n// `stages` is explicit on BOTH hooks: pre-commit's default_stages spreads a\n// stage-less hook to every installed hook type, so the commit-tier gate would\n// also fire on push in a `--hook-type pre-push` install.\nconst PRE_COMMIT_SNIPPET = `Boundary gate: this repo uses the pre-commit framework, and safeword never edits .pre-commit-config.yaml.\nTo wire the warn-only boundary gate, add under repos:\n\n - repo: local\n hooks:\n - id: safeword-boundary-commit\n name: safeword boundary gate (commit)\n entry: sh -c '${boundaryShimCommand('commit')}'\n language: system\n always_run: true\n pass_filenames: false\n stages: [pre-commit]\n - id: safeword-boundary-push\n name: safeword boundary gate (push)\n entry: sh -c '${boundaryShimCommand('push')}'\n language: system\n always_run: true\n pass_filenames: false\n stages: [pre-push]`;\n\nconst BARE_NUDGE = `Boundary gate: no hook manager detected, so the commit/push boundary gate is not installed.\nTo adopt one, husky is the lightest path:\n\n npm install -D husky && npx husky init\n\nthen re-run \\`safeword install\\` to install the boundary-gate shims.`;\n\nconst HUSKY_UNINITIALIZED_NUDGE = `Boundary gate: husky is in your dependencies but .husky/ does not exist yet.\nRun \\`npx husky init\\`, then re-run \\`safeword install\\` to install the boundary-gate shims.`;\n\n/** True when any of the world's config files already invokes the gate. */\nfunction configAlreadyIntegrates(cwd: string, configNames: string[]): boolean {\n return configNames.some(name =>\n (readFileSafe(nodePath.join(cwd, name)) ?? '').includes(BOUNDARY_INVOCATION),\n );\n}\n\n/**\n * The one-time-per-run hook-integration message for this host, or undefined\n * when there is nothing to say: husky hosts (shims handled by reconcile),\n * already-integrated configs, and plain non-git directories all stay silent\n * (SM1.R2 — no nudge noise where hooks can never fire).\n */\nexport function hookIntegrationNudge(ctx: ProjectContext): string | undefined {\n if (!ctx.isGitRepo) return repoRootNote(ctx.cwd);\n return worldNudge(ctx);\n}\n\n/** Monorepo subdir (SM1.R2): a git root above cwd means hooks exist — just\n * not here. Point at it; a plain non-git directory stays silent. */\nfunction repoRootNote(cwd: string): string | undefined {\n const top = gitToplevel(cwd);\n return top === undefined || nodePath.resolve(top) === nodePath.resolve(cwd)\n ? undefined\n : `Boundary gate: git hooks belong at the repository root (${top}). Run \\`safeword install\\` there to install the boundary gate.`;\n}\n\nfunction worldNudge(ctx: ProjectContext): string | undefined {\n switch (ctx.hookManager) {\n case 'lefthook': {\n return configAlreadyIntegrates(ctx.cwd, LEFTHOOK_CONFIGS) ? undefined : LEFTHOOK_SNIPPET;\n }\n case 'pre-commit': {\n return configAlreadyIntegrates(ctx.cwd, ['.pre-commit-config.yaml'])\n ? undefined\n : PRE_COMMIT_SNIPPET;\n }\n case 'husky-uninitialized': {\n return HUSKY_UNINITIALIZED_NUDGE;\n }\n case 'bare': {\n return BARE_NUDGE;\n }\n // husky hosts get shims from reconcile; undefined = unknown world (older\n // caller built the ctx without detection) — say nothing rather than guess.\n case 'husky':\n case undefined: {\n return undefined;\n }\n }\n}\n","/**\n * Namespace migration — automatic convergence of a legacy `.safeword-project/`\n * onto `.project/` (ticket 9MMWS7, epic AQJ95G).\n *\n * `planNamespaceMigration` classifies the install; `executeNamespaceMigration`\n * performs the move (git mv when the directory is tracked, so history is\n * preserved; filesystem rename otherwise), safely merges a split namespace,\n * and rewrites stale per-file `paths.*` overrides that pointed into the legacy root.\n */\n\nimport { execSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n closeSync,\n constants as fsConstants,\n cpSync,\n existsSync,\n fstatSync,\n lstatSync,\n mkdirSync,\n openSync,\n readdirSync,\n readFileSync,\n readSync,\n renameSync,\n rmdirSync,\n rmSync,\n} from 'node:fs';\nimport nodePath from 'node:path';\n\nimport { writeDurableFile } from '../codex-plugin/durable-write.js';\nimport { readConfiguredPath } from './configured-paths.js';\nimport { isDirectory } from './fs.js';\n\nconst LEGACY_ROOT = '.safeword-project';\nconst DEFAULT_ROOT = '.project';\n\nexport type MigrationPlan =\n | 'offer' // legacy-only install — converge unless explicitly disabled\n | 'already-current' // .project/ present (or nothing to move) — no offer\n | 'both-dirs' // both roots exist — merge, archiving authored collisions\n | 'custom-root' // explicit paths.projectRoot — user opted out of defaults\n | 'blocked'; // target exists but is not a directory — cannot move\n\nexport interface MigrationResult {\n method: 'git' | 'rename' | 'merge';\n conflicts: { path: string; archivedAs: string }[];\n rewrittenKeys: string[];\n}\n\nexport interface NamespaceMigrationHooks {\n readonly afterFilesCopied?: () => void;\n readonly afterLegacyRetired?: () => void;\n readonly removeRetiredLegacy?: (path: string) => void;\n}\n\nexport class NamespaceStructuralCollisionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NamespaceStructuralCollisionError';\n }\n}\n\nexport class NamespaceMergeIncompleteError extends Error {\n constructor(message: string, cause: unknown) {\n super(message, { cause });\n this.name = 'NamespaceMergeIncompleteError';\n }\n}\n\nfunction validateNamespaceTree(root: string, label: string): void {\n if (lstatSync(root).isSymbolicLink()) {\n throw new Error(`${label} is a symlink: ${root}`);\n }\n const visit = (directory: string): void => {\n const entries = readdirSync(directory, { withFileTypes: true });\n for (const entry of entries) {\n const path = nodePath.join(directory, entry.name);\n if (entry.isSymbolicLink()) {\n throw new Error(`${label} contains a symlink: ${path}`);\n }\n if (entry.isDirectory()) visit(path);\n else if (!entry.isFile()) {\n throw new Error(`${label} contains an unsupported file: ${path}`);\n }\n }\n };\n visit(root);\n}\n\nfunction validateDirectoryRoot(path: string, label: string): void {\n if (!existsSync(path)) return;\n const metadata = lstatSync(path);\n if (metadata.isSymbolicLink()) throw new Error(`${label} is a symlink: ${path}`);\n if (!metadata.isDirectory()) throw new Error(`${label} is not a directory: ${path}`);\n}\n\nfunction conflictArchivePath(source: string, relative: string): string {\n const metadata = lstatSync(source);\n const digest = createHash('sha256')\n .update(`${metadata.mode.toString(8)}\\0`)\n .update(readFileSync(source))\n .digest('hex');\n return nodePath.join('.safeword', 'namespace-migration-conflicts-v1', digest, relative);\n}\n\n// The branches here are the explicit prepare/commit/rollback states of one\n// filesystem transaction; splitting that state would obscure recovery order.\n// eslint-disable-next-line complexity, sonarjs/cognitive-complexity -- Transaction states must remain visibly ordered.\nfunction mergeLegacyDirectory(\n cwd: string,\n hooks: NamespaceMigrationHooks,\n): MigrationResult['conflicts'] {\n const legacy = nodePath.join(cwd, LEGACY_ROOT);\n const current = nodePath.join(cwd, DEFAULT_ROOT);\n const recovery = nodePath.join(cwd, '.safeword', 'namespace-migration-conflicts-v1');\n const safewordRoot = nodePath.join(cwd, '.safeword');\n const conflicts: MigrationResult['conflicts'] = [];\n validateNamespaceTree(legacy, 'Legacy project namespace');\n validateNamespaceTree(current, 'Current project namespace');\n validateDirectoryRoot(safewordRoot, 'Safeword state directory');\n if (existsSync(recovery)) validateNamespaceTree(recovery, 'Namespace recovery directory');\n\n const validateMergeShape = (from: string, relative: string): void => {\n const entries = readdirSync(from, { withFileTypes: true });\n for (const entry of entries) {\n const child = relative === '' ? entry.name : nodePath.join(relative, entry.name);\n const source = nodePath.join(from, entry.name);\n const target = nodePath.join(current, child);\n if (entry.isDirectory()) {\n if (existsSync(target) && !lstatSync(target).isDirectory()) {\n throw new NamespaceStructuralCollisionError(\n `Cannot merge project namespaces: directory ${child} conflicts with a file.`,\n );\n }\n validateMergeShape(source, child);\n } else if (existsSync(target) && !lstatSync(target).isFile()) {\n throw new NamespaceStructuralCollisionError(\n `Cannot merge project namespaces: file ${child} conflicts with a directory.`,\n );\n }\n }\n };\n // Refuse every structural collision before copying or archiving anything so\n // a failed merge leaves both namespace trees byte-for-byte recoverable.\n validateMergeShape(legacy, '');\n\n const createdFiles: string[] = [];\n const createdDirectories = new Set<string>();\n const ensureDirectory = (directory: string): void => {\n const missing: string[] = [];\n let cursor = directory;\n while (!existsSync(cursor)) {\n missing.push(cursor);\n cursor = nodePath.dirname(cursor);\n }\n mkdirSync(directory, { recursive: true });\n for (const path of missing) createdDirectories.add(path);\n };\n const visit = (from: string, relative: string): void => {\n const entries = readdirSync(from, { withFileTypes: true });\n for (const entry of entries) {\n const child = relative === '' ? entry.name : nodePath.join(relative, entry.name);\n const source = nodePath.join(from, entry.name);\n const target = nodePath.join(current, child);\n if (entry.isDirectory()) {\n ensureDirectory(target);\n visit(source, child);\n } else if (existsSync(target)) {\n const archivedAs = conflictArchivePath(source, child);\n const archived = nodePath.join(cwd, archivedAs);\n ensureDirectory(nodePath.dirname(archived));\n if (!existsSync(archived)) {\n createdFiles.push(archived);\n cpSync(source, archived, { dereference: false });\n }\n conflicts.push({ path: child, archivedAs });\n } else {\n ensureDirectory(nodePath.dirname(target));\n createdFiles.push(target);\n cpSync(source, target, { dereference: false });\n }\n }\n };\n const retiredLegacy = nodePath.join(\n cwd,\n '.safeword',\n `namespace-migration-retired-${process.pid}`,\n );\n let legacyWasRetired = false;\n try {\n visit(legacy, '');\n hooks.afterFilesCopied?.();\n ensureDirectory(nodePath.dirname(retiredLegacy));\n renameSync(legacy, retiredLegacy);\n legacyWasRetired = true;\n hooks.afterLegacyRetired?.();\n } catch (error) {\n let legacyWasRestored = !legacyWasRetired;\n if (legacyWasRetired) {\n try {\n renameSync(retiredLegacy, legacy);\n legacyWasRestored = true;\n } catch {\n // Keep the complete destination copy when the source tree cannot be restored.\n }\n }\n if (legacyWasRestored) {\n for (const path of createdFiles.toReversed()) rmSync(path, { force: true });\n const deepestDirectoriesFirst = [...createdDirectories].toSorted(\n (a, b) => b.length - a.length,\n );\n for (const directory of deepestDirectoriesFirst) {\n try {\n rmdirSync(directory);\n } catch {\n // A non-empty directory predates this attempt or contains recovery evidence.\n }\n }\n }\n throw new NamespaceMergeIncompleteError(\n `Project namespace merge failed before it could commit: ${error instanceof Error ? error.message : String(error)}`,\n error,\n );\n }\n try {\n const removeRetiredLegacy =\n hooks.removeRetiredLegacy ??\n (path => {\n rmSync(path, { recursive: true, force: true });\n });\n removeRetiredLegacy(retiredLegacy);\n } catch {\n // The complete `.project` copy is committed. Retain the retired duplicate as recovery evidence.\n }\n return conflicts.toSorted((left, right) => left.path.localeCompare(right.path));\n}\n\n/** Classify the install for the migration offer. */\nexport function planNamespaceMigration(cwd: string): MigrationPlan {\n if (readConfiguredPath(cwd, 'projectRoot') !== undefined) return 'custom-root';\n\n const legacyPath = nodePath.join(cwd, LEGACY_ROOT);\n if (!isDirectory(legacyPath)) return 'already-current';\n\n const targetPath = nodePath.join(cwd, DEFAULT_ROOT);\n if (isDirectory(targetPath)) return 'both-dirs';\n if (existsSync(targetPath)) return 'blocked';\n\n return 'offer';\n}\n\n/** True when git tracks anything under the legacy directory. */\nfunction isGitTracked(cwd: string): boolean {\n try {\n const output = execSync(`git ls-files --error-unmatch \"${LEGACY_ROOT}\" 2>/dev/null | head -1`, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return output.trim().length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Rewrite per-file `paths.*` values prefixed with the legacy root so they\n * follow the moved namespace. Surgical: only string values under `paths`\n * that start with `.safeword-project/` are touched.\n */\nconst MAX_NAMESPACE_CONFIG_BYTES = 1024 * 1024;\n\n// Keep all descriptor identity checks adjacent so none can be dropped by a caller.\n// eslint-disable-next-line complexity -- Security checks must remain adjacent and fail closed.\nfunction readSafeNamespaceConfig(path: string): string | undefined {\n let descriptor: number | undefined;\n try {\n const before = lstatSync(path);\n if (\n !before.isFile() ||\n before.isSymbolicLink() ||\n before.nlink !== 1 ||\n before.size > MAX_NAMESPACE_CONFIG_BYTES\n ) {\n return undefined;\n }\n descriptor = openSync(\n path,\n fsConstants.O_RDONLY | fsConstants.O_NONBLOCK | (fsConstants.O_NOFOLLOW ?? 0),\n );\n const opened = fstatSync(descriptor);\n if (\n !opened.isFile() ||\n opened.nlink !== 1 ||\n opened.dev !== before.dev ||\n opened.ino !== before.ino\n ) {\n return undefined;\n }\n const buffer = Buffer.alloc(MAX_NAMESPACE_CONFIG_BYTES + 1);\n let offset = 0;\n while (offset < buffer.length) {\n const count = readSync(descriptor, buffer, offset, buffer.length - offset, offset);\n if (count === 0) break;\n offset += count;\n }\n const after = fstatSync(descriptor);\n if (\n offset > MAX_NAMESPACE_CONFIG_BYTES ||\n after.dev !== before.dev ||\n after.ino !== before.ino ||\n after.nlink !== 1\n ) {\n return undefined;\n }\n return buffer.subarray(0, offset).toString('utf8');\n } catch {\n return undefined;\n } finally {\n if (descriptor !== undefined) closeSync(descriptor);\n }\n}\n\n// Parsing, shape validation, and the surgical rewrite deliberately fail closed.\n// eslint-disable-next-line complexity -- Parse, validate, and rewrite form one fail-closed boundary.\nfunction rewriteLegacyPathOverrides(cwd: string): string[] {\n const configPath = nodePath.join(cwd, '.safeword', 'config.json');\n if (!existsSync(configPath)) return [];\n\n let parsed: Record<string, unknown>;\n try {\n const source = readSafeNamespaceConfig(configPath);\n if (source === undefined) return [];\n const value = JSON.parse(source) as unknown;\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return [];\n parsed = value as Record<string, unknown>;\n } catch {\n return [];\n }\n const paths = parsed.paths;\n if (typeof paths !== 'object' || paths === null || Array.isArray(paths)) return [];\n\n const rewritten: string[] = [];\n for (const [key, value] of Object.entries(paths)) {\n if (!(typeof value === 'string' && value.startsWith(`${LEGACY_ROOT}/`))) {\n continue;\n }\n\n (paths as Record<string, unknown>)[key] = `${DEFAULT_ROOT}${value.slice(LEGACY_ROOT.length)}`;\n rewritten.push(key);\n }\n if (rewritten.length > 0) {\n writeDurableFile(configPath, `${JSON.stringify(parsed, undefined, 2)}\\n`, { mode: 0o644 });\n }\n return rewritten.toSorted((a, b) => a.localeCompare(b));\n}\n\n/**\n * Move the legacy namespace to `.project/` and rewrite stale config\n * overrides. Caller must have confirmed consent and a plan of 'offer'.\n * Throws with context when the move itself fails — the tree is unchanged\n * in that case (a directory rename is atomic on one filesystem).\n */\nexport function executeNamespaceMigration(\n cwd: string,\n hooks: NamespaceMigrationHooks = {},\n): MigrationResult {\n const legacy = nodePath.join(cwd, LEGACY_ROOT);\n validateNamespaceTree(legacy, 'Legacy project namespace');\n if (planNamespaceMigration(cwd) === 'both-dirs') {\n const conflicts = mergeLegacyDirectory(cwd, hooks);\n return { method: 'merge', conflicts, rewrittenKeys: rewriteLegacyPathOverrides(cwd) };\n }\n const method: MigrationResult['method'] = isGitTracked(cwd) ? 'git' : 'rename';\n\n try {\n if (method === 'git') {\n execSync(`git mv \"${LEGACY_ROOT}\" \"${DEFAULT_ROOT}\"`, { cwd, stdio: 'pipe' });\n } else {\n renameSync(nodePath.join(cwd, LEGACY_ROOT), nodePath.join(cwd, DEFAULT_ROOT));\n }\n } catch (error) {\n throw new Error(\n `Failed to move ${LEGACY_ROOT}/ to ${DEFAULT_ROOT}/: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n );\n }\n\n return { method, conflicts: [], rewrittenKeys: rewriteLegacyPathOverrides(cwd) };\n}\n","import nodePath from 'node:path';\n\nimport { VERSION } from '../version.js';\nimport { readFileSafe, readJson, writeFile } from './fs.js';\nimport { installDependencies } from './install.js';\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n}\n\nconst DEPENDENCY_FIELDS = ['devDependencies', 'dependencies', 'optionalDependencies'] as const;\nconst SAFEWORD_REGISTRY_SPEC = `^${VERSION}`;\nconst SAFEWORD_INSTALL_SPEC = VERSION;\nconst NON_REGISTRY_SPEC_PREFIXES = [\n 'file:',\n 'link:',\n 'portal:',\n 'workspace:',\n 'git+',\n 'github:',\n 'gitlab:',\n 'bitbucket:',\n 'http:',\n 'https:',\n '.',\n '/',\n] as const;\n\n// Ticket 154: strip the inert `version` field from .safeword/config.json.\n// Plaintext `.safeword/version` is the source of truth.\nexport function stripDeadConfigVersion(safewordDirectory: string): boolean {\n const configPath = nodePath.join(safewordDirectory, 'config.json');\n const content = readFileSafe(configPath);\n if (!content) return false;\n const parsed = JSON.parse(content) as Record<string, unknown>;\n if (!('version' in parsed)) return false;\n delete parsed.version;\n writeFile(configPath, JSON.stringify(parsed, undefined, 2));\n return true;\n}\n\nfunction isNonRegistryPackageSpec(spec: string): boolean {\n return NON_REGISTRY_SPEC_PREFIXES.some(prefix => spec.startsWith(prefix));\n}\n\nfunction isCurrentSafewordRegistrySpec(spec: string): boolean {\n return [VERSION, SAFEWORD_REGISTRY_SPEC, `~${VERSION}`].includes(spec);\n}\n\nexport function syncPackageJsonSafewordVersion(\n cwd: string,\n options: { report?: boolean } = {},\n): boolean {\n const packageJson = readPackageJson(cwd);\n if (!packageJson) return false;\n\n for (const field of DEPENDENCY_FIELDS) {\n const dependencies = packageJson[field];\n const currentSpec = dependencies?.safeword;\n if (!dependencies || currentSpec === undefined || isNonRegistryPackageSpec(currentSpec))\n continue;\n\n if (isCurrentSafewordRegistrySpec(currentSpec)) continue;\n installDependencies(cwd, [`safeword@${SAFEWORD_INSTALL_SPEC}`], 'safeword package', options);\n return packageJsonReferencesCurrentSafewordVersion(cwd);\n }\n\n return false;\n}\n\nfunction readPackageJson(cwd: string): PackageJson | undefined {\n return readJson(nodePath.join(cwd, 'package.json')) as PackageJson | undefined;\n}\n\nfunction packageJsonReferencesCurrentSafewordVersion(cwd: string): boolean {\n const packageJson = readPackageJson(cwd);\n return DEPENDENCY_FIELDS.some(field => {\n const spec = packageJson?.[field]?.safeword;\n return spec !== undefined && isCurrentSafewordRegistrySpec(spec);\n });\n}\n","import { readdirSync } from 'node:fs';\nimport nodePath from 'node:path';\n\nimport type { ProjectContext } from '../schema.js';\nimport { exists, readJson, writeJson } from './fs.js';\nimport { getWorkspacePatterns } from './workspaces.js';\n\ninterface PackageJson {\n scripts?: Record<string, string>;\n}\n\nexport function workspacePackageJsonTargets(cwd: string, context: ProjectContext): string[] {\n if (context.projectType.existingFormatter) return [];\n return getWorkspacePatterns(cwd).flatMap(pattern => {\n if (!pattern.endsWith('/*')) return [nodePath.join(pattern, 'package.json')];\n const workspaceRoot = pattern.slice(0, -2);\n const fullPath = nodePath.join(cwd, workspaceRoot);\n if (!exists(fullPath)) return [];\n try {\n return readdirSync(fullPath, { withFileTypes: true }).flatMap(entry =>\n entry.isDirectory() && !entry.name.startsWith('.')\n ? [nodePath.join(workspaceRoot, entry.name, 'package.json')]\n : [],\n );\n } catch {\n return [];\n }\n });\n}\n\nfunction addFormatScriptIfMissing(packageDirectory: string): boolean {\n const packageJsonPath = nodePath.join(packageDirectory, 'package.json');\n if (!exists(packageJsonPath)) return false;\n\n const packageJson = readJson(packageJsonPath) as PackageJson | undefined;\n if (packageJson === undefined || packageJson.scripts?.format !== undefined) return false;\n\n packageJson.scripts = {\n format: 'prettier --write .',\n ...packageJson.scripts,\n };\n writeJson(packageJsonPath, packageJson);\n return true;\n}\n\nfunction processGlobWorkspacePattern(cwd: string, workspacePath: string): string[] {\n const fullPath = nodePath.join(cwd, workspacePath);\n if (!exists(fullPath)) return [];\n\n try {\n return readdirSync(fullPath, { withFileTypes: true }).flatMap(entry => {\n if (!entry.isDirectory() || entry.name.startsWith('.')) return [];\n const relativePackageJson = nodePath.join(workspacePath, entry.name, 'package.json');\n return addFormatScriptIfMissing(nodePath.join(fullPath, entry.name))\n ? [relativePackageJson]\n : [];\n });\n } catch {\n return [];\n }\n}\n\nexport function setupWorkspaceFormatScripts(cwd: string, context: ProjectContext): string[] {\n if (context.projectType.existingFormatter) return [];\n\n return getWorkspacePatterns(cwd).flatMap(pattern => {\n if (pattern.endsWith('/*')) {\n return processGlobWorkspacePattern(cwd, pattern.slice(0, -2));\n }\n return addFormatScriptIfMissing(nodePath.join(cwd, pattern))\n ? [nodePath.join(pattern, 'package.json')]\n : [];\n });\n}\n","/**\n * Stale tooling-config scanner (ticket JYWZG1, epic AQJ95G follow-up).\n *\n * After `safeword install --migrate-namespace` moves a repo from the legacy\n * `.safeword-project/` namespace to `.project/`, a customer's hand-authored\n * tooling config (eslint, prettier, tsconfig, CI, …) that referenced the old\n * path silently goes stale. This scanner NAMES those files so the migration\n * can warn — it never edits anything.\n *\n * Scope is deliberately narrow (ticket JYWZG1 / the /figure-it-out call):\n * - Only a curated set of *functional* tooling configs is read — never a\n * blanket repo grep, because the moved `.project/` dir legitimately holds\n * hundreds of documentary `.safeword-project` references (tickets, learnings).\n * - The match is path-boundary anchored (`.safeword-project/`) so unrelated\n * tokens like `.safeword-projectile/` don't false-positive.\n * - In `.prettierignore`, lines inside safeword's own managed block are\n * skipped — safeword writes BOTH roots there by design; a customer's stale\n * line elsewhere in the file is still flagged.\n */\n\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport nodePath from 'node:path';\n\nimport { NAMESPACE_ROOT_LEGACY } from './configured-paths.js';\n\n/** The legacy namespace path, anchored with a trailing slash (boundary match). */\nconst LEGACY_REFERENCE = `${NAMESPACE_ROOT_LEGACY}/`;\n\n/** Marker for safeword's managed `.prettierignore` block (mirrors schema.ts). */\nconst MANAGED_PRETTIER_MARKER = '# Safeword - managed prettier exclusions';\n\n/** Workflows directory — the one nested config location safeword scans. */\nconst WORKFLOWS_SUBPATH = ['.github', 'workflows'];\n\n/**\n * Curated root-level tooling-config files. Extend here as new config types\n * surface; `.github/workflows/*` is handled separately (nested).\n */\nconst CURATED_ROOT_CONFIGS: readonly string[] = [\n 'eslint.config.ts',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.js',\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n '.prettierignore',\n '.prettierrc',\n '.prettierrc.json',\n '.prettierrc.js',\n '.prettierrc.cjs',\n '.prettierrc.yml',\n '.prettierrc.yaml',\n 'tsconfig.json',\n 'knip.json',\n 'knip.ts',\n '.dependency-cruiser.cjs',\n '.dependency-cruiser.js',\n '.jscpd.json',\n];\n\n/** True when any line outside the managed prettier block references the legacy root. */\nfunction prettierignoreHasCustomerReference(content: string): boolean {\n let isInsideManagedBlock = false;\n for (const line of content.split('\\n')) {\n if (line.includes(MANAGED_PRETTIER_MARKER)) {\n isInsideManagedBlock = true;\n continue;\n }\n // The managed block is safeword-written and contiguous; a blank line ends it.\n if (isInsideManagedBlock && line.trim() === '') {\n isInsideManagedBlock = false;\n continue;\n }\n if (!isInsideManagedBlock && line.includes(LEGACY_REFERENCE)) return true;\n }\n return false;\n}\n\nfunction fileHasStaleReference(relativePath: string, content: string): boolean {\n if (nodePath.basename(relativePath) === '.prettierignore') {\n return prettierignoreHasCustomerReference(content);\n }\n return content.includes(LEGACY_REFERENCE);\n}\n\n/** Workflow files under `.github/workflows/`, repo-relative; [] when absent. */\nfunction workflowConfigPaths(cwd: string): string[] {\n const directory = nodePath.join(cwd, ...WORKFLOWS_SUBPATH);\n let names: string[];\n try {\n // Defensive: a non-directory `.github/workflows` (ENOTDIR) must not crash\n // the scan — this runs after a successful migration and must never abort it.\n names = readdirSync(directory);\n } catch {\n return [];\n }\n return names\n .filter(name => name.endsWith('.yml') || name.endsWith('.yaml'))\n .map(name => `${WORKFLOWS_SUBPATH.join('/')}/${name}`);\n}\n\n/**\n * Return the repo-relative paths of curated tooling configs that still\n * reference the legacy `.safeword-project/` namespace. Empty when none —\n * including a clean repo, a managed-only `.prettierignore`, and documentary\n * references (those live under `.project/`, which is never in the curated set).\n */\nexport function scanStaleNamespaceConfigs(cwd: string): string[] {\n const candidates = [...CURATED_ROOT_CONFIGS, ...workflowConfigPaths(cwd)];\n const stale: string[] = [];\n for (const relativePath of candidates) {\n const fullPath = nodePath.join(cwd, relativePath);\n if (!existsSync(fullPath)) continue;\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf8');\n } catch {\n continue;\n }\n if (fileHasStaleReference(relativePath, content)) stale.push(relativePath);\n }\n return stale;\n}\n","import { readFileSync } from 'node:fs';\nimport nodePath from 'node:path';\n\nimport { autoPatchEslintConfig } from './eslint-auto-patch.js';\nimport { info, listItem } from './output.js';\n\nexport interface VendoredIgnoresNudgeOptions {\n cwd: string;\n /** Path (relative to cwd) of the consumer's existing ESLint config, or undefined if none. */\n existingEslintConfig: string | undefined;\n /** True if the project has JavaScript/TypeScript sources safeword can lint. */\n hasJavaScript: boolean;\n}\n\n/**\n * Decide whether to print the install-time nudge telling the user to add\n * `...safeword.configs.vendoredIgnores` to their existing eslint config.\n *\n * Emits iff:\n * 1. an existing eslint config is detected, AND\n * 2. the project has JavaScript, AND\n * 3. the config file's text does NOT already mention `.safeword/` or\n * `vendoredIgnores`\n *\n * The substring check makes the nudge self-quiescing: once the user applies\n * the snippet (manually following the 153 nudge or via 154's auto-patch),\n * repeat `setup`/`upgrade` runs go quiet.\n */\nexport function shouldEmitVendoredIgnoresNudge(options: VendoredIgnoresNudgeOptions): boolean {\n const { cwd, existingEslintConfig, hasJavaScript } = options;\n if (!hasJavaScript) return false;\n if (!existingEslintConfig) return false;\n const fullPath = nodePath.join(cwd, existingEslintConfig);\n let text: string;\n try {\n text = readFileSync(fullPath, 'utf8');\n } catch {\n return true;\n }\n return (\n !text.includes('.safeword/') &&\n !text.includes('vendoredIgnores') &&\n !text.includes('safeword/eslint')\n );\n}\n\n/**\n * Print the nudge using safeword's standard output helpers.\n *\n * Module-internal — callers should use {@link maybePrintVendoredIgnoresNudge}\n * which wraps the decide-then-print sequence.\n */\nfunction printVendoredIgnoresNudge(): void {\n info(\n \"\\nSafeword vendors hook scripts under .safeword/. Add this line to your existing ESLint config so your lint doesn't flag them:\",\n );\n listItem(\"import safeword from 'safeword/eslint';\");\n listItem('// ... your existing configs');\n listItem('...safeword.configs.vendoredIgnores,');\n}\n\nexport interface AutoPatchOrNudgeOptions extends VendoredIgnoresNudgeOptions {\n /** True if the user passed `--no-modify` to setup/upgrade. Defaults to false. */\n noModify?: boolean;\n}\n\nexport type VendoredIgnoresPolicyResult =\n | { readonly kind: 'unchanged' }\n | { readonly kind: 'patched'; readonly configPath: string; readonly backupPath: string }\n | { readonly kind: 'manual'; readonly attempted: boolean };\n\nexport function applyVendoredIgnoresPolicy(\n options: AutoPatchOrNudgeOptions,\n): VendoredIgnoresPolicyResult {\n if (!shouldEmitVendoredIgnoresNudge(options)) return { kind: 'unchanged' };\n if (isOptOut(options.noModify ?? false)) return { kind: 'manual', attempted: false };\n if (!options.existingEslintConfig) return { kind: 'unchanged' };\n const configPath = nodePath.join(options.cwd, options.existingEslintConfig);\n const result = autoPatchEslintConfig({ configPath });\n if (result.kind === 'patched') return result;\n if (result.kind === 'idempotent-skip') return { kind: 'unchanged' };\n return { kind: 'manual', attempted: true };\n}\n\n/**\n * Orchestrator for ticket 154: try to auto-patch the consumer's eslint\n * config; on opt-out or bail, fall through to the 153 print-only nudge.\n *\n * Decision tree:\n * - If `shouldEmitVendoredIgnoresNudge` returns false (no existing\n * config / non-JS / already handled) → silent.\n * - Else if `--no-modify` flag OR `SAFEWORD_NO_MODIFY` env var → print\n * the 153 nudge only (no edit attempted).\n * - Else attempt auto-patch:\n * - `patched` → print confirmation with paths\n * - `idempotent-skip` → silent (defensive — the predicate above\n * already caught this case)\n * - `bailed` → print bail line + 153 nudge (caller sees both, the\n * user knows safeword tried and gets the manual snippet)\n */\nexport function maybeAutoPatchOrNudge(options: AutoPatchOrNudgeOptions): void {\n const result = applyVendoredIgnoresPolicy(options);\n if (result.kind === 'patched') {\n printAutoPatchConfirmation(result.configPath, result.backupPath);\n return;\n }\n if (result.kind !== 'manual') return;\n if (result.attempted) printAutoPatchBailLine();\n printVendoredIgnoresNudge();\n}\n\nfunction isOptOut(noModifyFlag: boolean): boolean {\n if (noModifyFlag) return true;\n const envValue = process.env.SAFEWORD_NO_MODIFY;\n return envValue !== undefined && envValue !== '';\n}\n\nfunction printAutoPatchConfirmation(configPath: string, backupPath: string): void {\n info(`\\nAdded vendoredIgnores to ${configPath}; backup at ${backupPath}`);\n}\n\nfunction printAutoPatchBailLine(): void {\n info(\n \"\\nCouldn't auto-patch your eslint config (unrecognized export shape or syntax check failed). Add it manually:\",\n );\n}\n","/**\n * Auto-patch a downstream project's flat ESLint config to spread\n * `safeword.configs.vendoredIgnores`. Used by `safeword install`\n * reconciliation (ticket 154).\n *\n * Textual insertion, not AST — the heuristic handles the common shapes\n * (bare array literal + `defineConfig(...)` wrapper). Anything else\n * (function-returning-config, single-imported-config, unrecognized\n * wrapper) bails out so the caller can fall back to ticket 153's\n * print-only nudge.\n *\n * Safety:\n * - `.safeword-bak` written before any edit\n * - `node --check` validates JS variants (.mjs/.js/.cjs); failure\n * restores the backup and bails\n * - TS variants (.ts/.mts/.cts) skip syntax check — node can't parse\n * TS, and pulling in a TS-aware checker would balloon dep weight for\n * a one-line insert\n *\n * Idempotency by substring: any config text containing\n * `vendoredIgnores` is treated as already-patched (covers both prior\n * auto-patch and manual application of the 153 print-nudge).\n */\n\nimport { execSync } from 'node:child_process';\nimport { copyFileSync, readFileSync, writeFileSync } from 'node:fs';\nimport nodePath from 'node:path';\n\nconst VENDORED_MARKER = 'vendoredIgnores';\nconst ESM_IMPORT = \"import safeword from 'safeword/eslint';\";\nconst CJS_IMPORT = \"const safeword = require('safeword/eslint');\";\nconst SPREAD = '...safeword.configs.vendoredIgnores,';\nconst BACKUP_SUFFIX = '.safeword-bak';\nconst TS_EXTENSIONS = new Set(['.ts', '.mts', '.cts']);\nconst CJS_EXTENSIONS = new Set(['.cjs']);\n\nexport interface AutoPatchOptions {\n /** Path (absolute or relative to cwd) of the flat ESLint config to patch. */\n configPath: string;\n}\n\nexport type AutoPatchResult =\n | { kind: 'patched'; configPath: string; backupPath: string }\n | { kind: 'idempotent-skip' }\n | { kind: 'bailed'; reason: BailReason };\n\ntype BailReason = 'read-failed' | 'unrecognized-shape' | 'syntax-check-failed' | 'write-failed';\n\n/**\n * Walk a string starting at an opening `[` and return the index of the\n * matching `]`. Returns -1 if no match (unbalanced) or if any string /\n * comment is unterminated. Tracks single/double/backtick strings and\n * `//` + `/* * /` comments so brackets inside literals don't fool the\n * walker.\n */\nfunction findMatchingBracket(source: string, openIndex: number): number {\n if (source[openIndex] !== '[') return -1;\n let depth = 1;\n let i = openIndex + 1;\n while (i < source.length) {\n const after = skipNonContent(source, i);\n if (after === -1) return -1;\n if (after > i) {\n i = after;\n continue;\n }\n const ch = source[i];\n if (ch === '[') depth += 1;\n else if (ch === ']') {\n depth -= 1;\n if (depth === 0) return i;\n }\n i += 1;\n }\n return -1;\n}\n\n/**\n * If `source[i]` starts a comment or string literal, return the index just\n * past its end. Otherwise return `i` unchanged. Returns -1 if a comment or\n * string is unterminated.\n */\nfunction skipNonContent(source: string, i: number): number {\n const ch = source[i];\n const next = source[i + 1];\n if (ch === '/' && next === '/') {\n const nl = source.indexOf('\\n', i);\n return nl === -1 ? -1 : nl + 1;\n }\n if (ch === '/' && next === '*') {\n const close = source.indexOf('*/', i + 2);\n return close === -1 ? -1 : close + 2;\n }\n if (ch !== undefined && [\"'\", '\"', '`'].includes(ch)) {\n return skipStringLiteral(source, i);\n }\n return i;\n}\n\nfunction skipStringLiteral(source: string, startIndex: number): number {\n const quote = source[startIndex];\n let i = startIndex + 1;\n while (i < source.length) {\n const ch = source[i];\n if (ch === '\\\\') {\n i += 2;\n continue;\n }\n if (ch === quote) return i + 1;\n i += 1;\n }\n return -1;\n}\n\n/**\n * Find the position of the closing `]` of the default-export config array.\n *\n * Recognized shapes:\n * - `export default [...]` (ESM, bare array)\n * - `export default defineConfig([...])` (ESM, wrapper)\n * - `module.exports = [...]` (CJS, bare array)\n * - `module.exports = defineConfig([...])` (CJS, wrapper)\n *\n * Returns -1 on any unrecognized shape (function-returning-config,\n * single-imported-config, unknown wrapper).\n */\nfunction findDefaultExportArrayClose(source: string): number {\n const esmResult = findArrayCloseAfter(source, 'export default', false);\n if (esmResult !== -1) return esmResult;\n return findArrayCloseAfter(source, 'module.exports', true);\n}\n\nfunction skipWhitespace(source: string, start: number): number {\n let i = start;\n while (i < source.length && /\\s/.test(source[i] ?? '')) i += 1;\n return i;\n}\n\n/**\n * Walk backward from `start` over whitespace, returning the index of the\n * last non-whitespace char. -1 if the entire prefix is whitespace.\n */\nfunction lastNonWhitespaceIndex(source: string, start: number): number {\n let i = start;\n while (i >= 0 && /\\s/.test(source[i] ?? '')) i -= 1;\n return i;\n}\n\nfunction findArrayCloseAfter(source: string, marker: string, requireEquals: boolean): number {\n const markerIndex = source.indexOf(marker);\n if (markerIndex === -1) return -1;\n let cursor = skipWhitespace(source, markerIndex + marker.length);\n if (requireEquals) {\n if (source[cursor] !== '=') return -1;\n cursor = skipWhitespace(source, cursor + 1);\n }\n if (source[cursor] === '[') return findMatchingBracket(source, cursor);\n if (source.startsWith('defineConfig', cursor)) {\n return findDefineConfigArrayClose(source, cursor);\n }\n return -1;\n}\n\nfunction findDefineConfigArrayClose(source: string, defineStart: number): number {\n const paren = skipWhitespace(source, defineStart + 'defineConfig'.length);\n if (source[paren] !== '(') return -1;\n const inner = skipWhitespace(source, paren + 1);\n if (source[inner] !== '[') return -1;\n return findMatchingBracket(source, inner);\n}\n\n/**\n * Insert the safeword import after the last existing import/require line,\n * or at the very top if there are none. Uses ESM `import` syntax for\n * `.mjs/.js/.ts/.mts/.cts`, CJS `require` syntax for `.cjs`.\n */\nfunction ensureSafewordImport(source: string, eol: string, isCjs: boolean): string {\n const importLine = isCjs ? CJS_IMPORT : ESM_IMPORT;\n if (source.includes(importLine) || source.includes(\"from 'safeword/eslint'\")) return source;\n const importLineRegex = isCjs\n ? /^(?:const|let|var)\\s.+?=\\s*require\\s*\\(.+?\\);[ \\t]*\\r?$/gm\n : /^import\\s.+?;[ \\t]*\\r?$/gm;\n let lastImportEnd = -1;\n for (const match of source.matchAll(importLineRegex)) {\n lastImportEnd = (match.index ?? 0) + match[0].length;\n }\n if (lastImportEnd === -1) {\n return importLine + eol + source;\n }\n return source.slice(0, lastImportEnd) + eol + importLine + source.slice(lastImportEnd);\n}\n\nfunction detectEol(source: string): string {\n return source.includes('\\r\\n') ? '\\r\\n' : '\\n';\n}\n\nfunction isTypeScriptConfig(configPath: string): boolean {\n return TS_EXTENSIONS.has(nodePath.extname(configPath));\n}\n\nfunction isCjsConfig(configPath: string): boolean {\n return CJS_EXTENSIONS.has(nodePath.extname(configPath));\n}\n\n/**\n * Main entry point. See module docstring for behavior contract.\n */\nexport function autoPatchEslintConfig(options: AutoPatchOptions): AutoPatchResult {\n const { configPath } = options;\n\n let source: string;\n try {\n source = readFileSync(configPath, 'utf8');\n } catch {\n return { kind: 'bailed', reason: 'read-failed' };\n }\n\n if (source.includes(VENDORED_MARKER)) {\n return { kind: 'idempotent-skip' };\n }\n\n const closeIndex = findDefaultExportArrayClose(source);\n if (closeIndex === -1) {\n return { kind: 'bailed', reason: 'unrecognized-shape' };\n }\n\n const eol = detectEol(source);\n const sourceWithImport = ensureSafewordImport(source, eol, isCjsConfig(configPath));\n // closeIndex was computed on `source`; if `ensureSafewordImport` prepended\n // content, recompute on the new text. Either way it's idempotent and cheap.\n const finalClose = findDefaultExportArrayClose(sourceWithImport);\n if (finalClose === -1) {\n // Shouldn't happen — we just verified the shape — but bail defensively.\n return { kind: 'bailed', reason: 'unrecognized-shape' };\n }\n\n // Decide whether we need a leading comma. Walk backward from the\n // closing `]`, skipping whitespace; if the last non-whitespace char is\n // `[` (empty array) or `,` (trailing-comma style) no comma is needed.\n // Otherwise the last element lacks a trailing comma and we must add\n // one before our spread.\n const probe = lastNonWhitespaceIndex(sourceWithImport, finalClose - 1);\n const charBefore = sourceWithImport[probe];\n const isNeedsLeadingComma = charBefore !== '[' && charBefore !== ',';\n\n const before = sourceWithImport.slice(0, finalClose);\n const after = sourceWithImport.slice(finalClose);\n const prefix = `${isNeedsLeadingComma ? ',' : ''}${eol} `;\n const patched = `${before}${prefix}${SPREAD}${eol}${after}`;\n\n const writeResult = writeAndValidate(configPath, patched, !isTypeScriptConfig(configPath));\n if (!writeResult.ok) return { kind: 'bailed', reason: writeResult.reason };\n return { kind: 'patched', configPath, backupPath: writeResult.backupPath };\n}\n\nfunction writeAndValidate(\n configPath: string,\n patched: string,\n runSyntaxCheck: boolean,\n):\n { ok: true; backupPath: string } | { ok: false; reason: 'write-failed' | 'syntax-check-failed' } {\n const backupPath = `${configPath}${BACKUP_SUFFIX}`;\n try {\n copyFileSync(configPath, backupPath);\n writeFileSync(configPath, patched, 'utf8');\n } catch {\n return { ok: false, reason: 'write-failed' };\n }\n if (!runSyntaxCheck) return { ok: true, backupPath };\n try {\n execSync(`node --check \"${configPath}\"`, { stdio: 'pipe' });\n return { ok: true, backupPath };\n } catch {\n // Revert so the user's config is byte-identical to its pre-command state.\n try {\n copyFileSync(backupPath, configPath);\n } catch {\n // Best-effort revert; if this fails the backup is still on disk.\n }\n return { ok: false, reason: 'syntax-check-failed' };\n }\n}\n"],"mappings":"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","names":["createHash","createHash","closeSync","fsConstants","existsSync","fstatSync","lstatSync","openSync","readdirSync","readFileSync","readSync","nodePath","nodePath","nodePath","nodePath","nodePath","readdirSync","nodePath","nodePath","readdirSync","existsSync","readdirSync","readFileSync","nodePath","nodePath","readdirSync","existsSync","readFileSync","readFileSync","nodePath","execSync","readFileSync","nodePath","nodePath","readFileSync","nodePath","nodePath","existsSync","readFileSync","createHash","lstatSync","readSync","fstatSync","openSync","fsConstants","closeSync","readdirSync","observed","createHash"]}
@@ -1,8 +0,0 @@
1
- import {
2
- isReviewKind
3
- } from "./chunk-WVDRXD67.js";
4
- import "./chunk-QTG2EXFT.js";
5
- export {
6
- isReviewKind
7
- };
8
- //# sourceMappingURL=contract-KEZY6YC3.js.map