Two related gaps found running the merge-and-release hub Skills refresh on main at 30b93226 (2026-08-23), the second reproduced independently by the maintainer running the installer himself.
1. The clean-tree preflight is unscoped
merge-and-release/SKILL.md's step 7 (from #940) added a preflight before the local main refresh: git status --porcelain --untracked-files=all --ignored, stop and report rather than proceed if it's non-empty, since skills_install.py's materialize_global_skills() uses shutil.copytree() with no ignore filter, so a stray gitignored file inside a skill's source directory would ride into the install.
Run for real, it flagged unrelated ignored content anywhere in the whole repository, .mypy_cache/, a .claude/scheduled_tasks.lock file, neither of which has anything to do with .agents/skills/. The check as written blocks the refresh on any host carrying ordinary build caches or lockfiles, which is most hosts most of the time, not just the narrow case (a stray file inside .agents/skills/<name>/) it was meant to catch.
Scoping the same check to the path it actually cares about fixes it: git status --porcelain --untracked-files=all --ignored -- .agents/skills/, confirmed clean on this host when the unscoped form was not.
2. The install summary line conflates two independent facts
scripts/skills_install.py (around line 285) prints one combined sentence:
print(
f"Installed to {home / 'skills'}. Claude Code marketplace registered: {claude_registered}."
)
Whether the global skills directory got materialized and whether Claude Code's marketplace got registered are two separate operations (materialize_global_skills() and register_claude_marketplace()), each already independently guarded and independently able to fail or be skipped (claude not on PATH skips only the registration, not the materialize step). The maintainer would like them reported as two separate output lines rather than folded into one, anticipating that Codex and opencode may eventually carry their own distinct install states too, at which point a single combined sentence stops being able to say which of several targets actually updated.
Ask
- Scope the clean-tree preflight in
merge-and-release/SKILL.md (all three carried copies) to .agents/skills/.
- Split
skills_install.py's final summary into one line per install target's own outcome (skills materialized, Claude Code marketplace registered, and room for Codex/opencode's own lines later), rather than one combined sentence.
Two related gaps found running the merge-and-release hub Skills refresh on
mainat30b93226(2026-08-23), the second reproduced independently by the maintainer running the installer himself.1. The clean-tree preflight is unscoped
merge-and-release/SKILL.md's step 7 (from #940) added a preflight before the localmainrefresh:git status --porcelain --untracked-files=all --ignored, stop and report rather than proceed if it's non-empty, sinceskills_install.py'smaterialize_global_skills()usesshutil.copytree()with no ignore filter, so a stray gitignored file inside a skill's source directory would ride into the install.Run for real, it flagged unrelated ignored content anywhere in the whole repository,
.mypy_cache/, a.claude/scheduled_tasks.lockfile, neither of which has anything to do with.agents/skills/. The check as written blocks the refresh on any host carrying ordinary build caches or lockfiles, which is most hosts most of the time, not just the narrow case (a stray file inside.agents/skills/<name>/) it was meant to catch.Scoping the same check to the path it actually cares about fixes it:
git status --porcelain --untracked-files=all --ignored -- .agents/skills/, confirmed clean on this host when the unscoped form was not.2. The install summary line conflates two independent facts
scripts/skills_install.py(around line 285) prints one combined sentence:Whether the global skills directory got materialized and whether Claude Code's marketplace got registered are two separate operations (
materialize_global_skills()andregister_claude_marketplace()), each already independently guarded and independently able to fail or be skipped (claudenot onPATHskips only the registration, not the materialize step). The maintainer would like them reported as two separate output lines rather than folded into one, anticipating that Codex and opencode may eventually carry their own distinct install states too, at which point a single combined sentence stops being able to say which of several targets actually updated.Ask
merge-and-release/SKILL.md(all three carried copies) to.agents/skills/.skills_install.py's final summary into one line per install target's own outcome (skills materialized, Claude Code marketplace registered, and room for Codex/opencode's own lines later), rather than one combined sentence.