sagadeck 1.8.0 → 1.9.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 (92) hide show
  1. package/README.md +19 -8
  2. package/SKILL.md +10 -3
  3. package/bin/sagadeck.js +23 -0
  4. package/docs/ANDAMENTO.md +367 -7
  5. package/docs/PLANO-MELHORIAS.md +180 -0
  6. package/docs/REFERENCIA.md +131 -110
  7. package/package.json +33 -2
  8. package/src/ai/commands.js +2 -2
  9. package/src/ai/deck-ai.js +1 -1
  10. package/src/ai/ia-check.js +127 -0
  11. package/src/ai/ia-config.js +2 -2
  12. package/src/ai/llm.js +5 -1
  13. package/src/ai/map-analysis-run.js +1 -1
  14. package/src/ai/quality.js +1 -1
  15. package/src/ai/video-generation.js +70 -25
  16. package/src/build.js +46 -14
  17. package/src/elements.js +39 -1
  18. package/src/export/pptx.js +7 -2
  19. package/src/export/shots.js +7 -2
  20. package/src/fiscal/normalize.js +19 -0
  21. package/src/fs-retry.js +37 -2
  22. package/src/import/office.js +5 -4
  23. package/src/layouts.js +104 -99
  24. package/src/lessons.js +1 -1
  25. package/src/library.js +7 -7
  26. package/src/map-analysis.js +4 -1
  27. package/src/map-config.js +10 -4
  28. package/src/map.js +21 -8
  29. package/src/mcp/server.js +17 -0
  30. package/src/motion.js +20 -6
  31. package/src/purpose.js +1 -1
  32. package/src/runtime/base.css +88 -332
  33. package/src/runtime/fit.js +3 -2
  34. package/src/runtime/fonts/amatic-sc.css +3 -0
  35. package/src/runtime/fonts/bebas-neue.css +2 -0
  36. package/src/runtime/fonts/cabin-sketch.css +2 -0
  37. package/src/runtime/fonts/fraunces.css +3 -0
  38. package/src/runtime/fonts/gelasio.css +3 -0
  39. package/src/runtime/fonts/ibm-plex-mono.css +4 -0
  40. package/src/runtime/fonts/index.json +10 -1
  41. package/src/runtime/fonts/itim.css +2 -0
  42. package/src/runtime/fonts/montserrat.css +2 -0
  43. package/src/runtime/fonts/space-grotesk.css +2 -0
  44. package/src/runtime/map-background.js +91 -0
  45. package/src/runtime/map.js +41 -9
  46. package/src/runtime/runtime.js +81 -100
  47. package/src/runtime/skins/caderno.css +33 -0
  48. package/src/runtime/skins/cartaz.css +27 -0
  49. package/src/runtime/skins/infografico.css +29 -0
  50. package/src/runtime/skins/lousa.css +22 -0
  51. package/src/runtime/skins/musgo.css +42 -0
  52. package/src/runtime/vendor/MAPLIBRE-LEAFLET-LICENSE.txt +15 -0
  53. package/src/runtime/vendor/MAPLIBRE-LICENSE.txt +116 -0
  54. package/src/runtime/vendor/geo-contornos.json +1 -1
  55. package/src/runtime/vendor/maplibre-gl.css +1 -0
  56. package/src/runtime/vendor/maplibre-gl.js +825 -0
  57. package/src/runtime/vendor/maplibre-leaflet.js +234 -0
  58. package/src/runtime/vendor/maplibre-worker.js +10 -0
  59. package/src/studio/assets/imagens/tour-mapa-botao.jpg +0 -0
  60. package/src/studio/assets/imagens/tour-mapa-editor.jpg +0 -0
  61. package/src/studio/command-approval.js +2 -3
  62. package/src/studio/demo-decks.js +4 -2
  63. package/src/studio/export-jobs.js +86 -0
  64. package/src/studio/exporting.js +36 -18
  65. package/src/studio/feature-demos.js +144 -0
  66. package/src/studio/ia-routes.js +9 -0
  67. package/src/studio/layout-samples.js +9 -18
  68. package/src/studio/library-routes.js +0 -9
  69. package/src/studio/project.js +1 -0
  70. package/src/studio/public/ai-settings.js +2 -2
  71. package/src/studio/public/app.js +41 -51
  72. package/src/studio/public/export-status.js +154 -0
  73. package/src/studio/public/index.html +13 -10
  74. package/src/studio/public/library.css +12 -3
  75. package/src/studio/public/library.html +1 -0
  76. package/src/studio/public/library.js +36 -14
  77. package/src/studio/public/map-data.js +7 -3
  78. package/src/studio/public/map-editor.js +625 -236
  79. package/src/studio/public/map-settings.js +3 -1
  80. package/src/studio/public/slide-form.js +18 -15
  81. package/src/studio/public/style.css +54 -9
  82. package/src/studio/public/ui-icons.js +1 -1
  83. package/src/studio/server.js +27 -12
  84. package/src/studio/snapshot.js +8 -4
  85. package/src/studio/template-collections.js +1 -1
  86. package/src/studio/tour.js +89 -7
  87. package/src/themes.js +154 -0
  88. package/templates/cenario-e-ciencia.yaml +1 -21
  89. package/templates/ensaio-api.yaml +3 -3
  90. package/templates/cenario/Texto no cen/303/241rio.yaml" +0 -171
  91. package/templates/cenario/imagens/cidade.svg +0 -30
  92. 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 22.13+** 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).
@@ -284,9 +293,11 @@ token nunca vai para a página.
284
293
 
285
294
  Para ver funcionando sem configurar nada:
286
295
 
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
296
+ - **Demos oficiais → APIs com curl.** As chamadas mais comuns (corpo, consulta na URL, token, polling, streaming),
297
+ cada uma com o curl, rodando no ambiente **ENSAIO**: uma API de mentira que o Studio sobe sozinho (sem VPN, sem
298
+ chave). Apresente e clique em **Executar**.
299
+ - **`sagadeck ensaio-api`.** O ensaio completo, com um slide de cada tipo (upload, OCR, embeddings, voz, tempo
300
+ real), no mesmo ambiente ENSAIO. O deck também traz um slide
290
301
  **OpenRouter (real)** com `nvidia/nemotron-3-super-120b-a12b:free`. Para usá-lo, defina `OPENROUTER_API_KEY` no
