@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,137 @@
1
+ import chalk from 'chalk';
2
+ // =============================================================================
3
+ // Color Theme System
4
+ // =============================================================================
5
+ // Semantic color system with NO_COLOR / FORCE_COLOR support
6
+ // Respects environment variables per ECMA-48 spec
7
+ // Detect color support from environment
8
+ const noColor = process.env.NO_COLOR !== undefined ||
9
+ process.env.CLICOLOR === '0';
10
+ const forceColor = process.env.FORCE_COLOR;
11
+ // If NO_COLOR is set, override chalk's detection
12
+ if (noColor) {
13
+ chalk.level = 0;
14
+ }
15
+ else if (forceColor) {
16
+ // FORCE_COLOR: 0=none, 1=basic, 2=256, 3=truecolor
17
+ const level = parseInt(forceColor, 10);
18
+ if (level >= 0 && level <= 3) {
19
+ chalk.level = level;
20
+ }
21
+ }
22
+ // =============================================================================
23
+ // Semantic Colors
24
+ // =============================================================================
25
+ export const theme = {
26
+ // Status colors
27
+ success: chalk.green,
28
+ error: chalk.red,
29
+ warning: chalk.yellow,
30
+ info: chalk.blue,
31
+ muted: chalk.dim,
32
+ highlight: chalk.cyan,
33
+ brand: chalk.magenta,
34
+ // Text formatting
35
+ bold: chalk.bold,
36
+ dim: chalk.dim,
37
+ // Structural colors
38
+ header: chalk.bold,
39
+ subheader: chalk.dim,
40
+ command: chalk.cyan,
41
+ placeholder: chalk.yellow,
42
+ code: chalk.cyan,
43
+ // Status symbols (always shown, even without color)
44
+ symbols: {
45
+ success: '✓',
46
+ error: '✗',
47
+ warning: '⚠',
48
+ info: 'ℹ',
49
+ pending: '●',
50
+ arrow: '▸',
51
+ dot: '·',
52
+ bullet: '•',
53
+ },
54
+ // Formatted status messages
55
+ ok: (msg) => `${chalk.green('✓')} ${msg}`,
56
+ fail: (msg) => `${chalk.red('✗')} ${msg}`,
57
+ warn: (msg) => `${chalk.yellow('⚠')} ${msg}`,
58
+ step: (msg) => `${chalk.blue('▸')} ${msg}`,
59
+ // Utility functions
60
+ colorSupport: chalk.level > 0,
61
+ termWidth: process.stdout.columns || 80,
62
+ };
63
+ // =============================================================================
64
+ // Helper Functions
65
+ // =============================================================================
66
+ /**
67
+ * Format a header with consistent styling
68
+ */
69
+ export function formatHeader(text) {
70
+ return chalk.bold(text);
71
+ }
72
+ /**
73
+ * Format a subheader with consistent styling
74
+ */
75
+ export function formatSubheader(text) {
76
+ return chalk.dim(text);
77
+ }
78
+ /**
79
+ * Format a command example
80
+ */
81
+ export function formatCommand(cmd) {
82
+ return chalk.cyan(cmd);
83
+ }
84
+ /**
85
+ * Format a placeholder (e.g., <name>, [options])
86
+ */
87
+ export function formatPlaceholder(text) {
88
+ return chalk.yellow(text);
89
+ }
90
+ /**
91
+ * Format an error message with symbol
92
+ */
93
+ export function formatError(msg, code) {
94
+ const prefix = chalk.red('✗');
95
+ const codeStr = code ? chalk.dim(`[${code}]`) : '';
96
+ return `${prefix} ${codeStr}${codeStr ? ' ' : ''}${msg}`;
97
+ }
98
+ /**
99
+ * Format a success message with symbol
100
+ */
101
+ export function formatSuccess(msg) {
102
+ return `${chalk.green('✓')} ${msg}`;
103
+ }
104
+ /**
105
+ * Format a warning message with symbol
106
+ */
107
+ export function formatWarning(msg) {
108
+ return `${chalk.yellow('⚠')} ${msg}`;
109
+ }
110
+ /**
111
+ * Format an info message with symbol
112
+ */
113
+ export function formatInfo(msg) {
114
+ return `${chalk.blue('ℹ')} ${msg}`;
115
+ }
116
+ /**
117
+ * Format a step/progress message with arrow
118
+ */
119
+ export function formatStep(msg) {
120
+ return `${chalk.blue('▸')} ${msg}`;
121
+ }
122
+ /**
123
+ * Get terminal width for responsive output
124
+ */
125
+ export function getTermWidth() {
126
+ return process.stdout.columns || 80;
127
+ }
128
+ /**
129
+ * Truncate text to fit terminal width
130
+ */
131
+ export function truncate(text, maxWidth) {
132
+ const width = maxWidth || getTermWidth();
133
+ if (text.length <= width)
134
+ return text;
135
+ return text.slice(0, width - 3) + '...';
136
+ }
137
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/lib/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Check if Claude CLI is available (memoized)
3
+ */
4
+ export declare function isClaudeCliAvailable(): boolean;
5
+ /**
6
+ * Check if mcp-cli is available (memoized)
7
+ */
8
+ export declare function isMcpCliAvailable(): boolean;
9
+ /**
10
+ * Reset cached availability (for testing)
11
+ */
12
+ export declare function resetAvailabilityCache(): void;
13
+ //# sourceMappingURL=tool-availability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-availability.d.ts","sourceRoot":"","sources":["../../src/lib/tool-availability.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAW9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAW3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C"}
@@ -0,0 +1,48 @@
1
+ // =============================================================================
2
+ // Tool Availability Checks
3
+ // =============================================================================
4
+ // Shared utilities for checking CLI tool availability
5
+ import { execSync } from 'child_process';
6
+ // Cached availability results
7
+ let cachedClaudeCliAvailable = undefined;
8
+ let cachedMcpCliAvailable = undefined;
9
+ /**
10
+ * Check if Claude CLI is available (memoized)
11
+ */
12
+ export function isClaudeCliAvailable() {
13
+ if (cachedClaudeCliAvailable !== undefined) {
14
+ return cachedClaudeCliAvailable;
15
+ }
16
+ try {
17
+ execSync('claude --version', { encoding: 'utf-8', stdio: 'pipe', timeout: 5000 });
18
+ cachedClaudeCliAvailable = true;
19
+ }
20
+ catch {
21
+ cachedClaudeCliAvailable = false;
22
+ }
23
+ return cachedClaudeCliAvailable;
24
+ }
25
+ /**
26
+ * Check if mcp-cli is available (memoized)
27
+ */
28
+ export function isMcpCliAvailable() {
29
+ if (cachedMcpCliAvailable !== undefined) {
30
+ return cachedMcpCliAvailable;
31
+ }
32
+ try {
33
+ execSync('mcp-cli --help', { encoding: 'utf-8', stdio: 'pipe', timeout: 5000 });
34
+ cachedMcpCliAvailable = true;
35
+ }
36
+ catch {
37
+ cachedMcpCliAvailable = false;
38
+ }
39
+ return cachedMcpCliAvailable;
40
+ }
41
+ /**
42
+ * Reset cached availability (for testing)
43
+ */
44
+ export function resetAvailabilityCache() {
45
+ cachedClaudeCliAvailable = undefined;
46
+ cachedMcpCliAvailable = undefined;
47
+ }
48
+ //# sourceMappingURL=tool-availability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-availability.js","sourceRoot":"","sources":["../../src/lib/tool-availability.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAChF,sDAAsD;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,8BAA8B;AAC9B,IAAI,wBAAwB,GAAwB,SAAS,CAAC;AAC9D,IAAI,qBAAqB,GAAwB,SAAS,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,wBAAwB,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,wBAAwB,GAAG,IAAI,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB,GAAG,KAAK,CAAC;IACnC,CAAC;IACD,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC;QACH,QAAQ,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,qBAAqB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB,GAAG,KAAK,CAAC;IAChC,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,wBAAwB,GAAG,SAAS,CAAC;IACrC,qBAAqB,GAAG,SAAS,CAAC;AACpC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type ReleaseChannel } from './channel-config.js';
2
+ export interface UpdateCheckResult {
3
+ currentVersion: string;
4
+ latestVersion: string;
5
+ channel: ReleaseChannel;
6
+ updateAvailable: boolean;
7
+ }
8
+ /** Compare two semver strings. Returns true if `latest` is newer than `current`. */
9
+ export declare function isNewerVersion(current: string, latest: string): boolean;
10
+ /**
11
+ * Check the npm registry for available updates.
12
+ * Uses a 24h file cache to avoid hitting the registry on every CLI invocation.
13
+ * Returns null if the check fails (offline, timeout, etc.).
14
+ */
15
+ export declare function checkForUpdate(currentVersion: string): Promise<UpdateCheckResult | null>;
16
+ /**
17
+ * Get the version for a specific dist-tag from cached or fresh registry data.
18
+ * Used by the update command to resolve a target version.
19
+ */
20
+ export declare function getVersionForTag(distTag: string): Promise<string | null>;
21
+ //# sourceMappingURL=update-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"AASA,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAQjF,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,cAAc,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;CACzB;AAOD,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAWvE;AA8CD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAsBnC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB"}
@@ -0,0 +1,110 @@
1
+ // =============================================================================
2
+ // Update Checker
3
+ // =============================================================================
4
+ // Non-blocking npm registry check with 24-hour file cache.
5
+ // Fetches dist-tags from the npm registry and caches the result to disk.
6
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { homedir } from 'node:os';
9
+ import { getChannel, getDistTag } from './channel-config.js';
10
+ const PACKAGE_NAME = '@claudetools/cli';
11
+ const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}`;
12
+ const CACHE_DIR = join(homedir(), '.config', 'claudetools');
13
+ const CACHE_FILE = join(CACHE_DIR, 'update-check.json');
14
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
15
+ /** Compare two semver strings. Returns true if `latest` is newer than `current`. */
16
+ export function isNewerVersion(current, latest) {
17
+ const currentParts = current.replace(/^v/, '').split('.').map(Number);
18
+ const latestParts = latest.replace(/^v/, '').split('.').map(Number);
19
+ for (let i = 0; i < 3; i++) {
20
+ const curr = currentParts[i] || 0;
21
+ const lat = latestParts[i] || 0;
22
+ if (lat > curr)
23
+ return true;
24
+ if (lat < curr)
25
+ return false;
26
+ }
27
+ return false;
28
+ }
29
+ function readCache() {
30
+ try {
31
+ const raw = readFileSync(CACHE_FILE, 'utf-8');
32
+ const cached = JSON.parse(raw);
33
+ if (Date.now() - cached.timestamp < CACHE_TTL_MS && cached.distTags) {
34
+ return cached;
35
+ }
36
+ }
37
+ catch {
38
+ // Cache miss or corrupt — will re-fetch
39
+ }
40
+ return null;
41
+ }
42
+ function writeCache(distTags) {
43
+ try {
44
+ mkdirSync(CACHE_DIR, { recursive: true });
45
+ const cached = { timestamp: Date.now(), distTags };
46
+ writeFileSync(CACHE_FILE, JSON.stringify(cached, null, 2) + '\n', 'utf-8');
47
+ }
48
+ catch {
49
+ // Non-critical — cache write failure is fine
50
+ }
51
+ }
52
+ /** Fetch dist-tags from npm registry (with 5s timeout). */
53
+ async function fetchDistTags() {
54
+ try {
55
+ const controller = new AbortController();
56
+ const timeout = setTimeout(() => controller.abort(), 5000);
57
+ const response = await fetch(REGISTRY_URL, {
58
+ headers: { Accept: 'application/vnd.npm.install-v1+json' },
59
+ signal: controller.signal,
60
+ });
61
+ clearTimeout(timeout);
62
+ if (!response.ok)
63
+ return null;
64
+ const body = (await response.json());
65
+ return body['dist-tags'] ?? null;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Check the npm registry for available updates.
73
+ * Uses a 24h file cache to avoid hitting the registry on every CLI invocation.
74
+ * Returns null if the check fails (offline, timeout, etc.).
75
+ */
76
+ export async function checkForUpdate(currentVersion) {
77
+ // Try cache first
78
+ const cached = readCache();
79
+ const distTags = cached?.distTags ?? (await fetchDistTags());
80
+ if (!distTags)
81
+ return null;
82
+ // Write to cache if we fetched fresh
83
+ if (!cached)
84
+ writeCache(distTags);
85
+ const channel = getChannel();
86
+ const distTag = getDistTag();
87
+ const latestVersion = distTags[distTag];
88
+ if (!latestVersion)
89
+ return null;
90
+ return {
91
+ currentVersion,
92
+ latestVersion,
93
+ channel,
94
+ updateAvailable: isNewerVersion(currentVersion, latestVersion),
95
+ };
96
+ }
97
+ /**
98
+ * Get the version for a specific dist-tag from cached or fresh registry data.
99
+ * Used by the update command to resolve a target version.
100
+ */
101
+ export async function getVersionForTag(distTag) {
102
+ const cached = readCache();
103
+ const distTags = cached?.distTags ?? (await fetchDistTags());
104
+ if (!distTags)
105
+ return null;
106
+ if (!cached)
107
+ writeCache(distTags);
108
+ return distTags[distTag] ?? null;
109
+ }
110
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/lib/update-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Validate stack name format
3
+ * Stack names must be lowercase alphanumeric with hyphens, 1-50 characters
4
+ */
5
+ export declare function validateStackName(name: string): {
6
+ valid: boolean;
7
+ error?: string;
8
+ };
9
+ /**
10
+ * Validate and normalize a project path
11
+ * Prevents path traversal attacks and ensures path is within expected boundaries
12
+ */
13
+ export declare function validateProjectPath(inputPath: string, basePath?: string): {
14
+ valid: boolean;
15
+ normalizedPath: string;
16
+ error?: string;
17
+ };
18
+ /**
19
+ * Basic runtime type check for API response structure
20
+ */
21
+ export declare function isValidApiResponse<T>(response: unknown, requiredFields: string[]): response is T;
22
+ /**
23
+ * Validate API response has expected structure
24
+ */
25
+ export declare function validateApiResponse<T>(response: unknown, requiredFields: string[]): {
26
+ valid: boolean;
27
+ data?: T;
28
+ error?: string;
29
+ };
30
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBlF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA6B5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,EAAE,GACvB,QAAQ,IAAI,CAAC,CAYf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,EAAE,GACvB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAY9C"}
@@ -0,0 +1,82 @@
1
+ // =============================================================================
2
+ // Input Validation Utilities
3
+ // =============================================================================
4
+ // Runtime validation for user inputs and API responses
5
+ import { resolve, relative } from 'path';
6
+ /**
7
+ * Validate stack name format
8
+ * Stack names must be lowercase alphanumeric with hyphens, 1-50 characters
9
+ */
10
+ export function validateStackName(name) {
11
+ if (!name || typeof name !== 'string') {
12
+ return { valid: false, error: 'Stack name is required' };
13
+ }
14
+ if (name.length > 50) {
15
+ return { valid: false, error: 'Stack name must be 50 characters or less' };
16
+ }
17
+ if (!/^[a-z0-9-]{1,50}$/.test(name)) {
18
+ return {
19
+ valid: false,
20
+ error: 'Stack name must be lowercase alphanumeric with hyphens only (e.g., my-stack-1)',
21
+ };
22
+ }
23
+ return { valid: true };
24
+ }
25
+ /**
26
+ * Validate and normalize a project path
27
+ * Prevents path traversal attacks and ensures path is within expected boundaries
28
+ */
29
+ export function validateProjectPath(inputPath, basePath) {
30
+ if (!inputPath || typeof inputPath !== 'string') {
31
+ return { valid: false, normalizedPath: '', error: 'Path is required' };
32
+ }
33
+ // Resolve to absolute path
34
+ const normalizedPath = resolve(inputPath);
35
+ // If basePath provided, ensure the path doesn't escape it
36
+ if (basePath) {
37
+ const resolvedBase = resolve(basePath);
38
+ const relativePath = relative(resolvedBase, normalizedPath);
39
+ // Check if path tries to escape base directory
40
+ if (relativePath.startsWith('..') || resolve(resolvedBase, relativePath) !== normalizedPath) {
41
+ return {
42
+ valid: false,
43
+ normalizedPath: '',
44
+ error: 'Path traversal not allowed',
45
+ };
46
+ }
47
+ }
48
+ // Check for suspicious patterns even without basePath
49
+ if (inputPath.includes('\0')) {
50
+ return { valid: false, normalizedPath: '', error: 'Invalid path characters' };
51
+ }
52
+ return { valid: true, normalizedPath };
53
+ }
54
+ /**
55
+ * Basic runtime type check for API response structure
56
+ */
57
+ export function isValidApiResponse(response, requiredFields) {
58
+ if (typeof response !== 'object' || response === null) {
59
+ return false;
60
+ }
61
+ for (const field of requiredFields) {
62
+ if (!(field in response)) {
63
+ return false;
64
+ }
65
+ }
66
+ return true;
67
+ }
68
+ /**
69
+ * Validate API response has expected structure
70
+ */
71
+ export function validateApiResponse(response, requiredFields) {
72
+ if (typeof response !== 'object' || response === null) {
73
+ return { valid: false, error: 'Invalid response: expected object' };
74
+ }
75
+ for (const field of requiredFields) {
76
+ if (!(field in response)) {
77
+ return { valid: false, error: `Invalid response: missing field '${field}'` };
78
+ }
79
+ }
80
+ return { valid: true, data: response };
81
+ }
82
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { UserConfig } from '../auth/config.js';
2
+ export declare class ValidationError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /**
6
+ * Validates that a value is not falsy, throws ValidationError if it is
7
+ * @param value Value to check
8
+ * @param name Name of the value for error messages
9
+ * @returns The validated value
10
+ */
11
+ export declare function required<T>(value: T | undefined | null, name: string): T;
12
+ /**
13
+ * Validates that config has an active team, throws ValidationError if not
14
+ * @param config User configuration
15
+ * @returns The active team slug
16
+ */
17
+ export declare function requireActiveTeam(config: UserConfig): string;
18
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAKxE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAK5D"}
@@ -0,0 +1,30 @@
1
+ export class ValidationError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'ValidationError';
5
+ }
6
+ }
7
+ /**
8
+ * Validates that a value is not falsy, throws ValidationError if it is
9
+ * @param value Value to check
10
+ * @param name Name of the value for error messages
11
+ * @returns The validated value
12
+ */
13
+ export function required(value, name) {
14
+ if (!value) {
15
+ throw new ValidationError(`${name} is required`);
16
+ }
17
+ return value;
18
+ }
19
+ /**
20
+ * Validates that config has an active team, throws ValidationError if not
21
+ * @param config User configuration
22
+ * @returns The active team slug
23
+ */
24
+ export function requireActiveTeam(config) {
25
+ if (!config.activeTeam) {
26
+ throw new ValidationError('No active team selected');
27
+ }
28
+ return config.activeTeam;
29
+ }
30
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAI,KAA2B,EAAE,IAAY;IACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CAAC,yBAAyB,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface Extension {
2
+ id: string;
3
+ slug: string;
4
+ name: string;
5
+ type: 'skill' | 'agent' | 'hook' | 'mcp-server';
6
+ description: string;
7
+ author: {
8
+ id: string;
9
+ name: string;
10
+ };
11
+ downloads: number;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ content?: string;
15
+ config?: Record<string, unknown>;
16
+ }
17
+ export interface SearchResult {
18
+ extensions: Extension[];
19
+ total: number;
20
+ }
21
+ export declare function searchExtensions(query?: string, type?: string, limit?: number): Promise<SearchResult>;
22
+ export declare function getExtension(typeOrSlug: string, slug?: string): Promise<Extension>;
23
+ export declare function trackDownload(slug: string): Promise<void>;
24
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/marketplace/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AA6CD,wBAAsB,gBAAgB,CACpC,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,SAAK,GACT,OAAO,CAAC,YAAY,CAAC,CAevB;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAsCxF;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D"}