界面已本地化;技能介绍与说明文档按所选语言由 AI 自动翻译,代码、命令、路径和专业术语保留原文,以原作者文档为准。
探索技能
效率与协作 · SKILL.md

spec-to-repo

spec-to-repo

【效率与协作】Use quando o usuário diz 'crie um app para mim', 'crie um projeto a partir desta especificação', 'scaffolde um novo repo', 'gere um starter', 'transforme esta ideia em código', 'faça bootstrap de um projeto', 'tenho requisitos e preciso de uma base de código', ou fornece uma especificação de projeto em linguagem natural e espera um repositório comple…

独立 GitHub 快照 · 自动分类 · 以原作者文档为准

技能说明

GitHub

name: spec-to-repo description: "Use quando o usuário diz 'crie um app para mim', 'crie um projeto a partir desta especificação', 'scaffolde um novo repo', 'gere um starter', 'transforme esta ideia em código', 'faça bootstrap de um projeto', 'tenho requisitos e preciso de uma base de código', ou fornece uma especificação de projeto em linguagem natural e espera um repositório completo e executável. Agnóstico de stack: Next.js, FastAPI, Rails, Go, Rust, Flutter e mais." agents:

  • claude-code

Spec para Repo

Transforme uma especificação de projeto em linguagem natural em um repositório starter completo e executável. Não é um preenchedor de template — é um interpretador de spec que gera código real e funcional para qualquer stack.

Quando Usar

  • Usuário fornece uma descrição de texto de um app e quer código
  • Usuário tem um PRD, documento de requisitos ou lista de funcionalidades e precisa de uma base de código
  • Usuário diz "crie um app que...", "scaffolde isso", "faça bootstrap de um projeto"
  • Usuário quer um repo starter funcional, não apenas uma árvore de arquivos

Não é esta skill quando o usuário quer um app SaaS com Stripe + Auth especificamente — use product-team/saas-scaffolder em vez disso.

Fluxo de Trabalho Principal

Fase 1: — Analisar e Interpretar

Leia a spec. Extraia estes campos silenciosamente:

CampoFonteObrigatório
Nome do appExplícito ou inferido da descriçãosim
DescriçãoPrimeira frase da specsim
FuncionalidadesBullet points ou frases descrevendo comportamentosim
Stack tecnológicaExplícita ("use FastAPI") ou inferida do contextosim
Auth"login", "usuários", "contas", "papéis"se mencionado
Banco de dados"armazenar", "salvar", "persistir", "registros", "schema"se mencionado
Superfície de API"endpoint", "API", "REST", "GraphQL"se mencionado
Alvo de implantação"Vercel", "Docker", "AWS", "Railway"se mencionado

Regras de inferência de stack (quando o usuário não especifica):

SinalStack inferida
"web app", "dashboard", "SaaS"Next.js + TypeScript
"API", "backend", "microservice"FastAPI (Python) ou Express (Node)
"app mobile"Flutter ou React Native
"ferramenta CLI"Go ou Python
"pipeline de dados"Python
"alto desempenho", "sistemas"Rust ou Go

Após fazer o parsing, apresente uma interpretação estruturada de volta ao usuário:

## Interpretação da Spec

**App:** [nome]
**Stack:** [framework + linguagem]
**Funcionalidades:**
1. [funcionalidade]
2. [funcionalidade]

**Banco de dados:** [sim/não — engine]
**Auth:** [sim/não — método]
**Deploy:** [alvo]

Isso corresponde à sua intenção? Alguma correção antes de gerar?

Sinalize ambiguidades. Faça no máximo 3 perguntas de esclarecimento. Se o usuário disser "só construa", prossiga com os melhores padrões.

Fase 2: — Arquitetura

Projete o projeto antes de escrever qualquer arquivo:

  1. Selecionar template — Corresponda a um template de stack de references/stack-templates.md
  2. Definir árvore de arquivos — Liste cada arquivo que será criado
  3. Mapear funcionalidades para arquivos — Cada funcionalidade recebe pelo menos um arquivo/componente
  4. Projetar schema do banco de dados — Se aplicável, defina tabelas/coleções com campos e tipos
  5. Identificar dependências — Liste cada pacote com restrições de versão
  6. Planejar rotas de API — Se aplicável, liste cada endpoint com método, caminho, shape de request/response

