Skip to content

fix(cli): init never touches installed skills and no command removes one - #6168

Merged
miguel-heygen merged 7 commits into
mainfrom
fix/skills-only-own
Oct 24, 2026
Merged

miguel-heygen merged 7 commits into
mainfrom
fix/skills-only-own

Conversation

@miguel-heygen

@miguel-heygen miguel-heygen commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

What changes for you

init no longer refreshes, replaces or removes skills you already have. It installs the core set only when it is missing. No command removes a skill any more: skills update refreshes the HyperFrames skills you already have (or the ones you name) and never deletes one. --skip-skills works again, and HYPERFRAMES_SKIP_SKILLS=1 still does the same. The stale-skills notice now reaches agents too: it prints to stderr after render, lint and validate even without a terminal and under --json, and stays off in CI, in dev, with HYPERFRAMES_NO_UPDATE_CHECK=1 and with HYPERFRAMES_SKIP_SKILLS=1.

init <name> --example blank --non-interactive without the flag keeps working with no prompt.

Why

Setup and update changed and deleted skills nobody had asked it to touch. A skill the user had installed under one of our names could be overwritten, and the "no longer published" purge removed skills on its own. --skip-skills was ignored on purpose while the skills.sh registry lagged; that reason is gone.

How

  • init installs missing core skills only (updateSkills({ onlyMissing: true })); outdated installed skills are left as they are.
  • The purge and the removed-upstream detection are deleted: the skills remove call, the lock-entry cleanup, the "removed" status and count in check, the nudge count, and update's --dir and --source flags (they only scoped the purge).
  • A skill the install record attributes to another publisher is never compared or refreshed, even when its name matches one of ours. A skill with no record entry is still treated as ours, which is today's behaviour.
  • The notice and its background check gated on a terminal, which agents never have, so they never saw it and their cache never refreshed. They now gate on the update-check opt-outs only; the CLI's own self-update notice keeps its terminal gate. --json stdout is unchanged; the notice only writes stderr, and the CLI's own update notices stay off under --json.
  • Docs (skill-lifecycle.md, init-and-scaffold.md, docs/packages/cli.mdx, README) say the above.

Tests

New tests fail on main and pass here: update never spawns a removal, init's install leaves an outdated skill alone, a dropped skill is not an update, a run without a terminal prints the stale-skills notice and has its background check due, a same-named skill from another source is not compared, and init --skip-skills without the env var skips skills. The skills, manifest, init and nudge suites pass 3 runs in a row (163 tests). About 880 lines are deleted net.

@mintlify

mintlify Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
hyperframes 🟢 Ready View Preview Oct 24, 2026, 1:19 AM

💡 Tip: Enable Automations to automatically generate PRs for you.

@heygengenesis heygengenesis Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE · 0 blocker · 1 important · 0 nits · head a65b3c1b

Ownership check and --skip-skills restore read right; foreign names are excluded before the diff, so neither the refresh, the core-set install nor the retired-name prune can reach them. ↓ one inline on the named-update message.

Not mergeable as is: skills-manifest.json conflicts with main (regenerate the hashes on rebase), and no Actions run exists for this head, so the rebased head needs CI and a fresh approval.

Scope

Read the full diff plus updateSkills / skills update prune in commands/skills.ts. Ran skillsManifest, init, skills suites: 162/163 pass; the one failure (pruneOrphanedLockEntries … preserves the file mode, 384 vs 416) fails identically on main in this sandbox (umask), unrelated.

isFromOtherSource(lock?.skills?.[name], latest.source),
)
: [];
const ours = skillNames.filter((name) => !foreign.includes(name));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

important — dropping a foreign name from the manifest set also turns an explicit hyperframes skills update hyperframes-cli (or the router's skills update <workflow>) into Unknown skill(s): hyperframes-cli. Available: … and, under strict, exit 1 — the skill does exist; another publisher owns that folder. Safe, but the message sends the user/agent hunting for a typo. Suggest surfacing foreign in updateSkills and saying so (e.g. "hyperframes-cli is installed from someone/else; left untouched").

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Edit accuracy: accurate 271 (base branch 271), smooth 141 of those

The gate passes.
Smoothness is reported in the artifact, not gated. A case fails only if it fails 2 of 3 runs.

Quarantined, measured but not gated (0)

Unstable (1)

  • seqplainkeys-none-pct-r0-nested-z100: tracking 0.05, pressJump 0, drop 0, reload 0, render 0.02, renderKey -, undo false, teleport true / tracking 0.05, pressJump 0, drop 0, reload 0, render 0.02, renderKey -, undo true, teleport true / tracking 0.05, pressJump 0, drop 0, reload 0, render 0.02, renderKey -, undo true, teleport true

@miguel-heygen miguel-heygen changed the title fix(cli): init and skills update only touch HyperFrames skills; --skip-skills works fix(cli): init never touches installed skills and no command removes one Oct 24, 2026

@heygengenesis heygengenesis Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE — 0 resolved, 1 open (foreign name → "Unknown skill", non-blocking), 0 new · a65b3c1 → 5ad264a. Re-read the widened scope in full (purge removal, onlyMissing init); tsc clean, 147 tests pass.

@heygengenesis heygengenesis Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE — 0 resolved, 1 open (foreign name → "Unknown skill", non-blocking), 0 new · 5ad264a → 753f0bc. Notice stays stderr-only and off in CI/dev/opt-outs; the self-update notice and auto-install stay --json-gated. tsc clean, 131 tests pass.

@miguel-heygen
miguel-heygen added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit 0d104e6 Oct 24, 2026
117 of 120 checks passed
@miguel-heygen
miguel-heygen deleted the fix/skills-only-own branch October 24, 2026 04:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant