oh-my-codex 0.15.0 → 0.15.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 (533) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +36 -5
  4. package/crates/omx-explore/src/main.rs +222 -12
  5. package/dist/agents/__tests__/native-config.test.js +40 -0
  6. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  7. package/dist/agents/native-config.d.ts +1 -0
  8. package/dist/agents/native-config.d.ts.map +1 -1
  9. package/dist/agents/native-config.js +6 -1
  10. package/dist/agents/native-config.js.map +1 -1
  11. package/dist/agents/policy.d.ts +1 -0
  12. package/dist/agents/policy.d.ts.map +1 -1
  13. package/dist/agents/policy.js +4 -0
  14. package/dist/agents/policy.js.map +1 -1
  15. package/dist/cli/__tests__/autoresearch-guided.test.js +37 -13
  16. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
  17. package/dist/cli/__tests__/codex-plugin-layout.test.js +1 -1
  18. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  19. package/dist/cli/__tests__/doctor-team.test.js +46 -1
  20. package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
  21. package/dist/cli/__tests__/doctor-warning-copy.test.js +225 -111
  22. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  23. package/dist/cli/__tests__/exec.test.js +96 -1
  24. package/dist/cli/__tests__/exec.test.js.map +1 -1
  25. package/dist/cli/__tests__/explore.test.js +15 -2
  26. package/dist/cli/__tests__/explore.test.js.map +1 -1
  27. package/dist/cli/__tests__/index.test.js +292 -3
  28. package/dist/cli/__tests__/index.test.js.map +1 -1
  29. package/dist/cli/__tests__/launch-fallback.test.js +223 -0
  30. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  31. package/dist/cli/__tests__/mcp-parity.test.js +86 -0
  32. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  33. package/dist/cli/__tests__/package-bin-contract.test.js +23 -0
  34. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  35. package/dist/cli/__tests__/question.test.js +76 -11
  36. package/dist/cli/__tests__/question.test.js.map +1 -1
  37. package/dist/cli/__tests__/setup-agents-overwrite.test.js +140 -1
  38. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  39. package/dist/cli/__tests__/setup-install-mode.test.js +310 -4
  40. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  41. package/dist/cli/__tests__/setup-prompts-overwrite.test.js +78 -19
  42. package/dist/cli/__tests__/setup-prompts-overwrite.test.js.map +1 -1
  43. package/dist/cli/__tests__/setup-refresh.test.js +79 -2
  44. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  45. package/dist/cli/__tests__/sidecar.test.d.ts +2 -0
  46. package/dist/cli/__tests__/sidecar.test.d.ts.map +1 -0
  47. package/dist/cli/__tests__/sidecar.test.js +24 -0
  48. package/dist/cli/__tests__/sidecar.test.js.map +1 -0
  49. package/dist/cli/__tests__/team.test.js +54 -7
  50. package/dist/cli/__tests__/team.test.js.map +1 -1
  51. package/dist/cli/autoresearch-guided.d.ts.map +1 -1
  52. package/dist/cli/autoresearch-guided.js +12 -4
  53. package/dist/cli/autoresearch-guided.js.map +1 -1
  54. package/dist/cli/codex-home.d.ts +4 -6
  55. package/dist/cli/codex-home.d.ts.map +1 -1
  56. package/dist/cli/codex-home.js +9 -41
  57. package/dist/cli/codex-home.js.map +1 -1
  58. package/dist/cli/doctor.d.ts +1 -1
  59. package/dist/cli/doctor.d.ts.map +1 -1
  60. package/dist/cli/doctor.js +509 -279
  61. package/dist/cli/doctor.js.map +1 -1
  62. package/dist/cli/index.d.ts +6 -4
  63. package/dist/cli/index.d.ts.map +1 -1
  64. package/dist/cli/index.js +284 -25
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/cli/omx.js +3 -1
  67. package/dist/cli/omx.js.map +1 -1
  68. package/dist/cli/plugin-marketplace.d.ts +13 -0
  69. package/dist/cli/plugin-marketplace.d.ts.map +1 -0
  70. package/dist/cli/plugin-marketplace.js +77 -0
  71. package/dist/cli/plugin-marketplace.js.map +1 -0
  72. package/dist/cli/question.d.ts +1 -1
  73. package/dist/cli/question.d.ts.map +1 -1
  74. package/dist/cli/question.js +26 -12
  75. package/dist/cli/question.js.map +1 -1
  76. package/dist/cli/setup-preferences.d.ts +20 -0
  77. package/dist/cli/setup-preferences.d.ts.map +1 -0
  78. package/dist/cli/setup-preferences.js +71 -0
  79. package/dist/cli/setup-preferences.js.map +1 -0
  80. package/dist/cli/setup.d.ts +7 -5
  81. package/dist/cli/setup.d.ts.map +1 -1
  82. package/dist/cli/setup.js +271 -152
  83. package/dist/cli/setup.js.map +1 -1
  84. package/dist/cli/team.d.ts +1 -0
  85. package/dist/cli/team.d.ts.map +1 -1
  86. package/dist/cli/team.js +70 -15
  87. package/dist/cli/team.js.map +1 -1
  88. package/dist/config/__tests__/generator-idempotent.test.js +100 -3
  89. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  90. package/dist/config/__tests__/generator-notify.test.js +6 -5
  91. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  92. package/dist/config/__tests__/generator-status-line-presets.test.d.ts +2 -0
  93. package/dist/config/__tests__/generator-status-line-presets.test.d.ts.map +1 -0
  94. package/dist/config/__tests__/generator-status-line-presets.test.js +203 -0
  95. package/dist/config/__tests__/generator-status-line-presets.test.js.map +1 -0
  96. package/dist/config/__tests__/models.test.js +23 -1
  97. package/dist/config/__tests__/models.test.js.map +1 -1
  98. package/dist/config/generator.d.ts +9 -1
  99. package/dist/config/generator.d.ts.map +1 -1
  100. package/dist/config/generator.js +184 -16
  101. package/dist/config/generator.js.map +1 -1
  102. package/dist/config/models.d.ts +5 -1
  103. package/dist/config/models.d.ts.map +1 -1
  104. package/dist/config/models.js +12 -2
  105. package/dist/config/models.js.map +1 -1
  106. package/dist/exec/followup.d.ts +44 -0
  107. package/dist/exec/followup.d.ts.map +1 -0
  108. package/dist/exec/followup.js +349 -0
  109. package/dist/exec/followup.js.map +1 -0
  110. package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts +2 -0
  111. package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts.map +1 -0
  112. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +37 -0
  113. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -0
  114. package/dist/hooks/__tests__/codebase-map.test.js +63 -1
  115. package/dist/hooks/__tests__/codebase-map.test.js.map +1 -1
  116. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +1 -1
  117. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +5 -5
  118. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  119. package/dist/hooks/__tests__/deep-interview-contract.test.js +12 -9
  120. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  121. package/dist/hooks/__tests__/keyword-detector.test.js +25 -18
  122. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  123. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +23 -2
  124. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  125. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +45 -2
  126. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  127. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +17 -0
  128. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
  129. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +121 -0
  130. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
  131. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +4 -4
  132. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  133. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +103 -0
  134. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  135. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +2 -2
  136. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  137. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +27 -13
  138. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  139. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts +2 -0
  140. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts.map +1 -0
  141. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +35 -0
  142. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -0
  143. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +215 -0
  144. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  145. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +70 -3
  146. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  147. package/dist/hooks/__tests__/pre-context-gate-skills.test.js +5 -0
  148. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -1
  149. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js +3 -2
  150. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -1
  151. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +9 -0
  152. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
  153. package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts +2 -0
  154. package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts.map +1 -0
  155. package/dist/hooks/__tests__/prompt-refactor-contract.test.js +22 -0
  156. package/dist/hooks/__tests__/prompt-refactor-contract.test.js.map +1 -0
  157. package/dist/hooks/codebase-map.d.ts.map +1 -1
  158. package/dist/hooks/codebase-map.js +83 -6
  159. package/dist/hooks/codebase-map.js.map +1 -1
  160. package/dist/hooks/keyword-detector.d.ts +1 -1
  161. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  162. package/dist/hooks/keyword-detector.js +35 -4
  163. package/dist/hooks/keyword-detector.js.map +1 -1
  164. package/dist/hooks/prompt-guidance-contract.d.ts +6 -0
  165. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  166. package/dist/hooks/prompt-guidance-contract.js +117 -13
  167. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  168. package/dist/hooks/session.d.ts +2 -0
  169. package/dist/hooks/session.d.ts.map +1 -1
  170. package/dist/hooks/session.js +6 -0
  171. package/dist/hooks/session.js.map +1 -1
  172. package/dist/hud/__tests__/index.test.js +4 -4
  173. package/dist/hud/__tests__/index.test.js.map +1 -1
  174. package/dist/hud/__tests__/state.test.js +4 -0
  175. package/dist/hud/__tests__/state.test.js.map +1 -1
  176. package/dist/hud/__tests__/types.test.js +27 -0
  177. package/dist/hud/__tests__/types.test.js.map +1 -1
  178. package/dist/hud/state.d.ts.map +1 -1
  179. package/dist/hud/state.js +8 -0
  180. package/dist/hud/state.js.map +1 -1
  181. package/dist/hud/types.d.ts +9 -0
  182. package/dist/hud/types.d.ts.map +1 -1
  183. package/dist/hud/types.js +3 -0
  184. package/dist/hud/types.js.map +1 -1
  185. package/dist/mcp/__tests__/bootstrap.test.js +23 -5
  186. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  187. package/dist/mcp/__tests__/server-lifecycle.test.js +50 -7
  188. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  189. package/dist/mcp/__tests__/state-server.test.js +70 -12
  190. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  191. package/dist/mcp/bootstrap.d.ts +10 -1
  192. package/dist/mcp/bootstrap.d.ts.map +1 -1
  193. package/dist/mcp/bootstrap.js +71 -26
  194. package/dist/mcp/bootstrap.js.map +1 -1
  195. package/dist/mcp/state-server.d.ts +5 -11
  196. package/dist/mcp/state-server.d.ts.map +1 -1
  197. package/dist/mcp/state-server.js +16 -432
  198. package/dist/mcp/state-server.js.map +1 -1
  199. package/dist/modes/__tests__/base-autoresearch-contract.test.js +1 -1
  200. package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
  201. package/dist/pipeline/__tests__/orchestrator.test.js +89 -5
  202. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  203. package/dist/pipeline/__tests__/stages.test.js +98 -1
  204. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  205. package/dist/pipeline/index.d.ts +5 -3
  206. package/dist/pipeline/index.d.ts.map +1 -1
  207. package/dist/pipeline/index.js +4 -3
  208. package/dist/pipeline/index.js.map +1 -1
  209. package/dist/pipeline/orchestrator.d.ts +7 -6
  210. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  211. package/dist/pipeline/orchestrator.js +90 -11
  212. package/dist/pipeline/orchestrator.js.map +1 -1
  213. package/dist/pipeline/review-verdict.d.ts +3 -0
  214. package/dist/pipeline/review-verdict.d.ts.map +1 -0
  215. package/dist/pipeline/review-verdict.js +14 -0
  216. package/dist/pipeline/review-verdict.js.map +1 -0
  217. package/dist/pipeline/stages/code-review.d.ts +33 -0
  218. package/dist/pipeline/stages/code-review.d.ts.map +1 -0
  219. package/dist/pipeline/stages/code-review.js +51 -0
  220. package/dist/pipeline/stages/code-review.js.map +1 -0
  221. package/dist/pipeline/stages/ralph-verify.d.ts +12 -2
  222. package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -1
  223. package/dist/pipeline/stages/ralph-verify.js +24 -6
  224. package/dist/pipeline/stages/ralph-verify.js.map +1 -1
  225. package/dist/pipeline/stages/ralplan.d.ts +1 -1
  226. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  227. package/dist/pipeline/stages/ralplan.js +21 -1
  228. package/dist/pipeline/stages/ralplan.js.map +1 -1
  229. package/dist/pipeline/types.d.ts +14 -7
  230. package/dist/pipeline/types.d.ts.map +1 -1
  231. package/dist/pipeline/types.js +2 -2
  232. package/dist/planning/__tests__/artifacts.test.js +152 -1
  233. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  234. package/dist/planning/artifacts.d.ts +9 -0
  235. package/dist/planning/artifacts.d.ts.map +1 -1
  236. package/dist/planning/artifacts.js +60 -1
  237. package/dist/planning/artifacts.js.map +1 -1
  238. package/dist/question/__tests__/client.test.js +23 -3
  239. package/dist/question/__tests__/client.test.js.map +1 -1
  240. package/dist/question/__tests__/renderer.test.js +148 -37
  241. package/dist/question/__tests__/renderer.test.js.map +1 -1
  242. package/dist/question/__tests__/types.test.js +21 -0
  243. package/dist/question/__tests__/types.test.js.map +1 -1
  244. package/dist/question/__tests__/ui.test.js +155 -7
  245. package/dist/question/__tests__/ui.test.js.map +1 -1
  246. package/dist/question/client.d.ts +14 -4
  247. package/dist/question/client.d.ts.map +1 -1
  248. package/dist/question/client.js.map +1 -1
  249. package/dist/question/renderer.d.ts +11 -1
  250. package/dist/question/renderer.d.ts.map +1 -1
  251. package/dist/question/renderer.js +102 -7
  252. package/dist/question/renderer.js.map +1 -1
  253. package/dist/question/state.d.ts +2 -2
  254. package/dist/question/state.d.ts.map +1 -1
  255. package/dist/question/state.js +26 -17
  256. package/dist/question/state.js.map +1 -1
  257. package/dist/question/types.d.ts +25 -1
  258. package/dist/question/types.d.ts.map +1 -1
  259. package/dist/question/types.js +48 -13
  260. package/dist/question/types.js.map +1 -1
  261. package/dist/question/ui.d.ts +15 -2
  262. package/dist/question/ui.d.ts.map +1 -1
  263. package/dist/question/ui.js +268 -162
  264. package/dist/question/ui.js.map +1 -1
  265. package/dist/scripts/__tests__/codex-native-hook.test.js +415 -94
  266. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  267. package/dist/scripts/__tests__/generate-release-body.test.js +36 -0
  268. package/dist/scripts/__tests__/generate-release-body.test.js.map +1 -1
  269. package/dist/scripts/__tests__/prompt-inventory.test.d.ts +2 -0
  270. package/dist/scripts/__tests__/prompt-inventory.test.d.ts.map +1 -0
  271. package/dist/scripts/__tests__/prompt-inventory.test.js +56 -0
  272. package/dist/scripts/__tests__/prompt-inventory.test.js.map +1 -0
  273. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  274. package/dist/scripts/codex-native-hook.js +232 -54
  275. package/dist/scripts/codex-native-hook.js.map +1 -1
  276. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  277. package/dist/scripts/codex-native-pre-post.js +12 -9
  278. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  279. package/dist/scripts/generate-release-body.d.ts.map +1 -1
  280. package/dist/scripts/generate-release-body.js +12 -3
  281. package/dist/scripts/generate-release-body.js.map +1 -1
  282. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts +2 -0
  283. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts.map +1 -0
  284. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js +153 -0
  285. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js.map +1 -0
  286. package/dist/scripts/notify-hook/managed-tmux.d.ts +4 -2
  287. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  288. package/dist/scripts/notify-hook/managed-tmux.js +188 -6
  289. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  290. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
  291. package/dist/scripts/notify-hook/process-runner.js +7 -3
  292. package/dist/scripts/notify-hook/process-runner.js.map +1 -1
  293. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  294. package/dist/scripts/notify-hook/team-dispatch.js +96 -11
  295. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  296. package/dist/scripts/notify-hook/team-tmux-guard.js +3 -3
  297. package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts +34 -0
  298. package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts.map +1 -0
  299. package/dist/scripts/notify-hook/team-worker-posttooluse.js +434 -0
  300. package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -0
  301. package/dist/scripts/notify-hook/team-worker.d.ts +1 -1
  302. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
  303. package/dist/scripts/notify-hook/team-worker.js +3 -43
  304. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  305. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  306. package/dist/scripts/notify-hook/tmux-injection.js +25 -4
  307. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  308. package/dist/scripts/notify-hook.js +36 -5
  309. package/dist/scripts/notify-hook.js.map +1 -1
  310. package/dist/scripts/prompt-inventory.d.ts +29 -0
  311. package/dist/scripts/prompt-inventory.d.ts.map +1 -0
  312. package/dist/scripts/prompt-inventory.js +178 -0
  313. package/dist/scripts/prompt-inventory.js.map +1 -0
  314. package/dist/scripts/run-test-files.js +1 -0
  315. package/dist/scripts/run-test-files.js.map +1 -1
  316. package/dist/sidecar/__tests__/boundary.test.d.ts +2 -0
  317. package/dist/sidecar/__tests__/boundary.test.d.ts.map +1 -0
  318. package/dist/sidecar/__tests__/boundary.test.js +48 -0
  319. package/dist/sidecar/__tests__/boundary.test.js.map +1 -0
  320. package/dist/sidecar/__tests__/collector.test.d.ts +2 -0
  321. package/dist/sidecar/__tests__/collector.test.d.ts.map +1 -0
  322. package/dist/sidecar/__tests__/collector.test.js +162 -0
  323. package/dist/sidecar/__tests__/collector.test.js.map +1 -0
  324. package/dist/sidecar/__tests__/render.test.d.ts +2 -0
  325. package/dist/sidecar/__tests__/render.test.d.ts.map +1 -0
  326. package/dist/sidecar/__tests__/render.test.js +67 -0
  327. package/dist/sidecar/__tests__/render.test.js.map +1 -0
  328. package/dist/sidecar/__tests__/tmux.test.d.ts +2 -0
  329. package/dist/sidecar/__tests__/tmux.test.d.ts.map +1 -0
  330. package/dist/sidecar/__tests__/tmux.test.js +30 -0
  331. package/dist/sidecar/__tests__/tmux.test.js.map +1 -0
  332. package/dist/sidecar/__tests__/watch.test.d.ts +2 -0
  333. package/dist/sidecar/__tests__/watch.test.d.ts.map +1 -0
  334. package/dist/sidecar/__tests__/watch.test.js +42 -0
  335. package/dist/sidecar/__tests__/watch.test.js.map +1 -0
  336. package/dist/sidecar/collector.d.ts +4 -0
  337. package/dist/sidecar/collector.d.ts.map +1 -0
  338. package/dist/sidecar/collector.js +377 -0
  339. package/dist/sidecar/collector.js.map +1 -0
  340. package/dist/sidecar/index.d.ts +25 -0
  341. package/dist/sidecar/index.d.ts.map +1 -0
  342. package/dist/sidecar/index.js +165 -0
  343. package/dist/sidecar/index.js.map +1 -0
  344. package/dist/sidecar/render.d.ts +3 -0
  345. package/dist/sidecar/render.d.ts.map +1 -0
  346. package/dist/sidecar/render.js +72 -0
  347. package/dist/sidecar/render.js.map +1 -0
  348. package/dist/sidecar/tmux.d.ts +13 -0
  349. package/dist/sidecar/tmux.d.ts.map +1 -0
  350. package/dist/sidecar/tmux.js +44 -0
  351. package/dist/sidecar/tmux.js.map +1 -0
  352. package/dist/sidecar/types.d.ts +125 -0
  353. package/dist/sidecar/types.d.ts.map +1 -0
  354. package/dist/sidecar/types.js +2 -0
  355. package/dist/sidecar/types.js.map +1 -0
  356. package/dist/state/__tests__/operations.test.js +50 -22
  357. package/dist/state/__tests__/operations.test.js.map +1 -1
  358. package/dist/state/__tests__/workflow-transition.test.js +9 -1
  359. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  360. package/dist/state/operations.d.ts +1 -1
  361. package/dist/state/operations.d.ts.map +1 -1
  362. package/dist/state/operations.js +19 -7
  363. package/dist/state/operations.js.map +1 -1
  364. package/dist/state/workflow-transition.d.ts.map +1 -1
  365. package/dist/state/workflow-transition.js +1 -0
  366. package/dist/state/workflow-transition.js.map +1 -1
  367. package/dist/team/__tests__/commit-hygiene.test.d.ts +2 -0
  368. package/dist/team/__tests__/commit-hygiene.test.d.ts.map +1 -0
  369. package/dist/team/__tests__/commit-hygiene.test.js +93 -0
  370. package/dist/team/__tests__/commit-hygiene.test.js.map +1 -0
  371. package/dist/team/__tests__/delegation-policy.test.d.ts +2 -0
  372. package/dist/team/__tests__/delegation-policy.test.d.ts.map +1 -0
  373. package/dist/team/__tests__/delegation-policy.test.js +69 -0
  374. package/dist/team/__tests__/delegation-policy.test.js.map +1 -0
  375. package/dist/team/__tests__/events.test.js +54 -4
  376. package/dist/team/__tests__/events.test.js.map +1 -1
  377. package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts +2 -0
  378. package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts.map +1 -0
  379. package/dist/team/__tests__/hook-primary-e2e-contract.test.js +78 -0
  380. package/dist/team/__tests__/hook-primary-e2e-contract.test.js.map +1 -0
  381. package/dist/team/__tests__/model-contract.test.js +16 -0
  382. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  383. package/dist/team/__tests__/repo-aware-decomposition.test.d.ts +2 -0
  384. package/dist/team/__tests__/repo-aware-decomposition.test.d.ts.map +1 -0
  385. package/dist/team/__tests__/repo-aware-decomposition.test.js +95 -0
  386. package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -0
  387. package/dist/team/__tests__/runtime.test.js +623 -14
  388. package/dist/team/__tests__/runtime.test.js.map +1 -1
  389. package/dist/team/__tests__/state-root.test.js +177 -1
  390. package/dist/team/__tests__/state-root.test.js.map +1 -1
  391. package/dist/team/__tests__/state.test.js +110 -0
  392. package/dist/team/__tests__/state.test.js.map +1 -1
  393. package/dist/team/__tests__/tmux-session.test.js +399 -2
  394. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  395. package/dist/team/__tests__/worker-bootstrap.test.js +94 -0
  396. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  397. package/dist/team/commit-hygiene.d.ts +22 -3
  398. package/dist/team/commit-hygiene.d.ts.map +1 -1
  399. package/dist/team/commit-hygiene.js +134 -2
  400. package/dist/team/commit-hygiene.js.map +1 -1
  401. package/dist/team/contracts.d.ts +1 -1
  402. package/dist/team/contracts.d.ts.map +1 -1
  403. package/dist/team/contracts.js +2 -0
  404. package/dist/team/contracts.js.map +1 -1
  405. package/dist/team/dag-schema.d.ts +38 -0
  406. package/dist/team/dag-schema.d.ts.map +1 -0
  407. package/dist/team/dag-schema.js +221 -0
  408. package/dist/team/dag-schema.js.map +1 -0
  409. package/dist/team/delegation-policy.d.ts +3 -0
  410. package/dist/team/delegation-policy.d.ts.map +1 -0
  411. package/dist/team/delegation-policy.js +82 -0
  412. package/dist/team/delegation-policy.js.map +1 -0
  413. package/dist/team/model-contract.d.ts +3 -1
  414. package/dist/team/model-contract.d.ts.map +1 -1
  415. package/dist/team/model-contract.js +44 -5
  416. package/dist/team/model-contract.js.map +1 -1
  417. package/dist/team/repo-aware-decomposition.d.ts +60 -0
  418. package/dist/team/repo-aware-decomposition.d.ts.map +1 -0
  419. package/dist/team/repo-aware-decomposition.js +229 -0
  420. package/dist/team/repo-aware-decomposition.js.map +1 -0
  421. package/dist/team/runtime.d.ts +27 -0
  422. package/dist/team/runtime.d.ts.map +1 -1
  423. package/dist/team/runtime.js +172 -52
  424. package/dist/team/runtime.js.map +1 -1
  425. package/dist/team/state/tasks.d.ts.map +1 -1
  426. package/dist/team/state/tasks.js +33 -0
  427. package/dist/team/state/tasks.js.map +1 -1
  428. package/dist/team/state/types.d.ts +23 -1
  429. package/dist/team/state/types.d.ts.map +1 -1
  430. package/dist/team/state/types.js.map +1 -1
  431. package/dist/team/state-root.d.ts +35 -0
  432. package/dist/team/state-root.d.ts.map +1 -1
  433. package/dist/team/state-root.js +281 -1
  434. package/dist/team/state-root.js.map +1 -1
  435. package/dist/team/state.d.ts +27 -1
  436. package/dist/team/state.d.ts.map +1 -1
  437. package/dist/team/state.js +6 -0
  438. package/dist/team/state.js.map +1 -1
  439. package/dist/team/tmux-session.d.ts +1 -0
  440. package/dist/team/tmux-session.d.ts.map +1 -1
  441. package/dist/team/tmux-session.js +105 -6
  442. package/dist/team/tmux-session.js.map +1 -1
  443. package/dist/team/worker-bootstrap.d.ts +3 -0
  444. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  445. package/dist/team/worker-bootstrap.js +77 -4
  446. package/dist/team/worker-bootstrap.js.map +1 -1
  447. package/dist/utils/agents-md.d.ts +3 -0
  448. package/dist/utils/agents-md.d.ts.map +1 -1
  449. package/dist/utils/agents-md.js +25 -0
  450. package/dist/utils/agents-md.js.map +1 -1
  451. package/package.json +3 -2
  452. package/plugins/oh-my-codex/.codex-plugin/plugin.json +2 -2
  453. package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +1 -1
  454. package/plugins/oh-my-codex/skills/analyze/SKILL.md +1 -1
  455. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +134 -205
  456. package/plugins/oh-my-codex/skills/code-review/SKILL.md +4 -4
  457. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +14 -7
  458. package/plugins/oh-my-codex/skills/doctor/SKILL.md +1 -1
  459. package/plugins/oh-my-codex/skills/help/SKILL.md +1 -1
  460. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +41 -10
  461. package/plugins/oh-my-codex/skills/plan/SKILL.md +12 -14
  462. package/plugins/oh-my-codex/skills/ralph/SKILL.md +2 -4
  463. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +5 -9
  464. package/plugins/oh-my-codex/skills/security-review/SKILL.md +4 -4
  465. package/plugins/oh-my-codex/skills/team/SKILL.md +2 -5
  466. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +2 -5
  467. package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +2 -3
  468. package/prompts/analyst.md +2 -2
  469. package/prompts/api-reviewer.md +2 -2
  470. package/prompts/architect.md +2 -2
  471. package/prompts/build-fixer.md +2 -2
  472. package/prompts/code-reviewer.md +15 -5
  473. package/prompts/code-simplifier.md +1 -1
  474. package/prompts/critic.md +35 -83
  475. package/prompts/debugger.md +2 -2
  476. package/prompts/dependency-expert.md +2 -2
  477. package/prompts/designer.md +2 -2
  478. package/prompts/executor.md +40 -114
  479. package/prompts/explore-harness.md +1 -1
  480. package/prompts/explore.md +37 -90
  481. package/prompts/git-master.md +2 -2
  482. package/prompts/information-architect.md +1 -1
  483. package/prompts/performance-reviewer.md +2 -2
  484. package/prompts/planner.md +35 -62
  485. package/prompts/product-analyst.md +2 -2
  486. package/prompts/product-manager.md +2 -2
  487. package/prompts/qa-tester.md +2 -2
  488. package/prompts/quality-reviewer.md +2 -2
  489. package/prompts/quality-strategist.md +2 -2
  490. package/prompts/researcher.md +46 -78
  491. package/prompts/security-reviewer.md +2 -2
  492. package/prompts/sisyphus-lite.md +2 -2
  493. package/prompts/style-reviewer.md +2 -2
  494. package/prompts/team-executor.md +1 -1
  495. package/prompts/test-engineer.md +2 -2
  496. package/prompts/ux-researcher.md +2 -2
  497. package/prompts/verifier.md +29 -34
  498. package/prompts/vision.md +2 -2
  499. package/prompts/writer.md +2 -2
  500. package/skills/ai-slop-cleaner/SKILL.md +1 -1
  501. package/skills/analyze/SKILL.md +1 -1
  502. package/skills/autopilot/SKILL.md +134 -205
  503. package/skills/build-fix/SKILL.md +4 -4
  504. package/skills/code-review/SKILL.md +4 -4
  505. package/skills/deep-interview/SKILL.md +14 -7
  506. package/skills/doctor/SKILL.md +1 -1
  507. package/skills/help/SKILL.md +1 -1
  508. package/skills/omx-setup/SKILL.md +41 -10
  509. package/skills/plan/SKILL.md +12 -14
  510. package/skills/ralph/SKILL.md +2 -4
  511. package/skills/ralplan/SKILL.md +5 -9
  512. package/skills/security-review/SKILL.md +4 -4
  513. package/skills/team/SKILL.md +2 -5
  514. package/skills/ultraqa/SKILL.md +2 -5
  515. package/skills/ultrawork/SKILL.md +2 -3
  516. package/src/scripts/__tests__/codex-native-hook.test.ts +502 -94
  517. package/src/scripts/__tests__/generate-release-body.test.ts +41 -0
  518. package/src/scripts/__tests__/prompt-inventory.test.ts +64 -0
  519. package/src/scripts/codex-native-hook.ts +293 -61
  520. package/src/scripts/codex-native-pre-post.ts +10 -8
  521. package/src/scripts/generate-release-body.ts +13 -2
  522. package/src/scripts/notify-hook/__tests__/team-worker-posttooluse.test.ts +180 -0
  523. package/src/scripts/notify-hook/managed-tmux.ts +196 -9
  524. package/src/scripts/notify-hook/process-runner.ts +7 -3
  525. package/src/scripts/notify-hook/team-dispatch.ts +103 -11
  526. package/src/scripts/notify-hook/team-tmux-guard.ts +3 -3
  527. package/src/scripts/notify-hook/team-worker-posttooluse.ts +536 -0
  528. package/src/scripts/notify-hook/team-worker.ts +4 -48
  529. package/src/scripts/notify-hook/tmux-injection.ts +24 -6
  530. package/src/scripts/notify-hook.ts +36 -5
  531. package/src/scripts/prompt-inventory.ts +218 -0
  532. package/src/scripts/run-test-files.ts +1 -0
  533. package/templates/AGENTS.md +34 -95
