Files
Anton Novoselov 349dc4365b feat(skill): default generated skills to ~/.agents/skills with Claude Code symlink (#125)
* feat(skill): default generated skills to ~/.agents/skills with Claude Code symlink

Personal (user-level) installs of generated book skills now land in the
cross-agent root ~/.agents/skills/<slug>/ for every host, so one copy
serves Copilot CLI, Amp, and Claude Code. Claude Code does not scan that
root, so Step 10 creates a symlink at ~/.claude/skills/<slug> pointing
to the generated skill. Host-private and project-local destinations stay
available on explicit request, and a pre-existing real directory at
~/.claude/skills/<slug> triggers a migration offer instead of a silent
replace.

* fix(skill): guard the Claude Code symlink and scope discovery claims

Skip symlink creation when a real directory remains at
~/.claude/skills/<skill_name> (ln -sfn would nest the link inside it and
Claude Code would keep loading the stale copy), report discovery only
for the destination actually used, use <skill_name> consistently for
the skill folder placeholder, and clarify in README and how-it-works
that the symlink is created when running under Claude Code.

* docs: state the Claude Code symlink as attempted-and-verified, not a fact

Align README and the how-it-works pipeline diagram with Step 10's
read-back rule: the symlink is attempted and verified, and the run
report states the actual result.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(skill): keep Hermes Agent on its own personal root under the new default

Hermes Agent landed after this branch was opened. Its personal root is
partitioned by category ($HERMES_HOME/skills/<category>) and it does not
scan the cross-agent root, so it is the one host the collapse cannot serve
from ~/.agents/skills.

Carry it forward rather than regress it: the Step 5 table keeps the Hermes
row, a personal Hermes install uses that root and takes no symlink, and the
"Discoverable by" line names Hermes alone for it - no cross-agent claim,
since no other host scans the Hermes root. The intro sentence no longer
says one copy serves every host, because with Hermes carved out that is
not true. README and the pipeline diagram say the same.

* fix(skill): name the relocation target as the final skill directory

`mv <src> <dest>` was grammatical under both readings and only one worked.
With <dest> read as a root, the printed line breaks the symlink the run had
just created: the skill lands at <root>/<skill_name> while `ln -sfn <root>`
points one level up, so Claude Code resolves to a directory with no
SKILL.md.

The placeholder is now <dest_root>/<skill_name>, so the move target names
the final skill directory and there is one reading left. The fill rule says
so explicitly, shows the broken form, and requires the resolved paths be
substituted rather than the placeholders printed.

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-09-11 21:40:03 -04:00
..