Workflow de desenvolvimento autônomo — planejamento, execução, verificação e git
gerenciado por agentes especializados com memória emergente.
Baseado na metodologia GSD-2 (MIT) — reimplementado para o sistema nativo de agentes do Claude Code.
- Hierarquia Milestone → Slice → Task com contexto fresco por unidade
- Agentes especializados por fase (Opus para pensar, Sonnet para executar)
- Memória emergente — o sistema aprende padrões e gotchas do seu projeto
- Git automático — branch por slice, squash merge, commits semânticos
- Tudo em arquivos
.md— recuperável após crash, auditável, versionável
git clone https://github.com/<seu-usuario>/forge-agent
cd forge-agent
bash install.sh # macOS/Linux
# .\install.ps1 # Windowscd /seu/projeto
claude/forge-init minha plataforma de e-commerce com Next.js
/forge-new-milestone autenticação de usuários com NextAuth
/forge
O /forge é o shell interativo principal — navega entre milestones, executa unidades e responde perguntas sem sair do REPL.
Verificar instalação: /forge-help
A partir da v1.0, o Forge Agent usa 3 comandos slash e skills para tudo o mais:
| Tipo | Exemplos | Como invocar |
|---|---|---|
| Comando slash | /forge, /forge-init, /forge-update |
Digitar / no Claude Code |
| Skill | forge-auto, forge-status, forge-new-milestone... |
Via /forge REPL ou digitando o nome |
| Comando | O que faz |
|---|---|
/forge |
Entry point principal — REPL interativo com menu: auto, task, new-milestone, status, help |
/forge-init [descrição] |
Inicializa o projeto GSD — cria CLAUDE.md + .gsd/ + prefs |
/forge-update [caminho] |
Atualiza Forge Agent (git pull + reinstala). Preserva preferências. |
| Skill | O que faz |
|---|---|
forge-auto |
Executa o milestone inteiro de forma autônoma até concluir |
forge-next |
Executa exatamente uma unidade e para (step mode) |
forge-task <descrição> |
Task autônoma sem milestone — brainstorm → discuss → plan → execute |
forge-task <item-id> |
Consome um item do backlog (.gsd/items/, qualquer prefixo único) como task — descrição/proveniência no BRIEF, doing + promoted_to: T-… |
forge-new-milestone <descrição> |
Cria milestone completo — brainstorm → scope → discuss → ROADMAP |
forge-discuss <milestone|S##> |
Abre fase de discuss para milestone ou slice |
forge-add-slice, forge-add-task |
Adiciona slice ou task a um milestone existente |
| Skill | O que faz |
|---|---|
forge-status |
Dashboard de progresso — milestone, slices, próxima ação |
forge-doctor [--fix] |
Diagnóstico do projeto — valida e corrige STATE, arquivos, prefs |
forge-codebase [--fix] |
Qualidade do codebase — lint, nomenclatura, estrutura |
forge-sweep [--apply] |
Limpa know-how (AUTO-MEMORY, DECISIONS, milestones, sessões) — dry-run por padrão |
forge-explain <alvo> |
Explica qualquer artefato GSD sem modificar nada |
forge-memories |
Gerencia memórias auto-aprendidas do projeto |
forge-ask |
Modo conversa — discute ideias, captura decisões |
forge-prefs |
Configuração de modelos por fase e git settings |
forge-config, forge-mcps |
Status line, hooks e MCPs |
forge-help |
Ajuda completa |
Referência completa de preferências: cada um dos 94 knobs (40 seções) do catálogo de prefs —
forge-agent-prefs.jsonc/.gsd/claude-agent-prefs.jsonc/.gsd/prefs.local.jsonc, todos JSONC com$schema: forge-prefs.schema.json— está documentado emshared/forge-prefs-reference.md(gerado a partir do schema, sem drift possível). Useforge-prefspara ver o estado resolvido ao vivo.
| Skill | O que faz |
|---|---|
forge-brainstorm |
Explora alternativas e riscos antes de planejar |
forge-scope-clarity |
Contrato de escopo com critérios testáveis |
forge-risk-radar |
Análise de riscos por slice (auto-invocada em slices risk:high) |
forge-security |
Checklist de segurança por task (auto-invocada por keywords) |
forge-responsive |
Audit responsivo — Core Web Vitals, WCAG 2.2 |
forge-ui-review |
Review UI — acessibilidade, performance, React 19 |
Compatibilidade retroativa: IDs legados no formato
M###(ex.:M006) eTASK-###continuam sendo lidos e resolvidos normalmente —--resume,/forge-explaine/forge-discussaceitam ambos os formatos. Novos milestones e tasks soltas criados pelo forge geram IDs no formato timestampM-<ts>-<slug>/T-<ts>-<slug>(ex.:M-20260522101500-pagamentos).
Forge Agent stores .gsd/ knowledge (ledger, decisions, auto-memory) as per-unit fragments
instead of mutable monolith files — one small file per milestone, session, or task.
Three stores live under .gsd/:
| Store | Path | Contents |
|---|---|---|
| Ledger | .gsd/ledger/<id>.md |
Compact record of each completed milestone |
| Decisions | .gsd/decisions/<id>.md |
Architecture decisions scoped to a unit |
| Memory | .gsd/memory/<id>.md |
Auto-learned patterns from completed work |
The familiar monolith files (LEDGER.md, DECISIONS.md, AUTO-MEMORY.md) are projection
cache — rebuilt on-read by scripts/forge-projection.js and
excluded from version control (.gitignore/svn:ignore). This makes the stores
conflict-free by construction: each fragment has exactly one owner (one unit of work, one
developer, one branch).
Migration from the pre-M001 monolith layout runs automatically during /forge-update and
keeps a .bak copy of every monolith until you verify the projection matches.
For full details — layout, fragment schema, projection engine, migration, and doctor checks — see docs/fragment-store.md.
| Doc | Conteúdo |
|---|---|
| Arquitetura | Fluxo de execução, agentes, modelos, memória emergente |
| Comandos | Referência completa de todos os comandos |
| Skills | Skills incluídas, como instalar e contribuir |
| Configuração | Preferências, status line, arquivos do projeto |
Nota —
review.engine: workflowe approval prompt: quandoreview.engine: workflowestá configurado, cada debate de review usa a toolWorkflowdo Claude Code (requer ≥ v2.1.154). Empermissions.defaultModepadrão, cada invocação Workflow pede aprovação do operador — o que pausa oforge-autosilenciosamente. Para uso autônomo, configurepermissions.defaultMode: bypassPermissions(usuários com a statusline ativa já têm — ativado pelomerge-settings.js). Se a toolWorkflownão estiver disponível ou a invocação falhar, o gate faz fallback automático paraengine: agentscom um warning e regista o eventoreview-engine-fallback— nunca bloqueia.
Pré-requisito —
review.challenger: codex: o challenger Codex requer o Codex CLI (codex) instalado e autenticado, por um destes dois caminhos:
- Login por assinatura ChatGPT (recomendado):
codex login— abre um fluxo de browser, credencial gerenciada pelo próprio CLI.OPENAI_API_KEYno ambiente: exporte a variável de uma fonte segura (.envgitignored ou secret manager) — nunca hardcoded em prefs commitáveis (.gsd/claude-agent-prefs.jsoncé versionado; uma chave ali seria vazamento).O forge não instala nem autentica tooling de terceiros — apenas invoca o
codexjá configurado pelo usuário viascripts/forge-xllm.js, que nunca recebe a credencial por argumento (a auth é gerenciada inteiramente pelo próprio CLI). Semcodexdisponível, o gate faz fallback automático paraforge-reviewer(Claude) com o eventoreview-challenger-fallback— nunca bloqueia. Implicação de privacidade: comchallenger: codex, o diff do slice sai da máquina local para a API da OpenAI.
Pré-requisito —
review.challenger: gemini: o challenger Gemini requer o Antigravity CLI (agy) instalado e autenticado, por um destes dois caminhos:
- Login no Antigravity (recomendado): faça login uma vez (IDE ou CLI) — em headless o
agyusa a auth silenciosa por keyring, com refresh automático de token.GEMINI_API_KEY(ouANTIGRAVITY_API_KEY) no ambiente: exporte de uma fonte segura (.envgitignored ou secret manager) — nunca hardcoded em prefs commitáveis.O modelo é opcional:
challenger_modelaceita um label doagy models(pode conter espaços — use aspas:"Gemini 3.1 Pro (High)"); unset usa o default do CLI. O adapter invocaagy --printcom--sandbox(restrições de terminal) e o mesmo contrato do codex: semagydisponível (binário, auth, quota, rede, stdout vazio), fallback automático paraforge-reviewer(Claude) com o eventoreview-challenger-fallback(gemini-exit-nonzero) — nunca bloqueia. Implicação de privacidade: comchallenger: gemini, o diff do slice sai da máquina local para a API do Google.
Além do challenger de review Codex (acima), o forge permite rotear as próprias fases de trabalho —
execute-task e plan-slice — para GPT via o mesmo sidecar codex exec, através das prefs
workers.execute-task: codex / workers.plan-slice: codex (ver
forge-agent-prefs.jsonc § Workers Settings). O default continua claude
— é opt-in, não uma migração de engine.
Mecanicamente, scripts/forge-xllm.js --mode execute|plan invoca codex exec como sidecar,
lê um plano (T##-PLAN.md) e retorna um result-file estruturado (status, summary,
must_haves_status, files_changed, start_sha) — mesma interface de contrato que um worker
Claude nativo devolveria. Isso significa que todos os gates de verificação Claude rodam
intactos sobre código produzido por GPT: o schema must_haves continua enforcing, o
goal-backward verifier continua auditando os artefatos declarados, o file-audit continua
comparando o diff contra expected_output, e o review dialético continua rodando — com o
challenger Claude revisando o código GPT. É a inversão simétrica do challenger Codex do M004
(lá, GPT revisa código Claude; aqui, Claude revisa código GPT).
Três limitações são aceitas e documentadas explicitamente — não são bugs, são o contrato atual:
- Blast radius
workspace-write: o sidecar de execução rodacodex exec --sandbox workspace-write— um raio de ação mais amplo que o--sandbox read-onlydo challenger de review (M004). O invariante ".gsd/intocado, nenhumgit commitfeito pelo sidecar" é contrato + detecção pós-hoc (o orquestrador confere o diff depois), não é sandbox-enforced pelo própriocodex. Na prática, isso significa que o raio de ação de um eventual prompt-injection no conteúdo processado é igual ao workspace inteiro, não limitado a leitura. Aceite essa superfície antes de ativarworkers.execute-task: codexem repositórios sensíveis. - Evidence sintetizado, não capturado ao vivo: para um worker Claude nativo, cada chamada
Bash/Write/Edit grava uma linha no evidence log em tempo real (hook
PostToolUse). Para o sidecar codex, o evidence é sintetizado pós-hoc a partir degit diff --name-status {START_SHA}ao final da execução (source: codex-sidecar) — é advisory, útil para auditoria, mas não tem a granularidade por-chamada do caminho nativo. Como o invariante no-commit mantémHEAD == {START_SHA}, essegit diff --name-statusnão inclui arquivos novos não-rastreados (untracked) — para tasks que criam arquivos, o evidence log fica quase vazio. A lista de arquivos autoritativa não é esse evidence: é o result JSON do sidecar (files_changed_declared, declarado pela task, maisfiles_changed, derivado degit status --porcelain, que captura untracked) — é essa fonte que o file-audit usa, não o--name-status. Blind spot residual aceito: arquivos gitignored criados pelo sidecar não aparecem nem no--name-statusnem nogit status --porcelain, e não são removidos pelo resetgit clean -fd(sem-x) — fora do escopo de detecção atual. - Sem retry do trabalho codex (fail-once): se o sidecar falhar por qualquer motivo (exit
code ≠ 0, timeout, JSON de result-file inválido), o orquestrador reseta o repositório para
START_SHAe faz um único fallback ao worker Claude equivalente — não há retry do trabalho GPT. Uma falha do sidecar custa, no máximo, uma tentativa perdida.
A partir da M006, cada review dialético resolve seu challenger e advocate pela autoria do código, não por explícito. Via prefs review.challenger: auto e review.advocate: auto — que permanecem desativadas por padrão (claude / claude), decisão pós-dogfood:
challenger: auto→ resolve para a família OPOSTA ao autor (Claude code → GPT challenger; GPT code → Claude challenger). Reduz viés de auto-preferência: um desafiante de fora encontra classes de bug que dois Claudes não acham.advocate: auto→ resolve para a MESMA família do autor (autor Claude → advocate Claude; autor GPT → advocate Claude, enquanto--mode defendnão existe em fase 2). Mantém a defesa competente.
Autoria é derivada do campo engine dos dispatch events (.gsd/forge/events.jsonl), agregada por majority determinística — o orquestrador chama scripts/forge-review-pairing.js uma única vez por review antes da challenge. Degradações (autor sem evento de autoria, ou GPT sem --mode defend disponível) emitem review-pairing-fallback e retornam ao padrão Claude — nunca bloqueiam. Matriz canônica de resolver sem redefini-la: shared/forge-review.md § Step 0.
Ativar: edite forge-agent-prefs.jsonc (ou .gsd/prefs.local.jsonc), setando os campos abaixo dentro do bloco review:
O forge permite rotear os workers — execute-task e plan-slice — por domínio de trabalho e
fase, escolhendo inclusive cadeias cross-engine (misturar IDs Claude e GPT numa mesma
célula). Diferente da fase 2 (workers:, que escolhe engine por unit_type), o routing é
inteiramente opt-in — sem o bloco routing: definido nas prefs, o comportamento é 100%
idêntico aos tiers legados (tier_models:/workers: decidem sozinhos). A cascata responde
à última reescrita por domínio inteiro — nunca merge campo-a-campo, para evitar meia-domain
de um arquivo + meia-domain de outro = misroute silencioso.
Mecanicamente, cada célula routing.<domínio>.<fase>.<tier> = [cadeia] contém uma lista
ordenada de modelos (Claude e/ou GPT, cross-engine permitido), com um fallback: de categoria
definindo um modelo Claude mapeado para casos de esgotamento. O resolvedor scripts/forge-routing.js
usa precedência explícita (frontmatter > routing > tier_models legacy) e engine derivation
por família (IDs claude-* → Agent(model), IDs gpt-* → sidecar forge-xllm.js). Cadeias
com membros de família não-roteável (ex.: Gemini) skip o membro com phase-unsupported-family
e continuam na próxima.
- Fases roteáveis: apenas
executor(execute-task) eplanner(plan-slice).plan-milestonenunca é capturado por este eixo — permanece locked no tiermax(Fable). - Nesting:
routing.<domínio>.<fase>.<tier> = [id, ...]+routing.<domínio>.<fase>.fallback = <id>.<tier>é qualquer alias de tier (light,standard,heavy,max). - Domínios: chaves de domínio são abertas —
defaulté recomendado (usado quando a task/slice não declaradomain:); sem ele, unidades semdomain:correspondente caem direto no legado (tier_models), nunca erro. Qualquer outra chave (backend,frontend, ...) é definida pelo operador. - Precedência: frontmatter
tier:/worker:na task (item 1, sempre ganha) > blocorouting:aqui (quando célula resolve) > comportamento legadotier_models:/workers:(quando não hárouting:ou a célula não resolve). - Engine derivation: resolvida por
modelFamily()(scripts/forge-model-alias.js) — aliasesclaude/fable/opus/sonnet/haiku→ engineAgent(nativo em contexto);gpt/codex→ enginecodex(sidecarforge-xllm.js); família desconhecida (modelFamily()retornanull) → membro pulado comskipped-unknown-family;gemini(família conhecida, mas não roteável) → pulado comphase-unsupported-family. - Fallback de categoria:
fallback:deve apontar para 1 modelo Claude mapeado. Umfallback:presente porém inválido (família não-Claude ou não mapeada) é substituído pelo fallback legado (tier_models:) e registrado comofallback-invalid-substitutedno reason. Umfallback:ausente usa o fallback legado silenciosamente (sem reason — é o comportamento natural, não uma config inválida) — nunca aborta o dispatch. - Caveat gemini (
phase-unsupported-family): um ID de famíliagemininuma cadeia é reconhecido mas não é roteável comoexecutor/plannerhoje — não há worker nativo Gemini. Um membro gemini é pulado silenciosamente e a resolução segue para o próximo membro.
Edite forge-agent-prefs.jsonc (ou .gsd/prefs.local.jsonc) e adicione/edite o bloco routing.
Exemplo de célula cross-engine:
{
"routing": {
"default": {
"executor": {
"standard": ["claude-sonnet-5"],
"heavy": ["claude-opus-5", "gpt-5"], // cadeia cross-engine (claude -> gpt sidecar)
"fallback": "claude-sonnet-5" // categoria: 1 Claude mapeado
}
},
"backend": {
"executor": {
"standard": ["gpt-5", "claude-sonnet-5"], // gpt primario, claude fallback
"fallback": "claude-sonnet-5"
}
}
}
}Para inspecionar a resolução sem disparar dispatch real, use o CLI:
node scripts/forge-routing.js --unit-type execute-task --tier heavy \
--domain backend --explainA matriz canônica de resolver está em scripts/forge-routing.js
(resolveRoute(opts)); precedência completa em shared/forge-dispatch.md.
cd forge-agent
git pull
bash install.sh --updatePreferências e arquivos de projeto nunca são sobrescritos.
Reimplementação dos conceitos do GSD-2 (gsd-pi) para o sistema nativo de agentes do Claude Code. Hierarquia Milestone → Slice → Task, contexto fresco por unidade, memória emergente, workflow de fases e git branch-per-slice são designs originários do gsd-2.
Este repositório não distribui nem modifica código do gsd-2 — apenas reimplementa os conceitos usando arquivos .md.
MIT — veja LICENSE
{ "review": { "challenger": "auto", // resolve de verdade na próxima review dialética "advocate": "auto" // resolve junto } }