@minimalcorp/tsunagi 0.1.43 → 0.1.45

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 (48) hide show
  1. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  3. package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  5. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  12. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  15. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  16. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  17. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  18. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  19. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  20. package/.next/standalone/apps/web/.next/server/app/index.rsc +2 -2
  21. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  22. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +2 -2
  23. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  24. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  25. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  26. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  28. package/.next/standalone/apps/web/.next/server/app/settings.rsc +1 -1
  29. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  30. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  31. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  32. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  33. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  34. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  35. package/.next/standalone/apps/web/.next/server/chunks/ssr/_0g.cd6a._.js +2 -2
  36. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  37. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  38. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  39. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
  40. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  41. package/.next/standalone/apps/web/.next/static/chunks/{0u_07wgcigiqu.js → 1058etup1xz7n.js} +2 -2
  42. package/dist/cli.js +4 -2
  43. package/dist/server/routes/repos.js +20 -15
  44. package/npm-shrinkwrap.json +193 -5
  45. package/package.json +3 -2
  46. /package/.next/standalone/apps/web/.next/static/{oMoJ6ksWSsDkoV7dPvxim → _UgZlh-9t1rlWoj3jUZz0}/_buildManifest.js +0 -0
  47. /package/.next/standalone/apps/web/.next/static/{oMoJ6ksWSsDkoV7dPvxim → _UgZlh-9t1rlWoj3jUZz0}/_clientMiddlewareManifest.js +0 -0
  48. /package/.next/standalone/apps/web/.next/static/{oMoJ6ksWSsDkoV7dPvxim → _UgZlh-9t1rlWoj3jUZz0}/_ssgManifest.js +0 -0
@@ -215,39 +215,44 @@ export async function reposRoutes(fastify) {
215
215
  fastify.log.warn(cleanupError, 'Failed to cleanup bare repository after clone failure');
216
216
  }
217
217
  };
218
- const sshUrl = `git@github.com:${owner}/${repo}.git`;
219
218
  const isHttpsUrl = normalizedUrl.startsWith('http');
219
+ const protocol = isHttpsUrl ? 'HTTPS' : 'SSH';
220
+ const altProtocol = isHttpsUrl ? 'SSH' : 'HTTPS';
221
+ // 認証エラー時にもう一方の方式で試し直すためのURL
222
+ const altUrl = isHttpsUrl
223
+ ? `git@github.com:${owner}/${repo}.git`
224
+ : `https://github.com/${owner}/${repo}.git`;
220
225
  let clonedUrl = normalizedUrl;
221
226
  try {
222
227
  await worktreeManager.initBareRepository(owner, repo, normalizedUrl);
223
228
  }
224
229
  catch (error) {
225
230
  await cleanupBareRepo();
226
- // private repository を HTTPS で clone するには認証が必要。
227
- // tsunagi は SSH agent 前提で動くため、認証エラーなら SSH で自動的に試し直す。
228
- if (!isHttpsUrl || !isGitAuthError(error))
231
+ // 認証手段は環境により異なる(SSH鍵のみ / HTTPS + credential helper のみ 等)。
232
+ // 認証エラーならもう一方の方式で自動的に試し直す。
233
+ if (!isGitAuthError(error))
229
234
  throw error;
230
- fastify.log.info({ owner, repo }, 'HTTPS clone failed with an auth error, retrying over SSH');
235
+ fastify.log.info({ owner, repo }, `${protocol} clone failed with an auth error, retrying over ${altProtocol}`);
231
236
  try {
232
- await worktreeManager.initBareRepository(owner, repo, sshUrl);
233
- clonedUrl = sshUrl;
237
+ await worktreeManager.initBareRepository(owner, repo, altUrl);
238
+ clonedUrl = altUrl;
234
239
  }
235
- catch (sshError) {
240
+ catch (altError) {
236
241
  await cleanupBareRepo();
237
- const httpsMessage = error instanceof Error ? error.message : String(error);
238
- const sshMessage = sshError instanceof Error ? sshError.message : String(sshError);
242
+ const message = error instanceof Error ? error.message : String(error);
243
+ const altMessage = altError instanceof Error ? altError.message : String(altError);
239
244
  throw new Error(`Failed to clone ${owner}/${repo}. ` +
240
- `HTTPS では認証情報が無いため失敗し、SSH でも失敗しました。` +
241
- `SSH鍵(ssh-agent)を設定するか、リポジトリへのアクセス権を確認してください。\n` +
242
- `HTTPS: ${httpsMessage.trim()}\nSSH: ${sshMessage.trim()}`);
245
+ `HTTPS・SSH のどちらでも認証に失敗しました。` +
246
+ `SSH鍵(ssh-agent)または git の credential helper を設定するか、リポジトリへのアクセス権を確認してください。\n` +
247
+ `${protocol}: ${message.trim()}\n${altProtocol}: ${altMessage.trim()}`);
243
248
  }
244
249
  }
