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.
- package/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/README.md +1 -1
- package/crates/omx-explore/src/main.rs +2 -2
- package/dist/agents/__tests__/definitions.test.js +1 -1
- package/dist/agents/__tests__/definitions.test.js.map +1 -1
- package/dist/agents/__tests__/native-config.test.js +4 -4
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/definitions.js +1 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/cli/__tests__/agents.test.js +5 -5
- package/dist/cli/__tests__/cleanup.test.js +27 -0
- package/dist/cli/__tests__/cleanup.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-invalid-config.test.js +1 -1
- package/dist/cli/__tests__/explore.test.js +62 -5
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +63 -0
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/question.test.js +146 -1
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +6 -6
- package/dist/cli/__tests__/uninstall.test.js +8 -8
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/agents.js +1 -1
- package/dist/cli/cleanup.d.ts.map +1 -1
- package/dist/cli/cleanup.js +18 -2
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/codex-home.d.ts +8 -0
- package/dist/cli/codex-home.d.ts.map +1 -0
- package/dist/cli/codex-home.js +54 -0
- package/dist/cli/codex-home.js.map +1 -0
- package/dist/cli/explore.d.ts +1 -0
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +15 -6
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +1 -6
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -49
- package/dist/cli/index.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +56 -12
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +12 -12
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +60 -22
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +1 -1
- package/dist/config/models.js +1 -1
- package/dist/hooks/__tests__/clawhip-event-contract.test.js +7 -0
- package/dist/hooks/__tests__/clawhip-event-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js +17 -0
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +87 -0
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +1 -1
- package/dist/hooks/__tests__/skill-guidance-contract.test.js +8 -1
- package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/tmux-hook-engine.test.js +2 -2
- package/dist/hooks/extensibility/__tests__/events.test.js +6 -0
- package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -1
- package/dist/hooks/extensibility/types.d.ts +1 -1
- package/dist/hooks/extensibility/types.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +3 -0
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +11 -4
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
- package/dist/hooks/prompt-guidance-contract.js +31 -15
- package/dist/hooks/prompt-guidance-contract.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +22 -0
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/reconcile.d.ts +2 -1
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +3 -2
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/tmux.d.ts +3 -2
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +11 -4
- package/dist/hud/tmux.js.map +1 -1
- package/dist/question/__tests__/deep-interview.test.js +58 -1
- package/dist/question/__tests__/deep-interview.test.js.map +1 -1
- package/dist/question/__tests__/renderer.test.js +282 -24
- package/dist/question/__tests__/renderer.test.js.map +1 -1
- package/dist/question/__tests__/state.test.js +27 -0
- package/dist/question/__tests__/state.test.js.map +1 -1
- package/dist/question/__tests__/ui.test.js +129 -0
- package/dist/question/__tests__/ui.test.js.map +1 -1
- package/dist/question/deep-interview.d.ts +1 -0
- package/dist/question/deep-interview.d.ts.map +1 -1
- package/dist/question/deep-interview.js +80 -2
- package/dist/question/deep-interview.js.map +1 -1
- package/dist/question/renderer.d.ts +4 -1
- package/dist/question/renderer.d.ts.map +1 -1
- package/dist/question/renderer.js +101 -4
- package/dist/question/renderer.js.map +1 -1
- package/dist/question/state.js +1 -1
- package/dist/question/state.js.map +1 -1
- package/dist/question/ui.d.ts +3 -1
- package/dist/question/ui.d.ts.map +1 -1
- package/dist/question/ui.js +14 -6
- package/dist/question/ui.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +265 -3
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +47 -9
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +47 -0
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts +2 -0
- package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts.map +1 -0
- package/dist/scripts/notify-hook/__tests__/operational-events.test.js +24 -0
- package/dist/scripts/notify-hook/__tests__/operational-events.test.js.map +1 -0
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +9 -0
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/team/__tests__/events.test.js +25 -0
- package/dist/team/__tests__/events.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +3 -3
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +18 -7
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +1 -1
- package/dist/team/__tests__/tmux-session.test.js +296 -5
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +30 -0
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +60 -3
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/utils/__tests__/agents-model-table.test.js +1 -1
- package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
- package/package.json +2 -2
- package/skills/deep-interview/SKILL.md +13 -2
- package/skills/ultrawork/SKILL.md +91 -59
- package/src/scripts/__tests__/codex-native-hook.test.ts +318 -3
- package/src/scripts/codex-native-hook.ts +49 -6
- package/src/scripts/codex-native-pre-post.ts +45 -0
- package/src/scripts/notify-hook/__tests__/operational-events.test.ts +24 -0
- package/src/scripts/notify-hook/team-dispatch.ts +9 -0
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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;
|