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
|
@@ -5,14 +5,176 @@
|
|
|
5
5
|
* PipelineStage. The execution backend is always teams — this is the
|
|
6
6
|
* canonical OMX execution surface.
|
|
7
7
|
*/
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { basename, dirname, isAbsolute, join, normalize, relative, resolve } from 'node:path';
|
|
10
|
+
import { buildRepoAwareTeamExecutionPlan } from '../../team/repo-aware-decomposition.js';
|
|
11
|
+
import { buildTeamExecutionPlan, parseTeamArgs } from '../../cli/team.js';
|
|
8
12
|
import { buildFollowupStaffingPlan, resolveAvailableAgentTypes, } from '../../team/followup-planner.js';
|
|
13
|
+
import { decodeApprovedExecutionQuotedValue, readLatestPlanningArtifacts, readPlanningArtifacts, } from '../../planning/artifacts.js';
|
|
14
|
+
import { packageRoot, sameFilePath } from '../../utils/paths.js';
|
|
15
|
+
const APPROVED_TEAM_LAUNCH_PATTERN = /(?<command>(?:omx\s+team|\$team)\s+(?<ralph>ralph\s+)?(?<count>\d+)(?::(?<role>[a-z][a-z0-9-]*))?\s+(?<task>"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'))/gi;
|
|
16
|
+
function resolveRequestedTask(ctx, ralplanArtifacts) {
|
|
17
|
+
const ralplanTask = typeof ralplanArtifacts?.task === 'string' ? ralplanArtifacts.task.trim() : '';
|
|
18
|
+
return ralplanTask || ctx.task;
|
|
19
|
+
}
|
|
20
|
+
function normalizePlanningRelativePath(rawPath) {
|
|
21
|
+
const trimmed = rawPath.trim().replace(/^`|`$/g, '').replace(/\\/g, '/');
|
|
22
|
+
const withoutDotPrefix = trimmed.startsWith('./') ? trimmed.slice(2) : trimmed;
|
|
23
|
+
return normalize(withoutDotPrefix).replace(/\\/g, '/');
|
|
24
|
+
}
|
|
25
|
+
function planningArtifactSlug(path, prefixPattern) {
|
|
26
|
+
const file = basename(path);
|
|
27
|
+
const match = file.match(prefixPattern);
|
|
28
|
+
return match?.groups?.slug ?? null;
|
|
29
|
+
}
|
|
30
|
+
function matchingTestSpecPathsForPrd(artifacts, prdPath) {
|
|
31
|
+
const prdSlug = planningArtifactSlug(prdPath, /^prd-(?<slug>.*)\.md$/i);
|
|
32
|
+
if (!prdSlug)
|
|
33
|
+
return [];
|
|
34
|
+
return artifacts.testSpecPaths.filter((testSpecPath) => planningArtifactSlug(testSpecPath, /^test-?spec-(?<slug>.*)\.md$/i) === prdSlug);
|
|
35
|
+
}
|
|
36
|
+
function resolvePlanningPrdPath(artifacts, cwd, rawPath) {
|
|
37
|
+
const normalizedRawPath = rawPath.trim();
|
|
38
|
+
if (isAbsolute(normalizedRawPath)) {
|
|
39
|
+
const resolvedPath = resolve(normalizedRawPath);
|
|
40
|
+
const matchedPath = artifacts.prdPaths.find((candidatePath) => sameFilePath(candidatePath, resolvedPath)) ?? null;
|
|
41
|
+
return { matchedPath, fallbackPath: resolvedPath };
|
|
42
|
+
}
|
|
43
|
+
const repoRoot = dirname(dirname(artifacts.plansDir));
|
|
44
|
+
const normalizedPath = normalizePlanningRelativePath(normalizedRawPath);
|
|
45
|
+
const resolvedPath = resolve(cwd, normalizedPath);
|
|
46
|
+
const matchedPath = artifacts.prdPaths.find((candidatePath) => {
|
|
47
|
+
const artifactPath = normalizePlanningRelativePath(candidatePath);
|
|
48
|
+
const repoRelativePath = normalizePlanningRelativePath(relative(repoRoot, candidatePath));
|
|
49
|
+
const plansRelativePath = normalizePlanningRelativePath(relative(artifacts.plansDir, candidatePath));
|
|
50
|
+
return normalizedPath === artifactPath
|
|
51
|
+
|| normalizedPath === repoRelativePath
|
|
52
|
+
|| normalizedPath === plansRelativePath;
|
|
53
|
+
}) ?? artifacts.prdPaths.find((candidatePath) => sameFilePath(candidatePath, resolvedPath)) ?? null;
|
|
54
|
+
return {
|
|
55
|
+
matchedPath,
|
|
56
|
+
fallbackPath: resolvedPath,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function readRuntimeLatestPlanningSelection(artifacts, cwd, ralplanArtifacts) {
|
|
60
|
+
const drafts = Array.isArray(ralplanArtifacts?.drafts) ? ralplanArtifacts.drafts : [];
|
|
61
|
+
for (let index = drafts.length - 1; index >= 0; index -= 1) {
|
|
62
|
+
const draft = drafts[index];
|
|
63
|
+
if (!draft || typeof draft !== 'object')
|
|
64
|
+
continue;
|
|
65
|
+
const draftRecord = draft;
|
|
66
|
+
const draftPlanPath = typeof draftRecord.planPath === 'string'
|
|
67
|
+
? draftRecord.planPath.trim()
|
|
68
|
+
: '';
|
|
69
|
+
if (!draftPlanPath)
|
|
70
|
+
continue;
|
|
71
|
+
const resolvedDraftPlanPath = resolvePlanningPrdPath(artifacts, cwd, draftPlanPath).matchedPath;
|
|
72
|
+
return {
|
|
73
|
+
prdPath: resolvedDraftPlanPath,
|
|
74
|
+
testSpecPaths: resolvedDraftPlanPath ? matchingTestSpecPathsForPrd(artifacts, resolvedDraftPlanPath) : [],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function resolveApprovedTeamPlanPath(cwd, latestPlanPath, ralplanArtifacts) {
|
|
80
|
+
const artifacts = readPlanningArtifacts(cwd);
|
|
81
|
+
const resolvedLatestPlanPath = resolvePlanningPrdPath(artifacts, cwd, latestPlanPath);
|
|
82
|
+
const selection = readRuntimeLatestPlanningSelection(artifacts, cwd, ralplanArtifacts) ?? readLatestPlanningArtifacts(cwd);
|
|
83
|
+
const selectedPrdPath = selection.prdPath
|
|
84
|
+
? resolvePlanningPrdPath(artifacts, cwd, selection.prdPath).matchedPath
|
|
85
|
+
: null;
|
|
86
|
+
if (!selectedPrdPath || selection.testSpecPaths.length === 0 || !resolvedLatestPlanPath.matchedPath) {
|
|
87
|
+
throw new Error(`team_exec_approved_handoff_missing:${resolvedLatestPlanPath.fallbackPath}`);
|
|
88
|
+
}
|
|
89
|
+
if (selectedPrdPath !== resolvedLatestPlanPath.matchedPath) {
|
|
90
|
+
throw new Error(`team_exec_approved_handoff_stale:${resolvedLatestPlanPath.matchedPath}:${selectedPrdPath}`);
|
|
91
|
+
}
|
|
92
|
+
return selectedPrdPath;
|
|
93
|
+
}
|
|
94
|
+
function resolveApprovedTeamTaskFromPlanPath(cwd, latestPlanPath, ralplanArtifacts) {
|
|
95
|
+
const approvedPlanPath = resolveApprovedTeamPlanPath(cwd, latestPlanPath, ralplanArtifacts);
|
|
96
|
+
let content = '';
|
|
97
|
+
try {
|
|
98
|
+
content = readFileSync(approvedPlanPath, 'utf-8');
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw new Error(`team_exec_approved_handoff_missing:${approvedPlanPath}`);
|
|
102
|
+
}
|
|
103
|
+
const matches = [...content.matchAll(APPROVED_TEAM_LAUNCH_PATTERN)];
|
|
104
|
+
if (matches.length === 0) {
|
|
105
|
+
throw new Error(`team_exec_approved_handoff_missing:${approvedPlanPath}`);
|
|
106
|
+
}
|
|
107
|
+
if (matches.length > 1) {
|
|
108
|
+
throw new Error(`team_exec_approved_handoff_ambiguous:${approvedPlanPath}`);
|
|
109
|
+
}
|
|
110
|
+
const task = matches[0]?.groups?.task ? decodeApprovedExecutionQuotedValue(matches[0].groups.task) : null;
|
|
111
|
+
if (!task) {
|
|
112
|
+
throw new Error(`team_exec_approved_handoff_missing:${approvedPlanPath}`);
|
|
113
|
+
}
|
|
114
|
+
return task;
|
|
115
|
+
}
|
|
116
|
+
function resolveTeamExecTask(ctx, ralplanArtifacts) {
|
|
117
|
+
const requestedTask = resolveRequestedTask(ctx, ralplanArtifacts);
|
|
118
|
+
const latestPlanPath = typeof ralplanArtifacts?.latestPlanPath === 'string'
|
|
119
|
+
? ralplanArtifacts.latestPlanPath.trim()
|
|
120
|
+
: '';
|
|
121
|
+
if (!latestPlanPath) {
|
|
122
|
+
return requestedTask;
|
|
123
|
+
}
|
|
124
|
+
return resolveApprovedTeamTaskFromPlanPath(ctx.cwd, latestPlanPath, ralplanArtifacts);
|
|
125
|
+
}
|
|
126
|
+
function quotePosixShellArg(value) {
|
|
127
|
+
return `'${value.replace(/'/g, `'\"'\"'`)}'`;
|
|
128
|
+
}
|
|
129
|
+
function quoteWindowsCmdArg(value) {
|
|
130
|
+
return `"${value.replace(/%/g, '%%').replace(/"/g, '""')}"`;
|
|
131
|
+
}
|
|
132
|
+
function quoteShellArg(value, platform) {
|
|
133
|
+
return platform === 'win32' ? quoteWindowsCmdArg(value) : quotePosixShellArg(value);
|
|
134
|
+
}
|
|
135
|
+
function buildTeamRuntimeCliLaunchInput(descriptor) {
|
|
136
|
+
const parsed = parseTeamArgs([`${descriptor.workerCount}:${descriptor.agentType}`, descriptor.task], descriptor.cwd);
|
|
137
|
+
const executionPlan = buildRepoAwareTeamExecutionPlan({
|
|
138
|
+
task: parsed.task,
|
|
139
|
+
workerCount: parsed.workerCount,
|
|
140
|
+
agentType: parsed.agentType,
|
|
141
|
+
explicitAgentType: parsed.explicitAgentType,
|
|
142
|
+
explicitWorkerCount: parsed.explicitWorkerCount,
|
|
143
|
+
cwd: descriptor.cwd,
|
|
144
|
+
buildLegacyPlan: buildTeamExecutionPlan,
|
|
145
|
+
allowDagHandoff: parsed.allowRepoAwareDagHandoff,
|
|
146
|
+
approvedRepositoryContextSummary: parsed.approvedRepositoryContextSummary,
|
|
147
|
+
});
|
|
148
|
+
return {
|
|
149
|
+
teamName: parsed.teamName,
|
|
150
|
+
workerCount: executionPlan.workerCount,
|
|
151
|
+
agentType: descriptor.agentType,
|
|
152
|
+
tasks: executionPlan.tasks.map(({ subject, description, owner, blocked_by, depends_on, symbolic_depends_on, role, requires_code_change, filePaths, domains, lane, allocation_reason, symbolic_id, }) => ({
|
|
153
|
+
subject,
|
|
154
|
+
description,
|
|
155
|
+
...(owner ? { owner } : {}),
|
|
156
|
+
...(blocked_by?.length ? { blocked_by } : {}),
|
|
157
|
+
...(depends_on?.length ? { depends_on } : {}),
|
|
158
|
+
...(symbolic_depends_on?.length ? { symbolic_depends_on } : {}),
|
|
159
|
+
...(role ? { role } : {}),
|
|
160
|
+
...(requires_code_change ? { requires_code_change } : {}),
|
|
161
|
+
...(filePaths?.length ? { filePaths } : {}),
|
|
162
|
+
...(domains?.length ? { domains } : {}),
|
|
163
|
+
...(lane ? { lane } : {}),
|
|
164
|
+
...(allocation_reason ? { allocation_reason } : {}),
|
|
165
|
+
...(symbolic_id ? { symbolic_id } : {}),
|
|
166
|
+
})),
|
|
167
|
+
cwd: descriptor.cwd,
|
|
168
|
+
...(executionPlan.metadata ? { decompositionMetadata: executionPlan.metadata } : {}),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
9
171
|
/**
|
|
10
172
|
* Create a team-exec pipeline stage.
|
|
11
173
|
*
|
|
12
174
|
* This stage delegates to the existing `omx team` infrastructure, which
|
|
13
|
-
* starts real Codex CLI workers in tmux panes.
|
|
14
|
-
*
|
|
15
|
-
* the
|
|
175
|
+
* starts real Codex CLI workers in tmux panes. When RALPLAN names a
|
|
176
|
+
* concrete approved PRD handoff, team-exec reuses that exact task text;
|
|
177
|
+
* otherwise it stays on the generic request-task path.
|
|
16
178
|
*/
|
|
17
179
|
export function createTeamExecStage(options = {}) {
|
|
18
180
|
const workerCount = options.workerCount ?? 2;
|
|
@@ -22,19 +184,18 @@ export function createTeamExecStage(options = {}) {
|
|
|
22
184
|
async run(ctx) {
|
|
23
185
|
const startTime = Date.now();
|
|
24
186
|
try {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
: ctx.task;
|
|
187
|
+
const ralplanArtifacts = typeof ctx.artifacts['ralplan'] === 'object' && ctx.artifacts['ralplan'] !== null
|
|
188
|
+
? ctx.artifacts['ralplan']
|
|
189
|
+
: undefined;
|
|
190
|
+
const task = resolveTeamExecTask(ctx, ralplanArtifacts);
|
|
30
191
|
const availableAgentTypes = await resolveAvailableAgentTypes(ctx.cwd);
|
|
31
|
-
const staffingPlan = buildFollowupStaffingPlan('team',
|
|
192
|
+
const staffingPlan = buildFollowupStaffingPlan('team', task, availableAgentTypes, {
|
|
32
193
|
workerCount,
|
|
33
194
|
fallbackRole: agentType,
|
|
34
195
|
});
|
|
35
196
|
// Build team execution descriptor
|
|
36
197
|
const teamDescriptor = {
|
|
37
|
-
task
|
|
198
|
+
task,
|
|
38
199
|
workerCount,
|
|
39
200
|
agentType,
|
|
40
201
|
availableAgentTypes,
|
|
@@ -71,8 +232,15 @@ export function createTeamExecStage(options = {}) {
|
|
|
71
232
|
/**
|
|
72
233
|
* Build the `omx team` CLI instruction from a descriptor.
|
|
73
234
|
*/
|
|
74
|
-
export function buildTeamInstruction(descriptor) {
|
|
75
|
-
const
|
|
76
|
-
|
|
235
|
+
export function buildTeamInstruction(descriptor, options = {}) {
|
|
236
|
+
const runtimeCliInput = buildTeamRuntimeCliLaunchInput(descriptor);
|
|
237
|
+
const runtimeCliPath = join(packageRoot(), 'dist', 'team', 'runtime-cli.js');
|
|
238
|
+
const platform = options.platform ?? process.platform;
|
|
239
|
+
const encodedInput = Buffer.from(JSON.stringify(runtimeCliInput), 'utf-8').toString('base64url');
|
|
240
|
+
const launchCommand = `${quoteShellArg(process.execPath, platform)} ${quoteShellArg(runtimeCliPath, platform)} --input-json-base64 ${encodedInput}`;
|
|
241
|
+
if (platform === 'win32') {
|
|
242
|
+
return launchCommand;
|
|
243
|
+
}
|
|
244
|
+
return `${launchCommand} # task=${JSON.stringify(descriptor.task)} # staffing=${descriptor.staffingPlan.staffingSummary} # verify=${descriptor.staffingPlan.verificationPlan.summary}`;
|
|
77
245
|
}
|
|
78
246
|
//# sourceMappingURL=team-exec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-exec.js","sourceRoot":"","sources":["../../../src/pipeline/stages/team-exec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AAgBxC;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAgC,EAAE;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,WAAW;QAEjB,KAAK,CAAC,GAAG,CAAC,GAAiB;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,CAAC;gBACH,qDAAqD;gBACrD,MAAM,gBAAgB,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,CAAwC,CAAC;gBACzF,MAAM,WAAW,GAAG,gBAAgB;oBAClC,CAAC,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,EAAE;oBAC/F,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;gBACb,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACtE,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,mBAAmB,EAAE;oBACpF,WAAW;oBACX,YAAY,EAAE,SAAS;iBACxB,CAAC,CAAC;gBAEH,kCAAkC;gBAClC,MAAM,cAAc,GAAuB;oBACzC,IAAI,EAAE,WAAW;oBACjB,WAAW;oBACX,SAAS;oBACT,mBAAmB;oBACnB,YAAY;oBACZ,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;oBAC3C,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CAAC;gBAEF,OAAO;oBACL,MAAM,EAAE,WAAW;oBACnB,SAAS,EAAE;wBACT,cAAc;wBACd,WAAW;wBACX,SAAS;wBACT,mBAAmB;wBACnB,YAAY;wBACZ,KAAK,EAAE,WAAW;wBAClB,WAAW,EAAE,oBAAoB,CAAC,cAAc,CAAC;qBAClD;oBACD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACpC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,EAAE;oBACb,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACnC,KAAK,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBAC1F,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAoBD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA8B;IACjE,MAAM,aAAa,GAAG,YAAY,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACtH,OAAO,GAAG,aAAa,eAAe,UAAU,CAAC,YAAY,CAAC,eAAe,aAAa,UAAU,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;AAC/I,CAAC"}
|
|
1
|
+
{"version":3,"file":"team-exec.js","sourceRoot":"","sources":["../../../src/pipeline/stages/team-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,14 @@ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
|
4
4
|
import { existsSync } from 'node:fs';
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
6
|
import { join } from 'node:path';
|
|
7
|
-
import { isPlanningComplete, readApprovedExecutionLaunchHint, readPlanningArtifacts, readTeamDagArtifactResolution } from '../artifacts.js';
|
|
7
|
+
import { decodeApprovedExecutionQuotedValue, isPlanningComplete, readApprovedExecutionLaunchHint, readLatestPlanningArtifacts, readPlanningArtifacts, readTeamDagArtifactResolution, } from '../artifacts.js';
|
|
8
8
|
import { readTeamDagHandoffForLatestPlan } from '../../team/dag-schema.js';
|
|
9
9
|
let tempDir;
|
|
10
|
+
function encodeApprovedExecutionTask(task, quote) {
|
|
11
|
+
return quote === 'single'
|
|
12
|
+
? `'${task.replace(/'/g, "\\'")}'`
|
|
13
|
+
: `"${task.replace(/"/g, '\\"')}"`;
|
|
14
|
+
}
|
|
10
15
|
async function setup() {
|
|
11
16
|
tempDir = await mkdtemp(join(tmpdir(), 'omx-planning-artifacts-'));
|
|
12
17
|
}
|
|
@@ -18,6 +23,16 @@ async function cleanup() {
|
|
|
18
23
|
describe('planning artifacts', () => {
|
|
19
24
|
beforeEach(async () => { await setup(); });
|
|
20
25
|
afterEach(async () => { await cleanup(); });
|
|
26
|
+
it('round-trips single-quoted approved execution tasks with only escaped apostrophes normalized', () => {
|
|
27
|
+
const task = String.raw `Fix Bob's regression in C:\\tmp`;
|
|
28
|
+
assert.equal(decodeApprovedExecutionQuotedValue(encodeApprovedExecutionTask(task, 'single')), task);
|
|
29
|
+
});
|
|
30
|
+
it('round-trips double-quoted approved execution tasks without applying JSON escapes', () => {
|
|
31
|
+
const task = String.raw `Use C:\tmp and keep \n literal plus "quotes"`;
|
|
32
|
+
assert.equal(decodeApprovedExecutionQuotedValue(encodeApprovedExecutionTask(task, 'double')), task);
|
|
33
|
+
const literalEscapeTask = String.raw `Keep \t and \u1234 literal`;
|
|
34
|
+
assert.equal(decodeApprovedExecutionQuotedValue(encodeApprovedExecutionTask(literalEscapeTask, 'double')), literalEscapeTask);
|
|
35
|
+
});
|
|
21
36
|
it('requires both PRD and test spec for planning completion', async () => {
|
|
22
37
|
const plansDir = join(tempDir, '.omx', 'plans');
|
|
23
38
|
await mkdir(plansDir, { recursive: true });
|
|
@@ -79,6 +94,75 @@ describe('planning artifacts', () => {
|
|
|
79
94
|
assert.equal(resolution.planSlug, 'repo-aware');
|
|
80
95
|
assert.deepEqual(resolution.warnings, ['missing_matching_test_spec']);
|
|
81
96
|
});
|
|
97
|
+
it('prefers timestamped PRD/test-spec pairs while keeping legacy artifacts compatible', async () => {
|
|
98
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
99
|
+
const specsDir = join(tempDir, '.omx', 'specs');
|
|
100
|
+
await mkdir(plansDir, { recursive: true });
|
|
101
|
+
await mkdir(specsDir, { recursive: true });
|
|
102
|
+
await writeFile(join(plansDir, 'prd-legacy.md'), '# Legacy\n\nLaunch via omx ralph "Execute legacy plan"\n');
|
|
103
|
+
await writeFile(join(plansDir, 'test-spec-legacy.md'), '# Legacy Test Spec\n');
|
|
104
|
+
await writeFile(join(plansDir, 'prd-20260427T153000Z-alpha.md'), '# Old Alpha\n\nLaunch via omx ralph "Execute old alpha plan"\n');
|
|
105
|
+
await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Legacy Test Spec\n');
|
|
106
|
+
await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# New Alpha\n\nLaunch via omx ralph "Execute new alpha plan"\n');
|
|
107
|
+
await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Timestamped Test Spec\n');
|
|
108
|
+
await writeFile(join(specsDir, 'deep-interview-alpha.md'), '# Alpha Legacy Deep Interview\n');
|
|
109
|
+
await writeFile(join(specsDir, 'deep-interview-20260427T153100Z-alpha.md'), '# Alpha Timestamped Deep Interview\n');
|
|
110
|
+
await writeFile(join(specsDir, 'deep-interview-autoresearch-20260427T153100Z-alpha.md'), '# Autoresearch Draft\n');
|
|
111
|
+
const selection = readLatestPlanningArtifacts(tempDir);
|
|
112
|
+
assert.equal(selection.prdPath, join(plansDir, 'prd-20260427T153100Z-alpha.md'));
|
|
113
|
+
assert.deepEqual(selection.testSpecPaths, [join(plansDir, 'test-spec-20260427T153100Z-alpha.md')]);
|
|
114
|
+
assert.deepEqual(selection.deepInterviewSpecPaths, [
|
|
115
|
+
join(specsDir, 'deep-interview-alpha.md'),
|
|
116
|
+
join(specsDir, 'deep-interview-20260427T153100Z-alpha.md'),
|
|
117
|
+
]);
|
|
118
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
|
|
119
|
+
assert.ok(hint);
|
|
120
|
+
assert.equal(hint?.task, 'Execute new alpha plan');
|
|
121
|
+
assert.deepEqual(hint?.testSpecPaths, [join(plansDir, 'test-spec-20260427T153100Z-alpha.md')]);
|
|
122
|
+
assert.deepEqual(hint?.deepInterviewSpecPaths, [
|
|
123
|
+
join(specsDir, 'deep-interview-alpha.md'),
|
|
124
|
+
join(specsDir, 'deep-interview-20260427T153100Z-alpha.md'),
|
|
125
|
+
]);
|
|
126
|
+
const artifacts = readPlanningArtifacts(tempDir);
|
|
127
|
+
assert.equal(isPlanningComplete(artifacts), true);
|
|
128
|
+
});
|
|
129
|
+
it('keeps legacy test-spec compatibility aliases for non-timestamped PRDs', async () => {
|
|
130
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
131
|
+
await mkdir(plansDir, { recursive: true });
|
|
132
|
+
await writeFile(join(plansDir, 'prd-alpha.md'), '# Alpha\n\nLaunch via omx ralph "Execute alpha"\n');
|
|
133
|
+
await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Test Spec\n');
|
|
134
|
+
await writeFile(join(plansDir, 'testspec-alpha.md'), '# Alpha Compatibility Test Spec\n');
|
|
135
|
+
await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Timestamped Test Spec\n');
|
|
136
|
+
const selection = readLatestPlanningArtifacts(tempDir);
|
|
137
|
+
assert.equal(selection.prdPath, join(plansDir, 'prd-alpha.md'));
|
|
138
|
+
assert.deepEqual(selection.testSpecPaths, [
|
|
139
|
+
join(plansDir, 'test-spec-alpha.md'),
|
|
140
|
+
join(plansDir, 'testspec-alpha.md'),
|
|
141
|
+
]);
|
|
142
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
|
|
143
|
+
assert.ok(hint);
|
|
144
|
+
assert.deepEqual(hint?.testSpecPaths, [
|
|
145
|
+
join(plansDir, 'test-spec-alpha.md'),
|
|
146
|
+
join(plansDir, 'testspec-alpha.md'),
|
|
147
|
+
]);
|
|
148
|
+
});
|
|
149
|
+
it('fails closed for timestamped PRDs when only legacy slug test specs exist', async () => {
|
|
150
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
151
|
+
await mkdir(plansDir, { recursive: true });
|
|
152
|
+
await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# Alpha\n\nLaunch via omx ralph "Execute alpha"\n');
|
|
153
|
+
await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Legacy Test Spec\n');
|
|
154
|
+
const artifacts = readPlanningArtifacts(tempDir);
|
|
155
|
+
assert.equal(isPlanningComplete(artifacts), false);
|
|
156
|
+
const selection = readLatestPlanningArtifacts(tempDir);
|
|
157
|
+
assert.equal(selection.prdPath, join(plansDir, 'prd-20260427T153100Z-alpha.md'));
|
|
158
|
+
assert.deepEqual(selection.testSpecPaths, []);
|
|
159
|
+
assert.equal(readApprovedExecutionLaunchHint(tempDir, 'ralph'), null);
|
|
160
|
+
const resolution = readTeamDagArtifactResolution(tempDir);
|
|
161
|
+
assert.equal(resolution.source, 'none');
|
|
162
|
+
assert.equal(resolution.prdPath, join(plansDir, 'prd-20260427T153100Z-alpha.md'));
|
|
163
|
+
assert.equal(resolution.planSlug, '20260427T153100Z-alpha');
|
|
164
|
+
assert.deepEqual(resolution.warnings, ['missing_matching_test_spec']);
|
|
165
|
+
});
|
|
82
166
|
it('parses $ralph aliases with single-quoted task text for approved launch hints', async () => {
|
|
83
167
|
const plansDir = join(tempDir, '.omx', 'plans');
|
|
84
168
|
const specsDir = join(tempDir, '.omx', 'specs');
|
|
@@ -185,6 +269,168 @@ describe('planning artifacts', () => {
|
|
|
185
269
|
assert.deepEqual(hint?.testSpecPaths, [join(plansDir, 'test-spec-zeta.md')]);
|
|
186
270
|
assert.deepEqual(hint?.deepInterviewSpecPaths, [join(specsDir, 'deep-interview-zeta.md')]);
|
|
187
271
|
});
|
|
272
|
+
it('binds approved launch hints to the requested prd path', async () => {
|
|
273
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
274
|
+
await mkdir(plansDir, { recursive: true });
|
|
275
|
+
const alphaPrdPath = join(plansDir, 'prd-alpha.md');
|
|
276
|
+
await writeFile(alphaPrdPath, '# Alpha\n\nLaunch via omx ralph "Execute alpha"\n');
|
|
277
|
+
await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Test Spec\n');
|
|
278
|
+
await writeFile(join(plansDir, 'prd-zeta.md'), '# Zeta\n\nLaunch via omx ralph "Execute zeta"\n');
|
|
279
|
+
await writeFile(join(plansDir, 'test-spec-zeta.md'), '# Zeta Test Spec\n');
|
|
280
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph', { prdPath: alphaPrdPath });
|
|
281
|
+
assert.ok(hint);
|
|
282
|
+
assert.equal(hint?.task, 'Execute alpha');
|
|
283
|
+
assert.equal(hint?.sourcePath, alphaPrdPath);
|
|
284
|
+
assert.deepEqual(hint?.testSpecPaths, [join(plansDir, 'test-spec-alpha.md')]);
|
|
285
|
+
});
|
|
286
|
+
it('honors the requested Ralph task when a single plan lists multiple Ralph launch hints', async () => {
|
|
287
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
288
|
+
await mkdir(plansDir, { recursive: true });
|
|
289
|
+
await writeFile(join(plansDir, 'prd-issue-909.md'), [
|
|
290
|
+
'# PRD',
|
|
291
|
+
'',
|
|
292
|
+
'Launch via omx ralph "Execute alpha"',
|
|
293
|
+
'Launch via omx ralph "Execute beta"',
|
|
294
|
+
].join('\n'));
|
|
295
|
+
await writeFile(join(plansDir, 'test-spec-issue-909.md'), '# Test Spec\n');
|
|
296
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph', { task: 'Execute alpha' });
|
|
297
|
+
assert.ok(hint);
|
|
298
|
+
assert.equal(hint?.task, 'Execute alpha');
|
|
299
|
+
assert.equal(hint?.command, 'omx ralph "Execute alpha"');
|
|
300
|
+
});
|
|
301
|
+
it('fails closed for bare Ralph lookups when a single plan lists multiple Ralph launch hints', async () => {
|
|
302
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
303
|
+
await mkdir(plansDir, { recursive: true });
|
|
304
|
+
await writeFile(join(plansDir, 'prd-issue-909-bare.md'), [
|
|
305
|
+
'# PRD',
|
|
306
|
+
'',
|
|
307
|
+
'Launch via omx ralph "Execute alpha"',
|
|
308
|
+
'Launch via omx ralph "Execute beta"',
|
|
309
|
+
].join('\n'));
|
|
310
|
+
await writeFile(join(plansDir, 'test-spec-issue-909-bare.md'), '# Test Spec\n');
|
|
311
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
|
|
312
|
+
assert.equal(hint, null);
|
|
313
|
+
});
|
|
314
|
+
it('honors the requested team task when a single plan lists multiple team launch hints', async () => {
|
|
315
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
316
|
+
await mkdir(plansDir, { recursive: true });
|
|
317
|
+
await writeFile(join(plansDir, 'prd-issue-910.md'), [
|
|
318
|
+
'# PRD',
|
|
319
|
+
'',
|
|
320
|
+
'Launch via omx team 2:executor "Execute alpha"',
|
|
321
|
+
'Launch via omx team 5:debugger "Execute beta"',
|
|
322
|
+
].join('\n'));
|
|
323
|
+
await writeFile(join(plansDir, 'test-spec-issue-910.md'), '# Test Spec\n');
|
|
324
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'team', { task: 'Execute alpha' });
|
|
325
|
+
assert.ok(hint);
|
|
326
|
+
assert.equal(hint?.task, 'Execute alpha');
|
|
327
|
+
assert.equal(hint?.workerCount, 2);
|
|
328
|
+
assert.equal(hint?.agentType, 'executor');
|
|
329
|
+
assert.equal(hint?.command, 'omx team 2:executor "Execute alpha"');
|
|
330
|
+
});
|
|
331
|
+
it('fails closed when a single plan repeats the same team task in multiple launch hints', async () => {
|
|
332
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
333
|
+
const prdPath = join(plansDir, 'prd-issue-910-duplicate.md');
|
|
334
|
+
await mkdir(plansDir, { recursive: true });
|
|
335
|
+
await writeFile(prdPath, [
|
|
336
|
+
'# PRD',
|
|
337
|
+
'',
|
|
338
|
+
'Launch via omx team 2:executor "Execute alpha"',
|
|
339
|
+
'Launch via $team 5:debugger "Execute alpha"',
|
|
340
|
+
].join('\n'));
|
|
341
|
+
await writeFile(join(plansDir, 'test-spec-issue-910-duplicate.md'), '# Test Spec\n');
|
|
342
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'team', {
|
|
343
|
+
prdPath,
|
|
344
|
+
task: 'Execute alpha',
|
|
345
|
+
});
|
|
346
|
+
assert.equal(hint, null);
|
|
347
|
+
});
|
|
348
|
+
it('rehydrates the exact team launch hint by command when one PRD repeats the same task', async () => {
|
|
349
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
350
|
+
const sharedTask = 'Ship feature';
|
|
351
|
+
const primaryCommand = `omx team 2:executor ${JSON.stringify(sharedTask)}`;
|
|
352
|
+
const secondaryCommand = `$team ralph 5:debugger ${JSON.stringify(sharedTask)}`;
|
|
353
|
+
const prdPath = join(plansDir, 'prd-issue-910-command.md');
|
|
354
|
+
await mkdir(plansDir, { recursive: true });
|
|
355
|
+
await writeFile(prdPath, [
|
|
356
|
+
'# Approved plan',
|
|
357
|
+
'',
|
|
358
|
+
`Launch via ${primaryCommand}`,
|
|
359
|
+
`Launch via ${secondaryCommand}`,
|
|
360
|
+
].join('\n'));
|
|
361
|
+
await writeFile(join(plansDir, 'test-spec-issue-910-command.md'), '# Test Spec\n');
|
|
362
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'team', {
|
|
363
|
+
prdPath,
|
|
364
|
+
task: sharedTask,
|
|
365
|
+
command: primaryCommand,
|
|
366
|
+
});
|
|
367
|
+
assert.ok(hint);
|
|
368
|
+
assert.equal(hint?.command, primaryCommand);
|
|
369
|
+
assert.equal(hint?.workerCount, 2);
|
|
370
|
+
assert.equal(hint?.agentType, 'executor');
|
|
371
|
+
assert.equal(hint?.linkedRalph, false);
|
|
372
|
+
});
|
|
373
|
+
it('fails closed for bare team lookups when a single plan lists multiple team launch hints', async () => {
|
|
374
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
375
|
+
await mkdir(plansDir, { recursive: true });
|
|
376
|
+
await writeFile(join(plansDir, 'prd-issue-910-bare.md'), [
|
|
377
|
+
'# PRD',
|
|
378
|
+
'',
|
|
379
|
+
'Launch via omx team 2:executor "Execute alpha"',
|
|
380
|
+
'Launch via omx team 5:debugger "Execute beta"',
|
|
381
|
+
].join('\n'));
|
|
382
|
+
await writeFile(join(plansDir, 'test-spec-issue-910-bare.md'), '# Test Spec\n');
|
|
383
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
|
|
384
|
+
assert.equal(hint, null);
|
|
385
|
+
});
|
|
386
|
+
it('attaches bounded approved repository context from a matching latest-plan sidecar', async () => {
|
|
387
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
388
|
+
await mkdir(plansDir, { recursive: true });
|
|
389
|
+
await writeFile(join(plansDir, 'prd-issue-2039.md'), '# PRD\n\nLaunch via omx team 3:executor "Execute approved issue 2039 plan"\n');
|
|
390
|
+
await writeFile(join(plansDir, 'test-spec-issue-2039.md'), '# Test Spec\n');
|
|
391
|
+
await writeFile(join(plansDir, 'repo-context-issue-2039.md'), 'Key files: src/planning/artifacts.ts\n'.repeat(120));
|
|
392
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
|
|
393
|
+
assert.ok(hint?.repositoryContextSummary);
|
|
394
|
+
assert.equal(hint.repositoryContextSummary.sourcePath, join(plansDir, 'repo-context-issue-2039.md'));
|
|
395
|
+
assert.match(hint.repositoryContextSummary.content, /Key files: src\/planning\/artifacts\.ts/);
|
|
396
|
+
assert.equal(hint.repositoryContextSummary.truncated, true);
|
|
397
|
+
assert.ok(hint.repositoryContextSummary.content.split('\n').length <= 80);
|
|
398
|
+
});
|
|
399
|
+
it('prefers exact timestamped repository context sidecars for timestamped PRDs', async () => {
|
|
400
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
401
|
+
await mkdir(plansDir, { recursive: true });
|
|
402
|
+
await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# Alpha\n\nLaunch via omx team 2:executor "Execute alpha"\n');
|
|
403
|
+
await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Test Spec\n');
|
|
404
|
+
await writeFile(join(plansDir, 'repo-context-alpha.md'), 'stale alpha context\n');
|
|
405
|
+
await writeFile(join(plansDir, 'repo-context-20260427T153100Z-alpha.md'), 'fresh alpha context\n');
|
|
406
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
|
|
407
|
+
assert.ok(hint?.repositoryContextSummary);
|
|
408
|
+
assert.equal(hint.repositoryContextSummary.sourcePath, join(plansDir, 'repo-context-20260427T153100Z-alpha.md'));
|
|
409
|
+
assert.equal(hint.repositoryContextSummary.content, 'fresh alpha context');
|
|
410
|
+
});
|
|
411
|
+
it('does not attach stale repository context from a different PRD slug', async () => {
|
|
412
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
413
|
+
await mkdir(plansDir, { recursive: true });
|
|
414
|
+
await writeFile(join(plansDir, 'prd-alpha.md'), '# Alpha\n\nLaunch via omx team 2:executor "Execute alpha"\n');
|
|
415
|
+
await writeFile(join(plansDir, 'test-spec-alpha.md'), '# Alpha Test Spec\n');
|
|
416
|
+
await writeFile(join(plansDir, 'repo-context-alpha.md'), 'stale alpha context\n');
|
|
417
|
+
await writeFile(join(plansDir, 'prd-zeta.md'), '# Zeta\n\nLaunch via omx team 3:executor "Execute zeta"\n');
|
|
418
|
+
await writeFile(join(plansDir, 'test-spec-zeta.md'), '# Zeta Test Spec\n');
|
|
419
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'team');
|
|
420
|
+
assert.ok(hint);
|
|
421
|
+
assert.equal(hint.task, 'Execute zeta');
|
|
422
|
+
assert.equal(hint.repositoryContextSummary, undefined);
|
|
423
|
+
});
|
|
424
|
+
it('falls back to an inline approved repository context section when no sidecar exists', async () => {
|
|
425
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
426
|
+
await mkdir(plansDir, { recursive: true });
|
|
427
|
+
await writeFile(join(plansDir, 'prd-inline.md'), '# PRD\n\nLaunch via omx ralph "Execute inline"\n\n## Approved Repository Context Summary\n\n- Reuse src/cli/ralph.ts.\n\n## Verification\nRun tests.\n');
|
|
428
|
+
await writeFile(join(plansDir, 'test-spec-inline.md'), '# Inline Test Spec\n');
|
|
429
|
+
const hint = readApprovedExecutionLaunchHint(tempDir, 'ralph');
|
|
430
|
+
assert.ok(hint?.repositoryContextSummary);
|
|
431
|
+
assert.equal(hint.repositoryContextSummary.sourcePath, join(plansDir, 'prd-inline.md'));
|
|
432
|
+
assert.equal(hint.repositoryContextSummary.content, '- Reuse src/cli/ralph.ts.');
|
|
433
|
+
});
|
|
188
434
|
it('surfaces deep-interview specs for downstream traceability', async () => {
|
|
189
435
|
const plansDir = join(tempDir, '.omx', 'plans');
|
|
190
436
|
const specsDir = join(tempDir, '.omx', 'specs');
|
|
@@ -211,6 +457,20 @@ describe('planning artifacts', () => {
|
|
|
211
457
|
assert.equal(result.planSlug, 'alpha');
|
|
212
458
|
assert.equal(result.dag?.nodes[0]?.id, 'impl');
|
|
213
459
|
});
|
|
460
|
+
it('prefers exact timestamped Team DAG sidecars for timestamped PRDs', async () => {
|
|
461
|
+
const plansDir = join(tempDir, '.omx', 'plans');
|
|
462
|
+
await mkdir(plansDir, { recursive: true });
|
|
463
|
+
await writeFile(join(plansDir, 'prd-20260427T153100Z-alpha.md'), '# Alpha\n');
|
|
464
|
+
await writeFile(join(plansDir, 'test-spec-20260427T153100Z-alpha.md'), '# Alpha Test\n');
|
|
465
|
+
await writeFile(join(plansDir, 'team-dag-alpha.json'), '{"source":"stale"}\n');
|
|
466
|
+
await writeFile(join(plansDir, 'team-dag-20260427T153100Z-alpha.json'), '{"source":"fresh"}\n');
|
|
467
|
+
const resolution = readTeamDagArtifactResolution(tempDir);
|
|
468
|
+
assert.equal(resolution.source, 'json-sidecar');
|
|
469
|
+
assert.equal(resolution.planSlug, '20260427T153100Z-alpha');
|
|
470
|
+
assert.equal(resolution.artifactPath, join(plansDir, 'team-dag-20260427T153100Z-alpha.json'));
|
|
471
|
+
assert.equal(resolution.content, '{"source":"fresh"}\n');
|
|
472
|
+
assert.deepEqual(resolution.warnings, []);
|
|
473
|
+
});
|
|
214
474
|
it('does not overmatch sidecars for a different slug prefix', async () => {
|
|
215
475
|
const plansDir = join(tempDir, '.omx', 'plans');
|
|
216
476
|
await mkdir(plansDir, { recursive: true });
|