@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 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,EAAE,EACV,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAC3B,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAaN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,IAAI,CAuEN;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAO/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAC,EAClF,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAYN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAU5E;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,IAAI,CAaN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC,GAChG,IAAI,CAcN"}
@@ -0,0 +1,180 @@
1
+ import Table from 'cli-table3';
2
+ import boxen from 'boxen';
3
+ import { theme, formatHeader, getTermWidth } from './theme.js';
4
+ /**
5
+ * Prints a formatted list of items
6
+ * @param title List title
7
+ * @param items Array of items to render
8
+ * @param renderFn Function to render each item
9
+ * @param emptyMessage Message to show when list is empty
10
+ * @param emptyHint Optional hint to show when list is empty
11
+ */
12
+ export function formatList(title, items, renderFn, emptyMessage, emptyHint) {
13
+ if (items.length === 0) {
14
+ emptyState(emptyMessage, emptyHint);
15
+ return;
16
+ }
17
+ console.log();
18
+ console.log(` ${formatHeader(title)}`);
19
+ console.log();
20
+ for (const item of items) {
21
+ renderFn(item);
22
+ }
23
+ }
24
+ /**
25
+ * Prints a professional table with borders and colors
26
+ * @param headers Column headers
27
+ * @param rows Array of row data (each row is an array of cell values)
28
+ * @param options Optional table configuration
29
+ */
30
+ export function formatTable(headers, rows, options) {
31
+ if (rows.length === 0) {
32
+ return;
33
+ }
34
+ const style = options?.style || 'default';
35
+ const useColors = options?.colors !== false && theme.colorSupport;
36
+ const table = new Table({
37
+ head: headers.map((h) => (useColors ? theme.info(h) : h)),
38
+ style: {
39
+ head: [],
40
+ border: useColors ? [theme.muted.name] : [],
41
+ 'padding-left': 1,
42
+ 'padding-right': 1,
43
+ compact: style === 'compact',
44
+ },
45
+ chars: style === 'markdown'
46
+ ? {
47
+ top: '',
48
+ 'top-mid': '',
49
+ 'top-left': '',
50
+ 'top-right': '',
51
+ bottom: '',
52
+ 'bottom-mid': '',
53
+ 'bottom-left': '',
54
+ 'bottom-right': '',
55
+ left: '|',
56
+ 'left-mid': '',
57
+ mid: '',
58
+ 'mid-mid': '',
59
+ right: '|',
60
+ 'right-mid': '',
61
+ middle: '|',
62
+ }
63
+ : style === 'compact'
64
+ ? {
65
+ top: '',
66
+ 'top-mid': '',
67
+ 'top-left': '',
68
+ 'top-right': '',
69
+ bottom: '',
70
+ 'bottom-mid': '',
71
+ 'bottom-left': '',
72
+ 'bottom-right': '',
73
+ left: '',
74
+ 'left-mid': '',
75
+ mid: '',
76
+ 'mid-mid': '',
77
+ right: '',
78
+ 'right-mid': '',
79
+ middle: ' ',
80
+ }
81
+ : undefined,
82
+ });
83
+ // Add rows
84
+ for (const row of rows) {
85
+ table.push(row);
86
+ }
87
+ console.log();
88
+ console.log(table
89
+ .toString()
90
+ .split('\n')
91
+ .map((line) => ` ${line}`)
92
+ .join('\n'));
93
+ console.log();
94
+ }
95
+ /**
96
+ * Prints an empty state message with optional hint
97
+ * @param message Main message
98
+ * @param hint Optional hint or suggestion
99
+ */
100
+ export function emptyState(message, hint) {
101
+ console.log();
102
+ console.log(` ${theme.muted(message)}`);
103
+ if (hint) {
104
+ console.log(` ${theme.muted(hint)}`);
105
+ }
106
+ console.log();
107
+ }
108
+ /**
109
+ * Prints a bar chart for percentages
110
+ * @param items Array of {label, percentage, color} objects
111
+ * @param width Maximum bar width in characters (adapts to terminal width)
112
+ */
113
+ export function formatBarChart(items, width) {
114
+ const termWidth = getTermWidth();
115
+ const maxBarWidth = width || Math.min(40, Math.floor((termWidth - 30) * 0.6));
116
+ const maxPercentage = Math.max(...items.map((item) => item.percentage));
117
+ for (const item of items) {
118
+ const filled = Math.round((item.percentage / maxPercentage) * maxBarWidth);
119
+ const colorFn = item.color || theme.highlight;
120
+ const bar = colorFn('█'.repeat(filled)) + ' '.repeat(maxBarWidth - filled);
121
+ const pct = item.percentage.toFixed(1).padStart(5) + '%';
122
+ console.log(` ${item.label.padEnd(12)} ${bar} ${theme.muted(pct)}`);
123
+ }
124
+ }
125
+ /**
126
+ * Prints a quota display (used/limit)
127
+ * @param title Quota title
128
+ * @param used Used count
129
+ * @param limit Limit count
130
+ */
131
+ export function formatQuota(title, used, limit) {
132
+ const percentage = (used / limit) * 100;
133
+ const colorFn = percentage >= 90 ? theme.error : percentage >= 70 ? theme.warning : theme.success;
134
+ console.log(` ${title} ${colorFn(`${used}/${limit}`)} ${theme.muted(`(${percentage.toFixed(0)}%)`)}`);
135
+ }
136
+ /**
137
+ * Displays a boxed message for important announcements
138
+ * @param message Main message text
139
+ * @param options Boxen options
140
+ */
141
+ export function formatBox(message, options) {
142
+ console.log();
143
+ console.log(boxen(message, {
144
+ padding: options?.padding || 1,
145
+ margin: { left: 2 },
146
+ borderStyle: 'round',
147
+ borderColor: options?.borderColor || 'cyan',
148
+ title: options?.title,
149
+ titleAlignment: 'center',
150
+ }));
151
+ console.log();
152
+ }
153
+ /**
154
+ * Format a section header with divider
155
+ */
156
+ export function formatSection(title) {
157
+ console.log();
158
+ console.log(` ${formatHeader(title)}`);
159
+ console.log(` ${theme.muted('─'.repeat(Math.min(title.length, 60)))}`);
160
+ console.log();
161
+ }
162
+ /**
163
+ * Format a command summary footer
164
+ */
165
+ export function formatSummary(items) {
166
+ console.log();
167
+ console.log(` ${theme.muted('─'.repeat(60))}`);
168
+ for (const item of items) {
169
+ const symbol = item.status === 'success'
170
+ ? theme.symbols.success
171
+ : item.status === 'error'
172
+ ? theme.symbols.error
173
+ : item.status === 'warning'
174
+ ? theme.symbols.warning
175
+ : theme.symbols.dot;
176
+ console.log(` ${symbol} ${item.label}: ${theme.bold(String(item.value))}`);
177
+ }
178
+ console.log();
179
+ }
180
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Hybrid Data Access Layer
3
+ *
4
+ * Provides local-first data access with automatic API sync:
5
+ * - Reads: Try local store first, fall back to API if empty/stale
6
+ * - Writes: Optimistic local update + queue for background sync
7
+ * - Bootstrap: First-time fetch from API to populate local store
8
+ * - Offline: Graceful degradation with cached data
9
+ *
10
+ * This layer bridges the gap between the old API-first CLI and the new
11
+ * local-first sync engine until it is fully integrated.
12
+ */
13
+ import { type LocalStack } from './local-store.js';
14
+ import type { Stack } from '../stacks/types.js';
15
+ /**
16
+ * Get all stacks (local-first with API fallback)
17
+ */
18
+ export declare function getStacks(options?: {
19
+ forceRefresh?: boolean;
20
+ }): Promise<Stack[]>;
21
+ /**
22
+ * Get a single stack by ID (local-first with API fallback)
23
+ */
24
+ export declare function getStack(id: string, options?: {
25
+ forceRefresh?: boolean;
26
+ }): Promise<Stack | null>;
27
+ /**
28
+ * Create a new stack (optimistic update + API sync)
29
+ */
30
+ export declare function createStack(stack: Partial<Stack>): Promise<Stack>;
31
+ /**
32
+ * Update an existing stack (optimistic update + API sync)
33
+ */
34
+ export declare function updateStack(id: string, updates: Partial<LocalStack>): Promise<Stack>;
35
+ /**
36
+ * Delete a stack (optimistic update + API sync)
37
+ */
38
+ export declare function deleteStack(id: string): Promise<void>;
39
+ /**
40
+ * Get sync queue status for UI indicators
41
+ */
42
+ export declare function getQueueStatus(): Promise<import("./local-store.js").SyncStatus>;
43
+ /**
44
+ * Check if there are pending changes waiting to sync
45
+ */
46
+ export declare function hasPendingChanges(): Promise<boolean>;
47
+ //# sourceMappingURL=hybrid-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-data.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAaL,KAAK,UAAU,EAEhB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,KAAK,EAGN,MAAM,oBAAoB,CAAC;AAmF5B;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CA2BxB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAsCvB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA8DvE;AAyBD;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA4C1F;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB3D;AAMD;;GAEG;AACH,wBAAsB,cAAc,mDAEnC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG1D"}
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Hybrid Data Access Layer
3
+ *
4
+ * Provides local-first data access with automatic API sync:
5
+ * - Reads: Try local store first, fall back to API if empty/stale
6
+ * - Writes: Optimistic local update + queue for background sync
7
+ * - Bootstrap: First-time fetch from API to populate local store
8
+ * - Offline: Graceful degradation with cached data
9
+ *
10
+ * This layer bridges the gap between the old API-first CLI and the new
11
+ * local-first sync engine until it is fully integrated.
12
+ */
13
+ import { getLocalStacks, getLocalStack, createLocalStack, updateLocalStack, deleteLocalStack, getSyncStatus, isOffline, } from './local-store.js';
14
+ import { getApiClient, ApiError } from './api.js';
15
+ /**
16
+ * Convert API Stack to LocalStack
17
+ */
18
+ function apiStackToLocal(apiStack) {
19
+ return {
20
+ id: apiStack.id,
21
+ user_id: 'local-user', // Consistent sentinel for API-sourced stacks
22
+ team_id: apiStack.teamSlug,
23
+ owner_type: 'user', // Default to user
24
+ visibility: (apiStack.visibility || 'private'),
25
+ extends: apiStack.extends || [],
26
+ name: apiStack.name,
27
+ slug: apiStack.slug,
28
+ description: apiStack.description,
29
+ status: 'approved', // Default status
30
+ is_official: false, // API doesn't indicate this
31
+ is_synced: true, // Coming from API means it's synced
32
+ version: 0, // API stacks don't have version
33
+ extensions: apiStack.extensions.map((ext) => ({
34
+ extension_type: ext.type,
35
+ slug: ext.slug,
36
+ version: ext.version,
37
+ })),
38
+ created_at: apiStack.createdAt,
39
+ updated_at: apiStack.updatedAt,
40
+ };
41
+ }
42
+ /**
43
+ * Convert LocalStack to API Stack
44
+ */
45
+ function localStackToApi(localStack) {
46
+ return {
47
+ id: localStack.id,
48
+ name: localStack.name,
49
+ slug: localStack.slug,
50
+ description: localStack.description,
51
+ visibility: localStack.visibility,
52
+ teamSlug: localStack.team_id,
53
+ extends: localStack.extends,
54
+ extensions: localStack.extensions.map((ext) => ({
55
+ type: ext.extension_type,
56
+ slug: ext.slug,
57
+ version: ext.version,
58
+ })),
59
+ createdAt: localStack.created_at,
60
+ updatedAt: localStack.updated_at,
61
+ };
62
+ }
63
+ /**
64
+ * Sync stacks from API to local store (bootstrap)
65
+ */
66
+ async function syncStacksFromApi() {
67
+ const client = getApiClient({ authenticated: true });
68
+ const response = await client.get('/stacks');
69
+ if (response.success && response.data) {
70
+ const { stacks } = response.data;
71
+ // Insert all stacks into local store
72
+ for (const apiStack of stacks) {
73
+ const localStack = apiStackToLocal(apiStack);
74
+ try {
75
+ await createLocalStack(localStack);
76
+ }
77
+ catch (createError) {
78
+ // Stack might already exist, try update
79
+ try {
80
+ await updateLocalStack(localStack);
81
+ }
82
+ catch (updateError) {
83
+ console.warn(`[hybrid-data] Failed to sync stack "${apiStack.slug}" to local store:`, updateError instanceof Error ? updateError.message : updateError);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ // ============================================
90
+ // Hybrid Stack Operations
91
+ // ============================================
92
+ /**
93
+ * Get all stacks (local-first with API fallback)
94
+ */
95
+ export async function getStacks(options = {}) {
96
+ // Try local store first unless force refresh
97
+ if (!options.forceRefresh) {
98
+ try {
99
+ const localStacks = await getLocalStacks();
100
+ // If we have data, return it immediately
101
+ if (localStacks.length > 0) {
102
+ return localStacks.map(localStackToApi);
103
+ }
104
+ }
105
+ catch (error) {
106
+ // Local store error, fall through to API
107
+ console.warn('Local store unavailable, using API:', error);
108
+ }
109
+ }
110
+ // No local data or force refresh - fetch from API and sync
111
+ if (!(await isOffline())) {
112
+ await syncStacksFromApi();
113
+ // Now return from local store
114
+ const localStacks = await getLocalStacks();
115
+ return localStacks.map(localStackToApi);
116
+ }
117
+ // Offline with no cache - return empty
118
+ return [];
119
+ }
120
+ /**
121
+ * Get a single stack by ID (local-first with API fallback)
122
+ */
123
+ export async function getStack(id, options = {}) {
124
+ // Try local store first
125
+ if (!options.forceRefresh) {
126
+ try {
127
+ const localStack = await getLocalStack(id);
128
+ if (localStack) {
129
+ return localStackToApi(localStack);
130
+ }
131
+ }
132
+ catch (error) {
133
+ console.warn('Local store unavailable, using API:', error);
134
+ }
135
+ }
136
+ // Not in local store or force refresh - fetch from API
137
+ if (!(await isOffline())) {
138
+ const client = getApiClient({ authenticated: true });
139
+ const response = await client.get(`/stacks/${id}`);
140
+ if (response.success && response.data) {
141
+ const apiStack = response.data;
142
+ const localStack = apiStackToLocal(apiStack);
143
+ // Store in local cache
144
+ try {
145
+ await createLocalStack(localStack);
146
+ }
147
+ catch (cacheCreateError) {
148
+ try {
149
+ await updateLocalStack(localStack);
150
+ }
151
+ catch (cacheUpdateError) {
152
+ console.warn(`[hybrid-data] Failed to cache stack "${id}" locally:`, cacheUpdateError instanceof Error ? cacheUpdateError.message : cacheUpdateError);
153
+ }
154
+ }
155
+ return apiStack;
156
+ }
157
+ }
158
+ return null;
159
+ }
160
+ /**
161
+ * Create a new stack (optimistic update + API sync)
162
+ */
163
+ export async function createStack(stack) {
164
+ // Generate local ID if not provided
165
+ const now = new Date().toISOString();
166
+ const localStack = {
167
+ id: stack.id || `stack-${Date.now()}`,
168
+ user_id: 'local-user', // Consistent sentinel until API assigns real user_id
169
+ team_id: stack.teamSlug,
170
+ owner_type: 'user',
171
+ visibility: stack.visibility || 'private',
172
+ extends: stack.extends || [],
173
+ name: stack.name || '',
174
+ slug: stack.slug || stack.name?.toLowerCase().replace(/\s+/g, '-') || '',
175
+ description: stack.description,
176
+ status: 'approved',
177
+ is_official: false,
178
+ is_synced: false, // Not yet synced to API
179
+ version: 0,
180
+ extensions: (stack.extensions || []).map((ext) => ({
181
+ extension_type: ext.type,
182
+ slug: ext.slug,
183
+ version: ext.version,
184
+ })),
185
+ created_at: now,
186
+ updated_at: now,
187
+ };
188
+ // Apply locally first (optimistic update)
189
+ await createLocalStack(localStack);
190
+ // If online, sync to API immediately
191
+ if (!(await isOffline())) {
192
+ try {
193
+ const client = getApiClient({ authenticated: true });
194
+ const response = await client.post('/stacks', {
195
+ name: localStack.name,
196
+ description: localStack.description,
197
+ visibility: localStack.visibility,
198
+ extensions: localStack.extensions.map((ext) => ({
199
+ type: ext.extension_type,
200
+ slug: ext.slug,
201
+ version: ext.version,
202
+ })),
203
+ });
204
+ if (response.success && response.data) {
205
+ const apiStack = response.data;
206
+ const syncedStack = apiStackToLocal(apiStack);
207
+ // Update local store with server-assigned ID and data
208
+ await updateLocalStack(syncedStack);
209
+ return apiStack;
210
+ }
211
+ }
212
+ catch (error) {
213
+ if (error instanceof ApiError) {
214
+ throw error;
215
+ }
216
+ // Network error - keep local version, will sync later
217
+ }
218
+ }
219
+ return localStackToApi(localStack);
220
+ }
221
+ /**
222
+ * Convert LocalStack fields to API-compatible camelCase payload.
223
+ * Only includes fields that are present in the updates.
224
+ */
225
+ function localUpdatesToApiPayload(updates) {
226
+ const apiPayload = {};
227
+ if (updates.name !== undefined)
228
+ apiPayload.name = updates.name;
229
+ if (updates.description !== undefined)
230
+ apiPayload.description = updates.description;
231
+ if (updates.visibility !== undefined)
232
+ apiPayload.visibility = updates.visibility;
233
+ if (updates.team_id !== undefined)
234
+ apiPayload.teamSlug = updates.team_id;
235
+ if (updates.extends !== undefined)
236
+ apiPayload.extends = updates.extends;
237
+ if (updates.extensions !== undefined) {
238
+ apiPayload.extensions = updates.extensions.map((ext) => ({
239
+ type: ext.extension_type,
240
+ slug: ext.slug,
241
+ version: ext.version,
242
+ }));
243
+ }
244
+ return apiPayload;
245
+ }
246
+ /**
247
+ * Update an existing stack (optimistic update + API sync)
248
+ */
249
+ export async function updateStack(id, updates) {
250
+ // Get current stack
251
+ const existingStack = await getLocalStack(id);
252
+ if (!existingStack) {
253
+ throw new Error(`Stack not found: ${id}`);
254
+ }
255
+ // Merge updates
256
+ const updatedStack = {
257
+ ...existingStack,
258
+ ...updates,
259
+ updated_at: new Date().toISOString(),
260
+ is_synced: false,
261
+ };
262
+ // Apply locally first (optimistic update)
263
+ await updateLocalStack(updatedStack);
264
+ // If online, sync to API immediately
265
+ if (!(await isOffline())) {
266
+ try {
267
+ const client = getApiClient({ authenticated: true });
268
+ // Convert snake_case LocalStack fields to camelCase API payload
269
+ const apiPayload = localUpdatesToApiPayload(updates);
270
+ const response = await client.put(`/stacks/${id}`, apiPayload);
271
+ if (response.success && response.data) {
272
+ const apiStack = response.data;
273
+ const syncedStack = apiStackToLocal(apiStack);
274
+ // Update local store with server confirmation
275
+ await updateLocalStack(syncedStack);
276
+ return apiStack;
277
+ }
278
+ }
279
+ catch (error) {
280
+ if (error instanceof ApiError) {
281
+ throw error;
282
+ }
283
+ // Network error - keep local version, will sync later
284
+ }
285
+ }
286
+ return localStackToApi(updatedStack);
287
+ }
288
+ /**
289
+ * Delete a stack (optimistic update + API sync)
290
+ */
291
+ export async function deleteStack(id) {
292
+ // Delete locally first (optimistic)
293
+ await deleteLocalStack(id);
294
+ // If online, sync to API immediately
295
+ if (!(await isOffline())) {
296
+ try {
297
+ const client = getApiClient({ authenticated: true });
298
+ await client.delete(`/stacks/${id}`);
299
+ }
300
+ catch (error) {
301
+ if (error instanceof ApiError) {
302
+ // If API delete fails, restore local copy?
303
+ // For now, just propagate the error
304
+ throw error;
305
+ }
306
+ // Network error - deletion will sync later
307
+ }
308
+ }
309
+ }
310
+ // ============================================
311
+ // Sync Status Helpers
312
+ // ============================================
313
+ /**
314
+ * Get sync queue status for UI indicators
315
+ */
316
+ export async function getQueueStatus() {
317
+ return getSyncStatus();
318
+ }
319
+ /**
320
+ * Check if there are pending changes waiting to sync
321
+ */
322
+ export async function hasPendingChanges() {
323
+ const status = await getSyncStatus();
324
+ return status.pending > 0;
325
+ }
326
+ //# sourceMappingURL=hybrid-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-data.js","sourceRoot":"","sources":["../../src/lib/hybrid-data.ts"],"names":[],"mappings":"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"}