safeword 0.82.5 → 0.82.6

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 (143) hide show
  1. package/codex-plugin/.codex-plugin/plugin.json +1 -1
  2. package/codex-plugin/package.json +1 -1
  3. package/codex-plugin/runtime/cli.js +1 -0
  4. package/codex-plugin/skills/audit/SKILL.md +5 -5
  5. package/codex-plugin/skills/bdd/references/PLAN_IMPLEMENTATION.md +2 -2
  6. package/codex-plugin/skills/bdd/references/TDD.md +1 -1
  7. package/codex-plugin/skills/explain/SKILL.md +1 -1
  8. package/codex-plugin/skills/quality-review/SKILL.md +2 -2
  9. package/codex-plugin/skills/retro-filer/SKILL.md +2 -2
  10. package/codex-plugin/skills/review-spec/SKILL.md +2 -2
  11. package/codex-plugin/skills/self-review/SKILL.md +1 -1
  12. package/dist/{architecture-IQQKQBML.js → architecture-74CLGZFF.js} +2 -2
  13. package/dist/{architecture-document-FG5EGABT.js → architecture-document-GX52PBT7.js} +2 -2
  14. package/dist/{architecture-monorepo-QFGGDRJQ.js → architecture-monorepo-VMZ7TU76.js} +2 -2
  15. package/dist/{boundary-3QXNYN2S.js → boundary-TF3DXKHK.js} +2 -2
  16. package/dist/{chunk-WXAJFT4H.js → chunk-7JA5ZVKI.js} +14 -14
  17. package/dist/{chunk-CGYJJM2Y.js → chunk-DSGDL7VJ.js} +2 -2
  18. package/dist/{chunk-XIG6POSC.js → chunk-GGFDFY5V.js} +2 -2
  19. package/dist/{chunk-7PKXJO6S.js → chunk-IE67TMML.js} +2 -2
  20. package/dist/{chunk-7PKXJO6S.js.map → chunk-IE67TMML.js.map} +1 -1
  21. package/dist/{chunk-JIUDHG7G.js → chunk-OXXG2QRJ.js} +2 -2
  22. package/dist/{chunk-SMJMHOZA.js → chunk-VS6NKQYU.js} +2 -1
  23. package/dist/chunk-VS6NKQYU.js.map +1 -0
  24. package/dist/{cleanup-Q2MDAXSN.js → cleanup-JKTGGXNM.js} +2 -2
  25. package/dist/{cleanup-command-JU5PTFWN.js → cleanup-command-GWMUVTKE.js} +2 -2
  26. package/dist/cli.js +72 -72
  27. package/dist/{clients-OBLTCQGX.js → clients-Y3OKR5QG.js} +2 -2
  28. package/dist/{codex-bootstrap-WCVUVIX7.js → codex-bootstrap-ZWWUUJ5S.js} +4 -4
  29. package/dist/{codex-hook-2C43X4RY.js → codex-hook-PSAC5SRZ.js} +4 -4
  30. package/dist/{codify-KGEHAQVB.js → codify-PV7OJ47C.js} +2 -2
  31. package/dist/{commands-UZ3Q3PXQ.js → commands-HXCBCBSS.js} +5 -5
  32. package/dist/{config-OCQMSJXA.js → config-YTFOUPKA.js} +2 -2
  33. package/dist/{configured-paths-KYPI7EFT.js → configured-paths-2FZCTKE4.js} +2 -2
  34. package/dist/{conformance-BGIYFMXR.js → conformance-DYDI3AGF.js} +2 -2
  35. package/dist/{contract-ILNHPR26.js → contract-Q2BS6JGD.js} +2 -2
  36. package/dist/{coordinator-CHYV2I7E.js → coordinator-VZ5DSXBK.js} +2 -2
  37. package/dist/{corpus-G7WSUN4M.js → corpus-W5O4S2PZ.js} +2 -2
  38. package/dist/{cursor-52K7ZN5K.js → cursor-IKWPGP6S.js} +2 -2
  39. package/dist/{doctor-HVFA6RQV.js → doctor-T6S6UDH6.js} +4 -4
  40. package/dist/{drain-retro-spool-AH7EBZPW.js → drain-retro-spool-YH5JMGRD.js} +2 -2
  41. package/dist/{feature-directories-6IXUOPFV.js → feature-directories-ISEBBWJ6.js} +2 -2
  42. package/dist/{finalization-XZBHHMPZ.js → finalization-A7LZSBUM.js} +2 -2
  43. package/dist/{gh-cli-C262ZTDO.js → gh-cli-DYO6ELW2.js} +2 -2
  44. package/dist/{github-rest-BYJT7V3S.js → github-rest-2GS5VYH6.js} +2 -2
  45. package/dist/index.js +1 -1
  46. package/dist/{job-YT7FWYKH.js → job-4L6IYX4D.js} +2 -2
  47. package/dist/{learning-sync-K3KTFDEF.js → learning-sync-RN63ZRCD.js} +2 -2
  48. package/dist/{legacy-global-guidance-WCRFEWXM.js → legacy-global-guidance-CSD4GWBG.js} +2 -2
  49. package/dist/{lint-gherkin-VKDB5ALD.js → lint-gherkin-VFZNQPDG.js} +2 -2
  50. package/dist/{namespace-root-RGHUF3UH.js → namespace-root-IS25JHXW.js} +2 -2
  51. package/dist/opencode/dispatcher.js +2 -1
  52. package/dist/{operations-WUNYQOSY.js → operations-Q7LUSP4O.js} +4 -4
  53. package/dist/{output-MVSMTFB5.js → output-DDVD5XHO.js} +2 -2
  54. package/dist/{packet-ZZEKTQON.js → packet-UHY66TN6.js} +2 -2
  55. package/dist/presets/typescript/index.js +1 -1
  56. package/dist/{profile-CILA5BW5.js → profile-KESOZZEP.js} +2 -2
  57. package/dist/{profile-FCZAUQYM.js → profile-LKUTDCMA.js} +2 -2
  58. package/dist/{prompt-C2E43BKY.js → prompt-J3ARNKUH.js} +2 -2
  59. package/dist/{public-retros-KS4XGJX2.js → public-retros-V4WZJAQ5.js} +2 -2
  60. package/dist/{remove-LHXDIUR5.js → remove-KQKAY3WH.js} +2 -2
  61. package/dist/{retro-K7OSR37K.js → retro-ZGJGO65H.js} +8 -8
  62. package/dist/{retro-draft-spool-I65XMNCE.js → retro-draft-spool-BMTG6566.js} +2 -2
  63. package/dist/{retro-drain-BHDRZZZJ.js → retro-drain-AHJSXI7W.js} +3 -3
  64. package/dist/{retro-extract-CENSZDL7.js → retro-extract-WPPLCDH4.js} +2 -2
  65. package/dist/{review-knowledge-IGRODU2Y.js → review-knowledge-FRARZIQ6.js} +2 -2
  66. package/dist/{review-pr-OVHPSCMO.js → review-pr-GA3SBUSD.js} +2 -2
  67. package/dist/{review-pr-publication-FWFSR3G6.js → review-pr-publication-3TJHOJUF.js} +2 -2
  68. package/dist/{run-TINV4HHU.js → run-ZABCQOOP.js} +2 -2
  69. package/dist/{schema-CETAGYQS.js → schema-RNA5EGPU.js} +2 -2
  70. package/dist/{self-report-QTSEVZE6.js → self-report-QTTY32AV.js} +2 -2
  71. package/dist/{status-6VE5FMMT.js → status-5VMO6UEE.js} +4 -4
  72. package/dist/{status-64RHQ4K6.js → status-LDPUHKZU.js} +2 -2
  73. package/dist/{sync-config-STCUJ242.js → sync-config-KZGEO7XX.js} +2 -2
  74. package/dist/{sync-tracker-JNVVSKVH.js → sync-tracker-ZC53CFHT.js} +2 -2
  75. package/dist/{test-execution-2IOF5REY.js → test-execution-NDZZMIU4.js} +2 -2
  76. package/dist/{test-plan-OUXD3MNK.js → test-plan-JUHCSUWE.js} +2 -2
  77. package/dist/{ticket-new-2BLVPXWW.js → ticket-new-IAS5YKRV.js} +2 -2
  78. package/dist/{ticket-sync-KARIVGBD.js → ticket-sync-HEJIRCVK.js} +2 -2
  79. package/dist/{tracker-map-Q46M7HKV.js → tracker-map-4JVH2RAF.js} +2 -2
  80. package/dist/{tracker-sync-AHVN4MW3.js → tracker-sync-XHXRQUB6.js} +2 -2
  81. package/package.json +1 -1
  82. package/dist/chunk-SMJMHOZA.js.map +0 -1
  83. /package/dist/{architecture-IQQKQBML.js.map → architecture-74CLGZFF.js.map} +0 -0
  84. /package/dist/{architecture-document-FG5EGABT.js.map → architecture-document-GX52PBT7.js.map} +0 -0
  85. /package/dist/{architecture-monorepo-QFGGDRJQ.js.map → architecture-monorepo-VMZ7TU76.js.map} +0 -0
  86. /package/dist/{boundary-3QXNYN2S.js.map → boundary-TF3DXKHK.js.map} +0 -0
  87. /package/dist/{chunk-WXAJFT4H.js.map → chunk-7JA5ZVKI.js.map} +0 -0
  88. /package/dist/{chunk-CGYJJM2Y.js.map → chunk-DSGDL7VJ.js.map} +0 -0
  89. /package/dist/{chunk-XIG6POSC.js.map → chunk-GGFDFY5V.js.map} +0 -0
  90. /package/dist/{chunk-JIUDHG7G.js.map → chunk-OXXG2QRJ.js.map} +0 -0
  91. /package/dist/{cleanup-Q2MDAXSN.js.map → cleanup-JKTGGXNM.js.map} +0 -0
  92. /package/dist/{cleanup-command-JU5PTFWN.js.map → cleanup-command-GWMUVTKE.js.map} +0 -0
  93. /package/dist/{clients-OBLTCQGX.js.map → clients-Y3OKR5QG.js.map} +0 -0
  94. /package/dist/{codex-bootstrap-WCVUVIX7.js.map → codex-bootstrap-ZWWUUJ5S.js.map} +0 -0
  95. /package/dist/{codex-hook-2C43X4RY.js.map → codex-hook-PSAC5SRZ.js.map} +0 -0
  96. /package/dist/{codify-KGEHAQVB.js.map → codify-PV7OJ47C.js.map} +0 -0
  97. /package/dist/{commands-UZ3Q3PXQ.js.map → commands-HXCBCBSS.js.map} +0 -0
  98. /package/dist/{config-OCQMSJXA.js.map → config-YTFOUPKA.js.map} +0 -0
  99. /package/dist/{configured-paths-KYPI7EFT.js.map → configured-paths-2FZCTKE4.js.map} +0 -0
  100. /package/dist/{conformance-BGIYFMXR.js.map → conformance-DYDI3AGF.js.map} +0 -0
  101. /package/dist/{contract-ILNHPR26.js.map → contract-Q2BS6JGD.js.map} +0 -0
  102. /package/dist/{coordinator-CHYV2I7E.js.map → coordinator-VZ5DSXBK.js.map} +0 -0
  103. /package/dist/{corpus-G7WSUN4M.js.map → corpus-W5O4S2PZ.js.map} +0 -0
  104. /package/dist/{cursor-52K7ZN5K.js.map → cursor-IKWPGP6S.js.map} +0 -0
  105. /package/dist/{doctor-HVFA6RQV.js.map → doctor-T6S6UDH6.js.map} +0 -0
  106. /package/dist/{drain-retro-spool-AH7EBZPW.js.map → drain-retro-spool-YH5JMGRD.js.map} +0 -0
  107. /package/dist/{feature-directories-6IXUOPFV.js.map → feature-directories-ISEBBWJ6.js.map} +0 -0
  108. /package/dist/{finalization-XZBHHMPZ.js.map → finalization-A7LZSBUM.js.map} +0 -0
  109. /package/dist/{gh-cli-C262ZTDO.js.map → gh-cli-DYO6ELW2.js.map} +0 -0
  110. /package/dist/{github-rest-BYJT7V3S.js.map → github-rest-2GS5VYH6.js.map} +0 -0
  111. /package/dist/{job-YT7FWYKH.js.map → job-4L6IYX4D.js.map} +0 -0
  112. /package/dist/{learning-sync-K3KTFDEF.js.map → learning-sync-RN63ZRCD.js.map} +0 -0
  113. /package/dist/{legacy-global-guidance-WCRFEWXM.js.map → legacy-global-guidance-CSD4GWBG.js.map} +0 -0
  114. /package/dist/{lint-gherkin-VKDB5ALD.js.map → lint-gherkin-VFZNQPDG.js.map} +0 -0
  115. /package/dist/{namespace-root-RGHUF3UH.js.map → namespace-root-IS25JHXW.js.map} +0 -0
  116. /package/dist/{operations-WUNYQOSY.js.map → operations-Q7LUSP4O.js.map} +0 -0
  117. /package/dist/{output-MVSMTFB5.js.map → output-DDVD5XHO.js.map} +0 -0
  118. /package/dist/{packet-ZZEKTQON.js.map → packet-UHY66TN6.js.map} +0 -0
  119. /package/dist/{profile-CILA5BW5.js.map → profile-KESOZZEP.js.map} +0 -0
  120. /package/dist/{profile-FCZAUQYM.js.map → profile-LKUTDCMA.js.map} +0 -0
  121. /package/dist/{prompt-C2E43BKY.js.map → prompt-J3ARNKUH.js.map} +0 -0
  122. /package/dist/{public-retros-KS4XGJX2.js.map → public-retros-V4WZJAQ5.js.map} +0 -0
  123. /package/dist/{remove-LHXDIUR5.js.map → remove-KQKAY3WH.js.map} +0 -0
  124. /package/dist/{retro-K7OSR37K.js.map → retro-ZGJGO65H.js.map} +0 -0
  125. /package/dist/{retro-draft-spool-I65XMNCE.js.map → retro-draft-spool-BMTG6566.js.map} +0 -0
  126. /package/dist/{retro-drain-BHDRZZZJ.js.map → retro-drain-AHJSXI7W.js.map} +0 -0
  127. /package/dist/{retro-extract-CENSZDL7.js.map → retro-extract-WPPLCDH4.js.map} +0 -0
  128. /package/dist/{review-knowledge-IGRODU2Y.js.map → review-knowledge-FRARZIQ6.js.map} +0 -0
  129. /package/dist/{review-pr-OVHPSCMO.js.map → review-pr-GA3SBUSD.js.map} +0 -0
  130. /package/dist/{review-pr-publication-FWFSR3G6.js.map → review-pr-publication-3TJHOJUF.js.map} +0 -0
  131. /package/dist/{run-TINV4HHU.js.map → run-ZABCQOOP.js.map} +0 -0
  132. /package/dist/{schema-CETAGYQS.js.map → schema-RNA5EGPU.js.map} +0 -0
  133. /package/dist/{self-report-QTSEVZE6.js.map → self-report-QTTY32AV.js.map} +0 -0
  134. /package/dist/{status-64RHQ4K6.js.map → status-5VMO6UEE.js.map} +0 -0
  135. /package/dist/{status-6VE5FMMT.js.map → status-LDPUHKZU.js.map} +0 -0
  136. /package/dist/{sync-config-STCUJ242.js.map → sync-config-KZGEO7XX.js.map} +0 -0
  137. /package/dist/{sync-tracker-JNVVSKVH.js.map → sync-tracker-ZC53CFHT.js.map} +0 -0
  138. /package/dist/{test-execution-2IOF5REY.js.map → test-execution-NDZZMIU4.js.map} +0 -0
  139. /package/dist/{test-plan-OUXD3MNK.js.map → test-plan-JUHCSUWE.js.map} +0 -0
  140. /package/dist/{ticket-new-2BLVPXWW.js.map → ticket-new-IAS5YKRV.js.map} +0 -0
  141. /package/dist/{ticket-sync-KARIVGBD.js.map → ticket-sync-HEJIRCVK.js.map} +0 -0
  142. /package/dist/{tracker-map-Q46M7HKV.js.map → tracker-map-4JVH2RAF.js.map} +0 -0
  143. /package/dist/{tracker-sync-AHVN4MW3.js.map → tracker-sync-XHXRQUB6.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "safeword",
3
- "version": "0.82.5",
3
+ "version": "0.82.6",
4
4
  "description": "Safeword workflow guidance and gates for Codex.",
5
5
  "author": {
6
6
  "name": "Arcade AI"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "safeword-codex-plugin",
3
- "version": "0.82.5",
3
+ "version": "0.82.6",
4
4
  "type": "module"
5
5
  }
@@ -36282,6 +36282,7 @@ function codexActivationMarkerIssue(environment = process.env) {
36282
36282
  }
36283
36283
  function packagedHookManifestPath() {
36284
36284
  const candidates = [
36285
+ nodePath56.resolve(import.meta.dirname, "../hooks.json"),
36285
36286
  nodePath56.resolve(import.meta.dirname, "../codex-plugin/hooks.json"),
36286
36287
  nodePath56.resolve(import.meta.dirname, "../../codex-plugin/hooks.json")
36287
36288
  ];
@@ -561,7 +561,7 @@ Changed project learnings in the resolved namespace root's `learnings/*.md` must
561
561
  PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2> /dev/null || pwd)}"
