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
package/LICENSE CHANGED
@@ -19,3 +19,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
22
+
package/README.md CHANGED
@@ -1,150 +1,57 @@
1
- # PilotHub
1
+ # `pilothub`
2
2
 
3
- <p align="center">
4
- <a href="https://github.com/pilotbot/pilothub/actions/workflows/ci.yml?branch=main"><img src="https://img.shields.io/github/actions/workflow/status/pilotbot/pilothub/ci.yml?branch=main&style=for-the-badge" alt="CI status"></a>
5
- <a href="https://discord.gg/pilot"><img src="https://img.shields.io/discord/1456350064065904867?label=Discord&logo=discord&logoColor=white&color=5865F2&style=for-the-badge" alt="Discord"></a>
6
- <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
7
- </p>
3
+ PilotHub CLI — install, update, search, and publish agent skills as folders.
8
4
 
9
- PilotHub is the **public skill registry for Pilotbot**: publish, version, and search text-based agent skills (a `SKILL.md` plus supporting files).
10
- It’s designed for fast browsing + a CLI-friendly API, with moderation hooks and vector search.
11
-
12
- onlycrabs.ai is the **SOUL.md registry**: publish and share system lore the same way you publish skills.
13
-
14
- Live: `https://pilothub.com`
15
- onlycrabs.ai: `https://onlycrabs.ai`
16
-
17
- ## What you can do
18
-
19
- - Browse skills + render their `SKILL.md`.
20
- - Publish new skill versions with changelogs + tags (including `latest`).
21
- - Browse souls + render their `SOUL.md`.
22
- - Publish new soul versions with changelogs + tags.
23
- - Search via embeddings (vector index) instead of brittle keywords.
24
- - Star + comment; admins/mods can curate and approve skills.
25
-
26
- ## onlycrabs.ai (SOUL.md registry)
27
-
28
- - Entry point is host-based: `onlycrabs.ai`.
29
- - On the onlycrabs.ai host, the home page and nav default to souls.
30
- - On PilotHub, souls live under `/souls`.
31
- - Soul bundles only accept `SOUL.md` for now (no extra files).
32
-
33
- ## How it works (high level)
34
-
35
- - Web app: TanStack Start (React, Vite/Nitro).
36
- - Backend: Convex (DB + file storage + HTTP actions) + Convex Auth (GitHub OAuth).
37
- - Search: OpenAI embeddings (`text-embedding-3-small`) + Convex vector search.
38
- - API schema + routes: `packages/schema` (`pilothub-schema`).
39
-
40
- ## Telemetry
41
-
42
- PilotHub tracks minimal **install telemetry** (to compute install counts) when you run `pilothub sync` while logged in.
43
- Disable via:
44
-
45
- ```bash
46
- export PILOTHUB_DISABLE_TELEMETRY=1
47
- ```
48
-
49
- Details: `docs/telemetry.md`.
50
-
51
- ## Repo layout
52
-
53
- - `src/` — TanStack Start app (routes, components, styles).
54
- - `convex/` — schema + queries/mutations/actions + HTTP API routes.
55
- - `packages/schema/` — shared API types/routes for the CLI and app.
56
- - `docs/spec.md` — product + implementation spec (good first read).
57
-
58
- ## Local dev
59
-
60
- Prereqs: Bun + Convex CLI.
5
+ ## Install
61
6
 
62
7
  ```bash
63
- bun install
64
- cp .env.local.example .env.local
65
-
66
- # terminal A: web app
67
- bun run dev
8
+ # From this repo (shortcut script at repo root)
9
+ bun pilothub --help
68
10
 
69
- # terminal B: Convex dev deployment
70
- bunx convex dev
11
+ # Once published to npm
12
+ # npm i -g pilothub
71
13
  ```
72
14
 
73
- ## Auth (GitHub OAuth) setup
74
-
75
- Create a GitHub OAuth App, set `AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`, then:
15
+ ## Auth (publish)
76
16
 
