From addon-studio
Sankhya Addon Studio 2.0 (Wildfly/EJB + JAPE SDK) — overview do projeto, convenção de nomenclatura `<PRX><MOD3><CTX>`, regras universais (Java 8 strict, Lombok, ISO-8859-1, Guice DI, MapStruct, JapeRepository) e fluxo de feature CRUD. **Use sempre que o `build.gradle` ou `build.gradle.kts` do projeto aplicar o plugin Gradle `br.com.sankhya.addonstudio`** (fingerprint do SDK Sankhya — este plugin Claude Code é a fonte de verdade do projeto). Também use no início do projeto, ao definir naming convention, ao receber spec/MVP de cadastro/feature/módulo, ao planejar implementação end-to-end (CRUD, listagem, lançamento, integração com app mobile), ou ao precisar das regras universais Java 8/encoding/logging. NÃO usar para tarefas de tópico específico — invoque a skill focada (entity, repository, controller, etc.).
How this skill is triggered — by the user, by Claude, or both
Slash command
/addon-studio:addon-studioThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Skill orienta projetos **Sankhya Addon Studio 2.0** (Wildfly/EJB + SDK Java JAPE). Foco: stack, regras universais, convenção de nomenclatura, fluxo CRUD. **Sem opinião arquitetural** — pacotes, camadas, design = decisão dev/projeto.
Skill orienta projetos Sankhya Addon Studio 2.0 (Wildfly/EJB + SDK Java JAPE). Foco: stack, regras universais, convenção de nomenclatura, fluxo CRUD. Sem opinião arquitetural — pacotes, camadas, design = decisão dev/projeto.
Para tópicos específicos (entidades, controllers, repositories, jobs, etc.), invoque a skill focada correspondente — ver "Skills do plugin" abaixo.
Marca registrada: build.gradle ou build.gradle.kts aplica o plugin Gradle do SDK Sankhya.
// build.gradle (Groovy DSL)
apply plugin: "br.com.sankhya.addonstudio"
// build.gradle.kts (Kotlin DSL)
plugins {
id("br.com.sankhya.addonstudio")
}
Se o projeto aplica esse plugin, este plugin Claude Code (addon-studio) é a fonte de verdade — siga as skills daqui. Antes de gerar/alterar código:
<PRX><MOD3><CTX>), volte neste overview.Conflito entre convenção do projeto e skill: prevalece a skill (a não ser que o projeto declare regra explícita em
CLAUDE.mdouAGENTS.mdna raiz).
CLAUDE.md/AGENTS.md para projeto consumidorPlugin entrega um template pronto pra colar na raiz do projeto Sankhya. Localização canônica (dentro dos assets/ desta própria skill, convenção Agent Skills):
<plugin-root>/skills/addon-studio/assets/CLAUDE.md
Paths esperados em ambiente real:
~/.claude/plugins/cache/snk-devcenter/addon-studio/plugins/addon-studio/skills/addon-studio/assets/CLAUDE.md~/.codex/marketplaces/addon-studio/plugins/addon-studio/skills/addon-studio/assets/CLAUDE.mdSe o usuário pedir "configurar CLAUDE.md", "setup do projeto" ou similar, copie esse template para a raiz do projeto (não regenere o conteúdo do zero — use a fonte canônica):
cp <plugin-root>/skills/addon-studio/assets/CLAUDE.md ./CLAUDE.md
# Opcional — symlink AGENTS.md -> CLAUDE.md (compatibilidade Codex CLI).
# Use `ln -sf` para ser idempotente caso AGENTS.md já exista.
ln -sf CLAUDE.md AGENTS.md
| Item | Versão / Detalhe |
|---|---|
| Linguagem | Java 8 estrito |
| Container | Wildfly + EJB |
| DI | Google Guice (com.google.inject.Inject) |
| Persistência | JAPE (SDK Sankhya) via @JapeEntity + JapeRepository |
| ORM | JAPE (NÃO usar JPA padrão javax.persistence.@Entity) |
| Logging | java.util.logging via @Log Lombok |
| Boilerplate | Lombok (@Data, @Builder, @AllArgsConstructor, etc.) |
| Mapeamento | MapStruct 1.5.5+ (componentModel=jakarta global) |
| HTTP externo | Retrofit + Moshi via RetrofitCallExecutor (SDK) |
| Validação | Bean Validation (javax.validation.*) + @Valid |
| Testes | JUnit 5 + Mockito 4.11 (5.x exige Java 11+) |
| Build | Gradle (gradle deployAddon) |
NÃO use APIs pós-Java 8:
var (use tipagem explícita)List.of(...), Map.of(...), Set.of(...) (use Arrays.asList, Collections.unmodifiableMap)String.isBlank() (use s == null || s.trim().isEmpty())Files.readString(...) (use Files.readAllBytes + new String(...))Optional.ifPresentOrElse(...), Optional.or(...), Optional.stream()Stream.toList() (use .collect(Collectors.toList()))@Data em entidades, DTOs, VOs@NoArgsConstructor + @AllArgsConstructor em entidades JAPE (framework precisa)@Builder quando construção programática fizer sentido@Log para acesso a java.util.logging.Logger como log@Getter, @Setter, @AllArgsConstructor em enums com value@Log Lombok + java.util.logging.org.slf4j.*). Nunca System.out.println.INFO, WARNING, SEVERE.@Log
public class Exemplo {
public void executar() {
log.log(Level.INFO, "Iniciando processo");
try {
// ...
} catch (Exception e) {
log.log(Level.SEVERE, "Falha ao executar: " + e.getMessage(), e);
}
}
}
@Inject via construtor. Nunca em campo (exceção: mappers MapStruct abstract class com repository — ver skill mapstruct).@Inject de com.google.inject.Inject. Nunca javax.inject.Inject.private final.new para criar dependência gerenciada.| Contexto | Tipo Java |
|---|---|
PK de tabelas do addon (COD*/NU* própria) | Integer |
| PK de tabelas nativas Sankhya (NUNOTA, CODPARC, etc.) | BigDecimal |
| Valores monetários, quantidades | BigDecimal |
Flags S/N (mapeadas com dataType="CHECKBOX") | Boolean |
| Datas com hora | Timestamp (java.sql.Timestamp) |
RuntimeException cru.RuntimeException.public class IntegrationApiException extends RuntimeException {
public IntegrationApiException(String message, Throwable cause) {
super(message, cause);
}
}
Tratamento centralizado em controllers — ver skill controller-advice.
| Anti-pattern | Correção |
|---|---|
Usar var | Tipagem explícita sempre |
Usar JPA padrão (javax.persistence.@Entity, @Table) | Usar @JapeEntity (SDK Sankhya) |
| Implementação manual de Repository | Usar interface estendendo JapeRepository<ID, Entity> |
Usar JapeWrapper ou EntityFacade direto em controllers | Sempre via Repository / JapeRepository |
Mapper escrito a mão (new Dto(); dto.setX(...)) | Usar MapStruct |
HttpClient nativo / URLConnection para integração externa | Usar Retrofit + RetrofitCallExecutor |
Logger SLF4J ou System.out | @Log Lombok + java.util.logging |
new para instanciar dependência gerenciada | @Inject via construtor |
| Metadata UI (description, dataType, order) em entidade Java | Vai no XML do dicionário de dados |
@Inject de javax.inject | Usar com.google.inject.Inject |
throw new RuntimeException(...) cru | Exceção tipada |
| Improvisar com convenções de Spring Boot, Quarkus, Micronaut | Seguir as skills do plugin (@JapeEntity, @Controller serviceName SP, Guice, etc.) |
Em <treeTable>, raiz com CODIGOPAI = NULL ou GRAU = 0 | Sentinela CODIGOPAI = -999999999 e GRAU = 1 (ver skill data-dictionary → tree-table.md) |
APIs Java 11+ (var, List.of, String.isBlank, records, etc.) | Equivalentes Java 8 — ver "Restrições Java 8" acima |
Aplica a tabelas/entities do addon. Padrão parametrizado por dois tokens — <PRX> (prefixo) + <MOD3> (módulo) — definidos pelo projeto:
| Artefato | Padrão | Exemplo (PRX=TDC, MOD3=XYZ) |
|---|---|---|
| Tabela do addon | <PRX><MOD3><CTX> UPPER | TDCXYZCAB |
@JapeEntity(entity = "...") | <Prx><Mod><Ctx> Pascal | TdcXyzCabecalho |
| Coluna custom em tabela nativa Sankhya | <MOD3>_NOMECAMPO UPPER | XYZ_STATUS |
<PRX> / <Prx> = prefixo fixo do projeto (ex.: TDC, APP, CST — UPPER 3-4 chars).<MOD3> / <Mod> = sigla 3 chars do módulo (ex.: XYZ, FIN, FAT).<CTX> / <Ctx> = contexto/entidade da tabela (ex.: CAB/Cabecalho, ITE/Item, CFG/Configuracao).Antes de criar tabela/entity nova:
@JapeEntity(table = "...") em arquivos .java, <table name="..."> em datadictionary/*.xml, ou CREATE TABLE em dbscripts/*.xml. Se houver padrão consistente (ex.: todas tabelas começam com TDC), reusar.<PRX>) usar para tabelas custom deste projeto? Ex.: TDC, APP, CST."<MOD3>) representa este módulo? Ex.: XYZ, FIN, FAT."<PRX><MOD3><CTX>.<PRX> + <MOD3> + <CTX> + nome final <PRX><MOD3><CTX>.DHALTER, DHCREATE, CODUSU): perguntar se inclui.datadictionary/<TABELA>.xml (skill data-dictionary).dbscripts/V<NNN>-CREATE_TABLE_<TABELA>.xml (skill database).@JapeEntity Java (skill entity).JapeRepository (skill repository).@Component, organização a critério projeto — skill dependency-injection).@Controller(serviceName = "...SP") (skill controller).mapstruct).test).gradle deployAddon (skill build).Delegação obrigatória aos sub-agents (Claude Code only): o trigger de delegação é a natureza do artefato a entregar, não o formato da solicitação do usuário (que pode vir como spec, ticket, frase solta, "implementa isso", "ajusta aquilo", etc.). Sempre que a tarefa envolver criar ou alterar um dos artefatos abaixo, delegue ao sub-agent especialista — não implemente inline:
- Tabela ou entidade (XML do dicionário, dbscript, classe
@JapeEntity— trio CRUD) →entity-architect- Arquivo isolado em
dbscripts/(ALTER, seed, índice) →dbscript-builder- Endpoint REST (
@Controller, DTOs, mapper) →controller-designer- Testes JUnit + Mockito →
test-writer- Erro / stacktrace / build falhando →
troubleshooter- Revisão antes de commit →
addon-reviewerSub-agents rodam em modelos otimizados (
sonnet/haiku), economizam tokens do agente principal e mantêm o contexto principal limpo. Implementar inline sem delegar é anti-pattern em projetos Sankhya Addon Studio.
Para tópicos específicos, invoke skill direta:
entity — entidades @JapeEntityrepository — @Repository / JapeRepositorycontroller — @Controller RESTcontroller-advice — @ControllerAdvice / @ExceptionHandlerdata-dictionary — XML dicionário de dadosdatabase — dbscripts/V<NNN>-*.xmldependency-injection — Guice DImapstruct — MapStruct mapperstest — JUnit + Mockitoaction-button — @ActionButtonbusiness-rule — @BusinessRulejob — @Jobtype-adapter — @GlobalTypeAdaptervalue — @Value / ValueTypemacros — MacroTranslator SQL macrosencoding — ISO-8859-1build — gradle deployAddonentity — primeiro artefato de uma feature CRUDdata-dictionary — XML metadata da tabeladatabase — dbscript de migrationcontroller — endpoint REST que consome a featureencoding — regra crítica de Latin-1 aplicada em todo arquivo .java/.xml/.ktProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub snk-devcenter/addon-studio --plugin addon-studio