oh-my-opencode 4.7.4 → 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 +4492 -2265
- 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 +16 -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 +52 -0
- 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 +26 -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 +173 -61
- 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 +204 -26
- 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
|
@@ -94,6 +94,151 @@ describe("extractCodexCommentCheckRequests", () => {
|
|
|
94
94
|
]);
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
+
it("#given apply_patch metadata files #when extracting #then metadata takes priority over raw patch text", () => {
|
|
98
|
+
const requests = extractCodexCommentCheckRequests(
|
|
99
|
+
postToolUseInput({
|
|
100
|
+
tool_input: {
|
|
101
|
+
command: [
|
|
102
|
+
"*** Begin Patch",
|
|
103
|
+
"*** Update File: src/raw.ts",
|
|
104
|
+
"@@",
|
|
105
|
+
"-const raw = 1;",
|
|
106
|
+
"+const raw = 2;",
|
|
107
|
+
"*** End Patch",
|
|
108
|
+
].join("\n"),
|
|
109
|
+
},
|
|
110
|
+
tool_response: {
|
|
111
|
+
files: [
|
|
112
|
+
{
|
|
113
|
+
filePath: "src/new.ts",
|
|
114
|
+
before: "",
|
|
115
|
+
after: "// explains new\nconst value = 1;\n",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
file_path: "src/old.ts",
|
|
119
|
+
move_path: "src/moved.ts",
|
|
120
|
+
old: "const value = 1;\n",
|
|
121
|
+
new: "// explains moved\nconst value = 2;\n",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
path: "src/deleted.ts",
|
|
125
|
+
before: "const deleted = true;\n",
|
|
126
|
+
after: "",
|
|
127
|
+
type: "delete",
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
}),
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect(requests).toEqual([
|
|
135
|
+
{
|
|
136
|
+
sourceToolName: "apply_patch",
|
|
137
|
+
toolName: "Write",
|
|
138
|
+
filePath: "src/new.ts",
|
|
139
|
+
toolInput: {
|
|
140
|
+
file_path: "src/new.ts",
|
|
141
|
+
content: "// explains new\nconst value = 1;\n",
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
sourceToolName: "apply_patch",
|
|
146
|
+
toolName: "Edit",
|
|
147
|
+
filePath: "src/moved.ts",
|
|
148
|
+
toolInput: {
|
|
149
|
+
file_path: "src/moved.ts",
|
|
150
|
+
old_string: "const value = 1;\n",
|
|
151
|
+
new_string: "// explains moved\nconst value = 2;\n",
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
]);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("#given nested apply_patch metadata #when extracting #then result and metadata containers are supported", () => {
|
|
158
|
+
const resultRequests = extractCodexCommentCheckRequests(
|
|
159
|
+
postToolUseInput({
|
|
160
|
+
tool_response: {
|
|
161
|
+
result: {
|
|
162
|
+
files: [{ filePath: "src/result.ts", before: "", after: "const result = true;\n" }],
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
}),
|
|
166
|
+
);
|
|
167
|
+
const metadataRequests = extractCodexCommentCheckRequests(
|
|
168
|
+
postToolUseInput({
|
|
169
|
+
tool_response: {
|
|
170
|
+
metadata: {
|
|
171
|
+
files: [{ filePath: "src/metadata.ts", before: "", after: "const metadata = true;\n" }],
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
}),
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
expect(resultRequests[0]?.filePath).toBe("src/result.ts");
|
|
178
|
+
expect(metadataRequests[0]?.filePath).toBe("src/metadata.ts");
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("#given apply_patch add move and delete hunks #when extracting from raw patch #then add and move are checked while delete is ignored", () => {
|
|
182
|
+
const requests = extractCodexCommentCheckRequests(
|
|
183
|
+
postToolUseInput({
|
|
184
|
+
tool_input: {
|
|
185
|
+
command: [
|
|
186
|
+
"*** Begin Patch",
|
|
187
|
+
"*** Add File: src/added.ts",
|
|
188
|
+
"+// explains add",
|
|
189
|
+
"+const added = true;",
|
|
190
|
+
"*** Update File: src/original.ts",
|
|
191
|
+
"*** Move to: src/renamed.ts",
|
|
192
|
+
"@@",
|
|
193
|
+
"-const original = true;",
|
|
194
|
+
"+// explains rename",
|
|
195
|
+
"+const renamed = true;",
|
|
196
|
+
"*** Delete File: src/deleted.ts",
|
|
197
|
+
"*** End Patch",
|
|
198
|
+
].join("\n"),
|
|
199
|
+
},
|
|
200
|
+
}),
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
expect(requests).toEqual([
|
|
204
|
+
{
|
|
205
|
+
sourceToolName: "apply_patch",
|
|
206
|
+
toolName: "Write",
|
|
207
|
+
filePath: "src/added.ts",
|
|
208
|
+
toolInput: {
|
|
209
|
+
file_path: "src/added.ts",
|
|
210
|
+
content: "// explains add\nconst added = true;\n",
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
sourceToolName: "apply_patch",
|
|
215
|
+
toolName: "Edit",
|
|
216
|
+
filePath: "src/renamed.ts",
|
|
217
|
+
toolInput: {
|
|
218
|
+
file_path: "src/renamed.ts",
|
|
219
|
+
old_string: "const original = true;\n",
|
|
220
|
+
new_string: "// explains rename\nconst renamed = true;\n",
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
]);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it("#given failed tool response #when extracting #then no comment-check request is emitted", () => {
|
|
227
|
+
const textFailureRequests = extractCodexCommentCheckRequests(
|
|
228
|
+
postToolUseInput({
|
|
229
|
+
tool_response: "failed to apply patch",
|
|
230
|
+
}),
|
|
231
|
+
);
|
|
232
|
+
const structuredFailureRequests = extractCodexCommentCheckRequests(
|
|
233
|
+
postToolUseInput({
|
|
234
|
+
tool_response: { is_error: true, text: "Success. Updated files." },
|
|
235
|
+
}),
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
expect(textFailureRequests).toEqual([]);
|
|
239
|
+
expect(structuredFailureRequests).toEqual([]);
|
|
240
|
+
});
|
|
241
|
+
|
|
97
242
|
it("#given unsupported post tool event #when extracting #then returns no requests", () => {
|
|
98
243
|
const requests = extractCodexCommentCheckRequests(
|
|
99
244
|
postToolUseInput({
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import type { CheckerEdit, CheckerToolInput, CommentCheckRequest, ToolResultLike } from "../src/core.ts";
|
|
3
|
+
import { extractCommentCheckRequests, parseApplyPatchRequests, toHookInput } from "../src/core.ts";
|
|
4
|
+
|
|
5
|
+
describe("extractCommentCheckRequests", () => {
|
|
6
|
+
it("#given apply_patch metadata files #when extracting #then supports direct result and metadata shapes", () => {
|
|
7
|
+
// given
|
|
8
|
+
const directEvent = applyPatchEvent({
|
|
9
|
+
files: [{ filePath: "src/direct.ts", before: "", after: "// explains direct\nconst direct = true;\n" }],
|
|
10
|
+
});
|
|
11
|
+
const resultEvent = applyPatchEvent({
|
|
12
|
+
result: {
|
|
13
|
+
files: [{ file_path: "src/result.ts", old: "const result = false;\n", new: "const result = true;\n" }],
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
const metadataEvent = applyPatchEvent({
|
|
17
|
+
metadata: {
|
|
18
|
+
files: [{ path: "src/metadata.ts", before: "", after: "// explains metadata\nconst metadata = true;\n" }],
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// when
|
|
23
|
+
const directRequests = extractCommentCheckRequests(directEvent);
|
|
24
|
+
const resultRequests = extractCommentCheckRequests(resultEvent);
|
|
25
|
+
const metadataRequests = extractCommentCheckRequests(metadataEvent);
|
|
26
|
+
|
|
27
|
+
// then
|
|
28
|
+
expect(directRequests[0]?.filePath).toBe("src/direct.ts");
|
|
29
|
+
expect(resultRequests[0]).toEqual({
|
|
30
|
+
sourceToolName: "apply_patch",
|
|
31
|
+
toolName: "Edit",
|
|
32
|
+
filePath: "src/result.ts",
|
|
33
|
+
toolInput: {
|
|
34
|
+
file_path: "src/result.ts",
|
|
35
|
+
old_string: "const result = false;\n",
|
|
36
|
+
new_string: "const result = true;\n",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
expect(metadataRequests[0]?.toolName).toBe("Write");
|
|
40
|
+
expect(metadataRequests[0]?.filePath).toBe("src/metadata.ts");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("#given apply_patch add move and delete hunks #when extracting from raw patch #then add and move are checked while delete is ignored", () => {
|
|
44
|
+
// given
|
|
45
|
+
const patch = [
|
|
46
|
+
"*** Begin Patch",
|
|
47
|
+
"*** Add File: src/added.ts",
|
|
48
|
+
"+// explains add",
|
|
49
|
+
"+const added = true;",
|
|
50
|
+
"*** Update File: src/original.ts",
|
|
51
|
+
"*** Move to: src/renamed.ts",
|
|
52
|
+
"@@",
|
|
53
|
+
"-const original = true;",
|
|
54
|
+
"+// explains rename",
|
|
55
|
+
"+const renamed = true;",
|
|
56
|
+
"*** Delete File: src/deleted.ts",
|
|
57
|
+
"*** End Patch",
|
|
58
|
+
].join("\n");
|
|
59
|
+
|
|
60
|
+
// when
|
|
61
|
+
const requests = parseApplyPatchRequests(patch, "apply_patch");
|
|
62
|
+
|
|
63
|
+
// then
|
|
64
|
+
expect(requests).toEqual([
|
|
65
|
+
{
|
|
66
|
+
sourceToolName: "apply_patch",
|
|
67
|
+
toolName: "Write",
|
|
68
|
+
filePath: "src/added.ts",
|
|
69
|
+
toolInput: {
|
|
70
|
+
file_path: "src/added.ts",
|
|
71
|
+
content: "// explains add\nconst added = true;\n",
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
sourceToolName: "apply_patch",
|
|
76
|
+
toolName: "Edit",
|
|
77
|
+
filePath: "src/renamed.ts",
|
|
78
|
+
toolInput: {
|
|
79
|
+
file_path: "src/renamed.ts",
|
|
80
|
+
old_string: "const original = true;\n",
|
|
81
|
+
new_string: "// explains rename\nconst renamed = true;\n",
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("#given failed tool output #when extracting #then text and isError failures emit no requests", () => {
|
|
88
|
+
// given
|
|
89
|
+
const textFailure = applyPatchEvent(undefined, {
|
|
90
|
+
content: [{ type: "text", text: "Error: failed to apply patch" }],
|
|
91
|
+
});
|
|
92
|
+
const structuredFailure = applyPatchEvent(undefined, {
|
|
93
|
+
content: [{ type: "text", text: "Success. Updated files." }],
|
|
94
|
+
isError: true,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// when
|
|
98
|
+
const textRequests = extractCommentCheckRequests(textFailure);
|
|
99
|
+
const structuredRequests = extractCommentCheckRequests(structuredFailure);
|
|
100
|
+
|
|
101
|
+
// then
|
|
102
|
+
expect(textRequests).toEqual([]);
|
|
103
|
+
expect(structuredRequests).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe("toHookInput", () => {
|
|
108
|
+
it("#given comment check request #when converting #then emits stable hook input contract", () => {
|
|
109
|
+
// given
|
|
110
|
+
const request: CommentCheckRequest = {
|
|
111
|
+
sourceToolName: "write",
|
|
112
|
+
toolName: "Write",
|
|
113
|
+
filePath: "src/example.ts",
|
|
114
|
+
toolInput: {
|
|
115
|
+
file_path: "src/example.ts",
|
|
116
|
+
content: "// explains value\nconst value = 1;\n",
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// when
|
|
121
|
+
const input = toHookInput(request, {
|
|
122
|
+
sessionId: "session-1",
|
|
123
|
+
cwd: "/repo",
|
|
124
|
+
transcriptPath: "/tmp/transcript.jsonl",
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// then
|
|
128
|
+
expect(input).toEqual({
|
|
129
|
+
session_id: "session-1",
|
|
130
|
+
tool_name: "Write",
|
|
131
|
+
transcript_path: "/tmp/transcript.jsonl",
|
|
132
|
+
cwd: "/repo",
|
|
133
|
+
hook_event_name: "PostToolUse",
|
|
134
|
+
tool_input: request.toolInput,
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe("public contract mutability", () => {
|
|
140
|
+
it("#given exported core types #when consumers mutate fields #then the compatibility contract is preserved", () => {
|
|
141
|
+
// given
|
|
142
|
+
const edit: CheckerEdit = {
|
|
143
|
+
old_string: "const value = 1;\n",
|
|
144
|
+
new_string: "const value = 2;\n",
|
|
145
|
+
};
|
|
146
|
+
const toolInput: CheckerToolInput = {
|
|
147
|
+
file_path: "src/example.ts",
|
|
148
|
+
edits: [edit],
|
|
149
|
+
};
|
|
150
|
+
const request: CommentCheckRequest = {
|
|
151
|
+
sourceToolName: "multi_edit",
|
|
152
|
+
toolName: "MultiEdit",
|
|
153
|
+
filePath: "src/example.ts",
|
|
154
|
+
toolInput,
|
|
155
|
+
};
|
|
156
|
+
const event: ToolResultLike = {
|
|
157
|
+
toolName: "write",
|
|
158
|
+
input: {},
|
|
159
|
+
content: [{ type: "text", text: "ok" }],
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// when
|
|
163
|
+
edit.new_string = "const value = 3;\n";
|
|
164
|
+
toolInput.file_path = "src/renamed.ts";
|
|
165
|
+
toolInput.edits?.push({
|
|
166
|
+
old_string: "const other = 1;\n",
|
|
167
|
+
new_string: "const other = 2;\n",
|
|
168
|
+
});
|
|
169
|
+
request.filePath = "src/renamed.ts";
|
|
170
|
+
event.toolName = "edit";
|
|
171
|
+
event.content?.push({ type: "text", text: "still ok" });
|
|
172
|
+
|
|
173
|
+
// then
|
|
174
|
+
expect(request.filePath).toBe("src/renamed.ts");
|
|
175
|
+
expect(request.toolInput.edits).toHaveLength(2);
|
|
176
|
+
expect(event.toolName).toBe("edit");
|
|
177
|
+
expect(event.content).toEqual([
|
|
178
|
+
{ type: "text", text: "ok" },
|
|
179
|
+
{ type: "text", text: "still ok" },
|
|
180
|
+
]);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
function applyPatchEvent(details: unknown, overrides: Partial<ToolResultLike> = {}): ToolResultLike {
|
|
185
|
+
return {
|
|
186
|
+
toolName: "apply_patch",
|
|
187
|
+
input: {
|
|
188
|
+
command: [
|
|
189
|
+
"*** Begin Patch",
|
|
190
|
+
"*** Update File: src/raw.ts",
|
|
191
|
+
"@@",
|
|
192
|
+
"-const raw = false;",
|
|
193
|
+
"+const raw = true;",
|
|
194
|
+
"*** End Patch",
|
|
195
|
+
].join("\n"),
|
|
196
|
+
},
|
|
197
|
+
...(details === undefined ? {} : { details }),
|
|
198
|
+
...overrides,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
## 0.2.0
|
|
8
8
|
|
|
9
9
|
- Extracted the LSP runtime and MCP server into [`@code-yeongyu/lsp-tools-mcp`](https://github.com/code-yeongyu/lsp-tools-mcp).
|
|
10
|
-
- codex-lsp now consumes that runtime
|
|
10
|
+
- codex-lsp now consumes that runtime from the repository-level `packages/lsp-tools-mcp` package.
|
|
11
11
|
- Kept the Codex-specific PostToolUse hook in this package and routed MCP serving through the upstream CLI.
|
|
12
12
|
|
|
13
|
-
- Extract LSP runtime to `lsp-tools-mcp` upstream and consume it via
|
|
13
|
+
- Extract LSP runtime to `lsp-tools-mcp` upstream and consume it via the repository-level `packages/lsp-tools-mcp` package.
|
|
14
14
|
- Renamed the MCP server namespace to `lsp` and exposed shorter tool names such as `lsp.diagnostics`.
|
|
15
15
|
- Use portable Codex hook interpolation and add package smoke coverage for hook/MCP entrypoints.
|
|
16
16
|
- Spawn language servers without shell mode; Windows `.cmd` and `.bat` shims are routed through `cmd.exe` with explicit arguments.
|
|
@@ -79,14 +79,14 @@ omo-codex bundles three read-only Codex subagent roles in `CODEX_HOME/agents/`:
|
|
|
79
79
|
|
|
80
80
|
**Routing:**
|
|
81
81
|
|
|
82
|
-
- "Where is X?" / "Find code that does Y" -> `spawn_agent(
|
|
83
|
-
- "How does library Z work?" / "What's the API contract?" -> `spawn_agent(
|
|
84
|
-
- 5+ interdependent steps, ambiguous scope, multi-module work -> `spawn_agent(
|
|
85
|
-
- Heavy verification of a finished change -> `spawn_agent(
|
|
82
|
+
- "Where is X?" / "Find code that does Y" -> `spawn_agent({"task_name":"...","message":"TASK: act as an explorer. ...","fork_turns":"none"})`
|
|
83
|
+
- "How does library Z work?" / "What's the API contract?" -> `spawn_agent({"task_name":"...","message":"TASK: act as a librarian. ...","fork_turns":"none"})`
|
|
84
|
+
- 5+ interdependent steps, ambiguous scope, multi-module work -> `spawn_agent({"task_name":"...","message":"TASK: act as a planning agent. ...","fork_turns":"none"})`
|
|
85
|
+
- Heavy verification of a finished change -> `spawn_agent({"task_name":"...","message":"TASK: act as a rigorous reviewer. ...","fork_turns":"none"})`
|
|
86
86
|
|
|
87
87
|
**Don't duplicate.** Once a subagent is dispatched for a question, do not re-do the same search yourself. Once results return, do not re-verify by repeating their tool calls; integrate and move on.
|
|
88
88
|
|
|
89
|
-
**Keep parent liveness visible.** While any child is active, keep the parent visibly alive with brief status updates that include active subagent count, agent names,
|
|
89
|
+
**Keep parent liveness visible.** While any child is active, keep the parent visibly alive with brief status updates that include active subagent count, agent names, latest `WORKING:` phase, and whether the parent is waiting for mailbox updates. Do this during long `wait_agent` cycles so the session does not look idle while children are still running.
|
|
90
90
|
|
|
91
91
|
# Operating Loop
|
|
92
92
|
|
|
@@ -110,6 +110,12 @@ LSP diagnostics catch type errors, not logic bugs; tests cover only what their a
|
|
|
110
110
|
|
|
111
111
|
Reading the source and concluding "this should work" does not pass this gate. If usage reveals a defect, that defect is yours to fix in this turn - same turn, not "follow-up".
|
|
112
112
|
|
|
113
|
+
# Global Review and Debugging Gate
|
|
114
|
+
|
|
115
|
+
For significant implementation work and every PR handoff, run `review-work` plus a `debugging` runtime audit before declaring completion. Timeout, missing deliverable, ack-only, `BLOCKED:`, and inconclusive review lanes fail the gate. Record at least three debugging hypotheses and the runtime evidence that confirms or refutes each one.
|
|
116
|
+
|
|
117
|
+
Do not print completion, create a PR, produce a PR handoff, or produce a branch handoff until the gate passes. Always redact secrets, tokens, credentials, auth headers, cookies, env dumps, private logs, and PII from ledgers, PR bodies, and handoffs.
|
|
118
|
+
|
|
113
119
|
# Failure Recovery
|
|
114
120
|
|
|
115
121
|
If your first approach fails, try a materially different one - different algorithm, library, or pattern, not a small tweak. Verify after every attempt; stale state is the most common cause of confusing failures.
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export type ContextInjectionHookEventName = "SessionStart" | "UserPromptSubmit" | "PostToolUse";
|
|
2
2
|
|
|
3
|
+
const MAX_ADDITIONAL_CONTEXT_CHARS = 32_000;
|
|
4
|
+
|
|
3
5
|
export function formatAdditionalContextOutput(
|
|
4
6
|
eventName: ContextInjectionHookEventName,
|
|
5
7
|
additionalContext: string,
|
|
6
8
|
): string {
|
|
7
|
-
const normalizedContext = normalizeAdditionalContext(additionalContext);
|
|
9
|
+
const normalizedContext = limitAdditionalContext(normalizeAdditionalContext(additionalContext));
|
|
8
10
|
if (normalizedContext.length === 0) return "";
|
|
9
11
|
return `${JSON.stringify({
|
|
10
12
|
hookSpecificOutput: {
|
|
@@ -17,3 +19,11 @@ export function formatAdditionalContextOutput(
|
|
|
17
19
|
function normalizeAdditionalContext(additionalContext: string): string {
|
|
18
20
|
return additionalContext.replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim();
|
|
19
21
|
}
|
|
22
|
+
|
|
23
|
+
function limitAdditionalContext(additionalContext: string): string {
|
|
24
|
+
if (additionalContext.length <= MAX_ADDITIONAL_CONTEXT_CHARS) return additionalContext;
|
|
25
|
+
const marker = `\n\n[Truncated hook additional context to ${MAX_ADDITIONAL_CONTEXT_CHARS} chars to avoid Codex context overflow.]`;
|
|
26
|
+
if (marker.length >= MAX_ADDITIONAL_CONTEXT_CHARS) return marker.slice(0, MAX_ADDITIONAL_CONTEXT_CHARS);
|
|
27
|
+
const head = additionalContext.slice(0, MAX_ADDITIONAL_CONTEXT_CHARS - marker.length).replace(/[ \t\r\n]+$/, "");
|
|
28
|
+
return `${head}${marker}`;
|
|
29
|
+
}
|
|
@@ -22,7 +22,6 @@ const POST_COMPACT_MIN_GUIDE_CHARS = 500;
|
|
|
22
22
|
const FALLBACK_CONTEXT_WINDOW_TOKENS = 200_000;
|
|
23
23
|
const MODEL_CONTEXT_BUDGETS: readonly ModelContextBudget[] = [
|
|
24
24
|
{ slug: "gpt-5.5", contextWindowTokens: 272_000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
|
|
25
|
-
{ slug: "gpt-5.4", contextWindowTokens: 272_000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
|
|
26
25
|
{ slug: "gpt-5.4-mini", contextWindowTokens: 272_000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
|
|
27
26
|
{
|
|
28
27
|
slug: "codex-auto-review",
|
|
@@ -28,10 +28,7 @@ export const PROJECT_RULE_SUBDIRS: ReadonlyArray<readonly [string, string]> = [
|
|
|
28
28
|
/**
|
|
29
29
|
* Single-file project rules (always apply, frontmatter optional).
|
|
30
30
|
*/
|
|
31
|
-
export const PROJECT_SINGLE_FILES: readonly string[] = [
|
|
32
|
-
".github/copilot-instructions.md",
|
|
33
|
-
"CONTEXT.md",
|
|
34
|
-
];
|
|
31
|
+
export const PROJECT_SINGLE_FILES: readonly string[] = [".github/copilot-instructions.md", "CONTEXT.md"];
|
|
35
32
|
|
|
36
33
|
/**
|
|
37
34
|
* User-home rule directories.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { pathBasesForTarget, toPosixPath } from "./engine-paths.js";
|
|
3
|
+
import type { CandidateDiscoveryCache, DynamicMatchCache, EngineDeps } from "./engine-types.js";
|
|
4
|
+
import type { matchRule } from "./matcher.js";
|
|
5
|
+
import { sortCandidates } from "./ordering.js";
|
|
6
|
+
import type { LoadedRule, MatchReason, RuleCandidate } from "./types.js";
|
|
7
|
+
|
|
8
|
+
const MAX_DYNAMIC_MATCH_CACHE_ENTRIES = 4096;
|
|
9
|
+
|
|
10
|
+
export function matchDynamicRuleCached(
|
|
11
|
+
cache: DynamicMatchCache,
|
|
12
|
+
projectRoot: string | null,
|
|
13
|
+
targetFile: string,
|
|
14
|
+
candidate: RuleCandidate,
|
|
15
|
+
loadedRule: LoadedRule,
|
|
16
|
+
matchRuleImpl: typeof matchRule,
|
|
17
|
+
): MatchReason | null {
|
|
18
|
+
const cacheKey = dynamicMatchCacheKey(projectRoot, targetFile, candidate, loadedRule.contentHash);
|
|
19
|
+
if (cache.has(cacheKey)) {
|
|
20
|
+
const cachedReason = cache.get(cacheKey) ?? null;
|
|
21
|
+
cache.delete(cacheKey);
|
|
22
|
+
cache.set(cacheKey, cachedReason);
|
|
23
|
+
return cachedReason;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const matchResult = matchRuleImpl({
|
|
27
|
+
frontmatter: loadedRule.frontmatter,
|
|
28
|
+
isSingleFile: candidate.isSingleFile,
|
|
29
|
+
pathBases: pathBasesForTarget(projectRoot, targetFile, candidate),
|
|
30
|
+
});
|
|
31
|
+
const reason = matchResult.matched ? matchResult.reason : null;
|
|
32
|
+
setDynamicMatchCacheEntry(cache, cacheKey, reason);
|
|
33
|
+
return reason;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function findSortedCandidatesCached(
|
|
37
|
+
cache: CandidateDiscoveryCache,
|
|
38
|
+
findCandidates: EngineDeps["findCandidates"],
|
|
39
|
+
options: Parameters<EngineDeps["findCandidates"]>[0],
|
|
40
|
+
): RuleCandidate[] {
|
|
41
|
+
const cacheKey = candidateDiscoveryCacheKey(options);
|
|
42
|
+
const cached = cache.get(cacheKey);
|
|
43
|
+
if (cached !== undefined) {
|
|
44
|
+
return cached;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const candidates = sortCandidates(findCandidates(options));
|
|
48
|
+
cache.set(cacheKey, candidates);
|
|
49
|
+
return candidates;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function setDynamicMatchCacheEntry(cache: DynamicMatchCache, cacheKey: string, reason: MatchReason | null): void {
|
|
53
|
+
if (cache.size >= MAX_DYNAMIC_MATCH_CACHE_ENTRIES) {
|
|
54
|
+
const oldestCacheKey = cache.keys().next().value;
|
|
55
|
+
if (oldestCacheKey !== undefined) {
|
|
56
|
+
cache.delete(oldestCacheKey);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
cache.set(cacheKey, reason);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function dynamicMatchCacheKey(
|
|
63
|
+
projectRoot: string | null,
|
|
64
|
+
targetFile: string,
|
|
65
|
+
candidate: RuleCandidate,
|
|
66
|
+
contentHash: string,
|
|
67
|
+
): string {
|
|
68
|
+
return [
|
|
69
|
+
projectRoot ?? "",
|
|
70
|
+
toPosixPath(resolve(targetFile)),
|
|
71
|
+
candidate.realPath,
|
|
72
|
+
candidate.relativePath,
|
|
73
|
+
candidate.source,
|
|
74
|
+
candidate.isGlobal ? "global" : "project",
|
|
75
|
+
candidate.isSingleFile ? "single" : "multi",
|
|
76
|
+
String(candidate.distance),
|
|
77
|
+
contentHash,
|
|
78
|
+
].join("\0");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function candidateDiscoveryCacheKey(options: Parameters<EngineDeps["findCandidates"]>[0]): string {
|
|
82
|
+
return [
|
|
83
|
+
options.projectRoot ?? "",
|
|
84
|
+
options.targetFile === null ? "" : dirname(resolve(options.targetFile)),
|
|
85
|
+
...[...(options.disabledSources ?? [])].sort(),
|
|
86
|
+
].join("\0");
|
|
87
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { findSortedCandidatesCached, matchDynamicRuleCached } from "./engine-dynamic-cache.js";
|
|
2
|
+
import { loadCandidate, ruleDedupKey } from "./engine-loader.js";
|
|
3
|
+
import { isSameOrChildPath } from "./engine-paths.js";
|
|
4
|
+
import type { CandidateDiscoveryCache, DynamicMatchCache, EngineDeps, LoadedRuleContent } from "./engine-types.js";
|
|
5
|
+
import { createRuleDiscoveryCache } from "./finder.js";
|
|
6
|
+
import { matchRule } from "./matcher.js";
|
|
7
|
+
import { sortCandidates } from "./ordering.js";
|
|
8
|
+
import { disabledSourcesFromConfig } from "./sources.js";
|
|
9
|
+
import type { LoadedRule, PiRulesConfig, RuleDiagnostic } from "./types.js";
|
|
10
|
+
|
|
11
|
+
export function loadDynamicCandidates(
|
|
12
|
+
config: PiRulesConfig,
|
|
13
|
+
deps: EngineDeps,
|
|
14
|
+
cwd: string,
|
|
15
|
+
targetPaths: ReadonlyArray<string>,
|
|
16
|
+
dynamicMatchCache: DynamicMatchCache,
|
|
17
|
+
): { rules: LoadedRule[]; diagnostics: RuleDiagnostic[] } {
|
|
18
|
+
const rules: LoadedRule[] = [];
|
|
19
|
+
const diagnostics: RuleDiagnostic[] = [];
|
|
20
|
+
const seenRules = new Set<string>();
|
|
21
|
+
const loadedRuleContent = new Map<string, LoadedRuleContent | null>();
|
|
22
|
+
const projectMembership = new Map<string, boolean>();
|
|
23
|
+
const disabledSources = disabledSourcesFromConfig(config);
|
|
24
|
+
const discoveryCache = createRuleDiscoveryCache();
|
|
25
|
+
const candidateDiscoveryCache: CandidateDiscoveryCache = new Map();
|
|
26
|
+
const cwdProjectRoot = deps.findProjectRoot(cwd);
|
|
27
|
+
|
|
28
|
+
for (const targetFile of uniqueStrings(targetPaths)) {
|
|
29
|
+
const projectRoot =
|
|
30
|
+
cwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot)
|
|
31
|
+
? cwdProjectRoot
|
|
32
|
+
: deps.findProjectRoot(targetFile);
|
|
33
|
+
const findOptions: Parameters<EngineDeps["findCandidates"]>[0] = {
|
|
34
|
+
projectRoot,
|
|
35
|
+
targetFile,
|
|
36
|
+
cache: discoveryCache,
|
|
37
|
+
};
|
|
38
|
+
if (disabledSources !== undefined) {
|
|
39
|
+
findOptions.disabledSources = disabledSources;
|
|
40
|
+
}
|
|
41
|
+
const candidates = findSortedCandidatesCached(candidateDiscoveryCache, deps.findCandidates, findOptions);
|
|
42
|
+
|
|
43
|
+
for (const candidate of candidates) {
|
|
44
|
+
const loadedRule = loadCandidate(
|
|
45
|
+
candidate,
|
|
46
|
+
deps,
|
|
47
|
+
diagnostics,
|
|
48
|
+
projectRoot,
|
|
49
|
+
loadedRuleContent,
|
|
50
|
+
projectMembership,
|
|
51
|
+
);
|
|
52
|
+
if (loadedRule === null) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const matchReason = matchDynamicRuleCached(
|
|
57
|
+
dynamicMatchCache,
|
|
58
|
+
projectRoot,
|
|
59
|
+
targetFile,
|
|
60
|
+
candidate,
|
|
61
|
+
loadedRule,
|
|
62
|
+
deps.matchRule ?? matchRule,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
if (matchReason === null) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const dedupKey = ruleDedupKey(loadedRule);
|
|
70
|
+
if (seenRules.has(dedupKey)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
seenRules.add(dedupKey);
|
|
75
|
+
rules.push({ ...loadedRule, matchReason });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return { rules: sortCandidates(rules), diagnostics };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function uniqueStrings(values: ReadonlyArray<string>): string[] {
|
|
83
|
+
const uniqueValues: string[] = [];
|
|
84
|
+
const seenValues = new Set<string>();
|
|
85
|
+
for (const value of values) {
|
|
86
|
+
if (seenValues.has(value)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
seenValues.add(value);
|
|
91
|
+
uniqueValues.push(value);
|
|
92
|
+
}
|
|
93
|
+
return uniqueValues;
|
|
94
|
+
}
|