77
17
  ```bash
78
- bunx auth --deployment-name <deployment> --web-server-url http://localhost:3000
79
- ```
80
-
81
- This writes `JWT_PRIVATE_KEY` + `JWKS` to the deployment and prints values for your local `.env.local`.
82
-
83
- ## Environment
84
-
85
- - `VITE_CONVEX_URL`: Convex deployment URL (`https://<deployment>.convex.cloud`).
86
- - `VITE_CONVEX_SITE_URL`: Convex site URL (`https://<deployment>.convex.site`).
87
- - `VITE_SOULHUB_SITE_URL`: onlycrabs.ai site URL (`https://onlycrabs.ai`).
88
- - `VITE_SOULHUB_HOST`: onlycrabs.ai host match (`onlycrabs.ai`).
89
- - `VITE_SITE_MODE`: Optional override (`skills` or `souls`) for SSR builds.
90
- - `CONVEX_SITE_URL`: same as `VITE_CONVEX_SITE_URL` (auth + cookies).
91
- - `SITE_URL`: App URL (local: `http://localhost:3000`).
92
- - `AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`: GitHub OAuth App.
93
- - `JWT_PRIVATE_KEY` / `JWKS`: Convex Auth keys.
94
- - `OPENAI_API_KEY`: embeddings for search + indexing.
95
-
96
- ## Nix plugins (nixmode skills)
97
-
98
- PilotHub can store a nix-pilotbot plugin pointer in SKILL frontmatter so the registry knows which
99
- Nix package bundle to install. A nix plugin is different from a regular skill pack: it bundles the
100
- skill pack, the CLI binary, and its config flags/requirements together.
18
+ pilothub login
19
+ # or
20
+ pilothub auth login
101
21
 
102
- Add this to `SKILL.md`:
103
-
104
- ```yaml
105
- ---
106
- name: peekaboo
107
- description: Capture and automate macOS UI with the Peekaboo CLI.
108
- metadata: {"pilotbot":{"nix":{"plugin":"github:pilotbot/nix-steipete-tools?dir=tools/peekaboo","systems":["aarch64-darwin"]}}}
109
- ---
22
+ # Headless / token paste
23
+ # or (token paste / headless)
24
+ pilothub login --token clh_...
110
25
  ```
111
26
 
112
- Install via nix-pilotbot:
27
+ Notes:
113
28
 
114
- ```nix
115
- programs.pilotbot.plugins = [
116
- { source = "github:pilotbot/nix-steipete-tools?dir=tools/peekaboo"; }
117
- ];
118
- ```
29
+ - Browser login opens `https://pilothub.com/cli/auth` and completes via a loopback callback.
30
+ - Token stored in `~/Library/Application Support/pilothub/config.json` on macOS (override via `PILOTHUB_CONFIG_PATH`).
119
31
 
120
- You can also declare config requirements + an example snippet:
32
+ ## Examples
121
33
 
122
- ```yaml
123
- ---
124
- name: padel
125
- description: Check padel court availability and manage bookings via Playtomic.
126
- metadata: {"pilotbot":{"config":{"requiredEnv":["PADEL_AUTH_FILE"],"stateDirs":[".config/padel"],"example":"config = { env = { PADEL_AUTH_FILE = \\\"/run/agenix/padel-auth\\\"; }; };"}}}
127
- ---
34
+ ```bash
35
+ pilothub search "postgres backups"
36
+ pilothub install my-skill-pack
37
+ pilothub update --all
38
+ pilothub update --all --no-input --force
39
+ pilothub publish ./my-skill-pack --slug my-skill-pack --name "My Skill Pack" --version 1.2.0 --changelog "Fixes + docs"
128
40
  ```
129
41
 
130
- To show CLI help (recommended for nix plugins), include the `cli --help` output:
42
+ ## Sync (upload local skills)
131
43
 
132
- ```yaml
133
- ---
134
- name: padel
135
- description: Check padel court availability and manage bookings via Playtomic.
136
- metadata: {"pilotbot":{"cliHelp":"padel --help\\nUsage: padel [command]\\n"}}
137
- ---
138
- ```
44
+ ```bash
45
+ # Start anywhere; scans workdir first, then legacy Pilotbot/Pilot locations.
46
+ pilothub sync
139
47
 
