Gestão completa de compras de mercearia para famílias em Portugal. Mantém inventário da casa, aprende hábitos de consumo, faz triagem semanal, compara preços entre Continente Online e Pingo Doce Online, aproveita cupões e saldo, executa compras online, e coordena com a família via WhatsApp. Também gera lembretes de compras presenciais para lojas sem entrega online (Lidl, Makro, Auchan, etc.) com base em preferências configuradas. Usa esta skill quando o utilizador mencionar: compras, supermercado, mercearia, lista de compras, Continente, Pingo Doce, Lidl, Makro, Auchan, "está a faltar", "precisamos de", "acabou o", inventário da casa, preços de supermercado, cupões, saldo de cartão, compra a granel, compra do mês, ou qualquer referência a alimentos, produtos de limpeza, ou artigos domésticos. Também se ativa automaticamente via cron para triagem semanal e stock checks.
Skill de gestão de compras de mercearia para famílias em Portugal. Opera em ciclo contínuo: inventário → previsão → triagem → comparação → compra → tracking.
O tamanho do agregado familiar, membros, orçamento e preferências de entrega são lidos de
{baseDir}/data/family_preferences.json. Este ficheiro é local e está no .gitignore — é criado
pelo install step a partir de {baseDir}/data/family_preferences.example.json. Editar antes de
usar a skill.
Diretório da skill: {baseDir}
Todos os ficheiros de dados vivem em {baseDir}/data/:
| Ficheiro |
|---|
| Propósito |
|---|
{baseDir}/data/inventory.json | Lista de compras ativa + estado do inventário |
{baseDir}/data/shopping_history.json | Histórico de todas as compras realizadas |
{baseDir}/data/consumption_model.json | Modelo de consumo aprendido (frequências, quantidades) |
{baseDir}/data/family_preferences.json | Preferências da família (marcas, budget, restrições) — local, gitignored, criado a partir do .example.json |
{baseDir}/data/price_cache.json | Cache de preços recentes por supermercado |
Antes de qualquer ação, lê os ficheiros de dados relevantes.
Quando alguém diz "acabou o X", "precisamos de Y", "adiciona Z":
{baseDir}/data/inventory.jsonshopping_list com metadata (quem adicionou, quando, prioridade)Quando alguém diz "remove X", "já não preciso de Y", "já comprámos Z":
{baseDir}/data/inventory.jsonshopping_list (fuzzy)Quando alguém diz "mostra a lista", "o que falta comprar":
{baseDir}/data/inventory.jsonshopping_list por categorialacticínios → 🥛 proteína → 🥩 frescos → 🥬 padaria → 🍞
limpeza → 🧹 higiene → 🧴 bebidas → 🥤 snacks → 🍪
congelados → 🧊 conservas → 🥫 temperos → 🌿 outros → 📦
Lê {baseDir}/references/consumption_patterns.md para a lógica completa.
Resumo: O modelo em {baseDir}/data/consumption_model.json guarda, por produto:
preferred_store: null = compra online (Continente/Pingo Doce); string = loja presencial (ex: "lidl")Atualização: Após cada compra, executa:
{baseDir}/.venv/bin/python3 {baseDir}/scripts/consumption_tracker.py update --purchase <ficheiro_compra.json>
Alertas proativos: No stock check diário (cron 10h):
{baseDir}/.venv/bin/python3 {baseDir}/scripts/consumption_tracker.py check-stock
Se um produto tem ≤2 dias de stock estimado:
{baseDir}/.venv/bin/python3 {baseDir}/scripts/consumption_tracker.py feedback --product "[nome]" --type still_haveTrigger: Cron domingo 9h WET, ou manualmente ("faz a triagem", "prepara a lista da semana").
{baseDir}/.venv/bin/python3 {baseDir}/scripts/list_optimizer.py triage --next-bulk-date [DATA]{baseDir}/data/family_preferences.json (blocklist, budget){baseDir}/assets/templates/weekly_triage.mdO resultado do triage inclui o campo physical_items — produtos com preferred_store definido
em consumption_model.json. Estes itens nunca entram na comparação de preços online nem no
carrinho do Continente/Pingo Doce. São incluídos na mensagem de triagem como lembrete de visita presencial.
Exemplos de uso:
"preferred_store": "lidl" — café que o utilizador prefere comprar no Lidl"preferred_store": "makro" — granel (arroz, azeite) comprado no Makro/Recheio"preferred_store": "auchan" — produto específico só disponível no AuchanAs lojas físicas são configuradas em {baseDir}/data/family_preferences.json → physical_stores
(nome de exibição, frequência de visita, notas). Para listar apenas compras presenciais:
{baseDir}/.venv/bin/python3 {baseDir}/scripts/list_optimizer.py physical
🛒 Triagem Semanal — [DATA]
📦 COMPRA SEMANAL ([N] itens):
[items agrupados por categoria com emoji]
📦 PARA GRANEL (próxima: [DATA]):
[items com quantidades bulk]
🏪 COMPRAS PRESENCIAIS:
[LOJA 1] ([N] itens — visita [frequência]):
• [produto] — [quantidade] [unidade] ([marca])
[LOJA 2] ...
⚠️ ALERTAS:
[produtos urgentes ou observações]
💰 Budget semanal: €[LIMITE]
Respondam com ✅ para aprovar, ou adicionem/removam itens.
Se não houver compras presenciais pendentes, omitir a secção 🏪.
Lê {baseDir}/references/price_comparison_logic.md para o algoritmo completo.
Resumo do fluxo:
{baseDir}/data/price_cache.json{baseDir}/.venv/bin/python3 {baseDir}/scripts/price_compare.py --output /tmp/comparison.json{baseDir}/assets/templates/price_comparison.mdPara cada produto em falta no cache:
browser open "https://www.continente.pt/pesquisa/?q=[produto]"browser snapshot → identificar card do produto mais relevante{baseDir}/.venv/bin/python3 {baseDir}/scripts/price_cache.py update --market continente --product "[nome]" --data '[json]'https://www.pingodoce.pt/pesquisa/?q=[produto]Lê {baseDir}/references/continente_guide.md ou {baseDir}/references/pingodoce_guide.md conforme o mercado.
{baseDir}/data/shopping_history.json1. Login
browser snapshot → identificar campos de email e passwordbrowser act type [ref_email] "$CONTINENTE_EMAIL" (ou PINGODOCE_EMAIL)browser act type [ref_password] "$CONTINENTE_PASSWORD" (ou PINGODOCE_PASSWORD)browser act click [ref_submit]browser snapshot → verificar se login foi bem sucedido (nome do utilizador visível)2. Verificar cupões
browser snapshot → identificar lista de cupões disponíveis3. Construir carrinho Para cada item do plano deste mercado:
browser snapshot → identificar o produto mais relevante (marca preferida > aceitável > marca própria)browser act click [ref_add_to_cart]4. Revisão e aprovação
browser snapshot → verificar totalbrowser screenshot → enviar imagem ao admin no WhatsApp5. Checkout Após ✅ do admin:
browser screenshot → última verificação6. Pós-compra
{baseDir}/data/shopping_history.json com dados da compra{baseDir}/.venv/bin/python3 {baseDir}/scripts/consumption_tracker.py update --purchase <dados.json>| Input | Ação |
|---|---|
| "Acabou o [X]" / "Precisamos de [X]" | Adiciona à lista |
| "Remove [X]" / "Já não preciso de [X]" | Remove da lista |
| "Mostra a lista" / "O que falta?" | Envia lista categorizada |
| "Quanto gastámos?" / "Quanto gastámos este mês?" | Resumo de gastos do mês |
| "Quando chega a encomenda?" | Info de tracking |
| "Ainda temos [X]" | Ajusta modelo de consumo (still_have) |
| "Já acabou o [X]" | Ajusta modelo de consumo (already_finished) |
| "Já não compramos [X]" | Desativa produto no modelo |
| ✅ (resposta a proposta) | Voto de aprovação |
| ❌ (resposta a proposta) | Voto de rejeição |
admin_users (ver {baseDir}/data/family_preferences.json) podem aprovar compras e ultrapassar budgetsSemanal (cron segunda 8h):
{baseDir}/data/shopping_history.json (última semana){baseDir}/assets/templates/weekly_report.mdMensal (cron dia 1 9h):
| Script | Propósito | Como usar |
|---|---|---|
{baseDir}/scripts/price_cache.py | Gerir cache de preços | {baseDir}/.venv/bin/python3 ... search --product "leite" |
{baseDir}/scripts/price_compare.py | Otimização multi-mercado | {baseDir}/.venv/bin/python3 ... --output /tmp/comparison.json |
{baseDir}/scripts/consumption_tracker.py | Atualizar/consultar modelo de consumo | {baseDir}/.venv/bin/python3 ... check-stock |
{baseDir}/scripts/list_optimizer.py | Gerar lista semanal/mensal otimizada | {baseDir}/.venv/bin/python3 ... triage --next-bulk-date YYYY-MM-DD |
Carregar apenas quando necessário (não carregar todos de uma vez):
| Ficheiro | Quando ler |
|---|---|
{baseDir}/references/continente_guide.md | Quando interagir com Continente Online |
{baseDir}/references/pingodoce_guide.md | Quando interagir com Pingo Doce Online |
{baseDir}/references/price_comparison_logic.md | Quando correr comparação de preços |
{baseDir}/references/consumption_patterns.md | Quando atualizar/consultar modelo de consumo |
Configurar com {baseDir}/scripts/setup_crons.sh. Jobs ativos:
| Job | Schedule | Ação |
|---|---|---|
daily-stock-check | Diário 10h | Verificar stock e alertar se necessário |
weekly-triage | Domingo 9h | Triagem completa + proposta ao WhatsApp |
monthly-bulk-planning | Dia 25 9h | Planear compra a granel do mês seguinte |
weekly-report | Segunda 8h | Relatório semanal de gastos |
monthly-report | Dia 1 9h | Relatório mensal completo |
price-cache-refresh | Quarta e sábado 6h | Atualizar cache dos 50 produtos mais comprados |