pilothub 0.0.1

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 (272) hide show
  1. package/.env.local.example +19 -0
  2. package/.github/workflows/ci.yml +40 -0
  3. package/.oxlintrc.json +3 -0
  4. package/AGENTS.md +45 -0
  5. package/CHANGELOG.md +138 -0
  6. package/DEPRECATIONS.md +7 -0
  7. package/LICENSE +21 -0
  8. package/README.md +150 -0
  9. package/biome.json +41 -0
  10. package/convex/_generated/api.d.ts +153 -0
  11. package/convex/_generated/api.js +23 -0
  12. package/convex/_generated/dataModel.d.ts +60 -0
  13. package/convex/_generated/server.d.ts +143 -0
  14. package/convex/_generated/server.js +93 -0
  15. package/convex/auth.config.ts +8 -0
  16. package/convex/auth.ts +19 -0
  17. package/convex/comments.ts +88 -0
  18. package/convex/crons.ts +34 -0
  19. package/convex/devSeed.ts +459 -0
  20. package/convex/devSeedExtra.ts +541 -0
  21. package/convex/downloads.ts +78 -0
  22. package/convex/githubBackups.ts +170 -0
  23. package/convex/githubBackupsNode.ts +183 -0
  24. package/convex/githubImport.ts +317 -0
  25. package/convex/githubSoulBackups.ts +170 -0
  26. package/convex/githubSoulBackupsNode.ts +186 -0
  27. package/convex/http.ts +194 -0
  28. package/convex/httpApi.handlers.test.ts +488 -0
  29. package/convex/httpApi.test.ts +70 -0
  30. package/convex/httpApi.ts +305 -0
  31. package/convex/httpApiV1.handlers.test.ts +584 -0
  32. package/convex/httpApiV1.ts +1172 -0
  33. package/convex/leaderboards.ts +39 -0
  34. package/convex/lib/access.ts +36 -0
  35. package/convex/lib/apiTokenAuth.ts +36 -0
  36. package/convex/lib/badges.ts +50 -0
  37. package/convex/lib/changelog.test.ts +34 -0
  38. package/convex/lib/changelog.ts +278 -0
  39. package/convex/lib/embeddings.ts +38 -0
  40. package/convex/lib/githubBackup.ts +443 -0
  41. package/convex/lib/githubImport.test.ts +247 -0
  42. package/convex/lib/githubImport.ts +425 -0
  43. package/convex/lib/githubSoulBackup.ts +443 -0
  44. package/convex/lib/leaderboards.ts +103 -0
  45. package/convex/lib/moderation.ts +42 -0
  46. package/convex/lib/public.ts +89 -0
  47. package/convex/lib/searchText.test.ts +46 -0
  48. package/convex/lib/searchText.ts +27 -0
  49. package/convex/lib/skillBackfill.test.ts +34 -0
  50. package/convex/lib/skillBackfill.ts +67 -0
  51. package/convex/lib/skillPublish.test.ts +28 -0
  52. package/convex/lib/skillPublish.ts +284 -0
  53. package/convex/lib/skillStats.ts +80 -0
  54. package/convex/lib/skills.test.ts +197 -0
  55. package/convex/lib/skills.ts +273 -0
  56. package/convex/lib/soulChangelog.ts +273 -0
  57. package/convex/lib/soulPublish.ts +236 -0
  58. package/convex/lib/tokens.test.ts +33 -0
  59. package/convex/lib/tokens.ts +51 -0
  60. package/convex/lib/webhooks.test.ts +91 -0
  61. package/convex/lib/webhooks.ts +112 -0
  62. package/convex/maintenance.test.ts +270 -0
  63. package/convex/maintenance.ts +840 -0
  64. package/convex/rateLimits.ts +50 -0
  65. package/convex/schema.ts +472 -0
  66. package/convex/search.test.ts +12 -0
  67. package/convex/search.ts +254 -0
  68. package/convex/seed.test.ts +37 -0
  69. package/convex/seed.ts +254 -0
  70. package/convex/seedSouls.ts +111 -0
  71. package/convex/skillStatEvents.ts +568 -0
  72. package/convex/skills.ts +1606 -0
  73. package/convex/soulComments.ts +88 -0
  74. package/convex/soulDownloads.ts +14 -0
  75. package/convex/soulStars.ts +71 -0
  76. package/convex/souls.ts +570 -0
  77. package/convex/stars.ts +108 -0
  78. package/convex/statsMaintenance.ts +205 -0
  79. package/convex/telemetry.ts +434 -0
  80. package/convex/tokens.ts +88 -0
  81. package/convex/tsconfig.json +7 -0
  82. package/convex/uploads.ts +20 -0
  83. package/convex/users.ts +122 -0
  84. package/convex/webhooks.ts +50 -0
  85. package/convex.json +3 -0
  86. package/docs/README.md +32 -0
  87. package/docs/api.md +51 -0
  88. package/docs/architecture.md +61 -0
  89. package/docs/auth.md +54 -0
  90. package/docs/cli.md +117 -0
  91. package/docs/deploy.md +78 -0
  92. package/docs/diffing.md +84 -0
  93. package/docs/github-import.md +171 -0
  94. package/docs/http-api.md +187 -0
  95. package/docs/manual-testing.md +64 -0
  96. package/docs/mintlify.md +43 -0
  97. package/docs/quickstart.md +120 -0
  98. package/docs/skill-format.md +58 -0
  99. package/docs/soul-format.md +37 -0
  100. package/docs/spec.md +177 -0
  101. package/docs/telemetry.md +91 -0
  102. package/docs/troubleshooting.md +49 -0
  103. package/docs/webhook.md +51 -0
  104. package/e2e/menu-smoke.pw.test.ts +49 -0
  105. package/e2e/pilothub.e2e.test.ts +494 -0
  106. package/e2e/search-exact.pw.test.ts +97 -0
  107. package/package.json +84 -0
  108. package/packages/pilothub/LICENSE +22 -0
  109. package/packages/pilothub/README.md +57 -0
  110. package/packages/pilothub/bin/pilothub.js +2 -0
  111. package/packages/pilothub/package.json +41 -0
  112. package/packages/pilothub/src/browserAuth.test.ts +96 -0
  113. package/packages/pilothub/src/browserAuth.ts +174 -0
  114. package/packages/pilothub/src/cli/buildInfo.ts +94 -0
  115. package/packages/pilothub/src/cli/commands/auth.ts +97 -0
  116. package/packages/pilothub/src/cli/commands/delete.test.ts +73 -0
  117. package/packages/pilothub/src/cli/commands/delete.ts +83 -0
  118. package/packages/pilothub/src/cli/commands/publish.test.ts +122 -0
  119. package/packages/pilothub/src/cli/commands/publish.ts +108 -0
  120. package/packages/pilothub/src/cli/commands/skills.test.ts +191 -0
  121. package/packages/pilothub/src/cli/commands/skills.ts +380 -0
  122. package/packages/pilothub/src/cli/commands/star.ts +46 -0
  123. package/packages/pilothub/src/cli/commands/sync.test.ts +310 -0
  124. package/packages/pilothub/src/cli/commands/sync.ts +200 -0
  125. package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +26 -0
  126. package/packages/pilothub/src/cli/commands/syncHelpers.ts +427 -0
  127. package/packages/pilothub/src/cli/commands/syncTypes.ts +27 -0
  128. package/packages/pilothub/src/cli/commands/unstar.ts +48 -0
  129. package/packages/pilothub/src/cli/helpStyle.ts +45 -0
  130. package/packages/pilothub/src/cli/pilotbotConfig.test.ts +159 -0
  131. package/packages/pilothub/src/cli/pilotbotConfig.ts +147 -0
  132. package/packages/pilothub/src/cli/registry.test.ts +63 -0
  133. package/packages/pilothub/src/cli/registry.ts +43 -0
  134. package/packages/pilothub/src/cli/scanSkills.test.ts +64 -0
  135. package/packages/pilothub/src/cli/scanSkills.ts +84 -0
  136. package/packages/pilothub/src/cli/slug.ts +16 -0
  137. package/packages/pilothub/src/cli/types.ts +12 -0
  138. package/packages/pilothub/src/cli/ui.ts +75 -0
  139. package/packages/pilothub/src/cli.ts +311 -0
  140. package/packages/pilothub/src/config.ts +36 -0
  141. package/packages/pilothub/src/discovery.test.ts +75 -0
  142. package/packages/pilothub/src/discovery.ts +19 -0
  143. package/packages/pilothub/src/http.test.ts +156 -0
  144. package/packages/pilothub/src/http.ts +301 -0
  145. package/packages/pilothub/src/schema/ark.ts +29 -0
  146. package/packages/pilothub/src/schema/index.ts +5 -0
  147. package/packages/pilothub/src/schema/routes.ts +22 -0
  148. package/packages/pilothub/src/schema/schemas.ts +260 -0
  149. package/packages/pilothub/src/schema/textFiles.test.ts +23 -0
  150. package/packages/pilothub/src/schema/textFiles.ts +66 -0
  151. package/packages/pilothub/src/skills.test.ts +191 -0
  152. package/packages/pilothub/src/skills.ts +172 -0
  153. package/packages/pilothub/src/types.ts +10 -0
  154. package/packages/pilothub/tsconfig.json +14 -0
  155. package/packages/schema/README.md +3 -0
  156. package/packages/schema/dist/ark.d.ts +4 -0
  157. package/packages/schema/dist/ark.js +26 -0
  158. package/packages/schema/dist/ark.js.map +1 -0
  159. package/packages/schema/dist/index.d.ts +5 -0
  160. package/packages/schema/dist/index.js +5 -0
  161. package/packages/schema/dist/index.js.map +1 -0
  162. package/packages/schema/dist/routes.d.ts +21 -0
  163. package/packages/schema/dist/routes.js +22 -0
  164. package/packages/schema/dist/routes.js.map +1 -0
  165. package/packages/schema/dist/schemas.d.ts +297 -0
  166. package/packages/schema/dist/schemas.js +243 -0
  167. package/packages/schema/dist/schemas.js.map +1 -0
  168. package/packages/schema/dist/textFiles.d.ts +5 -0
  169. package/packages/schema/dist/textFiles.js +66 -0
  170. package/packages/schema/dist/textFiles.js.map +1 -0
  171. package/packages/schema/package.json +26 -0
  172. package/packages/schema/src/ark.ts +29 -0
  173. package/packages/schema/src/index.ts +5 -0
  174. package/packages/schema/src/routes.ts +22 -0
  175. package/packages/schema/src/schemas.test.ts +123 -0
  176. package/packages/schema/src/schemas.ts +287 -0
  177. package/packages/schema/src/textFiles.test.ts +23 -0
  178. package/packages/schema/src/textFiles.ts +66 -0
  179. package/packages/schema/tsconfig.json +15 -0
  180. package/pilothub +46 -0
  181. package/playwright.config.ts +33 -0
  182. package/public/.well-known/pilothub.json +6 -0
  183. package/public/api/v1/openapi.json +379 -0
  184. package/public/favicon.ico +0 -0
  185. package/public/logo192.png +0 -0
  186. package/public/logo512.png +0 -0
  187. package/public/manifest.json +25 -0
  188. package/public/og.png +0 -0
  189. package/public/og.svg +98 -0
  190. package/public/pilot-logo.png +0 -0
  191. package/public/pilot-mark.png +0 -0
  192. package/public/robots.txt +3 -0
  193. package/public/tanstack-circle-logo.png +0 -0
  194. package/public/tanstack-word-logo-white.svg +1 -0
  195. package/scripts/check-peer-deps.ts +56 -0
  196. package/scripts/docs-list.ts +148 -0
  197. package/scripts/run-playwright-local.sh +14 -0
  198. package/server/og/fetchSkillOgMeta.ts +27 -0
  199. package/server/og/fetchSoulOgMeta.ts +27 -0
  200. package/server/og/ogAssets.ts +80 -0
  201. package/server/og/skillOgSvg.test.ts +59 -0
  202. package/server/og/skillOgSvg.ts +258 -0
  203. package/server/og/soulOgSvg.ts +209 -0
  204. package/server/routes/og/skill.png.ts +103 -0
  205. package/server/routes/og/soul.png.ts +111 -0
  206. package/src/__tests__/skill-detail-page.test.tsx +86 -0
  207. package/src/__tests__/skills-index.test.tsx +145 -0
  208. package/src/__tests__/upload.route.test.tsx +228 -0
  209. package/src/components/AppProviders.tsx +19 -0
  210. package/src/components/ClientOnly.tsx +18 -0
  211. package/src/components/Footer.tsx +29 -0
  212. package/src/components/Header.tsx +295 -0
  213. package/src/components/InstallSwitcher.tsx +53 -0
  214. package/src/components/SkillCard.tsx +36 -0
  215. package/src/components/SkillDetailPage.tsx +817 -0
  216. package/src/components/SkillDiffCard.tsx +485 -0
  217. package/src/components/SoulCard.tsx +19 -0
  218. package/src/components/SoulDetailPage.tsx +263 -0
  219. package/src/components/UserBootstrap.tsx +18 -0
  220. package/src/components/ui/dropdown-menu.tsx +67 -0
  221. package/src/components/ui/toggle-group.tsx +35 -0
  222. package/src/convex/client.ts +3 -0
  223. package/src/lib/badges.ts +29 -0
  224. package/src/lib/diffing.test.ts +163 -0
  225. package/src/lib/diffing.ts +106 -0
  226. package/src/lib/gravatar.test.ts +9 -0
  227. package/src/lib/gravatar.ts +158 -0
  228. package/src/lib/og.test.ts +142 -0
  229. package/src/lib/og.ts +156 -0
  230. package/src/lib/publicUser.ts +39 -0
  231. package/src/lib/roles.ts +19 -0
  232. package/src/lib/site.test.ts +130 -0
  233. package/src/lib/site.ts +84 -0
  234. package/src/lib/theme-transition.test.ts +134 -0
  235. package/src/lib/theme-transition.ts +134 -0
  236. package/src/lib/theme.test.tsx +88 -0
  237. package/src/lib/theme.ts +43 -0
  238. package/src/lib/uploadFiles.jsdom.test.ts +33 -0
  239. package/src/lib/uploadFiles.test.ts +123 -0
  240. package/src/lib/uploadFiles.ts +245 -0
  241. package/src/lib/uploadUtils.test.ts +78 -0
  242. package/src/lib/uploadUtils.ts +93 -0
  243. package/src/lib/useAuthStatus.ts +12 -0
  244. package/src/lib/utils.test.ts +9 -0
  245. package/src/lib/utils.ts +6 -0
  246. package/src/logo.svg +12 -0
  247. package/src/routeTree.gen.ts +345 -0
  248. package/src/router.tsx +17 -0
  249. package/src/routes/$owner/$slug.tsx +55 -0
  250. package/src/routes/__root.tsx +136 -0
  251. package/src/routes/admin.tsx +11 -0
  252. package/src/routes/cli/auth.tsx +168 -0
  253. package/src/routes/dashboard.tsx +97 -0
  254. package/src/routes/import.tsx +415 -0
  255. package/src/routes/index.tsx +252 -0
  256. package/src/routes/management.tsx +529 -0
  257. package/src/routes/settings.tsx +203 -0
  258. package/src/routes/skills/index.tsx +422 -0
  259. package/src/routes/souls/$slug.tsx +55 -0
  260. package/src/routes/souls/index.tsx +243 -0
  261. package/src/routes/stars.tsx +68 -0
  262. package/src/routes/u/$handle.tsx +307 -0
  263. package/src/routes/upload/utils.ts +81 -0
  264. package/src/routes/upload.tsx +499 -0
  265. package/src/styles.css +2718 -0
  266. package/tsconfig.json +24 -0
  267. package/tsconfig.oxlint.json +16 -0
  268. package/vercel.json +8 -0
  269. package/vite.config.ts +48 -0
  270. package/vitest.config.ts +47 -0
  271. package/vitest.e2e.config.ts +11 -0
  272. package/vitest.setup.ts +1 -0
