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/auth.ts DELETED
@@ -1,19 +0,0 @@
1
- import GitHub from '@auth/core/providers/github'
2
- import { convexAuth } from '@convex-dev/auth/server'
3
-
4
- export const { auth, signIn, signOut, store, isAuthenticated } = convexAuth({
5
- providers: [
6
- GitHub({
7
- clientId: process.env.AUTH_GITHUB_ID ?? '',
8
- clientSecret: process.env.AUTH_GITHUB_SECRET ?? '',
9
- profile(profile) {
10
- return {
11
- id: String(profile.id),
12
- name: profile.login,
13
- email: profile.email ?? undefined,
14
- image: profile.avatar_url,
15
- }
16
- },
17
- }),
18
- ],
19
- })
@@ -1,88 +0,0 @@
1
- import { v } from 'convex/values'
2
- import type { Doc } from './_generated/dataModel'
3
- import { mutation, query } from './_generated/server'
4
- import { assertModerator, requireUser } from './lib/access'
5
- import { type PublicUser, toPublicUser } from './lib/public'
6
-
7
- export const listBySkill = query({
8
- args: { skillId: v.id('skills'), limit: v.optional(v.number()) },
9
- handler: async (ctx, args) => {
10
- const limit = args.limit ?? 50
11
- const comments = await ctx.db
12
- .query('comments')
13
- .withIndex('by_skill', (q) => q.eq('skillId', args.skillId))
14
- .order('desc')
15
- .take(limit)
16
-
17
- const results: Array<{ comment: Doc<'comments'>; user: PublicUser | null }> = []
18
- for (const comment of comments) {
19
- if (comment.softDeletedAt) continue
20
- const user = toPublicUser(await ctx.db.get(comment.userId))
21
- results.push({ comment, user })
22
- }
23
- return results
24
- },
25
- })
26
-
27
- export const add = mutation({
28
- args: { skillId: v.id('skills'), body: v.string() },
29
- handler: async (ctx, args) => {
30
- const { userId } = await requireUser(ctx)
31
- const body = args.body.trim()
32
- if (!body) throw new Error('Comment body required')
33
-
34
- const skill = await ctx.db.get(args.skillId)
35
- if (!skill) throw new Error('Skill not found')
36
-
37
- await ctx.db.insert('comments', {
38
- skillId: args.skillId,
39
- userId,
40
- body,
41
- createdAt: Date.now(),
42
- softDeletedAt: undefined,
43
- deletedBy: undefined,
44
- })
45
-
46
- await ctx.db.patch(skill._id, {
47
- stats: { ...skill.stats, comments: skill.stats.comments + 1 },
48
- updatedAt: Date.now(),
49
- })
50
- },
51
- })
52
-
53
- export const remove = mutation({
54
- args: { commentId: v.id('comments') },
55
- handler: async (ctx, args) => {
56
- const { user } = await requireUser(ctx)
57
- const comment = await ctx.db.get(args.commentId)
58
- if (!comment) throw new Error('Comment not found')
59
- if (comment.softDeletedAt) return
60
-
61
- const isOwner = comment.userId === user._id
62
- if (!isOwner) {
63
- assertModerator(user)
64
- }
65
-
66
- await ctx.db.patch(comment._id, {
67
- softDeletedAt: Date.now(),
68
- deletedBy: user._id,
69
- })
70
-
71
- const skill = await ctx.db.get(comment.skillId)
72
- if (skill) {
73
- await ctx.db.patch(skill._id, {
74
- stats: { ...skill.stats, comments: Math.max(0, skill.stats.comments - 1) },
75
- updatedAt: Date.now(),
76
- })
77
- }
78
-
79
- await ctx.db.insert('auditLogs', {
80
- actorUserId: user._id,
81
- action: 'comment.delete',
82
- targetType: 'comment',
83
- targetId: comment._id,
84
- metadata: { skillId: comment.skillId },
85
- createdAt: Date.now(),
86
- })
87
- },
88
- })
package/convex/crons.ts DELETED
@@ -1,34 +0,0 @@
1
- import { cronJobs } from 'convex/server'
2
- import { internal } from './_generated/api'
3
-
4
- const crons = cronJobs()
5
-
6
- crons.interval(
7
- 'github-backup-sync',
8
- { minutes: 30 },
9
- internal.githubBackupsNode.syncGitHubBackupsInternal,
10
- { batchSize: 50, maxBatches: 5 },
11
- )
12
-
13
- crons.interval(
14
- 'trending-leaderboard',
15
- { minutes: 60 },
16
- internal.leaderboards.rebuildTrendingLeaderboardInternal,
17
- { limit: 200 },
18
- )
19
-
20
- crons.interval(
21
- 'skill-stats-backfill',
22
- { minutes: 10 },
23
- internal.statsMaintenance.runSkillStatBackfillInternal,
24
- { batchSize: 200, maxBatches: 5 },
25
- )
26
-
27
- crons.interval(
28
- 'skill-stat-events',
29
- { minutes: 15 },
30
- internal.skillStatEvents.processSkillStatEventsAction,
31
- {},
32
- )
33
-
34
- export default crons
package/convex/devSeed.ts DELETED
@@ -1,459 +0,0 @@
1
- import { v } from 'convex/values'
2
- import { internal } from './_generated/api'
3
- import type { ActionCtx } from './_generated/server'
4
- import { internalAction, internalMutation } from './_generated/server'
5
- import { EMBEDDING_DIMENSIONS } from './lib/embeddings'
6
- import { parseFrontmatter, parsePilotbotMetadata } from './lib/skills'
7
-
8
- type SeedSkillSpec = {
9
- slug: string
10
- displayName: string
11
- summary: string
12
- version: string
13
- metadata: Record<string, unknown>
14
- rawSkillMd: string
15
- }
16
-
17
- type SeedActionArgs = {
18
- reset?: boolean
19
- }
20
-
21
- type SeedActionResult = {
22
- ok: true
23
- results: Array<Record<string, unknown> & { slug: string }>
24
- }
25
-
26
- type SeedMutationResult = Record<string, unknown>
27
-
28
- const SEED_SKILLS: SeedSkillSpec[] = [
29
- {
30
- slug: 'padel',
31
- displayName: 'Padel',
32
- summary: 'Check padel court availability and manage bookings via Playtomic.',
33
- version: '0.1.0',
34
- metadata: {
35
- pilotbot: {
36
- nix: {
37
- plugin: 'github:joshp123/padel-cli',
38
- systems: ['aarch64-darwin', 'x86_64-linux'],
39
- },
40
- config: {
41
- requiredEnv: ['PADEL_AUTH_FILE'],
42
- stateDirs: ['.config/padel'],
43
- example:
44
- 'config = { env = { PADEL_AUTH_FILE = "/run/agenix/padel-auth"; }; stateDirs = [ ".config/padel" ]; };',
45
- },
46
- cliHelp: `Padel CLI for availability
47
-
48
- Usage:
49
- padel [command]
50
-
51
- Available Commands:
52
- auth Manage authentication
53
- availability Show availability for a club on a date
54
- book Book a court
55
- bookings Manage bookings history
56
- search Search for available courts
57
- venues Manage saved venues
58
-
59
- Flags:
60
- -h, --help help for padel
61
- --json Output JSON
62
-
63
- Use "padel [command] --help" for more information about a command.
64
- `,
65
- },
66
- },
67
- rawSkillMd: `---
68
- name: padel
69
- description: Check padel court availability and manage bookings via the padel CLI.
70
- ---
71
-
72
- # Padel Booking Skill
73
-
74
- ## CLI
75
-
76
- \`\`\`bash
77
- padel # On PATH (pilotbot plugin bundle)
78
- \`\`\`
79
-
80
- ## Venues
81
-
82
- Use the configured venue list in order of preference. If no venues are configured, ask for a venue name or location.
83
-
84
- ## Commands
85
-
86
- ### Check next booking
87
- \`\`\`bash
88
- padel bookings list 2>&1 | head -3
89
- \`\`\`
90
-
91
- ### Search availability
92
- \`\`\`bash
93
- padel search --venues VENUE1,VENUE2 --date YYYY-MM-DD --time 09:00-12:00
94
- \`\`\`
95
-
96
- ## Response guidelines
97
-
98
- - Keep responses concise.
99
- - Use 🎾 emoji.
100
- - End with a call to action.
101
-
102
- ## Authorization
103
-
104
- Only the authorized booker can confirm bookings. If the requester is not authorized, ask the authorized user to confirm.
105
- `,
106
- },
107
- {
108
- slug: 'gohome',
109
- displayName: 'GoHome',
110
- summary: 'Operate GoHome via gRPC discovery, metrics, and Grafana dashboards.',
111
- version: '0.1.0',
112
- metadata: {
113
- pilotbot: {
114
- nix: {
115
- plugin: 'github:joshp123/gohome',
116
- systems: ['x86_64-linux', 'aarch64-linux'],
117
- },
118
- config: {
119
- requiredEnv: ['GOHOME_GRPC_ADDR', 'GOHOME_HTTP_BASE'],
120
- example:
121
- 'config = { env = { GOHOME_GRPC_ADDR = "gohome:9000"; GOHOME_HTTP_BASE = "http://gohome:8080"; }; };',
122
- },
123
- cliHelp: `GoHome CLI
124
-
125
- Usage:
126
- gohome-cli [command]
127
-
128
- Available Commands:
129
- services List registered services
130
- plugins Inspect loaded plugins
131
- methods List RPC methods
132
- call Call an RPC method
133
- roborock Manage roborock devices
134
- tado Manage tado zones
135
-
136
- Flags:
137
- --grpc-addr string gRPC endpoint (host:port)
138
- -h, --help help for gohome-cli
139
- `,
140
- },
141
- },
142
- rawSkillMd: `---
143
- name: gohome
144
- description: Use when Pilotbot needs to test or operate GoHome via gRPC discovery, metrics, and Grafana.
145
- ---
146
-
147
- # GoHome Skill
148
-
149
- ## Quick start
150
-
151
- \`\`\`bash
152
- export GOHOME_HTTP_BASE="http://gohome:8080"
153
- export GOHOME_GRPC_ADDR="gohome:9000"
154
- \`\`\`
155
-
156
- ## CLI
157
-
158
- \`\`\`bash
159
- gohome-cli services
160
- \`\`\`
161
-
162
- ## Discovery flow (read-only)
163
-
164
- 1) List plugins.
165
- 2) Describe a plugin.
166
- 3) List RPC methods.
167
- 4) Call a read-only RPC.
168
-
169
- ## Metrics validation
170
-
171
- \`\`\`bash
172
- curl -s "\${GOHOME_HTTP_BASE}/gohome/metrics" | rg -n "gohome_"
173
- \`\`\`
174
-
175
- ## Stateful actions
176
-
177
- Only call write RPCs after explicit user approval.
178
- `,
179
- },
180
- {
181
- slug: 'xuezh',
182
- displayName: 'Xuezh',
183
- summary: 'Teach Mandarin with the xuezh engine for review, speaking, and audits.',
184
- version: '0.1.0',
185
- metadata: {
186
- pilotbot: {
187
- nix: {
188
- plugin: 'github:joshp123/xuezh',
189
- systems: ['aarch64-darwin', 'x86_64-linux'],
190
- },
191
- config: {
192
- requiredEnv: ['XUEZH_AZURE_SPEECH_KEY_FILE', 'XUEZH_AZURE_SPEECH_REGION'],
193
- stateDirs: ['.config/xuezh'],
194
- example:
195
- 'config = { env = { XUEZH_AZURE_SPEECH_KEY_FILE = "/run/agenix/xuezh-azure-speech-key"; XUEZH_AZURE_SPEECH_REGION = "westeurope"; }; stateDirs = [ ".config/xuezh" ]; };',
196
- },
197
- cliHelp: `xuezh - Chinese learning engine
198
-
199
- Usage:
200
- xuezh [command]
201
-
202
- Available Commands:
203
- snapshot Fetch learner state snapshot
204
- review Review due items
205
- audio Process speech audio
206
- items Manage learning items
207
- events Log learning events
208
-
209
- Flags:
210
- -h, --help help for xuezh
211
- --json Output JSON
212
- `,
213
- },
214
- },
215
- rawSkillMd: `---
216
- name: xuezh
217
- description: Teach Mandarin using the xuezh engine for review, speaking, and audits.
218
- ---
219
-
220
- # Xuezh Skill
221
-
222
- ## Contract
223
-
224
- Use the xuezh CLI exactly as specified. If a command is missing, ask for implementation instead of guessing.
225
-
226
- ## Default loop
227
-
228
- 1) Call \`xuezh snapshot\`.
229
- 2) Pick a tiny plan (1-2 bullets).
230
- 3) Run a short activity.
231
- 4) Log outcomes.
232
-
233
- ## CLI examples
234
-
235
- \`\`\`bash
236
- xuezh snapshot --profile default
237
- xuezh review next --limit 10
238
- xuezh audio process-voice --file ./utterance.wav
239
- \`\`\`
240
- `,
241
- },
242
- ]
243
-
244
- function injectMetadata(rawSkillMd: string, metadata: Record<string, unknown>) {
245
- const frontmatterEnd = rawSkillMd.indexOf('\n---', 3)
246
- if (frontmatterEnd === -1) return rawSkillMd
247
- return `${rawSkillMd.slice(0, frontmatterEnd)}\nmetadata: ${JSON.stringify(
248
- metadata,
249
- )}${rawSkillMd.slice(frontmatterEnd)}`
250
- }
251
-
252
- async function seedNixSkillsHandler(
253
- ctx: ActionCtx,
254
- args: SeedActionArgs,
255
- ): Promise<SeedActionResult> {
256
- const results: Array<Record<string, unknown> & { slug: string }> = []
257
-
258
- for (const spec of SEED_SKILLS) {
259
- const skillMd = injectMetadata(spec.rawSkillMd, spec.metadata)
260
- const frontmatter = parseFrontmatter(skillMd)
261
- const pilotbot = parsePilotbotMetadata(frontmatter)
262
- const storageId = await ctx.storage.store(new Blob([skillMd], { type: 'text/markdown' }))
263
-
264
- const result: SeedMutationResult = await ctx.runMutation(internal.devSeed.seedSkillMutation, {
265
- reset: args.reset,
266
- storageId,
267
- metadata: spec.metadata,
268
- frontmatter,
269
- pilotbot,
270
- skillMd,
271
- slug: spec.slug,
272
- displayName: spec.displayName,
273
- summary: spec.summary,
274
- version: spec.version,
275
- })
276
-
277
- results.push({ slug: spec.slug, ...result })
278
- }
279
-
280
- return { ok: true, results }
281
- }
282
-
283
- export const seedNixSkills: ReturnType<typeof internalAction> = internalAction({
284
- args: {
285
- reset: v.optional(v.boolean()),
286
- },
287
- handler: seedNixSkillsHandler,
288
- })
289
-
290
- async function seedPadelSkillHandler(
291
- ctx: ActionCtx,
292
- args: SeedActionArgs,
293
- ): Promise<SeedMutationResult> {
294
- const spec = SEED_SKILLS.find((entry) => entry.slug === 'padel')
295
- if (!spec) throw new Error('padel seed spec missing')
296
-
297
- const skillMd = injectMetadata(spec.rawSkillMd, spec.metadata)
298
- const frontmatter = parseFrontmatter(skillMd)
299
- const pilotbot = parsePilotbotMetadata(frontmatter)
300
- const storageId = await ctx.storage.store(new Blob([skillMd], { type: 'text/markdown' }))
301
-
302
- return (await ctx.runMutation(internal.devSeed.seedSkillMutation, {
303
- reset: args.reset,
304
- storageId,
305
- metadata: spec.metadata,
306
- frontmatter,
307
- pilotbot,
308
- skillMd,
309
- slug: spec.slug,
310
- displayName: spec.displayName,
311
- summary: spec.summary,
312
- version: spec.version,
313
- })) as SeedMutationResult
314
- }
315
-
316
- export const seedPadelSkill: ReturnType<typeof internalAction> = internalAction({
317
- args: {
318
- reset: v.optional(v.boolean()),
319
- },
320
- handler: seedPadelSkillHandler,
321
- })
322
-
323
- export const seedSkillMutation = internalMutation({
324
- args: {
325
- reset: v.optional(v.boolean()),
326
- storageId: v.id('_storage'),
327
- metadata: v.any(),
328
- frontmatter: v.any(),
329
- pilotbot: v.any(),
330
- skillMd: v.string(),
331
- slug: v.string(),
332
- displayName: v.string(),
333
- summary: v.optional(v.string()),
334
- version: v.string(),
335
- },
336
- handler: async (ctx, args) => {
337
- const existing = await ctx.db
338
- .query('skills')
339
- .withIndex('by_slug', (q) => q.eq('slug', args.slug))
340
- .unique()
341
-
342
- if (existing && !args.reset) {
343
- return { ok: true, skipped: true, skillId: existing._id }
344
- }
345
-
346
- if (existing && args.reset) {
347
- const versions = await ctx.db
348
- .query('skillVersions')
349
- .withIndex('by_skill', (q) => q.eq('skillId', existing._id))
350
- .collect()
351
- for (const version of versions) {
352
- await ctx.db.delete(version._id)
353
- }
354
- const embeddings = await ctx.db
355
- .query('skillEmbeddings')
356
- .withIndex('by_skill', (q) => q.eq('skillId', existing._id))
357
- .collect()
358
- for (const embedding of embeddings) {
359
- await ctx.db.delete(embedding._id)
360
- }
361
- await ctx.db.delete(existing._id)
362
- }
363
-
364
- const now = Date.now()
365
- const existingUsers = await ctx.db
366
- .query('users')
367
- .withIndex('handle', (q) => q.eq('handle', 'local'))
368
- .collect()
369
-
370
- const userId =
371
- existingUsers[0]?._id ??
372
- (await ctx.db.insert('users', {
373
- handle: 'local',
374
- displayName: 'Local Dev',
375
- role: 'admin',
376
- createdAt: now,
377
- updatedAt: now,
378
- }))
379
-
380
- const skillId = await ctx.db.insert('skills', {
381
- slug: args.slug,
382
- displayName: args.displayName,
383
- summary: args.summary,
384
- ownerUserId: userId,
385
- latestVersionId: undefined,
386
- tags: {},
387
- softDeletedAt: undefined,
388
- badges: { redactionApproved: undefined },
389
- statsDownloads: 0,
390
- statsStars: 0,
391
- statsInstallsCurrent: 0,
392
- statsInstallsAllTime: 0,
393
- stats: {
394
- downloads: 0,
395
- installsCurrent: 0,
396
- installsAllTime: 0,
397
- stars: 0,
398
- versions: 0,
399
- comments: 0,
400
- },
401
- createdAt: now,
402
- updatedAt: now,
403
- })
404
-
405
- const versionId = await ctx.db.insert('skillVersions', {
406
- skillId,
407
- version: args.version,
408
- changelog: 'Seeded local version for screenshots.',
409
- files: [
410
- {
411
- path: 'SKILL.md',
412
- size: args.skillMd.length,
413
- storageId: args.storageId,
414
- sha256: 'seeded',
415
- contentType: 'text/markdown',
416
- },
417
- ],
418
- parsed: {
419
- frontmatter: args.frontmatter,
420
- metadata: args.metadata,
421
- pilotbot: args.pilotbot,
422
- },
423
- createdBy: userId,
424
- createdAt: now,
425
- softDeletedAt: undefined,
426
- })
427
-
428
- const embeddingId = await ctx.db.insert('skillEmbeddings', {
429
- skillId,
430
- versionId,
431
- ownerId: userId,
432
- embedding: Array.from({ length: EMBEDDING_DIMENSIONS }, () => 0),
433
- isLatest: true,
434
- isApproved: true,
435
- visibility: 'latest-approved',
436
- updatedAt: now,
437
- })
438
-
439
- await ctx.db.patch(skillId, {
440
- latestVersionId: versionId,
441
- tags: { latest: versionId },
442
- statsDownloads: 0,
443
- statsStars: 0,
444
- statsInstallsCurrent: 0,
445
- statsInstallsAllTime: 0,
446
- stats: {
447
- downloads: 0,
448
- installsCurrent: 0,
449
- installsAllTime: 0,
450
- stars: 0,
451
- versions: 1,
452
- comments: 0,
453
- },
454
- updatedAt: now,
455
- })
456
-
457
- return { ok: true, skillId, versionId, embeddingId }
458
- },
459
- })