mewkit 1.13.0 → 1.14.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 (223) hide show
  1. package/README.md +37 -0
  2. package/dist/commands/migrate.d.ts +2 -0
  3. package/dist/commands/migrate.d.ts.map +1 -1
  4. package/dist/commands/migrate.js +2 -0
  5. package/dist/commands/migrate.js.map +1 -1
  6. package/dist/commands/validate.js +14 -7
  7. package/dist/commands/validate.js.map +1 -1
  8. package/dist/index.js +11 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/migrate/apply-env-var-rewrites.d.ts +15 -0
  11. package/dist/migrate/apply-env-var-rewrites.d.ts.map +1 -0
  12. package/dist/migrate/apply-env-var-rewrites.js +26 -0
  13. package/dist/migrate/apply-env-var-rewrites.js.map +1 -0
  14. package/dist/migrate/config-merger/merge-single-sections.d.ts.map +1 -1
  15. package/dist/migrate/config-merger/merge-single-sections.js +4 -2
  16. package/dist/migrate/config-merger/merge-single-sections.js.map +1 -1
  17. package/dist/migrate/converters/command-to-codex-skill.d.ts +10 -0
  18. package/dist/migrate/converters/command-to-codex-skill.d.ts.map +1 -0
  19. package/dist/migrate/converters/command-to-codex-skill.js +88 -0
  20. package/dist/migrate/converters/command-to-codex-skill.js.map +1 -0
  21. package/dist/migrate/converters/direct-copy.d.ts +4 -1
  22. package/dist/migrate/converters/direct-copy.d.ts.map +1 -1
  23. package/dist/migrate/converters/direct-copy.js +19 -22
  24. package/dist/migrate/converters/direct-copy.js.map +1 -1
  25. package/dist/migrate/converters/fm-strip.d.ts.map +1 -1
  26. package/dist/migrate/converters/fm-strip.js +5 -1
  27. package/dist/migrate/converters/fm-strip.js.map +1 -1
  28. package/dist/migrate/converters/fm-to-codex-toml.d.ts +4 -1
  29. package/dist/migrate/converters/fm-to-codex-toml.d.ts.map +1 -1
  30. package/dist/migrate/converters/fm-to-codex-toml.js +8 -3
  31. package/dist/migrate/converters/fm-to-codex-toml.js.map +1 -1
  32. package/dist/migrate/converters/fm-to-fm.js +4 -4
  33. package/dist/migrate/converters/fm-to-fm.js.map +1 -1
  34. package/dist/migrate/converters/fm-to-json.d.ts.map +1 -1
  35. package/dist/migrate/converters/fm-to-json.js +2 -1
  36. package/dist/migrate/converters/fm-to-json.js.map +1 -1
  37. package/dist/migrate/converters/fm-to-yaml.js +1 -1
  38. package/dist/migrate/converters/fm-to-yaml.js.map +1 -1
  39. package/dist/migrate/converters/index.d.ts +7 -2
  40. package/dist/migrate/converters/index.d.ts.map +1 -1
  41. package/dist/migrate/converters/index.js +8 -8
  42. package/dist/migrate/converters/index.js.map +1 -1
  43. package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts +8 -0
  44. package/dist/migrate/converters/mcp-json-to-codex-toml.d.ts.map +1 -0
  45. package/dist/migrate/converters/mcp-json-to-codex-toml.js +65 -0
  46. package/dist/migrate/converters/mcp-json-to-codex-toml.js.map +1 -0
  47. package/dist/migrate/converters/md-strip.d.ts +10 -1
  48. package/dist/migrate/converters/md-strip.d.ts.map +1 -1
  49. package/dist/migrate/converters/md-strip.js +27 -70
  50. package/dist/migrate/converters/md-strip.js.map +1 -1
  51. package/dist/migrate/converters/md-to-kiro-steering.js +1 -1
  52. package/dist/migrate/converters/md-to-kiro-steering.js.map +1 -1
  53. package/dist/migrate/converters/md-to-mdc.js +1 -1
  54. package/dist/migrate/converters/md-to-mdc.js.map +1 -1
  55. package/dist/migrate/converters/md-to-toml.js +1 -1
  56. package/dist/migrate/converters/md-to-toml.js.map +1 -1
  57. package/dist/migrate/discovery/config-discovery.d.ts +29 -0
  58. package/dist/migrate/discovery/config-discovery.d.ts.map +1 -1
  59. package/dist/migrate/discovery/config-discovery.js +45 -0
  60. package/dist/migrate/discovery/config-discovery.js.map +1 -1
  61. package/dist/migrate/discovery/handlers-json-filter.d.ts.map +1 -1
  62. package/dist/migrate/discovery/handlers-json-filter.js +4 -2
  63. package/dist/migrate/discovery/handlers-json-filter.js.map +1 -1
  64. package/dist/migrate/discovery/hooks-discovery.d.ts +5 -0
  65. package/dist/migrate/discovery/hooks-discovery.d.ts.map +1 -1
  66. package/dist/migrate/discovery/hooks-discovery.js +21 -5
  67. package/dist/migrate/discovery/hooks-discovery.js.map +1 -1
  68. package/dist/migrate/hooks/codex-features-flag.d.ts.map +1 -1
  69. package/dist/migrate/hooks/codex-features-flag.js +21 -6
  70. package/dist/migrate/hooks/codex-features-flag.js.map +1 -1
  71. package/dist/migrate/hooks/codex-hook-wrapper.d.ts +15 -1
  72. package/dist/migrate/hooks/codex-hook-wrapper.d.ts.map +1 -1
  73. package/dist/migrate/hooks/codex-hook-wrapper.js +79 -8
  74. package/dist/migrate/hooks/codex-hook-wrapper.js.map +1 -1
  75. package/dist/migrate/hooks/codex-mcp-installer.d.ts +9 -0
  76. package/dist/migrate/hooks/codex-mcp-installer.d.ts.map +1 -0
  77. package/dist/migrate/hooks/codex-mcp-installer.js +65 -0
  78. package/dist/migrate/hooks/codex-mcp-installer.js.map +1 -0
  79. package/dist/migrate/hooks/codex-path-safety.d.ts +29 -0
  80. package/dist/migrate/hooks/codex-path-safety.d.ts.map +1 -1
  81. package/dist/migrate/hooks/codex-path-safety.js +36 -1
  82. package/dist/migrate/hooks/codex-path-safety.js.map +1 -1
  83. package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts +8 -0
  84. package/dist/migrate/hooks/codex-sh-wrapper-script.d.ts.map +1 -0
  85. package/dist/migrate/hooks/codex-sh-wrapper-script.js +118 -0
  86. package/dist/migrate/hooks/codex-sh-wrapper-script.js.map +1 -0
  87. package/dist/migrate/hooks/codex-shell-env-installer.d.ts +14 -0
  88. package/dist/migrate/hooks/codex-shell-env-installer.d.ts.map +1 -0
  89. package/dist/migrate/hooks/codex-shell-env-installer.js +82 -0
  90. package/dist/migrate/hooks/codex-shell-env-installer.js.map +1 -0
  91. package/dist/migrate/hooks/codex-toml-installer.d.ts +2 -0
  92. package/dist/migrate/hooks/codex-toml-installer.d.ts.map +1 -1
  93. package/dist/migrate/hooks/codex-toml-installer.js +18 -7
  94. package/dist/migrate/hooks/codex-toml-installer.js.map +1 -1
  95. package/dist/migrate/hooks/hooks-settings-merger.d.ts +3 -0
  96. package/dist/migrate/hooks/hooks-settings-merger.d.ts.map +1 -1
  97. package/dist/migrate/hooks/hooks-settings-merger.js +157 -21
  98. package/dist/migrate/hooks/hooks-settings-merger.js.map +1 -1
  99. package/dist/migrate/migrate-orchestrator.d.ts +19 -0
  100. package/dist/migrate/migrate-orchestrator.d.ts.map +1 -1
  101. package/dist/migrate/migrate-orchestrator.js +233 -26
  102. package/dist/migrate/migrate-orchestrator.js.map +1 -1
  103. package/dist/migrate/migrate-ui-summary.d.ts +25 -0
  104. package/dist/migrate/migrate-ui-summary.d.ts.map +1 -1
  105. package/dist/migrate/migrate-ui-summary.js +50 -0
  106. package/dist/migrate/migrate-ui-summary.js.map +1 -1
  107. package/dist/migrate/model-routing-config.d.ts +3 -1
  108. package/dist/migrate/model-routing-config.d.ts.map +1 -1
  109. package/dist/migrate/model-routing-config.js +28 -0
  110. package/dist/migrate/model-routing-config.js.map +1 -1
  111. package/dist/migrate/portability-policy.d.ts +3 -1
  112. package/dist/migrate/portability-policy.d.ts.map +1 -1
  113. package/dist/migrate/portability-policy.js +5 -31
  114. package/dist/migrate/portability-policy.js.map +1 -1
  115. package/dist/migrate/portable-installer.d.ts +17 -1
  116. package/dist/migrate/portable-installer.d.ts.map +1 -1
  117. package/dist/migrate/portable-installer.js +171 -9
  118. package/dist/migrate/portable-installer.js.map +1 -1
  119. package/dist/migrate/provider-registry-utils.d.ts.map +1 -1
  120. package/dist/migrate/provider-registry-utils.js +5 -0
  121. package/dist/migrate/provider-registry-utils.js.map +1 -1
  122. package/dist/migrate/providers/codex/capabilities.d.ts +6 -1
  123. package/dist/migrate/providers/codex/capabilities.d.ts.map +1 -1
  124. package/dist/migrate/providers/codex/capabilities.js +87 -0
  125. package/dist/migrate/providers/codex/capabilities.js.map +1 -1
  126. package/dist/migrate/providers/codex/config.d.ts.map +1 -1
  127. package/dist/migrate/providers/codex/config.js +27 -8
  128. package/dist/migrate/providers/codex/config.js.map +1 -1
  129. package/dist/migrate/providers/codex/contract.d.ts.map +1 -1
  130. package/dist/migrate/providers/codex/contract.js +4 -3
  131. package/dist/migrate/providers/codex/contract.js.map +1 -1
  132. package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts +27 -0
  133. package/dist/migrate/providers/codex/shell-env-policy-emitter.d.ts.map +1 -0
  134. package/dist/migrate/providers/codex/shell-env-policy-emitter.js +86 -0
  135. package/dist/migrate/providers/codex/shell-env-policy-emitter.js.map +1 -0
  136. package/dist/migrate/providers/provider-config-types.d.ts +1 -1
  137. package/dist/migrate/providers/provider-config-types.d.ts.map +1 -1
  138. package/dist/migrate/reconcile/index.d.ts +1 -1
  139. package/dist/migrate/reconcile/index.d.ts.map +1 -1
  140. package/dist/migrate/reconcile/index.js +1 -1
  141. package/dist/migrate/reconcile/index.js.map +1 -1
  142. package/dist/migrate/reconcile/portable-manifest.d.ts +18 -12
  143. package/dist/migrate/reconcile/portable-manifest.d.ts.map +1 -1
  144. package/dist/migrate/reconcile/portable-manifest.js +23 -0
  145. package/dist/migrate/reconcile/portable-manifest.js.map +1 -1
  146. package/dist/migrate/reconcile/portable-registry.d.ts +30 -30
  147. package/dist/migrate/reconcile/process-lock.d.ts.map +1 -1
  148. package/dist/migrate/reconcile/process-lock.js +10 -1
  149. package/dist/migrate/reconcile/process-lock.js.map +1 -1
  150. package/dist/migrate/reconcile/reconcile-state-builders.d.ts +12 -5
  151. package/dist/migrate/reconcile/reconcile-state-builders.d.ts.map +1 -1
  152. package/dist/migrate/reconcile/reconcile-state-builders.js +2 -2
  153. package/dist/migrate/reconcile/reconcile-state-builders.js.map +1 -1
  154. package/dist/migrate/references/codex-command-skill-path.d.ts +12 -0
  155. package/dist/migrate/references/codex-command-skill-path.d.ts.map +1 -0
  156. package/dist/migrate/references/codex-command-skill-path.js +27 -0
  157. package/dist/migrate/references/codex-command-skill-path.js.map +1 -0
  158. package/dist/migrate/references/env-var-rewrite-table.d.ts +36 -0
  159. package/dist/migrate/references/env-var-rewrite-table.d.ts.map +1 -0
  160. package/dist/migrate/references/env-var-rewrite-table.js +97 -0
  161. package/dist/migrate/references/env-var-rewrite-table.js.map +1 -0
  162. package/dist/migrate/references/fence-aware-reference-rewriter.d.ts +30 -0
  163. package/dist/migrate/references/fence-aware-reference-rewriter.d.ts.map +1 -0
  164. package/dist/migrate/references/fence-aware-reference-rewriter.js +182 -0
  165. package/dist/migrate/references/fence-aware-reference-rewriter.js.map +1 -0
  166. package/dist/migrate/references/reference-classifier.d.ts +27 -0
  167. package/dist/migrate/references/reference-classifier.d.ts.map +1 -0
  168. package/dist/migrate/references/reference-classifier.js +177 -0
  169. package/dist/migrate/references/reference-classifier.js.map +1 -0
  170. package/dist/migrate/references/reference-target-registry.d.ts +42 -0
  171. package/dist/migrate/references/reference-target-registry.d.ts.map +1 -0
  172. package/dist/migrate/references/reference-target-registry.js +100 -0
  173. package/dist/migrate/references/reference-target-registry.js.map +1 -0
  174. package/dist/migrate/references/reference-types.d.ts +23 -0
  175. package/dist/migrate/references/reference-types.d.ts.map +1 -0
  176. package/dist/migrate/references/reference-types.js +5 -0
  177. package/dist/migrate/references/reference-types.js.map +1 -0
  178. package/dist/migrate/runtime-compat-audit.d.ts +3 -1
  179. package/dist/migrate/runtime-compat-audit.d.ts.map +1 -1
  180. package/dist/migrate/runtime-compat-audit.js +10 -5
  181. package/dist/migrate/runtime-compat-audit.js.map +1 -1
  182. package/dist/migrate/runtime-coupling-patterns.d.ts +32 -3
  183. package/dist/migrate/runtime-coupling-patterns.d.ts.map +1 -1
  184. package/dist/migrate/runtime-coupling-patterns.js +51 -8
  185. package/dist/migrate/runtime-coupling-patterns.js.map +1 -1
  186. package/dist/migrate/skill-directory-audit.d.ts +17 -0
  187. package/dist/migrate/skill-directory-audit.d.ts.map +1 -1
  188. package/dist/migrate/skill-directory-audit.js +70 -11
  189. package/dist/migrate/skill-directory-audit.js.map +1 -1
  190. package/dist/migrate/skill-directory-installer.d.ts +5 -0
  191. package/dist/migrate/skill-directory-installer.d.ts.map +1 -1
  192. package/dist/migrate/skill-directory-installer.js +115 -9
  193. package/dist/migrate/skill-directory-installer.js.map +1 -1
  194. package/dist/migrate/state-changing-script-detector.d.ts +16 -0
  195. package/dist/migrate/state-changing-script-detector.d.ts.map +1 -0
  196. package/dist/migrate/state-changing-script-detector.js +144 -0
  197. package/dist/migrate/state-changing-script-detector.js.map +1 -0
  198. package/dist/migrate/types.d.ts +20 -10
  199. package/dist/migrate/types.d.ts.map +1 -1
  200. package/dist/migrate/types.js +4 -0
  201. package/dist/migrate/types.js.map +1 -1
  202. package/dist/migrate/validation/migrate-conversion-report.d.ts +48 -0
  203. package/dist/migrate/validation/migrate-conversion-report.d.ts.map +1 -0
  204. package/dist/migrate/validation/migrate-conversion-report.js +146 -0
  205. package/dist/migrate/validation/migrate-conversion-report.js.map +1 -0
  206. package/dist/migrate/validation/migration-ledger-inputs.d.ts +56 -0
  207. package/dist/migrate/validation/migration-ledger-inputs.d.ts.map +1 -0
  208. package/dist/migrate/validation/migration-ledger-inputs.js +160 -0
  209. package/dist/migrate/validation/migration-ledger-inputs.js.map +1 -0
  210. package/dist/migrate/validation/migration-record-types.d.ts +38 -0
  211. package/dist/migrate/validation/migration-record-types.d.ts.map +1 -0
  212. package/dist/migrate/validation/migration-record-types.js +12 -0
  213. package/dist/migrate/validation/migration-record-types.js.map +1 -0
  214. package/dist/migrate/validation/migration-report-writer.d.ts +98 -0
  215. package/dist/migrate/validation/migration-report-writer.d.ts.map +1 -0
  216. package/dist/migrate/validation/migration-report-writer.js +0 -0
  217. package/dist/migrate/validation/migration-report-writer.js.map +1 -0
  218. package/dist/migrate/validation/unresolved-reference-scanner.d.ts +18 -0
  219. package/dist/migrate/validation/unresolved-reference-scanner.d.ts.map +1 -0
  220. package/dist/migrate/validation/unresolved-reference-scanner.js +47 -0
  221. package/dist/migrate/validation/unresolved-reference-scanner.js.map +1 -0
  222. package/package.json +1 -1
  223. package/portable-manifest.json +10 -2
@@ -2,9 +2,23 @@ import type { CodexCapabilities } from "../codex-capabilities.js";
2
2
  export interface WrapperGenerateResult {
3
3
  wrapperPath: string;
4
4
  originalPath: string;
5
+ /** Handler runtime type this wrapper was generated for. */
6
+ handlerType: "js" | "sh";
7
+ /** For sh handlers: the copied script under the wrapper tree (self-contained). */
8
+ copiedScriptPath?: string;
5
9
  success: boolean;
6
10
  error?: string;
7
11
  }
8
- export declare function generateCodexHookWrappers(originalPaths: string[], wrapperDir: string, capabilities: CodexCapabilities, timeoutsByPath?: Record<string, number>): WrapperGenerateResult[];
12
+ /** Per-original wrapper generation input. */
13
+ export interface WrapperGenerateInput {
14
+ originalPath: string;
15
+ handlerType: "js" | "sh";
16
+ }
17
+ /**
18
+ * Generate one wrapper per handler. Accepts either the legacy string[] form
19
+ * (all treated as `js`) or the richer WrapperGenerateInput[] form that carries
20
+ * each handler's runtime type so `.sh` handlers get the copy-script + sh wrapper.
21
+ */
22
+ export declare function generateCodexHookWrappers(originals: string[] | WrapperGenerateInput[], wrapperDir: string, capabilities: CodexCapabilities, timeoutsByPath?: Record<string, number>): WrapperGenerateResult[];
9
23
  export declare function buildWrapperScript(originalPath: string, capabilities: CodexCapabilities, hookTimeoutMs?: number): string;
