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.
Files changed (721) hide show
  1. package/LICENSE +21 -0
  2. package/README.bridge.md +352 -0
  3. package/README.md +72 -0
  4. package/deploy/README.md +172 -0
  5. package/deploy/bootstrap-new-vps.sh +364 -0
  6. package/deploy/claude-ide-bridge.service.template +67 -0
  7. package/deploy/claude-ide-bridge@.service +31 -0
  8. package/deploy/ecosystem.config.js.example +36 -0
  9. package/deploy/install-vps-service.sh +240 -0
  10. package/deploy/nginx-claude-bridge.conf.template +129 -0
  11. package/dist/activityLog.d.ts +112 -0
  12. package/dist/activityLog.js +399 -0
  13. package/dist/activityLog.js.map +1 -0
  14. package/dist/activityTypes.d.ts +28 -0
  15. package/dist/activityTypes.js +9 -0
  16. package/dist/activityTypes.js.map +1 -0
  17. package/dist/adapters/base.d.ts +78 -0
  18. package/dist/adapters/base.js +14 -0
  19. package/dist/adapters/base.js.map +1 -0
  20. package/dist/adapters/claude.d.ts +18 -0
  21. package/dist/adapters/claude.js +276 -0
  22. package/dist/adapters/claude.js.map +1 -0
  23. package/dist/adapters/gemini.d.ts +17 -0
  24. package/dist/adapters/gemini.js +218 -0
  25. package/dist/adapters/gemini.js.map +1 -0
  26. package/dist/adapters/grok.d.ts +7 -0
  27. package/dist/adapters/grok.js +21 -0
  28. package/dist/adapters/grok.js.map +1 -0
  29. package/dist/adapters/index.d.ts +5 -0
  30. package/dist/adapters/index.js +37 -0
  31. package/dist/adapters/index.js.map +1 -0
  32. package/dist/adapters/local.d.ts +7 -0
  33. package/dist/adapters/local.js +22 -0
  34. package/dist/adapters/local.js.map +1 -0
  35. package/dist/adapters/openai.d.ts +22 -0
  36. package/dist/adapters/openai.js +284 -0
  37. package/dist/adapters/openai.js.map +1 -0
  38. package/dist/adapters/sse.d.ts +13 -0
  39. package/dist/adapters/sse.js +58 -0
  40. package/dist/adapters/sse.js.map +1 -0
  41. package/dist/analyticsAggregator.d.ts +28 -0
  42. package/dist/analyticsAggregator.js +133 -0
  43. package/dist/analyticsAggregator.js.map +1 -0
  44. package/dist/analyticsPrefs.d.ts +9 -0
  45. package/dist/analyticsPrefs.js +50 -0
  46. package/dist/analyticsPrefs.js.map +1 -0
  47. package/dist/analyticsSend.d.ts +12 -0
  48. package/dist/analyticsSend.js +34 -0
  49. package/dist/analyticsSend.js.map +1 -0
  50. package/dist/approvalHttp.d.ts +46 -0
  51. package/dist/approvalHttp.js +370 -0
  52. package/dist/approvalHttp.js.map +1 -0
  53. package/dist/approvalQueue.d.ts +49 -0
  54. package/dist/approvalQueue.js +84 -0
  55. package/dist/approvalQueue.js.map +1 -0
  56. package/dist/automation.d.ts +675 -0
  57. package/dist/automation.js +1038 -0
  58. package/dist/automation.js.map +1 -0
  59. package/dist/bridge.d.ts +85 -0
  60. package/dist/bridge.js +1535 -0
  61. package/dist/bridge.js.map +1 -0
  62. package/dist/bridgeLockDiscovery.d.ts +11 -0
  63. package/dist/bridgeLockDiscovery.js +49 -0
  64. package/dist/bridgeLockDiscovery.js.map +1 -0
  65. package/dist/bridgeToken.d.ts +22 -0
  66. package/dist/bridgeToken.js +114 -0
  67. package/dist/bridgeToken.js.map +1 -0
  68. package/dist/bridgeToolsRules.d.ts +20 -0
  69. package/dist/bridgeToolsRules.js +79 -0
  70. package/dist/bridgeToolsRules.js.map +1 -0
  71. package/dist/ccPermissions.d.ts +59 -0
  72. package/dist/ccPermissions.js +163 -0
  73. package/dist/ccPermissions.js.map +1 -0
  74. package/dist/claudeDriver.d.ts +129 -0
  75. package/dist/claudeDriver.js +459 -0
  76. package/dist/claudeDriver.js.map +1 -0
  77. package/dist/claudeMdPatch.d.ts +29 -0
  78. package/dist/claudeMdPatch.js +164 -0
  79. package/dist/claudeMdPatch.js.map +1 -0
  80. package/dist/claudeOrchestrator.d.ts +171 -0
  81. package/dist/claudeOrchestrator.js +591 -0
  82. package/dist/claudeOrchestrator.js.map +1 -0
  83. package/dist/commands/install.d.ts +1 -0
  84. package/dist/commands/install.js +158 -0
  85. package/dist/commands/install.js.map +1 -0
  86. package/dist/commands/marketplace.d.ts +11 -0
  87. package/dist/commands/marketplace.js +120 -0
  88. package/dist/commands/marketplace.js.map +1 -0
  89. package/dist/commands/patchworkInit.d.ts +14 -0
  90. package/dist/commands/patchworkInit.js +155 -0
  91. package/dist/commands/patchworkInit.js.map +1 -0
  92. package/dist/commands/task.d.ts +14 -0
  93. package/dist/commands/task.js +289 -0
  94. package/dist/commands/task.js.map +1 -0
  95. package/dist/commands/tokenEfficiency.d.ts +9 -0
  96. package/dist/commands/tokenEfficiency.js +211 -0
  97. package/dist/commands/tokenEfficiency.js.map +1 -0
  98. package/dist/commands/tools.d.ts +28 -0
  99. package/dist/commands/tools.js +326 -0
  100. package/dist/commands/tools.js.map +1 -0
  101. package/dist/commitIssueLinkLog.d.ts +77 -0
  102. package/dist/commitIssueLinkLog.js +142 -0
  103. package/dist/commitIssueLinkLog.js.map +1 -0
  104. package/dist/companions/registry.d.ts +12 -0
  105. package/dist/companions/registry.js +71 -0
  106. package/dist/companions/registry.js.map +1 -0
  107. package/dist/config.d.ts +105 -0
  108. package/dist/config.js +720 -0
  109. package/dist/config.js.map +1 -0
  110. package/dist/crypto.d.ts +16 -0
  111. package/dist/crypto.js +34 -0
  112. package/dist/crypto.js.map +1 -0
  113. package/dist/dashboard.d.ts +12 -0
  114. package/dist/dashboard.js +149 -0
  115. package/dist/dashboard.js.map +1 -0
  116. package/dist/decisionTraceLog.d.ts +77 -0
  117. package/dist/decisionTraceLog.js +147 -0
  118. package/dist/decisionTraceLog.js.map +1 -0
  119. package/dist/errors.d.ts +32 -0
  120. package/dist/errors.js +34 -0
  121. package/dist/errors.js.map +1 -0
  122. package/dist/extensionClient.d.ts +279 -0
  123. package/dist/extensionClient.js +1253 -0
  124. package/dist/extensionClient.js.map +1 -0
  125. package/dist/fileLock.d.ts +36 -0
  126. package/dist/fileLock.js +121 -0
  127. package/dist/fileLock.js.map +1 -0
  128. package/dist/fp/activityAnalytics.d.ts +39 -0
  129. package/dist/fp/activityAnalytics.js +111 -0
  130. package/dist/fp/activityAnalytics.js.map +1 -0
  131. package/dist/fp/async.d.ts +48 -0
  132. package/dist/fp/async.js +60 -0
  133. package/dist/fp/async.js.map +1 -0
  134. package/dist/fp/automationInterpreter.d.ts +37 -0
  135. package/dist/fp/automationInterpreter.js +523 -0
  136. package/dist/fp/automationInterpreter.js.map +1 -0
  137. package/dist/fp/automationProgram.d.ts +89 -0
  138. package/dist/fp/automationProgram.js +29 -0
  139. package/dist/fp/automationProgram.js.map +1 -0
  140. package/dist/fp/automationState.d.ts +135 -0
  141. package/dist/fp/automationState.js +206 -0
  142. package/dist/fp/automationState.js.map +1 -0
  143. package/dist/fp/automationUtils.d.ts +31 -0
  144. package/dist/fp/automationUtils.js +61 -0
  145. package/dist/fp/automationUtils.js.map +1 -0
  146. package/dist/fp/brandedTypes.d.ts +32 -0
  147. package/dist/fp/brandedTypes.js +41 -0
  148. package/dist/fp/brandedTypes.js.map +1 -0
  149. package/dist/fp/commandDescription.d.ts +18 -0
  150. package/dist/fp/commandDescription.js +125 -0
  151. package/dist/fp/commandDescription.js.map +1 -0
  152. package/dist/fp/extensionSnapshot.d.ts +10 -0
  153. package/dist/fp/extensionSnapshot.js +14 -0
  154. package/dist/fp/extensionSnapshot.js.map +1 -0
  155. package/dist/fp/index.d.ts +8 -0
  156. package/dist/fp/index.js +9 -0
  157. package/dist/fp/index.js.map +1 -0
  158. package/dist/fp/interpreterContext.d.ts +69 -0
  159. package/dist/fp/interpreterContext.js +56 -0
  160. package/dist/fp/interpreterContext.js.map +1 -0
  161. package/dist/fp/policyParser.d.ts +16 -0
  162. package/dist/fp/policyParser.js +334 -0
  163. package/dist/fp/policyParser.js.map +1 -0
  164. package/dist/fp/result.d.ts +38 -0
  165. package/dist/fp/result.js +57 -0
  166. package/dist/fp/result.js.map +1 -0
  167. package/dist/fp/tokenBucket.d.ts +27 -0
  168. package/dist/fp/tokenBucket.js +36 -0
  169. package/dist/fp/tokenBucket.js.map +1 -0
  170. package/dist/index.d.ts +2 -0
  171. package/dist/index.js +1465 -0
  172. package/dist/index.js.map +1 -0
  173. package/dist/instructionsUtils.d.ts +17 -0
  174. package/dist/instructionsUtils.js +38 -0
  175. package/dist/instructionsUtils.js.map +1 -0
  176. package/dist/lockfile.d.ts +16 -0
  177. package/dist/lockfile.js +172 -0
  178. package/dist/lockfile.js.map +1 -0
  179. package/dist/logger.d.ts +16 -0
  180. package/dist/logger.js +68 -0
  181. package/dist/logger.js.map +1 -0
  182. package/dist/oauth.d.ts +105 -0
  183. package/dist/oauth.js +880 -0
  184. package/dist/oauth.js.map +1 -0
  185. package/dist/orchestrator/childBridgeClient.d.ts +33 -0
  186. package/dist/orchestrator/childBridgeClient.js +321 -0
  187. package/dist/orchestrator/childBridgeClient.js.map +1 -0
  188. package/dist/orchestrator/childBridgeRegistry.d.ts +67 -0
  189. package/dist/orchestrator/childBridgeRegistry.js +297 -0
  190. package/dist/orchestrator/childBridgeRegistry.js.map +1 -0
  191. package/dist/orchestrator/index.d.ts +3 -0
  192. package/dist/orchestrator/index.js +3 -0
  193. package/dist/orchestrator/index.js.map +1 -0
  194. package/dist/orchestrator/orchestratorBridge.d.ts +32 -0
  195. package/dist/orchestrator/orchestratorBridge.js +412 -0
  196. package/dist/orchestrator/orchestratorBridge.js.map +1 -0
  197. package/dist/orchestrator/orchestratorConfig.d.ts +11 -0
  198. package/dist/orchestrator/orchestratorConfig.js +85 -0
  199. package/dist/orchestrator/orchestratorConfig.js.map +1 -0
  200. package/dist/orchestrator/orchestratorTools.d.ts +16 -0
  201. package/dist/orchestrator/orchestratorTools.js +272 -0
  202. package/dist/orchestrator/orchestratorTools.js.map +1 -0
  203. package/dist/patchworkCli.d.ts +15 -0
  204. package/dist/patchworkCli.js +41 -0
  205. package/dist/patchworkCli.js.map +1 -0
  206. package/dist/patchworkConfig.d.ts +28 -0
  207. package/dist/patchworkConfig.js +30 -0
  208. package/dist/patchworkConfig.js.map +1 -0
  209. package/dist/plugin.d.ts +106 -0
  210. package/dist/plugin.js +31 -0
  211. package/dist/plugin.js.map +1 -0
  212. package/dist/pluginLoader.d.ts +44 -0
  213. package/dist/pluginLoader.js +357 -0
  214. package/dist/pluginLoader.js.map +1 -0
  215. package/dist/pluginWatcher.d.ts +24 -0
  216. package/dist/pluginWatcher.js +139 -0
  217. package/dist/pluginWatcher.js.map +1 -0
  218. package/dist/preToolUseHook.d.ts +10 -0
  219. package/dist/preToolUseHook.js +57 -0
  220. package/dist/preToolUseHook.js.map +1 -0
  221. package/dist/probe.d.ts +35 -0
  222. package/dist/probe.js +143 -0
  223. package/dist/probe.js.map +1 -0
  224. package/dist/prompts.d.ts +27 -0
  225. package/dist/prompts.js +1680 -0
  226. package/dist/prompts.js.map +1 -0
  227. package/dist/quickTaskPresets.d.ts +64 -0
  228. package/dist/quickTaskPresets.js +156 -0
  229. package/dist/quickTaskPresets.js.map +1 -0
  230. package/dist/recipes/compiler.d.ts +44 -0
  231. package/dist/recipes/compiler.js +140 -0
  232. package/dist/recipes/compiler.js.map +1 -0
  233. package/dist/recipes/installer.d.ts +25 -0
  234. package/dist/recipes/installer.js +62 -0
  235. package/dist/recipes/installer.js.map +1 -0
  236. package/dist/recipes/parser.d.ts +18 -0
  237. package/dist/recipes/parser.js +160 -0
  238. package/dist/recipes/parser.js.map +1 -0
  239. package/dist/recipes/scheduler.d.ts +45 -0
  240. package/dist/recipes/scheduler.js +110 -0
  241. package/dist/recipes/scheduler.js.map +1 -0
  242. package/dist/recipes/schema.d.ts +71 -0
  243. package/dist/recipes/schema.js +11 -0
  244. package/dist/recipes/schema.js.map +1 -0
  245. package/dist/recipesHttp.d.ts +63 -0
  246. package/dist/recipesHttp.js +183 -0
  247. package/dist/recipesHttp.js.map +1 -0
  248. package/dist/resources.d.ts +33 -0
  249. package/dist/resources.js +266 -0
  250. package/dist/resources.js.map +1 -0
  251. package/dist/riskTier.d.ts +40 -0
  252. package/dist/riskTier.js +142 -0
  253. package/dist/riskTier.js.map +1 -0
  254. package/dist/runLog.d.ts +90 -0
  255. package/dist/runLog.js +143 -0
  256. package/dist/runLog.js.map +1 -0
  257. package/dist/server.d.ts +160 -0
  258. package/dist/server.js +1244 -0
  259. package/dist/server.js.map +1 -0
  260. package/dist/sessionCheckpoint.d.ts +37 -0
  261. package/dist/sessionCheckpoint.js +123 -0
  262. package/dist/sessionCheckpoint.js.map +1 -0
  263. package/dist/streamableHttp.d.ts +86 -0
  264. package/dist/streamableHttp.js +702 -0
  265. package/dist/streamableHttp.js.map +1 -0
  266. package/dist/telemetry.d.ts +18 -0
  267. package/dist/telemetry.js +95 -0
  268. package/dist/telemetry.js.map +1 -0
  269. package/dist/tools/activityLog.d.ts +140 -0
  270. package/dist/tools/activityLog.js +204 -0
  271. package/dist/tools/activityLog.js.map +1 -0
  272. package/dist/tools/auditDependencies.d.ts +67 -0
  273. package/dist/tools/auditDependencies.js +298 -0
  274. package/dist/tools/auditDependencies.js.map +1 -0
  275. package/dist/tools/batchLsp.d.ts +262 -0
  276. package/dist/tools/batchLsp.js +328 -0
  277. package/dist/tools/batchLsp.js.map +1 -0
  278. package/dist/tools/blame-utils.d.ts +30 -0
  279. package/dist/tools/blame-utils.js +60 -0
  280. package/dist/tools/blame-utils.js.map +1 -0
  281. package/dist/tools/bridgeDoctor.d.ts +78 -0
  282. package/dist/tools/bridgeDoctor.js +542 -0
  283. package/dist/tools/bridgeDoctor.js.map +1 -0
  284. package/dist/tools/bridgeStatus.d.ts +122 -0
  285. package/dist/tools/bridgeStatus.js +250 -0
  286. package/dist/tools/bridgeStatus.js.map +1 -0
  287. package/dist/tools/cancelClaudeTask.d.ts +48 -0
  288. package/dist/tools/cancelClaudeTask.js +56 -0
  289. package/dist/tools/cancelClaudeTask.js.map +1 -0
  290. package/dist/tools/checkDocumentDirty.d.ts +56 -0
  291. package/dist/tools/checkDocumentDirty.js +74 -0
  292. package/dist/tools/checkDocumentDirty.js.map +1 -0
  293. package/dist/tools/clipboard.d.ts +80 -0
  294. package/dist/tools/clipboard.js +211 -0
  295. package/dist/tools/clipboard.js.map +1 -0
  296. package/dist/tools/closeTabs.d.ts +84 -0
  297. package/dist/tools/closeTabs.js +97 -0
  298. package/dist/tools/closeTabs.js.map +1 -0
  299. package/dist/tools/codeLens.d.ts +50 -0
  300. package/dist/tools/codeLens.js +47 -0
  301. package/dist/tools/codeLens.js.map +1 -0
  302. package/dist/tools/contextBundle.d.ts +75 -0
  303. package/dist/tools/contextBundle.js +218 -0
  304. package/dist/tools/contextBundle.js.map +1 -0
  305. package/dist/tools/createIssueFromAIComment.d.ts +75 -0
  306. package/dist/tools/createIssueFromAIComment.js +119 -0
  307. package/dist/tools/createIssueFromAIComment.js.map +1 -0
  308. package/dist/tools/ctxGetTaskContext.d.ts +103 -0
  309. package/dist/tools/ctxGetTaskContext.js +274 -0
  310. package/dist/tools/ctxGetTaskContext.js.map +1 -0
  311. package/dist/tools/ctxQueryTraces.d.ts +142 -0
  312. package/dist/tools/ctxQueryTraces.js +194 -0
  313. package/dist/tools/ctxQueryTraces.js.map +1 -0
  314. package/dist/tools/ctxSaveTrace.d.ts +87 -0
  315. package/dist/tools/ctxSaveTrace.js +94 -0
  316. package/dist/tools/ctxSaveTrace.js.map +1 -0
  317. package/dist/tools/debug.d.ts +206 -0
  318. package/dist/tools/debug.js +234 -0
  319. package/dist/tools/debug.js.map +1 -0
  320. package/dist/tools/decorations.d.ts +130 -0
  321. package/dist/tools/decorations.js +160 -0
  322. package/dist/tools/decorations.js.map +1 -0
  323. package/dist/tools/detectUnusedCode.d.ts +78 -0
  324. package/dist/tools/detectUnusedCode.js +173 -0
  325. package/dist/tools/detectUnusedCode.js.map +1 -0
  326. package/dist/tools/documentLinks.d.ts +62 -0
  327. package/dist/tools/documentLinks.js +55 -0
  328. package/dist/tools/documentLinks.js.map +1 -0
  329. package/dist/tools/editText.d.ts +108 -0
  330. package/dist/tools/editText.js +318 -0
  331. package/dist/tools/editText.js.map +1 -0
  332. package/dist/tools/enrichCommit.d.ts +89 -0
  333. package/dist/tools/enrichCommit.js +201 -0
  334. package/dist/tools/enrichCommit.js.map +1 -0
  335. package/dist/tools/enrichStackTrace.d.ts +121 -0
  336. package/dist/tools/enrichStackTrace.js +194 -0
  337. package/dist/tools/enrichStackTrace.js.map +1 -0
  338. package/dist/tools/explainDiagnostic.d.ts +137 -0
  339. package/dist/tools/explainDiagnostic.js +230 -0
  340. package/dist/tools/explainDiagnostic.js.map +1 -0
  341. package/dist/tools/explainSymbol.d.ts +119 -0
  342. package/dist/tools/explainSymbol.js +177 -0
  343. package/dist/tools/explainSymbol.js.map +1 -0
  344. package/dist/tools/fileOperations.d.ts +186 -0
  345. package/dist/tools/fileOperations.js +330 -0
  346. package/dist/tools/fileOperations.js.map +1 -0
  347. package/dist/tools/fileWatcher.d.ts +107 -0
  348. package/dist/tools/fileWatcher.js +121 -0
  349. package/dist/tools/fileWatcher.js.map +1 -0
  350. package/dist/tools/findFiles.d.ts +65 -0
  351. package/dist/tools/findFiles.js +142 -0
  352. package/dist/tools/findFiles.js.map +1 -0
  353. package/dist/tools/findRelatedTests.d.ts +83 -0
  354. package/dist/tools/findRelatedTests.js +196 -0
  355. package/dist/tools/findRelatedTests.js.map +1 -0
  356. package/dist/tools/fixAllLintErrors.d.ts +66 -0
  357. package/dist/tools/fixAllLintErrors.js +128 -0
  358. package/dist/tools/fixAllLintErrors.js.map +1 -0
  359. package/dist/tools/foldingRanges.d.ts +50 -0
  360. package/dist/tools/foldingRanges.js +51 -0
  361. package/dist/tools/foldingRanges.js.map +1 -0
  362. package/dist/tools/formatAndSave.d.ts +57 -0
  363. package/dist/tools/formatAndSave.js +87 -0
  364. package/dist/tools/formatAndSave.js.map +1 -0
  365. package/dist/tools/formatDocument.d.ts +61 -0
  366. package/dist/tools/formatDocument.js +144 -0
  367. package/dist/tools/formatDocument.js.map +1 -0
  368. package/dist/tools/generateAPIDocumentation.d.ts +62 -0
  369. package/dist/tools/generateAPIDocumentation.js +249 -0
  370. package/dist/tools/generateAPIDocumentation.js.map +1 -0
  371. package/dist/tools/generateTests.d.ts +75 -0
  372. package/dist/tools/generateTests.js +226 -0
  373. package/dist/tools/generateTests.js.map +1 -0
  374. package/dist/tools/getAIComments.d.ts +79 -0
  375. package/dist/tools/getAIComments.js +93 -0
  376. package/dist/tools/getAIComments.js.map +1 -0
  377. package/dist/tools/getAnalyticsReport.d.ts +102 -0
  378. package/dist/tools/getAnalyticsReport.js +137 -0
  379. package/dist/tools/getAnalyticsReport.js.map +1 -0
  380. package/dist/tools/getArchitectureContext.d.ts +85 -0
  381. package/dist/tools/getArchitectureContext.js +135 -0
  382. package/dist/tools/getArchitectureContext.js.map +1 -0
  383. package/dist/tools/getBufferContent.d.ts +80 -0
  384. package/dist/tools/getBufferContent.js +207 -0
  385. package/dist/tools/getBufferContent.js.map +1 -0
  386. package/dist/tools/getChangeImpact.d.ts +76 -0
  387. package/dist/tools/getChangeImpact.js +184 -0
  388. package/dist/tools/getChangeImpact.js.map +1 -0
  389. package/dist/tools/getClaudeTaskStatus.d.ts +87 -0
  390. package/dist/tools/getClaudeTaskStatus.js +89 -0
  391. package/dist/tools/getClaudeTaskStatus.js.map +1 -0
  392. package/dist/tools/getCodeCoverage.d.ts +86 -0
  393. package/dist/tools/getCodeCoverage.js +237 -0
  394. package/dist/tools/getCodeCoverage.js.map +1 -0
  395. package/dist/tools/getCommitsForIssue.d.ts +98 -0
  396. package/dist/tools/getCommitsForIssue.js +106 -0
  397. package/dist/tools/getCommitsForIssue.js.map +1 -0
  398. package/dist/tools/getCurrentSelection.d.ts +123 -0
  399. package/dist/tools/getCurrentSelection.js +113 -0
  400. package/dist/tools/getCurrentSelection.js.map +1 -0
  401. package/dist/tools/getDebugState.d.ts +140 -0
  402. package/dist/tools/getDebugState.js +109 -0
  403. package/dist/tools/getDebugState.js.map +1 -0
  404. package/dist/tools/getDependencyTree.d.ts +59 -0
  405. package/dist/tools/getDependencyTree.js +207 -0
  406. package/dist/tools/getDependencyTree.js.map +1 -0
  407. package/dist/tools/getDiagnostics.d.ts +108 -0
  408. package/dist/tools/getDiagnostics.js +371 -0
  409. package/dist/tools/getDiagnostics.js.map +1 -0
  410. package/dist/tools/getDiffFromHandoff.d.ts +89 -0
  411. package/dist/tools/getDiffFromHandoff.js +163 -0
  412. package/dist/tools/getDiffFromHandoff.js.map +1 -0
  413. package/dist/tools/getDocumentSymbols.d.ts +74 -0
  414. package/dist/tools/getDocumentSymbols.js +177 -0
  415. package/dist/tools/getDocumentSymbols.js.map +1 -0
  416. package/dist/tools/getFileTree.d.ts +66 -0
  417. package/dist/tools/getFileTree.js +131 -0
  418. package/dist/tools/getFileTree.js.map +1 -0
  419. package/dist/tools/getGitDiff.d.ts +50 -0
  420. package/dist/tools/getGitDiff.js +73 -0
  421. package/dist/tools/getGitDiff.js.map +1 -0
  422. package/dist/tools/getGitHotspots.d.ts +88 -0
  423. package/dist/tools/getGitHotspots.js +145 -0
  424. package/dist/tools/getGitHotspots.js.map +1 -0
  425. package/dist/tools/getGitLog.d.ts +62 -0
  426. package/dist/tools/getGitLog.js +87 -0
  427. package/dist/tools/getGitLog.js.map +1 -0
  428. package/dist/tools/getGitStatus.d.ts +72 -0
  429. package/dist/tools/getGitStatus.js +126 -0
  430. package/dist/tools/getGitStatus.js.map +1 -0
  431. package/dist/tools/getImportTree.d.ts +73 -0
  432. package/dist/tools/getImportTree.js +223 -0
  433. package/dist/tools/getImportTree.js.map +1 -0
  434. package/dist/tools/getImportedSignatures.d.ts +62 -0
  435. package/dist/tools/getImportedSignatures.js +255 -0
  436. package/dist/tools/getImportedSignatures.js.map +1 -0
  437. package/dist/tools/getOpenEditors.d.ts +62 -0
  438. package/dist/tools/getOpenEditors.js +126 -0
  439. package/dist/tools/getOpenEditors.js.map +1 -0
  440. package/dist/tools/getPRTemplate.d.ts +68 -0
  441. package/dist/tools/getPRTemplate.js +187 -0
  442. package/dist/tools/getPRTemplate.js.map +1 -0
  443. package/dist/tools/getProjectContext.d.ts +114 -0
  444. package/dist/tools/getProjectContext.js +344 -0
  445. package/dist/tools/getProjectContext.js.map +1 -0
  446. package/dist/tools/getProjectInfo.d.ts +51 -0
  447. package/dist/tools/getProjectInfo.js +325 -0
  448. package/dist/tools/getProjectInfo.js.map +1 -0
  449. package/dist/tools/getSecurityAdvisories.d.ts +105 -0
  450. package/dist/tools/getSecurityAdvisories.js +472 -0
  451. package/dist/tools/getSecurityAdvisories.js.map +1 -0
  452. package/dist/tools/getSessionUsage.d.ts +58 -0
  453. package/dist/tools/getSessionUsage.js +57 -0
  454. package/dist/tools/getSessionUsage.js.map +1 -0
  455. package/dist/tools/getSymbolHistory.d.ts +157 -0
  456. package/dist/tools/getSymbolHistory.js +256 -0
  457. package/dist/tools/getSymbolHistory.js.map +1 -0
  458. package/dist/tools/getToolCapabilities.d.ts +69 -0
  459. package/dist/tools/getToolCapabilities.js +298 -0
  460. package/dist/tools/getToolCapabilities.js.map +1 -0
  461. package/dist/tools/getTypeSignature.d.ts +70 -0
  462. package/dist/tools/getTypeSignature.js +132 -0
  463. package/dist/tools/getTypeSignature.js.map +1 -0
  464. package/dist/tools/getWorkspaceFolders.d.ts +58 -0
  465. package/dist/tools/getWorkspaceFolders.js +69 -0
  466. package/dist/tools/getWorkspaceFolders.js.map +1 -0
  467. package/dist/tools/getWorkspaceSettings.d.ts +44 -0
  468. package/dist/tools/getWorkspaceSettings.js +70 -0
  469. package/dist/tools/getWorkspaceSettings.js.map +1 -0
  470. package/dist/tools/git-utils.d.ts +16 -0
  471. package/dist/tools/git-utils.js +46 -0
  472. package/dist/tools/git-utils.js.map +1 -0
  473. package/dist/tools/gitHistory.d.ts +110 -0
  474. package/dist/tools/gitHistory.js +167 -0
  475. package/dist/tools/gitHistory.js.map +1 -0
  476. package/dist/tools/gitWrite.d.ts +612 -0
  477. package/dist/tools/gitWrite.js +983 -0
  478. package/dist/tools/gitWrite.js.map +1 -0
  479. package/dist/tools/github/actions.d.ts +152 -0
  480. package/dist/tools/github/actions.js +195 -0
  481. package/dist/tools/github/actions.js.map +1 -0
  482. package/dist/tools/github/index.d.ts +3 -0
  483. package/dist/tools/github/index.js +4 -0
  484. package/dist/tools/github/index.js.map +1 -0
  485. package/dist/tools/github/issues.d.ts +281 -0
  486. package/dist/tools/github/issues.js +340 -0
  487. package/dist/tools/github/issues.js.map +1 -0
  488. package/dist/tools/github/pr.d.ts +433 -0
  489. package/dist/tools/github/pr.js +588 -0
  490. package/dist/tools/github/pr.js.map +1 -0
  491. package/dist/tools/github/shared.d.ts +4 -0
  492. package/dist/tools/github/shared.js +12 -0
  493. package/dist/tools/github/shared.js.map +1 -0
  494. package/dist/tools/handoffNote.d.ts +106 -0
  495. package/dist/tools/handoffNote.js +232 -0
  496. package/dist/tools/handoffNote.js.map +1 -0
  497. package/dist/tools/headless/lspClient.d.ts +26 -0
  498. package/dist/tools/headless/lspClient.js +221 -0
  499. package/dist/tools/headless/lspClient.js.map +1 -0
  500. package/dist/tools/headless/lspFallback.d.ts +28 -0
  501. package/dist/tools/headless/lspFallback.js +122 -0
  502. package/dist/tools/headless/lspFallback.js.map +1 -0
  503. package/dist/tools/hoverAtCursor.d.ts +54 -0
  504. package/dist/tools/hoverAtCursor.js +68 -0
  505. package/dist/tools/hoverAtCursor.js.map +1 -0
  506. package/dist/tools/httpClient.d.ts +141 -0
  507. package/dist/tools/httpClient.js +486 -0
  508. package/dist/tools/httpClient.js.map +1 -0
  509. package/dist/tools/index.d.ts +49 -0
  510. package/dist/tools/index.js +672 -0
  511. package/dist/tools/index.js.map +1 -0
  512. package/dist/tools/inlayHints.d.ts +81 -0
  513. package/dist/tools/inlayHints.js +76 -0
  514. package/dist/tools/inlayHints.js.map +1 -0
  515. package/dist/tools/issueRefs.d.ts +14 -0
  516. package/dist/tools/issueRefs.js +27 -0
  517. package/dist/tools/issueRefs.js.map +1 -0
  518. package/dist/tools/jumpToFirstError.d.ts +63 -0
  519. package/dist/tools/jumpToFirstError.js +124 -0
  520. package/dist/tools/jumpToFirstError.js.map +1 -0
  521. package/dist/tools/launchQuickTask.d.ts +76 -0
  522. package/dist/tools/launchQuickTask.js +170 -0
  523. package/dist/tools/launchQuickTask.js.map +1 -0
  524. package/dist/tools/linters/biome.d.ts +2 -0
  525. package/dist/tools/linters/biome.js +44 -0
  526. package/dist/tools/linters/biome.js.map +1 -0
  527. package/dist/tools/linters/cargo.d.ts +2 -0
  528. package/dist/tools/linters/cargo.js +45 -0
  529. package/dist/tools/linters/cargo.js.map +1 -0
  530. package/dist/tools/linters/eslint.d.ts +2 -0
  531. package/dist/tools/linters/eslint.js +59 -0
  532. package/dist/tools/linters/eslint.js.map +1 -0
  533. package/dist/tools/linters/govet.d.ts +2 -0
  534. package/dist/tools/linters/govet.js +37 -0
  535. package/dist/tools/linters/govet.js.map +1 -0
  536. package/dist/tools/linters/pyright.d.ts +2 -0
  537. package/dist/tools/linters/pyright.js +34 -0
  538. package/dist/tools/linters/pyright.js.map +1 -0
  539. package/dist/tools/linters/ruff.d.ts +2 -0
  540. package/dist/tools/linters/ruff.js +30 -0
  541. package/dist/tools/linters/ruff.js.map +1 -0
  542. package/dist/tools/linters/types.d.ts +16 -0
  543. package/dist/tools/linters/types.js +2 -0
  544. package/dist/tools/linters/types.js.map +1 -0
  545. package/dist/tools/linters/typescript.d.ts +2 -0
  546. package/dist/tools/linters/typescript.js +38 -0
  547. package/dist/tools/linters/typescript.js.map +1 -0
  548. package/dist/tools/listClaudeTasks.d.ts +84 -0
  549. package/dist/tools/listClaudeTasks.js +88 -0
  550. package/dist/tools/listClaudeTasks.js.map +1 -0
  551. package/dist/tools/listTerminals.d.ts +55 -0
  552. package/dist/tools/listTerminals.js +78 -0
  553. package/dist/tools/listTerminals.js.map +1 -0
  554. package/dist/tools/lsp.d.ts +1086 -0
  555. package/dist/tools/lsp.js +1339 -0
  556. package/dist/tools/lsp.js.map +1 -0
  557. package/dist/tools/navigateToSymbolByName.d.ts +56 -0
  558. package/dist/tools/navigateToSymbolByName.js +170 -0
  559. package/dist/tools/navigateToSymbolByName.js.map +1 -0
  560. package/dist/tools/openDiff.d.ts +66 -0
  561. package/dist/tools/openDiff.js +126 -0
  562. package/dist/tools/openDiff.js.map +1 -0
  563. package/dist/tools/openFile.d.ts +69 -0
  564. package/dist/tools/openFile.js +129 -0
  565. package/dist/tools/openFile.js.map +1 -0
  566. package/dist/tools/openInBrowser.d.ts +55 -0
  567. package/dist/tools/openInBrowser.js +129 -0
  568. package/dist/tools/openInBrowser.js.map +1 -0
  569. package/dist/tools/organizeImports.d.ts +56 -0
  570. package/dist/tools/organizeImports.js +115 -0
  571. package/dist/tools/organizeImports.js.map +1 -0
  572. package/dist/tools/performanceReport.d.ts +133 -0
  573. package/dist/tools/performanceReport.js +218 -0
  574. package/dist/tools/performanceReport.js.map +1 -0
  575. package/dist/tools/planPersistence.d.ts +306 -0
  576. package/dist/tools/planPersistence.js +485 -0
  577. package/dist/tools/planPersistence.js.map +1 -0
  578. package/dist/tools/previewEdit.d.ts +107 -0
  579. package/dist/tools/previewEdit.js +270 -0
  580. package/dist/tools/previewEdit.js.map +1 -0
  581. package/dist/tools/recentTracesDigest.d.ts +35 -0
  582. package/dist/tools/recentTracesDigest.js +98 -0
  583. package/dist/tools/recentTracesDigest.js.map +1 -0
  584. package/dist/tools/refactorAnalyze.d.ts +78 -0
  585. package/dist/tools/refactorAnalyze.js +141 -0
  586. package/dist/tools/refactorAnalyze.js.map +1 -0
  587. package/dist/tools/refactorExtractFunction.d.ts +52 -0
  588. package/dist/tools/refactorExtractFunction.js +121 -0
  589. package/dist/tools/refactorExtractFunction.js.map +1 -0
  590. package/dist/tools/refactorPreview.d.ts +75 -0
  591. package/dist/tools/refactorPreview.js +93 -0
  592. package/dist/tools/refactorPreview.js.map +1 -0
  593. package/dist/tools/replaceBlock.d.ts +62 -0
  594. package/dist/tools/replaceBlock.js +125 -0
  595. package/dist/tools/replaceBlock.js.map +1 -0
  596. package/dist/tools/resumeClaudeTask.d.ts +75 -0
  597. package/dist/tools/resumeClaudeTask.js +149 -0
  598. package/dist/tools/resumeClaudeTask.js.map +1 -0
  599. package/dist/tools/runClaudeTask.d.ts +97 -0
  600. package/dist/tools/runClaudeTask.js +224 -0
  601. package/dist/tools/runClaudeTask.js.map +1 -0
  602. package/dist/tools/runCommand.d.ts +82 -0
  603. package/dist/tools/runCommand.js +101 -0
  604. package/dist/tools/runCommand.js.map +1 -0
  605. package/dist/tools/runTests.d.ts +146 -0
  606. package/dist/tools/runTests.js +315 -0
  607. package/dist/tools/runTests.js.map +1 -0
  608. package/dist/tools/saveDocument.d.ts +50 -0
  609. package/dist/tools/saveDocument.js +73 -0
  610. package/dist/tools/saveDocument.js.map +1 -0
  611. package/dist/tools/screenshot.d.ts +23 -0
  612. package/dist/tools/screenshot.js +43 -0
  613. package/dist/tools/screenshot.js.map +1 -0
  614. package/dist/tools/screenshotAndAnnotate.d.ts +103 -0
  615. package/dist/tools/screenshotAndAnnotate.js +192 -0
  616. package/dist/tools/screenshotAndAnnotate.js.map +1 -0
  617. package/dist/tools/searchAndReplace.d.ts +108 -0
  618. package/dist/tools/searchAndReplace.js +281 -0
  619. package/dist/tools/searchAndReplace.js.map +1 -0
  620. package/dist/tools/searchTools.d.ts +61 -0
  621. package/dist/tools/searchTools.js +85 -0
  622. package/dist/tools/searchTools.js.map +1 -0
  623. package/dist/tools/searchWorkspace.d.ts +99 -0
  624. package/dist/tools/searchWorkspace.js +189 -0
  625. package/dist/tools/searchWorkspace.js.map +1 -0
  626. package/dist/tools/selectionRanges.d.ts +58 -0
  627. package/dist/tools/selectionRanges.js +61 -0
  628. package/dist/tools/selectionRanges.js.map +1 -0
  629. package/dist/tools/semanticTokens.d.ts +87 -0
  630. package/dist/tools/semanticTokens.js +86 -0
  631. package/dist/tools/semanticTokens.js.map +1 -0
  632. package/dist/tools/setActiveWorkspaceFolder.d.ts +41 -0
  633. package/dist/tools/setActiveWorkspaceFolder.js +38 -0
  634. package/dist/tools/setActiveWorkspaceFolder.js.map +1 -0
  635. package/dist/tools/signatureHelp.d.ts +86 -0
  636. package/dist/tools/signatureHelp.js +79 -0
  637. package/dist/tools/signatureHelp.js.map +1 -0
  638. package/dist/tools/spawnWorkspace.d.ts +103 -0
  639. package/dist/tools/spawnWorkspace.js +268 -0
  640. package/dist/tools/spawnWorkspace.js.map +1 -0
  641. package/dist/tools/stackTraceParser.d.ts +43 -0
  642. package/dist/tools/stackTraceParser.js +139 -0
  643. package/dist/tools/stackTraceParser.js.map +1 -0
  644. package/dist/tools/terminal.d.ts +352 -0
  645. package/dist/tools/terminal.js +670 -0
  646. package/dist/tools/terminal.js.map +1 -0
  647. package/dist/tools/testRunners/cargoTest.d.ts +2 -0
  648. package/dist/tools/testRunners/cargoTest.js +129 -0
  649. package/dist/tools/testRunners/cargoTest.js.map +1 -0
  650. package/dist/tools/testRunners/goTest.d.ts +2 -0
  651. package/dist/tools/testRunners/goTest.js +108 -0
  652. package/dist/tools/testRunners/goTest.js.map +1 -0
  653. package/dist/tools/testRunners/pytest.d.ts +2 -0
  654. package/dist/tools/testRunners/pytest.js +135 -0
  655. package/dist/tools/testRunners/pytest.js.map +1 -0
  656. package/dist/tools/testRunners/types.d.ts +18 -0
  657. package/dist/tools/testRunners/types.js +2 -0
  658. package/dist/tools/testRunners/types.js.map +1 -0
  659. package/dist/tools/testRunners/vitestJest.d.ts +3 -0
  660. package/dist/tools/testRunners/vitestJest.js +215 -0
  661. package/dist/tools/testRunners/vitestJest.js.map +1 -0
  662. package/dist/tools/testTraceToSource.d.ts +80 -0
  663. package/dist/tools/testTraceToSource.js +206 -0
  664. package/dist/tools/testTraceToSource.js.map +1 -0
  665. package/dist/tools/transaction.d.ts +243 -0
  666. package/dist/tools/transaction.js +309 -0
  667. package/dist/tools/transaction.js.map +1 -0
  668. package/dist/tools/typeHierarchy.d.ts +77 -0
  669. package/dist/tools/typeHierarchy.js +86 -0
  670. package/dist/tools/typeHierarchy.js.map +1 -0
  671. package/dist/tools/utils.d.ts +124 -0
  672. package/dist/tools/utils.js +566 -0
  673. package/dist/tools/utils.js.map +1 -0
  674. package/dist/tools/vscodeCommands.d.ts +90 -0
  675. package/dist/tools/vscodeCommands.js +112 -0
  676. package/dist/tools/vscodeCommands.js.map +1 -0
  677. package/dist/tools/vscodeTasks.d.ts +102 -0
  678. package/dist/tools/vscodeTasks.js +110 -0
  679. package/dist/tools/vscodeTasks.js.map +1 -0
  680. package/dist/tools/watchDiagnostics.d.ts +64 -0
  681. package/dist/tools/watchDiagnostics.js +270 -0
  682. package/dist/tools/watchDiagnostics.js.map +1 -0
  683. package/dist/tools/workspaceSettings.d.ts +57 -0
  684. package/dist/tools/workspaceSettings.js +80 -0
  685. package/dist/tools/workspaceSettings.js.map +1 -0
  686. package/dist/transport.d.ts +207 -0
  687. package/dist/transport.js +1272 -0
  688. package/dist/transport.js.map +1 -0
  689. package/dist/version.d.ts +13 -0
  690. package/dist/version.js +31 -0
  691. package/dist/version.js.map +1 -0
  692. package/dist/wsUtils.d.ts +8 -0
  693. package/dist/wsUtils.js +54 -0
  694. package/dist/wsUtils.js.map +1 -0
  695. package/package.json +118 -0
  696. package/scripts/gen-claude-desktop-config.sh +124 -0
  697. package/scripts/gen-mcp-config.sh +390 -0
  698. package/scripts/install-extension.sh +106 -0
  699. package/scripts/mcp-stdio-shim.cjs +482 -0
  700. package/scripts/postinstall.mjs +68 -0
  701. package/scripts/start-all.sh +502 -0
  702. package/scripts/start-orchestrator.sh +186 -0
  703. package/scripts/start-remote.sh +126 -0
  704. package/scripts/start-vps.sh +116 -0
  705. package/templates/CLAUDE.bridge.md +125 -0
  706. package/templates/automation-policies/security-first.json +46 -0
  707. package/templates/automation-policies/strict-lint.json +41 -0
  708. package/templates/automation-policies/test-driven.json +54 -0
  709. package/templates/automation-policy.example.json +105 -0
  710. package/templates/bridge-tools.md +111 -0
  711. package/templates/dispatch-context.md +33 -0
  712. package/templates/managed-agent/code-review-agent.md +50 -0
  713. package/templates/managed-agent/managed-agent-mcp.json +102 -0
  714. package/templates/recipes/ambient-journal.yaml +11 -0
  715. package/templates/recipes/daily-status.yaml +21 -0
  716. package/templates/recipes/lint-on-save.yaml +13 -0
  717. package/templates/recipes/stale-branches.yaml +18 -0
  718. package/templates/recipes/watch-failing-tests.yaml +15 -0
  719. package/templates/scheduled-tasks/dependency-audit/SKILL.md +77 -0
  720. package/templates/scheduled-tasks/health-check/SKILL.md +73 -0
  721. 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.");