oh-my-codex 0.18.15 → 0.19.0

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 (229) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/crates/omx-sparkshell/tests/execution.rs +8 -1
  4. package/dist/agents/__tests__/definitions.test.js +5 -5
  5. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  6. package/dist/agents/__tests__/native-config.test.js +18 -14
  7. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  8. package/dist/agents/definitions.d.ts +2 -2
  9. package/dist/agents/definitions.d.ts.map +1 -1
  10. package/dist/agents/definitions.js +4 -4
  11. package/dist/agents/definitions.js.map +1 -1
  12. package/dist/agents/native-config.d.ts +1 -0
  13. package/dist/agents/native-config.d.ts.map +1 -1
  14. package/dist/agents/native-config.js +18 -16
  15. package/dist/agents/native-config.js.map +1 -1
  16. package/dist/auth/hotswap.d.ts.map +1 -1
  17. package/dist/auth/hotswap.js +17 -4
  18. package/dist/auth/hotswap.js.map +1 -1
  19. package/dist/autopilot/__tests__/planner-routing.test.js +2 -2
  20. package/dist/autopilot/__tests__/planner-routing.test.js.map +1 -1
  21. package/dist/autopilot/fsm.d.ts +1 -1
  22. package/dist/autopilot/fsm.d.ts.map +1 -1
  23. package/dist/autopilot/fsm.js +1 -1
  24. package/dist/autopilot/fsm.js.map +1 -1
  25. package/dist/cli/__tests__/auth.test.js +78 -3
  26. package/dist/cli/__tests__/auth.test.js.map +1 -1
  27. package/dist/cli/__tests__/codex-plugin-layout.test.js +30 -5
  28. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  29. package/dist/cli/__tests__/doctor-artifact-ownership.test.js +63 -0
  30. package/dist/cli/__tests__/doctor-artifact-ownership.test.js.map +1 -1
  31. package/dist/cli/__tests__/doctor-warning-copy.test.js +2 -0
  32. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  33. package/dist/cli/__tests__/index.test.js +96 -8
  34. package/dist/cli/__tests__/index.test.js.map +1 -1
  35. package/dist/cli/__tests__/launch-fallback.test.js +135 -1
  36. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  37. package/dist/cli/__tests__/mcp-parity.test.js +2 -4
  38. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  39. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js +14 -0
  40. package/dist/cli/__tests__/plugin-marketplace-idempotent.test.js.map +1 -1
  41. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +8 -0
  42. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  43. package/dist/cli/__tests__/resume.test.js +229 -1
  44. package/dist/cli/__tests__/resume.test.js.map +1 -1
  45. package/dist/cli/__tests__/session-scoped-runtime.test.js +46 -0
  46. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  47. package/dist/cli/__tests__/session-search-help.test.js +3 -1
  48. package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
  49. package/dist/cli/__tests__/session-search.test.js +55 -1
  50. package/dist/cli/__tests__/session-search.test.js.map +1 -1
  51. package/dist/cli/__tests__/setup-install-mode.test.js +37 -0
  52. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  53. package/dist/cli/__tests__/ultragoal.test.js +21 -0
  54. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  55. package/dist/cli/__tests__/version.test.js +13 -1
  56. package/dist/cli/__tests__/version.test.js.map +1 -1
  57. package/dist/cli/auth.d.ts +1 -1
  58. package/dist/cli/auth.d.ts.map +1 -1
  59. package/dist/cli/auth.js +49 -9
  60. package/dist/cli/auth.js.map +1 -1
  61. package/dist/cli/doctor.d.ts.map +1 -1
  62. package/dist/cli/doctor.js +6 -2
  63. package/dist/cli/doctor.js.map +1 -1
  64. package/dist/cli/index.d.ts +26 -3
  65. package/dist/cli/index.d.ts.map +1 -1
  66. package/dist/cli/index.js +234 -33
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  69. package/dist/cli/plugin-marketplace.js +22 -1
  70. package/dist/cli/plugin-marketplace.js.map +1 -1
  71. package/dist/cli/ralph.d.ts.map +1 -1
  72. package/dist/cli/ralph.js +4 -0
  73. package/dist/cli/ralph.js.map +1 -1
  74. package/dist/cli/session-search.d.ts +6 -0
  75. package/dist/cli/session-search.d.ts.map +1 -1
  76. package/dist/cli/session-search.js +104 -4
  77. package/dist/cli/session-search.js.map +1 -1
  78. package/dist/cli/setup.d.ts.map +1 -1
  79. package/dist/cli/setup.js +3 -1
  80. package/dist/cli/setup.js.map +1 -1
  81. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +7 -0
  82. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
  83. package/dist/goal-workflows/codex-goal-snapshot.js +1 -1
  84. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  85. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +12 -0
  86. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  87. package/dist/hooks/__tests__/keyword-detector.test.js +267 -7
  88. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  89. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  90. package/dist/hooks/keyword-detector.js +143 -30
  91. package/dist/hooks/keyword-detector.js.map +1 -1
  92. package/dist/hud/__tests__/reconcile.test.js +121 -0
  93. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  94. package/dist/hud/__tests__/state.test.js +231 -0
  95. package/dist/hud/__tests__/state.test.js.map +1 -1
  96. package/dist/hud/__tests__/tmux.test.js +1 -1
  97. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  98. package/dist/hud/reconcile.d.ts +3 -1
  99. package/dist/hud/reconcile.d.ts.map +1 -1
  100. package/dist/hud/reconcile.js +281 -151
  101. package/dist/hud/reconcile.js.map +1 -1
  102. package/dist/hud/render.d.ts.map +1 -1
  103. package/dist/hud/render.js +4 -2
  104. package/dist/hud/render.js.map +1 -1
  105. package/dist/hud/state.d.ts.map +1 -1
  106. package/dist/hud/state.js +77 -14
  107. package/dist/hud/state.js.map +1 -1
  108. package/dist/hud/tmux.d.ts.map +1 -1
  109. package/dist/hud/tmux.js +1 -4
  110. package/dist/hud/tmux.js.map +1 -1
  111. package/dist/hud/types.d.ts +6 -1
  112. package/dist/hud/types.d.ts.map +1 -1
  113. package/dist/hud/types.js.map +1 -1
  114. package/dist/leader/__tests__/contract.test.d.ts +2 -0
  115. package/dist/leader/__tests__/contract.test.d.ts.map +1 -0
  116. package/dist/leader/__tests__/contract.test.js +75 -0
  117. package/dist/leader/__tests__/contract.test.js.map +1 -0
  118. package/dist/leader/contract.d.ts +26 -0
  119. package/dist/leader/contract.d.ts.map +1 -0
  120. package/dist/leader/contract.js +97 -0
  121. package/dist/leader/contract.js.map +1 -0
  122. package/dist/modes/base.d.ts.map +1 -1
  123. package/dist/modes/base.js +22 -7
  124. package/dist/modes/base.js.map +1 -1
  125. package/dist/notifications/__tests__/dispatcher.test.js +16 -0
  126. package/dist/notifications/__tests__/dispatcher.test.js.map +1 -1
  127. package/dist/notifications/__tests__/profiles.test.js +87 -0
  128. package/dist/notifications/__tests__/profiles.test.js.map +1 -1
  129. package/dist/notifications/config.d.ts +1 -0
  130. package/dist/notifications/config.d.ts.map +1 -1
  131. package/dist/notifications/config.js +60 -22
  132. package/dist/notifications/config.js.map +1 -1
  133. package/dist/notifications/dispatcher.d.ts.map +1 -1
  134. package/dist/notifications/dispatcher.js +6 -16
  135. package/dist/notifications/dispatcher.js.map +1 -1
  136. package/dist/pipeline/__tests__/stages.test.js +2 -0
  137. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  138. package/dist/pipeline/stages/ultragoal.d.ts.map +1 -1
  139. package/dist/pipeline/stages/ultragoal.js +6 -1
  140. package/dist/pipeline/stages/ultragoal.js.map +1 -1
  141. package/dist/question/__tests__/renderer.test.js +58 -4
  142. package/dist/question/__tests__/renderer.test.js.map +1 -1
  143. package/dist/question/renderer.d.ts +1 -1
  144. package/dist/question/renderer.d.ts.map +1 -1
  145. package/dist/question/renderer.js +73 -5
  146. package/dist/question/renderer.js.map +1 -1
  147. package/dist/ralplan/__tests__/runtime.test.js +202 -0
  148. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  149. package/dist/ralplan/runtime.d.ts +7 -0
  150. package/dist/ralplan/runtime.d.ts.map +1 -1
  151. package/dist/ralplan/runtime.js +63 -4
  152. package/dist/ralplan/runtime.js.map +1 -1
  153. package/dist/scripts/__tests__/codex-native-hook.test.js +8691 -4583
  154. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  155. package/dist/scripts/codex-native-hook.d.ts +1 -0
  156. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  157. package/dist/scripts/codex-native-hook.js +4525 -170
  158. package/dist/scripts/codex-native-hook.js.map +1 -1
  159. package/dist/session-history/__tests__/friction.test.d.ts +2 -0
  160. package/dist/session-history/__tests__/friction.test.d.ts.map +1 -0
  161. package/dist/session-history/__tests__/friction.test.js +107 -0
  162. package/dist/session-history/__tests__/friction.test.js.map +1 -0
  163. package/dist/session-history/friction.d.ts +68 -0
  164. package/dist/session-history/friction.d.ts.map +1 -0
  165. package/dist/session-history/friction.js +365 -0
  166. package/dist/session-history/friction.js.map +1 -0
  167. package/dist/state/__tests__/operations.test.js +1137 -0
  168. package/dist/state/__tests__/operations.test.js.map +1 -1
  169. package/dist/state/__tests__/planning-gate.test.js +410 -0
  170. package/dist/state/__tests__/planning-gate.test.js.map +1 -1
  171. package/dist/state/operations.d.ts +10 -0
  172. package/dist/state/operations.d.ts.map +1 -1
  173. package/dist/state/operations.js +242 -8
  174. package/dist/state/operations.js.map +1 -1
  175. package/dist/state/skill-active.d.ts +4 -1
  176. package/dist/state/skill-active.d.ts.map +1 -1
  177. package/dist/state/skill-active.js +5 -3
  178. package/dist/state/skill-active.js.map +1 -1
  179. package/dist/state/workflow-transition.d.ts.map +1 -1
  180. package/dist/state/workflow-transition.js +642 -1
  181. package/dist/state/workflow-transition.js.map +1 -1
  182. package/dist/subagents/__tests__/tracker.test.js +248 -1
  183. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  184. package/dist/subagents/tracker.d.ts +60 -0
  185. package/dist/subagents/tracker.d.ts.map +1 -1
  186. package/dist/subagents/tracker.js +225 -1
  187. package/dist/subagents/tracker.js.map +1 -1
  188. package/dist/team/__tests__/model-contract.test.js +72 -4
  189. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  190. package/dist/team/__tests__/runtime.test.js +44 -2
  191. package/dist/team/__tests__/runtime.test.js.map +1 -1
  192. package/dist/team/__tests__/tmux-session.test.js +127 -8
  193. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  194. package/dist/team/__tests__/worker-runtime-identity.test.js +89 -0
  195. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  196. package/dist/team/model-contract.d.ts +3 -0
  197. package/dist/team/model-contract.d.ts.map +1 -1
  198. package/dist/team/model-contract.js +42 -5
  199. package/dist/team/model-contract.js.map +1 -1
  200. package/dist/team/runtime.d.ts +2 -1
  201. package/dist/team/runtime.d.ts.map +1 -1
  202. package/dist/team/runtime.js +21 -11
  203. package/dist/team/runtime.js.map +1 -1
  204. package/dist/team/scaling.d.ts.map +1 -1
  205. package/dist/team/scaling.js +13 -11
  206. package/dist/team/scaling.js.map +1 -1
  207. package/dist/team/tmux-session.d.ts +1 -0
  208. package/dist/team/tmux-session.d.ts.map +1 -1
  209. package/dist/team/tmux-session.js +63 -13
  210. package/dist/team/tmux-session.js.map +1 -1
  211. package/dist/ultragoal/__tests__/artifacts.test.js +7 -0
  212. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  213. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  214. package/dist/ultragoal/artifacts.js +5 -0
  215. package/dist/ultragoal/artifacts.js.map +1 -1
  216. package/dist/utils/__tests__/agents-model-table.test.js +2 -2
  217. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  218. package/package.json +1 -1
  219. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  220. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +19 -7
  221. package/plugins/oh-my-codex/skills/code-review/SKILL.md +16 -0
  222. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +23 -0
  223. package/plugins/oh-my-codex/skills/ultrawork/references/agent-tiers.md +3 -2
  224. package/skills/code-review/SKILL.md +16 -0
  225. package/skills/ecomode/references/agent-tiers.md +1 -1
  226. package/skills/ultragoal/SKILL.md +23 -0
  227. package/skills/ultrawork/references/agent-tiers.md +3 -2
  228. package/src/scripts/__tests__/codex-native-hook.test.ts +14129 -8988
  229. package/src/scripts/codex-native-hook.ts +4631 -197
