Skip to content

fix(cli): check skill freshness at the install destination - #7120

Merged
jrusso1020 merged 2 commits into
mainfrom
fix/skills-update-install-target
Nov 4, 2026
Merged

jrusso1020 merged 2 commits into
mainfrom
fix/skills-update-install-target

Conversation

@jrusso1020

@jrusso1020 jrusso1020 commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

What

Make skills update populate the complete core set in one run when HyperFrames skills already exist only in another agent's directory.

Why

With three current core skills and a stale reverse-any-video under ~/.cursor/skills, freshness discovery selects Cursor's store, but the installer writes to Claude and the universal store. The first update consequently installs only media-use and the optional workflow; a second update is needed for the other three core skills. A fully populated Cursor store can also make an update incorrectly do nothing while the managed store is absent.

Related work

  • #7023 extends discovery/mirroring for Antigravity. This change preserves automatic discovery for skills check and explicitly selects the write destination for updates.
  • #7094 adds CLI/skills update reporting and a combined update command. This fixes destination selection inside the existing shared skills updater.

How

  • Check freshness and post-install presence in the Claude global store that the installer writes (CLAUDE_CONFIG_DIR is honored). Verify all promised targets after installation, including during offline fallback.
  • Continue refreshing optional skills already in that managed store. Optional skills found only in another agent's directory are left there unless explicitly requested.
  • Respect global lock-file attribution before creating the managed store, including offline, so a same-name skill from another publisher is not installed over and mirrored back onto that publisher's copy.
  • An explicitly requested skill attributed to another publisher fails in strict offline updates, matching the online refusal. Non-strict callers get a warning and the skipped name in the result.
  • Document the destination and optional-skill behavior. The plugin manifests and upstream discovery-count output are unchanged.

Test plan

Fails without the fix: packages/cli/src/commands/skills.installTarget.test.ts — installs the core in one run with only Cursor skills present, then becomes a no-op. On the base source, the first run selects only media-use and reverse-any-video, so the assertion requiring all four core skills fails. The incomplete-install and offline destination regressions also fail on the base source.

  • Nine filesystem regression cases, using real freshness checks and mirroring with a simulated upstream installer: Cursor-only migration plus second-run no-op; managed optional refresh; publisher ownership online/offline; explicit foreign-skill requests offline in strict and non-strict mode; incomplete-install rejection; offline core installation; custom Claude config/global lock scope. The destination-selection tests reproduce the original failure on the base source; the two explicit-request regressions fail at 0f1fb0510 before the review fix.
  • 154 focused tests pass across the skills command, manifest/release-tag, mirror, and update-check suites.
  • Real installer smoke test: built CLI, Node 22, isolated HOME/XDG/npm cache, skills@1.5.13, and current core copies seeded from v0.9.9. First run installed all four core skills, the second run installed nothing, and the stale Cursor-only optional skill remained untouched.
  • Full workspace build, rebuilt CLI, CLI typecheck, oxlint, and oxfmt checks pass.
  • Documentation updated.
  • New test is reachable through the existing CLI test runner.

@mintlify

mintlify Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

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

Project Status Preview Updated
hyperframes 🟢 Ready View Preview Nov 4, 2026, 1:29 AM

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

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Edit accuracy: accurate 267 (base branch 267), smooth 115 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 (8)

@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 · 0 important · 1 nit · head 0f1fb05

The new suite fails 4/7 against base source and passes at head; focused skills tests 135/135 locally; all Actions runs for this head are green.

Scope

Audited: skills.ts (updateSkills / verifyInstalled / offline path), skillsManifest.ts (globalInstallRoot, checkSkills foreign rule, foreignSkillNames), the new test, docs. globalInstallRoot resolves CLAUDE_CONFIG_DIR the same way as skillsMirror.resolveBases and the upstream claude-code dir that --global --agent claude-code writes to, and hardcodes global scope, so the lock read stays correct when run from $HOME. Treating lock-foreign names as foreign even when absent from the store is right: the installer also writes ~/.agents/skills and the shared global lock, so installing would overwrite the other publisher's copy. Convergence with skills check / the nudge (still locateInstall): after one update, the Claude store holds the core and wins discovery, so both read the same root.