562
562
  source "$PROJECT_DIR/.safeword/hooks/lib/audit-scope.sh"
563
563
  audit_scope_initialize "$PROJECT_DIR" || exit $?
564
- NS_ROOT="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR")"
564
+ NS_ROOT="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR")"
565
565
 
566
566
  learning_is_in_audit_scope() {
567
567
  [ "$AUDIT_SCOPE_MODE" = "repository" ] && return 0
@@ -721,13 +721,13 @@ audit_scope_initialize "$PROJECT_DIR" || exit $?
721
721
 
722
722
  # Resolve the namespace root (honors config paths.projectRoot in real runs).
723
723
  # Fall back on directory existence — robust when the resolver hook is absent.
724
- NS_ROOT="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" 2> /dev/null)"
724
+ NS_ROOT="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" 2> /dev/null)"
725
725
  [ -d "$NS_ROOT" ] || {
726
726
  if [ -d "$PROJECT_DIR/.project" ]; then NS_ROOT="$PROJECT_DIR/.project"; else NS_ROOT="$PROJECT_DIR/.safeword-project"; fi
727
727
  }
728
- PERSONAS_FILE="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" --key personas 2> /dev/null)"
729
- SURFACES_FILE="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" --key surfaces 2> /dev/null)"
730
- GLOSSARY_FILE="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" --key glossary 2> /dev/null)"
728
+ PERSONAS_FILE="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" --key personas 2> /dev/null)"
729
+ SURFACES_FILE="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" --key surfaces 2> /dev/null)"
730
+ GLOSSARY_FILE="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR" --key glossary 2> /dev/null)"
731
731
  [ -n "$PERSONAS_FILE" ] || PERSONAS_FILE="$NS_ROOT/personas.md"
732
732
  [ -n "$SURFACES_FILE" ] || SURFACES_FILE="$NS_ROOT/surfaces.md"
733
733
  [ -n "$GLOSSARY_FILE" ] || GLOSSARY_FILE="$NS_ROOT/glossary.md"
@@ -159,10 +159,10 @@ findings remain. Return findings through the typed reviewer result contract.
159
159
 
160
160
  ## Exit: review, then (optionally) the user
161
161
 
162
- 1. **Independent review first.** At review time, run `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project review-knowledge --json`. Resolve a review-capable Safeword CLI, then invoke the coordinator with the current files identified by the resolver:
162
+ 1. **Independent review first.** At review time, run `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project review-knowledge --json`. Resolve a review-capable Safeword CLI, then invoke the coordinator with the current files identified by the resolver:
163
163
 
164
164
  ```bash
165
- SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" review run plan-implementation --agent-handoff --json --context spec.md ticket.md feature-file principles-file personas-file surfaces-file architecture-records -- impl-plan.md
165
+ SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" review run plan-implementation --agent-handoff --json --context spec.md ticket.md feature-file principles-file personas-file surfaces-file architecture-records -- impl-plan.md
166
166
  ```
167
167
 
168
168
  The shared coordinator sends that bounded packet to the opposite headless agent when available; its typed verdict, failure classification, and independence level are authoritative. `impl-plan.md` is the work under review; all resolved feature and project artifacts are bounded context. Only when that typed result is `REVIEW_ROUTES_EXHAUSTED`, invoke `$safeword:finish-review` immediately with the original result and the same accepted targets; return every other result unchanged and do not substitute another private subagent. Fix findings, re-resolve the sources, re-review, then stamp the exit with the returned agent provenance (`write-review-stamp.ts --author-agent "author-agent" --reviewer-agent "actual-reviewer" --independence "independence" --phase plan-implementation`, where the review gate is enabled). Add `--model` only when the executed reviewer reports a verifiable model identifier; the coordinator never invents one. Human handoff happens **only after** this review passes — raw planning output is never presented for approval. Exception, any time: information only the user has (intent, priorities, constraints not in code or docs) routes to the user the moment the gap appears — `$safeword:elicit`.
@@ -196,7 +196,7 @@ Off by default. When `.safeword/config.json` sets `architectureReviewGate: true`
196
196
  2. **A fresh-context review.** Resolve a review-capable Safeword CLI, then run the shared coordinator with only the bounded design evidence:
197
197
 
198
198
  ```bash
199
- SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" review run plan-implementation impl-plan.md ticket-spec feature-file --agent-handoff --json
199
+ SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" review run plan-implementation impl-plan.md ticket-spec feature-file --agent-handoff --json
200
200
  ```
201
201
 
202
202
  The shared coordinator prefers the opposite headless agent. Only when its typed result is `REVIEW_ROUTES_EXHAUSTED`, invoke `$safeword:finish-review` with the original result and the same accepted targets; return every other result unchanged. Degraded findings cannot satisfy a required independent-review gate. On an independent pass, stamp it:
@@ -39,7 +39,7 @@ Gather the durable trail safeword already keeps, then narrate it. Run:
39
39
 
