update-coding-agent-skills
Skill2 starsChanged 18 days agoMITView on GitHub
Fast-forward the coding-agent-skills clone these skills were deployed from to origin/main, then redeploy every skill: at the latest release on origin/main by default, or at main on the main channel. Stops before a release that raises the major version until the user passes --cross-major, and over a deployment the user pinned with deploy.py --at until the user passes --unpin.
In this repository30 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- audit-repositorySkill
- change-skillSkill
- evaluate-skillSkill
- implement-changeSkill
- review-repositorySkill
- runtime-canarySkill
- shepherd-pull-requestsSkill
- audit-repositorySkill
- change-skillSkill
- evaluate-skillSkill
- implement-changeSkill
- review-repositorySkill
- runtime-canarySkill
- shepherd-pull-requestsSkill
- audit-ai-configSkill
- audit-skillSkill
- curate-agent-memorySkill
- dotnet-dependenciesSkill
- dotnet-formatSkill
- ejryan89-code-review-coreSkill
- ejryan89-skill-coreSkill
- flag-review-findingSkill
- github-activity-reportSkill
- repo-cleanupSkill
- review-documentSkill
- review-insightsSkill
- review-prsSkill
- update-pr-dashboardSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 30
After any status, an UNLISTED <range> <reason> line stands in place of a list of commits Git could not read: quote it, and never report …
- Very specific: line 33
Never stash, rebase, reset, or force anything to work around a stop, and never rerun the deployer with --force or --force-item.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Update the clone at {{SOURCE_ROOT}} and redeploy it. Fixes land on main and reach users at the next release tag, so by default the update follows releases: the release channel deploys the highest release tag on origin/main, a release marked as a pre-release included, with deploy.py --at refs/tags/<tag>, which pins the installation there until a later release. The main channel, which the user opts into with UPDATE_CHANNEL=main in the deployer's configure command or for one run with --channel main, deploys main itself. Either way the clone is fast-forwarded to origin/main and stays on main. Run the update script once, without piping it, through the Bash tool when there is one (in PowerShell, bash can be WSL's rather than Git Bash), and report what it printed. Pass after the configured channel each of --channel <release or main>, --cross-major, and --unpin that the user started the skill with, and nothing else.
bash "${CLAUDE_SKILL_DIR}/scripts/update.sh" "{{SOURCE_ROOT}}" "{{UPDATE_CHANNEL}}"In a clone that guards its hub with git config coding-agent-skills.hubGuard true, Claude Code's hub guard refuses this command in a session started in the clone or one of its worktrees, since the script runs git in the clone. Never rewrite the command to get past the guard. Tell the user the update runs outside such a session: from a session started in a folder outside the clone, which loads none of the clone's hooks, or from a terminal, running the command above with ${CLAUDE_SKILL_DIR} written out as this skill's folder. In PowerShell bash may be missing or WSL's, so name Git Bash by its path, & "$env:ProgramFiles\Git\bin\bash.exe" where Git for Windows is installed by default.
The first line of output is the status; act on it, not on the exit code:
UP_TO_DATE <tag>orUPDATED <old>..<tag>, on the release channel: the installation was at, or is moved from the deployed commit<old>(unknownwhendeploy.py checknamed none) to, the release<tag>.UPDATEDis followed by the commits the release adds, and byNOT_IN_RELEASE <tag>..<old>and the deployed commits the release does not carry, as when the installation had followedmainpast the release; say that those changes leave the installation until a release carries them, or until the user opts intomain.<old>is alsounknownwhen the clone no longer holds the commit check named, which aNOT_IN_CLONE <commit>line right afterUPDATEDnames: the commits listed are then those the release adds to localmain, and whether the release drops changes the installation had cannot be told, so say so and name the commit.UP_TO_DATE <sha>orUPDATED <old>..<new>, on the main channel: localmainwas at, or is fast-forwarded to,origin/main, andUPDATEDis followed by the pulled commits.- After either:
CROSSED <current>..<target>when--cross-majoraccepted a release boundary, then the deployer's output, ending inDEPLOYED,DEPLOY_FAILED <code>, orDEPLOY_PINNED <ref> <commit>. A clone found on another branch was switched tomainand stays there. Report the range, the listed commits, the crossing if any, and the deployer's summary of updated, unchanged, skipped, and removed skills. If the deployer printedReplaced the deployment pinned with --at <ref> ..., quote that line. OnDEPLOY_FAILED, quote the deployer's error. DEPLOY_PINNED <ref> <commit>, last afterUP_TO_DATEorUPDATED: the user pinned the installation withdeploy.py --at <ref>at<commit>, thoughdeploy.py checkdid not name the pin, and the deployer refused to replace it without--unpin. The clone is onmainatorigin/main, but nothing was deployed. Report the range, the ref, and the commit, and say that rerunning the skill with--unpinupdates past the pin, and that until then the installation stays at the pinned commit. Do not rerun it yourself.MAJOR_UPDATE <current>..<target>: the highest release onorigin/mainraises the major version above the installed one (or the minor version, while the major is 0). The installed version is the release of the commitdeploy.py checknames as deployed;<current>isuntaggedwhen no release tag reaches that commit, which counts as version 0.0.0, andunknownwhen check names no deployed commit, or names one the clone no longer holds, which aNOT_IN_CLONE <commit>line right after the status names, and which any release stops. The listed commits are what the update would deploy, up to the release on the release channel. The update may ask the user to act, as the release notes say. Nothing was merged or deployed. Report both versions and the commits, point the user at the release notes for<target>on the repository's releases page, and say that rerunning the skill with--cross-majorapplies it. Do not rerun it yourself.PINNED <ref> <commit>: the user pinned the installation withdeploy.py --at <ref>at<commit>, and the update would replace it: on the main channel withmain, before anything was fetched, and on the release channel with a release at another commit, after the fetch. Nothing was merged or deployed. Report the ref and the commit, and say that rerunning the skill with--unpinupdates past the pin, and that until then the installation stays at the pinned commit. Do not rerun it yourself.NO_RELEASE, on the release channel: no release tag reachesorigin/main, so there is no release to deploy. The clone was fetched; nothing was merged or deployed. Report it, say that--channel maindeploysmainfor one run, and stop.DIRTY: tracked files have uncommitted changes, listed below it. Nothing was fetched. Report the files and stop.TAG_SHADOWS_BRANCH: a tag namedmainororigin/main, listed below it ason originorin the clone, would stand in for that branch. Nothing was fetched, merged, or deployed. Report the tags and stop; removing one is the user's decision.FETCH_FAILED,CHECKOUT_FAILED, orNOT_FAST_FORWARD: nothing was merged or deployed, and the clone is on the branch it was found on. Report what follows the status and stop. The update's calls tooriginshow no prompt, start no askpass helper, and end within a time limit, so whenFETCH_FAILEDnames a credential git could not read, say that the user signs in by runninggit fetchin the clone themselves, then reruns the skill.NOT_FAST_FORWARDlists the commits localmainhas thatorigin/mainlacks, or quotes Git's refusal; astill on main:line below it means the clone could not be switched back, so report that too.FAILED <reason>: the clone path holds nodeploy.pyor is not a Git repository, noejryan89-skill-coreis deployed beside this skill,deploy.py checkprinted nothing, printed only its error, or named the deployed commit or the pin in a form the update cannot read (cannot read whether the installation is pinned), a Git lookup or comparison failed rather than answering, with Git's own reason, or another step failed outright. It comes before the switch tomain: nothing was merged or deployed, and the clone is on the branch it was found on. Report the reason and stop; neither--unpinnor--cross-majorgets past a pin the update cannot read.- After any status, an
UNLISTED <range> <reason>line stands in place of a list of commits Git could not read: quote it, and never report that range as holding no commits. - A usage error (exit 2) prints only on stderr: report it and stop.
Never stash, rebase, reset, or force anything to work around a stop, and never rerun the deployer with --force or --force-item; those decisions are the user's.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

