agent-skills-cli 1.1.0 → 1.1.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.
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 +95 -6
  39. package/dist/core/source-parser.js.map +1 -1
  40. package/package.json +9 -3
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  Install skills from the world's largest marketplace and sync them to **42 AI agents** including Cursor, Claude Code, GitHub Copilot, Windsurf, Cline, Gemini CLI, Zed, and more — all with a single command.
9
9
 
10
- **What's new in v1.1.0:** Quality scoring (`skills score`), repo auto-indexing (`skills submit-repo`), and a formal adapter pattern architecture.
10
+ **What's new in v1.1.2:** Private Git repos (GitLab, Bitbucket, SSH, self-hosted), npm packages, `.skillsrc` config files, and automatic credential resolution.
11
11
 
12
12
  🌐 **Website:** [agentskills.in](https://agentskills.in)
13
13
 
@@ -23,6 +23,9 @@ skills install @anthropic/xlsx
23
23
  - **175,000+ Skills** — Access the largest collection of AI agent skills
24
24
  - **FZF Interactive Search** — Real-time search with keyboard navigation: `skills search -i`
25
25
  - **42 AI Agents** — Cursor, Claude, Copilot, Windsurf, Cline, Gemini CLI, Zed, and 35+ more
26
+ - **Private Git Repos** — GitLab, Bitbucket, SSH, self-hosted Git with auto-auth: `skills install git@host:team/repo`
27
+ - **npm Packages** — Install skills from npm registries: `skills install npm:@scope/package`
28
+ - **`.skillsrc` Config** — Enterprise config files for custom registries, tokens, and defaults
26
29
  - **Quality Scoring** — 4-dimension skill scoring (0–100): `skills score`
27
30
  - **Repo Auto-Index** — Submit entire repos to the marketplace: `skills submit-repo owner/repo`
28
31
  - **Adapter Architecture** — Formal adapter pattern for clean multi-agent support
@@ -53,6 +56,14 @@ skills install @facebook/verify
53
56
  # ⭐ Install from a GitHub repo
54
57
  skills add vercel-labs/agent-skills
55
58
 
59
+ # ⭐ Install from private Git (auto-detects credentials)
60
+ skills install git@gitlab.com:team/internal-skills.git
61
+ skills install https://git.company.com/team/skills --token $GIT_TOKEN
62
+
63
+ # ⭐ Install from npm registry
64
+ skills install npm:@company/skills
65
+ skills install npm:@company/skills --registry https://npm.company.com
66
+
56
67
  # Install to specific platforms
57
68
  skills install @facebook/verify -a claude,cursor
58
69
 
@@ -79,9 +90,6 @@ skills update --all
79
90
 
80
91
  # Search and install skills interactively
81
92
  skills search python
82
-
83
- # Search with JSON output (non-interactive)
84
- skills search react --json
85
93
  ```
86
94
 
87
95
  ---
@@ -119,7 +127,7 @@ skills add @facebook/verify -a cursor # 'add' is an alias for 'install'
119
127
 
120
128
  ```bash
121
129
  skills add owner/repo # GitHub shorthand
122
- skills add owner/repo@skill-name # NEW: Install specific skill directly
130
+ skills add owner/repo@skill-name # Install specific skill directly
123
131
  skills add https://github.com/user/repo # Full URL
124
132
  skills add https://gitlab.com/org/repo # GitLab
125
133
  skills add owner/repo --list # List skills in repo
@@ -127,6 +135,40 @@ skills add owner/repo -s skill-name # Install specific skill
127
135
  skills add owner/repo -y -g # Non-interactive, global
128
136
  ```
129
137
 
138
+ ### Private Git Repos
139
+
140
+ ```bash
141
+ # SSH (auto-detects SSH keys)
142
+ skills install git@github.com:team/private-repo.git
143
+ skills install git@gitlab.com:team/internal-skills.git
144
+
145
+ # HTTPS with token
146
+ skills install https://git.company.com/team/repo --token=xxx
147
+
148
+ # Token from environment variable
149
+ GITLAB_TOKEN=xxx skills install https://gitlab.com/team/repo
150
+ BITBUCKET_TOKEN=xxx skills install https://bitbucket.org/team/repo
151
+
152
+ # Bitbucket
153
+ skills install https://bitbucket.org/team/skills-repo
154
+ ```
155
+
156
+ **Auth resolution order:** `--token` flag → env vars (`GH_TOKEN`, `GITLAB_TOKEN`, `BITBUCKET_TOKEN`, `GIT_TOKEN`) → SSH keys → git credential helper → `.netrc`
157
+
158
+ ### npm Packages
159
+
160
+ ```bash
161
+ # Public npm packages
162
+ skills install npm:chalk
163
+ skills install npm:@anthropic/skills
164
+
165
+ # Scoped package with version
166
+ skills install npm:@company/skills@1.1.2
167
+
168
+ # Private npm registry
169
+ skills install npm:@company/skills --registry https://npm.company.com
170
+ ```
171
+
130
172
  ### Other Commands
131
173
 
132
174
  ```bash
@@ -175,16 +217,46 @@ skills submit-repo vercel-labs/agent-skills # Skills appear on marketplace
175
217
 
176
218
  ---
177
219
 
178
- ## 🔒 Privacy & Telemetry
220
+ ## ⚙️ Configuration (`.skillsrc`)
221
+
222
+ Create a `.skillsrc` or `.skillsrc.json` file in your project root or home directory to configure private sources and defaults:
223
+
224
+ ```json
225
+ {
226
+ "sources": [
227
+ {
228
+ "name": "company-gitlab",
229
+ "type": "git",
230
+ "url": "https://gitlab.company.com",
231
+ "auth_env": "COMPANY_GIT_TOKEN"
232
+ },
233
+ {
234
+ "name": "company-npm",
235
+ "type": "npm",
236
+ "registry": "https://npm.company.com",
237
+ "scope": "@company"
238
+ }
239
+ ],
240
+ "defaults": {
241
+ "agent": "cursor",
242
+ "global": false
243
+ }
244
+ }
245
+ ```
179
246
 
180
- The CLI collects anonymous usage data to improve the product. **No personal data is collected.**
247
+ Config is loaded from: project `.skillsrc` home `~/.skillsrc` (first found wins).
181
248
 
182
- ```bash
183
- # Opt out of telemetry
184
- export DISABLE_TELEMETRY=1
185
- # or
186
- export DO_NOT_TRACK=1
187
- ```
249
+ ---
250
+
251
+ ## 🔐 Environment Variables
252
+
253
+ | Variable | Purpose |
254
+ |----------|---------|
255
+ | `GH_TOKEN` / `GITHUB_TOKEN` | GitHub private repo authentication |
256
+ | `GITLAB_TOKEN` / `GL_TOKEN` | GitLab private repo authentication |
257
+ | `BITBUCKET_TOKEN` / `BB_TOKEN` | Bitbucket private repo authentication |
258
+ | `GIT_TOKEN` | Generic Git authentication (any host) |
259
+ | `DISABLE_TELEMETRY` / `DO_NOT_TRACK` | Opt out of anonymous telemetry |
188
260
 
189
261
  Telemetry is automatically disabled in CI environments.
190
262
 
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tests for git-auth.ts
3
+ *
4
+ * Validates:
5
+ * - Host detection from URLs
6
+ * - Token resolution from env vars
7
+ * - URL manipulation (SSH→HTTPS, token injection, normalization)
8
+ * - URL sanitization (token stripping)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=git-auth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-auth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/git-auth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Tests for git-auth.ts
3
+ *
4
+ * Validates:
5
+ * - Host detection from URLs
6
+ * - Token resolution from env vars
7
+ * - URL manipulation (SSH→HTTPS, token injection, normalization)
8
+ * - URL sanitization (token stripping)
9
+ */
10
+ import { describe, it, expect, afterEach } from 'vitest';
11
+ import { detectGitHost, buildAuthenticatedUrl, sshToHttps, normalizeGitUrl, sanitizeUrl, resolveGitAuth, } from '../core/git-auth.js';
12
+ // ─── Host Detection ──────────────────────────────────────────────────
13
+ describe('detectGitHost', () => {
14
+ it('should detect GitHub', () => {
15
+ expect(detectGitHost('https://github.com/owner/repo')).toBe('github');
16
+ expect(detectGitHost('git@github.com:owner/repo.git')).toBe('github');
17
+ });
18
+ it('should detect GitLab', () => {
19
+ expect(detectGitHost('https://gitlab.com/owner/repo')).toBe('gitlab');
20
+ expect(detectGitHost('git@gitlab.com:owner/repo.git')).toBe('gitlab');
21
+ });
22
+ it('should detect Bitbucket', () => {
23
+ expect(detectGitHost('https://bitbucket.org/owner/repo')).toBe('bitbucket');
24
+ expect(detectGitHost('git@bitbucket.org:owner/repo.git')).toBe('bitbucket');
25
+ });
26
+ it('should detect custom hosts', () => {
27
+ expect(detectGitHost('https://git.company.com/team/repo')).toBe('custom');
28
+ expect(detectGitHost('git@git.internal.io:team/repo.git')).toBe('custom');
29
+ });
30
+ });
31
+ // ─── URL Manipulation ────────────────────────────────────────────────
32
+ describe('buildAuthenticatedUrl', () => {
33
+ it('should inject token into HTTPS URL', () => {
34
+ const result = buildAuthenticatedUrl('https://github.com/owner/repo.git', 'mytoken123');
35
+ expect(result).toContain('oauth2:mytoken123@');
36
+ expect(result).toContain('github.com');
37
+ });
38
+ it('should inject token into GitLab URL', () => {
39
+ const result = buildAuthenticatedUrl('https://gitlab.com/team/repo.git', 'gltoken');
40
+ expect(result).toContain('oauth2:gltoken@');
41
+ expect(result).toContain('gitlab.com');
42
+ });
43
+ it('should handle URL with port', () => {
44
+ const result = buildAuthenticatedUrl('https://git.company.com:8443/team/repo.git', 'token');
45
+ expect(result).toContain('oauth2:token@');
46
+ });
47
+ });
48
+ describe('sshToHttps', () => {
49
+ it('should convert SSH to HTTPS', () => {
50
+ expect(sshToHttps('git@github.com:owner/repo.git')).toBe('https://github.com/owner/repo.git');
51
+ });
52
+ it('should convert SSH without .git suffix', () => {
53
+ expect(sshToHttps('git@gitlab.com:team/project')).toBe('https://gitlab.com/team/project.git');
54
+ });
55
+ it('should return non-SSH URLs unchanged', () => {
56
+ const url = 'https://github.com/owner/repo.git';
57
+ expect(sshToHttps(url)).toBe(url);
58
+ });
59
+ });
60
+ describe('normalizeGitUrl', () => {
61
+ it('should add https prefix if missing', () => {
62
+ const result = normalizeGitUrl('github.com/owner/repo');
63
+ expect(result).toMatch(/^https:\/\//);
64
+ });
65
+ it('should add .git suffix if missing', () => {
66
+ const result = normalizeGitUrl('https://github.com/owner/repo');
67
+ expect(result).toMatch(/\.git$/);
68
+ });
69
+ it('should leave SSH URLs unchanged', () => {
70
+ const url = 'git@github.com:owner/repo.git';
71
+ expect(normalizeGitUrl(url)).toBe(url);
72
+ });
73
+ it('should not double-add .git', () => {
74
+ const result = normalizeGitUrl('https://github.com/owner/repo.git');
75
+ expect(result).not.toContain('.git.git');
76
+ });
77
+ });
78
+ // ─── URL Sanitization ────────────────────────────────────────────────
79
+ describe('sanitizeUrl', () => {
80
+ it('should strip oauth2 tokens', () => {
81
+ const url = 'https://oauth2:mysecrettoken123@github.com/owner/repo.git';
82
+ const result = sanitizeUrl(url);
83
+ expect(result).not.toContain('mysecrettoken123');
84
+ expect(result).toContain('github.com');
85
+ });
86
+ it('should strip basic auth tokens', () => {
87
+ const url = 'https://user:password123@gitlab.com/team/repo.git';
88
+ const result = sanitizeUrl(url);
89
+ expect(result).not.toContain('password123');
90
+ });
91
+ it('should leave clean URLs unchanged', () => {
92
+ const url = 'https://github.com/owner/repo.git';
93
+ expect(sanitizeUrl(url)).toBe(url);
94
+ });
95
+ });
96
+ // ─── Auth Resolution ─────────────────────────────────────────────────
97
+ describe('resolveGitAuth', () => {
98
+ const originalEnv = { ...process.env };
99
+ afterEach(() => {
100
+ // Restore environment
101
+ process.env = { ...originalEnv };
102
+ });
103
+ it('should prioritize explicit token', async () => {
104
+ const result = await resolveGitAuth('https://github.com/owner/repo', 'explicit-token');
105
+ expect(result.method).toBe('token');
106
+ expect(result.token).toBe('explicit-token');
107
+ });
108
+ it('should resolve GH_TOKEN for GitHub', async () => {
109
+ process.env.GH_TOKEN = 'gh-test-token';
110
+ const result = await resolveGitAuth('https://github.com/owner/repo');
111
+ expect(result.method).toBe('token');
112
+ expect(result.token).toBe('gh-test-token');
113
+ delete process.env.GH_TOKEN;
114
+ });
115
+ it('should resolve GITLAB_TOKEN for GitLab', async () => {
116
+ process.env.GITLAB_TOKEN = 'gl-test-token';
117
+ const result = await resolveGitAuth('https://gitlab.com/team/repo');
118
+ expect(result.method).toBe('token');
119
+ expect(result.token).toBe('gl-test-token');
120
+ delete process.env.GITLAB_TOKEN;
121
+ });
122
+ it('should resolve BITBUCKET_TOKEN for Bitbucket', async () => {
123
+ process.env.BITBUCKET_TOKEN = 'bb-test-token';
124
+ const result = await resolveGitAuth('https://bitbucket.org/team/repo');
125
+ expect(result.method).toBe('token');
126
+ expect(result.token).toBe('bb-test-token');
127
+ delete process.env.BITBUCKET_TOKEN;
128
+ });
129
+ it('should resolve GIT_TOKEN as fallback for custom hosts', async () => {
130
+ process.env.GIT_TOKEN = 'generic-token';
131
+ const result = await resolveGitAuth('https://git.company.com/team/repo');
132
+ expect(result.method).toBe('token');
133
+ expect(result.token).toBe('generic-token');
134
+ delete process.env.GIT_TOKEN;
135
+ });
136
+ it('should detect correct host type', async () => {
137
+ const github = await resolveGitAuth('https://github.com/owner/repo', 'tok');
138
+ expect(github.host).toBe('github');
139
+ const gitlab = await resolveGitAuth('https://gitlab.com/team/repo', 'tok');
140
+ expect(gitlab.host).toBe('gitlab');
141
+ const bitbucket = await resolveGitAuth('https://bitbucket.org/team/repo', 'tok');
142
+ expect(bitbucket.host).toBe('bitbucket');
143
+ const custom = await resolveGitAuth('https://git.company.com/team/repo', 'tok');
144
+ expect(custom.host).toBe('custom');
145
+ });
146
+ it('should return none when no auth available', async () => {
147
+ // Clear all possible tokens
148
+ delete process.env.GH_TOKEN;
149
+ delete process.env.GITHUB_TOKEN;
150
+ delete process.env.GIT_TOKEN;
151
+ delete process.env.GITLAB_TOKEN;
152
+ delete process.env.GL_TOKEN;
153
+ delete process.env.BITBUCKET_TOKEN;
154
+ delete process.env.BB_TOKEN;
155
+ const result = await resolveGitAuth('https://git.example.com/team/repo');
156
+ // Could be 'none', 'ssh', or 'credential-helper' depending on machine
157
+ expect(['none', 'ssh', 'credential-helper', 'netrc']).toContain(result.method);
158
+ }, 15000); // Increased timeout for credential helper probing
159
+ });
160
+ //# sourceMappingURL=git-auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-auth.test.js","sourceRoot":"","sources":["../../src/__tests__/git-auth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for skill-lock.ts
3
+ *
4
+ * Validates the expanded SourceType union and lock file operations
5
+ * with the new source types (bitbucket, npm, private-git)
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=skill-lock.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-lock.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/skill-lock.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Tests for skill-lock.ts
3
+ *
4
+ * Validates the expanded SourceType union and lock file operations
5
+ * with the new source types (bitbucket, npm, private-git)
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { createLockEntry, } from '../core/skill-lock.js';
9
+ // ─── SourceType Expansion ────────────────────────────────────────────
10
+ describe('SourceType - Expanded Types', () => {
11
+ it('should accept all original source types', () => {
12
+ const types = ['database', 'github', 'gitlab', 'local'];
13
+ expect(types).toHaveLength(4);
14
+ });
15
+ it('should accept new source types', () => {
16
+ const types = ['bitbucket', 'npm', 'private-git'];
17
+ expect(types).toHaveLength(3);
18
+ });
19
+ it('should accept all source types together', () => {
20
+ const types = [
21
+ 'database', 'github', 'gitlab', 'bitbucket', 'npm', 'private-git', 'local',
22
+ ];
23
+ expect(types).toHaveLength(7);
24
+ });
25
+ });
26
+ // ─── Lock Entry Creation ─────────────────────────────────────────────
27
+ describe('createLockEntry - New Source Types', () => {
28
+ it('should create lock entry for Bitbucket source', () => {
29
+ const entry = createLockEntry({
30
+ name: 'my-skill',
31
+ scopedName: 'team/repo/my-skill',
32
+ source: 'https://bitbucket.org/team/repo.git',
33
+ sourceType: 'bitbucket',
34
+ version: 'abc123',
35
+ agents: ['cursor', 'claude'],
36
+ canonicalPath: '/path/to/skills',
37
+ isGlobal: false,
38
+ });
39
+ expect(entry.sourceType).toBe('bitbucket');
40
+ expect(entry.source).toBe('https://bitbucket.org/team/repo.git');
41
+ expect(entry.name).toBe('my-skill');
42
+ expect(entry.agents).toEqual(['cursor', 'claude']);
43
+ expect(entry.installedAt).toBeDefined();
44
+ });
45
+ it('should create lock entry for npm source', () => {
46
+ const entry = createLockEntry({
47
+ name: 'company-skills',
48
+ scopedName: 'npm:@company/skills/company-skills',
49
+ source: 'npm:@company/skills',
50
+ sourceType: 'npm',
51
+ version: '1.2.3',
52
+ agents: ['cursor'],
53
+ canonicalPath: '/path/to/skills',
54
+ isGlobal: true,
55
+ });
56
+ expect(entry.sourceType).toBe('npm');
57
+ expect(entry.source).toBe('npm:@company/skills');
58
+ expect(entry.version).toBe('1.2.3');
59
+ expect(entry.isGlobal).toBe(true);
60
+ });
61
+ it('should create lock entry for private-git source', () => {
62
+ const entry = createLockEntry({
63
+ name: 'internal-skill',
64
+ scopedName: 'team/skills/internal-skill',
65
+ source: 'https://git.company.com/team/skills.git',
66
+ sourceType: 'private-git',
67
+ version: 'def456',
68
+ agents: ['claude'],
69
+ canonicalPath: '/path/to/skills',
70
+ isGlobal: false,
71
+ });
72
+ expect(entry.sourceType).toBe('private-git');
73
+ expect(entry.source).toContain('git.company.com');
74
+ });
75
+ it('should create lock entry for ssh private-git source', () => {
76
+ const entry = createLockEntry({
77
+ name: 'ssh-skill',
78
+ scopedName: 'team/repo/ssh-skill',
79
+ source: 'git@git.company.com:team/repo.git',
80
+ sourceType: 'private-git',
81
+ agents: ['cursor', 'claude'],
82
+ canonicalPath: '/path/to/skills',
83
+ isGlobal: false,
84
+ });
85
+ expect(entry.sourceType).toBe('private-git');
86
+ expect(entry.source).toContain('git@');
87
+ });
88
+ it('should include timestamp on creation', () => {
89
+ const before = new Date().toISOString();
90
+ const entry = createLockEntry({
91
+ name: 'test',
92
+ scopedName: 'test',
93
+ source: 'npm:test',
94
+ sourceType: 'npm',
95
+ agents: ['cursor'],
96
+ canonicalPath: '/tmp',
97
+ isGlobal: false,
98
+ });
99
+ const after = new Date().toISOString();
100
+ expect(entry.installedAt >= before).toBe(true);
101
+ expect(entry.installedAt <= after).toBe(true);
102
+ });
103
+ });
104
+ //# sourceMappingURL=skill-lock.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-lock.test.js","sourceRoot":"","sources":["../../src/__tests__/skill-lock.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
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
+ export {};
11
+ //# sourceMappingURL=skillsrc.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillsrc.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/skillsrc.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}