Skip to content

skills_install.py's clean-tree preflight is unscoped, and its output conflates two states into one line #947

Description

@ptr727

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions