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/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type Lockfile } from './schema/index.js';
|
|
2
|
+
export type SkillOrigin = {
|
|
3
|
+
version: 1;
|
|
4
|
+
registry: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
installedVersion: string;
|
|
7
|
+
installedAt: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function extractZipToDir(zipBytes: Uint8Array, targetDir: string): Promise<void>;
|
|
10
|
+
export declare function listTextFiles(root: string): Promise<{
|
|
11
|
+
relPath: string;
|
|
12
|
+
bytes: Uint8Array;
|
|
13
|
+
contentType?: string;
|
|
14
|
+
}[]>;
|
|
15
|
+
export type SkillFileHash = {
|
|
16
|
+
path: string;
|
|
17
|
+
sha256: string;
|
|
18
|
+
size: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function sha256Hex(bytes: Uint8Array): string;
|
|
21
|
+
export declare function buildSkillFingerprint(files: Array<{
|
|
22
|
+
path: string;
|
|
23
|
+
sha256: string;
|
|
24
|
+
}>): string;
|
|
25
|
+
export declare function hashSkillFiles(files: Array<{
|
|
26
|
+
relPath: string;
|
|
27
|
+
bytes: Uint8Array;
|
|
28
|
+
}>): {
|
|
29
|
+
files: {
|
|
30
|
+
path: string;
|
|
31
|
+
sha256: string;
|
|
32
|
+
size: number;
|
|
33
|
+
}[];
|
|
34
|
+
fingerprint: string;
|
|
35
|
+
};
|
|
36
|
+
export declare function hashSkillZip(zipBytes: Uint8Array): {
|
|
37
|
+
files: SkillFileHash[];
|
|
38
|
+
fingerprint: string;
|
|
39
|
+
};
|
|
40
|
+
export declare function readLockfile(workdir: string): Promise<Lockfile>;
|
|
41
|
+
export declare function writeLockfile(workdir: string, lock: Lockfile): Promise<void>;
|
|
42
|
+
export declare function readSkillOrigin(skillFolder: string): Promise<SkillOrigin | null>;
|
|
43
|
+
export declare function writeSkillOrigin(skillFolder: string, origin: SkillOrigin): Promise<void>;
|
package/dist/skills.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { unzipSync } from 'fflate';
|
|
5
|
+
import ignore from 'ignore';
|
|
6
|
+
import mime from 'mime';
|
|
7
|
+
import { LockfileSchema, parseArk, TEXT_FILE_EXTENSION_SET } from './schema/index.js';
|
|
8
|
+
export async function extractZipToDir(zipBytes, targetDir) {
|
|
9
|
+
const entries = unzipSync(zipBytes);
|
|
10
|
+
await mkdir(targetDir, { recursive: true });
|
|
11
|
+
for (const [rawPath, data] of Object.entries(entries)) {
|
|
12
|
+
const safePath = sanitizeRelPath(rawPath);
|
|
13
|
+
if (!safePath)
|
|
14
|
+
continue;
|
|
15
|
+
const outPath = join(targetDir, safePath);
|
|
16
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
17
|
+
await writeFile(outPath, data);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function listTextFiles(root) {
|
|
21
|
+
const files = [];
|
|
22
|
+
const absRoot = resolve(root);
|
|
23
|
+
const ig = ignore();
|
|
24
|
+
ig.add(['.git/', 'node_modules/', '.pilothub/']);
|
|
25
|
+
await addIgnoreFile(ig, join(absRoot, '.gitignore'));
|
|
26
|
+
await addIgnoreFile(ig, join(absRoot, '.pilothubignore'));
|
|
27
|
+
await walk(absRoot, async (absPath) => {
|
|
28
|
+
const relPath = normalizePath(relative(absRoot, absPath));
|
|
29
|
+
if (!relPath)
|
|
30
|
+
return;
|
|
31
|
+
if (ig.ignores(relPath))
|
|
32
|
+
return;
|
|
33
|
+
const ext = relPath.split('.').at(-1)?.toLowerCase() ?? '';
|
|
34
|
+
if (!ext || !TEXT_FILE_EXTENSION_SET.has(ext))
|
|
35
|
+
return;
|
|
36
|
+
const buffer = await readFile(absPath);
|
|
37
|
+
const contentType = mime.getType(relPath) ?? 'text/plain';
|
|
38
|
+
files.push({ relPath, bytes: new Uint8Array(buffer), contentType });
|
|
39
|
+
});
|
|
40
|
+
return files;
|
|
41
|
+
}
|
|
42
|
+
export function sha256Hex(bytes) {
|
|
43
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
44
|
+
}
|
|
45
|
+
export function buildSkillFingerprint(files) {
|
|
46
|
+
const normalized = files
|
|
47
|
+
.filter((file) => Boolean(file.path) && Boolean(file.sha256))
|
|
48
|
+
.map((file) => ({ path: file.path, sha256: file.sha256 }))
|
|
49
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
50
|
+
const payload = normalized.map((file) => `${file.path}:${file.sha256}`).join('\n');
|
|
51
|
+
return createHash('sha256').update(payload).digest('hex');
|
|
52
|
+
}
|
|
53
|
+
export function hashSkillFiles(files) {
|
|
54
|
+
const hashed = files.map((file) => ({
|
|
55
|
+
path: file.relPath,
|
|
56
|
+
sha256: sha256Hex(file.bytes),
|
|
57
|
+
size: file.bytes.byteLength,
|
|
58
|
+
}));
|
|
59
|
+
return { files: hashed, fingerprint: buildSkillFingerprint(hashed) };
|
|
60
|
+
}
|
|
61
|
+
export function hashSkillZip(zipBytes) {
|
|
62
|
+
const entries = unzipSync(zipBytes);
|
|
63
|
+
const hashed = Object.entries(entries)
|
|
64
|
+
.map(([rawPath, bytes]) => {
|
|
65
|
+
const safePath = sanitizeZipPath(rawPath);
|
|
66
|
+
if (!safePath)
|
|
67
|
+
return null;
|
|
68
|
+
const ext = safePath.split('.').at(-1)?.toLowerCase() ?? '';
|
|
69
|
+
if (!ext || !TEXT_FILE_EXTENSION_SET.has(ext))
|
|
70
|
+
return null;
|
|
71
|
+
return { path: safePath, sha256: sha256Hex(bytes), size: bytes.byteLength };
|
|
72
|
+
})
|
|
73
|
+
.filter(Boolean);
|
|
74
|
+
return { files: hashed, fingerprint: buildSkillFingerprint(hashed) };
|
|
75
|
+
}
|
|
76
|
+
export async function readLockfile(workdir) {
|
|
77
|
+
const path = join(workdir, '.pilothub', 'lock.json');
|
|
78
|
+
try {
|
|
79
|
+
const raw = await readFile(path, 'utf8');
|
|
80
|
+
const parsed = JSON.parse(raw);
|
|
81
|
+
return parseArk(LockfileSchema, parsed, 'Lockfile');
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return { version: 1, skills: {} };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export async function writeLockfile(workdir, lock) {
|
|
88
|
+
const path = join(workdir, '.pilothub', 'lock.json');
|
|
89
|
+
await mkdir(dirname(path), { recursive: true });
|
|
90
|
+
await writeFile(path, `${JSON.stringify(lock, null, 2)}\n`, 'utf8');
|
|
91
|
+
}
|
|
92
|
+
export async function readSkillOrigin(skillFolder) {
|
|
93
|
+
const path = join(skillFolder, '.pilothub', 'origin.json');
|
|
94
|
+
try {
|
|
95
|
+
const raw = await readFile(path, 'utf8');
|
|
96
|
+
const parsed = JSON.parse(raw);
|
|
97
|
+
if (parsed.version !== 1)
|
|
98
|
+
return null;
|
|
99
|
+
if (!parsed.registry || !parsed.slug || !parsed.installedVersion)
|
|
100
|
+
return null;
|
|
101
|
+
if (typeof parsed.installedAt !== 'number' || !Number.isFinite(parsed.installedAt))
|
|
102
|
+
return null;
|
|
103
|
+
return {
|
|
104
|
+
version: 1,
|
|
105
|
+
registry: String(parsed.registry),
|
|
106
|
+
slug: String(parsed.slug),
|
|
107
|
+
installedVersion: String(parsed.installedVersion),
|
|
108
|
+
installedAt: parsed.installedAt,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export async function writeSkillOrigin(skillFolder, origin) {
|
|
116
|
+
const path = join(skillFolder, '.pilothub', 'origin.json');
|
|
117
|
+
await mkdir(dirname(path), { recursive: true });
|
|
118
|
+
await writeFile(path, `${JSON.stringify(origin, null, 2)}\n`, 'utf8');
|
|
119
|
+
}
|
|
120
|
+
function normalizePath(path) {
|
|
121
|
+
return path
|
|
122
|
+
.split(sep)
|
|
123
|
+
.join('/')
|
|
124
|
+
.replace(/^\.\/+/, '');
|
|
125
|
+
}
|
|
126
|
+
function sanitizeRelPath(path) {
|
|
127
|
+
const normalized = path.replace(/^\.\/+/, '').replace(/^\/+/, '');
|
|
128
|
+
if (!normalized || normalized.endsWith('/'))
|
|
129
|
+
return null;
|
|
130
|
+
if (normalized.includes('..') || normalized.includes('\\'))
|
|
131
|
+
return null;
|
|
132
|
+
return normalized;
|
|
133
|
+
}
|
|
134
|
+
function sanitizeZipPath(path) {
|
|
135
|
+
return sanitizeRelPath(path);
|
|
136
|
+
}
|
|
137
|
+
async function walk(dir, onFile) {
|
|
138
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
139
|
+
for (const entry of entries) {
|
|
140
|
+
if (entry.name.startsWith('.'))
|
|
141
|
+
continue;
|
|
142
|
+
if (entry.name === 'node_modules')
|
|
143
|
+
continue;
|
|
144
|
+
const full = join(dir, entry.name);
|
|
145
|
+
if (entry.isDirectory()) {
|
|
146
|
+
await walk(full, onFile);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (!entry.isFile())
|
|
150
|
+
continue;
|
|
151
|
+
await onFile(full);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function addIgnoreFile(ig, path) {
|
|
155
|
+
try {
|
|
156
|
+
const raw = await readFile(path, 'utf8');
|
|
157
|
+
ig.add(raw.split(/\r?\n/));
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// optional
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { mkdir, mkdtemp, readFile, stat, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { strToU8, zipSync } from 'fflate';
|
|
6
|
+
import { describe, expect, it } from 'vitest';
|
|
7
|
+
import { buildSkillFingerprint, extractZipToDir, hashSkillFiles, hashSkillZip, listTextFiles, readLockfile, readSkillOrigin, sha256Hex, writeLockfile, writeSkillOrigin, } from './skills';
|
|
8
|
+
describe('skills', () => {
|
|
9
|
+
it('extracts zip into directory and skips traversal', async () => {
|
|
10
|
+
const dir = await mkdtemp(join(tmpdir(), 'pilothub-'));
|
|
11
|
+
const zip = zipSync({
|
|
12
|
+
'SKILL.md': strToU8('hello'),
|
|
13
|
+
'../evil.txt': strToU8('nope'),
|
|
14
|
+
});
|
|
15
|
+
await extractZipToDir(new Uint8Array(zip), dir);
|
|
16
|
+
expect((await readFile(join(dir, 'SKILL.md'), 'utf8')).trim()).toBe('hello');
|
|
17
|
+
await expect(stat(join(dir, '..', 'evil.txt'))).rejects.toBeTruthy();
|
|
18
|
+
});
|
|
19
|
+
it('writes and reads lockfile', async () => {
|
|
20
|
+
const workdir = await mkdtemp(join(tmpdir(), 'pilothub-work-'));
|
|
21
|
+
await writeLockfile(workdir, {
|
|
22
|
+
version: 1,
|
|
23
|
+
skills: { demo: { version: '1.0.0', installedAt: 1 } },
|
|
24
|
+
});
|
|
25
|
+
const read = await readLockfile(workdir);
|
|
26
|
+
expect(read.skills.demo?.version).toBe('1.0.0');
|
|
27
|
+
});
|
|
28
|
+
it('returns empty lockfile on invalid json', async () => {
|
|
29
|
+
const workdir = await mkdtemp(join(tmpdir(), 'pilothub-work-bad-'));
|
|
30
|
+
await mkdir(join(workdir, '.pilothub'), { recursive: true });
|
|
31
|
+
await writeFile(join(workdir, '.pilothub', 'lock.json'), '{', 'utf8');
|
|
32
|
+
const read = await readLockfile(workdir);
|
|
33
|
+
expect(read).toEqual({ version: 1, skills: {} });
|
|
34
|
+
});
|
|
35
|
+
it('returns empty lockfile on schema mismatch', async () => {
|
|
36
|
+
const workdir = await mkdtemp(join(tmpdir(), 'pilothub-work-schema-'));
|
|
37
|
+
await mkdir(join(workdir, '.pilothub'), { recursive: true });
|
|
38
|
+
await writeFile(join(workdir, '.pilothub', 'lock.json'), JSON.stringify({ version: 1, skills: 'nope' }), 'utf8');
|
|
39
|
+
const read = await readLockfile(workdir);
|
|
40
|
+
expect(read).toEqual({ version: 1, skills: {} });
|
|
41
|
+
});
|
|
42
|
+
it('skips dotfiles and node_modules when listing text files', async () => {
|
|
43
|
+
const workdir = await mkdtemp(join(tmpdir(), 'pilothub-files-'));
|
|
44
|
+
await writeFile(join(workdir, 'SKILL.md'), 'hi', 'utf8');
|
|
45
|
+
await writeFile(join(workdir, '.secret.txt'), 'no', 'utf8');
|
|
46
|
+
await mkdir(join(workdir, 'node_modules'), { recursive: true });
|
|
47
|
+
await writeFile(join(workdir, 'node_modules', 'a.txt'), 'no', 'utf8');
|
|
48
|
+
const files = await listTextFiles(workdir);
|
|
49
|
+
expect(files.map((file) => file.relPath)).toEqual(['SKILL.md']);
|
|
50
|
+
});
|
|
51
|
+
it('respects .gitignore and .pilothubignore', async () => {
|
|
52
|
+
const workdir = await mkdtemp(join(tmpdir(), 'pilothub-ignore-'));
|
|
53
|
+
await writeFile(join(workdir, '.gitignore'), 'ignored.md\n', 'utf8');
|
|
54
|
+
await writeFile(join(workdir, '.pilothubignore'), 'private.md\n', 'utf8');
|
|
55
|
+
await writeFile(join(workdir, 'SKILL.md'), 'hi', 'utf8');
|
|
56
|
+
await writeFile(join(workdir, 'ignored.md'), 'no', 'utf8');
|
|
57
|
+
await writeFile(join(workdir, 'private.md'), 'no', 'utf8');
|
|
58
|
+
await writeFile(join(workdir, 'public.json'), '{}', 'utf8');
|
|
59
|
+
const files = await listTextFiles(workdir);
|
|
60
|
+
const paths = files.map((file) => file.relPath).sort();
|
|
61
|
+
expect(paths).toEqual(['SKILL.md', 'public.json']);
|
|
62
|
+
expect(files.find((file) => file.relPath === 'SKILL.md')?.contentType).toMatch(/^text\//);
|
|
63
|
+
expect(files.find((file) => file.relPath === 'public.json')?.contentType).toBe('application/json');
|
|
64
|
+
});
|
|
65
|
+
it('falls back to text/plain for unknown text extensions', async () => {
|
|
66
|
+
const workdir = await mkdtemp(join(tmpdir(), 'pilothub-env-'));
|
|
67
|
+
await writeFile(join(workdir, 'SKILL.md'), 'hi', 'utf8');
|
|
68
|
+
await writeFile(join(workdir, 'config.env'), 'TOKEN=demo', 'utf8');
|
|
69
|
+
const files = await listTextFiles(workdir);
|
|
70
|
+
expect(files.find((file) => file.relPath === 'config.env')?.contentType).toBe('text/plain');
|
|
71
|
+
});
|
|
72
|
+
it('hashes skill files deterministically', async () => {
|
|
73
|
+
const { fingerprint } = hashSkillFiles([
|
|
74
|
+
{ relPath: 'b.txt', bytes: strToU8('b') },
|
|
75
|
+
{ relPath: 'a.txt', bytes: strToU8('a') },
|
|
76
|
+
]);
|
|
77
|
+
const expected = buildSkillFingerprint([
|
|
78
|
+
{ path: 'a.txt', sha256: sha256Hex(strToU8('a')) },
|
|
79
|
+
{ path: 'b.txt', sha256: sha256Hex(strToU8('b')) },
|
|
80
|
+
]);
|
|
81
|
+
expect(fingerprint).toBe(expected);
|
|
82
|
+
});
|
|
83
|
+
it('hashes text files inside a downloaded zip deterministically', () => {
|
|
84
|
+
const zip = zipSync({
|
|
85
|
+
'SKILL.md': strToU8('hello'),
|
|
86
|
+
'notes.md': strToU8('world'),
|
|
87
|
+
'image.png': strToU8('nope'),
|
|
88
|
+
});
|
|
89
|
+
const { fingerprint } = hashSkillZip(new Uint8Array(zip));
|
|
90
|
+
const expected = buildSkillFingerprint([
|
|
91
|
+
{ path: 'SKILL.md', sha256: sha256Hex(strToU8('hello')) },
|
|
92
|
+
{ path: 'notes.md', sha256: sha256Hex(strToU8('world')) },
|
|
93
|
+
]);
|
|
94
|
+
expect(fingerprint).toBe(expected);
|
|
95
|
+
});
|
|
96
|
+
it('ignores unsafe or non-text entries when hashing zips', () => {
|
|
97
|
+
const zip = zipSync({
|
|
98
|
+
'SKILL.md': strToU8('hello'),
|
|
99
|
+
'folder/': strToU8(''),
|
|
100
|
+
'../evil.txt': strToU8('nope'),
|
|
101
|
+
'bad\\path.txt': strToU8('nope'),
|
|
102
|
+
'image.png': strToU8('nope'),
|
|
103
|
+
});
|
|
104
|
+
const { files } = hashSkillZip(new Uint8Array(zip));
|
|
105
|
+
expect(files).toEqual([{ path: 'SKILL.md', sha256: sha256Hex(strToU8('hello')), size: 5 }]);
|
|
106
|
+
});
|
|
107
|
+
it('builds fingerprints from valid entries only', () => {
|
|
108
|
+
const fingerprint = buildSkillFingerprint([
|
|
109
|
+
{ path: '', sha256: '' },
|
|
110
|
+
{ path: 'valid.txt', sha256: sha256Hex(strToU8('ok')) },
|
|
111
|
+
]);
|
|
112
|
+
const expected = buildSkillFingerprint([
|
|
113
|
+
{ path: 'valid.txt', sha256: sha256Hex(strToU8('ok')) },
|
|
114
|
+
]);
|
|
115
|
+
expect(fingerprint).toBe(expected);
|
|
116
|
+
});
|
|
117
|
+
it('returns null for invalid skill origin metadata', async () => {
|
|
118
|
+
const workdir = await mkdtemp(join(tmpdir(), 'pilothub-origin-'));
|
|
119
|
+
expect(await readSkillOrigin(workdir)).toBeNull();
|
|
120
|
+
await mkdir(join(workdir, '.pilothub'), { recursive: true });
|
|
121
|
+
await writeFile(join(workdir, '.pilothub', 'origin.json'), JSON.stringify({ version: 2 }), 'utf8');
|
|
122
|
+
expect(await readSkillOrigin(workdir)).toBeNull();
|
|
123
|
+
await writeFile(join(workdir, '.pilothub', 'origin.json'), JSON.stringify({ version: 1, registry: 'demo', slug: 'x', installedAt: 1 }), 'utf8');
|
|
124
|
+
expect(await readSkillOrigin(workdir)).toBeNull();
|
|
125
|
+
await writeFile(join(workdir, '.pilothub', 'origin.json'), JSON.stringify({
|
|
126
|
+
version: 1,
|
|
127
|
+
registry: 'demo',
|
|
128
|
+
slug: 'x',
|
|
129
|
+
installedVersion: '0.1.0',
|
|
130
|
+
installedAt: 'nope',
|
|
131
|
+
}), 'utf8');
|
|
132
|
+
expect(await readSkillOrigin(workdir)).toBeNull();
|
|
133
|
+
const origin = {
|
|
134
|
+
version: 1,
|
|
135
|
+
registry: 'https://example.com',
|
|
136
|
+
slug: 'demo',
|
|
137
|
+
installedVersion: '1.2.3',
|
|
138
|
+
installedAt: 123,
|
|
139
|
+
};
|
|
140
|
+
await writeSkillOrigin(workdir, origin);
|
|
141
|
+
expect(await readSkillOrigin(workdir)).toEqual(origin);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=skills.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.test.js","sourceRoot":"","sources":["../src/skills.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,84 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pilothub",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "PilotHub CLI \\u2014 install, update, search, and publish agent skills.",
|
|
5
|
+
"license": "MIT",
|
|
5
6
|
"type": "module",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
7
|
+
"bin": {
|
|
8
|
+
"pilothub": "bin/pilothub.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
8
15
|
],
|
|
9
16
|
"scripts": {
|
|
10
|
-
"
|
|
11
|
-
"dev": "
|
|
12
|
-
"
|
|
13
|
-
"preview": "bun --bun vite preview",
|
|
14
|
-
"docs:list": "bun scripts/docs-list.ts",
|
|
15
|
-
"check:peers": "bun scripts/check-peer-deps.ts",
|
|
16
|
-
"test": "vitest run",
|
|
17
|
-
"test:watch": "vitest",
|
|
18
|
-
"test:e2e": "vitest run -c vitest.e2e.config.ts",
|
|
19
|
-
"test:e2e:local": "bash scripts/run-playwright-local.sh",
|
|
20
|
-
"test:pw": "playwright test",
|
|
21
|
-
"coverage": "vitest run --coverage",
|
|
22
|
-
"convex:deploy": "bunx convex deploy --typecheck=disable --yes",
|
|
23
|
-
"lint": "bun run lint:biome && bun run lint:oxlint",
|
|
24
|
-
"lint:biome": "biome check .",
|
|
25
|
-
"lint:oxlint": "oxlint --type-aware --tsconfig ./tsconfig.oxlint.json ./src ./convex ./packages/pilothub/src ./packages/schema/src",
|
|
26
|
-
"format": "biome format --write ."
|
|
17
|
+
"build": "tsc -p tsconfig.json",
|
|
18
|
+
"dev": "node --enable-source-maps dist/cli.js",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
27
20
|
},
|
|
28
21
|
"dependencies": {
|
|
29
|
-
"@
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"@fontsource/ibm-plex-mono": "^5.2.7",
|
|
33
|
-
"@fontsource/manrope": "^5.2.8",
|
|
34
|
-
"@monaco-editor/react": "^4.7.0",
|
|
35
|
-
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
36
|
-
"@radix-ui/react-toggle-group": "^1.1.11",
|
|
37
|
-
"@resvg/resvg-wasm": "^2.6.2",
|
|
38
|
-
"@tailwindcss/vite": "^4.1.18",
|
|
39
|
-
"@tanstack/react-devtools": "^0.9.2",
|
|
40
|
-
"@tanstack/react-router": "^1.151.6",
|
|
41
|
-
"@tanstack/react-router-devtools": "^1.151.6",
|
|
42
|
-
"@tanstack/react-start": "^1.152.0",
|
|
43
|
-
"@tanstack/router-plugin": "^1.151.6",
|
|
44
|
-
"@vercel/analytics": "^1.6.1",
|
|
45
|
-
"pilothub-schema": "0.0.2",
|
|
46
|
-
"clsx": "^2.1.1",
|
|
47
|
-
"convex": "^1.31.6",
|
|
48
|
-
"convex-helpers": "^0.1.111",
|
|
22
|
+
"@clack/prompts": "^0.11.0",
|
|
23
|
+
"arktype": "^2.1.29",
|
|
24
|
+
"commander": "^14.0.2",
|
|
49
25
|
"fflate": "^0.8.2",
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"react-dom": "^19.2.3",
|
|
56
|
-
"react-markdown": "^10.1.0",
|
|
57
|
-
"remark-gfm": "^4.0.1",
|
|
26
|
+
"ignore": "^7.0.5",
|
|
27
|
+
"json5": "^2.2.3",
|
|
28
|
+
"mime": "^4.1.0",
|
|
29
|
+
"ora": "^9.0.0",
|
|
30
|
+
"p-retry": "^7.1.1",
|
|
58
31
|
"semver": "^7.7.3",
|
|
59
|
-
"
|
|
60
|
-
"tailwindcss": "^4.1.18",
|
|
61
|
-
"vite-tsconfig-paths": "^6.0.4",
|
|
62
|
-
"yaml": "^2.8.2"
|
|
32
|
+
"undici": "^7.16.0"
|
|
63
33
|
},
|
|
64
34
|
"devDependencies": {
|
|
65
|
-
"@biomejs/biome": "^2.3.11",
|
|
66
|
-
"@playwright/test": "^1.57.0",
|
|
67
|
-
"@tanstack/devtools-vite": "^0.4.1",
|
|
68
|
-
"@testing-library/dom": "^10.4.1",
|
|
69
|
-
"@testing-library/react": "^16.3.1",
|
|
70
35
|
"@types/node": "^25.0.9",
|
|
71
|
-
"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
"@vitest/coverage-v8": "^4.0.17",
|
|
76
|
-
"jsdom": "^27.4.0",
|
|
77
|
-
"only-allow": "^1.2.1",
|
|
78
|
-
"oxlint": "^1.39.0",
|
|
79
|
-
"oxlint-tsgolint": "^0.11.1",
|
|
80
|
-
"typescript": "^5.9.3",
|
|
81
|
-
"vite": "^7.3.1",
|
|
82
|
-
"vitest": "^4.0.17"
|
|
36
|
+
"typescript": "^5.9.3"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=20"
|
|
83
40
|
}
|
|
84
41
|
}
|
package/.env.local.example
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Frontend
|
|
2
|
-
VITE_CONVEX_URL=
|
|
3
|
-
VITE_CONVEX_SITE_URL=
|
|
4
|
-
VITE_SOULHUB_SITE_URL=
|
|
5
|
-
VITE_SOULHUB_HOST=
|
|
6
|
-
VITE_SITE_MODE=
|
|
7
|
-
SITE_URL=http://localhost:3000
|
|
8
|
-
CONVEX_SITE_URL=
|
|
9
|
-
|
|
10
|
-
# Convex Auth (GitHub OAuth App)
|
|
11
|
-
AUTH_GITHUB_ID=
|
|
12
|
-
AUTH_GITHUB_SECRET=
|
|
13
|
-
|
|
14
|
-
# Convex Auth JWT keys (generated via @convex-dev/auth CLI)
|
|
15
|
-
JWT_PRIVATE_KEY=
|
|
16
|
-
JWKS=
|
|
17
|
-
|
|
18
|
-
# Embeddings
|
|
19
|
-
OPENAI_API_KEY=
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
build:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
timeout-minutes: 15
|
|
12
|
-
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v4
|
|
15
|
-
|
|
16
|
-
- uses: oven-sh/setup-bun@v2
|
|
17
|
-
with:
|
|
18
|
-
bun-version: 1.3.6
|
|
19
|
-
|
|
20
|
-
- name: Install
|
|
21
|
-
run: bun install --frozen-lockfile
|
|
22
|
-
- name: Peer deps
|
|
23
|
-
run: bun run check:peers
|
|
24
|
-
|
|
25
|
-
- name: Lint
|
|
26
|
-
run: bun run lint
|
|
27
|
-
|
|
28
|
-
- name: Test
|
|
29
|
-
run: bun run test
|
|
30
|
-
|
|
31
|
-
- name: Coverage
|
|
32
|
-
run: bun run coverage
|
|
33
|
-
|
|
34
|
-
- name: Typecheck packages
|
|
35
|
-
run: |
|
|
36
|
-
bunx tsc -p packages/schema/tsconfig.json --noEmit
|
|
37
|
-
bunx tsc -p packages/pilothub/tsconfig.json --noEmit
|
|
38
|
-
|
|
39
|
-
- name: Build
|
|
40
|
-
run: bun run build
|
package/.oxlintrc.json
DELETED
package/AGENTS.md
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Repository Guidelines
|
|
2
|
-
|
|
3
|
-
## Project Structure & Module Organization
|
|
4
|
-
- `src/` — TanStack Start app code (routes, components, styles).
|
|
5
|
-
- `convex/` — Convex backend (schema, queries/mutations/actions, HTTP routes).
|
|
6
|
-
- `convex/_generated/` — generated Convex API/types; committed for builds.
|
|
7
|
-
- `docs/` — product/spec docs (see `docs/spec.md`).
|
|
8
|
-
- `public/` — static assets.
|
|
9
|
-
|
|
10
|
-
## Build, Test, and Development Commands
|
|
11
|
-
- `bun run dev` — local app server at `http://localhost:3000`.
|
|
12
|
-
- `bun run build` — production build (Vite + Nitro).
|
|
13
|
-
- `bun run preview` — preview built app.
|
|
14
|
-
- `bunx convex dev` — Convex dev deployment + function watcher.
|
|
15
|
-
- `bunx convex codegen` — regenerate `convex/_generated`.
|
|
16
|
-
- `bun run lint` — Biome + oxlint (type-aware).
|
|
17
|
-
- `bun run test` — Vitest (unit tests).
|
|
18
|
-
- `bun run coverage` — coverage run; keep global >= 80%.
|
|
19
|
-
|
|
20
|
-
## Coding Style & Naming Conventions
|
|
21
|
-
- TypeScript strict; ESM.
|
|
22
|
-
- Indentation: 2 spaces, single quotes (Biome).
|
|
23
|
-
- Lint/format: Biome + oxlint (type-aware).
|
|
24
|
-
- Convex function names: verb-first (`getBySlug`, `publishVersion`).
|
|
25
|
-
|
|
26
|
-
## Testing Guidelines
|
|
27
|
-
- Framework: Vitest 4 + jsdom.
|
|
28
|
-
- Tests live in `src/**` and `convex/lib/**`.
|
|
29
|
-
- Coverage threshold: 80% global (lines/functions/branches/statements).
|
|
30
|
-
- Example: `convex/lib/skills.test.ts`.
|
|
31
|
-
|
|
32
|
-
## Commit & Pull Request Guidelines
|
|
33
|
-
- Commit messages: Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`…).
|
|
34
|
-
- Keep changes scoped; avoid repo-wide search/replace.
|
|
35
|
-
- PRs: include summary + test commands run. Add screenshots for UI changes.
|
|
36
|
-
|
|
37
|
-
## Configuration & Security
|
|
38
|
-
- Local env: `.env.local` (never commit secrets).
|
|
39
|
-
- Convex env holds JWT keys; Vercel only needs `VITE_CONVEX_URL` + `VITE_CONVEX_SITE_URL`.
|
|
40
|
-
- OAuth: GitHub OAuth App credentials required for login.
|
|
41
|
-
|
|
42
|
-
## Convex Ops (Gotchas)
|
|
43
|
-
- New Convex functions must be pushed before `convex run`: use `bunx convex dev --once` (dev) or `bunx convex deploy` (prod).
|
|
44
|
-
- For non-interactive prod deploys, use `bunx convex deploy -y` to skip confirmation.
|
|
45
|
-
- If `bunx convex run --env-file .env.local ...` returns `401 MissingAccessToken` despite `bunx convex login`, workaround: omit `--env-file` and use `--deployment-name <name>` / `--prod`.
|