Commit graph

1816 commits

Author SHA1 Message Date
Francisco Solla
8cc9e078ae plan(OPS65): CI do main em janela de 30 min + matar o agent-pool 2026-08-18 19:10:18 +00:00
Francisco Solla
fe5b11cf24 feat(S2): seção de conteúdos da home de campanha inclui os vídeos do YouTube
Board "Acompanhe de perto" (S1) ganha o feed automático do canal oficial:
global SocialFeedSettings (admin-only, kill switch + toggle + maxItems +
exclusões por item), loader src/utilities/youtubeFeed.ts (Data API v3
search→statistics, unstable_cache tag social-feed + revalidate 300,
fail-closed com snapshot persistido via SQL direto — revalidateTag dentro
de unstable_cache lança no Next 15.4), card generalizado
(CampaignArticleCard → CampaignContentCard, external com noopener) e merge
por recência com o grande = mais recente elegível. Stub HTTP do YouTube no
webServer do Playwright (porta dev+1000) + 4 e2e novos no describe serial.
Migration 20260818_111748_add_social_feed_settings (não destrutiva).
Closes #18
2026-08-18 15:23:50 -03:00
Francisco Solla
50749270d6 style: prettier nos planos OPS62/OPS63 2026-08-18 18:17:08 +00:00
Francisco Solla
d5f48ea9db plan(OPS62): CI fail-fast no Forgejo — upgrade do servidor + watchdog cancela o run em qualquer job vermelho
plan(OPS63): doc-guard no pre-push — changelog append-only, agregado e marcadores de conflito no gate local
2026-08-18 18:17:08 +00:00
Francisco Solla
7bd9c9504f ops(OPS59): pre-push sem e2e — e2e roda uma vez, no CI (gate local fica com os outros testes) 2026-08-18 17:56:41 +00:00
Francisco Solla
5b50e1da71 ci: retry — e2e(1) falhou no boot do serviço postgres (porta 5435 ocupada por container vazado de CI anterior; removido) 2026-08-18 14:04:50 -03:00
Francisco Solla
a60b3880ca feat(S5): banda visual própria para a seção 'Acompanhe de perto' na home 2026-08-18 13:35:53 -03:00
Francisco Solla
228d5da9c8 ops(OPS52-media-guard): reconcile do media:recover exige MEDIA_RECOVER_CONFIRM=1 (guard de intenção explícita) 2026-08-18 12:45:32 -03:00
Francisco Solla
1dfad8ac99 docs(OPS61): evidência da raça do waitForChecks (merge com CI vermelho na PR #52) absorvida no plano 2026-08-18 15:38:44 +00:00
Francisco Solla
7b8e37e162 fix(ops OPS57): simplify — veto de draft vale em conversão mid-run; CLI valida base main; docs sem mecanismo fantasma 2026-08-18 15:24:21 +00:00
Francisco Solla
393b8c9991 ops(OPS58): seed de posts com dry-run e taxonomy atualizada — sync de prod com runbook
- scripts/seed-posts.mjs: modo --dry-run (plan-only, echo do alvo, zero
  escrita) e 4 slugs novos no CLASSIFICATION (3 com tag eleitoral — lock de
  visibilidade eleitoral do repo)
- docs: impl plan com runbook do homeserver, changelog, nota AGENTS.md
2026-08-18 12:15:05 -03:00
Francisco Solla
87a81c29fd chore(ops OPS57): alargar o gatilho do forgejo-pr-automerge para todas as PRs same-repo (draft não-cursor/* = veto) 2026-08-18 11:50:48 -03:00
Francisco Solla
094dbe6b5d plan(OPS59): pre-push sem e2e — e2e roda uma vez no CI 2026-08-18 11:45:03 -03:00
Francisco Solla
71cf477f6e plan(OPS58): atualizar artigos de produção com novos posts do jorgesolla.com.br 2026-08-18 14:32:00 +00:00
Francisco Solla
b78a390371 fix(ops OPS56): forgejo-pr-automerge — veredito de merge por re-read do PR (falso positivo 'já mergeado' com PR aberto) 2026-08-18 14:28:54 +00:00
Francisco Solla
f12bd6474b docs(OPS52-media): runbook atualizado com o fix de infra real (E3 = firewall do host; 38/40 servindo 200) 2026-08-18 10:45:27 -03:00
Francisco Solla
64ea0dbab9 ops(OPS54): allowlist onlyBuiltDependencies migra para pnpm-workspace.yaml — fim do warning do pnpm 10 sobre o campo pnpm ignorado 2026-08-18 09:06:37 -03:00
Francisco Solla
45e29a7785 feat(OPS52-media): recupera os objetos de media de produção do WordPress para o bucket (pnpm media:recover)
- scripts/recover-media.mjs: CLI de reconciliação (reconcile/--dry-run/--verify)
  — lê rows de media + posts.coverImage, resolve a capa com a mesma lógica do
  seed (featured media, senão 1ª imagem inline), PutObject com key = filename;
  DB nunca escrito; fail-closed (S3_* completas, ALLOW_REMOTE_DB, echo do alvo,
  timeouts curtos, covers só do origin WP e image/*)
- scripts/lib/wpArticles.mjs: fetch ao vivo do WordPress extraído do seed
  (sem twin), helpers puros de resolução + row→cover mapping (unit-testados)
- seed-posts.mjs: importa o fetch da lib (comportamento idêntico) e usa
  resolveCoverSource em processContent
- runbook de execução no homeserver (impl plan), nota no AGENTS.md, changelog
Closes #10
2026-08-18 08:20:45 -03:00
Francisco Solla
fbe3da1acf style(plans S6): prettier no rascunho UI 2026-08-18 10:59:57 +00:00
Francisco Solla
c3dde67e91 plan(S6): home de campanha sem carrossel no desktop — grade 3x2 nas bandeiras 2026-08-18 10:59:57 +00:00
Francisco Solla
a4ae631157 plans(S5): separação visual da seção Acompanhe de perto (Related #33) 2026-08-18 10:56:23 +00:00
Francisco Solla
ffab9e97fb plan(OPS52-media): recuperar arquivos de media de produção (capas dos artigos) 2026-08-18 07:26:11 -03:00
Francisco Solla
4285358915 ops(OPS57): worktrees migrados para ~/.worktrees/teqo
- .forgejo/worktree.env: WORKTREES_ROOT=~/.worktrees/teqo (C113/plans/work
  órfãos movidos com git worktree move; pasta antiga removida)
- O roteador global expande o ~ na exportação das chaves do env file
2026-08-18 09:33:42 +00:00
Francisco Solla
beea467816 fix(S1): revert revalidate=300 — trava o bust por tag no Next 15.4 prod
Medido em probe: com export const revalidate, revalidateTag('posts') para
de regenerar a home (a rota /artigos, sem o export, convergia; a home
ficava stale para sempre). Remove o export e resolve o congelamento da
label relativa por threshold: relativa < 48h, data absoluta além (nunca
mente congelada). Spec: polling positivo do HTML da home pós-revalidate
(ISR serve stale uma vez sob carga) e about:blank antes do cleanup
(prefetch prod de links apagados = 404 no guard).
2026-08-18 05:07:26 +00:00
Francisco Solla
8e18e27c20 fix(e2e S1): poll positivo do HTML da home até convergir pós-revalidate
O warm-up único ainda deixava uma janela de stale-serve sob carga (a
regeneração ISR não completava entre o GET e o goto, e o DOM carregado
nunca refrescava — flake no cleanup sob a suíte paralela). Polling do
estado esperado no HTML do servidor (12x1s) antes do goto torna o
empty-state, o full-state e o cleanup determinísticos.
2026-08-18 05:07:26 +00:00
Francisco Solla
5c48329011 fix(e2e S1): warm-up na home após revalidateTag (ISR pode servir stale uma vez)
Sob a suíte completa em paralelo, a regeneração pós-revalidate às vezes
servia a página velha uma vez; o DOM carregado nunca refrescava e o assert
de cleanup falhava (1 flaky no gate). Requisição GET de warm-up entre o
revalidate e o goto torna o estado determinístico.
2026-08-18 05:07:26 +00:00
Francisco Solla
41dbb564c6 feat(S1): seção de conteúdos na home de campanha (artigos)
Bento 1+4 no desktop e carrossel 1/tela no mobile (~390px) lendo o post
collection com isPostVisible fail-closed; seção some inteira sem posts
visíveis. Zero migration/Consent; home vira ISR com tag posts +
revalidate=300 (label relativa não congela).
2026-08-18 05:07:26 +00:00
54058da059 OPS52 — Migrar a media de produção do Vercel Blob para o Garage S3
Merge pull request #27 from fsolla/OPS52-migrar-a-media-de-producao-do-vercel-blob-para-o-garag

OPS52 — Migrar a media de produção do Vercel Blob para o Garage S3 (Closes #3)
2026-08-18 02:45:52 +00:00
Francisco Solla
a34cd9b68a fix(ops OPS53): deploy — compose run consome o stdin do bash -s (migrate com </dev/null); build via --network host + proxy socat (BuildKit recusa rede bridge custom) 2026-08-18 01:59:17 +00:00
Francisco Solla
7a8f4d9830 ops(OPS55): prettier em scripts/worktree.mjs (formato pós-commit) 2026-08-18 01:53:27 +00:00
Francisco Solla
ff14cef653 ops(OPS55): worktree respeita WORKTREES_ROOT do .forgejo/worktree.env
- worktree.mjs: WORKTREES_ROOT = env ?? fallback (~/.cursor/worktrees/teqo)
- .forgejo/worktree.env novo: FORGEJO_REPOSITORY=fsolla/teqo + root atual
  (migração para ~/.worktrees/teqo fica para quando as sessões opencode
  ativas nos worktrees antigos fecharem — OPS52/OPS53/PUB5)

Roteador global (~/.config/shell/worktree.sh) exporta as chaves do arquivo
por projeto; iara-pwa já usa o mesmo mecanismo.
2026-08-18 01:53:27 +00:00
Francisco Solla
89e89c5118 fix(OPS52): S3_WORKTREE_REQUIRED_KEYS sem export (knip) 2026-08-17 22:36:34 -03:00
Francisco Solla
dabc00f46c ops(OPS52): migra a media de produção do Vercel Blob para o Garage S3
- payload.config.ts: vercelBlobStorage -> s3Storage (@payloadcms/storage-s3)
  com endpoint Garage (forcePathStyle, region garage); bucket privado — o
  staticHandler do plugin streama os objetos em /api/media/file/<filename>,
  mantendo o contrato de URL relativa das 40 rows pré-existentes
- src/utilities/mediaStorage.ts: resolveS3StorageEnv fail-closed (S3_* parcial
  -> throw no boot com a lista exata; nenhuma -> storage local dev/test)
- seed-posts: remove pre-delete do @vercel/blob (S3 sobrescreve nativamente)
- worktree-env.mjs: s3EnvCopiedLines all-or-nothing (unit-testada)
- envs S3_BUCKET/S3_ENDPOINT/S3_REGION/S3_ACCESS_KEY_ID/S3_SECRET_ACCESS_KEY
  no .env.example/.env.test; cloud-setup.sh sem o sed morto do blob
- deps: -storage-vercel-blob -@vercel/blob +storage-s3; importMap regenerado
- docs: impl plan (revisão A->B: Garage v2 sem acesso anônimo na API S3),
  AGENTS.md, changelog 2026-08-18-ops52
2026-08-17 22:36:34 -03:00
Francisco Solla
0aec0d5040 feat(PUB5): slogan 'Mais saúde mais futuro' no hero e rodapé 2026-08-18 01:31:28 +00:00
Francisco Solla
8854fcb85b style(plans S1-S4): prettier nos planos e no rascunho UI (format pós-commit do lote) 2026-08-17 22:02:14 -03:00
Francisco Solla
02c922eac8 docs(ops OPS53): falha conhecida do runner — PATH dos containers quebra com runner.envs.PATH só de host 2026-08-18 00:50:41 +00:00
Francisco Solla
6a3f61f968 ops(OPS53): etapa de deploy no CI para o homeserver (teqo-1313)
Job deploy em ci.yml (runs-on host na workstation) streama
scripts/deploy-homeserver.sh para o homeserver via SSH: build dos stages
runner+migrator com secrets do teqo-1313.env, push no registry local,
migrate pelo serviço de maintenance antes do rollout, up + smoke. Zero
secrets novos no Forgejo; HEAD guard + flock; rollback automático com
backup do compose; runbook docs/ops/teqo-1313-deploy.md; invariantes
unit do script (bash -n + estrutura).
2026-08-18 00:50:41 +00:00
Francisco Solla
87410ccc63 plan(S1-S4): seção de conteúdos na home de campanha — artigos, YouTube, Instagram + compartilhar WhatsApp 2026-08-18 00:47:52 +00:00
Francisco Solla
346da3896e style(plan): prettier no rascunho UI do PUB5 2026-08-17 21:34:27 -03:00
Francisco Solla
220142cc75 plan(PUB5): slogan da campanha 'Mais saúde mais futuro' no hero e rodapé 2026-08-17 21:33:12 -03:00
Francisco Solla
dfd57344e3 plan(OPS54): silencia o warning do pnpm sobre pnpm.onlyBuiltDependencies ignorado 2026-08-17 21:03:43 -03:00
Francisco Solla
e03ba1f83b ops(OPS51): migra o banco de produção do Neon para o Postgres do homeserver (teqo_1313)
Dump pg_dump -Fc do Neon no homeserver (/srv/hdd/backups/teqo-neon-pre-migracao/),
restore como a role teqo_1313 (o container já lia o banco preparado — sem mudança
de config). Neon intacto como rollback. Divergência da intenção (A/B validada como
B): destino = teqo_1313, não teqo_prod. Débito de media registrado (#10 → OPS52).
2026-08-17 22:41:18 +00:00
Francisco Solla
3cd0b4e0f5 style(worktree): prettier na ordem dos imports de node:fs 2026-08-17 19:32:40 -03:00
Francisco Solla
de8962457d fix(worktree): copia .opencode/secrets para o worktree provisionado
O opencode.json referencia .opencode/secrets/penpot-token via {file:...},
mas o arquivo é gitignored e git worktree não leva ignored files — o
launch do opencode no worktree morria com 'bad file reference'.
provision agora copia .opencode/secrets/* do worktree principal
(sem sobrescrever cópia manual).
2026-08-17 19:32:10 -03:00
Francisco Solla
5afb54b692 chore(OPS53): prettier no plano 2026-08-17 16:06:05 -03:00
Francisco Solla
8cc4900cf0 plan(OPS53): etapa de deploy no CI para o homeserver (container teqo-1313) 2026-08-17 16:01:21 -03:00
Francisco Solla
b5c97ec6ff fix(OPS50): prettier em ci.yml 2026-08-17 13:25:17 -03:00
Francisco Solla
f151376641 ops(OPS50): remove deploy Vercel do pipeline — produção é self-hosted no homeserver (jorgesolla1313.com.br); ci.yml vira verificador puro (sem deploy/requeue), apaga vercel-promote.yml, scripts/tests/vercel.json e secrets VERCEL_* 2026-08-17 13:17:17 -03:00
Francisco Solla
09db71f95e fix(ci OPS50): push workflow (ci.yml) ganha o mesmo fix do PR workflow — .env.test.local com a URL do serviço (vitest/playwright recarregam .env.test por cima) e VITEST_MAX_WORKERS=4 no int 2026-08-17 11:56:15 -03:00
Francisco Solla
ac664093d2 fix(ci OPS50): build e2e em .next-e2e (o webServer do playwright serve esse dir desde 7ca0efc9 — os workflows ainda buildavam em .next/e2e e o 'next start' não achava o bundle) + invariante unit passa a pinar os workflows 2026-08-17 11:33:01 -03:00