291
302
  processo que inicia o Studio e escolha o ambiente **OPENROUTER** no selo do slide. A chave fica fora do
292
303
  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 22.13+; 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();
package/docs/ANDAMENTO.md CHANGED
@@ -8,11 +8,138 @@ começar. Trabalho em curso vai para o GitHub (commit + push) a cada etapa, nunc
8
8
 
9
9
  ---
10
10
 
11
+ ## `sagadeck ia-check`: o que de IA funciona, sem tela — 12/10/2026 (branch `ia-check`)
12
+
13
+ Narumi: "o sagadeck está preparado para ser testado por um agente de IA (tipo o Copilot) sem o front-end?
14
+ Principalmente a execução dos modelos: preciso saber rapidamente quais features de IA funcionam". Não estava: só o
15
+ Testar do Configurar IA (uma pergunta de texto) e os testes ao vivo, que avaliam decisões e levam minutos.
16
+ - `src/ai/ia-check.js` (`iaCheck`): texto, visão, imagem, pesquisa e vídeo em paralelo, prazo próprio por recurso,
17
+ cada resultado avisado ao chegar. Visão com prova: um PNG de duas faixas de cor sorteadas, desenhado no código; o
18
+ modelo precisa dizer as cores na ordem, e modelo que não aceita imagem falha (o `chat` refazia sem a imagem e dava
19
+ "ok" sem ver). Pesquisa: a data de hoje. Imagem: confere o tipo pelos bytes e grava o arquivo.
20
+ - Vídeo: Narumi primeiro quis a geração real sempre, depois decidiu: padrão sem custo (catálogo, status `sem_prova`,
21
+ que não conta como ok) e `--video-real` quando ela pedir (clipe mais curto e leve que o modelo aceita, baixa e confere
22
+ o MP4).
23
+ - No caminho, a pergunta dela ("o teste usa a chave do OpenRouter? o setup dos modelos não é uma camada separada?")
24
+ expôs que o vídeo ficava fora da camada da IA: endereço do OpenRouter no código e chave só em variável. Agora
25
+ `videoSetup` (`video-generation.js`): com modelo de vídeo em Configurar IA (papel novo `video`), usa endereço, chave,
26
+ cabeçalhos e adaptador de lá; sem ele, o comportamento antigo (Oracle e quem já usava). A consulta e o download só
27
+ levam a chave ao mesmo servidor configurado (`videoApiURL`). O catálogo virou opcional.
28
+ - Saídas: `sagadeck ia-check` (`--rapido`, `--so`, `--video-real`, `--json`, código de saída), ferramenta MCP
29
+ `sagadeck_ia_check`, `POST /api/ia/check` (fora do multiusuário). SKILL.md manda o agente rodar antes de prometer
30
+ recurso de IA.
31
+ - Medido nesta máquina contra o OpenRouter: texto, visão e pesquisa em 2,3 s (`--rapido`); com imagem, 8 a 11 s.
32
+ - Teste `test/ia-check.test.js` (LLM falso e provedor de vídeo simulado: cada falha com o motivo, paralelismo, vídeo
33
+ pela camada da IA, linha de comando). Achado: o `spawnSync` do teste da linha de comando travava o LLM falso do
34
+ próprio processo, e o teste só passava por estourar o prazo; virou `execFile` e exige o motivo certo.
35
+ - Flake corrigido: `studio.test.js` procurava "ocr" no slide inteiro e o uid sorteado `s1ocrpz0ieql` derrubou a CI da
36
+ `main` depois do #191.
37
+
38
+ ## Demos de um assunto só: mapas, programação e APIs com curl — 11/10/2026 (branch `demos-recursos`)
39
+
40
+ Narumi: em vez do demo inchado que faz tudo (o Conheça o SagaDeck), uma demo só de mapas, uma de programação e uma de
41
+ curl. Entraram em `src/studio/feature-demos.js` (`demoDeck('mapas' | 'programacao' | 'apis')`, `FEATURE_DEMO_NAMES`)
42
+ e vão primeiro na vitrine e em Demos oficiais; o Conheça continua lá, depois delas.
43
+ - **Mapas** (tema oceano): reaproveita as demos de mapa do tour (`mapDemos`, agora exportada) em três partes:
44
+ mostrar, calcular, editar; a cópia leva as capturas do Editar mapa (`demoAssets`).
45
+ - **Programação** (tema musgo, terminal de cenas na capa): código destacado, guiado, consulta, código explorável,
46
+ algoritmo, dois terminais, duelo de commits, code review, diagrama de sequência e rede explorável.
47
+ - **APIs com curl** (tema wine): a anatomia de um curl (código guiado), chamadas ao vivo abertas na aba curl (POST,
48
+ GET com consulta, com token, polling, streaming) na API de mentira do Studio (ENSAIO), as opções do dia a dia em
49
+ cartões que viram e o aviso do token.
50
+ - Teste: `test/demos-recursos.test.js` (montam sem aviso, cada uma só do seu assunto, e cada chamada da de curl
51
+ funciona contra a API de mentira); a ordem nova da vitrine em `library-ui.test.js`.
52
+ - **Revisão de todas as demos** (Narumi: "mantenha só o que fizer sentido"). Ficam na vitrine e em Demos oficiais:
53
+ mapas, programação, APIs com curl, Conheça o SagaDeck, aula de hidráulica, aula de algoritmos e diagramas vivos.
54
+ Saíram: **Explore uma ideia** ("Uma pergunta, vários caminhos", não demonstrava nada claro), **Novidades** (colcha
55
+ de retalhos; o slide da planilha dependia de um arquivo que a prévia não tem, e a aba Arquivos aparecia vazia),
56
+ **Material de consulta** e **Recursos avançados** (quase iguais, com cartões genéricos; a consulta está na de
57
+ programação) e **Aula de APIs ao vivo** (fica uma demo de API só, a de curl; o ensaio completo continua no
58
+ `sagadeck ensaio-api`). Os decks dessas demos continuam no código porque os testes os usam como material
59
+ (código denso, arquivos do projeto, exploração); só não aparecem mais. O teste de ponta a ponta da vitrine com
60
+ o ENSAIO agora abre a de curl, vira cópia e executa corpo, consulta e token no Studio.
61
+
62
+ ## Temas de infográfico, cartão que vira e botão + — 11/10/2026 (branch `temas-cartoes`, sobre `tema-musgo`)
63
+
64
+ Pedido da Narumi, com prints de modelos de infográfico interativo: uma variante do musgo com outra paleta e os
65
+ visuais dos prints, com destaque para o cartão que gira no clique e mostra o verso. Entrou:
66
+ - **`wine`**: o musgo em vinho (vermelho-rosado, rosé, vermelho forte só no detalhe). Usa a pele do musgo por
67
+ `skin: "musgo"` (o `build.js` lê a pele do outro e troca o seletor); fontes em `MUSGO_FACES`.
68
+ - **`caderno`** (visual thinking: Amatic SC + Gelasio, cartões com moldura pastel, rabiscos de ícones Lucide como
69
+ máscara), **`lousa`** (giz: Cabin Sketch + Itim), **`cartaz`** (protesto: Bebas Neue em faixas vermelhas tortas) e
70
+ **`infografico`** (dados chapados: Bebas Neue + Montserrat). Fontes OFL em `vendor-fonts.mjs`.
71
+ - **Cartão que vira** (`flip` no cartão; `back` já era o Voltar da navegação e o verificador de links lia o verso como destino; `elements.js` `flipCard`, `base.css`, `runtime.js`): frente e verso na mesma
72
+ célula, clique/Enter gira, sair do slide desvira; exportação mostra a frente.
73
+ - **Botão + com balão** (`pop` em qualquer lugar; `more` no marco da linha do tempo): abre o balão e escurece o resto
74
+ com uma sombra enorme em volta do botão; um de cada vez, fecha fora e ao trocar de slide.
75
+ - **Defeito achado:** o ajuste para caber (`fit.js`) via o texto do verso "por cima" do da frente e encolhia o slide
76
+ inteiro; verso e balão saem dessa conta.
77
+ - Teste do arranjo único por tema aceita o tema irmão (`skin`). Testes: `test/temas-infografico.test.js`.
78
+
79
+ ## Tema musgo, faixa que corre e terminal em cenas — 11/10/2026 (branch `tema-musgo`)
80
+
81
+ Pedido da Narumi: trazer para o sagadeck o visual de uma página que ela adorou (um site de "segundo cérebro" gerado
82
+ por outro modelo): tema, cores, fontes, botões, o terminal que digita os `curl`, a faixa que fica correndo e o
83
+ separador das seções. Entrou:
84
+ - **Tema `musgo`** (`src/themes.js`, `src/runtime/skins/musgo.css`): verde quase preto com grão, âmbar e sálvia;
85
+ Fraunces (com tamanho óptico e itálico de verdade), Space Grotesk e IBM Plex Mono, embutidas (OFL, `vendor-fonts.mjs`
86
+ agora aceita estilo itálico). PPTX com Georgia, Segoe UI e Cascadia Mono. Capa e seção com grade de pontos que some
87
+ nas bordas, luz âmbar na capa, chapéu com fio âmbar, destaque do título em âmbar itálico (sem marca-texto), seção
88
+ como separador (número entre fios na linha do chapéu, título grande embaixo), cartões vazados que sobem no mouse,
89
+ números em monoespaçada, marcador em losango, código em janela e botões âmbar.
90
+ - **Decisão:** no musgo o tom `accent` (o padrão da seção) é escuro com detalhe em âmbar; a página chapada de âmbar
91
+ destoava do original.
92
+ - **Faixa que corre** (`ticker`, `src/build.js` + `base.css`): só na capa; automática nos temas com `ticker: true`
93
+ (por enquanto o musgo), com os títulos das seções (ou dos slides, se houver menos de 3 seções); `ticker: [..]` em
94
+ qualquer tema; `ticker: false` desliga. Separador desenhado em CSS (losango), parada sem movimento e na exportação.
95
+ - **`motion: {type: console}`** (`src/motion.js`): janela com três bolinhas, legenda e contador; cada cena digita o
96
+ comando e revela a saída linha a linha, segura a leitura e passa para a próxima. Prompt, cursor e seta em CSS
97
+ (regra de não usar caractere como ícone). Parado, mostra a primeira cena completa.
98
+ - **`ambient: rede`** (`runtime.js`, `mountAmbientNet`): nós à deriva que se ligam por proximidade, num canvas no
99
+ tamanho lógico do slide, nas cores do tom; anda só no slide atual, um quadro parado sem movimento/exportação. O tema
100
+ pode pôr na capa sozinho (`coverAmbient`, o musgo põe); `ambient: false` tira. Também no formulário do Studio.
101
+ - Testes: `test/tema-musgo.test.js`. Referência atualizada (tema, `ticker`, `console`, `rede`).
102
+
103
+ Fica para depois, se ela pedir: o efeito de "decodificar" a palavra em destaque do título da capa (trocar letras
104
+ mexe na largura e na quebra das linhas; precisa de um jeito que não faça o título pular).
105
+
106
+ ## 11/10/2026 — Fases 0+1 do plano de melhorias (branch `arena/349f2d88-sagadeck`)
107
+
108
+ Veio de uma avaliação do repositório pedida pela Narumi: o plano está em `docs/PLANO-MELHORIAS.md`
109
+ (criado antes desta etapa; continua valendo para as fases 2+). Entrou o que é seguro e não muda
110
+ comportamento do gerador:
111
+
112
+ - **Suíte verde em qualquer máquina**: seis testes que exercitam o navegador por dentro (foco guiado,
113
+ `materializeImages` com `image_ref`, "ver o material", rótulos do redesenho) falhavam fora do CI, que
114
+ tem Chrome; agora pulam com o aviso dos testes de UI (`skipWithoutBrowser` em `test/helpers.js`).
115
+ - **`engines` corrigido**: era `>=18` e não se cumpria (`pdfjs-dist` 6 pede 22.13+/24, `playwright-core`
116
+ pede 20+). Agora `>=22.13.0`, README e SKILL a par; CI testa Node 22 e 24 no Linux e no Windows.
117
+ - **Audit de dependências na CI** (informativo) + **Dependabot semanal** agrupado; vulnerabilidade de
118
+ `image-size` (dependência morta declarada pelo pptxgenjs — o bundle nunca a importa) resolvida com
119
+ `overrides` para 2.0.4: audit em zero, suíte passando, nenhum código do gerador tocado.
120
+ - `CHANGELOG.md` começado (o histórico fino continua sendo este diário), `.editorconfig`, e
121
+ `keywords`/`homepage`/`bugs` no `package.json`.
122
+ - **Flake do CI no Windows consertado, e era mais sério do que parecia** ("mover (pasta inteira...), renomear
123
+ e duplicar"): a CI desta branch começou a falhar às vezes no Windows e o passo de falha do workflow (novo)
124
+ apontou o teste; o bloco de erro trouxe `exitCode 3221226505` (0xC0000409, morte nativa). Causa-raiz:
125
+ `fs.cpSync`/`fs.rmSync` recursivos têm código nativo que no Windows mata o processo ou copia/apaga NADA
126
+ com caminho acentuado (nodejs/node#54476, #61878 — "cópia", "Relatório" são a norma aqui). Só apareceu
127
+ porque a matrix nova testa Node 22 no Windows (main só testava 24, que passa por sorte de versão).
128
+ Conserto: `copyRetry`/`removeRetry` caminham na mão (readdir/copyFile/unlink/rmdir) e toleram o
129
+ travamento de um instante; testes de trava simulada (falham sem o conserto) e trava estrutural contra
130
+ `fs.cpSync`/`fs.rmSync` recursivo cru. Também protege a Studio de morte súbita ao duplicar/apagar deck.
131
+
132
+ O que ficou para depois (mesmo plano, fases 2+): lint/format com adoção gradual, `@ts-check` nos módulos
133
+ puros, extração dos prompts para arquivos, divisão do `app.js` do Studio, CI paralela por família de
134
+ teste, redimensionador de imagem sem navegador.
135
+
136
+ ---
137
+
11
138
  ## Próximas frentes (levantadas em 08/10/2026, ainda não começadas)
12
139
 
13
140
  **Para quem pega isto numa sessão nova, sem a conversa de origem.** O projeto é o **sagadeck**:
14
141
  - Repositório GitHub `naruminho/sagadeck`, clonado em `C:\Users\narum\src\sagadeck`, branch `main`.
15
- - Publicado no npm como `sagadeck` (1.7.1: a IA diz por que o `ia.json` não serve e, no servidor, não mostra a configuração; o PyPI parou na 1.5.0).
142
+ - Publicado no npm como `sagadeck` (1.8.0: mapas ao vivo, editor, dados e análises pela IA; o PyPI parou na 1.5.0).
16
143
  - Ferramenta Node (ESM) que transforma apresentações escritas em YAML em HTML/PPTX.
17
144
  - Tem um editor web, o Studio (`sagadeck studio`, porta 3517).
18
145
  - Tem uma IA embutida (provedor direto, configurado em `~/.sagadeck/ia.json` pela tela Configurar IA) que cria e edita decks, inclusive a partir de PDFs de
@@ -42,7 +169,7 @@ datadas abaixo). O resto fica para depois e só entra se for pedido. Antes de co
42
169
  ler o conteúdo força o download. Conferir se listar a biblioteca (`openLibrary`, `/api/library`) lê o YAML de
43
170
  cada deck; se lê, listar só pelo nome/metadado e abrir o conteúdo sob demanda.
44
171
 
45
- ## Frente: mapa (planejada em 10/10/2026, em andamento)
172
+ ## Frente: mapa (planejada e publicada em 10/10/2026, versão 1.8.0)
46
173
 
47
174
  Pedido de Narumi, depois de muita conversa. **Leia antes de mexer.** Recurso de nicho, mas completo: mostrar e
48
175
  explicar algo geográfico (pontos de interesse de qualquer tipo, linhas, áreas), com a IA montando a partir de dados.
@@ -138,17 +265,250 @@ Não é um QGIS: análise pesada fica lá; aqui é apresentar bem, com contas si
138
265
  de altura zero). Testes: `test/map-analysis.test.js` e o ao vivo "qual loja fica mais perto de cada pedido" (pede
139
266
  `mais_proximo`).
