oh-my-codex 0.15.3 → 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/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 +20 -1
- 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-warning-copy.test.js +23 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +8 -1
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +82 -3
- 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__/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__/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 +18 -9
- 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 +187 -0
- 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 +49 -0
- 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 +6 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +145 -18
- package/dist/cli/index.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.map +1 -1
- package/dist/cli/ralph.js +8 -0
- 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 +2 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +72 -17
- 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 +12 -1
- 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 +3 -2
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +52 -8
- 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__/anti-slop-workflow.test.js +3 -3
- 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 +2 -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__/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 +62 -1
- 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 +30 -5
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
- package/dist/pipeline/stages/team-exec.js +2 -19
- package/dist/pipeline/stages/team-exec.js.map +1 -1
- package/dist/planning/__tests__/artifacts.test.js +16 -1
- package/dist/planning/__tests__/artifacts.test.js.map +1 -1
- package/dist/planning/artifacts.d.ts +1 -0
- package/dist/planning/artifacts.d.ts.map +1 -1
- package/dist/planning/artifacts.js +9 -12
- package/dist/planning/artifacts.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 +1516 -205
- 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 +497 -51
- 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 +222 -19
- 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-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/run-test-files.js +17 -1
- package/dist/scripts/run-test-files.js.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js +2 -2
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/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 +35 -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 +59 -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__/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.test.js +118 -6
- 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__/tmux-session.test.js +3 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +50 -0
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +4 -3
- 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.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/role-router.js +5 -5
- package/dist/team/role-router.js.map +1 -1
- package/dist/team/runtime.d.ts +6 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +46 -6
- 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/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +4 -2
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +2 -0
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +19 -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/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/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 +1654 -157
- 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 +592 -52
- package/src/scripts/codex-native-pre-post.ts +252 -20
- 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-stop.ts +246 -0
- package/src/scripts/notify-hook/team-worker.ts +23 -14
- package/src/scripts/run-test-files.ts +20 -1
- package/src/scripts/sync-plugin-mirror.ts +2 -2
- 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
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join, relative } from 'node:path';
|
|
4
|
+
import { assertGoalWorkflowCanComplete } from './validation.js';
|
|
5
|
+
export const GOAL_WORKFLOWS_DIR = '.omx/goals';
|
|
6
|
+
export const GOAL_WORKFLOW_STATUS = 'status.json';
|
|
7
|
+
export const GOAL_WORKFLOW_LEDGER = 'ledger.jsonl';
|
|
8
|
+
export class GoalWorkflowError extends Error {
|
|
9
|
+
}
|
|
10
|
+
function iso(now = new Date()) {
|
|
11
|
+
return now.toISOString();
|
|
12
|
+
}
|
|
13
|
+
function cleanSegment(value, fallback) {
|
|
14
|
+
const segment = value
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
17
|
+
.replace(/^-+|-+$/g, '')
|
|
18
|
+
.slice(0, 72)
|
|
19
|
+
.replace(/-+$/g, '');
|
|
20
|
+
return segment || fallback;
|
|
21
|
+
}
|
|
22
|
+
function slugFromObjective(objective) {
|
|
23
|
+
const firstLine = objective.split(/\r?\n/).map((line) => line.trim()).find(Boolean) ?? 'goal-workflow';
|
|
24
|
+
return cleanSegment(firstLine, 'goal-workflow');
|
|
25
|
+
}
|
|
26
|
+
function repoRelative(cwd, path) {
|
|
27
|
+
return relative(cwd, path).split('\\').join('/');
|
|
28
|
+
}
|
|
29
|
+
export function normalizeGoalWorkflowSegment(value, fallback = 'workflow') {
|
|
30
|
+
return cleanSegment(value, fallback);
|
|
31
|
+
}
|
|
32
|
+
export function goalWorkflowDir(cwd, workflow, slug) {
|
|
33
|
+
return join(cwd, GOAL_WORKFLOWS_DIR, normalizeGoalWorkflowSegment(workflow), normalizeGoalWorkflowSegment(slug, 'goal-workflow'));
|
|
34
|
+
}
|
|
35
|
+
export function goalWorkflowStatusPath(cwd, workflow, slug) {
|
|
36
|
+
return join(goalWorkflowDir(cwd, workflow, slug), GOAL_WORKFLOW_STATUS);
|
|
37
|
+
}
|
|
38
|
+
export function goalWorkflowLedgerPath(cwd, workflow, slug) {
|
|
39
|
+
return join(goalWorkflowDir(cwd, workflow, slug), GOAL_WORKFLOW_LEDGER);
|
|
40
|
+
}
|
|
41
|
+
export async function appendGoalWorkflowLedger(cwd, run, entry) {
|
|
42
|
+
await mkdir(join(cwd, run.artifactDir), { recursive: true });
|
|
43
|
+
await appendFile(join(cwd, run.ledgerPath), `${JSON.stringify(entry)}\n`);
|
|
44
|
+
}
|
|
45
|
+
async function writeRun(cwd, run) {
|
|
46
|
+
await mkdir(join(cwd, run.artifactDir), { recursive: true });
|
|
47
|
+
await writeFile(join(cwd, run.statusPath), `${JSON.stringify(run, null, 2)}\n`);
|
|
48
|
+
}
|
|
49
|
+
export async function createGoalWorkflowRun(cwd, options) {
|
|
50
|
+
if (!options.objective.trim())
|
|
51
|
+
throw new GoalWorkflowError('Missing goal workflow objective.');
|
|
52
|
+
const workflow = normalizeGoalWorkflowSegment(options.workflow);
|
|
53
|
+
const slug = normalizeGoalWorkflowSegment(options.slug ?? slugFromObjective(options.objective), 'goal-workflow');
|
|
54
|
+
const statusPath = goalWorkflowStatusPath(cwd, workflow, slug);
|
|
55
|
+
if (!options.force && existsSync(statusPath)) {
|
|
56
|
+
throw new GoalWorkflowError(`Refusing to overwrite existing ${repoRelative(cwd, statusPath)}; pass force to recreate it.`);
|
|
57
|
+
}
|
|
58
|
+
const now = iso(options.now);
|
|
59
|
+
const artifactDir = repoRelative(cwd, goalWorkflowDir(cwd, workflow, slug));
|
|
60
|
+
const run = {
|
|
61
|
+
version: 1,
|
|
62
|
+
workflow,
|
|
63
|
+
slug,
|
|
64
|
+
objective: options.objective.trim(),
|
|
65
|
+
status: 'pending',
|
|
66
|
+
createdAt: now,
|
|
67
|
+
updatedAt: now,
|
|
68
|
+
artifactDir,
|
|
69
|
+
statusPath: `${artifactDir}/${GOAL_WORKFLOW_STATUS}`,
|
|
70
|
+
ledgerPath: `${artifactDir}/${GOAL_WORKFLOW_LEDGER}`,
|
|
71
|
+
metadata: options.metadata,
|
|
72
|
+
};
|
|
73
|
+
await writeRun(cwd, run);
|
|
74
|
+
await writeFile(join(cwd, run.ledgerPath), '');
|
|
75
|
+
await appendGoalWorkflowLedger(cwd, run, { ts: now, event: 'workflow_created', status: run.status, message: 'Goal workflow created' });
|
|
76
|
+
return run;
|
|
77
|
+
}
|
|
78
|
+
export async function readGoalWorkflowRun(cwd, workflow, slug) {
|
|
79
|
+
const path = goalWorkflowStatusPath(cwd, workflow, slug);
|
|
80
|
+
let raw;
|
|
81
|
+
try {
|
|
82
|
+
raw = await readFile(path, 'utf-8');
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new GoalWorkflowError(`No goal workflow run found at ${repoRelative(cwd, path)}.`);
|
|
86
|
+
}
|
|
87
|
+
const parsed = JSON.parse(raw);
|
|
88
|
+
if (parsed.version !== 1 || !parsed.workflow || !parsed.slug || !parsed.objective) {
|
|
89
|
+
throw new GoalWorkflowError(`Invalid goal workflow run at ${repoRelative(cwd, path)}.`);
|
|
90
|
+
}
|
|
91
|
+
return parsed;
|
|
92
|
+
}
|
|
93
|
+
function eventForStatus(status) {
|
|
94
|
+
switch (status) {
|
|
95
|
+
case 'in_progress': return 'goal_started';
|
|
96
|
+
case 'validation_passed': return 'validation_passed';
|
|
97
|
+
case 'blocked':
|
|
98
|
+
case 'failed': return 'goal_failed';
|
|
99
|
+
case 'complete': return 'goal_completed';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export async function transitionGoalWorkflowRun(cwd, workflow, slug, options) {
|
|
103
|
+
const run = await readGoalWorkflowRun(cwd, workflow, slug);
|
|
104
|
+
if (options.status === 'validation_passed') {
|
|
105
|
+
assertGoalWorkflowCanComplete(options.validation);
|
|
106
|
+
}
|
|
107
|
+
if (options.status === 'complete') {
|
|
108
|
+
if (run.status !== 'validation_passed') {
|
|
109
|
+
throw new GoalWorkflowError('Goal workflow completion requires a passing validation artifact first.');
|
|
110
|
+
}
|
|
111
|
+
assertGoalWorkflowCanComplete(run.validation);
|
|
112
|
+
}
|
|
113
|
+
const now = iso(options.now);
|
|
114
|
+
run.status = options.status;
|
|
115
|
+
run.updatedAt = now;
|
|
116
|
+
run.evidence = options.evidence ?? run.evidence;
|
|
117
|
+
run.metadata = { ...run.metadata, ...options.metadata };
|
|
118
|
+
if (options.validation)
|
|
119
|
+
run.validation = options.validation;
|
|
120
|
+
await writeRun(cwd, run);
|
|
121
|
+
await appendGoalWorkflowLedger(cwd, run, {
|
|
122
|
+
ts: now,
|
|
123
|
+
event: eventForStatus(options.status),
|
|
124
|
+
status: run.status,
|
|
125
|
+
message: options.message,
|
|
126
|
+
evidence: options.evidence,
|
|
127
|
+
validation: options.validation,
|
|
128
|
+
metadata: options.metadata,
|
|
129
|
+
});
|
|
130
|
+
return run;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/goal-workflows/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type CodexGoalSnapshotStatus = 'active' | 'complete' | 'cancelled' | 'failed' | 'unknown';
|
|
2
|
+
export interface CodexGoalSnapshot {
|
|
3
|
+
available: boolean;
|
|
4
|
+
objective?: string;
|
|
5
|
+
status?: CodexGoalSnapshotStatus;
|
|
6
|
+
tokenBudget?: number;
|
|
7
|
+
remainingTokens?: number | null;
|
|
8
|
+
raw: unknown;
|
|
9
|
+
}
|
|
10
|
+
export interface CodexGoalReconciliation {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
snapshot: CodexGoalSnapshot;
|
|
13
|
+
warnings: string[];
|
|
14
|
+
errors: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ReconcileCodexGoalOptions {
|
|
17
|
+
expectedObjective: string;
|
|
18
|
+
allowedStatuses?: readonly CodexGoalSnapshotStatus[];
|
|
19
|
+
requireSnapshot?: boolean;
|
|
20
|
+
requireComplete?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class CodexGoalSnapshotError extends Error {
|
|
23
|
+
}
|
|
24
|
+
export declare function parseCodexGoalSnapshot(value: unknown): CodexGoalSnapshot;
|
|
25
|
+
export declare function readCodexGoalSnapshotInput(raw: string | undefined, cwd?: string): Promise<CodexGoalSnapshot | null>;
|
|
26
|
+
export declare function reconcileCodexGoalSnapshot(snapshot: CodexGoalSnapshot | null | undefined, options: ReconcileCodexGoalOptions): CodexGoalReconciliation;
|
|
27
|
+
export declare function formatCodexGoalReconciliation(reconciliation: CodexGoalReconciliation): string;
|
|
28
|
+
//# sourceMappingURL=codex-goal-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-goal-snapshot.d.ts","sourceRoot":"","sources":["../../src/goal-workflows/codex-goal-snapshot.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AA2BpD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CA+BxE;AAED,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAgBhI;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,EAAE,yBAAyB,GACjC,uBAAuB,CA8BzB;AAED,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,uBAAuB,GAAG,MAAM,CAG7F"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
export class CodexGoalSnapshotError extends Error {
|
|
5
|
+
}
|
|
6
|
+
function safeObject(value) {
|
|
7
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
8
|
+
}
|
|
9
|
+
function safeString(value) {
|
|
10
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
11
|
+
}
|
|
12
|
+
function safeNumber(value) {
|
|
13
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
14
|
+
}
|
|
15
|
+
function normalizeStatus(value) {
|
|
16
|
+
const status = safeString(value).toLowerCase();
|
|
17
|
+
if (status === 'complete' || status === 'completed' || status === 'done')
|
|
18
|
+
return 'complete';
|
|
19
|
+
if (status === 'cancelled' || status === 'canceled')
|
|
20
|
+
return 'cancelled';
|
|
21
|
+
if (status === 'failed' || status === 'failure')
|
|
22
|
+
return 'failed';
|
|
23
|
+
if (status === 'active' || status === 'in_progress' || status === 'pending' || status === 'running')
|
|
24
|
+
return 'active';
|
|
25
|
+
return 'unknown';
|
|
26
|
+
}
|
|
27
|
+
function normalizeObjective(value) {
|
|
28
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
29
|
+
}
|
|
30
|
+
export function parseCodexGoalSnapshot(value) {
|
|
31
|
+
const root = safeObject(value);
|
|
32
|
+
const goalValue = Object.hasOwn(root, 'goal') ? root.goal : value;
|
|
33
|
+
if (goalValue === null || goalValue === undefined || goalValue === false) {
|
|
34
|
+
return { available: false, raw: value };
|
|
35
|
+
}
|
|
36
|
+
const goal = safeObject(goalValue);
|
|
37
|
+
const objective = safeString(goal.objective
|
|
38
|
+
?? goal.goal
|
|
39
|
+
?? goal.description
|
|
40
|
+
?? root.objective);
|
|
41
|
+
const status = normalizeStatus(goal.status ?? root.status);
|
|
42
|
+
const tokenBudget = safeNumber(goal.token_budget
|
|
43
|
+
?? goal.tokenBudget
|
|
44
|
+
?? root.token_budget
|
|
45
|
+
?? root.tokenBudget);
|
|
46
|
+
const remainingTokens = safeNumber(root.remainingTokens ?? root.remaining_tokens);
|
|
47
|
+
return {
|
|
48
|
+
available: Boolean(objective || status !== 'unknown'),
|
|
49
|
+
...(objective ? { objective } : {}),
|
|
50
|
+
status,
|
|
51
|
+
...(tokenBudget !== undefined ? { tokenBudget } : {}),
|
|
52
|
+
remainingTokens: remainingTokens ?? null,
|
|
53
|
+
raw: value,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export async function readCodexGoalSnapshotInput(raw, cwd = process.cwd()) {
|
|
57
|
+
if (!raw?.trim())
|
|
58
|
+
return null;
|
|
59
|
+
const trimmed = raw.trim();
|
|
60
|
+
try {
|
|
61
|
+
return parseCodexGoalSnapshot(JSON.parse(trimmed));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
const path = resolve(cwd, trimmed);
|
|
65
|
+
if (!existsSync(path)) {
|
|
66
|
+
throw new CodexGoalSnapshotError(`Codex goal snapshot is neither valid JSON nor a readable path: ${trimmed}`);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
return parseCodexGoalSnapshot(JSON.parse(await readFile(path, 'utf-8')));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new CodexGoalSnapshotError(`Codex goal snapshot path does not contain valid JSON: ${trimmed}${error instanceof Error ? ` (${error.message})` : ''}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function reconcileCodexGoalSnapshot(snapshot, options) {
|
|
77
|
+
const effectiveSnapshot = snapshot ?? { available: false, raw: null };
|
|
78
|
+
const errors = [];
|
|
79
|
+
const warnings = [];
|
|
80
|
+
if (!effectiveSnapshot.available) {
|
|
81
|
+
const message = 'Codex goal snapshot is absent or reports no active goal; call get_goal and pass its JSON with --codex-goal-json.';
|
|
82
|
+
if (options.requireSnapshot)
|
|
83
|
+
errors.push(message);
|
|
84
|
+
else
|
|
85
|
+
warnings.push(message);
|
|
86
|
+
return { ok: errors.length === 0, snapshot: effectiveSnapshot, warnings, errors };
|
|
87
|
+
}
|
|
88
|
+
const expected = normalizeObjective(options.expectedObjective);
|
|
89
|
+
const actual = normalizeObjective(effectiveSnapshot.objective ?? '');
|
|
90
|
+
if (!actual) {
|
|
91
|
+
errors.push('Codex goal snapshot is missing objective text.');
|
|
92
|
+
}
|
|
93
|
+
else if (actual !== expected) {
|
|
94
|
+
errors.push(`Codex goal objective mismatch: expected "${expected}", got "${actual}".`);
|
|
95
|
+
}
|
|
96
|
+
const allowed = options.allowedStatuses ?? (options.requireComplete ? ['complete'] : ['active', 'complete']);
|
|
97
|
+
const actualStatus = effectiveSnapshot.status ?? 'unknown';
|
|
98
|
+
if (!allowed.includes(actualStatus)) {
|
|
99
|
+
errors.push(`Codex goal status mismatch: expected ${allowed.join(' or ')}, got ${actualStatus}.`);
|
|
100
|
+
}
|
|
101
|
+
if (options.requireComplete && actualStatus !== 'complete') {
|
|
102
|
+
errors.push(`Codex goal is not complete; call update_goal({status: "complete"}) only after the objective is actually complete, then pass the fresh get_goal JSON.`);
|
|
103
|
+
}
|
|
104
|
+
return { ok: errors.length === 0, snapshot: effectiveSnapshot, warnings, errors };
|
|
105
|
+
}
|
|
106
|
+
export function formatCodexGoalReconciliation(reconciliation) {
|
|
107
|
+
const parts = [...reconciliation.errors, ...reconciliation.warnings];
|
|
108
|
+
return parts.join(' ');
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=codex-goal-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-goal-snapshot.js","sourceRoot":"","sources":["../../src/goal-workflows/codex-goal-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { GoalWorkflowRun } from './artifacts.js';
|
|
2
|
+
export interface GoalWorkflowHandoffOptions {
|
|
3
|
+
run: GoalWorkflowRun;
|
|
4
|
+
title?: string;
|
|
5
|
+
tokenBudget?: number;
|
|
6
|
+
completionCommand?: string;
|
|
7
|
+
degradedMode?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildGoalWorkflowHandoff(options: GoalWorkflowHandoffOptions): string;
|
|
10
|
+
//# sourceMappingURL=handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/goal-workflows/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,GAAG,MAAM,CA6BpF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function buildGoalWorkflowHandoff(options) {
|
|
2
|
+
const createPayload = {
|
|
3
|
+
objective: options.run.objective,
|
|
4
|
+
...(options.tokenBudget ? { token_budget: options.tokenBudget } : {}),
|
|
5
|
+
};
|
|
6
|
+
return [
|
|
7
|
+
options.title ?? `${options.run.workflow} goal-workflow handoff`,
|
|
8
|
+
`Status: ${options.run.status}`,
|
|
9
|
+
`Artifacts: ${options.run.artifactDir}`,
|
|
10
|
+
`Ledger: ${options.run.ledgerPath}`,
|
|
11
|
+
'',
|
|
12
|
+
'Codex goal integration constraints:',
|
|
13
|
+
'- First call get_goal to inspect the active Codex thread goal.',
|
|
14
|
+
'- Call create_goal only if no active goal exists and this handoff is the explicit objective to start.',
|
|
15
|
+
'- If a different active Codex goal exists, finish, checkpoint, or ask the leader before replacing focus.',
|
|
16
|
+
'- Work only this objective until the workflow-specific completion audit passes.',
|
|
17
|
+
'- Call update_goal({status: "complete"}) only after the OMX completion audit and validation artifacts pass, then call get_goal again for a fresh complete snapshot.',
|
|
18
|
+
options.completionCommand ? `- Then record OMX completion evidence with the fresh snapshot: ${options.completionCommand}` : '- Then record OMX completion evidence in the workflow ledger/status artifacts with the fresh get_goal snapshot when the workflow supports --codex-goal-json.',
|
|
19
|
+
'',
|
|
20
|
+
options.degradedMode
|
|
21
|
+
? 'Degraded-mode warning: this shell-rendered handoff did not mutate hidden Codex goal state; the active agent must use get_goal/create_goal/update_goal when those tools are available.'
|
|
22
|
+
: 'Truth boundary: OMX owns durable workflow artifacts; Codex owns active-thread focus/accounting.',
|
|
23
|
+
'',
|
|
24
|
+
'create_goal payload:',
|
|
25
|
+
JSON.stringify(createPayload, null, 2),
|
|
26
|
+
'',
|
|
27
|
+
'Objective:',
|
|
28
|
+
options.run.objective,
|
|
29
|
+
].join('\n');
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/goal-workflows/handoff.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,wBAAwB,CAAC,OAAmC;IAC1E,MAAM,aAAa,GAAG;QACpB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;QAChC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAC;IACF,OAAO;QACL,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,wBAAwB;QAChE,WAAW,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;QAC/B,cAAc,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;QACvC,WAAW,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;QACnC,EAAE;QACF,qCAAqC;QACrC,gEAAgE;QAChE,uGAAuG;QACvG,0GAA0G;QAC1G,iFAAiF;QACjF,qKAAqK;QACrK,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,kEAAkE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,8JAA8J;QAC1R,EAAE;QACF,OAAO,CAAC,YAAY;YAClB,CAAC,CAAC,uLAAuL;YACzL,CAAC,CAAC,iGAAiG;QACrG,EAAE;QACF,sBAAsB;QACtB,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,EAAE;QACF,YAAY;QACZ,OAAO,CAAC,GAAG,CAAC,SAAS;KACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GoalWorkflowValidationSummary } from './artifacts.js';
|
|
2
|
+
export type GoalWorkflowValidationStatus = 'pass' | 'fail' | 'blocker';
|
|
3
|
+
export interface GoalWorkflowValidationInput {
|
|
4
|
+
status: GoalWorkflowValidationStatus | boolean;
|
|
5
|
+
summary: string;
|
|
6
|
+
artifactPath?: string;
|
|
7
|
+
checkedAt?: Date;
|
|
8
|
+
}
|
|
9
|
+
export declare class GoalWorkflowValidationError extends Error {
|
|
10
|
+
}
|
|
11
|
+
export declare function normalizeGoalWorkflowValidation(input: GoalWorkflowValidationInput): GoalWorkflowValidationSummary;
|
|
12
|
+
export declare function assertGoalWorkflowCanComplete(validation: GoalWorkflowValidationSummary | undefined): void;
|
|
13
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/goal-workflows/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,qBAAa,2BAA4B,SAAQ,KAAK;CAAG;AAUzD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,2BAA2B,GAAG,6BAA6B,CAajH;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,6BAA6B,GAAG,SAAS,GAAG,IAAI,CASzG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export class GoalWorkflowValidationError extends Error {
|
|
2
|
+
}
|
|
3
|
+
function iso(now = new Date()) {
|
|
4
|
+
return now.toISOString();
|
|
5
|
+
}
|
|
6
|
+
function hasPlaceholderEvidence(summary) {
|
|
7
|
+
return /\b(?:todo|tbd|placeholder|stub|not\s+implemented|fake\s+pass)\b/i.test(summary);
|
|
8
|
+
}
|
|
9
|
+
export function normalizeGoalWorkflowValidation(input) {
|
|
10
|
+
if (!input.summary.trim())
|
|
11
|
+
throw new GoalWorkflowValidationError('Validation summary is required.');
|
|
12
|
+
const status = input.status === true || input.status === 'pass'
|
|
13
|
+
? 'validation_passed'
|
|
14
|
+
: input.status === 'blocker'
|
|
15
|
+
? 'blocked'
|
|
16
|
+
: 'failed';
|
|
17
|
+
return {
|
|
18
|
+
status,
|
|
19
|
+
summary: input.summary.trim(),
|
|
20
|
+
artifactPath: input.artifactPath?.trim() || undefined,
|
|
21
|
+
checkedAt: iso(input.checkedAt),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function assertGoalWorkflowCanComplete(validation) {
|
|
25
|
+
if (!validation)
|
|
26
|
+
throw new GoalWorkflowValidationError('Completion requires a validation artifact.');
|
|
27
|
+
if (validation.status !== 'validation_passed') {
|
|
28
|
+
throw new GoalWorkflowValidationError(`Completion requires validation_passed; got ${validation.status}.`);
|
|
29
|
+
}
|
|
30
|
+
if (!validation.artifactPath?.trim())
|
|
31
|
+
throw new GoalWorkflowValidationError('Completion requires a validation artifact path.');
|
|
32
|
+
if (hasPlaceholderEvidence(validation.summary)) {
|
|
33
|
+
throw new GoalWorkflowValidationError('Completion requires real validation evidence, not placeholder evaluator text.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/goal-workflows/validation.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,2BAA4B,SAAQ,KAAK;CAAG;AAEzD,SAAS,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;IAC3B,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,kEAAkE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAkC;IAChF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,2BAA2B,CAAC,iCAAiC,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAC7D,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YAC1B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,QAAQ,CAAC;IACf,OAAO;QACL,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QAC7B,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS;QACrD,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,UAAqD;IACjG,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,2BAA2B,CAAC,4CAA4C,CAAC,CAAC;IACrG,IAAI,UAAU,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QAC9C,MAAM,IAAI,2BAA2B,CAAC,8CAA8C,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE;QAAE,MAAM,IAAI,2BAA2B,CAAC,iDAAiD,CAAC,CAAC;IAC/H,IAAI,sBAAsB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,2BAA2B,CAAC,+EAA+E,CAAC,CAAC;IACzH,CAAC;AACH,CAAC"}
|
|
@@ -88,9 +88,9 @@ describe('anti-slop workflow surfaces', () => {
|
|
|
88
88
|
const reviewSkill = read('skills/review/SKILL.md');
|
|
89
89
|
const planSkill = read('skills/plan/SKILL.md');
|
|
90
90
|
assertMatchesAll(reviewSkill, [
|
|
91
|
-
/
|
|
92
|
-
/
|
|
93
|
-
/
|
|
91
|
+
/Hard-deprecated/i,
|
|
92
|
+
/Do not invoke or route this skill/i,
|
|
93
|
+
/Use `\$code-review` directly/i,
|
|
94
94
|
]);
|
|
95
95
|
assertMatchesAll(planSkill, [
|
|
96
96
|
/### Review Mode \(`--review`\)/,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anti-slop-workflow.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/anti-slop-workflow.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"anti-slop-workflow.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/anti-slop-workflow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { detectKeywords, detectPrimaryKeyword, recordSkillActivation, DEEP_INTER
|
|
|
8
8
|
import { SKILL_ACTIVE_STATE_FILE } from '../../state/skill-active.js';
|
|
9
9
|
import { isUnderspecifiedForExecution, applyRalplanGate } from '../keyword-detector.js';
|
|
10
10
|
import { KEYWORD_TRIGGER_DEFINITIONS } from '../keyword-registry.js';
|
|
11
|
-
describe('keyword detector
|
|
11
|
+
describe('keyword detector team compatibility', () => {
|
|
12
12
|
it('keeps explicit $skill order in detectKeywords results (left-to-right)', () => {
|
|
13
13
|
const matches = detectKeywords('$analyze $ultraqa $code-review now');
|
|
14
14
|
assert.deepEqual(matches.map((m) => m.skill).slice(0, 3), ['analyze', 'ultraqa', 'code-review']);
|
|
@@ -50,11 +50,7 @@ describe('keyword detector swarm/team compatibility', () => {
|
|
|
50
50
|
const matches = detectKeywords('$oh-my-codex:ralplan text $ralph');
|
|
51
51
|
assert.deepEqual(matches.map((m) => m.skill), ['ralplan']);
|
|
52
52
|
});
|
|
53
|
-
it('normalizes plugin-prefixed
|
|
54
|
-
const swarm = detectPrimaryKeyword('$oh-my-codex:swarm handle this');
|
|
55
|
-
assert.ok(swarm);
|
|
56
|
-
assert.equal(swarm.skill, 'team');
|
|
57
|
-
assert.equal(swarm.keyword, '$oh-my-codex:swarm');
|
|
53
|
+
it('normalizes plugin-prefixed ulw shorthand token', () => {
|
|
58
54
|
const ulw = detectPrimaryKeyword('$oh-my-codex:ulw continue');
|
|
59
55
|
assert.ok(ulw);
|
|
60
56
|
assert.equal(ulw.skill, 'ultrawork');
|
|
@@ -99,6 +95,19 @@ describe('keyword detector swarm/team compatibility', () => {
|
|
|
99
95
|
assert.equal(match.skill, 'analyze');
|
|
100
96
|
assert.equal(match.keyword.toLowerCase(), '$analyze');
|
|
101
97
|
});
|
|
98
|
+
it('maps explicit $ultragoal invocation to ultragoal workflow skill', () => {
|
|
99
|
+
const match = detectPrimaryKeyword('$ultragoal split this release into durable goals');
|
|
100
|
+
assert.ok(match);
|
|
101
|
+
assert.equal(match.skill, 'ultragoal');
|
|
102
|
+
assert.equal(match.keyword.toLowerCase(), '$ultragoal');
|
|
103
|
+
});
|
|
104
|
+
it('maps intentful ultragoal prose without triggering artifact path mentions', () => {
|
|
105
|
+
const intentful = detectPrimaryKeyword('please run ultragoal workflow for this launch');
|
|
106
|
+
assert.ok(intentful);
|
|
107
|
+
assert.equal(intentful.skill, 'ultragoal');
|
|
108
|
+
const pathOnly = detectPrimaryKeyword('inspect .omx/ultragoal/goals.json');
|
|
109
|
+
assert.notEqual(pathOnly?.skill, 'ultragoal');
|
|
110
|
+
});
|
|
102
111
|
it('maps code-review keyword variants to code-review skill', () => {
|
|
103
112
|
const hyphen = detectPrimaryKeyword('run $code-review before merge');
|
|
104
113
|
assert.ok(hyphen);
|
|
@@ -107,6 +116,8 @@ describe('keyword detector swarm/team compatibility', () => {
|
|
|
107
116
|
const spaced = detectPrimaryKeyword('please do a code review');
|
|
108
117
|
assert.ok(spaced);
|
|
109
118
|
assert.equal(spaced.skill, 'code-review');
|
|
119
|
+
assert.equal(detectPrimaryKeyword('run $security-review before merge')?.skill, undefined);
|
|
120
|
+
assert.equal(detectPrimaryKeyword('please do a security review')?.skill, undefined);
|
|
110
121
|
});
|
|
111
122
|
it('supports explicit multi-skill invocation by prioritizing left-most $skill', () => {
|
|
112
123
|
const match = detectPrimaryKeyword('$ultraqa $analyze $code-review run now');
|
|
@@ -120,24 +131,6 @@ describe('keyword detector swarm/team compatibility', () => {
|
|
|
120
131
|
assert.equal(match.skill, 'team');
|
|
121
132
|
assert.match(match.keyword.toLowerCase(), /team/);
|
|
122
133
|
});
|
|
123
|
-
it('maps "swarm" to team orchestration skill', () => {
|
|
124
|
-
const match = detectPrimaryKeyword('please use swarm for this task');
|
|
125
|
-
assert.ok(match);
|
|
126
|
-
assert.equal(match.skill, 'team');
|
|
127
|
-
});
|
|
128
|
-
it('maps "coordinated swarm" phrase to team orchestration skill', () => {
|
|
129
|
-
const match = detectPrimaryKeyword('run a coordinated swarm for implementation');
|
|
130
|
-
assert.ok(match);
|
|
131
|
-
assert.equal(match.skill, 'team');
|
|
132
|
-
assert.match(match.keyword.toLowerCase(), /swarm/);
|
|
133
|
-
});
|
|
134
|
-
it('keeps swarm trigger priority aligned with explicit team invocation', () => {
|
|
135
|
-
const teamMatch = detectKeywords('use $team agents for this').find((entry) => entry.skill === 'team');
|
|
136
|
-
const swarmMatch = detectKeywords('use swarm for this').find((entry) => entry.skill === 'team');
|
|
137
|
-
assert.ok(teamMatch);
|
|
138
|
-
assert.ok(swarmMatch);
|
|
139
|
-
assert.equal(swarmMatch.priority, teamMatch.priority);
|
|
140
|
-
});
|
|
141
134
|
it('does not trigger team keyword from filesystem/team-state path text', () => {
|
|
142
135
|
const match = detectPrimaryKeyword('You have 1 new message(s). Read .omx/state/team/execute-plan/mailbox/worker-3.json, act now, reply with concrete progress, then continue assigned work or next feasible task.');
|
|
143
136
|
assert.equal(match, null);
|
|
@@ -175,10 +168,10 @@ describe('keyword detector swarm/team compatibility', () => {
|
|
|
175
168
|
assert.equal(match.skill, 'ralplan');
|
|
176
169
|
});
|
|
177
170
|
it('applies longest-match tie-breaker when priorities are equal', () => {
|
|
178
|
-
const match = detectPrimaryKeyword('please run a
|
|
171
|
+
const match = detectPrimaryKeyword('please run a deep interview for this');
|
|
179
172
|
assert.ok(match);
|
|
180
|
-
assert.equal(match.skill, '
|
|
181
|
-
assert.equal(match.keyword.toLowerCase(), '
|
|
173
|
+
assert.equal(match.skill, 'deep-interview');
|
|
174
|
+
assert.equal(match.keyword.toLowerCase(), 'deep interview');
|
|
182
175
|
});
|
|
183
176
|
it('maps "deep interview" phrase to deep-interview skill', () => {
|
|
184
177
|
const match = detectPrimaryKeyword('please run a deep interview before planning');
|
|
@@ -284,7 +277,7 @@ describe('explicit skill-name invocation requirement', () => {
|
|
|
284
277
|
});
|
|
285
278
|
});
|
|
286
279
|
describe('keyword registry coverage', () => {
|
|
287
|
-
it('includes key team
|
|
280
|
+
it('includes key team aliases in runtime keyword registry', () => {
|
|
288
281
|
const registryKeywords = new Set(KEYWORD_TRIGGER_DEFINITIONS.map((v) => v.keyword.toLowerCase()));
|
|
289
282
|
assert.ok(registryKeywords.has('$ultraqa'));
|
|
290
283
|
assert.ok(registryKeywords.has('$analyze'));
|
|
@@ -292,8 +285,6 @@ describe('keyword registry coverage', () => {
|
|
|
292
285
|
assert.ok(registryKeywords.has('code review'));
|
|
293
286
|
assert.ok(registryKeywords.has('$code-review'));
|
|
294
287
|
assert.ok(registryKeywords.has('coordinated team'));
|
|
295
|
-
assert.ok(registryKeywords.has('swarm'));
|
|
296
|
-
assert.ok(registryKeywords.has('coordinated swarm'));
|
|
297
288
|
assert.ok(registryKeywords.has('ouroboros'));
|
|
298
289
|
assert.ok(registryKeywords.has("don't assume"));
|
|
299
290
|
assert.ok(registryKeywords.has('interview me'));
|
|
@@ -301,6 +292,8 @@ describe('keyword registry coverage', () => {
|
|
|
301
292
|
assert.ok(registryKeywords.has('wiki add'));
|
|
302
293
|
assert.ok(registryKeywords.has('wiki lint'));
|
|
303
294
|
assert.ok(registryKeywords.has('$autoresearch'));
|
|
295
|
+
assert.ok(registryKeywords.has('$ultragoal'));
|
|
296
|
+
assert.ok(registryKeywords.has('ultragoal'));
|
|
304
297
|
});
|
|
305
298
|
});
|
|
306
299
|
describe('keyword detector skill-active-state lifecycle', () => {
|
|
@@ -1074,6 +1067,26 @@ describe('keyword detector skill-active-state lifecycle', () => {
|
|
|
1074
1067
|
await rm(cwd, { recursive: true, force: true });
|
|
1075
1068
|
}
|
|
1076
1069
|
});
|
|
1070
|
+
it('records ultragoal as a prompt skill without seeding unrelated mode state', async () => {
|
|
1071
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-keyword-state-ultragoal-'));
|
|
1072
|
+
const stateDir = join(cwd, '.omx', 'state');
|
|
1073
|
+
try {
|
|
1074
|
+
await mkdir(stateDir, { recursive: true });
|
|
1075
|
+
const result = await recordSkillActivation({
|
|
1076
|
+
stateDir,
|
|
1077
|
+
text: '$ultragoal split this launch into durable goals',
|
|
1078
|
+
});
|
|
1079
|
+
assert.ok(result);
|
|
1080
|
+
assert.equal(result.skill, 'ultragoal');
|
|
1081
|
+
assert.equal(result.keyword, '$ultragoal');
|
|
1082
|
+
assert.equal(result.initialized_mode, undefined);
|
|
1083
|
+
assert.equal(result.initialized_state_path, undefined);
|
|
1084
|
+
assert.equal(existsSync(join(stateDir, 'ultragoal-state.json')), false);
|
|
1085
|
+
}
|
|
1086
|
+
finally {
|
|
1087
|
+
await rm(cwd, { recursive: true, force: true });
|
|
1088
|
+
}
|
|
1089
|
+
});
|
|
1077
1090
|
it('emits a warning when skill-active-state persistence fails', async () => {
|
|
1078
1091
|
const warnings = [];
|
|
1079
1092
|
mock.method(console, 'warn', (...args) => {
|
|
@@ -1644,9 +1657,9 @@ describe('applyRalplanGate', () => {
|
|
|
1644
1657
|
assert.equal(result.gateApplied, false);
|
|
1645
1658
|
});
|
|
1646
1659
|
it('preserves non-execution keywords when gating', () => {
|
|
1647
|
-
const result = applyRalplanGate(['ralph', '
|
|
1660
|
+
const result = applyRalplanGate(['ralph', 'analyze'], 'ralph analyze this');
|
|
1648
1661
|
assert.equal(result.gateApplied, true);
|
|
1649
|
-
assert.ok(result.keywords.includes('
|
|
1662
|
+
assert.ok(result.keywords.includes('analyze'));
|
|
1650
1663
|
assert.ok(result.keywords.includes('ralplan'));
|
|
1651
1664
|
assert.ok(!result.keywords.includes('ralph'));
|
|
1652
1665
|
});
|