oh-my-opencode 5.0.0-beta.3 → 5.0.0-beta.31
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/publish.md +44 -16
- package/.agents/skills/publish/SKILL.md +44 -16
- package/.agents/skills/senpi-qa/SKILL.md +80 -0
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
- package/.agents/skills/work-with-pr/SKILL.md +37 -23
- package/.opencode/command/publish.md +44 -16
- package/.opencode/skills/work-with-pr/SKILL.md +37 -23
- package/README.ja.md +25 -21
- package/README.ko.md +25 -21
- package/README.md +38 -23
- package/README.ru.md +24 -20
- package/README.zh-cn.md +25 -21
- package/dist/agents/atlas/agent.d.ts +0 -1
- package/dist/agents/sisyphus/grok-4.d.ts +20 -0
- package/dist/agents/sisyphus/index.d.ts +2 -0
- package/dist/agents/sisyphus-agent-config.d.ts +6 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
- package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +22601 -20302
- package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
- package/dist/cli/run/on-complete-hook.d.ts +2 -0
- package/dist/cli/runtime-commands.d.ts +1 -1
- package/dist/cli/worktree-sweep/classify.d.ts +16 -0
- package/dist/cli/worktree-sweep/format.d.ts +8 -0
- package/dist/cli/worktree-sweep/git.d.ts +19 -0
- package/dist/cli/worktree-sweep/index.d.ts +7 -0
- package/dist/cli/worktree-sweep/options.d.ts +2 -0
- package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
- package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
- package/dist/cli/worktree-sweep/types.d.ts +65 -0
- package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
- package/dist/cli-node/index.js +22219 -19897
- package/dist/config/schema/background-task.d.ts +1 -0
- package/dist/config/schema/commands.d.ts +1 -1
- package/dist/config/schema/hooks.d.ts +1 -1
- package/dist/config/schema/oh-my-opencode-config.d.ts +5 -1
- package/dist/config/schema/ulw-execute.d.ts +5 -0
- package/dist/config/validate.d.ts +2 -0
- package/dist/create-hooks.d.ts +3 -1
- package/dist/features/background-agent/constants.d.ts +0 -7
- package/dist/features/background-agent/manager.d.ts +2 -1
- package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
- package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
- package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
- package/dist/features/btw-side/context-injector.d.ts +15 -0
- package/dist/features/btw-side/index.d.ts +8 -0
- package/dist/features/btw-side/metadata.d.ts +15 -0
- package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
- package/dist/features/btw-side/server-session-registry.d.ts +8 -0
- package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
- package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
- package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
- package/dist/features/btw-side/tui-controller.d.ts +19 -0
- package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
- package/dist/features/btw-side/tui-keymap.d.ts +17 -0
- package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
- package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
- package/dist/features/btw-side/tui-picker.d.ts +9 -0
- package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
- package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
- package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
- package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
- package/dist/features/btw-side/tui-side-start.d.ts +9 -0
- package/dist/features/btw-side/tui-wiring.d.ts +8 -0
- package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/features/opengateway-provider/index.d.ts +13 -0
- package/dist/features/task-toast-manager/manager.d.ts +0 -24
- package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +15 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
- package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
- package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
- package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
- package/dist/hooks/atlas/event-handler.d.ts +1 -0
- package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
- package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
- package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
- package/dist/hooks/atlas/types.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
- package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
- package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
- package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
- package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
- package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/keyword-detector/hook.d.ts +7 -0
- package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
- package/dist/hooks/model-fallback/hook.d.ts +1 -1
- package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
- package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
- package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
- package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
- package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
- package/dist/hooks/runtime-fallback/types.d.ts +3 -1
- package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
- package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
- package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
- package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
- package/dist/index.js +12989 -7152
- package/dist/oh-my-opencode.schema.json +20 -2
- package/dist/plugin/chat-message/types.d.ts +3 -3
- package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
- package/dist/plugin/event-session-lifecycle.d.ts +1 -0
- package/dist/plugin/hooks/create-core-hooks.d.ts +2 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -2
- package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
- package/dist/plugin/messages-transform.d.ts +1 -0
- package/dist/plugin-dispose.d.ts +3 -0
- package/dist/shared/agent-tool-restrictions.d.ts +0 -1
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/legacy-plugin-warning.d.ts +2 -1
- package/dist/shared/normalize-sdk-response.d.ts +1 -0
- package/dist/shared/plugin-entry-migrator.d.ts +4 -3
- package/dist/shared/plugin-entry-shape.d.ts +6 -0
- package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
- package/dist/shared/shell-env.d.ts +1 -1
- package/dist/skills/ast-grep/AGENTS.md +51 -0
- package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/dist/skills/data-scientist/SKILL.md +99 -239
- package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/dist/skills/data-scientist/references/placement.md +74 -0
- package/dist/skills/data-scientist/references/polars-lane.md +95 -0
- package/dist/skills/data-scientist/references/uv-setup.md +1 -1
- package/dist/skills/data-scientist/references/visualization.md +64 -0
- package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/dist/skills/debugging/SKILL.md +2 -0
- package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
- package/dist/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/dist/skills/debugging/references/runtimes/go.md +15 -1
- package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/dist/skills/debugging/references/runtimes/node.md +25 -0
- package/dist/skills/debugging/references/runtimes/python.md +13 -0
- package/dist/skills/debugging/references/runtimes/rust.md +41 -0
- package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
- package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/dist/skills/debugging/references/tools/dap.md +103 -0
- package/dist/skills/debugging/references/tools/frida.md +193 -0
- package/dist/skills/frontend/SKILL.md +11 -7
- package/dist/skills/frontend/references/design/_INDEX.md +1 -0
- package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
- package/dist/skills/frontend/references/design/stylegallery.md +80 -0
- package/dist/skills/frontend/references/designpowers/README.md +1 -1
- package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/dist/skills/frontend/references/designpowers/routing.md +5 -5
- package/dist/skills/review-work/SKILL.md +3 -3
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/dist/skills/ultimate-browsing/SKILL.md +2 -0
- package/dist/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/dist/skills/{start-work → ulw-execute}/SKILL.md +9 -8
- package/dist/skills/ulw-plan/SKILL.md +6 -6
- package/dist/skills/ulw-plan/references/full-workflow.md +31 -7
- package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
- package/dist/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/dist/skills/ulw-research/SKILL.md +4 -2
- package/dist/skills/visual-qa/AGENTS.md +58 -0
- package/dist/skills/visual-qa/SKILL.md +3 -2
- package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
- package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
- package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
- package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
- package/dist/tools/delegate-task/tool-description.d.ts +3 -1
- package/dist/tools/delegate-task/types.d.ts +4 -0
- package/dist/tui.d.ts +12 -0
- package/dist/tui.js +11522 -11501
- package/package.json +42 -36
- package/packages/git-bash-mcp/dist/cli.js +6 -1
- package/packages/git-bash-mcp/package.json +1 -1
- package/packages/lsp-core/src/index.ts +1 -0
- package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +0 -28
- package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
- package/packages/lsp-core/src/lsp/client-wrapper.test.ts +163 -13
- package/packages/lsp-core/src/lsp/client-wrapper.ts +110 -23
- package/packages/lsp-core/src/lsp/client.ts +26 -0
- package/packages/lsp-core/src/lsp/connection.ts +16 -0
- package/packages/lsp-core/src/lsp/constants.ts +6 -0
- package/packages/lsp-core/src/lsp/errors.ts +15 -0
- package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
- package/packages/lsp-core/src/lsp/format-document.ts +90 -0
- package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
- package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
- package/packages/lsp-core/src/lsp/manager.ts +138 -12
- package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
- package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
- package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
- package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
- package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
- package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
- package/packages/lsp-core/src/lsp/transport.ts +9 -0
- package/packages/lsp-core/src/lsp/types.ts +8 -0
- package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
- package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
- package/packages/lsp-core/src/mcp.ts +3 -0
- package/packages/lsp-core/src/request-context.test.ts +29 -0
- package/packages/lsp-core/src/request-context.ts +1 -1
- package/packages/lsp-core/src/tool-surface.test.ts +13 -1
- package/packages/lsp-core/src/tools/definitions.ts +14 -0
- package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
- package/packages/lsp-core/src/tools/format.test.ts +56 -0
- package/packages/lsp-core/src/tools/format.ts +56 -0
- package/packages/lsp-core/src/tools/index.ts +1 -0
- package/packages/lsp-core/src/tools/navigation.ts +4 -2
- package/packages/lsp-core/src/tools/rename.ts +4 -2
- package/packages/lsp-core/src/tools/symbols.ts +1 -1
- package/packages/lsp-core/src/tools/types.ts +10 -0
- package/packages/lsp-daemon/dist/cli.js +752 -307
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +712 -264
- package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
- package/packages/lsp-daemon/dist/daemon-client.js +3 -0
- package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
- package/packages/lsp-daemon/dist/index.js +716 -273
- package/packages/lsp-daemon/dist/proxy.js +3 -0
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-daemon/package.json +1 -1
- package/packages/lsp-tools-mcp/dist/cli.js +671 -228
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +207 -103
- package/packages/lsp-tools-mcp/dist/mcp.js +673 -230
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +677 -238
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -4
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -4
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/README.md +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +34 -33
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +323 -117
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +275 -85
- package/packages/omo-codex/plugin/components/codegraph/package.json +4 -4
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +12 -0
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable-idle.test.ts +47 -0
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +4 -21
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +702 -278
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +60 -45
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +7 -7
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +9 -5
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +5 -6
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2463 -437
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2467 -441
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +5 -0
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +13 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +13 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +5 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +5 -5
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +12 -12
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +28 -0
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +1 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +8 -22
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +17 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +11 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +124 -68
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +9 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +7 -10
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +15 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +50 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +3 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +16 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +11 -14
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +73 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +44 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +26 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +27 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +7 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +45 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +20 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +3 -3
- package/packages/omo-codex/plugin/package-lock.json +681 -395
- package/packages/omo-codex/plugin/package.json +2 -2
- package/packages/omo-codex/plugin/scripts/AGENTS.md +40 -0
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +3 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +11 -11
- package/packages/omo-codex/plugin/shared/package.json +3 -4
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +11 -7
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +13 -1
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +12 -11
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +4 -2
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +3 -2
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +8 -28
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +8 -8
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +12 -12
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
- package/packages/omo-codex/scripts/AGENTS.md +36 -0
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2637 -549
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -0
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
- package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +11 -7
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +179 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +13 -11
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +9 -8
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +6 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/shared-skills/skills/ulw-research/SKILL.md +4 -2
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +3 -2
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/dist/config/schema/start-work.d.ts +0 -5
- package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
- package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
- package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
- package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
- package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
- package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
- package/dist/skills/data-scientist/references/execution-templates.md +0 -197
- package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
- package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
- package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -1,45 +1,218 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { delimiter, join } from "node:path";
|
|
2
|
+
import { delimiter, dirname, isAbsolute, join, resolve } from "node:path";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Project markers that authorize probing a set of repo-local binary directories.
|
|
6
|
+
*
|
|
7
|
+
* A local bin directory is only trusted when the sibling marker proves the directory
|
|
8
|
+
* belongs to a project of that ecosystem. An unmarked `node_modules/.bin` is ignored so
|
|
9
|
+
* that a stray directory cannot inject an executable into the resolution order.
|
|
10
|
+
*/
|
|
11
|
+
interface LocalBinRule {
|
|
12
|
+
readonly markers: readonly string[];
|
|
13
|
+
readonly binDirs: readonly string[];
|
|
14
|
+
}
|
|
6
15
|
|
|
7
|
-
|
|
8
|
-
|
|
16
|
+
const LOCAL_BIN_RULES: readonly LocalBinRule[] = [
|
|
17
|
+
{
|
|
18
|
+
markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
|
|
19
|
+
binDirs: [join("node_modules", ".bin")],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
markers: [
|
|
23
|
+
"pyproject.toml",
|
|
24
|
+
"ty.toml",
|
|
25
|
+
"requirements.txt",
|
|
26
|
+
"setup.py",
|
|
27
|
+
"setup.cfg",
|
|
28
|
+
"Pipfile",
|
|
29
|
+
"pyrightconfig.json",
|
|
30
|
+
"ruff.toml",
|
|
31
|
+
".ruff.toml",
|
|
32
|
+
],
|
|
33
|
+
binDirs: [
|
|
34
|
+
join(".venv", "bin"),
|
|
35
|
+
join(".venv", "Scripts"),
|
|
36
|
+
join("venv", "bin"),
|
|
37
|
+
join("venv", "Scripts"),
|
|
38
|
+
join(".env", "bin"),
|
|
39
|
+
join(".env", "Scripts"),
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
markers: ["Gemfile", "Gemfile.lock"],
|
|
44
|
+
binDirs: [join("vendor", "bundle", "bin"), "bin"],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
markers: ["go.mod", "go.sum", "go.work"],
|
|
48
|
+
binDirs: ["bin"],
|
|
49
|
+
},
|
|
50
|
+
];
|
|
9
51
|
|
|
10
|
-
|
|
11
|
-
|
|
52
|
+
export interface ResolveServerBinaryOptions {
|
|
53
|
+
/**
|
|
54
|
+
* Upward walk boundary. The walk never ascends above this directory, which lets callers
|
|
55
|
+
* confine resolution to a trusted request cwd.
|
|
56
|
+
*/
|
|
57
|
+
readonly stopAt?: string;
|
|
58
|
+
readonly platform?: NodeJS.Platform;
|
|
59
|
+
readonly pathExt?: string;
|
|
60
|
+
readonly pathEnv?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const resolutionCache = new Map<string, string | null>();
|
|
64
|
+
let probeCount = 0;
|
|
65
|
+
|
|
66
|
+
/** Test seam: clears the per-process resolution cache. */
|
|
67
|
+
export function __resetServerBinaryResolutionCacheForTests(): void {
|
|
68
|
+
resolutionCache.clear();
|
|
69
|
+
probeCount = 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Test seam: counts filesystem probes so cache hits are observable. */
|
|
73
|
+
export function __serverBinaryProbeCountForTests(): number {
|
|
74
|
+
return probeCount;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function probe(path: string): boolean {
|
|
78
|
+
probeCount += 1;
|
|
79
|
+
return existsSync(path);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function executableSuffixes(platform: NodeJS.Platform, pathExt: string | undefined): readonly string[] {
|
|
83
|
+
if (platform !== "win32") return [""];
|
|
84
|
+
const configured = pathExt ?? process.env["PATHEXT"] ?? "";
|
|
85
|
+
// PATHEXT is conventionally uppercase, but the on-disk shims npm/bun write are lowercase.
|
|
86
|
+
// Probe lowercase first so the returned path matches the real filename on case-sensitive
|
|
87
|
+
// filesystems; the resolved path is spawned, so its casing has to be exact.
|
|
88
|
+
const systemExts = configured
|
|
89
|
+
.split(";")
|
|
90
|
+
.filter((entry) => entry.length > 0)
|
|
91
|
+
.map((entry) => entry.toLowerCase());
|
|
92
|
+
return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function probeWithSuffixes(directory: string, command: string, suffixes: readonly string[]): string | null {
|
|
96
|
+
for (const suffix of suffixes) {
|
|
97
|
+
const candidate = join(directory, command + suffix);
|
|
98
|
+
if (probe(candidate)) return candidate;
|
|
12
99
|
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
13
102
|
|
|
14
|
-
|
|
103
|
+
function resolveLocal(
|
|
104
|
+
command: string,
|
|
105
|
+
workingDirectory: string,
|
|
106
|
+
suffixes: readonly string[],
|
|
107
|
+
stopAt: string | undefined,
|
|
108
|
+
): string | null {
|
|
109
|
+
const boundary = stopAt === undefined ? undefined : resolve(stopAt);
|
|
110
|
+
let current = resolve(workingDirectory);
|
|
15
111
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
exts = ["", ".exe", ".cmd", ".bat", ".ps1"];
|
|
112
|
+
while (true) {
|
|
113
|
+
for (const rule of LOCAL_BIN_RULES) {
|
|
114
|
+
if (!rule.markers.some((marker) => probe(join(current, marker)))) continue;
|
|
115
|
+
for (const binDir of rule.binDirs) {
|
|
116
|
+
const found = probeWithSuffixes(join(current, binDir), command, suffixes);
|
|
117
|
+
if (found !== null) return found;
|
|
118
|
+
}
|
|
24
119
|
}
|
|
120
|
+
|
|
121
|
+
// A repository root ends the walk: tooling above it belongs to a different project.
|
|
122
|
+
if (probe(join(current, ".git"))) return null;
|
|
123
|
+
if (boundary !== undefined && current === boundary) return null;
|
|
124
|
+
|
|
125
|
+
const parent = dirname(current);
|
|
126
|
+
if (parent === current) return null;
|
|
127
|
+
current = parent;
|
|
25
128
|
}
|
|
129
|
+
}
|
|
26
130
|
|
|
27
|
-
|
|
28
|
-
|
|
131
|
+
function resolveFromPath(
|
|
132
|
+
command: string,
|
|
133
|
+
suffixes: readonly string[],
|
|
134
|
+
platform: NodeJS.Platform,
|
|
135
|
+
pathEnvOverride: string | undefined,
|
|
136
|
+
): string | null {
|
|
137
|
+
let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
|
|
138
|
+
if (platform === "win32" && !pathEnv) {
|
|
29
139
|
pathEnv = process.env["Path"] ?? "";
|
|
30
140
|
}
|
|
31
141
|
|
|
32
|
-
const
|
|
142
|
+
for (const entry of pathEnv.split(delimiter)) {
|
|
143
|
+
if (entry.length === 0) continue;
|
|
144
|
+
const found = probeWithSuffixes(entry, command, suffixes);
|
|
145
|
+
if (found !== null) return found;
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
33
149
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
150
|
+
/**
|
|
151
|
+
* Resolves the absolute path of an LSP server binary.
|
|
152
|
+
*
|
|
153
|
+
* Probing order:
|
|
154
|
+
* 1. a path-shaped command is validated as-is,
|
|
155
|
+
* 2. marker-gated repo-local bin directories, walking up from `workingDirectory`,
|
|
156
|
+
* 3. `PATH` (including Windows executable suffixes),
|
|
157
|
+
* 4. `null` when nothing matches.
|
|
158
|
+
*
|
|
159
|
+
* Results are cached per process, keyed by working directory and command.
|
|
160
|
+
*/
|
|
161
|
+
export function resolveServerBinary(
|
|
162
|
+
command: string[],
|
|
163
|
+
workingDirectory?: string,
|
|
164
|
+
options: ResolveServerBinaryOptions = {},
|
|
165
|
+
): string | null {
|
|
166
|
+
if (command.length === 0) return null;
|
|
167
|
+
const [cmd] = command;
|
|
168
|
+
if (cmd === undefined || cmd.length === 0) return null;
|
|
169
|
+
|
|
170
|
+
const platform = options.platform ?? process.platform;
|
|
171
|
+
const suffixes = executableSuffixes(platform, options.pathExt);
|
|
172
|
+
|
|
173
|
+
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
174
|
+
const explicit = isAbsolute(cmd) ? cmd : resolve(workingDirectory ?? process.cwd(), cmd);
|
|
175
|
+
return probe(explicit) ? explicit : null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const cacheKey = JSON.stringify([
|
|
179
|
+
workingDirectory ?? "",
|
|
180
|
+
cmd,
|
|
181
|
+
platform,
|
|
182
|
+
options.stopAt ?? "",
|
|
183
|
+
options.pathExt ?? "",
|
|
184
|
+
options.pathEnv ?? process.env["PATH"] ?? "",
|
|
185
|
+
]);
|
|
186
|
+
const cached = resolutionCache.get(cacheKey);
|
|
187
|
+
if (cached !== undefined) return cached;
|
|
188
|
+
|
|
189
|
+
let resolved: string | null = null;
|
|
190
|
+
if (workingDirectory !== undefined && workingDirectory.length > 0) {
|
|
191
|
+
resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
|
|
40
192
|
}
|
|
193
|
+
resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
|
|
194
|
+
// A configured server may be launched through the interpreter itself, e.g.
|
|
195
|
+
// { command: ["node", "my-ls.js"] }. isServerInstalled() has always treated bare `node`
|
|
196
|
+
// as available regardless of PATH, so keep those servers selectable instead of
|
|
197
|
+
// regressing them into a not_installed result. The name is returned unresolved so the
|
|
198
|
+
// spawn still goes through `node`; rewriting it to process.execPath would silently
|
|
199
|
+
// substitute a different interpreter (bun) for the one the config asked for.
|
|
200
|
+
if (resolved === null && cmd === "node") resolved = cmd;
|
|
41
201
|
|
|
42
|
-
|
|
202
|
+
resolutionCache.set(cacheKey, resolved);
|
|
203
|
+
return resolved;
|
|
204
|
+
}
|
|
43
205
|
|
|
44
|
-
|
|
206
|
+
/**
|
|
207
|
+
* Reports whether an LSP server binary is available.
|
|
208
|
+
*
|
|
209
|
+
* Retained for existing consumers; `resolveServerBinary` is the richer entry point.
|
|
210
|
+
*/
|
|
211
|
+
export function isServerInstalled(
|
|
212
|
+
command: string[],
|
|
213
|
+
workingDirectory?: string,
|
|
214
|
+
options: ResolveServerBinaryOptions = {},
|
|
215
|
+
): boolean {
|
|
216
|
+
if (command.length === 0) return false;
|
|
217
|
+
return resolveServerBinary(command, workingDirectory, options) !== null;
|
|
45
218
|
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
5
|
+
|
|
6
|
+
import { runWithRequestContext } from "../request-context.js";
|
|
7
|
+
import { formatServerLookupError } from "./client-wrapper.js";
|
|
8
|
+
import { __resetServerBinaryResolutionCacheForTests } from "./server-installation.js";
|
|
9
|
+
import { findServerForExtension } from "./server-resolution.js";
|
|
10
|
+
|
|
11
|
+
const tempDirectories: string[] = [];
|
|
12
|
+
let previousPath: string | undefined;
|
|
13
|
+
|
|
14
|
+
function makeTempRoot(prefix: string): string {
|
|
15
|
+
const root = mkdtempSync(join(tmpdir(), prefix));
|
|
16
|
+
tempDirectories.push(root);
|
|
17
|
+
return root;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function writeExecutable(path: string): string {
|
|
21
|
+
mkdirSync(join(path, ".."), { recursive: true });
|
|
22
|
+
writeFileSync(path, "#!/bin/sh\nexit 0\n");
|
|
23
|
+
chmodSync(path, 0o755);
|
|
24
|
+
return path;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function contextFor(cwd: string) {
|
|
28
|
+
return {
|
|
29
|
+
cwd,
|
|
30
|
+
projectConfigPaths: [join(cwd, ".codex", "lsp-client.json")],
|
|
31
|
+
userConfigPath: join(cwd, "home-config", "lsp-client.json"),
|
|
32
|
+
installDecisionsPath: join(cwd, "home-config", "lsp-install-decisions.json"),
|
|
33
|
+
capabilities: { installDecisionTool: true },
|
|
34
|
+
} as const;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
previousPath = process.env["PATH"];
|
|
39
|
+
__resetServerBinaryResolutionCacheForTests();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
if (previousPath === undefined) delete process.env["PATH"];
|
|
44
|
+
else process.env["PATH"] = previousPath;
|
|
45
|
+
for (const directory of tempDirectories.splice(0)) {
|
|
46
|
+
rmSync(directory, { recursive: true, force: true });
|
|
47
|
+
}
|
|
48
|
+
__resetServerBinaryResolutionCacheForTests();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe("findServerForExtension local binary substitution", () => {
|
|
52
|
+
test("#given a repo-local biome #when looking up a typescript file #then the command spawns the absolute local path", () => {
|
|
53
|
+
// given
|
|
54
|
+
const root = makeTempRoot("lsp-resolution-local-");
|
|
55
|
+
writeFileSync(join(root, "package.json"), "{}\n");
|
|
56
|
+
const binaryPath = writeExecutable(join(root, "node_modules", ".bin", "biome"));
|
|
57
|
+
process.env["PATH"] = join(root, "definitely-empty");
|
|
58
|
+
|
|
59
|
+
// when
|
|
60
|
+
const result = runWithRequestContext(contextFor(root), () => findServerForExtension(".ts"));
|
|
61
|
+
|
|
62
|
+
// then
|
|
63
|
+
expect(result.status).toBe("found");
|
|
64
|
+
if (result.status !== "found") throw new Error("expected a found server");
|
|
65
|
+
expect(result.server.command[0]).toBe(binaryPath);
|
|
66
|
+
expect(result.server.command.slice(1)).toEqual(["lsp-proxy", "--stdio"]);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test("#given a PATH-only server #when looking up #then the resolved PATH entry is substituted", () => {
|
|
70
|
+
// given
|
|
71
|
+
const root = makeTempRoot("lsp-resolution-path-root-");
|
|
72
|
+
writeFileSync(join(root, "package.json"), "{}\n");
|
|
73
|
+
const pathDir = makeTempRoot("lsp-resolution-path-");
|
|
74
|
+
const pathBinary = writeExecutable(join(pathDir, "biome"));
|
|
75
|
+
process.env["PATH"] = pathDir;
|
|
76
|
+
|
|
77
|
+
// when
|
|
78
|
+
const result = runWithRequestContext(contextFor(root), () => findServerForExtension(".ts"));
|
|
79
|
+
|
|
80
|
+
// then
|
|
81
|
+
expect(result.status).toBe("found");
|
|
82
|
+
if (result.status !== "found") throw new Error("expected a found server");
|
|
83
|
+
expect(result.server.command[0]).toBe(pathBinary);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("#given no server anywhere #when looking up #then the not_installed result is preserved", () => {
|
|
87
|
+
// given
|
|
88
|
+
const root = makeTempRoot("lsp-resolution-missing-");
|
|
89
|
+
process.env["PATH"] = join(root, "definitely-empty");
|
|
90
|
+
|
|
91
|
+
// when
|
|
92
|
+
const result = runWithRequestContext(contextFor(root), () => findServerForExtension(".ts"));
|
|
93
|
+
|
|
94
|
+
// then
|
|
95
|
+
expect(result.status).toBe("not_installed");
|
|
96
|
+
if (result.status !== "not_installed") throw new Error("expected not_installed");
|
|
97
|
+
expect(result.installHint.length).toBeGreaterThan(0);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("#given an unknown extension #when looking up #then the not_configured result is preserved", () => {
|
|
101
|
+
// given
|
|
102
|
+
const root = makeTempRoot("lsp-resolution-unknown-");
|
|
103
|
+
process.env["PATH"] = join(root, "definitely-empty");
|
|
104
|
+
|
|
105
|
+
// when
|
|
106
|
+
const result = runWithRequestContext(contextFor(root), () => findServerForExtension(".unknown-ext"));
|
|
107
|
+
|
|
108
|
+
// then
|
|
109
|
+
expect(result.status).toBe("not_configured");
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe("not-installed message repo-local guidance", () => {
|
|
114
|
+
test("#given a missing biome #when formatting the message #then the repo-local install is suggested before the global hint", () => {
|
|
115
|
+
// given: .css is served by biome alone, so the lookup cannot fall through to typescript
|
|
116
|
+
const root = makeTempRoot("lsp-message-biome-");
|
|
117
|
+
process.env["PATH"] = join(root, "definitely-empty");
|
|
118
|
+
const result = runWithRequestContext(contextFor(root), () => findServerForExtension(".css"));
|
|
119
|
+
if (result.status !== "not_installed") throw new Error("expected not_installed");
|
|
120
|
+
expect(result.server.id).toBe("biome");
|
|
121
|
+
|
|
122
|
+
// when
|
|
123
|
+
const message = runWithRequestContext(contextFor(root), () => formatServerLookupError(result));
|
|
124
|
+
|
|
125
|
+
// then
|
|
126
|
+
expect(message).toContain("bun add -d @biomejs/biome");
|
|
127
|
+
expect(message).toContain("npm install -g @biomejs/biome");
|
|
128
|
+
expect(message.indexOf("bun add -d @biomejs/biome")).toBeLessThan(message.indexOf("npm install -g @biomejs/biome"));
|
|
129
|
+
expect(message).toContain("ACTION REQUIRED");
|
|
130
|
+
expect(message).toContain("NOT INSTALLED");
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("#given a server with no repo-local route #when formatting the message #then only the global hint is shown", () => {
|
|
134
|
+
// given
|
|
135
|
+
const root = makeTempRoot("lsp-message-global-");
|
|
136
|
+
process.env["PATH"] = join(root, "definitely-empty");
|
|
137
|
+
const result = runWithRequestContext(contextFor(root), () => findServerForExtension(".rs"));
|
|
138
|
+
if (result.status !== "not_installed") throw new Error("expected not_installed");
|
|
139
|
+
|
|
140
|
+
// when
|
|
141
|
+
const message = runWithRequestContext(contextFor(root), () => formatServerLookupError(result));
|
|
142
|
+
|
|
143
|
+
// then
|
|
144
|
+
expect(message).toContain("To install, run:");
|
|
145
|
+
expect(message).not.toContain("THIS repository");
|
|
146
|
+
expect(message).toContain("ACTION REQUIRED");
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test("#given a pre-authorized install #when formatting the message #then both install routes stay visible", () => {
|
|
150
|
+
// given
|
|
151
|
+
const root = makeTempRoot("lsp-message-allowed-");
|
|
152
|
+
process.env["PATH"] = join(root, "definitely-empty");
|
|
153
|
+
const context = contextFor(root);
|
|
154
|
+
mkdirSync(join(root, "home-config"), { recursive: true });
|
|
155
|
+
writeFileSync(
|
|
156
|
+
context.installDecisionsPath,
|
|
157
|
+
`${JSON.stringify({ biome: { decision: "allowed", decidedAt: new Date().toISOString() } })}\n`,
|
|
158
|
+
);
|
|
159
|
+
const result = runWithRequestContext(context, () => findServerForExtension(".css"));
|
|
160
|
+
if (result.status !== "not_installed") throw new Error("expected not_installed");
|
|
161
|
+
|
|
162
|
+
// when
|
|
163
|
+
const message = runWithRequestContext(context, () => formatServerLookupError(result));
|
|
164
|
+
|
|
165
|
+
// then
|
|
166
|
+
expect(message).toContain("pre-authorized");
|
|
167
|
+
expect(message).toContain("bun add -d @biomejs/biome");
|
|
168
|
+
expect(message).toContain("npm install -g @biomejs/biome");
|
|
169
|
+
});
|
|
170
|
+
});
|
|
@@ -1,16 +1,28 @@
|
|
|
1
|
+
import { contextCwd } from "../request-context.js";
|
|
1
2
|
import { getDisabledServerIds, getMergedServers } from "./config-loader.js";
|
|
2
3
|
import { BUILTIN_SERVERS, LSP_INSTALL_HINTS } from "./server-definitions.js";
|
|
3
|
-
import { isServerInstalled } from "./server-installation.js";
|
|
4
|
+
import { isServerInstalled, resolveServerBinary } from "./server-installation.js";
|
|
4
5
|
import type { ServerLookupResult } from "./types.js";
|
|
5
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Replaces the command name with the absolute binary path so the client spawns the exact
|
|
9
|
+
* binary that was resolved -- in particular a repo-local one that is absent from PATH.
|
|
10
|
+
*/
|
|
11
|
+
function withResolvedCommand(command: string[], binaryPath: string): string[] {
|
|
12
|
+
return [binaryPath, ...command.slice(1)];
|
|
13
|
+
}
|
|
14
|
+
|
|
6
15
|
export function findServerForExtension(ext: string): ServerLookupResult {
|
|
7
16
|
const servers = getMergedServers();
|
|
17
|
+
const workingDirectory = contextCwd();
|
|
8
18
|
|
|
9
19
|
for (const server of servers) {
|
|
10
|
-
if (server.extensions.includes(ext)
|
|
20
|
+
if (!server.extensions.includes(ext)) continue;
|
|
21
|
+
const binaryPath = resolveServerBinary(server.command, workingDirectory);
|
|
22
|
+
if (binaryPath !== null) {
|
|
11
23
|
const resolvedServer = {
|
|
12
24
|
id: server.id,
|
|
13
|
-
command: server.command,
|
|
25
|
+
command: withResolvedCommand(server.command, binaryPath),
|
|
14
26
|
extensions: server.extensions,
|
|
15
27
|
priority: server.priority,
|
|
16
28
|
};
|
|
@@ -70,6 +82,7 @@ export interface ServerStatus {
|
|
|
70
82
|
export function getAllServers(): ServerStatus[] {
|
|
71
83
|
const servers = getMergedServers();
|
|
72
84
|
const disabled = getDisabledServerIds();
|
|
85
|
+
const workingDirectory = contextCwd();
|
|
73
86
|
|
|
74
87
|
const result: ServerStatus[] = [];
|
|
75
88
|
const seen = new Set<string>();
|
|
@@ -78,7 +91,7 @@ export function getAllServers(): ServerStatus[] {
|
|
|
78
91
|
if (seen.has(server.id)) continue;
|
|
79
92
|
result.push({
|
|
80
93
|
id: server.id,
|
|
81
|
-
installed: isServerInstalled(server.command),
|
|
94
|
+
installed: isServerInstalled(server.command, workingDirectory),
|
|
82
95
|
extensions: server.extensions,
|
|
83
96
|
disabled: false,
|
|
84
97
|
source: server.source,
|
|
@@ -92,7 +105,7 @@ export function getAllServers(): ServerStatus[] {
|
|
|
92
105
|
const builtin = BUILTIN_SERVERS[id];
|
|
93
106
|
result.push({
|
|
94
107
|
id,
|
|
95
|
-
installed: builtin ? isServerInstalled(builtin.command) : false,
|
|
108
|
+
installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
|
|
96
109
|
extensions: builtin?.extensions ?? [],
|
|
97
110
|
disabled: true,
|
|
98
111
|
source: "disabled",
|
|
@@ -37,6 +37,7 @@ export class LspClientTransport {
|
|
|
37
37
|
protected readonly initializeTimeoutMs: number;
|
|
38
38
|
private workspaceApplyEditHandler: WorkspaceApplyEditHandler | null = null;
|
|
39
39
|
private diagnosticPullSupported = false;
|
|
40
|
+
private documentFormattingSupported = false;
|
|
40
41
|
|
|
41
42
|
constructor(
|
|
42
43
|
protected readonly root: string,
|
|
@@ -71,6 +72,14 @@ export class LspClientTransport {
|
|
|
71
72
|
return this.diagnosticPullSupported;
|
|
72
73
|
}
|
|
73
74
|
|
|
75
|
+
protected setDocumentFormattingSupported(supported: boolean): void {
|
|
76
|
+
this.documentFormattingSupported = supported;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
isDocumentFormattingSupported(): boolean {
|
|
80
|
+
return this.documentFormattingSupported;
|
|
81
|
+
}
|
|
82
|
+
|
|
74
83
|
protected handlePublishDiagnostics(params: {
|
|
75
84
|
readonly uri: string;
|
|
76
85
|
readonly diagnostics: readonly Diagnostic[];
|
|
@@ -72,6 +72,14 @@ export interface Diagnostic {
|
|
|
72
72
|
message: string;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
export interface FormattingOptions {
|
|
76
|
+
tabSize: number;
|
|
77
|
+
insertSpaces: boolean;
|
|
78
|
+
trimTrailingWhitespace?: boolean;
|
|
79
|
+
insertFinalNewline?: boolean;
|
|
80
|
+
trimFinalNewlines?: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
75
83
|
export interface TextDocumentIdentifier {
|
|
76
84
|
uri: string;
|
|
77
85
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { mkdtempSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { pathToFileURL } from "node:url";
|
|
@@ -87,6 +87,25 @@ describe("workspace edit adversarial inputs", () => {
|
|
|
87
87
|
expect(readFileSync(outsideFile, "utf-8")).toBe("outside bytes\n");
|
|
88
88
|
});
|
|
89
89
|
|
|
90
|
+
it("#given an in-workspace symlink to an outside file #when applying an edit #then rejects without modifying target", () => {
|
|
91
|
+
const workspace = makeTempDirectory("lsp-workspace-");
|
|
92
|
+
const outside = makeTempDirectory("lsp-outside-");
|
|
93
|
+
const outsideFile = join(outside, "outside.ts");
|
|
94
|
+
const canonicalWorkspace = realpathSync(workspace);
|
|
95
|
+
const linkedDirectory = join(canonicalWorkspace, "linked");
|
|
96
|
+
writeFileSync(outsideFile, "outside bytes\n", "utf-8");
|
|
97
|
+
symlinkSync(outside, linkedDirectory);
|
|
98
|
+
|
|
99
|
+
const result = applyWorkspaceEdit(
|
|
100
|
+
{ changes: { [pathToFileURL(join(linkedDirectory, "outside.ts")).href]: [insertion()] } },
|
|
101
|
+
{ workspaceRoot: canonicalWorkspace },
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
expect(result.success).toBe(false);
|
|
105
|
+
expect(result.errors.join("\n")).toContain("outside workspace");
|
|
106
|
+
expect(readFileSync(outsideFile, "utf-8")).toBe("outside bytes\n");
|
|
107
|
+
});
|
|
108
|
+
|
|
90
109
|
it("#given annotations or mixed edit representations #when planned #then unsupported claims are rejected", () => {
|
|
91
110
|
const workspace = makeTempDirectory("lsp-workspace-");
|
|
92
111
|
const unsupported = [
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Repository marker: an ancestor containing this always wins over intermediate package markers. */
|
|
2
|
+
export const GIT_WORKSPACE_MARKER = ".git" as const;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Package/project markers. On their own they resolve to the NEAREST marked directory, but inside a
|
|
6
|
+
* request cwd they are only a fallback: a `.git` ancestor further up collapses nested package roots
|
|
7
|
+
* (one client per repository instead of one per monorepo package).
|
|
8
|
+
*/
|
|
9
|
+
export const PROJECT_WORKSPACE_MARKERS = [
|
|
10
|
+
"package.json",
|
|
11
|
+
"pyproject.toml",
|
|
12
|
+
"Cargo.toml",
|
|
13
|
+
"go.mod",
|
|
14
|
+
"pom.xml",
|
|
15
|
+
"build.gradle",
|
|
16
|
+
] as const;
|
|
17
|
+
|
|
18
|
+
export const WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS] as const;
|
|
@@ -71,6 +71,9 @@ export async function runMcpStdioServer(
|
|
|
71
71
|
await runJsonRpcStdioServer({
|
|
72
72
|
input,
|
|
73
73
|
output,
|
|
74
|
+
// Idle stays disabled: hosts of this CLI (legacy opencode configs and
|
|
75
|
+
// standalone lsp-tools-mcp users) have no evidenced respawn for an exited
|
|
76
|
+
// stdio server; opencode in particular marks it failed without retry.
|
|
74
77
|
idleTimeoutMs: 0,
|
|
75
78
|
parentWatchdog: options.parentWatchdog ?? {},
|
|
76
79
|
handler: (request) => runWithRequestContext(requestContext, () => handleLspMcpRequest(request)),
|
|
@@ -168,4 +168,33 @@ describe("LspRequestContext", () => {
|
|
|
168
168
|
capabilities: { installDecisionTool: true },
|
|
169
169
|
});
|
|
170
170
|
});
|
|
171
|
+
|
|
172
|
+
it("#given an injected LSP cwd #when standalone context is created #then it wins over process cwd without reading global env", () => {
|
|
173
|
+
const sessionRoot = tempRoot("lsp-context-session-");
|
|
174
|
+
const processRoot = tempRoot("lsp-context-process-");
|
|
175
|
+
const home = tempRoot("lsp-context-env-home-");
|
|
176
|
+
|
|
177
|
+
const context = createStandaloneMcpRequestContext({
|
|
178
|
+
env: {
|
|
179
|
+
LSP_TOOLS_MCP_CWD: sessionRoot,
|
|
180
|
+
},
|
|
181
|
+
homeDir: home,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
expect(context.cwd).toBe(sessionRoot);
|
|
185
|
+
expect(context.projectConfigPaths).toEqual([join(sessionRoot, ".codex", "lsp-client.json")]);
|
|
186
|
+
expect(processRoot).not.toBe(context.cwd);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("#given explicit cwd and an injected LSP cwd #when standalone context is created #then explicit cwd wins", () => {
|
|
190
|
+
const explicitRoot = tempRoot("lsp-context-explicit-");
|
|
191
|
+
const injectedRoot = tempRoot("lsp-context-injected-");
|
|
192
|
+
|
|
193
|
+
const context = createStandaloneMcpRequestContext({
|
|
194
|
+
cwd: explicitRoot,
|
|
195
|
+
env: { LSP_TOOLS_MCP_CWD: injectedRoot },
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
expect(context.cwd).toBe(explicitRoot);
|
|
199
|
+
});
|
|
171
200
|
});
|
|
@@ -72,7 +72,7 @@ export function createStandaloneMcpRequestContext(
|
|
|
72
72
|
input: StandaloneMcpRequestContextInput = {},
|
|
73
73
|
): LspRequestContext {
|
|
74
74
|
const env = input.env ?? process.env;
|
|
75
|
-
const cwd = canonicalCwd(input.cwd ?? process.cwd());
|
|
75
|
+
const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
|
|
76
76
|
const home = input.homeDir ?? homedir();
|
|
77
77
|
const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
|
|
78
78
|
const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
|
|
@@ -104,6 +104,18 @@ const expectedToolSurface = [
|
|
|
104
104
|
required: ["filePath", "line", "character", "newName"],
|
|
105
105
|
},
|
|
106
106
|
},
|
|
107
|
+
{
|
|
108
|
+
name: "format",
|
|
109
|
+
title: "LSP Format",
|
|
110
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
111
|
+
inputSchema: {
|
|
112
|
+
type: "object",
|
|
113
|
+
properties: {
|
|
114
|
+
filePath: { type: "string", description: "Source file path to format." },
|
|
115
|
+
},
|
|
116
|
+
required: ["filePath"],
|
|
117
|
+
},
|
|
118
|
+
},
|
|
107
119
|
{
|
|
108
120
|
name: "install_decision",
|
|
109
121
|
title: "LSP Install Decision",
|
|
@@ -128,7 +140,7 @@ const expectedToolSurface = [
|
|
|
128
140
|
];
|
|
129
141
|
|
|
130
142
|
describe("LSP core tool surface", () => {
|
|
131
|
-
test("#given tool descriptors #when listed #then the public
|
|
143
|
+
test("#given tool descriptors #when listed #then the public nine-tool schemas are pinned", () => {
|
|
132
144
|
// given / when
|
|
133
145
|
const surface = LSP_MCP_TOOLS.map((tool) => ({
|
|
134
146
|
name: tool.name,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { executeLspDiagnostics } from "./diagnostics.js";
|
|
2
|
+
import { executeLspFormat } from "./format.js";
|
|
2
3
|
import { executeLspInstallDecision } from "./install-decision.js";
|
|
3
4
|
import { executeLspFindReferences, executeLspGotoDefinition } from "./navigation.js";
|
|
4
5
|
import { executeLspPrepareRename, executeLspRename } from "./rename.js";
|
|
@@ -116,6 +117,19 @@ export const LSP_MCP_TOOLS: LspMcpTool[] = [
|
|
|
116
117
|
),
|
|
117
118
|
execute: executeLspRename,
|
|
118
119
|
},
|
|
120
|
+
{
|
|
121
|
+
name: "format",
|
|
122
|
+
aliases: ["lsp_format"],
|
|
123
|
+
title: "LSP Format",
|
|
124
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
125
|
+
inputSchema: objectSchema(
|
|
126
|
+
{
|
|
127
|
+
filePath: { type: "string", description: "Source file path to format." },
|
|
128
|
+
},
|
|
129
|
+
["filePath"],
|
|
130
|
+
),
|
|
131
|
+
execute: executeLspFormat,
|
|
132
|
+
},
|
|
119
133
|
{
|
|
120
134
|
name: "install_decision",
|
|
121
135
|
aliases: ["lsp_install_decision"],
|