"Kowalski, status report." β Skipper
English Β· EspaΓ±ol
A Claude Code framework that scaffolds, documents, maintains β and now remembers β your project, following Clean Code and SOLID principles.
skipper makes Claude understand your project β its stack, its layers, its decisions β and keeps the living docs in sync on its own while you code. Detects your stack, generates an opinionated CLAUDE.md, ships specialist sub-agents that refactor with stack-aware judgment, and proactively keeps ADRs/PRDs/architecture from rotting.
Other plugins give you templates. skipper gives you a crew member that knows the ship, enforces the rules, and keeps the logbook up to date β so you just sail.
Skipper now remembers. The ADRs/PRDs/decisions it keeps stop being a pile of markdown and become a queryable, cited, drift-aware memory β for you and your agents.
skipper ask "why are the hooks proactive?" # cited, LLM-synthesized answer over your decisions
skipper context hooks/ # the ADRs governing a path + invariants + freshness
skipper relate ADR-0001 ADR-0014 # how two decisions connect (direct / via a hub)- For agents β a
skipper-memoryMCP server lets a Conductor agent callcontext_for(path)before editing, so it follows the settled decisions instead of repeating mistakes. Conductor executes, Skipper knows. - Proactive β
memory-guardinjects the governing ADRs the moment you edit a path;memory-stopblocks the turn (exit 2) if governed code changed without verifying compliance. - Drift-aware β flags when a doc has gone stale vs the code (version + git-delta), surfaces who decided and what touched a subsystem, and catches count conflicts.
- Honest β every citation is self-verified against the source, and a 19-check gold gate runs in CI.
Opt-in OSS engine (Node + built-in node:sqlite, zero deps) under engine/ β a separate package, reached via MCP, so the plugin stays zero-install (ADR-0017). See engine/README.md.
When you start a new project in Claude Code:
- You paste the same Cursor/CLAUDE.md rules over and over.
- You fight with Claude because "it doesn't follow the architecture" β but you never told it which one.
- Technical decisions (why Supabase and not Firebase?) live in a Slack thread no one reads anymore.
- You end up installing 5 separate plugins: one for ADRs, one for boilerplate, one for review, one for rules, one forβ¦
A single plugin that knows 8 common stacks (React Vite, Next.js, Expo, Node API, Python FastAPI, all with/without Supabase) and:
- Detects your stack with
/skipper:scan. - Applies an opinionated CLAUDE.md (mandatory structure, naming, libs, anti-patterns).
- Keeps living docs β ADRs/PRDs/plans with templates and automatic numbering.
- Ships specialists β
/skipper:react-vite,/skipper:nextjs,/skipper:supabase, etc. that refactor while respecting the project's laws. - Acts proactively β after initial setup you don't run commands. Hooks inject directives Claude follows: in plan mode it plans within your architecture (applies the laws, reuses existing code, references your docs), and as you code it keeps docs and the stack block in sync β syncing before it hands control back. All loop-safe, throttled, and opt-out (
SKIPPER_PROACTIVE=off).
# Install
/plugin marketplace add c-donnachie/madagascar
/plugin install skipper@madagascar
/reload-plugins
# In your project:
/skipper:init-structure # π§ detect stack + scaffold docs/
/skipper:scan # π§ what stack do I have?
/skipper:stack-apply expo-supabase # π§ apply opinionated CLAUDE.md
# Working:
/skipper:ask "is this component well organized?" # captain routes
/skipper:react-native "extract this hook to domain/" # specialist refactors
/skipper:update # kowalski updates docs
# Validate before PR:
/skipper:stack-doctor # table of CLAUDE.md violations
/skipper:review # specialist reviews the diff/plugin marketplace add c-donnachie/madagascar
/plugin install skipper@madagascar
/reload-plugins
cd /path/to/your/project
claude --plugin-dir /path/to/skipper| Command | What it does |
|---|---|
/skipper:scan |
Detects the project stack. Doesn't write. |
/skipper:stack-apply <id> |
Applies opinionated profile: CLAUDE.md + docs/architecture/stack.md. |
/skipper:stack-add <layer> |
Adds a layer (tailwind, shadcn-ui, tanstack-query, etc.). |
/skipper:init-structure [app|service|library] |
Creates docs/ for the project type + invokes scan + suggests stack-apply. |
| Command | What it does |
|---|---|
/skipper:update |
Reads diff and proposes ADRs/PRDs/architecture/business docs. |
/skipper:new-adr "title" |
Creates numbered ADR (MADR-aligned template). |
/skipper:decide "topic" |
Facilitates a decision (options + tradeoffs + recommendation) and captures it as a complete ADR β brainstorm β decision. |
/skipper:supersede-adr N "title" |
Supersedes ADR N with a new one β marks the old Superseded by, links both (ADRs are immutable). |
/skipper:new-prd "title" |
Creates numbered PRD. |
/skipper:new-plan "title" |
Creates implementation plan. |
| Command | Specialist |
|---|---|
/skipper:architect |
Structure, layers, dependencies |
/skipper:solid-coach |
Clean Code, SOLID |
/skipper:react-vite |
React + Vite (features-first, TanStack Query) |
/skipper:react-native |
RN + Expo (data/domain/presentation layers) |
/skipper:nextjs |
Next.js (RSC, Server Actions) |
/skipper:node-backend |
Node API (Fastify + Zod + Drizzle) |
/skipper:supabase |
RLS, auth, migrations, Realtime |
| Command | What it does |
|---|---|
/skipper:ask "free question" |
Skipper picks the right specialist for you. |
/skipper:goal "what to build" |
Memory-aware grilling: consults your decisions, asks only the open questions, states an explicit goal + acceptance before building. |
/skipper:refactor <file> |
SOLID refactor with solid-coach. |
/skipper:review |
Stack specialist reviews diff vs origin/main. |
/skipper:lib-lookup "query" |
WebSearch scoped to official docs of your stack. |
| Command | What it does |
|---|---|
/skipper:stack-doctor |
Table of CLAUDE.md violations by severity. |
/skipper:stack-sync |
Diffs package.json vs the declared stack β flags undocumented and phantom (declared-but-uninstalled) libraries. |
/skipper:docs-doctor |
Health check of docs/ β stale docs (code moved, doc didn't), stub ADRs/PRDs, broken links, empty folders. |
| ID | Frontend | Backend |
|---|---|---|
react-vite-supabase |
React + Vite | Supabase |
react-vite-node |
React + Vite | Node API |
nextjs-fullstack |
Next.js App Router | Server Actions + Drizzle |
nextjs-supabase |
Next.js | Supabase SSR |
expo-supabase |
RN + Expo | Supabase |
expo-node |
RN + Expo | Node API |
node-api |
(no frontend) | Fastify + Zod + Drizzle |
python-fastapi |
(no frontend) | FastAPI + Pydantic + SQLAlchemy |
Each stack ships an opinionated CLAUDE.md: mandatory folder structure, naming, recommended libs, validatable SOLID rules, and explicit anti-patterns.
Add on top of any compatible stack with /skipper:stack-add <layer>:
tailwindβ Tailwind CSS (web)shadcn-uiβ shadcn/ui (requires tailwind)tanstack-queryβ TanStack Query (web + mobile)zustandβ Zustand storeszodβ Boundary validationnativewindβ Tailwind for RN (Expo only)
skipper lives in the madagascar marketplace. Internally it coordinates several "penguins" as specialized subagents:
| Penguin | Role | Status |
|---|---|---|
| π§ Skipper | Captain/router. Reads context and routes. | v0.4+ |
| π§ Kowalski | Analyst. Reads diff and proposes documentation. | v0.4+ |
| π§ Rico | Demolition / aggressive refactor. | Reserved v1.x |
| π§ Private | Apprentice / tutorials / web lookups. | Reserved future |
Aside from penguins, there are technical specialists (not penguins, the contracted experts):
π architect, solid-coach, react-vite, react-native, nextjs, node-backend, supabase.
- 23 skills (bootstrap, docs, specialists, routers, validation, lib-lookup) β incl.
stack-sync+docs-doctorhealth checks,supersede-adr - 9 subagents (skipper, kowalski + 7 technicals)
- 8 stack profiles + 6 composable layers
- 5 hook events / 9 scripts (proactive by default β see below):
SessionStartβ banner + injects the standing "keep docs in sync" directive into Claude's contextUserPromptSubmitβplan-guard: in plan mode, injects the architecture protocol so every plan applies CLAUDE.md laws, reuses existing code, and references existing docs/ADRsPreToolUse(ExitPlanMode) βplan-exit-guard: best-effort checklist before a plan is presented (no-op if the matcher isn't supported)PostToolUse(Edit/Write) βdocs-syncpoints Claude at the specificdocs/architecturedoc for the subsystem you edited;specialist-suggestnudges you toward a specialist after β₯3 files of one domain; (Bash/Edit/Write) βstack-watchreminds to keep theskipper:stackblock in sync when dependencies changeStopβ if the turn changed code in a documented area without touchingdocs/, instructs Claude to sync docs before yielding (loop-safe, 30-min throttle)- Memory (v1.4, opt-in) β
memory-guard(PostToolUse) injects the ADRs governing the edited path;memory-stop(Stop) blocks (exit 2) if governed code changed without verifying compliance β both no-op without the engine
- π§ Skipper Memory engine (
engine/, opt-in) β a queryable, cited graph of your decisions + askipper-memoryMCP server + a 19-check gold gate (see the Skipper Memory section).
Token cost: ~355 tokens in descriptions (β0.18% of your context window).
After initial setup you shouldn't have to run commands. skipper's hooks inject directives Claude acts on (via additionalContext and Stop continuation) β not just messages for you to read. So as you code, Claude keeps docs/ and the stack block in sync on its own, and when you enter plan mode it plans within your architecture β applying the declared layers/laws, checking whether the feature already exists before building it, and referencing the relevant existing docs.
- On by default. Disable per project (or globally) by setting
SKIPPER_PROACTIVE=offin your environment /settings.jsonenv. - Loop-safe & quiet. Edits to
docs//*.mdnever trigger it; theStopenforcer fires at most once per 30 min and stays silent if you already toucheddocs/. - Conservative. It never documents trivial changes, and the
Stopdirective lets Claude say "nothing to document" and finish.
For the technical reference of how plugins, hooks, skills, and subagents work in Claude Code, see the official docs.
- skipper is the harness, not a template factory. It generates the bare minimum needed for Claude to understand your stack β it doesn't flood the repo with boilerplate.
- Conservatism. Throttled hooks, subagents in
context: fork, HTML markers for idempotency. When in doubt, don't write. - Conventions, not hard rules. The generated CLAUDE.md guides Claude but doesn't block β for hard validation, use
/skipper:stack-doctor.
- β
v1.4 β π§ Skipper Memory: queryable cited memory (
ask/context/relate), proactive memory hooks, an MCP server for agents, and a gold regression gate. - β v1.0 β Submission to Anthropic's official marketplace.
- π v1.1+ β More stacks (Astro, SvelteKit, Tauri, Remix) based on real demand.
- π optional add-ons β
private(onboarding tutorials),rico(automated aggressive refactor).
See CHANGELOG.md for full history.
Bug reports and feedback: https://github.com/c-donnachie/skipper/issues
MIT