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.
- package/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/README.md +36 -5
- package/crates/omx-explore/src/main.rs +222 -12
- package/dist/agents/__tests__/native-config.test.js +40 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/native-config.d.ts +1 -0
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js +6 -1
- package/dist/agents/native-config.js.map +1 -1
- package/dist/agents/policy.d.ts +1 -0
- package/dist/agents/policy.d.ts.map +1 -1
- package/dist/agents/policy.js +4 -0
- package/dist/agents/policy.js.map +1 -1
- package/dist/cli/__tests__/autoresearch-guided.test.js +37 -13
- package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-team.test.js +46 -1
- package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +225 -111
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/exec.test.js +96 -1
- package/dist/cli/__tests__/exec.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +15 -2
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +292 -3
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +223 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-parity.test.js +86 -0
- package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +23 -0
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/question.test.js +76 -11
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +140 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +310 -4
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-prompts-overwrite.test.js +78 -19
- package/dist/cli/__tests__/setup-prompts-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +79 -2
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/sidecar.test.d.ts +2 -0
- package/dist/cli/__tests__/sidecar.test.d.ts.map +1 -0
- package/dist/cli/__tests__/sidecar.test.js +24 -0
- package/dist/cli/__tests__/sidecar.test.js.map +1 -0
- package/dist/cli/__tests__/team.test.js +54 -7
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/autoresearch-guided.d.ts.map +1 -1
- package/dist/cli/autoresearch-guided.js +12 -4
- package/dist/cli/autoresearch-guided.js.map +1 -1
- package/dist/cli/codex-home.d.ts +4 -6
- package/dist/cli/codex-home.d.ts.map +1 -1
- package/dist/cli/codex-home.js +9 -41
- package/dist/cli/codex-home.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +509 -279
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +6 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +284 -25
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/omx.js +3 -1
- package/dist/cli/omx.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +13 -0
- package/dist/cli/plugin-marketplace.d.ts.map +1 -0
- package/dist/cli/plugin-marketplace.js +77 -0
- package/dist/cli/plugin-marketplace.js.map +1 -0
- package/dist/cli/question.d.ts +1 -1
- package/dist/cli/question.d.ts.map +1 -1
- package/dist/cli/question.js +26 -12
- package/dist/cli/question.js.map +1 -1
- package/dist/cli/setup-preferences.d.ts +20 -0
- package/dist/cli/setup-preferences.d.ts.map +1 -0
- package/dist/cli/setup-preferences.js +71 -0
- package/dist/cli/setup-preferences.js.map +1 -0
- package/dist/cli/setup.d.ts +7 -5
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +271 -152
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts +1 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +70 -15
- package/dist/cli/team.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +100 -3
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +6 -5
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/__tests__/generator-status-line-presets.test.d.ts +2 -0
- package/dist/config/__tests__/generator-status-line-presets.test.d.ts.map +1 -0
- package/dist/config/__tests__/generator-status-line-presets.test.js +203 -0
- package/dist/config/__tests__/generator-status-line-presets.test.js.map +1 -0
- package/dist/config/__tests__/models.test.js +23 -1
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/generator.d.ts +9 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +184 -16
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +5 -1
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +12 -2
- package/dist/config/models.js.map +1 -1
- package/dist/exec/followup.d.ts +44 -0
- package/dist/exec/followup.d.ts.map +1 -0
- package/dist/exec/followup.js +349 -0
- package/dist/exec/followup.js.map +1 -0
- package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +37 -0
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -0
- package/dist/hooks/__tests__/codebase-map.test.js +63 -1
- package/dist/hooks/__tests__/codebase-map.test.js.map +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js +5 -5
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js +12 -9
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +25 -18
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +23 -2
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +45 -2
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +17 -0
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +121 -0
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js +4 -4
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +103 -0
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +2 -2
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +27 -13
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts +2 -0
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +35 -0
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -0
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +215 -0
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +70 -3
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/pre-context-gate-skills.test.js +5 -0
- package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-fragments.test.js +3 -2
- package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +9 -0
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/prompt-refactor-contract.test.js +22 -0
- package/dist/hooks/__tests__/prompt-refactor-contract.test.js.map +1 -0
- package/dist/hooks/codebase-map.d.ts.map +1 -1
- package/dist/hooks/codebase-map.js +83 -6
- package/dist/hooks/codebase-map.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +35 -4
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/prompt-guidance-contract.d.ts +6 -0
- package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
- package/dist/hooks/prompt-guidance-contract.js +117 -13
- package/dist/hooks/prompt-guidance-contract.js.map +1 -1
- package/dist/hooks/session.d.ts +2 -0
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +6 -0
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +4 -4
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +4 -0
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/types.test.js +27 -0
- package/dist/hud/__tests__/types.test.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +8 -0
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/types.d.ts +9 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +3 -0
- package/dist/hud/types.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.js +23 -5
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +50 -7
- package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +70 -12
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/bootstrap.d.ts +10 -1
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +71 -26
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/state-server.d.ts +5 -11
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +16 -432
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/modes/__tests__/base-autoresearch-contract.test.js +1 -1
- package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.js +89 -5
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +98 -1
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/index.d.ts +5 -3
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +4 -3
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts +7 -6
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +90 -11
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/pipeline/review-verdict.d.ts +3 -0
- package/dist/pipeline/review-verdict.d.ts.map +1 -0
- package/dist/pipeline/review-verdict.js +14 -0
- package/dist/pipeline/review-verdict.js.map +1 -0
- package/dist/pipeline/stages/code-review.d.ts +33 -0
- package/dist/pipeline/stages/code-review.d.ts.map +1 -0
- package/dist/pipeline/stages/code-review.js +51 -0
- package/dist/pipeline/stages/code-review.js.map +1 -0
- package/dist/pipeline/stages/ralph-verify.d.ts +12 -2
- package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -1
- package/dist/pipeline/stages/ralph-verify.js +24 -6
- package/dist/pipeline/stages/ralph-verify.js.map +1 -1
- package/dist/pipeline/stages/ralplan.d.ts +1 -1
- package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
- package/dist/pipeline/stages/ralplan.js +21 -1
- package/dist/pipeline/stages/ralplan.js.map +1 -1
- package/dist/pipeline/types.d.ts +14 -7
- package/dist/pipeline/types.d.ts.map +1 -1
- package/dist/pipeline/types.js +2 -2
- package/dist/planning/__tests__/artifacts.test.js +152 -1
- package/dist/planning/__tests__/artifacts.test.js.map +1 -1
- package/dist/planning/artifacts.d.ts +9 -0
- package/dist/planning/artifacts.d.ts.map +1 -1
- package/dist/planning/artifacts.js +60 -1
- package/dist/planning/artifacts.js.map +1 -1
- package/dist/question/__tests__/client.test.js +23 -3
- package/dist/question/__tests__/client.test.js.map +1 -1
- package/dist/question/__tests__/renderer.test.js +148 -37
- package/dist/question/__tests__/renderer.test.js.map +1 -1
- package/dist/question/__tests__/types.test.js +21 -0
- package/dist/question/__tests__/types.test.js.map +1 -1
- package/dist/question/__tests__/ui.test.js +155 -7
- package/dist/question/__tests__/ui.test.js.map +1 -1
- package/dist/question/client.d.ts +14 -4
- package/dist/question/client.d.ts.map +1 -1
- package/dist/question/client.js.map +1 -1
- package/dist/question/renderer.d.ts +11 -1
- package/dist/question/renderer.d.ts.map +1 -1
- package/dist/question/renderer.js +102 -7
- package/dist/question/renderer.js.map +1 -1
- package/dist/question/state.d.ts +2 -2
- package/dist/question/state.d.ts.map +1 -1
- package/dist/question/state.js +26 -17
- package/dist/question/state.js.map +1 -1
- package/dist/question/types.d.ts +25 -1
- package/dist/question/types.d.ts.map +1 -1
- package/dist/question/types.js +48 -13
- package/dist/question/types.js.map +1 -1
- package/dist/question/ui.d.ts +15 -2
- package/dist/question/ui.d.ts.map +1 -1
- package/dist/question/ui.js +268 -162
- package/dist/question/ui.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +415 -94
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/generate-release-body.test.js +36 -0
- package/dist/scripts/__tests__/generate-release-body.test.js.map +1 -1
- package/dist/scripts/__tests__/prompt-inventory.test.d.ts +2 -0
- package/dist/scripts/__tests__/prompt-inventory.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/prompt-inventory.test.js +56 -0
- package/dist/scripts/__tests__/prompt-inventory.test.js.map +1 -0
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +232 -54
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +12 -9
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/generate-release-body.d.ts.map +1 -1
- package/dist/scripts/generate-release-body.js +12 -3
- package/dist/scripts/generate-release-body.js.map +1 -1
- package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts +2 -0
- package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts.map +1 -0
- package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js +153 -0
- package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js.map +1 -0
- package/dist/scripts/notify-hook/managed-tmux.d.ts +4 -2
- package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.js +188 -6
- package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
- package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
- package/dist/scripts/notify-hook/process-runner.js +7 -3
- package/dist/scripts/notify-hook/process-runner.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +96 -11
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +3 -3
- package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts +34 -0
- package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts.map +1 -0
- package/dist/scripts/notify-hook/team-worker-posttooluse.js +434 -0
- package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -0
- package/dist/scripts/notify-hook/team-worker.d.ts +1 -1
- package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker.js +3 -43
- package/dist/scripts/notify-hook/team-worker.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +25 -4
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/notify-hook.js +36 -5
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/prompt-inventory.d.ts +29 -0
- package/dist/scripts/prompt-inventory.d.ts.map +1 -0
- package/dist/scripts/prompt-inventory.js +178 -0
- package/dist/scripts/prompt-inventory.js.map +1 -0
- package/dist/scripts/run-test-files.js +1 -0
- package/dist/scripts/run-test-files.js.map +1 -1
- package/dist/sidecar/__tests__/boundary.test.d.ts +2 -0
- package/dist/sidecar/__tests__/boundary.test.d.ts.map +1 -0
- package/dist/sidecar/__tests__/boundary.test.js +48 -0
- package/dist/sidecar/__tests__/boundary.test.js.map +1 -0
- package/dist/sidecar/__tests__/collector.test.d.ts +2 -0
- package/dist/sidecar/__tests__/collector.test.d.ts.map +1 -0
- package/dist/sidecar/__tests__/collector.test.js +162 -0
- package/dist/sidecar/__tests__/collector.test.js.map +1 -0
- package/dist/sidecar/__tests__/render.test.d.ts +2 -0
- package/dist/sidecar/__tests__/render.test.d.ts.map +1 -0
- package/dist/sidecar/__tests__/render.test.js +67 -0
- package/dist/sidecar/__tests__/render.test.js.map +1 -0
- package/dist/sidecar/__tests__/tmux.test.d.ts +2 -0
- package/dist/sidecar/__tests__/tmux.test.d.ts.map +1 -0
- package/dist/sidecar/__tests__/tmux.test.js +30 -0
- package/dist/sidecar/__tests__/tmux.test.js.map +1 -0
- package/dist/sidecar/__tests__/watch.test.d.ts +2 -0
- package/dist/sidecar/__tests__/watch.test.d.ts.map +1 -0
- package/dist/sidecar/__tests__/watch.test.js +42 -0
- package/dist/sidecar/__tests__/watch.test.js.map +1 -0
- package/dist/sidecar/collector.d.ts +4 -0
- package/dist/sidecar/collector.d.ts.map +1 -0
- package/dist/sidecar/collector.js +377 -0
- package/dist/sidecar/collector.js.map +1 -0
- package/dist/sidecar/index.d.ts +25 -0
- package/dist/sidecar/index.d.ts.map +1 -0
- package/dist/sidecar/index.js +165 -0
- package/dist/sidecar/index.js.map +1 -0
- package/dist/sidecar/render.d.ts +3 -0
- package/dist/sidecar/render.d.ts.map +1 -0
- package/dist/sidecar/render.js +72 -0
- package/dist/sidecar/render.js.map +1 -0
- package/dist/sidecar/tmux.d.ts +13 -0
- package/dist/sidecar/tmux.d.ts.map +1 -0
- package/dist/sidecar/tmux.js +44 -0
- package/dist/sidecar/tmux.js.map +1 -0
- package/dist/sidecar/types.d.ts +125 -0
- package/dist/sidecar/types.d.ts.map +1 -0
- package/dist/sidecar/types.js +2 -0
- package/dist/sidecar/types.js.map +1 -0
- package/dist/state/__tests__/operations.test.js +50 -22
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/workflow-transition.test.js +9 -1
- package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
- package/dist/state/operations.d.ts +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +19 -7
- package/dist/state/operations.js.map +1 -1
- package/dist/state/workflow-transition.d.ts.map +1 -1
- package/dist/state/workflow-transition.js +1 -0
- package/dist/state/workflow-transition.js.map +1 -1
- package/dist/team/__tests__/commit-hygiene.test.d.ts +2 -0
- package/dist/team/__tests__/commit-hygiene.test.d.ts.map +1 -0
- package/dist/team/__tests__/commit-hygiene.test.js +93 -0
- package/dist/team/__tests__/commit-hygiene.test.js.map +1 -0
- package/dist/team/__tests__/delegation-policy.test.d.ts +2 -0
- package/dist/team/__tests__/delegation-policy.test.d.ts.map +1 -0
- package/dist/team/__tests__/delegation-policy.test.js +69 -0
- package/dist/team/__tests__/delegation-policy.test.js.map +1 -0
- package/dist/team/__tests__/events.test.js +54 -4
- package/dist/team/__tests__/events.test.js.map +1 -1
- package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts +2 -0
- package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts.map +1 -0
- package/dist/team/__tests__/hook-primary-e2e-contract.test.js +78 -0
- package/dist/team/__tests__/hook-primary-e2e-contract.test.js.map +1 -0
- package/dist/team/__tests__/model-contract.test.js +16 -0
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/repo-aware-decomposition.test.d.ts +2 -0
- package/dist/team/__tests__/repo-aware-decomposition.test.d.ts.map +1 -0
- package/dist/team/__tests__/repo-aware-decomposition.test.js +95 -0
- package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -0
- package/dist/team/__tests__/runtime.test.js +623 -14
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.js +177 -1
- package/dist/team/__tests__/state-root.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +110 -0
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +399 -2
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +94 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/commit-hygiene.d.ts +22 -3
- package/dist/team/commit-hygiene.d.ts.map +1 -1
- package/dist/team/commit-hygiene.js +134 -2
- package/dist/team/commit-hygiene.js.map +1 -1
- package/dist/team/contracts.d.ts +1 -1
- package/dist/team/contracts.d.ts.map +1 -1
- package/dist/team/contracts.js +2 -0
- package/dist/team/contracts.js.map +1 -1
- package/dist/team/dag-schema.d.ts +38 -0
- package/dist/team/dag-schema.d.ts.map +1 -0
- package/dist/team/dag-schema.js +221 -0
- package/dist/team/dag-schema.js.map +1 -0
- package/dist/team/delegation-policy.d.ts +3 -0
- package/dist/team/delegation-policy.d.ts.map +1 -0
- package/dist/team/delegation-policy.js +82 -0
- package/dist/team/delegation-policy.js.map +1 -0
- package/dist/team/model-contract.d.ts +3 -1
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +44 -5
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/repo-aware-decomposition.d.ts +60 -0
- package/dist/team/repo-aware-decomposition.d.ts.map +1 -0
- package/dist/team/repo-aware-decomposition.js +229 -0
- package/dist/team/repo-aware-decomposition.js.map +1 -0
- package/dist/team/runtime.d.ts +27 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +172 -52
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/state/tasks.d.ts.map +1 -1
- package/dist/team/state/tasks.js +33 -0
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/state/types.d.ts +23 -1
- package/dist/team/state/types.d.ts.map +1 -1
- package/dist/team/state/types.js.map +1 -1
- package/dist/team/state-root.d.ts +35 -0
- package/dist/team/state-root.d.ts.map +1 -1
- package/dist/team/state-root.js +281 -1
- package/dist/team/state-root.js.map +1 -1
- package/dist/team/state.d.ts +27 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +6 -0
- package/dist/team/state.js.map +1 -1
- package/dist/team/tmux-session.d.ts +1 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +105 -6
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +3 -0
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +77 -4
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/utils/agents-md.d.ts +3 -0
- package/dist/utils/agents-md.d.ts.map +1 -1
- package/dist/utils/agents-md.js +25 -0
- package/dist/utils/agents-md.js.map +1 -1
- package/package.json +3 -2
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +2 -2
- package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/analyze/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +134 -205
- package/plugins/oh-my-codex/skills/code-review/SKILL.md +4 -4
- package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +14 -7
- package/plugins/oh-my-codex/skills/doctor/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/help/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +41 -10
- package/plugins/oh-my-codex/skills/plan/SKILL.md +12 -14
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +2 -4
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +5 -9
- package/plugins/oh-my-codex/skills/security-review/SKILL.md +4 -4
- package/plugins/oh-my-codex/skills/team/SKILL.md +2 -5
- package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +2 -5
- package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +2 -3
- package/prompts/analyst.md +2 -2
- package/prompts/api-reviewer.md +2 -2
- package/prompts/architect.md +2 -2
- package/prompts/build-fixer.md +2 -2
- package/prompts/code-reviewer.md +15 -5
- package/prompts/code-simplifier.md +1 -1
- package/prompts/critic.md +35 -83
- package/prompts/debugger.md +2 -2
- package/prompts/dependency-expert.md +2 -2
- package/prompts/designer.md +2 -2
- package/prompts/executor.md +40 -114
- package/prompts/explore-harness.md +1 -1
- package/prompts/explore.md +37 -90
- package/prompts/git-master.md +2 -2
- package/prompts/information-architect.md +1 -1
- package/prompts/performance-reviewer.md +2 -2
- package/prompts/planner.md +35 -62
- package/prompts/product-analyst.md +2 -2
- package/prompts/product-manager.md +2 -2
- package/prompts/qa-tester.md +2 -2
- package/prompts/quality-reviewer.md +2 -2
- package/prompts/quality-strategist.md +2 -2
- package/prompts/researcher.md +46 -78
- package/prompts/security-reviewer.md +2 -2
- package/prompts/sisyphus-lite.md +2 -2
- package/prompts/style-reviewer.md +2 -2
- package/prompts/team-executor.md +1 -1
- package/prompts/test-engineer.md +2 -2
- package/prompts/ux-researcher.md +2 -2
- package/prompts/verifier.md +29 -34
- package/prompts/vision.md +2 -2
- package/prompts/writer.md +2 -2
- package/skills/ai-slop-cleaner/SKILL.md +1 -1
- package/skills/analyze/SKILL.md +1 -1
- package/skills/autopilot/SKILL.md +134 -205
- package/skills/build-fix/SKILL.md +4 -4
- package/skills/code-review/SKILL.md +4 -4
- package/skills/deep-interview/SKILL.md +14 -7
- package/skills/doctor/SKILL.md +1 -1
- package/skills/help/SKILL.md +1 -1
- package/skills/omx-setup/SKILL.md +41 -10
- package/skills/plan/SKILL.md +12 -14
- package/skills/ralph/SKILL.md +2 -4
- package/skills/ralplan/SKILL.md +5 -9
- package/skills/security-review/SKILL.md +4 -4
- package/skills/team/SKILL.md +2 -5
- package/skills/ultraqa/SKILL.md +2 -5
- package/skills/ultrawork/SKILL.md +2 -3
- package/src/scripts/__tests__/codex-native-hook.test.ts +502 -94
- package/src/scripts/__tests__/generate-release-body.test.ts +41 -0
- package/src/scripts/__tests__/prompt-inventory.test.ts +64 -0
- package/src/scripts/codex-native-hook.ts +293 -61
- package/src/scripts/codex-native-pre-post.ts +10 -8
- package/src/scripts/generate-release-body.ts +13 -2
- package/src/scripts/notify-hook/__tests__/team-worker-posttooluse.test.ts +180 -0
- package/src/scripts/notify-hook/managed-tmux.ts +196 -9
- package/src/scripts/notify-hook/process-runner.ts +7 -3
- package/src/scripts/notify-hook/team-dispatch.ts +103 -11
- package/src/scripts/notify-hook/team-tmux-guard.ts +3 -3
- package/src/scripts/notify-hook/team-worker-posttooluse.ts +536 -0
- package/src/scripts/notify-hook/team-worker.ts +4 -48
- package/src/scripts/notify-hook/tmux-injection.ts +24 -6
- package/src/scripts/notify-hook.ts +36 -5
- package/src/scripts/prompt-inventory.ts +218 -0
- package/src/scripts/run-test-files.ts +1 -0
- 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
|
-
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
|
331
|
-
console.log(
|
|
332
|
-
const answer = (await rl.question(
|
|
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 (
|
|
499
|
-
|
|
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 &&
|
|
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 =
|
|
570
|
-
?
|
|
571
|
-
:
|
|
572
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
938
|
-
|
|
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
|
-
|
|
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" : "
|
|
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" : "
|
|
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 (
|
|
1258
|
-
|
|
1259
|
-
|
|
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(
|
|
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 (
|
|
1589
|
+
if (manifest && !isSetupPromptAssetName(promptName, manifest)) {
|
|
1530
1590
|
summary.skipped += 1;
|
|
1531
1591
|
if (options.verbose) {
|
|
1532
|
-
const label = status ?? "
|
|
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 (
|
|
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
|
|
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) {
|