oh-my-codex 0.14.2 → 0.14.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +1 -1
  4. package/crates/omx-explore/src/main.rs +2 -2
  5. package/dist/agents/__tests__/definitions.test.js +1 -1
  6. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  7. package/dist/agents/__tests__/native-config.test.js +4 -4
  8. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  9. package/dist/agents/definitions.js +1 -1
  10. package/dist/agents/definitions.js.map +1 -1
  11. package/dist/cli/__tests__/agents.test.js +5 -5
  12. package/dist/cli/__tests__/cleanup.test.js +27 -0
  13. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  14. package/dist/cli/__tests__/doctor-invalid-config.test.js +1 -1
  15. package/dist/cli/__tests__/explore.test.js +62 -5
  16. package/dist/cli/__tests__/explore.test.js.map +1 -1
  17. package/dist/cli/__tests__/index.test.js +63 -0
  18. package/dist/cli/__tests__/index.test.js.map +1 -1
  19. package/dist/cli/__tests__/question.test.js +146 -1
  20. package/dist/cli/__tests__/question.test.js.map +1 -1
  21. package/dist/cli/__tests__/setup-agents-overwrite.test.js +1 -1
  22. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  23. package/dist/cli/__tests__/setup-refresh.test.js +6 -6
  24. package/dist/cli/__tests__/uninstall.test.js +8 -8
  25. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  26. package/dist/cli/agents.js +1 -1
  27. package/dist/cli/cleanup.d.ts.map +1 -1
  28. package/dist/cli/cleanup.js +18 -2
  29. package/dist/cli/cleanup.js.map +1 -1
  30. package/dist/cli/codex-home.d.ts +8 -0
  31. package/dist/cli/codex-home.d.ts.map +1 -0
  32. package/dist/cli/codex-home.js +54 -0
  33. package/dist/cli/codex-home.js.map +1 -0
  34. package/dist/cli/explore.d.ts +1 -0
  35. package/dist/cli/explore.d.ts.map +1 -1
  36. package/dist/cli/explore.js +15 -6
  37. package/dist/cli/explore.js.map +1 -1
  38. package/dist/cli/index.d.ts +1 -6
  39. package/dist/cli/index.d.ts.map +1 -1
  40. package/dist/cli/index.js +2 -49
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/config/__tests__/generator-idempotent.test.js +56 -12
  43. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  44. package/dist/config/__tests__/generator-notify.test.js +12 -12
  45. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  46. package/dist/config/generator.d.ts.map +1 -1
  47. package/dist/config/generator.js +60 -22
  48. package/dist/config/generator.js.map +1 -1
  49. package/dist/config/models.d.ts +1 -1
  50. package/dist/config/models.js +1 -1
  51. package/dist/hooks/__tests__/clawhip-event-contract.test.js +7 -0
  52. package/dist/hooks/__tests__/clawhip-event-contract.test.js.map +1 -1
  53. package/dist/hooks/__tests__/deep-interview-contract.test.js +17 -0
  54. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  55. package/dist/hooks/__tests__/keyword-detector.test.js +87 -0
  56. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  57. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +1 -1
  58. package/dist/hooks/__tests__/skill-guidance-contract.test.js +8 -1
  59. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  60. package/dist/hooks/__tests__/tmux-hook-engine.test.js +2 -2
  61. package/dist/hooks/extensibility/__tests__/events.test.js +6 -0
  62. package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -1
  63. package/dist/hooks/extensibility/types.d.ts +1 -1
  64. package/dist/hooks/extensibility/types.d.ts.map +1 -1
  65. package/dist/hooks/keyword-detector.d.ts +3 -0
  66. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  67. package/dist/hooks/keyword-detector.js +11 -4
  68. package/dist/hooks/keyword-detector.js.map +1 -1
  69. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  70. package/dist/hooks/prompt-guidance-contract.js +31 -15
  71. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  72. package/dist/hud/__tests__/reconcile.test.js +22 -0
  73. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  74. package/dist/hud/reconcile.d.ts +2 -1
  75. package/dist/hud/reconcile.d.ts.map +1 -1
  76. package/dist/hud/reconcile.js +3 -2
  77. package/dist/hud/reconcile.js.map +1 -1
  78. package/dist/hud/tmux.d.ts +3 -2
  79. package/dist/hud/tmux.d.ts.map +1 -1
  80. package/dist/hud/tmux.js +11 -4
  81. package/dist/hud/tmux.js.map +1 -1
  82. package/dist/question/__tests__/deep-interview.test.js +58 -1
  83. package/dist/question/__tests__/deep-interview.test.js.map +1 -1
  84. package/dist/question/__tests__/renderer.test.js +282 -24
  85. package/dist/question/__tests__/renderer.test.js.map +1 -1
  86. package/dist/question/__tests__/state.test.js +27 -0
  87. package/dist/question/__tests__/state.test.js.map +1 -1
  88. package/dist/question/__tests__/ui.test.js +129 -0
  89. package/dist/question/__tests__/ui.test.js.map +1 -1
  90. package/dist/question/deep-interview.d.ts +1 -0
  91. package/dist/question/deep-interview.d.ts.map +1 -1
  92. package/dist/question/deep-interview.js +80 -2
  93. package/dist/question/deep-interview.js.map +1 -1
  94. package/dist/question/renderer.d.ts +4 -1
  95. package/dist/question/renderer.d.ts.map +1 -1
  96. package/dist/question/renderer.js +101 -4
  97. package/dist/question/renderer.js.map +1 -1
  98. package/dist/question/state.js +1 -1
  99. package/dist/question/state.js.map +1 -1
  100. package/dist/question/ui.d.ts +3 -1
  101. package/dist/question/ui.d.ts.map +1 -1
  102. package/dist/question/ui.js +14 -6
  103. package/dist/question/ui.js.map +1 -1
  104. package/dist/scripts/__tests__/codex-native-hook.test.js +265 -3
  105. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  106. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  107. package/dist/scripts/codex-native-hook.js +47 -9
  108. package/dist/scripts/codex-native-hook.js.map +1 -1
  109. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  110. package/dist/scripts/codex-native-pre-post.js +47 -0
  111. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  112. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts +2 -0
  113. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts.map +1 -0
  114. package/dist/scripts/notify-hook/__tests__/operational-events.test.js +24 -0
  115. package/dist/scripts/notify-hook/__tests__/operational-events.test.js.map +1 -0
  116. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  117. package/dist/scripts/notify-hook/team-dispatch.js +9 -0
  118. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  119. package/dist/team/__tests__/events.test.js +25 -0
  120. package/dist/team/__tests__/events.test.js.map +1 -1
  121. package/dist/team/__tests__/model-contract.test.js +3 -3
  122. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  123. package/dist/team/__tests__/runtime.test.js +18 -7
  124. package/dist/team/__tests__/runtime.test.js.map +1 -1
  125. package/dist/team/__tests__/scaling.test.js +1 -1
  126. package/dist/team/__tests__/tmux-session.test.js +296 -5
  127. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  128. package/dist/team/runtime.d.ts.map +1 -1
  129. package/dist/team/runtime.js +30 -0
  130. package/dist/team/runtime.js.map +1 -1
  131. package/dist/team/tmux-session.d.ts.map +1 -1
  132. package/dist/team/tmux-session.js +60 -3
  133. package/dist/team/tmux-session.js.map +1 -1
  134. package/dist/utils/__tests__/agents-model-table.test.js +1 -1
  135. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  136. package/package.json +2 -2
  137. package/skills/deep-interview/SKILL.md +13 -2
  138. package/skills/ultrawork/SKILL.md +91 -59
  139. package/src/scripts/__tests__/codex-native-hook.test.ts +318 -3
  140. package/src/scripts/codex-native-hook.ts +49 -6
  141. package/src/scripts/codex-native-pre-post.ts +45 -0
  142. package/src/scripts/notify-hook/__tests__/operational-events.test.ts +24 -0
  143. package/src/scripts/notify-hook/team-dispatch.ts +9 -0
  144. package/templates/AGENTS.md +1 -1