40
40
  ```bash
41
41
  PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2> /dev/null || pwd)}"
42
- NS_ROOT="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR")"
42
+ NS_ROOT="$(bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project namespace-root --cwd "$PROJECT_DIR")"
43
43
  # What you're on now: the last re-entry line names the current ticket + Next
44
44
  tail -3 "$NS_ROOT/re-entry.md" 2> /dev/null
45
45
  # Fallback when re-entry is empty: in_progress tickets (not epics)
@@ -50,7 +50,7 @@ If in a BDD workflow, read the current ticket from `<namespace-root>/tickets/` a
50
50
 
51
51
  ### Project-principle challenge
52
52
 
53
- For a BDD ticket, run `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project review-knowledge --json` at the
53
+ For a BDD ticket, run `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project review-knowledge --json` at the
54
54
  start of each pass and read the current `principles`, `personas`, and `surfaces`
55
55
  paths and content it returns (including overrides such as `paths.principles`).
56
56
  Do not substitute labels or intake-era content.
@@ -212,7 +212,7 @@ Each pass:
212
212
  guarantee a bare `safeword` on `PATH`:
213
213
 
214
214
  ```bash
215
- SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" review run quality-review [--context path/to/evidence] --agent-handoff --json -- changed-file [more-changed-files...]
215
+ SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" review run quality-review [--context path/to/evidence] --agent-handoff --json -- changed-file [more-changed-files...]
216
216
  ```
217
217
 
218
218
  A healthy deep review may return `REVIEW_PENDING` after its foreground
@@ -17,7 +17,7 @@ a caller-nominated path. The spool contains sanitized safeword findings for
17
17
  ## Procedure
18
18
 
19
19
  1. Before reading or making any tracker call, run
20
- `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project retro-drain "<spool-path>" --validated-jsonl`.
20
+ `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project retro-drain "<spool-path>" --validated-jsonl`.
21
21
  Use only its JSONL stdout as the filing input. A nonzero exit means validation
22
22
  failed: make no search, comment, or create call, leave the spool unchanged,
23
23
  and report `retro-filer: cannot file - draft validation failed`. If its output
@@ -60,7 +60,7 @@ a caller-nominated path. The spool contains sanitized safeword findings for
60
60
  the draft only when the append succeeded and the exact ack is visible. If the
61
61
  append or verification fails, leave the draft in place.
62
62
  5. Create at most five new issues per run. Drain only by running
63
- `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project retro-drain "<spool-path>"`; never rewrite or
63
+ `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project retro-drain "<spool-path>"`; never rewrite or
64
64
  delete the spool directly. The helper removes only drafts whose valid ack is
65
65
  reader-visible, so unfiled or unacknowledged drafts remain. If tracker write
66
66
  access is unavailable, leave the spool unchanged and report
@@ -35,7 +35,7 @@ Adversarially review a ticket's scenarios: treat them as if you're trying to bre
35
35
  - **Manual re-run** — invoke `$safeword:review-spec` anytime after `define-behavior` (e.g., scenarios changed during implement and you want to re-validate). Allowed on a closed ticket too — a post-hoc audit is still readable.
36
36
 
37
37
  Read the active ticket's `.feature` source first. At review time, run
38
- `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project review-knowledge --json` and read the current
38
+ `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project review-knowledge --json` and read the current
39
39
  `principles`, `personas`, and `surfaces` source paths and content it returns, so
40
40
  the review is grounded in project knowledge rather than labels or stale intake
41
41
  context. The resolver honors `paths.principles`, `paths.personas`, and
@@ -58,7 +58,7 @@ Resolve a review-capable Safeword CLI first; source checkouts do not guarantee
58
58
  a bare `safeword` on `PATH`:
59
59
 
60
60
  ```bash
61
- SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" review run scenario-gate feature-file [legacy-test-definitions] --context ticket-spec [dimensions-file] principles-file personas-file surfaces-file --agent-handoff --json
61
+ SAFEWORD_REVIEW_PROGRESS=1 bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" review run scenario-gate feature-file [legacy-test-definitions] --context ticket-spec [dimensions-file] principles-file personas-file surfaces-file --agent-handoff --json
62
62
  ```
63
63
 
64
64
  The coordinator's assigned/actual reviewer, failure classification, and
@@ -45,7 +45,7 @@ installed helper — report it to the user and resolve before retrying.
45
45
  ## Review the spec (do this now, with the stamp written)
46
46
 
47
47
  The stamp records that a review was invoked; the actual scrutiny is yours. At
48
- review time, run `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.5/runtime/cli.js" project review-knowledge --json` and use its
48
+ review time, run `bun "${CODEX_HOME:-$HOME/.codex}/plugins/cache/safeword/safeword/0.82.6/runtime/cli.js" project review-knowledge --json` and use its
49
49
  current `principles`, `personas`, and `surfaces` source paths and content—not
50
50
  labels remembered from intake. These resolve from `paths.principles`,
51
51
  `paths.personas`, and `paths.surfaces` when configured. Read those sources with the active ticket's
@@ -25,7 +25,7 @@ import {
25
25
  readJson,
26
26
  writeJson
27
27
  } from "./chunk-HF3DXZEA.js";
28
- import "./chunk-7PKXJO6S.js";
28
+ import "./chunk-IE67TMML.js";
29
29
 
30
30
  // src/commands/architecture.ts
31
31
  import { execFileSync } from "child_process";
@@ -650,4 +650,4 @@ export {
650
650
  architectureStage,
651
651
  architectureStaged
652
652
  };