@@ -10,6 +10,7 @@ import { buildClientAttachedReconcileHookName, assertTeamWorkerCliBinaryAvailabl
10
10
  import { HUD_RESIZE_RECONCILE_DELAY_SECONDS, HUD_TMUX_TEAM_HEIGHT_LINES } from '../../hud/constants.js';
11
11
  import * as tmuxSessionModule from '../tmux-session.js';
12
12
  import { OMX_ENTRY_PATH_ENV, OMX_STARTUP_CWD_ENV } from '../../utils/paths.js';
13
+ const fsMutable = fs;
13
14
  function withEmptyPath(fn) {
14
15
  const prev = process.env.PATH;
15
16
  process.env.PATH = '';
@@ -24,26 +25,26 @@ function withEmptyPath(fn) {
24
25
  }
25
26
  }
26
27
  function withMockedExistsSync(mock, fn) {
27
- const original = fs.existsSync;
28
- fs.existsSync = mock;
28
+ const original = fsMutable.existsSync;
29
+ fsMutable.existsSync = mock;
29
30
  syncBuiltinESMExports();
30
31
  try {
31
32
  return fn();
32
33
  }
33
34
  finally {
34
- fs.existsSync = original;
35
+ fsMutable.existsSync = original;
35
36
  syncBuiltinESMExports();
36
37
  }
37
38
  }
38
39
  function withMockedStatSync(mock, fn) {
39
- const original = fs.statSync;
40
- fs.statSync = mock;
40
+ const original = fsMutable.statSync;
41
+ fsMutable.statSync = mock;
41
42
  syncBuiltinESMExports();
42
43
  try {
43
44
  return fn();
44
45
  }
45
46
  finally {
46
- fs.statSync = original;
47
+ fsMutable.statSync = original;
47
48
  syncBuiltinESMExports();
48
49
  }
49
50
  }
@@ -1051,21 +1052,139 @@ describe('buildWorkerStartupCommand', () => {
1051
1052
  delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1052
1053
  }
1053
1054
  });
