Files
hyperframes/packages
James RussoandClaude Opus 4.8 88fffb04d1 feat(cli): surface and prune skills removed upstream (#1740)
* feat(cli): surface and prune skills removed upstream

`skills add` / `init` / `hyperframes skills update` only ever add or
refresh — none of them delete a skill that was renamed or dropped
upstream (e.g. graphic-overlays → talking-head-recut). `skills check`
also ignored any installed skill not in the manifest, so a stale bundle
lingered forever with no signal and no cleanup path.

- skills check: detect "removed" skills by cross-referencing the
  vercel-labs/skills lock — a skill the lock attributes to our manifest
  `source` that the manifest no longer lists. Surface them in the human
  and --json output and count them toward the non-zero exit so the
  `check || update` contract gates on them.
- skills update: after `skills add --all`, prune those skills via
  `skills remove -g --yes` so the install fully reconciles with the
  manifest. Best-effort — a cleanup failure doesn't fail the update.

Attribution is via the lock's source field, never the bare directory
name: `.../skills` is shared across sources, so skills from other
sources (e.g. greensock/gsap-skills) are never touched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(cli): prune removed skills only in the scope they were attributed from

Make the cleanup in `skills update` impossible to misfire onto a user's
own skills. The prune already only targets names the lock attributes to
our source, but it hardcoded `skills remove -g` (global) while `skills
add` defaults to project scope — so detection could attribute from one
scope's lock while removal hit another, potentially deleting a global
skill of the same name from a different source.

- checkSkills now returns the located install's `scope`.
- skills update removes in that exact scope (`-g` only when global), so
  attribution scope and removal scope always match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(cli): validate skill names before passing them to skills remove

Addresses review feedback: skill names fed to `skills remove` originate
as lock-file JSON keys, so a corrupt or crafted lock entry could smuggle
a flag-like (`--config=…`) or shell-special token into the spawn — which
matters most on the Windows cmd.exe path where arg escaping is fragile.

Filter the names through a strict kebab-case pattern and warn on any that
are rejected, rather than relying on a `--` separator (the upstream
`skills` arg parser silently ignores unknown `-`-prefixed tokens and has
no `--` end-of-options handling, so `--` would be a no-op there).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 09:23:37 -07:00
..
2026-06-26 00:51:34 -04:00
2026-06-26 00:51:34 -04:00
2026-06-26 00:51:34 -04:00
2026-06-26 00:51:34 -04:00
2026-06-26 00:51:34 -04:00
2026-06-16 13:16:09 -04:00
2026-06-26 00:51:34 -04:00