| name | skills-cli-sync |
|---|---|
| description | Sync skills-desktop's AGENT_DEFINITIONS and UNIVERSAL_AGENT_IDS with the upstream vercel-labs/skills CLI, then update docs and validate. Use when bumping SKILLS_CLI_VERSION, mirroring a new upstream skills-CLI release, or when the agent list / universal set drifts from upstream agents.ts. |
This app mirrors the agent list of the upstream vercel-labs/skills
CLI. When upstream ships a release, AGENT_DEFINITIONS, UNIVERSAL_AGENT_IDS,
and SKILLS_CLI_VERSION in src/shared/constants.ts must be re-synced, the
docs refreshed, and the gates re-run. This skill encodes that procedure.
The steps below are invariant — they hold for any version bump. Concrete counts and agent names belong only to the "Latest run" section at the bottom; never bake a count into a step.
- Upstream:
src/agents.ts(agent list) andsrc/types.ts(theAgentshape + home-dir helpers) invercel-labs/skills. - This app: the JSDoc on
AGENT_DEFINITIONS,UNIVERSAL_AGENT_IDS, andSKILLS_CLI_VERSIONinsrc/shared/constants.tsis authoritative — read it before editing.CLAUDE.md→ Domain Concepts → Skills CLI lists the same pointers. Don't duplicate those rules here; this skill is the procedure.
Tags are v-prefixed (v1.5.10; bare 1.5.10 404s). Fetch the two source
files at the version you're syncing to — reproducible on any machine:
NEW=1.5.11 # the upstream version you are syncing to
BASE="https://raw.githubusercontent.com/vercel-labs/skills/v${NEW}"
curl -fsSL "$BASE/src/agents.ts" -o /tmp/agents.ts
curl -fsSL "$BASE/src/types.ts" -o /tmp/types.tsUse …/main/… instead of v${NEW} to preview the latest unreleased list.
- Join on the upstream
name:field — it equals the--agentflag value and this app'scliId. NotdisplayName. Display names can match while ids diverge (the kimi trap). name:keys can be quoted / hyphenated ('kimi-code-cli','kiro-cli'). A naive^\s+\w+: {regex misses them — extract withgrep "name: '".globalSkillsDir/skillsDirare usually computed from home-dir helper constants at the top ofagents.ts(e.g.configHome=~/.config,codexHome=~/.codex,claudeHome=~/.claude, plus per-vendor homes). Resolve each to a concrete~/…-relative path before deriving anything.
grep -nE "name: '" /tmp/agents.ts # the upstream agent identifiers (= cliId)For each upstream agent read: name, displayName, globalSkillsDir,
skillsDir, showInUniversalList. Then diff the upstream name: set against
the current cliId set in AGENT_DEFINITIONS to find additions, removals,
and cliId renames.
Rule A — installDir / scanDir (from globalSkillsDir):
installDir= the parent ofglobalSkillsDir, home-relative.scanDir=installDir, except whenglobalSkillsDirresolves to the universal source~/.agents/skills→scanDirdiverges to.<name>. This is the v0.13.0 guard: ifscanDiraliased the source, the scanner would surface every shared source skill as that agent's own "valid local skill".
Rule B — UNIVERSAL_AGENT_IDS (from skillsDir):
- An id belongs iff
skillsDir === '.agents/skills' && showInUniversalList !== false. - Note it keys off
skillsDir, notglobalSkillsDir. An agent can be universal (reads~/.agents/skills) yet keep its ownglobalSkillsDir(so noscanDiroverride) — that's the canonical proof the two rules are independent. Don't assume "universal ⇒ scanDir diverges" or vice-versa.
Skip an upstream agent when:
globalSkillsDir: undefined— it can't be represented as an install path.- It's a
showInUniversalList: falsepseudo-agent (a non-real aggregate entry). - Its
globalSkillsDircollides with another agent's dir → ascanDirclash that would double-count the shared directory.
showInUniversalList: false also excludes an otherwise-eligible agent from
UNIVERSAL_AGENT_IDS.
- Add / modify
AGENT_DEFINITIONSentries (id,cliId,name,installDir,scanDir). Every field is required — no silent fallback. - Keep the internal
idstable when onlycliIdchanges.idis the Redux/checkbox state key; changing it drops persisted user state. (kimi keptid: 'kimi-cli'whilecliIdbecamekimi-code-cli.) - Display-name-only rebrand: change
nameonly; leaveid/cliId/installDir/scanDir. Then grep the renderer for the old display name and update any UI example/doc that hard-codes it (e.g. aStatusBadgeJSDoc@example). - Update
UNIVERSAL_AGENT_IDSper Phase 3 Rule B. - Bump
SKILLS_CLI_VERSION. - Do not hand-edit derived values.
AgentId/AGENT_IDS(z.enum) /AgentName/AGENT_ID_TO_CLI_NAME/SHARED_AGENT_PATHSall derive fromAGENT_DEFINITIONSautomatically. - The app's only CLI surface is
find+add(skillsCliService). New upstream commands (run/prompt/sync/ …) need no app change.
- CLAUDE.md —
SKILLS_CLI_VERSIONin the Domain Concepts → Skills CLI table. - README.md — the "N AI Agents Supported" count, any renamed display name, and the "…and X more" tail.
- SPEC.md — the agent table (add new rows, fix renames), every agent-count
mention, then reflow:
npx prettier --write SPEC.md(a wider newcliIdcan re-pad the whole table — that diff is expected, not churn).
node .claude/skills/skills-cli-sync/reconcile-agents.mjs # constants ↔ SPEC drift gate
npx prettier --check README.md SPEC.md CLAUDE.md
pnpm validate # lint + test + typecheck + dead-code
pnpm test:e2e # only after validate is greenreconcile-agents.mjs (shipped beside this file) asserts every
AGENT_DEFINITIONS entry has a matching SPEC row on (cliId, detection-path)
and that no SPEC row references a removed cliId. It exits non-zero on drift,
so it doubles as a CI / pre-PR gate.
Also confirm no stale references survive:
git grep -nE "<OLD_VERSION>" -- '*.md' '*.ts' # e.g. 1\.5\.9 — should be only intentional history
git grep -n "<old display name>" -- '*.ts' '*.tsx'One focused commit, e.g. chore: sync skills CLI agent definitions to <NEW>.
Summarize in the body: agents added/removed, any id/cliId migrations,
display-name rebrands, the UNIVERSAL_AGENT_IDS delta, and the version bump.
Do not bump package.json version — releases are owned solely by
/electron-release.
2026-06-24 · v1.5.11 → v1.5.13 (version pin + excluded upstream agent)
- No app agent-list change: upstream
name:set is 72 and appcliIdset stays 68. The only upstream addition since v1.5.11 that is not already mirrored iseve, which hasglobalSkillsDir: undefined, so Phase 4 excludes it. App orphans remained zero. - Unchanged derived sets:
AGENT_DEFINITIONSstayed 68,UNIVERSAL_AGENT_IDSstayed 16, with noid/cliIdmigrations and no display-name rebrands. - Excluded at this version:
eveandpromptscript(globalSkillsDir: undefined),universal(showInUniversalList: false),zenflow(dir collides with zencoder's~/.zencoder/skills). - Edits: bumped
SKILLS_CLI_VERSION1.5.11 → 1.5.13; bumped the e2e pin (marketplace-install-regression.e2e.tsliteralskills@1.5.13 add …+ comment); bumped the CLAUDE.md/AGENTS.md Domain-Concepts pinned-version cell; ignored local.agents/**in ESLint so repo-local skill copies do not breakpnpm validate. - Gates:
reconcile-agents.mjsclean, prettier clean,pnpm validategreen,pnpm test:e2egreen (60 tests).
2026-06-14 · v1.5.10 → v1.5.11 (version-only bump)
- No agent-list change:
src/agents.tsis byte-identical between v1.5.10 and v1.5.11 (diffclean), soAGENT_DEFINITIONS,UNIVERSAL_AGENT_IDS, and every doc agent-count stayed put. Drift gate confirmed: upstreamname:set (71) minus appcliIdset (68) = exactly the 3 standing exclusions below; zero app orphans. - Edits: bumped
SKILLS_CLI_VERSION1.5.10 → 1.5.11; bumped the e2e pin (marketplace-install-regression.e2e.tsliteralskills@1.5.11 add …+ comment); bumped the CLAUDE.md Domain-Concepts pinned-version cell. - Unchanged history kept verbatim: the "CLI 1.5.10" / "added in v1.5.10"
comments in
constants.tsand the*.test.tsfiles are accurate history of when kimi migrated / agents landed — not bumped. - Excluded at this version (still valid, agents.ts unchanged):
promptscript(globalSkillsDir: undefined),universal(showInUniversalList: false),zenflow(dir collides with zencoder's~/.zencoder/skills). - Gates:
reconcile-agents.mjsclean, prettier clean,pnpm validate+pnpm test:e2egreen.
2026-06-05 · v1.5.5 → v1.5.10 (PR #204, commit 41b455e)
- +14 community agents: antigravity-cli, astrbot, autohand-code, inference.sh, jazz, lingma, loaf, moxby, ona, qoder-cn, reasonix, terramind, tinycloud, zed.
- kimi migration:
cliIdkimi-cli → kimi-code-cli;installDir.config/agents → .agents;scanDir→ .kimi. Internalidkeptkimi-cli(state preservation). - Windsurf → Devin Desktop: display name only; the
.codeium/windsurfinstall/scan path is unchanged (upstream CLI was not renamed). - Counts:
AGENT_DEFINITIONS54 → 68;UNIVERSAL_AGENT_IDS13 → 16 (+antigravity-cli, loaf, zed). scanDir-divergent at this version (Rule A exceptions): cline, dexto, kimi-code-cli, loaf, warp, zed.- Excluded at this version:
promptscript(globalSkillsDir: undefined),universal(showInUniversalList: false),zenflow(dir collides with zencoder's~/.zencoder/skills). - Gates:
pnpm validate(1376 tests) +pnpm test:e2e(55 tests) green.