Apresente a árvore de arquivos ao usuário antes de gerar:

project-name/
├── README.md
├── .env.example
├── .gitignore
├── .github/workflows/ci.yml
├── package.json / requirements.txt / go.mod
├── src/
│   ├── ...
├── tests/
│   ├── ...
└── ...

Fase 3: — Gerar

Escreva cada arquivo. Regras:

  • Código real, não stubs. Cada função tem uma implementação real. Sem // TODO: implementar ou placeholders pass.
  • Sintaticamente válido. Cada arquivo deve parsear sem erros em sua linguagem.
  • Imports correspondem às dependências. Cada import deve corresponder a um pacote no manifesto (package.json, requirements.txt, go.mod, etc.).
  • Tipos incluídos. Projetos TypeScript usam tipos. Projetos Python usam type hints. Projetos Go usam structs tipados.
  • Variáveis de ambiente. Gere .env.example com cada variável necessária, comentada com propósito.
  • README.md. Inclua: descrição do projeto, pré-requisitos, etapas de configuração (clone, install, configurar env, executar) e scripts/comandos disponíveis.
  • Config CI. Gere .github/workflows/ci.yml com: install, lint (se linter nas deps), test, build.
  • .gitignore. Ignores apropriados para a stack (node_modules, pycache, .env, artefatos de build).

Ordem de geração de arquivos:

  1. Manifesto (package.json / requirements.txt / go.mod)
  2. Arquivos de config (.env.example, .gitignore, CI)
  3. Schema do banco de dados / migrations
  4. Lógica de negócio principal
  5. Rotas de API / endpoints
  6. Componentes de UI (se aplicável)
  7. Testes
  8. README.md

Fase 4: — Validar

Após a geração, passe por esta lista de verificação:

  • Cada pacote importado existe no manifesto
  • Cada arquivo referenciado por um import existe na árvore
  • .env.example lista cada variável de env usada no código
  • .gitignore cobre artefatos de build e segredos
  • README tem instruções de configuração que realmente funcionam
  • Sem segredos, chaves de API ou senhas hardcoded
  • Pelo menos um arquivo de teste existe
  • O comando build/start está documentado e funcionaria

Execute scripts/validate_project.py contra o diretório gerado para detectar problemas comuns.

Exemplos

Exemplo 1: API de Gerenciamento de Tarefas

Spec de entrada:

"Construa uma API de gerenciamento de tarefas. Usuários podem criar, listar, atualizar e excluir tarefas. Tarefas têm título, descrição, status (todo/em-progresso/concluído) e data de vencimento. Use FastAPI com SQLite. Adicione auth básica com chaves de API."

Árvore de arquivos de saída:

task-api/
├── README.md
├── .env.example              # API_KEY, DATABASE_URL
├── .gitignore
├── .github/workflows/ci.yml
├── requirements.txt          # fastapi, uvicorn, sqlalchemy, pytest
├── main.py                   # app FastAPI, CORS, lifespan
├── models.py                 # modelo SQLAlchemy Task
├── schemas.py                # schemas Pydantic request/response
├── database.py               # engine SQLite + sessão
├── auth.py                   # middleware de chave de API
├── routers/
│   └── tasks.py              # endpoints CRUD
└── tests/
    └── test_tasks.py         # testes de smoke para cada endpoint

Exemplo 2: App Web de Compartilhamento de Receitas

Spec de entrada:

"Quero um website de compartilhamento de receitas. Usuários se cadastram, postam receitas com ingredientes e etapas, navegam por outras receitas e salvam favoritos. Use Next.js com Tailwind. Armazene dados em PostgreSQL."

