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
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readdir, 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
|
+
import { insertCodexCompatibilityGuidance } from "../scripts/sync-skills.mjs";
|
|
7
|
+
|
|
8
|
+
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
9
|
+
|
|
10
|
+
async function listSkillNames() {
|
|
11
|
+
const skillsRoot = join(root, "skills");
|
|
12
|
+
const entries = await readdir(skillsRoot, { withFileTypes: true });
|
|
13
|
+
return entries
|
|
14
|
+
.filter((entry) => entry.isDirectory())
|
|
15
|
+
.map((entry) => entry.name)
|
|
16
|
+
.sort();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function readSkill(skillName) {
|
|
20
|
+
return readFile(join(root, "skills", skillName, "SKILL.md"), "utf8");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function patternFromParts(parts, flags) {
|
|
24
|
+
return new RegExp(parts.join(""), flags);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
test("#given synced aggregate Codex skills #when they contain OpenCode orchestration examples #then Codex tool compatibility guidance is injected", async () => {
|
|
28
|
+
// given
|
|
29
|
+
const opencodeOnlyToolPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
|
|
30
|
+
|
|
31
|
+
// when / then
|
|
32
|
+
for (const skillName of await listSkillNames()) {
|
|
33
|
+
const content = await readSkill(skillName);
|
|
34
|
+
if (!opencodeOnlyToolPattern.test(content)) continue;
|
|
35
|
+
|
|
36
|
+
const compatibilityMatches = content.match(/## Codex Harness Tool Compatibility/g) ?? [];
|
|
37
|
+
const compatibilityIndex = content.indexOf("## Codex Harness Tool Compatibility");
|
|
38
|
+
assert.notEqual(compatibilityIndex, -1, `${skillName} is missing Codex compatibility guidance`);
|
|
39
|
+
assert.equal(compatibilityMatches.length, 1, `${skillName} must not duplicate Codex compatibility guidance`);
|
|
40
|
+
assert.ok(
|
|
41
|
+
compatibilityIndex < content.search(opencodeOnlyToolPattern),
|
|
42
|
+
`${skillName} must explain Codex tool translation before OpenCode-only examples`,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("#given late variant Codex compatibility guidance #when adapting a skill #then it is moved without duplication", () => {
|
|
48
|
+
// given
|
|
49
|
+
const content = `---
|
|
50
|
+
name: example
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
# Example Skill
|
|
54
|
+
|
|
55
|
+
call_omo_agent(subagent_type="explore", prompt="inspect")
|
|
56
|
+
|
|
57
|
+
## Codex Harness Tool Compatibility
|
|
58
|
+
|
|
59
|
+
Older variant guidance.
|
|
60
|
+
|
|
61
|
+
When translating \`load_skills=[...]\`, name the skills inside the spawned agent's \`message\`.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Next Section
|
|
66
|
+
|
|
67
|
+
task(category="quick", prompt="verify")
|
|
68
|
+
`;
|
|
69
|
+
|
|
70
|
+
// when
|
|
71
|
+
const adapted = insertCodexCompatibilityGuidance(content);
|
|
72
|
+
|
|
73
|
+
// then
|
|
74
|
+
const compatibilityIndex = adapted.indexOf("## Codex Harness Tool Compatibility");
|
|
75
|
+
const firstToolIndex = adapted.search(/\b(?:call_omo_agent|task)\s*\(/);
|
|
76
|
+
assert.notEqual(compatibilityIndex, -1);
|
|
77
|
+
assert.ok(compatibilityIndex < firstToolIndex);
|
|
78
|
+
assert.equal(adapted.match(/## Codex Harness Tool Compatibility/g)?.length, 1);
|
|
79
|
+
assert.doesNotMatch(adapted, /Older variant guidance/);
|
|
80
|
+
assert.doesNotMatch(adapted, /When translating `load_skills=\[\.\.\.\]`/);
|
|
81
|
+
assert.match(adapted, /\n---\n\n## Next Section/);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test("#given early custom Codex compatibility guidance #when adapting a skill #then it is preserved exactly", () => {
|
|
85
|
+
// given
|
|
86
|
+
const content = `---
|
|
87
|
+
name: example
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Codex Harness Tool Compatibility
|
|
91
|
+
|
|
92
|
+
Custom guidance for this skill, including \`dispatchInternalPrompt(...)\`.
|
|
93
|
+
|
|
94
|
+
# Example Skill
|
|
95
|
+
|
|
96
|
+
call_omo_agent(subagent_type="explore", prompt="inspect")
|
|
97
|
+
`;
|
|
98
|
+
|
|
99
|
+
// when
|
|
100
|
+
const adapted = insertCodexCompatibilityGuidance(content);
|
|
101
|
+
|
|
102
|
+
// then
|
|
103
|
+
assert.equal(adapted, content);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("#given synced aggregate Codex skills #when they describe background orchestration #then liveness is framed as progress rather than timeout failure", async () => {
|
|
107
|
+
// given
|
|
108
|
+
const orchestrationPattern = /\b(?:run_in_background|background_output|wait_agent)\b/;
|
|
109
|
+
const requiredPatterns = [
|
|
110
|
+
["working progress message", /WORKING:/],
|
|
111
|
+
["blocked progress message", /BLOCKED:/],
|
|
112
|
+
["mailbox timeout framing", /timeout only means no new mailbox update arrived/],
|
|
113
|
+
["single liveness check", /single `list_agents` check|one `list_agents` check/],
|
|
114
|
+
["polling-loop guard", /Do not use `list_agents` as a polling loop|Do NOT use `list_agents` as a polling loop/],
|
|
115
|
+
["explicit fallback conditions", /Fallback only when|Mark a file for retry only when/],
|
|
116
|
+
];
|
|
117
|
+
const bannedPatterns = [
|
|
118
|
+
["timeout as failure", patternFromParts(["fails or ", "times out"], "i")],
|
|
119
|
+
["failed or timed out", patternFromParts(["failed or ", "timed out"], "i")],
|
|
120
|
+
["two waits heuristic", patternFromParts(["After two ", "waits"])],
|
|
121
|
+
["unresponsive timeout framing", patternFromParts(["timeout", ".*", "un" + "responsive"], "i")],
|
|
122
|
+
["old status-tool warning", patternFromParts(["polling or ", "status tool"])],
|
|
123
|
+
["large status replay wording", patternFromParts(["large agent status", " and latest-message"])],
|
|
124
|
+
["old wait-agent aphorism", patternFromParts(["wait_agent", ".*", "signal, not ", "proof"], "i")],
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
// when / then
|
|
128
|
+
for (const skillName of await listSkillNames()) {
|
|
129
|
+
const content = await readSkill(skillName);
|
|
130
|
+
if (!orchestrationPattern.test(content)) continue;
|
|
131
|
+
|
|
132
|
+
for (const [label, pattern] of requiredPatterns) {
|
|
133
|
+
assert.match(content, pattern, `${skillName} missing ${label}`);
|
|
134
|
+
}
|
|
135
|
+
for (const [label, pattern] of bannedPatterns) {
|
|
136
|
+
assert.doesNotMatch(content, pattern, `${skillName} still has ${label}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test("#given review-work skill #when some lanes do not finish #then aggregate result remains bounded", async () => {
|
|
142
|
+
const content = await readSkill("review-work");
|
|
143
|
+
|
|
144
|
+
assert.match(content, /pending\/PASS\/FAIL\/INCONCLUSIVE/);
|
|
145
|
+
assert.match(content, /Preserve completed lane results immediately/);
|
|
146
|
+
assert.match(content, /ALL 5 lanes have a terminal state/);
|
|
147
|
+
assert.match(content, /REVIEW INCONCLUSIVE - not approved/);
|
|
148
|
+
assert.match(content, /Overall Verdict: PASSED \/ FAILED \/ INCONCLUSIVE/);
|
|
149
|
+
assert.match(content, /PASS\/FAIL\/INCONCLUSIVE \| HIGH\/MED\/LOW/);
|
|
150
|
+
assert.match(content, /Do not spin in repeated/);
|
|
151
|
+
assert.match(content, /Do not use `send_message` as an interrupt/);
|
|
152
|
+
});
|
|
@@ -13,7 +13,9 @@ const expectedSkills = [
|
|
|
13
13
|
"comment-checker",
|
|
14
14
|
"debugging",
|
|
15
15
|
"frontend-ui-ux",
|
|
16
|
+
"git-master",
|
|
16
17
|
"init-deep",
|
|
18
|
+
"lcx-contribute-bug-fix",
|
|
17
19
|
"lcx-report-bug",
|
|
18
20
|
"lsp",
|
|
19
21
|
"programming",
|
|
@@ -22,8 +24,10 @@ const expectedSkills = [
|
|
|
22
24
|
"review-work",
|
|
23
25
|
"rules",
|
|
24
26
|
"start-work",
|
|
27
|
+
"ultraresearch",
|
|
25
28
|
"ulw-loop",
|
|
26
29
|
"ulw-plan",
|
|
30
|
+
"visual-qa",
|
|
27
31
|
];
|
|
28
32
|
|
|
29
33
|
const componentSkillSources = [
|
|
@@ -31,10 +35,12 @@ const componentSkillSources = [
|
|
|
31
35
|
["lsp", "components/lsp/skills/lsp"],
|
|
32
36
|
["rules", "components/rules/skills/rules"],
|
|
33
37
|
["ulw-loop", "components/ulw-loop/skills/ulw-loop"],
|
|
38
|
+
["ulw-plan", "components/ultrawork/skills/ulw-plan"],
|
|
34
39
|
];
|
|
35
40
|
|
|
36
41
|
const codexCompatibilityEndMarkers = [
|
|
37
|
-
"
|
|
42
|
+
"For work likely to exceed one wait cycle, require the child to send `WORKING: <task> - <current phase>` before long passes and `BLOCKED: <reason>` only when progress stops. A `wait_agent` timeout only means no new mailbox update arrived. Treat a running child or latest `WORKING:` message as alive. Do not use `list_agents` as a polling loop. Fallback only when the child is completed without the deliverable, ack-only after followup, explicitly `BLOCKED:`, or no longer running.\n\n",
|
|
43
|
+
"Codex full-history forks inherit parent context, so role-specific behavior must be described in a self-contained `message` and usually should use a non-full-history fork mode such as `fork_turns=\"none\"`. Include any required conversation context, files, diffs, constraints, and requested skill names directly in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
38
44
|
"When translating `load_skills=[...]`, include the requested skill names in the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
39
45
|
"When translating `load_skills=[...]`, name the skills inside the spawned agent's `message`. If a code block below conflicts with this section, this section wins.\n\n",
|
|
40
46
|
];
|
|
@@ -49,6 +55,71 @@ function removeCodexCompatibilityGuidance(content) {
|
|
|
49
55
|
return `${content.slice(0, start)}${content.slice(end + endMarker.length)}`;
|
|
50
56
|
}
|
|
51
57
|
|
|
58
|
+
const startWorkOriginalCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
|
|
59
|
+
|
|
60
|
+
1. Run the plan's final verification commands.
|
|
61
|
+
2. If worktree mode was used, sync \`.omo/\` state back to the main repo, merge or hand off exactly as requested, and remove the worktree only after successful merge or explicit handoff.
|
|
62
|
+
3. Remove or mark the Boulder work as completed.
|
|
63
|
+
4. Print an \`ORCHESTRATION COMPLETE\` block with the plan path, verification commands, artifacts, and cleanup receipts.`;
|
|
64
|
+
|
|
65
|
+
const startWorkCodexCompletion = `When all top-level checkboxes in \`## TODOs\` and \`## Final Verification Wave\` are complete:
|
|
66
|
+
|
|
67
|
+
1. Run the plan's final verification commands.
|
|
68
|
+
2. Complete the **Global Review and Debugging Gate** before any completion claim, PR handoff, or branch handoff:
|
|
69
|
+
- Invoke the \`review-work\` skill with the final diff, changed files, user goal, constraints, run command, and verification evidence. All five review lanes must return PASS. A timeout, missing deliverable, ack-only child, \`BLOCKED:\`, or inconclusive lane is a gate failure, not approval.
|
|
70
|
+
- Run a debugging-oriented runtime audit even when the review passes: name at least three plausible failure hypotheses for the changed surface, run the distinguishing checks against the actual artifact, and append the ruled-out or confirmed result to \`.omo/start-work/ledger.jsonl\`.
|
|
71
|
+
- If any review lane or debugging hypothesis fails, invoke the \`debugging\` skill, confirm root cause with runtime evidence, add the minimal failing test or reproduction, fix it, rerun the affected verification, then rerun the Global Review and Debugging Gate.
|
|
72
|
+
- Evidence hygiene is mandatory: redact or mask secrets and sensitive user data before writing \`.omo/start-work/ledger.jsonl\`, a PR body, or a handoff. Never include raw tokens, credentials, auth headers, cookies, API keys, env dumps, private logs, or PII; use concise summaries, lengths, hashes, or short non-sensitive prefixes instead.
|
|
73
|
+
- If the work includes creating, updating, or handing off a PR, refresh \`git status\` and the PR/branch state after the gate, and include only redacted review/debugging evidence in the PR body or handoff.
|
|
74
|
+
3. If worktree mode was used, sync \`.omo/\` state back to the main repo, merge or hand off exactly as requested, and remove the worktree only after successful merge or explicit handoff.
|
|
75
|
+
4. Remove or mark the Boulder work as completed.
|
|
76
|
+
5. Print an \`ORCHESTRATION COMPLETE\` block with the plan path, verification commands, Global Review and Debugging Gate verdict, artifacts, and cleanup receipts.`;
|
|
77
|
+
|
|
78
|
+
const startWorkOriginalHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No unprefixed session ids in Boulder state. Codex sessions are always `codex:<session_id>`.";
|
|
79
|
+
|
|
80
|
+
const startWorkCodexHardRule = "- No completion claim while an applicable ultraqa adversarial class was never probed. Each applicable class needs a captured observable result; each skipped class needs a one-line not-applicable reason in the ledger.\n- No `ORCHESTRATION COMPLETE`, final response, PR creation, or PR handoff before the Global Review and Debugging Gate passes with recorded evidence.\n- No unprefixed session ids in Boulder state. Codex sessions are always `codex:<session_id>`.";
|
|
81
|
+
|
|
82
|
+
const reviewWorkCodexGatePattern =
|
|
83
|
+
/\nWhen `review-work` is used as a final implementation, PR, or `\$start-work`\ngate, it is blocking\. A timeout, missing deliverable, ack-only response,\nexplicit `BLOCKED:`, or inconclusive lane is not a pass\. Treat that lane as\nfailed, investigate the underlying uncertainty with the `debugging` skill when\nruntime behavior may be wrong, fix with evidence, and rerun the affected lane\nbefore claiming completion or handing off a PR\.\n\nReview evidence must be safe to share\. Redact or mask secrets and sensitive\nuser data before including evidence in logs, PR bodies, or handoffs\. Never\ninclude raw tokens, credentials, auth headers, cookies, API keys, env dumps,\nprivate logs, or PII; summarize with lengths, hashes, and short non-sensitive\nprefixes when identity is needed\.\n/;
|
|
84
|
+
|
|
85
|
+
function removeCodexSkillOverlays(skillName, content) {
|
|
86
|
+
if (skillName === "start-work") {
|
|
87
|
+
return content
|
|
88
|
+
.replace(startWorkCodexCompletion, startWorkOriginalCompletion)
|
|
89
|
+
.replace(startWorkCodexHardRule, startWorkOriginalHardRule);
|
|
90
|
+
}
|
|
91
|
+
if (skillName === "review-work") {
|
|
92
|
+
return content.replace(reviewWorkCodexGatePattern, "");
|
|
93
|
+
}
|
|
94
|
+
return content;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function listSkillFiles(dir) {
|
|
98
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
99
|
+
const files = [];
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
if (entry.isDirectory()) {
|
|
102
|
+
const nested = await listSkillFiles(join(dir, entry.name));
|
|
103
|
+
for (const nestedPath of nested) files.push(join(entry.name, nestedPath));
|
|
104
|
+
} else {
|
|
105
|
+
files.push(entry.name);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return files.sort();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function readPackagedSkillFile(...segments) {
|
|
112
|
+
const path = join(root, "skills", ...segments);
|
|
113
|
+
const content = await readFile(path, "utf8");
|
|
114
|
+
return { path, content };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function assertPackagedContentMatches({ path, content }, requirements) {
|
|
118
|
+
for (const [label, pattern] of requirements) {
|
|
119
|
+
assert.match(content, pattern, `${path} missing packaged skill contract: ${label}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
52
123
|
test("#given synced aggregate Codex skills #when inspected #then component and shared skills are present", async () => {
|
|
53
124
|
// given
|
|
54
125
|
const skillsRoot = join(root, "skills");
|
|
@@ -103,26 +174,44 @@ test("#given shared skill package source #when aggregate Codex shared skills are
|
|
|
103
174
|
const sharedContent = await readFile(join(sharedSkillsRoot, skillName, "SKILL.md"), "utf8");
|
|
104
175
|
const aggregateContent = await readFile(join(aggregateSkillsRoot, skillName, "SKILL.md"), "utf8");
|
|
105
176
|
assert.equal(
|
|
106
|
-
removeCodexCompatibilityGuidance(aggregateContent),
|
|
177
|
+
removeCodexSkillOverlays(skillName, removeCodexCompatibilityGuidance(aggregateContent)),
|
|
107
178
|
removeCodexCompatibilityGuidance(sharedContent),
|
|
108
179
|
`${skillName} drifted from shared-skills`,
|
|
109
180
|
);
|
|
110
181
|
}
|
|
111
182
|
});
|
|
112
183
|
|
|
184
|
+
test("#given shared skill source tests #when aggregate Codex skills are synced #then source tests are not packaged", async () => {
|
|
185
|
+
// given
|
|
186
|
+
const aggregateSkillsRoot = join(root, "skills");
|
|
187
|
+
|
|
188
|
+
// when
|
|
189
|
+
const visualQaFiles = await listSkillFiles(join(aggregateSkillsRoot, "visual-qa"));
|
|
190
|
+
|
|
191
|
+
// then
|
|
192
|
+
assert.equal(visualQaFiles.some((file) => file.endsWith(".test.ts")), false);
|
|
193
|
+
});
|
|
194
|
+
|
|
113
195
|
test("#given component skill sources #when aggregate Codex component skills are inspected #then generated copies have no hand-authored drift", async () => {
|
|
114
196
|
// given
|
|
115
197
|
const aggregateSkillsRoot = join(root, "skills");
|
|
116
198
|
|
|
117
199
|
// when / then
|
|
118
200
|
for (const [skillName, sourcePath] of componentSkillSources) {
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
201
|
+
const sourceDir = join(root, sourcePath);
|
|
202
|
+
const aggregateDir = join(aggregateSkillsRoot, skillName);
|
|
203
|
+
const sourceFiles = await listSkillFiles(sourceDir);
|
|
204
|
+
const aggregateFiles = await listSkillFiles(aggregateDir);
|
|
205
|
+
assert.deepEqual(aggregateFiles, sourceFiles, `${skillName} resource set drifted from its component skill source`);
|
|
206
|
+
for (const relativePath of sourceFiles) {
|
|
207
|
+
const sourceContent = await readFile(join(sourceDir, relativePath), "utf8");
|
|
208
|
+
const aggregateContent = await readFile(join(aggregateDir, relativePath), "utf8");
|
|
209
|
+
assert.equal(
|
|
210
|
+
removeCodexCompatibilityGuidance(aggregateContent),
|
|
211
|
+
removeCodexCompatibilityGuidance(sourceContent),
|
|
212
|
+
`${skillName}/${relativePath} drifted from its component skill source`,
|
|
213
|
+
);
|
|
214
|
+
}
|
|
126
215
|
}
|
|
127
216
|
});
|
|
128
217
|
|
|
@@ -155,24 +244,24 @@ test("#given synced ulw-loop skill #when Codex hint metadata is inspected #then
|
|
|
155
244
|
assert.match(interfaceMetadata, /- "ulw-loop"/);
|
|
156
245
|
});
|
|
157
246
|
|
|
158
|
-
test("#given synced
|
|
247
|
+
test("#given synced git-master skill #when inspected #then commits and git history route through it", async () => {
|
|
159
248
|
// given
|
|
160
|
-
const skillRoot = join(root, "skills", "
|
|
249
|
+
const skillRoot = join(root, "skills", "git-master");
|
|
161
250
|
|
|
162
251
|
// when
|
|
163
252
|
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
164
253
|
const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
|
|
165
254
|
|
|
166
255
|
// then
|
|
167
|
-
assert.match(skill, /^---\r?\nname:
|
|
168
|
-
assert.match(skill, /
|
|
169
|
-
assert.match(skill,
|
|
170
|
-
assert.match(skill, /
|
|
171
|
-
assert.match(skill, /
|
|
172
|
-
assert.match(skill, /
|
|
173
|
-
assert.match(
|
|
174
|
-
assert.match(interfaceMetadata,
|
|
175
|
-
assert.match(interfaceMetadata, /- "
|
|
256
|
+
assert.match(skill, /^---\r?\nname: git-master\r?\n/m);
|
|
257
|
+
assert.match(skill, /MUST USE whenever a task needs a commit or git-history investigation/);
|
|
258
|
+
assert.match(skill, /Commit only the user's requested changes/);
|
|
259
|
+
assert.match(skill, /Choose the Git tool by the question/);
|
|
260
|
+
assert.match(skill, /git log -S "text"/);
|
|
261
|
+
assert.match(skill, /git blame -L start,end -- file/);
|
|
262
|
+
assert.match(interfaceMetadata, /display_name: "git-master \(omo\)"/);
|
|
263
|
+
assert.match(interfaceMetadata, /- "git commit"/);
|
|
264
|
+
assert.match(interfaceMetadata, /- "history search"/);
|
|
176
265
|
});
|
|
177
266
|
|
|
178
267
|
test("#given synced ulw-loop skill #when worker guidance is inspected #then context-hygiene guidance matches the source", async () => {
|
|
@@ -185,15 +274,19 @@ test("#given synced ulw-loop skill #when worker guidance is inspected #then cont
|
|
|
185
274
|
const syncedWorkflow = await readFile(join(root, "skills", "ulw-loop", "references", "full-workflow.md"), "utf8");
|
|
186
275
|
const requiredPatterns = [
|
|
187
276
|
["list_agents polling guard", /list_agents/],
|
|
188
|
-
["status polling warning", /polling
|
|
189
|
-
["large payload replay risk", /replay large
|
|
277
|
+
["status polling warning", /polling loop/],
|
|
278
|
+
["large payload replay risk", /replay large payloads/],
|
|
190
279
|
["local spawned-name tracking", /Track spawned agent names locally/],
|
|
191
|
-
["wait_agent
|
|
192
|
-
["
|
|
193
|
-
["
|
|
280
|
+
["wait_agent mailbox path", /wait_agent.*mailbox signals/],
|
|
281
|
+
["progress status contract", /WORKING:/],
|
|
282
|
+
["single list_agents reassurance", /single `list_agents`/],
|
|
194
283
|
["long-running plan/reviewer background guidance", /Plan and reviewer agents may run for a long time/],
|
|
195
284
|
["bounded plan/reviewer polling", /short wait_agent cycles/],
|
|
196
285
|
["single long wait guard", /single long blocking wait/],
|
|
286
|
+
["git-master checkpointing", /git-master/],
|
|
287
|
+
["touched-path commit-style probe", /touched-path commit history/],
|
|
288
|
+
["verified work-unit commit", /verified work unit/],
|
|
289
|
+
["observed commit style", /commit in the observed style/],
|
|
197
290
|
];
|
|
198
291
|
|
|
199
292
|
// when / then
|
|
@@ -206,6 +299,46 @@ test("#given synced ulw-loop skill #when worker guidance is inspected #then cont
|
|
|
206
299
|
assert.match(syncedSkill, /close_agent/);
|
|
207
300
|
});
|
|
208
301
|
|
|
302
|
+
test("#given packaged start-work skill #when inspected #then no-plan bootstrap and adversarial verification contracts are shipped", async () => {
|
|
303
|
+
// given
|
|
304
|
+
const skillFile = await readPackagedSkillFile("start-work", "SKILL.md");
|
|
305
|
+
|
|
306
|
+
// when / then
|
|
307
|
+
assertPackagedContentMatches(skillFile, [
|
|
308
|
+
["executes Prometheus plan with Boulder state", /Prometheus work plan[\s\S]*Boulder state/],
|
|
309
|
+
["bootstraps ulw-plan when no selectable plan exists", /no selectable plan[\s\S]*ulw-plan|ulw-plan[\s\S]*no selectable plan/i],
|
|
310
|
+
["does not execute work without an approved plan", /approved plan[\s\S]*(?:before|prior to)[\s\S]*execution|execution[\s\S]*(?:requires|needs)[\s\S]*approved plan/i],
|
|
311
|
+
["keeps hook continuation Boulder-only", /Boulder[\s\S]*(?:continuation|Stop hook)[\s\S]*(?:only|solely)|(?:continuation|Stop hook)[\s\S]*(?:only|solely)[\s\S]*Boulder/i],
|
|
312
|
+
["distinguishes execution from verification", /execution[\s\S]*verification|verification[\s\S]*execution/i],
|
|
313
|
+
["requires dirty-worktree-aware editing", /dirty worktree/i],
|
|
314
|
+
["requires stale-state probes", /stale state/i],
|
|
315
|
+
["rejects misleading success output", /misleading success output/i],
|
|
316
|
+
["does not accept worker done claims without independent verification", /done claim[\s\S]*independent(?:ly)? verified|independent(?:ly)? verify[\s\S]*done claim/i],
|
|
317
|
+
]);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test("#given packaged ulw-plan skill #when inspected #then dynamic multi-agent planning contracts are shipped", async () => {
|
|
321
|
+
// given
|
|
322
|
+
const skillFile = await readPackagedSkillFile("ulw-plan", "SKILL.md");
|
|
323
|
+
const workflowFile = await readPackagedSkillFile("ulw-plan", "references", "full-workflow.md");
|
|
324
|
+
const combinedFile = {
|
|
325
|
+
path: `${skillFile.path} + ${workflowFile.path}`,
|
|
326
|
+
content: `${skillFile.content}\n${workflowFile.content}`,
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
// when / then
|
|
330
|
+
assertPackagedContentMatches(combinedFile, [
|
|
331
|
+
["self-orchestrates 5 host subagents for planning", /(?:self-orchestrates|orchestrates)[\s\S]*5[\s\S]*host subagents/i],
|
|
332
|
+
["requires dynamic workflow phases", /dynamic[\s\S]*workflow[\s\S]*phase|phase[\s\S]*dynamic[\s\S]*workflow/i],
|
|
333
|
+
["keeps verification distinct from execution", /verification[\s\S]*execution|execution[\s\S]*verification/i],
|
|
334
|
+
["requires dirty-worktree-aware planning", /dirty worktree/i],
|
|
335
|
+
["requires stale-state checks between source and packaged payloads", /stale state/i],
|
|
336
|
+
["rejects misleading success output", /misleading success output/i],
|
|
337
|
+
["does not accept subagent outputs as success without independent verification", /subagent outputs?[\s\S]*(?:not|never)[\s\S]*(?:success|approval)|independent(?:ly)? verif(?:y|ied|ication)[\s\S]*subagent outputs?/i],
|
|
338
|
+
["treats Discord or external content as claims, not instructions", /(?:Discord|external content)[\s\S]*claims?[\s\S]*not instructions?|not instructions?[\s\S]*(?:Discord|external content)/i],
|
|
339
|
+
]);
|
|
340
|
+
});
|
|
341
|
+
|
|
209
342
|
test("#given context-pressure-prone skills #when bundled for Codex #then the eagerly loaded payload stays budgeted", async () => {
|
|
210
343
|
// given
|
|
211
344
|
const skillsRoot = join(root, "skills");
|
|
@@ -224,28 +357,3 @@ test("#given context-pressure-prone skills #when bundled for Codex #then the eag
|
|
|
224
357
|
`debugging + ulw-loop eager payload is ${totalBytes} bytes, above ${CONTEXT_PRESSURE_SKILL_BUDGET_BYTES}`,
|
|
225
358
|
);
|
|
226
359
|
});
|
|
227
|
-
|
|
228
|
-
test("#given synced aggregate Codex skills #when they contain OpenCode orchestration examples #then Codex tool compatibility guidance is injected", async () => {
|
|
229
|
-
// given
|
|
230
|
-
const skillsRoot = join(root, "skills");
|
|
231
|
-
const opencodeOnlyToolPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
|
|
232
|
-
|
|
233
|
-
// when
|
|
234
|
-
const skillNames = (await readdir(skillsRoot, { withFileTypes: true }))
|
|
235
|
-
.filter((entry) => entry.isDirectory())
|
|
236
|
-
.map((entry) => entry.name)
|
|
237
|
-
.sort();
|
|
238
|
-
|
|
239
|
-
// then
|
|
240
|
-
for (const skillName of skillNames) {
|
|
241
|
-
const content = await readFile(join(skillsRoot, skillName, "SKILL.md"), "utf8");
|
|
242
|
-
if (!opencodeOnlyToolPattern.test(content)) continue;
|
|
243
|
-
|
|
244
|
-
const compatibilityIndex = content.indexOf("## Codex Harness Tool Compatibility");
|
|
245
|
-
assert.notEqual(compatibilityIndex, -1, `${skillName} is missing Codex compatibility guidance`);
|
|
246
|
-
assert.ok(
|
|
247
|
-
compatibilityIndex < content.search(opencodeOnlyToolPattern),
|
|
248
|
-
`${skillName} must explain Codex tool translation before OpenCode-only examples`,
|
|
249
|
-
);
|
|
250
|
-
}
|
|
251
|
-
});
|
|
@@ -0,0 +1,43 @@
|
|
|
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 root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
8
|
+
const skillPath = join(root, "skills", "ulw-plan", "SKILL.md");
|
|
9
|
+
const workflowPath = join(root, "skills", "ulw-plan", "references", "full-workflow.md");
|
|
10
|
+
const opencodeOnlyToolPattern = /\b(?:call_omo_agent|background_output|team_[a-z_]+|task)\s*\(/;
|
|
11
|
+
|
|
12
|
+
test("#given ulw-plan skill #when inspected #then it is a Codex-native planner that defers the deep workflow to its reference", async () => {
|
|
13
|
+
// given
|
|
14
|
+
const skill = await readFile(skillPath, "utf8");
|
|
15
|
+
|
|
16
|
+
// then
|
|
17
|
+
assert.match(skill, /^---\r?\nname: ulw-plan\r?\n/m);
|
|
18
|
+
assert.match(skill, /references\/full-workflow\.md/);
|
|
19
|
+
assert.match(skill, /spawn_agent\(\{[^)]*"fork_turns":"none"/);
|
|
20
|
+
assert.doesNotMatch(skill, opencodeOnlyToolPattern);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("#given ulw-plan skill #when the planning gate is inspected #then it explores first and waits for explicit user approval instead of auto-transitioning", async () => {
|
|
24
|
+
// given
|
|
25
|
+
const skill = await readFile(skillPath, "utf8");
|
|
26
|
+
|
|
27
|
+
// then
|
|
28
|
+
assert.match(skill, /explore/i);
|
|
29
|
+
assert.match(skill, /wait for[^.]{0,80}explicit[^.]{0,40}(?:okay|approval)/i);
|
|
30
|
+
assert.doesNotMatch(skill, /Proceeding to plan generation/);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("#given ulw-plan full workflow reference #when inspected #then it documents the approval gate and .omo plan output with Codex-native tools only", async () => {
|
|
34
|
+
// given
|
|
35
|
+
const workflow = await readFile(workflowPath, "utf8");
|
|
36
|
+
|
|
37
|
+
// then
|
|
38
|
+
assert.match(workflow, /\.omo\/plans\/<slug>\.md/);
|
|
39
|
+
assert.match(workflow, /[Aa]pproval gate/);
|
|
40
|
+
assert.match(workflow, /spawn_agent\(\{[^)]*"fork_turns":"none"/);
|
|
41
|
+
assert.doesNotMatch(workflow, opencodeOnlyToolPattern);
|
|
42
|
+
assert.doesNotMatch(workflow, /Proceeding to plan generation/);
|
|
43
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { writeInstalledMarketplaceSnapshot } from "./snapshot.mjs";
|
|
2
|
+
|
|
3
|
+
export async function agentSourceRootsForInstall({ codexHome, marketplace, installed, pluginSources }) {
|
|
4
|
+
if (marketplace.name !== "sisyphuslabs") {
|
|
5
|
+
return new Map(installed.map((plugin) => [plugin.name, plugin.path]));
|
|
6
|
+
}
|
|
7
|
+
const snapshotPlugins = await writeInstalledMarketplaceSnapshot({
|
|
8
|
+
codexHome,
|
|
9
|
+
marketplace,
|
|
10
|
+
plugins: pluginSources,
|
|
11
|
+
});
|
|
12
|
+
return new Map(snapshotPlugins.map((plugin) => [plugin.name, plugin.path]));
|
|
13
|
+
}
|
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
import { basename, join } from "node:path";
|
|
2
|
-
import { copyFile, lstat, mkdir, readdir, rm,
|
|
2
|
+
import { copyFile, lstat, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
|
|
4
4
|
import { exists } from "./utils.mjs";
|
|
5
5
|
|
|
6
6
|
const MANIFEST_FILE = ".installed-agents.json";
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
export async function capturePreservedAgentReasoning({ codexHome }) {
|
|
10
|
+
const agentsDir = join(codexHome, "agents");
|
|
11
|
+
if (!(await exists(agentsDir))) return new Map();
|
|
12
|
+
|
|
13
|
+
const preserved = new Map();
|
|
14
|
+
const agentEntries = await readdir(agentsDir, { withFileTypes: true });
|
|
15
|
+
for (const entry of agentEntries) {
|
|
16
|
+
if (!entry.name.endsWith(".toml")) continue;
|
|
17
|
+
const content = await readTextIfExists(join(agentsDir, entry.name));
|
|
18
|
+
if (content === null) continue;
|
|
19
|
+
const effort = extractReasoningEffort(content);
|
|
20
|
+
if (effort !== null) preserved.set(agentNameFromToml(entry.name), effort);
|
|
21
|
+
}
|
|
22
|
+
return preserved;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function linkCachedPluginAgents({ codexHome, pluginRoot, preservedReasoning = new Map() }) {
|
|
9
26
|
const bundledAgents = await discoverBundledAgents(pluginRoot);
|
|
10
27
|
if (bundledAgents.length === 0) {
|
|
11
28
|
await writeManifest(pluginRoot, []);
|
|
@@ -16,13 +33,12 @@ export async function linkCachedPluginAgents({ codexHome, pluginRoot, platform =
|
|
|
16
33
|
await mkdir(agentsDir, { recursive: true });
|
|
17
34
|
const linked = [];
|
|
18
35
|
for (const agentPath of bundledAgents) {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
linked.push({ name: basename(agentPath), path: linkPath, target: agentPath });
|
|
36
|
+
const agentFileName = basename(agentPath);
|
|
37
|
+
const agentName = agentNameFromToml(agentFileName);
|
|
38
|
+
const linkPath = join(agentsDir, agentFileName);
|
|
39
|
+
await replaceWithCopy(linkPath, agentPath);
|
|
40
|
+
await restorePreservedReasoning({ linkPath, target: agentPath, value: preservedReasoning.get(agentName) });
|
|
41
|
+
linked.push({ name: agentFileName, path: linkPath, target: agentPath });
|
|
26
42
|
}
|
|
27
43
|
await writeManifest(pluginRoot, linked.map((entry) => entry.path));
|
|
28
44
|
return linked;
|
|
@@ -48,11 +64,6 @@ async function discoverBundledAgents(pluginRoot) {
|
|
|
48
64
|
return agents;
|
|
49
65
|
}
|
|
50
66
|
|
|
51
|
-
async function replaceWithSymlink(linkPath, target) {
|
|
52
|
-
await prepareReplacement(linkPath);
|
|
53
|
-
await symlink(target, linkPath);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
67
|
async function replaceWithCopy(linkPath, target) {
|
|
57
68
|
await prepareReplacement(linkPath);
|
|
58
69
|
await copyFile(target, linkPath);
|
|
@@ -73,6 +84,60 @@ async function writeManifest(pluginRoot, agentPaths) {
|
|
|
73
84
|
await writeFile(manifestPath, `${JSON.stringify(payload, null, "\t")}\n`);
|
|
74
85
|
}
|
|
75
86
|
|
|
87
|
+
async function restorePreservedReasoning({ linkPath, target, value }) {
|
|
88
|
+
if (value === undefined) return;
|
|
89
|
+
const content = await readFile(target, "utf8");
|
|
90
|
+
if (extractReasoningEffort(content) === value) return;
|
|
91
|
+
const replacement = replaceReasoningEffort(content, value);
|
|
92
|
+
if (!replacement.replaced) return;
|
|
93
|
+
if (await lstatExists(linkPath)) {
|
|
94
|
+
await rm(linkPath, { force: true });
|
|
95
|
+
}
|
|
96
|
+
await writeFile(linkPath, replacement.content);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function readTextIfExists(path) {
|
|
100
|
+
try {
|
|
101
|
+
return await readFile(path, "utf8");
|
|
102
|
+
} catch (error) {
|
|
103
|
+
if (nodeErrorCode(error) === "ENOENT") return null;
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function extractReasoningEffort(content) {
|
|
109
|
+
for (const line of content.split(/\n/)) {
|
|
110
|
+
if (isSectionHeader(line)) return null;
|
|
111
|
+
const match = line.match(/^\s*model_reasoning_effort\s*=\s*("(?:[^"\\]|\\.)*")/);
|
|
112
|
+
if (match === null) continue;
|
|
113
|
+
return JSON.parse(match[1]);
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function replaceReasoningEffort(content, value) {
|
|
119
|
+
let replaced = false;
|
|
120
|
+
const lines = content.split(/\n/);
|
|
121
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
122
|
+
const line = lines[index];
|
|
123
|
+
if (isSectionHeader(line)) break;
|
|
124
|
+
if (!/^\s*model_reasoning_effort\s*=/.test(line)) continue;
|
|
125
|
+
lines[index] = line.replace(/=\s*"(?:[^"\\]|\\.)*"/, `= ${JSON.stringify(value)}`);
|
|
126
|
+
replaced = true;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
return { content: lines.join("\n"), replaced };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function isSectionHeader(line) {
|
|
133
|
+
const trimmed = line.trim();
|
|
134
|
+
return trimmed.startsWith("[") && trimmed.endsWith("]");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function agentNameFromToml(fileName) {
|
|
138
|
+
return fileName.endsWith(".toml") ? fileName.slice(0, -".toml".length) : fileName;
|
|
139
|
+
}
|
|
140
|
+
|
|
76
141
|
async function lstatExists(path) {
|
|
77
142
|
try {
|
|
78
143
|
await lstat(path);
|
|
@@ -82,3 +147,8 @@ async function lstatExists(path) {
|
|
|
82
147
|
throw error;
|
|
83
148
|
}
|
|
84
149
|
}
|
|
150
|
+
|
|
151
|
+
function nodeErrorCode(error) {
|
|
152
|
+
if (!(error instanceof Error) || !("code" in error)) return null;
|
|
153
|
+
return typeof error.code === "string" ? error.code : null;
|
|
154
|
+
}
|