oh-my-codex 0.16.0 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/README.md +2 -2
- package/crates/omx-explore/src/main.rs +434 -28
- package/dist/agents/__tests__/native-config.test.js +50 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js +3 -2
- package/dist/agents/native-config.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +1 -0
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +120 -3
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/imagegen-continuation.test.d.ts +2 -0
- package/dist/cli/__tests__/imagegen-continuation.test.d.ts.map +1 -0
- package/dist/cli/__tests__/imagegen-continuation.test.js +135 -0
- package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -0
- package/dist/cli/__tests__/index.test.js +182 -18
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +88 -2
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/ralph.test.js +62 -0
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +48 -0
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.js +12 -0
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +465 -12
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +50 -5
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.js +6 -2
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +211 -12
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +11 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +124 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ralph.d.ts.map +1 -1
- package/dist/cli/ralph.js +37 -3
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +100 -9
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts +1 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +42 -7
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/ultragoal.d.ts +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +29 -8
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +2 -1
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/config/__tests__/codex-hooks.test.js +97 -2
- package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +22 -0
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +18 -1
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/__tests__/wiki-config-contract.test.js +2 -1
- package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -1
- package/dist/config/codex-hooks.d.ts +17 -3
- package/dist/config/codex-hooks.d.ts.map +1 -1
- package/dist/config/codex-hooks.js +102 -2
- package/dist/config/codex-hooks.js.map +1 -1
- package/dist/config/generator.d.ts +4 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +69 -12
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +6 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +37 -0
- package/dist/config/models.js.map +1 -1
- package/dist/exec/followup.d.ts +1 -0
- package/dist/exec/followup.d.ts.map +1 -1
- package/dist/exec/followup.js +9 -3
- package/dist/exec/followup.js.map +1 -1
- package/dist/hooks/__tests__/anti-slop-workflow.test.js +19 -0
- package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js +19 -2
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js +40 -0
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/foreground-isolation-contract.test.js +28 -0
- package/dist/hooks/__tests__/foreground-isolation-contract.test.js.map +1 -0
- package/dist/hooks/__tests__/keyword-detector.test.js +37 -25
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +10 -4
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/session.test.js +32 -0
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/__tests__/wiki-docs-contract.test.js +6 -4
- package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -1
- package/dist/hooks/codebase-map.d.ts.map +1 -1
- package/dist/hooks/codebase-map.js +3 -2
- package/dist/hooks/codebase-map.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +6 -4
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/logging.d.ts.map +1 -1
- package/dist/hooks/extensibility/logging.js +3 -2
- package/dist/hooks/extensibility/logging.js.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.js +4 -3
- package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +2 -4
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +22 -12
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/hud-tmux-injection.test.js +8 -7
- package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +1 -1
- package/dist/hud/__tests__/state.test.js +24 -0
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/index.js +1 -1
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +22 -8
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/tmux.js +1 -1
- package/dist/hud/tmux.js.map +1 -1
- package/dist/imagegen/continuation.d.ts +44 -0
- package/dist/imagegen/continuation.d.ts.map +1 -0
- package/dist/imagegen/continuation.js +220 -0
- package/dist/imagegen/continuation.js.map +1 -0
- package/dist/mcp/__tests__/bootstrap.test.js +47 -2
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +49 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +145 -6
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/__tests__/wiki-server.test.js +97 -1
- package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
- package/dist/mcp/bootstrap.d.ts +2 -0
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +95 -15
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/lifecycle-telemetry.d.ts +16 -0
- package/dist/mcp/lifecycle-telemetry.d.ts.map +1 -0
- package/dist/mcp/lifecycle-telemetry.js +95 -0
- package/dist/mcp/lifecycle-telemetry.js.map +1 -0
- package/dist/mcp/wiki-server.d.ts.map +1 -1
- package/dist/mcp/wiki-server.js +11 -2
- package/dist/mcp/wiki-server.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +274 -5
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/stages/team-exec.d.ts +2 -0
- package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
- package/dist/pipeline/stages/team-exec.js +51 -26
- package/dist/pipeline/stages/team-exec.js.map +1 -1
- package/dist/planning/__tests__/artifacts.test.js +138 -3
- package/dist/planning/__tests__/artifacts.test.js.map +1 -1
- package/dist/planning/__tests__/context-pack-status.test.d.ts +2 -0
- package/dist/planning/__tests__/context-pack-status.test.d.ts.map +1 -0
- package/dist/planning/__tests__/context-pack-status.test.js +271 -0
- package/dist/planning/__tests__/context-pack-status.test.js.map +1 -0
- package/dist/planning/artifacts.d.ts +12 -1
- package/dist/planning/artifacts.d.ts.map +1 -1
- package/dist/planning/artifacts.js +32 -9
- package/dist/planning/artifacts.js.map +1 -1
- package/dist/planning/context-pack-status.d.ts +42 -0
- package/dist/planning/context-pack-status.d.ts.map +1 -0
- package/dist/planning/context-pack-status.js +479 -0
- package/dist/planning/context-pack-status.js.map +1 -0
- package/dist/runtime/__tests__/process-tree.test.d.ts +2 -0
- package/dist/runtime/__tests__/process-tree.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/process-tree.test.js +107 -0
- package/dist/runtime/__tests__/process-tree.test.js.map +1 -0
- package/dist/runtime/process-tree.d.ts +28 -0
- package/dist/runtime/process-tree.d.ts.map +1 -0
- package/dist/runtime/process-tree.js +230 -0
- package/dist/runtime/process-tree.js.map +1 -0
- package/dist/scripts/__tests__/codex-native-hook.test.js +267 -2
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/notify-state-io.test.d.ts +2 -0
- package/dist/scripts/__tests__/notify-state-io.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/notify-state-io.test.js +40 -0
- package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -0
- package/dist/scripts/codex-execution-surface.d.ts +1 -1
- package/dist/scripts/codex-execution-surface.d.ts.map +1 -1
- package/dist/scripts/codex-execution-surface.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +141 -9
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.js +6 -9
- package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
- package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
- package/dist/scripts/notify-hook/process-runner.js +4 -1
- package/dist/scripts/notify-hook/process-runner.js.map +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +4 -7
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook.js +25 -3
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/verify-native-agents.d.ts.map +1 -1
- package/dist/scripts/verify-native-agents.js +3 -1
- package/dist/scripts/verify-native-agents.js.map +1 -1
- package/dist/sidecar/__tests__/tmux.test.js +1 -1
- package/dist/sidecar/__tests__/tmux.test.js.map +1 -1
- package/dist/sidecar/tmux.js +1 -1
- package/dist/sidecar/tmux.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +79 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +10 -18
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/__tests__/workflow-transition.test.js +45 -1
- package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +1 -20
- 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 +28 -18
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
- package/dist/state/workflow-transition-reconcile.js +3 -2
- package/dist/state/workflow-transition-reconcile.js.map +1 -1
- package/dist/state/workflow-transition.js +2 -2
- package/dist/state/workflow-transition.js.map +1 -1
- package/dist/team/__tests__/approved-execution.test.js +96 -0
- package/dist/team/__tests__/approved-execution.test.js.map +1 -1
- package/dist/team/__tests__/followup-planner.test.js +16 -0
- package/dist/team/__tests__/followup-planner.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +16 -0
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/repo-aware-decomposition.test.js +20 -0
- package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -1
- package/dist/team/__tests__/runtime-cli.test.js +16 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +209 -11
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +110 -0
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +9 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-runtime-identity.test.js +6 -0
- package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
- package/dist/team/approved-execution.d.ts +13 -0
- package/dist/team/approved-execution.d.ts.map +1 -1
- package/dist/team/approved-execution.js +40 -22
- package/dist/team/approved-execution.js.map +1 -1
- package/dist/team/followup-planner.d.ts +1 -0
- package/dist/team/followup-planner.d.ts.map +1 -1
- package/dist/team/followup-planner.js +9 -9
- package/dist/team/followup-planner.js.map +1 -1
- package/dist/team/model-contract.d.ts +1 -1
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +4 -3
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/repo-aware-decomposition.d.ts +1 -0
- package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
- package/dist/team/repo-aware-decomposition.js +5 -1
- package/dist/team/repo-aware-decomposition.js.map +1 -1
- package/dist/team/runtime-cli.d.ts +4 -0
- package/dist/team/runtime-cli.d.ts.map +1 -1
- package/dist/team/runtime-cli.js +14 -1
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime.d.ts +1 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +46 -16
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +13 -6
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +7 -0
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +129 -4
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.d.ts +2 -0
- package/dist/ultragoal/__tests__/docs-contract.test.d.ts.map +1 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js +31 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -0
- package/dist/ultragoal/artifacts.d.ts +6 -2
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +108 -4
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/utils/paths.d.ts +3 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +6 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +44 -14
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/dist/wiki/__tests__/ingest.test.js +35 -1
- package/dist/wiki/__tests__/ingest.test.js.map +1 -1
- package/dist/wiki/__tests__/lint.test.js +14 -1
- package/dist/wiki/__tests__/lint.test.js.map +1 -1
- package/dist/wiki/__tests__/query.test.js +28 -3
- package/dist/wiki/__tests__/query.test.js.map +1 -1
- package/dist/wiki/__tests__/session-hooks.test.js +30 -2
- package/dist/wiki/__tests__/session-hooks.test.js.map +1 -1
- package/dist/wiki/__tests__/storage.test.js +62 -22
- package/dist/wiki/__tests__/storage.test.js.map +1 -1
- package/dist/wiki/index.d.ts +2 -2
- package/dist/wiki/index.d.ts.map +1 -1
- package/dist/wiki/index.js +2 -2
- package/dist/wiki/index.js.map +1 -1
- package/dist/wiki/ingest.js +2 -2
- package/dist/wiki/ingest.js.map +1 -1
- package/dist/wiki/lifecycle.d.ts +5 -0
- package/dist/wiki/lifecycle.d.ts.map +1 -1
- package/dist/wiki/lifecycle.js +31 -4
- package/dist/wiki/lifecycle.js.map +1 -1
- package/dist/wiki/lint.d.ts.map +1 -1
- package/dist/wiki/lint.js +12 -8
- package/dist/wiki/lint.js.map +1 -1
- package/dist/wiki/query.d.ts.map +1 -1
- package/dist/wiki/query.js +3 -2
- package/dist/wiki/query.js.map +1 -1
- package/dist/wiki/storage.d.ts +4 -0
- package/dist/wiki/storage.d.ts.map +1 -1
- package/dist/wiki/storage.js +54 -18
- package/dist/wiki/storage.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +9 -0
- package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +25 -2
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/plan/SKILL.md +7 -4
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +13 -3
- package/plugins/oh-my-codex/skills/team/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +11 -7
- package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +8 -0
- package/plugins/oh-my-codex/skills/wiki/SKILL.md +5 -5
- package/prompts/planner.md +1 -1
- package/skills/ai-slop-cleaner/SKILL.md +9 -0
- package/skills/deep-interview/SKILL.md +25 -2
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/plan/SKILL.md +7 -4
- package/skills/ralplan/SKILL.md +13 -3
- package/skills/team/SKILL.md +2 -2
- package/skills/ultragoal/SKILL.md +11 -7
- package/skills/visual-ralph/SKILL.md +8 -0
- package/skills/wiki/SKILL.md +5 -5
- package/src/scripts/__tests__/codex-native-hook.test.ts +302 -2
- package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
- package/src/scripts/codex-execution-surface.ts +2 -0
- package/src/scripts/codex-native-hook.ts +163 -16
- package/src/scripts/notify-hook/managed-tmux.ts +6 -7
- package/src/scripts/notify-hook/process-runner.ts +4 -1
- package/src/scripts/notify-hook/state-io.ts +5 -7
- package/src/scripts/notify-hook.ts +26 -3
- package/src/scripts/verify-native-agents.ts +3 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
3
4
|
import { execFileSync, spawn } from 'child_process';
|
|
4
5
|
import { mkdtemp, rm, writeFile, readFile, mkdir, chmod, readdir } from 'fs/promises';
|
|
5
|
-
import { join } from 'path';
|
|
6
|
+
import { join, relative } from 'path';
|
|
6
7
|
import { tmpdir } from 'os';
|
|
7
8
|
import { existsSync } from 'fs';
|
|
8
9
|
import { HUD_TMUX_TEAM_HEIGHT_LINES } from '../../hud/constants.js';
|
|
@@ -32,6 +33,45 @@ async function addWorktree(repo, branchName, pathPrefix) {
|
|
|
32
33
|
execFileSync('git', ['worktree', 'add', '-b', branchName, worktreePath, 'HEAD'], { cwd: repo, stdio: 'ignore' });
|
|
33
34
|
return worktreePath;
|
|
34
35
|
}
|
|
36
|
+
function computeGitBlobSha1(content) {
|
|
37
|
+
const buffer = Buffer.from(content, 'utf-8');
|
|
38
|
+
const header = Buffer.from(`blob ${buffer.length}\0`, 'utf-8');
|
|
39
|
+
return createHash('sha1').update(header).update(buffer).digest('hex');
|
|
40
|
+
}
|
|
41
|
+
function canonicalContextPackRelativePath(slug) {
|
|
42
|
+
return `.omx/context/context-20260507T120000Z-${slug}.json`;
|
|
43
|
+
}
|
|
44
|
+
function buildContextPackOutcome(relativePackPath) {
|
|
45
|
+
return [
|
|
46
|
+
'## Context Pack Outcome',
|
|
47
|
+
'',
|
|
48
|
+
`- pack: created \`${relativePackPath}\``,
|
|
49
|
+
].join('\n');
|
|
50
|
+
}
|
|
51
|
+
async function writeReadyContextPack(cwd, slug, prdPath, testSpecPath) {
|
|
52
|
+
const contextDir = join(cwd, '.omx', 'context');
|
|
53
|
+
const packPath = join(cwd, canonicalContextPackRelativePath(slug));
|
|
54
|
+
const prdContent = await readFile(prdPath, 'utf-8');
|
|
55
|
+
const testSpecContent = await readFile(testSpecPath, 'utf-8');
|
|
56
|
+
await mkdir(contextDir, { recursive: true });
|
|
57
|
+
await writeFile(packPath, JSON.stringify({
|
|
58
|
+
slug,
|
|
59
|
+
basis: {
|
|
60
|
+
prd: {
|
|
61
|
+
path: relative(cwd, prdPath).replaceAll('\\', '/'),
|
|
62
|
+
sha1: computeGitBlobSha1(prdContent),
|
|
63
|
+
},
|
|
64
|
+
testSpecs: [{
|
|
65
|
+
path: relative(cwd, testSpecPath).replaceAll('\\', '/'),
|
|
66
|
+
sha1: computeGitBlobSha1(testSpecContent),
|
|
67
|
+
}],
|
|
68
|
+
},
|
|
69
|
+
entries: ['scope', 'build', 'verify'].map((role, index) => ({
|
|
70
|
+
path: `src/${role}-${index}.ts`,
|
|
71
|
+
roles: [role],
|
|
72
|
+
})),
|
|
73
|
+
}, null, 2));
|
|
74
|
+
}
|
|
35
75
|
async function attachDirtyWorkerRepo(teamName, cwd, repoName) {
|
|
36
76
|
const repo = join(cwd, repoName);
|
|
37
77
|
await mkdir(repo, { recursive: true });
|
|
@@ -61,6 +101,7 @@ function withIsolatedDefaultModelEnv(run) {
|
|
|
61
101
|
'OMX_DEFAULT_STANDARD_MODEL',
|
|
62
102
|
'OMX_DEFAULT_SPARK_MODEL',
|
|
63
103
|
'OMX_SPARK_MODEL',
|
|
104
|
+
'OMX_TEAM_WORKER_LAUNCH_ARGS',
|
|
64
105
|
]) {
|
|
65
106
|
savedEnv.set(key, process.env[key]);
|
|
66
107
|
delete process.env[key];
|
|
@@ -86,6 +127,7 @@ async function withIsolatedDefaultModelEnvAsync(run) {
|
|
|
86
127
|
'OMX_DEFAULT_STANDARD_MODEL',
|
|
87
128
|
'OMX_DEFAULT_SPARK_MODEL',
|
|
88
129
|
'OMX_SPARK_MODEL',
|
|
130
|
+
'OMX_TEAM_WORKER_LAUNCH_ARGS',
|
|
89
131
|
]) {
|
|
90
132
|
savedEnv.set(key, process.env[key]);
|
|
91
133
|
delete process.env[key];
|
|
@@ -2840,7 +2882,7 @@ process.exit(0);
|
|
|
2840
2882
|
await rm(cwd, { recursive: true, force: true });
|
|
2841
2883
|
}
|
|
2842
2884
|
});
|
|
2843
|
-
it('startTeam preserves routed task roles into team state and worker launch args', async () => {
|
|
2885
|
+
it('startTeam preserves routed task roles into team state and override-aware worker launch args', async () => {
|
|
2844
2886
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-role-routing-'));
|
|
2845
2887
|
const binDir = join(cwd, 'bin');
|
|
2846
2888
|
const fakeCodexPath = join(binDir, 'codex');
|
|
@@ -2875,10 +2917,19 @@ process.on('SIGTERM', () => process.exit(0));
|
|
|
2875
2917
|
delete process.env.OMX_DEFAULT_STANDARD_MODEL;
|
|
2876
2918
|
let runtime = null;
|
|
2877
2919
|
try {
|
|
2878
|
-
runtime = await withIsolatedDefaultModelEnvAsync(async () =>
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2920
|
+
runtime = await withIsolatedDefaultModelEnvAsync(async () => {
|
|
2921
|
+
assert.ok(process.env.CODEX_HOME, 'isolated CODEX_HOME should be set');
|
|
2922
|
+
await mkdir(process.env.CODEX_HOME, { recursive: true });
|
|
2923
|
+
await writeFile(join(process.env.CODEX_HOME, '.omx-config.json'), JSON.stringify({
|
|
2924
|
+
agentReasoning: {
|
|
2925
|
+
writer: 'xhigh',
|
|
2926
|
+
},
|
|
2927
|
+
}));
|
|
2928
|
+
return await withMockPromptModeCodexAllowed(() => withoutTeamWorkerEnv(() => startTeam('team-role-routing', 'heuristic routing handoff', 'executor', 2, [
|
|
2929
|
+
{ subject: 'test routing report only', description: 'test routing report only', owner: 'worker-1', role: 'test-engineer' },
|
|
2930
|
+
{ subject: 'document routing report only', description: 'document routing report only', owner: 'worker-2', role: 'writer' },
|
|
2931
|
+
], cwd)));
|
|
2932
|
+
});
|
|
2882
2933
|
assert.equal(runtime.config.worker_launch_mode, 'prompt');
|
|
2883
2934
|
assert.equal(runtime.config.workers[0]?.role, 'test-engineer');
|
|
2884
2935
|
assert.equal(runtime.config.workers[1]?.role, 'writer');
|
|
@@ -2917,7 +2968,7 @@ process.on('SIGTERM', () => process.exit(0));
|
|
|
2917
2968
|
assert.match(worker1Joined, /model_reasoning_effort="medium"/);
|
|
2918
2969
|
assert.match(worker1Joined, /model_instructions_file=.*worker-1\/AGENTS\.md/);
|
|
2919
2970
|
assert.match(worker1Joined, /--model gpt-5\.5/);
|
|
2920
|
-
assert.match(worker2Joined, /model_reasoning_effort="
|
|
2971
|
+
assert.match(worker2Joined, /model_reasoning_effort="xhigh"/);
|
|
2921
2972
|
assert.match(worker2Joined, /model_instructions_file=.*worker-2\/AGENTS\.md/);
|
|
2922
2973
|
assert.match(worker2Joined, /--model gpt-5\.5/);
|
|
2923
2974
|
await shutdownTeam(runtime.teamName, cwd, { force: true });
|
|
@@ -5115,6 +5166,56 @@ esac
|
|
|
5115
5166
|
await rm(cwd, { recursive: true, force: true });
|
|
5116
5167
|
}
|
|
5117
5168
|
});
|
|
5169
|
+
it('resumeTeam fails closed when the persisted approved binding is ambiguous', async () => {
|
|
5170
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-resume-ambiguous-'));
|
|
5171
|
+
const approvedTask = 'Execute approved issue 2111 plan';
|
|
5172
|
+
try {
|
|
5173
|
+
await initTeamState('team-approved-resume', 'approved resume test', 'executor', 1, cwd);
|
|
5174
|
+
await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
|
|
5175
|
+
const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-2111.md');
|
|
5176
|
+
await writeFile(prdPath, [
|
|
5177
|
+
'# Approved plan',
|
|
5178
|
+
'',
|
|
5179
|
+
`Launch via omx team 2:executor "${approvedTask}"`,
|
|
5180
|
+
`Launch via omx team 5:debugger "${approvedTask}"`,
|
|
5181
|
+
].join('\n'));
|
|
5182
|
+
await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-2111.md'), '# Test spec\n');
|
|
5183
|
+
await writePersistedApprovedTeamExecutionBinding('team-approved-resume', cwd, {
|
|
5184
|
+
prd_path: prdPath,
|
|
5185
|
+
task: approvedTask,
|
|
5186
|
+
});
|
|
5187
|
+
await assert.rejects(() => resumeTeam('team-approved-resume', cwd), /approved_execution_binding_ambiguous:.*Execute approved issue 2111 plan/);
|
|
5188
|
+
}
|
|
5189
|
+
finally {
|
|
5190
|
+
await rm(cwd, { recursive: true, force: true });
|
|
5191
|
+
}
|
|
5192
|
+
});
|
|
5193
|
+
it('resumeTeam fails closed when the persisted approved binding is nonready', async () => {
|
|
5194
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-resume-nonready-'));
|
|
5195
|
+
try {
|
|
5196
|
+
await initTeamState('team-approved-resume', 'approved resume test', 'executor', 1, cwd);
|
|
5197
|
+
await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
|
|
5198
|
+
const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-2112.md');
|
|
5199
|
+
await writeFile(prdPath, [
|
|
5200
|
+
'# Approved plan',
|
|
5201
|
+
'',
|
|
5202
|
+
'## Context Pack Outcome',
|
|
5203
|
+
'',
|
|
5204
|
+
'- pack: created `.omx/context/context-20260507T120000Z-other.json`',
|
|
5205
|
+
'',
|
|
5206
|
+
'Launch via omx team 1:executor "Execute approved issue 2112 plan"',
|
|
5207
|
+
].join('\n'));
|
|
5208
|
+
await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-2112.md'), '# Test spec\n');
|
|
5209
|
+
await writePersistedApprovedTeamExecutionBinding('team-approved-resume', cwd, {
|
|
5210
|
+
prd_path: prdPath,
|
|
5211
|
+
task: 'Execute approved issue 2112 plan',
|
|
5212
|
+
});
|
|
5213
|
+
await assert.rejects(() => resumeTeam('team-approved-resume', cwd), /approved_execution_binding_nonready:invalid:.*Execute approved issue 2112 plan/);
|
|
5214
|
+
}
|
|
5215
|
+
finally {
|
|
5216
|
+
await rm(cwd, { recursive: true, force: true });
|
|
5217
|
+
}
|
|
5218
|
+
});
|
|
5118
5219
|
it('resumeTeam resolves approved binding continuity against the persisted leader cwd', async () => {
|
|
5119
5220
|
const teamName = 'team-approved-shared-root';
|
|
5120
5221
|
const leaderCwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-leader-'));
|
|
@@ -5312,14 +5413,23 @@ esac
|
|
|
5312
5413
|
const fakeCodexPath = join(binDir, 'codex');
|
|
5313
5414
|
await mkdir(binDir, { recursive: true });
|
|
5314
5415
|
await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
|
|
5315
|
-
|
|
5316
|
-
|
|
5416
|
+
const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-1314.md');
|
|
5417
|
+
const testSpecPath = join(cwd, '.omx', 'plans', 'test-spec-issue-1314.md');
|
|
5418
|
+
await writeFile(prdPath, [
|
|
5419
|
+
'# Approved plan',
|
|
5420
|
+
'',
|
|
5421
|
+
buildContextPackOutcome(canonicalContextPackRelativePath('issue-1314')),
|
|
5422
|
+
'',
|
|
5423
|
+
'Launch via omx team 1:executor "Execute approved issue 1314 plan"',
|
|
5424
|
+
].join('\n'));
|
|
5425
|
+
await writeFile(testSpecPath, '# Test spec\n');
|
|
5426
|
+
await writeReadyContextPack(cwd, 'issue-1314', prdPath, testSpecPath);
|
|
5317
5427
|
await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
|
|
5318
5428
|
let runtime = null;
|
|
5319
5429
|
try {
|
|
5320
5430
|
runtime = await withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding', 'approved binding persistence test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
|
|
5321
5431
|
approvedExecution: {
|
|
5322
|
-
prd_path:
|
|
5432
|
+
prd_path: prdPath,
|
|
5323
5433
|
task: 'Execute approved issue 1314 plan',
|
|
5324
5434
|
command: 'omx team 1:executor "Execute approved issue 1314 plan"',
|
|
5325
5435
|
},
|
|
@@ -5327,7 +5437,7 @@ esac
|
|
|
5327
5437
|
const bindingPath = join(runtime.config.team_state_root ?? join(cwd, '.omx', 'state'), 'team', runtime.teamName, 'approved-execution.json');
|
|
5328
5438
|
const binding = JSON.parse(await readFile(bindingPath, 'utf-8'));
|
|
5329
5439
|
assert.deepEqual(binding, {
|
|
5330
|
-
prd_path:
|
|
5440
|
+
prd_path: prdPath,
|
|
5331
5441
|
task: 'Execute approved issue 1314 plan',
|
|
5332
5442
|
command: 'omx team 1:executor "Execute approved issue 1314 plan"',
|
|
5333
5443
|
});
|
|
@@ -5340,6 +5450,65 @@ esac
|
|
|
5340
5450
|
await rm(cwd, { recursive: true, force: true });
|
|
5341
5451
|
}
|
|
5342
5452
|
});
|
|
5453
|
+
it('startTeam keeps explicit plan-only approved bindings on the generic path', async () => {
|
|
5454
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-plan-only-'));
|
|
5455
|
+
const binDir = join(cwd, 'bin');
|
|
5456
|
+
const fakeCodexPath = join(binDir, 'codex');
|
|
5457
|
+
await mkdir(binDir, { recursive: true });
|
|
5458
|
+
await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
|
|
5459
|
+
await writeFile(join(cwd, '.omx', 'plans', 'prd-issue-1314-plan-only.md'), '# Approved plan\n\nLaunch via omx team 1:executor "Execute approved issue 1314 plan-only"\n');
|
|
5460
|
+
await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-1314-plan-only.md'), '# Test spec\n');
|
|
5461
|
+
await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
|
|
5462
|
+
let runtime = null;
|
|
5463
|
+
try {
|
|
5464
|
+
runtime = await withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding-plan-only', 'approved binding generic fallback test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
|
|
5465
|
+
approvedExecution: {
|
|
5466
|
+
prd_path: join(cwd, '.omx', 'plans', 'prd-issue-1314-plan-only.md'),
|
|
5467
|
+
task: 'Execute approved issue 1314 plan-only',
|
|
5468
|
+
command: 'omx team 1:executor "Execute approved issue 1314 plan-only"',
|
|
5469
|
+
},
|
|
5470
|
+
})));
|
|
5471
|
+
const bindingPath = join(runtime.config.team_state_root ?? join(cwd, '.omx', 'state'), 'team', runtime.teamName, 'approved-execution.json');
|
|
5472
|
+
assert.equal(existsSync(bindingPath), false);
|
|
5473
|
+
}
|
|
5474
|
+
finally {
|
|
5475
|
+
if (runtime) {
|
|
5476
|
+
await shutdownTeam(runtime.teamName, cwd, { force: true }).catch(() => { });
|
|
5477
|
+
}
|
|
5478
|
+
await rm(cwd, { recursive: true, force: true });
|
|
5479
|
+
}
|
|
5480
|
+
});
|
|
5481
|
+
it('startTeam fails closed when an explicit approved execution binding is nonready', async () => {
|
|
5482
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-nonready-'));
|
|
5483
|
+
const binDir = join(cwd, 'bin');
|
|
5484
|
+
const fakeCodexPath = join(binDir, 'codex');
|
|
5485
|
+
await mkdir(binDir, { recursive: true });
|
|
5486
|
+
await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
|
|
5487
|
+
const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-1314-nonready.md');
|
|
5488
|
+
await writeFile(prdPath, [
|
|
5489
|
+
'# Approved plan',
|
|
5490
|
+
'',
|
|
5491
|
+
'## Context Pack Outcome',
|
|
5492
|
+
'',
|
|
5493
|
+
'- pack: created `.omx/context/context-20260507T120000Z-other.json`',
|
|
5494
|
+
'',
|
|
5495
|
+
'Launch via omx team 1:executor "Execute approved issue 1314 nonready plan"',
|
|
5496
|
+
].join('\n'));
|
|
5497
|
+
await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-1314-nonready.md'), '# Test spec\n');
|
|
5498
|
+
await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
|
|
5499
|
+
try {
|
|
5500
|
+
await assert.rejects(() => withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding-nonready', 'approved binding nonready start test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
|
|
5501
|
+
approvedExecution: {
|
|
5502
|
+
prd_path: prdPath,
|
|
5503
|
+
task: 'Execute approved issue 1314 nonready plan',
|
|
5504
|
+
},
|
|
5505
|
+
}))), /approved_execution_binding_nonready:invalid:.*Execute approved issue 1314 nonready plan/);
|
|
5506
|
+
assert.equal(existsSync(join(cwd, '.omx', 'state', 'team', 'team-approved-binding-nonready')), false);
|
|
5507
|
+
}
|
|
5508
|
+
finally {
|
|
5509
|
+
await rm(cwd, { recursive: true, force: true });
|
|
5510
|
+
}
|
|
5511
|
+
});
|
|
5343
5512
|
it('startTeam fails closed when an explicit approved execution binding is stale', async () => {
|
|
5344
5513
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-stale-'));
|
|
5345
5514
|
const binDir = join(cwd, 'bin');
|
|
@@ -5364,6 +5533,35 @@ esac
|
|
|
5364
5533
|
await rm(cwd, { recursive: true, force: true });
|
|
5365
5534
|
}
|
|
5366
5535
|
});
|
|
5536
|
+
it('startTeam fails closed when an explicit approved execution binding is ambiguous', async () => {
|
|
5537
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-approved-binding-ambiguous-'));
|
|
5538
|
+
const binDir = join(cwd, 'bin');
|
|
5539
|
+
const fakeCodexPath = join(binDir, 'codex');
|
|
5540
|
+
const approvedTask = 'Execute approved issue 1316 plan';
|
|
5541
|
+
await mkdir(binDir, { recursive: true });
|
|
5542
|
+
await mkdir(join(cwd, '.omx', 'plans'), { recursive: true });
|
|
5543
|
+
const prdPath = join(cwd, '.omx', 'plans', 'prd-issue-1316.md');
|
|
5544
|
+
await writeFile(prdPath, [
|
|
5545
|
+
'# Approved plan',
|
|
5546
|
+
'',
|
|
5547
|
+
`Launch via omx team 2:executor "${approvedTask}"`,
|
|
5548
|
+
`Launch via omx team 5:debugger "${approvedTask}"`,
|
|
5549
|
+
].join('\n'));
|
|
5550
|
+
await writeFile(join(cwd, '.omx', 'plans', 'test-spec-issue-1316.md'), '# Test spec\n');
|
|
5551
|
+
await writeFakePromptWorkerBinary(fakeCodexPath, `setTimeout(() => {}, 5000);`);
|
|
5552
|
+
try {
|
|
5553
|
+
await assert.rejects(() => withPromptModeCodexEnv(binDir, {}, () => withoutTeamWorkerEnv(() => startTeam('team-approved-binding-ambiguous', 'approved binding ambiguous start test', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd, {
|
|
5554
|
+
approvedExecution: {
|
|
5555
|
+
prd_path: prdPath,
|
|
5556
|
+
task: approvedTask,
|
|
5557
|
+
},
|
|
5558
|
+
}))), /approved_execution_binding_ambiguous:.*Execute approved issue 1316 plan/);
|
|
5559
|
+
assert.equal(existsSync(join(cwd, '.omx', 'state', 'team', 'team-approved-binding-ambiguous')), false);
|
|
5560
|
+
}
|
|
5561
|
+
finally {
|
|
5562
|
+
await rm(cwd, { recursive: true, force: true });
|
|
5563
|
+
}
|
|
5564
|
+
});
|
|
5367
5565
|
it('startTeam remaps repo-aware DAG dependencies after concrete task IDs are created', async () => {
|
|
5368
5566
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-'));
|
|
5369
5567
|
const binDir = join(cwd, 'bin');
|