10
24
  //# sourceMappingURL=codex-hook-wrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-hook-wrapper.d.ts","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-hook-wrapper.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AASD,wBAAgB,yBAAyB,CACxC,aAAa,EAAE,MAAM,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,iBAAiB,EAC/B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,qBAAqB,EAAE,CAoCzB;AAOD,wBAAgB,kBAAkB,CACjC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,iBAAiB,EAC/B,aAAa,CAAC,EAAE,MAAM,GACpB,MAAM,CA0HR"}
1
+ {"version":3,"file":"codex-hook-wrapper.d.ts","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-hook-wrapper.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,MAAM,WAAW,qBAAqB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAiCD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,SAAS,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,EAC5C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,iBAAiB,EAC/B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,qBAAqB,EAAE,CAgEzB;AAgBD,wBAAgB,kBAAkB,CACjC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,iBAAiB,EAC/B,aAAa,CAAC,EAAE,MAAM,GACpB,MAAM,CA0HR"}
@@ -1,26 +1,61 @@
1
1
  // Vendored from claudekit-cli (MIT). Source: src/commands/portable/codex-hook-wrapper.ts
2
2
  // Generates per-hook .cjs wrapper that scrubs Claude-only fields from hook stdout
3
3
  // before re-emitting to Codex stdout. Wrapper is self-contained — no mewkit imports at runtime.
