oh-my-opencode 4.7.5 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/command/get-unpublished-changes.md +35 -6
- package/.agents/command/omomomo.md +1 -1
- package/.agents/command/publish.md +13 -0
- package/.agents/command/security-research.md +0 -1
- package/.agents/skills/get-unpublished-changes/SKILL.md +21 -5
- package/.agents/skills/omomomo/SKILL.md +1 -2
- package/.agents/skills/opencode-qa/scripts/export-roundtrip.sh +57 -19
- package/.agents/skills/opencode-qa/scripts/lib/common.sh +19 -7
- package/.agents/skills/opencode-qa/scripts/sse-hook-probe.sh +3 -0
- package/.agents/skills/opencode-qa/scripts/tui-smoke.sh +1 -1
- package/.agents/skills/pre-publish-review/SKILL.md +24 -4
- package/.agents/skills/publish/SKILL.md +13 -0
- package/.agents/skills/remove-deadcode/SKILL.md +0 -1
- package/.agents/skills/security-research/SKILL.md +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
- package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
- package/.opencode/command/get-unpublished-changes.md +35 -6
- package/.opencode/command/omomomo.md +1 -1
- package/.opencode/command/publish.md +13 -0
- package/.opencode/command/security-research.md +0 -1
- package/.opencode/skills/pre-publish-review/SKILL.md +24 -4
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
- package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
- package/README.ja.md +7 -7
- package/README.ko.md +9 -7
- package/README.md +14 -8
- package/README.ru.md +5 -5
- package/README.zh-cn.md +7 -7
- package/bin/oh-my-opencode.js +24 -1
- package/bin/oh-my-opencode.test.ts +79 -20
- package/dist/agents/hephaestus/agent.d.ts +1 -1
- package/dist/agents/kimi-tool-loop-guard.d.ts +1 -0
- package/dist/agents/momus.d.ts +1 -1
- package/dist/agents/sisyphus-agent-config.d.ts +4 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +6 -0
- package/dist/agents/sisyphus-dynamic-prompt-builder.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-execution.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-exploration.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-role.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-sections.d.ts +18 -0
- package/dist/agents/sisyphus-dynamic-prompt-style.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt.d.ts +3 -0
- package/dist/agents/sisyphus-gemini-fallback-overrides.d.ts +1 -0
- package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
- package/dist/agents/sisyphus-junior/index.d.ts +0 -1
- package/dist/agents/sisyphus.d.ts +1 -6
- package/dist/agents/types.d.ts +14 -3
- package/dist/cli/cli-program.d.ts +3 -0
- package/dist/cli/doctor/checks/codex.d.ts +11 -0
- package/dist/cli/doctor/checks/dependencies.d.ts +1 -0
- package/dist/cli/doctor/checks/index.d.ts +3 -0
- package/dist/cli/doctor/checks/system.d.ts +4 -0
- package/dist/cli/doctor/constants.d.ts +1 -0
- package/dist/cli/doctor/doctor-target.d.ts +2 -0
- package/dist/cli/doctor/index.d.ts +1 -0
- package/dist/cli/doctor/types.d.ts +26 -0
- package/dist/cli/index.js +4426 -2200
- package/dist/cli/install-codex/codex-cache-bins.d.ts +21 -0
- package/dist/cli/install-codex/codex-cache-fs.d.ts +3 -0
- package/dist/cli/install-codex/codex-cache-install.d.ts +13 -0
- package/dist/cli/install-codex/codex-cache-mcp-manifest.d.ts +2 -0
- package/dist/cli/install-codex/codex-cache-prune.d.ts +10 -0
- package/dist/cli/install-codex/codex-cache.d.ts +4 -32
- package/dist/cli/install-codex/codex-cached-marketplace-manifest.d.ts +6 -0
- package/dist/cli/install-codex/codex-config-agents.d.ts +3 -0
- package/dist/cli/install-codex/codex-config-features.d.ts +1 -0
- package/dist/cli/install-codex/codex-config-marketplaces.d.ts +6 -0
- package/dist/cli/install-codex/codex-config-plugins.d.ts +8 -0
- package/dist/cli/install-codex/codex-config-toml-sections.d.ts +9 -0
- package/dist/cli/install-codex/codex-process.d.ts +5 -0
- package/dist/cli/install-codex/index.d.ts +1 -1
- package/dist/cli/install-codex/lazycodex-version-stamp.d.ts +19 -0
- package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +4 -0
- package/dist/cli/install-validators.d.ts +3 -0
- package/dist/cli/model-fallback-types.d.ts +3 -0
- package/dist/cli/run/event-handlers.d.ts +4 -11
- package/dist/cli/run/event-message-handlers.d.ts +5 -0
- package/dist/cli/run/event-session-handlers.d.ts +5 -0
- package/dist/cli/run/event-session-ids.d.ts +24 -0
- package/dist/cli/run/event-think-block.d.ts +3 -0
- package/dist/cli/run/event-toast-handlers.d.ts +3 -0
- package/dist/cli/run/event-tool-handlers.d.ts +4 -0
- package/dist/cli/run/event-tool-output.d.ts +2 -0
- package/dist/cli/run/on-complete-hook.d.ts +8 -1
- package/dist/cli/run/opencode-binary-resolver.d.ts +2 -1
- package/dist/cli/runtime-commands.d.ts +2 -0
- package/dist/cli/sparkshell-appserver-websocket.d.ts +4 -0
- package/dist/cli/sparkshell-appserver.d.ts +16 -0
- package/dist/cli/sparkshell-parse.d.ts +21 -0
- package/dist/cli/sparkshell.d.ts +26 -0
- package/dist/cli/types.d.ts +9 -0
- package/dist/config/schema/claude-code.d.ts +1 -0
- package/dist/config/schema/hooks.d.ts +1 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
- package/dist/create-hooks.d.ts +1 -0
- package/dist/features/background-agent/concurrency.d.ts +6 -1
- package/dist/features/background-agent/constants.d.ts +1 -0
- package/dist/features/background-agent/empty-assistant-turn.d.ts +7 -0
- package/dist/features/background-agent/manager.d.ts +12 -0
- package/dist/features/background-agent/message-updated-parent-wake-output.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
- package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +21 -0
- package/dist/features/background-agent/parent-wake-flush-runner.d.ts +24 -0
- package/dist/features/background-agent/parent-wake-history-state.d.ts +5 -0
- package/dist/features/background-agent/parent-wake-notifier-types.d.ts +50 -0
- package/dist/features/background-agent/parent-wake-notifier.d.ts +8 -50
- package/dist/features/background-agent/parent-wake-pending-queue.d.ts +22 -0
- package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +19 -0
- package/dist/features/background-agent/parent-wake-session-history.d.ts +73 -0
- package/dist/features/background-agent/parent-wake-session-inspector.d.ts +35 -0
- package/dist/features/background-agent/parent-wake-timer-handle.d.ts +5 -0
- package/dist/features/background-agent/parent-wake-window-recovery.d.ts +13 -0
- package/dist/features/background-agent/process-cleanup.d.ts +2 -0
- package/dist/features/background-agent/process-cleanup.test-helpers.d.ts +3 -0
- package/dist/features/background-agent/session-stream-activity.d.ts +6 -0
- package/dist/features/background-agent/spawner/fallback-agent.d.ts +5 -0
- package/dist/features/background-agent/spawner/task-prompt-body.d.ts +34 -0
- package/dist/features/background-agent/spawner/task-record.d.ts +2 -0
- package/dist/features/background-agent/spawner.d.ts +2 -5
- package/dist/features/builtin-commands/templates/refactor-sections/codemap-and-tests.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/plan-and-execution.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/verification-and-tooling.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor.d.ts +2 -2
- package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +2 -0
- package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +2 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +1 -1
- package/dist/features/builtin-skills/skills/index.d.ts +1 -0
- package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +2 -0
- package/dist/features/builtin-skills/skills/playwright.d.ts +2 -3
- package/dist/features/builtin-skills/skills/visual-qa.d.ts +2 -0
- package/dist/features/claude-code-agent-loader/agent-definitions-loader.d.ts +2 -2
- package/dist/features/claude-code-agent-loader/claude-model-mapper.d.ts +1 -1
- package/dist/features/claude-code-agent-loader/loader.d.ts +2 -2
- package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +1 -1
- package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +2 -0
- package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/discovery.d.ts +3 -4
- package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +1 -0
- package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +2 -0
- package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +1 -0
- package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +4 -0
- package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/types.d.ts +1 -0
- package/dist/features/hook-message-injector/context-resolver.d.ts +6 -0
- package/dist/features/hook-message-injector/id-generation.d.ts +2 -0
- package/dist/features/hook-message-injector/index.d.ts +1 -1
- package/dist/features/hook-message-injector/injector.d.ts +7 -69
- package/dist/features/hook-message-injector/json-message-lookup.d.ts +3 -0
- package/dist/features/hook-message-injector/message-directory.d.ts +1 -0
- package/dist/features/hook-message-injector/message-injection.d.ts +2 -0
- package/dist/features/hook-message-injector/sdk-message-context.d.ts +6 -0
- package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +28 -0
- package/dist/features/hook-message-injector/types.d.ts +9 -0
- package/dist/features/mcp-oauth/callback-server.d.ts +10 -2
- package/dist/features/opencode-runtime-skills/source-server.d.ts +1 -0
- package/dist/features/skill-mcp-manager/http-client.d.ts +2 -0
- package/dist/features/team-mode/deps.d.ts +8 -1
- package/dist/features/team-mode/team-layout-tmux/layout.d.ts +2 -0
- package/dist/features/team-mode/team-mailbox/send.d.ts +3 -0
- package/dist/features/team-mode/team-registry/paths.d.ts +17 -2
- package/dist/features/team-mode/team-runtime/shutdown.d.ts +1 -1
- package/dist/features/team-mode/team-runtime/unresolved-team-members.d.ts +3 -0
- package/dist/features/team-mode/team-state-store/active-resume.d.ts +5 -0
- package/dist/features/team-mode/team-state-store/creating-resume.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/deleting-resume.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/error-normalization.d.ts +2 -0
- package/dist/features/team-mode/team-state-store/reservation-reconciliation.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/resume-report.d.ts +7 -0
- package/dist/features/team-mode/team-state-store/resume.d.ts +2 -7
- package/dist/features/team-mode/team-state-store/runtime-cleanup.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/session-liveness.d.ts +9 -0
- package/dist/features/team-mode/team-state-store/worker-resume-status.d.ts +9 -0
- package/dist/features/team-mode/tools/lifecycle-create-tool.d.ts +17 -0
- package/dist/features/team-mode/tools/lifecycle-inline-spec.d.ts +19 -0
- package/dist/features/team-mode/tools/lifecycle-participant.d.ts +25 -0
- package/dist/features/team-mode/tools/lifecycle-shutdown-tools.d.ts +18 -0
- package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +3 -3
- package/dist/features/team-mode/tools/lifecycle.d.ts +3 -37
- package/dist/features/team-mode/tools/messaging-live-delivery-client.d.ts +25 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +19 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-reservation.d.ts +10 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-state.d.ts +5 -0
- package/dist/features/team-mode/tools/messaging-live-delivery.d.ts +6 -0
- package/dist/features/team-mode/tools/messaging-runtime.d.ts +17 -0
- package/dist/features/team-mode/tools/messaging.d.ts +4 -29
- package/dist/features/tmux-subagent/manager.d.ts +20 -1
- package/dist/features/tmux-subagent/session-created-handler.d.ts +4 -0
- package/dist/features/tmux-subagent/types.d.ts +1 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/message-builder.d.ts +1 -1
- package/dist/hooks/atlas/idle-completion-nudge.d.ts +10 -0
- package/dist/hooks/atlas/idle-constants.d.ts +4 -0
- package/dist/hooks/atlas/idle-continuation.d.ts +23 -0
- package/dist/hooks/atlas/idle-session-eligibility.d.ts +8 -0
- package/dist/hooks/atlas/tool-execute-after-direct-work.d.ts +9 -0
- package/dist/hooks/atlas/tool-execute-after-plan-tasks.d.ts +3 -0
- package/dist/hooks/atlas/tool-execute-after-subagent-completion.d.ts +14 -0
- package/dist/hooks/auto-update-checker/hook/background-update-check.d.ts +6 -0
- package/dist/hooks/auto-update-checker/hook/ignore-toast-error.d.ts +1 -0
- package/dist/hooks/hephaestus-agents-md-injector/hook.d.ts +37 -0
- package/dist/hooks/hephaestus-agents-md-injector/index.d.ts +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
- package/dist/hooks/ralph-loop/command-arguments.d.ts +1 -0
- package/dist/hooks/ralph-loop/event-handler-activity.d.ts +10 -0
- package/dist/hooks/ralph-loop/event-handler-completion.d.ts +9 -0
- package/dist/hooks/ralph-loop/event-handler-continuation.d.ts +16 -0
- package/dist/hooks/ralph-loop/event-handler-feedback.d.ts +16 -0
- package/dist/hooks/ralph-loop/event-handler-idle.d.ts +15 -0
- package/dist/hooks/ralph-loop/event-handler-impl.d.ts +10 -0
- package/dist/hooks/ralph-loop/event-handler-runtime-error.d.ts +4 -0
- package/dist/hooks/ralph-loop/event-handler-types.d.ts +20 -0
- package/dist/hooks/ralph-loop/loop-state-controller.d.ts +1 -0
- package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +4 -24
- package/dist/hooks/ralph-loop/ralph-loop-hook.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-chunks.d.ts +6 -0
- package/dist/hooks/read-image-resizer/png-constants.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-crc.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-decoder.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-encoder.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-filters.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-ihdr.d.ts +11 -0
- package/dist/hooks/read-image-resizer/png-nearest-neighbor.d.ts +1 -0
- package/dist/hooks/rules-injector/injection-output.d.ts +2 -0
- package/dist/hooks/rules-injector/injection-processor.d.ts +22 -0
- package/dist/hooks/rules-injector/injection-types.d.ts +43 -0
- package/dist/hooks/rules-injector/injector.d.ts +3 -47
- package/dist/hooks/rules-injector/match-decision-cache.d.ts +4 -0
- package/dist/hooks/rules-injector/parsed-rule-cache.d.ts +11 -0
- package/dist/hooks/rules-injector/path-resolution.d.ts +1 -0
- package/dist/hooks/rules-injector/rule-match-reason.d.ts +12 -0
- package/dist/hooks/rules-injector/transcript-hydration.d.ts +13 -2
- package/dist/hooks/runtime-fallback/auto-retry-abort.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-agent-context.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-cleanup.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-metadata.d.ts +9 -0
- package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +5 -0
- package/dist/hooks/runtime-fallback/fallback-bootstrap-model.d.ts +1 -1
- package/dist/hooks/runtime-fallback/fallback-state.d.ts +4 -1
- package/dist/hooks/runtime-fallback/normalize-model.d.ts +12 -0
- package/dist/hooks/session-notification-linux.d.ts +3 -0
- package/dist/hooks/session-notification-log.d.ts +2 -0
- package/dist/hooks/session-notification-macos.d.ts +3 -0
- package/dist/hooks/session-notification-platform.d.ts +3 -0
- package/dist/hooks/session-notification-runner.d.ts +9 -0
- package/dist/hooks/session-notification-send.d.ts +3 -0
- package/dist/hooks/session-notification-sender.d.ts +5 -6
- package/dist/hooks/session-notification-sound.d.ts +3 -0
- package/dist/hooks/session-notification-windows.d.ts +3 -0
- package/dist/hooks/session-recovery/error-recovery.d.ts +4 -0
- package/dist/hooks/session-recovery/hook-types.d.ts +22 -0
- package/dist/hooks/session-recovery/hook.d.ts +2 -19
- package/dist/hooks/session-recovery/interrupted-tool-results.d.ts +3 -0
- package/dist/hooks/session-recovery/message-state.d.ts +4 -0
- package/dist/hooks/session-recovery/storage/thinking-strip.d.ts +7 -1
- package/dist/hooks/start-work/context-info-builder.d.ts +9 -9
- package/dist/hooks/start-work/context-info-formatters.d.ts +21 -0
- package/dist/hooks/start-work/explicit-plan-context.d.ts +9 -0
- package/dist/hooks/start-work/plan-discovery-context.d.ts +25 -0
- package/dist/hooks/start-work/plan-selection.d.ts +4 -0
- package/dist/hooks/start-work/work-initializer.d.ts +17 -0
- package/dist/hooks/tool-pair-validator/hook.d.ts +1 -37
- package/dist/hooks/tool-pair-validator/message-transform.d.ts +2 -0
- package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +6 -0
- package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -0
- package/dist/hooks/tool-pair-validator/types.d.ts +36 -0
- package/dist/index.js +12708 -9988
- package/dist/oh-my-opencode.schema.json +4 -0
- package/dist/openclaw/reply-listener-poll-loop.d.ts +3 -0
- package/dist/openclaw/reply-listener-signature.d.ts +2 -0
- package/dist/openclaw/reply-listener-sleep.d.ts +1 -0
- package/dist/openclaw/reply-listener-start.d.ts +9 -0
- package/dist/openclaw/reply-listener-status.d.ts +4 -0
- package/dist/openclaw/reply-listener-stop.d.ts +7 -0
- package/dist/openclaw/reply-listener.d.ts +5 -18
- package/dist/openclaw/session-registry-lock.d.ts +2 -0
- package/dist/openclaw/session-registry-paths.d.ts +9 -0
- package/dist/openclaw/session-registry-storage.d.ts +4 -0
- package/dist/openclaw/session-registry-types.d.ts +11 -0
- package/dist/openclaw/session-registry.d.ts +2 -11
- package/dist/plugin/chat-message/loop-commands.d.ts +9 -0
- package/dist/plugin/chat-message/model-cache-warning.d.ts +12 -0
- package/dist/plugin/chat-message/prompt-text.d.ts +2 -0
- package/dist/plugin/chat-message/session-model.d.ts +4 -0
- package/dist/plugin/chat-message/start-work-message.d.ts +5 -0
- package/dist/plugin/chat-message/types.d.ts +67 -0
- package/dist/plugin/chat-message.d.ts +3 -24
- package/dist/plugin/event-error-utils.d.ts +14 -0
- package/dist/plugin/event-hook-dispatcher.d.ts +5 -0
- package/dist/plugin/event-model-fallback-state.d.ts +30 -0
- package/dist/plugin/event-model-fallback.d.ts +39 -0
- package/dist/plugin/event-session-lifecycle.d.ts +49 -0
- package/dist/plugin/event-session-recovery.d.ts +9 -0
- package/dist/plugin/event-team-handlers.d.ts +13 -0
- package/dist/plugin/event-types.d.ts +78 -0
- package/dist/plugin/event.d.ts +3 -12
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
- package/dist/plugin/hooks/model-fallback-title-updater.d.ts +8 -0
- package/dist/plugin/session-compacting.d.ts +4 -1
- package/dist/plugin/system-transform.d.ts +1 -1
- package/dist/plugin/tool-execute-after.d.ts +2 -0
- package/dist/plugin/tool-registry-core-tools.d.ts +15 -0
- package/dist/plugin/tool-registry-factories.d.ts +36 -0
- package/dist/plugin/tool-registry-gated-tools.d.ts +16 -0
- package/dist/plugin/tool-registry-team-tools.d.ts +14 -0
- package/dist/plugin/tool-registry-trimming.d.ts +2 -0
- package/dist/plugin/tool-registry.d.ts +3 -38
- package/dist/plugin/ultrawork-db-model-override.d.ts +1 -1
- package/dist/plugin-config/agent-order-warnings.d.ts +1 -0
- package/dist/plugin-config/config-merger.d.ts +2 -0
- package/dist/plugin-config/layered-config-loader.d.ts +2 -0
- package/dist/plugin-config/single-config-loader.d.ts +4 -0
- package/dist/plugin-config.d.ts +3 -5
- package/dist/plugin-handlers/agent-config-assembly.d.ts +19 -0
- package/dist/plugin-handlers/agent-config-finalizer.d.ts +4 -0
- package/dist/plugin-handlers/agent-config-handler.d.ts +2 -11
- package/dist/plugin-handlers/agent-config-types.d.ts +30 -0
- package/dist/plugin-handlers/agent-skill-discovery.d.ts +3 -0
- package/dist/plugin-handlers/agent-source-loader.d.ts +2 -0
- package/dist/plugin-handlers/hook-config-handler.d.ts +0 -3
- package/dist/shared/context-window-usage.d.ts +7 -0
- package/dist/shared/dynamic-truncator-types.d.ts +17 -0
- package/dist/shared/dynamic-truncator.d.ts +8 -23
- package/dist/shared/migration/migrations-sidecar.d.ts +2 -2
- package/dist/shared/migration/model-versions.d.ts +7 -4
- package/dist/shared/model-availability.d.ts +1 -1
- package/dist/shared/opencode-version.d.ts +2 -2
- package/dist/shared/sparkshell-awareness.d.ts +5 -0
- package/dist/shared/spawn-with-windows-hide.d.ts +2 -0
- package/dist/shared/token-limit-truncator.d.ts +2 -0
- package/dist/testing/module-mock-lifecycle.d.ts +8 -0
- package/dist/tools/delegate-task/openai-categories.d.ts +0 -1
- package/dist/tools/delegate-task/subagent-agent-match.d.ts +3 -0
- package/dist/tools/delegate-task/subagent-model-resolution.d.ts +4 -0
- package/dist/tools/delegate-task/subagent-request-preflight.d.ts +3 -0
- package/dist/tools/delegate-task/subagent-resolution-types.d.ts +32 -0
- package/dist/tools/delegate-task/subagent-resolver.d.ts +3 -12
- package/dist/tools/delegate-task/sync-completion-message.d.ts +20 -0
- package/dist/tools/delegate-task/sync-poll-error-recovery.d.ts +1 -0
- package/dist/tools/delegate-task/sync-session-lifecycle.d.ts +12 -0
- package/dist/tools/delegate-task/sync-session-poller.d.ts +2 -0
- package/dist/tools/delegate-task/sync-spawn-reservation.d.ts +10 -0
- package/dist/tools/delegate-task/sync-task-metadata.d.ts +11 -0
- package/dist/tools/delegate-task/sync-task-runner.d.ts +30 -0
- package/dist/tools/delegate-task/sync-task.d.ts +2 -1
- package/dist/tools/hashline-edit/formatter-trigger.d.ts +2 -2
- package/package.json +15 -14
- package/packages/git-bash-mcp/dist/cli.js +29 -12
- package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.d.ts +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +95 -30
- package/packages/lsp-tools-mcp/dist/lsp/server-installation.d.ts +1 -2
- package/packages/lsp-tools-mcp/dist/lsp/server-installation.js +1 -11
- package/packages/lsp-tools-mcp/dist/lsp/transport.d.ts +1 -0
- package/packages/lsp-tools-mcp/dist/lsp/transport.js +5 -10
- package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.d.ts +4 -1
- package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +84 -23
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +2 -0
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.js +14 -0
- package/packages/lsp-tools-mcp/dist/tools.js +64 -80
- package/packages/lsp-tools-mcp/package.json +4 -4
- package/packages/omo-codex/lazycodex-repository/.github/workflows/pr-source-guidance.yml +36 -0
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/README.md +3 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +188 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/core-values.ts +1 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +15 -361
- package/packages/omo-codex/plugin/components/comment-checker/src/hook-input.ts +19 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/record.ts +11 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +102 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/types.ts +51 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +145 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/core.test.ts +200 -0
- package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +11 -5
- package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +0 -1
- package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-cache.ts +87 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-loader.ts +94 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-loader.ts +84 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-paths.ts +103 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-static-loader.ts +43 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-types.ts +45 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -419
- package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +32 -5
- package/packages/omo-codex/plugin/components/rules/src/rules/parser-frontmatter.ts +39 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/parser-yaml.ts +271 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +3 -294
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +57 -0
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +13 -2
- package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +17 -0
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +2 -1
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +26 -11
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +104 -138
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +5 -2
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +12 -5
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +10 -4
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +65 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +47 -2
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +16 -0
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +153 -0
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +12 -0
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +236 -0
- package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +28 -50
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +6 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +13 -6
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +64 -2
- package/packages/omo-codex/plugin/components/telemetry/README.md +11 -1
- package/packages/omo-codex/plugin/components/telemetry/biome.json +12 -0
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +30 -3
- package/packages/omo-codex/plugin/components/telemetry/src/diagnostics.ts +154 -0
- package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +18 -2
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +36 -4
- package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +115 -0
- package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +16 -25
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +119 -0
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +97 -32
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +65 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/agents/openai.yaml +7 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +131 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +38 -10
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +47 -0
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +12 -8
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +28 -21
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +7 -7
- package/packages/omo-codex/plugin/components/ulw-loop/src/command-types.ts +36 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +64 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +98 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +17 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +69 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +5 -277
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +35 -13
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +52 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +67 -111
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +31 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +46 -9
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +20 -29
- package/packages/omo-codex/plugin/model-catalog.json +5 -11
- package/packages/omo-codex/plugin/package-lock.json +1 -1
- package/packages/omo-codex/plugin/scripts/auto-update-state.mjs +78 -0
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +166 -76
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +71 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/config-paths.mjs +44 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +74 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/state.mjs +29 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +14 -202
- package/packages/omo-codex/plugin/scripts/spawn-command.mjs +11 -0
- package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +23 -9
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +131 -28
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +100 -0
- package/packages/omo-codex/plugin/skills/git-master/agents/openai.yaml +13 -0
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -7
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
- package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +119 -14
- package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +4 -2
- package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +2 -2
- package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +6 -6
- package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +12 -12
- package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +7 -7
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +13 -11
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -8
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +68 -33
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +86 -22
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +770 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +12 -8
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +28 -21
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +45 -379
- package/packages/omo-codex/plugin/skills/ulw-plan/agents/openai.yaml +7 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +131 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +237 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/ansi.ts +17 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/cli.ts +82 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/east-asian-width.ts +72 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/image-diff.ts +109 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-crc.ts +27 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-decode.ts +206 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-synth.ts +57 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/tui-grid.ts +88 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/types.ts +54 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +55 -0
- package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +38 -0
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +164 -0
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +73 -0
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +69 -0
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +83 -0
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +67 -0
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +2 -514
- package/packages/omo-codex/plugin/test/auto-update-state-persistence.test.mjs +36 -0
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +191 -29
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +29 -0
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +23 -10
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +81 -0
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +91 -0
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +165 -9
- package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -19
- package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +107 -0
- package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +82 -7
- package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +58 -6
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +152 -0
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +158 -50
- package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +43 -0
- package/packages/omo-codex/scripts/install/agent-source-roots.mjs +13 -0
- package/packages/omo-codex/scripts/install/agents.mjs +84 -14
- package/packages/omo-codex/scripts/install/bin-links.mjs +239 -0
- package/packages/omo-codex/scripts/install/cache.mjs +152 -108
- package/packages/omo-codex/scripts/install/cached-marketplace-manifest.mjs +21 -0
- package/packages/omo-codex/scripts/install/cli-args.mjs +39 -2
- package/packages/omo-codex/scripts/install/config.mjs +7 -5
- package/packages/omo-codex/scripts/install/lazycodex-version-stamp.mjs +102 -0
- package/packages/omo-codex/scripts/install/legacy-bins.mjs +9 -1
- package/packages/omo-codex/scripts/install/model-catalog.mjs +9 -1
- package/packages/omo-codex/scripts/install/process.mjs +3 -1
- package/packages/omo-codex/scripts/install/project-local-cleanup.mjs +0 -1
- package/packages/omo-codex/scripts/install/snapshot.mjs +0 -1
- package/packages/omo-codex/scripts/install-agent-links.test.mjs +205 -11
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -1
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +129 -5
- package/packages/omo-codex/scripts/install-cli-args.test.mjs +82 -1
- package/packages/omo-codex/scripts/install-config-preservation.test.mjs +43 -0
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +14 -1
- package/packages/omo-codex/scripts/install-config.test.mjs +49 -1
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +84 -0
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +51 -0
- package/packages/omo-codex/scripts/install-local.mjs +42 -40
- package/packages/omo-codex/scripts/install-local.test.mjs +17 -241
- package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +162 -0
- package/packages/omo-codex/scripts/install-packaged-local.test.mjs +10 -6
- package/packages/omo-codex/scripts/install-project-local-cleanup.test.mjs +73 -2
- package/packages/omo-codex/scripts/sync-telemetry-component.mjs +1 -0
- package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
- package/packages/shared-skills/skills/git-master/SKILL.md +100 -0
- package/packages/shared-skills/skills/git-master/agents/openai.yaml +13 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +119 -14
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +4 -2
- package/packages/shared-skills/skills/programming/references/go/concurrency.md +2 -2
- package/packages/shared-skills/skills/programming/references/python/async-anyio.md +6 -6
- package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +12 -12
- package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +7 -7
- package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
- package/packages/shared-skills/skills/review-work/SKILL.md +55 -33
- package/packages/shared-skills/skills/start-work/SKILL.md +76 -19
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +770 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +219 -0
- package/packages/shared-skills/skills/visual-qa/scripts/ansi.test.ts +45 -0
- package/packages/shared-skills/skills/visual-qa/scripts/ansi.ts +17 -0
- package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +73 -0
- package/packages/shared-skills/skills/visual-qa/scripts/cli.ts +82 -0
- package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.test.ts +60 -0
- package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.ts +72 -0
- package/packages/shared-skills/skills/visual-qa/scripts/image-diff.test.ts +70 -0
- package/packages/shared-skills/skills/visual-qa/scripts/image-diff.ts +109 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-crc.ts +27 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-decode.test.ts +44 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-decode.ts +206 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-synth.ts +57 -0
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +83 -0
- package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.test.ts +57 -0
- package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.ts +88 -0
- package/packages/shared-skills/skills/visual-qa/scripts/types.ts +54 -0
- package/postinstall.mjs +24 -1
- package/dist/agents/custom-agent-summaries.d.ts +0 -8
- package/dist/agents/hephaestus/gpt-5-3-codex.d.ts +0 -20
- package/dist/agents/prometheus/gemini.d.ts +0 -1
- package/dist/agents/prometheus/gpt.d.ts +0 -1
- package/dist/agents/sisyphus-junior/gpt-5-3-codex.d.ts +0 -8
- package/dist/features/background-agent/session-route.d.ts +0 -12
- package/dist/features/background-agent/spawner/parent-directory-resolver.d.ts +0 -6
- package/dist/features/background-agent/state.d.ts +0 -35
- package/dist/features/claude-tasks/session-storage.d.ts +0 -9
- package/dist/features/mcp-oauth/resource-indicator.d.ts +0 -2
- package/dist/features/mcp-oauth/schema.d.ts +0 -6
- package/dist/features/opencode-skill-loader/async-loader.d.ts +0 -6
- package/dist/features/opencode-skill-loader/blocking.d.ts +0 -2
- package/dist/features/opencode-skill-loader/discover-worker.d.ts +0 -1
- package/dist/hooks/session-recovery/recover-empty-content-message-sdk.d.ts +0 -13
- package/dist/shared/bun-hash-shim.d.ts +0 -1
- package/dist/tools/delegate-task/resolve-call-id.d.ts +0 -2
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -383
- /package/packages/lsp-tools-mcp/dist/lsp/{utils.d.ts → startup-failure.d.ts} +0 -0
- /package/packages/lsp-tools-mcp/dist/lsp/{utils.js → startup-failure.js} +0 -0
|
@@ -9,7 +9,7 @@ import { ensureCodexReasoningConfig, migrateCodexConfig } from "../scripts/migra
|
|
|
9
9
|
test("#given stale root reasoning config #when ensuring config #then replaces stale values without duplicate keys", () => {
|
|
10
10
|
const result = ensureCodexReasoningConfig(
|
|
11
11
|
[
|
|
12
|
-
'model = "gpt-5.
|
|
12
|
+
'model = "gpt-5.5"',
|
|
13
13
|
"model_context_window = 272000",
|
|
14
14
|
'model_reasoning_effort = "low"',
|
|
15
15
|
'plan_mode_reasoning_effort = "medium"',
|
|
@@ -32,6 +32,29 @@ test("#given stale root reasoning config #when ensuring config #then replaces st
|
|
|
32
32
|
assert.match(result, /\[features\]/);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
+
test("#given section settings reuse managed root keys #when ensuring config #then section settings are preserved", () => {
|
|
36
|
+
const result = ensureCodexReasoningConfig(
|
|
37
|
+
[
|
|
38
|
+
'model = "gpt-5.5"',
|
|
39
|
+
"model_context_window = 272000",
|
|
40
|
+
"",
|
|
41
|
+
"[model_providers.openai]",
|
|
42
|
+
'model = "provider-scoped-value"',
|
|
43
|
+
"model_context_window = 123456",
|
|
44
|
+
"",
|
|
45
|
+
"[profiles.review]",
|
|
46
|
+
'model_reasoning_effort = "medium"',
|
|
47
|
+
'plan_mode_reasoning_effort = "medium"',
|
|
48
|
+
"",
|
|
49
|
+
].join("\n"),
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
assert.match(result, /^model = "gpt-5\.5"$/m);
|
|
53
|
+
assert.match(result, /^model_context_window = 400000$/m);
|
|
54
|
+
assert.match(result, /\[model_providers\.openai\]\nmodel = "provider-scoped-value"\nmodel_context_window = 123456/);
|
|
55
|
+
assert.match(result, /\[profiles\.review\]\nmodel_reasoning_effort = "medium"\nplan_mode_reasoning_effort = "medium"/);
|
|
56
|
+
});
|
|
57
|
+
|
|
35
58
|
test("#given project .codex is a symlink #when migrating #then project config is skipped", async (t) => {
|
|
36
59
|
if (!(await canCreateSymlink("dir"))) t.skip("symbolic links are unavailable in this environment");
|
|
37
60
|
|
|
@@ -47,8 +70,8 @@ test("#given project .codex is a symlink #when migrating #then project config is
|
|
|
47
70
|
await mkdir(projectCodexDirectory, { recursive: true });
|
|
48
71
|
await mkdir(dirname(projectConfigTarget), { recursive: true });
|
|
49
72
|
await mkdir(projectNested, { recursive: true });
|
|
50
|
-
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.
|
|
51
|
-
await writeFile(projectConfigTarget, 'model = "gpt-5.
|
|
73
|
+
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
74
|
+
await writeFile(projectConfigTarget, 'model = "gpt-5.4"\nmodel_context_window = 272000\n');
|
|
52
75
|
await rm(join(project, ".codex"), { recursive: true, force: true });
|
|
53
76
|
await symlink(projectCodexDirectory, join(project, ".codex"), "dir");
|
|
54
77
|
|
|
@@ -61,7 +84,7 @@ test("#given project .codex is a symlink #when migrating #then project config is
|
|
|
61
84
|
});
|
|
62
85
|
|
|
63
86
|
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
64
|
-
assert.match(await readFile(projectConfig, "utf8"), /model = "gpt-5\.
|
|
87
|
+
assert.match(await readFile(projectConfig, "utf8"), /model = "gpt-5\.4"/);
|
|
65
88
|
});
|
|
66
89
|
|
|
67
90
|
test("#given project config.toml is a symlink #when migrating #then project config is skipped", async (t) => {
|
|
@@ -76,8 +99,8 @@ test("#given project config.toml is a symlink #when migrating #then project conf
|
|
|
76
99
|
|
|
77
100
|
await mkdir(codexHome, { recursive: true });
|
|
78
101
|
await mkdir(projectConfigDirectory, { recursive: true });
|
|
79
|
-
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.
|
|
80
|
-
await writeFile(realConfigSource, 'model = "gpt-5.
|
|
102
|
+
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
103
|
+
await writeFile(realConfigSource, 'model = "gpt-5.4"\nmodel_context_window = 272000\n');
|
|
81
104
|
await symlink(realConfigSource, projectConfig, "file");
|
|
82
105
|
|
|
83
106
|
const result = await migrateCodexConfig({
|
|
@@ -89,7 +112,7 @@ test("#given project config.toml is a symlink #when migrating #then project conf
|
|
|
89
112
|
});
|
|
90
113
|
|
|
91
114
|
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
92
|
-
assert.match(await readFile(realConfigSource, "utf8"), /model = "gpt-5\.
|
|
115
|
+
assert.match(await readFile(realConfigSource, "utf8"), /model = "gpt-5\.4"/);
|
|
93
116
|
});
|
|
94
117
|
|
|
95
118
|
test("#given global and project-local stale Codex configs #when migrating #then both configs are forced to current defaults", async () => {
|
|
@@ -99,8 +122,8 @@ test("#given global and project-local stale Codex configs #when migrating #then
|
|
|
99
122
|
const projectConfig = join(root, "project", ".codex", "config.toml");
|
|
100
123
|
await mkdir(codexHome, { recursive: true });
|
|
101
124
|
await mkdir(dirname(projectConfig), { recursive: true });
|
|
102
|
-
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.
|
|
103
|
-
await writeFile(projectConfig, 'model = "gpt-5.
|
|
125
|
+
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
126
|
+
await writeFile(projectConfig, 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
104
127
|
|
|
105
128
|
const result = await migrateCodexConfig({
|
|
106
129
|
env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json") },
|
|
@@ -112,6 +135,51 @@ test("#given global and project-local stale Codex configs #when migrating #then
|
|
|
112
135
|
assert.match(await readFile(projectConfig, "utf8"), /model_context_window = 400000/);
|
|
113
136
|
});
|
|
114
137
|
|
|
138
|
+
test("#given model catalog is unavailable and stale 272k config #when migrating #then fallback catalog still upgrades it", async () => {
|
|
139
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-fallback-catalog-"));
|
|
140
|
+
const codexHome = join(root, "codex-home");
|
|
141
|
+
const missingCatalog = join(root, "missing-model-catalog.json");
|
|
142
|
+
await mkdir(codexHome, { recursive: true });
|
|
143
|
+
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
144
|
+
|
|
145
|
+
const result = await migrateCodexConfig({
|
|
146
|
+
env: {
|
|
147
|
+
CODEX_HOME: codexHome,
|
|
148
|
+
LAZYCODEX_MODEL_CATALOG_PATH: missingCatalog,
|
|
149
|
+
LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
|
|
150
|
+
},
|
|
151
|
+
cwd: root,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const content = await readFile(join(codexHome, "config.toml"), "utf8");
|
|
155
|
+
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
156
|
+
assert.match(content, /model = "gpt-5\.5"/);
|
|
157
|
+
assert.match(content, /model_context_window = 400000/);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("#given model catalog is malformed and stale config #when migrating #then fallback catalog still upgrades it", async () => {
|
|
161
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-malformed-catalog-"));
|
|
162
|
+
const codexHome = join(root, "codex-home");
|
|
163
|
+
const catalogPath = join(root, "model-catalog.json");
|
|
164
|
+
await mkdir(codexHome, { recursive: true });
|
|
165
|
+
await writeFile(catalogPath, "{not-json");
|
|
166
|
+
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
167
|
+
|
|
168
|
+
const result = await migrateCodexConfig({
|
|
169
|
+
env: {
|
|
170
|
+
CODEX_HOME: codexHome,
|
|
171
|
+
LAZYCODEX_MODEL_CATALOG_PATH: catalogPath,
|
|
172
|
+
LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
|
|
173
|
+
},
|
|
174
|
+
cwd: root,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const content = await readFile(join(codexHome, "config.toml"), "utf8");
|
|
178
|
+
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
179
|
+
assert.match(content, /model = "gpt-5\.5"/);
|
|
180
|
+
assert.match(content, /model_context_window = 400000/);
|
|
181
|
+
});
|
|
182
|
+
|
|
115
183
|
test("#given user-customized Codex model config #when migrating #then user values are preserved", async () => {
|
|
116
184
|
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-custom-"));
|
|
117
185
|
const codexHome = join(root, "codex-home");
|
|
@@ -140,6 +208,43 @@ test("#given user-customized Codex model config #when migrating #then user value
|
|
|
140
208
|
assert.match(content, /plan_mode_reasoning_effort = "medium"/);
|
|
141
209
|
});
|
|
142
210
|
|
|
211
|
+
test("#given managed config state is malformed #when migrating #then migration ignores stale state safely", async () => {
|
|
212
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-malformed-state-"));
|
|
213
|
+
const codexHome = join(root, "codex-home");
|
|
214
|
+
const statePath = join(root, "model-state.json");
|
|
215
|
+
await mkdir(codexHome, { recursive: true });
|
|
216
|
+
await writeFile(statePath, "[broken-json");
|
|
217
|
+
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
218
|
+
|
|
219
|
+
const result = await migrateCodexConfig({
|
|
220
|
+
env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: statePath },
|
|
221
|
+
cwd: root,
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const content = await readFile(join(codexHome, "config.toml"), "utf8");
|
|
225
|
+
const state = JSON.parse(await readFile(statePath, "utf8"));
|
|
226
|
+
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
227
|
+
assert.match(content, /model_context_window = 400000/);
|
|
228
|
+
assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test("#given managed config state path has surrounding whitespace #when migrating #then trimmed state path is used", async () => {
|
|
232
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-trimmed-state-"));
|
|
233
|
+
const codexHome = join(root, "codex-home");
|
|
234
|
+
const statePath = join(root, "model-state.json");
|
|
235
|
+
await mkdir(codexHome, { recursive: true });
|
|
236
|
+
await writeFile(join(codexHome, "config.toml"), 'model = "gpt-5.5"\nmodel_context_window = 272000\n');
|
|
237
|
+
|
|
238
|
+
const result = await migrateCodexConfig({
|
|
239
|
+
env: { CODEX_HOME: codexHome, LAZYCODEX_MODEL_CATALOG_STATE_PATH: ` ${statePath} ` },
|
|
240
|
+
cwd: root,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
const state = JSON.parse(await readFile(statePath, "utf8"));
|
|
244
|
+
assert.deepEqual(result.changed, [join(codexHome, "config.toml")]);
|
|
245
|
+
assert.equal(state.files[join(codexHome, "config.toml")].managed, true);
|
|
246
|
+
});
|
|
247
|
+
|
|
143
248
|
test("#given managed catalog state #when catalog version advances #then only previously managed config is updated", async () => {
|
|
144
249
|
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-catalog-state-"));
|
|
145
250
|
const codexHome = join(root, "codex-home");
|
|
@@ -205,6 +310,57 @@ test("#given managed catalog state #when catalog version advances #then only pre
|
|
|
205
310
|
assert.match(content, /model_context_window = 400000/);
|
|
206
311
|
});
|
|
207
312
|
|
|
313
|
+
test("#given config already matches current catalog #when catalog version advances for role-only changes #then managed state is preserved", async () => {
|
|
314
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-config-current-managed-"));
|
|
315
|
+
const codexHome = join(root, "codex-home");
|
|
316
|
+
const catalogPath = join(root, "catalog.json");
|
|
317
|
+
const statePath = join(root, "model-state.json");
|
|
318
|
+
const configPath = join(codexHome, "config.toml");
|
|
319
|
+
await mkdir(codexHome, { recursive: true });
|
|
320
|
+
await writeFile(
|
|
321
|
+
configPath,
|
|
322
|
+
[
|
|
323
|
+
'model = "gpt-5.5"',
|
|
324
|
+
"model_context_window = 400000",
|
|
325
|
+
'model_reasoning_effort = "high"',
|
|
326
|
+
'plan_mode_reasoning_effort = "xhigh"',
|
|
327
|
+
"",
|
|
328
|
+
].join("\n"),
|
|
329
|
+
);
|
|
330
|
+
await writeFile(
|
|
331
|
+
catalogPath,
|
|
332
|
+
JSON.stringify(
|
|
333
|
+
{
|
|
334
|
+
version: "test.role-only",
|
|
335
|
+
current: {
|
|
336
|
+
model: "gpt-5.5",
|
|
337
|
+
model_context_window: 400000,
|
|
338
|
+
model_reasoning_effort: "high",
|
|
339
|
+
plan_mode_reasoning_effort: "xhigh",
|
|
340
|
+
},
|
|
341
|
+
roles: { verifier: { model: "gpt-5.5", model_reasoning_effort: "high" } },
|
|
342
|
+
managedProfiles: [],
|
|
343
|
+
},
|
|
344
|
+
null,
|
|
345
|
+
2,
|
|
346
|
+
),
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
const result = await migrateCodexConfig({
|
|
350
|
+
env: {
|
|
351
|
+
CODEX_HOME: codexHome,
|
|
352
|
+
LAZYCODEX_MODEL_CATALOG_PATH: catalogPath,
|
|
353
|
+
LAZYCODEX_MODEL_CATALOG_STATE_PATH: statePath,
|
|
354
|
+
},
|
|
355
|
+
cwd: root,
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
const state = JSON.parse(await readFile(statePath, "utf8"));
|
|
359
|
+
assert.deepEqual(result.changed, []);
|
|
360
|
+
assert.equal(state.files[configPath].managed, true);
|
|
361
|
+
assert.equal(state.files[configPath].catalogVersion, "test.role-only");
|
|
362
|
+
});
|
|
363
|
+
|
|
208
364
|
async function canCreateSymlink(type) {
|
|
209
365
|
const root = await mkdtemp(join(tmpdir(), "lazycodex-symlink-capability-"));
|
|
210
366
|
const target = join(root, "target");
|
|
@@ -27,22 +27,3 @@ test("#given Codex Light install docs #when inspected #then lazycodex is npm-fir
|
|
|
27
27
|
assert.doesNotMatch(text, /\bbunx lazycodex-ai\b/, `${path} should not require Bun for lazycodex`);
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
|
-
|
|
31
|
-
test("#given cleanup troubleshooting docs #when inspected #then project-local cleanup and command delegation are documented", async () => {
|
|
32
|
-
// given
|
|
33
|
-
const files = [
|
|
34
|
-
join(repoRoot, "README.md"),
|
|
35
|
-
join(repoRoot, "docs", "guide", "installation.md"),
|
|
36
|
-
join(repoRoot, "packages", "omo-codex", "README.md"),
|
|
37
|
-
];
|
|
38
|
-
|
|
39
|
-
// when
|
|
40
|
-
const docs = await Promise.all(files.map(async (path) => [path, await readFile(path, "utf8")]));
|
|
41
|
-
|
|
42
|
-
// then
|
|
43
|
-
for (const [path, text] of docs) {
|
|
44
|
-
assert.match(text, /\bnpx lazycodex-ai cleanup\b/, `${path} should document the LazyCodex cleanup command`);
|
|
45
|
-
assert.match(text, /project-local .*\.codex\/config\.toml/i, `${path} should mention project-local config repair`);
|
|
46
|
-
assert.match(text, /\.codex.*\.omx|\.omx.*\.codex/s, `${path} should distinguish project-local .codex and .omx artifacts`);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
8
|
+
const repoRoot = dirname(dirname(dirname(pluginRoot)));
|
|
9
|
+
const startWorkSkillPaths = [
|
|
10
|
+
join(repoRoot, "packages", "shared-skills", "skills", "start-work", "SKILL.md"),
|
|
11
|
+
];
|
|
12
|
+
const packagedStartWorkSkillPath = join(pluginRoot, "skills", "start-work", "SKILL.md");
|
|
13
|
+
const packagedReviewWorkSkillPath = join(pluginRoot, "skills", "review-work", "SKILL.md");
|
|
14
|
+
const hephaestusRulePath = join(pluginRoot, "components", "rules", "bundled-rules", "hephaestus.md");
|
|
15
|
+
const stopHookPath = join(
|
|
16
|
+
pluginRoot,
|
|
17
|
+
"components",
|
|
18
|
+
"start-work-continuation",
|
|
19
|
+
"src",
|
|
20
|
+
"codex-hook.ts",
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
test("#given start-work skill without selectable plan #when inspected #then bootstraps ulw-plan before execution", async () => {
|
|
24
|
+
// given
|
|
25
|
+
const missing = [];
|
|
26
|
+
|
|
27
|
+
// when
|
|
28
|
+
for (const skillPath of startWorkSkillPaths) {
|
|
29
|
+
const skill = await readFile(skillPath, "utf8");
|
|
30
|
+
if (
|
|
31
|
+
!/(?:no|zero)[^.]{0,120}(?:selectable|matching|existing|prometheus)?[^.]{0,120}plans?[^.]{0,160}(?:\$?ulw-plan|ulw-plan skill|spawn_agent\([^)]*ulw-plan)/is.test(
|
|
32
|
+
skill,
|
|
33
|
+
) ||
|
|
34
|
+
!/(?:bootstrap|create|generate|draft)[^.]{0,120}(?:plan|prometheus plan)[^.]{0,120}(?:before|prior to)[^.]{0,80}(?:execution|implementation|boulder)/is.test(
|
|
35
|
+
skill,
|
|
36
|
+
)
|
|
37
|
+
) {
|
|
38
|
+
missing.push(skillPath);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// then
|
|
43
|
+
assert.deepEqual(missing, []);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("#given worker done claim #when start-work contract is inspected #then adversarial verification gates fully done", async () => {
|
|
47
|
+
// given
|
|
48
|
+
const missing = [];
|
|
49
|
+
|
|
50
|
+
// when
|
|
51
|
+
for (const skillPath of startWorkSkillPaths) {
|
|
52
|
+
const skill = await readFile(skillPath, "utf8");
|
|
53
|
+
if (
|
|
54
|
+
!/DoneClaim/i.test(skill) ||
|
|
55
|
+
!/worker done claim/i.test(skill) ||
|
|
56
|
+
!/stale_state/.test(skill) ||
|
|
57
|
+
!/misleading_success_output/.test(skill) ||
|
|
58
|
+
!/dirty_worktree/.test(skill) ||
|
|
59
|
+
!/Plan reread/i.test(skill) ||
|
|
60
|
+
!/Manual-QA/i.test(skill) ||
|
|
61
|
+
!/Adversarial QA/i.test(skill) ||
|
|
62
|
+
!/Cleanup/i.test(skill) ||
|
|
63
|
+
!/Only after verification passes/i.test(skill)
|
|
64
|
+
) {
|
|
65
|
+
missing.push(skillPath);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// then
|
|
70
|
+
assert.deepEqual(missing, []);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("#given packaged start-work completion surfaces #when inspected #then global review and debugging gate blocks completion", async () => {
|
|
74
|
+
// given
|
|
75
|
+
const [startWorkSkill, reviewWorkSkill, hephaestusRule] = await Promise.all([
|
|
76
|
+
readFile(packagedStartWorkSkillPath, "utf8"),
|
|
77
|
+
readFile(packagedReviewWorkSkillPath, "utf8"),
|
|
78
|
+
readFile(hephaestusRulePath, "utf8"),
|
|
79
|
+
]);
|
|
80
|
+
|
|
81
|
+
// then
|
|
82
|
+
assert.match(startWorkSkill, /Global Review and Debugging Gate/);
|
|
83
|
+
assert.match(startWorkSkill, /\breview-work\b/);
|
|
84
|
+
assert.match(startWorkSkill, /\bdebugging\b/);
|
|
85
|
+
assert.match(startWorkSkill, /inconclusive/i);
|
|
86
|
+
assert.match(startWorkSkill, /redact|mask/i);
|
|
87
|
+
assert.match(startWorkSkill, /raw (?:tokens|credentials|auth headers|cookies)/i);
|
|
88
|
+
assert.match(startWorkSkill, /ORCHESTRATION COMPLETE/);
|
|
89
|
+
assert.match(reviewWorkSkill, /debugging/i);
|
|
90
|
+
assert.match(reviewWorkSkill, /inconclusive/i);
|
|
91
|
+
assert.match(hephaestusRule, /Global Review and Debugging Gate/);
|
|
92
|
+
assert.match(hephaestusRule, /redact.*secrets.*PII/s);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("#given start-work continuation hook #when inspected #then it remains Boulder-only without planning bootstrap logic", async () => {
|
|
96
|
+
// given
|
|
97
|
+
const hook = await readFile(stopHookPath, "utf8");
|
|
98
|
+
|
|
99
|
+
// then
|
|
100
|
+
assert.match(hook, /readContinuationState/);
|
|
101
|
+
assert.match(hook, /START_WORK_CONTINUATION_DIRECTIVE/);
|
|
102
|
+
assert.match(hook, /decision:\s*"block"/);
|
|
103
|
+
assert.doesNotMatch(
|
|
104
|
+
hook,
|
|
105
|
+
/\bulw-plan\b|\bspawn_agent\b|\brequest_user_input\b|bootstrap|selectable plan|Phase 1|Create or update Boulder state/i,
|
|
106
|
+
);
|
|
107
|
+
});
|
|
@@ -10,6 +10,7 @@ const SKILLS = [
|
|
|
10
10
|
"review-work",
|
|
11
11
|
"start-work",
|
|
12
12
|
"ulw-loop",
|
|
13
|
+
"ulw-plan",
|
|
13
14
|
];
|
|
14
15
|
|
|
15
16
|
const AGENT_FILES = [
|
|
@@ -28,13 +29,16 @@ test("#given orchestration skills #when inspected #then Codex subagent delegatio
|
|
|
28
29
|
if (
|
|
29
30
|
!/TASK:/.test(text) ||
|
|
30
31
|
!/fork_turns:\s*"none"/.test(text) ||
|
|
31
|
-
!/wait_agent.*
|
|
32
|
-
!/
|
|
32
|
+
!/wait_agent.*mailbox signals/s.test(text) ||
|
|
33
|
+
!/Fallback only when/.test(text) ||
|
|
33
34
|
!/respawn.*smaller/s.test(text) ||
|
|
34
|
-
!/
|
|
35
|
+
!/schema only accepts `task_name`, `message`, and `fork_turns`/s.test(text) ||
|
|
35
36
|
!/Plan and reviewer agents may run for a long time/.test(text) ||
|
|
36
37
|
!/short wait_agent cycles/.test(text) ||
|
|
37
|
-
!/single long blocking wait/.test(text)
|
|
38
|
+
!/single long blocking wait/.test(text) ||
|
|
39
|
+
!/A timeout only means no new mailbox update arrived/i.test(text) ||
|
|
40
|
+
!/WORKING:/.test(text) ||
|
|
41
|
+
!/single `list_agents`/.test(text)
|
|
38
42
|
) {
|
|
39
43
|
missing.push(skillPath);
|
|
40
44
|
}
|
|
@@ -53,9 +57,67 @@ test("#given ultrawork directive #when inspected #then reviewer fallback keeps a
|
|
|
53
57
|
|
|
54
58
|
// then
|
|
55
59
|
assert.doesNotMatch(text, /any `gpt-5\.2`\s+xhigh reviewer/);
|
|
56
|
-
assert.match(text, /
|
|
57
|
-
assert.match(text, /
|
|
58
|
-
assert.match(text, /
|
|
60
|
+
assert.match(text, /self-contained reviewer/);
|
|
61
|
+
assert.match(text, /schema cannot select.*TOML-backed reviewer role/s);
|
|
62
|
+
assert.match(text, /paste the reviewer requirements into\s+the message/s);
|
|
63
|
+
assert.match(text, /timeout only means no new mailbox update arrived/i);
|
|
64
|
+
assert.match(text, /WORKING:/);
|
|
65
|
+
assert.match(text, /single `list_agents`/);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("#given ultrawork directive #when inspected #then dependent subagent transitions are blocked", async () => {
|
|
69
|
+
// given
|
|
70
|
+
const directivePath = "components/ultrawork/directive.md";
|
|
71
|
+
|
|
72
|
+
// when
|
|
73
|
+
const text = await readFile(join(root, directivePath), "utf8");
|
|
74
|
+
|
|
75
|
+
// then
|
|
76
|
+
assert.match(text, /Subagent-dependent transition barrier/);
|
|
77
|
+
assert.match(text, /Do not mark.*update_plan.*completed.*active child/s);
|
|
78
|
+
assert.match(text, /Do not start dependent implementation.*audit.*research.*review.*integrated/s);
|
|
79
|
+
assert.match(text, /Do not write the final answer.*active child agents/s);
|
|
80
|
+
assert.match(text, /two silent waits.*TASK STILL ACTIVE/s);
|
|
81
|
+
assert.match(text, /four silent or ack-only checks.*inconclusive/s);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("#given ultrawork directive #when inspected #then TOML-backed routing is treated as unverified when native spawn cannot select it", async () => {
|
|
85
|
+
// given
|
|
86
|
+
const directivePath = "components/ultrawork/directive.md";
|
|
87
|
+
|
|
88
|
+
// when
|
|
89
|
+
const text = await readFile(join(root, directivePath), "utf8");
|
|
90
|
+
|
|
91
|
+
// then
|
|
92
|
+
assert.match(text, /TOML-backed subagent routing compatibility/);
|
|
93
|
+
assert.match(text, /routing-unverified/);
|
|
94
|
+
assert.match(text, /schema accepts only `task_name`, `message`, and\s+`fork_turns`/s);
|
|
95
|
+
assert.match(text, /cannot select a TOML-backed role, model, reasoning\s+effort, or `service_tier`/s);
|
|
96
|
+
assert.match(text, /paste the\s+role requirements into the message/s);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("#given ulw-loop workflow #when inspected #then stale review refresh keeps policy changes narrow", async () => {
|
|
100
|
+
// given
|
|
101
|
+
const workflowPaths = [
|
|
102
|
+
"components/ulw-loop/skills/ulw-loop/references/full-workflow.md",
|
|
103
|
+
"skills/ulw-loop/references/full-workflow.md",
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
// when
|
|
107
|
+
const missing = [];
|
|
108
|
+
for (const workflowPath of workflowPaths) {
|
|
109
|
+
const text = await readFile(join(root, workflowPath), "utf8");
|
|
110
|
+
if (
|
|
111
|
+
!/refresh current branch\/PR\/issue state/.test(text) ||
|
|
112
|
+
!/preserve existing ordering\/policy/.test(text) ||
|
|
113
|
+
!/separate compatibility detection from policy changes/.test(text)
|
|
114
|
+
) {
|
|
115
|
+
missing.push(workflowPath);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// then
|
|
120
|
+
assert.deepEqual(missing, []);
|
|
59
121
|
});
|
|
60
122
|
|
|
61
123
|
test("#given ultrawork agents #when inspected #then inter-agent commentary is treated as assignments", async () => {
|
|
@@ -74,3 +136,16 @@ test("#given ultrawork agents #when inspected #then inter-agent commentary is tr
|
|
|
74
136
|
// then
|
|
75
137
|
assert.deepEqual(missing, []);
|
|
76
138
|
});
|
|
139
|
+
|
|
140
|
+
test("#given reviewer receives a targeted still-active followup #when prompt is inspected #then it must fail loud", async () => {
|
|
141
|
+
// given
|
|
142
|
+
const reviewerPath = "components/ultrawork/agents/codex-ultrawork-reviewer.toml";
|
|
143
|
+
|
|
144
|
+
// when
|
|
145
|
+
const text = await readFile(join(root, reviewerPath), "utf8");
|
|
146
|
+
|
|
147
|
+
// then
|
|
148
|
+
assert.match(text, /TASK STILL ACTIVE:/);
|
|
149
|
+
assert.match(text, /BLOCKED: <reason>/);
|
|
150
|
+
assert.match(text, /instead of continuing silently/);
|
|
151
|
+
});
|
|
@@ -14,15 +14,18 @@ async function readJson(path) {
|
|
|
14
14
|
return JSON.parse(await readFile(path, "utf8"));
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
test("#given
|
|
17
|
+
test("#given source package versions and component without hooks #when hook status messages sync #then source versions are preserved", async () => {
|
|
18
18
|
// given
|
|
19
|
-
const
|
|
19
|
+
const repoRoot = await mkdtemp(join(tmpdir(), "omo-codex-hook-status-"));
|
|
20
|
+
const root = join(repoRoot, "packages", "omo-codex", "plugin");
|
|
21
|
+
await mkdir(root, { recursive: true });
|
|
20
22
|
await mkdir(join(root, ".codex-plugin"), { recursive: true });
|
|
21
23
|
await mkdir(join(root, "hooks"), { recursive: true });
|
|
22
24
|
await mkdir(join(root, "components", "comment-checker", "hooks"), { recursive: true });
|
|
23
25
|
await mkdir(join(root, "components", "lsp", "hooks"), { recursive: true });
|
|
24
26
|
await mkdir(join(root, "components", "git-bash"), { recursive: true });
|
|
25
27
|
await mkdir(join(root, "components", "stale-build-output", "dist"), { recursive: true });
|
|
28
|
+
await writeJson(join(repoRoot, "package.json"), { version: "4.7.5" });
|
|
26
29
|
await writeJson(join(root, ".codex-plugin", "plugin.json"), { version: "0.1.0" });
|
|
27
30
|
await writeJson(join(root, "components", "comment-checker", "package.json"), { version: "0.1.1" });
|
|
28
31
|
await writeJson(join(root, "components", "lsp", "package.json"), { version: "0.2.0" });
|
|
@@ -35,12 +38,12 @@ test("#given a component without hooks #when hook status messages sync #then bui
|
|
|
35
38
|
{
|
|
36
39
|
type: "command",
|
|
37
40
|
command: 'node "${PLUGIN_ROOT}/components/comment-checker/dist/cli.js" hook post-tool-use',
|
|
38
|
-
statusMessage: "LazyCodex(
|
|
41
|
+
statusMessage: "LazyCodex(stale): Checking Comments",
|
|
39
42
|
},
|
|
40
43
|
{
|
|
41
44
|
type: "command",
|
|
42
45
|
command: 'node "${PLUGIN_ROOT}/components/lsp/dist/cli.js" hook post-tool-use',
|
|
43
|
-
statusMessage: "LazyCodex(
|
|
46
|
+
statusMessage: "LazyCodex(stale): Checking LSP Diagnostics",
|
|
44
47
|
},
|
|
45
48
|
],
|
|
46
49
|
},
|
|
@@ -55,7 +58,7 @@ test("#given a component without hooks #when hook status messages sync #then bui
|
|
|
55
58
|
{
|
|
56
59
|
type: "command",
|
|
57
60
|
command: 'node "${PLUGIN_ROOT}/dist/cli.js" hook post-tool-use',
|
|
58
|
-
statusMessage: "LazyCodex(
|
|
61
|
+
statusMessage: "LazyCodex(stale): Checking Comments",
|
|
59
62
|
},
|
|
60
63
|
],
|
|
61
64
|
},
|
|
@@ -70,7 +73,7 @@ test("#given a component without hooks #when hook status messages sync #then bui
|
|
|
70
73
|
{
|
|
71
74
|
type: "command",
|
|
72
75
|
command: 'node "${PLUGIN_ROOT}/dist/cli.js" hook post-tool-use',
|
|
73
|
-
statusMessage: "LazyCodex(
|
|
76
|
+
statusMessage: "LazyCodex(stale): Checking LSP Diagnostics",
|
|
74
77
|
},
|
|
75
78
|
],
|
|
76
79
|
},
|
|
@@ -90,3 +93,52 @@ test("#given a component without hooks #when hook status messages sync #then bui
|
|
|
90
93
|
assert.equal(componentHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(0.1.1): Checking Comments");
|
|
91
94
|
assert.equal(lspHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(0.2.0): Checking LSP Diagnostics");
|
|
92
95
|
});
|
|
96
|
+
|
|
97
|
+
test("#given release version override #when hook status messages sync #then aggregate hooks use release version", async () => {
|
|
98
|
+
// given
|
|
99
|
+
const root = await mkdtemp(join(tmpdir(), "omo-codex-hook-status-release-"));
|
|
100
|
+
await mkdir(join(root, ".codex-plugin"), { recursive: true });
|
|
101
|
+
await mkdir(join(root, "hooks"), { recursive: true });
|
|
102
|
+
await mkdir(join(root, "components", "comment-checker", "hooks"), { recursive: true });
|
|
103
|
+
await writeJson(join(root, ".codex-plugin", "plugin.json"), { version: "0.1.0" });
|
|
104
|
+
await writeJson(join(root, "components", "comment-checker", "package.json"), { version: "0.1.1" });
|
|
105
|
+
await writeJson(join(root, "hooks", "hooks.json"), {
|
|
106
|
+
hooks: {
|
|
107
|
+
PostToolUse: [
|
|
108
|
+
{
|
|
109
|
+
hooks: [
|
|
110
|
+
{
|
|
111
|
+
type: "command",
|
|
112
|
+
command: 'node "${PLUGIN_ROOT}/components/comment-checker/dist/cli.js" hook post-tool-use',
|
|
113
|
+
statusMessage: "LazyCodex(stale): Checking Comments",
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
await writeJson(join(root, "components", "comment-checker", "hooks", "hooks.json"), {
|
|
121
|
+
hooks: {
|
|
122
|
+
PostToolUse: [
|
|
123
|
+
{
|
|
124
|
+
hooks: [
|
|
125
|
+
{
|
|
126
|
+
type: "command",
|
|
127
|
+
command: 'node "${PLUGIN_ROOT}/dist/cli.js" hook post-tool-use',
|
|
128
|
+
statusMessage: "LazyCodex(stale): Checking Comments",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// when
|
|
137
|
+
await syncHookStatusMessages(root, { releaseVersion: "4.8.0" });
|
|
138
|
+
|
|
139
|
+
// then
|
|
140
|
+
const aggregateHooks = await readJson(join(root, "hooks", "hooks.json"));
|
|
141
|
+
const componentHooks = await readJson(join(root, "components", "comment-checker", "hooks", "hooks.json"));
|
|
142
|
+
assert.equal(aggregateHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(4.8.0): Checking Comments");
|
|
143
|
+
assert.equal(componentHooks.hooks.PostToolUse[0].hooks[0].statusMessage, "LazyCodex(4.8.0): Checking Comments");
|
|
144
|
+
});
|