Install
$ agentstack add skill-totvs-fluig-agent-skills-fluig-scaffolding-widget ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Scaffolding de Widget (SuperWidget)
Esta skill gera o esqueleto de um Widget WCM do Fluig; ela não duplica convenções — os arquivos de context/ são a fonte de verdade, referenciada abaixo.
Objetivo
Produzir, com responsabilidade única, o esqueleto de um Widget WCM do Fluig na estrutura oficial de pastas/arquivos: o descritor application.info, a view FreeMarker (view.ftl) com o elemento raiz correto, os arquivos .properties de i18n e o arquivo JavaScript com SuperWidget.extend, init() e bindings, já em conformidade com as convenções públicas e o Style Guide.
Quando Usar
- Ao criar um novo widget client-side do Fluig a partir do zero.
- Quando o desenvolvedor fornece um nome/propósito e quer um ponto de partida correto (view + JS) seguindo as convenções oficiais.
- Quando é preciso garantir, desde o início,
fluig-style-guidena raiz, uso correto deinstanceIde bindings declarativos.
Entradas Esperadas
| Entrada | Descrição | Obrigatória | |---------|-----------|-------------| | Nome do widget | Identificador em Inglês (PascalCase) usado na classe e no id (ex.: Notifications) | sim | | Propósito | O que o widget faz (orienta init, bindings e textos i18n) | não | | Chaves i18n | Chaves de tradução para os textos visíveis | não |
Contexto de Referência (Fonte de Verdade)
Leia antes de executar — não reproduza o conteúdo aqui:
- [conventions.md](../../context/conventions.md) — convenções de Widget (
fluig-style-guide,instanceId,.instance(), bindings local/global), i18n, segurança, CSS escopado e ES6+. Inclui também as convenções de Custom Elements (arquivos[name].[category].js, membros privados#, topo do módulo só comimport, CSS escopado/agrupado por tag e variáveis CSS para números mágicos), aplicáveis quando o widget incorpora Web Components. - [style-guide.md](../../context/style-guide.md) — componentes/helpers (
FLUIGC), grid e variáveis CSS de tema (var(--fs-color-*)) para o markup e o estilo do widget. - [architecture.md](../../context/architecture.md) — modelo conceitual do Widget, seu ciclo de vida (
init(),.instance(), bindings) e a estrutura oficial de pastas/arquivos do widget (descritorapplication.info,view.ftl,.propertiesde i18n, JS/CSS).
Estrutura de Saída
O widget gerado segue a estrutura oficial (fonte de verdade em architecture.md). O descritor application.info é obrigatório — sem ele a plataforma não reconhece o widget. Use `` como o código do widget (minúsculo).
/
├── pom.xml # quando o projeto usa Maven ou sob pedido
└── src/main/
├── resources/
│ ├── application.info # descritor (application.type=widget)
│ ├── .properties # i18n base (chaves de getTranslation)
│ ├── _pt_BR.properties # i18n pt-BR
│ ├── _en_US.properties # i18n en-US
│ ├── _es.properties # i18n es
│ ├── view.ftl # view principal (elemento raiz)
│ └── edit.ftl # view de edição (pode ser vazia, mas é obrigatória)
└── webapp/
├── WEB-INF/{web.xml, jboss-web.xml}
└── resources/
├── css/.css # CSS escopado (opcional)
├── images/icon.png # ícone
└── js/.js # SuperWidget.extend
> A view.ftl e a edit.ftl ficam em src/main/resources/; o .js e o > .css em src/main/webapp/resources/. O pom.xml só é gerado quando o > projeto usa Maven ou sob pedido. Ponto de partida público: archetype Maven > widget-wcm. > > Em um projeto Fluig Studio, o widget fica em wcm/widget/ (ver a > seção "Estrutura de um Projeto Fluig Studio" em architecture.md).
pom.xml (quando o projeto usa Maven ou sob pedido)
Quando for necessário gerar o pom.xml, use a estrutura abaixo como ponto de partida — ajustando groupId/artifactId/version/name/description ao artefato. O empacotamento é war e o finalName usa ${project.artifactId}. A referência canônica completa está em architecture.md.
4.0.0
com.fluig
1.0.0
widget-
war
Widget
Widget
${project.artifactId}
> Dentro de um projeto existente, inspecione o pom.xml do módulo pai para obter > as coordenadas reais (parent groupId/artifactId); nunca invente > coordenadas.
Regras Aplicáveis (Resumo Executivo)
Somente o mínimo para orientar a geração; o detalhe está no contexto:
application.codedeve ser igual alocale.file.base.name— divergência quebra a i18n (regra crítica) → verarchitecture.md.- Elemento raiz deve conter as 3 classes obrigatórias fixas:
fluig-style-guide,super-widgetewcm-widget-class, além da classe específica do widget → verconventions.md. instanceIdsó em atributosid, com exatamente um_como separador; nadivraiz, a parte antes do_em camelCase com inicial minúscula (ex.:id="myWidget_${instanceId}"); nunca mais de um_na div raiz (a SuperWidget faz split por ele); proibido emdata-*eclass→ verconventions.md..instance()chamado seminstanceId(injetado pelo framework; no JS usethis.instanceId) → verconventions.md.- Bindings declarativos: chave sem o prefixo
data-;localpara elementos dentro da raiz,globalpara elementos fora (modais) → verconventions.md. - Texto visível via i18n; nunca strings fixas nem acesso a
i18ncomo objeto JS → verconventions.md. - Variável raiz da SuperWidget declarada com
var(ex.:var MyWidget = SuperWidget.extend({...})); o restante do JS em ES6+ (const/let, arrow functions, template literals) → verconventions.md. - Minimizar CSS próprio; priorizar os componentes do Style Guide; CSS próprio só sob pedido explícito → ver
style-guide.md/conventions.md. - CSS escopado à raiz, reutilizando o Style Guide; cores de tema via
var(--fs-color-*), sem hexadecimais fixos → verstyle-guide.md. - Consulta a datasets no cliente: quando o widget consulta datasets no lado cliente (via
DatasetFactory), a view FreeMarker onde a consulta ocorre (view.ftle/ouedit.ftl) deve obrigatoriamente importar a bibliotecavcXMLRPC.js, exatamente com `(caminho e atributos inalterados). É uma **exceção** à regra de não importar scripts diretos no.ftl; inclua-o **apenas** quando houver consulta a datasets no cliente → verconventions.md`.
Política de fallback
- Faltando nome ou propósito essencial para gerar (nome do widget): solicitar antes de gerar.
- Coordenadas Maven (parent
groupId/artifactIddopom.xml): quando dentro de um projeto existente, inspecionar opom.xmldo módulo onde o widget será criado; nunca inventar coordenadas. icon.png: gerar um placeholder e registrar como pendência manual.- Traduções
en_US/esausentes: usar o texto PT como base e marcar# TODO i18npor chave, sem deixar de criar os 4 arquivos. - Dados do desenvolvedor (
developer.*): usar placeholders genéricos; não assumir identificadores de terceiros. - CSS próprio sem pedido explícito: o padrão é reutilizar o Style Guide; se houver CSS próprio sem solicitação do desenvolvedor, registrar como pendência a revisar.
Procedimento
- Definir o nome do widget (PascalCase) a partir da entrada e derivar a classe, o
idraiz e o `` (minúsculo) usado nos arquivos. - Criar a estrutura de pastas oficial (ver "Estrutura de Saída") e o descritor
application.infocom os campos completos:application.type=widget,application.renderer=freemarker,view.file=view.ftl,edit.file=edit.ftl,application.version=${build.version}-${build.revision}, os recursos CSS/JS e os dados do desenvolvedor (ver a tabela completa emarchitecture.md). - Criar a view de edição
edit.ftl(emsrc/main/resources/, irmã daview.ftl); pode ser vazia, mas é obrigatória e referenciada poredit.file=edit.ftl. - Criar a view
view.ftl(emsrc/main/resources/) com um elemento raiz contendoclass="fluig-style-guide super-widget wcm-widget-class ...",id="_${instanceId}"(camelCase com inicial minúscula, exatamente um_) edata-params=".instance({})". As 3 classes obrigatórias fixas são:fluig-style-guide,super-widgetewcm-widget-class; a classe específica do widget é adicionada a seguir.5. Marcar os elementos interativos com atributosdata-*(ex.:data-save) cujas chaves serão usadas nos bindings (sem o prefixodata-). - Criar os arquivos
.propertiesde i18n (base +pt_BR/en_US/es) com as chaves usadas e aplicar i18n em todo texto visível via${i18n.getTranslation('chave')}.
6a. Se o widget consultar datasets no cliente (via DatasetFactory), incluir na view onde a consulta ocorre (view.ftl e/ou edit.ftl) a importação obrigatória `, exatamente nessa forma (ver conventions.md`). Não incluir se o widget não consulta datasets.
- Criar o arquivo JS (
webapp/resources/js/.js) comvar = SuperWidget.extend({ ... })(a variável raiz usavar— exceção controlada; verconventions.md), declarandoinit()(preparar estado, carregar dados, vincular comportamento) ebindings: { local: { ... }, global: { ... } }. - Implementar os métodos referenciados pelos bindings; dentro do JS, usar
this.instanceIdquando necessário. - Adicionar CSS escopado (
webapp/resources/css/.css) à classe raiz apenas se necessário (CSS próprio é exceção sob pedido explícito), reutilizando componentes/grid do Style Guide e variáveisvar(--fs-color-*)para cores de tema. - Quando o projeto usa Maven ou sob pedido, gerar o
pom.xml, inspecionando as coordenadas Maven no projeto existente (nunca inventar coordenadas do parent). - Validar o resultado com o checklist abaixo antes de entregar.
Saída Esperada
Esqueleto de widget pronto para evoluir, na estrutura oficial, contendo:
- O descritor
application.info(application.type=widget) declarando view, recursos e i18n. - A view
view.ftlcom elemento raizfluig-style-guide,idcominstanceIdedata-paramsparainstance(). - Os arquivos
.propertiesde i18n (base + locales) com as chaves de tradução. - O arquivo JavaScript do widget com
SuperWidget.extend,init(),bindingse métodos correspondentes, em ES6+. - (Opcional) CSS escopado reutilizando o Style Guide e os arquivos de empacotamento (
pom.xml,WEB-INF).
Tudo em conformidade com context/architecture.md, context/conventions.md e context/style-guide.md.
Exemplo de Uso
Use examples/widget/ como referência mínima (view .ftl + arquivo *.widget.js) que demonstra o elemento raiz fluig-style-guide, instance() sem instanceId, bindings e i18n. Trate-o como trecho de referência, não como projeto completo.
Checklist de Validação
- [ ] Estrutura oficial criada, com o descritor
application.infocom os campos completos (application.type=widget,view.file=view.ftl,edit.file=edit.ftl,application.version=${build.version}-${build.revision}, recursos CSS/JS,developer.*— verarchitecture.md). - [ ]
application.codeigual alocale.file.base.name. - [ ] Presença da
edit.ftl(irmã daview.ftl, pode ser vazia) e do campoedit.file=edit.ftlno descritor. - [ ] Arquivos
.propertiesde i18n (base +pt_BR/en_US/es) com as mesmas chaves usadas na view/JS. - [ ] Presença da pasta
WEB-INF(comweb.xml+jboss-web.xml) econtext-root=/→ verarchitecture.md. - [ ]
pom.xmlpresente quando o projeto usa Maven ou sob pedido (coordenadas inspecionadas, nunca inventadas). - [ ] Elemento raiz da view contém as 3 classes obrigatórias fixas:
fluig-style-guide,super-widgetewcm-widget-class, além da classe específica do widget. - [ ]
idda div raiz usa camelCase com inicial minúscula + exatamente um_(ex.:myWidget_${instanceId}). Nunca mais de um_na div raiz. Demaisids internos seguem o padrão do artefato. - [ ]
.instance()é chamado seminstanceId. - [ ] Se o widget consulta datasets no cliente (via
DatasetFactory), a view onde a consulta ocorre (view.ftl/edit.ftl) importa exatamente ``; se não consulta datasets, o script não está presente. - [ ] Bindings usam a chave sem o prefixo
data-(escopo local/global correto). - [ ] Todo texto visível usa i18n — sem strings fixas.
- [ ] JavaScript em ES6+ (
const/let, arrow functions, template literals), exceto a variável raiz da SuperWidget (declarada comvar). - [ ] CSS próprio mínimo (componentes do Style Guide como padrão; CSS próprio sem pedido explícito = pendência a revisar) e, quando houver, escopado à raiz, sem hexadecimais fixos (cores via
var(--fs-color-*)).
Resumo da Geração
Ao concluir, apresente um resumo curto do que foi gerado, para o desenvolvedor saber o estado e os próximos passos:
- Widget /
application.code: nome e código. - Diretório: onde o widget foi criado.
- Arquivos gerados: lista.
- Pendências manuais: ex.:
icon.pngreal, coordenadas dopom.xmlpai, traduçõesen_US/esmarcadas com TODO, CSS próprio gerado sem pedido explícito (a revisar). - Próximo passo: implementar a lógica em
.js(ver as convenções emconventions.md).
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: totvs
- Source: totvs/fluig-agent-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.