Todos os projetos

DOLLY

O jeito como você constrói software, salvo como padrão

Extraia o formato de um projeto e depois crie, verifique e migre outros projetos com ele

Papel Autor. Projetei e construí de ponta a ponta: o formato do padrão, o extrator determinístico, a CLI, o daemon local, a interface gráfica e o shell nativo.
Período Jul 2026 –
Resultado Lançado: v0.1.1 no GitHub, no npm e no Homebrew, com instaladores desktop.
Stack
  • TypeScript
  • Bun
  • Vue 3
  • Tauri
  • CodeMirror
  • Playwright
  • Biome
Open source · MIT · v0.1.1 GitHub

Contexto

Todo projeto que eu começo carrega as mesmas decisões do anterior: onde os arquivos ficam, como se chamam, qual linter e qual formatador, qual test runner, como se escreve um commit. Nada disso mora num lugar que dê para apontar. Mora no último repositório que você fez. O dolly é a minha resposta, feito fora do trabalho a partir de julho de 2026. É uma ferramenta local que lê um projeto real e escreve essas decisões como um padrão: um diretório com um pattern.md (facetas em YAML para o que uma máquina consegue cobrar, prosa em Markdown para o que só uma pessoa entende) mais os arquivos de configuração e os templates que ele capturou. Depois, aplica o padrão em qualquer lugar. O nome vem da ovelha Dolly: você clona o jeito como constrói software.

Meu papel

É meu de ponta a ponta, e está lançado: a v0.1.1 sai como um binário por plataforma com a interface embutida, como o pacote dollysheep no npm, por um tap do Homebrew e como instaladores desktop. O motor é uma biblioteca em TypeScript rodando no Bun, com uma CLI fina por cima. dolly extract infere um padrão de um repositório sem nenhuma anotação. dolly new cria um projeto do zero a partir dele. dolly check cobra o padrão como um linter, com correções automáticas seguras, modo watch e um marcador .dolly que amarra o repositório ao padrão. dolly fit migra um projeto existente. dolly export escreve o padrão como um bundle .dolly ou como o arquivo que um agente de código espera (CLAUDE.md, AGENTS.md, regras do Cursor e mais alguns).

Em volta do motor há um daemon local, uma interface em Vue 3 que faz tudo que a CLI faz e um shell em Tauri que sobe o daemon compilado como sidecar. A camada de IA é opcional e roda com a sua chave de API: com ela ligada, o dolly sugere onde um arquivo ambíguo deve ficar, traduz arquivos para a linguagem que o padrão exige e rascunha edições do padrão observando o que muda num projeto. Tudo que é determinístico funciona com ela desligada.

  1. 01 Um projeto existente sem nenhuma anotação
  2. 02 extract uma varredura da árvore alimenta cinco scanners determinísticos
    • uma faceta só quando a evidência passa da régua
    • uma nota com contagem, nunca um chute, quando não passa
    • os mesmos bytes dão o mesmo padrão em qualquer sistema
  3. 03 pattern.md o padrão portátil, um diretório que dá para ler
    • facetas em YAML: nomes, layout, toolchain, dependências, comandos, testes, licença
    • convenções em prosa, em Markdown
    • as configs e os templates capturados
  4. 04 Aplicar três verbos sobre um padrão
    • new cria um projeto do zero
    • check cobra como um linter: correções seguras, modo watch, CI
    • fit migra: plano em dry-run primeiro, branch de checkpoint, nunca pela metade
  5. 05 export para compartilhar, ou para entregar a um agente de código
    • bundle .dolly
    • CLAUDE.md
    • AGENTS.md
    • Cursor
    • Copilot
    • Gemini
Camada de IA, opcional, com a sua chave posicionamento de arquivos, tradução, aprendizado a partir de um projeto que muda; tudo que é determinístico funciona com ela desligada
dolly serve um daemon local, a interface em Vue 3 que faz tudo que a CLI faz e um shell Tauri que roda o daemon como sidecar
De um projeto real a um padrão, e do padrão a três formas de aplicar: criar um projeto novo, manter um existente na linha ou migrá-lo. Exportações e a camada de IA opcional ficam ao lado do motor; a interface gráfica chega a tudo isso por um daemon local. Tudo é meu.

A parte difícil

Extrair sem chutar. Uma faceta errada é pior do que nenhuma, porque o check passaria a reprovar um projeto por algo que ele nunca combinou. Então cada scanner tem classes de evidência explícitas, e cada achado cai em exatamente um de três lugares: uma faceta, quando a evidência passa da régua; uma nota em prosa, com a contagem (“4 de 6 diretórios em src/ têm routes.ts; acrescente ao layout se for intencional”), quando não passa; ou silêncio. Uma única varredura da árvore alimenta os cinco scanners, então toda faceta de um padrão se apoia na mesma evidência, e os mesmos bytes produzem o mesmo padrão em qualquer sistema.

O fit. Migrar um repositório vivo é onde uma ferramenta dessas faz estrago. O fit é dry-run por default: imprime o plano inteiro, até o diff de cada arquivo e cada import relativo que uma movimentação reescreveria. O --apply recusa uma árvore suja, registra um branch de checkpoint para que desfazer seja um git switch e faz o commit do resultado. Uma movimentação que ele não consegue explicar por completo é recusada com o motivo, nunca aplicada pela metade.

Depois, entregar inteiro: um binário único com a interface embutida, instaladores para os três sistemas saindo de um só workflow de release, chaves de API no chaveiro do sistema e o Playwright percorrendo cada tela da interface no CI.

Em agosto a máquina que guardava o repositório foi apagada, e ele nunca tinha recebido um push. Reconstruí a partir dos logs das sessões que o tinham construído: cada escrita e edição de arquivo refeita em ordem, cada arquivo conferido contra os trechos dos logs, e o gate inteiro (lint, tipos, build, testes) rodado no fim. Voltou verde.

A interface servida pelo daemon local: a página de um padrão, com as facetas extraídas deste mesmo repositório, e um relatório de check contra ele (duas violações corrigíveis, nada chutado).A interface servida pelo daemon local: a página de um padrão, com as facetas extraídas deste mesmo repositório, e um relatório de check contra ele (duas violações corrigíveis, nada chutado).
A interface servida pelo daemon local: a página de um padrão, com as facetas extraídas deste mesmo repositório, e um relatório de check contra ele (duas violações corrigíveis, nada chutado).

Resultado

Lançado em setembro de 2026 sob MIT: v0.1.1 no GitHub, no npm e no Homebrew, mais de 300 testes e testes de ponta a ponta da interface, instaladores gerados pelo workflow de release. Hoje começo meus projetos com ele. O repositório está no link acima.