pilothub 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +36 -129
  3. package/dist/browserAuth.d.ts +20 -0
  4. package/dist/browserAuth.js +156 -0
  5. package/dist/browserAuth.js.map +1 -0
  6. package/dist/browserAuth.test.d.ts +1 -0
  7. package/dist/browserAuth.test.js +83 -0
  8. package/dist/browserAuth.test.js.map +1 -0
  9. package/dist/cli/buildInfo.d.ts +3 -0
  10. package/dist/cli/buildInfo.js +103 -0
  11. package/dist/cli/buildInfo.js.map +1 -0
  12. package/dist/cli/commands/auth.d.ts +9 -0
  13. package/dist/cli/commands/auth.js +75 -0
  14. package/dist/cli/commands/auth.js.map +1 -0
  15. package/dist/cli/commands/delete.d.ts +11 -0
  16. package/dist/cli/commands/delete.js +67 -0
  17. package/dist/cli/commands/delete.js.map +1 -0
  18. package/dist/cli/commands/delete.test.d.ts +1 -0
  19. package/dist/cli/commands/delete.test.js +52 -0
  20. package/dist/cli/commands/delete.test.js.map +1 -0
  21. package/dist/cli/commands/publish.d.ts +9 -0
  22. package/dist/cli/commands/publish.js +87 -0
  23. package/dist/cli/commands/publish.js.map +1 -0
  24. package/dist/cli/commands/publish.test.d.ts +1 -0
  25. package/dist/cli/commands/publish.test.js +104 -0
  26. package/dist/cli/commands/publish.test.js.map +1 -0
  27. package/dist/cli/commands/skills.d.ts +23 -0
  28. package/dist/cli/commands/skills.js +298 -0
  29. package/dist/cli/commands/skills.js.map +1 -0
  30. package/dist/cli/commands/skills.test.d.ts +1 -0
  31. package/dist/cli/commands/skills.test.js +156 -0
  32. package/dist/cli/commands/skills.test.js.map +1 -0
  33. package/dist/cli/commands/star.d.ts +8 -0
  34. package/dist/cli/commands/star.js +38 -0
  35. package/dist/cli/commands/star.js.map +1 -0
  36. package/dist/cli/commands/sync.d.ts +3 -0
  37. package/dist/cli/commands/sync.js +160 -0
  38. package/dist/cli/commands/sync.js.map +1 -0
  39. package/dist/cli/commands/sync.test.d.ts +1 -0
  40. package/dist/cli/commands/sync.test.js +277 -0
  41. package/dist/cli/commands/sync.test.js.map +1 -0
  42. package/dist/cli/commands/syncHelpers.d.ts +76 -0
  43. package/dist/cli/commands/syncHelpers.js +349 -0
  44. package/dist/cli/commands/syncHelpers.js.map +1 -0
  45. package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
  46. package/dist/cli/commands/syncHelpers.test.js +22 -0
  47. package/dist/cli/commands/syncHelpers.test.js.map +1 -0
  48. package/dist/cli/commands/syncTypes.d.ts +24 -0
  49. package/dist/cli/commands/syncTypes.js +2 -0
  50. package/dist/cli/commands/syncTypes.js.map +1 -0
  51. package/dist/cli/commands/unstar.d.ts +8 -0
  52. package/dist/cli/commands/unstar.js +38 -0
  53. package/dist/cli/commands/unstar.js.map +1 -0
  54. package/dist/cli/helpStyle.d.ts +13 -0
  55. package/dist/cli/helpStyle.js +38 -0
  56. package/dist/cli/helpStyle.js.map +1 -0
  57. package/dist/cli/pilotbotConfig.d.ts +6 -0
  58. package/dist/cli/pilotbotConfig.js +110 -0
  59. package/dist/cli/pilotbotConfig.js.map +1 -0
  60. package/dist/cli/pilotbotConfig.test.d.ts +1 -0
  61. package/dist/cli/pilotbotConfig.test.js +133 -0
  62. package/dist/cli/pilotbotConfig.test.js.map +1 -0
  63. package/dist/cli/registry.d.ts +7 -0
  64. package/dist/cli/registry.js +42 -0
  65. package/dist/cli/registry.js.map +1 -0
  66. package/dist/cli/registry.test.d.ts +1 -0
  67. package/dist/cli/registry.test.js +48 -0
  68. package/dist/cli/registry.test.js.map +1 -0
  69. package/dist/cli/scanSkills.d.ts +7 -0
  70. package/dist/cli/scanSkills.js +75 -0
  71. package/dist/cli/scanSkills.js.map +1 -0
  72. package/dist/cli/scanSkills.test.d.ts +1 -0
  73. package/dist/cli/scanSkills.test.js +60 -0
  74. package/dist/cli/scanSkills.test.js.map +1 -0
  75. package/dist/cli/slug.d.ts +2 -0
  76. package/dist/cli/slug.js +16 -0
  77. package/dist/cli/slug.js.map +1 -0
  78. package/dist/cli/types.d.ts +15 -0
  79. package/dist/cli/types.js +2 -0
  80. package/dist/cli/types.js.map +1 -0
  81. package/dist/cli/ui.d.ts +7 -0
  82. package/dist/cli/ui.js +72 -0
  83. package/dist/cli/ui.js.map +1 -0
  84. package/dist/cli.d.ts +2 -0
  85. package/dist/cli.js +268 -0
  86. package/dist/cli.js.map +1 -0
  87. package/dist/config.d.ts +4 -0
  88. package/dist/config.js +38 -0
  89. package/dist/config.js.map +1 -0
  90. package/dist/discovery.d.ts +5 -0
  91. package/dist/discovery.js +21 -0
  92. package/dist/discovery.js.map +1 -0
  93. package/dist/discovery.test.d.ts +1 -0
  94. package/dist/discovery.test.js +46 -0
  95. package/dist/discovery.test.js.map +1 -0
  96. package/dist/http.d.ts +32 -0
  97. package/dist/http.js +261 -0
  98. package/dist/http.js.map +1 -0
  99. package/dist/http.test.d.ts +1 -0
  100. package/dist/http.test.js +135 -0
  101. package/dist/http.test.js.map +1 -0
  102. package/dist/schema/ark.js.map +1 -0
  103. package/dist/schema/index.js.map +1 -0
  104. package/dist/schema/routes.js.map +1 -0
  105. package/{packages/schema/dist → dist/schema}/schemas.d.ts +0 -39
  106. package/{packages/schema/dist → dist/schema}/schemas.js +0 -22
  107. package/dist/schema/schemas.js.map +1 -0
  108. package/dist/schema/textFiles.js.map +1 -0
  109. package/dist/schema/textFiles.test.d.ts +1 -0
  110. package/dist/schema/textFiles.test.js +20 -0
  111. package/dist/schema/textFiles.test.js.map +1 -0
  112. package/dist/skills.d.ts +43 -0
  113. package/dist/skills.js +163 -0
  114. package/dist/skills.js.map +1 -0
  115. package/dist/skills.test.d.ts +1 -0
  116. package/dist/skills.test.js +144 -0
  117. package/dist/skills.test.js.map +1 -0
  118. package/dist/types.d.ts +7 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/package.json +27 -70
  122. package/.env.local.example +0 -19
  123. package/.github/workflows/ci.yml +0 -40
  124. package/.oxlintrc.json +0 -3
  125. package/AGENTS.md +0 -45
  126. package/CHANGELOG.md +0 -138
  127. package/DEPRECATIONS.md +0 -7
  128. package/biome.json +0 -41
  129. package/convex/_generated/api.d.ts +0 -153
  130. package/convex/_generated/api.js +0 -23
  131. package/convex/_generated/dataModel.d.ts +0 -60
  132. package/convex/_generated/server.d.ts +0 -143
  133. package/convex/_generated/server.js +0 -93
  134. package/convex/auth.config.ts +0 -8
  135. package/convex/auth.ts +0 -19
  136. package/convex/comments.ts +0 -88
  137. package/convex/crons.ts +0 -34
  138. package/convex/devSeed.ts +0 -459
  139. package/convex/devSeedExtra.ts +0 -541
  140. package/convex/downloads.ts +0 -78
  141. package/convex/githubBackups.ts +0 -170
  142. package/convex/githubBackupsNode.ts +0 -183
  143. package/convex/githubImport.ts +0 -317
  144. package/convex/githubSoulBackups.ts +0 -170
  145. package/convex/githubSoulBackupsNode.ts +0 -186
  146. package/convex/http.ts +0 -194
  147. package/convex/httpApi.handlers.test.ts +0 -488
  148. package/convex/httpApi.test.ts +0 -70
  149. package/convex/httpApi.ts +0 -305
  150. package/convex/httpApiV1.handlers.test.ts +0 -584
  151. package/convex/httpApiV1.ts +0 -1172
  152. package/convex/leaderboards.ts +0 -39
  153. package/convex/lib/access.ts +0 -36
  154. package/convex/lib/apiTokenAuth.ts +0 -36
  155. package/convex/lib/badges.ts +0 -50
  156. package/convex/lib/changelog.test.ts +0 -34
  157. package/convex/lib/changelog.ts +0 -278
  158. package/convex/lib/embeddings.ts +0 -38
  159. package/convex/lib/githubBackup.ts +0 -443
  160. package/convex/lib/githubImport.test.ts +0 -247
  161. package/convex/lib/githubImport.ts +0 -425
  162. package/convex/lib/githubSoulBackup.ts +0 -443
  163. package/convex/lib/leaderboards.ts +0 -103
  164. package/convex/lib/moderation.ts +0 -42
  165. package/convex/lib/public.ts +0 -89
  166. package/convex/lib/searchText.test.ts +0 -46
  167. package/convex/lib/searchText.ts +0 -27
  168. package/convex/lib/skillBackfill.test.ts +0 -34
  169. package/convex/lib/skillBackfill.ts +0 -67
  170. package/convex/lib/skillPublish.test.ts +0 -28
  171. package/convex/lib/skillPublish.ts +0 -284
  172. package/convex/lib/skillStats.ts +0 -80
  173. package/convex/lib/skills.test.ts +0 -197
  174. package/convex/lib/skills.ts +0 -273
  175. package/convex/lib/soulChangelog.ts +0 -273
  176. package/convex/lib/soulPublish.ts +0 -236
  177. package/convex/lib/tokens.test.ts +0 -33
  178. package/convex/lib/tokens.ts +0 -51
  179. package/convex/lib/webhooks.test.ts +0 -91
  180. package/convex/lib/webhooks.ts +0 -112
  181. package/convex/maintenance.test.ts +0 -270
  182. package/convex/maintenance.ts +0 -840
  183. package/convex/rateLimits.ts +0 -50
  184. package/convex/schema.ts +0 -472
  185. package/convex/search.test.ts +0 -12
  186. package/convex/search.ts +0 -254
  187. package/convex/seed.test.ts +0 -37
  188. package/convex/seed.ts +0 -254
  189. package/convex/seedSouls.ts +0 -111
  190. package/convex/skillStatEvents.ts +0 -568
  191. package/convex/skills.ts +0 -1606
  192. package/convex/soulComments.ts +0 -88
  193. package/convex/soulDownloads.ts +0 -14
  194. package/convex/soulStars.ts +0 -71
  195. package/convex/souls.ts +0 -570
  196. package/convex/stars.ts +0 -108
  197. package/convex/statsMaintenance.ts +0 -205
  198. package/convex/telemetry.ts +0 -434
  199. package/convex/tokens.ts +0 -88
  200. package/convex/tsconfig.json +0 -7
  201. package/convex/uploads.ts +0 -20
  202. package/convex/users.ts +0 -122
  203. package/convex/webhooks.ts +0 -50
  204. package/convex.json +0 -3
  205. package/docs/README.md +0 -32
  206. package/docs/api.md +0 -51
  207. package/docs/architecture.md +0 -61
  208. package/docs/auth.md +0 -54
  209. package/docs/cli.md +0 -117
  210. package/docs/deploy.md +0 -78
  211. package/docs/diffing.md +0 -84
  212. package/docs/github-import.md +0 -171
  213. package/docs/http-api.md +0 -187
  214. package/docs/manual-testing.md +0 -64
  215. package/docs/mintlify.md +0 -43
  216. package/docs/quickstart.md +0 -120
  217. package/docs/skill-format.md +0 -58
  218. package/docs/soul-format.md +0 -37
  219. package/docs/spec.md +0 -177
  220. package/docs/telemetry.md +0 -91
  221. package/docs/troubleshooting.md +0 -49
  222. package/docs/webhook.md +0 -51
  223. package/e2e/menu-smoke.pw.test.ts +0 -49
  224. package/e2e/pilothub.e2e.test.ts +0 -494
  225. package/e2e/search-exact.pw.test.ts +0 -97
  226. package/packages/pilothub/LICENSE +0 -22
  227. package/packages/pilothub/README.md +0 -57
  228. package/packages/pilothub/package.json +0 -41
  229. package/packages/pilothub/src/browserAuth.test.ts +0 -96
  230. package/packages/pilothub/src/browserAuth.ts +0 -174
  231. package/packages/pilothub/src/cli/buildInfo.ts +0 -94
  232. package/packages/pilothub/src/cli/commands/auth.ts +0 -97
  233. package/packages/pilothub/src/cli/commands/delete.test.ts +0 -73
  234. package/packages/pilothub/src/cli/commands/delete.ts +0 -83
  235. package/packages/pilothub/src/cli/commands/publish.test.ts +0 -122
  236. package/packages/pilothub/src/cli/commands/publish.ts +0 -108
  237. package/packages/pilothub/src/cli/commands/skills.test.ts +0 -191
  238. package/packages/pilothub/src/cli/commands/skills.ts +0 -380
  239. package/packages/pilothub/src/cli/commands/star.ts +0 -46
  240. package/packages/pilothub/src/cli/commands/sync.test.ts +0 -310
  241. package/packages/pilothub/src/cli/commands/sync.ts +0 -200
  242. package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +0 -26
  243. package/packages/pilothub/src/cli/commands/syncHelpers.ts +0 -427
  244. package/packages/pilothub/src/cli/commands/syncTypes.ts +0 -27
  245. package/packages/pilothub/src/cli/commands/unstar.ts +0 -48
  246. package/packages/pilothub/src/cli/helpStyle.ts +0 -45
  247. package/packages/pilothub/src/cli/pilotbotConfig.test.ts +0 -159
  248. package/packages/pilothub/src/cli/pilotbotConfig.ts +0 -147
  249. package/packages/pilothub/src/cli/registry.test.ts +0 -63
  250. package/packages/pilothub/src/cli/registry.ts +0 -43
  251. package/packages/pilothub/src/cli/scanSkills.test.ts +0 -64
  252. package/packages/pilothub/src/cli/scanSkills.ts +0 -84
  253. package/packages/pilothub/src/cli/slug.ts +0 -16
  254. package/packages/pilothub/src/cli/types.ts +0 -12
  255. package/packages/pilothub/src/cli/ui.ts +0 -75
  256. package/packages/pilothub/src/cli.ts +0 -311
  257. package/packages/pilothub/src/config.ts +0 -36
  258. package/packages/pilothub/src/discovery.test.ts +0 -75
  259. package/packages/pilothub/src/discovery.ts +0 -19
  260. package/packages/pilothub/src/http.test.ts +0 -156
  261. package/packages/pilothub/src/http.ts +0 -301
  262. package/packages/pilothub/src/schema/ark.ts +0 -29
  263. package/packages/pilothub/src/schema/index.ts +0 -5
  264. package/packages/pilothub/src/schema/routes.ts +0 -22
  265. package/packages/pilothub/src/schema/schemas.ts +0 -260
  266. package/packages/pilothub/src/schema/textFiles.test.ts +0 -23
  267. package/packages/pilothub/src/schema/textFiles.ts +0 -66
  268. package/packages/pilothub/src/skills.test.ts +0 -191
  269. package/packages/pilothub/src/skills.ts +0 -172
  270. package/packages/pilothub/src/types.ts +0 -10
  271. package/packages/pilothub/tsconfig.json +0 -14
  272. package/packages/schema/README.md +0 -3
  273. package/packages/schema/dist/ark.js.map +0 -1
  274. package/packages/schema/dist/index.js.map +0 -1
  275. package/packages/schema/dist/routes.js.map +0 -1
  276. package/packages/schema/dist/schemas.js.map +0 -1
  277. package/packages/schema/dist/textFiles.js.map +0 -1
  278. package/packages/schema/package.json +0 -26
  279. package/packages/schema/src/ark.ts +0 -29
  280. package/packages/schema/src/index.ts +0 -5
  281. package/packages/schema/src/routes.ts +0 -22
  282. package/packages/schema/src/schemas.test.ts +0 -123
  283. package/packages/schema/src/schemas.ts +0 -287
  284. package/packages/schema/src/textFiles.test.ts +0 -23
  285. package/packages/schema/src/textFiles.ts +0 -66
  286. package/packages/schema/tsconfig.json +0 -15
  287. package/pilothub +0 -46
  288. package/playwright.config.ts +0 -33
  289. package/public/.well-known/pilothub.json +0 -6
  290. package/public/api/v1/openapi.json +0 -379
  291. package/public/favicon.ico +0 -0
  292. package/public/logo192.png +0 -0
  293. package/public/logo512.png +0 -0
  294. package/public/manifest.json +0 -25
  295. package/public/og.png +0 -0
  296. package/public/og.svg +0 -98
  297. package/public/pilot-logo.png +0 -0
  298. package/public/pilot-mark.png +0 -0
  299. package/public/robots.txt +0 -3
  300. package/public/tanstack-circle-logo.png +0 -0
  301. package/public/tanstack-word-logo-white.svg +0 -1
  302. package/scripts/check-peer-deps.ts +0 -56
  303. package/scripts/docs-list.ts +0 -148
  304. package/scripts/run-playwright-local.sh +0 -14
  305. package/server/og/fetchSkillOgMeta.ts +0 -27
  306. package/server/og/fetchSoulOgMeta.ts +0 -27
  307. package/server/og/ogAssets.ts +0 -80
  308. package/server/og/skillOgSvg.test.ts +0 -59
  309. package/server/og/skillOgSvg.ts +0 -258
  310. package/server/og/soulOgSvg.ts +0 -209
  311. package/server/routes/og/skill.png.ts +0 -103
  312. package/server/routes/og/soul.png.ts +0 -111
  313. package/src/__tests__/skill-detail-page.test.tsx +0 -86
  314. package/src/__tests__/skills-index.test.tsx +0 -145
  315. package/src/__tests__/upload.route.test.tsx +0 -228
  316. package/src/components/AppProviders.tsx +0 -19
  317. package/src/components/ClientOnly.tsx +0 -18
  318. package/src/components/Footer.tsx +0 -29
  319. package/src/components/Header.tsx +0 -295
  320. package/src/components/InstallSwitcher.tsx +0 -53
  321. package/src/components/SkillCard.tsx +0 -36
  322. package/src/components/SkillDetailPage.tsx +0 -817
  323. package/src/components/SkillDiffCard.tsx +0 -485
  324. package/src/components/SoulCard.tsx +0 -19
  325. package/src/components/SoulDetailPage.tsx +0 -263
  326. package/src/components/UserBootstrap.tsx +0 -18
  327. package/src/components/ui/dropdown-menu.tsx +0 -67
  328. package/src/components/ui/toggle-group.tsx +0 -35
  329. package/src/convex/client.ts +0 -3
  330. package/src/lib/badges.ts +0 -29
  331. package/src/lib/diffing.test.ts +0 -163
  332. package/src/lib/diffing.ts +0 -106
  333. package/src/lib/gravatar.test.ts +0 -9
  334. package/src/lib/gravatar.ts +0 -158
  335. package/src/lib/og.test.ts +0 -142
  336. package/src/lib/og.ts +0 -156
  337. package/src/lib/publicUser.ts +0 -39
  338. package/src/lib/roles.ts +0 -19
  339. package/src/lib/site.test.ts +0 -130
  340. package/src/lib/site.ts +0 -84
  341. package/src/lib/theme-transition.test.ts +0 -134
  342. package/src/lib/theme-transition.ts +0 -134
  343. package/src/lib/theme.test.tsx +0 -88
  344. package/src/lib/theme.ts +0 -43
  345. package/src/lib/uploadFiles.jsdom.test.ts +0 -33
  346. package/src/lib/uploadFiles.test.ts +0 -123
  347. package/src/lib/uploadFiles.ts +0 -245
  348. package/src/lib/uploadUtils.test.ts +0 -78
  349. package/src/lib/uploadUtils.ts +0 -93
  350. package/src/lib/useAuthStatus.ts +0 -12
  351. package/src/lib/utils.test.ts +0 -9
  352. package/src/lib/utils.ts +0 -6
  353. package/src/logo.svg +0 -12
  354. package/src/routeTree.gen.ts +0 -345
  355. package/src/router.tsx +0 -17
  356. package/src/routes/$owner/$slug.tsx +0 -55
  357. package/src/routes/__root.tsx +0 -136
  358. package/src/routes/admin.tsx +0 -11
  359. package/src/routes/cli/auth.tsx +0 -168
  360. package/src/routes/dashboard.tsx +0 -97
  361. package/src/routes/import.tsx +0 -415
  362. package/src/routes/index.tsx +0 -252
  363. package/src/routes/management.tsx +0 -529
  364. package/src/routes/settings.tsx +0 -203
  365. package/src/routes/skills/index.tsx +0 -422
  366. package/src/routes/souls/$slug.tsx +0 -55
  367. package/src/routes/souls/index.tsx +0 -243
  368. package/src/routes/stars.tsx +0 -68
  369. package/src/routes/u/$handle.tsx +0 -307
  370. package/src/routes/upload/utils.ts +0 -81
  371. package/src/routes/upload.tsx +0 -499
  372. package/src/styles.css +0 -2718
  373. package/tsconfig.json +0 -24
  374. package/tsconfig.oxlint.json +0 -16
  375. package/vercel.json +0 -8
  376. package/vite.config.ts +0 -48
  377. package/vitest.config.ts +0 -47
  378. package/vitest.e2e.config.ts +0 -11
  379. package/vitest.setup.ts +0 -1
  380. /package/{packages/pilothub/bin → bin}/pilothub.js +0 -0
  381. /package/{packages/schema/dist → dist/schema}/ark.d.ts +0 -0
  382. /package/{packages/schema/dist → dist/schema}/ark.js +0 -0
  383. /package/{packages/schema/dist → dist/schema}/index.d.ts +0 -0
  384. /package/{packages/schema/dist → dist/schema}/index.js +0 -0
  385. /package/{packages/schema/dist → dist/schema}/routes.d.ts +0 -0
  386. /package/{packages/schema/dist → dist/schema}/routes.js +0 -0
  387. /package/{packages/schema/dist → dist/schema}/textFiles.d.ts +0 -0
  388. /package/{packages/schema/dist → dist/schema}/textFiles.js +0 -0
