oh-my-codex 0.20.2 → 0.20.5
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 +36 -18
- package/Cargo.toml +1 -1
- package/README.md +28 -2
- package/crates/omx-runtime/Cargo.toml +4 -0
- package/crates/omx-runtime/src/main.rs +415 -2
- package/crates/omx-runtime/tests/execution.rs +483 -0
- package/crates/omx-runtime-core/src/dispatch.rs +96 -10
- package/crates/omx-runtime-core/src/engine.rs +839 -29
- package/crates/omx-runtime-core/src/lib.rs +8 -0
- package/dist/adapt/__tests__/herdr-target.test.d.ts +2 -0
- package/dist/adapt/__tests__/herdr-target.test.d.ts.map +1 -0
- package/dist/adapt/__tests__/herdr-target.test.js +72 -0
- package/dist/adapt/__tests__/herdr-target.test.js.map +1 -0
- package/dist/adapt/contracts.d.ts +1 -1
- package/dist/adapt/contracts.d.ts.map +1 -1
- package/dist/adapt/contracts.js +1 -1
- package/dist/adapt/contracts.js.map +1 -1
- package/dist/adapt/herdr/__tests__/authority.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/authority.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/authority.test.js +49 -0
- package/dist/adapt/herdr/__tests__/authority.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/bridge.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/bridge.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/bridge.test.js +176 -0
- package/dist/adapt/herdr/__tests__/bridge.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.js +45 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/semantic.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/semantic.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/semantic.test.js +130 -0
- package/dist/adapt/herdr/__tests__/semantic.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.js +54 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.js +104 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/team-map.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/team-map.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/team-map.test.js +46 -0
- package/dist/adapt/herdr/__tests__/team-map.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/transport.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/transport.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/transport.test.js +160 -0
- package/dist/adapt/herdr/__tests__/transport.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/wiring.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/wiring.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/wiring.test.js +118 -0
- package/dist/adapt/herdr/__tests__/wiring.test.js.map +1 -0
- package/dist/adapt/herdr/authority.d.ts +34 -0
- package/dist/adapt/herdr/authority.d.ts.map +1 -0
- package/dist/adapt/herdr/authority.js +71 -0
- package/dist/adapt/herdr/authority.js.map +1 -0
- package/dist/adapt/herdr/bridge.d.ts +84 -0
- package/dist/adapt/herdr/bridge.d.ts.map +1 -0
- package/dist/adapt/herdr/bridge.js +222 -0
- package/dist/adapt/herdr/bridge.js.map +1 -0
- package/dist/adapt/herdr/sanitize.d.ts +20 -0
- package/dist/adapt/herdr/sanitize.d.ts.map +1 -0
- package/dist/adapt/herdr/sanitize.js +70 -0
- package/dist/adapt/herdr/sanitize.js.map +1 -0
- package/dist/adapt/herdr/semantic.d.ts +67 -0
- package/dist/adapt/herdr/semantic.d.ts.map +1 -0
- package/dist/adapt/herdr/semantic.js +170 -0
- package/dist/adapt/herdr/semantic.js.map +1 -0
- package/dist/adapt/herdr/seq-store.d.ts +32 -0
- package/dist/adapt/herdr/seq-store.d.ts.map +1 -0
- package/dist/adapt/herdr/seq-store.js +126 -0
- package/dist/adapt/herdr/seq-store.js.map +1 -0
- package/dist/adapt/herdr/team-map.d.ts +30 -0
- package/dist/adapt/herdr/team-map.d.ts.map +1 -0
- package/dist/adapt/herdr/team-map.js +37 -0
- package/dist/adapt/herdr/team-map.js.map +1 -0
- package/dist/adapt/herdr/transport.d.ts +115 -0
- package/dist/adapt/herdr/transport.d.ts.map +1 -0
- package/dist/adapt/herdr/transport.js +260 -0
- package/dist/adapt/herdr/transport.js.map +1 -0
- package/dist/adapt/herdr/wiring.d.ts +24 -0
- package/dist/adapt/herdr/wiring.d.ts.map +1 -0
- package/dist/adapt/herdr/wiring.js +62 -0
- package/dist/adapt/herdr/wiring.js.map +1 -0
- package/dist/adapt/herdr.d.ts +19 -0
- package/dist/adapt/herdr.d.ts.map +1 -0
- package/dist/adapt/herdr.js +115 -0
- package/dist/adapt/herdr.js.map +1 -0
- package/dist/adapt/index.d.ts +4 -0
- package/dist/adapt/index.d.ts.map +1 -1
- package/dist/adapt/index.js +48 -0
- package/dist/adapt/index.js.map +1 -1
- package/dist/adapt/registry.d.ts.map +1 -1
- package/dist/adapt/registry.js +11 -0
- package/dist/adapt/registry.js.map +1 -1
- package/dist/agents/__tests__/definitions.test.js +81 -0
- package/dist/agents/__tests__/definitions.test.js.map +1 -1
- package/dist/agents/__tests__/native-config.test.js +25 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/native-config.d.ts +2 -1
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js.map +1 -1
- package/dist/auth/__tests__/hotswap.test.js +60 -1
- package/dist/auth/__tests__/hotswap.test.js.map +1 -1
- package/dist/auth/__tests__/storage.test.js +33 -1
- package/dist/auth/__tests__/storage.test.js.map +1 -1
- package/dist/auth/hotswap.d.ts +22 -2
- package/dist/auth/hotswap.d.ts.map +1 -1
- package/dist/auth/hotswap.js +107 -22
- package/dist/auth/hotswap.js.map +1 -1
- package/dist/auth/storage.js +1 -1
- package/dist/auth/storage.js.map +1 -1
- package/dist/autopilot/__tests__/ralplan-gate.test.js +86 -1333
- package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
- package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
- package/dist/autopilot/ralplan-gate.js +7 -6
- package/dist/autopilot/ralplan-gate.js.map +1 -1
- package/dist/cli/__tests__/agents-init.test.js +4 -23
- package/dist/cli/__tests__/agents-init.test.js.map +1 -1
- package/dist/cli/__tests__/api.test.js +61 -24
- package/dist/cli/__tests__/api.test.js.map +1 -1
- package/dist/cli/__tests__/auth.test.js +63 -7
- package/dist/cli/__tests__/auth.test.js.map +1 -1
- package/dist/cli/__tests__/codex-feature-probe.test.js +66 -1
- package/dist/cli/__tests__/codex-feature-probe.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +150 -2
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/detached-leader-teardown.test.d.ts +2 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.d.ts.map +1 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.js +473 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts +2 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts.map +1 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.js +103 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts +2 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts.map +1 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.js +139 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js +135 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/exec.test.js +211 -0
- package/dist/cli/__tests__/exec.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +878 -463
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +1290 -127
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-parity.test.js +8 -4
- package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
- package/dist/cli/__tests__/native-assets.test.js +398 -16
- package/dist/cli/__tests__/native-assets.test.js.map +1 -1
- package/dist/cli/__tests__/native-hook-claim-journal.test.js +132 -6
- package/dist/cli/__tests__/native-hook-claim-journal.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +3 -3
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
- package/dist/cli/__tests__/ralph.test.js +3 -3
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js +49 -164
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js.map +1 -1
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts +2 -0
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.js +56 -0
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.js.map +1 -0
- package/dist/cli/__tests__/ralplan.test.js +107 -109
- package/dist/cli/__tests__/ralplan.test.js.map +1 -1
- package/dist/cli/__tests__/resume.test.js +11 -10
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/session-scoped-runtime.test.js +1118 -43
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/session-search-help.test.js +25 -1
- package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +8 -55
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +224 -7
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js +93 -41
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +150 -8
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +117 -2
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.js +95 -4
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/__tests__/update.test.js +669 -177
- package/dist/cli/__tests__/update.test.js.map +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js +33 -2
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
- package/dist/cli/api.d.ts.map +1 -1
- package/dist/cli/api.js +9 -10
- package/dist/cli/api.js.map +1 -1
- package/dist/cli/codex-feature-probe.d.ts +16 -0
- package/dist/cli/codex-feature-probe.d.ts.map +1 -1
- package/dist/cli/codex-feature-probe.js +44 -0
- package/dist/cli/codex-feature-probe.js.map +1 -1
- package/dist/cli/codex-home.d.ts.map +1 -1
- package/dist/cli/codex-home.js +7 -4
- package/dist/cli/codex-home.js.map +1 -1
- package/dist/cli/doctor.d.ts +20 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +290 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +234 -12
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2409 -746
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-parity.js +2 -2
- package/dist/cli/mcp-parity.js.map +1 -1
- package/dist/cli/native-assets.d.ts +25 -0
- package/dist/cli/native-assets.d.ts.map +1 -1
- package/dist/cli/native-assets.js +448 -51
- package/dist/cli/native-assets.js.map +1 -1
- package/dist/cli/native-hook-claim-journal.d.ts +20 -5
- package/dist/cli/native-hook-claim-journal.d.ts.map +1 -1
- package/dist/cli/native-hook-claim-journal.js +67 -32
- package/dist/cli/native-hook-claim-journal.js.map +1 -1
- package/dist/cli/package-manager-ownership.d.ts +63 -0
- package/dist/cli/package-manager-ownership.d.ts.map +1 -0
- package/dist/cli/package-manager-ownership.js +323 -0
- package/dist/cli/package-manager-ownership.js.map +1 -0
- package/dist/cli/ralph.js +2 -2
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/ralplan.d.ts +5 -7
- package/dist/cli/ralplan.d.ts.map +1 -1
- package/dist/cli/ralplan.js +83 -134
- package/dist/cli/ralplan.js.map +1 -1
- package/dist/cli/session-search.d.ts +5 -0
- package/dist/cli/session-search.d.ts.map +1 -1
- package/dist/cli/session-search.js +87 -0
- package/dist/cli/session-search.js.map +1 -1
- package/dist/cli/setup-preferences.d.ts +15 -0
- package/dist/cli/setup-preferences.d.ts.map +1 -1
- package/dist/cli/setup-preferences.js +27 -1
- package/dist/cli/setup-preferences.js.map +1 -1
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +119 -47
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/sparkshell.d.ts.map +1 -1
- package/dist/cli/sparkshell.js +52 -9
- package/dist/cli/sparkshell.js.map +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +2 -2
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/cli/uninstall.d.ts +9 -0
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +71 -30
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/cli/update-worker.d.ts +2 -0
- package/dist/cli/update-worker.d.ts.map +1 -0
- package/dist/cli/update-worker.js +142 -0
- package/dist/cli/update-worker.js.map +1 -0
- package/dist/cli/update.d.ts +14 -22
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +192 -241
- package/dist/cli/update.js.map +1 -1
- package/dist/compat/__tests__/rust-runtime-compat.test.js +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +503 -30
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +5 -3
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +67 -3
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/generator.d.ts +27 -21
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +610 -152
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +12 -2
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +15 -1
- package/dist/config/models.js.map +1 -1
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +25 -0
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.d.ts +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.js +2 -0
- package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +5 -3
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +27 -4
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts +2 -0
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js +172 -0
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js.map +1 -0
- package/dist/hooks/__tests__/keyword-detector.test.js +176 -37
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +402 -545
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +39 -4
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +161 -26
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +27 -0
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +10 -118
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js +7 -0
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +533 -14
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +159 -24
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +482 -32
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +2 -1
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +68 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +7 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +44 -4
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-contract.test.js +9 -0
- package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/session.test.js +3130 -365
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/agents-overlay.js +1 -1
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +108 -2
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/sdk.test.js +151 -1
- package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +20 -3
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/plugin-runner.js +1 -0
- package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
- package/dist/hooks/extensibility/runtime.d.ts.map +1 -1
- package/dist/hooks/extensibility/runtime.js.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.d.ts +1 -1
- package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.js +2 -2
- package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.d.ts +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.js +55 -15
- package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -1
- package/dist/hooks/extensibility/sdk.d.ts +1 -0
- package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk.js +1 -1
- package/dist/hooks/extensibility/sdk.js.map +1 -1
- package/dist/hooks/extensibility/types.d.ts +7 -0
- package/dist/hooks/extensibility/types.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +10 -3
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +116 -20
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/session.d.ts +204 -14
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +1500 -223
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/hud-tmux-injection.test.js +6 -6
- package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +26 -16
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +83 -78
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +36 -31
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +155 -198
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/tmux.d.ts +42 -4
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +1017 -139
- package/dist/hud/tmux.js.map +1 -1
- package/dist/leader/__tests__/contract.test.js +124 -37
- package/dist/leader/__tests__/contract.test.js.map +1 -1
- package/dist/leader/contract.d.ts +17 -6
- package/dist/leader/contract.d.ts.map +1 -1
- package/dist/leader/contract.js +102 -26
- package/dist/leader/contract.js.map +1 -1
- package/dist/mcp/__tests__/code-intel-server.test.js +31 -3
- package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -1
- package/dist/mcp/__tests__/hermes-bridge.test.js +17 -0
- package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +4 -4
- package/dist/mcp/__tests__/state-paths.test.js +735 -4
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +1 -1
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/__tests__/trace-server.test.js +2 -2
- package/dist/mcp/__tests__/trace-server.test.js.map +1 -1
- package/dist/mcp/__tests__/wiki-server.test.js +18 -0
- package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
- package/dist/mcp/code-intel-server.d.ts.map +1 -1
- package/dist/mcp/code-intel-server.js +13 -3
- package/dist/mcp/code-intel-server.js.map +1 -1
- package/dist/mcp/hermes-bridge.d.ts.map +1 -1
- package/dist/mcp/hermes-bridge.js +2 -2
- package/dist/mcp/hermes-bridge.js.map +1 -1
- package/dist/mcp/state-paths.d.ts +78 -4
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +543 -40
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/mcp/state-server.d.ts +4 -4
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/wiki-server.d.ts +11 -0
- package/dist/mcp/wiki-server.d.ts.map +1 -1
- package/dist/mcp/wiki-server.js +9 -2
- package/dist/mcp/wiki-server.js.map +1 -1
- package/dist/modes/__tests__/base-autopilot-gates.test.js +36 -7
- package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -1
- package/dist/modes/__tests__/base-multi-state-compat.test.js +1 -1
- package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -1
- package/dist/modes/__tests__/base-session-scope.test.js +17 -8
- package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js +4 -4
- package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
- package/dist/modes/base.d.ts +5 -5
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +76 -21
- package/dist/modes/base.js.map +1 -1
- package/dist/native-assets/archive.d.ts +17 -0
- package/dist/native-assets/archive.d.ts.map +1 -0
- package/dist/native-assets/archive.js +238 -0
- package/dist/native-assets/archive.js.map +1 -0
- package/dist/native-assets/policy.d.ts +42 -0
- package/dist/native-assets/policy.d.ts.map +1 -0
- package/dist/native-assets/policy.js +155 -0
- package/dist/native-assets/policy.js.map +1 -0
- package/dist/notifications/temp-contract.d.ts.map +1 -1
- package/dist/notifications/temp-contract.js +4 -0
- package/dist/notifications/temp-contract.js.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.js +164 -42
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +72 -155
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +124 -18
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
- package/dist/pipeline/stages/ralplan.js +36 -8
- package/dist/pipeline/stages/ralplan.js.map +1 -1
- package/dist/ralplan/__tests__/consensus-gate.test.js +73 -1316
- package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
- package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts +2 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.js +335 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.js.map +1 -0
- package/dist/ralplan/__tests__/runtime.test.js +85 -101
- package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
- package/dist/ralplan/consensus-gate.d.ts +9 -1
- package/dist/ralplan/consensus-gate.d.ts.map +1 -1
- package/dist/ralplan/consensus-gate.js +82 -338
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/ralplan/documented-leader-preflight.d.ts +41 -0
- package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -0
- package/dist/ralplan/documented-leader-preflight.js +360 -0
- package/dist/ralplan/documented-leader-preflight.js.map +1 -0
- package/dist/ralplan/runtime.d.ts +2 -1
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +67 -168
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/runtime/__tests__/bridge.test.js +42 -1
- package/dist/runtime/__tests__/bridge.test.js.map +1 -1
- package/dist/runtime/bridge.d.ts +12 -0
- package/dist/runtime/bridge.d.ts.map +1 -1
- package/dist/runtime/bridge.js +52 -1
- package/dist/runtime/bridge.js.map +1 -1
- package/dist/runtime/run-state.d.ts +5 -1
- package/dist/runtime/run-state.d.ts.map +1 -1
- package/dist/runtime/run-state.js +15 -8
- package/dist/runtime/run-state.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +16323 -8978
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js +225 -0
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js +188 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js +259 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js +491 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js +708 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js +208 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js.map +1 -0
- package/dist/scripts/__tests__/notify-state-io.test.js +26 -0
- package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
- package/dist/scripts/__tests__/notify-tmux-injection.test.js +23 -1
- package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -1
- package/dist/scripts/__tests__/postinstall.test.js +19 -1
- package/dist/scripts/__tests__/postinstall.test.js.map +1 -1
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts +2 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.js +108 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.js.map +1 -0
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js +63 -173
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js.map +1 -1
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js +74 -159
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js.map +1 -1
- package/dist/scripts/__tests__/smoke-packed-install.test.js +404 -13
- package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
- package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts +2 -0
- package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/verify-native-release-assets.test.js +235 -0
- package/dist/scripts/__tests__/verify-native-release-assets.test.js.map +1 -0
- package/dist/scripts/codex-native-hook.d.ts +53 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +14448 -1480
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts +9 -0
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +35 -12
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/generate-native-release-manifest.js +80 -51
- package/dist/scripts/generate-native-release-manifest.js.map +1 -1
- package/dist/scripts/notify-fallback-watcher.js +78 -115
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.js +74 -3
- package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +5 -0
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts +9 -0
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +234 -79
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +71 -16
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts +12 -4
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +365 -44
- package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.js +42 -21
- package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker.d.ts +3 -0
- package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker.js +82 -33
- package/dist/scripts/notify-hook/team-worker.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts +1 -0
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +32 -3
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/notify-hook.js +79 -82
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/postinstall-advisory.d.ts +14 -0
- package/dist/scripts/postinstall-advisory.d.ts.map +1 -0
- package/dist/scripts/postinstall-advisory.js +49 -0
- package/dist/scripts/postinstall-advisory.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +1 -1
- package/dist/scripts/postinstall.d.ts.map +1 -1
- package/dist/scripts/postinstall.js +1 -1
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +80 -4
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +3162 -26
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js +16 -1
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/scripts/verify-native-release-assets.js +37 -23
- package/dist/scripts/verify-native-release-assets.js.map +1 -1
- package/dist/state/__tests__/mode-state-context.test.js +61 -0
- package/dist/state/__tests__/mode-state-context.test.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +462 -850
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +400 -2
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/mode-state-context.d.ts +8 -0
- package/dist/state/mode-state-context.d.ts.map +1 -1
- package/dist/state/mode-state-context.js +73 -0
- package/dist/state/mode-state-context.js.map +1 -1
- package/dist/state/operations.d.ts +3 -0
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +144 -40
- package/dist/state/operations.js.map +1 -1
- package/dist/state/skill-active.d.ts +18 -1
- package/dist/state/skill-active.d.ts.map +1 -1
- package/dist/state/skill-active.js +420 -23
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.d.ts +3 -0
- package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
- package/dist/state/workflow-transition-reconcile.js +10 -4
- package/dist/state/workflow-transition-reconcile.js.map +1 -1
- package/dist/state/workflow-transition.d.ts.map +1 -1
- package/dist/state/workflow-transition.js +3 -1
- package/dist/state/workflow-transition.js.map +1 -1
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.js +53 -247
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.js.map +1 -1
- package/dist/subagents/__tests__/tracker.test.js +837 -1048
- package/dist/subagents/__tests__/tracker.test.js.map +1 -1
- package/dist/subagents/tracker.d.ts +58 -135
- package/dist/subagents/tracker.d.ts.map +1 -1
- package/dist/subagents/tracker.js +811 -632
- package/dist/subagents/tracker.js.map +1 -1
- package/dist/team/__tests__/api-interop.test.js +91 -1
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/delivery-e2e-smoke.test.js +58 -17
- package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
- package/dist/team/__tests__/idle-nudge.test.js +45 -15
- package/dist/team/__tests__/idle-nudge.test.js.map +1 -1
- package/dist/team/__tests__/mcp-comm.test.js +197 -30
- package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +110 -3
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/notice-ledger.test.d.ts +2 -0
- package/dist/team/__tests__/notice-ledger.test.d.ts.map +1 -0
- package/dist/team/__tests__/notice-ledger.test.js +131 -0
- package/dist/team/__tests__/notice-ledger.test.js.map +1 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts +2 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts.map +1 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.js +410 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.js.map +1 -0
- package/dist/team/__tests__/phase-controller.test.js +20 -0
- package/dist/team/__tests__/phase-controller.test.js.map +1 -1
- package/dist/team/__tests__/runtime-cli.test.js +9 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +3963 -428
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +2405 -203
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.js +117 -2
- package/dist/team/__tests__/state-root.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +804 -36
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/team-ops-contract.test.js +6 -0
- package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +4099 -1039
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts +2 -0
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts.map +1 -0
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.js +149 -0
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.js.map +1 -0
- package/dist/team/__tests__/tmux-test-fixture.d.ts +69 -0
- package/dist/team/__tests__/tmux-test-fixture.d.ts.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.js +242 -15
- package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.test.js +177 -1
- package/dist/team/__tests__/tmux-test-fixture.test.js.map +1 -1
- package/dist/team/__tests__/worker-runtime-identity.test.js +53 -44
- package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
- package/dist/team/__tests__/worktree.test.js +6 -0
- package/dist/team/__tests__/worktree.test.js.map +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +15 -9
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/exact-pane.d.ts +23 -0
- package/dist/team/exact-pane.d.ts.map +1 -0
- package/dist/team/exact-pane.js +133 -0
- package/dist/team/exact-pane.js.map +1 -0
- package/dist/team/idle-nudge.d.ts +12 -1
- package/dist/team/idle-nudge.d.ts.map +1 -1
- package/dist/team/idle-nudge.js +41 -14
- package/dist/team/idle-nudge.js.map +1 -1
- package/dist/team/model-contract.d.ts +2 -5
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +59 -17
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/notice-ledger.d.ts +54 -0
- package/dist/team/notice-ledger.d.ts.map +1 -0
- package/dist/team/notice-ledger.js +259 -0
- package/dist/team/notice-ledger.js.map +1 -0
- package/dist/team/phase-controller.d.ts.map +1 -1
- package/dist/team/phase-controller.js +2 -0
- package/dist/team/phase-controller.js.map +1 -1
- package/dist/team/runtime.d.ts +4 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +1527 -291
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts +13 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +1503 -387
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/dispatch.d.ts.map +1 -1
- package/dist/team/state/dispatch.js +26 -8
- package/dist/team/state/dispatch.js.map +1 -1
- package/dist/team/state/locks.d.ts.map +1 -1
- package/dist/team/state/locks.js +61 -13
- package/dist/team/state/locks.js.map +1 -1
- package/dist/team/state/monitor.d.ts +10 -0
- package/dist/team/state/monitor.d.ts.map +1 -1
- package/dist/team/state/monitor.js +13 -0
- package/dist/team/state/monitor.js.map +1 -1
- package/dist/team/state/tasks.d.ts.map +1 -1
- package/dist/team/state/tasks.js +4 -3
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/state/types.d.ts +15 -0
- package/dist/team/state/types.d.ts.map +1 -1
- package/dist/team/state/types.js.map +1 -1
- package/dist/team/state-root.d.ts +12 -0
- package/dist/team/state-root.d.ts.map +1 -1
- package/dist/team/state-root.js +177 -0
- package/dist/team/state-root.js.map +1 -1
- package/dist/team/state.d.ts +85 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +672 -129
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +5 -0
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +4 -0
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts +163 -27
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +1682 -376
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +4 -0
- package/dist/team/worktree.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +950 -2
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js +1 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/dist/ultragoal/artifacts.d.ts +35 -1
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +232 -46
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/utils/__tests__/file-durability.test.d.ts +2 -0
- package/dist/utils/__tests__/file-durability.test.d.ts.map +1 -0
- package/dist/utils/__tests__/file-durability.test.js +114 -0
- package/dist/utils/__tests__/file-durability.test.js.map +1 -0
- package/dist/utils/__tests__/paths.test.js +21 -1
- package/dist/utils/__tests__/paths.test.js.map +1 -1
- package/dist/utils/file-durability.d.ts +25 -0
- package/dist/utils/file-durability.d.ts.map +1 -0
- package/dist/utils/file-durability.js +67 -0
- package/dist/utils/file-durability.js.map +1 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +14 -6
- package/dist/utils/paths.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +49 -4
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +3 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js +60 -0
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
- package/dist/verification/__tests__/native-release-manifest.test.js +157 -4
- package/dist/verification/__tests__/native-release-manifest.test.js.map +1 -1
- package/dist/wiki/lint.d.ts +4 -1
- package/dist/wiki/lint.d.ts.map +1 -1
- package/dist/wiki/lint.js +3 -2
- package/dist/wiki/lint.js.map +1 -1
- package/package.json +13 -5
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +105 -17
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +13 -5
- package/plugins/oh-my-codex/skills/cancel/SKILL.md +30 -85
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +6 -4
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +16 -17
- package/plugins/oh-my-codex/skills/team/SKILL.md +13 -9
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +3 -2
- package/skills/autopilot/SKILL.md +13 -5
- package/skills/cancel/SKILL.md +30 -85
- package/skills/ralph/SKILL.md +6 -4
- package/skills/ralplan/SKILL.md +16 -17
- package/skills/team/SKILL.md +13 -9
- package/skills/ultragoal/SKILL.md +3 -2
- package/src/scripts/__tests__/codex-native-hook.test.ts +8831 -951
- package/src/scripts/__tests__/issue-3293-callsite-parity.test.ts +187 -0
- package/src/scripts/__tests__/issue-3293-cancel-transaction.test.ts +189 -0
- package/src/scripts/__tests__/issue-3293-hook-owned-cancel.test.ts +187 -0
- package/src/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.ts +591 -0
- package/src/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.ts +701 -0
- package/src/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.ts +211 -0
- package/src/scripts/__tests__/notify-state-io.test.ts +29 -0
- package/src/scripts/__tests__/notify-tmux-injection.test.ts +26 -1
- package/src/scripts/__tests__/postinstall.test.ts +23 -1
- package/src/scripts/__tests__/reasoning-artifact-contract.test.ts +129 -0
- package/src/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.ts +67 -185
- package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +79 -178
- package/src/scripts/__tests__/smoke-packed-install.test.ts +525 -16
- package/src/scripts/__tests__/verify-native-release-assets.test.ts +240 -0
- package/src/scripts/codex-native-hook.ts +14238 -1429
- package/src/scripts/codex-native-pre-post.ts +43 -12
- package/src/scripts/generate-native-release-manifest.ts +83 -79
- package/src/scripts/notify-fallback-watcher.ts +91 -122
- package/src/scripts/notify-hook/auto-nudge.ts +71 -3
- package/src/scripts/notify-hook/state-io.ts +11 -0
- package/src/scripts/notify-hook/team-dispatch.ts +242 -75
- package/src/scripts/notify-hook/team-leader-nudge.ts +72 -22
- package/src/scripts/notify-hook/team-tmux-guard.ts +366 -39
- package/src/scripts/notify-hook/team-worker-stop.ts +43 -20
- package/src/scripts/notify-hook/team-worker.ts +82 -31
- package/src/scripts/notify-hook/tmux-injection.ts +33 -3
- package/src/scripts/notify-hook.ts +84 -82
- package/src/scripts/postinstall-advisory.ts +67 -0
- package/src/scripts/postinstall.ts +1 -1
- package/src/scripts/smoke-packed-install.ts +3608 -39
- package/src/scripts/sync-plugin-mirror.ts +17 -1
- package/src/scripts/verify-native-release-assets.ts +39 -31
- package/templates/AGENTS.md +1 -0
- package/dist/subagents/__tests__/adapted-role-binding.test.d.ts +0 -2
- package/dist/subagents/__tests__/adapted-role-binding.test.d.ts.map +0 -1
- package/dist/subagents/__tests__/adapted-role-binding.test.js +0 -988
- package/dist/subagents/__tests__/adapted-role-binding.test.js.map +0 -1
- package/dist/subagents/adapted-role-binding.d.ts +0 -17
- package/dist/subagents/adapted-role-binding.d.ts.map +0 -1
- package/dist/subagents/adapted-role-binding.js +0 -75
- package/dist/subagents/adapted-role-binding.js.map +0 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { access, chmod, mkdtemp, mkdir, rm, symlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { access, chmod, mkdtemp, mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promises';
|
|
4
4
|
import { EventEmitter } from 'node:events';
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
6
|
import { delimiter, join } from 'node:path';
|
|
7
7
|
import { PassThrough } from 'node:stream';
|
|
8
8
|
import { test } from 'node:test';
|
|
9
|
-
import { ensureRepoDependencies, hasUsableNodeModules, buildPackedRegressionEnvironment, CODEX_APP_SERVER_TIMEOUTS, CodexAppServer, CodexExecutableNotFoundError, MANAGED_CODEX_HOOK_EVENTS, PACKED_INSTALL_NATIVE_HOOK_SMOKE_EVENTS, PACKED_INSTALL_NATIVE_HOOK_REGRESSION_PROMPTS, PACKED_INSTALL_SMOKE_CORE_COMMANDS, appendForeignHookGroups, appendDisplayOrderStableForeignHookGroups,
|
|
9
|
+
import { assertPackedLaunchCwdPreserved, assertInstalledPluginSurface, assertInstalledReasoningDeclarationContract, assertInstalledReasoningRuntimeContract, assertInstalledRootReasoningHelp, assertInstalledRootReasoningRejection, assertInstalledTeamSkillContract, assertPackedInstallFileMetadata, assertPackedRegressionWorkflowState, buildNativeHookSmokePayload, ensureRepoDependencies, hasUsableNodeModules, buildPackedProbeEnv, buildPackedRegressionEnvironment, CODEX_APP_SERVER_TIMEOUTS, CodexAppServer, CodexExecutableNotFoundError, MANAGED_CODEX_HOOK_EVENTS, PACKED_INSTALL_NATIVE_HOOK_SMOKE_EVENTS, PACKED_INSTALL_NATIVE_HOOK_REGRESSION_PROMPTS, PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, PACKED_INSTALL_SMOKE_CORE_COMMANDS, appendForeignHookGroups, appendDisplayOrderStableForeignHookGroups, createCodexBatchWriteEnvelope, createCodexHooksListEnvelope, createCodexInitializeEnvelope, foreignHookGroupSnapshot, generatedHookTrustState, isForbiddenPackedInstallArtifact, PACKED_INSTALL_FORBIDDEN_ARTIFACT_PATHS, PACKED_INSTALL_REQUIRED_ARTIFACT_PATHS, PACKED_INSTALL_PLUGIN_MCP_TARGETS, parseFakeCodexLaunches, parseNpmPackJsonOutput, parseCodexHooksListResult, probeCodexVersion, parseArgs, resolveGitCommonDir, resolveReusableNodeModulesSource, replacePathKeyCaseInsensitive, resolvePackedSmokeRuntimeBinary, validateHookStdout, shouldPackedRegressionStopBlock, assertCodexBatchWriteResult, assertGeneratedTrustMatchesCodex, managedCodexHooksByEvent, } from '../smoke-packed-install.js';
|
|
10
|
+
import { parseNativeSubagentResultDisposition } from '../../leader/contract.js';
|
|
10
11
|
function createFakeCodexAppServer(onRequest) {
|
|
11
12
|
const child = Object.assign(new EventEmitter(), {
|
|
12
13
|
stdin: new PassThrough(),
|
|
@@ -18,6 +19,98 @@ function createFakeCodexAppServer(onRequest) {
|
|
|
18
19
|
child.stdin.on('finish', () => child.emit('close', 0, null));
|
|
19
20
|
return new CodexAppServer(child);
|
|
20
21
|
}
|
|
22
|
+
test('packed smoke resolves and validates the platform-aware repo runtime', async () => {
|
|
23
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-packed-runtime-'));
|
|
24
|
+
try {
|
|
25
|
+
const debugDir = join(root, 'target', 'debug');
|
|
26
|
+
await mkdir(debugDir, { recursive: true });
|
|
27
|
+
const runtimePath = join(debugDir, 'omx-runtime');
|
|
28
|
+
await writeFile(runtimePath, '#!/bin/sh\nexit 0\n');
|
|
29
|
+
await chmod(runtimePath, 0o755);
|
|
30
|
+
assert.equal(resolvePackedSmokeRuntimeBinary(root, { platform: 'linux' }), runtimePath);
|
|
31
|
+
const windowsRuntimePath = join(debugDir, 'omx-runtime.exe');
|
|
32
|
+
await writeFile(windowsRuntimePath, 'windows executable fixture');
|
|
33
|
+
assert.equal(resolvePackedSmokeRuntimeBinary(root, { platform: 'win32' }), windowsRuntimePath);
|
|
34
|
+
assert.throws(() => resolvePackedSmokeRuntimeBinary(root, { platform: 'linux', candidate: 'relative/omx-runtime' }), /must be absolute/);
|
|
35
|
+
assert.equal(resolvePackedSmokeRuntimeBinary(root, { platform: 'linux', candidate: runtimePath }), runtimePath);
|
|
36
|
+
assert.throws(() => resolvePackedSmokeRuntimeBinary(join(root, 'missing'), { platform: 'linux' }), /run "npm run build:runtime"/);
|
|
37
|
+
const nonExecutablePath = join(root, 'non-executable-runtime');
|
|
38
|
+
await writeFile(nonExecutablePath, 'not executable');
|
|
39
|
+
await chmod(nonExecutablePath, 0o644);
|
|
40
|
+
assert.throws(() => resolvePackedSmokeRuntimeBinary(root, { platform: 'linux', candidate: nonExecutablePath }), /executable regular file/);
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
await rm(root, { recursive: true, force: true });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
test('packed probe env strips ambient runtime and supports default, absent, and explicit provisioning', async () => {
|
|
47
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-packed-probe-env-'));
|
|
48
|
+
try {
|
|
49
|
+
const debugDir = join(root, 'target', 'debug');
|
|
50
|
+
await mkdir(debugDir, { recursive: true });
|
|
51
|
+
const runtimePath = join(debugDir, 'omx-runtime');
|
|
52
|
+
await writeFile(runtimePath, '#!/bin/sh\nexit 0\n');
|
|
53
|
+
await chmod(runtimePath, 0o755);
|
|
54
|
+
const defaultEnv = buildPackedProbeEnv({ OMX_RUNTIME_BINARY: '/tmp/ambient-decoy' }, { repoRoot: root });
|
|
55
|
+
assert.equal(defaultEnv.OMX_RUNTIME_BINARY, runtimePath);
|
|
56
|
+
const absentEnv = buildPackedProbeEnv({}, { runtimeBinary: null });
|
|
57
|
+
assert.equal(Object.hasOwn(absentEnv, 'OMX_RUNTIME_BINARY'), false);
|
|
58
|
+
const explicitEnv = buildPackedProbeEnv({}, { runtimeBinary: runtimePath });
|
|
59
|
+
assert.equal(explicitEnv.OMX_RUNTIME_BINARY, runtimePath);
|
|
60
|
+
assert.throws(() => buildPackedProbeEnv({}, { runtimeBinary: 'relative/omx-runtime' }), /must be absolute/);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await rm(root, { recursive: true, force: true });
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
test('packed fail-closed PATH replacement removes a win32-shaped decoy runtime and every casing variant', async () => {
|
|
67
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-packed-path-isolation-'));
|
|
68
|
+
try {
|
|
69
|
+
const decoyDir = join(root, 'decoy');
|
|
70
|
+
const isolatedDir = join(root, 'isolated');
|
|
71
|
+
await mkdir(decoyDir);
|
|
72
|
+
await mkdir(isolatedDir);
|
|
73
|
+
const decoyRuntime = join(decoyDir, 'omx-runtime.exe');
|
|
74
|
+
await writeFile(decoyRuntime, 'decoy');
|
|
75
|
+
await access(decoyRuntime);
|
|
76
|
+
const env = replacePathKeyCaseInsensitive({ Path: decoyDir, PATH: join(root, 'other'), KEEP: '1' }, isolatedDir);
|
|
77
|
+
const pathKeys = Object.keys(env).filter((key) => key.toUpperCase() === 'PATH');
|
|
78
|
+
assert.deepEqual(pathKeys, ['Path']);
|
|
79
|
+
assert.equal(env.Path, isolatedDir);
|
|
80
|
+
assert.equal(env.Path.split(delimiter).includes(decoyDir), false);
|
|
81
|
+
assert.equal(env.KEEP, '1');
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
await rm(root, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
test('packed fail-closed PATH replacement creates a single POSIX key when absent', () => {
|
|
88
|
+
const env = replacePathKeyCaseInsensitive({ KEEP: '1' }, '/isolated');
|
|
89
|
+
assert.deepEqual(env, { KEEP: '1', PATH: '/isolated' });
|
|
90
|
+
});
|
|
91
|
+
test('packed launch cwd assertion accepts filesystem aliases and rejects distinct directories', async () => {
|
|
92
|
+
if (process.platform === 'win32')
|
|
93
|
+
return;
|
|
94
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-packed-cwd-'));
|
|
95
|
+
try {
|
|
96
|
+
const realDir = join(root, 'real');
|
|
97
|
+
const otherDir = join(root, 'other');
|
|
98
|
+
const aliasDir = join(root, 'alias');
|
|
99
|
+
await mkdir(realDir);
|
|
100
|
+
await mkdir(otherDir);
|
|
101
|
+
await symlink(realDir, aliasDir);
|
|
102
|
+
assert.doesNotThrow(() => assertPackedLaunchCwdPreserved(realDir, aliasDir, 'cwd mismatch'));
|
|
103
|
+
assert.throws(() => assertPackedLaunchCwdPreserved(realDir, otherDir, 'cwd mismatch'), /cwd mismatch: expected .* received /);
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
await rm(root, { recursive: true, force: true });
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
test('packed smoke arguments expose a probe-only mode and reject unknown flags', () => {
|
|
110
|
+
assert.deepEqual(parseArgs([]), { failClosedProbe: false });
|
|
111
|
+
assert.deepEqual(parseArgs(['--fail-closed-probe']), { failClosedProbe: true });
|
|
112
|
+
assert.throws(() => parseArgs(['--unknown']), /Unknown argument/);
|
|
113
|
+
});
|
|
21
114
|
test('packed install smoke retains narrow boot commands and adds the isolated lifecycle separately', () => {
|
|
22
115
|
assert.deepEqual(PACKED_INSTALL_SMOKE_CORE_COMMANDS, [
|
|
23
116
|
['--help'],
|
|
@@ -28,6 +121,48 @@ test('packed install smoke retains narrow boot commands and adds the isolated li
|
|
|
28
121
|
assert.equal(PACKED_INSTALL_SMOKE_CORE_COMMANDS.some((argv) => argv.includes('api')), true);
|
|
29
122
|
assert.equal(PACKED_INSTALL_SMOKE_CORE_COMMANDS.some((argv) => argv.includes('sparkshell')), true);
|
|
30
123
|
});
|
|
124
|
+
test('packed 0.144.5 fixture is sanitized, pointer-free, and kept separate from the 0.142.5 lifecycle pin', () => {
|
|
125
|
+
assert.deepEqual(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, {
|
|
126
|
+
hook_event_name: 'PreToolUse',
|
|
127
|
+
session_id: 'packed-01445-session',
|
|
128
|
+
turn_id: 'packed-01445-turn',
|
|
129
|
+
tool_name: 'Bash',
|
|
130
|
+
tool_use_id: 'packed-01445-tool',
|
|
131
|
+
tool_input: { command: 'omx ralplan role-intent write --role architect --parent-thread "$CODEX_THREAD_ID" --json' },
|
|
132
|
+
});
|
|
133
|
+
assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'tracker'), false);
|
|
134
|
+
assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'session_pointer'), false);
|
|
135
|
+
assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'cwd'), false);
|
|
136
|
+
assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'thread_id'), false);
|
|
137
|
+
assert.equal(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE.session_id.includes('-'), true);
|
|
138
|
+
});
|
|
139
|
+
test('source parser regression keeps collaboration results authoritative over unrelated child prose', () => {
|
|
140
|
+
const successfulResponse = JSON.stringify({
|
|
141
|
+
success: true,
|
|
142
|
+
status: 'completed',
|
|
143
|
+
agents: [{ agent_name: '/root', agent_status: 'running' }],
|
|
144
|
+
output: 'Child succeeded; an optional adapter was unavailable, unsupported, and not found.',
|
|
145
|
+
});
|
|
146
|
+
for (const toolName of [
|
|
147
|
+
'collaboration.spawn_agent',
|
|
148
|
+
'collaboration.list_agents',
|
|
149
|
+
'collaborationlist_agents',
|
|
150
|
+
'collaboration.followup_task',
|
|
151
|
+
'collaboration.wait_agent',
|
|
152
|
+
]) {
|
|
153
|
+
assert.equal(parseNativeSubagentResultDisposition(toolName, successfulResponse).kind, 'success', toolName);
|
|
154
|
+
}
|
|
155
|
+
const nestedLifecycleOnly = JSON.stringify({
|
|
156
|
+
agents: [
|
|
157
|
+
{ agent_name: '/root', agent_status: 'running' },
|
|
158
|
+
{
|
|
159
|
+
agent_name: '/root/reviewer',
|
|
160
|
+
agent_status: { completed: 'Optional adapter is unavailable and unsupported.' },
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
});
|
|
164
|
+
assert.equal(parseNativeSubagentResultDisposition('collaborationlist_agents', nestedLifecycleOnly).kind, 'unknown');
|
|
165
|
+
});
|
|
31
166
|
test('packed lifecycle keeps the pinned newline-delimited Codex app-server envelopes literal', () => {
|
|
32
167
|
assert.deepEqual(createCodexInitializeEnvelope('omx-hook-trust-regression'), {
|
|
33
168
|
id: 1,
|
|
@@ -547,18 +682,30 @@ test('packed lifecycle fails before probing the 33rd unique PATH candidate', asy
|
|
|
547
682
|
return;
|
|
548
683
|
const root = await mkdtemp(join(tmpdir(), 'omx-codex-candidate-budget-'));
|
|
549
684
|
const candidateDirs = Array.from({ length: 33 }, (_value, index) => join(root, `candidate-${index}`));
|
|
550
|
-
|
|
685
|
+
// Duplicate the first PATH entry twice to demonstrate that PATH de-duplication
|
|
686
|
+
// (by resolved candidate path) does not consume extra candidate-budget slots,
|
|
687
|
+
// while still preserving first-occurrence probing order.
|
|
688
|
+
const pathValue = [candidateDirs[0], candidateDirs[0], ...candidateDirs].join(delimiter);
|
|
689
|
+
const spawnedExecutables = [];
|
|
690
|
+
const spawnSyncImpl = ((command) => {
|
|
691
|
+
spawnedExecutables.push(command);
|
|
692
|
+
return { status: 1, stdout: '', stderr: '', error: undefined };
|
|
693
|
+
});
|
|
551
694
|
try {
|
|
552
695
|
await Promise.all(candidateDirs.map((dir) => mkdir(dir, { recursive: true })));
|
|
553
|
-
await Promise.all(candidateDirs.map(async (dir
|
|
696
|
+
await Promise.all(candidateDirs.map(async (dir) => {
|
|
554
697
|
const executable = join(dir, 'codex');
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
698
|
+
// These candidates are never actually executed: spawnSyncImpl is a
|
|
699
|
+
// deterministic seam that returns an immediate nonzero result without
|
|
700
|
+
// starting a real shell process. Only filesystem presence is real.
|
|
701
|
+
await writeFile(executable, '#!/bin/sh\nexit 1\n');
|
|
558
702
|
await chmod(executable, 0o755);
|
|
559
703
|
}));
|
|
560
|
-
assert.throws(() => probeCodexVersion(root, { PATH:
|
|
561
|
-
|
|
704
|
+
assert.throws(() => probeCodexVersion(root, { PATH: pathValue }, { spawnSyncImpl }), /32-candidate PATH budget/);
|
|
705
|
+
assert.equal(spawnedExecutables.length, 32, 'must probe exactly 32 unique candidates before the budget error');
|
|
706
|
+
assert.deepEqual(spawnedExecutables, candidateDirs.slice(0, 32).map((dir) => join(dir, 'codex')), 'must probe unique candidates in PATH order, with the duplicated first entry counted only once');
|
|
707
|
+
const thirtyThirdExecutable = join(candidateDirs[32], 'codex');
|
|
708
|
+
assert.ok(!spawnedExecutables.includes(thirtyThirdExecutable), 'the 33rd unique candidate must never be spawned');
|
|
562
709
|
}
|
|
563
710
|
finally {
|
|
564
711
|
await rm(root, { recursive: true, force: true });
|
|
@@ -662,6 +809,16 @@ test('display-order-stable foreign fixture preserves pre-approved group and hand
|
|
|
662
809
|
{ event: 'PreToolUse', groupIndex: 1, handlerIndex: 2 },
|
|
663
810
|
]);
|
|
664
811
|
});
|
|
812
|
+
test('packed install smoke probes every advertised plugin MCP target', () => {
|
|
813
|
+
assert.deepEqual(PACKED_INSTALL_PLUGIN_MCP_TARGETS, [
|
|
814
|
+
['omx_state', 'state', 'omx-state'],
|
|
815
|
+
['omx_memory', 'memory', 'omx-memory'],
|
|
816
|
+
['omx_code_intel', 'code-intel', 'omx-code-intel'],
|
|
817
|
+
['omx_trace', 'trace', 'omx-trace'],
|
|
818
|
+
['omx_wiki', 'wiki', 'omx-wiki'],
|
|
819
|
+
['omx_hermes', 'hermes', 'omx-hermes'],
|
|
820
|
+
]);
|
|
821
|
+
});
|
|
665
822
|
test('packed install smoke covers every installed native hook event with minimal payloads', () => {
|
|
666
823
|
assert.deepEqual(PACKED_INSTALL_NATIVE_HOOK_SMOKE_EVENTS, [
|
|
667
824
|
'SessionStart',
|
|
@@ -789,13 +946,13 @@ test('packed install smoke covers directive activation and terminal false-activa
|
|
|
789
946
|
{ name: 'doc-preserves-earlier', prompt: 'Use autopilot mode; "note"; use $ralplan is the workflow command.', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
790
947
|
{ name: 'doc-colon-followup', prompt: 'use $ralplan is the workflow command: use $autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
791
948
|
{ name: 'table-followup', prompt: 'Mode | Meaning\n--- | ---\nmanual | documentation\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
|
|
792
|
-
{ name: 'neg-advance-reopen', prompt: 'Do not run $ralplan but advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false },
|
|
793
|
-
{ name: 'neg-jump-reopen', prompt: 'Do not run $ralplan but jump straight to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false },
|
|
949
|
+
{ name: 'neg-advance-reopen', prompt: 'Do not run $ralplan but advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false, insideTmux: true },
|
|
950
|
+
{ name: 'neg-jump-reopen', prompt: 'Do not run $ralplan but jump straight to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false, insideTmux: true },
|
|
794
951
|
{ name: 'reference-plain-title', prompt: '[docs]: /target "title\nplain text"\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
|
|
795
952
|
{ name: 'reference-plain-destination', prompt: '[docs]: ./target\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
|
|
796
953
|
{ name: 'directive-use-the', prompt: 'Do not run $ralplan; use the $autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
797
954
|
{ name: 'directive-continue-after-quote', prompt: '"quoted"\ncontinue with $ralplan', expectedSkill: 'ralplan', expectedStopBlock: true },
|
|
798
|
-
{ name: 'doc-advance-followup', prompt: 'use $ralplan is the workflow command; advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false },
|
|
955
|
+
{ name: 'doc-advance-followup', prompt: 'use $ralplan is the workflow command; advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false, insideTmux: true },
|
|
799
956
|
{ name: 'directive-run-code-review', prompt: 'run $code-review', expectedSkill: 'code-review', expectedStopBlock: false },
|
|
800
957
|
{ name: 'directive-documentation', prompt: 'use $ralplan is the consensus-planning command', expectedSkill: null, expectedStopBlock: false },
|
|
801
958
|
{ name: 'nested-bounded-child-unbounded-parent', prompt: '"`x`\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
|
|
@@ -827,12 +984,27 @@ test('packed install smoke covers directive activation and terminal false-activa
|
|
|
827
984
|
{ name: 'percent-suffix', prompt: '$ralplan%docs', expectedSkill: null, expectedStopBlock: false },
|
|
828
985
|
{ name: 'fullwidth-percent-suffix', prompt: '$ralplan%docs', expectedSkill: null, expectedStopBlock: false },
|
|
829
986
|
{ name: 'g1a-ordered-multi-skill', prompt: '$ralplan, $autopilot; $team', expectedSkill: 'ralplan', expectedStopBlock: true, expectedDeferredSkills: ['autopilot', 'team'], expectedActiveSkills: ['ralplan'], insideTmux: true },
|
|
830
|
-
{ name: 'g1c-duplicate-alias', prompt: '$autopilot $oh-my-codex:autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true, expectedDeferredSkills: [], expectedActiveSkills: [
|
|
987
|
+
{ name: 'g1c-duplicate-alias', prompt: '$autopilot $oh-my-codex:autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true, expectedDeferredSkills: [], expectedActiveSkills: [] },
|
|
831
988
|
{ name: 'b3-longer-valid-fence', prompt: '```text\n$autopilot build it\n````\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
|
|
832
989
|
{ name: 'b4-shorter-invalid-fence', prompt: '````text\n$autopilot build it\n```\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
|
|
833
990
|
{ name: 'b5-different-marker-invalid-fence', prompt: '```text\n$autopilot build it\n~~~\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
|
|
834
991
|
]);
|
|
835
992
|
});
|
|
993
|
+
test('packed regression workflow expectations distinguish active activation from receipt-unavailable Autopilot termination', () => {
|
|
994
|
+
assert.doesNotThrow(() => assertPackedRegressionWorkflowState({ name: 'active-ralplan', expectedSkill: 'ralplan' }, { active: true, skill: 'ralplan' }));
|
|
995
|
+
assert.doesNotThrow(() => assertPackedRegressionWorkflowState({ name: 'failed-autopilot', expectedSkill: 'autopilot' }, {
|
|
996
|
+
active: false,
|
|
997
|
+
skill: 'autopilot',
|
|
998
|
+
phase: 'failed',
|
|
999
|
+
error: 'documented_host_consensus_receipt_unavailable',
|
|
1000
|
+
active_skills: [],
|
|
1001
|
+
}));
|
|
1002
|
+
assert.throws(() => assertPackedRegressionWorkflowState({ name: 'stale-active-autopilot', expectedSkill: 'autopilot' }, { active: true, skill: 'autopilot', phase: 'running', active_skills: [{ skill: 'autopilot' }] }), /persisted unexpected workflow state/);
|
|
1003
|
+
});
|
|
1004
|
+
test('packed regression Stop expectations release terminal receipt-unavailable Autopilot state', () => {
|
|
1005
|
+
assert.equal(shouldPackedRegressionStopBlock({ expectedSkill: 'ralplan', expectedStopBlock: true }), true);
|
|
1006
|
+
assert.equal(shouldPackedRegressionStopBlock({ expectedSkill: 'autopilot', expectedStopBlock: true }), false);
|
|
1007
|
+
});
|
|
836
1008
|
test('packed regression environment clears inherited Team routing state', () => {
|
|
837
1009
|
const environment = buildPackedRegressionEnvironment({ name: 'poisoned-team-case', insideTmux: true }, {
|
|
838
1010
|
OMX_ROOT: '/tmp/poison-root',
|
|
@@ -881,6 +1053,27 @@ test('packed install native hook stdout validation enforces event output contrac
|
|
|
881
1053
|
}
|
|
882
1054
|
assert.throws(() => validateHookStdout('UserPromptSubmit', '{not json'), /native hook UserPromptSubmit emitted invalid JSON stdout/);
|
|
883
1055
|
});
|
|
1056
|
+
test('fake Codex launch capture preserves argv and runtime side-effect evidence', () => {
|
|
1057
|
+
const capture = `${JSON.stringify({
|
|
1058
|
+
argv: ['--', '--spark'],
|
|
1059
|
+
cwd: '/tmp/omx-packed-launch',
|
|
1060
|
+
hasResumeSqlite: true,
|
|
1061
|
+
OMX_NOTIFY_TEMP_CONTRACT: null,
|
|
1062
|
+
OMX_TEAM_WORKER_LAUNCH_ARGS: null,
|
|
1063
|
+
})}\n`;
|
|
1064
|
+
assert.deepEqual(parseFakeCodexLaunches(capture), [{
|
|
1065
|
+
argv: ['--', '--spark'],
|
|
1066
|
+
cwd: '/tmp/omx-packed-launch',
|
|
1067
|
+
hasResumeSqlite: true,
|
|
1068
|
+
OMX_NOTIFY_TEMP_CONTRACT: null,
|
|
1069
|
+
OMX_TEAM_WORKER_LAUNCH_ARGS: null,
|
|
1070
|
+
}]);
|
|
1071
|
+
assert.throws(() => parseFakeCodexLaunches(`${JSON.stringify({
|
|
1072
|
+
argv: ['--spark'],
|
|
1073
|
+
cwd: '/tmp/omx-packed-launch',
|
|
1074
|
+
OMX_NOTIFY_TEMP_CONTRACT: null,
|
|
1075
|
+
})}\n`), /fake Codex capture did not contain a valid launch record/);
|
|
1076
|
+
});
|
|
884
1077
|
test('parseNpmPackJsonOutput ignores prepack logs before npm pack JSON', () => {
|
|
885
1078
|
const parsed = parseNpmPackJsonOutput([
|
|
886
1079
|
'[sync-plugin-mirror] synced 29 canonical skill directories and plugin metadata',
|
|
@@ -893,6 +1086,204 @@ test('parseNpmPackJsonOutput ignores prepack logs before npm pack JSON', () => {
|
|
|
893
1086
|
].join('\n'));
|
|
894
1087
|
assert.deepEqual(parsed, [{ filename: 'oh-my-codex-0.15.0.tgz' }]);
|
|
895
1088
|
});
|
|
1089
|
+
test('packed install metadata requires runtime, declarations, Team skills, and plugin assets only', () => {
|
|
1090
|
+
const files = PACKED_INSTALL_REQUIRED_ARTIFACT_PATHS.map((path) => ({ path }));
|
|
1091
|
+
assert.doesNotThrow(() => assertPackedInstallFileMetadata(files));
|
|
1092
|
+
assert.equal(PACKED_INSTALL_REQUIRED_ARTIFACT_PATHS.some((path) => path.startsWith('docs/')), false, 'repository documentation must not become an npm package requirement');
|
|
1093
|
+
assert.throws(() => assertPackedInstallFileMetadata(files.slice(1)), /npm pack is missing required artifact: dist\/config\/models\.js/);
|
|
1094
|
+
assert.throws(() => assertPackedInstallFileMetadata([...files, { path: 'docs/reference/omx-config-schema-routing.md' }]), /npm pack includes forbidden workspace artifact: docs\/reference\/omx-config-schema-routing\.md/);
|
|
1095
|
+
for (const path of [
|
|
1096
|
+
'.gjc/session/plan.md',
|
|
1097
|
+
'docs/reference/page.md',
|
|
1098
|
+
'.omx/state/team.json',
|
|
1099
|
+
'artifact.tgz',
|
|
1100
|
+
'tmp/smoke-output.txt',
|
|
1101
|
+
'temp/smoke-output.json',
|
|
1102
|
+
'scratch.tmp',
|
|
1103
|
+
]) {
|
|
1104
|
+
assert.equal(isForbiddenPackedInstallArtifact(path), true, `expected ${path} to be rejected`);
|
|
1105
|
+
}
|
|
1106
|
+
for (const prefix of PACKED_INSTALL_FORBIDDEN_ARTIFACT_PATHS) {
|
|
1107
|
+
assert.equal(isForbiddenPackedInstallArtifact(`${prefix}probe`), true);
|
|
1108
|
+
}
|
|
1109
|
+
assert.equal(isForbiddenPackedInstallArtifact('templates/AGENTS.md'), false);
|
|
1110
|
+
assert.equal(isForbiddenPackedInstallArtifact('dist/notifications/__tests__/temp-mode.test.d.ts'), false);
|
|
1111
|
+
});
|
|
1112
|
+
test('packed install helpers enforce root rejection and no config mutation', () => {
|
|
1113
|
+
const help = 'Usage: omx reasoning <low|medium|high|xhigh>\n --xhigh\n';
|
|
1114
|
+
assert.doesNotThrow(() => assertInstalledRootReasoningHelp(help));
|
|
1115
|
+
assert.throws(() => assertInstalledRootReasoningHelp(`${help} --max\n`), /must not advertise --max/);
|
|
1116
|
+
const maxStderr = [
|
|
1117
|
+
'Reasoning mode "max" is not supported by "omx reasoning".',
|
|
1118
|
+
'Per-agent "max" is configured with agentReasoning; direct -c model_reasoning_effort=... is passed to Codex and remains capability-dependent.',
|
|
1119
|
+
'Invalid reasoning mode "max". Expected one of: low, medium, high, xhigh.',
|
|
1120
|
+
'Usage: omx reasoning <low|medium|high|xhigh>',
|
|
1121
|
+
].join('\n');
|
|
1122
|
+
assert.doesNotThrow(() => assertInstalledRootReasoningRejection('max', { status: 1, stdout: '', stderr: maxStderr }, undefined, undefined));
|
|
1123
|
+
assert.throws(() => assertInstalledRootReasoningRejection('max', { status: 1, stdout: '', stderr: maxStderr }, undefined, 'created'), /must not create or mutate config\.toml/);
|
|
1124
|
+
const ultraStderr = [
|
|
1125
|
+
'Reasoning mode "ultra" is not supported by OMX root or per-agent reasoning and is not an alias for "max".',
|
|
1126
|
+
'Direct -c model_reasoning_effort=... remains opaque Codex passthrough.',
|
|
1127
|
+
'Invalid reasoning mode "ultra". Expected one of: low, medium, high, xhigh.',
|
|
1128
|
+
'Usage: omx reasoning <low|medium|high|xhigh>',
|
|
1129
|
+
].join('\n');
|
|
1130
|
+
assert.doesNotThrow(() => assertInstalledRootReasoningRejection('ultra', { status: 1, stdout: '', stderr: ultraStderr }, 'model = "preserve"\n', 'model = "preserve"\n'));
|
|
1131
|
+
});
|
|
1132
|
+
test('packed install helpers freeze installed runtime and declaration reasoning contracts', () => {
|
|
1133
|
+
const models = {
|
|
1134
|
+
CANONICAL_REASONING_EFFORTS: ['low', 'medium', 'high', 'xhigh'],
|
|
1135
|
+
AMBIGUOUS_UNSUPPORTED_REASONING_EFFORTS: ['max', 'ultra'],
|
|
1136
|
+
PER_AGENT_REASONING_EFFORTS: ['low', 'medium', 'high', 'xhigh', 'max'],
|
|
1137
|
+
ROOT_REASONING_EFFORTS: ['low', 'medium', 'high', 'xhigh'],
|
|
1138
|
+
ROOT_UNSUPPORTED_REASONING_EFFORTS: ['max', 'ultra'],
|
|
1139
|
+
isAmbiguousUnsupportedReasoningEffort: (value) => value.toLowerCase() === 'max' || value.toLowerCase() === 'ultra',
|
|
1140
|
+
isUnsupportedRootReasoningEffort: (value) => value.toLowerCase() === 'max' || value.toLowerCase() === 'ultra',
|
|
1141
|
+
normalizeUnsupportedRootReasoningEffort: (value) => {
|
|
1142
|
+
const normalized = value.trim().toLowerCase();
|
|
1143
|
+
return normalized === 'max' || normalized === 'ultra' ? normalized : undefined;
|
|
1144
|
+
},
|
|
1145
|
+
};
|
|
1146
|
+
assert.doesNotThrow(() => assertInstalledReasoningRuntimeContract(models));
|
|
1147
|
+
const modelsDeclaration = [
|
|
1148
|
+
'export declare const CANONICAL_REASONING_EFFORTS: readonly ["low", "medium", "high", "xhigh"];',
|
|
1149
|
+
'export type ConfiguredAgentReasoningEffort = (typeof CANONICAL_REASONING_EFFORTS)[number];',
|
|
1150
|
+
'export declare const AMBIGUOUS_UNSUPPORTED_REASONING_EFFORTS: readonly ["max", "ultra"];',
|
|
1151
|
+
'export declare const PER_AGENT_REASONING_EFFORTS: readonly ["low", "medium", "high", "xhigh", "max"];',
|
|
1152
|
+
'export type PerAgentReasoningEffort = (typeof PER_AGENT_REASONING_EFFORTS)[number];',
|
|
1153
|
+
'export declare const ROOT_REASONING_EFFORTS: readonly ["low", "medium", "high", "xhigh"];',
|
|
1154
|
+
'export type RootReasoningEffort = (typeof ROOT_REASONING_EFFORTS)[number];',
|
|
1155
|
+
'export declare const ROOT_UNSUPPORTED_REASONING_EFFORTS: readonly ["max", "ultra"];',
|
|
1156
|
+
'export declare function isUnsupportedRootReasoningEffort(value: string): boolean;',
|
|
1157
|
+
'export declare function normalizeUnsupportedRootReasoningEffort(value: string): RootUnsupportedReasoningEffort | undefined;',
|
|
1158
|
+
].join('\n');
|
|
1159
|
+
const definitionsDeclaration = [
|
|
1160
|
+
'export interface AgentDefinition {',
|
|
1161
|
+
" reasoningEffort: 'low' | 'medium' | 'high' | 'xhigh';",
|
|
1162
|
+
'}',
|
|
1163
|
+
].join('\n');
|
|
1164
|
+
assert.doesNotThrow(() => assertInstalledReasoningDeclarationContract({
|
|
1165
|
+
models: modelsDeclaration,
|
|
1166
|
+
definitions: definitionsDeclaration,
|
|
1167
|
+
nativeConfig: 'export interface GeneratedNativeAgentConfig {\n reasoningEffort?: PerAgentReasoningEffort;\n}',
|
|
1168
|
+
team: 'export type TeamReasoningEffort = PerAgentReasoningEffort;',
|
|
1169
|
+
}));
|
|
1170
|
+
assert.throws(() => assertInstalledReasoningDeclarationContract({
|
|
1171
|
+
models: modelsDeclaration.replace(': boolean;', ': value is RootUnsupportedReasoningEffort;'),
|
|
1172
|
+
definitions: definitionsDeclaration,
|
|
1173
|
+
nativeConfig: 'reasoningEffort?: PerAgentReasoningEffort;',
|
|
1174
|
+
team: 'export type TeamReasoningEffort = PerAgentReasoningEffort;',
|
|
1175
|
+
}), /plain boolean, not a type predicate/);
|
|
1176
|
+
});
|
|
1177
|
+
test('packed install removes same-user native-anchor authentication', async () => {
|
|
1178
|
+
const hookSource = await readFile(join(process.cwd(), 'src/scripts/codex-native-hook.ts'), 'utf8');
|
|
1179
|
+
const cliSource = await readFile(join(process.cwd(), 'src/cli/index.ts'), 'utf8');
|
|
1180
|
+
assert.doesNotMatch(hookSource, /isVerifiedPluginLauncherClaim|classifyNativeTranscriptProvenance|signNativeLeaderAttestation|native-anchor-auth/);
|
|
1181
|
+
assert.match(hookSource, /unsupported_documented_leader_proof/);
|
|
1182
|
+
assert.match(cliSource, /execWithOverlay[\s\S]+OMX_CODEX_LAUNCH_ID[\s\S]+buildHudRuntimeEnv\(\{ sessionId/);
|
|
1183
|
+
});
|
|
1184
|
+
test('packed install contract requires canonical/plugin Team skill parity and text', async () => {
|
|
1185
|
+
const canonical = await readFile(join(process.cwd(), 'skills/team/SKILL.md'));
|
|
1186
|
+
const pluginMirror = await readFile(join(process.cwd(), 'plugins/oh-my-codex/skills/team/SKILL.md'));
|
|
1187
|
+
assert.doesNotThrow(() => assertInstalledTeamSkillContract(canonical, pluginMirror));
|
|
1188
|
+
});
|
|
1189
|
+
test('packed install plugin assertions enforce the packaged plugin contract', async () => {
|
|
1190
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-packed-plugin-surface-'));
|
|
1191
|
+
try {
|
|
1192
|
+
const pluginRoot = join(root, 'plugins/oh-my-codex');
|
|
1193
|
+
const pluginManifestPath = join(pluginRoot, '.codex-plugin/plugin.json');
|
|
1194
|
+
const mcpManifestPath = join(pluginRoot, '.mcp.json');
|
|
1195
|
+
const appManifestPath = join(pluginRoot, '.app.json');
|
|
1196
|
+
const hooksManifestPath = join(pluginRoot, 'hooks/hooks.json');
|
|
1197
|
+
const hookLauncherPath = join(pluginRoot, 'hooks/codex-native-hook.mjs');
|
|
1198
|
+
const hookCommand = 'node "${PLUGIN_ROOT}/hooks/codex-native-hook.mjs"';
|
|
1199
|
+
await mkdir(join(pluginRoot, '.codex-plugin'), { recursive: true });
|
|
1200
|
+
await mkdir(join(pluginRoot, 'hooks'), { recursive: true });
|
|
1201
|
+
const writeValidPluginSurface = async () => {
|
|
1202
|
+
await writeFile(pluginManifestPath, JSON.stringify({
|
|
1203
|
+
name: 'oh-my-codex',
|
|
1204
|
+
version: '0.0.0-test',
|
|
1205
|
+
skills: './skills/',
|
|
1206
|
+
mcpServers: './.mcp.json',
|
|
1207
|
+
apps: './.app.json',
|
|
1208
|
+
hooks: './hooks/hooks.json',
|
|
1209
|
+
interface: {
|
|
1210
|
+
displayName: 'OMX',
|
|
1211
|
+
shortDescription: 'Test plugin',
|
|
1212
|
+
longDescription: 'Structurally valid plugin test fixture.',
|
|
1213
|
+
developerName: 'Test',
|
|
1214
|
+
category: 'Developer Tools',
|
|
1215
|
+
},
|
|
1216
|
+
}));
|
|
1217
|
+
await writeFile(mcpManifestPath, JSON.stringify({
|
|
1218
|
+
mcpServers: Object.fromEntries([
|
|
1219
|
+
['omx_state', 'state'],
|
|
1220
|
+
['omx_memory', 'memory'],
|
|
1221
|
+
['omx_code_intel', 'code-intel'],
|
|
1222
|
+
['omx_trace', 'trace'],
|
|
1223
|
+
['omx_wiki', 'wiki'],
|
|
1224
|
+
['omx_hermes', 'hermes'],
|
|
1225
|
+
].map(([name, service]) => [name, {
|
|
1226
|
+
command: 'omx',
|
|
1227
|
+
args: ['mcp-serve', service],
|
|
1228
|
+
enabled: false,
|
|
1229
|
+
}])),
|
|
1230
|
+
}));
|
|
1231
|
+
await writeFile(appManifestPath, JSON.stringify({ apps: {} }));
|
|
1232
|
+
await writeFile(hooksManifestPath, JSON.stringify({
|
|
1233
|
+
hooks: Object.fromEntries(PACKED_INSTALL_NATIVE_HOOK_SMOKE_EVENTS.map((eventName) => [eventName, [{
|
|
1234
|
+
hooks: [{ type: 'command', command: hookCommand }],
|
|
1235
|
+
}]])),
|
|
1236
|
+
}));
|
|
1237
|
+
await writeFile(hookLauncherPath, [
|
|
1238
|
+
'#!/usr/bin/env node',
|
|
1239
|
+
"import { spawn } from 'node:child_process';",
|
|
1240
|
+
"import { join } from 'node:path';",
|
|
1241
|
+
"const OMX_PLUGIN_HOOK_LAUNCHER_CONTRACT_MARKER = 'omx-plugin-hook-launcher:v1';",
|
|
1242
|
+
"const OMX_PLUGIN_HOOK_ROUTING_ONLY_MARKER = 'omx-plugin-hook-routing-only:v1';",
|
|
1243
|
+
"const hookDir = new URL('.', import.meta.url).pathname;",
|
|
1244
|
+
'function readPinnedLauncher() {',
|
|
1245
|
+
" const launcherPath = join(hookDir, 'omx-command.json');",
|
|
1246
|
+
' return { command: process.execPath, argsPrefix: [], launcherPath };',
|
|
1247
|
+
'}',
|
|
1248
|
+
'const input = Buffer.from(\'\');',
|
|
1249
|
+
'const { command, argsPrefix } = readPinnedLauncher();',
|
|
1250
|
+
"const child = spawn(command, [...argsPrefix, 'codex-native-hook']);",
|
|
1251
|
+
'child.stdin.end(input);',
|
|
1252
|
+
'',
|
|
1253
|
+
].join('\n'));
|
|
1254
|
+
};
|
|
1255
|
+
await writeValidPluginSurface();
|
|
1256
|
+
assert.doesNotThrow(() => assertInstalledPluginSurface(root));
|
|
1257
|
+
await writeValidPluginSurface();
|
|
1258
|
+
await writeFile(hookLauncherPath, [
|
|
1259
|
+
'#!/usr/bin/env node',
|
|
1260
|
+
"const OMX_PLUGIN_HOOK_LAUNCHER_CONTRACT_MARKER = 'omx-plugin-hook-launcher:v1';",
|
|
1261
|
+
'process.stdout.write(OMX_PLUGIN_HOOK_LAUNCHER_CONTRACT_MARKER);',
|
|
1262
|
+
'',
|
|
1263
|
+
].join('\n'));
|
|
1264
|
+
assert.throws(() => assertInstalledPluginSurface(root), /must read its pinned omx-command\.json delegate configuration/);
|
|
1265
|
+
await writeFile(pluginManifestPath, '{}');
|
|
1266
|
+
assert.throws(() => assertInstalledPluginSurface(root), /plugin\.json\.name/);
|
|
1267
|
+
await writeValidPluginSurface();
|
|
1268
|
+
await writeFile(mcpManifestPath, JSON.stringify({ mcpServers: {} }));
|
|
1269
|
+
assert.throws(() => assertInstalledPluginSurface(root), /omx_state/);
|
|
1270
|
+
await writeValidPluginSurface();
|
|
1271
|
+
await writeFile(appManifestPath, JSON.stringify({ apps: [] }));
|
|
1272
|
+
assert.throws(() => assertInstalledPluginSurface(root), /\.app\.json\.apps/);
|
|
1273
|
+
await writeValidPluginSurface();
|
|
1274
|
+
await writeFile(hooksManifestPath, JSON.stringify({ hooks: {} }));
|
|
1275
|
+
assert.throws(() => assertInstalledPluginSurface(root), /hook event is missing: SessionStart/);
|
|
1276
|
+
await writeValidPluginSurface();
|
|
1277
|
+
await writeFile(hookLauncherPath, 'export {};\n');
|
|
1278
|
+
assert.throws(() => assertInstalledPluginSurface(root), /must start with a Node shebang/);
|
|
1279
|
+
await writeValidPluginSurface();
|
|
1280
|
+
await writeFile(mcpManifestPath, '{not-json');
|
|
1281
|
+
assert.throws(() => assertInstalledPluginSurface(root), /plugin manifest is not parseable JSON/);
|
|
1282
|
+
}
|
|
1283
|
+
finally {
|
|
1284
|
+
await rm(root, { recursive: true, force: true });
|
|
1285
|
+
}
|
|
1286
|
+
});
|
|
896
1287
|
test('resolveGitCommonDir resolves relative git common dir output against the repo root', () => {
|
|
897
1288
|
const commonDir = resolveGitCommonDir('/tmp/worktree', () => ({
|
|
898
1289
|
status: 0,
|