oh-my-codex 0.18.1 → 0.18.3

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 (310) 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 +23 -0
  5. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  6. package/dist/agents/__tests__/native-config.test.js +20 -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 +40 -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/auth/__tests__/config-sessions.test.d.ts +2 -0
  16. package/dist/auth/__tests__/config-sessions.test.d.ts.map +1 -0
  17. package/dist/auth/__tests__/config-sessions.test.js +48 -0
  18. package/dist/auth/__tests__/config-sessions.test.js.map +1 -0
  19. package/dist/auth/__tests__/quota-rotation.test.d.ts +2 -0
  20. package/dist/auth/__tests__/quota-rotation.test.d.ts.map +1 -0
  21. package/dist/auth/__tests__/quota-rotation.test.js +33 -0
  22. package/dist/auth/__tests__/quota-rotation.test.js.map +1 -0
  23. package/dist/auth/__tests__/redact.test.d.ts +2 -0
  24. package/dist/auth/__tests__/redact.test.d.ts.map +1 -0
  25. package/dist/auth/__tests__/redact.test.js +20 -0
  26. package/dist/auth/__tests__/redact.test.js.map +1 -0
  27. package/dist/auth/__tests__/storage.test.d.ts +2 -0
  28. package/dist/auth/__tests__/storage.test.d.ts.map +1 -0
  29. package/dist/auth/__tests__/storage.test.js +108 -0
  30. package/dist/auth/__tests__/storage.test.js.map +1 -0
  31. package/dist/auth/config.d.ts +9 -0
  32. package/dist/auth/config.d.ts.map +1 -0
  33. package/dist/auth/config.js +77 -0
  34. package/dist/auth/config.js.map +1 -0
  35. package/dist/auth/hotswap.d.ts +36 -0
  36. package/dist/auth/hotswap.d.ts.map +1 -0
  37. package/dist/auth/hotswap.js +159 -0
  38. package/dist/auth/hotswap.js.map +1 -0
  39. package/dist/auth/index.d.ts +8 -0
  40. package/dist/auth/index.d.ts.map +1 -0
  41. package/dist/auth/index.js +8 -0
  42. package/dist/auth/index.js.map +1 -0
  43. package/dist/auth/paths.d.ts +12 -0
  44. package/dist/auth/paths.d.ts.map +1 -0
  45. package/dist/auth/paths.js +78 -0
  46. package/dist/auth/paths.js.map +1 -0
  47. package/dist/auth/quota-detector.d.ts +10 -0
  48. package/dist/auth/quota-detector.d.ts.map +1 -0
  49. package/dist/auth/quota-detector.js +40 -0
  50. package/dist/auth/quota-detector.js.map +1 -0
  51. package/dist/auth/redact.d.ts +2 -0
  52. package/dist/auth/redact.d.ts.map +1 -0
  53. package/dist/auth/redact.js +26 -0
  54. package/dist/auth/redact.js.map +1 -0
  55. package/dist/auth/rotation.d.ts +9 -0
  56. package/dist/auth/rotation.d.ts.map +1 -0
  57. package/dist/auth/rotation.js +26 -0
  58. package/dist/auth/rotation.js.map +1 -0
  59. package/dist/auth/sessions.d.ts +15 -0
  60. package/dist/auth/sessions.d.ts.map +1 -0
  61. package/dist/auth/sessions.js +62 -0
  62. package/dist/auth/sessions.js.map +1 -0
  63. package/dist/auth/storage.d.ts +27 -0
  64. package/dist/auth/storage.d.ts.map +1 -0
  65. package/dist/auth/storage.js +111 -0
  66. package/dist/auth/storage.js.map +1 -0
  67. package/dist/catalog/__tests__/generator.test.js +4 -0
  68. package/dist/catalog/__tests__/generator.test.js.map +1 -1
  69. package/dist/cli/__tests__/auth.test.d.ts +2 -0
  70. package/dist/cli/__tests__/auth.test.d.ts.map +1 -0
  71. package/dist/cli/__tests__/auth.test.js +168 -0
  72. package/dist/cli/__tests__/auth.test.js.map +1 -0
  73. package/dist/cli/__tests__/doctor-warning-copy.test.js +112 -5
  74. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  75. package/dist/cli/__tests__/explore.test.js +20 -0
  76. package/dist/cli/__tests__/explore.test.js.map +1 -1
  77. package/dist/cli/__tests__/index.test.js +171 -21
  78. package/dist/cli/__tests__/index.test.js.map +1 -1
  79. package/dist/cli/__tests__/launch-fallback.test.js +51 -3
  80. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  81. package/dist/cli/__tests__/nested-help-routing.test.js +1 -0
  82. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
  83. package/dist/cli/__tests__/question.test.js +2 -2
  84. package/dist/cli/__tests__/question.test.js.map +1 -1
  85. package/dist/cli/__tests__/setup-agents-overwrite.test.js +30 -1
  86. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  87. package/dist/cli/__tests__/setup-install-mode.test.js +47 -0
  88. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  89. package/dist/cli/auth.d.ts +4 -0
  90. package/dist/cli/auth.d.ts.map +1 -0
  91. package/dist/cli/auth.js +89 -0
  92. package/dist/cli/auth.js.map +1 -0
  93. package/dist/cli/doctor.d.ts.map +1 -1
  94. package/dist/cli/doctor.js +190 -7
  95. package/dist/cli/doctor.js.map +1 -1
  96. package/dist/cli/explore.d.ts.map +1 -1
  97. package/dist/cli/explore.js +12 -0
  98. package/dist/cli/explore.js.map +1 -1
  99. package/dist/cli/index.d.ts +27 -3
  100. package/dist/cli/index.d.ts.map +1 -1
  101. package/dist/cli/index.js +245 -47
  102. package/dist/cli/index.js.map +1 -1
  103. package/dist/cli/setup.d.ts.map +1 -1
  104. package/dist/cli/setup.js +11 -3
  105. package/dist/cli/setup.js.map +1 -1
  106. package/dist/config/__tests__/codex-hooks.test.js +3 -3
  107. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  108. package/dist/config/__tests__/deep-interview.test.d.ts +2 -0
  109. package/dist/config/__tests__/deep-interview.test.d.ts.map +1 -0
  110. package/dist/config/__tests__/deep-interview.test.js +239 -0
  111. package/dist/config/__tests__/deep-interview.test.js.map +1 -0
  112. package/dist/config/__tests__/generator-idempotent.test.js +123 -0
  113. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  114. package/dist/config/codex-hooks.d.ts +1 -0
  115. package/dist/config/codex-hooks.d.ts.map +1 -1
  116. package/dist/config/codex-hooks.js +2 -4
  117. package/dist/config/codex-hooks.js.map +1 -1
  118. package/dist/config/deep-interview.d.ts +22 -0
  119. package/dist/config/deep-interview.d.ts.map +1 -0
  120. package/dist/config/deep-interview.js +151 -0
  121. package/dist/config/deep-interview.js.map +1 -0
  122. package/dist/config/generator.d.ts +19 -2
  123. package/dist/config/generator.d.ts.map +1 -1
  124. package/dist/config/generator.js +198 -29
  125. package/dist/config/generator.js.map +1 -1
  126. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +21 -0
  127. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
  128. package/dist/goal-workflows/codex-goal-snapshot.d.ts +3 -0
  129. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  130. package/dist/goal-workflows/codex-goal-snapshot.js +45 -2
  131. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  132. package/dist/hooks/__tests__/agents-overlay.test.js +2 -0
  133. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  134. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +17 -0
  135. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  136. package/dist/hooks/__tests__/explore-routing.test.js +1 -0
  137. package/dist/hooks/__tests__/explore-routing.test.js.map +1 -1
  138. package/dist/hooks/__tests__/keyword-detector.test.js +471 -15
  139. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  140. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts +2 -0
  141. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts.map +1 -0
  142. package/dist/hooks/__tests__/prometheus-strict-contract.test.js +320 -0
  143. package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -0
  144. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +12 -0
  145. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
  146. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts +2 -0
  147. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts.map +1 -0
  148. package/dist/hooks/__tests__/research-workflow-boundaries.test.js +35 -0
  149. package/dist/hooks/__tests__/research-workflow-boundaries.test.js.map +1 -0
  150. package/dist/hooks/deep-interview-config-instruction.d.ts +3 -0
  151. package/dist/hooks/deep-interview-config-instruction.d.ts.map +1 -0
  152. package/dist/hooks/deep-interview-config-instruction.js +47 -0
  153. package/dist/hooks/deep-interview-config-instruction.js.map +1 -0
  154. package/dist/hooks/explore-routing.d.ts.map +1 -1
  155. package/dist/hooks/explore-routing.js +1 -0
  156. package/dist/hooks/explore-routing.js.map +1 -1
  157. package/dist/hooks/keyword-detector.d.ts +6 -1
  158. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  159. package/dist/hooks/keyword-detector.js +80 -14
  160. package/dist/hooks/keyword-detector.js.map +1 -1
  161. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  162. package/dist/hooks/keyword-registry.js +1 -0
  163. package/dist/hooks/keyword-registry.js.map +1 -1
  164. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  165. package/dist/hooks/prompt-guidance-contract.js +11 -0
  166. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  167. package/dist/hud/__tests__/hud-tmux-injection.test.js +22 -0
  168. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  169. package/dist/hud/__tests__/reconcile.test.js +213 -17
  170. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  171. package/dist/hud/__tests__/render.test.js +84 -0
  172. package/dist/hud/__tests__/render.test.js.map +1 -1
  173. package/dist/hud/__tests__/state.test.js +51 -1
  174. package/dist/hud/__tests__/state.test.js.map +1 -1
  175. package/dist/hud/__tests__/tmux.test.js +171 -23
  176. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  177. package/dist/hud/index.d.ts +1 -1
  178. package/dist/hud/index.d.ts.map +1 -1
  179. package/dist/hud/index.js +8 -3
  180. package/dist/hud/index.js.map +1 -1
  181. package/dist/hud/reconcile.d.ts +1 -1
  182. package/dist/hud/reconcile.d.ts.map +1 -1
  183. package/dist/hud/reconcile.js +14 -3
  184. package/dist/hud/reconcile.js.map +1 -1
  185. package/dist/hud/render.d.ts.map +1 -1
  186. package/dist/hud/render.js +26 -0
  187. package/dist/hud/render.js.map +1 -1
  188. package/dist/hud/state.d.ts +2 -1
  189. package/dist/hud/state.d.ts.map +1 -1
  190. package/dist/hud/state.js +62 -1
  191. package/dist/hud/state.js.map +1 -1
  192. package/dist/hud/tmux.d.ts +17 -3
  193. package/dist/hud/tmux.d.ts.map +1 -1
  194. package/dist/hud/tmux.js +96 -10
  195. package/dist/hud/tmux.js.map +1 -1
  196. package/dist/hud/types.d.ts +22 -0
  197. package/dist/hud/types.d.ts.map +1 -1
  198. package/dist/hud/types.js.map +1 -1
  199. package/dist/pipeline/__tests__/orchestrator.test.js +63 -1
  200. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  201. package/dist/pipeline/__tests__/stages.test.js +410 -4
  202. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  203. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  204. package/dist/pipeline/orchestrator.js +29 -2
  205. package/dist/pipeline/orchestrator.js.map +1 -1
  206. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  207. package/dist/pipeline/stages/ralplan.js +41 -6
  208. package/dist/pipeline/stages/ralplan.js.map +1 -1
  209. package/dist/question/__tests__/ui.test.js +43 -10
  210. package/dist/question/__tests__/ui.test.js.map +1 -1
  211. package/dist/question/deep-interview.d.ts +2 -0
  212. package/dist/question/deep-interview.d.ts.map +1 -1
  213. package/dist/question/deep-interview.js.map +1 -1
  214. package/dist/question/ui.d.ts +12 -0
  215. package/dist/question/ui.d.ts.map +1 -1
  216. package/dist/question/ui.js +83 -46
  217. package/dist/question/ui.js.map +1 -1
  218. package/dist/ralplan/__tests__/runtime.test.js +200 -10
  219. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  220. package/dist/ralplan/consensus-gate.d.ts +23 -0
  221. package/dist/ralplan/consensus-gate.d.ts.map +1 -0
  222. package/dist/ralplan/consensus-gate.js +212 -0
  223. package/dist/ralplan/consensus-gate.js.map +1 -0
  224. package/dist/ralplan/runtime.d.ts +25 -0
  225. package/dist/ralplan/runtime.d.ts.map +1 -1
  226. package/dist/ralplan/runtime.js +144 -8
  227. package/dist/ralplan/runtime.js.map +1 -1
  228. package/dist/scripts/__tests__/codex-native-hook.test.js +1034 -28
  229. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  230. package/dist/scripts/__tests__/docs-site-contract.test.d.ts +2 -0
  231. package/dist/scripts/__tests__/docs-site-contract.test.d.ts.map +1 -0
  232. package/dist/scripts/__tests__/docs-site-contract.test.js +42 -0
  233. package/dist/scripts/__tests__/docs-site-contract.test.js.map +1 -0
  234. package/dist/scripts/__tests__/notify-dispatcher.test.js +115 -2
  235. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
  236. package/dist/scripts/__tests__/run-test-files.test.js +57 -0
  237. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  238. package/dist/scripts/__tests__/verify-native-agents.test.js +2 -2
  239. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
  240. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  241. package/dist/scripts/codex-native-hook.js +238 -36
  242. package/dist/scripts/codex-native-hook.js.map +1 -1
  243. package/dist/scripts/notify-dispatcher.js +188 -4
  244. package/dist/scripts/notify-dispatcher.js.map +1 -1
  245. package/dist/scripts/run-test-files.js +13 -0
  246. package/dist/scripts/run-test-files.js.map +1 -1
  247. package/dist/state/__tests__/planning-gate.test.d.ts +2 -0
  248. package/dist/state/__tests__/planning-gate.test.d.ts.map +1 -0
  249. package/dist/state/__tests__/planning-gate.test.js +219 -0
  250. package/dist/state/__tests__/planning-gate.test.js.map +1 -0
  251. package/dist/state/__tests__/workflow-transition.test.js +6 -0
  252. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  253. package/dist/state/workflow-transition.d.ts +24 -1
  254. package/dist/state/workflow-transition.d.ts.map +1 -1
  255. package/dist/state/workflow-transition.js +70 -0
  256. package/dist/state/workflow-transition.js.map +1 -1
  257. package/dist/subagents/tracker.d.ts.map +1 -1
  258. package/dist/subagents/tracker.js +4 -3
  259. package/dist/subagents/tracker.js.map +1 -1
  260. package/dist/team/__tests__/runtime.test.js +36 -44
  261. package/dist/team/__tests__/runtime.test.js.map +1 -1
  262. package/dist/team/__tests__/tmux-session.test.js +144 -18
  263. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  264. package/dist/team/runtime.d.ts.map +1 -1
  265. package/dist/team/runtime.js +10 -20
  266. package/dist/team/runtime.js.map +1 -1
  267. package/dist/team/tmux-session.d.ts.map +1 -1
  268. package/dist/team/tmux-session.js +22 -6
  269. package/dist/team/tmux-session.js.map +1 -1
  270. package/dist/ultragoal/__tests__/artifacts.test.js +50 -0
  271. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  272. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  273. package/dist/ultragoal/artifacts.js +28 -2
  274. package/dist/ultragoal/artifacts.js.map +1 -1
  275. package/package.json +1 -1
  276. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  277. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +16 -4
  278. package/plugins/oh-my-codex/skills/autoresearch/SKILL.md +4 -0
  279. package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +1 -1
  280. package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +1 -1
  281. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +10 -0
  282. package/plugins/oh-my-codex/skills/pipeline/SKILL.md +1 -1
  283. package/plugins/oh-my-codex/skills/plan/SKILL.md +1 -1
  284. package/plugins/oh-my-codex/skills/prometheus-strict/README.md +35 -0
  285. package/plugins/oh-my-codex/skills/prometheus-strict/SKILL.md +219 -0
  286. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +24 -5
  287. package/prompts/prometheus-strict-metis.md +274 -0
  288. package/prompts/prometheus-strict-momus.md +82 -0
  289. package/prompts/prometheus-strict-oracle.md +107 -0
  290. package/prompts/researcher.md +22 -3
  291. package/prompts/scholastic.md +11 -0
  292. package/skills/autopilot/SKILL.md +16 -4
  293. package/skills/autoresearch/SKILL.md +4 -0
  294. package/skills/autoresearch-goal/SKILL.md +1 -1
  295. package/skills/best-practice-research/SKILL.md +1 -1
  296. package/skills/deep-interview/SKILL.md +10 -0
  297. package/skills/pipeline/SKILL.md +1 -1
  298. package/skills/plan/SKILL.md +1 -1
  299. package/skills/prometheus-strict/README.md +35 -0
  300. package/skills/prometheus-strict/SKILL.md +219 -0
  301. package/skills/ralplan/SKILL.md +24 -5
  302. package/src/scripts/__tests__/codex-native-hook.test.ts +1307 -61
  303. package/src/scripts/__tests__/docs-site-contract.test.ts +47 -0
  304. package/src/scripts/__tests__/notify-dispatcher.test.ts +132 -3
  305. package/src/scripts/__tests__/run-test-files.test.ts +67 -0
  306. package/src/scripts/__tests__/verify-native-agents.test.ts +2 -2
  307. package/src/scripts/codex-native-hook.ts +260 -31
  308. package/src/scripts/notify-dispatcher.ts +202 -4
  309. package/src/scripts/run-test-files.ts +13 -0
  310. package/templates/catalog-manifest.json +27 -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)));
