zsl-superpowers
CLAUDE.md2 starsChanged 52 days agoMITView on GitHub
A Claude Code plugin distributed through a marketplace: a collection of skills (slash-command workflows under skills/) plus a MkDocs documentation site (docs/) published to GitHub Pages. Most maintenance here is keeping parallel surfaces — plugin manifest, READMEs, docs nav, changelog — in sync. Skills live in bucket folders under skills/: The rest of this file is lockstep contracts: sets of files or fields that must move together. Editing one surface without the others raises no error at edit time —…
- Deletes or force-pushes
In this repository32 other files it gives its agents.
- ask-zslSkill
- codebase-designSkill
- code-reviewSkill
- commit-push-prSkill
- commitSkill
- decision-mappingSkill
- diagnoseSkill
- domain-modelingSkill
- git-branchSkill
- grill-with-docsSkill
- human-itlSkill
- improve-codebase-architectureSkill
- prototypeSkill
- setup-zsl-superpowersSkill
- tdd-parallelSkill
- tddSkill
- teach-me-the-codebaseSkill
- to-issuesSkill
- to-prdSkill
- triageSkill
- verify-coverageSkill
- edit-articleSkill
- setup-pre-commitSkill
- steampipeSkill
- grillingSkill
- grill-meSkill
- handoffSkill
- timesheetSkill
- writing-great-skillsSkill
- afk-fanoutSkill
- afk-workerSkill
- morning-reviewSkill
The file
We split this CLAUDE.md into the rules it gives an agent
4 rules. About 0 are common, 1 is distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 54
If the release changes a skill's behavior, also check whether the prose describing it has gone stale.
- Very specific: line 70
Always preserve a prose fallback: If the resolver finds nothing it prints a zsl-gate: … unresolved line.
- Very specific: line 81
Do not go back to the stock layout: it anchors a three-line title box at its top, so short titles like "Home" leave a hole through the …
- Very specific: line 85
Rendered cards are cached in
.cache/plugin/social/: After changing the layout or either asset, rm -rf .cache/plugin/social before make …
≈ “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
ZSL Superpowers
A Claude Code plugin distributed through a marketplace: a collection of skills (slash-command workflows under skills/) plus a MkDocs documentation site (docs/) published to GitHub Pages. Most maintenance here is keeping parallel surfaces — plugin manifest, READMEs, docs nav, changelog — in sync.
Skills live in bucket folders under skills/:
engineering/— daily code workmisc/— kept around but rarely usedproductivity/— daily non-code workflow toolsremote-agents/— the overnight loop: schedule unattended remote runs, run them, review the results
Validating changes
make lint—ruff checkplusbasedpyrightover the Python (mkdocs hooks, scripts). When you add a Python deterministic-gate script underskills/**/scripts/, add it to thebasedpyrightline.make test— runs the deterministic-gate script tests:pytestoverskills/**(the Python scripts'scripts/tests/test_*.py) plus each shell script's own assertion runner. Add a line per new shell test runner.make docs— strict MkDocs build. This is the exact gate the GitHub Pages deploy runs on push tomain— run it locally before pushing any change todocs/**,skills/**/SKILL.md,scripts/mkdocs_hooks/**,layouts/**, ormkdocs.yml, or the deploy fails. (make docs-servefor live preview.)make format—ruff format.
Invariants that break silently
The rest of this file is lockstep contracts: sets of files or fields that must move together. Editing one surface without the others raises no error at edit time — it surfaces later as a failed deploy, a mismatched marketplace version, or a remote routine that won't resolve. Four of them.
Skill sync — five places
A skill in engineering/, productivity/, misc/, or remote-agents/ must be cited in five places, all kept in sync. Adding or removing one means updating all five:
.claude-plugin/plugin.json— entry in theskillsarray.- Top-level
README.md— one-line description in the matching bucket of the Reference section, skill name linked to itsSKILL.md. Plus a workflow-section reference if it's part of the end-to-end loop. skills/<bucket>/README.md— one-line description, name linked to itsSKILL.md.docs/skills/index.md— row in the table under the matching role-in-the-loop section (Plan / Break down / Build / Verify / Ship / Overnight / Cross-cutting / Off-loop and meta — not the bucket folder; the page groups by role and says so). If it's a loop skill, also add a node to the "Which skill do I want?" mermaid decision tree.mkdocs.yml— nav line under the matching role group (same role headings asdocs/skills/index.md, not the bucket).
Per-skill pages under docs/skills/<name>.md are auto-generated from SKILL.md by scripts/mkdocs_hooks/skill_pages.py — don't edit by hand. mkdocs build --strict (= make docs) runs on every push to main that touches docs/**, skills/**/SKILL.md, scripts/mkdocs_hooks/**, layouts/**, or mkdocs.yml, so a stale nav entry will fail the GitHub Pages deploy.
Routing pair — ask-zsl and the decision tree move together. The ask-zsl interactive router (skills/engineering/ask-zsl/SKILL.md) and the "Which skill do I want?" mermaid decision tree in docs/skills/index.md are two views of the same loop routing. Whenever you add or remove a loop skill, update both: the decision-tree node and ask-zsl's routing branches. A skill present in one but not the other is a stale-routing bug.
Sixth lane — model-invoked-only skills get a lighter treatment. A skill whose frontmatter carries no disable-model-invocation: true and that users never invoke off a list — the shared, model-invoked primitives (codebase-design, domain-modeling, grilling) — does not take the five-place treatment above. Instead it is synced in exactly two places: (1) .claude-plugin/plugin.json — entry in the skills array; and (2) docs/skills/index.md — a row in the Shared / model-invoked subsection (not a role table). It is deliberately omitted from the top README.md / bucket README.md user-command lists, from the mkdocs.yml nav, and from the "Which skill do I want?" decision tree — users don't pick these directly, they get composed by other skills. The taxonomy and the composition rule (a user-invoked skill may invoke model-invoked skills but never another user-invoked one) live in docs/invocation.md; the decision is recorded in docs/adr/0001-user-invoked-model-invoked-taxonomy.md. The strict docs build still applies, so the auto-generated per-skill page under docs/skills/<name>.md must be reachable — list the model-invoked skills under not_in_nav in mkdocs.yml so the page builds without a nav entry.
Release sync — version fields + the release workflow
Update, in lockstep:
.claude-plugin/plugin.json—versionfield..claude-plugin/marketplace.json—versionfield. Must matchplugin.json, otherwise the marketplace UI advertises the old version while the installed plugin reports the new one.docs/changelog.md— new entry at the top describing the user-facing change.
The changelog is the only narrative record of what each release shipped, so:
- Add an Upgrading from X.Y sub-block whenever the release has migration steps (lingering hook state from a removed skill, manual workflows that became automatic, breaking renames, etc.) —
README.md's "Updating" section and the FAQ's "How do I update?" answer both point readers here, so the implicit promise is that breaking-ish releases will have one. - If the entry was drafted mid-development (common here, since behaviour is often spec'd before it's built), reconcile it against the actual
git diffofskills/**before release — drafted entries drift from final behaviour (a renamed mechanism, a reversed default, a state added late), and the changelog is the one place that drift becomes a published lie. Flag any change that alters interactive behaviour even when the release headline is a new opt-in path.
A push to main that bumps plugin.json's version field triggers .github/workflows/release.yml, which validates the rules above (changelog section present for the new version, marketplace.json in sync) and creates a v<version> GitHub Release with the extracted changelog section as its body. Failures here block the release — fix the rule violation and re-push. The workflow only fires on actual version diffs; touching plugin.json for other reasons (adding a skill entry) is a no-op.
If the release changes a skill's behavior, also check whether the prose describing it has gone stale. Pages that most often need updating: README.md (workflow walk-through + per-skill one-liners), docs/workflow.md (mirrors the README), docs/quickstart.md, and docs/faq.md.
The remote-agents loop — four files (runtime contract)
Unlike the two contracts above, this one governs runtime behaviour, not just repo bookkeeping.
Scheduled /afk-worker routines fire in fresh remote claude.ai sessions with no plugins installed, and plugin availability is not configurable per claude.ai environment. Skills are provisioned by a repo-level SessionStart hook (.claude/hooks/zsl-remote-skills.sh, written by /setup-zsl-superpowers Section F) — NOT by "installing the plugin in the environment." Don't reintroduce environment-plugin-install language in the remote-agents docs.
The loop is a contract across four files that must stay in lockstep: afk-fanout, afk-worker, morning-review (in skills/remote-agents/) plus skills/engineering/setup-zsl-superpowers/remote-env.md. They share the afk-runs ledger schema and the claim lifecycle (scheduled → in-progress → done|tracking); change one, check the others. Anything that must cross from an isolated worker clone to your local session travels on the afk-runs branch — .scratch/ state does not sync across clones. The initial ledger entry shape (claim: scheduled / outcome: pending, the · manifest separator, the dated path) is serialized by skills/remote-agents/afk-fanout/scripts/write-afk-entry.sh — a schema change updates that script too (see the scripts contract below).
Deterministic-gate scripts — bundle, resolve, fall back
Some skills delegate a secretly-deterministic step (one with exactly one correct answer — a length cap, a clean-tree/file-exists preflight, a fixed-schema serialization) to a small script bundled at skills/<bucket>/<name>/scripts/, behind a "deterministic gate" callout in the SKILL.md. Four rules hold them together:
- Bundle inside the owning skill's
scripts/dir. Both distribution paths already carry it for free — the marketplace install copies the whole repo to~/.claude/plugins/cache/zsl-superpowers/zsl/<version>/skills/<bucket>/<name>/, and the remoteSessionStarthook (zsl-remote-skills.sh)git clones the repo and symlinks each whole skill dir into~/.claude/skills/<name>/. No hook or packaging change is needed to ship a script — and a repo-rootscripts/dir (the mkdocs/book tooling) is not provisioned to those environments, so skill-shipped scripts must never live there. - Resolve, never hard-code a path.
${CLAUDE_PLUGIN_ROOT}does not expand inside SKILL.md Bash (Claude Code bug), so each callout resolves the script across all three environments with the same priority search and| head -1:$PWD/skills/*/<name>/scripts/<file>(this repo/dev) →$HOME/.claude/skills/<name>/scripts/<file>(remote symlink / personal install) → newest$HOME/.claude/plugins/cache/zsl-superpowers/zsl/*/skills/*/<name>/scripts/<file>(local plugin,sort -Vr). - Always preserve a prose fallback. If the resolver finds nothing it prints a
zsl-gate: … unresolvedline; the SKILL.md must keep the original prose under an explicit Fallback heading so the step still works by model judgment. A gate that silently does nothing is a bug. - Every script has tests, including a fails-the-prose-way case. Python scripts:
scripts/tests/test_*.pyrun bypytest(and add the script tomake lint'sbasedpyrightline). Shell scripts: ascripts/tests/test_*.shrunner added tomake test. Each must include at least one input the old prose way gets wrong (e.g. a 1025-char description, a clean tree on a detached HEAD, aoutcome: scheduledvspendingslip).
Social cards — custom layout, cached output
Cards come from the social plugin using layouts/zsl.yml, which matches the
marketing site's cards (zunosmartlabs-public-website, scripts/og-template.html):
the ZSL lockup, the light #f8f9fc ground, Space Grotesk over Inter, and the
violet-to-amber rule. The two brand assets it draws are docs/assets/zsl-lockup-light.png
(the hero lockup recoloured for a light ground) and docs/assets/zsl-rule.png.
Do not go back to the stock layout: it anchors a three-line title box at its top,
so short titles like "Home" leave a hole through the middle of the card. Every text
layer in zsl.yml is anchored center instead.
Rendered cards are cached in .cache/plugin/social/. After changing the layout
or either asset, rm -rf .cache/plugin/social before make docs, or you will keep
looking at the old cards. The plugin fetches Space Grotesk and Inter from Google
Fonts at build time, so the build needs network access.
Pages carry no per-page description, so every card falls back to site_description.
Adding a description: to a page's front matter gives that card its own subtitle.
Agent skills
Per-repo configuration for the ZSL engineering skills lives in docs/agents/.
Issue tracker
Hybrid: .scratch/ markdown is the source of truth, each issue mirrored to a linked GitHub issue so it can appear on the project board. See docs/agents/issue-tracker.md.
Triage labels
Six canonical roles, default strings; written to the file's Status: line and pushed to the mirror issue's GitHub label. See docs/agents/triage-labels.md.
Domain docs
Single-context: CONTEXT.md + docs/adr/ at the repo root. See docs/agents/domain.md.
Ship style
Pull request. See docs/agents/ship-style.md.
Project board
zsl-superpowers — https://github.com/orgs/ZunoSmartLabs/projects/11. See docs/agents/project-board.md.
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.

