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,522 @@
|
|
|
1
|
+
import { describe, it, before, after } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { cp, mkdir, mkdtemp, readFile, rm, writeFile, symlink, } from "node:fs/promises";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { join, dirname } from "node:path";
|
|
7
|
+
import { setup } from "../setup.js";
|
|
8
|
+
import { materializePackagedOmxPluginCache, resolvePackagedOmxMarketplace, getPinnedLauncherIncompatibilityReason, readPinnedLauncherRaw, PLUGIN_LAUNCHER_RECOVERY_HINT, upsertLocalOmxMarketplaceRegistration, upsertLocalOmxPluginEnablement, computeOmxPluginCacheClaimDigest, } from "../plugin-marketplace.js";
|
|
9
|
+
import { doctor } from "../doctor.js";
|
|
10
|
+
const packageRoot = process.cwd();
|
|
11
|
+
let fakeCodexBinDir = null;
|
|
12
|
+
let previousPath;
|
|
13
|
+
before(async () => {
|
|
14
|
+
previousPath = process.env.PATH;
|
|
15
|
+
fakeCodexBinDir = await mkdtemp(join(tmpdir(), "omx-fake-codex-3558-"));
|
|
16
|
+
const fakeCodexPath = join(fakeCodexBinDir, "codex");
|
|
17
|
+
await writeFile(fakeCodexPath, [
|
|
18
|
+
"#!/usr/bin/env node",
|
|
19
|
+
"if (process.argv[2] === 'features' && process.argv[3] === 'list') {",
|
|
20
|
+
" console.log('hooks stable true');",
|
|
21
|
+
" console.log('plugin_hooks experimental true');",
|
|
22
|
+
" console.log('goals experimental true');",
|
|
23
|
+
" process.exit(0);",
|
|
24
|
+
"}",
|
|
25
|
+
"if (process.argv.includes('--version') || process.argv[2] === '--version') {",
|
|
26
|
+
" console.log('codex-cli 0.999.0');",
|
|
27
|
+
" process.exit(0);",
|
|
28
|
+
"}",
|
|
29
|
+
"process.exit(0);",
|
|
30
|
+
"",
|
|
31
|
+
].join("\n"));
|
|
32
|
+
await import("node:fs/promises").then((m) => m.chmod(fakeCodexPath, 0o755));
|
|
33
|
+
process.env.PATH = `${fakeCodexBinDir}${process.env.PATH ? `:${process.env.PATH}` : ""}`;
|
|
34
|
+
});
|
|
35
|
+
after(async () => {
|
|
36
|
+
if (previousPath === undefined)
|
|
37
|
+
delete process.env.PATH;
|
|
38
|
+
else
|
|
39
|
+
process.env.PATH = previousPath;
|
|
40
|
+
if (fakeCodexBinDir)
|
|
41
|
+
await rm(fakeCodexBinDir, { recursive: true, force: true });
|
|
42
|
+
});
|
|
43
|
+
async function withIsolatedUserHome(wd, fn) {
|
|
44
|
+
const prevHome = process.env.HOME;
|
|
45
|
+
const prevCodex = process.env.CODEX_HOME;
|
|
46
|
+
const homeDir = join(wd, "home");
|
|
47
|
+
const codexHomeDir = join(homeDir, ".codex");
|
|
48
|
+
await mkdir(codexHomeDir, { recursive: true });
|
|
49
|
+
process.env.HOME = homeDir;
|
|
50
|
+
process.env.CODEX_HOME = codexHomeDir;
|
|
51
|
+
try {
|
|
52
|
+
return await fn(codexHomeDir);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
if (typeof prevHome === "string")
|
|
56
|
+
process.env.HOME = prevHome;
|
|
57
|
+
else
|
|
58
|
+
delete process.env.HOME;
|
|
59
|
+
if (typeof prevCodex === "string")
|
|
60
|
+
process.env.CODEX_HOME = prevCodex;
|
|
61
|
+
else
|
|
62
|
+
delete process.env.CODEX_HOME;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function withTempCwd(wd, fn) {
|
|
66
|
+
const prev = process.cwd();
|
|
67
|
+
process.chdir(wd);
|
|
68
|
+
try {
|
|
69
|
+
await fn();
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
process.chdir(prev);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function captureConsoleOutput(fn) {
|
|
76
|
+
const origLog = console.log;
|
|
77
|
+
const origWarn = console.warn;
|
|
78
|
+
const lines = [];
|
|
79
|
+
console.log = (...args) => lines.push(args.map(String).join(" "));
|
|
80
|
+
console.warn = (...args) => lines.push(args.map(String).join(" "));
|
|
81
|
+
try {
|
|
82
|
+
await fn();
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
console.log = origLog;
|
|
86
|
+
console.warn = origWarn;
|
|
87
|
+
}
|
|
88
|
+
return lines.join("\n");
|
|
89
|
+
}
|
|
90
|
+
async function packagedPluginCacheDir(codexHomeDir) {
|
|
91
|
+
const manifest = JSON.parse(await readFile(join(packageRoot, "plugins", "oh-my-codex", ".codex-plugin", "plugin.json"), "utf-8"));
|
|
92
|
+
return join(codexHomeDir, "plugins", "cache", "oh-my-codex-local", "oh-my-codex", manifest.version);
|
|
93
|
+
}
|
|
94
|
+
async function seedCurrentLauncher(codexHomeDir) {
|
|
95
|
+
const cacheDir = await packagedPluginCacheDir(codexHomeDir);
|
|
96
|
+
await mkdir(dirname(cacheDir), { recursive: true });
|
|
97
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex"), cacheDir, {
|
|
98
|
+
recursive: true,
|
|
99
|
+
});
|
|
100
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify({
|
|
101
|
+
command: process.execPath,
|
|
102
|
+
argsPrefix: [join(packageRoot, "dist", "cli", "omx.js")],
|
|
103
|
+
}, null, 2) + "\n");
|
|
104
|
+
const claimDigest = await computeOmxPluginCacheClaimDigest(cacheDir);
|
|
105
|
+
await writeFile(join(cacheDir, ".omx-complete"), `${JSON.stringify({ claimDigest })}\n`);
|
|
106
|
+
return cacheDir;
|
|
107
|
+
}
|
|
108
|
+
async function writeBoundCompletionMarker(cacheDir) {
|
|
109
|
+
const claimDigest = await computeOmxPluginCacheClaimDigest(cacheDir);
|
|
110
|
+
await writeFile(join(cacheDir, ".omx-complete"), `${JSON.stringify({ claimDigest })}\n`);
|
|
111
|
+
}
|
|
112
|
+
async function makeFakePackageRoot(base, label) {
|
|
113
|
+
const fakeRoot = join(base, label);
|
|
114
|
+
await mkdir(fakeRoot, { recursive: true });
|
|
115
|
+
await cp(join(packageRoot, "plugins"), join(fakeRoot, "plugins"), {
|
|
116
|
+
recursive: true,
|
|
117
|
+
});
|
|
118
|
+
await mkdir(join(fakeRoot, ".agents", "plugins"), { recursive: true });
|
|
119
|
+
await cp(join(packageRoot, ".agents", "plugins", "marketplace.json"), join(fakeRoot, ".agents", "plugins", "marketplace.json"));
|
|
120
|
+
await mkdir(join(fakeRoot, "dist", "cli"), { recursive: true });
|
|
121
|
+
await writeFile(join(fakeRoot, "dist", "cli", "omx.js"), `// fake omx ${label}\n`, "utf-8");
|
|
122
|
+
return fakeRoot;
|
|
123
|
+
}
|
|
124
|
+
describe("issue 3558 launcher provenance", () => {
|
|
125
|
+
it("reproduces exact dead-launcher case: same version different root removed -> stale-launcher, immutable preserved, recovery hint", async () => {
|
|
126
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-repro-"));
|
|
127
|
+
const pkgBase = await mkdtemp(join(tmpdir(), "omx-3558-pkgbase-"));
|
|
128
|
+
try {
|
|
129
|
+
const oldRoot = await makeFakePackageRoot(pkgBase, "old-tmp-src");
|
|
130
|
+
const oldMarketplace = await resolvePackagedOmxMarketplace(oldRoot);
|
|
131
|
+
assert.ok(oldMarketplace);
|
|
132
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
133
|
+
await withTempCwd(wd, async () => {
|
|
134
|
+
// materialize from old temp root (simulates v0.21.0 from /private/tmp)
|
|
135
|
+
const r1 = await materializePackagedOmxPluginCache(codexHomeDir, oldMarketplace);
|
|
136
|
+
assert.equal(r1.status, "materialized");
|
|
137
|
+
const launcherPath = join(r1.cacheDir, "hooks", "omx-command.json");
|
|
138
|
+
const launcher1 = JSON.parse(await readFile(launcherPath, "utf-8"));
|
|
139
|
+
assert.ok(launcher1.argsPrefix[0].includes("old-tmp-src"));
|
|
140
|
+
// Simulate removal of temp build after global install: delete target
|
|
141
|
+
await rm(join(oldRoot, "dist", "cli", "omx.js"), { force: true });
|
|
142
|
+
assert.equal(existsSync(launcher1.argsPrefix[0]), false);
|
|
143
|
+
// Now materialize from current (global) packageRoot — same version 0.21.0 but different root
|
|
144
|
+
const output = await captureConsoleOutput(async () => {
|
|
145
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
146
|
+
});
|
|
147
|
+
const launcher2 = JSON.parse(await readFile(launcherPath, "utf-8"));
|
|
148
|
+
// Immutable: file not overwritten
|
|
149
|
+
assert.equal(launcher2.argsPrefix[0], launcher1.argsPrefix[0]);
|
|
150
|
+
assert.equal(launcher2.command, launcher1.command);
|
|
151
|
+
// Must NOT claim current
|
|
152
|
+
assert.doesNotMatch(output, /Local Codex plugin cache already exposes packaged OMX skills/);
|
|
153
|
+
assert.match(output, /incompatible launcher provenance/);
|
|
154
|
+
assert.match(output, /does not exist/);
|
|
155
|
+
assert.match(output, /codex plugin remove oh-my-codex@oh-my-codex-local --json/);
|
|
156
|
+
const packaged = await resolvePackagedOmxMarketplace(packageRoot);
|
|
157
|
+
assert.ok(packaged);
|
|
158
|
+
const r2 = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
159
|
+
assert.equal(r2.status, "stale-launcher");
|
|
160
|
+
assert.ok(r2.reason);
|
|
161
|
+
assert.match(r2.reason, /does not exist/);
|
|
162
|
+
assert.equal(r2.cacheDir, launcherPath.replace("/hooks/omx-command.json", ""));
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
await rm(wd, { recursive: true, force: true });
|
|
168
|
+
await rm(pkgBase, { recursive: true, force: true });
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
it("same-root idempotence remains unchanged and live", async () => {
|
|
172
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-idempotent-"));
|
|
173
|
+
try {
|
|
174
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
175
|
+
await withTempCwd(wd, async () => {
|
|
176
|
+
const cacheDir = await seedCurrentLauncher(codexHomeDir);
|
|
177
|
+
const output = await captureConsoleOutput(async () => {
|
|
178
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
179
|
+
});
|
|
180
|
+
assert.match(output, /Local Codex plugin cache already exposes packaged OMX skills/);
|
|
181
|
+
assert.doesNotMatch(output, /incompatible launcher/);
|
|
182
|
+
const packaged = await resolvePackagedOmxMarketplace(packageRoot);
|
|
183
|
+
assert.ok(packaged);
|
|
184
|
+
const r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
185
|
+
assert.equal(r.status, "unchanged");
|
|
186
|
+
const launcher = JSON.parse(await readFile(join(cacheDir, "hooks", "omx-command.json"), "utf-8"));
|
|
187
|
+
assert.equal(launcher.argsPrefix[0], join(packageRoot, "dist", "cli", "omx.js"));
|
|
188
|
+
assert.equal(existsSync(launcher.argsPrefix[0]), true);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
await rm(wd, { recursive: true, force: true });
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
it("provenance mismatch with live target (different root, not deleted) is stale-launcher, not unchanged", async () => {
|
|
197
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-provenance-live-"));
|
|
198
|
+
const pkgBase = await mkdtemp(join(tmpdir(), "omx-3558-pkgbase-live-"));
|
|
199
|
+
try {
|
|
200
|
+
const fakeRoot = await makeFakePackageRoot(pkgBase, "other-live-root");
|
|
201
|
+
const fakeMarketplace = await resolvePackagedOmxMarketplace(fakeRoot);
|
|
202
|
+
assert.ok(fakeMarketplace);
|
|
203
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
204
|
+
await withTempCwd(wd, async () => {
|
|
205
|
+
// seed with fake live root
|
|
206
|
+
const cacheDir = await packagedPluginCacheDir(codexHomeDir);
|
|
207
|
+
await mkdir(dirname(cacheDir), { recursive: true });
|
|
208
|
+
await cp(join(fakeRoot, "plugins", "oh-my-codex"), cacheDir, {
|
|
209
|
+
recursive: true,
|
|
210
|
+
});
|
|
211
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify({
|
|
212
|
+
command: process.execPath,
|
|
213
|
+
argsPrefix: [join(fakeRoot, "dist", "cli", "omx.js")],
|
|
214
|
+
}, null, 2) + "\n");
|
|
215
|
+
await writeBoundCompletionMarker(cacheDir);
|
|
216
|
+
assert.equal(existsSync(join(fakeRoot, "dist", "cli", "omx.js")), true);
|
|
217
|
+
// Now setup with current packageRoot (different but same version) — target still exists at old location
|
|
218
|
+
const output = await captureConsoleOutput(async () => {
|
|
219
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
220
|
+
});
|
|
221
|
+
assert.doesNotMatch(output, /already exposes/);
|
|
222
|
+
assert.match(output, /incompatible launcher provenance/);
|
|
223
|
+
assert.match(output, /provenance mismatch/);
|
|
224
|
+
const packaged = await resolvePackagedOmxMarketplace(packageRoot);
|
|
225
|
+
assert.ok(packaged);
|
|
226
|
+
const r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
227
|
+
assert.equal(r.status, "stale-launcher");
|
|
228
|
+
assert.match(r.reason, /provenance mismatch/);
|
|
229
|
+
// still preserved
|
|
230
|
+
const launcher = JSON.parse(await readFile(join(cacheDir, "hooks", "omx-command.json"), "utf-8"));
|
|
231
|
+
assert.equal(launcher.argsPrefix[0], join(fakeRoot, "dist", "cli", "omx.js"));
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
await rm(wd, { recursive: true, force: true });
|
|
237
|
+
await rm(pkgBase, { recursive: true, force: true });
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
it("valid target plus extra argsPrefix entries or extra JSON keys is stale-launcher and immutable", async () => {
|
|
241
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-extra-args-"));
|
|
242
|
+
const pkgBase = await mkdtemp(join(tmpdir(), "omx-3558-pkgbase-extra-"));
|
|
243
|
+
try {
|
|
244
|
+
const fakeRoot = await makeFakePackageRoot(pkgBase, "extra-args-root");
|
|
245
|
+
const packaged = await resolvePackagedOmxMarketplace(fakeRoot);
|
|
246
|
+
assert.ok(packaged);
|
|
247
|
+
const expectedTarget = join(fakeRoot, "dist", "cli", "omx.js");
|
|
248
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
249
|
+
await withTempCwd(wd, async () => {
|
|
250
|
+
const cacheDir = await packagedPluginCacheDir(codexHomeDir);
|
|
251
|
+
await mkdir(dirname(cacheDir), { recursive: true });
|
|
252
|
+
await cp(join(fakeRoot, "plugins", "oh-my-codex"), cacheDir, {
|
|
253
|
+
recursive: true,
|
|
254
|
+
});
|
|
255
|
+
const extraArgsLauncher = {
|
|
256
|
+
command: process.execPath,
|
|
257
|
+
argsPrefix: [expectedTarget, "--eval", "process.exit(0)"],
|
|
258
|
+
};
|
|
259
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify(extraArgsLauncher, null, 2) + "\n");
|
|
260
|
+
const extraArgsReason = await getPinnedLauncherIncompatibilityReason(cacheDir, packaged);
|
|
261
|
+
assert.ok(extraArgsReason);
|
|
262
|
+
assert.match(extraArgsReason.reason, /exactly one packaged omx\.js target/);
|
|
263
|
+
const extraArgsResult = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
264
|
+
assert.equal(extraArgsResult.status, "stale-launcher");
|
|
265
|
+
assert.deepEqual(JSON.parse(await readFile(join(cacheDir, "hooks", "omx-command.json"), "utf-8")), extraArgsLauncher);
|
|
266
|
+
const extraKeysLauncher = {
|
|
267
|
+
command: process.execPath,
|
|
268
|
+
argsPrefix: [expectedTarget],
|
|
269
|
+
env: { OMX_INJECT: "1" },
|
|
270
|
+
};
|
|
271
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify(extraKeysLauncher, null, 2) + "\n");
|
|
272
|
+
const extraKeysReason = await getPinnedLauncherIncompatibilityReason(cacheDir, packaged);
|
|
273
|
+
assert.ok(extraKeysReason);
|
|
274
|
+
assert.match(extraKeysReason.reason, /extra keys \(env\)/);
|
|
275
|
+
const extraKeysResult = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
276
|
+
assert.equal(extraKeysResult.status, "stale-launcher");
|
|
277
|
+
assert.deepEqual(JSON.parse(await readFile(join(cacheDir, "hooks", "omx-command.json"), "utf-8")), extraKeysLauncher);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
await rm(wd, { recursive: true, force: true });
|
|
283
|
+
await rm(pkgBase, { recursive: true, force: true });
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
it("live-pin does not auto-repair; stale-launcher persists and directory untouched", async () => {
|
|
287
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-livepin-"));
|
|
288
|
+
try {
|
|
289
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
290
|
+
await withTempCwd(wd, async () => {
|
|
291
|
+
const cacheDir = await packagedPluginCacheDir(codexHomeDir);
|
|
292
|
+
await mkdir(dirname(cacheDir), { recursive: true });
|
|
293
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex"), cacheDir, {
|
|
294
|
+
recursive: true,
|
|
295
|
+
});
|
|
296
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify({ command: "/stale/node", argsPrefix: ["/stale/omx.js"] }, null, 2) + "\n");
|
|
297
|
+
await writeFile(join(cacheDir, ".omx-live-pin"), "pinned\n");
|
|
298
|
+
await writeBoundCompletionMarker(cacheDir);
|
|
299
|
+
const before = await readFile(join(cacheDir, "hooks", "omx-command.json"), "utf-8");
|
|
300
|
+
const packaged = await resolvePackagedOmxMarketplace(packageRoot);
|
|
301
|
+
assert.ok(packaged);
|
|
302
|
+
const r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
303
|
+
assert.equal(r.status, "stale-launcher");
|
|
304
|
+
assert.match(r.reason, /does not exist/);
|
|
305
|
+
const after = await readFile(join(cacheDir, "hooks", "omx-command.json"), "utf-8");
|
|
306
|
+
assert.equal(after, before);
|
|
307
|
+
assert.equal(existsSync(join(cacheDir, ".omx-live-pin")), true);
|
|
308
|
+
const output = await captureConsoleOutput(async () => {
|
|
309
|
+
await setup({ scope: "user", installMode: "plugin" });
|
|
310
|
+
});
|
|
311
|
+
assert.doesNotMatch(output, /already exposes/);
|
|
312
|
+
assert.match(output, /incompatible launcher/);
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
finally {
|
|
317
|
+
await rm(wd, { recursive: true, force: true });
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
it("malformed, missing, non-absolute and symlink cases handled", async () => {
|
|
321
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-edge-"));
|
|
322
|
+
try {
|
|
323
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
324
|
+
await withTempCwd(wd, async () => {
|
|
325
|
+
const packaged = await resolvePackagedOmxMarketplace(packageRoot);
|
|
326
|
+
assert.ok(packaged);
|
|
327
|
+
const cacheDir = await packagedPluginCacheDir(codexHomeDir);
|
|
328
|
+
// malformed JSON
|
|
329
|
+
await mkdir(join(cacheDir, "hooks"), { recursive: true });
|
|
330
|
+
await mkdir(join(cacheDir, ".codex-plugin"), { recursive: true });
|
|
331
|
+
await writeFile(join(cacheDir, ".codex-plugin", "plugin.json"), await readFile(join(packageRoot, "plugins", "oh-my-codex", ".codex-plugin", "plugin.json"), "utf-8"));
|
|
332
|
+
await mkdir(join(cacheDir, "skills"), { recursive: true });
|
|
333
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex", "hooks", "hooks.json"), join(cacheDir, "hooks", "hooks.json"));
|
|
334
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex", "hooks", "codex-native-hook.mjs"), join(cacheDir, "hooks", "codex-native-hook.mjs"));
|
|
335
|
+
// need skills for state
|
|
336
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex", "skills"), join(cacheDir, "skills"), { recursive: true });
|
|
337
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex", ".mcp.json"), join(cacheDir, ".mcp.json"));
|
|
338
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex", ".app.json"), join(cacheDir, ".app.json"));
|
|
339
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), "{ malformed", "utf-8");
|
|
340
|
+
await writeBoundCompletionMarker(cacheDir);
|
|
341
|
+
let raw = await readPinnedLauncherRaw(cacheDir);
|
|
342
|
+
assert.match(raw.error, /malformed/);
|
|
343
|
+
let r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
344
|
+
assert.equal(r.status, "stale-launcher");
|
|
345
|
+
assert.match(r.reason, /malformed/);
|
|
346
|
+
assert.match(r.reason, new RegExp(PLUGIN_LAUNCHER_RECOVERY_HINT.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")));
|
|
347
|
+
// missing launcher
|
|
348
|
+
await rm(join(cacheDir, "hooks", "omx-command.json"), {
|
|
349
|
+
force: true,
|
|
350
|
+
});
|
|
351
|
+
raw = await readPinnedLauncherRaw(cacheDir);
|
|
352
|
+
assert.equal(raw.raw, null);
|
|
353
|
+
r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
354
|
+
assert.equal(r.status, "stale-launcher");
|
|
355
|
+
assert.match(r.reason, /pinned launcher missing/);
|
|
356
|
+
// JSON null
|
|
357
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), "null\n", "utf-8");
|
|
358
|
+
raw = await readPinnedLauncherRaw(cacheDir);
|
|
359
|
+
assert.match(raw.error, /malformed/);
|
|
360
|
+
r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
361
|
+
assert.equal(r.status, "stale-launcher");
|
|
362
|
+
assert.match(r.reason, /malformed/);
|
|
363
|
+
// must not throw at parsed.command access
|
|
364
|
+
const nullReason = await getPinnedLauncherIncompatibilityReason(cacheDir, packaged);
|
|
365
|
+
assert.ok(nullReason);
|
|
366
|
+
// JSON array
|
|
367
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), "[]\n", "utf-8");
|
|
368
|
+
r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
369
|
+
assert.equal(r.status, "stale-launcher");
|
|
370
|
+
assert.match(r.reason, /malformed/);
|
|
371
|
+
// dead command + live argsPrefix conflict (command validation must still fail-closed)
|
|
372
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify({
|
|
373
|
+
command: "/stale/node",
|
|
374
|
+
argsPrefix: [join(packageRoot, "dist", "cli", "omx.js")],
|
|
375
|
+
}) + "\n");
|
|
376
|
+
r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
377
|
+
assert.equal(r.status, "stale-launcher");
|
|
378
|
+
assert.match(r.reason, /command.*does not exist|command provenance mismatch/);
|
|
379
|
+
// non-absolute target
|
|
380
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify({
|
|
381
|
+
command: process.execPath,
|
|
382
|
+
argsPrefix: ["relative/path/omx.js"],
|
|
383
|
+
}) + "\n");
|
|
384
|
+
r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
385
|
+
assert.equal(r.status, "stale-launcher");
|
|
386
|
+
assert.match(r.reason, /not absolute/);
|
|
387
|
+
// symlink alias: packageRoot canonical alias should be considered live (unchanged)
|
|
388
|
+
const aliasRoot = join(wd, "alias-root");
|
|
389
|
+
await symlink(packageRoot, aliasRoot);
|
|
390
|
+
const aliasLauncherPath = join(aliasRoot, "dist", "cli", "omx.js");
|
|
391
|
+
// aliasLauncherPath canonical should equal packageRoot/dist/cli/omx.js
|
|
392
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify({
|
|
393
|
+
command: process.execPath,
|
|
394
|
+
argsPrefix: [aliasLauncherPath],
|
|
395
|
+
}) + "\n");
|
|
396
|
+
await writeBoundCompletionMarker(cacheDir);
|
|
397
|
+
// ensure file exists via alias
|
|
398
|
+
assert.equal(existsSync(aliasLauncherPath), true);
|
|
399
|
+
const incompat = await getPinnedLauncherIncompatibilityReason(cacheDir, packaged);
|
|
400
|
+
assert.equal(incompat, null, "symlink alias should be compatible");
|
|
401
|
+
r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
402
|
+
assert.equal(r.status, "unchanged", "symlink alias must remain unchanged (provenance-compatible)");
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
finally {
|
|
407
|
+
await rm(wd, { recursive: true, force: true });
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
it("doctor surfaces stale launcher as warn with recovery hint", async () => {
|
|
411
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-doctor-"));
|
|
412
|
+
try {
|
|
413
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
414
|
+
await withTempCwd(wd, async () => {
|
|
415
|
+
const cacheDir = await packagedPluginCacheDir(codexHomeDir);
|
|
416
|
+
await mkdir(dirname(cacheDir), { recursive: true });
|
|
417
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex"), cacheDir, {
|
|
418
|
+
recursive: true,
|
|
419
|
+
});
|
|
420
|
+
await writeFile(join(cacheDir, "hooks", "omx-command.json"), JSON.stringify({ command: "/stale/node", argsPrefix: ["/stale/omx.js"] }, null, 2) + "\n");
|
|
421
|
+
await writeBoundCompletionMarker(cacheDir);
|
|
422
|
+
// Also ensure doctor's expected plugin-scoped check triggers: need config that enables plugin-scoped hooks
|
|
423
|
+
// Minimal config: ensure checkPluginScopedNativeHooks path via doctor() invocation (not just helpers).
|
|
424
|
+
// Instead of full doctor (which checks many things), directly invoke the exported doctor helper via spawning logic:
|
|
425
|
+
// Call doctor() and inspect output; fallback to direct check if doctor output doesn't contain Native hooks detail in minimal fixture.
|
|
426
|
+
// First prove helper still stale
|
|
427
|
+
const packaged = await resolvePackagedOmxMarketplace(packageRoot);
|
|
428
|
+
assert.ok(packaged);
|
|
429
|
+
const r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
430
|
+
assert.equal(r.status, "stale-launcher");
|
|
431
|
+
const incompat = await getPinnedLauncherIncompatibilityReason(cacheDir, packaged);
|
|
432
|
+
assert.ok(incompat);
|
|
433
|
+
assert.match(incompat.reason, /codex plugin remove oh-my-codex@oh-my-codex-local --json/);
|
|
434
|
+
// Persist plugin install mode so doctor resolves plugin-scoped check deterministically
|
|
435
|
+
await mkdir(join(wd, ".omx"), { recursive: true });
|
|
436
|
+
await writeFile(join(wd, ".omx", "setup-scope.json"), JSON.stringify({ scope: "user", installMode: "plugin", mcpMode: "none" }) + "\n", "utf-8");
|
|
437
|
+
// Now invoke actual doctor to prove it surfaces the same warn (not generic hook mismatch)
|
|
438
|
+
// MinimalDoctor invocation: we need to ensure doctor writes its Native hooks check; create a temp cwd with .codex link
|
|
439
|
+
// Easiest: invoke doctor via spawned checkNativeHooks by calling doctor() and capturing console.
|
|
440
|
+
const originalLog = console.log;
|
|
441
|
+
const logs = [];
|
|
442
|
+
console.log = (...args) => logs.push(args.map(String).join(" "));
|
|
443
|
+
try {
|
|
444
|
+
// Ensure config signals plugin-scoped hooks: create config.toml with plugin marketplace registration so doctor resolves scope correctly
|
|
445
|
+
const configPath = join(codexHomeDir, "config.toml");
|
|
446
|
+
const { getPackageRoot } = await import("../../utils/package.js");
|
|
447
|
+
const { buildLocalOmxMarketplaceRegistration } = await import("../plugin-marketplace.js");
|
|
448
|
+
let cfg = "plugin_hooks = true\ngoals = true\n";
|
|
449
|
+
cfg = upsertLocalOmxMarketplaceRegistration(cfg, getPackageRoot());
|
|
450
|
+
cfg = upsertLocalOmxPluginEnablement(cfg);
|
|
451
|
+
await writeFile(configPath, cfg, "utf-8");
|
|
452
|
+
// Need hooksPath parent
|
|
453
|
+
await mkdir(join(codexHomeDir, "agents"), { recursive: true });
|
|
454
|
+
await doctor({});
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
// doctor may throw? ignore, we inspect logs below
|
|
458
|
+
}
|
|
459
|
+
finally {
|
|
460
|
+
console.log = originalLog;
|
|
461
|
+
}
|
|
462
|
+
const output = logs.join("\n");
|
|
463
|
+
assert.match(output, /Native hooks/);
|
|
464
|
+
assert.match(output, /incompatible/);
|
|
465
|
+
assert.match(output, /codex plugin remove oh-my-codex@oh-my-codex-local --json/);
|
|
466
|
+
});
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
finally {
|
|
470
|
+
await rm(wd, { recursive: true, force: true });
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
it("doctor missing omx-command.json surfaces same actionable stale-launcher warning", async () => {
|
|
474
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-3558-doctor-missing-"));
|
|
475
|
+
try {
|
|
476
|
+
await withIsolatedUserHome(wd, async (codexHomeDir) => {
|
|
477
|
+
await withTempCwd(wd, async () => {
|
|
478
|
+
const cacheDir = await packagedPluginCacheDir(codexHomeDir);
|
|
479
|
+
await mkdir(dirname(cacheDir), { recursive: true });
|
|
480
|
+
await cp(join(packageRoot, "plugins", "oh-my-codex"), cacheDir, { recursive: true });
|
|
481
|
+
await rm(join(cacheDir, "hooks", "omx-command.json"), { force: true });
|
|
482
|
+
await writeBoundCompletionMarker(cacheDir);
|
|
483
|
+
const packaged = await resolvePackagedOmxMarketplace(packageRoot);
|
|
484
|
+
assert.ok(packaged);
|
|
485
|
+
const incompat = await getPinnedLauncherIncompatibilityReason(cacheDir, packaged);
|
|
486
|
+
assert.ok(incompat);
|
|
487
|
+
assert.match(incompat.reason, /pinned launcher missing/);
|
|
488
|
+
assert.match(incompat.reason, /codex plugin remove oh-my-codex@oh-my-codex-local --json/);
|
|
489
|
+
const r = await materializePackagedOmxPluginCache(codexHomeDir, packaged);
|
|
490
|
+
assert.equal(r.status, "stale-launcher");
|
|
491
|
+
// Invoke doctor and ensure missing launcher goes through stale-launcher warn, not generic "expected plugin hook file is missing" for launcher
|
|
492
|
+
const { getPackageRoot } = await import("../../utils/package.js");
|
|
493
|
+
const { buildLocalOmxMarketplaceRegistration } = await import("../plugin-marketplace.js");
|
|
494
|
+
let cfg2 = "";
|
|
495
|
+
cfg2 = upsertLocalOmxMarketplaceRegistration(cfg2, getPackageRoot());
|
|
496
|
+
cfg2 = upsertLocalOmxPluginEnablement(cfg2);
|
|
497
|
+
cfg2 = "[features]\nplugin_hooks = true\n\n" + cfg2;
|
|
498
|
+
await writeFile(join(codexHomeDir, "config.toml"), cfg2, "utf-8");
|
|
499
|
+
await mkdir(join(codexHomeDir, "agents"), { recursive: true });
|
|
500
|
+
const logs = [];
|
|
501
|
+
const origLog = console.log;
|
|
502
|
+
console.log = (...args) => logs.push(args.map(String).join(" "));
|
|
503
|
+
try {
|
|
504
|
+
await doctor({});
|
|
505
|
+
}
|
|
506
|
+
finally {
|
|
507
|
+
console.log = origLog;
|
|
508
|
+
}
|
|
509
|
+
const output = logs.join("\n");
|
|
510
|
+
assert.match(output, /Native hooks/);
|
|
511
|
+
assert.match(output, /incompatible|cached launcher/);
|
|
512
|
+
assert.match(output, /codex plugin remove oh-my-codex@oh-my-codex-local --json/);
|
|
513
|
+
assert.match(output, /omx-command\.json|incompatible/);
|
|
514
|
+
});
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
finally {
|
|
518
|
+
await rm(wd, { recursive: true, force: true });
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
//# sourceMappingURL=plugin-launcher-provenance-3558.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-launcher-provenance-3558.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/plugin-launcher-provenance-3558.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ralplan-advisory.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/ralplan-advisory.test.ts"],"names":[],"mappings":""}
|