Commit graph

1293 commits

Author SHA1 Message Date
Francisco Solla
5b59e07143
Merge pull request #450 from fsolla/plans/plan-issue-1
docs(plans): B173-B174 — Sollinha: consulta por voz + LLM movido para a Deep Infra
2026-08-08 18:22:55 -03:00
Francisco Solla
343f9f0fae docs(plans): B173-B174 — Sollinha: consulta por voz no chat + LLM movido para a Deep Infra 2026-08-08 18:20:51 -03:00
Francisco Solla
77498c83c1
Merge pull request #447 from fsolla/plans/plan-issue-2
docs(plans): B172 — tendência colapsa para a coluna Ações na lista de municípios
2026-08-08 18:12:13 -03:00
Francisco Solla
89445d17fb docs(plans): B172 — tendência colapsa para a coluna Ações na lista de municípios
Sucessor/refino do B158: onde a coluna Tendência colapsaria para ícone no
próprio lugar, esconder a coluna inteira e mostrar o editor como ícone em
Ações, ao lado do ícone de atualização. Uma instância por linha (invariante
B158). Related #446.
2026-08-08 18:09:33 -03:00
Francisco Solla
9b6fa2763c
Merge pull request #445 from fsolla/plans/plan-issue
docs(plans): mark B171 plan ready
2026-08-08 18:06:53 -03:00
Francisco Solla
a097252af7 docs(plans): B171 status ready após promote 2026-08-08 18:05:30 -03:00
Francisco Solla
031521b4f5
Merge pull request #442 from fsolla/B169-estabilizar-a-lista-de-dobradinhas-parar-o-flicker-de-l
B169 — Estabilizar a lista de Dobradinhas (parar o flicker de linhas/colunas)
2026-08-08 18:04:19 -03:00
Francisco Solla
63e5ea1c51
Merge pull request #444 from fsolla/plans/plan-issue
docs(plans): B171 barra inferior mobile + C89 página Atualizações
2026-08-08 18:04:17 -03:00
Francisco Solla
bef68678ff docs(plans): B171 barra inferior mobile (folga + rótulos) e C89 página Atualizações (feed + filtro + criar) 2026-08-08 18:01:29 -03:00
Francisco Solla
3d55d5760f B169 — estabilizar a lista de Dobradinhas: medir overflow de chips antes da paint (useLayoutEffect)
O ciclo medir→recolher de RelationChipCell rodava em useEffect (pós-pintura),
fazendo cada remount (navegação RSC, paginação, ordenação, filtro) pintar o
clamp max-h-18 e só então colapsar para o slice de 3 linhas — uma onda de
LayoutShift por célula (tabela 1122→682px). Mudar os 3 effects de
medição/invalidação para useLayoutEffect faz a primeira pintura já chegar na
altura final (medido: tabela estável, zero LayoutShift nas navegações).

