Rise — Extensão VS Code
Gerador de estrutura, highlight EJS, snippets, linter e testes Playwright para o padrão Rise v8 (Fastify)
Crie módulos completos com view isolada por módulo, promova components/partials para global O que é o RiseRise é um padrão arquitetural para aplicações MPA (Multi-Page Application) construídas com Node.js + Fastify + EJS. A arquitetura organiza o projeto em camadas bem definidas (Shell, Page, Component, Partial) e estabelece convenções explícitas de nomenclatura, encapsulamento e separação de responsabilidades. A extensão é o braço operacional da plataforma: ela transforma as convenções arquiteturais em código concreto, eliminando trabalho manual repetitivo e garantindo conformidade automática com o padrão.
✨ O que a Extensão Faz
📦 InstalaçãoVia VSIX (recomendado)
Via MarketplacePesquise por "Rise" no painel de extensões do VS Code ( Requisitos
🚀 Primeiros Passos1. Inicializar um projeto do zero
2. Instalar dependências e rodar
3. Criar o primeiro módulo
Passo 1 — Nome do módulo:
Passo 2 — Pages a criar (multi-select):
Passo 3 — Components a criar (multi-select):
Passo 4 — Adicionar ao menu lateral:
Resultado gerado:
🧩 Comandos CompletosTodos os comandos estão disponíveis via
🤖 Uso por Agentes de IA (CLI headless)Os comandos acima rodam dentro do VS Code (Command Palette, prompts interativos). Para automações, scripts e assistentes de IA que operam via terminal (Bash/PowerShell) — sem UI de editor —, a extensão também expõe um CLI headless: O CLI não é uma reimplementação: ele chama exatamente a mesma lógica de geração, validação, formatação e teste E2E usada pelos comandos da extensão (
Todo comando aceita Para descobrir comandos e flags disponíveis sem ler o código-fonte:
🗂️ Arquitetura Shell · Page · Component · Partial
Regras de cada camada
Derivação automática de convenções
🔒 Isolamento entre MódulosA regra central da v8: dado o nome de qualquer artefato, sua localização é derivável por uma única pergunta — "é usado por mais de um módulo?". Se sim, mora em
A regra 🎨 Highlight EJSA extensão registra o EJS como linguagem própria com uma grammar TextMate completa. Não é necessária nenhuma configuração adicional.
Antes da extensão:
Depois da extensão:
O autoclose está configurado: ao digitar ✅ Validador e Code ActionsO validador analisa arquivos Rise ao abrir e ao salvar, exibindo diagnósticos diretamente no editor.
Code Actions — Correções com um clique (💡)
🔍 Hover e Go to DefinitionHover (passe o mouse)Em
Em
Go to Definition (
|
| Contexto | Comportamento |
|---|---|
include('./components/modals/detail/index.ejs') |
Abre o arquivo incluído |
include('./partials/_page-header.ejs') |
Abre o partial |
window.Rise.Modals.Detail |
Abre o script.js na linha da API pública |
window.Rise.Sidebars.UserNew |
Localiza e abre o script.js da sidebar |
🧪 Gerador de Teste E2E
Com qualquer index.ejs de component ou page aberto:
Ctrl+Shift+P → Rise: Gerar Teste E2E 🧪
A extensão extrai automaticamente do template:
- IDs de elementos →
page.locator('#id') data-attributes→page.locator('[data-*]')- Classes
.rise-*→page.locator('.rise-*') - Campos de formulário →
page.fill('[name="campo"]', ...) - Namespace
window.Rise→ chamadas diretas no teste
Testes gerados por tipo:
| Tipo | Casos de teste gerados |
|---|---|
| Modal | Oculto por padrão, open(), close(), ESC, clique no backdrop |
| Sidebar | Oculto por padrão, open(), close(), ESC, botão de fechar |
| Page | Renderização, submit de formulário, clique em item de lista |
| Component | Presença no DOM com seletores comentados |
O arquivo é salvo em tests/e2e/ espelhando o caminho do artefato e aberto automaticamente no editor.
📦 SpecForge — Importar arquivo .spec
O SpecForge é a ferramenta de especificação do ecossistema Rise. Ele exporta arquivos .spec (ZIPs renomeados) contendo .claude/skills/, .specs/changes/ e docs/.
Ctrl+Shift+P → Rise: Inicializar Projeto → 📦 Importar arquivo .spec
O file picker filtra apenas arquivos .spec. Após a extração, o .spec é deletado automaticamente — nenhum rastro fica no projeto.
Estrutura extraída:
projeto/
├── .claude/skills/ ← Skills de arquitetura para o agente AI
├── .specs/
│ ├── changes/ ← Changes prontos para execução
│ └── executar_todas.md ← Cole no Claude para iniciar
└── docs/ ← Documentação do projeto
🧪 Gerar Teste Playwright
Botão direito na pasta do componente → Rise: Gerar Teste Playwright
A extensão lê o script.js, extrai os métodos da API pública e gera um .spec.ts completo em tests/e2e/components/[categoria]/[nome].spec.ts.
Exemplo — dado este script.js:
window.Rise.Modals.Detalhe = {
open: open,
close: close,
reload: reload,
};
Gera automaticamente:
- Teste de renderização do elemento raiz (
#rise-modal-detalhe) - Teste de registro do namespace
window.Rise.Modals.Detalhe - Um teste para cada método:
open(),close(),reload()
Com módulo de domínio (para evitar conflito entre módulos):
User → window.Rise.User.Modals.Detalhe
Pedidos → window.Rise.Pedidos.Modals.Detalhe
Para rodar os testes:
npm run dev # servidor deve estar rodando
npm run test:e2e # headless
npm run test:e2e:ui # modo visual
npm run test:e2e:headed # browser visível
O playwright.config.ts é gerado com baseURL lida automaticamente do .env (sem configuração manual).
🔒 Linter Embutido
O projeto gerado inclui plugins de linting que rodam ao salvar, exibindo erros no painel Problems com sublinhados no código.
ESLint — Regras Rise
| Regra | O que detecta | Severidade |
|---|---|---|
rise/iife |
script.js sem IIFE ou sem 'use strict' |
🔴 Erro |
rise/namespace |
Namespace errado, guard ausente, window.X fora do window.Rise |
🔴 Erro |
rise/cross-module |
include() em .ejs que escapa da view/ do próprio módulo (Seção 14) |
🔴 Erro em view/partials/** · ⚠️ Aviso em view/{pages,components}/** |
rise/cross-module roda sobre .ejs, que não é JavaScript — o eslint.config.js gerado registra um parser "no-op" (tools/eslint-plugin-rise/ejs-noop-parser.js) só para os blocos de files que apontam pra .ejs, evitando que o espree padrão quebre na sintaxe <% %>. A regra em si lê o texto bruto do arquivo e aplica a mesma lógica (e a mesma resolução de caminho) do diagnóstico ao vivo do validador — dois pontos de aplicação, uma única fonte de verdade sobre o que conta como violação.
Stylelint — Regras Rise
| Regra | O que detecta | Severidade |
|---|---|---|
rise/css-prefix |
Classe CSS sem o prefixo .rise-[categoria]-[nome] |
🔴 Erro |
npm run lint # ESLint nos script.js e .ejs de módulos
npm run lint:css # Stylelint nos style.css de componentes
Os plugins ficam em tools/eslint-plugin-rise/ e tools/stylelint-plugin-rise/ — embutidos no projeto gerado, sem dependência externa própria (eslint/stylelint em si são devDependencies normais do package.json gerado, como jest/playwright).
📝 Snippets EJS
Digite o prefixo em qualquer arquivo .ejs e pressione Tab.
| Prefixo | O que gera |
|---|---|
rise-shell |
Shell HTML completo com head, body, CSS/JS globais e include(pageComponent) |
rise-page |
Page com include de style.css e script.js, div com prefixo |
rise-component |
Component encapsulado com role e aria-label |
rise-modal |
Modal completo: backdrop, container, header, body, footer |
rise-sidebar |
Sidebar/offcanvas: backdrop, panel, header, body, botão de fechar |
rise-include |
<%- include('caminho', { chave: valor }) %> com placeholders |
rise-partial |
<%- include('partials/_nome', { dados }) %> |
rise-each |
<% items.forEach(function(item) { %> ... <% }); %> |
rise-if |
<% if (condition) { %> ... <% } else { %> ... <% } %> |
rise-local |
<% if (locals.variavel) { %> ... <% } %> |
rise-flash |
Bloco completo de flash messages (success, error, info) |
rise-empty |
Condicional de empty state com include do partial |
rise-pagination |
Include do partial de paginação com currentPage e totalPages |
📝 Snippets JavaScript
Digite o prefixo em qualquer arquivo .js e pressione Tab.
| Prefixo | O que gera |
|---|---|
rise-iife |
IIFE base com window.Rise, getElementById, funções privadas e API pública |
rise-iife-modal |
IIFE completa de modal: open(data), close(), ESC, backdrop, CustomEvents |
rise-iife-sidebar |
IIFE completa de sidebar: open(), close(), ESC, botões |
rise-iife-page |
IIFE base de page com window.Rise.Pages.[Nome] e refresh() |
rise-dispatch |
document.dispatchEvent(new CustomEvent('comp:acao', { detail })) |
rise-listen |
document.addEventListener('comp:acao', function(e) { }) |
rise-service |
Método async com try/catch e retorno { kind, status, body } |
rise-ok |
return { kind: 'json', status: 200, body: { data } } |
rise-err |
return { kind, status: 4xx/5xx, body: { erro } } com seleção de status |
rise-controller |
Handler SSR Fastify com verificação de out.status, flash e reply.render() |
rise-api |
Handler JSON Fastify com reply.status(out.status).send(out.body) |
rise-plugin |
Two-Plugin Factory completo: viewPlugin + apiPlugin + guard hook |
rise-repo |
Método de Repository com Sequelize findAll, where e order |
rise-migration |
Migration Umzug com up/down e seleção de operação SQL |
rise-migration-table |
Migration createTable completa com id, coluna, timestamps |
rise-migration-col |
Migration addColumn com tipo, allowNull, defaultValue |
rise-fetch-modal |
fetch() + window.Rise.Modals.[Nome].open() com tratamento de erro |
rise-e2e |
Teste E2E Playwright base com beforeAll, afterAll e it() |
rise-e2e-modal |
Teste E2E completo de modal com casos reais |
📊 Rise Explorer
Um painel dedicado na Activity Bar do VS Code com mapa visual do projeto.
RISE EXPLORER
├── 🌐 Globais (src/views/)
│ ├── 📄 Pages
│ │ └── home
│ ├── 🧩 Components
│ │ ├── menus/left ← sempre global
│ │ └── modals/detail → .rise-modal-detail (promovido — usado por 2+ módulos)
│ └── 🧱 Partials
│ ├── _page-header.ejs
│ ├── _empty-state.ejs
│ ├── _pagination.ejs
│ └── _alert-flash.ejs
│
└── 📦 Módulos
├── auth
│ └── 📄 Pages › login → index.ejs · style.css · script.js (clicáveis)
└── operators
├── 📄 Pages
│ ├── list → .rise-page-operators-list
│ └── detail → .rise-page-operators-detail
├── 🧩 Components
│ └── sidebars/new → .rise-sidebar-new 🌐 Promover para Global
└── 🧱 Partials
Um artefato nunca aparece nas duas seções ao mesmo tempo: local a um módulo (sob 📦 Módulos) ou global (sob 🌐 Globais), nunca ambos. Só módulos com pasta view/ aparecem em 📦 Módulos — um módulo puramente de backend (sem nenhuma page/component/partial) não gera um nó vazio. O botão contextual 🌐 Promover para Global aparece só em component/partial local — nunca em page (que nunca é promovida) e nunca em algo já global. O painel atualiza automaticamente ao salvar, criar ou deletar arquivos. O botão ✨ no header abre o Wizard diretamente.
🏗️ Casos de Uso
| Tipo de projeto | Como a extensão ajuda |
|---|---|
| Sistema administrativo | Wizard gera cada módulo CRUD em < 1 min; guard por role pronto para usar |
| Portal SSR corporativo | Shell único, partials reutilizáveis, Rise Explorer para navegação |
| E-commerce | Módulos independentes por domínio; modal de detalhe e sidebar de filtro prontos |
| API Enterprise | Two-Plugin Factory separa rotas SSR e JSON no mesmo módulo |
| Sistema governamental | requireRole() por feature; ARIA completo nos components gerados |
| SaaS multi-tenant | Chaves rise_local/dev/hmg/prd geradas por ambiente |
⚙️ Configurações
| Configuração | Valores | Padrão |
|---|---|---|
rise.framework |
fastify | express |
fastify |
📋 Changelog
v1.0.0 — Lançamento · Arquitetura Rise v8
- ✅ View local ao módulo —
Novo Módulo/Nova Page/Novo Componente/Novo Partialpassam a gerar emsrc/modules/[mod]/view/{pages,components,partials}/, não mais direto emsrc/views/;src/views/fica reservado ao que é global (Shell, e o que já foi promovido) - ✅
view.plugin.jscom includer — resolvemodules/...eviews/...a partir desrc/, mantendo.//../file-relative como já era no EJS; nenhum projeto v7 existente quebra, já que o comportamento antigo continua sendo o fallback - ✅ Promover para Global 🌐 — novo comando/botão contextual no Rise Explorer: move um component/partial local para
src/views/na primeira vez que um segundo módulo precisa dele, reescrevendo oinclude()de todo consumidor automaticamente - ✅ Isolamento entre módulos (Seção 14) — novo diagnóstico do validador e nova regra ESLint
rise/cross-module: uminclude()que escapa daview/do próprio módulo é sinalizado (erro em partial, aviso em component/page); ver 🔒 Isolamento entre Módulos - ✅
rise-cli migrate— migra um projeto v7 existente módulo a módulo (ou--all --confirm), com--dry-runcomo padrão e rollback delegado ao git (recusa--applyfora de um repo git ou com working tree sujo) - ✅ Rise Explorer reagrupado — raiz agora separa "🌐 Globais" de "📦 Módulos"; cada módulo com pasta
view/ganha suas próprias seções de Pages/Components/Partials - ✅ Hover / Go to Definition / Gerar Teste E2E — passam a localizar
script.js/component tanto emsrc/views/(global) quanto em cadasrc/modules/[mod]/view/(local), priorizando o global quando o mesmo nome existir nos dois lugares - ✅
npm run lintcobre.ejsde módulo — antes só varriascript.js; sem isso a regrarise/cross-modulenunca seria de fato executada vianpm run lint(o ESLint só analisa o que recebe na CLI, ofilesde um bloco do config filtra dentro disso, não expande a varredura)
v0.8.0
- ✅ CLI headless (
bin/rise-cli.js) — os comandos de geração/validação/formatação/teste E2E passam a ser chamáveis via terminal (Bash/PowerShell), sem depender da UI do VS Code; pensado para uso por agentes de IA e scripts. Ver 🤖 Uso por Agentes de IA - ✅ Comandos
formategenerate-e2eno CLI — formatação de.ejs(com--checkpara uso em CI) e geração de esqueleto de teste E2E Playwright, ambos agora disponíveis fora do editor - ✅
src/core/— lógica de geração (generators.js), validação (validator.js), formatação (formatter.js) e geração de teste E2E (e2e-generator.js) extraída para módulos puros, sem dependência devscode; extensão e CLI agora consomem a mesma implementação - ✅ Testes com renderização real de EJS —
test/unit/ejs-render.test.jscompila todo.ejsgerado com o motorejsde verdade, fechando uma lacuna que antes só validava conteúdo gerado como string
v0.7.0
- ✅ Novo Módulo Completo aprimorado — wizard agora pergunta se o módulo deve ser adicionado ao menu lateral
- ✅ Menu lateral automático — cria ou atualiza
src/views/components/menus/left/index.ejscom label e rota do módulo - ✅ Detalhe como page — fluxo completo prioriza
detailcomo página, não como modal gerado automaticamente - ✅ Sidebars integradas às pages — pages criadas recebem botões simples para abrir os sidebars selecionados
- ✅ Títulos nos artefatos gerados — pages e sidebars nascem com títulos visíveis e consistentes
- ✅ Correções de bugs e refinamentos de fluxo — ajustes no wizard para reduzir passos manuais após criar um módulo
v0.6.0
- ✅ Gerar Teste Playwright — botão direito na pasta do componente gera
.spec.tscom testes por método - ✅ Importar arquivo .spec — integração com SpecForge no comando Inicializar Projeto
- ✅ Playwright configurado —
playwright.config.tsgerado combaseURLlida do.env - ✅ Scripts npm E2E —
test:e2e,test:e2e:ui,test:e2e:headedadicionados - ✅ Linter CSS embutido — Stylelint com regra
rise/css-prefix - ✅ Linter JS embutido — ESLint com regras
rise/namespaceerise/iife - ✅ Namespace com módulo de domínio — suporte a
window.Rise.User.Modals.Detalhe - ✅ SQL injection corrigido —
Repository.jsvalidatableNameno construtor - ✅ Umzug + Sequelize + sqlite3 — adicionados ao
package.jsongerado - ✅
write()com aviso — alerta quando arquivo já existe em vez de ignorar silenciosamente
v0.5.0
- ✅ EJS Formatter —
Shift+Alt+Fformata.ejspreservando tags EJS intactas - ✅ Code Actions (💡) — correções automáticas para todos os diagnósticos
- ✅ Gerador de Teste E2E — Playwright gerado a partir do template
.ejs - ✅ Hover com documentação — assinatura de components e
window.Rise.* - ✅ Go to Definition —
Ctrl+Clickeminclude()ewindow.Rise.* - ✅ Novos snippets:
rise-e2e,rise-e2e-modal
v0.4.0
- ✅ Rise Explorer — painel lateral com mapa visual arquitetural
- ✅ Wizard de módulo completo — fluxo guiado com seleção de pages e components
- ✅ Snippets de migration:
rise-migration,rise-migration-table,rise-migration-col - ✅ Novo comando:
Rise: Novo Partial
v0.3.0
- ✅ Validador em tempo real —
DiagnosticCollectioncom regras de conformidade - ✅ Highlight EJS — grammar TextMate própria para
.ejs - ✅ Novo comando:
Rise: Validar Arquivo
v0.2.0
- ✅ Estrutura atualizada para Rise v7.0 (Fastify)
- ✅ Inicializar Projeto gera auth JWT completo com módulo, model, migration e seeder
- ✅ Chaves de ambiente geradas dinamicamente:
rise_local_*,rise_dev_*,rise_hmg_*,rise_prd_* - ✅ 14 snippets EJS e 17 snippets JS
- ✅ Plugin factory, controllers, services, repositories e domain gerados
- ✅ Novo comando:
Rise: Novo Partial
v0.1.0
- ✅ Comandos básicos:
Inicializar Projeto,Novo Módulo,Novo Componente,Nova Page - ✅ Geração de Plugin Factory, Controller, Service, Repository, Domain
- ✅ Suporte a Express
🔗 Recursos
Feito com ♥ por Eduardo de Freitas Arantes