vskill 1.2.3 → 1.2.6
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/README.md +49 -1
- package/agents.json +6 -1
- package/dist/agents/agents-registry.d.ts +43 -16
- package/dist/agents/agents-registry.js +119 -33
- package/dist/agents/agents-registry.js.map +1 -1
- package/dist/agents/global-dirs.d.ts +19 -0
- package/dist/agents/global-dirs.js +53 -0
- package/dist/agents/global-dirs.js.map +1 -0
- package/dist/commands/add-github-bundle.d.ts +29 -0
- package/dist/commands/add-github-bundle.js +135 -0
- package/dist/commands/add-github-bundle.js.map +1 -0
- package/dist/commands/add-lockfile.d.ts +2 -0
- package/dist/commands/add-lockfile.js +1 -1
- package/dist/commands/add-lockfile.js.map +1 -1
- package/dist/commands/add.d.ts +0 -7
- package/dist/commands/add.js +197 -107
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/audit-webmcp.d.ts +25 -0
- package/dist/commands/audit-webmcp.js +167 -0
- package/dist/commands/audit-webmcp.js.map +1 -0
- package/dist/commands/doctor.d.ts +69 -0
- package/dist/commands/doctor.js +760 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/remove.js +43 -8
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/update.js +12 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/discovery/github-skill-bundle.d.ts +74 -0
- package/dist/discovery/github-skill-bundle.js +323 -0
- package/dist/discovery/github-skill-bundle.js.map +1 -0
- package/dist/eval/skill-scanner.js +7 -1
- package/dist/eval/skill-scanner.js.map +1 -1
- package/dist/eval-server/install-skill-routes.js +10 -3
- package/dist/eval-server/install-skill-routes.js.map +1 -1
- package/dist/eval-server/remove-skill-routes.js +262 -29
- package/dist/eval-server/remove-skill-routes.js.map +1 -1
- package/dist/eval-server/studio-privacy.js +2 -3
- package/dist/eval-server/studio-privacy.js.map +1 -1
- package/dist/eval-server/utils/scan-install-locations.js +22 -3
- package/dist/eval-server/utils/scan-install-locations.js.map +1 -1
- package/dist/eval-ui/assets/{AdvancedTab-CSWhj_MZ.js → AdvancedTab-6VlfqCuD.js} +1 -1
- package/dist/eval-ui/assets/{CreateSkillPage-lecFvrLO.js → CreateSkillPage-CXDd6gDN.js} +1 -1
- package/dist/eval-ui/assets/{FindSkillsPalette-Dtyd7VrA.js → FindSkillsPalette-DQ6uGhFP.js} +2 -2
- package/dist/eval-ui/assets/{GeneralTab-Gbc-K6UI.js → GeneralTab-BpFlJ2ue.js} +1 -1
- package/dist/eval-ui/assets/{PrivacyTab-BXCIX8cQ.js → PrivacyTab-UfO7QLy_.js} +1 -1
- package/dist/eval-ui/assets/{SearchPaletteCore-CneELTjb.js → SearchPaletteCore-DpHCf0mf.js} +1 -1
- package/dist/eval-ui/assets/{SkillDetailPanel-BMfMN6Wy.js → SkillDetailPanel-BjHFjGxg.js} +1 -1
- package/dist/eval-ui/assets/{UpdateDropdown-BlAAI6ah.js → UpdateDropdown-Cn4Vsq5d.js} +1 -1
- package/dist/eval-ui/assets/{UpdatesTab-BFGUaUtu.js → UpdatesTab-C38-n7V3.js} +1 -1
- package/dist/eval-ui/assets/globals-BWCNQsMa.css +1 -0
- package/dist/eval-ui/assets/globals-DmzftdEG.js +49 -0
- package/dist/eval-ui/assets/{index-DhhmQddr.js → index-DlQYQHDO.js} +1 -1
- package/dist/eval-ui/assets/{lifecycle-o_IRibOa.js → lifecycle-n00yue6r.js} +1 -1
- package/dist/eval-ui/assets/main-BmB7Zj9I.js +86 -0
- package/dist/eval-ui/assets/{preferences-D2BPT0OT.js → preferences-BN-jNWS0.js} +2 -2
- package/dist/eval-ui/assets/{useDesktopBridge-BKz-gcRg.js → useDesktopBridge-Cm4zPght.js} +1 -1
- package/dist/eval-ui/index.html +4 -4
- package/dist/eval-ui/lifecycle.html +3 -3
- package/dist/eval-ui/preferences.html +4 -4
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -1
- package/dist/installer/bundle-files.d.ts +39 -2
- package/dist/installer/bundle-files.js +80 -10
- package/dist/installer/bundle-files.js.map +1 -1
- package/dist/installer/canonical.d.ts +39 -4
- package/dist/installer/canonical.js +178 -24
- package/dist/installer/canonical.js.map +1 -1
- package/dist/installer/multi-install.d.ts +11 -2
- package/dist/installer/multi-install.js +41 -9
- package/dist/installer/multi-install.js.map +1 -1
- package/dist/installer/transformers/index.d.ts +8 -0
- package/dist/installer/yaml-safe-mutate.js +48 -2
- package/dist/installer/yaml-safe-mutate.js.map +1 -1
- package/dist/lib/github-fetch.js +2 -0
- package/dist/lib/github-fetch.js.map +1 -1
- package/dist/lib/private-source.d.ts +8 -0
- package/dist/lib/private-source.js +16 -2
- package/dist/lib/private-source.js.map +1 -1
- package/dist/webmcp/args.d.ts +34 -0
- package/dist/webmcp/args.js +87 -0
- package/dist/webmcp/args.js.map +1 -0
- package/dist/webmcp/attribution.d.ts +38 -0
- package/dist/webmcp/attribution.js +141 -0
- package/dist/webmcp/attribution.js.map +1 -0
- package/dist/webmcp/enumerate.d.ts +81 -0
- package/dist/webmcp/enumerate.js +436 -0
- package/dist/webmcp/enumerate.js.map +1 -0
- package/dist/webmcp/format.d.ts +9 -0
- package/dist/webmcp/format.js +105 -0
- package/dist/webmcp/format.js.map +1 -0
- package/dist/webmcp/merge.d.ts +49 -0
- package/dist/webmcp/merge.js +167 -0
- package/dist/webmcp/merge.js.map +1 -0
- package/dist/webmcp/score.d.ts +70 -0
- package/dist/webmcp/score.js +586 -0
- package/dist/webmcp/score.js.map +1 -0
- package/dist/webmcp/types.d.ts +92 -0
- package/dist/webmcp/types.js +8 -0
- package/dist/webmcp/types.js.map +1 -0
- package/package.json +6 -6
- package/dist/eval-ui/assets/globals-Dpf9KmYH.css +0 -1
- package/dist/eval-ui/assets/globals-hm1COkXX.js +0 -49
- package/dist/eval-ui/assets/main-DRhfwCeX.js +0 -86
|
@@ -1,4 +1,41 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
1
|
+
export interface BundlePathOptions {
|
|
2
|
+
/**
|
|
3
|
+
* 0894: accept any relative path inside the skill folder (sub-agents/,
|
|
4
|
+
* NOTICE.md, modes/x/README.md, ...), not only the standard folders. Used
|
|
5
|
+
* for complete skill trees fetched from the skill's own repository; the
|
|
6
|
+
* traversal and SKILL.md checks still apply.
|
|
7
|
+
*/
|
|
8
|
+
anyPath?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** 0894: bundle file content: text, or raw bytes for binaries (fonts, audio). */
|
|
11
|
+
export type BundleContent = string | Uint8Array;
|
|
12
|
+
export declare function assertSafeBundlePath(relPath: string, opts?: BundlePathOptions): string;
|
|
13
|
+
export declare function resolveBundleTarget(root: string, relPath: string, opts?: BundlePathOptions): string;
|
|
3
14
|
export declare function sanitizeSkillBundleFiles(files: unknown): Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* 0894: validate a complete skill tree fetched from GitHub for the CLI
|
|
17
|
+
* install path. Any safe relative path is accepted and binary content stays
|
|
18
|
+
* raw bytes. (Studio requests keep the stricter sanitizeSkillBundleFiles.)
|
|
19
|
+
*/
|
|
20
|
+
export declare function sanitizeInstallBundleFiles(files: Record<string, BundleContent>): Record<string, BundleContent>;
|
|
21
|
+
/**
|
|
22
|
+
* 0894: the subset of an install bundle that the string-only consumers
|
|
23
|
+
* (Tier-2 transformers, clipboard export) can carry: text files on the
|
|
24
|
+
* standard paths.
|
|
25
|
+
*/
|
|
26
|
+
export declare function textOnlyStandardBundle(files: Record<string, BundleContent>): Record<string, string>;
|
|
27
|
+
/** 0894: a local skill folder read for a Studio install. */
|
|
28
|
+
export interface LocalSkillBundle {
|
|
29
|
+
/** UTF-8 text files. */
|
|
30
|
+
files: Record<string, string>;
|
|
31
|
+
/** Everything that is not valid UTF-8, as raw bytes (never round-tripped through a string). */
|
|
32
|
+
binaryFiles: Record<string, Uint8Array>;
|
|
33
|
+
/** Paths with an exec bit in the source folder. */
|
|
34
|
+
executables: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare function collectSkillBundle(skillDir: string): Promise<LocalSkillBundle>;
|
|
37
|
+
/**
|
|
38
|
+
* Text files of a local skill folder. 0894: files that are not valid UTF-8
|
|
39
|
+
* are left out rather than corrupted (use collectSkillBundle for bytes).
|
|
40
|
+
*/
|
|
4
41
|
export declare function collectSkillBundleFiles(skillDir: string): Promise<Record<string, string>>;
|
|
@@ -15,7 +15,7 @@ function isStandardBundlePath(relPath) {
|
|
|
15
15
|
return (STANDARD_ROOT_FILES.has(relPath) ||
|
|
16
16
|
STANDARD_BUNDLE_PREFIXES.some((prefix) => relPath.startsWith(prefix)));
|
|
17
17
|
}
|
|
18
|
-
export function assertSafeBundlePath(relPath) {
|
|
18
|
+
export function assertSafeBundlePath(relPath, opts = {}) {
|
|
19
19
|
if (typeof relPath !== "string" || relPath.trim() === "") {
|
|
20
20
|
throw new Error("Bundled skill file path cannot be empty");
|
|
21
21
|
}
|
|
@@ -23,8 +23,10 @@ export function assertSafeBundlePath(relPath) {
|
|
|
23
23
|
throw new Error(`Bundled skill file path contains a NUL byte: ${relPath}`);
|
|
24
24
|
}
|
|
25
25
|
const normalized = normalizeBundlePath(relPath.trim());
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
// 0894: case-insensitive — a bundled skill.md would overwrite the verified
|
|
27
|
+
// SKILL.md on macOS/Windows filesystems.
|
|
28
|
+
if (normalized.toLowerCase() === "skill.md") {
|
|
29
|
+
throw new Error(`Bundled skill files must not include SKILL.md (got ${relPath})`);
|
|
28
30
|
}
|
|
29
31
|
if (isAbsolute(normalized) || normalized.startsWith("/")) {
|
|
30
32
|
throw new Error(`Bundled skill file path must be relative: ${relPath}`);
|
|
@@ -33,13 +35,13 @@ export function assertSafeBundlePath(relPath) {
|
|
|
33
35
|
if (parts.some((part) => part === "" || part === "." || part === "..")) {
|
|
34
36
|
throw new Error(`Bundled skill file path escapes the skill directory: ${relPath}`);
|
|
35
37
|
}
|
|
36
|
-
if (!isStandardBundlePath(normalized)) {
|
|
38
|
+
if (!opts.anyPath && !isStandardBundlePath(normalized)) {
|
|
37
39
|
throw new Error(`Unsupported bundled skill file path: ${relPath}. Expected agents/, scripts/, references/, assets/, tests/, or .env.example`);
|
|
38
40
|
}
|
|
39
41
|
return normalized;
|
|
40
42
|
}
|
|
41
|
-
export function resolveBundleTarget(root, relPath) {
|
|
42
|
-
const normalized = assertSafeBundlePath(relPath);
|
|
43
|
+
export function resolveBundleTarget(root, relPath, opts = {}) {
|
|
44
|
+
const normalized = assertSafeBundlePath(relPath, opts);
|
|
43
45
|
const target = join(root, ...normalized.split("/"));
|
|
44
46
|
const rel = relative(root, target);
|
|
45
47
|
if (rel === ".." || rel.startsWith(".." + pathSep) || rel.startsWith("../")) {
|
|
@@ -63,8 +65,61 @@ export function sanitizeSkillBundleFiles(files) {
|
|
|
63
65
|
}
|
|
64
66
|
return out;
|
|
65
67
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
/**
|
|
69
|
+
* 0894: validate a complete skill tree fetched from GitHub for the CLI
|
|
70
|
+
* install path. Any safe relative path is accepted and binary content stays
|
|
71
|
+
* raw bytes. (Studio requests keep the stricter sanitizeSkillBundleFiles.)
|
|
72
|
+
*/
|
|
73
|
+
export function sanitizeInstallBundleFiles(files) {
|
|
74
|
+
const out = {};
|
|
75
|
+
const seen = new Map();
|
|
76
|
+
for (const [rawPath, content] of Object.entries(files)) {
|
|
77
|
+
const relPath = assertSafeBundlePath(rawPath, { anyPath: true });
|
|
78
|
+
// Two paths differing only in case overwrite each other on macOS/Windows.
|
|
79
|
+
const key = relPath.toLowerCase();
|
|
80
|
+
const prior = seen.get(key);
|
|
81
|
+
if (prior !== undefined) {
|
|
82
|
+
throw new Error(`Bundled skill files ${prior} and ${relPath} collide on a case-insensitive filesystem`);
|
|
83
|
+
}
|
|
84
|
+
seen.set(key, relPath);
|
|
85
|
+
if (typeof content !== "string" && !(content instanceof Uint8Array)) {
|
|
86
|
+
throw new Error(`Bundled skill file ${rawPath} must be text or bytes`);
|
|
87
|
+
}
|
|
88
|
+
out[relPath] = content;
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 0894: the subset of an install bundle that the string-only consumers
|
|
94
|
+
* (Tier-2 transformers, clipboard export) can carry: text files on the
|
|
95
|
+
* standard paths.
|
|
96
|
+
*/
|
|
97
|
+
export function textOnlyStandardBundle(files) {
|
|
98
|
+
const out = {};
|
|
99
|
+
for (const [relPath, content] of Object.entries(files)) {
|
|
100
|
+
if (typeof content !== "string")
|
|
101
|
+
continue;
|
|
102
|
+
try {
|
|
103
|
+
out[assertSafeBundlePath(relPath)] = content;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// non-standard path: written by Tier-1 installs only
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
function decodeUtf8(bytes) {
|
|
112
|
+
if (bytes.includes(0))
|
|
113
|
+
return null;
|
|
114
|
+
try {
|
|
115
|
+
return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export async function collectSkillBundle(skillDir) {
|
|
122
|
+
const out = { files: {}, binaryFiles: {}, executables: [] };
|
|
68
123
|
async function walk(dir, relBase = "") {
|
|
69
124
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
70
125
|
for (const entry of entries) {
|
|
@@ -88,10 +143,25 @@ export async function collectSkillBundleFiles(skillDir) {
|
|
|
88
143
|
catch {
|
|
89
144
|
continue;
|
|
90
145
|
}
|
|
91
|
-
|
|
146
|
+
const [bytes, st] = await Promise.all([fs.readFile(absPath), fs.stat(absPath)]);
|
|
147
|
+
const text = decodeUtf8(bytes);
|
|
148
|
+
if (text === null)
|
|
149
|
+
out.binaryFiles[safePath] = new Uint8Array(bytes);
|
|
150
|
+
else
|
|
151
|
+
out.files[safePath] = text;
|
|
152
|
+
if (st.mode & 0o111)
|
|
153
|
+
out.executables.push(safePath);
|
|
92
154
|
}
|
|
93
155
|
}
|
|
94
156
|
await walk(skillDir);
|
|
95
|
-
|
|
157
|
+
out.executables.sort();
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Text files of a local skill folder. 0894: files that are not valid UTF-8
|
|
162
|
+
* are left out rather than corrupted (use collectSkillBundle for bytes).
|
|
163
|
+
*/
|
|
164
|
+
export async function collectSkillBundleFiles(skillDir) {
|
|
165
|
+
return (await collectSkillBundle(skillDir)).files;
|
|
96
166
|
}
|
|
97
167
|
//# sourceMappingURL=bundle-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle-files.js","sourceRoot":"","sources":["../../src/installer/bundle-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAEvE,MAAM,wBAAwB,GAAG;IAC/B,SAAS;IACT,UAAU;IACV,aAAa;IACb,SAAS;IACT,QAAQ;CACA,CAAC;AAEX,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAEtD,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,CACL,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;QAChC,wBAAwB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CACtE,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"bundle-files.js","sourceRoot":"","sources":["../../src/installer/bundle-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AgentDefinition } from "../agents/agents-registry.js";
|
|
2
|
+
import { type BundleContent } from "./bundle-files.js";
|
|
2
3
|
export interface InstallOptions {
|
|
3
4
|
global: boolean;
|
|
4
5
|
projectRoot: string;
|
|
@@ -22,26 +23,60 @@ export declare function resolveGlobalSkillsDirEnvOverride(agent: AgentDefinition
|
|
|
22
23
|
* Local: uses projectRoot + agent.localSkillsDir (e.g. ./project/.claude/skills)
|
|
23
24
|
*/
|
|
24
25
|
export declare function resolveAgentSkillsDir(agent: AgentDefinition, opts: InstallOptions): string;
|
|
26
|
+
/** 0894: path of the shared canonical skills folder for a scope, without
|
|
27
|
+
* creating it (`~/.agents/skills` or `<projectRoot>/.agents/skills`). */
|
|
28
|
+
export declare function resolveCanonicalSkillsDir(opts: InstallOptions): string;
|
|
29
|
+
/** 0894: true when the agent is satisfied by the canonical folder in this
|
|
30
|
+
* scope — it reads the shared `.agents/skills`, so vskill writes no
|
|
31
|
+
* agent-specific link or copy for it. */
|
|
32
|
+
export declare function isSatisfiedByCanonical(agent: AgentDefinition, opts: InstallOptions): boolean;
|
|
33
|
+
/** 0894: the folder an agent actually loads a skill from in this scope —
|
|
34
|
+
* the shared canonical folder for shared readers, else its own skills dir. */
|
|
35
|
+
export declare function resolveEffectiveSkillsDir(agent: AgentDefinition, opts: InstallOptions): string;
|
|
25
36
|
export declare function ensureCanonicalDir(base: string, global: boolean): string;
|
|
26
37
|
/** Test-only helper to reset the module-scoped symlink-warning flag. */
|
|
27
38
|
export declare function __resetSymlinkWarning(): void;
|
|
28
39
|
export declare function createRelativeSymlink(target: string, linkPath: string): boolean;
|
|
40
|
+
/** 0894: how a skill bundle is written over a previous install. */
|
|
41
|
+
export interface BundleWriteOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Paths written with mode 0755 (git mode 100755 upstream). When given,
|
|
44
|
+
* every other bundled file is set to 0644; when absent, modes are left as
|
|
45
|
+
* the filesystem makes them (an existing file keeps its mode).
|
|
46
|
+
*/
|
|
47
|
+
executables?: ReadonlySet<string>;
|
|
48
|
+
/**
|
|
49
|
+
* Accept any relative path inside the skill folder. Only for a complete
|
|
50
|
+
* skill tree fetched from the skill's own GitHub folder; every other caller
|
|
51
|
+
* (Studio, `vskill update`) keeps the standard-folder policy.
|
|
52
|
+
*/
|
|
53
|
+
anyPath?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Files the previous install of this skill recorded (lockfile `files`).
|
|
56
|
+
* Those the new bundle no longer has are removed, so a reinstall leaves no
|
|
57
|
+
* orphans. Files the previous install did not record (Studio evals, user
|
|
58
|
+
* notes) are never touched.
|
|
59
|
+
*/
|
|
60
|
+
previousFiles?: readonly string[];
|
|
61
|
+
}
|
|
29
62
|
/**
|
|
30
63
|
* Install a skill using the canonical symlink approach:
|
|
31
64
|
* 1. Write SKILL.md to .agents/skills/{name}/ (canonical source of truth)
|
|
32
|
-
* 2.
|
|
33
|
-
*
|
|
65
|
+
* 2. Agents that read the shared .agents/skills in this scope (0894) get
|
|
66
|
+
* nothing else — the canonical folder is what they load
|
|
67
|
+
* 3. Create relative symlinks from every other agent dir to the canonical dir
|
|
68
|
+
* 4. For agents with known symlink issues, fall back to direct copy
|
|
34
69
|
*
|
|
35
70
|
* Optional agentFiles: additional files (e.g., agents/*.md) to install alongside SKILL.md.
|
|
36
71
|
* Keys are relative paths within the skill directory.
|
|
37
72
|
*/
|
|
38
|
-
export declare function installSymlink(skillName: string, content: string, agents: AgentDefinition[], opts: InstallOptions, agentFiles?: Record<string,
|
|
73
|
+
export declare function installSymlink(skillName: string, content: string, agents: AgentDefinition[], opts: InstallOptions, agentFiles?: Record<string, BundleContent>, bundleOpts?: BundleWriteOptions): string[];
|
|
39
74
|
/**
|
|
40
75
|
* Install a skill by copying SKILL.md directly to each agent directory.
|
|
41
76
|
*
|
|
42
77
|
* Optional agentFiles: additional files (e.g., agents/*.md) to install alongside SKILL.md.
|
|
43
78
|
*/
|
|
44
|
-
export declare function installCopy(skillName: string, content: string, agents: AgentDefinition[], opts: InstallOptions, agentFiles?: Record<string,
|
|
79
|
+
export declare function installCopy(skillName: string, content: string, agents: AgentDefinition[], opts: InstallOptions, agentFiles?: Record<string, BundleContent>, bundleOpts?: BundleWriteOptions): string[];
|
|
45
80
|
/**
|
|
46
81
|
* 0845 T-012/T-014: Resolve the Tier-2 INSTALL ROOT for an agent —
|
|
47
82
|
* the parent of `localSkillsDir` / `globalSkillsDir`. Tier-2 transformers
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync, symlinkSync, lstatSync, rmSync } from "node:fs";
|
|
1
|
+
import { mkdirSync, writeFileSync, symlinkSync, lstatSync, rmSync, existsSync, unlinkSync, chmodSync, readdirSync, rmdirSync } from "node:fs";
|
|
2
2
|
// 0706 T-004: `relative` + `sep` (as pathSep) power the cross-platform
|
|
3
3
|
// path-traversal guard. `path.relative` handles Windows backslash correctly.
|
|
4
4
|
import { join, relative, dirname, sep as pathSep } from "node:path";
|
|
@@ -36,6 +36,14 @@ export function resolveAgentSkillsDir(agent, opts) {
|
|
|
36
36
|
const override = resolveGlobalSkillsDirEnvOverride(agent);
|
|
37
37
|
if (override)
|
|
38
38
|
return override;
|
|
39
|
+
// 0894: Antigravity's registry default is ~/.gemini/config/skills, but an
|
|
40
|
+
// existing legacy IDE dir ~/.gemini/antigravity/skills keeps priority so
|
|
41
|
+
// installs land where that setup already loads skills from.
|
|
42
|
+
if (agent.id === "antigravity") {
|
|
43
|
+
const legacy = resolveTilde("~/.gemini/antigravity/skills");
|
|
44
|
+
if (existsSync(legacy))
|
|
45
|
+
return legacy;
|
|
46
|
+
}
|
|
39
47
|
return resolveTilde(agent.globalSkillsDir);
|
|
40
48
|
}
|
|
41
49
|
const resolved = join(opts.projectRoot, agent.localSkillsDir);
|
|
@@ -51,6 +59,28 @@ export function resolveAgentSkillsDir(agent, opts) {
|
|
|
51
59
|
}
|
|
52
60
|
return resolved;
|
|
53
61
|
}
|
|
62
|
+
/** 0894: path of the shared canonical skills folder for a scope, without
|
|
63
|
+
* creating it (`~/.agents/skills` or `<projectRoot>/.agents/skills`). */
|
|
64
|
+
export function resolveCanonicalSkillsDir(opts) {
|
|
65
|
+
return opts.global
|
|
66
|
+
? join(os.homedir(), ".agents", "skills")
|
|
67
|
+
: join(opts.projectRoot, ".agents", "skills");
|
|
68
|
+
}
|
|
69
|
+
/** 0894: true when the agent is satisfied by the canonical folder in this
|
|
70
|
+
* scope — it reads the shared `.agents/skills`, so vskill writes no
|
|
71
|
+
* agent-specific link or copy for it. */
|
|
72
|
+
export function isSatisfiedByCanonical(agent, opts) {
|
|
73
|
+
// Read the flag directly (not via a registry helper) so callers that mock
|
|
74
|
+
// the registry module keep working.
|
|
75
|
+
return agent.readsSharedSkills?.[opts.global ? "global" : "project"] === true;
|
|
76
|
+
}
|
|
77
|
+
/** 0894: the folder an agent actually loads a skill from in this scope —
|
|
78
|
+
* the shared canonical folder for shared readers, else its own skills dir. */
|
|
79
|
+
export function resolveEffectiveSkillsDir(agent, opts) {
|
|
80
|
+
return isSatisfiedByCanonical(agent, opts)
|
|
81
|
+
? resolveCanonicalSkillsDir(opts)
|
|
82
|
+
: resolveAgentSkillsDir(agent, opts);
|
|
83
|
+
}
|
|
54
84
|
export function ensureCanonicalDir(base, global) {
|
|
55
85
|
if (global) {
|
|
56
86
|
const dir = join(os.homedir(), ".agents", "skills");
|
|
@@ -107,32 +137,127 @@ export function createRelativeSymlink(target, linkPath) {
|
|
|
107
137
|
}
|
|
108
138
|
}
|
|
109
139
|
/**
|
|
110
|
-
* Agents
|
|
111
|
-
*
|
|
112
|
-
*
|
|
140
|
+
* Agents that keep a full copy when their content differs from the shared
|
|
141
|
+
* canonical copy. Claude Code is the only one: it reads Claude-only
|
|
142
|
+
* frontmatter (allowed-tools, model, context, ...) that the canonical copy
|
|
143
|
+
* strips. When nothing is stripped, Claude Code gets a link like everyone
|
|
144
|
+
* else (0894; current Claude Code follows symlinked skill folders, the old
|
|
145
|
+
* https://github.com/anthropics/claude-code/issues/14836 no longer applies).
|
|
113
146
|
*/
|
|
114
147
|
const COPY_FALLBACK_AGENTS = new Set(["claude-code"]);
|
|
115
148
|
/**
|
|
116
|
-
*
|
|
117
|
-
*
|
|
149
|
+
* 0894: drop a symlink at `p` (only the link, never its target) so the next
|
|
150
|
+
* mkdir + write creates a real folder there. Without this, a copy written to
|
|
151
|
+
* an agent dir that an earlier install linked to the canonical folder goes
|
|
152
|
+
* through the link and overwrites the shared copy every other agent reads.
|
|
153
|
+
*/
|
|
154
|
+
function unlinkIfSymlink(p) {
|
|
155
|
+
try {
|
|
156
|
+
if (lstatSync(p).isSymbolicLink())
|
|
157
|
+
unlinkSync(p);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// nothing there
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function lstatOrNull(p) {
|
|
164
|
+
try {
|
|
165
|
+
return lstatSync(p);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** Remove now-empty folders from `dir` up to (not including) `root`. */
|
|
172
|
+
function pruneEmptyDirs(dir, root) {
|
|
173
|
+
let cur = dir;
|
|
174
|
+
while (cur !== root && relative(root, cur) && !relative(root, cur).startsWith("..")) {
|
|
175
|
+
try {
|
|
176
|
+
if (readdirSync(cur).length > 0)
|
|
177
|
+
return;
|
|
178
|
+
rmdirSync(cur);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
cur = dirname(cur);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Make `fullPath` writable as a regular file inside `root`: an ancestor that
|
|
188
|
+
* is a file or a symlink (which could also point outside the skill folder) is
|
|
189
|
+
* removed, and a folder sitting where the file goes is removed. Without this,
|
|
190
|
+
* a reinstall whose tree changed shape dies half-written with EISDIR/ENOTDIR.
|
|
118
191
|
*/
|
|
119
|
-
function
|
|
120
|
-
|
|
121
|
-
|
|
192
|
+
function clearPathForFile(root, fullPath) {
|
|
193
|
+
const parts = relative(root, dirname(fullPath)).split(pathSep).filter(Boolean);
|
|
194
|
+
let cur = root;
|
|
195
|
+
for (const part of parts) {
|
|
196
|
+
cur = join(cur, part);
|
|
197
|
+
const st = lstatOrNull(cur);
|
|
198
|
+
if (!st)
|
|
199
|
+
break;
|
|
200
|
+
if (!st.isDirectory())
|
|
201
|
+
unlinkSync(cur);
|
|
202
|
+
}
|
|
203
|
+
const st = lstatOrNull(fullPath);
|
|
204
|
+
if (st?.isDirectory())
|
|
205
|
+
rmSync(fullPath, { recursive: true, force: true });
|
|
206
|
+
else if (st?.isSymbolicLink())
|
|
207
|
+
unlinkSync(fullPath);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Write bundled files alongside SKILL.md in a target directory.
|
|
211
|
+
* Keys are relative paths (e.g., "agents/frontend.md", "assets/font.woff2");
|
|
212
|
+
* values are text or raw bytes, written as-is. Paths were policy-checked when
|
|
213
|
+
* the bundle entered the installer, so only traversal is re-checked here.
|
|
214
|
+
*/
|
|
215
|
+
function writeAgentFiles(targetDir, agentFiles, bundleOpts) {
|
|
216
|
+
const files = agentFiles ?? {};
|
|
217
|
+
if (bundleOpts?.previousFiles) {
|
|
218
|
+
const keep = new Set(Object.keys(files));
|
|
219
|
+
for (const rel of bundleOpts.previousFiles) {
|
|
220
|
+
if (rel === "SKILL.md" || keep.has(rel))
|
|
221
|
+
continue;
|
|
222
|
+
let target;
|
|
223
|
+
try {
|
|
224
|
+
target = resolveBundleTarget(targetDir, rel, { anyPath: true });
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
continue; // never act on an unsafe recorded path
|
|
228
|
+
}
|
|
229
|
+
const st = lstatOrNull(target);
|
|
230
|
+
if (st && !st.isDirectory()) {
|
|
231
|
+
unlinkSync(target);
|
|
232
|
+
pruneEmptyDirs(dirname(target), targetDir);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const anyPath = bundleOpts?.anyPath === true;
|
|
237
|
+
const executables = bundleOpts?.executables;
|
|
238
|
+
for (const [relPath, fileContent] of Object.entries(files)) {
|
|
239
|
+
const fullPath = resolveBundleTarget(targetDir, relPath, { anyPath });
|
|
240
|
+
clearPathForFile(targetDir, fullPath);
|
|
122
241
|
mkdirSync(dirname(fullPath), { recursive: true });
|
|
123
242
|
writeFileSync(fullPath, fileContent);
|
|
243
|
+
// Explicit when the caller knows the modes: writeFileSync keeps the old
|
|
244
|
+
// mode of an existing file, so a dropped exec bit would otherwise stick.
|
|
245
|
+
if (executables)
|
|
246
|
+
chmodSync(fullPath, executables.has(relPath) ? 0o755 : 0o644);
|
|
124
247
|
}
|
|
125
248
|
}
|
|
126
249
|
/**
|
|
127
250
|
* Install a skill using the canonical symlink approach:
|
|
128
251
|
* 1. Write SKILL.md to .agents/skills/{name}/ (canonical source of truth)
|
|
129
|
-
* 2.
|
|
130
|
-
*
|
|
252
|
+
* 2. Agents that read the shared .agents/skills in this scope (0894) get
|
|
253
|
+
* nothing else — the canonical folder is what they load
|
|
254
|
+
* 3. Create relative symlinks from every other agent dir to the canonical dir
|
|
255
|
+
* 4. For agents with known symlink issues, fall back to direct copy
|
|
131
256
|
*
|
|
132
257
|
* Optional agentFiles: additional files (e.g., agents/*.md) to install alongside SKILL.md.
|
|
133
258
|
* Keys are relative paths within the skill directory.
|
|
134
259
|
*/
|
|
135
|
-
export function installSymlink(skillName, content, agents, opts, agentFiles) {
|
|
260
|
+
export function installSymlink(skillName, content, agents, opts, agentFiles, bundleOpts) {
|
|
136
261
|
content = ensureFrontmatter(content, skillName);
|
|
137
262
|
const strippedContent = stripClaudeFields(content, skillName);
|
|
138
263
|
// Skip canonical .agents/ dir when all agents use copy-fallback (e.g., claude-code only)
|
|
@@ -142,22 +267,42 @@ export function installSymlink(skillName, content, agents, opts, agentFiles) {
|
|
|
142
267
|
canonicalSkillDir = join(ensureCanonicalDir(opts.projectRoot, opts.global), skillName);
|
|
143
268
|
mkdirSync(canonicalSkillDir, { recursive: true });
|
|
144
269
|
writeFileSync(join(canonicalSkillDir, "SKILL.md"), strippedContent);
|
|
145
|
-
|
|
146
|
-
writeAgentFiles(canonicalSkillDir, agentFiles);
|
|
270
|
+
writeAgentFiles(canonicalSkillDir, agentFiles, bundleOpts);
|
|
147
271
|
}
|
|
148
272
|
const installed = [];
|
|
149
273
|
for (const agent of agents) {
|
|
274
|
+
// 0894 (AC-04): shared readers load the canonical folder directly.
|
|
275
|
+
if (isSatisfiedByCanonical(agent, opts) && canonicalSkillDir) {
|
|
276
|
+
if (!installed.includes(canonicalSkillDir))
|
|
277
|
+
installed.push(canonicalSkillDir);
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
150
280
|
const agentSkillsDir = resolveAgentSkillsDir(agent, opts);
|
|
151
|
-
mkdirSync(agentSkillsDir, { recursive: true });
|
|
152
281
|
const linkPath = join(agentSkillsDir, skillName);
|
|
153
|
-
//
|
|
282
|
+
// Never link the canonical folder onto itself (an agent whose skills dir
|
|
283
|
+
// IS the shared folder); removing the "existing" path would delete it.
|
|
284
|
+
if (canonicalSkillDir && linkPath === canonicalSkillDir) {
|
|
285
|
+
if (!installed.includes(canonicalSkillDir))
|
|
286
|
+
installed.push(canonicalSkillDir);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
mkdirSync(agentSkillsDir, { recursive: true });
|
|
290
|
+
// Claude Code links to the canonical copy when that copy is exactly what
|
|
291
|
+
// Claude would get; otherwise it keeps a full copy with its own fields.
|
|
292
|
+
if (COPY_FALLBACK_AGENTS.has(agent.id) &&
|
|
293
|
+
canonicalSkillDir &&
|
|
294
|
+
strippedContent === content &&
|
|
295
|
+
createRelativeSymlink(canonicalSkillDir, linkPath)) {
|
|
296
|
+
installed.push(linkPath);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
154
299
|
if (COPY_FALLBACK_AGENTS.has(agent.id)) {
|
|
155
300
|
// Claude Code gets full content with all fields
|
|
156
301
|
const agentContent = agent.id === "claude-code" ? content : strippedContent;
|
|
302
|
+
unlinkIfSymlink(linkPath);
|
|
157
303
|
mkdirSync(linkPath, { recursive: true });
|
|
158
304
|
writeFileSync(join(linkPath, "SKILL.md"), agentContent);
|
|
159
|
-
|
|
160
|
-
writeAgentFiles(linkPath, agentFiles);
|
|
305
|
+
writeAgentFiles(linkPath, agentFiles, bundleOpts);
|
|
161
306
|
installed.push(linkPath);
|
|
162
307
|
continue;
|
|
163
308
|
}
|
|
@@ -167,10 +312,10 @@ export function installSymlink(skillName, content, agents, opts, agentFiles) {
|
|
|
167
312
|
}
|
|
168
313
|
else {
|
|
169
314
|
// Fallback to copy on symlink failure — use stripped content for non-Claude
|
|
315
|
+
unlinkIfSymlink(linkPath);
|
|
170
316
|
mkdirSync(linkPath, { recursive: true });
|
|
171
317
|
writeFileSync(join(linkPath, "SKILL.md"), strippedContent);
|
|
172
|
-
|
|
173
|
-
writeAgentFiles(linkPath, agentFiles);
|
|
318
|
+
writeAgentFiles(linkPath, agentFiles, bundleOpts);
|
|
174
319
|
installed.push(linkPath);
|
|
175
320
|
}
|
|
176
321
|
}
|
|
@@ -181,19 +326,28 @@ export function installSymlink(skillName, content, agents, opts, agentFiles) {
|
|
|
181
326
|
*
|
|
182
327
|
* Optional agentFiles: additional files (e.g., agents/*.md) to install alongside SKILL.md.
|
|
183
328
|
*/
|
|
184
|
-
export function installCopy(skillName, content, agents, opts, agentFiles) {
|
|
329
|
+
export function installCopy(skillName, content, agents, opts, agentFiles, bundleOpts) {
|
|
185
330
|
content = ensureFrontmatter(content, skillName);
|
|
186
331
|
const strippedContent = stripClaudeFields(content, skillName);
|
|
187
332
|
const installed = [];
|
|
188
333
|
for (const agent of agents) {
|
|
189
334
|
// Claude Code gets full content; all others get stripped
|
|
190
335
|
const agentContent = agent.id === "claude-code" ? content : strippedContent;
|
|
191
|
-
|
|
336
|
+
// 0894 (AC-04): shared readers get one copy in the canonical folder
|
|
337
|
+
// instead of a per-agent copy.
|
|
338
|
+
const agentSkillsDir = isSatisfiedByCanonical(agent, opts)
|
|
339
|
+
? ensureCanonicalDir(opts.projectRoot, opts.global)
|
|
340
|
+
: resolveAgentSkillsDir(agent, opts);
|
|
192
341
|
const skillDir = join(agentSkillsDir, skillName);
|
|
342
|
+
if (installed.includes(skillDir))
|
|
343
|
+
continue;
|
|
344
|
+
// A copy for one agent must not land in another's folder through an
|
|
345
|
+
// old link (the shared canonical folder itself is left as it is).
|
|
346
|
+
if (!isSatisfiedByCanonical(agent, opts))
|
|
347
|
+
unlinkIfSymlink(skillDir);
|
|
193
348
|
mkdirSync(skillDir, { recursive: true });
|
|
194
349
|
writeFileSync(join(skillDir, "SKILL.md"), agentContent);
|
|
195
|
-
|
|
196
|
-
writeAgentFiles(skillDir, agentFiles);
|
|
350
|
+
writeAgentFiles(skillDir, agentFiles, bundleOpts);
|
|
197
351
|
installed.push(skillDir);
|
|
198
352
|
}
|
|
199
353
|
return installed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/installer/canonical.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/installer/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AGENTS_REGISTRY, type AgentDefinition } from "../agents/agents-registry.js";
|
|
2
2
|
import type { ParsedSkill } from "./transformers/index.js";
|
|
3
|
+
import { type BundleContent } from "./bundle-files.js";
|
|
3
4
|
export type AgentInstallStatus = "installed" | "exported" | "skipped" | "error";
|
|
4
5
|
export interface AgentInstallResult {
|
|
5
6
|
agentId: string;
|
|
@@ -67,8 +68,16 @@ export interface InstallToAgentsOptions {
|
|
|
67
68
|
projectRoot: string;
|
|
68
69
|
/** When true, Tier-1 agents are copied instead of symlinked (CLI --copy). */
|
|
69
70
|
copy?: boolean;
|
|
70
|
-
/**
|
|
71
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Optional bundled resources: every file of the skill folder except
|
|
73
|
+
* SKILL.md, keyed by relative path. Text or raw bytes (0894: fonts, audio
|
|
74
|
+
* and other binaries are written byte for byte).
|
|
75
|
+
*/
|
|
76
|
+
bundleFiles?: Record<string, BundleContent>;
|
|
77
|
+
/** 0894: bundle paths written with mode 0755. */
|
|
78
|
+
bundleExecutables?: string[];
|
|
79
|
+
/** 0894: lockfile `files` of the previous install; ones now gone are removed. */
|
|
80
|
+
previousFiles?: string[];
|
|
72
81
|
}
|
|
73
82
|
/**
|
|
74
83
|
* F9 — the CLI-facing install entry point. Dispatches the SAME per-agent
|