oh-my-codex 0.18.1 → 0.18.2

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 (204) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +4 -2
  4. package/dist/agents/__tests__/definitions.test.js +14 -0
  5. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  6. package/dist/agents/__tests__/native-config.test.js +19 -0
  7. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  8. package/dist/agents/definitions.d.ts.map +1 -1
  9. package/dist/agents/definitions.js +30 -0
  10. package/dist/agents/definitions.js.map +1 -1
  11. package/dist/agents/native-config.d.ts +1 -0
  12. package/dist/agents/native-config.d.ts.map +1 -1
  13. package/dist/agents/native-config.js +4 -0
  14. package/dist/agents/native-config.js.map +1 -1
  15. package/dist/catalog/__tests__/generator.test.js +4 -0
  16. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  17. package/dist/cli/__tests__/doctor-warning-copy.test.js +61 -5
  18. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  19. package/dist/cli/__tests__/index.test.js +161 -21
  20. package/dist/cli/__tests__/index.test.js.map +1 -1
  21. package/dist/cli/__tests__/launch-fallback.test.js +51 -3
  22. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  23. package/dist/cli/__tests__/question.test.js +2 -2
  24. package/dist/cli/__tests__/question.test.js.map +1 -1
  25. package/dist/cli/doctor.d.ts.map +1 -1
  26. package/dist/cli/doctor.js +178 -7
  27. package/dist/cli/doctor.js.map +1 -1
  28. package/dist/cli/index.d.ts +7 -1
  29. package/dist/cli/index.d.ts.map +1 -1
  30. package/dist/cli/index.js +143 -43
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/config/__tests__/codex-hooks.test.js +3 -3
  33. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  34. package/dist/config/codex-hooks.d.ts +1 -0
  35. package/dist/config/codex-hooks.d.ts.map +1 -1
  36. package/dist/config/codex-hooks.js +2 -4
  37. package/dist/config/codex-hooks.js.map +1 -1
  38. package/dist/config/generator.d.ts +14 -0
  39. package/dist/config/generator.d.ts.map +1 -1
  40. package/dist/config/generator.js +100 -1
  41. package/dist/config/generator.js.map +1 -1
  42. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +21 -0
  43. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
  44. package/dist/goal-workflows/codex-goal-snapshot.d.ts +3 -0
  45. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  46. package/dist/goal-workflows/codex-goal-snapshot.js +45 -2
  47. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  48. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +17 -0
  49. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  50. package/dist/hooks/__tests__/keyword-detector.test.js +170 -15
  51. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  52. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts +2 -0
  53. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts.map +1 -0
  54. package/dist/hooks/__tests__/prometheus-strict-contract.test.js +320 -0
  55. package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -0
  56. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +12 -0
  57. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
  58. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts +2 -0
  59. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts.map +1 -0
  60. package/dist/hooks/__tests__/research-workflow-boundaries.test.js +35 -0
  61. package/dist/hooks/__tests__/research-workflow-boundaries.test.js.map +1 -0
  62. package/dist/hooks/keyword-detector.d.ts +1 -1
  63. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  64. package/dist/hooks/keyword-detector.js +28 -6
  65. package/dist/hooks/keyword-detector.js.map +1 -1
  66. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  67. package/dist/hooks/keyword-registry.js +1 -0
  68. package/dist/hooks/keyword-registry.js.map +1 -1
  69. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  70. package/dist/hooks/prompt-guidance-contract.js +11 -0
  71. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  72. package/dist/hud/__tests__/hud-tmux-injection.test.js +22 -0
  73. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  74. package/dist/hud/__tests__/reconcile.test.js +121 -10
  75. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  76. package/dist/hud/__tests__/render.test.js +84 -0
  77. package/dist/hud/__tests__/render.test.js.map +1 -1
  78. package/dist/hud/__tests__/state.test.js +51 -1
  79. package/dist/hud/__tests__/state.test.js.map +1 -1
  80. package/dist/hud/__tests__/tmux.test.js +69 -23
  81. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  82. package/dist/hud/index.d.ts +1 -1
  83. package/dist/hud/index.d.ts.map +1 -1
  84. package/dist/hud/index.js +8 -3
  85. package/dist/hud/index.js.map +1 -1
  86. package/dist/hud/reconcile.d.ts.map +1 -1
  87. package/dist/hud/reconcile.js +6 -3
  88. package/dist/hud/reconcile.js.map +1 -1
  89. package/dist/hud/render.d.ts.map +1 -1
  90. package/dist/hud/render.js +26 -0
  91. package/dist/hud/render.js.map +1 -1
  92. package/dist/hud/state.d.ts +2 -1
  93. package/dist/hud/state.d.ts.map +1 -1
  94. package/dist/hud/state.js +62 -1
  95. package/dist/hud/state.js.map +1 -1
  96. package/dist/hud/tmux.d.ts +10 -3
  97. package/dist/hud/tmux.d.ts.map +1 -1
  98. package/dist/hud/tmux.js +59 -10
  99. package/dist/hud/tmux.js.map +1 -1
  100. package/dist/hud/types.d.ts +22 -0
  101. package/dist/hud/types.d.ts.map +1 -1
  102. package/dist/hud/types.js.map +1 -1
  103. package/dist/pipeline/__tests__/orchestrator.test.js +63 -1
  104. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  105. package/dist/pipeline/__tests__/stages.test.js +410 -4
  106. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  107. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  108. package/dist/pipeline/orchestrator.js +29 -2
  109. package/dist/pipeline/orchestrator.js.map +1 -1
  110. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  111. package/dist/pipeline/stages/ralplan.js +41 -6
  112. package/dist/pipeline/stages/ralplan.js.map +1 -1
  113. package/dist/question/__tests__/ui.test.js +43 -10
  114. package/dist/question/__tests__/ui.test.js.map +1 -1
  115. package/dist/question/ui.d.ts +12 -0
  116. package/dist/question/ui.d.ts.map +1 -1
  117. package/dist/question/ui.js +83 -46
  118. package/dist/question/ui.js.map +1 -1
  119. package/dist/ralplan/__tests__/runtime.test.js +200 -10
  120. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  121. package/dist/ralplan/consensus-gate.d.ts +23 -0
  122. package/dist/ralplan/consensus-gate.d.ts.map +1 -0
  123. package/dist/ralplan/consensus-gate.js +212 -0
  124. package/dist/ralplan/consensus-gate.js.map +1 -0
  125. package/dist/ralplan/runtime.d.ts +25 -0
  126. package/dist/ralplan/runtime.d.ts.map +1 -1
  127. package/dist/ralplan/runtime.js +144 -8
  128. package/dist/ralplan/runtime.js.map +1 -1
  129. package/dist/scripts/__tests__/codex-native-hook.test.js +626 -7
  130. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  131. package/dist/scripts/__tests__/docs-site-contract.test.d.ts +2 -0
  132. package/dist/scripts/__tests__/docs-site-contract.test.d.ts.map +1 -0
  133. package/dist/scripts/__tests__/docs-site-contract.test.js +42 -0
  134. package/dist/scripts/__tests__/docs-site-contract.test.js.map +1 -0
  135. package/dist/scripts/__tests__/notify-dispatcher.test.js +115 -2
  136. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
  137. package/dist/scripts/__tests__/run-test-files.test.js +57 -0
  138. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  139. package/dist/scripts/__tests__/verify-native-agents.test.js +2 -2
  140. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
  141. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  142. package/dist/scripts/codex-native-hook.js +214 -34
  143. package/dist/scripts/codex-native-hook.js.map +1 -1
  144. package/dist/scripts/notify-dispatcher.js +188 -4
  145. package/dist/scripts/notify-dispatcher.js.map +1 -1
  146. package/dist/scripts/run-test-files.js +13 -0
  147. package/dist/scripts/run-test-files.js.map +1 -1
  148. package/dist/state/__tests__/workflow-transition.test.js +6 -0
  149. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  150. package/dist/state/workflow-transition.d.ts +1 -1
  151. package/dist/state/workflow-transition.d.ts.map +1 -1
  152. package/dist/state/workflow-transition.js +7 -0
  153. package/dist/state/workflow-transition.js.map +1 -1
  154. package/dist/subagents/tracker.d.ts.map +1 -1
  155. package/dist/subagents/tracker.js +4 -3
  156. package/dist/subagents/tracker.js.map +1 -1
  157. package/dist/team/__tests__/runtime.test.js +36 -44
  158. package/dist/team/__tests__/runtime.test.js.map +1 -1
  159. package/dist/team/__tests__/tmux-session.test.js +58 -18
  160. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  161. package/dist/team/runtime.d.ts.map +1 -1
  162. package/dist/team/runtime.js +10 -20
  163. package/dist/team/runtime.js.map +1 -1
  164. package/dist/team/tmux-session.d.ts.map +1 -1
  165. package/dist/team/tmux-session.js +15 -6
  166. package/dist/team/tmux-session.js.map +1 -1
  167. package/dist/ultragoal/__tests__/artifacts.test.js +50 -0
  168. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  169. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  170. package/dist/ultragoal/artifacts.js +28 -2
  171. package/dist/ultragoal/artifacts.js.map +1 -1
  172. package/package.json +1 -1
  173. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  174. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +16 -4
  175. package/plugins/oh-my-codex/skills/autoresearch/SKILL.md +4 -0
  176. package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +1 -1
  177. package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +1 -1
  178. package/plugins/oh-my-codex/skills/pipeline/SKILL.md +1 -1
  179. package/plugins/oh-my-codex/skills/plan/SKILL.md +1 -1
  180. package/plugins/oh-my-codex/skills/prometheus-strict/README.md +35 -0
  181. package/plugins/oh-my-codex/skills/prometheus-strict/SKILL.md +219 -0
  182. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +18 -3
  183. package/prompts/prometheus-strict-metis.md +274 -0
  184. package/prompts/prometheus-strict-momus.md +82 -0
  185. package/prompts/prometheus-strict-oracle.md +107 -0
  186. package/prompts/researcher.md +22 -3
  187. package/skills/autopilot/SKILL.md +16 -4
  188. package/skills/autoresearch/SKILL.md +4 -0
  189. package/skills/autoresearch-goal/SKILL.md +1 -1
  190. package/skills/best-practice-research/SKILL.md +1 -1
  191. package/skills/pipeline/SKILL.md +1 -1
  192. package/skills/plan/SKILL.md +1 -1
  193. package/skills/prometheus-strict/README.md +35 -0
  194. package/skills/prometheus-strict/SKILL.md +219 -0
  195. package/skills/ralplan/SKILL.md +18 -3
  196. package/src/scripts/__tests__/codex-native-hook.test.ts +769 -8
  197. package/src/scripts/__tests__/docs-site-contract.test.ts +47 -0
  198. package/src/scripts/__tests__/notify-dispatcher.test.ts +132 -3
  199. package/src/scripts/__tests__/run-test-files.test.ts +67 -0
  200. package/src/scripts/__tests__/verify-native-agents.test.ts +2 -2
  201. package/src/scripts/codex-native-hook.ts +237 -30
  202. package/src/scripts/notify-dispatcher.ts +202 -4
  203. package/src/scripts/run-test-files.ts +13 -0
  204. package/templates/catalog-manifest.json +22 -0