653
- //# sourceMappingURL=architecture-IQQKQBML.js.map
653
+ //# sourceMappingURL=architecture-74CLGZFF.js.map
@@ -11,7 +11,7 @@ import {
11
11
  import "./chunk-NEOV7ZY3.js";
12
12
  import "./chunk-VZ5B2SIO.js";
13
13
  import "./chunk-HF3DXZEA.js";
14
- import "./chunk-7PKXJO6S.js";
14
+ import "./chunk-IE67TMML.js";
15
15
  export {
16
16
  isSafewordOwned,
17
17
  isWouldChangeAction,
@@ -22,4 +22,4 @@ export {
22
22
  selfHealProject,
23
23
  selfHealProjectPreservingProse
24
24
  };
25
- //# sourceMappingURL=architecture-document-FG5EGABT.js.map
25
+ //# sourceMappingURL=architecture-document-GX52PBT7.js.map
@@ -5,11 +5,11 @@ import {
5
5
  monorepoFingerprintOf
6
6
  } from "./chunk-VZ5B2SIO.js";
7
7
  import "./chunk-HF3DXZEA.js";
8
- import "./chunk-7PKXJO6S.js";
8
+ import "./chunk-IE67TMML.js";
9
9
  export {
10
10
  discoverUnreadableWorkspaces,
11
11
  discoverWorkspaces,
12
12
  extractMonorepoArchitectureSnapshot,
13
13
  monorepoFingerprintOf
14
14
  };
15
- //# sourceMappingURL=architecture-monorepo-QFGGDRJQ.js.map
15
+ //# sourceMappingURL=architecture-monorepo-VMZ7TU76.js.map
@@ -26,7 +26,7 @@ import {
26
26
  import {
27
27
  readFileSafe
28
28
  } from "./chunk-HF3DXZEA.js";
29
- import "./chunk-7PKXJO6S.js";
29
+ import "./chunk-IE67TMML.js";
30
30
 
31
31
  // src/commands/boundary.ts
32
32
  import { execFileSync as execFileSync2 } from "child_process";
@@ -650,4 +650,4 @@ function boundary(options) {
650
650
  export {
651
651
  boundary
652
652
  };
653
- //# sourceMappingURL=boundary-3QXNYN2S.js.map
653
+ //# sourceMappingURL=boundary-TF3DXKHK.js.map
@@ -1163,7 +1163,7 @@ var claude = defineIntegrationAdapter({
1163
1163
  profile: {
1164
1164
  available: true,
1165
1165
  async observePrecondition(context) {
1166
- const { claudeInstallRequiresMutation, observeClaudeProfile } = await import("./profile-CILA5BW5.js");
1166
+ const { claudeInstallRequiresMutation, observeClaudeProfile } = await import("./profile-KESOZZEP.js");
1167
1167
  return {
1168
1168
  ...observeClaudeProfile(context.cwd, context.scope),
1169
1169
  ...context.operation === "install" && {
@@ -1174,16 +1174,16 @@ var claude = defineIntegrationAdapter({
1174
1174
  },
1175
1175
  capabilities: FULL_HOOK_CAPABILITIES,
1176
1176
  async observe(context) {
1177
- const { observeClaudeStatus } = await import("./status-64RHQ4K6.js");
1177
+ const { observeClaudeStatus } = await import("./status-LDPUHKZU.js");
1178
1178
  return observeClaudeStatus(context.cwd);
1179
1179
  },
1180
1180
  async install(context) {
1181
1181
  if (context.ports?.installClaude !== void 0) return context.ports.installClaude();
1182
- const { installClaudePlugin } = await import("./profile-CILA5BW5.js");
1182
+ const { installClaudePlugin } = await import("./profile-KESOZZEP.js");
1183
1183
  return installClaudePlugin(context.cwd, context.scope);
1184
1184
  },
1185
1185
  async uninstall(context) {
1186
- const { uninstallClaudePlugin } = await import("./profile-CILA5BW5.js");
1186
+ const { uninstallClaudePlugin } = await import("./profile-KESOZZEP.js");
1187
1187
  return uninstallClaudePlugin(context.cwd, context.scope);
1188
1188
  },
1189
1189
  effects(context) {
@@ -1197,7 +1197,7 @@ var codex = defineIntegrationAdapter({
1197
1197
  profile: {
1198
1198
  available: true,
1199
1199
  async observePrecondition(context) {
1200
- const { codexInstallRequiresMutation, observeCodexMigrationResult } = await import("./operations-WUNYQOSY.js");
1200
+ const { codexInstallRequiresMutation, observeCodexMigrationResult } = await import("./operations-Q7LUSP4O.js");
1201
1201
  const observation = observeCodexMigrationResult(context.cwd);
1202
1202
  return {
1203
1203
  ...observation,
@@ -1209,7 +1209,7 @@ var codex = defineIntegrationAdapter({
1209
1209
  },
1210
1210
  capabilities: FULL_HOOK_CAPABILITIES,
1211
1211
  async observe(context) {
1212
- const { observeCodexMigration } = await import("./operations-WUNYQOSY.js");
1212
+ const { observeCodexMigration } = await import("./operations-Q7LUSP4O.js");
1213
1213
  return observeCodexMigration(context.cwd, context.environment);
1214
1214
  },
1215
1215
  async install(context) {
@@ -1233,7 +1233,7 @@ var codex = defineIntegrationAdapter({
1233
1233
  return context.ports.installCodex();
1234
1234
  },
1235
1235
  async uninstall() {
1236
- const { uninstallCodexPlugin } = await import("./operations-WUNYQOSY.js");
1236
+ const { uninstallCodexPlugin } = await import("./operations-Q7LUSP4O.js");
1237
1237
  return uninstallCodexPlugin();
1238
1238
  },
1239
1239
  effects(context) {
@@ -1241,7 +1241,7 @@ var codex = defineIntegrationAdapter({
1241
1241
  }
1242
1242
  });
1243
1243
  async function resolveOpenCodeRoot(context) {
1244
- const { resolveOpenCodeConfigRoot } = await import("./profile-FCZAUQYM.js");
1244
+ const { resolveOpenCodeConfigRoot } = await import("./profile-LKUTDCMA.js");
1245
1245
  return resolveOpenCodeConfigRoot({
1246
1246
  platform: process.platform === "win32" ? "windows" : "unix",
1247
1247
  env: context.environment ?? process.env
@@ -1273,8 +1273,8 @@ async function observeOpenCode(context) {
1273
1273
  return openCodeConfigRootRequired();
1274
1274
  }
1275
1275
  const [{ observeOpenCodeProfile }, { observeOpenCodeVersion }] = await Promise.all([
1276
- import("./profile-FCZAUQYM.js"),
1277
- import("./conformance-BGIYFMXR.js")
1276
+ import("./profile-LKUTDCMA.js"),
1277
+ import("./conformance-DYDI3AGF.js")
1278
1278
  ]);
1279
1279
  return observeOpenCodeProfile(root, {
1280
1280
  projectDirectory: context.cwd,
@@ -1333,13 +1333,13 @@ var opencode = defineIntegrationAdapter({
1333
1333
  async install(context) {
1334
1334
  const root = await resolveOpenCodeRoot(context);
1335
1335
  if (root === void 0) return openCodeConfigRootRequired();
1336
- const { installOpenCodeProfile } = await import("./profile-FCZAUQYM.js");
1336
+ const { installOpenCodeProfile } = await import("./profile-LKUTDCMA.js");
1337
1337
  return installOpenCodeProfile(root);
1338
1338
  },
1339
1339
  async uninstall(context) {
1340
1340
  const root = await resolveOpenCodeRoot(context);
1341
1341
  if (root === void 0) return openCodeConfigRootRequired();
1342
- const { uninstallOpenCodeProfile } = await import("./profile-FCZAUQYM.js");
1342
+ const { uninstallOpenCodeProfile } = await import("./profile-LKUTDCMA.js");
1343
1343
  return uninstallOpenCodeProfile(root);
1344
1344
  },
1345
1345
  effects(context) {
@@ -1364,7 +1364,7 @@ var cursor = defineIntegrationAdapter({
1364
1364
  conformance: { availability: "unavailable" }
1365
1365
  },
1366
1366
  async observe(context) {
1367
- const [{ hasCursorProjectAssets, observeCursorProject }, { projectLifecycleSchema }] = await Promise.all([import("./cursor-52K7ZN5K.js"), import("./schema-CETAGYQS.js")]);
1367
+ const [{ hasCursorProjectAssets, observeCursorProject }, { projectLifecycleSchema }] = await Promise.all([import("./cursor-IKWPGP6S.js"), import("./schema-RNA5EGPU.js")]);
1368
1368
  const schema = projectLifecycleSchema(context.cwd, context.agents);
1369
1369
  const result = observeCursorProject(context.cwd, schema);
1370
1370
  if (context.operation !== "uninstall") return result;
@@ -1392,4 +1392,4 @@ export {
1392
1392
  coordinateSelectedIntegrations,
1393
1393
  PRODUCTION_INTEGRATIONS
1394
1394
  };
1395
- //# sourceMappingURL=chunk-WXAJFT4H.js.map
1395
+ //# sourceMappingURL=chunk-7JA5ZVKI.js.map
@@ -5,7 +5,7 @@ import {
5
5
  CODEX_PLUGIN_HOOK_EVENTS,
6
6
  legacyCodexEventIsViable,
7
7
  recordCodexHookProof
8
- } from "./chunk-SMJMHOZA.js";
8
+ } from "./chunk-VS6NKQYU.js";
9
9
  import {
10
10
  SAFEWORD_SCHEMA,
11
11
  generateOwnedPathsModule
@@ -606,4 +606,4 @@ export {
606
606
  packagedNamespaceRootLabel,
607
607
  codexHook
608
608
  };
609
- //# sourceMappingURL=chunk-CGYJJM2Y.js.map
609
+ //# sourceMappingURL=chunk-DSGDL7VJ.js.map
@@ -41,7 +41,7 @@ import {
41
41
  legacyCommandIdentity,
42
42
  observeCodexHookProof,
43
43
  writeCodexActivationMarker
44
- } from "./chunk-SMJMHOZA.js";
44
+ } from "./chunk-VS6NKQYU.js";
45
45
  import {
46
46
  writeDurableFile
47
47
  } from "./chunk-QOLHGAD5.js";
@@ -1195,4 +1195,4 @@ export {
1195
1195
  migrateCodexPlugin,
1196
1196
  recoverCodexMigration
1197
1197
  };
1198
- //# sourceMappingURL=chunk-XIG6POSC.js.map
1198
+ //# sourceMappingURL=chunk-GGFDFY5V.js.map
@@ -1,7 +1,7 @@
1
1
  // <define:__SAFEWORD_RELAY_BUILD_ATTESTATION__>
2
- var define_SAFEWORD_RELAY_BUILD_ATTESTATION_default = { ancestorPairs: [], artifacts: {}, buildCommit: "1d1037472a421c19b08f1a789c3f8a5e24bbad3e", enabled: false, manifestBase64: "ewogICJlbmFibGVkIjogZmFsc2UsCiAgInZlcnNpb24iOiAxCn0K", manifestSha256: "946401206ee213e84b672a7f2a400cfa7da911c2f5d6da1c051e63940ed27262" };
2
+ var define_SAFEWORD_RELAY_BUILD_ATTESTATION_default = { ancestorPairs: [], artifacts: {}, buildCommit: "c0c47040882634a489771c98d4f6ea3fea1def5b", enabled: false, manifestBase64: "ewogICJlbmFibGVkIjogZmFsc2UsCiAgInZlcnNpb24iOiAxCn0K", manifestSha256: "946401206ee213e84b672a7f2a400cfa7da911c2f5d6da1c051e63940ed27262" };
3
3
 
4
4
  export {
5
5
  define_SAFEWORD_RELAY_BUILD_ATTESTATION_default
6
6
  };
7
- //# sourceMappingURL=chunk-7PKXJO6S.js.map
7
+ //# sourceMappingURL=chunk-IE67TMML.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["<define:__SAFEWORD_RELAY_BUILD_ATTESTATION__>"],"sourcesContent":["{\"ancestorPairs\":[],\"artifacts\":{},\"buildCommit\":\"1d1037472a421c19b08f1a789c3f8a5e24bbad3e\",\"enabled\":false,\"manifestBase64\":\"ewogICJlbmFibGVkIjogZmFsc2UsCiAgInZlcnNpb24iOiAxCn0K\",\"manifestSha256\":\"946401206ee213e84b672a7f2a400cfa7da911c2f5d6da1c051e63940ed27262\"}"],"mappings":";AAAA,wDAAC,eAAgB,CAAC,GAAE,WAAY,CAAC,GAAE,aAAc,4CAA2C,SAAU,OAAM,gBAAiB,wDAAuD,gBAAiB,mEAAkE;","names":[]}
1
+ {"version":3,"sources":["<define:__SAFEWORD_RELAY_BUILD_ATTESTATION__>"],"sourcesContent":["{\"ancestorPairs\":[],\"artifacts\":{},\"buildCommit\":\"c0c47040882634a489771c98d4f6ea3fea1def5b\",\"enabled\":false,\"manifestBase64\":\"ewogICJlbmFibGVkIjogZmFsc2UsCiAgInZlcnNpb24iOiAxCn0K\",\"manifestSha256\":\"946401206ee213e84b672a7f2a400cfa7da911c2f5d6da1c051e63940ed27262\"}"],"mappings":";AAAA,wDAAC,eAAgB,CAAC,GAAE,WAAY,CAAC,GAAE,aAAc,4CAA2C,SAAU,OAAM,gBAAiB,wDAAuD,gBAAiB,mEAAkE;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  PRODUCTION_INTEGRATIONS,
3
3
  checkHealth,
4
4
  coordinateSelectedIntegrations
5
- } from "./chunk-WXAJFT4H.js";
5
+ } from "./chunk-7JA5ZVKI.js";
6
6
  import {
7
7
  compareVersions,
8
8
  isSafePackageVersion
@@ -266,4 +266,4 @@ export {
266
266
  summarizeLifecycleStatus,
267
267
  observeLifecycleStatus
268
268
  };
269
- //# sourceMappingURL=chunk-JIUDHG7G.js.map
269
+ //# sourceMappingURL=chunk-OXXG2QRJ.js.map
@@ -331,6 +331,7 @@ function codexActivationMarkerIssue(environment = process.env) {
331
331
  }
332
332
  function packagedHookManifestPath() {
333
333
  const candidates = [
334
+ nodePath2.resolve(import.meta.dirname, "../hooks.json"),
334
335
  nodePath2.resolve(import.meta.dirname, "../codex-plugin/hooks.json"),
335
336
  nodePath2.resolve(import.meta.dirname, "../../codex-plugin/hooks.json")
336
337
  ];
@@ -797,4 +798,4 @@ export {
797
798
  observeCodexSessionProof,
798
799
  observeCodexHookProof
799
800
  };
800
- //# sourceMappingURL=chunk-SMJMHOZA.js.map
801
+ //# sourceMappingURL=chunk-VS6NKQYU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/codex-plugin/legacy-authority.ts","../src/codex-plugin/legacy-command.ts","../src/codex-plugin/profile-proof.ts","../src/codex-plugin/host-process.ts"],"sourcesContent":["import { accessSync, constants, lstatSync, readFileSync } from 'node:fs';\nimport nodePath from 'node:path';\n\nimport { parse } from 'smol-toml';\n\nimport { SAFEWORD_SCHEMA } from '../schema.js';\nimport { CODEX_MIGRATION_SCHEMA } from './inventory.js';\nimport { legacyCommandIdentity } from './legacy-command.js';\n\ntype LegacyHook = { command?: unknown; type?: unknown };\ntype LegacyHookGroup = { hooks?: unknown };\ntype LegacyConfig = { hooks?: unknown };\n\nfunction regularFile(path: string): boolean {\n try {\n return lstatSync(path).isFile();\n } catch {\n return false;\n }\n}\n\nfunction eventCommands(config: LegacyConfig, eventName: string): string[] {\n if (typeof config.hooks !== 'object' || config.hooks === null) return [];\n const groups = (config.hooks as Record<string, unknown>)[eventName];\n if (!Array.isArray(groups)) return [];\n\n return groups.flatMap(group => {\n const hooks = (group as LegacyHookGroup).hooks;\n if (!Array.isArray(hooks)) return [];\n return hooks.flatMap(hook => {\n const candidate = hook as LegacyHook;\n return candidate.type === 'command' && typeof candidate.command === 'string'\n ? [candidate.command]\n : [];\n });\n });\n}\n\nfunction packageRunnerIsAvailable(cwd: string, environment: NodeJS.ProcessEnv): boolean {\n const runner = SAFEWORD_SCHEMA.codexMigration.packageRunner;\n const pathEntries = (environment.PATH ?? '').split(nodePath.delimiter).filter(Boolean);\n const extensions =\n process.platform === 'win32' ? (environment.PATHEXT ?? '.COM;.EXE;.BAT;.CMD').split(';') : [''];\n return pathEntries.some(entry =>\n extensions.some(extension => {\n const candidate = nodePath.resolve(cwd, entry, `${runner}${extension.toLowerCase()}`);\n try {\n accessSync(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK);\n return regularFile(candidate);\n } catch {\n return false;\n }\n }),\n );\n}\n\nfunction commandIsViable(\n command: string,\n event: string,\n cwd: string,\n environment: NodeJS.ProcessEnv,\n): boolean {\n const identity = legacyCommandIdentity(command);\n if (identity?.event !== event) return false;\n if (identity.kind === 'package') {\n return (\n regularFile(nodePath.join(cwd, SAFEWORD_SCHEMA.codexMigration.projectMarker)) &&\n packageRunnerIsAvailable(cwd, environment)\n );\n }\n return (\n identity.kind === 'script' &&\n regularFile(nodePath.join(cwd, CODEX_MIGRATION_SCHEMA.paths.hookRuntimeRoot, identity.script))\n );\n}\n\nexport function legacyCodexEventIsViable(\n cwd: string,\n event: string,\n environment: NodeJS.ProcessEnv = process.env,\n): boolean {\n const eventName = SAFEWORD_SCHEMA.codexMigration.hookEventNames[event];\n if (eventName === undefined) return false;\n\n const configPath = nodePath.join(cwd, CODEX_MIGRATION_SCHEMA.paths.config);\n if (!regularFile(configPath)) return false;\n\n let config: LegacyConfig;\n try {\n config = parse(readFileSync(configPath, 'utf8'));\n } catch {\n return false;\n }\n\n return eventCommands(config, eventName).some(command =>\n commandIsViable(command, event, cwd, environment),\n );\n}\n","import { CODEX_MIGRATION_SCHEMA } from './inventory.js';\n\nexport type LegacyCommandIdentity =\n | {\n readonly kind: 'package';\n readonly event: string;\n }\n | {\n readonly kind: 'script';\n readonly event: string;\n readonly script: string;\n };\n\nfunction commandParts(command: string): string[] {\n return command\n .trim()\n .split(' ')\n .filter(part => part !== '');\n}\n\nfunction isHistoricalPackagePrefix(parts: readonly string[]): boolean {\n return (\n parts[0] === CODEX_MIGRATION_SCHEMA.packageRunner &&\n parts[1] === '--yes' &&\n parts[2] === 'safeword'\n );\n}\n\nfunction packagedHookEvent(hook: readonly string[]): string | undefined {\n if (\n hook.length === 3 &&\n hook[0] === 'hook' &&\n hook[1] === 'codex' &&\n CODEX_MIGRATION_SCHEMA.hookEvents.includes(hook[2] ?? '')\n ) {\n return hook[2];\n }\n if (\n hook.length === 2 &&\n hook[0] === 'codex-hook' &&\n CODEX_MIGRATION_SCHEMA.hookEvents.includes(hook[1] ?? '')\n ) {\n return hook[1];\n }\n return undefined;\n}\n\nfunction packageIdentity(command: string): LegacyCommandIdentity | undefined {\n const parts = commandParts(command);\n if (!isHistoricalPackagePrefix(parts)) return undefined;\n const event = packagedHookEvent(parts.slice(3));\n return event === undefined ? undefined : { kind: 'package', event };\n}\n\nfunction scriptIdentity(command: string): LegacyCommandIdentity | undefined {\n const prefix = CODEX_MIGRATION_SCHEMA.hookScriptPrefix;\n if (!command.startsWith(prefix)) return undefined;\n const remainder = command.slice(prefix.length);\n const quote = remainder.indexOf('\"');\n if (quote === -1) return undefined;\n const script = remainder.slice(0, quote);\n const event = CODEX_MIGRATION_SCHEMA.hookScriptEvents[script];\n if (event === undefined) return undefined;\n const arguments_ = remainder.slice(quote + 1);\n const supportedArguments =\n arguments_ === '' ||\n (script === 'session-safeword-context.ts' && arguments_ === ' --agent=codex');\n return supportedArguments ? { kind: 'script', event, script } : undefined;\n}\n\nexport function legacyCommandIdentity(command: string): LegacyCommandIdentity | undefined {\n return packageIdentity(command) ?? scriptIdentity(command);\n}\n","/* eslint-disable unicorn/no-null -- versioned JSON uses explicit null for unavailable values */\n\nimport { createHash, randomUUID } from 'node:crypto';\nimport {\n closeSync,\n constants as fsConstants,\n existsSync,\n fstatSync,\n lstatSync,\n openSync,\n readdirSync,\n readFileSync,\n readSync,\n realpathSync,\n rmdirSync,\n rmSync,\n type Stats,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport nodePath from 'node:path';\n\nimport { SAFEWORD_SCHEMA } from '../schema.js';\nimport { writeDurableFile } from './durable-write.js';\nimport {\n type CodexHostProcessIdentity,\n type CodexHostProcessObservation,\n observeCodexHostProcesses,\n sameCodexHost,\n} from './host-process.js';\n\nexport type { CodexHostProcessIdentity } from './host-process.js';\n\nexport interface CodexPluginIdentity {\n plugin_version: string;\n manifest_sha256: string;\n}\n\nexport interface CodexHookProofV2 {\n schema_version: 2;\n event: CodexPluginHookEvent;\n plugin_version: string;\n manifest_sha256: string;\n activation_id: string | null;\n recorded_at: string;\n}\n\nexport interface CodexHookProofV3 extends CodexPluginIdentity {\n schema_version: 3;\n event: CodexPluginHookEvent;\n activation_id: string | null;\n project_directory: string;\n session_id: string;\n recorded_at: string;\n}\n\ninterface CodexSessionProofV1 extends CodexPluginIdentity {\n schema_version: 1;\n project_directory: string;\n session_id: string;\n recorded_at: string;\n}\n\ninterface CodexSessionProofV2 extends CodexPluginIdentity {\n schema_version: 2;\n activation_id: string | null;\n project_directory: string;\n session_id: string;\n recorded_at: string;\n}\n\ntype CodexSessionProof = CodexSessionProofV1 | CodexSessionProofV2;\n\nexport type CodexSessionProofStatus =\n 'activation-pending' | 'current' | 'prior-observed' | 'missing' | 'untrusted';\n\nexport interface CodexSessionProofObservation {\n status: CodexSessionProofStatus;\n plugin_version: string | null;\n manifest_sha256: string | null;\n recorded_at: string | null;\n}\n\nconst SHA256_PATTERN = /^[a-f\\d]{64}$/u;\nconst NUMERIC_VERSION_PART_PATTERN = /^\\d+$/u;\nconst VERSION_IDENTIFIER_PATTERN = /^[\\dA-Za-z-]+$/u;\nconst MAX_PLUGIN_VERSION_LENGTH = 128;\nconst MAX_RETAINED_SESSION_PROOFS_PER_PROJECT = 256;\nconst MAX_RETAINED_SESSION_PROOF_PROJECTS = 64;\n\ninterface CodexActivationMarkerV1 {\n schema_version: 1;\n plugin_version: string;\n manifest_sha256: string;\n}\n\nexport interface CodexActivationMarkerV2 {\n schema_version: 2;\n plugin_version: string;\n manifest_sha256: string;\n activation_id: string;\n installed_at: string;\n host_observation: 'observed' | 'unavailable';\n active_hosts: CodexHostProcessIdentity[];\n}\n\ninterface CodexActivationReceiptV1 {\n schema_version: 1;\n plugin_version: string;\n manifest_sha256: string;\n activation_id: string;\n activated_at: string;\n host: CodexHostProcessIdentity;\n}\n\nexport const CODEX_PLUGIN_HOOK_EVENTS = [\n 'session-start',\n 'pre-tool-use',\n 'post-tool-use',\n 'user-prompt-submit',\n 'stop',\n] as const;\nexport type CodexPluginHookEvent = (typeof CODEX_PLUGIN_HOOK_EVENTS)[number];\n\ntype CodexHookProofStatus = 'current' | 'partial' | 'missing' | 'stale' | 'malformed';\n\nexport interface CodexHookProofObservation {\n status: CodexHookProofStatus;\n plugin_version: string | null;\n manifest_sha256: string | null;\n recorded_at: string | null;\n activation_id: string | null;\n events: readonly CodexPluginHookEvent[];\n missing_events: readonly CodexPluginHookEvent[];\n}\n\nfunction codexProfileDirectory(environment: NodeJS.ProcessEnv = process.env): string {\n const configuredHome = environment.CODEX_HOME?.trim();\n return configuredHome || nodePath.join(homedir(), '.codex');\n}\n\nexport function codexProofPath(\n environment: NodeJS.ProcessEnv = process.env,\n event: CodexPluginHookEvent = 'session-start',\n): string {\n return nodePath.join(\n codexProfileDirectory(environment),\n 'safeword/hook-proof-v2',\n `${event}.json`,\n );\n}\n\nfunction canonicalProjectDirectory(projectDirectory: string): string {\n try {\n return realpathSync(projectDirectory);\n } catch {\n return nodePath.resolve(projectDirectory);\n }\n}\n\nfunction codexSessionProofPath(\n projectDirectory: string,\n sessionId: string,\n environment: NodeJS.ProcessEnv,\n): string {\n // The directory suffix versions the storage layout, independently from the\n // schema_version inside each retained proof record.\n const project = canonicalProjectDirectory(projectDirectory);\n const projectDigest = createHash('sha256').update(project).digest('hex');\n const sessionDigest = createHash('sha256').update(sessionId).digest('hex');\n return nodePath.join(\n codexProfileDirectory(environment),\n 'safeword/session-proof-v1',\n projectDigest,\n `${sessionDigest}.json`,\n );\n}\n\nfunction legacyCodexActivationMarkerPath(environment: NodeJS.ProcessEnv = process.env): string {\n return nodePath.join(codexProfileDirectory(environment), 'safeword/activation-pending-v1.json');\n}\n\nfunction codexActivationMarkerPath(environment: NodeJS.ProcessEnv = process.env): string {\n return nodePath.join(codexProfileDirectory(environment), 'safeword/activation-pending-v2.json');\n}\n\nfunction codexActivationReceiptPath(environment: NodeJS.ProcessEnv = process.env): string {\n return nodePath.join(codexProfileDirectory(environment), 'safeword/activation-current-v1.json');\n}\n\nfunction legacyCodexRestartMarkerPath(environment: NodeJS.ProcessEnv = process.env): string {\n return nodePath.join(codexProfileDirectory(environment), 'safeword/restart-pending-v1.json');\n}\n\nexport function codexActivationIsPending(environment: NodeJS.ProcessEnv = process.env): boolean {\n try {\n return activationIsPendingForIdentity(environment, currentCodexPluginIdentity());\n } catch {\n return true;\n }\n}\n\nexport function codexActivationRestartWasObserved(\n environment: NodeJS.ProcessEnv = process.env,\n now = new Date(),\n options: { hostObservation?: CodexHostProcessObservation } = {},\n): boolean {\n try {\n const identity = currentCodexPluginIdentity();\n const marker = readActivationMarkerV2(environment, identity);\n if (marker === null) return false;\n return (\n activationReceiptForRestart(\n marker,\n options.hostObservation ?? observeCodexHostProcesses(),\n identity,\n now,\n ) !== null\n );\n } catch {\n return false;\n }\n}\n\nexport function codexActivationRestartIsProven(\n environment: NodeJS.ProcessEnv = process.env,\n): boolean {\n try {\n return readActivationReceipt(environment, currentCodexPluginIdentity()) !== null;\n } catch {\n return false;\n }\n}\n\nfunction activationIsPendingForIdentity(\n environment: NodeJS.ProcessEnv,\n identity: CodexPluginIdentity,\n): boolean {\n return (\n // The canonical marker is written atomically. If it exists but cannot be\n // parsed or matched, fail closed instead of accepting unbound hook proof.\n existsSync(codexActivationMarkerPath(environment)) ||\n [legacyCodexActivationMarkerPath(environment), legacyCodexRestartMarkerPath(environment)].some(\n path => legacyActivationMarkerMatches(path, identity),\n )\n );\n}\n\nexport type CodexActivationMarkerIssue = 'identity-mismatch' | 'malformed' | 'package-unavailable';\n\nexport function codexActivationMarkerIssue(\n environment: NodeJS.ProcessEnv = process.env,\n): CodexActivationMarkerIssue | undefined {\n const markerPath = codexActivationMarkerPath(environment);\n if (!existsSync(markerPath)) return undefined;\n let identity: CodexPluginIdentity;\n try {\n identity = currentCodexPluginIdentity();\n } catch {\n return 'package-unavailable';\n }\n try {\n const marker = readTrustedHookProofJson(markerPath);\n if (!isActivationMarkerV2(marker)) return 'malformed';\n return matchesCodexPluginIdentity(marker, identity) ? undefined : 'identity-mismatch';\n } catch {\n return 'malformed';\n }\n}\n\nfunction packagedHookManifestPath(): string {\n const candidates = [\n nodePath.resolve(import.meta.dirname, '../hooks.json'),\n nodePath.resolve(import.meta.dirname, '../codex-plugin/hooks.json'),\n nodePath.resolve(import.meta.dirname, '../../codex-plugin/hooks.json'),\n ];\n const manifest = candidates.find(candidate => existsSync(candidate));\n if (manifest === undefined) {\n throw new Error('Could not locate the packaged Codex hook manifest.');\n }\n return manifest;\n}\n\nexport const currentCodexPluginIdentity = (() => {\n let cachedIdentity: CodexPluginIdentity | undefined;\n return (): CodexPluginIdentity => {\n cachedIdentity ??= (() => {\n const manifest = readFileSync(packagedHookManifestPath());\n return {\n plugin_version: SAFEWORD_SCHEMA.version,\n manifest_sha256: createHash('sha256').update(manifest).digest('hex'),\n };\n })();\n return cachedIdentity;\n };\n})();\n\nfunction matchesCodexPluginIdentity(\n value: { plugin_version?: unknown; manifest_sha256?: unknown },\n identity: CodexPluginIdentity,\n): boolean {\n return (\n value.plugin_version === identity.plugin_version &&\n value.manifest_sha256 === identity.manifest_sha256\n );\n}\n\nexport function writeCodexActivationMarker(\n environment: NodeJS.ProcessEnv = process.env,\n now = new Date(),\n options: {\n activationId?: string;\n activeHosts?: CodexHostProcessIdentity[] | null;\n hostObservation?: CodexHostProcessObservation;\n } = {},\n): CodexActivationMarkerV2 {\n const path = codexActivationMarkerPath(environment);\n const activeHosts = activeHostsForMarker(options);\n const marker: CodexActivationMarkerV2 = {\n schema_version: 2,\n ...currentCodexPluginIdentity(),\n activation_id: options.activationId ?? randomUUID(),\n installed_at: now.toISOString(),\n host_observation: activeHosts === null ? 'unavailable' : 'observed',\n active_hosts: activeHosts ?? [],\n };\n writeAtomicJson(path, marker);\n // A new installation invalidates every earlier execution proof. The v2\n // marker is the only authority until SessionStart proves a different Codex\n // app-server loaded the installed plugin catalogue.\n for (const event of CODEX_PLUGIN_HOOK_EVENTS)\n rmSync(codexProofPath(environment, event), { force: true });\n rmSync(nodePath.join(codexProfileDirectory(environment), 'safeword/hook-proof-v1'), {\n recursive: true,\n force: true,\n });\n // Task-bound SessionStart history is intentionally retained. Exact-current\n // checks still reject it after this marker is written, while bootstrap can\n // distinguish a previously observed runtime from wholly unobserved\n // protection in the already-open task.\n rmSync(codexActivationReceiptPath(environment), { force: true });\n rmSync(legacyCodexActivationMarkerPath(environment), { force: true });\n rmSync(legacyCodexRestartMarkerPath(environment), { force: true });\n return marker;\n}\n\nfunction activeHostsForMarker(options: {\n activeHosts?: CodexHostProcessIdentity[] | null;\n hostObservation?: CodexHostProcessObservation;\n}): CodexHostProcessIdentity[] | null {\n if (options.activeHosts !== undefined) {\n return options.activeHosts;\n }\n const observation = options.hostObservation ?? observeCodexHostProcesses();\n if (!observation.available) return null;\n const activeHosts = [...observation.running];\n const currentHost = observation.current;\n if (currentHost !== null && activeHosts.every(host => !sameCodexHost(host, currentHost))) {\n activeHosts.push(currentHost);\n }\n return activeHosts;\n}\n\nfunction hostObservationForOverride(\n current: CodexHostProcessIdentity | null = null,\n): CodexHostProcessObservation {\n return {\n available: true,\n current,\n running: current === null ? [] : [current],\n };\n}\n\nfunction activationReceiptForRestart(\n marker: CodexActivationMarkerV2,\n hostObservation: CodexHostProcessObservation,\n identity: CodexPluginIdentity,\n now: Date,\n): CodexActivationReceiptV1 | null {\n const currentHost = hostObservation.current;\n const installedAt = Date.parse(marker.installed_at);\n if (\n !hostObservation.available ||\n currentHost === null ||\n marker.host_observation !== 'observed' ||\n now.getTime() < installedAt ||\n Date.parse(currentHost.started_at) < installedAt ||\n marker.active_hosts.some(installedHost => sameCodexHost(installedHost, currentHost)) ||\n marker.active_hosts.some(installedHost =>\n hostObservation.running.some(runningHost => sameCodexHost(installedHost, runningHost)),\n )\n ) {\n return null;\n }\n return {\n schema_version: 1,\n ...identity,\n activation_id: marker.activation_id,\n activated_at: now.toISOString(),\n host: currentHost,\n };\n}\n\n// eslint-disable-next-line complexity -- coordinates optional host overrides with durable proof writes\nexport function recordCodexHookProof(\n event: CodexPluginHookEvent,\n environment: NodeJS.ProcessEnv = process.env,\n now = new Date(),\n writeOptions: {\n beforeRename?: () => void;\n currentHost?: CodexHostProcessIdentity | null;\n hostObservation?: CodexHostProcessObservation;\n projectDirectory?: string;\n sessionId?: string;\n } = {},\n): CodexHookProofV2 | CodexHookProofV3 {\n const identity = currentCodexPluginIdentity();\n const marker = readActivationMarkerV2(environment, identity);\n let receipt = readActivationReceipt(environment, identity);\n if (event === 'session-start' && marker !== null) {\n const hostObservation =\n writeOptions.hostObservation ??\n ('currentHost' in writeOptions\n ? hostObservationForOverride(writeOptions.currentHost)\n : observeCodexHostProcesses());\n const restartedReceipt = activationReceiptForRestart(marker, hostObservation, identity, now);\n if (restartedReceipt !== null) {\n receipt = restartedReceipt;\n writeAtomicJson(codexActivationReceiptPath(environment), receipt);\n rmSync(codexActivationMarkerPath(environment), { force: true });\n }\n }\n const projectDirectory =\n writeOptions.projectDirectory === undefined\n ? undefined\n : canonicalProjectDirectory(writeOptions.projectDirectory);\n const sessionId = writeOptions.sessionId?.trim();\n const activationId = activeCodexActivationId(marker, receipt);\n const recordedAt = now.toISOString();\n const proof: CodexHookProofV2 | CodexHookProofV3 =\n projectDirectory !== undefined && sessionId\n ? {\n schema_version: 3,\n event,\n ...identity,\n activation_id: activationId,\n project_directory: projectDirectory,\n session_id: sessionId,\n recorded_at: recordedAt,\n }\n : {\n schema_version: 2,\n event,\n ...identity,\n activation_id: activationId,\n recorded_at: recordedAt,\n };\n writeAtomicJson(codexProofPath(environment, event), proof, writeOptions);\n if (event === 'session-start' && projectDirectory !== undefined && sessionId) {\n const sessionProof: CodexSessionProofV2 = {\n schema_version: 2,\n ...identity,\n activation_id: activationId,\n project_directory: projectDirectory,\n session_id: sessionId,\n recorded_at: recordedAt,\n };\n const path = codexSessionProofPath(projectDirectory, sessionId, environment);\n writeAtomicJson(path, sessionProof);\n pruneCodexSessionProofs(path);\n }\n return proof;\n}\n\nexport function codexSessionProofIsCurrent(\n projectDirectory: string,\n sessionId: string,\n environment: NodeJS.ProcessEnv = process.env,\n): boolean {\n return observeCodexSessionProof(projectDirectory, sessionId, environment).status === 'current';\n}\n\nfunction validSessionProof(\n value: unknown,\n canonicalProject: string,\n sessionId: string,\n): value is CodexSessionProof {\n if (typeof value !== 'object' || value === null) return false;\n const proof = value as Record<string, unknown>;\n return (\n sessionProofBindingMatches(proof, canonicalProject, sessionId) &&\n sessionProofIdentityIsWellFormed(proof) &&\n sessionProofTimeIsWellFormed(proof)\n );\n}\n\nfunction sessionProofBindingMatches(\n proof: Record<string, unknown>,\n canonicalProject: string,\n sessionId: string,\n): boolean {\n return (\n (proof.schema_version === 1 || proof.schema_version === 2) &&\n proof.project_directory === canonicalProject &&\n proof.session_id === sessionId &&\n (proof.schema_version === 1 ||\n typeof proof.activation_id === 'string' ||\n proof.activation_id === null)\n );\n}\n\nfunction sessionProofIdentityIsWellFormed(proof: Record<string, unknown>): boolean {\n return (\n pluginVersionIsWellFormed(proof.plugin_version) &&\n typeof proof.manifest_sha256 === 'string' &&\n SHA256_PATTERN.test(proof.manifest_sha256)\n );\n}\n\nfunction numericVersionPartIsWellFormed(part: string): boolean {\n return (\n part.length > 0 &&\n NUMERIC_VERSION_PART_PATTERN.test(part) &&\n (part === '0' || !part.startsWith('0'))\n );\n}\n\nfunction versionIdentifiersAreWellFormed(value: string | undefined): boolean {\n return (\n value === undefined ||\n value\n .split('.')\n .every(identifier =>\n identifier.length > 0 ? VERSION_IDENTIFIER_PATTERN.test(identifier) : false,\n )\n );\n}\n\nfunction pluginVersionIsWellFormed(value: unknown): value is string {\n if (typeof value !== 'string' || value.length > MAX_PLUGIN_VERSION_LENGTH) return false;\n const buildSplit = value.split('+');\n if (buildSplit.length > 2) return false;\n const coreAndPrerelease = buildSplit[0] ?? '';\n const prereleaseSeparator = coreAndPrerelease.indexOf('-');\n const coreText =\n prereleaseSeparator === -1\n ? coreAndPrerelease\n : coreAndPrerelease.slice(0, prereleaseSeparator);\n const prerelease =\n prereleaseSeparator === -1 ? undefined : coreAndPrerelease.slice(prereleaseSeparator + 1);\n const core = coreText.split('.');\n return (\n core.length === 3 &&\n core.every(part => numericVersionPartIsWellFormed(part)) &&\n versionIdentifiersAreWellFormed(prerelease) &&\n versionIdentifiersAreWellFormed(buildSplit[1])\n );\n}\n\nfunction sessionProofTimeIsWellFormed(proof: Record<string, unknown>): boolean {\n return typeof proof.recorded_at === 'string' && !Number.isNaN(Date.parse(proof.recorded_at));\n}\n\nfunction classifySessionProof(\n proof: CodexSessionProof,\n identity: CodexPluginIdentity,\n marker: CodexActivationMarkerV2 | null,\n receipt: CodexActivationReceiptV1 | null,\n activationPending: boolean,\n): CodexSessionProofStatus {\n if (proof.schema_version === 1) return 'prior-observed';\n if (!matchesCodexPluginIdentity(proof, identity)) return 'prior-observed';\n if (marker !== null && Date.parse(proof.recorded_at) < Date.parse(marker.installed_at)) {\n return 'prior-observed';\n }\n if (activationPending) return 'activation-pending';\n if (receipt === null) return proof.activation_id === null ? 'current' : 'prior-observed';\n return proof.activation_id === receipt.activation_id &&\n Date.parse(proof.recorded_at) >= Date.parse(receipt.activated_at)\n ? 'current'\n : 'prior-observed';\n}\n\nexport function observeCodexSessionProof(\n projectDirectory: string,\n sessionId: string,\n environment: NodeJS.ProcessEnv = process.env,\n): CodexSessionProofObservation {\n const canonicalProject = canonicalProjectDirectory(projectDirectory);\n const path = codexSessionProofPath(canonicalProject, sessionId, environment);\n if (!existsSync(path)) {\n return {\n status: 'missing',\n plugin_version: null,\n manifest_sha256: null,\n recorded_at: null,\n };\n }\n try {\n const value = readTrustedHookProofJson(path);\n if (!validSessionProof(value, canonicalProject, sessionId)) throw new Error('Invalid proof.');\n const identity = currentCodexPluginIdentity();\n const marker = readActivationMarkerV2(environment, identity);\n const receipt = readActivationReceipt(environment, identity);\n const status = classifySessionProof(\n value,\n identity,\n marker,\n receipt,\n activationIsPendingForIdentity(environment, identity),\n );\n return {\n status,\n plugin_version: value.plugin_version,\n manifest_sha256: value.manifest_sha256,\n recorded_at: value.recorded_at,\n };\n } catch {\n return {\n status: 'untrusted',\n plugin_version: null,\n manifest_sha256: null,\n recorded_at: null,\n };\n }\n}\n\nfunction sessionProofProjectDirectories(root: string): {\n modifiedAt: number;\n path: string;\n}[] {\n try {\n return readdirSync(root, { withFileTypes: true })\n .filter(entry => entry.isDirectory() && !entry.isSymbolicLink())\n .flatMap(projectEntry => {\n const path = nodePath.join(root, projectEntry.name);\n try {\n // A crash may leave only a durable-write temporary file. Such a\n // directory is not retained proof and must not consume a project\n // retention slot or evict a live sibling project.\n if (sessionProofProjectFiles(path).length === 0) return [];\n return [{ modifiedAt: lstatSync(path).mtimeMs, path }];\n } catch {\n // An unreadable directory is not evidence that its retained history\n // is empty. Leave it untouched and retry on a later SessionStart.\n return [];\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction sessionProofProjectFiles(projectPath: string): { modifiedAt: number; path: string }[] {\n try {\n return readdirSync(projectPath, { withFileTypes: true }).flatMap(entry => {\n if (\n !entry.isFile() ||\n entry.isSymbolicLink() ||\n entry.name.startsWith('.') ||\n !entry.name.endsWith('.json')\n )\n return [];\n const path = nodePath.join(projectPath, entry.name);\n try {\n return [{ modifiedAt: lstatSync(path).mtimeMs, path }];\n } catch {\n // Another task may prune the same proof between listing and metadata\n // lookup. Keep the remaining bounded history instead of abandoning it.\n return [];\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction pruneCodexSessionProofs(retainedPath: string): void {\n const retainedProjectPath = nodePath.dirname(retainedPath);\n const files = sessionProofProjectFiles(retainedProjectPath).toSorted((left, right) => {\n if (left.path === retainedPath) return -1;\n if (right.path === retainedPath) return 1;\n return right.modifiedAt - left.modifiedAt || left.path.localeCompare(right.path);\n });\n for (const stale of files.slice(MAX_RETAINED_SESSION_PROOFS_PER_PROJECT)) {\n rmSync(stale.path, { force: true });\n }\n const root = nodePath.dirname(retainedProjectPath);\n const projects = sessionProofProjectDirectories(root).toSorted((left, right) => {\n if (left.path === retainedProjectPath) return -1;\n if (right.path === retainedProjectPath) return 1;\n return right.modifiedAt - left.modifiedAt || left.path.localeCompare(right.path);\n });\n for (const stale of projects.slice(MAX_RETAINED_SESSION_PROOF_PROJECTS)) {\n for (const proof of sessionProofProjectFiles(stale.path)) rmSync(proof.path, { force: true });\n try {\n // Non-recursive removal cannot erase a concurrent writer's temporary or\n // newly published proof. A non-empty directory is retried later.\n rmdirSync(stale.path);\n } catch {\n // Advisory history remains bounded per project even when a concurrent\n // writer keeps this project directory alive.\n }\n }\n}\n\nfunction writeAtomicJson(\n path: string,\n value: unknown,\n options: { beforeRename?: () => void } = {},\n): void {\n writeDurableFile(path, `${JSON.stringify(value)}\\n`, {\n mode: 0o600,\n beforeRename: options.beforeRename,\n });\n}\n\nfunction legacyActivationMarkerMatches(path: string, identity: CodexPluginIdentity): boolean {\n if (!existsSync(path)) return false;\n try {\n const marker = JSON.parse(readFileSync(path, 'utf8')) as Partial<CodexActivationMarkerV1>;\n return marker.schema_version === 1 && matchesCodexPluginIdentity(marker, identity);\n } catch {\n return false;\n }\n}\n\nfunction readActivationMarkerV2(\n environment: NodeJS.ProcessEnv,\n identity: CodexPluginIdentity,\n): CodexActivationMarkerV2 | null {\n return readIdentityBoundJson(\n codexActivationMarkerPath(environment),\n identity,\n isActivationMarkerV2,\n );\n}\n\nfunction readActivationReceipt(\n environment: NodeJS.ProcessEnv,\n identity: CodexPluginIdentity,\n): CodexActivationReceiptV1 | null {\n return readIdentityBoundJson(\n codexActivationReceiptPath(environment),\n identity,\n isActivationReceiptV1,\n );\n}\n\nfunction activeCodexActivationId(\n marker: CodexActivationMarkerV2 | null,\n receipt: CodexActivationReceiptV1 | null,\n): string | null {\n // A completed restart receipt supersedes a leftover pending marker. Sharing\n // this precedence keeps the proof writer and observer on the same identity.\n return receipt?.activation_id ?? marker?.activation_id ?? null;\n}\n\nfunction readIdentityBoundJson<T extends CodexPluginIdentity>(\n path: string,\n identity: CodexPluginIdentity,\n validator: (value: unknown) => value is T,\n): T | null {\n if (!existsSync(path)) return null;\n try {\n const value = readTrustedHookProofJson(path);\n return validator(value) && matchesCodexPluginIdentity(value, identity) ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction readEventProof(\n path: string,\n expectedEvent: CodexPluginHookEvent,\n): CodexHookProofV2 | CodexHookProofV3 | null {\n try {\n const proof = readTrustedHookProofJson(path);\n return isCodexHookProof(proof) && proof.event === expectedEvent ? proof : null;\n } catch {\n return null;\n }\n}\n\nconst MAX_CODEX_HOOK_PROOF_BYTES = 64 * 1024;\n\nfunction assertTrustedHookProofMetadata(metadata: Stats): void {\n const posixPermissionsAreTrusted =\n process.getuid === undefined ||\n (metadata.uid === process.getuid() && (metadata.mode & 0o077) === 0);\n if (\n !metadata.isFile() ||\n metadata.nlink !== 1 ||\n !posixPermissionsAreTrusted ||\n metadata.size > MAX_CODEX_HOOK_PROOF_BYTES\n ) {\n throw new Error('Untrusted Codex hook proof file.');\n }\n}\n\nfunction readDescriptorFully(descriptor: number, size: number): Buffer {\n const buffer = Buffer.alloc(size);\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 if (offset !== buffer.length)\n throw new Error('Codex hook proof changed while it was being read.');\n return buffer;\n}\n\nfunction assertHookProofUnchanged(before: Stats, after: Stats): void {\n if (\n after.size !== before.size ||\n after.mtimeMs !== before.mtimeMs ||\n after.ctimeMs !== before.ctimeMs\n ) {\n throw new Error('Codex hook proof changed while it was being read.');\n }\n}\n\nfunction readTrustedHookProofJson(path: string): unknown {\n const descriptor = openSync(path, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));\n try {\n const metadata = fstatSync(descriptor);\n assertTrustedHookProofMetadata(metadata);\n const buffer = readDescriptorFully(descriptor, metadata.size);\n assertHookProofUnchanged(metadata, fstatSync(descriptor));\n return JSON.parse(buffer.toString('utf8')) as unknown;\n } finally {\n closeSync(descriptor);\n }\n}\n\n// eslint-disable-next-line complexity -- aggregates independently written event proofs and preserves malformed/stale distinctions\nexport function observeCodexHookProof(\n environment: NodeJS.ProcessEnv = process.env,\n binding?: { projectDirectory: string; sessionId: string },\n): CodexHookProofObservation {\n const candidates = CODEX_PLUGIN_HOOK_EVENTS.map(event => ({\n event,\n path: codexProofPath(environment, event),\n }));\n const existing = candidates.filter(candidate => existsSync(candidate.path));\n if (existing.length === 0) {\n return {\n status: 'missing',\n plugin_version: null,\n manifest_sha256: null,\n recorded_at: null,\n activation_id: null,\n events: [],\n missing_events: CODEX_PLUGIN_HOOK_EVENTS,\n };\n }\n\n const parsed = existing.map(item => readEventProof(item.path, item.event));\n if (parsed.includes(null)) return malformedObservation();\n const validProofs = parsed.filter(proof => proof !== null);\n\n let identity: CodexPluginIdentity;\n try {\n identity = currentCodexPluginIdentity();\n } catch {\n return malformedObservation();\n }\n const marker = readActivationMarkerV2(environment, identity);\n const receipt = readActivationReceipt(environment, identity);\n const activationId = activeCodexActivationId(marker, receipt);\n if (activationIsPendingForIdentity(environment, identity)) {\n return staleHookObservation(validProofs, activationId);\n }\n const canonicalProject =\n binding === undefined ? undefined : canonicalProjectDirectory(binding.projectDirectory);\n const current = validProofs.filter(\n proof =>\n matchesCodexPluginIdentity(proof, identity) &&\n (activationId === null\n ? proof.activation_id === null\n : proof.activation_id === activationId) &&\n (receipt === null || Date.parse(proof.recorded_at) >= Date.parse(receipt.activated_at)) &&\n (binding === undefined ||\n (proof.schema_version === 3 &&\n proof.project_directory === canonicalProject &&\n proof.session_id === binding.sessionId)),\n );\n const events = current.map(proof => proof.event);\n const missingEvents = CODEX_PLUGIN_HOOK_EVENTS.filter(event => !events.includes(event));\n const latest = current\n .toSorted((left, right) => Date.parse(right.recorded_at) - Date.parse(left.recorded_at))\n .at(0);\n let status: CodexHookProofStatus = 'stale';\n if (current.length === CODEX_PLUGIN_HOOK_EVENTS.length) status = 'current';\n else if (current.length > 0) status = 'partial';\n return {\n status,\n plugin_version: latest?.plugin_version ?? validProofs[0]?.plugin_version ?? null,\n manifest_sha256: latest?.manifest_sha256 ?? validProofs[0]?.manifest_sha256 ?? null,\n recorded_at: latest?.recorded_at ?? null,\n activation_id: activationId,\n events,\n missing_events: missingEvents,\n };\n}\n\nfunction staleHookObservation(\n proofs: (CodexHookProofV2 | CodexHookProofV3)[],\n activationId: string | null,\n): CodexHookProofObservation {\n return {\n status: 'stale',\n plugin_version: proofs[0]?.plugin_version ?? null,\n manifest_sha256: proofs[0]?.manifest_sha256 ?? null,\n recorded_at: null,\n activation_id: activationId,\n events: [],\n missing_events: CODEX_PLUGIN_HOOK_EVENTS,\n };\n}\n\nfunction malformedObservation(): CodexHookProofObservation {\n return {\n status: 'malformed',\n plugin_version: null,\n manifest_sha256: null,\n recorded_at: null,\n activation_id: null,\n events: [],\n missing_events: CODEX_PLUGIN_HOOK_EVENTS,\n };\n}\n\n/*\n Each manifest entry is trusted independently by Codex, so finalization proof\n is intentionally one file per event. Separate files also avoid concurrent\n hook processes racing on a shared read-modify-write document.\n*/\n\n// eslint-disable-next-line complexity -- validates every field of two persisted proof schema versions\nfunction isCodexHookProof(value: unknown): value is CodexHookProofV2 | CodexHookProofV3 {\n if (typeof value !== 'object' || value === null) return false;\n const proof = value as Record<string, unknown>;\n return (\n (proof.schema_version === 2 || proof.schema_version === 3) &&\n isCodexPluginHookEvent(proof.event) &&\n pluginVersionIsWellFormed(proof.plugin_version) &&\n typeof proof.manifest_sha256 === 'string' &&\n SHA256_PATTERN.test(proof.manifest_sha256) &&\n 'activation_id' in proof &&\n (typeof proof.activation_id === 'string' || proof.activation_id === null) &&\n (proof.schema_version !== 3 ||\n (typeof proof.project_directory === 'string' &&\n typeof proof.session_id === 'string' &&\n proof.session_id.trim() !== '')) &&\n typeof proof.recorded_at === 'string' &&\n !Number.isNaN(Date.parse(proof.recorded_at))\n );\n}\n\n// eslint-disable-next-line complexity -- validates each untrusted persisted marker field\nfunction isActivationMarkerV2(value: unknown): value is CodexActivationMarkerV2 {\n if (typeof value !== 'object' || value === null) return false;\n const marker = value as Partial<CodexActivationMarkerV2>;\n return (\n marker.schema_version === 2 &&\n pluginVersionIsWellFormed(marker.plugin_version) &&\n typeof marker.manifest_sha256 === 'string' &&\n SHA256_PATTERN.test(marker.manifest_sha256) &&\n typeof marker.activation_id === 'string' &&\n typeof marker.installed_at === 'string' &&\n !Number.isNaN(Date.parse(marker.installed_at)) &&\n (marker.host_observation === 'observed' || marker.host_observation === 'unavailable') &&\n Array.isArray(marker.active_hosts) &&\n marker.active_hosts.every(isCodexHostProcessIdentity) &&\n (marker.host_observation === 'observed' || marker.active_hosts.length === 0)\n );\n}\n\nfunction isActivationReceiptV1(value: unknown): value is CodexActivationReceiptV1 {\n if (typeof value !== 'object' || value === null) return false;\n const receipt = value as Partial<CodexActivationReceiptV1>;\n return (\n receipt.schema_version === 1 &&\n pluginVersionIsWellFormed(receipt.plugin_version) &&\n typeof receipt.manifest_sha256 === 'string' &&\n SHA256_PATTERN.test(receipt.manifest_sha256) &&\n typeof receipt.activation_id === 'string' &&\n typeof receipt.activated_at === 'string' &&\n !Number.isNaN(Date.parse(receipt.activated_at)) &&\n isCodexHostProcessIdentity(receipt.host)\n );\n}\n\nfunction isCodexHostProcessIdentity(value: unknown): value is CodexHostProcessIdentity {\n if (typeof value !== 'object' || value === null) return false;\n const host = value as Partial<CodexHostProcessIdentity>;\n return (\n Number.isSafeInteger(host.pid) &&\n (host.pid ?? 0) > 0 &&\n typeof host.started_at === 'string' &&\n !Number.isNaN(Date.parse(host.started_at))\n );\n}\n\nfunction isCodexPluginHookEvent(value: unknown): value is CodexPluginHookEvent {\n return (\n typeof value === 'string' && CODEX_PLUGIN_HOOK_EVENTS.includes(value as CodexPluginHookEvent)\n );\n}\n","/* eslint-disable unicorn/no-null -- host observations use explicit null when ancestry is unavailable */\n\nimport { spawnSync } from 'node:child_process';\n\nexport interface CodexHostProcessIdentity {\n pid: number;\n started_at: string;\n}\n\ninterface ProcessRow extends CodexHostProcessIdentity {\n parentPid: number;\n command: string;\n}\n\nexport interface CodexHostProcessObservation {\n available: boolean;\n running: CodexHostProcessIdentity[];\n current: CodexHostProcessIdentity | null;\n}\n\nconst WINDOWS_PROCESS_COMMAND =\n 'Get-CimInstance Win32_Process | ForEach-Object { $started = [DateTimeOffset]$_.CreationDate; Write-Output (\"{0}`t{1}`t{2}`t{3}\" -f $_.ProcessId, $_.ParentProcessId, $started.ToUnixTimeMilliseconds(), $_.CommandLine) }';\n\nfunction parseProcessRows(output: string): ProcessRow[] {\n return output.split('\\n').flatMap(line => {\n const columns = line.trim().split(/\\s+/u);\n if (columns.length < 8) return [];\n const pid = Number(columns[0]);\n const parentPid = Number(columns[1]);\n if (!Number.isSafeInteger(pid) || !Number.isSafeInteger(parentPid)) return [];\n const startedAt = new Date(columns.slice(2, 7).join(' '));\n if (Number.isNaN(startedAt.getTime())) return [];\n return [\n {\n pid,\n parentPid,\n started_at: startedAt.toISOString(),\n command: columns.slice(7).join(' '),\n },\n ];\n });\n}\n\nfunction parseWindowsProcessRows(output: string): ProcessRow[] {\n return output.split('\\n').flatMap(line => {\n const [pidText, parentPidText, startedAtText, ...command] = line.trimEnd().split('\\t');\n const pid = Number(pidText);\n const parentPid = Number(parentPidText);\n const startedAt = new Date(Number(startedAtText));\n if (!Number.isSafeInteger(pid) || !Number.isSafeInteger(parentPid) || command.length === 0)\n return [];\n if (Number.isNaN(startedAt.getTime())) return [];\n return [\n {\n pid,\n parentPid,\n started_at: startedAt.toISOString(),\n command: command.join('\\t'),\n },\n ];\n });\n}\n\nfunction isCodexAppServer(row: ProcessRow): boolean {\n const command = row.command.replaceAll('\\\\', '/');\n return (\n /(?:^|\\/)codex(?:\\.exe)?[\"']?\\s/iu.test(command) && /(?:^|\\s)app-server(?:\\s|$)/u.test(command)\n );\n}\n\nexport function codexHostsFromProcessTable(\n output: string,\n parentPid: number,\n format: 'posix' | 'windows' = 'posix',\n): CodexHostProcessObservation {\n const rows = format === 'windows' ? parseWindowsProcessRows(output) : parseProcessRows(output);\n const running = rows\n .filter(row => isCodexAppServer(row))\n .map(({ pid, started_at }) => ({ pid, started_at }));\n const byPid = new Map(rows.map(row => [row.pid, row]));\n let candidate = byPid.get(parentPid);\n const visited = new Set<number>();\n while (candidate !== undefined && !visited.has(candidate.pid)) {\n if (isCodexAppServer(candidate)) {\n return {\n available: true,\n running,\n current: { pid: candidate.pid, started_at: candidate.started_at },\n };\n }\n visited.add(candidate.pid);\n candidate = byPid.get(candidate.parentPid);\n }\n return { available: true, running, current: null };\n}\n\nexport function observeCodexHostProcesses(): CodexHostProcessObservation {\n if (process.platform === 'win32') {\n const result = spawnSync(\n 'powershell.exe',\n ['-NoProfile', '-NonInteractive', '-Command', WINDOWS_PROCESS_COMMAND],\n { encoding: 'utf8', timeout: 2000 },\n );\n if (result.status !== 0) return { available: false, running: [], current: null };\n return codexHostsFromProcessTable(result.stdout, process.ppid, 'windows');\n }\n const result = spawnSync('ps', ['-axo', 'pid=,ppid=,lstart=,command='], {\n encoding: 'utf8',\n timeout: 2000,\n });\n if (result.status !== 0) return { available: false, running: [], current: null };\n return codexHostsFromProcessTable(result.stdout, process.ppid);\n}\n\nexport function observeRunningCodexHosts(): CodexHostProcessIdentity[] | null {\n const observation = observeCodexHostProcesses();\n return observation.available ? observation.running : null;\n}\n\nexport function sameCodexHost(\n left: CodexHostProcessIdentity,\n right: CodexHostProcessIdentity,\n): boolean {\n return left.pid === right.pid && left.started_at === right.started_at;\n}\n"],"mappings":"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","names":["lstatSync","readFileSync","nodePath","result","nodePath","readFileSync","nodePath","lstatSync","readFileSync"]}
@@ -11,11 +11,11 @@ import "./chunk-FOYGZ4MK.js";
11
11
  import "./chunk-QOLHGAD5.js";
12
12
  import "./chunk-QWNT3JKY.js";
13
13
  import "./chunk-HF3DXZEA.js";
14
- import "./chunk-7PKXJO6S.js";
14
+ import "./chunk-IE67TMML.js";
15
15
  export {
16
16
  claudeCleanupPreconditionDigest,
17
17
  claudeLegacyMutations,
18
18
  migrateClaudeLegacyAutomatically,
19
19
  recoverClaudeCleanup
20
20
  };
21
- //# sourceMappingURL=cleanup-Q2MDAXSN.js.map
21
+ //# sourceMappingURL=cleanup-JKTGGXNM.js.map
@@ -30,7 +30,7 @@ import {
30
30
  VERSION
31
31
  } from "./chunk-4VORK37W.js";
32
32
  import "./chunk-HF3DXZEA.js";
33
- import "./chunk-7PKXJO6S.js";
33
+ import "./chunk-IE67TMML.js";
34
34
 
35
35
  // src/claude-plugin/cleanup-command.ts
36
36
  function statusClassification(result) {
@@ -132,4 +132,4 @@ function cleanupClaudeLegacy(cwd, options) {
132
132
  export {
133
133
  cleanupClaudeLegacy
134
134
  };
135
- //# sourceMappingURL=cleanup-command-JU5PTFWN.js.map
135
+ //# sourceMappingURL=cleanup-command-GWMUVTKE.js.map