245
250
  const newRepo = await createRepo({ owner, repo, cloneUrl: clonedUrl });
246
251
  return reply.status(200).send({
247
252
  data: {
248
253
  repository: { ...newRepo, bareRepoPath },
249
- // HTTPSで認証できずSSHで clone し直した場合、UI側で利用者に知らせる
250
- fallbackToSsh: clonedUrl !== normalizedUrl,
254
+ // 認証できず別方式で clone し直した場合、UI側で利用者に知らせる
255
+ fallbackProtocol: clonedUrl !== normalizedUrl ? altProtocol.toLowerCase() : null,
251
256
  },
252
257
  });
253
258
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@minimalcorp/tsunagi",
9
- "version": "0.1.43",
9
+ "version": "0.1.45",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "os": [
12
12
  "darwin",
@@ -23,6 +23,7 @@
23
23
  "dotenv": "^17.2.3",
24
24
  "fastify": "^5.8.2",
25
25
  "node-pty": "^1.1.0",
26
+ "open": "^11.0.4",
26
27
  "prisma": "^7.3.0",
27
28
  "simple-git": "^3.30.0",
28
29
  "socket.io": "^4.8.3",
@@ -1063,9 +1064,9 @@
1063
1064
  }
1064
1065
  },
1065
1066
  "node_modules/@simple-git/args-pathspec": {
1066
- "version": "1.0.3",
1067
- "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz",
1068
- "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==",
1067
+ "version": "1.0.4",
1068
+ "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.4.tgz",
1069
+ "integrity": "sha512-EtMX6XjRWSastG2SdkmSQByPtJ9dx/NIjnHbpQPCYt62j4RmSx5rgLTGpw0YCjF5h191gZOmBfheOT23cRSFdw==",
1069
1070
  "license": "MIT"
1070
1071
  },
1071
1072
  "node_modules/@simple-git/argv-parser": {
@@ -1498,6 +1499,21 @@
1498
1499
  "url": "https://opencollective.com/express"
1499
1500
  }
1500
1501
  },
1502
+ "node_modules/bundle-name": {
1503
+ "version": "4.1.0",
1504
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
1505
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
1506
+ "license": "MIT",
1507
+ "dependencies": {
1508
+ "run-applescript": "^7.0.0"
1509
+ },
1510
+ "engines": {
1511
+ "node": ">=18"
1512
+ },
1513
+ "funding": {
1514
+ "url": "https://github.com/sponsors/sindresorhus"
1515
+ }
1516
+ },
1501
1517
  "node_modules/bytes": {
1502
1518
  "version": "3.1.2",
1503
1519
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -1830,6 +1846,46 @@
1830
1846
  "node": ">=16.0.0"
1831
1847
  }
1832
1848
  },