@@ -133,19 +133,18 @@ describe('HUD resize hook command builders', () => {
133
133
  assert.equal(buildHudPaneTarget('%41'), '%41');
134
134
  assert.equal(buildHudPaneTarget('41'), '%41');
135
135
  });
136
- it('buildRegisterResizeHookArgs uses window target and numeric window-resized hook slot', () => {
136
+ it('buildRegisterResizeHookArgs uses target and numeric client-resized hook slot', () => {
137
137
  const args = buildRegisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1', '%1');
138
138
  assert.equal(args[0], 'set-hook');
139
- assert.equal(args[1], '-w');
140
- assert.equal(args[2], '-t');
141
- assert.equal(args[3], 'my-session:0');
142
- assert.match(args[4] ?? '', /^window-resized\[\d+\]$/);
143
- assert.equal(args[5], `run-shell -b 'tmux resize-pane -t %1 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true; sleep ${HUD_RESIZE_RECONCILE_DELAY_SECONDS}; tmux resize-pane -t %1 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true'`);
139
+ assert.equal(args[1], '-t');
140
+ assert.equal(args[2], 'my-session:0');
141
+ assert.match(args[3] ?? '', /^client-resized\[\d+\]$/);
142
+ assert.equal(args[4], `run-shell -b 'tmux resize-pane -t %1 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true; sleep ${HUD_RESIZE_RECONCILE_DELAY_SECONDS}; tmux resize-pane -t %1 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true'`);
144
143
  });
145
144
  it('buildUnregisterResizeHookArgs removes the exact numeric hook slot', () => {
146
145
  const registered = buildRegisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1', '%1');
147
146
  const unregistered = buildUnregisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1');
148
- assert.deepEqual(unregistered, ['set-hook', '-u', '-w', '-t', 'my-session:0', registered[4]]);
147
+ assert.deepEqual(unregistered, ['set-hook', '-u', '-t', 'my-session:0', registered[3]]);
149
148
  });
150
149
  it('buildClientAttachedReconcileHookName normalizes all segments into collision-safe tokens', () => {
151
150
  const name = buildClientAttachedReconcileHookName('Team A', 'Session:Main', '0', '%12');
@@ -170,7 +169,7 @@ describe('HUD resize hook command builders', () => {
170
169
  const longName = 'omx_resize_' + 'a'.repeat(200);
171
170
  const resizeArgs = buildRegisterResizeHookArgs('sess:0', longName, '%1');
172
171
  const attachedArgs = buildRegisterClientAttachedReconcileArgs('sess:0', longName, '%1');
173
- const resizeSlot = resizeArgs[4] ?? '';
172
+ const resizeSlot = resizeArgs[3] ?? '';
174
173
  const attachedSlot = attachedArgs[3] ?? '';
175
174
  const resizeIndex = Number((resizeSlot.match(/\[(\d+)\]/) ?? [])[1]);
176
175
  const attachedIndex = Number((attachedSlot.match(/\[(\d+)\]/) ?? [])[1]);
@@ -183,7 +182,7 @@ describe('HUD resize hook command builders', () => {
183
182
  const name = 'omx_resize_team_session_0_1';
184
183
  const a = buildRegisterResizeHookArgs('s:0', name, '%1');
185
184
  const b = buildRegisterResizeHookArgs('s:0', name, '%1');
186
- assert.equal(a[4], b[4]);
185
+ assert.equal(a[3], b[3]);
187
186
  const c = buildRegisterClientAttachedReconcileArgs('s:0', name, '%1');
188
187
  const d = buildRegisterClientAttachedReconcileArgs('s:0', name, '%1');
189
188
  assert.equal(c[3], d[3]);
@@ -210,8 +209,8 @@ describe('HUD resize hook command builders', () => {
210
209
  const resizeArgs = buildRegisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1', '%1');
211
210
  const delayedArgs = buildScheduleDelayedHudResizeArgs('%1');
212
211
  const reconcileArgs = buildReconcileHudResizeArgs('%1');
213
- assert.match(resizeArgs[5] ?? '', new RegExp(escapeRegExp(tmuxPath)));
214
- assert.doesNotMatch(resizeArgs[5] ?? '', /^run-shell -b 'tmux resize-pane/);
212
+ assert.match(resizeArgs[4] ?? '', new RegExp(escapeRegExp(tmuxPath)));
213
+ assert.doesNotMatch(resizeArgs[4] ?? '', /^run-shell -b 'tmux resize-pane/);
215
214
  assert.match(delayedArgs[2] ?? '', new RegExp(escapeRegExp(tmuxPath)));
216
215
  assert.doesNotMatch(delayedArgs[2] ?? '', /sleep \d+; tmux resize-pane/);
217
216
  assert.match(reconcileArgs[1] ?? '', new RegExp(escapeRegExp(tmuxPath)));
@@ -2967,7 +2966,7 @@ esac
2967
2966
  await rm(cwd, { recursive: true, force: true });
2968
2967
  }
2969
2968
  });
2970
- it('continues startup with best-effort resize fallback when indexed window-resized hook registration fails', async () => {
2969
+ it('uses tmux 3.2a-compatible client-resized hook registration for team HUD resize', async () => {
2971
2970
  const cwd = await mkdtemp(join(tmpdir(), 'omx-team-resize-hook-fallback-'));
2972
2971
  const prevTmux = process.env.TMUX;
2973
2972
  const prevTmuxPane = process.env.TMUX_PANE;
@@ -3022,6 +3021,10 @@ case "\${1:-}" in
3022
3021
  echo "invalid option: window-resized[]" >&2
3023
3022
  exit 1
3024
3023
  ;;
3024
+ *" -w "*)
3025
+ echo "invalid option: -w" >&2
3026
+ exit 1
3027
+ ;;
3025
3028
  *)
3026
3029
  exit 0
3027
3030
  ;;
@@ -3045,12 +3048,13 @@ esac
3045
3048
  console.warn = (...args) => { warnings.push(args.map(String).join(' ')); };
3046
3049
  const session = createTeamSession('Resize Hook Fallback', 1, cwd);
3047
3050
  assert.equal(session.hudPaneId, '%3');
3048
- assert.equal(session.resizeHookName, null);
3049
- assert.equal(session.resizeHookTarget, null);
3050
- assert.match(warnings.join('\n'), /tmux resize hook unavailable/);
3051
- assert.match(warnings.join('\n'), /invalid option: window-resized\[\]/);
3051
+ assert.ok(session.resizeHookName);
3052
+ assert.equal(session.resizeHookTarget, 'leader:0');
3053
+ assert.equal(warnings.join('\n'), '');
3052
3054
  const tmuxLog = await readFile(logPath, 'utf-8');
3053
- assert.match(tmuxLog, /set-hook -w -t leader:0 window-resized\[\d+\]/);
3055
+ assert.match(tmuxLog, /set-hook -t leader:0 client-resized\[\d+\]/);
3056
+ assert.doesNotMatch(tmuxLog, /window-resized\[/);
3057
+ assert.doesNotMatch(tmuxLog, /set-hook -w /);
3054
3058
  assert.match(tmuxLog, /set-hook -t leader:0 client-attached\[\d+\]/);
3055
3059
  assert.match(tmuxLog, new RegExp(`run-shell -b sleep ${HUD_RESIZE_RECONCILE_DELAY_SECONDS}; .*resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
3056
3060
  assert.match(tmuxLog, new RegExp(`run-shell .*resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
@@ -3275,7 +3279,8 @@ esac
3275
3279
  assert.equal(session.resizeHookTarget, null);
3276
3280
  const tmuxLog = await readFile(logPath, 'utf-8');
3277
3281
  assert.match(tmuxLog, new RegExp(`resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
3278
- assert.doesNotMatch(tmuxLog, /set-hook -w -t leader:0 window-resized\[\d+\]/);
3282
+ assert.doesNotMatch(tmuxLog, /set-hook -w /);
3283
+ assert.doesNotMatch(tmuxLog, /window-resized\[/);
3279
3284
  assert.doesNotMatch(tmuxLog, /set-hook -t leader:0 client-attached\[\d+\]/);
3280
3285
  assert.doesNotMatch(tmuxLog, /run-shell -b sleep \d+; tmux resize-pane -t %3 -y \d+ >/);
3281
3286
  assert.doesNotMatch(tmuxLog, /run-shell tmux resize-pane -t %3 -y \d+ >/);
@@ -3587,6 +3592,41 @@ esac
3587
3592
  await rm(cwd, { recursive: true, force: true });
3588
3593
  }
3589
3594
  });
3595
+ it('restores standalone HUD panes with OMX_ROOT forwarded and shell-escaped', async () => {
3596
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-root-hud-'));
3597
+ const previousOmxRoot = process.env.OMX_ROOT;
3598
+ try {
3599
+ await withMockTmuxFixture('omx-tmux-root-standalone-hud-', (logPath) => `#!/bin/sh
3600
+ set -eu
3601
+ printf '%s\\n' "$*" >> "${logPath}"
3602
+ case "\${1:-}" in
3603
+ split-window)
3604
+ echo "%44"
3605
+ exit 0
3606
+ ;;
3607
+ run-shell|select-pane|resize-pane|set-hook)
3608
+ exit 0
3609
+ ;;
3610
+ *)
3611
+ exit 0
3612
+ ;;
3613
+ esac
3614
+ `, async ({ logPath }) => {
3615
+ process.env.OMX_ROOT = "/tmp/boxed root/it's/$(literal)";
3616
+ const paneId = restoreStandaloneHudPane('%11', cwd);
3617
+ assert.equal(paneId, '%44');
3618
+ const tmuxLog = await readFile(logPath, 'utf-8');
3619
+ assert.match(tmuxLog, /exec env OMX_TMUX_HUD_OWNER=1 OMX_ROOT='\/tmp\/boxed root\/it'\\''s\/\$\(literal\)' .*hud --watch/);
3620
+ });
3621
+ }
3622
+ finally {
3623
+ if (typeof previousOmxRoot === 'string')
3624
+ process.env.OMX_ROOT = previousOmxRoot;
3625
+ else
3626
+ delete process.env.OMX_ROOT;
3627
+ await rm(cwd, { recursive: true, force: true });
3628
+ }
3629
+ });
3590
3630
  });
3591
3631
  describe('dismissTrustPromptIfPresent capture shape', () => {
3592
3632
  it('uses visible capture-pane argv without tail flags', async () => {