@@ -468,7 +468,7 @@ exit 0
468
468
  await rm(fakeBinDir, { recursive: true, force: true });
469
469
  }
470
470
  });
471
- it('does not apply mini guidance during scale-up when the final worker model is gpt-5.4', async () => {
471
+ it('does not apply mini guidance during scale-up when the final worker model is gpt-5.5', async () => {
472
472
  const cwd = await mkdtemp(join(tmpdir(), 'omx-scale-up-frontier-role-'));
473
473
  const fakeBinDir = await mkdtemp(join(tmpdir(), 'omx-scale-up-frontier-role-bin-'));
474
474
  const tmuxStubPath = join(fakeBinDir, 'tmux');
@@ -47,7 +47,7 @@ Press Enter to confirm`;
47
47
  const READY_HELPER_CAPTURE = `╭────────────────────────────────────────────╮
48
48
  │ >_ OpenAI Codex (v0.114.0) │
49
49
  │ │
50
- │ model: gpt-5.4 high /model to change │
50
+ │ model: gpt-5.5 high /model to change │
51
51
  │ directory: ~/Workspace/demo │
52
52
  ╰────────────────────────────────────────────╯
53
53
 
@@ -55,7 +55,7 @@ How can I help you today?`;
55
55
  const VIEWPORT_WITHOUT_VISIBLE_PROMPT_CAPTURE = `╭────────────────────────────────────────────╮
56
56
  │ >_ OpenAI Codex (v0.118.0) │
57
57
  │ │
58
- │ model: gpt-5.4 high /model to change │
58
+ │ model: gpt-5.5 high /model to change │
59
59
  │ directory: ~/Workspace/demo │
60
60
  ╰────────────────────────────────────────────╯
61
61
 
@@ -1344,6 +1344,168 @@ describe('buildWorkerStartupCommand', () => {
1344
1344
  await rm(fakeBin, { recursive: true, force: true });
1345
1345
  }
1346
1346
  });
1347
+ it('uses the resolved PowerShell executable path in native Windows startup commands', async () => {
1348
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-worker-startup-win32-powershell-'));
1349
+ const prevPath = process.env.PATH;
1350
+ const prevPathext = process.env.PATHEXT;
1351
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1352
+ const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;
1353
+ const prevMsystem = process.env.MSYSTEM;
1354
+ const prevOstype = process.env.OSTYPE;
1355
+ const prevWsl = process.env.WSL_DISTRO_NAME;
1356
+ const prevWslInterop = process.env.WSL_INTEROP;
1357
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1358
+ process.env.PATH = fakeBin;
1359
+ process.env.PATHEXT = '.EXE;.PS1';
1360
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1361
+ process.env.OMX_LEADER_NODE_PATH = 'C:\\Program Files\\nodejs\\node.exe';
1362
+ delete process.env.MSYSTEM;
1363
+ delete process.env.OSTYPE;
1364
+ delete process.env.WSL_DISTRO_NAME;
1365
+ delete process.env.WSL_INTEROP;
1366
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1367
+ try {
1368
+ const codexPs1Path = join(fakeBin, 'codex.ps1');
1369
+ const powershellExePath = join(fakeBin, 'powershell.exe');
1370
+ await writeFile(codexPs1Path, '');
1371
+ await writeFile(powershellExePath, '');
1372
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo');
1373
+ const prefix = `${powershellExePath} -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand `;
1374
+ assert.ok(cmd.startsWith(prefix), cmd);
1375
+ }
1376
+ finally {
1377
+ if (origPlatform)
1378
+ Object.defineProperty(process, 'platform', origPlatform);
1379
+ if (typeof prevPath === 'string')
1380
+ process.env.PATH = prevPath;
1381
+ else
1382
+ delete process.env.PATH;
1383
+ if (typeof prevPathext === 'string')
1384
+ process.env.PATHEXT = prevPathext;
1385
+ else
1386
+ delete process.env.PATHEXT;
1387
+ if (typeof prevBypass === 'string')
1388
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1389
+ else
1390
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1391
+ if (typeof prevLeaderNodePath === 'string')
1392
+ process.env.OMX_LEADER_NODE_PATH = prevLeaderNodePath;
1393
+ else
1394
+ delete process.env.OMX_LEADER_NODE_PATH;
1395
+ if (typeof prevMsystem === 'string')
1396
+ process.env.MSYSTEM = prevMsystem;
1397
+ else
1398
+ delete process.env.MSYSTEM;
1399
+ if (typeof prevOstype === 'string')
1400
+ process.env.OSTYPE = prevOstype;
1401
+ else
1402
+ delete process.env.OSTYPE;
1403
+ if (typeof prevWsl === 'string')
1404
+ process.env.WSL_DISTRO_NAME = prevWsl;
1405
+ else
1406
+ delete process.env.WSL_DISTRO_NAME;
1407
+ if (typeof prevWslInterop === 'string')
1408
+ process.env.WSL_INTEROP = prevWslInterop;
1409
+ else
1410
+ delete process.env.WSL_INTEROP;
1411
+ await rm(fakeBin, { recursive: true, force: true });
1412
+ }
1413
+ });
1414
+ it('prefers a no-space native Windows PowerShell path when one is available', async () => {
1415
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-worker-startup-win32-nospace-powershell-'));
1416
+ const prevPath = process.env.PATH;
1417
+ const prevPathext = process.env.PATHEXT;
1418
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1419
+ const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;
1420
+ const prevSystemRoot = process.env.SystemRoot;
1421
+ const prevSYSTEMROOT = process.env.SYSTEMROOT;
1422
+ const prevWindir = process.env.windir;
1423
+ const prevWINDIR = process.env.WINDIR;
1424
+ const prevMsystem = process.env.MSYSTEM;
1425
+ const prevOstype = process.env.OSTYPE;
1426
+ const prevWsl = process.env.WSL_DISTRO_NAME;
1427
+ const prevWslInterop = process.env.WSL_INTEROP;
1428
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1429
+ process.env.PATH = fakeBin;
1430
+ process.env.PATHEXT = '.EXE;.PS1';
1431
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1432
+ process.env.OMX_LEADER_NODE_PATH = 'C:\\Program Files\\nodejs\\node.exe';
1433
+ process.env.SystemRoot = 'C:\\Windows';
1434
+ delete process.env.SYSTEMROOT;
1435
+ delete process.env.windir;
1436
+ delete process.env.WINDIR;
1437
+ delete process.env.MSYSTEM;
1438
+ delete process.env.OSTYPE;
1439
+ delete process.env.WSL_DISTRO_NAME;
1440
+ delete process.env.WSL_INTEROP;
1441
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1442
+ try {
1443
+ const codexPs1Path = join(fakeBin, 'codex.ps1');
1444
+ const pathPowerShellExe = join(fakeBin, 'powershell.exe');
1445
+ const windowsPowerShellExe = 'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe';
1446
+ await writeFile(codexPs1Path, '');
1447
+ await writeFile(pathPowerShellExe, '');
1448
+ const cmd = withMockedExistsSync((candidate) => candidate === windowsPowerShellExe
1449
+ || candidate === pathPowerShellExe
1450
+ || candidate === codexPs1Path, () => buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo'));
1451
+ const prefix = `${windowsPowerShellExe} -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand `;
1452
+ assert.ok(cmd.startsWith(prefix), cmd);
1453
+ assert.ok(!cmd.startsWith(`${pathPowerShellExe} `), cmd);
1454
+ }
1455
+ finally {
1456
+ if (origPlatform)
1457
+ Object.defineProperty(process, 'platform', origPlatform);
1458
+ if (typeof prevPath === 'string')
1459
+ process.env.PATH = prevPath;
1460
+ else
1461
+ delete process.env.PATH;
1462
+ if (typeof prevPathext === 'string')
1463
+ process.env.PATHEXT = prevPathext;
1464
+ else
1465
+ delete process.env.PATHEXT;
1466
+ if (typeof prevBypass === 'string')
1467
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1468
+ else
1469
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1470
+ if (typeof prevLeaderNodePath === 'string')
1471
+ process.env.OMX_LEADER_NODE_PATH = prevLeaderNodePath;
1472
+ else
1473
+ delete process.env.OMX_LEADER_NODE_PATH;
1474
+ if (typeof prevSystemRoot === 'string')
1475
+ process.env.SystemRoot = prevSystemRoot;
1476
+ else
1477
+ delete process.env.SystemRoot;
1478
+ if (typeof prevSYSTEMROOT === 'string')
1479
+ process.env.SYSTEMROOT = prevSYSTEMROOT;
1480
+ else
1481
+ delete process.env.SYSTEMROOT;
1482
+ if (typeof prevWindir === 'string')
1483
+ process.env.windir = prevWindir;
1484
+ else
1485
+ delete process.env.windir;
1486
+ if (typeof prevWINDIR === 'string')
1487
+ process.env.WINDIR = prevWINDIR;
1488
+ else
1489
+ delete process.env.WINDIR;
1490
+ if (typeof prevMsystem === 'string')
1491
+ process.env.MSYSTEM = prevMsystem;
1492
+ else
1493
+ delete process.env.MSYSTEM;
1494
+ if (typeof prevOstype === 'string')
1495
+ process.env.OSTYPE = prevOstype;
1496
+ else
1497
+ delete process.env.OSTYPE;
1498
+ if (typeof prevWsl === 'string')
1499
+ process.env.WSL_DISTRO_NAME = prevWsl;
1500
+ else
1501
+ delete process.env.WSL_DISTRO_NAME;
1502
+ if (typeof prevWslInterop === 'string')
1503
+ process.env.WSL_INTEROP = prevWslInterop;
1504
+ else
1505
+ delete process.env.WSL_INTEROP;
1506
+ await rm(fakeBin, { recursive: true, force: true });
1507
+ }
1508
+ });
1347
1509
  it('uses the resolved node-hosted Codex launcher in native Windows startup commands', async () => {
1348
1510
  const fakeRoot = await mkdtemp(join(tmpdir(), 'omx-worker-startup-win32-node-hosted-'));
1349
1511
  const fakeBin = join(fakeRoot, 'node_modules', '.bin');
@@ -2036,7 +2198,7 @@ case "$1" in
2036
2198
  ╭────────────────────────────────────────────╮
2037
2199
  │ >_ OpenAI Codex (v0.114.0) │
2038
2200
  │ │
2039
- │ model: gpt-5.4 high /model to change │
2201
+ │ model: gpt-5.5 high /model to change │
2040
2202
  │ directory: ~/Workspace/demo │
2041
2203
  ╰────────────────────────────────────────────╯
2042
2204
 
@@ -2207,7 +2369,14 @@ case "\${1:-}" in
2207
2369
  exit 0
2208
2370
  ;;
2209
2371
  list-panes)
2210
- printf "%%1\\tnode\\t'codex'\\n"
2372
+ case "$*" in
2373
+ *"pane_current_command"*)
2374
+ printf "%%1\\tnode\\t'codex'\\n%%2\\tgemini\\t'gemini'\\n%%3\\tnode\\t'node omx hud --watch'\\n"
2375
+ ;;
2376
+ *)
2377
+ printf "%%1\\n%%2\\n%%3\\n"
2378
+ ;;
2379
+ esac
2211
2380
  exit 0
2212
2381
  ;;
2213
2382
  split-window)
@@ -2317,7 +2486,14 @@ case "\${1:-}" in
2317
2486
  exit 0
2318
2487
  ;;
2319
2488
  list-panes)
2320
- printf "%%1\\tnode\\t'codex'\\n"
2489
+ case "$*" in
2490
+ *"pane_current_command"*)
2491
+ printf "%%1\\tnode\\t'codex'\\n%%2\\tgemini\\t'gemini'\\n%%3\\tnode\\t'node omx hud --watch'\\n"
2492
+ ;;
2493
+ *)
2494
+ printf "%%1\\n%%2\\n%%3\\n"
2495
+ ;;
2496
+ esac
2321
2497
  exit 0
