oh-my-opencode 4.19.0 → 4.19.2
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 +6 -6
- package/README.ru.md +6 -6
- package/README.zh-cn.md +6 -6
- package/dist/agents/atlas/agent.d.ts +5 -3
- package/dist/agents/explore.d.ts +4 -2
- package/dist/agents/gpt-prompt-identity.d.ts +3 -0
- package/dist/agents/hephaestus/agent.d.ts +4 -2
- package/dist/agents/librarian.d.ts +4 -2
- package/dist/agents/metis.d.ts +4 -2
- package/dist/agents/momus.d.ts +3 -2
- package/dist/agents/multimodal-looker.d.ts +4 -2
- package/dist/agents/oracle.d.ts +4 -2
- package/dist/agents/sisyphus/claude-opus-5.d.ts +33 -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 +2 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +5 -2
- package/dist/agents/sisyphus-junior/agent.d.ts +4 -1
- package/dist/agents/sisyphus-junior/gpt-5-5.d.ts +2 -2
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/index.js +23577 -19269
- package/dist/cli-node/index.js +23577 -19269
- package/dist/config/schema/agent-names.d.ts +26 -26
- package/dist/config/schema/agent-overrides.d.ts +400 -400
- package/dist/config/schema/browser-automation.d.ts +2 -2
- package/dist/config/schema/categories.d.ts +36 -36
- package/dist/config/schema/codegraph.d.ts +2 -0
- package/dist/config/schema/commands.d.ts +2 -2
- package/dist/config/schema/dynamic-context-pruning.d.ts +1 -1
- package/dist/config/schema/experimental.d.ts +1 -1
- package/dist/config/schema/fallback-models.d.ts +25 -25
- package/dist/config/schema/hooks.d.ts +43 -43
- package/dist/config/schema/internal/permission.d.ts +9 -9
- package/dist/config/schema/keyword-detector.d.ts +6 -6
- package/dist/config/schema/oh-my-opencode-config.d.ts +404 -402
- package/dist/config/schema/tmux.d.ts +6 -6
- package/dist/create-hooks.d.ts +35 -35
- package/dist/features/background-agent/spawner/tmux-callback-invoker.d.ts +11 -0
- package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
- package/dist/features/claude-tasks/types.d.ts +4 -4
- package/dist/features/team-mode/team-runtime/shutdown-helpers.d.ts +1 -1
- package/dist/features/team-mode/team-runtime/shutdown-test-fixtures.d.ts +4 -4
- package/dist/features/team-mode/tools/lifecycle-test-fixture.d.ts +42 -42
- package/dist/features/tmux-subagent/environment-eligibility.d.ts +2 -0
- package/dist/features/tmux-subagent/index.d.ts +1 -0
- package/dist/features/tmux-subagent/tracked-session-state.d.ts +1 -0
- package/dist/features/tui-sidebar/snapshot-schema.d.ts +6 -6
- package/dist/help/schema/acp.d.ts +3 -3
- package/dist/help/schema/doctor.d.ts +4 -4
- package/dist/help/schema/status.d.ts +3 -3
- package/dist/hooks/codegraph-bootstrap/hook.d.ts +3 -2
- package/dist/hooks/goal/types.d.ts +5 -5
- package/dist/hooks/non-interactive-env/constants.d.ts +4 -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/hooks/start-work/parse-user-request.d.ts +2 -0
- package/dist/hooks/start-work/worktree-block.d.ts +5 -0
- package/dist/index.js +27370 -21301
- package/dist/mcp/types.d.ts +3 -3
- package/dist/oh-my-opencode.schema.json +11 -0
- package/dist/plugin/chat-message/loop-commands.d.ts +1 -0
- package/dist/plugin/command-execute-before.d.ts +3 -3
- package/dist/plugin/hooks/create-core-hooks.d.ts +25 -25
- package/dist/shared/omo-process-sweep.d.ts +18 -0
- package/dist/shared/tmux/tmux-utils/environment.d.ts +1 -1
- package/dist/shared/tmux/tmux-utils.d.ts +1 -1
- package/dist/shared/typescript-native-source-parser.d.ts +7 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +5 -2
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +3 -1
- package/dist/skills/coding-agent-sessions/references/senpi.md +15 -5
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
- package/dist/skills/debugging/SKILL.md +2 -1
- package/dist/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
- package/dist/skills/programming/SKILL.md +11 -1
- package/dist/skills/programming/references/logging.md +6 -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 +75 -11
- package/dist/skills/start-work/SKILL.md +12 -2
- package/dist/skills/ulw-plan/SKILL.md +21 -2
- package/dist/skills/ulw-plan/references/full-workflow.md +12 -1
- package/dist/skills/ulw-plan/references/intent-clear.md +1 -1
- package/dist/testing/create-plugin-module.d.ts +1 -0
- package/dist/tools/task/types.d.ts +10 -10
- package/dist/tui.js +23442 -19182
- 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 +62 -2
- 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 +72 -12
- 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/dist/cli.js +779 -385
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +302 -173
- 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 +23 -42
- 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 +17 -9
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +18 -25
- 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 +5 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +176 -0
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +6 -1
- 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/provisioned-node-guard.test.ts +6 -0
- 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 +2 -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 +42 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +122 -10
- 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 +101 -64
- 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/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/directive.md +1 -1
- 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/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/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/plan.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +12 -7
- 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/ultrawork/SKILL.md +12 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +21 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +12 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +1 -1
- 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/directive.md +12 -7
- 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/SKILL.md +2 -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/shared/test/config-loader.test.ts +44 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +5 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +3 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +15 -5
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +11 -1
- package/packages/omo-codex/plugin/skills/programming/references/logging.md +6 -1
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +75 -11
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +12 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +12 -7
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +8 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +21 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +12 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +1 -1
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +9 -9
- 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/sync-skills-orchestration.test.mjs +22 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +49 -5
- package/packages/omo-codex/scripts/install-marketplace-cache.test.mjs +4 -1
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +5 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +3 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +15 -5
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +46 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +19 -10
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -1
- package/packages/shared-skills/skills/debugging/references/methodology/03-flaky-triage.md +47 -0
- package/packages/shared-skills/skills/programming/SKILL.md +11 -1
- package/packages/shared-skills/skills/programming/references/logging.md +6 -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 +75 -11
- package/packages/shared-skills/skills/start-work/SKILL.md +12 -2
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +21 -2
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +12 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-opencode",
|
|
3
|
-
"version": "4.19.
|
|
3
|
+
"version": "4.19.2",
|
|
4
4
|
"description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -209,21 +209,21 @@
|
|
|
209
209
|
"bun-types": "1.3.14",
|
|
210
210
|
"node-pty": "^1.1.0",
|
|
211
211
|
"puppeteer-core": "^25.3.0",
|
|
212
|
-
"typescript": "^
|
|
212
|
+
"typescript": "^7.0.2"
|
|
213
213
|
},
|
|
214
214
|
"optionalDependencies": {
|
|
215
|
-
"oh-my-opencode-darwin-arm64": "4.19.
|
|
216
|
-
"oh-my-opencode-darwin-x64": "4.19.
|
|
217
|
-
"oh-my-opencode-darwin-x64-baseline": "4.19.
|
|
218
|
-
"oh-my-opencode-linux-arm64": "4.19.
|
|
219
|
-
"oh-my-opencode-linux-arm64-musl": "4.19.
|
|
220
|
-
"oh-my-opencode-linux-x64": "4.19.
|
|
221
|
-
"oh-my-opencode-linux-x64-baseline": "4.19.
|
|
222
|
-
"oh-my-opencode-linux-x64-musl": "4.19.
|
|
223
|
-
"oh-my-opencode-linux-x64-musl-baseline": "4.19.
|
|
224
|
-
"oh-my-opencode-windows-arm64": "4.19.
|
|
225
|
-
"oh-my-opencode-windows-x64": "4.19.
|
|
226
|
-
"oh-my-opencode-windows-x64-baseline": "4.19.
|
|
215
|
+
"oh-my-opencode-darwin-arm64": "4.19.2",
|
|
216
|
+
"oh-my-opencode-darwin-x64": "4.19.2",
|
|
217
|
+
"oh-my-opencode-darwin-x64-baseline": "4.19.2",
|
|
218
|
+
"oh-my-opencode-linux-arm64": "4.19.2",
|
|
219
|
+
"oh-my-opencode-linux-arm64-musl": "4.19.2",
|
|
220
|
+
"oh-my-opencode-linux-x64": "4.19.2",
|
|
221
|
+
"oh-my-opencode-linux-x64-baseline": "4.19.2",
|
|
222
|
+
"oh-my-opencode-linux-x64-musl": "4.19.2",
|
|
223
|
+
"oh-my-opencode-linux-x64-musl-baseline": "4.19.2",
|
|
224
|
+
"oh-my-opencode-windows-arm64": "4.19.2",
|
|
225
|
+
"oh-my-opencode-windows-x64": "4.19.2",
|
|
226
|
+
"oh-my-opencode-windows-x64-baseline": "4.19.2"
|
|
227
227
|
},
|
|
228
228
|
"overrides": {
|
|
229
229
|
"@earendil-works/pi-agent-core": "0.80.3",
|
|
@@ -163,16 +163,35 @@ function bufferFromChunk(chunk) {
|
|
|
163
163
|
|
|
164
164
|
// ../mcp-stdio-core/src/server.ts
|
|
165
165
|
var DEFAULT_IDLE_TIMEOUT_MS = 10 * 60000;
|
|
166
|
+
var DEFAULT_PARENT_POLL_INTERVAL_MS = 30000;
|
|
166
167
|
var noopLog = () => {};
|
|
168
|
+
function isProcessAlive(pid) {
|
|
169
|
+
try {
|
|
170
|
+
process.kill(pid, 0);
|
|
171
|
+
return true;
|
|
172
|
+
} catch (error) {
|
|
173
|
+
return !hasErrorCode(error, "ESRCH");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
167
176
|
async function runJsonRpcStdioServer(config) {
|
|
168
177
|
const log = config.log ?? noopLog;
|
|
169
178
|
const idleTimeoutMs = config.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;
|
|
170
|
-
|
|
179
|
+
let isClosed = false;
|
|
180
|
+
const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
|
|
181
|
+
isClosed = true;
|
|
182
|
+
config.onIdleTimeout?.();
|
|
183
|
+
});
|
|
184
|
+
const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
|
|
185
|
+
isClosed = true;
|
|
186
|
+
log("parent_exit", { parent_pid: parentPid, poll_interval_ms: pollIntervalMs });
|
|
187
|
+
config.onParentExit?.();
|
|
188
|
+
config.input.destroy();
|
|
189
|
+
});
|
|
171
190
|
log("stdio_started", { cwd: process.cwd(), idle_timeout_ms: idleTimeoutMs });
|
|
172
191
|
idleTimer.arm();
|
|
173
192
|
try {
|
|
174
193
|
for await (const message of readStdioJsonRpcMessages(config.input)) {
|
|
175
|
-
if (
|
|
194
|
+
if (isClosed)
|
|
176
195
|
break;
|
|
177
196
|
idleTimer.arm();
|
|
178
197
|
if (message.kind === "parse_error") {
|
|
@@ -183,8 +202,12 @@ async function runJsonRpcStdioServer(config) {
|
|
|
183
202
|
if (!await handleRequest(message, config, log))
|
|
184
203
|
break;
|
|
185
204
|
}
|
|
205
|
+
} catch (error) {
|
|
206
|
+
if (!(isClosed && hasErrorCode(error, "ERR_STREAM_PREMATURE_CLOSE")))
|
|
207
|
+
throw error;
|
|
186
208
|
} finally {
|
|
187
209
|
idleTimer.clear();
|
|
210
|
+
watchdog.clear();
|
|
188
211
|
log("stdio_stopped");
|
|
189
212
|
}
|
|
190
213
|
}
|
|
@@ -240,9 +263,33 @@ function isTerminalOutputError(error) {
|
|
|
240
263
|
return false;
|
|
241
264
|
return error.code === "EPIPE" || error.code === "ERR_STREAM_DESTROYED" || error.code === "ERR_STREAM_WRITE_AFTER_END";
|
|
242
265
|
}
|
|
243
|
-
function
|
|
266
|
+
function hasErrorCode(error, code) {
|
|
267
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
268
|
+
}
|
|
269
|
+
function createParentWatchdog(config, onDeadParent) {
|
|
270
|
+
if (config === undefined)
|
|
271
|
+
return { clear: () => {} };
|
|
272
|
+
const pollIntervalMs = config.pollIntervalMs ?? DEFAULT_PARENT_POLL_INTERVAL_MS;
|
|
273
|
+
if (pollIntervalMs <= 0)
|
|
274
|
+
return { clear: () => {} };
|
|
275
|
+
const parentPid = config.parentPid ?? process.ppid;
|
|
276
|
+
const probeAlive = config.probeAlive ?? isProcessAlive;
|
|
277
|
+
let fired = false;
|
|
278
|
+
const timer = setInterval(() => {
|
|
279
|
+
if (fired || probeAlive(parentPid))
|
|
280
|
+
return;
|
|
281
|
+
fired = true;
|
|
282
|
+
onDeadParent(parentPid, pollIntervalMs);
|
|
283
|
+
}, pollIntervalMs);
|
|
284
|
+
timer.unref();
|
|
285
|
+
return {
|
|
286
|
+
clear: () => {
|
|
287
|
+
clearInterval(timer);
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
244
292
|
let timer = null;
|
|
245
|
-
let isClosed = false;
|
|
246
293
|
return {
|
|
247
294
|
arm: () => {
|
|
248
295
|
if (timer !== null)
|
|
@@ -250,9 +297,8 @@ function createIdleTimer(idleTimeoutMs, log, onIdleTimeout) {
|
|
|
250
297
|
if (idleTimeoutMs <= 0)
|
|
251
298
|
return;
|
|
252
299
|
timer = setTimeout(() => {
|
|
253
|
-
isClosed = true;
|
|
254
300
|
log("idle_timeout", { idle_timeout_ms: idleTimeoutMs });
|
|
255
|
-
|
|
301
|
+
onTimeout();
|
|
256
302
|
}, idleTimeoutMs);
|
|
257
303
|
timer.unref();
|
|
258
304
|
},
|
|
@@ -261,8 +307,7 @@ function createIdleTimer(idleTimeoutMs, log, onIdleTimeout) {
|
|
|
261
307
|
return;
|
|
262
308
|
clearTimeout(timer);
|
|
263
309
|
timer = null;
|
|
264
|
-
}
|
|
265
|
-
closed: () => isClosed
|
|
310
|
+
}
|
|
266
311
|
};
|
|
267
312
|
}
|
|
268
313
|
// ../utils/src/runtime/git-bash.ts
|
|
@@ -444,6 +489,7 @@ async function runMcpStdioServer(input, output, options = {}) {
|
|
|
444
489
|
handler: handleGitBashMcpRequest,
|
|
445
490
|
handlerOptions: options,
|
|
446
491
|
idleTimeoutMs: 0,
|
|
492
|
+
parentWatchdog: options.parentWatchdog ?? {},
|
|
447
493
|
log: options.lifecycleLog,
|
|
448
494
|
parseErrorResponse: () => errorResponse(null, -32601, "Method not found")
|
|
449
495
|
});
|
|
@@ -107,7 +107,7 @@ describe("LspClient diagnostics freshness", () => {
|
|
|
107
107
|
},
|
|
108
108
|
],
|
|
109
109
|
},
|
|
110
|
-
{ diagnosticsFreshnessTimeoutMs:
|
|
110
|
+
{ diagnosticsFreshnessTimeoutMs: 100, versionlessPublishQuiescenceMs: 5 },
|
|
111
111
|
);
|
|
112
112
|
await stale.client.openFile(stale.source);
|
|
113
113
|
writeFileSync(stale.source, "const stale = 1;\n", "utf-8");
|
|
@@ -130,7 +130,7 @@ describe("LspClient diagnostics freshness", () => {
|
|
|
130
130
|
},
|
|
131
131
|
],
|
|
132
132
|
},
|
|
133
|
-
{ diagnosticsFreshnessTimeoutMs:
|
|
133
|
+
{ diagnosticsFreshnessTimeoutMs: 100, versionlessPublishQuiescenceMs: 5 },
|
|
134
134
|
);
|
|
135
135
|
await future.client.openFile(future.source);
|
|
136
136
|
writeFileSync(future.source, "const future = 1;\n", "utf-8");
|
|
@@ -258,4 +258,64 @@ describe("LspClient diagnostics freshness", () => {
|
|
|
258
258
|
expect(result.transientError?.kind).toBe("freshness_timeout");
|
|
259
259
|
expect(cancel?.params).toEqual({ id: request?.id });
|
|
260
260
|
});
|
|
261
|
+
|
|
262
|
+
it("#given a server without pull support that never publishes diagnostics #when diagnostics run on a clean file #then the request resolves clean after the freshness window instead of reporting a timeout", async () => {
|
|
263
|
+
const context = await harness.makeClient(
|
|
264
|
+
{},
|
|
265
|
+
{ diagnosticsFreshnessTimeoutMs: 60, versionlessPublishQuiescenceMs: 5 },
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
const startedAt = Date.now();
|
|
269
|
+
const result = await context.client.diagnostics(context.source);
|
|
270
|
+
const elapsedMs = Date.now() - startedAt;
|
|
271
|
+
|
|
272
|
+
expect(result.transientError).toBeUndefined();
|
|
273
|
+
expect(result.items).toEqual([]);
|
|
274
|
+
// The full freshness window is still honored so a slow publisher can win.
|
|
275
|
+
expect(elapsedMs).toBeGreaterThanOrEqual(45);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it("#given a pull-supported server that cached diagnostics for an older document version #when the file changes and a later pull is rejected as unsupported without any publish #then the fallback resolves empty instead of returning the stale cached diagnostics", async () => {
|
|
279
|
+
const context = await harness.makeClient(
|
|
280
|
+
{
|
|
281
|
+
capabilities: { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false } },
|
|
282
|
+
diagnosticResponses: [
|
|
283
|
+
{ report: { kind: "full", resultId: "v1", items: [diagnostic("stale-pull")] } },
|
|
284
|
+
{ error: { code: -32601, message: "Method not found" } },
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
{ diagnosticsFreshnessTimeoutMs: 60, versionlessPublishQuiescenceMs: 5 },
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
const first = await context.client.diagnostics(context.source);
|
|
291
|
+
expect(first.items).toEqual([diagnostic("stale-pull")]);
|
|
292
|
+
|
|
293
|
+
writeFileSync(context.source, "const changed = 1;\n");
|
|
294
|
+
await context.client.openFile(context.source);
|
|
295
|
+
|
|
296
|
+
const second = await context.client.diagnostics(context.source);
|
|
297
|
+
expect(second.transientError).toBeUndefined();
|
|
298
|
+
expect(second.items).toEqual([]);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it("#given a pull-supported server with a current cached pull report #when a later pull is rejected as unsupported without any publish and the document is unchanged #then the fallback resolves with the current cached diagnostics", async () => {
|
|
302
|
+
const context = await harness.makeClient(
|
|
303
|
+
{
|
|
304
|
+
capabilities: { diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false } },
|
|
305
|
+
diagnosticResponses: [
|
|
306
|
+
{ report: { kind: "full", resultId: "v1", items: [diagnostic("cached-full")] } },
|
|
307
|
+
{ error: { code: -32601, message: "Method not found" } },
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
{ diagnosticsFreshnessTimeoutMs: 60, versionlessPublishQuiescenceMs: 5 },
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
const first = await context.client.diagnostics(context.source);
|
|
314
|
+
expect(first.items).toEqual([diagnostic("cached-full")]);
|
|
315
|
+
|
|
316
|
+
const second = await context.client.diagnostics(context.source);
|
|
317
|
+
expect(second.transientError).toBeUndefined();
|
|
318
|
+
expect(second.items).toEqual([diagnostic("cached-full")]);
|
|
319
|
+
});
|
|
320
|
+
|
|
261
321
|
});
|
|
@@ -237,7 +237,20 @@ export class LspClient extends LspClientConnection {
|
|
|
237
237
|
if (!pushFallbackOnly) continue;
|
|
238
238
|
|
|
239
239
|
const remainingMs = deadlineAt - Date.now();
|
|
240
|
-
if (remainingMs <= 0)
|
|
240
|
+
if (remainingMs <= 0) {
|
|
241
|
+
// A server that never advertised pull diagnostics (or rejected the pull
|
|
242
|
+
// method) and has never published for this document stays silent for a
|
|
243
|
+
// clean file (e.g. Marksman, #6131). Resolve with the version-current
|
|
244
|
+
// pull cache or explicit empty instead of a freshness timeout; a stale
|
|
245
|
+
// pull cache from an older document version is never returned. Servers
|
|
246
|
+
// that have published before keep timing out via publishGeneration > 0,
|
|
247
|
+
// and a hung advertised pull keeps timing out because pull stays supported.
|
|
248
|
+
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
249
|
+
const cached = this.documents.getPullCache(snapshot);
|
|
250
|
+
return { items: cached === null ? [] : [...cached.diagnostics] };
|
|
251
|
+
}
|
|
252
|
+
return this.freshnessTimeout(absPath);
|
|
253
|
+
}
|
|
241
254
|
const waitMs = push.status === "wait" ? Math.min(push.waitMs, remainingMs) : remainingMs;
|
|
242
255
|
await waitForDiagnosticsActivity(this.documents.waitForDiagnosticsActivity(snapshot, waitMs), signal);
|
|
243
256
|
}
|
|
@@ -182,9 +182,9 @@ try {
|
|
|
182
182
|
outcome: "silent",
|
|
183
183
|
items: silentResult.items.map((entry) => entry.message),
|
|
184
184
|
transientError: silentResult.transientError ?? null,
|
|
185
|
-
ok: silentResult.items.length === 0 && silentResult.transientError
|
|
185
|
+
ok: silentResult.items.length === 0 && silentResult.transientError === undefined,
|
|
186
186
|
};
|
|
187
|
-
requireProbe(silentEvidence.ok, "silent
|
|
187
|
+
requireProbe(silentEvidence.ok, "silent no-pull server that never published did not resolve clean after the freshness window");
|
|
188
188
|
|
|
189
189
|
const closedServer = await harness.makeClient(
|
|
190
190
|
{
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
type JsonRpcResponse,
|
|
11
11
|
type JsonRpcResult,
|
|
12
12
|
type McpToolDescriptor,
|
|
13
|
+
type ParentWatchdogConfig,
|
|
13
14
|
} from "@oh-my-opencode/mcp-stdio-core";
|
|
14
15
|
import { coerceToolArguments, executeLspTool, LSP_MCP_TOOLS } from "./tools.js";
|
|
15
16
|
import { createStandaloneMcpRequestContext, runWithRequestContext } from "./request-context.js";
|
|
@@ -23,6 +24,12 @@ export interface HandleLspMcpRequestOptions {
|
|
|
23
24
|
readonly signal?: AbortSignal;
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
export interface LspMcpStdioServerOptions {
|
|
28
|
+
// Test seam: production callers leave this unset so the watchdog uses its
|
|
29
|
+
// defaults (parentPid = process.ppid, 30s poll).
|
|
30
|
+
readonly parentWatchdog?: ParentWatchdogConfig;
|
|
31
|
+
}
|
|
32
|
+
|
|
26
33
|
export async function handleLspMcpRequest(
|
|
27
34
|
input: unknown,
|
|
28
35
|
options: HandleLspMcpRequestOptions = {},
|
|
@@ -58,12 +65,14 @@ export async function handleLspMcpRequest(
|
|
|
58
65
|
export async function runMcpStdioServer(
|
|
59
66
|
input: Readable = process.stdin,
|
|
60
67
|
output: Writable = process.stdout,
|
|
68
|
+
options: LspMcpStdioServerOptions = {},
|
|
61
69
|
): Promise<void> {
|
|
62
70
|
const requestContext = createStandaloneMcpRequestContext();
|
|
63
71
|
await runJsonRpcStdioServer({
|
|
64
72
|
input,
|
|
65
73
|
output,
|
|
66
74
|
idleTimeoutMs: 0,
|
|
75
|
+
parentWatchdog: options.parentWatchdog ?? {},
|
|
67
76
|
handler: (request) => runWithRequestContext(requestContext, () => handleLspMcpRequest(request)),
|
|
68
77
|
handlerOptions: undefined,
|
|
69
78
|
});
|