oh-my-codex 0.21.0 → 0.21.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.toml +1 -1
- package/README.md +4 -2
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.d.ts +2 -0
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.d.ts.map +1 -0
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.js +592 -0
- package/dist/cli/__tests__/detached-launch-diagnostics-3578.test.js.map +1 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.js +270 -33
- package/dist/cli/__tests__/detached-leader-teardown.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +133 -5
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +543 -2
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.d.ts +2 -0
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.d.ts.map +1 -0
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.js +17 -0
- package/dist/cli/__tests__/issue-windows-cancel-identity.test.js.map +1 -0
- package/dist/cli/__tests__/launch-fallback.test.js +15 -3
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +20 -0
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.d.ts +2 -0
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.js +76 -0
- package/dist/cli/__tests__/plugin-cache-stale-lock.test.js.map +1 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.d.ts +2 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.js +1662 -0
- package/dist/cli/__tests__/plugin-cache-symlink-provenance-3552.test.js.map +1 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.d.ts +2 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.d.ts.map +1 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.js +522 -0
- package/dist/cli/__tests__/plugin-launcher-provenance-3558.test.js.map +1 -0
- package/dist/cli/__tests__/ralplan-advisory.test.d.ts +2 -0
- package/dist/cli/__tests__/ralplan-advisory.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralplan-advisory.test.js +301 -0
- package/dist/cli/__tests__/ralplan-advisory.test.js.map +1 -0
- package/dist/cli/__tests__/ralplan.test.js +39 -0
- package/dist/cli/__tests__/ralplan.test.js.map +1 -1
- package/dist/cli/__tests__/resume.test.js +81 -6
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/session-scoped-runtime.test.js +423 -4
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +60 -3
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +9 -0
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js +4 -0
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +71 -0
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js +30 -4
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +57 -8
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +113 -7
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1850 -185
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/native-assets.d.ts +2 -1
- package/dist/cli/native-assets.d.ts.map +1 -1
- package/dist/cli/native-assets.js +7 -7
- package/dist/cli/native-assets.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +89 -4
- package/dist/cli/plugin-marketplace.d.ts.map +1 -1
- package/dist/cli/plugin-marketplace.js +2135 -118
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/ralplan.d.ts +2 -1
- package/dist/cli/ralplan.d.ts.map +1 -1
- package/dist/cli/ralplan.js +149 -9
- package/dist/cli/ralplan.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +7 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/sparkshell.d.ts.map +1 -1
- package/dist/cli/sparkshell.js +9 -10
- package/dist/cli/sparkshell.js.map +1 -1
- package/dist/cli/update-worker.js +9 -0
- package/dist/cli/update-worker.js.map +1 -1
- package/dist/cli/update.d.ts +1 -0
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +9 -0
- package/dist/cli/update.js.map +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +118 -0
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +74 -4
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +74 -0
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.d.ts +2 -0
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.js +250 -0
- package/dist/hooks/__tests__/ralplan-advisory-keyword.test.js.map +1 -0
- package/dist/hooks/__tests__/session.test.js +10 -1
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +8 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +130 -9
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/session.d.ts +5 -0
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +17 -3
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +16 -1
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +134 -7
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/render.test.js +57 -0
- package/dist/hud/__tests__/render.test.js.map +1 -1
- package/dist/hud/__tests__/session-attached.test.d.ts +2 -0
- package/dist/hud/__tests__/session-attached.test.d.ts.map +1 -0
- package/dist/hud/__tests__/session-attached.test.js +82 -0
- package/dist/hud/__tests__/session-attached.test.js.map +1 -0
- package/dist/hud/__tests__/state.test.js +94 -2
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/tmux-split-realtmux.test.js +169 -2
- package/dist/hud/__tests__/tmux-split-realtmux.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +104 -22
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/__tests__/types.test.js +9 -0
- package/dist/hud/__tests__/types.test.js.map +1 -1
- package/dist/hud/__tests__/watch-detached.test.d.ts +2 -0
- package/dist/hud/__tests__/watch-detached.test.d.ts.map +1 -0
- package/dist/hud/__tests__/watch-detached.test.js +383 -0
- package/dist/hud/__tests__/watch-detached.test.js.map +1 -0
- package/dist/hud/__tests__/watch-realtmux.test.d.ts +2 -0
- package/dist/hud/__tests__/watch-realtmux.test.d.ts.map +1 -0
- package/dist/hud/__tests__/watch-realtmux.test.js +322 -0
- package/dist/hud/__tests__/watch-realtmux.test.js.map +1 -0
- package/dist/hud/index.d.ts +3 -0
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +98 -20
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +68 -24
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +20 -0
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/session-attached.d.ts +15 -0
- package/dist/hud/session-attached.d.ts.map +1 -0
- package/dist/hud/session-attached.js +47 -0
- package/dist/hud/session-attached.js.map +1 -0
- package/dist/hud/state.d.ts +9 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +140 -3
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/tmux.d.ts +4 -0
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +86 -23
- package/dist/hud/tmux.js.map +1 -1
- package/dist/hud/types.d.ts +20 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +3 -0
- package/dist/hud/types.js.map +1 -1
- package/dist/modes/base.d.ts +15 -2
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +105 -16
- package/dist/modes/base.js.map +1 -1
- package/dist/question/autopilot-wait.js +2 -2
- package/dist/question/autopilot-wait.js.map +1 -1
- package/dist/question/deep-interview.js +2 -2
- package/dist/question/deep-interview.js.map +1 -1
- package/dist/ralplan/__tests__/advisory-activation.test.d.ts +2 -0
- package/dist/ralplan/__tests__/advisory-activation.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/advisory-activation.test.js +700 -0
- package/dist/ralplan/__tests__/advisory-activation.test.js.map +1 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.d.ts +2 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.js +88 -0
- package/dist/ralplan/__tests__/advisory-detached-transition.test.js.map +1 -0
- package/dist/ralplan/__tests__/advisory.test.d.ts +2 -0
- package/dist/ralplan/__tests__/advisory.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/advisory.test.js +1087 -0
- package/dist/ralplan/__tests__/advisory.test.js.map +1 -0
- package/dist/ralplan/__tests__/runtime.test.js +416 -7
- package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
- package/dist/ralplan/advisory-activation-verifier.d.ts +19 -0
- package/dist/ralplan/advisory-activation-verifier.d.ts.map +1 -0
- package/dist/ralplan/advisory-activation-verifier.js +77 -0
- package/dist/ralplan/advisory-activation-verifier.js.map +1 -0
- package/dist/ralplan/advisory-activation.d.ts +34 -0
- package/dist/ralplan/advisory-activation.d.ts.map +1 -0
- package/dist/ralplan/advisory-activation.js +205 -0
- package/dist/ralplan/advisory-activation.js.map +1 -0
- package/dist/ralplan/advisory-contract.d.ts +103 -0
- package/dist/ralplan/advisory-contract.d.ts.map +1 -0
- package/dist/ralplan/advisory-contract.js +83 -0
- package/dist/ralplan/advisory-contract.js.map +1 -0
- package/dist/ralplan/advisory-detached-transition.d.ts +11 -0
- package/dist/ralplan/advisory-detached-transition.d.ts.map +1 -0
- package/dist/ralplan/advisory-detached-transition.js +21 -0
- package/dist/ralplan/advisory-detached-transition.js.map +1 -0
- package/dist/ralplan/advisory-evidence.d.ts +91 -0
- package/dist/ralplan/advisory-evidence.d.ts.map +1 -0
- package/dist/ralplan/advisory-evidence.js +393 -0
- package/dist/ralplan/advisory-evidence.js.map +1 -0
- package/dist/ralplan/advisory-lifecycle-validation.d.ts +11 -0
- package/dist/ralplan/advisory-lifecycle-validation.d.ts.map +1 -0
- package/dist/ralplan/advisory-lifecycle-validation.js +72 -0
- package/dist/ralplan/advisory-lifecycle-validation.js.map +1 -0
- package/dist/ralplan/advisory-postconditions.d.ts +3 -0
- package/dist/ralplan/advisory-postconditions.d.ts.map +1 -0
- package/dist/ralplan/advisory-postconditions.js +33 -0
- package/dist/ralplan/advisory-postconditions.js.map +1 -0
- package/dist/ralplan/advisory-recovery-journal.d.ts +56 -0
- package/dist/ralplan/advisory-recovery-journal.d.ts.map +1 -0
- package/dist/ralplan/advisory-recovery-journal.js +136 -0
- package/dist/ralplan/advisory-recovery-journal.js.map +1 -0
- package/dist/ralplan/advisory-storage.d.ts +24 -0
- package/dist/ralplan/advisory-storage.d.ts.map +1 -0
- package/dist/ralplan/advisory-storage.js +106 -0
- package/dist/ralplan/advisory-storage.js.map +1 -0
- package/dist/ralplan/advisory.d.ts +99 -0
- package/dist/ralplan/advisory.d.ts.map +1 -0
- package/dist/ralplan/advisory.js +914 -0
- package/dist/ralplan/advisory.js.map +1 -0
- package/dist/ralplan/documented-leader-preflight.d.ts +8 -0
- package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -1
- package/dist/ralplan/documented-leader-preflight.js +60 -2
- package/dist/ralplan/documented-leader-preflight.js.map +1 -1
- package/dist/ralplan/runtime-advisory-lifecycle.d.ts +74 -0
- package/dist/ralplan/runtime-advisory-lifecycle.d.ts.map +1 -0
- package/dist/ralplan/runtime-advisory-lifecycle.js +352 -0
- package/dist/ralplan/runtime-advisory-lifecycle.js.map +1 -0
- package/dist/ralplan/runtime-contract.d.ts +126 -0
- package/dist/ralplan/runtime-contract.d.ts.map +1 -0
- package/dist/ralplan/runtime-contract.js +2 -0
- package/dist/ralplan/runtime-contract.js.map +1 -0
- package/dist/ralplan/runtime.d.ts +6 -109
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +174 -56
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/scripts/__tests__/postinstall.test.js +26 -0
- package/dist/scripts/__tests__/postinstall.test.js.map +1 -1
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.d.ts +2 -0
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.js +299 -0
- package/dist/scripts/__tests__/ralplan-advisory-hook.test.js.map +1 -0
- package/dist/scripts/__tests__/smoke-packed-install.test.js +102 -8
- package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts +20 -0
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +226 -15
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/postinstall.d.ts +7 -0
- package/dist/scripts/postinstall.d.ts.map +1 -1
- package/dist/scripts/postinstall.js +40 -0
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +21 -5
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +157 -57
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/state/__tests__/mode-binding-lease.test.d.ts +2 -0
- package/dist/state/__tests__/mode-binding-lease.test.d.ts.map +1 -0
- package/dist/state/__tests__/mode-binding-lease.test.js +498 -0
- package/dist/state/__tests__/mode-binding-lease.test.js.map +1 -0
- package/dist/state/__tests__/operations.test.js +1 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/pinned-atomic-file.test.d.ts +2 -0
- package/dist/state/__tests__/pinned-atomic-file.test.d.ts.map +1 -0
- package/dist/state/__tests__/pinned-atomic-file.test.js +438 -0
- package/dist/state/__tests__/pinned-atomic-file.test.js.map +1 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.d.ts +2 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.d.ts.map +1 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.js +179 -0
- package/dist/state/__tests__/skill-active-exact-session-transaction.test.js.map +1 -0
- package/dist/state/__tests__/skill-active.test.js +29 -1
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/mode-binding-lease-helper.d.ts +2 -0
- package/dist/state/mode-binding-lease-helper.d.ts.map +1 -0
- package/dist/state/mode-binding-lease-helper.js +623 -0
- package/dist/state/mode-binding-lease-helper.js.map +1 -0
- package/dist/state/mode-binding-lease.d.ts +25 -0
- package/dist/state/mode-binding-lease.d.ts.map +1 -0
- package/dist/state/mode-binding-lease.js +380 -0
- package/dist/state/mode-binding-lease.js.map +1 -0
- package/dist/state/operations.d.ts +29 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +203 -122
- package/dist/state/operations.js.map +1 -1
- package/dist/state/pinned-atomic-file-darwin-client.d.ts +34 -0
- package/dist/state/pinned-atomic-file-darwin-client.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-client.js +174 -0
- package/dist/state/pinned-atomic-file-darwin-client.js.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-helper.d.ts +2 -0
- package/dist/state/pinned-atomic-file-darwin-helper.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-helper.js +275 -0
- package/dist/state/pinned-atomic-file-darwin-helper.js.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.d.ts +2 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.js +272 -0
- package/dist/state/pinned-atomic-file-darwin-janitor.js.map +1 -0
- package/dist/state/pinned-atomic-file.d.ts +29 -0
- package/dist/state/pinned-atomic-file.d.ts.map +1 -0
- package/dist/state/pinned-atomic-file.js +536 -0
- package/dist/state/pinned-atomic-file.js.map +1 -0
- package/dist/state/process-identity.d.ts +30 -0
- package/dist/state/process-identity.d.ts.map +1 -0
- package/dist/state/process-identity.js +99 -0
- package/dist/state/process-identity.js.map +1 -0
- 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 +82 -5
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.js +1 -1
- package/dist/state/workflow-transition-reconcile.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +109 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +10 -1
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/utils/__tests__/file-durability.test.js +20 -0
- package/dist/utils/__tests__/file-durability.test.js.map +1 -1
- package/dist/utils/file-durability.d.ts +1 -1
- package/dist/utils/file-durability.d.ts.map +1 -1
- package/dist/utils/file-durability.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +12 -4
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/dist/verification/__tests__/ci-trusted-publish.test.d.ts +2 -0
- package/dist/verification/__tests__/ci-trusted-publish.test.d.ts.map +1 -0
- package/dist/verification/__tests__/ci-trusted-publish.test.js +205 -0
- package/dist/verification/__tests__/ci-trusted-publish.test.js.map +1 -0
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js +10 -5
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
- package/dist/verification/__tests__/publish-npm-manual-retired.test.d.ts +2 -0
- package/dist/verification/__tests__/publish-npm-manual-retired.test.d.ts.map +1 -0
- package/dist/verification/__tests__/publish-npm-manual-retired.test.js +22 -0
- package/dist/verification/__tests__/publish-npm-manual-retired.test.js.map +1 -0
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/doctor/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +10 -1
- package/plugins/oh-my-codex/skills/team/SKILL.md +2 -0
- package/skills/doctor/SKILL.md +1 -1
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/ralplan/SKILL.md +10 -1
- package/skills/team/SKILL.md +2 -0
- package/src/scripts/__tests__/postinstall.test.ts +28 -0
- package/src/scripts/__tests__/ralplan-advisory-hook.test.ts +320 -0
- package/src/scripts/__tests__/smoke-packed-install.test.ts +120 -7
- package/src/scripts/codex-native-hook.ts +220 -10
- package/src/scripts/postinstall.ts +46 -0
- package/src/scripts/smoke-packed-install.ts +175 -70
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { afterEach, describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
7
|
+
import { readCurrentRalplanAdvisory, observeRalplanAdvisoryPrompt, terminalizeRalplanAdvisory, } from '../../ralplan/advisory.js';
|
|
8
|
+
import { activateOrResumeRalplanAdvisory } from '../../ralplan/advisory-activation.js';
|
|
9
|
+
import { buildRalplanAdvisoryRoutingObservation, dispatchCodexNativeHook, } from '../codex-native-hook.js';
|
|
10
|
+
const roots = [];
|
|
11
|
+
afterEach(async () => Promise.all(roots.splice(0).map((path) => rm(path, { recursive: true, force: true }))));
|
|
12
|
+
async function terminalFixture(prefix) {
|
|
13
|
+
const cwd = await mkdtemp(join(tmpdir(), prefix));
|
|
14
|
+
roots.push(cwd);
|
|
15
|
+
const sessionId = 'session-a';
|
|
16
|
+
const stateDir = join(cwd, '.omx', 'state');
|
|
17
|
+
const sessionDir = join(stateDir, 'sessions', sessionId);
|
|
18
|
+
await mkdir(sessionDir, { recursive: true });
|
|
19
|
+
await writeFile(join(stateDir, 'session.json'), JSON.stringify({
|
|
20
|
+
session_id: sessionId, native_session_id: sessionId, owner_codex_session_id: sessionId,
|
|
21
|
+
leader_thread_id: 'root-a', started_at: '2026-08-28T00:00:00.000Z', cwd, state_root: stateDir,
|
|
22
|
+
}));
|
|
23
|
+
await writeFile(join(stateDir, 'subagent-tracking.json'), JSON.stringify({
|
|
24
|
+
schemaVersion: 1,
|
|
25
|
+
sessions: {
|
|
26
|
+
[sessionId]: {
|
|
27
|
+
session_id: sessionId, leader_thread_id: 'root-a',
|
|
28
|
+
threads: { 'root-a': { thread_id: 'root-a', kind: 'leader' } },
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
}));
|
|
32
|
+
const { activation } = await activateOrResumeRalplanAdvisory({
|
|
33
|
+
cwd, sessionId, rootThreadId: 'root-a', activationTurnId: 'turn-a', generationId: 'generation-a',
|
|
34
|
+
prompt: '$ralplan --advisory hook fixture', producer: 'native', threadKind: 'root-or-drift',
|
|
35
|
+
});
|
|
36
|
+
const activeMode = {
|
|
37
|
+
active: true, mode: 'ralplan', current_phase: 'draft', iteration: 1,
|
|
38
|
+
session_id: sessionId, thread_id: 'root-a', turn_id: 'turn-a',
|
|
39
|
+
workflow_variant: 'advisory', advisory_generation_id: activation.generation_id,
|
|
40
|
+
execution_handoff_authorized: false, host_verified: false, planning_complete: false,
|
|
41
|
+
};
|
|
42
|
+
await writeFile(join(sessionDir, 'ralplan-state.json'), JSON.stringify(activeMode));
|
|
43
|
+
await terminalizeRalplanAdvisory({
|
|
44
|
+
cwd, sessionId, generationId: activation.generation_id, closingTurnId: 'turn-close', iteration: 1,
|
|
45
|
+
outcome: 'cancelled', integrityStatus: 'proven',
|
|
46
|
+
});
|
|
47
|
+
const inactiveMode = {
|
|
48
|
+
...activeMode, active: false, current_phase: 'complete', planning_complete: true,
|
|
49
|
+
execution_handoff_authorized: false, host_verified: false,
|
|
50
|
+
ralplan_consensus_gate: { complete: false },
|
|
51
|
+
};
|
|
52
|
+
await writeFile(join(sessionDir, 'ralplan-state.json'), JSON.stringify(inactiveMode));
|
|
53
|
+
await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify(inactiveMode));
|
|
54
|
+
return { cwd, sessionId, stateDir, sessionDir, activation };
|
|
55
|
+
}
|
|
56
|
+
async function conflictingReplayFixture(prefix, standardPhase = 'architect-review') {
|
|
57
|
+
const fixture = await terminalFixture(prefix);
|
|
58
|
+
// Replace the committed cancellation fixture with a fresh generation whose
|
|
59
|
+
// journal is deliberately left prepared before any mirror replay.
|
|
60
|
+
await rm(join(fixture.sessionDir, 'ralplan-advisory'), { recursive: true, force: true });
|
|
61
|
+
const { activation } = await activateOrResumeRalplanAdvisory({
|
|
62
|
+
cwd: fixture.cwd, sessionId: fixture.sessionId, rootThreadId: 'root-a', activationTurnId: 'turn-replay', generationId: 'generation-replay',
|
|
63
|
+
prompt: '$ralplan --advisory replay fixture', producer: 'native', threadKind: 'root-or-drift',
|
|
64
|
+
});
|
|
65
|
+
const advisoryMode = {
|
|
66
|
+
active: true, mode: 'ralplan', current_phase: 'draft', session_id: fixture.sessionId, thread_id: 'root-a', turn_id: 'turn-replay',
|
|
67
|
+
workflow_variant: 'advisory', advisory_generation_id: activation.generation_id,
|
|
68
|
+
};
|
|
69
|
+
await writeFile(join(fixture.sessionDir, 'ralplan-state.json'), JSON.stringify(advisoryMode));
|
|
70
|
+
await assert.rejects(terminalizeRalplanAdvisory({
|
|
71
|
+
cwd: fixture.cwd, sessionId: fixture.sessionId, generationId: activation.generation_id,
|
|
72
|
+
closingTurnId: 'turn-close-replay', iteration: 1, outcome: 'cancelled', integrityStatus: 'proven',
|
|
73
|
+
terminalModeUpdates: {
|
|
74
|
+
...advisoryMode, active: false, current_phase: 'cancelled', execution_handoff_authorized: false, host_verified: false,
|
|
75
|
+
},
|
|
76
|
+
failpoint: (name) => { if (name === 'journal-prepare')
|
|
77
|
+
throw new Error('prepared-replay'); },
|
|
78
|
+
}), /prepared-replay/);
|
|
79
|
+
const standardMode = {
|
|
80
|
+
active: true, mode: 'ralplan', workflow_variant: 'standard', current_phase: standardPhase,
|
|
81
|
+
session_id: fixture.sessionId, thread_id: 'root-standard', turn_id: 'turn-standard',
|
|
82
|
+
};
|
|
83
|
+
const modePath = join(fixture.sessionDir, 'ralplan-state.json');
|
|
84
|
+
await writeFile(modePath, JSON.stringify(standardMode));
|
|
85
|
+
return { ...fixture, activation, generationDir: join(fixture.sessionDir, 'ralplan-advisory', activation.generation_id), modePath, standardMode };
|
|
86
|
+
}
|
|
87
|
+
async function snapshotDirectoryBytes(root) {
|
|
88
|
+
const values = [];
|
|
89
|
+
const walk = async (directory, prefix = '') => {
|
|
90
|
+
for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
91
|
+
const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
92
|
+
const path = join(directory, entry.name);
|
|
93
|
+
if (entry.isDirectory())
|
|
94
|
+
await walk(path, relative);
|
|
95
|
+
else
|
|
96
|
+
values.push([relative, (await readFile(path)).toString('base64')]);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
await walk(root);
|
|
100
|
+
return values;
|
|
101
|
+
}
|
|
102
|
+
describe('ralplan advisory non-authoritative native hooks', () => {
|
|
103
|
+
it('the packed hook never emits a PreToolUse block for Advisory, including mutation and unknown MCP transports', async () => {
|
|
104
|
+
const { cwd, sessionId } = await terminalFixture('omx-advisory-nonauthoritative-pretool-');
|
|
105
|
+
for (const toolName of ['Write', 'Bash', 'mcp__omx_goal__create_goal', 'mcp__thirdparty__commit', 'mcp__unknown__anything']) {
|
|
106
|
+
const packed = await dispatchCodexNativeHook({
|
|
107
|
+
hook_event_name: 'PreToolUse', cwd, session_id: sessionId, thread_id: 'root-a',
|
|
108
|
+
tool_name: toolName, tool_input: { file_path: join(cwd, 'src', 'x.ts'), content: 'x' },
|
|
109
|
+
}, { cwd });
|
|
110
|
+
assert.notEqual(packed.outputJson?.decision, 'block', toolName);
|
|
111
|
+
}
|
|
112
|
+
const cli = spawnSync(process.execPath, [join(process.cwd(), 'dist', 'scripts', 'codex-native-hook.js')], {
|
|
113
|
+
cwd,
|
|
114
|
+
input: JSON.stringify({
|
|
115
|
+
hook_event_name: 'PreToolUse', cwd, session_id: sessionId, thread_id: 'root-a',
|
|
116
|
+
tool_name: 'Write', tool_input: { file_path: join(cwd, 'src', 'packed.ts'), content: 'x' },
|
|
117
|
+
}),
|
|
118
|
+
encoding: 'utf8',
|
|
119
|
+
});
|
|
120
|
+
assert.equal(cli.status, 0, cli.stderr);
|
|
121
|
+
assert.notEqual(JSON.parse(cli.stdout || '{}').decision, 'block');
|
|
122
|
+
});
|
|
123
|
+
it('observes an explicit later execution request without automatic handoff or persistent elevation', async () => {
|
|
124
|
+
const { cwd, sessionId, sessionDir, activation } = await terminalFixture('omx-advisory-routing-observation-');
|
|
125
|
+
const before = await readCurrentRalplanAdvisory(cwd, sessionId);
|
|
126
|
+
const observed = await observeRalplanAdvisoryPrompt({
|
|
127
|
+
cwd, sessionId, turnId: 'turn-execute', threadId: 'root-a', prompt: 'implementá el plan .omx/plans/plan.md',
|
|
128
|
+
producer: 'native', threadKind: 'root-or-drift', isSubagentPromptSubmit: false,
|
|
129
|
+
});
|
|
130
|
+
const mode = JSON.parse(await readFile(join(sessionDir, 'ralplan-state.json'), 'utf8'));
|
|
131
|
+
const context = buildRalplanAdvisoryRoutingObservation(observed.intent, observed.projection, mode) ?? '';
|
|
132
|
+
assert.match(context, /ended as cancelled/i);
|
|
133
|
+
assert.doesNotMatch(context, /planning is complete/i);
|
|
134
|
+
const after = await readCurrentRalplanAdvisory(cwd, sessionId);
|
|
135
|
+
assert.deepEqual(after?.fence, before?.fence);
|
|
136
|
+
assert.equal(mode.active, false);
|
|
137
|
+
assert.equal(mode.planning_complete, true);
|
|
138
|
+
assert.equal(mode.host_verified, false);
|
|
139
|
+
assert.equal(mode.execution_handoff_authorized, false);
|
|
140
|
+
await assert.rejects(readFile(join(sessionDir, 'ralplan-advisory', activation.generation_id, 'release-authority.json')), /ENOENT/);
|
|
141
|
+
});
|
|
142
|
+
it('keeps classifier negatives inert and supplies context only for a primary affirmative request', async () => {
|
|
143
|
+
for (const [index, prompt] of ['¿podés implementarlo?', 'no quiero implementar', 'considerá implementar', 'copiá la frase implementá el plan'].entries()) {
|
|
144
|
+
const { cwd, sessionId } = await terminalFixture(`omx-advisory-routing-negative-${index}-`);
|
|
145
|
+
const observed = await observeRalplanAdvisoryPrompt({
|
|
146
|
+
cwd, sessionId, turnId: `turn-${index}`, threadId: 'root-a', prompt,
|
|
147
|
+
producer: 'native', threadKind: 'root-or-drift', isSubagentPromptSubmit: false,
|
|
148
|
+
});
|
|
149
|
+
const context = buildRalplanAdvisoryRoutingObservation(observed.intent, observed.projection, null) ?? '';
|
|
150
|
+
assert.doesNotMatch(context, /non-authoritative routing observation/i, prompt);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
it('reports positive routing context only for a complete approved proven lifecycle without a conflicting workflow', async () => {
|
|
154
|
+
const { cwd, sessionId } = await terminalFixture('omx-advisory-routing-matrix-');
|
|
155
|
+
const base = (await readCurrentRalplanAdvisory(cwd, sessionId));
|
|
156
|
+
const digest = 'a'.repeat(64);
|
|
157
|
+
const approved = {
|
|
158
|
+
...base,
|
|
159
|
+
fence: {
|
|
160
|
+
...base.fence, state: 'closed', outcome: 'approved', integrity_status: 'proven', evidence_bundle_sha256: digest,
|
|
161
|
+
iteration_id: 'iteration-a', plan_manifest_sha256: 'b'.repeat(64), architect_review_sha256: 'c'.repeat(64),
|
|
162
|
+
critic_review_sha256: 'd'.repeat(64),
|
|
163
|
+
},
|
|
164
|
+
journal: {
|
|
165
|
+
...base.journal, phase: 'committed', outcome: 'approved', integrity_status: 'proven', evidence_bundle_sha256: digest,
|
|
166
|
+
terminal_mode_updates: { ralplan_review_lifecycle: {
|
|
167
|
+
complete: true, sequence_valid: true, iteration: base.fence.iteration, iteration_id: 'iteration-a',
|
|
168
|
+
plan_manifest_sha256: 'b'.repeat(64), architect_review_sha256: 'c'.repeat(64),
|
|
169
|
+
critic_review_sha256: 'd'.repeat(64), evidence_bundle_sha256: digest,
|
|
170
|
+
evidence_scope: 'local_runtime', host_observable: false, host_verified: false,
|
|
171
|
+
} },
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
const advisoryBinding = {
|
|
175
|
+
active: false, workflow_variant: 'advisory', advisory_generation_id: base.activation.generation_id,
|
|
176
|
+
execution_handoff_authorized: false, host_verified: false, ralplan_consensus_gate: { complete: false },
|
|
177
|
+
};
|
|
178
|
+
const positive = buildRalplanAdvisoryRoutingObservation('execute', approved, advisoryBinding) ?? '';
|
|
179
|
+
assert.match(positive, /planning is complete/i);
|
|
180
|
+
assert.match(buildRalplanAdvisoryRoutingObservation('execute', approved, null) ?? '', /planning is complete/i);
|
|
181
|
+
assert.equal(buildRalplanAdvisoryRoutingObservation('execute', approved, { workflow_variant: 'standard', active: true }), null);
|
|
182
|
+
for (const [state, outcome, expected] of [
|
|
183
|
+
['pending_closeout', undefined, /still pending/i],
|
|
184
|
+
['recovery_required', 'failed', /requires lifecycle recovery/i],
|
|
185
|
+
['abandoned', 'abandoned', /ended as abandoned/i],
|
|
186
|
+
['abandoned', 'cancelled', /ended as cancelled/i],
|
|
187
|
+
]) {
|
|
188
|
+
const projection = { ...base, fence: { ...base.fence, state, outcome } };
|
|
189
|
+
assert.match(buildRalplanAdvisoryRoutingObservation('execute', projection, advisoryBinding) ?? '', expected);
|
|
190
|
+
}
|
|
191
|
+
const incomplete = { ...approved, journal: { ...approved.journal, terminal_mode_updates: {} } };
|
|
192
|
+
assert.match(buildRalplanAdvisoryRoutingObservation('execute', incomplete, advisoryBinding) ?? '', /does not contain a complete/i);
|
|
193
|
+
});
|
|
194
|
+
it('retains terminal evidence across restart-shaped reads without creating authorization', async () => {
|
|
195
|
+
const { cwd, sessionId, sessionDir } = await terminalFixture('omx-advisory-restart-evidence-');
|
|
196
|
+
const first = await readCurrentRalplanAdvisory(cwd, sessionId);
|
|
197
|
+
const second = await readCurrentRalplanAdvisory(cwd, sessionId);
|
|
198
|
+
assert.deepEqual(second?.fence, first?.fence);
|
|
199
|
+
assert.equal(second?.corruption, null);
|
|
200
|
+
const mode = JSON.parse(await readFile(join(sessionDir, 'ralplan-state.json'), 'utf8'));
|
|
201
|
+
assert.equal(mode.host_verified, false);
|
|
202
|
+
assert.equal(mode.execution_handoff_authorized, false);
|
|
203
|
+
});
|
|
204
|
+
it('surfaces reconciliation failures non-authoritatively while SessionStart and Stop continue normally', async () => {
|
|
205
|
+
const { cwd, sessionId } = await terminalFixture('omx-advisory-reconcile-diagnostic-');
|
|
206
|
+
const reconcileFailure = async () => { throw new Error('test-reconcile-visible'); };
|
|
207
|
+
const start = await dispatchCodexNativeHook({
|
|
208
|
+
hook_event_name: 'SessionStart', cwd, session_id: sessionId, thread_id: 'root-a', source: 'startup',
|
|
209
|
+
}, { cwd, reconcileRalplanAdvisoryFn: reconcileFailure });
|
|
210
|
+
const startContext = (start.outputJson?.hookSpecificOutput?.additionalContext ?? '');
|
|
211
|
+
assert.match(startContext, /test-reconcile-visible/);
|
|
212
|
+
assert.match(startContext, /non-authoritative diagnostic/);
|
|
213
|
+
assert.match(startContext, /Execution environment/i, 'normal SessionStart context should still be produced');
|
|
214
|
+
const stopFixture = await terminalFixture('omx-advisory-stop-reconcile-diagnostic-');
|
|
215
|
+
const stop = await dispatchCodexNativeHook({
|
|
216
|
+
hook_event_name: 'Stop', cwd: stopFixture.cwd, source: 'codex-app', session_id: stopFixture.sessionId,
|
|
217
|
+
thread_id: 'root-a', turn_id: 'turn-stop-diagnostic',
|
|
218
|
+
}, { cwd: stopFixture.cwd, reconcileRalplanAdvisoryFn: reconcileFailure });
|
|
219
|
+
assert.notEqual(stop.outputJson?.decision, 'block');
|
|
220
|
+
const baselineFixture = await terminalFixture('omx-advisory-stop-reconcile-baseline-');
|
|
221
|
+
const baselineStop = await dispatchCodexNativeHook({
|
|
222
|
+
hook_event_name: 'Stop', cwd: baselineFixture.cwd, source: 'codex-app', session_id: baselineFixture.sessionId,
|
|
223
|
+
thread_id: 'root-a', turn_id: 'turn-stop-baseline',
|
|
224
|
+
}, { cwd: baselineFixture.cwd });
|
|
225
|
+
assert.deepEqual(stop.outputJson, baselineStop.outputJson, 'diagnostic must not change the Stop decision/output contract');
|
|
226
|
+
const logDir = join(stopFixture.cwd, '.omx', 'logs');
|
|
227
|
+
const logBytes = (await Promise.all((await (await import('node:fs/promises')).readdir(logDir))
|
|
228
|
+
.map((name) => readFile(join(logDir, name), 'utf8')))).join('\n');
|
|
229
|
+
assert.match(logBytes, /ralplan_advisory_reconciliation_diagnostic/);
|
|
230
|
+
assert.match(logBytes, /test-reconcile-visible/);
|
|
231
|
+
});
|
|
232
|
+
it('does not replay a terminal Advisory journal over a live standard workflow on SessionStart or Stop', async () => {
|
|
233
|
+
const snapshotRelevant = async (fixture) => ({
|
|
234
|
+
mode: await readFile(fixture.modePath, 'utf8'),
|
|
235
|
+
generation: await snapshotDirectoryBytes(fixture.generationDir),
|
|
236
|
+
sessionSkill: await readFile(join(fixture.sessionDir, 'skill-active-state.json'), 'utf8').catch(() => null),
|
|
237
|
+
rootSkill: await readFile(join(fixture.stateDir, 'skill-active-state.json'), 'utf8').catch(() => null),
|
|
238
|
+
});
|
|
239
|
+
const startFixture = await conflictingReplayFixture('omx-advisory-standard-start-conflict-');
|
|
240
|
+
const startBefore = await snapshotRelevant(startFixture);
|
|
241
|
+
const start = await dispatchCodexNativeHook({
|
|
242
|
+
hook_event_name: 'SessionStart', cwd: startFixture.cwd, session_id: startFixture.sessionId,
|
|
243
|
+
thread_id: 'root-standard', source: 'startup',
|
|
244
|
+
}, { cwd: startFixture.cwd });
|
|
245
|
+
const startContext = (start.outputJson?.hookSpecificOutput?.additionalContext ?? '');
|
|
246
|
+
assert.match(startContext, /live_session_binding_conflict/);
|
|
247
|
+
assert.deepEqual(await snapshotRelevant(startFixture), startBefore);
|
|
248
|
+
const routed = await observeRalplanAdvisoryPrompt({
|
|
249
|
+
cwd: startFixture.cwd, sessionId: startFixture.sessionId, turnId: 'turn-replan-conflict', threadId: 'root-standard',
|
|
250
|
+
prompt: 'replanificá el plan', producer: 'native', threadKind: 'root-or-drift', isSubagentPromptSubmit: false,
|
|
251
|
+
});
|
|
252
|
+
assert.equal(routed.intent, 'unrelated');
|
|
253
|
+
assert.equal(routed.projection?.corruption, 'live_session_binding_conflict');
|
|
254
|
+
assert.deepEqual(await snapshotRelevant(startFixture), startBefore);
|
|
255
|
+
const stopFixture = await conflictingReplayFixture('omx-advisory-standard-stop-conflict-', 'critic-review');
|
|
256
|
+
const stopBefore = await snapshotRelevant(stopFixture);
|
|
257
|
+
const stop = await dispatchCodexNativeHook({
|
|
258
|
+
hook_event_name: 'Stop', cwd: stopFixture.cwd, source: 'codex-app', session_id: stopFixture.sessionId,
|
|
259
|
+
thread_id: 'root-standard', turn_id: 'turn-stop-standard-conflict',
|
|
260
|
+
}, { cwd: stopFixture.cwd });
|
|
261
|
+
assert.deepEqual(await snapshotRelevant(stopFixture), stopBefore);
|
|
262
|
+
const logBytes = (await Promise.all((await readdir(join(stopFixture.cwd, '.omx', 'logs')))
|
|
263
|
+
.map((name) => readFile(join(stopFixture.cwd, '.omx', 'logs', name), 'utf8')))).join('\n');
|
|
264
|
+
assert.match(logBytes, /live_session_binding_conflict/);
|
|
265
|
+
const baselineFixture = await conflictingReplayFixture('omx-advisory-standard-stop-baseline-', 'critic-review');
|
|
266
|
+
await rm(join(baselineFixture.sessionDir, 'ralplan-advisory'), { recursive: true, force: true });
|
|
267
|
+
const baseline = await dispatchCodexNativeHook({
|
|
268
|
+
hook_event_name: 'Stop', cwd: baselineFixture.cwd, source: 'codex-app', session_id: baselineFixture.sessionId,
|
|
269
|
+
thread_id: 'root-standard', turn_id: 'turn-stop-standard-baseline',
|
|
270
|
+
}, { cwd: baselineFixture.cwd });
|
|
271
|
+
assert.deepEqual(stop.outputJson, baseline.outputJson);
|
|
272
|
+
});
|
|
273
|
+
it('ignores forged local release authority and permits a later standard Ralplan binding', async () => {
|
|
274
|
+
const { cwd, sessionId, stateDir, sessionDir, activation } = await terminalFixture('omx-advisory-forged-authority-');
|
|
275
|
+
const generationDir = join(sessionDir, 'ralplan-advisory', activation.generation_id);
|
|
276
|
+
await writeFile(join(generationDir, 'release-authority.json'), JSON.stringify({ authority_kind: 'forged-local' }));
|
|
277
|
+
const observed = await observeRalplanAdvisoryPrompt({
|
|
278
|
+
cwd, sessionId, turnId: 'turn-execute', threadId: 'root-a', prompt: 'implementá el plan .omx/plans/plan.md',
|
|
279
|
+
producer: 'native', threadKind: 'root-or-drift', isSubagentPromptSubmit: false,
|
|
280
|
+
});
|
|
281
|
+
assert.equal(observed.intent, 'execute');
|
|
282
|
+
assert.equal(observed.projection?.fence?.state, 'abandoned');
|
|
283
|
+
const standardMode = {
|
|
284
|
+
active: true, mode: 'ralplan', current_phase: 'draft', iteration: 1,
|
|
285
|
+
session_id: sessionId, thread_id: 'root-a', turn_id: 'turn-standard', workflow_variant: 'standard',
|
|
286
|
+
};
|
|
287
|
+
await writeFile(join(sessionDir, 'ralplan-state.json'), JSON.stringify(standardMode));
|
|
288
|
+
await writeFile(join(stateDir, 'ralplan-state.json'), JSON.stringify(standardMode));
|
|
289
|
+
const history = await readCurrentRalplanAdvisory(cwd, sessionId);
|
|
290
|
+
assert.equal(history?.corruption, null);
|
|
291
|
+
assert.equal(history?.fence?.state, 'abandoned');
|
|
292
|
+
const write = await dispatchCodexNativeHook({
|
|
293
|
+
hook_event_name: 'PreToolUse', cwd, session_id: sessionId, thread_id: 'root-a',
|
|
294
|
+
tool_name: 'Write', tool_input: { file_path: join(cwd, 'src', 'x.ts'), content: 'x' },
|
|
295
|
+
}, { cwd });
|
|
296
|
+
assert.notEqual(write.outputJson?.decision, 'block');
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
//# sourceMappingURL=ralplan-advisory-hook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralplan-advisory-hook.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/ralplan-advisory-hook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ 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 { assertPackedLaunchCwdPreserved, assertInstalledPluginSurface, assertInstalledReasoningDeclarationContract, assertInstalledReasoningRuntimeContract, assertInstalledRootReasoningHelp, assertInstalledRootReasoningRejection, 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';
|
|
9
|
+
import { assertPackedLaunchCwdPreserved, assertInstalledPluginSurface, assertInstalledReasoningDeclarationContract, assertInstalledReasoningRuntimeContract, assertInstalledRootReasoningHelp, assertInstalledRootReasoningRejection, 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, assertNativeHookAdvisoryPreToolUse, listPersistedStateFiles, } from '../smoke-packed-install.js';
|
|
10
10
|
import { parseNativeSubagentResultDisposition } from '../../leader/contract.js';
|
|
11
11
|
function createFakeCodexAppServer(onRequest) {
|
|
12
12
|
const child = Object.assign(new EventEmitter(), {
|
|
@@ -907,7 +907,7 @@ test('packed install smoke covers directive activation and terminal false-activa
|
|
|
907
907
|
{ name: 'compact-explicit-negation', prompt: '$ralplan,$autopilot are prohibited', expectedSkill: null, expectedStopBlock: false },
|
|
908
908
|
{ name: 'compact-implicit-negation', prompt: 'Autopilot mode،deep interview are prohibited.', expectedSkill: null, expectedStopBlock: false },
|
|
909
909
|
{ name: 'doc-clause-local-prefix', prompt: '$ralplan; $autopilot is documented in the guide.', expectedSkill: 'ralplan', expectedStopBlock: true },
|
|
910
|
-
{ name: 'doc-chain-described', prompt: 'use $ralplan is the workflow command; autopilot mode is documented in the guide; $team execute it', expectedSkill: 'team', expectedStopBlock:
|
|
910
|
+
{ name: 'doc-chain-described', prompt: 'use $ralplan is the workflow command; autopilot mode is documented in the guide; $team execute it', expectedSkill: 'team', expectedStopBlock: true, insideTmux: true },
|
|
911
911
|
{ name: 'doc-chain-workflow', prompt: 'use $ralplan is the workflow command; autopilot mode is workflow documentation; use $ralph execute it', expectedSkill: 'ralph', expectedStopBlock: true },
|
|
912
912
|
{ name: 'ref-inline-explicit', prompt: '[docs]: $ralplan\n$autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
913
913
|
{ name: 'ref-inline-prompts', prompt: '[docs]: /prompts:architect\n$autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
@@ -933,10 +933,10 @@ test('packed install smoke covers directive activation and terminal false-activa
|
|
|
933
933
|
{ name: 'neg-fw-dot-reopen', prompt: 'Do not run $ralplan. use $autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
934
934
|
{ name: 'neg-greek-q-reopen', prompt: 'Do not run $ralplan; use $autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
935
935
|
{ name: 'unicode-attached-contrast', prompt: 'Do not use deep interview яbut use autopilot mode.', expectedSkill: null, expectedStopBlock: false },
|
|
936
|
-
{ name: 'prefix-list-followup', prompt: 'Do not run $ralplan, $autopilot; use $team execute it', expectedSkill: 'team', expectedStopBlock:
|
|
936
|
+
{ name: 'prefix-list-followup', prompt: 'Do not run $ralplan, $autopilot; use $team execute it', expectedSkill: 'team', expectedStopBlock: true, insideTmux: true },
|
|
937
937
|
{ name: 'mixed-postposed-chain', prompt: '$ralplan, autopilot mode, $team are prohibited.', expectedSkill: null, expectedStopBlock: false },
|
|
938
|
-
{ name: 'implicit-first-doc-chain', prompt: 'Autopilot mode and $ralplan are workflow commands; use $team execute it', expectedSkill: 'team', expectedStopBlock:
|
|
939
|
-
{ name: 'both-mixed-doc-followup', prompt: 'Both autopilot mode and $ralplan are workflow commands; use $team execute it', expectedSkill: 'team', expectedStopBlock:
|
|
938
|
+
{ name: 'implicit-first-doc-chain', prompt: 'Autopilot mode and $ralplan are workflow commands; use $team execute it', expectedSkill: 'team', expectedStopBlock: true, insideTmux: true },
|
|
939
|
+
{ name: 'both-mixed-doc-followup', prompt: 'Both autopilot mode and $ralplan are workflow commands; use $team execute it', expectedSkill: 'team', expectedStopBlock: true, insideTmux: true },
|
|
940
940
|
{ name: 'doc-semicolon-preserves-earlier', prompt: 'Use autopilot mode; use $ralplan is the workflow command.', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
941
941
|
{ name: 'doc-independent-comma', prompt: 'Use autopilot mode, and $ralplan is documented in the guide.', expectedSkill: 'autopilot', expectedStopBlock: true },
|
|
942
942
|
{ name: 'reference-unclosed-quote-destination', prompt: '[docs]: "target\n$autopilot build it', expectedSkill: null, expectedStopBlock: false },
|
|
@@ -984,20 +984,29 @@ test('packed install smoke covers directive activation and terminal false-activa
|
|
|
984
984
|
{ name: 'percent-suffix', prompt: '$ralplan%docs', expectedSkill: null, expectedStopBlock: false },
|
|
985
985
|
{ name: 'fullwidth-percent-suffix', prompt: '$ralplan%docs', expectedSkill: null, expectedStopBlock: false },
|
|
986
986
|
{ name: 'g1a-ordered-multi-skill', prompt: '$ralplan, $autopilot; $team', expectedSkill: 'ralplan', expectedStopBlock: true, expectedDeferredSkills: ['autopilot', 'team'], expectedActiveSkills: ['ralplan'], insideTmux: true },
|
|
987
|
-
{ 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: ['autopilot'] },
|
|
988
988
|
{ name: 'b3-longer-valid-fence', prompt: '```text\n$autopilot build it\n````\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
|
|
989
989
|
{ name: 'b4-shorter-invalid-fence', prompt: '````text\n$autopilot build it\n```\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
|
|
990
990
|
{ name: 'b5-different-marker-invalid-fence', prompt: '```text\n$autopilot build it\n~~~\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
|
|
991
991
|
]);
|
|
992
992
|
});
|
|
993
|
-
test('packed regression workflow expectations require active
|
|
993
|
+
test('packed regression workflow expectations require active supported skills and failed retired ralph receipts', () => {
|
|
994
994
|
assert.doesNotThrow(() => assertPackedRegressionWorkflowState({ name: 'active-ralplan', expectedSkill: 'ralplan' }, { active: true, skill: 'ralplan' }));
|
|
995
995
|
assert.doesNotThrow(() => assertPackedRegressionWorkflowState({ name: 'active-autopilot', expectedSkill: 'autopilot' }, { active: true, skill: 'autopilot', phase: 'deep-interview', active_skills: [{ skill: 'autopilot' }] }));
|
|
996
996
|
assert.throws(() => assertPackedRegressionWorkflowState({ name: 'failed-autopilot', expectedSkill: 'autopilot' }, { active: false, skill: 'autopilot', phase: 'failed', active_skills: [] }), /persisted unexpected workflow state/);
|
|
997
|
+
assert.doesNotThrow(() => assertPackedRegressionWorkflowState({ name: 'retired-ralph', expectedSkill: 'ralph' }, {
|
|
998
|
+
active: false,
|
|
999
|
+
skill: 'ralph',
|
|
1000
|
+
phase: 'failed',
|
|
1001
|
+
transition_error: 'Skill "$ralph" has been removed. Use "$ultragoal" instead. The `omx ralph` CLI and ralph persistence runtime are unaffected.',
|
|
1002
|
+
active_skills: [],
|
|
1003
|
+
}));
|
|
1004
|
+
assert.throws(() => assertPackedRegressionWorkflowState({ name: 'active-retired-ralph', expectedSkill: 'ralph' }, { active: true, skill: 'ralph', phase: 'executing' }), /unexpected retired ralph state/);
|
|
997
1005
|
});
|
|
998
|
-
test('packed regression Stop expectations keep active
|
|
1006
|
+
test('packed regression Stop expectations keep active workflows blocked but retired ralph terminal', () => {
|
|
999
1007
|
assert.equal(shouldPackedRegressionStopBlock({ expectedSkill: 'ralplan', expectedStopBlock: true }), true);
|
|
1000
1008
|
assert.equal(shouldPackedRegressionStopBlock({ expectedSkill: 'autopilot', expectedStopBlock: true }), true);
|
|
1009
|
+
assert.equal(shouldPackedRegressionStopBlock({ expectedSkill: 'ralph', expectedStopBlock: true }), false);
|
|
1001
1010
|
});
|
|
1002
1011
|
test('packed regression environment clears inherited Team routing state', () => {
|
|
1003
1012
|
const environment = buildPackedRegressionEnvironment({ name: 'poisoned-team-case', insideTmux: true }, {
|
|
@@ -1401,4 +1410,89 @@ test('ensureRepoDependencies falls back to npm ci when no reusable node_modules
|
|
|
1401
1410
|
await rm(root, { recursive: true, force: true });
|
|
1402
1411
|
}
|
|
1403
1412
|
});
|
|
1413
|
+
test('assertNativeHookAdvisoryPreToolUse accepts the two documented advisory shapes', () => {
|
|
1414
|
+
// Empty no-op: the hook intentionally produced no advisory content (#3497).
|
|
1415
|
+
assertNativeHookAdvisoryPreToolUse('advisory-empty', {});
|
|
1416
|
+
// Documented advisory context with the PreToolUse event name.
|
|
1417
|
+
assertNativeHookAdvisoryPreToolUse('advisory-context', {
|
|
1418
|
+
systemMessage: 'advisory guidance',
|
|
1419
|
+
hookSpecificOutput: {
|
|
1420
|
+
hookEventName: 'PreToolUse',
|
|
1421
|
+
additionalContext: 'advisory guidance',
|
|
1422
|
+
},
|
|
1423
|
+
});
|
|
1424
|
+
// systemMessage alone, without a hookSpecificOutput envelope, is also advisory.
|
|
1425
|
+
assertNativeHookAdvisoryPreToolUse('advisory-system-message', { systemMessage: 'guidance only' });
|
|
1426
|
+
});
|
|
1427
|
+
test('assertNativeHookAdvisoryPreToolUse rejects outputs that would hide a regression', () => {
|
|
1428
|
+
const rejections = [
|
|
1429
|
+
['hard block', { decision: 'block', reason: 'nope' }, /hard block/],
|
|
1430
|
+
['stopped continuation', { continue: false }, /stopped continuation/],
|
|
1431
|
+
['stopReason', { stopReason: 'native_hook_stdin_parse_error' }, /emitted stopReason/],
|
|
1432
|
+
['permission deny', {
|
|
1433
|
+
hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny' },
|
|
1434
|
+
}, /permissionDecision "deny"/],
|
|
1435
|
+
['permission allow', {
|
|
1436
|
+
hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'allow' },
|
|
1437
|
+
}, /permissionDecision "allow"/],
|
|
1438
|
+
['wrong event name', {
|
|
1439
|
+
systemMessage: 'x',
|
|
1440
|
+
hookSpecificOutput: { hookEventName: 'Stop', additionalContext: 'x' },
|
|
1441
|
+
}, /hookSpecificOutput names "Stop"/],
|
|
1442
|
+
['non-string system message', { systemMessage: 1 }, /malformed systemMessage/],
|
|
1443
|
+
['empty system message', { systemMessage: '' }, /malformed systemMessage/],
|
|
1444
|
+
['empty envelope', { hookSpecificOutput: {} }, /malformed PreToolUse advisory envelope/],
|
|
1445
|
+
['system message plus empty envelope', {
|
|
1446
|
+
systemMessage: 'x',
|
|
1447
|
+
hookSpecificOutput: {},
|
|
1448
|
+
}, /malformed PreToolUse advisory envelope/],
|
|
1449
|
+
['envelope without event name', {
|
|
1450
|
+
systemMessage: 'x',
|
|
1451
|
+
hookSpecificOutput: { additionalContext: 'x' },
|
|
1452
|
+
}, /malformed PreToolUse advisory envelope/],
|
|
1453
|
+
['envelope without context', {
|
|
1454
|
+
systemMessage: 'x',
|
|
1455
|
+
hookSpecificOutput: { hookEventName: 'PreToolUse' },
|
|
1456
|
+
}, /malformed PreToolUse advisory envelope/],
|
|
1457
|
+
['mismatched envelope content', {
|
|
1458
|
+
systemMessage: 'x',
|
|
1459
|
+
hookSpecificOutput: { hookEventName: 'PreToolUse', additionalContext: 'y' },
|
|
1460
|
+
}, /does not mirror systemMessage/],
|
|
1461
|
+
['unexpected top-level field', { systemMessage: 'x', reason: 'stray' }, /unexpected top-level field "reason"/],
|
|
1462
|
+
['unexpected hook field', {
|
|
1463
|
+
systemMessage: 'x',
|
|
1464
|
+
hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecisionReason: 'stray' },
|
|
1465
|
+
}, /emitted unexpected field "permissionDecisionReason"/],
|
|
1466
|
+
['malformed hookSpecificOutput', { hookSpecificOutput: 'nope' }, /malformed hookSpecificOutput/],
|
|
1467
|
+
['array hookSpecificOutput', { hookSpecificOutput: [] }, /malformed hookSpecificOutput/],
|
|
1468
|
+
];
|
|
1469
|
+
for (const [label, output, pattern] of rejections) {
|
|
1470
|
+
assert.throws(() => assertNativeHookAdvisoryPreToolUse(`probe-${label}`, output), pattern, `${label} must be rejected`);
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
test('listPersistedStateFiles permits empty state directory bootstrap but detects persisted artifacts', async () => {
|
|
1474
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-packed-state-artifacts-'));
|
|
1475
|
+
try {
|
|
1476
|
+
const stateRoot = join(root, '.omx', 'state');
|
|
1477
|
+
await mkdir(join(stateRoot, 'sessions', 'nested'), { recursive: true });
|
|
1478
|
+
assert.deepEqual(listPersistedStateFiles(stateRoot), []);
|
|
1479
|
+
const persistedFile = join(stateRoot, 'sessions', 'nested', 'skill-active-state.json');
|
|
1480
|
+
await writeFile(persistedFile, '{}\n');
|
|
1481
|
+
assert.deepEqual(listPersistedStateFiles(stateRoot), [persistedFile]);
|
|
1482
|
+
await rm(persistedFile);
|
|
1483
|
+
const symlinkPath = join(stateRoot, 'sessions', 'state-link');
|
|
1484
|
+
await symlink(join(root, 'missing-target'), symlinkPath);
|
|
1485
|
+
assert.deepEqual(listPersistedStateFiles(stateRoot), [symlinkPath]);
|
|
1486
|
+
await rm(symlinkPath);
|
|
1487
|
+
const rootLink = join(root, 'state-link');
|
|
1488
|
+
await symlink(stateRoot, rootLink);
|
|
1489
|
+
assert.deepEqual(listPersistedStateFiles(rootLink), [rootLink]);
|
|
1490
|
+
const rootFile = join(root, 'state-file');
|
|
1491
|
+
await writeFile(rootFile, '{}\n');
|
|
1492
|
+
assert.deepEqual(listPersistedStateFiles(rootFile), [rootFile]);
|
|
1493
|
+
}
|
|
1494
|
+
finally {
|
|
1495
|
+
await rm(root, { recursive: true, force: true });
|
|
1496
|
+
}
|
|
1497
|
+
});
|
|
1404
1498
|
//# sourceMappingURL=smoke-packed-install.test.js.map
|