Skip to content
← AI tooling

Agent skills

2026 · open source · claude code + codex

A skill is a markdown file that tells a coding agent when to do something and how. I had the same eight copied into several repos, and every copy drifted. Now the ones I can share live in one public repo, ong6/skills, and a small command links them into every repo I work in and sends my edits back.

Figure 01 · Link and publish · skills

One checkout per machine, linked into every repo

  • fast-forward + link
  • guard · lint · push

UPSTREAMCONSUMERSong6/skillsskills/24 × SKILL.mdcatalog.yamlone category per skillbin/skillsup · doctor · guard · publish.claude-plugin/marketplace + pluginNotes repoproject scope · skills up → publishEvery repo, home machinesuser scope · skills up → publishDev boxpublic only · skills up → publishPlugin marketplaceread-onlyFAST-FORWARD + LINKGUARD · LINT · PUSH
fig. 1 — each machine keeps one checkout of the repo. At session start, skills up updates it and links the enabled skills into the folders Claude Code and Codex read. Edits go back through skills publish.

Editing skills where I use them

You can install the repo as a plugin, which is fine if you only want to use the skills. I also wanted to fix them while I work. Before the shared repo, a fix made in one repo stayed there and the other copies fell behind. So each machine keeps one clone, every repo links into it, and an edit made from anywhere lands in the same files. Publishing sends it upstream, and my other machines pick it up the next time a session starts.

One command, run by a hook

skills up runs when a session starts. It looks the machine up in machines.json, links the skills that machine should have and removes the ones it shouldn't. It never prompts, only updates a clean checkout, and finishes in well under a second when nothing has changed. skills publish goes the other way: it runs a safety check, lints what changed, then commits and pushes.

a session start

$ skills up --repo . --machines machines.jsonskills: 24 linked (Laptop, project) · fetched just now$ skills doctor --repo . --machines machines.jsonmachine  Laptop (skills profile)scope    project · root ~/src · private noskills   24 selected of 24 availablelinks    ~/src/notes/.agents/skills: 24 oklinks    ~/src/notes/.claude/skills: 24 okdoctor: ok

a home path in a public skill

$ skills guard skills/skills/handoff/SKILL.md:19: home-pathguard: 1 hit(s) in 1 file(s); fix them or mark a  deliberate line with `public-guard: allow`$ echo $?2
fig. 2 — a session start, then the safety check catching a home-directory path in a public skill. Publish runs the same check and stops before anything is committed.

The tests build throwaway home folders and git remotes and run without a network, on Python 3.12 and on 3.7, the oldest machine I link skills into.

The catalog

A catalog file puts each skill in one category and also lists other people's skills I rate, so the README is useful even where I haven't written one myself. The README tables are generated from it, and the build fails if the catalog and the folders disagree.

skills
24 · one SKILL.md each
catalog
7 categories · 18 links out
install paths
3 · one folder, bin/skills, plugin
agents
Claude Code, Codex
bin/skills
one file · stdlib Python 3.7+
cli tests
22 · CI on Python 3.12 and 3.7
catalog build
exits 1 when tree and catalog disagree
status
MIT · github.com/ong6/skills

What stays out

Only skills I can share go in. Anything with my paths, accounts or writing voice lives in a private repo. Before anything is published, skills guard blocks things like home-directory paths, personal email addresses, keys and tokens. The 24 public ones cover research, writing, design, trips and shopping, interview practice, and making and testing skills.

// AI TOOLING

All four layers

Ong Jun Xiong

SOFTWARE ENGINEER · SINGAPORE

ContactHobbiesArchiveNotesUI PackGitHubLinkedInSource

© 2026 Ong Jun Xiong