skillscat 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/commands/add.d.ts +11 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/config.d.ts +11 -0
  4. package/dist/commands/config.d.ts.map +1 -0
  5. package/dist/commands/info.d.ts +2 -0
  6. package/dist/commands/info.d.ts.map +1 -0
  7. package/dist/commands/list.d.ts +8 -0
  8. package/dist/commands/list.d.ts.map +1 -0
  9. package/dist/commands/login.d.ts +6 -0
  10. package/dist/commands/login.d.ts.map +1 -0
  11. package/dist/commands/logout.d.ts +2 -0
  12. package/dist/commands/logout.d.ts.map +1 -0
  13. package/dist/commands/publish.d.ts +10 -0
  14. package/dist/commands/publish.d.ts.map +1 -0
  15. package/dist/commands/remove.d.ts +7 -0
  16. package/dist/commands/remove.d.ts.map +1 -0
  17. package/dist/commands/search.d.ts +7 -0
  18. package/dist/commands/search.d.ts.map +1 -0
  19. package/dist/commands/self-upgrade.d.ts +6 -0
  20. package/dist/commands/self-upgrade.d.ts.map +1 -0
  21. package/dist/commands/submit.d.ts +5 -0
  22. package/dist/commands/submit.d.ts.map +1 -0
  23. package/dist/commands/unpublish.d.ts +6 -0
  24. package/dist/commands/unpublish.d.ts.map +1 -0
  25. package/dist/commands/update.d.ts +7 -0
  26. package/dist/commands/update.d.ts.map +1 -0
  27. package/dist/commands/whoami.d.ts +2 -0
  28. package/dist/commands/whoami.d.ts.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +3595 -0
  32. package/dist/utils/agents/agents.d.ts +24 -0
  33. package/dist/utils/agents/agents.d.ts.map +1 -0
  34. package/dist/utils/api/registry.d.ts +22 -0
  35. package/dist/utils/api/registry.d.ts.map +1 -0
  36. package/dist/utils/api/tracking.d.ts +6 -0
  37. package/dist/utils/api/tracking.d.ts.map +1 -0
  38. package/dist/utils/auth/auth.d.ts +105 -0
  39. package/dist/utils/auth/auth.d.ts.map +1 -0
  40. package/dist/utils/auth/callback-server.d.ts +21 -0
  41. package/dist/utils/auth/callback-server.d.ts.map +1 -0
  42. package/dist/utils/config/config.d.ts +55 -0
  43. package/dist/utils/config/config.d.ts.map +1 -0
  44. package/dist/utils/core/errors.d.ts +26 -0
  45. package/dist/utils/core/errors.d.ts.map +1 -0
  46. package/dist/utils/core/slug.d.ts +17 -0
  47. package/dist/utils/core/slug.d.ts.map +1 -0
  48. package/dist/utils/core/ui.d.ts +11 -0
  49. package/dist/utils/core/ui.d.ts.map +1 -0
  50. package/dist/utils/core/verbose.d.ts +29 -0
  51. package/dist/utils/core/verbose.d.ts.map +1 -0
  52. package/dist/utils/source/git.d.ts +17 -0
  53. package/dist/utils/source/git.d.ts.map +1 -0
  54. package/dist/utils/source/source.d.ts +39 -0
  55. package/dist/utils/source/source.d.ts.map +1 -0
  56. package/dist/utils/storage/cache.d.ts +49 -0
  57. package/dist/utils/storage/cache.d.ts.map +1 -0
  58. package/dist/utils/storage/db.d.ts +48 -0
  59. package/dist/utils/storage/db.d.ts.map +1 -0
  60. package/package.json +46 -0
