pingu-dev-agent
v0.1.44
Published
Pingu - Dev Agent: agente de pair programming em tempo real para Vim, Neovim e LazyVim.
Maintainers
Readme
Pingu - Dev Agent
Pingu e um agente de pair programming em tempo real orientado a arquivo e editor. Ele nao foi desenhado como um chat generico. Ele observa o buffer atual, encontra problemas e pedidos explicitos no proprio codigo, gera snippets idiomaticos por linguagem, cria contexto persistente, sugere ou cria testes, injeta dependencias faltantes e executa acoes de terminal com politica de risco.
O projeto funciona hoje em Vim/Neovim, com foco pratico em LazyVim, runtime local e cobertura offline por linguagem. Isso significa que uma parte grande do fluxo funciona sem API key.
O que o Pingu faz
- Analisa o arquivo atual em tempo real e publica diagnosticos orientados a manutencao.
- Interpreta comentarios acionaveis para gerar codigo no proprio arquivo.
- Cria
context_filea partir de blueprints descritos no comentario, com scaffold nativo nas stacks principais. - Gera ou complementa testes automaticamente e cria
tests/outest/quando necessario, seguindo o convenio da linguagem. - Detecta dependencias faltantes quando o snippet gerado exige imports,
use,requireou#include. - Consulta bibliotecas Node instaladas e importadas pelo buffer para orientar geracoes e correcoes com base na API real da dependencia.
- Tenta inserir imports e includes na fronteira correta do arquivo em vez de simplesmente despejar tudo na linha do comentario.
- Executa
terminal_taskcom inferencia por stack e politica de risco configuravel. - Expoe follow-up acionavel para continuar o pareamento sem sair do arquivo.
- Mantem um fluxo unico e consistente para
LazyVim,VimeNeovim.
O que o Pingu melhora para quem usa
- Reduz troca de contexto: o pedido nasce no comentario do codigo e a resposta volta para o proprio arquivo.
- Acelera scaffolding: funcoes, estruturas, blueprints e testes saem sem interromper o fluxo.
- Diminui repeticao: imports, snippets base, comentarios de manutencao e testes complementares deixam de ser trabalho manual.
- Mantem consistencia arquitetural: o contexto
**registra regras de stack e de arquitetura para orientar geracoes futuras. - Torna o loop de review mais curto: o agente analisa, sugere, aplica, remove o gatilho e reanalisa.
- Funciona bem em ambiente local: boa parte das capacidades ja esta no runtime offline.
Barra de excelencia
O backlog oficial da barra de excelencia do agente esta em docs/agent-excellence-backlog.md.
Esse contrato organiza o que o Pingu precisa fazer automaticamente para ser excelente:
- nao quebrar codigo nem imports
- operar no arquivo atual por padrao
- comentar e corrigir com contexto real
- validar e reverter sozinho quando piorar o estado do arquivo
- manter baixo custo no loop de edicao
Taxonomia de erros de desenvolvimento
A taxonomia versionada fica em config/developer-error-taxonomy.json.
Ela organiza os erros que o Pingu deve tratar por familias:
- sintaxe e estrutura
- higiene de workspace
- nulabilidade e igualdade
- imports e dependencias
- tratamento de erros
- contrato publico
- arquitetura e testes
- fluxo/complexidade
- comandos de runtime
Nem toda classe de erro tem auto-fix seguro. Quando a correcao depende de tipo, framework, contrato de dominio ou efeito colateral externo, o Pingu deve sinalizar ou pedir contexto em vez de reescrever especulativamente.
Correcoes deterministicas ja mapeadas:
- JavaScript/TypeScript:
==e!=viram===e!==quando nao envolvemnull/undefined. - Python:
== Nonee!= Noneviramis Noneeis not None. - Python:
except:viraexcept Exception:. - Ruby: comparacoes diretas com
nilviramnil?. - Elixir: comparacoes diretas com
nilviramis_nil/1.
Operacao de issues
O fluxo de melhoria continua do Pingu via GitHub Issues esta em docs/triage.md.
Esse fluxo define:
- template minimo para bug e improvement
- labels sugeridas para triagem
- prioridades
P0,P1eP2 - regra de reproducao minima e criterio de aceite
- manifesto versionado de labels em
.github/labels.json - workflow manual
sync-issue-labelspara sincronizar labels no GitHub
Release, contribuicao e seguranca
- Release rastreavel: docs/release.md
- Instrucoes operacionais do agente: AGENTS.md
- Contrato de seguranca operacional: SECURITY.md
- Validacao local e sincronizacao do runtime Vim: CONTRIBUTING.md
O que o Pingu nao e
- Nao e um chat generico de perguntas soltas.
- Nao substitui decisao arquitetural do time.
- Nao promete gerar qualquer coisa em qualquer linguagem sem contrato de capacidade.
- Nao gera cobertura para arquivos que ja estao dentro de
tests/outest/, evitando loop de auto-geracao.
Instalacao rapida
CLI pingu
Quando o pacote estiver publicado no npm:
npm install -g @andersonflima/pingu-dev-agent
pingu doctorEnquanto o primeiro publish no npm nao estiver concluido, instale direto do GitHub:
npm install -g github:andersonflima/pingu_ai_codding_pair_programming
pingu doctorPara desenvolvimento local:
git clone [email protected]:andersonflima/pingu_ai_codding_pair_programming.git
cd pingu_ai_codding_pair_programming
npm ci --ignore-scripts
npm link
pingu doctorIDE
Para Vim, Neovim e LazyVim, instale o plugin pelo GitHub conforme a secao Instalacao via GitHub no Vim. A IDE usa o mesmo runtime do CLI, entao pingu doctor tambem ajuda a validar Node.js, runtime local e linguagens ativas.
Quando o runtime inicia com sucesso no editor, o plugin emite notificacao operacional com a mensagem Noot noot!.
Como o loop funciona
- Voce abre um arquivo suportado em
Vim/Neovim. - O Pingu analisa o buffer em abertura, foco, edicao e
save, conforme o fluxo do editor. - Quando encontra um comentario acionavel, ele transforma isso em uma issue do tipo:
comment_taskcontext_fileunit_testterminal_task
- O editor aplica a acao automaticamente ou via quick fix, dependendo do fluxo.
- Quando a acao termina com sucesso, a linha gatilho e removida sem deixar o buffer aberto divergente do arquivo escrito em disco.
- O arquivo e reanalisado para continuar o pareamento.
O runtime que atende a IDE e o CLI e o mesmo. Isso significa que os comentarios acionaveis sao detectados pelo mesmo analisador nos dois modos. A diferenca intencional e operacional: pingu fix corrige apenas erros locais seguros; pingu prompts executa explicitamente os prompts dos comentarios.
Tipos de comentario acionavel
: ou :: gera ou ajusta codigo
Use o prefixo de comentario da linguagem seguido de ::
//: funcao somaEm linguagens com comentario //, o formato recomendado para evitar ambiguidade com bloco e JSDoc e //:::
//:: funcao soma#: implementar funcao para calcular total do pedido#:: funcao soma--: cria modulo billing com funcoes listar e criarPara comentario de bloco, use marcador explicito dentro do bloco (/*::), em vez de texto livre:
/*:: funcao dice que retorna um numero random de um dado de 20 lados */** ou ::: cria contexto persistente e pode gerar scaffold
// ** bff para crud de usuarioFormato recomendado em comentarios com //:
//::: bff para crud de usuario-- ** projeto existente usa onion architecture, controllers finos e casos de uso puros#::: contexto Phoenix usa contexts por dominio, funcoes puras no core e Ecto apenas na fronteiraQuando o blueprint descreve um fluxo de BFF CRUD, o scaffold nativo hoje e mais forte em:
JavaScripteTypeScriptPythonGoRustElixirRubyC
* executa acao de terminal
//* rodar testes# * listar arquivos do projeto# * rodar testes-- * executar este arquivoMarcadores escapados
Se voce quiser manter o comentario literal e impedir a acao do agente, use as variantes escapadas:
\s:\s::\s*\s**\s:::
Exemplos reais de uso e output
1. Geracao simples de funcao em JavaScript
Entrada:
//: funcao somaOutput gerado:
/**
* Orquestra o comportamento principal de soma
* @param {*} a Parametro de entrada do fluxo.
* @param {*} b Parametro de entrada do fluxo.
* @returns {*} Valor calculado conforme a regra principal da funcao.
*/
function soma(a, b) {
// Retorna o resultado consolidado desta funcao.
return a + b
}O que melhora aqui:
- a funcao ja nasce com nome util
- a assinatura vem coerente com a intencao
- a documentacao minima de manutencao ja entra junto
2. Funcao com marcador explicito em C
Entrada:
//:: funcao dice que retorna um numero random de um dado de 20 ladosOutput gerado no arquivo:
int dice(void) {
// Retorna o resultado consolidado desta funcao.
return (rand() % 20) + 1;
}Output complementar de dependencia:
#include <stdlib.h>O que melhora aqui:
- o gatilho fica explicito e menos sujeito a falso positivo em comentario livre
- o retorno fica consistente com a semantica de
d20 - o agente detecta o
#includefaltante
3. Blueprint de contexto com scaffold inicial
Entrada:
//::: bff para crud de usuarioOutputs tipicos:
- atualiza
.gitignorepara ignorar.realtime-dev-agent/ - cria
.realtime-dev-agent/contexts/bff-crud-usuario.md - cria scaffold inicial seguindo Onion Architecture e o source root da stack atual
Arquivos tipicos gerados:
.realtime-dev-agent/contexts/bff-crud-usuario.md
src/domain/entities/usuario.js
src/domain/repositories/usuario-repository.js
src/application/use-cases/list-usuarios.js
src/application/use-cases/get-usuario-by-id.js
src/application/use-cases/create-usuario.js
src/application/use-cases/update-usuario.js
src/application/use-cases/delete-usuario.js
src/infrastructure/repositories/in-memory-usuario-repository.js
src/interfaces/http/controllers/usuario-controller.js
src/interfaces/http/routes/usuario-routes.js
src/main/factories/usuario-crud-factory.jsExemplo equivalente em Python:
.realtime-dev-agent/contexts/bff-crud-usuario.md
app/domain/usuario.py
app/domain/usuario_repository.py
app/application/create_usuario.py
app/infrastructure/in_memory_usuario_repository.py
app/main/build_usuario_crud.pyO que melhora aqui:
- o time registra contexto arquitetural duravel
- o agente passa a usar esse contrato nas proximas geracoes
- o bootstrap de um BFF CRUD deixa de ser trabalho repetitivo
4. Acao de terminal no Vim / Neovim
Entrada:
//* rodar testesOutput esperado no terminal:
[Pingu] command: npm test
...
[Pingu] exit code: 0
[Pingu] terminal pronto para o proximo comando.Comportamento esperado:
- o terminal do editor abre
- o comando e inferido pelo contexto do projeto
- a linha gatilho e removida quando o processo termina com sucesso
5. Follow-up acionavel
Quando o editor encontra um problema elegivel, o Pingu pode inserir um follow-up logo abaixo do trecho atual.
Exemplo de output:
// : Use um ticket ou comentario estruturado para pedir a proxima alteracao aquiO que melhora aqui:
- o pareamento continua no proprio arquivo
- o desenvolvedor nao precisa lembrar a sintaxe do marcador
- o editor vira a superficie principal de colaboracao com o agente
6. Diagnosticos de manutencao
Mesmo sem comentario acionavel, o Pingu pode propor manutencao.
Exemplo em Python:
Entrada:
def soma(a, b):
return a + bOutput tipico:
function_docflow_comment
Snippets esperados:
# Orquestra o comportamento principal de soma
# a: parametro de entrada do fluxo.
# b: parametro de entrada do fluxo.
# Retorno: Valor calculado conforme a regra principal da funcao. # Retorna o resultado consolidado desta funcao.O que o : consegue construir
O parser do : ja entende intencao explicita e tenta gerar estrutura idiomatica por linguagem.
Categorias suportadas:
functioncruduitestcommentenumclassinterfaceoutypestructmoduleounamespaceobjectcollectionvariablescript(principalmente em Shell)
Quando uma estrutura equivalente ja existir no arquivo, o agente tenta evitar duplicacao.
Cobertura por linguagem
O contrato declarativo canonico fica em lib/language-capabilities.js. Esse arquivo define extensoes, editorFeatures, commentTaskIntents, capacidades offline e boas praticas da linguagem.
Resumo pratico:
- JavaScript, TypeScript e React:
comment_task,context_file,unit_test,terminal_taskfuncoes, CRUD, UI, enum, class, interface/type, module, objeto, colecao e variavel - Python:
comment_task,context_file,unit_test,terminal_taskfuncoes, Enum, class, module, object, collection e variable - Elixir:
comment_task,context_file,unit_test,terminal_taskfuncoes,defmodule, contratos com@type, enums por atoms e CRUD inicial - Go:
comment_task,context_file,unit_test,terminal_taskfuncoes,struct,interface, enum tipado, module e object - Rust:
comment_task,context_file,unit_test,terminal_taskfuncoes,struct,trait,enum,mod, object e collection - Ruby:
comment_task,context_file,unit_test,terminal_taskfuncoes,class,module,Struct, hash e enum equivalente - C:
comment_task,context_file,unit_test,terminal_taskfuncoes,struct,enume contratos simples - Lua:
comment_task,context_file,unit_test,terminal_taskfuncoes, modulos, tabelas, enums equivalentes e CRUD inicial - Vimscript:
comment_task,context_file,unit_test,terminal_taskfuncoes, namespace local, dicionarios e helpers de automacao - Shell (
.sh,.bash,.zsh):comment_task,context_file,unit_test,terminal_taskfuncoes, scripts, colecoes simples e enums equivalentes - Terraform:
comment_task,context_file,unit_test,terminal_tasksnippets estruturados,required_version, blueprint de contexto e testes de contrato - YAML:
comment_task,context_file,unit_test,terminal_taskconfiguracao estruturada e testes de contrato - Markdown:
comment_task,context_file,unit_test,terminal_taskdocumentos, terminal acionavel por comentario e testes de contrato - Mermaid:
comment_task,context_file,unit_test,terminal_taskdiagramas, terminal acionavel por comentario e testes de contrato - Dockerfile:
comment_task,context_file,unit_test,terminal_taskcontrato deWORKDIR, contexto persistente, snippets operacionais e testes - TOML:
comment_task,context_file,unit_test,terminal_taskconfiguracao, secoes estruturadas, testes de contrato e terminal por comentario
Maturidade automatica atual do core:
| Linguagem | Comentarios e docs | Correcoes de codigo | Testes automaticos | Observacao |
| --- | --- | --- | --- | --- |
| JavaScript / TypeScript | forte | forte | forte | cobre function_doc, class_doc, variable_doc, context_contract e testes para funcoes e classes exportadas |
| Python | forte | forte | forte | cobre function_doc, class_doc, variable_doc, context_contract e testes para funcoes e classes |
| Elixir | forte | forte | forte | cobre @moduledoc, @doc, @spec, context_contract e testes publicos do modulo |
| Go | forte | forte | forte | cobre function_doc, context_contract e testes para funcoes e tipos publicos |
| Rust | forte | forte | forte | cobre function_doc, context_contract e testes para funcoes e tipos publicos |
| Ruby | forte | forte | forte | cobre function_doc, class_doc, variable_doc, context_contract e testes para funcoes e classes |
| C | forte | forte | forte | cobre function_doc, context_contract e testes de contrato nativos |
| Lua | forte | parcial | forte | cobre function_doc, variable_doc, context_contract e testes de disponibilidade do modulo |
| Vimscript | forte | parcial | forte | cobre function_doc, context_contract e testes de disponibilidade por funcao |
| Shell | forte | parcial | forte | cobre function_doc, context_contract textual e testes de contrato em shell |
| Terraform / YAML / Markdown / Mermaid / Dockerfile / TOML | forte | estrutural | forte | foco em comment_task, context_file, testes de contrato e terminal acionavel |
Sincronismo automático em alteração de assinatura
- O Pingu trata mudança de assinatura como um contrato de manutenção, não apenas como mudança de texto.
- Para funções/métodos públicos detectáveis, ele pode:
- ajustar
function_docpara refletir a assinatura atual; - ajustar
function_specem Elixir quando a aridade diverge; - registrar
unit_test_signaturequando chamadas em testes não combinam mais com a nova aridade.
- ajustar
- Para documentacao automatica de classes, variaveis e comentarios de fluxo, o runtime tambem valida o simbolo atual da declaracao antes de aplicar uma acao antiga.
- Para
unit_test_signature, a validacao usa um contrato estrutural da declaracao: tipo do simbolo, nome qualificado, faixa de aridade, parametros e linha de origem. - Em Elixir, comentarios automaticos redundantes entre
@doce@specentram na mesma faixa de atualizacao do@doc, evitando restos como# Funcao start:apos renomear a funcao parasstart. - Esse comportamento ocorre em modo offline e por heurística de linguagem já mapeada; quando não há confiança suficiente, não altera e mantém a ação para revisão.
Regras de testes automaticos
- O agente cria automaticamente
tests/outest/pelo convenio da linguagem quando a pasta ainda nao existir. - Quando o arquivo ainda nao tem teste correspondente, ele cria o teste base.
- Quando o arquivo ja tem teste base, ele tenta gerar testes complementares para simbolos publicos ainda sem cobertura.
- Em linguagens com classe ou tipo publico, o agente tambem gera teste de disponibilidade para essas estruturas, nao so para funcoes.
- Para
Dockerfile,compose,MarkdowneMermaid, o agente gera testes de contrato em shell dentro detests/. - Em
function_doceunit_test_signature, a revisão automática é aplicada a partir da assinatura atual detectada: se a função muda de parâmetros, chamadas de teste e documentação mínima de contrato podem ser atualizadas no mesmo ciclo.
Como o terminal e inferido
O Pingu tenta escolher o comando mais natural para o projeto e para a linguagem:
- Node.js:
npm test,npm run dev,npm run build,npm run lint,npm run format - Elixir:
mix test,mix run,mix compile,mix format - Go:
go test ./...,go run,go build ./...,gofmt -w - Rust:
cargo test,cargo run,cargo build,cargo fmt,cargo clippy - Python:
python -m pytest,python3 -m pytest,python arquivo.py,python3 arquivo.py,python -m py_compile,python3 -m py_compile - Ruby:
ruby arquivo.rbou testes quandotest/existir - Vimscript:
nvim --headless -u NONE -i NONE -S arquivo +qa! - Comandos genericos de leitura:
pwd,ls -la,git status,git diff
Como o Pingu aparece em cada editor
Vim / Neovim
- analise continua
- painel do agente
- auto-fix
terminal_task- follow-up no painel
Atalhos principais:
<leader>i: analisa o arquivo atual<leader>ia: abre ou fecha o painel<Tab>,ioua: aplica a sugestao selecionadaf: insere follow-up acionavelr: reanalisaq: fecha o painel
Comandos principais no editor:
:PinguCheck:PinguWindowCheck:PinguWindowClose:PinguWindowToggle:PinguUndoFix:PinguLatencyMetrics:PinguAutoFixEnable:PinguAutoFixDisable
Indicador de status:
- o runtime expõe
PinguStatusline()para statusline Vim/Neovim e_G.PinguStatusline()para componentes Lua - por padrao,
g:pingu_statusline_enabled = 1eg:pingu_statusline_icon = '' - quando uma analise ou auto-fix esta rodando, o indicador mostra
Pingu... - quando a ultima analise encontrou sugestoes, o indicador mostra a contagem, por exemplo
Pingu 3 - para adicionar automaticamente o indicador na statusline nativa, use
let g:pingu_statusline_auto = 1
Exemplo com lualine.nvim no LazyVim:
{
"nvim-lualine/lualine.nvim",
opts = function(_, opts)
table.insert(opts.sections.lualine_x, 1, function()
return _G.PinguStatusline and _G.PinguStatusline() or ""
end)
end,
}CLI de terminal
O Pingu tambem pode ser usado fora do editor como CLI, mantendo os flags legados que o Vim/Neovim ja usam.
Comandos principais:
pingu analyze src/app.js --json
pingu analyze src/app.js src/domain/user.py --json
pingu analyze src --json
pingu analyze --stdin --source-path src/app.js --json
pingu fix src/app.js
pingu fix src/app.js --write
pingu fix src --check
pingu fix src --write
pingu prompts src/app.js
pingu prompts src/app.js --write
pingu prompts src --check
pingu comments src/app.js --write
pingu prompts lib/calculator.ex --write
pingu analyze lib/calculator.ex test/calculator_test.exs --json
pingu init --json
pingu profile --lines 180 --json
pingu offline --json
pingu taxonomy
pingu doctorEquivalentes pelo entrypoint direto:
node realtime_dev_agent.js analyze src/app.js --json
node realtime_dev_agent.js fix src/app.js --write --json
node realtime_dev_agent.js prompts src/app.js --write --json
node realtime_dev_agent.js init --json
node realtime_dev_agent.js profile --json
node realtime_dev_agent.js taxonomy --json
node realtime_dev_agent.js doctor --jsonContratos:
analyzeusa o mesmo motor do editor, aceita arquivos/diretorios e nao escreve arquivos.fixmostra um plano por padrao e so escreve com--write.fix --writeaplica apenas correcoes locais de erro/higiene com alta confianca no proprio arquivo.fix --checknao escreve e retorna exit code1quando houver correcao aplicavel; use em CI/pre-commit.- geracao estrutural,
comment_task, testes, arquivos adjacentes e terminal continuam fora dofixpadrao. promptsmostra os comentarios acionaveis encontrados e nao escreve por padrao.prompts --writeexecutacomment_taskecontext_filede forma explicita, usando o mesmo motor da IDE e validando o resultado antes de concluir.prompts --checknao escreve e retorna exit code1quando existir prompt acionavel pendente; use em CI/pre-commit quando quiser bloquear comentarios//::,#:ou equivalentes nao aplicados.commentse alias deprompts.offlinemostra a cobertura offline das linguagens ativas paracomment_task,context_file,unit_testeterminal_task.initcria.pingu/config.jsoncom defaults conservadores para o projeto.profilemede latencia de analise em fixtures sinteticas no modo local padrão.taxonomylista as familias de erro e osissue kindsmapeados.doctorvalida ambiente local, runtime, linguagens ativas e cobertura offline.--serve,--stdin,--analyzee--autofix-guardcontinuam preservados para a integracao da IDE.
Contrato de execução offline
Quando uma acao e gerada no fluxo local com fallback offline, o contexto interno inclui:
- buffer completo do arquivo atual
- janela de foco em torno do comentario ou issue
- comentario acionavel com marcador, papel, linha gatilho e texto original
- memoria persistente do projeto, quando existir
- perfil da linguagem e boas praticas ativas
- mapa de simbolos do arquivo, incluindo funcoes, metodos, classes, tipos e modulos ja existentes
Esse contrato existe para reduzir variacao e evitar regressao. No CLI, prompts e fixes so escrevem com --write; na IDE, o auto-fix reanalisa e passa pelo guard antes de considerar o lote concluido.
Cobertura Offline
O Pingu opera sem dependencias online e sem IA externa. O contrato offline versionado cobre todas as linguagens ativas do registry para:
- comentarios acionaveis:
comment_task - contexto persistente:
context_file - testes:
unit_test - terminal seguro/manual:
terminal_task
Para verificar:
pingu offline --jsonO resultado esperado para o registry atual e percent: 100.
O fluxo atual prioriza cobertura local e fallback offline. Quando um provider externo compatível estiver disponível, o runtime pode aproveitá-lo para enriquecer gerações sem tornar o fluxo dependente disso.
Correcoes offline tambem rodam pelo analisador e pelo CLI:
pingu fix src --writeExemplos de correcoes deterministicas:
- JavaScript/TypeScript: igualdade estrita quando seguro.
- Python:
Nonecomis/is noteexcept Exception. - Ruby:
nil?. - Elixir:
is_nil/1. - higiene geral: whitespace, tabs, linhas duplicadas e sintaxe local.
Exemplo Elixir
Arquivo lib/calculator.ex:
#:: funcao somaAplicando pelo CLI:
pingu prompts lib/calculator.ex --writeResultado esperado:
defmodule Calculator do
@doc """
Executa a etapa principal de soma preservando o contrato esperado
## Parametros
- `a`: Valor numerico usado na regra principal da funcao.
- `b`: Valor numerico usado na regra principal da funcao.
## Retorno
Valor numerico calculado conforme a regra principal da funcao.
## Contrato
`@spec soma(term(), term()) :: term()`
"""
@spec soma(term(), term()) :: term()
def soma(a, b) do
a + b
end
endOutros fluxos Elixir cobertos:
#::gera ou ajusta codigo no arquivo atual.#:::cria contexto persistente e scaffold quando o pedido permitir.# * rodar testesinferemix test.# * compilar projetoinferemix compile.# * formatar projetoinferemix format.unit_testgera teste ExUnit emtest/**/*_test.exs.
Instalacao via GitHub no Vim
O repositorio expoe plugin/ e autoload/ na raiz, entao pode ser instalado direto do GitHub.
lazy.nvim
{
"andersonflima/pingu_ai_codding_pair_programming",
config = function()
vim.g.pingu_start_on_editor_enter = 1
vim.g.pingu_open_window_on_start = 0
vim.g.pingu_auto_fix_enabled = 1
vim.g.pingu_target_scope = "current_file"
vim.g.pingu_auto_fix_scope = "near_cursor"
vim.g.pingu_auto_fix_near_cursor_radius = 24
vim.g.pingu_auto_fix_cluster_gap = 8
vim.g.pingu_auto_fix_visual_mode = "preserve"
vim.g.pingu_review_on_open = 1
vim.g.pingu_realtime_on_change = 1
vim.g.pingu_realtime_on_cursor_hold = 0
vim.g.pingu_realtime_on_buf_enter = 0
vim.g.pingu_realtime_on_buffer_load = 1
vim.g.pingu_realtime_insert_mode = 0
vim.g.pingu_realtime_async = 1
vim.g.pingu_realtime_use_daemon = 1
vim.g.pingu_realtime_focus_scope_enabled = 1
vim.g.pingu_auto_on_save = 1
vim.g.pingu_auto_check_max_lines = 600
vim.g.pingu_analysis_cache_max_entries = 24
vim.g.pingu_latency_metrics_enabled = 0
vim.g.pingu_latency_metrics_max_entries = 50
vim.g.pingu_statusline_enabled = 1
vim.g.pingu_statusline_icon = ""
vim.g.pingu_realtime_auto_fix_max_per_check = 2
vim.g.pingu_auto_fix_doc_cursor_context_only = 0
vim.g.pingu_realtime_doc_cursor_context_only = 1
vim.g.pingu_auto_fix_local_cursor_context_only = 1
end,
}As variaveis g:pingu_* sao a configuracao principal do plugin. As variaveis antigas g:realtime_dev_agent_* nao sao mais aceitas.
vim-plug
Plug 'andersonflima/pingu_ai_codding_pair_programming'Startup automatico no Vim
- inicia no primeiro buffer suportado
- mantem o painel fechado por padrao
- por padrao usa
let g:pingu_target_scope = 'current_file'; useworkspaceapenas com opt-in explicito let g:pingu_open_window_on_start = 0mantem o agente ativo sem abrir painellet g:pingu_open_window_on_start = 1reabre o painel no startup automaticolet g:pingu_start_on_editor_enter = 0desliga o startup automaticolet g:pingu_review_on_open = 1mantem revisao automatica ao abrir arquivoslet g:pingu_target_scope = 'current_file'mantem analise e correcoes no arquivo aberto, mas ainda permiteunit_testadjacente seguro econtext_filepara.realtime-dev-agent/e.gitignorelet g:pingu_target_scope = 'workspace'mantem acoes multi-arquivo amplas fora desse conjunto seguro- por padrao, o runtime ignora diretorios de dependencia e cache como
.venv/,venv/,site-packages/,__pycache__/,node_modules/,vendor/,dist/,build/e caches de ferramentas let g:pingu_auto_fix_scope = 'near_cursor'aplica apenas o trecho mais proximo do cursorlet g:pingu_auto_fix_scope = 'file'volta para o comportamento de arquivo inteiro por ciclolet g:pingu_auto_fix_scope = 'cursor_only'restringe ao cursor imediatolet g:pingu_auto_fix_near_cursor_radius = 24controla a distancia maxima entre cursor e trecho elegivellet g:pingu_auto_fix_cluster_gap = 8controla a distancia maxima entre issues do mesmo trecholet g:pingu_realtime_on_cursor_hold = 0evita reanalise enquanto o cursor fica parado; use1apenas se quiser checagem por pausa de cursorlet g:pingu_realtime_on_buf_enter = 0evita reanalise ao alternar buffers; use1apenas se quiser checagem a cada entrada no arquivolet g:pingu_realtime_on_buffer_load = 1dispara analise assim que o buffer e carregado (arquivo aberto/criado)let g:pingu_auto_on_save = 1consolida comentarios, fixes locais, blueprint seguro e testes adjacentes automaticamente no savelet g:pingu_auto_fix_visual_mode = 'preserve'reduz ruido visual durante o batchlet g:pingu_realtime_insert_mode = 0concentra a analise ao sair do insert mode para reduzir travamentos durante digitacaolet g:pingu_realtime_async = 1usa job assincrono no Neovim para evitar congelar a UI durante o loop automaticolet g:pingu_realtime_use_daemon = 1reaproveita um runtime residente no Neovim para reduzir spawn por analise realtimelet g:pingu_realtime_focus_scope_enabled = 1limita a analise leve realtime ao bloco atual do cursorlet g:pingu_node_path = '/caminho/absoluto/para/node'fixa o runtime quando o PATH do Neovim difere do shelllet g:pingu_auto_check_max_lines = 600limita checks automaticos a arquivos menoreslet g:pingu_analysis_cache_max_entries = 24reaproveita a ultima analise do mesmo texto e reduz relancamento do agentelet g:pingu_latency_metrics_enabled = 1habilita metricas locais em memoria para diagnosticar latencia do runtimelet g:pingu_latency_metrics_max_entries = 50limita quantas amostras recentes ficam guardadas na sessaolet g:pingu_statusline_enabled = 1habilita o indicador de statusPinguStatusline()let g:pingu_statusline_icon = ''define o icone exibido na status barlet g:pingu_statusline_auto = 1adiciona automaticamente o indicador em statusline nativa; por padrao fica desligado para evitar duplicidade em setups comlualinelet g:pingu_undo_fix_history_max = 30limita quantos snapshots de correcoes do Pingu ficam disponiveis por arquivo para rollback manual:PinguLatencyMetricsimprime as amostras recentes de latencia sem gravar arquivos:PinguUndoFixreverte a ultima correcao aplicada pelo Pingu no arquivo atual:PinguUndoFix!força a reversao mesmo se o buffer tiver mudado depois da correcaolet g:pingu_realtime_auto_fix_max_per_check = 2reduz o lote automatico por ciclo realtime para manter o editor fluidolet g:pingu_auto_fix_strict_validation = 0no Neovim evita reanalise e guard sincronos apos cada lote automatico; use1quando preferir validacao estrita mesmo com maior latencialet g:pingu_auto_fix_doc_cursor_context_only = 0deixafunction_doc,class_doc,variable_doceflow_commentelegiveis no arquivo inteirolet g:pingu_realtime_doc_cursor_context_only = 1restringe esses comentarios ao bloco atual durante realtime, evitando edicoes longe do cursor enquanto voce navega ou digitalet g:pingu_auto_fix_local_cursor_context_only = 1restringedebug_output, syntax local,trailing_whitespace,function_spec,markdown_title,terraform_required_versionedockerfile_workdirao bloco textual atuallet g:pingu_auto_fix_doc_cursor_context_max_lines = 80controla o tamanho maximo desse bloco automatico- no LazyVim/Neovim, auto-fixes pendentes calculados durante insert mode sao descartados no
InsertLeavequando ochangedtickdo buffer muda, evitando que uma correcao antiga sobrescreva texto digitado antes de apertarEsc - com os defaults atuais no Vim, o auto-fix realtime continua priorizando correcoes locais para syntax, higiene e comentarios no contexto do cursor, valida o lote antes de concluir e mantem o escopo no arquivo atual; no
save, o agente pode incluirunit_testadjacente seguro econtext_filepara.realtime-dev-agent/e.gitignore, enquantoterminal_taskcontinua fora do auto-fix padrao e sob controle explicito do runtime de terminal
Terminal no Vim / Neovim
let g:pingu_terminal_actions_enabled = 0desligaterminal_tasklet g:pingu_terminal_risk_mode = 'safe'(default)let g:pingu_terminal_risk_mode = 'workspace_write'let g:pingu_terminal_risk_mode = 'all'- comandos como teste, build, install e scripts locais exigem
workspace_write let g:pingu_terminal_strategy = 'background'(default)let g:pingu_terminal_strategy = 'auto'let g:pingu_terminal_strategy = 'toggleterm'let g:pingu_terminal_strategy = 'native'
Variáveis de ambiente
O runtime opera com fallback offline e pode usar provider externo quando disponível, sem exigir configuração obrigatória para os fluxos mapeados.
Linguagens ativas por padrao no runtime:
- todas as linguagens mapeadas no registry, exceto o fallback
default - hoje isso inclui
javascript,python,elixir,go,rust,ruby,lua,vim,c,terraform,yaml,markdown,mermaid,dockerfile,shelletoml
Variáveis comuns:
PINGU_AUTOMATIC_AI_COMMENT_MAX_ISSUESPINGU_FLOW_COMMENT_MAX_LINESPINGU_LIGHT_ANALYSIS_DEEP_PASS_MAX_LINES
Provider de IA:
PINGU_AI_PROVIDER=copilot(default): mantém o comportamento legado via Copilot CLIPINGU_AI_PROVIDER=openai: força uso do provider OpenAIPINGU_AI_PROVIDER=auto: tenta OpenAI primeiro e usa Copilot como fallback
Variáveis do provider OpenAI:
OPENAI_API_KEYchave da APIPINGU_OPENAI_MODELmodelo usado no provider (gpt-4o-minipor default)PINGU_OPENAI_BASE_URLendpoint base (default:https://api.openai.com/v1)PINGU_OPENAI_TIMEOUT_MStimeout da chamada HTTPPINGU_OPENAI_COMMANDcomando HTTP síncrono (default:curl)PINGU_OPENAI_DISABLED=1desliga o provider OpenAI
Variáveis do provider Copilot:
PINGU_COPILOT_COMMANDcomando do provider (default:copilot)PINGU_COPILOT_TIMEOUT_MStimeout da chamada ao providerPINGU_COPILOT_FAILURE_COOLDOWN_MScooldown de falha do providerPINGU_COPILOT_DISABLED=1desliga o provider Copilot
Doppler
O repositório já inclui doppler.yaml para bootstrap local do projeto/config.
Setup local:
doppler setup
doppler run -- node realtime_dev_agent.js doctor
doppler run -- nvimComandos npm prontos:
npm run doppler:setupnpm run doppler:doctornpm run doppler:run:doctornpm run doppler:run:checknpm run doppler:run:nvim
No Doppler, configure ao menos:
OPENAI_API_KEYPINGU_AI_PROVIDER(openai,copilotouauto)- opcional:
PINGU_OPENAI_MODEL,PINGU_OPENAI_BASE_URL,PINGU_OPENAI_TIMEOUT_MS
Importante:
- Vim e Neovim herdam variaveis de ambiente no momento em que sao iniciados
- se a chave mudar depois que o editor ja estiver aberto, reinicie o editor
- por default (
PINGU_AI_PROVIDER=copilot), o runtime mantém o provider legado; para OpenAI, configurePINGU_AI_PROVIDER=openai(ouauto) - para
comment_task,context_file,unit_teste correcoes automaticas, o runtime prioriza provider assistido quando operacional - se o provider externo não estiver disponível ou falhar, o fluxo segue com fallback local sem interrupção
- quando o provider falha em runtime (ex.: CLI sem autenticacao), o agente entra em cooldown automatico curto e evita novas tentativas ate expirar, reduzindo impacto de latencia no loop automatico
- no Neovim, diagnosticos ativos do LSP agora entram no lote automatico como
lsp_code_actione tentam aplicarsource.fixAll,source.organizeImportsequickfixsem abrir prompt - no Neovim, warnings do LSP sem
codeActionaplicavel entram comolsp_ai_fixe podem usar Copilot para gerar uma edicao local minima; se o provider estiver indisponivel, o fluxo continua sem bloquear o editor - no Neovim, o loop realtime tambem observa
DiagnosticChangede agenda nova rodada automaticamente quando o LSP atualiza lint/syntax sem edicao manual no buffer - quando houver
syntax_*no arquivo e provider assistido estiver operacional, o runtime tenta consolidar um reparo unico de sintaxe no arquivo antes do fallback por item - quando o servidor exigir
codeAction/resolve, o runtime resolve e executa a acao automaticamente antes de aplicar edits/comandos - se a busca com
context.onlyvier vazia, o runtime faz fallback automatico para nova tentativa semonly - quando o
kinddo code action vier fora dos padroes esperados, o runtime ainda pode aplicar a melhor acao habilitada (priorizandoisPreferred) - quando uma correcao automatica (snippet local ou
lsp_code_action) eh aplicada com sucesso, o buffer alvo eh salvo automaticamente no disco :PinguWindowCheck(e o atalhog:pingu_window_key) mantem o painel aberto durante e apos a analise assincronalsp_code_actione issuessyntax_*sao tratadas como escopo agnostico no realtime (nao ficam presas ao raio do cursor), reduzindo casos em que o erro existe mas nao entra no lote- Elixir ganhou deteccao adicional de bloco
do/endpendente, cobrindo erros comosyntax error before: 'Logger'quando faltamends - Elixir agora detecta keyword de fechamento malformada (
eend,ennd,endd) comosyntax_malformed_keywordcom auto-fix porreplace_line function_docagora evita ciclo de atualização quando a doc já corresponde ao snippet gerado (inclusive em parametros opcionais/variadicos de TypeScript e defaults de Python)function_docem Elixir remove comentarios automaticos obsoletos logo abaixo do@doce considera qualquer referencia antiga de nome como desatualizacaofunction_specem Elixir evita duplicacao em funcoes com multiplas clausulas da mesma aridade, reduzindo oscilacao de add/remove de@spec- atualizacoes de
function_speccomreplace_rangeagora substituem o bloco de@speccorretamente no runtime Vim/Neovim, evitando insercao paralela e oscilacao - o runtime valida a declaracao atual antes de aplicar
class_doc,variable_doc,flow_comment,function_comment,moduledoc,function_doc,function_speceunit_test_signatureantigos unit_test_signatureagora carrega contrato estrutural de declaracao e cobre tambem metodos JavaScript/TypeScript de classes exportadassyntax_*com acao de insercao (insert_after/insert_before) nao sao mais bloqueadas por dedupe simplista da linha ancora- respostas assistidas para comentarios/documentacao receberam instrucoes mais restritivas para reduzir texto generico quando o provider estiver operacional
- no fallback local de
function_doc/function_comment, os argumentos e contrato agora usam contexto de simbolo para evitar placeholders genericos PINGU_AUTOMATIC_AI_COMMENT_MAX_ISSUES=8limita quantas issues decomment_taskentram no ciclo automático por execução; use0para remover o limitePINGU_AUTOMATIC_AI_SYNTAX_BUNDLE_MIN_ISSUES=1define a partir de quantas issuessyntax_*o runtime consolida reparo de sintaxe por arquivo quando provider assistido estiver operacional; use0para desabilitar esse bundlePINGU_COPILOT_FAILURE_COOLDOWN_MS=30000ajusta o cooldown de falha do provider (default: 30000ms)PINGU_DOCUMENTATION_AUTO_FIX_MIN_CONFIDENCE=0.60controla o limiar minimo de confianca para comentario automatico documental; valores menores deixam o lote mais agressivoPINGU_DOCUMENTATION_MAX_LINES=420evitafunction_doc,class_doc,variable_doceflow_commentautomaticos em arquivos grandes; use0para remover o cortePINGU_FLOW_COMMENT_MAX_LINES=260evitaflow_commentautomatico em arquivos grandes; use0para remover o cortePINGU_LIGHT_ANALYSIS_DEEP_PASS_MAX_LINES=260limita checks mais profundos do modolighta arquivos menores; use0para manter o deep pass mesmo em arquivo grandePINGU_AUTOFIX_LARGE_FILE_LINE_THRESHOLD=260define a partir de quantas linhas o runtime encolhe o lote automaticoPINGU_AUTOFIX_DOC_MAX_PER_PASS=0limita quantas issues documentais sobem por ciclo;0remove o cortePINGU_AUTOFIX_DOC_MAX_PER_PASS_LARGE_FILE=4limita docstrings/comentarios por ciclo em arquivo grande- no LazyVim, os equivalentes sao
g:pingu_auto_fix_large_file_line_threshold,g:pingu_auto_fix_large_file_radiuseg:pingu_auto_fix_doc_max_per_check_large_file - no LazyVim,
debug_outputefunction_speccursor-local entram no lote automatico seguro sem depender da trilha live g:pingu_lsp_auto_fix_enabled=1habilita aplicacao automatica de code action do LSP (default no Neovim)g:pingu_lsp_auto_fix_max_per_check=3limita quantos diagnosticos do LSP entram por ciclog:pingu_lsp_auto_fix_timeout_ms=400define timeout da buscatextDocument/codeActionpor itemg:pingu_lsp_auto_fix_max_severity='warning'limita severidade elegivel (error,warning,info,hintou1..4)g:pingu_lsp_auto_fix_only=['source.fixAll','source.organizeImports','quickfix']controla a ordem/tipos de code action elegiveisg:pingu_lsp_auto_fix_prefer_global=1prioriza tentativa defixAll/organizeImportsno escopo do arquivo antes do quickfix localg:pingu_lsp_ai_fix_enabled=1habilita fallback com Copilot para warnings do LSP sem code action aplicavel (default no Neovim)g:pingu_lsp_ai_fix_max_per_check=1limita chamadas ao provider externo por ciclog:pingu_lsp_ai_fix_severities=['warning']restringe quais severidades podem acionar o fallback assistido
CI/CD com Doppler (opcional)
O workflow de CI (.github/workflows/ci.yml) já suporta Doppler de forma opcional:
- se
DOPPLER_TOKENestiver definido nos secrets do repositório, a pipeline instala Doppler CLI e executa smoke/check/pack comdoppler run -- ... - sem
DOPPLER_TOKEN, a pipeline continua com o fluxo normal sem Doppler
Como funciona internamente
realtime_dev_agent.js: entrypoint executavel do runtimelib/cli.js: comandos CLI, compatibilidade legada da IDE e servidor residentelib/analyzer.js: analise e emissao de issueslib/analyzer-profile.js: perfil sintetico de latencia da analiselib/generation*.js: geracao de snippets, blueprints, testes, dependencias e terminal taskslib/language-capabilities.js: contrato declarativo de linguagemvim/,plugin/,autoload/: runtime do plugin Vim / Neovim
Validacao de desenvolvimento
npm run check
npm run smoke:vim
npm run profile
npm run pack:check
npm run release:checkcheck:vim-runtimegarante queplugin/eautoload/continuam sincronizados comvim/.sync:vim-runtimeatualiza as copias publicas depois de alterar o runtime canonico emvim/.ci:releasecombina testes, pacote e validacao de versao npm antes do publish.
Estrutura principal
realtime_dev_agent.js: entrada executavel do agentelib/: analise, geracao e suportevim/: implementacao principal do plugin Vimplugin/eautoload/: wrappers para instalacao direta no Vim