140
- `metadata.pilotbot` is preferred, but `metadata.pilotbot` is accepted as an alias for compatibility.
48
+ # Explicit roots + non-interactive dry-run
49
+ pilothub sync --root ../pilotbot/skills --all --dry-run
50
+ ```
141
51
 
142
- ## Scripts
52
+ ## Defaults
143
53
 
144
- ```bash
145
- bun run dev
146
- bun run build
147
- bun run test
148
- bun run coverage
149
- bun run lint
150
- ```
54
+ - Site: `https://pilothub.com` (override via `--site` or `PILOTHUB_SITE`)
55
+ - Registry: discovered from `/.well-known/pilothub.json` on the site (override via `--registry` or `PILOTHUB_REGISTRY`)
56
+ - Workdir: current directory (falls back to Pilotbot workspace if configured; override via `--workdir` or `PILOTHUB_WORKDIR`)
57
+ - Install dir: `./skills` under workdir (override via `--dir`)
@@ -0,0 +1,20 @@
1
+ export type LoopbackAuthResult = {
2
+ token: string;
3
+ registry?: string;
4
+ state?: string;
5
+ };
6
+ export declare function buildCliAuthUrl(params: {
7
+ siteUrl: string;
8
+ redirectUri: string;
9
+ label?: string;
10
+ state: string;
11
+ }): string;
12
+ export declare function isAllowedLoopbackRedirectUri(value: string): boolean;
13
+ export declare function startLoopbackAuthServer(params?: {
14
+ timeoutMs?: number;
15
+ }): Promise<{
16
+ redirectUri: string;
17
+ state: string;
18
+ waitForResult: () => Promise<LoopbackAuthResult>;
19
+ close: () => import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
20
+ }>;
@@ -0,0 +1,156 @@
1
+ import { createServer } from 'node:http';
2
+ export function buildCliAuthUrl(params) {
3
+ const url = new URL('/cli/auth', params.siteUrl);
4
+ url.searchParams.set('redirect_uri', params.redirectUri);
5
+ if (params.label)
6
+ url.searchParams.set('label_b64', encodeBase64Url(params.label));
7
+ url.searchParams.set('state', params.state);
8
+ return url.toString();
9
+ }
10
+ export function isAllowedLoopbackRedirectUri(value) {
11
+ let url;
12
+ try {
13
+ url = new URL(value);
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ if (url.protocol !== 'http:')
19
+ return false;
20
+ const host = url.hostname.toLowerCase();
21
+ if (host !== '127.0.0.1' && host !== 'localhost' && host !== '::1' && host !== '[::1]') {
22
+ return false;
23
+ }
24
+ return true;
25
+ }
26
+ export async function startLoopbackAuthServer(params) {
27
+ const timeoutMs = params?.timeoutMs ?? 5 * 60_000;
28
+ const expectedState = generateState();
29
+ let resolveToken = null;
30
+ let rejectToken = null;
31
+ const tokenPromise = new Promise((resolve, reject) => {
32
+ resolveToken = resolve;
33
+ rejectToken = reject;
34
+ });
35
+ const server = createServer((req, res) => {
36
+ const method = req.method ?? 'GET';
37
+ const url = req.url ?? '/';
38
+ if (method === 'GET' && (url === '/' || url.startsWith('/callback'))) {
39
+ res.statusCode = 200;
40
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
41
+ res.end(CALLBACK_HTML);
42
+ return;
43
+ }
44
+ if (method === 'POST' && url === '/token') {
45
+ const chunks = [];
46
+ req.on('data', (chunk) => chunks.push(chunk));
47
+ req.on('end', () => {
48
+ try {
49
+ const raw = Buffer.concat(chunks).toString('utf8');
50
+ const parsed = JSON.parse(raw);
51
+ if (!parsed || typeof parsed !== 'object')
52
+ throw new Error('invalid payload');
53
+ const token = parsed.token;
54
+ const registry = parsed.registry;
55
+ const state = parsed.state;
56
+ if (typeof token !== 'string' || !token.trim())
57
+ throw new Error('token required');
58
+ if (typeof state !== 'string' || state !== expectedState) {
59
+ throw new Error('state mismatch');
60
+ }
61
+ res.statusCode = 200;
62
+ res.setHeader('Content-Type', 'application/json');
63
+ res.end(JSON.stringify({ ok: true }));
64
+ resolveToken?.({
65
+ token: token.trim(),
66
+ registry: typeof registry === 'string' ? registry : undefined,
67
+ state,
68
+ });
69
+ }
70
+ catch (error) {
71
+ res.statusCode = 400;
72
+ res.setHeader('Content-Type', 'application/json');
73
+ res.end(JSON.stringify({ ok: false }));
74
+ const message = error instanceof Error ? error.message : 'invalid payload';
75
+ rejectToken?.(new Error(message));
76
+ }
77
+ finally {
78
+ server.close();
79
+ }
80
+ });
81
+ return;
82
+ }
83
+ res.statusCode = 404;
84
+ res.setHeader('Content-Type', 'text/plain; charset=utf-8');
85
+ res.end('Not found');
86
+ });
87
+ await new Promise((resolve, reject) => {
88
+ server.once('error', reject);
89
+ server.listen(0, '127.0.0.1', () => resolve());
90
+ });
91
+ const address = server.address();
92
+ if (!address) {
93
+ server.close();
94
+ throw new Error('Failed to bind loopback server');
95
+ }
96
+ const redirectUri = `http://127.0.0.1:${address.port}/callback`;
97
+ const timeout = setTimeout(() => {
98
+ server.close();
99
+ rejectToken?.(new Error('Timed out waiting for browser login'));
100
+ }, timeoutMs);
101
+ tokenPromise.finally(() => clearTimeout(timeout)).catch(() => { });
102
+ return {
103
+ redirectUri,
104
+ state: expectedState,
105
+ waitForResult: () => tokenPromise,
106
+ close: () => server.close(),
107
+ };
108
+ }
109
+ const CALLBACK_HTML = `<!doctype html>
110
+ <html lang="en">
111
+ <meta charset="utf-8" />
112
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
113
+ <title>PilotHub CLI Login</title>
114
+ <style>
115
+ :root { color-scheme: light dark; }
116
+ body { font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif; padding: 24px; }
117
+ .card { max-width: 560px; margin: 40px auto; padding: 18px 16px; border: 1px solid rgba(127,127,127,.35); border-radius: 12px; }
118
+ code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
119
+ </style>
120
+ <body>
121
+ <div class="card">
122
+ <h1 style="margin: 0 0 10px; font-size: 18px;">Completing login…</h1>
123
+ <p id="status" style="margin: 0; opacity: .8;">Waiting for token.</p>
124
+ </div>
125
+ <script>
126
+ const statusEl = document.getElementById('status')
127
+ const params = new URLSearchParams(location.hash.replace(/^#/, ''))
128
+ const token = params.get('token')
129
+ const registry = params.get('registry')
130
+ const state = params.get('state')
131
+ if (!token) {
132
+ statusEl.textContent = 'Missing token in URL. You can close this tab and try again.'
133
+ } else if (!state) {
134
+ statusEl.textContent = 'Missing state in URL. You can close this tab and try again.'
135
+ } else {
136
+ fetch('/token', {
137
+ method: 'POST',
138
+ headers: { 'Content-Type': 'application/json' },
139
+ body: JSON.stringify({ token, registry, state }),
140
+ }).then(() => {
141
+ statusEl.textContent = 'Logged in. You can close this tab.'
142
+ setTimeout(() => window.close(), 250)
143
+ }).catch(() => {
144
+ statusEl.textContent = 'Failed to send token to CLI. You can close this tab and try again.'
145
+ })
146
+ }
147
+ </script>
148
+ </body>
149
+ </html>`;
150
+ function encodeBase64Url(value) {
151
+ return Buffer.from(value, 'utf8').toString('base64url');
152
+ }
153
+ function generateState() {
154
+ return Buffer.from(crypto.getRandomValues(new Uint8Array(16))).toString('hex');
155
+ }
156
+ //# sourceMappingURL=browserAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserAuth.js","sourceRoot":"","sources":["../src/browserAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,83 @@
1
+ /* @vitest-environment node */
2
+ import { describe, expect, it } from 'vitest';
3
+ import { buildCliAuthUrl, isAllowedLoopbackRedirectUri, startLoopbackAuthServer, } from './browserAuth';
4
+ describe('browserAuth', () => {
5
+ it('builds auth url', () => {
6
+ const url = buildCliAuthUrl({
7
+ siteUrl: 'https://example.com',
8
+ redirectUri: 'http://127.0.0.1:1234/callback',
9
+ label: 'CLI token',
10
+ state: 'state123',
11
+ });
12
+ expect(url).toContain('https://example.com/cli/auth?');
13
+ expect(url).toContain('redirect_uri=');
14
+ expect(url).toContain('label_b64=');
15
+ expect(url).toContain('state=');
16
+ });
17
+ it('builds auth url without label', () => {
18
+ const url = buildCliAuthUrl({
19
+ siteUrl: 'https://example.com',
20
+ redirectUri: 'http://127.0.0.1:1234/callback',
21
+ state: 'state123',
22
+ });
23
+ expect(url).toContain('https://example.com/cli/auth?');
24
+ expect(url).not.toContain('label_b64=');
25
+ });
26
+ it('accepts only loopback http redirect uris', () => {
27
+ expect(isAllowedLoopbackRedirectUri('http://127.0.0.1:1234/callback')).toBe(true);
28
+ expect(isAllowedLoopbackRedirectUri('http://localhost:1234/callback')).toBe(true);
29
+ expect(isAllowedLoopbackRedirectUri('http://[::1]:1234/callback')).toBe(true);
30
+ expect(isAllowedLoopbackRedirectUri('https://127.0.0.1:1234/callback')).toBe(false);
31
+ expect(isAllowedLoopbackRedirectUri('http://evil.com/callback')).toBe(false);
32
+ expect(isAllowedLoopbackRedirectUri('not a url')).toBe(false);
33
+ });
34
+ it('receives token via loopback server', async () => {
35
+ const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
36
+ const payload = {
37
+ token: 'clh_test',
38
+ registry: 'https://example.convex.site',
39
+ state: server.state,
40
+ };
41
+ await fetch(server.redirectUri.replace('/callback', '/token'), {
42
+ method: 'POST',
43
+ headers: { 'Content-Type': 'application/json' },
44
+ body: JSON.stringify(payload),
45
+ });
46
+ await expect(server.waitForResult()).resolves.toEqual(payload);
47
+ });
48
+ it('serves callback html', async () => {
49
+ const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
50
+ const response = await fetch(server.redirectUri);
51
+ expect(response.status).toBe(200);
52
+ const text = await response.text();
53
+ expect(text).toContain('PilotHub CLI Login');
54
+ server.close();
55
+ });
56
+ it('returns 404 for unknown routes', async () => {
57
+ const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
58
+ const response = await fetch(server.redirectUri.replace('/callback', '/nope'));
59
+ expect(response.status).toBe(404);
60
+ server.close();
61
+ });
62
+ it('rejects invalid json payloads', async () => {
63
+ const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
64
+ const tokenUrl = server.redirectUri.replace('/callback', '/token');
65
+ const response = await fetch(tokenUrl, { method: 'POST', body: '{' });
66
+ expect(response.status).toBe(400);
67
+ await expect(server.waitForResult()).rejects.toThrow();
68
+ });
69
+ it('rejects state mismatches', async () => {
70
+ const server = await startLoopbackAuthServer({ timeoutMs: 2000 });
71
+ await fetch(server.redirectUri.replace('/callback', '/token'), {
72
+ method: 'POST',
73
+ headers: { 'Content-Type': 'application/json' },
74
+ body: JSON.stringify({ token: 'clh_test', registry: 'https://example.com', state: 'nope' }),
75
+ });
76
+ await expect(server.waitForResult()).rejects.toThrow(/state mismatch/i);
77
+ });
78
+ it('times out waiting for login', async () => {
79
+ const server = await startLoopbackAuthServer({ timeoutMs: 25 });
80
+ await expect(server.waitForResult()).rejects.toThrow(/timed out waiting for browser login/i);
81
+ });
82
+ });
83
+ //# sourceMappingURL=browserAuth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserAuth.test.js","sourceRoot":"","sources":["../src/browserAuth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function getCliCommit(): string | null;
2
+ export declare function getCliVersion(): string;
3
+ export declare function getCliBuildLabel(): string;
@@ -0,0 +1,103 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ function readPackageVersion() {
5
+ try {
6
+ const path = join(dirname(fileURLToPath(import.meta.url)), '../../package.json');
7
+ const raw = readFileSync(path, 'utf8');
8
+ const pkg = JSON.parse(raw);
9
+ return typeof pkg.version === 'string' ? pkg.version : '0.0.0';
10
+ }
11
+ catch {
12
+ return '0.0.0';
13
+ }
14
+ }
15
+ function shortCommit(value) {
16
+ const trimmed = value.trim();
17
+ if (!trimmed)
18
+ return null;
19
+ if (trimmed.length <= 8)
20
+ return trimmed;
21
+ return trimmed.slice(0, 8);
22
+ }
23
+ export function getCliCommit() {
24
+ const candidates = [
25
+ process.env.PILOTHUB_COMMIT,
26
+ process.env.VERCEL_GIT_COMMIT_SHA,
27
+ process.env.GITHUB_SHA,
28
+ process.env.COMMIT_SHA,
29
+ ];
30
+ for (const candidate of candidates) {
31
+ if (!candidate)
32
+ continue;
33
+ const short = shortCommit(candidate);
34
+ if (short)
35
+ return short;
36
+ }
37
+ return readGitCommitFromCwd();
38
+ }
39
+ export function getCliVersion() {
40
+ return readPackageVersion();
41
+ }
42
+ export function getCliBuildLabel() {
43
+ const version = getCliVersion();
44
+ const commit = getCliCommit();
45
+ return commit ? `v${version} (${commit})` : `v${version}`;
46
+ }
47
+ function readGitCommitFromCwd() {
48
+ try {
49
+ const gitDir = findGitDir(process.cwd());
50
+ if (!gitDir)
51
+ return null;
52
+ const headPath = join(gitDir, 'HEAD');
53
+ if (!existsSync(headPath))
54
+ return null;
55
+ const head = readFileSync(headPath, 'utf8').trim();
56
+ if (!head)
57
+ return null;
58
+ if (!head.startsWith('ref:'))
59
+ return shortCommit(head);
60
+ const ref = head.replace(/^ref:\s*/, '').trim();
61
+ if (!ref)
62
+ return null;
63
+ const refPath = join(gitDir, ref);
64
+ if (!existsSync(refPath))
65
+ return null;
66
+ const sha = readFileSync(refPath, 'utf8').trim();
67
+ return shortCommit(sha);
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ function findGitDir(start) {
74
+ let current = resolve(start);
75
+ for (;;) {
76
+ const dotGit = join(current, '.git');
77
+ if (existsSync(dotGit)) {
78
+ try {
79
+ const stat = statSync(dotGit);
80
+ if (stat.isDirectory())
81
+ return dotGit;
82
+ }
83
+ catch {
84
+ // ignore
85
+ }
86
+ try {
87
+ const content = readFileSync(dotGit, 'utf8').trim();
88
+ const match = content.match(/^gitdir:\s*(.+)$/);
89
+ if (match?.[1])
90
+ return resolve(current, match[1]);
91
+ }
92
+ catch {
93
+ return dotGit;
94
+ }
95
+ return dotGit;
96
+ }
97
+ const parent = resolve(current, '..');
98
+ if (parent === current)
99
+ return null;
100
+ current = parent;
101
+ }
102
+ }
103
+ //# sourceMappingURL=buildInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildInfo.js","sourceRoot":"","sources":["../../src/cli/buildInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { GlobalOpts } from '../types.js';
2
+ export declare function cmdLoginFlow(opts: GlobalOpts, options: {
3
+ token?: string;
4
+ label?: string;
5
+ browser?: boolean;
6
+ }, inputAllowed: boolean): Promise<void>;
7
+ export declare function cmdLogin(opts: GlobalOpts, tokenFlag: string | undefined, inputAllowed: boolean): Promise<void>;
8
+ export declare function cmdLogout(opts: GlobalOpts): Promise<void>;
9
+ export declare function cmdWhoami(opts: GlobalOpts): Promise<void>;