sagadeck 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +305 -0
- package/SKILL.md +148 -0
- package/bin/sagadeck.js +511 -0
- package/docs/ANDAMENTO.md +1255 -0
- package/docs/EXPERIENCIAS.md +39 -0
- package/docs/PLANO-EXPERIENCIAS.md +39 -0
- package/docs/PLANO-TESTE-AULAS-TECNICAS.md +44 -0
- package/docs/PLANO-TESTE-DESINFORMACAO.md +38 -0
- package/docs/REFERENCIA.md +1131 -0
- package/package.json +59 -0
- package/src/adaptive-layouts.js +18 -0
- package/src/ai/art-direction.js +8 -0
- package/src/ai/commands.js +130 -0
- package/src/ai/context.js +245 -0
- package/src/ai/deck-ai.js +1135 -0
- package/src/ai/directions.js +74 -0
- package/src/ai/document-materials.js +49 -0
- package/src/ai/document-visuals.js +215 -0
- package/src/ai/evaluation.js +31 -0
- package/src/ai/ground.js +55 -0
- package/src/ai/llm.js +292 -0
- package/src/ai/quality.js +51 -0
- package/src/ai/relay.js +45 -0
- package/src/ai/staged-generation.js +24 -0
- package/src/ai/transform.js +858 -0
- package/src/ai/usage.js +17 -0
- package/src/ai/variety.js +80 -0
- package/src/ai/video-frames.js +24 -0
- package/src/ai/video-generation.js +126 -0
- package/src/ai/web-operation.js +31 -0
- package/src/algo-catalog.js +153 -0
- package/src/algo-trace.js +139 -0
- package/src/api-client.js +514 -0
- package/src/api-collections.js +14 -0
- package/src/api-demo.js +222 -0
- package/src/aspect.js +40 -0
- package/src/build.js +323 -0
- package/src/carousel.js +56 -0
- package/src/chrome.js +65 -0
- package/src/code-highlight.js +68 -0
- package/src/code-lab-browser.js +22 -0
- package/src/code-lab.js +3 -0
- package/src/code-language.js +52 -0
- package/src/csv.js +74 -0
- package/src/decision-lab.js +20 -0
- package/src/deck-file.js +119 -0
- package/src/diagram/napkin-examples.js +13 -0
- package/src/diagram/napkin.js +539 -0
- package/src/docx.js +128 -0
- package/src/dynamics/git-sim.js +200 -0
- package/src/dynamics/layouts.js +112 -0
- package/src/elements.js +554 -0
- package/src/experiences.js +124 -0
- package/src/exploration.js +31 -0
- package/src/export/browser.js +53 -0
- package/src/export/estudo.js +67 -0
- package/src/export/pptx.js +475 -0
- package/src/export/roteiro.js +40 -0
- package/src/export/shots.js +182 -0
- package/src/figures/charts.js +383 -0
- package/src/figures/diagrams.js +117 -0
- package/src/figures/icons.js +166 -0
- package/src/figures/material-pictos.js +20 -0
- package/src/figures/pictos.js +255 -0
- package/src/figures/points.js +106 -0
- package/src/figures/qr.js +29 -0
- package/src/figures/ufmap.js +48 -0
- package/src/fiscal/autofix.js +377 -0
- package/src/fiscal/normalize.js +115 -0
- package/src/graph-lab.js +24 -0
- package/src/hologram.js +30 -0
- package/src/identity.js +86 -0
- package/src/import/crop.js +59 -0
- package/src/import/index.js +132 -0
- package/src/import/legacy-word.js +42 -0
- package/src/import/merge.js +45 -0
- package/src/import/office.js +123 -0
- package/src/import/omml.js +69 -0
- package/src/import/pdf-render.js +56 -0
- package/src/import/pptx.js +701 -0
- package/src/import/xml.js +42 -0
- package/src/infographic.js +401 -0
- package/src/layouts.js +723 -0
- package/src/lessons.js +171 -0
- package/src/library.js +399 -0
- package/src/markup.js +116 -0
- package/src/master.js +214 -0
- package/src/mcp/server.js +371 -0
- package/src/meeting.js +42 -0
- package/src/motion.js +56 -0
- package/src/package.js +116 -0
- package/src/playground.js +19 -0
- package/src/portal-scene.js +20 -0
- package/src/preferences.js +61 -0
- package/src/protect.js +51 -0
- package/src/purpose.js +24 -0
- package/src/pytrace.js +1092 -0
- package/src/research/duckduckgo.js +73 -0
- package/src/research/research.js +202 -0
- package/src/research/svg-image.js +17 -0
- package/src/research/visuals.js +52 -0
- package/src/runtime/api-collection-ui.js +5 -0
- package/src/runtime/api-collections.js +28 -0
- package/src/runtime/api-core.js +530 -0
- package/src/runtime/api-ui.js +966 -0
- package/src/runtime/base.css +1774 -0
- package/src/runtime/calc.js +139 -0
- package/src/runtime/code-lab.js +371 -0
- package/src/runtime/decision-lab.js +49 -0
- package/src/runtime/diagram.js +341 -0
- package/src/runtime/fit.js +268 -0
- package/src/runtime/fonts/caveat.css +2 -0
- package/src/runtime/fonts/comic-neue.css +3 -0
- package/src/runtime/fonts/fredoka.css +2 -0
- package/src/runtime/fonts/index.json +10 -0
- package/src/runtime/fonts/inter.css +2 -0
- package/src/runtime/fonts/patrick-hand.css +2 -0
- package/src/runtime/fonts/plus-jakarta-sans.css +2 -0
- package/src/runtime/fonts/press-start-2p.css +2 -0
- package/src/runtime/fonts/vt323.css +2 -0
- package/src/runtime/formula.js +148 -0
- package/src/runtime/graph-lab.js +72 -0
- package/src/runtime/meeting.css +7 -0
- package/src/runtime/meeting.js +10 -0
- package/src/runtime/motion.js +15 -0
- package/src/runtime/playground.js +11 -0
- package/src/runtime/points.js +19 -0
- package/src/runtime/portal-scene.css +6 -0
- package/src/runtime/portal-scene.js +22 -0
- package/src/runtime/runtime.js +827 -0
- package/src/runtime/science.js +89 -0
- package/src/runtime/skins/aluminio.css +31 -0
- package/src/runtime/skins/arcade.css +25 -0
- package/src/runtime/skins/aurora.css +17 -0
- package/src/runtime/skins/bauhaus.css +19 -0
- package/src/runtime/skins/editorial.css +19 -0
- package/src/runtime/skins/jornal.css +17 -0
- package/src/runtime/skins/manual-noite.css +14 -0
- package/src/runtime/skins/manual.css +14 -0
- package/src/runtime/skins/noite.css +21 -0
- package/src/runtime/skins/oceano.css +17 -0
- package/src/runtime/skins/pop.css +23 -0
- package/src/runtime/skins/prata.css +18 -0
- package/src/runtime/skins/prisma.css +28 -0
- package/src/runtime/skins/rabisco.css +18 -0
- package/src/runtime/skins/relevo.css +33 -0
- package/src/runtime/skins/sinal.css +16 -0
- package/src/runtime/skins/terminal.css +23 -0
- package/src/runtime/vendor/KATEX-LICENSE.txt +21 -0
- package/src/runtime/vendor/MERMAID-LICENSE.txt +21 -0
- package/src/runtime/vendor/PLOTLY-LICENSE.txt +21 -0
- package/src/runtime/vendor/katex.css +1 -0
- package/src/runtime/vendor/mermaid.min.js +3636 -0
- package/src/runtime/vendor/plotly.min.js +3620 -0
- package/src/runtime/video-player.js +35 -0
- package/src/science.js +162 -0
- package/src/studio/ai-response.js +36 -0
- package/src/studio/api-routes.js +152 -0
- package/src/studio/assets/contexto/leia-me.md +12 -0
- package/src/studio/assets/contexto/vendas.csv +7 -0
- package/src/studio/assets/imagens/colecao-arquitetura.png +0 -0
- package/src/studio/assets/imagens/colecao-cor.png +0 -0
- package/src/studio/assets/imagens/colecao-equipe.png +0 -0
- package/src/studio/assets/imagens/lavanda-cover.jpg +0 -0
- package/src/studio/code-routes.js +32 -0
- package/src/studio/command-approval.js +48 -0
- package/src/studio/demo-decks.js +98 -0
- package/src/studio/direction-routes.js +29 -0
- package/src/studio/errors.js +65 -0
- package/src/studio/exploration-demo.js +17 -0
- package/src/studio/exporting.js +105 -0
- package/src/studio/generation-report.js +10 -0
- package/src/studio/instance.js +48 -0
- package/src/studio/layout-samples.js +152 -0
- package/src/studio/project.js +371 -0
- package/src/studio/public/api-collections.js +28 -0
- package/src/studio/public/app.js +5265 -0
- package/src/studio/public/art-preview.js +10 -0
- package/src/studio/public/calc-fields.js +11 -0
- package/src/studio/public/chat-progress.js +47 -0
- package/src/studio/public/developer-fields.js +22 -0
- package/src/studio/public/explorer.js +443 -0
- package/src/studio/public/history.js +58 -0
- package/src/studio/public/index.html +867 -0
- package/src/studio/public/inspector.js +270 -0
- package/src/studio/public/lab-fields.js +5 -0
- package/src/studio/public/library.css +275 -0
- package/src/studio/public/library.html +55 -0
- package/src/studio/public/library.js +471 -0
- package/src/studio/public/merge-decks.js +155 -0
- package/src/studio/public/review-ui.js +100 -0
- package/src/studio/public/screenshot-editor.js +140 -0
- package/src/studio/public/share-ui.js +72 -0
- package/src/studio/public/slide-clipboard.js +23 -0
- package/src/studio/public/slide-form.js +1263 -0
- package/src/studio/public/studio-awareness.js +154 -0
- package/src/studio/public/studio-next.css +303 -0
- package/src/studio/public/style.css +1262 -0
- package/src/studio/public/ui-icons.js +2 -0
- package/src/studio/public/viewers.js +372 -0
- package/src/studio/public/visual-editor.js +326 -0
- package/src/studio/public/workspace.js +18 -0
- package/src/studio/public-files.js +1 -0
- package/src/studio/request-helpers.js +41 -0
- package/src/studio/server.js +1583 -0
- package/src/studio/share-routes.js +146 -0
- package/src/studio/slide-copy-routes.js +26 -0
- package/src/studio/slide-copy.js +30 -0
- package/src/studio/snapshot.js +160 -0
- package/src/studio/style-routes.js +103 -0
- package/src/studio/template-collections.js +97 -0
- package/src/studio/versions.js +95 -0
- package/src/studio/video-download.js +29 -0
- package/src/studio/visual-keys.js +52 -0
- package/src/studio/workspaces.js +39 -0
- package/src/table.js +93 -0
- package/src/templates/scaffold.js +372 -0
- package/src/themes.js +604 -0
- package/src/trace-view.js +450 -0
- package/src/uid.js +19 -0
- package/src/video-player.js +40 -0
- package/src/visual-edits.js +99 -0
- package/src/ws.js +134 -0
- package/templates/cenario/Texto no cen/303/241rio.yaml" +171 -0
- package/templates/cenario/imagens/cidade.svg +30 -0
- package/templates/cenario/imagens/pessoa.svg +15 -0
- package/templates/cenario-e-ciencia.yaml +47 -0
- package/templates/ensaio-api.yaml +160 -0
- package/templates/exemplo-alegre.yaml +75 -0
- package/templates/exemplo-keynote.yaml +90 -0
- package/templates/exemplo-napkin.yaml +139 -0
- package/templates/exemplo.yaml +228 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Narumi Abe
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# Saga · sagadeck — gerador de apresentações
|
|
2
|
+
|
|
3
|
+
Você (ou uma IA) escreve um arquivo `.yaml` com o conteúdo. O sagadeck gera:
|
|
4
|
+
|
|
5
|
+
| saída | pra quê |
|
|
6
|
+
|---|---|
|
|
7
|
+
| **`.html`** | a apresentação "de verdade": animada, com cliques, enquetes, timers, jogos, modo apresentador. Um arquivo só, funciona offline, abre com duplo clique. |
|
|
8
|
+
| **`.pptx`** | PowerPoint **editável** e fiel ao HTML: texto em caixas nativas com as mesmas fontes, formas nativas, figuras em PNG nítido, animações de clique e transições, notas do apresentador (ou sem elas, para mandar a alguém). |
|
|
9
|
+
| **`.pdf`** | um slide por página, para mandar depois da palestra |
|
|
10
|
+
| **`- roteiro.pdf`** | roteiro do apresentador: miniatura de cada slide + fala + interações + relógio planejado |
|
|
11
|
+
|
|
12
|
+
Ele vem com 11 temas (incluindo estilo Keynote Apple em prata clean e respirável, artesanal desenhado à mão, azul elétrico vivo e pop alegre), 23 layouts (incluindo KPIs e fluxos de processo), 2.100+ ícones, pictogramas e cenas geradas na hora, diagramas, 7 tipos de gráfico, e um **fiscal automático** que detecta texto estourado, sobreposição, contraste baixo e slides com texto demais ("anti-sono").
|
|
13
|
+
|
|
14
|
+
## Instalação
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install sagadeck
|
|
18
|
+
```
|
|
19
|
+
Requer **Node.js 18+** e **Chrome ou Edge** instalados (o motor é JavaScript e vem empacotado no pacote Python).
|
|
20
|
+
|
|
21
|
+
## Como usar
|
|
22
|
+
|
|
23
|
+
Toda apresentação mora na **biblioteca**: `SAGADECK_HOME`, ou `~/sagadeck` (no Windows, `C:Users<você>sagadeck`). Uma pasta por tópico, uma por apresentação.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
sagadeck new "Minha palestra" --topic=Palestras --theme=editorial
|
|
27
|
+
```
|
|
28
|
+
```bash
|
|
29
|
+
sagadeck all "~/sagadeck/Palestras/Minha palestra/Minha palestra.yaml"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Comandos:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
sagadeck new <nome> [--topic=T] [--theme=x] cria um deck de exemplo na biblioteca
|
|
36
|
+
sagadeck studio [deck.yaml] [--port=3517] sem arquivo: a biblioteca; com arquivo: o editor com chat IA (já aberto: usa o aberto)
|
|
37
|
+
sagadeck ensaio-api [--port=3000] exemplo de slides de API rodando contra uma API de mentira
|
|
38
|
+
sagadeck autofix <deck.yaml> [--out=pasta] auto-corrige sobreposições, margens e excesso de texto no YAML
|
|
39
|
+
sagadeck build <deck.yaml> gera o .html
|
|
40
|
+
sagadeck watch <deck.yaml> recompila o .html a cada vez que você salva o YAML
|
|
41
|
+
sagadeck check <deck.yaml> fiscal: estouro de texto, sobreposição, contraste, excesso de texto
|
|
42
|
+
sagadeck shots <deck.yaml> [--steps] PNG de cada slide + folhas de contato (para revisar)
|
|
43
|
+
sagadeck pptx <deck.yaml> [--native-charts] [--sem-notas] PowerPoint editável (--sem-notas: para mandar sem a sua cola)
|
|
44
|
+
sagadeck pdf <deck.yaml> PDF
|
|
45
|
+
sagadeck roteiro <deck.yaml> roteiro do apresentador em PDF
|
|
46
|
+
sagadeck all <deck.yaml> tudo acima
|
|
47
|
+
sagadeck mcp servidor MCP para IDEs agênticos (Cursor, Claude Code, Cline)
|
|
48
|
+
sagadeck themes vitrine com os 6 temas
|
|
49
|
+
sagadeck icons [filtro] lista os ícones (ex.: sagadeck icons car)
|
|
50
|
+
sagadeck ref referência completa do YAML
|
|
51
|
+
sagadeck skill instruções para agentes de IA
|
|
52
|
+
```
|
|
53
|
+
Opção `--out=pasta` muda onde os arquivos são salvos.
|
|
54
|
+
|
|
55
|
+
## Com agentes de IA e IDEs Agênticos
|
|
56
|
+
|
|
57
|
+
O sagadeck foi projetado para ser usado por humanos e por agentes de IA:
|
|
58
|
+
|
|
59
|
+
1. **Pelo Terminal / Skill**: O agente lê as instruções (`sagadeck skill`, também em [`SKILL.md`](SKILL.md)), a referência (`sagadeck ref`), escreve o YAML e roda `autofix` → `check` → `all`. Para Claude Code, basta copiar `SKILL.md` para `~/.claude/skills/sagadeck/SKILL.md`.
|
|
60
|
+
2. **Pelo Estúdio Visual**: Execute `sagadeck studio palestra.yaml` para abrir a interface web estilo PowerPoint, onde você pode editar visualmente no canvas 16:9 e conversar com a IA no chat lateral. A IA se auto-corrige e nunca deixa elementos sobrepostos ou fora das margens.
|
|
61
|
+
3. **Pelo Protocolo MCP**: Execute `sagadeck mcp` para que IDEs agênticos (Cursor, Windsurf, Cline, Roo Code) descubram e invoquem diretamente as ferramentas de criação, leitura, fiscalização e auto-cura de apresentações.
|
|
62
|
+
|
|
63
|
+
Se o código de uma ferramenta em Python quiser chamar o sagadeck diretamente (sem montar comandos de terminal), há uma API mínima:
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
import sagadeck
|
|
67
|
+
sagadeck.autofix("palestra.yaml") # corrige sobreposições e margens automaticamente
|
|
68
|
+
sagadeck.studio() # abre a biblioteca (~/sagadeck)
|
|
69
|
+
sagadeck.studio("palestra.yaml", port=3517) # abre direto o editor de um deck
|
|
70
|
+
sagadeck.export("palestra.yaml", out="saida") # {'html': …, 'pptx': …, 'pdf': …, 'roteiro': …}
|
|
71
|
+
print(sagadeck.check("palestra.yaml")) # relatório do fiscal em texto
|
|
72
|
+
contexto = sagadeck.reference() # referência do YAML para colocar no prompt
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## IA de verdade (LLM)
|
|
76
|
+
|
|
77
|
+
O chat lateral do Studio, o Napkin (texto → slide), o **"✨ Deck com IA"** e a geração de imagens usam um LLM quando há um disponível; sem LLM, o chat e o Napkin continuam funcionando com as regras locais.
|
|
78
|
+
|
|
79
|
+
O sagadeck fala com qualquer endpoint compatível com OpenAI (`/v1/chat/completions`). O caminho recomendado é o [modelrelay](https://github.com/naruminho/modelrelay), que decide pela configuração dele para onde as chamadas vão (OpenRouter, OpenAI, gateway corporativo), sem nada disso no sagadeck:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pip install "sagadeck[ia]" # o sagadeck com o modelrelay na versão que ele exige
|
|
83
|
+
# ou só o modelrelay: pip install -U modelrelay
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Com um modelrelay mais velho do que o exigido, o sagadeck avisa ao abrir e mostra o comando para atualizar.
|
|
87
|
+
Quem desenvolve o modelrelay e o instalou direto do clone (`pip install -e .` na pasta dele, a "instalação
|
|
88
|
+
editável": o Python lê o código da pasta, sem cópia) atualiza só com `git pull` ali, e o aviso diz isso, com a
|
|
89
|
+
pasta. `pip install -e .` de novo só quando o modelrelay ganhar uma dependência nova.
|
|
90
|
+
|
|
91
|
+
O jeito mais fácil de configurar é pela tela: abra `sagadeck studio` e clique em **modelrelay** no alto da
|
|
92
|
+
biblioteca (ou abra http://127.0.0.1:8765/ com um `modelrelay serve` rodando). Lá você escolhe o provedor
|
|
93
|
+
(OpenRouter, OpenAI, Google, DeepSeek, o gateway da empresa…), cola a chave, testa e diz qual modelo faz
|
|
94
|
+
**texto** e qual faz **imagem**. A tela grava o `~/.modelrelay/config.toml`, que também dá para editar à mão
|
|
95
|
+
(`modelrelay init` cria um modelo comentado). O botão só aparece quando o modelrelay roda nesta máquina; no
|
|
96
|
+
modo multiusuário, quem configura é o admin.
|
|
97
|
+
|
|
98
|
+
À mão, no `~/.modelrelay/config.toml`, os apelidos que o sagadeck usa são:
|
|
99
|
+
|
|
100
|
+
```toml
|
|
101
|
+
[models]
|
|
102
|
+
"text" = "google/gemini-2.5-flash" # chat, Napkin e geração de deck
|
|
103
|
+
"image" = "google/gemini-2.5-flash-image" # imagens
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
O sagadeck se identifica para o modelrelay (cabeçalho `X-Modelrelay-App: sagadeck`), então dá para usar
|
|
107
|
+
modelos diferentes só nele, sem afetar outros apps que usam o mesmo modelrelay:
|
|
108
|
+
|
|
109
|
+
```toml
|
|
110
|
+
[apps.sagadeck.models] # só o que muda para o sagadeck; o resto vem de [models]
|
|
111
|
+
"text" = "deepseek/deepseek-v4-flash"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Confira com `modelrelay show --app sagadeck`. Detalhes na seção *Per-app models* do README do modelrelay.
|
|
115
|
+
|
|
116
|
+
**Modelo sem visão** (ex.: DeepSeek V4 Flash): o assistente manda uma foto do slide e as imagens que você cola.
|
|
117
|
+
Se o modelo recusar imagem, o sagadeck refaz o pedido sem as imagens, avisa na resposta ("não enxerga imagens")
|
|
118
|
+
e não insiste nesse modelo até reiniciar. Tudo funciona, só que a IA não vê o slide renderizado.
|
|
119
|
+
|
|
120
|
+
Pronto: com o modelrelay instalado no mesmo Python, `sagadeck studio`, `new`, `napkin` e `imagens` sobem um `modelrelay serve` sozinhos enquanto rodam. Rodando o motor Node direto (`node bin/sagadeck.js`), deixe um `modelrelay serve` aberto em outro terminal.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
sagadeck new palestra --prompt "Palestra de 15 min para gerentes sobre IA com segurança. Ilustre onde fizer sentido." --slides=10
|
|
124
|
+
sagadeck napkin "1) cliente abre chamado 2) triagem por IA 3) analista revisa" # --rules força as regras
|
|
125
|
+
sagadeck imagens palestra.yaml # gera as imagens pedidas com image_prompt: no YAML
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
| variável | padrão | |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| `SAGADECK_LLM_URL` | `http://127.0.0.1:8765/v1` | qualquer API compatível com OpenAI (ex.: `https://openrouter.ai/api/v1`) |
|
|
131
|
+
| `SAGADECK_LLM_KEY` | — | bearer token, se apontar direto para um provedor |
|
|
132
|
+
| `SAGADECK_TEXT_MODEL` / `SAGADECK_IMAGE_MODEL` | `text` / `image` | nomes dos modelos |
|
|
133
|
+
| `SAGADECK_LLM_TIMEOUT` | `180` | segundos por chamada |
|
|
134
|
+
| `SAGADECK_NO_RELAY` | — | `1` impede o pacote Python de subir o modelrelay |
|
|
135
|
+
| `SAGADECK_APP` | `sagadeck` | nome com que o sagadeck se identifica ao modelrelay (`[apps.<nome>.models]`) |
|
|
136
|
+
|
|
137
|
+
**Imagens geradas: você pede no texto**, no chat, no briefing do "Deck com IA" ou no `--prompt`; não há caixa para marcar.
|
|
138
|
+
"Com fotos em todos os slides" ilustra todos; "você decide onde ilustrar" deixa a IA escolher só os slides em que uma imagem
|
|
139
|
+
ajuda (capa, abertura, um momento marcante) e usar ícones, gráficos e diagramas no resto; sem falar de imagens, ela não gera
|
|
140
|
+
nenhuma (gerar custa) e, quando uma foto ajudaria muito, oferece. Na linha de comando, `--images` equivale a "você decide onde
|
|
141
|
+
ilustrar" e `--no-images` proíbe. Imagens só são geradas para os slides que a IA acabou de criar ou alterar.
|
|
142
|
+
|
|
143
|
+
Todo YAML vindo do LLM é validado (renderiza cada slide); se falhar, o erro volta para o LLM corrigir (até 3 tentativas). Decks gerados passam por uma rodada de enxugamento quando o fiscal anti-sono reclamaria.
|
|
144
|
+
|
|
145
|
+
## Desenvolvimento
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
npm install
|
|
149
|
+
node bin/sagadeck.js build templates/exemplo.yaml
|
|
150
|
+
npm run bundle # empacota o motor em python/sagadeck/engine
|
|
151
|
+
npm run build:py # gera dist/*.whl e dist/*.tar.gz
|
|
152
|
+
npm test # suíte inteira: motor + runtime + Studio (clicando num Chrome headless)
|
|
153
|
+
npm run test:unit # só o motor (rápido, sem navegador)
|
|
154
|
+
SAGADECK_LIVE=1 npm test # inclui os testes que chamam o LLM de verdade (modelrelay)
|
|
155
|
+
```
|
|
156
|
+
**Toda funcionalidade nova entra com teste** em `test/` — é o que garante que um refactor não apague o que já funciona. Veja [CLAUDE.md](CLAUDE.md).
|
|
157
|
+
|
|
158
|
+
Publicação: crie uma release `vX.Y.Z` no GitHub (o workflow `.github/workflows/publish.yml` publica no PyPI via *trusted publishing*). A versão fica em `package.json` e `python/sagadeck/__init__.py` (o bundle confere se são iguais).
|
|
159
|
+
|
|
160
|
+
## Arquivo `.sagadeck` (a apresentação inteira)
|
|
161
|
+
|
|
162
|
+
Uma apresentação é o YAML **mais** os arquivos que ele usa: imagens (inclusive as geradas pela IA em
|
|
163
|
+
`imagens/`), CSS próprio (`css:`) e widgets (`widgets:`). Baixar só o YAML quebraria o deck em outra máquina.
|
|
164
|
+
O `.sagadeck` junta tudo num arquivo só. Por dentro é um .zip, como `.pptx` e `.docx`:
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
sagadeck.json manifesto: formato, versão, YAML principal, título, data
|
|
168
|
+
<nome>.yaml a apresentação (sem caminhos da máquina de quem salvou)
|
|
169
|
+
imagens/ widgets/ … os arquivos, nos mesmos caminhos do YAML
|
|
170
|
+
assets/ arquivos que estavam fora da pasta do deck (o YAML do pacote aponta para cá)
|
|
171
|
+
FALTANDO.txt o que o deck usa mas não existia ao salvar (se houver)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
sagadeck pack palestra.yaml # -> palestra.sagadeck
|
|
176
|
+
sagadeck unpack palestra.sagadeck [pasta] # extrai (nunca sobrescreve)
|
|
177
|
+
sagadeck studio palestra.sagadeck # extrai ao lado e abre no Studio
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
No Studio: **Arquivo › Baixar apresentação (.sagadeck)**. O **Abrir do computador** aceita `.sagadeck` e `.zip`;
|
|
181
|
+
o arquivo entra na biblioteca, no tópico **Importados**, e as edições são salvas lá. Um arquivo salvo por uma versão mais nova do
|
|
182
|
+
formato avisa para atualizar o sagadeck. Se um filtro de e-mail barrar a extensão, renomeie para `.zip`: abre igual.
|
|
183
|
+
|
|
184
|
+
## Biblioteca
|
|
185
|
+
|
|
186
|
+
`sagadeck studio` sem arquivo abre a biblioteca: suas apresentações organizadas em tópicos, com capa, busca,
|
|
187
|
+
lixeira (30 dias) e o menu **⋯** de cada cartão (apresentar, renomear, duplicar, mover, baixar tudo/.sagadeck/PPTX/PDF).
|
|
188
|
+
|
|
189
|
+
**Nova apresentação** tem três caminhos: *Descrever com IA* (o assunto, quanto tempo você tem, que vira o número de
|
|
190
|
+
slides, o estilo e, se quiser, material de apoio: PDF, Word, PowerPoint, Excel ou um link), *A partir de um arquivo
|
|
191
|
+
ou link* (o mesmo, começando pelo anexo) e *Modelo pronto* (coleções, estilos, demonstrações e exemplos, com filtro).
|
|
192
|
+
No editor, **Arquivo › Baixar tudo** entrega num .zip o PowerPoint (com notas), o PDF e o roteiro. O editor abre no
|
|
193
|
+
modo simples; **Mais opções**, ao lado das abas, mostra as ferramentas de especialista (YAML, API ao vivo…).
|
|
194
|
+
Arraste um cartão para um tópico para movê-lo. O ícone da biblioteca, no canto do editor, volta para ela.
|
|
195
|
+
|
|
196
|
+
Não tem banco de dados: a biblioteca é uma pasta comum, que dá para abrir no Explorer e fazer backup.
|
|
197
|
+
|
|
198
|
+
```text
|
|
199
|
+
~/sagadeck/ (ou SAGADECK_HOME, ou --library=PASTA)
|
|
200
|
+
Palestras/ tópico = pasta (a cor fica em .topico.json)
|
|
201
|
+
Minha palestra/ apresentação = pasta com o YAML e os arquivos dela
|
|
202
|
+
Minha palestra.yaml
|
|
203
|
+
imagens/
|
|
204
|
+
solta.yaml YAML solto também aparece ("Sem tópico")
|
|
205
|
+
.lixeira/ .cache/ excluídas e capas geradas
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
O Studio escuta só em `127.0.0.1` por padrão; `--host=0.0.0.0` abre para a rede (a biblioteca inteira junto).
|
|
209
|
+
Só a própria página usa o Studio: sem CORS, pedidos de outro site para `/api/*` levam 403, e ele não pode ser
|
|
210
|
+
embutido em iframe de outra origem.
|
|
211
|
+
|
|
212
|
+
**Comandos da IA (para testar APIs de verdade):** no chat do Studio, a IA pode pedir para rodar um trecho de JavaScript, Python, PowerShell ou shell — por exemplo, testar a API cuja documentação você colou, ajustar o contrato e só então montar o slide. Nada roda sem você ver o código e clicar em **Executar** (ou em *Executar e liberar os próximos*, que vale até recarregar o Studio ou trocar de apresentação). O comando roda na pasta da apresentação e recebe as variáveis do ambiente ativo (`SAGA_VAR_*`, `SAGA_SECRET_*`, `SAGA_TOKEN`); a IA só vê os nomes, e a saída volta para ela com os segredos mascarados. No servidor multiusuário, só quem estiver em `--agentes=usuario1,usuario2` (ou `SAGADECK_AGENTES`) tem comandos, e eles rodam **na máquina do servidor**; os demais usam o resto normalmente.
|
|
213
|
+
|
|
214
|
+
**Vários usuários (servidor):** `sagadeck studio --multiuser --library=/srv/sagadeck` dá uma biblioteca por pessoa
|
|
215
|
+
(`usuarios/<nome>/`), identificada pelo cabeçalho `X-Sagadeck-User` (ou `--user-header=...`) que o proxy de login
|
|
216
|
+
(nginx) coloca. Sem o cabeçalho, nada é servido. Por confiar nesse cabeçalho, só roda escutando em `127.0.0.1`,
|
|
217
|
+
atrás do proxy. Se o nginx troca o `Host`, mande o endereço do portal em `X-Forwarded-Host` (`proxy_set_header
|
|
218
|
+
X-Forwarded-Host $host;`): é com ele que o Studio reconhece a própria página.
|
|
219
|
+
|
|
220
|
+
**Link para ver (só leitura):** Arquivo › Compartilhar link cria um link para uma apresentação: quem abre vê a
|
|
221
|
+
apresentação pronta, sem o editor, sem a biblioteca e sem as notas do apresentador (a não ser que se marque).
|
|
222
|
+
No servidor, `/ver/<código>` exige o usuário do portal (o proxy pede a sessão e manda `X-Sagadeck-User`) e
|
|
223
|
+
`/publico/<código>` abre para qualquer pessoa, só se o link foi criado como público (o proxy deixa passar sem
|
|
224
|
+
sessão e sem o cabeçalho). Os links ficam em `<biblioteca>/.compartilhados.json`; revogar apaga na hora. Quem abre baixa pelo botão Baixar da página (`<link>/baixar/pdf|pptx|html|estudo|estudo-html|sagadeck`, e `roteiro`/`tudo` só no link com as notas), um arquivo por vez por link. As páginas
|
|
225
|
+
vão com `noindex` e sem Referer. No Studio local, o link abre para quem alcança o Studio (com `--host=0.0.0.0`, a
|
|
226
|
+
rede da casa).
|
|
227
|
+
|
|
228
|
+
**Baixar para apresentar (HTML)** é outra coisa: um HTML único, com tudo embutido, para apresentar em qualquer
|
|
229
|
+
navegador, mas não para editar.
|
|
230
|
+
|
|
231
|
+
## Slides para devs: API ao vivo
|
|
232
|
+
|
|
233
|
+
O layout `api` é um slide tipo Postman: mostra o pedido (URL, corpo, cabeçalhos) e o código equivalente
|
|
234
|
+
(curl, Python e Python comentado), e o botão **Executar** roda o pedido de verdade na frente da plateia:
|
|
235
|
+
síncrono, polling com linha do tempo, streaming, upload, token (JWT decodificado), embeddings, TTS/STT e
|
|
236
|
+
conversa em tempo real por WebSocket. Os pedidos saem do Studio (na sua máquina), então não tem CORS e o
|
|
237
|
+
token nunca vai para a página.
|
|
238
|
+
|
|
239
|
+
Para ver funcionando sem configurar nada:
|
|
240
|
+
|
|
241
|
+
- **Biblioteca → Nova → Exemplo: aula de APIs ao vivo.** Cria um deck com um slide de cada tipo, que roda no
|
|
242
|
+
ambiente **ENSAIO**: uma API de mentira que o Studio sobe sozinho (sem VPN, sem chave). Apresente e clique
|
|
243
|
+
em **Executar**. (`sagadeck ensaio-api` faz o mesmo pela linha de comando.) O deck também traz um slide
|
|
244
|
+
**OpenRouter (real)** com `nvidia/nemotron-3-super-120b-a12b:free`. Para usá-lo, defina `OPENROUTER_API_KEY` no
|
|
245
|
+
processo que inicia o Studio e escolha o ambiente **OPENROUTER** no selo do slide. A chave fica fora do
|
|
246
|
+
deck; no PowerShell, por exemplo, defina `$env:OPENROUTER_API_KEY = "sua-chave"` antes de iniciar o
|
|
247
|
+
Studio e reinicie-o depois de definir a variável.
|
|
248
|
+
- **No editor, Inserir → Slide de API:** os mesmos exemplos, um de cada vez, entram depois do slide atual.
|
|
249
|
+
O painel **Formatar** edita o endereço, o corpo em JSON, o modo (síncrono, polling, streaming, tempo real)
|
|
250
|
+
e o que guardar para os próximos slides.
|
|
251
|
+
- **Inserir → Ambientes:** onde ficam os endereços (`{{base}}`), tokens e segredos do *seu* serviço
|
|
252
|
+
(dev, hom, prod). É gravado em `~/.sagadeck/ambientes.yaml`, na sua máquina, nunca no deck. O selo no
|
|
253
|
+
slide (DEV, HOM, ENSAIO…) troca o ambiente na hora.
|
|
254
|
+
|
|
255
|
+
Executar só funciona no Studio local; no HTML exportado e no modo multiusuário, o slide mostra a última
|
|
256
|
+
resposta gravada. Todos os campos estão na [referência](docs/REFERENCIA.md#slide-api-requisição-ao-vivo).
|
|
257
|
+
|
|
258
|
+
## Apresentando (HTML)
|
|
259
|
+
|
|
260
|
+
| tecla | ação |
|
|
261
|
+
|---|---|
|
|
262
|
+
| `→` `espaço` / `←` | avança / volta (inclusive cliques dentro do slide) |
|
|
263
|
+
| `P` | abre a **janela do apresentador**: slide atual, próximo, notas, relógio, cronômetro com "adiantado/atrasado" |
|
|
264
|
+
| `F` | tela cheia |
|
|
265
|
+
| `G` | visão geral de todos os slides |
|
|
266
|
+
| `B` / `W` | tela preta / branca |
|
|
267
|
+
| `L` | apontador laser |
|
|
268
|
+
| `R` | zera o timer do slide |
|
|
269
|
+
| `5` `Enter` | vai para o slide 5 |
|
|
270
|
+
| `H` | ajuda |
|
|
271
|
+
|
|
272
|
+
**No Teams:** compartilhe só a janela do deck (a janela do apresentador fica com você). Se tiver um monitor só, deixe a janela do apresentador ao lado e compartilhe a janela do deck. Para vídeos com som, compartilhe com "incluir som do computador".
|
|
273
|
+
|
|
274
|
+
## Temas
|
|
275
|
+
|
|
276
|
+
`sinal` (sinalização, DIN condensada, amarelo de aviso) · `editorial` (revista, serifada, vermelho-tomate) · `noite` (escuro elegante, latão) · `bauhaus` (geométrico, cores primárias) · `terminal` (dados, monoespaçada, âmbar — sem neon) · `jornal` (manchete, Franklin Gothic, azul-tinta) · `rabisco` · `oceano` · `pop` · `aurora` · `prata`.
|
|
277
|
+
Trocar o tema muda o arranjo, não só cor e fonte: capa, seção, título, cartões, lista, citação e número grande têm o
|
|
278
|
+
jeito de cada tema. No Studio, passar o mouse num tema mostra a prévia no slide; o clique aplica.
|
|
279
|
+
As fontes dos temas vêm embutidas (licença OFL): a apresentação não pede nada à internet e funciona numa rede que
|
|
280
|
+
barra o Google. Veja todos lado a lado com `sagadeck themes`. Dá para criar o seu estendendo um tema — veja `docs/REFERENCIA.md`.
|
|
281
|
+
|
|
282
|
+
## Arquivos
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
bin/sagadeck.js linha de comando
|
|
286
|
+
src/themes.js temas (cores, tons, fontes para navegador e PowerPoint)
|
|
287
|
+
src/layouts.js os 21 layouts
|
|
288
|
+
src/elements.js elementos (texto, contador, timer, enquete, cartões…)
|
|
289
|
+
src/figures/ pictogramas, diagramas, gráficos, ícones — tudo gerado em SVG
|
|
290
|
+
src/runtime/ o motor que roda no navegador (navegação, cliques, apresentador, widgets)
|
|
291
|
+
src/export/ PowerPoint, PDF, imagens, roteiro e o fiscal
|
|
292
|
+
templates/exemplo.yaml deck de exemplo com todos os layouts
|
|
293
|
+
docs/REFERENCIA.md referência completa do YAML
|
|
294
|
+
SKILL.md instruções para IAs gerarem decks com o sagadeck
|
|
295
|
+
python/sagadeck/ pacote Python (CLI + API) que carrega o motor empacotado
|
|
296
|
+
scripts/bundle.mjs empacota o motor para o pip
|
|
297
|
+
tools/ppt-render.ps1 renderiza um .pptx pelo PowerPoint (para conferir fidelidade)
|
|
298
|
+
tools/test-live.mjs teste automático do modo apresentação e dos widgets
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Limitações conhecidas
|
|
302
|
+
|
|
303
|
+
- O PPTX usa as fontes do Windows/Office dos temas. Aberto num Mac sem essas fontes, o PowerPoint troca a fonte (o HTML e o PDF continuam iguais).
|
|
304
|
+
- Widgets interativos (jogos, simuladores) viram imagem do estado final no PowerPoint e no PDF — a interação existe só no HTML.
|
|
305
|
+
- Gráficos entram como imagem nítida no PPTX; com `--native-charts`, barras/colunas/linhas/rosca viram gráficos nativos editáveis (com visual mais simples).
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sagadeck
|
|
3
|
+
description: Gera apresentações bonitas (HTML animado + PowerPoint editável + PDF + roteiro do apresentador) a partir de um arquivo YAML, com estúdio visual web estilo PowerPoint, chat lateral com IA e motor de auto-correção geométrica (detector de sobreposição e quebra de margens).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# sagadeck — como um agente de IA deve gerar e editar apresentações
|
|
7
|
+
|
|
8
|
+
O sagadeck gera apresentações profissionais a partir de um arquivo YAML, oferecendo tanto linha de comando (CLI), estúdio web visual no estilo PowerPoint, quanto protocolo MCP para integração com IDEs agênticos (Claude Code, Cursor, Windsurf, Cline, Roo Code).
|
|
9
|
+
|
|
10
|
+
## Comandos Disponíveis
|
|
11
|
+
|
|
12
|
+
| comando | o que faz |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `sagadeck studio [deck.yaml] [--port=3000]` | **Abre o estúdio web estilo PowerPoint** com canvas visual 16:9, edição WYSIWYG direta, detector de sobreposição em tempo real e **chat lateral com IA**. |
|
|
15
|
+
| `sagadeck autofix <deck.yaml>` | **Auto-cura do layout**: detecta e repara automaticamente sobreposição entre elementos, elementos fora das margens seguras (120px) e excesso de texto. |
|
|
16
|
+
| `sagadeck search "<termo>"` | **Pesquisa web sem bloqueio (DuckDuckGo)**: busca dados reais, números e referências confiáveis para enriquecer os slides. |
|
|
17
|
+
| `sagadeck mcp` | **Servidor MCP**: expõe ferramentas padronizadas (JSON-RPC) para IDEs agênticos criarem, lerem, pesquisarem, fiscalizarem e editarem decks. |
|
|
18
|
+
| `sagadeck new deck.yaml [--theme=prata]` | cria um deck de exemplo estruturado |
|
|
19
|
+
| `sagadeck build deck.yaml` | compila `deck.html` standalone (abre no navegador; tecla P = modo apresentador) |
|
|
20
|
+
| `sagadeck check deck.yaml` | fiscal: texto estourado, sobreposição, contraste, fonte pequena, excesso de texto |
|
|
21
|
+
| `sagadeck pptx deck.yaml` | gera `deck.pptx` **totalmente editável** no PowerPoint com formas e caixas nativas |
|
|
22
|
+
| `sagadeck pdf deck.yaml` | gera `deck.pdf` (um slide por página) |
|
|
23
|
+
| `sagadeck roteiro deck.yaml` | gera `deck - roteiro.pdf` (miniaturas + falas + relógio planejado) |
|
|
24
|
+
| `sagadeck all deck.yaml` | compila tudo: html + check + autofix + pptx + pdf + roteiro |
|
|
25
|
+
| `sagadeck themes` | vitrine com os 11 temas visuais |
|
|
26
|
+
| `sagadeck icons <filtro>` | busca ícones na biblioteca embutida (2.100+) |
|
|
27
|
+
| `sagadeck ref` / `sagadeck skill` | referência completa do formato YAML / esta skill |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## O Estúdio Visual SagaDeck (Página estilo PowerPoint)
|
|
32
|
+
|
|
33
|
+
Ao rodar `sagadeck studio [deck.yaml]`:
|
|
34
|
+
1. **Trilho de Miniaturas (Esquerda)**: lista todos os slides com número, badge de layout, miniatura ao vivo, botões de mover (↑/↓), duplicar e excluir.
|
|
35
|
+
2. **Palco Central (Canvas 16:9)**:
|
|
36
|
+
- Renderização fiel do slide em resolução lógica de 1920×1080 com zoom/escala responsiva automática (auto-fit).
|
|
37
|
+
- **Edição direta (WYSIWYG)**: clique em qualquer título, kicker, subtítulo, cartão ou número para editar o texto na hora.
|
|
38
|
+
- **Suporte ao layout livre `canvas`**: posicionamento com coordenadas `(x, y, w, h)`.
|
|
39
|
+
- **Guias de Margem**: linha tracejada indicando a margem segura de 120px (esquerda/direita) e 92px/104px (topo/base).
|
|
40
|
+
3. **Barra de Notas Inferior**: editor de roteiro do apresentador (`notes:`) com contador de palavras anti-sono em tempo real.
|
|
41
|
+
4. **Chat Lateral com IA (Direita)**:
|
|
42
|
+
- Permite pedir à IA qualquer alteração no slide atual, em slides específicos ou em toda a apresentação.
|
|
43
|
+
- **Poder total**: a IA consegue fazer tudo que você faz na mão (trocar layouts, editar textos, mudar temas, criar/remover slides, alterar tons, etc.).
|
|
44
|
+
- **Auto-visão e Auto-cura**: a IA inspeciona as caixas delimitadoras (*bounding boxes*) dos elementos. Se houver sobreposição ou estouro de margem, ela corrige automaticamente antes de entregar a resposta!
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Capacidade de Auto-Inspeção e Auto-Correção ("Se enxergar e corrigir sozinho")
|
|
49
|
+
|
|
50
|
+
O motor do SagaDeck possui fiscalização geométrica embutida:
|
|
51
|
+
|
|
52
|
+
### 1. Detecção em Tempo Real
|
|
53
|
+
- **Sobreposição (*collision*)**: calcula a interseção entre retângulos de elementos visíveis. Se a área sobreposta exceder o limiar de tolerância (8px) e os elementos não forem intencionais, sinaliza alerta de sobreposição (`A ⟂ B`).
|
|
54
|
+
- **Margem Segura (*safe area*)**: se o conteúdo ultrapassar a base da safe area (976px no eixo vertical) ou as laterais (1800px), calcula o overflow exato em pixels.
|
|
55
|
+
- **Estouro de Tela (*out of bounds*)**: elementos com coordenadas negativas ou maiores que 1920×1080.
|
|
56
|
+
- **Estouro de Texto (*clipping*)**: textos onde `scrollWidth > clientWidth`.
|
|
57
|
+
- **Baixo Contraste**: verificação do ratio WCAG entre texto e fundo.
|
|
58
|
+
|
|
59
|
+
### 2. Algoritmo de Auto-Cura (`autofix`)
|
|
60
|
+
Quando acionado pela IA ou pelo comando `sagadeck autofix`:
|
|
61
|
+
- **Em caso de sobreposição no `canvas`**: empurra o elemento inferior para `B.y = A.y + A.h + 24px`, alinhando horizontalmente se atingir o limite vertical.
|
|
62
|
+
- **Em layouts padrão**: reduz automaticamente o `titleSize` e redistribui o espaçamento vertical.
|
|
63
|
+
- **Em caso de quebra da margem inferior**:
|
|
64
|
+
- Reduz `titleSize` (ex.: de 140 para 96 ou 72).
|
|
65
|
+
- Em layout `cards`: reorganiza para 3 ou 4 colunas horizontais em vez de empilhar verticalmente.
|
|
66
|
+
- Em textos longos: compacta o texto visível e transfere explicações detalhadas para as notas do apresentador (`notes:`).
|
|
67
|
+
- **Em caso de baixo contraste**: ajusta o `tone` do slide para manter a legibilidade.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Integração com IDEs Agênticos (Cursor, Windsurf, Claude Code, Cline)
|
|
72
|
+
|
|
73
|
+
Um IDE agêntico pode interagir com o SagaDeck de 3 formas:
|
|
74
|
+
|
|
75
|
+
### 1. Via Protocolo MCP (`sagadeck mcp`)
|
|
76
|
+
Configure o servidor MCP no seu cliente (ex.: `.cursor/mcp.json` ou `claude_desktop_config.json`):
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"mcpServers": {
|
|
80
|
+
"sagadeck": {
|
|
81
|
+
"command": "node",
|
|
82
|
+
"args": ["/caminho/para/sagadeck/bin/sagadeck.js", "mcp"]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
Ferramentas disponíveis no MCP:
|
|
88
|
+
- `sagadeck_create_deck`: cria um novo deck YAML.
|
|
89
|
+
- `sagadeck_read_deck`: lê e decompõe um deck existente.
|
|
90
|
+
- `sagadeck_inspect_deck`: executa o fiscal e retorna relatório de sobreposições e margens.
|
|
91
|
+
- `sagadeck_autofix_deck`: executa a auto-cura geométrica no arquivo YAML.
|
|
92
|
+
- `sagadeck_build_html`: compila o arquivo `.html` interativo.
|
|
93
|
+
- `sagadeck_launch_studio`: abre o SagaDeck Studio na web.
|
|
94
|
+
|
|
95
|
+
### 2. Via Linha de Comando (CLI)
|
|
96
|
+
O agente no terminal deve seguir o fluxo:
|
|
97
|
+
1. Escrever o `deck.yaml` usando layouts apropriados.
|
|
98
|
+
2. Rodar `sagadeck autofix deck.yaml` para assegurar geometria perfeita.
|
|
99
|
+
3. Rodar `sagadeck check deck.yaml` para confirmar ausência de avisos.
|
|
100
|
+
4. Rodar `sagadeck all deck.yaml` para gerar todas as entregas.
|
|
101
|
+
|
|
102
|
+
### 3. Via API Python
|
|
103
|
+
```python
|
|
104
|
+
import sagadeck
|
|
105
|
+
sagadeck.autofix("palestra.yaml")
|
|
106
|
+
sagadeck.build("palestra.yaml")
|
|
107
|
+
sagadeck.studio("palestra.yaml", port=3000)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Decisão de Arquitetura: Mesmo Repositório vs. Repositório Separado
|
|
113
|
+
|
|
114
|
+
### Por que o Estúdio deve ficar no **mesmo repositório** (`sagadeck`):
|
|
115
|
+
1. **Fonte Única da Verdade**: Os layouts (incluindo `stats` para KPIs e `steps` para processos), os 11 temas visuais (incluindo `prata` estilo Keynote Apple, `rabisco` artesanal pintado à mão, `oceano` azul elétrico vivo, `pop` alegre/chiclete e `aurora` neon), as regras de tipografia e as rotinas de verificação geométrica residem no mesmo código (`src/layouts.js`, `src/themes.js`, `src/fiscal/autofix.js`). Qualquer alteração ou novo layout adicionado ao compilador fica disponível **instantaneamente** no estúdio visual.
|
|
116
|
+
2. **Zero Descompasso de Versões**: Em repositórios separados, quando o formato YAML ou os temas do SagaDeck evoluem, a interface visual quebra ou fica desatualizada até que alguém publique e atualize dependências externas.
|
|
117
|
+
3. **Experiência de Uso (DX) Imediata**: O desenvolvedor ou agente clona o repositório ou roda `pip install sagadeck` / `npm install` e tem **tudo num só lugar**: linha de comando (`sagadeck build`), estúdio visual (`sagadeck studio`), servidor de agentes (`sagadeck mcp`) e fiscal (`sagadeck check`).
|
|
118
|
+
4. **Leve e Modular**: A interface web foi construída com tecnologias nativas leves (Vanilla JS, CSS moderno e servidor HTTP embutido do Node.js sem frameworks pesados). Isso mantém o pacote pequeno (~1.1 MB empacotado) sem impactar o desempenho do compilador.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Novos Temas Visuais & Recursos Anti-Textão
|
|
123
|
+
|
|
124
|
+
### 1. Temas Modernos, Vivos, Jovens e Clean
|
|
125
|
+
- **`prata`**: **Estilo Keynote Apple**. Jovem, clean, respirável e sofisticado (levado a sério). Fundo cinza prata acetinado (`#F5F5F7`), texto em ardósia/preto profundo (`#1D1D1F`), cinza titânio intermediário (`#86868B`), divisores finos (`#D2D2D7`) e azul Apple (`#0071E3`). Cartelas com efeito vidro fosco / acabamento acetinado com sombra ultra-suave e tipografia San Francisco / Inter.
|
|
126
|
+
- **`rabisco`**: Estilo artesanal e lousa com fontes desenhadas à mão (`'Caveat'`, `'Patrick Hand'`, `'Ink Free'`), bordas orgânicas de caderno, sombras desenhadas, fitas adesivas/post-its e ícones em estilo doodle. Ideal quando se quer uma apresentação calorosa, amigável e ilustrada.
|
|
127
|
+
- **`oceano`**: Azul elétrico ultra vibrante (`#0062FF`), ciano neon (`#00C6FF`), tipografia moderna punchy e fundo luminoso de alta energia. Perfeito para tech, startups e produtos dinâmicos.
|
|
128
|
+
- **`pop`**: Alegre, colorido e chiclete com paleta super animada (roxo, rosa chiclete, menta, sol) e cantos ultra-arredondados (26px).
|
|
129
|
+
- **`aurora`**: Noite espacial mágica com gradientes e luzes vivas em neon (ciano, violeta e magenta).
|
|
130
|
+
|
|
131
|
+
### 2. Layouts e Componentes Visuais para Reduzir Texto
|
|
132
|
+
Para apresentações de alto impacto sem "muralhas de texto":
|
|
133
|
+
- **`layout: stats` (ou `stats:` / `kpis:`)**: Grade de 2 a 4 grandes números visuais, com ícones embutidos, badges de tendência (`+14% ↗`, `recorde`), valor gigante e rótulo curto.
|
|
134
|
+
- **`layout: steps` (ou `steps:` / `process:` / `flow:`)**: Linha do processo horizontal conectada por setas (`01 ➔ 02 ➔ 03`), com números destacados, ícones em círculos e tags de apoio.
|
|
135
|
+
- **Widgets em `cards:`**: Cada card pode conter `progress: 85` (barra de progresso com porcentagem), `tags: ["Tag1", "Tag2"]` (nuvem de pílulas visuais), `rating: 5` (estrelas avaliativas) ou badges com `check: true` / `status: "pro"`.
|
|
136
|
+
|
|
137
|
+
### 3. Pesquisa na Web sem Bloqueios (DuckDuckGo) & Citação de Fontes
|
|
138
|
+
- **Sem bloqueios de robô**: Modelos de IA não devem tentar raspar o Google via navegadores headless (o Google bloqueia com CAPTCHA/bot detection). O SagaDeck inclui pesquisa nativa via DuckDuckGo com `sagadeck search "<termo>"` e a ferramenta MCP `sagadeck_web_search`.
|
|
139
|
+
- **Controle Flexível de Fontes**:
|
|
140
|
+
- **Quando o usuário pedir fontes citadas**: Inclua `source: "Fonte: Nome do Relatório, Ano"` nos slides com métricas (`stats`, `number`, `chart`, `split`) e a URL completa no roteiro do apresentador (`notes:`).
|
|
141
|
+
- **Quando o usuário pedir sem fontes (ou estilo clean/Apple)**: Omita o campo `source:`, mantendo o slide limpo e desobstruído.
|
|
142
|
+
- **Garantia para Modelos Econômicos**: Qualquer modelo (inclusive os menores como Haiku, Flash ou GPT-4o-mini) deve sempre finalizar com o comando `sagadeck autofix <deck.yaml>`. Isso corrige problemas cobertos pelas regras; depois confira a renderização, porque não garante perfeição geométrica ou visual.
|
|
143
|
+
|
|
144
|
+
## Recursos recentes para autoria por IA
|
|
145
|
+
|
|
146
|
+
Consulte `docs/REFERENCIA.md` para os contratos atuais de `science` (KaTeX, até cinco equações, Plotly 2D/3D), `scenography` (texto integrado ao cenário, estático), `spotlight`, `codewalk` e `api`. Para criar apresentações autonomamente, a IA precisa desta referência, do briefing, do material autorizado e das imagens; acesso ao banco por si só não transmite o formato do SagaDeck. Use apenas endpoints/status reais fornecidos pela documentação interna, sem inventar detalhes. Configure credenciais no ambiente local; nunca dentro dos slides.
|
|
147
|
+
|
|
148
|
+
O Studio permite inserir e arrastar elementos e revisar uma imagem do slide com IA. Ajustes manuais `visualEdits` são específicos da estrutura renderizada: remova-os ao reconstruir um slide. Sempre confira o resultado renderizado; regras geométricas não garantem qualidade visual.
|