opencode-repos 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +10 -6
- package/package.json +1 -1
- package/src/__tests__/git.test.ts +33 -2
- package/src/git.ts +32 -5
- package/.sisyphus/boulder.json +0 -8
- package/.sisyphus/notepads/opencode-repos/decisions.md +0 -15
- package/.sisyphus/notepads/opencode-repos/learnings.md +0 -384
- package/.sisyphus/plans/opencode-repos.md +0 -987
- package/.tmux-sessionizer +0 -8
- package/TODO.md +0 -3
- package/oh-my-opencode/.github/FUNDING.yml +0 -15
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/bug_report.yml +0 -129
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/feature_request.yml +0 -100
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/general.yml +0 -83
- 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 +0 -34
- package/oh-my-opencode/.github/workflows/ci.yml +0 -138
- package/oh-my-opencode/.github/workflows/cla.yml +0 -41
- package/oh-my-opencode/.github/workflows/lint-workflows.yml +0 -22
- package/oh-my-opencode/.github/workflows/publish.yml +0 -165
- package/oh-my-opencode/.github/workflows/sisyphus-agent.yml +0 -500
- package/oh-my-opencode/.opencode/background-tasks.json +0 -27
- package/oh-my-opencode/.opencode/command/get-unpublished-changes.md +0 -84
- package/oh-my-opencode/.opencode/command/omomomo.md +0 -37
- package/oh-my-opencode/.opencode/command/publish.md +0 -257
- package/oh-my-opencode/AGENTS.md +0 -179
- package/oh-my-opencode/CLA.md +0 -58
- package/oh-my-opencode/CONTRIBUTING.md +0 -268
- package/oh-my-opencode/LICENSE.md +0 -82
- package/oh-my-opencode/README.ja.md +0 -370
- package/oh-my-opencode/README.md +0 -376
- package/oh-my-opencode/README.zh-cn.md +0 -380
- package/oh-my-opencode/assets/oh-my-opencode.schema.json +0 -2171
- package/oh-my-opencode/bin/oh-my-opencode.js +0 -80
- package/oh-my-opencode/bin/platform.js +0 -38
- package/oh-my-opencode/bin/platform.test.ts +0 -148
- package/oh-my-opencode/bun.lock +0 -314
- package/oh-my-opencode/bunfig.toml +0 -2
- package/oh-my-opencode/docs/category-skill-guide.md +0 -200
- package/oh-my-opencode/docs/cli-guide.md +0 -272
- package/oh-my-opencode/docs/configurations.md +0 -654
- package/oh-my-opencode/docs/features.md +0 -550
- package/oh-my-opencode/docs/guide/installation.md +0 -288
- package/oh-my-opencode/docs/guide/overview.md +0 -97
- package/oh-my-opencode/docs/guide/understanding-orchestration-system.md +0 -445
- package/oh-my-opencode/docs/orchestration-guide.md +0 -152
- package/oh-my-opencode/docs/ultrawork-manifesto.md +0 -197
- package/oh-my-opencode/package.json +0 -89
- package/oh-my-opencode/packages/darwin-arm64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/darwin-arm64/package.json +0 -22
- package/oh-my-opencode/packages/darwin-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/darwin-x64/package.json +0 -22
- package/oh-my-opencode/packages/linux-arm64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-arm64/package.json +0 -25
- package/oh-my-opencode/packages/linux-arm64-musl/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-arm64-musl/package.json +0 -25
- package/oh-my-opencode/packages/linux-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-x64/package.json +0 -25
- package/oh-my-opencode/packages/linux-x64-musl/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-x64-musl/package.json +0 -25
- package/oh-my-opencode/packages/windows-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/windows-x64/package.json +0 -22
- package/oh-my-opencode/postinstall.mjs +0 -43
- package/oh-my-opencode/script/build-binaries.ts +0 -103
- package/oh-my-opencode/script/build-schema.ts +0 -28
- package/oh-my-opencode/script/generate-changelog.ts +0 -92
- package/oh-my-opencode/script/publish.ts +0 -344
- package/oh-my-opencode/signatures/cla.json +0 -676
- package/oh-my-opencode/src/agents/AGENTS.md +0 -67
- package/oh-my-opencode/src/agents/atlas.ts +0 -1383
- package/oh-my-opencode/src/agents/dynamic-agent-prompt-builder.ts +0 -400
- package/oh-my-opencode/src/agents/explore.ts +0 -122
- package/oh-my-opencode/src/agents/index.ts +0 -13
- package/oh-my-opencode/src/agents/librarian.ts +0 -326
- package/oh-my-opencode/src/agents/metis.ts +0 -315
- package/oh-my-opencode/src/agents/momus.test.ts +0 -57
- package/oh-my-opencode/src/agents/momus.ts +0 -444
- package/oh-my-opencode/src/agents/multimodal-looker.ts +0 -56
- package/oh-my-opencode/src/agents/oracle.ts +0 -122
- package/oh-my-opencode/src/agents/prometheus-prompt.test.ts +0 -22
- package/oh-my-opencode/src/agents/prometheus-prompt.ts +0 -1196
- package/oh-my-opencode/src/agents/sisyphus-junior.test.ts +0 -232
- package/oh-my-opencode/src/agents/sisyphus-junior.ts +0 -134
- package/oh-my-opencode/src/agents/sisyphus.ts +0 -633
- package/oh-my-opencode/src/agents/types.ts +0 -80
- package/oh-my-opencode/src/agents/utils.test.ts +0 -311
- package/oh-my-opencode/src/agents/utils.ts +0 -240
- package/oh-my-opencode/src/cli/AGENTS.md +0 -91
- package/oh-my-opencode/src/cli/config-manager.test.ts +0 -364
- package/oh-my-opencode/src/cli/config-manager.ts +0 -641
- package/oh-my-opencode/src/cli/doctor/checks/auth.test.ts +0 -114
- package/oh-my-opencode/src/cli/doctor/checks/auth.ts +0 -115
- package/oh-my-opencode/src/cli/doctor/checks/config.test.ts +0 -103
- package/oh-my-opencode/src/cli/doctor/checks/config.ts +0 -123
- package/oh-my-opencode/src/cli/doctor/checks/dependencies.test.ts +0 -152
- package/oh-my-opencode/src/cli/doctor/checks/dependencies.ts +0 -163
- package/oh-my-opencode/src/cli/doctor/checks/gh.test.ts +0 -151
- package/oh-my-opencode/src/cli/doctor/checks/gh.ts +0 -171
- package/oh-my-opencode/src/cli/doctor/checks/index.ts +0 -34
- package/oh-my-opencode/src/cli/doctor/checks/lsp.test.ts +0 -134
- package/oh-my-opencode/src/cli/doctor/checks/lsp.ts +0 -77
- package/oh-my-opencode/src/cli/doctor/checks/mcp.test.ts +0 -115
- package/oh-my-opencode/src/cli/doctor/checks/mcp.ts +0 -128
- package/oh-my-opencode/src/cli/doctor/checks/opencode.test.ts +0 -227
- package/oh-my-opencode/src/cli/doctor/checks/opencode.ts +0 -178
- package/oh-my-opencode/src/cli/doctor/checks/plugin.test.ts +0 -109
- package/oh-my-opencode/src/cli/doctor/checks/plugin.ts +0 -124
- package/oh-my-opencode/src/cli/doctor/checks/version.test.ts +0 -148
- package/oh-my-opencode/src/cli/doctor/checks/version.ts +0 -135
- package/oh-my-opencode/src/cli/doctor/constants.ts +0 -72
- package/oh-my-opencode/src/cli/doctor/formatter.test.ts +0 -218
- package/oh-my-opencode/src/cli/doctor/formatter.ts +0 -140
- package/oh-my-opencode/src/cli/doctor/index.ts +0 -11
- package/oh-my-opencode/src/cli/doctor/runner.test.ts +0 -153
- package/oh-my-opencode/src/cli/doctor/runner.ts +0 -132
- package/oh-my-opencode/src/cli/doctor/types.ts +0 -113
- package/oh-my-opencode/src/cli/get-local-version/formatter.ts +0 -66
- package/oh-my-opencode/src/cli/get-local-version/index.ts +0 -106
- package/oh-my-opencode/src/cli/get-local-version/types.ts +0 -14
- package/oh-my-opencode/src/cli/index.ts +0 -153
- package/oh-my-opencode/src/cli/install.ts +0 -523
- package/oh-my-opencode/src/cli/model-fallback.ts +0 -246
- package/oh-my-opencode/src/cli/run/completion.test.ts +0 -170
- package/oh-my-opencode/src/cli/run/completion.ts +0 -79
- package/oh-my-opencode/src/cli/run/events.test.ts +0 -155
- package/oh-my-opencode/src/cli/run/events.ts +0 -325
- package/oh-my-opencode/src/cli/run/index.ts +0 -2
- package/oh-my-opencode/src/cli/run/runner.ts +0 -159
- package/oh-my-opencode/src/cli/run/types.ts +0 -76
- package/oh-my-opencode/src/cli/types.ts +0 -40
- package/oh-my-opencode/src/config/index.ts +0 -26
- package/oh-my-opencode/src/config/schema.test.ts +0 -444
- package/oh-my-opencode/src/config/schema.ts +0 -339
- package/oh-my-opencode/src/features/AGENTS.md +0 -77
- package/oh-my-opencode/src/features/background-agent/concurrency.test.ts +0 -418
- package/oh-my-opencode/src/features/background-agent/concurrency.ts +0 -137
- package/oh-my-opencode/src/features/background-agent/index.ts +0 -3
- package/oh-my-opencode/src/features/background-agent/manager.test.ts +0 -1928
- package/oh-my-opencode/src/features/background-agent/manager.ts +0 -1335
- package/oh-my-opencode/src/features/background-agent/types.ts +0 -66
- package/oh-my-opencode/src/features/boulder-state/constants.ts +0 -13
- package/oh-my-opencode/src/features/boulder-state/index.ts +0 -3
- package/oh-my-opencode/src/features/boulder-state/storage.test.ts +0 -250
- package/oh-my-opencode/src/features/boulder-state/storage.ts +0 -150
- package/oh-my-opencode/src/features/boulder-state/types.ts +0 -26
- package/oh-my-opencode/src/features/builtin-commands/commands.ts +0 -89
- package/oh-my-opencode/src/features/builtin-commands/index.ts +0 -2
- package/oh-my-opencode/src/features/builtin-commands/templates/init-deep.ts +0 -300
- package/oh-my-opencode/src/features/builtin-commands/templates/ralph-loop.ts +0 -38
- package/oh-my-opencode/src/features/builtin-commands/templates/refactor.ts +0 -619
- package/oh-my-opencode/src/features/builtin-commands/templates/start-work.ts +0 -72
- package/oh-my-opencode/src/features/builtin-commands/types.ts +0 -9
- package/oh-my-opencode/src/features/builtin-skills/frontend-ui-ux/SKILL.md +0 -78
- package/oh-my-opencode/src/features/builtin-skills/git-master/SKILL.md +0 -1105
- package/oh-my-opencode/src/features/builtin-skills/index.ts +0 -2
- package/oh-my-opencode/src/features/builtin-skills/skills.ts +0 -1203
- package/oh-my-opencode/src/features/builtin-skills/types.ts +0 -16
- package/oh-my-opencode/src/features/claude-code-agent-loader/index.ts +0 -2
- package/oh-my-opencode/src/features/claude-code-agent-loader/loader.ts +0 -90
- package/oh-my-opencode/src/features/claude-code-agent-loader/types.ts +0 -17
- package/oh-my-opencode/src/features/claude-code-command-loader/index.ts +0 -2
- package/oh-my-opencode/src/features/claude-code-command-loader/loader.ts +0 -144
- package/oh-my-opencode/src/features/claude-code-command-loader/types.ts +0 -46
- package/oh-my-opencode/src/features/claude-code-mcp-loader/env-expander.ts +0 -27
- package/oh-my-opencode/src/features/claude-code-mcp-loader/index.ts +0 -11
- package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.test.ts +0 -162
- package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.ts +0 -113
- package/oh-my-opencode/src/features/claude-code-mcp-loader/transformer.ts +0 -53
- package/oh-my-opencode/src/features/claude-code-mcp-loader/types.ts +0 -42
- package/oh-my-opencode/src/features/claude-code-plugin-loader/index.ts +0 -3
- package/oh-my-opencode/src/features/claude-code-plugin-loader/loader.ts +0 -486
- package/oh-my-opencode/src/features/claude-code-plugin-loader/types.ts +0 -210
- package/oh-my-opencode/src/features/claude-code-session-state/index.ts +0 -1
- package/oh-my-opencode/src/features/claude-code-session-state/state.test.ts +0 -126
- package/oh-my-opencode/src/features/claude-code-session-state/state.ts +0 -37
- package/oh-my-opencode/src/features/context-injector/collector.test.ts +0 -330
- package/oh-my-opencode/src/features/context-injector/collector.ts +0 -85
- package/oh-my-opencode/src/features/context-injector/index.ts +0 -14
- package/oh-my-opencode/src/features/context-injector/injector.test.ts +0 -122
- package/oh-my-opencode/src/features/context-injector/injector.ts +0 -167
- package/oh-my-opencode/src/features/context-injector/types.ts +0 -91
- package/oh-my-opencode/src/features/hook-message-injector/constants.ts +0 -6
- package/oh-my-opencode/src/features/hook-message-injector/index.ts +0 -4
- package/oh-my-opencode/src/features/hook-message-injector/injector.ts +0 -195
- package/oh-my-opencode/src/features/hook-message-injector/types.ts +0 -47
- package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.test.ts +0 -448
- package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.ts +0 -180
- package/oh-my-opencode/src/features/opencode-skill-loader/blocking.test.ts +0 -210
- package/oh-my-opencode/src/features/opencode-skill-loader/blocking.ts +0 -62
- package/oh-my-opencode/src/features/opencode-skill-loader/discover-worker.ts +0 -59
- package/oh-my-opencode/src/features/opencode-skill-loader/index.ts +0 -4
- package/oh-my-opencode/src/features/opencode-skill-loader/loader.test.ts +0 -273
- package/oh-my-opencode/src/features/opencode-skill-loader/loader.ts +0 -259
- package/oh-my-opencode/src/features/opencode-skill-loader/merger.ts +0 -267
- package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.test.ts +0 -267
- package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.ts +0 -206
- package/oh-my-opencode/src/features/opencode-skill-loader/types.ts +0 -38
- package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.test.ts +0 -201
- package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.ts +0 -27
- package/oh-my-opencode/src/features/skill-mcp-manager/index.ts +0 -2
- package/oh-my-opencode/src/features/skill-mcp-manager/manager.test.ts +0 -611
- package/oh-my-opencode/src/features/skill-mcp-manager/manager.ts +0 -520
- package/oh-my-opencode/src/features/skill-mcp-manager/types.ts +0 -14
- package/oh-my-opencode/src/features/task-toast-manager/index.ts +0 -2
- package/oh-my-opencode/src/features/task-toast-manager/manager.test.ts +0 -249
- package/oh-my-opencode/src/features/task-toast-manager/manager.ts +0 -215
- package/oh-my-opencode/src/features/task-toast-manager/types.ts +0 -24
- package/oh-my-opencode/src/hooks/AGENTS.md +0 -73
- package/oh-my-opencode/src/hooks/agent-usage-reminder/constants.ts +0 -54
- package/oh-my-opencode/src/hooks/agent-usage-reminder/index.ts +0 -109
- package/oh-my-opencode/src/hooks/agent-usage-reminder/storage.ts +0 -42
- package/oh-my-opencode/src/hooks/agent-usage-reminder/types.ts +0 -6
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts +0 -307
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.ts +0 -485
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/index.ts +0 -151
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/parser.ts +0 -201
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.test.ts +0 -33
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.ts +0 -184
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-types.ts +0 -44
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.test.ts +0 -77
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.ts +0 -250
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/types.ts +0 -42
- package/oh-my-opencode/src/hooks/atlas/index.test.ts +0 -953
- package/oh-my-opencode/src/hooks/atlas/index.ts +0 -771
- package/oh-my-opencode/src/hooks/auto-slash-command/constants.ts +0 -12
- package/oh-my-opencode/src/hooks/auto-slash-command/detector.test.ts +0 -296
- package/oh-my-opencode/src/hooks/auto-slash-command/detector.ts +0 -65
- package/oh-my-opencode/src/hooks/auto-slash-command/executor.ts +0 -205
- package/oh-my-opencode/src/hooks/auto-slash-command/index.test.ts +0 -254
- package/oh-my-opencode/src/hooks/auto-slash-command/index.ts +0 -89
- package/oh-my-opencode/src/hooks/auto-slash-command/types.ts +0 -23
- package/oh-my-opencode/src/hooks/auto-update-checker/cache.ts +0 -93
- package/oh-my-opencode/src/hooks/auto-update-checker/checker.test.ts +0 -24
- package/oh-my-opencode/src/hooks/auto-update-checker/checker.ts +0 -284
- package/oh-my-opencode/src/hooks/auto-update-checker/constants.ts +0 -64
- package/oh-my-opencode/src/hooks/auto-update-checker/index.test.ts +0 -254
- package/oh-my-opencode/src/hooks/auto-update-checker/index.ts +0 -260
- package/oh-my-opencode/src/hooks/auto-update-checker/types.ts +0 -29
- package/oh-my-opencode/src/hooks/background-compaction/index.ts +0 -87
- package/oh-my-opencode/src/hooks/background-notification/index.ts +0 -28
- package/oh-my-opencode/src/hooks/background-notification/types.ts +0 -5
- package/oh-my-opencode/src/hooks/claude-code-hooks/AGENTS.md +0 -70
- package/oh-my-opencode/src/hooks/claude-code-hooks/config-loader.ts +0 -107
- package/oh-my-opencode/src/hooks/claude-code-hooks/config.ts +0 -103
- package/oh-my-opencode/src/hooks/claude-code-hooks/index.ts +0 -401
- package/oh-my-opencode/src/hooks/claude-code-hooks/plugin-config.ts +0 -12
- package/oh-my-opencode/src/hooks/claude-code-hooks/post-tool-use.ts +0 -199
- package/oh-my-opencode/src/hooks/claude-code-hooks/pre-compact.ts +0 -109
- package/oh-my-opencode/src/hooks/claude-code-hooks/pre-tool-use.ts +0 -172
- package/oh-my-opencode/src/hooks/claude-code-hooks/stop.ts +0 -118
- package/oh-my-opencode/src/hooks/claude-code-hooks/todo.ts +0 -76
- package/oh-my-opencode/src/hooks/claude-code-hooks/tool-input-cache.ts +0 -47
- package/oh-my-opencode/src/hooks/claude-code-hooks/transcript.ts +0 -252
- package/oh-my-opencode/src/hooks/claude-code-hooks/types.ts +0 -204
- package/oh-my-opencode/src/hooks/claude-code-hooks/user-prompt-submit.ts +0 -117
- package/oh-my-opencode/src/hooks/comment-checker/cli.test.ts +0 -68
- package/oh-my-opencode/src/hooks/comment-checker/cli.ts +0 -221
- package/oh-my-opencode/src/hooks/comment-checker/downloader.ts +0 -196
- package/oh-my-opencode/src/hooks/comment-checker/index.ts +0 -171
- package/oh-my-opencode/src/hooks/comment-checker/types.ts +0 -33
- package/oh-my-opencode/src/hooks/compaction-context-injector/index.ts +0 -61
- package/oh-my-opencode/src/hooks/context-window-monitor.ts +0 -99
- package/oh-my-opencode/src/hooks/delegate-task-retry/index.test.ts +0 -119
- package/oh-my-opencode/src/hooks/delegate-task-retry/index.ts +0 -136
- package/oh-my-opencode/src/hooks/directory-agents-injector/constants.ts +0 -9
- package/oh-my-opencode/src/hooks/directory-agents-injector/index.ts +0 -182
- package/oh-my-opencode/src/hooks/directory-agents-injector/storage.ts +0 -48
- package/oh-my-opencode/src/hooks/directory-agents-injector/types.ts +0 -5
- package/oh-my-opencode/src/hooks/directory-readme-injector/constants.ts +0 -9
- package/oh-my-opencode/src/hooks/directory-readme-injector/index.ts +0 -177
- package/oh-my-opencode/src/hooks/directory-readme-injector/storage.ts +0 -48
- package/oh-my-opencode/src/hooks/directory-readme-injector/types.ts +0 -5
- package/oh-my-opencode/src/hooks/edit-error-recovery/index.test.ts +0 -126
- package/oh-my-opencode/src/hooks/edit-error-recovery/index.ts +0 -57
- package/oh-my-opencode/src/hooks/empty-task-response-detector.ts +0 -27
- package/oh-my-opencode/src/hooks/index.ts +0 -32
- package/oh-my-opencode/src/hooks/interactive-bash-session/constants.ts +0 -15
- package/oh-my-opencode/src/hooks/interactive-bash-session/index.ts +0 -262
- package/oh-my-opencode/src/hooks/interactive-bash-session/storage.ts +0 -59
- package/oh-my-opencode/src/hooks/interactive-bash-session/types.ts +0 -11
- package/oh-my-opencode/src/hooks/keyword-detector/constants.ts +0 -300
- package/oh-my-opencode/src/hooks/keyword-detector/detector.ts +0 -52
- package/oh-my-opencode/src/hooks/keyword-detector/index.test.ts +0 -529
- package/oh-my-opencode/src/hooks/keyword-detector/index.ts +0 -100
- package/oh-my-opencode/src/hooks/keyword-detector/types.ts +0 -4
- package/oh-my-opencode/src/hooks/non-interactive-env/constants.ts +0 -70
- package/oh-my-opencode/src/hooks/non-interactive-env/detector.ts +0 -19
- package/oh-my-opencode/src/hooks/non-interactive-env/index.test.ts +0 -323
- package/oh-my-opencode/src/hooks/non-interactive-env/index.ts +0 -63
- package/oh-my-opencode/src/hooks/non-interactive-env/types.ts +0 -3
- package/oh-my-opencode/src/hooks/prometheus-md-only/constants.ts +0 -32
- package/oh-my-opencode/src/hooks/prometheus-md-only/index.test.ts +0 -488
- package/oh-my-opencode/src/hooks/prometheus-md-only/index.ts +0 -136
- package/oh-my-opencode/src/hooks/ralph-loop/constants.ts +0 -5
- package/oh-my-opencode/src/hooks/ralph-loop/index.test.ts +0 -835
- package/oh-my-opencode/src/hooks/ralph-loop/index.ts +0 -417
- package/oh-my-opencode/src/hooks/ralph-loop/storage.ts +0 -115
- package/oh-my-opencode/src/hooks/ralph-loop/types.ts +0 -19
- package/oh-my-opencode/src/hooks/rules-injector/constants.ts +0 -30
- package/oh-my-opencode/src/hooks/rules-injector/finder.test.ts +0 -381
- package/oh-my-opencode/src/hooks/rules-injector/finder.ts +0 -263
- package/oh-my-opencode/src/hooks/rules-injector/index.ts +0 -223
- package/oh-my-opencode/src/hooks/rules-injector/matcher.ts +0 -63
- package/oh-my-opencode/src/hooks/rules-injector/parser.test.ts +0 -226
- package/oh-my-opencode/src/hooks/rules-injector/parser.ts +0 -211
- package/oh-my-opencode/src/hooks/rules-injector/storage.ts +0 -59
- package/oh-my-opencode/src/hooks/rules-injector/types.ts +0 -57
- package/oh-my-opencode/src/hooks/session-notification-utils.ts +0 -140
- package/oh-my-opencode/src/hooks/session-notification.test.ts +0 -361
- package/oh-my-opencode/src/hooks/session-notification.ts +0 -330
- package/oh-my-opencode/src/hooks/session-recovery/constants.ts +0 -10
- package/oh-my-opencode/src/hooks/session-recovery/index.test.ts +0 -223
- package/oh-my-opencode/src/hooks/session-recovery/index.ts +0 -435
- package/oh-my-opencode/src/hooks/session-recovery/storage.ts +0 -390
- package/oh-my-opencode/src/hooks/session-recovery/types.ts +0 -98
- package/oh-my-opencode/src/hooks/start-work/index.test.ts +0 -402
- package/oh-my-opencode/src/hooks/start-work/index.ts +0 -242
- package/oh-my-opencode/src/hooks/task-resume-info/index.ts +0 -36
- package/oh-my-opencode/src/hooks/think-mode/detector.ts +0 -57
- package/oh-my-opencode/src/hooks/think-mode/index.test.ts +0 -353
- package/oh-my-opencode/src/hooks/think-mode/index.ts +0 -89
- package/oh-my-opencode/src/hooks/think-mode/switcher.test.ts +0 -461
- package/oh-my-opencode/src/hooks/think-mode/switcher.ts +0 -222
- package/oh-my-opencode/src/hooks/think-mode/types.ts +0 -21
- package/oh-my-opencode/src/hooks/thinking-block-validator/index.ts +0 -171
- package/oh-my-opencode/src/hooks/todo-continuation-enforcer.test.ts +0 -876
- package/oh-my-opencode/src/hooks/todo-continuation-enforcer.ts +0 -480
- package/oh-my-opencode/src/hooks/tool-output-truncator.test.ts +0 -168
- package/oh-my-opencode/src/hooks/tool-output-truncator.ts +0 -61
- package/oh-my-opencode/src/index.ts +0 -589
- package/oh-my-opencode/src/mcp/AGENTS.md +0 -70
- package/oh-my-opencode/src/mcp/context7.ts +0 -6
- package/oh-my-opencode/src/mcp/grep-app.ts +0 -6
- package/oh-my-opencode/src/mcp/index.test.ts +0 -86
- package/oh-my-opencode/src/mcp/index.ts +0 -32
- package/oh-my-opencode/src/mcp/types.ts +0 -9
- package/oh-my-opencode/src/mcp/websearch.ts +0 -10
- package/oh-my-opencode/src/plugin-config.test.ts +0 -119
- package/oh-my-opencode/src/plugin-config.ts +0 -135
- package/oh-my-opencode/src/plugin-handlers/config-handler.test.ts +0 -103
- package/oh-my-opencode/src/plugin-handlers/config-handler.ts +0 -399
- package/oh-my-opencode/src/plugin-handlers/index.ts +0 -1
- package/oh-my-opencode/src/plugin-state.ts +0 -30
- package/oh-my-opencode/src/shared/AGENTS.md +0 -63
- package/oh-my-opencode/src/shared/agent-tool-restrictions.ts +0 -44
- package/oh-my-opencode/src/shared/agent-variant.test.ts +0 -83
- package/oh-my-opencode/src/shared/agent-variant.ts +0 -40
- package/oh-my-opencode/src/shared/claude-config-dir.test.ts +0 -60
- package/oh-my-opencode/src/shared/claude-config-dir.ts +0 -11
- package/oh-my-opencode/src/shared/command-executor.ts +0 -225
- package/oh-my-opencode/src/shared/config-errors.ts +0 -18
- package/oh-my-opencode/src/shared/config-path.ts +0 -47
- package/oh-my-opencode/src/shared/data-path.ts +0 -22
- package/oh-my-opencode/src/shared/deep-merge.test.ts +0 -336
- package/oh-my-opencode/src/shared/deep-merge.ts +0 -53
- package/oh-my-opencode/src/shared/dynamic-truncator.ts +0 -193
- package/oh-my-opencode/src/shared/external-plugin-detector.test.ts +0 -133
- package/oh-my-opencode/src/shared/external-plugin-detector.ts +0 -132
- package/oh-my-opencode/src/shared/file-reference-resolver.ts +0 -85
- package/oh-my-opencode/src/shared/file-utils.ts +0 -40
- package/oh-my-opencode/src/shared/first-message-variant.test.ts +0 -32
- package/oh-my-opencode/src/shared/first-message-variant.ts +0 -28
- package/oh-my-opencode/src/shared/frontmatter.test.ts +0 -262
- package/oh-my-opencode/src/shared/frontmatter.ts +0 -31
- package/oh-my-opencode/src/shared/hook-disabled.ts +0 -22
- package/oh-my-opencode/src/shared/index.ts +0 -29
- package/oh-my-opencode/src/shared/jsonc-parser.test.ts +0 -266
- package/oh-my-opencode/src/shared/jsonc-parser.ts +0 -66
- package/oh-my-opencode/src/shared/logger.ts +0 -20
- package/oh-my-opencode/src/shared/migration.test.ts +0 -602
- package/oh-my-opencode/src/shared/migration.ts +0 -191
- package/oh-my-opencode/src/shared/model-resolver.test.ts +0 -101
- package/oh-my-opencode/src/shared/model-resolver.ts +0 -35
- package/oh-my-opencode/src/shared/model-sanitizer.ts +0 -12
- package/oh-my-opencode/src/shared/opencode-config-dir.test.ts +0 -318
- package/oh-my-opencode/src/shared/opencode-config-dir.ts +0 -142
- package/oh-my-opencode/src/shared/opencode-version.test.ts +0 -223
- package/oh-my-opencode/src/shared/opencode-version.ts +0 -72
- package/oh-my-opencode/src/shared/pattern-matcher.ts +0 -29
- package/oh-my-opencode/src/shared/permission-compat.test.ts +0 -134
- package/oh-my-opencode/src/shared/permission-compat.ts +0 -77
- package/oh-my-opencode/src/shared/session-cursor.test.ts +0 -66
- package/oh-my-opencode/src/shared/session-cursor.ts +0 -85
- package/oh-my-opencode/src/shared/shell-env.test.ts +0 -278
- package/oh-my-opencode/src/shared/shell-env.ts +0 -111
- package/oh-my-opencode/src/shared/snake-case.ts +0 -49
- package/oh-my-opencode/src/shared/system-directive.ts +0 -40
- package/oh-my-opencode/src/shared/tool-name.ts +0 -26
- package/oh-my-opencode/src/shared/zip-extractor.ts +0 -83
- package/oh-my-opencode/src/tools/AGENTS.md +0 -74
- package/oh-my-opencode/src/tools/ast-grep/cli.ts +0 -230
- package/oh-my-opencode/src/tools/ast-grep/constants.ts +0 -261
- package/oh-my-opencode/src/tools/ast-grep/downloader.ts +0 -128
- package/oh-my-opencode/src/tools/ast-grep/index.ts +0 -13
- package/oh-my-opencode/src/tools/ast-grep/tools.ts +0 -112
- package/oh-my-opencode/src/tools/ast-grep/types.ts +0 -61
- package/oh-my-opencode/src/tools/ast-grep/utils.ts +0 -102
- package/oh-my-opencode/src/tools/background-task/constants.ts +0 -7
- package/oh-my-opencode/src/tools/background-task/index.ts +0 -7
- package/oh-my-opencode/src/tools/background-task/tools.ts +0 -479
- package/oh-my-opencode/src/tools/background-task/types.ts +0 -16
- package/oh-my-opencode/src/tools/call-omo-agent/constants.ts +0 -7
- package/oh-my-opencode/src/tools/call-omo-agent/index.ts +0 -3
- package/oh-my-opencode/src/tools/call-omo-agent/tools.ts +0 -338
- package/oh-my-opencode/src/tools/call-omo-agent/types.ts +0 -27
- package/oh-my-opencode/src/tools/delegate-task/constants.ts +0 -205
- package/oh-my-opencode/src/tools/delegate-task/index.ts +0 -3
- package/oh-my-opencode/src/tools/delegate-task/tools.test.ts +0 -1575
- package/oh-my-opencode/src/tools/delegate-task/tools.ts +0 -885
- package/oh-my-opencode/src/tools/delegate-task/types.ts +0 -9
- package/oh-my-opencode/src/tools/glob/cli.test.ts +0 -158
- package/oh-my-opencode/src/tools/glob/cli.ts +0 -191
- package/oh-my-opencode/src/tools/glob/constants.ts +0 -12
- package/oh-my-opencode/src/tools/glob/index.ts +0 -3
- package/oh-my-opencode/src/tools/glob/tools.ts +0 -41
- package/oh-my-opencode/src/tools/glob/types.ts +0 -22
- package/oh-my-opencode/src/tools/glob/utils.ts +0 -26
- package/oh-my-opencode/src/tools/grep/cli.ts +0 -229
- package/oh-my-opencode/src/tools/grep/constants.ts +0 -127
- package/oh-my-opencode/src/tools/grep/downloader.test.ts +0 -103
- package/oh-my-opencode/src/tools/grep/downloader.ts +0 -145
- package/oh-my-opencode/src/tools/grep/index.ts +0 -3
- package/oh-my-opencode/src/tools/grep/tools.ts +0 -40
- package/oh-my-opencode/src/tools/grep/types.ts +0 -39
- package/oh-my-opencode/src/tools/grep/utils.ts +0 -53
- package/oh-my-opencode/src/tools/index.ts +0 -72
- package/oh-my-opencode/src/tools/interactive-bash/constants.ts +0 -18
- package/oh-my-opencode/src/tools/interactive-bash/index.ts +0 -4
- package/oh-my-opencode/src/tools/interactive-bash/tools.ts +0 -126
- package/oh-my-opencode/src/tools/interactive-bash/utils.ts +0 -71
- package/oh-my-opencode/src/tools/look-at/constants.ts +0 -3
- package/oh-my-opencode/src/tools/look-at/index.ts +0 -3
- package/oh-my-opencode/src/tools/look-at/tools.test.ts +0 -73
- package/oh-my-opencode/src/tools/look-at/tools.ts +0 -173
- package/oh-my-opencode/src/tools/look-at/types.ts +0 -4
- package/oh-my-opencode/src/tools/lsp/client.ts +0 -596
- package/oh-my-opencode/src/tools/lsp/config.test.ts +0 -130
- package/oh-my-opencode/src/tools/lsp/config.ts +0 -285
- package/oh-my-opencode/src/tools/lsp/constants.ts +0 -390
- package/oh-my-opencode/src/tools/lsp/index.ts +0 -7
- package/oh-my-opencode/src/tools/lsp/tools.ts +0 -261
- package/oh-my-opencode/src/tools/lsp/types.ts +0 -124
- package/oh-my-opencode/src/tools/lsp/utils.ts +0 -406
- package/oh-my-opencode/src/tools/session-manager/constants.ts +0 -97
- package/oh-my-opencode/src/tools/session-manager/index.ts +0 -3
- package/oh-my-opencode/src/tools/session-manager/storage.test.ts +0 -315
- package/oh-my-opencode/src/tools/session-manager/storage.ts +0 -238
- package/oh-my-opencode/src/tools/session-manager/tools.test.ts +0 -124
- package/oh-my-opencode/src/tools/session-manager/tools.ts +0 -146
- package/oh-my-opencode/src/tools/session-manager/types.ts +0 -99
- package/oh-my-opencode/src/tools/session-manager/utils.test.ts +0 -160
- package/oh-my-opencode/src/tools/session-manager/utils.ts +0 -199
- package/oh-my-opencode/src/tools/skill/constants.ts +0 -8
- package/oh-my-opencode/src/tools/skill/index.ts +0 -3
- package/oh-my-opencode/src/tools/skill/tools.test.ts +0 -239
- package/oh-my-opencode/src/tools/skill/tools.ts +0 -200
- package/oh-my-opencode/src/tools/skill/types.ts +0 -31
- package/oh-my-opencode/src/tools/skill-mcp/constants.ts +0 -3
- package/oh-my-opencode/src/tools/skill-mcp/index.ts +0 -3
- package/oh-my-opencode/src/tools/skill-mcp/tools.test.ts +0 -215
- package/oh-my-opencode/src/tools/skill-mcp/tools.ts +0 -172
- package/oh-my-opencode/src/tools/skill-mcp/types.ts +0 -8
- package/oh-my-opencode/src/tools/slashcommand/index.ts +0 -2
- package/oh-my-opencode/src/tools/slashcommand/tools.ts +0 -252
- package/oh-my-opencode/src/tools/slashcommand/types.ts +0 -28
- package/oh-my-opencode/test-setup.ts +0 -6
- package/oh-my-opencode/tsconfig.json +0 -20
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import type { PluginInput } from "@opencode-ai/plugin"
|
|
2
|
-
import { createSystemDirective, SystemDirectiveTypes } from "../shared/system-directive"
|
|
3
|
-
|
|
4
|
-
const ANTHROPIC_DISPLAY_LIMIT = 1_000_000
|
|
5
|
-
const ANTHROPIC_ACTUAL_LIMIT =
|
|
6
|
-
process.env.ANTHROPIC_1M_CONTEXT === "true" ||
|
|
7
|
-
process.env.VERTEX_ANTHROPIC_1M_CONTEXT === "true"
|
|
8
|
-
? 1_000_000
|
|
9
|
-
: 200_000
|
|
10
|
-
const CONTEXT_WARNING_THRESHOLD = 0.70
|
|
11
|
-
|
|
12
|
-
const CONTEXT_REMINDER = `${createSystemDirective(SystemDirectiveTypes.CONTEXT_WINDOW_MONITOR)}
|
|
13
|
-
|
|
14
|
-
You are using Anthropic Claude with 1M context window.
|
|
15
|
-
You have plenty of context remaining - do NOT rush or skip tasks.
|
|
16
|
-
Complete your work thoroughly and methodically.`
|
|
17
|
-
|
|
18
|
-
interface AssistantMessageInfo {
|
|
19
|
-
role: "assistant"
|
|
20
|
-
providerID: string
|
|
21
|
-
tokens: {
|
|
22
|
-
input: number
|
|
23
|
-
output: number
|
|
24
|
-
reasoning: number
|
|
25
|
-
cache: { read: number; write: number }
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface MessageWrapper {
|
|
30
|
-
info: { role: string } & Partial<AssistantMessageInfo>
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function createContextWindowMonitorHook(ctx: PluginInput) {
|
|
34
|
-
const remindedSessions = new Set<string>()
|
|
35
|
-
|
|
36
|
-
const toolExecuteAfter = async (
|
|
37
|
-
input: { tool: string; sessionID: string; callID: string },
|
|
38
|
-
output: { title: string; output: string; metadata: unknown }
|
|
39
|
-
) => {
|
|
40
|
-
const { sessionID } = input
|
|
41
|
-
|
|
42
|
-
if (remindedSessions.has(sessionID)) return
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
const response = await ctx.client.session.messages({
|
|
46
|
-
path: { id: sessionID },
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
const messages = (response.data ?? response) as MessageWrapper[]
|
|
50
|
-
|
|
51
|
-
const assistantMessages = messages
|
|
52
|
-
.filter((m) => m.info.role === "assistant")
|
|
53
|
-
.map((m) => m.info as AssistantMessageInfo)
|
|
54
|
-
|
|
55
|
-
if (assistantMessages.length === 0) return
|
|
56
|
-
|
|
57
|
-
const lastAssistant = assistantMessages[assistantMessages.length - 1]
|
|
58
|
-
if (lastAssistant.providerID !== "anthropic") return
|
|
59
|
-
|
|
60
|
-
// Use only the last assistant message's input tokens
|
|
61
|
-
// This reflects the ACTUAL current context window usage (post-compaction)
|
|
62
|
-
const lastTokens = lastAssistant.tokens
|
|
63
|
-
const totalInputTokens = (lastTokens?.input ?? 0) + (lastTokens?.cache?.read ?? 0)
|
|
64
|
-
|
|
65
|
-
const actualUsagePercentage = totalInputTokens / ANTHROPIC_ACTUAL_LIMIT
|
|
66
|
-
|
|
67
|
-
if (actualUsagePercentage < CONTEXT_WARNING_THRESHOLD) return
|
|
68
|
-
|
|
69
|
-
remindedSessions.add(sessionID)
|
|
70
|
-
|
|
71
|
-
const displayUsagePercentage = totalInputTokens / ANTHROPIC_DISPLAY_LIMIT
|
|
72
|
-
const usedPct = (displayUsagePercentage * 100).toFixed(1)
|
|
73
|
-
const remainingPct = ((1 - displayUsagePercentage) * 100).toFixed(1)
|
|
74
|
-
const usedTokens = totalInputTokens.toLocaleString()
|
|
75
|
-
const limitTokens = ANTHROPIC_DISPLAY_LIMIT.toLocaleString()
|
|
76
|
-
|
|
77
|
-
output.output += `\n\n${CONTEXT_REMINDER}
|
|
78
|
-
[Context Status: ${usedPct}% used (${usedTokens}/${limitTokens} tokens), ${remainingPct}% remaining]`
|
|
79
|
-
} catch {
|
|
80
|
-
// Graceful degradation - do not disrupt tool execution
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const eventHandler = async ({ event }: { event: { type: string; properties?: unknown } }) => {
|
|
85
|
-
const props = event.properties as Record<string, unknown> | undefined
|
|
86
|
-
|
|
87
|
-
if (event.type === "session.deleted") {
|
|
88
|
-
const sessionInfo = props?.info as { id?: string } | undefined
|
|
89
|
-
if (sessionInfo?.id) {
|
|
90
|
-
remindedSessions.delete(sessionInfo.id)
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
"tool.execute.after": toolExecuteAfter,
|
|
97
|
-
event: eventHandler,
|
|
98
|
-
}
|
|
99
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test"
|
|
2
|
-
import {
|
|
3
|
-
DELEGATE_TASK_ERROR_PATTERNS,
|
|
4
|
-
detectDelegateTaskError,
|
|
5
|
-
buildRetryGuidance,
|
|
6
|
-
} from "./index"
|
|
7
|
-
|
|
8
|
-
describe("sisyphus-task-retry", () => {
|
|
9
|
-
describe("DELEGATE_TASK_ERROR_PATTERNS", () => {
|
|
10
|
-
// #given error patterns are defined
|
|
11
|
-
// #then should include all known delegate_task error types
|
|
12
|
-
it("should contain all known error patterns", () => {
|
|
13
|
-
expect(DELEGATE_TASK_ERROR_PATTERNS.length).toBeGreaterThan(5)
|
|
14
|
-
|
|
15
|
-
const patternTexts = DELEGATE_TASK_ERROR_PATTERNS.map(p => p.pattern)
|
|
16
|
-
expect(patternTexts).toContain("run_in_background")
|
|
17
|
-
expect(patternTexts).toContain("skills")
|
|
18
|
-
expect(patternTexts).toContain("category OR subagent_type")
|
|
19
|
-
expect(patternTexts).toContain("Unknown category")
|
|
20
|
-
expect(patternTexts).toContain("Unknown agent")
|
|
21
|
-
})
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
describe("detectDelegateTaskError", () => {
|
|
25
|
-
// #given tool output with run_in_background error
|
|
26
|
-
// #when detecting error
|
|
27
|
-
// #then should return matching error info
|
|
28
|
-
it("should detect run_in_background missing error", () => {
|
|
29
|
-
const output = "❌ Invalid arguments: 'run_in_background' parameter is REQUIRED. Use run_in_background=false for task delegation."
|
|
30
|
-
|
|
31
|
-
const result = detectDelegateTaskError(output)
|
|
32
|
-
|
|
33
|
-
expect(result).not.toBeNull()
|
|
34
|
-
expect(result?.errorType).toBe("missing_run_in_background")
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it("should detect skills missing error", () => {
|
|
38
|
-
const output = "❌ Invalid arguments: 'skills' parameter is REQUIRED. Use skills=[] if no skills needed."
|
|
39
|
-
|
|
40
|
-
const result = detectDelegateTaskError(output)
|
|
41
|
-
|
|
42
|
-
expect(result).not.toBeNull()
|
|
43
|
-
expect(result?.errorType).toBe("missing_skills")
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it("should detect category/subagent mutual exclusion error", () => {
|
|
47
|
-
const output = "❌ Invalid arguments: Provide EITHER category OR subagent_type, not both."
|
|
48
|
-
|
|
49
|
-
const result = detectDelegateTaskError(output)
|
|
50
|
-
|
|
51
|
-
expect(result).not.toBeNull()
|
|
52
|
-
expect(result?.errorType).toBe("mutual_exclusion")
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it("should detect unknown category error", () => {
|
|
56
|
-
const output = '❌ Unknown category: "invalid-cat". Available: visual-engineering, ultrabrain, quick'
|
|
57
|
-
|
|
58
|
-
const result = detectDelegateTaskError(output)
|
|
59
|
-
|
|
60
|
-
expect(result).not.toBeNull()
|
|
61
|
-
expect(result?.errorType).toBe("unknown_category")
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it("should detect unknown agent error", () => {
|
|
65
|
-
const output = '❌ Unknown agent: "fake-agent". Available agents: explore, librarian, oracle'
|
|
66
|
-
|
|
67
|
-
const result = detectDelegateTaskError(output)
|
|
68
|
-
|
|
69
|
-
expect(result).not.toBeNull()
|
|
70
|
-
expect(result?.errorType).toBe("unknown_agent")
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it("should return null for successful output", () => {
|
|
74
|
-
const output = "Background task launched.\n\nTask ID: bg_12345\nSession ID: ses_abc"
|
|
75
|
-
|
|
76
|
-
const result = detectDelegateTaskError(output)
|
|
77
|
-
|
|
78
|
-
expect(result).toBeNull()
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
describe("buildRetryGuidance", () => {
|
|
83
|
-
// #given detected error
|
|
84
|
-
// #when building retry guidance
|
|
85
|
-
// #then should return actionable fix instructions
|
|
86
|
-
it("should provide fix for missing run_in_background", () => {
|
|
87
|
-
const errorInfo = { errorType: "missing_run_in_background", originalOutput: "" }
|
|
88
|
-
|
|
89
|
-
const guidance = buildRetryGuidance(errorInfo)
|
|
90
|
-
|
|
91
|
-
expect(guidance).toContain("run_in_background")
|
|
92
|
-
expect(guidance).toContain("REQUIRED")
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it("should provide fix for unknown category with available list", () => {
|
|
96
|
-
const errorInfo = {
|
|
97
|
-
errorType: "unknown_category",
|
|
98
|
-
originalOutput: '❌ Unknown category: "bad". Available: visual-engineering, ultrabrain'
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const guidance = buildRetryGuidance(errorInfo)
|
|
102
|
-
|
|
103
|
-
expect(guidance).toContain("visual-engineering")
|
|
104
|
-
expect(guidance).toContain("ultrabrain")
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
it("should provide fix for unknown agent with available list", () => {
|
|
108
|
-
const errorInfo = {
|
|
109
|
-
errorType: "unknown_agent",
|
|
110
|
-
originalOutput: '❌ Unknown agent: "fake". Available agents: explore, oracle'
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const guidance = buildRetryGuidance(errorInfo)
|
|
114
|
-
|
|
115
|
-
expect(guidance).toContain("explore")
|
|
116
|
-
expect(guidance).toContain("oracle")
|
|
117
|
-
})
|
|
118
|
-
})
|
|
119
|
-
})
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import type { PluginInput } from "@opencode-ai/plugin"
|
|
2
|
-
|
|
3
|
-
export interface DelegateTaskErrorPattern {
|
|
4
|
-
pattern: string
|
|
5
|
-
errorType: string
|
|
6
|
-
fixHint: string
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const DELEGATE_TASK_ERROR_PATTERNS: DelegateTaskErrorPattern[] = [
|
|
10
|
-
{
|
|
11
|
-
pattern: "run_in_background",
|
|
12
|
-
errorType: "missing_run_in_background",
|
|
13
|
-
fixHint: "Add run_in_background=false (for delegation) or run_in_background=true (for parallel exploration)",
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
pattern: "skills",
|
|
17
|
-
errorType: "missing_skills",
|
|
18
|
-
fixHint: "Add skills=[] parameter (empty array if no skills needed)",
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
pattern: "category OR subagent_type",
|
|
22
|
-
errorType: "mutual_exclusion",
|
|
23
|
-
fixHint: "Provide ONLY one of: category (e.g., 'general', 'quick') OR subagent_type (e.g., 'oracle', 'explore')",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
pattern: "Must provide either category or subagent_type",
|
|
27
|
-
errorType: "missing_category_or_agent",
|
|
28
|
-
fixHint: "Add either category='general' OR subagent_type='explore'",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
pattern: "Unknown category",
|
|
32
|
-
errorType: "unknown_category",
|
|
33
|
-
fixHint: "Use a valid category from the Available list in the error message",
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
pattern: "Agent name cannot be empty",
|
|
37
|
-
errorType: "empty_agent",
|
|
38
|
-
fixHint: "Provide a non-empty subagent_type value",
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
pattern: "Unknown agent",
|
|
42
|
-
errorType: "unknown_agent",
|
|
43
|
-
fixHint: "Use a valid agent from the Available agents list in the error message",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
pattern: "Cannot call primary agent",
|
|
47
|
-
errorType: "primary_agent",
|
|
48
|
-
fixHint: "Primary agents cannot be called via delegate_task. Use a subagent like 'explore', 'oracle', or 'librarian'",
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
pattern: "Skills not found",
|
|
52
|
-
errorType: "unknown_skills",
|
|
53
|
-
fixHint: "Use valid skill names from the Available list in the error message",
|
|
54
|
-
},
|
|
55
|
-
]
|
|
56
|
-
|
|
57
|
-
export interface DetectedError {
|
|
58
|
-
errorType: string
|
|
59
|
-
originalOutput: string
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function detectDelegateTaskError(output: string): DetectedError | null {
|
|
63
|
-
if (!output.includes("❌")) return null
|
|
64
|
-
|
|
65
|
-
for (const errorPattern of DELEGATE_TASK_ERROR_PATTERNS) {
|
|
66
|
-
if (output.includes(errorPattern.pattern)) {
|
|
67
|
-
return {
|
|
68
|
-
errorType: errorPattern.errorType,
|
|
69
|
-
originalOutput: output,
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return null
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function extractAvailableList(output: string): string | null {
|
|
78
|
-
const availableMatch = output.match(/Available[^:]*:\s*(.+)$/m)
|
|
79
|
-
return availableMatch ? availableMatch[1].trim() : null
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export function buildRetryGuidance(errorInfo: DetectedError): string {
|
|
83
|
-
const pattern = DELEGATE_TASK_ERROR_PATTERNS.find(
|
|
84
|
-
(p) => p.errorType === errorInfo.errorType
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
if (!pattern) {
|
|
88
|
-
return `[delegate_task ERROR] Fix the error and retry with correct parameters.`
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
let guidance = `
|
|
92
|
-
[delegate_task CALL FAILED - IMMEDIATE RETRY REQUIRED]
|
|
93
|
-
|
|
94
|
-
**Error Type**: ${errorInfo.errorType}
|
|
95
|
-
**Fix**: ${pattern.fixHint}
|
|
96
|
-
`
|
|
97
|
-
|
|
98
|
-
const availableList = extractAvailableList(errorInfo.originalOutput)
|
|
99
|
-
if (availableList) {
|
|
100
|
-
guidance += `\n**Available Options**: ${availableList}\n`
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
guidance += `
|
|
104
|
-
**Action**: Retry delegate_task NOW with corrected parameters.
|
|
105
|
-
|
|
106
|
-
Example of CORRECT call:
|
|
107
|
-
\`\`\`
|
|
108
|
-
delegate_task(
|
|
109
|
-
description="Task description",
|
|
110
|
-
prompt="Detailed prompt...",
|
|
111
|
-
category="unspecified-low", // OR subagent_type="explore"
|
|
112
|
-
run_in_background=false,
|
|
113
|
-
skills=[]
|
|
114
|
-
)
|
|
115
|
-
\`\`\`
|
|
116
|
-
`
|
|
117
|
-
|
|
118
|
-
return guidance
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export function createDelegateTaskRetryHook(_ctx: PluginInput) {
|
|
122
|
-
return {
|
|
123
|
-
"tool.execute.after": async (
|
|
124
|
-
input: { tool: string; sessionID: string; callID: string },
|
|
125
|
-
output: { title: string; output: string; metadata: unknown }
|
|
126
|
-
) => {
|
|
127
|
-
if (input.tool.toLowerCase() !== "delegate_task") return
|
|
128
|
-
|
|
129
|
-
const errorInfo = detectDelegateTaskError(output.output)
|
|
130
|
-
if (errorInfo) {
|
|
131
|
-
const guidance = buildRetryGuidance(errorInfo)
|
|
132
|
-
output.output += `\n${guidance}`
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
}
|
|
136
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
2
|
-
import { getOpenCodeStorageDir } from "../../shared/data-path";
|
|
3
|
-
|
|
4
|
-
export const OPENCODE_STORAGE = getOpenCodeStorageDir();
|
|
5
|
-
export const AGENTS_INJECTOR_STORAGE = join(
|
|
6
|
-
OPENCODE_STORAGE,
|
|
7
|
-
"directory-agents",
|
|
8
|
-
);
|
|
9
|
-
export const AGENTS_FILENAME = "AGENTS.md";
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import type { PluginInput } from "@opencode-ai/plugin";
|
|
2
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
-
import { dirname, join, resolve } from "node:path";
|
|
4
|
-
import {
|
|
5
|
-
loadInjectedPaths,
|
|
6
|
-
saveInjectedPaths,
|
|
7
|
-
clearInjectedPaths,
|
|
8
|
-
} from "./storage";
|
|
9
|
-
import { AGENTS_FILENAME } from "./constants";
|
|
10
|
-
import { createDynamicTruncator } from "../../shared/dynamic-truncator";
|
|
11
|
-
|
|
12
|
-
interface ToolExecuteInput {
|
|
13
|
-
tool: string;
|
|
14
|
-
sessionID: string;
|
|
15
|
-
callID: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface ToolExecuteOutput {
|
|
19
|
-
title: string;
|
|
20
|
-
output: string;
|
|
21
|
-
metadata: unknown;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
interface ToolExecuteBeforeOutput {
|
|
25
|
-
args: unknown;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
interface BatchToolCall {
|
|
29
|
-
tool: string;
|
|
30
|
-
parameters: Record<string, unknown>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
interface EventInput {
|
|
34
|
-
event: {
|
|
35
|
-
type: string;
|
|
36
|
-
properties?: unknown;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function createDirectoryAgentsInjectorHook(ctx: PluginInput) {
|
|
41
|
-
const sessionCaches = new Map<string, Set<string>>();
|
|
42
|
-
const pendingBatchReads = new Map<string, string[]>();
|
|
43
|
-
const truncator = createDynamicTruncator(ctx);
|
|
44
|
-
|
|
45
|
-
function getSessionCache(sessionID: string): Set<string> {
|
|
46
|
-
if (!sessionCaches.has(sessionID)) {
|
|
47
|
-
sessionCaches.set(sessionID, loadInjectedPaths(sessionID));
|
|
48
|
-
}
|
|
49
|
-
return sessionCaches.get(sessionID)!;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function resolveFilePath(path: string): string | null {
|
|
53
|
-
if (!path) return null;
|
|
54
|
-
if (path.startsWith("/")) return path;
|
|
55
|
-
return resolve(ctx.directory, path);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function findAgentsMdUp(startDir: string): string[] {
|
|
59
|
-
const found: string[] = [];
|
|
60
|
-
let current = startDir;
|
|
61
|
-
|
|
62
|
-
while (true) {
|
|
63
|
-
// Skip root AGENTS.md - OpenCode's system.ts already loads it via custom()
|
|
64
|
-
// See: https://github.com/code-yeongyu/oh-my-opencode/issues/379
|
|
65
|
-
const isRootDir = current === ctx.directory;
|
|
66
|
-
if (!isRootDir) {
|
|
67
|
-
const agentsPath = join(current, AGENTS_FILENAME);
|
|
68
|
-
if (existsSync(agentsPath)) {
|
|
69
|
-
found.push(agentsPath);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (isRootDir) break;
|
|
74
|
-
const parent = dirname(current);
|
|
75
|
-
if (parent === current) break;
|
|
76
|
-
if (!parent.startsWith(ctx.directory)) break;
|
|
77
|
-
current = parent;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return found.reverse();
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async function processFilePathForInjection(
|
|
84
|
-
filePath: string,
|
|
85
|
-
sessionID: string,
|
|
86
|
-
output: ToolExecuteOutput,
|
|
87
|
-
): Promise<void> {
|
|
88
|
-
const resolved = resolveFilePath(filePath);
|
|
89
|
-
if (!resolved) return;
|
|
90
|
-
|
|
91
|
-
const dir = dirname(resolved);
|
|
92
|
-
const cache = getSessionCache(sessionID);
|
|
93
|
-
const agentsPaths = findAgentsMdUp(dir);
|
|
94
|
-
|
|
95
|
-
for (const agentsPath of agentsPaths) {
|
|
96
|
-
const agentsDir = dirname(agentsPath);
|
|
97
|
-
if (cache.has(agentsDir)) continue;
|
|
98
|
-
|
|
99
|
-
try {
|
|
100
|
-
const content = readFileSync(agentsPath, "utf-8");
|
|
101
|
-
const { result, truncated } = await truncator.truncate(sessionID, content);
|
|
102
|
-
const truncationNotice = truncated
|
|
103
|
-
? `\n\n[Note: Content was truncated to save context window space. For full context, please read the file directly: ${agentsPath}]`
|
|
104
|
-
: "";
|
|
105
|
-
output.output += `\n\n[Directory Context: ${agentsPath}]\n${result}${truncationNotice}`;
|
|
106
|
-
cache.add(agentsDir);
|
|
107
|
-
} catch {}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
saveInjectedPaths(sessionID, cache);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const toolExecuteBefore = async (
|
|
114
|
-
input: ToolExecuteInput,
|
|
115
|
-
output: ToolExecuteBeforeOutput,
|
|
116
|
-
) => {
|
|
117
|
-
if (input.tool.toLowerCase() !== "batch") return;
|
|
118
|
-
|
|
119
|
-
const args = output.args as { tool_calls?: BatchToolCall[] } | undefined;
|
|
120
|
-
if (!args?.tool_calls) return;
|
|
121
|
-
|
|
122
|
-
const readFilePaths: string[] = [];
|
|
123
|
-
for (const call of args.tool_calls) {
|
|
124
|
-
if (call.tool.toLowerCase() === "read" && call.parameters?.filePath) {
|
|
125
|
-
readFilePaths.push(call.parameters.filePath as string);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if (readFilePaths.length > 0) {
|
|
130
|
-
pendingBatchReads.set(input.callID, readFilePaths);
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
const toolExecuteAfter = async (
|
|
135
|
-
input: ToolExecuteInput,
|
|
136
|
-
output: ToolExecuteOutput,
|
|
137
|
-
) => {
|
|
138
|
-
const toolName = input.tool.toLowerCase();
|
|
139
|
-
|
|
140
|
-
if (toolName === "read") {
|
|
141
|
-
await processFilePathForInjection(output.title, input.sessionID, output);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (toolName === "batch") {
|
|
146
|
-
const filePaths = pendingBatchReads.get(input.callID);
|
|
147
|
-
if (filePaths) {
|
|
148
|
-
for (const filePath of filePaths) {
|
|
149
|
-
await processFilePathForInjection(filePath, input.sessionID, output);
|
|
150
|
-
}
|
|
151
|
-
pendingBatchReads.delete(input.callID);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
const eventHandler = async ({ event }: EventInput) => {
|
|
157
|
-
const props = event.properties as Record<string, unknown> | undefined;
|
|
158
|
-
|
|
159
|
-
if (event.type === "session.deleted") {
|
|
160
|
-
const sessionInfo = props?.info as { id?: string } | undefined;
|
|
161
|
-
if (sessionInfo?.id) {
|
|
162
|
-
sessionCaches.delete(sessionInfo.id);
|
|
163
|
-
clearInjectedPaths(sessionInfo.id);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if (event.type === "session.compacted") {
|
|
168
|
-
const sessionID = (props?.sessionID ??
|
|
169
|
-
(props?.info as { id?: string } | undefined)?.id) as string | undefined;
|
|
170
|
-
if (sessionID) {
|
|
171
|
-
sessionCaches.delete(sessionID);
|
|
172
|
-
clearInjectedPaths(sessionID);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
"tool.execute.before": toolExecuteBefore,
|
|
179
|
-
"tool.execute.after": toolExecuteAfter,
|
|
180
|
-
event: eventHandler,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
existsSync,
|
|
3
|
-
mkdirSync,
|
|
4
|
-
readFileSync,
|
|
5
|
-
writeFileSync,
|
|
6
|
-
unlinkSync,
|
|
7
|
-
} from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { AGENTS_INJECTOR_STORAGE } from "./constants";
|
|
10
|
-
import type { InjectedPathsData } from "./types";
|
|
11
|
-
|
|
12
|
-
function getStoragePath(sessionID: string): string {
|
|
13
|
-
return join(AGENTS_INJECTOR_STORAGE, `${sessionID}.json`);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function loadInjectedPaths(sessionID: string): Set<string> {
|
|
17
|
-
const filePath = getStoragePath(sessionID);
|
|
18
|
-
if (!existsSync(filePath)) return new Set();
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
const content = readFileSync(filePath, "utf-8");
|
|
22
|
-
const data: InjectedPathsData = JSON.parse(content);
|
|
23
|
-
return new Set(data.injectedPaths);
|
|
24
|
-
} catch {
|
|
25
|
-
return new Set();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function saveInjectedPaths(sessionID: string, paths: Set<string>): void {
|
|
30
|
-
if (!existsSync(AGENTS_INJECTOR_STORAGE)) {
|
|
31
|
-
mkdirSync(AGENTS_INJECTOR_STORAGE, { recursive: true });
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const data: InjectedPathsData = {
|
|
35
|
-
sessionID,
|
|
36
|
-
injectedPaths: [...paths],
|
|
37
|
-
updatedAt: Date.now(),
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
writeFileSync(getStoragePath(sessionID), JSON.stringify(data, null, 2));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function clearInjectedPaths(sessionID: string): void {
|
|
44
|
-
const filePath = getStoragePath(sessionID);
|
|
45
|
-
if (existsSync(filePath)) {
|
|
46
|
-
unlinkSync(filePath);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
2
|
-
import { getOpenCodeStorageDir } from "../../shared/data-path";
|
|
3
|
-
|
|
4
|
-
export const OPENCODE_STORAGE = getOpenCodeStorageDir();
|
|
5
|
-
export const README_INJECTOR_STORAGE = join(
|
|
6
|
-
OPENCODE_STORAGE,
|
|
7
|
-
"directory-readme",
|
|
8
|
-
);
|
|
9
|
-
export const README_FILENAME = "README.md";
|