groove-admin-update
Outcome
All pending migrations are applied to the user's local groove state in version order. .groove/index.md reflects the current installed groove version.
Acceptance Criteria
groove-version:in.groove/index.mdmatchesversion:inskills/groove/SKILL.mdafter update- Each pending migration was applied in order
groove-version:updated after each successful migration (partial progress is recoverable)- If already up to date, reports clearly and exits
- Source-of-truth check: "up to date" is only reported when the installed skill version equals the latest GitHub release; if the add step left an older version on disk (e.g. cached or default branch), the user is warned and told how to fix it
Steps
- Fetch latest release tag from
https://api.github.com/repos/andreadellacorte/groove/releases/latest(tag_name, strip leadingv). This is the target version. If the API call fails, skip the version check and continue without a target. - Install with retry: Run
npx skills add andreadellacorte/groove --yes(no@tag— the CLI does not support tag syntax). After it completes, readversion:fromskills/groove/SKILL.mdand compare to the target. If the installed version is still older than the target, wait 10 seconds and retrynpx skills add andreadellacorte/groove --yes. Repeat up to 3 times total. If all attempts fail to install the target version, report: "Installed v<installed> but latest release is v<target> —npx skills addmay be caching an older version. Try again later." and exit.- After a successful install, re-read this SKILL.md (
skills/groove-admin-update/SKILL.md) from disk before continuing — the skill refresh may have updated the update command itself, and the remainder of these steps must reflect the latest version
- After a successful install, re-read this SKILL.md (
- Read
groove-version:from.groove/index.md— if key absent, assume0.1.0and write it - Read installed version from
version:inskills/groove/SKILL.md(already confirmed to match target in step 2) - If local and installed versions match: report "groove is up to date (v<version>)" and exit
- Read
skills/groove/migrations/index.md— parse the migration table - Filter rows where
To> local version ANDTo<= installed version, in table order — theFromfield is informational only and does not gate execution - If no migrations found but versions differ: update
groove-version:in.groove/index.mddirectly to the installed version and report "no state migrations needed — version bumped to v<version>" - For each pending migration:
a. Report "Applying <from> → <to>: <description>"
b. Read and execute the migration file
c. Update
groove-version:in.groove/index.mdto theToversion d. Report "✓ <from> → <to> applied" - Report summary: N migrations applied, now at v<version>
- Re-sync platform symlinks after update:
- For each directory in
.agents/skills/that starts withgroove:- Ensure
.claude/skills/<name>is a symlink →../../.agents/skills/<name>(create or update if stale) - Ensure
.cursor/skills/<name>is a symlink →../../.agents/skills/<name>if.cursor/skills/exists
- Ensure
- Remove any
.claude/skills/groove-*or.cursor/skills/groove-*entries that no longer exist in.agents/skills/(stale symlinks from removed skills) - Run:
for skill in .agents/skills/groove*; do name=$(basename "$skill"); ln -sfn "../../.agents/skills/$name" ".claude/skills/$name"; done - Use
ln -sfn(no-dereference) to avoid creating nested symlinks inside existing directory symlinks - Report: "✓ platform symlinks refreshed"
- For each directory in
Constraints
- Source of truth for "latest" is GitHub releases —
npx skills addcan cache older versions. Step 1-2 fetches the latest release tag and retries installation up to 3 times to ensure the correct version is installed. - Never skip a migration — apply every matching migration in table order even if
Fromdoes not match local version exactly - Update
groove-version:after each individual migration, not only at the end - If a migration fails: stop, report the failure and current version, do not continue
- Do not modify skill files —
npx skills updatehandles that; this command only migrates local state - Local state includes:
.groove/index.mdconfig keys, memory directory structure, AGENTS.md sections - Each migration file is idempotent — if re-run after partial failure, it should be safe