Source-of-truth repository for skills used by Claude Code, Codex, and Cursor. Skill content lives here (version-controlled), and each agent loads it through symlinks in its user skills directory.
Attribution:
taste-skill/is vendored from Leonxlnx/taste-skill (MIT — see itsLICENSE). The simplicity ruleset infable-prompts-skill/skills/fable-prompts/references/ponytail.mdis adapted from DietrichGebert/ponytail (MIT — notice inside the file).browse-x-skill/is adapted from pc-style/x-mdskills/browse-x(MIT — seebrowse-x-skill/LICENSE). Everything else in this repo is original.
Claude Code discovers skills by scanning ~/.claude/skills/. Rather than copying
skills into that directory, each skill is symlinked back to its real location in
this repo. This means:
- There is one copy of each skill (here), tracked in git.
- Editing a file here immediately affects the skill Claude Code uses — no re-sync.
~/.claude/skills/<name>is just a pointer, not a duplicate.
Note that skills are nested one level deep inside each *-skill project, under a
skills/ subdirectory. The symlink hides that nesting so the skill appears at the
top level of ~/.claude/skills/.
Linking is managed by the repo's Makefile — just run make link (see
Makefile — linking skills locally).
Read/search public X posts, threads, profiles, followers, and following via x.md as Markdown or JSON. No X API key. The skill is curl-first so Codex, Claude Code, and Cursor work on a PC without Bun.
make link covers it (symlink browse-x → browse-x-skill/skills/browse-x).
Use make link-codex or make link-cursor to link it along with every other
skill for those agents.
Build a paste-ready Meta Muse "Submit a connector" packet from the repo you
invoke it in. scripts/scan.sh mines the repo for every field of the
three-step form at muse.ai/platform (identity,
example prompts, 512×512 icon, legal URLs, Raw API vs Existing MCP, endpoint,
OpenAPI, auth methods, access requirements) and the skill writes
docs/muse-connector/SUBMISSION.md with evidence anchors and a gap list. The
form's exact fields are recorded in
muse-connector-skill/skills/muse-connector/references/form-fields.md. Never
submits the form.
Audits the current website repo against a 37-point pre-launch checklist. Site polish (1-20): privacy/terms, secrets, HTTPS, cookie consent, meta + social tags, favicon, sitemap/robots, alt text, image weight, page speed, contrast, mobile, 404, broken links, form validation, spam protection, analytics, single CTA. App security (21-37): authentication, server-side permission checks, frontend-supplied user IDs, user data isolation, admin routes, database lockdown, Firebase/Supabase/storage rules, debug mode, error detail, server-side validation, content sanitization, file uploads, SQL/NoSQL injection, login/signup rate limits, secrets in git history, security headers
- CORS, and an untrusted-user test. It first works out which security items
apply (backend? accounts? datastore? user content? uploads? admin?) and
collapses the rest into a single N/A row, so a static site isn't buried in
noise. Reports PASS/FAIL/N-A with evidence, then fixes what you approve.
/launch-checklistaudits;/launch-checklist fixalso applies the mechanical fixes.make linkcovers it.
Ledger-driven, gate-checked autonomous progression of a project toward
production-ready — skills /forge + /local-deploy plus a bash harness
(forge/bin) that runs iterations in tmux, survives usage-limit windows, and
notifies/accepts approvals over Telegram. See forge/README.md.
make link covers forge's skills; the harness scripts need one extra step
(links forge/bin/* into ~/.local/bin, checks jq/gh):
~/work/skills/forge/install.sh # on the VPS, as the harness user
forge-telegram-setup # one-time telegram bot pairingsetup-vps.sh (repo root) is a one-command bootstrap for running long-running
Claude Code sessions on a VPS, inside tmux, isolated to a dedicated user. It
provisions everything below in one shot and is safe to re-run.
Run on a fresh VPS (as root, or via sudo/doas):
curl -fsSL https://raw.githubusercontent.com/JonTelep/skills/main/setup-vps.sh | sudo shOn Alpine (no sudo/bash by default, usually already root):
curl -fsSL https://raw.githubusercontent.com/JonTelep/skills/main/setup-vps.sh | shWhat it does:
- Detects the package manager and installs
tmux,git,curl,bash,openssh,ripgrep. Works on Debian/Ubuntu (apt), AlmaLinux/RHEL/Rocky/ Fedora/CentOS (dnf/yum), Alpine (apk), Arch (pacman), openSUSE (zypper). - Creates a dedicated unprivileged user
claude-agent(no sudo) — the isolation boundary forclaude --dangerously-skip-permissions. - Installs Claude Code (official installer) for that user.
- Clones this repo to
~/work/skillsand symlinks every skill into~/.claude/skills/. - Generates an
ed25519SSH deploy key and prints the public key with instructions to add it to the target repo's Deploy keys. - Creates a detached
tmuxsession namedclaude. - On systemd hosts, installs a boot service (re-creates the tmux session on
reboot) and a daily timer (
git pullon the skills repo).
Auth is your Claude subscription. Log in once interactively (claude →
OAuth) inside the tmux session; the token persists in ~/.claude, so later
unattended runs just work. Do not set ANTHROPIC_API_KEY — that switches
billing to the pay-per-token API.
Optional env overrides (prefix the piped command, e.g.
curl … | sudo AGENT_REPO=git@github.com:you/proj.git sh):
| Variable | Effect |
|---|---|
AGENT_USER |
Dedicated user name (default claude-agent) |
SKILLS_REPO |
Skills repo URL to clone |
TMUX_SESSION |
tmux session name (default claude) |
AGENT_REPO |
If set, cloned into ~/work after key setup |
GIT_USER_NAME / GIT_USER_EMAIL |
git identity for the agent's commits |
CREATE_SWAP=1 |
Create a 2G swapfile if none exists (small VPS OOM guard) |
Daily use:
ssh vps
sudo su - claude-agent
tmux attach -t claude # or: tmux new -s claude
cd ~/work/yourrepo && git pull
claude # first run: log in onceAlpine note: Claude Code ships a glibc binary; the script installs
gcompatas a shim, but on a stock musl imageclaudemay still fail to launch. A glibc-based image is the reliable fix. Everything else (user, tmux, skills, key) works on Alpine regardless.
The Makefile at the repo root manages all the symlinks. Running make with no
arguments prints the help:
| Target | What it does |
|---|---|
make help |
Show all targets (also the default when just typing make) |
make link |
Symlink every skill (any directory containing a SKILL.md) into ~/.claude/skills/. Idempotent — safe to re-run after adding a skill. |
make unlink |
Remove only the symlinks that point into this repo. |
make relink |
unlink + link — clears stale links left behind by renamed or deleted skills. |
make status |
List every symlink in ~/.claude/skills/ with OK/BROKEN and whether this repo owns it. |
make check |
Exit non-zero if any skill is unlinked or any repo-owned link is broken/stale. |
Choose an agent with AGENT=claude|codex|cursor, or use a suffixed target:
make link-codex # ~/.agents/skills (Codex's documented user directory)
make link-cursor # ~/.cursor/skills
make check-codex
make status-cursor
make relink-codex
make unlink-cursorAll five management commands support -claude, -codex, and -cursor.
Unsuffixed commands default to Claude Code for compatibility. TARGET_DIR
overrides the destination, for example:
make link AGENT=codex TARGET_DIR="$HOME/.codex/skills"The defaults follow the Codex skill documentation
and Cursor skill documentation. Cursor also
reads the shared ~/.agents/skills directory. Restart the agent or IDE after
linking if the skills do not appear. Linking makes the files available; skills
that require agent-specific tools still require those tools.
Skills are discovered automatically by finding SKILL.md files, so adding a new
skill is just: create <project>-skill/skills/<name>/SKILL.md, then make link.
Safety: Each destination may also hold symlinks owned by other repos (e.g.
absorb-x and checkin from second-brain, omarchy from Omarchy). The
Makefile inspects each link's target and never creates, replaces, or removes a
link that doesn't resolve into this repo — those show up as SKIP in make link
and (other) in make status.
-
Confirm the symlink exists and points into this repo:
ls -la ~/.claude/skills/intelligent-loopExpected: an
lat the start of the permissions and an arrow pointing to/home/telep/Projects/skills/fable-prompts-skill/skills/intelligent-loop. -
Confirm the target resolves to a real directory with skill content:
readlink -f ~/.claude/skills/intelligent-loop ls ~/.claude/skills/intelligent-loop/ # should show SKILL.md (and README.md)
-
Check for broken symlinks (targets that no longer exist):
find ~/.claude/skills/ -maxdepth 1 -xtype lAny path printed here is a dangling symlink and needs fixing.
-
Confirm Claude Code sees it: the skill should be invocable as
/intelligent-loopinside Claude Code.
make status # human-readable overview of every link
make check # CI-style: exits non-zero if anything is missing/broken/stale