@claudetools/cli 0.13.12 → 0.13.15

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 (368) hide show
  1. package/dist/__tests__/factories.d.ts +173 -0
  2. package/dist/__tests__/factories.d.ts.map +1 -0
  3. package/dist/__tests__/factories.js +150 -0
  4. package/dist/__tests__/factories.js.map +1 -0
  5. package/dist/__tests__/helpers.d.ts +36 -0
  6. package/dist/__tests__/helpers.d.ts.map +1 -0
  7. package/dist/__tests__/helpers.js +52 -0
  8. package/dist/__tests__/helpers.js.map +1 -0
  9. package/dist/analytics/index.d.ts +14 -0
  10. package/dist/analytics/index.d.ts.map +1 -0
  11. package/dist/analytics/index.js +259 -0
  12. package/dist/analytics/index.js.map +1 -0
  13. package/dist/analytics/session.d.ts +17 -0
  14. package/dist/analytics/session.d.ts.map +1 -0
  15. package/dist/analytics/session.js +130 -0
  16. package/dist/analytics/session.js.map +1 -0
  17. package/dist/analytics/token-tracker.d.ts +48 -0
  18. package/dist/analytics/token-tracker.d.ts.map +1 -0
  19. package/dist/analytics/token-tracker.js +269 -0
  20. package/dist/analytics/token-tracker.js.map +1 -0
  21. package/dist/analytics/tracker.d.ts +33 -0
  22. package/dist/analytics/tracker.d.ts.map +1 -0
  23. package/dist/analytics/tracker.js +210 -0
  24. package/dist/analytics/tracker.js.map +1 -0
  25. package/dist/api-keys/index.d.ts +15 -0
  26. package/dist/api-keys/index.d.ts.map +1 -0
  27. package/dist/api-keys/index.js +228 -0
  28. package/dist/api-keys/index.js.map +1 -0
  29. package/dist/auth/config.d.ts +15 -0
  30. package/dist/auth/config.d.ts.map +1 -0
  31. package/dist/auth/config.js +67 -0
  32. package/dist/auth/config.js.map +1 -0
  33. package/dist/auth/index.d.ts +8 -0
  34. package/dist/auth/index.d.ts.map +1 -0
  35. package/dist/auth/index.js +299 -0
  36. package/dist/auth/index.js.map +1 -0
  37. package/dist/auth/keychain.d.ts +21 -0
  38. package/dist/auth/keychain.d.ts.map +1 -0
  39. package/dist/auth/keychain.js +256 -0
  40. package/dist/auth/keychain.js.map +1 -0
  41. package/dist/billing/index.d.ts +7 -0
  42. package/dist/billing/index.d.ts.map +1 -0
  43. package/dist/billing/index.js +233 -0
  44. package/dist/billing/index.js.map +1 -0
  45. package/dist/cli.js +291 -43
  46. package/dist/cli.js.map +1 -1
  47. package/dist/commands/hook.d.ts +12 -0
  48. package/dist/commands/hook.d.ts.map +1 -0
  49. package/dist/commands/hook.js +190 -0
  50. package/dist/commands/hook.js.map +1 -0
  51. package/dist/commands/keys.d.ts +4 -0
  52. package/dist/commands/keys.d.ts.map +1 -0
  53. package/dist/commands/keys.js +43 -0
  54. package/dist/commands/keys.js.map +1 -0
  55. package/dist/commands/mcp.d.ts +4 -0
  56. package/dist/commands/mcp.d.ts.map +1 -0
  57. package/dist/commands/mcp.js +43 -0
  58. package/dist/commands/mcp.js.map +1 -0
  59. package/dist/commands/project.d.ts +4 -0
  60. package/dist/commands/project.d.ts.map +1 -0
  61. package/dist/commands/project.js +68 -0
  62. package/dist/commands/project.js.map +1 -0
  63. package/dist/commands/skill.d.ts +4 -0
  64. package/dist/commands/skill.d.ts.map +1 -0
  65. package/dist/commands/skill.js +37 -0
  66. package/dist/commands/skill.js.map +1 -0
  67. package/dist/commands/stacks.d.ts +4 -0
  68. package/dist/commands/stacks.d.ts.map +1 -0
  69. package/dist/commands/stacks.js +103 -0
  70. package/dist/commands/stacks.js.map +1 -0
  71. package/dist/commands/stats.d.ts +4 -0
  72. package/dist/commands/stats.d.ts.map +1 -0
  73. package/dist/commands/stats.js +6 -0
  74. package/dist/commands/stats.js.map +1 -0
  75. package/dist/commands/sync.d.ts +4 -0
  76. package/dist/commands/sync.d.ts.map +1 -0
  77. package/dist/commands/sync.js +60 -0
  78. package/dist/commands/sync.js.map +1 -0
  79. package/dist/commands/update.d.ts +4 -0
  80. package/dist/commands/update.d.ts.map +1 -0
  81. package/dist/commands/update.js +63 -0
  82. package/dist/commands/update.js.map +1 -0
  83. package/dist/daemon/client.d.ts +107 -0
  84. package/dist/daemon/client.d.ts.map +1 -0
  85. package/dist/daemon/client.js +250 -0
  86. package/dist/daemon/client.js.map +1 -0
  87. package/dist/daemon/health.d.ts +38 -0
  88. package/dist/daemon/health.d.ts.map +1 -0
  89. package/dist/daemon/health.js +212 -0
  90. package/dist/daemon/health.js.map +1 -0
  91. package/dist/daemon/index.d.ts +34 -0
  92. package/dist/daemon/index.d.ts.map +1 -0
  93. package/dist/daemon/index.js +197 -0
  94. package/dist/daemon/index.js.map +1 -0
  95. package/dist/daemon/protocol.d.ts +144 -0
  96. package/dist/daemon/protocol.d.ts.map +1 -0
  97. package/dist/daemon/protocol.js +5 -0
  98. package/dist/daemon/protocol.js.map +1 -0
  99. package/dist/gamification/index.d.ts +13 -0
  100. package/dist/gamification/index.d.ts.map +1 -0
  101. package/dist/gamification/index.js +120 -0
  102. package/dist/gamification/index.js.map +1 -0
  103. package/dist/gamification/types.d.ts +34 -0
  104. package/dist/gamification/types.d.ts.map +1 -0
  105. package/dist/gamification/types.js +5 -0
  106. package/dist/gamification/types.js.map +1 -0
  107. package/dist/hooks/index.d.ts +65 -0
  108. package/dist/hooks/index.d.ts.map +1 -0
  109. package/dist/hooks/index.js +403 -0
  110. package/dist/hooks/index.js.map +1 -0
  111. package/dist/lib/api.d.ts +29 -0
  112. package/dist/lib/api.d.ts.map +1 -0
  113. package/dist/lib/api.js +213 -0
  114. package/dist/lib/api.js.map +1 -0
  115. package/dist/lib/browser.d.ts +6 -0
  116. package/dist/lib/browser.d.ts.map +1 -0
  117. package/dist/lib/browser.js +14 -0
  118. package/dist/lib/browser.js.map +1 -0
  119. package/dist/lib/channel-config.d.ts +10 -0
  120. package/dist/lib/channel-config.d.ts.map +1 -0
  121. package/dist/lib/channel-config.js +48 -0
  122. package/dist/lib/channel-config.js.map +1 -0
  123. package/dist/lib/command-runner.d.ts +16 -0
  124. package/dist/lib/command-runner.d.ts.map +1 -0
  125. package/dist/lib/command-runner.js +59 -0
  126. package/dist/lib/command-runner.js.map +1 -0
  127. package/dist/lib/command-utils.d.ts +22 -0
  128. package/dist/lib/command-utils.d.ts.map +1 -0
  129. package/dist/lib/command-utils.js +88 -0
  130. package/dist/lib/command-utils.js.map +1 -0
  131. package/dist/lib/error-handler.d.ts +13 -0
  132. package/dist/lib/error-handler.d.ts.map +1 -0
  133. package/dist/lib/error-handler.js +70 -0
  134. package/dist/lib/error-handler.js.map +1 -0
  135. package/dist/lib/errors.d.ts +35 -0
  136. package/dist/lib/errors.d.ts.map +1 -0
  137. package/dist/lib/errors.js +70 -0
  138. package/dist/lib/errors.js.map +1 -0
  139. package/dist/lib/exit.d.ts +10 -0
  140. package/dist/lib/exit.d.ts.map +1 -0
  141. package/dist/lib/exit.js +21 -0
  142. package/dist/lib/exit.js.map +1 -0
  143. package/dist/lib/formatters.d.ts +65 -0
  144. package/dist/lib/formatters.d.ts.map +1 -0
  145. package/dist/lib/formatters.js +180 -0
  146. package/dist/lib/formatters.js.map +1 -0
  147. package/dist/lib/hybrid-data.d.ts +47 -0
  148. package/dist/lib/hybrid-data.d.ts.map +1 -0
  149. package/dist/lib/hybrid-data.js +326 -0
  150. package/dist/lib/hybrid-data.js.map +1 -0
  151. package/dist/lib/local-store.d.ts +113 -0
  152. package/dist/lib/local-store.d.ts.map +1 -0
  153. package/dist/lib/local-store.js +220 -0
  154. package/dist/lib/local-store.js.map +1 -0
  155. package/dist/lib/machine-id.d.ts +8 -0
  156. package/dist/lib/machine-id.d.ts.map +1 -0
  157. package/dist/lib/machine-id.js +39 -0
  158. package/dist/lib/machine-id.js.map +1 -0
  159. package/dist/lib/network.d.ts +15 -0
  160. package/dist/lib/network.d.ts.map +1 -0
  161. package/dist/lib/network.js +46 -0
  162. package/dist/lib/network.js.map +1 -0
  163. package/dist/lib/theme.d.ts +77 -0
  164. package/dist/lib/theme.d.ts.map +1 -0
  165. package/dist/lib/theme.js +137 -0
  166. package/dist/lib/theme.js.map +1 -0
  167. package/dist/lib/tool-availability.d.ts +13 -0
  168. package/dist/lib/tool-availability.d.ts.map +1 -0
  169. package/dist/lib/tool-availability.js +48 -0
  170. package/dist/lib/tool-availability.js.map +1 -0
  171. package/dist/lib/update-checker.d.ts +21 -0
  172. package/dist/lib/update-checker.d.ts.map +1 -0
  173. package/dist/lib/update-checker.js +110 -0
  174. package/dist/lib/update-checker.js.map +1 -0
  175. package/dist/lib/validation.d.ts +30 -0
  176. package/dist/lib/validation.d.ts.map +1 -0
  177. package/dist/lib/validation.js +82 -0
  178. package/dist/lib/validation.js.map +1 -0
  179. package/dist/lib/validators.d.ts +18 -0
  180. package/dist/lib/validators.d.ts.map +1 -0
  181. package/dist/lib/validators.js +30 -0
  182. package/dist/lib/validators.js.map +1 -0
  183. package/dist/marketplace/api.d.ts +24 -0
  184. package/dist/marketplace/api.d.ts.map +1 -0
  185. package/dist/marketplace/api.js +92 -0
  186. package/dist/marketplace/api.js.map +1 -0
  187. package/dist/marketplace/index.d.ts +13 -0
  188. package/dist/marketplace/index.d.ts.map +1 -0
  189. package/dist/marketplace/index.js +155 -0
  190. package/dist/marketplace/index.js.map +1 -0
  191. package/dist/marketplace/installer.d.ts +18 -0
  192. package/dist/marketplace/installer.d.ts.map +1 -0
  193. package/dist/marketplace/installer.js +184 -0
  194. package/dist/marketplace/installer.js.map +1 -0
  195. package/dist/mcp/api.d.ts +93 -0
  196. package/dist/mcp/api.d.ts.map +1 -0
  197. package/dist/mcp/api.js +106 -0
  198. package/dist/mcp/api.js.map +1 -0
  199. package/dist/mcp/config.d.ts +72 -0
  200. package/dist/mcp/config.d.ts.map +1 -0
  201. package/dist/mcp/config.js +156 -0
  202. package/dist/mcp/config.js.map +1 -0
  203. package/dist/mcp/index.d.ts +54 -0
  204. package/dist/mcp/index.d.ts.map +1 -0
  205. package/dist/mcp/index.js +381 -0
  206. package/dist/mcp/index.js.map +1 -0
  207. package/dist/mcp/prompt.clean.d.ts +25 -0
  208. package/dist/mcp/prompt.clean.d.ts.map +1 -0
  209. package/dist/mcp/prompt.clean.js +206 -0
  210. package/dist/mcp/prompt.clean.js.map +1 -0
  211. package/dist/mcp/prompt.d.ts +52 -0
  212. package/dist/mcp/prompt.d.ts.map +1 -0
  213. package/dist/mcp/prompt.js +210 -0
  214. package/dist/mcp/prompt.js.map +1 -0
  215. package/dist/mcp/secrets.clean.d.ts +18 -0
  216. package/dist/mcp/secrets.clean.d.ts.map +1 -0
  217. package/dist/mcp/secrets.clean.js +357 -0
  218. package/dist/mcp/secrets.clean.js.map +1 -0
  219. package/dist/mcp/secrets.d.ts +46 -0
  220. package/dist/mcp/secrets.d.ts.map +1 -0
  221. package/dist/mcp/secrets.js +339 -0
  222. package/dist/mcp/secrets.js.map +1 -0
  223. package/dist/memory/index.d.ts +14 -0
  224. package/dist/memory/index.d.ts.map +1 -0
  225. package/dist/memory/index.js +98 -0
  226. package/dist/memory/index.js.map +1 -0
  227. package/dist/onboard/agents-md-builder.d.ts.map +1 -1
  228. package/dist/onboard/agents-md-builder.js +45 -0
  229. package/dist/onboard/agents-md-builder.js.map +1 -1
  230. package/dist/onboard/claude-inference.d.ts.map +1 -1
  231. package/dist/onboard/claude-inference.js +31 -5
  232. package/dist/onboard/claude-inference.js.map +1 -1
  233. package/dist/onboard/context7-fetcher.d.ts +1 -1
  234. package/dist/onboard/context7-fetcher.d.ts.map +1 -1
  235. package/dist/onboard/context7-fetcher.js +50 -16
  236. package/dist/onboard/context7-fetcher.js.map +1 -1
  237. package/dist/onboard/docs-builder.d.ts.map +1 -1
  238. package/dist/onboard/docs-builder.js +523 -50
  239. package/dist/onboard/docs-builder.js.map +1 -1
  240. package/dist/onboard/index.d.ts.map +1 -1
  241. package/dist/onboard/index.js +74 -25
  242. package/dist/onboard/index.js.map +1 -1
  243. package/dist/onboard/stack-detector.d.ts.map +1 -1
  244. package/dist/onboard/stack-detector.js +5 -55
  245. package/dist/onboard/stack-detector.js.map +1 -1
  246. package/dist/project/constants.d.ts +21 -0
  247. package/dist/project/constants.d.ts.map +1 -0
  248. package/dist/project/constants.js +21 -0
  249. package/dist/project/constants.js.map +1 -0
  250. package/dist/project/format.d.ts +16 -0
  251. package/dist/project/format.d.ts.map +1 -0
  252. package/dist/project/format.js +40 -0
  253. package/dist/project/format.js.map +1 -0
  254. package/dist/project/git.d.ts +28 -0
  255. package/dist/project/git.d.ts.map +1 -0
  256. package/dist/project/git.js +93 -0
  257. package/dist/project/git.js.map +1 -0
  258. package/dist/project/index.d.ts +36 -0
  259. package/dist/project/index.d.ts.map +1 -0
  260. package/dist/project/index.js +272 -0
  261. package/dist/project/index.js.map +1 -0
  262. package/dist/project/mapper.d.ts +27 -0
  263. package/dist/project/mapper.d.ts.map +1 -0
  264. package/dist/project/mapper.js +64 -0
  265. package/dist/project/mapper.js.map +1 -0
  266. package/dist/project/storage.d.ts +71 -0
  267. package/dist/project/storage.d.ts.map +1 -0
  268. package/dist/project/storage.js +274 -0
  269. package/dist/project/storage.js.map +1 -0
  270. package/dist/project/sync-bridge.d.ts +33 -0
  271. package/dist/project/sync-bridge.d.ts.map +1 -0
  272. package/dist/project/sync-bridge.js +155 -0
  273. package/dist/project/sync-bridge.js.map +1 -0
  274. package/dist/project/types.d.ts +107 -0
  275. package/dist/project/types.d.ts.map +1 -0
  276. package/dist/project/types.js +77 -0
  277. package/dist/project/types.js.map +1 -0
  278. package/dist/publish/index.d.ts +4 -0
  279. package/dist/publish/index.d.ts.map +1 -0
  280. package/dist/publish/index.js +92 -0
  281. package/dist/publish/index.js.map +1 -0
  282. package/dist/setup.d.ts.map +1 -1
  283. package/dist/setup.js +29 -10
  284. package/dist/setup.js.map +1 -1
  285. package/dist/skills/index.d.ts +51 -0
  286. package/dist/skills/index.d.ts.map +1 -0
  287. package/dist/skills/index.js +509 -0
  288. package/dist/skills/index.js.map +1 -0
  289. package/dist/stacks/check.d.ts +2 -0
  290. package/dist/stacks/check.d.ts.map +1 -0
  291. package/dist/stacks/check.js +144 -0
  292. package/dist/stacks/check.js.map +1 -0
  293. package/dist/stacks/diff.d.ts +11 -0
  294. package/dist/stacks/diff.d.ts.map +1 -0
  295. package/dist/stacks/diff.js +123 -0
  296. package/dist/stacks/diff.js.map +1 -0
  297. package/dist/stacks/index.d.ts +17 -0
  298. package/dist/stacks/index.d.ts.map +1 -0
  299. package/dist/stacks/index.js +525 -0
  300. package/dist/stacks/index.js.map +1 -0
  301. package/dist/stacks/index.refactored.d.ts.map +1 -0
  302. package/dist/stacks/index.refactored.js.map +1 -0
  303. package/dist/stacks/io.d.ts +11 -0
  304. package/dist/stacks/io.d.ts.map +1 -0
  305. package/dist/stacks/io.js +179 -0
  306. package/dist/stacks/io.js.map +1 -0
  307. package/dist/stacks/rollback.d.ts +5 -0
  308. package/dist/stacks/rollback.d.ts.map +1 -0
  309. package/dist/stacks/rollback.js +162 -0
  310. package/dist/stacks/rollback.js.map +1 -0
  311. package/dist/stacks/types.d.ts +70 -0
  312. package/dist/stacks/types.d.ts.map +1 -0
  313. package/dist/stacks/types.js +6 -0
  314. package/dist/stacks/types.js.map +1 -0
  315. package/dist/stacks/utils.d.ts +9 -0
  316. package/dist/stacks/utils.d.ts.map +1 -0
  317. package/dist/stacks/utils.js +11 -0
  318. package/dist/stacks/utils.js.map +1 -0
  319. package/dist/start/index.d.ts +23 -0
  320. package/dist/start/index.d.ts.map +1 -0
  321. package/dist/start/index.js +386 -0
  322. package/dist/start/index.js.map +1 -0
  323. package/dist/sync/index.d.ts +49 -0
  324. package/dist/sync/index.d.ts.map +1 -0
  325. package/dist/sync/index.js +207 -0
  326. package/dist/sync/index.js.map +1 -0
  327. package/dist/sync-engine/__tests__/test-helpers.d.ts +14 -0
  328. package/dist/sync-engine/__tests__/test-helpers.d.ts.map +1 -0
  329. package/dist/sync-engine/__tests__/test-helpers.js +73 -0
  330. package/dist/sync-engine/__tests__/test-helpers.js.map +1 -0
  331. package/dist/sync-engine/client.d.ts +128 -0
  332. package/dist/sync-engine/client.d.ts.map +1 -0
  333. package/dist/sync-engine/client.js +289 -0
  334. package/dist/sync-engine/client.js.map +1 -0
  335. package/dist/sync-engine/health.d.ts +38 -0
  336. package/dist/sync-engine/health.d.ts.map +1 -0
  337. package/dist/sync-engine/health.js +259 -0
  338. package/dist/sync-engine/health.js.map +1 -0
  339. package/dist/sync-engine/index.d.ts +34 -0
  340. package/dist/sync-engine/index.d.ts.map +1 -0
  341. package/dist/sync-engine/index.js +197 -0
  342. package/dist/sync-engine/index.js.map +1 -0
  343. package/dist/sync-engine/protocol.d.ts +153 -0
  344. package/dist/sync-engine/protocol.d.ts.map +1 -0
  345. package/dist/sync-engine/protocol.js +5 -0
  346. package/dist/sync-engine/protocol.js.map +1 -0
  347. package/dist/tasks/index.d.ts +14 -0
  348. package/dist/tasks/index.d.ts.map +1 -0
  349. package/dist/tasks/index.js +109 -0
  350. package/dist/tasks/index.js.map +1 -0
  351. package/dist/team/index.d.ts +12 -0
  352. package/dist/team/index.d.ts.map +1 -0
  353. package/dist/team/index.js +151 -0
  354. package/dist/team/index.js.map +1 -0
  355. package/dist/updater.d.ts +5 -5
  356. package/dist/updater.d.ts.map +1 -1
  357. package/dist/updater.js +24 -88
  358. package/dist/updater.js.map +1 -1
  359. package/dist/usage/index.d.ts +10 -0
  360. package/dist/usage/index.d.ts.map +1 -0
  361. package/dist/usage/index.js +104 -0
  362. package/dist/usage/index.js.map +1 -0
  363. package/dist/webhooks/index.d.ts +7 -0
  364. package/dist/webhooks/index.d.ts.map +1 -0
  365. package/dist/webhooks/index.js +81 -0
  366. package/dist/webhooks/index.js.map +1 -0
  367. package/package.json +26 -15
  368. package/scripts/postinstall.js +282 -0
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Git Utilities
3
+ * Detect git remote URL for cross-machine project merging
4
+ */
5
+ /**
6
+ * Check if a directory is a git repository
7
+ */
8
+ export declare function isGitRepository(path: string): boolean;
9
+ /**
10
+ * Get the origin remote URL for a git repository
11
+ * Returns null if not a git repo or no origin configured
12
+ */
13
+ export declare function getGitRemoteUrl(path: string): string | null;
14
+ /**
15
+ * Get the repository name from a git remote URL
16
+ * Handles HTTPS and SSH URLs
17
+ */
18
+ export declare function getRepoNameFromUrl(url: string): string | null;
19
+ /**
20
+ * Get the default branch for a git repository by inspecting origin/HEAD.
21
+ * Returns 'main' if the path is not provided or the branch cannot be determined.
22
+ */
23
+ export declare function getDefaultBranch(projectPath?: string): string;
24
+ /**
25
+ * Suggest a project name from path or git remote
26
+ */
27
+ export declare function suggestProjectName(path: string): string;
28
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/project/git.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB3D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAa7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBvD"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Git Utilities
3
+ * Detect git remote URL for cross-machine project merging
4
+ */
5
+ import { execSync, execFileSync } from 'node:child_process';
6
+ import { existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ /**
9
+ * Check if a directory is a git repository
10
+ */
11
+ export function isGitRepository(path) {
12
+ return existsSync(join(path, '.git'));
13
+ }
14
+ /**
15
+ * Get the origin remote URL for a git repository
16
+ * Returns null if not a git repo or no origin configured
17
+ */
18
+ export function getGitRemoteUrl(path) {
19
+ if (!isGitRepository(path)) {
20
+ return null;
21
+ }
22
+ try {
23
+ const result = execSync('git config --get remote.origin.url', {
24
+ cwd: path,
25
+ encoding: 'utf-8',
26
+ timeout: 5000,
27
+ stdio: ['pipe', 'pipe', 'pipe'],
28
+ });
29
+ return result.trim() || null;
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Get the repository name from a git remote URL
37
+ * Handles HTTPS and SSH URLs
38
+ */
39
+ export function getRepoNameFromUrl(url) {
40
+ // SSH format: git@github.com:owner/repo.git
41
+ const sshMatch = url.match(/git@[^:]+:([^/]+\/[^/]+?)(?:\.git)?$/);
42
+ if (sshMatch && sshMatch[1]) {
43
+ return sshMatch[1];
44
+ }
45
+ // HTTPS format: https://github.com/owner/repo.git
46
+ const httpsMatch = url.match(/https?:\/\/[^/]+\/([^/]+\/[^/]+?)(?:\.git)?$/);
47
+ if (httpsMatch && httpsMatch[1]) {
48
+ return httpsMatch[1];
49
+ }
50
+ return null;
51
+ }
52
+ /**
53
+ * Get the default branch for a git repository by inspecting origin/HEAD.
54
+ * Returns 'main' if the path is not provided or the branch cannot be determined.
55
+ */
56
+ export function getDefaultBranch(projectPath) {
57
+ if (!projectPath)
58
+ return 'main';
59
+ try {
60
+ const branchRef = execFileSync('git', ['symbolic-ref', 'refs/remotes/origin/HEAD'], {
61
+ cwd: projectPath,
62
+ encoding: 'utf-8',
63
+ timeout: 3000,
64
+ stdio: ['pipe', 'pipe', 'pipe'],
65
+ }).trim();
66
+ return branchRef.replace('refs/remotes/origin/', '');
67
+ }
68
+ catch {
69
+ return 'main';
70
+ }
71
+ }
72
+ /**
73
+ * Suggest a project name from path or git remote
74
+ */
75
+ export function suggestProjectName(path) {
76
+ // Try to get name from git remote
77
+ const remoteUrl = getGitRemoteUrl(path);
78
+ if (remoteUrl) {
79
+ const repoName = getRepoNameFromUrl(remoteUrl);
80
+ if (repoName) {
81
+ // Return just the repo part (not owner/repo)
82
+ const parts = repoName.split('/');
83
+ const lastPart = parts[parts.length - 1];
84
+ if (lastPart)
85
+ return lastPart;
86
+ }
87
+ }
88
+ // Fall back to directory name
89
+ const segments = path.split(/[/\\]/);
90
+ const lastSegment = segments[segments.length - 1];
91
+ return lastSegment ?? 'Unknown';
92
+ }
93
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/project/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Project Commands
3
+ * CLI commands for managing project registration
4
+ */
5
+ /**
6
+ * List all registered projects
7
+ */
8
+ export declare function runProjectList(options?: {
9
+ team?: string;
10
+ }): Promise<void>;
11
+ /**
12
+ * Show details for a specific project
13
+ */
14
+ export declare function runProjectShow(identifier: string): Promise<void>;
15
+ /**
16
+ * Register a new project
17
+ */
18
+ export declare function runProjectAdd(pathArg?: string, options?: {
19
+ name?: string;
20
+ description?: string;
21
+ team?: string;
22
+ }): Promise<void>;
23
+ /**
24
+ * Update a project's metadata
25
+ */
26
+ export declare function runProjectUpdate(identifier: string, options?: {
27
+ name?: string;
28
+ description?: string;
29
+ team?: string;
30
+ visibility?: 'personal' | 'team';
31
+ }): Promise<void>;
32
+ /**
33
+ * Unregister a project
34
+ */
35
+ export declare function runProjectRemove(identifier: string): Promise<void>;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+BH;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyF/E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDtE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,OAAO,CAAC,IAAI,CAAC,CAqDf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CAClC,GACA,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BxE"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Project Commands
3
+ * CLI commands for managing project registration
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { isLoggedIn, loadConfig } from '../auth/config.js';
8
+ import { createProject } from './types.js';
9
+ import { getActiveProjects, findProject, addProject, updateProject, removeProject, } from './storage.js';
10
+ import { getGitRemoteUrl, suggestProjectName } from './git.js';
11
+ import { formatRelativeTime, formatCost, formatTableCell } from './format.js';
12
+ import { PROJECT_QUOTA } from './constants.js';
13
+ import { pushProjectToEngine, deleteProjectFromEngine, pullProjectsFromEngine, mergeCloudProjects, isSyncAvailable, } from './sync-bridge.js';
14
+ /**
15
+ * Get project quota limit based on tier
16
+ */
17
+ function getQuotaLimit(tier) {
18
+ return PROJECT_QUOTA[tier] ?? PROJECT_QUOTA.free;
19
+ }
20
+ /**
21
+ * List all registered projects
22
+ */
23
+ export async function runProjectList(options) {
24
+ // Best-effort cloud sync before listing
25
+ try {
26
+ if (await isSyncAvailable()) {
27
+ const cloudProjects = await pullProjectsFromEngine();
28
+ await mergeCloudProjects(cloudProjects);
29
+ }
30
+ }
31
+ catch {
32
+ // Sync failure should not block local listing
33
+ }
34
+ const projects = getActiveProjects();
35
+ if (projects.length === 0) {
36
+ console.log();
37
+ console.log(' No projects registered.');
38
+ console.log(' Register one with: claudetools project add [path]');
39
+ console.log();
40
+ return;
41
+ }
42
+ // Filter by team if specified
43
+ let filtered = projects;
44
+ if (options?.team) {
45
+ filtered = projects.filter((p) => p.teamId === options.team);
46
+ if (filtered.length === 0) {
47
+ console.log();
48
+ console.log(` No projects found for team: ${options.team}`);
49
+ console.log();
50
+ return;
51
+ }
52
+ }
53
+ // Group by team
54
+ const personal = filtered.filter((p) => !p.teamId);
55
+ const byTeam = filtered.reduce((acc, p) => {
56
+ if (p.teamId) {
57
+ const teamProjects = acc[p.teamId] ?? [];
58
+ teamProjects.push(p);
59
+ acc[p.teamId] = teamProjects;
60
+ }
61
+ return acc;
62
+ }, {});
63
+ // Get quota info if logged in
64
+ const config = loadConfig();
65
+ const quotaInfo = (await isLoggedIn())
66
+ ? ` Quota: ${projects.length}/${getQuotaLimit(config.tier ?? 'free')}`
67
+ : '';
68
+ console.log();
69
+ console.log(` Projects (${projects.length})${quotaInfo.padStart(50)}`);
70
+ console.log();
71
+ // Table header
72
+ console.log(' NAME STACK REGISTERED LAST UPDATED');
73
+ console.log(' ' + '-'.repeat(72));
74
+ // Personal projects
75
+ if (personal.length > 0 && !options?.team) {
76
+ for (const p of personal) {
77
+ const stack = p.stackProfile?.primaryLanguage ?? 'Unknown';
78
+ const registered = formatRelativeTime(p.registeredAt);
79
+ const updated = formatRelativeTime(p.updatedAt);
80
+ console.log(` ${formatTableCell(p.name, 18)} ${formatTableCell(stack, 14)} ${formatTableCell(registered, 15)} ${updated}`);
81
+ }
82
+ }
83
+ // Team projects
84
+ for (const [teamId, teamProjects] of Object.entries(byTeam)) {
85
+ console.log();
86
+ console.log(` Team: ${teamId} (${teamProjects.length} projects)`);
87
+ console.log();
88
+ for (const p of teamProjects) {
89
+ const stack = p.stackProfile?.primaryLanguage ?? 'Unknown';
90
+ const registered = formatRelativeTime(p.registeredAt);
91
+ const updated = formatRelativeTime(p.updatedAt);
92
+ console.log(` ${formatTableCell(p.name, 18)} ${formatTableCell(stack, 14)} ${formatTableCell(registered, 15)} ${updated}`);
93
+ }
94
+ }
95
+ console.log();
96
+ }
97
+ /**
98
+ * Show details for a specific project
99
+ */
100
+ export async function runProjectShow(identifier) {
101
+ if (!identifier) {
102
+ console.error('Error: Missing project name or ID');
103
+ console.log('Usage: claudetools project show <name|id>');
104
+ process.exit(1);
105
+ }
106
+ const project = findProject(identifier);
107
+ if (!project) {
108
+ console.error(`Project not found: ${identifier}`);
109
+ process.exit(1);
110
+ }
111
+ console.log();
112
+ console.log(` ${project.name}`);
113
+ console.log(' ' + '═'.repeat(50));
114
+ console.log();
115
+ console.log(` Path: ${project.path}`);
116
+ if (project.description) {
117
+ console.log(` Description: ${project.description}`);
118
+ }
119
+ if (project.stackProfile) {
120
+ const frameworks = project.stackProfile.frameworks.join(', ') || 'None';
121
+ console.log(` Stack: ${project.stackProfile.primaryLanguage} • ${frameworks}`);
122
+ }
123
+ if (project.gitRemoteUrl) {
124
+ console.log(` Git Remote: ${project.gitRemoteUrl}`);
125
+ }
126
+ console.log(` Registered: ${formatRelativeTime(project.registeredAt)}`);
127
+ console.log(` Updated: ${formatRelativeTime(project.updatedAt)}`);
128
+ console.log();
129
+ console.log(' Settings');
130
+ console.log(' ' + '-'.repeat(50));
131
+ console.log(` Visibility: ${project.settings.visibility}`);
132
+ console.log(` Auto-sync: ${project.settings.autoSync ? 'Enabled' : 'Disabled'}`);
133
+ if (project.settings.budgetAlertUsd) {
134
+ console.log(` Budget: ${formatCost(project.settings.budgetAlertUsd)}/week`);
135
+ }
136
+ if (project.teamId) {
137
+ console.log(` Team: ${project.teamId}`);
138
+ }
139
+ console.log();
140
+ if (project.isSynced) {
141
+ console.log(` Sync Status: Synced (${formatRelativeTime(project.lastSyncedAt ?? project.updatedAt)})`);
142
+ }
143
+ else {
144
+ console.log(' Sync Status: Pending sync');
145
+ }
146
+ console.log();
147
+ }
148
+ /**
149
+ * Register a new project
150
+ */
151
+ export async function runProjectAdd(pathArg, options) {
152
+ // Use provided path or current directory
153
+ const projectPath = pathArg ? resolve(pathArg) : process.cwd();
154
+ // Verify path exists
155
+ if (!existsSync(projectPath)) {
156
+ console.error(`Error: Path does not exist: ${projectPath}`);
157
+ process.exit(1);
158
+ }
159
+ // Check if already registered
160
+ const existing = findProject(projectPath);
161
+ if (existing) {
162
+ console.error(`Error: Project already registered at this path as "${existing.name}"`);
163
+ process.exit(1);
164
+ }
165
+ // Get git remote if available
166
+ const gitRemoteUrl = getGitRemoteUrl(projectPath) ?? undefined;
167
+ // Suggest name from path or git
168
+ const suggestedName = suggestProjectName(projectPath);
169
+ const projectName = options?.name ?? suggestedName;
170
+ // Create project
171
+ const project = createProject(projectPath, projectName, {
172
+ description: options?.description,
173
+ teamId: options?.team,
174
+ gitRemoteUrl,
175
+ });
176
+ try {
177
+ await addProject(project);
178
+ }
179
+ catch (error) {
180
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
181
+ process.exit(1);
182
+ }
183
+ // Fire-and-forget sync to cloud
184
+ pushProjectToEngine(project, 'insert').catch(() => { });
185
+ console.log();
186
+ console.log(` ✓ Project registered: ${project.name}`);
187
+ if (gitRemoteUrl) {
188
+ console.log(` Git remote: ${gitRemoteUrl}`);
189
+ }
190
+ console.log();
191
+ console.log(' Next steps:');
192
+ console.log(' • View project: claudetools project show "' + project.name + '"');
193
+ if (await isLoggedIn()) {
194
+ console.log(' • Sync to cloud: claudetools project sync');
195
+ }
196
+ console.log();
197
+ }
198
+ /**
199
+ * Update a project's metadata
200
+ */
201
+ export async function runProjectUpdate(identifier, options) {
202
+ if (!identifier) {
203
+ console.error('Error: Missing project name or ID');
204
+ console.log('Usage: claudetools project update <name|id> [options]');
205
+ process.exit(1);
206
+ }
207
+ const project = findProject(identifier);
208
+ if (!project) {
209
+ console.error(`Project not found: ${identifier}`);
210
+ process.exit(1);
211
+ }
212
+ // Build updates
213
+ const updates = {};
214
+ if (options?.name)
215
+ updates.name = options.name;
216
+ if (options?.description)
217
+ updates.description = options.description;
218
+ if (options?.team)
219
+ updates.teamId = options.team;
220
+ if (options?.visibility) {
221
+ updates.settings = {
222
+ ...project.settings,
223
+ visibility: options.visibility,
224
+ };
225
+ }
226
+ if (Object.keys(updates).length === 0) {
227
+ console.error('Error: No updates provided');
228
+ console.log('Usage: claudetools project update <name|id> --name "New Name" --description "..."');
229
+ process.exit(1);
230
+ }
231
+ try {
232
+ const updated = await updateProject(project.id, updates);
233
+ // Fire-and-forget sync to cloud
234
+ pushProjectToEngine(updated, 'update').catch(() => { });
235
+ console.log();
236
+ console.log(` ✓ Project updated: ${updated.name}`);
237
+ console.log();
238
+ }
239
+ catch (error) {
240
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
241
+ process.exit(1);
242
+ }
243
+ }
244
+ /**
245
+ * Unregister a project
246
+ */
247
+ export async function runProjectRemove(identifier) {
248
+ if (!identifier) {
249
+ console.error('Error: Missing project name or ID');
250
+ console.log('Usage: claudetools project remove <name|id>');
251
+ process.exit(1);
252
+ }
253
+ const project = findProject(identifier);
254
+ if (!project) {
255
+ console.error(`Project not found: ${identifier}`);
256
+ process.exit(1);
257
+ }
258
+ try {
259
+ await removeProject(project.id);
260
+ // Fire-and-forget sync deletion to cloud
261
+ deleteProjectFromEngine(project.id).catch(() => { });
262
+ console.log();
263
+ console.log(` ✓ Project unregistered: ${project.name}`);
264
+ console.log(' (Files were not deleted)');
265
+ console.log();
266
+ }
267
+ catch (error) {
268
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
269
+ process.exit(1);
270
+ }
271
+ }
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Project Mapper
3
+ * Converts between CLI Project type and sync engine SyncProject wire format
4
+ */
5
+ import type { Project } from './types.js';
6
+ import type { SyncProject } from '../sync-engine/protocol.js';
7
+ /**
8
+ * Generate a URL-safe slug from a project name.
9
+ * Matches the web slugify algorithm exactly (apps/web/src/lib/utils/slugify.ts).
10
+ * Lowercases, trims whitespace, strips non-word/non-space/non-hyphen chars,
11
+ * collapses whitespace/underscores/hyphens into single hyphens, and trims
12
+ * leading/trailing hyphens.
13
+ */
14
+ export declare function generateSlug(name: string): string;
15
+ /**
16
+ * Convert a CLI Project to a SyncProject for the sync engine wire format.
17
+ * Local-only fields (pathHash, isSynced, settings, stackProfile, lastSyncedAt)
18
+ * are dropped since they are not part of the sync protocol.
19
+ */
20
+ export declare function projectToSyncProject(project: Project, userId: string): SyncProject;
21
+ /**
22
+ * Convert a SyncProject from the sync engine into a partial CLI Project.
23
+ * Returns Partial<Project> because local-only fields (pathHash, isSynced,
24
+ * settings, stackProfile, lastSyncedAt) must be supplied by the caller.
25
+ */
26
+ export declare function syncProjectToProject(syncProject: SyncProject): Partial<Project>;
27
+ //# sourceMappingURL=mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../src/project/mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAkBlF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAa/E"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Project Mapper
3
+ * Converts between CLI Project type and sync engine SyncProject wire format
4
+ */
5
+ import { getDefaultBranch } from './git.js';
6
+ /**
7
+ * Generate a URL-safe slug from a project name.
8
+ * Matches the web slugify algorithm exactly (apps/web/src/lib/utils/slugify.ts).
9
+ * Lowercases, trims whitespace, strips non-word/non-space/non-hyphen chars,
10
+ * collapses whitespace/underscores/hyphens into single hyphens, and trims
11
+ * leading/trailing hyphens.
12
+ */
13
+ export function generateSlug(name) {
14
+ return name
15
+ .toLowerCase()
16
+ .trim()
17
+ .replace(/[^\w\s-]/g, '')
18
+ .replace(/[\s_-]+/g, '-')
19
+ .replace(/^-+|-+$/g, '');
20
+ }
21
+ /**
22
+ * Convert a CLI Project to a SyncProject for the sync engine wire format.
23
+ * Local-only fields (pathHash, isSynced, settings, stackProfile, lastSyncedAt)
24
+ * are dropped since they are not part of the sync protocol.
25
+ */
26
+ export function projectToSyncProject(project, userId) {
27
+ return {
28
+ id: project.id,
29
+ user_id: userId,
30
+ team_id: project.teamId ?? null,
31
+ name: project.name,
32
+ slug: generateSlug(project.name),
33
+ description: project.description ?? null,
34
+ path: project.path,
35
+ repository_url: project.gitRemoteUrl ?? null,
36
+ default_branch: getDefaultBranch(project.path),
37
+ icon: null,
38
+ color: null,
39
+ archived_at: project.isDeleted ? (project.deletedAt ?? null) : null,
40
+ version: 0,
41
+ created_at: project.registeredAt,
42
+ updated_at: project.updatedAt,
43
+ };
44
+ }
45
+ /**
46
+ * Convert a SyncProject from the sync engine into a partial CLI Project.
47
+ * Returns Partial<Project> because local-only fields (pathHash, isSynced,
48
+ * settings, stackProfile, lastSyncedAt) must be supplied by the caller.
49
+ */
50
+ export function syncProjectToProject(syncProject) {
51
+ return {
52
+ id: syncProject.id,
53
+ name: syncProject.name,
54
+ description: syncProject.description ?? undefined,
55
+ path: syncProject.path ?? undefined,
56
+ teamId: syncProject.team_id ?? undefined,
57
+ gitRemoteUrl: syncProject.repository_url ?? undefined,
58
+ registeredAt: syncProject.created_at,
59
+ updatedAt: syncProject.updated_at,
60
+ isDeleted: Boolean(syncProject.archived_at),
61
+ deletedAt: syncProject.archived_at ?? undefined,
62
+ };
63
+ }
64
+ //# sourceMappingURL=mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../src/project/mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,IAAI,EAAE;SACN,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB,EAAE,MAAc;IACnE,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,cAAc,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;QAC5C,cAAc,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9C,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACnE,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,OAAO,CAAC,YAAY;QAChC,UAAU,EAAE,OAAO,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAwB;IAC3D,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,EAAE;QAClB,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,WAAW,EAAE,WAAW,CAAC,WAAW,IAAI,SAAS;QACjD,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,SAAS;QACnC,MAAM,EAAE,WAAW,CAAC,OAAO,IAAI,SAAS;QACxC,YAAY,EAAE,WAAW,CAAC,cAAc,IAAI,SAAS;QACrD,YAAY,EAAE,WAAW,CAAC,UAAU;QACpC,SAAS,EAAE,WAAW,CAAC,UAAU;QACjC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC;QAC3C,SAAS,EAAE,WAAW,CAAC,WAAW,IAAI,SAAS;KAChD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Project Storage
3
+ * Local file operations for ~/.claudetools/projects.json
4
+ */
5
+ import { Project, ProjectsFile } from './types.js';
6
+ /**
7
+ * Get the path to the projects file
8
+ */
9
+ export declare function getProjectsPath(): string;
10
+ /**
11
+ * Load projects from disk
12
+ * Returns default file if not exists or parse fails
13
+ */
14
+ export declare function loadProjects(): ProjectsFile;
15
+ /**
16
+ * Save projects to disk atomically
17
+ */
18
+ export declare function saveProjects(file: ProjectsFile): void;
19
+ /**
20
+ * Execute a function with file lock to prevent race conditions
21
+ * between CLI and desktop app
22
+ */
23
+ export declare function withProjectsLock<T>(fn: () => Promise<T>): Promise<T>;
24
+ /**
25
+ * Get all active (non-deleted) projects
26
+ */
27
+ export declare function getActiveProjects(): Project[];
28
+ /**
29
+ * Find a project by ID
30
+ */
31
+ export declare function findProjectById(id: string): Project | null;
32
+ /**
33
+ * Find a project by name (case-insensitive)
34
+ */
35
+ export declare function findProjectByName(name: string): Project | null;
36
+ /**
37
+ * Find a project by path
38
+ */
39
+ export declare function findProjectByPath(path: string): Project | null;
40
+ /**
41
+ * Find a project by name, ID, or path
42
+ */
43
+ export declare function findProject(identifier: string): Project | null;
44
+ /**
45
+ * Add a new project
46
+ */
47
+ export declare function addProject(project: Project): Promise<void>;
48
+ /**
49
+ * Allowed fields for project updates
50
+ */
51
+ export interface ProjectUpdateData {
52
+ name?: string;
53
+ description?: string;
54
+ teamId?: string;
55
+ gitRemoteUrl?: string;
56
+ settings?: Project['settings'];
57
+ stackProfile?: Project['stackProfile'];
58
+ }
59
+ /**
60
+ * Update an existing project
61
+ */
62
+ export declare function updateProject(id: string, updates: ProjectUpdateData): Promise<Project>;
63
+ /**
64
+ * Soft delete a project (marks as deleted)
65
+ */
66
+ export declare function removeProject(id: string): Promise<void>;
67
+ /**
68
+ * Permanently delete projects marked as deleted for over 30 days
69
+ */
70
+ export declare function cleanupDeletedProjects(): Promise<number>;
71
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/project/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EACL,OAAO,EACP,YAAY,EAGb,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAyBD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAuB3C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAWrD;AAmDD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAuB1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,EAAE,CAG7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAG1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAO9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAM9D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAY9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAkB9D"}