skills
CLAUDE.md1 starsChanged 28 days agoMITView on GitHub
Dan's personal Claude Code skills, public on GitHub as chendaniely/skills. Each top-level folder is one skill. Open work lives in TODO.md and is mirrored as GitHub issues. When a skill folder is renamed or moved, update all of these in the same sitting:
In this repository10 other files it gives its agents.
- capture-conversationSkill
- capture-learning-momentSkill
- catch-upSkill
- class-notesSkill
- clothing-inventorySkill
- creating-ultra-crew-guidesSkill
- email-digestSkill
- external-app-reviewSkill
- ootdSkill
- product-searchSkill
The file
We split this CLAUDE.md into the rules it gives an agent
12 rules. About 0 are common, 4 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 9
If a skill's name is already taken there by a folder or a different link, it prints skipped and leaves it.
- Distinctive: line 14
Don't use both installs on one machine, or every skill loads twice.
- Distinctive: line 18
When a skill folder is renamed or moved, update all of these in the same sitting:
- Very specific: line 36
Vault skills: follow the vault's conventions, and the vault's CLAUDE.md wins.
- Very specific: line 46
When that folder is a Quarto website (it has _quarto.yml), capture-learning-moment follows the site's own CLAUDE.md for the post folder and …
- Distinctive: line 58
Check every skill at once.
- Very specific: line 62
Length: keep SKILL.md under 500 lines.
- Very specific: line 64
Self-edits: no skill edits the vault's CLAUDE.md or its own SKILL.md on its own initiative.
- Very specific: line 72
Install checks: test install.sh without touching the real links by running CLAUDE_SKILLS_DIR=<scratch dir> ./install.sh.
- Very specific: line 76
Examples use invented or generic values: Don't copy real names, sizes, measurements, addresses, IPs, hostnames or new local paths from the …
- Distinctive: line 78
Security details stay private: Don't publish which commands are pre-approved in other repos' settings.
- Very specific: line 79
Scan before pushing: Check new content for secrets and personal details, including removed lines and commit messages: git log -p …
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md 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
Skills repo
Dan's personal Claude Code skills, public on GitHub as chendaniely/skills. Each top-level folder is one skill. Open work lives in TODO.md and is mirrored as GitHub issues.
Install and layout
- Install:
./install.shsymlinks each<skill>/into~/.claude/skills/<skill>. Edits here apply live, even in running sessions. Re-run it after adding or renaming a skill.- It never touches entries in
~/.claude/skillsthat aren't its own links, such as skill folders other tools installed there. - If a skill's name is already taken there by a folder or a different link, it prints
skippedand leaves it. - It removes its own links whose skill folder no longer exists.
- It never touches entries in
- Keep skills flat at the top level (decided 2026-09-16). Claude Code only discovers personal skills one level deep (
~/.claude/skills/<name>/SKILL.md), so group folders wouldn't group anything, and a move breaks the paths listed below. - Marketplace (added 2026-09-23):
.claude-plugin/marketplace.jsonalso publishes the skills as five plugins (vault,wardrobe,teaching,running,coding) for/plugin marketplace add chendaniely/skills. A new or renamed skill must be listed there too.- Plugin installs prefix skill names (
/wardrobe:ootd) and are cached copies, so edits apply only after a push and plugin update. Anything that loads a skill by bare name (like thedaily-email-digesttask) needs the symlink install. - Don't use both installs on one machine, or every skill loads twice.
- Plugin installs prefix skill names (
Paths other repos depend on
When a skill folder is renamed or moved, update all of these in the same sitting:
- The Obsidian vault's
CLAUDE.md: it points, by this checkout's absolute path (print it withgit rev-parse --show-toplevel, then search the vault'sCLAUDE.mdfor it), toproduct-search,clothing-inventory,ootdandcapture-conversation, and to the repo root.- Find the vault through Obsidian's vault list (
~/Library/Application Support/obsidian/obsidian.json); it is the vault namedvault. - A safety hook may block broad commands over the whole vault. Use narrow paths or the vault's own scripts (
scripts/lint.py).
- Find the vault through Obsidian's vault list (
~/git/private/claude-cowork: itsCLAUDE.mdandREADME.mdpoint toemail-digest/SKILL.mdand say to commit skill changes here.- The
daily-email-digestscheduled task (~/.claude/scheduled-tasks/daily-email-digest/SKILL.md): it loadsemail-digestby name and cites its path here. It stops if the skill can't be loaded, so a rename ends the daily digest until the task is updated. - Course repositories using
class-notes: each one'sMakefileruns~/.claude/skills/class-notes/scripts/class_notes.py(the symlink install; with the plugin install, passCLASS_NOTES=<path>), and itsREADME-prompt.mdtells students to clone this repo and runclass-notes/scripts/class_notes.py. Renaming the skill, itsscripts/folder or the script breaks both. Find them withgrep -l class_notes.pyover the course repos'Makefiles. chendaniely/genai-learning-moments: itsREADME.md,CLAUDE.mdandabout.qmdlink tocapture-learning-momentby its GitHub path, and itsCLAUDE.mdassumes the skill defers to it.- The symlinks: re-run
./install.sh.
How the skills fit together
email-digestis driven by the privateclaude-coworkrepo. Its CLI subcommands, JSON shapes and checklist markers must match that repo, and claude-cowork'sCLAUDE.mdsays the same from its side.- Changes usually come from a claude-cowork session, so check
git statusbefore touching this skill. - Unattended runs must start in claude-cowork, because only its machine-local settings pre-approve the digest commands.
- Changes usually come from a claude-cowork session, so check
catch-upandemail-digestwrite the same daily note.digest.py renderputs its## Emailchecklist between<!-- ea-email:begin todos … -->and<!-- ea-email:end todos -->, right after## Today, and the begin marker comes before the## Emailheading.catch-upends its## Todayrewrite at that marker and never touches lines inside the block. The vault'sCLAUDE.md(## Conventions) requires the same.clothing-inventory,ootdandproduct-searchrefer to each other by name.ootdrunsclothing-inventoryas a required sub-skill, so rules that touch both (size, aliases, listing line, photos) must agree.- Vault skills follow the vault's conventions, and the vault's
CLAUDE.mdwins.catch-up,capture-conversationandootdlook up folder names in the vault'sCLAUDE.md.clothing-inventoryhard-codes this vault'sinventory/paths and defers toinventory/Inventory.md.email-digestgets its vault settings from claude-cowork's config.- Frontmatter changes wait for the vault's Phase 10 migration (see TODO.md).
- Inbox and transcripts:
catch-upfilesinbox/notes, andinbox/is also whereootdlooks for unlogged outfit photos.- Plaud transcripts reach the vault's
sources/transcripts/through the vault's audio pipeline.catch-upnever files them, andcapture-conversationshould link them instead of transcribing again (see TODO.md).
- Standalone:
capture-learning-moment(writes to$LEARNING_MOMENTS_DIR, else~/learning-moments/),creating-ultra-crew-guidesandexternal-app-reviewdon't use the vault.external-app-reviewwrites into the reviewed app's own repo, and its two scripts need Playwright resolvable from that repo (orNODE_PATH) plus Google Chrome.- When that folder is a Quarto website (it has
_quarto.yml),capture-learning-momentfollows the site's ownCLAUDE.mdfor the post folder and conventions. Dan's is the publicchendaniely/genai-learning-moments, whose posts live inposts/.
class-notesdoesn't use the vault either: it works inside a course repository, which holdsprompt-notes.md(the prompt, sent whole),README-prompt.md(student docs) and one folder per class session.- Class recordings reach course repos through
class-notes fetch, separately from the vault's audio pipeline. - It uses the Plaud CLI (
@plaud-ai/cli), which has its own login, not the Plaud MCP. After a CLI upgrade, runfetch --verifyon an existing session (seereferences/plaud.md), since the CLI's text output is parsed with regexes. templates/holds the boilerplate for a new course. Keep it free of course-specific details, and of real hostnames and paths.
- Class recordings reach course repos through
Editing a skill
- Frontmatter:
nameequals the folder name.descriptionis at most 1024 characters and says what the skill does and when to use it.- Single-quote the description, doubling any internal apostrophes, if it contains
#or:. An unquoted#todoonce silently cutcatch-up's description short. - Check every skill at once. This fails loudly on a name/folder mismatch or an over-long description, and prints each file's line count for the 500-line limit:
for f in */SKILL.md; do uv run -q --with pyyaml python -c "import yaml,re,sys; p=sys.argv[1]; t=open(p).read(); fm=yaml.safe_load(re.match(r'^---\n(.*?)\n---\n',t,re.S).group(1)); assert fm['name']==p.split('/')[0], p+': name != folder'; assert len(fm['description'])<=1024, p+': description too long'; print(fm['name'], len(fm['description']), t.count(chr(10)), 'lines')" "$f"; done
- Length: keep
SKILL.mdunder 500 lines. Move detail that matters only sometimes intoreferences/, one level deep and linked fromSKILL.md. Record new lessons as short rules there, not as dated stories in the steps. - Side effects: a skill that moves or rewrites files triggers only on an explicit request.
catch-upruns only when asked.ootdoffers first when it finds a photo mid-task. - Self-edits: no skill edits the vault's
CLAUDE.mdor its ownSKILL.mdon its own initiative. It proposes the change and applies it after Dan says yes. grepin Claude Code sessions prints recursive paths without a leading./. Write path filters that accept both forms, for examplegrep -vE '^(\./)?TODO\.md:'.- Tests:
ootdhas the only regression test:ootd/tests/prompt.md(the prompt) andootd/tests/check_green.py(the grader, with the fixture recipe in its header).- Re-run GREEN after any change to
ootdor toclothing-inventory, whichootdruns as a sub-skill. - The fixture lives under
/tmpand doesn't survive a reboot, so rebuild it from the recipe first. - Running the grader leaves
ootd/tests/__pycache__/, which.gitignorecovers.
- Re-run GREEN after any change to
- Other skills have no tests. Re-read the diff against the rule it implements. For a description change, check that the trigger phrases still match how Dan asks.
- Install checks: test
install.shwithout touching the real links by runningCLAUDE_SKILLS_DIR=<scratch dir> ./install.sh. A skill is live whenls -l ~/.claude/skills/shows a link into this repo and the skill appears in a session's skill list.
Public repo hygiene
- Examples use invented or generic values. Don't copy real names, sizes, measurements, addresses, IPs, hostnames or new local paths from the vault or the machine into skills, examples, commit messages or issues.
- Two example values in
ootd's templates (the## Directionquote and the MUJI size) were reviewed on 2026-09-16 and kept on purpose. Don't replace them.
- Two example values in
- Security details stay private. Don't publish which commands are pre-approved in other repos' settings.
- Scan before pushing. Check new content for secrets and personal details, including removed lines and commit messages:
git log -p origin/main..main. History is permanent once pushed. - Commit identity: commits use Dan's public email.
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.

