Spec to Repo
Turn a natural-language project specification into a complete, runnable starter repository. Not a template filler — a spec interpreter that generates real, working code for any stack.
When to Use
- User provides a text description of an app and wants code
- User has a PRD, requirements doc, or feature list and needs a codebase
- User says "build me an app that...", "scaffold this", "bootstrap a project"
- User wants a working starter repo, not just a file tree
Not this skill when the user wants a SaaS app with Stripe + Auth specifically — use product-team/saas-scaffolder instead.
Core Workflow
Phase 1 — Parse & Interpret
Read the spec. Extract these fields silently:
| Field |
Source |
Required |
| App name |
Explicit or infer from description |
yes |
| Description |
First sentence of spec |
yes |
| Features |
Bullet points or sentences describing behavior |
yes |
| Tech stack |
Explicit ("use FastAPI") or infer from context |
yes |
| Auth |
"login", "users", "accounts", "roles" |
if mentioned |
| Database |
"store", "save", "persist", "records", "schema" |
if mentioned |
| API surface |
"endpoint", "API", "REST", "GraphQL" |
if mentioned |
| Deploy target |
"Vercel", "Docker", "AWS", "Railway" |
if mentioned |
Stack inference rules (when user doesn't specify):
| Signal |
Inferred stack |
| "web app", "dashboard", "SaaS" |
Next.js + TypeScript |
| "API", "backend", "microservice" |
FastAPI (Python) or Express (Node) |
| "mobile app" |
Flutter or React Native |
| "CLI tool" |
Go or Python |
| "data pipeline" |
Python |
| "high performance", "systems" |
Rust or Go |
After parsing, present a structured interpretation back to the user:
## Spec Interpretation
**App:** [name]
**Stack:** [framework + language]
**Features:**
1. [feature]
2. [feature]
**Database:** [yes/no — engine]
**Auth:** [yes/no — method]
**Deploy:** [target]
Does this match your intent? Any corrections before I generate?
Flag ambiguities. Ask at most 3 clarifying questions. If the user says "just build it", proceed with best-guess defaults.
Phase 2 — Architecture
Design the project before writing any files:
- Select template — Match to a stack template from
references/stack-templates.md
- Define file tree — List every file that will be created
- Map features to files — Each feature gets at minimum one file/component
- Design database schema — If applicable, define tables/collections with fields and types
- Identify dependencies — List every package with version constraints
- Plan API routes — If applicable, list every endpoint with method, path, request/response shape
Present the file tree to the user before generating:
project-name/
├── README.md
├── .env.example
├── .gitignore
├── .github/workflows/ci.yml
├── package.json / requirements.txt / go.mod
├── src/
│ ├── ...
├── tests/
│ ├── ...
└── ...
Phase 3 — Generate
Write every file. Rules:
- Real code, not stubs. Every function has a real implementation. No
// TODO: implement or pass placeholders.
- Syntactically valid. Every file must parse without errors in its language.
- Imports match dependencies. Every import must correspond to a package in the manifest (package.json, requirements.txt, go.mod, etc.).
- Types included. TypeScript projects use types. Python projects use type hints. Go projects use typed structs.
- Environment variables. Generate
.env.example with every required variable, commented with purpose.
- README.md. Include: project description, prerequisites, setup steps (clone, install, configure env, run), and available scripts/commands.
- CI config. Generate
.github/workflows/ci.yml with: install, lint (if linter in deps), test, build.
- .gitignore. Stack-appropriate ignores (node_modules, pycache, .env, build artifacts).
File generation order:
- Manifest (package.json / requirements.txt / go.mod)
- Config files (.env.example, .gitignore, CI)
- Database schema / migrations
- Core business logic
- API routes / endpoints
- UI components (if applicable)
- Tests
- README.md
Phase 4 — Validate
After generation, run through this checklist:
Run scripts/validate_project.py against the generated directory to catch common issues.
Examples
Example 1: Task Management API
Input spec:
"Build me a task management API. Users can create, list, update, and delete tasks. Tasks have a title, description, status (todo/in-progress/done), and due date. Use FastAPI with SQLite. Add basic auth with API keys."
Output file tree:
task-api/
├── README.md
├── .env.example # API_KEY, DATABASE_URL
├── .gitignore
├── .github/workflows/ci.yml
├── requirements.txt # fastapi, uvicorn, sqlalchemy, pytest
├── main.py # FastAPI app, CORS, lifespan
├── models.py # SQLAlchemy Task model
├── schemas.py # Pydantic request/response schemas
├── database.py # SQLite engine + session
├── auth.py # API key middleware
├── routers/
│ └── tasks.py # CRUD endpoints
└── tests/
└── test_tasks.py # Smoke tests for each endpoint
Example 2: Recipe Sharing Web App
Input spec:
"I want a recipe sharing website. Users sign up, post recipes with ingredients and steps, browse other recipes, and save favorites. Use Next.js with Tailwind. Store data in PostgreSQL."
Output file tree:
recipe-share/
├── README.md
├── .env.example # DATABASE_URL, NEXTAUTH_SECRET, NEXTAUTH_URL
├── .gitignore
├── .github/workflows/ci.yml
├── package.json # next, react, tailwindcss, prisma, next-auth
├── tailwind.config.ts
├── tsconfig.json
├── next.config.ts
├── prisma/
│ └── schema.prisma # User, Recipe, Ingredient, Favorite models
├── src/
│ ├── app/
│ │ ├── layout.tsx
│ │ ├── page.tsx # Homepage — recipe feed
│ │ ├── recipes/
│ │ │ ├── page.tsx # Browse recipes
│ │ │ ├── [id]/page.tsx # Recipe detail
│ │ │ └── new/page.tsx # Create recipe form
│ │ └── api/
│ │ ├── auth/[...nextauth]/route.ts
│ │ └── recipes/route.ts
│ ├── components/
│ │ ├── RecipeCard.tsx
│ │ ├── RecipeForm.tsx
│ │ └── Navbar.tsx
│ └── lib/
│ ├── prisma.ts
│ └── auth.ts
└── tests/
└── recipes.test.ts
Example 3: CLI Expense Tracker
Input spec:
"Python CLI tool for tracking expenses. Commands: add, list, summary, export-csv. Store in a local SQLite file. No external API."
Output file tree:
expense-tracker/
├── README.md
├── .gitignore
├── .github/workflows/ci.yml
├── pyproject.toml
├── src/
│ └── expense_tracker/
│ ├── __init__.py
│ ├── cli.py # argparse commands
│ ├── database.py # SQLite operations
│ ├── models.py # Expense dataclass
│ └── formatters.py # Table + CSV output
└── tests/
└── test_cli.py
Anti-Patterns
| Anti-pattern |
Fix |
Placeholder code — // TODO: implement, pass, empty function bodies |
Every function has a real implementation. If complex, implement a working simplified version. |
| Stack override — picking Next.js when the user said Flask |
Always honor explicit tech preferences. Only infer when the user doesn't specify. |
| Missing .gitignore — committing node_modules or .env |
Generate stack-appropriate .gitignore as one of the first files. |
| Phantom imports — importing packages not in the manifest |
Cross-check every import against package.json / requirements.txt before finishing. |
| Over-engineering MVP — adding Redis caching, rate limiting, WebSockets to a v1 |
Build the minimum that works. The user can iterate. |
| Ignoring stated preferences — user says "PostgreSQL" and you generate MongoDB |
Parse the spec carefully. Explicit preferences are non-negotiable. |
Missing env vars — code reads process.env.X but .env.example doesn't list it |
Every env var used in code must appear in .env.example with a comment. |
| No tests — shipping a repo with zero test files |
At minimum: one smoke test per API endpoint or one test per core function. |
| Hallucinated APIs — generating code that calls library methods that don't exist |
Stick to well-documented, stable APIs. When unsure, use the simplest approach. |
Validation Script
scripts/validate_project.py
Checks a generated project directory for common issues:
# Validate a generated project
python3 scripts/validate_project.py /path/to/generated-project
# JSON output
python3 scripts/validate_project.py /path/to/generated-project --format json
Checks performed:
- README.md exists and is non-empty
- .gitignore exists
- .env.example exists (if code references env vars)
- Package manifest exists (package.json, requirements.txt, go.mod, Cargo.toml, pubspec.yaml)
- No .env file committed (secrets leak)
- At least one test file exists
- No TODO/FIXME placeholders in generated code
Progressive Enhancement
For complex specs, generate in stages:
- MVP — Core feature only, working end-to-end
- Auth — Add authentication if requested
- Polish — Error handling, validation, loading states
- Deploy — Docker, CI, deploy config
Ask the user after MVP: "Core is working. Want me to add auth/polish/deploy next, or iterate on what's here?"
Cross-References
- Related:
product-team/saas-scaffolder — SaaS-specific scaffolding (Next.js + Stripe + Auth)
- Related:
engineering/spec-driven-workflow — spec-first development methodology
- Related:
engineering/database-designer — database schema design patterns
- Related:
engineering-team/senior-fullstack — full-stack implementation patterns
Source: alirezarezvani/claude-skills → product-team/skills/spec-to-repo/SKILL.md
1---2name: spec-to-repo3description: Use when the user says 'build me an app', 'create a project from this spec', 'scaffold a new repo', 'generate a starter', 'turn this idea into code', 'bootstrap a project', 'I have requirements and need a codebase', or provides a natural-language project specification and expects a complete, runnable repository. Stack-agnostic: Next.js, FastAPI, Rails, Go, Rust, Flutter, and more.4---5
6
7# Spec to Repo
8
9Turn a natural-language project specification into a complete, runnable starter repository. Not a template filler — a spec interpreter that generates real, working code for any stack.
10
11## When to Use
12
13- User provides a text description of an app and wants code
14- User has a PRD, requirements doc, or feature list and needs a codebase
15- User says "build me an app that...", "scaffold this", "bootstrap a project"
16- User wants a working starter repo, not just a file tree
17
18**Not this skill** when the user wants a SaaS app with Stripe + Auth specifically — use `product-team/saas-scaffolder` instead.
19
20## Core Workflow
21
22### Phase 1 — Parse & Interpret
23
24Read the spec. Extract these fields silently:
25
26| Field | Source | Required |
27|-------|--------|----------|
28| App name | Explicit or infer from description | yes |
29| Description | First sentence of spec | yes |
30| Features | Bullet points or sentences describing behavior | yes |
31| Tech stack | Explicit ("use FastAPI") or infer from context | yes |
32| Auth | "login", "users", "accounts", "roles" | if mentioned |
33| Database | "store", "save", "persist", "records", "schema" | if mentioned |
34| API surface | "endpoint", "API", "REST", "GraphQL" | if mentioned |
35| Deploy target | "Vercel", "Docker", "AWS", "Railway" | if mentioned |
36
37**Stack inference rules** (when user doesn't specify):
38
39| Signal | Inferred stack |
40|--------|---------------|
41| "web app", "dashboard", "SaaS" | Next.js + TypeScript |
42| "API", "backend", "microservice" | FastAPI (Python) or Express (Node) |
43| "mobile app" | Flutter or React Native |
44| "CLI tool" | Go or Python |
45| "data pipeline" | Python |
46| "high performance", "systems" | Rust or Go |
47
48After parsing, present a structured interpretation back to the user:
49
50```
51## Spec Interpretation
52
53**App:** [name]
54**Stack:** [framework + language]
55**Features:**
561. [feature]
572. [feature]
58
59**Database:** [yes/no — engine]
60**Auth:** [yes/no — method]
61**Deploy:** [target]
62
63Does this match your intent? Any corrections before I generate?
64```
65
66Flag ambiguities. Ask **at most 3** clarifying questions. If the user says "just build it", proceed with best-guess defaults.
67
68### Phase 2 — Architecture
69
70Design the project before writing any files:
71
721. **Select template** — Match to a stack template from `references/stack-templates.md`
732. **Define file tree** — List every file that will be created
743. **Map features to files** — Each feature gets at minimum one file/component
754. **Design database schema** — If applicable, define tables/collections with fields and types
765. **Identify dependencies** — List every package with version constraints
776. **Plan API routes** — If applicable, list every endpoint with method, path, request/response shape
78
79Present the file tree to the user before generating:
80
81```
82project-name/
83├── README.md
84├── .env.example
85├── .gitignore
86├── .github/workflows/ci.yml
87├── package.json / requirements.txt / go.mod
88├── src/
89│ ├── ...
90├── tests/
91│ ├── ...
92└── ...
93```
94
95### Phase 3 — Generate
96
97Write every file. Rules:
98
99- **Real code, not stubs.** Every function has a real implementation. No `// TODO: implement` or `pass` placeholders.
100- **Syntactically valid.** Every file must parse without errors in its language.
101- **Imports match dependencies.** Every import must correspond to a package in the manifest (package.json, requirements.txt, go.mod, etc.).
102- **Types included.** TypeScript projects use types. Python projects use type hints. Go projects use typed structs.
103- **Environment variables.** Generate `.env.example` with every required variable, commented with purpose.
104- **README.md.** Include: project description, prerequisites, setup steps (clone, install, configure env, run), and available scripts/commands.
105- **CI config.** Generate `.github/workflows/ci.yml` with: install, lint (if linter in deps), test, build.
106- **.gitignore.** Stack-appropriate ignores (node_modules, __pycache__, .env, build artifacts).
107
108**File generation order:**
1091. Manifest (package.json / requirements.txt / go.mod)
1102. Config files (.env.example, .gitignore, CI)
1113. Database schema / migrations
1124. Core business logic
1135. API routes / endpoints
1146. UI components (if applicable)
1157. Tests
1168. README.md
117
118### Phase 4 — Validate
119
120After generation, run through this checklist:
121
122- [ ] Every imported package exists in the manifest
123- [ ] Every file referenced by an import exists in the tree
124- [ ] `.env.example` lists every env var used in code
125- [ ] `.gitignore` covers build artifacts and secrets
126- [ ] README has setup instructions that actually work
127- [ ] No hardcoded secrets, API keys, or passwords
128- [ ] At least one test file exists
129- [ ] Build/start command is documented and would work
130
131Run `scripts/validate_project.py` against the generated directory to catch common issues.
132
133## Examples
134
135### Example 1: Task Management API
136
137**Input spec:**
138> "Build me a task management API. Users can create, list, update, and delete tasks. Tasks have a title, description, status (todo/in-progress/done), and due date. Use FastAPI with SQLite. Add basic auth with API keys."
139
140**Output file tree:**
141```
142task-api/
143├── README.md
144├── .env.example # API_KEY, DATABASE_URL
145├── .gitignore
146├── .github/workflows/ci.yml
147├── requirements.txt # fastapi, uvicorn, sqlalchemy, pytest
148├── main.py # FastAPI app, CORS, lifespan
149├── models.py # SQLAlchemy Task model
150├── schemas.py # Pydantic request/response schemas
151├── database.py # SQLite engine + session
152├── auth.py # API key middleware
153├── routers/
154│ └── tasks.py # CRUD endpoints
155└── tests/
156 └── test_tasks.py # Smoke tests for each endpoint
157```
158
159### Example 2: Recipe Sharing Web App
160
161**Input spec:**
162> "I want a recipe sharing website. Users sign up, post recipes with ingredients and steps, browse other recipes, and save favorites. Use Next.js with Tailwind. Store data in PostgreSQL."
163
164**Output file tree:**
165```
166recipe-share/
167├── README.md
168├── .env.example # DATABASE_URL, NEXTAUTH_SECRET, NEXTAUTH_URL
169├── .gitignore
170├── .github/workflows/ci.yml
171├── package.json # next, react, tailwindcss, prisma, next-auth
172├── tailwind.config.ts
173├── tsconfig.json
174├── next.config.ts
175├── prisma/
176│ └── schema.prisma # User, Recipe, Ingredient, Favorite models
177├── src/
178│ ├── app/
179│ │ ├── layout.tsx
180│ │ ├── page.tsx # Homepage — recipe feed
181│ │ ├── recipes/
182│ │ │ ├── page.tsx # Browse recipes
183│ │ │ ├── [id]/page.tsx # Recipe detail
184│ │ │ └── new/page.tsx # Create recipe form
185│ │ └── api/
186│ │ ├── auth/[...nextauth]/route.ts
187│ │ └── recipes/route.ts
188│ ├── components/
189│ │ ├── RecipeCard.tsx
190│ │ ├── RecipeForm.tsx
191│ │ └── Navbar.tsx
192│ └── lib/
193│ ├── prisma.ts
194│ └── auth.ts
195└── tests/
196 └── recipes.test.ts
197```
198
199### Example 3: CLI Expense Tracker
200
201**Input spec:**
202> "Python CLI tool for tracking expenses. Commands: add, list, summary, export-csv. Store in a local SQLite file. No external API."
203
204**Output file tree:**
205```
206expense-tracker/
207├── README.md
208├── .gitignore
209├── .github/workflows/ci.yml
210├── pyproject.toml
211├── src/
212│ └── expense_tracker/
213│ ├── __init__.py
214│ ├── cli.py # argparse commands
215│ ├── database.py # SQLite operations
216│ ├── models.py # Expense dataclass
217│ └── formatters.py # Table + CSV output
218└── tests/
219 └── test_cli.py
220```
221
222## Anti-Patterns
223
224| Anti-pattern | Fix |
225|---|---|
226| **Placeholder code** — `// TODO: implement`, `pass`, empty function bodies | Every function has a real implementation. If complex, implement a working simplified version. |
227| **Stack override** — picking Next.js when the user said Flask | Always honor explicit tech preferences. Only infer when the user doesn't specify. |
228| **Missing .gitignore** — committing node_modules or .env | Generate stack-appropriate .gitignore as one of the first files. |
229| **Phantom imports** — importing packages not in the manifest | Cross-check every import against package.json / requirements.txt before finishing. |
230| **Over-engineering MVP** — adding Redis caching, rate limiting, WebSockets to a v1 | Build the minimum that works. The user can iterate. |
231| **Ignoring stated preferences** — user says "PostgreSQL" and you generate MongoDB | Parse the spec carefully. Explicit preferences are non-negotiable. |
232| **Missing env vars** — code reads `process.env.X` but `.env.example` doesn't list it | Every env var used in code must appear in `.env.example` with a comment. |
233| **No tests** — shipping a repo with zero test files | At minimum: one smoke test per API endpoint or one test per core function. |
234| **Hallucinated APIs** — generating code that calls library methods that don't exist | Stick to well-documented, stable APIs. When unsure, use the simplest approach. |
235
236## Validation Script
237
238### `scripts/validate_project.py`
239
240Checks a generated project directory for common issues:
241
242```bash
243# Validate a generated project
244python3 scripts/validate_project.py /path/to/generated-project
245
246# JSON output
247python3 scripts/validate_project.py /path/to/generated-project --format json
248```
249
250Checks performed:
251- README.md exists and is non-empty
252- .gitignore exists
253- .env.example exists (if code references env vars)
254- Package manifest exists (package.json, requirements.txt, go.mod, Cargo.toml, pubspec.yaml)
255- No .env file committed (secrets leak)
256- At least one test file exists
257- No TODO/FIXME placeholders in generated code
258
259## Progressive Enhancement
260
261For complex specs, generate in stages:
262
2631. **MVP** — Core feature only, working end-to-end
2642. **Auth** — Add authentication if requested
2653. **Polish** — Error handling, validation, loading states
2664. **Deploy** — Docker, CI, deploy config
267
268Ask the user after MVP: "Core is working. Want me to add auth/polish/deploy next, or iterate on what's here?"
269
270## Cross-References
271
272- Related: `product-team/saas-scaffolder` — SaaS-specific scaffolding (Next.js + Stripe + Auth)
273- Related: `engineering/spec-driven-workflow` — spec-first development methodology
274- Related: `engineering/database-designer` — database schema design patterns
275- Related: `engineering-team/senior-fullstack` — full-stack implementation patterns
276
277---
278
279**Source:** [`alirezarezvani/claude-skills`](https://github.com/alirezarezvani/claude-skills) → `product-team/skills/spec-to-repo/SKILL.md`