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.
Files changed (233) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/SKILL.md +148 -0
  4. package/bin/sagadeck.js +511 -0
  5. package/docs/ANDAMENTO.md +1255 -0
  6. package/docs/EXPERIENCIAS.md +39 -0
  7. package/docs/PLANO-EXPERIENCIAS.md +39 -0
  8. package/docs/PLANO-TESTE-AULAS-TECNICAS.md +44 -0
  9. package/docs/PLANO-TESTE-DESINFORMACAO.md +38 -0
  10. package/docs/REFERENCIA.md +1131 -0
  11. package/package.json +59 -0
  12. package/src/adaptive-layouts.js +18 -0
  13. package/src/ai/art-direction.js +8 -0
  14. package/src/ai/commands.js +130 -0
  15. package/src/ai/context.js +245 -0
  16. package/src/ai/deck-ai.js +1135 -0
  17. package/src/ai/directions.js +74 -0
  18. package/src/ai/document-materials.js +49 -0
  19. package/src/ai/document-visuals.js +215 -0
  20. package/src/ai/evaluation.js +31 -0
  21. package/src/ai/ground.js +55 -0
  22. package/src/ai/llm.js +292 -0
  23. package/src/ai/quality.js +51 -0
  24. package/src/ai/relay.js +45 -0
  25. package/src/ai/staged-generation.js +24 -0
  26. package/src/ai/transform.js +858 -0
  27. package/src/ai/usage.js +17 -0
  28. package/src/ai/variety.js +80 -0
  29. package/src/ai/video-frames.js +24 -0
  30. package/src/ai/video-generation.js +126 -0
  31. package/src/ai/web-operation.js +31 -0
  32. package/src/algo-catalog.js +153 -0
  33. package/src/algo-trace.js +139 -0
  34. package/src/api-client.js +514 -0
  35. package/src/api-collections.js +14 -0
  36. package/src/api-demo.js +222 -0
  37. package/src/aspect.js +40 -0
  38. package/src/build.js +323 -0
  39. package/src/carousel.js +56 -0
  40. package/src/chrome.js +65 -0
  41. package/src/code-highlight.js +68 -0
  42. package/src/code-lab-browser.js +22 -0
  43. package/src/code-lab.js +3 -0
  44. package/src/code-language.js +52 -0
  45. package/src/csv.js +74 -0
  46. package/src/decision-lab.js +20 -0
  47. package/src/deck-file.js +119 -0
  48. package/src/diagram/napkin-examples.js +13 -0
  49. package/src/diagram/napkin.js +539 -0
  50. package/src/docx.js +128 -0
  51. package/src/dynamics/git-sim.js +200 -0
  52. package/src/dynamics/layouts.js +112 -0
  53. package/src/elements.js +554 -0
  54. package/src/experiences.js +124 -0
  55. package/src/exploration.js +31 -0
  56. package/src/export/browser.js +53 -0
  57. package/src/export/estudo.js +67 -0
  58. package/src/export/pptx.js +475 -0
  59. package/src/export/roteiro.js +40 -0
  60. package/src/export/shots.js +182 -0
  61. package/src/figures/charts.js +383 -0
  62. package/src/figures/diagrams.js +117 -0
  63. package/src/figures/icons.js +166 -0
  64. package/src/figures/material-pictos.js +20 -0
  65. package/src/figures/pictos.js +255 -0
  66. package/src/figures/points.js +106 -0
  67. package/src/figures/qr.js +29 -0
  68. package/src/figures/ufmap.js +48 -0
  69. package/src/fiscal/autofix.js +377 -0
  70. package/src/fiscal/normalize.js +115 -0
  71. package/src/graph-lab.js +24 -0
  72. package/src/hologram.js +30 -0
  73. package/src/identity.js +86 -0
  74. package/src/import/crop.js +59 -0
  75. package/src/import/index.js +132 -0
  76. package/src/import/legacy-word.js +42 -0
  77. package/src/import/merge.js +45 -0
  78. package/src/import/office.js +123 -0
  79. package/src/import/omml.js +69 -0
  80. package/src/import/pdf-render.js +56 -0
  81. package/src/import/pptx.js +701 -0
  82. package/src/import/xml.js +42 -0
  83. package/src/infographic.js +401 -0
  84. package/src/layouts.js +723 -0
  85. package/src/lessons.js +171 -0
  86. package/src/library.js +399 -0
  87. package/src/markup.js +116 -0
  88. package/src/master.js +214 -0
  89. package/src/mcp/server.js +371 -0
  90. package/src/meeting.js +42 -0
  91. package/src/motion.js +56 -0
  92. package/src/package.js +116 -0
  93. package/src/playground.js +19 -0
  94. package/src/portal-scene.js +20 -0
  95. package/src/preferences.js +61 -0
  96. package/src/protect.js +51 -0
  97. package/src/purpose.js +24 -0
  98. package/src/pytrace.js +1092 -0
  99. package/src/research/duckduckgo.js +73 -0
  100. package/src/research/research.js +202 -0
  101. package/src/research/svg-image.js +17 -0
  102. package/src/research/visuals.js +52 -0
  103. package/src/runtime/api-collection-ui.js +5 -0
  104. package/src/runtime/api-collections.js +28 -0
  105. package/src/runtime/api-core.js +530 -0
  106. package/src/runtime/api-ui.js +966 -0
  107. package/src/runtime/base.css +1774 -0
  108. package/src/runtime/calc.js +139 -0
  109. package/src/runtime/code-lab.js +371 -0
  110. package/src/runtime/decision-lab.js +49 -0
  111. package/src/runtime/diagram.js +341 -0
  112. package/src/runtime/fit.js +268 -0
  113. package/src/runtime/fonts/caveat.css +2 -0
  114. package/src/runtime/fonts/comic-neue.css +3 -0
  115. package/src/runtime/fonts/fredoka.css +2 -0
  116. package/src/runtime/fonts/index.json +10 -0
  117. package/src/runtime/fonts/inter.css +2 -0
  118. package/src/runtime/fonts/patrick-hand.css +2 -0
  119. package/src/runtime/fonts/plus-jakarta-sans.css +2 -0
  120. package/src/runtime/fonts/press-start-2p.css +2 -0
  121. package/src/runtime/fonts/vt323.css +2 -0
  122. package/src/runtime/formula.js +148 -0
  123. package/src/runtime/graph-lab.js +72 -0
  124. package/src/runtime/meeting.css +7 -0
  125. package/src/runtime/meeting.js +10 -0
  126. package/src/runtime/motion.js +15 -0
  127. package/src/runtime/playground.js +11 -0
  128. package/src/runtime/points.js +19 -0
  129. package/src/runtime/portal-scene.css +6 -0
  130. package/src/runtime/portal-scene.js +22 -0
  131. package/src/runtime/runtime.js +827 -0
  132. package/src/runtime/science.js +89 -0
  133. package/src/runtime/skins/aluminio.css +31 -0
  134. package/src/runtime/skins/arcade.css +25 -0
  135. package/src/runtime/skins/aurora.css +17 -0
  136. package/src/runtime/skins/bauhaus.css +19 -0
  137. package/src/runtime/skins/editorial.css +19 -0
  138. package/src/runtime/skins/jornal.css +17 -0
  139. package/src/runtime/skins/manual-noite.css +14 -0
  140. package/src/runtime/skins/manual.css +14 -0
  141. package/src/runtime/skins/noite.css +21 -0
  142. package/src/runtime/skins/oceano.css +17 -0
  143. package/src/runtime/skins/pop.css +23 -0
  144. package/src/runtime/skins/prata.css +18 -0
  145. package/src/runtime/skins/prisma.css +28 -0
  146. package/src/runtime/skins/rabisco.css +18 -0
  147. package/src/runtime/skins/relevo.css +33 -0
  148. package/src/runtime/skins/sinal.css +16 -0
  149. package/src/runtime/skins/terminal.css +23 -0
  150. package/src/runtime/vendor/KATEX-LICENSE.txt +21 -0
  151. package/src/runtime/vendor/MERMAID-LICENSE.txt +21 -0
  152. package/src/runtime/vendor/PLOTLY-LICENSE.txt +21 -0
  153. package/src/runtime/vendor/katex.css +1 -0
  154. package/src/runtime/vendor/mermaid.min.js +3636 -0
  155. package/src/runtime/vendor/plotly.min.js +3620 -0
  156. package/src/runtime/video-player.js +35 -0
  157. package/src/science.js +162 -0
  158. package/src/studio/ai-response.js +36 -0
  159. package/src/studio/api-routes.js +152 -0
  160. package/src/studio/assets/contexto/leia-me.md +12 -0
  161. package/src/studio/assets/contexto/vendas.csv +7 -0
  162. package/src/studio/assets/imagens/colecao-arquitetura.png +0 -0
  163. package/src/studio/assets/imagens/colecao-cor.png +0 -0
  164. package/src/studio/assets/imagens/colecao-equipe.png +0 -0
  165. package/src/studio/assets/imagens/lavanda-cover.jpg +0 -0
  166. package/src/studio/code-routes.js +32 -0
  167. package/src/studio/command-approval.js +48 -0
  168. package/src/studio/demo-decks.js +98 -0
  169. package/src/studio/direction-routes.js +29 -0
  170. package/src/studio/errors.js +65 -0
  171. package/src/studio/exploration-demo.js +17 -0
  172. package/src/studio/exporting.js +105 -0
  173. package/src/studio/generation-report.js +10 -0
  174. package/src/studio/instance.js +48 -0
  175. package/src/studio/layout-samples.js +152 -0
  176. package/src/studio/project.js +371 -0
  177. package/src/studio/public/api-collections.js +28 -0
  178. package/src/studio/public/app.js +5265 -0
  179. package/src/studio/public/art-preview.js +10 -0
  180. package/src/studio/public/calc-fields.js +11 -0
  181. package/src/studio/public/chat-progress.js +47 -0
  182. package/src/studio/public/developer-fields.js +22 -0
  183. package/src/studio/public/explorer.js +443 -0
  184. package/src/studio/public/history.js +58 -0
  185. package/src/studio/public/index.html +867 -0
  186. package/src/studio/public/inspector.js +270 -0
  187. package/src/studio/public/lab-fields.js +5 -0
  188. package/src/studio/public/library.css +275 -0
  189. package/src/studio/public/library.html +55 -0
  190. package/src/studio/public/library.js +471 -0
  191. package/src/studio/public/merge-decks.js +155 -0
  192. package/src/studio/public/review-ui.js +100 -0
  193. package/src/studio/public/screenshot-editor.js +140 -0
  194. package/src/studio/public/share-ui.js +72 -0
  195. package/src/studio/public/slide-clipboard.js +23 -0
  196. package/src/studio/public/slide-form.js +1263 -0
  197. package/src/studio/public/studio-awareness.js +154 -0
  198. package/src/studio/public/studio-next.css +303 -0
  199. package/src/studio/public/style.css +1262 -0
  200. package/src/studio/public/ui-icons.js +2 -0
  201. package/src/studio/public/viewers.js +372 -0
  202. package/src/studio/public/visual-editor.js +326 -0
  203. package/src/studio/public/workspace.js +18 -0
  204. package/src/studio/public-files.js +1 -0
  205. package/src/studio/request-helpers.js +41 -0
  206. package/src/studio/server.js +1583 -0
  207. package/src/studio/share-routes.js +146 -0
  208. package/src/studio/slide-copy-routes.js +26 -0
  209. package/src/studio/slide-copy.js +30 -0
  210. package/src/studio/snapshot.js +160 -0
  211. package/src/studio/style-routes.js +103 -0
  212. package/src/studio/template-collections.js +97 -0
  213. package/src/studio/versions.js +95 -0
  214. package/src/studio/video-download.js +29 -0
  215. package/src/studio/visual-keys.js +52 -0
  216. package/src/studio/workspaces.js +39 -0
  217. package/src/table.js +93 -0
  218. package/src/templates/scaffold.js +372 -0
  219. package/src/themes.js +604 -0
  220. package/src/trace-view.js +450 -0
  221. package/src/uid.js +19 -0
  222. package/src/video-player.js +40 -0
  223. package/src/visual-edits.js +99 -0
  224. package/src/ws.js +134 -0
  225. package/templates/cenario/Texto no cen/303/241rio.yaml" +171 -0
  226. package/templates/cenario/imagens/cidade.svg +30 -0
  227. package/templates/cenario/imagens/pessoa.svg +15 -0
  228. package/templates/cenario-e-ciencia.yaml +47 -0
  229. package/templates/ensaio-api.yaml +160 -0
  230. package/templates/exemplo-alegre.yaml +75 -0
  231. package/templates/exemplo-keynote.yaml +90 -0
  232. package/templates/exemplo-napkin.yaml +139 -0
  233. 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.