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
|
@@ -26,6 +26,22 @@ describe("formatAdditionalContextOutput", () => {
|
|
|
26
26
|
// then
|
|
27
27
|
expect(output).toBe("");
|
|
28
28
|
});
|
|
29
|
+
|
|
30
|
+
it("#given oversized context #when serializing hook JSON #then it keeps additional context under the safety cap", () => {
|
|
31
|
+
// given
|
|
32
|
+
const context = `first\n${"x".repeat(50_000)}\nlast`;
|
|
33
|
+
|
|
34
|
+
// when
|
|
35
|
+
const output = formatAdditionalContextOutput("SessionStart", context);
|
|
36
|
+
const parsed: unknown = JSON.parse(output);
|
|
37
|
+
const additionalContext = readAdditionalContext(parsed);
|
|
38
|
+
|
|
39
|
+
// then
|
|
40
|
+
expect(additionalContext.length).toBeLessThanOrEqual(32_000);
|
|
41
|
+
expect(additionalContext).toContain("first");
|
|
42
|
+
expect(additionalContext).not.toContain("last");
|
|
43
|
+
expect(additionalContext).toContain("[Truncated hook additional context to 32000 chars");
|
|
44
|
+
});
|
|
29
45
|
});
|
|
30
46
|
|
|
31
47
|
function readAdditionalContext(value: unknown): string {
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { parseRule } from "../src/rules/parser.js";
|
|
4
|
+
|
|
5
|
+
describe("parseRule", () => {
|
|
6
|
+
it("#given content without frontmatter #when parsing #then body is preserved", () => {
|
|
7
|
+
// given
|
|
8
|
+
const content = "Prefer strict TypeScript.\n---\nThis is body content.";
|
|
9
|
+
|
|
10
|
+
// when
|
|
11
|
+
const parsed = parseRule(content);
|
|
12
|
+
|
|
13
|
+
// then
|
|
14
|
+
expect(parsed).toEqual({
|
|
15
|
+
frontmatter: {},
|
|
16
|
+
body: content,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("#given bom and crlf frontmatter #when parsing #then delimiters are removed", () => {
|
|
21
|
+
// given
|
|
22
|
+
const content = "\uFEFF---\r\ndescription: Windows rule\r\nalwaysApply: true\r\n---\r\nUse Git Bash.\r\n";
|
|
23
|
+
|
|
24
|
+
// when
|
|
25
|
+
const parsed = parseRule(content);
|
|
26
|
+
|
|
27
|
+
// then
|
|
28
|
+
expect(parsed).toEqual({
|
|
29
|
+
frontmatter: {
|
|
30
|
+
description: "Windows rule",
|
|
31
|
+
alwaysApply: true,
|
|
32
|
+
},
|
|
33
|
+
body: "Use Git Bash.\r\n",
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("#given missing closing delimiter #when parsing #then original markdown is salvaged with diagnostic", () => {
|
|
38
|
+
// given
|
|
39
|
+
const content = ["---", "description: Missing close", "", "Keep this content."].join("\n");
|
|
40
|
+
|
|
41
|
+
// when
|
|
42
|
+
const parsed = parseRule(content);
|
|
43
|
+
|
|
44
|
+
// then
|
|
45
|
+
expect(parsed).toEqual({
|
|
46
|
+
frontmatter: {},
|
|
47
|
+
body: content,
|
|
48
|
+
diagnostic: "Missing closing frontmatter delimiter",
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("#given malformed yaml subset #when parsing #then original markdown is salvaged with diagnostic", () => {
|
|
53
|
+
// given
|
|
54
|
+
const content = ["---", "alwaysApply: maybe", "---", "", "Keep this content."].join("\n");
|
|
55
|
+
|
|
56
|
+
// when
|
|
57
|
+
const parsed = parseRule(content);
|
|
58
|
+
|
|
59
|
+
// then
|
|
60
|
+
expect(parsed.frontmatter).toEqual({});
|
|
61
|
+
expect(parsed.body).toBe(content);
|
|
62
|
+
expect(parsed.diagnostic).toBe("Malformed frontmatter: Expected boolean on line 1");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("#given quoted hashes and inline quoted commas #when parsing #then comments and commas are handled by quote context", () => {
|
|
66
|
+
// given
|
|
67
|
+
const content = [
|
|
68
|
+
"---",
|
|
69
|
+
'description: "Rule #1" # trailing comment',
|
|
70
|
+
'globs: ["src/a,b.ts", "docs/#guide.md"] # trailing comment',
|
|
71
|
+
"---",
|
|
72
|
+
"",
|
|
73
|
+
"Use quote-aware parsing.",
|
|
74
|
+
].join("\n");
|
|
75
|
+
|
|
76
|
+
// when
|
|
77
|
+
const parsed = parseRule(content);
|
|
78
|
+
|
|
79
|
+
// then
|
|
80
|
+
expect(parsed.frontmatter).toEqual({
|
|
81
|
+
description: "Rule #1",
|
|
82
|
+
globs: ["src/a,b.ts", "docs/#guide.md"],
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("#given quoted scalar glob with comma #when parsing #then the comma remains part of one glob", () => {
|
|
87
|
+
// given
|
|
88
|
+
const content = ["---", 'globs: "src/foo,bar.ts"', "---", "", "Prefer precise glob parsing."].join("\n");
|
|
89
|
+
|
|
90
|
+
// when
|
|
91
|
+
const parsed = parseRule(content);
|
|
92
|
+
|
|
93
|
+
// then
|
|
94
|
+
expect(parsed.frontmatter.globs).toBe("src/foo,bar.ts");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("#given unquoted scalar glob list with comma #when parsing #then it remains split into multiple globs", () => {
|
|
98
|
+
// given
|
|
99
|
+
const content = ["---", "globs: src/foo.ts, src/bar.ts", "---", "", "Prefer precise glob parsing."].join("\n");
|
|
100
|
+
|
|
101
|
+
// when
|
|
102
|
+
const parsed = parseRule(content);
|
|
103
|
+
|
|
104
|
+
// then
|
|
105
|
+
expect(parsed.frontmatter.globs).toEqual(["src/foo.ts", "src/bar.ts"]);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("#given multiline array with comments and blanks #when parsing #then items are collected until next key", () => {
|
|
109
|
+
// given
|
|
110
|
+
const content = [
|
|
111
|
+
"---",
|
|
112
|
+
"globs:",
|
|
113
|
+
" # ignored comment",
|
|
114
|
+
"",
|
|
115
|
+
' - "src/#hash.ts" # trailing comment',
|
|
116
|
+
" - docs/**/*.md",
|
|
117
|
+
"description: Multiline",
|
|
118
|
+
"---",
|
|
119
|
+
"",
|
|
120
|
+
"Prefer precise rules.",
|
|
121
|
+
].join("\n");
|
|
122
|
+
|
|
123
|
+
// when
|
|
124
|
+
const parsed = parseRule(content);
|
|
125
|
+
|
|
126
|
+
// then
|
|
127
|
+
expect(parsed.frontmatter).toEqual({
|
|
128
|
+
description: "Multiline",
|
|
129
|
+
globs: ["src/#hash.ts", "docs/**/*.md"],
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("#given duplicate glob aliases #when parsing frontmatter #then first-seen order is preserved", () => {
|
|
134
|
+
// given
|
|
135
|
+
const content = [
|
|
136
|
+
"---",
|
|
137
|
+
'globs: ["src/**/*.ts", "test/**/*.ts", "src/**/*.ts"]',
|
|
138
|
+
"paths:",
|
|
139
|
+
" - test/**/*.ts",
|
|
140
|
+
" - packages/**/*.ts",
|
|
141
|
+
"applyTo: packages/**/*.ts, docs/**/*.md, src/**/*.ts",
|
|
142
|
+
"---",
|
|
143
|
+
"",
|
|
144
|
+
"Prefer strict TypeScript.",
|
|
145
|
+
].join("\n");
|
|
146
|
+
|
|
147
|
+
// when
|
|
148
|
+
const parsed = parseRule(content);
|
|
149
|
+
|
|
150
|
+
// then
|
|
151
|
+
expect(parsed.frontmatter.globs).toEqual(["src/**/*.ts", "test/**/*.ts", "packages/**/*.ts", "docs/**/*.md"]);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -60,6 +60,18 @@ describe("post-compact context budget", () => {
|
|
|
60
60
|
expect(budget.maxResultChars).toBe(CONFIG.postCompactMaxResultChars);
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
+
it("#given pure GPT-5.4 model near the fallback context window #when resolving post-compact budget #then treats it as non-preset metadata", () => {
|
|
64
|
+
// given
|
|
65
|
+
const transcriptPath = writeCompactedTranscript("A".repeat(600_000));
|
|
66
|
+
|
|
67
|
+
// when
|
|
68
|
+
const budget = withPostCompactBudget(CONFIG, { model: "gpt-5.4", transcriptPath });
|
|
69
|
+
|
|
70
|
+
// then
|
|
71
|
+
expect(budget.maxResultChars).toBeLessThan(1_000);
|
|
72
|
+
expect(budget.maxRuleChars).toBeLessThanOrEqual(budget.maxResultChars);
|
|
73
|
+
});
|
|
74
|
+
|
|
63
75
|
it("#given context pressure marker after compaction #when resolving post-compact budget #then shrinks projected rule injection", () => {
|
|
64
76
|
// given
|
|
65
77
|
const transcriptPath = writeCompactedPressureTranscript("small compacted summary");
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
import { describe, expect, it } from "vitest";
|
|
6
|
+
|
|
7
|
+
import { runSessionStartHook, runUserPromptSubmitHook } from "../src/codex-hook.js";
|
|
8
|
+
import { formatAdditionalContextOutput } from "../src/hook-output.js";
|
|
9
|
+
|
|
10
|
+
type HookOutput = {
|
|
11
|
+
readonly hookSpecificOutput?: {
|
|
12
|
+
readonly additionalContext?: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function parseAdditionalContext(output: string): string {
|
|
17
|
+
expect(output.trim().length).toBeGreaterThan(0);
|
|
18
|
+
const parsed = parseHookOutput(JSON.parse(output));
|
|
19
|
+
return parsed.hookSpecificOutput?.additionalContext ?? "";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function parseHookOutput(value: unknown): HookOutput {
|
|
23
|
+
if (typeof value !== "object" || value === null) {
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
const record = value;
|
|
27
|
+
if (!("hookSpecificOutput" in record)) {
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
const hookSpecificOutput = record.hookSpecificOutput;
|
|
31
|
+
if (typeof hookSpecificOutput !== "object" || hookSpecificOutput === null) {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
if (!("additionalContext" in hookSpecificOutput)) {
|
|
35
|
+
return { hookSpecificOutput: {} };
|
|
36
|
+
}
|
|
37
|
+
const additionalContext = hookSpecificOutput.additionalContext;
|
|
38
|
+
if (typeof additionalContext !== "string") {
|
|
39
|
+
return { hookSpecificOutput: {} };
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
hookSpecificOutput: {
|
|
43
|
+
additionalContext,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe("Codex Sparkshell awareness", () => {
|
|
49
|
+
it("#given active Codex app server env #when SessionStart runs #then emits Sparkshell guidance", async () => {
|
|
50
|
+
// given
|
|
51
|
+
const env = {
|
|
52
|
+
CODEX_INTERNAL_ORIGINATOR_OVERRIDE: "Codex Desktop",
|
|
53
|
+
CODEX_SHELL: "1",
|
|
54
|
+
CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// when
|
|
58
|
+
const output = await runSessionStartHook(
|
|
59
|
+
{
|
|
60
|
+
session_id: "session-sparkshell-active",
|
|
61
|
+
transcript_path: null,
|
|
62
|
+
cwd: process.cwd(),
|
|
63
|
+
hook_event_name: "SessionStart",
|
|
64
|
+
model: "gpt-5.5",
|
|
65
|
+
permission_mode: "default",
|
|
66
|
+
source: "startup",
|
|
67
|
+
},
|
|
68
|
+
{ env },
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// then
|
|
72
|
+
expect(parseAdditionalContext(output)).toContain("omo sparkshell <command>");
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("#given inactive env #when SessionStart runs #then emits no Sparkshell guidance", async () => {
|
|
76
|
+
// given
|
|
77
|
+
const env = {
|
|
78
|
+
CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// when
|
|
82
|
+
const output = await runSessionStartHook(
|
|
83
|
+
{
|
|
84
|
+
session_id: "session-sparkshell-inactive",
|
|
85
|
+
transcript_path: null,
|
|
86
|
+
cwd: process.cwd(),
|
|
87
|
+
hook_event_name: "SessionStart",
|
|
88
|
+
model: "gpt-5.5",
|
|
89
|
+
permission_mode: "default",
|
|
90
|
+
source: "startup",
|
|
91
|
+
},
|
|
92
|
+
{ env },
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
// then
|
|
96
|
+
expect(output).toBe("");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("#given Codex CLI appserver socket env #when SessionStart runs #then emits Sparkshell guidance", async () => {
|
|
100
|
+
// given
|
|
101
|
+
const env = {
|
|
102
|
+
OMO_SPARKSHELL_APP_SERVER_SOCKET: "/tmp/app-server-control.sock",
|
|
103
|
+
CODEX_THREAD_ID: "thread-sparkshell-cli",
|
|
104
|
+
CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// when
|
|
108
|
+
const output = await runSessionStartHook(
|
|
109
|
+
{
|
|
110
|
+
session_id: "session-sparkshell-cli-wrapper",
|
|
111
|
+
transcript_path: null,
|
|
112
|
+
cwd: process.cwd(),
|
|
113
|
+
hook_event_name: "SessionStart",
|
|
114
|
+
model: "gpt-5.5",
|
|
115
|
+
permission_mode: "default",
|
|
116
|
+
source: "startup",
|
|
117
|
+
},
|
|
118
|
+
{ env },
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// then
|
|
122
|
+
expect(parseAdditionalContext(output)).toContain("omo sparkshell <command>");
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("#given explicit force-on env #when SessionStart runs #then emits Sparkshell guidance", async () => {
|
|
126
|
+
// given
|
|
127
|
+
const env = {
|
|
128
|
+
OMO_SPARKSHELL_AWARENESS: "1",
|
|
129
|
+
CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// when
|
|
133
|
+
const output = await runSessionStartHook(
|
|
134
|
+
{
|
|
135
|
+
session_id: "session-sparkshell-force-on",
|
|
136
|
+
transcript_path: null,
|
|
137
|
+
cwd: process.cwd(),
|
|
138
|
+
hook_event_name: "SessionStart",
|
|
139
|
+
model: "gpt-5.5",
|
|
140
|
+
permission_mode: "default",
|
|
141
|
+
source: "startup",
|
|
142
|
+
},
|
|
143
|
+
{ env },
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
// then
|
|
147
|
+
expect(parseAdditionalContext(output)).toContain("omo sparkshell <command>");
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("#given explicit force-off env with active Codex app context #when SessionStart runs #then emits no Sparkshell guidance", async () => {
|
|
151
|
+
// given
|
|
152
|
+
const env = {
|
|
153
|
+
OMO_SPARKSHELL_AWARENESS: "0",
|
|
154
|
+
CODEX_INTERNAL_ORIGINATOR_OVERRIDE: "Codex Desktop",
|
|
155
|
+
CODEX_SHELL: "1",
|
|
156
|
+
CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// when
|
|
160
|
+
const output = await runSessionStartHook(
|
|
161
|
+
{
|
|
162
|
+
session_id: "session-sparkshell-force-off",
|
|
163
|
+
transcript_path: null,
|
|
164
|
+
cwd: process.cwd(),
|
|
165
|
+
hook_event_name: "SessionStart",
|
|
166
|
+
model: "gpt-5.5",
|
|
167
|
+
permission_mode: "default",
|
|
168
|
+
source: "startup",
|
|
169
|
+
},
|
|
170
|
+
{ env },
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
// then
|
|
174
|
+
expect(output).toBe("");
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("#given Sparkshell awareness already emitted for a session #when UserPromptSubmit runs #then emits no duplicate guidance", async () => {
|
|
178
|
+
// given
|
|
179
|
+
const pluginDataRoot = mkdtempSync(join(tmpdir(), "codex-sparkshell-awareness-"));
|
|
180
|
+
const env = {
|
|
181
|
+
CODEX_INTERNAL_ORIGINATOR_OVERRIDE: "Codex Desktop",
|
|
182
|
+
CODEX_SHELL: "1",
|
|
183
|
+
CODEX_RULES_ENABLED_SOURCES: ".omo/rules",
|
|
184
|
+
};
|
|
185
|
+
try {
|
|
186
|
+
const firstOutput = await runSessionStartHook(
|
|
187
|
+
{
|
|
188
|
+
session_id: "session-sparkshell-dedupe",
|
|
189
|
+
transcript_path: null,
|
|
190
|
+
cwd: process.cwd(),
|
|
191
|
+
hook_event_name: "SessionStart",
|
|
192
|
+
model: "gpt-5.5",
|
|
193
|
+
permission_mode: "default",
|
|
194
|
+
source: "startup",
|
|
195
|
+
},
|
|
196
|
+
{ env, pluginDataRoot },
|
|
197
|
+
);
|
|
198
|
+
expect(parseAdditionalContext(firstOutput)).toContain("omo sparkshell <command>");
|
|
199
|
+
|
|
200
|
+
// when
|
|
201
|
+
const secondOutput = await runUserPromptSubmitHook(
|
|
202
|
+
{
|
|
203
|
+
session_id: "session-sparkshell-dedupe",
|
|
204
|
+
turn_id: "turn-1",
|
|
205
|
+
transcript_path: null,
|
|
206
|
+
cwd: process.cwd(),
|
|
207
|
+
hook_event_name: "UserPromptSubmit",
|
|
208
|
+
model: "gpt-5.5",
|
|
209
|
+
permission_mode: "default",
|
|
210
|
+
prompt: "continue",
|
|
211
|
+
},
|
|
212
|
+
{ env, pluginDataRoot },
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
// then
|
|
216
|
+
expect(secondOutput).toBe("");
|
|
217
|
+
} finally {
|
|
218
|
+
rmSync(pluginDataRoot, { recursive: true, force: true });
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it("#given explicit force-on env #when hook output is formatted #then awareness remains valid hook JSON", () => {
|
|
223
|
+
// given
|
|
224
|
+
const context = [
|
|
225
|
+
"## Sparkshell Runtime",
|
|
226
|
+
"",
|
|
227
|
+
"- Prefer `omo sparkshell <command>` for shell-native inspection.",
|
|
228
|
+
].join("\n");
|
|
229
|
+
|
|
230
|
+
// when
|
|
231
|
+
const output = formatAdditionalContextOutput("SessionStart", context);
|
|
232
|
+
|
|
233
|
+
// then
|
|
234
|
+
expect(parseAdditionalContext(output)).toContain("## Sparkshell Runtime");
|
|
235
|
+
});
|
|
236
|
+
});
|
|
@@ -30,22 +30,34 @@ function postToolUse(input: { toolName: string; toolInput?: unknown; toolRespons
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
describe("extractCodexToolPaths", () => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
33
|
+
for (const [name, toolName, toolInput] of [
|
|
34
|
+
[
|
|
35
|
+
"#given filesystem read payload #when extracting #then returns resolved path",
|
|
36
|
+
"mcp__filesystem__read_file",
|
|
37
|
+
{ path: "src/app.ts" },
|
|
38
|
+
],
|
|
39
|
+
[
|
|
40
|
+
"#given mcp write-file payload #when extracting #then returns resolved path",
|
|
41
|
+
"mcp__filesystem__write_file",
|
|
42
|
+
{ path: "src/app.ts", content: "export const app = true;\n" },
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
"#given mcp edit-file payload #when extracting #then returns resolved path",
|
|
46
|
+
"mcp__filesystem__edit_file",
|
|
47
|
+
{ path: "src/app.ts", edits: [] },
|
|
48
|
+
],
|
|
49
|
+
] as const) {
|
|
50
|
+
it(name, () => {
|
|
51
|
+
// given
|
|
52
|
+
const root = makeProject();
|
|
53
|
+
|
|
54
|
+
// when
|
|
55
|
+
const paths = extractCodexToolPaths(postToolUse({ toolName, toolInput }), root);
|
|
56
|
+
|
|
57
|
+
// then
|
|
58
|
+
expect(paths).toEqual([path.join(root, "src", "app.ts")]);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
49
61
|
|
|
50
62
|
it("#given apply_patch payload #when extracting #then returns patched file paths", () => {
|
|
51
63
|
// given
|
|
@@ -109,40 +121,6 @@ describe("extractCodexToolPaths", () => {
|
|
|
109
121
|
]);
|
|
110
122
|
});
|
|
111
123
|
|
|
112
|
-
it("#given mcp write-file payload #when extracting #then returns resolved path", () => {
|
|
113
|
-
// given
|
|
114
|
-
const root = makeProject();
|
|
115
|
-
|
|
116
|
-
// when
|
|
117
|
-
const paths = extractCodexToolPaths(
|
|
118
|
-
postToolUse({
|
|
119
|
-
toolName: "mcp__filesystem__write_file",
|
|
120
|
-
toolInput: { path: "src/app.ts", content: "export const app = true;\n" },
|
|
121
|
-
}),
|
|
122
|
-
root,
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
// then
|
|
126
|
-
expect(paths).toEqual([path.join(root, "src", "app.ts")]);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("#given mcp edit-file payload #when extracting #then returns resolved path", () => {
|
|
130
|
-
// given
|
|
131
|
-
const root = makeProject();
|
|
132
|
-
|
|
133
|
-
// when
|
|
134
|
-
const paths = extractCodexToolPaths(
|
|
135
|
-
postToolUse({
|
|
136
|
-
toolName: "mcp__filesystem__edit_file",
|
|
137
|
-
toolInput: { path: "src/app.ts", edits: [] },
|
|
138
|
-
}),
|
|
139
|
-
root,
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
// then
|
|
143
|
-
expect(paths).toEqual([path.join(root, "src", "app.ts")]);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
124
|
it("#given mcp read-multiple-files payload #when extracting #then returns all resolved paths", () => {
|
|
147
125
|
// given
|
|
148
126
|
const root = makeProject();
|
package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts
CHANGED
|
@@ -81,7 +81,8 @@ describe("Windows Git Bash bundled rule", () => {
|
|
|
81
81
|
platform: "win32",
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
-
expect(occurrenceCount(output,
|
|
84
|
+
expect(occurrenceCount(output, `Instructions from: ${join(process.cwd(), WINDOWS_RULE_PATH)}`)).toBe(1);
|
|
85
|
+
expect(output).toContain(WINDOWS_GUIDANCE);
|
|
85
86
|
});
|
|
86
87
|
|
|
87
88
|
it("#given bundled rules enabled off Windows #when SessionStart runs #then Windows Git Bash guidance is not injected", async () => {
|
|
@@ -97,12 +98,13 @@ describe("Windows Git Bash bundled rule", () => {
|
|
|
97
98
|
expect(output).not.toContain(WINDOWS_RULE_PATH);
|
|
98
99
|
});
|
|
99
100
|
|
|
100
|
-
it("#given project rule with same description on Windows #when static rules load #then project guidance overrides bundled guidance", async () => {
|
|
101
|
+
it("#given project rule with same description on Windows #when static rules load #then project guidance file overrides bundled guidance", async () => {
|
|
101
102
|
const { root, pluginData } = makeProject();
|
|
102
103
|
const projectGuidance = "Project-specific Windows shell policy.";
|
|
104
|
+
const projectRulePath = join(root, ".omo", "rules", "windows-git-bash.md");
|
|
103
105
|
mkdirSync(join(root, ".omo", "rules"), { recursive: true });
|
|
104
106
|
writeFileSync(
|
|
105
|
-
|
|
107
|
+
projectRulePath,
|
|
106
108
|
["---", `description: ${WINDOWS_RULE_DESCRIPTION}`, "alwaysApply: true", "---", "", projectGuidance].join(
|
|
107
109
|
"\n",
|
|
108
110
|
),
|
|
@@ -114,6 +116,7 @@ describe("Windows Git Bash bundled rule", () => {
|
|
|
114
116
|
platform: "win32",
|
|
115
117
|
});
|
|
116
118
|
|
|
119
|
+
expect(output).toContain(`Instructions from: ${projectRulePath}`);
|
|
117
120
|
expect(output).toContain(projectGuidance);
|
|
118
121
|
expect(output).not.toContain(WINDOWS_GUIDANCE);
|
|
119
122
|
});
|
|
@@ -18,11 +18,12 @@ You are mid-flight on a Prometheus work plan. The turn just ended without finish
|
|
|
18
18
|
1. Read `{{PLAN_PATH}}` AND `{{LEDGER_PATH}}` first — ground truth for what remains and what evidence has already been recorded. The plan checkbox and the ledger are the only sources of truth; do not trust your own memory of prior turns.
|
|
19
19
|
2. Pick the FIRST unchecked top-level checkbox in `## TODOs` or `## Final Verification Wave`. Ignore nested checkboxes under Acceptance Criteria / Evidence / Definition of Done.
|
|
20
20
|
3. Follow the `start-work` skill in full. The skill is already loaded from your earlier turn — re-read its file at `packages/omo-codex/plugin/skills/start-work/SKILL.md` if you have lost context.
|
|
21
|
-
4. Decompose the checkbox into atomic sub-tasks. Dispatch them in PARALLEL via `spawn_agent` calls in this same response unless a sub-task has a NAMED blocking dependency (input from another sub-task or shared file). Prefer `fork_turns: "none"` unless full history is truly required.
|
|
21
|
+
4. Decompose the checkbox into atomic sub-tasks. Dispatch them in PARALLEL via `spawn_agent` calls in this same response unless a sub-task has a NAMED blocking dependency (input from another sub-task or shared file). Prefer `fork_turns: "none"` unless full history is truly required. Put role and specialty instructions inside `message`; the Codex tool schema only accepts `task_name`, `message`, and `fork_turns`.
|
|
22
22
|
5. Every sub-task message MUST be self-contained and start with `TASK: <imperative assignment>`, then name `DELIVERABLE`, `SCOPE`, and `VERIFY`. State that it is an executable assignment, not a context handoff. It must include all 7 sections and name one Manual-QA channel with its exact tool and exact invocation (the literal `curl` / `send-keys` / `page.click` with concrete inputs and the binary PASS/FAIL observable), plus the applicable ultraqa adversarial classes, a captured artifact, and a cleanup receipt. Channels: HTTP call (`curl -i`); tmux (`send-keys` + `capture-pane`); browser use — use Chrome to drive the page, else download and use agent-browser (https://github.com/vercel-labs/agent-browser); computer use — OS-level GUI automation for a desktop app. Tests are the floor; the channel artifact plus probed adversarial classes are the ceiling. All are required.
|
|
23
|
-
6.
|
|
24
|
-
7.
|
|
25
|
-
8.
|
|
23
|
+
6. Treat every worker DoneClaim as untrusted input. Run independent AdversarialVerify before any checkbox can become FullyDone; `confirmed` is the only pass verdict, while `false-positive`, `needs-fix`, and `needs-human-review` loop back to the executor with exact feedback.
|
|
24
|
+
7. Use `wait_agent` for mailbox signals, not proof of completion. For sub-tasks likely to exceed one wait cycle, require `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A timeout only means no new mailbox update arrived; after a timeout, run a single `list_agents` check for the named child when you need reassurance. If it is running or its latest message is `WORKING:`, treat it as alive. Do not use `list_agents` as a polling loop. Send `TASK STILL ACTIVE: return <deliverable> or BLOCKED: <reason>` only when the child is completed without the deliverable, ack-only, or no longer running. If that followup is still silent or ack-only, record inconclusive, do not count it as pass/review approval, close if safe, and respawn a smaller `fork_turns: "none"` task with the missing deliverable.
|
|
25
|
+
8. After verification of ALL sub-tasks under this checkbox: `apply_patch` the plan to change `- [ ]` → `- [x]`, re-read the plan to confirm the count decreased, append a `task-completed` line to the ledger, then continue.
|
|
26
|
+
9. Do not start fresh on a sub-agent failure. Re-dispatch the same `task_name` with a fix-message: `FAILED: <exact error>` + `Diagnosis: <observation>` + `Fix: <instruction>`.
|
|
26
27
|
|
|
27
28
|
# Hard constraints
|
|
28
29
|
|
|
@@ -34,12 +35,18 @@ You are mid-flight on a Prometheus work plan. The turn just ended without finish
|
|
|
34
35
|
- The worktree path (if set in boulder.json) governs every file edit and command. Do not stray into the main repo.
|
|
35
36
|
- session_ids you write to boulder.json MUST be prefixed `codex:`. Bare ids on read are legacy `opencode:`.
|
|
36
37
|
|
|
38
|
+
# Global Review and Debugging Gate
|
|
39
|
+
|
|
40
|
+
Before completion, run `review-work` and a `debugging` runtime audit. Treat timeout, missing deliverable, ack-only, `BLOCKED:`, and inconclusive review lanes as failures, not progress. Record at least three debugging hypotheses and the runtime evidence that confirms or refutes each one.
|
|
41
|
+
|
|
42
|
+
Do not print `ORCHESTRATION COMPLETE`. Do not create a PR, PR handoff, or branch handoff. Do not write a final completion answer until this gate passes. Always redact secrets, tokens, credentials, auth headers, cookies, env dumps, private logs, and PII from ledgers, PR bodies, and handoffs.
|
|
43
|
+
|
|
37
44
|
# Stop conditions for THIS turn
|
|
38
45
|
|
|
39
46
|
- A top-level checkbox flipped to `- [x]` after the 5-phase QA gate (Phase 1 read, Phase 2 automated, Phase 3 channel scenario, Phase 4 adversarial-class probing, Phase 5 gate decision). Then the Stop hook will re-evaluate; if more checkboxes remain you will be continued again.
|
|
40
|
-
- 3 same-failure cycles on one sub-task → escalate via `spawn_agent(
|
|
47
|
+
- 3 same-failure cycles on one sub-task → escalate via `spawn_agent({"task_name":"failure_escalation_review","message":"TASK: act as a rigorous reviewer. DELIVERABLE: diagnose the repeated sub-task failure and recommend the next safe action. VERIFY: cite the failing evidence.","fork_turns":"none"})` and stop dispatch.
|
|
41
48
|
- Safety boundary (destructive command, secret exfiltration, production write) → stop and surface a safe substitute.
|
|
42
|
-
- All top-level checkboxes `- [x]` AND
|
|
49
|
+
- All top-level checkboxes `- [x]` AND the Global Review and Debugging Gate passed → print the ORCHESTRATION COMPLETE block and end.
|
|
43
50
|
|
|
44
51
|
# Output discipline
|
|
45
52
|
|
|
@@ -6,6 +6,7 @@ import type { ReadonlyFileSystem, StopHookEventName, StopHookOutput, StopInput }
|
|
|
6
6
|
export function runStopHook(input: unknown, fs: ReadonlyFileSystem): string {
|
|
7
7
|
if (!isStopInput(input)) return "";
|
|
8
8
|
if (input.stop_hook_active) return "";
|
|
9
|
+
if (transcriptHasContextPressureMarker(input.transcript_path, fs)) return "";
|
|
9
10
|
const state = readContinuationState(input.cwd, input.session_id, fs);
|
|
10
11
|
if (state === null) return "";
|
|
11
12
|
return JSON.stringify({
|
|
@@ -38,6 +39,26 @@ function renderDirective(state: ContinuationState, sessionId: string): string {
|
|
|
38
39
|
return rendered;
|
|
39
40
|
}
|
|
40
41
|
|
|
42
|
+
const CONTEXT_PRESSURE_MARKERS = [
|
|
43
|
+
"context compacted",
|
|
44
|
+
"context_length_exceeded",
|
|
45
|
+
"skill descriptions were shortened",
|
|
46
|
+
"context_too_large",
|
|
47
|
+
"codex ran out of room in the model's context window",
|
|
48
|
+
"your input exceeds the context window",
|
|
49
|
+
"long threads and multiple compactions",
|
|
50
|
+
] as const;
|
|
51
|
+
|
|
52
|
+
function transcriptHasContextPressureMarker(transcriptPath: string, fs: ReadonlyFileSystem): boolean {
|
|
53
|
+
try {
|
|
54
|
+
const transcript = fs.readFileSync(transcriptPath, "utf8").toLowerCase();
|
|
55
|
+
return CONTEXT_PRESSURE_MARKERS.some((marker) => transcript.includes(marker));
|
|
56
|
+
} catch (error) {
|
|
57
|
+
if (error instanceof Error) return false;
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
41
62
|
function isStopInput(value: unknown): value is StopInput {
|
|
42
63
|
return (
|
|
43
64
|
isRecord(value) &&
|