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/docs/ANDAMENTO.md CHANGED
@@ -8,11 +8,253 @@ começar. Trabalho em curso vai para o GitHub (commit + push) a cada etapa, nunc
8
8
 
9
9
  ---
10
10
 
11
+ ## UX para programação e APIs com cURL — 12/10/2026 (branch `codex/ux-dev-slides`, versão 1.10.0)
12
+
13
+ Pedido: reduzir dificuldade de uso, facilitar geração técnica, acrescentar recursos e dois temas bonitos com
14
+ animação; testar, PR, merge, publicar no npm e atualizar sagadeck-dev. Trabalho somente na pasta oficial,
15
+ sem worktrees, conforme AGENTS.md. Main começou limpa em `46e0afd`, com a CI dos quatro ambientes verde.
16
+
17
+ Diagnóstico: recursos técnicos existiam, mas começar dependia de descobrir layouts, escrever briefing do zero e
18
+ preencher campos estruturados. cURL era exibido sem realce de sintaxe; demos extensas não eram uma base curta.
19
+ Mudanças:
20
+ - Biblioteca com entradas Programação/APIs com cURL; Nova com IA oferece exemplos de pedidos, material técnico
21
+ colado, público/objetivo/roteiro opcionais, resumo, prévia do pedido e Ctrl+Enter. Intenção explícita orienta o
22
+ modelo pelo prompt, sem regras de decisão por regex; texto e estilo manual continuam prioritários.
23
+ - Bases sem IA (`src/studio/developer-starters.js`), cinco slides com exemplo consistente, guia, saída e terminal
24
+ de cenas. Criação pela biblioteca; a de APIs usa ENSAIO e funciona localmente sem credenciais externas.
25
+ - Início/Inserir › Código / cURL: conteúdo colado vira código, código guiado ou requisição de API. Parser de
26
+ argumentos sem shell e sem executar; opções não suportadas geram mensagem antes de inserir. Credenciais
27
+ reconhecidas viram referências a Segredos antes de gravar. Código de exibição é preservado literalmente.
28
+ - Etapas guiadas por seleção de linhas, no modal e em Formatar; linguagem inferida/selecionável; realce offline
29
+ novo de Bash/cURL, JSON e SQL. Anexos de código/configuração preservam espaços, indentação e linhas em branco.
30
+ - `terminal-pro` (grafite/menta, IDE) e `aurora-dev` (azul noite/lilás/ciano, painéis e luz suave): fontes embutidas,
31
+ contraste de texto/sintaxe, rede de capa que para fora dela e em movimento reduzido/exportação. Design usa o
32
+ mesmo caminho existente de tema salvo; nenhum deck pessoal modificado.
33
+
34
+ Regressões cobrem parser, segredos, código literal, etapas e arquivos gravados, prompts ao LLM, anexos técnicos,
35
+ criação sem IA, escolha dos temas por teclado, contraste, animação, movimento reduzido e exportação. Testes
36
+ direcionados de motor/fontes/guards: 85 aprovados; temas e geração passaram também no navegador.
37
+ Geração com IA real também aprovada: briefing técnico aplica Aurora Dev e mantém o cURL original copiável (62 s).
38
+ Revisão independente achou e reproduziu perdas de inteiros grandes ao proteger JSON e de variáveis na codificação
39
+ do formulário: proteção agora edita só spans sensíveis do texto. Interpolação contextual opt-in
40
+ (`request.bodyEncoding`/`urlEncoding`) mantém JSON/form/query corretos no envio; ensaio HTTP real confere `&`, aspas,
41
+ barras, Unicode, números grandes e máscara de respostas/gravações. URL com Segredo agora é enviada já resolvida.
42
+ Callbacks de upload/geração são invalidados ao trocar/cancelar modal; Tab fica no diálogo e Escape devolve foco.
43
+ Essas regressões falharam antes das correções e passaram depois. Suíte completa iniciada com as frentes estáveis.
44
+ Entrega final aguardando suíte completa e CI; publicação de `sagadeck@1.10.0` por release com trusted publishing.
45
+ Oracle: atualizar apenas `/opt/sagadeck-dev`/`sagadeck-dev.service` (3518), preservando produção. Reiniciar também
46
+ a instância local verificada na 3517 e conferir versão/recursos depois da atualização.
47
+ Retomada em 13/10 após limite da sessão. Suíte inicial: 1.084 testes, 1.054 aprovados, 27 condicionais pulados e
48
+ 3 falhas (uma de Python ausente no PATH, uma de rótulo e a contagem do teste pai). Python passou isolado com o
49
+ runtime disponível no PATH; a guarda de palavras grudadas agora reconhece o nome técnico cURL sem enfraquecer
50
+ os demais rótulos. A revisão final também cobre execução pelo navegador preservando corpo JSON literal e comandos
51
+ equivalentes copiáveis com segredos em JSON/form/query. Suíte final concluída: `npm test`, 1.093 testes,
52
+ 1.066 aprovados, 27 condicionais pulados, zero falhas (24 min). Geradores de cURL/JavaScript/Python também
53
+ enviaram pedidos reais ao ensaio HTTP. Preview e Formatar mantêm JSON literal; respostas/gravações não permitem
54
+ recuperar segredos mesmo em logs com JSON aninhado. Instância local reiniciada na 3517, versão 1.10.0, com os novos
55
+ módulos/CSS respondendo 200. PR #197 publicado; os quatro checks originais Ubuntu/Windows, Node 22/24, passaram.
56
+ Por orientação posterior do usuário, o suporte passa a Node 24+: engines, instruções de instalação e matriz da
57
+ CI atualizados, sem mudança no código já aprovado. YAML e metadados conferidos; a nova CI exige Ubuntu e Windows
58
+ com Node 24 antes de merge/release. DEV da Oracle recebeu `135cfd2`, com versão 1.10.0 e ambos os temas disponíveis;
59
+ produção preservada. A publicação npm ainda aguarda merge e CI do commit final.
60
+ PR #197 integrado em `03f9ff4`; local na 3517 e DEV na 3518 reiniciados com esse commit e versão 1.10.0.
61
+ Os dois checks do PR passaram, mas a nova rodada da main encontrou uma corrida no teste de Formatar: o helper
62
+ confirmava a gravação no servidor antes de o formulário do novo slide terminar de renderizar, lendo o corpo
63
+ do slide anterior. Publicação npm suspensa até corrigir e validar essa sincronização. Correção na branch
64
+ `codex/ux-dev-format-sync`; nenhuma mudança no conteúdo das apresentações nem no código da aplicação.
65
+ Atrasar `api/render-slide` em 400 ms reproduziu exatamente a falha da Ubuntu. O helper agora aguarda a
66
+ identidade do formulário pelo campo Título, além da gravação; a mesma regressão passou após o ajuste.
67
+ Seis testes dirigidos aprovados, zero erros JavaScript e corpos JSON/form conferidos também no arquivo salvo.
68
+ Suíte completa após o ajuste: `npm test`, 1.093 testes, 1.066 aprovados, 27 condicionais pulados e zero falhas
69
+ (30 min). A falha da main ficou restrita a essa sincronização; Windows passou. Correção pronta para commit/PR
70
+ e checks Ubuntu/Windows Node 24 antes de integrar e publicar a versão 1.10.0.
71
+
72
+ ## Assistente em prévia de modelo na Oracle — 12/10/2026
73
+
74
+ O erro `APP_UNKNOWN · a4670ccb` da produção era `path.dirname(null)` no preparo dos anexos: modelos abertos
75
+ pela vitrine ainda não têm arquivo. O pedido parava antes de chegar ao modelo. Agora o chat só prepara documentos
76
+ em uma pasta existente; documento binário, imagem gerada e edição materializam a cópia com os helpers da biblioteca.
77
+ Conversa simples continua sem criar arquivo. A aba do servidor e o endereço do editor passam a usar essa mesma
78
+ cópia, evitando edição perdida ou segunda cópia no pedido seguinte. Modelo de fábrica e outras pessoas preservados.
79
+ Regressão em `test/studio-ai-preview.test.js`: falhou antes com o erro exato; cobre conversa, edição salva,
80
+ recarregamento no navegador, isolamento por usuário e documento inventariado na pasta pessoal.
81
+ Imagem gerada também é conferida no arquivo e na pasta pessoal. Texto e visão reais passaram nos dois serviços.
82
+ A CI da main apresentou timeout no teclado ao mudar o título logo após abrir o editor no Windows 24; o teste da
83
+ biblioteca agora espera a página terminar de carregar antes de editar, mantendo a conferência do arquivo salvo.
84
+ Validação: npm test com 1.034 testes, 1.008 aprovados, 26 condicionais pulados, zero falhas; quatro regressões novas
85
+ passaram na suíte. O teste da biblioteca com a espera de carregamento passou também isolado (13 testes).
86
+ Entrega: commit da correção para os dois serviços da Oracle após validação local; merge do PR somente com os quatro
87
+ checks verdes (Ubuntu/Windows, Node 22/24). Não há mudança de dependências nem publicação de versão no npm.
88
+ PR #196 publicado. Oracle dev (3518) e produção (3517) receberam o commit `e32a3c1` e reiniciaram; nos dois,
89
+ o pedido real em uma prévia voltou com `mode: llm`, conversa, sem diagnóstico de erro e sem criar cópia.
90
+ Bibliotecas pessoais não foram alteradas. A CI do PR continua sendo acompanhada para concluir o merge.
91
+ Revisão adicional reproduziu perda ao recarregar quando o patch só mudava campos do deck (tema, contexto…) ou
92
+ excluía slides: a lista de slides alterados era vazia e a cópia não nascia. A materialização agora vale para toda
93
+ ação do modelo, preservando conversa e alternativas em prévia. Regressão confere tema salvo, exclusão e demais
94
+ slides preservados; falhou antes da correção.
95
+ Suíte completa após esse ajuste: 1.035 testes, 1.009 aprovados, 26 condicionais pulados e zero falhas.
96
+ Os cinco testes de prévia passaram; nova CI será exigida para o commit final antes do merge do PR #196.
97
+ Oracle dev e produção receberam também `333857f`: conversa real e mudança de tema pelo modelo funcionaram;
98
+ o tema permaneceu ao reabrir o arquivo pelas APIs nativas. Apresentações sintéticas removidas pela biblioteca.
99
+ A CI aprovou Ubuntu 22/24 e Windows 22. Windows 24 teve timeout na galeria; o teste isolado passou (3/3) e a
100
+ reexecução aprovou o carrossel, mas encontrou `ERR_NO_BUFFER_SPACE` durante exportação. Isso indica pressão de
101
+ recursos de rede no runner; a faixa TCP dinâmica agora é ampliada somente nas máquinas descartáveis da CI,
102
+ com diagnóstico de estados TCP em falhas. Testes e exigência de zero erros de navegador preservados.
103
+ Código da aplicação permanece o mesmo da suíte local completa aprovada (1.009/26/0); ajuste de CI validado como
104
+ YAML, e os quatro ambientes serão novamente conferidos antes do merge.
105
+
106
+ ## Sobre legível no tema escuro — 12/10/2026 (branch `sobre-tema-escuro`)
107
+
108
+ Narumi (com print): no Windows e no dev da Oracle o Sobre "não abre direito", com texto apagado. Causa: o CSS do
109
+ `about.js` pegava o fundo de `--panel`/`--bg`, que nenhuma página define (caía no branco), e o texto de `--text`,
110
+ que no tema escuro é claro, o que dava contraste 1,16. Agora fundo, borda e botão vêm de `--chrome`, `--ui-line` e
111
+ `--brand-fill`, que o editor (style.css/studio-next.css) e a biblioteca (library.css) definem nos dois temas. Teste
112
+ novo em `test/sobre.test.js`: contraste WCAG mínimo de 4,5 do texto contra o fundo da janela, nos temas claro e
113
+ escuro, no editor e na biblioteca. Ele falha com o CSS antigo.
114
+
115
+ ## Ajuda › Sobre o SagaDeck — 12/10/2026 (branch `ajuda-sobre`)
116
+
117
+ Narumi: "insira um help com about no menu onde eu posso ver a versão". A aba **Ajuda** fecha a faixa do editor
118
+ (depois de Avançado, como no PowerPoint) com Sobre o SagaDeck, O que mudou (CHANGELOG) e Demos. O Sobre
119
+ (`src/studio/public/about.js`, `window.SagaAbout`; qualquer elemento com `data-about` abre) mostra a versão em
120
+ destaque, commit, Node e sistema (novos em `/api/instance`), desde quando está no ar, a biblioteca (no multiusuário,
121
+ só que é do servidor) e se a IA está configurada, com Copiar informações para suporte. Na biblioteca, um botão com o
122
+ ícone de informação no alto. Achados de passagem: o `dialog` nativo abria colado no canto (uma regra global zerava
123
+ a margem; o Sobre põe `margin:auto`) e botão da faixa que é link (`a.rbtn`) saía sublinhado. Teste:
124
+ `test/sobre.test.js`; a ordem da faixa em `studio.test.js`.
125
+
126
+ ## `sagadeck ia-check`: o que de IA funciona, sem tela — 12/10/2026 (branch `ia-check`)
127
+
128
+ Narumi: "o sagadeck está preparado para ser testado por um agente de IA (tipo o Copilot) sem o front-end?
129
+ Principalmente a execução dos modelos: preciso saber rapidamente quais features de IA funcionam". Não estava: só o
130
+ Testar do Configurar IA (uma pergunta de texto) e os testes ao vivo, que avaliam decisões e levam minutos.
131
+ - `src/ai/ia-check.js` (`iaCheck`): texto, visão, imagem, pesquisa e vídeo em paralelo, prazo próprio por recurso,
132
+ cada resultado avisado ao chegar. Visão com prova: um PNG de duas faixas de cor sorteadas, desenhado no código; o
133
+ modelo precisa dizer as cores na ordem, e modelo que não aceita imagem falha (o `chat` refazia sem a imagem e dava
134
+ "ok" sem ver). Pesquisa: a data de hoje. Imagem: confere o tipo pelos bytes e grava o arquivo.
135
+ - Vídeo: Narumi primeiro quis a geração real sempre, depois decidiu: padrão sem custo (catálogo, status `sem_prova`,
136
+ que não conta como ok) e `--video-real` quando ela pedir (clipe mais curto e leve que o modelo aceita, baixa e confere
137
+ o MP4).
138
+ - No caminho, a pergunta dela ("o teste usa a chave do OpenRouter? o setup dos modelos não é uma camada separada?")
139
+ 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
140
+ `videoSetup` (`video-generation.js`): com modelo de vídeo em Configurar IA (papel novo `video`), usa endereço, chave,
141
+ cabeçalhos e adaptador de lá; sem ele, o comportamento antigo (Oracle e quem já usava). A consulta e o download só
142
+ levam a chave ao mesmo servidor configurado (`videoApiURL`). O catálogo virou opcional.
143
+ - Saídas: `sagadeck ia-check` (`--rapido`, `--so`, `--video-real`, `--json`, código de saída), ferramenta MCP
144
+ `sagadeck_ia_check`, `POST /api/ia/check` (fora do multiusuário). SKILL.md manda o agente rodar antes de prometer
145
+ recurso de IA.
146
+ - Medido nesta máquina contra o OpenRouter: texto, visão e pesquisa em 2,3 s (`--rapido`); com imagem, 8 a 11 s.
147
+ - Teste `test/ia-check.test.js` (LLM falso e provedor de vídeo simulado: cada falha com o motivo, paralelismo, vídeo
148
+ pela camada da IA, linha de comando). Achado: o `spawnSync` do teste da linha de comando travava o LLM falso do
149
+ próprio processo, e o teste só passava por estourar o prazo; virou `execFile` e exige o motivo certo.
150
+ - Flake corrigido: `studio.test.js` procurava "ocr" no slide inteiro e o uid sorteado `s1ocrpz0ieql` derrubou a CI da
151
+ `main` depois do #191.
152
+
153
+ ## Demos de um assunto só: mapas, programação e APIs com curl — 11/10/2026 (branch `demos-recursos`)
154
+
155
+ 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
156
+ curl. Entraram em `src/studio/feature-demos.js` (`demoDeck('mapas' | 'programacao' | 'apis')`, `FEATURE_DEMO_NAMES`)
157
+ e vão primeiro na vitrine e em Demos oficiais; o Conheça continua lá, depois delas.
158
+ - **Mapas** (tema oceano): reaproveita as demos de mapa do tour (`mapDemos`, agora exportada) em três partes:
159
+ mostrar, calcular, editar; a cópia leva as capturas do Editar mapa (`demoAssets`).
160
+ - **Programação** (tema musgo, terminal de cenas na capa): código destacado, guiado, consulta, código explorável,
161
+ algoritmo, dois terminais, duelo de commits, code review, diagrama de sequência e rede explorável.
162
+ - **APIs com curl** (tema wine): a anatomia de um curl (código guiado), chamadas ao vivo abertas na aba curl (POST,
163
+ GET com consulta, com token, polling, streaming) na API de mentira do Studio (ENSAIO), as opções do dia a dia em
164
+ cartões que viram e o aviso do token.
165
+ - Teste: `test/demos-recursos.test.js` (montam sem aviso, cada uma só do seu assunto, e cada chamada da de curl
166
+ funciona contra a API de mentira); a ordem nova da vitrine em `library-ui.test.js`.
167
+ - **Revisão de todas as demos** (Narumi: "mantenha só o que fizer sentido"). Ficam na vitrine e em Demos oficiais:
168
+ mapas, programação, APIs com curl, Conheça o SagaDeck, aula de hidráulica, aula de algoritmos e diagramas vivos.
169
+ Saíram: **Explore uma ideia** ("Uma pergunta, vários caminhos", não demonstrava nada claro), **Novidades** (colcha
170
+ de retalhos; o slide da planilha dependia de um arquivo que a prévia não tem, e a aba Arquivos aparecia vazia),
171
+ **Material de consulta** e **Recursos avançados** (quase iguais, com cartões genéricos; a consulta está na de
172
+ programação) e **Aula de APIs ao vivo** (fica uma demo de API só, a de curl; o ensaio completo continua no
173
+ `sagadeck ensaio-api`). Os decks dessas demos continuam no código porque os testes os usam como material
174
+ (código denso, arquivos do projeto, exploração); só não aparecem mais. O teste de ponta a ponta da vitrine com
175
+ o ENSAIO agora abre a de curl, vira cópia e executa corpo, consulta e token no Studio.
176
+
177
+ ## Temas de infográfico, cartão que vira e botão + — 11/10/2026 (branch `temas-cartoes`, sobre `tema-musgo`)
178
+
179
+ Pedido da Narumi, com prints de modelos de infográfico interativo: uma variante do musgo com outra paleta e os
180
+ visuais dos prints, com destaque para o cartão que gira no clique e mostra o verso. Entrou:
181
+ - **`wine`**: o musgo em vinho (vermelho-rosado, rosé, vermelho forte só no detalhe). Usa a pele do musgo por
182
+ `skin: "musgo"` (o `build.js` lê a pele do outro e troca o seletor); fontes em `MUSGO_FACES`.
183
+ - **`caderno`** (visual thinking: Amatic SC + Gelasio, cartões com moldura pastel, rabiscos de ícones Lucide como
184
+ máscara), **`lousa`** (giz: Cabin Sketch + Itim), **`cartaz`** (protesto: Bebas Neue em faixas vermelhas tortas) e
185
+ **`infografico`** (dados chapados: Bebas Neue + Montserrat). Fontes OFL em `vendor-fonts.mjs`.
186
+ - **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
187
+ célula, clique/Enter gira, sair do slide desvira; exportação mostra a frente.
188
+ - **Botão + com balão** (`pop` em qualquer lugar; `more` no marco da linha do tempo): abre o balão e escurece o resto
189
+ com uma sombra enorme em volta do botão; um de cada vez, fecha fora e ao trocar de slide.
190
+ - **Defeito achado:** o ajuste para caber (`fit.js`) via o texto do verso "por cima" do da frente e encolhia o slide
191
+ inteiro; verso e balão saem dessa conta.
192
+ - Teste do arranjo único por tema aceita o tema irmão (`skin`). Testes: `test/temas-infografico.test.js`.
193
+
194
+ ## Tema musgo, faixa que corre e terminal em cenas — 11/10/2026 (branch `tema-musgo`)
195
+
196
+ Pedido da Narumi: trazer para o sagadeck o visual de uma página que ela adorou (um site de "segundo cérebro" gerado
197
+ por outro modelo): tema, cores, fontes, botões, o terminal que digita os `curl`, a faixa que fica correndo e o
198
+ separador das seções. Entrou:
199
+ - **Tema `musgo`** (`src/themes.js`, `src/runtime/skins/musgo.css`): verde quase preto com grão, âmbar e sálvia;
200
+ Fraunces (com tamanho óptico e itálico de verdade), Space Grotesk e IBM Plex Mono, embutidas (OFL, `vendor-fonts.mjs`
201
+ agora aceita estilo itálico). PPTX com Georgia, Segoe UI e Cascadia Mono. Capa e seção com grade de pontos que some
202
+ nas bordas, luz âmbar na capa, chapéu com fio âmbar, destaque do título em âmbar itálico (sem marca-texto), seção
203
+ como separador (número entre fios na linha do chapéu, título grande embaixo), cartões vazados que sobem no mouse,
204
+ números em monoespaçada, marcador em losango, código em janela e botões âmbar.
205
+ - **Decisão:** no musgo o tom `accent` (o padrão da seção) é escuro com detalhe em âmbar; a página chapada de âmbar
206
+ destoava do original.
207
+ - **Faixa que corre** (`ticker`, `src/build.js` + `base.css`): só na capa; automática nos temas com `ticker: true`
208
+ (por enquanto o musgo), com os títulos das seções (ou dos slides, se houver menos de 3 seções); `ticker: [..]` em
209
+ qualquer tema; `ticker: false` desliga. Separador desenhado em CSS (losango), parada sem movimento e na exportação.
210
+ - **`motion: {type: console}`** (`src/motion.js`): janela com três bolinhas, legenda e contador; cada cena digita o
211
+ comando e revela a saída linha a linha, segura a leitura e passa para a próxima. Prompt, cursor e seta em CSS
212
+ (regra de não usar caractere como ícone). Parado, mostra a primeira cena completa.
213
+ - **`ambient: rede`** (`runtime.js`, `mountAmbientNet`): nós à deriva que se ligam por proximidade, num canvas no
214
+ tamanho lógico do slide, nas cores do tom; anda só no slide atual, um quadro parado sem movimento/exportação. O tema
215
+ pode pôr na capa sozinho (`coverAmbient`, o musgo põe); `ambient: false` tira. Também no formulário do Studio.
216
+ - Testes: `test/tema-musgo.test.js`. Referência atualizada (tema, `ticker`, `console`, `rede`).
217
+
218
+ Fica para depois, se ela pedir: o efeito de "decodificar" a palavra em destaque do título da capa (trocar letras
219
+ mexe na largura e na quebra das linhas; precisa de um jeito que não faça o título pular).
220
+
221
+ ## 11/10/2026 — Fases 0+1 do plano de melhorias (branch `arena/349f2d88-sagadeck`)
222
+
223
+ Veio de uma avaliação do repositório pedida pela Narumi: o plano está em `docs/PLANO-MELHORIAS.md`
224
+ (criado antes desta etapa; continua valendo para as fases 2+). Entrou o que é seguro e não muda
225
+ comportamento do gerador:
226
+
227
+ - **Suíte verde em qualquer máquina**: seis testes que exercitam o navegador por dentro (foco guiado,
228
+ `materializeImages` com `image_ref`, "ver o material", rótulos do redesenho) falhavam fora do CI, que
229
+ tem Chrome; agora pulam com o aviso dos testes de UI (`skipWithoutBrowser` em `test/helpers.js`).
230
+ - **`engines` corrigido**: era `>=18` e não se cumpria (`pdfjs-dist` 6 pede 22.13+/24, `playwright-core`
231
+ pede 20+). Agora `>=22.13.0`, README e SKILL a par; CI testa Node 22 e 24 no Linux e no Windows.
232
+ - **Audit de dependências na CI** (informativo) + **Dependabot semanal** agrupado; vulnerabilidade de
233
+ `image-size` (dependência morta declarada pelo pptxgenjs — o bundle nunca a importa) resolvida com
234
+ `overrides` para 2.0.4: audit em zero, suíte passando, nenhum código do gerador tocado.
235
+ - `CHANGELOG.md` começado (o histórico fino continua sendo este diário), `.editorconfig`, e
236
+ `keywords`/`homepage`/`bugs` no `package.json`.
237
+ - **Flake do CI no Windows consertado, e era mais sério do que parecia** ("mover (pasta inteira...), renomear
238
+ e duplicar"): a CI desta branch começou a falhar às vezes no Windows e o passo de falha do workflow (novo)
239
+ apontou o teste; o bloco de erro trouxe `exitCode 3221226505` (0xC0000409, morte nativa). Causa-raiz:
240
+ `fs.cpSync`/`fs.rmSync` recursivos têm código nativo que no Windows mata o processo ou copia/apaga NADA
241
+ com caminho acentuado (nodejs/node#54476, #61878 — "cópia", "Relatório" são a norma aqui). Só apareceu
242
+ porque a matrix nova testa Node 22 no Windows (main só testava 24, que passa por sorte de versão).
243
+ Conserto: `copyRetry`/`removeRetry` caminham na mão (readdir/copyFile/unlink/rmdir) e toleram o
244
+ travamento de um instante; testes de trava simulada (falham sem o conserto) e trava estrutural contra
245
+ `fs.cpSync`/`fs.rmSync` recursivo cru. Também protege a Studio de morte súbita ao duplicar/apagar deck.
246
+
247
+ O que ficou para depois (mesmo plano, fases 2+): lint/format com adoção gradual, `@ts-check` nos módulos
248
+ puros, extração dos prompts para arquivos, divisão do `app.js` do Studio, CI paralela por família de
249
+ teste, redimensionador de imagem sem navegador.
250
+
251
+ ---
252
+
11
253
  ## Próximas frentes (levantadas em 08/10/2026, ainda não começadas)
12
254
 
13
255
  **Para quem pega isto numa sessão nova, sem a conversa de origem.** O projeto é o **sagadeck**:
14
256
  - 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).
257
+ - 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
258
  - Ferramenta Node (ESM) que transforma apresentações escritas em YAML em HTML/PPTX.
17
259
  - Tem um editor web, o Studio (`sagadeck studio`, porta 3517).
18
260
  - 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 +284,7 @@ datadas abaixo). O resto fica para depois e só entra se for pedido. Antes de co
