patchwork-os 0.2.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.bridge.md +352 -0
- package/README.md +72 -0
- package/deploy/README.md +172 -0
- package/deploy/bootstrap-new-vps.sh +364 -0
- package/deploy/claude-ide-bridge.service.template +67 -0
- package/deploy/claude-ide-bridge@.service +31 -0
- package/deploy/ecosystem.config.js.example +36 -0
- package/deploy/install-vps-service.sh +240 -0
- package/deploy/nginx-claude-bridge.conf.template +129 -0
- package/dist/activityLog.d.ts +112 -0
- package/dist/activityLog.js +399 -0
- package/dist/activityLog.js.map +1 -0
- package/dist/activityTypes.d.ts +28 -0
- package/dist/activityTypes.js +9 -0
- package/dist/activityTypes.js.map +1 -0
- package/dist/adapters/base.d.ts +78 -0
- package/dist/adapters/base.js +14 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude.d.ts +18 -0
- package/dist/adapters/claude.js +276 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/gemini.d.ts +17 -0
- package/dist/adapters/gemini.js +218 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/grok.d.ts +7 -0
- package/dist/adapters/grok.js +21 -0
- package/dist/adapters/grok.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.js +37 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/local.d.ts +7 -0
- package/dist/adapters/local.js +22 -0
- package/dist/adapters/local.js.map +1 -0
- package/dist/adapters/openai.d.ts +22 -0
- package/dist/adapters/openai.js +284 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/adapters/sse.d.ts +13 -0
- package/dist/adapters/sse.js +58 -0
- package/dist/adapters/sse.js.map +1 -0
- package/dist/analyticsAggregator.d.ts +28 -0
- package/dist/analyticsAggregator.js +133 -0
- package/dist/analyticsAggregator.js.map +1 -0
- package/dist/analyticsPrefs.d.ts +9 -0
- package/dist/analyticsPrefs.js +50 -0
- package/dist/analyticsPrefs.js.map +1 -0
- package/dist/analyticsSend.d.ts +12 -0
- package/dist/analyticsSend.js +34 -0
- package/dist/analyticsSend.js.map +1 -0
- package/dist/approvalHttp.d.ts +46 -0
- package/dist/approvalHttp.js +370 -0
- package/dist/approvalHttp.js.map +1 -0
- package/dist/approvalQueue.d.ts +49 -0
- package/dist/approvalQueue.js +84 -0
- package/dist/approvalQueue.js.map +1 -0
- package/dist/automation.d.ts +675 -0
- package/dist/automation.js +1038 -0
- package/dist/automation.js.map +1 -0
- package/dist/bridge.d.ts +85 -0
- package/dist/bridge.js +1535 -0
- package/dist/bridge.js.map +1 -0
- package/dist/bridgeLockDiscovery.d.ts +11 -0
- package/dist/bridgeLockDiscovery.js +49 -0
- package/dist/bridgeLockDiscovery.js.map +1 -0
- package/dist/bridgeToken.d.ts +22 -0
- package/dist/bridgeToken.js +114 -0
- package/dist/bridgeToken.js.map +1 -0
- package/dist/bridgeToolsRules.d.ts +20 -0
- package/dist/bridgeToolsRules.js +79 -0
- package/dist/bridgeToolsRules.js.map +1 -0
- package/dist/ccPermissions.d.ts +59 -0
- package/dist/ccPermissions.js +163 -0
- package/dist/ccPermissions.js.map +1 -0
- package/dist/claudeDriver.d.ts +129 -0
- package/dist/claudeDriver.js +459 -0
- package/dist/claudeDriver.js.map +1 -0
- package/dist/claudeMdPatch.d.ts +29 -0
- package/dist/claudeMdPatch.js +164 -0
- package/dist/claudeMdPatch.js.map +1 -0
- package/dist/claudeOrchestrator.d.ts +171 -0
- package/dist/claudeOrchestrator.js +591 -0
- package/dist/claudeOrchestrator.js.map +1 -0
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +158 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/marketplace.d.ts +11 -0
- package/dist/commands/marketplace.js +120 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/patchworkInit.d.ts +14 -0
- package/dist/commands/patchworkInit.js +155 -0
- package/dist/commands/patchworkInit.js.map +1 -0
- package/dist/commands/task.d.ts +14 -0
- package/dist/commands/task.js +289 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/tokenEfficiency.d.ts +9 -0
- package/dist/commands/tokenEfficiency.js +211 -0
- package/dist/commands/tokenEfficiency.js.map +1 -0
- package/dist/commands/tools.d.ts +28 -0
- package/dist/commands/tools.js +326 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commitIssueLinkLog.d.ts +77 -0
- package/dist/commitIssueLinkLog.js +142 -0
- package/dist/commitIssueLinkLog.js.map +1 -0
- package/dist/companions/registry.d.ts +12 -0
- package/dist/companions/registry.js +71 -0
- package/dist/companions/registry.js.map +1 -0
- package/dist/config.d.ts +105 -0
- package/dist/config.js +720 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto.d.ts +16 -0
- package/dist/crypto.js +34 -0
- package/dist/crypto.js.map +1 -0
- package/dist/dashboard.d.ts +12 -0
- package/dist/dashboard.js +149 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/decisionTraceLog.d.ts +77 -0
- package/dist/decisionTraceLog.js +147 -0
- package/dist/decisionTraceLog.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensionClient.d.ts +279 -0
- package/dist/extensionClient.js +1253 -0
- package/dist/extensionClient.js.map +1 -0
- package/dist/fileLock.d.ts +36 -0
- package/dist/fileLock.js +121 -0
- package/dist/fileLock.js.map +1 -0
- package/dist/fp/activityAnalytics.d.ts +39 -0
- package/dist/fp/activityAnalytics.js +111 -0
- package/dist/fp/activityAnalytics.js.map +1 -0
- package/dist/fp/async.d.ts +48 -0
- package/dist/fp/async.js +60 -0
- package/dist/fp/async.js.map +1 -0
- package/dist/fp/automationInterpreter.d.ts +37 -0
- package/dist/fp/automationInterpreter.js +523 -0
- package/dist/fp/automationInterpreter.js.map +1 -0
- package/dist/fp/automationProgram.d.ts +89 -0
- package/dist/fp/automationProgram.js +29 -0
- package/dist/fp/automationProgram.js.map +1 -0
- package/dist/fp/automationState.d.ts +135 -0
- package/dist/fp/automationState.js +206 -0
- package/dist/fp/automationState.js.map +1 -0
- package/dist/fp/automationUtils.d.ts +31 -0
- package/dist/fp/automationUtils.js +61 -0
- package/dist/fp/automationUtils.js.map +1 -0
- package/dist/fp/brandedTypes.d.ts +32 -0
- package/dist/fp/brandedTypes.js +41 -0
- package/dist/fp/brandedTypes.js.map +1 -0
- package/dist/fp/commandDescription.d.ts +18 -0
- package/dist/fp/commandDescription.js +125 -0
- package/dist/fp/commandDescription.js.map +1 -0
- package/dist/fp/extensionSnapshot.d.ts +10 -0
- package/dist/fp/extensionSnapshot.js +14 -0
- package/dist/fp/extensionSnapshot.js.map +1 -0
- package/dist/fp/index.d.ts +8 -0
- package/dist/fp/index.js +9 -0
- package/dist/fp/index.js.map +1 -0
- package/dist/fp/interpreterContext.d.ts +69 -0
- package/dist/fp/interpreterContext.js +56 -0
- package/dist/fp/interpreterContext.js.map +1 -0
- package/dist/fp/policyParser.d.ts +16 -0
- package/dist/fp/policyParser.js +334 -0
- package/dist/fp/policyParser.js.map +1 -0
- package/dist/fp/result.d.ts +38 -0
- package/dist/fp/result.js +57 -0
- package/dist/fp/result.js.map +1 -0
- package/dist/fp/tokenBucket.d.ts +27 -0
- package/dist/fp/tokenBucket.js +36 -0
- package/dist/fp/tokenBucket.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1465 -0
- package/dist/index.js.map +1 -0
- package/dist/instructionsUtils.d.ts +17 -0
- package/dist/instructionsUtils.js +38 -0
- package/dist/instructionsUtils.js.map +1 -0
- package/dist/lockfile.d.ts +16 -0
- package/dist/lockfile.js +172 -0
- package/dist/lockfile.js.map +1 -0
- package/dist/logger.d.ts +16 -0
- package/dist/logger.js +68 -0
- package/dist/logger.js.map +1 -0
- package/dist/oauth.d.ts +105 -0
- package/dist/oauth.js +880 -0
- package/dist/oauth.js.map +1 -0
- package/dist/orchestrator/childBridgeClient.d.ts +33 -0
- package/dist/orchestrator/childBridgeClient.js +321 -0
- package/dist/orchestrator/childBridgeClient.js.map +1 -0
- package/dist/orchestrator/childBridgeRegistry.d.ts +67 -0
- package/dist/orchestrator/childBridgeRegistry.js +297 -0
- package/dist/orchestrator/childBridgeRegistry.js.map +1 -0
- package/dist/orchestrator/index.d.ts +3 -0
- package/dist/orchestrator/index.js +3 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestratorBridge.d.ts +32 -0
- package/dist/orchestrator/orchestratorBridge.js +412 -0
- package/dist/orchestrator/orchestratorBridge.js.map +1 -0
- package/dist/orchestrator/orchestratorConfig.d.ts +11 -0
- package/dist/orchestrator/orchestratorConfig.js +85 -0
- package/dist/orchestrator/orchestratorConfig.js.map +1 -0
- package/dist/orchestrator/orchestratorTools.d.ts +16 -0
- package/dist/orchestrator/orchestratorTools.js +272 -0
- package/dist/orchestrator/orchestratorTools.js.map +1 -0
- package/dist/patchworkCli.d.ts +15 -0
- package/dist/patchworkCli.js +41 -0
- package/dist/patchworkCli.js.map +1 -0
- package/dist/patchworkConfig.d.ts +28 -0
- package/dist/patchworkConfig.js +30 -0
- package/dist/patchworkConfig.js.map +1 -0
- package/dist/plugin.d.ts +106 -0
- package/dist/plugin.js +31 -0
- package/dist/plugin.js.map +1 -0
- package/dist/pluginLoader.d.ts +44 -0
- package/dist/pluginLoader.js +357 -0
- package/dist/pluginLoader.js.map +1 -0
- package/dist/pluginWatcher.d.ts +24 -0
- package/dist/pluginWatcher.js +139 -0
- package/dist/pluginWatcher.js.map +1 -0
- package/dist/preToolUseHook.d.ts +10 -0
- package/dist/preToolUseHook.js +57 -0
- package/dist/preToolUseHook.js.map +1 -0
- package/dist/probe.d.ts +35 -0
- package/dist/probe.js +143 -0
- package/dist/probe.js.map +1 -0
- package/dist/prompts.d.ts +27 -0
- package/dist/prompts.js +1680 -0
- package/dist/prompts.js.map +1 -0
- package/dist/quickTaskPresets.d.ts +64 -0
- package/dist/quickTaskPresets.js +156 -0
- package/dist/quickTaskPresets.js.map +1 -0
- package/dist/recipes/compiler.d.ts +44 -0
- package/dist/recipes/compiler.js +140 -0
- package/dist/recipes/compiler.js.map +1 -0
- package/dist/recipes/installer.d.ts +25 -0
- package/dist/recipes/installer.js +62 -0
- package/dist/recipes/installer.js.map +1 -0
- package/dist/recipes/parser.d.ts +18 -0
- package/dist/recipes/parser.js +160 -0
- package/dist/recipes/parser.js.map +1 -0
- package/dist/recipes/scheduler.d.ts +45 -0
- package/dist/recipes/scheduler.js +110 -0
- package/dist/recipes/scheduler.js.map +1 -0
- package/dist/recipes/schema.d.ts +71 -0
- package/dist/recipes/schema.js +11 -0
- package/dist/recipes/schema.js.map +1 -0
- package/dist/recipesHttp.d.ts +63 -0
- package/dist/recipesHttp.js +183 -0
- package/dist/recipesHttp.js.map +1 -0
- package/dist/resources.d.ts +33 -0
- package/dist/resources.js +266 -0
- package/dist/resources.js.map +1 -0
- package/dist/riskTier.d.ts +40 -0
- package/dist/riskTier.js +142 -0
- package/dist/riskTier.js.map +1 -0
- package/dist/runLog.d.ts +90 -0
- package/dist/runLog.js +143 -0
- package/dist/runLog.js.map +1 -0
- package/dist/server.d.ts +160 -0
- package/dist/server.js +1244 -0
- package/dist/server.js.map +1 -0
- package/dist/sessionCheckpoint.d.ts +37 -0
- package/dist/sessionCheckpoint.js +123 -0
- package/dist/sessionCheckpoint.js.map +1 -0
- package/dist/streamableHttp.d.ts +86 -0
- package/dist/streamableHttp.js +702 -0
- package/dist/streamableHttp.js.map +1 -0
- package/dist/telemetry.d.ts +18 -0
- package/dist/telemetry.js +95 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tools/activityLog.d.ts +140 -0
- package/dist/tools/activityLog.js +204 -0
- package/dist/tools/activityLog.js.map +1 -0
- package/dist/tools/auditDependencies.d.ts +67 -0
- package/dist/tools/auditDependencies.js +298 -0
- package/dist/tools/auditDependencies.js.map +1 -0
- package/dist/tools/batchLsp.d.ts +262 -0
- package/dist/tools/batchLsp.js +328 -0
- package/dist/tools/batchLsp.js.map +1 -0
- package/dist/tools/blame-utils.d.ts +30 -0
- package/dist/tools/blame-utils.js +60 -0
- package/dist/tools/blame-utils.js.map +1 -0
- package/dist/tools/bridgeDoctor.d.ts +78 -0
- package/dist/tools/bridgeDoctor.js +542 -0
- package/dist/tools/bridgeDoctor.js.map +1 -0
- package/dist/tools/bridgeStatus.d.ts +122 -0
- package/dist/tools/bridgeStatus.js +250 -0
- package/dist/tools/bridgeStatus.js.map +1 -0
- package/dist/tools/cancelClaudeTask.d.ts +48 -0
- package/dist/tools/cancelClaudeTask.js +56 -0
- package/dist/tools/cancelClaudeTask.js.map +1 -0
- package/dist/tools/checkDocumentDirty.d.ts +56 -0
- package/dist/tools/checkDocumentDirty.js +74 -0
- package/dist/tools/checkDocumentDirty.js.map +1 -0
- package/dist/tools/clipboard.d.ts +80 -0
- package/dist/tools/clipboard.js +211 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/closeTabs.d.ts +84 -0
- package/dist/tools/closeTabs.js +97 -0
- package/dist/tools/closeTabs.js.map +1 -0
- package/dist/tools/codeLens.d.ts +50 -0
- package/dist/tools/codeLens.js +47 -0
- package/dist/tools/codeLens.js.map +1 -0
- package/dist/tools/contextBundle.d.ts +75 -0
- package/dist/tools/contextBundle.js +218 -0
- package/dist/tools/contextBundle.js.map +1 -0
- package/dist/tools/createIssueFromAIComment.d.ts +75 -0
- package/dist/tools/createIssueFromAIComment.js +119 -0
- package/dist/tools/createIssueFromAIComment.js.map +1 -0
- package/dist/tools/ctxGetTaskContext.d.ts +103 -0
- package/dist/tools/ctxGetTaskContext.js +274 -0
- package/dist/tools/ctxGetTaskContext.js.map +1 -0
- package/dist/tools/ctxQueryTraces.d.ts +142 -0
- package/dist/tools/ctxQueryTraces.js +194 -0
- package/dist/tools/ctxQueryTraces.js.map +1 -0
- package/dist/tools/ctxSaveTrace.d.ts +87 -0
- package/dist/tools/ctxSaveTrace.js +94 -0
- package/dist/tools/ctxSaveTrace.js.map +1 -0
- package/dist/tools/debug.d.ts +206 -0
- package/dist/tools/debug.js +234 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/decorations.d.ts +130 -0
- package/dist/tools/decorations.js +160 -0
- package/dist/tools/decorations.js.map +1 -0
- package/dist/tools/detectUnusedCode.d.ts +78 -0
- package/dist/tools/detectUnusedCode.js +173 -0
- package/dist/tools/detectUnusedCode.js.map +1 -0
- package/dist/tools/documentLinks.d.ts +62 -0
- package/dist/tools/documentLinks.js +55 -0
- package/dist/tools/documentLinks.js.map +1 -0
- package/dist/tools/editText.d.ts +108 -0
- package/dist/tools/editText.js +318 -0
- package/dist/tools/editText.js.map +1 -0
- package/dist/tools/enrichCommit.d.ts +89 -0
- package/dist/tools/enrichCommit.js +201 -0
- package/dist/tools/enrichCommit.js.map +1 -0
- package/dist/tools/enrichStackTrace.d.ts +121 -0
- package/dist/tools/enrichStackTrace.js +194 -0
- package/dist/tools/enrichStackTrace.js.map +1 -0
- package/dist/tools/explainDiagnostic.d.ts +137 -0
- package/dist/tools/explainDiagnostic.js +230 -0
- package/dist/tools/explainDiagnostic.js.map +1 -0
- package/dist/tools/explainSymbol.d.ts +119 -0
- package/dist/tools/explainSymbol.js +177 -0
- package/dist/tools/explainSymbol.js.map +1 -0
- package/dist/tools/fileOperations.d.ts +186 -0
- package/dist/tools/fileOperations.js +330 -0
- package/dist/tools/fileOperations.js.map +1 -0
- package/dist/tools/fileWatcher.d.ts +107 -0
- package/dist/tools/fileWatcher.js +121 -0
- package/dist/tools/fileWatcher.js.map +1 -0
- package/dist/tools/findFiles.d.ts +65 -0
- package/dist/tools/findFiles.js +142 -0
- package/dist/tools/findFiles.js.map +1 -0
- package/dist/tools/findRelatedTests.d.ts +83 -0
- package/dist/tools/findRelatedTests.js +196 -0
- package/dist/tools/findRelatedTests.js.map +1 -0
- package/dist/tools/fixAllLintErrors.d.ts +66 -0
- package/dist/tools/fixAllLintErrors.js +128 -0
- package/dist/tools/fixAllLintErrors.js.map +1 -0
- package/dist/tools/foldingRanges.d.ts +50 -0
- package/dist/tools/foldingRanges.js +51 -0
- package/dist/tools/foldingRanges.js.map +1 -0
- package/dist/tools/formatAndSave.d.ts +57 -0
- package/dist/tools/formatAndSave.js +87 -0
- package/dist/tools/formatAndSave.js.map +1 -0
- package/dist/tools/formatDocument.d.ts +61 -0
- package/dist/tools/formatDocument.js +144 -0
- package/dist/tools/formatDocument.js.map +1 -0
- package/dist/tools/generateAPIDocumentation.d.ts +62 -0
- package/dist/tools/generateAPIDocumentation.js +249 -0
- package/dist/tools/generateAPIDocumentation.js.map +1 -0
- package/dist/tools/generateTests.d.ts +75 -0
- package/dist/tools/generateTests.js +226 -0
- package/dist/tools/generateTests.js.map +1 -0
- package/dist/tools/getAIComments.d.ts +79 -0
- package/dist/tools/getAIComments.js +93 -0
- package/dist/tools/getAIComments.js.map +1 -0
- package/dist/tools/getAnalyticsReport.d.ts +102 -0
- package/dist/tools/getAnalyticsReport.js +137 -0
- package/dist/tools/getAnalyticsReport.js.map +1 -0
- package/dist/tools/getArchitectureContext.d.ts +85 -0
- package/dist/tools/getArchitectureContext.js +135 -0
- package/dist/tools/getArchitectureContext.js.map +1 -0
- package/dist/tools/getBufferContent.d.ts +80 -0
- package/dist/tools/getBufferContent.js +207 -0
- package/dist/tools/getBufferContent.js.map +1 -0
- package/dist/tools/getChangeImpact.d.ts +76 -0
- package/dist/tools/getChangeImpact.js +184 -0
- package/dist/tools/getChangeImpact.js.map +1 -0
- package/dist/tools/getClaudeTaskStatus.d.ts +87 -0
- package/dist/tools/getClaudeTaskStatus.js +89 -0
- package/dist/tools/getClaudeTaskStatus.js.map +1 -0
- package/dist/tools/getCodeCoverage.d.ts +86 -0
- package/dist/tools/getCodeCoverage.js +237 -0
- package/dist/tools/getCodeCoverage.js.map +1 -0
- package/dist/tools/getCommitsForIssue.d.ts +98 -0
- package/dist/tools/getCommitsForIssue.js +106 -0
- package/dist/tools/getCommitsForIssue.js.map +1 -0
- package/dist/tools/getCurrentSelection.d.ts +123 -0
- package/dist/tools/getCurrentSelection.js +113 -0
- package/dist/tools/getCurrentSelection.js.map +1 -0
- package/dist/tools/getDebugState.d.ts +140 -0
- package/dist/tools/getDebugState.js +109 -0
- package/dist/tools/getDebugState.js.map +1 -0
- package/dist/tools/getDependencyTree.d.ts +59 -0
- package/dist/tools/getDependencyTree.js +207 -0
- package/dist/tools/getDependencyTree.js.map +1 -0
- package/dist/tools/getDiagnostics.d.ts +108 -0
- package/dist/tools/getDiagnostics.js +371 -0
- package/dist/tools/getDiagnostics.js.map +1 -0
- package/dist/tools/getDiffFromHandoff.d.ts +89 -0
- package/dist/tools/getDiffFromHandoff.js +163 -0
- package/dist/tools/getDiffFromHandoff.js.map +1 -0
- package/dist/tools/getDocumentSymbols.d.ts +74 -0
- package/dist/tools/getDocumentSymbols.js +177 -0
- package/dist/tools/getDocumentSymbols.js.map +1 -0
- package/dist/tools/getFileTree.d.ts +66 -0
- package/dist/tools/getFileTree.js +131 -0
- package/dist/tools/getFileTree.js.map +1 -0
- package/dist/tools/getGitDiff.d.ts +50 -0
- package/dist/tools/getGitDiff.js +73 -0
- package/dist/tools/getGitDiff.js.map +1 -0
- package/dist/tools/getGitHotspots.d.ts +88 -0
- package/dist/tools/getGitHotspots.js +145 -0
- package/dist/tools/getGitHotspots.js.map +1 -0
- package/dist/tools/getGitLog.d.ts +62 -0
- package/dist/tools/getGitLog.js +87 -0
- package/dist/tools/getGitLog.js.map +1 -0
- package/dist/tools/getGitStatus.d.ts +72 -0
- package/dist/tools/getGitStatus.js +126 -0
- package/dist/tools/getGitStatus.js.map +1 -0
- package/dist/tools/getImportTree.d.ts +73 -0
- package/dist/tools/getImportTree.js +223 -0
- package/dist/tools/getImportTree.js.map +1 -0
- package/dist/tools/getImportedSignatures.d.ts +62 -0
- package/dist/tools/getImportedSignatures.js +255 -0
- package/dist/tools/getImportedSignatures.js.map +1 -0
- package/dist/tools/getOpenEditors.d.ts +62 -0
- package/dist/tools/getOpenEditors.js +126 -0
- package/dist/tools/getOpenEditors.js.map +1 -0
- package/dist/tools/getPRTemplate.d.ts +68 -0
- package/dist/tools/getPRTemplate.js +187 -0
- package/dist/tools/getPRTemplate.js.map +1 -0
- package/dist/tools/getProjectContext.d.ts +114 -0
- package/dist/tools/getProjectContext.js +344 -0
- package/dist/tools/getProjectContext.js.map +1 -0
- package/dist/tools/getProjectInfo.d.ts +51 -0
- package/dist/tools/getProjectInfo.js +325 -0
- package/dist/tools/getProjectInfo.js.map +1 -0
- package/dist/tools/getSecurityAdvisories.d.ts +105 -0
- package/dist/tools/getSecurityAdvisories.js +472 -0
- package/dist/tools/getSecurityAdvisories.js.map +1 -0
- package/dist/tools/getSessionUsage.d.ts +58 -0
- package/dist/tools/getSessionUsage.js +57 -0
- package/dist/tools/getSessionUsage.js.map +1 -0
- package/dist/tools/getSymbolHistory.d.ts +157 -0
- package/dist/tools/getSymbolHistory.js +256 -0
- package/dist/tools/getSymbolHistory.js.map +1 -0
- package/dist/tools/getToolCapabilities.d.ts +69 -0
- package/dist/tools/getToolCapabilities.js +298 -0
- package/dist/tools/getToolCapabilities.js.map +1 -0
- package/dist/tools/getTypeSignature.d.ts +70 -0
- package/dist/tools/getTypeSignature.js +132 -0
- package/dist/tools/getTypeSignature.js.map +1 -0
- package/dist/tools/getWorkspaceFolders.d.ts +58 -0
- package/dist/tools/getWorkspaceFolders.js +69 -0
- package/dist/tools/getWorkspaceFolders.js.map +1 -0
- package/dist/tools/getWorkspaceSettings.d.ts +44 -0
- package/dist/tools/getWorkspaceSettings.js +70 -0
- package/dist/tools/getWorkspaceSettings.js.map +1 -0
- package/dist/tools/git-utils.d.ts +16 -0
- package/dist/tools/git-utils.js +46 -0
- package/dist/tools/git-utils.js.map +1 -0
- package/dist/tools/gitHistory.d.ts +110 -0
- package/dist/tools/gitHistory.js +167 -0
- package/dist/tools/gitHistory.js.map +1 -0
- package/dist/tools/gitWrite.d.ts +612 -0
- package/dist/tools/gitWrite.js +983 -0
- package/dist/tools/gitWrite.js.map +1 -0
- package/dist/tools/github/actions.d.ts +152 -0
- package/dist/tools/github/actions.js +195 -0
- package/dist/tools/github/actions.js.map +1 -0
- package/dist/tools/github/index.d.ts +3 -0
- package/dist/tools/github/index.js +4 -0
- package/dist/tools/github/index.js.map +1 -0
- package/dist/tools/github/issues.d.ts +281 -0
- package/dist/tools/github/issues.js +340 -0
- package/dist/tools/github/issues.js.map +1 -0
- package/dist/tools/github/pr.d.ts +433 -0
- package/dist/tools/github/pr.js +588 -0
- package/dist/tools/github/pr.js.map +1 -0
- package/dist/tools/github/shared.d.ts +4 -0
- package/dist/tools/github/shared.js +12 -0
- package/dist/tools/github/shared.js.map +1 -0
- package/dist/tools/handoffNote.d.ts +106 -0
- package/dist/tools/handoffNote.js +232 -0
- package/dist/tools/handoffNote.js.map +1 -0
- package/dist/tools/headless/lspClient.d.ts +26 -0
- package/dist/tools/headless/lspClient.js +221 -0
- package/dist/tools/headless/lspClient.js.map +1 -0
- package/dist/tools/headless/lspFallback.d.ts +28 -0
- package/dist/tools/headless/lspFallback.js +122 -0
- package/dist/tools/headless/lspFallback.js.map +1 -0
- package/dist/tools/hoverAtCursor.d.ts +54 -0
- package/dist/tools/hoverAtCursor.js +68 -0
- package/dist/tools/hoverAtCursor.js.map +1 -0
- package/dist/tools/httpClient.d.ts +141 -0
- package/dist/tools/httpClient.js +486 -0
- package/dist/tools/httpClient.js.map +1 -0
- package/dist/tools/index.d.ts +49 -0
- package/dist/tools/index.js +672 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inlayHints.d.ts +81 -0
- package/dist/tools/inlayHints.js +76 -0
- package/dist/tools/inlayHints.js.map +1 -0
- package/dist/tools/issueRefs.d.ts +14 -0
- package/dist/tools/issueRefs.js +27 -0
- package/dist/tools/issueRefs.js.map +1 -0
- package/dist/tools/jumpToFirstError.d.ts +63 -0
- package/dist/tools/jumpToFirstError.js +124 -0
- package/dist/tools/jumpToFirstError.js.map +1 -0
- package/dist/tools/launchQuickTask.d.ts +76 -0
- package/dist/tools/launchQuickTask.js +170 -0
- package/dist/tools/launchQuickTask.js.map +1 -0
- package/dist/tools/linters/biome.d.ts +2 -0
- package/dist/tools/linters/biome.js +44 -0
- package/dist/tools/linters/biome.js.map +1 -0
- package/dist/tools/linters/cargo.d.ts +2 -0
- package/dist/tools/linters/cargo.js +45 -0
- package/dist/tools/linters/cargo.js.map +1 -0
- package/dist/tools/linters/eslint.d.ts +2 -0
- package/dist/tools/linters/eslint.js +59 -0
- package/dist/tools/linters/eslint.js.map +1 -0
- package/dist/tools/linters/govet.d.ts +2 -0
- package/dist/tools/linters/govet.js +37 -0
- package/dist/tools/linters/govet.js.map +1 -0
- package/dist/tools/linters/pyright.d.ts +2 -0
- package/dist/tools/linters/pyright.js +34 -0
- package/dist/tools/linters/pyright.js.map +1 -0
- package/dist/tools/linters/ruff.d.ts +2 -0
- package/dist/tools/linters/ruff.js +30 -0
- package/dist/tools/linters/ruff.js.map +1 -0
- package/dist/tools/linters/types.d.ts +16 -0
- package/dist/tools/linters/types.js +2 -0
- package/dist/tools/linters/types.js.map +1 -0
- package/dist/tools/linters/typescript.d.ts +2 -0
- package/dist/tools/linters/typescript.js +38 -0
- package/dist/tools/linters/typescript.js.map +1 -0
- package/dist/tools/listClaudeTasks.d.ts +84 -0
- package/dist/tools/listClaudeTasks.js +88 -0
- package/dist/tools/listClaudeTasks.js.map +1 -0
- package/dist/tools/listTerminals.d.ts +55 -0
- package/dist/tools/listTerminals.js +78 -0
- package/dist/tools/listTerminals.js.map +1 -0
- package/dist/tools/lsp.d.ts +1086 -0
- package/dist/tools/lsp.js +1339 -0
- package/dist/tools/lsp.js.map +1 -0
- package/dist/tools/navigateToSymbolByName.d.ts +56 -0
- package/dist/tools/navigateToSymbolByName.js +170 -0
- package/dist/tools/navigateToSymbolByName.js.map +1 -0
- package/dist/tools/openDiff.d.ts +66 -0
- package/dist/tools/openDiff.js +126 -0
- package/dist/tools/openDiff.js.map +1 -0
- package/dist/tools/openFile.d.ts +69 -0
- package/dist/tools/openFile.js +129 -0
- package/dist/tools/openFile.js.map +1 -0
- package/dist/tools/openInBrowser.d.ts +55 -0
- package/dist/tools/openInBrowser.js +129 -0
- package/dist/tools/openInBrowser.js.map +1 -0
- package/dist/tools/organizeImports.d.ts +56 -0
- package/dist/tools/organizeImports.js +115 -0
- package/dist/tools/organizeImports.js.map +1 -0
- package/dist/tools/performanceReport.d.ts +133 -0
- package/dist/tools/performanceReport.js +218 -0
- package/dist/tools/performanceReport.js.map +1 -0
- package/dist/tools/planPersistence.d.ts +306 -0
- package/dist/tools/planPersistence.js +485 -0
- package/dist/tools/planPersistence.js.map +1 -0
- package/dist/tools/previewEdit.d.ts +107 -0
- package/dist/tools/previewEdit.js +270 -0
- package/dist/tools/previewEdit.js.map +1 -0
- package/dist/tools/recentTracesDigest.d.ts +35 -0
- package/dist/tools/recentTracesDigest.js +98 -0
- package/dist/tools/recentTracesDigest.js.map +1 -0
- package/dist/tools/refactorAnalyze.d.ts +78 -0
- package/dist/tools/refactorAnalyze.js +141 -0
- package/dist/tools/refactorAnalyze.js.map +1 -0
- package/dist/tools/refactorExtractFunction.d.ts +52 -0
- package/dist/tools/refactorExtractFunction.js +121 -0
- package/dist/tools/refactorExtractFunction.js.map +1 -0
- package/dist/tools/refactorPreview.d.ts +75 -0
- package/dist/tools/refactorPreview.js +93 -0
- package/dist/tools/refactorPreview.js.map +1 -0
- package/dist/tools/replaceBlock.d.ts +62 -0
- package/dist/tools/replaceBlock.js +125 -0
- package/dist/tools/replaceBlock.js.map +1 -0
- package/dist/tools/resumeClaudeTask.d.ts +75 -0
- package/dist/tools/resumeClaudeTask.js +149 -0
- package/dist/tools/resumeClaudeTask.js.map +1 -0
- package/dist/tools/runClaudeTask.d.ts +97 -0
- package/dist/tools/runClaudeTask.js +224 -0
- package/dist/tools/runClaudeTask.js.map +1 -0
- package/dist/tools/runCommand.d.ts +82 -0
- package/dist/tools/runCommand.js +101 -0
- package/dist/tools/runCommand.js.map +1 -0
- package/dist/tools/runTests.d.ts +146 -0
- package/dist/tools/runTests.js +315 -0
- package/dist/tools/runTests.js.map +1 -0
- package/dist/tools/saveDocument.d.ts +50 -0
- package/dist/tools/saveDocument.js +73 -0
- package/dist/tools/saveDocument.js.map +1 -0
- package/dist/tools/screenshot.d.ts +23 -0
- package/dist/tools/screenshot.js +43 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/screenshotAndAnnotate.d.ts +103 -0
- package/dist/tools/screenshotAndAnnotate.js +192 -0
- package/dist/tools/screenshotAndAnnotate.js.map +1 -0
- package/dist/tools/searchAndReplace.d.ts +108 -0
- package/dist/tools/searchAndReplace.js +281 -0
- package/dist/tools/searchAndReplace.js.map +1 -0
- package/dist/tools/searchTools.d.ts +61 -0
- package/dist/tools/searchTools.js +85 -0
- package/dist/tools/searchTools.js.map +1 -0
- package/dist/tools/searchWorkspace.d.ts +99 -0
- package/dist/tools/searchWorkspace.js +189 -0
- package/dist/tools/searchWorkspace.js.map +1 -0
- package/dist/tools/selectionRanges.d.ts +58 -0
- package/dist/tools/selectionRanges.js +61 -0
- package/dist/tools/selectionRanges.js.map +1 -0
- package/dist/tools/semanticTokens.d.ts +87 -0
- package/dist/tools/semanticTokens.js +86 -0
- package/dist/tools/semanticTokens.js.map +1 -0
- package/dist/tools/setActiveWorkspaceFolder.d.ts +41 -0
- package/dist/tools/setActiveWorkspaceFolder.js +38 -0
- package/dist/tools/setActiveWorkspaceFolder.js.map +1 -0
- package/dist/tools/signatureHelp.d.ts +86 -0
- package/dist/tools/signatureHelp.js +79 -0
- package/dist/tools/signatureHelp.js.map +1 -0
- package/dist/tools/spawnWorkspace.d.ts +103 -0
- package/dist/tools/spawnWorkspace.js +268 -0
- package/dist/tools/spawnWorkspace.js.map +1 -0
- package/dist/tools/stackTraceParser.d.ts +43 -0
- package/dist/tools/stackTraceParser.js +139 -0
- package/dist/tools/stackTraceParser.js.map +1 -0
- package/dist/tools/terminal.d.ts +352 -0
- package/dist/tools/terminal.js +670 -0
- package/dist/tools/terminal.js.map +1 -0
- package/dist/tools/testRunners/cargoTest.d.ts +2 -0
- package/dist/tools/testRunners/cargoTest.js +129 -0
- package/dist/tools/testRunners/cargoTest.js.map +1 -0
- package/dist/tools/testRunners/goTest.d.ts +2 -0
- package/dist/tools/testRunners/goTest.js +108 -0
- package/dist/tools/testRunners/goTest.js.map +1 -0
- package/dist/tools/testRunners/pytest.d.ts +2 -0
- package/dist/tools/testRunners/pytest.js +135 -0
- package/dist/tools/testRunners/pytest.js.map +1 -0
- package/dist/tools/testRunners/types.d.ts +18 -0
- package/dist/tools/testRunners/types.js +2 -0
- package/dist/tools/testRunners/types.js.map +1 -0
- package/dist/tools/testRunners/vitestJest.d.ts +3 -0
- package/dist/tools/testRunners/vitestJest.js +215 -0
- package/dist/tools/testRunners/vitestJest.js.map +1 -0
- package/dist/tools/testTraceToSource.d.ts +80 -0
- package/dist/tools/testTraceToSource.js +206 -0
- package/dist/tools/testTraceToSource.js.map +1 -0
- package/dist/tools/transaction.d.ts +243 -0
- package/dist/tools/transaction.js +309 -0
- package/dist/tools/transaction.js.map +1 -0
- package/dist/tools/typeHierarchy.d.ts +77 -0
- package/dist/tools/typeHierarchy.js +86 -0
- package/dist/tools/typeHierarchy.js.map +1 -0
- package/dist/tools/utils.d.ts +124 -0
- package/dist/tools/utils.js +566 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/vscodeCommands.d.ts +90 -0
- package/dist/tools/vscodeCommands.js +112 -0
- package/dist/tools/vscodeCommands.js.map +1 -0
- package/dist/tools/vscodeTasks.d.ts +102 -0
- package/dist/tools/vscodeTasks.js +110 -0
- package/dist/tools/vscodeTasks.js.map +1 -0
- package/dist/tools/watchDiagnostics.d.ts +64 -0
- package/dist/tools/watchDiagnostics.js +270 -0
- package/dist/tools/watchDiagnostics.js.map +1 -0
- package/dist/tools/workspaceSettings.d.ts +57 -0
- package/dist/tools/workspaceSettings.js +80 -0
- package/dist/tools/workspaceSettings.js.map +1 -0
- package/dist/transport.d.ts +207 -0
- package/dist/transport.js +1272 -0
- package/dist/transport.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.js +31 -0
- package/dist/version.js.map +1 -0
- package/dist/wsUtils.d.ts +8 -0
- package/dist/wsUtils.js +54 -0
- package/dist/wsUtils.js.map +1 -0
- package/package.json +118 -0
- package/scripts/gen-claude-desktop-config.sh +124 -0
- package/scripts/gen-mcp-config.sh +390 -0
- package/scripts/install-extension.sh +106 -0
- package/scripts/mcp-stdio-shim.cjs +482 -0
- package/scripts/postinstall.mjs +68 -0
- package/scripts/start-all.sh +502 -0
- package/scripts/start-orchestrator.sh +186 -0
- package/scripts/start-remote.sh +126 -0
- package/scripts/start-vps.sh +116 -0
- package/templates/CLAUDE.bridge.md +125 -0
- package/templates/automation-policies/security-first.json +46 -0
- package/templates/automation-policies/strict-lint.json +41 -0
- package/templates/automation-policies/test-driven.json +54 -0
- package/templates/automation-policy.example.json +105 -0
- package/templates/bridge-tools.md +111 -0
- package/templates/dispatch-context.md +33 -0
- package/templates/managed-agent/code-review-agent.md +50 -0
- package/templates/managed-agent/managed-agent-mcp.json +102 -0
- package/templates/recipes/ambient-journal.yaml +11 -0
- package/templates/recipes/daily-status.yaml +21 -0
- package/templates/recipes/lint-on-save.yaml +13 -0
- package/templates/recipes/stale-branches.yaml +18 -0
- package/templates/recipes/watch-failing-tests.yaml +15 -0
- package/templates/scheduled-tasks/dependency-audit/SKILL.md +77 -0
- package/templates/scheduled-tasks/health-check/SKILL.md +73 -0
- package/templates/scheduled-tasks/nightly-review/SKILL.md +69 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* mcp-stdio-shim.js — Connect to a running claude-ide-bridge via WebSocket,
|
|
4
|
+
* relaying MCP JSON-RPC messages between stdio and the bridge.
|
|
5
|
+
*
|
|
6
|
+
* Usage (auto-discover from lock file — normal .mcp.json usage):
|
|
7
|
+
* node scripts/mcp-stdio-shim.js
|
|
8
|
+
*
|
|
9
|
+
* Usage (explicit port + token):
|
|
10
|
+
* node scripts/mcp-stdio-shim.js <port> <authToken>
|
|
11
|
+
* WARNING: authToken passed as argv is visible in `ps aux` / process listings.
|
|
12
|
+
* Prefer the lock-file discovery mode (no args) which reads the token from disk.
|
|
13
|
+
*
|
|
14
|
+
* This shim is used by .mcp.json so Claude Code connects to the ALREADY-RUNNING
|
|
15
|
+
* bridge instead of spawning a new one. This prevents extension oscillation when
|
|
16
|
+
* both start-all.sh and a remote Claude Code session are active.
|
|
17
|
+
*
|
|
18
|
+
* Lock-file watcher: when the bridge restarts on a new port, the shim detects
|
|
19
|
+
* the new lock file via fs.watch and reconnects automatically — no need to
|
|
20
|
+
* restart Claude Desktop or the MCP client.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
"use strict";
|
|
24
|
+
|
|
25
|
+
const fs = require("node:fs");
|
|
26
|
+
const os = require("node:os");
|
|
27
|
+
const path = require("node:path");
|
|
28
|
+
const { randomUUID } = require("node:crypto");
|
|
29
|
+
|
|
30
|
+
// Resolve ws from the bridge's own node_modules (script lives in scripts/)
|
|
31
|
+
const { WebSocket } = require(path.join(__dirname, "..", "node_modules", "ws"));
|
|
32
|
+
|
|
33
|
+
function findLockFile() {
|
|
34
|
+
const lockDir = path.join(
|
|
35
|
+
process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude"),
|
|
36
|
+
"ide",
|
|
37
|
+
);
|
|
38
|
+
// Three-tier preference: orchestrator > bridge > any lock (each by newest mtime).
|
|
39
|
+
// Orchestrator locks win because child bridge restarts produce newer lock files,
|
|
40
|
+
// which would hijack the shim away from the orchestrator if we only used mtime.
|
|
41
|
+
let orchestratorLock = null;
|
|
42
|
+
let orchestratorMtime = 0;
|
|
43
|
+
let bridgeLock = null;
|
|
44
|
+
let bridgeMtime = 0;
|
|
45
|
+
let fallbackLock = null;
|
|
46
|
+
let fallbackMtime = 0;
|
|
47
|
+
try {
|
|
48
|
+
for (const f of fs.readdirSync(lockDir)) {
|
|
49
|
+
if (!f.endsWith(".lock")) continue;
|
|
50
|
+
const fullPath = path.join(lockDir, f);
|
|
51
|
+
try {
|
|
52
|
+
const stat = fs.statSync(fullPath);
|
|
53
|
+
let isBridge = false;
|
|
54
|
+
let isOrchestrator = false;
|
|
55
|
+
try {
|
|
56
|
+
const data = JSON.parse(fs.readFileSync(fullPath, "utf8"));
|
|
57
|
+
isBridge = data.isBridge === true;
|
|
58
|
+
isOrchestrator = data.orchestrator === true;
|
|
59
|
+
} catch {
|
|
60
|
+
// unparseable — treat as non-bridge
|
|
61
|
+
}
|
|
62
|
+
if (isOrchestrator) {
|
|
63
|
+
if (stat.mtimeMs > orchestratorMtime) {
|
|
64
|
+
orchestratorMtime = stat.mtimeMs;
|
|
65
|
+
orchestratorLock = fullPath;
|
|
66
|
+
}
|
|
67
|
+
} else if (isBridge) {
|
|
68
|
+
if (stat.mtimeMs > bridgeMtime) {
|
|
69
|
+
bridgeMtime = stat.mtimeMs;
|
|
70
|
+
bridgeLock = fullPath;
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
if (stat.mtimeMs > fallbackMtime) {
|
|
74
|
+
fallbackMtime = stat.mtimeMs;
|
|
75
|
+
fallbackLock = fullPath;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
} catch {
|
|
79
|
+
// skip unreadable files
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
// lock dir doesn't exist
|
|
84
|
+
}
|
|
85
|
+
// Prefer orchestrator > bridge > fallback (each newest mtime within tier)
|
|
86
|
+
return orchestratorLock ?? bridgeLock ?? fallbackLock;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function parseLock(lockPath) {
|
|
90
|
+
const raw = fs.readFileSync(lockPath, "utf8");
|
|
91
|
+
const data = JSON.parse(raw);
|
|
92
|
+
const port = Number(path.basename(lockPath, ".lock"));
|
|
93
|
+
// Note: lock type (orchestrator / bridge / fallback) is NOT returned here —
|
|
94
|
+
// only { port, authToken } are extracted. findLockFile() enforces tier priority
|
|
95
|
+
// before this is called, so all three call sites (startPoll, scheduleReconnect,
|
|
96
|
+
// initial startup) are safe. If parseLock is ever called on an arbitrary path
|
|
97
|
+
// the caller will be blind to whether it is connecting to an orchestrator, a
|
|
98
|
+
// child bridge, or an IDE-owned lock — and will connect regardless.
|
|
99
|
+
return { port, authToken: data.authToken };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// --- State ---
|
|
103
|
+
// Stable session identity for this shim process. Sent as X-Claude-Code-Session-Id
|
|
104
|
+
// on every connection attempt so the bridge can reattach to the same session
|
|
105
|
+
// during its grace period instead of creating a new one.
|
|
106
|
+
const CLIENT_SESSION_ID = randomUUID();
|
|
107
|
+
let ws = null;
|
|
108
|
+
let currentPort = null;
|
|
109
|
+
let hasConnectedSuccessfully = false; // true after first successful ws open
|
|
110
|
+
let buffer = "";
|
|
111
|
+
const pendingLines = [];
|
|
112
|
+
let reconnectTimer = null;
|
|
113
|
+
let pollTimer = null;
|
|
114
|
+
const RECONNECT_DEBOUNCE_MS = 500;
|
|
115
|
+
const POLL_INTERVAL_MS = 3000; // fallback poll when disconnected
|
|
116
|
+
const MAX_PENDING_LINES = 1000;
|
|
117
|
+
|
|
118
|
+
// Backoff state — differentiated retry delays by error category
|
|
119
|
+
// After MAX_UNREACHABLE_MS of consecutive ECONNREFUSED/429 errors the shim
|
|
120
|
+
// switches to passive poll mode rather than exiting — it auto-recovers when
|
|
121
|
+
// the bridge restarts without requiring the user to click "Reconnect" in the
|
|
122
|
+
// MCP panel. Override with SHIM_MAX_UNREACHABLE_MS env var (ms).
|
|
123
|
+
const MAX_UNREACHABLE_MS =
|
|
124
|
+
Number(process.env.SHIM_MAX_UNREACHABLE_MS) || 5 * 60 * 1000;
|
|
125
|
+
let firstUnreachableAt = 0; // epoch ms of first consecutive failure in current streak
|
|
126
|
+
let currentBackoffMs = 0; // 0 = not in a backoff sequence
|
|
127
|
+
let backoffTimer = null; // pending setTimeout for next reconnect attempt
|
|
128
|
+
|
|
129
|
+
// --- Backoff helpers ---
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Returns the next retry delay (ms) for a given error category and mutates
|
|
133
|
+
* currentBackoffMs so successive calls produce exponential growth.
|
|
134
|
+
*
|
|
135
|
+
* Categories:
|
|
136
|
+
* "429" – rate-limited: start 1s, double, cap 30s, full jitter
|
|
137
|
+
* "unreachable" – ECONNREFUSED / ETIMEDOUT: start 1s, double, cap 30s
|
|
138
|
+
* "other" – falls back to flat POLL_INTERVAL_MS
|
|
139
|
+
*/
|
|
140
|
+
function nextBackoffMs(errorType) {
|
|
141
|
+
if (errorType === "other") {
|
|
142
|
+
currentBackoffMs = 0;
|
|
143
|
+
return POLL_INTERVAL_MS;
|
|
144
|
+
}
|
|
145
|
+
const CAP_MS = 30_000;
|
|
146
|
+
currentBackoffMs =
|
|
147
|
+
currentBackoffMs === 0 ? 1000 : Math.min(currentBackoffMs * 2, CAP_MS);
|
|
148
|
+
// Full jitter for 429 (avoids thundering herd on a recovering bridge)
|
|
149
|
+
return errorType === "429"
|
|
150
|
+
? Math.floor(Math.random() * currentBackoffMs)
|
|
151
|
+
: currentBackoffMs;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function resetBackoff() {
|
|
155
|
+
currentBackoffMs = 0;
|
|
156
|
+
firstUnreachableAt = 0;
|
|
157
|
+
if (backoffTimer) {
|
|
158
|
+
clearTimeout(backoffTimer);
|
|
159
|
+
backoffTimer = null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Schedule a reconnect attempt after a computed backoff delay.
|
|
165
|
+
* Replaces any pending backoffTimer. Does NOT call startPoll().
|
|
166
|
+
*/
|
|
167
|
+
function scheduleBackoffReconnect(errorType) {
|
|
168
|
+
if (backoffTimer) clearTimeout(backoffTimer);
|
|
169
|
+
const delay = nextBackoffMs(errorType);
|
|
170
|
+
process.stderr.write(
|
|
171
|
+
`mcp-stdio-shim: Will retry in ${Math.round(delay / 1000)}s (reason: ${errorType}).\n`,
|
|
172
|
+
);
|
|
173
|
+
backoffTimer = setTimeout(() => {
|
|
174
|
+
backoffTimer = null;
|
|
175
|
+
const lockFile = findLockFile();
|
|
176
|
+
if (!lockFile) {
|
|
177
|
+
startPoll();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
let parsed;
|
|
181
|
+
try {
|
|
182
|
+
parsed = parseLock(lockFile);
|
|
183
|
+
} catch {
|
|
184
|
+
startPoll();
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
connect(parsed.port, parsed.authToken);
|
|
188
|
+
}, delay);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// --- Explicit args (bypass auto-discover and watcher) ---
|
|
192
|
+
const explicitPort =
|
|
193
|
+
process.argv[2] && process.argv[3] ? Number(process.argv[2]) : null;
|
|
194
|
+
const explicitToken = process.argv[3] ?? null;
|
|
195
|
+
|
|
196
|
+
function flushPending() {
|
|
197
|
+
while (pendingLines.length > 0 && ws && ws.readyState === WebSocket.OPEN) {
|
|
198
|
+
ws.send(pendingLines.shift());
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function connect(port, authToken) {
|
|
203
|
+
const isReconnect = currentPort !== null;
|
|
204
|
+
if (ws) {
|
|
205
|
+
try {
|
|
206
|
+
ws.terminate();
|
|
207
|
+
} catch {
|
|
208
|
+
/* ignore */
|
|
209
|
+
}
|
|
210
|
+
ws = null;
|
|
211
|
+
}
|
|
212
|
+
currentPort = port;
|
|
213
|
+
const wsUrl = `ws://127.0.0.1:${port}`;
|
|
214
|
+
process.stderr.write(`mcp-stdio-shim: Connecting to bridge at ${wsUrl}\n`);
|
|
215
|
+
|
|
216
|
+
ws = new WebSocket(wsUrl, {
|
|
217
|
+
headers: {
|
|
218
|
+
"x-claude-code-ide-authorization": authToken,
|
|
219
|
+
// Stable per-process ID — lets the bridge resume the same session during
|
|
220
|
+
// its grace period rather than starting a fresh MCP handshake each time.
|
|
221
|
+
"x-claude-code-session-id": CLIENT_SESSION_ID,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
// Per-connect flag: set when the error handler classifies this attempt as 429
|
|
226
|
+
// so the close handler knows not to call startPoll() and instead backs off.
|
|
227
|
+
let lastErrorWas429 = false;
|
|
228
|
+
|
|
229
|
+
ws.on("error", (err) => {
|
|
230
|
+
const code = err.code; // e.g. "ECONNREFUSED", "ETIMEDOUT", or undefined
|
|
231
|
+
process.stderr.write(
|
|
232
|
+
`mcp-stdio-shim: WebSocket error [${code ?? "unknown"}]: ${err.message}\n`,
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
if (explicitPort !== null) {
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (code === "ECONNREFUSED" || code === "ETIMEDOUT") {
|
|
240
|
+
if (firstUnreachableAt === 0) firstUnreachableAt = Date.now();
|
|
241
|
+
if (Date.now() - firstUnreachableAt > MAX_UNREACHABLE_MS) {
|
|
242
|
+
// Don't exit — switch to passive polling so we auto-recover when the
|
|
243
|
+
// bridge restarts (e.g. after a crash with --watch, or a sleep/wake cycle).
|
|
244
|
+
// The lock-dir watcher (below) fires immediately on bridge restart; this
|
|
245
|
+
// poll loop covers the edge case where the watcher missed the event.
|
|
246
|
+
process.stderr.write(
|
|
247
|
+
"mcp-stdio-shim: Bridge unreachable for >5 minutes — switching to passive reconnect mode.\n",
|
|
248
|
+
);
|
|
249
|
+
firstUnreachableAt = Date.now(); // reset streak to avoid repeated log spam
|
|
250
|
+
currentBackoffMs = 0; // reset backoff so next connect attempt is prompt
|
|
251
|
+
startPoll();
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
scheduleBackoffReconnect("unreachable");
|
|
255
|
+
} else if (err.message?.includes("429")) {
|
|
256
|
+
lastErrorWas429 = true;
|
|
257
|
+
if (firstUnreachableAt === 0) firstUnreachableAt = Date.now();
|
|
258
|
+
if (Date.now() - firstUnreachableAt > MAX_UNREACHABLE_MS) {
|
|
259
|
+
process.stderr.write(
|
|
260
|
+
"mcp-stdio-shim: Bridge rate-limiting for >5 minutes — switching to passive reconnect mode.\n",
|
|
261
|
+
);
|
|
262
|
+
firstUnreachableAt = Date.now();
|
|
263
|
+
currentBackoffMs = 0;
|
|
264
|
+
startPoll();
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
scheduleBackoffReconnect("429");
|
|
268
|
+
} else if (
|
|
269
|
+
err.message &&
|
|
270
|
+
(err.message.includes("401") || err.message.includes("403"))
|
|
271
|
+
) {
|
|
272
|
+
process.stderr.write(
|
|
273
|
+
"mcp-stdio-shim: Auth failure (401/403) — exiting.\n",
|
|
274
|
+
);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
277
|
+
// Other errors fall through to the close handler
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
ws.on("close", (code, reason) => {
|
|
281
|
+
const reasonStr = reason?.toString() || "";
|
|
282
|
+
process.stderr.write(
|
|
283
|
+
`mcp-stdio-shim: Connection closed (${code} ${reasonStr})\n`,
|
|
284
|
+
);
|
|
285
|
+
if (explicitPort !== null) process.exit(0);
|
|
286
|
+
|
|
287
|
+
// Auth rejected — exit immediately, retrying will not help
|
|
288
|
+
if (code === 4001) {
|
|
289
|
+
process.stderr.write(
|
|
290
|
+
"mcp-stdio-shim: Authorization rejected (4001) — token mismatch. Exiting.\n",
|
|
291
|
+
);
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// If the error handler already scheduled a backoff reconnect, don't also start polling
|
|
296
|
+
if (backoffTimer) return;
|
|
297
|
+
|
|
298
|
+
// 1006 = abnormal closure (often accompanies a 429 rejection before handshake)
|
|
299
|
+
if (lastErrorWas429) {
|
|
300
|
+
scheduleBackoffReconnect("429");
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Normal closure or other codes: resume flat polling (existing behavior)
|
|
305
|
+
startPoll();
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// Bridge → stdout (one JSON-RPC message per line)
|
|
309
|
+
ws.on("message", (data) => {
|
|
310
|
+
process.stdout.write(`${data.toString()}\n`);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
ws.on("open", () => {
|
|
314
|
+
process.stderr.write("mcp-stdio-shim: Connected.\n");
|
|
315
|
+
stopPoll();
|
|
316
|
+
resetBackoff();
|
|
317
|
+
// On reconnect (after a prior successful connection), drop stale pending messages —
|
|
318
|
+
// they reference old session state (e.g. the previous initialize handshake) and must
|
|
319
|
+
// not be replayed. A failed first attempt does NOT count — pendingLines must be kept
|
|
320
|
+
// so the initialize message can be flushed to the new bridge session.
|
|
321
|
+
if (isReconnect && hasConnectedSuccessfully) pendingLines.length = 0;
|
|
322
|
+
hasConnectedSuccessfully = true;
|
|
323
|
+
flushPending();
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function stopPoll() {
|
|
328
|
+
if (pollTimer) {
|
|
329
|
+
clearInterval(pollTimer);
|
|
330
|
+
pollTimer = null;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function startPoll() {
|
|
335
|
+
if (pollTimer) return; // already polling
|
|
336
|
+
pollTimer = setInterval(() => {
|
|
337
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
338
|
+
stopPoll();
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const lockFile = findLockFile();
|
|
342
|
+
if (!lockFile) return;
|
|
343
|
+
let parsed;
|
|
344
|
+
try {
|
|
345
|
+
parsed = parseLock(lockFile);
|
|
346
|
+
} catch {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
process.stderr.write(
|
|
350
|
+
`mcp-stdio-shim: Poll found bridge on port ${parsed.port} — reconnecting.\n`,
|
|
351
|
+
);
|
|
352
|
+
connect(parsed.port, parsed.authToken);
|
|
353
|
+
}, POLL_INTERVAL_MS);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// --- Initial connection ---
|
|
357
|
+
if (explicitPort !== null) {
|
|
358
|
+
connect(explicitPort, explicitToken);
|
|
359
|
+
} else {
|
|
360
|
+
const lockFile = findLockFile();
|
|
361
|
+
if (!lockFile) {
|
|
362
|
+
process.stderr.write(
|
|
363
|
+
"mcp-stdio-shim: No bridge lock file found — waiting for bridge to start.\n",
|
|
364
|
+
);
|
|
365
|
+
// Poll until a lock file appears (bridge may still be starting up)
|
|
366
|
+
startPoll();
|
|
367
|
+
} else {
|
|
368
|
+
let parsed;
|
|
369
|
+
try {
|
|
370
|
+
parsed = parseLock(lockFile);
|
|
371
|
+
} catch (err) {
|
|
372
|
+
process.stderr.write(
|
|
373
|
+
`mcp-stdio-shim: Failed to parse lock file: ${err.message}\n`,
|
|
374
|
+
);
|
|
375
|
+
process.exit(1);
|
|
376
|
+
}
|
|
377
|
+
connect(parsed.port, parsed.authToken);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// --- Lock-file watcher (auto-discover mode only) ---
|
|
382
|
+
// Watches ~/.claude/ide/ for .lock file changes. When a new bridge lock appears
|
|
383
|
+
// on a different port, reconnects automatically. This means Claude Desktop never
|
|
384
|
+
// needs to be restarted when the bridge restarts on a new port.
|
|
385
|
+
if (explicitPort === null) {
|
|
386
|
+
const lockDir = path.join(
|
|
387
|
+
process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude"),
|
|
388
|
+
"ide",
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
const scheduleReconnect = () => {
|
|
392
|
+
if (reconnectTimer) clearTimeout(reconnectTimer);
|
|
393
|
+
reconnectTimer = setTimeout(() => {
|
|
394
|
+
reconnectTimer = null;
|
|
395
|
+
const lockFile = findLockFile();
|
|
396
|
+
if (!lockFile) return;
|
|
397
|
+
let parsed;
|
|
398
|
+
try {
|
|
399
|
+
parsed = parseLock(lockFile);
|
|
400
|
+
} catch {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const wsNotOpen = !ws || ws.readyState !== WebSocket.OPEN;
|
|
404
|
+
if (parsed.port !== currentPort || wsNotOpen) {
|
|
405
|
+
process.stderr.write(
|
|
406
|
+
`mcp-stdio-shim: New bridge on port ${parsed.port} — reconnecting.\n`,
|
|
407
|
+
);
|
|
408
|
+
connect(parsed.port, parsed.authToken);
|
|
409
|
+
}
|
|
410
|
+
}, RECONNECT_DEBOUNCE_MS);
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
try {
|
|
414
|
+
fs.watch(lockDir, (_event, filename) => {
|
|
415
|
+
if (filename?.endsWith(".lock")) {
|
|
416
|
+
scheduleReconnect();
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
} catch {
|
|
420
|
+
// Lock dir not watchable — non-fatal, shim still works without auto-reconnect
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// --- stdin → bridge (newline-delimited JSON-RPC) ---
|
|
425
|
+
// Messages that arrive before the WebSocket is open are queued and flushed on connect.
|
|
426
|
+
process.stdin.setEncoding("utf8");
|
|
427
|
+
process.stdin.on("data", (chunk) => {
|
|
428
|
+
buffer += chunk;
|
|
429
|
+
const lines = buffer.split("\n");
|
|
430
|
+
buffer = lines.pop() ?? "";
|
|
431
|
+
for (const line of lines) {
|
|
432
|
+
const trimmed = line.trim();
|
|
433
|
+
if (!trimmed) continue;
|
|
434
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
435
|
+
try {
|
|
436
|
+
ws.send(trimmed);
|
|
437
|
+
} catch (sendErr) {
|
|
438
|
+
process.stderr.write(
|
|
439
|
+
`mcp-stdio-shim: ws.send failed (${sendErr.message}) — queuing message.\n`,
|
|
440
|
+
);
|
|
441
|
+
if (pendingLines.length < MAX_PENDING_LINES) {
|
|
442
|
+
pendingLines.push(trimmed);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
} else if (pendingLines.length < MAX_PENDING_LINES) {
|
|
446
|
+
pendingLines.push(trimmed);
|
|
447
|
+
} else {
|
|
448
|
+
process.stderr.write(
|
|
449
|
+
`mcp-stdio-shim: pendingLines overflow (${MAX_PENDING_LINES}) — dropping message (bridge not connected)\n`,
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
process.stdin.on("end", () => {
|
|
456
|
+
if (ws) {
|
|
457
|
+
try {
|
|
458
|
+
ws.close();
|
|
459
|
+
} catch {
|
|
460
|
+
/* ignore */
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
process.exit(0);
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
process.stdin.on("error", (err) => {
|
|
467
|
+
// EPIPE / ERR_STREAM_DESTROYED means the MCP host closed the pipe — clean shutdown.
|
|
468
|
+
if (err.code === "EPIPE" || err.code === "ERR_STREAM_DESTROYED") {
|
|
469
|
+
process.stderr.write(
|
|
470
|
+
`mcp-stdio-shim: stdin closed (${err.code}) — shutting down.\n`,
|
|
471
|
+
);
|
|
472
|
+
if (ws) {
|
|
473
|
+
try {
|
|
474
|
+
ws.close();
|
|
475
|
+
} catch {
|
|
476
|
+
/* ignore */
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
process.exit(0);
|
|
480
|
+
}
|
|
481
|
+
process.stderr.write(`mcp-stdio-shim: stdin error: ${err.message}\n`);
|
|
482
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* postinstall.mjs — wire up optional local binaries into node_modules/.bin
|
|
4
|
+
* so that probeAll() can discover them via the standard local-bin lookup.
|
|
5
|
+
*
|
|
6
|
+
* Currently handles:
|
|
7
|
+
* @vscode/ripgrep → node_modules/.bin/rg
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
chmodSync,
|
|
12
|
+
existsSync,
|
|
13
|
+
mkdirSync,
|
|
14
|
+
symlinkSync,
|
|
15
|
+
unlinkSync,
|
|
16
|
+
} from "node:fs";
|
|
17
|
+
import { createRequire } from "node:module";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import { fileURLToPath } from "node:url";
|
|
20
|
+
|
|
21
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
const root = path.join(__dirname, "..");
|
|
23
|
+
const binDir = path.join(root, "node_modules", ".bin");
|
|
24
|
+
const require = createRequire(import.meta.url);
|
|
25
|
+
|
|
26
|
+
function linkBin(pkgName, binaryName, linkName = binaryName) {
|
|
27
|
+
try {
|
|
28
|
+
const pkg = require(`${pkgName}/package.json`);
|
|
29
|
+
// Try common binary locations
|
|
30
|
+
const candidates = [
|
|
31
|
+
path.join(root, "node_modules", pkgName, "bin", binaryName),
|
|
32
|
+
path.join(root, "node_modules", pkgName, binaryName),
|
|
33
|
+
];
|
|
34
|
+
// Also check the package's bin field
|
|
35
|
+
if (pkg.bin) {
|
|
36
|
+
const binEntry =
|
|
37
|
+
typeof pkg.bin === "string" ? pkg.bin : pkg.bin[binaryName];
|
|
38
|
+
if (binEntry) {
|
|
39
|
+
candidates.unshift(path.join(root, "node_modules", pkgName, binEntry));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const src = candidates.find(existsSync);
|
|
43
|
+
if (!src) {
|
|
44
|
+
console.log(` skip ${linkName}: ${pkgName} binary not found`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
mkdirSync(binDir, { recursive: true });
|
|
48
|
+
const dest = path.join(binDir, linkName);
|
|
49
|
+
if (existsSync(dest)) {
|
|
50
|
+
unlinkSync(dest);
|
|
51
|
+
}
|
|
52
|
+
symlinkSync(src, dest);
|
|
53
|
+
console.log(` linked ${linkName} → ${path.relative(root, src)}`);
|
|
54
|
+
} catch {
|
|
55
|
+
// Package not installed — silently skip
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Ensure the CLI entry point is executable (npm unpack strips +x on some systems)
|
|
60
|
+
try {
|
|
61
|
+
chmodSync(path.join(root, "dist", "index.js"), 0o755);
|
|
62
|
+
} catch {
|
|
63
|
+
// Non-POSIX systems (Windows) — silently skip
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
console.log("[postinstall] Linking optional local binaries...");
|
|
67
|
+
linkBin("@vscode/ripgrep", "rg");
|
|
68
|
+
console.log("[postinstall] Done.");
|