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,239 @@
|
|
|
1
|
+
import { chmod, lstat, mkdir, readFile, readdir, readlink, rm, stat, symlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { basename, join, relative, resolve } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { COMMAND_SHIM_MARKER } from "./command-shim.mjs";
|
|
5
|
+
import { removeLegacyCodexComponentBins } from "./legacy-bins.mjs";
|
|
6
|
+
|
|
7
|
+
const RESERVED_NESTED_BIN_NAMES = new Set(["omo", "lazycodex", "lazycodex-ai", "oh-my-opencode", "oh-my-openagent"]);
|
|
8
|
+
const RUNTIME_WRAPPER_MARKER = "OMO_GENERATED_RUNTIME_WRAPPER";
|
|
9
|
+
|
|
10
|
+
export async function linkCachedPluginBins({ binDir, pluginRoot, platform = process.platform }) {
|
|
11
|
+
const binLinks = await discoverPackageBins(pluginRoot);
|
|
12
|
+
await mkdir(binDir, { recursive: true });
|
|
13
|
+
await removeLegacyCodexComponentBins(binDir, platform);
|
|
14
|
+
const linked = [];
|
|
15
|
+
for (const link of binLinks) {
|
|
16
|
+
const linkPath = await linkCachedPluginBin(binDir, link, platform);
|
|
17
|
+
linked.push({ name: link.name, path: linkPath, target: link.target });
|
|
18
|
+
}
|
|
19
|
+
return linked;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function linkRootRuntimeBin({ binDir, codexHome, repoRoot, platform = process.platform }) {
|
|
23
|
+
const cliPath = join(repoRoot, "dist", "cli", "index.js");
|
|
24
|
+
if (!(await isFile(cliPath))) return null;
|
|
25
|
+
|
|
26
|
+
await mkdir(binDir, { recursive: true });
|
|
27
|
+
if (platform === "win32") {
|
|
28
|
+
const linkPath = join(binDir, "omo.cmd");
|
|
29
|
+
await replaceRuntimeWrapper(linkPath, windowsRuntimeWrapper(cliPath, codexHome, binDir));
|
|
30
|
+
return { name: "omo", path: linkPath, target: cliPath };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const linkPath = join(binDir, "omo");
|
|
34
|
+
await replaceRuntimeWrapper(linkPath, posixRuntimeWrapper(cliPath, codexHome, binDir));
|
|
35
|
+
await chmod(linkPath, 0o755);
|
|
36
|
+
return { name: "omo", path: linkPath, target: cliPath };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function linkCachedPluginBin(binDir, link, platform) {
|
|
40
|
+
if (platform === "win32") {
|
|
41
|
+
const linkPath = join(binDir, `${link.name}.cmd`);
|
|
42
|
+
await replaceCommandShim(linkPath, link.target);
|
|
43
|
+
return linkPath;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const linkPath = join(binDir, link.name);
|
|
47
|
+
await replaceSymlink(linkPath, link.target);
|
|
48
|
+
return linkPath;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function isFile(path) {
|
|
52
|
+
try {
|
|
53
|
+
return (await stat(path)).isFile();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function discoverPackageBins(root) {
|
|
61
|
+
const links = [];
|
|
62
|
+
await collectPackageBins(root, root, links);
|
|
63
|
+
return links;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function collectPackageBins(directory, root, links) {
|
|
67
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
68
|
+
const packageJsonPath = join(directory, "package.json");
|
|
69
|
+
if (entries.some((entry) => entry.isFile() && entry.name === "package.json")) {
|
|
70
|
+
await appendPackageBinLinks(packageJsonPath, directory, root, links);
|
|
71
|
+
}
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
if (!entry.isDirectory()) continue;
|
|
74
|
+
if (entry.name === "node_modules" || entry.name === ".git" || entry.name === "dist") continue;
|
|
75
|
+
const childPath = join(directory, entry.name);
|
|
76
|
+
if (!isPathInside(childPath, root)) continue;
|
|
77
|
+
await collectPackageBins(childPath, root, links);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function appendPackageBinLinks(packageJsonPath, packageRoot, root, links) {
|
|
82
|
+
const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
|
|
83
|
+
if (!isRecord(packageJson)) return;
|
|
84
|
+
const bin = packageJson.bin;
|
|
85
|
+
if (typeof bin === "string" && typeof packageJson.name === "string") {
|
|
86
|
+
const name = basename(packageJson.name);
|
|
87
|
+
if (!isReservedNestedBinName(name, packageRoot, root)) {
|
|
88
|
+
links.push(createPackageBinLink(name, bin, packageRoot));
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!isRecord(bin)) return;
|
|
93
|
+
for (const [name, target] of Object.entries(bin)) {
|
|
94
|
+
if (typeof target !== "string") continue;
|
|
95
|
+
if (isReservedNestedBinName(name, packageRoot, root)) continue;
|
|
96
|
+
links.push(createPackageBinLink(name, target, packageRoot));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function createPackageBinLink(name, target, packageRoot) {
|
|
101
|
+
assertSafeBinName(name);
|
|
102
|
+
if (target.includes("\0")) {
|
|
103
|
+
throw new Error(`package bin target for ${name} contains a NUL byte`);
|
|
104
|
+
}
|
|
105
|
+
const resolvedTarget = resolve(packageRoot, target);
|
|
106
|
+
if (!isPathInside(resolvedTarget, packageRoot)) {
|
|
107
|
+
throw new Error(`package bin target for ${name} escapes package root`);
|
|
108
|
+
}
|
|
109
|
+
return { name, target: resolvedTarget };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function assertSafeBinName(name) {
|
|
113
|
+
if (
|
|
114
|
+
name.length === 0 ||
|
|
115
|
+
name === "." ||
|
|
116
|
+
name === ".." ||
|
|
117
|
+
name.includes("\0") ||
|
|
118
|
+
name.includes("/") ||
|
|
119
|
+
name.includes("\\")
|
|
120
|
+
) {
|
|
121
|
+
throw new Error(`invalid package bin name: ${name}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function isReservedNestedBinName(name, packageRoot, root) {
|
|
126
|
+
return packageRoot !== root && RESERVED_NESTED_BIN_NAMES.has(name);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function replaceSymlink(linkPath, targetPath) {
|
|
130
|
+
if (await existingNonSymlink(linkPath)) {
|
|
131
|
+
throw new Error(`${linkPath} already exists and is not a symlink`);
|
|
132
|
+
}
|
|
133
|
+
await rm(linkPath, { force: true });
|
|
134
|
+
await symlink(targetPath, linkPath);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async function replaceCommandShim(linkPath, targetPath) {
|
|
138
|
+
if (await existingNonShim(linkPath)) {
|
|
139
|
+
throw new Error(`${linkPath} already exists and is not a command shim`);
|
|
140
|
+
}
|
|
141
|
+
await writeFile(linkPath, `@echo off\r\n${COMMAND_SHIM_MARKER}\r\nnode "${targetPath}" %*\r\n`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async function replaceRuntimeWrapper(linkPath, content) {
|
|
145
|
+
if (await existingNonRuntimeWrapper(linkPath)) {
|
|
146
|
+
throw new Error(`${linkPath} already exists and is not a generated OMO runtime wrapper`);
|
|
147
|
+
}
|
|
148
|
+
await rm(linkPath, { force: true });
|
|
149
|
+
await writeFile(linkPath, content);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function existingNonRuntimeWrapper(path) {
|
|
153
|
+
try {
|
|
154
|
+
const stat = await lstat(path);
|
|
155
|
+
if (stat.isSymbolicLink()) return false;
|
|
156
|
+
if (!stat.isFile()) return true;
|
|
157
|
+
const content = await readFile(path, "utf8");
|
|
158
|
+
return !content.includes(RUNTIME_WRAPPER_MARKER);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function posixRuntimeWrapper(cliPath, codexHome, binDir) {
|
|
166
|
+
const ulwLoopBin = join(binDir, "omo-ulw-loop");
|
|
167
|
+
return [
|
|
168
|
+
"#!/bin/sh",
|
|
169
|
+
`# ${RUNTIME_WRAPPER_MARKER}`,
|
|
170
|
+
`export CODEX_HOME="\${CODEX_HOME:-${escapePosixDoubleQuoted(codexHome)}}"`,
|
|
171
|
+
'export OMO_SPARKSHELL_APP_SERVER_SOCKET="${OMO_SPARKSHELL_APP_SERVER_SOCKET:-$CODEX_HOME/app-server-control/app-server-control.sock}"',
|
|
172
|
+
'BUN_BINARY="${BUN_BINARY:-bun}"',
|
|
173
|
+
'if [ "$1" = "ulw-loop" ] && [ -x "' + escapePosixDoubleQuoted(ulwLoopBin) + '" ]; then',
|
|
174
|
+
" shift",
|
|
175
|
+
' exec "' + escapePosixDoubleQuoted(ulwLoopBin) + '" "$@"',
|
|
176
|
+
"fi",
|
|
177
|
+
`exec "$BUN_BINARY" "${escapePosixDoubleQuoted(cliPath)}" "$@"`,
|
|
178
|
+
"",
|
|
179
|
+
].join("\n");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function windowsRuntimeWrapper(cliPath, codexHome, binDir) {
|
|
183
|
+
const ulwLoopBin = join(binDir, "omo-ulw-loop.cmd");
|
|
184
|
+
return [
|
|
185
|
+
"@echo off",
|
|
186
|
+
`rem ${RUNTIME_WRAPPER_MARKER}`,
|
|
187
|
+
`if not defined CODEX_HOME set "CODEX_HOME=${codexHome}"`,
|
|
188
|
+
'if not defined OMO_SPARKSHELL_APP_SERVER_SOCKET set "OMO_SPARKSHELL_APP_SERVER_SOCKET=%CODEX_HOME%\\app-server-control\\app-server-control.sock"',
|
|
189
|
+
`if "%~1"=="ulw-loop" if exist "${ulwLoopBin}" (`,
|
|
190
|
+
" shift /1",
|
|
191
|
+
` "${ulwLoopBin}" %*`,
|
|
192
|
+
" exit /b %ERRORLEVEL%",
|
|
193
|
+
")",
|
|
194
|
+
`if defined BUN_BINARY ("%BUN_BINARY%" "${cliPath}" %*) else bun "${cliPath}" %*`,
|
|
195
|
+
"",
|
|
196
|
+
].join("\r\n");
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function escapePosixDoubleQuoted(value) {
|
|
200
|
+
return value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("$", "\\$").replaceAll("`", "\\`");
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async function existingNonShim(path) {
|
|
204
|
+
try {
|
|
205
|
+
const stat = await lstat(path);
|
|
206
|
+
if (!stat.isFile()) return true;
|
|
207
|
+
const content = await readFile(path, "utf8");
|
|
208
|
+
if (content.includes(COMMAND_SHIM_MARKER)) return false;
|
|
209
|
+
throw new Error(`${path} already exists and is not a generated command shim`);
|
|
210
|
+
} catch (error) {
|
|
211
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async function existingNonSymlink(path) {
|
|
217
|
+
try {
|
|
218
|
+
const stat = await lstat(path);
|
|
219
|
+
if (!stat.isSymbolicLink()) return true;
|
|
220
|
+
await readlink(path);
|
|
221
|
+
return false;
|
|
222
|
+
} catch (error) {
|
|
223
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function isRecord(value) {
|
|
229
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function isPathInside(candidatePath, rootPath) {
|
|
233
|
+
const pathFromRoot = relative(rootPath, candidatePath);
|
|
234
|
+
return pathFromRoot === "" || (!pathFromRoot.startsWith("..") && !pathFromRoot.startsWith(`..\\`) && !isDriveRelative(pathFromRoot));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function isDriveRelative(path) {
|
|
238
|
+
return /^[a-zA-Z]:/.test(path);
|
|
239
|
+
}
|
|
@@ -1,22 +1,31 @@
|
|
|
1
1
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { cp, mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
3
4
|
|
|
4
5
|
import { createCachedMcpRuntimeArgRewriter } from "./mcp-runtime-cache.mjs";
|
|
5
6
|
import { exists, isRecord } from "./utils.mjs";
|
|
6
|
-
|
|
7
|
-
import { removeLegacyCodexComponentBins } from "./legacy-bins.mjs";
|
|
7
|
+
export { linkCachedPluginBins, linkRootRuntimeBin } from "./bin-links.mjs";
|
|
8
8
|
|
|
9
|
-
export async function installCachedPlugin({ buildSource = true, codexHome, marketplaceName, name, runCommand, sourcePath, version }) {
|
|
9
|
+
export async function installCachedPlugin({ buildSource = true, codexHome, marketplaceName, name, renameDirectory = rename, runCommand, sourcePath, version }) {
|
|
10
10
|
if (buildSource) {
|
|
11
11
|
await maybeRunNpmInstall(sourcePath, runCommand);
|
|
12
12
|
await maybeRunNpmBuild(sourcePath, runCommand);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
const targetPath = join(codexHome, "plugins", "cache", marketplaceName, name, version);
|
|
16
|
-
|
|
17
|
-
await
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
const tempPath = createTempSiblingPath(targetPath);
|
|
17
|
+
await rm(tempPath, { recursive: true, force: true });
|
|
18
|
+
try {
|
|
19
|
+
await copyDirectory(sourcePath, tempPath, shouldCopyPluginPath);
|
|
20
|
+
await rewriteCachedPackageLocalFileDependencies(tempPath, sourcePath);
|
|
21
|
+
await maybeRunNpmInstall(tempPath, runCommand, ["ci", "--omit=dev"]);
|
|
22
|
+
await rewriteCachedMcpManifest(tempPath, sourcePath);
|
|
23
|
+
await rewriteCachedManifestRoot(tempPath, tempPath, targetPath);
|
|
24
|
+
await promoteDirectory(tempPath, targetPath, renameDirectory);
|
|
25
|
+
} catch (error) {
|
|
26
|
+
await rm(tempPath, { recursive: true, force: true });
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
20
29
|
return { name, version, path: targetPath };
|
|
21
30
|
}
|
|
22
31
|
|
|
@@ -42,30 +51,6 @@ export async function pruneMarketplacePluginCaches({ codexHome, marketplaceName,
|
|
|
42
51
|
}
|
|
43
52
|
}
|
|
44
53
|
|
|
45
|
-
export async function linkCachedPluginBins({ binDir, pluginRoot, platform = process.platform }) {
|
|
46
|
-
const binLinks = await discoverPackageBins(pluginRoot);
|
|
47
|
-
await mkdir(binDir, { recursive: true });
|
|
48
|
-
await removeLegacyCodexComponentBins(binDir, platform);
|
|
49
|
-
const linked = [];
|
|
50
|
-
for (const link of binLinks) {
|
|
51
|
-
const linkPath = await linkCachedPluginBin(binDir, link, platform);
|
|
52
|
-
linked.push({ name: link.name, path: linkPath, target: link.target });
|
|
53
|
-
}
|
|
54
|
-
return linked;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
async function linkCachedPluginBin(binDir, link, platform) {
|
|
58
|
-
if (platform === "win32") {
|
|
59
|
-
const linkPath = join(binDir, `${link.name}.cmd`);
|
|
60
|
-
await replaceCommandShim(linkPath, link.target);
|
|
61
|
-
return linkPath;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const linkPath = join(binDir, link.name);
|
|
65
|
-
await replaceSymlink(linkPath, link.target);
|
|
66
|
-
return linkPath;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
54
|
async function maybeRunNpmInstall(cwd, runCommand, args = ["install"]) {
|
|
70
55
|
if (!(await exists(join(cwd, "package.json")))) return;
|
|
71
56
|
await runCommand("npm", args, { cwd });
|
|
@@ -78,99 +63,49 @@ async function maybeRunNpmBuild(cwd, runCommand) {
|
|
|
78
63
|
await runCommand("npm", ["run", "build"], { cwd });
|
|
79
64
|
}
|
|
80
65
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const tempPath = join(dirname(targetPath), `.tmp-${basename(targetPath)}-${process.pid}-${Date.now()}`);
|
|
84
|
-
await rm(tempPath, { recursive: true, force: true });
|
|
85
|
-
await cp(sourcePath, tempPath, {
|
|
86
|
-
recursive: true,
|
|
87
|
-
filter: (source) => filter(source, sourcePath),
|
|
88
|
-
});
|
|
89
|
-
await rm(targetPath, { recursive: true, force: true });
|
|
90
|
-
await rename(tempPath, targetPath);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async function discoverPackageBins(root) {
|
|
94
|
-
const links = [];
|
|
95
|
-
await collectPackageBins(root, root, links);
|
|
96
|
-
return links;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async function collectPackageBins(directory, root, links) {
|
|
100
|
-
const entries = await readdir(directory, { withFileTypes: true });
|
|
101
|
-
const packageJsonPath = join(directory, "package.json");
|
|
102
|
-
if (entries.some((entry) => entry.isFile() && entry.name === "package.json")) {
|
|
103
|
-
await appendPackageBinLinks(packageJsonPath, directory, links);
|
|
104
|
-
}
|
|
105
|
-
for (const entry of entries) {
|
|
106
|
-
if (!entry.isDirectory()) continue;
|
|
107
|
-
if (entry.name === "node_modules" || entry.name === ".git" || entry.name === "dist") continue;
|
|
108
|
-
const childPath = join(directory, entry.name);
|
|
109
|
-
if (!childPath.startsWith(root)) continue;
|
|
110
|
-
await collectPackageBins(childPath, root, links);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async function appendPackageBinLinks(packageJsonPath, packageRoot, links) {
|
|
115
|
-
const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
|
|
116
|
-
if (!isRecord(packageJson)) return;
|
|
117
|
-
const bin = packageJson.bin;
|
|
118
|
-
if (typeof bin === "string" && typeof packageJson.name === "string") {
|
|
119
|
-
links.push({ name: basename(packageJson.name), target: join(packageRoot, bin) });
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
if (!isRecord(bin)) return;
|
|
123
|
-
for (const [name, target] of Object.entries(bin)) {
|
|
124
|
-
if (typeof target !== "string") continue;
|
|
125
|
-
links.push({ name, target: join(packageRoot, target) });
|
|
126
|
-
}
|
|
66
|
+
function createTempSiblingPath(targetPath) {
|
|
67
|
+
return join(dirname(targetPath), `.tmp-${basename(targetPath)}-${process.pid}-${Date.now()}`);
|
|
127
68
|
}
|
|
128
69
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
throw new Error(`${linkPath} already exists and is not a symlink`);
|
|
132
|
-
}
|
|
133
|
-
await rm(linkPath, { force: true });
|
|
134
|
-
await symlink(targetPath, linkPath);
|
|
70
|
+
function createBackupSiblingPath(targetPath) {
|
|
71
|
+
return join(dirname(targetPath), `.backup-${basename(targetPath)}-${process.pid}-${Date.now()}`);
|
|
135
72
|
}
|
|
136
73
|
|
|
137
|
-
async function
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
74
|
+
async function copyDirectory(sourcePath, targetPath, filter) {
|
|
75
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
76
|
+
await cp(sourcePath, targetPath, {
|
|
77
|
+
recursive: true,
|
|
78
|
+
filter: (source) => filter(source, sourcePath),
|
|
79
|
+
});
|
|
142
80
|
}
|
|
143
81
|
|
|
144
|
-
async function
|
|
82
|
+
async function promoteDirectory(tempPath, targetPath, renameDirectory) {
|
|
83
|
+
const backupPath = createBackupSiblingPath(targetPath);
|
|
84
|
+
await rm(backupPath, { recursive: true, force: true });
|
|
85
|
+
let backupMoved = false;
|
|
145
86
|
try {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
87
|
+
if (await exists(targetPath)) {
|
|
88
|
+
await renameDirectory(targetPath, backupPath);
|
|
89
|
+
backupMoved = true;
|
|
90
|
+
}
|
|
91
|
+
await renameDirectory(tempPath, targetPath);
|
|
151
92
|
} catch (error) {
|
|
152
|
-
if (
|
|
93
|
+
if (backupMoved) await restoreBackupDirectory(backupPath, targetPath, renameDirectory);
|
|
153
94
|
throw error;
|
|
154
95
|
}
|
|
96
|
+
if (backupMoved) await rm(backupPath, { recursive: true, force: true });
|
|
155
97
|
}
|
|
156
98
|
|
|
157
|
-
async function
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
await readlink(path);
|
|
162
|
-
return false;
|
|
163
|
-
} catch (error) {
|
|
164
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT") return false;
|
|
165
|
-
throw error;
|
|
166
|
-
}
|
|
99
|
+
async function restoreBackupDirectory(backupPath, targetPath, renameDirectory) {
|
|
100
|
+
if (!(await exists(backupPath))) return;
|
|
101
|
+
await rm(targetPath, { recursive: true, force: true });
|
|
102
|
+
await renameDirectory(backupPath, targetPath);
|
|
167
103
|
}
|
|
168
104
|
|
|
169
105
|
function shouldCopyPluginPath(path, root) {
|
|
170
106
|
const relative = path === root ? "" : path.slice(root.length + sep.length);
|
|
171
107
|
if (relative === "") return true;
|
|
172
108
|
const parts = relative.split(sep);
|
|
173
|
-
if (parts[parts.length - 1] === "package-lock.json") return false;
|
|
174
109
|
return !parts.some((part) => part === ".git" || part === "node_modules");
|
|
175
110
|
}
|
|
176
111
|
|
|
@@ -200,9 +135,34 @@ export async function rewriteCachedMcpManifest(pluginRoot, sourceRoot = pluginRo
|
|
|
200
135
|
if (changed) await writeFile(manifestPath, `${JSON.stringify(parsed, null, "\t")}\n`);
|
|
201
136
|
}
|
|
202
137
|
|
|
138
|
+
async function rewriteCachedManifestRoot(pluginRoot, fromRoot, toRoot) {
|
|
139
|
+
const manifestPath = join(pluginRoot, ".mcp.json");
|
|
140
|
+
if (!(await exists(manifestPath))) return;
|
|
141
|
+
const raw = await readFile(manifestPath, "utf8");
|
|
142
|
+
const parsed = JSON.parse(raw);
|
|
143
|
+
if (!isRecord(parsed) || !isRecord(parsed.mcpServers)) return;
|
|
144
|
+
let changed = false;
|
|
145
|
+
for (const server of Object.values(parsed.mcpServers)) {
|
|
146
|
+
if (!isRecord(server) || !Array.isArray(server.args)) continue;
|
|
147
|
+
const nextArgs = server.args.map((arg) => {
|
|
148
|
+
if (typeof arg !== "string") return arg;
|
|
149
|
+
if (arg === fromRoot) return toRoot;
|
|
150
|
+
const prefix = `${fromRoot}${sep}`;
|
|
151
|
+
if (!arg.startsWith(prefix)) return arg;
|
|
152
|
+
return `${toRoot}${arg.slice(fromRoot.length)}`;
|
|
153
|
+
});
|
|
154
|
+
if (nextArgs.some((value, index) => value !== server.args[index])) {
|
|
155
|
+
server.args = nextArgs;
|
|
156
|
+
changed = true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (changed) await writeFile(manifestPath, `${JSON.stringify(parsed, null, "\t")}\n`);
|
|
160
|
+
}
|
|
161
|
+
|
|
203
162
|
async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot) {
|
|
204
163
|
const packageJsonPaths = [];
|
|
205
164
|
await collectPackageJsonPaths(pluginRoot, pluginRoot, packageJsonPaths);
|
|
165
|
+
const packageLock = await readPackageLock(pluginRoot);
|
|
206
166
|
for (const packageJsonPath of packageJsonPaths) {
|
|
207
167
|
const raw = await readFile(packageJsonPath, "utf8");
|
|
208
168
|
const parsed = JSON.parse(raw);
|
|
@@ -219,12 +179,96 @@ async function rewriteCachedPackageLocalFileDependencies(pluginRoot, sourceRoot)
|
|
|
219
179
|
if (filePath.length === 0 || isAbsolute(filePath)) continue;
|
|
220
180
|
const targetPath = resolve(packageDir, filePath);
|
|
221
181
|
if (isPathInside(targetPath, pluginRoot)) continue;
|
|
222
|
-
|
|
182
|
+
const sourceTargetPath = resolve(sourcePackageDir, filePath);
|
|
183
|
+
dependencies[name] = `file:${sourceTargetPath}`;
|
|
184
|
+
rewritePackageLockFileDependency({
|
|
185
|
+
dependencyName: name,
|
|
186
|
+
field,
|
|
187
|
+
packageDir,
|
|
188
|
+
packageLock,
|
|
189
|
+
pluginRoot,
|
|
190
|
+
sourceTargetPath,
|
|
191
|
+
targetPath,
|
|
192
|
+
});
|
|
223
193
|
changed = true;
|
|
224
194
|
}
|
|
225
195
|
}
|
|
226
196
|
if (changed) await writeFile(packageJsonPath, `${JSON.stringify(parsed, null, "\t")}\n`);
|
|
227
197
|
}
|
|
198
|
+
if (packageLock.changed) await writeFile(packageLock.path, `${JSON.stringify(packageLock.value, null, "\t")}\n`);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
async function readPackageLock(pluginRoot) {
|
|
202
|
+
const path = join(pluginRoot, "package-lock.json");
|
|
203
|
+
try {
|
|
204
|
+
const parsed = JSON.parse(await readFile(path, "utf8"));
|
|
205
|
+
return { path, value: isRecord(parsed) ? parsed : null, changed: false };
|
|
206
|
+
} catch (error) {
|
|
207
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
208
|
+
return { path, value: null, changed: false };
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function rewritePackageLockFileDependency({
|
|
215
|
+
dependencyName,
|
|
216
|
+
field,
|
|
217
|
+
packageDir,
|
|
218
|
+
packageLock,
|
|
219
|
+
pluginRoot,
|
|
220
|
+
sourceTargetPath,
|
|
221
|
+
targetPath,
|
|
222
|
+
}) {
|
|
223
|
+
const packages = getPackageLockPackages(packageLock.value);
|
|
224
|
+
if (!packages) return;
|
|
225
|
+
|
|
226
|
+
const lockRoot = canonicalizeExistingPath(pluginRoot);
|
|
227
|
+
const packageKey = toPackageLockPath(relative(pluginRoot, packageDir));
|
|
228
|
+
const oldTargetKey = toPackageLockPath(relative(pluginRoot, targetPath));
|
|
229
|
+
const newTargetKey = toPackageLockPath(relative(lockRoot, sourceTargetPath));
|
|
230
|
+
const newSpecifier = `file:${sourceTargetPath}`;
|
|
231
|
+
|
|
232
|
+
const packageEntry = packages[packageKey];
|
|
233
|
+
if (isRecord(packageEntry)) {
|
|
234
|
+
const dependencyRecord = packageEntry[field];
|
|
235
|
+
if (isRecord(dependencyRecord) && dependencyRecord[dependencyName] !== newSpecifier) {
|
|
236
|
+
dependencyRecord[dependencyName] = newSpecifier;
|
|
237
|
+
packageLock.changed = true;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (oldTargetKey !== newTargetKey && isRecord(packages[oldTargetKey])) {
|
|
242
|
+
packages[newTargetKey] = packages[oldTargetKey];
|
|
243
|
+
delete packages[oldTargetKey];
|
|
244
|
+
packageLock.changed = true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const nodeModulesKey = `node_modules/${dependencyName}`;
|
|
248
|
+
const nodeModulesEntry = packages[nodeModulesKey];
|
|
249
|
+
if (isRecord(nodeModulesEntry) && nodeModulesEntry.resolved !== newTargetKey) {
|
|
250
|
+
nodeModulesEntry.resolved = newTargetKey;
|
|
251
|
+
packageLock.changed = true;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function getPackageLockPackages(packageLock) {
|
|
256
|
+
if (!packageLock) return null;
|
|
257
|
+
const packages = packageLock.packages;
|
|
258
|
+
return isRecord(packages) ? packages : null;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function toPackageLockPath(path) {
|
|
262
|
+
return path.split(sep).join("/");
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function canonicalizeExistingPath(path) {
|
|
266
|
+
try {
|
|
267
|
+
return realpathSync(path);
|
|
268
|
+
} catch (error) {
|
|
269
|
+
if (error instanceof Error) return path;
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
228
272
|
}
|
|
229
273
|
|
|
230
274
|
async function collectPackageJsonPaths(directory, root, paths) {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
export async function writeCachedMarketplaceManifest({ marketplaceName, marketplaceRoot, plugins }) {
|
|
5
|
+
const marketplaceDir = join(marketplaceRoot, ".agents", "plugins");
|
|
6
|
+
await mkdir(marketplaceDir, { recursive: true });
|
|
7
|
+
await writeFile(
|
|
8
|
+
join(marketplaceDir, "marketplace.json"),
|
|
9
|
+
`${JSON.stringify(
|
|
10
|
+
{
|
|
11
|
+
name: marketplaceName,
|
|
12
|
+
plugins: plugins.map((plugin) => ({
|
|
13
|
+
name: plugin.name,
|
|
14
|
+
source: { source: "local", path: `./${plugin.name}/${plugin.version}` },
|
|
15
|
+
})),
|
|
16
|
+
},
|
|
17
|
+
null,
|
|
18
|
+
"\t",
|
|
19
|
+
)}\n`,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const CODEX_ONLY_ERROR = "lazycodex-ai installs the Codex Light edition only. Use the omo installer for OpenCode or both-platform installs.";
|
|
2
|
-
const PASSTHROUGH_COMMANDS = new Set(["doctor", "cleanup", "get-local-version", "boulder", "refresh-model-capabilities", "run", "ulw-loop"]);
|
|
2
|
+
export const PASSTHROUGH_COMMANDS = new Set(["doctor", "cleanup", "get-local-version", "boulder", "refresh-model-capabilities", "run", "ulw-loop"]);
|
|
3
3
|
|
|
4
4
|
export function parseLazyCodexInstallCliArgs(argv) {
|
|
5
5
|
const args = [...argv];
|
|
@@ -72,6 +72,34 @@ export function parseLazyCodexInstallCliArgs(argv) {
|
|
|
72
72
|
index += 1;
|
|
73
73
|
continue;
|
|
74
74
|
}
|
|
75
|
+
if (arg === "update") {
|
|
76
|
+
index += 1;
|
|
77
|
+
while (index < args.length) {
|
|
78
|
+
const updateArg = args[index];
|
|
79
|
+
if (updateArg === "--dry-run") {
|
|
80
|
+
dryRun = true;
|
|
81
|
+
index += 1;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (updateArg === "--repo-root") {
|
|
85
|
+
repoRoot = readOptionValue(args, index, "--repo-root");
|
|
86
|
+
index += 2;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (typeof updateArg === "string" && updateArg.startsWith("--repo-root=")) {
|
|
90
|
+
const value = updateArg.slice("--repo-root=".length);
|
|
91
|
+
if (value.trim().length === 0) throw new Error("--repo-root requires a path");
|
|
92
|
+
repoRoot = value;
|
|
93
|
+
index += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`Unsupported lazycodex-ai update option: ${String(updateArg)}`);
|
|
97
|
+
}
|
|
98
|
+
return { kind: "update", dryRun, repoRoot };
|
|
99
|
+
}
|
|
100
|
+
if (arg === "uninstall") {
|
|
101
|
+
return { kind: "command", command: "cleanup", dryRun, args: args.slice(index + 1) };
|
|
102
|
+
}
|
|
75
103
|
if (PASSTHROUGH_COMMANDS.has(arg)) {
|
|
76
104
|
return { kind: "command", command: arg, dryRun, args: args.slice(index + 1) };
|
|
77
105
|
}
|
|
@@ -104,9 +132,18 @@ function readOptionValue(args, index, option) {
|
|
|
104
132
|
}
|
|
105
133
|
|
|
106
134
|
export function formatLazyCodexInstallHelp() {
|
|
135
|
+
const passthrough = [...PASSTHROUGH_COMMANDS].sort().join(", ");
|
|
107
136
|
return [
|
|
108
137
|
"Usage: lazycodex-ai install [--no-tui] [--codex-autonomous|--no-codex-autonomous] [--repo-root <path>]",
|
|
138
|
+
" lazycodex-ai uninstall [--project <path>]",
|
|
139
|
+
" lazycodex-ai update [--dry-run] [--repo-root <path>]",
|
|
140
|
+
" lazycodex-ai version",
|
|
141
|
+
" lazycodex-ai <command> [args...]",
|
|
142
|
+
"",
|
|
143
|
+
"Installs or removes the Codex Light edition in ~/.codex using Node/npm.",
|
|
144
|
+
"`uninstall` removes managed Codex Light state; `cleanup` is a backward-compatible alias.",
|
|
145
|
+
"`update` refreshes the installed Codex Light edition in place.",
|
|
109
146
|
"",
|
|
110
|
-
|
|
147
|
+
`Pass-through commands delegated to the omo CLI: ${passthrough}.`,
|
|
111
148
|
].join("\n");
|
|
112
149
|
}
|