@skillctl/registry 0.2.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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/dist/fetch/concurrency.d.ts +2 -0
  3. package/dist/fetch/concurrency.d.ts.map +1 -0
  4. package/dist/fetch/concurrency.js +32 -0
  5. package/dist/fetch/concurrency.js.map +1 -0
  6. package/dist/fetch/https.d.ts +2 -0
  7. package/dist/fetch/https.d.ts.map +1 -0
  8. package/dist/fetch/https.js +24 -0
  9. package/dist/fetch/https.js.map +1 -0
  10. package/dist/fetch/tarball.d.ts +4 -0
  11. package/dist/fetch/tarball.d.ts.map +1 -0
  12. package/dist/fetch/tarball.js +28 -0
  13. package/dist/fetch/tarball.js.map +1 -0
  14. package/dist/frontmatter.d.ts +5 -0
  15. package/dist/frontmatter.d.ts.map +1 -0
  16. package/dist/frontmatter.js +31 -0
  17. package/dist/frontmatter.js.map +1 -0
  18. package/dist/index.d.ts +8 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +8 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/locate-skill.d.ts +7 -0
  23. package/dist/locate-skill.d.ts.map +1 -0
  24. package/dist/locate-skill.js +112 -0
  25. package/dist/locate-skill.js.map +1 -0
  26. package/dist/manager.d.ts +23 -0
  27. package/dist/manager.d.ts.map +1 -0
  28. package/dist/manager.js +139 -0
  29. package/dist/manager.js.map +1 -0
  30. package/dist/names.d.ts +2 -0
  31. package/dist/names.d.ts.map +1 -0
  32. package/dist/names.js +2 -0
  33. package/dist/names.js.map +1 -0
  34. package/dist/registry.d.ts +137 -0
  35. package/dist/registry.d.ts.map +1 -0
  36. package/dist/registry.js +758 -0
  37. package/dist/registry.js.map +1 -0
  38. package/dist/sources/github.d.ts +12 -0
  39. package/dist/sources/github.d.ts.map +1 -0
  40. package/dist/sources/github.js +102 -0
  41. package/dist/sources/github.js.map +1 -0
  42. package/dist/sources/local.d.ts +12 -0
  43. package/dist/sources/local.d.ts.map +1 -0
  44. package/dist/sources/local.js +39 -0
  45. package/dist/sources/local.js.map +1 -0
  46. package/dist/sources/npm.d.ts +12 -0
  47. package/dist/sources/npm.d.ts.map +1 -0
  48. package/dist/sources/npm.js +89 -0
  49. package/dist/sources/npm.js.map +1 -0
  50. package/dist/sources/skills-sh.d.ts +12 -0
  51. package/dist/sources/skills-sh.d.ts.map +1 -0
  52. package/dist/sources/skills-sh.js +27 -0
  53. package/dist/sources/skills-sh.js.map +1 -0
  54. package/dist/test/registry-resolution.test.d.ts +3 -0
  55. package/dist/test/registry-resolution.test.d.ts.map +1 -0
  56. package/dist/test/registry-resolution.test.js +101 -0
  57. package/dist/test/registry-resolution.test.js.map +1 -0
  58. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 skillctl contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export declare function limitedFetch<T>(fn: () => Promise<T>): Promise<T>;
