oh-my-opencode 4.18.2 → 4.19.1
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/omomomo.md +1 -1
- package/.agents/skills/omomomo/SKILL.md +1 -1
- package/.opencode/command/omomomo.md +1 -1
- package/README.ja.md +6 -6
- package/README.ko.md +6 -6
- package/README.md +8 -8
- package/README.ru.md +6 -6
- package/README.zh-cn.md +6 -6
- package/dist/agents/atlas/agent.d.ts +7 -6
- package/dist/agents/gpt-prompt-identity.d.ts +3 -0
- package/dist/agents/sisyphus/gpt-5-5.d.ts +1 -1
- package/dist/agents/sisyphus/gpt-task-system-guide.d.ts +1 -0
- package/dist/agents/sisyphus/index.d.ts +5 -0
- package/dist/agents/sisyphus/kimi-k3.d.ts +19 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
- package/dist/agents/sisyphus-junior/agent.d.ts +8 -4
- package/dist/agents/sisyphus-junior/gpt-5-5.d.ts +2 -2
- package/dist/agents/sisyphus-junior/index.d.ts +2 -0
- package/dist/agents/sisyphus-junior/kimi-k3.d.ts +12 -0
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/index.js +781 -215
- package/dist/cli-node/index.js +781 -215
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schema/agent-overrides.d.ts +48 -48
- package/dist/config/schema/browser-automation.d.ts +1 -0
- package/dist/config/schema/categories.d.ts +6 -6
- package/dist/config/schema/codegraph.d.ts +2 -0
- package/dist/config/schema/commands.d.ts +1 -3
- package/dist/config/schema/default-mode.d.ts +1 -1
- package/dist/config/schema/fallback-models.d.ts +5 -5
- package/dist/config/schema/goal.d.ts +7 -0
- package/dist/config/schema/hooks.d.ts +1 -1
- package/dist/config/schema/oh-my-opencode-config.d.ts +56 -58
- package/dist/config/schema/ralph-loop.d.ts +1 -1
- package/dist/config/schema.d.ts +1 -1
- package/dist/create-hooks.d.ts +1 -1
- package/dist/features/builtin-commands/templates/goal.d.ts +1 -0
- package/dist/features/builtin-commands/templates/stop-continuation.d.ts +1 -1
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/hooks/auto-slash-command/executor.d.ts +1 -0
- package/dist/hooks/codegraph-bootstrap/hook.d.ts +3 -2
- package/dist/hooks/goal/command-arguments.d.ts +13 -0
- package/dist/hooks/goal/controller.d.ts +26 -0
- package/dist/hooks/goal/index.d.ts +23 -0
- package/dist/hooks/goal/prompt.d.ts +3 -0
- package/dist/hooks/goal/store.d.ts +8 -0
- package/dist/hooks/goal/tools.d.ts +10 -0
- package/dist/hooks/goal/types.d.ts +93 -0
- package/dist/hooks/goal/validation.d.ts +4 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/keyword-detector/hook.d.ts +1 -2
- package/dist/hooks/ralph-loop/types.d.ts +1 -1
- package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
- package/dist/hooks/start-work/notepad-scaffold.d.ts +10 -0
- package/dist/index.js +5398 -5109
- package/dist/oh-my-opencode.schema.json +34 -19
- package/dist/plugin/chat-message/loop-commands.d.ts +1 -1
- package/dist/plugin/chat-message/types.d.ts +23 -10
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +3 -2
- package/dist/plugin/hooks/create-transform-hooks.d.ts +0 -2
- package/dist/plugin/stop-continuation.d.ts +2 -2
- package/dist/shared/omo-process-sweep.d.ts +18 -0
- package/dist/shared/system-directive.d.ts +0 -1
- package/dist/skills/programming/scripts/typescript/check-no-excuse-rules.test.ts +87 -0
- package/dist/skills/programming/scripts/typescript/check-no-excuse-rules.ts +35 -5
- package/dist/skills/ulw-plan/SKILL.md +31 -8
- package/dist/skills/ulw-plan/references/full-workflow.md +117 -6
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/dist/skills/ulw-research/SKILL.md +3 -3
- package/dist/testing/create-plugin-module.d.ts +1 -0
- package/dist/tools/delegate-task/types.d.ts +0 -1
- package/dist/tui.js +138 -80
- package/package.json +14 -14
- package/packages/git-bash-mcp/dist/cli.js +54 -8
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +60 -0
- package/packages/lsp-core/src/lsp/client.ts +14 -1
- package/packages/lsp-core/src/lsp/fixtures/diagnostics-freshness-contract-probe.ts +2 -2
- package/packages/lsp-core/src/mcp.ts +9 -0
- package/packages/lsp-daemon/dist/cli.js +319 -51
- package/packages/lsp-daemon/dist/client.js +136 -48
- package/packages/lsp-daemon/dist/daemon-client.d.ts +0 -10
- package/packages/lsp-daemon/dist/daemon-client.js +4 -34
- package/packages/lsp-daemon/dist/daemon-failure-result.d.ts +3 -0
- package/packages/lsp-daemon/dist/daemon-failure-result.js +38 -0
- package/packages/lsp-daemon/dist/daemon-request-error.d.ts +14 -0
- package/packages/lsp-daemon/dist/daemon-request-error.js +26 -0
- package/packages/lsp-daemon/dist/daemon-server.js +5 -1
- package/packages/lsp-daemon/dist/index.js +137 -48
- package/packages/lsp-daemon/dist/proxy.d.ts +2 -0
- package/packages/lsp-daemon/dist/proxy.js +1 -0
- package/packages/lsp-daemon/dist/version-reap.d.ts +26 -0
- package/packages/lsp-daemon/dist/version-reap.js +182 -0
- package/packages/lsp-tools-mcp/dist/cli.js +61 -10
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +6 -1
- package/packages/lsp-tools-mcp/dist/mcp.js +61 -10
- package/packages/lsp-tools-mcp/dist/tools.js +6 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +416 -25
- 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/setup.ts +22 -2
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +7 -6
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +638 -267
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +178 -89
- package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +3 -1
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +3 -1
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +98 -32
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +5 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +15 -6
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +6 -2
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +1 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +148 -0
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +31 -2
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +65 -1
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +3 -7
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +57 -3
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +41 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +109 -8
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +2 -2
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +43 -0
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +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 +1 -1
- 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 +1 -1
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +1 -0
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +80 -40
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +11 -0
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +11 -0
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +60 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +147 -60
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +3 -71
- package/packages/omo-codex/plugin/components/start-work-continuation/src/plan-checklist.ts +171 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +198 -23
- package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +4 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +6 -5
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-scaffold.md +15 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -10
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +31 -8
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +42 -0
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +6 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.d.ts +21 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +64 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +15 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.d.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +85 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -33
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +998 -593
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/goal-status.js +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +10 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.d.ts +15 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +84 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +81 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +7 -59
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +12 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/validation-batch.d.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/validation-batch.js +122 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +8 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +84 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +13 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +49 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +13 -45
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/goal-status.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +4 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +20 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +125 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +59 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +6 -58
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +12 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/validation-batch.ts +122 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +76 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +111 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +67 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +57 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +152 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +29 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/validation-batch-checkpoint.test.ts +147 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/validation-batch.test.ts +73 -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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- 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/package-lock.json +41 -41
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +32 -28
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +17 -45
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +455 -0
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +3 -18
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +43 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +35 -5
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +31 -8
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +11 -11
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +26 -0
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +41 -0
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +6 -6
- package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +3 -3
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +62 -0
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +271 -14
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +3 -18
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +0 -5
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +293 -0
- package/packages/omo-codex/scripts/install-config.test.mjs +10 -10
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +401 -22
- package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +39 -2
- package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +4 -1
- package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.test.ts +87 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +35 -5
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +31 -8
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
- package/dist/features/builtin-commands/templates/ralph-loop.d.ts +0 -3
- package/dist/skills/ultraresearch/SKILL.md +0 -10
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +0 -273
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -12
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -107
- package/packages/shared-skills/skills/lcx-doctor/SKILL.md +0 -128
- package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +0 -11
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +0 -268
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +0 -11
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +0 -10
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/agents/openai.yaml +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/agents/openai.yaml +0 -0
|
@@ -47,7 +47,7 @@ describe("runCodegraphServe MCP unavailable facade", () => {
|
|
|
47
47
|
result: {
|
|
48
48
|
capabilities: { tools: { listChanged: false } },
|
|
49
49
|
protocolVersion: "2025-06-18",
|
|
50
|
-
serverInfo: { name: "codegraph", version: "1.
|
|
50
|
+
serverInfo: { name: "codegraph", version: "1.4.1" },
|
|
51
51
|
},
|
|
52
52
|
});
|
|
53
53
|
});
|
|
@@ -4,7 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import { runCodegraphServe } from "../src/serve.ts";
|
|
5
5
|
|
|
6
6
|
describe("runCodegraphServe provisioning", () => {
|
|
7
|
-
it("#given CodeGraph is unresolved #when serving MCP #then provisions CodeGraph before spawning", async () => {
|
|
7
|
+
it("#given CodeGraph is unresolved and daemon is off by default #when serving MCP #then provisions CodeGraph before spawning with CODEGRAPH_NO_DAEMON=1", async () => {
|
|
8
8
|
// given
|
|
9
9
|
const binPath = join("/tmp/home/.omo/codegraph", "bin", "codegraph");
|
|
10
10
|
const calls: Array<{
|
|
@@ -20,7 +20,6 @@ describe("runCodegraphServe provisioning", () => {
|
|
|
20
20
|
env: { PATH: "/bin" },
|
|
21
21
|
homeDir: "/tmp/home",
|
|
22
22
|
nodeVersion: "22.14.0",
|
|
23
|
-
buildEnv: () => ({}),
|
|
24
23
|
resolve: () => ({ argsPrefix: [], command: "codegraph", exists: false, source: "path" }),
|
|
25
24
|
ensureProvisioned: (options) =>
|
|
26
25
|
Promise.resolve({
|
|
@@ -41,8 +40,63 @@ describe("runCodegraphServe provisioning", () => {
|
|
|
41
40
|
{
|
|
42
41
|
args: ["serve", "--mcp"],
|
|
43
42
|
command: binPath,
|
|
44
|
-
env: {
|
|
43
|
+
env: {
|
|
44
|
+
CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
|
|
45
|
+
CODEGRAPH_NO_DAEMON: "1",
|
|
46
|
+
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
47
|
+
CODEGRAPH_TELEMETRY: "0",
|
|
48
|
+
DO_NOT_TRACK: "1",
|
|
49
|
+
PATH: "/bin",
|
|
50
|
+
},
|
|
45
51
|
},
|
|
46
52
|
]);
|
|
47
53
|
});
|
|
54
|
+
|
|
55
|
+
it("#given CodeGraph is unresolved and codegraph.daemon=true #when serving MCP #then provisions CodeGraph and omits CODEGRAPH_NO_DAEMON so the daemon may run", async () => {
|
|
56
|
+
// given
|
|
57
|
+
const binPath = join("/tmp/home/.omo/codegraph", "bin", "codegraph");
|
|
58
|
+
const calls: Array<{
|
|
59
|
+
readonly args: readonly string[];
|
|
60
|
+
readonly command: string;
|
|
61
|
+
readonly env: Record<string, string | undefined>;
|
|
62
|
+
}> = [];
|
|
63
|
+
const stderr: string[] = [];
|
|
64
|
+
|
|
65
|
+
// when
|
|
66
|
+
const exitCode = await runCodegraphServe({
|
|
67
|
+
config: { codegraph: { daemon: true, enabled: true }, sources: [], warnings: [] },
|
|
68
|
+
env: { PATH: "/bin" },
|
|
69
|
+
homeDir: "/tmp/home",
|
|
70
|
+
nodeVersion: "22.14.0",
|
|
71
|
+
resolve: () => ({ argsPrefix: [], command: "codegraph", exists: false, source: "path" }),
|
|
72
|
+
ensureProvisioned: (options) =>
|
|
73
|
+
Promise.resolve({
|
|
74
|
+
binPath: join(options.installDir ?? "/tmp/home/.omo/codegraph", "bin", "codegraph"),
|
|
75
|
+
provisioned: true,
|
|
76
|
+
}),
|
|
77
|
+
runProcess: (command, args, options) => {
|
|
78
|
+
calls.push({ args, command, env: options.env });
|
|
79
|
+
return Promise.resolve(0);
|
|
80
|
+
},
|
|
81
|
+
stderr: { write: (chunk: string) => stderr.push(chunk) },
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// then
|
|
85
|
+
expect(exitCode).toBe(0);
|
|
86
|
+
expect(stderr).toEqual([]);
|
|
87
|
+
expect(calls).toEqual([
|
|
88
|
+
{
|
|
89
|
+
args: ["serve", "--mcp"],
|
|
90
|
+
command: binPath,
|
|
91
|
+
env: {
|
|
92
|
+
CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
|
|
93
|
+
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
94
|
+
CODEGRAPH_TELEMETRY: "0",
|
|
95
|
+
DO_NOT_TRACK: "1",
|
|
96
|
+
PATH: "/bin",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
]);
|
|
100
|
+
expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBeUndefined();
|
|
101
|
+
});
|
|
48
102
|
});
|
|
@@ -122,6 +122,47 @@ describe("runCodegraphServe unavailable CodeGraph paths", () => {
|
|
|
122
122
|
rmSync(workspace, { recursive: true, force: true });
|
|
123
123
|
}
|
|
124
124
|
});
|
|
125
|
+
|
|
126
|
+
it("#given the unavailable facade with held-open stdio and a dead parent #when the watchdog polls #then the placeholder server settles without waiting for stdin EOF", async () => {
|
|
127
|
+
// given
|
|
128
|
+
// win32: the real-timer watchdog + PassThrough.destroy() teardown race leaves
|
|
129
|
+
// the read loop's async iterator pending on Windows, so this held-open-stdin
|
|
130
|
+
// case cannot settle under bun:test (which has no fake timers). The watchdog
|
|
131
|
+
// settle path IS covered deterministically by mcp-stdio-core's fake-timer test
|
|
132
|
+
// (passes on win32) and by real-process QA (task-13-*); production settles via
|
|
133
|
+
// stdin EOF, exercised by the other tests in this file that run on win32.
|
|
134
|
+
if (process.platform === "win32") return;
|
|
135
|
+
// Client stdio is held open and never sees EOF, so the parent-liveness
|
|
136
|
+
// watchdog is the only settle path for the placeholder server.
|
|
137
|
+
const stdin = new PassThrough();
|
|
138
|
+
const stdout = new PassThrough();
|
|
139
|
+
stdout.resume();
|
|
140
|
+
const stderr: string[] = [];
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
// when
|
|
144
|
+
const exitCode = await runCodegraphServe({
|
|
145
|
+
config: { codegraph: { enabled: false }, sources: [], warnings: [] },
|
|
146
|
+
env: {},
|
|
147
|
+
stdin,
|
|
148
|
+
stdout,
|
|
149
|
+
stderr: { write: (chunk: string) => stderr.push(chunk) },
|
|
150
|
+
parentWatchdog: { pollIntervalMs: 10, probeAlive: () => false },
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// then
|
|
154
|
+
expect(exitCode).toBe(0);
|
|
155
|
+
expect(stderr).toEqual([
|
|
156
|
+
"CodeGraph MCP skipped: disabled by OMO SOT config. Set [codex].codegraph.enabled=true to enable it.\n",
|
|
157
|
+
]);
|
|
158
|
+
} finally {
|
|
159
|
+
// The held-open streams are never ended by the test; destroy them so the
|
|
160
|
+
// bun test runner's event loop can drain and exit (an undestroyed
|
|
161
|
+
// PassThrough keeps the process alive on win32 and hangs the suite).
|
|
162
|
+
stdin.destroy();
|
|
163
|
+
stdout.destroy();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
125
166
|
});
|
|
126
167
|
|
|
127
168
|
function closedMcpStdio(): { readonly stdin: PassThrough; readonly stdout: PassThrough } {
|
|
@@ -27,12 +27,6 @@ describe("runCodegraphServe", () => {
|
|
|
27
27
|
env: { CUSTOM: "drop", HOME: "/tmp/home", OPENAI_API_KEY: "sk-test-secret" },
|
|
28
28
|
nodeVersion: "22.14.0",
|
|
29
29
|
homeDir: "/tmp/home",
|
|
30
|
-
buildEnv: ({ homeDir }) => ({
|
|
31
|
-
CODEGRAPH_INSTALL_DIR: `${homeDir}/.omo/codegraph`,
|
|
32
|
-
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
33
|
-
CODEGRAPH_TELEMETRY: "0",
|
|
34
|
-
DO_NOT_TRACK: "1",
|
|
35
|
-
}),
|
|
36
30
|
resolve: () => ({ argsPrefix: ["shim.js"], command: "node", exists: true, source: "bundled" }),
|
|
37
31
|
runProcess: (
|
|
38
32
|
command: string,
|
|
@@ -53,7 +47,7 @@ describe("runCodegraphServe", () => {
|
|
|
53
47
|
command: "node",
|
|
54
48
|
cwd: resolve(runCwd),
|
|
55
49
|
env: {
|
|
56
|
-
CODEGRAPH_INSTALL_DIR: "/tmp/home
|
|
50
|
+
CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
|
|
57
51
|
CODEGRAPH_NO_DAEMON: "1",
|
|
58
52
|
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
59
53
|
CODEGRAPH_TELEMETRY: "0",
|
|
@@ -67,6 +61,58 @@ describe("runCodegraphServe", () => {
|
|
|
67
61
|
expect(calls[0]?.env["OPENAI_API_KEY"]).toBeUndefined();
|
|
68
62
|
});
|
|
69
63
|
|
|
64
|
+
it("#given codegraph.daemon=true #when serving MCP #then CODEGRAPH_NO_DAEMON is omitted so the daemon may run", async () => {
|
|
65
|
+
// given
|
|
66
|
+
const runCwd = componentRoot;
|
|
67
|
+
const calls: Array<{
|
|
68
|
+
readonly args: readonly string[];
|
|
69
|
+
readonly command: string;
|
|
70
|
+
readonly cwd: string;
|
|
71
|
+
readonly env: Record<string, string | undefined>;
|
|
72
|
+
readonly stdio: "pipe";
|
|
73
|
+
}> = [];
|
|
74
|
+
|
|
75
|
+
// when
|
|
76
|
+
const exitCode = await runCodegraphServe({
|
|
77
|
+
config: { codegraph: { daemon: true, enabled: true }, sources: [], warnings: [] },
|
|
78
|
+
cwd: runCwd,
|
|
79
|
+
env: { CUSTOM: "drop", HOME: "/tmp/home", OPENAI_API_KEY: "sk-test-secret" },
|
|
80
|
+
nodeVersion: "22.14.0",
|
|
81
|
+
homeDir: "/tmp/home",
|
|
82
|
+
resolve: () => ({ argsPrefix: ["shim.js"], command: "node", exists: true, source: "bundled" }),
|
|
83
|
+
runProcess: (
|
|
84
|
+
command: string,
|
|
85
|
+
args: readonly string[],
|
|
86
|
+
options: { readonly cwd: string; readonly env: Record<string, string | undefined>; readonly stdio: "pipe" },
|
|
87
|
+
) => {
|
|
88
|
+
calls.push({ args, command, cwd: options.cwd, env: options.env, stdio: options.stdio });
|
|
89
|
+
return Promise.resolve(7);
|
|
90
|
+
},
|
|
91
|
+
stderr: { write: () => undefined },
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// then
|
|
95
|
+
expect(exitCode).toBe(7);
|
|
96
|
+
expect(calls).toEqual([
|
|
97
|
+
{
|
|
98
|
+
args: ["shim.js", "serve", "--mcp"],
|
|
99
|
+
command: "node",
|
|
100
|
+
cwd: resolve(runCwd),
|
|
101
|
+
env: {
|
|
102
|
+
CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
|
|
103
|
+
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
104
|
+
CODEGRAPH_TELEMETRY: "0",
|
|
105
|
+
DO_NOT_TRACK: "1",
|
|
106
|
+
HOME: "/tmp/home",
|
|
107
|
+
},
|
|
108
|
+
stdio: "pipe",
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBeUndefined();
|
|
112
|
+
expect(calls[0]?.env["CUSTOM"]).toBeUndefined();
|
|
113
|
+
expect(calls[0]?.env["OPENAI_API_KEY"]).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
|
|
70
116
|
it("#given an unsupported local Node but the unsafe override is set #when serving MCP #then it still spawns codegraph", async () => {
|
|
71
117
|
// given
|
|
72
118
|
const spawned: string[] = [];
|
|
@@ -136,7 +182,7 @@ describe("runCodegraphServe", () => {
|
|
|
136
182
|
expect(spawned).toEqual([{ args: ["serve", "--mcp"], command: commandPath }]);
|
|
137
183
|
});
|
|
138
184
|
|
|
139
|
-
it("#given Windows Codex SOT install_dir has codegraph.cmd #when serving MCP #then it resolves there and
|
|
185
|
+
it("#given Windows Codex SOT install_dir has codegraph.cmd and daemon is off by default #when serving MCP #then it resolves there, exports CODEGRAPH_INSTALL_DIR, and pins CODEGRAPH_NO_DAEMON=1", async () => {
|
|
140
186
|
await withProcessPlatform("win32", async () => {
|
|
141
187
|
// given
|
|
142
188
|
const tempRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-install-dir-"));
|
|
@@ -191,6 +237,61 @@ describe("runCodegraphServe", () => {
|
|
|
191
237
|
});
|
|
192
238
|
});
|
|
193
239
|
|
|
240
|
+
it("#given Windows Codex SOT install_dir with codegraph.daemon=true #when serving MCP #then CODEGRAPH_NO_DAEMON is omitted so the daemon may run", async () => {
|
|
241
|
+
await withProcessPlatform("win32", async () => {
|
|
242
|
+
// given
|
|
243
|
+
const tempRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-install-dir-daemon-"));
|
|
244
|
+
const installDir = join(tempRoot, "custom-codegraph");
|
|
245
|
+
const binPath = join(installDir, "bin", "codegraph.cmd");
|
|
246
|
+
const calls: Array<{
|
|
247
|
+
readonly args: readonly string[];
|
|
248
|
+
readonly command: string;
|
|
249
|
+
readonly env: Record<string, string | undefined>;
|
|
250
|
+
}> = [];
|
|
251
|
+
|
|
252
|
+
try {
|
|
253
|
+
mkdirSync(join(installDir, "bin"), { recursive: true });
|
|
254
|
+
writeFileSync(binPath, "");
|
|
255
|
+
|
|
256
|
+
// when
|
|
257
|
+
const exitCode = await runCodegraphServe({
|
|
258
|
+
config: { codegraph: { daemon: true, enabled: true, install_dir: installDir }, sources: [], trustedCodegraphInstallDir: installDir, warnings: [] },
|
|
259
|
+
env: { HOME: "/tmp/home" },
|
|
260
|
+
nodeVersion: "22.14.0",
|
|
261
|
+
homeDir: "/tmp/home",
|
|
262
|
+
resolve: (options) => {
|
|
263
|
+
const provisioned = options.provisioned?.();
|
|
264
|
+
return { argsPrefix: [], command: provisioned ?? "missing", exists: provisioned !== null && provisioned !== undefined, source: "provisioned" };
|
|
265
|
+
},
|
|
266
|
+
runProcess: (command, args, options) => {
|
|
267
|
+
calls.push({ args, command, env: options.env });
|
|
268
|
+
return Promise.resolve(0);
|
|
269
|
+
},
|
|
270
|
+
stderr: { write: () => undefined },
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
// then
|
|
274
|
+
expect(exitCode).toBe(0);
|
|
275
|
+
expect(calls).toEqual([
|
|
276
|
+
{
|
|
277
|
+
args: ["serve", "--mcp"],
|
|
278
|
+
command: binPath,
|
|
279
|
+
env: {
|
|
280
|
+
CODEGRAPH_INSTALL_DIR: installDir,
|
|
281
|
+
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
282
|
+
CODEGRAPH_TELEMETRY: "0",
|
|
283
|
+
DO_NOT_TRACK: "1",
|
|
284
|
+
HOME: "/tmp/home",
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
]);
|
|
288
|
+
expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBeUndefined();
|
|
289
|
+
} finally {
|
|
290
|
+
rmSync(tempRoot, { recursive: true, force: true });
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
194
295
|
it("#given project cwd is under a configured excluded root #when serving MCP #then it exposes an unavailable stub without spawning CodeGraph", async () => {
|
|
195
296
|
// given
|
|
196
297
|
const excludedRoot = mkdtempSync(join(componentRoot, ".tmp-codegraph-excluded-"));
|
package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts
CHANGED
|
@@ -52,7 +52,7 @@ describe("CodeGraph SessionStart worker Node support", () => {
|
|
|
52
52
|
const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-node-provision-home-"));
|
|
53
53
|
const binPath = join(homeDir, ".omo", "codegraph", "bin", "codegraph");
|
|
54
54
|
const calls: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
|
|
55
|
-
const provisionCalls: Array<{ readonly installDir?: string; readonly lockDir: string; readonly version: "1.
|
|
55
|
+
const provisionCalls: Array<{ readonly installDir?: string; readonly lockDir: string; readonly version: "1.4.1" }> = [];
|
|
56
56
|
const outcomes: unknown[] = [];
|
|
57
57
|
|
|
58
58
|
try {
|
|
@@ -90,7 +90,7 @@ describe("CodeGraph SessionStart worker Node support", () => {
|
|
|
90
90
|
{ args: ["init"], command: binPath },
|
|
91
91
|
]);
|
|
92
92
|
expect(provisionCalls).toEqual([
|
|
93
|
-
{ installDir: join(homeDir, ".omo", "codegraph"), lockDir: join(homeDir, ".omo", "codegraph", ".locks"), version: "1.
|
|
93
|
+
{ installDir: join(homeDir, ".omo", "codegraph"), lockDir: join(homeDir, ".omo", "codegraph", ".locks"), version: "1.4.1" },
|
|
94
94
|
]);
|
|
95
95
|
expect(outcomes).toEqual([{ action: "initialized", exitCode: 0, projectRoot: workspace, source: "provisioned", timedOut: false }]);
|
|
96
96
|
} finally {
|
package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts
CHANGED
|
@@ -152,6 +152,49 @@ describe("CodeGraph SessionStart worker flow", () => {
|
|
|
152
152
|
}
|
|
153
153
|
});
|
|
154
154
|
|
|
155
|
+
it("#given codegraph.daemon=true #when the indexing worker runs #then its env stays daemon-less with CODEGRAPH_NO_DAEMON=1", async () => {
|
|
156
|
+
// given
|
|
157
|
+
const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-daemon-"));
|
|
158
|
+
const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-daemon-home-"));
|
|
159
|
+
const calls: { readonly args: readonly string[]; readonly command: string; readonly env: Record<string, string> }[] = [];
|
|
160
|
+
try {
|
|
161
|
+
// when
|
|
162
|
+
const result = await runCodegraphSessionStartWorker({
|
|
163
|
+
config: { codegraph: { daemon: true, enabled: true, install_dir: "/tmp/codegraph-install" }, sources: [], trustedCodegraphInstallDir: "/tmp/codegraph-install", warnings: [] },
|
|
164
|
+
nodeVersion: "22.14.0",
|
|
165
|
+
cwd: workspace,
|
|
166
|
+
env: { HOME: homeDir },
|
|
167
|
+
logOutcome: () => undefined,
|
|
168
|
+
deps: {
|
|
169
|
+
ensureGitignored: () => true,
|
|
170
|
+
ensureProvisioned: () => Promise.resolve({ binPath: "/tmp/codegraph", provisioned: true }),
|
|
171
|
+
prepareWorkspace: () => ({
|
|
172
|
+
dataDir: join(homeDir, ".omo/codegraph/projects/test"),
|
|
173
|
+
dataRoot: join(homeDir, ".omo/codegraph"),
|
|
174
|
+
linked: true,
|
|
175
|
+
mode: "global-linked",
|
|
176
|
+
projectLink: join(workspace, ".codegraph"),
|
|
177
|
+
}),
|
|
178
|
+
resolveCommand: () => ({ argsPrefix: [], command: "/tmp/codegraph", exists: true, source: "path" }),
|
|
179
|
+
runCommand: (_projectRoot, command, args, options) => {
|
|
180
|
+
calls.push({ args, command, env: options.env });
|
|
181
|
+
return Promise.resolve({ exitCode: 0, stdout: calls.length === 1 ? '{"initialized":true}' : "", timedOut: false });
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// then
|
|
187
|
+
expect(result).toEqual({ action: "synced" });
|
|
188
|
+
expect(calls.length).toBeGreaterThan(0);
|
|
189
|
+
for (const call of calls) {
|
|
190
|
+
expect(call.env["CODEGRAPH_NO_DAEMON"]).toBe("1");
|
|
191
|
+
}
|
|
192
|
+
} finally {
|
|
193
|
+
rmSync(workspace, { recursive: true, force: true });
|
|
194
|
+
rmSync(homeDir, { recursive: true, force: true });
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
155
198
|
it("#given ambient provider tokens #when default worker runner spawns CodeGraph #then child env only gets safe and controlled variables", async () => {
|
|
156
199
|
// given
|
|
157
200
|
const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-env-"));
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
|
|
10
10
|
"timeout": 5,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.19.1) Recommending Git Bash MCP"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"type": "command",
|
|
21
21
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
22
22
|
"timeout": 5,
|
|
23
|
-
"statusMessage": "(OmO 4.
|
|
23
|
+
"statusMessage": "(OmO 4.19.1) Resetting Git Bash MCP Reminder"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
|
|
10
10
|
"timeout": 10,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.19.1) Verifying LazyCodex Executor Evidence"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -22,4 +22,5 @@ Conventions for humans and agents working on this repository.
|
|
|
22
22
|
- LSP server processes are owned by `LspManager`.
|
|
23
23
|
- Tool execution acquires clients through `withLspClient(...)` unless it only reports static status.
|
|
24
24
|
- `lsp.rename` mutates files by applying workspace edits; keep it sequential at the MCP caller level.
|
|
25
|
+
- `.mcp.json` sets `lsp` MCP server `startup_timeout_sec: 10` to bound startup; preserve the bound on edits.
|
|
25
26
|
- Do not add pi-coding-agent or omo source dependencies. This package is standalone.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "4.
|
|
4
|
-
"inputDigest": "sha256:
|
|
3
|
+
"version": "4.19.1",
|
|
4
|
+
"inputDigest": "sha256:b64d94982c0d046c8e6ab9bf7628f1f18be57ac6418179257b2fda95228dc38a",
|
|
5
5
|
"outputs": [
|
|
6
6
|
{
|
|
7
7
|
"path": "cli.d.ts",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"path": "cli.js",
|
|
12
|
-
"sha256": "
|
|
12
|
+
"sha256": "f46b15e830f85d0d6f46e0b36c726de2fd56adc43b1cd4660430db86352a8f37"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"path": "codex-hook-cli.d.ts",
|
|
@@ -212,6 +212,78 @@ function errorCode(error) {
|
|
|
212
212
|
function isPlainRecord(value) {
|
|
213
213
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
214
214
|
}
|
|
215
|
+
|
|
216
|
+
class DaemonRequestError extends Error {
|
|
217
|
+
requestWritten;
|
|
218
|
+
constructor(message, requestWritten) {
|
|
219
|
+
super(message);
|
|
220
|
+
this.name = "DaemonRequestError";
|
|
221
|
+
this.requestWritten = requestWritten;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
class DaemonAuthenticationRejectedError extends DaemonRequestError {
|
|
226
|
+
constructor() {
|
|
227
|
+
super("daemon authentication failed before dispatch", true);
|
|
228
|
+
this.name = "DaemonAuthenticationRejectedError";
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
class DaemonRequestCancelledError extends DaemonRequestError {
|
|
233
|
+
constructor(requestWritten) {
|
|
234
|
+
super("daemon request cancelled", requestWritten);
|
|
235
|
+
this.name = "DaemonRequestCancelledError";
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
class DaemonRequestTimedOutError extends DaemonRequestError {
|
|
240
|
+
timeoutMs;
|
|
241
|
+
constructor(requestWritten, timeoutMs) {
|
|
242
|
+
super("daemon request timed out", requestWritten);
|
|
243
|
+
this.name = "DaemonRequestTimedOutError";
|
|
244
|
+
this.timeoutMs = timeoutMs;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function daemonFailureResult(paths, error) {
|
|
248
|
+
if (error instanceof DaemonRequestCancelledError)
|
|
249
|
+
return daemonCancelledResult(paths);
|
|
250
|
+
if (error instanceof DaemonRequestTimedOutError)
|
|
251
|
+
return daemonTimedOutResult(paths, error.timeoutMs);
|
|
252
|
+
return daemonUnreachableResult(paths, error);
|
|
253
|
+
}
|
|
254
|
+
function daemonCancelledResult(paths) {
|
|
255
|
+
const text = [
|
|
256
|
+
"LSP daemon request cancelled: the caller aborted this request (for example, the turn was interrupted).",
|
|
257
|
+
"The daemon stays available; no LSP work was applied. Retry when you are ready.",
|
|
258
|
+
`Socket: ${paths.socket}`
|
|
259
|
+
].join(`
|
|
260
|
+
`);
|
|
261
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
262
|
+
}
|
|
263
|
+
function daemonTimedOutResult(paths, timeoutMs) {
|
|
264
|
+
const text = [
|
|
265
|
+
`LSP daemon request timed out after ${timeoutMs}ms: the daemon did not respond in time.`,
|
|
266
|
+
"The daemon stays available but may be busy. Retry when you are ready.",
|
|
267
|
+
`Socket: ${paths.socket}`,
|
|
268
|
+
`Logs: ${paths.log}`
|
|
269
|
+
].join(`
|
|
270
|
+
`);
|
|
271
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
272
|
+
}
|
|
273
|
+
function daemonUnreachableResult(paths, error) {
|
|
274
|
+
const text = [
|
|
275
|
+
`LSP daemon unreachable: ${errorText(error)}.`,
|
|
276
|
+
"The MCP server is a thin proxy and never runs language servers in-process.",
|
|
277
|
+
`Socket: ${paths.socket}`,
|
|
278
|
+
`Logs: ${paths.log}`,
|
|
279
|
+
"The daemon is auto-started on demand and will be retried on the next request."
|
|
280
|
+
].join(`
|
|
281
|
+
`);
|
|
282
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
283
|
+
}
|
|
284
|
+
function errorText(error) {
|
|
285
|
+
return error instanceof Error ? error.message : String(error);
|
|
286
|
+
}
|
|
215
287
|
var OMO_DAEMON_PROTOCOL_VERSION = 1;
|
|
216
288
|
var AUTH_ERROR_CODE = -32001;
|
|
217
289
|
function authEnvelope(token) {
|
|
@@ -3134,8 +3206,13 @@ class LspClient extends LspClientConnection {
|
|
|
3134
3206
|
if (!pushFallbackOnly)
|
|
3135
3207
|
continue;
|
|
3136
3208
|
const remainingMs = deadlineAt - Date.now();
|
|
3137
|
-
if (remainingMs <= 0)
|
|
3209
|
+
if (remainingMs <= 0) {
|
|
3210
|
+
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
3211
|
+
const cached = this.documents.getPullCache(snapshot);
|
|
3212
|
+
return { items: cached === null ? [] : [...cached.diagnostics] };
|
|
3213
|
+
}
|
|
3138
3214
|
return this.freshnessTimeout(absPath);
|
|
3215
|
+
}
|
|
3139
3216
|
const waitMs = push.status === "wait" ? Math.min(push.waitMs, remainingMs) : remainingMs;
|
|
3140
3217
|
await waitForDiagnosticsActivity(this.documents.waitForDiagnosticsActivity(snapshot, waitMs), signal);
|
|
3141
3218
|
}
|
|
@@ -4995,29 +5072,6 @@ var LSP_MCP_TOOLS = [
|
|
|
4995
5072
|
var CONTEXT_KEY = "_context";
|
|
4996
5073
|
var DEFAULT_REQUEST_TIMEOUT_MS = 30000;
|
|
4997
5074
|
var nextProxyRequestId = 1;
|
|
4998
|
-
|
|
4999
|
-
class DaemonRequestError extends Error {
|
|
5000
|
-
requestWritten;
|
|
5001
|
-
constructor(message, requestWritten) {
|
|
5002
|
-
super(message);
|
|
5003
|
-
this.name = "DaemonRequestError";
|
|
5004
|
-
this.requestWritten = requestWritten;
|
|
5005
|
-
}
|
|
5006
|
-
}
|
|
5007
|
-
|
|
5008
|
-
class DaemonAuthenticationRejectedError extends DaemonRequestError {
|
|
5009
|
-
constructor() {
|
|
5010
|
-
super("daemon authentication failed before dispatch", true);
|
|
5011
|
-
this.name = "DaemonAuthenticationRejectedError";
|
|
5012
|
-
}
|
|
5013
|
-
}
|
|
5014
|
-
|
|
5015
|
-
class DaemonRequestCancelledError extends DaemonRequestError {
|
|
5016
|
-
constructor(requestWritten) {
|
|
5017
|
-
super("daemon request cancelled", requestWritten);
|
|
5018
|
-
this.name = "DaemonRequestCancelledError";
|
|
5019
|
-
}
|
|
5020
|
-
}
|
|
5021
5075
|
async function callToolViaDaemon(name, args, options) {
|
|
5022
5076
|
const context = requireContext(options.context);
|
|
5023
5077
|
const paths = options.paths ?? daemonPaths();
|
|
@@ -5046,7 +5100,7 @@ async function callToolViaDaemon(name, args, options) {
|
|
|
5046
5100
|
break;
|
|
5047
5101
|
}
|
|
5048
5102
|
}
|
|
5049
|
-
return
|
|
5103
|
+
return daemonFailureResult(paths, lastError);
|
|
5050
5104
|
}
|
|
5051
5105
|
function callDiagnosticsViaDaemon(filePath, options) {
|
|
5052
5106
|
return callToolViaDaemon("diagnostics", { filePath, severity: "error" }, options);
|
|
@@ -5080,17 +5134,6 @@ function ensureDaemonAvailable(paths, ensure, signal) {
|
|
|
5080
5134
|
Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() => resolve9()), (error) => finish(() => reject(signal.aborted ? new DaemonRequestCancelledError(false) : error)));
|
|
5081
5135
|
});
|
|
5082
5136
|
}
|
|
5083
|
-
function daemonUnreachableResult(paths, error) {
|
|
5084
|
-
const text2 = [
|
|
5085
|
-
`LSP daemon unreachable: ${errorText(error)}.`,
|
|
5086
|
-
"The MCP server is a thin proxy and never runs language servers in-process.",
|
|
5087
|
-
`Socket: ${paths.socket}`,
|
|
5088
|
-
`Logs: ${paths.log}`,
|
|
5089
|
-
"The daemon is auto-started on demand and will be retried on the next request."
|
|
5090
|
-
].join(`
|
|
5091
|
-
`);
|
|
5092
|
-
return { content: [{ type: "text", text: text2 }], isError: true };
|
|
5093
|
-
}
|
|
5094
5137
|
function sendToolCall(paths, token, name, args, options) {
|
|
5095
5138
|
return new Promise((resolve9, reject) => {
|
|
5096
5139
|
const socket = connect(paths.socket);
|
|
@@ -5130,7 +5173,7 @@ function sendToolCall(paths, token, name, args, options) {
|
|
|
5130
5173
|
};
|
|
5131
5174
|
const timer = setTimeout(() => {
|
|
5132
5175
|
sendCancel();
|
|
5133
|
-
finish(() => reject(new
|
|
5176
|
+
finish(() => reject(new DaemonRequestTimedOutError(requestWritten, options.timeoutMs)));
|
|
5134
5177
|
}, options.timeoutMs);
|
|
5135
5178
|
timer.unref();
|
|
5136
5179
|
if (options.signal?.aborted) {
|
|
@@ -5189,9 +5232,6 @@ function allocateProxyRequestId() {
|
|
|
5189
5232
|
function isRetryableTool(name) {
|
|
5190
5233
|
return name !== "rename" && name !== "lsp_rename";
|
|
5191
5234
|
}
|
|
5192
|
-
function errorText(error) {
|
|
5193
|
-
return error instanceof Error ? error.message : String(error);
|
|
5194
|
-
}
|
|
5195
5235
|
var OMO_LSP_DAEMON_CLI2 = "OMO_LSP_DAEMON_CLI";
|
|
5196
5236
|
var OMO_LSP_DAEMON_VERSION2 = "OMO_LSP_DAEMON_VERSION";
|
|
5197
5237
|
var DAEMON_VERSION_PATTERN2 = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
|
|
10
10
|
"timeout": 60,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.19.1) Checking LSP Diagnostics"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"type": "command",
|
|
22
22
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
23
23
|
"timeout": 5,
|
|
24
|
-
"statusMessage": "(OmO 4.
|
|
24
|
+
"statusMessage": "(OmO 4.19.1) Resetting LSP Diagnostics Cache"
|
|
25
25
|
}
|
|
26
26
|
]
|
|
27
27
|
}
|
|
@@ -3854,6 +3854,17 @@ var POST_COMPACT_MIN_RESERVED_TOKENS = 8000;
|
|
|
3854
3854
|
var POST_COMPACT_MIN_GUIDE_CHARS = 500;
|
|
3855
3855
|
var FALLBACK_CONTEXT_WINDOW_TOKENS = 200000;
|
|
3856
3856
|
var MODEL_CONTEXT_BUDGETS = [
|
|
3857
|
+
{ slug: "gpt-5.6-sol", contextWindowTokens: 372000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
|
|
3858
|
+
{
|
|
3859
|
+
slug: "gpt-5.6-terra",
|
|
3860
|
+
contextWindowTokens: 372000,
|
|
3861
|
+
effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
|
|
3862
|
+
},
|
|
3863
|
+
{
|
|
3864
|
+
slug: "gpt-5.6-luna",
|
|
3865
|
+
contextWindowTokens: 372000,
|
|
3866
|
+
effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
|
|
3867
|
+
},
|
|
3857
3868
|
{ slug: "gpt-5.5", contextWindowTokens: 272000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
|
|
3858
3869
|
{ slug: "gpt-5.4-mini", contextWindowTokens: 272000, effectivePercent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT },
|
|
3859
3870
|
{
|