@@ -0,0 +1,19 @@
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=
@@ -0,0 +1,40 @@
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 ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "ignorePatterns": ["node_modules", "dist", "coverage", "convex/_generated", ".tanstack", "public"]
3
+ }
package/AGENTS.md ADDED
@@ -0,0 +1,45 @@
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`.
package/CHANGELOG.md ADDED
@@ -0,0 +1,138 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ### Added
6
+ - Web: show published skills on user profiles (thanks @njoylab, #20).
7
+
8
+ ### Fixed
9
+ - Registry: drop missing skills during search hydration (thanks @aaronn, #28).
10
+ - CLI: use path-based skill metadata lookup for updates (thanks @daveonkels, #22).
11
+ - Search: keep highlighted-only filtering and clamp vector candidates to Convex limits (thanks @aaronn, #30).
12
+
13
+ ## 0.3.0 - 2026-01-19
14
+
15
+ ### Added
16
+ - CLI: add `explore` command for latest updates, with limit clamping + tests/docs (thanks @jdrhyne, #14).
17
+ - CLI: `explore --json` output + new sorts (`installs`, `installsAllTime`, `trending`) and limit up to 200.
18
+ - API: `/api/v1/skills` supports installs + trending sorts (7-day installs).
19
+ - API: idempotent `POST/DELETE /api/v1/stars/{slug}` endpoints.
20
+ - Registry: trending leaderboard + daily stats backfill for installs-based sorts.
21
+
22
+ ### Fixed
23
+ - Web: keep search mode navigation and state in sync (thanks @NACC96, #12).
24
+
25
+ ## 0.2.0 - 2026-01-13
26
+
27
+ ### Added
28
+ - Web: dynamic OG image cards for skills (name, description, version).
29
+ - CLI: auto-scan Pilotbot skill roots (per-agent workspaces, shared skills, extraDirs).
30
+ - Web: import skills from public GitHub URLs (auto-detect `SKILL.md`, smart file selection, provenance).
31
+ - Web/API: SoulHub (SOUL.md registry) with v1 endpoints and first-run auto-seed.
32
+
33
+ ### Fixed
34
+ - Web: stabilize skill OG image generation on server runtimes.
35
+ - Web: prevent skill OG text overflow outside the card.
36
+ - Registry: make SoulHub auto-seed idempotent and non-user-owned.
37
+ - Registry: keep GitHub backup state + publish backups intact (thanks @joshp123, #1).
38
+ - CLI/Registry: restore fork lineage on sync + clamp bulk list queries (thanks @joshp123, #1).
39
+ - CLI: default workdir falls back to Pilotbot workspace (override with `--workdir` / `PILOTHUB_WORKDIR`).
40
+
41
+ ## 0.0.6 - 2026-01-07
42
+
43
+
44
+ ### Added
45
+ - API: v1 public REST endpoints with rate limits, raw file fetch, and OpenAPI spec.
46
+ - Docs: `docs/api.md` and `DEPRECATIONS.md` for the v1 cutover plan.
47
+
48
+ ### Changed
49
+ - CLI: publish now uses single multipart `POST /api/v1/skills`.
50
+ - Registry: legacy `/api/*` + `/api/cli/*` marked for deprecation (kept for now).
51
+
52
+ ## 0.0.5 - 2026-01-06
53
+
54
+ ### Added
55
+ - Telemetry: track installs via `pilothub sync` (logged-in only), per root, with 120-day staleness.
56
+ - Skills: show current + all-time installs; sort by installs.
57
+ - Profile: private "Installed" tab with JSON export + delete telemetry controls.
58
+ - Docs: add `docs/telemetry.md` (what we track + how to opt out).
59
+ - Web: custom Open Graph image (`/og.png`) + richer OG/Twitter tags.
60
+ - Web: dashboard for managing your published skills (thanks @dbhurley!).
61
+
62
+ ### Changed
63
+ - CLI: telemetry opt-out via `PILOTHUB_DISABLE_TELEMETRY=1`.
64
+ - Web: move theme picker into mobile menu.
65
+
66
+ ### Fixed
67
+ - Web: handle shorthand hex colors in diff theme (thanks @dbhurley!).
68
+
69
+ ## 0.0.5 - 2026-01-06
70
+
71
+ ### Added
72
+ - Maintenance: admin backfill to re-parse `SKILL.md` and repair stored summaries/parsed metadata.
73
+
74
+ ### Fixed
75
+ - CLI sync: ignore plural `skills.md` docs files when scanning for skills.
76
+ - Registry: parse YAML frontmatter (incl multiline `description`) and accept YAML `metadata` objects.
77
+
78
+ ## 0.0.4 - 2026-01-05
79
+
80
+ ### Added
81
+ - Web: `/skills` list view with sorting (newest/downloads/stars/name) + quick filter.
82
+ - Web: admin/moderator highlight toggle on skill detail.
83
+ - Web: canonical skill URLs as `/<owner>/<slug>` (legacy `/skills/<slug>` redirects).
84
+ - Web: upload auto-generates a changelog via OpenAI when left blank (marked as auto-generated).
85
+
86
+ ### Fixed
87
+ - Web: skill detail shows a loading state instead of flashing "Skill not found".
88
+ - Web: user profile shows avatar + loading state (no "User not found" flash).
89
+ - Web: improved mobile responsiveness (nav menu, skill detail layout, install command overflow).
90
+ - Web: upload now unwraps folder picks so `SKILL.md` can be at the bundle root.
91
+ - Registry: cap embedding payload size to avoid model context errors.
92
+ - CLI: ignore legacy `auth.pilothub.com` registry and prefer site discovery.
93
+
94
+ ### Changed
95
+ - Web: homepage search now expands into full search mode with live results + highlighted toggle.
96
+ - CLI: sync no longer prompts for changelog; registry auto-generates when blank.
97
+
98
+ ## 0.0.3 - 2026-01-04
99
+
100
+ ### Added
101
+ - CLI sync: concurrency flag to limit registry checks.
102
+ - Home: install command switcher (npm/pnpm/bun).
103
+
104
+ ### Changed
105
+ - CLI sync: default `--concurrency` is now 4 (was 8).
106
+ - CLI sync: replace boxed notes with plain output for long lists.
107
+
108
+ ### Fixed
109
+ - CLI sync: wrap note output to avoid terminal overflow; cap list lengths.
110
+ - CLI sync: label fallback scans as fallback locations.
111
+ - CLI package: bundle schema internally (no external `pilothub-schema` publish).
112
+ - Repo: mark `pilothub-schema` as private to prevent publishing.
113
+
114
+ ## 0.0.2 - 2026-01-04
115
+
116
+ ### Added
117
+ - CLI: delete/undelete commands for soft-deleted skills (owner/admin).
118
+
119
+ ### Fixed
120
+ - CLI sync: dedupe duplicate slugs across scan roots; skip duplicates to avoid double-publish errors.
121
+ - CLI sync: show parsing progress while hashing local skills.
122
+ - CLI sync: prompt only actionable skills; preselect all by default; list synced separately; condensed synced summary when nothing to sync.
123
+ - CLI sync: cap long status lists to avoid massive terminal boxes.
124
+ - CLI publish/sync: allow empty changelog on updates; registry accepts empty changelog for updates.
125
+ - CLI: use `--cli-version` to avoid conflict with skill `--version` flags.
126
+ - Registry: hide soft-deleted skills from search/skill/download unless restored.
127
+ - Tests: add delete/undelete coverage (unit + e2e).
128
+
129
+ ## 0.0.1 - 2026-01-04
130
+
131
+ ### Features
132
+ - CLI auth: login/logout/whoami; browser loopback auth; token storage; site/registry discovery; config overrides.
133
+ - CLI workflow: search, install, update (single/all), list, publish, sync (scan workdir + legacy roots), dry-run, version bumping, tags.
134
+ - Registry/API: skills + versions with semver; tags (latest + custom); changelog per version; SKILL.md frontmatter parsing; text-only validation; zip download; hash resolve; stats (downloads/stars/versions/comments).
135
+ - Web app: home (highlighted + latest), search, skill detail (README, versions, tags, stats, files), upload UI, user profiles, stars, settings (profile + API tokens + delete account).
136
+ - Social: stars + comments with moderation hooks; admin console for roles + highlighted curation.
137
+ - Search: semantic/vector search over skill content with limit/approved filters.
138
+ - Security: GitHub OAuth; role-based access (admin/moderator/user); audit logging for admin actions.
@@ -0,0 +1,7 @@
1
+ # Deprecations
2
+
3
+ ## Legacy /api routes (pre-v1)
4
+
5
+ - Deprecated: 2026-01-07
6
+ - TODO: remove legacy `/api/*` and `/api/cli/*` routes after clients migrate to `/api/v1`.
7
+ - Legacy handlers live in `convex/http.ts` and `convex/httpApi.ts`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Peter Steinberger
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # PilotHub
2
+
3
+ <p align="center">
4
+ <a href="https://github.com/pilotbot/pilothub/actions/workflows/ci.yml?branch=main"><img src="https://img.shields.io/github/actions/workflow/status/pilotbot/pilothub/ci.yml?branch=main&style=for-the-badge" alt="CI status"></a>
5
+ <a href="https://discord.gg/pilot"><img src="https://img.shields.io/discord/1456350064065904867?label=Discord&logo=discord&logoColor=white&color=5865F2&style=for-the-badge" alt="Discord"></a>
6
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
7
+ </p>
8
+
9
+ PilotHub is the **public skill registry for Pilotbot**: publish, version, and search text-based agent skills (a `SKILL.md` plus supporting files).
10
+ It’s designed for fast browsing + a CLI-friendly API, with moderation hooks and vector search.
11
+
12
+ onlycrabs.ai is the **SOUL.md registry**: publish and share system lore the same way you publish skills.
13
+
14
+ Live: `https://pilothub.com`
15
+ onlycrabs.ai: `https://onlycrabs.ai`
16
+
17
+ ## What you can do
18
+
19
+ - Browse skills + render their `SKILL.md`.
20
+ - Publish new skill versions with changelogs + tags (including `latest`).
21
+ - Browse souls + render their `SOUL.md`.
22
+ - Publish new soul versions with changelogs + tags.
23
+ - Search via embeddings (vector index) instead of brittle keywords.
24
+ - Star + comment; admins/mods can curate and approve skills.
25
+
26
+ ## onlycrabs.ai (SOUL.md registry)
27
+
28
+ - Entry point is host-based: `onlycrabs.ai`.
29
+ - On the onlycrabs.ai host, the home page and nav default to souls.
30
+ - On PilotHub, souls live under `/souls`.
31
+ - Soul bundles only accept `SOUL.md` for now (no extra files).
32
+
33
+ ## How it works (high level)
34
+
35
+ - Web app: TanStack Start (React, Vite/Nitro).
36
+ - Backend: Convex (DB + file storage + HTTP actions) + Convex Auth (GitHub OAuth).
37
+ - Search: OpenAI embeddings (`text-embedding-3-small`) + Convex vector search.
38
+ - API schema + routes: `packages/schema` (`pilothub-schema`).
39
+
40
+ ## Telemetry
41
+
42
+ PilotHub tracks minimal **install telemetry** (to compute install counts) when you run `pilothub sync` while logged in.
43
+ Disable via:
44
+
45
+ ```bash
46
+ export PILOTHUB_DISABLE_TELEMETRY=1
47
+ ```
48
+
49
+ Details: `docs/telemetry.md`.
50
+
51
+ ## Repo layout
52
+
53
+ - `src/` — TanStack Start app (routes, components, styles).
54
+ - `convex/` — schema + queries/mutations/actions + HTTP API routes.
55
+ - `packages/schema/` — shared API types/routes for the CLI and app.
56
+ - `docs/spec.md` — product + implementation spec (good first read).
57
+
58
+ ## Local dev
59
+
60
+ Prereqs: Bun + Convex CLI.
61
+
62
+ ```bash
63
+ bun install
64
+ cp .env.local.example .env.local
65
+
66
+ # terminal A: web app
67
+ bun run dev
68
+
69
+ # terminal B: Convex dev deployment
70
+ bunx convex dev
71
+ ```
72
+
73
+ ## Auth (GitHub OAuth) setup
74
+
75
+ Create a GitHub OAuth App, set `AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`, then:
76
+
77
+ ```bash
78
+ bunx auth --deployment-name <deployment> --web-server-url http://localhost:3000
79
+ ```
80
+
81
+ This writes `JWT_PRIVATE_KEY` + `JWKS` to the deployment and prints values for your local `.env.local`.
82
+
83
+ ## Environment
84
+
85
+ - `VITE_CONVEX_URL`: Convex deployment URL (`https://<deployment>.convex.cloud`).
86
+ - `VITE_CONVEX_SITE_URL`: Convex site URL (`https://<deployment>.convex.site`).
87
+ - `VITE_SOULHUB_SITE_URL`: onlycrabs.ai site URL (`https://onlycrabs.ai`).
88
+ - `VITE_SOULHUB_HOST`: onlycrabs.ai host match (`onlycrabs.ai`).
89
+ - `VITE_SITE_MODE`: Optional override (`skills` or `souls`) for SSR builds.
90
+ - `CONVEX_SITE_URL`: same as `VITE_CONVEX_SITE_URL` (auth + cookies).
91
+ - `SITE_URL`: App URL (local: `http://localhost:3000`).
92
+ - `AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`: GitHub OAuth App.
93
+ - `JWT_PRIVATE_KEY` / `JWKS`: Convex Auth keys.
94
+ - `OPENAI_API_KEY`: embeddings for search + indexing.
95
+
96
+ ## Nix plugins (nixmode skills)
97
+
98
+ PilotHub can store a nix-pilotbot plugin pointer in SKILL frontmatter so the registry knows which
99
+ Nix package bundle to install. A nix plugin is different from a regular skill pack: it bundles the
100
+ skill pack, the CLI binary, and its config flags/requirements together.
101
+
102
+ Add this to `SKILL.md`:
103
+
104
+ ```yaml
105
+ ---
106
+ name: peekaboo
107
+ description: Capture and automate macOS UI with the Peekaboo CLI.
108
+ metadata: {"pilotbot":{"nix":{"plugin":"github:pilotbot/nix-steipete-tools?dir=tools/peekaboo","systems":["aarch64-darwin"]}}}
109
+ ---
110
+ ```
111
+
112
+ Install via nix-pilotbot:
113
+
114
+ ```nix
115
+ programs.pilotbot.plugins = [
116
+ { source = "github:pilotbot/nix-steipete-tools?dir=tools/peekaboo"; }
117
+ ];
118
+ ```
119
+
120
+ You can also declare config requirements + an example snippet:
121
+
122
+ ```yaml
123
+ ---
124
+ name: padel
125
+ description: Check padel court availability and manage bookings via Playtomic.
126
+ metadata: {"pilotbot":{"config":{"requiredEnv":["PADEL_AUTH_FILE"],"stateDirs":[".config/padel"],"example":"config = { env = { PADEL_AUTH_FILE = \\\"/run/agenix/padel-auth\\\"; }; };"}}}
127
+ ---
128
+ ```
129
+
130
+ To show CLI help (recommended for nix plugins), include the `cli --help` output:
131
+
132
+ ```yaml
133
+ ---
134
+ name: padel
135
+ description: Check padel court availability and manage bookings via Playtomic.
136
+ metadata: {"pilotbot":{"cliHelp":"padel --help\\nUsage: padel [command]\\n"}}
137
+ ---
138
+ ```
139
+
140
+ `metadata.pilotbot` is preferred, but `metadata.pilotbot` is accepted as an alias for compatibility.
141
+
142
+ ## Scripts
143
+
144
+ ```bash
145
+ bun run dev
146
+ bun run build
147
+ bun run test
148
+ bun run coverage
149
+ bun run lint
150
+ ```
package/biome.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json",
3
+ "files": {
4
+ "includes": [
5
+ "**",
6
+ "!**/.cta.json",
7
+ "!**/.vscode",
8
+ "!**/node_modules",
9
+ "!**/dist",
10
+ "!**/.output",
11
+ "!**/coverage",
12
+ "!**/convex/_generated",
13
+ "!**/test-results",
14
+ "!**/src/routeTree.gen.ts",
15
+ "!**/.tanstack",
16
+ "!**/public",
17
+ "!**/.devenv",
18
+ "!**/.devenv"
19
+ ]
20
+ },
21
+ "assist": { "actions": { "source": { "organizeImports": "on" } } },
22
+ "formatter": {
23
+ "enabled": true,
24
+ "indentStyle": "space",
25
+ "indentWidth": 2,
26
+ "lineWidth": 100
27
+ },
28
+ "linter": {
29
+ "enabled": true,
30
+ "rules": {
31
+ "recommended": true
32
+ }
33
+ },
34
+ "javascript": {
35
+ "formatter": {
36
+ "quoteStyle": "single",
37
+ "semicolons": "asNeeded",
38
+ "trailingCommas": "all"
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,153 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * Generated `api` utility.
4
+ *
5
+ * THIS CODE IS AUTOMATICALLY GENERATED.
6
+ *
7
+ * To regenerate, run `npx convex dev`.
8
+ * @module
9
+ */
10
+
11
+ import type * as auth from "../auth.js";
12
+ import type * as comments from "../comments.js";
13
+ import type * as crons from "../crons.js";
14
+ import type * as devSeed from "../devSeed.js";
15
+ import type * as devSeedExtra from "../devSeedExtra.js";
16
+ import type * as downloads from "../downloads.js";
17
+ import type * as githubBackups from "../githubBackups.js";
18
+ import type * as githubBackupsNode from "../githubBackupsNode.js";
19
+ import type * as githubImport from "../githubImport.js";
20
+ import type * as githubSoulBackups from "../githubSoulBackups.js";
21
+ import type * as githubSoulBackupsNode from "../githubSoulBackupsNode.js";
22
+ import type * as http from "../http.js";
23
+ import type * as httpApi from "../httpApi.js";
24
+ import type * as httpApiV1 from "../httpApiV1.js";
25
+ import type * as leaderboards from "../leaderboards.js";
26
+ import type * as lib_access from "../lib/access.js";
27
+ import type * as lib_apiTokenAuth from "../lib/apiTokenAuth.js";
28
+ import type * as lib_badges from "../lib/badges.js";
29
+ import type * as lib_changelog from "../lib/changelog.js";
30
+ import type * as lib_embeddings from "../lib/embeddings.js";
31
+ import type * as lib_githubBackup from "../lib/githubBackup.js";
32
+ import type * as lib_githubImport from "../lib/githubImport.js";
33
+ import type * as lib_githubSoulBackup from "../lib/githubSoulBackup.js";
34
+ import type * as lib_leaderboards from "../lib/leaderboards.js";
35
+ import type * as lib_moderation from "../lib/moderation.js";
36
+ import type * as lib_public from "../lib/public.js";
37
+ import type * as lib_searchText from "../lib/searchText.js";
38
+ import type * as lib_skillBackfill from "../lib/skillBackfill.js";
39
+ import type * as lib_skillPublish from "../lib/skillPublish.js";
40
+ import type * as lib_skillStats from "../lib/skillStats.js";
41
+ import type * as lib_skills from "../lib/skills.js";
42
+ import type * as lib_soulChangelog from "../lib/soulChangelog.js";
43
+ import type * as lib_soulPublish from "../lib/soulPublish.js";
44
+ import type * as lib_tokens from "../lib/tokens.js";
45
+ import type * as lib_webhooks from "../lib/webhooks.js";
46
+ import type * as maintenance from "../maintenance.js";
47
+ import type * as rateLimits from "../rateLimits.js";
48
+ import type * as search from "../search.js";
49
+ import type * as seed from "../seed.js";
50
+ import type * as seedSouls from "../seedSouls.js";
51
+ import type * as skillStatEvents from "../skillStatEvents.js";
52
+ import type * as skills from "../skills.js";
53
+ import type * as soulComments from "../soulComments.js";
54
+ import type * as soulDownloads from "../soulDownloads.js";
55
+ import type * as soulStars from "../soulStars.js";
56
+ import type * as souls from "../souls.js";
57
+ import type * as stars from "../stars.js";
58
+ import type * as statsMaintenance from "../statsMaintenance.js";
59
+ import type * as telemetry from "../telemetry.js";
60
+ import type * as tokens from "../tokens.js";
61
+ import type * as uploads from "../uploads.js";
62
+ import type * as users from "../users.js";
63
+ import type * as webhooks from "../webhooks.js";
64
+
65
+ import type {
66
+ ApiFromModules,
67
+ FilterApi,
68
+ FunctionReference,
69
+ } from "convex/server";
70
+
71
+ declare const fullApi: ApiFromModules<{
72
+ auth: typeof auth;
73
+ comments: typeof comments;
74
+ crons: typeof crons;
75
+ devSeed: typeof devSeed;
76
+ devSeedExtra: typeof devSeedExtra;
77
+ downloads: typeof downloads;
78
+ githubBackups: typeof githubBackups;
79
+ githubBackupsNode: typeof githubBackupsNode;
80
+ githubImport: typeof githubImport;
81
+ githubSoulBackups: typeof githubSoulBackups;
82
+ githubSoulBackupsNode: typeof githubSoulBackupsNode;
83
+ http: typeof http;
84
+ httpApi: typeof httpApi;
85
+ httpApiV1: typeof httpApiV1;
86
+ leaderboards: typeof leaderboards;
87
+ "lib/access": typeof lib_access;
88
+ "lib/apiTokenAuth": typeof lib_apiTokenAuth;
89
+ "lib/badges": typeof lib_badges;
90
+ "lib/changelog": typeof lib_changelog;
91
+ "lib/embeddings": typeof lib_embeddings;
92
+ "lib/githubBackup": typeof lib_githubBackup;
93
+ "lib/githubImport": typeof lib_githubImport;
94
+ "lib/githubSoulBackup": typeof lib_githubSoulBackup;
95
+ "lib/leaderboards": typeof lib_leaderboards;
96
+ "lib/moderation": typeof lib_moderation;
97
+ "lib/public": typeof lib_public;
98
+ "lib/searchText": typeof lib_searchText;
99
+ "lib/skillBackfill": typeof lib_skillBackfill;
100
+ "lib/skillPublish": typeof lib_skillPublish;
101
+ "lib/skillStats": typeof lib_skillStats;
102
+ "lib/skills": typeof lib_skills;
103
+ "lib/soulChangelog": typeof lib_soulChangelog;
104
+ "lib/soulPublish": typeof lib_soulPublish;
105
+ "lib/tokens": typeof lib_tokens;
106
+ "lib/webhooks": typeof lib_webhooks;
107
+ maintenance: typeof maintenance;
108
+ rateLimits: typeof rateLimits;
109
+ search: typeof search;
110
+ seed: typeof seed;
111
+ seedSouls: typeof seedSouls;
112
+ skillStatEvents: typeof skillStatEvents;
113
+ skills: typeof skills;
114
+ soulComments: typeof soulComments;
115
+ soulDownloads: typeof soulDownloads;
116
+ soulStars: typeof soulStars;
117
+ souls: typeof souls;
118
+ stars: typeof stars;
119
+ statsMaintenance: typeof statsMaintenance;
120
+ telemetry: typeof telemetry;
121
+ tokens: typeof tokens;
122
+ uploads: typeof uploads;
123
+ users: typeof users;
124
+ webhooks: typeof webhooks;
125
+ }>;
126
+
127
+ /**
128
+ * A utility for referencing Convex functions in your app's public API.
129
+ *
130
+ * Usage:
131
+ * ```js
132
+ * const myFunctionReference = api.myModule.myFunction;
133
+ * ```
134
+ */
135
+ export declare const api: FilterApi<
136
+ typeof fullApi,
137
+ FunctionReference<any, "public">
138
+ >;
139
+
140
+ /**
141
+ * A utility for referencing Convex functions in your app's internal API.
142
+ *
143
+ * Usage:
144
+ * ```js
145
+ * const myFunctionReference = internal.myModule.myFunction;
146
+ * ```
147
+ */
148
+ export declare const internal: FilterApi<
149
+ typeof fullApi,
150
+ FunctionReference<any, "internal">
151
+ >;
152
+
153
+ export declare const components: {};
@@ -0,0 +1,23 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * Generated `api` utility.
4
+ *
5
+ * THIS CODE IS AUTOMATICALLY GENERATED.
6
+ *
7
+ * To regenerate, run `npx convex dev`.
8
+ * @module
9
+ */
10
+
11
+ import { anyApi, componentsGeneric } from "convex/server";
12
+
13
+ /**
14
+ * A utility for referencing Convex functions in your app's API.
15
+ *
16
+ * Usage:
17
+ * ```js
18
+ * const myFunctionReference = api.myModule.myFunction;
19
+ * ```
20
+ */
21
+ export const api = anyApi;
22
+ export const internal = anyApi;
23
+ export const components = componentsGeneric();