oh-my-codex 0.16.3 → 0.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +3 -3
  4. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js +9 -0
  5. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js.map +1 -1
  6. package/dist/cli/__tests__/cleanup.test.js +27 -0
  7. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  8. package/dist/cli/__tests__/codex-plugin-layout.test.js +7 -5
  9. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  10. package/dist/cli/__tests__/doctor-warning-copy.test.js +101 -6
  11. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  12. package/dist/cli/__tests__/index.test.js +131 -2
  13. package/dist/cli/__tests__/index.test.js.map +1 -1
  14. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +2 -0
  15. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  16. package/dist/cli/__tests__/ralph.test.js +47 -0
  17. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  18. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +2 -2
  19. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -1
  20. package/dist/cli/__tests__/setup-install-mode.test.js +272 -26
  21. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  22. package/dist/cli/__tests__/setup-refresh.test.js +85 -3
  23. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  24. package/dist/cli/__tests__/setup-scope.test.js +1 -1
  25. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  26. package/dist/cli/__tests__/setup-skills-overwrite.test.js +2 -1
  27. package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -1
  28. package/dist/cli/__tests__/team.test.js +108 -0
  29. package/dist/cli/__tests__/team.test.js.map +1 -1
  30. package/dist/cli/__tests__/ultragoal.test.js +69 -0
  31. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  32. package/dist/cli/__tests__/uninstall.test.js +54 -8
  33. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  34. package/dist/cli/cleanup.d.ts.map +1 -1
  35. package/dist/cli/cleanup.js +8 -4
  36. package/dist/cli/cleanup.js.map +1 -1
  37. package/dist/cli/codex-feature-probe.d.ts +9 -0
  38. package/dist/cli/codex-feature-probe.d.ts.map +1 -0
  39. package/dist/cli/codex-feature-probe.js +28 -0
  40. package/dist/cli/codex-feature-probe.js.map +1 -0
  41. package/dist/cli/doctor.d.ts +1 -0
  42. package/dist/cli/doctor.d.ts.map +1 -1
  43. package/dist/cli/doctor.js +152 -17
  44. package/dist/cli/doctor.js.map +1 -1
  45. package/dist/cli/index.d.ts +9 -2
  46. package/dist/cli/index.d.ts.map +1 -1
  47. package/dist/cli/index.js +135 -17
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cli/mcp-parity.js +8 -8
  50. package/dist/cli/mcp-parity.js.map +1 -1
  51. package/dist/cli/plugin-marketplace.d.ts +3 -0
  52. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  53. package/dist/cli/plugin-marketplace.js +88 -0
  54. package/dist/cli/plugin-marketplace.js.map +1 -1
  55. package/dist/cli/ralph.d.ts.map +1 -1
  56. package/dist/cli/ralph.js +21 -0
  57. package/dist/cli/ralph.js.map +1 -1
  58. package/dist/cli/setup-preferences.d.ts +4 -0
  59. package/dist/cli/setup-preferences.d.ts.map +1 -1
  60. package/dist/cli/setup-preferences.js +7 -0
  61. package/dist/cli/setup-preferences.js.map +1 -1
  62. package/dist/cli/setup.d.ts +5 -3
  63. package/dist/cli/setup.d.ts.map +1 -1
  64. package/dist/cli/setup.js +114 -44
  65. package/dist/cli/setup.js.map +1 -1
  66. package/dist/cli/ultragoal.d.ts +1 -1
  67. package/dist/cli/ultragoal.d.ts.map +1 -1
  68. package/dist/cli/ultragoal.js +64 -5
  69. package/dist/cli/ultragoal.js.map +1 -1
  70. package/dist/cli/uninstall.d.ts +2 -0
  71. package/dist/cli/uninstall.d.ts.map +1 -1
  72. package/dist/cli/uninstall.js +12 -3
  73. package/dist/cli/uninstall.js.map +1 -1
  74. package/dist/config/__tests__/codex-feature-flags.test.d.ts +2 -0
  75. package/dist/config/__tests__/codex-feature-flags.test.d.ts.map +1 -0
  76. package/dist/config/__tests__/codex-feature-flags.test.js +35 -0
  77. package/dist/config/__tests__/codex-feature-flags.test.js.map +1 -0
  78. package/dist/config/__tests__/codex-hooks.test.js +7 -0
  79. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  80. package/dist/config/__tests__/generator-idempotent.test.js +70 -9
  81. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  82. package/dist/config/__tests__/generator-notify.test.js +116 -11
  83. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  84. package/dist/config/__tests__/wiki-config-contract.test.js +6 -3
  85. package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -1
  86. package/dist/config/codex-feature-flags.d.ts +21 -0
  87. package/dist/config/codex-feature-flags.d.ts.map +1 -0
  88. package/dist/config/codex-feature-flags.js +56 -0
  89. package/dist/config/codex-feature-flags.js.map +1 -0
  90. package/dist/config/codex-hooks.d.ts +2 -0
  91. package/dist/config/codex-hooks.d.ts.map +1 -1
  92. package/dist/config/codex-hooks.js +25 -3
  93. package/dist/config/codex-hooks.js.map +1 -1
  94. package/dist/config/generator.d.ts +11 -2
  95. package/dist/config/generator.d.ts.map +1 -1
  96. package/dist/config/generator.js +221 -123
  97. package/dist/config/generator.js.map +1 -1
  98. package/dist/config/omx-first-party-mcp.d.ts +3 -1
  99. package/dist/config/omx-first-party-mcp.d.ts.map +1 -1
  100. package/dist/config/omx-first-party-mcp.js +2 -2
  101. package/dist/config/omx-first-party-mcp.js.map +1 -1
  102. package/dist/hooks/__tests__/keyword-detector.test.js +92 -2
  103. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  104. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js +125 -1
  105. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js.map +1 -1
  106. package/dist/hooks/__tests__/skill-catalog-hygiene.test.d.ts +2 -0
  107. package/dist/hooks/__tests__/skill-catalog-hygiene.test.d.ts.map +1 -0
  108. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js +84 -0
  109. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -0
  110. package/dist/hooks/agents-overlay.js +2 -2
  111. package/dist/hooks/agents-overlay.js.map +1 -1
  112. package/dist/hooks/keyword-detector.d.ts +1 -0
  113. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  114. package/dist/hooks/keyword-detector.js +7 -5
  115. package/dist/hooks/keyword-detector.js.map +1 -1
  116. package/dist/hud/__tests__/state.test.js +164 -0
  117. package/dist/hud/__tests__/state.test.js.map +1 -1
  118. package/dist/hud/state.d.ts.map +1 -1
  119. package/dist/hud/state.js +4 -5
  120. package/dist/hud/state.js.map +1 -1
  121. package/dist/mcp/__tests__/state-paths.test.js +61 -0
  122. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  123. package/dist/mcp/__tests__/state-server.test.js +166 -0
  124. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  125. package/dist/mcp/state-paths.d.ts.map +1 -1
  126. package/dist/mcp/state-paths.js +23 -2
  127. package/dist/mcp/state-paths.js.map +1 -1
  128. package/dist/modes/__tests__/base-session-scope.test.js +22 -0
  129. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  130. package/dist/modes/__tests__/base-tmux-pane.test.js +57 -26
  131. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
  132. package/dist/modes/base.d.ts.map +1 -1
  133. package/dist/modes/base.js +5 -0
  134. package/dist/modes/base.js.map +1 -1
  135. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.d.ts +2 -0
  136. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.d.ts.map +1 -0
  137. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js +316 -0
  138. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -0
  139. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.d.ts +2 -0
  140. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.d.ts.map +1 -0
  141. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js +481 -0
  142. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js.map +1 -0
  143. package/dist/planning/__tests__/artifacts.test.js +533 -4
  144. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  145. package/dist/planning/__tests__/context-pack-status.test.js +524 -0
  146. package/dist/planning/__tests__/context-pack-status.test.js.map +1 -1
  147. package/dist/planning/__tests__/markdown-structure.test.d.ts +2 -0
  148. package/dist/planning/__tests__/markdown-structure.test.d.ts.map +1 -0
  149. package/dist/planning/__tests__/markdown-structure.test.js +459 -0
  150. package/dist/planning/__tests__/markdown-structure.test.js.map +1 -0
  151. package/dist/planning/__tests__/ready-context-pack-role-refs.test.js +523 -1
  152. package/dist/planning/__tests__/ready-context-pack-role-refs.test.js.map +1 -1
  153. package/dist/planning/artifacts.d.ts +1 -1
  154. package/dist/planning/artifacts.d.ts.map +1 -1
  155. package/dist/planning/artifacts.js +227 -28
  156. package/dist/planning/artifacts.js.map +1 -1
  157. package/dist/planning/context-pack-status.d.ts +25 -0
  158. package/dist/planning/context-pack-status.d.ts.map +1 -1
  159. package/dist/planning/context-pack-status.js +272 -31
  160. package/dist/planning/context-pack-status.js.map +1 -1
  161. package/dist/planning/markdown-structure.d.ts +20 -0
  162. package/dist/planning/markdown-structure.d.ts.map +1 -0
  163. package/dist/planning/markdown-structure.js +137 -0
  164. package/dist/planning/markdown-structure.js.map +1 -0
  165. package/dist/ralph/__tests__/completion-audit.test.d.ts +2 -0
  166. package/dist/ralph/__tests__/completion-audit.test.d.ts.map +1 -0
  167. package/dist/ralph/__tests__/completion-audit.test.js +121 -0
  168. package/dist/ralph/__tests__/completion-audit.test.js.map +1 -0
  169. package/dist/ralph/completion-audit.d.ts +8 -0
  170. package/dist/ralph/completion-audit.d.ts.map +1 -0
  171. package/dist/ralph/completion-audit.js +99 -0
  172. package/dist/ralph/completion-audit.js.map +1 -0
  173. package/dist/scripts/__tests__/codex-native-hook.test.js +220 -13
  174. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  175. package/dist/scripts/__tests__/notify-dispatcher.test.d.ts +2 -0
  176. package/dist/scripts/__tests__/notify-dispatcher.test.d.ts.map +1 -0
  177. package/dist/scripts/__tests__/notify-dispatcher.test.js +126 -0
  178. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -0
  179. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  180. package/dist/scripts/codex-native-hook.js +133 -54
  181. package/dist/scripts/codex-native-hook.js.map +1 -1
  182. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  183. package/dist/scripts/codex-native-pre-post.js +4 -2
  184. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  185. package/dist/scripts/notify-dispatcher.js +30 -1
  186. package/dist/scripts/notify-dispatcher.js.map +1 -1
  187. package/dist/scripts/notify-hook.js +3 -1
  188. package/dist/scripts/notify-hook.js.map +1 -1
  189. package/dist/state/__tests__/workflow-transition.test.js +102 -27
  190. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  191. package/dist/state/operations.d.ts.map +1 -1
  192. package/dist/state/operations.js +9 -3
  193. package/dist/state/operations.js.map +1 -1
  194. package/dist/state/skill-active.d.ts +7 -0
  195. package/dist/state/skill-active.d.ts.map +1 -1
  196. package/dist/state/skill-active.js +25 -8
  197. package/dist/state/skill-active.js.map +1 -1
  198. package/dist/state/workflow-transition-reconcile.d.ts +1 -0
  199. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  200. package/dist/state/workflow-transition-reconcile.js +22 -15
  201. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  202. package/dist/state/workflow-transition.js +3 -3
  203. package/dist/state/workflow-transition.js.map +1 -1
  204. package/dist/team/__tests__/approved-execution.test.js +39 -0
  205. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  206. package/dist/team/__tests__/runtime.test.js +5 -0
  207. package/dist/team/__tests__/runtime.test.js.map +1 -1
  208. package/dist/team/__tests__/scaling.test.js +497 -2
  209. package/dist/team/__tests__/scaling.test.js.map +1 -1
  210. package/dist/team/__tests__/state-root.test.js +1 -1
  211. package/dist/team/__tests__/state-root.test.js.map +1 -1
  212. package/dist/team/__tests__/worker-bootstrap.test.js +8 -0
  213. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  214. package/dist/team/approved-execution.d.ts.map +1 -1
  215. package/dist/team/approved-execution.js +3 -0
  216. package/dist/team/approved-execution.js.map +1 -1
  217. package/dist/team/scaling.d.ts.map +1 -1
  218. package/dist/team/scaling.js +43 -0
  219. package/dist/team/scaling.js.map +1 -1
  220. package/dist/team/state-root.d.ts.map +1 -1
  221. package/dist/team/state-root.js +4 -0
  222. package/dist/team/state-root.js.map +1 -1
  223. package/dist/team/state.d.ts.map +1 -1
  224. package/dist/team/state.js +2 -6
  225. package/dist/team/state.js.map +1 -1
  226. package/dist/ultragoal/__tests__/artifacts.test.js +124 -1
  227. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  228. package/dist/ultragoal/__tests__/docs-contract.test.js +21 -0
  229. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  230. package/dist/ultragoal/artifacts.d.ts +44 -2
  231. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  232. package/dist/ultragoal/artifacts.js +197 -13
  233. package/dist/ultragoal/artifacts.js.map +1 -1
  234. package/dist/wiki/lifecycle.js +1 -1
  235. package/dist/wiki/lifecycle.js.map +1 -1
  236. package/package.json +1 -1
  237. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  238. package/plugins/oh-my-codex/.mcp.json +5 -5
  239. package/plugins/oh-my-codex/skills/analyze/SKILL.md +0 -2
  240. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +2 -2
  241. package/plugins/oh-my-codex/skills/code-review/SKILL.md +1 -3
  242. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +5 -7
  243. package/plugins/oh-my-codex/skills/doctor/SKILL.md +2 -2
  244. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +3 -3
  245. package/plugins/oh-my-codex/skills/pipeline/SKILL.md +3 -3
  246. package/plugins/oh-my-codex/skills/plan/SKILL.md +3 -6
  247. package/plugins/oh-my-codex/skills/ralph/SKILL.md +9 -10
  248. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +36 -3
  249. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +21 -24
  250. package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +8 -8
  251. package/plugins/oh-my-codex/skills/wiki/SKILL.md +13 -13
  252. package/skills/analyze/SKILL.md +0 -2
  253. package/skills/ask-claude/SKILL.md +5 -3
  254. package/skills/ask-gemini/SKILL.md +5 -3
  255. package/skills/autopilot/SKILL.md +2 -2
  256. package/skills/code-review/SKILL.md +1 -3
  257. package/skills/deep-interview/SKILL.md +5 -7
  258. package/skills/doctor/SKILL.md +2 -2
  259. package/skills/ecomode/SKILL.md +105 -1
  260. package/skills/frontend-ui-ux/SKILL.md +4 -26
  261. package/skills/git-master/SKILL.md +2 -4
  262. package/skills/omx-setup/SKILL.md +3 -3
  263. package/skills/pipeline/SKILL.md +3 -3
  264. package/skills/plan/SKILL.md +3 -6
  265. package/skills/ralph/SKILL.md +9 -10
  266. package/skills/swarm/SKILL.md +5 -3
  267. package/skills/tdd/SKILL.md +95 -1
  268. package/skills/ultragoal/SKILL.md +36 -3
  269. package/skills/ultraqa/SKILL.md +21 -24
  270. package/skills/ultrawork/SKILL.md +8 -8
  271. package/skills/web-clone/SKILL.md +348 -1
  272. package/skills/wiki/SKILL.md +13 -13
  273. package/src/scripts/__tests__/codex-native-hook.test.ts +231 -13
  274. package/src/scripts/__tests__/notify-dispatcher.test.ts +153 -0
  275. package/src/scripts/codex-native-hook.ts +160 -43
  276. package/src/scripts/codex-native-pre-post.ts +4 -1
  277. package/src/scripts/notify-dispatcher.ts +40 -1
  278. package/src/scripts/notify-hook.ts +3 -1