package/dist/cli/setup.js CHANGED
@@ -14,25 +14,37 @@ import { mergeManagedCodexHooksConfig } from "../config/codex-hooks.js";
14
14
  import { getLegacyUnifiedMcpRegistryCandidate, getUnifiedMcpRegistryCandidates, loadUnifiedMcpRegistry, planClaudeCodeMcpSettingsSync, } from "../config/mcp-registry.js";
15
15
  import { generateAgentToml } from "../agents/native-config.js";
16
16
  import { AGENT_DEFINITIONS } from "../agents/definitions.js";
17
- import { getCatalogAgentStatusByName, getInstallableNativeAgentNames, isNativeAgentInstallableStatus, } from "../agents/policy.js";
17
+ import { getCatalogAgentStatusByName, getInstallableNativeAgentNames, isNativeAgentInstallableStatus, isSetupPromptAssetName, } from "../agents/policy.js";
18
18
  import { getPackageRoot } from "../utils/package.js";
19
19
  import { readSessionState, isSessionStale } from "../hooks/session.js";
20
20
  import { getCatalogHeadlineCounts } from "./catalog-contract.js";
21
21
  import { tryReadCatalogManifest } from "../catalog/reader.js";
22
22
  import { DEFAULT_FRONTIER_MODEL } from "../config/models.js";
