sagadeck 1.7.1 → 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.
- package/README.md +55 -4
- package/SKILL.md +10 -3
- package/bin/sagadeck.js +23 -0
- package/docs/ANDAMENTO.md +483 -1
- package/docs/PLANO-MELHORIAS.md +180 -0
- package/docs/REFERENCIA.md +184 -105
- package/package.json +34 -2
- package/src/ai/commands.js +2 -2
- package/src/ai/deck-ai.js +14 -5
- package/src/ai/ia-check.js +127 -0
- package/src/ai/ia-config.js +2 -2
- package/src/ai/llm.js +5 -1
- package/src/ai/map-analysis-run.js +119 -0
- package/src/ai/map-data.js +221 -0
- package/src/ai/quality.js +1 -1
- package/src/ai/video-generation.js +70 -25
- package/src/build.js +51 -15
- package/src/elements.js +39 -1
- package/src/export/browser.js +23 -1
- package/src/export/pptx.js +9 -3
- package/src/export/shots.js +10 -3
- package/src/fiscal/normalize.js +19 -0
- package/src/fs-retry.js +37 -2
- package/src/import/office.js +5 -4
- package/src/layouts.js +114 -99
- package/src/lessons.js +1 -1
- package/src/library.js +7 -7
- package/src/map-analysis.js +109 -0
- package/src/map-config.js +89 -0
- package/src/map-routing.js +82 -0
- package/src/map-services.js +60 -0
- package/src/map.js +274 -0
- package/src/mcp/server.js +17 -0
- package/src/motion.js +20 -6
- package/src/purpose.js +1 -1
- package/src/runtime/base.css +105 -329
- package/src/runtime/fit.js +3 -2
- package/src/runtime/fonts/amatic-sc.css +3 -0
- package/src/runtime/fonts/bebas-neue.css +2 -0
- package/src/runtime/fonts/cabin-sketch.css +2 -0
- package/src/runtime/fonts/fraunces.css +3 -0
- package/src/runtime/fonts/gelasio.css +3 -0
- package/src/runtime/fonts/ibm-plex-mono.css +4 -0
- package/src/runtime/fonts/index.json +10 -1
- package/src/runtime/fonts/itim.css +2 -0
- package/src/runtime/fonts/montserrat.css +2 -0
- package/src/runtime/fonts/space-grotesk.css +2 -0
- package/src/runtime/map-background.js +91 -0
- package/src/runtime/map.js +266 -0
- package/src/runtime/runtime.js +81 -100
- package/src/runtime/skins/caderno.css +33 -0
- package/src/runtime/skins/cartaz.css +27 -0
- package/src/runtime/skins/infografico.css +29 -0
- package/src/runtime/skins/lousa.css +22 -0
- package/src/runtime/skins/musgo.css +42 -0
- package/src/runtime/vendor/LEAFLET-LICENSE.txt +26 -0
- package/src/runtime/vendor/MAPLIBRE-LEAFLET-LICENSE.txt +15 -0
- package/src/runtime/vendor/MAPLIBRE-LICENSE.txt +116 -0
- package/src/runtime/vendor/geo-contornos.json +1 -0
- package/src/runtime/vendor/leaflet.css +661 -0
- package/src/runtime/vendor/leaflet.js +6 -0
- package/src/runtime/vendor/maplibre-gl.css +1 -0
- package/src/runtime/vendor/maplibre-gl.js +825 -0
- package/src/runtime/vendor/maplibre-leaflet.js +234 -0
- package/src/runtime/vendor/maplibre-worker.js +10 -0
- package/src/studio/ai-chat-route.js +20 -0
- package/src/studio/assets/imagens/tour-mapa-botao.jpg +0 -0
- package/src/studio/assets/imagens/tour-mapa-editor.jpg +0 -0
- package/src/studio/command-approval.js +2 -3
- package/src/studio/demo-decks.js +6 -2
- package/src/studio/export-jobs.js +86 -0
- package/src/studio/exporting.js +36 -18
- package/src/studio/feature-demos.js +144 -0
- package/src/studio/geo-routes.js +138 -0
- package/src/studio/ia-routes.js +9 -0
- package/src/studio/layout-samples.js +78 -16
- package/src/studio/library-routes.js +0 -9
- package/src/studio/project.js +2 -1
- package/src/studio/public/ai-settings.js +6 -3
- package/src/studio/public/app.js +46 -52
- package/src/studio/public/explorer.js +23 -8
- package/src/studio/public/export-status.js +154 -0
- package/src/studio/public/index.html +17 -10
- package/src/studio/public/library.css +12 -3
- package/src/studio/public/library.html +3 -0
- package/src/studio/public/library.js +39 -12
- package/src/studio/public/map-data.js +158 -0
- package/src/studio/public/map-editor.js +676 -0
- package/src/studio/public/map-fields.js +21 -0
- package/src/studio/public/map-settings.js +86 -0
- package/src/studio/public/slide-form.js +19 -16
- package/src/studio/public/style.css +58 -0
- package/src/studio/public/ui-icons.js +1 -1
- package/src/studio/public/viewers.js +2 -1
- package/src/studio/public/visual-editor.js +1 -1
- package/src/studio/server.js +34 -9
- package/src/studio/snapshot.js +8 -4
- package/src/studio/template-collections.js +1 -1
- package/src/studio/tour.js +158 -0
- package/src/themes.js +154 -0
- package/templates/cenario-e-ciencia.yaml +1 -21
- package/templates/ensaio-api.yaml +3 -3
- package/templates/cenario/Texto no cen/303/241rio.yaml" +0 -171
- package/templates/cenario/imagens/cidade.svg +0 -30
- package/templates/cenario/imagens/pessoa.svg +0 -15
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.
|
|
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,6 +169,361 @@ 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
|
|
|
172
|
+
## Frente: mapa (planejada e publicada em 10/10/2026, versão 1.8.0)
|
|
173
|
+
|
|
174
|
+
Pedido de Narumi, depois de muita conversa. **Leia antes de mexer.** Recurso de nicho, mas completo: mostrar e
|
|
175
|
+
explicar algo geográfico (pontos de interesse de qualquer tipo, linhas, áreas), com a IA montando a partir de dados.
|
|
176
|
+
Não é um QGIS: análise pesada fica lá; aqui é apresentar bem, com contas simples feitas pelo código.
|
|
177
|
+
|
|
178
|
+
**Decisões (não reabrir):**
|
|
179
|
+
- **Internet não é limitação.** Recurso online é bem-vindo e fica disponível onde funciona; onde não funciona, some ou
|
|
180
|
+
avisa. Nada de "assar/chapar" o mapa de fundo no deck (ela odiou): mapa **ao vivo** (Leaflet, embutido no pacote).
|
|
181
|
+
- **Nada bancário nem de setor nenhum**: pontos de interesse genéricos (sensor, hidrômetro, placa solar, cinema,
|
|
182
|
+
órgão público…). Exemplos, REFERENCIA e testes com casos variados.
|
|
183
|
+
- **A planilha é a fonte, o mapa é a vista**: pontos em CSV do projeto (`contexto/*.csv`, importa XLSX); linhas e
|
|
184
|
+
polígonos em GeoJSON do projeto (importa GPX/KML). O slide diz qual arquivo e quais colunas (posição, cor, tamanho,
|
|
185
|
+
rótulo). A mesma planilha serve tabela e gráfico.
|
|
186
|
+
- **Carregamento preguiçoso** em quatro níveis: o Leaflet só entra no HTML de deck com mapa; o mapa só liga (e só pede
|
|
187
|
+
tiles) quando o slide aparece; o editor de mapa no Studio vem por import dinâmico; os módulos de serviço no servidor
|
|
188
|
+
só no primeiro pedido. Teste para os três primeiros.
|
|
189
|
+
- **Uma tentativa e para**: erro de autorização ou bloqueio (401, 403, 407, recusa, certificado, até 429) marca o
|
|
190
|
+
serviço indisponível na sessão; só volta com "Tentar de novo" ou reabrindo o Studio. Tiles: se os primeiros falham
|
|
191
|
+
sem nenhum sucesso, a camada de fundo desliga e aparece aviso (camadas continuam). **Sem teste proativo** de
|
|
192
|
+
serviço: o primeiro uso real é o teste. Teste: serviço com 403 recebe exatamente um pedido.
|
|
193
|
+
- **Pedidos saem do navegador no Studio local** (mesmo caminho/proxy do Google Maps, que abre na rede do trabalho; o
|
|
194
|
+
Node não usa o proxy do sistema). No multiusuário, do servidor (a chave não vai para a página dos outros).
|
|
195
|
+
- **Serviços padrão gratuitos**, todos configuráveis em **Configurar mapa** (`~/.sagadeck/mapa.json`, como o ia.json):
|
|
196
|
+
tiles do OpenStreetMap, Nominatim (endereço↔coordenada), Overpass (busca de lugares/linhas/áreas), OSRM
|
|
197
|
+
(rotas, encaixe de GPS) e OpenRouteService (rotas e isócronas; chave da Narumi já está no mapa.json desta máquina,
|
|
198
|
+
nunca no repositório). Respeitar as políticas: atribuição visível "© colaboradores do OpenStreetMap", identificação
|
|
199
|
+
do sagadeck, Nominatim 1/s e cache obrigatório (lote grande: avisar e sugerir provedor com chave), nada de baixar
|
|
200
|
+
tiles fora da tela. Públicos de OSRM/Overpass são não comerciais: para uso no trabalho, servidor da empresa ou chave.
|
|
201
|
+
- **A IA**: recebe no prompt o estado de cada serviço (funcionando, não usado, bloqueado) e decide; o código recusa
|
|
202
|
+
sem pedido de rede o que está bloqueado. Pergunta antes de mandar **dados da pessoa** a serviço de fora (primeira vez
|
|
203
|
+
por planilha) e antes de lote grande (tempo estimado). Geometria nunca inventada: vem de dados, do OSM ou do cálculo.
|
|
204
|
+
Testes: mock (encanamento) e ao vivo (decisão).
|
|
205
|
+
- PDF/PPTX capturam o mapa como está na tela na exportação; camada por clique vira animação no PPTX.
|
|
206
|
+
|
|
207
|
+
**Entregas (uma branch/PR cada, com testes e CI verde):**
|
|
208
|
+
1. **Feita (10/10).** Slide `map`: motor `src/map.js` (CSV com colunas de posição achadas pelo nome, GeoJSON, GPX,
|
|
209
|
+
KML, `areas` por UF/país com os contornos embutidos `src/runtime/vendor/geo-contornos.json`; cor por categoria
|
|
210
|
+
na paleta do tema `c1…c5` ou escala por número, tamanho, rótulo, cartão; prévia SVG para miniaturas), mapa ao vivo
|
|
211
|
+
`src/runtime/map.js` (Leaflet 1.9.4 embutido por `scripts/vendor-map.mjs`, só em deck com mapa; monta só no slide
|
|
212
|
+
atual; testa **um** tile antes de ligar o fundo e, se falhar, nenhum outro mapa da sessão tenta; legenda que liga e
|
|
213
|
+
desliga; camada por clique com marcadores `data-step` e câmera por camada), configuração da máquina
|
|
214
|
+
`src/map-config.js` (`~/.sagadeck/mapa.json`; só o fundo vai para o deck), exportação abrindo o deck com mapa por
|
|
215
|
+
endereço local (Referer) e esperando o mapa de cada slide (`settleSlide`), formulário `map-fields.js`, REFERENCIA,
|
|
216
|
+
exemplo de layout (entra no Conheça o SagaDeck). Testes: `test/map.test.js` (motor, apresentação com servidor de
|
|
217
|
+
tiles falso, 403 recebe exatamente um pedido, exportação) e `studio.test.js` (inserir mapa, monta, trocar fundo
|
|
218
|
+
salva). Achados no caminho: coordenada "-46.702" lida como milhar pelo leitor de números (agora `coordNum`); a
|
|
219
|
+
classe `widget` na caixa fazia o runtime trocar o conteúdo; rota do `map.js` com cache servia código velho.
|
|
220
|
+
Pendente para depois: geocodificar `at: "Recife"` (entrega 2) e contornos de reserva quando o fundo falha.
|
|
221
|
+
2. **Feita (10/10).** A tela de dados é a planilha da aba Arquivos (`sheetGrid`, já editável e colando do Excel),
|
|
222
|
+
com as ferramentas de mapa (`src/studio/public/map-data.js`): **Pôr no mapa** (adivinha cor pela coluna de
|
|
223
|
+
categorias que se repetem e rótulo pela de nome; `.xlsx` ganha um CSV ao lado), **Achar coordenadas** (pergunta o
|
|
224
|
+
plano antes e mostra quantos endereços, para qual serviço e quanto tempo; só envia com o sim; progresso; o que não
|
|
225
|
+
achou fica listado; cache em `.sagadeck/geocodificacao.json`, consentimento em `.sagadeck/mapa-consentimento.json`)
|
|
226
|
+
e a **seleção ligada** (clicar no ponto seleciona a linha; selecionar a linha abre o cartão). Servidor:
|
|
227
|
+
`src/map-services.js` (pedidos identificados `sagadeck/versão`, uma tentativa e para, estado de cada serviço) e
|
|
228
|
+
`src/studio/geo-routes.js` (`/api/mapa`, `/api/mapa/tentar`, `/api/mapa/geocode` em ndjson). Tela **Configurar
|
|
229
|
+
mapa** (`map-settings.js`, botão no formulário do mapa). Decisão: a busca de endereço sai do servidor do Studio
|
|
230
|
+
(a política do Nominatim pede identificação, que o navegador não deixa mudar); os tiles saem do navegador.
|
|
231
|
+
Testes: `test/map-data.test.js`. Fica para depois: abrir GeoJSON como tabela.
|
|
232
|
+
3. **Feita (10/10).** Editor `src/studio/public/map-editor.js`, carregado só no clique em **Editar no mapa** (botão e
|
|
233
|
+
barra no `#canvas-viewport`, fora do slide escalado): Mover (arrastar ponto atualiza a linha da planilha; clicar
|
|
234
|
+
numa linha/área abre os vértices: arrastar, apagar, dividir; juntar linhas pelas pontas mais próximas), Ponto
|
|
235
|
+
(linha nova na planilha da camada, endereço pelo `/reverse`), Linha e Área (GeoJSON da camada ou
|
|
236
|
+
`contexto/desenhos.geojson`; "Seguir as ruas" a pé/carro/bicicleta pelo `/api/mapa/rota`), Régua, Usar esta vista
|
|
237
|
+
(grava `view` no slide); comprimento e área ao vivo. O Studio guarda a vista entre redesenhos (`keepView`). Rotas,
|
|
238
|
+
endereço de um ponto e área alcançável em `src/map-routing.js` (OpenRouteService com chave, testado ao vivo com a
|
|
239
|
+
chave da Narumi: 817 m a pé, isócrona de 5 min; ou OSRM). Chave do mapa como a da IA: tela Configurar mapa com
|
|
240
|
+
"Usar o OpenRouteService" e Testar, botão na biblioteca, `keyEnv` (variável de ambiente, para o servidor). README
|
|
241
|
+
com a seção "Mapa (opcional)". Achados: o editor visual capturava o clique no mapa (agora ignora `.map-live`); o
|
|
242
|
+
projeto não gravava `.geojson/.gpx/.kml` como texto. Testes: `test/map-editor.test.js` e `map-data.test.js`.
|
|
243
|
+
Retomada: PR #178 mergeado após CI verde no Ubuntu e no Windows. A corrida do arrastar passou; a falha restante era
|
|
244
|
+
uma releitura ao clicar na aba de planilha já ativa, que substituía a grade e apagava a seleção feita pelo mapa.
|
|
245
|
+
O clique agora mantém a aba ativa. Regressão com resposta atrasada reproduziu a falha antes da correção e passou
|
|
246
|
+
depois; mapa/planilha e editor: 6 testes passando. Suíte completa: 950 passaram, 22 pulados, zero falhas.
|
|
247
|
+
4. **Feita (10/10).** A IA que edita o deck pede dados com um bloco `mapa:` (como o `ver:` do material; nenhuma
|
|
248
|
+
chamada a mais quando o pedido não é de mapa): `lugares` e `linhas` (Overpass, com o filtro de tags que ela
|
|
249
|
+
escolhe e o centro achado no Nominatim), `contorno` (Nominatim com polígono), `web` (a pesquisa existente + uma
|
|
250
|
+
extração que só usa o que leu, com a URL de cada linha; as coordenadas vêm depois) e `coordenadas` (planilha da
|
|
251
|
+
pessoa; sem `confirmado: true`, o código pergunta "Posso enviar?" com opções e não envia nada). O Studio executa
|
|
252
|
+
(`src/ai/map-data.js`), grava em `contexto/` com a coluna `fonte` e chama a IA de novo (até 2 rodadas). O prompt
|
|
253
|
+
(`mapDataPrompt`) leva o estado de cada serviço; bloqueado não recebe pedido e a IA fica sabendo. Testes:
|
|
254
|
+
`test/map-ai.test.js` (encanamento, LLM falso) e 3 ao vivo em `test/ai-live.test.js` (pede `amenity=cinema` perto
|
|
255
|
+
de Campinas; não se dá o sim sozinha; com a busca bloqueada, não pede e oferece alternativa), todos passando com o
|
|
256
|
+
modelo de verdade. Conferido com o OpenStreetMap real: 5 cinemas num raio de 8 km do centro de Campinas (o
|
|
257
|
+
Overpass público às vezes responde 504 por sobrecarga; o sagadeck registra e não insiste).
|
|
258
|
+
5. **Feita (10/10), no mesmo PR da 4.** Contas puras em `src/map-analysis.js` (haversine, mais próximo, raio, ponto em
|
|
259
|
+
polígono com buraco, distância a linha, círculo, faixa em volta de linha para desenhar, "onde instalar" por grade e
|
|
260
|
+
escolha gulosa) e as ações do bloco `mapa:` em `src/ai/map-analysis-run.js`: `mais_proximo` (CSV com
|
|
261
|
+
`mais_proximo` e `distancia_m`), `contar` (por área ou raio, grava o círculo), `faixa` (GeoJSON da faixa e quantos
|
|
262
|
+
pontos dentro, pela distância exata à linha), `sugerir` (CSV de sugestões, avisando que é geométrico), `rota`
|
|
263
|
+
(distância e tempo), `alcance` (isócronas, só com OpenRouteService) e `encaixar` (OSRM `/match`, amostrando até 100
|
|
264
|
+
pontos). A IA só narra os números. Achado: pontos todos alinhados deixavam o "onde instalar" sem resposta (retângulo
|
|
265
|
+
de altura zero). Testes: `test/map-analysis.test.js` e o ao vivo "qual loja fica mais perto de cada pedido" (pede
|
|
266
|
+
`mais_proximo`).
|
|
267
|
+
|
|
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,
|
|
292
|
+
956 passaram, 26 pulados, zero falhas; mapa/editor/exportação/leitores e regras: 22 testes direcionados passaram.
|
|
293
|
+
Na revisão com cliques reais, a planilha cobria o mapa inteiro e a legenda interceptava um ponto no enquadramento
|
|
294
|
+
automático. Corrigidos: a planilha fica ao lado do mapa (sugestões de gráfico recolhidas, com botão para abrir), a
|
|
295
|
+
seleção funciona nas duas direções e o enquadramento reserva espaço para a legenda. O teste reproduziu a obstrução
|
|
296
|
+
antes da correção e agora clica no ponto e na célula, sem disparar eventos sintéticos.
|
|
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
|
+
|
|
512
|
+
## Conheça o SagaDeck — 10/10/2026
|
|
513
|
+
|
|
514
|
+
Pergunta de Narumi: a pessoa nem sabe o que dá para gerar. Agora a biblioteca tem, na lateral, **Conheça o
|
|
515
|
+
SagaDeck** (também na vitrine, em Recursos do SagaDeck): uma apresentação com um slide por recurso, agrupada em
|
|
516
|
+
seções, que abre em prévia (nada é gravado; "Usar como base" cria a cópia em Modelos).
|
|
517
|
+
|
|
518
|
+
- `src/studio/tour.js` monta-se sozinha dos exemplos de layout (`LAYOUT_SAMPLES`): layout novo entra sem ninguém
|
|
519
|
+
lembrar; layout fora dos grupos cai em "Mais recursos". Fecha com o que não é layout (criar e conversar com a IA,
|
|
520
|
+
leitura crítica, importar PowerPoint, gráfico da planilha, temas, apresentador, PDF/PowerPoint, link).
|
|
521
|
+
- Cada slide traz nas **notas** (visíveis abaixo do slide no Studio e na visão do apresentador) o nome, a descrição e
|
|
522
|
+
a frase para pedir à IA (`LAYOUT_ASK` em `layout-samples.js`, exemplos de áreas variadas); no rodapé (`source`)
|
|
523
|
+
também, nos layouts que o desenham. Os links de navegação dos exemplos saem (apontariam para slides inexistentes).
|
|
524
|
+
- Testes: `engine.test.js` (todo layout tem pedido e aparece no tour, com nome e pedido; renderiza) e
|
|
525
|
+
`library-ui.test.js` (a lateral abre em prévia e nada é criado na biblioteca).
|
|
526
|
+
|
|
45
527
|
## Sem citar o programa de apresentações da maçã (1.7.1) — 10/10/2026
|
|
46
528
|
|
|
47
529
|
Pedido de Narumi: o código e a documentação não citam o programa de apresentações da maçã, a empresa nem os
|