Personal AI coding tools — Claude Code and Cursor skills, slash commands, hooks, automations, and statusline I author and use across machines.
Active agents shows the number of working Claude/Codex and
Superset terminal sessions across hosts using SwiftBar. The dropdown separates
working, waiting, and open sessions; local updates run every 5 seconds and remote
host updates every 30 seconds. Install with python3 ~/.ai-tools/apps/agent-count/install.py
after installing SwiftBar (brew install --cask swiftbar).
| Skill | Purpose |
|---|---|
advance-roadmap |
Ship planned ROADMAP.md items (or docs/plans/ docs, if no roadmap) in personal repos end-to-end, one per run, chaining runs for up to 40 min — branch, build, verify, mark shipped, merge + push main. With nothing to ship, reports that and stops; logs structured hygiene observations after each ship |
agenton |
zsh agenton/agentoff: keep the Mac awake with the lid closed for N minutes and log one line per minute — Wi-Fi network (named by gateway IP; 📱 marks a phone hotspot), ping latency, and Claude/Codex busy/total session counts. Sourced from ~/dotfiles/zsh/lib/45-agenton.zsh; the skill teaches Claude to read the log and edit the script, never to run it |
conductor |
Human-driven "ship one item" that never implements in-process: the Claude session conducts Cursor (agent) as builder and Codex (codex exec, read-only) as reviewer via worker.sh / review.sh; owns the shared triage doc ORCHESTRATOR.md that advance-roadmap's scheduler also reads |
babysit-pr |
Iteratively address automated reviewer threads (Codex, CodeRabbit, etc.) on the current PR |
close-out |
Sweep the conversation and machine for orphaned work, account for touched running-plan threads, and offer to copy recent harness plans into the repo |
logo-gestalt |
Gestalt logo design: symbol inventory, shared-vector matching, SVG + raster preview board, vision critique |
cleanup-local-branches |
Phased cross-repo cleanup of stale branches + worktrees with reflog-recovery log |
datadog-tool-selection |
Guide for picking the right Datadog tool for an observability question |
datadog-add-log-facets |
Create Datadog Logs facets from a path list via Claude in Chrome, leaving display names empty |
deploy-koyeb |
Deploy a local service directory to a Koyeb app/service from a worktree or branch |
handoff |
Close out the session, then spawn a successor agent in the right Superset workspace with state, not transcript; --cloud writes the prompt for a claude.ai cloud session instead |
self-destruct |
The session deletes its own Superset worktree, local branch, workspace and tab after its PR is confirmed merged (loss check + confirm first), then signs off ⛏️; teardown runs from a detached script so it survives the session. In a root checkout it only closes the tab. The single command for ending a session: absorbs the old done skill and its confirmation dialog can run close-out or pick-up first. Replaces close-sswt |
clean-sswts |
Sweep Superset workspaces from a project's root checkout: classify by PR state, dirtiness and liveness, reap the finished ones through self-destruct's shared reap-workspace.sh, rename drifted ones, and surface the rest |
revive |
Revive a dead session (claude.ai Remote Control link, session_ id, UUID, or none to find unarchived dead ones across this Mac and the OMEN): map it to its transcript, autopsy why it died (power, reboot, CLI update, OAuth, WSL), propose a guardrail, then reattach the original thread or, failing that, resume it in a new thread |
kosha-triage |
Migrate stale ClickUp captures into the markdown vault, then delete the originals |
jnelken-linear |
File or relabel a personal-workspace (DEV-*) Linear issue — refuses to create one without the repo/<directory> label advance-roadmap routes on |
linear-cli |
Read/write Linear from the shell with the linear CLI — the fallback when MCP is logged out or expired, plus the default filters that make issue list hide issues that exist |
lunchmoney-hygiene |
Audit Lunch Money integrity and grouping opportunities; verify cache coverage, compare runs, and surface actionable changes without live financial edits |
monthly-retro |
Generate a stakeholder-readable monthly retrospective from commit history |
monthly-retro-commits |
Export commit-level effort data (TSV, lines-changed sorted) for the retro skill |
move-diff |
Relocate uncommitted changes to a different branch/worktree |
fix-stale-docs |
Scan for dead doc references, fix or delete them, push to an open (preferably approved) branch |
peer-review |
Review with Claude for Codex-authored changes, Codex otherwise |
pick-up |
Resume open work from IN_PROGRESS.md, running plan docs, and recent harness plans; offer to copy harness plans into the repo; sweep flags only evidence-backed done/tracked plan threads |
post-pr |
Take a finished PR the rest of the way: review until clean, watch CI, post to #pr-review, badge + undraft |
pr-review-gaps |
Find sswt PRs never posted to #pr-review, with a hold-list for deliberately parked ones |
prod-query |
Read-only production customer-tenant data questions via the api repo's audited query:prod-readonly script — CLI contract, RUM id → tenant mapping, safe query cookbook, PII rules |
rebase-after-squash |
Resolve rebase-after-squash-merge conflicts cleanly |
rum-review |
Query Datadog RUM data, synthesize findings into categorized issues |
scoutmail |
Monitor all Spark email accounts and surface only new messages that genuinely require attention |
instruction-profile-maintenance |
Maintain instruction recipes and loading behavior while preserving profile boundaries, hook contracts, and runtime isolation |
session-hardening |
Session retrospective: turn friction and gaps hit during a session (wrong docs, misfiring hooks, missing skills, repeated manual steps, newly-dead mechanisms) into concrete tooling fixes |
screenshot-pr |
Capture one signature screenshot (deploy preview, or localhost for a sub-PR), upload it via Claude-in-Chrome into the PR description |
slack-gif-creator |
Build animated GIFs optimized for Slack |
superset-config |
Configure superset.sh (agentic IDE) project scripts — setup/run/teardown |
tab-triage |
Flush open Chrome tabs through chrome-tab-org, then triage the JSON log into vault notes and ClickUp tasks |
unblock-roadmap |
Interactive sweep of the repos advance-roadmap is blocked on — asks how to resolve each, records answers as directives for a later run |
unblock-sessions |
Walk every Claude session in a Superset tab on any online host (or one via --host) one at a time, ask Jake (with full context) about whatever each is waiting on, relay the answer or reap, and rescan for follow-ups; Skip for now / Skip forever on every prompt |
use-spark |
Query the Spark email client CLI — emails, calendar, contacts, scheduling |
weekly-product-changelog-and-announcement |
Generate + post a weekly per-engineer changelog (internal) and a customer-facing product announcement (external) from cross-repo git history |
wrapup-repos |
Wrap up in-progress work in one repo unattended — commit + record decisions in .claude/IN_PROGRESS.md |
Each skill is a directory with a SKILL.md (required) plus optional scripts/, references/, assets/.
Developer Workflow Kit generalizes eight of these
workflows for other developers: roadmap unblocking and implementation, moving diffs,
rebasing after squash merges, stale-doc repairs, session close-out/resumption, and session
hardening. Public editions live at skills/<name>/public/SKILL.md; the personal entrypoints
above keep their existing behavior. Build the skills-only archive with
python3 bin/build-developer-workflow-kit /tmp/developer-workflow-kit.zip.
Public submission requirements and excluded candidates are tracked with the plugin source.
Personal DEV tickets represent explicitly requested tickets or concrete future work outside the
current branch; PRs do not require retrospective tickets. Work CON PR backfill is unchanged.
bin/linear-pr-archive exports completed tickets to verified comments on their merged PRs,
with private local snapshots and repeat-safe markers. It retains planning tickets and only
deletes proven legacy create-pr backfills when explicitly run with --delete and reviewed
backfill_evidence. Issues without PRs or unexported documents/assets are retained.
bin/hygiene-log records structured observations in the personal memory directory's
hygiene.jsonl; no automatic hygiene tickets are filed.
| Command | Purpose |
|---|---|
/resolve-conflict |
Guide Claude through git merge/rebase conflict resolution with step-by-step reporting |
| Agent | Purpose |
|---|---|
codex-reviewer |
Run one Codex review pass and return faithful normalized findings for caller triage |
claude-reviewer |
Independently review Codex-authored changes or a named review angle with code evidence |
implementer |
Implement one scoped task with Codex-first routing, Claude fallback, checks, and local checkpoints |
researcher |
Investigate code, prior decisions, documentation, branches, and PRs read-only with source evidence |
ops-investigator |
Investigate Datadog, Koyeb, and GitHub Actions read-only with reproducible evidence and observability gaps |
prod-reader |
Answer read-only production tenant-data questions through the audited api query script — aggregate/anonymized results, exact SQL in the report, never raw PII |
| Hook | When | Purpose |
|---|---|---|
ai-tools-sync.sh |
SessionStart | Keep the deploy clone (~/.ai-tools) synced with origin/main, re-link on change, and nudge about a dirty deploy clone or leftover --dev links |
ai-tools-deploy-guard.sh |
PreToolUse (Edit|Write|MultiEdit|NotebookEdit) | Block edits into the deploy clone, including through installed symlinks; allow gitignored runtime files; wired by install.sh |
post-yesterdays-ccusage.sh |
SessionStart | Post daily Claude + Codex token-usage summaries to Slack, catching up missed days |
pick-up-nudge.sh |
SessionStart | Nudge to run /pick-up when the repo has an IN_PROGRESS.md with open checklist items; asks for a background /pick-up sweep once per ISO week; resets a file with nothing open to the empty template |
block-push-to-main.sh |
PreToolUse (Bash) | Block a Claude-issued git push that would target main, with a per-repo allowlist |
readonly-ops-guard.sh |
PreToolUse (ops-investigator frontmatter) | Block known mutating ops commands with a deliberately text-based, fail-open guardrail |
zsh-word-split-guard.sh |
PreToolUse (Bash) | Block Bash commands that hit zsh traps: unquoted $VAR in set --/for … in (no word-split) and bare === words (= expansion); bypass with # zsh-ok |
enforce-claude-symlinks.sh |
git pre-commit hook (not a settings.json hook — runs only from the dev checkout) |
Reject a commit that adds an unsymlinked regular file under ~/.claude/ |
claude-symlink-hygiene.sh |
SessionStart | Nudge about new unsymlinked files in ~/.claude/{hooks,commands,agents}/ before they become a blocker |
personal-repo-hygiene-check.sh |
SessionStart | Nudge personal-repo conventions — misplaced plan files, malformed ADRs, missing PRODUCT.md/DESIGN.md, missing .superset/config.json |
session-doc-start.sh |
SessionStart | Create/refresh the live .claude/.sessions/<id>.md presence doc for the worktree, plus its durable global mirror |
session-doc-stop.sh |
Stop | Mechanically refresh the session doc's timestamp and git diff --stat summary |
session-doc-end.sh |
SessionEnd | Delete the local session doc on clean exit; mark its global mirror ended_cleanly |
hygiene-scan-all.sh |
SessionStart (async) | Regenerate the cross-repo ~/.claude/HYGIENE.md hygiene report cache |
Hooks need extra wiring in ~/.claude/settings.json — see hooks/README.md.
| Automation | Schedule | Purpose |
|---|---|---|
advance-roadmap |
Daily at 10:30 (launchd) | Headlessly ship planned roadmap / Linear items in a parallel batch, one per repo, each as a merged PR from its own Superset workspace |
machine-status |
Always on (launchd) | A read-only page of this Mac's health — the dotfiles daemons, Tailscale, Superset, disk, uptime, power, sleep and AI provider gates — at /status on the tailnet |
paradev |
Daily at 18:50, plus a page server (launchd) | Jake's Paradev Production Run standing — ranks, personal records and every day's single-day rank — on its own page at /paradev on the tailnet |
reap-sswts |
Every 10 min (launchd) | Tear down sswts whose Claude tabs signed off ⛏️ over an hour ago (PR merged, tree clean, HEAD carried by the PR), and close ⛏️ root-checkout tabs; no model calls |
tailnet-index |
Always on (launchd) | The tailnet's front page: lists every page this Mac serves over Tailscale Serve, live |
wrapup-repos |
Sunday 2:45am, weekly (launchd) | Headlessly wrap up in-progress work in one repo via the wrapup-repos skill |
Scheduling (the launchd plist) needs manual per-machine setup — see automations/README.md.
| Script | Purpose |
|---|---|
awesome-statusline.sh |
Bash statusline for Claude Code — context/usage-limit bars with a momentum-based color gradient, blink at high-risk pace, cost/session time, Node.js version |
Unlike the other categories, installing this also patches ~/.claude/settings.json (statusLine.command, with a timestamped backup) so Claude Code actually runs it — see Install below. Requires jq (auto-installed by install.sh if missing).
| Doc | Purpose |
|---|---|
session-retrospectives.md |
The session-retrospective class — field schema, action tiers, self-start rules, and the registry of retros that live here or as ~/.claude/CLAUDE.md sections |
| Tool | Purpose |
|---|---|
ai-tools-clone-lock |
Keep the deploy working tree read-only; run -- opens a brief update window and re-locks afterward |
main-push-wait |
Sleep until a Koyeb app's last deploy is 20 min old before pushing or merging to an auto-deploying main (--check to just report) |
Deploy model: ~/code/ai-tools (this checkout) is for development only. What actually lands in ~/.claude/* is symlinked from a separate deploy clone at ~/.ai-tools, which tracks origin/main and is never hand-edited. git push to main from the dev checkout is the deploy step — every machine and cloud environment then picks it up the same way, without needing a ~/code/ai-tools checkout of its own.
One-liner bootstrap (no checkout needed — clones ~/.ai-tools and links everything from it):
curl -fsSL https://raw.githubusercontent.com/jnelken/ai-tools/main/install.sh | bashEnvironment variables (all optional):
| Variable | Default | Purpose |
|---|---|---|
AI_TOOLS_HOME |
~/.ai-tools |
Where the deploy clone lives |
AI_TOOLS_REPO |
https://github.com/jnelken/ai-tools.git |
Remote to clone/update from |
AI_TOOLS_REF |
main |
Branch/ref to track |
install.sh works identically in three invocation modes:
- Piped from GitHub (above) — no local checkout at all.
- Run from the deploy clone:
~/.ai-tools/install.sh— same behavior as piped. - Run from the dev checkout:
~/code/ai-tools/install.sh— default behavior is still the hosted install (update + link from~/.ai-tools). The dev checkout itself is not linked unless--devis passed.
Flags: --dev (link from the checkout you're running instead of ~/.ai-tools — temporary, for testing an unpushed change; a plain ./install.sh afterward flips back), --no-update (skip the fetch/merge, just re-link), --quiet (only print changes and warnings), -h/--help.
The installer creates symlinks at:
~/.claude/skills/<name>→~/.ai-tools/skills/<name>(per skill)~/.claude/commands/<name>.md→~/.ai-tools/commands/<name>.md(per slash command)~/.claude/output-styles/<name>.md→~/.ai-tools/output-styles/<name>.md(per output style; select withoutputStylein settings.json)~/.claude/agents/<name>.md→~/.ai-tools/agents/<name>.md(per agent)~/.claude/hooks/<name>→~/.ai-tools/hooks/<name>(per hook)~/.claude/automations/<name>/<script>→~/.ai-tools/automations/<name>/<script>(per automation script; scheduling itself is separate, seeautomations/README.md)~/.claude/awesome-statusline.sh→~/.ai-tools/statusline/awesome-statusline.sh, plus~/.claude/settings.json'sstatusLine.commandis set to run it
It also prunes dangling ~/.claude/* symlinks left behind by renamed or removed ai-tools content — only links whose target was inside an ai-tools checkout are touched; anything else is left alone.
It also wires a SessionStart hook (ai-tools-sync.sh) into ~/.claude/settings.json that keeps ~/.ai-tools synced with origin/main automatically on future sessions — see hooks/README.md — and a PreToolUse hook (ai-tools-deploy-guard.sh) that blocks Claude's file tools from editing the deploy clone while allowing gitignored runtime files.
Safety: it refuses to overwrite existing non-symlink files/directories — manually rm -rf the conflicting path first if you want this repo's version. If ~/.ai-tools has been edited in place (uncommitted changes), the update step warns and skips the fetch/merge rather than resetting it — no local edit is ever silently dropped.
~/.ai-tools is read-only on purpose: EACCES / permission denied there (including through installed symlinks) means an edit targeted the deploy clone. The fix is always to edit ~/code/ai-tools. Updates use bin/ai-tools-clone-lock run -- <command> and re-lock even on failure; .git/ stays writable for fetches and hooks. Existing gitignored runtime files stay owner-writable, including session-hardening's memory.md (created on first lock) and existing Python cache directories; their parents stay locked.
For an emergency repair, run ~/.ai-tools/bin/ai-tools-clone-lock unlock, perform the repair, then ~/.ai-tools/bin/ai-tools-clone-lock lock. Check with ~/.ai-tools/bin/ai-tools-clone-lock status. Removing the clone with rm -rf ~/.ai-tools also needs unlock first. These commands honor AI_TOOLS_HOME when the clone lives elsewhere; install.sh --dev leaves the dev checkout writable.
Any environment without a persistent ~/code/ai-tools checkout (Claude Code on the web, Cursor cloud agents, Superset workspaces, CI) just needs the one-liner bootstrap run as its setup step:
curl -fsSL https://raw.githubusercontent.com/jnelken/ai-tools/main/install.sh | bash- Claude Code on the web: put it in the environment's setup script.
- Cursor cloud agents: put it in
.cursor/environment.json'sinstallcommand. - Superset workspaces: put it in
.superset/config.json'ssetupcommand.
What the bootstrap does not carry: ~/.claude/settings.json is machine-local and not versioned, so beyond statusLine, the ai-tools-sync.sh SessionStart entry, and the ai-tools-deploy-guard.sh PreToolUse entry that install.sh writes, every other hook still needs wiring per hooks/README.md on each new environment. Secrets (webhook URLs, API keys) arrive via environment variables set on the environment itself — never from the repo.
install.sh runs under Git Bash (it sets MSYS=winsymlinks:nativestrict so links are real NTFS symlinks, never silent copies). One-time prerequisites:
- Developer Mode on (Settings → System → For developers) so symlinks work without elevation —
install.shchecks this first and exits with instructions if not. jqonPATH(scoop install jq).CLAUDE_CODE_GIT_BASH_PATHpointing at Git Bash'sbash.exe(e.g.~\scoop\apps\git\current\bin\bash.exe) when Claude Code can't find it on its own — hooks and the statusline run through it.
Run from PowerShell:
& "$env:USERPROFILE\scoop\apps\git\current\bin\bash.exe" -lc '~/.ai-tools/install.sh'Launchd automations don't apply on Windows.
edit in ~/code/ai-tools → commit → push # push IS the deploy step
~/.ai-tools/install.sh # picks it up on this machine now
# (or just wait — the next session's
# ai-tools-sync hook does this automatically)
To test an unpushed change before it's live everywhere else:
cd ~/code/ai-tools
./install.sh --dev # ~/.claude/* now points at THIS checkout — loud warning printed
# ... test the unpushed change ...
./install.sh # flips back to the deployed copy (~/.ai-tools)The trap: editing through ~/.claude/... (instead of ~/code/ai-tools/...) targets the deployed copy and fails with permission denied while it's locked. The fix is always to edit ~/code/ai-tools, commit, and push. Edits left after an emergency unlock still trigger the dirty-clone checks and block updates.
These are personal tools and may reference my specific workflows/repos. The one-liner installs my config into your ~/.claude and keeps tracking my origin/main automatically via the ai-tools-sync hook — running it as-is means my future edits land in your config too. If that's not what you want, fork the repo and point AI_TOOLS_REPO at your fork before bootstrapping, or just copy the individual skills/commands you find useful and adapt them locally.
Profile selection, runtime isolation, installation and rollback. ADR 0001 records the intent, alternatives, and adopted implementation plan. Maintained recipes live in instructions/; agent-profile explains selection and agent-run composes CLI launches.
A successful clone or fast-forward restarts into the deployed installer once, preserving flags and skipping another update. This avoids mixing old parsed functions with newly deployed scripts. --dev, --no-update, and unchanged revisions do not restart.
Dirty deploy clones still skip updates. Executable-bit drift gets a specific diagnostic, a command to preserve tracked changes in a patch, and shell-escaped permission repair commands through ai-tools-clone-lock. Repairs remain explicit; untracked files require separate preservation, and staged changes require separate review. No local edits are automatically discarded.
Regression checks (temporary local Git remotes; no network): python3 -m unittest discover -s lib -p test_installer.py.