23
- import { addGeneratedAgentsMarker, hasOmxManagedAgentsSections, isOmxGeneratedAgentsMd, } from "../utils/agents-md.js";
23
+ import { addGeneratedAgentsMarker, hasOmxManagedAgentsSections, isOmxGeneratedAgentsMd, upsertManagedAgentsBlock, } from "../utils/agents-md.js";
24
+ import { DEFAULT_HUD_CONFIG } from "../hud/types.js";
25
+ import { SETUP_INSTALL_MODES, SETUP_SCOPES, getSetupScopeFilePath, readPersistedSetupPreferences, } from "./setup-preferences.js";
26
+ import { OMX_LOCAL_MARKETPLACE_NAME, resolvePackagedOmxMarketplace, upsertLocalOmxMarketplaceRegistration, } from "./plugin-marketplace.js";
27
+ async function resolveStatusLinePresetForSetup(projectRoot, options) {
28
+ if (options.force) {
29
+ return DEFAULT_HUD_CONFIG.statusLine.preset;
30
+ }
31
+ const path = join(projectRoot, ".omx", "hud-config.json");
32
+ if (!existsSync(path))
33
+ return undefined;
34
+ try {
35
+ const raw = JSON.parse(await readFile(path, "utf-8"));
36
+ const preset = raw?.statusLine?.preset;
37
+ if (preset === "minimal" || preset === "focused" || preset === "full") {
38
+ return preset;
39
+ }
40
+ }
41
+ catch {
42
+ // Malformed hud-config.json — fall through to default.
43
+ }
44
+ return undefined;
45
+ }
24
46
  import { resolveAgentsModelTableContext, upsertAgentsModelTable, } from "../utils/agents-model-table.js";
