| name | md-starter |
| description | Generates a fully structured, project-specific CLAUDE.md by scanning the repo for signal files (package.json, Makefile, .github/workflows/, .env.example, etc.), inferring stack, commands, architecture, and conventions, then asking at most 3 targeted questions for what cannot be inferred. Use whenever the user says 'create a CLAUDE.md', 'my CLAUDE.md is blank', 'generate project context', 'initialize CLAUDE.md', 'set up Claude context for this repo', 'fill in my CLAUDE.md', or any variation where someone needs their project context documented for Claude. If a CLAUDE.md already exists with content, runs a diff-and-merge flow before writing. |
| user-invokable | true |
| argument-hint | |
| metadata | {"category":"utility","version":"1.0.0"} |
Claude.md Starter — Project Context Generator
Scans the repo, infers the tech stack and conventions, asks at most 3 targeted questions, and writes a populated CLAUDE.md that gives Claude full project context from session one.
Invocation Triggers
Explicit:
- "create a CLAUDE.md"
- "my CLAUDE.md is blank"
- "generate project context"
- "initialize CLAUDE.md"
- "set up Claude context for this repo"
- "fill in my CLAUDE.md"
- "run the claude-md-starter skill"
Implicit:
- User pastes a near-empty CLAUDE.md and asks Claude to populate it
- User keeps re-explaining the same project context at the start of sessions
Run immediately when triggered — no upfront questions before scanning.
Workflow (6 Nodes)
| Node | Role |
|---|
| 1 — Detect | Check if CLAUDE.md exists and measure content length |
| 2 — Scan | Read signal files from the project root (see references/scan-signals.md) |
| 3 — Infer | Draft all sections that can be derived from scanned signals |
| 4 — Grill-me | Ask at most 3 questions for what cannot be inferred |
| 5 — Generate | Write the full CLAUDE.md using the template in references/claude-md-template.md |
| 6 — Validate | Confirm required sections are present and non-placeholder |
Node 1 — Detect
Check for CLAUDE.md at the project root.
If not found: Proceed directly to Node 2.
If found and has ≤ 200 characters: Treat as blank — proceed to Node 2.
If found and has > 200 characters: Run the diff-and-merge flow before writing:
-
Read the existing file
-
Complete Nodes 2–4 to produce the generated version
-
Compare section by section — for each of the 8 required sections, classify as:
- NEW — exists in generated, absent or empty in existing
- ENHANCED — both versions have content; generated version adds more
- SAME — both versions have equivalent content
- CONFLICT — both versions have different non-empty content
-
Present a diff summary table:
Section | Existing | Generated | Action
---------------------|----------|-----------|-------
Project Overview | present | enhanced | +additions available
Tech Stack | absent | new | will add
Commands | present | enhanced | +2 commands found
Architecture | absent | new | will add
Code Conventions | present | same | no change
Testing | absent | new | will add
What NOT To Do | absent | new | will add
Environment Setup | absent | new | will add
-
Offer three options:
- A (Recommended) — Keep existing content + add new and enhanced sections only (safe, additive)
- B — Full replace with generated version
- C — Review each conflicting section individually before writing
-
Write the chosen merge result.
Node 2 — Scan
Read signal files using the catalog in references/scan-signals.md. For each file found, extract the fields it reveals. Missing files are skipped silently.
Run all reads in parallel where possible:
package.json — framework, scripts, package manager, dependencies
pyproject.toml / requirements.txt / setup.py — Python stack
Cargo.toml / go.mod / pom.xml / build.gradle — language
Makefile / justfile — named commands
.github/workflows/*.yml — CI/CD steps, deploy targets
Dockerfile / docker-compose.yml — runtime environment, services
.eslintrc.* / .prettierrc.* / eslint.config.* — JS/TS code style
ruff.toml / .flake8 / mypy.ini — Python lint/type config
jest.config.* / vitest.config.* / pytest.ini / conftest.py — test framework
tsconfig.json — TypeScript settings
.env.example / .env.sample — required environment variables
README.md (first 40 lines only) — project description
- Top-level directory listing — architecture pattern
.gitignore — build artifacts and generated files
Node 3 — Infer
Using scanned data, populate as many sections as possible before asking questions:
- Project Overview → from README.md first paragraph; fall back to
package.json description field
- Tech Stack → from language files + framework dependencies
- Commands → from
package.json scripts, Makefile targets, workflow run steps
- Architecture → from top-level directory structure
- Code Conventions → from eslint/prettier/ruff config values
- Testing → from test config files and test directory location
- What NOT To Do → from
.gitignore build outputs, workflow branch protection, lock files
- Environment Setup → from
.env.example variable names and docker-compose services
Node 4 — Grill-Me Intake
Ask only for what cannot be inferred. Maximum 3 questions. Skip any question whose answer is already clear from scanned files.
Present all applicable questions together in one message — never ask them across multiple turns:
Quick questions to finish your CLAUDE.md (answer whichever apply):
- What does this project do in one sentence? (skip if README was found)
- Are there any files, directories, or systems that should never be touched or auto-modified by Claude?
- Any team conventions not captured in your lint config? (naming patterns, PR size, commit format, review process)
Node 5 — Generate
Produce the CLAUDE.md using the exact section structure from references/claude-md-template.md.
Critical rules:
- Every populated section must have real content — no
[TODO: add your X here] placeholders
- If a section cannot be filled at all, omit it entirely rather than writing a placeholder
- Commands must be exact and runnable (
npm run dev, not "run the dev server")
- What NOT To Do must have at least 2 entries
- Write in imperative, direct style ("Run tests with...", "Never edit files in...")
- No heading levels deeper than H2 within sections
Node 6 — Validate
Before writing, verify against references/validation-checklist.md:
If Commands or What NOT To Do would fail: ask one final targeted question before writing.
Output
Write the file to CLAUDE.md at the project root. After writing, print a one-line confirmation:
✓ CLAUDE.md written — X sections populated from repo scan, Y from your answers.
If in diff-and-merge mode, also print which sections were added vs. left unchanged.
Anti-Patterns To Reject
- Generating CLAUDE.md without running the scan first
- Asking more than 3 intake questions
- Writing placeholder sections ("add your commands here")
- Overwriting an existing populated CLAUDE.md without running the diff-and-merge flow
- Writing generic boilerplate not specific to the scanned project
- Including commands that weren't found in signal files and weren't confirmed by the user
References
references/scan-signals.md — full catalog of signal files and what each reveals
references/claude-md-template.md — canonical CLAUDE.md section structure and style rules
references/validation-checklist.md — required fields and quality gates before writing
Version: 1.0.0