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/docs/skill-format.md
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Skill folder format, required files, allowed file types, limits.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Publishing skills
|
|
5
|
-
- Debugging publish/sync failures
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Skill format
|
|
9
|
-
|
|
10
|
-
## On disk
|
|
11
|
-
|
|
12
|
-
A skill is a folder.
|
|
13
|
-
|
|
14
|
-
Required:
|
|
15
|
-
|
|
16
|
-
- `SKILL.md` (or `skill.md`)
|
|
17
|
-
|
|
18
|
-
Optional:
|
|
19
|
-
|
|
20
|
-
- any supporting *text-based* files (see “Allowed files”)
|
|
21
|
-
- `.pilothubignore` (ignore patterns for publish/sync)
|
|
22
|
-
- `.gitignore` (also honored)
|
|
23
|
-
|
|
24
|
-
Local install metadata (written by the CLI):
|
|
25
|
-
|
|
26
|
-
- `<skill>/.pilothub/origin.json`
|
|
27
|
-
|
|
28
|
-
Workdir install state (written by the CLI):
|
|
29
|
-
|
|
30
|
-
- `<workdir>/.pilothub/lock.json`
|
|
31
|
-
|
|
32
|
-
## `SKILL.md`
|
|
33
|
-
|
|
34
|
-
- Markdown with optional YAML frontmatter.
|
|
35
|
-
- The server extracts metadata from frontmatter during publish.
|
|
36
|
-
- `description` is used as the skill summary in the UI/search.
|
|
37
|
-
|
|
38
|
-
## Allowed files
|
|
39
|
-
|
|
40
|
-
Only “text-based” files are accepted by publish.
|
|
41
|
-
|
|
42
|
-
- Extension allowlist is in `packages/schema/src/textFiles.ts` (`TEXT_FILE_EXTENSIONS`).
|
|
43
|
-
- Content types starting with `text/` are treated as text; plus a small allowlist (JSON/YAML/TOML/JS/TS/Markdown/SVG).
|
|
44
|
-
|
|
45
|
-
Limits (server-side):
|
|
46
|
-
|
|
47
|
-
- Total bundle size: 50MB.
|
|
48
|
-
- Embedding text includes `SKILL.md` + up to ~40 non-`.md` files (best-effort cap).
|
|
49
|
-
|
|
50
|
-
## Slugs
|
|
51
|
-
|
|
52
|
-
- Derived from folder name by default.
|
|
53
|
-
- Must be lowercase and URL-safe: `^[a-z0-9][a-z0-9-]*$`.
|
|
54
|
-
|
|
55
|
-
## Versioning + tags
|
|
56
|
-
|
|
57
|
-
- Each publish creates a new version (semver).
|
|
58
|
-
- Tags are string pointers to a version; `latest` is commonly used.
|
package/docs/soul-format.md
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Soul bundle format, required files, limits.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Publishing souls
|
|
5
|
-
- Debugging soul publish failures
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Soul format
|
|
9
|
-
|
|
10
|
-
## On disk
|
|
11
|
-
|
|
12
|
-
A soul is a single file:
|
|
13
|
-
|
|
14
|
-
- `SOUL.md` (or `soul.md`)
|
|
15
|
-
|
|
16
|
-
For now, onlycrabs.ai rejects any extra files.
|
|
17
|
-
|
|
18
|
-
## `SOUL.md`
|
|
19
|
-
|
|
20
|
-
- Markdown with optional YAML frontmatter.
|
|
21
|
-
- The server extracts metadata from frontmatter during publish.
|
|
22
|
-
- `description` is used as the soul summary in the UI/search.
|
|
23
|
-
|
|
24
|
-
## Limits
|
|
25
|
-
|
|
26
|
-
- Total bundle size: 50MB.
|
|
27
|
-
- Embedding text includes `SOUL.md` only.
|
|
28
|
-
|
|
29
|
-
## Slugs
|
|
30
|
-
|
|
31
|
-
- Derived from folder name by default.
|
|
32
|
-
- Must be lowercase and URL-safe: `^[a-z0-9][a-z0-9-]*$`.
|
|
33
|
-
|
|
34
|
-
## Versioning + tags
|
|
35
|
-
|
|
36
|
-
- Each publish creates a new version (semver).
|
|
37
|
-
- Tags are string pointers to a version; `latest` is commonly used.
|
package/docs/spec.md
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "PilotHub spec: skills registry, versioning, vector search, moderation"
|
|
3
|
-
read_when:
|
|
4
|
-
- Bootstrapping PilotHub
|
|
5
|
-
- Implementing schema/auth/search/versioning
|
|
6
|
-
- Reviewing API and upload/download flows
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# PilotHub — product + implementation spec (v1)
|
|
10
|
-
|
|
11
|
-
## Goals
|
|
12
|
-
- onlycrabs.ai mode for sharing `SOUL.md` bundles (host-based entry point).
|
|
13
|
-
- Minimal, fast SPA for browsing and publishing agent skills.
|
|
14
|
-
- Skills stored in Convex (files + metadata + versions + stats).
|
|
15
|
-
- GitHub OAuth login; GitHub App backs up skills to `pilotbot/skills`.
|
|
16
|
-
- Vector-based search over skill text + metadata.
|
|
17
|
-
- Versioning, tags (`latest` + user tags), changelog, rollback (tag movement).
|
|
18
|
-
- Public read access; upload requires auth.
|
|
19
|
-
- Moderation: badges + comment delete; audit everything.
|
|
20
|
-
|
|
21
|
-
## Non-goals (v1)
|
|
22
|
-
- Paid features, private skills, or binary assets.
|
|
23
|
-
- GitHub App sync beyond backups (future phase).
|
|
24
|
-
|
|
25
|
-
## Core objects
|
|
26
|
-
|
|
27
|
-
### User
|
|
28
|
-
- `authId` (from Convex Auth provider)
|
|
29
|
-
- `handle` (GitHub login)
|
|
30
|
-
- `name`, `bio`
|
|
31
|
-
- `avatarUrl` (GitHub, fallback gravatar)
|
|
32
|
-
- `role`: `admin | moderator | user` (moderators can soft-delete and flag; admins can hard-delete + change owners)
|
|
33
|
-
- `createdAt`, `updatedAt`
|
|
34
|
-
|
|
35
|
-
### Skill
|
|
36
|
-
- `slug` (unique)
|
|
37
|
-
- `displayName`
|
|
38
|
-
- `ownerUserId`
|
|
39
|
-
- `summary` (from SKILL.md frontmatter `description`)
|
|
40
|
-
- `latestVersionId`
|
|
41
|
-
- `latestTagVersionId` (for `latest` tag)
|
|
42
|
-
- `tags` map: `{ tag -> versionId }`
|
|
43
|
-
- `badges`: `{ redactionApproved?: { byUserId, at }, highlighted?: { byUserId, at }, official?: { byUserId, at }, deprecated?: { byUserId, at } }`
|
|
44
|
-
- `official` marks admin-verified/official skills.
|
|
45
|
-
- `deprecated` marks skills that should not be used for new integrations.
|
|
46
|
-
- `moderationStatus`: `active | hidden | removed`
|
|
47
|
-
- `moderationFlags`: `string[]` (automatic detection)
|
|
48
|
-
- `moderationNotes`, `moderationReason`
|
|
49
|
-
- `hiddenAt`, `hiddenBy`, `lastReviewedAt`, `reportCount`
|
|
50
|
-
- `stats`: `{ downloads, stars, versions, comments }`
|
|
51
|
-
- `createdAt`, `updatedAt`
|
|
52
|
-
|
|
53
|
-
### SkillVersion
|
|
54
|
-
- `skillId`
|
|
55
|
-
- `version` (semver string)
|
|
56
|
-
- `tag` (string, optional; `latest` always maintained separately)
|
|
57
|
-
- `changelog` (required)
|
|
58
|
-
- `files`: list of file metadata
|
|
59
|
-
- `path`, `size`, `storageId`, `sha256`
|
|
60
|
-
- `parsed` (metadata extracted from SKILL.md)
|
|
61
|
-
- `vectorDocId` (if using RAG component) OR `embeddingId`
|
|
62
|
-
- `createdBy`, `createdAt`
|
|
63
|
-
- `softDeletedAt` (nullable)
|
|
64
|
-
|
|
65
|
-
### Parsed Skill Metadata
|
|
66
|
-
From SKILL.md frontmatter + AgentSkills + Pilotbot extensions:
|
|
67
|
-
- `name`, `description`, `homepage`, `website`, `url`, `emoji`
|
|
68
|
-
- `metadata.pilotbot`: `always`, `skillKey`, `primaryEnv`, `emoji`, `homepage`, `os`,
|
|
69
|
-
`requires` (`bins`, `anyBins`, `env`, `config`), `install[]`, `nix` (`plugin`, `systems`),
|
|
70
|
-
`config` (`requiredEnv`, `stateDirs`, `example`), `cliHelp` (string; `cli --help` output)
|
|
71
|
-
- `metadata.pilotbot`: alias of `metadata.pilotbot` (preferred for nix-pilotbot plugin pointers)
|
|
72
|
-
- Nix plugins are different from regular skills; they bundle the skill pack, the CLI binary, and config flags/requirements together.
|
|
73
|
-
- `metadata` in frontmatter is YAML (object) preferred; legacy JSON-string accepted.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
### Soul
|
|
78
|
-
- `slug` (unique)
|
|
79
|
-
- `displayName`
|
|
80
|
-
- `ownerUserId`
|
|
81
|
-
- `summary` (from SOUL.md frontmatter `description`)
|
|
82
|
-
- `latestVersionId`
|
|
83
|
-
- `tags` map: `{ tag -> versionId }`
|
|
84
|
-
- `stats`: `{ downloads, stars, versions, comments }`
|
|
85
|
-
- `status`: `active` only (soft-delete on version/comment only)
|
|
86
|
-
- `createdAt`, `updatedAt`
|
|
87
|
-
|
|
88
|
-
### SoulVersion
|
|
89
|
-
- `soulId`
|
|
90
|
-
- `version` (semver string)
|
|
91
|
-
- `tag` (string, optional; `latest` always maintained separately)
|
|
92
|
-
- `changelog` (required)
|
|
93
|
-
- `files`: list of file metadata (SOUL.md only)
|
|
94
|
-
- `path`, `size`, `storageId`, `sha256`
|
|
95
|
-
- `parsed` (metadata extracted from SOUL.md)
|
|
96
|
-
- `vectorDocId` (if using RAG component) OR `embeddingId`
|
|
97
|
-
- `createdBy`, `createdAt`
|
|
98
|
-
- `softDeletedAt` (nullable)
|
|
99
|
-
|
|
100
|
-
### SoulComment
|
|
101
|
-
- `soulId`, `userId`, `body`
|
|
102
|
-
- `softDeletedAt`, `deletedBy`
|
|
103
|
-
- `createdAt`
|
|
104
|
-
|
|
105
|
-
### SoulStar
|
|
106
|
-
- `soulId`, `userId`, `createdAt`
|
|
107
|
-
|
|
108
|
-
### Comment
|
|
109
|
-
- `skillId`, `userId`, `body`
|
|
110
|
-
- `softDeletedAt`, `deletedBy`
|
|
111
|
-
- `createdAt`
|
|
112
|
-
|
|
113
|
-
### Star
|
|
114
|
-
- `skillId`, `userId`, `createdAt`
|
|
115
|
-
|
|
116
|
-
### AuditLog
|
|
117
|
-
- `actorUserId`
|
|
118
|
-
- `action` (enum: `badge.set`, `badge.unset`, `comment.delete`, `role.change`)
|
|
119
|
-
- `targetType` / `targetId`
|
|
120
|
-
- `metadata` (json)
|
|
121
|
-
- `createdAt`
|
|
122
|
-
|
|
123
|
-
## Auth + roles
|
|
124
|
-
- Convex Auth with GitHub OAuth App.
|
|
125
|
-
- Default role `user`; bootstrap `steipete` to `admin` on first login.
|
|
126
|
-
- Management console: moderators can hide/restore skills + mark duplicates; admins can change owners, approve badges, and hard-delete.
|
|
127
|
-
- Role changes are admin-only and audited.
|
|
128
|
-
|
|
129
|
-
## Upload flow (50MB per version)
|
|
130
|
-
1) Client requests upload session.
|
|
131
|
-
2) Client uploads each file via Convex upload URLs (no binaries, text only).
|
|
132
|
-
3) Client submits metadata + file list + changelog + version + tags.
|
|
133
|
-
4) Server validates:
|
|
134
|
-
- total size ≤ 50MB
|
|
135
|
-
- file extensions/text content
|
|
136
|
-
- SKILL.md exists and frontmatter parseable
|
|
137
|
-
- version uniqueness
|
|
138
|
-
5) Server stores files + metadata, sets `latest` tag, updates stats.
|
|
139
|
-
|
|
140
|
-
Soul upload flow: same as skills, but only `SOUL.md` is allowed in the bundle.
|
|
141
|
-
Seed data lives in `convex/seed.ts` for local dev.
|
|
142
|
-
|
|
143
|
-
## Versioning + tags
|
|
144
|
-
- Each upload is a new `SkillVersion`.
|
|
145
|
-
- `latest` tag always points to most recent version unless user re-tags.
|
|
146
|
-
- Rollback: move `latest` (and optionally other tags) to an older version.
|
|
147
|
-
- Changelog is optional.
|
|
148
|
-
|
|
149
|
-
## Search
|
|
150
|
-
- Vector search over: SKILL.md + other text files + metadata summary (souls index SOUL.md).
|
|
151
|
-
- Convex embeddings + vector index.
|
|
152
|
-
- Filters: tag, owner, `redactionApproved` only, min stars, updatedAt.
|
|
153
|
-
|
|
154
|
-
## Download API
|
|
155
|
-
- JSON API for skill metadata + versions.
|
|
156
|
-
- Download endpoint returns zip of a version (HTTP action).
|
|
157
|
-
- Soft-delete versions; downloads remain for non-deleted versions only.
|
|
158
|
-
|
|
159
|
-
## UI (SPA)
|
|
160
|
-
- Home: search + filters + trending/featured + “Highlighted” badge.
|
|
161
|
-
- Skill detail: README render, files list, version history, tags, stats, badges.
|
|
162
|
-
- Upload/edit: file picker + version + tag + changelog.
|
|
163
|
-
- Account settings: name + delete account (soft delete).
|
|
164
|
-
- Admin: user role management + badge approvals + audit log.
|
|
165
|
-
|
|
166
|
-
## Testing + quality
|
|
167
|
-
- Vitest 4 with >=70% global coverage.
|
|
168
|
-
- Lint: Biome + Oxlint (type-aware).
|
|
169
|
-
|
|
170
|
-
## Vercel
|
|
171
|
-
- Env vars: Convex deployment URLs + GitHub OAuth client + OpenAI key (if used) + GitHub App backup credentials.
|
|
172
|
-
- SPA feel: client-side transitions, prefetching, optimistic UI.
|
|
173
|
-
|
|
174
|
-
## Open questions (carry forward)
|
|
175
|
-
- Embeddings provider key + rate limits.
|
|
176
|
-
- Zip generation memory limits (optimize with streaming if needed).
|
|
177
|
-
- GitHub App repo sync (phase 2).
|
package/docs/telemetry.md
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Install telemetry collected via `pilothub sync` + opt-out.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Working on telemetry / privacy controls
|
|
5
|
-
- Questions about what data is collected
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Telemetry
|
|
9
|
-
|
|
10
|
-
PilotHub uses **minimal telemetry** to compute **install counts** (what’s actually in use) and to power better sorting/filtering.
|
|
11
|
-
This is based on the CLI `pilothub sync` command.
|
|
12
|
-
|
|
13
|
-
## When telemetry is collected
|
|
14
|
-
|
|
15
|
-
Telemetry is only sent when:
|
|
16
|
-
|
|
17
|
-
- You are **logged in** in the CLI (we already require auth for sync/publish flows).
|
|
18
|
-
- You run `pilothub sync`.
|
|
19
|
-
- Telemetry is **not disabled** (see “How to disable” below).
|
|
20
|
-
|
|
21
|
-
If you are not logged in, nothing is reported.
|
|
22
|
-
|
|
23
|
-
## What we collect
|
|
24
|
-
|
|
25
|
-
On each `pilothub sync`, the CLI reports a **full snapshot** of what it found, grouped by scan root (“folder/root”).
|
|
26
|
-
|
|
27
|
-
For each root we store:
|
|
28
|
-
|
|
29
|
-
- `rootId`: a **SHA-256 hash** of the canonical root path (server never sees the raw path).
|
|
30
|
-
- `label`: a human-readable label derived from the last two path segments (home paths are shown with `~`).
|
|
31
|
-
- `firstSeenAt`, `lastSeenAt`, optional `expiredAt`.
|
|
32
|
-
|
|
33
|
-
For each skill found under a root we store:
|
|
34
|
-
|
|
35
|
-
- `skillId` (resolved by slug; only skills that exist in the registry are tracked).
|
|
36
|
-
- `firstSeenAt`, `lastSeenAt`.
|
|
37
|
-
- `lastVersion` (best-effort; currently the registry-matched version if known).
|
|
38
|
-
- optional `removedAt` when a previously-reported install disappears from a root.
|
|
39
|
-
|
|
40
|
-
### What we do *not* collect
|
|
41
|
-
|
|
42
|
-
- No raw absolute folder paths (only hashed `rootId` + a short display label).
|
|
43
|
-
- No file contents.
|
|
44
|
-
- No per-run logs, prompts, or other CLI output.
|
|
45
|
-
- No tracking for skills that aren’t uploaded to the registry (unknown slugs are ignored).
|
|
46
|
-
|
|
47
|
-
## Install counts
|
|
48
|
-
|
|
49
|
-
We maintain two counters per skill:
|
|
50
|
-
|
|
51
|
-
- `installsCurrent`: unique users who currently have the skill installed in at least one active root.
|
|
52
|
-
- `installsAllTime`: unique users who have ever reported the skill installed.
|
|
53
|
-
|
|
54
|
-
### Multiple roots
|
|
55
|
-
|
|
56
|
-
If you sync from multiple folders, we treat each scan root independently. A skill is “currently installed” if it exists in **any** active root.
|
|
57
|
-
|
|
58
|
-
### Uninstall detection
|
|
59
|
-
|
|
60
|
-
Because `sync` reports the full set per root:
|
|
61
|
-
|
|
62
|
-
- If a skill disappears from a root on the next sync, we mark it removed for that root.
|
|
63
|
-
- If the skill is removed from all of your roots, it no longer counts toward `installsCurrent`.
|
|
64
|
-
- `installsAllTime` never decreases unless you delete telemetry (see below).
|
|
65
|
-
|
|
66
|
-
### Staleness (120 days)
|
|
67
|
-
|
|
68
|
-
Roots that don’t report telemetry for **120 days** are marked stale and their installs stop counting toward `installsCurrent`.
|
|
69
|
-
This is evaluated lazily (on the next telemetry report) to avoid background jobs.
|
|
70
|
-
|
|
71
|
-
## Transparency + user controls
|
|
72
|
-
|
|
73
|
-
PilotHub provides a private “Installed” tab on your own profile:
|
|
74
|
-
|
|
75
|
-
- Shows the exact roots + installed skills we store.
|
|
76
|
-
- Includes a **JSON export** view.
|
|
77
|
-
- Includes a **Delete telemetry** action to remove all stored telemetry for your account.
|
|
78
|
-
|
|
79
|
-
Everyone else only sees **aggregated install counters**; no one else can see your roots/folders.
|
|
80
|
-
|
|
81
|
-
Deleting your account also deletes your telemetry data.
|
|
82
|
-
|
|
83
|
-
## How to disable telemetry
|
|
84
|
-
|
|
85
|
-
Set the environment variable:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
export PILOTHUB_DISABLE_TELEMETRY=1
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
With this set, the CLI will not send telemetry during `pilothub sync`.
|
package/docs/troubleshooting.md
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Common setup/runtime issues (CLI + backend) and fixes.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Something is broken and you need a fix-fast checklist
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Troubleshooting
|
|
8
|
-
|
|
9
|
-
## `pilothub login` opens browser but never completes
|
|
10
|
-
|
|
11
|
-
- Ensure your browser can reach `http://127.0.0.1:<port>/callback` (local firewalls/VPNs can interfere).
|
|
12
|
-
- Use headless mode:
|
|
13
|
-
- create a token in the web UI (Settings → API tokens)
|
|
14
|
-
- `pilothub login --token clh_...`
|
|
15
|
-
|
|
16
|
-
## `whoami` / `publish` returns `Unauthorized` (401)
|
|
17
|
-
|
|
18
|
-
- Token missing or revoked: check your config file (`PILOTHUB_CONFIG_PATH` override?).
|
|
19
|
-
- Ensure requests include `Authorization: Bearer ...` (CLI does this automatically).
|
|
20
|
-
|
|
21
|
-
## `publish` fails with `OPENAI_API_KEY is not configured`
|
|
22
|
-
|
|
23
|
-
- Set `OPENAI_API_KEY` in the Convex environment (not only locally).
|
|
24
|
-
- Re-run `bunx convex dev` / `bunx convex deploy` after setting env.
|
|
25
|
-
|
|
26
|
-
## `sync` says “No skills found”
|
|
27
|
-
|
|
28
|
-
- `sync` looks for folders containing `SKILL.md` (or `skill.md`).
|
|
29
|
-
- It scans:
|
|
30
|
-
- workdir first
|
|
31
|
-
- then fallback roots (legacy `~/pilotbot/skills`, `~/pilotbot/skills`, etc.)
|
|
32
|
-
- Provide explicit roots:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
pilothub sync --root /path/to/skills
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## `update` refuses due to “local changes (no match)”
|
|
39
|
-
|
|
40
|
-
- Your local files don’t match any published fingerprint.
|
|
41
|
-
- Options:
|
|
42
|
-
- keep local edits; skip updating
|
|
43
|
-
- overwrite: `pilothub update <slug> --force`
|
|
44
|
-
- publish as fork: copy to new folder/slug then `pilothub publish ... --fork-of upstream@version`
|
|
45
|
-
|
|
46
|
-
## `GET /api/*` works locally but not on Vercel
|
|
47
|
-
|
|
48
|
-
- Check `vercel.json` rewrite destination points at your Convex site URL.
|
|
49
|
-
- Ensure `VITE_CONVEX_SITE_URL` and `CONVEX_SITE_URL` match your deployment.
|
package/docs/webhook.md
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: 'Discord webhook events/payloads for skill publish + highlight.'
|
|
3
|
-
read_when:
|
|
4
|
-
- Working on webhooks/integrations
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Webhooks (Discord)
|
|
8
|
-
|
|
9
|
-
PilotHub can post Discord embeds when skills are published or highlighted.
|
|
10
|
-
|
|
11
|
-
## Setup
|
|
12
|
-
|
|
13
|
-
Set the webhook URL in the Convex environment:
|
|
14
|
-
|
|
15
|
-
- `DISCORD_WEBHOOK_URL` (required): Discord webhook URL.
|
|
16
|
-
- `DISCORD_WEBHOOK_HIGHLIGHTED_ONLY` (optional): `true` to only send for highlighted skills.
|
|
17
|
-
- `SITE_URL` (optional): Base site URL for links (default `https://pilothub.com`).
|
|
18
|
-
|
|
19
|
-
## Events
|
|
20
|
-
|
|
21
|
-
- `skill.publish`: fires on every publish (new or updated version).
|
|
22
|
-
- `skill.highlighted`: fires when a skill is newly highlighted.
|
|
23
|
-
|
|
24
|
-
### Highlight-only filter
|
|
25
|
-
|
|
26
|
-
When `DISCORD_WEBHOOK_HIGHLIGHTED_ONLY=true`:
|
|
27
|
-
|
|
28
|
-
- `skill.publish` only sends if the skill is highlighted.
|
|
29
|
-
- `skill.highlighted` always sends.
|
|
30
|
-
|
|
31
|
-
## Payload (Discord)
|
|
32
|
-
|
|
33
|
-
Discord receives a JSON payload with a single embed:
|
|
34
|
-
|
|
35
|
-
```json
|
|
36
|
-
{
|
|
37
|
-
"embeds": [
|
|
38
|
-
{
|
|
39
|
-
"title": "Demo Skill",
|
|
40
|
-
"description": "Nice skill",
|
|
41
|
-
"url": "https://pilothub.com/owner/demo-skill",
|
|
42
|
-
"fields": [
|
|
43
|
-
{ "name": "Version", "value": "v1.2.3", "inline": true },
|
|
44
|
-
{ "name": "Owner", "value": "@owner", "inline": true },
|
|
45
|
-
{ "name": "Tags", "value": "latest, discord", "inline": false }
|
|
46
|
-
],
|
|
47
|
-
"footer": { "text": "PilotHub" }
|
|
48
|
-
}
|
|
49
|
-
]
|
|
50
|
-
}
|
|
51
|
-
```
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { expect, test } from '@playwright/test'
|
|
2
|
-
|
|
3
|
-
const navLabels = ['Skills', 'Upload', 'Import', 'Search']
|
|
4
|
-
|
|
5
|
-
test('skills loads without error', async ({ page }) => {
|
|
6
|
-
await page.goto('/skills', { waitUntil: 'domcontentloaded' })
|
|
7
|
-
await expect(page.locator('text=Something went wrong!')).toHaveCount(0)
|
|
8
|
-
await expect(page.locator('h1', { hasText: 'Skills' })).toBeVisible()
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
test('souls loads without error', async ({ page }) => {
|
|
12
|
-
await page.goto('/souls', { waitUntil: 'domcontentloaded' })
|
|
13
|
-
await expect(page.locator('text=Something went wrong!')).toHaveCount(0)
|
|
14
|
-
await expect(page.locator('h1', { hasText: 'Souls' })).toBeVisible()
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
test('header menu routes render', async ({ page }) => {
|
|
18
|
-
await page.goto('/', { waitUntil: 'domcontentloaded' })
|
|
19
|
-
|
|
20
|
-
for (const label of navLabels) {
|
|
21
|
-
const link = page.getByRole('link', { name: label }).first()
|
|
22
|
-
await expect(link).toBeVisible()
|
|
23
|
-
await link.click()
|
|
24
|
-
|
|
25
|
-
if (label === 'Skills') {
|
|
26
|
-
await expect(page).toHaveURL(/\/skills/)
|
|
27
|
-
await expect(page.locator('h1', { hasText: 'Skills' })).toBeVisible()
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (label === 'Upload') {
|
|
31
|
-
await expect(page).toHaveURL(/\/upload/)
|
|
32
|
-
const heading = page.locator('h1.section-title', { hasText: /^Publish a /i })
|
|
33
|
-
const signInCard = page.locator('text=Sign in to upload')
|
|
34
|
-
await expect(heading.or(signInCard)).toBeVisible()
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (label === 'Import') {
|
|
38
|
-
await expect(page).toHaveURL(/\/import/)
|
|
39
|
-
const heading = page.getByRole('heading', { name: 'Import from GitHub' })
|
|
40
|
-
const signInCard = page.locator('text=Sign in to import and publish skills.')
|
|
41
|
-
await expect(heading.or(signInCard)).toBeVisible()
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (label === 'Search') {
|
|
45
|
-
await expect(page).toHaveURL(/\/?(\?|$)/)
|
|
46
|
-
await expect(page.locator('h1', { hasText: 'PilotHub' })).toBeVisible()
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
})
|