opencode-repos 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +25 -11
- package/package.json +27 -27
- 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,520 +0,0 @@
|
|
|
1
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
|
|
2
|
-
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
|
|
3
|
-
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
|
|
4
|
-
import type { Tool, Resource, Prompt } from "@modelcontextprotocol/sdk/types.js"
|
|
5
|
-
import type { ClaudeCodeMcpServer } from "../claude-code-mcp-loader/types"
|
|
6
|
-
import { expandEnvVarsInObject } from "../claude-code-mcp-loader/env-expander"
|
|
7
|
-
import { createCleanMcpEnvironment } from "./env-cleaner"
|
|
8
|
-
import type { SkillMcpClientInfo, SkillMcpServerContext } from "./types"
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Connection type for a managed MCP client.
|
|
12
|
-
* - "stdio": Local process via stdin/stdout
|
|
13
|
-
* - "http": Remote server via HTTP (Streamable HTTP transport)
|
|
14
|
-
*/
|
|
15
|
-
type ConnectionType = "stdio" | "http"
|
|
16
|
-
|
|
17
|
-
interface ManagedClientBase {
|
|
18
|
-
client: Client
|
|
19
|
-
skillName: string
|
|
20
|
-
lastUsedAt: number
|
|
21
|
-
connectionType: ConnectionType
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
interface ManagedStdioClient extends ManagedClientBase {
|
|
25
|
-
connectionType: "stdio"
|
|
26
|
-
transport: StdioClientTransport
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface ManagedHttpClient extends ManagedClientBase {
|
|
30
|
-
connectionType: "http"
|
|
31
|
-
transport: StreamableHTTPClientTransport
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
type ManagedClient = ManagedStdioClient | ManagedHttpClient
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Determines connection type from MCP server configuration.
|
|
38
|
-
* Priority: explicit type field > url presence > command presence
|
|
39
|
-
*/
|
|
40
|
-
function getConnectionType(config: ClaudeCodeMcpServer): ConnectionType | null {
|
|
41
|
-
// Explicit type takes priority
|
|
42
|
-
if (config.type === "http" || config.type === "sse") {
|
|
43
|
-
return "http"
|
|
44
|
-
}
|
|
45
|
-
if (config.type === "stdio") {
|
|
46
|
-
return "stdio"
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Infer from available fields
|
|
50
|
-
if (config.url) {
|
|
51
|
-
return "http"
|
|
52
|
-
}
|
|
53
|
-
if (config.command) {
|
|
54
|
-
return "stdio"
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return null
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export class SkillMcpManager {
|
|
61
|
-
private clients: Map<string, ManagedClient> = new Map()
|
|
62
|
-
private pendingConnections: Map<string, Promise<Client>> = new Map()
|
|
63
|
-
private cleanupRegistered = false
|
|
64
|
-
private cleanupInterval: ReturnType<typeof setInterval> | null = null
|
|
65
|
-
private readonly IDLE_TIMEOUT = 5 * 60 * 1000
|
|
66
|
-
|
|
67
|
-
private getClientKey(info: SkillMcpClientInfo): string {
|
|
68
|
-
return `${info.sessionID}:${info.skillName}:${info.serverName}`
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
private registerProcessCleanup(): void {
|
|
72
|
-
if (this.cleanupRegistered) return
|
|
73
|
-
this.cleanupRegistered = true
|
|
74
|
-
|
|
75
|
-
const cleanup = async () => {
|
|
76
|
-
for (const [, managed] of this.clients) {
|
|
77
|
-
try {
|
|
78
|
-
await managed.client.close()
|
|
79
|
-
} catch {
|
|
80
|
-
// Ignore errors during cleanup
|
|
81
|
-
}
|
|
82
|
-
try {
|
|
83
|
-
await managed.transport.close()
|
|
84
|
-
} catch {
|
|
85
|
-
// Transport may already be terminated
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
this.clients.clear()
|
|
89
|
-
this.pendingConnections.clear()
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Note: 'exit' event is synchronous-only in Node.js, so we use 'beforeExit' for async cleanup
|
|
93
|
-
// However, 'beforeExit' is not emitted on explicit process.exit() calls
|
|
94
|
-
// Signal handlers are made async to properly await cleanup
|
|
95
|
-
|
|
96
|
-
process.on("SIGINT", async () => {
|
|
97
|
-
await cleanup()
|
|
98
|
-
process.exit(0)
|
|
99
|
-
})
|
|
100
|
-
process.on("SIGTERM", async () => {
|
|
101
|
-
await cleanup()
|
|
102
|
-
process.exit(0)
|
|
103
|
-
})
|
|
104
|
-
if (process.platform === "win32") {
|
|
105
|
-
process.on("SIGBREAK", async () => {
|
|
106
|
-
await cleanup()
|
|
107
|
-
process.exit(0)
|
|
108
|
-
})
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async getOrCreateClient(
|
|
113
|
-
info: SkillMcpClientInfo,
|
|
114
|
-
config: ClaudeCodeMcpServer
|
|
115
|
-
): Promise<Client> {
|
|
116
|
-
const key = this.getClientKey(info)
|
|
117
|
-
const existing = this.clients.get(key)
|
|
118
|
-
|
|
119
|
-
if (existing) {
|
|
120
|
-
existing.lastUsedAt = Date.now()
|
|
121
|
-
return existing.client
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Prevent race condition: if a connection is already in progress, wait for it
|
|
125
|
-
const pending = this.pendingConnections.get(key)
|
|
126
|
-
if (pending) {
|
|
127
|
-
return pending
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const expandedConfig = expandEnvVarsInObject(config)
|
|
131
|
-
const connectionPromise = this.createClient(info, expandedConfig)
|
|
132
|
-
this.pendingConnections.set(key, connectionPromise)
|
|
133
|
-
|
|
134
|
-
try {
|
|
135
|
-
const client = await connectionPromise
|
|
136
|
-
return client
|
|
137
|
-
} finally {
|
|
138
|
-
this.pendingConnections.delete(key)
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
private async createClient(
|
|
143
|
-
info: SkillMcpClientInfo,
|
|
144
|
-
config: ClaudeCodeMcpServer
|
|
145
|
-
): Promise<Client> {
|
|
146
|
-
const connectionType = getConnectionType(config)
|
|
147
|
-
|
|
148
|
-
if (!connectionType) {
|
|
149
|
-
throw new Error(
|
|
150
|
-
`MCP server "${info.serverName}" has no valid connection configuration.\n\n` +
|
|
151
|
-
`The MCP configuration in skill "${info.skillName}" must specify either:\n` +
|
|
152
|
-
` - A URL for HTTP connection (remote MCP server)\n` +
|
|
153
|
-
` - A command for stdio connection (local MCP process)\n\n` +
|
|
154
|
-
`Examples:\n` +
|
|
155
|
-
` HTTP:\n` +
|
|
156
|
-
` mcp:\n` +
|
|
157
|
-
` ${info.serverName}:\n` +
|
|
158
|
-
` url: https://mcp.example.com/mcp\n` +
|
|
159
|
-
` headers:\n` +
|
|
160
|
-
` Authorization: Bearer \${API_KEY}\n\n` +
|
|
161
|
-
` Stdio:\n` +
|
|
162
|
-
` mcp:\n` +
|
|
163
|
-
` ${info.serverName}:\n` +
|
|
164
|
-
` command: npx\n` +
|
|
165
|
-
` args: [-y, @some/mcp-server]`
|
|
166
|
-
)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (connectionType === "http") {
|
|
170
|
-
return this.createHttpClient(info, config)
|
|
171
|
-
} else {
|
|
172
|
-
return this.createStdioClient(info, config)
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Create an HTTP-based MCP client using StreamableHTTPClientTransport.
|
|
178
|
-
* Supports remote MCP servers with optional authentication headers.
|
|
179
|
-
*/
|
|
180
|
-
private async createHttpClient(
|
|
181
|
-
info: SkillMcpClientInfo,
|
|
182
|
-
config: ClaudeCodeMcpServer
|
|
183
|
-
): Promise<Client> {
|
|
184
|
-
const key = this.getClientKey(info)
|
|
185
|
-
|
|
186
|
-
if (!config.url) {
|
|
187
|
-
throw new Error(
|
|
188
|
-
`MCP server "${info.serverName}" is configured for HTTP but missing 'url' field.`
|
|
189
|
-
)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
let url: URL
|
|
193
|
-
try {
|
|
194
|
-
url = new URL(config.url)
|
|
195
|
-
} catch {
|
|
196
|
-
throw new Error(
|
|
197
|
-
`MCP server "${info.serverName}" has invalid URL: ${config.url}\n\n` +
|
|
198
|
-
`Expected a valid URL like: https://mcp.example.com/mcp`
|
|
199
|
-
)
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
this.registerProcessCleanup()
|
|
203
|
-
|
|
204
|
-
// Build request init with headers if provided
|
|
205
|
-
const requestInit: RequestInit = {}
|
|
206
|
-
if (config.headers && Object.keys(config.headers).length > 0) {
|
|
207
|
-
requestInit.headers = config.headers
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
const transport = new StreamableHTTPClientTransport(url, {
|
|
211
|
-
requestInit: Object.keys(requestInit).length > 0 ? requestInit : undefined,
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
const client = new Client(
|
|
215
|
-
{ name: `skill-mcp-${info.skillName}-${info.serverName}`, version: "1.0.0" },
|
|
216
|
-
{ capabilities: {} }
|
|
217
|
-
)
|
|
218
|
-
|
|
219
|
-
try {
|
|
220
|
-
await client.connect(transport)
|
|
221
|
-
} catch (error) {
|
|
222
|
-
try {
|
|
223
|
-
await transport.close()
|
|
224
|
-
} catch {
|
|
225
|
-
// Transport may already be closed
|
|
226
|
-
}
|
|
227
|
-
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
228
|
-
throw new Error(
|
|
229
|
-
`Failed to connect to MCP server "${info.serverName}".\n\n` +
|
|
230
|
-
`URL: ${config.url}\n` +
|
|
231
|
-
`Reason: ${errorMessage}\n\n` +
|
|
232
|
-
`Hints:\n` +
|
|
233
|
-
` - Verify the URL is correct and the server is running\n` +
|
|
234
|
-
` - Check if authentication headers are required\n` +
|
|
235
|
-
` - Ensure the server supports MCP over HTTP`
|
|
236
|
-
)
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
const managedClient: ManagedHttpClient = {
|
|
240
|
-
client,
|
|
241
|
-
transport,
|
|
242
|
-
skillName: info.skillName,
|
|
243
|
-
lastUsedAt: Date.now(),
|
|
244
|
-
connectionType: "http",
|
|
245
|
-
}
|
|
246
|
-
this.clients.set(key, managedClient)
|
|
247
|
-
this.startCleanupTimer()
|
|
248
|
-
return client
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Create a stdio-based MCP client using StdioClientTransport.
|
|
253
|
-
* Spawns a local process and communicates via stdin/stdout.
|
|
254
|
-
*/
|
|
255
|
-
private async createStdioClient(
|
|
256
|
-
info: SkillMcpClientInfo,
|
|
257
|
-
config: ClaudeCodeMcpServer
|
|
258
|
-
): Promise<Client> {
|
|
259
|
-
const key = this.getClientKey(info)
|
|
260
|
-
|
|
261
|
-
if (!config.command) {
|
|
262
|
-
throw new Error(
|
|
263
|
-
`MCP server "${info.serverName}" is configured for stdio but missing 'command' field.`
|
|
264
|
-
)
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const command = config.command
|
|
268
|
-
const args = config.args || []
|
|
269
|
-
|
|
270
|
-
const mergedEnv = createCleanMcpEnvironment(config.env)
|
|
271
|
-
|
|
272
|
-
this.registerProcessCleanup()
|
|
273
|
-
|
|
274
|
-
const transport = new StdioClientTransport({
|
|
275
|
-
command,
|
|
276
|
-
args,
|
|
277
|
-
env: mergedEnv,
|
|
278
|
-
stderr: "ignore",
|
|
279
|
-
})
|
|
280
|
-
|
|
281
|
-
const client = new Client(
|
|
282
|
-
{ name: `skill-mcp-${info.skillName}-${info.serverName}`, version: "1.0.0" },
|
|
283
|
-
{ capabilities: {} }
|
|
284
|
-
)
|
|
285
|
-
|
|
286
|
-
try {
|
|
287
|
-
await client.connect(transport)
|
|
288
|
-
} catch (error) {
|
|
289
|
-
// Close transport to prevent orphaned MCP process on connection failure
|
|
290
|
-
try {
|
|
291
|
-
await transport.close()
|
|
292
|
-
} catch {
|
|
293
|
-
// Process may already be terminated
|
|
294
|
-
}
|
|
295
|
-
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
296
|
-
throw new Error(
|
|
297
|
-
`Failed to connect to MCP server "${info.serverName}".\n\n` +
|
|
298
|
-
`Command: ${command} ${args.join(" ")}\n` +
|
|
299
|
-
`Reason: ${errorMessage}\n\n` +
|
|
300
|
-
`Hints:\n` +
|
|
301
|
-
` - Ensure the command is installed and available in PATH\n` +
|
|
302
|
-
` - Check if the MCP server package exists\n` +
|
|
303
|
-
` - Verify the args are correct for this server`
|
|
304
|
-
)
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const managedClient: ManagedStdioClient = {
|
|
308
|
-
client,
|
|
309
|
-
transport,
|
|
310
|
-
skillName: info.skillName,
|
|
311
|
-
lastUsedAt: Date.now(),
|
|
312
|
-
connectionType: "stdio",
|
|
313
|
-
}
|
|
314
|
-
this.clients.set(key, managedClient)
|
|
315
|
-
this.startCleanupTimer()
|
|
316
|
-
return client
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
async disconnectSession(sessionID: string): Promise<void> {
|
|
320
|
-
const keysToRemove: string[] = []
|
|
321
|
-
|
|
322
|
-
for (const [key, managed] of this.clients.entries()) {
|
|
323
|
-
if (key.startsWith(`${sessionID}:`)) {
|
|
324
|
-
keysToRemove.push(key)
|
|
325
|
-
// Delete from map first to prevent re-entrancy during async close
|
|
326
|
-
this.clients.delete(key)
|
|
327
|
-
try {
|
|
328
|
-
await managed.client.close()
|
|
329
|
-
} catch {
|
|
330
|
-
// Ignore close errors - process may already be terminated
|
|
331
|
-
}
|
|
332
|
-
try {
|
|
333
|
-
await managed.transport.close()
|
|
334
|
-
} catch {
|
|
335
|
-
// Transport may already be terminated
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
async disconnectAll(): Promise<void> {
|
|
342
|
-
this.stopCleanupTimer()
|
|
343
|
-
const clients = Array.from(this.clients.values())
|
|
344
|
-
this.clients.clear()
|
|
345
|
-
for (const managed of clients) {
|
|
346
|
-
try {
|
|
347
|
-
await managed.client.close()
|
|
348
|
-
} catch { /* process may already be terminated */ }
|
|
349
|
-
try {
|
|
350
|
-
await managed.transport.close()
|
|
351
|
-
} catch { /* transport may already be terminated */ }
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
private startCleanupTimer(): void {
|
|
356
|
-
if (this.cleanupInterval) return
|
|
357
|
-
this.cleanupInterval = setInterval(() => {
|
|
358
|
-
this.cleanupIdleClients()
|
|
359
|
-
}, 60_000)
|
|
360
|
-
this.cleanupInterval.unref()
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
private stopCleanupTimer(): void {
|
|
364
|
-
if (this.cleanupInterval) {
|
|
365
|
-
clearInterval(this.cleanupInterval)
|
|
366
|
-
this.cleanupInterval = null
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
private async cleanupIdleClients(): Promise<void> {
|
|
371
|
-
const now = Date.now()
|
|
372
|
-
for (const [key, managed] of this.clients) {
|
|
373
|
-
if (now - managed.lastUsedAt > this.IDLE_TIMEOUT) {
|
|
374
|
-
this.clients.delete(key)
|
|
375
|
-
try {
|
|
376
|
-
await managed.client.close()
|
|
377
|
-
} catch { /* process may already be terminated */ }
|
|
378
|
-
try {
|
|
379
|
-
await managed.transport.close()
|
|
380
|
-
} catch { /* transport may already be terminated */ }
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
async listTools(
|
|
386
|
-
info: SkillMcpClientInfo,
|
|
387
|
-
context: SkillMcpServerContext
|
|
388
|
-
): Promise<Tool[]> {
|
|
389
|
-
const client = await this.getOrCreateClientWithRetry(info, context.config)
|
|
390
|
-
const result = await client.listTools()
|
|
391
|
-
return result.tools
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
async listResources(
|
|
395
|
-
info: SkillMcpClientInfo,
|
|
396
|
-
context: SkillMcpServerContext
|
|
397
|
-
): Promise<Resource[]> {
|
|
398
|
-
const client = await this.getOrCreateClientWithRetry(info, context.config)
|
|
399
|
-
const result = await client.listResources()
|
|
400
|
-
return result.resources
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
async listPrompts(
|
|
404
|
-
info: SkillMcpClientInfo,
|
|
405
|
-
context: SkillMcpServerContext
|
|
406
|
-
): Promise<Prompt[]> {
|
|
407
|
-
const client = await this.getOrCreateClientWithRetry(info, context.config)
|
|
408
|
-
const result = await client.listPrompts()
|
|
409
|
-
return result.prompts
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
async callTool(
|
|
413
|
-
info: SkillMcpClientInfo,
|
|
414
|
-
context: SkillMcpServerContext,
|
|
415
|
-
name: string,
|
|
416
|
-
args: Record<string, unknown>
|
|
417
|
-
): Promise<unknown> {
|
|
418
|
-
return this.withOperationRetry(info, context.config, async (client) => {
|
|
419
|
-
const result = await client.callTool({ name, arguments: args })
|
|
420
|
-
return result.content
|
|
421
|
-
})
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
async readResource(
|
|
425
|
-
info: SkillMcpClientInfo,
|
|
426
|
-
context: SkillMcpServerContext,
|
|
427
|
-
uri: string
|
|
428
|
-
): Promise<unknown> {
|
|
429
|
-
return this.withOperationRetry(info, context.config, async (client) => {
|
|
430
|
-
const result = await client.readResource({ uri })
|
|
431
|
-
return result.contents
|
|
432
|
-
})
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
async getPrompt(
|
|
436
|
-
info: SkillMcpClientInfo,
|
|
437
|
-
context: SkillMcpServerContext,
|
|
438
|
-
name: string,
|
|
439
|
-
args: Record<string, string>
|
|
440
|
-
): Promise<unknown> {
|
|
441
|
-
return this.withOperationRetry(info, context.config, async (client) => {
|
|
442
|
-
const result = await client.getPrompt({ name, arguments: args })
|
|
443
|
-
return result.messages
|
|
444
|
-
})
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
private async withOperationRetry<T>(
|
|
448
|
-
info: SkillMcpClientInfo,
|
|
449
|
-
config: ClaudeCodeMcpServer,
|
|
450
|
-
operation: (client: Client) => Promise<T>
|
|
451
|
-
): Promise<T> {
|
|
452
|
-
const maxRetries = 3
|
|
453
|
-
let lastError: Error | null = null
|
|
454
|
-
|
|
455
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
456
|
-
try {
|
|
457
|
-
const client = await this.getOrCreateClientWithRetry(info, config)
|
|
458
|
-
return await operation(client)
|
|
459
|
-
} catch (error) {
|
|
460
|
-
lastError = error instanceof Error ? error : new Error(String(error))
|
|
461
|
-
const errorMessage = lastError.message.toLowerCase()
|
|
462
|
-
|
|
463
|
-
if (!errorMessage.includes("not connected")) {
|
|
464
|
-
throw lastError
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
if (attempt === maxRetries) {
|
|
468
|
-
throw new Error(
|
|
469
|
-
`Failed after ${maxRetries} reconnection attempts: ${lastError.message}`
|
|
470
|
-
)
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
const key = this.getClientKey(info)
|
|
474
|
-
const existing = this.clients.get(key)
|
|
475
|
-
if (existing) {
|
|
476
|
-
this.clients.delete(key)
|
|
477
|
-
try {
|
|
478
|
-
await existing.client.close()
|
|
479
|
-
} catch { /* process may already be terminated */ }
|
|
480
|
-
try {
|
|
481
|
-
await existing.transport.close()
|
|
482
|
-
} catch { /* transport may already be terminated */ }
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
throw lastError || new Error("Operation failed with unknown error")
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
private async getOrCreateClientWithRetry(
|
|
491
|
-
info: SkillMcpClientInfo,
|
|
492
|
-
config: ClaudeCodeMcpServer
|
|
493
|
-
): Promise<Client> {
|
|
494
|
-
try {
|
|
495
|
-
return await this.getOrCreateClient(info, config)
|
|
496
|
-
} catch (error) {
|
|
497
|
-
const key = this.getClientKey(info)
|
|
498
|
-
const existing = this.clients.get(key)
|
|
499
|
-
if (existing) {
|
|
500
|
-
this.clients.delete(key)
|
|
501
|
-
try {
|
|
502
|
-
await existing.client.close()
|
|
503
|
-
} catch { /* process may already be terminated */ }
|
|
504
|
-
try {
|
|
505
|
-
await existing.transport.close()
|
|
506
|
-
} catch { /* transport may already be terminated */ }
|
|
507
|
-
return await this.getOrCreateClient(info, config)
|
|
508
|
-
}
|
|
509
|
-
throw error
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
getConnectedServers(): string[] {
|
|
514
|
-
return Array.from(this.clients.keys())
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
isConnected(info: SkillMcpClientInfo): boolean {
|
|
518
|
-
return this.clients.has(this.getClientKey(info))
|
|
519
|
-
}
|
|
520
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { ClaudeCodeMcpServer } from "../claude-code-mcp-loader/types"
|
|
2
|
-
|
|
3
|
-
export type SkillMcpConfig = Record<string, ClaudeCodeMcpServer>
|
|
4
|
-
|
|
5
|
-
export interface SkillMcpClientInfo {
|
|
6
|
-
serverName: string
|
|
7
|
-
skillName: string
|
|
8
|
-
sessionID: string
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface SkillMcpServerContext {
|
|
12
|
-
config: ClaudeCodeMcpServer
|
|
13
|
-
skillName: string
|
|
14
|
-
}
|