Uma CLI em Go para autonomous coding loops, inspirada no Ralph mas melhor arquitetada.
LoopForge é uma ferramenta que orquestra agentes de código (Claude Code, Codex, OpenCode, etc.) em loops iterativos baseados em arquivos. Cada iteração trabalha em uma story por vez, commita o progresso, e mantém estado persistente para aprendizado contínuo.
Filosofia Core:
- Arquivos e git são memória, não o contexto do modelo
- Uma story por iteração (contexto limpo)
- Commits granulares (rollback fácil)
- Guardrails persistentes (aprendizado acumulativo)
- Context Pollution - Conversas longas poluem o contexto do LLM
- Falta de Estrutura - Prompts grandes sem organização
- Commits Gigantes - Difícil fazer rollback
- Perda de Aprendizado - Erros não informam futuras iterações
- Falta de Validação - UI não é testada automaticamente
- Desenvolvedores usando agentes de código (Claude Code, Codex, etc.)
- Times que querem automação de desenvolvimento
- Projetos que precisam de auditoria (commits granulares)
Comando: loopforge prd
O sistema deve gerar um PRD estruturado em JSON a partir de uma descrição:
loopforge prd "Sistema de autenticação com OAuth2"
loopforge prd --file requirements.txt
loopforge prd --interactive # modo pergunta-respostaPRD JSON Schema:
{
"version": 1,
"project": "string",
"overview": "string",
"goals": ["string"],
"nonGoals": ["string"],
"stack": {
"language": "string",
"framework": "string",
"database": "string"
},
"qualityGates": ["string"],
"stories": [
{
"id": "US-001",
"title": "string",
"status": "open|in_progress|done|blocked",
"dependsOn": ["US-000"],
"description": "string",
"acceptanceCriteria": ["string"],
"estimatedMinutes": 30,
"startedAt": "ISO8601",
"completedAt": "ISO8601"
}
]
}Funcionalidades:
- Modo interativo com perguntas clarificadoras
- Modo não-interativo com prompt direto
- Leitura de arquivo de requisitos
- Validação de schema JSON
- Auto-numeração de stories (US-001, US-002, ...)
- Detecção automática de dependências entre stories
Comando: loopforge build [iterations]
loopforge build # executa até completar (max 25)
loopforge build 5 # executa 5 iterações
loopforge build --dry-run # simula sem executar agente
loopforge build --no-commit # não commita mudançasFluxo por Iteração:
- Selecionar próxima story
open(respeitando dependências) - Marcar como
in_progress - Renderizar prompt com contexto
- Executar agente
- Detectar sinal de conclusão
- Se completo: marcar
done, commitar - Se falhou: resetar para
open, logar erro - Atualizar progress.md
- Repetir
Funcionalidades:
- Seleção inteligente de stories (dependências, prioridade)
- Lock otimista para execução concorrente
- Timeout configurável por story
- Retry automático com backoff
- Detecção de stories "stale" (in_progress por muito tempo)
- Interrupção limpa (SIGINT/SIGTERM)
Comando: loopforge agent
loopforge agent list # lista agentes disponíveis
loopforge agent set claude # define agente padrão
loopforge agent test # testa conexão com agenteAgentes Suportados:
- Claude Code (
claude) - OpenAI Codex (
codex) - OpenCode (
opencode) - Factory Droid (
droid) - Custom (configurável)
Configuração:
# .loopforge/config.yaml
agent:
name: claude
command: "claude -p --dangerously-skip-permissions"
inputMode: file # stdin | file | arg
completionSignal: "<promise>COMPLETE</promise>"
timeout: 30mDiretório: .loopforge/
.loopforge/
├── config.yaml # Configuração
├── progress.md # Log de progresso
├── guardrails.md # Signs/lições aprendidas
├── errors.log # Falhas para análise
├── activity.log # Timeline de eventos
├── context.log # Tracking de contexto
└── runs/
├── run-20260123-143022-001.log
└── run-20260123-143022-001.meta.json
Funcionalidades:
- Inicialização automática
- Migração de versões de config
- Backup antes de operações destrutivas
- Cleanup de runs antigos
Comando: loopforge guardrail
loopforge guardrail list # lista guardrails ativos
loopforge guardrail add # adiciona novo (interativo)
loopforge guardrail disable ID # desabilita temporariamente
loopforge guardrail export # exporta para compartilharSchema de Guardrail:
- id: GR-001
name: "Read Before Writing"
trigger: "Before modifying any file"
instruction: "Read the file first to understand context"
severity: warning # info | warning | error
addedAfter: "Iteration 3 - overwrote important code"
enabled: trueFuncionalidades:
- Guardrails built-in (core)
- Guardrails customizados por projeto
- Sugestão automática baseada em erros
- Injeção no prompt do agente
Comando: loopforge template
loopforge template list # lista templates
loopforge template show build # mostra template
loopforge template edit build # edita template
loopforge template reset # restaura defaultsTemplates Built-in:
build.md- Prompt principal de buildprd.md- Prompt para geração de PRDreview.md- Prompt para code reviewrefactor.md- Prompt para refatoração
Variáveis de Template:
{{.PRD}}- Caminho do PRD{{.Story}}- Story atual (JSON){{.Guardrails}}- Conteúdo de guardrails.md{{.Progress}}- Últimas N entradas de progress{{.QualityGates}}- Quality gates do PRD{{.RunID}}- ID único da execução{{.Iteration}}- Número da iteração
Funcionalidades:
- Execução de comandos de validação
- Parsing de output (PASS/FAIL)
- Blocking gates (impedem conclusão)
- Warning gates (logam mas não bloqueiam)
- Gates customizados por story
qualityGates:
- name: tests
command: "go test ./..."
blocking: true
- name: lint
command: "golangci-lint run"
blocking: false
- name: build
command: "go build ./..."
blocking: trueComando: loopforge browser
loopforge browser start # inicia servidor
loopforge browser stop # para servidor
loopforge browser snapshot page # captura ARIA snapshot
loopforge browser screenshot page # captura screenshotFuncionalidades:
- Servidor de automação Playwright-based
- ARIA snapshots para descoberta de elementos
- Screenshots para validação visual
- Integração com stories de frontend
Comando: loopforge report
loopforge report # sumário do projeto
loopforge report --format json # output JSON
loopforge report --html report.html # gera HTMLMétricas:
- Stories totais/completas/pendentes
- Tempo médio por story
- Taxa de sucesso por iteração
- Erros mais comuns
- Guardrails mais acionados
Comando: loopforge watch
loopforge watch # monitora PRD e executa quando muda
loopforge watch --auto-build # auto-executa build em mudançasCada pacote deve ter cobertura de testes unitários:
internal/prd/- Parser e validação de PRD (100% coverage)internal/core/- Seleção de stories, template engine (90%+ coverage)internal/config/- Carregamento e validação de config (90%+ coverage)internal/guardrail/- CRUD de guardrails (90%+ coverage)
Convenções:
- Arquivos de teste:
*_test.gono mesmo pacote - Table-driven tests sempre que possível
- Mocks para dependências externas (filesystem, agentes)
Interface abstrata Agent permite testar e adicionar novos agentes:
type Agent interface {
Name() string
IsAvailable() bool
Run(ctx context.Context, prompt string) (AgentResult, error)
}
type AgentResult struct {
Output string
ExitCode int
Completed bool // detectou sinal de conclusão
Duration time.Duration
}Testes de integração:
tests/integration/agent_test.go- Testa interface com mock agenttests/integration/claude_test.go- Testa Claude Code real (skip se não disponível)tests/integration/e2e_test.go- Fluxo completo init→prd→build
Mock Agent para CI:
type MockAgent struct {
Responses []string // respostas pré-definidas
Delay time.Duration
}- Unitários: 80% overall
- Pacotes críticos (prd, core): 90%
- CI falha se coverage cair
- Startup em < 100ms
- Overhead mínimo por iteração (< 1s)
- Binário < 20MB
- Single binary (sem dependências runtime)
- Cross-platform: Linux, macOS, Windows
- ARM64 e AMD64
- Colorized output
- Progress bars para operações longas
- Mensagens de erro claras com sugestões
- Autocompletion para shells (bash, zsh, fish)
- Plugins para novos agentes
- Hooks pre/post iteração
- API programática (biblioteca Go)
- Graceful shutdown
- Lock files para operações concorrentes
- Journaling para recovery
cmd/
├── loopforge/
│ └── main.go # Entry point
internal/
├── cli/
│ ├── root.go # Cobra root command
│ ├── prd.go # prd command
│ ├── build.go # build command
│ ├── agent.go # agent command
│ ├── guardrail.go # guardrail command
│ └── ...
├── core/
│ ├── loop.go # Main loop logic
│ ├── story.go # Story selection/management
│ ├── state.go # State management
│ └── template.go # Template rendering
├── agent/
│ ├── interface.go # Agent interface
│ ├── claude.go # Claude implementation
│ ├── codex.go # Codex implementation
│ └── custom.go # Custom agent
├── prd/
│ ├── generator.go # PRD generation
│ ├── parser.go # PRD parsing
│ └── validator.go # Schema validation
├── guardrail/
│ ├── manager.go # Guardrail management
│ └── builtin.go # Built-in guardrails
├── browser/
│ ├── server.go # Browser automation server
│ └── snapshot.go # ARIA snapshot
└── config/
├── config.go # Configuration
└── defaults.go # Default values
Dependências:
cobra- CLI frameworkviper- Configurationgo-git- Git operationschromedp- Browser automationzerolog- Logginglipgloss- Terminal styling
| ID | Título | Dependências | Estimativa |
|---|---|---|---|
| US-001 | Scaffold projeto Go com estrutura de diretórios | - | 30min |
| US-002 | CLI base com Cobra (root, version, help) | US-001 | 30min |
| US-003 | Sistema de configuração com Viper | US-002 | 45min |
| US-004 | Estrutura de state (.loopforge/) | US-003 | 30min |
| US-005 | Parser de PRD JSON | US-004 | 45min |
| US-006 | Seleção de stories (dependências, status) | US-005 | 1h |
| US-007 | Interface de agente + implementação Claude | US-003 | 1h |
| US-008 | Template engine para prompts | US-004 | 45min |
| US-009 | Loop principal de build | US-006, US-007, US-008 | 2h |
| US-010 | Comando build completo |
US-009 | 1h |
| ID | Título | Dependências | Estimativa |
|---|---|---|---|
| US-011 | Gerador de PRD interativo | US-010 | 2h |
| US-012 | Comando prd |
US-011 | 30min |
| US-013 | Sistema de guardrails | US-004 | 1h |
| US-014 | Guardrails built-in | US-013 | 45min |
| US-015 | Comando guardrail |
US-013 | 30min |
| ID | Título | Dependências | Estimativa |
|---|---|---|---|
| US-016 | Implementação Codex | US-007 | 30min |
| US-017 | Implementação OpenCode | US-007 | 30min |
| US-018 | Agente customizado | US-007 | 45min |
| US-019 | Comando agent |
US-016, US-017, US-018 | 30min |
| US-020 | Quality gates execution | US-010 | 1h |
| US-021 | Progress tracking (progress.md) | US-010 | 45min |
| ID | Título | Dependências | Estimativa |
|---|---|---|---|
| US-022 | Colorized output com lipgloss | US-010 | 45min |
| US-023 | Shell autocompletion | US-002 | 30min |
| US-024 | Comando report |
US-021 | 1h |
| US-025 | Comando template |
US-008 | 30min |
| US-026 | Watch mode | US-010 | 1h |
| US-027 | Testes de integração | US-010 | 2h |
| US-028 | Documentação README | US-027 | 1h |
| US-029 | GitHub Actions CI/CD | US-028 | 1h |
| US-030 | Release binários (goreleaser) | US-029 | 45min |
| ID | Título | Dependências | Estimativa |
|---|---|---|---|
| US-031 | Browser server com chromedp | US-010 | 2h |
| US-032 | ARIA snapshot | US-031 | 1h |
| US-033 | Comando browser |
US-031, US-032 | 30min |
| Aspecto | Ralph | LoopForge |
|---|---|---|
| Linguagem | Shell/Node | Go |
| Distribuição | npm | Single binary |
| Configuração | .sh files | YAML |
| Extensibilidade | Shell scripts | Go plugins |
| Agentes | Hardcoded | Pluggable |
| Error handling | Basic | Structured |
| Concorrência | Não | Lock-based |
| Watch mode | Não | Sim |
| Report | Não | Sim |
- Adoção: 100+ stars no GitHub em 3 meses
- Qualidade: 90%+ code coverage
- Performance: Startup < 100ms
- Compatibilidade: Funciona com os 4 agentes principais
- Documentação: README completo + examples
- Semana 1: Fase 1 (Core/MVP)
- Semana 2: Fase 2 (PRD & Guardrails)
- Semana 3: Fase 3 (Agentes & Quality)
- Semana 4: Fase 4 (Polish) + Release
| Risco | Probabilidade | Impacto | Mitigação |
|---|---|---|---|
| Agentes mudam API | Média | Alto | Abstração via interface |
| chromedp instável | Baixa | Médio | Browser opcional |
| Competição | Média | Baixo | Foco em DX e Go ecosystem |
PRD criado em 2026-01-23 Versão: 1.0