/generate
Gera codigo ADVPL/TLPP - funcoes, classes, estruturas MVC, APIs REST, Web Services e pontos de entrada para TOTVS Protheus
/advpl-specialist:generate
Gera novo codigo ADVPL ou TLPP seguindo as convencoes e boas praticas do Protheus.
Uso
/advpl-specialist:generate <type> [name] [--module <module>]Tipos
| Tipo | Descricao | Saida |
|---|---|---|
function | User Function | arquivo .prw |
class | Classe TLPP | arquivo .tlpp |
mvc | Estrutura MVC (MenuDef, ModelDef, ViewDef) | arquivo .prw |
rest | Endpoint de API REST | arquivo .prw ou .tlpp |
ponto-entrada | Ponto de entrada | arquivo .prw |
webservice | Web Service SOAP | arquivo .prw |
treport | Relatorio TReport | arquivo .prw |
fwformbrowse | Tela FWFormBrowse/FWExecView | arquivo .prw |
job | Job batch / processo agendado | arquivo .prw ou .tlpp |
workflow | Processo de workflow de aprovacao | arquivo .prw |
Opcoes
| Flag | Descricao | Padrao |
|---|---|---|
--module | Prefixo do modulo (COM, FAT, FIN, etc.). Para saida TLPP, tambem usado como agrupador de namespace: custom.<module>.<servico> | Pergunta ao usuario |
--lang | Linguagem: advpl ou tlpp | advpl para function/mvc/pe, tlpp para class |
--output | Caminho do arquivo de saida | Diretorio atual + nome + extensao. NAO varre o projeto para inferir o caminho — se o usuario quiser um local especifico, deve passar --output explicitamente ou responder a uma pergunta sobre isso. |
Namespace TLPP (obrigatorio para arquivos
.tlpp): todo arquivo.tlppgerado declara uma linhanamespace custom.<agrupador>.<servico>logo apos os includes. O gerador deriva o namespace de--module(como agrupador) mais o nome do servico/classe (como servico), tudo em lowercase e sem underscores. Se--modulenao for fornecido, o gerador pergunta ao usuario o agrupador durante a Fase de Planejamento.
Processo
OBRIGATORIO: Sempre entra em modo de planejamento antes de gerar codigo. Nunca pula o planejamento.
Sem Varredura de Fontes do Projeto (CRITICO)
NAO varre os arquivos-fonte do projeto do cliente. O plugin e baseado em templates — todo o codigo e gerado a partir dos templates e skills do proprio plugin. Ler arquivos .prw / .tlpp / .prx existentes do projeto do cliente nao e necessario para nenhum cenario de /generate e deve ser evitado porque:
- Projetos Protheus rotineiramente possuem milhares de arquivos-fonte — varre-los e proibitivamente lento e desperdica o tempo do usuario
- O codigo gerado vem dos templates do plugin, nao do codigo-base do cliente
- Convencoes de nomenclatura, estilo e padroes vem da skill (
advpl-code-generation), nao de arquivos existentes - O chamador ja fornece tudo que o gerador precisa:
type,name,--module, requisitos de negocio
Usos permitidos de Read / Glob / Grep:
- Leitura de arquivos dentro do proprio plugin —
skills/*,templates-*.md,patterns-*.md,agents/code-generator.md Writedo arquivo.prw/.tlppfinal gerado em discoReadde um arquivo especifico que o usuario referenciou explicitamente em sua solicitacao (arquivo unico, caminho exato fornecido pelo usuario)
Usos proibidos:
Glob "**/*.prw",Glob "**/*.tlpp",Glob "src/**/*"— nunca lista arquivos-fonte do clienteGrepna arvore de fontes do cliente para "encontrar padroes" ou "checar nomenclatura existente"Readde arquivos-fonte do cliente "para entender o codigo-base" — os templates sao auto-suficientesBash ls,Bash find,Bash treena raiz do projeto do cliente — mesma proibicao
Regra do caminho de saida: Salva o arquivo gerado no diretorio de trabalho atual usando <nome>.<ext> (ou no caminho passado via --output). Nunca usa Glob para descobrir pastas de modulo, nunca "adivinha" o local correto varrendo. Se o usuario tem uma localizacao preferida, ou ele passa --output ou o gerador faz uma pergunta direta.
Unica excecao: O usuario referencia explicitamente um arquivo existente em sua solicitacao (ex.: "gere um REST similar ao que esta em src/fontes/FATA001.prw"). Nesse caso, Read e permitido somente no caminho exato fornecido pelo usuario — nunca expandido para uma varredura completa do projeto.
Fase de Planejamento (OBRIGATORIA)
- Analisar argumentos - Extrair tipo, nome e flags
- Pedir detalhes faltantes - Se nome ou modulo nao foram fornecidos, perguntar ao usuario. Para geracao TLPP (saida
.tlpp), tambem coleta o agrupador de namespace: se--module <agrupador>for fornecido, inferenamespace custom.<agrupador>.<servico>automaticamente; se--moduleestiver ausente, pergunta ao usuario explicitamente o agrupador antes de entrar em modo de planejamento. Nunca omite o namespace silenciosamente e nunca inventa um padrao. 2a. Validar tamanho do identificador (BLOQUEANTE) - Calculalen(name)e compara com o limite efetivo para a linguagem/construcao escolhida:User Functionem.prwdeve ter ≤ 8 chars,Static Functionem.prwdeve ter ≤ 10 chars, TLPP comnamespaceaceita ate 255 chars. Se o nome exceder o limite, NAO entra em modo de planejamento. Apresenta ao usuario duas opcoes explicitas e aguarda a escolha:- (A) Encurtar o nome — sugere 2-3 alternativas seguindo convencoes Protheus (prefixo de modulo + sequencia como
FATA100, abreviacao mnemonica, ou abreviacao funcional). Nunca oferece truncamentos aleatorios. - (B) Mudar para TLPP com namespace — explica que TLPP com namespace suporta ate 255 chars (disponivel a partir do release 12.1.2410 do Protheus). Pede o agrupador (
--module) se ausente. So prossegue para o proximo passo apos o usuario escolher (A) + nome encurtado, ou (B) + agrupador de namespace. Nunca gera codigo que dependa delongnameclasscomo workaround — TLPP com namespace e a alternativa moderna oficialmente suportada.
- (A) Encurtar o nome — sugere 2-3 alternativas seguindo convencoes Protheus (prefixo de modulo + sequencia como
- Pedir requisitos de negocio - O que o codigo deve fazer?
- Carregar skill - Invocar skill
advpl-code-generation - Carregar padroes - Ler arquivo de suporte apropriado para o tipo
- Pesquisar TDN para pontos de entrada - Se o tipo for
ponto-entrada, SEMPRE pesquisa o TDN (TOTVS Developer Network) pelo nome do ponto de entrada antes de gerar codigo. UsaWebSearchpara encontrar a pagina de documentacao oficial (ex.: pesquisar por"NOME_PONTO_ENTRADA site:tdn.totvs.com"). Extrai da pagina do TDN: parametros PARAMIXB (tipos, posicoes, descricoes), tipo e valor de retorno esperado, qual rotina padrao chama esse ponto de entrada e quaisquer ressalvas ou comportamentos especificos de versao. - Entrar em modo de planejamento - Usar
EnterPlanModepara criar um plano estruturado de implementacao - Apresentar plano - Mostrar ao usuario um plano claro incluindo:
- Arquivo(s) a serem criados (nome, caminho, extensao)
- Estrutura do codigo (funcoes, classes, metodos a implementar)
- Declaracao explicita da palavra-chave da funcao a ser usada para cada funcao no plano:
User Function(padrao para codigo chamavel pelo cliente),Static Function(helper interno), ouMethod ... Class(classe TLPP). Nunca planeja uma palavra-chaveFunctionpura para codigo de cliente — ela e reservada para o RPO core da TOTVS e nao compila em RPO de cliente. - Para cada arquivo
.tlpp, a declaracao exata denamespacea ser emitida, seguindo a convencaocustom.<agrupador>.<servico>(tudo em lowercase, com pontos como separadores, sem underscores). Mostra como uma linha literal (ex.:namespace custom.compras.purchase) derivada de--module+ o nome do servico/classe. Se--modulenao foi fornecido, isso deve ter sido resolvido no passo 2. - Resultado da verificacao de tamanho do identificador — confirma explicitamente no plano que cada nome de funcao/metodo cabe no limite efetivo da linguagem escolhida:
User Function≤ 8 chars (.prw),Static Function≤ 10 chars (.prw), TLPP comnamespace≤ 255 chars. Se o nome foi encurtado no passo 2a, tambem menciona o nome original para rastreabilidade (ex.:FATA100 (encurtado de ProcessaValidacaoItens)). - Includes e dependencias
- Padroes-chave a aplicar (MVC, REST, SOAP, etc.)
- Convencoes de nomenclatura a seguir (notacao hungara, prefixo do modulo)
- Tratamento de erros e padroes de operacao com banco de dados
- Para pontos de entrada: Documentacao do TDN encontrada (parametros PARAMIXB, tipo de retorno, rotina chamadora)
- Para endpoints REST (TLPP baseado em anotacoes): confirma que o plano usa
User Functioncom anotacoes@Get/@Post/@Put/@Patch/@Delete, seguindo o sample oficial TOTVStotvs/tlpp-sample-rest/rest-mod02.tlpp. A variante baseada em classe (rest-mod03.tlpp) tambem e suportada — usa quando multiplos metodos compartilham estado. Ambas as variantes exigem a declaracao denamespace.
- Aguardar aprovacao - O usuario deve aprovar o plano antes de qualquer codigo ser escrito. Se o usuario solicitar alteracoes, revisar o plano.
- Sair do modo de planejamento - Usar
ExitPlanModeapos aprovacao
Fase de Implementacao (somente apos aprovacao)
- Gerar codigo - Criar codigo completo, pronto para producao, seguindo o plano aprovado
- Gravar arquivo - Salvar com extensao correta (.prw ou .tlpp)
- Relatar - Mostrar o que foi criado e decisoes-chave
Exemplos
# Criar uma User Function para o modulo de faturamento
/advpl-specialist:generate function FATA050 --module FAT
# Criar uma classe de servico TLPP
/advpl-specialist:generate class PedidoService
# Criar CRUD MVC completo
/advpl-specialist:generate mvc CadProduto --module EST
# Criar um endpoint de API REST
/advpl-specialist:generate rest ClienteAPI --lang tlpp
# Criar um ponto de entrada
/advpl-specialist:generate ponto-entrada MT100LOK
# Criar um Web Service SOAP
/advpl-specialist:generate webservice WSPedido
# Criar um relatorio TReport
/advpl-specialist:generate treport RelProdutos --module EST
# Criar uma tela FWFormBrowse
/advpl-specialist:generate fwformbrowse CadFornecedores --module COM
# Criar um job de processamento em lote
/advpl-specialist:generate job JobProcessaNotas --module FAT
# Criar um workflow de aprovacao
/advpl-specialist:generate workflow AprovacaoPedido --module COMSaida
Um arquivo-fonte completo e compilavel salvo no diretorio do projeto com:
- Cabecalho de documentacao Protheus.doc
- Includes apropriados (
TOTVS.CHpara.prw,tlpp-core.th/tlpp-rest.thpara.tlpp) - Linha obrigatoria
namespace custom.<agrupador>.<servico>para cada arquivo.tlppgerado - Implementacao completa seguindo convencoes
- Tratamento de erros
- Save/restore de area para operacoes com banco de dados