wind-agent-cli 1.37.2 → 1.37.3
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 +718 -718
- package/README.md +1 -1
- package/dist/api-docs.html +901 -901
- package/dist/assets/{CodeEditor-B2Wf7Fg0.js → CodeEditor-BqmxpZ_D.js} +1 -1
- package/dist/assets/{FileTree-N2IkkHlv.js → FileTree-DLE7Ioai.js} +1 -1
- package/dist/assets/{GitPanel-DZCeuFZ2.js → GitPanel-f8RMRa8D.js} +1 -1
- package/dist/assets/{MarkdownPreview-C0tqYnVu.js → MarkdownPreview-93h_1tJa.js} +1 -1
- package/dist/assets/{PluginTabContent-Bnuf-fb8.js → PluginTabContent-DU1jjkXP.js} +1 -1
- package/dist/assets/{Shell-BfFnMZ-f.js → Shell-CN_2MRIM.js} +1 -1
- package/dist/assets/{StandaloneShell-QmyYwNAl.js → StandaloneShell-D0avS8UE.js} +1 -1
- package/dist/assets/{TaskMasterPanel-fMsmvN9L.js → TaskMasterPanel-Cpf1Q5Ph.js} +3 -3
- package/dist/assets/{abnfDiagram-N423BO3Z-DjPU7HLs.js → abnfDiagram-N423BO3Z-p3aJIm4T.js} +1 -1
- package/dist/assets/{arc-Pdq6Tvr3.js → arc-CTeud6Fl.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G-D0JnT0Vh.js → architectureDiagram-T3A2C74G-CG7kRCJU.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-DpaEf3mv.js → blockDiagram-VBNYF7ZC-oSjQ1SgE.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-MpqlPGFi.js → c4Diagram-5PPSVZJV-RkzF0DJV.js} +1 -1
- package/dist/assets/channel-BfQbarn9.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-DoSdNo8u.js → chunk-2GRJ4B5K-B07uZ07O.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-CE7I3uMn.js → chunk-2Q5K7J3B-DNSfO7xS.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-B4UQ8snD.js → chunk-5RXB4S5H-BTeYcgyb.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-B55XgqHZ.js → chunk-5VM5RSS4-B7vZV0zC.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-BS1KpefW.js → chunk-6Q2QTUOP-DuS_xUGG.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-DkEPedJP.js → chunk-GF5L2VYU-CKLZ3iVD.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DOtkNhMm.js → chunk-JWPE2WC7-DD2hcXvs.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-BXLjviqM.js → chunk-KBJHAD2P-Cz-l38qp.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-C50fjNNz.js → chunk-RYQCIY6F-DGFIU1YM.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-QBYqCkb7.js → chunk-XXDRQBXY-CmfzoYFl.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-Bpfe3kq7.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-Bpfe3kq7.js +1 -0
- package/dist/assets/{code-xml-VK1YfShP.js → code-xml-CLpHzEOP.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-DrVTo1Nh.js → cose-bilkent-JH36ORCC-DlFcLXCB.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-DnJa_OlQ.js → cynefin-VYW2F7L2-P1HecReO.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-CCxBjw9E.js → cynefinDiagram-MW4NZA55-COgduz5P.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-C_GvE4lu.js → dagre-VZM6K2ZE-Bbb-siGp.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-pFzs9HEu.js → diagram-7IWD3JNH-9CWGFMYR.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-CcehQC7x.js → diagram-B4RE2ZJO-TWK59T6V.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-hfKcrrxe.js → diagram-LBJQPF4R-ErMC9yaa.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-C1semJfK.js → diagram-Q27KOJAE-Dt_-C7hV.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-57hvXQXO.js → diagram-UB23O5K3-BJ1DnRAF.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-9KIAlAVw.js → ebnfDiagram-BXEA7PRR-CE1YaQ9s.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-B7OzJ767.js → erDiagram-JOGREHBK-Bqk7N9aY.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-CJV8fQPR.js → flowDiagram-UKHOOZJN-DEr2II5V.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-CbMNWWQu.js → ganttDiagram-PKOTCBZU-CWYAUeYN.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-I_vZ5waO.js → gitGraphDiagram-DS77QQ5N-tdEcEIM6.js} +1 -1
- package/dist/assets/{index-ZHwIojzi.js → index-B-sTfSZq.js} +1 -1
- package/dist/assets/{index-GFhXZyl2.js → index-BSe3UiFA.js} +1 -1
- package/dist/assets/{index-DFnVoqpx.js → index-B_FDMWar.js} +5 -5
- package/dist/assets/{index-DlSeAkw_.js → index-CWJtg2pR.js} +1 -1
- package/dist/assets/{infoDiagram-6WML65LV-Dh20Tsbq.js → infoDiagram-6WML65LV-A3IqRUnO.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-DH2Sm3ko.js → ishikawaDiagram-WSZJBQD7-B2uL6bkK.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-BNFQqlVu.js → journeyDiagram-NVQOT4AX-D9JB-hRW.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-B3iL0ztJ.js → kanban-definition-27J2QSJJ-DmlgiV7K.js} +1 -1
- package/dist/assets/{linear-Cwe9dEKA.js → linear-Ct_eoJQk.js} +1 -1
- package/dist/assets/{mermaid.core-BYRQSshi.js → mermaid.core-CQ698HNn.js} +5 -5
- package/dist/assets/{mindmap-definition-FAOFIHXS-BgfBYMzr.js → mindmap-definition-FAOFIHXS-DGtMgQhf.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-CNYpECr8.js → pegDiagram-VL7TDLO6-CO6vP4n9.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-DeSrxc4I.js → pieDiagram-7S7Q4E2Y-DMkt_Zfr.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-BXVVQsa6.js → quadrantDiagram-CIZ2JOQS-DgNxRz6t.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-JTroIW8F.js → railroadDiagram-AXF67PYL-DKz9UqA9.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-C1Z_inLz.js → requirementDiagram-LRYGKXZP-L84XyGgV.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-DCJgKFUk.js → sankeyDiagram-W5VNT64P-CQqWbJ3j.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-D8Wrx5Vc.js → sequenceDiagram-SI44F4Z6--tnzS2tb.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-CXqD68vD.js → sizeCapture-X5ZJPWSS-DujwEOtm.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-CF0Ekqjo.js → stateDiagram-OKZ733FA-BK3TcZY2.js} +1 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-_medyomK.js +1 -0
- package/dist/assets/{swimlanes-SLNWSIFB-DVIax_k4.js → swimlanes-SLNWSIFB-naX-Uv1B.js} +2 -2
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DstIv3TC.js +8 -0
- package/dist/assets/{timeline-definition-Z64GVDOM-DSqk3ApG.js → timeline-definition-Z64GVDOM-C-vP_ddU.js} +1 -1
- package/dist/assets/{vennDiagram-T6HMQDX7-DNbTqyG5.js → vennDiagram-T6HMQDX7-DN-I7o-7.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-BNCpsFZV.js → wardleyDiagram-T6FBY63Y-Db9dsaXv.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M-XsVZphHr.js → xychartDiagram-ELKLHX3M-DE6OxW_p.js} +1 -1
- package/dist/clear-cache.html +85 -85
- package/dist/convert-icons.md +52 -52
- package/dist/favicon.svg +8 -8
- package/dist/generate-icons.js +48 -48
- package/dist/icons/codex-white.svg +3 -3
- package/dist/icons/codex.svg +3 -3
- package/dist/icons/cursor-white.svg +11 -11
- package/dist/icons/icon-128x128.svg +11 -11
- package/dist/icons/icon-144x144.svg +11 -11
- package/dist/icons/icon-152x152.svg +11 -11
- package/dist/icons/icon-192x192.svg +11 -11
- package/dist/icons/icon-384x384.svg +11 -11
- package/dist/icons/icon-512x512.svg +11 -11
- package/dist/icons/icon-72x72.svg +11 -11
- package/dist/icons/icon-96x96.svg +11 -11
- package/dist/icons/icon-template.svg +11 -11
- package/dist/index.html +56 -56
- package/dist/logo.svg +17 -17
- package/dist/manifest.json +60 -60
- package/dist/sw.js +124 -124
- package/dist-server/server/modules/cli/cli.service.js +36 -36
- package/dist-server/server/modules/cli/sandbox.service.js +38 -38
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +74 -74
- package/dist-server/server/modules/commands/commands.routes.js +24 -24
- package/dist-server/server/modules/database/migrations.js +190 -190
- package/dist-server/server/modules/database/repositories/api-keys.js +3 -3
- package/dist-server/server/modules/database/repositories/github-tokens.js +2 -2
- package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +28 -28
- package/dist-server/server/modules/database/repositories/notification-preferences.js +4 -4
- package/dist-server/server/modules/database/repositories/projects.db.js +61 -61
- package/dist-server/server/modules/database/repositories/provider-models.js +35 -35
- package/dist-server/server/modules/database/repositories/push-subscriptions.js +5 -5
- package/dist-server/server/modules/database/repositories/scan-state.db.js +5 -5
- package/dist-server/server/modules/database/repositories/sessions.db.js +92 -92
- package/dist-server/server/modules/database/schema.js +177 -177
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +6 -6
- package/dist-server/server/modules/git/git.routes.js +17 -17
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +12 -12
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +9 -9
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +17 -17
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +25 -25
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +27 -27
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js +9 -9
- package/dist-server/server/modules/providers/tests/mcp.test.js +3 -3
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +96 -96
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +18 -18
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +419 -419
- package/electron/cloud.js +260 -260
- package/electron/desktopNotifications.js +378 -378
- package/electron/desktopWindow.js +766 -766
- package/electron/launcher/index.html +14 -14
- package/electron/launcher/launcher.css +801 -801
- package/electron/launcher/launcher.js +687 -687
- package/electron/localServer.js +549 -549
- package/electron/main.js +944 -944
- package/electron/preload.cjs +60 -60
- package/electron/scripts/generate-macos-icon.js +62 -62
- package/electron/serverInstaller.js +277 -277
- package/electron/tabs.js +87 -87
- package/electron/viewHost.js +331 -331
- package/package.json +250 -247
- package/public/api-docs.html +901 -901
- package/scripts/fix-node-pty.js +67 -67
- package/scripts/promote-dist-server.mjs +50 -50
- package/scripts/release/build-server-bundle.js +176 -176
- package/scripts/release/prepare-desktop-app.js +152 -152
- package/server/index.ts +399 -399
- package/server/load-env.ts +47 -47
- package/server/modules/agent/agent.module.ts +52 -52
- package/server/modules/agent/agent.routes.ts +1287 -1287
- package/server/modules/agent/index.ts +2 -2
- package/server/modules/agent/tests/agent.routes.test.ts +205 -205
- package/server/modules/assets/assets.routes.ts +150 -150
- package/server/modules/assets/index.ts +3 -3
- package/server/modules/assets/services/image-assets.service.ts +127 -127
- package/server/modules/assets/tests/image-assets.service.test.ts +74 -74
- package/server/modules/auth/auth.middleware.ts +163 -163
- package/server/modules/auth/auth.module.ts +38 -38
- package/server/modules/auth/auth.routes.ts +57 -57
- package/server/modules/auth/auth.service.ts +155 -155
- package/server/modules/auth/index.ts +9 -9
- package/server/modules/auth/tests/auth.service.test.ts +95 -95
- package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -120
- package/server/modules/browser-use/browser-use-mcp.ts +386 -386
- package/server/modules/browser-use/browser-use-runtime.ts +10 -10
- package/server/modules/browser-use/browser-use.routes.ts +96 -96
- package/server/modules/browser-use/browser-use.service.ts +836 -836
- package/server/modules/browser-use/index.ts +11 -11
- package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -10
- package/server/modules/cli/cli.module.ts +93 -93
- package/server/modules/cli/cli.service.ts +248 -248
- package/server/modules/cli/cli.ts +19 -19
- package/server/modules/cli/index.ts +2 -2
- package/server/modules/cli/sandbox.service.ts +398 -398
- package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -186
- package/server/modules/cli/tests/cli.service.test.ts +86 -86
- package/server/modules/cli/tests/sandbox.service.test.ts +58 -58
- package/server/modules/commands/commands.module.ts +22 -22
- package/server/modules/commands/commands.routes.ts +586 -586
- package/server/modules/commands/index.ts +2 -2
- package/server/modules/commands/tests/commands.test.ts +109 -109
- package/server/modules/database/connection.ts +143 -143
- package/server/modules/database/index.ts +17 -17
- package/server/modules/database/init-db.ts +17 -17
- package/server/modules/database/migrations.ts +515 -515
- package/server/modules/database/repositories/api-keys.ts +119 -119
- package/server/modules/database/repositories/app-config.ts +53 -53
- package/server/modules/database/repositories/credentials.ts +106 -106
- package/server/modules/database/repositories/github-tokens.ts +100 -100
- package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -153
- package/server/modules/database/repositories/notification-preferences.ts +117 -117
- package/server/modules/database/repositories/projects.db.ts +196 -196
- package/server/modules/database/repositories/provider-models.ts +168 -168
- package/server/modules/database/repositories/push-subscriptions.ts +80 -80
- package/server/modules/database/repositories/scan-state.db.ts +42 -42
- package/server/modules/database/repositories/sessions.db.ts +524 -524
- package/server/modules/database/repositories/users.ts +140 -140
- package/server/modules/database/repositories/vapid-keys.ts +57 -57
- package/server/modules/database/schema.ts +210 -210
- package/server/modules/database/tests/projects.db.integration.test.ts +72 -72
- package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -125
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -109
- package/server/modules/database/tests/sessions.db.integration.test.ts +116 -116
- package/server/modules/file-tree/file-tree.module.ts +116 -116
- package/server/modules/file-tree/file-tree.routes.ts +258 -258
- package/server/modules/file-tree/file-tree.service.ts +675 -675
- package/server/modules/file-tree/index.ts +2 -2
- package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -157
- package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -371
- package/server/modules/git/git-branch.service.ts +43 -43
- package/server/modules/git/git-parsing.service.ts +66 -66
- package/server/modules/git/git.module.ts +22 -22
- package/server/modules/git/git.routes.ts +1596 -1596
- package/server/modules/git/index.ts +2 -2
- package/server/modules/git/tests/git-branch.service.test.ts +60 -60
- package/server/modules/git/tests/git-init.routes.test.ts +132 -132
- package/server/modules/git/tests/git.test.ts +106 -106
- package/server/modules/notifications/index.ts +24 -24
- package/server/modules/notifications/notifications.routes.ts +127 -127
- package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -124
- package/server/modules/notifications/services/notification-orchestrator.service.js +310 -310
- package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -55
- package/server/modules/notifications/vapid-keys.service.ts +38 -38
- package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -109
- package/server/modules/plugins/index.ts +9 -9
- package/server/modules/plugins/plugin-process.service.ts +217 -217
- package/server/modules/plugins/plugin-registry.service.ts +459 -459
- package/server/modules/plugins/plugins.module.ts +33 -33
- package/server/modules/plugins/plugins.routes.ts +66 -66
- package/server/modules/plugins/plugins.service.ts +147 -147
- package/server/modules/plugins/tests/plugins.service.test.ts +32 -32
- package/server/modules/projects/index.ts +11 -11
- package/server/modules/projects/projects.routes.ts +273 -273
- package/server/modules/projects/services/project-clone.service.ts +323 -323
- package/server/modules/projects/services/project-delete.service.ts +90 -90
- package/server/modules/projects/services/project-management.service.ts +144 -144
- package/server/modules/projects/services/project-star.service.ts +78 -78
- package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -248
- package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -314
- package/server/modules/projects/tests/project-clone.service.test.ts +183 -183
- package/server/modules/projects/tests/project-management.service.test.ts +117 -117
- package/server/modules/projects/tests/project-star.service.test.ts +123 -123
- package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -105
- package/server/modules/providers/README.md +380 -380
- package/server/modules/providers/index.ts +10 -10
- package/server/modules/providers/list/claude/claude-auth.provider.ts +160 -160
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
- package/server/modules/providers/list/claude/claude-models.provider.ts +294 -294
- package/server/modules/providers/list/claude/claude-runtime.provider.js +1068 -1068
- package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -203
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +684 -684
- package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -265
- package/server/modules/providers/list/claude/claude.provider.ts +30 -30
- package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -100
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
- package/server/modules/providers/list/codex/codex-models.provider.ts +123 -123
- package/server/modules/providers/list/codex/codex-runtime.provider.js +533 -533
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +203 -203
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +938 -938
- package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -73
- package/server/modules/providers/list/codex/codex.provider.ts +28 -28
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -143
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -119
- package/server/modules/providers/list/cursor/cursor-runtime.provider.js +385 -385
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +159 -159
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -654
- package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -39
- package/server/modules/providers/list/cursor/cursor.provider.ts +30 -30
- package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -110
- package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -228
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +203 -203
- package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -434
- package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -261
- package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -179
- package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -500
- package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -78
- package/server/modules/providers/list/opencode/opencode.provider.ts +30 -30
- package/server/modules/providers/provider.registry.ts +36 -36
- package/server/modules/providers/provider.routes.ts +877 -877
- package/server/modules/providers/services/mcp.service.ts +109 -109
- package/server/modules/providers/services/provider-auth.service.ts +26 -26
- package/server/modules/providers/services/provider-capabilities.service.ts +97 -97
- package/server/modules/providers/services/provider-models.service.ts +401 -401
- package/server/modules/providers/services/provider-runtime.service.ts +108 -108
- package/server/modules/providers/services/provider-token-usage.service.ts +357 -357
- package/server/modules/providers/services/session-conversations-search.service.ts +1321 -1321
- package/server/modules/providers/services/session-synchronizer.service.ts +74 -74
- package/server/modules/providers/services/sessions-watcher.service.ts +247 -247
- package/server/modules/providers/services/sessions.service.ts +471 -471
- package/server/modules/providers/services/skills.service.ts +39 -39
- package/server/modules/providers/shared/base/abstract.provider.ts +32 -32
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
- package/server/modules/providers/shared/skills/skills.provider.ts +287 -287
- package/server/modules/providers/tests/claude-auth.test.ts +150 -150
- package/server/modules/providers/tests/claude-sessions.test.ts +61 -61
- package/server/modules/providers/tests/codex-sessions.test.ts +231 -231
- package/server/modules/providers/tests/mcp.test.ts +349 -349
- package/server/modules/providers/tests/opencode-models.test.ts +41 -41
- package/server/modules/providers/tests/opencode-sessions.test.ts +522 -522
- package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -247
- package/server/modules/providers/tests/provider-models.service.test.ts +353 -353
- package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -138
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -186
- package/server/modules/providers/tests/provider.routes.test.ts +244 -244
- package/server/modules/providers/tests/sessions-details.test.ts +73 -73
- package/server/modules/providers/tests/sessions.service.test.ts +127 -127
- package/server/modules/providers/tests/skills.test.ts +692 -692
- package/server/modules/settings/index.ts +2 -2
- package/server/modules/settings/settings.module.ts +50 -50
- package/server/modules/settings/settings.routes.ts +51 -51
- package/server/modules/settings/settings.service.ts +186 -186
- package/server/modules/settings/tests/settings.service.test.ts +54 -54
- package/server/modules/system/index.ts +2 -2
- package/server/modules/system/system.module.ts +62 -62
- package/server/modules/system/system.routes.ts +21 -21
- package/server/modules/system/system.service.ts +76 -76
- package/server/modules/system/tests/system.service.test.ts +118 -118
- package/server/modules/taskmaster/index.ts +2 -2
- package/server/modules/taskmaster/taskmaster.module.ts +24 -24
- package/server/modules/taskmaster/taskmaster.routes.ts +1482 -1482
- package/server/modules/taskmaster/taskmaster.service.ts +132 -132
- package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -144
- package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -97
- package/server/modules/user/index.ts +2 -2
- package/server/modules/user/tests/user.service.test.ts +61 -61
- package/server/modules/user/user.module.ts +58 -58
- package/server/modules/user/user.routes.ts +50 -50
- package/server/modules/user/user.service.ts +85 -85
- package/server/modules/voice/index.ts +2 -2
- package/server/modules/voice/tests/voice.service.test.ts +98 -98
- package/server/modules/voice/voice.module.ts +47 -47
- package/server/modules/voice/voice.routes.ts +113 -113
- package/server/modules/voice/voice.service.ts +192 -192
- package/server/modules/websocket/README.md +273 -273
- package/server/modules/websocket/index.ts +3 -3
- package/server/modules/websocket/services/chat-run-registry.service.ts +343 -343
- package/server/modules/websocket/services/chat-session-writer.service.ts +145 -145
- package/server/modules/websocket/services/chat-websocket.service.ts +425 -425
- package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -65
- package/server/modules/websocket/services/shell-websocket.service.ts +502 -502
- package/server/modules/websocket/services/websocket-auth.service.ts +59 -59
- package/server/modules/websocket/services/websocket-server.service.ts +124 -124
- package/server/modules/websocket/services/websocket-state.service.ts +16 -16
- package/server/modules/websocket/services/websocket-writer.service.ts +38 -38
- package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -59
- package/server/modules/websocket/tests/chat-run-registry.test.ts +282 -282
- package/server/modules/websocket/tests/shell-websocket.service.test.ts +100 -100
- package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -78
- package/server/modules/worktrees/index.ts +2 -2
- package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -53
- package/server/modules/worktrees/services/worktree-create.service.ts +104 -104
- package/server/modules/worktrees/services/worktree-git.service.ts +207 -207
- package/server/modules/worktrees/services/worktree-list.service.ts +143 -143
- package/server/modules/worktrees/services/worktree-merge.service.ts +157 -157
- package/server/modules/worktrees/services/worktree-open.service.ts +85 -85
- package/server/modules/worktrees/services/worktree-remove.service.ts +88 -88
- package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -68
- package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -142
- package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -84
- package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -45
- package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -213
- package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -122
- package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -227
- package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -199
- package/server/modules/worktrees/worktrees.module.ts +113 -113
- package/server/modules/worktrees/worktrees.routes.ts +116 -116
- package/server/shared/claude-cli-path.ts +139 -139
- package/server/shared/frontmatter.ts +18 -18
- package/server/shared/image-attachments.ts +435 -435
- package/server/shared/interfaces.ts +179 -179
- package/server/shared/tests/claude-cli-path.test.ts +61 -61
- package/server/shared/tests/image-attachments.test.ts +353 -353
- package/server/shared/tests/slice-tail-page.test.ts +42 -42
- package/server/shared/types.ts +1226 -1226
- package/server/shared/utils.ts +1161 -1161
- package/server/tsconfig.json +40 -40
- package/shared/networkHosts.js +22 -22
- package/dist/assets/channel-Bm0ZLE4z.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-DqEOcNxw.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-DqEOcNxw.js +0 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-DARLpEFJ.js +0 -1
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CrgDgaY8.js +0 -8
|
@@ -1,116 +1,116 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
|
|
3
|
-
import type { WorktreeServices } from '@/shared/types.js';
|
|
4
|
-
import { AppError, asyncHandler, createApiSuccessResponse } from '@/shared/utils.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Parses the project identifier shared by all Worktrees routes.
|
|
8
|
-
*
|
|
9
|
-
* Path resolution intentionally remains in the injected application service so
|
|
10
|
-
* this transport layer never reaches into the Database module.
|
|
11
|
-
*/
|
|
12
|
-
function readProjectId(projectIdValue: unknown): string {
|
|
13
|
-
const projectId = typeof projectIdValue === 'string' ? projectIdValue.trim() : '';
|
|
14
|
-
if (!projectId) {
|
|
15
|
-
throw new AppError('project is required', {
|
|
16
|
-
code: 'PROJECT_ID_REQUIRED',
|
|
17
|
-
statusCode: 400,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return projectId;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function readRequiredString(value: unknown, name: string): string {
|
|
25
|
-
const parsed = typeof value === 'string' ? value.trim() : '';
|
|
26
|
-
if (!parsed) {
|
|
27
|
-
throw new AppError(`${name} is required`, {
|
|
28
|
-
code: 'INVALID_REQUEST_BODY',
|
|
29
|
-
statusCode: 400,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
return parsed;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Builds the Worktrees HTTP router around an injected application-service API.
|
|
37
|
-
*
|
|
38
|
-
* Keeping construction explicit lets route tests supply deterministic services
|
|
39
|
-
* and ensures parsing remains the route layer's only responsibility.
|
|
40
|
-
*/
|
|
41
|
-
export function createWorktreesRouter(services: WorktreeServices): express.Router {
|
|
42
|
-
const router = express.Router();
|
|
43
|
-
|
|
44
|
-
router.get(
|
|
45
|
-
'/',
|
|
46
|
-
asyncHandler(async (req, res) => {
|
|
47
|
-
const projectPath = services.resolveProjectPath(readProjectId(req.query.project));
|
|
48
|
-
const result = await services.list({ projectPath });
|
|
49
|
-
res.json(createApiSuccessResponse(result));
|
|
50
|
-
}),
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
router.post(
|
|
54
|
-
'/create',
|
|
55
|
-
asyncHandler(async (req, res) => {
|
|
56
|
-
const body = req.body as Record<string, unknown>;
|
|
57
|
-
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
58
|
-
const branch = readRequiredString(body.branch, 'branch');
|
|
59
|
-
const baseBranch = typeof body.baseBranch === 'string' ? body.baseBranch : null;
|
|
60
|
-
|
|
61
|
-
const result = await services.createAndOpen({ projectPath, branch, baseBranch });
|
|
62
|
-
res.json(createApiSuccessResponse(result));
|
|
63
|
-
}),
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
router.post(
|
|
67
|
-
'/open',
|
|
68
|
-
asyncHandler(async (req, res) => {
|
|
69
|
-
const body = req.body as Record<string, unknown>;
|
|
70
|
-
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
71
|
-
const worktreePath = readRequiredString(body.worktreePath, 'worktreePath');
|
|
72
|
-
|
|
73
|
-
const project = await services.open({ projectPath, worktreePath });
|
|
74
|
-
res.json(createApiSuccessResponse({ project }));
|
|
75
|
-
}),
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
router.post(
|
|
79
|
-
'/merge',
|
|
80
|
-
asyncHandler(async (req, res) => {
|
|
81
|
-
const body = req.body as Record<string, unknown>;
|
|
82
|
-
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
83
|
-
const worktreePath = readRequiredString(body.worktreePath, 'worktreePath');
|
|
84
|
-
|
|
85
|
-
const result = await services.merge({
|
|
86
|
-
projectPath,
|
|
87
|
-
worktreePath,
|
|
88
|
-
squash: typeof body.squash === 'boolean' ? body.squash : false,
|
|
89
|
-
message: typeof body.message === 'string' ? body.message : null,
|
|
90
|
-
removeAfterMerge: typeof body.removeAfterMerge === 'boolean' ? body.removeAfterMerge : false,
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
res.json(createApiSuccessResponse(result));
|
|
94
|
-
}),
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
router.post(
|
|
98
|
-
'/remove',
|
|
99
|
-
asyncHandler(async (req, res) => {
|
|
100
|
-
const body = req.body as Record<string, unknown>;
|
|
101
|
-
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
102
|
-
const worktreePath = readRequiredString(body.worktreePath, 'worktreePath');
|
|
103
|
-
|
|
104
|
-
const result = await services.remove({
|
|
105
|
-
projectPath,
|
|
106
|
-
worktreePath,
|
|
107
|
-
force: typeof body.force === 'boolean' ? body.force : false,
|
|
108
|
-
deleteBranch: typeof body.deleteBranch === 'boolean' ? body.deleteBranch : false,
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
res.json(createApiSuccessResponse(result));
|
|
112
|
-
}),
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
return router;
|
|
116
|
-
}
|
|
1
|
+
import express from 'express';
|
|
2
|
+
|
|
3
|
+
import type { WorktreeServices } from '@/shared/types.js';
|
|
4
|
+
import { AppError, asyncHandler, createApiSuccessResponse } from '@/shared/utils.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Parses the project identifier shared by all Worktrees routes.
|
|
8
|
+
*
|
|
9
|
+
* Path resolution intentionally remains in the injected application service so
|
|
10
|
+
* this transport layer never reaches into the Database module.
|
|
11
|
+
*/
|
|
12
|
+
function readProjectId(projectIdValue: unknown): string {
|
|
13
|
+
const projectId = typeof projectIdValue === 'string' ? projectIdValue.trim() : '';
|
|
14
|
+
if (!projectId) {
|
|
15
|
+
throw new AppError('project is required', {
|
|
16
|
+
code: 'PROJECT_ID_REQUIRED',
|
|
17
|
+
statusCode: 400,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return projectId;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function readRequiredString(value: unknown, name: string): string {
|
|
25
|
+
const parsed = typeof value === 'string' ? value.trim() : '';
|
|
26
|
+
if (!parsed) {
|
|
27
|
+
throw new AppError(`${name} is required`, {
|
|
28
|
+
code: 'INVALID_REQUEST_BODY',
|
|
29
|
+
statusCode: 400,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return parsed;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Builds the Worktrees HTTP router around an injected application-service API.
|
|
37
|
+
*
|
|
38
|
+
* Keeping construction explicit lets route tests supply deterministic services
|
|
39
|
+
* and ensures parsing remains the route layer's only responsibility.
|
|
40
|
+
*/
|
|
41
|
+
export function createWorktreesRouter(services: WorktreeServices): express.Router {
|
|
42
|
+
const router = express.Router();
|
|
43
|
+
|
|
44
|
+
router.get(
|
|
45
|
+
'/',
|
|
46
|
+
asyncHandler(async (req, res) => {
|
|
47
|
+
const projectPath = services.resolveProjectPath(readProjectId(req.query.project));
|
|
48
|
+
const result = await services.list({ projectPath });
|
|
49
|
+
res.json(createApiSuccessResponse(result));
|
|
50
|
+
}),
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
router.post(
|
|
54
|
+
'/create',
|
|
55
|
+
asyncHandler(async (req, res) => {
|
|
56
|
+
const body = req.body as Record<string, unknown>;
|
|
57
|
+
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
58
|
+
const branch = readRequiredString(body.branch, 'branch');
|
|
59
|
+
const baseBranch = typeof body.baseBranch === 'string' ? body.baseBranch : null;
|
|
60
|
+
|
|
61
|
+
const result = await services.createAndOpen({ projectPath, branch, baseBranch });
|
|
62
|
+
res.json(createApiSuccessResponse(result));
|
|
63
|
+
}),
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
router.post(
|
|
67
|
+
'/open',
|
|
68
|
+
asyncHandler(async (req, res) => {
|
|
69
|
+
const body = req.body as Record<string, unknown>;
|
|
70
|
+
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
71
|
+
const worktreePath = readRequiredString(body.worktreePath, 'worktreePath');
|
|
72
|
+
|
|
73
|
+
const project = await services.open({ projectPath, worktreePath });
|
|
74
|
+
res.json(createApiSuccessResponse({ project }));
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
router.post(
|
|
79
|
+
'/merge',
|
|
80
|
+
asyncHandler(async (req, res) => {
|
|
81
|
+
const body = req.body as Record<string, unknown>;
|
|
82
|
+
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
83
|
+
const worktreePath = readRequiredString(body.worktreePath, 'worktreePath');
|
|
84
|
+
|
|
85
|
+
const result = await services.merge({
|
|
86
|
+
projectPath,
|
|
87
|
+
worktreePath,
|
|
88
|
+
squash: typeof body.squash === 'boolean' ? body.squash : false,
|
|
89
|
+
message: typeof body.message === 'string' ? body.message : null,
|
|
90
|
+
removeAfterMerge: typeof body.removeAfterMerge === 'boolean' ? body.removeAfterMerge : false,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
res.json(createApiSuccessResponse(result));
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
router.post(
|
|
98
|
+
'/remove',
|
|
99
|
+
asyncHandler(async (req, res) => {
|
|
100
|
+
const body = req.body as Record<string, unknown>;
|
|
101
|
+
const projectPath = services.resolveProjectPath(readProjectId(body.project));
|
|
102
|
+
const worktreePath = readRequiredString(body.worktreePath, 'worktreePath');
|
|
103
|
+
|
|
104
|
+
const result = await services.remove({
|
|
105
|
+
projectPath,
|
|
106
|
+
worktreePath,
|
|
107
|
+
force: typeof body.force === 'boolean' ? body.force : false,
|
|
108
|
+
deleteBranch: typeof body.deleteBranch === 'boolean' ? body.deleteBranch : false,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
res.json(createApiSuccessResponse(result));
|
|
112
|
+
}),
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
return router;
|
|
116
|
+
}
|
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
import { execFileSync } from 'node:child_process';
|
|
2
|
-
import fs from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
|
|
5
|
-
const DEFAULT_CLAUDE_COMMAND = 'claude';
|
|
6
|
-
const CLAUDE_SCRIPT_EXTENSIONS = new Set(['.cjs', '.js', '.jsx', '.mjs', '.ts', '.tsx']);
|
|
7
|
-
const CLAUDE_WRAPPER_SEGMENTS = ['node_modules', '@anthropic-ai', 'claude-code', 'bin', 'claude.exe'] as const;
|
|
8
|
-
|
|
9
|
-
export type ResolveClaudeCodeExecutablePathDependencies = {
|
|
10
|
-
execFileSync?: typeof execFileSync;
|
|
11
|
-
existsSync?: typeof fs.existsSync;
|
|
12
|
-
platform?: NodeJS.Platform;
|
|
13
|
-
readFileSync?: typeof fs.readFileSync;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
function getPathApi(platform: NodeJS.Platform) {
|
|
17
|
-
return platform === 'win32' ? path.win32 : path;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function stripWrappingQuotes(value: string): string {
|
|
21
|
-
const trimmed = value.trim();
|
|
22
|
-
if (
|
|
23
|
-
(trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
24
|
-
(trimmed.startsWith("'") && trimmed.endsWith("'"))
|
|
25
|
-
) {
|
|
26
|
-
return trimmed.slice(1, -1);
|
|
27
|
-
}
|
|
28
|
-
return trimmed;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function isPathLike(value: string): boolean {
|
|
32
|
-
return value.includes('/') || value.includes('\\');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function resolveClaudeWrapperBinary(
|
|
36
|
-
wrapperPath: string,
|
|
37
|
-
deps: Required<ResolveClaudeCodeExecutablePathDependencies>,
|
|
38
|
-
): string | null {
|
|
39
|
-
const pathApi = getPathApi(deps.platform);
|
|
40
|
-
const directCandidate = pathApi.resolve(pathApi.dirname(wrapperPath), ...CLAUDE_WRAPPER_SEGMENTS);
|
|
41
|
-
|
|
42
|
-
if (deps.existsSync(directCandidate)) {
|
|
43
|
-
return directCandidate;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
let content: string;
|
|
47
|
-
try {
|
|
48
|
-
content = deps.readFileSync(wrapperPath, 'utf8');
|
|
49
|
-
} catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const matches = content.matchAll(/["']([^"'\\\r\n]*claude\.exe)["']/gi);
|
|
54
|
-
for (const match of matches) {
|
|
55
|
-
const rawTarget = match[1]
|
|
56
|
-
.replace(/^\$basedir[\\/]/i, '')
|
|
57
|
-
.replace(/^%dp0%[\\/]/i, '')
|
|
58
|
-
.replace(/^%~dp0[\\/]/i, '');
|
|
59
|
-
const normalizedTarget = rawTarget.replace(/[\\/]/g, pathApi.sep);
|
|
60
|
-
const candidate = pathApi.isAbsolute(normalizedTarget)
|
|
61
|
-
? normalizedTarget
|
|
62
|
-
: pathApi.resolve(pathApi.dirname(wrapperPath), normalizedTarget);
|
|
63
|
-
|
|
64
|
-
if (deps.existsSync(candidate)) {
|
|
65
|
-
return candidate;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function resolveWindowsClaudeExecutablePath(
|
|
73
|
-
configuredPath: string,
|
|
74
|
-
deps: Required<ResolveClaudeCodeExecutablePathDependencies>,
|
|
75
|
-
): string {
|
|
76
|
-
const pathApi = getPathApi(deps.platform);
|
|
77
|
-
const extension = pathApi.extname(configuredPath).toLowerCase();
|
|
78
|
-
const explicitPath = isPathLike(configuredPath) || pathApi.isAbsolute(configuredPath);
|
|
79
|
-
|
|
80
|
-
if (CLAUDE_SCRIPT_EXTENSIONS.has(extension)) {
|
|
81
|
-
return configuredPath;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (explicitPath && extension === '.exe') {
|
|
85
|
-
return configuredPath;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (explicitPath) {
|
|
89
|
-
return resolveClaudeWrapperBinary(configuredPath, deps) ?? configuredPath;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
try {
|
|
93
|
-
const stdout = deps.execFileSync('where.exe', [configuredPath], {
|
|
94
|
-
encoding: 'utf8',
|
|
95
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
96
|
-
windowsHide: true,
|
|
97
|
-
});
|
|
98
|
-
const candidates = stdout
|
|
99
|
-
.split(/\r?\n/)
|
|
100
|
-
.map((entry) => entry.trim())
|
|
101
|
-
.filter(Boolean);
|
|
102
|
-
|
|
103
|
-
for (const candidate of candidates) {
|
|
104
|
-
if (pathApi.extname(candidate).toLowerCase() === '.exe') {
|
|
105
|
-
return candidate;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
for (const candidate of candidates) {
|
|
110
|
-
const resolved = resolveClaudeWrapperBinary(candidate, deps);
|
|
111
|
-
if (resolved) {
|
|
112
|
-
return resolved;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
} catch {
|
|
116
|
-
return configuredPath;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return configuredPath;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function resolveClaudeCodeExecutablePath(
|
|
123
|
-
configuredPath: string | undefined = process.env.CLAUDE_CLI_PATH,
|
|
124
|
-
dependencies: ResolveClaudeCodeExecutablePathDependencies = {},
|
|
125
|
-
): string {
|
|
126
|
-
const deps: Required<ResolveClaudeCodeExecutablePathDependencies> = {
|
|
127
|
-
execFileSync: dependencies.execFileSync ?? execFileSync,
|
|
128
|
-
existsSync: dependencies.existsSync ?? fs.existsSync,
|
|
129
|
-
platform: dependencies.platform ?? process.platform,
|
|
130
|
-
readFileSync: dependencies.readFileSync ?? fs.readFileSync,
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const normalizedPath = stripWrappingQuotes(configuredPath || DEFAULT_CLAUDE_COMMAND);
|
|
134
|
-
if (deps.platform !== 'win32') {
|
|
135
|
-
return normalizedPath;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
return resolveWindowsClaudeExecutablePath(normalizedPath, deps);
|
|
139
|
-
}
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_CLAUDE_COMMAND = 'claude';
|
|
6
|
+
const CLAUDE_SCRIPT_EXTENSIONS = new Set(['.cjs', '.js', '.jsx', '.mjs', '.ts', '.tsx']);
|
|
7
|
+
const CLAUDE_WRAPPER_SEGMENTS = ['node_modules', '@anthropic-ai', 'claude-code', 'bin', 'claude.exe'] as const;
|
|
8
|
+
|
|
9
|
+
export type ResolveClaudeCodeExecutablePathDependencies = {
|
|
10
|
+
execFileSync?: typeof execFileSync;
|
|
11
|
+
existsSync?: typeof fs.existsSync;
|
|
12
|
+
platform?: NodeJS.Platform;
|
|
13
|
+
readFileSync?: typeof fs.readFileSync;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function getPathApi(platform: NodeJS.Platform) {
|
|
17
|
+
return platform === 'win32' ? path.win32 : path;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function stripWrappingQuotes(value: string): string {
|
|
21
|
+
const trimmed = value.trim();
|
|
22
|
+
if (
|
|
23
|
+
(trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
24
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))
|
|
25
|
+
) {
|
|
26
|
+
return trimmed.slice(1, -1);
|
|
27
|
+
}
|
|
28
|
+
return trimmed;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function isPathLike(value: string): boolean {
|
|
32
|
+
return value.includes('/') || value.includes('\\');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function resolveClaudeWrapperBinary(
|
|
36
|
+
wrapperPath: string,
|
|
37
|
+
deps: Required<ResolveClaudeCodeExecutablePathDependencies>,
|
|
38
|
+
): string | null {
|
|
39
|
+
const pathApi = getPathApi(deps.platform);
|
|
40
|
+
const directCandidate = pathApi.resolve(pathApi.dirname(wrapperPath), ...CLAUDE_WRAPPER_SEGMENTS);
|
|
41
|
+
|
|
42
|
+
if (deps.existsSync(directCandidate)) {
|
|
43
|
+
return directCandidate;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let content: string;
|
|
47
|
+
try {
|
|
48
|
+
content = deps.readFileSync(wrapperPath, 'utf8');
|
|
49
|
+
} catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const matches = content.matchAll(/["']([^"'\\\r\n]*claude\.exe)["']/gi);
|
|
54
|
+
for (const match of matches) {
|
|
55
|
+
const rawTarget = match[1]
|
|
56
|
+
.replace(/^\$basedir[\\/]/i, '')
|
|
57
|
+
.replace(/^%dp0%[\\/]/i, '')
|
|
58
|
+
.replace(/^%~dp0[\\/]/i, '');
|
|
59
|
+
const normalizedTarget = rawTarget.replace(/[\\/]/g, pathApi.sep);
|
|
60
|
+
const candidate = pathApi.isAbsolute(normalizedTarget)
|
|
61
|
+
? normalizedTarget
|
|
62
|
+
: pathApi.resolve(pathApi.dirname(wrapperPath), normalizedTarget);
|
|
63
|
+
|
|
64
|
+
if (deps.existsSync(candidate)) {
|
|
65
|
+
return candidate;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function resolveWindowsClaudeExecutablePath(
|
|
73
|
+
configuredPath: string,
|
|
74
|
+
deps: Required<ResolveClaudeCodeExecutablePathDependencies>,
|
|
75
|
+
): string {
|
|
76
|
+
const pathApi = getPathApi(deps.platform);
|
|
77
|
+
const extension = pathApi.extname(configuredPath).toLowerCase();
|
|
78
|
+
const explicitPath = isPathLike(configuredPath) || pathApi.isAbsolute(configuredPath);
|
|
79
|
+
|
|
80
|
+
if (CLAUDE_SCRIPT_EXTENSIONS.has(extension)) {
|
|
81
|
+
return configuredPath;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (explicitPath && extension === '.exe') {
|
|
85
|
+
return configuredPath;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (explicitPath) {
|
|
89
|
+
return resolveClaudeWrapperBinary(configuredPath, deps) ?? configuredPath;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
const stdout = deps.execFileSync('where.exe', [configuredPath], {
|
|
94
|
+
encoding: 'utf8',
|
|
95
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
96
|
+
windowsHide: true,
|
|
97
|
+
});
|
|
98
|
+
const candidates = stdout
|
|
99
|
+
.split(/\r?\n/)
|
|
100
|
+
.map((entry) => entry.trim())
|
|
101
|
+
.filter(Boolean);
|
|
102
|
+
|
|
103
|
+
for (const candidate of candidates) {
|
|
104
|
+
if (pathApi.extname(candidate).toLowerCase() === '.exe') {
|
|
105
|
+
return candidate;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
for (const candidate of candidates) {
|
|
110
|
+
const resolved = resolveClaudeWrapperBinary(candidate, deps);
|
|
111
|
+
if (resolved) {
|
|
112
|
+
return resolved;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
} catch {
|
|
116
|
+
return configuredPath;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return configuredPath;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function resolveClaudeCodeExecutablePath(
|
|
123
|
+
configuredPath: string | undefined = process.env.CLAUDE_CLI_PATH,
|
|
124
|
+
dependencies: ResolveClaudeCodeExecutablePathDependencies = {},
|
|
125
|
+
): string {
|
|
126
|
+
const deps: Required<ResolveClaudeCodeExecutablePathDependencies> = {
|
|
127
|
+
execFileSync: dependencies.execFileSync ?? execFileSync,
|
|
128
|
+
existsSync: dependencies.existsSync ?? fs.existsSync,
|
|
129
|
+
platform: dependencies.platform ?? process.platform,
|
|
130
|
+
readFileSync: dependencies.readFileSync ?? fs.readFileSync,
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const normalizedPath = stripWrappingQuotes(configuredPath || DEFAULT_CLAUDE_COMMAND);
|
|
134
|
+
if (deps.platform !== 'win32') {
|
|
135
|
+
return normalizedPath;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return resolveWindowsClaudeExecutablePath(normalizedPath, deps);
|
|
139
|
+
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import matter from 'gray-matter';
|
|
2
|
-
|
|
3
|
-
const disabledFrontmatterEngine = () => ({});
|
|
4
|
-
|
|
5
|
-
const frontmatterOptions = {
|
|
6
|
-
language: 'yaml',
|
|
7
|
-
// Disable JS/JSON frontmatter parsing to avoid executable project content.
|
|
8
|
-
// Mirrors Gatsby's mitigation for gray-matter.
|
|
9
|
-
engines: {
|
|
10
|
-
js: disabledFrontmatterEngine,
|
|
11
|
-
javascript: disabledFrontmatterEngine,
|
|
12
|
-
json: disabledFrontmatterEngine,
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export function parseFrontMatter(content: string) {
|
|
17
|
-
return matter(content, frontmatterOptions);
|
|
18
|
-
}
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
|
|
3
|
+
const disabledFrontmatterEngine = () => ({});
|
|
4
|
+
|
|
5
|
+
const frontmatterOptions = {
|
|
6
|
+
language: 'yaml',
|
|
7
|
+
// Disable JS/JSON frontmatter parsing to avoid executable project content.
|
|
8
|
+
// Mirrors Gatsby's mitigation for gray-matter.
|
|
9
|
+
engines: {
|
|
10
|
+
js: disabledFrontmatterEngine,
|
|
11
|
+
javascript: disabledFrontmatterEngine,
|
|
12
|
+
json: disabledFrontmatterEngine,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function parseFrontMatter(content: string) {
|
|
17
|
+
return matter(content, frontmatterOptions);
|
|
18
|
+
}
|