oh-my-opencode 4.7.5 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/command/get-unpublished-changes.md +35 -6
- package/.agents/command/omomomo.md +1 -1
- package/.agents/command/publish.md +13 -0
- package/.agents/command/security-research.md +0 -1
- package/.agents/skills/get-unpublished-changes/SKILL.md +21 -5
- package/.agents/skills/omomomo/SKILL.md +1 -2
- package/.agents/skills/opencode-qa/scripts/export-roundtrip.sh +57 -19
- package/.agents/skills/opencode-qa/scripts/lib/common.sh +19 -7
- package/.agents/skills/opencode-qa/scripts/sse-hook-probe.sh +3 -0
- package/.agents/skills/opencode-qa/scripts/tui-smoke.sh +1 -1
- package/.agents/skills/pre-publish-review/SKILL.md +24 -4
- package/.agents/skills/publish/SKILL.md +13 -0
- package/.agents/skills/remove-deadcode/SKILL.md +0 -1
- package/.agents/skills/security-research/SKILL.md +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
- package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
- package/.opencode/command/get-unpublished-changes.md +35 -6
- package/.opencode/command/omomomo.md +1 -1
- package/.opencode/command/publish.md +13 -0
- package/.opencode/command/security-research.md +0 -1
- package/.opencode/skills/pre-publish-review/SKILL.md +24 -4
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
- package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
- package/README.ja.md +7 -7
- package/README.ko.md +9 -7
- package/README.md +14 -8
- package/README.ru.md +5 -5
- package/README.zh-cn.md +7 -7
- package/bin/oh-my-opencode.js +24 -1
- package/bin/oh-my-opencode.test.ts +79 -20
- package/dist/agents/hephaestus/agent.d.ts +1 -1
- package/dist/agents/kimi-tool-loop-guard.d.ts +1 -0
- package/dist/agents/momus.d.ts +1 -1
- package/dist/agents/sisyphus-agent-config.d.ts +4 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +6 -0
- package/dist/agents/sisyphus-dynamic-prompt-builder.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-execution.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-exploration.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-role.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-sections.d.ts +18 -0
- package/dist/agents/sisyphus-dynamic-prompt-style.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt.d.ts +3 -0
- package/dist/agents/sisyphus-gemini-fallback-overrides.d.ts +1 -0
- package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
- package/dist/agents/sisyphus-junior/index.d.ts +0 -1
- package/dist/agents/sisyphus.d.ts +1 -6
- package/dist/agents/types.d.ts +14 -3
- package/dist/cli/cli-program.d.ts +3 -0
- package/dist/cli/doctor/checks/codex.d.ts +11 -0
- package/dist/cli/doctor/checks/dependencies.d.ts +1 -0
- package/dist/cli/doctor/checks/index.d.ts +3 -0
- package/dist/cli/doctor/checks/system.d.ts +4 -0
- package/dist/cli/doctor/constants.d.ts +1 -0
- package/dist/cli/doctor/doctor-target.d.ts +2 -0
- package/dist/cli/doctor/index.d.ts +1 -0
- package/dist/cli/doctor/types.d.ts +26 -0
- package/dist/cli/index.js +4426 -2200
- package/dist/cli/install-codex/codex-cache-bins.d.ts +21 -0
- package/dist/cli/install-codex/codex-cache-fs.d.ts +3 -0
- package/dist/cli/install-codex/codex-cache-install.d.ts +13 -0
- package/dist/cli/install-codex/codex-cache-mcp-manifest.d.ts +2 -0
- package/dist/cli/install-codex/codex-cache-prune.d.ts +10 -0
- package/dist/cli/install-codex/codex-cache.d.ts +4 -32
- package/dist/cli/install-codex/codex-cached-marketplace-manifest.d.ts +6 -0
- package/dist/cli/install-codex/codex-config-agents.d.ts +3 -0
- package/dist/cli/install-codex/codex-config-features.d.ts +1 -0
- package/dist/cli/install-codex/codex-config-marketplaces.d.ts +6 -0
- package/dist/cli/install-codex/codex-config-plugins.d.ts +8 -0
- package/dist/cli/install-codex/codex-config-toml-sections.d.ts +9 -0
- package/dist/cli/install-codex/codex-process.d.ts +5 -0
- package/dist/cli/install-codex/index.d.ts +1 -1
- package/dist/cli/install-codex/lazycodex-version-stamp.d.ts +19 -0
- package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +4 -0
- package/dist/cli/install-validators.d.ts +3 -0
- package/dist/cli/model-fallback-types.d.ts +3 -0
- package/dist/cli/run/event-handlers.d.ts +4 -11
- package/dist/cli/run/event-message-handlers.d.ts +5 -0
- package/dist/cli/run/event-session-handlers.d.ts +5 -0
- package/dist/cli/run/event-session-ids.d.ts +24 -0
- package/dist/cli/run/event-think-block.d.ts +3 -0
- package/dist/cli/run/event-toast-handlers.d.ts +3 -0
- package/dist/cli/run/event-tool-handlers.d.ts +4 -0
- package/dist/cli/run/event-tool-output.d.ts +2 -0
- package/dist/cli/run/on-complete-hook.d.ts +8 -1
- package/dist/cli/run/opencode-binary-resolver.d.ts +2 -1
- package/dist/cli/runtime-commands.d.ts +2 -0
- package/dist/cli/sparkshell-appserver-websocket.d.ts +4 -0
- package/dist/cli/sparkshell-appserver.d.ts +16 -0
- package/dist/cli/sparkshell-parse.d.ts +21 -0
- package/dist/cli/sparkshell.d.ts +26 -0
- package/dist/cli/types.d.ts +9 -0
- package/dist/config/schema/claude-code.d.ts +1 -0
- package/dist/config/schema/hooks.d.ts +1 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
- package/dist/create-hooks.d.ts +1 -0
- package/dist/features/background-agent/concurrency.d.ts +6 -1
- package/dist/features/background-agent/constants.d.ts +1 -0
- package/dist/features/background-agent/empty-assistant-turn.d.ts +7 -0
- package/dist/features/background-agent/manager.d.ts +12 -0
- package/dist/features/background-agent/message-updated-parent-wake-output.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
- package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +21 -0
- package/dist/features/background-agent/parent-wake-flush-runner.d.ts +24 -0
- package/dist/features/background-agent/parent-wake-history-state.d.ts +5 -0
- package/dist/features/background-agent/parent-wake-notifier-types.d.ts +50 -0
- package/dist/features/background-agent/parent-wake-notifier.d.ts +8 -50
- package/dist/features/background-agent/parent-wake-pending-queue.d.ts +22 -0
- package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +19 -0
- package/dist/features/background-agent/parent-wake-session-history.d.ts +73 -0
- package/dist/features/background-agent/parent-wake-session-inspector.d.ts +35 -0
- package/dist/features/background-agent/parent-wake-timer-handle.d.ts +5 -0
- package/dist/features/background-agent/parent-wake-window-recovery.d.ts +13 -0
- package/dist/features/background-agent/process-cleanup.d.ts +2 -0
- package/dist/features/background-agent/process-cleanup.test-helpers.d.ts +3 -0
- package/dist/features/background-agent/session-stream-activity.d.ts +6 -0
- package/dist/features/background-agent/spawner/fallback-agent.d.ts +5 -0
- package/dist/features/background-agent/spawner/task-prompt-body.d.ts +34 -0
- package/dist/features/background-agent/spawner/task-record.d.ts +2 -0
- package/dist/features/background-agent/spawner.d.ts +2 -5
- package/dist/features/builtin-commands/templates/refactor-sections/codemap-and-tests.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/plan-and-execution.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/verification-and-tooling.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor.d.ts +2 -2
- package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +2 -0
- package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +2 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +1 -1
- package/dist/features/builtin-skills/skills/index.d.ts +1 -0
- package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +2 -0
- package/dist/features/builtin-skills/skills/playwright.d.ts +2 -3
- package/dist/features/builtin-skills/skills/visual-qa.d.ts +2 -0
- package/dist/features/claude-code-agent-loader/agent-definitions-loader.d.ts +2 -2
- package/dist/features/claude-code-agent-loader/claude-model-mapper.d.ts +1 -1
- package/dist/features/claude-code-agent-loader/loader.d.ts +2 -2
- package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +1 -1
- package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +2 -0
- package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/discovery.d.ts +3 -4
- package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +1 -0
- package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +2 -0
- package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +1 -0
- package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +4 -0
- package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/types.d.ts +1 -0
- package/dist/features/hook-message-injector/context-resolver.d.ts +6 -0
- package/dist/features/hook-message-injector/id-generation.d.ts +2 -0
- package/dist/features/hook-message-injector/index.d.ts +1 -1
- package/dist/features/hook-message-injector/injector.d.ts +7 -69
- package/dist/features/hook-message-injector/json-message-lookup.d.ts +3 -0
- package/dist/features/hook-message-injector/message-directory.d.ts +1 -0
- package/dist/features/hook-message-injector/message-injection.d.ts +2 -0
- package/dist/features/hook-message-injector/sdk-message-context.d.ts +6 -0
- package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +28 -0
- package/dist/features/hook-message-injector/types.d.ts +9 -0
- package/dist/features/mcp-oauth/callback-server.d.ts +10 -2
- package/dist/features/opencode-runtime-skills/source-server.d.ts +1 -0
- package/dist/features/skill-mcp-manager/http-client.d.ts +2 -0
- package/dist/features/team-mode/deps.d.ts +8 -1
- package/dist/features/team-mode/team-layout-tmux/layout.d.ts +2 -0
- package/dist/features/team-mode/team-mailbox/send.d.ts +3 -0
- package/dist/features/team-mode/team-registry/paths.d.ts +17 -2
- package/dist/features/team-mode/team-runtime/shutdown.d.ts +1 -1
- package/dist/features/team-mode/team-runtime/unresolved-team-members.d.ts +3 -0
- package/dist/features/team-mode/team-state-store/active-resume.d.ts +5 -0
- package/dist/features/team-mode/team-state-store/creating-resume.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/deleting-resume.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/error-normalization.d.ts +2 -0
- package/dist/features/team-mode/team-state-store/reservation-reconciliation.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/resume-report.d.ts +7 -0
- package/dist/features/team-mode/team-state-store/resume.d.ts +2 -7
- package/dist/features/team-mode/team-state-store/runtime-cleanup.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/session-liveness.d.ts +9 -0
- package/dist/features/team-mode/team-state-store/worker-resume-status.d.ts +9 -0
- package/dist/features/team-mode/tools/lifecycle-create-tool.d.ts +17 -0
- package/dist/features/team-mode/tools/lifecycle-inline-spec.d.ts +19 -0
- package/dist/features/team-mode/tools/lifecycle-participant.d.ts +25 -0
- package/dist/features/team-mode/tools/lifecycle-shutdown-tools.d.ts +18 -0
- package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +3 -3
- package/dist/features/team-mode/tools/lifecycle.d.ts +3 -37
- package/dist/features/team-mode/tools/messaging-live-delivery-client.d.ts +25 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +19 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-reservation.d.ts +10 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-state.d.ts +5 -0
- package/dist/features/team-mode/tools/messaging-live-delivery.d.ts +6 -0
- package/dist/features/team-mode/tools/messaging-runtime.d.ts +17 -0
- package/dist/features/team-mode/tools/messaging.d.ts +4 -29
- package/dist/features/tmux-subagent/manager.d.ts +20 -1
- package/dist/features/tmux-subagent/session-created-handler.d.ts +4 -0
- package/dist/features/tmux-subagent/types.d.ts +1 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/message-builder.d.ts +1 -1
- package/dist/hooks/atlas/idle-completion-nudge.d.ts +10 -0
- package/dist/hooks/atlas/idle-constants.d.ts +4 -0
- package/dist/hooks/atlas/idle-continuation.d.ts +23 -0
- package/dist/hooks/atlas/idle-session-eligibility.d.ts +8 -0
- package/dist/hooks/atlas/tool-execute-after-direct-work.d.ts +9 -0
- package/dist/hooks/atlas/tool-execute-after-plan-tasks.d.ts +3 -0
- package/dist/hooks/atlas/tool-execute-after-subagent-completion.d.ts +14 -0
- package/dist/hooks/auto-update-checker/hook/background-update-check.d.ts +6 -0
- package/dist/hooks/auto-update-checker/hook/ignore-toast-error.d.ts +1 -0
- package/dist/hooks/hephaestus-agents-md-injector/hook.d.ts +37 -0
- package/dist/hooks/hephaestus-agents-md-injector/index.d.ts +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
- package/dist/hooks/ralph-loop/command-arguments.d.ts +1 -0
- package/dist/hooks/ralph-loop/event-handler-activity.d.ts +10 -0
- package/dist/hooks/ralph-loop/event-handler-completion.d.ts +9 -0
- package/dist/hooks/ralph-loop/event-handler-continuation.d.ts +16 -0
- package/dist/hooks/ralph-loop/event-handler-feedback.d.ts +16 -0
- package/dist/hooks/ralph-loop/event-handler-idle.d.ts +15 -0
- package/dist/hooks/ralph-loop/event-handler-impl.d.ts +10 -0
- package/dist/hooks/ralph-loop/event-handler-runtime-error.d.ts +4 -0
- package/dist/hooks/ralph-loop/event-handler-types.d.ts +20 -0
- package/dist/hooks/ralph-loop/loop-state-controller.d.ts +1 -0
- package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +4 -24
- package/dist/hooks/ralph-loop/ralph-loop-hook.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-chunks.d.ts +6 -0
- package/dist/hooks/read-image-resizer/png-constants.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-crc.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-decoder.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-encoder.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-filters.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-ihdr.d.ts +11 -0
- package/dist/hooks/read-image-resizer/png-nearest-neighbor.d.ts +1 -0
- package/dist/hooks/rules-injector/injection-output.d.ts +2 -0
- package/dist/hooks/rules-injector/injection-processor.d.ts +22 -0
- package/dist/hooks/rules-injector/injection-types.d.ts +43 -0
- package/dist/hooks/rules-injector/injector.d.ts +3 -47
- package/dist/hooks/rules-injector/match-decision-cache.d.ts +4 -0
- package/dist/hooks/rules-injector/parsed-rule-cache.d.ts +11 -0
- package/dist/hooks/rules-injector/path-resolution.d.ts +1 -0
- package/dist/hooks/rules-injector/rule-match-reason.d.ts +12 -0
- package/dist/hooks/rules-injector/transcript-hydration.d.ts +13 -2
- package/dist/hooks/runtime-fallback/auto-retry-abort.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-agent-context.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-cleanup.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-metadata.d.ts +9 -0
- package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +5 -0
- package/dist/hooks/runtime-fallback/fallback-bootstrap-model.d.ts +1 -1
- package/dist/hooks/runtime-fallback/fallback-state.d.ts +4 -1
- package/dist/hooks/runtime-fallback/normalize-model.d.ts +12 -0
- package/dist/hooks/session-notification-linux.d.ts +3 -0
- package/dist/hooks/session-notification-log.d.ts +2 -0
- package/dist/hooks/session-notification-macos.d.ts +3 -0
- package/dist/hooks/session-notification-platform.d.ts +3 -0
- package/dist/hooks/session-notification-runner.d.ts +9 -0
- package/dist/hooks/session-notification-send.d.ts +3 -0
- package/dist/hooks/session-notification-sender.d.ts +5 -6
- package/dist/hooks/session-notification-sound.d.ts +3 -0
- package/dist/hooks/session-notification-windows.d.ts +3 -0
- package/dist/hooks/session-recovery/error-recovery.d.ts +4 -0
- package/dist/hooks/session-recovery/hook-types.d.ts +22 -0
- package/dist/hooks/session-recovery/hook.d.ts +2 -19
- package/dist/hooks/session-recovery/interrupted-tool-results.d.ts +3 -0
- package/dist/hooks/session-recovery/message-state.d.ts +4 -0
- package/dist/hooks/session-recovery/storage/thinking-strip.d.ts +7 -1
- package/dist/hooks/start-work/context-info-builder.d.ts +9 -9
- package/dist/hooks/start-work/context-info-formatters.d.ts +21 -0
- package/dist/hooks/start-work/explicit-plan-context.d.ts +9 -0
- package/dist/hooks/start-work/plan-discovery-context.d.ts +25 -0
- package/dist/hooks/start-work/plan-selection.d.ts +4 -0
- package/dist/hooks/start-work/work-initializer.d.ts +17 -0
- package/dist/hooks/tool-pair-validator/hook.d.ts +1 -37
- package/dist/hooks/tool-pair-validator/message-transform.d.ts +2 -0
- package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +6 -0
- package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -0
- package/dist/hooks/tool-pair-validator/types.d.ts +36 -0
- package/dist/index.js +12708 -9988
- package/dist/oh-my-opencode.schema.json +4 -0
- package/dist/openclaw/reply-listener-poll-loop.d.ts +3 -0
- package/dist/openclaw/reply-listener-signature.d.ts +2 -0
- package/dist/openclaw/reply-listener-sleep.d.ts +1 -0
- package/dist/openclaw/reply-listener-start.d.ts +9 -0
- package/dist/openclaw/reply-listener-status.d.ts +4 -0
- package/dist/openclaw/reply-listener-stop.d.ts +7 -0
- package/dist/openclaw/reply-listener.d.ts +5 -18
- package/dist/openclaw/session-registry-lock.d.ts +2 -0
- package/dist/openclaw/session-registry-paths.d.ts +9 -0
- package/dist/openclaw/session-registry-storage.d.ts +4 -0
- package/dist/openclaw/session-registry-types.d.ts +11 -0
- package/dist/openclaw/session-registry.d.ts +2 -11
- package/dist/plugin/chat-message/loop-commands.d.ts +9 -0
- package/dist/plugin/chat-message/model-cache-warning.d.ts +12 -0
- package/dist/plugin/chat-message/prompt-text.d.ts +2 -0
- package/dist/plugin/chat-message/session-model.d.ts +4 -0
- package/dist/plugin/chat-message/start-work-message.d.ts +5 -0
- package/dist/plugin/chat-message/types.d.ts +67 -0
- package/dist/plugin/chat-message.d.ts +3 -24
- package/dist/plugin/event-error-utils.d.ts +14 -0
- package/dist/plugin/event-hook-dispatcher.d.ts +5 -0
- package/dist/plugin/event-model-fallback-state.d.ts +30 -0
- package/dist/plugin/event-model-fallback.d.ts +39 -0
- package/dist/plugin/event-session-lifecycle.d.ts +49 -0
- package/dist/plugin/event-session-recovery.d.ts +9 -0
- package/dist/plugin/event-team-handlers.d.ts +13 -0
- package/dist/plugin/event-types.d.ts +78 -0
- package/dist/plugin/event.d.ts +3 -12
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
- package/dist/plugin/hooks/model-fallback-title-updater.d.ts +8 -0
- package/dist/plugin/session-compacting.d.ts +4 -1
- package/dist/plugin/system-transform.d.ts +1 -1
- package/dist/plugin/tool-execute-after.d.ts +2 -0
- package/dist/plugin/tool-registry-core-tools.d.ts +15 -0
- package/dist/plugin/tool-registry-factories.d.ts +36 -0
- package/dist/plugin/tool-registry-gated-tools.d.ts +16 -0
- package/dist/plugin/tool-registry-team-tools.d.ts +14 -0
- package/dist/plugin/tool-registry-trimming.d.ts +2 -0
- package/dist/plugin/tool-registry.d.ts +3 -38
- package/dist/plugin/ultrawork-db-model-override.d.ts +1 -1
- package/dist/plugin-config/agent-order-warnings.d.ts +1 -0
- package/dist/plugin-config/config-merger.d.ts +2 -0
- package/dist/plugin-config/layered-config-loader.d.ts +2 -0
- package/dist/plugin-config/single-config-loader.d.ts +4 -0
- package/dist/plugin-config.d.ts +3 -5
- package/dist/plugin-handlers/agent-config-assembly.d.ts +19 -0
- package/dist/plugin-handlers/agent-config-finalizer.d.ts +4 -0
- package/dist/plugin-handlers/agent-config-handler.d.ts +2 -11
- package/dist/plugin-handlers/agent-config-types.d.ts +30 -0
- package/dist/plugin-handlers/agent-skill-discovery.d.ts +3 -0
- package/dist/plugin-handlers/agent-source-loader.d.ts +2 -0
- package/dist/plugin-handlers/hook-config-handler.d.ts +0 -3
- package/dist/shared/context-window-usage.d.ts +7 -0
- package/dist/shared/dynamic-truncator-types.d.ts +17 -0
- package/dist/shared/dynamic-truncator.d.ts +8 -23
- package/dist/shared/migration/migrations-sidecar.d.ts +2 -2
- package/dist/shared/migration/model-versions.d.ts +7 -4
- package/dist/shared/model-availability.d.ts +1 -1
- package/dist/shared/opencode-version.d.ts +2 -2
- package/dist/shared/sparkshell-awareness.d.ts +5 -0
- package/dist/shared/spawn-with-windows-hide.d.ts +2 -0
- package/dist/shared/token-limit-truncator.d.ts +2 -0
- package/dist/testing/module-mock-lifecycle.d.ts +8 -0
- package/dist/tools/delegate-task/openai-categories.d.ts +0 -1
- package/dist/tools/delegate-task/subagent-agent-match.d.ts +3 -0
- package/dist/tools/delegate-task/subagent-model-resolution.d.ts +4 -0
- package/dist/tools/delegate-task/subagent-request-preflight.d.ts +3 -0
- package/dist/tools/delegate-task/subagent-resolution-types.d.ts +32 -0
- package/dist/tools/delegate-task/subagent-resolver.d.ts +3 -12
- package/dist/tools/delegate-task/sync-completion-message.d.ts +20 -0
- package/dist/tools/delegate-task/sync-poll-error-recovery.d.ts +1 -0
- package/dist/tools/delegate-task/sync-session-lifecycle.d.ts +12 -0
- package/dist/tools/delegate-task/sync-session-poller.d.ts +2 -0
- package/dist/tools/delegate-task/sync-spawn-reservation.d.ts +10 -0
- package/dist/tools/delegate-task/sync-task-metadata.d.ts +11 -0
- package/dist/tools/delegate-task/sync-task-runner.d.ts +30 -0
- package/dist/tools/delegate-task/sync-task.d.ts +2 -1
- package/dist/tools/hashline-edit/formatter-trigger.d.ts +2 -2
- package/package.json +15 -14
- package/packages/git-bash-mcp/dist/cli.js +29 -12
- package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.d.ts +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +95 -30
- package/packages/lsp-tools-mcp/dist/lsp/server-installation.d.ts +1 -2
- package/packages/lsp-tools-mcp/dist/lsp/server-installation.js +1 -11
- package/packages/lsp-tools-mcp/dist/lsp/transport.d.ts +1 -0
- package/packages/lsp-tools-mcp/dist/lsp/transport.js +5 -10
- package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.d.ts +4 -1
- package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +84 -23
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +2 -0
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.js +14 -0
- package/packages/lsp-tools-mcp/dist/tools.js +64 -80
- package/packages/lsp-tools-mcp/package.json +4 -4
- package/packages/omo-codex/lazycodex-repository/.github/workflows/pr-source-guidance.yml +36 -0
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/README.md +3 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +188 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/core-values.ts +1 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +15 -361
- package/packages/omo-codex/plugin/components/comment-checker/src/hook-input.ts +19 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/record.ts +11 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +102 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/types.ts +51 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +145 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/core.test.ts +200 -0
- package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +11 -5
- package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +0 -1
- package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-cache.ts +87 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-loader.ts +94 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-loader.ts +84 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-paths.ts +103 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-static-loader.ts +43 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-types.ts +45 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -419
- package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +32 -5
- package/packages/omo-codex/plugin/components/rules/src/rules/parser-frontmatter.ts +39 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/parser-yaml.ts +271 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +3 -294
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +57 -0
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +13 -2
- package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +17 -0
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +2 -1
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +26 -11
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +104 -138
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +5 -2
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +12 -5
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +10 -4
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +65 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +47 -2
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +16 -0
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +153 -0
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +12 -0
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +236 -0
- package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +28 -50
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +6 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +13 -6
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +64 -2
- package/packages/omo-codex/plugin/components/telemetry/README.md +11 -1
- package/packages/omo-codex/plugin/components/telemetry/biome.json +12 -0
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +30 -3
- package/packages/omo-codex/plugin/components/telemetry/src/diagnostics.ts +154 -0
- package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +18 -2
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +36 -4
- package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +115 -0
- package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +16 -25
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +119 -0
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +97 -32
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +65 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/agents/openai.yaml +7 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +131 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +38 -10
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +47 -0
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +12 -8
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +28 -21
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +7 -7
- package/packages/omo-codex/plugin/components/ulw-loop/src/command-types.ts +36 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +64 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +98 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +17 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +69 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +5 -277
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +35 -13
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +52 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +67 -111
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +31 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +46 -9
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +20 -29
- package/packages/omo-codex/plugin/model-catalog.json +5 -11
- package/packages/omo-codex/plugin/package-lock.json +1 -1
- package/packages/omo-codex/plugin/scripts/auto-update-state.mjs +78 -0
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +166 -76
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +71 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/config-paths.mjs +44 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +74 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/state.mjs +29 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +14 -202
- package/packages/omo-codex/plugin/scripts/spawn-command.mjs +11 -0
- package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +23 -9
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +131 -28
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +100 -0
- package/packages/omo-codex/plugin/skills/git-master/agents/openai.yaml +13 -0
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -7
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
- package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +119 -14
- package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +4 -2
- package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +2 -2
- package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +6 -6
- package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +12 -12
- package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +7 -7
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +13 -11
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -8
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +68 -33
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +86 -22
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +770 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +12 -8
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +28 -21
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +45 -379
- package/packages/omo-codex/plugin/skills/ulw-plan/agents/openai.yaml +7 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +131 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +237 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/ansi.ts +17 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/cli.ts +82 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/east-asian-width.ts +72 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/image-diff.ts +109 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-crc.ts +27 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-decode.ts +206 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-synth.ts +57 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/tui-grid.ts +88 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/types.ts +54 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +55 -0
- package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +38 -0
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +164 -0
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +73 -0
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +69 -0
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +83 -0
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +67 -0
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +2 -514
- package/packages/omo-codex/plugin/test/auto-update-state-persistence.test.mjs +36 -0
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +191 -29
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +29 -0
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +23 -10
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +81 -0
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +91 -0
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +165 -9
- package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -19
- package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +107 -0
- package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +82 -7
- package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +58 -6
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +152 -0
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +158 -50
- package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +43 -0
- package/packages/omo-codex/scripts/install/agent-source-roots.mjs +13 -0
- package/packages/omo-codex/scripts/install/agents.mjs +84 -14
- package/packages/omo-codex/scripts/install/bin-links.mjs +239 -0
- package/packages/omo-codex/scripts/install/cache.mjs +152 -108
- package/packages/omo-codex/scripts/install/cached-marketplace-manifest.mjs +21 -0
- package/packages/omo-codex/scripts/install/cli-args.mjs +39 -2
- package/packages/omo-codex/scripts/install/config.mjs +7 -5
- package/packages/omo-codex/scripts/install/lazycodex-version-stamp.mjs +102 -0
- package/packages/omo-codex/scripts/install/legacy-bins.mjs +9 -1
- package/packages/omo-codex/scripts/install/model-catalog.mjs +9 -1
- package/packages/omo-codex/scripts/install/process.mjs +3 -1
- package/packages/omo-codex/scripts/install/project-local-cleanup.mjs +0 -1
- package/packages/omo-codex/scripts/install/snapshot.mjs +0 -1
- package/packages/omo-codex/scripts/install-agent-links.test.mjs +205 -11
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -1
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +129 -5
- package/packages/omo-codex/scripts/install-cli-args.test.mjs +82 -1
- package/packages/omo-codex/scripts/install-config-preservation.test.mjs +43 -0
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +14 -1
- package/packages/omo-codex/scripts/install-config.test.mjs +49 -1
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +84 -0
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +51 -0
- package/packages/omo-codex/scripts/install-local.mjs +42 -40
- package/packages/omo-codex/scripts/install-local.test.mjs +17 -241
- package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +162 -0
- package/packages/omo-codex/scripts/install-packaged-local.test.mjs +10 -6
- package/packages/omo-codex/scripts/install-project-local-cleanup.test.mjs +73 -2
- package/packages/omo-codex/scripts/sync-telemetry-component.mjs +1 -0
- package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
- package/packages/shared-skills/skills/git-master/SKILL.md +100 -0
- package/packages/shared-skills/skills/git-master/agents/openai.yaml +13 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +119 -14
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +4 -2
- package/packages/shared-skills/skills/programming/references/go/concurrency.md +2 -2
- package/packages/shared-skills/skills/programming/references/python/async-anyio.md +6 -6
- package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +12 -12
- package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +7 -7
- package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
- package/packages/shared-skills/skills/review-work/SKILL.md +55 -33
- package/packages/shared-skills/skills/start-work/SKILL.md +76 -19
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +770 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +219 -0
- package/packages/shared-skills/skills/visual-qa/scripts/ansi.test.ts +45 -0
- package/packages/shared-skills/skills/visual-qa/scripts/ansi.ts +17 -0
- package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +73 -0
- package/packages/shared-skills/skills/visual-qa/scripts/cli.ts +82 -0
- package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.test.ts +60 -0
- package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.ts +72 -0
- package/packages/shared-skills/skills/visual-qa/scripts/image-diff.test.ts +70 -0
- package/packages/shared-skills/skills/visual-qa/scripts/image-diff.ts +109 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-crc.ts +27 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-decode.test.ts +44 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-decode.ts +206 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-synth.ts +57 -0
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +83 -0
- package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.test.ts +57 -0
- package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.ts +88 -0
- package/packages/shared-skills/skills/visual-qa/scripts/types.ts +54 -0
- package/postinstall.mjs +24 -1
- package/dist/agents/custom-agent-summaries.d.ts +0 -8
- package/dist/agents/hephaestus/gpt-5-3-codex.d.ts +0 -20
- package/dist/agents/prometheus/gemini.d.ts +0 -1
- package/dist/agents/prometheus/gpt.d.ts +0 -1
- package/dist/agents/sisyphus-junior/gpt-5-3-codex.d.ts +0 -8
- package/dist/features/background-agent/session-route.d.ts +0 -12
- package/dist/features/background-agent/spawner/parent-directory-resolver.d.ts +0 -6
- package/dist/features/background-agent/state.d.ts +0 -35
- package/dist/features/claude-tasks/session-storage.d.ts +0 -9
- package/dist/features/mcp-oauth/resource-indicator.d.ts +0 -2
- package/dist/features/mcp-oauth/schema.d.ts +0 -6
- package/dist/features/opencode-skill-loader/async-loader.d.ts +0 -6
- package/dist/features/opencode-skill-loader/blocking.d.ts +0 -2
- package/dist/features/opencode-skill-loader/discover-worker.d.ts +0 -1
- package/dist/hooks/session-recovery/recover-empty-content-message-sdk.d.ts +0 -13
- package/dist/shared/bun-hash-shim.d.ts +0 -1
- package/dist/tools/delegate-task/resolve-call-id.d.ts +0 -2
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -383
- /package/packages/lsp-tools-mcp/dist/lsp/{utils.d.ts → startup-failure.d.ts} +0 -0
- /package/packages/lsp-tools-mcp/dist/lsp/{utils.js → startup-failure.js} +0 -0
|
@@ -26,14 +26,17 @@ interface Fixture {
|
|
|
26
26
|
|
|
27
27
|
const BUNDLED_ONLY_ENV = {
|
|
28
28
|
CODEX_RULES_ENABLED_SOURCES: "plugin-bundled",
|
|
29
|
+
CODEX_RULES_MAX_RESULT_CHARS: "40000",
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
const PROJECT_AND_BUNDLED_ENV = {
|
|
32
33
|
CODEX_RULES_ENABLED_SOURCES: ".omo/rules,plugin-bundled",
|
|
34
|
+
CODEX_RULES_MAX_RESULT_CHARS: "40000",
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
const DISABLED_BUNDLED_ENV = {
|
|
36
38
|
CODEX_RULES_ENABLED_SOURCES: "plugin-bundled",
|
|
39
|
+
CODEX_RULES_MAX_RESULT_CHARS: "40000",
|
|
37
40
|
CODEX_RULES_DISABLE_BUNDLED: "1",
|
|
38
41
|
};
|
|
39
42
|
|
|
@@ -147,9 +150,9 @@ describe("plugin bundled rules", () => {
|
|
|
147
150
|
expect(cache.scannedRuleFiles.has(join(pluginRoot, "bundled-rules"))).toBe(true);
|
|
148
151
|
});
|
|
149
152
|
|
|
150
|
-
it("#given alwaysApply bundled rule #when SessionStart runs #then static context
|
|
153
|
+
it("#given alwaysApply bundled Hephaestus rule #when SessionStart runs #then static context expands it inline", async () => {
|
|
151
154
|
// given
|
|
152
|
-
const { root, pluginData } = makeFixture();
|
|
155
|
+
const { root, pluginData, bundledRulePath } = makeFixture();
|
|
153
156
|
|
|
154
157
|
// when
|
|
155
158
|
const output = await runSessionStartHook(sessionStartInput(root), {
|
|
@@ -159,10 +162,14 @@ describe("plugin bundled rules", () => {
|
|
|
159
162
|
|
|
160
163
|
// then
|
|
161
164
|
expect(output).toContain('"hookEventName":"SessionStart"');
|
|
165
|
+
expect(output).toContain(`Instructions from: ${bundledRulePath}`);
|
|
162
166
|
expect(output).toContain(BUNDLED_BODY);
|
|
167
|
+
expect(output).toContain("## Project Instructions");
|
|
168
|
+
expect(output).not.toContain("must read project rules:");
|
|
169
|
+
expect(output).not.toContain(`- [hephaestus.md]{${bundledRulePath}}`);
|
|
163
170
|
});
|
|
164
171
|
|
|
165
|
-
it("#given same project and bundled body #when SessionStart runs #then project rule wins", async () => {
|
|
172
|
+
it("#given same project and bundled body #when SessionStart runs #then project rule file wins", async () => {
|
|
166
173
|
// given
|
|
167
174
|
const { root, pluginData, bundledRulePath, projectRulePath } = makeFixture({ writeProjectDuplicate: true });
|
|
168
175
|
|
|
@@ -173,8 +180,9 @@ describe("plugin bundled rules", () => {
|
|
|
173
180
|
});
|
|
174
181
|
|
|
175
182
|
// then
|
|
176
|
-
expect(occurrenceCount(output,
|
|
177
|
-
expect(output).toContain(projectRulePath);
|
|
183
|
+
expect(occurrenceCount(output, "- [hephaestus.md]{")).toBe(0);
|
|
184
|
+
expect(output).toContain(`Instructions from: ${projectRulePath}`);
|
|
185
|
+
expect(output).toContain(SHARED_BODY);
|
|
178
186
|
expect(output).not.toContain(bundledRulePath);
|
|
179
187
|
});
|
|
180
188
|
|
|
@@ -194,11 +202,12 @@ describe("plugin bundled rules", () => {
|
|
|
194
202
|
|
|
195
203
|
it("#given bundled static context already injected #when UserPromptSubmit runs after PostCompact #then it emits no duplicate bundled context", async () => {
|
|
196
204
|
// given
|
|
197
|
-
const { root, pluginData } = makeFixture();
|
|
205
|
+
const { root, pluginData, bundledRulePath } = makeFixture();
|
|
198
206
|
const firstOutput = await runSessionStartHook(sessionStartInput(root), {
|
|
199
207
|
pluginDataRoot: pluginData,
|
|
200
208
|
env: BUNDLED_ONLY_ENV,
|
|
201
209
|
});
|
|
210
|
+
expect(firstOutput).toContain(`Instructions from: ${bundledRulePath}`);
|
|
202
211
|
expect(firstOutput).toContain(BUNDLED_BODY);
|
|
203
212
|
|
|
204
213
|
// when
|
|
@@ -213,7 +222,7 @@ describe("plugin bundled rules", () => {
|
|
|
213
222
|
expect(output).toBe("");
|
|
214
223
|
});
|
|
215
224
|
|
|
216
|
-
it("#given bundled rule body exceeds per-rule cap #when SessionStart runs #then
|
|
225
|
+
it("#given bundled Hephaestus rule body exceeds per-rule cap #when SessionStart runs #then static context expands the body within result budget", async () => {
|
|
217
226
|
// given
|
|
218
227
|
const root = mkdtempSync(join(tmpdir(), "codex-rules-bundled-large-project-"));
|
|
219
228
|
const pluginRoot = mkdtempSync(join(tmpdir(), "codex-rules-bundled-large-plugin-"));
|
|
@@ -224,8 +233,9 @@ describe("plugin bundled rules", () => {
|
|
|
224
233
|
const oversizedBody = "The bundled craftsman discipline is non-negotiable. ".repeat(400);
|
|
225
234
|
expect(oversizedBody.length).toBeGreaterThan(12000);
|
|
226
235
|
const tailMarker = "BUNDLED_TAIL_SENTINEL_LANDS_IN_FULL";
|
|
236
|
+
const bundledRulePath = join(pluginRoot, "bundled-rules", "hephaestus.md");
|
|
227
237
|
const bundledBody = `${oversizedBody}\n\n${tailMarker}\n`;
|
|
228
|
-
writeFileSync(
|
|
238
|
+
writeFileSync(bundledRulePath, ruleMarkdown(bundledBody));
|
|
229
239
|
process.env["PLUGIN_ROOT"] = pluginRoot;
|
|
230
240
|
|
|
231
241
|
// when
|
|
@@ -235,11 +245,13 @@ describe("plugin bundled rules", () => {
|
|
|
235
245
|
});
|
|
236
246
|
|
|
237
247
|
// then
|
|
248
|
+
expect(output).toContain(`Instructions from: ${bundledRulePath}`);
|
|
249
|
+
expect(output).toContain("The bundled craftsman discipline is non-negotiable.");
|
|
238
250
|
expect(output).toContain(tailMarker);
|
|
239
251
|
expect(output).not.toContain("[Truncated. Full:");
|
|
240
252
|
});
|
|
241
253
|
|
|
242
|
-
it("#given project rule body exceeds per-rule cap #when SessionStart runs #then
|
|
254
|
+
it("#given project rule body exceeds per-rule cap #when SessionStart runs #then static context injects a truncated body", async () => {
|
|
243
255
|
// given
|
|
244
256
|
const root = mkdtempSync(join(tmpdir(), "codex-rules-project-large-project-"));
|
|
245
257
|
const pluginRoot = mkdtempSync(join(tmpdir(), "codex-rules-project-large-plugin-"));
|
|
@@ -251,8 +263,9 @@ describe("plugin bundled rules", () => {
|
|
|
251
263
|
const oversizedBody = "The project rule body is intentionally oversized for the cap test. ".repeat(300);
|
|
252
264
|
expect(oversizedBody.length).toBeGreaterThan(12000);
|
|
253
265
|
const tailMarker = "PROJECT_TAIL_SENTINEL_SHOULD_NOT_LAND";
|
|
266
|
+
const projectRulePath = join(root, ".omo", "rules", "oversized.md");
|
|
254
267
|
const projectBody = `${oversizedBody}\n\n${tailMarker}\n`;
|
|
255
|
-
writeFileSync(
|
|
268
|
+
writeFileSync(projectRulePath, ruleMarkdown(projectBody));
|
|
256
269
|
process.env["PLUGIN_ROOT"] = pluginRoot;
|
|
257
270
|
|
|
258
271
|
// when
|
|
@@ -262,7 +275,9 @@ describe("plugin bundled rules", () => {
|
|
|
262
275
|
});
|
|
263
276
|
|
|
264
277
|
// then
|
|
265
|
-
expect(output).toContain(
|
|
278
|
+
expect(output).toContain(`Instructions from: ${projectRulePath}`);
|
|
279
|
+
expect(output).toContain("The project rule body is intentionally oversized for the cap test.");
|
|
280
|
+
expect(output).toContain("[Truncated. Full:");
|
|
266
281
|
expect(output).not.toContain(tailMarker);
|
|
267
282
|
});
|
|
268
283
|
});
|
|
@@ -9,6 +9,35 @@ const tempDirectories: string[] = [];
|
|
|
9
9
|
const PROJECT_ONLY_ENV = {
|
|
10
10
|
CODEX_RULES_ENABLED_SOURCES: "AGENTS.md,.omo/rules",
|
|
11
11
|
};
|
|
12
|
+
const PROMPT_CONTEXT_PRESSURE_CASES = [
|
|
13
|
+
[
|
|
14
|
+
"#given context-pressure recovery prompt and empty static cache #when UserPromptSubmit runs #then it emits no static context",
|
|
15
|
+
[
|
|
16
|
+
"Context compacted",
|
|
17
|
+
"error context_too_large: Your input exceeds the context window of this model.",
|
|
18
|
+
"Please adjust your input and try again.",
|
|
19
|
+
].join("\n"),
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"#given Codex canonical context-window prompt and empty static cache #when UserPromptSubmit runs #then it emits no static context",
|
|
23
|
+
[
|
|
24
|
+
"error context_length_exceeded",
|
|
25
|
+
"Codex ran out of room in the model's context window. Start a new thread before retrying.",
|
|
26
|
+
].join("\n"),
|
|
27
|
+
],
|
|
28
|
+
] as const;
|
|
29
|
+
const TRANSCRIPT_CONTEXT_PRESSURE_CASES = [
|
|
30
|
+
[
|
|
31
|
+
"#given context-pressure transcript and empty static cache #when UserPromptSubmit runs #then it emits no static context",
|
|
32
|
+
"#given context-pressure transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context",
|
|
33
|
+
writeContextPressureTranscript,
|
|
34
|
+
],
|
|
35
|
+
[
|
|
36
|
+
"#given Codex canonical context-window transcript and empty static cache #when UserPromptSubmit runs #then it emits no static context",
|
|
37
|
+
"#given Codex canonical context-window transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context",
|
|
38
|
+
writeCodexContextWindowTranscript,
|
|
39
|
+
],
|
|
40
|
+
] as const;
|
|
12
41
|
|
|
13
42
|
afterEach(() => {
|
|
14
43
|
for (const directory of tempDirectories.splice(0)) {
|
|
@@ -17,144 +46,54 @@ afterEach(() => {
|
|
|
17
46
|
});
|
|
18
47
|
|
|
19
48
|
describe("codex rules context-pressure recovery", () => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
...userPromptSubmitInput(root),
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
{
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
{
|
|
69
|
-
...userPromptSubmitInput(root),
|
|
70
|
-
transcript_path: transcriptPath,
|
|
71
|
-
prompt: "continue",
|
|
72
|
-
},
|
|
73
|
-
{ pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
// then
|
|
77
|
-
expect(output).toBe("");
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it("#given Codex canonical context-window transcript and empty static cache #when UserPromptSubmit runs #then it emits no static context", async () => {
|
|
81
|
-
// given
|
|
82
|
-
const { root, pluginData } = makeTempProject();
|
|
83
|
-
const transcriptPath = writeCodexContextWindowTranscript(root);
|
|
84
|
-
|
|
85
|
-
// when
|
|
86
|
-
const output = await runUserPromptSubmitHook(
|
|
87
|
-
{
|
|
88
|
-
...userPromptSubmitInput(root),
|
|
89
|
-
transcript_path: transcriptPath,
|
|
90
|
-
prompt: "continue",
|
|
91
|
-
},
|
|
92
|
-
{ pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
// then
|
|
96
|
-
expect(output).toBe("");
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it("#given context-pressure transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context", async () => {
|
|
100
|
-
// given
|
|
101
|
-
const { root, pluginData } = makeTempProject();
|
|
102
|
-
const transcriptPath = writeContextPressureTranscript(root);
|
|
103
|
-
const filePath = path.join(root, "src", "app.ts");
|
|
104
|
-
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
105
|
-
writeFileSync(filePath, "export const answer = 42;\n");
|
|
106
|
-
|
|
107
|
-
// when
|
|
108
|
-
const output = await runPostToolUseHook(
|
|
109
|
-
{
|
|
110
|
-
session_id: "session-context-pressure",
|
|
111
|
-
turn_id: "turn-1",
|
|
112
|
-
transcript_path: transcriptPath,
|
|
113
|
-
cwd: root,
|
|
114
|
-
hook_event_name: "PostToolUse",
|
|
115
|
-
model: "gpt-5.5",
|
|
116
|
-
permission_mode: "default",
|
|
117
|
-
tool_name: "mcp__filesystem__read_file",
|
|
118
|
-
tool_input: { path: filePath },
|
|
119
|
-
tool_response: { text: "export const answer = 42;" },
|
|
120
|
-
tool_use_id: "call-1",
|
|
121
|
-
},
|
|
122
|
-
{ pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
// then
|
|
126
|
-
expect(output).toBe("");
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("#given Codex canonical context-window transcript and empty dynamic cache #when PostToolUse runs #then it emits no dynamic context", async () => {
|
|
130
|
-
// given
|
|
131
|
-
const { root, pluginData } = makeTempProject();
|
|
132
|
-
const transcriptPath = writeCodexContextWindowTranscript(root);
|
|
133
|
-
const filePath = path.join(root, "src", "app.ts");
|
|
134
|
-
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
135
|
-
writeFileSync(filePath, "export const answer = 42;\n");
|
|
136
|
-
|
|
137
|
-
// when
|
|
138
|
-
const output = await runPostToolUseHook(
|
|
139
|
-
{
|
|
140
|
-
session_id: "session-context-pressure",
|
|
141
|
-
turn_id: "turn-1",
|
|
142
|
-
transcript_path: transcriptPath,
|
|
143
|
-
cwd: root,
|
|
144
|
-
hook_event_name: "PostToolUse",
|
|
145
|
-
model: "gpt-5.5",
|
|
146
|
-
permission_mode: "default",
|
|
147
|
-
tool_name: "mcp__filesystem__read_file",
|
|
148
|
-
tool_input: { path: filePath },
|
|
149
|
-
tool_response: { text: "export const answer = 42;" },
|
|
150
|
-
tool_use_id: "call-1",
|
|
151
|
-
},
|
|
152
|
-
{ pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
// then
|
|
156
|
-
expect(output).toBe("");
|
|
157
|
-
});
|
|
49
|
+
for (const [name, prompt] of PROMPT_CONTEXT_PRESSURE_CASES) {
|
|
50
|
+
it(name, async () => {
|
|
51
|
+
// given
|
|
52
|
+
const { root, pluginData } = makeTempProject();
|
|
53
|
+
|
|
54
|
+
// when
|
|
55
|
+
const output = await runUserPromptSubmitHook(
|
|
56
|
+
{ ...userPromptSubmitInput(root), prompt },
|
|
57
|
+
{ pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// then
|
|
61
|
+
expect(output).toBe("");
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
for (const [userPromptName, postToolName, writeTranscript] of TRANSCRIPT_CONTEXT_PRESSURE_CASES) {
|
|
66
|
+
it(userPromptName, async () => {
|
|
67
|
+
// given
|
|
68
|
+
const { root, pluginData } = makeTempProject();
|
|
69
|
+
const transcriptPath = writeTranscript(root);
|
|
70
|
+
|
|
71
|
+
// when
|
|
72
|
+
const output = await runUserPromptSubmitHook(
|
|
73
|
+
{ ...userPromptSubmitInput(root), transcript_path: transcriptPath, prompt: "continue" },
|
|
74
|
+
{ pluginDataRoot: pluginData, env: PROJECT_ONLY_ENV },
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
// then
|
|
78
|
+
expect(output).toBe("");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it(postToolName, async () => {
|
|
82
|
+
// given
|
|
83
|
+
const { root, pluginData } = makeTempProject();
|
|
84
|
+
const transcriptPath = writeTranscript(root);
|
|
85
|
+
const filePath = writeAppFile(root);
|
|
86
|
+
|
|
87
|
+
// when
|
|
88
|
+
const output = await runPostToolUseHook(postToolUseInput(root, transcriptPath, filePath), {
|
|
89
|
+
pluginDataRoot: pluginData,
|
|
90
|
+
env: PROJECT_ONLY_ENV,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// then
|
|
94
|
+
expect(output).toBe("");
|
|
95
|
+
});
|
|
96
|
+
}
|
|
158
97
|
});
|
|
159
98
|
|
|
160
99
|
function makeTempProject(): { readonly root: string; readonly pluginData: string } {
|
|
@@ -191,6 +130,33 @@ function userPromptSubmitInput(root: string): Parameters<typeof runUserPromptSub
|
|
|
191
130
|
};
|
|
192
131
|
}
|
|
193
132
|
|
|
133
|
+
function postToolUseInput(
|
|
134
|
+
root: string,
|
|
135
|
+
transcriptPath: string,
|
|
136
|
+
filePath: string,
|
|
137
|
+
): Parameters<typeof runPostToolUseHook>[0] {
|
|
138
|
+
return {
|
|
139
|
+
session_id: "session-context-pressure",
|
|
140
|
+
turn_id: "turn-1",
|
|
141
|
+
transcript_path: transcriptPath,
|
|
142
|
+
cwd: root,
|
|
143
|
+
hook_event_name: "PostToolUse",
|
|
144
|
+
model: "gpt-5.5",
|
|
145
|
+
permission_mode: "default",
|
|
146
|
+
tool_name: "mcp__filesystem__read_file",
|
|
147
|
+
tool_input: { path: filePath },
|
|
148
|
+
tool_response: { text: "export const answer = 42;" },
|
|
149
|
+
tool_use_id: "call-1",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function writeAppFile(root: string): string {
|
|
154
|
+
const filePath = path.join(root, "src", "app.ts");
|
|
155
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
156
|
+
writeFileSync(filePath, "export const answer = 42;\n");
|
|
157
|
+
return filePath;
|
|
158
|
+
}
|
|
159
|
+
|
|
194
160
|
function writeContextPressureTranscript(root: string): string {
|
|
195
161
|
const transcriptPath = path.join(root, "transcript-context-pressure.jsonl");
|
|
196
162
|
writeFileSync(
|
package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts
CHANGED
|
@@ -25,7 +25,7 @@ afterEach(() => {
|
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
describe("codex rules post-compaction context budget", () => {
|
|
28
|
-
it("#given oversized project rules already injected #when static recovery runs after compaction #then it emits no duplicate
|
|
28
|
+
it("#given oversized project rules already injected #when static recovery runs after compaction #then it emits no duplicate static injection", async () => {
|
|
29
29
|
// given
|
|
30
30
|
const { root, pluginData } = makeOversizedProject();
|
|
31
31
|
const firstOutput = await runSessionStartHook(sessionStartInput(root), {
|
|
@@ -46,7 +46,10 @@ describe("codex rules post-compaction context budget", () => {
|
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
// then
|
|
49
|
-
expect(firstContext
|
|
49
|
+
expect(firstContext).toContain(`Instructions from: ${path.join(root, "CONTEXT.md")}`);
|
|
50
|
+
expect(firstContext).toContain("Project rule");
|
|
51
|
+
expect(firstContext).toContain("[Truncated. Full:");
|
|
52
|
+
expect(firstContext.length).toBeLessThan(31_000);
|
|
50
53
|
expect(output).toBe("");
|
|
51
54
|
});
|
|
52
55
|
});
|
package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts
CHANGED
|
@@ -39,6 +39,8 @@ describe("codex rules compacted context recovery", () => {
|
|
|
39
39
|
const postCompactContext = readAdditionalContext(output);
|
|
40
40
|
expect(postCompactContext.length).toBeLessThan(5_000);
|
|
41
41
|
expect(postCompactContext).toContain("Instructions from:");
|
|
42
|
+
expect(postCompactContext).toContain("CONTEXT.md");
|
|
43
|
+
expect(postCompactContext).toContain("Project rule");
|
|
42
44
|
});
|
|
43
45
|
|
|
44
46
|
it("#given compacted context warning and near-full transcript #when compact source starts twice #then handles compacted context warning once", async () => {
|
|
@@ -63,7 +65,8 @@ describe("codex rules compacted context recovery", () => {
|
|
|
63
65
|
// then
|
|
64
66
|
const firstContext = readOptionalAdditionalContext(firstOutput);
|
|
65
67
|
expect(firstContext.length).toBeLessThan(1_000);
|
|
66
|
-
expect(firstContext).toContain("
|
|
68
|
+
expect(firstContext).toContain("Instructions from:");
|
|
69
|
+
expect(firstContext).toContain("CONTEXT.md");
|
|
67
70
|
expect(secondOutput).toBe("");
|
|
68
71
|
});
|
|
69
72
|
|
|
@@ -85,7 +88,8 @@ describe("codex rules compacted context recovery", () => {
|
|
|
85
88
|
// then
|
|
86
89
|
const context = readOptionalAdditionalContext(output);
|
|
87
90
|
expect(context.length).toBeLessThan(1_000);
|
|
88
|
-
expect(context).toContain("
|
|
91
|
+
expect(context).toContain("Instructions from:");
|
|
92
|
+
expect(context).toContain("CONTEXT.md");
|
|
89
93
|
});
|
|
90
94
|
|
|
91
95
|
it("#given compact SessionStart without prior PostCompact state #when context-pressure transcript is present #then emits emergency-sized context", async () => {
|
|
@@ -102,7 +106,8 @@ describe("codex rules compacted context recovery", () => {
|
|
|
102
106
|
// then
|
|
103
107
|
const context = readOptionalAdditionalContext(output);
|
|
104
108
|
expect(context.length).toBeLessThan(1_000);
|
|
105
|
-
expect(context).toContain("
|
|
109
|
+
expect(context).toContain("Instructions from:");
|
|
110
|
+
expect(context).toContain("CONTEXT.md");
|
|
106
111
|
});
|
|
107
112
|
|
|
108
113
|
it("#given malformed context-too-large transcript and empty session data #when compact source starts #then ignores malformed oversize markers safely", async () => {
|
|
@@ -123,7 +128,8 @@ describe("codex rules compacted context recovery", () => {
|
|
|
123
128
|
// then
|
|
124
129
|
const context = readOptionalAdditionalContext(output);
|
|
125
130
|
expect(context.length).toBeLessThan(1_000);
|
|
126
|
-
expect(context).toContain("
|
|
131
|
+
expect(context).toContain("Instructions from:");
|
|
132
|
+
expect(context).toContain("CONTEXT.md");
|
|
127
133
|
});
|
|
128
134
|
|
|
129
135
|
it("#given concurrent compact SessionStart triggers #when both recover context-too-large state #then deduplicates concurrent context-too-large recovery", async () => {
|
|
@@ -151,6 +157,7 @@ describe("codex rules compacted context recovery", () => {
|
|
|
151
157
|
const contexts = outputs.map(readOptionalAdditionalContext);
|
|
152
158
|
expect(contexts.filter((context) => context.length > 0)).toHaveLength(1);
|
|
153
159
|
expect(contexts.join("").length).toBeLessThan(1_000);
|
|
154
|
-
expect(contexts.join("")).toContain("
|
|
160
|
+
expect(contexts.join("")).toContain("Instructions from:");
|
|
161
|
+
expect(contexts.join("")).toContain("CONTEXT.md");
|
|
155
162
|
});
|
|
156
163
|
});
|
|
@@ -218,6 +218,9 @@ describe("codex rules hooks", () => {
|
|
|
218
218
|
const parsed = parseHookOutput(output);
|
|
219
219
|
expect(parsed.hookSpecificOutput?.hookEventName).toBe("SessionStart");
|
|
220
220
|
expect(parsed.hookSpecificOutput?.additionalContext).toContain("## Project Instructions");
|
|
221
|
+
expect(parsed.hookSpecificOutput?.additionalContext).toContain(
|
|
222
|
+
`Instructions from: ${path.join(root, "CONTEXT.md")}`,
|
|
223
|
+
);
|
|
221
224
|
expect(parsed.hookSpecificOutput?.additionalContext).toContain("Always wear safety goggles");
|
|
222
225
|
});
|
|
223
226
|
|
|
@@ -234,7 +237,9 @@ describe("codex rules hooks", () => {
|
|
|
234
237
|
const parsed = parseHookOutput(output);
|
|
235
238
|
expect(parsed.hookSpecificOutput?.additionalContext).toContain("## Project Instructions");
|
|
236
239
|
expect(parsed.hookSpecificOutput?.additionalContext).not.toContain("Project AGENTS.md should stay Codex-native.");
|
|
237
|
-
expect(parsed.hookSpecificOutput?.additionalContext).not.toContain(
|
|
240
|
+
expect(parsed.hookSpecificOutput?.additionalContext).not.toContain(
|
|
241
|
+
"Project CLAUDE.md should stay outside rules hook context.",
|
|
242
|
+
);
|
|
238
243
|
});
|
|
239
244
|
|
|
240
245
|
it("#given project AGENTS.md #when SessionStart runs #then rules hook leaves AGENTS.md to Codex native handling", async () => {
|
|
@@ -307,9 +312,10 @@ describe("codex rules hooks", () => {
|
|
|
307
312
|
|
|
308
313
|
// then
|
|
309
314
|
expect(resumeOutput).toBe("");
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
);
|
|
315
|
+
const clearContext = parseHookOutput(clearOutput).hookSpecificOutput?.additionalContext ?? "";
|
|
316
|
+
expect(clearContext).toContain("## Project Instructions");
|
|
317
|
+
expect(clearContext).toContain(`Instructions from: ${path.join(root, "CONTEXT.md")}`);
|
|
318
|
+
expect(clearContext).toContain("Always wear safety goggles");
|
|
313
319
|
});
|
|
314
320
|
|
|
315
321
|
it("#given static context remains in transcript but cache is missing #when SessionStart runs #then it emits no duplicate context", async () => {
|
|
@@ -8,8 +8,8 @@ import type { RuleCandidate } from "../src/rules/types.js";
|
|
|
8
8
|
|
|
9
9
|
const projectRoot = "/tmp/codex-rules-engine";
|
|
10
10
|
|
|
11
|
-
function makeCandidate(): RuleCandidate {
|
|
12
|
-
|
|
11
|
+
function makeCandidate(overrides: Partial<RuleCandidate> = {}): RuleCandidate {
|
|
12
|
+
const candidate = {
|
|
13
13
|
path: join(projectRoot, ".omo", "rules", "typescript.md"),
|
|
14
14
|
realPath: join(projectRoot, ".omo", "rules", "typescript.md"),
|
|
15
15
|
source: ".omo/rules",
|
|
@@ -17,7 +17,8 @@ function makeCandidate(): RuleCandidate {
|
|
|
17
17
|
isGlobal: false,
|
|
18
18
|
isSingleFile: false,
|
|
19
19
|
relativePath: ".omo/rules/typescript.md",
|
|
20
|
-
};
|
|
20
|
+
} satisfies RuleCandidate;
|
|
21
|
+
return { ...candidate, ...overrides };
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
describe("rule engine dynamic matching", () => {
|
|
@@ -242,3 +243,64 @@ describe("rule engine default source selection", () => {
|
|
|
242
243
|
expect(capturedDisabledSources?.has(".omo/rules")).toBe(true);
|
|
243
244
|
});
|
|
244
245
|
});
|
|
246
|
+
|
|
247
|
+
describe("rule engine static loading", () => {
|
|
248
|
+
it("#given multiple root single-file candidates #when loading static rules #then only one root single-file rule is selected", () => {
|
|
249
|
+
// given
|
|
250
|
+
const firstCandidate = makeCandidate({
|
|
251
|
+
path: join(projectRoot, "CONTEXT.md"),
|
|
252
|
+
realPath: join(projectRoot, "CONTEXT.md"),
|
|
253
|
+
source: "CONTEXT.md",
|
|
254
|
+
isSingleFile: true,
|
|
255
|
+
relativePath: "CONTEXT.md",
|
|
256
|
+
});
|
|
257
|
+
const secondCandidate = makeCandidate({
|
|
258
|
+
path: join(projectRoot, "nested", "CONTEXT.md"),
|
|
259
|
+
realPath: join(projectRoot, "nested", "CONTEXT.md"),
|
|
260
|
+
source: "CONTEXT.md",
|
|
261
|
+
isSingleFile: true,
|
|
262
|
+
relativePath: "nested/CONTEXT.md",
|
|
263
|
+
});
|
|
264
|
+
const deps = {
|
|
265
|
+
findProjectRoot: () => projectRoot,
|
|
266
|
+
findCandidates: () => [firstCandidate, secondCandidate],
|
|
267
|
+
readFile: () => "Shared project context.",
|
|
268
|
+
} satisfies EngineDeps;
|
|
269
|
+
const engine = createEngine(defaultConfig(), deps);
|
|
270
|
+
|
|
271
|
+
// when
|
|
272
|
+
const result = engine.loadStaticRules(projectRoot);
|
|
273
|
+
|
|
274
|
+
// then
|
|
275
|
+
expect(result.rules).toHaveLength(1);
|
|
276
|
+
expect(result.rules[0]?.matchReason).toBe("single-file");
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it("#given project candidate resolves outside project #when loading static rules #then the rule is skipped with a diagnostic", () => {
|
|
280
|
+
// given
|
|
281
|
+
const outsidePath = "/tmp/codex-rules-outside/.omo/rules/typescript.md";
|
|
282
|
+
const outsideCandidate = makeCandidate({
|
|
283
|
+
path: outsidePath,
|
|
284
|
+
realPath: outsidePath,
|
|
285
|
+
});
|
|
286
|
+
const deps = {
|
|
287
|
+
findProjectRoot: () => projectRoot,
|
|
288
|
+
findCandidates: () => [outsideCandidate],
|
|
289
|
+
readFile: () => "Should not be read.",
|
|
290
|
+
} satisfies EngineDeps;
|
|
291
|
+
const engine = createEngine(defaultConfig(), deps);
|
|
292
|
+
|
|
293
|
+
// when
|
|
294
|
+
const result = engine.loadStaticRules(projectRoot);
|
|
295
|
+
|
|
296
|
+
// then
|
|
297
|
+
expect(result.rules).toEqual([]);
|
|
298
|
+
expect(result.diagnostics).toEqual([
|
|
299
|
+
{
|
|
300
|
+
severity: "warning",
|
|
301
|
+
source: outsidePath,
|
|
302
|
+
message: "Rule file resolves outside project root",
|
|
303
|
+
},
|
|
304
|
+
]);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
@@ -42,7 +42,7 @@ describe("rules formatter hook context", () => {
|
|
|
42
42
|
);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
-
it("#given static rules #when formatting SessionStart context #then it
|
|
45
|
+
it("#given static rules #when formatting SessionStart context #then it injects rule bodies inline", () => {
|
|
46
46
|
// given
|
|
47
47
|
const rule = loadedRule({
|
|
48
48
|
path: "/repo/CONTEXT.md",
|
|
@@ -79,7 +79,7 @@ describe("rules formatter hook context", () => {
|
|
|
79
79
|
expect(block).not.toContain("\r");
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
it("#given duplicate static rules with different line endings #when formatting context #then it
|
|
82
|
+
it("#given duplicate static rules with different line endings #when formatting context #then it injects one copy", () => {
|
|
83
83
|
// given
|
|
84
84
|
const lfRule = loadedRule({
|
|
85
85
|
path: "/repo/CONTEXT.md",
|
|
@@ -96,10 +96,55 @@ describe("rules formatter hook context", () => {
|
|
|
96
96
|
const block = formatStaticBlock([lfRule, crlfRule], FORMAT_OPTIONS);
|
|
97
97
|
|
|
98
98
|
// then
|
|
99
|
+
expect(occurrenceCount(block, "Instructions from: /repo/CONTEXT.md")).toBe(1);
|
|
99
100
|
expect(occurrenceCount(block, "Shared rule\nKeep one copy.")).toBe(1);
|
|
100
101
|
expect(block).not.toContain("/repo/packages/CONTEXT.md");
|
|
101
102
|
});
|
|
102
103
|
|
|
104
|
+
it("#given a Hephaestus static rule #when formatting SessionStart context #then it injects its body before other rule bodies", () => {
|
|
105
|
+
// given
|
|
106
|
+
const rules = [
|
|
107
|
+
loadedRule({ path: "/repo/alpha.md", relativePath: "alpha.md", body: "Alpha guidance." }),
|
|
108
|
+
loadedRule({
|
|
109
|
+
path: "/repo/bundled-rules/hephaestus.md",
|
|
110
|
+
relativePath: "bundled-rules/hephaestus.md",
|
|
111
|
+
body: "Hephaestus guidance.",
|
|
112
|
+
}),
|
|
113
|
+
loadedRule({ path: "/repo/beta.md", relativePath: "beta.md", body: "Beta guidance." }),
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
// when
|
|
117
|
+
const block = formatStaticBlock(rules, FORMAT_OPTIONS);
|
|
118
|
+
|
|
119
|
+
// then
|
|
120
|
+
expect(block).toContain("Instructions from: /repo/bundled-rules/hephaestus.md");
|
|
121
|
+
expect(block).toContain("Hephaestus guidance.");
|
|
122
|
+
expect(block).toContain("Alpha guidance.");
|
|
123
|
+
expect(block).toContain("Beta guidance.");
|
|
124
|
+
expect(block.indexOf("Hephaestus guidance.")).toBeLessThan(block.indexOf("Alpha guidance."));
|
|
125
|
+
expect(block.indexOf("Alpha guidance.")).toBeLessThan(block.indexOf("Beta guidance."));
|
|
126
|
+
expect(block).not.toContain("must read project rules:");
|
|
127
|
+
expect(block).not.toContain("- [hephaestus.md]");
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("#given only a Hephaestus static rule #when formatting SessionStart context #then it emits no project rule link section", () => {
|
|
131
|
+
// given
|
|
132
|
+
const rule = loadedRule({
|
|
133
|
+
path: "/repo/bundled-rules/hephaestus.md",
|
|
134
|
+
relativePath: "bundled-rules/hephaestus.md",
|
|
135
|
+
body: "Hephaestus guidance.",
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// when
|
|
139
|
+
const block = formatStaticBlock([rule], FORMAT_OPTIONS);
|
|
140
|
+
|
|
141
|
+
// then
|
|
142
|
+
expect(block).toContain("Instructions from: /repo/bundled-rules/hephaestus.md");
|
|
143
|
+
expect(block).toContain("Hephaestus guidance.");
|
|
144
|
+
expect(block).not.toContain("- [hephaestus.md]");
|
|
145
|
+
expect(block).not.toContain("must read project rules:");
|
|
146
|
+
});
|
|
147
|
+
|
|
103
148
|
it("#given multiple oversized rules #when formatting under a tight result budget #then every rule receives a fair truncated share with a read-full guide", () => {
|
|
104
149
|
// given
|
|
105
150
|
const rules = [
|