Commit graph

632 commits

Author SHA1 Message Date
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
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
ad30686a63 docs(plans): B166 — desfecho da revisão no impl plan 2026-08-08 16:06:49 -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
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
d3dbcbaf42 docs(plans): B169 — estabilizar a lista de Dobradinhas (flicker de linhas/colunas) 2026-08-08 13:54:18 -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
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
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
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
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
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
c5001b5005
Merge pull request #410 from fsolla/C87-atualizacao-unificada-texto-polaridade-urgente
feat(campaign): C87 — atualização unificada (texto + polaridade + urgente)
2026-08-07 07:20:28 -03:00
Francisco Solla
212a1f2423 feat(campaign): C87 — atualização unificada (texto + polaridade + urgente)
Substitui o modelo de MunicipalityUpdate (kind/semanal/urgente/nota/sinal + signalType)
por um modelo unificado: body obrigatório + polarity (boa/neutra/ruim) + urgent + adversarySignal.

- Schema: polarity enum obrigatório, urgent boolean default false, adversarySignal boolean
- Wizard: novo WizardUpdateBodyStep com campo de texto + polaridade + urgente
- Lista: controle unificado de atualização com polaridade inline
- Feed: exibe polaridade como badge colorido + indicador de urgência
- V2 status strip: atualização rápida de polaridade
- E11: queries atualizadas para polarity + adversarySignal
- Migração: 20260807_030000_unify_municipality_update (backfill polarity=neutra, urgent de kind, adversarySignal de kind+signalType)
- Testes: 18/18 integração C87, 593/593 total, 1399/1399 unitários
- Fix: testes de state deputy usavam nomes fixos que colidiam entre execuções
2026-08-07 05:04:41 -03:00
Francisco Solla
59983b33f7 feat(campanha): C15 — FullCalendar em /campanha/agenda
Issue #390 — entrada operacional staff com FullCalendar v7 route-local
(semana/mês/lista), filtros compartilháveis por município/deputado/tag,
criação pelo slot, detalhe por URL e remarcação drag/resize sob RBAC,
transação e lock por atividade.

- /campanha/atividades e giros permanecem como lista/fluxos legados
- Sem migration/collection nova; reutiliza activity de C14
- Fuso Bahia, range exclusivo, erro/revert, loading/empty testados
- Leader negado, advisor limitado pelo access atual
- E2E cobre filtros, drag, mobile 390x844 e slot prefill
- Int specs cobrem RBAC, concorrência e defense-in-depth

Impl: docs/plans/fullcalendar-agenda-campanha-impl.md
2026-08-07 04:37:36 -03:00
Francisco Ignácio Fontoura Solla
48623b0d06 fix(campanha): preserve StateDeputy migration identity 2026-08-06 18:38:47 -03:00
Francisco Ignácio Fontoura Solla
033c270a89 feat(campanha): B163 — editar contatos das dobradinhas 2026-08-06 16:52:55 -03:00
Francisco Ignácio Fontoura Solla
adc29c0379 feat(campaign): C14 remodel activity for agenda paradigm (#389)
- Replace kind enum with free-form tags (text[] hasMany)
- Remove origin and deadline fields
- Status: remove rascunho/planejado, keep confirmado/realizado/cancelado
- startAt required for user-facing creates (optional for tour drafts)
- Add deputyPresent time gate (only coordinator/candidate can reschedule)
- UI: calendar-like form with tag input, no origin/deadline, no draft status
- E13 giros: tourStopRoleActivityKind → tourStopRoleActivityTags
- Migration: kind→tags with label mapping, status remap, enum recreation
- Activity texts table creation (was missing from migration history)

Closes #389
2026-08-06 05:20:05 -03:00
Francisco Solla
6b6712629a docs: mark B164/C89 plans ready after promote
Related #400 #401
2026-08-06 01:05:28 -03:00
Francisco Solla
49a236bfef
Merge pull request #402 from fsolla/plans/b164-c89-nav-atualizacoes
docs: plans B164 bottom nav + C89 updates feed
2026-08-06 04:04:24 +00:00
Francisco Solla
d301832b95 docs: intention plans for B164 mobile bottom nav and C89 updates feed
Related #400 #401
2026-08-06 01:02:13 -03:00
Francisco Solla
1703117c2c docs: mark C87/C88 plans ready after promote 2026-08-06 00:19:17 -03:00
Francisco Solla
912caf6914 docs: prettier-format C87/C88 intention plans 2026-08-06 00:16:40 -03:00
Francisco Solla
d1a59f82fd docs: intention plans for C87/C88 municipality update remodel
Unify updates (polarity + urgent) and follow with deliberation (assignee, thread, resolved). Related #396 #397.
2026-08-06 00:13:21 -03:00
Francisco Solla
7f03fbec91 docs: mark B163 plan ready after promote 2026-08-06 00:05:32 -03:00
Francisco Solla
343ccdcf93
Merge pull request #394 from fsolla/plans/c14-c16-agenda
docs: plans C14–C16 agenda (FullCalendar + sync)
2026-08-06 03:05:15 +00:00
Francisco Solla
5c6a24be18 docs: format C14–C16 intention plans 2026-08-06 00:03:30 -03:00
Francisco Solla
6cebcd12f3 docs: intention plans for C14–C16 agenda calendar track
Register the remodel → FullCalendar → filter import-link sync slice so the queue can claim after promote.
2026-08-06 00:02:52 -03:00
Francisco Solla
35ccb5e8d8 docs: plan B163 — edit dobradinha fields on list
Intention plan for inline edit of name/party/email/phone on
/campanha/dobradinhas (Contact on create, URL by id). Related #391.
2026-08-06 00:02:51 -03:00
Cursor Agent
5f97b6a21c
feat(ai): add buildCampaignLinks tool for Sollinha navigation (B162)
Introduce a closed-catalog URL builder that delegates to existing list/detail
href helpers, with role-based guards for leader lockdown and unrestricted-only
assessor routes. Register the tool in the AI chat and teach the system prompt
when to offer markdown links after resolving entity ids/slugs.

Closes #383
2026-08-06 00:22:11 +00:00
Francisco Solla
04ca98ac21 docs: mark B162 plan ready after promote 2026-08-05 19:03:53 -03:00
Francisco Solla
2ab45ea1ba docs: format B162 Sollinha URL tool plan 2026-08-05 19:00:43 -03:00
Francisco Solla
c77eda21ae docs: plan B162 — Sollinha URL navigation tool
Intention plan for a catalogued campaign-URL tool so Sollinha can link staff to detail/list views. Related #383.
2026-08-05 19:00:20 -03:00
Francisco Ignácio Fontoura Solla
387a36631a docs: add plan for B161 — infinite scroll lists (5 tables) 2026-08-05 17:50:28 -03:00
Francisco Solla
150bea2621 feat: make municipality columns follow content width 2026-08-05 11:35:20 -03:00
Francisco Solla
423c61d40b feat: distinguish municipality column defaults from explicit visibility 2026-08-05 10:49:58 -03:00