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.
Files changed (103) hide show
  1. package/README.md +49 -1
  2. package/agents.json +6 -1
  3. package/dist/agents/agents-registry.d.ts +43 -16
  4. package/dist/agents/agents-registry.js +119 -33
  5. package/dist/agents/agents-registry.js.map +1 -1
  6. package/dist/agents/global-dirs.d.ts +19 -0
  7. package/dist/agents/global-dirs.js +53 -0
  8. package/dist/agents/global-dirs.js.map +1 -0
  9. package/dist/commands/add-github-bundle.d.ts +29 -0
  10. package/dist/commands/add-github-bundle.js +135 -0
  11. package/dist/commands/add-github-bundle.js.map +1 -0
  12. package/dist/commands/add-lockfile.d.ts +2 -0
  13. package/dist/commands/add-lockfile.js +1 -1
  14. package/dist/commands/add-lockfile.js.map +1 -1
  15. package/dist/commands/add.d.ts +0 -7
  16. package/dist/commands/add.js +197 -107
  17. package/dist/commands/add.js.map +1 -1
  18. package/dist/commands/audit-webmcp.d.ts +25 -0
  19. package/dist/commands/audit-webmcp.js +167 -0
  20. package/dist/commands/audit-webmcp.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +69 -0
  22. package/dist/commands/doctor.js +760 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/remove.js +43 -8
  25. package/dist/commands/remove.js.map +1 -1
  26. package/dist/commands/update.js +12 -4
  27. package/dist/commands/update.js.map +1 -1
  28. package/dist/discovery/github-skill-bundle.d.ts +74 -0
  29. package/dist/discovery/github-skill-bundle.js +323 -0
  30. package/dist/discovery/github-skill-bundle.js.map +1 -0
  31. package/dist/eval/skill-scanner.js +7 -1
  32. package/dist/eval/skill-scanner.js.map +1 -1
  33. package/dist/eval-server/install-skill-routes.js +10 -3
  34. package/dist/eval-server/install-skill-routes.js.map +1 -1
  35. package/dist/eval-server/remove-skill-routes.js +262 -29
  36. package/dist/eval-server/remove-skill-routes.js.map +1 -1
  37. package/dist/eval-server/studio-privacy.js +2 -3
  38. package/dist/eval-server/studio-privacy.js.map +1 -1
  39. package/dist/eval-server/utils/scan-install-locations.js +22 -3
  40. package/dist/eval-server/utils/scan-install-locations.js.map +1 -1
  41. package/dist/eval-ui/assets/{AdvancedTab-CSWhj_MZ.js → AdvancedTab-6VlfqCuD.js} +1 -1
  42. package/dist/eval-ui/assets/{CreateSkillPage-lecFvrLO.js → CreateSkillPage-CXDd6gDN.js} +1 -1
  43. package/dist/eval-ui/assets/{FindSkillsPalette-Dtyd7VrA.js → FindSkillsPalette-DQ6uGhFP.js} +2 -2
  44. package/dist/eval-ui/assets/{GeneralTab-Gbc-K6UI.js → GeneralTab-BpFlJ2ue.js} +1 -1
  45. package/dist/eval-ui/assets/{PrivacyTab-BXCIX8cQ.js → PrivacyTab-UfO7QLy_.js} +1 -1
  46. package/dist/eval-ui/assets/{SearchPaletteCore-CneELTjb.js → SearchPaletteCore-DpHCf0mf.js} +1 -1
  47. package/dist/eval-ui/assets/{SkillDetailPanel-BMfMN6Wy.js → SkillDetailPanel-BjHFjGxg.js} +1 -1
  48. package/dist/eval-ui/assets/{UpdateDropdown-BlAAI6ah.js → UpdateDropdown-Cn4Vsq5d.js} +1 -1
  49. package/dist/eval-ui/assets/{UpdatesTab-BFGUaUtu.js → UpdatesTab-C38-n7V3.js} +1 -1
  50. package/dist/eval-ui/assets/globals-BWCNQsMa.css +1 -0
  51. package/dist/eval-ui/assets/globals-DmzftdEG.js +49 -0
  52. package/dist/eval-ui/assets/{index-DhhmQddr.js → index-DlQYQHDO.js} +1 -1
  53. package/dist/eval-ui/assets/{lifecycle-o_IRibOa.js → lifecycle-n00yue6r.js} +1 -1
  54. package/dist/eval-ui/assets/main-BmB7Zj9I.js +86 -0
  55. package/dist/eval-ui/assets/{preferences-D2BPT0OT.js → preferences-BN-jNWS0.js} +2 -2
  56. package/dist/eval-ui/assets/{useDesktopBridge-BKz-gcRg.js → useDesktopBridge-Cm4zPght.js} +1 -1
  57. package/dist/eval-ui/index.html +4 -4
  58. package/dist/eval-ui/lifecycle.html +3 -3
  59. package/dist/eval-ui/preferences.html +4 -4
  60. package/dist/index.js +34 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/installer/bundle-files.d.ts +39 -2
  63. package/dist/installer/bundle-files.js +80 -10
  64. package/dist/installer/bundle-files.js.map +1 -1
  65. package/dist/installer/canonical.d.ts +39 -4
  66. package/dist/installer/canonical.js +178 -24
  67. package/dist/installer/canonical.js.map +1 -1
  68. package/dist/installer/multi-install.d.ts +11 -2
  69. package/dist/installer/multi-install.js +41 -9
  70. package/dist/installer/multi-install.js.map +1 -1
  71. package/dist/installer/transformers/index.d.ts +8 -0
  72. package/dist/installer/yaml-safe-mutate.js +48 -2
  73. package/dist/installer/yaml-safe-mutate.js.map +1 -1
  74. package/dist/lib/github-fetch.js +2 -0
  75. package/dist/lib/github-fetch.js.map +1 -1
  76. package/dist/lib/private-source.d.ts +8 -0
  77. package/dist/lib/private-source.js +16 -2
  78. package/dist/lib/private-source.js.map +1 -1
  79. package/dist/webmcp/args.d.ts +34 -0
  80. package/dist/webmcp/args.js +87 -0
  81. package/dist/webmcp/args.js.map +1 -0
  82. package/dist/webmcp/attribution.d.ts +38 -0
  83. package/dist/webmcp/attribution.js +141 -0
  84. package/dist/webmcp/attribution.js.map +1 -0
  85. package/dist/webmcp/enumerate.d.ts +81 -0
  86. package/dist/webmcp/enumerate.js +436 -0
  87. package/dist/webmcp/enumerate.js.map +1 -0
  88. package/dist/webmcp/format.d.ts +9 -0
  89. package/dist/webmcp/format.js +105 -0
  90. package/dist/webmcp/format.js.map +1 -0
  91. package/dist/webmcp/merge.d.ts +49 -0
  92. package/dist/webmcp/merge.js +167 -0
  93. package/dist/webmcp/merge.js.map +1 -0
  94. package/dist/webmcp/score.d.ts +70 -0
  95. package/dist/webmcp/score.js +586 -0
  96. package/dist/webmcp/score.js.map +1 -0
  97. package/dist/webmcp/types.d.ts +92 -0
  98. package/dist/webmcp/types.js +8 -0
  99. package/dist/webmcp/types.js.map +1 -0
  100. package/package.json +6 -6
  101. package/dist/eval-ui/assets/globals-Dpf9KmYH.css +0 -1
  102. package/dist/eval-ui/assets/globals-hm1COkXX.js +0 -49
  103. package/dist/eval-ui/assets/main-DRhfwCeX.js +0 -86