2322
2498
  ;;
2323
2499
  split-window)
@@ -2400,6 +2576,121 @@ esac
2400
2576
  await rm(cwd, { recursive: true, force: true });
2401
2577
  }
2402
2578
  });
2579
+ it('rejects synthetic worker and HUD pane ids that never materialize on native Windows', async () => {
2580
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-win32-synthetic-pane-'));
2581
+ const prevTmux = process.env.TMUX;
2582
+ const prevTmuxPane = process.env.TMUX_PANE;
2583
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
2584
+ const prevMsystem = process.env.MSYSTEM;
2585
+ const prevOstype = process.env.OSTYPE;
2586
+ const prevWsl = process.env.WSL_DISTRO_NAME;
2587
+ const prevWslInterop = process.env.WSL_INTEROP;
2588
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
2589
+ try {
2590
+ await withMockTmuxFixture('omx-tmux-win32-synthetic-pane-', (logPath) => `#!/bin/sh
2591
+ set -eu
2592
+ printf '%s\\n' "$*" >> "${logPath}"
2593
+ case "\${1:-}" in
2594
+ -V)
2595
+ echo "tmux 3.3.2"
2596
+ exit 0
2597
+ ;;
2598
+ display-message)
2599
+ case "$*" in
2600
+ *"#{window_width}"*)
2601
+ echo "120"
2602
+ ;;
2603
+ *)
2604
+ echo "leader:0 %1"
2605
+ ;;
2606
+ esac
2607
+ exit 0
2608
+ ;;
2609
+ list-panes)
2610
+ case "$*" in
2611
+ *"pane_current_command"*)
2612
+ printf "%%1\\tnode\\t'codex'\\n"
2613
+ ;;
2614
+ *)
2615
+ printf "%%1\\n"
2616
+ ;;
2617
+ esac
2618
+ exit 0
2619
+ ;;
2620
+ split-window)
2621
+ case "$*" in
2622
+ *" -h "*)
2623
+ echo "%2"
2624
+ ;;
2625
+ *)
2626
+ echo "%3"
2627
+ ;;
2628
+ esac
2629
+ exit 0
2630
+ ;;
2631
+ kill-pane|select-layout|set-window-option|select-pane|resize-pane|set-hook|run-shell)
2632
+ exit 0
2633
+ ;;
2634
+ *)
2635
+ exit 0
2636
+ ;;
2637
+ esac
2638
+ `, async ({ logPath }) => {
2639
+ const fakeBinDir = join(logPath, '..');
2640
+ const geminiPath = join(fakeBinDir, 'gemini');
2641
+ const powershellExePath = join(fakeBinDir, 'powershell.exe');
2642
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
2643
+ await chmod(geminiPath, 0o755);
2644
+ await writeFile(powershellExePath, '');
2645
+ process.env.TMUX = 'leader-session,stub,0';
2646
+ process.env.TMUX_PANE = '%1';
2647
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
2648
+ delete process.env.MSYSTEM;
2649
+ delete process.env.OSTYPE;
2650
+ delete process.env.WSL_DISTRO_NAME;
2651
+ delete process.env.WSL_INTEROP;
2652
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
2653
+ assert.throws(() => createTeamSession('Windows Team', 1, cwd), /worker pane 1 did not remain present/);
2654
+ const tmuxLog = await readFile(logPath, 'utf-8');
2655
+ const listPaneCalls = tmuxLog.match(/list-panes -t leader:0 -F #\{pane_id\}\t#\{pane_current_command\}\t#\{pane_start_command\}/g) || [];
2656
+ assert.ok(listPaneCalls.length >= 2, tmuxLog);
2657
+ assert.match(tmuxLog, /kill-pane -t %2/);
2658
+ });
2659
+ }
2660
+ finally {
2661
+ if (origPlatform)
2662
+ Object.defineProperty(process, 'platform', origPlatform);
2663
+ if (typeof prevTmux === 'string')
2664
+ process.env.TMUX = prevTmux;
2665
+ else
2666
+ delete process.env.TMUX;
2667
+ if (typeof prevTmuxPane === 'string')
2668
+ process.env.TMUX_PANE = prevTmuxPane;
2669
+ else
2670
+ delete process.env.TMUX_PANE;
2671
+ if (typeof prevWorkerCli === 'string')
2672
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
2673
+ else
2674
+ delete process.env.OMX_TEAM_WORKER_CLI;
2675
+ if (typeof prevMsystem === 'string')
2676
+ process.env.MSYSTEM = prevMsystem;
2677
+ else
2678
+ delete process.env.MSYSTEM;
2679
+ if (typeof prevOstype === 'string')
2680
+ process.env.OSTYPE = prevOstype;
2681
+ else
2682
+ delete process.env.OSTYPE;
2683
+ if (typeof prevWsl === 'string')
2684
+ process.env.WSL_DISTRO_NAME = prevWsl;
2685
+ else
2686
+ delete process.env.WSL_DISTRO_NAME;
2687
+ if (typeof prevWslInterop === 'string')
2688
+ process.env.WSL_INTEROP = prevWslInterop;
2689
+ else
2690
+ delete process.env.WSL_INTEROP;
2691
+ await rm(cwd, { recursive: true, force: true });
2692
+ }
2693
+ });
2403
2694
  it('restores standalone HUD panes with direct resize on native Windows', async () => {
2404
2695
  const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-win32-hud-'));
2405
2696
  const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;