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/convex/tokens.ts DELETED
@@ -1,88 +0,0 @@
1
- import { v } from 'convex/values'
2
- import type { Doc } from './_generated/dataModel'
3
- import { internalMutation, internalQuery, mutation, query } from './_generated/server'
4
- import { requireUser } from './lib/access'
5
- import { generateToken, hashToken } from './lib/tokens'
6
-
7
- export const listMine = query({
8
- args: {},
9
- handler: async (ctx) => {
10
- const { userId } = await requireUser(ctx)
11
- const tokens = await ctx.db
12
- .query('apiTokens')
13
- .withIndex('by_user', (q) => q.eq('userId', userId))
14
- .order('desc')
15
- .take(100)
16
- return tokens.map((token) => ({
17
- _id: token._id,
18
- label: token.label,
19
- prefix: token.prefix,
20
- createdAt: token.createdAt,
21
- lastUsedAt: token.lastUsedAt,
22
- revokedAt: token.revokedAt,
23
- }))
24
- },
25
- })
26
-
27
- export const create = mutation({
28
- args: { label: v.string() },
29
- handler: async (ctx, args) => {
30
- const { userId } = await requireUser(ctx)
31
- const label = args.label.trim() || 'CLI token'
32
- const { token, prefix } = generateToken()
33
- const tokenHash = await hashToken(token)
34
-
35
- const now = Date.now()
36
- const tokenId = await ctx.db.insert('apiTokens', {
37
- userId,
38
- label,
39
- prefix,
40
- tokenHash,
41
- createdAt: now,
42
- lastUsedAt: undefined,
43
- revokedAt: undefined,
44
- })
45
-
46
- return { token, tokenId, label, prefix, createdAt: now }
47
- },
48
- })
49
-
50
- export const revoke = mutation({
51
- args: { tokenId: v.id('apiTokens') },
52
- handler: async (ctx, args) => {
53
- const { userId } = await requireUser(ctx)
54
- const token = await ctx.db.get(args.tokenId)
55
- if (!token) throw new Error('Token not found')
56
- if (token.userId !== userId) throw new Error('Forbidden')
57
- if (token.revokedAt) return
58
- await ctx.db.patch(token._id, { revokedAt: Date.now() })
59
- },
60
- })
61
-
62
- export const getByHashInternal = internalQuery({
63
- args: { tokenHash: v.string() },
64
- handler: async (ctx, args) => {
65
- return ctx.db
66
- .query('apiTokens')
67
- .withIndex('by_hash', (q) => q.eq('tokenHash', args.tokenHash))
68
- .unique()
69
- },
70
- })
71
-
72
- export const touchInternal = internalMutation({
73
- args: { tokenId: v.id('apiTokens') },
74
- handler: async (ctx, args) => {
75
- const token = await ctx.db.get(args.tokenId)
76
- if (!token || token.revokedAt) return
77
- await ctx.db.patch(token._id, { lastUsedAt: Date.now() })
78
- },
79
- })
80
-
81
- export const getUserForTokenInternal = internalQuery({
82
- args: { tokenId: v.id('apiTokens') },
83
- handler: async (ctx, args): Promise<Doc<'users'> | null> => {
84
- const token = await ctx.db.get(args.tokenId)
85
- if (!token || token.revokedAt) return null
86
- return ctx.db.get(token.userId)
87
- },
88
- })
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "../tsconfig.json",
3
- "compilerOptions": {
4
- "moduleResolution": "Bundler",
5
- "skipLibCheck": true
6
- }
7
- }
package/convex/uploads.ts DELETED
@@ -1,20 +0,0 @@
1
- import { v } from 'convex/values'
2
- import { internalMutation, mutation } from './_generated/server'
3
- import { requireUser } from './lib/access'
4
-
5
- export const generateUploadUrl = mutation({
6
- args: {},
7
- handler: async (ctx) => {
8
- await requireUser(ctx)
9
- return ctx.storage.generateUploadUrl()
10
- },
11
- })
12
-
13
- export const generateUploadUrlForUserInternal = internalMutation({
14
- args: { userId: v.id('users') },
15
- handler: async (ctx, args) => {
16
- const user = await ctx.db.get(args.userId)
17
- if (!user || user.deletedAt) throw new Error('User not found')
18
- return ctx.storage.generateUploadUrl()
19
- },
20
- })
package/convex/users.ts DELETED
@@ -1,122 +0,0 @@
1
- import { getAuthUserId } from '@convex-dev/auth/server'
2
- import { v } from 'convex/values'
3
- import { internal } from './_generated/api'
4
- import { internalQuery, mutation, query } from './_generated/server'
5
- import { assertAdmin, requireUser } from './lib/access'
6
- import { toPublicUser } from './lib/public'
7
-
8
- const DEFAULT_ROLE = 'user'
9
- const ADMIN_HANDLE = 'steipete'
10
-
11
- export const getById = query({
12
- args: { userId: v.id('users') },
13
- handler: async (ctx, args) => toPublicUser(await ctx.db.get(args.userId)),
14
- })
15
-
16
- export const getByIdInternal = internalQuery({
17
- args: { userId: v.id('users') },
18
- handler: async (ctx, args) => ctx.db.get(args.userId),
19
- })
20
-
21
- export const me = query({
22
- args: {},
23
- handler: async (ctx) => {
24
- const userId = await getAuthUserId(ctx)
25
- if (!userId) return null
26
- const user = await ctx.db.get(userId)
27
- if (!user || user.deletedAt) return null
28
- return user
29
- },
30
- })
31
-
32
- export const ensure = mutation({
33
- args: {},
34
- handler: async (ctx) => {
35
- const { userId, user } = await requireUser(ctx)
36
- const now = Date.now()
37
- const updates: Record<string, unknown> = {}
38
-
39
- const handle = user.handle ?? user.name ?? user.email?.split('@')[0]
40
- if (!user.handle && handle) updates.handle = handle
41
- if (!user.displayName) updates.displayName = handle
42
- if (!user.role) {
43
- updates.role = handle === ADMIN_HANDLE ? 'admin' : DEFAULT_ROLE
44
- }
45
- if (!user.createdAt) updates.createdAt = user._creationTime
46
- updates.updatedAt = now
47
-
48
- if (Object.keys(updates).length > 0) {
49
- await ctx.db.patch(userId, updates)
50
- }
51
-
52
- return ctx.db.get(userId)
53
- },
54
- })
55
-
56
- export const updateProfile = mutation({
57
- args: {
58
- displayName: v.string(),
59
- bio: v.optional(v.string()),
60
- },
61
- handler: async (ctx, args) => {
62
- const { userId } = await requireUser(ctx)
63
- await ctx.db.patch(userId, {
64
- displayName: args.displayName.trim(),
65
- bio: args.bio?.trim(),
66
- updatedAt: Date.now(),
67
- })
68
- },
69
- })
70
-
71
- export const deleteAccount = mutation({
72
- args: {},
73
- handler: async (ctx) => {
74
- const { userId } = await requireUser(ctx)
75
- await ctx.db.patch(userId, {
76
- deletedAt: Date.now(),
77
- updatedAt: Date.now(),
78
- })
79
- await ctx.runMutation(internal.telemetry.clearUserTelemetryInternal, { userId })
80
- },
81
- })
82
-
83
- export const list = query({
84
- args: { limit: v.optional(v.number()) },
85
- handler: async (ctx, args) => {
86
- const { user } = await requireUser(ctx)
87
- assertAdmin(user)
88
- const limit = args.limit ?? 50
89
- return ctx.db.query('users').order('desc').take(limit)
90
- },
91
- })
92
-
93
- export const getByHandle = query({
94
- args: { handle: v.string() },
95
- handler: async (ctx, args) => {
96
- const user = await ctx.db
97
- .query('users')
98
- .withIndex('handle', (q) => q.eq('handle', args.handle))
99
- .unique()
100
- return toPublicUser(user)
101
- },
102
- })
103
-
104
- export const setRole = mutation({
105
- args: {
106
- userId: v.id('users'),
107
- role: v.union(v.literal('admin'), v.literal('moderator'), v.literal('user')),
108
- },
109
- handler: async (ctx, args) => {
110
- const { user } = await requireUser(ctx)
111
- assertAdmin(user)
112
- await ctx.db.patch(args.userId, { role: args.role, updatedAt: Date.now() })
113
- await ctx.db.insert('auditLogs', {
114
- actorUserId: user._id,
115
- action: 'role.change',
116
- targetType: 'user',
117
- targetId: args.userId,
118
- metadata: { role: args.role },
119
- createdAt: Date.now(),
120
- })
121
- },
122
- })
@@ -1,50 +0,0 @@
1
- import { v } from 'convex/values'
2
- import { internalAction } from './_generated/server'
3
- import { buildDiscordPayload, getWebhookConfig, shouldSendWebhook } from './lib/webhooks'
4
-
5
- export const sendDiscordWebhook = internalAction({
6
- args: {
7
- event: v.union(v.literal('skill.publish'), v.literal('skill.highlighted')),
8
- skill: v.object({
9
- slug: v.string(),
10
- displayName: v.string(),
11
- summary: v.optional(v.string()),
12
- version: v.optional(v.string()),
13
- ownerHandle: v.optional(v.string()),
14
- highlighted: v.optional(v.boolean()),
15
- tags: v.optional(v.array(v.string())),
16
- }),
17
- },
18
- handler: async (_ctx, args) => {
19
- const config = getWebhookConfig()
20
- const logMeta = {
21
- event: args.event,
22
- slug: args.skill.slug,
23
- version: args.skill.version ?? null,
24
- highlighted: args.skill.highlighted ?? false,
25
- highlightedOnly: config.highlightedOnly,
26
- }
27
- if (!shouldSendWebhook(args.event, args.skill, config)) {
28
- console.info('[webhook] skipped', logMeta)
29
- return { ok: false, skipped: true }
30
- }
31
-
32
- const payload = buildDiscordPayload(args.event, args.skill, config)
33
- const response = await fetch(config.url as string, {
34
- method: 'POST',
35
- headers: { 'Content-Type': 'application/json' },
36
- body: JSON.stringify(payload),
37
- })
38
- if (!response.ok) {
39
- const message = await response.text()
40
- console.error('[webhook] failed', {
41
- ...logMeta,
42
- status: response.status,
43
- body: message.slice(0, 300),
44
- })
45
- throw new Error(`Discord webhook failed: ${response.status} ${message}`)
46
- }
47
- console.info('[webhook] sent', { ...logMeta, status: response.status })
48
- return { ok: true }
49
- },
50
- })
package/convex.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "functions": "convex"
3
- }
package/docs/README.md DELETED
@@ -1,32 +0,0 @@
1
- ---
2
- summary: 'Documentation index + reading order.'
3
- read_when:
4
- - New contributor onboarding
5
- - Looking for the right doc
6
- ---
7
-
8
- # Docs
9
-
10
- Reading order (new contributor):
11
-
12
- 1. `README.md` (repo root): run locally.
13
- 2. `docs/quickstart.md`: end-to-end: search → install → publish → sync.
14
- 3. `docs/architecture.md`: how the pieces fit (TanStack Start + Convex + CLI).
15
- 4. `docs/skill-format.md`: what a “skill” is on disk + on the registry.
16
- 5. `docs/cli.md`: CLI reference (flags, config, lockfiles, sync rules).
17
- 6. `docs/http-api.md`: HTTP endpoints used by the CLI + public API.
18
- 7. `docs/auth.md`: GitHub OAuth + API tokens + CLI loopback login.
19
- 8. `docs/deploy.md`: Convex + Vercel deployment + rewrites.
20
- 9. `docs/troubleshooting.md`: common failure modes.
21
-
22
- Feature/ops docs (already present):
23
-
24
- - `docs/spec.md`: product + implementation spec (data model + flows).
25
- - `docs/telemetry.md`: what `pilothub sync` reports; opt-out.
26
- - `docs/webhook.md`: Discord webhook events/payload.
27
- - `docs/diffing.md`: version-to-version diff UI spec.
28
- - `docs/manual-testing.md`: CLI smoke scripts.
29
-
30
- Docs tooling:
31
-
32
- - `docs/mintlify.md`: publish these docs with Mintlify.
package/docs/api.md DELETED
@@ -1,51 +0,0 @@
1
- ---
2
- summary: 'Public REST API (v1) overview and conventions.'
3
- read_when:
4
- - Building API clients
5
- - Adding endpoints or schemas
6
- ---
7
-
8
- # API v1
9
-
10
- Base: `https://pilothub.com`
11
-
12
- OpenAPI: `/api/v1/openapi.json`
13
-
14
- ## Auth
15
-
16
- - Public read: no token required.
17
- - Write + account: `Authorization: Bearer clh_...`.
18
-
19
- ## Rate limits
20
-
21
- Per IP + per API key:
22
-
23
- - Read: 120/min per IP, 600/min per key
24
- - Write: 30/min per IP, 120/min per key
25
-
26
- Headers: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`, `Retry-After` (on 429).
27
-
28
- ## Endpoints
29
-
30
- Public read:
31
-
32
- - `GET /api/v1/search?q=...`
33
- - `GET /api/v1/skills?limit=&cursor=&sort=`
34
- - `sort`: `updated` (default), `downloads`, `stars` (`rating`), `installsCurrent` (`installs`), `installsAllTime`, `trending`
35
- - `GET /api/v1/skills/{slug}`
36
- - `GET /api/v1/skills/{slug}/versions?limit=&cursor=`
37
- - `GET /api/v1/skills/{slug}/versions/{version}`
38
- - `GET /api/v1/skills/{slug}/file?path=&version=&tag=`
39
- - `GET /api/v1/resolve?slug=&hash=`
40
- - `GET /api/v1/download?slug=&version=&tag=`
41
-
42
- Auth required:
43
-
44
- - `POST /api/v1/skills` (publish, multipart preferred)
45
- - `DELETE /api/v1/skills/{slug}`
46
- - `POST /api/v1/skills/{slug}/undelete`
47
- - `GET /api/v1/whoami`
48
-
49
- ## Legacy
50
-
51
- Legacy `/api/*` and `/api/cli/*` still available. See `DEPRECATIONS.md`.
@@ -1,61 +0,0 @@
1
- ---
2
- summary: 'System overview: web app + Convex backend + CLI + shared schema.'
3
- read_when:
4
- - Orienting in codebase
5
- - Tracing a user flow across layers
6
- ---
7
-
8
- # Architecture
9
-
10
- ## Pieces
11
-
12
- - Web app: TanStack Start (React) under `src/`.
13
- - Backend: Convex under `convex/` (DB, storage, actions, HTTP routes).
14
- - CLI: `packages/pilothub/` (published as `pilothub`).
15
- - Shared schemas/routes: `packages/schema/` (`pilothub-schema`).
16
-
17
- ## Data + storage
18
-
19
- - Skill “bundle” = versioned set of text files stored in Convex `_storage`.
20
- - Metadata extracted from `SKILL.md` frontmatter.
21
- - Stats stored on `skills` (downloads, installs, stars, comments, …).
22
-
23
- ## Main flows
24
-
25
- ### Browse (web)
26
-
27
- - UI reads skill metadata + latest version from Convex queries/actions.
28
- - `SKILL.md` rendered as Markdown.
29
-
30
- ### Search (HTTP)
31
-
32
- - `/api/v1/search?q=...` routes to Convex action for vector search.
33
- - Embeddings currently generated during publish.
34
-
35
- ### Install (CLI)
36
-
37
- - Resolve latest version via `/api/v1/skills/<slug>`.
38
- - Download zip via `/api/v1/download?slug=...&version=...`.
39
- - Extract into `./skills/<slug>` (default).
40
- - Persist install state:
41
- - `./.pilothub/lock.json` (per workdir)
42
- - `./skills/<slug>/.pilothub/origin.json` (per skill folder)
43
-
44
- ### Update (CLI)
45
-
46
- - Hash local files, call `/api/v1/resolve?slug=...&hash=<sha256>`.
47
- - If local matches a known version → use that for “current”.
48
- - If local doesn’t match:
49
- - refuse by default
50
- - or overwrite with `--force`
51
-
52
- ### Publish (CLI)
53
-
54
- - Publish via `POST /api/v1/skills` (multipart; requires Bearer token).
55
-
56
- ### Sync (CLI)
57
-
58
- - Scan roots for skill folders (contain `SKILL.md`).
59
- - Compute fingerprint; compare to registry state.
60
- - Optionally reports telemetry (see `docs/telemetry.md`).
61
- - Publishes new/changed skills (skips modified installed skills inside install root).
package/docs/auth.md DELETED
@@ -1,54 +0,0 @@
1
- ---
2
- summary: 'Auth overview: GitHub OAuth (web) + API tokens (CLI).'
3
- read_when:
4
- - Working on login/token flows
5
- - Debugging 401s
6
- ---
7
-
8
- # Auth
9
-
10
- ## Web auth (GitHub OAuth)
11
-
12
- - Convex Auth + GitHub OAuth App.
13
- - Env vars:
14
- - `AUTH_GITHUB_ID`
15
- - `AUTH_GITHUB_SECRET`
16
- - `CONVEX_SITE_URL` (used by auth config)
17
-
18
- Local setup steps are in the repo root `README.md`.
19
-
20
- ## API tokens (CLI)
21
-
22
- The CLI uses a long-lived API token (Bearer token) for publish/sync/delete.
23
-
24
- ### Browser flow (default)
25
-
26
- `pilothub login` does:
27
-
28
- 1. Starts a loopback HTTP server on `127.0.0.1` (random port).
29
- 2. Opens `<site>/cli/auth?redirect_uri=http://127.0.0.1:<port>/callback&state=...`.
30
- 3. Web UI requires GitHub login, then creates a token and redirects back to the loopback server.
31
- 4. CLI stores the token in the global config file.
32
-
33
- ### Headless flow
34
-
35
- Create a token in the web UI (Settings → API tokens) and paste it:
36
-
37
- ```bash
38
- pilothub login --token clh_...
39
- ```
40
-
41
- ### Token storage
42
-
43
- Default global config path:
44
-
45
- - macOS: `~/Library/Application Support/pilothub/config.json`
46
-
47
- Override:
48
-
49
- - `PILOTHUB_CONFIG_PATH=/path/to/config.json`
50
-
51
- ### Revocation
52
-
53
- - Tokens can be revoked in the web UI.
54
- - Revoked tokens return `401 Unauthorized` on CLI endpoints.
package/docs/cli.md DELETED
@@ -1,117 +0,0 @@
1
- ---
2
- summary: 'CLI reference: commands, flags, config, lockfile, sync behavior.'
3
- read_when:
4
- - Working on CLI behavior
5
- - Debugging install/update/sync
6
- ---
7
-
8
- # CLI
9
-
10
- CLI package: `packages/pilothub/` (bin: `pilothub`).
11
-
12
- From this repo you can run it via the wrapper script:
13
-
14
- ```bash
15
- bun pilothub --help
16
- ```
17
-
18
- ## Global flags
19
-
20
- - `--workdir <dir>`: working directory (default: cwd; falls back to Pilotbot workspace if configured)
21
- - `--dir <dir>`: install dir under workdir (default: `skills`)
22
- - `--site <url>`: base URL for browser login (default: `https://pilothub.com`)
23
- - `--registry <url>`: API base URL (default: discovered, else `https://pilothub.com`)
24
- - `--no-input`: disable prompts
25
-
26
- Env equivalents:
27
-
28
- - `PILOTHUB_SITE`
29
- - `PILOTHUB_REGISTRY`
30
- - `PILOTHUB_WORKDIR`
31
-
32
- ## Config file
33
-
34
- Stores your API token + cached registry URL.
35
-
36
- - macOS: `~/Library/Application Support/pilothub/config.json`
37
- - override: `PILOTHUB_CONFIG_PATH`
38
-
39
- ## Commands
40
-
41
- ### `login` / `auth login`
42
-
43
- - Default: opens browser to `<site>/cli/auth` and completes via loopback callback.
44
- - Headless: `pilothub login --token clh_...`
45
-
46
- ### `whoami`
47
-
48
- - Verifies the stored token via `/api/v1/whoami`.
49
-
50
- ### `star <slug>` / `unstar <slug>`
51
-
52
- - Adds/removes a skill from your highlights.
53
- - Calls `POST /api/v1/stars/<slug>` and `DELETE /api/v1/stars/<slug>`.
54
- - `--yes` skips confirmation.
55
-
56
- ### `search <query...>`
57
-
58
- - Calls `/api/v1/search?q=...`.
59
-
60
- ### `explore`
61
-
62
- - Lists latest updated skills via `/api/v1/skills?limit=...` (sorted by `updatedAt` desc).
63
- - Flags:
64
- - `--limit <n>` (1–200, default: 25)
65
- - `--sort newest|downloads|rating|installs|installsAllTime|trending` (default: newest)
66
- - `--json` (machine-readable output)
67
- - Output: `<slug> v<version> <age> <summary>` (summary truncated to 50 chars).
68
-
69
- ### `install <slug>`
70
-
71
- - Resolves latest version via `/api/v1/skills/<slug>`.
72
- - Downloads zip via `/api/v1/download`.
73
- - Extracts into `<workdir>/<dir>/<slug>`.
74
- - Writes:
75
- - `<workdir>/.pilothub/lock.json`
76
- - `<skill>/.pilothub/origin.json`
77
-
78
- ### `list`
79
-
80
- - Reads `<workdir>/.pilothub/lock.json`.
81
-
82
- ### `update [slug]` / `update --all`
83
-
84
- - Computes fingerprint from local files.
85
- - If fingerprint matches a known version: no prompt.
86
- - If fingerprint does not match:
87
- - refuses by default
88
- - overwrites with `--force` (or prompt, if interactive)
89
-
90
- ### `publish <path>`
91
-
92
- - Publishes via `POST /api/v1/skills` (multipart).
93
- - Requires semver: `--version 1.2.3`.
94
-
95
- ### `sync`
96
-
97
- - Scans for local skill folders and publishes new/changed ones.
98
- - Roots can be any folder: a skills directory or a single skill folder with `SKILL.md`.
99
- - Auto-adds Pilotbot skill roots when `~/.pilotbot/pilotbot.json` is present:
100
- - `agent.workspace/skills` (main agent)
101
- - `routing.agents.*.workspace/skills` (per-agent)
102
- - `~/.pilotbot/skills` (shared)
103
- - `skills.load.extraDirs` (shared packs)
104
- - Respects `PILOTBOT_CONFIG_PATH` and `PILOTBOT_STATE_DIR`.
105
- - Flags:
106
- - `--root <dir...>` extra scan roots
107
- - `--all` upload without prompting
108
- - `--dry-run` show plan only
109
- - `--bump patch|minor|major` (default: patch)
110
- - `--changelog <text>` (non-interactive)
111
- - `--tags a,b,c` (default: latest)
112
- - `--concurrency <n>` (default: 4)
113
-
114
- Telemetry:
115
-
116
- - Sent during `sync` when logged in, unless `PILOTHUB_DISABLE_TELEMETRY=1`.
117
- - Details: `docs/telemetry.md`.
package/docs/deploy.md DELETED
@@ -1,78 +0,0 @@
1
- ---
2
- summary: 'Deploy checklist: Convex backend + Vercel web app + /api rewrites.'
3
- read_when:
4
- - Shipping to production
5
- - Debugging /api routing
6
- ---
7
-
8
- # Deploy
9
-
10
- PilotHub is two deployables:
11
-
12
- - Web app (TanStack Start) → typically Vercel.
13
- - Convex backend → Convex deployment (serves `/api/...` routes).
14
-
15
- ## 1) Deploy Convex
16
-
17
- From your local machine:
18
-
19
- ```bash
20
- bunx convex deploy
21
- ```
22
-
23
- Ensure Convex env is set (auth + embeddings):
24
-
25
- - `AUTH_GITHUB_ID`
26
- - `AUTH_GITHUB_SECRET`
27
- - `CONVEX_SITE_URL`
28
- - `JWT_PRIVATE_KEY`
29
- - `JWKS`
30
- - `OPENAI_API_KEY`
31
- - `SITE_URL` (your web app URL)
32
- - Optional webhook env (see `docs/webhook.md`)
33
-
34
- ## 2) Deploy web app (Vercel)
35
-
36
- Set env vars:
37
-
38
- - `VITE_CONVEX_URL`
39
- - `VITE_CONVEX_SITE_URL` (Convex “site” URL)
40
- - `CONVEX_SITE_URL` (same value; used by auth provider config)
41
- - `SITE_URL` (web app URL)
42
-
43
- ## 3) Route `/api/*` to Convex
44
-
45
- This repo currently uses `vercel.json` rewrites:
46
-
47
- - `source: /api/:path*`
48
- - `destination: https://<deployment>.convex.site/api/:path*`
49
-
50
- For self-host:
51
-
52
- - update `vercel.json` to your deployment’s Convex site URL.
53
-
54
- ## 4) Registry discovery
55
-
56
- The CLI can discover the API base from:
57
-
58
- - `/.well-known/pilothub.json`
59
-
60
- If you don’t serve that file, users must set:
61
-
62
- ```bash
63
- export PILOTHUB_REGISTRY=https://your-site.example
64
- ```
65
-
66
- ## 5) Post-deploy checks
67
-
68
- ```bash
69
- curl -i "https://<site>/api/v1/search?q=test"
70
- curl -i "https://<site>/api/v1/skills/gifgrep"
71
- ```
72
-
73
- Then:
74
-
75
- ```bash
76
- pilothub login --site https://<site>
77
- pilothub whoami
78
- ```