@@ -1,4 +1,41 @@
1
- export declare function assertSafeBundlePath(relPath: string): string;
2
- export declare function resolveBundleTarget(root: string, relPath: string): string;
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
- if (normalized === "SKILL.md") {
27
- throw new Error("Bundled skill files must not include SKILL.md");
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
- export async function collectSkillBundleFiles(skillDir) {
67
- const files = {};
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
- files[safePath] = await fs.readFile(absPath, "utf-8");
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
- return files;
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":"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"}
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. Create relative symlinks from each agent dir to the canonical dir
33
- * 3. For agents with known symlink issues, fall back to direct copy
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, string>): 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, string>): 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 known to have unreliable symlink support.
111
- * These always get a direct copy even in symlink mode.
112
- * See: https://github.com/anthropics/claude-code/issues/14836
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
- * Write agent files (agents/*.md) alongside SKILL.md in a target directory.
117
- * Keys are relative paths (e.g., "agents/frontend.md"), values are file contents.
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 writeAgentFiles(targetDir, agentFiles) {
120
- for (const [relPath, fileContent] of Object.entries(agentFiles)) {
121
- const fullPath = resolveBundleTarget(targetDir, relPath);
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. Create relative symlinks from each agent dir to the canonical dir
130
- * 3. For agents with known symlink issues, fall back to direct copy
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
- if (agentFiles)
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
- // Agents with known symlink issues get direct copy
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
- if (agentFiles)
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
- if (agentFiles)
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
- const agentSkillsDir = resolveAgentSkillsDir(agent, opts);
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
- if (agentFiles)
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
- /** Optional bundled resources (agents/*, scripts/*, …). */
71
- bundleFiles?: Record<string, string>;
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