Conversation
sync adopted every undeclared directory under the skills directory. A hidden directory such as .trash/ was written to agents.toml with a name the config schema rejects, so every later command, including doctor, failed with 'Invalid config'. Directories without a SKILL.md, such as Claude Code's synced/ after ~/.claude/skills/ is migrated, were adopted as skills. Adopt a directory only when its name is a valid skill name and it contains a SKILL.md. Pruning of stale managed skills is unchanged. If a directory adopted earlier loses its SKILL.md and its agents.toml entry, drop its in-place agents.lock entry too, so .agents/.gitignore stops hiding its files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…synced skills At global scope ~/.claude/skills/ was a link to ~/.agents/skills/, so Claude Code wrote the skills it syncs from claude.ai (synced/, .trash/, .staging/) into the shared directory, where Codex and OpenCode loaded them as ordinary skills. Keep ~/.claude/skills/ a real directory for Claude Code and Cursor at global scope and link each shared skill into it. An existing directory link is converted by building the new directory next to it and swapping it in; client-owned entries move back, and a duplicate the client already recreated is set aside under ~/.agents/.client-owned-backup/. sync and init share skills created in ~/.claude/skills/, and sync declares them; install and doctor --fix only link. Names declared in agents.toml or recorded in agents.lock are never moved, and sync drops a synced declaration an earlier version wrote. Entries are only renamed, so on different file systems the command stops before moving anything. init, install, sync, and doctor report conflicts and set-aside entries, and remove unlinks removed skills. Project scope keeps the directory link. The bundled dotagents skill now tells agents to create new skills in the shared directory and link them for Claude Code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@m-naoki-m is attempting to deploy a commit to the Sentry Team on Vercel. A member of the Team first needs to authorize it. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit f1a8d5e. Configure here.
A skill a wildcard source expanded into agents.lock has no agents.toml entry of its own name, so a name clash with a Claude Code skill was described as a stale record that install would clear. Check against the declared names, which include wildcard-expanded skills. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
i think i may be missing the point here, dotagents is meant to unify this layer, and treating claude skills as sort of isolated entities defeats a lot of the prupose. i'm gonna close this one, but if you wanna reopen with more context/chat more lmk |
|
Thanks for taking a look. I should have explained the motivation better in the description. The goal was to keep the shared layer, not to split Claude off from it. The problem is what Claude Code writes into In this PR every skill in I understand if per-skill links are not the right shape for dotagents. Do you see the claude.ai skills showing up in other agents as something worth fixing? If so, I'd be glad to rework it in a way that fits the project better. If it's expected behavior, I'm happy to close #193 as well. |

Closes #193. Builds on #194, which this branch includes; the diff to review is the last commit once #194 is merged.
At global scope
~/.claude/skills/is a link to~/.agents/skills/, so Claude Code downloads the skills enabled on claude.ai (synced/,.trash/,.staging/) into the shared directory, and Codex and OpenCode load them as ordinary skills. This keeps~/.claude/skills/a real directory at global scope, for Claude Code and Cursor, and links each shared skill into it.Changes
init,install, andsynclink every skill in~/.agents/skills/, including projected plugin skills, as~/.claude/skills/<name>. Links whose skill is gone or lost itsSKILL.mdare removed, andremoveunlinks right away, also for plugins and wildcard exclusions.synced/,.trash/, and.staging/move back to~/.claude/skills/. Entries are only renamed, as in the existing migration, so on different file systems the command stops before moving anything. The new directory is built next to the link and swapped in once it is ready, and the next run finishes a conversion that was interrupted. If Claude Code already recreated one of those entries, the copy in the shared directory moves to~/.agents/.client-owned-backup/, andinit,install,sync, anddoctor --fixprint where. A~/.claude/skillslink that points elsewhere, or cannot be resolved and does not name the shared directory, stops the command.syncandinitmove a skill directory created in~/.claude/skills/into~/.agents/skills/and link it back;syncalso declares it.installanddoctor --fixdo not editagents.toml, so they only link. Names thatagents.tomldeclares oragents.lockrecords are never moved in either direction; those cases, and names present on both sides, are reported byinstall,sync, anddoctor.doctorreports a directory link and missing or stale links, whichdoctor --fixrepairs. Skills not shared yet (runsync) and conflicts that need a decision are separate checks without a fix.dotagentsskill tells agents to create new skills in~/.agents/skills/and link them for Claude Code.specs/SPEC.md,README.md,docs/public/llms.txt, and the skill's configuration reference describe the global layout.Project scope keeps the directory link.
Verification
pnpm checkon Node 20 and 26: lint, typecheck, and tests pass (lib 295, host 887). New tests cover conversion from a directory link, recovery after an interrupted conversion, sharing client-created skills, managed-name and client-owned-name conflicts, unresolvable links, plugin skills, pruning,remove, theinstallwarnings, a declaration ofsyncedwritten by an earliersync, and recovering from a failed or interrupted conversion. Each fix from review was checked against a test that fails without it.pnpm build, CLI--help, packing both packages,scripts/verify-pack.mjs) pass on Node 20, and the docs build passes on Node 22.dotagents-qaDocker image:pnpm checkandpnpm qa:examplepass. A global fixture with a directory link and asynced/inside the shared directory converts onsync; a skill created in~/.claude/skills/is shared and declared;install,remove,doctor, anddoctor --fixbehave as described;initon a home that already has~/.claude/skills/synced/keeps it in place. Claude Code, Codex, and OpenCode in the image load the shared skills.pnpm qa:pluginsfails at the Copilot proof onmainas well.syncconverted the directory link, Claude Code loaded the 31 shared skills and the 12 claude.ai skills and kept refreshing~/.claude/skills/synced/, and Codex no longer listed the claude.ai skills. OpenCode still lists them, because it reads~/.claude/skills/itself.