diff --git a/packages/cli/src/commands/skills.test.ts b/packages/cli/src/commands/skills.test.ts index 8c25cd1ba1..a9372a8687 100644 --- a/packages/cli/src/commands/skills.test.ts +++ b/packages/cli/src/commands/skills.test.ts @@ -109,13 +109,13 @@ describe("hyperframes skills", () => { "linux", "npx", ["--version"], - ["skills", "add", "https://github.com/heygen-com/hyperframes", "--all"], + ["skills", "add", "https://github.com/heygen-com/hyperframes", "--all", "--copy"], ], [ "darwin", "npx", ["--version"], - ["skills", "add", "https://github.com/heygen-com/hyperframes", "--all"], + ["skills", "add", "https://github.com/heygen-com/hyperframes", "--all", "--copy"], ], [ "win32", @@ -130,6 +130,7 @@ describe("hyperframes skills", () => { "add", "https://github.com/heygen-com/hyperframes", "--all", + "--copy", ], ], ] as const)( diff --git a/packages/cli/src/commands/skills.ts b/packages/cli/src/commands/skills.ts index 5949cd3eb2..d5cf7ac4e9 100644 --- a/packages/cli/src/commands/skills.ts +++ b/packages/cli/src/commands/skills.ts @@ -52,7 +52,14 @@ function runSkillsAdd( source: string, opts: { cwd?: string; extraArgs?: string[] } = {}, ): Promise { - return spawnNpx(["skills", "add", source, ...(opts.extraArgs ?? ["--all"])], opts); + // `--copy` writes real files into each target agent's skills dir, instead of + // the upstream default (a canonical `.agents/skills` store + per-agent + // symlinks). That default re-serialises each SKILL.md's frontmatter, so an + // installed bundle no longer byte-matches the published manifest — `skills + // check` then reports a freshly-installed set as outdated, and the symlinked + // layout doesn't reliably land where the agent actually reads. Real copies + // keep the install faithful to the manifest and detectable by `skills check`. + return spawnNpx(["skills", "add", source, ...(opts.extraArgs ?? ["--all"]), "--copy"], opts); } // Skill names are kebab-case directory names. Refuse anything that isn't one