Árvore de arquivos de saída:

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         # modelos User, Recipe, Ingredient, Favorite
├── src/
│   ├── app/
│   │   ├── layout.tsx
│   │   ├── page.tsx          # Homepage — feed de receitas
│   │   ├── recipes/
│   │   │   ├── page.tsx      # Navegar por receitas
│   │   │   ├── [id]/page.tsx # Detalhe da receita
│   │   │   └── new/page.tsx  # Formulário de criação de receita
│   │   └── api/
│   │       ├── auth/[...nextauth]/route.ts
│   │       └── recipes/route.ts
│   ├── components/
│   │   ├── RecipeCard.tsx
│   │   ├── RecipeForm.tsx
│   │   └── Navbar.tsx
│   └── lib/
│       ├── prisma.ts
│       └── auth.ts
└── tests/
    └── recipes.test.ts

Exemplo 3: Rastreador de Despesas CLI

Spec de entrada:

"Ferramenta CLI Python para rastrear despesas. Comandos: add, list, summary, export-csv. Armazene em um arquivo SQLite local. Sem API externa."

Árvore de arquivos de saída:

expense-tracker/
├── README.md
├── .gitignore
├── .github/workflows/ci.yml
├── pyproject.toml
├── src/
│   └── expense_tracker/
│       ├── __init__.py
│       ├── cli.py            # comandos argparse
│       ├── database.py       # operações SQLite
│       ├── models.py         # dataclass Expense
│       └── formatters.py     # saída em tabela + CSV
└── tests/
    └── test_cli.py

Antipadrões

AntipadrãoCorreção
Código placeholder — // TODO: implementar, pass, corpos de função vaziosCada função tem uma implementação real. Se complexo, implemente uma versão simplificada funcional.
Override de stack — escolher Next.js quando o usuário disse FlaskSempre respeite preferências tecnológicas explícitas. Infira apenas quando o usuário não especifica.
Falta de .gitignore — fazer commit de node_modules ou .envGere .gitignore apropriado para a stack como um dos primeiros arquivos.
Imports fantasmas — importar pacotes não listados no manifestoVerifique cada import no package.json / requirements.txt antes de terminar.
Over-engineering do MVP — adicionar cache Redis, limitação de taxa, WebSockets a um v1Construa o mínimo que funciona. O usuário pode iterar.
Ignorar preferências declaradas — usuário diz "PostgreSQL" e você gera MongoDBAnalise a spec cuidadosamente. Preferências explícitas são inegociáveis.
Variáveis de env ausentes — código lê process.env.X mas .env.example não listaCada variável de env usada no código deve aparecer em .env.example com um comentário.
Sem testes — entregar um repo com zero arquivos de testeNo mínimo: um teste de smoke por endpoint de API ou um teste por função principal.
APIs alucinadas — gerar código que chama métodos de biblioteca que não existemSiga APIs bem documentadas e estáveis. Quando incerto, use a abordagem mais simples.

Script de Validação

scripts/validate_project.py

Verifica um diretório de projeto gerado em busca de problemas comuns:

# Validar um projeto gerado
python3 scripts/validate_project.py /path/to/generated-project

# Saída JSON
python3 scripts/validate_project.py /path/to/generated-project --format json

Verificações realizadas:

  • README.md existe e não está vazio
  • .gitignore existe
  • .env.example existe (se o código referencia variáveis de env)
  • Manifesto de pacotes existe (package.json, requirements.txt, go.mod, Cargo.toml, pubspec.yaml)
  • Sem arquivo .env committed (vazamento de segredos)
  • Pelo menos um arquivo de teste existe
  • Sem placeholders TODO/FIXME no código gerado

Aprimoramento Progressivo

Para specs complexas, gere em etapas:

  1. MVP — Funcionalidade principal apenas, funcionando de ponta a ponta
  2. Auth — Adicionar autenticação se solicitado
  3. Polimento — Tratamento de erros, validação, estados de carregamento
  4. Deploy — Docker, CI, config de deploy

Pergunte ao usuário após o MVP: "O núcleo está funcionando. Quer que eu adicione auth/polimento/deploy a seguir, ou itere no que está aqui?"

Referências Cruzadas

  • Relacionado: product-team/saas-scaffolder — Scaffolding específico para SaaS (Next.js + Stripe + Auth)
  • Relacionado: engineering/spec-driven-workflow — Metodologia de desenvolvimento spec-first
  • Relacionado: engineering/database-designer — Padrões de design de schema de banco de dados
  • Relacionado: engineering-team/senior-fullstack — Padrões de implementação full-stack
我的收藏