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
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { basename, join, resolve } from 'node:path';
|
|
4
|
+
import JSON5 from 'json5';
|
|
5
|
+
export async function resolvePilotbotSkillRoots() {
|
|
6
|
+
const roots = [];
|
|
7
|
+
const labels = {};
|
|
8
|
+
const stateDir = resolvePilotbotStateDir();
|
|
9
|
+
const sharedSkills = resolveUserPath(join(stateDir, 'skills'));
|
|
10
|
+
pushRoot(roots, labels, sharedSkills, 'Shared skills');
|
|
11
|
+
const config = await readPilotbotConfig();
|
|
12
|
+
if (!config)
|
|
13
|
+
return { roots, labels };
|
|
14
|
+
const mainWorkspace = resolveUserPath(config.agents?.defaults?.workspace ?? config.agent?.workspace ?? '');
|
|
15
|
+
if (mainWorkspace) {
|
|
16
|
+
pushRoot(roots, labels, join(mainWorkspace, 'skills'), 'Agent: main');
|
|
17
|
+
}
|
|
18
|
+
const listedAgents = config.agents?.list ?? [];
|
|
19
|
+
for (const entry of listedAgents) {
|
|
20
|
+
const workspace = resolveUserPath(entry?.workspace ?? '');
|
|
21
|
+
if (!workspace)
|
|
22
|
+
continue;
|
|
23
|
+
const name = entry?.name?.trim() || entry?.id?.trim() || 'agent';
|
|
24
|
+
pushRoot(roots, labels, join(workspace, 'skills'), `Agent: ${name}`);
|
|
25
|
+
}
|
|
26
|
+
const agents = config.routing?.agents ?? {};
|
|
27
|
+
for (const [agentId, entry] of Object.entries(agents)) {
|
|
28
|
+
const workspace = resolveUserPath(entry?.workspace ?? '');
|
|
29
|
+
if (!workspace)
|
|
30
|
+
continue;
|
|
31
|
+
const name = entry?.name?.trim() || agentId;
|
|
32
|
+
pushRoot(roots, labels, join(workspace, 'skills'), `Agent: ${name}`);
|
|
33
|
+
}
|
|
34
|
+
const extraDirs = config.skills?.load?.extraDirs ?? [];
|
|
35
|
+
for (const dir of extraDirs) {
|
|
36
|
+
const resolved = resolveUserPath(String(dir));
|
|
37
|
+
if (!resolved)
|
|
38
|
+
continue;
|
|
39
|
+
const label = `Extra: ${basename(resolved) || resolved}`;
|
|
40
|
+
pushRoot(roots, labels, resolved, label);
|
|
41
|
+
}
|
|
42
|
+
return { roots, labels };
|
|
43
|
+
}
|
|
44
|
+
export async function resolvePilotbotDefaultWorkspace() {
|
|
45
|
+
const config = await readPilotbotConfig();
|
|
46
|
+
if (!config)
|
|
47
|
+
return null;
|
|
48
|
+
const defaultsWorkspace = resolveUserPath(config.agents?.defaults?.workspace ?? config.agent?.workspace ?? '');
|
|
49
|
+
if (defaultsWorkspace)
|
|
50
|
+
return defaultsWorkspace;
|
|
51
|
+
const listedAgents = config.agents?.list ?? [];
|
|
52
|
+
const defaultAgent = listedAgents.find((entry) => entry.default) ?? listedAgents.find((entry) => entry.id === 'main');
|
|
53
|
+
const listWorkspace = resolveUserPath(defaultAgent?.workspace ?? '');
|
|
54
|
+
return listWorkspace || null;
|
|
55
|
+
}
|
|
56
|
+
function resolvePilotbotStateDir() {
|
|
57
|
+
const override = process.env.PILOTBOT_STATE_DIR?.trim();
|
|
58
|
+
if (override)
|
|
59
|
+
return resolveUserPath(override);
|
|
60
|
+
return join(homedir(), '.pilotbot');
|
|
61
|
+
}
|
|
62
|
+
function resolvePilotbotConfigPath() {
|
|
63
|
+
const override = process.env.PILOTBOT_CONFIG_PATH?.trim();
|
|
64
|
+
if (override)
|
|
65
|
+
return resolveUserPath(override);
|
|
66
|
+
return join(resolvePilotbotStateDir(), 'pilotbot.json');
|
|
67
|
+
}
|
|
68
|
+
function resolveUserPath(input) {
|
|
69
|
+
const trimmed = input.trim();
|
|
70
|
+
if (!trimmed)
|
|
71
|
+
return '';
|
|
72
|
+
if (trimmed.startsWith('~')) {
|
|
73
|
+
return resolve(trimmed.replace(/^~(?=$|[\\/])/, homedir()));
|
|
74
|
+
}
|
|
75
|
+
return resolve(trimmed);
|
|
76
|
+
}
|
|
77
|
+
async function readPilotbotConfig() {
|
|
78
|
+
try {
|
|
79
|
+
const raw = await readFile(resolvePilotbotConfigPath(), 'utf8');
|
|
80
|
+
const parsed = JSON5.parse(raw);
|
|
81
|
+
if (!parsed || typeof parsed !== 'object')
|
|
82
|
+
return null;
|
|
83
|
+
return parsed;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function pushRoot(roots, labels, root, label) {
|
|
90
|
+
const resolved = resolveUserPath(root);
|
|
91
|
+
if (!resolved)
|
|
92
|
+
return;
|
|
93
|
+
if (!roots.includes(resolved))
|
|
94
|
+
roots.push(resolved);
|
|
95
|
+
if (!label)
|
|
96
|
+
return;
|
|
97
|
+
const existing = labels[resolved];
|
|
98
|
+
if (!existing) {
|
|
99
|
+
labels[resolved] = label;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const parts = existing
|
|
103
|
+
.split(', ')
|
|
104
|
+
.map((part) => part.trim())
|
|
105
|
+
.filter(Boolean);
|
|
106
|
+
if (parts.includes(label))
|
|
107
|
+
return;
|
|
108
|
+
labels[resolved] = `${existing}, ${label}`;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=pilotbotConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pilotbotConfig.js","sourceRoot":"","sources":["../../src/cli/pilotbotConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { mkdir, mkdtemp, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
6
|
+
import { resolvePilotbotDefaultWorkspace, resolvePilotbotSkillRoots } from './pilotbotConfig.js';
|
|
7
|
+
const originalEnv = { ...process.env };
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
process.env = { ...originalEnv };
|
|
10
|
+
});
|
|
11
|
+
describe('resolvePilotbotSkillRoots', () => {
|
|
12
|
+
it('reads JSON5 config and resolves per-agent + shared skill roots', async () => {
|
|
13
|
+
const base = await mkdtemp(join(tmpdir(), 'pilothub-pilotbot-'));
|
|
14
|
+
const home = join(base, 'home');
|
|
15
|
+
const stateDir = join(base, 'state');
|
|
16
|
+
const configPath = join(base, 'pilotbot.json');
|
|
17
|
+
process.env.HOME = home;
|
|
18
|
+
process.env.PILOTBOT_STATE_DIR = stateDir;
|
|
19
|
+
process.env.PILOTBOT_CONFIG_PATH = configPath;
|
|
20
|
+
const config = `{
|
|
21
|
+
// JSON5 comments + trailing commas supported
|
|
22
|
+
agents: {
|
|
23
|
+
defaults: { workspace: '~/pilot-main', },
|
|
24
|
+
list: [
|
|
25
|
+
{ id: 'work', name: 'Work Bot', workspace: '~/pilot-work', },
|
|
26
|
+
{ id: 'family', workspace: '~/pilot-family', },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
// legacy entries still supported
|
|
30
|
+
agent: { workspace: '~/pilot-legacy', },
|
|
31
|
+
routing: {
|
|
32
|
+
agents: {
|
|
33
|
+
work: { name: 'Work Bot', workspace: '~/pilot-work', },
|
|
34
|
+
family: { workspace: '~/pilot-family' },
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
skills: {
|
|
38
|
+
load: { extraDirs: ['~/shared/skills', '/opt/skills',], },
|
|
39
|
+
},
|
|
40
|
+
}`;
|
|
41
|
+
await writeFile(configPath, config, 'utf8');
|
|
42
|
+
const { roots, labels } = await resolvePilotbotSkillRoots();
|
|
43
|
+
const expectedRoots = [
|
|
44
|
+
resolve(stateDir, 'skills'),
|
|
45
|
+
resolve(home, 'pilot-main', 'skills'),
|
|
46
|
+
resolve(home, 'pilot-work', 'skills'),
|
|
47
|
+
resolve(home, 'pilot-family', 'skills'),
|
|
48
|
+
resolve(home, 'shared', 'skills'),
|
|
49
|
+
resolve('/opt/skills'),
|
|
50
|
+
];
|
|
51
|
+
expect(roots).toEqual(expect.arrayContaining(expectedRoots));
|
|
52
|
+
expect(labels[resolve(stateDir, 'skills')]).toBe('Shared skills');
|
|
53
|
+
expect(labels[resolve(home, 'pilot-main', 'skills')]).toBe('Agent: main');
|
|
54
|
+
expect(labels[resolve(home, 'pilot-work', 'skills')]).toBe('Agent: Work Bot');
|
|
55
|
+
expect(labels[resolve(home, 'pilot-family', 'skills')]).toBe('Agent: family');
|
|
56
|
+
expect(labels[resolve(home, 'shared', 'skills')]).toBe('Extra: skills');
|
|
57
|
+
expect(labels[resolve('/opt/skills')]).toBe('Extra: skills');
|
|
58
|
+
});
|
|
59
|
+
it('resolves default workspace from agents.defaults and agents.list', async () => {
|
|
60
|
+
const base = await mkdtemp(join(tmpdir(), 'pilothub-pilotbot-default-'));
|
|
61
|
+
const home = join(base, 'home');
|
|
62
|
+
const stateDir = join(base, 'state');
|
|
63
|
+
const configPath = join(base, 'pilotbot.json');
|
|
64
|
+
const workspaceMain = join(base, 'workspace-main');
|
|
65
|
+
const workspaceList = join(base, 'workspace-list');
|
|
66
|
+
process.env.HOME = home;
|
|
67
|
+
process.env.PILOTBOT_STATE_DIR = stateDir;
|
|
68
|
+
process.env.PILOTBOT_CONFIG_PATH = configPath;
|
|
69
|
+
const config = `{
|
|
70
|
+
agents: {
|
|
71
|
+
defaults: { workspace: "${workspaceMain}", },
|
|
72
|
+
list: [
|
|
73
|
+
{ id: 'main', workspace: "${workspaceList}", default: true },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
}`;
|
|
77
|
+
await writeFile(configPath, config, 'utf8');
|
|
78
|
+
const workspace = await resolvePilotbotDefaultWorkspace();
|
|
79
|
+
expect(workspace).toBe(resolve(workspaceMain));
|
|
80
|
+
});
|
|
81
|
+
it('falls back to default agent in agents.list when defaults missing', async () => {
|
|
82
|
+
const base = await mkdtemp(join(tmpdir(), 'pilothub-pilotbot-list-'));
|
|
83
|
+
const home = join(base, 'home');
|
|
84
|
+
const configPath = join(base, 'pilotbot.json');
|
|
85
|
+
const workspaceMain = join(base, 'workspace-main');
|
|
86
|
+
const workspaceWork = join(base, 'workspace-work');
|
|
87
|
+
process.env.HOME = home;
|
|
88
|
+
process.env.PILOTBOT_CONFIG_PATH = configPath;
|
|
89
|
+
const config = `{
|
|
90
|
+
agents: {
|
|
91
|
+
list: [
|
|
92
|
+
{ id: 'main', workspace: "${workspaceMain}", default: true },
|
|
93
|
+
{ id: 'work', workspace: "${workspaceWork}" },
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
}`;
|
|
97
|
+
await writeFile(configPath, config, 'utf8');
|
|
98
|
+
const workspace = await resolvePilotbotDefaultWorkspace();
|
|
99
|
+
expect(workspace).toBe(resolve(workspaceMain));
|
|
100
|
+
});
|
|
101
|
+
it('respects PILOTBOT_STATE_DIR and PILOTBOT_CONFIG_PATH overrides', async () => {
|
|
102
|
+
const base = await mkdtemp(join(tmpdir(), 'pilothub-pilotbot-override-'));
|
|
103
|
+
const home = join(base, 'home');
|
|
104
|
+
const stateDir = join(base, 'custom-state');
|
|
105
|
+
const configPath = join(base, 'config', 'pilotbot.json');
|
|
106
|
+
process.env.HOME = home;
|
|
107
|
+
process.env.PILOTBOT_STATE_DIR = stateDir;
|
|
108
|
+
process.env.PILOTBOT_CONFIG_PATH = configPath;
|
|
109
|
+
const config = `{
|
|
110
|
+
agent: { workspace: "${join(base, 'workspace-main')}" },
|
|
111
|
+
}`;
|
|
112
|
+
await mkdir(join(base, 'config'), { recursive: true });
|
|
113
|
+
await writeFile(configPath, config, 'utf8');
|
|
114
|
+
const { roots, labels } = await resolvePilotbotSkillRoots();
|
|
115
|
+
expect(roots).toEqual(expect.arrayContaining([
|
|
116
|
+
resolve(stateDir, 'skills'),
|
|
117
|
+
resolve(join(base, 'workspace-main'), 'skills'),
|
|
118
|
+
]));
|
|
119
|
+
expect(labels[resolve(stateDir, 'skills')]).toBe('Shared skills');
|
|
120
|
+
expect(labels[resolve(join(base, 'workspace-main'), 'skills')]).toBe('Agent: main');
|
|
121
|
+
});
|
|
122
|
+
it('returns shared skills root when config is missing', async () => {
|
|
123
|
+
const base = await mkdtemp(join(tmpdir(), 'pilothub-pilotbot-missing-'));
|
|
124
|
+
const stateDir = join(base, 'state');
|
|
125
|
+
const configPath = join(base, 'missing', 'pilotbot.json');
|
|
126
|
+
process.env.PILOTBOT_STATE_DIR = stateDir;
|
|
127
|
+
process.env.PILOTBOT_CONFIG_PATH = configPath;
|
|
128
|
+
const { roots, labels } = await resolvePilotbotSkillRoots();
|
|
129
|
+
expect(roots).toEqual([resolve(stateDir, 'skills')]);
|
|
130
|
+
expect(labels[resolve(stateDir, 'skills')]).toBe('Shared skills');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=pilotbotConfig.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pilotbotConfig.test.js","sourceRoot":"","sources":["../../src/cli/pilotbotConfig.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GlobalOpts } from './types.js';
|
|
2
|
+
export declare const DEFAULT_SITE = "https://pilothub.com";
|
|
3
|
+
export declare const DEFAULT_REGISTRY = "https://pilothub.com";
|
|
4
|
+
export declare function resolveRegistry(opts: GlobalOpts): Promise<string>;
|
|
5
|
+
export declare function getRegistry(opts: GlobalOpts, params?: {
|
|
6
|
+
cache?: boolean;
|
|
7
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readGlobalConfig, writeGlobalConfig } from '../config.js';
|
|
2
|
+
import { discoverRegistryFromSite } from '../discovery.js';
|
|
3
|
+
export const DEFAULT_SITE = 'https://pilothub.com';
|
|
4
|
+
export const DEFAULT_REGISTRY = 'https://pilothub.com';
|
|
5
|
+
const LEGACY_REGISTRY_HOSTS = new Set(['auth.pilothub.com']);
|
|
6
|
+
export async function resolveRegistry(opts) {
|
|
7
|
+
const explicit = opts.registrySource !== 'default' ? opts.registry.trim() : '';
|
|
8
|
+
if (explicit)
|
|
9
|
+
return explicit;
|
|
10
|
+
const discovery = await discoverRegistryFromSite(opts.site).catch(() => null);
|
|
11
|
+
const discovered = discovery?.apiBase?.trim();
|
|
12
|
+
if (discovered)
|
|
13
|
+
return discovered;
|
|
14
|
+
const cfg = await readGlobalConfig();
|
|
15
|
+
const cached = cfg?.registry?.trim();
|
|
16
|
+
if (cached && !isLegacyRegistry(cached))
|
|
17
|
+
return cached;
|
|
18
|
+
return DEFAULT_REGISTRY;
|
|
19
|
+
}
|
|
20
|
+
export async function getRegistry(opts, params) {
|
|
21
|
+
const cache = params?.cache !== false;
|
|
22
|
+
const registry = await resolveRegistry(opts);
|
|
23
|
+
if (!cache)
|
|
24
|
+
return registry;
|
|
25
|
+
const cfg = await readGlobalConfig();
|
|
26
|
+
const cached = cfg?.registry?.trim();
|
|
27
|
+
const shouldUpdate = !cached ||
|
|
28
|
+
isLegacyRegistry(cached) ||
|
|
29
|
+
(cached === DEFAULT_REGISTRY && registry !== DEFAULT_REGISTRY);
|
|
30
|
+
if (shouldUpdate)
|
|
31
|
+
await writeGlobalConfig({ registry, token: cfg?.token });
|
|
32
|
+
return registry;
|
|
33
|
+
}
|
|
34
|
+
function isLegacyRegistry(registry) {
|
|
35
|
+
try {
|
|
36
|
+
return LEGACY_REGISTRY_HOSTS.has(new URL(registry).hostname);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAG1D,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAA;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAA;AACtD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAA;AAE5D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAgB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAC7E,MAAM,UAAU,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC7C,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IAEjC,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACpC,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IACtD,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB,EAAE,MAA4B;IAC9E,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,KAAK,KAAK,CAAA;IACrC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAA;IAC3B,MAAM,GAAG,GAAG,MAAM,gBAAgB,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACpC,MAAM,YAAY,GAChB,CAAC,MAAM;QACP,gBAAgB,CAAC,MAAM,CAAC;QACxB,CAAC,MAAM,KAAK,gBAAgB,IAAI,QAAQ,KAAK,gBAAgB,CAAC,CAAA;IAChE,IAAI,YAAY;QAAE,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1E,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAA;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
const readGlobalConfig = vi.fn();
|
|
4
|
+
const writeGlobalConfig = vi.fn();
|
|
5
|
+
const discoverRegistryFromSite = vi.fn();
|
|
6
|
+
vi.mock('../config.js', () => ({
|
|
7
|
+
readGlobalConfig: (...args) => readGlobalConfig(...args),
|
|
8
|
+
writeGlobalConfig: (...args) => writeGlobalConfig(...args),
|
|
9
|
+
}));
|
|
10
|
+
vi.mock('../discovery.js', () => ({
|
|
11
|
+
discoverRegistryFromSite: (...args) => discoverRegistryFromSite(...args),
|
|
12
|
+
}));
|
|
13
|
+
const { DEFAULT_REGISTRY, getRegistry, resolveRegistry } = await import('./registry');
|
|
14
|
+
function makeOpts(overrides = {}) {
|
|
15
|
+
return {
|
|
16
|
+
workdir: '/work',
|
|
17
|
+
dir: '/work/skills',
|
|
18
|
+
site: 'https://pilothub.com',
|
|
19
|
+
registry: DEFAULT_REGISTRY,
|
|
20
|
+
registrySource: 'default',
|
|
21
|
+
...overrides,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
readGlobalConfig.mockReset();
|
|
26
|
+
writeGlobalConfig.mockReset();
|
|
27
|
+
discoverRegistryFromSite.mockReset();
|
|
28
|
+
});
|
|
29
|
+
describe('registry resolution', () => {
|
|
30
|
+
it('prefers explicit registry over discovery/cache', async () => {
|
|
31
|
+
readGlobalConfig.mockResolvedValue({ registry: 'https://auth.pilothub.com' });
|
|
32
|
+
discoverRegistryFromSite.mockResolvedValue({ apiBase: 'https://pilothub.com' });
|
|
33
|
+
const registry = await resolveRegistry(makeOpts({ registry: 'https://custom.example', registrySource: 'cli' }));
|
|
34
|
+
expect(registry).toBe('https://custom.example');
|
|
35
|
+
expect(discoverRegistryFromSite).not.toHaveBeenCalled();
|
|
36
|
+
});
|
|
37
|
+
it('ignores legacy registry and updates cache from discovery', async () => {
|
|
38
|
+
readGlobalConfig.mockResolvedValue({ registry: 'https://auth.pilothub.com', token: 'tkn' });
|
|
39
|
+
discoverRegistryFromSite.mockResolvedValue({ apiBase: 'https://pilothub.com' });
|
|
40
|
+
const registry = await getRegistry(makeOpts(), { cache: true });
|
|
41
|
+
expect(registry).toBe('https://pilothub.com');
|
|
42
|
+
expect(writeGlobalConfig).toHaveBeenCalledWith({
|
|
43
|
+
registry: 'https://pilothub.com',
|
|
44
|
+
token: 'tkn',
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/cli/registry.test.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG7D,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AAChC,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AACjC,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;AAExC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,gBAAgB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IACnE,iBAAiB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;CACtE,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,wBAAwB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;CACpF,CAAC,CAAC,CAAA;AAEH,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;AAErF,SAAS,QAAQ,CAAC,YAAiC,EAAE;IACnD,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,gBAAgB;QAC1B,cAAc,EAAE,SAAS;QACzB,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,gBAAgB,CAAC,SAAS,EAAE,CAAA;IAC5B,iBAAiB,CAAC,SAAS,EAAE,CAAA;IAC7B,wBAAwB,CAAC,SAAS,EAAE,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,2BAA2B,EAAE,CAAC,CAAA;QAC7E,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAA;QAE/E,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,QAAQ,CAAC,EAAE,QAAQ,EAAE,wBAAwB,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CACxE,CAAA;QAED,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QAC/C,MAAM,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,2BAA2B,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3F,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAA;QAE/E,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAE/D,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;QAC7C,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC;YAC7C,QAAQ,EAAE,sBAAsB;YAChC,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { basename, join, resolve } from 'node:path';
|
|
4
|
+
import { sanitizeSlug, titleCase } from './slug.js';
|
|
5
|
+
export async function findSkillFolders(root) {
|
|
6
|
+
const absRoot = resolve(root);
|
|
7
|
+
const rootStat = await stat(absRoot).catch(() => null);
|
|
8
|
+
if (!rootStat || !rootStat.isDirectory())
|
|
9
|
+
return [];
|
|
10
|
+
const direct = await isSkillFolder(absRoot);
|
|
11
|
+
if (direct)
|
|
12
|
+
return [direct];
|
|
13
|
+
const entries = await readdir(absRoot, { withFileTypes: true }).catch(() => []);
|
|
14
|
+
const folders = entries
|
|
15
|
+
.filter((entry) => entry.isDirectory())
|
|
16
|
+
.map((entry) => join(absRoot, entry.name));
|
|
17
|
+
const results = [];
|
|
18
|
+
for (const folder of folders) {
|
|
19
|
+
const found = await isSkillFolder(folder);
|
|
20
|
+
if (found)
|
|
21
|
+
results.push(found);
|
|
22
|
+
}
|
|
23
|
+
return results.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
24
|
+
}
|
|
25
|
+
export function getFallbackSkillRoots(workdir) {
|
|
26
|
+
const home = homedir();
|
|
27
|
+
const roots = [
|
|
28
|
+
// adjacent repo installs
|
|
29
|
+
resolve(workdir, '..', 'pilotbot', 'skills'),
|
|
30
|
+
resolve(workdir, '..', 'pilotbot', 'Skills'),
|
|
31
|
+
resolve(workdir, '..', 'pilotbot', 'skills'),
|
|
32
|
+
resolve(workdir, '..', 'pilotbot', 'Skills'),
|
|
33
|
+
// legacy locations
|
|
34
|
+
resolve(home, 'pilot', 'skills'),
|
|
35
|
+
resolve(home, 'pilot', 'Skills'),
|
|
36
|
+
resolve(home, '.pilot', 'skills'),
|
|
37
|
+
resolve(home, '.pilot', 'Skills'),
|
|
38
|
+
resolve(home, 'pilotbot', 'skills'),
|
|
39
|
+
resolve(home, 'pilotbot', 'Skills'),
|
|
40
|
+
resolve(home, '.pilotbot', 'skills'),
|
|
41
|
+
resolve(home, '.pilotbot', 'Skills'),
|
|
42
|
+
resolve(home, 'pilotbot', 'skills'),
|
|
43
|
+
resolve(home, 'pilotbot', 'Skills'),
|
|
44
|
+
resolve(home, '.pilotbot', 'skills'),
|
|
45
|
+
resolve(home, '.pilotbot', 'Skills'),
|
|
46
|
+
// macOS App Support legacy
|
|
47
|
+
resolve(home, 'Library', 'Application Support', 'pilotbot', 'skills'),
|
|
48
|
+
resolve(home, 'Library', 'Application Support', 'pilotbot', 'Skills'),
|
|
49
|
+
resolve(home, 'Library', 'Application Support', 'pilotbot', 'skills'),
|
|
50
|
+
resolve(home, 'Library', 'Application Support', 'pilotbot', 'Skills'),
|
|
51
|
+
];
|
|
52
|
+
return Array.from(new Set(roots));
|
|
53
|
+
}
|
|
54
|
+
async function isSkillFolder(folder) {
|
|
55
|
+
const marker = await findSkillMarker(folder);
|
|
56
|
+
if (!marker)
|
|
57
|
+
return null;
|
|
58
|
+
const base = basename(folder);
|
|
59
|
+
const slug = sanitizeSlug(base);
|
|
60
|
+
if (!slug)
|
|
61
|
+
return null;
|
|
62
|
+
const displayName = titleCase(base);
|
|
63
|
+
return { folder, slug, displayName };
|
|
64
|
+
}
|
|
65
|
+
async function findSkillMarker(folder) {
|
|
66
|
+
const candidates = ['SKILL.md', 'skill.md'];
|
|
67
|
+
for (const name of candidates) {
|
|
68
|
+
const path = join(folder, name);
|
|
69
|
+
const st = await stat(path).catch(() => null);
|
|
70
|
+
if (st?.isFile())
|
|
71
|
+
return path;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=scanSkills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanSkills.js","sourceRoot":"","sources":["../../src/cli/scanSkills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/* @vitest-environment node */
|
|
2
|
+
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { findSkillFolders, getFallbackSkillRoots } from './scanSkills';
|
|
7
|
+
async function makeTmpDir() {
|
|
8
|
+
return mkdtemp(join(tmpdir(), 'pilothub-scan-'));
|
|
9
|
+
}
|
|
10
|
+
describe('scanSkills', () => {
|
|
11
|
+
it('detects a single skill folder (root contains SKILL.md)', async () => {
|
|
12
|
+
const root = await makeTmpDir();
|
|
13
|
+
try {
|
|
14
|
+
await writeFile(join(root, 'SKILL.md'), '# Skill\n', 'utf8');
|
|
15
|
+
const found = await findSkillFolders(root);
|
|
16
|
+
expect(found).toHaveLength(1);
|
|
17
|
+
expect(found[0]?.folder).toBe(resolve(root));
|
|
18
|
+
expect(found[0]?.slug).toBeTruthy();
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
await rm(root, { recursive: true, force: true });
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
it('detects skills in a skills directory (subfolders)', async () => {
|
|
25
|
+
const root = await makeTmpDir();
|
|
26
|
+
try {
|
|
27
|
+
const skillsDir = join(root, 'skills');
|
|
28
|
+
const folder = join(skillsDir, 'cool-skill');
|
|
29
|
+
await mkdir(folder, { recursive: true });
|
|
30
|
+
await writeFile(join(folder, 'SKILL.md'), '# Skill\n', 'utf8');
|
|
31
|
+
const found = await findSkillFolders(skillsDir);
|
|
32
|
+
expect(found).toHaveLength(1);
|
|
33
|
+
expect(found[0]?.slug).toBe('cool-skill');
|
|
34
|
+
expect(found[0]?.folder).toBe(resolve(folder));
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
await rm(root, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
it('ignores plural skills.md marker files', async () => {
|
|
41
|
+
const root = await makeTmpDir();
|
|
42
|
+
try {
|
|
43
|
+
const folder = join(root, 'docs');
|
|
44
|
+
await mkdir(folder, { recursive: true });
|
|
45
|
+
await writeFile(join(folder, 'skills.md'), '# Docs\n', 'utf8');
|
|
46
|
+
const found = await findSkillFolders(root);
|
|
47
|
+
expect(found).toHaveLength(0);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
await rm(root, { recursive: true, force: true });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it('includes known legacy roots', () => {
|
|
54
|
+
const roots = getFallbackSkillRoots('/tmp/anywhere');
|
|
55
|
+
expect(roots.some((p) => p.endsWith('/pilotbot/skills'))).toBe(true);
|
|
56
|
+
expect(roots.some((p) => p.endsWith('/pilot/skills'))).toBe(true);
|
|
57
|
+
expect(roots.some((p) => p.endsWith('/pilotbot/skills'))).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=scanSkills.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanSkills.test.js","sourceRoot":"","sources":["../../src/cli/scanSkills.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/slug.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function sanitizeSlug(value) {
|
|
2
|
+
const raw = value
|
|
3
|
+
.trim()
|
|
4
|
+
.toLowerCase()
|
|
5
|
+
.replace(/[^a-z0-9-]+/g, '-');
|
|
6
|
+
const cleaned = raw.replace(/^-+/, '').replace(/-+$/, '').replace(/--+/g, '-');
|
|
7
|
+
return cleaned;
|
|
8
|
+
}
|
|
9
|
+
export function titleCase(value) {
|
|
10
|
+
return value
|
|
11
|
+
.trim()
|
|
12
|
+
.replace(/[-_]+/g, ' ')
|
|
13
|
+
.replace(/\s+/g, ' ')
|
|
14
|
+
.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/cli/slug.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,GAAG,GAAG,KAAK;SACd,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9E,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type GlobalOpts = {
|
|
2
|
+
workdir: string;
|
|
3
|
+
dir: string;
|
|
4
|
+
site: string;
|
|
5
|
+
registry: string;
|
|
6
|
+
registrySource: 'cli' | 'env' | 'default';
|
|
7
|
+
};
|
|
8
|
+
export type ResolveResult = {
|
|
9
|
+
match: {
|
|
10
|
+
version: string;
|
|
11
|
+
} | null;
|
|
12
|
+
latestVersion: {
|
|
13
|
+
version: string;
|
|
14
|
+
} | null;
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
|
package/dist/cli/ui.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function promptHidden(prompt: string): Promise<string>;
|
|
2
|
+
export declare function promptConfirm(prompt: string): Promise<boolean>;
|
|
3
|
+
export declare function openInBrowser(url: string): void;
|
|
4
|
+
export declare function isInteractive(): boolean;
|
|
5
|
+
export declare function createSpinner(text: string): import("ora").Ora;
|
|
6
|
+
export declare function formatError(error: unknown): string;
|
|
7
|
+
export declare function fail(message: string): never;
|