4
+ //
5
+ // `.sh` handlers additionally get their script COPIED under the wrapper tree
6
+ // (`scripts/`) so the migrated hook has no dependency on the source `.claude/`
7
+ // tree remaining in place (self-contained migration). See codex-sh-wrapper-script.ts.
4
8
  import { createHash } from "node:crypto";
5
- import { mkdirSync, writeFileSync } from "node:fs";
6
- import { dirname, join, resolve } from "node:path";
9
+ import { chmodSync, copyFileSync, mkdirSync, statSync, writeFileSync } from "node:fs";
10
+ import { basename, dirname, extname, join, resolve } from "node:path";
11
+ import { buildShWrapperScript } from "./codex-sh-wrapper-script.js";
7
12
  import { isPathWithinBoundary } from "./codex-path-safety.js";
8
13
  function wrapperFilename(originalPath) {
9
14
  const abs = resolve(originalPath);
10
15
  const hash = createHash("sha256").update(abs).digest("hex").slice(0, 8);
11
16
  const base = abs.split(/[\\/]/).pop() ?? "hook.cjs";
17
+ // Shell handlers get a .cjs wrapper filename (the node wrapper), not .sh.
18
+ if (extname(base).toLowerCase() === ".sh") {
19
+ return `${hash}-${base.slice(0, -3)}.cjs`;
20
+ }
12
21
  return `${hash}-${base}`;
13
22
  }
