opencode-repos 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +180 -0
- package/README.md +103 -3
- package/TODO.md +3 -0
- package/index.ts +1590 -158
- package/oh-my-opencode/.github/FUNDING.yml +15 -0
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/bug_report.yml +129 -0
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/feature_request.yml +100 -0
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/general.yml +83 -0
- package/oh-my-opencode/.github/assets/google.jpg +0 -0
- package/oh-my-opencode/.github/assets/hero.jpg +0 -0
- package/oh-my-opencode/.github/assets/indent.jpg +0 -0
- package/oh-my-opencode/.github/assets/microsoft.jpg +0 -0
- package/oh-my-opencode/.github/assets/omo.png +0 -0
- package/oh-my-opencode/.github/assets/orchestrator-atlas.png +0 -0
- package/oh-my-opencode/.github/assets/sisyphus.png +0 -0
- package/oh-my-opencode/.github/assets/sisyphuslabs.png +0 -0
- package/oh-my-opencode/.github/pull_request_template.md +34 -0
- package/oh-my-opencode/.github/workflows/ci.yml +138 -0
- package/oh-my-opencode/.github/workflows/cla.yml +41 -0
- package/oh-my-opencode/.github/workflows/lint-workflows.yml +22 -0
- package/oh-my-opencode/.github/workflows/publish.yml +165 -0
- package/oh-my-opencode/.github/workflows/sisyphus-agent.yml +500 -0
- package/oh-my-opencode/.opencode/background-tasks.json +27 -0
- package/oh-my-opencode/.opencode/command/get-unpublished-changes.md +84 -0
- package/oh-my-opencode/.opencode/command/omomomo.md +37 -0
- package/oh-my-opencode/.opencode/command/publish.md +257 -0
- package/oh-my-opencode/AGENTS.md +179 -0
- package/oh-my-opencode/CLA.md +58 -0
- package/oh-my-opencode/CONTRIBUTING.md +268 -0
- package/oh-my-opencode/LICENSE.md +82 -0
- package/oh-my-opencode/README.ja.md +370 -0
- package/oh-my-opencode/README.md +376 -0
- package/oh-my-opencode/README.zh-cn.md +380 -0
- package/oh-my-opencode/assets/oh-my-opencode.schema.json +2171 -0
- package/oh-my-opencode/bin/oh-my-opencode.js +80 -0
- package/oh-my-opencode/bin/platform.js +38 -0
- package/oh-my-opencode/bin/platform.test.ts +148 -0
- package/oh-my-opencode/bun.lock +314 -0
- package/oh-my-opencode/bunfig.toml +2 -0
- package/oh-my-opencode/docs/category-skill-guide.md +200 -0
- package/oh-my-opencode/docs/cli-guide.md +272 -0
- package/oh-my-opencode/docs/configurations.md +654 -0
- package/oh-my-opencode/docs/features.md +550 -0
- package/oh-my-opencode/docs/guide/installation.md +288 -0
- package/oh-my-opencode/docs/guide/overview.md +97 -0
- package/oh-my-opencode/docs/guide/understanding-orchestration-system.md +445 -0
- package/oh-my-opencode/docs/orchestration-guide.md +152 -0
- package/oh-my-opencode/docs/ultrawork-manifesto.md +197 -0
- package/oh-my-opencode/package.json +89 -0
- package/oh-my-opencode/packages/darwin-arm64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/darwin-arm64/package.json +22 -0
- package/oh-my-opencode/packages/darwin-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/darwin-x64/package.json +22 -0
- package/oh-my-opencode/packages/linux-arm64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-arm64/package.json +25 -0
- package/oh-my-opencode/packages/linux-arm64-musl/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-arm64-musl/package.json +25 -0
- package/oh-my-opencode/packages/linux-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-x64/package.json +25 -0
- package/oh-my-opencode/packages/linux-x64-musl/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-x64-musl/package.json +25 -0
- package/oh-my-opencode/packages/windows-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/windows-x64/package.json +22 -0
- package/oh-my-opencode/postinstall.mjs +43 -0
- package/oh-my-opencode/script/build-binaries.ts +103 -0
- package/oh-my-opencode/script/build-schema.ts +28 -0
- package/oh-my-opencode/script/generate-changelog.ts +92 -0
- package/oh-my-opencode/script/publish.ts +344 -0
- package/oh-my-opencode/signatures/cla.json +676 -0
- package/oh-my-opencode/src/agents/AGENTS.md +67 -0
- package/oh-my-opencode/src/agents/atlas.ts +1383 -0
- package/oh-my-opencode/src/agents/dynamic-agent-prompt-builder.ts +400 -0
- package/oh-my-opencode/src/agents/explore.ts +122 -0
- package/oh-my-opencode/src/agents/index.ts +13 -0
- package/oh-my-opencode/src/agents/librarian.ts +326 -0
- package/oh-my-opencode/src/agents/metis.ts +315 -0
- package/oh-my-opencode/src/agents/momus.test.ts +57 -0
- package/oh-my-opencode/src/agents/momus.ts +444 -0
- package/oh-my-opencode/src/agents/multimodal-looker.ts +56 -0
- package/oh-my-opencode/src/agents/oracle.ts +122 -0
- package/oh-my-opencode/src/agents/prometheus-prompt.test.ts +22 -0
- package/oh-my-opencode/src/agents/prometheus-prompt.ts +1196 -0
- package/oh-my-opencode/src/agents/sisyphus-junior.test.ts +232 -0
- package/oh-my-opencode/src/agents/sisyphus-junior.ts +134 -0
- package/oh-my-opencode/src/agents/sisyphus.ts +633 -0
- package/oh-my-opencode/src/agents/types.ts +80 -0
- package/oh-my-opencode/src/agents/utils.test.ts +311 -0
- package/oh-my-opencode/src/agents/utils.ts +240 -0
- package/oh-my-opencode/src/cli/AGENTS.md +91 -0
- package/oh-my-opencode/src/cli/config-manager.test.ts +364 -0
- package/oh-my-opencode/src/cli/config-manager.ts +641 -0
- package/oh-my-opencode/src/cli/doctor/checks/auth.test.ts +114 -0
- package/oh-my-opencode/src/cli/doctor/checks/auth.ts +115 -0
- package/oh-my-opencode/src/cli/doctor/checks/config.test.ts +103 -0
- package/oh-my-opencode/src/cli/doctor/checks/config.ts +123 -0
- package/oh-my-opencode/src/cli/doctor/checks/dependencies.test.ts +152 -0
- package/oh-my-opencode/src/cli/doctor/checks/dependencies.ts +163 -0
- package/oh-my-opencode/src/cli/doctor/checks/gh.test.ts +151 -0
- package/oh-my-opencode/src/cli/doctor/checks/gh.ts +171 -0
- package/oh-my-opencode/src/cli/doctor/checks/index.ts +34 -0
- package/oh-my-opencode/src/cli/doctor/checks/lsp.test.ts +134 -0
- package/oh-my-opencode/src/cli/doctor/checks/lsp.ts +77 -0
- package/oh-my-opencode/src/cli/doctor/checks/mcp.test.ts +115 -0
- package/oh-my-opencode/src/cli/doctor/checks/mcp.ts +128 -0
- package/oh-my-opencode/src/cli/doctor/checks/opencode.test.ts +227 -0
- package/oh-my-opencode/src/cli/doctor/checks/opencode.ts +178 -0
- package/oh-my-opencode/src/cli/doctor/checks/plugin.test.ts +109 -0
- package/oh-my-opencode/src/cli/doctor/checks/plugin.ts +124 -0
- package/oh-my-opencode/src/cli/doctor/checks/version.test.ts +148 -0
- package/oh-my-opencode/src/cli/doctor/checks/version.ts +135 -0
- package/oh-my-opencode/src/cli/doctor/constants.ts +72 -0
- package/oh-my-opencode/src/cli/doctor/formatter.test.ts +218 -0
- package/oh-my-opencode/src/cli/doctor/formatter.ts +140 -0
- package/oh-my-opencode/src/cli/doctor/index.ts +11 -0
- package/oh-my-opencode/src/cli/doctor/runner.test.ts +153 -0
- package/oh-my-opencode/src/cli/doctor/runner.ts +132 -0
- package/oh-my-opencode/src/cli/doctor/types.ts +113 -0
- package/oh-my-opencode/src/cli/get-local-version/formatter.ts +66 -0
- package/oh-my-opencode/src/cli/get-local-version/index.ts +106 -0
- package/oh-my-opencode/src/cli/get-local-version/types.ts +14 -0
- package/oh-my-opencode/src/cli/index.ts +153 -0
- package/oh-my-opencode/src/cli/install.ts +523 -0
- package/oh-my-opencode/src/cli/model-fallback.ts +246 -0
- package/oh-my-opencode/src/cli/run/completion.test.ts +170 -0
- package/oh-my-opencode/src/cli/run/completion.ts +79 -0
- package/oh-my-opencode/src/cli/run/events.test.ts +155 -0
- package/oh-my-opencode/src/cli/run/events.ts +325 -0
- package/oh-my-opencode/src/cli/run/index.ts +2 -0
- package/oh-my-opencode/src/cli/run/runner.ts +159 -0
- package/oh-my-opencode/src/cli/run/types.ts +76 -0
- package/oh-my-opencode/src/cli/types.ts +40 -0
- package/oh-my-opencode/src/config/index.ts +26 -0
- package/oh-my-opencode/src/config/schema.test.ts +444 -0
- package/oh-my-opencode/src/config/schema.ts +339 -0
- package/oh-my-opencode/src/features/AGENTS.md +77 -0
- package/oh-my-opencode/src/features/background-agent/concurrency.test.ts +418 -0
- package/oh-my-opencode/src/features/background-agent/concurrency.ts +137 -0
- package/oh-my-opencode/src/features/background-agent/index.ts +3 -0
- package/oh-my-opencode/src/features/background-agent/manager.test.ts +1928 -0
- package/oh-my-opencode/src/features/background-agent/manager.ts +1335 -0
- package/oh-my-opencode/src/features/background-agent/types.ts +66 -0
- package/oh-my-opencode/src/features/boulder-state/constants.ts +13 -0
- package/oh-my-opencode/src/features/boulder-state/index.ts +3 -0
- package/oh-my-opencode/src/features/boulder-state/storage.test.ts +250 -0
- package/oh-my-opencode/src/features/boulder-state/storage.ts +150 -0
- package/oh-my-opencode/src/features/boulder-state/types.ts +26 -0
- package/oh-my-opencode/src/features/builtin-commands/commands.ts +89 -0
- package/oh-my-opencode/src/features/builtin-commands/index.ts +2 -0
- package/oh-my-opencode/src/features/builtin-commands/templates/init-deep.ts +300 -0
- package/oh-my-opencode/src/features/builtin-commands/templates/ralph-loop.ts +38 -0
- package/oh-my-opencode/src/features/builtin-commands/templates/refactor.ts +619 -0
- package/oh-my-opencode/src/features/builtin-commands/templates/start-work.ts +72 -0
- package/oh-my-opencode/src/features/builtin-commands/types.ts +9 -0
- package/oh-my-opencode/src/features/builtin-skills/frontend-ui-ux/SKILL.md +78 -0
- package/oh-my-opencode/src/features/builtin-skills/git-master/SKILL.md +1105 -0
- package/oh-my-opencode/src/features/builtin-skills/index.ts +2 -0
- package/oh-my-opencode/src/features/builtin-skills/skills.ts +1203 -0
- package/oh-my-opencode/src/features/builtin-skills/types.ts +16 -0
- package/oh-my-opencode/src/features/claude-code-agent-loader/index.ts +2 -0
- package/oh-my-opencode/src/features/claude-code-agent-loader/loader.ts +90 -0
- package/oh-my-opencode/src/features/claude-code-agent-loader/types.ts +17 -0
- package/oh-my-opencode/src/features/claude-code-command-loader/index.ts +2 -0
- package/oh-my-opencode/src/features/claude-code-command-loader/loader.ts +144 -0
- package/oh-my-opencode/src/features/claude-code-command-loader/types.ts +46 -0
- package/oh-my-opencode/src/features/claude-code-mcp-loader/env-expander.ts +27 -0
- package/oh-my-opencode/src/features/claude-code-mcp-loader/index.ts +11 -0
- package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.test.ts +162 -0
- package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.ts +113 -0
- package/oh-my-opencode/src/features/claude-code-mcp-loader/transformer.ts +53 -0
- package/oh-my-opencode/src/features/claude-code-mcp-loader/types.ts +42 -0
- package/oh-my-opencode/src/features/claude-code-plugin-loader/index.ts +3 -0
- package/oh-my-opencode/src/features/claude-code-plugin-loader/loader.ts +486 -0
- package/oh-my-opencode/src/features/claude-code-plugin-loader/types.ts +210 -0
- package/oh-my-opencode/src/features/claude-code-session-state/index.ts +1 -0
- package/oh-my-opencode/src/features/claude-code-session-state/state.test.ts +126 -0
- package/oh-my-opencode/src/features/claude-code-session-state/state.ts +37 -0
- package/oh-my-opencode/src/features/context-injector/collector.test.ts +330 -0
- package/oh-my-opencode/src/features/context-injector/collector.ts +85 -0
- package/oh-my-opencode/src/features/context-injector/index.ts +14 -0
- package/oh-my-opencode/src/features/context-injector/injector.test.ts +122 -0
- package/oh-my-opencode/src/features/context-injector/injector.ts +167 -0
- package/oh-my-opencode/src/features/context-injector/types.ts +91 -0
- package/oh-my-opencode/src/features/hook-message-injector/constants.ts +6 -0
- package/oh-my-opencode/src/features/hook-message-injector/index.ts +4 -0
- package/oh-my-opencode/src/features/hook-message-injector/injector.ts +195 -0
- package/oh-my-opencode/src/features/hook-message-injector/types.ts +47 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.test.ts +448 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.ts +180 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/blocking.test.ts +210 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/blocking.ts +62 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/discover-worker.ts +59 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/index.ts +4 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/loader.test.ts +273 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/loader.ts +259 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/merger.ts +267 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.test.ts +267 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.ts +206 -0
- package/oh-my-opencode/src/features/opencode-skill-loader/types.ts +38 -0
- package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.test.ts +201 -0
- package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.ts +27 -0
- package/oh-my-opencode/src/features/skill-mcp-manager/index.ts +2 -0
- package/oh-my-opencode/src/features/skill-mcp-manager/manager.test.ts +611 -0
- package/oh-my-opencode/src/features/skill-mcp-manager/manager.ts +520 -0
- package/oh-my-opencode/src/features/skill-mcp-manager/types.ts +14 -0
- package/oh-my-opencode/src/features/task-toast-manager/index.ts +2 -0
- package/oh-my-opencode/src/features/task-toast-manager/manager.test.ts +249 -0
- package/oh-my-opencode/src/features/task-toast-manager/manager.ts +215 -0
- package/oh-my-opencode/src/features/task-toast-manager/types.ts +24 -0
- package/oh-my-opencode/src/hooks/AGENTS.md +73 -0
- package/oh-my-opencode/src/hooks/agent-usage-reminder/constants.ts +54 -0
- package/oh-my-opencode/src/hooks/agent-usage-reminder/index.ts +109 -0
- package/oh-my-opencode/src/hooks/agent-usage-reminder/storage.ts +42 -0
- package/oh-my-opencode/src/hooks/agent-usage-reminder/types.ts +6 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts +307 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.ts +485 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/index.ts +151 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/parser.ts +201 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.test.ts +33 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.ts +184 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-types.ts +44 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.test.ts +77 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.ts +250 -0
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/types.ts +42 -0
- package/oh-my-opencode/src/hooks/atlas/index.test.ts +953 -0
- package/oh-my-opencode/src/hooks/atlas/index.ts +771 -0
- package/oh-my-opencode/src/hooks/auto-slash-command/constants.ts +12 -0
- package/oh-my-opencode/src/hooks/auto-slash-command/detector.test.ts +296 -0
- package/oh-my-opencode/src/hooks/auto-slash-command/detector.ts +65 -0
- package/oh-my-opencode/src/hooks/auto-slash-command/executor.ts +205 -0
- package/oh-my-opencode/src/hooks/auto-slash-command/index.test.ts +254 -0
- package/oh-my-opencode/src/hooks/auto-slash-command/index.ts +89 -0
- package/oh-my-opencode/src/hooks/auto-slash-command/types.ts +23 -0
- package/oh-my-opencode/src/hooks/auto-update-checker/cache.ts +93 -0
- package/oh-my-opencode/src/hooks/auto-update-checker/checker.test.ts +24 -0
- package/oh-my-opencode/src/hooks/auto-update-checker/checker.ts +284 -0
- package/oh-my-opencode/src/hooks/auto-update-checker/constants.ts +64 -0
- package/oh-my-opencode/src/hooks/auto-update-checker/index.test.ts +254 -0
- package/oh-my-opencode/src/hooks/auto-update-checker/index.ts +260 -0
- package/oh-my-opencode/src/hooks/auto-update-checker/types.ts +29 -0
- package/oh-my-opencode/src/hooks/background-compaction/index.ts +87 -0
- package/oh-my-opencode/src/hooks/background-notification/index.ts +28 -0
- package/oh-my-opencode/src/hooks/background-notification/types.ts +5 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/AGENTS.md +70 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/config-loader.ts +107 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/config.ts +103 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/index.ts +401 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/plugin-config.ts +12 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/post-tool-use.ts +199 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/pre-compact.ts +109 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/pre-tool-use.ts +172 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/stop.ts +118 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/todo.ts +76 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/tool-input-cache.ts +47 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/transcript.ts +252 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/types.ts +204 -0
- package/oh-my-opencode/src/hooks/claude-code-hooks/user-prompt-submit.ts +117 -0
- package/oh-my-opencode/src/hooks/comment-checker/cli.test.ts +68 -0
- package/oh-my-opencode/src/hooks/comment-checker/cli.ts +221 -0
- package/oh-my-opencode/src/hooks/comment-checker/downloader.ts +196 -0
- package/oh-my-opencode/src/hooks/comment-checker/index.ts +171 -0
- package/oh-my-opencode/src/hooks/comment-checker/types.ts +33 -0
- package/oh-my-opencode/src/hooks/compaction-context-injector/index.ts +61 -0
- package/oh-my-opencode/src/hooks/context-window-monitor.ts +99 -0
- package/oh-my-opencode/src/hooks/delegate-task-retry/index.test.ts +119 -0
- package/oh-my-opencode/src/hooks/delegate-task-retry/index.ts +136 -0
- package/oh-my-opencode/src/hooks/directory-agents-injector/constants.ts +9 -0
- package/oh-my-opencode/src/hooks/directory-agents-injector/index.ts +182 -0
- package/oh-my-opencode/src/hooks/directory-agents-injector/storage.ts +48 -0
- package/oh-my-opencode/src/hooks/directory-agents-injector/types.ts +5 -0
- package/oh-my-opencode/src/hooks/directory-readme-injector/constants.ts +9 -0
- package/oh-my-opencode/src/hooks/directory-readme-injector/index.ts +177 -0
- package/oh-my-opencode/src/hooks/directory-readme-injector/storage.ts +48 -0
- package/oh-my-opencode/src/hooks/directory-readme-injector/types.ts +5 -0
- package/oh-my-opencode/src/hooks/edit-error-recovery/index.test.ts +126 -0
- package/oh-my-opencode/src/hooks/edit-error-recovery/index.ts +57 -0
- package/oh-my-opencode/src/hooks/empty-task-response-detector.ts +27 -0
- package/oh-my-opencode/src/hooks/index.ts +32 -0
- package/oh-my-opencode/src/hooks/interactive-bash-session/constants.ts +15 -0
- package/oh-my-opencode/src/hooks/interactive-bash-session/index.ts +262 -0
- package/oh-my-opencode/src/hooks/interactive-bash-session/storage.ts +59 -0
- package/oh-my-opencode/src/hooks/interactive-bash-session/types.ts +11 -0
- package/oh-my-opencode/src/hooks/keyword-detector/constants.ts +300 -0
- package/oh-my-opencode/src/hooks/keyword-detector/detector.ts +52 -0
- package/oh-my-opencode/src/hooks/keyword-detector/index.test.ts +529 -0
- package/oh-my-opencode/src/hooks/keyword-detector/index.ts +100 -0
- package/oh-my-opencode/src/hooks/keyword-detector/types.ts +4 -0
- package/oh-my-opencode/src/hooks/non-interactive-env/constants.ts +70 -0
- package/oh-my-opencode/src/hooks/non-interactive-env/detector.ts +19 -0
- package/oh-my-opencode/src/hooks/non-interactive-env/index.test.ts +323 -0
- package/oh-my-opencode/src/hooks/non-interactive-env/index.ts +63 -0
- package/oh-my-opencode/src/hooks/non-interactive-env/types.ts +3 -0
- package/oh-my-opencode/src/hooks/prometheus-md-only/constants.ts +32 -0
- package/oh-my-opencode/src/hooks/prometheus-md-only/index.test.ts +488 -0
- package/oh-my-opencode/src/hooks/prometheus-md-only/index.ts +136 -0
- package/oh-my-opencode/src/hooks/ralph-loop/constants.ts +5 -0
- package/oh-my-opencode/src/hooks/ralph-loop/index.test.ts +835 -0
- package/oh-my-opencode/src/hooks/ralph-loop/index.ts +417 -0
- package/oh-my-opencode/src/hooks/ralph-loop/storage.ts +115 -0
- package/oh-my-opencode/src/hooks/ralph-loop/types.ts +19 -0
- package/oh-my-opencode/src/hooks/rules-injector/constants.ts +30 -0
- package/oh-my-opencode/src/hooks/rules-injector/finder.test.ts +381 -0
- package/oh-my-opencode/src/hooks/rules-injector/finder.ts +263 -0
- package/oh-my-opencode/src/hooks/rules-injector/index.ts +223 -0
- package/oh-my-opencode/src/hooks/rules-injector/matcher.ts +63 -0
- package/oh-my-opencode/src/hooks/rules-injector/parser.test.ts +226 -0
- package/oh-my-opencode/src/hooks/rules-injector/parser.ts +211 -0
- package/oh-my-opencode/src/hooks/rules-injector/storage.ts +59 -0
- package/oh-my-opencode/src/hooks/rules-injector/types.ts +57 -0
- package/oh-my-opencode/src/hooks/session-notification-utils.ts +140 -0
- package/oh-my-opencode/src/hooks/session-notification.test.ts +361 -0
- package/oh-my-opencode/src/hooks/session-notification.ts +330 -0
- package/oh-my-opencode/src/hooks/session-recovery/constants.ts +10 -0
- package/oh-my-opencode/src/hooks/session-recovery/index.test.ts +223 -0
- package/oh-my-opencode/src/hooks/session-recovery/index.ts +435 -0
- package/oh-my-opencode/src/hooks/session-recovery/storage.ts +390 -0
- package/oh-my-opencode/src/hooks/session-recovery/types.ts +98 -0
- package/oh-my-opencode/src/hooks/start-work/index.test.ts +402 -0
- package/oh-my-opencode/src/hooks/start-work/index.ts +242 -0
- package/oh-my-opencode/src/hooks/task-resume-info/index.ts +36 -0
- package/oh-my-opencode/src/hooks/think-mode/detector.ts +57 -0
- package/oh-my-opencode/src/hooks/think-mode/index.test.ts +353 -0
- package/oh-my-opencode/src/hooks/think-mode/index.ts +89 -0
- package/oh-my-opencode/src/hooks/think-mode/switcher.test.ts +461 -0
- package/oh-my-opencode/src/hooks/think-mode/switcher.ts +222 -0
- package/oh-my-opencode/src/hooks/think-mode/types.ts +21 -0
- package/oh-my-opencode/src/hooks/thinking-block-validator/index.ts +171 -0
- package/oh-my-opencode/src/hooks/todo-continuation-enforcer.test.ts +876 -0
- package/oh-my-opencode/src/hooks/todo-continuation-enforcer.ts +480 -0
- package/oh-my-opencode/src/hooks/tool-output-truncator.test.ts +168 -0
- package/oh-my-opencode/src/hooks/tool-output-truncator.ts +61 -0
- package/oh-my-opencode/src/index.ts +589 -0
- package/oh-my-opencode/src/mcp/AGENTS.md +70 -0
- package/oh-my-opencode/src/mcp/context7.ts +6 -0
- package/oh-my-opencode/src/mcp/grep-app.ts +6 -0
- package/oh-my-opencode/src/mcp/index.test.ts +86 -0
- package/oh-my-opencode/src/mcp/index.ts +32 -0
- package/oh-my-opencode/src/mcp/types.ts +9 -0
- package/oh-my-opencode/src/mcp/websearch.ts +10 -0
- package/oh-my-opencode/src/plugin-config.test.ts +119 -0
- package/oh-my-opencode/src/plugin-config.ts +135 -0
- package/oh-my-opencode/src/plugin-handlers/config-handler.test.ts +103 -0
- package/oh-my-opencode/src/plugin-handlers/config-handler.ts +399 -0
- package/oh-my-opencode/src/plugin-handlers/index.ts +1 -0
- package/oh-my-opencode/src/plugin-state.ts +30 -0
- package/oh-my-opencode/src/shared/AGENTS.md +63 -0
- package/oh-my-opencode/src/shared/agent-tool-restrictions.ts +44 -0
- package/oh-my-opencode/src/shared/agent-variant.test.ts +83 -0
- package/oh-my-opencode/src/shared/agent-variant.ts +40 -0
- package/oh-my-opencode/src/shared/claude-config-dir.test.ts +60 -0
- package/oh-my-opencode/src/shared/claude-config-dir.ts +11 -0
- package/oh-my-opencode/src/shared/command-executor.ts +225 -0
- package/oh-my-opencode/src/shared/config-errors.ts +18 -0
- package/oh-my-opencode/src/shared/config-path.ts +47 -0
- package/oh-my-opencode/src/shared/data-path.ts +22 -0
- package/oh-my-opencode/src/shared/deep-merge.test.ts +336 -0
- package/oh-my-opencode/src/shared/deep-merge.ts +53 -0
- package/oh-my-opencode/src/shared/dynamic-truncator.ts +193 -0
- package/oh-my-opencode/src/shared/external-plugin-detector.test.ts +133 -0
- package/oh-my-opencode/src/shared/external-plugin-detector.ts +132 -0
- package/oh-my-opencode/src/shared/file-reference-resolver.ts +85 -0
- package/oh-my-opencode/src/shared/file-utils.ts +40 -0
- package/oh-my-opencode/src/shared/first-message-variant.test.ts +32 -0
- package/oh-my-opencode/src/shared/first-message-variant.ts +28 -0
- package/oh-my-opencode/src/shared/frontmatter.test.ts +262 -0
- package/oh-my-opencode/src/shared/frontmatter.ts +31 -0
- package/oh-my-opencode/src/shared/hook-disabled.ts +22 -0
- package/oh-my-opencode/src/shared/index.ts +29 -0
- package/oh-my-opencode/src/shared/jsonc-parser.test.ts +266 -0
- package/oh-my-opencode/src/shared/jsonc-parser.ts +66 -0
- package/oh-my-opencode/src/shared/logger.ts +20 -0
- package/oh-my-opencode/src/shared/migration.test.ts +602 -0
- package/oh-my-opencode/src/shared/migration.ts +191 -0
- package/oh-my-opencode/src/shared/model-resolver.test.ts +101 -0
- package/oh-my-opencode/src/shared/model-resolver.ts +35 -0
- package/oh-my-opencode/src/shared/model-sanitizer.ts +12 -0
- package/oh-my-opencode/src/shared/opencode-config-dir.test.ts +318 -0
- package/oh-my-opencode/src/shared/opencode-config-dir.ts +142 -0
- package/oh-my-opencode/src/shared/opencode-version.test.ts +223 -0
- package/oh-my-opencode/src/shared/opencode-version.ts +72 -0
- package/oh-my-opencode/src/shared/pattern-matcher.ts +29 -0
- package/oh-my-opencode/src/shared/permission-compat.test.ts +134 -0
- package/oh-my-opencode/src/shared/permission-compat.ts +77 -0
- package/oh-my-opencode/src/shared/session-cursor.test.ts +66 -0
- package/oh-my-opencode/src/shared/session-cursor.ts +85 -0
- package/oh-my-opencode/src/shared/shell-env.test.ts +278 -0
- package/oh-my-opencode/src/shared/shell-env.ts +111 -0
- package/oh-my-opencode/src/shared/snake-case.ts +49 -0
- package/oh-my-opencode/src/shared/system-directive.ts +40 -0
- package/oh-my-opencode/src/shared/tool-name.ts +26 -0
- package/oh-my-opencode/src/shared/zip-extractor.ts +83 -0
- package/oh-my-opencode/src/tools/AGENTS.md +74 -0
- package/oh-my-opencode/src/tools/ast-grep/cli.ts +230 -0
- package/oh-my-opencode/src/tools/ast-grep/constants.ts +261 -0
- package/oh-my-opencode/src/tools/ast-grep/downloader.ts +128 -0
- package/oh-my-opencode/src/tools/ast-grep/index.ts +13 -0
- package/oh-my-opencode/src/tools/ast-grep/tools.ts +112 -0
- package/oh-my-opencode/src/tools/ast-grep/types.ts +61 -0
- package/oh-my-opencode/src/tools/ast-grep/utils.ts +102 -0
- package/oh-my-opencode/src/tools/background-task/constants.ts +7 -0
- package/oh-my-opencode/src/tools/background-task/index.ts +7 -0
- package/oh-my-opencode/src/tools/background-task/tools.ts +479 -0
- package/oh-my-opencode/src/tools/background-task/types.ts +16 -0
- package/oh-my-opencode/src/tools/call-omo-agent/constants.ts +7 -0
- package/oh-my-opencode/src/tools/call-omo-agent/index.ts +3 -0
- package/oh-my-opencode/src/tools/call-omo-agent/tools.ts +338 -0
- package/oh-my-opencode/src/tools/call-omo-agent/types.ts +27 -0
- package/oh-my-opencode/src/tools/delegate-task/constants.ts +205 -0
- package/oh-my-opencode/src/tools/delegate-task/index.ts +3 -0
- package/oh-my-opencode/src/tools/delegate-task/tools.test.ts +1575 -0
- package/oh-my-opencode/src/tools/delegate-task/tools.ts +885 -0
- package/oh-my-opencode/src/tools/delegate-task/types.ts +9 -0
- package/oh-my-opencode/src/tools/glob/cli.test.ts +158 -0
- package/oh-my-opencode/src/tools/glob/cli.ts +191 -0
- package/oh-my-opencode/src/tools/glob/constants.ts +12 -0
- package/oh-my-opencode/src/tools/glob/index.ts +3 -0
- package/oh-my-opencode/src/tools/glob/tools.ts +41 -0
- package/oh-my-opencode/src/tools/glob/types.ts +22 -0
- package/oh-my-opencode/src/tools/glob/utils.ts +26 -0
- package/oh-my-opencode/src/tools/grep/cli.ts +229 -0
- package/oh-my-opencode/src/tools/grep/constants.ts +127 -0
- package/oh-my-opencode/src/tools/grep/downloader.test.ts +103 -0
- package/oh-my-opencode/src/tools/grep/downloader.ts +145 -0
- package/oh-my-opencode/src/tools/grep/index.ts +3 -0
- package/oh-my-opencode/src/tools/grep/tools.ts +40 -0
- package/oh-my-opencode/src/tools/grep/types.ts +39 -0
- package/oh-my-opencode/src/tools/grep/utils.ts +53 -0
- package/oh-my-opencode/src/tools/index.ts +72 -0
- package/oh-my-opencode/src/tools/interactive-bash/constants.ts +18 -0
- package/oh-my-opencode/src/tools/interactive-bash/index.ts +4 -0
- package/oh-my-opencode/src/tools/interactive-bash/tools.ts +126 -0
- package/oh-my-opencode/src/tools/interactive-bash/utils.ts +71 -0
- package/oh-my-opencode/src/tools/look-at/constants.ts +3 -0
- package/oh-my-opencode/src/tools/look-at/index.ts +3 -0
- package/oh-my-opencode/src/tools/look-at/tools.test.ts +73 -0
- package/oh-my-opencode/src/tools/look-at/tools.ts +173 -0
- package/oh-my-opencode/src/tools/look-at/types.ts +4 -0
- package/oh-my-opencode/src/tools/lsp/client.ts +596 -0
- package/oh-my-opencode/src/tools/lsp/config.test.ts +130 -0
- package/oh-my-opencode/src/tools/lsp/config.ts +285 -0
- package/oh-my-opencode/src/tools/lsp/constants.ts +390 -0
- package/oh-my-opencode/src/tools/lsp/index.ts +7 -0
- package/oh-my-opencode/src/tools/lsp/tools.ts +261 -0
- package/oh-my-opencode/src/tools/lsp/types.ts +124 -0
- package/oh-my-opencode/src/tools/lsp/utils.ts +406 -0
- package/oh-my-opencode/src/tools/session-manager/constants.ts +97 -0
- package/oh-my-opencode/src/tools/session-manager/index.ts +3 -0
- package/oh-my-opencode/src/tools/session-manager/storage.test.ts +315 -0
- package/oh-my-opencode/src/tools/session-manager/storage.ts +238 -0
- package/oh-my-opencode/src/tools/session-manager/tools.test.ts +124 -0
- package/oh-my-opencode/src/tools/session-manager/tools.ts +146 -0
- package/oh-my-opencode/src/tools/session-manager/types.ts +99 -0
- package/oh-my-opencode/src/tools/session-manager/utils.test.ts +160 -0
- package/oh-my-opencode/src/tools/session-manager/utils.ts +199 -0
- package/oh-my-opencode/src/tools/skill/constants.ts +8 -0
- package/oh-my-opencode/src/tools/skill/index.ts +3 -0
- package/oh-my-opencode/src/tools/skill/tools.test.ts +239 -0
- package/oh-my-opencode/src/tools/skill/tools.ts +200 -0
- package/oh-my-opencode/src/tools/skill/types.ts +31 -0
- package/oh-my-opencode/src/tools/skill-mcp/constants.ts +3 -0
- package/oh-my-opencode/src/tools/skill-mcp/index.ts +3 -0
- package/oh-my-opencode/src/tools/skill-mcp/tools.test.ts +215 -0
- package/oh-my-opencode/src/tools/skill-mcp/tools.ts +172 -0
- package/oh-my-opencode/src/tools/skill-mcp/types.ts +8 -0
- package/oh-my-opencode/src/tools/slashcommand/index.ts +2 -0
- package/oh-my-opencode/src/tools/slashcommand/tools.ts +252 -0
- package/oh-my-opencode/src/tools/slashcommand/types.ts +28 -0
- package/oh-my-opencode/test-setup.ts +6 -0
- package/oh-my-opencode/tsconfig.json +20 -0
- package/package.json +1 -1
- package/src/__tests__/git.test.ts +7 -2
- package/src/__tests__/manifest.test.ts +5 -5
- package/src/agents/repo-explorer.ts +2 -1
- package/src/git.ts +18 -3
- package/src/manifest.ts +22 -15
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import type { AgentPromptMetadata, BuiltinAgentName } from "./types"
|
|
2
|
+
|
|
3
|
+
export interface AvailableAgent {
|
|
4
|
+
name: BuiltinAgentName
|
|
5
|
+
description: string
|
|
6
|
+
metadata: AgentPromptMetadata
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface AvailableTool {
|
|
10
|
+
name: string
|
|
11
|
+
category: "lsp" | "ast" | "search" | "session" | "command" | "other"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface AvailableSkill {
|
|
15
|
+
name: string
|
|
16
|
+
description: string
|
|
17
|
+
location: "user" | "project" | "plugin"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface AvailableCategory {
|
|
21
|
+
name: string
|
|
22
|
+
description: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function categorizeTools(toolNames: string[]): AvailableTool[] {
|
|
26
|
+
return toolNames.map((name) => {
|
|
27
|
+
let category: AvailableTool["category"] = "other"
|
|
28
|
+
if (name.startsWith("lsp_")) {
|
|
29
|
+
category = "lsp"
|
|
30
|
+
} else if (name.startsWith("ast_grep")) {
|
|
31
|
+
category = "ast"
|
|
32
|
+
} else if (name === "grep" || name === "glob") {
|
|
33
|
+
category = "search"
|
|
34
|
+
} else if (name.startsWith("session_")) {
|
|
35
|
+
category = "session"
|
|
36
|
+
} else if (name === "slashcommand") {
|
|
37
|
+
category = "command"
|
|
38
|
+
}
|
|
39
|
+
return { name, category }
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function formatToolsForPrompt(tools: AvailableTool[]): string {
|
|
44
|
+
const lspTools = tools.filter((t) => t.category === "lsp")
|
|
45
|
+
const astTools = tools.filter((t) => t.category === "ast")
|
|
46
|
+
const searchTools = tools.filter((t) => t.category === "search")
|
|
47
|
+
|
|
48
|
+
const parts: string[] = []
|
|
49
|
+
|
|
50
|
+
if (searchTools.length > 0) {
|
|
51
|
+
parts.push(...searchTools.map((t) => `\`${t.name}\``))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (lspTools.length > 0) {
|
|
55
|
+
parts.push("`lsp_*`")
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (astTools.length > 0) {
|
|
59
|
+
parts.push("`ast_grep`")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return parts.join(", ")
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function buildKeyTriggersSection(agents: AvailableAgent[], skills: AvailableSkill[] = []): string {
|
|
66
|
+
const keyTriggers = agents
|
|
67
|
+
.filter((a) => a.metadata.keyTrigger)
|
|
68
|
+
.map((a) => `- ${a.metadata.keyTrigger}`)
|
|
69
|
+
|
|
70
|
+
const skillTriggers = skills
|
|
71
|
+
.filter((s) => s.description)
|
|
72
|
+
.map((s) => `- **Skill \`${s.name}\`**: ${extractTriggerFromDescription(s.description)}`)
|
|
73
|
+
|
|
74
|
+
const allTriggers = [...keyTriggers, ...skillTriggers]
|
|
75
|
+
|
|
76
|
+
if (allTriggers.length === 0) return ""
|
|
77
|
+
|
|
78
|
+
return `### Key Triggers (check BEFORE classification):
|
|
79
|
+
|
|
80
|
+
**BLOCKING: Check skills FIRST before any action.**
|
|
81
|
+
If a skill matches, invoke it IMMEDIATELY via \`skill\` tool.
|
|
82
|
+
|
|
83
|
+
${allTriggers.join("\n")}
|
|
84
|
+
- **GitHub mention (@mention in issue/PR)** → This is a WORK REQUEST. Plan full cycle: investigate → implement → create PR
|
|
85
|
+
- **"Look into" + "create PR"** → Not just research. Full implementation cycle expected.`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function extractTriggerFromDescription(description: string): string {
|
|
89
|
+
const triggerMatch = description.match(/Trigger[s]?[:\s]+([^.]+)/i)
|
|
90
|
+
if (triggerMatch) return triggerMatch[1].trim()
|
|
91
|
+
|
|
92
|
+
const activateMatch = description.match(/Activate when[:\s]+([^.]+)/i)
|
|
93
|
+
if (activateMatch) return activateMatch[1].trim()
|
|
94
|
+
|
|
95
|
+
const useWhenMatch = description.match(/Use (?:this )?when[:\s]+([^.]+)/i)
|
|
96
|
+
if (useWhenMatch) return useWhenMatch[1].trim()
|
|
97
|
+
|
|
98
|
+
return description.split(".")[0] || description
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function buildToolSelectionTable(
|
|
102
|
+
agents: AvailableAgent[],
|
|
103
|
+
tools: AvailableTool[] = [],
|
|
104
|
+
skills: AvailableSkill[] = []
|
|
105
|
+
): string {
|
|
106
|
+
const rows: string[] = [
|
|
107
|
+
"### Tool & Skill Selection:",
|
|
108
|
+
"",
|
|
109
|
+
"**Priority Order**: Skills → Direct Tools → Agents",
|
|
110
|
+
"",
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
if (skills.length > 0) {
|
|
114
|
+
rows.push("#### Skills (INVOKE FIRST if matching)")
|
|
115
|
+
rows.push("")
|
|
116
|
+
rows.push("| Skill | When to Use |")
|
|
117
|
+
rows.push("|-------|-------------|")
|
|
118
|
+
for (const skill of skills) {
|
|
119
|
+
const shortDesc = extractTriggerFromDescription(skill.description)
|
|
120
|
+
rows.push(`| \`${skill.name}\` | ${shortDesc} |`)
|
|
121
|
+
}
|
|
122
|
+
rows.push("")
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
rows.push("#### Tools & Agents")
|
|
126
|
+
rows.push("")
|
|
127
|
+
rows.push("| Resource | Cost | When to Use |")
|
|
128
|
+
rows.push("|----------|------|-------------|")
|
|
129
|
+
|
|
130
|
+
if (tools.length > 0) {
|
|
131
|
+
const toolsDisplay = formatToolsForPrompt(tools)
|
|
132
|
+
rows.push(`| ${toolsDisplay} | FREE | Not Complex, Scope Clear, No Implicit Assumptions |`)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const costOrder = { FREE: 0, CHEAP: 1, EXPENSIVE: 2 }
|
|
136
|
+
const sortedAgents = [...agents]
|
|
137
|
+
.filter((a) => a.metadata.category !== "utility")
|
|
138
|
+
.sort((a, b) => costOrder[a.metadata.cost] - costOrder[b.metadata.cost])
|
|
139
|
+
|
|
140
|
+
for (const agent of sortedAgents) {
|
|
141
|
+
const shortDesc = agent.description.split(".")[0] || agent.description
|
|
142
|
+
rows.push(`| \`${agent.name}\` agent | ${agent.metadata.cost} | ${shortDesc} |`)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
rows.push("")
|
|
146
|
+
rows.push("**Default flow**: skill (if match) → explore/librarian (background) + tools → oracle (if required)")
|
|
147
|
+
|
|
148
|
+
return rows.join("\n")
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function buildExploreSection(agents: AvailableAgent[]): string {
|
|
152
|
+
const exploreAgent = agents.find((a) => a.name === "explore")
|
|
153
|
+
if (!exploreAgent) return ""
|
|
154
|
+
|
|
155
|
+
const useWhen = exploreAgent.metadata.useWhen || []
|
|
156
|
+
const avoidWhen = exploreAgent.metadata.avoidWhen || []
|
|
157
|
+
|
|
158
|
+
return `### Explore Agent = Contextual Grep
|
|
159
|
+
|
|
160
|
+
Use it as a **peer tool**, not a fallback. Fire liberally.
|
|
161
|
+
|
|
162
|
+
| Use Direct Tools | Use Explore Agent |
|
|
163
|
+
|------------------|-------------------|
|
|
164
|
+
${avoidWhen.map((w) => `| ${w} | |`).join("\n")}
|
|
165
|
+
${useWhen.map((w) => `| | ${w} |`).join("\n")}`
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function buildLibrarianSection(agents: AvailableAgent[]): string {
|
|
169
|
+
const librarianAgent = agents.find((a) => a.name === "librarian")
|
|
170
|
+
if (!librarianAgent) return ""
|
|
171
|
+
|
|
172
|
+
const useWhen = librarianAgent.metadata.useWhen || []
|
|
173
|
+
|
|
174
|
+
return `### Librarian Agent = Reference Grep
|
|
175
|
+
|
|
176
|
+
Search **external references** (docs, OSS, web). Fire proactively when unfamiliar libraries are involved.
|
|
177
|
+
|
|
178
|
+
| Contextual Grep (Internal) | Reference Grep (External) |
|
|
179
|
+
|----------------------------|---------------------------|
|
|
180
|
+
| Search OUR codebase | Search EXTERNAL resources |
|
|
181
|
+
| Find patterns in THIS repo | Find examples in OTHER repos |
|
|
182
|
+
| How does our code work? | How does this library work? |
|
|
183
|
+
| Project-specific logic | Official API documentation |
|
|
184
|
+
| | Library best practices & quirks |
|
|
185
|
+
| | OSS implementation examples |
|
|
186
|
+
|
|
187
|
+
**Trigger phrases** (fire librarian immediately):
|
|
188
|
+
${useWhen.map((w) => `- "${w}"`).join("\n")}`
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function buildDelegationTable(agents: AvailableAgent[]): string {
|
|
192
|
+
const rows: string[] = [
|
|
193
|
+
"### Delegation Table:",
|
|
194
|
+
"",
|
|
195
|
+
"| Domain | Delegate To | Trigger |",
|
|
196
|
+
"|--------|-------------|---------|",
|
|
197
|
+
]
|
|
198
|
+
|
|
199
|
+
for (const agent of agents) {
|
|
200
|
+
for (const trigger of agent.metadata.triggers) {
|
|
201
|
+
rows.push(`| ${trigger.domain} | \`${agent.name}\` | ${trigger.trigger} |`)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return rows.join("\n")
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export function buildCategorySkillsDelegationGuide(categories: AvailableCategory[], skills: AvailableSkill[]): string {
|
|
209
|
+
if (categories.length === 0 && skills.length === 0) return ""
|
|
210
|
+
|
|
211
|
+
const categoryRows = categories.map((c) => {
|
|
212
|
+
const desc = c.description || c.name
|
|
213
|
+
return `| \`${c.name}\` | ${desc} |`
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
const skillRows = skills.map((s) => {
|
|
217
|
+
const desc = s.description.split(".")[0] || s.description
|
|
218
|
+
return `| \`${s.name}\` | ${desc} |`
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
return `### Category + Skills Delegation System
|
|
222
|
+
|
|
223
|
+
**delegate_task() combines categories and skills for optimal task execution.**
|
|
224
|
+
|
|
225
|
+
#### Available Categories (Domain-Optimized Models)
|
|
226
|
+
|
|
227
|
+
Each category is configured with a model optimized for that domain. Read the description to understand when to use it.
|
|
228
|
+
|
|
229
|
+
| Category | Domain / Best For |
|
|
230
|
+
|----------|-------------------|
|
|
231
|
+
${categoryRows.join("\n")}
|
|
232
|
+
|
|
233
|
+
#### Available Skills (Domain Expertise Injection)
|
|
234
|
+
|
|
235
|
+
Skills inject specialized instructions into the subagent. Read the description to understand when each skill applies.
|
|
236
|
+
|
|
237
|
+
| Skill | Expertise Domain |
|
|
238
|
+
|-------|------------------|
|
|
239
|
+
${skillRows.join("\n")}
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
### MANDATORY: Category + Skill Selection Protocol
|
|
244
|
+
|
|
245
|
+
**STEP 1: Select Category**
|
|
246
|
+
- Read each category's description
|
|
247
|
+
- Match task requirements to category domain
|
|
248
|
+
- Select the category whose domain BEST fits the task
|
|
249
|
+
|
|
250
|
+
**STEP 2: Evaluate ALL Skills**
|
|
251
|
+
For EVERY skill listed above, ask yourself:
|
|
252
|
+
> "Does this skill's expertise domain overlap with my task?"
|
|
253
|
+
|
|
254
|
+
- If YES → INCLUDE in \`skills=[...]\`
|
|
255
|
+
- If NO → You MUST justify why (see below)
|
|
256
|
+
|
|
257
|
+
**STEP 3: Justify Omissions**
|
|
258
|
+
|
|
259
|
+
If you choose NOT to include a skill that MIGHT be relevant, you MUST provide:
|
|
260
|
+
|
|
261
|
+
\`\`\`
|
|
262
|
+
SKILL EVALUATION for "[skill-name]":
|
|
263
|
+
- Skill domain: [what the skill description says]
|
|
264
|
+
- Task domain: [what your task is about]
|
|
265
|
+
- Decision: OMIT
|
|
266
|
+
- Reason: [specific explanation of why domains don't overlap]
|
|
267
|
+
\`\`\`
|
|
268
|
+
|
|
269
|
+
**WHY JUSTIFICATION IS MANDATORY:**
|
|
270
|
+
- Forces you to actually READ skill descriptions
|
|
271
|
+
- Prevents lazy omission of potentially useful skills
|
|
272
|
+
- Subagents are STATELESS - they only know what you tell them
|
|
273
|
+
- Missing a relevant skill = suboptimal output
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
### Delegation Pattern
|
|
278
|
+
|
|
279
|
+
\`\`\`typescript
|
|
280
|
+
delegate_task(
|
|
281
|
+
category="[selected-category]",
|
|
282
|
+
skills=["skill-1", "skill-2"], // Include ALL relevant skills
|
|
283
|
+
prompt="..."
|
|
284
|
+
)
|
|
285
|
+
\`\`\`
|
|
286
|
+
|
|
287
|
+
**ANTI-PATTERN (will produce poor results):**
|
|
288
|
+
\`\`\`typescript
|
|
289
|
+
delegate_task(category="...", skills=[], prompt="...") // Empty skills without justification
|
|
290
|
+
\`\`\``
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export function buildOracleSection(agents: AvailableAgent[]): string {
|
|
294
|
+
const oracleAgent = agents.find((a) => a.name === "oracle")
|
|
295
|
+
if (!oracleAgent) return ""
|
|
296
|
+
|
|
297
|
+
const useWhen = oracleAgent.metadata.useWhen || []
|
|
298
|
+
const avoidWhen = oracleAgent.metadata.avoidWhen || []
|
|
299
|
+
|
|
300
|
+
return `<Oracle_Usage>
|
|
301
|
+
## Oracle — Read-Only High-IQ Consultant
|
|
302
|
+
|
|
303
|
+
Oracle is a read-only, expensive, high-quality reasoning model for debugging and architecture. Consultation only.
|
|
304
|
+
|
|
305
|
+
### WHEN to Consult:
|
|
306
|
+
|
|
307
|
+
| Trigger | Action |
|
|
308
|
+
|---------|--------|
|
|
309
|
+
${useWhen.map((w) => `| ${w} | Oracle FIRST, then implement |`).join("\n")}
|
|
310
|
+
|
|
311
|
+
### WHEN NOT to Consult:
|
|
312
|
+
|
|
313
|
+
${avoidWhen.map((w) => `- ${w}`).join("\n")}
|
|
314
|
+
|
|
315
|
+
### Usage Pattern:
|
|
316
|
+
Briefly announce "Consulting Oracle for [reason]" before invocation.
|
|
317
|
+
|
|
318
|
+
**Exception**: This is the ONLY case where you announce before acting. For all other work, start immediately without status updates.
|
|
319
|
+
</Oracle_Usage>`
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
export function buildHardBlocksSection(): string {
|
|
323
|
+
const blocks = [
|
|
324
|
+
"| Type error suppression (`as any`, `@ts-ignore`) | Never |",
|
|
325
|
+
"| Commit without explicit request | Never |",
|
|
326
|
+
"| Speculate about unread code | Never |",
|
|
327
|
+
"| Leave code in broken state after failures | Never |",
|
|
328
|
+
"| Delegate without evaluating available skills | Never - MUST justify skill omissions |",
|
|
329
|
+
]
|
|
330
|
+
|
|
331
|
+
return `## Hard Blocks (NEVER violate)
|
|
332
|
+
|
|
333
|
+
| Constraint | No Exceptions |
|
|
334
|
+
|------------|---------------|
|
|
335
|
+
${blocks.join("\n")}`
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export function buildAntiPatternsSection(): string {
|
|
339
|
+
const patterns = [
|
|
340
|
+
"| **Type Safety** | `as any`, `@ts-ignore`, `@ts-expect-error` |",
|
|
341
|
+
"| **Error Handling** | Empty catch blocks `catch(e) {}` |",
|
|
342
|
+
"| **Testing** | Deleting failing tests to \"pass\" |",
|
|
343
|
+
"| **Search** | Firing agents for single-line typos or obvious syntax errors |",
|
|
344
|
+
"| **Delegation** | Using `skills=[]` without justifying why no skills apply |",
|
|
345
|
+
"| **Debugging** | Shotgun debugging, random changes |",
|
|
346
|
+
]
|
|
347
|
+
|
|
348
|
+
return `## Anti-Patterns (BLOCKING violations)
|
|
349
|
+
|
|
350
|
+
| Category | Forbidden |
|
|
351
|
+
|----------|-----------|
|
|
352
|
+
${patterns.join("\n")}`
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export function buildUltraworkSection(
|
|
356
|
+
agents: AvailableAgent[],
|
|
357
|
+
categories: AvailableCategory[],
|
|
358
|
+
skills: AvailableSkill[]
|
|
359
|
+
): string {
|
|
360
|
+
const lines: string[] = []
|
|
361
|
+
|
|
362
|
+
if (categories.length > 0) {
|
|
363
|
+
lines.push("**Categories** (for implementation tasks):")
|
|
364
|
+
for (const cat of categories) {
|
|
365
|
+
const shortDesc = cat.description || cat.name
|
|
366
|
+
lines.push(`- \`${cat.name}\`: ${shortDesc}`)
|
|
367
|
+
}
|
|
368
|
+
lines.push("")
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (skills.length > 0) {
|
|
372
|
+
lines.push("**Skills** (combine with categories - EVALUATE ALL for relevance):")
|
|
373
|
+
for (const skill of skills) {
|
|
374
|
+
const shortDesc = skill.description.split(".")[0] || skill.description
|
|
375
|
+
lines.push(`- \`${skill.name}\`: ${shortDesc}`)
|
|
376
|
+
}
|
|
377
|
+
lines.push("")
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if (agents.length > 0) {
|
|
381
|
+
const ultraworkAgentPriority = ["explore", "librarian", "plan", "oracle"]
|
|
382
|
+
const sortedAgents = [...agents].sort((a, b) => {
|
|
383
|
+
const aIdx = ultraworkAgentPriority.indexOf(a.name)
|
|
384
|
+
const bIdx = ultraworkAgentPriority.indexOf(b.name)
|
|
385
|
+
if (aIdx === -1 && bIdx === -1) return 0
|
|
386
|
+
if (aIdx === -1) return 1
|
|
387
|
+
if (bIdx === -1) return -1
|
|
388
|
+
return aIdx - bIdx
|
|
389
|
+
})
|
|
390
|
+
|
|
391
|
+
lines.push("**Agents** (for specialized consultation/exploration):")
|
|
392
|
+
for (const agent of sortedAgents) {
|
|
393
|
+
const shortDesc = agent.description.split(".")[0] || agent.description
|
|
394
|
+
const suffix = agent.name === "explore" || agent.name === "librarian" ? " (multiple)" : ""
|
|
395
|
+
lines.push(`- \`${agent.name}${suffix}\`: ${shortDesc}`)
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return lines.join("\n")
|
|
400
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { AgentConfig } from "@opencode-ai/sdk"
|
|
2
|
+
import type { AgentPromptMetadata } from "./types"
|
|
3
|
+
import { createAgentToolRestrictions } from "../shared/permission-compat"
|
|
4
|
+
|
|
5
|
+
export const EXPLORE_PROMPT_METADATA: AgentPromptMetadata = {
|
|
6
|
+
category: "exploration",
|
|
7
|
+
cost: "FREE",
|
|
8
|
+
promptAlias: "Explore",
|
|
9
|
+
keyTrigger: "2+ modules involved → fire `explore` background",
|
|
10
|
+
triggers: [
|
|
11
|
+
{ domain: "Explore", trigger: "Find existing codebase structure, patterns and styles" },
|
|
12
|
+
],
|
|
13
|
+
useWhen: [
|
|
14
|
+
"Multiple search angles needed",
|
|
15
|
+
"Unfamiliar module structure",
|
|
16
|
+
"Cross-layer pattern discovery",
|
|
17
|
+
],
|
|
18
|
+
avoidWhen: [
|
|
19
|
+
"You know exactly what to search",
|
|
20
|
+
"Single keyword/pattern suffices",
|
|
21
|
+
"Known file location",
|
|
22
|
+
],
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function createExploreAgent(model: string): AgentConfig {
|
|
26
|
+
const restrictions = createAgentToolRestrictions([
|
|
27
|
+
"write",
|
|
28
|
+
"edit",
|
|
29
|
+
"task",
|
|
30
|
+
"delegate_task",
|
|
31
|
+
"call_omo_agent",
|
|
32
|
+
])
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
description:
|
|
36
|
+
'Contextual grep for codebases. Answers "Where is X?", "Which file has Y?", "Find the code that does Z". Fire multiple in parallel for broad searches. Specify thoroughness: "quick" for basic, "medium" for moderate, "very thorough" for comprehensive analysis.',
|
|
37
|
+
mode: "subagent" as const,
|
|
38
|
+
model,
|
|
39
|
+
temperature: 0.1,
|
|
40
|
+
...restrictions,
|
|
41
|
+
prompt: `You are a codebase search specialist. Your job: find files and code, return actionable results.
|
|
42
|
+
|
|
43
|
+
## Your Mission
|
|
44
|
+
|
|
45
|
+
Answer questions like:
|
|
46
|
+
- "Where is X implemented?"
|
|
47
|
+
- "Which files contain Y?"
|
|
48
|
+
- "Find the code that does Z"
|
|
49
|
+
|
|
50
|
+
## CRITICAL: What You Must Deliver
|
|
51
|
+
|
|
52
|
+
Every response MUST include:
|
|
53
|
+
|
|
54
|
+
### 1. Intent Analysis (Required)
|
|
55
|
+
Before ANY search, wrap your analysis in <analysis> tags:
|
|
56
|
+
|
|
57
|
+
<analysis>
|
|
58
|
+
**Literal Request**: [What they literally asked]
|
|
59
|
+
**Actual Need**: [What they're really trying to accomplish]
|
|
60
|
+
**Success Looks Like**: [What result would let them proceed immediately]
|
|
61
|
+
</analysis>
|
|
62
|
+
|
|
63
|
+
### 2. Parallel Execution (Required)
|
|
64
|
+
Launch **3+ tools simultaneously** in your first action. Never sequential unless output depends on prior result.
|
|
65
|
+
|
|
66
|
+
### 3. Structured Results (Required)
|
|
67
|
+
Always end with this exact format:
|
|
68
|
+
|
|
69
|
+
<results>
|
|
70
|
+
<files>
|
|
71
|
+
- /absolute/path/to/file1.ts — [why this file is relevant]
|
|
72
|
+
- /absolute/path/to/file2.ts — [why this file is relevant]
|
|
73
|
+
</files>
|
|
74
|
+
|
|
75
|
+
<answer>
|
|
76
|
+
[Direct answer to their actual need, not just file list]
|
|
77
|
+
[If they asked "where is auth?", explain the auth flow you found]
|
|
78
|
+
</answer>
|
|
79
|
+
|
|
80
|
+
<next_steps>
|
|
81
|
+
[What they should do with this information]
|
|
82
|
+
[Or: "Ready to proceed - no follow-up needed"]
|
|
83
|
+
</next_steps>
|
|
84
|
+
</results>
|
|
85
|
+
|
|
86
|
+
## Success Criteria
|
|
87
|
+
|
|
88
|
+
| Criterion | Requirement |
|
|
89
|
+
|-----------|-------------|
|
|
90
|
+
| **Paths** | ALL paths must be **absolute** (start with /) |
|
|
91
|
+
| **Completeness** | Find ALL relevant matches, not just the first one |
|
|
92
|
+
| **Actionability** | Caller can proceed **without asking follow-up questions** |
|
|
93
|
+
| **Intent** | Address their **actual need**, not just literal request |
|
|
94
|
+
|
|
95
|
+
## Failure Conditions
|
|
96
|
+
|
|
97
|
+
Your response has **FAILED** if:
|
|
98
|
+
- Any path is relative (not absolute)
|
|
99
|
+
- You missed obvious matches in the codebase
|
|
100
|
+
- Caller needs to ask "but where exactly?" or "what about X?"
|
|
101
|
+
- You only answered the literal question, not the underlying need
|
|
102
|
+
- No <results> block with structured output
|
|
103
|
+
|
|
104
|
+
## Constraints
|
|
105
|
+
|
|
106
|
+
- **Read-only**: You cannot create, modify, or delete files
|
|
107
|
+
- **No emojis**: Keep output clean and parseable
|
|
108
|
+
- **No file creation**: Report findings as message text, never write files
|
|
109
|
+
|
|
110
|
+
## Tool Strategy
|
|
111
|
+
|
|
112
|
+
Use the right tool for the job:
|
|
113
|
+
- **Semantic search** (definitions, references): LSP tools
|
|
114
|
+
- **Structural patterns** (function shapes, class structures): ast_grep_search
|
|
115
|
+
- **Text patterns** (strings, comments, logs): grep
|
|
116
|
+
- **File patterns** (find by name/extension): glob
|
|
117
|
+
- **History/evolution** (when added, who changed): git commands
|
|
118
|
+
|
|
119
|
+
Flood with parallel calls. Cross-validate findings across multiple tools.`,
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from "./types"
|
|
2
|
+
export { createBuiltinAgents } from "./utils"
|
|
3
|
+
export type { AvailableAgent, AvailableCategory, AvailableSkill } from "./dynamic-agent-prompt-builder"
|
|
4
|
+
export { createSisyphusAgent } from "./sisyphus"
|
|
5
|
+
export { createOracleAgent, ORACLE_PROMPT_METADATA } from "./oracle"
|
|
6
|
+
export { createLibrarianAgent, LIBRARIAN_PROMPT_METADATA } from "./librarian"
|
|
7
|
+
export { createExploreAgent, EXPLORE_PROMPT_METADATA } from "./explore"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export { createMultimodalLookerAgent, MULTIMODAL_LOOKER_PROMPT_METADATA } from "./multimodal-looker"
|
|
11
|
+
export { createMetisAgent, METIS_SYSTEM_PROMPT, metisPromptMetadata } from "./metis"
|
|
12
|
+
export { createMomusAgent, MOMUS_SYSTEM_PROMPT, momusPromptMetadata } from "./momus"
|
|
13
|
+
export { createAtlasAgent, atlasPromptMetadata } from "./atlas"
|