@@ -0,0 +1,43 @@
1
+ import { type Lockfile } from './schema/index.js';
2
+ export type SkillOrigin = {
3
+ version: 1;
4
+ registry: string;
5
+ slug: string;
6
+ installedVersion: string;
7
+ installedAt: number;
8
+ };
9
+ export declare function extractZipToDir(zipBytes: Uint8Array, targetDir: string): Promise<void>;
10
+ export declare function listTextFiles(root: string): Promise<{
11
+ relPath: string;
12
+ bytes: Uint8Array;
13
+ contentType?: string;
14
+ }[]>;
15
+ export type SkillFileHash = {
16
+ path: string;
17
+ sha256: string;
18
+ size: number;
19
+ };
20
+ export declare function sha256Hex(bytes: Uint8Array): string;
21
+ export declare function buildSkillFingerprint(files: Array<{
22
+ path: string;
23
+ sha256: string;
24
+ }>): string;
25
+ export declare function hashSkillFiles(files: Array<{
26
+ relPath: string;
27
+ bytes: Uint8Array;
28
+ }>): {
29
+ files: {
30
+ path: string;
31
+ sha256: string;
32
+ size: number;
33
+ }[];
34
+ fingerprint: string;
35
+ };
36
+ export declare function hashSkillZip(zipBytes: Uint8Array): {
37
+ files: SkillFileHash[];
38
+ fingerprint: string;
39
+ };
40
+ export declare function readLockfile(workdir: string): Promise<Lockfile>;
41
+ export declare function writeLockfile(workdir: string, lock: Lockfile): Promise<void>;
42
+ export declare function readSkillOrigin(skillFolder: string): Promise<SkillOrigin | null>;
43
+ export declare function writeSkillOrigin(skillFolder: string, origin: SkillOrigin): Promise<void>;
package/dist/skills.js ADDED
@@ -0,0 +1,163 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { dirname, join, relative, resolve, sep } from 'node:path';
4
+ import { unzipSync } from 'fflate';
5
+ import ignore from 'ignore';
6
+ import mime from 'mime';
7
+ import { LockfileSchema, parseArk, TEXT_FILE_EXTENSION_SET } from './schema/index.js';
8
+ export async function extractZipToDir(zipBytes, targetDir) {
9
+ const entries = unzipSync(zipBytes);
10
+ await mkdir(targetDir, { recursive: true });
11
+ for (const [rawPath, data] of Object.entries(entries)) {
12
+ const safePath = sanitizeRelPath(rawPath);
13
+ if (!safePath)
14
+ continue;
15
+ const outPath = join(targetDir, safePath);
16
+ await mkdir(dirname(outPath), { recursive: true });
17
+ await writeFile(outPath, data);
18
+ }
19
+ }
20
+ export async function listTextFiles(root) {
21
+ const files = [];
22
+ const absRoot = resolve(root);
23
+ const ig = ignore();
24
+ ig.add(['.git/', 'node_modules/', '.pilothub/']);
25
+ await addIgnoreFile(ig, join(absRoot, '.gitignore'));
26
+ await addIgnoreFile(ig, join(absRoot, '.pilothubignore'));
27
+ await walk(absRoot, async (absPath) => {
28
+ const relPath = normalizePath(relative(absRoot, absPath));
29
+ if (!relPath)
30
+ return;
31
+ if (ig.ignores(relPath))
32
+ return;
33
+ const ext = relPath.split('.').at(-1)?.toLowerCase() ?? '';
34
+ if (!ext || !TEXT_FILE_EXTENSION_SET.has(ext))
35
+ return;
36
+ const buffer = await readFile(absPath);
37
+ const contentType = mime.getType(relPath) ?? 'text/plain';
38
+ files.push({ relPath, bytes: new Uint8Array(buffer), contentType });
39
+ });
40
+ return files;
41
+ }
42
+ export function sha256Hex(bytes) {
43
+ return createHash('sha256').update(bytes).digest('hex');
44
+ }
45
+ export function buildSkillFingerprint(files) {
46
+ const normalized = files
47
+ .filter((file) => Boolean(file.path) && Boolean(file.sha256))
48
+ .map((file) => ({ path: file.path, sha256: file.sha256 }))
49
+ .sort((a, b) => a.path.localeCompare(b.path));
50
+ const payload = normalized.map((file) => `${file.path}:${file.sha256}`).join('\n');
51
+ return createHash('sha256').update(payload).digest('hex');
52
+ }
53
+ export function hashSkillFiles(files) {
54
+ const hashed = files.map((file) => ({
55
+ path: file.relPath,
56
+ sha256: sha256Hex(file.bytes),
57
+ size: file.bytes.byteLength,
58
+ }));
59
+ return { files: hashed, fingerprint: buildSkillFingerprint(hashed) };
60
+ }
61
+ export function hashSkillZip(zipBytes) {
62
+ const entries = unzipSync(zipBytes);
63
+ const hashed = Object.entries(entries)
64
+ .map(([rawPath, bytes]) => {
65
+ const safePath = sanitizeZipPath(rawPath);
66
+ if (!safePath)
67
+ return null;
68
+ const ext = safePath.split('.').at(-1)?.toLowerCase() ?? '';
69
+ if (!ext || !TEXT_FILE_EXTENSION_SET.has(ext))
70
+ return null;
71
+ return { path: safePath, sha256: sha256Hex(bytes), size: bytes.byteLength };
72
+ })
73
+ .filter(Boolean);
74
+ return { files: hashed, fingerprint: buildSkillFingerprint(hashed) };
75
+ }
76
+ export async function readLockfile(workdir) {
77
+ const path = join(workdir, '.pilothub', 'lock.json');
78
+ try {
79
+ const raw = await readFile(path, 'utf8');
80
+ const parsed = JSON.parse(raw);
81
+ return parseArk(LockfileSchema, parsed, 'Lockfile');
82
+ }
83
+ catch {
84
+ return { version: 1, skills: {} };
85
+ }
86
+ }
87
+ export async function writeLockfile(workdir, lock) {
88
+ const path = join(workdir, '.pilothub', 'lock.json');
89
+ await mkdir(dirname(path), { recursive: true });
90
+ await writeFile(path, `${JSON.stringify(lock, null, 2)}\n`, 'utf8');
91
+ }
92
+ export async function readSkillOrigin(skillFolder) {
93
+ const path = join(skillFolder, '.pilothub', 'origin.json');
94
+ try {
95
+ const raw = await readFile(path, 'utf8');
96
+ const parsed = JSON.parse(raw);
97
+ if (parsed.version !== 1)
98
+ return null;
99
+ if (!parsed.registry || !parsed.slug || !parsed.installedVersion)
100
+ return null;
101
+ if (typeof parsed.installedAt !== 'number' || !Number.isFinite(parsed.installedAt))
102
+ return null;
103
+ return {
104
+ version: 1,
105
+ registry: String(parsed.registry),
106
+ slug: String(parsed.slug),
107
+ installedVersion: String(parsed.installedVersion),
108
+ installedAt: parsed.installedAt,
109
+ };
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ }
115
+ export async function writeSkillOrigin(skillFolder, origin) {
116
+ const path = join(skillFolder, '.pilothub', 'origin.json');
117
+ await mkdir(dirname(path), { recursive: true });
118
+ await writeFile(path, `${JSON.stringify(origin, null, 2)}\n`, 'utf8');
119
+ }
120
+ function normalizePath(path) {
121
+ return path
122
+ .split(sep)
123
+ .join('/')
124
+ .replace(/^\.\/+/, '');
125
+ }
126
+ function sanitizeRelPath(path) {
127
+ const normalized = path.replace(/^\.\/+/, '').replace(/^\/+/, '');
128
+ if (!normalized || normalized.endsWith('/'))
129
+ return null;
130
+ if (normalized.includes('..') || normalized.includes('\\'))
131
+ return null;
132
+ return normalized;
133
+ }
134
+ function sanitizeZipPath(path) {
135
+ return sanitizeRelPath(path);
136
+ }
137
+ async function walk(dir, onFile) {
138
+ const entries = await readdir(dir, { withFileTypes: true });
139
+ for (const entry of entries) {
140
+ if (entry.name.startsWith('.'))
141
+ continue;
142
+ if (entry.name === 'node_modules')
143
+ continue;
144
+ const full = join(dir, entry.name);
145
+ if (entry.isDirectory()) {
146
+ await walk(full, onFile);
147
+ continue;
148
+ }
149
+ if (!entry.isFile())
150
+ continue;
151
+ await onFile(full);
152
+ }
153
+ }
154
+ async function addIgnoreFile(ig, path) {
155
+ try {
156
+ const raw = await readFile(path, 'utf8');
157
+ ig.add(raw.split(/\r?\n/));
158
+ }
159
+ catch {
160
+ // optional
161
+ }
162
+ }
163
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
1
+ /* @vitest-environment node */
2
+ import { mkdir, mkdtemp, readFile, stat, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { strToU8, zipSync } from 'fflate';
6
+ import { describe, expect, it } from 'vitest';
7
+ import { buildSkillFingerprint, extractZipToDir, hashSkillFiles, hashSkillZip, listTextFiles, readLockfile, readSkillOrigin, sha256Hex, writeLockfile, writeSkillOrigin, } from './skills';
8
+ describe('skills', () => {
9
+ it('extracts zip into directory and skips traversal', async () => {
10
+ const dir = await mkdtemp(join(tmpdir(), 'pilothub-'));
11
+ const zip = zipSync({
12
+ 'SKILL.md': strToU8('hello'),
13
+ '../evil.txt': strToU8('nope'),
14
+ });
15
+ await extractZipToDir(new Uint8Array(zip), dir);
16
+ expect((await readFile(join(dir, 'SKILL.md'), 'utf8')).trim()).toBe('hello');
17
+ await expect(stat(join(dir, '..', 'evil.txt'))).rejects.toBeTruthy();
18
+ });
19
+ it('writes and reads lockfile', async () => {
20
+ const workdir = await mkdtemp(join(tmpdir(), 'pilothub-work-'));
21
+ await writeLockfile(workdir, {
22
+ version: 1,
23
+ skills: { demo: { version: '1.0.0', installedAt: 1 } },
24
+ });
25
+ const read = await readLockfile(workdir);
26
+ expect(read.skills.demo?.version).toBe('1.0.0');
27
+ });
28
+ it('returns empty lockfile on invalid json', async () => {
29
+ const workdir = await mkdtemp(join(tmpdir(), 'pilothub-work-bad-'));
30
+ await mkdir(join(workdir, '.pilothub'), { recursive: true });
31
+ await writeFile(join(workdir, '.pilothub', 'lock.json'), '{', 'utf8');
32
+ const read = await readLockfile(workdir);
33
+ expect(read).toEqual({ version: 1, skills: {} });
34
+ });
35
+ it('returns empty lockfile on schema mismatch', async () => {
36
+ const workdir = await mkdtemp(join(tmpdir(), 'pilothub-work-schema-'));
37
+ await mkdir(join(workdir, '.pilothub'), { recursive: true });
38
+ await writeFile(join(workdir, '.pilothub', 'lock.json'), JSON.stringify({ version: 1, skills: 'nope' }), 'utf8');
39
+ const read = await readLockfile(workdir);
40
+ expect(read).toEqual({ version: 1, skills: {} });
41
+ });
42
+ it('skips dotfiles and node_modules when listing text files', async () => {
43
+ const workdir = await mkdtemp(join(tmpdir(), 'pilothub-files-'));
44
+ await writeFile(join(workdir, 'SKILL.md'), 'hi', 'utf8');
45
+ await writeFile(join(workdir, '.secret.txt'), 'no', 'utf8');
46
+ await mkdir(join(workdir, 'node_modules'), { recursive: true });
47
+ await writeFile(join(workdir, 'node_modules', 'a.txt'), 'no', 'utf8');
48
+ const files = await listTextFiles(workdir);
49
+ expect(files.map((file) => file.relPath)).toEqual(['SKILL.md']);
50
+ });
51
+ it('respects .gitignore and .pilothubignore', async () => {
52
+ const workdir = await mkdtemp(join(tmpdir(), 'pilothub-ignore-'));
53
+ await writeFile(join(workdir, '.gitignore'), 'ignored.md\n', 'utf8');
54
+ await writeFile(join(workdir, '.pilothubignore'), 'private.md\n', 'utf8');
55
+ await writeFile(join(workdir, 'SKILL.md'), 'hi', 'utf8');
56
+ await writeFile(join(workdir, 'ignored.md'), 'no', 'utf8');
57
+ await writeFile(join(workdir, 'private.md'), 'no', 'utf8');
58
+ await writeFile(join(workdir, 'public.json'), '{}', 'utf8');
59
+ const files = await listTextFiles(workdir);
60
+ const paths = files.map((file) => file.relPath).sort();
61
+ expect(paths).toEqual(['SKILL.md', 'public.json']);
62
+ expect(files.find((file) => file.relPath === 'SKILL.md')?.contentType).toMatch(/^text\//);
63
+ expect(files.find((file) => file.relPath === 'public.json')?.contentType).toBe('application/json');
64
+ });
65
+ it('falls back to text/plain for unknown text extensions', async () => {
66
+ const workdir = await mkdtemp(join(tmpdir(), 'pilothub-env-'));
67
+ await writeFile(join(workdir, 'SKILL.md'), 'hi', 'utf8');
68
+ await writeFile(join(workdir, 'config.env'), 'TOKEN=demo', 'utf8');
69
+ const files = await listTextFiles(workdir);
70
+ expect(files.find((file) => file.relPath === 'config.env')?.contentType).toBe('text/plain');
71
+ });
72
+ it('hashes skill files deterministically', async () => {
73
+ const { fingerprint } = hashSkillFiles([
74
+ { relPath: 'b.txt', bytes: strToU8('b') },
75
+ { relPath: 'a.txt', bytes: strToU8('a') },
76
+ ]);
77
+ const expected = buildSkillFingerprint([
78
+ { path: 'a.txt', sha256: sha256Hex(strToU8('a')) },
79
+ { path: 'b.txt', sha256: sha256Hex(strToU8('b')) },
80
+ ]);
81
+ expect(fingerprint).toBe(expected);
82
+ });
83
+ it('hashes text files inside a downloaded zip deterministically', () => {
84
+ const zip = zipSync({
85
+ 'SKILL.md': strToU8('hello'),
86
+ 'notes.md': strToU8('world'),
87
+ 'image.png': strToU8('nope'),
88
+ });
89
+ const { fingerprint } = hashSkillZip(new Uint8Array(zip));
90
+ const expected = buildSkillFingerprint([
91
+ { path: 'SKILL.md', sha256: sha256Hex(strToU8('hello')) },
92
+ { path: 'notes.md', sha256: sha256Hex(strToU8('world')) },
93
+ ]);
94
+ expect(fingerprint).toBe(expected);
95
+ });
96
+ it('ignores unsafe or non-text entries when hashing zips', () => {
97
+ const zip = zipSync({
98
+ 'SKILL.md': strToU8('hello'),
99
+ 'folder/': strToU8(''),
100
+ '../evil.txt': strToU8('nope'),
101
+ 'bad\\path.txt': strToU8('nope'),
102
+ 'image.png': strToU8('nope'),
103
+ });
104
+ const { files } = hashSkillZip(new Uint8Array(zip));
105
+ expect(files).toEqual([{ path: 'SKILL.md', sha256: sha256Hex(strToU8('hello')), size: 5 }]);
106
+ });
107
+ it('builds fingerprints from valid entries only', () => {
108
+ const fingerprint = buildSkillFingerprint([
109
+ { path: '', sha256: '' },
110
+ { path: 'valid.txt', sha256: sha256Hex(strToU8('ok')) },
111
+ ]);
112
+ const expected = buildSkillFingerprint([
113
+ { path: 'valid.txt', sha256: sha256Hex(strToU8('ok')) },
114
+ ]);
115
+ expect(fingerprint).toBe(expected);
116
+ });
117
+ it('returns null for invalid skill origin metadata', async () => {
118
+ const workdir = await mkdtemp(join(tmpdir(), 'pilothub-origin-'));
119
+ expect(await readSkillOrigin(workdir)).toBeNull();
120
+ await mkdir(join(workdir, '.pilothub'), { recursive: true });
121
+ await writeFile(join(workdir, '.pilothub', 'origin.json'), JSON.stringify({ version: 2 }), 'utf8');
122
+ expect(await readSkillOrigin(workdir)).toBeNull();
123
+ await writeFile(join(workdir, '.pilothub', 'origin.json'), JSON.stringify({ version: 1, registry: 'demo', slug: 'x', installedAt: 1 }), 'utf8');
124
+ expect(await readSkillOrigin(workdir)).toBeNull();
125
+ await writeFile(join(workdir, '.pilothub', 'origin.json'), JSON.stringify({
126
+ version: 1,
127
+ registry: 'demo',
128
+ slug: 'x',
129
+ installedVersion: '0.1.0',
130
+ installedAt: 'nope',
131
+ }), 'utf8');
132
+ expect(await readSkillOrigin(workdir)).toBeNull();
133
+ const origin = {
134
+ version: 1,
135
+ registry: 'https://example.com',
136
+ slug: 'demo',
137
+ installedVersion: '1.2.3',
138
+ installedAt: 123,
139
+ };
140
+ await writeSkillOrigin(workdir, origin);
141
+ expect(await readSkillOrigin(workdir)).toEqual(origin);
142
+ });
143
+ });
144
+ //# sourceMappingURL=skills.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.test.js","sourceRoot":"","sources":["../src/skills.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type Lockfile = {
2
+ version: 1;
3
+ skills: Record<string, {
4
+ version: string | null;
5
+ installedAt: number;
6
+ }>;
7
+ };
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,84 +1,41 @@
1
1
  {
2
2
  "name": "pilothub",
3
- "private": false,
4
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
+ "description": "PilotHub CLI \\u2014 install, update, search, and publish agent skills.",
5
+ "license": "MIT",
5
6
  "type": "module",
6
- "workspaces": [
7
- "packages/*"
7
+ "bin": {
8
+ "pilothub": "bin/pilothub.js"
9
+ },
10
+ "files": [
11
+ "bin",
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
8
15
  ],
9
16
  "scripts": {
10
- "preinstall": "bunx only-allow bun",
11
- "dev": "bun --bun vite dev --port 3000",
12
- "build": "bun --bun vite build",
13
- "preview": "bun --bun vite preview",
14
- "docs:list": "bun scripts/docs-list.ts",
15
- "check:peers": "bun scripts/check-peer-deps.ts",
16
- "test": "vitest run",
17
- "test:watch": "vitest",
18
- "test:e2e": "vitest run -c vitest.e2e.config.ts",
19
- "test:e2e:local": "bash scripts/run-playwright-local.sh",
20
- "test:pw": "playwright test",
21
- "coverage": "vitest run --coverage",
22
- "convex:deploy": "bunx convex deploy --typecheck=disable --yes",
23
- "lint": "bun run lint:biome && bun run lint:oxlint",
24
- "lint:biome": "biome check .",
25
- "lint:oxlint": "oxlint --type-aware --tsconfig ./tsconfig.oxlint.json ./src ./convex ./packages/pilothub/src ./packages/schema/src",
26
- "format": "biome format --write ."
17
+ "build": "tsc -p tsconfig.json",
18
+ "dev": "node --enable-source-maps dist/cli.js",
19
+ "prepublishOnly": "npm run build"
27
20
  },
28
21
  "dependencies": {
29
- "@auth/core": "^0.37.4",
30
- "@convex-dev/auth": "^0.0.90",
31
- "@fontsource/bricolage-grotesque": "^5.2.10",
32
- "@fontsource/ibm-plex-mono": "^5.2.7",
33
- "@fontsource/manrope": "^5.2.8",
34
- "@monaco-editor/react": "^4.7.0",
35
- "@radix-ui/react-dropdown-menu": "^2.1.16",
36
- "@radix-ui/react-toggle-group": "^1.1.11",
37
- "@resvg/resvg-wasm": "^2.6.2",
38
- "@tailwindcss/vite": "^4.1.18",
39
- "@tanstack/react-devtools": "^0.9.2",
40
- "@tanstack/react-router": "^1.151.6",
41
- "@tanstack/react-router-devtools": "^1.151.6",
42
- "@tanstack/react-start": "^1.152.0",
43
- "@tanstack/router-plugin": "^1.151.6",
44
- "@vercel/analytics": "^1.6.1",
45
- "pilothub-schema": "0.0.2",
46
- "clsx": "^2.1.1",
47
- "convex": "^1.31.6",
48
- "convex-helpers": "^0.1.111",
22
+ "@clack/prompts": "^0.11.0",
23
+ "arktype": "^2.1.29",
24
+ "commander": "^14.0.2",
49
25
  "fflate": "^0.8.2",
50
- "h3": "2.0.1-rc.8",
51
- "lucide-react": "^0.562.0",
52
- "monaco-editor": "^0.55.1",
53
- "nitro": "^3.0.1-alpha.1",
54
- "react": "^19.2.3",
55
- "react-dom": "^19.2.3",
56
- "react-markdown": "^10.1.0",
57
- "remark-gfm": "^4.0.1",
26
+ "ignore": "^7.0.5",
27
+ "json5": "^2.2.3",
28
+ "mime": "^4.1.0",
29
+ "ora": "^9.0.0",
30
+ "p-retry": "^7.1.1",
58
31
  "semver": "^7.7.3",
59
- "tailwind-merge": "^3.4.0",
60
- "tailwindcss": "^4.1.18",
61
- "vite-tsconfig-paths": "^6.0.4",
62
- "yaml": "^2.8.2"
32
+ "undici": "^7.16.0"
63
33
  },
64
34
  "devDependencies": {
65
- "@biomejs/biome": "^2.3.11",
66
- "@playwright/test": "^1.57.0",
67
- "@tanstack/devtools-vite": "^0.4.1",
68
- "@testing-library/dom": "^10.4.1",
69
- "@testing-library/react": "^16.3.1",
70
35
  "@types/node": "^25.0.9",
71
- "@types/react": "^19.2.8",
72
- "@types/react-dom": "^19.2.3",
73
- "@types/semver": "^7.7.1",
74
- "@vitejs/plugin-react": "^5.1.2",
75
- "@vitest/coverage-v8": "^4.0.17",
76
- "jsdom": "^27.4.0",
77
- "only-allow": "^1.2.1",
78
- "oxlint": "^1.39.0",
79
- "oxlint-tsgolint": "^0.11.1",
80
- "typescript": "^5.9.3",
81
- "vite": "^7.3.1",
82
- "vitest": "^4.0.17"
36
+ "typescript": "^5.9.3"
37
+ },
38
+ "engines": {
39
+ "node": ">=20"
83
40
  }
84
41
  }
@@ -1,19 +0,0 @@
1
- # Frontend
2
- VITE_CONVEX_URL=
3
- VITE_CONVEX_SITE_URL=
4
- VITE_SOULHUB_SITE_URL=
5
- VITE_SOULHUB_HOST=
6
- VITE_SITE_MODE=
7
- SITE_URL=http://localhost:3000
8
- CONVEX_SITE_URL=
9
-
10
- # Convex Auth (GitHub OAuth App)
11
- AUTH_GITHUB_ID=
12
- AUTH_GITHUB_SECRET=
13
-
14
- # Convex Auth JWT keys (generated via @convex-dev/auth CLI)
15
- JWT_PRIVATE_KEY=
16
- JWKS=
17
-
18
- # Embeddings
19
- OPENAI_API_KEY=
@@ -1,40 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
-
8
- jobs:
9
- build:
10
- runs-on: ubuntu-latest
11
- timeout-minutes: 15
12
-
13
- steps:
14
- - uses: actions/checkout@v4
15
-
16
- - uses: oven-sh/setup-bun@v2
17
- with:
18
- bun-version: 1.3.6
19
-
20
- - name: Install
21
- run: bun install --frozen-lockfile
22
- - name: Peer deps
23
- run: bun run check:peers
24
-
25
- - name: Lint
26
- run: bun run lint
27
-
28
- - name: Test
29
- run: bun run test
30
-
31
- - name: Coverage
32
- run: bun run coverage
33
-
34
- - name: Typecheck packages
35
- run: |
36
- bunx tsc -p packages/schema/tsconfig.json --noEmit
37
- bunx tsc -p packages/pilothub/tsconfig.json --noEmit
38
-
39
- - name: Build
40
- run: bun run build
package/.oxlintrc.json DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "ignorePatterns": ["node_modules", "dist", "coverage", "convex/_generated", ".tanstack", "public"]
3
- }
package/AGENTS.md DELETED
@@ -1,45 +0,0 @@
1
- # Repository Guidelines
2
-
3
- ## Project Structure & Module Organization
4
- - `src/` — TanStack Start app code (routes, components, styles).
5
- - `convex/` — Convex backend (schema, queries/mutations/actions, HTTP routes).
6
- - `convex/_generated/` — generated Convex API/types; committed for builds.
7
- - `docs/` — product/spec docs (see `docs/spec.md`).
8
- - `public/` — static assets.
9
-
10
- ## Build, Test, and Development Commands
11
- - `bun run dev` — local app server at `http://localhost:3000`.
12
- - `bun run build` — production build (Vite + Nitro).
13
- - `bun run preview` — preview built app.
14
- - `bunx convex dev` — Convex dev deployment + function watcher.
15
- - `bunx convex codegen` — regenerate `convex/_generated`.
16
- - `bun run lint` — Biome + oxlint (type-aware).
17
- - `bun run test` — Vitest (unit tests).
18
- - `bun run coverage` — coverage run; keep global >= 80%.
19
-
20
- ## Coding Style & Naming Conventions
21
- - TypeScript strict; ESM.
22
- - Indentation: 2 spaces, single quotes (Biome).
23
- - Lint/format: Biome + oxlint (type-aware).
24
- - Convex function names: verb-first (`getBySlug`, `publishVersion`).
25
-
26
- ## Testing Guidelines
27
- - Framework: Vitest 4 + jsdom.
28
- - Tests live in `src/**` and `convex/lib/**`.
29
- - Coverage threshold: 80% global (lines/functions/branches/statements).
30
- - Example: `convex/lib/skills.test.ts`.
31
-
32
- ## Commit & Pull Request Guidelines
33
- - Commit messages: Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`…).
34
- - Keep changes scoped; avoid repo-wide search/replace.
35
- - PRs: include summary + test commands run. Add screenshots for UI changes.
36
-
37
- ## Configuration & Security
38
- - Local env: `.env.local` (never commit secrets).
39
- - Convex env holds JWT keys; Vercel only needs `VITE_CONVEX_URL` + `VITE_CONVEX_SITE_URL`.
40
- - OAuth: GitHub OAuth App credentials required for login.
41
-
42
- ## Convex Ops (Gotchas)
43
- - New Convex functions must be pushed before `convex run`: use `bunx convex dev --once` (dev) or `bunx convex deploy` (prod).
44
- - For non-interactive prod deploys, use `bunx convex deploy -y` to skip confirmation.
45
- - If `bunx convex run --env-file .env.local ...` returns `401 MissingAccessToken` despite `bunx convex login`, workaround: omit `--env-file` and use `--deployment-name <name>` / `--prod`.