140
267
 
141
- **Publicação 1.8.0 (retomada em 10/10):** versão preparada em `package.json` e lockfile, incluindo as cinco entregas
142
- e o Conheça o SagaDeck. O #178 já foi mergeado; falta concluir a CI e mergear o #179, conferir a CI da `main`, criar a
143
- release e atualizar a instalação local e o Oracle. No Oracle, o ambiente e os dois `mapa.json` já estão preparados
144
- com `OPENROUTESERVICE_API_KEY` (modo 600, dono de cada serviço); os serviços aguardam o código da release para
145
- reiniciar. Os quatro testes de mapa com o modelo real passaram novamente. Suíte completa da 1.8.0: 982 testes,
268
+ **Publicação 1.8.0 (concluída em 10/10):** as cinco entregas e o Conheça o SagaDeck entraram na `main` pelos
269
+ PRs #178 e #179, nessa ordem, ambos com CI verde no Ubuntu e no Windows. A CI da `main` (run 38055530334)
270
+ também passou nas duas máquinas no commit `1b05819`. A release `v1.8.0` aponta para esse commit; o workflow
271
+ `publish` (run 38057571606) publicou `sagadeck@1.8.0` no npm com provenance.
272
+
273
+ O registro passou a informar `latest: 1.8.0`; esta máquina foi atualizada com `npm install -g sagadeck@1.8.0`.
274
+ O Studio anterior da porta 3517 foi verificado e substituído pelo da versão nova, na mesma porta.
275
+ Conferido em `http://127.0.0.1:3517/api/instance`: versão 1.8.0, biblioteca local; IA configurada,
276
+ configuração do mapa editável e nenhum aviso de código antigo.
277
+
278
+ No Oracle, por decisão de Narumi, **produção permanece na 1.7.1**, em `/opt/sagadeck`, porta 3517, sem reinício.
279
+ O dev tem código próprio em `/opt/sagadeck-dev`, branch local `dev`, agora na tag `v1.8.0`; somente
280
+ `sagadeck-dev.service` foi reiniciado, na porta 3518. Versão e configuração reservada conferidas pela API;
281
+ IA configurada e arquivos do mapa servidos. A rota real pelo OpenRouteService já havia sido conferida nessa
282
+ mesma versão pelo Claude. O ambiente e os dois `mapa.json` usam `OPENROUTESERVICE_API_KEY`, com modo 600 e
283
+ dono de cada serviço. A separação do código do dev e o guia do mapa no servidor entraram pelos PRs #100 e #99
284
+ do oráculo, respectivamente; não precisam ser refeitos.
285
+
286
+ A CI intermediária da `main`, após o #178, teve um erro de recursos do navegador no Windows
287
+ (`ERR_NO_BUFFER_SPACE`, no teste da faixa de ferramentas). O teste isolado local passou; a repetição dessa CI
288
+ foi cancelada pela entrada do #179. As CIs posteriores do #179 e da `main` passaram completas nas duas máquinas,
289
+ sem filtros de erro nem alterações para esconder a falha.
290
+
291
+ Os quatro testes de mapa com o modelo real passaram novamente. Suíte completa da 1.8.0: 982 testes,
146
292
  956 passaram, 26 pulados, zero falhas; mapa/editor/exportação/leitores e regras: 22 testes direcionados passaram.
