Skills Repo Sync
Keeps github.com/Theycallmeholla/skills (local clone: /Users/cursivemedia/skills) up to
date as the single source of truth for all of the user's custom skills.
Skill sources (check BOTH every run)
- Cowork / Claude account skills — the session's synced skills cache
(
~/.claude/skillsinside the session container). This is a read-only cache of the user's account skills; it is fine as a source to copy from. - Claude Code local skills —
/Users/cursivemedia/.claude/skillson the Mac (johns-mac-studio-local).
If the same skill name exists in both sources, prefer the copy with the more complete contents (more files / newer material); when in doubt, prefer the Mac copy and note it.
Exclusions — never sync these
The ONLY criterion for inclusion is: the user authored it. Installed ≠ authored.
- Third-party / installed skills — never sync:
- Anything located in, or symlinked into,
~/.agents/skills/on the Mac — that directory holds installed packages (e.g. the Impeccable design suite: adapt, arrange, audit, bolder, clarify, colorize, distill, extract, frontend-design, harden, normalize, onboard, optimize, overdrive, polish, teach-impeccable, typeset). Check withreadlink/ls -labefore trusting a folder in~/.claude/skills. - Any skill whose SKILL.md frontmatter carries third-party attribution: an
author:that isn't the user, ahomepage:pointing at someone else's repo, a license line crediting another project, or package-managermetadata:blocks (version/requires/ openclaw/hermes). Known examples:drawio-skill,mermaid-skill(Agents365-ai),use-spark(Readdle),morning(Anthropic sample). - When provenance is unclear, ASK the user — never default to syncing.
- Anything located in, or symlinked into,
- Anthropic built-in / stock skills:
docx,pdf,pptx,xlsx,skill-creator,canvas-design,algorithmic-art,brand-guidelines,internal-comms,mcp-builder,slack-gif-creator,theme-factory,dataviz,cowork-plugin,explain-usage,setup-cowork,claude-in-chrome. - Plugin-provided skills (names containing
:likeoperations:runbook,small-business:*) — these live in installed plugins, not the flat skills cache. - Infrastructure files:
manifest.json,session-start-hook, hidden files. - Do-not-sync list (user-decided; the repo is PUBLIC):
adhd-mode(stale duplicate ofelihadhdstill lingering in the account — if seen, remind the user to delete it from their account skills), plus every pattern in the repo's.publish-denylist. Read that file and treat each entry as a glob; never sync anything matching one. Add future private skills to.publish-denylistrather than naming them here.
Repo format (follow exactly)
- Each skill is a self-contained folder:
skills/<skill-name>/SKILL.md— YAML frontmatter withnameanddescription, then the instructions. Copy verbatim from the source; do not rewrite content.- Optional subfolders copied as-is:
references/,assets/,scripts/.
README.md— every skill must appear exactly once as a bullet under a###category heading, in the style:- **skill-name** — lowercase one-line summary. Fit new skills into existing categories (Code Quality & Testing, UX & Product Testing, Documentation, Content, Prompting & Workflow); create a new###category only when nothing fits (e.g. "Design & Visuals", "Productivity"). Base the one-liner on the skill's frontmatter description, compressed.
Sync procedure
Enumerate skill folder names from both sources; apply exclusions.
Diff against
ls /Users/cursivemedia/skills/skills/.Confirm every new skill, one at a time. Never batch, never assume, never infer from the skill's contents that it is meant to be public. Publishing is the user's decision and only the user's. For each skill not already in the repo, show its name and one-line description and ask whether it should be published. Default is NO — if the user does not clearly say yes to that specific skill, it is not added. This holds however small the list is, however obviously "safe" a skill looks, and however clearly it fits an existing README category.
Anything named in
.publish-denylistis never offered at all — do not ask about it, do not add it. CI fails the build if a denylisted skill reachesskills/, so adding one breaks the repo as well as the user's trust.Skills that are stages of an internal business pipeline are the specific thing this gate exists to stop. Do not create a category to accommodate them.
Copy each missing skill folder into
skills/<name>/preserving structure.- Skills already on the Mac:
cp -RL(dereference!) on the device. Entries in~/.claude/skillsare often symlinks into~/.agents/skills/— a plaincp -Rcommits dangling symlinks that resolve locally but are broken on GitHub. After copying,find skills -type lmust return nothing. - Skills that exist only in the session cache (cloud): transfer via the device bridge.
If no folder is connected, tar+gzip+base64 the folders in the cloud, write the
base64 to the Mac in ≤50KB chunks with Desktop Commander
(
cat >> /tmp/skillsync.b64 <<'EOF' ...), thenbase64 -d -i /tmp/skillsync.b64 | tar xz -C /Users/cursivemedia/skills/skills/and verify file counts match the source.
- Skills already on the Mac:
Existing-but-changed skills: if a repo skill's
SKILL.mddiffers from the source copy (diff them), do NOT silently overwrite — list the changed skills in the report and update only if the user approves (or if the session was told in advance to take source as truth).README: add one bullet per new skill per the format rules above.
Secrets & sensitive-data scan (MANDATORY before any commit) — the repo is public:
- Scan every file being added for real credential patterns (
sk-,sk-ant-,ghp_,github_pat_,xox[bap]-,AKIA,pk_live_/sk_live_,AIza, JWTs,BEGIN PRIVATE KEY, assignment-stylekey/token/secret/password = "<value>"). - Also flag business-sensitive content: real client names, Google Sheet/Doc IDs, GHL location IDs, internal URLs, market research, real (non-placeholder) emails or phone numbers.
- Anything flagged: exclude the skill from the sync and report it. Never push first and ask later.
- Scan every file being added for real credential patterns (
Git (run on the Mac, in
/Users/cursivemedia/skills):git statusfirst; mention any pre-existing uncommitted changes in the report.git add -A && git commit -m "Sync skills: add <names>"(concise list or count).- STOP. Do not push yet. Show the user exactly what the commit contains (skill
names, file count, anything notable) and ask for an explicit yes IN THE MOMENT —
an upfront "sync my repo" request or an earlier blanket approval does NOT count as
push approval. If the session is unattended, leave the commit local and report the
exact
git pushcommand instead of pushing. - Only after the user's explicit OK:
git push origin main. If push fails (auth/network), leave the commit local and tell the user exactly what to run.
Verify (always)
- Every new
skills/<name>/contains aSKILL.mdwhose frontmatter parses (hasnameanddescription). - Repo skill count = old count + added count; no empty directories.
- README bullet count matches the number of skill folders.
git statusis clean after push (or the user was told the commit is local-only).
Environment notes
- Running in Cowork cloud: reach the Mac via Desktop Commander
(
mcp__remote-devices__desktop-commander__execute_commandetc.). The cloud shell cannot see/Users/cursivemedia; the Mac cannot see the cloud filesystem — transfer content explicitly (step 4). - Running in Claude Code on the Mac: everything is local; skip the bridge entirely. The account-skills source may not be visible locally — in that case sync what is reachable and say which source was skipped.