safeword 0.78.0 → 0.78.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/codex-plugin/.codex-plugin/plugin.json +1 -1
  2. package/codex-plugin/hooks.json +5 -5
  3. package/dist/{architecture-4EIJWLZ2.js → architecture-ETYFQUVX.js} +2 -2
  4. package/dist/{architecture-document-Z3GLUOE3.js → architecture-document-OJYNUG42.js} +2 -2
  5. package/dist/{architecture-monorepo-EIF3E3L3.js → architecture-monorepo-QVTZ6COC.js} +2 -2
  6. package/dist/{boundary-U5U2PSX2.js → boundary-7LNKC6GG.js} +2 -2
  7. package/dist/{chunk-VUWQD4AG.js → chunk-3SOJBMM6.js} +2 -2
  8. package/dist/{chunk-JZFZWY3K.js → chunk-4CKCRZDO.js} +2 -2
  9. package/dist/{chunk-7KMQ3QPX.js → chunk-5ITCCDTH.js} +2 -2
  10. package/dist/{chunk-3ETWYWGQ.js → chunk-A2IG7JPA.js} +4 -4
  11. package/dist/{chunk-SLRSGK2C.js → chunk-DS3IXWDV.js} +3 -3
  12. package/dist/{chunk-AQU52TJM.js → chunk-F5353NJG.js} +2 -2
  13. package/dist/chunk-FV2S4LAR.js +122 -0
  14. package/dist/chunk-FV2S4LAR.js.map +1 -0
  15. package/dist/{chunk-C377VEWH.js → chunk-GZ36UZJG.js} +3 -3
  16. package/dist/{chunk-4AIRSIOH.js → chunk-H5IFRCB6.js} +2 -2
  17. package/dist/{chunk-E4UMSKEX.js → chunk-NSZGI7HK.js} +2 -2
  18. package/dist/{chunk-E4UMSKEX.js.map → chunk-NSZGI7HK.js.map} +1 -1
  19. package/dist/{chunk-FASTWBPY.js → chunk-PGLSVXYF.js} +3 -3
  20. package/dist/{chunk-RXQJH4LM.js → chunk-S7PWPVQB.js} +4 -4
  21. package/dist/{chunk-BAYWBZ32.js → chunk-WC5TS2S6.js} +2 -2
  22. package/dist/{chunk-BAYWBZ32.js.map → chunk-WC5TS2S6.js.map} +1 -1
  23. package/dist/{cleanup-QV2EBF6M.js → cleanup-YTWIGG6Y.js} +5 -5
  24. package/dist/{cleanup-command-DTE64KTN.js → cleanup-command-A6TNHIGM.js} +6 -6
  25. package/dist/cli.js +86 -139
  26. package/dist/cli.js.map +1 -1
  27. package/dist/{clients-N4UXDPCN.js → clients-IP2Q34UF.js} +2 -2
  28. package/dist/{codex-bootstrap-7OUYHP4G.js → codex-bootstrap-4WFWXI6O.js} +6 -6
  29. package/dist/{codex-hook-VHGSPJN3.js → codex-hook-ETLEIIPX.js} +5 -5
  30. package/dist/{codify-DJELEKJ6.js → codify-FKJ2RJGS.js} +2 -2
  31. package/dist/{commands-4NIKNAST.js → commands-477D5ZD5.js} +14 -14
  32. package/dist/{config-5A4LJ62T.js → config-IP5WQRYO.js} +2 -2
  33. package/dist/{configured-paths-ZY2GRPYU.js → configured-paths-47VDJKHN.js} +2 -2
  34. package/dist/{contract-ZRRRAQWZ.js → contract-ZLV6PYDI.js} +2 -2
  35. package/dist/{coordinator-ZPEXUBXT.js → coordinator-Z2S7FSMS.js} +126 -44
  36. package/dist/coordinator-Z2S7FSMS.js.map +1 -0
  37. package/dist/{corpus-ZJQNIU4R.js → corpus-PKNLZ7GC.js} +2 -2
  38. package/dist/{doctor-HUUE7QWE.js → doctor-KTJUJQ53.js} +8 -8
  39. package/dist/{feature-directories-7ACGMPS4.js → feature-directories-7PFGK7KC.js} +2 -2
  40. package/dist/{finalization-5D5N64R7.js → finalization-HHMXBNF7.js} +2 -2
  41. package/dist/{gh-cli-46VSKW2O.js → gh-cli-KN36UK43.js} +2 -2
  42. package/dist/{github-rest-SXLBFCQP.js → github-rest-GKK6Z37R.js} +2 -2
  43. package/dist/index.js +1 -1
  44. package/dist/{job-EW5LWBHH.js → job-SACUWGSO.js} +257 -87
  45. package/dist/job-SACUWGSO.js.map +1 -0
  46. package/dist/{learning-sync-DRQM2JF6.js → learning-sync-7DDQNFQP.js} +2 -2
  47. package/dist/{legacy-global-guidance-DWGAGL44.js → legacy-global-guidance-J4WABP77.js} +2 -2
  48. package/dist/{lint-gherkin-5LJX6BBU.js → lint-gherkin-CE2XPYYZ.js} +2 -2
  49. package/dist/{operations-5CJI6U6T.js → operations-LIPXS36Q.js} +6 -6
  50. package/dist/{output-5TOP54O5.js → output-DIYV2DNH.js} +2 -2
  51. package/dist/{packet-IHZNYM3G.js → packet-EQCYVUAR.js} +2 -2
  52. package/dist/presets/typescript/index.js +1 -1
  53. package/dist/{profile-ZZGSSTSJ.js → profile-W37PC6XF.js} +2 -2
  54. package/dist/{prompt-C3MNQKAT.js → prompt-BVYBTS27.js} +2 -2
  55. package/dist/{remove-PRBJCO6G.js → remove-JYE44XLE.js} +6 -6
  56. package/dist/{retro-Z2DREW77.js → retro-QWZRWEQ3.js} +8 -8
  57. package/dist/{retro-draft-spool-YVNO4VSB.js → retro-draft-spool-5FE34GCI.js} +2 -2
  58. package/dist/{retro-extract-NBSIY4ZY.js → retro-extract-3NAABYBR.js} +2 -2
  59. package/dist/{review-pr-TTJKQC4H.js → review-pr-B5UNG7VK.js} +2 -2
  60. package/dist/{review-pr-publication-DR75RPF4.js → review-pr-publication-QLZARNY7.js} +2 -2
  61. package/dist/{run-5JWZAFET.js → run-OUM433SE.js} +2 -2
  62. package/dist/{self-report-3KBA5TG7.js → self-report-SATNMY6R.js} +2 -2
  63. package/dist/{status-OFXGT5ZO.js → status-HINDYZMQ.js} +5 -5
  64. package/dist/{status-K62NWMZ6.js → status-W4CN6RBQ.js} +8 -8
  65. package/dist/{sync-config-B62CJ5OS.js → sync-config-KDQCXYM7.js} +2 -2
  66. package/dist/{sync-tracker-QMPXXLJ4.js → sync-tracker-DIVSOQIT.js} +2 -2
  67. package/dist/{test-execution-MCMXLV5O.js → test-execution-O4FHAJRK.js} +2 -2
  68. package/dist/{test-plan-RJTKHEYA.js → test-plan-RFRDI6IA.js} +2 -2
  69. package/dist/{ticket-new-RPLN56XK.js → ticket-new-IXLYLQMF.js} +2 -2
  70. package/dist/{ticket-sync-VHTAPISH.js → ticket-sync-HVJJS2AB.js} +2 -2
  71. package/dist/{tracker-map-WFRDFSKN.js → tracker-map-BGA4U7NY.js} +2 -2
  72. package/dist/{tracker-sync-5D4XNQHS.js → tracker-sync-4MKDLRJ7.js} +2 -2
  73. package/package.json +1 -1
  74. package/templates/hooks/codex/pre-tool-quality.ts +8 -1
  75. package/templates/hooks/cursor/before-shell-execution.ts +2 -1
  76. package/templates/hooks/lib/closeout-binding.ts +130 -31
  77. package/templates/hooks/pre-tool-quality.ts +1 -1
  78. package/templates/hooks/run-review.ts +94 -5
  79. package/templates/hooks/session-codex-start.ts +4 -1
  80. package/templates/scripts/closeout-cleanup.ts +33 -55
  81. package/dist/coordinator-ZPEXUBXT.js.map +0 -1
  82. package/dist/job-EW5LWBHH.js.map +0 -1
  83. /package/dist/{architecture-4EIJWLZ2.js.map → architecture-ETYFQUVX.js.map} +0 -0
  84. /package/dist/{architecture-document-Z3GLUOE3.js.map → architecture-document-OJYNUG42.js.map} +0 -0
  85. /package/dist/{architecture-monorepo-EIF3E3L3.js.map → architecture-monorepo-QVTZ6COC.js.map} +0 -0
  86. /package/dist/{boundary-U5U2PSX2.js.map → boundary-7LNKC6GG.js.map} +0 -0
  87. /package/dist/{chunk-VUWQD4AG.js.map → chunk-3SOJBMM6.js.map} +0 -0
  88. /package/dist/{chunk-JZFZWY3K.js.map → chunk-4CKCRZDO.js.map} +0 -0
  89. /package/dist/{chunk-7KMQ3QPX.js.map → chunk-5ITCCDTH.js.map} +0 -0
  90. /package/dist/{chunk-3ETWYWGQ.js.map → chunk-A2IG7JPA.js.map} +0 -0
  91. /package/dist/{chunk-SLRSGK2C.js.map → chunk-DS3IXWDV.js.map} +0 -0
  92. /package/dist/{chunk-AQU52TJM.js.map → chunk-F5353NJG.js.map} +0 -0
  93. /package/dist/{chunk-C377VEWH.js.map → chunk-GZ36UZJG.js.map} +0 -0
  94. /package/dist/{chunk-4AIRSIOH.js.map → chunk-H5IFRCB6.js.map} +0 -0
  95. /package/dist/{chunk-FASTWBPY.js.map → chunk-PGLSVXYF.js.map} +0 -0
  96. /package/dist/{chunk-RXQJH4LM.js.map → chunk-S7PWPVQB.js.map} +0 -0
  97. /package/dist/{cleanup-QV2EBF6M.js.map → cleanup-YTWIGG6Y.js.map} +0 -0
  98. /package/dist/{cleanup-command-DTE64KTN.js.map → cleanup-command-A6TNHIGM.js.map} +0 -0
  99. /package/dist/{clients-N4UXDPCN.js.map → clients-IP2Q34UF.js.map} +0 -0
  100. /package/dist/{codex-bootstrap-7OUYHP4G.js.map → codex-bootstrap-4WFWXI6O.js.map} +0 -0
  101. /package/dist/{codex-hook-VHGSPJN3.js.map → codex-hook-ETLEIIPX.js.map} +0 -0
  102. /package/dist/{codify-DJELEKJ6.js.map → codify-FKJ2RJGS.js.map} +0 -0
  103. /package/dist/{commands-4NIKNAST.js.map → commands-477D5ZD5.js.map} +0 -0
  104. /package/dist/{config-5A4LJ62T.js.map → config-IP5WQRYO.js.map} +0 -0
  105. /package/dist/{configured-paths-ZY2GRPYU.js.map → configured-paths-47VDJKHN.js.map} +0 -0
  106. /package/dist/{contract-ZRRRAQWZ.js.map → contract-ZLV6PYDI.js.map} +0 -0
  107. /package/dist/{corpus-ZJQNIU4R.js.map → corpus-PKNLZ7GC.js.map} +0 -0
  108. /package/dist/{doctor-HUUE7QWE.js.map → doctor-KTJUJQ53.js.map} +0 -0
  109. /package/dist/{feature-directories-7ACGMPS4.js.map → feature-directories-7PFGK7KC.js.map} +0 -0
  110. /package/dist/{finalization-5D5N64R7.js.map → finalization-HHMXBNF7.js.map} +0 -0
  111. /package/dist/{gh-cli-46VSKW2O.js.map → gh-cli-KN36UK43.js.map} +0 -0
  112. /package/dist/{github-rest-SXLBFCQP.js.map → github-rest-GKK6Z37R.js.map} +0 -0
  113. /package/dist/{learning-sync-DRQM2JF6.js.map → learning-sync-7DDQNFQP.js.map} +0 -0
  114. /package/dist/{legacy-global-guidance-DWGAGL44.js.map → legacy-global-guidance-J4WABP77.js.map} +0 -0
  115. /package/dist/{lint-gherkin-5LJX6BBU.js.map → lint-gherkin-CE2XPYYZ.js.map} +0 -0
  116. /package/dist/{operations-5CJI6U6T.js.map → operations-LIPXS36Q.js.map} +0 -0
  117. /package/dist/{output-5TOP54O5.js.map → output-DIYV2DNH.js.map} +0 -0
  118. /package/dist/{packet-IHZNYM3G.js.map → packet-EQCYVUAR.js.map} +0 -0
  119. /package/dist/{profile-ZZGSSTSJ.js.map → profile-W37PC6XF.js.map} +0 -0
  120. /package/dist/{prompt-C3MNQKAT.js.map → prompt-BVYBTS27.js.map} +0 -0
  121. /package/dist/{remove-PRBJCO6G.js.map → remove-JYE44XLE.js.map} +0 -0
  122. /package/dist/{retro-Z2DREW77.js.map → retro-QWZRWEQ3.js.map} +0 -0
  123. /package/dist/{retro-draft-spool-YVNO4VSB.js.map → retro-draft-spool-5FE34GCI.js.map} +0 -0
  124. /package/dist/{retro-extract-NBSIY4ZY.js.map → retro-extract-3NAABYBR.js.map} +0 -0
  125. /package/dist/{review-pr-TTJKQC4H.js.map → review-pr-B5UNG7VK.js.map} +0 -0
  126. /package/dist/{review-pr-publication-DR75RPF4.js.map → review-pr-publication-QLZARNY7.js.map} +0 -0
  127. /package/dist/{run-5JWZAFET.js.map → run-OUM433SE.js.map} +0 -0
  128. /package/dist/{self-report-3KBA5TG7.js.map → self-report-SATNMY6R.js.map} +0 -0
  129. /package/dist/{status-K62NWMZ6.js.map → status-HINDYZMQ.js.map} +0 -0
  130. /package/dist/{status-OFXGT5ZO.js.map → status-W4CN6RBQ.js.map} +0 -0
  131. /package/dist/{sync-config-B62CJ5OS.js.map → sync-config-KDQCXYM7.js.map} +0 -0
  132. /package/dist/{sync-tracker-QMPXXLJ4.js.map → sync-tracker-DIVSOQIT.js.map} +0 -0
  133. /package/dist/{test-execution-MCMXLV5O.js.map → test-execution-O4FHAJRK.js.map} +0 -0
  134. /package/dist/{test-plan-RJTKHEYA.js.map → test-plan-RFRDI6IA.js.map} +0 -0
  135. /package/dist/{ticket-new-RPLN56XK.js.map → ticket-new-IXLYLQMF.js.map} +0 -0
  136. /package/dist/{ticket-sync-VHTAPISH.js.map → ticket-sync-HVJJS2AB.js.map} +0 -0
  137. /package/dist/{tracker-map-WFRDFSKN.js.map → tracker-map-BGA4U7NY.js.map} +0 -0
  138. /package/dist/{tracker-sync-5D4XNQHS.js.map → tracker-sync-4MKDLRJ7.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "safeword",
3
- "version": "0.78.0",
3
+ "version": "0.78.1",
4
4
  "description": "Safeword workflow guidance and gates for Codex.",
5
5
  "author": {
6
6
  "name": "Arcade AI"
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "bunx --bun safeword@0.78.0 hook codex session-start --plugin-hook",
9
+ "command": "bunx --bun safeword@0.78.1 hook codex session-start --plugin-hook",
10
10
  "timeout": 120,
11
11
  "statusMessage": "Loading Safeword standing instructions"
12
12
  }
@@ -19,7 +19,7 @@
19
19
  "hooks": [
20
20
  {
21
21
  "type": "command",
22
- "command": "bunx --bun safeword@0.78.0 hook codex pre-tool-use --plugin-hook",
22
+ "command": "bunx --bun safeword@0.78.1 hook codex pre-tool-use --plugin-hook",
23
23
  "timeout": 30,
24
24
  "statusMessage": "Checking Safeword edit gates"
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "hooks": [
33
33
  {
34
34
  "type": "command",
35
- "command": "bunx --bun safeword@0.78.0 hook codex post-tool-use --plugin-hook",
35
+ "command": "bunx --bun safeword@0.78.1 hook codex post-tool-use --plugin-hook",
36
36
  "timeout": 30,
37
37
  "statusMessage": "Surfacing Safeword post-tool context"
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "hooks": [
46
46
  {
47
47
  "type": "command",
48
- "command": "bunx --bun safeword@0.78.0 hook codex user-prompt-submit --plugin-hook",
48
+ "command": "bunx --bun safeword@0.78.1 hook codex user-prompt-submit --plugin-hook",
49
49
  "timeout": 30,
50
50
  "statusMessage": "Checking queued Safeword prompt context"
51
51
  }
@@ -58,7 +58,7 @@
58
58
  "hooks": [
59
59
  {
60
60
  "type": "command",
61
- "command": "bunx --bun safeword@0.78.0 hook codex stop --plugin-hook",
61
+ "command": "bunx --bun safeword@0.78.1 hook codex stop --plugin-hook",
62
62
  "timeout": 600,
63
63
  "statusMessage": "Checking Safeword stop continuation"
64
64
  }
@@ -25,7 +25,7 @@ import {
25
25
  readJson,
26
26
  writeJson
27
27
  } from "./chunk-S2T356DA.js";
28
- import "./chunk-BAYWBZ32.js";
28
+ import "./chunk-WC5TS2S6.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-4EIJWLZ2.js.map
653
+ //# sourceMappingURL=architecture-ETYFQUVX.js.map
@@ -11,7 +11,7 @@ import {
11
11
  import "./chunk-3EJNDIAO.js";
12
12
  import "./chunk-GKR44BCH.js";
13
13
  import "./chunk-S2T356DA.js";
14
- import "./chunk-BAYWBZ32.js";
14
+ import "./chunk-WC5TS2S6.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-Z3GLUOE3.js.map
25
+ //# sourceMappingURL=architecture-document-OJYNUG42.js.map
@@ -5,11 +5,11 @@ import {
5
5
  monorepoFingerprintOf
6
6
  } from "./chunk-3EJNDIAO.js";
7
7
  import "./chunk-S2T356DA.js";
8
- import "./chunk-BAYWBZ32.js";
8
+ import "./chunk-WC5TS2S6.js";
9
9
  export {
10
10
  discoverUnreadableWorkspaces,
11
11
  discoverWorkspaces,
12
12
  extractMonorepoArchitectureSnapshot,
13
13
  monorepoFingerprintOf
14
14
  };
15
- //# sourceMappingURL=architecture-monorepo-EIF3E3L3.js.map
15
+ //# sourceMappingURL=architecture-monorepo-QVTZ6COC.js.map
@@ -25,7 +25,7 @@ import {
25
25
  import {
26
26
  readFileSafe
27
27
  } from "./chunk-S2T356DA.js";
28
- import "./chunk-BAYWBZ32.js";
28
+ import "./chunk-WC5TS2S6.js";
29
29
 
30
30
  // src/commands/boundary.ts
31
31
  import { execFileSync as execFileSync2 } from "child_process";
@@ -630,4 +630,4 @@ function boundary(options) {
630
630
  export {
631
631
  boundary
632
632
  };
633
- //# sourceMappingURL=boundary-U5U2PSX2.js.map
633
+ //# sourceMappingURL=boundary-7LNKC6GG.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  legacyObservationIsEmpty,
3
3
  observeClaudeLegacy
4
- } from "./chunk-JZFZWY3K.js";
4
+ } from "./chunk-4CKCRZDO.js";
5
5
  import {
6
6
  observeApplicableClaudePlugins
7
7
  } from "./chunk-664YNAMR.js";
@@ -306,4 +306,4 @@ export {
306
306
  equivalentClaudeInstallations,
307
307
  observeClaudeStatus
308
308
  };
309
- //# sourceMappingURL=chunk-VUWQD4AG.js.map
309
+ //# sourceMappingURL=chunk-3SOJBMM6.js.map
@@ -2,7 +2,7 @@ import {
2
2
  cataloguedClaudeLegacyPaths,
3
3
  isAcceptedHistoricalFile,
4
4
  isAcceptedHistoricalHook
5
- } from "./chunk-E4UMSKEX.js";
5
+ } from "./chunk-NSZGI7HK.js";
6
6
 
7
7
  // src/claude-plugin/cleanup-target.ts
8
8
  import { existsSync, lstatSync } from "fs";
@@ -119,4 +119,4 @@ export {
119
119
  observeClaudeLegacy,
120
120
  legacyObservationIsEmpty
121
121
  };
122
- //# sourceMappingURL=chunk-JZFZWY3K.js.map
122
+ //# sourceMappingURL=chunk-4CKCRZDO.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SAFEWORD_SCHEMA
3
- } from "./chunk-4AIRSIOH.js";
3
+ } from "./chunk-H5IFRCB6.js";
4
4
  import {
5
5
  CODEX_MIGRATION_SCHEMA
6
6
  } from "./chunk-AVAUUIDB.js";
@@ -562,4 +562,4 @@ export {
562
562
  codexSessionProofIsCurrent,
563
563
  observeCodexHookProof
564
564
  };
565
- //# sourceMappingURL=chunk-7KMQ3QPX.js.map
565
+ //# sourceMappingURL=chunk-5ITCCDTH.js.map
@@ -3,7 +3,7 @@ import {
3
3
  observeCursorProject,
4
4
  projectLifecycleSchema,
5
5
  unselectedCursorFinding
6
- } from "./chunk-RXQJH4LM.js";
6
+ } from "./chunk-S7PWPVQB.js";
7
7
  import {
8
8
  detectPackageManager
9
9
  } from "./chunk-6S7CTKGC.js";
@@ -78,11 +78,11 @@ async function observeLifecycleSurfaces(cwd, agents, environment = process.env)
78
78
  const project = await observeStatus(cwd, agents, environment);
79
79
  const surfaces = [{ name: "project", result: project }];
80
80
  if (agents.includes("claude")) {
81
- const { observeClaudeStatus } = await import("./status-OFXGT5ZO.js");
81
+ const { observeClaudeStatus } = await import("./status-HINDYZMQ.js");
82
82
  surfaces.push({ name: "claude", result: observeClaudeStatus(cwd) });
83
83
  }
84
84
  if (agents.includes("codex")) {
85
- const { observeCodexMigration } = await import("./operations-5CJI6U6T.js");
85
+ const { observeCodexMigration } = await import("./operations-LIPXS36Q.js");
86
86
  surfaces.push({ name: "codex", result: observeCodexMigration(cwd, environment) });
87
87
  }
88
88
  if (agents.includes("cursor")) {
@@ -238,4 +238,4 @@ export {
238
238
  summarizeLifecycleStatus,
239
239
  observeLifecycleStatus
240
240
  };
241
- //# sourceMappingURL=chunk-3ETWYWGQ.js.map
241
+ //# sourceMappingURL=chunk-A2IG7JPA.js.map
@@ -4,10 +4,10 @@ import {
4
4
  legacyCommandIdentity,
5
5
  observeCodexHookProof,
6
6
  writeCodexActivationMarker
7
- } from "./chunk-7KMQ3QPX.js";
7
+ } from "./chunk-5ITCCDTH.js";
8
8
  import {
9
9
  SAFEWORD_SCHEMA
10
- } from "./chunk-4AIRSIOH.js";
10
+ } from "./chunk-H5IFRCB6.js";
11
11
  import {
12
12
  legacyGlobalGuidanceDiagnostic,
13
13
  observeLegacyGlobalGuidance
@@ -1344,4 +1344,4 @@ export {
1344
1344
  migrateCodexPlugin,
1345
1345
  recoverCodexMigration
1346
1346
  };
1347
- //# sourceMappingURL=chunk-SLRSGK2C.js.map
1347
+ //# sourceMappingURL=chunk-DS3IXWDV.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-Q5KLE6ZF.js";
5
5
  import {
6
6
  setupPythonTooling
7
- } from "./chunk-4AIRSIOH.js";
7
+ } from "./chunk-H5IFRCB6.js";
8
8
  import {
9
9
  SAFEWORD_PRIMARY_LINT_SCRIPT,
10
10
  detect
@@ -1646,4 +1646,4 @@ export {
1646
1646
  LEFTHOOK_CONFIGS,
1647
1647
  createProjectContext
1648
1648
  };
1649
- //# sourceMappingURL=chunk-AQU52TJM.js.map
1649
+ //# sourceMappingURL=chunk-F5353NJG.js.map
@@ -0,0 +1,122 @@
1
+ // src/cli-protocol/policy.ts
2
+ var EFFECT_NOUNS = {
3
+ files: "file",
4
+ packages: "package",
5
+ configuration: "configuration",
6
+ network: "network",
7
+ destructive: "destructive"
8
+ };
9
+ function firstNonEmptyEffect(effects) {
10
+ return Object.keys(effects).find(
11
+ (effectClass) => effects[effectClass].length > 0
12
+ );
13
+ }
14
+ function assertNetworkPolicy(definition, result, offline) {
15
+ if (offline && result.effects.network.length > 0) {
16
+ throw new Error(`Command ${definition.name} reported network effects while running offline`);
17
+ }
18
+ if (definition.networkPolicy === "never" && result.effects.network.length > 0) {
19
+ throw new Error(`Command ${definition.name} reported undeclared network effects`);
20
+ }
21
+ }
22
+ function assertEffectPolicy(definition, result, options) {
23
+ assertNetworkPolicy(definition, result, options.offline);
24
+ if (definition.effectClass === "observe" || definition.effectClass === "plan") {
25
+ const effectClass = firstNonEmptyEffect(result.effects);
26
+ if (effectClass !== void 0) {
27
+ throw new Error(
28
+ `The ${definition.effectClass} command ${definition.name} reported ${EFFECT_NOUNS[effectClass]} effects`
29
+ );
30
+ }
31
+ }
32
+ if (definition.effectClass === "hook" && (result.effects.packages.length > 0 || result.effects.network.length > 0 || result.effects.destructive.length > 0)) {
33
+ throw new Error(`Hook command ${definition.name} reported forbidden lifecycle effects`);
34
+ }
35
+ }
36
+ var MANAGED_PROGRESS_SIGNAL = "SAFEWORD_REVIEW_PROGRESS";
37
+ function consumeManagedProgressSignal(environment) {
38
+ const enabled = environment[MANAGED_PROGRESS_SIGNAL] === "1";
39
+ Reflect.deleteProperty(environment, MANAGED_PROGRESS_SIGNAL);
40
+ return enabled;
41
+ }
42
+ function shouldReportProgress(options) {
43
+ return !options.quiet && (!options.json || options.managedReview);
44
+ }
45
+ function createBestEffortByteSink(write) {
46
+ return (buffer) => {
47
+ let offset = 0;
48
+ try {
49
+ while (offset < buffer.length) {
50
+ const written = write(buffer, offset, buffer.length - offset);
51
+ if (!Number.isSafeInteger(written) || written <= 0 || written > buffer.length - offset) {
52
+ return;
53
+ }
54
+ offset += written;
55
+ }
56
+ } catch {
57
+ }
58
+ };
59
+ }
60
+ function createBestEffortProgressSink(write) {
61
+ const writeBytes = createBestEffortByteSink(write);
62
+ return (message) => {
63
+ writeBytes(Buffer.from(`${message}
64
+ `));
65
+ };
66
+ }
67
+ function createManagedReviewProgress(progress) {
68
+ return { ...progress, managed: true };
69
+ }
70
+ var PROGRESS_ANNOUNCE_DELAY_MS = 100;
71
+ var PROGRESS_HEARTBEAT_INTERVAL_MS = 3e4;
72
+ function resolveHeartbeatIntervalMs(environment = process.env) {
73
+ if (environment.NODE_ENV !== "test") return PROGRESS_HEARTBEAT_INTERVAL_MS;
74
+ const override = Number(environment.SAFEWORD_PROGRESS_HEARTBEAT_MS);
75
+ if (!Number.isSafeInteger(override) || override < 1 || override > PROGRESS_HEARTBEAT_INTERVAL_MS) {
76
+ return PROGRESS_HEARTBEAT_INTERVAL_MS;
77
+ }
78
+ return override;
79
+ }
80
+ function createProgressReporter(adapters) {
81
+ let announcementHandle;
82
+ let heartbeatHandle;
83
+ const heartbeatIntervalMs = resolveHeartbeatIntervalMs();
84
+ function scheduleHeartbeat(message) {
85
+ heartbeatHandle = adapters.schedule(() => {
86
+ adapters.emit(message);
87
+ scheduleHeartbeat(message);
88
+ }, heartbeatIntervalMs);
89
+ }
90
+ return {
91
+ start(message) {
92
+ if (announcementHandle !== void 0) adapters.cancel(announcementHandle);
93
+ if (heartbeatHandle !== void 0) adapters.cancel(heartbeatHandle);
94
+ heartbeatHandle = void 0;
95
+ announcementHandle = adapters.schedule(() => {
96
+ adapters.emit(message);
97
+ announcementHandle = void 0;
98
+ }, PROGRESS_ANNOUNCE_DELAY_MS);
99
+ },
100
+ heartbeat(message) {
101
+ if (heartbeatHandle !== void 0) adapters.cancel(heartbeatHandle);
102
+ scheduleHeartbeat(message);
103
+ },
104
+ stop() {
105
+ if (announcementHandle !== void 0) adapters.cancel(announcementHandle);
106
+ if (heartbeatHandle !== void 0) adapters.cancel(heartbeatHandle);
107
+ announcementHandle = void 0;
108
+ heartbeatHandle = void 0;
109
+ }
110
+ };
111
+ }
112
+
113
+ export {
114
+ assertEffectPolicy,
115
+ consumeManagedProgressSignal,
116
+ shouldReportProgress,
117
+ createBestEffortByteSink,
118
+ createBestEffortProgressSink,
119
+ createManagedReviewProgress,
120
+ createProgressReporter
121
+ };
122
+ //# sourceMappingURL=chunk-FV2S4LAR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-protocol/policy.ts"],"sourcesContent":["import type { CommandDefinition } from './catalog.js';\nimport type { ProgressReporter } from './handler.js';\nimport type { CliResult, Effects } from './result.js';\n\nconst EFFECT_NOUNS: Readonly<Record<keyof Effects, string>> = {\n files: 'file',\n packages: 'package',\n configuration: 'configuration',\n network: 'network',\n destructive: 'destructive',\n};\n\nfunction firstNonEmptyEffect(effects: Effects): keyof Effects | undefined {\n return (Object.keys(effects) as (keyof Effects)[]).find(\n effectClass => effects[effectClass].length > 0,\n );\n}\n\nfunction assertNetworkPolicy(\n definition: CommandDefinition,\n result: CliResult,\n offline: boolean,\n): void {\n if (offline && result.effects.network.length > 0) {\n throw new Error(`Command ${definition.name} reported network effects while running offline`);\n }\n if (definition.networkPolicy === 'never' && result.effects.network.length > 0) {\n throw new Error(`Command ${definition.name} reported undeclared network effects`);\n }\n}\n\nexport function assertEffectPolicy(\n definition: CommandDefinition,\n result: CliResult,\n options: { offline: boolean },\n): void {\n assertNetworkPolicy(definition, result, options.offline);\n\n if (definition.effectClass === 'observe' || definition.effectClass === 'plan') {\n const effectClass = firstNonEmptyEffect(result.effects);\n if (effectClass !== undefined) {\n throw new Error(\n `The ${definition.effectClass} command ${definition.name} reported ${EFFECT_NOUNS[effectClass]} effects`,\n );\n }\n }\n\n if (\n definition.effectClass === 'hook' &&\n (result.effects.packages.length > 0 ||\n result.effects.network.length > 0 ||\n result.effects.destructive.length > 0)\n ) {\n throw new Error(`Hook command ${definition.name} reported forbidden lifecycle effects`);\n }\n}\n\ninterface ProgressAdapters {\n readonly schedule: (callback: () => void, delayMilliseconds: number) => unknown;\n readonly cancel: (handle: unknown) => void;\n readonly emit: (message: string) => void;\n}\n\nconst MANAGED_PROGRESS_SIGNAL = 'SAFEWORD_REVIEW_PROGRESS';\n\nexport function consumeManagedProgressSignal(environment: NodeJS.ProcessEnv): boolean {\n const enabled = environment[MANAGED_PROGRESS_SIGNAL] === '1';\n Reflect.deleteProperty(environment, MANAGED_PROGRESS_SIGNAL);\n return enabled;\n}\n\nexport function shouldReportProgress(options: {\n readonly json: boolean;\n readonly managedReview: boolean;\n readonly quiet: boolean;\n}): boolean {\n return !options.quiet && (!options.json || options.managedReview);\n}\n\nexport function createBestEffortByteSink(\n write: (buffer: Uint8Array, offset: number, length: number) => number,\n): (buffer: Uint8Array) => void {\n return buffer => {\n let offset = 0;\n try {\n while (offset < buffer.length) {\n const written = write(buffer, offset, buffer.length - offset);\n if (!Number.isSafeInteger(written) || written <= 0 || written > buffer.length - offset) {\n return;\n }\n offset += written;\n }\n } catch {\n // Progress is advisory and must never affect the typed command result.\n }\n };\n}\n\nexport function createBestEffortProgressSink(\n write: (buffer: Uint8Array, offset: number, length: number) => number,\n): (message: string) => void {\n const writeBytes = createBestEffortByteSink(write);\n return message => {\n writeBytes(Buffer.from(`${message}\\n`));\n };\n}\n\nexport function createManagedReviewProgress(progress: ProgressReporter): ProgressReporter {\n return { ...progress, managed: true };\n}\n\n/** Operations finishing faster than this are not worth announcing. */\nconst PROGRESS_ANNOUNCE_DELAY_MS = 100;\n/** A long wait needs proof that the coordinator is still responsive. */\nconst PROGRESS_HEARTBEAT_INTERVAL_MS = 30_000;\n\n/**\n * Shorten the heartbeat so a test can observe a real one without waiting 30\n * seconds. Internal and test-only: production always uses the bounded default.\n */\nexport function resolveHeartbeatIntervalMs(environment: NodeJS.ProcessEnv = process.env): number {\n if (environment.NODE_ENV !== 'test') return PROGRESS_HEARTBEAT_INTERVAL_MS;\n const override = Number(environment.SAFEWORD_PROGRESS_HEARTBEAT_MS);\n if (\n !Number.isSafeInteger(override) ||\n override < 1 ||\n override > PROGRESS_HEARTBEAT_INTERVAL_MS\n ) {\n return PROGRESS_HEARTBEAT_INTERVAL_MS;\n }\n return override;\n}\n\nexport function createProgressReporter(adapters: ProgressAdapters): ProgressReporter {\n let announcementHandle: unknown;\n let heartbeatHandle: unknown;\n const heartbeatIntervalMs = resolveHeartbeatIntervalMs();\n\n function scheduleHeartbeat(message: string): void {\n heartbeatHandle = adapters.schedule(() => {\n adapters.emit(message);\n scheduleHeartbeat(message);\n }, heartbeatIntervalMs);\n }\n\n return {\n start(message: string): void {\n if (announcementHandle !== undefined) adapters.cancel(announcementHandle);\n if (heartbeatHandle !== undefined) adapters.cancel(heartbeatHandle);\n heartbeatHandle = undefined;\n announcementHandle = adapters.schedule(() => {\n adapters.emit(message);\n announcementHandle = undefined;\n }, PROGRESS_ANNOUNCE_DELAY_MS);\n },\n heartbeat(message: string): void {\n if (heartbeatHandle !== undefined) adapters.cancel(heartbeatHandle);\n scheduleHeartbeat(message);\n },\n stop(): void {\n if (announcementHandle !== undefined) adapters.cancel(announcementHandle);\n if (heartbeatHandle !== undefined) adapters.cancel(heartbeatHandle);\n announcementHandle = undefined;\n heartbeatHandle = undefined;\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  assertSafeClaudeCleanupTarget,
3
3
  containedClaudeCleanupPath,
4
4
  observeClaudeLegacy
5
- } from "./chunk-JZFZWY3K.js";
5
+ } from "./chunk-4CKCRZDO.js";
6
6
  import {
7
7
  canonicalClaudeProjectRoot
8
8
  } from "./chunk-34NCOTP5.js";
@@ -19,7 +19,7 @@ import {
19
19
  cataloguedClaudeLegacyPaths,
20
20
  isAcceptedHistoricalFile,
21
21
  isAcceptedHistoricalHook
22
- } from "./chunk-E4UMSKEX.js";
22
+ } from "./chunk-NSZGI7HK.js";
23
23
  import {
24
24
  writeDurableFile,
25
25
  writeDurableFileExclusive
@@ -833,4 +833,4 @@ export {
833
833
  migrateClaudeLegacyAutomatically,
834
834
  recoverClaudeCleanup
835
835
  };
836
- //# sourceMappingURL=chunk-C377VEWH.js.map
836
+ //# sourceMappingURL=chunk-GZ36UZJG.js.map
@@ -14,7 +14,7 @@ import {
14
14
  acceptedHistoricalHookEntries,
15
15
  filterOutEquivalentSafewordHooks,
16
16
  filterOutSafewordHooks
17
- } from "./chunk-E4UMSKEX.js";
17
+ } from "./chunk-NSZGI7HK.js";
18
18
  import {
19
19
  VERSION
20
20
  } from "./chunk-UAFM77KW.js";
@@ -3170,4 +3170,4 @@ export {
3170
3170
  isCursorProjectPath,
3171
3171
  schemaForProjectSurfaces
3172
3172
  };
3173
- //# sourceMappingURL=chunk-4AIRSIOH.js.map
3173
+ //# sourceMappingURL=chunk-H5IFRCB6.js.map
@@ -114,7 +114,7 @@ var CLAUDE_HISTORICAL_CATALOGUE = {
114
114
  ".safeword/hooks/pre-tool-config-guard.ts": "6bae1971493bc8fae0ce30db07f14a93ad660af11ca9fdf93518b23102d4f084",
115
115
  ".safeword/hooks/pre-tool-dependency-readiness.ts": "d23343dc3185916140a4b25572f3bb413aece93311f5084444c0debe188f85b8",
116
116
  ".safeword/hooks/pre-tool-git-bare-fix.sh": "0c75b7be01af1312cbbe86cf5964fb23520c8b9ef90f49075dd74e27ba58d414",
117
- ".safeword/hooks/pre-tool-quality.ts": "333f73426106e09d3ce2ec0b2b1681cfb6923a33e5ee0acc1265134eb2fd39b7",
117
+ ".safeword/hooks/pre-tool-quality.ts": "b97d1639e4598197baa11c71d640f0cbff79f5bf72b38736ad1f4484bb06e1cf",
118
118
  ".safeword/hooks/pre-tool-stale-main.ts": "cec806aeb0bfd132d45102eab631155da82b48869f4159cb49cf205d354c3e7e",
119
119
  ".safeword/hooks/prompt-questions.ts": "57182cccb8550bb2b585c27672bc9bfef56f4688d0afc1afc18bf52661b7c2a6",
120
120
  ".safeword/hooks/prompt-retro-nudge.ts": "78353d6f47adb0ed9969e83b40429d5792a98789dff67ec0bc4d5a024b1da457",
@@ -1571,4 +1571,4 @@ export {
1571
1571
  acceptedHistoricalHookEntries,
1572
1572
  cataloguedClaudeLegacyPaths
1573
1573
  };
1574
- //# sourceMappingURL=chunk-E4UMSKEX.js.map
1574
+ //# sourceMappingURL=chunk-NSZGI7HK.js.map