Documenta o resíduo do load SSR (paint pré-hidratação) e registra follow-up
B170 (#441) para o spec do contrato de colapso + avaliação do shift único.
2026-08-08 17:53:20 -03:00
Francisco Solla
09d44c1b9d
Merge pull request #435 from fsolla/C90-remodelar-responsaveis-da-atividade-campo-unico-polimorf
C90 — remodela responsáveis da Atividade (campo único polimórfico)
2026-08-08 17:25:02 -03:00
Francisco Solla
d48cb9ed91
Merge pull request #440 from fsolla/plans/c92-c95-agenda-header-feed
docs(plans): C92–C95 — agenda: feed link, sem-filtros, combobox e header do app
2026-08-08 17:23:19 -03:00
Francisco Solla
0d5bf274ff docs(plans): C92-C95 — agenda: corrigir feed link, sem-filtros, combobox e header do app 2026-08-08 17:20:48 -03:00
Francisco Solla
63642483a4 feat(C90): remodela responsáveis da Atividade em campo único polimórfico
Um campo responsible (staff campaignUser · leadership · stateDeputy) multi-valor
substitui responsible/Contact + advisors + leadership; assessor mantém acesso via
notação-objeto equals no access; nova migração esquema+dados (advisors/leadership
→ responsible); busca q da lista título-only; notificação notifica staff do campo.
Closes #426
2026-08-08 17:10:48 -03:00
Francisco Solla
8b2bc51aa5
Merge pull request #433 from fsolla/plans/plan-issue
worktree: plan cria um worktree diferente por invocação (paralelismo /plan-issue)
2026-08-08 16:52:26 -03:00
Francisco Solla
6c8c466b40 fix(worktree): plan cria um worktree diferente por invocação (paralelismo /plan-issue)
Cada 'pnpm worktree plan' agora deriva um branch próprio: plans/plan-issue-<bag>
quando um bag é passado (sufixo -2/-3 em colisão) ou o próximo sequencial
plans/plan-issue-<n> quando não. O prefixo minúsculo plans/… nunca colide com o
branch <Code>-<slug> de 'next'. planBranchName (scripts/lib/worktree.mjs)
unit-testado; docs e shell/command atualizados.
2026-08-08 16:40:05 -03:00
Francisco Solla
1adf5f3d73
Merge pull request #432 from fsolla/B166-largura-padrao-do-chat-sollinha-com-teto-no-desktop
feat(B166): largura padrão do chat Sollinha com teto de 360 px e resize livre persistido
2026-08-08 16:24:30 -03:00
Francisco Solla
fe38127c8e style(plans): B166 — formata impl plan 2026-08-08 16:11:25 -03:00
Francisco Solla
819a015911
Merge pull request #431 from fsolla/worktree-plan-command
worktree: comando plan — worktree dedicado ao /plan-issue
2026-08-08 16:08:41 -03:00
Francisco Solla
ad30686a63 docs(plans): B166 — desfecho da revisão no impl plan 2026-08-08 16:06:49 -03:00
Francisco Solla
441c8d1156 refactor(B166): endurece e2e (poll determinístico) e clamp exato após revisão 2026-08-08 16:04:54 -03:00
Francisco Solla
c399b918c3 feat(worktree): comando plan — worktree dedicado ao /plan-issue
Novo subcomando `pnpm worktree plan [--go] [--no-migrate]` cria/reutiliza o
worktree de planejamento no branch fixo `plans/plan-issue`
(`PLAN_WORKTREE_BRANCH`), sem vínculo com a fila de claim: um `next` posterior
da próxima Issue nunca colide em branch nem em slot (slot derivado por hash do
branch, bumpado entre worktrees vivos). Mesmo provisionamento isolado do
`next` — porta 3100+slot, bancos teqo_wt<slot>/teqo_wt<slot>_test, migrations.

- scripts/worktree.mjs: cmdPlan + provision() com purpose/issue opcionais
- scripts/lib/worktree.mjs: constante PLAN_WORKTREE_BRANCH
- tests/unit/worktree.unit.spec.ts: derivação de slot do plano
- docs: .opencode/commands/worktree.md, shell, skills, AGENTS.md, changelog
2026-08-08 16:00:27 -03:00
Francisco Solla
2ca1afa6a7 feat(B166): largura padrão do chat Sollinha com teto de 360 px e resize livre persistido 2026-08-08 15:32:07 -03:00
Francisco Solla
ec0b109b5a
Merge pull request #430 from fsolla/B168-desfazer-encadeamento-automatico-das-acoes-rapidas-do-w
B168 — Desfazer o encadeamento automático das ações rápidas do wizard
2026-08-08 14:30:27 -03:00
fsolla
7faf3ed27f feat(campanha): B168 — desfazer encadeamento automático das ações rápidas do wizard
Ações de ajuste (votos, tendência, atualização, liderança) agora retornam à
origem ao salvar (toast + from allowlist B110 / Início), sem avançar sozinhas
para outro wizard. Removidos fila de encadeamento (wizardActionChain.ts),
param entry, skip/Pular (chrome mobile sempre X) e prefill de nota sem
produtor. Liderança: botão pós-save 'Continuar' → 'Concluir' (origem).
Sem migration.
2026-08-08 14:10:47 -03:00
Francisco Solla
728f92fe60
Merge pull request #429 from fsolla/plans/c90-c91-responsaveis-agenda
docs(plans): C90 — remodelar responsáveis; C91 — criar evento inline na agenda
2026-08-08 14:00:47 -03:00
Francisco Solla
9820c92ecc docs(plans): C90 — remodelar responsáveis da Atividade; C91 — criar evento inline na agenda 2026-08-08 13:58:40 -03:00
Francisco Solla
d1cf8a045b
Merge pull request #427 from fsolla/B169-estabilizar-lista-dobradinhas
docs(plans): B169 — estabilizar a lista de Dobradinhas (flicker)
2026-08-08 13:56:34 -03:00
Francisco Solla
d3dbcbaf42 docs(plans): B169 — estabilizar a lista de Dobradinhas (flicker de linhas/colunas) 2026-08-08 13:54:18 -03:00
Francisco Solla
a3f297c6d2
Merge pull request #420 from fsolla/B164-barra-de-navegacao-inferior-no-mobile-pagina-mais
B164: barra de navegação inferior no mobile para staff
2026-08-08 13:06:53 -03:00
Francisco Solla
530bed9ca1 force CI re-run 2026-08-08 12:57:05 -03:00
Francisco Solla
81a8745bc4 fix: raise FAB above AI assistant button on mobile
The AI FAB (Sollinha) sits at bottom-20 (80px) with z-40 in a different
stacking context. Moving the Quick Actions FAB from bottom-4 to
bottom-[calc(4rem)] for the bottom nav caused overlap at the shared
z-40, so the AI button intercepted clicks. Raised to 7rem (112px) to
clear both the bottom nav (4rem) and the AI FAB button (ending at 7rem).
2026-08-08 12:57:05 -03:00
Francisco Solla
bd06018bde B164: barra de navegação inferior no mobile para staff
Mobile bottom nav (staff only): 5 items (Início, Municípios, Atualizações,
Agenda, Mais) with Drawer overflow for secondary destinations. Leader and
desktop remain sidebar-only. FAB + scroll padding adjusted for safe-area.

Resolves #400
2026-08-08 12:57:05 -03:00
Francisco Solla
b838d19447
Merge pull request #424 from fsolla/agenda-calendario-mobile-edge-to-edge
fix(campanha): agenda edge-to-edge no mobile
2026-08-08 12:55:07 -03:00
Francisco Solla
6ed61f1cb4
Merge pull request #423 from fsolla/B165-territorio-mais-perto-do-nome-na-lista-de-municipios
feat(B165): território colado ao nome na célula da lista de municípios
2026-08-08 12:54:46 -03:00
Francisco Solla
9966709b0b fix(campanha): agenda edge-to-edge no mobile 2026-08-08 12:42:28 -03:00
Francisco Solla
59948ea1ef feat(B165): território colado ao nome na célula da lista de municípios
A célula de nome lia 'nome + território' como bloco: a altura mínima da
linha passa a viver no wrapper da célula (preservando o alinhamento dos
controles), o link do nome perde o espaço vazio forçado abaixo do texto
e o TerritoryLink ganha a variante compact na tabela desktop (o card
mobile mantém os 44px de alvo de toque).

Verificado geometricamente no browser (1 e 2 linhas): vão texto→texto
de 2–4px, sem sobreposição, links intactos, linha com nome curto sem
desalinhar as demais colunas.

Closes #412
2026-08-08 12:38:04 -03:00
Francisco Solla
78d39f3b44 docs(plans): B168 — desfazer encadeamento automático das ações rápidas do wizard 2026-08-08 12:35:45 -03:00
Francisco Solla
9447686edf
Merge pull request #421 from fsolla/worktree-envs-isoladas
feat(scripts): worktree next provisiona ambientes isolados (porta + bancos + migrations)
2026-08-08 11:51:46 -03:00
Francisco Solla
25773d0296
feat(C16): add calendar feed sync by filter with Google Calendar import link (#419)
- Add calendarFeed collection with secret slug credential
- Add iCal feed endpoint at /campanha/agenda/ical/[secret] (unauthenticated)
- Add server actions for creating and revoking calendar feeds
- Add CalendarFeedButton UI component in agenda filters bar
- Add unit tests for iCal generation
- Fail-closed access: feed re-evaluates creator's municipality scope on each read
- Leader lockdown preserved; no PII in feed output
2026-08-08 14:47:17 +00:00
Francisco Solla
c71ee61ad0 docs(plans): OPS19 — purge de resíduo de assessores nos fixtures int
Plano curto do débito identificado durante os testes de envs de
worktree: purgeMunicipalityResidue não limpa municipality.advisors;
run interrompido deixa resíduo que flaka os specs de cap (10
assessores) na suite completa.
2026-08-08 11:33:11 -03:00
Francisco Solla
8125334401 feat(worktree): ambientes isolados por worktree — porta própria, bancos próprios, migrations no provision
pnpm worktree next [--go] [--no-migrate] agora provisiona um ambiente
determinístico por worktree: slot = parte numérica do código da Issue
(C15→15; hash sem dígitos; bump em colisão entre worktrees vivos), dev
server em 3100+slot, bancos teqo_wt<slot> / teqo_wt<slot>_test no
container compartilhado (-p teqo) com a cadeia de migrations aplicada;
escreve .env.local + .env.test.local (gitignored, marcador gerado; envs
manuais nunca sobrescritos) e copia PAYLOAD_SECRET/Blob/VAPID do main.
kill remove o worktree e dropa os bancos gerados (WITH FORCE, best-effort).

Suites leem .env.test.local depois de .env.test (vitest.setup /
playwright / db-doctor / gate-ci espelham o layering) e
assertTestDatabase aceita teqo_test ou teqo_<worktree>_test em localhost
só (fail-closed preservado). db:start/db:stop fixam -p teqo (um
container de qualquer diretório); max_connections 200→400. Sem Docker
(Cursor Cloud): degrada ao compartilhado com aviso.

Derivação pura em scripts/lib/worktree-env.mjs (unit-tested); fluxo
validado end-to-end: provision → migrate → 598/598 int no banco do
worktree → kill sem resíduo.
2026-08-08 11:33:07 -03:00
Francisco Solla
4736533723
Merge pull request #417 from fsolla/B167-migrar-chat-painel-drawer-resize
B167 — Migrar o chat Sollinha entre painel e drawer no resize (plano de intenção)
2026-08-08 10:37:57 -03:00
Francisco Solla
73f4a18d42 docs(plans): B167 — migrar o chat Sollinha entre painel e drawer no resize
Plano de intenção: migração bidirecional painel<->drawer com chat aberto,
conversa durando a sessão do site (nova aba reinicia). Related #416.
2026-08-08 10:36:27 -03:00
Francisco Solla
b171961d3f
Merge pull request #415 from fsolla/B166-largura-padrao-chat-sollinha
B166 — Largura padrão do chat Sollinha com teto no desktop (plano de intenção)
2026-08-08 10:09:27 -03:00
Francisco Solla
4e664c7364 style(plans): prettier-format B166 plan 2026-08-08 10:07:52 -03:00
Francisco Solla
b31e33b709 docs(plans): B166 — largura padrão do chat Sollinha com teto no desktop
Plano de intenção para abertura do painel do chat: min(25%, 360px),
resize livre sem teto e persistência do último tamanho. Related #414.
2026-08-08 10:06:54 -03:00
Francisco Solla
f57ed99383
Merge pull request #413 from fsolla/B165-territorio-perto-nome-lista-municipios
B165 — Território mais perto do nome na lista de municípios (plano de intenção)
2026-08-07 14:50:07 -03:00
Francisco Solla
89c241183e docs(plans): B165 — território mais perto do nome na lista de municípios
Plano de intenção para o vão nome↔território na célula name de
/campanha/municipios. Related #412.
2026-08-07 14:48:07 -03:00
Francisco Solla
821d6346a7
Merge pull request #411 from fsolla/agenda-visao-dia
feat(campanha): agenda — visão Dia (timeGridDay) + troca responsiva semana/dia
2026-08-07 10:24:33 -03:00