@@ -0,0 +1,24 @@
1
+ export interface Agent {
2
+ id: string;
3
+ name: string;
4
+ projectPath: string;
5
+ globalPath: string;
6
+ }
7
+ export declare const AGENTS: Agent[];
8
+ /**
9
+ * Detect which agents are installed by checking for their config directories
10
+ */
11
+ export declare function detectInstalledAgents(): Agent[];
12
+ /**
13
+ * Get agent by ID
14
+ */
15
+ export declare function getAgentById(id: string): Agent | undefined;
16
+ /**
17
+ * Get agents by IDs
18
+ */
19
+ export declare function getAgentsByIds(ids: string[]): Agent[];
20
+ /**
21
+ * Get skill installation path for an agent
22
+ */
23
+ export declare function getSkillPath(agent: Agent, skillName: string, global: boolean): string;
24
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/utils/agents/agents.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,eAAO,MAAM,MAAM,EAAE,KAAK,EAmHzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,EAAE,CAM/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAE1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAErD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAGrF"}
@@ -0,0 +1,22 @@
1
+ export interface SkillRegistryItem {
2
+ name: string;
3
+ description: string;
4
+ owner: string;
5
+ repo?: string;
6
+ stars: number;
7
+ updatedAt: number;
8
+ categories: string[];
9
+ content: string;
10
+ githubUrl: string;
11
+ visibility?: 'public' | 'private' | 'unlisted';
12
+ slug?: string;
13
+ contentHash?: string;
14
+ skillPath?: string;
15
+ }
16
+ export interface RegistrySearchResult {
17
+ skills: SkillRegistryItem[];
18
+ total: number;
19
+ }
20
+ export declare function fetchSkill(skillIdentifier: string): Promise<SkillRegistryItem | null>;
21
+ export declare function searchSkills(query?: string, category?: string, limit?: number, includePrivate?: boolean): Promise<RegistrySearchResult>;
22
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/utils/api/registry.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AA4DD,wBAAsB,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAkF3F;AAED,wBAAsB,YAAY,CAChC,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,SAAK,EACV,cAAc,UAAQ,GACrB,OAAO,CAAC,oBAAoB,CAAC,CA+B/B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Track a skill installation on the server.
3
+ * Non-blocking, fail-silent — should never interrupt the install flow.
4
+ */
5
+ export declare function trackInstallation(slug: string): Promise<void>;
6
+ //# sourceMappingURL=tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../../../src/utils/api/tracking.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBnE"}
@@ -0,0 +1,105 @@
1
+ export interface AuthConfig {
2
+ accessToken?: string;
3
+ accessTokenExpiresAt?: number;
4
+ refreshToken?: string;
5
+ refreshTokenExpiresAt?: number;
6
+ user?: {
7
+ id: string;
8
+ name?: string;
9
+ email?: string;
10
+ image?: string;
11
+ };
12
+ }
13
+ export declare function loadConfig(): AuthConfig;
14
+ export declare function saveConfig(config: AuthConfig): void;
15
+ export declare function clearConfig(): void;
16
+ /**
17
+ * Get the base URL for the API (derived from registry URL)
18
+ */
19
+ export declare function getBaseUrl(): string;
20
+ /**
21
+ * Get client info for device authorization
22
+ */
23
+ export declare function getClientInfo(): {
24
+ os: string;
25
+ hostname: string;
26
+ version: string;
27
+ };
28
+ /**
29
+ * Refresh the access token using the refresh token
30
+ */
31
+ export declare function refreshAccessToken(refreshToken: string): Promise<{
32
+ accessToken: string;
33
+ accessTokenExpiresAt: number;
34
+ refreshToken?: string;
35
+ refreshTokenExpiresAt?: number;
36
+ } | null>;
37
+ /**
38
+ * Get a valid access token, refreshing if necessary
39
+ */
40
+ export declare function getValidToken(): Promise<string | null>;
41
+ /**
42
+ * Validate an access token by calling token auth endpoint.
43
+ */
44
+ export declare function validateAccessToken(token: string): Promise<AuthConfig['user'] | null>;
45
+ /**
46
+ * Set token directly (for --token flag)
47
+ */
48
+ export declare function setToken(token: string, user?: AuthConfig['user']): void;
49
+ /**
50
+ * Set tokens from device authorization flow
51
+ */
52
+ export declare function setTokens(tokens: {
53
+ accessToken: string;
54
+ accessTokenExpiresAt: number;
55
+ refreshToken: string;
56
+ refreshTokenExpiresAt: number;
57
+ user: AuthConfig['user'];
58
+ }): void;
59
+ export declare function isAuthenticated(): boolean;
60
+ export declare function getUser(): AuthConfig['user'] | undefined;
61
+ /**
62
+ * Generate a random state parameter for CSRF protection
63
+ */
64
+ export declare function generateRandomState(): string;
65
+ /**
66
+ * Generate a PKCE code verifier (43-128 chars, cryptographically random)
67
+ * Using 64 bytes = 86 chars base64url (within 43-128 range)
68
+ */
69
+ export declare function generateCodeVerifier(): string;
70
+ /**
71
+ * Compute PKCE code challenge from verifier using SHA-256
72
+ * Returns base64url encoded hash (no padding)
73
+ */
74
+ export declare function computeCodeChallenge(verifier: string): string;
75
+ /**
76
+ * Initialize a CLI auth session
77
+ */
78
+ export declare function initAuthSession(baseUrl: string, callbackUrl: string, state: string, clientInfo?: {
79
+ os: string;
80
+ hostname: string;
81
+ version: string;
82
+ }, pkce?: {
83
+ codeChallenge: string;
84
+ codeChallengeMethod: 'S256' | 'plain';
85
+ }): Promise<{
86
+ session_id: string;
87
+ expires_in: number;
88
+ }>;
89
+ /**
90
+ * Exchange auth code for tokens
91
+ */
92
+ export declare function exchangeCodeForTokens(baseUrl: string, code: string, sessionId: string, codeVerifier?: string): Promise<{
93
+ access_token: string;
94
+ token_type: string;
95
+ expires_in: number;
96
+ refresh_token: string;
97
+ refresh_expires_in: number;
98
+ user: {
99
+ id: string;
100
+ name?: string;
101
+ email?: string;
102
+ image?: string;
103
+ };
104
+ }>;
105
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/utils/auth/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Local HTTP server to receive OAuth callback from browser
3
+ */
4
+ export interface CallbackResult {
5
+ code: string;
6
+ state: string;
7
+ }
8
+ export interface CallbackError {
9
+ error: string;
10
+ state?: string;
11
+ }
12
+ export interface CallbackServer {
13
+ port: number;
14
+ waitForCallback: () => Promise<CallbackResult>;
15
+ close: () => void;
16
+ }
17
+ /**
18
+ * Start a local callback server on an available port
19
+ */
20
+ export declare function startCallbackServer(expectedState: string): Promise<CallbackServer>;
21
+ //# sourceMappingURL=callback-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../../src/utils/auth/callback-server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AA0BD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA+FxF"}
@@ -0,0 +1,55 @@
1
+ export interface Settings {
2
+ registry?: string;
3
+ }
4
+ /**
5
+ * Get the platform-specific config directory
6
+ * - macOS: ~/Library/Application Support/skillscat/
7
+ * - Linux: ~/.config/skillscat/
8
+ * - Windows: %APPDATA%/skillscat/
9
+ */
10
+ export declare function getConfigDir(): string;
11
+ /**
12
+ * Get the path to auth.json
13
+ */
14
+ export declare function getAuthPath(): string;
15
+ /**
16
+ * Get the path to settings.json
17
+ */
18
+ export declare function getSettingsPath(): string;
19
+ /**
20
+ * Get the path to installed.json
21
+ */
22
+ export declare function getInstalledDbPath(): string;
23
+ /**
24
+ * Get the cache directory path
25
+ */
26
+ export declare function getCacheDir(): string;
27
+ /**
28
+ * Ensure the config directory exists
29
+ */
30
+ export declare function ensureConfigDir(): void;
31
+ /**
32
+ * Load settings from settings.json
33
+ */
34
+ export declare function loadSettings(): Settings;
35
+ /**
36
+ * Save settings to settings.json
37
+ */
38
+ export declare function saveSettings(settings: Settings): void;
39
+ /**
40
+ * Get a specific setting value
41
+ */
42
+ export declare function getSetting<K extends keyof Settings>(key: K): Settings[K];
43
+ /**
44
+ * Set a specific setting value
45
+ */
46
+ export declare function setSetting<K extends keyof Settings>(key: K, value: Settings[K]): void;
47
+ /**
48
+ * Delete a specific setting
49
+ */
50
+ export declare function deleteSetting<K extends keyof Settings>(key: K): void;
51
+ /**
52
+ * Get the registry URL (from settings or default)
53
+ */
54
+ export declare function getRegistryUrl(): string;
55
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/utils/config/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAYrC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAYtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAWvC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAIrD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAGxE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAIrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAIpE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,26 @@
1
+ export interface FriendlyError {
2
+ message: string;
3
+ suggestion?: string;
4
+ isRetryable: boolean;
5
+ }
6
+ /**
7
+ * Parse a network error and return a friendly message
8
+ */
9
+ export declare function parseNetworkError(error: unknown): FriendlyError;
10
+ /**
11
+ * Parse an HTTP error and return a friendly message
12
+ */
13
+ export declare function parseHttpError(status: number, statusText?: string): FriendlyError;
14
+ /**
15
+ * Format a friendly error for display
16
+ */
17
+ export declare function formatError(error: FriendlyError): string;
18
+ /**
19
+ * Handle and display a fetch error
20
+ */
21
+ export declare function handleFetchError(error: unknown): FriendlyError;
22
+ /**
23
+ * Handle and display an HTTP response error
24
+ */
25
+ export declare function handleHttpError(response: Response): FriendlyError;
26
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/core/errors.ts"],"names":[],"mappings":"AAsCA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAqC/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAcjF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CAEjE"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Parse a skill slug into owner and name components
3
+ * @param slug - Skill slug in format "owner/name"
4
+ * @returns Object with owner and name
5
+ * @throws Error if slug format is invalid
6
+ */
7
+ export declare function parseSlug(slug: string): {
8
+ owner: string;
9
+ name: string;
10
+ };
11
+ /**
12
+ * Build a two-segment API path from a slug
13
+ * @param slug - Skill slug in format "owner/name"
14
+ * @returns Path segment like "owner/name" (without leading slash)
15
+ */
16
+ export declare function slugToPath(slug: string): string;
17
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../../src/utils/core/slug.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMvE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C"}
@@ -0,0 +1,11 @@
1
+ export declare function success(message: string): void;
2
+ export declare function error(message: string): void;
3
+ export declare function warn(message: string): void;
4
+ export declare function info(message: string): void;
5
+ export declare function spinner(message: string): {
6
+ stop: (success?: boolean) => void;
7
+ };
8
+ export declare function prompt(question: string): Promise<string>;
9
+ export declare function table(headers: string[], rows: string[][]): void;
10
+ export declare function box(content: string, title?: string): void;
11
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/utils/core/ui.ts"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,CAsB9E;AAED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYxD;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAsB/D;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBzD"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Enable or disable verbose mode
3
+ */
4
+ export declare function setVerbose(enabled: boolean): void;
5
+ /**
6
+ * Check if verbose mode is enabled
7
+ */
8
+ export declare function isVerbose(): boolean;
9
+ /**
10
+ * Log a message only if verbose mode is enabled
11
+ */
12
+ export declare function verboseLog(message: string, ...args: unknown[]): void;
13
+ /**
14
+ * Log request details
15
+ */
16
+ export declare function verboseRequest(method: string, url: string, headers?: Record<string, string>): void;
17
+ /**
18
+ * Log response details
19
+ */
20
+ export declare function verboseResponse(status: number, statusText: string, timing?: number): void;
21
+ /**
22
+ * Log config file locations
23
+ */
24
+ export declare function verboseConfig(): void;
25
+ /**
26
+ * Log timing information
27
+ */
28
+ export declare function verboseTiming(label: string, startTime: number): void;
29
+ //# sourceMappingURL=verbose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbose.d.ts","sourceRoot":"","sources":["../../../src/utils/core/verbose.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAGpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAUlG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAQzF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAQpC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAIpE"}
@@ -0,0 +1,17 @@
1
+ import type { RepoSource, SkillInfo } from './source';
2
+ /**
3
+ * Discover skills in a repository
4
+ */
5
+ export declare function discoverSkills(source: RepoSource): Promise<SkillInfo[]>;
6
+ /**
7
+ * Fetch a single skill by name from a repository
8
+ */
9
+ export declare function fetchSkill(source: RepoSource, skillName: string): Promise<SkillInfo | null>;
10
+ /**
11
+ * Check if a skill has updates available
12
+ */
13
+ export declare function checkSkillUpdate(source: RepoSource, skillName: string, currentSha?: string): Promise<{
14
+ hasUpdate: boolean;
15
+ latestSha?: string;
16
+ }>;
17
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/utils/source/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmNtD;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA8F7E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAGjG;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYrD"}
@@ -0,0 +1,39 @@
1
+ export type Platform = 'github' | 'gitlab';
2
+ export interface RepoSource {
3
+ platform: Platform;
4
+ owner: string;
5
+ repo: string;
6
+ branch?: string;
7
+ path?: string;
8
+ }
9
+ export interface SkillInfo {
10
+ name: string;
11
+ description: string;
12
+ path: string;
13
+ content: string;
14
+ sha?: string;
15
+ contentHash?: string;
16
+ }
17
+ export interface SkillMetadata {
18
+ name: string;
19
+ description: string;
20
+ 'allowed-tools'?: string[];
21
+ model?: string;
22
+ context?: 'fork';
23
+ agent?: string;
24
+ hooks?: Record<string, unknown>;
25
+ 'user-invocable'?: boolean;
26
+ }
27
+ /**
28
+ * Parse repository source from various formats
29
+ */
30
+ export declare function parseSource(source: string): RepoSource | null;
31
+ /**
32
+ * Skill discovery directories (in order of priority)
33
+ */
34
+ export declare const SKILL_DISCOVERY_PATHS: string[];
35
+ /**
36
+ * Parse SKILL.md frontmatter
37
+ */
38
+ export declare function parseSkillFrontmatter(content: string): SkillMetadata | null;
39
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/utils/source/source.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAwD7D;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,UAoBjC,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgC3E"}
@@ -0,0 +1,49 @@
1
+ export interface CachedSkill {
2
+ content: string;
3
+ contentHash: string;
4
+ commitSha?: string;
5
+ cachedAt: number;
6
+ lastAccessedAt: number;
7
+ source: 'github' | 'registry';
8
+ }
9
+ /**
10
+ * Get the skills cache directory
11
+ */
12
+ export declare function getSkillsCacheDir(): string;
13
+ /**
14
+ * Generate a cache key from skill identifier
15
+ */
16
+ export declare function getCacheKey(owner: string, repo: string, skillPath?: string): string;
17
+ /**
18
+ * Calculate SHA256 content hash
19
+ */
20
+ export declare function calculateContentHash(content: string): string;
21
+ /**
22
+ * Get cached skill if valid
23
+ */
24
+ export declare function getCachedSkill(owner: string, repo: string, skillPath?: string): CachedSkill | null;
25
+ /**
26
+ * Cache a skill
27
+ */
28
+ export declare function cacheSkill(owner: string, repo: string, content: string, source: 'github' | 'registry', skillPath?: string, commitSha?: string): void;
29
+ /**
30
+ * Check if cached skill is valid by comparing hashes
31
+ */
32
+ export declare function isSkillCacheValid(owner: string, repo: string, remoteHash: string, skillPath?: string): boolean;
33
+ /**
34
+ * Clear all cached skills
35
+ */
36
+ export declare function clearCache(): void;
37
+ /**
38
+ * Prune cache to stay under MAX_CACHE_ITEMS
39
+ * Removes oldest 20% when limit is exceeded
40
+ */
41
+ export declare function pruneCache(maxItems?: number): void;
42
+ /**
43
+ * Get cache statistics
44
+ */
45
+ export declare function getCacheStats(): {
46
+ count: number;
47
+ size: number;
48
+ };
49
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/utils/storage/cache.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAmBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAyBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAwBlG;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,GAAG,UAAU,EAC7B,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CA6BN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAIT;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAkBjC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,GAAE,MAAwB,GAAG,IAAI,CAmCnE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAuB/D"}
@@ -0,0 +1,48 @@
1
+ import type { RepoSource } from '../source/source';
2
+ export type UpdateStrategy = 'git' | 'registry';
3
+ export interface InstalledSkill {
4
+ name: string;
5
+ description: string;
6
+ source?: RepoSource;
7
+ registrySlug?: string;
8
+ updateStrategy?: UpdateStrategy;
9
+ agents: string[];
10
+ global: boolean;
11
+ installedAt: number;
12
+ sha?: string;
13
+ path: string;
14
+ contentHash?: string;
15
+ }
16
+ export interface InstalledSkillsDb {
17
+ version: number;
18
+ skills: InstalledSkill[];
19
+ }
20
+ /**
21
+ * Record a skill installation
22
+ */
23
+ export declare function recordInstallation(skill: InstalledSkill): void;
24
+ /**
25
+ * Remove a skill record
26
+ */
27
+ export declare function removeInstallation(skillName: string, options?: {
28
+ source?: RepoSource;
29
+ agents?: string[];
30
+ global?: boolean;
31
+ }): void;
32
+ /**
33
+ * Get all installed skills
34
+ */
35
+ export declare function getInstalledSkills(): InstalledSkill[];
36
+ /**
37
+ * Get installed skill by name
38
+ */
39
+ export declare function getInstalledSkill(skillName: string): InstalledSkill | undefined;
40
+ /**
41
+ * Check if a skill is installed
42
+ */
43
+ export declare function isSkillInstalled(skillName: string, source?: RepoSource): boolean;
44
+ /**
45
+ * Get skills that need updates
46
+ */
47
+ export declare function getSkillsNeedingUpdate(skills: InstalledSkill[], updates: Map<string, string>): InstalledSkill[];
48
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/utils/storage/db.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AA8HD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAY9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,IAAI,CA+BN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAGrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAG/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAUhF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,EAAE,CAK/G"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "skillscat",
3
+ "version": "0.1.0",
4
+ "description": "CLI for installing Claude Code skills from SkillsCat registry",
5
+ "type": "module",
6
+ "bin": {
7
+ "skillscat": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "rollup -c",
14
+ "dev": "rollup -c -w",
15
+ "typecheck": "tsc --noEmit",
16
+ "prepublishOnly": "npm run build",
17
+ "test": "vitest run"
18
+ },
19
+ "dependencies": {
20
+ "commander": "^12.1.0",
21
+ "picocolors": "^1.1.1"
22
+ },
23
+ "devDependencies": {
24
+ "@rollup/plugin-node-resolve": "^16.0.3",
25
+ "@rollup/plugin-typescript": "^12.3.0",
26
+ "@types/node": "^22.19.11",
27
+ "rollup": "^4.57.1",
28
+ "rollup-plugin-preserve-shebang": "^1.0.1",
29
+ "typescript": "^5.9.3",
30
+ "vitest": "^3.2.4"
31
+ },
32
+ "keywords": [
33
+ "claude",
34
+ "claude-code",
35
+ "skills",
36
+ "cli",
37
+ "ai"
38
+ ],
39
+ "author": "",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/skillscat/skillscat"
44
+ },
45
+ "homepage": "https://skillscat.com"
46
+ }