42
284
  ler o conteúdo força o download. Conferir se listar a biblioteca (`openLibrary`, `/api/library`) lê o YAML de
43
285
  cada deck; se lê, listar só pelo nome/metadado e abrir o conteúdo sob demanda.
44
286
 
45
- ## Frente: mapa (planejada em 10/10/2026, em andamento)
287
+ ## Frente: mapa (planejada e publicada em 10/10/2026, versão 1.8.0)
46
288
 
47
289
  Pedido de Narumi, depois de muita conversa. **Leia antes de mexer.** Recurso de nicho, mas completo: mostrar e
48
290
  explicar algo geográfico (pontos de interesse de qualquer tipo, linhas, áreas), com a IA montando a partir de dados.
@@ -138,17 +380,250 @@ Não é um QGIS: análise pesada fica lá; aqui é apresentar bem, com contas si
138
380
  de altura zero). Testes: `test/map-analysis.test.js` e o ao vivo "qual loja fica mais perto de cada pedido" (pede
139
381
  `mais_proximo`).
140
382
 
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,
383
+ **Publicação 1.8.0 (concluída em 10/10):** as cinco entregas e o Conheça o SagaDeck entraram na `main` pelos
384
+ PRs #178 e #179, nessa ordem, ambos com CI verde no Ubuntu e no Windows. A CI da `main` (run 38055530334)
385
+ também passou nas duas máquinas no commit `1b05819`. A release `v1.8.0` aponta para esse commit; o workflow
386
+ `publish` (run 38057571606) publicou `sagadeck@1.8.0` no npm com provenance.
387
+
388
+ O registro passou a informar `latest: 1.8.0`; esta máquina foi atualizada com `npm install -g sagadeck@1.8.0`.
389
+ O Studio anterior da porta 3517 foi verificado e substituído pelo da versão nova, na mesma porta.
390
+ Conferido em `http://127.0.0.1:3517/api/instance`: versão 1.8.0, biblioteca local; IA configurada,
391
+ configuração do mapa editável e nenhum aviso de código antigo.
392
+
393
+ No Oracle, por decisão de Narumi, **produção permanece na 1.7.1**, em `/opt/sagadeck`, porta 3517, sem reinício.
394
+ O dev tem código próprio em `/opt/sagadeck-dev`, branch local `dev`, agora na tag `v1.8.0`; somente
395
+ `sagadeck-dev.service` foi reiniciado, na porta 3518. Versão e configuração reservada conferidas pela API;
396
+ IA configurada e arquivos do mapa servidos. A rota real pelo OpenRouteService já havia sido conferida nessa
397
+ mesma versão pelo Claude. O ambiente e os dois `mapa.json` usam `OPENROUTESERVICE_API_KEY`, com modo 600 e
398
+ 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
399
+ do oráculo, respectivamente; não precisam ser refeitos.
400
+
401
+ A CI intermediária da `main`, após o #178, teve um erro de recursos do navegador no Windows
402
+ (`ERR_NO_BUFFER_SPACE`, no teste da faixa de ferramentas). O teste isolado local passou; a repetição dessa CI
403
+ foi cancelada pela entrada do #179. As CIs posteriores do #179 e da `main` passaram completas nas duas máquinas,
404
+ sem filtros de erro nem alterações para esconder a falha.
405
+
406
+ Os quatro testes de mapa com o modelo real passaram novamente. Suíte completa da 1.8.0: 982 testes,
146
407
  956 passaram, 26 pulados, zero falhas; mapa/editor/exportação/leitores e regras: 22 testes direcionados passaram.
