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.
- package/LICENSE +1 -0
- package/README.md +36 -129
- package/dist/browserAuth.d.ts +20 -0
- package/dist/browserAuth.js +156 -0
- package/dist/browserAuth.js.map +1 -0
- package/dist/browserAuth.test.d.ts +1 -0
- package/dist/browserAuth.test.js +83 -0
- package/dist/browserAuth.test.js.map +1 -0
- package/dist/cli/buildInfo.d.ts +3 -0
- package/dist/cli/buildInfo.js +103 -0
- package/dist/cli/buildInfo.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +9 -0
- package/dist/cli/commands/auth.js +75 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +11 -0
- package/dist/cli/commands/delete.js +67 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/delete.test.d.ts +1 -0
- package/dist/cli/commands/delete.test.js +52 -0
- package/dist/cli/commands/delete.test.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +9 -0
- package/dist/cli/commands/publish.js +87 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/publish.test.d.ts +1 -0
- package/dist/cli/commands/publish.test.js +104 -0
- package/dist/cli/commands/publish.test.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +23 -0
- package/dist/cli/commands/skills.js +298 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/skills.test.d.ts +1 -0
- package/dist/cli/commands/skills.test.js +156 -0
- package/dist/cli/commands/skills.test.js.map +1 -0
- package/dist/cli/commands/star.d.ts +8 -0
- package/dist/cli/commands/star.js +38 -0
- package/dist/cli/commands/star.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.js +160 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/sync.test.d.ts +1 -0
- package/dist/cli/commands/sync.test.js +277 -0
- package/dist/cli/commands/sync.test.js.map +1 -0
- package/dist/cli/commands/syncHelpers.d.ts +76 -0
- package/dist/cli/commands/syncHelpers.js +349 -0
- package/dist/cli/commands/syncHelpers.js.map +1 -0
- package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
- package/dist/cli/commands/syncHelpers.test.js +22 -0
- package/dist/cli/commands/syncHelpers.test.js.map +1 -0
- package/dist/cli/commands/syncTypes.d.ts +24 -0
- package/dist/cli/commands/syncTypes.js +2 -0
- package/dist/cli/commands/syncTypes.js.map +1 -0
- package/dist/cli/commands/unstar.d.ts +8 -0
- package/dist/cli/commands/unstar.js +38 -0
- package/dist/cli/commands/unstar.js.map +1 -0
- package/dist/cli/helpStyle.d.ts +13 -0
- package/dist/cli/helpStyle.js +38 -0
- package/dist/cli/helpStyle.js.map +1 -0
- package/dist/cli/pilotbotConfig.d.ts +6 -0
- package/dist/cli/pilotbotConfig.js +110 -0
- package/dist/cli/pilotbotConfig.js.map +1 -0
- package/dist/cli/pilotbotConfig.test.d.ts +1 -0
- package/dist/cli/pilotbotConfig.test.js +133 -0
- package/dist/cli/pilotbotConfig.test.js.map +1 -0
- package/dist/cli/registry.d.ts +7 -0
- package/dist/cli/registry.js +42 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/registry.test.d.ts +1 -0
- package/dist/cli/registry.test.js +48 -0
- package/dist/cli/registry.test.js.map +1 -0
- package/dist/cli/scanSkills.d.ts +7 -0
- package/dist/cli/scanSkills.js +75 -0
- package/dist/cli/scanSkills.js.map +1 -0
- package/dist/cli/scanSkills.test.d.ts +1 -0
- package/dist/cli/scanSkills.test.js +60 -0
- package/dist/cli/scanSkills.test.js.map +1 -0
- package/dist/cli/slug.d.ts +2 -0
- package/dist/cli/slug.js +16 -0
- package/dist/cli/slug.js.map +1 -0
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/ui.d.ts +7 -0
- package/dist/cli/ui.js +72 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +268 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +5 -0
- package/dist/discovery.js +21 -0
- package/dist/discovery.js.map +1 -0
- package/dist/discovery.test.d.ts +1 -0
- package/dist/discovery.test.js +46 -0
- package/dist/discovery.test.js.map +1 -0
- package/dist/http.d.ts +32 -0
- package/dist/http.js +261 -0
- package/dist/http.js.map +1 -0
- package/dist/http.test.d.ts +1 -0
- package/dist/http.test.js +135 -0
- package/dist/http.test.js.map +1 -0
- package/dist/schema/ark.js.map +1 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/routes.js.map +1 -0
- package/{packages/schema/dist → dist/schema}/schemas.d.ts +0 -39
- package/{packages/schema/dist → dist/schema}/schemas.js +0 -22
- package/dist/schema/schemas.js.map +1 -0
- package/dist/schema/textFiles.js.map +1 -0
- package/dist/schema/textFiles.test.d.ts +1 -0
- package/dist/schema/textFiles.test.js +20 -0
- package/dist/schema/textFiles.test.js.map +1 -0
- package/dist/skills.d.ts +43 -0
- package/dist/skills.js +163 -0
- package/dist/skills.js.map +1 -0
- package/dist/skills.test.d.ts +1 -0
- package/dist/skills.test.js +144 -0
- package/dist/skills.test.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +27 -70
- package/.env.local.example +0 -19
- package/.github/workflows/ci.yml +0 -40
- package/.oxlintrc.json +0 -3
- package/AGENTS.md +0 -45
- package/CHANGELOG.md +0 -138
- package/DEPRECATIONS.md +0 -7
- package/biome.json +0 -41
- package/convex/_generated/api.d.ts +0 -153
- package/convex/_generated/api.js +0 -23
- package/convex/_generated/dataModel.d.ts +0 -60
- package/convex/_generated/server.d.ts +0 -143
- package/convex/_generated/server.js +0 -93
- package/convex/auth.config.ts +0 -8
- package/convex/auth.ts +0 -19
- package/convex/comments.ts +0 -88
- package/convex/crons.ts +0 -34
- package/convex/devSeed.ts +0 -459
- package/convex/devSeedExtra.ts +0 -541
- package/convex/downloads.ts +0 -78
- package/convex/githubBackups.ts +0 -170
- package/convex/githubBackupsNode.ts +0 -183
- package/convex/githubImport.ts +0 -317
- package/convex/githubSoulBackups.ts +0 -170
- package/convex/githubSoulBackupsNode.ts +0 -186
- package/convex/http.ts +0 -194
- package/convex/httpApi.handlers.test.ts +0 -488
- package/convex/httpApi.test.ts +0 -70
- package/convex/httpApi.ts +0 -305
- package/convex/httpApiV1.handlers.test.ts +0 -584
- package/convex/httpApiV1.ts +0 -1172
- package/convex/leaderboards.ts +0 -39
- package/convex/lib/access.ts +0 -36
- package/convex/lib/apiTokenAuth.ts +0 -36
- package/convex/lib/badges.ts +0 -50
- package/convex/lib/changelog.test.ts +0 -34
- package/convex/lib/changelog.ts +0 -278
- package/convex/lib/embeddings.ts +0 -38
- package/convex/lib/githubBackup.ts +0 -443
- package/convex/lib/githubImport.test.ts +0 -247
- package/convex/lib/githubImport.ts +0 -425
- package/convex/lib/githubSoulBackup.ts +0 -443
- package/convex/lib/leaderboards.ts +0 -103
- package/convex/lib/moderation.ts +0 -42
- package/convex/lib/public.ts +0 -89
- package/convex/lib/searchText.test.ts +0 -46
- package/convex/lib/searchText.ts +0 -27
- package/convex/lib/skillBackfill.test.ts +0 -34
- package/convex/lib/skillBackfill.ts +0 -67
- package/convex/lib/skillPublish.test.ts +0 -28
- package/convex/lib/skillPublish.ts +0 -284
- package/convex/lib/skillStats.ts +0 -80
- package/convex/lib/skills.test.ts +0 -197
- package/convex/lib/skills.ts +0 -273
- package/convex/lib/soulChangelog.ts +0 -273
- package/convex/lib/soulPublish.ts +0 -236
- package/convex/lib/tokens.test.ts +0 -33
- package/convex/lib/tokens.ts +0 -51
- package/convex/lib/webhooks.test.ts +0 -91
- package/convex/lib/webhooks.ts +0 -112
- package/convex/maintenance.test.ts +0 -270
- package/convex/maintenance.ts +0 -840
- package/convex/rateLimits.ts +0 -50
- package/convex/schema.ts +0 -472
- package/convex/search.test.ts +0 -12
- package/convex/search.ts +0 -254
- package/convex/seed.test.ts +0 -37
- package/convex/seed.ts +0 -254
- package/convex/seedSouls.ts +0 -111
- package/convex/skillStatEvents.ts +0 -568
- package/convex/skills.ts +0 -1606
- package/convex/soulComments.ts +0 -88
- package/convex/soulDownloads.ts +0 -14
- package/convex/soulStars.ts +0 -71
- package/convex/souls.ts +0 -570
- package/convex/stars.ts +0 -108
- package/convex/statsMaintenance.ts +0 -205
- package/convex/telemetry.ts +0 -434
- package/convex/tokens.ts +0 -88
- package/convex/tsconfig.json +0 -7
- package/convex/uploads.ts +0 -20
- package/convex/users.ts +0 -122
- package/convex/webhooks.ts +0 -50
- package/convex.json +0 -3
- package/docs/README.md +0 -32
- package/docs/api.md +0 -51
- package/docs/architecture.md +0 -61
- package/docs/auth.md +0 -54
- package/docs/cli.md +0 -117
- package/docs/deploy.md +0 -78
- package/docs/diffing.md +0 -84
- package/docs/github-import.md +0 -171
- package/docs/http-api.md +0 -187
- package/docs/manual-testing.md +0 -64
- package/docs/mintlify.md +0 -43
- package/docs/quickstart.md +0 -120
- package/docs/skill-format.md +0 -58
- package/docs/soul-format.md +0 -37
- package/docs/spec.md +0 -177
- package/docs/telemetry.md +0 -91
- package/docs/troubleshooting.md +0 -49
- package/docs/webhook.md +0 -51
- package/e2e/menu-smoke.pw.test.ts +0 -49
- package/e2e/pilothub.e2e.test.ts +0 -494
- package/e2e/search-exact.pw.test.ts +0 -97
- package/packages/pilothub/LICENSE +0 -22
- package/packages/pilothub/README.md +0 -57
- package/packages/pilothub/package.json +0 -41
- package/packages/pilothub/src/browserAuth.test.ts +0 -96
- package/packages/pilothub/src/browserAuth.ts +0 -174
- package/packages/pilothub/src/cli/buildInfo.ts +0 -94
- package/packages/pilothub/src/cli/commands/auth.ts +0 -97
- package/packages/pilothub/src/cli/commands/delete.test.ts +0 -73
- package/packages/pilothub/src/cli/commands/delete.ts +0 -83
- package/packages/pilothub/src/cli/commands/publish.test.ts +0 -122
- package/packages/pilothub/src/cli/commands/publish.ts +0 -108
- package/packages/pilothub/src/cli/commands/skills.test.ts +0 -191
- package/packages/pilothub/src/cli/commands/skills.ts +0 -380
- package/packages/pilothub/src/cli/commands/star.ts +0 -46
- package/packages/pilothub/src/cli/commands/sync.test.ts +0 -310
- package/packages/pilothub/src/cli/commands/sync.ts +0 -200
- package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +0 -26
- package/packages/pilothub/src/cli/commands/syncHelpers.ts +0 -427
- package/packages/pilothub/src/cli/commands/syncTypes.ts +0 -27
- package/packages/pilothub/src/cli/commands/unstar.ts +0 -48
- package/packages/pilothub/src/cli/helpStyle.ts +0 -45
- package/packages/pilothub/src/cli/pilotbotConfig.test.ts +0 -159
- package/packages/pilothub/src/cli/pilotbotConfig.ts +0 -147
- package/packages/pilothub/src/cli/registry.test.ts +0 -63
- package/packages/pilothub/src/cli/registry.ts +0 -43
- package/packages/pilothub/src/cli/scanSkills.test.ts +0 -64
- package/packages/pilothub/src/cli/scanSkills.ts +0 -84
- package/packages/pilothub/src/cli/slug.ts +0 -16
- package/packages/pilothub/src/cli/types.ts +0 -12
- package/packages/pilothub/src/cli/ui.ts +0 -75
- package/packages/pilothub/src/cli.ts +0 -311
- package/packages/pilothub/src/config.ts +0 -36
- package/packages/pilothub/src/discovery.test.ts +0 -75
- package/packages/pilothub/src/discovery.ts +0 -19
- package/packages/pilothub/src/http.test.ts +0 -156
- package/packages/pilothub/src/http.ts +0 -301
- package/packages/pilothub/src/schema/ark.ts +0 -29
- package/packages/pilothub/src/schema/index.ts +0 -5
- package/packages/pilothub/src/schema/routes.ts +0 -22
- package/packages/pilothub/src/schema/schemas.ts +0 -260
- package/packages/pilothub/src/schema/textFiles.test.ts +0 -23
- package/packages/pilothub/src/schema/textFiles.ts +0 -66
- package/packages/pilothub/src/skills.test.ts +0 -191
- package/packages/pilothub/src/skills.ts +0 -172
- package/packages/pilothub/src/types.ts +0 -10
- package/packages/pilothub/tsconfig.json +0 -14
- package/packages/schema/README.md +0 -3
- package/packages/schema/dist/ark.js.map +0 -1
- package/packages/schema/dist/index.js.map +0 -1
- package/packages/schema/dist/routes.js.map +0 -1
- package/packages/schema/dist/schemas.js.map +0 -1
- package/packages/schema/dist/textFiles.js.map +0 -1
- package/packages/schema/package.json +0 -26
- package/packages/schema/src/ark.ts +0 -29
- package/packages/schema/src/index.ts +0 -5
- package/packages/schema/src/routes.ts +0 -22
- package/packages/schema/src/schemas.test.ts +0 -123
- package/packages/schema/src/schemas.ts +0 -287
- package/packages/schema/src/textFiles.test.ts +0 -23
- package/packages/schema/src/textFiles.ts +0 -66
- package/packages/schema/tsconfig.json +0 -15
- package/pilothub +0 -46
- package/playwright.config.ts +0 -33
- package/public/.well-known/pilothub.json +0 -6
- package/public/api/v1/openapi.json +0 -379
- package/public/favicon.ico +0 -0
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +0 -25
- package/public/og.png +0 -0
- package/public/og.svg +0 -98
- package/public/pilot-logo.png +0 -0
- package/public/pilot-mark.png +0 -0
- package/public/robots.txt +0 -3
- package/public/tanstack-circle-logo.png +0 -0
- package/public/tanstack-word-logo-white.svg +0 -1
- package/scripts/check-peer-deps.ts +0 -56
- package/scripts/docs-list.ts +0 -148
- package/scripts/run-playwright-local.sh +0 -14
- package/server/og/fetchSkillOgMeta.ts +0 -27
- package/server/og/fetchSoulOgMeta.ts +0 -27
- package/server/og/ogAssets.ts +0 -80
- package/server/og/skillOgSvg.test.ts +0 -59
- package/server/og/skillOgSvg.ts +0 -258
- package/server/og/soulOgSvg.ts +0 -209
- package/server/routes/og/skill.png.ts +0 -103
- package/server/routes/og/soul.png.ts +0 -111
- package/src/__tests__/skill-detail-page.test.tsx +0 -86
- package/src/__tests__/skills-index.test.tsx +0 -145
- package/src/__tests__/upload.route.test.tsx +0 -228
- package/src/components/AppProviders.tsx +0 -19
- package/src/components/ClientOnly.tsx +0 -18
- package/src/components/Footer.tsx +0 -29
- package/src/components/Header.tsx +0 -295
- package/src/components/InstallSwitcher.tsx +0 -53
- package/src/components/SkillCard.tsx +0 -36
- package/src/components/SkillDetailPage.tsx +0 -817
- package/src/components/SkillDiffCard.tsx +0 -485
- package/src/components/SoulCard.tsx +0 -19
- package/src/components/SoulDetailPage.tsx +0 -263
- package/src/components/UserBootstrap.tsx +0 -18
- package/src/components/ui/dropdown-menu.tsx +0 -67
- package/src/components/ui/toggle-group.tsx +0 -35
- package/src/convex/client.ts +0 -3
- package/src/lib/badges.ts +0 -29
- package/src/lib/diffing.test.ts +0 -163
- package/src/lib/diffing.ts +0 -106
- package/src/lib/gravatar.test.ts +0 -9
- package/src/lib/gravatar.ts +0 -158
- package/src/lib/og.test.ts +0 -142
- package/src/lib/og.ts +0 -156
- package/src/lib/publicUser.ts +0 -39
- package/src/lib/roles.ts +0 -19
- package/src/lib/site.test.ts +0 -130
- package/src/lib/site.ts +0 -84
- package/src/lib/theme-transition.test.ts +0 -134
- package/src/lib/theme-transition.ts +0 -134
- package/src/lib/theme.test.tsx +0 -88
- package/src/lib/theme.ts +0 -43
- package/src/lib/uploadFiles.jsdom.test.ts +0 -33
- package/src/lib/uploadFiles.test.ts +0 -123
- package/src/lib/uploadFiles.ts +0 -245
- package/src/lib/uploadUtils.test.ts +0 -78
- package/src/lib/uploadUtils.ts +0 -93
- package/src/lib/useAuthStatus.ts +0 -12
- package/src/lib/utils.test.ts +0 -9
- package/src/lib/utils.ts +0 -6
- package/src/logo.svg +0 -12
- package/src/routeTree.gen.ts +0 -345
- package/src/router.tsx +0 -17
- package/src/routes/$owner/$slug.tsx +0 -55
- package/src/routes/__root.tsx +0 -136
- package/src/routes/admin.tsx +0 -11
- package/src/routes/cli/auth.tsx +0 -168
- package/src/routes/dashboard.tsx +0 -97
- package/src/routes/import.tsx +0 -415
- package/src/routes/index.tsx +0 -252
- package/src/routes/management.tsx +0 -529
- package/src/routes/settings.tsx +0 -203
- package/src/routes/skills/index.tsx +0 -422
- package/src/routes/souls/$slug.tsx +0 -55
- package/src/routes/souls/index.tsx +0 -243
- package/src/routes/stars.tsx +0 -68
- package/src/routes/u/$handle.tsx +0 -307
- package/src/routes/upload/utils.ts +0 -81
- package/src/routes/upload.tsx +0 -499
- package/src/styles.css +0 -2718
- package/tsconfig.json +0 -24
- package/tsconfig.oxlint.json +0 -16
- package/vercel.json +0 -8
- package/vite.config.ts +0 -48
- package/vitest.config.ts +0 -47
- package/vitest.e2e.config.ts +0 -11
- package/vitest.setup.ts +0 -1
- /package/{packages/pilothub/bin → bin}/pilothub.js +0 -0
- /package/{packages/schema/dist → dist/schema}/ark.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/ark.js +0 -0
- /package/{packages/schema/dist → dist/schema}/index.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/index.js +0 -0
- /package/{packages/schema/dist → dist/schema}/routes.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/routes.js +0 -0
- /package/{packages/schema/dist → dist/schema}/textFiles.d.ts +0 -0
- /package/{packages/schema/dist → dist/schema}/textFiles.js +0 -0
package/convex/tokens.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { v } from 'convex/values'
|
|
2
|
-
import type { Doc } from './_generated/dataModel'
|
|
3
|
-
import { internalMutation, internalQuery, mutation, query } from './_generated/server'
|
|
4
|
-
import { requireUser } from './lib/access'
|
|
5
|
-
import { generateToken, hashToken } from './lib/tokens'
|
|
6
|
-
|
|
7
|
-
export const listMine = query({
|
|
8
|
-
args: {},
|
|
9
|
-
handler: async (ctx) => {
|
|
10
|
-
const { userId } = await requireUser(ctx)
|
|
11
|
-
const tokens = await ctx.db
|
|
12
|
-
.query('apiTokens')
|
|
13
|
-
.withIndex('by_user', (q) => q.eq('userId', userId))
|
|
14
|
-
.order('desc')
|
|
15
|
-
.take(100)
|
|
16
|
-
return tokens.map((token) => ({
|
|
17
|
-
_id: token._id,
|
|
18
|
-
label: token.label,
|
|
19
|
-
prefix: token.prefix,
|
|
20
|
-
createdAt: token.createdAt,
|
|
21
|
-
lastUsedAt: token.lastUsedAt,
|
|
22
|
-
revokedAt: token.revokedAt,
|
|
23
|
-
}))
|
|
24
|
-
},
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
export const create = mutation({
|
|
28
|
-
args: { label: v.string() },
|
|
29
|
-
handler: async (ctx, args) => {
|
|
30
|
-
const { userId } = await requireUser(ctx)
|
|
31
|
-
const label = args.label.trim() || 'CLI token'
|
|
32
|
-
const { token, prefix } = generateToken()
|
|
33
|
-
const tokenHash = await hashToken(token)
|
|
34
|
-
|
|
35
|
-
const now = Date.now()
|
|
36
|
-
const tokenId = await ctx.db.insert('apiTokens', {
|
|
37
|
-
userId,
|
|
38
|
-
label,
|
|
39
|
-
prefix,
|
|
40
|
-
tokenHash,
|
|
41
|
-
createdAt: now,
|
|
42
|
-
lastUsedAt: undefined,
|
|
43
|
-
revokedAt: undefined,
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
return { token, tokenId, label, prefix, createdAt: now }
|
|
47
|
-
},
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
export const revoke = mutation({
|
|
51
|
-
args: { tokenId: v.id('apiTokens') },
|
|
52
|
-
handler: async (ctx, args) => {
|
|
53
|
-
const { userId } = await requireUser(ctx)
|
|
54
|
-
const token = await ctx.db.get(args.tokenId)
|
|
55
|
-
if (!token) throw new Error('Token not found')
|
|
56
|
-
if (token.userId !== userId) throw new Error('Forbidden')
|
|
57
|
-
if (token.revokedAt) return
|
|
58
|
-
await ctx.db.patch(token._id, { revokedAt: Date.now() })
|
|
59
|
-
},
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
export const getByHashInternal = internalQuery({
|
|
63
|
-
args: { tokenHash: v.string() },
|
|
64
|
-
handler: async (ctx, args) => {
|
|
65
|
-
return ctx.db
|
|
66
|
-
.query('apiTokens')
|
|
67
|
-
.withIndex('by_hash', (q) => q.eq('tokenHash', args.tokenHash))
|
|
68
|
-
.unique()
|
|
69
|
-
},
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
export const touchInternal = internalMutation({
|
|
73
|
-
args: { tokenId: v.id('apiTokens') },
|
|
74
|
-
handler: async (ctx, args) => {
|
|
75
|
-
const token = await ctx.db.get(args.tokenId)
|
|
76
|
-
if (!token || token.revokedAt) return
|
|
77
|
-
await ctx.db.patch(token._id, { lastUsedAt: Date.now() })
|
|
78
|
-
},
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
export const getUserForTokenInternal = internalQuery({
|
|
82
|
-
args: { tokenId: v.id('apiTokens') },
|
|
83
|
-
handler: async (ctx, args): Promise<Doc<'users'> | null> => {
|
|
84
|
-
const token = await ctx.db.get(args.tokenId)
|
|
85
|
-
if (!token || token.revokedAt) return null
|
|
86
|
-
return ctx.db.get(token.userId)
|
|
87
|
-
},
|
|
88
|
-
})
|
package/convex/tsconfig.json
DELETED
package/convex/uploads.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { v } from 'convex/values'
|
|
2
|
-
import { internalMutation, mutation } from './_generated/server'
|
|
3
|
-
import { requireUser } from './lib/access'
|
|
4
|
-
|
|
5
|
-
export const generateUploadUrl = mutation({
|
|
6
|
-
args: {},
|
|
7
|
-
handler: async (ctx) => {
|
|
8
|
-
await requireUser(ctx)
|
|
9
|
-
return ctx.storage.generateUploadUrl()
|
|
10
|
-
},
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
export const generateUploadUrlForUserInternal = internalMutation({
|
|
14
|
-
args: { userId: v.id('users') },
|
|
15
|
-
handler: async (ctx, args) => {
|
|
16
|
-
const user = await ctx.db.get(args.userId)
|
|
17
|
-
if (!user || user.deletedAt) throw new Error('User not found')
|
|
18
|
-
return ctx.storage.generateUploadUrl()
|
|
19
|
-
},
|
|
20
|
-
})
|
package/convex/users.ts
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { getAuthUserId } from '@convex-dev/auth/server'
|
|
2
|
-
import { v } from 'convex/values'
|
|
3
|
-
import { internal } from './_generated/api'
|
|
4
|
-
import { internalQuery, mutation, query } from './_generated/server'
|
|
5
|
-
import { assertAdmin, requireUser } from './lib/access'
|
|
6
|
-
import { toPublicUser } from './lib/public'
|
|
7
|
-
|
|
8
|
-
const DEFAULT_ROLE = 'user'
|
|
9
|
-
const ADMIN_HANDLE = 'steipete'
|
|
10
|
-
|
|
11
|
-
export const getById = query({
|
|
12
|
-
args: { userId: v.id('users') },
|
|
13
|
-
handler: async (ctx, args) => toPublicUser(await ctx.db.get(args.userId)),
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
export const getByIdInternal = internalQuery({
|
|
17
|
-
args: { userId: v.id('users') },
|
|
18
|
-
handler: async (ctx, args) => ctx.db.get(args.userId),
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
export const me = query({
|
|
22
|
-
args: {},
|
|
23
|
-
handler: async (ctx) => {
|
|
24
|
-
const userId = await getAuthUserId(ctx)
|
|
25
|
-
if (!userId) return null
|
|
26
|
-
const user = await ctx.db.get(userId)
|
|
27
|
-
if (!user || user.deletedAt) return null
|
|
28
|
-
return user
|
|
29
|
-
},
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
export const ensure = mutation({
|
|
33
|
-
args: {},
|
|
34
|
-
handler: async (ctx) => {
|
|
35
|
-
const { userId, user } = await requireUser(ctx)
|
|
36
|
-
const now = Date.now()
|
|
37
|
-
const updates: Record<string, unknown> = {}
|
|
38
|
-
|
|
39
|
-
const handle = user.handle ?? user.name ?? user.email?.split('@')[0]
|
|
40
|
-
if (!user.handle && handle) updates.handle = handle
|
|
41
|
-
if (!user.displayName) updates.displayName = handle
|
|
42
|
-
if (!user.role) {
|
|
43
|
-
updates.role = handle === ADMIN_HANDLE ? 'admin' : DEFAULT_ROLE
|
|
44
|
-
}
|
|
45
|
-
if (!user.createdAt) updates.createdAt = user._creationTime
|
|
46
|
-
updates.updatedAt = now
|
|
47
|
-
|
|
48
|
-
if (Object.keys(updates).length > 0) {
|
|
49
|
-
await ctx.db.patch(userId, updates)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return ctx.db.get(userId)
|
|
53
|
-
},
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
export const updateProfile = mutation({
|
|
57
|
-
args: {
|
|
58
|
-
displayName: v.string(),
|
|
59
|
-
bio: v.optional(v.string()),
|
|
60
|
-
},
|
|
61
|
-
handler: async (ctx, args) => {
|
|
62
|
-
const { userId } = await requireUser(ctx)
|
|
63
|
-
await ctx.db.patch(userId, {
|
|
64
|
-
displayName: args.displayName.trim(),
|
|
65
|
-
bio: args.bio?.trim(),
|
|
66
|
-
updatedAt: Date.now(),
|
|
67
|
-
})
|
|
68
|
-
},
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
export const deleteAccount = mutation({
|
|
72
|
-
args: {},
|
|
73
|
-
handler: async (ctx) => {
|
|
74
|
-
const { userId } = await requireUser(ctx)
|
|
75
|
-
await ctx.db.patch(userId, {
|
|
76
|
-
deletedAt: Date.now(),
|
|
77
|
-
updatedAt: Date.now(),
|
|
78
|
-
})
|
|
79
|
-
await ctx.runMutation(internal.telemetry.clearUserTelemetryInternal, { userId })
|
|
80
|
-
},
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
export const list = query({
|
|
84
|
-
args: { limit: v.optional(v.number()) },
|
|
85
|
-
handler: async (ctx, args) => {
|
|
86
|
-
const { user } = await requireUser(ctx)
|
|
87
|
-
assertAdmin(user)
|
|
88
|
-
const limit = args.limit ?? 50
|
|
89
|
-
return ctx.db.query('users').order('desc').take(limit)
|
|
90
|
-
},
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
export const getByHandle = query({
|
|
94
|
-
args: { handle: v.string() },
|
|
95
|
-
handler: async (ctx, args) => {
|
|
96
|
-
const user = await ctx.db
|
|
97
|
-
.query('users')
|
|
98
|
-
.withIndex('handle', (q) => q.eq('handle', args.handle))
|
|
99
|
-
.unique()
|
|
100
|
-
return toPublicUser(user)
|
|
101
|
-
},
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
export const setRole = mutation({
|
|
105
|
-
args: {
|
|
106
|
-
userId: v.id('users'),
|
|
107
|
-
role: v.union(v.literal('admin'), v.literal('moderator'), v.literal('user')),
|
|
108
|
-
},
|
|
109
|
-
handler: async (ctx, args) => {
|
|
110
|
-
const { user } = await requireUser(ctx)
|
|
111
|
-
assertAdmin(user)
|
|
112
|
-
await ctx.db.patch(args.userId, { role: args.role, updatedAt: Date.now() })
|
|
113
|
-
await ctx.db.insert('auditLogs', {
|
|
114
|
-
actorUserId: user._id,
|
|
115
|
-
action: 'role.change',
|
|
116
|
-
targetType: 'user',
|
|
117
|
-
targetId: args.userId,
|
|
118
|
-
metadata: { role: args.role },
|
|
119
|
-
createdAt: Date.now(),
|
|
120
|
-
})
|
|
121
|
-
},
|
|
122
|
-
})
|
package/convex/webhooks.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { v } from 'convex/values'
|
|
2
|
-
import { internalAction } from './_generated/server'
|
|
3
|
-
import { buildDiscordPayload, getWebhookConfig, shouldSendWebhook } from './lib/webhooks'
|
|
4
|
-
|
|
5
|
-
export const sendDiscordWebhook = internalAction({
|
|
6
|
-
args: {
|
|
7
|
-
event: v.union(v.literal('skill.publish'), v.literal('skill.highlighted')),
|
|
8
|
-
skill: v.object({
|
|
9
|
-
slug: v.string(),
|
|
10
|
-
displayName: v.string(),
|
|
11
|
-
summary: v.optional(v.string()),
|
|
12
|
-
version: v.optional(v.string()),
|
|
13
|
-
ownerHandle: v.optional(v.string()),
|
|
14
|
-
highlighted: v.optional(v.boolean()),
|
|
15
|
-
tags: v.optional(v.array(v.string())),
|
|
16
|
-
}),
|
|
17
|
-
},
|
|
18
|
-
handler: async (_ctx, args) => {
|
|
19
|
-
const config = getWebhookConfig()
|
|
20
|
-
const logMeta = {
|
|
21
|
-
event: args.event,
|
|
22
|
-
slug: args.skill.slug,
|
|
23
|
-
version: args.skill.version ?? null,
|
|
24
|
-
highlighted: args.skill.highlighted ?? false,
|
|
25
|
-
highlightedOnly: config.highlightedOnly,
|
|
26
|
-
}
|
|
27
|
-
if (!shouldSendWebhook(args.event, args.skill, config)) {
|
|
28
|
-
console.info('[webhook] skipped', logMeta)
|
|
29
|
-
return { ok: false, skipped: true }
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const payload = buildDiscordPayload(args.event, args.skill, config)
|
|
33
|
-
const response = await fetch(config.url as string, {
|
|
34
|
-
method: 'POST',
|
|
35
|
-
headers: { 'Content-Type': 'application/json' },
|
|
36
|
-
body: JSON.stringify(payload),
|
|
37
|
-
})
|
|
38
|
-
if (!response.ok) {
|
|
39
|
-
const message = await response.text()
|
|
40
|
-
console.error('[webhook] failed', {
|
|
41
|
-
...logMeta,
|
|
42
|
-
status: response.status,
|
|
43
|
-
body: message.slice(0, 300),
|
|
44
|
-
})
|
|
45
|
-
throw new Error(`Discord webhook failed: ${response.status} ${message}`)
|
|
46
|
-
}
|
|
47
|
-
console.info('[webhook] sent', { ...logMeta, status: response.status })
|
|
48
|
-
return { ok: true }
|
|
49
|
-
},
|
|
50
|
-
})
|
package/convex.json
DELETED
package/docs/README.md
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Documentation index + reading order.'
|
|
3
|
-
read_when:
|
|
4
|
-
- New contributor onboarding
|
|
5
|
-
- Looking for the right doc
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Docs
|
|
9
|
-
|
|
10
|
-
Reading order (new contributor):
|
|
11
|
-
|
|
12
|
-
1. `README.md` (repo root): run locally.
|
|
13
|
-
2. `docs/quickstart.md`: end-to-end: search → install → publish → sync.
|
|
14
|
-
3. `docs/architecture.md`: how the pieces fit (TanStack Start + Convex + CLI).
|
|
15
|
-
4. `docs/skill-format.md`: what a “skill” is on disk + on the registry.
|
|
16
|
-
5. `docs/cli.md`: CLI reference (flags, config, lockfiles, sync rules).
|
|
17
|
-
6. `docs/http-api.md`: HTTP endpoints used by the CLI + public API.
|
|
18
|
-
7. `docs/auth.md`: GitHub OAuth + API tokens + CLI loopback login.
|
|
19
|
-
8. `docs/deploy.md`: Convex + Vercel deployment + rewrites.
|
|
20
|
-
9. `docs/troubleshooting.md`: common failure modes.
|
|
21
|
-
|
|
22
|
-
Feature/ops docs (already present):
|
|
23
|
-
|
|
24
|
-
- `docs/spec.md`: product + implementation spec (data model + flows).
|
|
25
|
-
- `docs/telemetry.md`: what `pilothub sync` reports; opt-out.
|
|
26
|
-
- `docs/webhook.md`: Discord webhook events/payload.
|
|
27
|
-
- `docs/diffing.md`: version-to-version diff UI spec.
|
|
28
|
-
- `docs/manual-testing.md`: CLI smoke scripts.
|
|
29
|
-
|
|
30
|
-
Docs tooling:
|
|
31
|
-
|
|
32
|
-
- `docs/mintlify.md`: publish these docs with Mintlify.
|
package/docs/api.md
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Public REST API (v1) overview and conventions.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Building API clients
|
|
5
|
-
- Adding endpoints or schemas
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# API v1
|
|
9
|
-
|
|
10
|
-
Base: `https://pilothub.com`
|
|
11
|
-
|
|
12
|
-
OpenAPI: `/api/v1/openapi.json`
|
|
13
|
-
|
|
14
|
-
## Auth
|
|
15
|
-
|
|
16
|
-
- Public read: no token required.
|
|
17
|
-
- Write + account: `Authorization: Bearer clh_...`.
|
|
18
|
-
|
|
19
|
-
## Rate limits
|
|
20
|
-
|
|
21
|
-
Per IP + per API key:
|
|
22
|
-
|
|
23
|
-
- Read: 120/min per IP, 600/min per key
|
|
24
|
-
- Write: 30/min per IP, 120/min per key
|
|
25
|
-
|
|
26
|
-
Headers: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`, `Retry-After` (on 429).
|
|
27
|
-
|
|
28
|
-
## Endpoints
|
|
29
|
-
|
|
30
|
-
Public read:
|
|
31
|
-
|
|
32
|
-
- `GET /api/v1/search?q=...`
|
|
33
|
-
- `GET /api/v1/skills?limit=&cursor=&sort=`
|
|
34
|
-
- `sort`: `updated` (default), `downloads`, `stars` (`rating`), `installsCurrent` (`installs`), `installsAllTime`, `trending`
|
|
35
|
-
- `GET /api/v1/skills/{slug}`
|
|
36
|
-
- `GET /api/v1/skills/{slug}/versions?limit=&cursor=`
|
|
37
|
-
- `GET /api/v1/skills/{slug}/versions/{version}`
|
|
38
|
-
- `GET /api/v1/skills/{slug}/file?path=&version=&tag=`
|
|
39
|
-
- `GET /api/v1/resolve?slug=&hash=`
|
|
40
|
-
- `GET /api/v1/download?slug=&version=&tag=`
|
|
41
|
-
|
|
42
|
-
Auth required:
|
|
43
|
-
|
|
44
|
-
- `POST /api/v1/skills` (publish, multipart preferred)
|
|
45
|
-
- `DELETE /api/v1/skills/{slug}`
|
|
46
|
-
- `POST /api/v1/skills/{slug}/undelete`
|
|
47
|
-
- `GET /api/v1/whoami`
|
|
48
|
-
|
|
49
|
-
## Legacy
|
|
50
|
-
|
|
51
|
-
Legacy `/api/*` and `/api/cli/*` still available. See `DEPRECATIONS.md`.
|
package/docs/architecture.md
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'System overview: web app + Convex backend + CLI + shared schema.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Orienting in codebase
|
|
5
|
-
- Tracing a user flow across layers
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Architecture
|
|
9
|
-
|
|
10
|
-
## Pieces
|
|
11
|
-
|
|
12
|
-
- Web app: TanStack Start (React) under `src/`.
|
|
13
|
-
- Backend: Convex under `convex/` (DB, storage, actions, HTTP routes).
|
|
14
|
-
- CLI: `packages/pilothub/` (published as `pilothub`).
|
|
15
|
-
- Shared schemas/routes: `packages/schema/` (`pilothub-schema`).
|
|
16
|
-
|
|
17
|
-
## Data + storage
|
|
18
|
-
|
|
19
|
-
- Skill “bundle” = versioned set of text files stored in Convex `_storage`.
|
|
20
|
-
- Metadata extracted from `SKILL.md` frontmatter.
|
|
21
|
-
- Stats stored on `skills` (downloads, installs, stars, comments, …).
|
|
22
|
-
|
|
23
|
-
## Main flows
|
|
24
|
-
|
|
25
|
-
### Browse (web)
|
|
26
|
-
|
|
27
|
-
- UI reads skill metadata + latest version from Convex queries/actions.
|
|
28
|
-
- `SKILL.md` rendered as Markdown.
|
|
29
|
-
|
|
30
|
-
### Search (HTTP)
|
|
31
|
-
|
|
32
|
-
- `/api/v1/search?q=...` routes to Convex action for vector search.
|
|
33
|
-
- Embeddings currently generated during publish.
|
|
34
|
-
|
|
35
|
-
### Install (CLI)
|
|
36
|
-
|
|
37
|
-
- Resolve latest version via `/api/v1/skills/<slug>`.
|
|
38
|
-
- Download zip via `/api/v1/download?slug=...&version=...`.
|
|
39
|
-
- Extract into `./skills/<slug>` (default).
|
|
40
|
-
- Persist install state:
|
|
41
|
-
- `./.pilothub/lock.json` (per workdir)
|
|
42
|
-
- `./skills/<slug>/.pilothub/origin.json` (per skill folder)
|
|
43
|
-
|
|
44
|
-
### Update (CLI)
|
|
45
|
-
|
|
46
|
-
- Hash local files, call `/api/v1/resolve?slug=...&hash=<sha256>`.
|
|
47
|
-
- If local matches a known version → use that for “current”.
|
|
48
|
-
- If local doesn’t match:
|
|
49
|
-
- refuse by default
|
|
50
|
-
- or overwrite with `--force`
|
|
51
|
-
|
|
52
|
-
### Publish (CLI)
|
|
53
|
-
|
|
54
|
-
- Publish via `POST /api/v1/skills` (multipart; requires Bearer token).
|
|
55
|
-
|
|
56
|
-
### Sync (CLI)
|
|
57
|
-
|
|
58
|
-
- Scan roots for skill folders (contain `SKILL.md`).
|
|
59
|
-
- Compute fingerprint; compare to registry state.
|
|
60
|
-
- Optionally reports telemetry (see `docs/telemetry.md`).
|
|
61
|
-
- Publishes new/changed skills (skips modified installed skills inside install root).
|
package/docs/auth.md
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Auth overview: GitHub OAuth (web) + API tokens (CLI).'
|
|
3
|
-
read_when:
|
|
4
|
-
- Working on login/token flows
|
|
5
|
-
- Debugging 401s
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Auth
|
|
9
|
-
|
|
10
|
-
## Web auth (GitHub OAuth)
|
|
11
|
-
|
|
12
|
-
- Convex Auth + GitHub OAuth App.
|
|
13
|
-
- Env vars:
|
|
14
|
-
- `AUTH_GITHUB_ID`
|
|
15
|
-
- `AUTH_GITHUB_SECRET`
|
|
16
|
-
- `CONVEX_SITE_URL` (used by auth config)
|
|
17
|
-
|
|
18
|
-
Local setup steps are in the repo root `README.md`.
|
|
19
|
-
|
|
20
|
-
## API tokens (CLI)
|
|
21
|
-
|
|
22
|
-
The CLI uses a long-lived API token (Bearer token) for publish/sync/delete.
|
|
23
|
-
|
|
24
|
-
### Browser flow (default)
|
|
25
|
-
|
|
26
|
-
`pilothub login` does:
|
|
27
|
-
|
|
28
|
-
1. Starts a loopback HTTP server on `127.0.0.1` (random port).
|
|
29
|
-
2. Opens `<site>/cli/auth?redirect_uri=http://127.0.0.1:<port>/callback&state=...`.
|
|
30
|
-
3. Web UI requires GitHub login, then creates a token and redirects back to the loopback server.
|
|
31
|
-
4. CLI stores the token in the global config file.
|
|
32
|
-
|
|
33
|
-
### Headless flow
|
|
34
|
-
|
|
35
|
-
Create a token in the web UI (Settings → API tokens) and paste it:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
pilothub login --token clh_...
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Token storage
|
|
42
|
-
|
|
43
|
-
Default global config path:
|
|
44
|
-
|
|
45
|
-
- macOS: `~/Library/Application Support/pilothub/config.json`
|
|
46
|
-
|
|
47
|
-
Override:
|
|
48
|
-
|
|
49
|
-
- `PILOTHUB_CONFIG_PATH=/path/to/config.json`
|
|
50
|
-
|
|
51
|
-
### Revocation
|
|
52
|
-
|
|
53
|
-
- Tokens can be revoked in the web UI.
|
|
54
|
-
- Revoked tokens return `401 Unauthorized` on CLI endpoints.
|
package/docs/cli.md
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'CLI reference: commands, flags, config, lockfile, sync behavior.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Working on CLI behavior
|
|
5
|
-
- Debugging install/update/sync
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# CLI
|
|
9
|
-
|
|
10
|
-
CLI package: `packages/pilothub/` (bin: `pilothub`).
|
|
11
|
-
|
|
12
|
-
From this repo you can run it via the wrapper script:
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
bun pilothub --help
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Global flags
|
|
19
|
-
|
|
20
|
-
- `--workdir <dir>`: working directory (default: cwd; falls back to Pilotbot workspace if configured)
|
|
21
|
-
- `--dir <dir>`: install dir under workdir (default: `skills`)
|
|
22
|
-
- `--site <url>`: base URL for browser login (default: `https://pilothub.com`)
|
|
23
|
-
- `--registry <url>`: API base URL (default: discovered, else `https://pilothub.com`)
|
|
24
|
-
- `--no-input`: disable prompts
|
|
25
|
-
|
|
26
|
-
Env equivalents:
|
|
27
|
-
|
|
28
|
-
- `PILOTHUB_SITE`
|
|
29
|
-
- `PILOTHUB_REGISTRY`
|
|
30
|
-
- `PILOTHUB_WORKDIR`
|
|
31
|
-
|
|
32
|
-
## Config file
|
|
33
|
-
|
|
34
|
-
Stores your API token + cached registry URL.
|
|
35
|
-
|
|
36
|
-
- macOS: `~/Library/Application Support/pilothub/config.json`
|
|
37
|
-
- override: `PILOTHUB_CONFIG_PATH`
|
|
38
|
-
|
|
39
|
-
## Commands
|
|
40
|
-
|
|
41
|
-
### `login` / `auth login`
|
|
42
|
-
|
|
43
|
-
- Default: opens browser to `<site>/cli/auth` and completes via loopback callback.
|
|
44
|
-
- Headless: `pilothub login --token clh_...`
|
|
45
|
-
|
|
46
|
-
### `whoami`
|
|
47
|
-
|
|
48
|
-
- Verifies the stored token via `/api/v1/whoami`.
|
|
49
|
-
|
|
50
|
-
### `star <slug>` / `unstar <slug>`
|
|
51
|
-
|
|
52
|
-
- Adds/removes a skill from your highlights.
|
|
53
|
-
- Calls `POST /api/v1/stars/<slug>` and `DELETE /api/v1/stars/<slug>`.
|
|
54
|
-
- `--yes` skips confirmation.
|
|
55
|
-
|
|
56
|
-
### `search <query...>`
|
|
57
|
-
|
|
58
|
-
- Calls `/api/v1/search?q=...`.
|
|
59
|
-
|
|
60
|
-
### `explore`
|
|
61
|
-
|
|
62
|
-
- Lists latest updated skills via `/api/v1/skills?limit=...` (sorted by `updatedAt` desc).
|
|
63
|
-
- Flags:
|
|
64
|
-
- `--limit <n>` (1–200, default: 25)
|
|
65
|
-
- `--sort newest|downloads|rating|installs|installsAllTime|trending` (default: newest)
|
|
66
|
-
- `--json` (machine-readable output)
|
|
67
|
-
- Output: `<slug> v<version> <age> <summary>` (summary truncated to 50 chars).
|
|
68
|
-
|
|
69
|
-
### `install <slug>`
|
|
70
|
-
|
|
71
|
-
- Resolves latest version via `/api/v1/skills/<slug>`.
|
|
72
|
-
- Downloads zip via `/api/v1/download`.
|
|
73
|
-
- Extracts into `<workdir>/<dir>/<slug>`.
|
|
74
|
-
- Writes:
|
|
75
|
-
- `<workdir>/.pilothub/lock.json`
|
|
76
|
-
- `<skill>/.pilothub/origin.json`
|
|
77
|
-
|
|
78
|
-
### `list`
|
|
79
|
-
|
|
80
|
-
- Reads `<workdir>/.pilothub/lock.json`.
|
|
81
|
-
|
|
82
|
-
### `update [slug]` / `update --all`
|
|
83
|
-
|
|
84
|
-
- Computes fingerprint from local files.
|
|
85
|
-
- If fingerprint matches a known version: no prompt.
|
|
86
|
-
- If fingerprint does not match:
|
|
87
|
-
- refuses by default
|
|
88
|
-
- overwrites with `--force` (or prompt, if interactive)
|
|
89
|
-
|
|
90
|
-
### `publish <path>`
|
|
91
|
-
|
|
92
|
-
- Publishes via `POST /api/v1/skills` (multipart).
|
|
93
|
-
- Requires semver: `--version 1.2.3`.
|
|
94
|
-
|
|
95
|
-
### `sync`
|
|
96
|
-
|
|
97
|
-
- Scans for local skill folders and publishes new/changed ones.
|
|
98
|
-
- Roots can be any folder: a skills directory or a single skill folder with `SKILL.md`.
|
|
99
|
-
- Auto-adds Pilotbot skill roots when `~/.pilotbot/pilotbot.json` is present:
|
|
100
|
-
- `agent.workspace/skills` (main agent)
|
|
101
|
-
- `routing.agents.*.workspace/skills` (per-agent)
|
|
102
|
-
- `~/.pilotbot/skills` (shared)
|
|
103
|
-
- `skills.load.extraDirs` (shared packs)
|
|
104
|
-
- Respects `PILOTBOT_CONFIG_PATH` and `PILOTBOT_STATE_DIR`.
|
|
105
|
-
- Flags:
|
|
106
|
-
- `--root <dir...>` extra scan roots
|
|
107
|
-
- `--all` upload without prompting
|
|
108
|
-
- `--dry-run` show plan only
|
|
109
|
-
- `--bump patch|minor|major` (default: patch)
|
|
110
|
-
- `--changelog <text>` (non-interactive)
|
|
111
|
-
- `--tags a,b,c` (default: latest)
|
|
112
|
-
- `--concurrency <n>` (default: 4)
|
|
113
|
-
|
|
114
|
-
Telemetry:
|
|
115
|
-
|
|
116
|
-
- Sent during `sync` when logged in, unless `PILOTHUB_DISABLE_TELEMETRY=1`.
|
|
117
|
-
- Details: `docs/telemetry.md`.
|
package/docs/deploy.md
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Deploy checklist: Convex backend + Vercel web app + /api rewrites.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Shipping to production
|
|
5
|
-
- Debugging /api routing
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Deploy
|
|
9
|
-
|
|
10
|
-
PilotHub is two deployables:
|
|
11
|
-
|
|
12
|
-
- Web app (TanStack Start) → typically Vercel.
|
|
13
|
-
- Convex backend → Convex deployment (serves `/api/...` routes).
|
|
14
|
-
|
|
15
|
-
## 1) Deploy Convex
|
|
16
|
-
|
|
17
|
-
From your local machine:
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
bunx convex deploy
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Ensure Convex env is set (auth + embeddings):
|
|
24
|
-
|
|
25
|
-
- `AUTH_GITHUB_ID`
|
|
26
|
-
- `AUTH_GITHUB_SECRET`
|
|
27
|
-
- `CONVEX_SITE_URL`
|
|
28
|
-
- `JWT_PRIVATE_KEY`
|
|
29
|
-
- `JWKS`
|
|
30
|
-
- `OPENAI_API_KEY`
|
|
31
|
-
- `SITE_URL` (your web app URL)
|
|
32
|
-
- Optional webhook env (see `docs/webhook.md`)
|
|
33
|
-
|
|
34
|
-
## 2) Deploy web app (Vercel)
|
|
35
|
-
|
|
36
|
-
Set env vars:
|
|
37
|
-
|
|
38
|
-
- `VITE_CONVEX_URL`
|
|
39
|
-
- `VITE_CONVEX_SITE_URL` (Convex “site” URL)
|
|
40
|
-
- `CONVEX_SITE_URL` (same value; used by auth provider config)
|
|
41
|
-
- `SITE_URL` (web app URL)
|
|
42
|
-
|
|
43
|
-
## 3) Route `/api/*` to Convex
|
|
44
|
-
|
|
45
|
-
This repo currently uses `vercel.json` rewrites:
|
|
46
|
-
|
|
47
|
-
- `source: /api/:path*`
|
|
48
|
-
- `destination: https://<deployment>.convex.site/api/:path*`
|
|
49
|
-
|
|
50
|
-
For self-host:
|
|
51
|
-
|
|
52
|
-
- update `vercel.json` to your deployment’s Convex site URL.
|
|
53
|
-
|
|
54
|
-
## 4) Registry discovery
|
|
55
|
-
|
|
56
|
-
The CLI can discover the API base from:
|
|
57
|
-
|
|
58
|
-
- `/.well-known/pilothub.json`
|
|
59
|
-
|
|
60
|
-
If you don’t serve that file, users must set:
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
export PILOTHUB_REGISTRY=https://your-site.example
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## 5) Post-deploy checks
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
curl -i "https://<site>/api/v1/search?q=test"
|
|
70
|
-
curl -i "https://<site>/api/v1/skills/gifgrep"
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Then:
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
pilothub login --site https://<site>
|
|
77
|
-
pilothub whoami
|
|
78
|
-
```
|