oh-my-opencode 4.7.5 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/command/get-unpublished-changes.md +35 -6
- package/.agents/command/omomomo.md +1 -1
- package/.agents/command/publish.md +13 -0
- package/.agents/command/security-research.md +0 -1
- package/.agents/skills/get-unpublished-changes/SKILL.md +21 -5
- package/.agents/skills/omomomo/SKILL.md +1 -2
- package/.agents/skills/opencode-qa/scripts/export-roundtrip.sh +57 -19
- package/.agents/skills/opencode-qa/scripts/lib/common.sh +19 -7
- package/.agents/skills/opencode-qa/scripts/sse-hook-probe.sh +3 -0
- package/.agents/skills/opencode-qa/scripts/tui-smoke.sh +1 -1
- package/.agents/skills/pre-publish-review/SKILL.md +24 -4
- package/.agents/skills/publish/SKILL.md +13 -0
- package/.agents/skills/remove-deadcode/SKILL.md +0 -1
- package/.agents/skills/security-research/SKILL.md +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
- package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
- package/.opencode/command/get-unpublished-changes.md +35 -6
- package/.opencode/command/omomomo.md +1 -1
- package/.opencode/command/publish.md +13 -0
- package/.opencode/command/security-research.md +0 -1
- package/.opencode/skills/pre-publish-review/SKILL.md +24 -4
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +1 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +2 -2
- package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +1 -1
- package/README.ja.md +7 -7
- package/README.ko.md +9 -7
- package/README.md +14 -8
- package/README.ru.md +5 -5
- package/README.zh-cn.md +7 -7
- package/bin/oh-my-opencode.js +24 -1
- package/bin/oh-my-opencode.test.ts +79 -20
- package/dist/agents/hephaestus/agent.d.ts +1 -1
- package/dist/agents/kimi-tool-loop-guard.d.ts +1 -0
- package/dist/agents/momus.d.ts +1 -1
- package/dist/agents/sisyphus-agent-config.d.ts +4 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +6 -0
- package/dist/agents/sisyphus-dynamic-prompt-builder.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-execution.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-exploration.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-role.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt-sections.d.ts +18 -0
- package/dist/agents/sisyphus-dynamic-prompt-style.d.ts +2 -0
- package/dist/agents/sisyphus-dynamic-prompt.d.ts +3 -0
- package/dist/agents/sisyphus-gemini-fallback-overrides.d.ts +1 -0
- package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
- package/dist/agents/sisyphus-junior/index.d.ts +0 -1
- package/dist/agents/sisyphus.d.ts +1 -6
- package/dist/agents/types.d.ts +14 -3
- package/dist/cli/cli-program.d.ts +3 -0
- package/dist/cli/doctor/checks/codex.d.ts +11 -0
- package/dist/cli/doctor/checks/dependencies.d.ts +1 -0
- package/dist/cli/doctor/checks/index.d.ts +3 -0
- package/dist/cli/doctor/checks/system.d.ts +4 -0
- package/dist/cli/doctor/constants.d.ts +1 -0
- package/dist/cli/doctor/doctor-target.d.ts +2 -0
- package/dist/cli/doctor/index.d.ts +1 -0
- package/dist/cli/doctor/types.d.ts +26 -0
- package/dist/cli/index.js +4426 -2200
- package/dist/cli/install-codex/codex-cache-bins.d.ts +21 -0
- package/dist/cli/install-codex/codex-cache-fs.d.ts +3 -0
- package/dist/cli/install-codex/codex-cache-install.d.ts +13 -0
- package/dist/cli/install-codex/codex-cache-mcp-manifest.d.ts +2 -0
- package/dist/cli/install-codex/codex-cache-prune.d.ts +10 -0
- package/dist/cli/install-codex/codex-cache.d.ts +4 -32
- package/dist/cli/install-codex/codex-cached-marketplace-manifest.d.ts +6 -0
- package/dist/cli/install-codex/codex-config-agents.d.ts +3 -0
- package/dist/cli/install-codex/codex-config-features.d.ts +1 -0
- package/dist/cli/install-codex/codex-config-marketplaces.d.ts +6 -0
- package/dist/cli/install-codex/codex-config-plugins.d.ts +8 -0
- package/dist/cli/install-codex/codex-config-toml-sections.d.ts +9 -0
- package/dist/cli/install-codex/codex-process.d.ts +5 -0
- package/dist/cli/install-codex/index.d.ts +1 -1
- package/dist/cli/install-codex/lazycodex-version-stamp.d.ts +19 -0
- package/dist/cli/install-codex/link-cached-plugin-agents.d.ts +4 -0
- package/dist/cli/install-validators.d.ts +3 -0
- package/dist/cli/model-fallback-types.d.ts +3 -0
- package/dist/cli/run/event-handlers.d.ts +4 -11
- package/dist/cli/run/event-message-handlers.d.ts +5 -0
- package/dist/cli/run/event-session-handlers.d.ts +5 -0
- package/dist/cli/run/event-session-ids.d.ts +24 -0
- package/dist/cli/run/event-think-block.d.ts +3 -0
- package/dist/cli/run/event-toast-handlers.d.ts +3 -0
- package/dist/cli/run/event-tool-handlers.d.ts +4 -0
- package/dist/cli/run/event-tool-output.d.ts +2 -0
- package/dist/cli/run/on-complete-hook.d.ts +8 -1
- package/dist/cli/run/opencode-binary-resolver.d.ts +2 -1
- package/dist/cli/runtime-commands.d.ts +2 -0
- package/dist/cli/sparkshell-appserver-websocket.d.ts +4 -0
- package/dist/cli/sparkshell-appserver.d.ts +16 -0
- package/dist/cli/sparkshell-parse.d.ts +21 -0
- package/dist/cli/sparkshell.d.ts +26 -0
- package/dist/cli/types.d.ts +9 -0
- package/dist/config/schema/claude-code.d.ts +1 -0
- package/dist/config/schema/hooks.d.ts +1 -0
- package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
- package/dist/create-hooks.d.ts +1 -0
- package/dist/features/background-agent/concurrency.d.ts +6 -1
- package/dist/features/background-agent/constants.d.ts +1 -0
- package/dist/features/background-agent/empty-assistant-turn.d.ts +7 -0
- package/dist/features/background-agent/manager.d.ts +12 -0
- package/dist/features/background-agent/message-updated-parent-wake-output.d.ts +1 -0
- package/dist/features/background-agent/parent-wake-dedupe.d.ts +2 -0
- package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +21 -0
- package/dist/features/background-agent/parent-wake-flush-runner.d.ts +24 -0
- package/dist/features/background-agent/parent-wake-history-state.d.ts +5 -0
- package/dist/features/background-agent/parent-wake-notifier-types.d.ts +50 -0
- package/dist/features/background-agent/parent-wake-notifier.d.ts +8 -50
- package/dist/features/background-agent/parent-wake-pending-queue.d.ts +22 -0
- package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +19 -0
- package/dist/features/background-agent/parent-wake-session-history.d.ts +73 -0
- package/dist/features/background-agent/parent-wake-session-inspector.d.ts +35 -0
- package/dist/features/background-agent/parent-wake-timer-handle.d.ts +5 -0
- package/dist/features/background-agent/parent-wake-window-recovery.d.ts +13 -0
- package/dist/features/background-agent/process-cleanup.d.ts +2 -0
- package/dist/features/background-agent/process-cleanup.test-helpers.d.ts +3 -0
- package/dist/features/background-agent/session-stream-activity.d.ts +6 -0
- package/dist/features/background-agent/spawner/fallback-agent.d.ts +5 -0
- package/dist/features/background-agent/spawner/task-prompt-body.d.ts +34 -0
- package/dist/features/background-agent/spawner/task-record.d.ts +2 -0
- package/dist/features/background-agent/spawner.d.ts +2 -5
- package/dist/features/builtin-commands/templates/refactor-sections/codemap-and-tests.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/intro-and-analysis.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/plan-and-execution.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor-sections/verification-and-tooling.d.ts +1 -0
- package/dist/features/builtin-commands/templates/refactor.d.ts +2 -2
- package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +2 -0
- package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +2 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +1 -0
- package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +1 -1
- package/dist/features/builtin-skills/skills/index.d.ts +1 -0
- package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +2 -0
- package/dist/features/builtin-skills/skills/playwright.d.ts +2 -3
- package/dist/features/builtin-skills/skills/visual-qa.d.ts +2 -0
- package/dist/features/claude-code-agent-loader/agent-definitions-loader.d.ts +2 -2
- package/dist/features/claude-code-agent-loader/claude-model-mapper.d.ts +1 -1
- package/dist/features/claude-code-agent-loader/loader.d.ts +2 -2
- package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +1 -1
- package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +2 -0
- package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/discovery.d.ts +3 -4
- package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +1 -0
- package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +2 -0
- package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +1 -0
- package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +4 -0
- package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +3 -0
- package/dist/features/claude-code-plugin-loader/types.d.ts +1 -0
- package/dist/features/hook-message-injector/context-resolver.d.ts +6 -0
- package/dist/features/hook-message-injector/id-generation.d.ts +2 -0
- package/dist/features/hook-message-injector/index.d.ts +1 -1
- package/dist/features/hook-message-injector/injector.d.ts +7 -69
- package/dist/features/hook-message-injector/json-message-lookup.d.ts +3 -0
- package/dist/features/hook-message-injector/message-directory.d.ts +1 -0
- package/dist/features/hook-message-injector/message-injection.d.ts +2 -0
- package/dist/features/hook-message-injector/sdk-message-context.d.ts +6 -0
- package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +28 -0
- package/dist/features/hook-message-injector/types.d.ts +9 -0
- package/dist/features/mcp-oauth/callback-server.d.ts +10 -2
- package/dist/features/opencode-runtime-skills/source-server.d.ts +1 -0
- package/dist/features/skill-mcp-manager/http-client.d.ts +2 -0
- package/dist/features/team-mode/deps.d.ts +8 -1
- package/dist/features/team-mode/team-layout-tmux/layout.d.ts +2 -0
- package/dist/features/team-mode/team-mailbox/send.d.ts +3 -0
- package/dist/features/team-mode/team-registry/paths.d.ts +17 -2
- package/dist/features/team-mode/team-runtime/shutdown.d.ts +1 -1
- package/dist/features/team-mode/team-runtime/unresolved-team-members.d.ts +3 -0
- package/dist/features/team-mode/team-state-store/active-resume.d.ts +5 -0
- package/dist/features/team-mode/team-state-store/creating-resume.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/deleting-resume.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/error-normalization.d.ts +2 -0
- package/dist/features/team-mode/team-state-store/reservation-reconciliation.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/resume-report.d.ts +7 -0
- package/dist/features/team-mode/team-state-store/resume.d.ts +2 -7
- package/dist/features/team-mode/team-state-store/runtime-cleanup.d.ts +4 -0
- package/dist/features/team-mode/team-state-store/session-liveness.d.ts +9 -0
- package/dist/features/team-mode/team-state-store/worker-resume-status.d.ts +9 -0
- package/dist/features/team-mode/tools/lifecycle-create-tool.d.ts +17 -0
- package/dist/features/team-mode/tools/lifecycle-inline-spec.d.ts +19 -0
- package/dist/features/team-mode/tools/lifecycle-participant.d.ts +25 -0
- package/dist/features/team-mode/tools/lifecycle-shutdown-tools.d.ts +18 -0
- package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +3 -3
- package/dist/features/team-mode/tools/lifecycle.d.ts +3 -37
- package/dist/features/team-mode/tools/messaging-live-delivery-client.d.ts +25 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +19 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-reservation.d.ts +10 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-state.d.ts +5 -0
- package/dist/features/team-mode/tools/messaging-live-delivery.d.ts +6 -0
- package/dist/features/team-mode/tools/messaging-runtime.d.ts +17 -0
- package/dist/features/team-mode/tools/messaging.d.ts +4 -29
- package/dist/features/tmux-subagent/manager.d.ts +20 -1
- package/dist/features/tmux-subagent/session-created-handler.d.ts +4 -0
- package/dist/features/tmux-subagent/types.d.ts +1 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/message-builder.d.ts +1 -1
- package/dist/hooks/atlas/idle-completion-nudge.d.ts +10 -0
- package/dist/hooks/atlas/idle-constants.d.ts +4 -0
- package/dist/hooks/atlas/idle-continuation.d.ts +23 -0
- package/dist/hooks/atlas/idle-session-eligibility.d.ts +8 -0
- package/dist/hooks/atlas/tool-execute-after-direct-work.d.ts +9 -0
- package/dist/hooks/atlas/tool-execute-after-plan-tasks.d.ts +3 -0
- package/dist/hooks/atlas/tool-execute-after-subagent-completion.d.ts +14 -0
- package/dist/hooks/auto-update-checker/hook/background-update-check.d.ts +6 -0
- package/dist/hooks/auto-update-checker/hook/ignore-toast-error.d.ts +1 -0
- package/dist/hooks/hephaestus-agents-md-injector/hook.d.ts +37 -0
- package/dist/hooks/hephaestus-agents-md-injector/index.d.ts +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
- package/dist/hooks/ralph-loop/command-arguments.d.ts +1 -0
- package/dist/hooks/ralph-loop/event-handler-activity.d.ts +10 -0
- package/dist/hooks/ralph-loop/event-handler-completion.d.ts +9 -0
- package/dist/hooks/ralph-loop/event-handler-continuation.d.ts +16 -0
- package/dist/hooks/ralph-loop/event-handler-feedback.d.ts +16 -0
- package/dist/hooks/ralph-loop/event-handler-idle.d.ts +15 -0
- package/dist/hooks/ralph-loop/event-handler-impl.d.ts +10 -0
- package/dist/hooks/ralph-loop/event-handler-runtime-error.d.ts +4 -0
- package/dist/hooks/ralph-loop/event-handler-types.d.ts +20 -0
- package/dist/hooks/ralph-loop/loop-state-controller.d.ts +1 -0
- package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +4 -24
- package/dist/hooks/ralph-loop/ralph-loop-hook.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-chunks.d.ts +6 -0
- package/dist/hooks/read-image-resizer/png-constants.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-crc.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-decoder.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-encoder.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-filters.d.ts +1 -0
- package/dist/hooks/read-image-resizer/png-ihdr.d.ts +11 -0
- package/dist/hooks/read-image-resizer/png-nearest-neighbor.d.ts +1 -0
- package/dist/hooks/rules-injector/injection-output.d.ts +2 -0
- package/dist/hooks/rules-injector/injection-processor.d.ts +22 -0
- package/dist/hooks/rules-injector/injection-types.d.ts +43 -0
- package/dist/hooks/rules-injector/injector.d.ts +3 -47
- package/dist/hooks/rules-injector/match-decision-cache.d.ts +4 -0
- package/dist/hooks/rules-injector/parsed-rule-cache.d.ts +11 -0
- package/dist/hooks/rules-injector/path-resolution.d.ts +1 -0
- package/dist/hooks/rules-injector/rule-match-reason.d.ts +12 -0
- package/dist/hooks/rules-injector/transcript-hydration.d.ts +13 -2
- package/dist/hooks/runtime-fallback/auto-retry-abort.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-agent-context.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-cleanup.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-dispatch.d.ts +2 -0
- package/dist/hooks/runtime-fallback/auto-retry-metadata.d.ts +9 -0
- package/dist/hooks/runtime-fallback/auto-retry-timeout.d.ts +5 -0
- package/dist/hooks/runtime-fallback/fallback-bootstrap-model.d.ts +1 -1
- package/dist/hooks/runtime-fallback/fallback-state.d.ts +4 -1
- package/dist/hooks/runtime-fallback/normalize-model.d.ts +12 -0
- package/dist/hooks/session-notification-linux.d.ts +3 -0
- package/dist/hooks/session-notification-log.d.ts +2 -0
- package/dist/hooks/session-notification-macos.d.ts +3 -0
- package/dist/hooks/session-notification-platform.d.ts +3 -0
- package/dist/hooks/session-notification-runner.d.ts +9 -0
- package/dist/hooks/session-notification-send.d.ts +3 -0
- package/dist/hooks/session-notification-sender.d.ts +5 -6
- package/dist/hooks/session-notification-sound.d.ts +3 -0
- package/dist/hooks/session-notification-windows.d.ts +3 -0
- package/dist/hooks/session-recovery/error-recovery.d.ts +4 -0
- package/dist/hooks/session-recovery/hook-types.d.ts +22 -0
- package/dist/hooks/session-recovery/hook.d.ts +2 -19
- package/dist/hooks/session-recovery/interrupted-tool-results.d.ts +3 -0
- package/dist/hooks/session-recovery/message-state.d.ts +4 -0
- package/dist/hooks/session-recovery/storage/thinking-strip.d.ts +7 -1
- package/dist/hooks/start-work/context-info-builder.d.ts +9 -9
- package/dist/hooks/start-work/context-info-formatters.d.ts +21 -0
- package/dist/hooks/start-work/explicit-plan-context.d.ts +9 -0
- package/dist/hooks/start-work/plan-discovery-context.d.ts +25 -0
- package/dist/hooks/start-work/plan-selection.d.ts +4 -0
- package/dist/hooks/start-work/work-initializer.d.ts +17 -0
- package/dist/hooks/tool-pair-validator/hook.d.ts +1 -37
- package/dist/hooks/tool-pair-validator/message-transform.d.ts +2 -0
- package/dist/hooks/tool-pair-validator/tool-part-ids.d.ts +6 -0
- package/dist/hooks/tool-pair-validator/tool-result-repair.d.ts +4 -0
- package/dist/hooks/tool-pair-validator/types.d.ts +36 -0
- package/dist/index.js +12708 -9988
- package/dist/oh-my-opencode.schema.json +4 -0
- package/dist/openclaw/reply-listener-poll-loop.d.ts +3 -0
- package/dist/openclaw/reply-listener-signature.d.ts +2 -0
- package/dist/openclaw/reply-listener-sleep.d.ts +1 -0
- package/dist/openclaw/reply-listener-start.d.ts +9 -0
- package/dist/openclaw/reply-listener-status.d.ts +4 -0
- package/dist/openclaw/reply-listener-stop.d.ts +7 -0
- package/dist/openclaw/reply-listener.d.ts +5 -18
- package/dist/openclaw/session-registry-lock.d.ts +2 -0
- package/dist/openclaw/session-registry-paths.d.ts +9 -0
- package/dist/openclaw/session-registry-storage.d.ts +4 -0
- package/dist/openclaw/session-registry-types.d.ts +11 -0
- package/dist/openclaw/session-registry.d.ts +2 -11
- package/dist/plugin/chat-message/loop-commands.d.ts +9 -0
- package/dist/plugin/chat-message/model-cache-warning.d.ts +12 -0
- package/dist/plugin/chat-message/prompt-text.d.ts +2 -0
- package/dist/plugin/chat-message/session-model.d.ts +4 -0
- package/dist/plugin/chat-message/start-work-message.d.ts +5 -0
- package/dist/plugin/chat-message/types.d.ts +67 -0
- package/dist/plugin/chat-message.d.ts +3 -24
- package/dist/plugin/event-error-utils.d.ts +14 -0
- package/dist/plugin/event-hook-dispatcher.d.ts +5 -0
- package/dist/plugin/event-model-fallback-state.d.ts +30 -0
- package/dist/plugin/event-model-fallback.d.ts +39 -0
- package/dist/plugin/event-session-lifecycle.d.ts +49 -0
- package/dist/plugin/event-session-recovery.d.ts +9 -0
- package/dist/plugin/event-team-handlers.d.ts +13 -0
- package/dist/plugin/event-types.d.ts +78 -0
- package/dist/plugin/event.d.ts +3 -12
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
- package/dist/plugin/hooks/model-fallback-title-updater.d.ts +8 -0
- package/dist/plugin/session-compacting.d.ts +4 -1
- package/dist/plugin/system-transform.d.ts +1 -1
- package/dist/plugin/tool-execute-after.d.ts +2 -0
- package/dist/plugin/tool-registry-core-tools.d.ts +15 -0
- package/dist/plugin/tool-registry-factories.d.ts +36 -0
- package/dist/plugin/tool-registry-gated-tools.d.ts +16 -0
- package/dist/plugin/tool-registry-team-tools.d.ts +14 -0
- package/dist/plugin/tool-registry-trimming.d.ts +2 -0
- package/dist/plugin/tool-registry.d.ts +3 -38
- package/dist/plugin/ultrawork-db-model-override.d.ts +1 -1
- package/dist/plugin-config/agent-order-warnings.d.ts +1 -0
- package/dist/plugin-config/config-merger.d.ts +2 -0
- package/dist/plugin-config/layered-config-loader.d.ts +2 -0
- package/dist/plugin-config/single-config-loader.d.ts +4 -0
- package/dist/plugin-config.d.ts +3 -5
- package/dist/plugin-handlers/agent-config-assembly.d.ts +19 -0
- package/dist/plugin-handlers/agent-config-finalizer.d.ts +4 -0
- package/dist/plugin-handlers/agent-config-handler.d.ts +2 -11
- package/dist/plugin-handlers/agent-config-types.d.ts +30 -0
- package/dist/plugin-handlers/agent-skill-discovery.d.ts +3 -0
- package/dist/plugin-handlers/agent-source-loader.d.ts +2 -0
- package/dist/plugin-handlers/hook-config-handler.d.ts +0 -3
- package/dist/shared/context-window-usage.d.ts +7 -0
- package/dist/shared/dynamic-truncator-types.d.ts +17 -0
- package/dist/shared/dynamic-truncator.d.ts +8 -23
- package/dist/shared/migration/migrations-sidecar.d.ts +2 -2
- package/dist/shared/migration/model-versions.d.ts +7 -4
- package/dist/shared/model-availability.d.ts +1 -1
- package/dist/shared/opencode-version.d.ts +2 -2
- package/dist/shared/sparkshell-awareness.d.ts +5 -0
- package/dist/shared/spawn-with-windows-hide.d.ts +2 -0
- package/dist/shared/token-limit-truncator.d.ts +2 -0
- package/dist/testing/module-mock-lifecycle.d.ts +8 -0
- package/dist/tools/delegate-task/openai-categories.d.ts +0 -1
- package/dist/tools/delegate-task/subagent-agent-match.d.ts +3 -0
- package/dist/tools/delegate-task/subagent-model-resolution.d.ts +4 -0
- package/dist/tools/delegate-task/subagent-request-preflight.d.ts +3 -0
- package/dist/tools/delegate-task/subagent-resolution-types.d.ts +32 -0
- package/dist/tools/delegate-task/subagent-resolver.d.ts +3 -12
- package/dist/tools/delegate-task/sync-completion-message.d.ts +20 -0
- package/dist/tools/delegate-task/sync-poll-error-recovery.d.ts +1 -0
- package/dist/tools/delegate-task/sync-session-lifecycle.d.ts +12 -0
- package/dist/tools/delegate-task/sync-session-poller.d.ts +2 -0
- package/dist/tools/delegate-task/sync-spawn-reservation.d.ts +10 -0
- package/dist/tools/delegate-task/sync-task-metadata.d.ts +11 -0
- package/dist/tools/delegate-task/sync-task-runner.d.ts +30 -0
- package/dist/tools/delegate-task/sync-task.d.ts +2 -1
- package/dist/tools/hashline-edit/formatter-trigger.d.ts +2 -2
- package/package.json +15 -14
- package/packages/git-bash-mcp/dist/cli.js +29 -12
- package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.d.ts +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/client-wrapper.js +1 -1
- package/packages/lsp-tools-mcp/dist/lsp/config-loader.js +95 -30
- package/packages/lsp-tools-mcp/dist/lsp/server-installation.d.ts +1 -2
- package/packages/lsp-tools-mcp/dist/lsp/server-installation.js +1 -11
- package/packages/lsp-tools-mcp/dist/lsp/transport.d.ts +1 -0
- package/packages/lsp-tools-mcp/dist/lsp/transport.js +5 -10
- package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.d.ts +4 -1
- package/packages/lsp-tools-mcp/dist/lsp/workspace-edit.js +84 -23
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +2 -0
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.js +14 -0
- package/packages/lsp-tools-mcp/dist/tools.js +64 -80
- package/packages/lsp-tools-mcp/package.json +4 -4
- package/packages/omo-codex/lazycodex-repository/.github/workflows/pr-source-guidance.yml +36 -0
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/README.md +3 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +188 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/core-values.ts +1 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +15 -361
- package/packages/omo-codex/plugin/components/comment-checker/src/hook-input.ts +19 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/record.ts +11 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +102 -0
- package/packages/omo-codex/plugin/components/comment-checker/src/types.ts +51 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/codex-hook.test.ts +145 -0
- package/packages/omo-codex/plugin/components/comment-checker/test/core.test.ts +200 -0
- package/packages/omo-codex/plugin/components/lsp/CHANGELOG.md +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus.md +11 -5
- package/packages/omo-codex/plugin/components/rules/src/hook-output.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +0 -1
- package/packages/omo-codex/plugin/components/rules/src/rules/constants.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-cache.ts +87 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-dynamic-loader.ts +94 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-loader.ts +84 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-paths.ts +103 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-static-loader.ts +43 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine-types.ts +45 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/engine.ts +8 -419
- package/packages/omo-codex/plugin/components/rules/src/rules/formatter.ts +32 -5
- package/packages/omo-codex/plugin/components/rules/src/rules/parser-frontmatter.ts +39 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/parser-yaml.ts +271 -0
- package/packages/omo-codex/plugin/components/rules/src/rules/parser.ts +3 -294
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +57 -0
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +13 -2
- package/packages/omo-codex/plugin/components/rules/src/transcript-rule-filter.ts +17 -0
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +2 -1
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +26 -11
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-context-pressure.test.ts +104 -138
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +5 -2
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +12 -5
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +10 -4
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +65 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +47 -2
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +16 -0
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +153 -0
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +12 -0
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +236 -0
- package/packages/omo-codex/plugin/components/rules/test/tool-paths.test.ts +28 -50
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +6 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +13 -6
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +21 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +64 -2
- package/packages/omo-codex/plugin/components/telemetry/README.md +11 -1
- package/packages/omo-codex/plugin/components/telemetry/biome.json +12 -0
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +30 -3
- package/packages/omo-codex/plugin/components/telemetry/src/diagnostics.ts +154 -0
- package/packages/omo-codex/plugin/components/telemetry/src/posthog-activity-state.ts +18 -2
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +36 -4
- package/packages/omo-codex/plugin/components/telemetry/test/codex-hook-diagnostics.test.ts +115 -0
- package/packages/omo-codex/plugin/components/telemetry/test/codex-hook.test.ts +16 -25
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +119 -0
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/agents/codex-ultrawork-reviewer.toml +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +97 -32
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +65 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/agents/openai.yaml +7 -0
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +131 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +38 -10
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-contract.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +47 -0
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +12 -8
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +28 -21
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +7 -7
- package/packages/omo-codex/plugin/components/ulw-loop/src/command-types.ts +36 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +64 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +98 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +17 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/runtime.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +69 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/types.ts +5 -277
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +35 -13
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +52 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering.test.ts +67 -111
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +31 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +46 -9
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +20 -29
- package/packages/omo-codex/plugin/model-catalog.json +5 -11
- package/packages/omo-codex/plugin/package-lock.json +1 -1
- package/packages/omo-codex/plugin/scripts/auto-update-state.mjs +78 -0
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +166 -76
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +71 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/config-paths.mjs +44 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +74 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/state.mjs +29 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +14 -202
- package/packages/omo-codex/plugin/scripts/spawn-command.mjs +11 -0
- package/packages/omo-codex/plugin/scripts/sync-hook-status-messages.mjs +23 -9
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +131 -28
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +100 -0
- package/packages/omo-codex/plugin/skills/git-master/agents/openai.yaml +13 -0
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +9 -7
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
- package/packages/omo-codex/plugin/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
- package/packages/omo-codex/plugin/skills/lcx-report-bug/SKILL.md +119 -14
- package/packages/omo-codex/plugin/skills/lcx-report-bug/agents/openai.yaml +4 -2
- package/packages/omo-codex/plugin/skills/programming/references/go/concurrency.md +2 -2
- package/packages/omo-codex/plugin/skills/programming/references/python/async-anyio.md +6 -6
- package/packages/omo-codex/plugin/skills/programming/references/python/pydantic-ai.md +12 -12
- package/packages/omo-codex/plugin/skills/programming/references/typescript/backend-hono.md +7 -7
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +13 -11
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +10 -8
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +68 -33
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +86 -22
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +770 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +12 -8
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +28 -21
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +45 -379
- package/packages/omo-codex/plugin/skills/ulw-plan/agents/openai.yaml +7 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +131 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +237 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/ansi.ts +17 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/cli.ts +82 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/east-asian-width.ts +72 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/image-diff.ts +109 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-crc.ts +27 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-decode.ts +206 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/png-synth.ts +57 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/tui-grid.ts +88 -0
- package/packages/omo-codex/plugin/skills/visual-qa/scripts/types.ts +54 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +55 -0
- package/packages/omo-codex/plugin/test/aggregate-build.test.mjs +38 -0
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +164 -0
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +73 -0
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +69 -0
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +83 -0
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +67 -0
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +2 -514
- package/packages/omo-codex/plugin/test/auto-update-state-persistence.test.mjs +36 -0
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +191 -29
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/global-review-debug-gate.test.mjs +29 -0
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +23 -10
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +81 -0
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +91 -0
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +165 -9
- package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -19
- package/packages/omo-codex/plugin/test/start-work-skill.test.mjs +107 -0
- package/packages/omo-codex/plugin/test/subagent-guidance.test.mjs +82 -7
- package/packages/omo-codex/plugin/test/sync-hook-status-messages.test.mjs +58 -6
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +152 -0
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +158 -50
- package/packages/omo-codex/plugin/test/ulw-plan-skill.test.mjs +43 -0
- package/packages/omo-codex/scripts/install/agent-source-roots.mjs +13 -0
- package/packages/omo-codex/scripts/install/agents.mjs +84 -14
- package/packages/omo-codex/scripts/install/bin-links.mjs +239 -0
- package/packages/omo-codex/scripts/install/cache.mjs +152 -108
- package/packages/omo-codex/scripts/install/cached-marketplace-manifest.mjs +21 -0
- package/packages/omo-codex/scripts/install/cli-args.mjs +39 -2
- package/packages/omo-codex/scripts/install/config.mjs +7 -5
- package/packages/omo-codex/scripts/install/lazycodex-version-stamp.mjs +102 -0
- package/packages/omo-codex/scripts/install/legacy-bins.mjs +9 -1
- package/packages/omo-codex/scripts/install/model-catalog.mjs +9 -1
- package/packages/omo-codex/scripts/install/process.mjs +3 -1
- package/packages/omo-codex/scripts/install/project-local-cleanup.mjs +0 -1
- package/packages/omo-codex/scripts/install/snapshot.mjs +0 -1
- package/packages/omo-codex/scripts/install-agent-links.test.mjs +205 -11
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +123 -1
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +129 -5
- package/packages/omo-codex/scripts/install-cli-args.test.mjs +82 -1
- package/packages/omo-codex/scripts/install-config-preservation.test.mjs +43 -0
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +14 -1
- package/packages/omo-codex/scripts/install-config.test.mjs +49 -1
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +84 -0
- package/packages/omo-codex/scripts/install-local-entrypoint.test.mjs +51 -0
- package/packages/omo-codex/scripts/install-local.mjs +42 -40
- package/packages/omo-codex/scripts/install-local.test.mjs +17 -241
- package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +162 -0
- package/packages/omo-codex/scripts/install-packaged-local.test.mjs +10 -6
- package/packages/omo-codex/scripts/install-project-local-cleanup.test.mjs +73 -2
- package/packages/omo-codex/scripts/sync-telemetry-component.mjs +1 -0
- package/packages/shared-skills/skills/debugging/references/methodology/04-oracle-triple.md +3 -3
- package/packages/shared-skills/skills/git-master/SKILL.md +100 -0
- package/packages/shared-skills/skills/git-master/agents/openai.yaml +13 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +176 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +12 -0
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +107 -0
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +119 -14
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +4 -2
- package/packages/shared-skills/skills/programming/references/go/concurrency.md +2 -2
- package/packages/shared-skills/skills/programming/references/python/async-anyio.md +6 -6
- package/packages/shared-skills/skills/programming/references/python/pydantic-ai.md +12 -12
- package/packages/shared-skills/skills/programming/references/typescript/backend-hono.md +7 -7
- package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
- package/packages/shared-skills/skills/review-work/SKILL.md +55 -33
- package/packages/shared-skills/skills/start-work/SKILL.md +76 -19
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +770 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +219 -0
- package/packages/shared-skills/skills/visual-qa/scripts/ansi.test.ts +45 -0
- package/packages/shared-skills/skills/visual-qa/scripts/ansi.ts +17 -0
- package/packages/shared-skills/skills/visual-qa/scripts/cli.test.ts +73 -0
- package/packages/shared-skills/skills/visual-qa/scripts/cli.ts +82 -0
- package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.test.ts +60 -0
- package/packages/shared-skills/skills/visual-qa/scripts/east-asian-width.ts +72 -0
- package/packages/shared-skills/skills/visual-qa/scripts/image-diff.test.ts +70 -0
- package/packages/shared-skills/skills/visual-qa/scripts/image-diff.ts +109 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-crc.ts +27 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-decode.test.ts +44 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-decode.ts +206 -0
- package/packages/shared-skills/skills/visual-qa/scripts/png-synth.ts +57 -0
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +83 -0
- package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.test.ts +57 -0
- package/packages/shared-skills/skills/visual-qa/scripts/tui-grid.ts +88 -0
- package/packages/shared-skills/skills/visual-qa/scripts/types.ts +54 -0
- package/postinstall.mjs +24 -1
- package/dist/agents/custom-agent-summaries.d.ts +0 -8
- package/dist/agents/hephaestus/gpt-5-3-codex.d.ts +0 -20
- package/dist/agents/prometheus/gemini.d.ts +0 -1
- package/dist/agents/prometheus/gpt.d.ts +0 -1
- package/dist/agents/sisyphus-junior/gpt-5-3-codex.d.ts +0 -8
- package/dist/features/background-agent/session-route.d.ts +0 -12
- package/dist/features/background-agent/spawner/parent-directory-resolver.d.ts +0 -6
- package/dist/features/background-agent/state.d.ts +0 -35
- package/dist/features/claude-tasks/session-storage.d.ts +0 -9
- package/dist/features/mcp-oauth/resource-indicator.d.ts +0 -2
- package/dist/features/mcp-oauth/schema.d.ts +0 -6
- package/dist/features/opencode-skill-loader/async-loader.d.ts +0 -6
- package/dist/features/opencode-skill-loader/blocking.d.ts +0 -2
- package/dist/features/opencode-skill-loader/discover-worker.d.ts +0 -1
- package/dist/hooks/session-recovery/recover-empty-content-message-sdk.d.ts +0 -13
- package/dist/shared/bun-hash-shim.d.ts +0 -1
- package/dist/tools/delegate-task/resolve-call-id.d.ts +0 -2
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -383
- /package/packages/lsp-tools-mcp/dist/lsp/{utils.d.ts → startup-failure.d.ts} +0 -0
- /package/packages/lsp-tools-mcp/dist/lsp/{utils.js → startup-failure.js} +0 -0
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
|
-
import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { mkdir, mkdtemp, readFile, utimes, writeFile } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import test from "node:test";
|
|
6
6
|
|
|
7
|
-
import { resolveAutoUpdatePlan, runAutoUpdateCheck } from "../scripts/auto-update.mjs";
|
|
7
|
+
import { resolveAutoUpdatePlan, resolveLazyCodexUpdatePlan, runAutoUpdateCheck } from "../scripts/auto-update.mjs";
|
|
8
|
+
import { resolveSpawnInvocation } from "../scripts/spawn-command.mjs";
|
|
9
|
+
|
|
10
|
+
function autoUpdateEnv(root, extra = {}) {
|
|
11
|
+
return {
|
|
12
|
+
CODEX_HOME: join(root, "codex-home"),
|
|
13
|
+
LAZYCODEX_CURRENT_VERSION: "1.0.0",
|
|
14
|
+
LAZYCODEX_LATEST_VERSION: "1.0.1",
|
|
15
|
+
LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
|
|
16
|
+
LAZYCODEX_AUTO_UPDATE_STATE_PATH: join(root, "state.json"),
|
|
17
|
+
LAZYCODEX_AUTO_UPDATE_LOG_PATH: join(root, "auto-update.log"),
|
|
18
|
+
...extra,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
8
21
|
|
|
9
22
|
test("#given auto update is disabled #when resolving plan #then no command is scheduled", () => {
|
|
10
23
|
const plan = resolveAutoUpdatePlan({
|
|
@@ -19,14 +32,85 @@ test("#given auto update is disabled #when resolving plan #then no command is sc
|
|
|
19
32
|
|
|
20
33
|
test("#given stale state #when resolving plan #then installer update command is scheduled", () => {
|
|
21
34
|
const plan = resolveAutoUpdatePlan({
|
|
22
|
-
env: {},
|
|
35
|
+
env: { LAZYCODEX_CURRENT_VERSION: "1.0.0", LAZYCODEX_LATEST_VERSION: "1.0.1" },
|
|
23
36
|
now: 90_000_000,
|
|
24
37
|
lastCheckedAt: 0,
|
|
25
38
|
});
|
|
26
39
|
|
|
27
40
|
assert.equal(plan.shouldRun, true);
|
|
28
41
|
assert.deepEqual(plan.command, "npx");
|
|
29
|
-
assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--
|
|
42
|
+
assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--codex-autonomous"]);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("#given Windows npm shims #when resolving spawn commands #then cmd shims are used", () => {
|
|
46
|
+
assert.deepEqual(resolveSpawnInvocation("npm", ["install"], "win32"), {
|
|
47
|
+
command: "cmd.exe",
|
|
48
|
+
args: ["/d", "/s", "/c", "npm.cmd", "install"],
|
|
49
|
+
});
|
|
50
|
+
assert.deepEqual(resolveSpawnInvocation("npx", ["--yes", "lazycodex-ai@latest"], "win32"), {
|
|
51
|
+
command: "cmd.exe",
|
|
52
|
+
args: ["/d", "/s", "/c", "npx.cmd", "--yes", "lazycodex-ai@latest"],
|
|
53
|
+
});
|
|
54
|
+
assert.deepEqual(resolveSpawnInvocation("node", ["script.mjs"], "win32"), {
|
|
55
|
+
command: "node",
|
|
56
|
+
args: ["script.mjs"],
|
|
57
|
+
});
|
|
58
|
+
assert.deepEqual(resolveSpawnInvocation("npx", ["--yes"], "darwin"), {
|
|
59
|
+
command: "npx",
|
|
60
|
+
args: ["--yes"],
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("#given current version #when resolving update plan #then skips installer", () => {
|
|
65
|
+
const plan = resolveLazyCodexUpdatePlan({
|
|
66
|
+
currentVersion: "1.0.1",
|
|
67
|
+
latestVersion: "1.0.1",
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
assert.equal(plan.shouldUpdate, false);
|
|
71
|
+
assert.equal(plan.reason, "up-to-date");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("#given latest version is newer #when resolving update plan #then schedules installer", () => {
|
|
75
|
+
const plan = resolveLazyCodexUpdatePlan({
|
|
76
|
+
currentVersion: "1.0.0",
|
|
77
|
+
latestVersion: "1.0.1",
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
assert.equal(plan.shouldUpdate, true);
|
|
81
|
+
assert.deepEqual(plan.command, "npx");
|
|
82
|
+
assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--codex-autonomous"]);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("#given current version is a prerelease of latest #when resolving update plan #then schedules stable installer", () => {
|
|
86
|
+
const plan = resolveLazyCodexUpdatePlan({
|
|
87
|
+
currentVersion: "1.0.1-beta.1",
|
|
88
|
+
latestVersion: "1.0.1",
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
assert.equal(plan.shouldUpdate, true);
|
|
92
|
+
assert.deepEqual(plan.args, ["--yes", "lazycodex-ai@latest", "install", "--no-tui", "--codex-autonomous"]);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("#given malformed latest version #when resolving update plan #then fails closed without scheduling", () => {
|
|
96
|
+
const plan = resolveLazyCodexUpdatePlan({
|
|
97
|
+
currentVersion: "1.0.0",
|
|
98
|
+
latestVersion: "latest",
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
assert.equal(plan.shouldUpdate, false);
|
|
102
|
+
assert.equal(plan.reason, "unknown-latest");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test("#given current version #when resolving auto update plan #then no command is scheduled", () => {
|
|
106
|
+
const plan = resolveAutoUpdatePlan({
|
|
107
|
+
env: { LAZYCODEX_CURRENT_VERSION: "1.0.1", LAZYCODEX_LATEST_VERSION: "1.0.1" },
|
|
108
|
+
now: 90_000_000,
|
|
109
|
+
lastCheckedAt: 0,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
assert.equal(plan.shouldRun, false);
|
|
113
|
+
assert.equal(plan.reason, "up-to-date");
|
|
30
114
|
});
|
|
31
115
|
|
|
32
116
|
test("#given recent state #when resolving plan #then update is throttled", () => {
|
|
@@ -40,31 +124,47 @@ test("#given recent state #when resolving plan #then update is throttled", () =>
|
|
|
40
124
|
assert.equal(plan.reason, "throttled");
|
|
41
125
|
});
|
|
42
126
|
|
|
127
|
+
test("#given installed lazycodex version snapshot #when resolving auto update plan #then uses distribution version", async () => {
|
|
128
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-version-"));
|
|
129
|
+
const versionPath = join(root, "lazycodex-install.json");
|
|
130
|
+
await writeFile(versionPath, JSON.stringify({ packageName: "lazycodex-ai", version: "1.0.1" }));
|
|
131
|
+
|
|
132
|
+
const plan = resolveAutoUpdatePlan({
|
|
133
|
+
env: {
|
|
134
|
+
LAZYCODEX_INSTALLED_VERSION_PATH: versionPath,
|
|
135
|
+
LAZYCODEX_LATEST_VERSION: "1.0.1",
|
|
136
|
+
},
|
|
137
|
+
now: 90_000_000,
|
|
138
|
+
lastCheckedAt: 0,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
assert.equal(plan.shouldRun, false);
|
|
142
|
+
assert.equal(plan.reason, "up-to-date");
|
|
143
|
+
});
|
|
144
|
+
|
|
43
145
|
test("#given test command override #when running check #then records state and launches command", async () => {
|
|
44
146
|
const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-"));
|
|
45
147
|
const logPath = join(root, "spawn.log");
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
148
|
+
const env = autoUpdateEnv(root, {
|
|
149
|
+
LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
|
|
150
|
+
LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
|
|
151
|
+
LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(logPath)}, "ok")`]),
|
|
152
|
+
LAZYCODEX_AUTO_UPDATE_WAIT: "1",
|
|
153
|
+
});
|
|
49
154
|
|
|
50
155
|
const result = await runAutoUpdateCheck({
|
|
51
|
-
env
|
|
52
|
-
CODEX_HOME: codexHome,
|
|
53
|
-
LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
|
|
54
|
-
LAZYCODEX_AUTO_UPDATE_STATE_PATH: statePath,
|
|
55
|
-
LAZYCODEX_AUTO_UPDATE_LOG_PATH: updateLogPath,
|
|
56
|
-
LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
|
|
57
|
-
LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
|
|
58
|
-
LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(logPath)}, "ok")`]),
|
|
59
|
-
LAZYCODEX_AUTO_UPDATE_WAIT: "1",
|
|
60
|
-
},
|
|
156
|
+
env,
|
|
61
157
|
now: 123_456,
|
|
62
158
|
});
|
|
63
159
|
|
|
64
160
|
assert.equal(result.started, true);
|
|
65
|
-
assert.
|
|
161
|
+
assert.deepEqual(JSON.parse(await readFile(env.LAZYCODEX_AUTO_UPDATE_STATE_PATH, "utf8")), {
|
|
162
|
+
lastCheckedAt: 123_456,
|
|
163
|
+
lastAttemptedAt: 123_456,
|
|
164
|
+
lastStatus: "success",
|
|
165
|
+
});
|
|
66
166
|
assert.equal(await readFile(logPath, "utf8"), "ok");
|
|
67
|
-
const updateLog = (await readFile(
|
|
167
|
+
const updateLog = (await readFile(env.LAZYCODEX_AUTO_UPDATE_LOG_PATH, "utf8")).trim().split("\n").map((line) => JSON.parse(line));
|
|
68
168
|
assert.deepEqual(updateLog, [
|
|
69
169
|
{
|
|
70
170
|
timestamp: "1970-01-01T00:02:03.456Z",
|
|
@@ -78,43 +178,104 @@ test("#given test command override #when running check #then records state and l
|
|
|
78
178
|
status: 0,
|
|
79
179
|
},
|
|
80
180
|
]);
|
|
81
|
-
assert.match(await readFile(join(
|
|
181
|
+
assert.match(await readFile(join(env.CODEX_HOME, "config.toml"), "utf8"), /model = "gpt-5\.5"/);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("#given failed waited update #when retry window passes #then next update is not blocked by success throttle", async () => {
|
|
185
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-retry-"));
|
|
186
|
+
const successPath = join(root, "success.log");
|
|
187
|
+
const baseEnv = autoUpdateEnv(root, {
|
|
188
|
+
LAZYCODEX_AUTO_UPDATE_WAIT: "1",
|
|
189
|
+
LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
const failed = await runAutoUpdateCheck({
|
|
193
|
+
env: {
|
|
194
|
+
...baseEnv,
|
|
195
|
+
LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", "process.exit(1)"]),
|
|
196
|
+
},
|
|
197
|
+
now: 123_456,
|
|
198
|
+
});
|
|
199
|
+
assert.equal(failed.started, true);
|
|
200
|
+
assert.equal(failed.status, 1);
|
|
201
|
+
assert.deepEqual(JSON.parse(await readFile(baseEnv.LAZYCODEX_AUTO_UPDATE_STATE_PATH, "utf8")), {
|
|
202
|
+
lastAttemptedAt: 123_456,
|
|
203
|
+
lastStatus: "failed",
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const retried = await runAutoUpdateCheck({
|
|
207
|
+
env: {
|
|
208
|
+
...baseEnv,
|
|
209
|
+
LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(successPath)}, "ok")`]),
|
|
210
|
+
},
|
|
211
|
+
now: 123_456 + 30 * 60 * 1_000 + 1,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
assert.equal(retried.started, true);
|
|
215
|
+
assert.equal(retried.status, 0);
|
|
216
|
+
assert.equal(await readFile(successPath, "utf8"), "ok");
|
|
82
217
|
});
|
|
83
218
|
|
|
84
219
|
test("#given active lock #when running check #then skips concurrent update", async () => {
|
|
85
220
|
const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-lock-"));
|
|
86
|
-
const statePath = join(root, "state.json");
|
|
87
221
|
const lockPath = join(root, "state.json.lock");
|
|
88
|
-
const codexHome = join(root, "codex-home");
|
|
89
222
|
await writeFile(lockPath, "locked\n");
|
|
90
223
|
|
|
91
224
|
const result = await runAutoUpdateCheck({
|
|
92
|
-
env: {
|
|
93
|
-
CODEX_HOME: codexHome,
|
|
94
|
-
LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
|
|
95
|
-
LAZYCODEX_AUTO_UPDATE_STATE_PATH: statePath,
|
|
225
|
+
env: autoUpdateEnv(root, {
|
|
96
226
|
LAZYCODEX_AUTO_UPDATE_LOCK_PATH: lockPath,
|
|
97
227
|
LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
|
|
98
228
|
LAZYCODEX_AUTO_UPDATE_LOCK_STALE_MS: "600000",
|
|
99
|
-
},
|
|
229
|
+
}),
|
|
100
230
|
now: 123_456,
|
|
101
231
|
});
|
|
102
232
|
|
|
103
233
|
assert.equal(result.started, false);
|
|
104
234
|
assert.equal(result.reason, "locked");
|
|
105
|
-
assert.match(await readFile(join(
|
|
235
|
+
assert.match(await readFile(join(root, "codex-home", "config.toml"), "utf8"), /model_context_window = 400000/);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test("#given stale lock #when running check #then removes lock and runs update", async () => {
|
|
239
|
+
const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-stale-lock-"));
|
|
240
|
+
const lockPath = join(root, "state.json.lock");
|
|
241
|
+
const successPath = join(root, "success.log");
|
|
242
|
+
await writeFile(lockPath, "locked\n");
|
|
243
|
+
await utimes(lockPath, new Date(0), new Date(0));
|
|
244
|
+
const env = autoUpdateEnv(root, {
|
|
245
|
+
LAZYCODEX_AUTO_UPDATE_LOCK_PATH: lockPath,
|
|
246
|
+
LAZYCODEX_AUTO_UPDATE_INTERVAL_MS: "0",
|
|
247
|
+
LAZYCODEX_AUTO_UPDATE_LOCK_STALE_MS: "600000",
|
|
248
|
+
LAZYCODEX_AUTO_UPDATE_WAIT: "1",
|
|
249
|
+
LAZYCODEX_AUTO_UPDATE_COMMAND: process.execPath,
|
|
250
|
+
LAZYCODEX_AUTO_UPDATE_ARGS_JSON: JSON.stringify(["-e", `require("node:fs").writeFileSync(${JSON.stringify(successPath)}, "ok")`]),
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
const result = await runAutoUpdateCheck({
|
|
254
|
+
env,
|
|
255
|
+
now: 1_000_000,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
assert.equal(result.started, true);
|
|
259
|
+
assert.equal(result.status, 0);
|
|
260
|
+
assert.equal(await readFile(successPath, "utf8"), "ok");
|
|
261
|
+
assert.deepEqual(JSON.parse(await readFile(env.LAZYCODEX_AUTO_UPDATE_STATE_PATH, "utf8")), {
|
|
262
|
+
lastCheckedAt: 1_000_000,
|
|
263
|
+
lastAttemptedAt: 1_000_000,
|
|
264
|
+
lastStatus: "success",
|
|
265
|
+
});
|
|
106
266
|
});
|
|
107
267
|
|
|
108
268
|
test("#given throttled updater and stale Codex config #when running check #then config migration still runs", async () => {
|
|
109
269
|
const root = await mkdtemp(join(tmpdir(), "lazycodex-auto-update-migration-"));
|
|
110
270
|
const statePath = join(root, "state.json");
|
|
271
|
+
const updateLogPath = join(root, "auto-update.log");
|
|
111
272
|
const codexHome = join(root, "codex-home");
|
|
112
273
|
await writeFile(statePath, JSON.stringify({ lastCheckedAt: 99_999 }, null, 2));
|
|
113
274
|
await mkdir(codexHome, { recursive: true });
|
|
114
275
|
await writeFile(
|
|
115
276
|
join(codexHome, "config.toml"),
|
|
116
277
|
[
|
|
117
|
-
'model = "gpt-5.
|
|
278
|
+
'model = "gpt-5.5"',
|
|
118
279
|
"model_context_window = 272000",
|
|
119
280
|
'model_reasoning_effort = "low"',
|
|
120
281
|
'plan_mode_reasoning_effort = "medium"',
|
|
@@ -130,6 +291,7 @@ test("#given throttled updater and stale Codex config #when running check #then
|
|
|
130
291
|
CODEX_HOME: codexHome,
|
|
131
292
|
LAZYCODEX_MODEL_CATALOG_STATE_PATH: join(root, "model-state.json"),
|
|
132
293
|
LAZYCODEX_AUTO_UPDATE_STATE_PATH: statePath,
|
|
294
|
+
LAZYCODEX_AUTO_UPDATE_LOG_PATH: updateLogPath,
|
|
133
295
|
},
|
|
134
296
|
now: 100_000,
|
|
135
297
|
});
|
|
@@ -13,7 +13,7 @@ const EXPECTED_COMPONENT_BINS = new Map([
|
|
|
13
13
|
["start-work-continuation", "omo-start-work-continuation"],
|
|
14
14
|
["telemetry", "omo-telemetry"],
|
|
15
15
|
["ultrawork", "omo-ultrawork"],
|
|
16
|
-
["ulw-loop", "omo"],
|
|
16
|
+
["ulw-loop", "omo-ulw-loop"],
|
|
17
17
|
]);
|
|
18
18
|
|
|
19
19
|
const EXPECTED_USAGE_PREFIXES = new Map([
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const pluginRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
8
|
+
|
|
9
|
+
test("#given start-work continuation directive #when inspected #then final handoff requires review and debugging gate", async () => {
|
|
10
|
+
const text = await readFile(join(pluginRoot, "components", "start-work-continuation", "directive.md"), "utf8");
|
|
11
|
+
|
|
12
|
+
assert.match(text, /Global Review and Debugging Gate/);
|
|
13
|
+
assert.match(text, /review-work/);
|
|
14
|
+
assert.match(text, /debugging/);
|
|
15
|
+
assert.match(text, /Do not print `ORCHESTRATION COMPLETE`/);
|
|
16
|
+
assert.match(text, /Do not create a PR, PR handoff, or branch handoff/);
|
|
17
|
+
assert.match(text, /redact.*secrets.*PII/s);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("#given Hephaestus baseline rule #when inspected #then significant implementation and PR handoff require the same gate", async () => {
|
|
21
|
+
const text = await readFile(join(pluginRoot, "components", "rules", "bundled-rules", "hephaestus.md"), "utf8");
|
|
22
|
+
|
|
23
|
+
assert.match(text, /Global Review and Debugging Gate/);
|
|
24
|
+
assert.match(text, /significant implementation work/);
|
|
25
|
+
assert.match(text, /review-work/);
|
|
26
|
+
assert.match(text, /debugging/);
|
|
27
|
+
assert.match(text, /PR handoff/);
|
|
28
|
+
assert.match(text, /redact.*secrets.*PII/s);
|
|
29
|
+
});
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "../scripts/hook-status-message.mjs";
|
|
12
12
|
|
|
13
13
|
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
14
|
+
const repoRoot = join(root, "..", "..", "..");
|
|
14
15
|
|
|
15
16
|
const AGGREGATE_EXPECTED_LABELS = new Map([
|
|
16
17
|
["hooks/hooks.json:SessionStart:0:0", "Loading Project Rules"],
|
|
@@ -49,6 +50,18 @@ async function readJson(relativePath) {
|
|
|
49
50
|
return JSON.parse(await readFile(join(root, relativePath), "utf8"));
|
|
50
51
|
}
|
|
51
52
|
|
|
53
|
+
async function readRepoJson(relativePath) {
|
|
54
|
+
return JSON.parse(await readFile(join(repoRoot, relativePath), "utf8"));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function readPluginVersion() {
|
|
58
|
+
return (await readJson(".codex-plugin/plugin.json")).version;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function readComponentVersion(componentName) {
|
|
62
|
+
return (await readJson(join("components", componentName, "package.json"))).version;
|
|
63
|
+
}
|
|
64
|
+
|
|
52
65
|
async function exists(relativePath) {
|
|
53
66
|
try {
|
|
54
67
|
await access(join(root, relativePath));
|
|
@@ -66,8 +79,8 @@ async function readComponentHookManifests() {
|
|
|
66
79
|
if (!entry.isDirectory()) continue;
|
|
67
80
|
const source = join("components", entry.name, "hooks", "hooks.json");
|
|
68
81
|
if (!(await exists(source))) continue;
|
|
69
|
-
const
|
|
70
|
-
manifests.push({ source, version
|
|
82
|
+
const version = await readComponentVersion(entry.name);
|
|
83
|
+
manifests.push({ source, version, hooks: await readJson(source) });
|
|
71
84
|
}
|
|
72
85
|
return manifests.sort((left, right) => left.source.localeCompare(right.source));
|
|
73
86
|
}
|
|
@@ -91,16 +104,16 @@ function collectCommandHooks(hooks, source, version) {
|
|
|
91
104
|
return commandHooks;
|
|
92
105
|
}
|
|
93
106
|
|
|
94
|
-
test("#given hook status label #when formatting #then prefixes LazyCodex with version", () => {
|
|
107
|
+
test("#given hook status label #when formatting #then prefixes LazyCodex with current version", async () => {
|
|
95
108
|
// given
|
|
96
|
-
const version = "
|
|
109
|
+
const version = (await readRepoJson("package.json")).version;
|
|
97
110
|
const label = "Checking Comments";
|
|
98
111
|
|
|
99
112
|
// when
|
|
100
113
|
const message = formatLazyCodexHookStatusMessage(version, label);
|
|
101
114
|
|
|
102
115
|
// then
|
|
103
|
-
assert.equal(message,
|
|
116
|
+
assert.equal(message, `LazyCodex(${version}): Checking Comments`);
|
|
104
117
|
});
|
|
105
118
|
|
|
106
119
|
test("#given hook status label with blank version #when formatting #then prefixes LazyCodex with local version", () => {
|
|
@@ -115,9 +128,9 @@ test("#given hook status label with blank version #when formatting #then prefixe
|
|
|
115
128
|
assert.equal(message, "LazyCodex(local): Checking Comments");
|
|
116
129
|
});
|
|
117
130
|
|
|
118
|
-
test("#given loose legacy status label #when normalizing #then removes OMO wording and title-cases label", () => {
|
|
131
|
+
test("#given loose legacy status label #when normalizing #then removes OMO wording and title-cases label", async () => {
|
|
119
132
|
// given
|
|
120
|
-
const version = "
|
|
133
|
+
const version = (await readRepoJson("package.json")).version;
|
|
121
134
|
const label = " checking OMO comments ";
|
|
122
135
|
|
|
123
136
|
// when
|
|
@@ -126,12 +139,12 @@ test("#given loose legacy status label #when normalizing #then removes OMO wordi
|
|
|
126
139
|
|
|
127
140
|
// then
|
|
128
141
|
assert.equal(normalized, "Checking Comments");
|
|
129
|
-
assert.equal(message,
|
|
142
|
+
assert.equal(message, `LazyCodex(${version}): Checking Comments`);
|
|
130
143
|
});
|
|
131
144
|
|
|
132
145
|
test("#given aggregate comment-checker hook #when status is inspected #then it uses LazyCodex comments label", async () => {
|
|
133
146
|
// given
|
|
134
|
-
const aggregateVersion =
|
|
147
|
+
const aggregateVersion = await readPluginVersion();
|
|
135
148
|
const aggregateHooks = await readJson("hooks/hooks.json");
|
|
136
149
|
|
|
137
150
|
// when
|
|
@@ -145,7 +158,7 @@ test("#given aggregate comment-checker hook #when status is inspected #then it u
|
|
|
145
158
|
|
|
146
159
|
test("#given aggregate and component hooks #when status messages are inspected #then all use the LazyCodex formatter", async () => {
|
|
147
160
|
// given
|
|
148
|
-
const aggregateVersion =
|
|
161
|
+
const aggregateVersion = await readPluginVersion();
|
|
149
162
|
const aggregateHooks = await readJson("hooks/hooks.json");
|
|
150
163
|
const componentManifests = await readComponentHookManifests();
|
|
151
164
|
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
+
|
|
9
|
+
test("#given synced lcx-report-bug skill #when inspected #then it files LazyCodex bug issues with generated labels", async () => {
|
|
10
|
+
// given
|
|
11
|
+
const skillRoot = join(root, "skills", "lcx-report-bug");
|
|
12
|
+
|
|
13
|
+
// when
|
|
14
|
+
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
15
|
+
const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
|
|
16
|
+
|
|
17
|
+
// then
|
|
18
|
+
assert.match(skill, /^---\r?\nname: lcx-report-bug\r?\n/m);
|
|
19
|
+
assert.match(skill, /code-yeongyu\/lazycodex/);
|
|
20
|
+
assert.match(skill, /openai\/codex/);
|
|
21
|
+
assert.match(skill, /\/tmp\/openai-codex-source/);
|
|
22
|
+
assert.match(skill, /\$omo:debugging/);
|
|
23
|
+
assert.match(skill, /Repository Decision/);
|
|
24
|
+
assert.match(skill, /TARGET_REPO="code-yeongyu\/lazycodex" # or openai\/codex/);
|
|
25
|
+
assert.match(skill, /LABEL_ARGS=\(\)/);
|
|
26
|
+
assert.match(skill, /gh label create lazycodex-generated.*--force/);
|
|
27
|
+
assert.match(skill, /gh issue create --repo "\$TARGET_REPO".*"\$\{LABEL_ARGS\[@\]\}"/);
|
|
28
|
+
assert.match(skill, /gh pr create --repo "\$TARGET_REPO".*"\$\{LABEL_ARGS\[@\]\}"/);
|
|
29
|
+
assert.match(skill, /lazycodex-generated/);
|
|
30
|
+
assert.match(skill, /This issue or PR was generated by LazyCodex/);
|
|
31
|
+
assert.match(skill, /Tag: lazycodex-generated/);
|
|
32
|
+
assert.match(skill, /Browser use fallback/);
|
|
33
|
+
assert.match(skill, /Computer use fallback/);
|
|
34
|
+
assert.match(skill, /## Issue Body Template/);
|
|
35
|
+
assert.match(interfaceMetadata, /display_name: "lcx-report-bug \(omo\)"/);
|
|
36
|
+
assert.match(interfaceMetadata, /- "lazycodex bug"/);
|
|
37
|
+
assert.match(interfaceMetadata, /- "openai codex bug"/);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("#given synced lcx-contribute-bug-fix skill #when inspected #then it contributes LazyCodex bug-fix PRs from fresh temp workspaces", async () => {
|
|
41
|
+
// given
|
|
42
|
+
const skillRoot = join(root, "skills", "lcx-contribute-bug-fix");
|
|
43
|
+
|
|
44
|
+
// when
|
|
45
|
+
const skill = await readFile(join(skillRoot, "SKILL.md"), "utf8");
|
|
46
|
+
const interfaceMetadata = await readFile(join(skillRoot, "agents", "openai.yaml"), "utf8");
|
|
47
|
+
const script = await readFile(join(skillRoot, "scripts", "create-pr-body.mjs"), "utf8");
|
|
48
|
+
|
|
49
|
+
// then
|
|
50
|
+
assert.match(skill, /^---\r?\nname: lcx-contribute-bug-fix\r?\n/m);
|
|
51
|
+
assert.match(skill, /Contribute a verified bug-fix PR/);
|
|
52
|
+
assert.match(skill, /fresh `\/tmp` clone\/worktree/);
|
|
53
|
+
assert.match(skill, /\/tmp\/lazycodex-fix-/);
|
|
54
|
+
assert.match(skill, /git worktree add/);
|
|
55
|
+
assert.match(skill, /apply `lazycodex-generated` when label management is available/);
|
|
56
|
+
assert.match(skill, /git add -A/);
|
|
57
|
+
assert.match(skill, /git commit -m/);
|
|
58
|
+
assert.match(skill, /git log --oneline "origin\/\$BASE_BRANCH\.\.HEAD"/);
|
|
59
|
+
assert.match(skill, /gh repo fork "\$TARGET_REPO" --remote --remote-name fork/);
|
|
60
|
+
assert.match(skill, /PUSH_REMOTE/);
|
|
61
|
+
assert.match(skill, /lazycodex-generated/);
|
|
62
|
+
assert.match(skill, /LABEL_ARGS=\(\)/);
|
|
63
|
+
assert.match(skill, /gh label create lazycodex-generated.*--force/);
|
|
64
|
+
assert.match(skill, /gh pr create --repo "\$TARGET_REPO".*"\$\{LABEL_ARGS\[@\]\}"/);
|
|
65
|
+
assert.match(skill, /--head "\$PR_HEAD"/);
|
|
66
|
+
assert.doesNotMatch(skill, /a PR without the `lazycodex-generated` label/);
|
|
67
|
+
assert.match(skill, /scripts\/create-pr-body\.mjs/);
|
|
68
|
+
assert.match(skill, /## Problem Situation/);
|
|
69
|
+
assert.match(skill, /## Reproduction Logs/);
|
|
70
|
+
assert.match(skill, /## Approach/);
|
|
71
|
+
assert.match(skill, /## Why I Am Confident/);
|
|
72
|
+
assert.match(skill, /## Risks/);
|
|
73
|
+
assert.match(skill, /## User-Visible Behavior Changes/);
|
|
74
|
+
assert.match(skill, /Clean up/);
|
|
75
|
+
assert.match(interfaceMetadata, /display_name: "lcx-contribute-bug-fix \(omo\)"/);
|
|
76
|
+
assert.match(interfaceMetadata, /- "contribute a bug fix"/);
|
|
77
|
+
assert.match(interfaceMetadata, /- "fix bug pr"/);
|
|
78
|
+
assert.match(script, /createLazyCodexBugFixPrBody/);
|
|
79
|
+
assert.match(script, /Problem Situation/);
|
|
80
|
+
assert.match(script, /Why I Am Confident/);
|
|
81
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { test } from "node:test";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
const root = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
9
|
+
const scriptPath = join(root, "skills", "lcx-contribute-bug-fix", "scripts", "create-pr-body.mjs");
|
|
10
|
+
|
|
11
|
+
test("#given complete bug-fix evidence #when creating a PR body #then required LazyCodex sections and label are emitted", async () => {
|
|
12
|
+
// given
|
|
13
|
+
const { createLazyCodexBugFixPrBody } = await import(`file://${scriptPath}`);
|
|
14
|
+
const input = {
|
|
15
|
+
title: "Fix Codex skill sync drift",
|
|
16
|
+
targetRepository: "code-yeongyu/lazycodex",
|
|
17
|
+
problem: "Skill sync omitted a shared skill from the aggregate plugin.",
|
|
18
|
+
reproductionLogs: "npm test -- --test-name-pattern sync-skills failed before the fix.",
|
|
19
|
+
approach: "Add the missing shared skill source and sync the aggregate plugin.",
|
|
20
|
+
confidence: "The failing sync test now passes and the aggregate skill matches the source.",
|
|
21
|
+
risks: "Low risk; this changes only packaged skill instructions.",
|
|
22
|
+
userVisibleBehaviorChanges: "Users can ask LazyCodex to contribute a bug-fix PR directly.",
|
|
23
|
+
verification: ["npm test -- --test-name-pattern lcx-contribute-bug-fix", "npm run sync:skills"],
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// when
|
|
27
|
+
const body = createLazyCodexBugFixPrBody(input);
|
|
28
|
+
|
|
29
|
+
// then
|
|
30
|
+
assert.match(body, /^## Problem Situation/m);
|
|
31
|
+
assert.match(body, /## Reproduction Logs/);
|
|
32
|
+
assert.match(body, /## Approach/);
|
|
33
|
+
assert.match(body, /## Why I Am Confident/);
|
|
34
|
+
assert.match(body, /## Risks/);
|
|
35
|
+
assert.match(body, /## User-Visible Behavior Changes/);
|
|
36
|
+
assert.match(body, /## Verification/);
|
|
37
|
+
assert.match(body, /lazycodex-generated/);
|
|
38
|
+
assert.match(body, /This PR was debugged, implemented, and created with \[LazyCodex\]/);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("#given missing bug-fix evidence #when creating a PR body #then the script rejects the incomplete payload", async () => {
|
|
42
|
+
// given
|
|
43
|
+
const { createLazyCodexBugFixPrBody } = await import(`file://${scriptPath}`);
|
|
44
|
+
|
|
45
|
+
// when
|
|
46
|
+
const action = () =>
|
|
47
|
+
createLazyCodexBugFixPrBody({
|
|
48
|
+
title: "Fix Codex skill sync drift",
|
|
49
|
+
targetRepository: "code-yeongyu/lazycodex",
|
|
50
|
+
problem: "Skill sync omitted a shared skill from the aggregate plugin.",
|
|
51
|
+
reproductionLogs: "",
|
|
52
|
+
approach: "Add the missing shared skill source and sync the aggregate plugin.",
|
|
53
|
+
confidence: "The failing sync test now passes.",
|
|
54
|
+
risks: "Low risk.",
|
|
55
|
+
userVisibleBehaviorChanges: "Users get a new skill.",
|
|
56
|
+
verification: ["npm test"],
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// then
|
|
60
|
+
assert.throws(action, /reproductionLogs must be a non-empty string/);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("#given a JSON payload path #when running the PR body script #then markdown is written to the requested file", async () => {
|
|
64
|
+
// given
|
|
65
|
+
const workspace = await mkdtemp(join(tmpdir(), "lcx-pr-body-test-"));
|
|
66
|
+
const inputPath = join(workspace, "input.json");
|
|
67
|
+
const outputPath = join(workspace, "body.md");
|
|
68
|
+
await writeFile(
|
|
69
|
+
inputPath,
|
|
70
|
+
JSON.stringify({
|
|
71
|
+
title: "Fix Codex skill sync drift",
|
|
72
|
+
targetRepository: "code-yeongyu/lazycodex",
|
|
73
|
+
problem: "Skill sync omitted a shared skill from the aggregate plugin.",
|
|
74
|
+
reproductionLogs: "node --test failed before the fix.",
|
|
75
|
+
approach: "Add the missing shared skill source and sync the aggregate plugin.",
|
|
76
|
+
confidence: "The failing sync test now passes.",
|
|
77
|
+
risks: "Low risk.",
|
|
78
|
+
userVisibleBehaviorChanges: "Users get a direct bug-fix PR skill.",
|
|
79
|
+
verification: ["node --test test/lcx-contribute-bug-fix-template.test.mjs"],
|
|
80
|
+
}),
|
|
81
|
+
"utf8",
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// when
|
|
85
|
+
const { spawnSync } = await import("node:child_process");
|
|
86
|
+
const result = spawnSync(process.execPath, [scriptPath, inputPath, outputPath], { encoding: "utf8" });
|
|
87
|
+
|
|
88
|
+
// then
|
|
89
|
+
assert.equal(result.status, 0, result.stderr);
|
|
90
|
+
assert.match(await readFile(outputPath, "utf8"), /## User-Visible Behavior Changes/);
|
|
91
|
+
});
|