oh-my-codex 0.15.2 → 0.16.0
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 +10 -7
- package/Cargo.toml +1 -1
- package/README.md +3 -0
- package/crates/omx-explore/Cargo.toml +3 -0
- package/crates/omx-explore/src/main.rs +517 -16
- package/dist/agents/__tests__/native-config.test.js +33 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/autoresearch/goal.d.ts +90 -0
- package/dist/autoresearch/goal.d.ts.map +1 -0
- package/dist/autoresearch/goal.js +237 -0
- package/dist/autoresearch/goal.js.map +1 -0
- package/dist/autoresearch/skill-validation.d.ts +1 -0
- package/dist/autoresearch/skill-validation.d.ts.map +1 -1
- package/dist/autoresearch/skill-validation.js +10 -3
- package/dist/autoresearch/skill-validation.js.map +1 -1
- package/dist/catalog/__tests__/generator.test.js +9 -4
- package/dist/catalog/__tests__/generator.test.js.map +1 -1
- package/dist/catalog/__tests__/plugin-bundle-ssot.test.js +29 -2
- package/dist/catalog/__tests__/plugin-bundle-ssot.test.js.map +1 -1
- package/dist/catalog/__tests__/schema.test.js +14 -3
- package/dist/catalog/__tests__/schema.test.js.map +1 -1
- package/dist/catalog/schema.js +1 -1
- package/dist/catalog/schema.js.map +1 -1
- package/dist/cli/__tests__/autoresearch-goal.test.d.ts +2 -0
- package/dist/cli/__tests__/autoresearch-goal.test.d.ts.map +1 -0
- package/dist/cli/__tests__/autoresearch-goal.test.js +194 -0
- package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -0
- package/dist/cli/__tests__/cleanup.test.js +82 -1
- package/dist/cli/__tests__/cleanup.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +7 -4
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts +2 -0
- package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts.map +1 -0
- package/dist/cli/__tests__/doctor-context-window-warning.test.js +122 -0
- package/dist/cli/__tests__/doctor-context-window-warning.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js +25 -2
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/exec.test.js +1 -0
- package/dist/cli/__tests__/exec.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +48 -18
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +222 -10
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +58 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-serve.test.js +27 -1
- package/dist/cli/__tests__/mcp-serve.test.js.map +1 -1
- package/dist/cli/__tests__/native-assets.test.js +26 -1
- package/dist/cli/__tests__/native-assets.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +2 -2
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/performance-goal.test.d.ts +2 -0
- package/dist/cli/__tests__/performance-goal.test.d.ts.map +1 -0
- package/dist/cli/__tests__/performance-goal.test.js +144 -0
- package/dist/cli/__tests__/performance-goal.test.js.map +1 -0
- package/dist/cli/__tests__/question.test.js +8 -0
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.d.ts +2 -0
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +31 -0
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -0
- package/dist/cli/__tests__/ralph-prd-deep-interview.test.js +5 -4
- package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-prd-smoke.test.js +7 -0
- package/dist/cli/__tests__/ralph-prd-smoke.test.js.map +1 -1
- package/dist/cli/__tests__/ralph.test.js +59 -1
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +57 -21
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +27 -8
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.js +20 -10
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/setup-skill-validation.test.js +11 -11
- package/dist/cli/__tests__/setup-skill-validation.test.js.map +1 -1
- package/dist/cli/__tests__/setup-skills-overwrite.test.js +12 -12
- package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +242 -10
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.d.ts +2 -0
- package/dist/cli/__tests__/ultragoal.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ultragoal.test.js +106 -0
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -0
- package/dist/cli/__tests__/uninstall.test.js +11 -0
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/autoresearch-goal.d.ts +3 -0
- package/dist/cli/autoresearch-goal.d.ts.map +1 -0
- package/dist/cli/autoresearch-goal.js +175 -0
- package/dist/cli/autoresearch-goal.js.map +1 -0
- package/dist/cli/cleanup.d.ts +3 -1
- package/dist/cli/cleanup.d.ts.map +1 -1
- package/dist/cli/cleanup.js +42 -2
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +95 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +10 -2
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +21 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +268 -30
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-serve.d.ts +1 -0
- package/dist/cli/mcp-serve.d.ts.map +1 -1
- package/dist/cli/mcp-serve.js +8 -0
- package/dist/cli/mcp-serve.js.map +1 -1
- package/dist/cli/native-assets.js +1 -1
- package/dist/cli/native-assets.js.map +1 -1
- package/dist/cli/performance-goal.d.ts +3 -0
- package/dist/cli/performance-goal.d.ts.map +1 -0
- package/dist/cli/performance-goal.js +186 -0
- package/dist/cli/performance-goal.js.map +1 -0
- package/dist/cli/ralph.d.ts +2 -0
- package/dist/cli/ralph.d.ts.map +1 -1
- package/dist/cli/ralph.js +25 -1
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +13 -6
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts +6 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +113 -33
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/tmux-hook.d.ts.map +1 -1
- package/dist/cli/tmux-hook.js +2 -1
- package/dist/cli/tmux-hook.js.map +1 -1
- package/dist/cli/ultragoal.d.ts +3 -0
- package/dist/cli/ultragoal.d.ts.map +1 -0
- package/dist/cli/ultragoal.js +191 -0
- package/dist/cli/ultragoal.js.map +1 -0
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +4 -2
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +39 -6
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +5 -0
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/commit-lore-guard.d.ts +3 -0
- package/dist/config/commit-lore-guard.d.ts.map +1 -0
- package/dist/config/commit-lore-guard.js +9 -0
- package/dist/config/commit-lore-guard.js.map +1 -0
- package/dist/config/generator.d.ts +14 -4
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +166 -66
- package/dist/config/generator.js.map +1 -1
- package/dist/config/omx-first-party-mcp.d.ts +1 -0
- package/dist/config/omx-first-party-mcp.d.ts.map +1 -1
- package/dist/config/omx-first-party-mcp.js +4 -1
- package/dist/config/omx-first-party-mcp.js.map +1 -1
- package/dist/goal-workflows/__tests__/artifacts.test.d.ts +2 -0
- package/dist/goal-workflows/__tests__/artifacts.test.d.ts.map +1 -0
- package/dist/goal-workflows/__tests__/artifacts.test.js +96 -0
- package/dist/goal-workflows/__tests__/artifacts.test.js.map +1 -0
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.d.ts +2 -0
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.d.ts.map +1 -0
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +54 -0
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -0
- package/dist/goal-workflows/artifacts.d.ts +62 -0
- package/dist/goal-workflows/artifacts.d.ts.map +1 -0
- package/dist/goal-workflows/artifacts.js +132 -0
- package/dist/goal-workflows/artifacts.js.map +1 -0
- package/dist/goal-workflows/codex-goal-snapshot.d.ts +28 -0
- package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -0
- package/dist/goal-workflows/codex-goal-snapshot.js +110 -0
- package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -0
- package/dist/goal-workflows/handoff.d.ts +10 -0
- package/dist/goal-workflows/handoff.d.ts.map +1 -0
- package/dist/goal-workflows/handoff.js +31 -0
- package/dist/goal-workflows/handoff.js.map +1 -0
- package/dist/goal-workflows/validation.d.ts +13 -0
- package/dist/goal-workflows/validation.d.ts.map +1 -0
- package/dist/goal-workflows/validation.js +36 -0
- package/dist/goal-workflows/validation.js.map +1 -0
- package/dist/hooks/__tests__/agents-overlay.test.js +59 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/anti-slop-workflow.test.js +109 -18
- package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +45 -32
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +3 -3
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +2 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +17 -24
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +3 -3
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
- package/dist/hooks/__tests__/task-size-detector.test.js +1 -1
- package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/visual-ralph-skill.test.js +3 -3
- package/dist/hooks/__tests__/visual-ralph-skill.test.js.map +1 -1
- package/dist/hooks/__tests__/visual-verdict-loop.test.js +7 -11
- package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -1
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +23 -2
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +12 -13
- 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 +2 -10
- 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 +0 -4
- package/dist/hooks/prompt-guidance-contract.js.map +1 -1
- package/dist/hooks/session.js +2 -2
- package/dist/hooks/session.js.map +1 -1
- package/dist/hooks/task-size-detector.d.ts.map +1 -1
- package/dist/hooks/task-size-detector.js +1 -0
- package/dist/hooks/task-size-detector.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +30 -14
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +29 -7
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/reconcile.d.ts +2 -1
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +12 -0
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.js +15 -2
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/state-paths.test.js +54 -0
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +36 -0
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/bootstrap.d.ts +1 -1
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +9 -7
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/state-paths.d.ts +17 -0
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +36 -2
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/modes/__tests__/base-session-scope.test.js +26 -0
- package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
- package/dist/modes/base.d.ts +1 -0
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +35 -5
- package/dist/modes/base.js.map +1 -1
- package/dist/notifications/__tests__/http-client.test.d.ts +2 -0
- package/dist/notifications/__tests__/http-client.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/http-client.test.js +90 -0
- package/dist/notifications/__tests__/http-client.test.js.map +1 -0
- package/dist/notifications/__tests__/notifier.test.js +22 -60
- package/dist/notifications/__tests__/notifier.test.js.map +1 -1
- package/dist/notifications/dispatcher.d.ts.map +1 -1
- package/dist/notifications/dispatcher.js +35 -60
- package/dist/notifications/dispatcher.js.map +1 -1
- package/dist/notifications/http-client.d.ts +22 -0
- package/dist/notifications/http-client.d.ts.map +1 -0
- package/dist/notifications/http-client.js +298 -0
- package/dist/notifications/http-client.js.map +1 -0
- package/dist/notifications/notifier.d.ts +3 -2
- package/dist/notifications/notifier.d.ts.map +1 -1
- package/dist/notifications/notifier.js +17 -22
- package/dist/notifications/notifier.js.map +1 -1
- package/dist/openclaw/__tests__/dispatcher.test.js +63 -2
- package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
- package/dist/openclaw/dispatcher.d.ts.map +1 -1
- package/dist/openclaw/dispatcher.js +3 -2
- package/dist/openclaw/dispatcher.js.map +1 -1
- package/dist/performance-goal/artifacts.d.ts +76 -0
- package/dist/performance-goal/artifacts.d.ts.map +1 -0
- package/dist/performance-goal/artifacts.js +221 -0
- package/dist/performance-goal/artifacts.js.map +1 -0
- package/dist/pipeline/__tests__/stages.test.js +423 -14
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/stages/team-exec.d.ts +8 -4
- package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
- package/dist/pipeline/stages/team-exec.js +181 -13
- package/dist/pipeline/stages/team-exec.js.map +1 -1
- package/dist/planning/__tests__/artifacts.test.js +261 -1
- package/dist/planning/__tests__/artifacts.test.js.map +1 -1
- package/dist/planning/artifact-names.d.ts +13 -0
- package/dist/planning/artifact-names.d.ts.map +1 -0
- package/dist/planning/artifact-names.js +108 -0
- package/dist/planning/artifact-names.js.map +1 -0
- package/dist/planning/artifacts.d.ts +23 -1
- package/dist/planning/artifacts.d.ts.map +1 -1
- package/dist/planning/artifacts.js +171 -59
- package/dist/planning/artifacts.js.map +1 -1
- package/dist/ralph/__tests__/persistence.test.js +21 -1
- package/dist/ralph/__tests__/persistence.test.js.map +1 -1
- package/dist/ralph/persistence.d.ts.map +1 -1
- package/dist/ralph/persistence.js +6 -4
- package/dist/ralph/persistence.js.map +1 -1
- package/dist/ralplan/__tests__/runtime.test.js +2 -0
- package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +6 -0
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +1749 -88
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/hook-derived-watcher.test.js +33 -1
- package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -1
- package/dist/scripts/__tests__/run-test-files.test.js +36 -0
- package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +570 -45
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts +7 -0
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +341 -15
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/hook-derived-watcher.js +2 -1
- package/dist/scripts/hook-derived-watcher.js.map +1 -1
- package/dist/scripts/notify-fallback-watcher.js +2 -1
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/scripts/notify-hook/orchestration-intent.d.ts +1 -2
- package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -1
- package/dist/scripts/notify-hook/orchestration-intent.js +2 -3
- package/dist/scripts/notify-hook/orchestration-intent.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts +0 -2
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +8 -60
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-posttooluse.js +1 -1
- package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.d.ts +15 -0
- package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -0
- package/dist/scripts/notify-hook/team-worker-stop.js +224 -0
- package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -0
- package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker.js +26 -18
- package/dist/scripts/notify-hook/team-worker.js.map +1 -1
- package/dist/scripts/notify-hook.js +1 -1
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/run-test-files.js +17 -1
- package/dist/scripts/run-test-files.js.map +1 -1
- package/dist/scripts/sync-plugin-mirror.d.ts +1 -0
- package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js +10 -4
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +26 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +76 -0
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/operations.d.ts +3 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +8 -4
- package/dist/state/operations.js.map +1 -1
- package/dist/state/skill-active.d.ts +1 -0
- package/dist/state/skill-active.d.ts.map +1 -1
- package/dist/state/skill-active.js +54 -13
- package/dist/state/skill-active.js.map +1 -1
- package/dist/team/__tests__/api-interop.test.js +279 -0
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/approved-execution.test.d.ts +2 -0
- package/dist/team/__tests__/approved-execution.test.d.ts.map +1 -0
- package/dist/team/__tests__/approved-execution.test.js +124 -0
- package/dist/team/__tests__/approved-execution.test.js.map +1 -0
- package/dist/team/__tests__/delivery-e2e-smoke.test.js +2 -4
- package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
- package/dist/team/__tests__/delivery-log.test.d.ts +2 -0
- package/dist/team/__tests__/delivery-log.test.d.ts.map +1 -0
- package/dist/team/__tests__/delivery-log.test.js +44 -0
- package/dist/team/__tests__/delivery-log.test.js.map +1 -0
- package/dist/team/__tests__/model-contract.test.js +40 -9
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/repo-aware-decomposition.test.js +41 -0
- package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -1
- package/dist/team/__tests__/role-router.test.js +4 -4
- package/dist/team/__tests__/role-router.test.js.map +1 -1
- package/dist/team/__tests__/runtime-boxed-state.test.d.ts +2 -0
- package/dist/team/__tests__/runtime-boxed-state.test.d.ts.map +1 -0
- package/dist/team/__tests__/runtime-boxed-state.test.js +39 -0
- package/dist/team/__tests__/runtime-boxed-state.test.js.map +1 -0
- package/dist/team/__tests__/runtime-cli.test.js +24 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +563 -72
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.js +13 -0
- package/dist/team/__tests__/state-root.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +13 -0
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/team-identity.test.d.ts +2 -0
- package/dist/team/__tests__/team-identity.test.d.ts.map +1 -0
- package/dist/team/__tests__/team-identity.test.js +166 -0
- package/dist/team/__tests__/team-identity.test.js.map +1 -0
- package/dist/team/__tests__/tmux-session.test.js +58 -1
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +62 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/api-interop.d.ts +1 -0
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +163 -132
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/approved-execution.d.ts +37 -0
- package/dist/team/approved-execution.d.ts.map +1 -0
- package/dist/team/approved-execution.js +136 -0
- package/dist/team/approved-execution.js.map +1 -0
- package/dist/team/delivery-log.d.ts +1 -1
- package/dist/team/delivery-log.d.ts.map +1 -1
- package/dist/team/delivery-log.js +2 -1
- package/dist/team/delivery-log.js.map +1 -1
- package/dist/team/followup-planner.js +2 -2
- package/dist/team/followup-planner.js.map +1 -1
- package/dist/team/goal-workflow.d.ts +20 -0
- package/dist/team/goal-workflow.d.ts.map +1 -0
- package/dist/team/goal-workflow.js +57 -0
- package/dist/team/goal-workflow.js.map +1 -0
- package/dist/team/orchestrator.js +2 -2
- package/dist/team/orchestrator.js.map +1 -1
- package/dist/team/repo-aware-decomposition.d.ts +3 -0
- package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
- package/dist/team/repo-aware-decomposition.js +2 -0
- package/dist/team/repo-aware-decomposition.js.map +1 -1
- package/dist/team/role-router.js +5 -5
- package/dist/team/role-router.js.map +1 -1
- package/dist/team/runtime-cli.d.ts +32 -2
- package/dist/team/runtime-cli.d.ts.map +1 -1
- package/dist/team/runtime-cli.js +78 -26
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime.d.ts +7 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +383 -40
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +2 -0
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state.d.ts +9 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +21 -0
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-identity.d.ts +26 -0
- package/dist/team/team-identity.d.ts.map +1 -0
- package/dist/team/team-identity.js +169 -0
- package/dist/team/team-identity.js.map +1 -0
- package/dist/team/tmux-session.d.ts +18 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +65 -3
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +4 -0
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +28 -2
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.d.ts +2 -0
- package/dist/ultragoal/__tests__/artifacts.test.d.ts.map +1 -0
- package/dist/ultragoal/__tests__/artifacts.test.js +93 -0
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -0
- package/dist/ultragoal/artifacts.d.ts +89 -0
- package/dist/ultragoal/artifacts.d.ts.map +1 -0
- package/dist/ultragoal/artifacts.js +233 -0
- package/dist/ultragoal/artifacts.js.map +1 -0
- package/dist/utils/__tests__/agents-model-table.test.js +3 -1
- package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
- package/dist/utils/__tests__/paths.test.js +31 -1
- package/dist/utils/__tests__/paths.test.js.map +1 -1
- package/dist/utils/agents-model-table.d.ts.map +1 -1
- package/dist/utils/agents-model-table.js +12 -1
- package/dist/utils/agents-model-table.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +23 -7
- package/dist/utils/paths.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +30 -19
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/package.json +5 -5
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +30 -5
- package/plugins/oh-my-codex/skills/ask/SKILL.md +58 -0
- package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +36 -0
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/performance-goal/SKILL.md +65 -0
- package/plugins/oh-my-codex/skills/plan/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +22 -3
- package/plugins/oh-my-codex/skills/team/SKILL.md +6 -2
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +49 -0
- package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +9 -9
- package/prompts/api-reviewer.md +1 -1
- package/prompts/code-reviewer.md +2 -0
- package/prompts/performance-reviewer.md +1 -1
- package/prompts/quality-reviewer.md +1 -1
- package/prompts/quality-strategist.md +2 -2
- package/prompts/style-reviewer.md +1 -1
- package/prompts/test-engineer.md +1 -1
- package/skills/ai-slop-cleaner/SKILL.md +30 -5
- package/skills/ask/SKILL.md +58 -0
- package/skills/ask-claude/SKILL.md +3 -54
- package/skills/ask-gemini/SKILL.md +3 -54
- package/skills/autoresearch-goal/SKILL.md +36 -0
- package/skills/build-fix/SKILL.md +4 -139
- package/skills/deepsearch/SKILL.md +4 -32
- package/skills/ecomode/SKILL.md +4 -108
- package/skills/help/SKILL.md +4 -196
- package/skills/note/SKILL.md +4 -56
- package/skills/omx-setup/SKILL.md +2 -2
- package/skills/performance-goal/SKILL.md +65 -0
- package/skills/plan/SKILL.md +1 -1
- package/skills/ralph/SKILL.md +22 -3
- package/skills/ralph-init/SKILL.md +4 -40
- package/skills/review/SKILL.md +4 -32
- package/skills/security-review/SKILL.md +4 -294
- package/skills/swarm/SKILL.md +4 -19
- package/skills/tdd/SKILL.md +4 -100
- package/skills/team/SKILL.md +6 -2
- package/skills/trace/SKILL.md +4 -27
- package/skills/ultragoal/SKILL.md +49 -0
- package/skills/visual-ralph/SKILL.md +9 -9
- package/skills/visual-verdict/SKILL.md +4 -70
- package/skills/web-clone/SKILL.md +4 -18
- package/src/scripts/__tests__/codex-native-hook.test.ts +2923 -1030
- package/src/scripts/__tests__/hook-derived-watcher.test.ts +45 -1
- package/src/scripts/__tests__/run-test-files.test.ts +46 -0
- package/src/scripts/codex-native-hook.ts +696 -46
- package/src/scripts/codex-native-pre-post.ts +369 -16
- package/src/scripts/hook-derived-watcher.ts +2 -1
- package/src/scripts/notify-fallback-watcher.ts +2 -1
- package/src/scripts/notify-hook/orchestration-intent.ts +1 -3
- package/src/scripts/notify-hook/team-leader-nudge.ts +7 -63
- package/src/scripts/notify-hook/team-worker-posttooluse.ts +1 -1
- package/src/scripts/notify-hook/team-worker-stop.ts +246 -0
- package/src/scripts/notify-hook/team-worker.ts +23 -14
- package/src/scripts/notify-hook.ts +1 -1
- package/src/scripts/run-test-files.ts +20 -1
- package/src/scripts/sync-plugin-mirror.ts +13 -4
- package/templates/catalog-manifest.json +45 -27
- package/plugins/oh-my-codex/skills/ask-claude/SKILL.md +0 -61
- package/plugins/oh-my-codex/skills/ask-gemini/SKILL.md +0 -61
- package/plugins/oh-my-codex/skills/help/SKILL.md +0 -202
- package/plugins/oh-my-codex/skills/note/SKILL.md +0 -62
- package/plugins/oh-my-codex/skills/security-review/SKILL.md +0 -300
- package/plugins/oh-my-codex/skills/trace/SKILL.md +0 -33
- package/plugins/oh-my-codex/skills/visual-verdict/SKILL.md +0 -76
|
@@ -9,12 +9,20 @@ import { tmpdir } from 'node:os';
|
|
|
9
9
|
import { fileURLToPath } from 'node:url';
|
|
10
10
|
import { buildLeaderMonitoringHints, parseTeamStartArgs, teamCommand } from '../team.js';
|
|
11
11
|
import { readModeState } from '../../modes/base.js';
|
|
12
|
+
import { readApprovedExecutionLaunchHint } from '../../planning/artifacts.js';
|
|
12
13
|
import { DEFAULT_MAX_WORKERS } from '../../team/state.js';
|
|
14
|
+
import { sameFilePath } from '../../utils/paths.js';
|
|
13
15
|
import { appendTeamEvent, createTask, initTeamState, readTeamConfig, saveTeamConfig, updateWorkerHeartbeat, writeMonitorSnapshot, writeTaskApproval, writeWorkerStatus, } from '../../team/state.js';
|
|
16
|
+
import { buildApprovedTeamExecutionBinding, writePersistedApprovedTeamExecutionBinding, } from '../../team/approved-execution.js';
|
|
14
17
|
import { isRealTmuxAvailable, withTempTmuxSession } from '../../team/__tests__/tmux-test-fixture.js';
|
|
15
18
|
const OMX_CLI_PATH = fileURLToPath(new URL('../omx.js', import.meta.url));
|
|
16
19
|
const ORIGINAL_OMX_TEAM_WORKER = process.env.OMX_TEAM_WORKER;
|
|
17
20
|
const ORIGINAL_OMX_TEAM_STATE_ROOT = process.env.OMX_TEAM_STATE_ROOT;
|
|
21
|
+
function encodeApprovedExecutionTask(task, quote) {
|
|
22
|
+
return quote === 'single'
|
|
23
|
+
? `'${task.replace(/'/g, "\\'")}'`
|
|
24
|
+
: `"${task.replace(/"/g, '\\"')}"`;
|
|
25
|
+
}
|
|
18
26
|
beforeEach(() => {
|
|
19
27
|
delete process.env.OMX_TEAM_WORKER;
|
|
20
28
|
delete process.env.OMX_TEAM_STATE_ROOT;
|
|
@@ -210,6 +218,205 @@ describe('parseTeamStartArgs', () => {
|
|
|
210
218
|
await rm(wd, { recursive: true, force: true });
|
|
211
219
|
}
|
|
212
220
|
});
|
|
221
|
+
it('prefers the persisted approved binding over a newer latest approved hint for a short follow-up', async () => {
|
|
222
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-'));
|
|
223
|
+
const previousCwd = process.cwd();
|
|
224
|
+
try {
|
|
225
|
+
process.chdir(wd);
|
|
226
|
+
const plansDir = join(wd, '.omx', 'plans');
|
|
227
|
+
await mkdir(plansDir, { recursive: true });
|
|
228
|
+
const boundPrdPath = join(plansDir, 'prd-20260501T010203Z-issue-831.md');
|
|
229
|
+
await writeFile(boundPrdPath, '# Approved plan\n\nLaunch via omx team 2:executor "Execute approved issue 831 plan"\n');
|
|
230
|
+
await writeFile(join(plansDir, 'test-spec-20260501T010203Z-issue-831.md'), '# Test spec\n');
|
|
231
|
+
await writeFile(join(plansDir, 'prd-20260502T010203Z-issue-999.md'), '# Approved plan\n\nLaunch via omx team 5:debugger "Execute newer approved issue 999 plan"\n');
|
|
232
|
+
await writeFile(join(plansDir, 'test-spec-20260502T010203Z-issue-999.md'), '# Test spec\n');
|
|
233
|
+
await mkdir(join(wd, '.omx', 'state'), { recursive: true });
|
|
234
|
+
await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({ active: true, team_name: 'bound-team' }, null, 2));
|
|
235
|
+
await writePersistedApprovedTeamExecutionBinding('bound-team', wd, {
|
|
236
|
+
prd_path: boundPrdPath,
|
|
237
|
+
task: 'Execute approved issue 831 plan',
|
|
238
|
+
command: 'omx team 2:executor "Execute approved issue 831 plan"',
|
|
239
|
+
});
|
|
240
|
+
const result = parseTeamStartArgs(['team']);
|
|
241
|
+
assert.equal(result.parsed.task, 'Execute approved issue 831 plan');
|
|
242
|
+
assert.equal(result.parsed.workerCount, 2);
|
|
243
|
+
assert.equal(result.parsed.agentType, 'executor');
|
|
244
|
+
assert.equal(result.parsed.approvedExecution?.task, 'Execute approved issue 831 plan');
|
|
245
|
+
assert.equal(result.parsed.approvedExecution?.command, 'omx team 2:executor "Execute approved issue 831 plan"');
|
|
246
|
+
assert.equal(sameFilePath(result.parsed.approvedExecution?.prd_path ?? '', boundPrdPath), true);
|
|
247
|
+
}
|
|
248
|
+
finally {
|
|
249
|
+
process.chdir(previousCwd);
|
|
250
|
+
await rm(wd, { recursive: true, force: true });
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
it('round-trips single-quoted approved follow-ups from launch hint encoding through persisted binding', async () => {
|
|
254
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-quoted-'));
|
|
255
|
+
const previousCwd = process.cwd();
|
|
256
|
+
try {
|
|
257
|
+
process.chdir(wd);
|
|
258
|
+
const plansDir = join(wd, '.omx', 'plans');
|
|
259
|
+
await mkdir(plansDir, { recursive: true });
|
|
260
|
+
const boundTask = "Fix Bob's regression in C:\\\\tmp";
|
|
261
|
+
const boundCommand = `omx team 2:executor ${encodeApprovedExecutionTask(boundTask, 'single')}`;
|
|
262
|
+
const boundPrdPath = join(plansDir, 'prd-issue-831-quoted.md');
|
|
263
|
+
await writeFile(boundPrdPath, `# Approved plan\n\nLaunch via ${boundCommand}\n`);
|
|
264
|
+
await writeFile(join(plansDir, 'test-spec-issue-831-quoted.md'), '# Test spec\n');
|
|
265
|
+
await mkdir(join(wd, '.omx', 'state'), { recursive: true });
|
|
266
|
+
await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({ active: true, team_name: 'bound-team-quoted' }, null, 2));
|
|
267
|
+
const approvedHint = readApprovedExecutionLaunchHint(wd, 'team');
|
|
268
|
+
assert.ok(approvedHint);
|
|
269
|
+
assert.equal(approvedHint?.task, boundTask);
|
|
270
|
+
assert.equal(approvedHint?.command, boundCommand);
|
|
271
|
+
await writePersistedApprovedTeamExecutionBinding('bound-team-quoted', wd, buildApprovedTeamExecutionBinding(approvedHint));
|
|
272
|
+
const result = parseTeamStartArgs(['team']);
|
|
273
|
+
assert.equal(result.parsed.task, boundTask);
|
|
274
|
+
assert.equal(result.parsed.workerCount, 2);
|
|
275
|
+
assert.equal(result.parsed.agentType, 'executor');
|
|
276
|
+
assert.equal(result.parsed.approvedExecution?.task, boundTask);
|
|
277
|
+
assert.equal(result.parsed.approvedExecution?.command, boundCommand);
|
|
278
|
+
}
|
|
279
|
+
finally {
|
|
280
|
+
process.chdir(previousCwd);
|
|
281
|
+
await rm(wd, { recursive: true, force: true });
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
it('round-trips double-quoted approved follow-ups from launch hint encoding through persisted binding', async () => {
|
|
285
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-double-quoted-'));
|
|
286
|
+
const previousCwd = process.cwd();
|
|
287
|
+
try {
|
|
288
|
+
process.chdir(wd);
|
|
289
|
+
const plansDir = join(wd, '.omx', 'plans');
|
|
290
|
+
await mkdir(plansDir, { recursive: true });
|
|
291
|
+
const boundTask = String.raw `Use C:\tmp and keep \n literal plus "quotes"`;
|
|
292
|
+
const boundCommand = `omx team 2:executor ${encodeApprovedExecutionTask(boundTask, 'double')}`;
|
|
293
|
+
const boundPrdPath = join(plansDir, 'prd-issue-831-double-quoted.md');
|
|
294
|
+
await writeFile(boundPrdPath, `# Approved plan\n\nLaunch via ${boundCommand}\n`);
|
|
295
|
+
await writeFile(join(plansDir, 'test-spec-issue-831-double-quoted.md'), '# Test spec\n');
|
|
296
|
+
await mkdir(join(wd, '.omx', 'state'), { recursive: true });
|
|
297
|
+
await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({ active: true, team_name: 'bound-team-double-quoted' }, null, 2));
|
|
298
|
+
const approvedHint = readApprovedExecutionLaunchHint(wd, 'team');
|
|
299
|
+
assert.ok(approvedHint);
|
|
300
|
+
assert.equal(approvedHint?.task, boundTask);
|
|
301
|
+
assert.equal(approvedHint?.command, boundCommand);
|
|
302
|
+
await writePersistedApprovedTeamExecutionBinding('bound-team-double-quoted', wd, buildApprovedTeamExecutionBinding(approvedHint));
|
|
303
|
+
const result = parseTeamStartArgs(['team']);
|
|
304
|
+
assert.equal(result.parsed.task, boundTask);
|
|
305
|
+
assert.equal(result.parsed.workerCount, 2);
|
|
306
|
+
assert.equal(result.parsed.agentType, 'executor');
|
|
307
|
+
assert.equal(result.parsed.approvedExecution?.task, boundTask);
|
|
308
|
+
assert.equal(result.parsed.approvedExecution?.command, boundCommand);
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
process.chdir(previousCwd);
|
|
312
|
+
await rm(wd, { recursive: true, force: true });
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
it('reuses the persisted approved binding from session-scoped team state for a short follow-up', async () => {
|
|
316
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-session-'));
|
|
317
|
+
const previousCwd = process.cwd();
|
|
318
|
+
try {
|
|
319
|
+
process.chdir(wd);
|
|
320
|
+
const sessionId = 'sess-team-followup-bound';
|
|
321
|
+
const plansDir = join(wd, '.omx', 'plans');
|
|
322
|
+
await mkdir(plansDir, { recursive: true });
|
|
323
|
+
const prdPath = join(plansDir, 'prd-issue-954.md');
|
|
324
|
+
await writeFile(prdPath, '# Approved plan\n\nLaunch via omx team 5:executor "Execute approved session-scoped plan"\n');
|
|
325
|
+
await writeFile(join(plansDir, 'test-spec-issue-954.md'), '# Test spec\n');
|
|
326
|
+
await mkdir(join(wd, '.omx', 'state', 'sessions', sessionId), { recursive: true });
|
|
327
|
+
await writeFile(join(wd, '.omx', 'state', 'session.json'), JSON.stringify({ session_id: sessionId }, null, 2));
|
|
328
|
+
await writeFile(join(wd, '.omx', 'state', 'sessions', sessionId, 'team-state.json'), JSON.stringify({
|
|
329
|
+
active: true,
|
|
330
|
+
team_name: 'bound-team-session',
|
|
331
|
+
task_description: 'Execute approved session-scoped plan',
|
|
332
|
+
agent_count: 5,
|
|
333
|
+
}, null, 2));
|
|
334
|
+
await writePersistedApprovedTeamExecutionBinding('bound-team-session', wd, {
|
|
335
|
+
prd_path: prdPath,
|
|
336
|
+
task: 'Execute approved session-scoped plan',
|
|
337
|
+
command: 'omx team 5:executor "Execute approved session-scoped plan"',
|
|
338
|
+
});
|
|
339
|
+
const result = parseTeamStartArgs(['team']);
|
|
340
|
+
assert.equal(result.parsed.task, 'Execute approved session-scoped plan');
|
|
341
|
+
assert.equal(result.parsed.workerCount, 5);
|
|
342
|
+
assert.equal(result.parsed.agentType, 'executor');
|
|
343
|
+
}
|
|
344
|
+
finally {
|
|
345
|
+
process.chdir(previousCwd);
|
|
346
|
+
await rm(wd, { recursive: true, force: true });
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
it('fails closed for a short follow-up when the persisted approved binding is malformed', async () => {
|
|
350
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-malformed-binding-'));
|
|
351
|
+
const previousCwd = process.cwd();
|
|
352
|
+
try {
|
|
353
|
+
process.chdir(wd);
|
|
354
|
+
const plansDir = join(wd, '.omx', 'plans');
|
|
355
|
+
const stateDir = join(wd, '.omx', 'state');
|
|
356
|
+
await mkdir(plansDir, { recursive: true });
|
|
357
|
+
await mkdir(join(stateDir, 'team', 'broken-team'), { recursive: true });
|
|
358
|
+
await writeFile(join(plansDir, 'prd-issue-831.md'), '# Approved plan\n\nLaunch via omx team 3:executor "Execute approved issue 831 plan"\n');
|
|
359
|
+
await writeFile(join(plansDir, 'test-spec-issue-831.md'), '# Test spec\n');
|
|
360
|
+
await writeFile(join(stateDir, 'team-state.json'), JSON.stringify({ active: true, team_name: 'broken-team' }, null, 2));
|
|
361
|
+
await writeFile(join(stateDir, 'team', 'broken-team', 'approved-execution.json'), '{"prd_path":42}', 'utf-8');
|
|
362
|
+
assert.throws(() => parseTeamStartArgs(['team']), /approved_execution_binding_malformed:broken-team/);
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
process.chdir(previousCwd);
|
|
366
|
+
await rm(wd, { recursive: true, force: true });
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
it('fails closed for a short follow-up when the persisted approved binding is stale even if a newer PRD is ready', async () => {
|
|
370
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-bound-stale-'));
|
|
371
|
+
const previousCwd = process.cwd();
|
|
372
|
+
try {
|
|
373
|
+
process.chdir(wd);
|
|
374
|
+
const plansDir = join(wd, '.omx', 'plans');
|
|
375
|
+
await mkdir(plansDir, { recursive: true });
|
|
376
|
+
const stalePrdPath = join(plansDir, 'prd-issue-955-alpha.md');
|
|
377
|
+
await writeFile(stalePrdPath, '# Approved plan\n\nLaunch via omx team 4:executor "Execute approved alpha plan"\n');
|
|
378
|
+
await writeFile(join(plansDir, 'test-spec-issue-955-alpha.md'), '# Test spec\n');
|
|
379
|
+
await writeFile(join(plansDir, 'prd-issue-955-zeta.md'), '# Approved plan\n\nLaunch via omx team 6:debugger "Execute approved zeta plan"\n');
|
|
380
|
+
await writeFile(join(plansDir, 'test-spec-issue-955-zeta.md'), '# Test spec\n');
|
|
381
|
+
await rm(stalePrdPath, { force: true });
|
|
382
|
+
await mkdir(join(wd, '.omx', 'state'), { recursive: true });
|
|
383
|
+
await writeFile(join(wd, '.omx', 'state', 'team-state.json'), JSON.stringify({
|
|
384
|
+
active: true,
|
|
385
|
+
team_name: 'bound-team-stale',
|
|
386
|
+
task_description: 'Execute approved alpha plan',
|
|
387
|
+
agent_count: 4,
|
|
388
|
+
}, null, 2));
|
|
389
|
+
await writePersistedApprovedTeamExecutionBinding('bound-team-stale', wd, {
|
|
390
|
+
prd_path: stalePrdPath,
|
|
391
|
+
task: 'Execute approved alpha plan',
|
|
392
|
+
});
|
|
393
|
+
assert.throws(() => parseTeamStartArgs(['team']), /approved_execution_binding_stale:.*Execute approved alpha plan/);
|
|
394
|
+
}
|
|
395
|
+
finally {
|
|
396
|
+
process.chdir(previousCwd);
|
|
397
|
+
await rm(wd, { recursive: true, force: true });
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
it('fails closed for a short team follow-up when the selected PRD lists multiple team launch hints', async () => {
|
|
401
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-ambiguous-'));
|
|
402
|
+
const previousCwd = process.cwd();
|
|
403
|
+
try {
|
|
404
|
+
process.chdir(wd);
|
|
405
|
+
await mkdir(join(wd, '.omx', 'plans'), { recursive: true });
|
|
406
|
+
await writeFile(join(wd, '.omx', 'plans', 'prd-issue-831-ambiguous.md'), [
|
|
407
|
+
'# Approved plan',
|
|
408
|
+
'',
|
|
409
|
+
'Launch via omx team 3:executor "Execute approved issue 831 plan"',
|
|
410
|
+
'Launch via omx team 5:debugger "Execute alternate issue 831 plan"',
|
|
411
|
+
].join('\n'));
|
|
412
|
+
await writeFile(join(wd, '.omx', 'plans', 'test-spec-issue-831-ambiguous.md'), '# Test spec\n');
|
|
413
|
+
assert.throws(() => parseTeamStartArgs(['team']), /approved_execution_hint_ambiguous:team/);
|
|
414
|
+
}
|
|
415
|
+
finally {
|
|
416
|
+
process.chdir(previousCwd);
|
|
417
|
+
await rm(wd, { recursive: true, force: true });
|
|
418
|
+
}
|
|
419
|
+
});
|
|
213
420
|
it('does not opt normal team startup into repo-aware DAG handoff even when a stale sidecar exists', async () => {
|
|
214
421
|
const wd = await mkdtemp(join(tmpdir(), 'omx-team-dag-normal-'));
|
|
215
422
|
const previousCwd = process.cwd();
|
|
@@ -244,6 +451,25 @@ describe('parseTeamStartArgs', () => {
|
|
|
244
451
|
await rm(wd, { recursive: true, force: true });
|
|
245
452
|
}
|
|
246
453
|
});
|
|
454
|
+
it('attaches approved repository context summary only for matching team launches', async () => {
|
|
455
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-team-context-approved-'));
|
|
456
|
+
const previousCwd = process.cwd();
|
|
457
|
+
try {
|
|
458
|
+
process.chdir(wd);
|
|
459
|
+
await mkdir(join(wd, '.omx', 'plans'), { recursive: true });
|
|
460
|
+
await writeFile(join(wd, '.omx', 'plans', 'prd-issue-2039.md'), '# Approved plan\n\nLaunch via omx team 3:executor "Execute approved issue 2039 plan"\n');
|
|
461
|
+
await writeFile(join(wd, '.omx', 'plans', 'test-spec-issue-2039.md'), '# Test spec\n');
|
|
462
|
+
await writeFile(join(wd, '.omx', 'plans', 'repo-context-issue-2039.md'), 'Key boundary: latest approved handoff only.\n');
|
|
463
|
+
const approved = parseTeamStartArgs(['3:executor', 'Execute', 'approved', 'issue', '2039', 'plan']);
|
|
464
|
+
assert.equal(approved.parsed.approvedRepositoryContextSummary?.content, 'Key boundary: latest approved handoff only.');
|
|
465
|
+
const unrelated = parseTeamStartArgs(['3:executor', 'fix', 'unrelated', 'bug']);
|
|
466
|
+
assert.equal(unrelated.parsed.approvedRepositoryContextSummary, undefined);
|
|
467
|
+
}
|
|
468
|
+
finally {
|
|
469
|
+
process.chdir(previousCwd);
|
|
470
|
+
await rm(wd, { recursive: true, force: true });
|
|
471
|
+
}
|
|
472
|
+
});
|
|
247
473
|
it('preserves explicit team staffing overrides while reusing the approved plan task', async () => {
|
|
248
474
|
const wd = await mkdtemp(join(tmpdir(), 'omx-team-followup-override-'));
|
|
249
475
|
const previousCwd = process.cwd();
|
|
@@ -1590,7 +1816,7 @@ describe('teamCommand await', () => {
|
|
|
1590
1816
|
const teamName = parseTeamStartArgs(['1:executor', teamTask]).parsed.teamName;
|
|
1591
1817
|
await mkdir(binDir, { recursive: true });
|
|
1592
1818
|
await writeFile(fakeCodexPath, `#!/usr/bin/env node
|
|
1593
|
-
setTimeout(() => process.exit(0),
|
|
1819
|
+
setTimeout(() => process.exit(0), 0);
|
|
1594
1820
|
process.stdin.resume();
|
|
1595
1821
|
process.on('SIGTERM', () => process.exit(0));
|
|
1596
1822
|
`);
|
|
@@ -1607,11 +1833,13 @@ process.on('SIGTERM', () => process.exit(0));
|
|
|
1607
1833
|
return true;
|
|
1608
1834
|
});
|
|
1609
1835
|
await withMockPromptModeCodexAllowed(() => withoutTeamTestWorkerEnv(() => teamCommand(['1:executor', teamTask])));
|
|
1836
|
+
const startedState = await readModeState('team', wd);
|
|
1837
|
+
const runtimeTeamName = String(startedState?.team_name ?? teamName);
|
|
1610
1838
|
let statusOutput = '';
|
|
1611
1839
|
for (let attempt = 0; attempt < 50; attempt += 1) {
|
|
1612
1840
|
logs.length = 0;
|
|
1613
1841
|
stderr.length = 0;
|
|
1614
|
-
await withoutTeamTestWorkerEnv(() => teamCommand(['status',
|
|
1842
|
+
await withoutTeamTestWorkerEnv(() => teamCommand(['status', runtimeTeamName]));
|
|
1615
1843
|
statusOutput = logs.join('\n');
|
|
1616
1844
|
if (/phase=failed/.test(statusOutput))
|
|
1617
1845
|
break;
|
|
@@ -1620,9 +1848,9 @@ process.on('SIGTERM', () => process.exit(0));
|
|
|
1620
1848
|
assert.match(statusOutput, /phase=failed/);
|
|
1621
1849
|
assert.doesNotMatch(stderr.join('\n'), /ESRCH/);
|
|
1622
1850
|
logs.length = 0;
|
|
1623
|
-
await withoutTeamTestWorkerEnv(() => teamCommand(['await',
|
|
1851
|
+
await withoutTeamTestWorkerEnv(() => teamCommand(['await', runtimeTeamName, '--json', '--timeout-ms', '250']));
|
|
1624
1852
|
const payload = JSON.parse(logs.at(-1) ?? '{}');
|
|
1625
|
-
assert.equal(payload.team_name,
|
|
1853
|
+
assert.equal(payload.team_name, runtimeTeamName);
|
|
1626
1854
|
assert.equal(payload.status, 'event');
|
|
1627
1855
|
assert.equal(payload.event?.type, 'worker_stopped');
|
|
1628
1856
|
assert.equal(payload.event?.worker, 'worker-1');
|
|
@@ -1676,15 +1904,17 @@ process.on('SIGTERM', () => process.exit(0));
|
|
|
1676
1904
|
process.env.OMX_TEAM_WORKER_CLI = 'codex';
|
|
1677
1905
|
await withMockPromptModeCodexAllowed(() => withoutTeamTestWorkerEnv(() => teamCommand(['1:executor', teamTask])));
|
|
1678
1906
|
const startedState = await readModeState('team', wd);
|
|
1907
|
+
const runtimeTeamName = String(startedState?.team_name ?? teamName);
|
|
1679
1908
|
assert.equal(startedState?.active, true);
|
|
1680
|
-
assert.equal(startedState?.team_name,
|
|
1909
|
+
assert.equal(startedState?.team_name, runtimeTeamName);
|
|
1910
|
+
assert.equal(startedState?.display_name, teamName);
|
|
1681
1911
|
assert.equal(startedState?.current_phase, 'team-exec');
|
|
1682
1912
|
await rm(join(wd, '.omx', 'state', 'team-state.json'), { force: true });
|
|
1683
1913
|
assert.equal(await readModeState('team', wd), null);
|
|
1684
|
-
await withoutTeamTestWorkerEnv(() => teamCommand(['resume',
|
|
1914
|
+
await withoutTeamTestWorkerEnv(() => teamCommand(['resume', runtimeTeamName]));
|
|
1685
1915
|
const resumedState = await readModeState('team', wd);
|
|
1686
1916
|
assert.equal(resumedState?.active, true);
|
|
1687
|
-
assert.equal(resumedState?.team_name,
|
|
1917
|
+
assert.equal(resumedState?.team_name, runtimeTeamName);
|
|
1688
1918
|
assert.equal(resumedState?.current_phase, 'team-exec');
|
|
1689
1919
|
}
|
|
1690
1920
|
finally {
|
|
@@ -1733,7 +1963,9 @@ process.on('SIGTERM', () => process.exit(0));
|
|
|
1733
1963
|
process.env.OMX_TEAM_WORKER_LAUNCH_MODE = 'prompt';
|
|
1734
1964
|
process.env.OMX_TEAM_WORKER_CLI = 'codex';
|
|
1735
1965
|
await withMockPromptModeCodexAllowed(() => withoutTeamTestWorkerEnv(() => teamCommand(['1:executor', teamTask])));
|
|
1736
|
-
|
|
1966
|
+
const startedState = await readModeState('team', wd);
|
|
1967
|
+
const runtimeTeamName = String(startedState?.team_name ?? teamName);
|
|
1968
|
+
await writeFile(join(wd, '.omx', 'state', 'team', runtimeTeamName, 'phase.json'), JSON.stringify({
|
|
1737
1969
|
current_phase: 'complete',
|
|
1738
1970
|
max_fix_attempts: 3,
|
|
1739
1971
|
current_fix_attempt: 0,
|
|
@@ -1741,10 +1973,10 @@ process.on('SIGTERM', () => process.exit(0));
|
|
|
1741
1973
|
updated_at: new Date().toISOString(),
|
|
1742
1974
|
}, null, 2));
|
|
1743
1975
|
await rm(join(wd, '.omx', 'state', 'team-state.json'), { force: true });
|
|
1744
|
-
await withoutTeamTestWorkerEnv(() => teamCommand(['resume',
|
|
1976
|
+
await withoutTeamTestWorkerEnv(() => teamCommand(['resume', runtimeTeamName]));
|
|
1745
1977
|
const resumedState = await readModeState('team', wd);
|
|
1746
1978
|
assert.equal(resumedState?.active, false);
|
|
1747
|
-
assert.equal(resumedState?.team_name,
|
|
1979
|
+
assert.equal(resumedState?.team_name, runtimeTeamName);
|
|
1748
1980
|
assert.equal(resumedState?.current_phase, 'complete');
|
|
1749
1981
|
}
|
|
1750
1982
|
finally {
|