14
- export function generateCodexHookWrappers(originalPaths, wrapperDir, capabilities, timeoutsByPath) {
23
+ function copiedScriptFilename(originalPath) {
24
+ const abs = resolve(originalPath);
25
+ const hash = createHash("sha256").update(abs).digest("hex").slice(0, 8);
26
+ return `${hash}-${basename(abs)}`;
27
+ }
28
+ /** Build the delete/permission scrub rules table shared by js + sh wrappers. */
29
+ function buildScrubRules(capabilities) {
30
+ const scrubRules = {};
31
+ for (const [event, caps] of Object.entries(capabilities.events)) {
32
+ const deleteFields = [];
33
+ if (!caps.supportsAdditionalContext)
34
+ deleteFields.push("additionalContext");
35
+ const allowedPermissionValues = caps.permissionDecisionValues ?? null;
36
+ if (deleteFields.length > 0 || allowedPermissionValues !== null) {
37
+ scrubRules[event] = { deleteFields, allowedPermissionValues };
38
+ }
39
+ }
40
+ return scrubRules;
41
+ }
42
+ /**
43
+ * Generate one wrapper per handler. Accepts either the legacy string[] form
44
+ * (all treated as `js`) or the richer WrapperGenerateInput[] form that carries
45
+ * each handler's runtime type so `.sh` handlers get the copy-script + sh wrapper.
46
+ */
47
+ export function generateCodexHookWrappers(originals, wrapperDir, capabilities, timeoutsByPath) {
15
48
  const results = [];
16
49
  const resolvedWrapperDir = resolve(wrapperDir);
17
- for (const originalPath of originalPaths) {
50
+ const inputs = normalizeInputs(originals);
51
+ for (const { originalPath, handlerType } of inputs) {
18
52
  const filename = wrapperFilename(originalPath);
19
53
  const wrapperPath = join(resolvedWrapperDir, filename);
20
54
  if (!isPathWithinBoundary(wrapperPath, resolvedWrapperDir)) {
21
55
  results.push({
22
56
  wrapperPath,
23
57
  originalPath,
58
+ handlerType,
24
59
  success: false,
25
60
  error: `Unsafe wrapper path: ${wrapperPath} escapes ${resolvedWrapperDir}`,
26
61
  });
@@ -30,14 +65,42 @@ export function generateCodexHookWrappers(originalPaths, wrapperDir, capabilitie
30
65
  mkdirSync(dirname(wrapperPath), { recursive: true });
31
66
  const resolvedPath = resolve(originalPath);
32
67
  const hookTimeoutMs = timeoutsByPath?.[resolvedPath] ?? timeoutsByPath?.[originalPath];
33
- const content = buildWrapperScript(originalPath, capabilities, hookTimeoutMs);
34
- writeFileSync(wrapperPath, content, { mode: 0o755 });
35
- results.push({ wrapperPath, originalPath, success: true });
68
+ if (handlerType === "sh") {
69
+ const scriptsDir = join(resolvedWrapperDir, "scripts");
70
+ const copiedScriptPath = join(scriptsDir, copiedScriptFilename(originalPath));
71
+ if (!isPathWithinBoundary(copiedScriptPath, resolvedWrapperDir)) {
72
+ throw new Error(`Unsafe copied-script path: ${copiedScriptPath} escapes ${resolvedWrapperDir}`);
73
+ }
74
+ mkdirSync(scriptsDir, { recursive: true });
75
+ copyFileSync(resolvedPath, copiedScriptPath);
76
+ try {
77
+ // Preserve the original script's executable bits where present.
78
+ const mode = statSync(resolvedPath).mode & 0o777;
79
+ if (mode & 0o100)
80
+ chmodSync(copiedScriptPath, mode);
81
+ }
82
+ catch {
83
+ /* best-effort mode copy */
84
+ }
85
+ const content = buildShWrapperScript(originalPath, {
86
+ copiedScriptPath,
87
+ scrubRulesJson: JSON.stringify(buildScrubRules(capabilities)),
88
+ timeoutMs: hookTimeoutMs ?? 30000,
89
+ });
90
+ writeFileSync(wrapperPath, content, { mode: 0o755 });
91
+ results.push({ wrapperPath, originalPath, handlerType, copiedScriptPath, success: true });
92
+ }
93
+ else {
94
+ const content = buildWrapperScript(originalPath, capabilities, hookTimeoutMs);
95
+ writeFileSync(wrapperPath, content, { mode: 0o755 });
96
+ results.push({ wrapperPath, originalPath, handlerType, success: true });
97
+ }
36
98
  }
37
99
  catch (err) {
38
100
  results.push({
39
101
  wrapperPath,
40
102
  originalPath,
103
+ handlerType,
41
104
  success: false,
42
105
  error: err instanceof Error ? err.message : String(err),
43
106
  });
@@ -45,6 +108,14 @@ export function generateCodexHookWrappers(originalPaths, wrapperDir, capabilitie
45
108
  }
46
109
  return results;
47
110
  }
111
+ function normalizeInputs(originals) {
112
+ return originals.map((entry) => {
113
+ if (typeof entry === "string") {
114
+ return { originalPath: entry, handlerType: extname(entry).toLowerCase() === ".sh" ? "sh" : "js" };
115
+ }
116
+ return entry;
117
+ });
118
+ }
48
119
  export function buildWrapperScript(originalPath, capabilities, hookTimeoutMs) {
49
120
  const scrubRules = {};
50
121
  for (const [event, caps] of Object.entries(capabilities.events)) {
@@ -60,7 +131,7 @@ export function buildWrapperScript(originalPath, capabilities, hookTimeoutMs) {
60
131
  const scrubRulesJson = JSON.stringify(scrubRules);
61
132
  const effectiveTimeout = hookTimeoutMs ?? 30000;
62
133
  return `#!/usr/bin/env node
63
- // AUTO-GENERATED by mewkit migrate — DO NOT EDIT
134
+ // AUTO-GENERATED by the migration tooling — DO NOT EDIT
64
135
  // Codex hook compatibility wrapper for:
65
136
  // ${originalPath}
66
137
  "use strict";
@@ -1 +1 @@
1
- {"version":3,"file":"codex-hook-wrapper.js","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-hook-wrapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-hook-wrapper.js","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-hook-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface CodexMcpInstallResult {
2
+ success: boolean;
3
+ configPath: string;
4
+ error?: string;
5
+ }
6
+ export declare function installCodexMcpServers(mcpServersToml: string, options: {
7
+ global: boolean;
8
+ }): Promise<CodexMcpInstallResult>;
9
+ //# sourceMappingURL=codex-mcp-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-mcp-installer.d.ts","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-mcp-installer.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AA+BD,wBAAsB,sBAAsB,CAC3C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAsBhC"}
@@ -0,0 +1,65 @@
1
+ // Merges converted [mcp_servers] TOML into .codex/config.toml inside a
2
+ // sentinel-managed block, so re-runs replace the block instead of duplicating
3
+ // entries and user-authored config stays untouched.
4
+ import { existsSync } from "node:fs";
5
+ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
6
+ import { dirname, join, resolve } from "node:path";
7
+ import { getCodexGlobalBoundary, isCanonicalPathWithinBoundary, withCodexTargetLock } from "./codex-path-safety.js";
8
+ const SENTINEL_START = "# --- managed-mcp-servers-start ---";
9
+ const SENTINEL_END = "# --- managed-mcp-servers-end ---";
10
+ async function atomicWrite(target, content) {
11
+ const dir = dirname(target);
12
+ if (!existsSync(dir))
13
+ await mkdir(dir, { recursive: true });
14
+ const tmp = `${target}.tmp-${process.pid}`;
15
+ try {
16
+ await writeFile(tmp, content, "utf-8");
17
+ await rename(tmp, target);
18
+ }
19
+ catch (err) {
20
+ try {
21
+ await unlink(tmp);
22
+ }
23
+ catch {
24
+ /* best-effort */
25
+ }
26
+ throw err;
27
+ }
28
+ }
29
+ function stripManagedBlock(content) {
30
+ const startIdx = content.indexOf(SENTINEL_START);
31
+ if (startIdx === -1)
32
+ return content;
33
+ const endIdx = content.indexOf(SENTINEL_END, startIdx);
34
+ if (endIdx === -1)
35
+ return content;
36
+ const blockEnd = endIdx + SENTINEL_END.length;
37
+ const after = content[blockEnd] === "\n" ? blockEnd + 1 : blockEnd;
38
+ let before = startIdx;
39
+ if (before > 0 && content[before - 1] === "\n")
40
+ before -= 1;
41
+ return content.slice(0, before) + content.slice(after);
42
+ }
43
+ export async function installCodexMcpServers(mcpServersToml, options) {
44
+ const codexRoot = options.global ? getCodexGlobalBoundary() : join(process.cwd(), ".codex");
45
+ const configPath = join(codexRoot, "config.toml");
46
+ if (!(await isCanonicalPathWithinBoundary(configPath, resolve(codexRoot)))) {
47
+ return { success: false, configPath, error: "Unsafe path: config.toml escapes the .codex boundary" };
48
+ }
49
+ return withCodexTargetLock(configPath, async () => {
50
+ try {
51
+ let existing = "";
52
+ if (existsSync(configPath))
53
+ existing = await readFile(configPath, "utf-8");
54
+ const stripped = stripManagedBlock(existing);
55
+ const block = `${SENTINEL_START}\n${mcpServersToml.trimEnd()}\n${SENTINEL_END}\n`;
56
+ const separator = stripped.length === 0 ? "" : stripped.endsWith("\n") ? "\n" : "\n\n";
57
+ await atomicWrite(configPath, `${stripped}${separator}${block}`);
58
+ return { success: true, configPath };
59
+ }
60
+ catch (err) {
61
+ return { success: false, configPath, error: err instanceof Error ? err.message : String(err) };
62
+ }
63
+ });
64
+ }
65
+ //# sourceMappingURL=codex-mcp-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-mcp-installer.js","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-mcp-installer.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,33 @@ export declare function isPathWithinBoundary(targetPath: string, boundaryPath: s
2
2
  export declare function isCanonicalPathWithinBoundary(targetPath: string, boundaryPath: string): Promise<boolean>;
3
3
  export declare function withCodexTargetLock<T>(targetFilePath: string, operation: () => Promise<T>): Promise<T>;
4
4
  export declare function getCodexGlobalBoundary(): string;
5
+ /**
6
+ * The single canonical Codex root for the given scope.
7
+ * - global: <home>/.codex
8
+ * - project: <cwd>/.codex
9
+ *
10
+ * Always absolute. This is the ONE place a Codex root is computed so no caller
11
+ * has to string-concatenate a project root onto a path — the source of the
12
+ * doubled-root bug (`node "/root//root/.codex/hooks/x.cjs"`) observed in real
13
+ * migrations, where a relative ".codex/hooks" path config was resolved against
14
+ * cwd in one place and prefixed with the project root again in another.
15
+ */
16
+ export declare function getCodexRoot(options: {
17
+ global: boolean;
18
+ }): string;
19
+ /**
20
+ * Resolve a Codex target path to a single, absolute, non-doubled form.
21
+ *
22
+ * `target` may be:
23
+ * - already absolute (an installer computed it) → returned as-is (idempotent),
24
+ * - the literal ".codex/..." project-relative form from the provider registry,
25
+ * - or any other relative fragment → joined onto the scope's Codex root.
26
+ *
27
+ * Never derives the path from string content or interpolation — only from the
28
+ * literal path table and the computed root, so a project root can never be
29
+ * prepended twice.
30
+ */
31
+ export declare function resolveCodexTargetPath(target: string, options: {
32
+ global: boolean;
33
+ }): string;
5
34
  //# sourceMappingURL=codex-path-safety.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-path-safety.d.ts","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-path-safety.ts"],"names":[],"mappings":"AASA,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAItF;AAUD,wBAAsB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI9G;AA2DD,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAa5G;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C"}
1
+ {"version":3,"file":"codex-path-safety.d.ts","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-path-safety.ts"],"names":[],"mappings":"AASA,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAItF;AAUD,wBAAsB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI9G;AA2DD,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAa5G;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAEjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAQ3F"}
@@ -3,7 +3,7 @@
3
3
  import { existsSync } from "node:fs";
4
4
  import { mkdir, readFile, realpath, unlink, writeFile } from "node:fs/promises";
5
5
  import { homedir } from "node:os";
6
- import { dirname, join, resolve, sep } from "node:path";
6
+ import { dirname, isAbsolute, join, resolve, sep } from "node:path";
7
7
  const STALE_LOCK_MS = 60 * 1000;
8
8
  export function isPathWithinBoundary(targetPath, boundaryPath) {
9
9
  const resolvedTarget = resolve(targetPath);
@@ -98,4 +98,39 @@ export async function withCodexTargetLock(targetFilePath, operation) {
98
98
  export function getCodexGlobalBoundary() {
99
99
  return join(homedir(), ".codex");
100
100
  }
101
+ /**
102
+ * The single canonical Codex root for the given scope.
103
+ * - global: <home>/.codex
104
+ * - project: <cwd>/.codex
105
+ *
106
+ * Always absolute. This is the ONE place a Codex root is computed so no caller
107
+ * has to string-concatenate a project root onto a path — the source of the
108
+ * doubled-root bug (`node "/root//root/.codex/hooks/x.cjs"`) observed in real
109
+ * migrations, where a relative ".codex/hooks" path config was resolved against
110
+ * cwd in one place and prefixed with the project root again in another.
111
+ */
112
+ export function getCodexRoot(options) {
113
+ return options.global ? getCodexGlobalBoundary() : resolve(process.cwd(), ".codex");
114
+ }
115
+ /**
116
+ * Resolve a Codex target path to a single, absolute, non-doubled form.
117
+ *
118
+ * `target` may be:
119
+ * - already absolute (an installer computed it) → returned as-is (idempotent),
120
+ * - the literal ".codex/..." project-relative form from the provider registry,
121
+ * - or any other relative fragment → joined onto the scope's Codex root.
122
+ *
123
+ * Never derives the path from string content or interpolation — only from the
124
+ * literal path table and the computed root, so a project root can never be
125
+ * prepended twice.
126
+ */
127
+ export function resolveCodexTargetPath(target, options) {
128
+ if (isAbsolute(target))
129
+ return resolve(target);
130
+ const codexRoot = getCodexRoot(options);
131
+ // Strip a leading ".codex/" (or ".codex") segment so we never nest
132
+ // ".codex/.codex/..." when the registry path already carries the prefix.
133
+ const normalized = target.replace(/^\.?[/\\]?\.codex[/\\]?/, "");
134
+ return normalized.length > 0 ? resolve(codexRoot, normalized) : codexRoot;
135
+ }
101
136
  //# sourceMappingURL=codex-path-safety.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-path-safety.js","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-path-safety.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-path-safety.js","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-path-safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface ShWrapperOptions {
2
+ copiedScriptPath: string;
3
+ scrubRulesJson: string;
4
+ timeoutMs: number;
5
+ }
6
+ export declare function buildShWrapperScript(originalPath: string, options: ShWrapperOptions): string;
7
+ export {};
8
+ //# sourceMappingURL=codex-sh-wrapper-script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-sh-wrapper-script.d.ts","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-sh-wrapper-script.ts"],"names":[],"mappings":"AAiBA,UAAU,gBAAgB;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAqG5F"}
@@ -0,0 +1,118 @@
1
+ // Builds the body of a generated .cjs wrapper that executes a copied .sh hook
2
+ // script. The wrapper is fully self-contained (no mewkit imports at runtime) and
3
+ // points at a script copied under the Codex output tree, so deleting the source
4
+ // .claude/ tree after migration does NOT break the migrated hook.
5
+ //
6
+ // Env rewrite: Claude Code exports $CLAUDE_PROJECT_DIR (and other $CLAUDE_* vars)
7
+ // that Codex does not. The wrapper injects a computed project root for the common
8
+ // vars from a LITERAL table (never content-derived interpolation), then execs the
9
+ // copied script via /bin/sh with an argv ARRAY (execFile-style) so a project root
10
+ // containing spaces or shell metacharacters is passed as one literal argument.
11
+ //
12
+ // Deny protocol (documented at https://developers.openai.com/codex/hooks):
13
+ // a PreToolUse hook denies via exit code 2 + reason on stderr (direct parity with
14
+ // Claude's exit-2 convention), or the {"decision":"block",...} shape. The wrapper
15
+ // preserves the child's exit code and, for deny-capable events, converts exit 2
16
+ // into the structured permissionDecision:"deny" payload Codex expects.
17
+ export function buildShWrapperScript(originalPath, options) {
18
+ const escapedScriptPath = JSON.stringify(options.copiedScriptPath);
19
+ const escapedOriginal = JSON.stringify(originalPath);
20
+ return `#!/usr/bin/env node
21
+ // AUTO-GENERATED by the migration tooling — DO NOT EDIT
22
+ // Codex shell-hook compatibility wrapper for:
23
+ // ${originalPath}
24
+ // Executes the copied script (self-contained under the Codex tree).
25
+ "use strict";
26
+
27
+ const { spawnSync } = require("node:child_process");
28
+ const path = require("node:path");
29
+
30
+ const COPIED_SCRIPT = ${escapedScriptPath};
31
+ const ORIGINAL_HOOK = ${escapedOriginal};
32
+ const SCRUB_RULES = ${options.scrubRulesJson};
33
+ const HOOK_TIMEOUT_MS = ${options.timeoutMs};
34
+
35
+ // Computed project root: the Codex tree is <root>/.codex/hooks/scripts/<file>,
36
+ // so the project root is four levels up from the copied script. Derived from a
37
+ // literal directory-depth table, never from string interpolation of user input.
38
+ function computeProjectRoot() {
39
+ if (process.env.CODEX_PROJECT_DIR) return process.env.CODEX_PROJECT_DIR;
40
+ const scriptsDir = path.dirname(COPIED_SCRIPT); // .codex/hooks/scripts
41
+ const hooksDir = path.dirname(scriptsDir); // .codex/hooks
42
+ const codexDir = path.dirname(hooksDir); // .codex
43
+ return path.dirname(codexDir); // <project root>
44
+ }
45
+
46
+ function rewrittenEnv() {
47
+ const projectRoot = computeProjectRoot();
48
+ const env = Object.assign({}, process.env);
49
+ // Bridge the Claude-only vars a .sh hook may read to Codex-available values.
50
+ if (env.CLAUDE_PROJECT_DIR === undefined) env.CLAUDE_PROJECT_DIR = projectRoot;
51
+ if (env.CLAUDE_PLUGIN_DATA === undefined) env.CLAUDE_PLUGIN_DATA = path.join(projectRoot, ".codex");
52
+ return env;
53
+ }
54
+
55
+ function getEventFromStdin(stdinData) {
56
+ try {
57
+ const parsed = JSON.parse(stdinData);
58
+ return parsed.hook_event_name || parsed.event || null;
59
+ } catch {
60
+ return null;
61
+ }
62
+ }
63
+
64
+ function eventSupportsDeny(rules) {
65
+ if (!rules || rules.allowedPermissionValues === null || rules.allowedPermissionValues === undefined) return false;
66
+ return rules.allowedPermissionValues.indexOf("deny") !== -1;
67
+ }
68
+
69
+ function emitDeny(reason) {
70
+ process.stdout.write(JSON.stringify({
71
+ permissionDecision: "deny",
72
+ reason: reason && reason.length > 0 ? reason : "Hook blocked this operation",
73
+ }));
74
+ process.exit(0);
75
+ }
76
+
77
+ function main() {
78
+ const stdinChunks = [];
79
+ process.stdin.on("data", (chunk) => stdinChunks.push(chunk));
80
+ process.stdin.on("end", () => {
81
+ const stdinData = Buffer.concat(stdinChunks).toString("utf8");
82
+ const event = getEventFromStdin(stdinData);
83
+ const rules = event && SCRUB_RULES[event];
84
+
85
+ // argv ARRAY — the copied script path is one literal argument, so a project
86
+ // root containing spaces or shell metacharacters is never re-parsed by a shell.
87
+ const result = spawnSync("/bin/sh", [COPIED_SCRIPT], {
88
+ input: stdinData,
89
+ env: rewrittenEnv(),
90
+ encoding: "utf8",
91
+ timeout: HOOK_TIMEOUT_MS,
92
+ });
93
+
94
+ if (result.error) {
95
+ if (result.stderr) process.stderr.write(result.stderr);
96
+ process.exit(1);
97
+ }
98
+
99
+ const stderrText = (result.stderr || "").toString();
100
+ const rawOutput = (result.stdout || "").toString();
101
+ const exitCode = result.status == null ? 1 : result.status;
102
+ const isBlockSignal = exitCode === 2 && eventSupportsDeny(rules);
103
+
104
+ if (isBlockSignal) {
105
+ const reason = (rawOutput.trim() || stderrText.trim());
106
+ return emitDeny(reason);
107
+ }
108
+
109
+ if (stderrText) process.stderr.write(stderrText);
110
+ if (rawOutput) process.stdout.write(rawOutput);
111
+ process.exit(exitCode);
112
+ });
113
+ }
114
+
115
+ main();
116
+ `;
117
+ }
118
+ //# sourceMappingURL=codex-sh-wrapper-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-sh-wrapper-script.js","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-sh-wrapper-script.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iFAAiF;AACjF,gFAAgF;AAChF,kEAAkE;AAClE,EAAE;AACF,kFAAkF;AAClF,kFAAkF;AAClF,kFAAkF;AAClF,kFAAkF;AAClF,+EAA+E;AAC/E,EAAE;AACF,2EAA2E;AAC3E,kFAAkF;AAClF,kFAAkF;AAClF,gFAAgF;AAChF,uEAAuE;AAQvE,MAAM,UAAU,oBAAoB,CAAC,YAAoB,EAAE,OAAyB;IACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAErD,OAAO;;;OAGD,YAAY;;;;;;;wBAOK,iBAAiB;wBACjB,eAAe;sBACjB,OAAO,CAAC,cAAc;0BAClB,OAAO,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmF1C,CAAC;AACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface CodexShellEnvInstallResult {
2
+ success: boolean;
3
+ configPath: string;
4
+ error?: string;
5
+ }
6
+ /**
7
+ * Install (or, when scaffold is empty, remove) the managed shell-env-policy block.
8
+ * An empty scaffold means there is nothing safe to write, so the block is stripped
9
+ * — keeping re-runs idempotent whether or not a `.claude/.env` exists.
10
+ */
11
+ export declare function installCodexShellEnvPolicy(scaffoldToml: string, options: {
12
+ global: boolean;
13
+ }): Promise<CodexShellEnvInstallResult>;
14
+ //# sourceMappingURL=codex-shell-env-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-shell-env-installer.d.ts","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-shell-env-installer.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AA+BD;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC/C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,0BAA0B,CAAC,CA4BrC"}
@@ -0,0 +1,82 @@
1
+ // Merges the generated [shell_environment_policy] scaffold into .codex/config.toml
2
+ // inside a sentinel-managed block, so re-runs replace the block instead of
3
+ // duplicating it and user-authored config stays untouched. Mirrors the
4
+ // codex-mcp-installer sentinel pattern.
5
+ //
6
+ // SECURITY (injection-rules Rule 4/5): the scaffold text passed in contains ONLY
7
+ // inert placeholder values and non-secret key NAMES (secret-like names are already
8
+ // excluded upstream by emitShellEnvPolicyScaffold). No `.env` value ever reaches
9
+ // this module.
10
+ import { existsSync } from "node:fs";
11
+ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
12
+ import { dirname, join, resolve } from "node:path";
13
+ import { getCodexGlobalBoundary, isCanonicalPathWithinBoundary, withCodexTargetLock } from "./codex-path-safety.js";
14
+ const SENTINEL_START = "# --- managed-shell-env-policy-start ---";
15
+ const SENTINEL_END = "# --- managed-shell-env-policy-end ---";
16
+ async function atomicWrite(target, content) {
17
+ const dir = dirname(target);
18
+ if (!existsSync(dir))
19
+ await mkdir(dir, { recursive: true });
20
+ const tmp = `${target}.tmp-${process.pid}`;
21
+ try {
22
+ await writeFile(tmp, content, "utf-8");
23
+ await rename(tmp, target);
24
+ }
25
+ catch (err) {
26
+ try {
27
+ await unlink(tmp);
28
+ }
29
+ catch {
30
+ /* best-effort */
31
+ }
32
+ throw err;
33
+ }
34
+ }
35
+ function stripManagedBlock(content) {
36
+ const startIdx = content.indexOf(SENTINEL_START);
37
+ if (startIdx === -1)
38
+ return content;
39
+ const endIdx = content.indexOf(SENTINEL_END, startIdx);
40
+ if (endIdx === -1)
41
+ return content;
42
+ const blockEnd = endIdx + SENTINEL_END.length;
43
+ const after = content[blockEnd] === "\n" ? blockEnd + 1 : blockEnd;
44
+ let before = startIdx;
45
+ if (before > 0 && content[before - 1] === "\n")
46
+ before -= 1;
47
+ return content.slice(0, before) + content.slice(after);
48
+ }
49
+ /**
50
+ * Install (or, when scaffold is empty, remove) the managed shell-env-policy block.
51
+ * An empty scaffold means there is nothing safe to write, so the block is stripped
52
+ * — keeping re-runs idempotent whether or not a `.claude/.env` exists.
53
+ */
54
+ export async function installCodexShellEnvPolicy(scaffoldToml, options) {
55
+ const codexRoot = options.global ? getCodexGlobalBoundary() : join(process.cwd(), ".codex");
56
+ const configPath = join(codexRoot, "config.toml");
57
+ if (!(await isCanonicalPathWithinBoundary(configPath, resolve(codexRoot)))) {
58
+ return { success: false, configPath, error: "Unsafe path: config.toml escapes the .codex boundary" };
59
+ }
60
+ return withCodexTargetLock(configPath, async () => {
61
+ try {
62
+ let existing = "";
63
+ if (existsSync(configPath))
64
+ existing = await readFile(configPath, "utf-8");
65
+ const stripped = stripManagedBlock(existing);
66
+ if (scaffoldToml.trim().length === 0) {
67
+ // Nothing to scaffold: only rewrite if we actually removed a stale block.
68
+ if (stripped !== existing)
69
+ await atomicWrite(configPath, stripped);
70
+ return { success: true, configPath };
71
+ }
72
+ const block = `${SENTINEL_START}\n${scaffoldToml.trimEnd()}\n${SENTINEL_END}\n`;
73
+ const separator = stripped.length === 0 ? "" : stripped.endsWith("\n") ? "\n" : "\n\n";
74
+ await atomicWrite(configPath, `${stripped}${separator}${block}`);
75
+ return { success: true, configPath };
76
+ }
77
+ catch (err) {
78
+ return { success: false, configPath, error: err instanceof Error ? err.message : String(err) };
79
+ }
80
+ });
81
+ }
82
+ //# sourceMappingURL=codex-shell-env-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-shell-env-installer.js","sourceRoot":"","sources":["../../../src/migrate/hooks/codex-shell-env-installer.ts"],"names":[],"mappings":"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"}