agent-skills-cli 1.1.0 → 1.1.1

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 (40) hide show
  1. package/README.md +85 -13
  2. package/dist/__tests__/git-auth.test.d.ts +11 -0
  3. package/dist/__tests__/git-auth.test.d.ts.map +1 -0
  4. package/dist/__tests__/git-auth.test.js +160 -0
  5. package/dist/__tests__/git-auth.test.js.map +1 -0
  6. package/dist/__tests__/skill-lock.test.d.ts +8 -0
  7. package/dist/__tests__/skill-lock.test.d.ts.map +1 -0
  8. package/dist/__tests__/skill-lock.test.js +104 -0
  9. package/dist/__tests__/skill-lock.test.js.map +1 -0
  10. package/dist/__tests__/skillsrc.test.d.ts +11 -0
  11. package/dist/__tests__/skillsrc.test.d.ts.map +1 -0
  12. package/dist/__tests__/skillsrc.test.js +185 -0
  13. package/dist/__tests__/skillsrc.test.js.map +1 -0
  14. package/dist/__tests__/source-parser.test.d.ts +16 -0
  15. package/dist/__tests__/source-parser.test.d.ts.map +1 -0
  16. package/dist/__tests__/source-parser.test.js +231 -0
  17. package/dist/__tests__/source-parser.test.js.map +1 -0
  18. package/dist/cli/commands/install.d.ts +8 -0
  19. package/dist/cli/commands/install.d.ts.map +1 -1
  20. package/dist/cli/commands/install.js +203 -90
  21. package/dist/cli/commands/install.js.map +1 -1
  22. package/dist/core/git-auth.d.ts +74 -0
  23. package/dist/core/git-auth.d.ts.map +1 -0
  24. package/dist/core/git-auth.js +299 -0
  25. package/dist/core/git-auth.js.map +1 -0
  26. package/dist/core/index.d.ts +4 -0
  27. package/dist/core/index.d.ts.map +1 -1
  28. package/dist/core/index.js +5 -1
  29. package/dist/core/index.js.map +1 -1
  30. package/dist/core/skill-lock.d.ts +1 -1
  31. package/dist/core/skill-lock.d.ts.map +1 -1
  32. package/dist/core/skillsrc.d.ts +65 -0
  33. package/dist/core/skillsrc.d.ts.map +1 -0
  34. package/dist/core/skillsrc.js +161 -0
  35. package/dist/core/skillsrc.js.map +1 -0
  36. package/dist/core/source-parser.d.ts +9 -1
  37. package/dist/core/source-parser.d.ts.map +1 -1
  38. package/dist/core/source-parser.js +85 -6
  39. package/dist/core/source-parser.js.map +1 -1
  40. package/package.json +9 -3
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Tests for skillsrc.ts
3
+ *
4
+ * Validates:
5
+ * - JSON config parsing
6
+ * - Source filtering by type
7
+ * - Registry lookup by scope
8
+ * - Auth env var resolution
9
+ */
10
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
11
+ import { writeFile, mkdir, rm } from 'fs/promises';
12
+ import { join } from 'path';
13
+ import { tmpdir } from 'os';
14
+ import { loadSkillsRC, getSourcesByType, getRegistryForScope, getAuthEnvVar, } from '../core/skillsrc.js';
15
+ // ─── Test Helpers ────────────────────────────────────────────────────
16
+ let testDir;
17
+ beforeEach(async () => {
18
+ testDir = join(tmpdir(), `skillsrc-test-${Date.now()}`);
19
+ await mkdir(testDir, { recursive: true });
20
+ });
21
+ afterEach(async () => {
22
+ await rm(testDir, { recursive: true, force: true }).catch(() => { });
23
+ });
24
+ // ─── JSON Config Loading ─────────────────────────────────────────────
25
+ describe('loadSkillsRC - JSON', () => {
26
+ it('should load .skillsrc.json file', async () => {
27
+ const config = {
28
+ sources: [
29
+ { type: 'git', url: 'https://git.company.com/team/skills', auth: 'env', envVar: 'COMPANY_TOKEN' },
30
+ { type: 'npm', registry: 'https://npm.company.com', scope: '@company' },
31
+ ],
32
+ defaults: {
33
+ agents: ['cursor', 'claude'],
34
+ global: false,
35
+ },
36
+ };
37
+ await writeFile(join(testDir, '.skillsrc.json'), JSON.stringify(config, null, 2));
38
+ const result = await loadSkillsRC(testDir);
39
+ expect(result).not.toBeNull();
40
+ expect(result.sources).toHaveLength(2);
41
+ expect(result.sources[0].type).toBe('git');
42
+ expect(result.sources[1].type).toBe('npm');
43
+ expect(result.defaults.agents).toEqual(['cursor', 'claude']);
44
+ });
45
+ it('should load .skillsrc file with JSON content', async () => {
46
+ const config = {
47
+ sources: [
48
+ { type: 'git', url: 'https://gitlab.com/private/repo' },
49
+ ],
50
+ };
51
+ await writeFile(join(testDir, '.skillsrc'), JSON.stringify(config));
52
+ const result = await loadSkillsRC(testDir);
53
+ expect(result).not.toBeNull();
54
+ expect(result.sources).toHaveLength(1);
55
+ });
56
+ it('should return null when no config exists', async () => {
57
+ const emptyDir = join(tmpdir(), `empty-${Date.now()}`);
58
+ await mkdir(emptyDir, { recursive: true });
59
+ // Pass emptyDir as cwd, and override homedir by providing the path
60
+ const result = await loadSkillsRC(emptyDir);
61
+ // May or may not find a config depending on user's homedir
62
+ // Just verify it doesn't throw
63
+ expect(result === null || typeof result === 'object').toBe(true);
64
+ await rm(emptyDir, { recursive: true, force: true }).catch(() => { });
65
+ });
66
+ it('should handle empty JSON object', async () => {
67
+ await writeFile(join(testDir, '.skillsrc.json'), '{}');
68
+ const result = await loadSkillsRC(testDir);
69
+ // Empty object is valid but has no sources
70
+ expect(result).not.toBeNull();
71
+ });
72
+ });
73
+ // ─── Source Filtering ────────────────────────────────────────────────
74
+ describe('getSourcesByType', () => {
75
+ const config = {
76
+ sources: [
77
+ { type: 'git', url: 'https://git.company.com/team/skills' },
78
+ { type: 'npm', registry: 'https://npm.company.com', scope: '@company' },
79
+ { type: 'git', url: 'https://gitlab.com/other/repo' },
80
+ { type: 'npm', scope: '@internal' },
81
+ ],
82
+ };
83
+ it('should filter git sources', () => {
84
+ const gitSources = getSourcesByType(config, 'git');
85
+ expect(gitSources).toHaveLength(2);
86
+ expect(gitSources.every(s => s.type === 'git')).toBe(true);
87
+ });
88
+ it('should filter npm sources', () => {
89
+ const npmSources = getSourcesByType(config, 'npm');
90
+ expect(npmSources).toHaveLength(2);
91
+ expect(npmSources.every(s => s.type === 'npm')).toBe(true);
92
+ });
93
+ it('should return empty array for no matches', () => {
94
+ const result = getSourcesByType({ sources: [] }, 'git');
95
+ expect(result).toHaveLength(0);
96
+ });
97
+ it('should handle config without sources', () => {
98
+ const result = getSourcesByType({}, 'git');
99
+ expect(result).toHaveLength(0);
100
+ });
101
+ });
102
+ // ─── Registry Lookup ─────────────────────────────────────────────────
103
+ describe('getRegistryForScope', () => {
104
+ const config = {
105
+ sources: [
106
+ { type: 'npm', registry: 'https://npm.company.com', scope: '@company' },
107
+ { type: 'npm', registry: 'https://npm.internal.io', scope: '@internal' },
108
+ { type: 'npm', scope: '@public' }, // no registry
109
+ ],
110
+ };
111
+ it('should find registry for matching scope', () => {
112
+ expect(getRegistryForScope(config, '@company')).toBe('https://npm.company.com');
113
+ expect(getRegistryForScope(config, '@internal')).toBe('https://npm.internal.io');
114
+ });
115
+ it('should return undefined for scope without registry', () => {
116
+ expect(getRegistryForScope(config, '@public')).toBeUndefined();
117
+ });
118
+ it('should return undefined for unknown scope', () => {
119
+ expect(getRegistryForScope(config, '@unknown')).toBeUndefined();
120
+ });
121
+ });
122
+ // ─── Auth Env Var Lookup ─────────────────────────────────────────────
123
+ describe('getAuthEnvVar', () => {
124
+ const config = {
125
+ sources: [
126
+ { type: 'git', url: 'git.company.com', envVar: 'COMPANY_GIT_TOKEN' },
127
+ { type: 'git', url: 'gitlab.internal.io', envVar: 'INTERNAL_TOKEN' },
128
+ ],
129
+ };
130
+ it('should find env var for matching URL', () => {
131
+ expect(getAuthEnvVar(config, 'https://git.company.com/team/repo')).toBe('COMPANY_GIT_TOKEN');
132
+ });
133
+ it('should find env var with partial URL match', () => {
134
+ expect(getAuthEnvVar(config, 'https://gitlab.internal.io/project')).toBe('INTERNAL_TOKEN');
135
+ });
136
+ it('should return undefined for non-matching URL', () => {
137
+ expect(getAuthEnvVar(config, 'https://github.com/owner/repo')).toBeUndefined();
138
+ });
139
+ });
140
+ // ─── Complex Config ──────────────────────────────────────────────────
141
+ describe('loadSkillsRC - Complex Scenarios', () => {
142
+ it('should handle config with all fields populated', async () => {
143
+ const config = {
144
+ sources: [
145
+ {
146
+ type: 'git',
147
+ url: 'https://git.company.com/team/skills',
148
+ auth: 'env',
149
+ envVar: 'COMPANY_TOKEN',
150
+ name: 'Company Skills',
151
+ },
152
+ {
153
+ type: 'npm',
154
+ registry: 'https://npm.company.com',
155
+ scope: '@company',
156
+ auth: 'token',
157
+ name: 'Company npm',
158
+ },
159
+ ],
160
+ defaults: {
161
+ agents: ['cursor', 'claude', 'copilot'],
162
+ global: true,
163
+ },
164
+ };
165
+ await writeFile(join(testDir, '.skillsrc.json'), JSON.stringify(config, null, 2));
166
+ const result = await loadSkillsRC(testDir);
167
+ expect(result).not.toBeNull();
168
+ expect(result.sources).toHaveLength(2);
169
+ expect(result.sources[0].name).toBe('Company Skills');
170
+ expect(result.sources[1].registry).toBe('https://npm.company.com');
171
+ expect(result.defaults.global).toBe(true);
172
+ expect(result.defaults.agents).toHaveLength(3);
173
+ });
174
+ it('should prioritize project config over home config', async () => {
175
+ // Create project-level config
176
+ const projectConfig = {
177
+ sources: [{ type: 'git', url: 'project-source' }],
178
+ };
179
+ await writeFile(join(testDir, '.skillsrc.json'), JSON.stringify(projectConfig));
180
+ const result = await loadSkillsRC(testDir);
181
+ expect(result).not.toBeNull();
182
+ expect(result.sources[0].url).toBe('project-source');
183
+ });
184
+ });
185
+ //# sourceMappingURL=skillsrc.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillsrc.test.js","sourceRoot":"","sources":["../../src/__tests__/skillsrc.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tests for source-parser.ts
3
+ *
4
+ * Validates parsing of all supported source formats:
5
+ * - Local paths
6
+ * - GitHub URLs (with/without branches, subpaths, shorthand)
7
+ * - GitLab URLs
8
+ * - Bitbucket URLs
9
+ * - SSH URLs (git@host:path)
10
+ * - npm packages (npm:@scope/pkg)
11
+ * - Private/self-hosted Git URLs
12
+ * - Direct SKILL.md URLs
13
+ * - Well-known URLs
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=source-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-parser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/source-parser.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Tests for source-parser.ts
3
+ *
4
+ * Validates parsing of all supported source formats:
5
+ * - Local paths
6
+ * - GitHub URLs (with/without branches, subpaths, shorthand)
7
+ * - GitLab URLs
8
+ * - Bitbucket URLs
9
+ * - SSH URLs (git@host:path)
10
+ * - npm packages (npm:@scope/pkg)
11
+ * - Private/self-hosted Git URLs
12
+ * - Direct SKILL.md URLs
13
+ * - Well-known URLs
14
+ */
15
+ import { describe, it, expect } from 'vitest';
16
+ import { parseSource, getOwnerRepo, getSourceTypeDisplay } from '../core/source-parser.js';
17
+ // ─── Local Paths ─────────────────────────────────────────────────────
18
+ describe('parseSource - Local Paths', () => {
19
+ it('should parse current directory', () => {
20
+ const result = parseSource('.');
21
+ expect(result.type).toBe('local');
22
+ expect(result.localPath).toBeDefined();
23
+ });
24
+ it('should parse relative path', () => {
25
+ const result = parseSource('./my-skill');
26
+ expect(result.type).toBe('local');
27
+ expect(result.localPath).toContain('my-skill');
28
+ });
29
+ it('should parse parent relative path', () => {
30
+ const result = parseSource('../other-skill');
31
+ expect(result.type).toBe('local');
32
+ expect(result.localPath).toContain('other-skill');
33
+ });
34
+ it('should parse absolute path', () => {
35
+ const result = parseSource('/home/user/skills/my-skill');
36
+ expect(result.type).toBe('local');
37
+ expect(result.localPath).toBe('/home/user/skills/my-skill');
38
+ });
39
+ });
40
+ // ─── GitHub URLs ─────────────────────────────────────────────────────
41
+ describe('parseSource - GitHub URLs', () => {
42
+ it('should parse basic GitHub URL', () => {
43
+ const result = parseSource('https://github.com/owner/repo');
44
+ expect(result.type).toBe('github');
45
+ expect(result.url).toBe('https://github.com/owner/repo.git');
46
+ });
47
+ it('should parse GitHub URL with .git suffix', () => {
48
+ const result = parseSource('https://github.com/owner/repo.git');
49
+ expect(result.type).toBe('github');
50
+ expect(result.url).toBe('https://github.com/owner/repo.git');
51
+ });
52
+ it('should parse GitHub URL with branch', () => {
53
+ const result = parseSource('https://github.com/owner/repo/tree/develop');
54
+ expect(result.type).toBe('github');
55
+ expect(result.ref).toBe('develop');
56
+ });
57
+ it('should parse GitHub URL with branch and subpath', () => {
58
+ const result = parseSource('https://github.com/owner/repo/tree/main/skills/my-skill');
59
+ expect(result.type).toBe('github');
60
+ expect(result.ref).toBe('main');
61
+ expect(result.subpath).toBe('skills/my-skill');
62
+ });
63
+ it('should parse GitHub shorthand owner/repo', () => {
64
+ const result = parseSource('anthropics/skills');
65
+ expect(result.type).toBe('github');
66
+ expect(result.url).toBe('https://github.com/anthropics/skills.git');
67
+ });
68
+ it('should parse GitHub shorthand with subpath', () => {
69
+ const result = parseSource('owner/repo/skills/my-skill');
70
+ expect(result.type).toBe('github');
71
+ expect(result.subpath).toBe('skills/my-skill');
72
+ });
73
+ });
74
+ // ─── GitLab URLs ─────────────────────────────────────────────────────
75
+ describe('parseSource - GitLab URLs', () => {
76
+ it('should parse basic GitLab URL', () => {
77
+ const result = parseSource('https://gitlab.com/owner/repo');
78
+ expect(result.type).toBe('gitlab');
79
+ expect(result.url).toBe('https://gitlab.com/owner/repo.git');
80
+ });
81
+ it('should parse GitLab URL with branch', () => {
82
+ const result = parseSource('https://gitlab.com/owner/repo/-/tree/main');
83
+ expect(result.type).toBe('gitlab');
84
+ expect(result.ref).toBe('main');
85
+ });
86
+ it('should parse GitLab URL with branch and subpath', () => {
87
+ const result = parseSource('https://gitlab.com/owner/repo/-/tree/develop/path/to/skill');
88
+ expect(result.type).toBe('gitlab');
89
+ expect(result.ref).toBe('develop');
90
+ expect(result.subpath).toBe('path/to/skill');
91
+ });
92
+ });
93
+ // ─── Bitbucket URLs ──────────────────────────────────────────────────
94
+ describe('parseSource - Bitbucket URLs', () => {
95
+ it('should parse basic Bitbucket URL', () => {
96
+ const result = parseSource('https://bitbucket.org/team/repo');
97
+ expect(result.type).toBe('bitbucket');
98
+ expect(result.url).toBe('https://bitbucket.org/team/repo.git');
99
+ });
100
+ it('should parse Bitbucket URL with .git suffix', () => {
101
+ const result = parseSource('https://bitbucket.org/team/repo.git');
102
+ expect(result.type).toBe('bitbucket');
103
+ expect(result.url).toBe('https://bitbucket.org/team/repo.git');
104
+ });
105
+ it('should parse Bitbucket URL with branch', () => {
106
+ const result = parseSource('https://bitbucket.org/team/repo/src/main');
107
+ expect(result.type).toBe('bitbucket');
108
+ expect(result.ref).toBe('main');
109
+ });
110
+ it('should parse Bitbucket URL with branch and subpath', () => {
111
+ const result = parseSource('https://bitbucket.org/team/repo/src/develop/skills/my-skill');
112
+ expect(result.type).toBe('bitbucket');
113
+ expect(result.ref).toBe('develop');
114
+ expect(result.subpath).toBe('skills/my-skill');
115
+ });
116
+ });
117
+ // ─── SSH URLs ────────────────────────────────────────────────────────
118
+ describe('parseSource - SSH URLs', () => {
119
+ it('should parse SSH GitHub URL', () => {
120
+ const result = parseSource('git@github.com:owner/repo.git');
121
+ expect(result.type).toBe('private-git');
122
+ expect(result.url).toBe('git@github.com:owner/repo.git');
123
+ expect(result.sshHost).toBe('github.com');
124
+ });
125
+ it('should parse SSH GitLab URL', () => {
126
+ const result = parseSource('git@gitlab.com:team/project.git');
127
+ expect(result.type).toBe('private-git');
128
+ expect(result.sshHost).toBe('gitlab.com');
129
+ });
130
+ it('should parse SSH custom host URL', () => {
131
+ const result = parseSource('git@git.company.com:team/skills.git');
132
+ expect(result.type).toBe('private-git');
133
+ expect(result.sshHost).toBe('git.company.com');
134
+ });
135
+ it('should parse SSH URL without .git suffix', () => {
136
+ const result = parseSource('git@github.com:owner/repo');
137
+ expect(result.type).toBe('private-git');
138
+ expect(result.url).toBe('git@github.com:owner/repo');
139
+ });
140
+ });
141
+ // ─── npm Packages ────────────────────────────────────────────────────
142
+ describe('parseSource - npm Packages', () => {
143
+ it('should parse scoped npm package', () => {
144
+ const result = parseSource('npm:@company/skills');
145
+ expect(result.type).toBe('npm');
146
+ expect(result.url).toBe('@company/skills');
147
+ });
148
+ it('should parse unscoped npm package', () => {
149
+ const result = parseSource('npm:my-skills-package');
150
+ expect(result.type).toBe('npm');
151
+ expect(result.url).toBe('my-skills-package');
152
+ });
153
+ it('should parse npm package with version', () => {
154
+ const result = parseSource('npm:@company/skills@1.2.3');
155
+ expect(result.type).toBe('npm');
156
+ expect(result.url).toBe('@company/skills@1.2.3');
157
+ });
158
+ it('should parse npm package with tag', () => {
159
+ const result = parseSource('npm:@company/skills@latest');
160
+ expect(result.type).toBe('npm');
161
+ expect(result.url).toBe('@company/skills@latest');
162
+ });
163
+ });
164
+ // ─── Private/Self-hosted Git ─────────────────────────────────────────
165
+ describe('parseSource - Private/Self-hosted Git', () => {
166
+ it('should parse self-hosted GitLab URL', () => {
167
+ const result = parseSource('https://git.company.com/team/skills');
168
+ expect(result.type).toBe('private-git');
169
+ expect(result.url).toBe('https://git.company.com/team/skills');
170
+ });
171
+ it('should parse self-hosted Git with port', () => {
172
+ const result = parseSource('https://git.internal.io:8443/team/repo');
173
+ expect(result.type).toBe('private-git');
174
+ });
175
+ it('should parse self-hosted Git .git URL', () => {
176
+ const result = parseSource('https://git.company.com/team/skills.git');
177
+ expect(result.type).toBe('private-git');
178
+ });
179
+ });
180
+ // ─── Direct SKILL.md URLs ────────────────────────────────────────────
181
+ describe('parseSource - Direct SKILL.md URLs', () => {
182
+ it('should parse raw GitHub URL to SKILL.md', () => {
183
+ const result = parseSource('https://raw.githubusercontent.com/owner/repo/main/skill/SKILL.md');
184
+ expect(result.type).toBe('direct-url');
185
+ });
186
+ it('should parse GitHub blob URL to SKILL.md', () => {
187
+ const result = parseSource('https://github.com/owner/repo/blob/main/skill/SKILL.md');
188
+ expect(result.type).toBe('direct-url');
189
+ });
190
+ });
191
+ // ─── getOwnerRepo ────────────────────────────────────────────────────
192
+ describe('getOwnerRepo', () => {
193
+ it('should extract owner/repo from GitHub URL', () => {
194
+ const parsed = parseSource('https://github.com/anthropics/skills');
195
+ expect(getOwnerRepo(parsed)).toBe('anthropics/skills');
196
+ });
197
+ it('should extract owner/repo from GitLab URL', () => {
198
+ const parsed = parseSource('https://gitlab.com/team/project');
199
+ expect(getOwnerRepo(parsed)).toBe('team/project');
200
+ });
201
+ it('should extract owner/repo from Bitbucket URL', () => {
202
+ const parsed = parseSource('https://bitbucket.org/team/repo');
203
+ expect(getOwnerRepo(parsed)).toBe('team/repo');
204
+ });
205
+ it('should extract owner/repo from SSH URL', () => {
206
+ const parsed = parseSource('git@github.com:owner/repo.git');
207
+ expect(getOwnerRepo(parsed)).toBe('owner/repo');
208
+ });
209
+ it('should return null for local paths', () => {
210
+ const parsed = parseSource('.');
211
+ expect(getOwnerRepo(parsed)).toBeNull();
212
+ });
213
+ it('should return null for npm packages', () => {
214
+ const parsed = parseSource('npm:@company/skills');
215
+ expect(getOwnerRepo(parsed)).toBeNull();
216
+ });
217
+ });
218
+ // ─── getSourceTypeDisplay ────────────────────────────────────────────
219
+ describe('getSourceTypeDisplay', () => {
220
+ it('should display correct names for all types', () => {
221
+ expect(getSourceTypeDisplay('local')).toBe('Local');
222
+ expect(getSourceTypeDisplay('github')).toBe('GitHub');
223
+ expect(getSourceTypeDisplay('gitlab')).toBe('GitLab');
224
+ expect(getSourceTypeDisplay('bitbucket')).toBe('Bitbucket');
225
+ expect(getSourceTypeDisplay('npm')).toBe('npm');
226
+ expect(getSourceTypeDisplay('private-git')).toBe('Private Git');
227
+ expect(getSourceTypeDisplay('direct-url')).toBe('Direct URL');
228
+ expect(getSourceTypeDisplay('well-known')).toBe('Well-Known');
229
+ });
230
+ });
231
+ //# sourceMappingURL=source-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-parser.test.js","sourceRoot":"","sources":["../../src/__tests__/source-parser.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,13 @@
1
1
  /**
2
2
  * `skills install` command — Install skills from various sources
3
+ *
4
+ * Supports:
5
+ * - Marketplace (by name, @scoped/name)
6
+ * - GitHub/GitLab/Bitbucket URLs
7
+ * - Private Git repos (SSH, HTTPS with tokens)
8
+ * - npm packages (npm:@scope/package)
9
+ * - Local directories
10
+ * - Lock file reinstallation
3
11
  */
4
12
  import { Command } from 'commander';
5
13
  export declare function registerInstallCommand(program: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAyYtD"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QA2gBtD"}