Project Scaffolding
Purpose
Generate a complete CLAUDE.md and .claude/ directory structure for any project. This gives AI agents the context they need to work effectively from the first session — build commands, conventions, quality gates, and session tracking.
Stack Detection
Before scaffolding, detect the project's tech stack by scanning for manifest files:
| File Found | Stack Detected | Build Tool |
|---|---|---|
tsconfig.json | TypeScript | tsc, npm/yarn/pnpm |
package.json (no tsconfig) | JavaScript | npm/yarn/pnpm |
pyproject.toml | Python | pip/poetry/uv |
setup.py or requirements.txt | Python (legacy) | pip |
Cargo.toml | Rust | cargo |
go.mod | Go | go |
Makefile | Check contents | Varies |
Dockerfile | Container | docker |
Detection Steps
- List files in project root: check for manifest files above
- If
package.jsonexists, readscriptsto find build/test/lint commands - If
pyproject.tomlexists, read[tool]sections for configured tools - If multiple stacks detected, note all of them (monorepo pattern)
CLAUDE.md Generation
Use the template from references/claude-md-template.md and fill in detected information. Target: under 200 lines. Claude Code truncates CLAUDE.md after ~200 lines in the system prompt, so keep it lean.
- Project Overview — read
README.mdorpackage.jsondescription - Build & Run Commands — detected from manifest
scriptssection (keep 8-10 most-used, add "See [manifest] for full list") - Triggers — map file patterns to docs/skills for on-demand deep context
- Naming Conventions — select from
references/naming-conventions.mdbased on stack. If the table is large, move todocs/CONVENTIONS.mdand reference from Triggers - Test Command — detected or ask user
- Lint Command — detected or ask user
What Gets Pre-Filled
- Core Behaviors (including self-improvement and parallel session rules)
- Triggers section (generated from detected project structure)
- Test-First Development rules
- Git Commit Rules (conventional commits)
- Forbidden Files (.env, credentials, node_modules, etc.)
- Environment Variables rules
What Needs Detection or User Input
- Project name and description
- Build, test, lint, and dev commands
- Stack-specific naming conventions
- Any custom conventions the user wants
Triggers Generation
The Triggers section maps file patterns to deeper documentation, enabling on-demand context loading without bloating CLAUDE.md.
How to Generate Triggers
- Scan project structure for distinct directories (e.g.,
src/,lib/,tests/,docs/) - Identify existing documentation files (
docs/*.md,ARCHITECTURE.md,CONTRIBUTING.md) - Map each source directory to its most relevant doc or skill
- Include standard patterns:
Dockerfile→ deployment docs,tests/→ testing docs, new files → conventions
Example Generated Triggers
| File Pattern | Load |
|---|---|
| src/api/* | Read: docs/API.md |
| src/components/* | Read: docs/COMPONENTS.md |
| tests/* | Read: docs/TESTING.md |
| Dockerfile, docker-compose* | Read: docs/DEPLOYMENT.md |
| New .ts files | Read: docs/CONVENTIONS.md |If no docs exist yet, generate stub documentation files with TODO placeholders during scaffolding.
MEMORY.md Seeding
Seed the project's MEMORY.md with initial lessons from the detected stack. MEMORY.md is auto-loaded into every Claude Code system prompt, creating a self-improvement loop.
Location
~/.claude/projects/<project-path-with-dashes>/memory/MEMORY.mdWhere <project-path-with-dashes> is the absolute project path with / replaced by - (e.g., -Users-dev-myproject).
What to Seed
- Stack details — language version, build tool, package manager
- Architecture patterns — module structure discovered during detection
- Common pitfalls for the detected stack:
- TypeScript: ESM import extensions, tsconfig strictness, type-only imports - Python: virtual env activation, __init__.py requirements, type checking with mypy - Rust: borrow checker common mistakes, feature flags, workspace patterns - Go: module paths, exported vs unexported, error wrapping
- Testing patterns — framework, mock strategy, test file locations
- Owner preferences — any conventions the user specified during
/init
Size Budget
Keep under 55 lines initially — leave room for growth as the agent learns during sessions. The 200-line system prompt limit applies to MEMORY.md too.
Directory Structure Creation
Create the following structure:
.claude/
├── commands/
│ └── parallel.md ← multi-session coordination guide
├── reports/
│ ├── _registry.md ← from session-management references
│ ├── _tech-debt.md ← from session-management references
│ ├── architecture/
│ ├── bugs/
│ ├── code-review/
│ ├── config/
│ ├── dependencies/
│ ├── docs/
│ ├── features/
│ ├── integration/
│ ├── performance/
│ ├── refactor/
│ ├── security/
│ ├── testing/
│ ├── ci/
│ ├── tech-debt/
│ └── release/
└── scripts/
└── post-edit-check.sh ← from quality-gates hookSteps
- Create all 15 category directories under
.claude/reports/ - Copy
registry-template.mdcontent to.claude/reports/_registry.md(empty, ready to use) - Copy
tech-debt-template.mdcontent to.claude/reports/_tech-debt.md(empty, ready to use) - Copy
post-edit-check.shto.claude/scripts/usingcpvia Bash (NOT the Write tool — Write can corrupt line endings and break the script):mkdir -p.claude/scripts && cp "$CLAUDE_PLUGIN_DIR/scripts/post-edit-check.sh".claude/scripts/post-edit-check.sh && chmod +x.claude/scripts/post-edit-check.shIf$CLAUDE_PLUGIN_DIRis unavailable, locate the plugin viafind ~/.claude -name "post-edit-check.sh" | head -1and cp from there. - Create
.claude/commands/parallel.mdwith project-specific file ownership boundaries - Seed MEMORY.md at the auto-memory path (see MEMORY.md Seeding section above)
Hook Setup
Based on detected stack, wire up the PostToolUse hook:
- Create or update
.claude/settings.jsonwith exactly this content (no extra arguments, no modifications):
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "bash .claude/scripts/post-edit-check.sh"
}
]
}
]
}
}Important: The command must be exactly bash.claude/scripts/post-edit-check.sh — do not add arguments like $CLAUDE_TOOL_INPUT_FILE_PATH. The script reads $CLAUDE_TOOL_INPUT from the environment automatically.
- Do NOT modify the script — it already handles all stacks (TypeScript, Python, Rust, Go) via file extension detection. Copy it verbatim.
Interactive Flow
When running the scaffolding, interact with the user for decisions:
Step 1: Detect and Confirm
Detected stack: TypeScript (package.json + tsconfig.json)
Build: npm run build
Test: npm test
Lint: npm run lint
Does this look correct? Any changes?Step 2: Custom Conventions
Any project-specific conventions I should add to CLAUDE.md?
For example:
- Specific directory structure rules
- Required code patterns
- Forbidden patterns or anti-patternsStep 3: Generate and Review
- Generate
CLAUDE.mdwith all detected + user-provided info - Create
.claude/directory structure - Set up hooks
- Show summary of what was created
Step 4: Confirm
Created:
- CLAUDE.md (project configuration with Triggers, under 200 lines)
- .claude/reports/ (15 category dirs + registry + tech debt tracker)
- .claude/commands/parallel.md (multi-session coordination)
- .claude/scripts/post-edit-check.sh (auto-validation hook)
- .claude/settings.json (PostToolUse hook wired up)
- MEMORY.md (seeded at ~/.claude/projects/.../memory/MEMORY.md)
Ready to start developing with session tracking, auto-validation,
and self-improvement across sessions.Cross-References
references/claude-md-template.md— Full CLAUDE.md template with placeholder sectionsreferences/naming-conventions.md— Language-specific naming tables (TS, Py, Rust, Go)references/git-workflow.md— Conventional commits, branching, and PR patterns