package/dist/cli/index.js CHANGED
@@ -7,7 +7,7 @@ import { basename, dirname, join, posix, win32 } from "path";
7
7
  import { existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "fs";
8
8
  import { copyFile, cp, lstat, mkdir, readFile, readdir, rm, symlink, writeFile } from "fs/promises";
9
9
  import { constants as osConstants, homedir } from "os";
10
- import { setup, SETUP_SCOPES } from "./setup.js";
10
+ import { setup, SETUP_MCP_MODES, SETUP_SCOPES, } from "./setup.js";
11
11
  import { uninstall } from "./uninstall.js";
12
12
  import { version } from "./version.js";
13
13
  import { tmuxHookCommand } from "./tmux-hook.js";
@@ -35,9 +35,10 @@ import { adaptCommand } from "./adapt.js";
35
35
  import { listCommand } from "./list.js";
36
36
  import { MADMAX_FLAG, CODEX_BYPASS_FLAG, HIGH_REASONING_FLAG, XHIGH_REASONING_FLAG, SPARK_FLAG, MADMAX_SPARK_FLAG, CONFIG_FLAG, LONG_CONFIG_FLAG, } from "./constants.js";
37
37
  import { getBaseStateDir, getStateDir, listModeStateFilesWithScopePreference, } from "../mcp/state-paths.js";
38
- import { resolveCodexConfigPathForLaunch, resolveCodexHomeForLaunch, resolveProjectLocalCodexHomeForLaunch, } from "./codex-home.js";
38
+ import { evaluateRalphCompletionAuditEvidence, isRalphCompletePhase } from "../ralph/completion-audit.js";
39
+ import { readPersistedSetupPreferences, resolveCodexConfigPathForLaunch, resolveCodexHomeForLaunch, resolveProjectLocalCodexHomeForLaunch, } from "./codex-home.js";
39
40
  export { readPersistedSetupPreferences, readPersistedSetupScope, resolveCodexConfigPathForLaunch, resolveCodexHomeForLaunch, resolveProjectLocalCodexHomeForLaunch, } from "./codex-home.js";
40
- import { SKILL_ACTIVE_STATE_MODE, extractSessionIdFromInitializedStatePath, getSkillActiveStatePaths, listActiveSkills, readSkillActiveState, syncCanonicalSkillStateForMode, } from "../state/skill-active.js";
41
+ import { SKILL_ACTIVE_STATE_MODE, extractSessionIdFromInitializedStatePath, getSkillActiveStatePathsForStateDir, listActiveSkills, readSkillActiveState, syncCanonicalSkillStateForMode, } from "../state/skill-active.js";
41
42
  import { isTrackedWorkflowMode } from "../state/workflow-transition.js";
42
43
  import { maybeCheckAndPromptUpdate, runImmediateUpdate } from "./update.js";
43
44
  import { maybePromptGithubStar } from "./star-prompt.js";
@@ -46,7 +47,8 @@ import { readSessionState, writeSessionStart, writeSessionEnd, resetSessionMetri
46
47
  import { buildClientAttachedReconcileHookName, buildReconcileHudResizeArgs, buildRegisterClientAttachedReconcileArgs, buildRegisterResizeHookArgs, buildResizeHookName, buildResizeHookTarget, buildScheduleDelayedHudResizeArgs, buildUnregisterClientAttachedReconcileArgs, buildUnregisterResizeHookArgs, enableMouseScrolling, isMsysOrGitBash, isNativeWindows, isTmuxAvailable, mitigateCopyModeUnderlineArtifacts, } from "../team/tmux-session.js";
47
48
  import { getPackageRoot } from "../utils/package.js";
48
49
  import { codexConfigPath, omxRoot, rememberOmxLaunchContext, resolveOmxEntryPath } from "../utils/paths.js";
49
- import { cleanCodexModelAvailabilityNuxIfNeeded, repairConfigIfNeeded, upsertManagedCodexHookTrustState } from "../config/generator.js";
50
+ import { cleanCodexModelAvailabilityNuxIfNeeded, extractSharedMcpRegistryServersFromConfig, repairConfigIfNeeded, upsertManagedCodexHookTrustState } from "../config/generator.js";
51
+ import { OMX_FIRST_PARTY_MCP_SERVER_NAMES } from "../config/omx-first-party-mcp.js";
50
52
  import { HUD_TMUX_HEIGHT_LINES } from "../hud/constants.js";
51
53
  import { OMX_TMUX_HUD_OWNER_ENV } from "../hud/reconcile.js";
52
54
  import { createHudWatchPane as createSharedHudWatchPane, killTmuxPane as killSharedTmuxPane, listCurrentWindowHudPaneIds, parsePaneIdFromTmuxOutput, } from "../hud/tmux.js";
@@ -83,7 +85,7 @@ Usage:
83
85
  Queue audited follow-up instructions for a running non-interactive exec job
84
86
  omx imagegen continuation <session-id> --artifact <name>
85
87
  Queue a Stop-hook continuation for built-in image generation turns
86
- omx setup Install skills, prompts, MCP servers, and scope-specific AGENTS.md
88
+ omx setup Install skills, prompts, CLI-first config, and scope-specific AGENTS.md
87
89
  (user scope prompts for legacy vs plugin skill delivery when needed)
88
90
  omx update Check npm now, update the global install immediately, then refresh setup
89
91
  omx uninstall Remove OMX configuration and clean up installed artifacts
@@ -116,13 +118,13 @@ Usage:
116
118
  omx hud Show HUD statusline (--watch, --json, --preset=NAME)
117
119
  omx sidecar Show read-only team/multi-agent visualization (--watch, --json, --tmux)
118
120
  omx state Read/write/list OMX mode state via CLI parity surface
119
- omx notepad CLI parity for OMX notepad MCP tools
121
+ omx notepad JSON CLI surface for OMX notepad operations
120
122
  omx project-memory
121
- CLI parity for OMX project-memory MCP tools
122
- omx trace CLI parity for OMX trace MCP tools
123
+ JSON CLI surface for OMX project-memory operations
124
+ omx trace JSON CLI surface for OMX trace operations
123
125
  omx code-intel
124
- CLI parity for OMX code-intel MCP tools
125
- omx wiki CLI parity for OMX wiki MCP tools
126
+ JSON CLI surface for OMX code-intel operations
127
+ omx wiki JSON CLI surface for OMX wiki operations
126
128
  omx mcp-serve Launch an OMX stdio MCP server target (plugin/runtime use)
127
129
  omx sparkshell <command> [args...]
128
130
  omx sparkshell --tmux-pane <pane-id> [--tail-lines <100-1000>]
@@ -164,6 +166,10 @@ Options:
164
166
  --legacy Use legacy setup delivery for omx setup, overriding persisted plugin mode
165
167
  --install-mode <legacy|plugin>
166
168
  Explicit setup install mode (canonical form; --legacy/--plugin are aliases)
169
+ --mcp <none|compat>
170
+ Explicit setup MCP mode (default: none; compat enables first-party MCP compatibility and shared registry sync)
171
+ --no-mcp Alias for --mcp=none
172
+ --with-mcp Alias for --mcp=compat
167
173
  --keep-config Skip config.toml cleanup during uninstall
168
174
  --purge Remove .omx/ cache directory during uninstall
169
175
  --verbose Show detailed output
@@ -288,6 +294,45 @@ export function resolveSetupInstallModeArg(args) {
288
294
  }
289
295
  return value;
290
296
  }
297
+ export function resolveSetupMcpModeArg(args) {
298
+ let value;
299
+ const setValue = (next, source) => {
300
+ if (value && value !== next) {
301
+ throw new Error(`Conflicting setup MCP mode flags: ${source} selects ${next}, but another flag already selected ${value}`);
302
+ }
303
+ value = next;
304
+ };
305
+ const parseValue = (next) => {
306
+ if (!SETUP_MCP_MODES.includes(next)) {
307
+ throw new Error(`Invalid setup MCP mode: ${next}. Expected one of: none, compat`);
308
+ }
309
+ return next;
310
+ };
311
+ for (let index = 0; index < args.length; index += 1) {
312
+ const arg = args[index];
313
+ if (arg === "--no-mcp") {
314
+ setValue("none", arg);
315
+ continue;
316
+ }
317
+ if (arg === "--with-mcp") {
318
+ setValue("compat", arg);
319
+ continue;
320
+ }
321
+ if (arg === "--mcp") {
322
+ const next = args[index + 1];
323
+ if (!next || next.startsWith("-")) {
324
+ throw new Error(`Missing setup MCP mode value after --mcp. Expected one of: none, compat`);
325
+ }
326
+ setValue(parseValue(next), arg);
327
+ index += 1;
328
+ continue;
329
+ }
330
+ if (arg.startsWith("--mcp=")) {
331
+ setValue(parseValue(arg.slice("--mcp=".length)), "--mcp");
332
+ }
333
+ }
334
+ return value;
335
+ }
291
336
  export function resolveSetupScopeArg(args) {
292
337
  let value;
293
338
  for (let index = 0; index < args.length; index += 1) {
@@ -637,6 +682,39 @@ export function classifyCodexExecFailure(error) {
637
682
  message,
638
683
  };
639
684
  }
685
+ export async function resolveLaunchConfigRepairOptions(cwd, configPath) {
686
+ let content;
687
+ const readConfig = async () => {
688
+ if (content !== undefined)
689
+ return content;
690
+ if (!existsSync(configPath))
691
+ return undefined;
692
+ content = await readFile(configPath, "utf-8");
693
+ return content;
694
+ };
695
+ const existingContent = await readConfig();
696
+ const sharedMcpRegistry = existingContent
697
+ ? extractSharedMcpRegistryServersFromConfig(existingContent)
698
+ : { servers: [] };
699
+ const sharedMcpOptions = sharedMcpRegistry.servers.length > 0
700
+ ? {
701
+ sharedMcpServers: sharedMcpRegistry.servers,
702
+ sharedMcpRegistrySource: sharedMcpRegistry.sourcePath,
703
+ }
704
+ : {};
705
+ if (readPersistedSetupPreferences(cwd)?.mcpMode === "compat") {
706
+ return { includeFirstPartyMcp: true, ...sharedMcpOptions };
707
+ }
708
+ if (existingContent) {
709
+ const hasExistingFirstPartyMcp = OMX_FIRST_PARTY_MCP_SERVER_NAMES.some((name) => new RegExp(`^\\s*\\[mcp_servers\\.${name}\\]\\s*$`, "m").test(existingContent));
710
+ if (hasExistingFirstPartyMcp || sharedMcpRegistry.servers.length > 0) {
711
+ return { includeFirstPartyMcp: hasExistingFirstPartyMcp, ...sharedMcpOptions };
712
+ }
713
+ }
714
+ return {
715
+ includeFirstPartyMcp: false,
716
+ };
717
+ }
640
718
  function runCodexBlocking(cwd, launchArgs, codexEnv) {
641
719
  const { result } = spawnPlatformCommandSync("codex", launchArgs, {
642
720
  cwd,
@@ -816,6 +894,7 @@ export async function main(args) {
816
894
  verbose: options.verbose,
817
895
  scope: resolveSetupScopeArg(args.slice(1)),
818
896
  installMode: resolveSetupInstallModeArg(args.slice(1)),
897
+ mcpMode: resolveSetupMcpModeArg(args.slice(1)),
819
898
  });
820
899
  break;
821
900
  case "update":
@@ -1107,7 +1186,8 @@ export async function launchWithHud(args) {
1107
1186
  // have written a config.toml with duplicate [tui] sections. Codex CLI's
1108
1187
  // TOML parser rejects duplicates, so we repair before spawning the CLI.
1109
1188
  try {
1110
- const repaired = await repairConfigIfNeeded(resolveCodexConfigPathForLaunch(launchCwd, process.env), getPackageRoot());
1189
+ const configPath = resolveCodexConfigPathForLaunch(launchCwd, process.env);
1190
+ const repaired = await repairConfigIfNeeded(configPath, getPackageRoot(), await resolveLaunchConfigRepairOptions(launchCwd, configPath));
1111
1191
  if (repaired) {
1112
1192
  console.log("[omx] Repaired managed config.toml compatibility issue.");
1113
1193
  }
@@ -1191,7 +1271,8 @@ export async function execWithOverlay(args) {
1191
1271
  logCliOperationFailure(err);
1192
1272
  }
1193
1273
  try {
1194
- const repaired = await repairConfigIfNeeded(resolveCodexConfigPathForLaunch(launchCwd, process.env), getPackageRoot());
1274
+ const configPath = resolveCodexConfigPathForLaunch(launchCwd, process.env);
1275
+ const repaired = await repairConfigIfNeeded(configPath, getPackageRoot(), await resolveLaunchConfigRepairOptions(launchCwd, configPath));
1195
1276
  if (repaired) {
1196
1277
  console.log("[omx] Repaired managed config.toml compatibility issue.");
1197
1278
  }
@@ -2171,11 +2252,11 @@ function cleanPostLaunchString(value) {
2171
2252
  function postLaunchUniqueStrings(values) {
2172
2253
  return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
2173
2254
  }
2174
- async function scrubPostLaunchRootSkillActiveForSession(cwd, sessionId, nowIso, writeFileFn, rootStateBeforeCleanup) {
2255
+ async function scrubPostLaunchRootSkillActiveForSession(stateDir, sessionId, nowIso, writeFileFn, rootStateBeforeCleanup) {
2175
2256
  const normalizedSessionId = cleanPostLaunchString(sessionId);
2176
2257
  if (!normalizedSessionId)
2177
2258
  return;
2178
- const { rootPath } = getSkillActiveStatePaths(cwd);
2259
+ const { rootPath } = getSkillActiveStatePathsForStateDir(stateDir);
2179
2260
  const rootState = rootStateBeforeCleanup ?? await readSkillActiveState(rootPath);
2180
2261
  if (!rootState)
2181
2262
  return;
@@ -2226,6 +2307,23 @@ function buildRecoveredPostLaunchSkillActiveState(completedAt) {
2226
2307
  active_skills: [],
2227
2308
  };
2228
2309
  }
2310
+ function markRalphCompletionAuditBlockedForPostLaunch(state, cwd, nowIso) {
2311
+ if (!isRalphCompletePhase(state.current_phase ?? state.currentPhase))
2312
+ return false;
2313
+ const audit = evaluateRalphCompletionAuditEvidence(state, cwd);
2314
+ if (audit.complete)
2315
+ return false;
2316
+ state.active = false;
2317
+ state.current_phase = "cancelled";
2318
+ state.completed_at = nowIso;
2319
+ state.last_turn_at = nowIso;
2320
+ state.interrupted_at = nowIso;
2321
+ state.stop_reason = `missing_completion_audit:${audit.reason}`;
2322
+ state.completion_audit_gate = "blocked";
2323
+ state.completion_audit_missing_reason = audit.reason;
2324
+ state.completion_audit_blocked_at = nowIso;
2325
+ return true;
2326
+ }
2229
2327
  export async function cleanupPostLaunchModeStateFiles(cwd, sessionId, dependencies = {}) {
2230
2328
  const readdir = dependencies.readdir ?? (await import("fs/promises")).readdir;
2231
2329
  const writeFile = dependencies.writeFile ?? (await import("fs/promises")).writeFile;
@@ -2234,8 +2332,9 @@ export async function cleanupPostLaunchModeStateFiles(cwd, sessionId, dependenci
2234
2332
  const scopedDirs = sessionId
2235
2333
  ? [getStateDir(cwd, sessionId)]
2236
2334
  : [getBaseStateDir(cwd)];
2335
+ const rootStateDir = getBaseStateDir(cwd);
2237
2336
  const rootSkillActiveStateBeforeCleanup = sessionId
2238
- ? await readSkillActiveState(getSkillActiveStatePaths(cwd).rootPath)
2337
+ ? await readSkillActiveState(getSkillActiveStatePathsForStateDir(rootStateDir).rootPath)
2239
2338
  : null;
2240
2339
  for (const stateDir of scopedDirs) {
2241
2340
  const files = await readdir(stateDir).catch(() => []);
@@ -2255,6 +2354,7 @@ export async function cleanupPostLaunchModeStateFiles(cwd, sessionId, dependenci
2255
2354
  if (isTrackedWorkflowMode(mode)) {
2256
2355
  await syncCanonicalSkillStateForMode({
2257
2356
  cwd,
2357
+ baseStateDir: rootStateDir,
2258
2358
  mode,
2259
2359
  active: false,
2260
2360
  currentPhase: "cancelled",
@@ -2276,8 +2376,25 @@ export async function cleanupPostLaunchModeStateFiles(cwd, sessionId, dependenci
2276
2376
  const skillStateStillVisible = mode === SKILL_ACTIVE_STATE_MODE
2277
2377
  && Array.isArray(result.state.active_skills)
2278
2378
  && result.state.active_skills.length > 0;
2279
- if (result.state.active !== true && !skillStateStillVisible)
2379
+ if (result.state.active !== true && !skillStateStillVisible) {
2380
+ if (mode === "ralph") {
2381
+ const completedAt = now().toISOString();
2382
+ if (markRalphCompletionAuditBlockedForPostLaunch(result.state, cwd, completedAt)) {
2383
+ await writeFile(path, JSON.stringify(result.state, null, 2));
2384
+ await syncCanonicalSkillStateForMode({
2385
+ cwd,
2386
+ baseStateDir: rootStateDir,
2387
+ mode,
2388
+ active: false,
2389
+ currentPhase: "cancelled",
2390
+ sessionId: stateDir === getStateDir(cwd, sessionId) ? sessionId : undefined,
2391
+ nowIso: completedAt,
2392
+ source: "postLaunchCleanup",
2393
+ });
2394
+ }
2395
+ }
2280
2396
  continue;
2397
+ }
2281
2398
  try {
2282
2399
  const completedAt = now().toISOString();
2283
2400
  if (mode === SKILL_ACTIVE_STATE_MODE) {
@@ -2299,6 +2416,7 @@ export async function cleanupPostLaunchModeStateFiles(cwd, sessionId, dependenci
2299
2416
  if (isTrackedWorkflowMode(mode)) {
2300
2417
  await syncCanonicalSkillStateForMode({
2301
2418
  cwd,
2419
+ baseStateDir: rootStateDir,
2302
2420
  mode,
2303
2421
  active: false,
2304
2422
  currentPhase: "cancelled",
@@ -2315,7 +2433,7 @@ export async function cleanupPostLaunchModeStateFiles(cwd, sessionId, dependenci
2315
2433
  }
2316
2434
  if (sessionId) {
2317
2435
  try {
2318
- await scrubPostLaunchRootSkillActiveForSession(cwd, sessionId, now().toISOString(), writeFile, rootSkillActiveStateBeforeCleanup);
2436
+ await scrubPostLaunchRootSkillActiveForSession(rootStateDir, sessionId, now().toISOString(), writeFile, rootSkillActiveStateBeforeCleanup);
2319
2437
  }
2320
2438
  catch (err) {
2321
2439
  writeWarn(`[omx] postLaunch: failed to reconcile root skill-active state: ${err instanceof Error ? err.message : err}`);