Price tracker pessoal por intencao de compra, com busca em lojas suportadas, ranking de ofertas, persistencia em JSON no proprio repositorio, dashboard estatico em GitHub Pages e gestao de catalogo via GitHub Issue.
- Monitora intencoes de compra cadastradas em
data/products.json. - Pesquisa essas intencoes nas lojas suportadas e descobre as URLs das ofertas durante a execucao.
- Usa Lightpanda via CDP como engine principal e Chromium/Playwright local como fallback tecnico.
- Ranqueia ofertas por restricoes obrigatorias, prioridades e preco total ou preco unitario.
- Persiste snapshots e erros em
data/e espelha os JSONs paradocs/data/. - Publica um dashboard estatico sem backend em
docs/. - Permite adicionar, editar e remover intencoes via GitHub Issue.
| Loja | Nivel | Validacao atual |
|---|---|---|
| Amazon | Dedicated validated | Adapter de busca + smoke real |
| KaBuM | Dedicated validated | Adapter de busca + smoke real |
| Mercado Livre | Dedicated validated | Adapter de busca + smoke real |
| Magalu | Dedicated validated | Adapter de busca + smoke real |
| Shopee | Dedicated validated | Adapter de busca + smoke real |
| Pichau | Dedicated validated | Adapter de busca + smoke real |
| Petz | Dedicated validated | Adapter de busca + smoke real |
Dedicated validated significa que a loja possui adapter de busca em src/search/store_adapters.js, fixture deterministica e smoke real habilitado.
Detalhes operacionais e criterio de aceite por loja:
docs/matriz-suporte.md
As intencoes ativas ficam em data/products.json e sao espelhadas em docs/data/products.json.
Campos suportados por intencao:
idnamecharacteristicscategorystoresrequired_termspreferred_termsexcluded_termsrequired_attributespreferred_attributesunit_ruleis_activenotes
Campos legados de cadastro por anuncio direto, como url, selectors, units_per_package e mode: "url", sao rejeitados pelo schema e pela ingestao.
Fluxo atual:
- monta a query com
name + characteristics; - cria a URL de busca por loja;
- conecta no Lightpanda via
LIGHTPANDA_CDP_URL; - extrai ofertas da pagina de busca;
- usa Chromium/Playwright local como fallback quando Lightpanda falha;
- normaliza atributos encontrados no titulo;
- rejeita ofertas sem titulo, preco ou URL descoberta;
- aplica
required_terms,required_attributeseexcluded_terms; - ordena por prioridade e depois por
unit_priceou preco total.
Exemplos de modelagem:
- RAM DDR4:
required_attributes.memory_type = "ddr4", capacidade empreferred_attributes.capacity_total_gb, velocidade sem regra obrigatoria. - Fralda tamanho G:
required_attributes.size = "G"eunit_rule.basis = "unit"para comparar preco por unidade do pacote.
Cada execucao gera:
data/latest.jsondata/runs/<run_id>.jsondata/errors/<run_id>.jsondata/runs/index.jsondocs/data/*como espelho para o dashboard
O manifesto data/runs/index.json mantem:
filespara compatibilidade com formato legadorunscom metadados detalhadosdailypara drilldown diario no dashboard
latest.items guarda a melhor oferta por intencao. latest.offers guarda as top ofertas por loja. URLs aparecem apenas nessas ofertas descobertas.
Comandos principais:
npm run lint
npm run validate:catalog
npm run test:unit
npm run test:fixtures
npm run test:integration
npm run test:coverage:critical
npm run test:ci
npm run smoke:real
npm testSignificado:
npm run lint: validasrc/,test/,.github/scripts/escripts/npm run validate:catalog: validadata/products.jsoncom o schema do catalogonpm run test:unit: parser, heuristicas, falhas, schema, ingest, adapters de busca, ranking e smokenpm run test:fixtures: extracao legada e regressao por loja com fixtures deterministicasnpm run test:integration: pipeline de busca, persistencia, manifesto e continuidade de dadosnpm run test:coverage:critical: piso minimo de cobertura por area criticanpm run test:ci: suite oficial de pre-commit e CInpm run smoke:real: smoke real para lojas suportadas, com artifactos em.cache/smoke-real/npm test: suite completa vianode --test
Documentacao complementar:
- Arquitetura detalhada:
docs/arquitetura.md - Estrategia de testes:
docs/testes-software.md - Matriz de suporte:
docs/matriz-suporte.md
Workflow: .github/workflows/ci.yml
Executa em push e pull_request:
npm cinpm run test:ci
Esse workflow ignora mudancas apenas em data/** e docs/data/**, evitando revalidacao desnecessaria quando o scrape agendado comita snapshots.
Workflow: .github/workflows/smoke_real.yml
Executa em workflow_dispatch e schedule:
npm ci- instalacao do Chromium do Playwright
- inicializacao do Lightpanda via Docker
npm run smoke:real
O smoke real nao bloqueia PR. Ele gera .cache/smoke-real/summary.json e publica artifacts para analise quando ha drift real de DOM, captcha ou bloqueio.
Workflow: .github/workflows/scrape.yml
Executa:
npm cinpm run test:ci- instalacao do Chromium do Playwright
- inicializacao do Lightpanda via Docker
npm run scrape- commit de
data/edocs/data/ - upload de artifacts de debug quando ha falha
Para endurecer merge em producao, configure branch protection no GitHub para exigir sucesso do job ci.
Workflow: .github/workflows/ingest_issue.yml (Ingest Product Issues)
Processa Issues para add, edit, remove e batch, valida o payload e atualiza o catalogo espelhado.
Executa automaticamente em opened, edited, labeled e reopened, e tambem aceita workflow_dispatch para replay manual do backlog.
Replay manual:
- abra
Actions > Ingest Product Issues > Run workflow - opcionalmente informe
issue_numberscomo lista separada por virgula - se
issue_numbersficar vazio, o workflow processa todas as Issues abertas com labeladd-productoumanage-product, ou titulo iniciado por[ADD PRODUCT]/[MANAGE PRODUCT]
- Node.js 22+
- npm 10+
Copy-Item .env.example .env
npm.cmd ci
npx.cmd playwright install chromium
npm.cmd run test:ci
npm.cmd run smoke:real
npm.cmd run scrape
npx.cmd http-server -p 5500 .cp .env.example .env
npm ci
npx playwright install chromium
npm run test:ci
npm run smoke:real
npm run scrape
npx http-server -p 5500 .Endpoints locais:
- Dashboard:
http://localhost:5500/docs/ - Gestao:
http://localhost:5500/docs/manage.html
Copie .env.example para .env e preencha apenas as credenciais que voce realmente usa.
DEBUGHTTP_TIMEOUT_MSCONCURRENCYUSER_AGENTPROXY_URLLIGHTPANDA_CDP_URLSEARCH_TOP_N_PER_STORE
LIGHTPANDA_CDP_URL usa ws://127.0.0.1:9222 por padrao. O Chromium local e apenas fallback tecnico quando a conexao CDP ou a navegacao pelo Lightpanda falhar.
.
|-- .github/
| |-- scripts/
| `-- workflows/
|-- data/
| |-- errors/
| |-- runs/
| |-- latest.json
| `-- products.json
|-- docs/
| |-- data/
| |-- app.js
| |-- index.html
| `-- manage.html
|-- scripts/
|-- src/
| |-- config/
| |-- engines/
| |-- extract/
| |-- io/
| |-- schema/
| |-- search/
| `-- utils/
`-- test/