mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 06:43:06 +00:00
A ferramenta de abaixo-assinado já existia, mas a petição do PL não tinha caminho reproduzível fora do dump legado: produção só carregava as três petições antigas editadas no admin. O conteúdo agora é versionado em scripts/lib/petitionPl5594Content.mjs e provisionado por pnpm seed:petition-pl-5594 — dry-run por padrão, create-if-missing por id, Consent whatsapp-inscricao resolvido por chave (fail-closed) e guards de escrita (PETITION_SEED_CONFIRM + TEQO_ENV casando o banco exato), sem sobrescrever edição do admin. O corpo traz os fatos do inteiro teor (autorização no registro, 5 exercícios de IR, sigilos bancário/fiscal/telefônico/de conexão, exclusão do conteúdo das comunicações, auditoria, LGPD e divulgação pela Justiça Eleitoral), a motivação de 18-19/10 sem acusar crime e o pedido sem prometer aprovação. A copy hardcoded do bloco do formulário deixa de falar em 'campanha'/'luta dos trabalhadores' e vira genérica. Prova: unit full 475 arquivos/5238 testes verdes, lint/typecheck/format limpos, seed aplicado e reaplicado em DB temporário (criação + no-op) e smoke real no navegador (página 200, consent, assinatura nº 1). Sem migration, collection, Consent novo ou mudança no fluxo de assinatura.
235 lines
14 KiB
JSON
235 lines
14 KiB
JSON
{
|
|
"name": "teqo",
|
|
"version": "1.0.0",
|
|
"description": "White-label civic engagement platform for Brazilian politicians, launched with deputado Jorge Solla.",
|
|
"keywords": [
|
|
"politics",
|
|
"brazil",
|
|
"civic-engagement",
|
|
"white-label",
|
|
"payload-cms"
|
|
],
|
|
"homepage": "https://github.com/fsolla/teqo",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/fsolla/teqo.git"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/fsolla/teqo/issues"
|
|
},
|
|
"author": "Francisco Solla",
|
|
"license": "UNLICENSED",
|
|
"type": "module",
|
|
"scripts": {
|
|
"prebuild": "node scripts/copy-card-vision-assets.mjs && node scripts/copy-face-vision-assets.mjs",
|
|
"build": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server\" payload migrate && cross-env NODE_OPTIONS=\"--no-deprecation --max-old-space-size=8000\" next build",
|
|
"db:start": "node scripts/db-start.mjs",
|
|
"db:stop": "docker compose -p teqo down",
|
|
"db:doctor": "node scripts/db-doctor.mjs",
|
|
"db:pull": "node scripts/db-pull.mjs",
|
|
"db:reset": "node scripts/db-reset.mjs",
|
|
"db:seed:posts": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/seed-posts.mjs",
|
|
"db:seed:tse": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/seed-tse-results.mjs",
|
|
"db:seed:consent": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/seed-consent.mjs",
|
|
"seed:petition-pl-5594": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/seed-petition-pl-5594.mjs",
|
|
"db:seed:projecao": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/import-projecao.mjs",
|
|
"media:recover": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/recover-media.mjs",
|
|
"reels:ingest": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/reels-ingest.mjs",
|
|
"flickr:import": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/ingest-flickr-archive.mjs",
|
|
"content:instagram:import": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/import-instagram-content.mjs",
|
|
"content:instagram:withdraw": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/withdraw-instagram-content.mjs",
|
|
"content:instagram:prune": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/prune-instagram-content.mjs",
|
|
"archive:catalog": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/catalog-archive-photos.mjs",
|
|
"faces:index": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/index-archive-faces.mjs",
|
|
"faces:enroll-figure": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/enroll-face-figure.mjs",
|
|
"archive:publish": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/publish-archive-photos.mjs",
|
|
"ops:global": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/ops-global.mjs",
|
|
"archive:integrity": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/check-archive-integrity.mjs",
|
|
"archive:thumbnails": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/backfill-archive-thumbnails.mjs",
|
|
"seed:face-consents": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/seed-face-consents.mjs",
|
|
"seed:face-figures": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/seed-face-figures.mjs",
|
|
"db:seed:minimal": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/seed-minimal.mjs",
|
|
"campaign:staging:test-account": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/bootstrap-staging-test-account.mjs",
|
|
"db:check:push-chain": "node scripts/check-push-chain.mjs",
|
|
"ops79:reconcile": "node scripts/reconcile-campaign-vertical.mjs",
|
|
"ops79:migrate": "node scripts/migrate-signature-orphan.mjs",
|
|
"ops84:reconcile-values": "node scripts/reconcile-campaign-vertical.mjs --values",
|
|
"agent:claim": "node scripts/agent-claim.mjs",
|
|
"agent:register": "node scripts/agent-register.mjs",
|
|
"agent:ready": "node scripts/agent-ready.mjs",
|
|
"agent:prioritize": "node scripts/agent-prioritize.mjs",
|
|
"agent:file-miss": "node scripts/agent-file-miss.mjs",
|
|
"agent:pool": "node scripts/agent-pool.mjs",
|
|
"configure:branch-protection": "node scripts/configure-branch-protection.mjs",
|
|
"build:demographics": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/build-bahia-demographics.mjs",
|
|
"build:election-aggregates": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/build-election-aggregates.mjs",
|
|
"build:geometries": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/build-bahia-geometries.mjs",
|
|
"build:potencial-secoes": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/build-potencial-secoes-2026.mjs",
|
|
"build:second-round": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/build-second-round-ba.mjs",
|
|
"build:state-deputy-card-assets": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/build-state-deputy-card-assets.mjs",
|
|
"build:municipality-zone-geometries": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/build-municipality-zone-geometries.mjs",
|
|
"build:tse-city-codes": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/build-bahia-tse-city-codes.mjs",
|
|
"reels:build": "node scripts/build-reel.mjs",
|
|
"reels:colinha": "node scripts/build-colinha-reel.mjs",
|
|
"reels:dobradinhas": "node scripts/build-dobradinha-reels.mjs",
|
|
"reels:tts:setup": "node scripts/reels-tts-setup.mjs",
|
|
"dev": "node scripts/dev.mjs",
|
|
"devsafe": "rm -rf .next && node scripts/dev.mjs",
|
|
"predev": "node scripts/predev-importmap.mjs",
|
|
"format": "prettier --write .",
|
|
"format:check": "prettier --check .",
|
|
"gate:fast": "pnpm lint && pnpm typecheck && pnpm test:unit",
|
|
"gate:ci": "node scripts/gate-ci.mjs",
|
|
"gate:push": "pnpm gate:ci",
|
|
"push": "node scripts/git-push.mjs",
|
|
"check:cycles": "madge --circular --extensions ts,tsx --ts-config tsconfig.json src",
|
|
"changelog:build": "node scripts/build-changelog.mjs",
|
|
"changelog:read": "node scripts/build-changelog.mjs --stdout",
|
|
"changelog:check": "node scripts/build-changelog.mjs --check",
|
|
"generate:importmap": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server\" payload generate:importmap",
|
|
"generate:types": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server\" payload generate:types",
|
|
"migrate": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server\" payload migrate",
|
|
"migrate:create": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server\" payload migrate:create",
|
|
"migrate:status": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server\" payload migrate:status",
|
|
"knip": "knip",
|
|
"knip:production": "knip --production",
|
|
"lint": "cross-env NODE_OPTIONS=--no-deprecation eslint --cache --cache-location .next/cache/eslint/ --max-warnings=0",
|
|
"lint:fix": "cross-env NODE_OPTIONS=--no-deprecation eslint --fix",
|
|
"payload": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server\" payload",
|
|
"start": "cross-env NODE_OPTIONS=--no-deprecation next start",
|
|
"test": "pnpm run test:unit && pnpm run test:int",
|
|
"test:all": "pnpm run test && pnpm run test:e2e",
|
|
"test:e2e": "cross-env NODE_OPTIONS=\"--no-deprecation --conditions=react-server --import=tsx/esm\" playwright test --config=playwright.config.ts",
|
|
"test:e2e:affected": "node scripts/run-e2e-affected.mjs",
|
|
"test:int": "cross-env NODE_OPTIONS=--no-deprecation vitest run --config ./vitest.config.mts",
|
|
"test:unit": "cross-env NODE_OPTIONS=--no-deprecation DATABASE_URL=postgresql://invalid:invalid@127.0.0.1:1/unit_tests_must_not_connect vitest run --config ./vitest.unit.config.mts",
|
|
"images:resize": "node scripts/resize-images.mjs",
|
|
"images:fill": "node scripts/fill-image.mjs",
|
|
"camara:pilot": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm\" node scripts/pilot-camara-speeches.mjs",
|
|
"camara:import": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/import-camara-speeches.mjs",
|
|
"falas-web:import": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/import-web-speeches.mjs",
|
|
"acervo:index": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/index-speeches.mjs",
|
|
"recordings:classify": "cross-env NODE_OPTIONS=\"--no-deprecation --import=tsx/esm --import=./scripts/seed-loader.mjs\" node scripts/backfill-recording-facets.mjs",
|
|
"typecheck": "tsc --noEmit",
|
|
"typecheck:tsc6": "tsc6 --noEmit",
|
|
"prepare": "husky",
|
|
"agent:status": "node scripts/agent-status.mjs",
|
|
"agent:session": "node scripts/agent-session.mjs",
|
|
"worktree": "node scripts/worktree.mjs",
|
|
"unblock:check": "node scripts/auto-unblock.mjs --check",
|
|
"issue": "node scripts/issue.mjs",
|
|
"issues:tui": "node scripts/issues-tui.mjs"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/deepseek": "3.0.19",
|
|
"@ai-sdk/react": "^4.0.50",
|
|
"@aws-sdk/client-s3": "3.1112.0",
|
|
"@aws-sdk/lib-storage": "3.1112.0",
|
|
"@base-ui/react": "^1.6.0",
|
|
"@fullcalendar/react": "7.0.2",
|
|
"@hookform/resolvers": "^5.2.2",
|
|
"@imgly/background-removal-node": "^1.4.5",
|
|
"@mediapipe/tasks-vision": "^1.0.1",
|
|
"@payloadcms/db-postgres": "3.82.0",
|
|
"@payloadcms/email-resend": "3.82.0",
|
|
"@payloadcms/live-preview-react": "3.82.0",
|
|
"@payloadcms/next": "3.82.0",
|
|
"@payloadcms/plugin-import-export": "3.82.0",
|
|
"@payloadcms/richtext-lexical": "3.82.0",
|
|
"@payloadcms/storage-s3": "3.82.0",
|
|
"@payloadcms/ui": "3.82.0",
|
|
"@simplewebauthn/browser": "^13.3.0",
|
|
"@simplewebauthn/server": "^13.3.2",
|
|
"@tensorflow/tfjs": "4.22.0",
|
|
"@tensorflow/tfjs-backend-wasm": "4.22.0",
|
|
"@vercel/analytics": "^1.6.1",
|
|
"@vercel/speed-insights": "^1.3.1",
|
|
"@vladmandic/face-api": "1.7.15",
|
|
"ai": "^7.0.47",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.1.1",
|
|
"cross-env": "^7.0.3",
|
|
"dotenv": "16.4.7",
|
|
"graphql": "^16.8.1",
|
|
"jose": "^6.2.8",
|
|
"leaflet": "^1.9.4",
|
|
"lucide-react": "^0.570.0",
|
|
"next": "15.4.11",
|
|
"next-themes": "^0.4.6",
|
|
"payload": "3.82.0",
|
|
"radix-ui": "^1.4.3",
|
|
"react": "^19.2.4",
|
|
"react-day-picker": "^9.14.0",
|
|
"react-dom": "^19.2.4",
|
|
"react-hook-form": "^7.71.1",
|
|
"react-markdown": "^10.1.0",
|
|
"react-resizable-panels": "^4.12.2",
|
|
"remark-gfm": "^4.0.1",
|
|
"server-only": "^0.0.1",
|
|
"shadcn": "^4.0.3",
|
|
"sharp": "0.34.2",
|
|
"sonner": "^2.0.7",
|
|
"tailwind-merge": "^3.4.1",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"temporal-polyfill": "^1.0.3",
|
|
"topojson-client": "^3.1.0",
|
|
"tw-animate-css": "^1.4.0",
|
|
"web-push": "^3.6.7",
|
|
"zod": "^4.3.6"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/eslintrc": "^3.3.6",
|
|
"@ffmpeg-installer/ffmpeg": "^1.1.0",
|
|
"@playwright/test": "1.58.2",
|
|
"@smithy/node-http-handler": "^4.11.2",
|
|
"@tailwindcss/postcss": "^4.1.18",
|
|
"@testing-library/react": "16.3.0",
|
|
"@types/geojson": "^7946.0.16",
|
|
"@types/leaflet": "^1.9.21",
|
|
"@types/node": "22.19.9",
|
|
"@types/pg": "^8.10.2",
|
|
"@types/react": "^19.2.14",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@types/shpjs": "^3.4.7",
|
|
"@types/topojson-client": "^3.1.5",
|
|
"@types/topojson-server": "^3.0.4",
|
|
"@types/topojson-simplify": "^3.0.3",
|
|
"@types/topojson-specification": "^1.0.5",
|
|
"@types/web-push": "^3.6.4",
|
|
"@types/yauzl": "^3.4.0",
|
|
"@vitejs/plugin-react": "4.5.2",
|
|
"@vitest/coverage-v8": "4.0.18",
|
|
"csv-parse": "^7.0.1",
|
|
"eslint": "^9.39.2",
|
|
"eslint-config-next": "15.4.11",
|
|
"eslint-config-prettier": "^10.1.8",
|
|
"eslint-plugin-check-file": "^3.3.1",
|
|
"husky": "^9.1.7",
|
|
"jsdom": "28.0.0",
|
|
"knip": "^6.27.0",
|
|
"madge": "^8.0.0",
|
|
"pg": "^8.22.0",
|
|
"postcss": "^8.5.6",
|
|
"prettier": "^3.4.2",
|
|
"prettier-plugin-organize-imports": "^4.3.0",
|
|
"schema-dts": "^2.0.0",
|
|
"shpjs": "^6.2.0",
|
|
"tailwindcss": "^4.1.18",
|
|
"topojson-server": "^3.0.1",
|
|
"topojson-simplify": "^3.0.3",
|
|
"tsx": "4.21.0",
|
|
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
"typescript-7": "npm:typescript@7.0.2",
|
|
"vite-tsconfig-paths": "6.0.5",
|
|
"vitest": "4.0.18",
|
|
"xlsx": "^0.18.5",
|
|
"yauzl": "^3.4.0"
|
|
},
|
|
"engines": {
|
|
"node": "24.x",
|
|
"pnpm": "^9 || ^10"
|
|
},
|
|
"packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977",
|
|
"private": true
|
|
}
|