2
+ //# sourceMappingURL=concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/fetch/concurrency.ts"],"names":[],"mappings":"AA0BA,wBAAsB,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEtE"}
@@ -0,0 +1,32 @@
1
+ const MAX_PARALLEL = Math.max(1, Math.min(16, parseInt(process.env.SKILLCTL_PARALLEL || '6', 10) || 6));
2
+ function createConcurrencyLimiter(maxConcurrent) {
3
+ let active = 0;
4
+ const queue = [];
5
+ return (fn) => {
6
+ return new Promise((resolve, reject) => {
7
+ const run = async () => {
8
+ active++;
9
+ try {
10
+ resolve(await fn());
11
+ }
12
+ catch (e) {
13
+ reject(e);
14
+ }
15
+ finally {
16
+ active--;
17
+ if (queue.length > 0)
18
+ queue.shift()();
19
+ }
20
+ };
21
+ if (active < maxConcurrent)
22
+ run();
23
+ else
24
+ queue.push(run);
25
+ });
26
+ };
27
+ }
28
+ const fetchLimiter = createConcurrencyLimiter(MAX_PARALLEL);
29
+ export async function limitedFetch(fn) {
30
+ return fetchLimiter(fn);
31
+ }
32
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/fetch/concurrency.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAExG,SAAS,wBAAwB,CAAC,aAAqB;IACrD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,OAAO,CAAI,EAAoB,EAAc,EAAE;QAC7C,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;gBACrB,MAAM,EAAE,CAAC;gBACT,IAAI,CAAC;oBACH,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACtB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,CAAC,CAAC,CAAC;gBACZ,CAAC;wBAAS,CAAC;oBACT,MAAM,EAAE,CAAC;oBACT,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;wBAAE,KAAK,CAAC,KAAK,EAAG,EAAE,CAAC;gBACzC,CAAC;YACH,CAAC,CAAC;YACF,IAAI,MAAM,GAAG,aAAa;gBAAE,GAAG,EAAE,CAAC;;gBAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,EAAoB;IACxD,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function httpsGet(url: string, headers?: Record<string, string>): Promise<Buffer>;
2
+ //# sourceMappingURL=https.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"https.d.ts","sourceRoot":"","sources":["../../src/fetch/https.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB3F"}
@@ -0,0 +1,24 @@
1
+ import https from 'node:https';
2
+ export function httpsGet(url, headers = {}) {
3
+ return new Promise((resolve, reject) => {
4
+ const req = https.get(url, { headers: { 'User-Agent': 'skillctl/0.2.0', ...headers } }, (res) => {
5
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
6
+ httpsGet(res.headers.location, headers).then(resolve).catch(reject);
7
+ return;
8
+ }
9
+ if (res.statusCode !== 200) {
10
+ reject(new Error(`HTTP ${res.statusCode} for ${url}`));
11
+ return;
12
+ }
13
+ const chunks = [];
14
+ res.on('data', (c) => chunks.push(c));
15
+ res.on('end', () => resolve(Buffer.concat(chunks)));
16
+ });
17
+ req.on('error', reject);
18
+ req.setTimeout(30000, () => {
19
+ req.destroy();
20
+ reject(new Error('timeout'));
21
+ });
22
+ });
23
+ }
24
+ //# sourceMappingURL=https.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"https.js","sourceRoot":"","sources":["../../src/fetch/https.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,UAAkC,EAAE;IACxE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9F,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5F,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,UAAU,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE;YACzB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function computeSha1(buf: Buffer): string;
2
+ export declare function fetchCachedBuffer(key: string, url: string, headers?: Record<string, string>): Promise<Buffer>;
3
+ export declare function extractTarball(buf: Buffer, dest: string, strip?: number): Promise<void>;
4
+ //# sourceMappingURL=tarball.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tarball.d.ts","sourceRoot":"","sources":["../../src/fetch/tarball.ts"],"names":[],"mappings":"AAQA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAUnH;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF"}
@@ -0,0 +1,28 @@
1
+ import { readFile, writeFile, rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { createHash } from 'node:crypto';
5
+ import * as tar from 'tar';
6
+ import { getCachedDownload, putCachedDownload } from '@skillctl/core';
7
+ import { httpsGet } from './https.js';
8
+ export function computeSha1(buf) {
9
+ return createHash('sha1').update(buf).digest('hex');
10
+ }
11
+ export async function fetchCachedBuffer(key, url, headers) {
12
+ const cached = await getCachedDownload(key);
13
+ if (cached)
14
+ return readFile(cached);
15
+ const buf = await httpsGet(url, headers);
16
+ const tmp = join(tmpdir(), `dl-${Date.now()}.tgz`);
17
+ await writeFile(tmp, buf);
18
+ await putCachedDownload(key, tmp).catch(() => { });
19
+ await rm(tmp, { force: true }).catch(() => { });
20
+ return buf;
21
+ }
22
+ export async function extractTarball(buf, dest, strip = 1) {
23
+ const tarTmp = `${dest}.tar.gz`;
24
+ await writeFile(tarTmp, buf);
25
+ await tar.extract({ file: tarTmp, cwd: dest, strip });
26
+ await rm(tarTmp, { force: true });
27
+ }
28
+ //# sourceMappingURL=tarball.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tarball.js","sourceRoot":"","sources":["../../src/fetch/tarball.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,GAAW,EAAE,OAAgC;IAChG,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAAY,EAAE,KAAK,GAAG,CAAC;IACvE,MAAM,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;IAChC,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function parseSkillFrontmatterAsync(skillDir: string): Promise<{
2
+ name?: string;
3
+ description?: string;
4
+ }>;
5
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAQA,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBnH"}
@@ -0,0 +1,31 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join, basename } from 'node:path';
3
+ function extractDesc(yaml) {
4
+ const m = yaml.match(/(?:^|\n)\s*description:\s*["']?([^"'\n]+)/i);
5
+ return m ? m[1].trim() : undefined;
6
+ }
7
+ export async function parseSkillFrontmatterAsync(skillDir) {
8
+ const candidates = ['SKILL.md', 'skill.md'];
9
+ for (const f of candidates) {
10
+ const p = join(skillDir, f);
11
+ try {
12
+ const content = await readFile(p, 'utf8');
13
+ const match = content.match(/^---\s*[\r\n]+([\s\S]*?)[\r\n]+---/);
14
+ if (match?.[1]) {
15
+ const yamlLike = match[1];
16
+ const nameMatch = yamlLike.match(/(?:^|\n)\s*name:\s*["']?([^"'\n#]+)["']?/i);
17
+ if (nameMatch) {
18
+ return { name: nameMatch[1].trim(), description: extractDesc(yamlLike) };
19
+ }
20
+ }
21
+ const looseName = content.match(/name:\s*["']?([^"'\n]+)/i);
22
+ if (looseName)
23
+ return { name: looseName[1].trim() };
24
+ }
25
+ catch {
26
+ // continue
27
+ }
28
+ }
29
+ return { name: basename(skillDir) };
30
+ }
31
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,QAAgB;IAC/D,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAClE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC9E,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3E,CAAC;YACH,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC5D,IAAI,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { RegistryManager } from './manager.js';
2
+ export { LocalSource } from './sources/local.js';
3
+ export { GitHubSource } from './sources/github.js';
4
+ export { NpmSource } from './sources/npm.js';
5
+ export { SkillsShSource } from './sources/skills-sh.js';
6
+ export { canonicalizeName } from './names.js';
7
+ export { parseSkillFrontmatterAsync } from './frontmatter.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { RegistryManager } from './manager.js';
2
+ export { LocalSource } from './sources/local.js';
3
+ export { GitHubSource } from './sources/github.js';
4
+ export { NpmSource } from './sources/npm.js';
5
+ export { SkillsShSource } from './sources/skills-sh.js';
6
+ export { canonicalizeName } from './names.js';
7
+ export { parseSkillFrontmatterAsync } from './frontmatter.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function hasSkillMd(d: string): Promise<boolean>;
2
+ export declare function findFirstSkillMd(dir: string, maxDepth: number, depth?: number): Promise<string | null>;
3
+ export declare function locateSkillDir(root: string, options?: {
4
+ packageJsonHints?: string[];
5
+ }): Promise<string>;
6
+ export declare function packageJsonSkillHints(extractedRoot: string): Promise<string[]>;
7
+ //# sourceMappingURL=locate-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locate-skill.d.ts","sourceRoot":"","sources":["../src/locate-skill.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5D;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBvG;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACxC,OAAO,CAAC,MAAM,CAAC,CA8CjB;AAED,wBAAsB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBpF"}
@@ -0,0 +1,112 @@
1
+ import { readFile, readdir, stat } from 'node:fs/promises';
2
+ import { join, dirname, resolve as pathResolve } from 'node:path';
3
+ export async function hasSkillMd(d) {
4
+ for (const name of ['SKILL.md', 'skill.md']) {
5
+ try {
6
+ const st = await stat(join(d, name));
7
+ if (st.isFile())
8
+ return true;
9
+ }
10
+ catch {
11
+ // continue
12
+ }
13
+ }
14
+ return false;
15
+ }
16
+ export async function findFirstSkillMd(dir, maxDepth, depth = 0) {
17
+ if (depth > maxDepth)
18
+ return null;
19
+ try {
20
+ const ents = await readdir(dir, { withFileTypes: true });
21
+ for (const e of ents) {
22
+ const p = join(dir, e.name);
23
+ if (e.isFile() && (e.name === 'SKILL.md' || e.name === 'skill.md'))
24
+ return p;
25
+ if (e.isDirectory() && !e.name.startsWith('.')) {
26
+ const rec = await findFirstSkillMd(p, maxDepth, depth + 1);
27
+ if (rec)
28
+ return rec;
29
+ }
30
+ }
31
+ }
32
+ catch {
33
+ // ignore
34
+ }
35
+ return null;
36
+ }
37
+ export async function locateSkillDir(root, options) {
38
+ if (options?.packageJsonHints?.length) {
39
+ for (const h of options.packageJsonHints) {
40
+ const cand = pathResolve(root, h);
41
+ try {
42
+ const st = await stat(cand);
43
+ if (st.isDirectory() && (await hasSkillMd(cand)))
44
+ return cand;
45
+ }
46
+ catch {
47
+ // continue
48
+ }
49
+ }
50
+ }
51
+ if (await hasSkillMd(root))
52
+ return root;
53
+ const skillsSub = join(root, 'skills');
54
+ if (await hasSkillMd(skillsSub))
55
+ return skillsSub;
56
+ try {
57
+ const subs = await readdir(skillsSub, { withFileTypes: true });
58
+ for (const s of subs) {
59
+ if (s.isDirectory()) {
60
+ const subp = join(skillsSub, s.name);
61
+ if (await hasSkillMd(subp))
62
+ return subp;
63
+ }
64
+ }
65
+ }
66
+ catch {
67
+ // no skills dir
68
+ }
69
+ try {
70
+ const entries = await readdir(root, { withFileTypes: true });
71
+ for (const e of entries) {
72
+ if (e.isDirectory() && !e.name.startsWith('.')) {
73
+ const sub = join(root, e.name);
74
+ if (await hasSkillMd(sub))
75
+ return sub;
76
+ }
77
+ }
78
+ }
79
+ catch {
80
+ // ignore
81
+ }
82
+ const found = await findFirstSkillMd(root, 2);
83
+ if (found)
84
+ return dirname(found);
85
+ return root;
86
+ }
87
+ export async function packageJsonSkillHints(extractedRoot) {
88
+ const hints = [];
89
+ try {
90
+ const pkgRaw = await readFile(join(extractedRoot, 'package.json'), 'utf8');
91
+ const pkg = JSON.parse(pkgRaw);
92
+ if (pkg.agentSkills) {
93
+ if (typeof pkg.agentSkills === 'string')
94
+ hints.push(pkg.agentSkills);
95
+ else if (Array.isArray(pkg.agentSkills.skills))
96
+ hints.push(...pkg.agentSkills.skills);
97
+ else if (Array.isArray(pkg.agentSkills))
98
+ hints.push(...pkg.agentSkills);
99
+ }
100
+ if (pkg.skills) {
101
+ if (typeof pkg.skills === 'string')
102
+ hints.push(pkg.skills);
103
+ else if (Array.isArray(pkg.skills))
104
+ hints.push(...pkg.skills);
105
+ }
106
+ }
107
+ catch {
108
+ // no package.json
109
+ }
110
+ return hints;
111
+ }
112
+ //# sourceMappingURL=locate-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locate-skill.js","sourceRoot":"","sources":["../src/locate-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { LockfileEntry, ResolvedSource } from '@skillctl/core';
2
+ import type { RegistrySource } from '@skillctl/core';
3
+ export declare class RegistryManager {
4
+ private sources;
5
+ constructor();
6
+ register(source: RegistrySource): void;
7
+ getSources(): RegistrySource[];
8
+ resolve(spec: string, options?: {
9
+ ref?: string;
10
+ }): Promise<ResolvedSource>;
11
+ materialize(resolved: ResolvedSource, options?: {
12
+ name?: string;
13
+ }): Promise<{
14
+ canonicalPath: string;
15
+ integrity: string;
16
+ sourceType: string;
17
+ }>;
18
+ add(spec: string, opts?: {
19
+ cwd?: string;
20
+ updateManifest?: boolean;
21
+ }): Promise<LockfileEntry>;
22
+ }
23
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAiBhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAwB;;IASvC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAItC,UAAU,IAAI,cAAc,EAAE;IAIxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAiB1E,WAAW,CACf,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1B,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAmDtE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,aAAa,CAAC;CA8CvG"}
@@ -0,0 +1,139 @@
1
+ import { rm, cp, stat } from 'node:fs/promises';
2
+ import { join, sep } from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { loadConfig, ensureDir, computeDirIntegrity, getCachedSkill, putCachedSkill, ensureCacheDir, } from '@skillctl/core';
5
+ import { loadManifest, saveManifest } from '@skillctl/manifest';
6
+ import { loadLockfile, saveLockfile, createEmptyLockfile, addOrUpdateEntry, makeLockEntry } from '@skillctl/lockfile';
7
+ import { canonicalizeName } from './names.js';
8
+ import { limitedFetch } from './fetch/concurrency.js';
9
+ import { LocalSource } from './sources/local.js';
10
+ import { GitHubSource } from './sources/github.js';
11
+ import { NpmSource } from './sources/npm.js';
12
+ import { SkillsShSource } from './sources/skills-sh.js';
13
+ export class RegistryManager {
14
+ sources = [];
15
+ constructor() {
16
+ this.register(new NpmSource());
17
+ this.register(new SkillsShSource());
18
+ this.register(new GitHubSource());
19
+ this.register(new LocalSource());
20
+ }
21
+ register(source) {
22
+ this.sources.push(source);
23
+ }
24
+ getSources() {
25
+ return [...this.sources];
26
+ }
27
+ async resolve(spec, options) {
28
+ for (const src of this.sources) {
29
+ if (src.match(spec)) {
30
+ const res = await src.resolve(spec, options);
31
+ return { ...res, originalSpec: spec };
32
+ }
33
+ }
34
+ if (spec.includes('/') && !spec.includes(':')) {
35
+ const gh = new GitHubSource();
36
+ if (gh.match(spec)) {
37
+ const res = await gh.resolve(spec, options);
38
+ return { ...res, originalSpec: spec };
39
+ }
40
+ }
41
+ throw new Error(`No registry source matched spec: ${spec}. Supported: github:, npm:, skills.sh/, file:, ./local`);
42
+ }
43
+ async materialize(resolved, options) {
44
+ const config = await loadConfig();
45
+ const store = config.store;
46
+ await ensureDir(store);
47
+ const canonicalName = canonicalizeName(options?.name || resolved.name);
48
+ const target = join(store, canonicalName);
49
+ const tmpDest = join(tmpdir(), `skillctl-mat-${canonicalName}-${Date.now()}`);
50
+ await ensureDir(tmpDest);
51
+ try {
52
+ const source = this.sources.find((s) => s.id === resolved.sourceId);
53
+ if (!source)
54
+ throw new Error(`no source for materialize: ${resolved.sourceId}`);
55
+ await limitedFetch(() => source.fetch(resolved, tmpDest));
56
+ }
57
+ catch (err) {
58
+ await rm(tmpDest, { recursive: true, force: true }).catch(() => { });
59
+ throw err;
60
+ }
61
+ const treeIntegrity = await computeDirIntegrity(tmpDest);
62
+ await ensureCacheDir().catch(() => { });
63
+ const cached = await getCachedSkill(treeIntegrity);
64
+ let sourceForTarget = tmpDest;
65
+ if (cached) {
66
+ sourceForTarget = cached;
67
+ await rm(tmpDest, { recursive: true, force: true }).catch(() => { });
68
+ }
69
+ else {
70
+ await putCachedSkill(treeIntegrity, tmpDest).catch(() => { });
71
+ }
72
+ if (await exists(target)) {
73
+ await rm(target, { recursive: true, force: true });
74
+ }
75
+ try {
76
+ if (sourceForTarget === tmpDest) {
77
+ await (await import('node:fs/promises')).rename(sourceForTarget, target);
78
+ }
79
+ else {
80
+ await cp(sourceForTarget, target, { recursive: true, force: true });
81
+ }
82
+ }
83
+ catch {
84
+ await cp(sourceForTarget, target, { recursive: true, force: true });
85
+ if (sourceForTarget === tmpDest) {
86
+ await rm(sourceForTarget, { recursive: true, force: true });
87
+ }
88
+ }
89
+ return { canonicalPath: target, integrity: treeIntegrity, sourceType: resolved.sourceType };
90
+ }
91
+ async add(spec, opts = {}) {
92
+ const cwd = opts.cwd || process.cwd();
93
+ const resolved = await this.resolve(spec);
94
+ const mat = await this.materialize(resolved);
95
+ const prov = {
96
+ type: resolved.sourceType === 'skills.sh' ? 'skills.sh' : resolved.sourceType,
97
+ subpath: resolved.subpath,
98
+ };
99
+ if (resolved.sourceType === 'github' || resolved.sourceType === 'skills.sh') {
100
+ prov.commit = resolved.ref;
101
+ }
102
+ if (resolved.sourceType === 'npm') {
103
+ prov.tarballHash = resolved.tarballHash;
104
+ }
105
+ const entry = makeLockEntry(mat.canonicalPath.split(sep).pop(), resolved.originalSpec || spec, resolved.resolved, mat.integrity, mat.canonicalPath, prov);
106
+ let lock = (await loadLockfile(cwd)) || createEmptyLockfile();
107
+ lock = addOrUpdateEntry(lock, entry.name, entry);
108
+ await saveLockfile(lock, cwd);
109
+ if (opts.updateManifest) {
110
+ let manifest = await loadManifest(cwd);
111
+ if (manifest) {
112
+ if (!manifest.agentSkills)
113
+ manifest.agentSkills = { dependencies: {}, devDependencies: {} };
114
+ if (!manifest.agentSkills.dependencies)
115
+ manifest.agentSkills.dependencies = {};
116
+ let normSpec = spec;
117
+ if (!/^(github:|npm:|skills\.sh\/|file:)/.test(spec)) {
118
+ if (resolved.sourceType === 'github')
119
+ normSpec = `github:${spec}`;
120
+ else if (resolved.sourceType === 'npm')
121
+ normSpec = `npm:${spec}`;
122
+ }
123
+ manifest.agentSkills.dependencies[entry.name] = normSpec;
124
+ await saveManifest(manifest, cwd);
125
+ }
126
+ }
127
+ return entry;
128
+ }
129
+ }
130
+ async function exists(p) {
131
+ try {
132
+ await stat(p);
133
+ return true;
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ }
139
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EACL,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,MAAM,OAAO,eAAe;IAClB,OAAO,GAAqB,EAAE,CAAC;IAEvC;QACE,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,MAAsB;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAA0B;QACpD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC7C,OAAO,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACxC,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC5C,OAAO,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACxC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,wDAAwD,CAAC,CAAC;IACpH,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAAwB,EACxB,OAA2B;QAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QAEvB,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChF,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACpE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,eAAe,GAAG,OAAO,CAAC;QAE9B,IAAI,MAAM,EAAE,CAAC;YACX,eAAe,GAAG,MAAM,CAAC;YACzB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC;YACH,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;gBAChC,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAmD,EAAE;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAe;YACvB,IAAI,EAAE,QAAQ,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU;YAC7E,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC;QACF,IAAI,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;YAC5E,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC7B,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QAC1C,CAAC;QAED,MAAM,KAAK,GAAG,aAAa,CACzB,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,EACnC,QAAQ,CAAC,YAAY,IAAI,IAAI,EAC7B,QAAQ,CAAC,QAAQ,EACjB,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,aAAa,EACjB,IAAI,CACL,CAAC;QAEF,IAAI,IAAI,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,mBAAmB,EAAE,CAAC;QAC9D,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAE9B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,WAAW;oBAAE,QAAQ,CAAC,WAAW,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;gBAC5F,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY;oBAAE,QAAQ,CAAC,WAAW,CAAC,YAAY,GAAG,EAAE,CAAC;gBAC/E,IAAI,QAAQ,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrD,IAAI,QAAQ,CAAC,UAAU,KAAK,QAAQ;wBAAE,QAAQ,GAAG,UAAU,IAAI,EAAE,CAAC;yBAC7D,IAAI,QAAQ,CAAC,UAAU,KAAK,KAAK;wBAAE,QAAQ,GAAG,OAAO,IAAI,EAAE,CAAC;gBACnE,CAAC;gBACD,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;gBACzD,MAAM,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { canonicalizeName } from '@skillctl/core';
2
+ //# sourceMappingURL=names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/names.js ADDED
@@ -0,0 +1,2 @@
1
+ export { canonicalizeName } from '@skillctl/core';
2
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}