@@ -2870,6 +2869,92 @@ esac
2870
2869
  });
2871
2870
  });
2872
2871
  describe('createTeamSession tmux instance tagging', () => {
2872
+ it('redraws the leader pane after team layout changes so wrapped diff hunks repaint with gutters', async () => {
2873
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-redraw-leader-'));
2874
+ const prevTmux = process.env.TMUX;
2875
+ const prevTmuxPane = process.env.TMUX_PANE;
2876
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
2877
+ try {
2878
+ await withMockTmuxFixture('omx-tmux-redraw-leader-', (logPath) => `#!/bin/sh
2879
+ set -eu
2880
+ printf '%s\n' "$*" >> "${logPath}"
2881
+ case "\${1:-}" in
2882
+ -V)
2883
+ echo "tmux 3.4"
2884
+ exit 0
2885
+ ;;
2886
+ display-message)
2887
+ case "$*" in
2888
+ *"#{window_width}"*)
2889
+ echo "120"
2890
+ ;;
2891
+ *)
2892
+ echo "leader:0 %1"
2893
+ ;;
2894
+ esac
2895
+ exit 0
2896
+ ;;
2897
+ list-panes)
2898
+ case "$*" in
2899
+ *"pane_current_command"*)
2900
+ printf "%%1\\tnode\\t'codex'\\n"
2901
+ ;;
2902
+ *)
2903
+ printf "%%1\\n"
2904
+ ;;
2905
+ esac
2906
+ exit 0
2907
+ ;;
2908
+ split-window)
2909
+ case "$*" in
2910
+ *" -h "*)
2911
+ echo "%2"
2912
+ ;;
2913
+ *)
2914
+ echo "%3"
2915
+ ;;
2916
+ esac
2917
+ exit 0
2918
+ ;;
2919
+ set-option|resize-pane|select-layout|set-window-option|select-pane|set-hook|run-shell|send-keys)
2920
+ exit 0
2921
+ ;;
2922
+ *)
2923
+ exit 0
2924
+ ;;
2925
+ esac
2926
+ `, async ({ logPath }) => {
2927
+ const fakeBinDir = join(logPath, '..');
2928
+ const geminiPath = join(fakeBinDir, 'gemini');
2929
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
2930
+ await chmod(geminiPath, 0o755);
2931
+ process.env.TMUX = 'leader-session,stub,0';
2932
+ process.env.TMUX_PANE = '%1';
2933
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
2934
+ createTeamSession('Diff Gutter Redraw', 1, cwd);
2935
+ const tmuxLog = await readFile(logPath, 'utf-8');
2936
+ assert.match(tmuxLog, /select-layout -t leader:0 main-vertical/);
2937
+ assert.match(tmuxLog, /set-window-option -t leader:0 main-pane-width 60/);
2938
+ assert.match(tmuxLog, /split-window -v -f -l 3 -t leader:0 -d -P -F #\{pane_id\}/);
2939
+ assert.match(tmuxLog, /send-keys -t %1 C-l/, 'leader Codex pane must repaint after team splits/resizes so tmux does not auto-wrap diff continuation rows without the line-number gutter');
2940
+ });
2941
+ }
2942
+ finally {
2943
+ if (typeof prevTmux === 'string')
2944
+ process.env.TMUX = prevTmux;
2945
+ else
2946
+ delete process.env.TMUX;
2947
+ if (typeof prevTmuxPane === 'string')
2948
+ process.env.TMUX_PANE = prevTmuxPane;
2949
+ else
2950
+ delete process.env.TMUX_PANE;
2951
+ if (typeof prevWorkerCli === 'string')
2952
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
2953
+ else
2954
+ delete process.env.OMX_TEAM_WORKER_CLI;
2955
+ await rm(cwd, { recursive: true, force: true });
2956
+ }
2957
+ });
2873
2958
  it('tags leader, worker, and HUD panes with pane-scoped instance ownership', async () => {
2874
2959
  const cwd = await mkdtemp(join(tmpdir(), 'omx-team-pane-tags-'));
2875
2960
  const prevTmux = process.env.TMUX;
@@ -2967,7 +3052,7 @@ esac
2967
3052
  await rm(cwd, { recursive: true, force: true });
2968
3053
  }
2969
3054
  });
2970
- it('continues startup with best-effort resize fallback when indexed window-resized hook registration fails', async () => {
3055
+ it('uses tmux 3.2a-compatible client-resized hook registration for team HUD resize', async () => {
2971
3056
  const cwd = await mkdtemp(join(tmpdir(), 'omx-team-resize-hook-fallback-'));
2972
3057
  const prevTmux = process.env.TMUX;
2973
3058
  const prevTmuxPane = process.env.TMUX_PANE;
@@ -3022,6 +3107,10 @@ case "\${1:-}" in
3022
3107
  echo "invalid option: window-resized[]" >&2
3023
3108
  exit 1
3024
3109
  ;;
3110
+ *" -w "*)
3111
+ echo "invalid option: -w" >&2
3112
+ exit 1
3113
+ ;;
3025
3114
  *)
3026
3115
  exit 0
3027
3116
  ;;
@@ -3045,12 +3134,13 @@ esac
3045
3134
  console.warn = (...args) => { warnings.push(args.map(String).join(' ')); };
3046
3135
  const session = createTeamSession('Resize Hook Fallback', 1, cwd);
3047
3136
  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\[\]/);
3137
+ assert.ok(session.resizeHookName);
3138
+ assert.equal(session.resizeHookTarget, 'leader:0');
3139
+ assert.equal(warnings.join('\n'), '');
3052
3140
  const tmuxLog = await readFile(logPath, 'utf-8');
3053
- assert.match(tmuxLog, /set-hook -w -t leader:0 window-resized\[\d+\]/);
3141
+ assert.match(tmuxLog, /set-hook -t leader:0 client-resized\[\d+\]/);
3142
+ assert.doesNotMatch(tmuxLog, /window-resized\[/);
3143
+ assert.doesNotMatch(tmuxLog, /set-hook -w /);
3054
3144
  assert.match(tmuxLog, /set-hook -t leader:0 client-attached\[\d+\]/);
3055
3145
  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
3146
  assert.match(tmuxLog, new RegExp(`run-shell .*resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
@@ -3275,7 +3365,8 @@ esac
3275
3365
  assert.equal(session.resizeHookTarget, null);
3276
3366
  const tmuxLog = await readFile(logPath, 'utf-8');
3277
3367
  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+\]/);
3368
+ assert.doesNotMatch(tmuxLog, /set-hook -w /);
3369
+ assert.doesNotMatch(tmuxLog, /window-resized\[/);
3279
3370
  assert.doesNotMatch(tmuxLog, /set-hook -t leader:0 client-attached\[\d+\]/);
3280
3371
  assert.doesNotMatch(tmuxLog, /run-shell -b sleep \d+; tmux resize-pane -t %3 -y \d+ >/);
3281
3372
  assert.doesNotMatch(tmuxLog, /run-shell tmux resize-pane -t %3 -y \d+ >/);
@@ -3587,6 +3678,41 @@ esac
3587
3678
  await rm(cwd, { recursive: true, force: true });
3588
3679
  }
3589
3680
  });
3681
+ it('restores standalone HUD panes with OMX_ROOT forwarded and shell-escaped', async () => {
3682
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-root-hud-'));
3683
+ const previousOmxRoot = process.env.OMX_ROOT;
3684
+ try {
3685
+ await withMockTmuxFixture('omx-tmux-root-standalone-hud-', (logPath) => `#!/bin/sh
3686
+ set -eu
3687
+ printf '%s\\n' "$*" >> "${logPath}"
3688
+ case "\${1:-}" in
3689
+ split-window)
3690
+ echo "%44"
3691
+ exit 0
3692
+ ;;
3693
+ run-shell|select-pane|resize-pane|set-hook)
3694
+ exit 0
3695
+ ;;
3696
+ *)
3697
+ exit 0
3698
+ ;;
3699
+ esac
3700
+ `, async ({ logPath }) => {
3701
+ process.env.OMX_ROOT = "/tmp/boxed root/it's/$(literal)";
3702
+ const paneId = restoreStandaloneHudPane('%11', cwd);
3703
+ assert.equal(paneId, '%44');
3704
+ const tmuxLog = await readFile(logPath, 'utf-8');
3705
+ assert.match(tmuxLog, /exec env OMX_TMUX_HUD_OWNER=1 OMX_ROOT='\/tmp\/boxed root\/it'\\''s\/\$\(literal\)' .*hud --watch/);
3706
+ });
3707
+ }
3708
+ finally {
3709
+ if (typeof previousOmxRoot === 'string')
3710
+ process.env.OMX_ROOT = previousOmxRoot;
3711
+ else
3712
+ delete process.env.OMX_ROOT;
3713
+ await rm(cwd, { recursive: true, force: true });
3714
+ }
3715
+ });
3590
3716
  });
3591
3717
  describe('dismissTrustPromptIfPresent capture shape', () => {
3592
3718
  it('uses visible capture-pane argv without tail flags', async () => {