sagadeck 1.8.0 → 1.10.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 (107) hide show
  1. package/README.md +25 -8
  2. package/SKILL.md +10 -3
  3. package/bin/sagadeck.js +23 -0
  4. package/docs/ANDAMENTO.md +482 -7
  5. package/docs/PLANO-MELHORIAS.md +180 -0
  6. package/docs/REFERENCIA.md +178 -111
  7. package/package.json +35 -4
  8. package/src/ai/commands.js +2 -2
  9. package/src/ai/context.js +7 -2
  10. package/src/ai/deck-ai.js +4 -2
  11. package/src/ai/ia-check.js +127 -0
  12. package/src/ai/ia-config.js +2 -2
  13. package/src/ai/llm.js +5 -1
  14. package/src/ai/map-analysis-run.js +1 -1
  15. package/src/ai/quality.js +1 -1
  16. package/src/ai/video-generation.js +70 -25
  17. package/src/api-client.js +42 -10
  18. package/src/build.js +46 -14
  19. package/src/code-highlight.js +19 -2
  20. package/src/code-language.js +13 -0
  21. package/src/elements.js +39 -1
  22. package/src/export/pptx.js +7 -2
  23. package/src/export/shots.js +7 -2
  24. package/src/fiscal/normalize.js +19 -0
  25. package/src/fs-retry.js +37 -2
  26. package/src/import/office.js +5 -4
  27. package/src/layouts.js +104 -99
  28. package/src/lessons.js +1 -1
  29. package/src/library.js +7 -7
  30. package/src/map-analysis.js +4 -1
  31. package/src/map-config.js +10 -4
  32. package/src/map.js +21 -8
  33. package/src/mcp/server.js +17 -0
  34. package/src/motion.js +20 -6
  35. package/src/purpose.js +1 -1
  36. package/src/runtime/api-core.js +122 -11
  37. package/src/runtime/api-ui.js +2 -1
  38. package/src/runtime/base.css +88 -332
  39. package/src/runtime/fit.js +3 -2
  40. package/src/runtime/fonts/amatic-sc.css +3 -0
  41. package/src/runtime/fonts/bebas-neue.css +2 -0
  42. package/src/runtime/fonts/cabin-sketch.css +2 -0
  43. package/src/runtime/fonts/fraunces.css +3 -0
  44. package/src/runtime/fonts/gelasio.css +3 -0
  45. package/src/runtime/fonts/ibm-plex-mono.css +4 -0
  46. package/src/runtime/fonts/index.json +10 -1
  47. package/src/runtime/fonts/itim.css +2 -0
  48. package/src/runtime/fonts/montserrat.css +2 -0
  49. package/src/runtime/fonts/space-grotesk.css +2 -0
  50. package/src/runtime/map-background.js +91 -0
  51. package/src/runtime/map.js +41 -9
  52. package/src/runtime/runtime.js +81 -100
  53. package/src/runtime/skins/aurora-dev.css +39 -0
  54. package/src/runtime/skins/caderno.css +33 -0
  55. package/src/runtime/skins/cartaz.css +27 -0
  56. package/src/runtime/skins/infografico.css +29 -0
  57. package/src/runtime/skins/lousa.css +22 -0
  58. package/src/runtime/skins/musgo.css +42 -0
  59. package/src/runtime/skins/terminal-pro.css +33 -0
  60. package/src/runtime/vendor/MAPLIBRE-LEAFLET-LICENSE.txt +15 -0
  61. package/src/runtime/vendor/MAPLIBRE-LICENSE.txt +116 -0
  62. package/src/runtime/vendor/geo-contornos.json +1 -1
  63. package/src/runtime/vendor/maplibre-gl.css +1 -0
  64. package/src/runtime/vendor/maplibre-gl.js +825 -0
  65. package/src/runtime/vendor/maplibre-leaflet.js +234 -0
  66. package/src/runtime/vendor/maplibre-worker.js +10 -0
  67. package/src/studio/ai-chat-route.js +26 -7
  68. package/src/studio/assets/imagens/tour-mapa-botao.jpg +0 -0
  69. package/src/studio/assets/imagens/tour-mapa-editor.jpg +0 -0
  70. package/src/studio/command-approval.js +2 -3
  71. package/src/studio/demo-decks.js +4 -2
  72. package/src/studio/developer-starters.js +46 -0
  73. package/src/studio/export-jobs.js +86 -0
  74. package/src/studio/exporting.js +36 -18
  75. package/src/studio/feature-demos.js +144 -0
  76. package/src/studio/ia-routes.js +9 -0
  77. package/src/studio/layout-samples.js +9 -18
  78. package/src/studio/library-routes.js +7 -9
  79. package/src/studio/project.js +1 -0
  80. package/src/studio/public/about.js +68 -0
  81. package/src/studio/public/ai-settings.js +2 -2
  82. package/src/studio/public/app.js +43 -52
  83. package/src/studio/public/chat.js +5 -1
  84. package/src/studio/public/developer-authoring.css +12 -0
  85. package/src/studio/public/developer-authoring.js +306 -0
  86. package/src/studio/public/export-status.js +154 -0
  87. package/src/studio/public/generation-guide.js +42 -0
  88. package/src/studio/public/index.html +31 -10
  89. package/src/studio/public/library.css +48 -3
  90. package/src/studio/public/library.html +5 -1
  91. package/src/studio/public/library.js +150 -41
  92. package/src/studio/public/map-data.js +7 -3
  93. package/src/studio/public/map-editor.js +625 -236
  94. package/src/studio/public/map-settings.js +3 -1
  95. package/src/studio/public/slide-form.js +27 -29
  96. package/src/studio/public/style.css +56 -9
  97. package/src/studio/public/ui-icons.js +1 -1
  98. package/src/studio/server.js +29 -14
  99. package/src/studio/snapshot.js +8 -4
  100. package/src/studio/template-collections.js +1 -1
  101. package/src/studio/tour.js +89 -7
  102. package/src/themes.js +202 -0
  103. package/templates/cenario-e-ciencia.yaml +1 -21
  104. package/templates/ensaio-api.yaml +3 -3
  105. package/templates/cenario/Texto no cen/303/241rio.yaml" +0 -171
  106. package/templates/cenario/imagens/cidade.svg +0 -30
  107. package/templates/cenario/imagens/pessoa.svg +0 -15
