xperiun/pbi-doc
Documenta projeto Power BI (PBIP) inteiro em markdown estruturado + HTML navegável (mini-site de doc). Use quando o usuário pedir "documenta esse projeto", "gera doc do power bi", "explica esse modelo", "preciso entregar handoff", ou apontar uma pasta PBIP pra mapeamento descritivo (não auditoria).
npx skills add https://github.com/xperiun/claude-code-powerbi-skills --skill pbi-doc
> 📦 Distribuída publicamente: github.com/xperiun/claude-code-powerbi-skills — pasta claude-code/pbi-doc/ (skill nativa) + claude-web/pbi-doc.zip (upload no Claude.ai). Mudança aqui exige sincronizar lá: atualizar pasta + regenerar ZIP (Python zipfile, ver CLAUDE.md) + commit + bump CHANGELOG. Repo é open-source, leiame público — evitar referências internas (Xperiun-only) na SKILL.md.
Gera documentação completa de um projeto Power BI (formato PBIP) em duas formas:
A doc descreve o que existe no modelo — tabelas, colunas tipadas, medidas com DAX explicadas em PT, relacionamentos com cardinalidade, grafo de dependências entre medidas. Não opina sobre qualidade (essa é função da /pbi-modelo-review).
.pbix de N tabelas e M medidas e precisa entender rápidoNão usar quando:
/pbi-modelo-review/pbi-dax-create/pbi-export-medidas).SemanticModel/ e .Report/. Se o usuário só tem .pbix, instruir conversão antes:Power BI Desktop → File → Save as → Power BI Project (.pbip).tmdl (via filesystem ou upload — ver "Modos de execução" abaixo)Se faltar PBIP, retornar mensagem curta:
> Esse projeto ainda está em .pbix (binário). Pra eu documentar, salva como Power BI Project: File → Save as → Power BI Project (.pbip). Vira uma pasta de texto e aí eu consigo ler. Avisa quando converter.
E encerrar — não tentar nada.
A skill detecta automaticamente o ambiente e adapta input/output:
.SemanticModel/.tmdl de ./SemanticModel/./_docs/index.html + 5 markdowns (00-overview.md a 04-dependencias.md) na raiz do projeto Power BI> Pra eu documentar, anexe nesse chat:
> - Os arquivos .tmdl da pasta SemanticModel/definition/ (model.tmdl, relationships.tmdl, expressions.tmdl se houver)
> - Os arquivos da pasta SemanticModel/definition/tables/ (1 .tmdl por tabela, excluindo as auto-date LocalDateTable_* e DateTableTemplate_*)
>
> Pode arrastar individualmente ou zipar a pasta SemanticModel/ e subir 1 ZIP.
Verificar se a pasta .SemanticModel/ é acessível via filesystem:
Se ambíguo, perguntar uma vez:
> Você tá rodando isso no Claude Code (CLI/IDE com acesso à pasta) ou no claude.ai (web)? Pra Code eu leio a pasta sozinho; pra web preciso que você suba os arquivos.
| Aspecto | Code | Web |
|---|---|---|
| Setup | 1× (instala skill) | 0 (só sobe arquivo) |
| Por uso | comando único | anexar TMDL toda vez |
| Modelo grande (>200 medidas) | OK | pode estourar contexto Free |
| Persistência | salva em disco | só na conversa (baixar artifact) |
| Custo | tokens Claude Code | tokens claude.ai (Free incluído) |
tudo)tudo → todos os 5 arquivossó medidas → só 02-medidas.md (útil pra checar mudanças após refator)só tabelas → só 01-tabelas.mdsó relacionamentos → só 03-relacionamentos.mdtabela X → restringe descrição às tabelas específicas (separadas por vírgula)Se não especificado, perguntar uma vez:
> Documento o projeto inteiro (5 arquivos) ou prefere algo específico — só medidas, só relacionamentos, ou tabelas específicas?
.SemanticModel/.tmdl em ./SemanticModel/tables/ (excluir LocalDateTable_* e DateTableTemplate_* — são auto-geradas, não fazem parte da doc)model.tmdl, relationships.tmdl, expressions.tmdl (se existir).tmdl de tabelasLer templates em templates/ e preencher com dados reais. Salvar em ./_docs/ na raiz do projeto Power BI:
| Arquivo | Conteúdo |
|---|---|
| _docs/00-overview.md | Sumário (N tabelas, N medidas, N relacionamentos, fontes, propósito inferido) |
| _docs/01-tabelas.md | Cada tabela: descrição, granularidade, colunas tipadas, source M (resumo) |
| _docs/02-medidas.md | Agrupadas por displayFolder. Cada uma: nome, DAX, explicação PT linha-a-linha |
| _docs/03-relacionamentos.md | Lista detalhada + diagrama em ASCII art (matriz simples) |
| _docs/04-dependencias.md | Grafo: árvore "medida X → usa Y → usa Z" + lista reverse "Y é usada por: A, B, C" |
🚨 REGRA INVIOLÁVEL — usar templates/relatorio.html LITERAL:
templates/relatorio.html — esse arquivo já tem todo o CSS, todo o HTML estrutural, todos os tokens DS v4 (Bebas Neue, accent-gold, gold-grid + beams animados, orb-v2 elipses blue/purple, riscas section+section::before, brackets), todo o JS de scroll spy/busca. CSS são ~600 linhas inline + HTML completo com gold-grid, sidebar, topbar, sections.{{...}} pelos valores reais derivados dos .tmdl. Lista completa dos placeholders está em references/escopo.md desta skill (seção "Placeholders do templates/relatorio.html"). Todos os blocos {{...}}_HTML são gerados pelo Claude com base no inventário do modelo.--accent-gold-bright #E8C9A0, --accent-glow #7099FF, --neon-magenta #C47FFF, etc.)<div class="gold-grid">, os <div class="section-orb">, ou qualquer ornamento decorativo do template<!-- ... --> — comentários são instruções pra você, não conteúdo a substituir. Mantém como tá.<style>...</style> ou <script>...</script> — CSS e JS ficam intocados.ã, ç, é, á, õ, ê, í, ú) e símbolos especiais (├, └, ─, →, ↔, ↑, ↓, ⚠, ·, —) devem aparecer como caracteres reais UTF-8, NÃO como sequências escapadas/HTML entities/mojibake.dependências, └─, →, Incomparáveisdependências, âââ, â, Incomparáveisdependênciasã, â, é), o parser HTML pode quebrar e o resto da página renderiza como texto cru. Refaz garantindo UTF-8../_docs/index.html (modo Code) ou retornar como artifact (modo Web).#0D0C0E quase preto · gold-grid de papel pautado dourado animado caindo · orbs azul/roxo em cada seção · risca dourada entre seções · cards var(--gradient-surface) com border --border-faint · números em Bebas Neue gold · DAX com syntax highlight via spans .k .f .s .c. Estilo "editorial premium dark" — não dashboard genérico tipo Vercel/Stripe.#f5a623 (laranja) ou #7c6af7 (roxo genérico), ou fonte 'Segoe UI' → ignorou o template, refaz.ã ou â → encoding quebrado, refaz com UTF-8 puro.Mensagem curta:
_docs/index.html pra ver navegável"[raiz do projeto Power BI do usuário]/
├── SemanticModel/ ← input (não tocar)
├── Report/ ← input (não tocar)
└── _docs/ ← OUTPUT da skill
├── 00-overview.md
├── 01-tabelas.md
├── 02-medidas.md
├── 03-relacionamentos.md
├── 04-dependencias.md
└── index.html ← versão visual standalone
| Cenário | O que fazer |
|---|---|
| Sem .SemanticModel/ | Mensagem de pré-requisito (PBIP), encerra |
| Pasta _docs/ já existe | Sobrescrever (idempotente) — avisar no chat |
| Modelo gigante (>200 medidas) | Avisar tempo + processar em chunks |
| Tabelas auto-date (LocalDateTable_*, DateTableTemplate_*) | Excluir da doc — são tabelas-fantasma, não fazem parte do modelo intencional |
| Medida com DAX muito complexo (>30 linhas) | Mostrar DAX completo + explicar em blocos (se / agg / contexto) |
| Modelo sem nenhuma descrição declarada | Inferir propósito a partir de naming + estrutura, mas sinalizar "descrição inferida (não há description: declarado)" |
Estilo Xperiun:
Exemplos de bom vs ruim:
❌ Ruim: "A medida 'Faturamento' calcula o resultado da multiplicação entre QtdItens e PrecoUnitario."
✅ Bom: "Faturamento — multiplica quantidade × preço linha-a-linha em fVendas e soma o total. É a medida-mãe: várias outras (Margem Bruta, %YoY, etc) dependem dela."
_docs/.SemanticModel/ ou .Report/ — somente leituraHTML tem footer fixo:
Branding sempre Xperiun.
Avisar se >5min esperados.
v0.1 — protótipo interno Xperiun OS. Quando estabilizar, vira pacote no repo público xperiun/claude-code-powerbi-skills (lead magnet).
Take xperiun/pbi-doc from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.