update-skills
Skill4 starsChanged 11 days agoMITView on GitHub
Manage skill repo updates, symlink health, and installation. Fetches from multiple remotes with version safety, creates symlinks for new skills, audits symlink state.
19 other projects use a version of this.
Adopted by
Most recently taken up by
- Trixx4191/asrartheir own version, first seen Nov 15, 2026
- nanocoai/nanoclawtheir own version, first seen Nov 15, 2026
- IndusCore-AI/connect-anythingtheir own version, first seen Nov 8, 2026
- ss2code/nanoclaw-opstheir own version, first seen Oct 15, 2026
- microsoft/vscodetheir own version, first seen Oct 13, 2026
- prathish-ks/isthmustheir own version, first seen Oct 12, 2026
Used with
Projects with it also use add-anydoc, add-clidash and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
TomGranotSkilladd-anydoc
Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when agents need to read attached Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV, or text-based PDF files without uploading them to a hosted parser.
Also in 5 projects that use this
TomGranotSkilladd-clidash
Add clidash — a zero-dependency, read-only web dashboard that derives its tabs and tables at runtime from any CLI that lists resources as JSON. Ships pre-wired for NanoClaw's ncl CLI (agent groups, sessions, channels, users, roles), plus message-activity charts, a log tail, and a read-only file viewer for group skills/CLAUDE.md/profiles.
Also in 5 projects that use this
qwibitaiSkilladd-iron-proxy
Install or refresh Iron Proxy and its official Iron Control web console for NanoClaw. Use when selecting the Iron gateway, adding its management UI, configuring credentials and grants, or restoring the proxy, approval bridge, and agent guidance.
Also in 4 projects that use this
qwibitaiSkilladd-mattermost
Add a self-hosted or cloud Mattermost bot channel through the Chat SDK bridge, reusing a healthy server when available and linking to official server setup guidance when needed.
Also in 4 projects that use this
b1rdmaniaSkillmigrate-memory
Migrate from monolith CLAUDE.md to the three-file memory system (identity + state + log). Non-destructive — backs up the original first.
Also in 6 projects that use this
MicrosoftSkillact-on-feedback
Act on user feedback attached to the current session. Use when the user submits feedback on the session's changes via the Submit Feedback button.
Also in 3 projects that use this
- +5 more from TomGranot
Other versions19 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 19
- microsoft/vscode★ 195ksame name
- gavrielc/nanoclaw★ 31ksame name
- nanocoai/nanoclaw★ 31ksame name
- qwibitai/nanoclaw★ 31ksame name
- L-X-T/ng-agentic-skills★ 13same name
- Orderful/orderful-netsuite-skills★ 7same name
- microsoft/amplifier-app-nanoclaw★ 5same name
- TomGranot/groupguard★ 3same name
- kimgoetzke/coding-agent-configs★ 2same name
- prathish-ks/isthmus★ 2same name
9 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- analyticsSkill
- companySkill
- correspondenceSkill
- handoffSkill
- inboxSkill
- insightsSkill
- ops-baseSkill
- opsSkill
- outboxSkill
- preparationSkill
- tasksSkill
- transcriptSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
20 rules. 0 are common, 11 are distinctive, and 9 are very specific to this project.
0
Common
Most of the 18 edited versions we read keep these.
11
Distinctive
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 45
Before pulling from any remote, verify it is safe using git merge-base:
- Very specific: line 59
Check for dirty working tree (git -C <repo-path> status --porcelain).
- Distinctive: line 68
If no remote is ahead: "Already up to date"
- Very specific: line 69
If exactly one remote is ahead: pull from it (git -C <repo-path> pull <remote> <branch>)
- Very specific: line 70
If multiple remotes are ahead and they point to the same commit: pull from any (prefer origin)
- Distinctive: line 71
If multiple remotes are ahead but point to different commits: pull from the one that is furthest ahead (most commits ahead of local HEAD)
- Distinctive: line 72
If remotes have diverged from each other (neither is ancestor of the other): warn the user, do not pull, ask for guidance
- Distinctive: line 73
After pull: report what happened (commits pulled, from which remote)
- Very specific: line 95
Create the symlink: ln -s <repo-path>/skills/<name> ~/.claude/skills/<name>
- Very specific: line 222
If argument matches a repo name in the sources table: use the origin URL, clone target is <base-dir>/<repo-name>
- Very specific: line 223
If argument is a URL: extract repo name from URL, clone target is <base-dir>/<repo-name>
- Distinctive: line 224
If argument matches neither: ask the user for the clone URL
- Very specific: line 227
If the clone target exists and is a git repo: report "Already installed" and run update on it instead
- Distinctive: line 228
If the clone target exists but is not a git repo: warn and abort
- Distinctive: line 250
If a symlink already exists with that name: warn (name conflict), do not overwrite
- Distinctive: line 274
Never pull with dirty working tree: If git status --porcelain returns output, skip the repo and warn.
- Distinctive: line 276
Never force-pull: Only fast-forward merges. If fast-forward is not possible, warn and skip.
- Very specific: line 277
Ask before fixing: When check finds issues, present findings and ask before making changes.
- Distinctive: line 280
Symlink conflicts are never overwritten: If a symlink name already exists, warn and skip.
- Very specific: line 281
Always use
git -C <repo-path>: Never rely on shell working directory.
“Common” is measured: kept by at least 6 in 10 of the 18 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/update-skills -- Skill Repository Management
Manage skill repo updates, symlink health, and new skill installation across multiple source repositories and remotes.
Parse the user's argument to determine the operation. Default to update if no argument given.
Standalone skill -- no dependency on ops-base or ops-config.
English output only -- this is a technical utility.
Known Sources
This table identifies repos and their remote URLs. Local paths are discovered dynamically at runtime (see Repo Discovery below).
| Repo | origin | local |
core-skills | https://github.com/your-username/core-claude-skills.git | ssh://git@nas.local//srv/git/core-skills.git |
acme-skills | https://github.com/acme-org/acme-claude-skills.git | ssh://git@nas.local//srv/git/acme-skills.git |
bravo-skills | https://github.com/bravo-org/bravo-skills.git | ssh://git@nas.local//srv/git/bravo-skills.git |
generic-design-system-kit | https://github.com/bravo-org/generic-design-system-kit.git | -- |
Repo Discovery
Repo locations are discovered dynamically -- no hardcoded paths. Three mechanisms combined:
- Self-discovery -- resolve the
update-skillssymlink (~/.claude/skills/update-skills) to find wherecore-skillsis cloned. The parent of that repo's root becomes the base directory for sibling repos (e.g. ifcore-skillslives at/home/ubuntu/src/core-skills, the base directory is/home/ubuntu/src). - Symlink scanning -- scan all entries in
~/.claude/skills/, resolve each symlink to its real path, walk up to find the git root (git -C <path> rev-parse --show-toplevel), collect unique git roots. Any repo found this way that is NOT in the sources table is included but noted as "discovered" (no known remotes beyond what git reports). - Sources table -- provides repo names and remote URLs. Matched against discovered repos by directory basename. Used for
install(clone URLs) and remote verification.
Version Safety (Commit Graph Ancestor Check)
Before pulling from any remote, verify it is safe using git merge-base:
git -C <repo-path> fetch <remote>
git -C <repo-path> merge-base --is-ancestor HEAD <remote>/<branch>Interpretation:
- Exit code 0 (HEAD is ancestor of remote): safe -- remote is ahead, fast-forward possible
- Exit code 1 (HEAD is NOT ancestor of remote): unsafe -- remote is behind local or has diverged
- Exit code 128 or fetch failure: unreachable -- remote is down or not accessible
Pull logic per repo:
- Check for dirty working tree (
git -C <repo-path> status --porcelain). If dirty: skip repo entirely, warn the user. git -C <repo-path> fetch --all(continue even if some remotes fail -- note which ones are unreachable)- Determine the current branch (
git -C <repo-path> symbolic-ref --short HEAD) - For each remote that has
<remote>/<branch>: a. Run the ancestor check (git -C <repo-path> merge-base --is-ancestor HEAD <remote>/<branch>) b. If safe: count commits ahead (git -C <repo-path> rev-list HEAD..<remote>/<branch> --count) c. If unsafe: record as "behind or diverged" d. If unreachable: record as "unreachable" - Decision:
- If no remote is ahead: "Already up to date"
- If exactly one remote is ahead: pull from it (
git -C <repo-path> pull <remote> <branch>) - If multiple remotes are ahead and they point to the same commit: pull from any (prefer
origin) - If multiple remotes are ahead but point to different commits: pull from the one that is furthest ahead (most commits ahead of local HEAD)
- If remotes have diverged from each other (neither is ancestor of the other): warn the user, do not pull, ask for guidance
- After pull: report what happened (commits pulled, from which remote)
Subcommands
1. update (default) -- Fetch and pull all repos
Trigger: /update-skills or /update-skills update
Steps:
- Discover repos -- self-discovery + symlink scanning + sources table matching
- For each repo:
a. Verify the local path exists. If not: warn and skip (suggest
install) b. Check for dirty working tree. If dirty: warn and skip c. Fetch all remotes d. Apply version safety logic (see above) e. Pull if safe - Scan for new skills -- after pulling, compare
skills/*/directories in each repo against existing symlinks in~/.claude/skills/ - Create symlinks for new skills -- for each skill directory that has no corresponding symlink:
- Show the user what will be created:
~/.claude/skills/<name> -> <repo-path>/skills/<name> - Create the symlink:
ln -s <repo-path>/skills/<name> ~/.claude/skills/<name>
- Show the user what will be created:
- Report summary:
## Update Summary ### core-skills - Pulled 3 commits from origin/main - New skill symlinked: update-skills ### generic-design-system-kit - Already up to date - All symlinks present ### Symlink Health - 10 active, 0 broken, 0 orphaned
2. status -- Show current state
Trigger: /update-skills status
Steps:
- Discover repos
- For each repo, report:
- Repo name and local path
- Current branch and HEAD commit (short hash + message)
- Version (read from README.md or package.json if available -- look for
**Version:**pattern) - Remotes (name, URL, reachable/unreachable)
- Skills provided (list of
skills/*/directories) - Working tree status (clean/dirty)
- Symlink state:
- List all symlinks in
~/.claude/skills/ - For each: show target, whether target exists, which repo it belongs to
- List all symlinks in
Format as a structured report:
## Skill Repository Status ### core-skills (v1.5.0) Path: <discovered-path>/core-skills Branch: main @ a1b2c3d "v1.5.0: Rename to core-skills" Tree: clean Remotes: origin: https://github.com/your-username/core-claude-skills.git local: ssh://git@nas.local//srv/git/core-skills.git Skills: ops-base, ops-config, transcript, management-ops, marketing-ops, project-ops, bravo-ops, cr, update-skills ### generic-design-system-kit Path: <discovered-path>/generic-design-system-kit Branch: main @ d4e5f6g "Latest commit message" Tree: clean Remotes: origin: https://github.com/bravo-org/generic-design-system-kit.git Skills: brand-design-system, brand-webapp-structure ### Symlinks (10 active) All symlinks valid. No broken or orphaned links.Replace
<discovered-path>with the actual resolved path at runtime.
3. check -- Verify symlink health
Trigger: /update-skills check
Steps:
- Scan
~/.claude/skills/-- list all entries - For each entry, check:
- Is it a symlink? (vs regular directory)
- Does the symlink target exist?
- Does the target contain a skill definition file? (case-insensitive match:
SKILL.md,Skill.md, orskill.md) - Which repo does it belong to?
- Cross-reference with repos -- for each known repo, check if all
skills/*/directories have symlinks Categorize findings:
Healthy: Symlink exists, target exists, skill definition file present (any casing of
skill.md)Broken: Symlink exists but target does not exist (repo moved/deleted?)
Missing: Skill directory exists in repo but no symlink in
~/.claude/skills/Orphaned: Symlink in
~/.claude/skills/points to a path that is not inside any known repoNot a symlink: Entry in
~/.claude/skills/is a regular directory (not managed by this system)- Report (paths shown are the actual resolved paths at runtime):
## Symlink Health Check Healthy (10): ops-base -> <repo-path>/core-skills/skills/ops-base transcript -> <repo-path>/core-skills/skills/transcript ... Missing (0): (none) Broken (0): (none) Orphaned (0): (none) - Offer fixes -- if any Missing or Broken found:
- Missing: "Create symlink for
<name>?" - Broken: "Remove broken symlink
<name>?" (ask first -- never auto-remove)
- Missing: "Create symlink for
4. install <repo> -- Clone and set up a repo
Trigger: /update-skills install <repo-name-or-url>
Steps:
- Determine the base directory:
- Resolve the
update-skillssymlink to find thecore-skillsrepo root - The parent of that root is the base directory (e.g. if
core-skillsis at/home/user/src/core-skills, base directory is/home/user/src)
- Resolve the
- Resolve the repo:
- If argument matches a repo name in the sources table: use the origin URL, clone target is
<base-dir>/<repo-name> - If argument is a URL: extract repo name from URL, clone target is
<base-dir>/<repo-name> - If argument matches neither: ask the user for the clone URL
- If argument matches a repo name in the sources table: use the origin URL, clone target is
- Check if already installed:
- If the clone target exists and is a git repo: report "Already installed" and run
updateon it instead - If the clone target exists but is not a git repo: warn and abort
- If the clone target exists and is a git repo: report "Already installed" and run
- Clone:
git clone <origin-url> <base-dir>/<repo-name>
4b. Guard check (CR-028): if the cloned repo ships scripts/githooks/pre-push, remind the user that the privacy guard is per-clone and must be installed BEFORE the first push from this machine:
git -C <base-dir>/<repo-name> config core.hooksPath scripts/githooks
git -C <base-dir>/<repo-name> config guard.denylist /absolute/path/to/private/push-denylist.txt(See the repo's docs/RELEASING.md. A fresh clone without these lines pushes with only GitHub's server-side secret scanning — no private-identifier protection.)
- Add additional remotes (if known from sources table):
git -C <base-dir>/<repo-name> remote add local <local-url> - Create symlinks for all skill directories found in the cloned repo:
- Scan
<base-dir>/<repo-name>/skills/*/for directories containing a skill definition file (any casing ofskill.md) or README.md - For each, create:
ln -s <base-dir>/<repo-name>/skills/<name> ~/.claude/skills/<name> - If a symlink already exists with that name: warn (name conflict), do not overwrite
- Scan
- Report:
## Installed: generic-design-system-kit Cloned to: <base-dir>/generic-design-system-kit Remotes: origin (GitHub) Skills symlinked: brand-design-system -> ~/.claude/skills/brand-design-system brand-webapp-structure -> ~/.claude/skills/brand-webapp-structure
5. help -- Usage
Trigger: /update-skills help
Print the four subcommands above, one line each, and the repos found by Repo Discovery.
Safety Rules (always enforced)
- Never auto-remove symlinks. Broken or orphaned symlinks are reported but only removed with explicit user confirmation.
- Never pull with dirty working tree. If
git status --porcelainreturns output, skip the repo and warn. - Never push. This skill only fetches and pulls. Pushing is the user's responsibility.
- Never force-pull. Only fast-forward merges. If fast-forward is not possible, warn and skip.
- Ask before fixing. When
checkfinds issues, present findings and ask before making changes. - Skip unreachable remotes gracefully. NAS may be offline -- log it, continue with other remotes.
- No destructive git operations. No
reset --hard, noclean -f, nocheckout ., nobranch -D. - Symlink conflicts are never overwritten. If a symlink name already exists, warn and skip.
- Always use
git -C <repo-path>. Never rely on shell working directory. Every git command must explicitly specify the repo path using the-Cflag to prevent operating on the wrong repository.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
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.