1054
- it('does not use startup scripts on win32/MSYS so existing tmux path translation remains in force', () => {
1055
+ it('uses a generated startup script with MSYS paths on win32/MSYS', async () => {
1055
1056
  const originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1056
1057
  const prevMsystem = process.env.MSYSTEM;
1058
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1059
+ const stateRoot = 'C:\\omx-state';
1060
+ try {
1061
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1062
+ process.env.MSYSTEM = 'MINGW64';
1063
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1064
+ const cmd = writeWorkerStartupScriptCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo', { OMX_TEAM_STATE_ROOT: stateRoot }, 'gemini');
1065
+ assert.equal(cmd, `exec /bin/sh '/c/omx-state/team/alpha/runtime/worker-1-startup.sh'`);
1066
+ const script = await readFile(join(stateRoot, 'team', 'alpha', 'runtime', 'worker-1-startup.sh'), 'utf-8');
1067
+ assert.match(script, /^cd '\/c\/repo'$/m);
1068
+ assert.match(script, /^exec '\/bin\/sh' -c /m);
1069
+ }
1070
+ finally {
1071
+ await rm(stateRoot, { recursive: true, force: true });
1072
+ if (originalPlatform)
1073
+ Object.defineProperty(process, 'platform', originalPlatform);
1074
+ if (typeof prevMsystem === 'string')
1075
+ process.env.MSYSTEM = prevMsystem;
1076
+ else
1077
+ delete process.env.MSYSTEM;
1078
+ if (typeof prevBypass === 'string')
1079
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1080
+ else
1081
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1082
+ }
1083
+ });
1084
+ it('does not emit cmd.exe flag wrappers for MSYS startup scripts with cmd shims', async () => {
1085
+ const fakeRoot = await mkdtemp(join(tmpdir(), 'omx-worker-startup-msys-cmd-shim-'));
1086
+ const fakeBin = join(fakeRoot, 'bin dir');
1087
+ const stateRoot = join(fakeRoot, 'state root');
1088
+ const startupScriptPath = join(stateRoot, 'team', 'alpha', 'runtime', 'worker-1-startup.sh');
1089
+ const originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1090
+ const prevPath = process.env.PATH;
1091
+ const prevPathext = process.env.PATHEXT;
1092
+ const prevMsystem = process.env.MSYSTEM;
1093
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1094
+ try {
1095
+ await mkdir(fakeBin, { recursive: true });
1096
+ const geminiCmdPath = join(fakeBin, 'gemini.cmd');
1097
+ await writeFile(geminiCmdPath, '@echo off\r\n');
1098
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1099
+ process.env.PATH = fakeBin;
1100
+ process.env.PATHEXT = '.CMD';
1101
+ process.env.MSYSTEM = 'MINGW64';
1102
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1103
+ const cmd = writeWorkerStartupScriptCommand('alpha', 1, ['--model', 'gemini-2.5-pro'], 'C:\\repo with space', { OMX_TEAM_STATE_ROOT: stateRoot }, 'gemini');
1104
+ assert.equal(cmd, `exec /bin/sh '${startupScriptPath}'`);
1105
+ const script = await readFile(startupScriptPath, 'utf-8');
1106
+ assert.doesNotMatch(script, /cmd\.exe/i);
1107
+ assert.doesNotMatch(script, /'\/d'|'\/s'|'\/c'|\s\/d\s|\s\/s\s|\s\/c\s/i);
1108
+ assert.match(script, /^cd '\/c\/repo with space'$/m);
1109
+ assert.match(script, /^exec '\/bin\/sh' -c /m);
1110
+ assert.match(script, new RegExp(escapeRegExp(geminiCmdPath)));
1111
+ assert.match(script, /--approval-mode/);
1112
+ assert.match(script, /yolo/);
1113
+ }
1114
+ finally {
1115
+ await rm(fakeRoot, { recursive: true, force: true });
1116
+ if (originalPlatform)
1117
+ Object.defineProperty(process, 'platform', originalPlatform);
1118
+ if (typeof prevPath === 'string')
1119
+ process.env.PATH = prevPath;
1120
+ else
1121
+ delete process.env.PATH;
1122
+ if (typeof prevPathext === 'string')
1123
+ process.env.PATHEXT = prevPathext;
1124
+ else
1125
+ delete process.env.PATHEXT;
1126
+ if (typeof prevMsystem === 'string')
1127
+ process.env.MSYSTEM = prevMsystem;
1128
+ else
1129
+ delete process.env.MSYSTEM;
1130
+ if (typeof prevBypass === 'string')
1131
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1132
+ else
1133
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1134
+ }
1135
+ });
1136
+ it('wraps MSYS prompt worker cmd shims for shell-free Windows spawn', async () => {
1137
+ const fakeRoot = await mkdtemp(join(tmpdir(), 'omx-worker-process-msys-bat-shim-'));
1138
+ const fakeBin = join(fakeRoot, 'bin dir');
1139
+ const originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1140
+ const prevPath = process.env.PATH;
1141
+ const prevPathext = process.env.PATHEXT;
1142
+ const prevMsystem = process.env.MSYSTEM;
1143
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1144
+ const prevComSpec = process.env.ComSpec;
1057
1145
  try {
1146
+ await mkdir(fakeBin, { recursive: true });
1147
+ const geminiBatPath = join(fakeBin, 'gemini.bat');
1148
+ await writeFile(geminiBatPath, '@echo off\r\n');
1058
1149
  Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1150
+ process.env.PATH = fakeBin;
1151
+ process.env.PATHEXT = '.BAT';
1059
1152
  process.env.MSYSTEM = 'MINGW64';
1060
- assert.equal(writeWorkerStartupScriptCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo', { OMX_TEAM_STATE_ROOT: 'C:\\repo\\.omx\\state' }), null);
1153
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1154
+ process.env.ComSpec = 'C:\\Windows\\System32\\cmd.exe';
1155
+ const spec = buildWorkerProcessLaunchSpec('alpha', 1, ['--model', 'gemini-2.5-pro'], 'C:\\repo with space', {}, 'gemini');
1156
+ assert.equal(spec.command, 'C:\\Windows\\System32\\cmd.exe');
1157
+ assert.deepEqual(spec.args.slice(0, 3), ['/d', '/s', '/c']);
1158
+ assert.match(spec.args[3] ?? '', new RegExp(escapeRegExp(geminiBatPath)));
1159
+ assert.match(spec.args[3] ?? '', /--approval-mode/);
1160
+ assert.match(spec.args[3] ?? '', /yolo/);
1161
+ assert.equal(spec.env.OMX_LEADER_CLI_PATH, geminiBatPath);
1162
+ assert.notEqual(spec.command, geminiBatPath);
1061
1163
  }
1062
1164
  finally {
1165
+ await rm(fakeRoot, { recursive: true, force: true });
1063
1166
  if (originalPlatform)
1064
1167
  Object.defineProperty(process, 'platform', originalPlatform);
1168
+ if (typeof prevPath === 'string')
1169
+ process.env.PATH = prevPath;
1170
+ else
1171
+ delete process.env.PATH;
1172
+ if (typeof prevPathext === 'string')
1173
+ process.env.PATHEXT = prevPathext;
1174
+ else
1175
+ delete process.env.PATHEXT;
1065
1176
  if (typeof prevMsystem === 'string')
1066
1177
  process.env.MSYSTEM = prevMsystem;
1067
1178
  else
1068
1179
  delete process.env.MSYSTEM;
1180
+ if (typeof prevBypass === 'string')
1181
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1182
+ else
1183
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1184
+ if (typeof prevComSpec === 'string')
1185
+ process.env.ComSpec = prevComSpec;
1186
+ else
1187
+ delete process.env.ComSpec;
1069
1188
  }
1070
1189
  });
1071
1190
  it('writes a short worker startup script under team runtime state when available', async () => {