1849
+ "node_modules/default-browser": {
1850
+ "version": "5.5.1",
1851
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz",
1852
+ "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==",
1853
+ "license": "MIT",
1854
+ "dependencies": {
1855
+ "bundle-name": "^4.1.0",
1856
+ "default-browser-id": "^5.0.0"
1857
+ },
1858
+ "engines": {
1859
+ "node": ">=18"
1860
+ },
1861
+ "funding": {
1862
+ "url": "https://github.com/sponsors/sindresorhus"
1863
+ }
1864
+ },
1865
+ "node_modules/default-browser-id": {
1866
+ "version": "5.0.1",
1867
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
1868
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
1869
+ "license": "MIT",
1870
+ "engines": {
1871
+ "node": ">=18"
1872
+ },
1873
+ "funding": {
1874
+ "url": "https://github.com/sponsors/sindresorhus"
1875
+ }
1876
+ },
1877
+ "node_modules/define-lazy-prop": {
1878
+ "version": "3.0.0",
1879
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
1880
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
1881
+ "license": "MIT",
1882
+ "engines": {
1883
+ "node": ">=12"
1884
+ },
1885
+ "funding": {
1886
+ "url": "https://github.com/sponsors/sindresorhus"
1887
+ }
1888
+ },
1833
1889
  "node_modules/defu": {
1834
1890
  "version": "6.1.7",
1835
1891
  "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
@@ -2659,6 +2715,51 @@
2659
2715
  "node": ">= 10"
2660
2716
  }
2661
2717
  },
2718
+ "node_modules/is-docker": {
2719
+ "version": "3.0.0",
2720
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
2721
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
2722
+ "license": "MIT",
2723
+ "bin": {
2724
+ "is-docker": "cli.js"
2725
+ },
2726
+ "engines": {
2727
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
2728
+ },
2729
+ "funding": {
2730
+ "url": "https://github.com/sponsors/sindresorhus"
2731
+ }
2732
+ },
2733
+ "node_modules/is-in-ssh": {
2734
+ "version": "1.0.0",
2735
+ "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz",
2736
+ "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==",
2737
+ "license": "MIT",
2738
+ "engines": {
2739
+ "node": ">=20"
2740
+ },
2741
+ "funding": {
2742
+ "url": "https://github.com/sponsors/sindresorhus"
2743
+ }
2744
+ },
2745
+ "node_modules/is-inside-container": {
2746
+ "version": "1.0.0",
2747
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
2748
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
2749
+ "license": "MIT",
2750
+ "dependencies": {
2751
+ "is-docker": "^3.0.0"
2752
+ },
2753
+ "bin": {
2754
+ "is-inside-container": "cli.js"
2755
+ },
2756
+ "engines": {
2757
+ "node": ">=14.16"
2758
+ },
2759
+ "funding": {
2760
+ "url": "https://github.com/sponsors/sindresorhus"
2761
+ }
2762
+ },
2662
2763
  "node_modules/is-promise": {
2663
2764
  "version": "4.0.0",
2664
2765
  "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
@@ -2671,6 +2772,21 @@
2671
2772
  "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
2672
2773
  "license": "MIT"
2673
2774
  },
2775
+ "node_modules/is-wsl": {
2776
+ "version": "3.1.1",
2777
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
2778
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
2779
+ "license": "MIT",
2780
+ "dependencies": {
2781
+ "is-inside-container": "^1.0.0"
2782
+ },
2783
+ "engines": {
2784
+ "node": ">=16"
2785
+ },
2786
+ "funding": {
2787
+ "url": "https://github.com/sponsors/sindresorhus"
2788
+ }
2789
+ },
2674
2790
  "node_modules/isexe": {
2675
2791
  "version": "2.0.0",
2676
2792
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -3076,6 +3192,26 @@
3076
3192
  "wrappy": "1"
3077
3193
  }
3078
3194
  },
