pilothub 0.0.1 → 0.0.2

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 (388) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +36 -129
  3. package/dist/browserAuth.d.ts +20 -0
  4. package/dist/browserAuth.js +156 -0
  5. package/dist/browserAuth.js.map +1 -0
  6. package/dist/browserAuth.test.d.ts +1 -0
  7. package/dist/browserAuth.test.js +83 -0
  8. package/dist/browserAuth.test.js.map +1 -0
  9. package/dist/cli/buildInfo.d.ts +3 -0
  10. package/dist/cli/buildInfo.js +103 -0
  11. package/dist/cli/buildInfo.js.map +1 -0
  12. package/dist/cli/commands/auth.d.ts +9 -0
  13. package/dist/cli/commands/auth.js +75 -0
  14. package/dist/cli/commands/auth.js.map +1 -0
  15. package/dist/cli/commands/delete.d.ts +11 -0
  16. package/dist/cli/commands/delete.js +67 -0
  17. package/dist/cli/commands/delete.js.map +1 -0
  18. package/dist/cli/commands/delete.test.d.ts +1 -0
  19. package/dist/cli/commands/delete.test.js +52 -0
  20. package/dist/cli/commands/delete.test.js.map +1 -0
  21. package/dist/cli/commands/publish.d.ts +9 -0
  22. package/dist/cli/commands/publish.js +87 -0
  23. package/dist/cli/commands/publish.js.map +1 -0
  24. package/dist/cli/commands/publish.test.d.ts +1 -0
  25. package/dist/cli/commands/publish.test.js +104 -0
  26. package/dist/cli/commands/publish.test.js.map +1 -0
  27. package/dist/cli/commands/skills.d.ts +23 -0
  28. package/dist/cli/commands/skills.js +298 -0
  29. package/dist/cli/commands/skills.js.map +1 -0
  30. package/dist/cli/commands/skills.test.d.ts +1 -0
  31. package/dist/cli/commands/skills.test.js +156 -0
  32. package/dist/cli/commands/skills.test.js.map +1 -0
  33. package/dist/cli/commands/star.d.ts +8 -0
  34. package/dist/cli/commands/star.js +38 -0
  35. package/dist/cli/commands/star.js.map +1 -0
  36. package/dist/cli/commands/sync.d.ts +3 -0
  37. package/dist/cli/commands/sync.js +160 -0
  38. package/dist/cli/commands/sync.js.map +1 -0
  39. package/dist/cli/commands/sync.test.d.ts +1 -0
  40. package/dist/cli/commands/sync.test.js +277 -0
  41. package/dist/cli/commands/sync.test.js.map +1 -0
  42. package/dist/cli/commands/syncHelpers.d.ts +76 -0
  43. package/dist/cli/commands/syncHelpers.js +349 -0
  44. package/dist/cli/commands/syncHelpers.js.map +1 -0
  45. package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
  46. package/dist/cli/commands/syncHelpers.test.js +22 -0
  47. package/dist/cli/commands/syncHelpers.test.js.map +1 -0
  48. package/dist/cli/commands/syncTypes.d.ts +24 -0
  49. package/dist/cli/commands/syncTypes.js +2 -0
  50. package/dist/cli/commands/syncTypes.js.map +1 -0
  51. package/dist/cli/commands/unstar.d.ts +8 -0
  52. package/dist/cli/commands/unstar.js +38 -0
  53. package/dist/cli/commands/unstar.js.map +1 -0
  54. package/dist/cli/helpStyle.d.ts +13 -0
  55. package/dist/cli/helpStyle.js +38 -0
  56. package/dist/cli/helpStyle.js.map +1 -0
  57. package/dist/cli/pilotbotConfig.d.ts +6 -0
  58. package/dist/cli/pilotbotConfig.js +110 -0
  59. package/dist/cli/pilotbotConfig.js.map +1 -0
  60. package/dist/cli/pilotbotConfig.test.d.ts +1 -0
  61. package/dist/cli/pilotbotConfig.test.js +133 -0
  62. package/dist/cli/pilotbotConfig.test.js.map +1 -0
  63. package/dist/cli/registry.d.ts +7 -0
  64. package/dist/cli/registry.js +42 -0
  65. package/dist/cli/registry.js.map +1 -0
  66. package/dist/cli/registry.test.d.ts +1 -0
  67. package/dist/cli/registry.test.js +48 -0
  68. package/dist/cli/registry.test.js.map +1 -0
  69. package/dist/cli/scanSkills.d.ts +7 -0
  70. package/dist/cli/scanSkills.js +75 -0
  71. package/dist/cli/scanSkills.js.map +1 -0
  72. package/dist/cli/scanSkills.test.d.ts +1 -0
  73. package/dist/cli/scanSkills.test.js +60 -0
  74. package/dist/cli/scanSkills.test.js.map +1 -0
  75. package/dist/cli/slug.d.ts +2 -0
  76. package/dist/cli/slug.js +16 -0
  77. package/dist/cli/slug.js.map +1 -0
  78. package/dist/cli/types.d.ts +15 -0
  79. package/dist/cli/types.js +2 -0
  80. package/dist/cli/types.js.map +1 -0
  81. package/dist/cli/ui.d.ts +7 -0
  82. package/dist/cli/ui.js +72 -0
  83. package/dist/cli/ui.js.map +1 -0
  84. package/dist/cli.d.ts +2 -0
  85. package/dist/cli.js +268 -0
  86. package/dist/cli.js.map +1 -0
  87. package/dist/config.d.ts +4 -0
  88. package/dist/config.js +38 -0
  89. package/dist/config.js.map +1 -0
  90. package/dist/discovery.d.ts +5 -0
  91. package/dist/discovery.js +21 -0
  92. package/dist/discovery.js.map +1 -0
  93. package/dist/discovery.test.d.ts +1 -0
  94. package/dist/discovery.test.js +46 -0
  95. package/dist/discovery.test.js.map +1 -0
  96. package/dist/http.d.ts +32 -0
  97. package/dist/http.js +261 -0
  98. package/dist/http.js.map +1 -0
  99. package/dist/http.test.d.ts +1 -0
  100. package/dist/http.test.js +135 -0
  101. package/dist/http.test.js.map +1 -0
  102. package/dist/schema/ark.js.map +1 -0
  103. package/dist/schema/index.js.map +1 -0
  104. package/dist/schema/routes.js.map +1 -0
  105. package/{packages/schema/dist → dist/schema}/schemas.d.ts +0 -39
  106. package/{packages/schema/dist → dist/schema}/schemas.js +0 -22
  107. package/dist/schema/schemas.js.map +1 -0
  108. package/dist/schema/textFiles.js.map +1 -0
  109. package/dist/schema/textFiles.test.d.ts +1 -0
  110. package/dist/schema/textFiles.test.js +20 -0
  111. package/dist/schema/textFiles.test.js.map +1 -0
  112. package/dist/skills.d.ts +43 -0
  113. package/dist/skills.js +163 -0
  114. package/dist/skills.js.map +1 -0
  115. package/dist/skills.test.d.ts +1 -0
  116. package/dist/skills.test.js +144 -0
  117. package/dist/skills.test.js.map +1 -0
  118. package/dist/types.d.ts +7 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/package.json +27 -70
  122. package/.env.local.example +0 -19
  123. package/.github/workflows/ci.yml +0 -40
  124. package/.oxlintrc.json +0 -3
  125. package/AGENTS.md +0 -45
  126. package/CHANGELOG.md +0 -138
  127. package/DEPRECATIONS.md +0 -7
  128. package/biome.json +0 -41
  129. package/convex/_generated/api.d.ts +0 -153
  130. package/convex/_generated/api.js +0 -23
  131. package/convex/_generated/dataModel.d.ts +0 -60
  132. package/convex/_generated/server.d.ts +0 -143
  133. package/convex/_generated/server.js +0 -93
  134. package/convex/auth.config.ts +0 -8
  135. package/convex/auth.ts +0 -19
  136. package/convex/comments.ts +0 -88
  137. package/convex/crons.ts +0 -34
  138. package/convex/devSeed.ts +0 -459
  139. package/convex/devSeedExtra.ts +0 -541
  140. package/convex/downloads.ts +0 -78
  141. package/convex/githubBackups.ts +0 -170
  142. package/convex/githubBackupsNode.ts +0 -183
  143. package/convex/githubImport.ts +0 -317
  144. package/convex/githubSoulBackups.ts +0 -170
  145. package/convex/githubSoulBackupsNode.ts +0 -186
  146. package/convex/http.ts +0 -194
  147. package/convex/httpApi.handlers.test.ts +0 -488
  148. package/convex/httpApi.test.ts +0 -70
  149. package/convex/httpApi.ts +0 -305
  150. package/convex/httpApiV1.handlers.test.ts +0 -584
  151. package/convex/httpApiV1.ts +0 -1172
  152. package/convex/leaderboards.ts +0 -39
  153. package/convex/lib/access.ts +0 -36
  154. package/convex/lib/apiTokenAuth.ts +0 -36
  155. package/convex/lib/badges.ts +0 -50
  156. package/convex/lib/changelog.test.ts +0 -34
  157. package/convex/lib/changelog.ts +0 -278
  158. package/convex/lib/embeddings.ts +0 -38
  159. package/convex/lib/githubBackup.ts +0 -443
  160. package/convex/lib/githubImport.test.ts +0 -247
  161. package/convex/lib/githubImport.ts +0 -425
  162. package/convex/lib/githubSoulBackup.ts +0 -443
  163. package/convex/lib/leaderboards.ts +0 -103
  164. package/convex/lib/moderation.ts +0 -42
  165. package/convex/lib/public.ts +0 -89
  166. package/convex/lib/searchText.test.ts +0 -46
  167. package/convex/lib/searchText.ts +0 -27
  168. package/convex/lib/skillBackfill.test.ts +0 -34
  169. package/convex/lib/skillBackfill.ts +0 -67
  170. package/convex/lib/skillPublish.test.ts +0 -28
  171. package/convex/lib/skillPublish.ts +0 -284
  172. package/convex/lib/skillStats.ts +0 -80
  173. package/convex/lib/skills.test.ts +0 -197
  174. package/convex/lib/skills.ts +0 -273
  175. package/convex/lib/soulChangelog.ts +0 -273
  176. package/convex/lib/soulPublish.ts +0 -236
  177. package/convex/lib/tokens.test.ts +0 -33
  178. package/convex/lib/tokens.ts +0 -51
  179. package/convex/lib/webhooks.test.ts +0 -91
  180. package/convex/lib/webhooks.ts +0 -112
  181. package/convex/maintenance.test.ts +0 -270
  182. package/convex/maintenance.ts +0 -840
  183. package/convex/rateLimits.ts +0 -50
  184. package/convex/schema.ts +0 -472
  185. package/convex/search.test.ts +0 -12
  186. package/convex/search.ts +0 -254
  187. package/convex/seed.test.ts +0 -37
  188. package/convex/seed.ts +0 -254
  189. package/convex/seedSouls.ts +0 -111
  190. package/convex/skillStatEvents.ts +0 -568
  191. package/convex/skills.ts +0 -1606
  192. package/convex/soulComments.ts +0 -88
  193. package/convex/soulDownloads.ts +0 -14
  194. package/convex/soulStars.ts +0 -71
  195. package/convex/souls.ts +0 -570
  196. package/convex/stars.ts +0 -108
  197. package/convex/statsMaintenance.ts +0 -205
  198. package/convex/telemetry.ts +0 -434
  199. package/convex/tokens.ts +0 -88
  200. package/convex/tsconfig.json +0 -7
  201. package/convex/uploads.ts +0 -20
  202. package/convex/users.ts +0 -122
  203. package/convex/webhooks.ts +0 -50
  204. package/convex.json +0 -3
  205. package/docs/README.md +0 -32
  206. package/docs/api.md +0 -51
  207. package/docs/architecture.md +0 -61
  208. package/docs/auth.md +0 -54
  209. package/docs/cli.md +0 -117
  210. package/docs/deploy.md +0 -78
  211. package/docs/diffing.md +0 -84
  212. package/docs/github-import.md +0 -171
  213. package/docs/http-api.md +0 -187
  214. package/docs/manual-testing.md +0 -64
  215. package/docs/mintlify.md +0 -43
  216. package/docs/quickstart.md +0 -120
  217. package/docs/skill-format.md +0 -58
  218. package/docs/soul-format.md +0 -37
  219. package/docs/spec.md +0 -177
  220. package/docs/telemetry.md +0 -91
  221. package/docs/troubleshooting.md +0 -49
  222. package/docs/webhook.md +0 -51
  223. package/e2e/menu-smoke.pw.test.ts +0 -49
  224. package/e2e/pilothub.e2e.test.ts +0 -494
  225. package/e2e/search-exact.pw.test.ts +0 -97
  226. package/packages/pilothub/LICENSE +0 -22
  227. package/packages/pilothub/README.md +0 -57
  228. package/packages/pilothub/package.json +0 -41
  229. package/packages/pilothub/src/browserAuth.test.ts +0 -96
  230. package/packages/pilothub/src/browserAuth.ts +0 -174
  231. package/packages/pilothub/src/cli/buildInfo.ts +0 -94
  232. package/packages/pilothub/src/cli/commands/auth.ts +0 -97
  233. package/packages/pilothub/src/cli/commands/delete.test.ts +0 -73
  234. package/packages/pilothub/src/cli/commands/delete.ts +0 -83
  235. package/packages/pilothub/src/cli/commands/publish.test.ts +0 -122
  236. package/packages/pilothub/src/cli/commands/publish.ts +0 -108
  237. package/packages/pilothub/src/cli/commands/skills.test.ts +0 -191
  238. package/packages/pilothub/src/cli/commands/skills.ts +0 -380
  239. package/packages/pilothub/src/cli/commands/star.ts +0 -46
  240. package/packages/pilothub/src/cli/commands/sync.test.ts +0 -310
  241. package/packages/pilothub/src/cli/commands/sync.ts +0 -200
  242. package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +0 -26
  243. package/packages/pilothub/src/cli/commands/syncHelpers.ts +0 -427
  244. package/packages/pilothub/src/cli/commands/syncTypes.ts +0 -27
  245. package/packages/pilothub/src/cli/commands/unstar.ts +0 -48
  246. package/packages/pilothub/src/cli/helpStyle.ts +0 -45
  247. package/packages/pilothub/src/cli/pilotbotConfig.test.ts +0 -159
  248. package/packages/pilothub/src/cli/pilotbotConfig.ts +0 -147
  249. package/packages/pilothub/src/cli/registry.test.ts +0 -63
  250. package/packages/pilothub/src/cli/registry.ts +0 -43
  251. package/packages/pilothub/src/cli/scanSkills.test.ts +0 -64
  252. package/packages/pilothub/src/cli/scanSkills.ts +0 -84
  253. package/packages/pilothub/src/cli/slug.ts +0 -16
  254. package/packages/pilothub/src/cli/types.ts +0 -12
  255. package/packages/pilothub/src/cli/ui.ts +0 -75
  256. package/packages/pilothub/src/cli.ts +0 -311
  257. package/packages/pilothub/src/config.ts +0 -36
  258. package/packages/pilothub/src/discovery.test.ts +0 -75
  259. package/packages/pilothub/src/discovery.ts +0 -19
  260. package/packages/pilothub/src/http.test.ts +0 -156
  261. package/packages/pilothub/src/http.ts +0 -301
  262. package/packages/pilothub/src/schema/ark.ts +0 -29
  263. package/packages/pilothub/src/schema/index.ts +0 -5
  264. package/packages/pilothub/src/schema/routes.ts +0 -22
  265. package/packages/pilothub/src/schema/schemas.ts +0 -260
  266. package/packages/pilothub/src/schema/textFiles.test.ts +0 -23
  267. package/packages/pilothub/src/schema/textFiles.ts +0 -66
  268. package/packages/pilothub/src/skills.test.ts +0 -191
  269. package/packages/pilothub/src/skills.ts +0 -172
  270. package/packages/pilothub/src/types.ts +0 -10
  271. package/packages/pilothub/tsconfig.json +0 -14
  272. package/packages/schema/README.md +0 -3
  273. package/packages/schema/dist/ark.js.map +0 -1
  274. package/packages/schema/dist/index.js.map +0 -1
  275. package/packages/schema/dist/routes.js.map +0 -1
  276. package/packages/schema/dist/schemas.js.map +0 -1
  277. package/packages/schema/dist/textFiles.js.map +0 -1
  278. package/packages/schema/package.json +0 -26
  279. package/packages/schema/src/ark.ts +0 -29
  280. package/packages/schema/src/index.ts +0 -5
  281. package/packages/schema/src/routes.ts +0 -22
  282. package/packages/schema/src/schemas.test.ts +0 -123
  283. package/packages/schema/src/schemas.ts +0 -287
  284. package/packages/schema/src/textFiles.test.ts +0 -23
  285. package/packages/schema/src/textFiles.ts +0 -66
  286. package/packages/schema/tsconfig.json +0 -15
  287. package/pilothub +0 -46
  288. package/playwright.config.ts +0 -33
  289. package/public/.well-known/pilothub.json +0 -6
  290. package/public/api/v1/openapi.json +0 -379
  291. package/public/favicon.ico +0 -0
  292. package/public/logo192.png +0 -0
  293. package/public/logo512.png +0 -0
  294. package/public/manifest.json +0 -25
  295. package/public/og.png +0 -0
  296. package/public/og.svg +0 -98
  297. package/public/pilot-logo.png +0 -0
  298. package/public/pilot-mark.png +0 -0
  299. package/public/robots.txt +0 -3
  300. package/public/tanstack-circle-logo.png +0 -0
  301. package/public/tanstack-word-logo-white.svg +0 -1
  302. package/scripts/check-peer-deps.ts +0 -56
  303. package/scripts/docs-list.ts +0 -148
  304. package/scripts/run-playwright-local.sh +0 -14
  305. package/server/og/fetchSkillOgMeta.ts +0 -27
  306. package/server/og/fetchSoulOgMeta.ts +0 -27
  307. package/server/og/ogAssets.ts +0 -80
  308. package/server/og/skillOgSvg.test.ts +0 -59
  309. package/server/og/skillOgSvg.ts +0 -258
  310. package/server/og/soulOgSvg.ts +0 -209
  311. package/server/routes/og/skill.png.ts +0 -103
  312. package/server/routes/og/soul.png.ts +0 -111
  313. package/src/__tests__/skill-detail-page.test.tsx +0 -86
  314. package/src/__tests__/skills-index.test.tsx +0 -145
  315. package/src/__tests__/upload.route.test.tsx +0 -228
  316. package/src/components/AppProviders.tsx +0 -19
  317. package/src/components/ClientOnly.tsx +0 -18
  318. package/src/components/Footer.tsx +0 -29
  319. package/src/components/Header.tsx +0 -295
  320. package/src/components/InstallSwitcher.tsx +0 -53
  321. package/src/components/SkillCard.tsx +0 -36
  322. package/src/components/SkillDetailPage.tsx +0 -817
  323. package/src/components/SkillDiffCard.tsx +0 -485
  324. package/src/components/SoulCard.tsx +0 -19
  325. package/src/components/SoulDetailPage.tsx +0 -263
  326. package/src/components/UserBootstrap.tsx +0 -18
  327. package/src/components/ui/dropdown-menu.tsx +0 -67
  328. package/src/components/ui/toggle-group.tsx +0 -35
  329. package/src/convex/client.ts +0 -3
  330. package/src/lib/badges.ts +0 -29
  331. package/src/lib/diffing.test.ts +0 -163
  332. package/src/lib/diffing.ts +0 -106
  333. package/src/lib/gravatar.test.ts +0 -9
  334. package/src/lib/gravatar.ts +0 -158
  335. package/src/lib/og.test.ts +0 -142
  336. package/src/lib/og.ts +0 -156
  337. package/src/lib/publicUser.ts +0 -39
  338. package/src/lib/roles.ts +0 -19
  339. package/src/lib/site.test.ts +0 -130
  340. package/src/lib/site.ts +0 -84
  341. package/src/lib/theme-transition.test.ts +0 -134
  342. package/src/lib/theme-transition.ts +0 -134
  343. package/src/lib/theme.test.tsx +0 -88
  344. package/src/lib/theme.ts +0 -43
  345. package/src/lib/uploadFiles.jsdom.test.ts +0 -33
  346. package/src/lib/uploadFiles.test.ts +0 -123
  347. package/src/lib/uploadFiles.ts +0 -245
  348. package/src/lib/uploadUtils.test.ts +0 -78
  349. package/src/lib/uploadUtils.ts +0 -93
  350. package/src/lib/useAuthStatus.ts +0 -12
  351. package/src/lib/utils.test.ts +0 -9
  352. package/src/lib/utils.ts +0 -6
  353. package/src/logo.svg +0 -12
  354. package/src/routeTree.gen.ts +0 -345
  355. package/src/router.tsx +0 -17
  356. package/src/routes/$owner/$slug.tsx +0 -55
  357. package/src/routes/__root.tsx +0 -136
  358. package/src/routes/admin.tsx +0 -11
  359. package/src/routes/cli/auth.tsx +0 -168
  360. package/src/routes/dashboard.tsx +0 -97
  361. package/src/routes/import.tsx +0 -415
  362. package/src/routes/index.tsx +0 -252
  363. package/src/routes/management.tsx +0 -529
  364. package/src/routes/settings.tsx +0 -203
  365. package/src/routes/skills/index.tsx +0 -422
  366. package/src/routes/souls/$slug.tsx +0 -55
  367. package/src/routes/souls/index.tsx +0 -243
  368. package/src/routes/stars.tsx +0 -68
  369. package/src/routes/u/$handle.tsx +0 -307
  370. package/src/routes/upload/utils.ts +0 -81
  371. package/src/routes/upload.tsx +0 -499
  372. package/src/styles.css +0 -2718
  373. package/tsconfig.json +0 -24
  374. package/tsconfig.oxlint.json +0 -16
  375. package/vercel.json +0 -8
  376. package/vite.config.ts +0 -48
  377. package/vitest.config.ts +0 -47
  378. package/vitest.e2e.config.ts +0 -11
  379. package/vitest.setup.ts +0 -1
  380. /package/{packages/pilothub/bin → bin}/pilothub.js +0 -0
  381. /package/{packages/schema/dist → dist/schema}/ark.d.ts +0 -0
  382. /package/{packages/schema/dist → dist/schema}/ark.js +0 -0
  383. /package/{packages/schema/dist → dist/schema}/index.d.ts +0 -0
  384. /package/{packages/schema/dist → dist/schema}/index.js +0 -0
  385. /package/{packages/schema/dist → dist/schema}/routes.d.ts +0 -0
  386. /package/{packages/schema/dist → dist/schema}/routes.js +0 -0
  387. /package/{packages/schema/dist → dist/schema}/textFiles.d.ts +0 -0
  388. /package/{packages/schema/dist → dist/schema}/textFiles.js +0 -0