147
408
  Na revisão com cliques reais, a planilha cobria o mapa inteiro e a legenda interceptava um ponto no enquadramento
148
409
  automático. Corrigidos: a planilha fica ao lado do mapa (sugestões de gráfico recolhidas, com botão para abrir), a
149
410
  seleção funciona nas duas direções e o enquadramento reserva espaço para a legenda. O teste reproduziu a obstrução
150
411
  antes da correção e agora clica no ponto e na célula, sem disparar eventos sintéticos.
151
412
 
413
+ ## Assistente em destaque — 11/10/2026
414
+
415
+ Pedido de Narumi: o chat não deve ficar perdido entre as propriedades. O acesso ao Assistente fica separado
416
+ do grupo Formatar/Propriedades/Variáveis, por último à direita, com o nome sempre visível e aberto por padrão.
417
+ Os controles de edição mantêm nomes acessíveis e dicas; esse arranjo preserva espaço para o slide. Quem fechou
418
+ o painel continua sendo respeitado. O atalho flutuante aparece para reabrir o painel fechado; com ele aberto,
419
+ o botão fixo já dá acesso ao Assistente, inclusive a avisos de novas respostas.
420
+
421
+ Teste reproduziu a ordem antiga e passou com a nova: clique real nas quatro opções em temas claro/escuro e
422
+ larguras 1280, 1024 e 390, sem corte do cabeçalho, nome do Assistente visível, seleção acessível correta,
423
+ rascunho preservado, ordem de teclado, troca de slide mantendo o chat e apresentação salva intacta.
424
+ Os testes do atalho e da faixa/painel também passaram, com zero erros de JavaScript.
425
+ 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`.
426
+
427
+ ## Correções visuais da demo — 11/10/2026
428
+
429
+ Pedidos de Narumi por capturas de tela: rótulos brancos cobriam o mapa; fórmula de Reynolds em cima do resultado;
430
+ capital em reais aparecia como código LaTeX no exercício resolvido.
431
+
432
+ - Rótulos do mapa têm fundo transparente, sem caixa ou sombra retangular, com contorno leve só no texto. O estilo
433
+ tem prioridade sobre o CSS do Leaflet, que carrega depois; o rótulo não intercepta cliques. Conferido em temas
434
+ claro e escuro, com os nomes preservados e clique real no ponto.
435
+ - A calculadora reserva altura e respiro para a fração, sem sobrepor o resultado. Os nomes das faixas ficam visíveis
436
+ abaixo da régua, mantendo suas posições e as pontas arredondadas. No PPTX, controles deslizantes são capturados
437
+ com trilho e marcador: antes viravam retângulos brancos, sem representar o valor atual. A linha do resultado
438
+ também usa o tamanho do número: o PPTX antes reservava 9,6 pt para uma fonte de 38 pt, causando sobreposição.
439
+ O teste confere a altura exportada e preserva o resultado como texto editável; o ajuste de altura vale também
440
+ para o modo compacto. A suíte apontou um excesso de 3 px no exemplo com oito resultados; o modo compacto usa
441
+ uma linha do tamanho da fonte, sem a folga extra do modo comum, e o teste existente de controles/explicação
442
+ visíveis passou novamente.
443
+ - A conferência da demo completa no PPTX revelou outra causa da régua desformatada: o exportador agrupava filhos
444
+ posicionados como texto de uma única caixa. Agora cada faixa e cada rótulo conserva sua própria posição e fundo;
445
+ as três cores e os dois nomes editáveis são conferidos no arquivo real, comparando com as posições do navegador.
446
+ O teste falhou com o agrupamento antigo e passou após a correção, junto com os demais testes de PowerPoint.
447
+ - Unidades que já contêm `\$` ou `\%` não são escapadas duas vezes pelo motor. O exemplo de juros mantém seus
448
+ dados, etapas e resposta; a moeda compila em vez de aparecer como erro vermelho. Apresentações pessoais não foram
449
+ editadas.
450
+
451
+ Regressões reproduzidas antes das correções: fundo opaco do rótulo, sobreposição/corte na calculadora, unidade já
452
+ escapada inválida e ausência dos controles no PPTX. Testes direcionados passaram. Conferência visual dos modelos
453
+ e PPTX real de três slides: zero erros de JavaScript, dois controles completos no arquivo. Suíte completa concluída:
454
+ 999 testes, 973 passaram, 26 pulados, zero falhas, encerramento normal em 21 min 13 s. A suíte final, incluindo
455
+ a régua, concluiu com 1000 testes: 974 passaram, 26 pulados, zero falhas, encerramento normal em 22 min 11 s.
456
+ A demo completa atualizada foi gerada pelo Studio em 61 s e baixada com 85 slides; conferidas as três faixas
457
+ coloridas e os dois nomes em caixas editáveis separadas no PPTX. O PR #184 segue a CI Ubuntu/Windows antes do
458
+ merge e atualização local/dev. A CI da main 38135963264 teve erro `ERR_NO_BUFFER_SPACE` do Chrome no Windows no teste
459
+ da aula de APIs; o fluxo foi concluído, mas a exigência de zero erros apontou o erro de rede. O teste passou
460
+ novamente nesta máquina e o job do Windows foi reexecutado, sem relaxar a verificação: concluiu verde em 29 min 51 s,
461
+ junto com o Ubuntu verde em 23 min 55 s. Produção do Oracle fica na 1.7.1.
462
+
463
+ ## Exportação com progresso e download posterior — 10/10/2026
464
+
465
+ Pedido: ao baixar a demo como PowerPoint, não ficava claro se estava gerando, tinha falhado ou já havia terminado.
466
+ Na biblioteca, o aviso sumia após seis segundos; no editor, não havia progresso e o aviso prometia poucos segundos.
467
+
468
+ Editor e biblioteca agora usam uma fila no servidor (`src/studio/export-jobs.js`, `/api/export/jobs`), acompanhada
469
+ por `export-status.js`: preparação, slide atual/total, conclusão do arquivo, tempo decorrido, erro persistente e
470
+ **Pronto para baixar**. Fechar/recarregar a aba não interrompe a geração. Ao voltar à biblioteca ou ao editor, a
471
+ lista reaparece; a aba que pediu tenta iniciar o download quando pronto, e o botão permite baixar novamente.
472
+ O arquivo fica fora da biblioteca/nuvem por até 24 h, enquanto o processo do Studio estiver ligado; mantêm-se
473
+ as dez exportações recentes de cada pessoa. O status e o arquivo só são acessíveis à mesma pessoa no multiusuário.
474
+ Uma geração por vez limita Chrome/memória; pedidos repetidos em andamento reaproveitam a geração existente.
475
+
476
+ PPTX, PDF, roteiro, material de estudo e Baixar tudo informam etapas reais. Os links antigos e compartilhados
477
+ continuam respondendo com o arquivo. Exportar um modelo em prévia não cria uma cópia na biblioteca. Se salvar
478
+ mudanças falha, o editor interrompe a exportação e mantém a mensagem, em vez de gerar a versão antiga.
479
+ Não foi acrescentado envio de email: a demo oficial de 85 slides terminou em 42 s nesta máquina (44 s até o
480
+ download pelo clique na UI), com os 85 slides no PPTX, zero erros de JavaScript no Studio e nenhuma cópia criada.
481
+
482
+ Regressão inicial: o pedido assíncrono retornava 404, sem fila nem arquivo recuperável. Testes verificam progresso,
483
+ PPTX real com textos e notas, fechamento da aba e recuperação pela biblioteca, falha persistente, bloqueio após
484
+ erro ao salvar, deduplicação, expiração e isolamento entre pessoas. Suíte completa concluída em 11/10:
485
+ 995 testes, 969 passaram, 26 pulados, zero falhas, encerramento normal. O PR #183 entrou na `main` em 11/10
486
+ (`8ff7005`), depois da CI 38133476972 concluir verde no Ubuntu (23 min 59 s) e no Windows (32 min 34 s).
487
+ O Oracle dev foi atualizado para esse commit; geração assíncrona e download real de 17 slides conferidos em 7,5 s.
488
+ Produção do Oracle permanece na 1.7.1, sem atualização nem reinício.
489
+ Uma resposta atrasada de uma consulta anterior podia apagar o acompanhamento de um pedido novo e impedir o download
490
+ automático: reproduzido com a resposta retida, agora só expiram gerações que a consulta já conhecia. O painel fica
491
+ abaixo das janelas de configuração; recolhido no editor, sai da área de digitação do chat. Testes verificam os
492
+ cliques nas janelas e o download real depois da resposta atrasada. A versão antiga também criava uma cópia pessoal
493
+ ao exportar um modelo em prévia: reproduzido usando o app.js da main, e a regressão confere o PPTX e a biblioteca.
494
+
495
+ ## Fundo do mapa sem a falsa costa — retomada em 10/10/2026
496
+
497
+ Pedido: esconder a linha marítima do OpenStreetMap que parecia um litoral afastado das áreas. Os modos claro e
498
+ escuro usam agora os estilos Positron e Dark do OpenFreeMap, sem chave; o estilo exclui fronteiras marítimas e
499
+ preserva divisas terrestres, rios e o litoral verdadeiro. O mar fica azul suave no claro e azul profundo no escuro.
500
+ O modo ruas e fundos raster personalizados continuam disponíveis. Configurar mapa ganhou os dois fundos; apagar
501
+ o endereço restaura o padrão (antes, a gravação parcial conservava o endereço antigo).
502
+
503
+ MapLibre e a ligação Leaflet vão no pacote, com as licenças; no HTML exportado, entram embutidos apenas se houver
504
+ mapa vetorial e só carregam no primeiro slide que os usa. O worker é clássico para abrir também por file://. Só o
505
+ slide atual conserva o contexto gráfico; sair e voltar preserva a câmera e a legenda. A exportação mantém o limite
506
+ de espera de 8 s também ao voltar a um mapa cujo fundo não responde. Recusa no estilo, nos
507
+ metadados ou no primeiro tile desliga o fundo na sessão sem insistir, mantendo as camadas e o Tentar de novo.
508
+
509
+ Conferido nos dois fundos reais no litoral do Rio: áreas sobre a costa, nenhuma linha paralela no mar, nenhum erro
510
+ de JavaScript. Regressões reproduziram a falha do worker e o contexto que continuava ativo fora do slide antes das
511
+ correções. Testes cobrem pixels de terra/mar, divisa terrestre versus marítima, exportação por arquivo, câmera,
512
+ retomada, carregamento local no Studio e recusa com uma tentativa. Esta retomada preserva os commits anteriores de
513
+ tour, demos oficiais, editor de mapa, calendário e retirada de tipografia cinética e texto no cenário.
514
+ Na revisão da compatibilidade, um slide antigo com subtítulo e legenda perdia a legenda na conversão. A regressão
515
+ reproduziu a perda; agora os dois textos continuam juntos, com e sem imagem.
516
+ Achado na suíte: o teste da categoria Aula consultava a galeria antes da resposta de prévias. A resposta atrasada
517
+ reproduziu a falha; o teste agora aguarda os cartões e confere que a categoria escolhida durante o carregamento
518
+ continua valendo. Nenhuma exceção de JavaScript foi ignorada.
519
+ Outro achado na suíte: o encerramento das capturas iniciava `browser.close()` sem aguardá-lo. O evento de
520
+ desconexão do navegador antigo podia apagar a referência de um novo, deixando um Chrome aberto e impedindo a suíte
521
+ de terminar. Teste com fechamento atrasado reproduziu o problema; agora o encerramento espera e cada desconexão
522
+ só limpa sua própria referência.
523
+
524
+ Validação completa desta retomada: `npm test`, 988 testes, 962 passaram, 26 pulados, zero falhas; o processo
525
+ encerrou normalmente. A revisão do pacote confirmou os renderizadores e suas licenças no npm. Entrega por PR
526
+ com CI verde no Ubuntu e Windows; atualização da porta local 3517 e somente do Oracle dev (3518). O serviço
527
+ estável do Oracle permanece na 1.7.1, conforme pedido de Narumi. PR #182 mergeado com a CI concluída verde nos
528
+ dois sistemas; dev atualizado para a main `df5d42d`, produção conferida na 1.7.1 com o mesmo processo. As quatro
529
+ worktrees antigas foram removidas depois de conferir os commits incorporados e as duplicatas locais; a pasta
530
+ oficial e seu node_modules foram preservados.
531
+
532
+ ## Texto no cenário sai; fundo claro do mapa com o mar visível — 10/10/2026
533
+
534
+ Narumi: "pode excluir também o texto no cenário. Ele é muito limitado e teoricamente dá para fazer coisas melhores
535
+ pedindo pra IA desenhar". Saiu do motor (`SCENES`, layout `scenography`), do CSS, do Studio (galeria, formulário),
536
+ da vitrine (a demo `templates/cenario`), do tour, da referência e do SKILL; o exemplo de matemática perdeu os três
537
+ slides de cenário. Deck antigo: com imagem, vira imagem de página inteira com o título por cima; sem imagem, frase
538
+ em destaque (`src/fiscal/normalize.js`; `engine.test.js`).
539
+
540
+ 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
541
+ fundo claro, o filtro cinza deixava terra e mar da mesma cor e a fronteira marítima que o OpenStreetMap desenha 12
542
+ milhas mar adentro parecia o litoral. O filtro agora guarda um azul leve no mar (`base.css`; `map.test.js`).
543
+
544
+ ## Mapa: escala única, contornos detalhados e pontos mais bonitos — 10/10/2026
545
+
546
+ Narumi, no slide dos estados: "isso não parece certo". Cada camada tinha a própria escala (a Bahia, 2.900 MW, saía
547
+ tão forte quanto Minas, 5.100): camadas da mesma medida (a mesma coluna e unidade) agora dividem a escala. Os
548
+ contornos embutidos vinham da malha mínima do IBGE simplificada a 4 km (o DF era um octógono; Rio e Vitória na
549
+ borda): agora malha intermediária a ~650 m e países do Natural Earth 1:50m (`scripts/vendor-map.mjs`; o arquivo foi
550
+ 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
551
+ estilo das linhas e áreas era aplicado também aos pontos (borda grossa colorida); agora ponto é pequeno, na cor, com
552
+ anel branco e sombra, bolha é translúcida com contorno da mesma cor, e o rótulo é uma pílula menor. Testes:
553
+ `map.test.js` (escala dividida, contornos detalhados com a área do IBGE, desenho dos pontos).
554
+
555
+ ## Demos de mapa com cada tipo de objeto e onde se edita — 10/10/2026
556
+
557
+ Narumi: "ainda não entendi onde vão os menus e propriedades… mostre não só com pontos, mas com cada tipo de objeto".
558
+ A seção Mapas do Conheça o SagaDeck agora tem: pontos por categoria (o exemplo do layout), bolhas pelo tamanho de
559
+ uma coluna, regiões por valor, linhas e áreas, rota pelas ruas e área alcançável (calculadas uma vez pelo
560
+ OpenRouteService em 10/10/2026 e gravadas no tour, com a fonte na legenda), raio em volta de pontos e faixa em volta
561
+ de uma linha (calculados pelo sagadeck). E dois slides de foco guiado com capturas do Studio: onde fica o Editar mapa
562
+ e a tela do mapa (camadas, ferramentas, propriedades, dica, Concluir). As capturas saem de
563
+ `scripts/capturas-tour.mjs` (refazer quando a tela mudar; precisa de internet). A cópia do tour leva as capturas
564
+ (`demoAssets`). Achado no caminho: a faixa em volta de uma linha (também a que a IA grava) aparecia como uma pilha de
565
+ círculos com contorno e com buracos; agora vai marcada (`_faixa`) e sai como uma mancha só (`map.test.js`,
566
+ `map-analysis.test.js`).
567
+
568
+ ## Calendário com visões e a saída da tipografia cinética — 10/10/2026
569
+
570
+ Narumi: "eu odeio muito a tipografia cinética… se ele não consegue ser melhor, remova completamente". Saiu do motor,
571
+ do runtime, do Studio (galeria, formulário, troca de layout), do tour e da referência. Deck antigo que a usava abre
572
+ como frase em destaque com as mesmas frases, uma por clique (`src/fiscal/normalize.js`; `engine.test.js`).
573
+
574
+ Sobre o calendário ("ficou excelente… mas se tiverem muitos eventos no mesmo mês vai encher de linhas e extrapolar a
575
+ altura"): o cartão cortava os eventos sem avisar. Agora `view` tem `meses` (o de antes), `mes` (um mês grande de
576
+ parede, os eventos escritos nos dias, "+ N mais" quando o dia lota), `semana` (uma coluna por dia com horário; fim
577
+ de semana vazio some) e `lista` (agenda em colunas, a letra diminui com a quantidade). Sem `view`, escolhe pelo que
578
+ cabe, com a altura medida no navegador (mês de 6 semanas conta). `month`/`week` escolhem o mês e a semana; `time` ou
579
+ "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
580
+ grande, com os eventos dele; o "sem data" fica no primeiro). Testes: `calendar.test.js` (as visões, a escolha e, no
581
+ 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
582
+ salvo). O calendário ganhou limite de 240 palavras (é denso por natureza).
583
+
584
+ ## Editar mapa: uma tela própria — 10/10/2026
585
+
586
+ 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
587
+ diferente", e o ponto novo não gravava. O editor antigo era uma barra por cima do slide escalado (cobria o título), só
588
+ editava planilha e GeoJSON de arquivo (a demo tem tudo escrito no slide) e não tinha propriedades. Agora **Editar mapa**
589
+ (ou dois cliques no mapa) abre uma tela só do mapa (`map-editor.js`, classes `mpe-`; `.mx` já era de um layout):
590
+ camadas à esquerda (tipo, nome, quantos itens, olho), o mapa grande com as ferramentas e a dica do que fazer, e à
591
+ direita as propriedades do selecionado (campos com o que cada um faz no mapa, posição, comprimento ou área, excluir) ou
592
+ da camada e do mapa. Edita pontos e formas escritos no slide e em arquivo; GPX e KML só se leem. Corrigidos no caminho:
593
+ gravar arquivo do projeto em prévia de modelo respondia 409 (agora cria a cópia, `server.js`), planilha nova numa pasta
594
+ que não existia falhava (`writeSheet`), pontos ficavam debaixo de áreas e raios que entravam depois (na apresentação
595
+ 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:
596
+ `map-editor.test.js` (os dois caminhos, inclusive a demo em prévia), `project.test.js` (409), `map.test.js` (pontos por
597
+ cima). Achado na suíte: a faixa "Configure a IA" caía na coluna da lateral e espremia a biblioteca (corrigido, com
598
+ teste em `library-ui.test.js`).
599
+
600
+ ## Conheça o SagaDeck com a demonstração dos mapas e a pasta Demos oficiais — 10/10/2026
601
+
602
+ Narumi esperava achar a apresentação junto das dela, numa pasta própria e só leitura. Agora a lateral da biblioteca
603
+ tem **Demos oficiais** (cadeado; `data-view="oficiais"` em `library.js`) com o Conheça o SagaDeck em primeiro e as
604
+ demos de recursos da vitrine (as mesmas chaves da `GALLERY`, tipo `recurso`), com a capa de verdade e só Apresentar e
605
+ Abrir: sem menu de mover, renomear ou excluir, sem arrastar, sem "Nova" dentro. O Conheça aparece também como o
606
+ primeiro cartão de Recentes e Todas, e debaixo da mensagem de biblioteca vazia. Abrem em prévia (`editor?model=…`).
607
+ Defeito achado pelo teste novo: **Apresentar uma prévia criava uma cópia** na biblioteca (o Apresentar mandava o deck
608
+ 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
609
+ deck). Teste: `library-ui.test.js` (pasta, cartões, só leitura, abrir e apresentar sem criar arquivo).
610
+
611
+ **Exemplos sem nada da empresa de quem desenvolve.** Narumi viu o tour falar da Bridge e do processo de experimento e
612
+ projeto (DEV, HOM, PROD, Key Vault): vinha dos exemplos dos layouts (`layout-samples.js`) e da referência que ensina a
613
+ IA. Trocados por assuntos variados (viagem, loja, clínica, inscrições, reciclagem) nos exemplos, na referência, nos
614
+ modelos, nos textos de exemplo da interface e nos testes. Trava: `engine.test.js` ("sem nada da empresa de quem
615
+ desenvolve") falha se nomes de sistemas, processos internos ou produtos do banco voltarem a `src`, `templates`,
616
+ REFERENCIA, README ou SKILL. Os ambientes dev/hom/prod da API são recurso genérico e ficam.
617
+
618
+ Pedido de Narumi: uma apresentação bem completa do próprio sagadeck, incluindo a demo de mapas. O tour ganhou a seção
619
+ **Mapas** (`mapDemos` em `src/studio/tour.js`, slides marcados `demo: mapa`): o exemplo do layout, estados pintados por
620
+ 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
621
+ aceitar), cobertura com raios de 1 km calculados pelo código (`circle` de `src/map-analysis.js`) e dois quadros com o
622
+ que a IA e o Studio fazem no mapa. Os extras ganharam pesquisa na web, versões e material de consulta. Valores
623
+ ilustrativos e traçados aproximados dizem isso na tela. Testes: `engine.test.js` (seção de mapas e o tour inteiro sem
624
+ avisos) e `map.test.js` (GeoJSON no slide). Achado de passagem, tarefa à parte: o Studio acusa "texto pequeno" em
625
+ todo cartão (mede a letra da caixa, não a do texto).
626
+
152
627
  ## Conheça o SagaDeck — 10/10/2026
153
628
 
154
629
  Pergunta de Narumi: a pessoa nem sabe o que dá para gerar. Agora a biblioteca tem, na lateral, **Conheça o