3195
+ "node_modules/open": {
3196
+ "version": "11.0.4",
3197
+ "resolved": "https://registry.npmjs.org/open/-/open-11.0.4.tgz",
3198
+ "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==",
3199
+ "license": "MIT",
3200
+ "dependencies": {
3201
+ "default-browser": "^5.5.1",
3202
+ "define-lazy-prop": "^3.0.0",
3203
+ "is-in-ssh": "^1.0.0",
3204
+ "is-inside-container": "^1.0.0",
3205
+ "powershell-utils": "^0.2.1",
3206
+ "wsl-utils": "^1.0.0"
3207
+ },
3208
+ "engines": {
3209
+ "node": ">=20"
3210
+ },
3211
+ "funding": {
3212
+ "url": "https://github.com/sponsors/sindresorhus"
3213
+ }
3214
+ },
3079
3215
  "node_modules/parseurl": {
3080
3216
  "version": "1.3.3",
3081
3217
  "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -3192,6 +3328,18 @@
3192
3328
  "url": "https://github.com/sponsors/porsager"
3193
3329
  }
3194
3330
  },
3331
+ "node_modules/powershell-utils": {
3332
+ "version": "0.2.1",
3333
+ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz",
3334
+ "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==",
3335
+ "license": "MIT",
3336
+ "engines": {
3337
+ "node": ">=20"
3338
+ },
3339
+ "funding": {
3340
+ "url": "https://github.com/sponsors/sindresorhus"
3341
+ }
3342
+ },
3195
3343
  "node_modules/prisma": {
3196
3344
  "version": "7.10.0",
3197
3345
  "resolved": "https://registry.npmjs.org/prisma/-/prisma-7.10.0.tgz",
@@ -3462,6 +3610,18 @@
3462
3610
  "node": ">= 18"
3463
3611
  }
3464
3612
  },
3613
+ "node_modules/run-applescript": {
3614
+ "version": "7.1.0",
3615
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
3616
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
3617
+ "license": "MIT",
3618
+ "engines": {
3619
+ "node": ">=18"
3620
+ },
3621
+ "funding": {
3622
+ "url": "https://github.com/sponsors/sindresorhus"
3623
+ }
3624
+ },
3465
3625
  "node_modules/safe-regex2": {
3466
3626
  "version": "5.1.1",
3467
3627
  "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz",
@@ -4020,6 +4180,34 @@
4020
4180
  }
4021
4181
  }
4022
4182
  },
4183
+ "node_modules/wsl-utils": {
4184
+ "version": "1.0.0",
4185
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz",
4186
+ "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==",
4187
+ "license": "MIT",
4188
+ "dependencies": {
4189
+ "is-wsl": "^3.1.0",
4190
+ "powershell-utils": "^0.1.0"
4191
+ },
4192
+ "engines": {
4193
+ "node": ">=20"
4194
+ },
4195
+ "funding": {
4196
+ "url": "https://github.com/sponsors/sindresorhus"
4197
+ }
4198
+ },
4199
+ "node_modules/wsl-utils/node_modules/powershell-utils": {
4200
+ "version": "0.1.0",
4201
+ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz",
4202
+ "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==",
4203
+ "license": "MIT",
4204
+ "engines": {
4205
+ "node": ">=20"
4206
+ },
4207
+ "funding": {
4208
+ "url": "https://github.com/sponsors/sindresorhus"
4209
+ }
4210
+ },
4023
4211
  "node_modules/zeptomatch": {
4024
4212
  "version": "2.1.0",
4025
4213
  "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "description": "Multi-repo GitHub project management with Claude AI integration, designed for visualizing and controlling AI-driven development locally.",
5
5
  "keywords": [
6
6
  "tsunagi",
@@ -56,13 +56,14 @@
56
56
  "@fastify/cors": "^11.2.0",
57
57
  "@fastify/http-proxy": "^11.5.0",
58
58
  "@fastify/multipart": "^10.1.0",
59
- "dotenv": "^17.2.3",
60
59
  "@libsql/client": "0.8.1",
61
60
  "@modelcontextprotocol/sdk": "^1.27.1",
62
61
  "@prisma/adapter-libsql": "^7.3.0",
63
62
  "@prisma/client": "^7.3.0",
63
+ "dotenv": "^17.2.3",
64
64
  "fastify": "^5.8.2",
65
65
  "node-pty": "^1.1.0",
66
+ "open": "^11.0.4",
66
67
  "prisma": "^7.3.0",
67
68
  "simple-git": "^3.30.0",
68
69
  "socket.io": "^4.8.3",