package/README.md CHANGED
@@ -16,7 +16,7 @@ Ele vem com 11 temas (incluindo prata limpo e respirável, artesanal desenhado
16
16
  ```bash
17
17
  npm install -g sagadeck
18
18
  ```
19
- Requer **Node.js 18+** e **Chrome ou Edge** instalados (o PDF, o PNG e as conferências visuais usam o navegador).
19
+ Requer **Node.js 24+** e **Chrome ou Edge** instalados (o PDF, o PNG e as conferências visuais usam o navegador).
20
20
  É tudo Node: não precisa de Python. (O pacote do PyPI parou na 1.5.0.)
21
21
 
22
22
  ## Comece aqui
@@ -162,6 +162,7 @@ não precisa configurar coisa nenhuma, e o sagadeck não pede nada à internet p
162
162
  | serviço | para quê | padrão (sem configurar) |
163
163
  |---|---|---|
164
164
  | mapa de fundo | as ruas por baixo das camadas | OpenStreetMap |
165
+ | fundos claro e escuro | dados sobre terra e mar, sem a linha de fronteira no mar | OpenFreeMap (vetorial) |
165
166
  | endereço e coordenada | **Achar coordenadas** de uma planilha só com endereço | Nominatim (1 endereço por segundo) |
166
167
  | busca de lugares | achar cinemas, escolas, unidades de saúde… pelo nome do tipo | Overpass |
167
168
  | rotas | "seguir as ruas" ao desenhar, distância e tempo | OSRM (servidor de demonstração) |
@@ -181,10 +182,11 @@ em `keyEnv` (no servidor, por exemplo):
181
182
  { "rotas": { "provedor": "openrouteservice", "url": "https://api.openrouteservice.org", "keyEnv": "OPENROUTESERVICE_API_KEY" } }
182
183
  ```
183
184
 
184
- Os serviços públicos têm regras de uso que o sagadeck respeita sozinho: identifica cada pedido, mostra a atribuição
185
- "© colaboradores do OpenStreetMap", busca um endereço por segundo, guarda o que já achou e nunca baixa mapa fora da
186
- tela. Eles são para uso leve e não comercial; no trabalho, prefira o servidor de mapas da empresa ou um provedor com
187
- chave (os endereços se trocam em **Configurar mapa**). Antes de mandar os endereços de uma planilha sua para um
185
+ Os serviços públicos têm regras de uso que o sagadeck respeita sozinho: identifica os pedidos de dados, mostra as
186
+ atribuições do mapa, busca um endereço por segundo, guarda o que já achou e nunca baixa mapa fora da tela. O
187
+ [OpenFreeMap](https://openfreemap.org/) permite uso comercial e não exige cadastro ou chave. Os demais serviços
188
+ de demonstração servem para uso leve; para uma demanda maior, configure um provedor apropriado em **Configurar mapa**.
189
+ Os fundos claro e escuro também aceitam um estilo vetorial (JSON) ou tiles de um servidor próprio. Antes de mandar os endereços de uma planilha sua para um
188
190
  serviço de fora, o sagadeck pergunta.
189
191
 
190
192
  Se a rede barrar um serviço (autorização negada, proxy, bloqueio), o sagadeck faz **uma tentativa e para**: avisa
@@ -232,6 +234,13 @@ formato avisa para atualizar o sagadeck. Se um filtro de e-mail barrar a extens
232
234
  `sagadeck studio` sem arquivo abre a biblioteca: suas apresentações organizadas em tópicos, com capa, busca,
233
235
  lixeira (30 dias; o prazo se muda em Preferências) e o menu **⋯** de cada cartão (apresentar, renomear, duplicar, mover, baixar tudo/.sagadeck/PPTX/PDF).
234
236
 
237
+ Na lateral, **Demos oficiais** (com cadeado) guarda as apresentações do próprio SagaDeck, só leitura. Primeiro, as
238
+ demos de um assunto só, curtas: **Mapas** (mostrar, calcular e editar), **Programação** (código destacado e guiado,
239
+ código que a plateia roda, algoritmo animado, Git a dois, diagramas) e **APIs com curl** (a anatomia de um curl e
240
+ chamadas ao vivo com o curl para copiar, rodando na API de mentira do Studio). Depois, o **Conheça o SagaDeck** (um
241
+ slide por recurso, cada um com a frase para pedir à IA) e as outras demos de recursos. Elas abrem em prévia, sem criar arquivo; editar cria uma cópia sua em Modelos. O Conheça o SagaDeck
242
+ aparece também como o primeiro cartão de Recentes e Todas.
243
+
235
244
  **Nova apresentação** tem três caminhos: *Descrever com IA* (o assunto, quanto tempo você tem, que vira o número de
236
245
  slides, o estilo e, se quiser, material de apoio: PDF, Word, PowerPoint, Excel ou um link), *A partir de um arquivo
237
246
  ou link* (o mesmo, começando pelo anexo) e *Modelo pronto* (coleções, estilos, demonstrações e exemplos, com filtro).
@@ -276,6 +285,12 @@ navegador, mas não para editar.
276
285
 
277
286
  ## Slides para devs: API ao vivo
278
287
 
288
+ Na biblioteca, **Programação** e **APIs com cURL** abrem a criação com exemplos de pedidos, código colado,
289
+ anexos técnicos e prévia do briefing. Também há duas bases curtas para começar **sem IA**.
290
+ No editor, **Início ou Inserir → Código / cURL** transforma conteúdo colado em código, explicação guiada
291
+ ou requisição de API. Selecione linhas para criar as etapas; Bash/cURL, JSON e SQL têm realce offline.
292
+ Os temas **Terminal Pro** e **Aurora Dev**, em Design, trazem código legível e capas com rede animada.
293
+
279
294
  O layout `api` é um slide tipo Postman: mostra o pedido (URL, corpo, cabeçalhos) e o código equivalente
280
295
  (curl, Python e Python comentado), e o botão **Executar** roda o pedido de verdade na frente da plateia:
281
296
  síncrono, polling com linha do tempo, streaming, upload, token (JWT decodificado), embeddings, TTS/STT e
@@ -284,9 +299,11 @@ token nunca vai para a página.
284
299
 
285
300
  Para ver funcionando sem configurar nada:
286
301
 
287
- - **Biblioteca → Nova → Exemplo: aula de APIs ao vivo.** Cria um deck com um slide de cada tipo, que roda no
288
- ambiente **ENSAIO**: uma API de mentira que o Studio sobe sozinho (sem VPN, sem chave). Apresente e clique
289
- em **Executar**. (`sagadeck ensaio-api` faz o mesmo pela linha de comando.) O deck também traz um slide
302
+ - **Demos oficiais → APIs com curl.** As chamadas mais comuns (corpo, consulta na URL, token, polling, streaming),
303
+ cada uma com o curl, rodando no ambiente **ENSAIO**: uma API de mentira que o Studio sobe sozinho (sem VPN, sem
304
+ chave). Apresente e clique em **Executar**.
305
+ - **`sagadeck ensaio-api`.** O ensaio completo, com um slide de cada tipo (upload, OCR, embeddings, voz, tempo
306
+ real), no mesmo ambiente ENSAIO. O deck também traz um slide
290
307
  **OpenRouter (real)** com `nvidia/nemotron-3-super-120b-a12b:free`. Para usá-lo, defina `OPENROUTER_API_KEY` no
291
308
  processo que inicia o Studio e escolha o ambiente **OPENROUTER** no selo do slide. A chave fica fora do
292
309
  deck; no PowerShell, por exemplo, defina `$env:OPENROUTER_API_KEY = "sua-chave"` antes de iniciar o
package/SKILL.md CHANGED
@@ -11,7 +11,7 @@ O sagadeck gera apresentações profissionais a partir de um arquivo YAML, ofere
11
11
 
12
12
  Quando a pessoa pede para instalar o sagadeck e deixar pronto:
13
13
 
14
- 1. `npm install -g sagadeck` (Node 18+; não precisa de Python).
14
+ 1. `npm install -g sagadeck` (Node 24+; não precisa de Python).
15
15
  2. `sagadeck studio`: o navegador abre sozinho em **http://127.0.0.1:3517** (é também a primeira linha que o
16
16
  comando escreve; `--sem-navegador` não abre). **O Studio é a interface do sagadeck**: biblioteca, editor e chat com
17
17
  IA. O terminal fica aberto enquanto ela usa.
@@ -20,7 +20,12 @@ Quando a pessoa pede para instalar o sagadeck e deixar pronto:
20
20
  4. Para a IA, mostre onde configurar: **Configurar IA** no alto da biblioteca (ou **IA desligada** no editor):
21
21
  **Usar a recomendação** (OpenRouter com modelos que funcionam), a chave, Testar e Salvar. A configuração fica em `~/.sagadeck/ia.json`; nunca grave a chave no código nem
22
22
  na pasta das apresentações.
23
- 5. As apresentações moram na biblioteca (`SAGADECK_HOME`, senão Documentos\sagadeck no Windows e `~/sagadeck` fora
23
+ 5. **Para saber o que de IA funciona**, rode `sagadeck ia-check` (ou a ferramenta `sagadeck_ia_check` do MCP) antes de
24
+ prometer qualquer recurso de IA: testa texto, visão, geração de imagem, pesquisa e vídeo com chamadas de verdade, em
25
+ paralelo, em segundos. Cada recurso sai `OK`, `FALHOU` (com o motivo), `SEM CONFIG` ou, no vídeo, `SEM PROVA`: por
26
+ padrão o vídeo não é gerado (é cobrado); só `--video-real` prova que funciona, e só rode quando a pessoa pedir.
27
+ `--json` para ler a saída; o comando sai com código 1 se algo falhou.
28
+ 6. As apresentações moram na biblioteca (`SAGADECK_HOME`, senão Documentos\sagadeck no Windows e `~/sagadeck` fora
24
29
  dele). Não crie decks em outra pasta.
25
30
 
26
31
  ## Comandos Disponíveis
@@ -30,6 +35,7 @@ Quando a pessoa pede para instalar o sagadeck e deixar pronto:
30
35
  | `sagadeck studio [deck.yaml] [--port=3517]` | **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**. |
31
36
  | `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. |
32
37
  | `sagadeck search "<termo>"` | **Pesquisa web sem bloqueio (DuckDuckGo)**: busca dados reais, números e referências confiáveis para enriquecer os slides. |
38
+ | `sagadeck ia-check [--rapido] [--so=texto,visao,imagem,pesquisa,video] [--video-real] [--json]` | **Testa a IA configurada sem tela**: cada recurso com uma chamada de verdade, todos ao mesmo tempo; `--rapido` pula imagem e vídeo; `--video-real` gera um clipe curto (cobrado). Código de saída 1 se algo falhou |
33
39
  | `sagadeck mcp` | **Servidor MCP**: expõe ferramentas padronizadas (JSON-RPC) para IDEs agênticos criarem, lerem, pesquisarem, fiscalizarem e editarem decks. |
34
40
  | `sagadeck new "<nome>" [--topic=T] [--theme=prata]` | cria um deck de exemplo na biblioteca |
35
41
  | `sagadeck build deck.yaml` | compila `deck.html` standalone (abre no navegador; tecla P = modo apresentador) |
@@ -107,6 +113,7 @@ Ferramentas disponíveis no MCP:
107
113
  - `sagadeck_autofix_deck`: executa a auto-cura geométrica no arquivo YAML.
108
114
  - `sagadeck_build_html`: compila o arquivo `.html` interativo.
109
115
  - `sagadeck_launch_studio`: abre o SagaDeck Studio na web.
116
+ - `sagadeck_ia_check`: testa a IA configurada (texto, visão, imagem, pesquisa, vídeo), em paralelo, e diz o que funciona.
110
117
 
111
118
  ### 2. Via Linha de Comando (CLI)
112
119
  O agente no terminal deve seguir o fluxo:
@@ -151,6 +158,6 @@ Para apresentações de alto impacto sem "muralhas de texto":
151
158
 
152
159
  ## Recursos recentes para autoria por IA
153
160
 
154
- 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.
161
+ Consulte `docs/REFERENCIA.md` para os contratos atuais de `science` (KaTeX, até cinco equações, Plotly 2D/3D), `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.
155
162
 
156
163
  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.
package/bin/sagadeck.js CHANGED
@@ -76,6 +76,11 @@ const HELP = `sagadeck — YAML -> apresentação (HTML animado + PowerPoint edi
76
76
  sagadeck autofix <deck.yaml> [--out=pasta] auto-corrige sobreposições, margens e excesso de texto no YAML
77
77
  sagadeck diff <a.yaml> <b.yaml> [--json] o que entrou, saiu, mudou e andou entre dois decks (por uid)
78
78
  sagadeck enxugar <deck.yaml> [--fix] palavras por slide contra o limite do material (--fix: excedente para as notas)
79
+ sagadeck ia-check [--rapido] [--so=texto,visao,imagem,pesquisa,video] [--video-real] [--json]
80
+ testa a IA configurada, sem tela: cada recurso com uma chamada de verdade, todos ao
81
+ mesmo tempo, cada resultado assim que chega. --rapido pula imagem e vídeo; vídeo, por
82
+ padrão, só confere chave e catálogo; --video-real gera um clipe curto (é cobrado).
83
+ Sai com erro se algo falhou (bom para agentes e CI); --json para máquina
79
84
  sagadeck mcp inicia o servidor MCP para IDEs agênticos (Cursor, Claude Code, Cline)
80
85
  sagadeck watch <deck.yaml> recompila o HTML sempre que o YAML mudar
81
86
  sagadeck themes [--out=pasta] gera uma vitrine com todos os temas
@@ -490,6 +495,24 @@ async function main() {
490
495
  }
491
496
  break;
492
497
  }
498
+ case "ia-check": case "testar-ia": {
499
+ const { iaCheck, CHECKS } = await import("../src/ai/ia-check.js");
500
+ const only = flags.so ? String(flags.so).split(",").map((x) => x.trim().normalize("NFD").replace(/[̀-ͯ]/g, "")).filter(Boolean) : null;
501
+ const bad = (only || []).filter((x) => !CHECKS[x]);
502
+ if (bad.length) { console.error(`Recurso desconhecido: ${bad.join(", ")}. Vale: ${Object.keys(CHECKS).join(", ")}`); process.exit(2); }
503
+ const json = !!flags.json, log = json ? (...a) => console.error(...a) : (...a) => console.log(...a);
504
+ const SELO = { ok: "OK ", falhou: "FALHOU ", nao_configurado: "SEM CONFIG", sem_prova: "SEM PROVA " };
505
+ const seg = (ms) => `${(ms / 1000).toFixed(1).replace(".", ",")} s`;
506
+ log(`Testando a IA em paralelo${flags["video-real"] ? " (vídeo: gera um clipe de verdade, é cobrado)" : ""}…`);
507
+ const rep = await iaCheck({ only, rapido: !!flags.rapido, videoReal: !!flags["video-real"], videoTimeoutS: Number(flags["video-prazo"] || 600),
508
+ onResult: (r) => log(` ${SELO[r.status] || r.status} ${r.nome.padEnd(18)} ${seg(r.ms).padStart(7)} ${r.modelo ? r.modelo + " · " : ""}${r.detalhe || ""}${r.arquivo ? ` · ${r.arquivo}` : ""}`) });
509
+ const n = (st) => rep.resultados.filter((r) => r.status === st).length;
510
+ log(`${n("ok")} de ${rep.resultados.length} funcionando${n("falhou") ? `, ${n("falhou")} com falha` : ""}${n("nao_configurado") ? `, ${n("nao_configurado")} sem configuração` : ""}${n("sem_prova") ? `, ${n("sem_prova")} sem prova (use --video-real)` : ""} · ${seg(rep.ms)}`);
511
+ if (json) console.log(JSON.stringify(rep, null, 2));
512
+ // sai na hora: conexões que o provedor deixa abertas seguravam o processo por dezenas de segundos
513
+ process.stdout.write("", () => process.exit(rep.ok ? 0 : 1));
514
+ break;
515
+ }
493
516
  case "mcp": {
494
517
  const { runMCPServer } = await import("../src/mcp/server.js");
495
518
  runMCPServer();