@@ -0,0 +1,298 @@
1
+ import { mkdir, rm, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import semver from 'semver';
4
+ import { apiRequest, downloadZip } from '../../http.js';
5
+ import { ApiRoutes, ApiV1SearchResponseSchema, ApiV1SkillListResponseSchema, ApiV1SkillResolveResponseSchema, ApiV1SkillResponseSchema, } from '../../schema/index.js';
6
+ import { extractZipToDir, hashSkillFiles, listTextFiles, readLockfile, readSkillOrigin, writeLockfile, writeSkillOrigin, } from '../../skills.js';
7
+ import { getRegistry } from '../registry.js';
8
+ import { createSpinner, fail, formatError, isInteractive, promptConfirm } from '../ui.js';
9
+ export async function cmdSearch(opts, query, limit) {
10
+ if (!query)
11
+ fail('Query required');
12
+ const registry = await getRegistry(opts, { cache: true });
13
+ const spinner = createSpinner('Searching');
14
+ try {
15
+ const url = new URL(ApiRoutes.search, registry);
16
+ url.searchParams.set('q', query);
17
+ if (typeof limit === 'number' && Number.isFinite(limit)) {
18
+ url.searchParams.set('limit', String(limit));
19
+ }
20
+ const result = await apiRequest(registry, { method: 'GET', url: url.toString() }, ApiV1SearchResponseSchema);
21
+ spinner.stop();
22
+ for (const entry of result.results) {
23
+ const slug = entry.slug ?? 'unknown';
24
+ const name = entry.displayName ?? slug;
25
+ const version = entry.version ? ` v${entry.version}` : '';
26
+ console.log(`${slug}${version} ${name} (${entry.score.toFixed(3)})`);
27
+ }
28
+ }
29
+ catch (error) {
30
+ spinner.fail(formatError(error));
31
+ throw error;
32
+ }
33
+ }
34
+ export async function cmdInstall(opts, slug, versionFlag, force = false) {
35
+ const trimmed = slug.trim();
36
+ if (!trimmed)
37
+ fail('Slug required');
38
+ const registry = await getRegistry(opts, { cache: true });
39
+ await mkdir(opts.dir, { recursive: true });
40
+ const target = join(opts.dir, trimmed);
41
+ if (!force) {
42
+ const exists = await fileExists(target);
43
+ if (exists)
44
+ fail(`Already installed: ${target} (use --force)`);
45
+ }
46
+ else {
47
+ await rm(target, { recursive: true, force: true });
48
+ }
49
+ const spinner = createSpinner(`Resolving ${trimmed}`);
50
+ try {
51
+ const resolvedVersion = versionFlag ??
52
+ (await apiRequest(registry, { method: 'GET', path: `${ApiRoutes.skills}/${encodeURIComponent(trimmed)}` }, ApiV1SkillResponseSchema)).latestVersion?.version ??
53
+ null;
54
+ if (!resolvedVersion)
55
+ fail('Could not resolve latest version');
56
+ spinner.text = `Downloading ${trimmed}@${resolvedVersion}`;
57
+ const zip = await downloadZip(registry, { slug: trimmed, version: resolvedVersion });
58
+ await extractZipToDir(zip, target);
59
+ await writeSkillOrigin(target, {
60
+ version: 1,
61
+ registry,
62
+ slug: trimmed,
63
+ installedVersion: resolvedVersion,
64
+ installedAt: Date.now(),
65
+ });
66
+ const lock = await readLockfile(opts.workdir);
67
+ lock.skills[trimmed] = {
68
+ version: resolvedVersion,
69
+ installedAt: Date.now(),
70
+ };
71
+ await writeLockfile(opts.workdir, lock);
72
+ spinner.succeed(`OK. Installed ${trimmed} -> ${target}`);
73
+ }
74
+ catch (error) {
75
+ spinner.fail(formatError(error));
76
+ throw error;
77
+ }
78
+ }
79
+ export async function cmdUpdate(opts, slugArg, options, inputAllowed) {
80
+ const slug = slugArg?.trim();
81
+ const all = Boolean(options.all);
82
+ if (!slug && !all)
83
+ fail('Provide <slug> or --all');
84
+ if (slug && all)
85
+ fail('Use either <slug> or --all');
86
+ if (options.version && !slug)
87
+ fail('--version requires a single <slug>');
88
+ if (options.version && !semver.valid(options.version))
89
+ fail('--version must be valid semver');
90
+ const allowPrompt = isInteractive() && inputAllowed !== false;
91
+ const registry = await getRegistry(opts, { cache: true });
92
+ const lock = await readLockfile(opts.workdir);
93
+ const slugs = slug ? [slug] : Object.keys(lock.skills);
94
+ if (slugs.length === 0) {
95
+ console.log('No installed skills.');
96
+ return;
97
+ }
98
+ for (const entry of slugs) {
99
+ const spinner = createSpinner(`Checking ${entry}`);
100
+ try {
101
+ const target = join(opts.dir, entry);
102
+ const exists = await fileExists(target);
103
+ let localFingerprint = null;
104
+ if (exists) {
105
+ const filesOnDisk = await listTextFiles(target);
106
+ if (filesOnDisk.length > 0) {
107
+ const hashed = hashSkillFiles(filesOnDisk);
108
+ localFingerprint = hashed.fingerprint;
109
+ }
110
+ }
111
+ let resolveResult;
112
+ if (localFingerprint) {
113
+ resolveResult = await resolveSkillVersion(registry, entry, localFingerprint);
114
+ }
115
+ else {
116
+ const meta = await apiRequest(registry, { method: 'GET', path: `${ApiRoutes.skills}/${encodeURIComponent(entry)}` }, ApiV1SkillResponseSchema);
117
+ resolveResult = { match: null, latestVersion: meta.latestVersion ?? null };
118
+ }
119
+ const latest = resolveResult.latestVersion?.version ?? null;
120
+ const matched = resolveResult.match?.version ?? null;
121
+ if (matched && lock.skills[entry]?.version !== matched) {
122
+ lock.skills[entry] = {
123
+ version: matched,
124
+ installedAt: lock.skills[entry]?.installedAt ?? Date.now(),
125
+ };
126
+ }
127
+ if (!latest) {
128
+ spinner.fail(`${entry}: not found`);
129
+ continue;
130
+ }
131
+ if (!matched && localFingerprint && !options.force) {
132
+ spinner.stop();
133
+ if (!allowPrompt) {
134
+ console.log(`${entry}: local changes (no match). Use --force to overwrite.`);
135
+ continue;
136
+ }
137
+ const confirm = await promptConfirm(`${entry}: local changes (no match). Overwrite with ${options.version ?? latest}?`);
138
+ if (!confirm) {
139
+ console.log(`${entry}: skipped`);
140
+ continue;
141
+ }
142
+ spinner.start(`Updating ${entry} -> ${options.version ?? latest}`);
143
+ }
144
+ const targetVersion = options.version ?? latest;
145
+ if (options.version) {
146
+ if (matched && matched === targetVersion) {
147
+ spinner.succeed(`${entry}: already at ${matched}`);
148
+ continue;
149
+ }
150
+ }
151
+ else if (matched && semver.valid(matched) && semver.gte(matched, targetVersion)) {
152
+ spinner.succeed(`${entry}: up to date (${matched})`);
153
+ continue;
154
+ }
155
+ if (spinner.isSpinning) {
156
+ spinner.text = `Updating ${entry} -> ${targetVersion}`;
157
+ }
158
+ else {
159
+ spinner.start(`Updating ${entry} -> ${targetVersion}`);
160
+ }
161
+ await rm(target, { recursive: true, force: true });
162
+ const zip = await downloadZip(registry, { slug: entry, version: targetVersion });
163
+ await extractZipToDir(zip, target);
164
+ const existingOrigin = await readSkillOrigin(target);
165
+ await writeSkillOrigin(target, {
166
+ version: 1,
167
+ registry: existingOrigin?.registry ?? registry,
168
+ slug: existingOrigin?.slug ?? entry,
169
+ installedVersion: targetVersion,
170
+ installedAt: existingOrigin?.installedAt ?? Date.now(),
171
+ });
172
+ lock.skills[entry] = { version: targetVersion, installedAt: Date.now() };
173
+ spinner.succeed(`${entry}: updated -> ${targetVersion}`);
174
+ }
175
+ catch (error) {
176
+ spinner.fail(formatError(error));
177
+ throw error;
178
+ }
179
+ }
180
+ await writeLockfile(opts.workdir, lock);
181
+ }
182
+ export async function cmdList(opts) {
183
+ const lock = await readLockfile(opts.workdir);
184
+ const entries = Object.entries(lock.skills);
185
+ if (entries.length === 0) {
186
+ console.log('No installed skills.');
187
+ return;
188
+ }
189
+ for (const [slug, entry] of entries) {
190
+ console.log(`${slug} ${entry.version ?? 'latest'}`);
191
+ }
192
+ }
193
+ export async function cmdExplore(opts, options = {}) {
194
+ const registry = await getRegistry(opts, { cache: true });
195
+ const spinner = createSpinner('Fetching latest skills');
196
+ try {
197
+ const url = new URL(ApiRoutes.skills, registry);
198
+ const boundedLimit = clampLimit(options.limit ?? 25);
199
+ const { apiSort } = resolveExploreSort(options.sort);
200
+ url.searchParams.set('limit', String(boundedLimit));
201
+ if (apiSort !== 'updated')
202
+ url.searchParams.set('sort', apiSort);
203
+ const result = await apiRequest(registry, { method: 'GET', url: url.toString() }, ApiV1SkillListResponseSchema);
204
+ spinner.stop();
205
+ if (options.json) {
206
+ console.log(JSON.stringify(result, null, 2));
207
+ return;
208
+ }
209
+ if (result.items.length === 0) {
210
+ console.log('No skills found.');
211
+ return;
212
+ }
213
+ for (const item of result.items) {
214
+ console.log(formatExploreLine(item));
215
+ }
216
+ }
217
+ catch (error) {
218
+ spinner.fail(formatError(error));
219
+ throw error;
220
+ }
221
+ }
222
+ export function formatExploreLine(item) {
223
+ const version = item.latestVersion?.version ?? '?';
224
+ const age = formatRelativeTime(item.updatedAt);
225
+ const summary = item.summary ? ` ${truncate(item.summary, 50)}` : '';
226
+ return `${item.slug} v${version} ${age}${summary}`;
227
+ }
228
+ export function clampLimit(limit, fallback = 25) {
229
+ if (!Number.isFinite(limit))
230
+ return fallback;
231
+ return Math.min(Math.max(1, limit), 200);
232
+ }
233
+ function formatRelativeTime(timestamp) {
234
+ const now = Date.now();
235
+ const diff = now - timestamp;
236
+ const seconds = Math.floor(diff / 1000);
237
+ const minutes = Math.floor(seconds / 60);
238
+ const hours = Math.floor(minutes / 60);
239
+ const days = Math.floor(hours / 24);
240
+ if (days > 30) {
241
+ const months = Math.floor(days / 30);
242
+ return `${months}mo ago`;
243
+ }
244
+ if (days > 0)
245
+ return `${days}d ago`;
246
+ if (hours > 0)
247
+ return `${hours}h ago`;
248
+ if (minutes > 0)
249
+ return `${minutes}m ago`;
250
+ return 'just now';
251
+ }
252
+ function truncate(str, maxLen) {
253
+ if (str.length <= maxLen)
254
+ return str;
255
+ return `${str.slice(0, maxLen - 1)}…`;
256
+ }
257
+ function resolveExploreSort(raw) {
258
+ const normalized = raw?.trim().toLowerCase();
259
+ if (!normalized || normalized === 'newest' || normalized === 'updated') {
260
+ return { sort: 'newest', apiSort: 'updated' };
261
+ }
262
+ if (normalized === 'downloads' || normalized === 'download') {
263
+ return { sort: 'downloads', apiSort: 'downloads' };
264
+ }
265
+ if (normalized === 'rating' || normalized === 'stars' || normalized === 'star') {
266
+ return { sort: 'rating', apiSort: 'stars' };
267
+ }
268
+ if (normalized === 'installs' ||
269
+ normalized === 'install' ||
270
+ normalized === 'installscurrent' ||
271
+ normalized === 'installs-current' ||
272
+ normalized === 'current') {
273
+ return { sort: 'installs', apiSort: 'installsCurrent' };
274
+ }
275
+ if (normalized === 'installsalltime' || normalized === 'installs-all-time') {
276
+ return { sort: 'installsAllTime', apiSort: 'installsAllTime' };
277
+ }
278
+ if (normalized === 'trending') {
279
+ return { sort: 'trending', apiSort: 'trending' };
280
+ }
281
+ fail(`Invalid sort "${raw}". Use newest, downloads, rating, installs, installsAllTime, or trending.`);
282
+ }
283
+ async function resolveSkillVersion(registry, slug, hash) {
284
+ const url = new URL(ApiRoutes.resolve, registry);
285
+ url.searchParams.set('slug', slug);
286
+ url.searchParams.set('hash', hash);
287
+ return apiRequest(registry, { method: 'GET', url: url.toString() }, ApiV1SkillResolveResponseSchema);
288
+ }
289
+ async function fileExists(path) {
290
+ try {
291
+ await stat(path);
292
+ return true;
293
+ }
294
+ catch {
295
+ return false;
296
+ }
297
+ }
298
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,156 @@
1
+ /* @vitest-environment node */
2
+ import { afterEach, describe, expect, it, vi } from 'vitest';
3
+ import { ApiRoutes } from '../../schema/index.js';
4
+ const mockApiRequest = vi.fn();
5
+ const mockDownloadZip = vi.fn();
6
+ vi.mock('../../http.js', () => ({
7
+ apiRequest: (...args) => mockApiRequest(...args),
8
+ downloadZip: (...args) => mockDownloadZip(...args),
9
+ }));
10
+ const mockGetRegistry = vi.fn(async () => 'https://pilothub.com');
11
+ vi.mock('../registry.js', () => ({
12
+ getRegistry: () => mockGetRegistry(),
13
+ }));
14
+ const mockSpinner = {
15
+ stop: vi.fn(),
16
+ fail: vi.fn(),
17
+ start: vi.fn(),
18
+ succeed: vi.fn(),
19
+ isSpinning: false,
20
+ text: '',
21
+ };
22
+ vi.mock('../ui.js', () => ({
23
+ createSpinner: vi.fn(() => mockSpinner),
24
+ fail: (message) => {
25
+ throw new Error(message);
26
+ },
27
+ formatError: (error) => (error instanceof Error ? error.message : String(error)),
28
+ isInteractive: () => false,
29
+ promptConfirm: vi.fn(async () => false),
30
+ }));
31
+ vi.mock('../../skills.js', () => ({
32
+ extractZipToDir: vi.fn(),
33
+ hashSkillFiles: vi.fn(),
34
+ listTextFiles: vi.fn(),
35
+ readLockfile: vi.fn(),
36
+ readSkillOrigin: vi.fn(),
37
+ writeLockfile: vi.fn(),
38
+ writeSkillOrigin: vi.fn(),
39
+ }));
40
+ vi.mock('node:fs/promises', () => ({
41
+ mkdir: vi.fn(),
42
+ rm: vi.fn(),
43
+ stat: vi.fn(),
44
+ }));
45
+ const { clampLimit, cmdExplore, cmdUpdate, formatExploreLine } = await import('./skills.js');
46
+ const { extractZipToDir, hashSkillFiles, listTextFiles, readLockfile, readSkillOrigin, writeLockfile, writeSkillOrigin, } = await import('../../skills.js');
47
+ const { rm, stat } = await import('node:fs/promises');
48
+ const mockLog = vi.spyOn(console, 'log').mockImplementation(() => { });
49
+ function makeOpts() {
50
+ return {
51
+ workdir: '/work',
52
+ dir: '/work/skills',
53
+ site: 'https://pilothub.com',
54
+ registry: 'https://pilothub.com',
55
+ registrySource: 'default',
56
+ };
57
+ }
58
+ afterEach(() => {
59
+ vi.clearAllMocks();
60
+ });
61
+ describe('explore helpers', () => {
62
+ it('clamps explore limits and handles non-finite values', () => {
63
+ expect(clampLimit(-5)).toBe(1);
64
+ expect(clampLimit(0)).toBe(1);
65
+ expect(clampLimit(1)).toBe(1);
66
+ expect(clampLimit(50)).toBe(50);
67
+ expect(clampLimit(99)).toBe(99);
68
+ expect(clampLimit(200)).toBe(200);
69
+ expect(clampLimit(250)).toBe(200);
70
+ expect(clampLimit(Number.NaN)).toBe(25);
71
+ expect(clampLimit(Number.POSITIVE_INFINITY)).toBe(25);
72
+ expect(clampLimit(Number.NaN, 10)).toBe(10);
73
+ });
74
+ it('formats explore lines with relative time and truncation', () => {
75
+ const now = 4 * 60 * 60 * 1000;
76
+ const nowSpy = vi.spyOn(Date, 'now').mockReturnValue(now);
77
+ const summary = 'a'.repeat(60);
78
+ const line = formatExploreLine({
79
+ slug: 'weather',
80
+ summary,
81
+ updatedAt: now - 2 * 60 * 60 * 1000,
82
+ latestVersion: null,
83
+ });
84
+ expect(line).toBe(`weather v? 2h ago ${'a'.repeat(49)}…`);
85
+ nowSpy.mockRestore();
86
+ });
87
+ });
88
+ describe('cmdExplore', () => {
89
+ it('clamps limit and handles empty results', async () => {
90
+ mockApiRequest.mockResolvedValue({ items: [] });
91
+ await cmdExplore(makeOpts(), { limit: 0 });
92
+ const [, args] = mockApiRequest.mock.calls[0] ?? [];
93
+ const url = new URL(String(args?.url));
94
+ expect(url.searchParams.get('limit')).toBe('1');
95
+ expect(mockLog).toHaveBeenCalledWith('No skills found.');
96
+ });
97
+ it('prints formatted results', async () => {
98
+ const now = 10 * 60 * 1000;
99
+ const nowSpy = vi.spyOn(Date, 'now').mockReturnValue(now);
100
+ const item = {
101
+ slug: 'gog',
102
+ summary: 'Google Workspace CLI for Gmail, Calendar, Drive and more.',
103
+ updatedAt: now - 90 * 1000,
104
+ latestVersion: { version: '1.2.3' },
105
+ };
106
+ mockApiRequest.mockResolvedValue({ items: [item] });
107
+ await cmdExplore(makeOpts(), { limit: 250 });
108
+ const [, args] = mockApiRequest.mock.calls[0] ?? [];
109
+ const url = new URL(String(args?.url));
110
+ expect(url.searchParams.get('limit')).toBe('200');
111
+ expect(mockLog).toHaveBeenCalledWith(formatExploreLine(item));
112
+ nowSpy.mockRestore();
113
+ });
114
+ it('supports sort and json output', async () => {
115
+ const payload = { items: [], nextCursor: null };
116
+ mockApiRequest.mockResolvedValue(payload);
117
+ await cmdExplore(makeOpts(), { limit: 10, sort: 'installs', json: true });
118
+ const [, args] = mockApiRequest.mock.calls[0] ?? [];
119
+ const url = new URL(String(args?.url));
120
+ expect(url.searchParams.get('limit')).toBe('10');
121
+ expect(url.searchParams.get('sort')).toBe('installsCurrent');
122
+ expect(mockLog).toHaveBeenCalledWith(JSON.stringify(payload, null, 2));
123
+ });
124
+ it('supports all-time installs and trending sorts', async () => {
125
+ mockApiRequest.mockResolvedValue({ items: [], nextCursor: null });
126
+ await cmdExplore(makeOpts(), { limit: 5, sort: 'installsAllTime' });
127
+ await cmdExplore(makeOpts(), { limit: 5, sort: 'trending' });
128
+ const first = new URL(String(mockApiRequest.mock.calls[0]?.[1]?.url));
129
+ const second = new URL(String(mockApiRequest.mock.calls[1]?.[1]?.url));
130
+ expect(first.searchParams.get('sort')).toBe('installsAllTime');
131
+ expect(second.searchParams.get('sort')).toBe('trending');
132
+ });
133
+ });
134
+ describe('cmdUpdate', () => {
135
+ it('uses path-based skill lookup when no local fingerprint is available', async () => {
136
+ mockApiRequest.mockResolvedValue({ latestVersion: { version: '1.0.0' } });
137
+ mockDownloadZip.mockResolvedValue(new Uint8Array([1, 2, 3]));
138
+ vi.mocked(readLockfile).mockResolvedValue({
139
+ version: 1,
140
+ skills: { demo: { version: '0.1.0', installedAt: 123 } },
141
+ });
142
+ vi.mocked(writeLockfile).mockResolvedValue();
143
+ vi.mocked(readSkillOrigin).mockResolvedValue(null);
144
+ vi.mocked(writeSkillOrigin).mockResolvedValue();
145
+ vi.mocked(extractZipToDir).mockResolvedValue();
146
+ vi.mocked(listTextFiles).mockResolvedValue([]);
147
+ vi.mocked(hashSkillFiles).mockReturnValue({ fingerprint: 'hash', files: [] });
148
+ vi.mocked(stat).mockRejectedValue(new Error('missing'));
149
+ vi.mocked(rm).mockResolvedValue();
150
+ await cmdUpdate(makeOpts(), 'demo', {}, false);
151
+ const [, args] = mockApiRequest.mock.calls[0] ?? [];
152
+ expect(args?.path).toBe(`${ApiRoutes.skills}/${encodeURIComponent('demo')}`);
153
+ expect(args?.url).toBeUndefined();
154
+ });
155
+ });
156
+ //# sourceMappingURL=skills.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.test.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { GlobalOpts } from '../types.js';
2
+ export declare function cmdStarSkill(opts: GlobalOpts, slugArg: string, options: {
3
+ yes?: boolean;
4
+ }, inputAllowed: boolean): Promise<{
5
+ ok: true;
6
+ starred: boolean;
7
+ alreadyStarred: boolean;
8
+ } | undefined>;
@@ -0,0 +1,38 @@
1
+ import { readGlobalConfig } from '../../config.js';
2
+ import { apiRequest } from '../../http.js';
3
+ import { ApiRoutes, ApiV1StarResponseSchema } from '../../schema/index.js';
4
+ import { getRegistry } from '../registry.js';
5
+ import { createSpinner, fail, formatError, isInteractive, promptConfirm } from '../ui.js';
6
+ async function requireToken() {
7
+ const cfg = await readGlobalConfig();
8
+ const token = cfg?.token;
9
+ if (!token)
10
+ fail('Not logged in. Run: pilothub login');
11
+ return token;
12
+ }
13
+ export async function cmdStarSkill(opts, slugArg, options, inputAllowed) {
14
+ const slug = slugArg.trim().toLowerCase();
15
+ if (!slug)
16
+ fail('Slug required');
17
+ const allowPrompt = isInteractive() && inputAllowed !== false;
18
+ if (!options.yes) {
19
+ if (!allowPrompt)
20
+ fail('Pass --yes (no input)');
21
+ const ok = await promptConfirm(`Star ${slug}?`);
22
+ if (!ok)
23
+ return;
24
+ }
25
+ const token = await requireToken();
26
+ const registry = await getRegistry(opts, { cache: true });
27
+ const spinner = createSpinner(`Starring ${slug}`);
28
+ try {
29
+ const result = await apiRequest(registry, { method: 'POST', path: `${ApiRoutes.stars}/${encodeURIComponent(slug)}`, token }, ApiV1StarResponseSchema);
30
+ spinner.succeed(result.alreadyStarred ? `OK. ${slug} already starred.` : `OK. Starred ${slug}`);
31
+ return result;
32
+ }
33
+ catch (error) {
34
+ spinner.fail(formatError(error));
35
+ throw error;
36
+ }
37
+ }
38
+ //# sourceMappingURL=star.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star.js","sourceRoot":"","sources":["../../../src/cli/commands/star.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAEzF,KAAK,UAAU,YAAY;IACzB,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACpC,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,CAAA;IACxB,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,oCAAoC,CAAC,CAAA;IACtD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,OAAe,EACf,OAA0B,EAC1B,YAAqB;IAErB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACzC,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,eAAe,CAAC,CAAA;IAChC,MAAM,WAAW,GAAG,aAAa,EAAE,IAAI,YAAY,KAAK,KAAK,CAAA;IAE7D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC/C,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAA;QAC/C,IAAI,CAAC,EAAE;YAAE,OAAM;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAA;IAClC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,QAAQ,EACR,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EACjF,uBAAuB,CACxB,CAAA;QACD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAAA;QAC/F,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;QAChC,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { GlobalOpts } from '../types.js';
2
+ import type { SyncOptions } from './syncTypes.js';
3
+ export declare function cmdSync(opts: GlobalOpts, options: SyncOptions, inputAllowed: boolean): Promise<void>;