Comment thread packages/cli/src/commands/skills.ts Resolved

@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 — 1 resolved, 0 open, 0 new · 0f1fb05 → a16a435. The offline nit is fixed: both new cases fail on the prior source and pass here, and CI is green.

@jrusso1020
jrusso1020 added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit b02fe65 Nov 4, 2026
86 checks passed
@jrusso1020
jrusso1020 deleted the fix/skills-update-install-target branch November 4, 2026 02:03
@miguel-heygen miguel-heygen mentioned this pull request Nov 4, 2026
1 task done
Vitozhu04 added a commit that referenced this pull request Nov 4, 2026
… update

Single commit of #7094 on top of main (no merge commits through the signed
GraphQL path). Includes: 2h update/skills check interval and stale-cache
recheck; `_meta.checkedAt`, `_meta.skillsOutdated`, `_meta.skillsMissing`;
`_meta.updateNotice`, one sentence for the agent to relay to the person, at
most once a day per project (brew/npx-aware command, omitted under CI, the
update-check opt-out and agent plugins); `hyperframes update [--check]
[--yes] [--json]` (CLI then skills at the installed CLI's tag; brew
version read back); doctor names the running binary and its channel; the
hyperframes-cli skill gets one line to pass the notice on, naming no
command. Keeps main's install-target skills check (#7120) in updateSkills.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
samaeldemiurgos2-cyber pushed a commit to samaeldemiurgos2-cyber/hyperframes that referenced this pull request Nov 4, 2026
… update --check (heygen-com#7094)

* feat(cli): surface outdated CLI and skills to agents; add hyperframes update

Single commit of heygen-com#7094 on top of main (no merge commits through the signed
GraphQL path). Includes: 2h update/skills check interval and stale-cache
recheck; `_meta.checkedAt`, `_meta.skillsOutdated`, `_meta.skillsMissing`;
`_meta.updateNotice`, one sentence for the agent to relay to the person, at
most once a day per project (brew/npx-aware command, omitted under CI, the
update-check opt-out and agent plugins); `hyperframes update [--check]
[--yes] [--json]` (CLI then skills at the installed CLI's tag; brew
version read back); doctor names the running binary and its channel; the
hyperframes-cli skill gets one line to pass the notice on, naming no
command. Keeps main's install-target skills check (heygen-com#7120) in updateSkills.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(cli): update notice names a command that moves this install

- `_meta.updateNotice` (and `update --check`'s skills command) now name a
  command that moves the running install: a global npm/pnpm/bun/brew CLI
  runs its own `hyperframes update` (or just its manager's command when
  only the CLI is behind), since `npx hyperframes` would run a project's
  copy or a fresh npx one; a project-local CLI moves with its project's
  manager by lockfile (`npm install`/`pnpm add`/`bun add`/`yarn add
  hyperframes@<v>`), which `update --yes` now names too instead of
  `npx hyperframes@latest`.
- `update`'s confirmation hint states a fact and names no step for the
  agent: "Updating is the person's call; `update --check` only reports."
- `upgrade --json`, `upgrade --project --json` and every `skills` JSON
  output leave out `_meta.updateNotice` (NO_UPDATE_NOTICE), like `update`.
- dailyNotice: a null/non-object file reads as empty and is repaired; a
  future timestamp is stale; writes go through a 0600 tmp file + rename;
  withMeta never throws from the notice.
- Docs: --json without --yes exits 2; plugin `update` exits 1
  (plugin_managed); full `_meta` sample; per-install notice commands.
  `update --check` says "npm registry not reached" instead of "latest".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
staging - docs — a16a435d Deployed Nov 4, 2026 by mintlify[bot]
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