oh-my-codex 0.18.0 → 0.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +6 -6
- package/Cargo.toml +1 -1
- package/README.md +45 -19
- package/crates/omx-api/src/lib.rs +66 -9
- package/crates/omx-sparkshell/src/exec.rs +125 -3
- package/crates/omx-sparkshell/src/main.rs +126 -36
- package/crates/omx-sparkshell/tests/execution.rs +225 -1
- package/dist/agents/__tests__/definitions.test.js +14 -0
- package/dist/agents/__tests__/definitions.test.js.map +1 -1
- package/dist/agents/__tests__/native-config.test.js +19 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +30 -0
- package/dist/agents/definitions.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 +4 -0
- package/dist/agents/native-config.js.map +1 -1
- package/dist/catalog/__tests__/generator.test.js +4 -0
- package/dist/catalog/__tests__/generator.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +15 -7
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +137 -8
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +203 -15
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/install-docs-contract.test.d.ts +2 -0
- package/dist/cli/__tests__/install-docs-contract.test.d.ts.map +1 -0
- package/dist/cli/__tests__/install-docs-contract.test.js +55 -0
- package/dist/cli/__tests__/install-docs-contract.test.js.map +1 -0
- package/dist/cli/__tests__/launch-fallback.test.js +163 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/question.test.js +29 -43
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +94 -35
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js +20 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-packaging.test.js +1 -0
- package/dist/cli/__tests__/sparkshell-packaging.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +227 -4
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/update.test.js +72 -1
- package/dist/cli/__tests__/update.test.js.map +1 -1
- package/dist/cli/codex-feature-probe.d.ts +5 -0
- package/dist/cli/codex-feature-probe.d.ts.map +1 -1
- package/dist/cli/codex-feature-probe.js +13 -7
- package/dist/cli/codex-feature-probe.js.map +1 -1
- package/dist/cli/doctor.d.ts +7 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +297 -17
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +9 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +465 -110
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +2 -0
- package/dist/cli/plugin-marketplace.d.ts.map +1 -1
- package/dist/cli/plugin-marketplace.js +15 -1
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +71 -11
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/sparkshell.d.ts +7 -1
- package/dist/cli/sparkshell.d.ts.map +1 -1
- package/dist/cli/sparkshell.js +13 -3
- package/dist/cli/sparkshell.js.map +1 -1
- package/dist/cli/ultragoal.d.ts +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +184 -10
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/cli/update.d.ts +2 -0
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +14 -3
- package/dist/cli/update.js.map +1 -1
- package/dist/compat/__tests__/doctor-contract.test.js +3 -0
- package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
- package/dist/config/__tests__/codex-feature-flags.test.js +11 -1
- package/dist/config/__tests__/codex-feature-flags.test.js.map +1 -1
- package/dist/config/__tests__/codex-hooks.test.js +22 -11
- package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
- package/dist/config/__tests__/commit-lore-guard.test.d.ts +2 -0
- package/dist/config/__tests__/commit-lore-guard.test.d.ts.map +1 -0
- package/dist/config/__tests__/commit-lore-guard.test.js +20 -0
- package/dist/config/__tests__/commit-lore-guard.test.js.map +1 -0
- package/dist/config/codex-feature-flags.d.ts +4 -0
- package/dist/config/codex-feature-flags.d.ts.map +1 -1
- package/dist/config/codex-feature-flags.js +4 -0
- package/dist/config/codex-feature-flags.js.map +1 -1
- package/dist/config/codex-hooks.d.ts +1 -0
- package/dist/config/codex-hooks.d.ts.map +1 -1
- package/dist/config/codex-hooks.js +8 -10
- package/dist/config/codex-hooks.js.map +1 -1
- package/dist/config/commit-lore-guard.d.ts +1 -0
- package/dist/config/commit-lore-guard.d.ts.map +1 -1
- package/dist/config/commit-lore-guard.js +29 -3
- package/dist/config/commit-lore-guard.js.map +1 -1
- package/dist/config/generator.d.ts +17 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +124 -11
- package/dist/config/generator.js.map +1 -1
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +21 -0
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.d.ts +4 -0
- package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.js +50 -3
- package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +27 -6
- package/dist/hooks/__tests__/autopilot-skill-contract.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 +13 -11
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js +4 -3
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +173 -17
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +33 -0
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/prometheus-strict-contract.test.js +320 -0
- package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -0
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +12 -0
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
- package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts +2 -0
- package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/research-workflow-boundaries.test.js +35 -0
- package/dist/hooks/__tests__/research-workflow-boundaries.test.js.map +1 -0
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +26 -3
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +29 -14
- package/dist/hooks/extensibility/dispatcher.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 +36 -9
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +1 -0
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
- package/dist/hooks/prompt-guidance-contract.js +14 -2
- package/dist/hooks/prompt-guidance-contract.js.map +1 -1
- package/dist/hud/__tests__/hud-tmux-injection.test.js +36 -8
- package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +122 -11
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/render.test.js +84 -0
- package/dist/hud/__tests__/render.test.js.map +1 -1
- package/dist/hud/__tests__/resource-leak-watch.test.d.ts +2 -0
- package/dist/hud/__tests__/resource-leak-watch.test.d.ts.map +1 -0
- package/dist/hud/__tests__/resource-leak-watch.test.js +28 -0
- package/dist/hud/__tests__/resource-leak-watch.test.js.map +1 -0
- package/dist/hud/__tests__/state.test.js +51 -1
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +69 -23
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/index.d.ts +2 -2
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +17 -6
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +6 -3
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +26 -0
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts +2 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +62 -1
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/tmux.d.ts +10 -3
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +60 -11
- package/dist/hud/tmux.js.map +1 -1
- package/dist/hud/types.d.ts +22 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/dist/notifications/__tests__/http-client-resource.test.d.ts +2 -0
- package/dist/notifications/__tests__/http-client-resource.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/http-client-resource.test.js +41 -0
- package/dist/notifications/__tests__/http-client-resource.test.js.map +1 -0
- package/dist/notifications/__tests__/verbosity.test.js +20 -0
- package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
- package/dist/notifications/config.d.ts.map +1 -1
- package/dist/notifications/config.js +6 -3
- package/dist/notifications/config.js.map +1 -1
- package/dist/notifications/http-client.d.ts.map +1 -1
- package/dist/notifications/http-client.js +78 -27
- package/dist/notifications/http-client.js.map +1 -1
- package/dist/notifications/types.d.ts +2 -0
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/openclaw/__tests__/dispatcher.test.js +49 -1
- package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
- package/dist/openclaw/dispatcher.d.ts +7 -4
- package/dist/openclaw/dispatcher.d.ts.map +1 -1
- package/dist/openclaw/dispatcher.js +32 -69
- package/dist/openclaw/dispatcher.js.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.js +128 -4
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +460 -9
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/index.d.ts +8 -2
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +5 -2
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts +5 -4
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +85 -17
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/pipeline/stages/code-review.d.ts +2 -2
- package/dist/pipeline/stages/code-review.d.ts.map +1 -1
- package/dist/pipeline/stages/code-review.js +5 -3
- package/dist/pipeline/stages/code-review.js.map +1 -1
- package/dist/pipeline/stages/deep-interview.d.ts +15 -0
- package/dist/pipeline/stages/deep-interview.d.ts.map +1 -0
- package/dist/pipeline/stages/deep-interview.js +32 -0
- package/dist/pipeline/stages/deep-interview.js.map +1 -0
- package/dist/pipeline/stages/ralph-verify.d.ts +5 -5
- package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -1
- package/dist/pipeline/stages/ralph-verify.js +2 -2
- package/dist/pipeline/stages/ralph-verify.js.map +1 -1
- package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
- package/dist/pipeline/stages/ralplan.js +41 -6
- package/dist/pipeline/stages/ralplan.js.map +1 -1
- package/dist/pipeline/stages/ultragoal.d.ts +19 -0
- package/dist/pipeline/stages/ultragoal.d.ts.map +1 -0
- package/dist/pipeline/stages/ultragoal.js +38 -0
- package/dist/pipeline/stages/ultragoal.js.map +1 -0
- package/dist/pipeline/stages/ultraqa.d.ts +30 -0
- package/dist/pipeline/stages/ultraqa.d.ts.map +1 -0
- package/dist/pipeline/stages/ultraqa.js +46 -0
- package/dist/pipeline/stages/ultraqa.js.map +1 -0
- package/dist/pipeline/types.d.ts +8 -6
- package/dist/pipeline/types.d.ts.map +1 -1
- package/dist/pipeline/types.js +2 -2
- package/dist/question/__tests__/ui.test.js +43 -10
- package/dist/question/__tests__/ui.test.js.map +1 -1
- package/dist/question/ui.d.ts +12 -0
- package/dist/question/ui.d.ts.map +1 -1
- package/dist/question/ui.js +83 -46
- package/dist/question/ui.js.map +1 -1
- package/dist/ralplan/__tests__/runtime.test.js +200 -10
- package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
- package/dist/ralplan/consensus-gate.d.ts +23 -0
- package/dist/ralplan/consensus-gate.d.ts.map +1 -0
- package/dist/ralplan/consensus-gate.js +212 -0
- package/dist/ralplan/consensus-gate.js.map +1 -0
- package/dist/ralplan/runtime.d.ts +25 -0
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +144 -8
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +1358 -79
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/docs-site-contract.test.d.ts +2 -0
- package/dist/scripts/__tests__/docs-site-contract.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/docs-site-contract.test.js +42 -0
- package/dist/scripts/__tests__/docs-site-contract.test.js.map +1 -0
- package/dist/scripts/__tests__/notify-dispatcher.test.js +115 -2
- package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
- package/dist/scripts/__tests__/run-test-files.test.js +57 -0
- package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
- package/dist/scripts/__tests__/smoke-packed-install.test.js +23 -1
- package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
- package/dist/scripts/__tests__/verify-native-agents.test.js +18 -3
- package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
- package/dist/scripts/cleanup-explore-harness.js +1 -0
- package/dist/scripts/cleanup-explore-harness.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +372 -44
- 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 +9 -1
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/notify-dispatcher.js +188 -4
- package/dist/scripts/notify-dispatcher.js.map +1 -1
- package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
- package/dist/scripts/notify-hook/process-runner.js +39 -17
- 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 +9 -5
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +7 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
- package/dist/scripts/run-test-files.js +13 -0
- package/dist/scripts/run-test-files.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +3 -0
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +99 -1
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js +2 -2
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/scripts/verify-native-agents.js +2 -2
- package/dist/scripts/verify-native-agents.js.map +1 -1
- package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts +2 -0
- package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts.map +1 -0
- package/dist/sidecar/__tests__/resource-leak-watch.test.js +38 -0
- package/dist/sidecar/__tests__/resource-leak-watch.test.js.map +1 -0
- package/dist/sidecar/index.d.ts +1 -1
- package/dist/sidecar/index.d.ts.map +1 -1
- package/dist/sidecar/index.js +29 -12
- package/dist/sidecar/index.js.map +1 -1
- package/dist/state/__tests__/operations-ralph-phase.test.js +88 -1
- package/dist/state/__tests__/operations-ralph-phase.test.js.map +1 -1
- package/dist/state/__tests__/workflow-transition.test.js +6 -0
- package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +11 -0
- package/dist/state/operations.js.map +1 -1
- package/dist/state/workflow-transition.d.ts +1 -1
- package/dist/state/workflow-transition.d.ts.map +1 -1
- package/dist/state/workflow-transition.js +7 -0
- package/dist/state/workflow-transition.js.map +1 -1
- package/dist/subagents/tracker.d.ts.map +1 -1
- package/dist/subagents/tracker.js +4 -3
- package/dist/subagents/tracker.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +36 -44
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +163 -15
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +10 -20
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +51 -21
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +764 -10
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js +57 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/dist/ultragoal/__tests__/steering-fixtures.d.ts +68 -0
- package/dist/ultragoal/__tests__/steering-fixtures.d.ts.map +1 -0
- package/dist/ultragoal/__tests__/steering-fixtures.js +259 -0
- package/dist/ultragoal/__tests__/steering-fixtures.js.map +1 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts +2 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts.map +1 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.js +65 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.js.map +1 -0
- package/dist/ultragoal/artifacts.d.ts +97 -2
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +837 -256
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/utils/__tests__/sleep-resource.test.d.ts +2 -0
- package/dist/utils/__tests__/sleep-resource.test.d.ts.map +1 -0
- package/dist/utils/__tests__/sleep-resource.test.js +39 -0
- package/dist/utils/__tests__/sleep-resource.test.js.map +1 -0
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js +17 -6
- package/dist/utils/sleep.js.map +1 -1
- package/package.json +2 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +4 -3
- package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +56 -0
- package/plugins/oh-my-codex/hooks/hooks.json +77 -0
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +92 -50
- package/plugins/oh-my-codex/skills/autoresearch/SKILL.md +4 -0
- package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/cancel/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +8 -8
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/pipeline/SKILL.md +23 -12
- package/plugins/oh-my-codex/skills/plan/SKILL.md +8 -8
- package/plugins/oh-my-codex/skills/prometheus-strict/README.md +35 -0
- package/plugins/oh-my-codex/skills/prometheus-strict/SKILL.md +219 -0
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +7 -0
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +22 -7
- package/plugins/oh-my-codex/skills/team/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +38 -4
- package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +1 -1
- package/prompts/planner.md +1 -1
- package/prompts/prometheus-strict-metis.md +274 -0
- package/prompts/prometheus-strict-momus.md +82 -0
- package/prompts/prometheus-strict-oracle.md +107 -0
- package/prompts/researcher.md +22 -3
- package/skills/autopilot/SKILL.md +92 -50
- package/skills/autoresearch/SKILL.md +4 -0
- package/skills/autoresearch-goal/SKILL.md +1 -1
- package/skills/best-practice-research/SKILL.md +1 -1
- package/skills/cancel/SKILL.md +2 -2
- package/skills/deep-interview/SKILL.md +8 -8
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/pipeline/SKILL.md +23 -12
- package/skills/plan/SKILL.md +8 -8
- package/skills/prometheus-strict/README.md +35 -0
- package/skills/prometheus-strict/SKILL.md +219 -0
- package/skills/ralph/SKILL.md +7 -0
- package/skills/ralplan/SKILL.md +22 -7
- package/skills/team/SKILL.md +1 -1
- package/skills/ultragoal/SKILL.md +38 -4
- package/skills/ultrawork/SKILL.md +1 -1
- package/src/scripts/__tests__/codex-native-hook.test.ts +1757 -210
- package/src/scripts/__tests__/docs-site-contract.test.ts +47 -0
- package/src/scripts/__tests__/notify-dispatcher.test.ts +132 -3
- package/src/scripts/__tests__/run-test-files.test.ts +67 -0
- package/src/scripts/__tests__/smoke-packed-install.test.ts +31 -0
- package/src/scripts/__tests__/verify-native-agents.test.ts +23 -3
- package/src/scripts/cleanup-explore-harness.ts +1 -0
- package/src/scripts/codex-native-hook.ts +393 -40
- package/src/scripts/codex-native-pre-post.ts +16 -1
- package/src/scripts/notify-dispatcher.ts +202 -4
- package/src/scripts/notify-hook/process-runner.ts +40 -16
- package/src/scripts/notify-hook/team-dispatch.ts +9 -5
- package/src/scripts/notify-hook/team-tmux-guard.ts +7 -0
- package/src/scripts/run-test-files.ts +13 -0
- package/src/scripts/smoke-packed-install.ts +105 -0
- package/src/scripts/sync-plugin-mirror.ts +3 -3
- package/src/scripts/verify-native-agents.ts +2 -2
- package/templates/catalog-manifest.json +22 -0
|
@@ -194,6 +194,11 @@ describe('keyword detector team compatibility', () => {
|
|
|
194
194
|
assert.equal(detectPrimaryKeyword('cleanup stale deep-interview state after session clear'), null);
|
|
195
195
|
assert.equal(detectPrimaryKeyword('remove the stale deep interview lock from .omx/state'), null);
|
|
196
196
|
});
|
|
197
|
+
it('does not trigger deep-interview from casual discussion mentions', () => {
|
|
198
|
+
assert.equal(detectPrimaryKeyword('the deep interview report is useful context for the next plan'), null);
|
|
199
|
+
assert.equal(detectPrimaryKeyword('we already did a deep interview and should not reactivate it'), null);
|
|
200
|
+
assert.equal(detectPrimaryKeyword('this interview transcript says implementation is ready'), null);
|
|
201
|
+
});
|
|
197
202
|
it('maps "gather requirements" to deep-interview skill', () => {
|
|
198
203
|
const match = detectPrimaryKeyword('let us gather requirements first');
|
|
199
204
|
assert.ok(match);
|
|
@@ -285,6 +290,13 @@ describe('explicit skill-name invocation requirement', () => {
|
|
|
285
290
|
it('does not trigger ralplan from bare skill-name usage', () => {
|
|
286
291
|
assert.equal(detectPrimaryKeyword('please do ralplan first'), null);
|
|
287
292
|
});
|
|
293
|
+
it('detects explicit prometheus-strict invocation only', () => {
|
|
294
|
+
const match = detectPrimaryKeyword('please run $prometheus-strict before implementation');
|
|
295
|
+
assert.ok(match);
|
|
296
|
+
assert.equal(match.skill, 'prometheus-strict');
|
|
297
|
+
assert.equal(match.keyword.toLowerCase(), '$prometheus-strict');
|
|
298
|
+
assert.equal(detectPrimaryKeyword('please use prometheus-strict planning here'), null);
|
|
299
|
+
});
|
|
288
300
|
});
|
|
289
301
|
describe('keyword registry coverage', () => {
|
|
290
302
|
it('includes key team aliases in runtime keyword registry', () => {
|
|
@@ -304,6 +316,7 @@ describe('keyword registry coverage', () => {
|
|
|
304
316
|
assert.ok(registryKeywords.has('wiki lint'));
|
|
305
317
|
assert.ok(registryKeywords.has('$autoresearch'));
|
|
306
318
|
assert.ok(registryKeywords.has('$ultragoal'));
|
|
319
|
+
assert.ok(registryKeywords.has('$prometheus-strict'));
|
|
307
320
|
assert.ok(registryKeywords.has('ultragoal'));
|
|
308
321
|
});
|
|
309
322
|
});
|
|
@@ -398,7 +411,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
|
|
|
398
411
|
await rm(root, { recursive: true, force: true });
|
|
399
412
|
}
|
|
400
413
|
});
|
|
401
|
-
it('writes skill-active-state.json with
|
|
414
|
+
it('writes skill-active-state.json with deep-interview phase when autopilot keyword activates', async () => {
|
|
402
415
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-'));
|
|
403
416
|
const stateDir = join(cwd, '.omx', 'state');
|
|
404
417
|
try {
|
|
@@ -413,11 +426,11 @@ describe('keyword detector skill-active-state lifecycle', () => {
|
|
|
413
426
|
});
|
|
414
427
|
assert.ok(result);
|
|
415
428
|
assert.equal(result.skill, 'autopilot');
|
|
416
|
-
assert.equal(result.phase, '
|
|
429
|
+
assert.equal(result.phase, 'deep-interview');
|
|
417
430
|
assert.equal(result.active, true);
|
|
418
431
|
assert.deepEqual(result.active_skills, [{
|
|
419
432
|
skill: 'autopilot',
|
|
420
|
-
phase: '
|
|
433
|
+
phase: 'deep-interview',
|
|
421
434
|
active: true,
|
|
422
435
|
activated_at: '2026-02-25T00:00:00.000Z',
|
|
423
436
|
updated_at: '2026-02-25T00:00:00.000Z',
|
|
@@ -434,13 +447,34 @@ describe('keyword detector skill-active-state lifecycle', () => {
|
|
|
434
447
|
const modeState = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-1', 'autopilot-state.json'), 'utf-8'));
|
|
435
448
|
assert.equal(modeState.mode, 'autopilot');
|
|
436
449
|
assert.equal(modeState.active, true);
|
|
437
|
-
assert.equal(modeState.current_phase, '
|
|
450
|
+
assert.equal(modeState.current_phase, 'deep-interview');
|
|
438
451
|
assert.equal(modeState.iteration, 1);
|
|
439
452
|
assert.equal(modeState.review_cycle, 0);
|
|
440
453
|
assert.equal(modeState.max_iterations, 10);
|
|
441
|
-
assert.deepEqual(modeState.state.phase_cycle, ['ralplan', '
|
|
442
|
-
assert.deepEqual(modeState.state.
|
|
454
|
+
assert.deepEqual(modeState.state.phase_cycle, ['deep-interview', 'ralplan', 'ultragoal', 'code-review', 'ultraqa']);
|
|
455
|
+
assert.deepEqual(modeState.state.deep_interview_gate, {
|
|
456
|
+
status: 'required',
|
|
457
|
+
skip_reason: null,
|
|
458
|
+
rationale: 'Autopilot starts at the deep-interview gate by default; clear bounded tasks may skip only with an explicit persisted skip reason.',
|
|
459
|
+
});
|
|
460
|
+
assert.deepEqual(modeState.state.handoff_artifacts, {
|
|
461
|
+
deep_interview: null,
|
|
462
|
+
ralplan: null,
|
|
463
|
+
ralplan_consensus_gate: {
|
|
464
|
+
required: true,
|
|
465
|
+
sequence: ['architect-review', 'critic-review'],
|
|
466
|
+
planning_artifacts_are_not_consensus: true,
|
|
467
|
+
required_review_roles: ['architect', 'critic'],
|
|
468
|
+
ralplan_architect_review: null,
|
|
469
|
+
ralplan_critic_review: null,
|
|
470
|
+
complete: false,
|
|
471
|
+
},
|
|
472
|
+
ultragoal: null,
|
|
473
|
+
code_review: null,
|
|
474
|
+
ultraqa: null,
|
|
475
|
+
});
|
|
443
476
|
assert.equal(modeState.state.review_verdict, null);
|
|
477
|
+
assert.equal(modeState.state.qa_verdict, null);
|
|
444
478
|
assert.equal(modeState.state.return_to_ralplan_reason, null);
|
|
445
479
|
}
|
|
446
480
|
finally {
|
|
@@ -791,18 +825,56 @@ describe('keyword detector skill-active-state lifecycle', () => {
|
|
|
791
825
|
}, null, 2));
|
|
792
826
|
const result = await recordSkillActivation({
|
|
793
827
|
stateDir,
|
|
794
|
-
text: '$
|
|
828
|
+
text: '$ultragoal turn the clarified spec into goals',
|
|
795
829
|
sessionId: 'sess-handoff',
|
|
796
830
|
nowIso: '2026-04-10T00:00:00.000Z',
|
|
797
831
|
});
|
|
798
832
|
assert.equal(result?.transition_error, undefined);
|
|
799
|
-
assert.equal(result?.
|
|
833
|
+
assert.equal(result?.skill, 'ultragoal');
|
|
834
|
+
assert.equal(result?.initialized_mode, 'ultragoal');
|
|
835
|
+
assert.equal(result?.initialized_state_path, '.omx/state/sessions/sess-handoff/ultragoal-state.json');
|
|
836
|
+
assert.equal(result?.transition_message, 'mode transiting: deep-interview -> ultragoal');
|
|
800
837
|
const completed = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-handoff', 'deep-interview-state.json'), 'utf-8'));
|
|
801
838
|
assert.equal(completed.active, false);
|
|
802
839
|
assert.equal(completed.current_phase, 'completed');
|
|
803
840
|
assert.equal(completed.question_enforcement?.status, 'cleared');
|
|
804
841
|
assert.equal(completed.question_enforcement?.clear_reason, 'handoff');
|
|
805
842
|
assert.ok(completed.question_enforcement?.cleared_at);
|
|
843
|
+
const ultragoal = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-handoff', 'ultragoal-state.json'), 'utf-8'));
|
|
844
|
+
assert.equal(ultragoal.active, true);
|
|
845
|
+
assert.equal(ultragoal.mode, 'ultragoal');
|
|
846
|
+
assert.equal(ultragoal.current_phase, 'planning');
|
|
847
|
+
}
|
|
848
|
+
finally {
|
|
849
|
+
await rm(cwd, { recursive: true, force: true });
|
|
850
|
+
}
|
|
851
|
+
});
|
|
852
|
+
it('keeps ralplan as an allowlisted deep-interview forward handoff', async () => {
|
|
853
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-ralplan-handoff-'));
|
|
854
|
+
const stateDir = join(cwd, '.omx', 'state');
|
|
855
|
+
try {
|
|
856
|
+
await mkdir(join(stateDir, 'sessions', 'sess-ralplan-handoff'), { recursive: true });
|
|
857
|
+
await writeFile(join(stateDir, 'sessions', 'sess-ralplan-handoff', SKILL_ACTIVE_STATE_FILE), JSON.stringify({
|
|
858
|
+
version: 1,
|
|
859
|
+
active: true,
|
|
860
|
+
skill: 'deep-interview',
|
|
861
|
+
phase: 'planning',
|
|
862
|
+
session_id: 'sess-ralplan-handoff',
|
|
863
|
+
active_skills: [{ skill: 'deep-interview', phase: 'planning', active: true, session_id: 'sess-ralplan-handoff' }],
|
|
864
|
+
}, null, 2));
|
|
865
|
+
await writeFile(join(stateDir, 'sessions', 'sess-ralplan-handoff', 'deep-interview-state.json'), JSON.stringify({ active: true, mode: 'deep-interview', current_phase: 'intent-first' }, null, 2));
|
|
866
|
+
const result = await recordSkillActivation({
|
|
867
|
+
stateDir,
|
|
868
|
+
text: '$ralplan implement the approved contract',
|
|
869
|
+
sessionId: 'sess-ralplan-handoff',
|
|
870
|
+
nowIso: '2026-04-10T00:00:00.000Z',
|
|
871
|
+
});
|
|
872
|
+
assert.equal(result?.transition_error, undefined);
|
|
873
|
+
assert.equal(result?.skill, 'ralplan');
|
|
874
|
+
assert.equal(result?.transition_message, 'mode transiting: deep-interview -> ralplan');
|
|
875
|
+
const completed = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-ralplan-handoff', 'deep-interview-state.json'), 'utf-8'));
|
|
876
|
+
assert.equal(completed.active, false);
|
|
877
|
+
assert.equal(completed.current_phase, 'completed');
|
|
806
878
|
}
|
|
807
879
|
finally {
|
|
808
880
|
await rm(cwd, { recursive: true, force: true });
|
|
@@ -1150,7 +1222,7 @@ describe('keyword detector skill-active-state lifecycle', () => {
|
|
|
1150
1222
|
await rm(cwd, { recursive: true, force: true });
|
|
1151
1223
|
}
|
|
1152
1224
|
});
|
|
1153
|
-
it('records ultragoal as a prompt skill
|
|
1225
|
+
it('records ultragoal as a prompt skill with first-class mode state', async () => {
|
|
1154
1226
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-ultragoal-'));
|
|
1155
1227
|
const stateDir = join(cwd, '.omx', 'state');
|
|
1156
1228
|
try {
|
|
@@ -1162,9 +1234,12 @@ describe('keyword detector skill-active-state lifecycle', () => {
|
|
|
1162
1234
|
assert.ok(result);
|
|
1163
1235
|
assert.equal(result.skill, 'ultragoal');
|
|
1164
1236
|
assert.equal(result.keyword, '$ultragoal');
|
|
1165
|
-
assert.equal(result.initialized_mode,
|
|
1166
|
-
assert.equal(result.initialized_state_path,
|
|
1167
|
-
|
|
1237
|
+
assert.equal(result.initialized_mode, 'ultragoal');
|
|
1238
|
+
assert.equal(result.initialized_state_path, '.omx/state/ultragoal-state.json');
|
|
1239
|
+
const modeState = JSON.parse(await readFile(join(stateDir, 'ultragoal-state.json'), 'utf-8'));
|
|
1240
|
+
assert.equal(modeState.active, true);
|
|
1241
|
+
assert.equal(modeState.mode, 'ultragoal');
|
|
1242
|
+
assert.equal(modeState.current_phase, 'planning');
|
|
1168
1243
|
}
|
|
1169
1244
|
finally {
|
|
1170
1245
|
await rm(cwd, { recursive: true, force: true });
|
|
@@ -1695,7 +1770,7 @@ describe('isUnderspecifiedForExecution', () => {
|
|
|
1695
1770
|
});
|
|
1696
1771
|
});
|
|
1697
1772
|
describe('applyRalplanGate', () => {
|
|
1698
|
-
it('
|
|
1773
|
+
it('gates short team follow-up when only PRD/test-spec artifacts exist', async () => {
|
|
1699
1774
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-'));
|
|
1700
1775
|
try {
|
|
1701
1776
|
const plansDir = join(cwd, '.omx', 'plans');
|
|
@@ -1703,20 +1778,32 @@ describe('applyRalplanGate', () => {
|
|
|
1703
1778
|
await writeFile(join(plansDir, 'prd-issue-831.md'), '# Approved plan\n\nLaunch hint: omx team 3:executor "Execute approved issue 831 plan"\n');
|
|
1704
1779
|
await writeFile(join(plansDir, 'test-spec-issue-831.md'), '# Test spec\n');
|
|
1705
1780
|
const result = applyRalplanGate(['team'], 'team', { cwd });
|
|
1706
|
-
assert.equal(result.gateApplied,
|
|
1707
|
-
assert.deepEqual(result.keywords, ['
|
|
1781
|
+
assert.equal(result.gateApplied, true);
|
|
1782
|
+
assert.deepEqual(result.keywords, ['ralplan']);
|
|
1708
1783
|
}
|
|
1709
1784
|
finally {
|
|
1710
1785
|
await rm(cwd, { recursive: true, force: true });
|
|
1711
1786
|
}
|
|
1712
1787
|
});
|
|
1713
|
-
it('does not re-enter ralplan for a short approved
|
|
1788
|
+
it('does not re-enter ralplan for a short approved team follow-up with durable consensus', async () => {
|
|
1714
1789
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-ko-'));
|
|
1715
1790
|
try {
|
|
1716
1791
|
const plansDir = join(cwd, '.omx', 'plans');
|
|
1792
|
+
const stateDir = join(cwd, '.omx', 'state');
|
|
1717
1793
|
await mkdir(plansDir, { recursive: true });
|
|
1794
|
+
await mkdir(stateDir, { recursive: true });
|
|
1718
1795
|
await writeFile(join(plansDir, 'prd-issue-831.md'), '# Approved plan\n\nLaunch hint: omx team 3:executor "Execute approved issue 831 plan"\n');
|
|
1719
1796
|
await writeFile(join(plansDir, 'test-spec-issue-831.md'), '# Test spec\n');
|
|
1797
|
+
await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
|
|
1798
|
+
current_phase: 'complete',
|
|
1799
|
+
planning_complete: true,
|
|
1800
|
+
ralplan_consensus_gate: {
|
|
1801
|
+
complete: true,
|
|
1802
|
+
sequence: ['architect-review', 'critic-review'],
|
|
1803
|
+
ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
|
|
1804
|
+
ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
|
|
1805
|
+
},
|
|
1806
|
+
}));
|
|
1720
1807
|
const result = applyRalplanGate(['team'], 'team으로 해줘', { cwd });
|
|
1721
1808
|
assert.equal(result.gateApplied, false);
|
|
1722
1809
|
assert.deepEqual(result.keywords, ['team']);
|
|
@@ -1725,13 +1812,25 @@ describe('applyRalplanGate', () => {
|
|
|
1725
1812
|
await rm(cwd, { recursive: true, force: true });
|
|
1726
1813
|
}
|
|
1727
1814
|
});
|
|
1728
|
-
it('does not re-enter ralplan for a short approved ralph follow-up', async () => {
|
|
1815
|
+
it('does not re-enter ralplan for a short approved ralph follow-up with durable consensus', async () => {
|
|
1729
1816
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-followup-ralph-'));
|
|
1730
1817
|
try {
|
|
1731
1818
|
const plansDir = join(cwd, '.omx', 'plans');
|
|
1819
|
+
const stateDir = join(cwd, '.omx', 'state');
|
|
1732
1820
|
await mkdir(plansDir, { recursive: true });
|
|
1821
|
+
await mkdir(stateDir, { recursive: true });
|
|
1733
1822
|
await writeFile(join(plansDir, 'prd-issue-832.md'), '# Approved plan\n\nLaunch hint: omx ralph "Execute approved issue 832 plan"\n');
|
|
1734
1823
|
await writeFile(join(plansDir, 'test-spec-issue-832.md'), '# Test spec\n');
|
|
1824
|
+
await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
|
|
1825
|
+
current_phase: 'complete',
|
|
1826
|
+
planning_complete: true,
|
|
1827
|
+
ralplan_consensus_gate: {
|
|
1828
|
+
complete: true,
|
|
1829
|
+
sequence: ['architect-review', 'critic-review'],
|
|
1830
|
+
ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
|
|
1831
|
+
ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
|
|
1832
|
+
},
|
|
1833
|
+
}));
|
|
1735
1834
|
const result = applyRalplanGate(['ralph'], 'ralph please', { cwd, priorSkill: 'ralplan' });
|
|
1736
1835
|
assert.equal(result.gateApplied, false);
|
|
1737
1836
|
assert.deepEqual(result.keywords, ['ralph']);
|
|
@@ -1740,6 +1839,63 @@ describe('applyRalplanGate', () => {
|
|
|
1740
1839
|
await rm(cwd, { recursive: true, force: true });
|
|
1741
1840
|
}
|
|
1742
1841
|
});
|
|
1842
|
+
it('ignores ambient OMX_ROOT consensus state for local PRD/test-spec-only follow-up gating', async () => {
|
|
1843
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-local-'));
|
|
1844
|
+
const ambientRoot = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-ambient-'));
|
|
1845
|
+
const previousOmxRoot = process.env.OMX_ROOT;
|
|
1846
|
+
try {
|
|
1847
|
+
const plansDir = join(cwd, '.omx', 'plans');
|
|
1848
|
+
await mkdir(plansDir, { recursive: true });
|
|
1849
|
+
await writeFile(join(plansDir, 'prd-local.md'), '# Plan\n');
|
|
1850
|
+
await writeFile(join(plansDir, 'test-spec-local.md'), '# Test spec\n');
|
|
1851
|
+
const ambientStateDir = join(ambientRoot, '.omx', 'state');
|
|
1852
|
+
await mkdir(ambientStateDir, { recursive: true });
|
|
1853
|
+
await writeFile(join(ambientStateDir, 'ralplan-state.json'), JSON.stringify({
|
|
1854
|
+
current_phase: 'complete',
|
|
1855
|
+
planning_complete: true,
|
|
1856
|
+
ralplan_consensus_gate: {
|
|
1857
|
+
complete: true,
|
|
1858
|
+
ralplan_architect_review: { agent_role: 'architect', verdict: 'approve', iteration: 1 },
|
|
1859
|
+
ralplan_critic_review: { agent_role: 'critic', verdict: 'approve', iteration: 1 },
|
|
1860
|
+
},
|
|
1861
|
+
}));
|
|
1862
|
+
process.env.OMX_ROOT = ambientRoot;
|
|
1863
|
+
const result = applyRalplanGate(['team'], 'team', { cwd });
|
|
1864
|
+
assert.equal(result.gateApplied, true);
|
|
1865
|
+
assert.deepEqual(result.keywords, ['ralplan']);
|
|
1866
|
+
}
|
|
1867
|
+
finally {
|
|
1868
|
+
if (previousOmxRoot === undefined)
|
|
1869
|
+
delete process.env.OMX_ROOT;
|
|
1870
|
+
else
|
|
1871
|
+
process.env.OMX_ROOT = previousOmxRoot;
|
|
1872
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1873
|
+
await rm(ambientRoot, { recursive: true, force: true });
|
|
1874
|
+
}
|
|
1875
|
+
});
|
|
1876
|
+
it('gates short follow-up when local state only has latest verdict fields', async () => {
|
|
1877
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-gate-latest-only-'));
|
|
1878
|
+
try {
|
|
1879
|
+
const plansDir = join(cwd, '.omx', 'plans');
|
|
1880
|
+
const stateDir = join(cwd, '.omx', 'state');
|
|
1881
|
+
await mkdir(plansDir, { recursive: true });
|
|
1882
|
+
await mkdir(stateDir, { recursive: true });
|
|
1883
|
+
await writeFile(join(plansDir, 'prd-local.md'), '# Plan\n\nLaunch hint: omx team 3:executor "Execute approved local plan"\n');
|
|
1884
|
+
await writeFile(join(plansDir, 'test-spec-local.md'), '# Test spec\n');
|
|
1885
|
+
await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify({
|
|
1886
|
+
current_phase: 'complete',
|
|
1887
|
+
planning_complete: true,
|
|
1888
|
+
latest_architect_verdict: 'approve',
|
|
1889
|
+
latest_critic_verdict: 'approve',
|
|
1890
|
+
}));
|
|
1891
|
+
const result = applyRalplanGate(['team'], 'team', { cwd });
|
|
1892
|
+
assert.equal(result.gateApplied, true);
|
|
1893
|
+
assert.deepEqual(result.keywords, ['ralplan']);
|
|
1894
|
+
}
|
|
1895
|
+
finally {
|
|
1896
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1897
|
+
}
|
|
1898
|
+
});
|
|
1743
1899
|
it('redirects underspecified execution keywords to ralplan', () => {
|
|
1744
1900
|
const result = applyRalplanGate(['ralph'], 'ralph fix this');
|
|
1745
1901
|
assert.equal(result.gateApplied, true);
|