147
293
  Na revisão com cliques reais, a planilha cobria o mapa inteiro e a legenda interceptava um ponto no enquadramento
148
294
  automático. Corrigidos: a planilha fica ao lado do mapa (sugestões de gráfico recolhidas, com botão para abrir), a
149
295
  seleção funciona nas duas direções e o enquadramento reserva espaço para a legenda. O teste reproduziu a obstrução
150
296
  antes da correção e agora clica no ponto e na célula, sem disparar eventos sintéticos.
151
297
 
298
+ ## Assistente em destaque — 11/10/2026
299
+
300
+ Pedido de Narumi: o chat não deve ficar perdido entre as propriedades. O acesso ao Assistente fica separado
301
+ do grupo Formatar/Propriedades/Variáveis, por último à direita, com o nome sempre visível e aberto por padrão.
302
+ Os controles de edição mantêm nomes acessíveis e dicas; esse arranjo preserva espaço para o slide. Quem fechou
303
+ o painel continua sendo respeitado. O atalho flutuante aparece para reabrir o painel fechado; com ele aberto,
304
+ o botão fixo já dá acesso ao Assistente, inclusive a avisos de novas respostas.
305
+
306
+ Teste reproduziu a ordem antiga e passou com a nova: clique real nas quatro opções em temas claro/escuro e
307
+ larguras 1280, 1024 e 390, sem corte do cabeçalho, nome do Assistente visível, seleção acessível correta,
308
+ rascunho preservado, ordem de teclado, troca de slide mantendo o chat e apresentação salva intacta.
309
+ Os testes do atalho e da faixa/painel também passaram, com zero erros de JavaScript.
310
+ Conferência visual da interface real em tela grande e celular, nos dois temas: campo e envio acessíveis, sem erros de JavaScript. Suíte completa: 1001 testes, 975 passaram, 26 pulados, zero falhas e encerramento normal em 28 min 18 s. A CI Ubuntu/Windows precede o merge. Pasta oficial, branch `codex/assistente-visivel`.
311
+
312
+ ## Correções visuais da demo — 11/10/2026
313
+
314
+ Pedidos de Narumi por capturas de tela: rótulos brancos cobriam o mapa; fórmula de Reynolds em cima do resultado;
315
+ capital em reais aparecia como código LaTeX no exercício resolvido.
316
+
317
+ - Rótulos do mapa têm fundo transparente, sem caixa ou sombra retangular, com contorno leve só no texto. O estilo
318
+ tem prioridade sobre o CSS do Leaflet, que carrega depois; o rótulo não intercepta cliques. Conferido em temas
319
+ claro e escuro, com os nomes preservados e clique real no ponto.
320
+ - A calculadora reserva altura e respiro para a fração, sem sobrepor o resultado. Os nomes das faixas ficam visíveis
321
+ abaixo da régua, mantendo suas posições e as pontas arredondadas. No PPTX, controles deslizantes são capturados
322
+ com trilho e marcador: antes viravam retângulos brancos, sem representar o valor atual. A linha do resultado
323
+ também usa o tamanho do número: o PPTX antes reservava 9,6 pt para uma fonte de 38 pt, causando sobreposição.
324
+ O teste confere a altura exportada e preserva o resultado como texto editável; o ajuste de altura vale também
325
+ para o modo compacto. A suíte apontou um excesso de 3 px no exemplo com oito resultados; o modo compacto usa
326
+ uma linha do tamanho da fonte, sem a folga extra do modo comum, e o teste existente de controles/explicação
327
+ visíveis passou novamente.
328
+ - A conferência da demo completa no PPTX revelou outra causa da régua desformatada: o exportador agrupava filhos
329
+ posicionados como texto de uma única caixa. Agora cada faixa e cada rótulo conserva sua própria posição e fundo;
330
+ as três cores e os dois nomes editáveis são conferidos no arquivo real, comparando com as posições do navegador.
331
+ O teste falhou com o agrupamento antigo e passou após a correção, junto com os demais testes de PowerPoint.
332
+ - Unidades que já contêm `\$` ou `\%` não são escapadas duas vezes pelo motor. O exemplo de juros mantém seus
333
+ dados, etapas e resposta; a moeda compila em vez de aparecer como erro vermelho. Apresentações pessoais não foram
334
+ editadas.
335
+
336
+ Regressões reproduzidas antes das correções: fundo opaco do rótulo, sobreposição/corte na calculadora, unidade já
337
+ escapada inválida e ausência dos controles no PPTX. Testes direcionados passaram. Conferência visual dos modelos
338
+ e PPTX real de três slides: zero erros de JavaScript, dois controles completos no arquivo. Suíte completa concluída:
339
+ 999 testes, 973 passaram, 26 pulados, zero falhas, encerramento normal em 21 min 13 s. A suíte final, incluindo
340
+ a régua, concluiu com 1000 testes: 974 passaram, 26 pulados, zero falhas, encerramento normal em 22 min 11 s.
341
+ A demo completa atualizada foi gerada pelo Studio em 61 s e baixada com 85 slides; conferidas as três faixas
342
+ coloridas e os dois nomes em caixas editáveis separadas no PPTX. O PR #184 segue a CI Ubuntu/Windows antes do
343
+ merge e atualização local/dev. A CI da main 38135963264 teve erro `ERR_NO_BUFFER_SPACE` do Chrome no Windows no teste
344
+ da aula de APIs; o fluxo foi concluído, mas a exigência de zero erros apontou o erro de rede. O teste passou
345
+ novamente nesta máquina e o job do Windows foi reexecutado, sem relaxar a verificação: concluiu verde em 29 min 51 s,
346
+ junto com o Ubuntu verde em 23 min 55 s. Produção do Oracle fica na 1.7.1.
347
+
348
+ ## Exportação com progresso e download posterior — 10/10/2026
349
+
350
+ Pedido: ao baixar a demo como PowerPoint, não ficava claro se estava gerando, tinha falhado ou já havia terminado.
351
+ Na biblioteca, o aviso sumia após seis segundos; no editor, não havia progresso e o aviso prometia poucos segundos.
352
+
353
+ Editor e biblioteca agora usam uma fila no servidor (`src/studio/export-jobs.js`, `/api/export/jobs`), acompanhada
354
+ por `export-status.js`: preparação, slide atual/total, conclusão do arquivo, tempo decorrido, erro persistente e
355
+ **Pronto para baixar**. Fechar/recarregar a aba não interrompe a geração. Ao voltar à biblioteca ou ao editor, a
356
+ lista reaparece; a aba que pediu tenta iniciar o download quando pronto, e o botão permite baixar novamente.
357
+ O arquivo fica fora da biblioteca/nuvem por até 24 h, enquanto o processo do Studio estiver ligado; mantêm-se
358
+ as dez exportações recentes de cada pessoa. O status e o arquivo só são acessíveis à mesma pessoa no multiusuário.
359
+ Uma geração por vez limita Chrome/memória; pedidos repetidos em andamento reaproveitam a geração existente.
360
+
361
+ PPTX, PDF, roteiro, material de estudo e Baixar tudo informam etapas reais. Os links antigos e compartilhados
362
+ continuam respondendo com o arquivo. Exportar um modelo em prévia não cria uma cópia na biblioteca. Se salvar
363
+ mudanças falha, o editor interrompe a exportação e mantém a mensagem, em vez de gerar a versão antiga.
364
+ Não foi acrescentado envio de email: a demo oficial de 85 slides terminou em 42 s nesta máquina (44 s até o
365
+ download pelo clique na UI), com os 85 slides no PPTX, zero erros de JavaScript no Studio e nenhuma cópia criada.
366
+
367
+ Regressão inicial: o pedido assíncrono retornava 404, sem fila nem arquivo recuperável. Testes verificam progresso,
368
+ PPTX real com textos e notas, fechamento da aba e recuperação pela biblioteca, falha persistente, bloqueio após
369
+ erro ao salvar, deduplicação, expiração e isolamento entre pessoas. Suíte completa concluída em 11/10:
370
+ 995 testes, 969 passaram, 26 pulados, zero falhas, encerramento normal. O PR #183 entrou na `main` em 11/10
371
+ (`8ff7005`), depois da CI 38133476972 concluir verde no Ubuntu (23 min 59 s) e no Windows (32 min 34 s).
372
+ O Oracle dev foi atualizado para esse commit; geração assíncrona e download real de 17 slides conferidos em 7,5 s.
373
+ Produção do Oracle permanece na 1.7.1, sem atualização nem reinício.
374
+ Uma resposta atrasada de uma consulta anterior podia apagar o acompanhamento de um pedido novo e impedir o download
375
+ automático: reproduzido com a resposta retida, agora só expiram gerações que a consulta já conhecia. O painel fica
376
+ abaixo das janelas de configuração; recolhido no editor, sai da área de digitação do chat. Testes verificam os
377
+ cliques nas janelas e o download real depois da resposta atrasada. A versão antiga também criava uma cópia pessoal
378
+ ao exportar um modelo em prévia: reproduzido usando o app.js da main, e a regressão confere o PPTX e a biblioteca.
379
+
380
+ ## Fundo do mapa sem a falsa costa — retomada em 10/10/2026
381
+
382
+ Pedido: esconder a linha marítima do OpenStreetMap que parecia um litoral afastado das áreas. Os modos claro e
383
+ escuro usam agora os estilos Positron e Dark do OpenFreeMap, sem chave; o estilo exclui fronteiras marítimas e
384
+ preserva divisas terrestres, rios e o litoral verdadeiro. O mar fica azul suave no claro e azul profundo no escuro.
385
+ O modo ruas e fundos raster personalizados continuam disponíveis. Configurar mapa ganhou os dois fundos; apagar
386
+ o endereço restaura o padrão (antes, a gravação parcial conservava o endereço antigo).
387
+
388
+ MapLibre e a ligação Leaflet vão no pacote, com as licenças; no HTML exportado, entram embutidos apenas se houver
389
+ mapa vetorial e só carregam no primeiro slide que os usa. O worker é clássico para abrir também por file://. Só o
390
+ slide atual conserva o contexto gráfico; sair e voltar preserva a câmera e a legenda. A exportação mantém o limite
391
+ de espera de 8 s também ao voltar a um mapa cujo fundo não responde. Recusa no estilo, nos
392
+ metadados ou no primeiro tile desliga o fundo na sessão sem insistir, mantendo as camadas e o Tentar de novo.
393
+
394
+ Conferido nos dois fundos reais no litoral do Rio: áreas sobre a costa, nenhuma linha paralela no mar, nenhum erro
395
+ de JavaScript. Regressões reproduziram a falha do worker e o contexto que continuava ativo fora do slide antes das
396
+ correções. Testes cobrem pixels de terra/mar, divisa terrestre versus marítima, exportação por arquivo, câmera,
397
+ retomada, carregamento local no Studio e recusa com uma tentativa. Esta retomada preserva os commits anteriores de
398
+ tour, demos oficiais, editor de mapa, calendário e retirada de tipografia cinética e texto no cenário.
399
+ Na revisão da compatibilidade, um slide antigo com subtítulo e legenda perdia a legenda na conversão. A regressão
400
+ reproduziu a perda; agora os dois textos continuam juntos, com e sem imagem.
401
+ Achado na suíte: o teste da categoria Aula consultava a galeria antes da resposta de prévias. A resposta atrasada
402
+ reproduziu a falha; o teste agora aguarda os cartões e confere que a categoria escolhida durante o carregamento
403
+ continua valendo. Nenhuma exceção de JavaScript foi ignorada.
404
+ Outro achado na suíte: o encerramento das capturas iniciava `browser.close()` sem aguardá-lo. O evento de
405
+ desconexão do navegador antigo podia apagar a referência de um novo, deixando um Chrome aberto e impedindo a suíte
406
+ de terminar. Teste com fechamento atrasado reproduziu o problema; agora o encerramento espera e cada desconexão
407
+ só limpa sua própria referência.
408
+
409
+ Validação completa desta retomada: `npm test`, 988 testes, 962 passaram, 26 pulados, zero falhas; o processo
410
+ encerrou normalmente. A revisão do pacote confirmou os renderizadores e suas licenças no npm. Entrega por PR
411
+ com CI verde no Ubuntu e Windows; atualização da porta local 3517 e somente do Oracle dev (3518). O serviço
412
+ estável do Oracle permanece na 1.7.1, conforme pedido de Narumi. PR #182 mergeado com a CI concluída verde nos
413
+ dois sistemas; dev atualizado para a main `df5d42d`, produção conferida na 1.7.1 com o mesmo processo. As quatro
414
+ worktrees antigas foram removidas depois de conferir os commits incorporados e as duplicatas locais; a pasta
415
+ oficial e seu node_modules foram preservados.
416
+
417
+ ## Texto no cenário sai; fundo claro do mapa com o mar visível — 10/10/2026
418
+
419
+ Narumi: "pode excluir também o texto no cenário. Ele é muito limitado e teoricamente dá para fazer coisas melhores
420
+ pedindo pra IA desenhar". Saiu do motor (`SCENES`, layout `scenography`), do CSS, do Studio (galeria, formulário),
421
+ da vitrine (a demo `templates/cenario`), do tour, da referência e do SKILL; o exemplo de matemática perdeu os três
422
+ slides de cenário. Deck antigo: com imagem, vira imagem de página inteira com o título por cima; sem imagem, frase
423
+ em destaque (`src/fiscal/normalize.js`; `engine.test.js`).
424
+
425
+ E "a área ainda não está em cima dos estados": os dados estavam certos (pontos do litoral a até 2,6 km da borda); no
426
+ fundo claro, o filtro cinza deixava terra e mar da mesma cor e a fronteira marítima que o OpenStreetMap desenha 12
427
+ milhas mar adentro parecia o litoral. O filtro agora guarda um azul leve no mar (`base.css`; `map.test.js`).
428
+
429
+ ## Mapa: escala única, contornos detalhados e pontos mais bonitos — 10/10/2026
430
+
431
+ Narumi, no slide dos estados: "isso não parece certo". Cada camada tinha a própria escala (a Bahia, 2.900 MW, saía
432
+ tão forte quanto Minas, 5.100): camadas da mesma medida (a mesma coluna e unidade) agora dividem a escala. Os
433
+ contornos embutidos vinham da malha mínima do IBGE simplificada a 4 km (o DF era um octógono; Rio e Vitória na
434
+ borda): agora malha intermediária a ~650 m e países do Natural Earth 1:50m (`scripts/vendor-map.mjs`; o arquivo foi
435
+ de 181 KB para 690 KB, e no HTML só entram os estados usados). E "os pontos estão com círculos grandes e feios": o
436
+ estilo das linhas e áreas era aplicado também aos pontos (borda grossa colorida); agora ponto é pequeno, na cor, com
437
+ anel branco e sombra, bolha é translúcida com contorno da mesma cor, e o rótulo é uma pílula menor. Testes:
438
+ `map.test.js` (escala dividida, contornos detalhados com a área do IBGE, desenho dos pontos).
439
+
440
+ ## Demos de mapa com cada tipo de objeto e onde se edita — 10/10/2026
441
+
442
+ Narumi: "ainda não entendi onde vão os menus e propriedades… mostre não só com pontos, mas com cada tipo de objeto".
443
+ A seção Mapas do Conheça o SagaDeck agora tem: pontos por categoria (o exemplo do layout), bolhas pelo tamanho de
444
+ uma coluna, regiões por valor, linhas e áreas, rota pelas ruas e área alcançável (calculadas uma vez pelo
445
+ OpenRouteService em 10/10/2026 e gravadas no tour, com a fonte na legenda), raio em volta de pontos e faixa em volta
446
+ de uma linha (calculados pelo sagadeck). E dois slides de foco guiado com capturas do Studio: onde fica o Editar mapa
447
+ e a tela do mapa (camadas, ferramentas, propriedades, dica, Concluir). As capturas saem de
448
+ `scripts/capturas-tour.mjs` (refazer quando a tela mudar; precisa de internet). A cópia do tour leva as capturas
449
+ (`demoAssets`). Achado no caminho: a faixa em volta de uma linha (também a que a IA grava) aparecia como uma pilha de
450
+ círculos com contorno e com buracos; agora vai marcada (`_faixa`) e sai como uma mancha só (`map.test.js`,
451
+ `map-analysis.test.js`).
452
+
453
+ ## Calendário com visões e a saída da tipografia cinética — 10/10/2026
454
+
455
+ Narumi: "eu odeio muito a tipografia cinética… se ele não consegue ser melhor, remova completamente". Saiu do motor,
456
+ do runtime, do Studio (galeria, formulário, troca de layout), do tour e da referência. Deck antigo que a usava abre
457
+ como frase em destaque com as mesmas frases, uma por clique (`src/fiscal/normalize.js`; `engine.test.js`).
458
+
459
+ Sobre o calendário ("ficou excelente… mas se tiverem muitos eventos no mesmo mês vai encher de linhas e extrapolar a
460
+ altura"): o cartão cortava os eventos sem avisar. Agora `view` tem `meses` (o de antes), `mes` (um mês grande de
461
+ parede, os eventos escritos nos dias, "+ N mais" quando o dia lota), `semana` (uma coluna por dia com horário; fim
462
+ de semana vazio some) e `lista` (agenda em colunas, a letra diminui com a quantidade). Sem `view`, escolhe pelo que
463
+ cabe, com a altura medida no navegador (mês de 6 semanas conta). `month`/`week` escolhem o mês e a semana; `time` ou
464
+ "2026-11-16 09:00" dão a hora. No Studio, o formulário tem Visão e o botão **Um slide por mês** (cada slide no mês
465
+ grande, com os eventos dele; o "sem data" fica no primeiro). Testes: `calendar.test.js` (as visões, a escolha e, no
466
+ navegador, de 1 a 8 meses com até 16 eventos: ou cabe ou avisa) e `calendar-studio.test.js` (visão e botão, no deck
467
+ salvo). O calendário ganhou limite de 240 palavras (é denso por natureza).
468
+
469
+ ## Editar mapa: uma tela própria — 10/10/2026
470
+
471
+ Narumi, testando o mapa da demo oficial: "não consigo clicar pra editar, não sei como edita, não sei se tem uma tela
472
+ diferente", e o ponto novo não gravava. O editor antigo era uma barra por cima do slide escalado (cobria o título), só
473
+ editava planilha e GeoJSON de arquivo (a demo tem tudo escrito no slide) e não tinha propriedades. Agora **Editar mapa**
474
+ (ou dois cliques no mapa) abre uma tela só do mapa (`map-editor.js`, classes `mpe-`; `.mx` já era de um layout):
475
+ camadas à esquerda (tipo, nome, quantos itens, olho), o mapa grande com as ferramentas e a dica do que fazer, e à
476
+ direita as propriedades do selecionado (campos com o que cada um faz no mapa, posição, comprimento ou área, excluir) ou
477
+ da camada e do mapa. Edita pontos e formas escritos no slide e em arquivo; GPX e KML só se leem. Corrigidos no caminho:
478
+ gravar arquivo do projeto em prévia de modelo respondia 409 (agora cria a cópia, `server.js`), planilha nova numa pasta
479
+ que não existia falhava (`writeSheet`), pontos ficavam debaixo de áreas e raios que entravam depois (na apresentação
480
+ também: o clique abria o cartão do raio), e desmontar o mapa no meio de uma animação de zoom dava erro. Testes:
481
+ `map-editor.test.js` (os dois caminhos, inclusive a demo em prévia), `project.test.js` (409), `map.test.js` (pontos por
482
+ cima). Achado na suíte: a faixa "Configure a IA" caía na coluna da lateral e espremia a biblioteca (corrigido, com
483
+ teste em `library-ui.test.js`).
484
+
485
+ ## Conheça o SagaDeck com a demonstração dos mapas e a pasta Demos oficiais — 10/10/2026
486
+
487
+ Narumi esperava achar a apresentação junto das dela, numa pasta própria e só leitura. Agora a lateral da biblioteca
488
+ tem **Demos oficiais** (cadeado; `data-view="oficiais"` em `library.js`) com o Conheça o SagaDeck em primeiro e as
489
+ demos de recursos da vitrine (as mesmas chaves da `GALLERY`, tipo `recurso`), com a capa de verdade e só Apresentar e
490
+ Abrir: sem menu de mover, renomear ou excluir, sem arrastar, sem "Nova" dentro. O Conheça aparece também como o
491
+ primeiro cartão de Recentes e Todas, e debaixo da mensagem de biblioteca vazia. Abrem em prévia (`editor?model=…`).
492
+ Defeito achado pelo teste novo: **Apresentar uma prévia criava uma cópia** na biblioteca (o Apresentar mandava o deck
493
+ ao servidor, e na prévia isso conta como primeira mudança); agora, em prévia, ele não envia (o servidor já tem o mesmo
494
+ deck). Teste: `library-ui.test.js` (pasta, cartões, só leitura, abrir e apresentar sem criar arquivo).
495
+
496
+ **Exemplos sem nada da empresa de quem desenvolve.** Narumi viu o tour falar da Bridge e do processo de experimento e
497
+ projeto (DEV, HOM, PROD, Key Vault): vinha dos exemplos dos layouts (`layout-samples.js`) e da referência que ensina a
498
+ IA. Trocados por assuntos variados (viagem, loja, clínica, inscrições, reciclagem) nos exemplos, na referência, nos
499
+ modelos, nos textos de exemplo da interface e nos testes. Trava: `engine.test.js` ("sem nada da empresa de quem
500
+ desenvolve") falha se nomes de sistemas, processos internos ou produtos do banco voltarem a `src`, `templates`,
501
+ REFERENCIA, README ou SKILL. Os ambientes dev/hom/prod da API são recurso genérico e ficam.
502
+
503
+ Pedido de Narumi: uma apresentação bem completa do próprio sagadeck, incluindo a demo de mapas. O tour ganhou a seção
504
+ **Mapas** (`mapDemos` em `src/studio/tour.js`, slides marcados `demo: mapa`): o exemplo do layout, estados pintados por
505
+ valor com uma região por clique e a câmera indo até ela, linhas e áreas (GeoJSON escrito no slide, que o motor passou a
506
+ aceitar), cobertura com raios de 1 km calculados pelo código (`circle` de `src/map-analysis.js`) e dois quadros com o
507
+ que a IA e o Studio fazem no mapa. Os extras ganharam pesquisa na web, versões e material de consulta. Valores
508
+ ilustrativos e traçados aproximados dizem isso na tela. Testes: `engine.test.js` (seção de mapas e o tour inteiro sem
509
+ avisos) e `map.test.js` (GeoJSON no slide). Achado de passagem, tarefa à parte: o Studio acusa "texto pequeno" em
510
+ todo cartão (mede a letra da caixa, não a do texto).
511
+
152
512
  ## Conheça o SagaDeck — 10/10/2026
153
513
 
154
514
  Pergunta de Narumi: a pessoa nem sabe o que dá para gerar. Agora a biblioteca tem, na lateral, **Conheça o