@skillctl/core 0.2.0 → 0.3.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.
- package/LICENSE +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/normalize-specifier.d.ts +17 -0
- package/dist/normalize-specifier.d.ts.map +1 -0
- package/dist/normalize-specifier.js +52 -0
- package/dist/normalize-specifier.js.map +1 -0
- package/dist/operations.d.ts +14 -4
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +46 -11
- package/dist/operations.js.map +1 -1
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +30 -1
- package/dist/paths.js.map +1 -1
- package/dist/portable-lock.d.ts +6 -0
- package/dist/portable-lock.d.ts.map +1 -0
- package/dist/portable-lock.js +41 -0
- package/dist/portable-lock.js.map +1 -0
- package/dist/specifiers.d.ts +5 -0
- package/dist/specifiers.d.ts.map +1 -0
- package/dist/specifiers.js +16 -0
- package/dist/specifiers.js.map +1 -0
- package/dist/test/normalize-specifier.test.d.ts +2 -0
- package/dist/test/normalize-specifier.test.d.ts.map +1 -0
- package/dist/test/normalize-specifier.test.js +64 -0
- package/dist/test/normalize-specifier.test.js.map +1 -0
- package/dist/test/operations.test.d.ts +2 -0
- package/dist/test/operations.test.d.ts.map +1 -0
- package/dist/test/operations.test.js +72 -0
- package/dist/test/operations.test.js.map +1 -0
- package/dist/test/portable-lock.test.d.ts +2 -0
- package/dist/test/portable-lock.test.d.ts.map +1 -0
- package/dist/test/portable-lock.test.js +32 -0
- package/dist/test/portable-lock.test.js.map +1 -0
- package/dist/types.d.ts +7 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
package/LICENSE
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -6,4 +6,7 @@ export * from './cache.js';
|
|
|
6
6
|
export * from './names.js';
|
|
7
7
|
export * from './paths.js';
|
|
8
8
|
export * from './operations.js';
|
|
9
|
+
export * from './specifiers.js';
|
|
10
|
+
export * from './normalize-specifier.js';
|
|
11
|
+
export * from './portable-lock.js';
|
|
9
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,4 +6,7 @@ export * from './cache.js';
|
|
|
6
6
|
export * from './names.js';
|
|
7
7
|
export * from './paths.js';
|
|
8
8
|
export * from './operations.js';
|
|
9
|
+
export * from './specifiers.js';
|
|
10
|
+
export * from './normalize-specifier.js';
|
|
11
|
+
export * from './portable-lock.js';
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ResolvedSource } from './types.js';
|
|
2
|
+
export interface NormalizeLocalSpecifierResult {
|
|
3
|
+
/** Portable specifier for manifest/lock */
|
|
4
|
+
portable: string;
|
|
5
|
+
/** Absolute path on disk for fetch/materialize */
|
|
6
|
+
absPath: string;
|
|
7
|
+
/** Skill name derived from the path */
|
|
8
|
+
name: string;
|
|
9
|
+
/** True when the path lies outside the project cwd */
|
|
10
|
+
outsideProject: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseLocalSpecifierPath(spec: string): string;
|
|
13
|
+
/** Normalize a local/file specifier to a portable form for manifest + lock. */
|
|
14
|
+
export declare function normalizeLocalSpecifier(spec: string, cwd: string): NormalizeLocalSpecifierResult;
|
|
15
|
+
/** Manifest/lock specifier after resolution (never stores machine-local absolute paths). */
|
|
16
|
+
export declare function portableSpecifierForResolved(spec: string, resolved: Pick<ResolvedSource, 'sourceType' | 'resolved'>, cwd: string): string;
|
|
17
|
+
//# sourceMappingURL=normalize-specifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-specifier.d.ts","sourceRoot":"","sources":["../src/normalize-specifier.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,6BAA6B;IAC5C,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,6BAA6B,CA4BhG;AAED,4FAA4F;AAC5F,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,UAAU,CAAC,EACzD,GAAG,EAAE,MAAM,GACV,MAAM,CASR"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { basename, isAbsolute, relative, resolve } from 'node:path';
|
|
2
|
+
import { canonicalizeName } from './names.js';
|
|
3
|
+
import { importedSpecifier, parseImportedSpecifier } from './specifiers.js';
|
|
4
|
+
export function parseLocalSpecifierPath(spec) {
|
|
5
|
+
let localPath = spec;
|
|
6
|
+
if (spec.startsWith('file:'))
|
|
7
|
+
localPath = spec.slice(5);
|
|
8
|
+
else if (spec.startsWith('local:'))
|
|
9
|
+
localPath = spec.slice(6);
|
|
10
|
+
return localPath;
|
|
11
|
+
}
|
|
12
|
+
/** Normalize a local/file specifier to a portable form for manifest + lock. */
|
|
13
|
+
export function normalizeLocalSpecifier(spec, cwd) {
|
|
14
|
+
const importedName = parseImportedSpecifier(spec);
|
|
15
|
+
if (importedName) {
|
|
16
|
+
return {
|
|
17
|
+
portable: importedSpecifier(importedName),
|
|
18
|
+
absPath: '',
|
|
19
|
+
name: importedName,
|
|
20
|
+
outsideProject: false,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const localPath = parseLocalSpecifierPath(spec);
|
|
24
|
+
const absPath = resolve(cwd, localPath);
|
|
25
|
+
const name = canonicalizeName(basename(absPath));
|
|
26
|
+
const rel = relative(cwd, absPath);
|
|
27
|
+
if (rel && !rel.startsWith('..') && !isAbsolute(rel)) {
|
|
28
|
+
const normalized = rel.replace(/\\/g, '/');
|
|
29
|
+
const portable = normalized.startsWith('.') ? `file:${normalized}` : `file:./${normalized}`;
|
|
30
|
+
return { portable, absPath, name, outsideProject: false };
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
portable: importedSpecifier(name),
|
|
34
|
+
absPath,
|
|
35
|
+
name,
|
|
36
|
+
outsideProject: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Manifest/lock specifier after resolution (never stores machine-local absolute paths). */
|
|
40
|
+
export function portableSpecifierForResolved(spec, resolved, cwd) {
|
|
41
|
+
if (resolved.sourceType === 'local') {
|
|
42
|
+
return normalizeLocalSpecifier(spec, cwd).portable;
|
|
43
|
+
}
|
|
44
|
+
if (!/^(github:|npm:|skills\.sh\/|file:|local:imported\/)/.test(spec)) {
|
|
45
|
+
if (resolved.sourceType === 'github')
|
|
46
|
+
return `github:${spec}`;
|
|
47
|
+
if (resolved.sourceType === 'npm')
|
|
48
|
+
return `npm:${spec}`;
|
|
49
|
+
}
|
|
50
|
+
return spec;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=normalize-specifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-specifier.js","sourceRoot":"","sources":["../src/normalize-specifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAc5E,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACnD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,GAAW;IAC/D,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC;YACzC,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,YAAY;YAClB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEnC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,UAAU,EAAE,CAAC;QAC5F,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC;QACjC,OAAO;QACP,IAAI;QACJ,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,4BAA4B,CAC1C,IAAY,EACZ,QAAyD,EACzD,GAAW;IAEX,IAAI,QAAQ,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QACpC,OAAO,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,qDAAqD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,IAAI,QAAQ,CAAC,UAAU,KAAK,QAAQ;YAAE,OAAO,UAAU,IAAI,EAAE,CAAC;QAC9D,IAAI,QAAQ,CAAC,UAAU,KAAK,KAAK;YAAE,OAAO,OAAO,IAAI,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/operations.d.ts
CHANGED
|
@@ -4,11 +4,21 @@ export interface InstallResult {
|
|
|
4
4
|
skipped: number;
|
|
5
5
|
lock: SkillLockfile;
|
|
6
6
|
}
|
|
7
|
-
|
|
8
|
-
export declare function
|
|
9
|
-
|
|
7
|
+
/** Resolve a lock entry canonicalPath to a real filesystem path (tilde, legacy absolute, or store fallback). */
|
|
8
|
+
export declare function resolveEntryCanonicalPath(entry: LockfileEntry, options?: {
|
|
9
|
+
store?: string;
|
|
10
|
+
}): Promise<string>;
|
|
11
|
+
export declare function needsInstall(entry: LockfileEntry, options?: {
|
|
12
|
+
store?: string;
|
|
13
|
+
}): Promise<boolean>;
|
|
14
|
+
export declare function verifyLockIntegrity(lock: SkillLockfile, options?: {
|
|
15
|
+
store?: string;
|
|
16
|
+
}): Promise<string[]>;
|
|
17
|
+
export declare function lockToSkillTargets(lock: SkillLockfile, options?: {
|
|
18
|
+
store?: string;
|
|
19
|
+
}): Promise<Array<{
|
|
10
20
|
name: string;
|
|
11
21
|
canonicalPath: string;
|
|
12
|
-
}
|
|
22
|
+
}>>;
|
|
13
23
|
export declare function purgeCanonical(name: string): Promise<void>;
|
|
14
24
|
//# sourceMappingURL=operations.d.ts.map
|
package/dist/operations.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM/D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;CACrB;AAOD,gHAAgH;AAChH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAavG;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAUzD;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE"}
|
package/dist/operations.js
CHANGED
|
@@ -1,30 +1,57 @@
|
|
|
1
1
|
import { stat } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
3
|
import { rm } from 'node:fs/promises';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
5
|
import { computeDirIntegrity } from './fs.js';
|
|
6
6
|
import { canonicalizeName } from './names.js';
|
|
7
|
-
|
|
7
|
+
import { resolveCanonicalPath } from './paths.js';
|
|
8
|
+
async function resolveStoreRoot(store) {
|
|
9
|
+
if (store)
|
|
10
|
+
return store;
|
|
11
|
+
return (await loadConfig()).store;
|
|
12
|
+
}
|
|
13
|
+
/** Resolve a lock entry canonicalPath to a real filesystem path (tilde, legacy absolute, or store fallback). */
|
|
14
|
+
export async function resolveEntryCanonicalPath(entry, options) {
|
|
15
|
+
const store = await resolveStoreRoot(options?.store);
|
|
16
|
+
const primary = resolveCanonicalPath(entry.canonicalPath, store);
|
|
8
17
|
try {
|
|
9
|
-
await stat(
|
|
18
|
+
await stat(primary);
|
|
19
|
+
return primary;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
const fallback = join(store, canonicalizeName(entry.name));
|
|
23
|
+
try {
|
|
24
|
+
await stat(fallback);
|
|
25
|
+
return fallback;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return primary;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function needsInstall(entry, options) {
|
|
33
|
+
const path = await resolveEntryCanonicalPath(entry, options);
|
|
34
|
+
try {
|
|
35
|
+
await stat(path);
|
|
10
36
|
}
|
|
11
37
|
catch {
|
|
12
38
|
return true;
|
|
13
39
|
}
|
|
14
40
|
try {
|
|
15
|
-
const integrity = await computeDirIntegrity(
|
|
41
|
+
const integrity = await computeDirIntegrity(path);
|
|
16
42
|
return integrity !== entry.integrity;
|
|
17
43
|
}
|
|
18
44
|
catch {
|
|
19
45
|
return true;
|
|
20
46
|
}
|
|
21
47
|
}
|
|
22
|
-
export async function verifyLockIntegrity(lock) {
|
|
48
|
+
export async function verifyLockIntegrity(lock, options) {
|
|
23
49
|
const errors = [];
|
|
24
50
|
for (const [name, entry] of Object.entries(lock.skills)) {
|
|
51
|
+
const path = await resolveEntryCanonicalPath(entry, options);
|
|
25
52
|
try {
|
|
26
|
-
await stat(
|
|
27
|
-
const integrity = await computeDirIntegrity(
|
|
53
|
+
await stat(path);
|
|
54
|
+
const integrity = await computeDirIntegrity(path);
|
|
28
55
|
if (integrity !== entry.integrity) {
|
|
29
56
|
errors.push(`${name}: integrity mismatch (expected ${entry.integrity.slice(0, 20)}...)`);
|
|
30
57
|
}
|
|
@@ -35,12 +62,20 @@ export async function verifyLockIntegrity(lock) {
|
|
|
35
62
|
}
|
|
36
63
|
return errors;
|
|
37
64
|
}
|
|
38
|
-
export function lockToSkillTargets(lock) {
|
|
39
|
-
|
|
65
|
+
export async function lockToSkillTargets(lock, options) {
|
|
66
|
+
const store = await resolveStoreRoot(options?.store);
|
|
67
|
+
const targets = [];
|
|
68
|
+
for (const entry of Object.values(lock.skills)) {
|
|
69
|
+
targets.push({
|
|
70
|
+
name: entry.name,
|
|
71
|
+
canonicalPath: await resolveEntryCanonicalPath(entry, { store }),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return targets;
|
|
40
75
|
}
|
|
41
76
|
export async function purgeCanonical(name) {
|
|
42
|
-
const
|
|
43
|
-
const p = join(
|
|
77
|
+
const config = await loadConfig();
|
|
78
|
+
const p = join(config.store, canonicalizeName(name));
|
|
44
79
|
await rm(p, { recursive: true, force: true }).catch(() => { });
|
|
45
80
|
}
|
|
46
81
|
//# sourceMappingURL=operations.js.map
|
package/dist/operations.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
/** Resolve adapter target base + skill name (project-relative or absolute global). */
|
|
2
2
|
export declare function resolveAdapterTarget(basePath: string, skillName: string, cwd?: string): string;
|
|
3
|
+
/** Expand a leading tilde to the user home directory. */
|
|
4
|
+
export declare function expandTilde(path: string): string;
|
|
5
|
+
/** Portable canonical store path for committable lockfiles. */
|
|
6
|
+
export declare function formatCanonicalPathForLock(skillName: string): string;
|
|
7
|
+
/** Resolve lock canonicalPath (tilde, legacy absolute, or store-relative) to a filesystem path. */
|
|
8
|
+
export declare function resolveCanonicalPath(canonicalPath: string, store?: string): string;
|
|
3
9
|
//# sourceMappingURL=paths.d.ts.map
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,MAAM,CAGrG;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AAID,+DAA+D;AAC/D,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,mGAAmG;AACnG,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAclF"}
|
package/dist/paths.js
CHANGED
|
@@ -1,7 +1,36 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { isAbsolute, join, normalize as pathNormalize } from 'node:path';
|
|
3
|
+
import { canonicalizeName } from './names.js';
|
|
2
4
|
/** Resolve adapter target base + skill name (project-relative or absolute global). */
|
|
3
5
|
export function resolveAdapterTarget(basePath, skillName, cwd = process.cwd()) {
|
|
4
6
|
const resolvedBase = basePath.startsWith('.') ? join(cwd, basePath) : basePath;
|
|
5
7
|
return join(resolvedBase, skillName);
|
|
6
8
|
}
|
|
9
|
+
/** Expand a leading tilde to the user home directory. */
|
|
10
|
+
export function expandTilde(path) {
|
|
11
|
+
if (path === '~')
|
|
12
|
+
return homedir();
|
|
13
|
+
if (path.startsWith('~/') || path.startsWith('~\\')) {
|
|
14
|
+
return join(homedir(), path.slice(2));
|
|
15
|
+
}
|
|
16
|
+
return path;
|
|
17
|
+
}
|
|
18
|
+
const PORTABLE_STORE_PREFIX = '~/.skillctl/skills/';
|
|
19
|
+
/** Portable canonical store path for committable lockfiles. */
|
|
20
|
+
export function formatCanonicalPathForLock(skillName) {
|
|
21
|
+
return `${PORTABLE_STORE_PREFIX}${canonicalizeName(skillName)}`;
|
|
22
|
+
}
|
|
23
|
+
/** Resolve lock canonicalPath (tilde, legacy absolute, or store-relative) to a filesystem path. */
|
|
24
|
+
export function resolveCanonicalPath(canonicalPath, store) {
|
|
25
|
+
const storeRoot = store ?? join(homedir(), '.skillctl', 'skills');
|
|
26
|
+
if (canonicalPath.startsWith(PORTABLE_STORE_PREFIX)) {
|
|
27
|
+
const name = canonicalPath.slice(PORTABLE_STORE_PREFIX.length);
|
|
28
|
+
return join(storeRoot, name);
|
|
29
|
+
}
|
|
30
|
+
const expanded = expandTilde(canonicalPath);
|
|
31
|
+
if (isAbsolute(expanded)) {
|
|
32
|
+
return pathNormalize(expanded);
|
|
33
|
+
}
|
|
34
|
+
return join(storeRoot, canonicalPath);
|
|
35
|
+
}
|
|
7
36
|
//# sourceMappingURL=paths.js.map
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,SAAiB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC3F,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/E,OAAO,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACnC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAEpD,+DAA+D;AAC/D,MAAM,UAAU,0BAA0B,CAAC,SAAiB;IAC1D,OAAO,GAAG,qBAAqB,GAAG,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,oBAAoB,CAAC,aAAqB,EAAE,KAAc;IACxE,MAAM,SAAS,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAElE,IAAI,aAAa,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SkillLockfile, SkillManifest } from './types.js';
|
|
2
|
+
export declare function isPortableCanonicalPath(path: string): boolean;
|
|
3
|
+
export declare function isPortableSpecifier(spec: string): boolean;
|
|
4
|
+
/** Detect machine-local paths in manifest/lock that should be rewritten for git portability. */
|
|
5
|
+
export declare function findPortablePathWarnings(lock: SkillLockfile, manifest?: SkillManifest | null): string[];
|
|
6
|
+
//# sourceMappingURL=portable-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-lock.d.ts","sourceRoot":"","sources":["../src/portable-lock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKzD;AAcD,gGAAgG;AAChG,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,GAC9B,MAAM,EAAE,CAiBV"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const PORTABLE_CANONICAL_PREFIX = '~/.skillctl/skills/';
|
|
2
|
+
export function isPortableCanonicalPath(path) {
|
|
3
|
+
return path.startsWith(PORTABLE_CANONICAL_PREFIX);
|
|
4
|
+
}
|
|
5
|
+
export function isPortableSpecifier(spec) {
|
|
6
|
+
if (/^(github:|skills\.sh\/|npm:)/.test(spec))
|
|
7
|
+
return true;
|
|
8
|
+
if (spec.startsWith('local:imported/'))
|
|
9
|
+
return true;
|
|
10
|
+
if (spec.startsWith('file:./') || spec.startsWith('file:../'))
|
|
11
|
+
return true;
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
function checkEntry(name, field, value, warnings) {
|
|
15
|
+
if (field === 'canonicalPath') {
|
|
16
|
+
if (!isPortableCanonicalPath(value)) {
|
|
17
|
+
warnings.push(`${name}: lock ${field} is not portable (${value}) — run skillctl install to rewrite`);
|
|
18
|
+
}
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!isPortableSpecifier(value)) {
|
|
22
|
+
warnings.push(`${name}: lock ${field} is not portable (${value}) — run skillctl install to rewrite`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Detect machine-local paths in manifest/lock that should be rewritten for git portability. */
|
|
26
|
+
export function findPortablePathWarnings(lock, manifest) {
|
|
27
|
+
const warnings = [];
|
|
28
|
+
for (const [name, entry] of Object.entries(lock.skills)) {
|
|
29
|
+
checkEntry(name, 'specifier', entry.specifier, warnings);
|
|
30
|
+
checkEntry(name, 'resolved', entry.resolved, warnings);
|
|
31
|
+
checkEntry(name, 'canonicalPath', entry.canonicalPath, warnings);
|
|
32
|
+
}
|
|
33
|
+
const deps = manifest?.agentSkills?.dependencies || {};
|
|
34
|
+
for (const [name, spec] of Object.entries(deps)) {
|
|
35
|
+
if (!isPortableSpecifier(spec)) {
|
|
36
|
+
warnings.push(`${name}: manifest specifier is not portable (${spec}) — run skillctl add/install to rewrite`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return warnings;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=portable-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-lock.js","sourceRoot":"","sources":["../src/portable-lock.ts"],"names":[],"mappings":"AAEA,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAExD,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa,EAAE,QAAkB;IAChF,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;QAC9B,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,qBAAqB,KAAK,qCAAqC,CAAC,CAAC;QACvG,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,qBAAqB,KAAK,qCAAqC,CAAC,CAAC;IACvG,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,wBAAwB,CACtC,IAAmB,EACnB,QAA+B;IAE/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzD,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACvD,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,EAAE,WAAW,EAAE,YAAY,IAAI,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,yCAAyC,IAAI,yCAAyC,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Manifest specifier for skills migrated into the canonical store. */
|
|
2
|
+
export declare function importedSpecifier(name: string): string;
|
|
3
|
+
export declare function isImportedSpecifier(spec: string): boolean;
|
|
4
|
+
export declare function parseImportedSpecifier(spec: string): string | null;
|
|
5
|
+
//# sourceMappingURL=specifiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specifiers.d.ts","sourceRoot":"","sources":["../src/specifiers.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { canonicalizeName } from './names.js';
|
|
2
|
+
/** Manifest specifier for skills migrated into the canonical store. */
|
|
3
|
+
export function importedSpecifier(name) {
|
|
4
|
+
return `local:imported/${canonicalizeName(name)}`;
|
|
5
|
+
}
|
|
6
|
+
const IMPORTED_PREFIX = 'local:imported/';
|
|
7
|
+
export function isImportedSpecifier(spec) {
|
|
8
|
+
return spec.startsWith(IMPORTED_PREFIX);
|
|
9
|
+
}
|
|
10
|
+
export function parseImportedSpecifier(spec) {
|
|
11
|
+
if (!isImportedSpecifier(spec))
|
|
12
|
+
return null;
|
|
13
|
+
const name = spec.slice(IMPORTED_PREFIX.length);
|
|
14
|
+
return name ? canonicalizeName(name) : null;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=specifiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specifiers.js","sourceRoot":"","sources":["../src/specifiers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,kBAAkB,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-specifier.test.d.ts","sourceRoot":"","sources":["../../src/test/normalize-specifier.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { normalizeLocalSpecifier, portableSpecifierForResolved, formatCanonicalPathForLock, expandTilde, } from '../index.js';
|
|
7
|
+
test('normalizeLocalSpecifier keeps file:./ in project', async () => {
|
|
8
|
+
const root = await mkdtemp(join(tmpdir(), 'norm-spec-'));
|
|
9
|
+
try {
|
|
10
|
+
const skillDir = join(root, 'some-skill');
|
|
11
|
+
await mkdir(skillDir, { recursive: true });
|
|
12
|
+
await writeFile(join(skillDir, 'SKILL.md'), '---\nname: some-skill\n---\n');
|
|
13
|
+
const rel = normalizeLocalSpecifier('file:./some-skill', root);
|
|
14
|
+
assert.equal(rel.portable, 'file:./some-skill');
|
|
15
|
+
assert.equal(rel.outsideProject, false);
|
|
16
|
+
assert.ok(rel.absPath.endsWith('some-skill'));
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
await rm(root, { recursive: true, force: true });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
test('normalizeLocalSpecifier rewrites abs-in-project to file:./', async () => {
|
|
23
|
+
const root = await mkdtemp(join(tmpdir(), 'norm-spec-'));
|
|
24
|
+
try {
|
|
25
|
+
const skillDir = join(root, 'some-skill');
|
|
26
|
+
await mkdir(skillDir, { recursive: true });
|
|
27
|
+
await writeFile(join(skillDir, 'SKILL.md'), '---\nname: some-skill\n---\n');
|
|
28
|
+
const absInProject = normalizeLocalSpecifier(`file:${skillDir}`, root);
|
|
29
|
+
assert.equal(absInProject.portable, 'file:./some-skill');
|
|
30
|
+
assert.equal(absInProject.outsideProject, false);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
await rm(root, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
test('normalizeLocalSpecifier maps outside-project to local:imported', async () => {
|
|
37
|
+
const root = await mkdtemp(join(tmpdir(), 'norm-spec-'));
|
|
38
|
+
const outsideParent = await mkdtemp(join(tmpdir(), 'outside-parent-'));
|
|
39
|
+
const outside = join(outsideParent, 'outside');
|
|
40
|
+
try {
|
|
41
|
+
await mkdir(outside, { recursive: true });
|
|
42
|
+
await writeFile(join(outside, 'SKILL.md'), '---\nname: outside\n---\n');
|
|
43
|
+
const out = normalizeLocalSpecifier(`file:${outside}`, root);
|
|
44
|
+
assert.equal(out.portable, 'local:imported/outside');
|
|
45
|
+
assert.equal(out.outsideProject, true);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await rm(root, { recursive: true, force: true });
|
|
49
|
+
await rm(outsideParent, { recursive: true, force: true });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
test('normalizeLocalSpecifier preserves local:imported', () => {
|
|
53
|
+
const imported = normalizeLocalSpecifier('local:imported/my-skill', '/tmp');
|
|
54
|
+
assert.equal(imported.portable, 'local:imported/my-skill');
|
|
55
|
+
});
|
|
56
|
+
test('portableSpecifierForResolved adds github: prefix', () => {
|
|
57
|
+
const remote = portableSpecifierForResolved('acme/demo', { sourceType: 'github', resolved: 'github:acme/demo@HEAD' }, '/tmp');
|
|
58
|
+
assert.equal(remote, 'github:acme/demo');
|
|
59
|
+
});
|
|
60
|
+
test('formatCanonicalPathForLock and expandTilde', () => {
|
|
61
|
+
assert.equal(formatCanonicalPathForLock('My Skill'), '~/.skillctl/skills/my-skill');
|
|
62
|
+
assert.ok(expandTilde('~/.skillctl/skills/foo').includes('.skillctl'));
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=normalize-specifier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-specifier.test.js","sourceRoot":"","sources":["../../src/test/normalize-specifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.test.d.ts","sourceRoot":"","sources":["../../src/test/operations.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { resolveCanonicalPath, formatCanonicalPathForLock, needsInstall, lockToSkillTargets, resolveEntryCanonicalPath, computeDirIntegrity, } from '../index.js';
|
|
8
|
+
function makeEntry(overrides) {
|
|
9
|
+
return {
|
|
10
|
+
specifier: 'file:./skill',
|
|
11
|
+
resolved: 'file:./skill',
|
|
12
|
+
integrity: 'sha256:placeholder',
|
|
13
|
+
canonicalPath: formatCanonicalPathForLock(overrides.name),
|
|
14
|
+
fetchedAt: new Date().toISOString(),
|
|
15
|
+
provenance: { type: 'local' },
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
test('resolveCanonicalPath expands portable tilde store paths', () => {
|
|
20
|
+
const customStore = join(homedir(), 'custom-skill-store');
|
|
21
|
+
const portable = formatCanonicalPathForLock('demo-skill');
|
|
22
|
+
const resolved = resolveCanonicalPath(portable, customStore);
|
|
23
|
+
assert.equal(resolved, join(customStore, 'demo-skill'));
|
|
24
|
+
});
|
|
25
|
+
test('resolveCanonicalPath keeps legacy absolute paths', () => {
|
|
26
|
+
const legacy = join(homedir(), '.skillctl', 'skills', 'legacy-skill');
|
|
27
|
+
assert.equal(resolveCanonicalPath(legacy), legacy);
|
|
28
|
+
});
|
|
29
|
+
test('resolveEntryCanonicalPath falls back to store/name for legacy absolute lock paths', async () => {
|
|
30
|
+
const store = await mkdtemp(join(tmpdir(), 'skillctl-store-'));
|
|
31
|
+
const skillName = 'legacy-fallback';
|
|
32
|
+
const skillDir = join(store, skillName);
|
|
33
|
+
try {
|
|
34
|
+
await mkdir(skillDir, { recursive: true });
|
|
35
|
+
await writeFile(join(skillDir, 'SKILL.md'), '---\nname: legacy-fallback\n---\n');
|
|
36
|
+
const otherMachinePath = join(homedir(), 'other-machine', '.skillctl', 'skills', skillName);
|
|
37
|
+
const entry = makeEntry({
|
|
38
|
+
name: skillName,
|
|
39
|
+
canonicalPath: otherMachinePath,
|
|
40
|
+
integrity: await computeDirIntegrity(skillDir),
|
|
41
|
+
});
|
|
42
|
+
const resolved = await resolveEntryCanonicalPath(entry, { store });
|
|
43
|
+
assert.equal(resolved, skillDir);
|
|
44
|
+
assert.equal(await needsInstall(entry, { store }), false);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
await rm(store, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
test('lockToSkillTargets returns filesystem paths from portable lock entries', async () => {
|
|
51
|
+
const store = await mkdtemp(join(tmpdir(), 'skillctl-store-'));
|
|
52
|
+
const skillName = 'sync-target';
|
|
53
|
+
const skillDir = join(store, skillName);
|
|
54
|
+
try {
|
|
55
|
+
await mkdir(skillDir, { recursive: true });
|
|
56
|
+
await writeFile(join(skillDir, 'SKILL.md'), '---\nname: sync-target\n---\n');
|
|
57
|
+
const integrity = await computeDirIntegrity(skillDir);
|
|
58
|
+
const lock = {
|
|
59
|
+
lockfileVersion: '1.0',
|
|
60
|
+
skills: {
|
|
61
|
+
[skillName]: makeEntry({ name: skillName, integrity }),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
const targets = await lockToSkillTargets(lock, { store });
|
|
65
|
+
assert.equal(targets.length, 1);
|
|
66
|
+
assert.equal(targets[0].canonicalPath, skillDir);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await rm(store, { recursive: true, force: true });
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=operations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.test.js","sourceRoot":"","sources":["../../src/test/operations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-lock.test.d.ts","sourceRoot":"","sources":["../../src/test/portable-lock.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { isPortableSpecifier, isPortableCanonicalPath, findPortablePathWarnings, formatCanonicalPathForLock, } from '../index.js';
|
|
4
|
+
test('isPortableSpecifier accepts remote and project-relative forms', () => {
|
|
5
|
+
assert.equal(isPortableSpecifier('github:foo/bar'), true);
|
|
6
|
+
assert.equal(isPortableSpecifier('file:./skills/foo'), true);
|
|
7
|
+
assert.equal(isPortableSpecifier('local:imported/my-skill'), true);
|
|
8
|
+
assert.equal(isPortableSpecifier('file:/Users/me/skill'), false);
|
|
9
|
+
assert.equal(isPortableSpecifier('local:/Users/me/skill'), false);
|
|
10
|
+
});
|
|
11
|
+
test('isPortableCanonicalPath accepts tilde store paths only', () => {
|
|
12
|
+
assert.equal(isPortableCanonicalPath(formatCanonicalPathForLock('demo')), true);
|
|
13
|
+
assert.equal(isPortableCanonicalPath('/Users/me/.skillctl/skills/demo'), false);
|
|
14
|
+
});
|
|
15
|
+
test('findPortablePathWarnings flags legacy lock entries', () => {
|
|
16
|
+
const warnings = findPortablePathWarnings({
|
|
17
|
+
lockfileVersion: '1.0',
|
|
18
|
+
skills: {
|
|
19
|
+
demo: {
|
|
20
|
+
specifier: 'file:/Users/me/project/skill',
|
|
21
|
+
resolved: 'local:/Users/me/project/skill',
|
|
22
|
+
integrity: 'sha256:abc',
|
|
23
|
+
name: 'demo',
|
|
24
|
+
canonicalPath: '/Users/me/.skillctl/skills/demo',
|
|
25
|
+
fetchedAt: '2026-01-01T00:00:00.000Z',
|
|
26
|
+
provenance: { type: 'local' },
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
assert.equal(warnings.length, 3);
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=portable-lock.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portable-lock.test.js","sourceRoot":"","sources":["../../src/test/portable-lock.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChF,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,iCAAiC,CAAC,EAAE,KAAK,CAAC,CAAC;AAClF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QACxC,eAAe,EAAE,KAAK;QACtB,MAAM,EAAE;YACN,IAAI,EAAE;gBACJ,SAAS,EAAE,8BAA8B;gBACzC,QAAQ,EAAE,+BAA+B;gBACzC,SAAS,EAAE,YAAY;gBACvB,IAAI,EAAE,MAAM;gBACZ,aAAa,EAAE,iCAAiC;gBAChD,SAAS,EAAE,0BAA0B;gBACrC,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aAC9B;SACF;KACF,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -21,9 +21,11 @@ export interface Provenance {
|
|
|
21
21
|
commit?: string;
|
|
22
22
|
tarballHash?: string;
|
|
23
23
|
subpath?: string;
|
|
24
|
-
migratedFrom?: 'npx' | 'python-skillctl';
|
|
24
|
+
migratedFrom?: 'npx' | 'python-skillctl' | 'project-scan';
|
|
25
25
|
originalHash?: string;
|
|
26
26
|
originalSource?: string;
|
|
27
|
+
originalPath?: string;
|
|
28
|
+
adapter?: string;
|
|
27
29
|
signature?: string;
|
|
28
30
|
}
|
|
29
31
|
export interface AgentAdapter {
|
|
@@ -32,7 +34,9 @@ export interface AgentAdapter {
|
|
|
32
34
|
readonly projectPaths: string[];
|
|
33
35
|
readonly globalPaths: string[];
|
|
34
36
|
detect(): Promise<boolean>;
|
|
35
|
-
ensureTarget(skillName: string, targetPath: string, canonical: string, mode
|
|
37
|
+
ensureTarget(skillName: string, targetPath: string, canonical: string, mode?: 'symlink' | 'copy' | 'junction', options?: {
|
|
38
|
+
relative?: boolean;
|
|
39
|
+
}): Promise<void>;
|
|
36
40
|
removeTarget(skillName: string, targetPath: string): Promise<void>;
|
|
37
41
|
}
|
|
38
42
|
export interface RegistrySource {
|
|
@@ -40,6 +44,7 @@ export interface RegistrySource {
|
|
|
40
44
|
match(spec: string): boolean;
|
|
41
45
|
resolve(spec: string, options?: {
|
|
42
46
|
ref?: string;
|
|
47
|
+
cwd?: string;
|
|
43
48
|
}): Promise<ResolvedSource>;
|
|
44
49
|
fetch(resolved: ResolvedSource, dest: string): Promise<{
|
|
45
50
|
integrity: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,KAAK,GAAG,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAuHH,4EAA4E;AAC5E,mFAAmF;AACnF,wEAAwE"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillctl/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Core types, config, and FS utilities for skillctl",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"author": "
|
|
6
|
+
"author": "xFurti & Gabry848",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "./dist/index.js",
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
@@ -34,6 +34,6 @@
|
|
|
34
34
|
"dev": "tsc -b --watch",
|
|
35
35
|
"clean": "rimraf dist",
|
|
36
36
|
"lint": "tsc --noEmit",
|
|
37
|
-
"test": "
|
|
37
|
+
"test": "node --test ./dist/test/*.test.js"
|
|
38
38
|
}
|
|
39
39
|
}
|