25
- import { spawnPlatformCommandSync } from "../utils/platform-command.js";
26
- /**
27
- * Legacy scope values that may appear in persisted setup-scope.json files.
28
- * Both 'project-local' (renamed) and old 'project' (minimal, removed) are
29
- * migrated to the current 'project' scope on read.
30
- */
31
- const LEGACY_SCOPE_MIGRATION = {
32
- "project-local": "project",
33
- };
34
- export const SETUP_SCOPES = ["user", "project"];
35
- export const SETUP_INSTALL_MODES = ["legacy", "plugin"];
47
+ export { SETUP_INSTALL_MODES, SETUP_SCOPES };
36
48
  const PROJECT_GITIGNORE_ENTRIES = [
37
49
  ".omx/",
38
50
  ".codex/*",
@@ -74,7 +86,6 @@ const DEFAULT_SETUP_INSTALL_MODE = "legacy";
74
86
  const LEGACY_SETUP_MODEL = "gpt-5.3-codex";
75
87
  const DEFAULT_SETUP_MODEL = DEFAULT_FRONTIER_MODEL;
76
88
  const OBSOLETE_NATIVE_AGENT_FIELD = ["skill", "ref"].join("_");
77
- const TUI_OWNED_BY_CODEX_VERSION = [0, 107, 0];
78
89
  function createEmptyCategorySummary() {
79
90
  return {
80
91
  updated: 0,
@@ -250,19 +261,6 @@ async function buildLegacySkillOverlapNotice(scope) {
250
261
  message: `Detected ${overlap.overlappingSkillNames.length} overlapping skill names between canonical ${overlap.canonicalDir} and legacy ${overlap.legacyDir}.${mismatchSuffix} Remove or archive ~/.agents/skills after confirming ${overlap.canonicalDir} is the version you want Codex to load.`,
251
262
  };
252
263
  }
253
- function logCategorySummary(name, summary) {
254
- console.log(` ${name}: updated=${summary.updated}, unchanged=${summary.unchanged}, ` +
255
- `backed_up=${summary.backedUp}, skipped=${summary.skipped}, removed=${summary.removed}`);
256
- }
257
- function isSetupScope(value) {
258
- return SETUP_SCOPES.includes(value);
259
- }
260
- function getScopeFilePath(projectRoot) {
261
- return join(projectRoot, ".omx", "setup-scope.json");
262
- }
263
- function isSetupInstallMode(value) {
264
- return SETUP_INSTALL_MODES.includes(value);
265
- }
266
264
  export function resolveScopeDirectories(scope, projectRoot) {
267
265
  if (scope === "project") {
268
266
  const codexHomeDir = join(projectRoot, ".codex");
@@ -284,38 +282,9 @@ export function resolveScopeDirectories(scope, projectRoot) {
284
282
  skillsDir: userSkillsDir(),
285
283
  };
286
284
  }
287
- async function readPersistedSetupPreferences(projectRoot) {
288
- const scopePath = getScopeFilePath(projectRoot);
289
- if (!existsSync(scopePath))
290
- return undefined;
291
- try {
292
- const raw = await readFile(scopePath, "utf-8");
293
- const parsed = JSON.parse(raw);
294
- const persisted = {};
295
- if (parsed && typeof parsed.scope === "string") {
296
- // Direct match to current scopes
297
- if (isSetupScope(parsed.scope)) {
298
- persisted.scope = parsed.scope;
299
- }
300
- // Migrate legacy scope values (project-local → project)
301
- const migrated = LEGACY_SCOPE_MIGRATION[parsed.scope];
302
- if (migrated) {
303
- console.warn(`[omx] Migrating persisted setup scope "${parsed.scope}" → "${migrated}" ` +
304
- `(see issue #243: simplified to user/project).`);
305
- persisted.scope = migrated;
306
- }
307
- }
308
- if (parsed && typeof parsed.installMode === "string") {
309
- if (isSetupInstallMode(parsed.installMode)) {
310
- persisted.installMode = parsed.installMode;
311
- }
312
- }
313
- return Object.keys(persisted).length > 0 ? persisted : undefined;
314
- }
315
- catch {
316
- // ignore invalid persisted scope and fall back to prompt/default
317
- }
318
- return undefined;
285
+ function logCategorySummary(name, summary) {
286
+ console.log(` ${name}: updated=${summary.updated}, unchanged=${summary.unchanged}, ` +
287
+ `backed_up=${summary.backedUp}, skipped=${summary.skipped}, removed=${summary.removed}`);
319
288
  }
320
289
  async function promptForSetupScope(defaultScope) {
321
290
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
@@ -326,14 +295,19 @@ async function promptForSetupScope(defaultScope) {
326
295
  output: process.stdout,
327
296
  });
328
297
  try {
298
+ const userDefaultMarker = defaultScope === "user" ? " (default)" : "";
299
+ const projectDefaultMarker = defaultScope === "project" ? " (default)" : "";
300
+ const defaultChoice = defaultScope === "project" ? "2" : "1";
329
301
  console.log("Select setup scope:");
330
- console.log(` 1) user (default) — installs to ${codexHome()} (skills default to ${userSkillsDir()})`);
331
- console.log(" 2) project — installs to ./.codex (local to project)");
332
- const answer = (await rl.question("Scope [1-2] (default: 1): "))
302
+ console.log(` 1) user${userDefaultMarker} — installs to ${codexHome()} (skills default to ${userSkillsDir()})`);
303
+ console.log(` 2) project${projectDefaultMarker} — installs to ./.codex (local to project)`);
304
+ const answer = (await rl.question(`Scope [1-2] (default: ${defaultChoice}): `))
333
305
  .trim()
334
306
  .toLowerCase();
335
307
  if (answer === "2" || answer === "project")
336
308
  return "project";
309
+ if (answer === "1" || answer === "user")
310
+ return "user";
337
311
  return defaultScope;
338
312
  }
339
313
  finally {
@@ -366,6 +340,44 @@ async function promptForSetupInstallMode(defaultMode) {
366
340
  rl.close();
367
341
  }
368
342
  }
343
+ function hasPersistedSetupPreferences(preferences) {
344
+ return Boolean(preferences?.scope || preferences?.installMode);
345
+ }
346
+ function formatPersistedSetupPreferenceSummary(preferences) {
347
+ return [
348
+ `scope=${preferences.scope ?? "not recorded"}`,
349
+ `installMode=${preferences.installMode ?? "not recorded"}`,
350
+ ].join(", ");
351
+ }
352
+ async function promptForPersistedSetupReview(preferences) {
353
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
354
+ return "keep";
355
+ }
356
+ const rl = createInterface({
357
+ input: process.stdin,
358
+ output: process.stdout,
359
+ });
360
+ try {
361
+ console.log("Existing OMX setup preferences detected:");
362
+ console.log(` ${formatPersistedSetupPreferenceSummary(preferences)}`);
363
+ console.log(" 1) keep — reuse these choices for this setup run");
364
+ console.log(" 2) review — review/change choices, using these values as defaults");
365
+ console.log(" 3) reset — ignore saved choices and run setup as if fresh");
366
+ const answer = (await rl.question("Setup preferences [1-3] (default: 1 keep): "))
367
+ .trim()
368
+ .toLowerCase();
369
+ if (answer === "2" || answer === "review" || answer === "change") {
370
+ return "review";
371
+ }
372
+ if (answer === "3" || answer === "reset" || answer === "fresh") {
373
+ return "reset";
374
+ }
375
+ return "keep";
376
+ }
377
+ finally {
378
+ rl.close();
379
+ }
380
+ }
369
381
  async function promptForModelUpgrade(currentModel, targetModel) {
370
382
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
371
383
  return false;
@@ -384,37 +396,6 @@ async function promptForModelUpgrade(currentModel, targetModel) {
384
396
  rl.close();
385
397
  }
386
398
  }
387
- function parseSemverTriplet(version) {
388
- const match = version.match(/(\d+)\.(\d+)\.(\d+)/);
389
- if (!match)
390
- return null;
391
- return [Number(match[1]), Number(match[2]), Number(match[3])];
392
- }
393
- function semverGte(version, minimum) {
394
- if (version[0] !== minimum[0])
395
- return version[0] > minimum[0];
396
- if (version[1] !== minimum[1])
397
- return version[1] > minimum[1];
398
- return version[2] >= minimum[2];
399
- }
400
- function probeInstalledCodexVersion() {
401
- const { result } = spawnPlatformCommandSync("codex", ["--version"], {
402
- encoding: "utf-8",
403
- stdio: ["pipe", "pipe", "pipe"],
404
- });
405
- if (result.error || result.status !== 0)
406
- return null;
407
- const stdout = (result.stdout || "").trim();
408
- return stdout === "" ? null : stdout;
409
- }
410
- function shouldOmxManageTuiFromCodexVersion(versionOutput) {
411
- if (!versionOutput)
412
- return true;
413
- const parsed = parseSemverTriplet(versionOutput);
414
- if (!parsed)
415
- return true;
416
- return !semverGte(parsed, TUI_OWNED_BY_CODEX_VERSION);
417
- }
418
399
  async function promptForAgentsOverwrite(destinationPath) {
419
400
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
420
401
  return false;
@@ -487,16 +468,22 @@ async function promptForPluginDeveloperInstructionsOverwrite(configPath) {
487
468
  rl.close();
488
469
  }
489
470
  }
490
- async function resolveSetupScope(projectRoot, requestedScope) {
471
+ async function resolveSetupScope(projectRoot, requestedScope, persistedReviewDecision = "keep", persistedPreferences, setupScopePrompt) {
491
472
  if (requestedScope) {
492
473
  return { scope: requestedScope, source: "cli" };
493
474
  }
494
- const persisted = await readPersistedSetupPreferences(projectRoot);
495
- if (persisted?.scope) {
475
+ const persisted = persistedPreferences ?? (await readPersistedSetupPreferences(projectRoot));
476
+ if (persisted?.scope && persistedReviewDecision === "keep") {
496
477
  return { scope: persisted.scope, source: "persisted" };
497
478
  }
498
- if (process.stdin.isTTY && process.stdout.isTTY) {
499
- const scope = await promptForSetupScope(DEFAULT_SETUP_SCOPE);
479
+ if (typeof setupScopePrompt === "function" ||
480
+ (process.stdin.isTTY && process.stdout.isTTY)) {
481
+ const defaultScope = persistedReviewDecision === "review" && persisted?.scope
482
+ ? persisted.scope
483
+ : DEFAULT_SETUP_SCOPE;
484
+ const scope = setupScopePrompt
485
+ ? await setupScopePrompt(defaultScope)
486
+ : await promptForSetupScope(defaultScope);
500
487
  return { scope, source: "prompt" };
501
488
  }
502
489
  return { scope: DEFAULT_SETUP_SCOPE, source: "default" };
@@ -555,21 +542,26 @@ async function discoverOmxPluginCacheDir(cacheRoot = join(codexHome(), "plugins"
555
542
  }
556
543
  return null;
557
544
  }
558
- async function resolveSetupInstallMode(projectRoot, scope, requestedInstallMode, installModePrompt) {
545
+ async function resolveSetupInstallMode(projectRoot, scope, requestedInstallMode, installModePrompt, persistedReviewDecision = "keep", persistedPreferences) {
559
546
  if (requestedInstallMode) {
560
547
  return { installMode: requestedInstallMode, source: "cli" };
561
548
  }
562
- const persisted = await readPersistedSetupPreferences(projectRoot);
563
- if (persisted?.installMode && persisted.scope === scope) {
549
+ const persisted = persistedPreferences ?? (await readPersistedSetupPreferences(projectRoot));
550
+ if (persisted?.installMode &&
551
+ persistedReviewDecision === "keep" &&
552
+ persisted.scope === scope) {
564
553
  return { installMode: persisted.installMode, source: "persisted" };
565
554
  }
566
555
  if (scope !== "user")
567
556
  return null;
568
557
  const discoveredPluginCacheDir = await discoverOmxPluginCacheDir();
569
- const defaultMode = discoveredPluginCacheDir
570
- ? "plugin"
571
- : DEFAULT_SETUP_INSTALL_MODE;
572
- if (process.stdin.isTTY && process.stdout.isTTY) {
558
+ const defaultMode = persistedReviewDecision === "review" && persisted?.installMode
559
+ ? persisted.installMode
560
+ : discoveredPluginCacheDir
561
+ ? "plugin"
562
+ : DEFAULT_SETUP_INSTALL_MODE;
563
+ if (typeof installModePrompt === "function" ||
564
+ (process.stdin.isTTY && process.stdout.isTTY)) {
573
565
  if (discoveredPluginCacheDir) {
574
566
  console.log(`Detected installed oh-my-codex Codex plugin cache at ${discoveredPluginCacheDir}.`);
575
567
  }
@@ -644,7 +636,7 @@ async function ensureProjectGitignore(projectRoot, backupContext, options) {
644
636
  return destinationExists ? "updated" : "created";
645
637
  }
646
638
  async function persistSetupPreferences(projectRoot, preferences, options) {
647
- const scopePath = getScopeFilePath(projectRoot);
639
+ const scopePath = getSetupScopeFilePath(projectRoot);
648
640
  if (options.dryRun) {
649
641
  if (options.verbose)
650
642
  console.log(` dry-run: skip persisting ${scopePath}`);
@@ -675,31 +667,15 @@ async function cleanupPluginModeLegacyPrompts(srcDir, dstDir, backupContext, opt
675
667
  if (!existsSync(srcDir) || !existsSync(dstDir))
676
668
  return summary;
677
669
  const manifest = tryReadCatalogManifest();
678
- const agentStatusByName = manifest
679
- ? getCatalogAgentStatusByName(manifest)
680
- : null;
681
670
  for (const file of await readdir(srcDir)) {
682
671
  if (!file.endsWith(".md"))
683
672
  continue;
684
673
  const promptName = file.slice(0, -3);
685
- const status = agentStatusByName?.get(promptName);
686
- if (agentStatusByName && !isNativeAgentInstallableStatus(status))
674
+ if (manifest && !isSetupPromptAssetName(promptName, manifest))
687
675
  continue;
688
- const src = join(srcDir, file);
689
676
  const dst = join(dstDir, file);
690
677
  if (!existsSync(dst))
691
678
  continue;
692
- const [srcContent, dstContent] = await Promise.all([
693
- readFile(src, "utf-8"),
694
- readFile(dst, "utf-8"),
695
- ]);
696
- if (srcContent !== dstContent) {
697
- summary.skipped += 1;
698
- if (options.verbose) {
699
- console.log(` skipped legacy prompt cleanup for ${file}: installed content differs from OMX-managed content`);
700
- }
701
- continue;
702
- }
703
679
  if (await ensureBackup(dst, true, backupContext, options)) {
704
680
  summary.backedUp += 1;
705
681
  }
@@ -708,7 +684,7 @@ async function cleanupPluginModeLegacyPrompts(srcDir, dstDir, backupContext, opt
708
684
  }
709
685
  summary.removed += 1;
710
686
  if (options.verbose) {
711
- console.log(` ${options.dryRun ? "would remove" : "removed"} legacy prompt ${file}`);
687
+ console.log(` ${options.dryRun ? "would archive and remove" : "archived and removed"} legacy prompt ${file}`);
712
688
  }
713
689
  }
714
690
  await removeEmptyDirectoryIfPresent(dstDir, options);
@@ -735,10 +711,11 @@ async function cleanupPluginModeLegacyNativeAgents(pkgRoot, agentsDir, backupCon
735
711
  codexHomeOverride: join(agentsDir, ".."),
736
712
  });
737
713
  const installedToml = await readFile(dst, "utf-8");
738
- if (installedToml !== expectedToml) {
714
+ if (installedToml !== expectedToml &&
715
+ !isGeneratedOmxNativeAgentToml(installedToml, name)) {
739
716
  summary.skipped += 1;
740
717
  if (options.verbose) {
741
- console.log(` skipped legacy native agent cleanup for ${name}.toml: installed content differs from OMX-managed content`);
718
+ console.log(` skipped legacy native agent cleanup for ${name}.toml: installed content is not an OMX-generated native agent`);
742
719
  }
743
720
  continue;
744
721
  }
@@ -750,9 +727,14 @@ async function cleanupPluginModeLegacyNativeAgents(pkgRoot, agentsDir, backupCon
750
727
  }
751
728
  summary.removed += 1;
752
729
  if (options.verbose) {
753
- console.log(` ${options.dryRun ? "would remove" : "removed"} legacy native agent ${name}.toml`);
730
+ console.log(` ${options.dryRun ? "would archive and remove" : "archived and removed"} legacy native agent ${name}.toml`);
754
731
  }
755
732
  }
733
+ if (manifest) {
734
+ const generatedCleanup = await cleanupGeneratedNonInstallableNativeAgents(agentsDir, manifest, backupContext, options);
735
+ summary.backedUp += generatedCleanup.backedUp;
736
+ summary.removed += generatedCleanup.removed;
737
+ }
756
738
  await removeEmptyDirectoryIfPresent(agentsDir, options);
757
739
  return summary;
758
740
  }
@@ -820,6 +802,34 @@ function insertRootTomlKey(config, line) {
820
802
  const after = lines.slice(firstTableIndex);
821
803
  return [...before, line, "", ...after].join("\n") + "\n";
822
804
  }
805
+ async function ensurePluginMarketplaceRegistration(configPath, pkgRoot, backupContext, summary, options) {
806
+ const packagedMarketplace = await resolvePackagedOmxMarketplace(pkgRoot);
807
+ if (!packagedMarketplace) {
808
+ summary.skipped += 1;
809
+ return "unavailable";
810
+ }
811
+ const existingConfig = existsSync(configPath)
812
+ ? await readFile(configPath, "utf-8")
813
+ : "";
814
+ const nextConfig = upsertLocalOmxMarketplaceRegistration(existingConfig, pkgRoot);
815
+ const destinationExists = existsSync(configPath);
816
+ if (nextConfig === existingConfig) {
817
+ summary.unchanged += 1;
818
+ return "unchanged";
819
+ }
820
+ if (await ensureBackup(configPath, destinationExists, backupContext, options)) {
821
+ summary.backedUp += 1;
822
+ }
823
+ if (!options.dryRun) {
824
+ await mkdir(dirname(configPath), { recursive: true });
825
+ await writeFile(configPath, nextConfig);
826
+ }
827
+ summary.updated += 1;
828
+ if (options.verbose) {
829
+ console.log(` ${options.dryRun ? "would register" : "registered"} local Codex plugin marketplace ${OMX_LOCAL_MARKETPLACE_NAME} from ${pkgRoot}`);
830
+ }
831
+ return "updated";
832
+ }
823
833
  async function applyPluginModeHooksConfig(configPath, hooksPath, pkgRoot, backupContext, summary, options) {
824
834
  const existingConfig = existsSync(configPath)
825
835
  ? await readFile(configPath, "utf-8")
@@ -931,11 +941,29 @@ async function cleanupPluginModeLegacyAgentsMd(agentsMdPath, backupContext, opti
931
941
  return true;
932
942
  }
933
943
  export async function setup(options = {}) {
934
- const { force = false, dryRun = false, installMode: requestedInstallMode, scope: requestedScope, verbose = false, installModePrompt, modelUpgradePrompt, pluginAgentsMdPrompt, pluginDeveloperInstructionsPrompt, pluginDeveloperInstructionsOverwritePrompt, } = options;
944
+ const { force = false, dryRun = false, installMode: requestedInstallMode, scope: requestedScope, verbose = false, setupScopePrompt, persistedSetupReviewPrompt, installModePrompt, modelUpgradePrompt, pluginAgentsMdPrompt, pluginDeveloperInstructionsPrompt, pluginDeveloperInstructionsOverwritePrompt, } = options;
935
945
  const pkgRoot = getPackageRoot();
936
946
  const projectRoot = process.cwd();
937
- const resolvedScope = await resolveSetupScope(projectRoot, requestedScope);
938
- const resolvedInstallMode = await resolveSetupInstallMode(projectRoot, resolvedScope.scope, requestedInstallMode, installModePrompt);
947
+ const persistedPreferences = await readPersistedSetupPreferences(projectRoot, { warnOnLegacyScope: true });
948
+ let persistedReviewDecision = "keep";
949
+ const effectiveScopeForInstallMode = requestedScope ?? persistedPreferences?.scope ?? DEFAULT_SETUP_SCOPE;
950
+ const wouldUsePersistedScope = !requestedScope && Boolean(persistedPreferences?.scope);
951
+ const wouldUsePersistedInstallMode = !requestedInstallMode &&
952
+ Boolean(persistedPreferences?.installMode) &&
953
+ (!persistedPreferences?.scope ||
954
+ persistedPreferences.scope === effectiveScopeForInstallMode);
955
+ const shouldReviewPersistedSetup = hasPersistedSetupPreferences(persistedPreferences) &&
956
+ (wouldUsePersistedScope || wouldUsePersistedInstallMode) &&
957
+ (typeof persistedSetupReviewPrompt === "function" ||
958
+ (process.stdin.isTTY && process.stdout.isTTY));
959
+ if (shouldReviewPersistedSetup) {
960
+ persistedReviewDecision = persistedSetupReviewPrompt
961
+ ? await persistedSetupReviewPrompt(persistedPreferences)
962
+ : await promptForPersistedSetupReview(persistedPreferences);
963
+ console.log(`Setup preference review: ${persistedReviewDecision} (${formatPersistedSetupPreferenceSummary(persistedPreferences)})\n`);
964
+ }
965
+ const resolvedScope = await resolveSetupScope(projectRoot, requestedScope, persistedReviewDecision, persistedPreferences, setupScopePrompt);
966
+ const resolvedInstallMode = await resolveSetupInstallMode(projectRoot, resolvedScope.scope, requestedInstallMode, installModePrompt, persistedReviewDecision, persistedPreferences);
939
967
  const scopeDirs = resolveScopeDirectories(resolvedScope.scope, projectRoot);
940
968
  const scopeSourceMessage = resolvedScope.source === "persisted" ? " (from .omx/setup-scope.json)" : "";
941
969
  const backupContext = getBackupContext(resolvedScope.scope, projectRoot);
@@ -987,14 +1015,17 @@ export async function setup(options = {}) {
987
1015
  if (verbose)
988
1016
  console.log(` mkdir ${dir}`);
989
1017
  }
990
- await persistSetupPreferences(projectRoot, resolvedInstallMode
1018
+ const setupPreferencesToPersist = resolvedInstallMode &&
1019
+ (resolvedScope.scope === "user" ||
1020
+ resolvedInstallMode.installMode === "plugin")
991
1021
  ? {
992
1022
  scope: resolvedScope.scope,
993
1023
  installMode: resolvedInstallMode.installMode,
994
1024
  }
995
1025
  : {
996
1026
  scope: resolvedScope.scope,
997
- }, {
1027
+ };
1028
+ await persistSetupPreferences(projectRoot, setupPreferencesToPersist, {
998
1029
  dryRun,
999
1030
  verbose,
1000
1031
  });
@@ -1018,7 +1049,7 @@ export async function setup(options = {}) {
1018
1049
  if (isPluginInstallMode) {
1019
1050
  summary.prompts = await cleanupPluginModeLegacyPrompts(promptsSrc, promptsDst, backupContext, { dryRun, verbose });
1020
1051
  console.log(summary.prompts.removed > 0
1021
- ? ` ${dryRun ? "Would remove" : "Removed"} ${summary.prompts.removed} legacy OMX-managed prompt file(s).\n`
1052
+ ? ` ${dryRun ? "Would archive and remove" : "Archived and removed"} ${summary.prompts.removed} legacy OMX-managed prompt file(s).\n`
1022
1053
  : " Prompt refresh skipped; no legacy OMX-managed prompt files found.\n");
1023
1054
  }
1024
1055
  else {
@@ -1084,7 +1115,7 @@ export async function setup(options = {}) {
1084
1115
  if (isPluginInstallMode) {
1085
1116
  summary.nativeAgents = await cleanupPluginModeLegacyNativeAgents(pkgRoot, scopeDirs.nativeAgentsDir, backupContext, { dryRun, verbose });
1086
1117
  console.log(summary.nativeAgents.removed > 0
1087
- ? ` ${dryRun ? "Would remove" : "Removed"} ${summary.nativeAgents.removed} legacy OMX-managed native agent config(s).\n`
1118
+ ? ` ${dryRun ? "Would archive and remove" : "Archived and removed"} ${summary.nativeAgents.removed} legacy OMX-managed native agent config(s).\n`
1088
1119
  : " Native agent refresh skipped; no legacy OMX-managed native agent configs found.\n");
1089
1120
  }
1090
1121
  else {
@@ -1107,6 +1138,16 @@ export async function setup(options = {}) {
1107
1138
  ? ` ${dryRun ? "Would clean" : "Cleaned"} legacy OMX config entries for plugin mode.\n`
1108
1139
  : " Config refresh skipped; no legacy OMX config entries found.\n");
1109
1140
  await applyPluginModeHooksConfig(scopeDirs.codexConfigFile, scopeDirs.codexHooksFile, pkgRoot, backupContext, summary.config, { dryRun, verbose });
1141
+ const pluginMarketplaceResult = await ensurePluginMarketplaceRegistration(scopeDirs.codexConfigFile, pkgRoot, backupContext, summary.config, { dryRun, verbose });
1142
+ if (pluginMarketplaceResult === "unavailable") {
1143
+ console.log(` warning: packaged ${OMX_LOCAL_MARKETPLACE_NAME} Codex plugin marketplace metadata not found; /skills plugin discovery was not registered.`);
1144
+ }
1145
+ else if (pluginMarketplaceResult === "updated") {
1146
+ console.log(` ${dryRun ? "Would register" : "Registered"} local Codex plugin marketplace ${OMX_LOCAL_MARKETPLACE_NAME} (${pkgRoot}).`);
1147
+ }
1148
+ else {
1149
+ console.log(` Local Codex plugin marketplace ${OMX_LOCAL_MARKETPLACE_NAME} already registered (${pkgRoot}).`);
1150
+ }
1110
1151
  resolvedConfig = existsSync(scopeDirs.codexConfigFile)
1111
1152
  ? await readFile(scopeDirs.codexConfigFile, "utf-8")
1112
1153
  : "";
@@ -1150,11 +1191,13 @@ export async function setup(options = {}) {
1150
1191
  for (const warning of sharedMcpRegistry.warnings) {
1151
1192
  console.log(` warning: ${warning}`);
1152
1193
  }
1194
+ const statusLinePreset = await resolveStatusLinePresetForSetup(projectRoot, { force });
1153
1195
  const managedConfig = await updateManagedConfig(scopeDirs.codexConfigFile, pkgRoot, sharedMcpRegistry, summary.config, backupContext, {
1154
- codexVersionProbe: options.codexVersionProbe,
1155
1196
  dryRun,
1156
1197
  modelUpgradePrompt,
1157
1198
  verbose,
1199
+ statusLinePreset,
1200
+ forceStatusLinePreset: force,
1158
1201
  });
1159
1202
  resolvedConfig = managedConfig.finalConfig;
1160
1203
  omxManagesTui = managedConfig.omxManagesTui;
@@ -1251,18 +1294,26 @@ export async function setup(options = {}) {
1251
1294
  let changed = true;
1252
1295
  let canApplyManagedModelRefresh = false;
1253
1296
  let managedRefreshContent = "";
1297
+ let canApplyManagedAgentsMerge = false;
1298
+ let mergedAgentsContent = "";
1254
1299
  if (agentsMdExists) {
1255
1300
  const existing = await readFile(agentsMdDst, "utf-8");
1256
1301
  changed = existing !== rewritten;
1257
- if (hasOmxManagedAgentsSections(existing)) {
1258
- managedRefreshContent = upsertAgentsModelTable(existing, modelTableContext);
1259
- canApplyManagedModelRefresh = managedRefreshContent !== existing;
1302
+ if (options.mergeAgents) {
1303
+ mergedAgentsContent = upsertManagedAgentsBlock(existing, rewritten);
1304
+ canApplyManagedAgentsMerge = mergedAgentsContent !== existing;
1305
+ }
1306
+ else {
1307
+ if (hasOmxManagedAgentsSections(existing)) {
1308
+ managedRefreshContent = upsertAgentsModelTable(existing, modelTableContext);
1309
+ canApplyManagedModelRefresh = managedRefreshContent !== existing;
1310
+ }
1260
1311
  }
1261
1312
  }
1262
1313
  if (resolvedScope.scope === "project" &&
1263
1314
  sessionIsActive &&
1264
1315
  agentsMdExists &&
1265
- changed) {
1316
+ (changed || canApplyManagedAgentsMerge || canApplyManagedModelRefresh)) {
1266
1317
  summary.agentsMd.skipped += 1;
1267
1318
  console.log(" WARNING: Active omx session detected (pid " +
1268
1319
  activeSession?.pid +
@@ -1270,6 +1321,20 @@ export async function setup(options = {}) {
1270
1321
  console.log(" Skipping AGENTS.md overwrite to avoid corrupting runtime overlay.");
1271
1322
  console.log(" Stop the active session first, then re-run setup.");
1272
1323
  }
1324
+ else if (options.mergeAgents &&
1325
+ agentsMdExists &&
1326
+ !canApplyManagedAgentsMerge) {
1327
+ summary.agentsMd.unchanged += 1;
1328
+ console.log(resolvedScope.scope === "project"
1329
+ ? " AGENTS.md already up to date in project root."
1330
+ : ` AGENTS.md already up to date in ${scopeDirs.codexHomeDir}.`);
1331
+ }
1332
+ else if (canApplyManagedAgentsMerge) {
1333
+ await syncManagedContent(mergedAgentsContent, agentsMdDst, summary.agentsMd, backupContext, { dryRun, verbose }, `merged AGENTS ${agentsMdDst}`);
1334
+ console.log(resolvedScope.scope === "project"
1335
+ ? " Merged OMX-managed AGENTS.md sections into project root."
1336
+ : ` Merged OMX-managed AGENTS.md sections into ${scopeDirs.codexHomeDir}.`);
1337
+ }
1273
1338
  else if (canApplyManagedModelRefresh) {
1274
1339
  await syncManagedContent(managedRefreshContent, agentsMdDst, summary.agentsMd, backupContext, { dryRun, verbose }, `AGENTS model table ${agentsMdDst}`);
1275
1340
  console.log(resolvedScope.scope === "project"
@@ -1334,9 +1399,6 @@ export async function setup(options = {}) {
1334
1399
  if (omxManagesTui) {
1335
1400
  console.log(" StatusLine configured in config.toml via [tui] section.");
1336
1401
  }
1337
- else {
1338
- console.log(" Codex CLI >= 0.107.0 manages [tui]; OMX left that section untouched.");
1339
- }
1340
1402
  console.log();
1341
1403
  console.log("Setup refresh summary:");
1342
1404
  logCategorySummary("prompts", summary.prompts);
@@ -1358,7 +1420,7 @@ export async function setup(options = {}) {
1358
1420
  console.log("\nNext steps:");
1359
1421
  console.log(" 1. Start Codex CLI in your project directory");
1360
1422
  if (isPluginInstallMode) {
1361
- console.log(" 2. Codex plugin discovery supplies OMX skills and workflow surfaces");
1423
+ console.log(` 2. Registered Codex marketplace ${OMX_LOCAL_MARKETPLACE_NAME} supplies OMX skills and workflow surfaces`);
1362
1424
  console.log(" 3. Browse plugin-provided skills with /skills");
1363
1425
  console.log(" 4. Optional AGENTS.md and developer_instructions defaults are only installed when selected during plugin-mode setup");
1364
1426
  console.log(" 5. Legacy native-agent TOML defaults remain uninstalled in plugin mode");
@@ -1519,17 +1581,15 @@ async function installPrompts(srcDir, dstDir, backupContext, options) {
1519
1581
  ? getCatalogAgentStatusByName(manifest)
1520
1582
  : null;
1521
1583
  const files = await readdir(srcDir);
1522
- const staleCandidatePromptNames = new Set(manifest?.agents.map((agent) => agent.name) ?? []);
1523
1584
  for (const file of files) {
1524
1585
  if (!file.endsWith(".md"))
1525
1586
  continue;
1526
1587
  const promptName = file.slice(0, -3);
1527
- staleCandidatePromptNames.add(promptName);
1528
1588
  const status = agentStatusByName?.get(promptName);
1529
- if (agentStatusByName && !isNativeAgentInstallableStatus(status)) {
1589
+ if (manifest && !isSetupPromptAssetName(promptName, manifest)) {
1530
1590
  summary.skipped += 1;
1531
1591
  if (options.verbose) {
1532
- const label = status ?? "unlisted";
1592
+ const label = status ?? "unclassified";
1533
1593
  console.log(` skipped ${file} (status: ${label})`);
1534
1594
  }
1535
1595
  continue;
@@ -1548,13 +1608,14 @@ async function installPrompts(srcDir, dstDir, backupContext, options) {
1548
1608
  continue;
1549
1609
  const promptName = file.slice(0, -3);
1550
1610
  const status = agentStatusByName?.get(promptName);
1551
- if (isNativeAgentInstallableStatus(status))
1552
- continue;
1553
- if (!staleCandidatePromptNames.has(promptName) && status === undefined)
1611
+ if (isSetupPromptAssetName(promptName, manifest))
1554
1612
  continue;
1555
1613
  const stalePromptPath = join(dstDir, file);
1556
1614
  if (!existsSync(stalePromptPath))
1557
1615
  continue;
1616
+ if (await ensureBackup(stalePromptPath, true, backupContext, options)) {
1617
+ summary.backedUp += 1;
1618
+ }
1558
1619
  if (!options.dryRun) {
1559
1620
  await rm(stalePromptPath, { force: true });
1560
1621
  }
@@ -1570,6 +1631,55 @@ async function installPrompts(srcDir, dstDir, backupContext, options) {
1570
1631
  }
1571
1632
  return summary;
1572
1633
  }
1634
+ function isGeneratedOmxNativeAgentToml(content, agentName) {
1635
+ const firstLine = content.split(/\r?\n/, 1)[0]?.trim();
1636
+ return firstLine === `# oh-my-codex agent: ${agentName}`;
1637
+ }
1638
+ async function cleanupGeneratedNonInstallableNativeAgents(agentsDir, manifest, backupContext, options) {
1639
+ const summary = createEmptyCategorySummary();
1640
+ if (!existsSync(agentsDir))
1641
+ return summary;
1642
+ const agentStatusByName = getCatalogAgentStatusByName(manifest);
1643
+ const installedFiles = await readdir(agentsDir);
1644
+ for (const file of installedFiles) {
1645
+ if (!file.endsWith(".toml"))
1646
+ continue;
1647
+ const agentName = file.slice(0, -5);
1648
+ const agentStatus = agentStatusByName.get(agentName);
1649
+ if (agentStatus === undefined ||
1650
+ isNativeAgentInstallableStatus(agentStatus)) {
1651
+ continue;
1652
+ }
1653
+ const staleAgentPath = join(agentsDir, file);
1654
+ let content = "";
1655
+ try {
1656
+ content = await readFile(staleAgentPath, "utf-8");
1657
+ }
1658
+ catch {
1659
+ continue;
1660
+ }
1661
+ if (!isGeneratedOmxNativeAgentToml(content, agentName)) {
1662
+ if (options.verbose) {
1663
+ console.log(` skipped stale native agent ${file}: not an OMX-generated native agent`);
1664
+ }
1665
+ continue;
1666
+ }
1667
+ if (await ensureBackup(staleAgentPath, true, backupContext, options)) {
1668
+ summary.backedUp += 1;
1669
+ }
1670
+ if (!options.dryRun) {
1671
+ await rm(staleAgentPath, { force: true });
1672
+ }
1673
+ summary.removed += 1;
1674
+ if (options.verbose) {
1675
+ const prefix = options.dryRun
1676
+ ? "would remove stale generated native agent"
1677
+ : "removed stale generated native agent";
1678
+ console.log(` ${prefix} ${file} (status: ${agentStatus})`);
1679
+ }
1680
+ }
1681
+ return summary;
1682
+ }
1573
1683
  async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, options) {
1574
1684
  const summary = createEmptyCategorySummary();
1575
1685
  if (!options.dryRun) {
@@ -1605,6 +1715,11 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
1605
1715
  await syncManagedContent(toml, dst, summary, backupContext, options, `native agent ${name}.toml`);
1606
1716
  }
1607
1717
  summary.removed += await cleanupObsoleteNativeAgents(agentsDir, backupContext, options);
1718
+ if (manifest) {
1719
+ const generatedCleanup = await cleanupGeneratedNonInstallableNativeAgents(agentsDir, manifest, backupContext, options);
1720
+ summary.backedUp += generatedCleanup.backedUp;
1721
+ summary.removed += generatedCleanup.removed;
1722
+ }
1608
1723
  if (options.force && manifest && existsSync(agentsDir)) {
1609
1724
  const installedFiles = await readdir(agentsDir);
1610
1725
  for (const file of installedFiles) {
@@ -1620,6 +1735,9 @@ async function refreshNativeAgentConfigs(pkgRoot, agentsDir, backupContext, opti
1620
1735
  const staleAgentPath = join(agentsDir, file);
1621
1736
  if (!existsSync(staleAgentPath))
1622
1737
  continue;
1738
+ if (await ensureBackup(staleAgentPath, true, backupContext, options)) {
1739
+ summary.backedUp += 1;
1740
+ }
1623
1741
  if (!options.dryRun) {
1624
1742
  await rm(staleAgentPath, { force: true });
1625
1743
  }
@@ -1823,8 +1941,7 @@ async function updateManagedConfig(configPath, pkgRoot, sharedMcpRegistry, summa
1823
1941
  const hadLegacyTeamRunTable = hasLegacyOmxTeamRunTable(existing);
1824
1942
  const currentModel = getRootModelName(existing);
1825
1943
  let modelOverride;
1826
- const codexVersion = options.codexVersionProbe?.() ?? probeInstalledCodexVersion();
1827
- const omxManagesTui = shouldOmxManageTuiFromCodexVersion(codexVersion);
1944
+ const omxManagesTui = true;
1828
1945
  if (currentModel === LEGACY_SETUP_MODEL) {
1829
1946
  const shouldPrompt = typeof options.modelUpgradePrompt === "function" ||
1830
1947
  (process.stdin.isTTY && process.stdout.isTTY);
@@ -1843,6 +1960,8 @@ async function updateManagedConfig(configPath, pkgRoot, sharedMcpRegistry, summa
1843
1960
  sharedMcpServers: sharedMcpRegistry.servers,
1844
1961
  sharedMcpRegistrySource: sharedMcpRegistry.sourcePath,
1845
1962
  verbose: options.verbose,
1963
+ statusLinePreset: options.statusLinePreset,
1964
+ forceStatusLinePreset: options.forceStatusLinePreset,
1846
1965
  });
1847
1966
  const changed = existing !== finalConfig;
1848
1967
  if (!changed) {