From 9404af7ac9caf71922f692c0e9065320666fdee6 Mon Sep 17 00:00:00 2001 From: Emanuel Almeida Date: Thu, 5 Mar 2026 17:16:15 +0000 Subject: [PATCH] feat: sync all plugins, skills, agents updates New plugins: core-tools New skills: auto-expense, ticket-triage, design, security-check, aiktop-tasks, daily-digest, imap-triage, index-update, mindmap, notebooklm, proc-creator, tasks-overview, validate-component, perfex-module, report, calendar-manager New agents: design-critic, design-generator, design-lead, design-prompt-architect, design-researcher, compliance-auditor, metabase-analyst, gitea-integration-specialist Updated: all plugin configs, knowledge datasets, existing skills Co-Authored-By: Claude Opus 4.6 --- .claude-plugin/marketplace.json | 28 +- automacao/agents/automation-lead.md | 22 +- automacao/agents/mcp-protocol-developer.md | 28 +- automacao/agents/n8n-automation-expert.md | 27 +- automacao/knowledge/datasets.json | 127 +- core-tools/.claude-plugin/plugin.json | 12 + core-tools/README.md | 41 + core-tools/plugin.json | 23 + core-tools/skills/_core/SKILL.md | 121 ++ core-tools/skills/_core/datasets-mapping.json | 283 ++++ .../skills/_core/dify-integration-protocol.md | 128 ++ .../skills/_core/instrumentation-protocol.md | 157 +++ .../skills/_core/notebooklm-mapping.json | 69 + .../skills/agent-context-injector/SKILL.md | 154 +++ .../skills/component-generator/SKILL.md | 290 ++++ .../skills/db-maintenance-manager/SKILL.md | 267 ++++ .../skills/infrastructure-manager/SKILL.md | 211 +++ core-tools/skills/metrics/SKILL.md | 591 ++++++++ core-tools/skills/plugin-curator/SKILL.md | 105 ++ core-tools/skills/plugin-manager/SKILL.md | 153 +++ .../skills/plugin-manager/profiles.json | 143 ++ core-tools/skills/quality-validator/SKILL.md | 196 +++ .../skills/relationship-manager/SKILL.md | 231 ++++ crm-ops/.claude-plugin/plugin.json | 11 +- crm-ops/agents/budget-proposal-specialist.md | 21 +- crm-ops/agents/lead-approach-strategist.md | 32 +- crm-ops/agents/lead-qualifier.md | 25 +- crm-ops/agents/sales-manager.md | 12 +- crm-ops/knowledge/datasets.json | 54 +- crm-ops/skills/auto-expense/SKILL.md | 208 +++ crm-ops/skills/crm-admin/SKILL.md | 2 +- crm-ops/skills/expense/SKILL.md | 264 ++-- crm-ops/skills/orcamento/SKILL.md | 2 +- crm-ops/skills/ticket-triage/SKILL.md | 189 +++ design-media/.claude-plugin/plugin.json | 6 +- design-media/agents/design-critic.md | 83 ++ design-media/agents/design-generator.md | 96 ++ design-media/agents/design-lead.md | 81 ++ .../agents/design-prompt-architect.md | 108 ++ design-media/agents/design-researcher.md | 78 ++ design-media/agents/ui-designer.md | 23 +- .../agents/video-production-specialist.md | 12 +- design-media/agents/web-designer.md | 22 +- design-media/knowledge/datasets.json | 83 +- design-media/skills/design/SKILL.md | 141 ++ .../agents/database-design-specialist.md | 22 +- dev-tools/agents/dev-helper.md | 60 +- dev-tools/agents/development-lead.md | 24 +- .../agents/javascript-fullstack-specialist.md | 27 +- dev-tools/agents/nextjs-specialist.md | 24 +- dev-tools/agents/php-fullstack-engineer.md | 13 +- dev-tools/knowledge/datasets.json | 122 +- dev-tools/skills/chrome/SKILL.md | 189 ++- dev-tools/skills/db-design/SKILL.md | 2 +- dev-tools/skills/nextjs/SKILL.md | 19 + dev-tools/skills/php-dev/SKILL.md | 12 +- dev-tools/skills/react-patterns/SKILL.md | 4 +- dev-tools/skills/security-check/SKILL.md | 448 +++++++ gestao/.claude-plugin/plugin.json | 13 +- gestao/agents/analytics-insights-agent.md | 19 +- gestao/agents/compliance-auditor.md | 529 ++++++++ gestao/agents/project-manager.md | 21 +- gestao/agents/reflect-agent.md | 11 +- gestao/agents/software-project-planner.md | 22 +- gestao/agents/time-management-agent.md | 8 + gestao/agents/wiki-knowledge-agent.md | 23 +- gestao/knowledge/datasets.json | 102 +- gestao/skills/aiktop-tasks/SKILL.md | 144 ++ gestao/skills/calendar-manager/SKILL.md | 2 +- gestao/skills/daily-digest/SKILL.md | 140 ++ gestao/skills/delegate/SKILL.md | 2 +- gestao/skills/imap-triage/SKILL.md | 254 ++++ .../imap-triage/config/email-triage-rules.md | 456 +++++++ gestao/skills/index-update/SKILL.md | 392 ++++++ gestao/skills/knowledge/SKILL.md | 18 +- gestao/skills/knowledge/config/sources.json | 6 +- gestao/skills/knowledge/docs/workflow.md | 2 +- gestao/skills/mindmap/SKILL.md | 164 +++ gestao/skills/notebooklm/SKILL.md | 406 ++++++ gestao/skills/proc-creator/SKILL.md | 365 +++++ gestao/skills/tasks-overview/SKILL.md | 128 ++ gestao/skills/time/SKILL.md | 27 +- gestao/skills/today/SKILL.md | 1185 +++-------------- .../skills/today/config/email-triage-rules.md | 12 +- gestao/skills/today/prompts/execute.md | 418 +----- gestao/skills/today/templates/daily-report.md | 13 + gestao/skills/validate-component/SKILL.md | 365 +++++ gestao/skills/worklog/SKILL.md | 17 +- hello-plugin/.claude-plugin/plugin.json | 14 - hello-plugin/agents/SKILL.md | 41 - hello-plugin/hooks/log-tools.sh | 18 - hello-plugin/skills/SKILL.md | 27 - infraestrutura/.claude-plugin/plugin.json | 19 +- infraestrutura/agents/backup-specialist.md | 19 +- infraestrutura/agents/cwp-server-manager.md | 47 +- infraestrutura/agents/easypanel-specialist.md | 25 +- .../agents/infrastructure-orchestrator.md | 9 + infraestrutura/agents/proxmox-specialist.md | 456 +++++++ .../agents/security-compliance-specialist.md | 20 +- infraestrutura/knowledge/datasets.json | 70 +- .../skills/backup-strategies/SKILL.md | 2 +- infraestrutura/skills/cwp-accounts/SKILL.md | 18 +- infraestrutura/skills/cwp-backup/SKILL.md | 17 +- infraestrutura/skills/cwp-email/SKILL.md | 18 +- infraestrutura/skills/cwp-php/SKILL.md | 17 +- infraestrutura/skills/cwp-scripts/SKILL.md | 17 +- infraestrutura/skills/cwp-security/SKILL.md | 16 +- infraestrutura/skills/cwp-ssl/SKILL.md | 18 +- infraestrutura/skills/cwp-webserver/SKILL.md | 17 +- infraestrutura/skills/infra-check/SKILL.md | 180 +++ infraestrutura/skills/mcp-dev/SKILL.md | 32 +- infraestrutura/skills/pbs-config/SKILL.md | 497 +++++++ .../skills/proxmox-cluster/SKILL.md | 478 +++++++ infraestrutura/skills/proxmox-ha/SKILL.md | 524 ++++++++ infraestrutura/skills/proxmox-setup/SKILL.md | 532 ++++++++ infraestrutura/skills/security-audit/SKILL.md | 2 +- infraestrutura/skills/server-health/SKILL.md | 2 +- infraestrutura/skills/vm-migration/SKILL.md | 571 ++++++++ marketing/agents/content-manager.md | 20 +- marketing/agents/copywriter.md | 20 +- marketing/agents/marketing-planning-expert.md | 13 +- marketing/agents/ppc-specialist.md | 20 +- marketing/agents/seo-specialist.md | 21 +- marketing/agents/social-media-manager.md | 22 +- .../agents/video-production-specialist.md | 22 +- marketing/agents/youtube-specialist.md | 21 +- marketing/knowledge/datasets.json | 286 +++- marketing/skills/ads/SKILL.md | 2 +- .../skills/content-marketing-pt/SKILL.md | 2 +- marketing/skills/lead-approach/SKILL.md | 2 +- marketing/skills/marketing-strategy/SKILL.md | 2 +- marketing/skills/seo-audit/SKILL.md | 2 +- .../skills/seo-content-optimization/SKILL.md | 2 +- marketing/skills/seo-report/SKILL.md | 2 +- marketing/skills/social-media/SKILL.md | 2 +- marketing/skills/video/SKILL.md | 12 +- marketing/skills/youtube/SKILL.md | 2 +- metabase/.claude-plugin/plugin.json | 12 + metabase/agents/metabase-analyst.md | 159 +++ metabase/knowledge/datasets.json | 21 + metabase/skills/dashboard/SKILL.md | 141 ++ metabase/skills/metabase/SKILL.md | 126 ++ metabase/skills/query/SKILL.md | 155 +++ negocio/agents/ecommerce-architect.md | 32 +- negocio/agents/finance-manager.md | 27 +- negocio/agents/research-analyst.md | 12 +- negocio/agents/saas-architect.md | 21 +- negocio/knowledge/datasets.json | 104 +- negocio/skills/ecommerce/SKILL.md | 2 +- negocio/skills/product/SKILL.md | 2 +- negocio/skills/research/SKILL.md | 2 +- negocio/skills/saas/SKILL.md | 2 +- .../agents/perfex-crm-module-developer.md | 27 +- perfex-dev/knowledge/datasets.json | 37 +- project-manager/hooks/spec-gate.sh | 7 +- project-manager/skills/brainstorm/SKILL.md | 5 +- wordpress/agents/elementor-specialist.md | 31 +- wordpress/agents/woocommerce-specialist.md | 22 +- .../wordpress-performance-specialist.md | 21 +- .../agents/wordpress-plugin-developer.md | 12 +- wordpress/knowledge/datasets.json | 109 +- wordpress/skills/branda-menu/SKILL.md | 572 ++++++++ wordpress/skills/crocoblock/SKILL.md | 241 ++++ .../crocoblock/references/automation.md | 294 ++++ .../skills/crocoblock/references/patterns.md | 220 +++ .../skills/crocoblock/references/plugins.md | 240 ++++ wordpress/skills/elementor/SKILL.md | 55 +- .../skills/elementor/references/automation.md | 417 ++++++ wordpress/skills/jetengine/SKILL.md | 295 ++++ .../assets/descomplicar-jet-bridge.php | 226 ++++ .../skills/jetengine/references/automation.md | 668 ++++++++++ .../jetengine/references/dynamic-content.md | 271 ++++ .../jetengine/references/query-listings.md | 225 ++++ wordpress/skills/rank-math/SKILL.md | 295 ++++ .../skills/rank-math/references/commands.md | 379 ++++++ wordpress/skills/woocommerce-cli/SKILL.md | 271 ++++ .../woocommerce-cli/references/commands.md | 621 +++++++++ wordpress/skills/woocommerce/SKILL.md | 6 +- wordpress/skills/wp-cli/SKILL.md | 332 +++++ .../skills/wp-cli/references/commands.md | 376 ++++++ wordpress/skills/wp-cli/scripts/wp-auto.sh | 34 + wordpress/skills/wp-dev/SKILL.md | 2 +- wordpress/skills/wp-translate/SKILL.md | 266 ++++ wordpress/skills/wp-update/SKILL.md | 75 +- 184 files changed, 20865 insertions(+), 1993 deletions(-) create mode 100644 core-tools/.claude-plugin/plugin.json create mode 100644 core-tools/README.md create mode 100644 core-tools/plugin.json create mode 100644 core-tools/skills/_core/SKILL.md create mode 100644 core-tools/skills/_core/datasets-mapping.json create mode 100644 core-tools/skills/_core/dify-integration-protocol.md create mode 100644 core-tools/skills/_core/instrumentation-protocol.md create mode 100644 core-tools/skills/_core/notebooklm-mapping.json create mode 100644 core-tools/skills/agent-context-injector/SKILL.md create mode 100644 core-tools/skills/component-generator/SKILL.md create mode 100644 core-tools/skills/db-maintenance-manager/SKILL.md create mode 100644 core-tools/skills/infrastructure-manager/SKILL.md create mode 100644 core-tools/skills/metrics/SKILL.md create mode 100644 core-tools/skills/plugin-curator/SKILL.md create mode 100644 core-tools/skills/plugin-manager/SKILL.md create mode 100644 core-tools/skills/plugin-manager/profiles.json create mode 100644 core-tools/skills/quality-validator/SKILL.md create mode 100644 core-tools/skills/relationship-manager/SKILL.md create mode 100644 crm-ops/skills/auto-expense/SKILL.md create mode 100644 crm-ops/skills/ticket-triage/SKILL.md create mode 100644 design-media/agents/design-critic.md create mode 100644 design-media/agents/design-generator.md create mode 100644 design-media/agents/design-lead.md create mode 100644 design-media/agents/design-prompt-architect.md create mode 100644 design-media/agents/design-researcher.md create mode 100644 design-media/skills/design/SKILL.md create mode 100644 dev-tools/skills/security-check/SKILL.md create mode 100644 gestao/agents/compliance-auditor.md create mode 100644 gestao/skills/aiktop-tasks/SKILL.md create mode 100644 gestao/skills/daily-digest/SKILL.md create mode 100644 gestao/skills/imap-triage/SKILL.md create mode 100644 gestao/skills/imap-triage/config/email-triage-rules.md create mode 100644 gestao/skills/index-update/SKILL.md create mode 100644 gestao/skills/mindmap/SKILL.md create mode 100644 gestao/skills/notebooklm/SKILL.md create mode 100644 gestao/skills/proc-creator/SKILL.md create mode 100644 gestao/skills/tasks-overview/SKILL.md create mode 100644 gestao/skills/validate-component/SKILL.md delete mode 100644 hello-plugin/.claude-plugin/plugin.json delete mode 100644 hello-plugin/agents/SKILL.md delete mode 100644 hello-plugin/hooks/log-tools.sh delete mode 100644 hello-plugin/skills/SKILL.md create mode 100644 infraestrutura/agents/proxmox-specialist.md create mode 100644 infraestrutura/skills/infra-check/SKILL.md create mode 100644 infraestrutura/skills/pbs-config/SKILL.md create mode 100644 infraestrutura/skills/proxmox-cluster/SKILL.md create mode 100644 infraestrutura/skills/proxmox-ha/SKILL.md create mode 100644 infraestrutura/skills/proxmox-setup/SKILL.md create mode 100644 infraestrutura/skills/vm-migration/SKILL.md create mode 100644 metabase/.claude-plugin/plugin.json create mode 100644 metabase/agents/metabase-analyst.md create mode 100644 metabase/knowledge/datasets.json create mode 100644 metabase/skills/dashboard/SKILL.md create mode 100644 metabase/skills/metabase/SKILL.md create mode 100644 metabase/skills/query/SKILL.md create mode 100644 wordpress/skills/branda-menu/SKILL.md create mode 100644 wordpress/skills/crocoblock/SKILL.md create mode 100644 wordpress/skills/crocoblock/references/automation.md create mode 100644 wordpress/skills/crocoblock/references/patterns.md create mode 100644 wordpress/skills/crocoblock/references/plugins.md create mode 100644 wordpress/skills/elementor/references/automation.md create mode 100644 wordpress/skills/jetengine/SKILL.md create mode 100644 wordpress/skills/jetengine/assets/descomplicar-jet-bridge.php create mode 100644 wordpress/skills/jetengine/references/automation.md create mode 100644 wordpress/skills/jetengine/references/dynamic-content.md create mode 100644 wordpress/skills/jetengine/references/query-listings.md create mode 100644 wordpress/skills/rank-math/SKILL.md create mode 100644 wordpress/skills/rank-math/references/commands.md create mode 100644 wordpress/skills/woocommerce-cli/SKILL.md create mode 100644 wordpress/skills/woocommerce-cli/references/commands.md create mode 100644 wordpress/skills/wp-cli/SKILL.md create mode 100644 wordpress/skills/wp-cli/references/commands.md create mode 100755 wordpress/skills/wp-cli/scripts/wp-auto.sh create mode 100644 wordpress/skills/wp-translate/SKILL.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 3b74a0d..800d712 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -29,8 +29,8 @@ { "name": "design-media", "source": "./design-media", - "description": "UI/UX design, web design, video production with Remotion and PowerPoint generation. Backed by 3 Dify KB datasets.", - "version": "1.0.0", + "description": "Motor de design profissional multi-marca. 5 MCPs (Presenton, Penpot, Stitch, Figma, Design-Engine), 8 agents, 4 skills. Apresentacoes, infograficos, social media, web pages, logos, identidade visual.", + "version": "2.0.0", "author": { "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" @@ -57,20 +57,20 @@ } }, { - "name": "hello-plugin", - "source": "./hello-plugin", - "description": "Plugin de exemplo para Claude Code. Demonstra skills, agents e hooks num formato minimo e didactico.", - "version": "1.0.0", + "name": "core-tools", + "source": "./core-tools", + "description": "Core system tools for plugin management, metrics, and infrastructure meta-operations.", + "version": "2.0.0", "author": { - "name": "Emanuel Almeida", + "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" } }, { "name": "infraestrutura", "source": "./infraestrutura", - "description": "Server management, CWP administration, EasyPanel deployments, security audits, backups and MCP development. Backed by 4 Dify KB datasets.", - "version": "1.0.0", + "description": "Server management, Proxmox VE/PBS/Clustering, CWP administration, EasyPanel deployments, security audits, backups and MCP development. Backed by 4 Dify KB datasets + NotebookLM Proxmox (150+ sources).", + "version": "1.1.0", "author": { "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" @@ -125,6 +125,16 @@ "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" } + }, + { + "name": "metabase", + "source": "./metabase", + "description": "Metabase BI analytics - dashboards, SQL queries, database exploration and reporting via bi.descomplicar.pt. Powered by metabase-ai-assistant MCP.", + "version": "1.0.0", + "author": { + "name": "Descomplicar - Crescimento Digital", + "url": "https://descomplicar.pt" + } } ] } diff --git a/automacao/agents/automation-lead.md b/automacao/agents/automation-lead.md index 3c0a8c4..4add6e6 100644 --- a/automacao/agents/automation-lead.md +++ b/automacao/agents/automation-lead.md @@ -5,6 +5,16 @@ role: Líder técnico de automação e orquestração domain: Automation model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - n8n + - ssh-unified +recommended_mcps: + - gitea + - memory-supabase + - filesystem skills: - _core desk_task: 1492 @@ -139,7 +149,17 @@ Trigger → [Passo 1] → [Passo 2] → Output 6. Registar performance ``` -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1" query:"workflows automacao integracao" +mcp__notebooklm__notebook_query notebook_id:"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8" query:"AI agents orchestration" +mcp__notebooklm__notebook_query notebook_id:"929ef67b-c131-4f01-abd0-8b078491a6b7" query:"LLM workflows deployment" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"n8n" query:"workflows automacao integracao" diff --git a/automacao/agents/mcp-protocol-developer.md b/automacao/agents/mcp-protocol-developer.md index fcc659e..a1c1ef6 100644 --- a/automacao/agents/mcp-protocol-developer.md +++ b/automacao/agents/mcp-protocol-developer.md @@ -7,6 +7,16 @@ role: Especialista em desenvolvimento de servidores MCP e integracoes para o eco domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - gitea + - ssh-unified +recommended_mcps: + - context7 + - filesystem + - memory-supabase skills: - _core desk_task: 1508 @@ -42,7 +52,18 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe - Design de estrategias de caching e transformacao de dados - Testes de compliance e validacao de protocolo MCP -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"73102308-70ef-403e-9be9-eae0cfc62d55" query:"protocol development tools integration" +mcp__notebooklm__notebook_query notebook_id:"2876d1fe-5cea-4d98-8140-b0e1a81c6bc4" query:"MCP server configuration" +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"typescript nodejs api development" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"MCP Servers" query:"protocol development tools integration" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Claude Code" query:"MCP server configuration" @@ -98,7 +119,7 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe ## MCPs Relevantes - `gitea`: Gestão de código MCP - `desk-crm-v3`: Tracking desenvolvimento (Proj #65, Milestone 256) -- `dify-kb`: KB MCP Servers, Claude Code, Desenvolvimento Software +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB MCP Servers, Claude Code, Desenvolvimento Software - `ssh-unified`: Deploy em servidores ## Colaboracao @@ -120,7 +141,8 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe - SSH, SFTP, servidor management - Usage: `mcp__ssh-unified__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/automacao/agents/n8n-automation-expert.md b/automacao/agents/n8n-automation-expert.md index 64e96c7..cb3ad3d 100644 --- a/automacao/agents/n8n-automation-expert.md +++ b/automacao/agents/n8n-automation-expert.md @@ -7,6 +7,15 @@ role: Especialista em automacao de processos usando N8N para criacao de workflow domain: Automation model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - n8n + - desk-crm-v3 +recommended_mcps: + - ssh-unified + - gitea + - filesystem skills: - _core desk_task: 1509 @@ -42,7 +51,18 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados - Implementacao de error handling robusto e retry logic - Monitorizacao e alertas para saude dos workflows -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1" query:"workflow automation nodes triggers" +mcp__notebooklm__notebook_query notebook_id:"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8" query:"process automation integration" +mcp__notebooklm__notebook_query notebook_id:"929ef67b-c131-4f01-abd0-8b078491a6b7" query:"AI automation workflows" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"n8n" query:"workflow automation nodes triggers" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Ferramentas de Automacao e IA" query:"process automation integration" @@ -98,7 +118,7 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados ## MCPs Relevantes - `desk-crm-v3`: Dados para automações (leads, tarefas) -- `dify-kb`: KB n8n, Ferramentas Automação, Dify +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB n8n, Ferramentas Automação, Dify - `memory-supabase`: Histórico de workflows criados ## Colaboracao @@ -116,7 +136,8 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados - Workflows automation - Usage: `mcp__n8n__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/automacao/knowledge/datasets.json b/automacao/knowledge/datasets.json index e4a2e72..1a0da34 100644 --- a/automacao/knowledge/datasets.json +++ b/automacao/knowledge/datasets.json @@ -1,15 +1,114 @@ { - "description": "Dify KB datasets for Automation domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "f14521df-c44a-48f0-8703-b1d1cf77ca05", "name": "n8n", "priority": 1, "document_count": 1, "word_count": 206928}, - {"id": "44d1517b-65b8-4d81-8253-5683ff0b8830", "name": "Dify", "priority": 1, "document_count": 4, "word_count": 1244175}, - {"id": "b0a5e9e6-0d39-4e56-8c61-72c8e14ca41d", "name": "Flowise", "priority": 2, "document_count": 3, "word_count": 245565}, - {"id": "b3e994c9-f642-4f23-a3db-8d9e344d489f", "name": "Typebot", "priority": 2, "document_count": 1, "word_count": 79608}, - {"id": "728bed1f-79cb-4e56-aa8a-8dd961197354", "name": "Chatwoot", "priority": 2, "document_count": 7, "word_count": 149615}, - {"id": "76f14ca9-7e11-4924-9ebc-ccd79876aa78", "name": "Baserow", "priority": 2, "document_count": 1, "word_count": 53665}, - {"id": "ebf7e4aa-5d2c-49f0-bbb3-f73711a9e0b3", "name": "Open WebUI", "priority": 2, "document_count": 3, "word_count": 15266191}, - {"id": "22f1d0cf-0661-4a5d-ad0e-b3c1cd2c234a", "name": "Ferramentas Automacao e IA", "priority": 1, "document_count": 41, "word_count": 805400}, - {"id": "a8987108-2121-4e55-b055-67fe70f8aae0", "name": "Moodle", "priority": 3, "document_count": 40, "word_count": 764457} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for Automation domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", + "title": "n8n", + "topics": [ + "n8n" + ], + "maps_from_dify": "n8n" + }, + { + "id": "929ef67b-c131-4f01-abd0-8b078491a6b7", + "title": "AI Automation Stack", + "topics": [ + "dify" + ], + "maps_from_dify": "Dify" + }, + { + "id": "be6f72ac-f8ba-4337-912d-abd5dd448519", + "title": "Open WebUI", + "topics": [ + "open", + "webui" + ], + "maps_from_dify": "Open WebUI" + }, + { + "id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", + "title": "Transformacao Digital e IA", + "topics": [ + "ferramentas", + "automacao" + ], + "maps_from_dify": "Ferramentas Automacao e IA" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "f14521df-c44a-48f0-8703-b1d1cf77ca05", + "name": "n8n", + "priority": 1, + "document_count": 1, + "word_count": 206928 + }, + { + "id": "44d1517b-65b8-4d81-8253-5683ff0b8830", + "name": "Dify", + "priority": 1, + "document_count": 4, + "word_count": 1244175 + }, + { + "id": "b0a5e9e6-0d39-4e56-8c61-72c8e14ca41d", + "name": "Flowise", + "priority": 2, + "document_count": 3, + "word_count": 245565 + }, + { + "id": "b3e994c9-f642-4f23-a3db-8d9e344d489f", + "name": "Typebot", + "priority": 2, + "document_count": 1, + "word_count": 79608 + }, + { + "id": "728bed1f-79cb-4e56-aa8a-8dd961197354", + "name": "Chatwoot", + "priority": 2, + "document_count": 7, + "word_count": 149615 + }, + { + "id": "76f14ca9-7e11-4924-9ebc-ccd79876aa78", + "name": "Baserow", + "priority": 2, + "document_count": 1, + "word_count": 53665 + }, + { + "id": "ebf7e4aa-5d2c-49f0-bbb3-f73711a9e0b3", + "name": "Open WebUI", + "priority": 2, + "document_count": 3, + "word_count": 15266191 + }, + { + "id": "22f1d0cf-0661-4a5d-ad0e-b3c1cd2c234a", + "name": "Ferramentas Automacao e IA", + "priority": 1, + "document_count": 41, + "word_count": 805400 + }, + { + "id": "a8987108-2121-4e55-b055-67fe70f8aae0", + "name": "Moodle", + "priority": 3, + "document_count": 40, + "word_count": 764457 + } + ] + } + } +} \ No newline at end of file diff --git a/core-tools/.claude-plugin/plugin.json b/core-tools/.claude-plugin/plugin.json new file mode 100644 index 0000000..7ffe2b8 --- /dev/null +++ b/core-tools/.claude-plugin/plugin.json @@ -0,0 +1,12 @@ +{ + "name": "core-tools", + "description": "Core system tools for plugin management, metrics, and infrastructure meta-operations", + "version": "2.0.0", + "author": { + "name": "Descomplicar", + "url": "https://descomplicar.pt" + }, + "homepage": "https://descomplicar.pt", + "license": "MIT", + "keywords": ["core", "plugins", "management", "profiles", "infrastructure", "meta"] +} diff --git a/core-tools/README.md b/core-tools/README.md new file mode 100644 index 0000000..b95434b --- /dev/null +++ b/core-tools/README.md @@ -0,0 +1,41 @@ +# Core Tools Plugin + +**Versão:** 1.0.0 +**Autor:** Descomplicar® +**Desk Project:** #65 Stack Workflow + +## Descrição + +Core system tools for Claude Code infrastructure and meta-management. + +Este plugin contém skills fundamentais para gestão e manutenção do ecossistema Claude Code. + +## Skills Incluídas + +### Infraestrutura +- **infrastructure-manager** - Gestão automatizada da infraestrutura Claude Code +- **db-maintenance-manager** - Manutenção das tabelas cr_* do sistema +- **relationship-manager** - Gestão de relacionamentos entre componentes + +### Plugins & Componentes +- **plugin-manager** - Gestão dinâmica de plugins (activar/desactivar por perfil) +- **plugin-curator** - Curadoria inteligente de plugins +- **component-generator** - Gera skills/agents/commands automaticamente +- **quality-validator** - Valida componentes contra standards + +### Agentes +- **agent-context-injector** - Injeta contexto específico quando um agente é iniciado + +### Métricas +- **metrics** - Dashboard de performance com ROI e telemetria + +### Core +- **_core** - Padrões fundamentais Descomplicar® (Sacred Rules, Excellence Standards, MCP Protocol) + +## Utilização + +Skills activadas automaticamente pelo sistema quando necessário. + +## Tags + +infrastructure, meta, system, core diff --git a/core-tools/plugin.json b/core-tools/plugin.json new file mode 100644 index 0000000..c04810d --- /dev/null +++ b/core-tools/plugin.json @@ -0,0 +1,23 @@ +{ + "name": "core-tools", + "version": "1.0.0", + "description": "Core system tools for Claude Code infrastructure and meta-management", + "author": "Descomplicar®", + "skills": [ + "agent-context-injector", + "component-generator", + "metrics", + "plugin-curator", + "plugin-manager", + "quality-validator", + "relationship-manager", + "infrastructure-manager", + "db-maintenance-manager", + "_core" + ], + "agents": [], + "hooks": [], + "commands": [], + "tags": ["infrastructure", "meta", "system", "core"], + "desk_project": 65 +} diff --git a/core-tools/skills/_core/SKILL.md b/core-tools/skills/_core/SKILL.md new file mode 100644 index 0000000..4f3fe73 --- /dev/null +++ b/core-tools/skills/_core/SKILL.md @@ -0,0 +1,121 @@ +--- +name: core-descomplicar +description: Padrões fundamentais Descomplicar® - Sacred Rules, Excellence Standards, MCP Protocol. Skill base para todos os agentes. +quality_score: 40 +--- + +# Core Standards Descomplicar® + +Padrões obrigatórios para todos os agentes do sistema. + +--- + +## 🔟 REGRAS SAGRADAS + +### 1. É permitido falhar +Reportar erros com transparência. Falhar rápido, aprender mais rápido. + +### 2. Transparência e honestidade +Comunicar claramente. Não omitir informações. + +### 3. Más notícias primeiro +Escalar problemas imediatamente. + +### 4. Foco na resolução +Todo problema deve incluir soluções propostas. + +### 5. Nunca prejudicar +Princípio "do no harm". Proteger dados e sistemas. + +### 6. Passar a bola certa +Delegar para o especialista quando necessário. + +### 7. 3x antes de escalar +Três tentativas documentadas antes de escalação. + +### 8. Feedback protocol +Crítica privada, elogio público. + +### 9. Perguntar sempre +Pedir esclarecimento quando incerto. + +### 10. Crescimento contínuo +Mentalidade de aprendizagem constante. + +--- + +## 🎯 PADRÕES DE EXCELÊNCIA + +### Qualidade Mínima: 100/100 + +- **Precisão**: 100% informação verificada +- **Completude**: Especificações cumpridas +- **Consistência**: Alinhamento com padrões +- **Usabilidade**: Solução funcional +- **Manutenibilidade**: Sustentável longo prazo + +### Dados Reais Obrigatórios + +**NUNCA simular quando dados reais existem.** + +Hierarquia: +1. MCPs especializados (desk-crm, dify-kb, wikijs) +2. Sistemas internos (Gitea, Drive) +3. Documentação oficial (Context7) +4. Simulação APENAS se dados não existem + +--- + +## ⚡ PROTOCOLO MCP (3 PASSOS) + +### PASSO 1: Recuperação de Contexto + +``` +SEMPRE EXECUTAR PRIMEIRO: +1. mcp__memory-supabase__search_memories → Experiência histórica +2. mcp__wikijs__search_pages → Documentação interna +3. mcp__dify-kb__dify_kb_retrieve_segments → Knowledge base temática +``` + +### PASSO 2: Hierarquia de Fontes + +``` +🥇 1ª: MCPs especializados (memory-supabase, dify-kb, desk-crm-v3) +🥈 2ª: MCPs de sistema (wikijs, filesystem, google-workspace) +🥉 3ª: MCPs complementares (context7, puppeteer) +🔧 ÚLTIMO: Ferramentas nativas Claude +``` + +### PASSO 3: Captura de Aprendizagem + +``` +SEMPRE GUARDAR ao final: +mcp__memory-supabase__save_memory { + "content": "[Resumo do trabalho e decisões]", + "tags": ["[área]", "[projecto]", "[tipo]"] +} +``` + +--- + +## ✅ CHECKLIST PRE-ENTREGA + +- [ ] Dados verificados com fontes reais +- [ ] Qualidade técnica validada (100/100) +- [ ] Padrões Descomplicar® seguidos +- [ ] Documentação clara +- [ ] Testes executados (quando aplicável) +- [ ] Aprendizagens capturadas + +--- + +## 📝 OUTPUT + +- **Assinatura**: `/** @author Descomplicar® | @link descomplicar.pt | @copyright 2026 */` +- **Markdown**: Obsidian-ready (frontmatter, wikilinks, callouts) +- **Língua**: Português Europeu (PT-PT) +- **Monetário**: 95€ (não 95,00€) + +--- + +*Core Standards v1.0 | 2026-01-27* diff --git a/core-tools/skills/_core/datasets-mapping.json b/core-tools/skills/_core/datasets-mapping.json new file mode 100644 index 0000000..17ae070 --- /dev/null +++ b/core-tools/skills/_core/datasets-mapping.json @@ -0,0 +1,283 @@ +{ + "mapping": { + "analytics-insights-agent": { + "model": "haiku", + "tools": ["Read", "Glob", "Grep"], + "datasets": ["Marketing Digital", "Gestão de Marketing", "SEO (Search Engine Optimization)", "Gestão de Tráfego"], + "notebooks": [ + {"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"}, + {"id": "4c595973-ba10-420a-a3bf-e4389e424ad3", "title": "Marketing Digital PT"} + ] + }, + "automation-lead": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["n8n", "Ferramentas de Automação e IA", "Dify", "Flowise"], + "notebooks": [ + {"id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", "title": "n8n"}, + {"id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "title": "Transformacao Digital e IA"}, + {"id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "title": "AI Automation Stack"} + ] + }, + "backup-specialist": { + "model": "sonnet", + "tools": ["Read", "Write", "Bash", "Glob", "Grep"], + "datasets": ["TI (Tecnologia da Informação)", "Linux", "CWP Centos Web Panel", "AWS (Amazon Web Services)"], + "notebooks": [ + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}, + {"id": "0ded7bd6-69b3-4c76-b327-452396bf7ea7", "title": "CWP"} + ] + }, + "content-manager": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["Marketing de Conteúdo", "Copywriting", "Blogging", "Marketing Digital"], + "notebooks": [ + {"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"}, + {"id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "title": "Copywriting e Persuasao"} + ] + }, + "copywriter": { + "model": "sonnet", + "tools": ["Read", "Write", "Glob", "Grep"], + "datasets": ["Copywriting", "Marketing de Conteúdo", "Escrever PT-PT", "Branding"], + "notebooks": [ + {"id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "title": "Copywriting e Persuasao"}, + {"id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "title": "Social Media e Branding"} + ] + }, + "crm-admin-specialist": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["PerfexCRM", "Gestão", "Gestão de Processos"], + "notebooks": [ + {"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"}, + {"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"}, + {"id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", "title": "Gestao de Operacoes"} + ] + }, + "cwp-server-manager": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["CWP Centos Web Panel", "Linux", "TI (Tecnologia da Informação)"], + "notebooks": [ + {"id": "0ded7bd6-69b3-4c76-b327-452396bf7ea7", "title": "CWP"}, + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"} + ] + }, + "database-design-specialist": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["TI (Tecnologia da Informação)", "Desenvolvimento de Software", "AWS (Amazon Web Services)"], + "notebooks": [ + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}, + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"} + ] + }, + "dev-helper": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["Desenvolvimento de Software", "TI (Tecnologia da Informação)", "Claude Code"], + "notebooks": [ + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}, + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}, + {"id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", "title": "Claude Code"} + ] + }, + "development-lead": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["Desenvolvimento de Software", "Gestão de Projetos", "Estratégia"], + "notebooks": [ + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}, + {"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"}, + {"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"} + ] + }, + "easypanel-specialist": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["TI (Tecnologia da Informação)", "Linux", "AWS (Amazon Web Services)"], + "notebooks": [ + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"} + ] + }, + "finance-manager": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["Gestão", "Estratégia", "Estratégia Descomplicar"], + "notebooks": [ + {"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"}, + {"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"}, + {"id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "title": "Descomplicar: Marketing Digital"} + ] + }, + "javascript-fullstack-specialist": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["Desenvolvimento de Software", "TI (Tecnologia da Informação)"], + "notebooks": [ + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}, + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"} + ] + }, + "lead-qualifier": { + "model": "haiku", + "tools": ["Read", "Glob", "Grep"], + "datasets": ["Vendas", "Marketing Digital", "PerfexCRM"], + "notebooks": [ + {"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"}, + {"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"} + ] + }, + "marketing-planning-expert": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["Marketing Digital", "Gestão de Marketing", "Estratégia", "Marketing Redes Sociais"], + "notebooks": [ + {"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"}, + {"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"}, + {"id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "title": "Social Media e Branding"} + ] + }, + "master-orchestrator": { + "model": "opus", + "tools": ["Task", "Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["Gestão de Projetos", "Gestão", "Estratégia", "Estratégia Descomplicar"], + "notebooks": [ + {"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"}, + {"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"}, + {"id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "title": "Descomplicar: Marketing Digital"} + ] + }, + "mcp-protocol-developer": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["MCP Servers", "Claude Code", "Desenvolvimento de Software"], + "notebooks": [ + {"id": "73102308-70ef-403e-9be9-eae0cfc62d55", "title": "Desenvolvimento de MCPs"}, + {"id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", "title": "Claude Code"}, + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"} + ] + }, + "n8n-automation-expert": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["n8n", "Ferramentas de Automação e IA", "Dify"], + "notebooks": [ + {"id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", "title": "n8n"}, + {"id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "title": "Transformacao Digital e IA"}, + {"id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "title": "AI Automation Stack"} + ] + }, + "perfex-crm-module-developer": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["PerfexCRM", "Desenvolvimento de Software"], + "notebooks": [ + {"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"}, + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"} + ] + }, + "performance-optimization-engineer": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["TI (Tecnologia da Informação)", "Desenvolvimento de Software", "AWS (Amazon Web Services)"], + "notebooks": [ + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}, + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"} + ] + }, + "php-fullstack-engineer": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["Desenvolvimento de Software", "WordPress", "TI (Tecnologia da Informação)"], + "notebooks": [ + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}, + {"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"}, + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"} + ] + }, + "project-manager": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["Gestão de Projetos", "Gestão", "Estratégia"], + "notebooks": [ + {"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"}, + {"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"} + ] + }, + "sales-manager": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["Vendas", "Marketing Digital", "PerfexCRM"], + "notebooks": [ + {"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"}, + {"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"} + ] + }, + "security-compliance-specialist": { + "model": "opus", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["TI (Tecnologia da Informação)", "Linux", "AWS (Amazon Web Services)"], + "notebooks": [ + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"} + ] + }, + "seo-specialist": { + "model": "haiku", + "tools": ["Read", "Glob", "Grep"], + "datasets": ["SEO (Search Engine Optimization)", "Marketing Digital", "Marketing de Conteúdo"], + "notebooks": [ + {"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"} + ] + }, + "software-project-planner": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["Gestão de Projetos", "Desenvolvimento de Software", "Estratégia"], + "notebooks": [ + {"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"}, + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}, + {"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"} + ] + }, + "ui-designer": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["UX e Usabilidade", "Desenvolvimento de WebSites", "Canva"], + "notebooks": [ + {"id": "081ca512-8279-4850-b2b9-dff090267482", "title": "UI/UX Design"}, + {"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"}, + {"id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "title": "Social Media e Branding"} + ] + }, + "web-designer": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Glob", "Grep"], + "datasets": ["Desenvolvimento de WebSites", "WordPress", "Elementor", "UX e Usabilidade"], + "notebooks": [ + {"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"}, + {"id": "081ca512-8279-4850-b2b9-dff090267482", "title": "UI/UX Design"} + ] + }, + "wordpress-performance-specialist": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["WordPress", "Elementor", "Crocoblock", "TI (Tecnologia da Informação)"], + "notebooks": [ + {"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"}, + {"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"} + ] + }, + "wordpress-plugin-developer": { + "model": "sonnet", + "tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"], + "datasets": ["WordPress", "Crocoblock", "Elementor", "Desenvolvimento de Software"], + "notebooks": [ + {"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"}, + {"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"} + ] + } + } +} diff --git a/core-tools/skills/_core/dify-integration-protocol.md b/core-tools/skills/_core/dify-integration-protocol.md new file mode 100644 index 0000000..09337da --- /dev/null +++ b/core-tools/skills/_core/dify-integration-protocol.md @@ -0,0 +1,128 @@ +# Protocolo de Knowledge Sources v2.0 + +**Data:** 2026-02-12 +**Propósito:** Consulta inteligente de conhecimento com dual-source (NotebookLM + Dify KB) + +--- + +## Visão Geral + +Skills e agents consultam conhecimento via dual-source: +1. **NotebookLM** (primario) - Gemini 2.5 RAG com conhecimento curado +2. **Dify KB** (fallback) - Datasets tematicos quando NotebookLM insuficiente + +## Fluxo de Consulta + +``` +1. Skill/Agent precisa conhecimento +2. Consultar NotebookLM (primario) + → mcp__notebooklm__notebook_query notebook_id:"" query:"" +3. Se resultado suficiente → usar +4. Se insuficiente → consultar Dify KB (fallback) + → mcp__dify-kb__dify_kb_retrieve_segments dataset:"" query:"" +5. Agregar resultados +``` + +## Como Consultar NotebookLM (Primario) + +### 1. Identificar Notebook (via notebooklm-mapping.json) + +```javascript +// Ler mapeamento +const mapping = require('./notebooklm-mapping.json').mapping; +const notebook = mapping['WordPress']; +// → {notebook_id: "5be0d1a6-...", notebook_title: "WordPress e Elementor"} +``` + +### 2. Consultar Notebook + +``` +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"elementor custom widgets" +``` + +### 3. Múltiplos Notebooks + +Quando o tema cobre vários notebooks, consultar em paralelo: + +``` +# Paralelo: WordPress + Dev +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-..." query:"tema" +mcp__notebooklm__notebook_query notebook_id:"24947ffa-..." query:"tema" +``` + +## Como Consultar Dify KB (Fallback) + +### 1. Identificar Dataset + +```javascript +mcp__dify-kb__dify_kb_retrieve_segments({ + dataset: "WordPress", + query: "elementor custom widgets", + top_k: 5 +}); +``` + +### 2. Consulta Paralela (Múltiplos Datasets) + +```javascript +// Lançar consultas em paralelo para datasets prioritarios +const results = await Promise.all([ + dify_kb_retrieve(dataset1, query), + dify_kb_retrieve(dataset2, query) +]); +``` + +## Mapeamento Notebooks + +Ficheiro central: `notebooklm-mapping.json` (mesmo directorio) + +51 notebooks disponiveis cobrindo: +- Marketing (5 notebooks) +- Desenvolvimento (8 notebooks) +- Infraestrutura (3 notebooks) +- Gestao (3 notebooks) +- Negocio (4 notebooks) +- Automacao (3 notebooks) +- Design (2 notebooks) + +## Template para Agents + +Secção standard nos agents: + +```markdown +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"" query:"" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + +``` +mcp__dify-kb__dify_kb_retrieve_segments dataset:"" query:"" +``` +``` + +## Template para Skills + +Adicionar no SKILL.md: + +```markdown +# PRIMARIO: NotebookLM (Gemini 2.5 RAG) +# mcp__notebooklm__notebook_query notebook_id:"" +# FALLBACK: Dify KB +mcp__dify-kb__dify_kb_retrieve_segments dataset:"" query:"" +``` + +## Metricas + +Rastrear na instrumentacao: +- `kb_source`: "notebooklm" ou "dify" +- `kb_consulted`: 1 se consultou KB +- `kb_fallback`: 1 se precisou de Dify apos NotebookLM + +--- + +**Protocolo v2.0** | 2026-02-12 | Dual-source (NotebookLM + Dify KB) diff --git a/core-tools/skills/_core/instrumentation-protocol.md b/core-tools/skills/_core/instrumentation-protocol.md new file mode 100644 index 0000000..4e4ffa5 --- /dev/null +++ b/core-tools/skills/_core/instrumentation-protocol.md @@ -0,0 +1,157 @@ +# Protocolo de Instrumentação Automática v1.0 + +**Data:** 2026-02-03 +**Propósito:** Auto-registar métricas de execução de skills para análise PDCA + +--- + +## Visão Geral + +Toda skill instrumentada deve gravar automaticamente métricas de execução na tabela `tblskill_agent_metrics` do Desk CRM. + +## Quando Instrumentar + +Skills que: +- Têm baseline definido em `_knowledge-map.json` +- São frequentemente usadas (>5x/semana) +- Estão em processo de optimização + +## Estrutura de Instrumentação + +### 1. Início de Execução + +Ao iniciar a skill, registar: + +```javascript +const SKILL_START = Date.now(); +const SESSION_ID = crypto.randomUUID(); // ou usar session_id existente +``` + +### 2. Rastreio de Consultas KB + +Se a skill consultar Dify KB: + +```javascript +let KB_CONSULTED = false; +let KB_HITS = 0; +let KB_MISS = 0; + +// Após cada consulta Dify bem sucedida +KB_CONSULTED = true; +KB_HITS++; + +// Se consulta falhou ou sem resultados +KB_MISS++; +``` + +### 3. Contagem de Tool Calls + +```javascript +let TOOL_CALLS = 0; + +// Incrementar a cada tool call +TOOL_CALLS++; +``` + +### 4. Fim de Execução - Gravar Métrica + +**Via SQL directo (fallback robusto):** + +```sql +INSERT INTO tblskill_agent_metrics ( + type, name, duration_ms, status, + session_id, task_id, project_id, staff_id, + kb_consulted, kb_hits, kb_miss, tool_calls, + error_type, error_message, context_tokens, output_tokens, + model_used, created_at +) VALUES ( + 'skill', '/nome-skill', {DURATION_MS}, '{STATUS}', + '{SESSION_ID}', {TASK_ID}, {PROJECT_ID}, 25, + {KB_CONSULTED}, {KB_HITS}, {KB_MISS}, {TOOL_CALLS}, + NULL, NULL, NULL, NULL, + 'opus-4.5', NOW() +); +``` + +**Via MCP tool (quando disponível):** + +```javascript +mcp__desk-crm-v3__log_skill_metric({ + type: 'skill', + name: '/nome-skill', + duration_ms: Date.now() - SKILL_START, + status: 'success', // ou 'error', 'partial' + session_id: SESSION_ID, + task_id: CURRENT_TASK_ID, + project_id: CURRENT_PROJECT_ID, + staff_id: 25, // AikTop + kb_consulted: KB_CONSULTED, + kb_hits: KB_HITS, + kb_miss: KB_MISS, + tool_calls: TOOL_CALLS +}); +``` + +## Status Possíveis + +| Status | Quando Usar | +|--------|-------------| +| `success` | Skill completou com sucesso | +| `error` | Skill falhou com erro | +| `partial` | Skill completou parcialmente | +| `cancelled` | Utilizador cancelou | + +## Campos Opcionais + +| Campo | Quando Preencher | +|-------|------------------| +| `task_id` | Se executando dentro de tarefa Desk | +| `project_id` | Se contexto de projecto conhecido | +| `error_type` | Se status = 'error' | +| `error_message` | Se status = 'error' | +| `context_tokens` | Se disponível via API | +| `output_tokens` | Se disponível via API | + +## Template para Skills + +Adicionar esta secção no final de cada SKILL.md instrumentada: + +```markdown +--- + +## Instrumentação Automática + +Esta skill grava métricas automaticamente para análise PDCA. + +### Ao Executar Esta Skill + +1. **Início:** Registar timestamp inicial +2. **Consultas KB:** Rastrear hits/miss do Dify +3. **Fim:** Gravar métrica via SQL ou MCP + +### Query para Gravar (executar no final) + +\`\`\`sql +INSERT INTO tblskill_agent_metrics (type, name, duration_ms, status, staff_id, kb_consulted, created_at) +VALUES ('skill', '/nome-skill', {DURACAO_MS}, '{STATUS}', 25, {KB_CONSULTADO}, NOW()); +\`\`\` + +### Ver Métricas + +\`\`\`bash +/metrics /nome-skill +\`\`\` +``` + +## Integração com /reflect + +Se degradação detectada (performance >15% pior que baseline): + +1. `/metrics` mostra alerta +2. Sugerir `/reflect` para investigação +3. `/reflect` analisa padrões e propõe melhorias +4. Registar ciclo PDCA em `tblskill_agent_pdca_cycles` + +--- + +**Protocolo v1.0** | 2026-02-03 diff --git a/core-tools/skills/_core/notebooklm-mapping.json b/core-tools/skills/_core/notebooklm-mapping.json new file mode 100644 index 0000000..992373d --- /dev/null +++ b/core-tools/skills/_core/notebooklm-mapping.json @@ -0,0 +1,69 @@ +{ + "description": "Mapeamento Dify KB datasets -> NotebookLM notebooks. NotebookLM e fonte primaria (Gemini 2.5 RAG). Dify KB e fallback.", + "updated": "2026-02-12", + "query_tool": "mcp__notebooklm__notebook_query", + "fallback_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "mapping": { + "Marketing Digital": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"}, + "Marketing": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"}, + "Gestao de Marketing": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"}, + "Gestao de Trafego": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"}, + "Marketing de Conteudo": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"}, + "Growth Hacking": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"}, + "Marketing Redes Sociais": {"notebook_id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "notebook_title": "Social Media e Branding"}, + "Branding": {"notebook_id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "notebook_title": "Social Media e Branding"}, + "Canva": {"notebook_id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "notebook_title": "Social Media e Branding"}, + "SEO (Search Engine Optimization)": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "SEO coberto genericamente no Marketing Avancado"}, + "SEO": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"}, + "Copywriting": {"notebook_id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "notebook_title": "Copywriting e Persuasao"}, + "Youtube Marketing": {"notebook_id": "058a896e-6c9a-4e51-ae7d-9adb2738bc5f", "notebook_title": "Producao de Video e Youtube"}, + "Vendas": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "Sem notebook dedicado, coberto parcialmente"}, + "Email Marketing": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "Sem notebook dedicado"}, + "Blogging": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "Sem notebook dedicado"}, + "Mentor: Seth Godin": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"}, + "Mentor: Russel Brunson": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"}, + "Mentor: Gary Vee": {"notebook_id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "notebook_title": "Copywriting e Persuasao"}, + "Mentor: Alex Vargas": {"notebook_id": "4c595973-ba10-420a-a3bf-e4389e424ad3", "notebook_title": "Marketing Digital PT"}, + "Mentor: Natanael Oliveira": {"notebook_id": "4c595973-ba10-420a-a3bf-e4389e424ad3", "notebook_title": "Marketing Digital PT"}, + "Mentor: Ricardo Piovan": {"notebook_id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "notebook_title": "Gestao de Projectos e Agile"}, + "Claude Code": {"notebook_id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", "notebook_title": "Claude Code"}, + "MCP Servers": {"notebook_id": "73102308-70ef-403e-9be9-eae0cfc62d55", "notebook_title": "Desenvolvimento de MCPs"}, + "VS Code": {"notebook_id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53", "notebook_title": "AI Code Editors"}, + "Windsurf": {"notebook_id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53", "notebook_title": "AI Code Editors"}, + "Claude Computer Use": {"notebook_id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53", "notebook_title": "AI Code Editors"}, + "Desenvolvimento de Software": {"notebook_id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "notebook_title": "Programacao"}, + "Obsidian + Claude Code": {"notebook_id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131", "notebook_title": "Obsidian + Claude"}, + "WordPress": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"}, + "Elementor": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"}, + "Crocoblock": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"}, + "Desenvolvimento de WebSites": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"}, + "CWP Centos Web Panel": {"notebook_id": "0ded7bd6-69b3-4c76-b327-452396bf7ea7", "notebook_title": "CWP"}, + "TI (Tecnologia da Informação)": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"}, + "TI": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"}, + "Linux": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"}, + "AWS (Amazon Web Services)": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"}, + "AWS": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"}, + "Gestao": {"notebook_id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "notebook_title": "Gestao de Projectos e Agile"}, + "Gestao de Projetos": {"notebook_id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "notebook_title": "Gestao de Projectos e Agile"}, + "Gestao de Processos": {"notebook_id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", "notebook_title": "Gestao de Operacoes"}, + "Estrategia": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"}, + "Estratégia": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"}, + "Produtividade": {"notebook_id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131", "notebook_title": "Obsidian + Claude"}, + "Escrever PT-PT": {"notebook_id": null, "notebook_title": null, "note": "Sem equivalente NotebookLM - usar apenas Dify"}, + "n8n": {"notebook_id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", "notebook_title": "n8n"}, + "Dify": {"notebook_id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "notebook_title": "AI Automation Stack"}, + "Flowise": {"notebook_id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "notebook_title": "AI Automation Stack", "note": "Coberto parcialmente"}, + "Open WebUI": {"notebook_id": "be6f72ac-f8ba-4337-912d-abd5dd448519", "notebook_title": "Open WebUI"}, + "Ferramentas de Automação e IA": {"notebook_id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "notebook_title": "Transformacao Digital e IA"}, + "Ferramentas Automacao e IA": {"notebook_id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "notebook_title": "Transformacao Digital e IA"}, + "PerfexCRM": {"notebook_id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "notebook_title": "Perfex CRM: Gestao de Clientes e Projetos"}, + "Servicos Descomplicar": {"notebook_id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "notebook_title": "Descomplicar: Marketing Digital"}, + "e-commerce": {"notebook_id": "226e384e-d4bc-48f4-bb82-7927360436cc", "notebook_title": "E-commerce Pratico"}, + "Empreendedorismo": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"}, + "Agencia Digital": {"notebook_id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", "notebook_title": "Gestao de Operacoes"}, + "Estrategia Descomplicar": {"notebook_id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "notebook_title": "Descomplicar: Marketing Digital"}, + "Aceleracao Digital": {"notebook_id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "notebook_title": "Transformacao Digital e IA"}, + "UX e Usabilidade": {"notebook_id": "081ca512-8279-4850-b2b9-dff090267482", "notebook_title": "UI/UX Design"}, + "Criatividade": {"notebook_id": "081ca512-8279-4850-b2b9-dff090267482", "notebook_title": "UI/UX Design", "note": "Sem notebook dedicado"} + } +} diff --git a/core-tools/skills/agent-context-injector/SKILL.md b/core-tools/skills/agent-context-injector/SKILL.md new file mode 100644 index 0000000..2c41908 --- /dev/null +++ b/core-tools/skills/agent-context-injector/SKILL.md @@ -0,0 +1,154 @@ +--- +name: agent-context-injector +description: > + Injecção dinâmica de contexto específico para cada agente. + Use when "contexto agente", "injectar", "SubagentStart", + "recursos agente", "mcps disponíveis", "skills relevantes". +author: Descomplicar® +version: 1.0.0 +desk_task: 1441 +allowed-tools: Read, Glob, Grep, ToolSearch +--- + +# Agent Context Injector + +Injecção dinâmica de contexto específico para cada agente. + +## Triggers + +Esta skill é activada automaticamente via hook `SubagentStart` quando: +- Um subagente é iniciado via Task tool +- Contexto precisa ser enriquecido com recursos do agente + +## Capabilities + +### 1. Context Building +- Consultar mapeamento agente → recursos na BD +- Gerar lista de MCPs disponíveis para o agente +- Gerar lista de skills relevantes +- Incluir datasets Dify para consulta automática + +### 2. Token Optimization +- Calcular tokens do contexto gerado +- Priorizar recursos por relevância +- Truncar se exceder limite (~800 tokens) +- Cache de contextos frequentes + +### 3. Dynamic Injection +- Adicionar contexto ao prompt do agente +- Incluir instruções de uso dos recursos +- Configurar auto-consult para datasets + +## Template de Contexto + +```markdown +## Recursos Disponíveis + +### MCPs Activos +$MCP_LIST +- Usar proactivamente para operações relevantes + +### Skills Recomendadas +$SKILLS_LIST +- Invocar quando tarefa corresponder + +### Knowledge Base (Dify) +$DATASETS_LIST +- AUTO-CONSULT: Consultar ANTES de responder +- Query template: "$QUERY_TEMPLATE" + +### Plugins +$PLUGINS_LIST +- Comandos disponíveis: $PLUGIN_COMMANDS +``` + +## Workflow + +``` +SUBAGENT START → QUERY BD → BUILD CONTEXT → INJECT → EXECUTE +``` + +1. **Hook SubagentStart** dispara +2. **Identificar agente** pelo `subagent_type` +3. **Query MySQL**: + ```sql + SELECT r.resource_type, r.resource_id, r.priority + FROM cr_agent_resources r + JOIN cr_agents a ON r.agent_id = a.id + WHERE a.slug = '{agent_slug}' + AND r.auto_inject = TRUE + ORDER BY r.priority ASC; + ``` +4. **Consultar agent-knowledge-config.json** para datasets +5. **Gerar contexto** com template +6. **Calcular tokens** e optimizar se necessário +7. **Injectar** no prompt do agente + +## Métricas Target + +| Métrica | Target | +|---------|--------| +| Tempo de injecção | < 2s | +| Tokens médios | ~772 | +| Cache hit rate | > 60% | +| Erro rate | < 1% | + +## Exemplo de Output + +Para `wordpress-plugin-developer`: + +```markdown +## Recursos Disponíveis + +### MCPs Activos +- `cwp` - Gestão servidor CentOS WebPanel +- `ssh-unified` - Acesso SSH a servidores +- `filesystem` - Operações de ficheiros + +### Skills Recomendadas +- `/wp-dev` - Desenvolvimento WordPress +- `/wp-performance` - Optimização performance +- `/elementor` - Desenvolvimento Elementor + +### Knowledge Base (Dify) +- `wordpress-development` - Docs WP, hooks, filters +- `woocommerce-api` - API WooCommerce +- AUTO-CONSULT: Consultar ANTES de implementar + +### Plugins +- `superpowers` - TDD obrigatório +- `code-review` - Review automático +``` + +## Configuração + +Ficheiro `agent-knowledge-config.json`: +```json +{ + "wordpress-plugin-developer": { + "datasets": ["wordpress-development", "woocommerce-api"], + "auto_consult": true, + "query_template": "WordPress {topic} best practices 2026", + "priority_datasets": ["wordpress-development"] + } +} +``` + +## Integração com Scripts Existentes + +Este skill complementa (não substitui) os scripts Python existentes: +- `inject-mcp-context.py` - Continua activo +- `inject-skills-context.py` - Continua activo + +A skill adiciona: +- Datasets Dify dinâmicos +- Plugins activos +- Contexto mais rico e actualizado + +## Limites + +- Máximo ~800 tokens de contexto injectado (para preservar espaço) +- Não modifica comportamento do agente, apenas enriquece contexto +- Depende de mapeamentos correctos em `cr_agent_resources` +- Cache de 5 minutos pode mostrar dados desactualizados +- Não funciona para agentes não registados na BD diff --git a/core-tools/skills/component-generator/SKILL.md b/core-tools/skills/component-generator/SKILL.md new file mode 100644 index 0000000..0e44b66 --- /dev/null +++ b/core-tools/skills/component-generator/SKILL.md @@ -0,0 +1,290 @@ +--- +name: component-generator +description: > + Gera componentes Claude Code seguindo templates Descomplicar®. + Use when "criar skill", "criar agent", "novo componente", + "gerar template", "scaffolding", "criar command". +author: Descomplicar® +version: 1.0.0 +desk_task: 1441 +allowed-tools: Read, Write, Edit, Glob, ToolSearch +--- + +# Component Generator + +Skill para criar componentes de alta qualidade automaticamente, fechando o ciclo CRIAR → VALIDAR → REGISTAR. + +## Triggers + +Esta skill deve ser activada quando: +- Utilizador pede para criar nova skill +- Utilizador pede para criar novo agent +- Utilizador pede para criar novo command +- Necessidade de scaffold de componente identificada +- Comando `/descomplicar:create` é invocado + +## Capabilities + +### 1. Scaffold Skill + +Cria estrutura completa de skill com frontmatter obrigatório. + +**Comando:** +``` +/descomplicar:create skill +``` + +**Template Gerado:** +```markdown +--- +name: +description: > + [Capability]. Use when "[trigger1]", "[trigger2]", + "[keyword1]", "[keyword2]", "[keyword3]". +author: Descomplicar® +version: 1.0.0 +desk_task: XXXX +allowed-tools: Read, Glob, Grep +--- + +# + +[Descrição da skill] + +## Triggers + +Esta skill deve ser activada quando: +- [Trigger 1] +- [Trigger 2] + +## Capabilities + +### 1. [Capability 1] +[Descrição] + +### 2. [Capability 2] +[Descrição] + +## Workflow + +``` +[PASSO1] → [PASSO2] → [PASSO3] → [PASSO4] +``` + +## Exemplo de Uso + +``` +User: [Exemplo de input] +Assistant: [Exemplo de output] +``` + +## Limites + +- [Quando NÃO usar] +- [Escopo máximo] +``` + +**Acções Automáticas:** +1. Criar directório `skills//` +2. Gerar `SKILL.md` com template +3. Registar em `cr_skills` (MySQL) +4. Criar tarefa Desk CRM (se desk_task fornecido) + +### 2. Scaffold Agent + +Cria ficheiro de agente com mapeamento de MCPs por categoria. + +**Comando:** +``` +/descomplicar:create agent [--category dev|business|marketing|infra] +``` + +**Template Gerado:** +```markdown +--- +name: +description: > + [Descrição]. Use for [uso1], [uso2], [uso3]. +model: sonnet +tools: Read, Glob, Grep, ToolSearch +allowed-mcps: [MCPs baseados na categoria] +category: +author: Descomplicar® +version: 1.0.0 +desk_task: XXXX +--- + +# + +[Descrição do agente] + +## Quando Usar + +USAR PROATIVAMENTE para: +- [Caso de uso 1] +- [Caso de uso 2] + +## Capabilities + +### [Capability 1] +- [Detalhe] + +## Tools Disponíveis + +| Tool | Uso | +|------|-----| +| [tool] | [descrição] | + +## Workflow Típico + +``` +1. [Passo 1] +2. [Passo 2] +3. [Passo 3] +4. [Passo 4] +``` + +## Colaborações + +- [Agente relacionado 1] +- [Agente relacionado 2] + +## Limites + +- [Limite 1] +- [Limite 2] +``` + +**MCPs por Categoria:** +| Categoria | MCPs Primary | MCPs Recommended | +|-----------|--------------|------------------| +| dev | gitea, filesystem | ssh-unified, desk-crm-v3 | +| business | desk-crm-v3, moloni | google-workspace | +| marketing | google-workspace, tavily | desk-crm-v3 | +| infra | ssh-unified, cwp | filesystem, gitea | + +**Acções Automáticas:** +1. Criar `agents/.md` +2. Registar em `cr_agents` (MySQL) +3. Criar mapeamentos em `cr_agent_mcps` +4. Sugerir colaborações em `cr_agent_collaborations` +5. Criar tarefa Desk CRM + +### 3. Scaffold Command + +Cria ficheiro de comando com namespace e arguments. + +**Comando:** +``` +/descomplicar:create command +``` + +**Template Gerado:** +```markdown +--- +name: +description: > + [Descrição do comando]. [O que faz]. +argument-hint: "[argumentos opcionais]" +--- + +# /descomplicar: + +[Descrição detalhada] + +## Objectivo + +[O que este comando faz] + +## Sintaxe + +``` +/descomplicar: [action] [args] +``` + +## Acções Disponíveis + +### 1. [Acção 1] + +``` +/descomplicar: [action1] +``` + +[Descrição] + +## Output Esperado + +``` +╔═══════════════════════════════════════════╗ +║ [OUTPUT VISUAL] ║ +╚═══════════════════════════════════════════╝ +``` +``` + +**Acções Automáticas:** +1. Criar `commands/.md` +2. Actualizar `plugin.json` com novo command + +### 4. Registar em MySQL + +```sql +-- Para Skills +INSERT INTO cr_skills (slug, name, category, status, desk_task, created_at) +VALUES (?, ?, ?, 'active', ?, NOW()); + +-- Para Agents +INSERT INTO cr_agents (slug, name, category, status, desk_task, created_at) +VALUES (?, ?, ?, 'active', ?, NOW()); +``` + +### 5. Criar Tarefa Desk CRM + +```sql +INSERT INTO tbltasks (name, description, rel_type, rel_id, milestone, status, dateadded, startdate, addedfrom) +VALUES ( + ': ', + '

Propósito

...

Estado

Em desenvolvimento

', + 'project', 65, -- Stack Workflow + ?, -- Milestone apropriado + 1, NOW(), CURDATE(), 1 +); +``` + +## Workflow Completo + +``` +CREATE → VALIDATE → REGISTER → DESK TASK → READY + ↓ ↓ ↓ ↓ +Template Score≥70 MySQL Tracking +``` + +## Validação Automática + +Após criação, invoca `quality-validator` para garantir score >= 70: +- Se score < 70: ALERTA + sugestões de melhoria +- Se score >= 70: componente activado + +## Exemplo de Uso + +``` +User: Cria uma nova skill para gestão de backups + +Component Generator: +1. [Cria directório skills/backup-manager/] +2. [Gera SKILL.md com template Descomplicar®] +3. [Valida: score 65/100 - Draft] +4. [Regista em cr_skills (id: 55)] +5. [Cria tarefa Desk #1503] +6. Resposta: "Skill backup-manager criada com sucesso! + - Path: skills/backup-manager/SKILL.md + - Score: 65/100 (Draft) + - Próximo passo: Editar e correr /descomplicar:validate" +``` + +## Limites + +- Apenas cria estrutura base - conteúdo deve ser desenvolvido +- Score inicial tipicamente 50-70 (Draft) +- Não cria componentes duplicados (verifica slug existente) +- Requer conexão MySQL para registo em cr_* +- Não modifica componentes existentes (usar Edit tool) \ No newline at end of file diff --git a/core-tools/skills/db-maintenance-manager/SKILL.md b/core-tools/skills/db-maintenance-manager/SKILL.md new file mode 100644 index 0000000..d419e45 --- /dev/null +++ b/core-tools/skills/db-maintenance-manager/SKILL.md @@ -0,0 +1,267 @@ +--- +name: db-maintenance-manager +description: > + Manutenção automatizada das tabelas cr_* da infraestrutura Claude Code. + Use when "manutenção BD", "limpeza órfãos", "migração schema", + "backup tabelas", "archiving", "optimização BD", "database maintenance". +author: Descomplicar® +version: 1.0.0 +desk_task: 1441 +allowed-tools: Read, Glob, Grep, ToolSearch +--- + +# DB Maintenance Manager + +Gestão e manutenção automatizada das tabelas cr_* (Claude Resources) na base de dados Desk CRM. + +## Triggers + +Esta skill deve ser activada quando: +- Utilizador menciona "manutenção BD", "database maintenance" +- Detectados órfãos nas tabelas de relacionamento +- Telemetria antiga (>90 dias) a ocupar espaço +- Necessidade de migração de schema +- Backup/restore de componentes + +## Schema das Tabelas cr_* + +### Core Tables (Entidades) + +| Tabela | Descrição | Manutenção | +|--------|-----------|------------| +| `cr_agents` | Agentes especializados | Sync, Backup | +| `cr_skills` | Skills invocáveis | Sync, Backup | +| `cr_mcps` | Servidores MCP | Sync, Backup | +| `cr_lsps` | Language Server Protocols | Sync, Backup | +| `cr_plugins` | Software Development Kits | Sync, Backup | +| `cr_mcp_tools` | Ferramentas por MCP | Sync | +| `cr_plugins` | Plugins instalados | Sync, Backup | +| `cr_hooks` | Hooks configurados | Sync, Backup | + +### Relationship Tables (Limpeza de Órfãos) + +| Tabela | FK Agent | FK Resource | Cleanup Priority | +|--------|----------|-------------|------------------| +| `cr_agent_mcps` | agent_id → cr_agents | mcp_id → cr_mcps | Alta | +| `cr_agent_lsps` | agent_id → cr_agents | lsp_id → cr_lsps | Alta | +| `cr_plugin_agents` | sdk_id → cr_plugins | agent_id → cr_agents | Média | +| `cr_plugin_skills` | sdk_id → cr_plugins | skill_id → cr_skills | Média | +| `cr_plugin_mcps` | sdk_id → cr_plugins | mcp_id → cr_mcps | Média | +| `cr_agent_skills` | agent_id → cr_agents | skill_id → cr_skills | Alta | +| `cr_skill_mcps` | skill_id → cr_skills | mcp_id → cr_mcps | Alta | +| `cr_agent_collaborations` | agent_id → cr_agents | collaborator_id → cr_agents | Média | + +### Telemetry Tables (Archiving) + +| Tabela | Retenção Activa | Archive After | +|--------|-----------------|---------------| +| `cr_agent_usage` | 90 dias | cr_agent_usage_archive | +| `cr_skill_usage` | 90 dias | cr_skill_usage_archive | +| `cr_mcp_tool_usage` | 90 dias | cr_mcp_tool_usage_archive | +| `cr_lsp_usage` | 90 dias | cr_lsp_usage_archive | + +## Capabilities + +### 1. Cleanup de Órfãos + +Detecta e remove referências inválidas nas tabelas de relacionamento. + +**Detecção:** +```sql +-- Órfãos em cr_agent_mcps +SELECT am.id, am.agent_id, am.mcp_id +FROM cr_agent_mcps am +LEFT JOIN cr_agents a ON am.agent_id = a.id +LEFT JOIN cr_mcps m ON am.mcp_id = m.id +WHERE a.id IS NULL OR m.id IS NULL; +``` + +**Limpeza (com confirmação):** +```sql +-- Backup antes de limpar +CREATE TABLE cr_agent_mcps_orphans_backup_YYYYMMDD AS +SELECT * FROM cr_agent_mcps am +WHERE agent_id NOT IN (SELECT id FROM cr_agents) + OR mcp_id NOT IN (SELECT id FROM cr_mcps); + +-- Limpar órfãos +DELETE FROM cr_agent_mcps +WHERE agent_id NOT IN (SELECT id FROM cr_agents) + OR mcp_id NOT IN (SELECT id FROM cr_mcps); +``` + +### 2. Migração de Schema + +Gestão de alterações estruturais nas tabelas cr_*. + +**Estrutura de Migrations:** +``` +migrations/ +├── 001_initial_schema.sql +├── 002_add_lsp_tables.sql +├── 003_add_telemetry.sql +├── 004_add_archive_tables.sql +└── migrations_log.sql +``` + +**Tabela de Controlo:** +```sql +CREATE TABLE IF NOT EXISTS cr_migrations ( + id INT AUTO_INCREMENT PRIMARY KEY, + migration_name VARCHAR(100) NOT NULL, + applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + checksum VARCHAR(64), + status ENUM('applied', 'rolled_back', 'failed') DEFAULT 'applied' +); +``` + +### 3. Backup Selectivo + +Backup apenas das tabelas cr_* (não toda a BD Desk). + +**Tabelas a incluir:** +```sql +-- Lista de tabelas para backup +SELECT table_name +FROM information_schema.tables +WHERE table_schema = DATABASE() + AND table_name LIKE 'cr_%'; +``` + +**Formato de Backup:** +``` +backups/ +└── cr_backup_YYYYMMDD_HHMMSS/ + ├── manifest.json + ├── cr_agents.sql + ├── cr_skills.sql + ├── cr_mcps.sql + └── ... (todas as tabelas cr_*) +``` + +### 4. Archiving de Telemetria + +Move dados antigos para tabelas de arquivo. + +**Processo:** +```sql +-- 1. Criar tabela archive se não existir +CREATE TABLE IF NOT EXISTS cr_agent_usage_archive LIKE cr_agent_usage; + +-- 2. Mover dados > 90 dias +INSERT INTO cr_agent_usage_archive +SELECT * FROM cr_agent_usage +WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY); + +-- 3. Limpar tabela principal +DELETE FROM cr_agent_usage +WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY); + +-- 4. Registar operação +INSERT INTO cr_maintenance_log (operation, table_name, rows_affected, executed_at) +VALUES ('archive', 'cr_agent_usage', ROW_COUNT(), NOW()); +``` + +### 5. Optimização + +Manutenção de performance das tabelas. + +```sql +-- Optimizar tabelas fragmentadas +OPTIMIZE TABLE cr_agent_usage, cr_skill_usage, cr_mcp_tool_usage; + +-- Analisar estatísticas +ANALYZE TABLE cr_agents, cr_skills, cr_mcps, cr_agent_mcps; + +-- Verificar índices em falta +SELECT DISTINCT table_name, column_name +FROM information_schema.columns c +WHERE table_schema = DATABASE() + AND table_name LIKE 'cr_%' + AND column_name LIKE '%_id' + AND NOT EXISTS ( + SELECT 1 FROM information_schema.statistics s + WHERE s.table_schema = c.table_schema + AND s.table_name = c.table_name + AND s.column_name = c.column_name + ); +``` + +## Workflow + +``` +ANALISAR → BACKUP → EXECUTAR → VALIDAR → REPORTAR +``` + +1. **ANALISAR**: Identificar necessidades de manutenção +2. **BACKUP**: Criar backup antes de operações destrutivas +3. **EXECUTAR**: Correr operação com transação +4. **VALIDAR**: Verificar integridade pós-operação +5. **REPORTAR**: Registar em cr_maintenance_log + +## Integrações + +- **MCP**: desk-crm-v3 (operações MySQL) +- **Commands**: + - `/descomplicar:db-cleanup` - Limpeza de órfãos + - `/descomplicar:db-migrate` - Migração de schema + - `/descomplicar:db-backup` - Backup selectivo + - `/descomplicar:db-archive` - Archiving telemetria +- **Skills**: infrastructure-manager (detecção), quality-validator (validação) + +## Métricas de Sucesso + +| Métrica | Target | +|---------|--------| +| Órfãos | 0 | +| Telemetria activa | < 90 dias | +| Backup age | < 7 dias | +| Migrations pendentes | 0 | + +## Exemplo de Uso + +``` +User: A BD tem dados antigos e órfãos. Limpa tudo. + +DB Maintenance Manager: +1. [Analisa estado actual] + - Órfãos: 12 em cr_agent_mcps, 3 em cr_skill_mcps + - Telemetria: 45.000 registos > 90 dias + - Último backup: há 15 dias + +2. [Cria backup preventivo] + ✓ Backup criado: cr_backup_20260204_163000/ + +3. [Executa limpeza órfãos] + ✓ cr_agent_mcps: 12 órfãos removidos + ✓ cr_skill_mcps: 3 órfãos removidos + +4. [Executa archiving] + ✓ cr_agent_usage: 15.000 → archive + ✓ cr_skill_usage: 20.000 → archive + ✓ cr_mcp_tool_usage: 10.000 → archive + +5. [Valida resultado] + ✓ Integridade OK + ✓ 0 órfãos + ✓ Telemetria < 90 dias + +Resultado: +╔════════════════════════════════════════╗ +║ DB MAINTENANCE COMPLETE ║ +╠════════════════════════════════════════╣ +║ Órfãos removidos: 15 ║ +║ Registos arquivados: 45.000 ║ +║ Espaço libertado: ~12 MB ║ +║ Backup: ✓ Criado ║ +╚════════════════════════════════════════╝ +``` + +## Limites + +- Não executa operações destrutivas sem backup prévio +- Archiving mantém dados (move, não apaga) +- Migrations requerem aprovação manual +- Backup não inclui tabelas não-cr_* +- Optimização pode demorar em tabelas grandes (>1M registos) +- Não substitui backups gerais do Desk CRM diff --git a/core-tools/skills/infrastructure-manager/SKILL.md b/core-tools/skills/infrastructure-manager/SKILL.md new file mode 100644 index 0000000..4c356fe --- /dev/null +++ b/core-tools/skills/infrastructure-manager/SKILL.md @@ -0,0 +1,211 @@ +--- +name: infrastructure-manager +description: > + Gestão automatizada da infraestrutura Claude Code Descomplicar. + Use when "infraestrutura", "sistema", "componentes", "health", + "sincronização", "relacionamentos", "mcps", "skills", "agents". +author: Descomplicar® +version: 1.0.0 +desk_task: 1441 +allowed-tools: Read, Glob, Grep, ToolSearch +--- + +# Infrastructure Manager + +Gestão automatizada da infraestrutura Claude Code Descomplicar com suporte completo a relacionamentos. + +## Triggers + +Esta skill deve ser activada quando: +- Utilizador menciona "infraestrutura", "sistema", "componentes" +- Há problemas de sincronização detectados +- Health score cai abaixo de 90 +- Novo componente é adicionado ao sistema +- Relacionamentos inconsistentes detectados + +## Schema da Base de Dados + +### Core Tables (Entidades) + +| Tabela | Registos | Descrição | +|--------|----------|-----------| +| `cr_agents` | 46 | Agentes especializados | +| `cr_skills` | 54 | Skills invocáveis | +| `cr_mcps` | 33 | Servidores MCP | +| `cr_lsps` | 11+ | Language Server Protocols | +| `cr_plugins` | 29 | Software Development Kits | +| `cr_mcp_tools` | 822 | Ferramentas por MCP | +| `cr_plugins` | 5+ | Plugins instalados | +| `cr_hooks` | 6+ | Hooks configurados | + +### Relationship Tables (800+ relacionamentos) + +| Tabela | Registos | Relacionamento | +|--------|----------|----------------| +| `cr_agent_mcps` | 483 | Agente ↔ MCP (primary/recommended/available) | +| `cr_agent_lsps` | ~40 | Agente ↔ LSP (primary/recommended/available) | +| `cr_plugin_agents` | 131 | TaskForce ↔ Agente | +| `cr_plugin_skills` | 75 | TaskForce ↔ Skill | +| `cr_plugin_mcps` | 56 | TaskForce ↔ MCP | +| `cr_agent_skills` | ~50 | Agente ↔ Skill | +| `cr_skill_mcps` | ~45 | Skill ↔ MCP | +| `cr_agent_collaborations` | ~30 | Agente ↔ Agente | + +### Telemetry Tables + +| Tabela | Descrição | +|--------|-----------| +| `cr_agent_usage` | Tracking uso de agentes | +| `cr_skill_usage` | Tracking uso de skills | +| `cr_mcp_tool_usage` | Tracking uso de ferramentas MCP | +| `cr_lsp_usage` | Tracking uso de LSPs | + +### Intelligence Tables + +| Tabela | Registos | Descrição | +|--------|----------|-----------| +| `cr_decision_trees` | 5 | Árvores de decisão para selecção de agentes | +| `cr_recommendations` | 3 | Sugestões de melhorias | +| `cr_component_issues` | 2 | Issues abertos | +| `cr_reflections` | 1 | Reflexões do sistema | + +## Capabilities + +### 1. Monitorização Completa + +**Entidades:** +```sql +SELECT + 'agents' as type, COUNT(*) as total, + SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) as active +FROM cr_agents +UNION ALL +SELECT 'skills', COUNT(*), SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) FROM cr_skills +UNION ALL +SELECT 'mcps', COUNT(*), SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) FROM cr_mcps +UNION ALL +SELECT 'sdks', COUNT(*), SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) FROM cr_plugins; +``` + +**Relacionamentos:** +```sql +SELECT 'agent_mcps' as table_name, COUNT(*) as count FROM cr_agent_mcps +UNION ALL SELECT 'agent_lsps', COUNT(*) FROM cr_agent_lsps +UNION ALL SELECT 'sdk_agents', COUNT(*) FROM cr_plugin_agents +UNION ALL SELECT 'sdk_skills', COUNT(*) FROM cr_plugin_skills +UNION ALL SELECT 'sdk_mcps', COUNT(*) FROM cr_plugin_mcps +UNION ALL SELECT 'agent_skills', COUNT(*) FROM cr_agent_skills +UNION ALL SELECT 'skill_mcps', COUNT(*) FROM cr_skill_mcps +UNION ALL SELECT 'agent_collaborations', COUNT(*) FROM cr_agent_collaborations; +``` + +**Órfãos (inconsistências):** +```sql +-- Agent_mcps com agentes inexistentes +SELECT COUNT(*) FROM cr_agent_mcps am +LEFT JOIN cr_agents a ON am.agent_id = a.id +WHERE a.id IS NULL; + +-- Repetir para todas as tabelas de relacionamento +``` + +### 2. Auto-Repair de Relacionamentos + +Quando detectados órfãos: +```sql +-- Limpar referências inválidas +DELETE FROM cr_agent_mcps WHERE agent_id NOT IN (SELECT id FROM cr_agents); +DELETE FROM cr_agent_mcps WHERE mcp_id NOT IN (SELECT id FROM cr_mcps); +DELETE FROM cr_plugin_agents WHERE sdk_id NOT IN (SELECT id FROM cr_plugins); +DELETE FROM cr_plugin_agents WHERE agent_id NOT IN (SELECT id FROM cr_agents); +-- ... repetir para outras tabelas +``` + +### 3. Health Score Calculation + +``` +Health Score = ( + entities_sync * 20 + + relationships_consistent * 20 + + mcps_responsive * 15 + + hooks_healthy * 15 + + decision_trees_valid * 10 + + telemetry_active * 10 + + plugins_functional * 10 +) / 100 +``` + +**Thresholds:** +- >= 90: Excelente (verde) +- 70-89: Bom (amarelo) +- < 70: Crítico (vermelho) + +### 4. Reporting Detalhado + +Dashboard completo incluindo: +- Contagem de entidades +- Contagem de relacionamentos +- Órfãos detectados +- Telemetria (30 dias) +- Decision trees status +- Recommendations pendentes + +## Workflow + +``` +DETECTAR → DIAGNOSTICAR → REPARAR → VALIDAR → REPORTAR +``` + +1. **DETECTAR**: Query todas as tabelas +2. **DIAGNOSTICAR**: Identificar inconsistências +3. **REPARAR**: Limpar órfãos, actualizar telemetria +4. **VALIDAR**: Re-verificar consistência +5. **REPORTAR**: Gerar dashboard com métricas + +## Integrações + +- **MCPs**: desk-crm-v3, filesystem, mcp-time +- **Commands**: + - `/descomplicar:status` - Dashboard completo + - `/descomplicar:sync` - Sincronização + - `/descomplicar:relationships` - Gestão relacionamentos + - `/descomplicar:telemetry` - Métricas de uso + - `/descomplicar:decision-trees` - Gestão decision trees + - `/descomplicar:lsps` - Gestão Language Server Protocols + +## Métricas de Sucesso + +| Métrica | Target | +|---------|--------| +| Health Score | >= 90 | +| Órfãos | 0 | +| Sync latency | < 5s | +| Telemetry coverage | 100% | + +## Exemplo de Uso + +``` +User: Qual o estado da infraestrutura? + +Infrastructure Manager: +1. [Verifica data/hora: 2026-02-04 16:00] +2. [Query entidades: 46 agents, 54 skills, 33 MCPs] +3. [Query relacionamentos: 800+ total, 0 órfãos] +4. [Calcula Health Score: 95/100] +5. Resposta: + "Health Score: 95/100 ████████████████████░ EXCELENTE + + Core: 46 agents ✓ | 54 skills ✓ | 33 MCPs ✓ + Relacionamentos: 800+ (0 órfãos) ✓ + Última sync: há 2h + + Alerta menor: MCP 'moloni' com latência 2.1s" +``` + +## Limites + +- Health Score é indicativo, não absoluto +- Sync pode demorar > 5s em bases de dados grandes +- Detecção de órfãos limitada a tabelas cr_* conhecidas +- Não corrige problemas automaticamente (apenas reporta) +- Telemetria depende de hooks activos e funcionais diff --git a/core-tools/skills/metrics/SKILL.md b/core-tools/skills/metrics/SKILL.md new file mode 100644 index 0000000..0b6ad37 --- /dev/null +++ b/core-tools/skills/metrics/SKILL.md @@ -0,0 +1,591 @@ +--- +name: metrics +description: > + Performance metrics dashboard for skills and agents with quantitative telemetry. Automatic tracking, temporal trending, degradation alerts, Dify KB impact analysis and ROI calculation per client/project. + Use when analyzing performance, tracking improvements, validating PDCA cycles, calculating ROI, or when user mentions + "metrics", "performance", "dashboard", "analytics", "trending", "degradation", "baseline", "improvement", "roi calculation". +author: Descomplicar® Crescimento Digital +version: 1.3.0 +user_invocable: true +tags: [metrics, pdca, performance, dashboard, dify-kb, analytics, roi] +desk_project: 65 +desk_task: 1637 +allowed-tools: mcp__desk-crm-v3__get_skill_metrics, mcp__desk-crm-v3__log_skill_metric, Read +category: infra +quality_score: 85 +updated: "2026-02-04T18:00:00Z" +--- + +# SKILL: Performance Metrics Dashboard + +**Trigger:** `/metrics` + +--- + +## Propósito + +Dashboard interactivo de performance de skills e agents com métricas quantitativas automáticas gravadas em Desk DB. + +**Complementa:** +- `/reflect` (qualitativo) com dados quantitativos +- `/worklog` com métricas objectivas +- PDCA com decisões data-driven + +--- + +## Quando Usar + +- Ver performance de skills/agents +- Identificar degradações de performance +- Validar melhorias PDCA +- Análise ROI de optimizações +- Dashboard executivo de automação + +--- + +## Capabilities + +### Tipos de Análise + +| Comando | Função | +|---------|--------| +| `/metrics` | Overview geral (30 dias) | +| `/metrics ` | Detalhes de skill específica | +| `/metrics --project ` | Métricas por projecto | +| `/metrics --trend` | Trending temporal | +| `/metrics --compare` | Comparação vs baseline | +| `/metrics --kb` | **NOVO v1.2** Métricas Dify KB | +| `/metrics --roi` | **NOVO v1.2** ROI por cliente/projecto | +| `/metrics --export` | **NOVO v1.2** Exportar JSON/CSV | +| `/metrics --alerts` | **NOVO v1.2** Listar alertas activos | + +### Agregações Disponíveis + +1. **avg** - Médias de performance (padrão) +2. **count** - Contagens por status +3. **trend** - Evolução temporal (semanal) +4. **compare** - Comparação com baseline +5. **detailed** - Listagem detalhada + +--- + +## Execução + +### 1. Verificar Tools MCP Disponíveis + +```javascript +// Tools necessários (MCP desk-crm-v3) +const REQUIRED_TOOLS = [ + 'mcp__desk-crm-v3__log_skill_metric', + 'mcp__desk-crm-v3__get_skill_metrics' +]; + +// Se tools não disponíveis → query SQL directa como fallback +``` + +### 2. Query Métricas (Via MCP ou SQL) + +**Opção A: Via MCP (preferencial)** + +```javascript +const metrics = await mcp__desk_crm_v3__get_skill_metrics({ + days: 30, + aggregate: 'avg', + limit: 10 +}); +``` + +**Opção B: Fallback SQL Directo** + +```sql +-- Via MCP desk-crm-v3 SQL directo se tools metrics não disponíveis +SELECT + name, + type, + COUNT(*) as executions, + AVG(duration_ms) as avg_ms, + (SUM(CASE WHEN status='error' THEN 1 ELSE 0 END) / COUNT(*) * 100) as error_rate +FROM tblskill_agent_metrics +WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY) +GROUP BY name, type +ORDER BY executions DESC +LIMIT 10; +``` + +### 3. Formatar Output + +**Template Dashboard:** + +``` +📊 Performance Overview (últimos {days} dias) + +Top Skills/Agents: +┌─────────────────────┬────────┬──────────┬────────┬────────┐ +│ Nome │ Usos │ Avg Time │ Trend │ Status │ +├─────────────────────┼────────┼──────────┼────────┼────────┤ +│ /orcamento │ 45 │ 18min │ -12% ✓ │ ✅ │ +│ /lead-approach │ 38 │ 22min │ +5% ⚠ │ ⚠️ │ +│ wp-plugin-developer │ 32 │ 47min │ -8% ✓ │ ✅ │ +└─────────────────────┴────────┴──────────┴────────┴────────┘ + +⚠️ Alertas de Degradação: +{se houver degradação >15%} + +🎯 Dify KB Impact: +- Coverage: {skills_com_dify}/{total_skills} ({pct}%) +- Avg time reduction: {reducao_tempo}% +- Cache hit rate: {cache_hit_rate}% + +📈 Dashboard completo: https://plan-eal.descomplicar.pt/metrics +``` + +### 4. Análise Específica + +Se utilizador pedir skill específica: + +```javascript +const details = await get_skill_metrics({ + name: skill_name, + days: 30, + aggregate: 'detailed' +}); + +// Calcular estatísticas +const baseline = await query("SELECT baseline_duration_ms FROM tblskill_agent_baselines WHERE name = ?", [skill_name]); +const improvement = ((baseline - current_avg) / baseline * 100); +``` + +**Output Detalhado:** + +``` +📊 {skill_name} - Análise Detalhada + +Performance (30 dias): +- Execuções: {count} +- Tempo médio: {avg_ms}ms ({format_time}) +- Baseline: {baseline_ms}ms +- Melhoria: {improvement}% {icon} +- Error rate: {error_rate}% +- Success rate: {success_rate}% + +Dify KB: +- Consultas: {kb_consulted_count}/{total} ({pct}%) +- Com KB: {avg_with_kb}ms +- Sem KB: {avg_without_kb}ms +- Cache hit: {cache_hit_rate}% + +Trending (últimas 4 semanas): +Semana 1: {w1_avg}ms ({w1_count} usos) +Semana 2: {w2_avg}ms ({w2_count} usos) +Semana 3: {w3_avg}ms ({w3_count} usos) +Semana 4: {w4_avg}ms ({w4_count} usos) {trend_icon} + +Últimas 5 execuções: +1. {timestamp} - {duration}ms - {status} +2. ... +``` + +--- + +## Alertas Automáticos + +### Detectar Degradação + +```javascript +// Query comparação com baseline +const degraded = await get_skill_metrics({ + aggregate: 'compare', + days: 7 // última semana +}); + +const alerts = degraded.results.filter(r => + r.performance_status === 'DEGRADED' +); + +if (alerts.length > 0) { + // Output alertas + for (const alert of alerts) { + console.log(`⚠️ ${alert.name}: +${alert.degradation_pct}% vs baseline`); + } + + // Sugerir acção + console.log("\n💡 Sugestão: Executar /reflect para investigar causas"); +} +``` + +--- + +## Integração com Outros Sistemas + +### Link para Desk CRM + +``` +Ver métricas no Desk CRM: +https://desk.descomplicar.pt/admin/projects/view/65 + +Relatório personalizado: +Reports → Stack Performance +``` + +### Trigger Reflect se Degradação + +```javascript +if (degradation_pct > 15) { + // AUTO: Invocar reflect-agent em background + Task({ + subagent_type: 'reflect-agent', + background: true, + model: 'sonnet', + prompt: ` + PERFORMANCE DEGRADATION DETECTED + + Component: ${name} + Baseline: ${baseline}ms + Current: ${current}ms + Degradation: ${degradation_pct}% + + Analyze root cause and suggest fixes. + ` + }); +} +``` + +--- + +## Queries SQL Úteis (Fallback) + +### Top 10 Skills + +```sql +SELECT + name, + COUNT(*) as uses, + AVG(duration_ms)/60000 as avg_min, + (SUM(CASE WHEN status='error' THEN 1 ELSE 0 END) / COUNT(*) * 100) as error_rate +FROM tblskill_agent_metrics +WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY) + AND type = 'skill' +GROUP BY name +ORDER BY uses DESC +LIMIT 10; +``` + +### ROI por Projecto + +```sql +WITH skill_savings AS ( + SELECT + m.project_id, + m.name, + COUNT(*) as uses, + (b.baseline_duration_ms - AVG(m.duration_ms))/60000 as saved_per_use_min + FROM tblskill_agent_metrics m + JOIN tblskill_agent_baselines b ON b.name = m.name + WHERE m.status = 'success' + GROUP BY m.project_id, m.name +) +SELECT + p.name as project, + c.company as client, + s.name as skill, + s.uses, + ROUND(s.uses * s.saved_per_use_min/60, 1) as hours_saved, + ROUND((s.uses * s.saved_per_use_min/60) * 50, 2) as value_eur +FROM skill_savings s +JOIN tblprojects p ON p.id = s.project_id +JOIN tblclients c ON c.userid = p.clientid +WHERE s.saved_per_use_min > 0 +ORDER BY hours_saved DESC; +``` + +### Trending Semanal + +```sql +SELECT + name, + DATE_FORMAT(created_at, '%Y-W%u') as week, + COUNT(*) as executions, + AVG(duration_ms) as avg_ms +FROM tblskill_agent_metrics +WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY) +GROUP BY name, week +ORDER BY name, week DESC; +``` + +--- + +## Exemplo de Uso + +```bash +# Dashboard geral +> /metrics + +📊 Performance Overview (últimos 30 dias) + +Top Skills: +┌─────────────────────┬────────┬──────────┬────────┐ +│ Skill │ Usos │ Avg Time │ Trend │ +├─────────────────────┼────────┼──────────┼────────┤ +│ /orcamento │ 45 │ 18min │ -12% ✓ │ +│ /lead-approach │ 38 │ 22min │ +5% ⚠ │ +│ /wp-dev │ 32 │ 47min │ -8% ✓ │ +└─────────────────────┴────────┴──────────┴────────┘ + +⚠️ 1 alerta detectado +🎯 Dify KB: 35/43 skills (81%) + +# Análise específica +> /metrics /orcamento + +📊 /orcamento - Análise Detalhada + +Performance: 18min avg (vs 30min baseline) → -40% ✓ +Execuções: 45 (última semana: 12) +Success: 96% | Errors: 4% + +Trending: ↓ Melhoria constante +``` + +--- + +## Notas Técnicas + +### Tools MCP Status + +**Estado:** Implementados em `/opt/desk-crm-v3/src/tools/core/metrics.ts` +**Compilados:** ✅ `/opt/desk-crm-v3/dist/tools/core/metrics.js` +**Serviço:** ✅ desk-crm.service reiniciado (249 tools) +**Disponibilidade:** Podem precisar de refresh Claude Code para serem descobertos + +### Fallback Strategy + +Se tools MCP não disponíveis: +1. Usar queries SQL directas via `sql_direct` tool +2. Funcionalidade completa mantém-se +3. Performance ligeiramente inferior mas aceitável + +### Tabelas DB + +- `tblskill_agent_metrics` - Telemetria +- `tblskill_agent_baselines` - Baselines +- `tblskill_agent_pdca_cycles` - PDCA histórico + +--- + +--- + +## NOVO v1.2.0: Métricas Dify KB + +### /metrics --kb + +Dashboard específico de performance Dify Knowledge Base. + +``` +┌──────────────────────────────────────────────────────────────┐ +│ DIFY KB PERFORMANCE DASHBOARD │ +│ 2026-02-03 │ +├──────────────────────────────────────────────────────────────┤ +│ │ +│ CACHE PERFORMANCE │ +│ ════════════════════════════════════════════════════════ │ +│ Hit Rate: ████░░░░░░░░░░░░░░░░ 6.3% (target: 40%+) │ +│ │ +│ Cache Breakdown: │ +│ ┌────────────────┬────────┬────────┬────────┐ │ +│ │ Skill │ Queries│ Hits │ Hit % │ │ +│ ├────────────────┼────────┼────────┼────────┤ │ +│ │ /orcamento │ 5 │ 1 │ 20% │ │ +│ │ /lead-approach │ 3 │ 0 │ 0% │ │ +│ │ /wp-dev │ 4 │ 0 │ 0% │ │ +│ │ /seo-content │ 2 │ 0 │ 0% │ │ +│ └────────────────┴────────┴────────┴────────┘ │ +│ │ +│ QUERY RELEVANCE (avg score) │ +│ ════════════════════════════════════════════════════════ │ +│ SEO: █████████████████░░░ 0.85 ⭐ │ +│ Perfex: ████████████████░░░░ 0.79 │ +│ Elementor: ██████████████░░░░░░ 0.70 │ +│ Marketing: █████████████░░░░░░░ 0.66 │ +│ Vendas: █████████░░░░░░░░░░░ 0.46 ⚠️ │ +│ │ +│ IMPACT ON PERFORMANCE │ +│ ════════════════════════════════════════════════════════ │ +│ Com Dify KB: 18 min avg │ +│ Sem Dify KB: 30 min avg (baseline) │ +│ Improvement: -40% ✓ │ +│ │ +│ GAPS DETECTED │ +│ ════════════════════════════════════════════════════════ │ +│ ⚠️ Vendas dataset: score 0.46 (queries mal formuladas) │ +│ ℹ️ Cache hit baixo: requer mais uso para acumular │ +│ │ +└──────────────────────────────────────────────────────────────┘ +``` + +### /metrics --roi + +ROI detalhado por cliente/projecto. + +``` +┌──────────────────────────────────────────────────────────────┐ +│ ROI POR CLIENTE/PROJECTO │ +│ Últimos 30 dias │ +├──────────────────────────────────────────────────────────────┤ +│ │ +│ TOP CLIENTES POR VALOR GERADO │ +│ ════════════════════════════════════════════════════════ │ +│ ┌────────────────────┬────────┬────────┬──────────────┐ │ +│ │ Cliente │ Horas │ Skills │ Valor (€) │ │ +│ ├────────────────────┼────────┼────────┼──────────────┤ │ +│ │ SFV-360 │ 24h │ 45 │ €1.200,00 │ │ +│ │ Descomplicar │ 18h │ 32 │ €900,00 │ │ +│ │ INTERNAL │ 12h │ 28 │ €600,00 │ │ +│ └────────────────────┴────────┴────────┴──────────────┘ │ +│ │ +│ TOTAL PERÍODO: 54 horas poupadas = €2.700,00 │ +│ Custo hora interno: €50,00 │ +│ │ +│ BREAKDOWN POR SKILL │ +│ ════════════════════════════════════════════════════════ │ +│ /orcamento: 12h poupadas (baseline 30min→18min) │ +│ /wp-dev: 8h poupadas (baseline 4h→2h) │ +│ /lead-approach: 6h poupadas (baseline 25min→12min) │ +│ │ +└──────────────────────────────────────────────────────────────┘ +``` + +### /metrics --export + +Exportar métricas para integração. + +``` +Formatos disponíveis: +1. JSON - ~/.claude/skills/_metrics-export-YYYYMMDD.json +2. CSV - ~/.claude/skills/_metrics-export-YYYYMMDD.csv +3. Markdown - Para colar em documentos + +Campos exportados: +- name, type, executions, avg_ms, baseline_ms +- improvement_pct, error_rate, kb_consulted +- cache_hit_rate, project_id, client_name +``` + +### /metrics --alerts + +Sistema de alertas inteligentes. + +``` +┌──────────────────────────────────────────────────────────────┐ +│ ALERTAS ACTIVOS │ +├──────────────────────────────────────────────────────────────┤ +│ │ +│ ⚠️ DEGRADAÇÃO (>15% vs baseline) │ +│ ─────────────────────────────────────────────────────── │ +│ /lead-approach: +22% (baseline 12min → actual 15min) │ +│ Última ocorrência: 2026-02-02 │ +│ Afecta: 3 projectos │ +│ Acção: Executar /reflect para investigar │ +│ │ +│ ℹ️ LOW CACHE HIT (<30%) │ +│ ─────────────────────────────────────────────────────── │ +│ Cache hit rate: 6.3% │ +│ Target: 40% │ +│ Causa: Sistema recente, acumular com uso │ +│ Acção: Continuar monitorização │ +│ │ +│ ✅ MELHORIAS DETECTADAS │ +│ ─────────────────────────────────────────────────────── │ +│ /orcamento: -40% (era 30min, agora 18min) │ +│ /wp-dev: -50% (era 4h, agora 2h) │ +│ │ +└──────────────────────────────────────────────────────────────┘ + +Configurar alertas: +- Degradação threshold: 15% (padrão) +- Cache hit minimum: 30% (padrão) +- Error rate maximum: 10% (padrão) +``` + +--- + +## ASCII Charts Library + +Templates reutilizáveis para visualização. + +### Progress Bar +```javascript +function progressBar(value, max, width=20) { + const filled = Math.round((value / max) * width); + const empty = width - filled; + return '█'.repeat(filled) + '░'.repeat(empty); +} + +// Exemplo: progressBar(40, 100, 20) → "████████░░░░░░░░░░░░" +``` + +### Trending Arrow +```javascript +function trendIcon(pct) { + if (pct < -10) return '↓↓ ✓'; // Grande melhoria + if (pct < 0) return '↓ ✓'; // Melhoria + if (pct === 0) return '→'; // Estável + if (pct < 10) return '↑ ⚠'; // Pequena degradação + return '↑↑ ⚠️'; // Grande degradação +} +``` + +### Mini Sparkline +```javascript +function sparkline(values) { + const chars = '▁▂▃▄▅▆▇█'; + const min = Math.min(...values); + const max = Math.max(...values); + const range = max - min || 1; + return values.map(v => chars[Math.floor((v - min) / range * 7)]).join(''); +} + +// Exemplo: sparkline([10, 15, 8, 20, 12]) → "▃▅▁█▄" +``` + +--- + +## Integração com /taskforce kb-health + +O comando `/metrics --kb` complementa `/taskforce kb-health`: + +| Comando | Foco | Quando Usar | +|---------|------|-------------| +| `/taskforce kb-health` | Saúde sistema KB (coverage, gaps) | Visão arquitectural | +| `/metrics --kb` | Performance queries KB | Análise operacional | +| `/metrics --roi` | Valor económico gerado | Justificação investimento | + +**Workflow recomendado:** +1. `/taskforce kb-health` - Verificar gaps e coverage +2. `/metrics --kb` - Analisar performance queries +3. `/metrics --roi` - Calcular ROI para stakeholders + +--- + +## Changelog + +### v1.2.0 (2026-02-03) +- **NOVO:** `/metrics --kb` - Dashboard Dify KB +- **NOVO:** `/metrics --roi` - ROI por cliente/projecto +- **NOVO:** `/metrics --export` - Export JSON/CSV +- **NOVO:** `/metrics --alerts` - Sistema alertas +- **NOVO:** ASCII Charts Library +- **MELHORIA:** Integração com `/taskforce kb-health` +- Frontmatter YAML standard + +### v1.0.0 (2026-02-03) +- Versão inicial +- Dashboard overview +- Análise por skill +- Trending temporal +- Comparação baseline + +--- + +**Skill:** /metrics v1.2.0 | **Autor:** Descomplicar® +**Parte de:** Sistema de Métricas Quantitativas +**Desk CRM:** Projecto #65 | Task #1637 diff --git a/core-tools/skills/plugin-curator/SKILL.md b/core-tools/skills/plugin-curator/SKILL.md new file mode 100644 index 0000000..d278d17 --- /dev/null +++ b/core-tools/skills/plugin-curator/SKILL.md @@ -0,0 +1,105 @@ +--- +name: plugin-curator +description: > + Curadoria inteligente de plugins para o ecossistema Claude Code. + Use when "plugins", "marketplace", "instalar plugin", "descobrir", + "recomendações", "actualizar", "gaps funcionais", "extensões". +author: Descomplicar® +version: 1.0.0 +desk_task: 1441 +allowed-tools: Read, Glob, Grep, WebFetch, WebSearch +--- + +# Plugin Curator + +Curadoria inteligente de plugins para o ecossistema Claude Code. + +## Triggers + +Esta skill deve ser activada quando: +- Utilizador pede recomendações de plugins +- Novo tipo de tarefa sem skill/plugin adequado +- Actualização disponível para plugins instalados +- Gap identificado na cobertura funcional + +## Capabilities + +### 1. Discovery +- Pesquisar marketplaces oficiais e comunitários +- Avaliar relevância baseada no contexto actual +- Identificar plugins com funcionalidades sobrepostas +- Detectar plugins desactualizados ou abandonados + +### 2. Evaluation +- Analisar qualidade do código (se open source) +- Verificar compatibilidade com sistema actual +- Avaliar segurança (hooks, permissões) +- Medir popularidade e manutenção activa + +### 3. Installation Management +- Instalar plugins recomendados +- Configurar hooks e MCPs do plugin +- Resolver conflitos com plugins existentes +- Gerir actualizações e rollbacks + +### 4. Gap Analysis +- Mapear funcionalidades existentes +- Identificar áreas sem cobertura +- Sugerir plugins ou skills a desenvolver +- Priorizar baseado em uso real + +## Marketplaces Conhecidos + +| Marketplace | URL | Tipo | +|-------------|-----|------| +| anthropics/claude-plugins-official | github.com | Oficial | +| coreyhaines31/marketingskills | github.com | Marketing | +| alirezarezvani/claude-skills | github.com | Geral | +| Chat2AnyLLM/awesome-claude-plugins | github.com | Curadoria | +| obra/superpowers | github.com | Metodologia | + +## Scoring Algorithm + +``` +score = 0 +score += keyword_match * 3 # Max 3 +score += category_align * 2 # Max 2 +score += popularity # Max 2 (>1k stars) +score += recent_update # Max 1 (<30 days) +score += no_conflicts * 2 # Max 2 +# Total max: 10 +``` + +## Workflow + +``` +ANALYSE GAPS → SEARCH MARKETPLACES → EVALUATE → RECOMMEND → INSTALL +``` + +## Exemplo de Uso + +``` +User: Preciso de ajuda com testes automatizados +Assistant: [Activa plugin-curator] +- Verifica skills de testing existentes: Nenhuma +- Pesquisa marketplaces por "testing", "QA", "automation" +- Encontra: pr-review-toolkit (6 agents QA), superpowers (TDD) +- Recomenda: "Encontrei 2 plugins relevantes para testing: + 1. pr-review-toolkit - 6 agents especializados em QA + 2. superpowers - Metodologia TDD integrada + Qual preferes instalar?" +``` + +## Limites + +- Não instala plugins automaticamente (requer confirmação) +- Não avalia plugins de fontes privadas/não acessíveis +- Score máximo 10 - pode não reflectir 100% da qualidade real +- Depende de metadados disponíveis nos marketplaces + +## Anti-Patterns + +- NUNCA instalar plugins sem confirmação do utilizador +- NUNCA instalar plugins de fontes não verificadas +- Verificar SEMPRE conflitos antes de instalar +- Manter registo de todos os plugins avaliados diff --git a/core-tools/skills/plugin-manager/SKILL.md b/core-tools/skills/plugin-manager/SKILL.md new file mode 100644 index 0000000..71a6184 --- /dev/null +++ b/core-tools/skills/plugin-manager/SKILL.md @@ -0,0 +1,153 @@ +--- +name: plugin-config +description: > + Gestao inteligente de plugins por contexto v3.0. Avalia regras aditivas — activa + cada plugin que fizer sentido para o contexto actual (directorio, ficheiros, conversa). + Sem profiles rigidos. Use when "plugins", "plugin-config", "activar plugin", + "desactivar plugin", "contexto plugins", "prompt too long". +author: Descomplicar +version: 3.1.0 +user_invocable: true +category: system +tags: [plugins, context, optimization, registry] +desk_project: 65 +desk_task: 1754 +allowed-tools: Read, Bash, Glob +--- + +# /plugin-config v3.0 - Gestao Inteligente de Plugins + +Cada plugin tem regras de activacao. O sistema avalia todas e activa o que fizer sentido. +Sem profiles — aditivo, contextual, automatico. + +--- + +## Comandos + +| Comando | Funcao | +|---------|--------| +| `/plugin-config status` | Plugins activos/inactivos e porquê | +| `/plugin-config apply` | Avalia regras e aplica alteracoes ao settings.json | +| `/plugin-config enable ` | Forca activacao de um plugin | +| `/plugin-config disable ` | Forca desactivacao de um plugin | +| `/plugin-config reset` | Activa todos os plugins | + +--- + +## Como funciona + +### Registry (profiles.json v3.0) + +Cada plugin tem regras `activate_when`: +- **directories** — $PWD comeca com este path +- **files** — ficheiro existe no projecto (ate 2 niveis acima) +- **keywords** — palavra aparece no contexto da conversa +- **ssh_context** — quando trabalho via SSH envolve estes termos +- **content_match** — conteudo especifico dentro de um ficheiro + +Regras sao **aditivas**: se qualquer regra de um plugin faz match, esse plugin activa. +Multiplos plugins podem activar simultaneamente. + +### Always-on (4 plugins) + +Nunca desactivados, independentemente do contexto: +- gestao, crm-ops, core-tools, superpowers + +### Contextuais (19 plugins) + +| Plugin | Activa quando | +|--------|---------------| +| **project-manager** | SPEC.md, SPRINT.md, .desk-project, Dev/ ou Hub/ directory | +| **wordpress** | wp-config.php, wordpress, elementor, woocommerce | +| **dev-tools** | package.json, composer.json, react, typescript, refactor | +| **infraestrutura** | docker-compose.yml, servidor, cwp, easypanel, ssl, deploy | +| **marketing** | seo, campanha, google ads, social media, copywriting | +| **design-media** | design, ui, ux, apresentacao, video, figma | +| **metabase** | metabase, dashboard bi, kpi, query sql | +| **automacao** | n8n, workflow, moloni, webhook, mcp server | +| **perfex-dev** | init.php + register_module, perfex | +| **negocio** | estrategia negocio, saas, e-commerce, pricing, swot | +| **plugin-dev** | .claude-plugin, SKILL.md, criar skill/agent/hook | +| **feature-dev** | package.json, implementar feature, nova feature | +| **frontend-design** | tailwind.config, css, frontend design, layout | +| **frontend-excellence** | next.config.*, react avancado, nextjs, state management | +| **cache-components** | next.config.*, cache component, ppr | +| **pr-review-toolkit** | .git, review, pull request, code review | +| **context7** | package.json, docs, documentacao biblioteca | +| **ralph-loop** | ralph, loop autonomo | +| **playground** | playground, html interactivo | + +--- + +## Protocolo: /plugin-config apply + +``` +1. Ler profiles.json (registry) +2. Para CADA plugin contextual: + a. Avaliar activate_when.directories vs $PWD + b. Avaliar activate_when.files vs ficheiros no projecto + c. Avaliar activate_when.keywords vs contexto da conversa + d. Se qualquer regra match → marcar para activar + e. Se nenhuma regra match → marcar para desactivar +3. Construir mapa enabledPlugins: + - always_on → sempre true + - matched → true + - nao matched → false +4. Aplicar via jq em ~/.claude/settings.json +5. Output: lista de alteracoes +6. Informar: "Alteracoes aplicadas. Restart sessao para efeito." +``` + +## Protocolo: /plugin-config status + +``` +1. Ler ~/.claude/settings.json → enabledPlugins +2. Ler profiles.json → registry +3. Para cada plugin: + - Estado actual (activo/inactivo) + - Tipo (always_on / contextual) + - Regras que fazem match no contexto actual +4. Mostrar tabela organizada +``` + +## Protocolo: /plugin-config enable + +``` +1. Activar plugin via jq em settings.json +2. Informar: "Plugin activado. Restart sessao para efeito." +``` + +## Protocolo: /plugin-config disable + +``` +1. Verificar que nao esta em always_on +2. Desactivar via jq em settings.json +3. Informar: "Plugin desactivado. Restart sessao para efeito." +``` + +## Protocolo: /plugin-config reset + +``` +1. Activar TODOS os plugins (contextual + always_on) em settings.json +2. Informar: "Todos os plugins activados." +``` + +--- + +## Hook automatico + +`~/.claude/hooks/plugin-context-detector.sh` corre no inicio de cada sessao (UserPromptSubmit). +Avalia todas as regras e sugere `/plugin-config apply` se detectar alteracoes necessarias. + +--- + +## Anti-Patterns + +- NUNCA desactivar plugins always_on +- NUNCA editar settings.json sem jq (Regra #40) +- NUNCA prometer efeito imediato — restart e necessario +- NUNCA ignorar sugestao do hook — executar /plugin-config apply + +--- + +*Skill v3.0.0 | 04-03-2026 | Descomplicar* diff --git a/core-tools/skills/plugin-manager/profiles.json b/core-tools/skills/plugin-manager/profiles.json new file mode 100644 index 0000000..01a1c41 --- /dev/null +++ b/core-tools/skills/plugin-manager/profiles.json @@ -0,0 +1,143 @@ +{ + "version": "3.1", + "type": "plugin-registry", + "always_on": [ + "gestao@descomplicar-plugins", + "crm-ops@descomplicar-plugins", + "core-tools@descomplicar-plugins", + "superpowers@claude-plugins-official" + ], + "plugins": { + "wordpress@descomplicar-plugins": { + "description": "WordPress, Elementor, WooCommerce, themes, plugins WP", + "activate_when": { + "files": ["wp-config.php", "wp-content", "functions.php", "style.css"], + "keywords": ["wordpress", "elementor", "woocommerce", "wp-cli", "theme wordpress", "plugin wp", "rank math", "branda", "wp-admin", "wp update"], + "ssh_context": ["cwp", "public_html", "wp-admin"] + } + }, + "dev-tools@descomplicar-plugins": { + "description": "Desenvolvimento JS/PHP/DB, React, arquitectura, code review", + "activate_when": { + "files": ["package.json", "composer.json", "tsconfig.json", "artisan", ".eslintrc", "Makefile", "pom.xml"], + "keywords": ["react", "typescript", "javascript", "php", "laravel", "api rest", "database design", "schema", "refactor", "debug codigo", "componente react", "fullstack", "backend", "endpoint"] + } + }, + "infraestrutura@descomplicar-plugins": { + "description": "Servidores, CWP, EasyPanel, Proxmox, SSL, DNS, Docker, backups servidor", + "activate_when": { + "files": ["docker-compose.yml", "Dockerfile", ".env.production"], + "directories": ["/root/Dev"], + "keywords": ["servidor", "server", "cwp", "easypanel", "proxmox", "ssl certificado", "dns", "docker", "deploy", "backup servidor", "nginx", "apache", "firewall", "ssh servidor", "email servidor", "postfix", "pbs", "migration vm"] + } + }, + "marketing@descomplicar-plugins": { + "description": "SEO, campanhas, ads, social media, conteudo, copywriting", + "activate_when": { + "keywords": ["seo", "marketing", "campanha", "google ads", "meta ads", "social media", "copywriting", "newsletter", "email marketing", "landing page", "conversao", "lead approach", "conteudo marketing", "instagram", "linkedin", "tiktok", "youtube marketing", "ppc"] + } + }, + "design-media@descomplicar-plugins": { + "description": "Design UI/UX, apresentacoes, infograficos, video, identidade visual", + "activate_when": { + "keywords": ["design", "ui design", "ux design", "apresentacao", "infografico", "logo", "identidade visual", "pptx", "slides", "remotion", "video producao", "thumbnail", "figma", "penpot", "mockup", "wireframe", "brand"] + } + }, + "metabase@descomplicar-plugins": { + "description": "BI, dashboards Metabase, queries SQL analytics", + "activate_when": { + "keywords": ["metabase", "dashboard bi", "analytics dados", "kpi dashboard", "query sql metabase", "relatorio dados"] + } + }, + "automacao@descomplicar-plugins": { + "description": "N8N, workflows, integracoes, Moloni, MCPs dev, webhooks", + "activate_when": { + "keywords": ["n8n", "workflow automacao", "moloni", "webhook", "integracao sistemas", "mcp server", "mcp desenvolvimento", "automacao processo"] + } + }, + "perfex-dev@descomplicar-plugins": { + "description": "Modulos Perfex CRM, controllers, hooks, views, migrations Perfex", + "activate_when": { + "files": ["init.php"], + "content_match": "register_module", + "keywords": ["perfex", "modulo perfex", "perfex crm"] + } + }, + "negocio@descomplicar-plugins": { + "description": "Estrategia, pesquisa mercado, SaaS, e-commerce, produto", + "activate_when": { + "keywords": ["estrategia negocio", "pesquisa mercado", "saas", "e-commerce", "produto digital", "pricing", "business model", "swot", "porter", "concorrencia", "proposta valor"] + } + }, + "project-manager@descomplicar-plugins": { + "description": "Specs, sprints, brainstorm, status projecto, scope", + "activate_when": { + "files": ["SPEC.md", "SPRINT.md", ".desk-project"], + "directories": ["/media/ealmeida/Dados/Dev", "/media/ealmeida/Dados/Hub"], + "keywords": ["spec", "sprint", "brainstorm", "status projecto", "scope", "planeamento dev", "fase projecto", "milestone"] + } + }, + "plugin-dev@claude-plugins-official": { + "description": "Criar/editar plugins Claude Code, skills, agents, hooks", + "activate_when": { + "directories": ["/home/ealmeida/.claude/plugins"], + "files": [".claude-plugin", "SKILL.md", "plugin.json"], + "keywords": ["criar plugin", "criar skill", "criar agent", "criar hook", "plugin-dev", "editar skill", "novo agent"] + } + }, + "feature-dev@claude-plugins-official": { + "description": "Desenvolvimento guiado de features com exploracao de codebase", + "activate_when": { + "files": ["package.json", "composer.json", "tsconfig.json"], + "keywords": ["feature dev", "implementar feature", "desenvolver funcionalidade", "nova feature", "feature branch"] + } + }, + "frontend-design@claude-plugins-official": { + "description": "Design frontend, componentes visuais, CSS, Tailwind", + "activate_when": { + "files": ["tailwind.config.js", "tailwind.config.ts", "postcss.config.js", "globals.css"], + "keywords": ["frontend design", "css", "tailwind", "componente visual", "responsive design", "layout pagina", "estilo css", "styled components"] + } + }, + "frontend-excellence@dotclaude-plugins": { + "description": "React avancado, state management, performance frontend", + "activate_when": { + "files": ["next.config.js", "next.config.mjs", "next.config.ts", "vite.config.ts"], + "keywords": ["react avancado", "next.js", "nextjs", "state management", "zustand", "redux", "performance frontend", "core web vitals", "server components"] + } + }, + "cache-components@nextjs": { + "description": "Next.js Cache Components e Partial Prerendering", + "activate_when": { + "files": ["next.config.js", "next.config.mjs", "next.config.ts"], + "keywords": ["cache component", "ppr", "partial prerendering", "next.js cache", "isr"] + } + }, + "pr-review-toolkit@claude-plugins-official": { + "description": "Code review, PR review, analise de codigo, silent failures", + "activate_when": { + "files": [".git"], + "keywords": ["review", "code review", "pull request", "pr review", "review codigo", "merge", "git diff", "commit review"] + } + }, + "ralph-loop@claude-plugins-official": { + "description": "Loop autonomo iterativo para tarefas complexas", + "activate_when": { + "keywords": ["ralph", "loop autonomo", "iteracao autonoma", "ralph loop"] + } + }, + "playground@claude-plugins-official": { + "description": "Playgrounds HTML interactivos para exploracao visual", + "activate_when": { + "keywords": ["playground", "html interactivo", "explorador visual", "configurador visual"] + } + }, + "context7@claude-plugins-official": { + "description": "Documentacao actualizada de bibliotecas e frameworks", + "activate_when": { + "files": ["package.json", "composer.json", "requirements.txt", "Gemfile"], + "keywords": ["docs", "documentacao biblioteca", "context7", "como usar", "api reference", "exemplo codigo"] + } + } + } +} diff --git a/core-tools/skills/quality-validator/SKILL.md b/core-tools/skills/quality-validator/SKILL.md new file mode 100644 index 0000000..6faba79 --- /dev/null +++ b/core-tools/skills/quality-validator/SKILL.md @@ -0,0 +1,196 @@ +--- +name: quality-validator +description: > + Valida componentes contra standards Descomplicar®. + Use when "validar", "score", "qualidade", "audit", + "verificar frontmatter", "checklist", "quality gate". +author: Descomplicar® +version: 1.0.0 +desk_task: 1441 +allowed-tools: Read, Glob, Grep +--- + +# Quality Validator + +Skill para validar componentes e garantir qualidade mínima antes de activação. + +## Triggers + +Esta skill deve ser activada quando: +- Novo componente é criado +- Comando `/descomplicar:validate` é invocado +- Antes de release (`/descomplicar:release`) +- Após edição de componente existente +- Durante sync para bloquear componentes inválidos + +## Capabilities + +### 1. Validar Skill + +**Checklist Obrigatório:** + +| Campo | Obrigatório | Peso | +|-------|-------------|------| +| `name:` | Sim | 15 | +| `description:` | Sim | 20 | +| `author:` | Sim | 5 | +| `version:` | Sim | 5 | +| `desk_task:` | Não | 5 | +| `allowed-tools:` | Sim | 10 | +| Triggers section | Sim | 10 | +| Capabilities section | Sim | 10 | +| Workflow | Não | 5 | +| Exemplo de Uso | Não | 10 | +| Limites section | Não | 5 | + +**Validações de Qualidade:** +- `description:` contém triggers (keywords) → +5 pontos +- `description:` tem 5+ keywords → +5 pontos +- Tamanho < 500 linhas → +5 pontos +- Sem erros de sintaxe YAML → obrigatório + +### 2. Validar Agent + +**Checklist Obrigatório:** + +| Campo | Obrigatório | Peso | +|-------|-------------|------| +| `name:` | Sim | 15 | +| `description:` | Sim | 20 | +| `model:` | Sim | 10 | +| `tools:` | Sim | 10 | +| `allowed-mcps:` | Sim | 15 | +| `category:` | Sim | 10 | +| `author:` | Sim | 5 | +| `version:` | Sim | 5 | +| Quando Usar section | Não | 5 | +| Workflow section | Não | 5 | + +**Validações de Qualidade:** +- MCPs mapeados existem em `cr_mcps` → +5 pontos +- Categoria válida (dev|business|marketing|infra) → obrigatório +- Model válido (sonnet|opus|haiku) → obrigatório + +### 3. Validar Command + +**Checklist Obrigatório:** + +| Campo | Obrigatório | Peso | +|-------|-------------|------| +| `name:` | Sim | 20 | +| `description:` | Sim | 30 | +| `argument-hint:` | Não | 10 | +| Objectivo section | Sim | 15 | +| Sintaxe section | Sim | 15 | +| Output section | Não | 10 | + +### 4. Calcular Score + +**Fórmula:** +``` +score = (campos_obrigatorios * peso_obrigatorio) + (campos_opcionais * peso_opcional) + bonus_qualidade +``` + +**Interpretação:** +| Score | Status | Acção | +|-------|--------|-------| +| >= 90 | Production | Pronto para uso | +| 70-89 | Beta | Pode activar com aviso | +| 50-69 | Draft | Requer melhorias | +| < 50 | Invalid | **BLOQUEAR** activação | + +### 5. Gerar Relatório + +**Output:** +``` +╔══════════════════════════════════════════════════════════════════════╗ +║ QUALITY VALIDATION: ║ +║ Type: Skill | Path: skills//SKILL.md ║ +╠══════════════════════════════════════════════════════════════════════╣ +║ FRONTMATTER ║ +║ ├── name: ✓ Present ║ +║ ├── description: ✓ Present (5 keywords detected) ║ +║ ├── author: ✓ Present ║ +║ ├── version: ✓ Present (1.0.0) ║ +║ ├── desk_task: ✗ Missing (optional) ║ +║ └── allowed-tools: ✓ Present (Read, Glob, Grep) ║ +╠══════════════════════════════════════════════════════════════════════╣ +║ CONTENT SECTIONS ║ +║ ├── Triggers: ✓ Present ║ +║ ├── Capabilities: ✓ Present (3 capabilities) ║ +║ ├── Workflow: ✓ Present ║ +║ ├── Exemplo: ✗ Missing (recommended) ║ +║ └── Limites: ✗ Missing (recommended) ║ +╠══════════════════════════════════════════════════════════════════════╣ +║ QUALITY CHECKS ║ +║ ├── Lines: 234 (< 500 ✓) ║ +║ ├── YAML syntax: Valid ✓ ║ +║ └── Keywords: 5 detected ✓ ║ +╠══════════════════════════════════════════════════════════════════════╣ +║ SCORE: 78/100 ████████████████░░░░ BETA ║ +╠══════════════════════════════════════════════════════════════════════╣ +║ SUGGESTIONS ║ +║ 1. Adicionar secção "Exemplo de Uso" (+10 pontos) ║ +║ 2. Adicionar secção "Limites" (+5 pontos) ║ +║ 3. Adicionar desk_task no frontmatter (+5 pontos) ║ +╚══════════════════════════════════════════════════════════════════════╝ +``` + +## Quality Gates + +### Gate 1: Criação +- Score >= 50 para criar componente +- Se < 50: BLOQUEAR e mostrar erros + +### Gate 2: Activação +- Score >= 70 para activar componente +- Se < 70: AVISO + sugestões + +### Gate 3: Release +- Score >= 90 para todos os componentes +- Se algum < 90: BLOQUEAR release + +## Integração com Sync + +Durante `/descomplicar:sync`: +```sql +-- Verificar componentes com score baixo +SELECT c.slug, c.quality_score, c.status +FROM cr_skills c +WHERE c.quality_score < 70 AND c.status = 'active'; + +-- Marcar para revisão +UPDATE cr_skills +SET status = 'review_required' +WHERE quality_score < 70 AND status = 'active'; +``` + +## Workflow + +``` +READ COMPONENT → PARSE FRONTMATTER → CHECK SECTIONS → CALCULATE SCORE → REPORT + ↓ ↓ ↓ ↓ ↓ + File path YAML valid All present 0-100 Suggestions +``` + +## Exemplo de Uso + +``` +User: Valida a skill infrastructure-manager + +Quality Validator: +1. [Lê skills/infrastructure-manager/SKILL.md] +2. [Verifica frontmatter: 6/6 campos] +3. [Verifica secções: 4/5 presentes] +4. [Calcula score: 85/100] +5. Resultado: + "Score: 85/100 (BETA) + ✓ Pronto para uso + Sugestão: Adicionar secção 'Limites' para score 90+" +``` + +## Limites + +- Não modifica componentes (apenas lê e reporta) +- Não cria componentes (usar component-generator) +- Não executa correções automáticas (usar /descomplicar:upgrade) diff --git a/core-tools/skills/relationship-manager/SKILL.md b/core-tools/skills/relationship-manager/SKILL.md new file mode 100644 index 0000000..3f28a2a --- /dev/null +++ b/core-tools/skills/relationship-manager/SKILL.md @@ -0,0 +1,231 @@ +--- +name: relationship-manager +description: > + Gestão inteligente de relacionamentos entre componentes do sistema. + Use when "relacionamentos", "mapeamento", "colaborações", "dependências", + "agent-mcp", "agent-skill", "sdk", "impacto", "inconsistências". +author: Descomplicar® +version: 1.0.0 +desk_task: 1441 +allowed-tools: Read, Glob, Grep, ToolSearch +--- + +# Relationship Manager + +Gestão inteligente de relacionamentos entre componentes do sistema. + +## Triggers + +Esta skill deve ser activada quando: +- Utilizador pede para configurar relacionamentos +- Novo componente é adicionado e precisa de mapeamentos +- Inconsistências detectadas em relacionamentos +- Análise de impacto de mudanças + +## Schema de Relacionamentos + +### Hierarquia + +``` +TaskForce (Plugin) +├── cr_plugin_agents → Agentes do Plugin +├── cr_plugin_skills → Skills do Plugin +└── cr_plugin_mcps → MCPs do Plugin + +Agent +├── cr_agent_mcps → MCPs do Agente (primary/recommended/available) +├── cr_agent_skills → Skills do Agente +└── cr_agent_collaborations → Colaborações com outros Agentes + +Skill +└── cr_skill_mcps → MCPs necessários para a Skill + +Decision Tree +└── Referencia um Agent para selecção automática +``` + +### Tipos de Relacionamento + +**cr_agent_mcps.relationship_type:** +- `primary` - MCPs essenciais, sempre disponíveis +- `recommended` - MCPs recomendados, usar quando relevante +- `available` - MCPs opcionais, disponíveis se necessário + +**cr_agent_collaborations.collaboration_type:** +- `technical` - Colaboração técnica (mesmo domínio) +- `cross-domain` - Colaboração entre domínios diferentes +- `sequential` - Um passa trabalho para outro +- `parallel` - Trabalham em paralelo + +## Capabilities + +### 1. Análise de Relacionamentos + +**Ver todos os relacionamentos de um componente:** +```sql +-- Para um Agente +SELECT 'MCP' as type, m.slug, am.relationship_type +FROM cr_agent_mcps am +JOIN cr_mcps m ON am.mcp_id = m.id +WHERE am.agent_id = (SELECT id FROM cr_agents WHERE slug = ?) + +UNION ALL + +SELECT 'Skill', s.slug, 'uses' +FROM cr_agent_skills ags +JOIN cr_skills s ON ags.skill_id = s.id +WHERE ags.agent_id = (SELECT id FROM cr_agents WHERE slug = ?) + +UNION ALL + +SELECT 'TaskForce', p.slug, 'member' +FROM cr_plugin_agents pa +JOIN cr_plugins p ON pa.plugin_id = p.id +WHERE pa.agent_id = (SELECT id FROM cr_agents WHERE slug = ?) + +UNION ALL + +SELECT 'Collaborator', a2.slug, ac.collaboration_type +FROM cr_agent_collaborations ac +JOIN cr_agents a2 ON ac.collaborator_id = a2.id +WHERE ac.agent_id = (SELECT id FROM cr_agents WHERE slug = ?); +``` + +### 2. Sugestão de Relacionamentos + +Baseado em padrões existentes: +```sql +-- MCPs usados por agentes similares (mesma categoria) +SELECT + m.slug, + COUNT(*) as usage_count, + GROUP_CONCAT(DISTINCT a.slug) as used_by +FROM cr_agent_mcps am +JOIN cr_mcps m ON am.mcp_id = m.id +JOIN cr_agents a ON am.agent_id = a.id +WHERE a.category = (SELECT category FROM cr_agents WHERE slug = ?) +AND am.agent_id != (SELECT id FROM cr_agents WHERE slug = ?) +AND m.id NOT IN ( + SELECT mcp_id FROM cr_agent_mcps + WHERE agent_id = (SELECT id FROM cr_agents WHERE slug = ?) +) +GROUP BY m.id +ORDER BY usage_count DESC +LIMIT 5; +``` + +### 3. Validação de Consistência + +```sql +-- Verificar órfãos em todas as tabelas +SELECT 'cr_agent_mcps (agent)' as issue, + COUNT(*) as orphans +FROM cr_agent_mcps am +LEFT JOIN cr_agents a ON am.agent_id = a.id +WHERE a.id IS NULL + +UNION ALL + +SELECT 'cr_agent_mcps (mcp)', + COUNT(*) +FROM cr_agent_mcps am +LEFT JOIN cr_mcps m ON am.mcp_id = m.id +WHERE m.id IS NULL + +-- ... continuar para todas as tabelas +``` + +### 4. Propagação de Mudanças + +Quando um componente é removido/desactivado: +```sql +-- Marcar relacionamentos como inactivos (não deletar) +UPDATE cr_agent_mcps +SET status = 'inactive', updated_at = NOW() +WHERE agent_id = (SELECT id FROM cr_agents WHERE slug = ?); + +-- Ou limpar (se preferido) +DELETE FROM cr_agent_mcps +WHERE agent_id = (SELECT id FROM cr_agents WHERE slug = ?); +``` + +### 5. Análise de Impacto + +Antes de remover um componente, verificar dependências: +```sql +-- Impacto de remover um MCP +SELECT + 'Agents afectados' as impact, + COUNT(DISTINCT am.agent_id) as count, + GROUP_CONCAT(DISTINCT a.slug) as list +FROM cr_agent_mcps am +JOIN cr_agents a ON am.agent_id = a.id +WHERE am.mcp_id = (SELECT id FROM cr_mcps WHERE slug = ?) +AND am.relationship_type = 'primary' + +UNION ALL + +SELECT + 'Skills afectadas', + COUNT(DISTINCT sm.skill_id), + GROUP_CONCAT(DISTINCT s.slug) +FROM cr_skill_mcps sm +JOIN cr_skills s ON sm.skill_id = s.id +WHERE sm.mcp_id = (SELECT id FROM cr_mcps WHERE slug = ?); +``` + +## Workflows + +### Adicionar Novo Agente + +1. Inserir em `cr_agents` +2. Mapear MCPs em `cr_agent_mcps`: + - Identificar MCPs primários (essenciais) + - Identificar MCPs recomendados (úteis) + - Listar MCPs disponíveis (opcionais) +3. Mapear Skills em `cr_agent_skills` +4. Associar a TaskForces em `cr_plugin_agents` +5. Definir colaborações em `cr_agent_collaborations` +6. Criar decision tree se necessário + +### Remover Componente + +1. Verificar impacto com análise de dependências +2. Confirmar com utilizador +3. Remover relacionamentos (ou marcar inactive) +4. Actualizar decision trees +5. Log em telemetria + +## Métricas + +| Métrica | Descrição | +|---------|-----------| +| Densidade | Média de relacionamentos por componente | +| Cobertura | % de componentes com relacionamentos | +| Consistência | % de relacionamentos válidos | +| Conectividade | Componentes isolados vs conectados | + +## Exemplo de Uso + +``` +User: Configura o novo agente video-editor com os MCPs necessários + +Relationship Manager: +1. [Analisa agentes similares na categoria 'content'] +2. [Identifica MCPs comuns: filesystem, google-workspace, elevenlabs] +3. [Sugere relacionamentos:] + - PRIMARY: filesystem, elevenlabs + - RECOMMENDED: google-workspace, pexels, pixabay + - AVAILABLE: vimeo, youtube-uploader +4. [Cria mapeamentos em cr_agent_mcps] +5. [Sugere colaborações: content-manager, copywriter] +6. [Reporta: "Agente video-editor configurado com 7 MCPs e 2 colaborações"] +``` + +## Limites + +- Não cria componentes novos (apenas relacionamentos) +- Sugestões baseadas em padrões podem não ser 100% precisas +- Análise de impacto limitada a relacionamentos directos +- Não propaga alterações automaticamente (requer confirmação) +- Depende de consistência das tabelas cr_* na BD diff --git a/crm-ops/.claude-plugin/plugin.json b/crm-ops/.claude-plugin/plugin.json index 57aa8ef..ee6af5a 100644 --- a/crm-ops/.claude-plugin/plugin.json +++ b/crm-ops/.claude-plugin/plugin.json @@ -1,12 +1,19 @@ { "name": "crm-ops", "description": "CRM operations, sales management, leads, customers, estimates, invoices, tickets and expense tracking with Desk CRM. Backed by 2 Dify KB datasets.", - "version": "1.0.0", + "version": "1.1.0", "author": { "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" }, "homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins", "license": "MIT", - "keywords": ["crm", "vendas", "leads", "facturacao", "tickets", "orcamento"] + "keywords": [ + "crm", + "vendas", + "leads", + "facturacao", + "tickets", + "orcamento" + ] } diff --git a/crm-ops/agents/budget-proposal-specialist.md b/crm-ops/agents/budget-proposal-specialist.md index 2467c2c..d05a376 100644 --- a/crm-ops/agents/budget-proposal-specialist.md +++ b/crm-ops/agents/budget-proposal-specialist.md @@ -5,6 +5,15 @@ role: Especialista em orçamentos e propostas comerciais domain: Business model: sonnet tools: Read, Write, Edit, Glob, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-workspace +recommended_mcps: + - moloni + - memory-supabase + - dify-kb skills: - _core - orcamento @@ -161,7 +170,17 @@ Você é um especialista comercial responsável por: | SEO/Conteúdo | 300€ - 1.500€/mês | Artigos, optimização, keywords, linkbuilding | | Manutenção | 150€ - 500€/mês | Updates, backups, monitoring, suporte | -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"orcamento proposta pricing" +mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"projectos estimativa custos" +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"desenvolvimento custos" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"orcamento proposta pricing" diff --git a/crm-ops/agents/lead-approach-strategist.md b/crm-ops/agents/lead-approach-strategist.md index 3fe89bf..1955f98 100644 --- a/crm-ops/agents/lead-approach-strategist.md +++ b/crm-ops/agents/lead-approach-strategist.md @@ -7,6 +7,15 @@ role: USAR PROATIVAMENTE para estratégia de abordagem de leads - análise de pe domain: Marketing model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-workspace +recommended_mcps: + - dify-kb + - memory-supabase + - imap skills: - _core desk_task: null @@ -66,7 +75,20 @@ Especialista em estratégia de abordagem de leads - análise de perfil, definiç - Script de chamada - Follow-up sequence -## Datasets Dify +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +- Marketing Digital Avancado (`76647e0f`) +- Copywriting e Persuasao (`7b8fec17`) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"" +mcp__notebooklm__notebook_query notebook_id:"7b8fec17-d34f-4e3f-a8c6-8231e51f6323" query:"" +``` + +### Dify KB (Secundario) + - Vendas - Marketing Digital - Copywriting @@ -125,7 +147,7 @@ Estrategista comercial especializado em análise de leads e criação de abordag ## MCPs Relevantes - `desk-crm-v3`: Dados de leads e histórico -- `dify-kb`: KB Vendas, Marketing Digital, Copywriting +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB Vendas, Marketing Digital, Copywriting - `memory-supabase`: Padrões de abordagem bem-sucedidos ## Colaboracao @@ -140,7 +162,11 @@ Estrategista comercial especializado em análise de leads e criação de abordag - Clientes, projectos, facturas, time tracking - Usage: `mcp__desk-crm-v3__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) + - Gemini 2.5 RAG + - Usage: `mcp__notebooklm__notebook_query` + +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/crm-ops/agents/lead-qualifier.md b/crm-ops/agents/lead-qualifier.md index 8002bc3..f134943 100644 --- a/crm-ops/agents/lead-qualifier.md +++ b/crm-ops/agents/lead-qualifier.md @@ -7,6 +7,14 @@ role: Lead Qualifier especializado em avaliacao e priorizacao de leads para gara domain: Marketing model: sonnet tools: Read, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 +recommended_mcps: + - dify-kb + - google-workspace + - memory-supabase skills: - _core desk_task: 1505 @@ -42,7 +50,17 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr - Nurturing de leads nao prontos para vendas - Manutencao da base de dados de leads actualizada -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"lead qualification scoring criteria" +mcp__notebooklm__notebook_query notebook_id:"df4688bb-c2c0-4aba-98c1-38c3b50a353c" query:"lead management pipeline" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"lead qualification scoring criteria" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"lead generation conversion funnel" @@ -102,7 +120,7 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr ## MCPs Relevantes - `desk-crm-v3`: Gestão de leads e pipeline -- `dify-kb`: KB Vendas (qualification), Marketing Digital +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB Vendas (qualification), Marketing Digital - `memory-supabase`: Histórico de qualificações bem-sucedidas ## Colaboracao @@ -116,7 +134,8 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr - Clientes, projectos, facturas, time tracking - Usage: `mcp__desk-crm-v3__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/crm-ops/agents/sales-manager.md b/crm-ops/agents/sales-manager.md index 1e74cf7..11618d0 100644 --- a/crm-ops/agents/sales-manager.md +++ b/crm-ops/agents/sales-manager.md @@ -82,7 +82,17 @@ Gestor comercial especializado em estrategias de vendas, gestao de CRM, qualific - Criar forecasting de receita e relatorios de performance - Coordenar equipas de vendas e territorios comerciais -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"estrategias comerciais leads conversao" +mcp__notebooklm__notebook_query notebook_id:"df4688bb-c2c0-4aba-98c1-38c3b50a353c" query:"CRM clientes pipeline" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"estrategias comerciais leads conversao" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"funil vendas qualificacao" diff --git a/crm-ops/knowledge/datasets.json b/crm-ops/knowledge/datasets.json index c276404..ec0bbb5 100644 --- a/crm-ops/knowledge/datasets.json +++ b/crm-ops/knowledge/datasets.json @@ -1,8 +1,48 @@ { - "description": "Dify KB datasets for CRM Operations domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "43354eb6-f0b2-40cc-aa53-44e375ab347c", "name": "PerfexCRM", "priority": 1, "document_count": 144, "word_count": 1547186}, - {"id": "bd65f36e-6004-4584-b478-129b2c21b4d2", "name": "Servicos Descomplicar", "priority": 1, "document_count": 11, "word_count": 1095103} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for CRM Operations domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", + "title": "Perfex CRM: Gestao de Clientes e Projetos", + "topics": [ + "perfexcrm" + ], + "maps_from_dify": "PerfexCRM" + }, + { + "id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", + "title": "Descomplicar: Marketing Digital", + "topics": [ + "servicos", + "descomplicar" + ], + "maps_from_dify": "Servicos Descomplicar" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "43354eb6-f0b2-40cc-aa53-44e375ab347c", + "name": "PerfexCRM", + "priority": 1, + "document_count": 144, + "word_count": 1547186 + }, + { + "id": "bd65f36e-6004-4584-b478-129b2c21b4d2", + "name": "Servicos Descomplicar", + "priority": 1, + "document_count": 11, + "word_count": 1095103 + } + ] + } + } +} \ No newline at end of file diff --git a/crm-ops/skills/auto-expense/SKILL.md b/crm-ops/skills/auto-expense/SKILL.md new file mode 100644 index 0000000..812f1b1 --- /dev/null +++ b/crm-ops/skills/auto-expense/SKILL.md @@ -0,0 +1,208 @@ +--- +name: auto-expense +description: > + Criacao automatica de despesas a partir de facturas detectadas no IMAP e tickets. Le ficheiros JSON de /imap-triage e /ticket-triage, extrai dados das facturas, cria despesas no Desk CRM com PDF. Use when "auto despesa", "processar facturas", "auto-expense", "despesas automaticas". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: finance +tags: [expense, auto, invoices, imap, tickets, pdf, desk-crm] +desk_task: 1710 +desk_project: 65 +allowed-tools: Read, Write, mcp__desk-crm-v3, mcp__imap, mcp__ssh-unified +mcps: desk-crm-v3, imap, ssh-unified +dependencies: + mcps: [desk-crm-v3, imap, ssh-unified] + skills: [imap-triage, ticket-triage] + files: + - /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md +triggers: + - "User asks to process invoices as expenses" + - "User mentions 'auto despesa', 'processar facturas'" + - "Invoked by /today orchestrator after /imap-triage and /ticket-triage" +--- + +# /auto-expense v1.0 + +Cria despesas automaticamente a partir de facturas detectadas pelo IMAP e tickets. + +--- + +## Protocolo + +### Passo 1: Carregar inputs + +``` +1. Ler ficheiro fornecedores: + Read: /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md + +2. Ler facturas IMAP (se existir): + Read: ~/.claude-work/today-imap-{date}.json → campo "facturas" + +3. Ler facturas tickets (se existir): + Read: ~/.claude-work/today-tickets-{date}.json → campo "facturas" + +4. Se nenhum ficheiro existe E invocado standalone: + → Perguntar ao utilizador: "processar IMAP, tickets ou ambos?" + → Se IMAP: executar /imap-triage primeiro + → Se tickets: executar /ticket-triage primeiro +``` + +### Passo 2: Para cada factura, processar + +``` +Para cada factura na lista: + +1. DETECTAR FORNECEDOR: + a. Fornecedor directo: dominio remetente na tabela + → categoria, tax e moeda ja conhecidos + b. Plataforma multi-fornecedor (toconline, stripe, paypal, fastspring, payproglobal): + → LER email completo → EXTRAIR emitente real + → Procurar emitente na tabela "Emitentes Conhecidos por Plataforma" + → SE desconhecido: registar como priority_flagged, PARAR este email + +2. LER EMAIL/TICKET: + - IMAP: imap_read_email(account, uid) → HTML + anexos + - Ticket: mcp__desk-crm-v3__get_ticket(ticket_id) → HTML + +3. EXTRAIR DO HTML: + - Valor (padroes: $XX.XX, XX,XX EUR, USD XX.XX, Total: XX.XX) + - Referencia/Invoice number + - Data da factura + +4. VERIFICAR DUPLICADO (2 camadas): + Camada 1 - Desk CRM: + Pesquisar: mesmo fornecedor + mesmo valor (±0.05) + mesma data (±3 dias) + Se match → NAO criar, registar como duplicado + +5. CRIAR DESPESA: + mcp__desk-crm-v3__create_expense({ + category: [cat_id da tabela], + amount: [valor], + date: [data factura YYYY-MM-DD], + expense_name: "[Fornecedor] - [Referencia]", + note: "Auto-criado via /auto-expense", + currency: [2=USD ou 3=EUR], + tax: [0 ou 1], + send_invoice_to_customer: 0 + }) +``` + +### Passo 3: PDF (se existir anexo) + +``` +a. GUARDAR LOCAL: + Path: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/MM-NomeMes/ + Criar pasta: mkdir -p + Nome: YYYY-MM-DD_Fornecedor_Referencia.pdf + Meses PT: 01-Janeiro, 02-Fevereiro, 03-Marco, 04-Abril, 05-Maio, 06-Junho, + 07-Julho, 08-Agosto, 09-Setembro, 10-Outubro, 11-Novembro, 12-Dezembro + +b. UPLOAD ao Desk servidor: + mcp__ssh-unified__sftp_upload(server="desk", local_path, remote_path="/tmp/") + mcp__ssh-unified__ssh_execute(server="desk", command=" + mkdir -p /home/ealmeida/desk24/uploads/expenses/{expense_id}/ + cp /tmp/{filename} /home/ealmeida/desk24/uploads/expenses/{expense_id}/ + chown -R ealmeida:ealmeida /home/ealmeida/desk24/uploads/expenses/{expense_id}/ + rm /tmp/{filename} + ") + +c. REGISTAR no Desk BD: + mcp__ssh-unified__ssh_execute(server="desk", command=" + mysql -u ealmeida -p'9qPRdCGGqM4o' ealmeida_desk24 -e \" + INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, attachment_key, staffid, dateadded) + VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', MD5(RAND()), 25, NOW()); + \" + ") + +d. LIMPAR temporarios +``` + +### Passo 4: Actualizar CSV + +``` +CSV Path: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/MAPA-DESPESAS-YYYY.csv +Formato linha: id_desk;data;categoria;fornecedor;descricao;valor;SIM;ficheiro;email;Auto /auto-expense +``` + +### Passo 5: Escrever output JSON + +``` +Escrever em ~/.claude-work/today-expenses-{date}.json: +{ + "despesas_criadas": [ + {"id": 1180, "fornecedor": "MEO", "valor": 76.26, "moeda": "EUR", "referencia": "FT A/861215955"} + ], + "duplicados": 0, + "flagged": [ + {"fornecedor": "Desconhecido", "nota": "TOConline - emitente desconhecido: XPTO LDA"} + ], + "erros": [], + "total_processadas": 1 +} +``` + +--- + +## Plataformas Multi-Fornecedor - Padroes de Extracao + +> Ver tabela completa em: Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md + +| Plataforma | Padrao no Subject/HTML | +|-----------|----------------------| +| TOConline | "Emitido por:", "Emitente:" no HTML | +| Stripe | "Receipt from [Empresa]" ou "Your receipt from [Empresa]" no subject | +| PayPal | "You paid [Empresa]" no subject | +| FastSpring | "Order from [Empresa]" no subject/corpo | +| PayPro Global | Nome produto/empresa no corpo | + +--- + +## Campos Criticos Desk CRM + +``` +currency = 3 (EUR) → Fornecedores EUR +currency = 2 (USD) → Fornecedores USD (manter valor original, NAO converter) +currency = 1 → NAO EXISTE - causa despesas invisiveis + +tax = 1 → Fornecedores PT (MEO, Moloni, PTisp, Staples) +tax = 0 → Fornecedores estrangeiros + +send_invoice_to_customer = 0 → OBRIGATORIO (sem default na BD) + +reference_no → coluna correcta (NAO "reference") +``` + +--- + +## Output Standalone + +```markdown +## Auto-Despesas - DD-MM-YYYY + +### Despesas Criadas (X) +| # Desk | Fornecedor | Valor | Moeda | Ref | PDF | +|--------|-----------|-------|-------|-----|-----| + +### Duplicados Detectados (Y) +- [Fornecedor] [Valor] - ja existe como #ID + +### Pendentes Revisao (Z) +- [Plataforma] - emitente desconhecido: [nome] +``` + +--- + +## Anti-Patterns + +- NUNCA usar currency=1 (nao existe) +- NUNCA converter USD para EUR (manter original com currency=2) +- NUNCA criar despesa sem verificar duplicado primeiro +- NUNCA omitir send_invoice_to_customer=0 +- SEMPRE ler o email/ticket HTML para extrair valor real (nunca assumir) +- SEMPRE incluir reference_no quando disponivel + +--- + +*Skill v1.0.0 | 04-03-2026 | Descomplicar®* diff --git a/crm-ops/skills/crm-admin/SKILL.md b/crm-ops/skills/crm-admin/SKILL.md index b26a876..f08e6a9 100644 --- a/crm-ops/skills/crm-admin/SKILL.md +++ b/crm-ops/skills/crm-admin/SKILL.md @@ -145,7 +145,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ```javascript // Pesquisar funcionalidades Perfex -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "43354eb6-f0b2-40cc-aa53-44e375ab347c", query: "modulo facturas automaticas" }) diff --git a/crm-ops/skills/expense/SKILL.md b/crm-ops/skills/expense/SKILL.md index 1941bb3..8f3d646 100644 --- a/crm-ops/skills/expense/SKILL.md +++ b/crm-ops/skills/expense/SKILL.md @@ -1,19 +1,19 @@ --- name: expense description: > - Gestão de despesas Desk CRM v1.3. Registar, categorizar e analisar despesas com verificação obrigatória de categorias existentes. Processa despesas de tickets de contabilidade com anexos PDF. Conversão USD→EUR automática. NUNCA cria categoria duplicada. Use when "despesa", "expense", "gasto", "custo", "categoria despesa", "registar despesa", "expense report", "processar tickets contabilidade". + Gestão de despesas Desk CRM v2.0. Documento PDF obrigatório para cada despesa. Registar, categorizar e analisar despesas com verificação de categorias e duplicados. Upload SFTP + arquivo mensal automatico. NUNCA cria sem PDF (excepto bypass explicito). Use when "despesa", "expense", "gasto", "custo", "categoria despesa", "registar despesa", "expense report", "processar tickets contabilidade", "recibo", "factura fornecedor". author: Descomplicar® Crescimento Digital -version: 1.5.0 -quality_score: 88 +version: 2.0.0 +quality_score: 90 user_invocable: true category: finance -tags: [expense, despesas, finance, categories, desk-crm, costs, reporting, tickets, receipts] -desk_task: null +tags: [expense, despesas, finance, categories, desk-crm, costs, reporting, tickets, receipts, pdf, sftp] +desk_task: 1710 desk_project: 65 -allowed-tools: Read, mcp__desk-crm-v3 -mcps: desk-crm-v3 +allowed-tools: Read, mcp__desk-crm-v3, mcp__ssh-unified +mcps: desk-crm-v3, ssh-unified dependencies: - mcps: [desk-crm-v3] + mcps: [desk-crm-v3, ssh-unified] triggers: - "User wants to create expense" - "User mentions 'despesa', 'expense', 'gasto', 'custo'" @@ -46,9 +46,9 @@ performance: Skill para gestão de despesas com verificação obrigatória de categorias existentes. ## Metadata -- **Version**: 1.3.0 +- **Version**: 2.0.0 - **Author**: Descomplicar -- **Date**: 2026-02-05 +- **Date**: 2026-02-12 - **Status**: Active --- @@ -92,40 +92,20 @@ Esta regra é INVIOLÁVEL. SEMPRE: --- -## Categorias Existentes (Referência) +## Categorias Activas (top 8 - consolidacao 12-02-2026) -| ID | Nome | Uso | -|----|------|-----| -| 1 | Telecomunicações | Net+móvel | -| 2 | Serviços Bancários | Comissões, taxas | -| 3 | Material de Escritório | Consumíveis | -| 4 | FB e Google ADS | Publicidade | -| 5 | E-mail MKT | ElasticEmail | -| 6 | Seguros | Apólices | -| 7 | Equipamento Informático e Audiovisual | Hardware | -| 8 | Remunerações | Salários pagos | -| 9 | Plugins e Recursos de Design | FULL, Freepik, etc | -| 10 | Alojamento de Servidores | Hetzner | -| 11 | Software Faturação | Moloni | -| 12 | Softwares Gestão | Everhour | -| 13 | Registo de Domínios | Ptisp, NameCheap | -| 14 | Impostos | SS, IRS, IVA | -| 15 | Planos Prestacionais | Pagamentos acordados | -| 16 | Manutenção e Suporte | Serviços técnicos | -| 17 | Outras | Não classificadas | -| 18 | Ofertas a Clientes | Brindes | -| 19 | Plataformas Armazenamento | Vimeo, MyAirBridge | -| 21 | Contabilidade | GONDOOFFICE | -| 22 | Salários e Vencimentos | Recibos vencimento | -| 23 | IRC - Imposto sobre Rendimento | Pagamentos IRC | -| 24 | IRS - Imposto sobre Rendimento | Retenções IRS | -| 25 | Contribuições Segurança Social | SS mensal | -| 26 | Hosting e Servidores | Alojamento web | -| 28 | Licenças Software | Painéis controlo | -| 29 | Reembolsos e Créditos | Valores recebidos | -| 38 | Serviços IA e APIs | Anthropic, OpenAI, CapSolver | +| ID | Nome | Fornecedores tipicos | +|----|------|---------------------| +| 1 | Telecomunicacoes | MEO | +| 4 | Alojamento web (Hosting) | Hetzner, CWP | +| 6 | Servicos Externos | Make/Celonis, Gamma | +| 14 | Subscricoes e Servicos Digitais | YouTube Premium, BdThemes | +| 28 | Licencas Software | Canva, Cursor, Descript, GitHub, Softaculous | +| 30 | Servicos Cloud e Infraestrutura | Google One, Google Workspace, ElasticEmail | +| 37 | Dominios | PTisp, Namecheap | +| 38 | Servicos IA e APIs | Anthropic, OpenRouter, CapSolver, Replicate | -**NOTA:** Esta lista pode estar desactualizada. SEMPRE usar `get_expense_categories()` para lista actual. +**NOTA:** Existem ~30 categorias na BD mas apenas 8 sao usadas regularmente. SEMPRE usar `get_expense_categories()` para lista completa e actual. --- @@ -133,24 +113,47 @@ Esta regra é INVIOLÁVEL. SEMPRE: ### 1. Registar Despesa +> **Gate PDF obrigatorio:** Sem documento, nao regista. Unica excepcao: bypass explicito do utilizador (AT/Salario sem recibo). + ``` -1. OBRIGATÓRIO: get_expense_categories(with_stats=true) -2. Identificar categoria correcta na lista -3. SE categoria não existe: PERGUNTAR antes de criar -4. SE dados vêm de PDFs: ler CADA ficheiro individualmente com pdftotext +1. GATE PDF: Verificar que existe ficheiro PDF + - SE utilizador forneceu PDF: prosseguir + - SE nao forneceu: PEDIR o ficheiro + - SE nao tem e pede bypass: PERGUNTAR "Confirmas despesa sem documento?" + - Bypass valido apenas para: AT, Salarios, transferencias bancarias +2. LER O PDF: Extrair dados reais do documento - NUNCA copiar valor de um PDF para outro, mesmo com nomes semelhantes - - Cada documento tem o seu valor próprio -5. Recolher dados: - - category_id (obrigatório) - - amount (obrigatório - valor REAL extraído do documento) - - date (obrigatório, YYYY-MM-DD) - - note (obrigatório, descrição) + - Cada documento tem o seu valor proprio +3. OBRIGATORIO: get_expense_categories(with_stats=true) +4. Identificar categoria correcta na lista + - SE categoria nao existe: PERGUNTAR antes de criar +5. VERIFICAR DUPLICADOS: + - get_expenses(search: "") + - Mesmo fornecedor + valor + data = duplicado + - Mesmo numero factura = duplicado +6. Recolher dados: + - category_id (obrigatorio) + - amount (obrigatorio - valor REAL extraido do documento) + - currency (obrigatorio - EUR=3, USD=2) + - date (obrigatorio, YYYY-MM-DD) + - note (obrigatorio, incluir numero factura) + - send_invoice_to_customer = 0 (obrigatorio na BD) - client_id (opcional) - project_id (opcional) - billable (opcional, default false) - tax (opcional) -6. create_expense com dados validados -7. Confirmar criação ao utilizador +7. CONFIRMAR com utilizador (mostrar resumo) +8. create_expense (ou SQL directo se MCP indisponivel) +9. UPLOAD PDF ao Desk via SFTP: + a. mkdir -p no servidor: /home/ealmeida/desk.descomplicar.pt/uploads/expenses/ + b. mcp__ssh-unified__sftp_upload(server:"desk", local_path, remote_path) + c. chown -R ealmeida:ealmeida + d. INSERT INTO tblfiles (rel_id, rel_type='expense', file_name, filetype='application/pdf', + visible_to_customer=0, staffid=1, contact_id=0, dateadded=NOW()) +10. ARQUIVO MENSAL: Mover PDF para pasta correspondente a data da factura: + /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/NN-NomeMes/ + (mkdir -p se pasta nao existir) +11. Confirmar criacao ao utilizador ``` ### 2. Criar Categoria (APENAS se necessário) @@ -209,14 +212,18 @@ Esta regra é INVIOLÁVEL. SEMPRE: - Do HTML do ticket (valor, data, referência) - OU usar script Python: python3 /home/ealmeida/scripts/extract_invoice_data.py {pdf_path} 6. APRESENTAR resumo ao utilizador e AGUARDAR confirmação -7. Após confirmação: - a. create_expense(category_id, amount, date, note, tax=1, reference) +7. Apos confirmacao: + a. SQL: INSERT INTO tblexpenses (..., send_invoice_to_customer, ...) VALUES (..., 0, ...) + OU create_expense via MCP (se disponivel) b. UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {id} - c. mkdir -p uploads/expenses/{expenseid} - d. cp uploads/ticket_attachments/{ticketid}/*.pdf uploads/expenses/{expenseid}/ - e. chown -R ealmeida:ealmeida uploads/expenses/{expenseid} - f. INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, ...) -8. Confirmar ao utilizador e passar ao próximo + c. mcp__ssh-unified__ssh_execute: mkdir -p uploads/expenses/{expenseid} + d. mcp__ssh-unified__sftp_upload: PDF para uploads/expenses/{expenseid}/ + e. mcp__ssh-unified__ssh_execute: chown -R ealmeida:ealmeida uploads/expenses/{expenseid} + f. SQL: INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, + visible_to_customer, staffid, contact_id, dateadded) + VALUES ({id}, 'expense', '{file}', 'application/pdf', 0, 1, 0, NOW()) + g. Mover PDF para arquivo mensal: Contabilidade/YYYY/NN-NomeMes/ +8. Confirmar ao utilizador e passar ao proximo ``` #### Script Python para Extracção de PDFs @@ -229,22 +236,17 @@ python3 /home/ealmeida/scripts/extract_invoice_data.py /path/to/invoice.pdf Retorna JSON com: vendor, cat_id, total, date, invoice, currency, text -#### Conversão USD → EUR +#### Moedas e Valores -> **OBRIGATÓRIO:** Todas as despesas devem ser registadas em EUR. +> **Despesas em USD:** Manter valor original em USD com `currency = 2`. **Nao converter** manualmente. +> **Despesas em EUR:** Usar `currency = 3`. -Taxa aproximada: **1 USD ≈ 0.92 EUR** (verificar taxa actual se necessário) +| Moeda | currency ID | Exemplo | +|-------|------------|---------| +| EUR | **3** | Anthropic 180.00 EUR | +| USD | **2** | Cursor 20.00 USD | -Exemplos: -- $19.99 USD → €18.39 EUR -- $100.00 USD → €92.00 EUR - -```sql --- Após criar despesa em USD, actualizar para EUR -UPDATE tblexpenses SET amount = {valor_eur}, currency = 2 WHERE id = {expense_id}; -``` - -> **CRÍTICO:** O ID da moeda EUR é **2** (não 1). Usar currency=1 faz despesas não aparecerem nos relatórios. +> **CRITICO:** `currency = 1` nao existe e causa despesas invisiveis nos relatorios. SEMPRE usar 2 (USD) ou 3 (EUR). #### Tickets a Saltar @@ -276,43 +278,60 @@ Se utilizador pedir "criar todas" ou "processar em lote": 5. Copiar PDFs em batch 6. Registar ficheiros em batch via SQL INSERT múltiplo +#### Mapeamento Fornecedor → Categoria (consolidado 12-02-2026) + +| Fornecedor | Categoria ID | Nome | +|-----------|-------------|------| +| Anthropic, OpenRouter, CapSolver, Replicate | 38 | Servicos IA e APIs | +| Canva, Cursor, Descript, GitHub, Softaculous, CWP | 28 | Licencas Software | +| Google One, Google Workspace, ElasticEmail | 30 | Servicos Cloud e Infraestrutura | +| Hetzner | 4 | Alojamento web (Hosting) | +| MEO | 1 | Telecomunicacoes | +| PTisp, Namecheap | 37 | Dominios | +| Make/Celonis, Gamma | 6 | Servicos Externos | +| YouTube Premium, BdThemes | 14 | Subscricoes e Servicos Digitais | + #### Mapeamento Email → Categoria -| Domínio Email | Categoria ID | Nome | -|---------------|--------------|------| -| anthropic.com | 38 | Serviços IA e APIs | -| openai.com | 38 | Serviços IA e APIs | -| payproglobal.com | 38 | Serviços IA e APIs (CapSolver) | -| elasticemail.com | 5 | E-mail MKT | -| hetzner.com | 10 | Alojamento de Servidores | -| meoempresas.pt | 1 | Telecomunicações | -| centos-webpanel.com | 28 | Licenças Software | -| canva.com | 9 | Plugins e Recursos de Design | -| freepik.com | 9 | Plugins e Recursos de Design | -| namecheap.com | 13 | Registo de Domínios | -| ptisp.pt | 13 | Registo de Domínios | -| vimeo.com | 19 | Plataformas Armazenamento | -| everhour.com | 12 | Softwares Gestão | -| cursor.com | 38 | Serviços IA e APIs (Cursor) | +| Dominio Email | Categoria ID | Fornecedor | +|---------------|--------------|------------| +| anthropic.com | 38 | Anthropic | +| openrouter.ai | 38 | OpenRouter | +| payproglobal.com | 38 | CapSolver | +| replicate.com | 38 | Replicate | +| cursor.com, anysphere.dev | 28 | Cursor | +| canva.com | 28 | Canva | +| descript.com | 28 | Descript | +| github.com | 28 | GitHub | +| softaculous.com | 28 | Softaculous | +| centos-webpanel.com | 28 | CWP | +| elasticemail.com | 30 | ElasticEmail | +| google.com (One/Workspace) | 30 | Google Cloud | +| hetzner.com | 4 | Hetzner | +| meoempresas.pt | 1 | MEO | +| namecheap.com | 37 | Namecheap | +| ptisp.pt | 37 | PTisp | +| make.com, celonis.com | 6 | Make/Celonis | +| gamma.app | 6 | Gamma | -> **NOTA:** `moloni.com` NÃO incluído - é plataforma de facturação, emails podem ser de qualquer fornecedor. Verificar conteúdo do PDF para identificar o fornecedor real. +> **NOTA:** `moloni.com` NAO incluido - e plataforma de facturacao, emails podem ser de qualquer fornecedor. -#### Mapeamento Fornecedor (PDF) → Categoria +#### Mapeamento Padrao PDF → Categoria -Para documentos financeiros transferidos (não tickets), identificar fornecedor pelo conteúdo do PDF: +Para documentos financeiros, identificar fornecedor pelo conteudo do PDF: -| Padrão no PDF | Fornecedor | Categoria ID | Nome | +| Padrao no PDF | Fornecedor | Categoria ID | Nome | |---------------|-----------|--------------|------| -| `Gondooffice`, `Cubic Choices`, `GONDOOFFICE` | Gondooffice (Cubic Choices) | 21 | Contabilidade | -| `Autoridade Tributária`, `emiteDoc`, `AT -` | AT - Autoridade Tributária | 15 | Planos Prestacionais | -| `Staples`, `STAPLES`, `STP_ECOFACTURA` | Staples | 3 | Material de Escritório | -| `MEO`, `Serviços _ Compras`, `meoempresas` | MEO Empresas | 1 | Telecomunicações | -| `TOConline`, `metta`, `Recibo de Vencimento` | Salário/Vencimento | 22 | Salários e Vencimentos | -| `NOS Comunicações`, `NOS ` | NOS | 1 | Telecomunicações | -| `Vodafone` | Vodafone | 1 | Telecomunicações | -| `EDP`, `E-REDES` | EDP | 17 | Outras | -| `Segurança Social`, `Seg. Social` | Segurança Social | 25 | Contribuições SS | -| `Cursor`, `Anysphere`, `cursor.com` | Cursor (Anysphere) | 38 | Serviços IA e APIs | +| `Gondooffice`, `Cubic Choices` | Gondooffice | 21 | Contabilidade | +| `Autoridade Tributaria`, `emiteDoc`, `AT -` | AT | 15 | Planos Prestacionais | +| `Staples`, `STP_ECOFACTURA` | Staples | 3 | Material de Escritorio | +| `MEO`, `meoempresas` | MEO | 1 | Telecomunicacoes | +| `TOConline`, `Recibo de Vencimento` | Salario | 22 | Salarios e Vencimentos | +| `Seguranca Social` | SS | 25 | Contribuicoes SS | +| `Cursor`, `Anysphere` | Cursor | 28 | Licencas Software | +| `Anthropic` | Anthropic | 38 | Servicos IA e APIs | +| `Hetzner` | Hetzner | 4 | Alojamento web (Hosting) | +| `ElasticEmail` | ElasticEmail | 30 | Servicos Cloud e Infraestrutura | #### Extracção de Dados de PDFs @@ -353,9 +372,9 @@ SELECT id, file_name, filetype FROM tblticket_attachments WHERE ticketid = {ID} -- 3. Actualizar nome fornecedor UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {expense_id} --- 4. Registar anexo na despesa -INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, visible_to_customer, staffid, dateadded) -VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', 0, 1, NOW()) +-- 4. Registar anexo na despesa (contact_id obrigatorio!) +INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, visible_to_customer, staffid, contact_id, dateadded) +VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', 0, 1, 0, NOW()) ``` #### Campos para Rastreio de Duplicados @@ -415,8 +434,9 @@ VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', 0, 1, NOW()) | project_id | number | - | Projecto associado | | billable | boolean | - | Facturável (default: false) | | tax2 | number | - | Segunda taxa imposto | -| currency | number | - | ID moeda (**EUR = 2**) | -| payment_mode | string | - | Método pagamento | +| currency | number | ✓ | ID moeda (**EUR = 3**, USD = 2) | +| payment_mode | string | - | Metodo pagamento (default: 'online') | +| send_invoice_to_customer | number | ✓ | **Obrigatorio na BD** (sem default). Usar sempre **0** | ### Campo expense_name (via SQL) @@ -436,9 +456,10 @@ UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {expense_id}; | ID | Nome | Símbolo | Default | |----|------|---------|---------| -| 2 | EUR | € | Sim | +| 2 | USD | $ | Nao | +| 3 | EUR | € | Sim | -> **CRÍTICO:** Usar sempre `currency = 2` para EUR. O ID 1 não existe e causa despesas invisíveis nos relatórios. +> **CRITICO:** EUR = **3**, USD = **2**. Usar currency=1 causa despesas invisiveis nos relatorios. Para despesas em USD manter valor original com currency=2 (nao converter). --- @@ -521,6 +542,23 @@ User: Registar 150€ de domínio para cliente TechStart ## Changelog +### v2.0.0 (2026-02-12) - Sistema Robusto 2026 +- **Gate PDF obrigatorio:** Despesa sem documento nao e registada (bypass explicito para AT/Salario) +- **Upload SFTP:** Substituido `cp` local por `mcp__ssh-unified__sftp_upload` (Regra #41) +- **Arquivo mensal:** PDF organizado em `Contabilidade/YYYY/NN-NomeMes/` automaticamente +- **Campo `send_invoice_to_customer`:** Documentado como obrigatorio na BD (valor 0) +- **Correccao currency:** EUR = **3** (nao 2), USD = **2**. Corrigido em toda a skill +- **Categorias alinhadas com consolidacao:** 8 categorias activas com mapeamento correcto + - Cursor/Canva/Descript/GitHub/Softaculous/CWP → 28 (Licencas Software) + - Hetzner → 4 (Alojamento web) + - ElasticEmail/Google → 30 (Servicos Cloud) + - PTisp/Namecheap → 37 (Dominios) + - YouTube/BdThemes → 14 (Subscricoes) + - Make/Gamma → 6 (Servicos Externos) +- **Verificacao duplicados reforçada:** Integrada no passo 5 do protocolo +- **MCP ssh-unified adicionado** a dependencias +- **Procedimento:** `06-Operacoes/Procedimentos/PROC-Skill-Expense.md` + ### v1.5.0 (2026-02-05) - Adicionado mapeamento **Cursor (Anysphere)** → categoria 38 (Serviços IA e APIs) - Email: `cursor.com` @@ -569,5 +607,5 @@ User: Registar 150€ de domínio para cliente TechStart --- **Criado:** 2026-02-05 -**Actualizado:** 2026-02-05 -**Motivo:** Prevenção de categorias duplicadas + processamento de tickets +**Actualizado:** 2026-02-12 +**Motivo:** Sistema robusto 2026 - PDF obrigatorio, SFTP, arquivo mensal, correccoes consolidacao diff --git a/crm-ops/skills/orcamento/SKILL.md b/crm-ops/skills/orcamento/SKILL.md index 2b75097..1a1745e 100644 --- a/crm-ops/skills/orcamento/SKILL.md +++ b/crm-ops/skills/orcamento/SKILL.md @@ -411,7 +411,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ```javascript // Pesquisar serviços e preços -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "bd65f36e-6004-4584-b478-129b2c21b4d2", query: "pacote website ecommerce" }) diff --git a/crm-ops/skills/ticket-triage/SKILL.md b/crm-ops/skills/ticket-triage/SKILL.md new file mode 100644 index 0000000..b755bbc --- /dev/null +++ b/crm-ops/skills/ticket-triage/SKILL.md @@ -0,0 +1,189 @@ +--- +name: ticket-triage +description: > + Auto-processamento de tickets abertos no Desk CRM. Fecha SPAM, identifica facturas para /auto-expense, protege notificacoes de sistema. Use when "tickets", "triagem tickets", "limpar tickets", "ticket triage", "processar tickets". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: crm +tags: [tickets, triage, spam, invoices, notifications, desk-crm] +desk_task: 1710 +desk_project: 65 +allowed-tools: Read, Write, mcp__desk-crm-v3 +mcps: desk-crm-v3 +dependencies: + mcps: [desk-crm-v3] + files: + - /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md +triggers: + - "User asks to process tickets" + - "User mentions 'tickets', 'triagem', 'limpar tickets'" + - "Invoked by /today orchestrator" +--- + +# /ticket-triage v1.0 + +Auto-processamento de tickets abertos no Desk CRM. + +--- + +## Protocolo + +### Passo 1: Recolher tickets abertos + +``` +mcp__desk-crm-v3__get_tickets({ status: 1, limit: 50 }) +``` + +### Passo 2: Carregar tabela de fornecedores + +``` +Read: /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md +Extrair dominios de fornecedores e plataformas multi-fornecedor +``` + +### Passo 3: Classificar cada ticket + +> Aplicar por ordem de prioridade. Primeiro match ganha. + +``` +Para cada ticket aberto: + +1. NOTIFICACAO SISTEMA? (verificar PRIMEIRO) + Subject contem padrao protegido E remetente conhecido + → NAO fechar. Guardar para "Requer Accao" no output. + +2. DESPESA? (verificar SEGUNDO) + Email do remetente contem dominio de fornecedor conhecido + Subject contem: payment, pagamento, invoice, factura, recibo, receipt, paid, renewed + → Registar no output como factura para /auto-expense + → Fechar ticket (status 5) com nota "Factura flagged para /auto-expense" + +3. SPAM? (verificar TERCEIRO) + → Fechar (status 5) com motivo + +4. NEWSLETTER/INFORMATIVO? + → Fechar (status 5) com motivo + +5. NENHUM MATCH + → Manter aberto para revisao +``` + +### Passo 4: Escrever output JSON + +``` +Escrever em ~/.claude-work/today-tickets-{date}.json: +{ + "spam_fechados": 3, + "newsletters_fechadas": 1, + "facturas": [ + {"ticket_id": 456, "fornecedor": "Anthropic", "subject": "Receipt", "sender": "..."} + ], + "notificacoes": [ + {"ticket_id": 789, "subject": "Security Alert", "sender": "..."} + ], + "mantidos_abertos": 2, + "total_processados": 12 +} +``` + +--- + +## Padroes SPAM (fechar status 5) + +``` +Keywords no subject (case-insensitive): +- Guest Post, SEO services, backlinks, partnership +- link building, dofollow, collaboration opportunity +- Purchase Order (de desconhecidos) +- WeTransfer (phishing), Prestige Awards +- lottery, winner, urgent money, bitcoin +``` + +--- + +## Notificacoes de Sistema (NUNCA auto-fechar) + +``` +Padroes protegidos no subject (case-insensitive): +- Legal Update, Legal Notice, Policy Change, Policy Update +- Deprecation, End of Life, EOL, Breaking Change +- Migration Required, Action Required, Action Needed +- Security Alert, Security Advisory, Security Notice +- API Change, API Update, Terms Update, Terms Change +- Service Disruption, Maintenance Required +- Compliance, GDPR, Data Processing +- Infrastructure Change, Platform Update, Product Update +``` + +--- + +## Tickets a Saltar (NAO criar despesa) + +| Tipo | Indicador | Accao | +|------|-----------|-------| +| Payment Confirmation | "Payment Confirmation" de CWP | Fechar (confirmacao, nao factura) | +| Payment Receipt | "Payment Was Successfully Processed" de elasticemail | Fechar (recibo sem dados) | +| Notificacao bancaria | "Notificacao de transferencia" de bancobpi | Fechar | +| Duplicado | Mesmo subject que ticket ja processado | Fechar como duplicado | + +> **Nota:** Receipts de Anthropic e Canva contem invoice number e valor -> SAO despesas. +> "Receipt" so e motivo para saltar quando e apenas confirmacao sem dados de factura. + +--- + +## Tickets para ELIMINAR (notificacoes sem valor) + +``` +Subject contem: +- "Your Elastic Email Account was successfully re-charged" +- "Account re-charged", "Auto-recharge successful" +- "Credit added to your account" +- "[BOT] Ativacao realizada com sucesso" + +→ mcp__desk-crm-v3__delete_ticket({ ticket_id: ID, confirm: true }) +``` + +--- + +## Remetentes Conhecidos (whitelist facturas) + +> Ver tabela completa em: Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md +> Verificar pelo DOMINIO do email remetente, nao pelo departamento. + +--- + +## Output Standalone + +```markdown +## Triagem Tickets - DD-MM-YYYY + +**Total: X tickets processados** + +### SPAM Fechado (Y) +- #123 - "Guest Post SEO" - spam@dominio.com + +### Facturas Identificadas (Z) +- #456 - "Receipt" - billing@anthropic.com -> /auto-expense + +### Notificacoes Sistema (W) +- #789 - "Security Alert" - noreply@n8n.io -> requer accao + +### Mantidos Abertos (N) +- #012 - "Pedido de suporte" - cliente@empresa.pt +``` + +--- + +## Anti-Patterns + +- NUNCA eliminar tickets de remetentes desconhecidos com facturas +- NUNCA fechar notificacoes protegidas automaticamente +- NUNCA processar despesas directamente (delegar para /auto-expense) +- SEMPRE verificar dominio do remetente na tabela de fornecedores +- SEMPRE usar staff_id: 25 (AikTop) nos comentarios + +--- + +*Skill v1.0.0 | 04-03-2026 | Descomplicar®* diff --git a/design-media/.claude-plugin/plugin.json b/design-media/.claude-plugin/plugin.json index 5849fd6..cb4db25 100644 --- a/design-media/.claude-plugin/plugin.json +++ b/design-media/.claude-plugin/plugin.json @@ -1,12 +1,12 @@ { "name": "design-media", - "description": "UI/UX design, web design, video production with Remotion and PowerPoint generation. Backed by 3 Dify KB datasets.", - "version": "1.0.0", + "description": "Motor de design profissional multi-marca. UI/UX, web design, apresentacoes AI, infograficos, social media, video Remotion. 5 MCPs: Presenton, Penpot, Stitch, Figma, Design-Engine.", + "version": "2.0.0", "author": { "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" }, "homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins", "license": "MIT", - "keywords": ["design", "ui-ux", "video", "remotion", "powerpoint", "criatividade"] + "keywords": ["design", "ui-ux", "video", "remotion", "powerpoint", "criatividade", "presenton", "penpot", "stitch", "figma", "brand", "infografico", "social-media", "logo"] } diff --git a/design-media/agents/design-critic.md b/design-media/agents/design-critic.md new file mode 100644 index 0000000..d5c1cb4 --- /dev/null +++ b/design-media/agents/design-critic.md @@ -0,0 +1,83 @@ +--- +name: design-critic +description: > + Avalia qualidade de outputs de design em 5 dimensoes (0-10). Re-itera se score < 7. Garante qualidade profissional antes de entregar. + Use for design quality assessment, brand compliance verification, visual quality review, + or when evaluating generated designs before presenting to client. +author: Descomplicar Crescimento Digital +version: 2.0.0 +category: design +model: sonnet +tools: Read, Write, Edit, Glob, Grep, ToolSearch + +primary_mcps: + - design-engine +recommended_mcps: + - stitch + - design-systems +allowed-mcps: desk-crm-v3 +skills: + - _core + - ui-ux-pro-max +desk_task: 1518 +--- + +# Design Critic - Avaliacao de Qualidade + +Avalia outputs de design em 5 dimensoes e decide se aprovar ou re-iterar. + +## Responsabilidades +- Avaliar cada output gerado em 5 dimensoes (0-10) +- Identificar problemas especificos e sugerir correccoes +- Re-iterar com generator se score insuficiente (max 3 iteracoes) +- Aprovar outputs com score >= 7/10 em todas as dimensoes +- Rankear variacoes e recomendar melhor opcao + +## 5 Dimensoes de Avaliacao + +| Dimensao | Peso | O que avalia | +|---|---|---| +| **Fidelidade ao pedido** | 25% | Corresponde ao que foi pedido? Conteudo correcto? | +| **Concisao visual** | 20% | Informacao clara sem ruido? Hierarquia visual? | +| **Legibilidade** | 20% | Texto legivel? Contraste adequado? Tamanho adequado? | +| **Profissionalismo** | 20% | Aspecto profissional? Alinhamentos? Espacamento? | +| **Brand compliance** | 15% | Cores da marca? Fontes correctas? Logo presente? | + +## Score System + +``` +Score = (fidelidade * 0.25) + (concisao * 0.20) + (legibilidade * 0.20) + + (profissionalismo * 0.20) + (brand * 0.15) + +Score >= 7.0 -> APROVAR (apresentar ao utilizador) +Score 5.0-6.9 -> RE-ITERAR (feedback especifico ao generator) +Score < 5.0 -> REJEITAR (novo prompt ao architect) +``` + +## Formato de Avaliacao + +```json +{ + "output_id": "design-123", + "scores": { + "fidelidade": 8, + "concisao": 7, + "legibilidade": 9, + "profissionalismo": 7, + "brand_compliance": 8 + }, + "weighted_score": 7.75, + "verdict": "APROVAR", + "feedback": "Bom equilibrio visual. Logo bem posicionado.", + "issues": [], + "suggestions": ["Aumentar contraste no subtitulo"] +} +``` + +## Regras + +1. **Objectividade** - avaliar com criterios concretos, nao preferencias +2. **Max 3 iteracoes** - se apos 3 rondas score < 7, entregar melhor versao com nota +3. **Feedback actionable** - "aumentar contraste" nao "melhorar cores" +4. **Brand e critico** - se marca fornecida, brand compliance pesa mais +5. **Sem brand** - ignorar dimensao brand_compliance (peso redistribuido) diff --git a/design-media/agents/design-generator.md b/design-media/agents/design-generator.md new file mode 100644 index 0000000..2d7ec28 --- /dev/null +++ b/design-media/agents/design-generator.md @@ -0,0 +1,96 @@ +--- +name: design-generator +description: > + Executa geracao de design via MCPs. Gera imagens (Fibo/Gemini), compoe layouts (Penpot), cria apresentacoes (Presenton) e web pages (Stitch). + Use for image generation, layout composition, presentation creation, export to PNG/SVG/PDF/PPTX, + or when executing design prompts from the prompt architect. +author: Descomplicar Crescimento Digital +version: 2.0.0 +category: design +model: sonnet +tools: Read, Write, Edit, Glob, Grep, ToolSearch + +primary_mcps: + - design-engine + - presenton + - penpot + - stitch +recommended_mcps: + - pixabay + - pexels +allowed-mcps: desk-crm-v3 +skills: + - _core + - pptx-generator + - remotion-video +desk_task: 1518 +--- + +# Design Generator - Execucao + +Executa prompts e planos de design, gerando outputs concretos via MCPs. + +## Responsabilidades +- Executar prompts de imagem via design-engine (Fibo/Gemini) +- Compor layouts no Penpot (frames, texto, imagens, brand) +- Gerar apresentacoes no Presenton (prompt ou JSON) +- Criar web pages via Stitch +- Gerar 3-5 variacoes por pedido +- Exportar para formato final (PNG/SVG/PDF/PPTX/HTML) +- Organizar outputs em `outputs/design-[timestamp]/` + +## Pipelines de Execucao + +### Pipeline Presenton (apresentacoes) +``` +1. generate_presentation(content, tone, template, language) + OU generate_from_json(slides) +2. Aguardar processamento (async) +3. export_presentation(id, format="pptx") +4. Guardar PPTX em outputs/ +``` + +### Pipeline Penpot (composicao visual) +``` +1. Criar projecto/frame com dimensoes correctas +2. Adicionar elementos: texto (brand fonts), shapes, imagens +3. Posicionar elementos conforme layout plan +4. Aplicar cores da marca +5. export_object(frame_id, format="png") +``` + +### Pipeline Stitch (web design) +``` +1. Gerar screen com prompt optimizado +2. Extrair Design DNA se marca fornecida +3. Iterar com feedback (stitch-loop) +4. Exportar HTML/CSS/Astro +``` + +### Pipeline Imagens AI +``` +1. generate_image_fibo(prompt, aspect_ratio) + OU generate_image_gemini(prompt, size) +2. SE necessario: remove_background(image_path) +3. Guardar em outputs/ +4. Gerar 3-5 variacoes com prompts variados +``` + +## Dimensoes Social Media + +| Formato | Dimensoes | Aspecto | +|---|---|---| +| Instagram Post | 1080x1080 | 1:1 | +| Instagram Story | 1080x1920 | 9:16 | +| LinkedIn Post | 1200x628 | ~2:1 | +| YouTube Thumbnail | 1280x720 | 16:9 | +| OG Image | 1200x630 | ~2:1 | +| Facebook Cover | 820x312 | ~3:1 | + +## Regras + +1. **3-5 variacoes** - nunca entregar opcao unica +2. **Outputs organizados** - pasta `outputs/design-[timestamp]/` com README +3. **Brand aplicada** - cores, fontes e logo em todos os outputs +4. **Formatos correctos** - social media com dimensoes exactas +5. **Fallback** - se motor principal falhar, usar alternativa (ex: python-pptx) diff --git a/design-media/agents/design-lead.md b/design-media/agents/design-lead.md new file mode 100644 index 0000000..63b94ec --- /dev/null +++ b/design-media/agents/design-lead.md @@ -0,0 +1,81 @@ +--- +name: design-lead +description: > + Orquestrador de design profissional multi-marca. Recebe pedidos, carrega brand pack, delega a agentes especializados e apresenta resultados. + Use for design orchestration, brand-aware design, multi-format output, + or when user mentions "design", "criar design", "apresentacao", "infografico", "logo", "identidade visual", "brand", "/design". +author: Descomplicar Crescimento Digital +version: 2.0.0 +category: design +model: sonnet +tools: Read, Write, Edit, Glob, Grep, ToolSearch + +primary_mcps: + - design-engine + - presenton + - penpot + - stitch +recommended_mcps: + - figma + - pixabay + - pexels +allowed-mcps: desk-crm-v3, google-workspace, powerpoint +skills: + - _core + - design + - ui-ux-pro-max + - pptx-generator +desk_task: 1518 +--- + +# Design Lead - Orquestrador de Design + +Agente orquestrador do motor de design profissional. Nunca gera outputs directamente - delega a agentes especializados e coordena o pipeline completo. + +## Responsabilidades +- Receber e interpretar pedidos de design +- Carregar brand pack do cliente via `brand_load` +- Fazer perguntas de clarificacao quando necessario +- Delegar a agentes especializados (researcher, prompt-architect, generator, critic) +- Apresentar resultados finais rankados por qualidade +- Garantir brand compliance em todos os outputs + +## Pipeline de Design + +``` +1. RECEBER pedido do utilizador +2. IDENTIFICAR tipo de output (apresentacao, infografico, social, web, logo, brand) +3. CARREGAR brand pack (se --brand especificado) +4. SE referencia visual -> DELEGAR a design-researcher +5. DELEGAR a design-prompt-architect (routing motor + prompts) +6. DELEGAR a design-generator (execucao) +7. DELEGAR a design-critic (avaliacao) +8. SE score < 7 -> re-iterar (max 3x) +9. APRESENTAR resultados ao utilizador +``` + +## Routing de Motores + +| Tipo | Motor principal | Fallback | +|---|---|---| +| Apresentacao, slides, proposta | Presenton (slide.descomplicar.pt) | python-pptx | +| Infografico, poster, flyer | Penpot (pen.descomplicar.pt) + AI | HTML via chrome | +| Social media (IG, LinkedIn, YT) | Penpot (dimensoes correctas) | Stitch | +| Landing page, web page, UI | Stitch (Google) | HTML manual | +| Logo, icone, marca | Penpot + Fibo | SVG manual | +| Identidade visual completa | Todos | - | +| Referencia visual (URL/Figma) | Figma MCP + screenshots | - | + +## Regras + +1. **Nunca gerar directamente** - sempre delegar a agentes especializados +2. **Sempre carregar brand** quando disponivel +3. **Perguntar antes de assumir** - tipo, estilo, publico-alvo, dimensoes +4. **3-5 variacoes** - nunca entregar opcao unica +5. **Score minimo 7/10** antes de apresentar ao utilizador + +## Colaboracao + +- Reports to: Emanuel (utilizador) +- Delega a: design-researcher, design-prompt-architect, design-generator, design-critic +- Colabora com: ui-designer, web-designer (agentes existentes) diff --git a/design-media/agents/design-prompt-architect.md b/design-media/agents/design-prompt-architect.md new file mode 100644 index 0000000..e133ca6 --- /dev/null +++ b/design-media/agents/design-prompt-architect.md @@ -0,0 +1,108 @@ +--- +name: design-prompt-architect +description: > + Arquitecto de prompts e routing de motores de design. Recebe style brief + brand pack, escolhe motor (Presenton/Penpot/Stitch) e cria prompts optimizados. + Use for design prompt creation, engine routing, presentation structure, layout planning, + or when translating design requirements into executable prompts. +author: Descomplicar Crescimento Digital +version: 2.0.0 +category: design +model: sonnet +tools: Read, Write, Edit, Glob, Grep, ToolSearch + +primary_mcps: + - design-engine + - presenton + - penpot + - stitch +recommended_mcps: + - figma +allowed-mcps: desk-crm-v3 +skills: + - _core + - ui-ux-pro-max + - pptx-generator +desk_task: 1518 +--- + +# Design Prompt Architect - Routing e Prompts + +Recebe style brief e brand pack, escolhe o motor de design correcto e cria prompts optimizados para cada pipeline. + +## Responsabilidades +- Analisar tipo de output pedido +- Escolher motor(es) de design adequados +- Criar prompts optimizados para cada motor +- Aplicar constrains da marca nos prompts +- Estruturar slides JSON para Presenton +- Planear layouts para Penpot + +## Routing por Motor + +### Presenton (apresentacoes) +``` +Input: tema, tone, n_slides, brand +Output: prompt narrativo OU slides JSON estruturado +Parametros: tone=professional|casual|sales_pitch|educational +``` + +### Penpot (composicao visual) +``` +Input: tipo, dimensoes, brand, elementos +Output: plano de layout (frames, posicoes, elementos) +Pipeline: criar frame -> adicionar elementos -> aplicar brand -> exportar +``` + +### Stitch (web design) +``` +Input: descricao pagina, estilo, brand +Output: prompt optimizado Stitch com Design DNA +Pipeline: gerar screen -> iterar -> exportar HTML/CSS +``` + +### Fibo/Gemini (imagens AI) +``` +Input: descricao imagem, estilo, aspect_ratio +Output Fibo: prompt JSON estruturado (composicao precisa) +Output Gemini: prompt narrativo (bom para texto em imagens) +``` + +## Formato Prompt por Motor + +### Presenton - Prompt Narrativo +``` +"Apresentacao profissional sobre [tema]. +Tom: [tone]. [n_slides] slides. +Cores da marca: [primary] e [secondary]. +Incluir: introducao, problema, solucao, beneficios, CTA. +Idioma: Portugues europeu." +``` + +### Presenton - JSON Estruturado +```json +[ + {"title": "Titulo", "content": "Bullets", "layout": "title_slide", "notes": ""}, + {"title": "Contexto", "content": "Dados", "layout": "two_column", "notes": ""} +] +``` + +### Fibo - Prompt JSON +``` +"Professional infographic about [tema], clean design, +[primary_color] and [secondary_color] color scheme, +[aspect_ratio], high quality, corporate style" +``` + +### Gemini - Prompt Narrativo +``` +"Create a [tipo] with the text '[texto]' prominently displayed. +Style: modern, professional. Colors: [primary] on [background]. +Font style: bold sans-serif. High resolution." +``` + +## Regras + +1. **Brand always first** - cores, fontes e logo da marca em todos os prompts +2. **Motor adequado** - nao usar Gemini para layouts, nao usar Penpot para texto AI +3. **Dimensoes exactas** - sempre especificar para social media +4. **Fallback plan** - sempre ter alternativa se motor principal falhar diff --git a/design-media/agents/design-researcher.md b/design-media/agents/design-researcher.md new file mode 100644 index 0000000..9b863e6 --- /dev/null +++ b/design-media/agents/design-researcher.md @@ -0,0 +1,78 @@ +--- +name: design-researcher +description: > + Analisa referencias visuais via Figma MCP, Stitch DNA, screenshots e UIUX Pro Max. Extrai paletas, tipografia, composicao e mood. + Use for visual reference analysis, design DNA extraction, style analysis, competitive design research, + or when user provides Figma links, design URLs, or visual references. +author: Descomplicar Crescimento Digital +version: 2.0.0 +category: design +model: sonnet +tools: Read, Write, Edit, Glob, Grep, ToolSearch + +primary_mcps: + - figma + - stitch +recommended_mcps: + - design-engine + - pixabay + - pexels +allowed-mcps: desk-crm-v3, design-systems +skills: + - _core + - ui-ux-pro-max +desk_task: 1518 +--- + +# Design Researcher - Investigador Visual + +Analisa referencias visuais de qualquer fonte e produz style briefs estruturados para alimentar o pipeline de design. + +## Responsabilidades +- Analisar URLs de referencia (via claude-in-chrome screenshots) +- Analisar Figma links (via Figma MCP read-only: extrair estilos, componentes, tokens) +- Extrair Design DNA via Stitch MCP +- Consultar UIUX Pro Max para estilos/paletas profissionais +- Produzir style brief JSON estruturado + +## Fontes de Analise + +| Fonte | Ferramenta | O que extrai | +|---|---|---| +| URL website | claude-in-chrome (screenshots) | Layout, cores, tipografia, mood | +| Figma link | Figma MCP (read-only) | Estilos, componentes, tokens, spacing | +| Design existente | Stitch DNA extraction | Fonts, cores, layouts, componentes | +| Estilo abstracto | UIUX Pro Max skill | 57 estilos, 95 paletas, 57 font pairings | + +## Output: Style Brief JSON + +```json +{ + "mood": "profissional, moderno, clean", + "colors": { + "primary": "#HEX", + "secondary": "#HEX", + "accent": "#HEX", + "background": "#HEX" + }, + "typography": { + "heading": "Font Name", + "body": "Font Name", + "style": "sans-serif/serif/mixed" + }, + "composition": { + "layout": "grid/asymmetric/centered", + "whitespace": "generous/moderate/compact", + "hierarchy": "strong/moderate/flat" + }, + "references": ["url1", "url2"], + "constraints": ["dimensoes", "formato", "marca"] +} +``` + +## Regras + +1. **Nunca copiar** - inspirar e adaptar, nunca replicar +2. **Objectivo sobre subjectivo** - cores HEX, nao "azulado" +3. **Sempre incluir constraints** - dimensoes, formato, marca +4. **Multiplas referencias** quando possivel - cruzar padroes diff --git a/design-media/agents/ui-designer.md b/design-media/agents/ui-designer.md index 9ad7dcd..9fa0de4 100644 --- a/design-media/agents/ui-designer.md +++ b/design-media/agents/ui-designer.md @@ -9,6 +9,16 @@ version: 2.0.0 category: design model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - design-systems +recommended_mcps: + - stitch + - magic + - pixabay + - pexels allowed-mcps: google-workspace, penpot, powerpoint, design-systems, pixabay, pexels skills: - _core @@ -29,7 +39,18 @@ Designer de interfaces especializado em criar designs visuais apelativos e funci - Garantir consistencia visual e acessibilidade (WCAG) em todas as plataformas - Colaborar com developers no handoff e implementacao de designs -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"interface design sistemas componentes" +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"design responsivo layouts" +mcp__notebooklm__notebook_query notebook_id:"9053d0e8-dd39-460b-b5ea-e67af3e9a675" query:"visual design tipografia cores" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"interface design sistemas componentes" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de WebSites" query:"design responsivo layouts" diff --git a/design-media/agents/video-production-specialist.md b/design-media/agents/video-production-specialist.md index ce8e7de..fd094b0 100644 --- a/design-media/agents/video-production-specialist.md +++ b/design-media/agents/video-production-specialist.md @@ -101,7 +101,17 @@ Produtor de video responsavel por criar videos animados programaticamente com Re | LinkedIn | 1200x1200 | 1:1 | 30 | | TikTok | 1080x1920 | 9:16 | 30 | -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"video conteudo visual" +mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"animacao storytelling" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"video conteudo visual" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"animacao storytelling" diff --git a/design-media/agents/web-designer.md b/design-media/agents/web-designer.md index ebb796e..54958e3 100644 --- a/design-media/agents/web-designer.md +++ b/design-media/agents/web-designer.md @@ -9,6 +9,16 @@ version: 2.0.0 category: design model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - design-systems +recommended_mcps: + - stitch + - lighthouse + - magic + - pexels allowed-mcps: google-workspace, penpot, powerpoint, lighthouse, gsc, design-systems, pixabay, pexels skills: - _core @@ -29,7 +39,17 @@ Designer web especializado em criar websites visualmente impactantes e funcionai - Optimizar designs para performance web e Core Web Vitals - Garantir compatibilidade cross-browser e acessibilidade -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"layouts design web responsivo" +mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"conversao usabilidade navegacao" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de WebSites" query:"layouts design web responsivo" mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"themes templates design" diff --git a/design-media/knowledge/datasets.json b/design-media/knowledge/datasets.json index 7ff020f..cee1dac 100644 --- a/design-media/knowledge/datasets.json +++ b/design-media/knowledge/datasets.json @@ -1,9 +1,78 @@ { - "description": "Dify KB datasets for Design and Media domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "7efc5db4-05b1-408a-9e41-b612188ee877", "name": "Canva", "priority": 1, "document_count": 24, "word_count": 148976}, - {"id": "e14ab89e-8910-43b6-becf-d57c78afd62d", "name": "UX e Usabilidade", "priority": 1, "document_count": 4, "word_count": 413593}, - {"id": "39818f77-8c70-4729-9b5c-6f92d3a2b418", "name": "Criatividade", "priority": 2, "document_count": 9, "word_count": 262795} - ] + "description": "Knowledge sources (NotebookLM + Dify KB) for Design and Media domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", + "title": "Social Media e Branding", + "topics": [ + "canva" + ], + "maps_from_dify": "Canva" + }, + { + "id": "081ca512-8279-4850-b2b9-dff090267482", + "title": "UI/UX Design", + "topics": [ + "usabilidade" + ], + "maps_from_dify": "UX e Usabilidade" + } + ], + "pending": [ + { + "title": "Manual Normas Graficas Descomplicar 2023", + "source": "PDF 64.5MB - Hub/02-Descomplicar/Design/Identidade/Manual_Descomplicar_2023.pdf", + "status": "pendente - upload manual necessario" + }, + { + "title": "Brand Strategy (Brand Master Academy)", + "source": "11 podcasts - Hub/04-Recursos/Knowledge-Base/MDs/YouTube/Brand_Master_Academy/", + "status": "pendente - criar notebook + upload" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "7efc5db4-05b1-408a-9e41-b612188ee877", + "name": "Canva", + "priority": 1, + "document_count": 24, + "word_count": 148976 + }, + { + "id": "e14ab89e-8910-43b6-becf-d57c78afd62d", + "name": "UX e Usabilidade", + "priority": 1, + "document_count": 4, + "word_count": 413593 + }, + { + "id": "39818f77-8c70-4729-9b5c-6f92d3a2b418", + "name": "Criatividade", + "priority": 2, + "document_count": 9, + "word_count": 262795 + } + ] + }, + "brand_packs": { + "description": "Brand packs JSON para identidade visual por cliente", + "path": "/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/", + "brands": [ + { + "slug": "descomplicar", + "name": "Descomplicar - Consultoria e Desenvolvimento", + "colors": {"primary": "#dd7500", "secondary": "#cc8d00", "accent": "#f2d9a2"}, + "fonts": {"heading": "Nexa", "body": "Roboto"} + } + ] + } + } } diff --git a/design-media/skills/design/SKILL.md b/design-media/skills/design/SKILL.md new file mode 100644 index 0000000..9b689d5 --- /dev/null +++ b/design-media/skills/design/SKILL.md @@ -0,0 +1,141 @@ +--- +name: design +description: > + Motor de design profissional multi-marca. Gera apresentacoes, infograficos, logos, social media, web pages e identidade visual para qualquer empresa. + Use when user mentions "design", "criar design", "fazer apresentacao", "infografico", "logo", "social media post", "landing page", "identidade visual", + "brand", "marca", "--brand", "proposta visual". +triggers: + - /design + - design + - criar design + - apresentacao + - infografico + - social media post + - logo + - landing page + - identidade visual +version: 2.0.0 +author: Descomplicar Crescimento Digital +category: design +--- + +# /design - Motor de Design Profissional + +Ponto de entrada unificado para o sistema de design multi-marca. Routing automatico para o motor adequado. + +## Comandos + +| Comando | Output | Motor | +|---------|--------|-------| +| `/design [descricao]` | Routing automatico | Auto | +| `/design presentation [tema]` | Apresentacao PPTX/PDF | Presenton | +| `/design infographic [tema]` | Infografico PNG/PDF | Penpot + AI | +| `/design social [plataforma] [tema]` | Post redes sociais | Penpot | +| `/design web [descricao]` | Landing page / web component | Stitch | +| `/design logo [nome]` | Logo SVG + variacoes | Penpot + Fibo | +| `/design brand [empresa]` | Identidade visual completa | Todos | +| `/design from-reference [url]` | Analisa e recria adaptado | Auto | + +## Parametros Opcionais + +| Parametro | Descricao | Exemplo | +|-----------|-----------|---------| +| `--brand [nome]` | Aplicar identidade de marca | `--brand descomplicar` | +| `--tone [tom]` | Tom da apresentacao | `--tone sales_pitch` | +| `--format [fmt]` | Formato de exportacao | `--format pdf` | +| `--variations [n]` | Numero de variacoes | `--variations 5` | + +## Workflow + +``` +1. PARSE comando e parametros +2. IDENTIFICAR tipo de output + - "presentation" / "slides" / "proposta" -> Presenton + - "infographic" / "poster" / "flyer" -> Penpot + - "social" / "instagram" / "linkedin" -> Penpot (dimensoes) + - "web" / "landing" / "page" / "ui" -> Stitch + - "logo" / "icone" / "marca" -> Penpot + Fibo + - "brand" / "identidade" -> Pipeline completo + - "from-reference" -> Researcher primeiro +3. SE --brand especificado: + - Carregar brand pack via design-engine MCP: brand_load(nome) + - Aplicar cores, fontes e logo a todos os outputs +4. DELEGAR a design-lead agent (orquestrador) +5. APRESENTAR resultados ao utilizador +``` + +## Exemplos de Uso + +### Apresentacao com marca +``` +/design presentation "Proposta de servicos web para empresa X" --brand descomplicar +``` +Resultado: PPTX profissional via Presenton com cores dourado/preto, logo Descomplicar, fonte Nexa. + +### Post Instagram +``` +/design social instagram "Promocao Black Friday -30%" +``` +Resultado: Imagem 1080x1080 composta no Penpot com texto, cores e layout profissional. + +### Landing page +``` +/design web "Landing page para agencia de marketing digital" --brand descomplicar +``` +Resultado: HTML/CSS via Stitch com Design DNA da marca. + +### Infografico +``` +/design infographic "Top 10 tendencias AI 2026" +``` +Resultado: PNG/PDF vertical composto no Penpot com icones, dados e hierarquia visual. + +### Identidade visual completa +``` +/design brand "Nova Empresa Tech" +``` +Resultado: Logo + paleta + tipografia + templates social + template apresentacao. + +### A partir de referencia +``` +/design from-reference https://figma.com/file/abc123 +``` +Resultado: Analisa design Figma, extrai estilo, recria adaptado. + +## 5 MCPs de Design + +| MCP | Funcao | +|-----|--------| +| **design-engine** | Imagens AI (Fibo/Gemini) + brand packs + rembg | +| **presenton** | Apresentacoes AI (slide.descomplicar.pt) | +| **penpot** | Compositor visual (pen.descomplicar.pt) | +| **stitch** | Web design AI (Google) | +| **figma** | Analise referencias (read-only) | + +## Brand Packs Disponiveis + +Verificar com: `brand_list()` via design-engine MCP. + +Brand packs em: `/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/` + +Formato: `{nome}.json` com cores, fontes, logos, voz, estilo. + +## Dimensoes Social Media + +| Plataforma | Formato | Dimensoes | +|------------|---------|-----------| +| Instagram Post | 1:1 | 1080x1080 | +| Instagram Story | 9:16 | 1080x1920 | +| LinkedIn Post | ~2:1 | 1200x628 | +| YouTube Thumbnail | 16:9 | 1280x720 | +| OG Image | ~2:1 | 1200x630 | +| Facebook Cover | ~3:1 | 820x312 | + +## Qualidade + +Todos os outputs passam pelo design-critic com score minimo 7/10 em 5 dimensoes: +fidelidade, concisao visual, legibilidade, profissionalismo, brand compliance. + +--- + +**Versao**: 2.0.0 | **Data**: 2026-02-12 | **Autor**: Descomplicar diff --git a/dev-tools/agents/database-design-specialist.md b/dev-tools/agents/database-design-specialist.md index 0a2b620..3eca2b1 100644 --- a/dev-tools/agents/database-design-specialist.md +++ b/dev-tools/agents/database-design-specialist.md @@ -5,6 +5,15 @@ role: Especialista em arquitectura de bases de dados domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - ssh-unified +recommended_mcps: + - gitea + - context7 + - filesystem skills: - _core desk_task: 1498 @@ -49,7 +58,16 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes, - Backup e disaster recovery com testes automatizados - Migracao de dados e integracao multi-sistema -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"database SQL optimizacao" +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"arquitectura dados" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"database SQL optimizacao" @@ -106,7 +124,7 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes, ## MCPs Relevantes - `desk-crm-v3`: Acesso directo à BD Perfex para análise - `ssh-unified`: Acesso MySQL em servidores -- `dify-kb`: KB TI (SQL, optimização), AWS (RDS) +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB TI (SQL, optimização), AWS (RDS) ## Colaboracao diff --git a/dev-tools/agents/dev-helper.md b/dev-tools/agents/dev-helper.md index 06db63d..4e05b32 100644 --- a/dev-tools/agents/dev-helper.md +++ b/dev-tools/agents/dev-helper.md @@ -5,6 +5,16 @@ role: Assistente de desenvolvimento generalista domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - gitea + - filesystem +recommended_mcps: + - context7 + - ssh-unified + - memory-supabase skills: - _core desk_task: 1500 @@ -16,14 +26,15 @@ tags: - claude-code - dev-helper - code-review -version: "2.0" +version: "2.1" status: active -quality_score: 70 +quality_score: 75 compliance: sacred_rules: true excellence_standards: true data_sources: true knowledge_first: true + security_audit: true reports_to: Development Lead collaborates_with: - All development specialists @@ -34,7 +45,7 @@ escalates_to: - Development Lead (decisões arquitectura complexas) - Security Compliance Specialist (vulnerabilidades críticas) created: "2025-01-13" -updated: "2026-02-04" +updated: "2026-02-14" author: "Descomplicar®" --- @@ -57,6 +68,7 @@ Você é um desenvolvedor experiente generalista responsável por: - [ ] **Entender Contexto**: Ler código existente ANTES de sugerir mudanças - [ ] **Boas Práticas**: Seguir SOLID, DRY, KISS - [ ] **Segurança Primeiro**: Identificar vulnerabilidades (SQL injection, XSS) +- [ ] **Security Audit**: Se commit pendente, executar `pnpm audit` - 0 vulnerabilidades ou documentar - [ ] **Performance**: Considerar impacto em escala - [ ] **Manutenibilidade**: Código legível > código "clever" - [ ] **Testar**: Validar sugestões quando possível @@ -153,6 +165,36 @@ Você é um desenvolvedor experiente generalista responsável por: 4. Manter actualizada (parte do PR) ``` +### 5. Pre-Commit Security Check +``` +OBRIGATÓRIO antes de git commit: + +1. Security Audit + pnpm audit # Node.js + composer audit # PHP + +2. Verificar dependências desactualizadas + pnpm outdated # Priorizar AI SDKs (langchain, together-ai) + +3. Environment Safety + git diff .env.local # Garantir placeholders, NUNCA keys reais + +4. Type Safety (se TypeScript) + pnpm type + +5. Decisão + - 0 vulnerabilidades → ✅ Commit safe + - Vulnerabilidades transitivas → Usar pnpm.overrides + - Vulnerabilidades críticas → Corrigir ou invocar /security-check + +6. Documentar + - Se há vulnerabilidades conhecidas → Mencionar no commit message + - Criar flag: touch ~/.claude-work/.last-security-audit + +NUNCA fazer commit sem executar este workflow. +Ver: PROC-DEV-SEC-001 no Hub para detalhes completos. +``` + ## Princípios SOLID | Princípio | Descrição | Exemplo Anti-Pattern | @@ -172,7 +214,17 @@ Você é um desenvolvedor experiente generalista responsável por: - **Nomes Vagos**: `data`, `temp`, `x` → Nomes descritivos - **Comentários Excessivos**: Código deve ser auto-explicativo -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"boas praticas SOLID clean code" +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"debugging arquitectura troubleshooting" +mcp__notebooklm__notebook_query notebook_id:"2876d1fe-5cea-4d98-8140-b0e1a81c6bc4" query:"desenvolvimento assistente workflow" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"boas praticas SOLID clean code" diff --git a/dev-tools/agents/development-lead.md b/dev-tools/agents/development-lead.md index 9d74fcf..7a409aa 100644 --- a/dev-tools/agents/development-lead.md +++ b/dev-tools/agents/development-lead.md @@ -5,6 +5,16 @@ role: Líder de desenvolvimento e arquitectura domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - gitea + - ssh-unified +recommended_mcps: + - context7 + - google-workspace + - memory-supabase skills: - _core desk_task: 1499 @@ -49,7 +59,17 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de - Decisoes tecnicas e definicao de standards - Integracao e colaboracao cross-team -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"lideranca tecnica" +mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"coordenacao equipas" +mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"arquitectura solucoes" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"lideranca tecnica" @@ -107,7 +127,7 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de - `desk-crm-v3`: Gestão de tarefas e projectos - `gitea`: Gestão de repositórios e PRs - `memory-supabase`: Histórico de decisões técnicas -- `dify-kb`: KB Desenvolvimento, Gestão Projectos +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB Desenvolvimento, Gestão Projectos ## Colaboracao diff --git a/dev-tools/agents/javascript-fullstack-specialist.md b/dev-tools/agents/javascript-fullstack-specialist.md index 8a60c1c..034e971 100644 --- a/dev-tools/agents/javascript-fullstack-specialist.md +++ b/dev-tools/agents/javascript-fullstack-specialist.md @@ -7,6 +7,16 @@ role: Especialista em desenvolvimento JavaScript fullstack com expertise em fram domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - gitea +recommended_mcps: + - context7 + - filesystem + - ssh-unified + - n8n skills: - _core desk_task: 1504 @@ -42,7 +52,17 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac - Implementacao de testes automatizados (Jest, Cypress, Playwright) - Optimizacao de performance e Core Web Vitals -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"javascript typescript react node" +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"fullstack web development modern frameworks" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"javascript typescript react node" mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"fullstack web development modern frameworks" @@ -97,7 +117,7 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac ## MCPs Relevantes - `gitea`: Gestão de repositórios e PRs - `desk-crm-v3`: Tracking de tarefas -- `dify-kb`: KB Desenvolvimento Software, TI +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB Desenvolvimento Software, TI - `memory-supabase`: Padrões e decisões técnicas ## Colaboracao @@ -115,7 +135,8 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac - Repositórios Git, issues, PRs - Usage: `mcp__gitea__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/dev-tools/agents/nextjs-specialist.md b/dev-tools/agents/nextjs-specialist.md index d834590..fde55eb 100644 --- a/dev-tools/agents/nextjs-specialist.md +++ b/dev-tools/agents/nextjs-specialist.md @@ -5,6 +5,15 @@ role: Especialista em desenvolvimento Next.js moderno domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - gitea +recommended_mcps: + - context7 + - filesystem + - stitch skills: - _core - nextjs @@ -79,7 +88,18 @@ Especialista em desenvolvimento Next.js - App Router, Server Components, e arqui - Route Handlers - Middleware -## Datasets Dify +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +- Cloud e Infraestrutura TI (`f9a79b5a`) + +``` +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"" +``` + +### Dify KB (Secundario) + - Desenvolvimento Software - TI - React @@ -146,7 +166,7 @@ Especialista em desenvolvimento Next.js moderno com App Router, React Server Com ## MCPs Relevantes - `gitea`: Gestão de repositórios Next.js - `desk-crm-v3`: Tracking de desenvolvimento -- `dify-kb`: KB Desenvolvimento Software, React, TI +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB Desenvolvimento Software, React, TI - `ssh-unified`: Deploy (Docker ou Node.js) ## Colaboracao diff --git a/dev-tools/agents/php-fullstack-engineer.md b/dev-tools/agents/php-fullstack-engineer.md index 52aa69e..57f11f6 100644 --- a/dev-tools/agents/php-fullstack-engineer.md +++ b/dev-tools/agents/php-fullstack-engineer.md @@ -95,7 +95,18 @@ Especialista senior em desenvolvimento PHP fullstack com expertise em frameworks - Implementar seguranca OWASP e validacao de dados - Integrar sistemas WordPress, WooCommerce e PerfexCRM -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"PHP Laravel Symfony APIs" +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"PHP WordPress WooCommerce" +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"backend MySQL PostgreSQL arquitectura" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"PHP Laravel Symfony APIs" mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"PHP WordPress WooCommerce" diff --git a/dev-tools/knowledge/datasets.json b/dev-tools/knowledge/datasets.json index 48d8ed2..28ac737 100644 --- a/dev-tools/knowledge/datasets.json +++ b/dev-tools/knowledge/datasets.json @@ -1,13 +1,111 @@ { - "description": "Dify KB datasets for Development Tools domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "98e74ec7-4b4d-4876-8321-7f26ae66c3a6", "name": "Claude Code", "priority": 1, "document_count": 53, "word_count": 1241283}, - {"id": "02ca690a-a901-4034-9165-5ef42830f91e", "name": "MCP Servers", "priority": 1, "document_count": 22, "word_count": 158091}, - {"id": "eafd864e-5331-4a1d-a7e2-603ec263e2e1", "name": "VS Code", "priority": 2, "document_count": 52, "word_count": 10450973}, - {"id": "66ce30ab-a630-402b-8ae8-c3f44312e228", "name": "Windsurf", "priority": 2, "document_count": 5, "word_count": 98903}, - {"id": "2e68ac58-12cc-4c6f-b000-2bfff8fe6fcb", "name": "Claude Computer Use", "priority": 2, "document_count": 4, "word_count": 17078}, - {"id": "e7c7decc-0ded-4351-ab14-b110b3c38ec9", "name": "Desenvolvimento de Software", "priority": 1, "document_count": 2, "word_count": 534153}, - {"id": "e38a510f-ca93-4407-8b44-c4c66efe01f8", "name": "Obsidian + Claude Code", "priority": 2, "document_count": 121, "word_count": 2292847} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for Development Tools domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", + "title": "Claude Code", + "topics": [ + "claude", + "code" + ], + "maps_from_dify": "Claude Code" + }, + { + "id": "73102308-70ef-403e-9be9-eae0cfc62d55", + "title": "Desenvolvimento de MCPs", + "topics": [ + "mcp", + "servers" + ], + "maps_from_dify": "MCP Servers" + }, + { + "id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53", + "title": "AI Code Editors", + "topics": [ + "code" + ], + "maps_from_dify": "VS Code" + }, + { + "id": "24947ffa-0019-448a-a340-2f4a275d2eb1", + "title": "Programacao", + "topics": [ + "desenvolvimento", + "software" + ], + "maps_from_dify": "Desenvolvimento de Software" + }, + { + "id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131", + "title": "Obsidian + Claude", + "topics": [ + "obsidian", + "claude", + "code" + ], + "maps_from_dify": "Obsidian + Claude Code" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "98e74ec7-4b4d-4876-8321-7f26ae66c3a6", + "name": "Claude Code", + "priority": 1, + "document_count": 53, + "word_count": 1241283 + }, + { + "id": "02ca690a-a901-4034-9165-5ef42830f91e", + "name": "MCP Servers", + "priority": 1, + "document_count": 22, + "word_count": 158091 + }, + { + "id": "eafd864e-5331-4a1d-a7e2-603ec263e2e1", + "name": "VS Code", + "priority": 2, + "document_count": 52, + "word_count": 10450973 + }, + { + "id": "66ce30ab-a630-402b-8ae8-c3f44312e228", + "name": "Windsurf", + "priority": 2, + "document_count": 5, + "word_count": 98903 + }, + { + "id": "2e68ac58-12cc-4c6f-b000-2bfff8fe6fcb", + "name": "Claude Computer Use", + "priority": 2, + "document_count": 4, + "word_count": 17078 + }, + { + "id": "e7c7decc-0ded-4351-ab14-b110b3c38ec9", + "name": "Desenvolvimento de Software", + "priority": 1, + "document_count": 2, + "word_count": 534153 + }, + { + "id": "e38a510f-ca93-4407-8b44-c4c66efe01f8", + "name": "Obsidian + Claude Code", + "priority": 2, + "document_count": 121, + "word_count": 2292847 + } + ] + } + } +} \ No newline at end of file diff --git a/dev-tools/skills/chrome/SKILL.md b/dev-tools/skills/chrome/SKILL.md index da28804..fabdbe4 100644 --- a/dev-tools/skills/chrome/SKILL.md +++ b/dev-tools/skills/chrome/SKILL.md @@ -2,7 +2,7 @@ name: chrome description: Chrome browser integration for Claude Code. Navigate pages, fill forms, debug console, extract data, test web apps, automate tasks. Use when user mentions "chrome", "browser", "navegar site", "abrir pagina", "testar site", "preencher formulario", "extrair dados", "screenshot site", "google docs", "authenticated site", "gravar gif", "console errors". author: Descomplicar® Crescimento Digital -version: 1.0.0 +version: 2.0.0 quality_score: 80 user_invocable: true allowed-tools: Bash, Read, Write, Glob @@ -10,9 +10,13 @@ allowed-tools: Bash, Read, Write, Glob # /chrome - Chrome Browser Integration -Integra Claude Code com o Chrome para automacao browser, testes, debug e extraccao de dados. +Integra Claude Code com o Chrome para automacao browser, testes, debug, performance e extraccao de dados. Suporta dois backends: **Claude in Chrome** (extensao) e **Chrome DevTools MCP** (npm). -## Pre-Requisitos +## Backends Disponiveis + +### Backend A: Claude in Chrome (Extensao) + +Extensao oficial Anthropic. Requer instalacao manual no browser. | Requisito | Minimo | Verificar | |-----------|--------|-----------| @@ -24,29 +28,59 @@ Integra Claude Code com o Chrome para automacao browser, testes, debug e extracc **Limitacoes:** Apenas Google Chrome (nao Brave/Arc). Nao suportado em WSL. -## Activacao - -### Por sessao +**Activacao:** ```bash +# Por sessao claude --chrome -``` -### Por defeito (aliases .bashrc) -```bash +# Por defeito (alias .bashrc) alias cc="claude --permission-mode bypassPermissions --chrome" -``` -### Dentro de sessao activa -``` -/chrome -# Seleccionar "Enabled by default" -``` +# Dentro de sessao activa +/chrome -> "Enabled by default" -### Ver ferramentas disponiveis -``` +# Ver ferramentas /mcp -> seleccionar claude-in-chrome ``` +### Backend B: Chrome DevTools MCP (npm) + +Pacote oficial Google (`chrome-devtools-mcp`). Controla Chrome via DevTools Protocol. Nao requer extensao. + +| Requisito | Minimo | Verificar | +|-----------|--------|-----------| +| Google Chrome | Instalado | `google-chrome --version` | +| Node.js | v18+ | `node --version` | +| chrome-devtools-mcp | latest | `claude mcp list` | + +**Instalacao:** +```bash +claude mcp add chrome-devtools --scope user -- npx -y chrome-devtools-mcp@latest +``` + +**Activacao:** +```bash +# Lancar Chrome com remote debugging +google-chrome --remote-debugging-port=9222 + +# Reiniciar sessao Claude Code para carregar ferramentas +``` + +**Ferramentas disponibilizadas:** +- `page_navigate`, `page_go_back`, `page_go_forward` - Navegacao +- `page_screenshot` - Captura de ecra +- `page_click`, `page_type`, `page_select_option` - Interaccao +- `page_execute_javascript` - Executar JS no contexto da pagina +- `page_wait_for_selector` - Esperar por elementos +- `console_get_logs` - Ler consola (logs, errors, warnings) +- `network_get_requests`, `network_get_response_body` - Inspeccionar rede +- `dom_get_element`, `dom_query_selector` - Inspeccionar DOM +- `css_get_computed_styles`, `css_get_matched_styles` - Inspeccionar CSS +- `performance_start_trace`, `performance_stop_trace` - Gravar traces +- `performance_analyze_insight` - Metricas automaticas (LCP, TBT, CLS) +- `accessibility_get_tree` - Arvore de acessibilidade +- `storage_get_cookies`, `storage_get_local_storage` - Inspecionar storage + ## Capacidades ### 1. Navegacao e Interaccao @@ -58,32 +92,47 @@ alias cc="claude --permission-mode bypassPermissions --chrome" ### 2. Debug e Diagnostico - Ler console logs, errors, warnings -- Inspeccionar DOM state -- Verificar network requests +- Inspeccionar DOM state e CSS computado +- Verificar network requests e response bodies - Ler JavaScript errors em tempo real +- Inspeccionar cookies, localStorage, sessionStorage -### 3. Extraccao de Dados +### 3. Performance (DevTools MCP) +- Gravar performance traces completos +- Metricas automaticas: LCP, TBT, CLS, FCP, TTFB +- Identificar JavaScript nao utilizado +- Analise de recursos (tamanho, tempo de carga) +- Equivalente a Lighthouse audit on-demand + +### 4. Acessibilidade (DevTools MCP) +- Arvore de acessibilidade completa +- Verificar roles ARIA, labels, estados +- Identificar elementos sem texto alternativo + +### 5. Extraccao de Dados - Extrair texto estruturado de paginas - Scraping de tabelas, listas, precos - Guardar dados como CSV/JSON local -- Ler conteudo de paginas autenticadas +- Ler conteudo de paginas autenticadas (Chrome extensao) +- Query DOM com selectores CSS/XPath -### 4. Testes Web +### 6. Testes Web - Testar forms com dados invalidos - Verificar UI contra mocks - Validar user flows completos - Testar responsividade +- Monitorizar network requests durante testes -### 5. Sites Autenticados +### 7. Sites Autenticados (Chrome extensao) - Google Docs, Gmail, Sheets - Notion, Slack web - CRMs, dashboards - Qualquer site com sessao activa no Chrome -### 6. Automacao +### 8. Automacao - Data entry repetitivo - Multi-site workflows -- Gravar demos como GIF +- Gravar demos como GIF (Chrome extensao) - Preencher CRMs a partir de CSV ## Workflows Comuns @@ -124,35 +173,77 @@ Verifica o meu calendario para reunioes amanha, depois para cada reuniao com participante externo, pesquisa o site da empresa. ``` -### Gravar demo GIF +### Gravar demo GIF (Chrome extensao) ``` Grava um GIF mostrando o fluxo de checkout, desde adicionar item ao carrinho ate a pagina de confirmacao. ``` -## Chrome vs Puppeteer vs WebFetch +### Performance audit (DevTools MCP) +``` +Abre a pagina example.com, grava um performance trace durante 5 segundos +e analisa LCP, TBT e CLS. Sugere melhorias. +``` -| Feature | Chrome (`--chrome`) | Puppeteer MCP | WebFetch | -|---------|-------------------|---------------|----------| -| Sessoes autenticadas | Sim | Nao | Nao | -| Janela visivel | Sim | Opcional | N/A | -| Sites privados | Sim (se logado) | Nao | Nao | -| Headless | Nao | Sim | Sim | -| Interaccao UI | Completa | Completa | Nao | -| Screenshots | Sim | Sim | Nao | -| Gravar GIF | Sim | Nao | Nao | -| Console logs | Sim | Sim | Nao | -| Sem Chrome | N/A | Funciona | Funciona | -| Context usage | Alto (tools loaded) | Medio | Baixo | +### Debug network (DevTools MCP) +``` +Abre a pagina do dashboard, monitoriza os requests de API +e identifica quais estao a falhar ou demorar mais de 2 segundos. +``` + +### Inspeccionar acessibilidade (DevTools MCP) +``` +Abre a pagina de contacto e verifica a arvore de acessibilidade. +Identifica elementos sem labels ou roles ARIA incorrectos. +``` + +### Debug CSS (DevTools MCP) +``` +Abre a landing page e inspecciona os estilos computados do hero section. +Verifica se o layout esta correcto em diferentes larguras. +``` + +## Comparacao de Backends + +| Feature | Chrome Extensao | DevTools MCP | Puppeteer MCP | WebFetch | +|---------|----------------|--------------|---------------|----------| +| Sessoes autenticadas | Sim | Sim (se Chrome aberto) | Nao | Nao | +| Janela visivel | Sim | Sim | Opcional | N/A | +| Sites privados | Sim (se logado) | Sim (se logado) | Nao | Nao | +| Headless | Nao | Opcional | Sim | Sim | +| Interaccao UI | Completa | Completa | Completa | Nao | +| Screenshots | Sim | Sim | Sim | Nao | +| Gravar GIF | Sim | Nao | Nao | Nao | +| Console logs | Sim | Sim (filtrados) | Sim | Nao | +| Network requests | Nao | Sim (detalhado) | Limitado | Nao | +| Performance traces | Nao | Sim (LCP/TBT/CLS) | Nao | Nao | +| Acessibilidade | Nao | Sim (a11y tree) | Nao | Nao | +| DOM/CSS inspection | Basico | Completo | Basico | Nao | +| Storage inspection | Nao | Sim (cookies/LS) | Nao | Nao | +| Requer extensao | Sim | Nao | Nao | Nao | +| Requer Chrome aberto | Sim | Sim (porta 9222) | Nao | Nao | +| Context usage | Alto | Medio | Medio | Baixo | **Regra de decisao:** -- Precisa de login/sessao? -> **Chrome** -- Automacao headless? -> **Puppeteer MCP** +- Precisa de login/sessao + GIF? -> **Chrome Extensao** +- Debug/performance/network? -> **DevTools MCP** +- Automacao headless CI/CD? -> **Puppeteer MCP** - Apenas ler conteudo publico? -> **WebFetch** ## Troubleshooting -### Extensao nao detectada +### DevTools MCP nao conecta +1. Verificar Chrome lancado com `--remote-debugging-port=9222` +2. Testar: `curl http://localhost:9222/json/version` +3. Verificar MCP registado: `claude mcp list` +4. Reiniciar sessao Claude Code + +### DevTools MCP sem ferramentas +1. Verificar: `claude mcp list | grep chrome-devtools` +2. Se nao aparece: `claude mcp add chrome-devtools --scope user -- npx -y chrome-devtools-mcp@latest` +3. Reiniciar sessao Claude Code + +### Extensao nao detectada (Chrome extensao) 1. Verificar extensao em `chrome://extensions` 2. Verificar versao Claude Code: `claude --version` (>= 2.0.73) 3. Confirmar Chrome aberto @@ -183,12 +274,20 @@ ao carrinho ate a pagina de confirmacao. # Chrome instalado? google-chrome --version -# Native host configurado? -cat ~/.config/google-chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json - # Claude Code compativel? claude --version +# --- DevTools MCP --- +# MCP registado? +claude mcp list | grep chrome-devtools + +# Chrome com debugging activo? +curl -s http://localhost:9222/json/version | head -5 + +# --- Chrome Extensao --- +# Native host configurado? +cat ~/.config/google-chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json + # Host script existe? ls -la ~/.claude/chrome/chrome-native-host ``` diff --git a/dev-tools/skills/db-design/SKILL.md b/dev-tools/skills/db-design/SKILL.md index 489b186..8472400 100644 --- a/dev-tools/skills/db-design/SKILL.md +++ b/dev-tools/skills/db-design/SKILL.md @@ -196,7 +196,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ```javascript // Pesquisar optimização MySQL -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7f63ec0c-6321-488c-b107-980140199850", query: "mysql index optimization slow query" }) diff --git a/dev-tools/skills/nextjs/SKILL.md b/dev-tools/skills/nextjs/SKILL.md index ab85d30..2e60959 100644 --- a/dev-tools/skills/nextjs/SKILL.md +++ b/dev-tools/skills/nextjs/SKILL.md @@ -14,6 +14,25 @@ allowed-tools: Glob Desenvolvimento Next.js moderno (13+) com App Router e Server Components. +## Regra #48 - Dev Container (OBRIGATORIO) + +**TODOS os projectos Next.js devem ser desenvolvidos no container dev.** + +``` +SSH: server="dev" (mcp__ssh-unified__ssh_execute) +Path: /root/Dev/ +Sync: auto -> /media/ealmeida/Dados/Dev/ (Syncthing) +``` + +**Workflow:** +1. `mcp__ssh-unified__ssh_execute server:"dev" command:"mkdir -p /root/Dev/"` +2. Desenvolver e testar no container +3. `npm run build` no container antes de deploy +4. Deploy via EasyPanel a partir do container +5. Syncthing propaga automaticamente para PC local e colegas + +**NUNCA:** `npx create-next-app` directamente no PC local para projectos colaborativos. + ## Quando Usar - Criar aplicações Next.js diff --git a/dev-tools/skills/php-dev/SKILL.md b/dev-tools/skills/php-dev/SKILL.md index 7faa3db..a1937e7 100644 --- a/dev-tools/skills/php-dev/SKILL.md +++ b/dev-tools/skills/php-dev/SKILL.md @@ -9,7 +9,7 @@ version: 1.2.0 user_invocable: true tags: [php, laravel, symfony, api, backend, jwt, oauth, rest] desk_task: 1477 -allowed-tools: Read, Write, Edit, Bash, mcp__memory-supabase__search_memories, mcp__context7__get-library-docs, mcp__dify-kb__dify_kb_retrieve_segments +allowed-tools: Read, Write, Edit, Bash, mcp__memory-supabase__search_memories, mcp__context7__get-library-docs, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments category: dev quality_score: 80 updated: "2026-02-04T18:00:00Z" @@ -19,6 +19,8 @@ updated: "2026-02-04T18:00:00Z" Skill para desenvolvimento PHP moderno seguindo padrões Descomplicar®. +> **Regra #48:** Projectos PHP/Laravel/Symfony devem ser desenvolvidos no **container dev** (`server:"dev"`, path `/root/Dev/`). Sincroniza automaticamente com o PC local via Syncthing. + ## Quando Usar - Criar APIs RESTful @@ -339,6 +341,14 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ### Como Consultar ```javascript +# PRIMARIO: NotebookLM (Gemini 2.5 RAG) +# mcp__notebooklm__notebook_query({notebook_id: "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", query: ""}) // Claude Code +# mcp__notebooklm__notebook_query({notebook_id: "73102308-70ef-403e-9be9-eae0cfc62d55", query: ""}) // Desenvolvimento de MCPs +# mcp__notebooklm__notebook_query({notebook_id: "57d9c6c9-48ba-4d83-8f71-cc890f348a53", query: ""}) // AI Code Editors +# mcp__notebooklm__notebook_query({notebook_id: "24947ffa-0019-448a-a340-2f4a275d2eb1", query: ""}) // Programacao +# mcp__notebooklm__notebook_query({notebook_id: "ebee9fe1-78fd-4f85-8938-f19f3ea32131", query: ""}) // Obsidian + Claude +# FALLBACK: Dify KB (se NotebookLM insuficiente) + // Pesquisar padrões Laravel mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "e7c7decc-0ded-4351-ab14-b110b3c38ec9", diff --git a/dev-tools/skills/react-patterns/SKILL.md b/dev-tools/skills/react-patterns/SKILL.md index 5480dc5..4fa15df 100644 --- a/dev-tools/skills/react-patterns/SKILL.md +++ b/dev-tools/skills/react-patterns/SKILL.md @@ -14,6 +14,8 @@ desk_task: 1478 Skill para desenvolvimento React seguindo padrões modernos (React 18+/19). +> **Regra #48:** Projectos React (incluindo Next.js) devem ser desenvolvidos no **container dev** (`server:"dev"`, path `/root/Dev/`). Sincroniza automaticamente com o PC local via Syncthing. + ## Quando Usar - Desenvolver componentes React @@ -492,7 +494,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ```javascript // Pesquisar padrões React -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "e7c7decc-0ded-4351-ab14-b110b3c38ec9", query: "react hooks state management" }) diff --git a/dev-tools/skills/security-check/SKILL.md b/dev-tools/skills/security-check/SKILL.md new file mode 100644 index 0000000..e350679 --- /dev/null +++ b/dev-tools/skills/security-check/SKILL.md @@ -0,0 +1,448 @@ +--- +name: security-check +description: Comprehensive security audit for Node.js/PHP projects - dependency vulnerabilities, outdated packages, environment safety, type checking. Use before git commits. +domain: Dev +model: sonnet +priority: high +tags: + - security + - audit + - vulnerabilities + - npm + - composer + - mandatory +--- + +# /security-check - Security Audit Pre-Commit + +Auditoria de segurança completa para projectos Node.js e PHP. **Obrigatória antes de commits** (Regra CLAUDE.md #47). + +--- + +## Quando Usar + +### OBRIGATÓRIO: +- Antes de `git commit` +- Antes de `git push` +- Antes de criar Pull Request +- Antes de deploy para produção + +### RECOMENDADO: +- Após `pnpm add ` (especialmente AI SDKs) +- Semanalmente em projectos activos +- Após actualizar dependências major + +--- + +## Workflow Completo + +### 1. Detectar Tipo de Projecto + +```bash +# Verificar package managers +if [ -f "package.json" ]; then + # Node.js detected + MANAGER="pnpm" # ou npm/yarn +elif [ -f "composer.json" ]; then + # PHP detected + MANAGER="composer" +fi +``` + +### 2. Dependency Security Audit + +**Node.js:** +```bash +pnpm audit --json > ~/.claude-work/security-audit.json +``` + +**PHP:** +```bash +composer audit --format=json > ~/.claude-work/security-audit.json +``` + +**Parse resultados:** +- Contar: critical, high, moderate, low +- Identificar se são directas ou transitivas +- Listar pacotes afectados + +### 3. Outdated Dependencies + +**Node.js:** +```bash +pnpm outdated --json > ~/.claude-work/security-outdated.json +``` + +**Priorizar:** +- AI SDKs: langchain, together-ai, @tavily/core, @langchain/core +- Security packages: @auth/*, axios, form-data +- Framework core: next, react, prisma + +### 4. Environment Safety Check + +**Verificar ficheiros:** +```bash +# Lista de ficheiros a verificar +FILES=(.env .env.local .env.production .env.development) + +for file in "${FILES[@]}"; do + if [ -f "$file" ]; then + # Verificar se tem placeholders ou keys reais + grep -E "(API_KEY|SECRET|TOKEN|PASSWORD)" "$file" + fi +done +``` + +**Validação:** +- ✅ `API_KEY=placeholder` (safe) +- ❌ `API_KEY=sk-proj-abc123...` (UNSAFE - real key) + +### 5. Type Safety (se TypeScript) + +```bash +# Verificar se é TypeScript +if [ -f "tsconfig.json" ]; then + pnpm type # ou tsc --noEmit +fi +``` + +### 6. Análise de Risco AI SDKs + +**Padrões conhecidos:** + +| Pacote | Risco | Acção | +|--------|-------|-------| +| `langchain` | Alto | Verificar @langchain/core | +| `together-ai` | Alto | form-data transitiva | +| `@tavily/core` | Alto | axios transitiva | +| `@platejs/ai` | Médio | lodash transitiva | + +**Workflow AI SDKs:** +```bash +# 1. Verificar se @langchain/core está desactualizado +pnpm list @langchain/core + +# 2. Se versão < 0.3.80 (vulnerável) +pnpm add @langchain/core@latest + +# 3. Re-audit +pnpm audit +``` + +### 7. Gerar Relatório + +**Formato output:** + +```markdown +## Security Audit Report + +**Status:** [✅ SAFE | ⚠️ ISSUES FOUND | ❌ CRITICAL] +**Data:** YYYY-MM-DD HH:MM + +| Category | Status | +|----------|--------| +| Vulnerabilities | [N critical, M high, P moderate, Q low] | +| Outdated Packages | N total (M major updates) | +| Environment Safety | ✅ Placeholders only / ❌ Real keys found | +| Type Safety | ✅ 0 errors / ❌ N errors | + +### Vulnerabilities Detail + +#### Critical (N) +- package@version (via path) - description + - **Patched:** >=safe-version + - **Action:** [Override | Update | Replace] + +#### High (M) +[...] + +### Outdated Packages (Priority) + +**AI SDKs:** +- langchain: current → latest +- @langchain/core: current → latest (SECURITY UPDATE) + +**Framework:** +- next: current → latest + +### Action Required + +**Priority 1 (Critical):** +1. [Acção específica] + +**Priority 2 (High):** +1. [Acção específica] + +**Priority 3 (Maintenance):** +1. [Acção específica] + +### Safe to Commit? + +[✅ YES | ⚠️ YES (with documentation) | ❌ NO (fix critical first)] + +**If YES with documentation:** +``` +git commit -m "feat: feature X + +Known vulnerabilities (will be resolved): +- package@version (severity) - waiting for upstream update + +Mitigation: [explanation] +" +``` + +**If NO:** +Fix critical/high vulnerabilities first. See PROC-DEV-SEC-001 for guidance. +``` + +### 8. Criar Flag + +```bash +touch ~/.claude-work/.last-security-audit +``` + +**Propósito:** Hook pre-git-commit verifica esta flag. Se existe e < 1h, permite commit. + +--- + +## Recomendações Específicas + +### Para Vulnerabilidades Transitivas + +**Exemplo: form-data via together-ai** + +```json +// package.json +{ + "pnpm": { + "overrides": { + "form-data": ">=4.0.4" + } + } +} +``` + +Depois: +```bash +pnpm install +pnpm audit # Verificar se resolveu +``` + +### Para Dependências Incompatíveis + +**Exemplo: @langchain/core desactualizado** + +```bash +# langchain pina versão antiga +# Solução: instalar como dependência explícita +pnpm add @langchain/core@latest +``` + +### Para Vulnerabilidades Críticas + +**Workflow:** +1. Verificar se há fix disponível +2. Se sim: actualizar +3. Se não: avaliar alternativas ao package +4. Se nenhuma: escalar para Security Compliance Specialist + +--- + +## Output Examples + +### Exemplo 1: Clean (0 vulnerabilities) + +``` +## Security Audit Report + +**Status:** ✅ SAFE +**Data:** 2026-02-14 03:00 + +| Category | Status | +|----------|--------| +| Vulnerabilities | 0 (all categories) ✅ | +| Outdated Packages | 3 (1 major) | +| Environment Safety | ✅ Placeholders only | +| Type Safety | ✅ 0 errors | + +### Outdated Packages + +**Framework:** +- next: 16.1.6 → 16.2.0 (minor) + +**Action Required:** Optional - update at convenience + +### Safe to Commit? + +✅ **YES** - No security issues found + +Created flag: ~/.claude-work/.last-security-audit +``` + +### Exemplo 2: Transitivas (precisa overrides) + +``` +## Security Audit Report + +**Status:** ⚠️ ISSUES FOUND (transitivas) +**Data:** 2026-02-14 03:00 + +| Category | Status | +|----------|--------| +| Vulnerabilities | 0 critical, 0 high, 2 moderate, 1 low | +| Outdated Packages | 5 (2 major) | +| Environment Safety | ✅ Placeholders only | +| Type Safety | ✅ 0 errors | + +### Vulnerabilities Detail + +#### Moderate (2) +- lodash@4.17.21 (via @platejs/ai) + - **Issue:** Prototype pollution + - **Patched:** >=4.17.23 + - **Action:** Override + +- undici@6.22.0 (via @platejs/juice → cheerio) + - **Issue:** Resource exhaustion + - **Patched:** >=6.23.0 + - **Action:** Override + +#### Low (1) +- cookie@0.6.0 (via @auth/core) + - **Issue:** Out of bounds characters + - **Patched:** >=0.7.0 + - **Action:** Override + +### Recommended Fix + +Add to package.json: +```json +{ + "pnpm": { + "overrides": { + "lodash": ">=4.17.23", + "undici": ">=6.23.0", + "cookie": ">=0.7.0" + } + } +} +``` + +Then run: `pnpm install && pnpm audit` + +### Safe to Commit? + +⚠️ **YES (with documentation)** + +Document in commit message: +- 3 moderate/low vulnerabilities (all transitivas) +- Fixed with pnpm.overrides +``` + +### Exemplo 3: Critical (bloquear commit) + +``` +## Security Audit Report + +**Status:** ❌ CRITICAL +**Data:** 2026-02-14 03:00 + +| Category | Status | +|----------|--------| +| Vulnerabilities | 1 critical, 0 high, 0 moderate, 0 low | +| Outdated Packages | 8 (3 major) | +| Environment Safety | ✅ Placeholders only | +| Type Safety | ✅ 0 errors | + +### Vulnerabilities Detail + +#### Critical (1) +- form-data@4.0.3 (via together-ai → @types/node-fetch) + - **Issue:** Unsafe random function in boundary selection + - **Patched:** >=4.0.4 + - **Action:** Override OR replace together-ai + +### Immediate Action Required + +**Option 1: Override (quick fix)** +```json +{ + "pnpm": { + "overrides": { + "form-data": ">=4.0.4" + } + } +} +``` + +**Option 2: Evaluate alternatives** +- Check if together-ai is essential +- Evaluate alternative AI SDKs +- Contact Security Compliance Specialist + +### Safe to Commit? + +❌ **NO** - Fix critical vulnerability first + +DO NOT create flag. DO NOT commit. +``` + +--- + +## Integration + +### Com Hook pre-git-commit + +Hook verifica: +```bash +~/.claude-work/.last-security-audit +``` + +Se ficheiro existe e < 1h → permite commit +Se não existe ou > 1h → **BLOQUEIA** commit + +### Com /time + +```bash +# Workflow típico +/time start 1446 # Tarefa Desk +# ... fazer alterações ... +/security-check # Antes de commit +git commit +/time stop +``` + +### Com /worklog + +```bash +# No worklog, mencionar se audit foi executado +/worklog +# → Incluirá "Security audit: ✅ 0 vulnerabilities" +``` + +--- + +## Escalação + +| Situação | Escalar Para | +|----------|--------------| +| Vulnerabilidades críticas não corrigíveis | Security Compliance Specialist | +| Dúvidas sobre overrides | Development Lead | +| Múltiplas vulnerabilidades altas | /security-check + manual review | +| Alternativas a packages | Research Analyst | + +--- + +## Referências + +- [CLAUDE.md Regra #47](/home/ealmeida/.claude/CLAUDE.md) +- [PROC-DEV-SEC-001](/media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/Seguranca/PROC-DEV-SEC-001-Security-Audit.md) +- [Agent dev-helper v2.1](/home/ealmeida/.claude/plugins/marketplaces/descomplicar-plugins/dev-tools/agents/dev-helper.md) +- [NPM Audit](https://docs.npmjs.com/cli/v10/commands/npm-audit) +- [PNPM Audit](https://pnpm.io/cli/audit) +- [Composer Audit](https://getcomposer.org/doc/03-cli.md#audit) + +--- + +**Skill v1.0** | 2026-02-14 | Descomplicar® +**Security First** - Zero vulnerabilities ou documentadas diff --git a/gestao/.claude-plugin/plugin.json b/gestao/.claude-plugin/plugin.json index 97c9883..38e76fa 100644 --- a/gestao/.claude-plugin/plugin.json +++ b/gestao/.claude-plugin/plugin.json @@ -1,12 +1,21 @@ { "name": "gestao", "description": "Project management, time tracking, daily checkups, worklogs, reflections, knowledge management, archiving and compliance auditing. Backed by 6 Dify KB datasets.", - "version": "1.2.1", + "version": "1.3.0", "author": { "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" }, "homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins", "license": "MIT", - "keywords": ["gestao", "projectos", "tempo", "worklog", "produtividade", "conhecimento", "compliance", "audit"] + "keywords": [ + "gestao", + "projectos", + "tempo", + "worklog", + "produtividade", + "conhecimento", + "compliance", + "audit" + ] } diff --git a/gestao/agents/analytics-insights-agent.md b/gestao/agents/analytics-insights-agent.md index a9ce00c..312f7c6 100644 --- a/gestao/agents/analytics-insights-agent.md +++ b/gestao/agents/analytics-insights-agent.md @@ -5,6 +5,15 @@ role: Especialista em análise de dados e business intelligence domain: Marketing, Business model: sonnet tools: Read, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-analytics +recommended_mcps: + - dify-kb + - memory-supabase + - gsc skills: - _core desk_task: 1491 @@ -127,7 +136,15 @@ Você é um analista de dados experiente especializado em: 4. Recomendar acções de retenção ``` -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"analytics metricas KPIs" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"analytics metricas KPIs" diff --git a/gestao/agents/compliance-auditor.md b/gestao/agents/compliance-auditor.md new file mode 100644 index 0000000..0d1ee9e --- /dev/null +++ b/gestao/agents/compliance-auditor.md @@ -0,0 +1,529 @@ +--- +name: compliance-auditor +description: USAR PROATIVAMENTE para compliance audit, verificar regras, validar processos, check standards, audit procedures, quality gates, code compliance. Auditor de conformidade que garante seguimento das 47 Regras CLAUDE.md, procedimentos Hub, standards de código e processos estabelecidos +role: Auditor de Conformidade - Valida que regras, procedimentos, standards e processos estão a ser seguidos em todos os projectos e operações +domain: Gestão +model: sonnet +tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - filesystem +recommended_mcps: + - gitea + - memory-supabase + - wikijs +skills: +- _core +- today +- worklog +desk_task: null +desk_project: 65 +milestone: null +tags: +- agent +- compliance +- audit +- quality +- gestao +version: '1.0' +status: active +quality_score: 85 +compliance: + sacred_rules: true + excellence_standards: true + data_sources: true + knowledge_first: true +created: '2026-02-14' +updated: '2026-02-14' +author: Descomplicar® +--- + +# Compliance Auditor - Auditor de Conformidade Descomplicar® + +Especialista em auditoria de conformidade responsável por garantir que todas as regras, procedimentos, standards e processos estabelecidos estão a ser seguidos em projectos, código e operações. + +--- + +## 🎯 Responsabilidades + +### 1. Auditoria de Regras CLAUDE.md +- Verificar conformidade com as **47 Regras** do CLAUDE.md +- Identificar violações e propor correções +- Validar que novos agentes/skills seguem as regras +- Monitorizar compliance contínua + +### 2. Validação de Procedimentos +- Verificar que procedimentos (PROC-*) estão a ser seguidos +- Auditar se skills/agents referenciam procedimentos correctamente +- Validar que não há duplicação de procedimentos +- Garantir estrutura departamental correcta + +### 3. Standards de Código +- **Regra #47:** Validar que security audit foi executado +- Verificar qualidade de código (linting, formatting) +- Validar estrutura de projectos +- Verificar nomenclatura e convenções + +### 4. Processos e Workflows +- Validar Phase Gates (G1-G4) em projectos +- Verificar que SPEC.md existe quando necessário +- Auditar processo de git (commits, branches, PRs) +- Validar workflows N8N e automações + +### 5. Documentação +- Verificar README.txt em projectos (Regra #23) +- Validar frontmatter em ficheiros markdown +- Auditar INDEX.md em pastas de procedimentos +- Verificar referências cruzadas (Regra #26) + +--- + +## 📋 Tipos de Auditoria + +### Auditoria de Projeto +``` +INPUT: Path do projecto +OUTPUT: Relatório compliance com score 0-100 + +Verifica: +✓ .desk-project existe (Regra #23) +✓ README.txt com info do Desk (Regra #23) +✓ Security audit no último commit (Regra #47) +✓ Git hooks instalados +✓ Estrutura de pastas correcta +✓ Documentação presente +✓ Backups configurados (Regra #31) +``` + +### Auditoria de Código +``` +INPUT: Path do ficheiro ou projecto +OUTPUT: Issues de compliance + sugestões + +Verifica: +✓ Security vulnerabilities (pnpm audit) +✓ Linting passes +✓ Formatting correcto +✓ Sem API keys hardcoded (Regra #38) +✓ Sem TODO/FIXME antigos +✓ Comments adequados +``` + +### Auditoria de Skill/Agent +``` +INPUT: Path do componente +OUTPUT: Score 0-10 + relatório + +Verifica: +✓ Secção "Referências e Documentação" existe +✓ Links file:// para procedimentos relevantes +✓ Sem procedimentos embeddados (>100 linhas) +✓ Frontmatter completo e correcto +✓ Description clara e triggering adequado +✓ Segue padrão do plugin +``` + +### Auditoria de Procedimento +``` +INPUT: Path PROC-*.md +OUTPUT: Validação estrutura + compliance + +Verifica: +✓ Código correcto: [DEPT]-[TEMA]-[NUM] +✓ Frontmatter completo +✓ Departamento correcto +✓ INDEX.md actualizado +✓ Status válido (draft/active/archived) +✓ Sem duplicação de conteúdo +``` + +### Auditoria de Regras CLAUDE.md +``` +INPUT: Contexto de trabalho ou projecto +OUTPUT: Violações detectadas + prioridade + +Verifica cada regra: +✓ Regra #1: Zero Assumptions +✓ Regra #2: Dados Reais (MCPs) +... +✓ Regra #47: Security Audit Pre-Commit +``` + +--- + +## 🔍 Workflows + +### Workflow 1: Auditoria Completa de Projeto + +```bash +1. IDENTIFICAR projeto + - Path fornecido ou .desk-project + - Obter contexto do Desk CRM + +2. VERIFICAR estrutura + - Ficheiros obrigatórios presentes? + - Pastas seguem convenção? + - Git configurado correctamente? + +3. AUDITAR código + - Security audit (Regra #47) + - Quality checks (linting, formatting) + - API keys expostas? (Regra #38) + +4. VALIDAR processos + - Commits seguem template? + - Branches correctas? + - CI/CD configurado? + +5. VERIFICAR documentação + - README.txt (Regra #23) + - SPEC.md se aplicável + - Comentários adequados? + +6. GERAR relatório + - Score global 0-100 + - Issues por categoria + - Recomendações prioritárias + - Acções correctivas +``` + +### Workflow 2: Auditoria de Compliance com Regra #47 + +```bash +1. VERIFICAR git hooks instalados + - ~/.git/templates/hooks/pre-commit existe? + - Hook no projecto (.git/hooks/pre-commit)? + - Hook é executável? + +2. ANALISAR últimos commits + - Security audit mencionado? + - Vulnerabilidades documentadas? + - Formato correcto? + +3. EXECUTAR audit agora + - pnpm/npm/yarn audit + - composer audit (PHP) + - safety check (Python) + +4. VALIDAR resultados + - 0 vulnerabilidades? ✅ + - Vulnerabilidades documentadas? ⚠️ + - Vulnerabilidades não documentadas? ❌ + +5. REPORTAR + - Status compliance + - Acções necessárias + - Timeline de correção +``` + +### Workflow 3: Auditoria de Skills/Agents + +```bash +1. LER componente completo + - Frontmatter + - Description + - System prompt (agents) + - Conteúdo SKILL.md + +2. VERIFICAR referenciação + - Secção "Referências e Documentação"? + - Links file:// para PROCs? + - Descrição clara de cada PROC? + +3. DETECTAR procedimentos embeddados + - Checklists longas (>10 itens)? + - Troubleshooting extenso? + - Standards detalhados? + - Workflows complexos? + +4. AVALIAR qualidade + - Description triggering adequado? + - Frontmatter completo? + - Estrutura de pastas correcta? + +5. GERAR score 0-10 + - 8-10: Excelente + - 5-7: Atenção (melhorias sugeridas) + - 0-4: Crítico (refactoring necessário) +``` + +--- + +## 📊 Formato de Relatório + +### Relatório de Auditoria de Projeto + +```markdown +# Relatório Compliance: [Nome Projeto] + +**Data:** YYYY-MM-DD HH:MM +**Auditor:** compliance-auditor v1.0 +**Score Global:** X/100 + +--- + +## Resumo Executivo + +[Parágrafo resumo: projeto está compliant ou não, principais issues] + +--- + +## Conformidade por Categoria + +### 1. Estrutura de Projeto (X/20) +- [✅/❌] .desk-project existe +- [✅/❌] README.txt presente +- [✅/❌] Git configurado +- [✅/❌] Pastas seguem convenção + +### 2. Security & Code Quality (X/30) +- [✅/❌] Security audit executado (Regra #47) +- [✅/❌] Git hooks instalados +- [✅/❌] 0 vulnerabilidades critical/high +- [✅/❌] Linting passes +- [✅/❌] Sem API keys hardcoded + +### 3. Processos (X/25) +- [✅/❌] Commits seguem template +- [✅/❌] SPEC.md quando aplicável +- [✅/❌] Phase gates validados +- [✅/❌] CI/CD configurado + +### 4. Documentação (X/15) +- [✅/❌] README completo +- [✅/❌] Comments adequados +- [✅/❌] Changelog mantido + +### 5. Regras CLAUDE.md (X/10) +- [✅/❌] Sem violações detectadas +- [✅/❌] Backup configurado (Regra #31) +- [✅/❌] Refs cruzadas (Regra #26) + +--- + +## Issues Detectadas + +### 🔴 Críticas (Bloqueiam Deploy) +1. **[Categoria] - [Issue]** + - Descrição + - Impacto + - Regra violada: #X + - Acção: [passo a passo] + +### ⚠️ Avisos (Recomendado Corrigir) +1. **[Categoria] - [Issue]** + - Descrição + - Sugestão + +### ℹ️ Informativas +1. **[Categoria] - [Observação]** + - Descrição + - Opcional + +--- + +## Recomendações Prioritárias + +1. [Acção imediata P1] +2. [Acção importante P2] +3. [Melhoria opcional P3] + +--- + +## Timeline de Correção + +- **Críticas:** <24h +- **Avisos:** <1 semana +- **Informativas:** Próximo sprint + +--- + +## Próxima Auditoria + +Data sugerida: [+1 mês ou após correções] +``` + +--- + +## 🎯 Critérios de Compliance + +### Score 90-100 (Excelente) +- ✅ Todas as regras seguidas +- ✅ 0 issues críticas +- ✅ Documentação completa +- ✅ Security audit passing +- ✅ Processos validados + +### Score 70-89 (Bom) +- ✅ Maioria regras seguidas +- ⚠️ Issues menores apenas +- ✅ Documentação presente +- ✅ Security OK + +### Score 50-69 (Aceitável) +- ⚠️ Algumas violações +- ⚠️ Issues médias +- ⚠️ Documentação incompleta +- ⚠️ Security com avisos + +### Score 30-49 (Crítico) +- ❌ Violações importantes +- ❌ Issues críticas +- ❌ Pouca documentação +- ❌ Security vulnerável + +### Score 0-29 (Bloqueado) +- ❌ Múltiplas violações críticas +- ❌ Sem documentação +- ❌ Security comprometido +- 🚫 **Deploy BLOQUEADO** + +--- + +## 📚 Referências e Documentação + +**SEMPRE consultar antes de auditar:** + +### Regras Core +- **[CLAUDE.md global](file:///home/ealmeida/.claude/CLAUDE.md)** - 47 Regras obrigatórias +- **[CLAUDE.md Hub](file:///media/ealmeida/Dados/Hub/CLAUDE.md)** - Regras específicas Hub + +### Procedimentos +- **[INDEX Procedimentos](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/INDEX.md)** - 36 procedimentos, 8 departamentos +- **[D7-Tecnologia](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/INDEX.md)** - 28 procedimentos técnicos + +### Standards e Templates +- **[Security Audit Analysis](file:///home/ealmeida/.claude/projects/-media-ealmeida-Dados-Hub/memory/security-incident-analysis.md)** - Regra #47 detalhada +- **[Commit Template](file:///home/ealmeida/.git/templates/COMMIT_MSG_SECURITY_TEMPLATE.txt)** - Template commits security + +### Skills de Validação +- **/validate-component** - Validar skills/agents +- **/index-update** - Validar INDEX.md +- **/proc-creator** - Criar procedimentos + +--- + +## 🔄 Integração com Sistema + +### Triggers Automáticos +- **Pre-commit hook:** Validar antes de commit +- **Pre-deploy:** Auditar antes de deploy +- **Weekly:** Auditoria semanal de projectos activos +- **Monthly:** Auditoria completa de compliance + +### Integrações +- **Desk CRM:** Reportar issues como tarefas +- **Git:** Bloquear commits não-compliant +- **CI/CD:** Quality gate em pipeline +- **/today:** Secção compliance diária + +--- + +## 🚨 Anti-Patterns + +**NUNCA:** +- ❌ Aprovar projeto com score <50 +- ❌ Ignorar violações de regras críticas (Regra #47, #38, #23) +- ❌ Auditar sem ler as regras actualizadas +- ❌ Sugerir correções que violam outras regras +- ❌ Dar score sem justificação detalhada + +**SEMPRE:** +- ✅ Ler CLAUDE.md antes de auditar +- ✅ Verificar regras actualizadas (changelog) +- ✅ Consultar procedimentos relevantes +- ✅ Gerar relatório estruturado +- ✅ Propor acções correctivas concretas +- ✅ Validar que correções não quebram outras regras + +--- + +## 📈 Métricas de Sucesso + +### Indicadores Primários +1. **Taxa de Compliance:** Meta >85% projectos com score >70 +2. **Violações Críticas:** Meta 0 violações de Regras #1-#10 +3. **Security Compliance:** Meta 100% projectos com Regra #47 +4. **Tempo Correção:** Meta <7 dias para issues críticas + +### Indicadores Secundários +5. **Auditorias Regulares:** Meta mensal por projecto +6. **Issues Recorrentes:** Meta <10% reincidência +7. **Documentação:** Meta 100% projectos com README.txt +8. **Processos:** Meta 90% commits seguem template + +--- + +## 🤝 Colaboração + +### Reports to +- Emanuel Almeida (decisões de compliance) +- Master Orchestrator (coordenação multi-agente) + +### Colabora com +- **security-compliance-specialist:** Security audits +- **dev-helper:** Code quality +- **worklog-agent:** Tracking de compliance +- **spec-writer:** Validação de specs + +### Delega para +- **validate-component:** Validação skills/agents específica +- **security-auditor:** Análise vulnerabilidades (quando criado) + +--- + +## 📞 Comandos Rápidos + +```bash +# Auditar projeto actual +compliance-auditor audit . + +# Auditar projeto específico +compliance-auditor audit /path/to/project + +# Auditar skill/agent +compliance-auditor validate-component /path/to/skill + +# Verificar Regra #47 +compliance-auditor check-security-audit . + +# Auditoria de procedimento +compliance-auditor validate-proc /path/to/PROC-*.md + +# Relatório compliance geral +compliance-auditor report-all +``` + +--- + +## 🔧 MCPs Disponíveis + +### Primary MCPs +- **desk-crm-v3:** Reportar issues, criar tarefas +- **filesystem:** Ler ficheiros, estrutura projecto + +### Recommended +- **gitea:** Verificar repos, commits, branches +- **memory-supabase:** Guardar padrões de compliance +- **wikijs:** Consultar KB de standards + +--- + +## 🎓 Skills Disponíveis + +### Primary Skills +- **/validate-component:** Validar skills/agents para compliance +- **/today:** Incluir secção compliance no checkup diário +- **/worklog:** Registar auditorias e issues + +### Core Skills +- **/_core:** Sacred Rules e Excellence Standards +- **/knowledge:** Consultar KB de standards +- **/desk:** Contexto projeto via .desk-project + +--- + +*Agent v1.0.0 | 2026-02-14 | Plugin gestao | Descomplicar®* +*Created em resposta ao incidente de segurança - Sistema de 5 Camadas de Defesa* diff --git a/gestao/agents/project-manager.md b/gestao/agents/project-manager.md index 930f9d4..0e86e41 100644 --- a/gestao/agents/project-manager.md +++ b/gestao/agents/project-manager.md @@ -8,6 +8,15 @@ role: USAR PROATIVAMENTE para project management, Agile, Scrum, Kanban, planning domain: Business model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-workspace +recommended_mcps: + - memory-supabase + - mcp-time + - gitea skills: - _core desk_task: 1513 @@ -43,7 +52,17 @@ Gestor de projetos especializado em metodologias Agile/Scrum, planeamento estrat - Identificar riscos e implementar estrategias de mitigacao - Garantir qualidade de entregas e optimizacao de processos -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"Agile Scrum Kanban planeamento" +mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"planeamento estrategico riscos" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao de Projetos" query:"Agile Scrum Kanban planeamento" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao" query:"recursos equipas timelines" diff --git a/gestao/agents/reflect-agent.md b/gestao/agents/reflect-agent.md index 00168df..398b2b2 100644 --- a/gestao/agents/reflect-agent.md +++ b/gestao/agents/reflect-agent.md @@ -6,6 +6,14 @@ role: Auto-reflexão e melhoria contínua do sistema domain: Dev model: sonnet tools: Read, Write, Edit, Glob, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - memory-supabase +recommended_mcps: + - filesystem + - mcp-time skills: - _core - reflect @@ -99,7 +107,8 @@ Corre silenciosamente sem interromper fluxo principal. - Usage: `mcp__memory-supabase__*` ### Recommended for knowledge -- **dify-kb** - Knowledge base AI +- **notebooklm** - KB primaria (Gemini 2.5 RAG) - `mcp__notebooklm__notebook_query` +- **dify-kb** - Knowledge base AI (fallback) - **wikijs** - Wiki documentation - **design-systems** - Knowledge base W3C standards, WCAG, design system best pract - **outline-api** - Outline documentation diff --git a/gestao/agents/software-project-planner.md b/gestao/agents/software-project-planner.md index 3ddca9e..a27700d 100644 --- a/gestao/agents/software-project-planner.md +++ b/gestao/agents/software-project-planner.md @@ -7,6 +7,15 @@ role: Especialista em planeamento e gestao de projetos de software, metodologias domain: Business model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-workspace +recommended_mcps: + - dify-kb + - memory-supabase + - gitea skills: - _core desk_task: 1517 @@ -42,7 +51,18 @@ Especialista em planeamento de projectos de software, metodologias ageis e coord - Gerir riscos tecnicos e criar planos de contingencia - Garantir qualidade de entregas e comunicacao com stakeholders -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"planeamento software agile sprints" +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"arquitectura delivery ciclo vida" +mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"roadmap prioridades valor" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao de Projetos" query:"planeamento software agile sprints" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"arquitectura delivery ciclo vida" diff --git a/gestao/agents/time-management-agent.md b/gestao/agents/time-management-agent.md index 4ffb644..bd4926b 100644 --- a/gestao/agents/time-management-agent.md +++ b/gestao/agents/time-management-agent.md @@ -5,6 +5,14 @@ role: Especialista em gestão temporal e timesheets domain: Productivity, Business model: sonnet tools: Read, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - mcp-time + - desk-crm-v3 +recommended_mcps: + - memory-supabase + - google-workspace mcps: - mcp-time - desk-crm-v3 diff --git a/gestao/agents/wiki-knowledge-agent.md b/gestao/agents/wiki-knowledge-agent.md index 4acc51a..6e95051 100644 --- a/gestao/agents/wiki-knowledge-agent.md +++ b/gestao/agents/wiki-knowledge-agent.md @@ -5,6 +5,16 @@ role: Especialista em gestão de conhecimento e Wiki.js domain: Knowledge, Documentation model: sonnet tools: Read, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - wikijs + - desk-crm-v3 +recommended_mcps: + - notebooklm + - dify-kb + - memory-supabase + - outline-api mcps: - wikijs - desk-crm-v3 @@ -86,7 +96,11 @@ Você é um gestor de conhecimento especializado em: ### Integração Multi-Sistema -1. **Wiki.js ↔ Dify KB** +1. **Wiki.js ↔ NotebookLM** (primario) + - Pesquisa conhecimento curado (Gemini 2.5 RAG) + - Enriquecimento com contexto profundo + +2. **Wiki.js ↔ Dify KB** (fallback) - Sincronização de artigos técnicos - Enriquecimento com AI - Validação de consistência @@ -111,7 +125,12 @@ Você é um gestor de conhecimento especializado em: - `update_page` - Actualizar existente - `delete_page` - Remover página -### dify-kb (SECONDARY) +### notebooklm (SECONDARY - Knowledge primaria) +- Gemini 2.5 RAG com conhecimento curado +- Pesquisa semântica profunda +- Usage: `mcp__notebooklm__notebook_query notebook_id:"" query:""` + +### dify-kb (TERTIARY - Fallback) - Enriquecimento AI de artigos - Pesquisa semântica - Sugestões de conteúdo diff --git a/gestao/knowledge/datasets.json b/gestao/knowledge/datasets.json index 573aa7e..d7fa595 100644 --- a/gestao/knowledge/datasets.json +++ b/gestao/knowledge/datasets.json @@ -1,12 +1,92 @@ { - "description": "Dify KB datasets for Gestao domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "22799925-8dc5-4a1f-92b9-233468a5048b", "name": "Gestao", "priority": 1, "document_count": 86, "word_count": 9137325}, - {"id": "e2b1cd92-aa72-4404-8bf3-9f5bf16b044a", "name": "Gestao de Projetos", "priority": 1, "document_count": 41, "word_count": 14018064}, - {"id": "cae2a27e-f5bc-4d75-8a7a-9f83064f2512", "name": "Gestao de Processos", "priority": 1, "document_count": 3, "word_count": 732099}, - {"id": "73ec984b-3da2-4cfd-9f83-5f6b02b877b4", "name": "Estrategia", "priority": 2, "document_count": 50, "word_count": 8348608}, - {"id": "8ce4429f-8cf6-43b5-869d-75c8e1b461e8", "name": "Produtividade", "priority": 2, "document_count": 5, "word_count": 612301}, - {"id": "8eb4682b-eff2-4366-a577-18b698d900da", "name": "Escrever PT-PT", "priority": 2, "document_count": 2, "word_count": 79968} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for Gestao domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "0c9c079c-a426-486c-99eb-1564d42d37ad", + "title": "Gestao de Projectos e Agile", + "topics": [ + "gestao" + ], + "maps_from_dify": "Gestao" + }, + { + "id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", + "title": "Gestao de Operacoes", + "topics": [ + "gestao", + "processos" + ], + "maps_from_dify": "Gestao de Processos" + }, + { + "id": "79d43410-0e29-4be1-881d-84db6bdc239a", + "title": "Estrategia e Empreendedorismo", + "topics": [ + "estrategia" + ], + "maps_from_dify": "Estrategia" + }, + { + "id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131", + "title": "Obsidian + Claude", + "topics": [ + "produtividade" + ], + "maps_from_dify": "Produtividade" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "22799925-8dc5-4a1f-92b9-233468a5048b", + "name": "Gestao", + "priority": 1, + "document_count": 86, + "word_count": 9137325 + }, + { + "id": "e2b1cd92-aa72-4404-8bf3-9f5bf16b044a", + "name": "Gestao de Projetos", + "priority": 1, + "document_count": 41, + "word_count": 14018064 + }, + { + "id": "cae2a27e-f5bc-4d75-8a7a-9f83064f2512", + "name": "Gestao de Processos", + "priority": 1, + "document_count": 3, + "word_count": 732099 + }, + { + "id": "73ec984b-3da2-4cfd-9f83-5f6b02b877b4", + "name": "Estrategia", + "priority": 2, + "document_count": 50, + "word_count": 8348608 + }, + { + "id": "8ce4429f-8cf6-43b5-869d-75c8e1b461e8", + "name": "Produtividade", + "priority": 2, + "document_count": 5, + "word_count": 612301 + }, + { + "id": "8eb4682b-eff2-4366-a577-18b698d900da", + "name": "Escrever PT-PT", + "priority": 2, + "document_count": 2, + "word_count": 79968 + } + ] + } + } +} \ No newline at end of file diff --git a/gestao/skills/aiktop-tasks/SKILL.md b/gestao/skills/aiktop-tasks/SKILL.md new file mode 100644 index 0000000..4d259dc --- /dev/null +++ b/gestao/skills/aiktop-tasks/SKILL.md @@ -0,0 +1,144 @@ +--- +name: aiktop-tasks +description: > + Executa tarefas agendadas para AikTop no Desk CRM. Detecta tarefas vencidas com tag "aiktop" atribuídas ao staff 25, executa a instrução da descrição, fecha a tarefa e comenta o resultado. Invocado automaticamente por cron no dev server a cada 15 min. Use when "aiktop tasks", "executar tarefas aiktop", "task queue ai". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: management +tags: [aiktop, automacao, task-queue, desk-crm] +desk_task: 1755 +desk_project: 65 +allowed-tools: Read, mcp__desk-crm-v3, mcp__mcp-time, mcp__ssh-unified, mcp__imap, mcp__memory-supabase +mcps: [desk-crm-v3, mcp-time] +--- + +# /aiktop-tasks v1.0 + +Executa automaticamente tarefas agendadas para o AikTop no Desk CRM. + +--- + +## Protocolo + +### Passo 1: Obter data actual + +``` +mcp__mcp-time__current_time → data hoje (YYYY-MM-DD) +``` + +### Passo 2: Recolher tarefas AikTop pendentes + +``` +mcp__desk-crm-v3__get_tasks({ + assignee: 25, + tags: ["aiktop"], + status: [1, 4], + due_date_to: hoje +}) + +SE 0 tarefas → registar "Nenhuma tarefa AikTop pendente" e terminar. +``` + +### Passo 3: Para cada tarefa (por ordem de prioridade) + +``` +1. mcp__desk-crm-v3__update_task({ task_id, status: 4 }) + → Marcar "Em progresso" + +2. LER task.name + task.description + → A descrição É a instrução completa para o claude executar + +3. EXECUTAR a instrução descrita na tarefa + → Usar os MCPs disponíveis conforme necessário + → Guardar resultado/output + +4. mcp__desk-crm-v3__update_task({ task_id, status: 5 }) + → Marcar "Concluída" + +5. mcp__desk-crm-v3__add_task_comment({ + task_id, + content: html_resultado, + staff_id: 25 + }) + → Comentar com o resultado da execução +``` + +### Passo 4: Resumo final + +``` +SE invocado via cron (não interactivo): + → Escrever em ~/.claude-work/aiktop-tasks-{date}.log + +SE invocado directamente: + → Mostrar output markdown ao utilizador +``` + +--- + +## Formato Comentário de Resultado (HTML) + +```html +

Tarefa executada — YYYY-MM-DD HH:MM

+

Instrução: [nome da tarefa]

+

Resultado: Concluído | Parcial | Erro

+

Output

+
    +
  • [resultado principal]
  • +
  • [dados relevantes]
  • +
+

Executado automaticamente por /aiktop-tasks v1.0

+``` + +--- + +## Protocolo de Criação de Tarefas AikTop + +> Para agendar trabalho para o AikTop, criar tarefa Desk CRM com: + +| Campo | Valor | +|-------|-------| +| **Assignee** | AikTop (staff 25) | +| **Tag** | `aiktop` (obrigatório) | +| **Nome** | O que fazer (breve) | +| **Descrição** | Instrução completa — o claude vai executar isto literalmente | +| **Due date** | Quando executar | +| **Prioridade** | Conforme urgência | + +**Exemplos de descrições válidas:** +- "Verificar logs `/root/Dev/imap-cleaner/cron.log` e `/root/Dev/auto-expense/auto-expense.log`. Reportar se houve erros ou se o pipeline correu bem." +- "Correr /imap-triage e reportar faturas detectadas." +- "Verificar tarefas overdue no Desk CRM e sugerir as 3 mais urgentes." + +--- + +## Wrapper Script (dev server) + +```bash +# /root/Dev/aiktop-tasks/run-aiktop-tasks.sh +#!/bin/bash +export IS_SANDBOX=1 +LOG="$HOME/Dev/aiktop-tasks/aiktop-tasks.log" +echo "$(date) [START] A verificar tarefas AikTop..." >> "$LOG" +claude --print --dangerously-skip-permissions "/aiktop-tasks" < /dev/null >> "$LOG" 2>&1 +EXIT_CODE=$? +echo "$(date) [END] exit=$EXIT_CODE" >> "$LOG" +exit $EXIT_CODE +``` + +**Cron:** `*/15 * * * * /root/Dev/aiktop-tasks/run-aiktop-tasks.sh` + +--- + +## Anti-Patterns + +- NUNCA executar tarefas sem tag `aiktop` (filtro de segurança) +- NUNCA fechar tarefa sem adicionar comentário com resultado +- NUNCA ignorar tarefas com status 4 (em progresso) — podem ter ficado presas +- SEMPRE executar por ordem de prioridade (4=Urgente primeiro) +- NUNCA assumir que a descrição é sempre simples — pode invocar outras skills + +--- + +*Skill v1.0.0 | 04-03-2026 | Descomplicar®* diff --git a/gestao/skills/calendar-manager/SKILL.md b/gestao/skills/calendar-manager/SKILL.md index eb308b9..d1f34c6 100644 --- a/gestao/skills/calendar-manager/SKILL.md +++ b/gestao/skills/calendar-manager/SKILL.md @@ -444,7 +444,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ```javascript // Pesquisar técnicas de gestão de tempo -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "8ce4429f-8cf6-43b5-869d-75c8e1b461e8", query: "blocos de foco time blocking" }) diff --git a/gestao/skills/daily-digest/SKILL.md b/gestao/skills/daily-digest/SKILL.md new file mode 100644 index 0000000..5264324 --- /dev/null +++ b/gestao/skills/daily-digest/SKILL.md @@ -0,0 +1,140 @@ +--- +name: daily-digest +description: > + Resumo diario do estado operacional - timer activo, tickets abertos, facturas vencidas, leads novos, propostas pendentes e agenda do dia. Use when "resumo", "digest", "estado do dia", "dashboard", "metricas dia". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: management +tags: [digest, dashboard, daily, tickets, invoices, leads, calendar] +desk_task: 1710 +desk_project: 65 +allowed-tools: Read, Write, mcp__desk-crm-v3, mcp__google-workspace, mcp__mcp-time +mcps: desk-crm-v3, google-workspace, mcp-time +dependencies: + mcps: [desk-crm-v3, google-workspace, mcp-time] +triggers: + - "User asks for daily summary" + - "User mentions 'resumo', 'digest', 'estado do dia'" + - "Invoked by /today orchestrator" +--- + +# /daily-digest v1.0 + +Recolhe e apresenta o estado operacional do dia. + +--- + +## Protocolo + +### Passo 1: Recolher Dados (paralelo) + +> Executar TUDO em paralelo para minimizar tempo. + +``` +Em paralelo: + +1. TIMER ACTIVO + Verificar ~/.claude-work/active-timer.json + Se activo: mostrar tarefa, duracao + Se >4h: alertar "Timer activo ha muito tempo!" + +2. TICKETS ABERTOS + mcp__desk-crm-v3__get_tickets({ status: [1,2,3], limit: 20 }) + Contar por prioridade + +3. FACTURAS VENCIDAS + mcp__desk-crm-v3__overdue_invoices_report() + Total valor + contagem + +4. LEADS NOVOS + mcp__desk-crm-v3__get_leads({ status: [7,14], limit: 20 }) + Leads com status 7 (Novo) ou 14 + +5. PROPOSTAS PENDENTES + mcp__desk-crm-v3__get_estimates({ status: 4, limit: 20 }) + Estimates com status "To Do" + +6. ESTIMATES ACEITES + mcp__desk-crm-v3__get_estimates({ status: 3, limit: 10 }) + Destaques de valor + +7. AGENDA DO DIA + mcp__google-workspace__calendar_get_events({ + user_google_email: "emanuelalmeidaa@gmail.com", + time_min: "YYYY-MM-DDT00:00:00Z", + time_max: "YYYY-MM-DDT23:59:59Z" + }) +``` + +### Passo 2: Formatar Dashboard + +```markdown +## Resumo do Dia + +### Timer +[Status ou "Nenhum timer activo"] + +### Tickets +- Abertos: X (Y urgentes) + +### Facturas +- Vencidas: X (valor total EUR) + +### Tarefas (resumo) +- Urgentes (prioridade 4): X +- Alta prioridade overdue: Y +- Normal prioridade overdue: Z +- Total overdue: W + +### Leads + Propostas +- Leads novos: X +- Propostas pendentes: Y +- Estimates aceites: Z (destaque: [cliente] [valor] EUR) + +### Agenda +- HH:MM - [Evento] +- Ou "Sem eventos hoje" +``` + +### Passo 3: Output JSON (quando invocado pelo /today) + +``` +SE invocado com argumento "json": + Escrever em ~/.claude-work/today-digest-{date}.json + Formato: + { + "timer": null | {"task_id": 1446, "duration": "2h15m"}, + "tickets": {"open": 4, "urgent": 1}, + "invoices": {"overdue": 0, "total_eur": 0}, + "leads": {"new": 0}, + "estimates": {"pending": 0, "accepted": 10}, + "calendar": [] + } + +SE invocado standalone: + Mostrar dashboard Markdown directamente +``` + +--- + +## Alertas Automaticos + +Gerar alertas se: +- Timer activo >4h +- Facturas vencidas >30 dias +- Tickets urgentes (prioridade 3-4) sem resposta >24h +- Leads novos ha >48h sem contacto + +--- + +## Anti-Patterns + +- NUNCA mostrar todos os tickets/facturas (limite 20, mostrar resumo) +- NUNCA duplicar dados ja disponiveis noutras skills (/tasks-overview para tarefas detalhadas) +- SEMPRE usar mcp-time para data actual (nunca assumir) + +--- + +*Skill v1.0.0 | 04-03-2026 | Descomplicar®* diff --git a/gestao/skills/delegate/SKILL.md b/gestao/skills/delegate/SKILL.md index c41683b..410712b 100644 --- a/gestao/skills/delegate/SKILL.md +++ b/gestao/skills/delegate/SKILL.md @@ -111,7 +111,7 @@ if (protocol?.auto_consult) { // 6. Consultar Dify KB (paralelo) const results = await Promise.all( protocol.priority_datasets.map(id => - mcp__dify-kb__dify_kb_retrieve_segments({ + mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: id, query: query, top_k: protocol.top_k || 3 diff --git a/gestao/skills/imap-triage/SKILL.md b/gestao/skills/imap-triage/SKILL.md new file mode 100644 index 0000000..65a414e --- /dev/null +++ b/gestao/skills/imap-triage/SKILL.md @@ -0,0 +1,254 @@ +--- +name: imap-triage +description: > + Triagem automatica de emails IMAP em 14 contas. Elimina spam, arquiva promocionais, identifica facturas para /auto-expense, flagga prioritarios. Deduplicacao via Supabase. Use when "imap", "triagem email", "limpar emails", "email triage", "processar emails". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: management +tags: [imap, email, triage, spam, promotions, invoices, supabase] +desk_task: 1710 +desk_project: 65 +allowed-tools: Read, Write, mcp__imap, mcp__ssh-unified +mcps: imap, ssh-unified +dependencies: + mcps: [imap, ssh-unified] + files: + - /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md +triggers: + - "User asks to process emails" + - "User mentions 'imap', 'triagem', 'emails', 'limpar inbox'" + - "Invoked by /today orchestrator" +--- + +# /imap-triage v1.0 + +Triagem automatica de 14 contas IMAP com deduplicacao Supabase. + +--- + +## Contas IMAP (14) + +``` +emanuel, it, help, suporte, contabilidade, financeiro, +rh, mkt, design, news, aiktop, recursos, google +``` + +--- + +## Protocolo + +### Passo 0: Carregar emails ja processados (Supabase) + +> Executar UMA VEZ no inicio, antes de iterar contas. +> Fonte de verdade: tabela `imap_processed_emails` em Supabase (EasyPanel). + +``` +mcp__ssh-unified__ssh_execute( + server="easy", + command="docker exec descomplicar_supabase-db-1 psql -U postgres -d postgres -t -A -c \"SELECT message_id FROM public.imap_processed_emails\"" +) + +Guardar resultado como Set: processed_ids +``` + +### Passo 1: Carregar tabela de fornecedores + +``` +Read: /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md +Extrair: +- Lista de dominios de fornecedores conhecidos +- Lista de dominios de plataformas multi-fornecedor +``` + +### Passo 2: Iterar contas IMAP + +Para cada conta: `imap_list_emails(account, folder="INBOX", limit=50)` + +Para cada email: +1. Verificar `message_id` contra `processed_ids` -> SE match, SALTAR +2. Classificar por ordem de prioridade (ver seccao Classificacao) + +### Passo 3: Registar no Supabase (batch) + +> Executar UMA VEZ no final, apos processar todas as contas. + +``` +Acumular lista: { message_id, account_id, subject, sender, email_date, action, action_detail } + +Actions: spam_deleted, promo_archived, expense_flagged, priority_flagged, notification_closed, skipped + +mcp__ssh-unified__ssh_execute( + server="easy", + command="docker exec descomplicar_supabase-db-1 psql -U postgres -d postgres -c \" + INSERT INTO public.imap_processed_emails (message_id, account_id, subject, sender, email_date, action, action_detail) + VALUES (...) + ON CONFLICT (message_id) DO NOTHING; + \"" +) + +Maximo ~50 VALUES por INSERT. +``` + +### Passo 4: Escrever output JSON + +``` +Escrever em ~/.claude-work/today-imap-{date}.json: +{ + "spam": 5, + "promo": 12, + "facturas": [ + {"account": "contabilidade", "uid": 164, "message_id": "...", "fornecedor": "MEO", "subject": "..."} + ], + "prioritarios": [ + {"account": "emanuel", "uid": 100, "subject": "...", "sender": "..."} + ], + "notificacoes": [...], + "erros": [], + "contas_processadas": 14, + "total_emails": 45 +} +``` + +--- + +## Classificacao de Emails + +> Aplicar por ordem de prioridade. Primeiro match ganha. + +### 1. SPAM -> Eliminar + +``` +imap_delete_email(account, uid) + +Padroes: +- Subject: lottery, winner, urgent money, bitcoin investment, guest post, SEO services, backlinks, partnership +- Remetente: *.ru, *.cn (excepto conhecidos) +- Subject todo em MAIUSCULAS +- Subject com caracteres estranhos excessivos +``` + +### 2. PROMOCIONAL -> Arquivar + +``` +imap_move_email(account, uid, "Promotions") + +NOTA: Contas sem pasta "Promotions" (google, design, rh) -> imap_delete_email + +Padroes: +- Subject: newsletter, promo, desconto, oferta, unsubscribe +- Remetente: *@marketing.*, *@news.*, *@promo.* +- Headers: List-Unsubscribe presente +``` + +### 3. FACTURA/RECIBO -> Flag para /auto-expense + +``` +NAO processar aqui - apenas identificar e registar no output JSON. +A skill /auto-expense trata da criacao de despesas. + +Deteccao: +3a. FORNECEDOR DIRECTO: + - Dominio remetente bate com tabela de fornecedores + - Subject contem: factura, invoice, recibo, receipt, pagamento, paid + +3b. PLATAFORMA MULTI-FORNECEDOR: + - Dominio: toconline.pt, stripe.com, paypal.com, fastspring.com, payproglobal.com + - Registar com nota sobre plataforma + +Action: expense_flagged +``` + +### 4. NOTIFICACAO SISTEMA -> Registar + +``` +Padroes protegidos (NUNCA auto-fechar): +- Legal Update, Policy Change, Deprecation, End of Life +- Security Alert, API Change, Terms Update +- Action Required, Migration Required +- Compliance, GDPR, Infrastructure Change + +Outros: +- Wordfence alerts, n8n updates, server notifications +- Registar para inclusao no dashboard de alertas + +Action: notification_closed ou priority_flagged (conforme gravidade) +``` + +### 5. PRIORITARIO -> Incluir no relatorio + +``` +- Remetente: cliente conhecido (verificar nome/dominio) +- Subject: urgente, problema, erro, critical, down +- Threads activas (RE:, FW:) + +Action: priority_flagged +``` + +### 6. RESTANTES -> Saltar + +``` +Emails que nao encaixam em nenhuma categoria. +Action: skipped +``` + +--- + +## Excepcoes (NUNCA processar automaticamente) + +``` +- *@descomplicar.pt (internos) +- *@gov.pt, *@at.gov.pt, *@seg-social.pt (governo) +- *@tribunais.org.pt (tribunais) +``` + +--- + +## Emails a IGNORAR (nao sao facturas) + +``` +- "Payment Confirmation" / "Payment Was Successfully Processed" -> apenas confirmacao +- "Your subscription has been renewed" sem valor -> apenas notificacao +- "Notificacao de transferencia" de bancos -> notificacao bancaria +- Marketing/changelog dos mesmos fornecedores -> promocional +- Subject "Welcome" / "Getting Started" -> onboarding +``` + +--- + +## Output Standalone + +Quando invocado directamente (sem /today): + +```markdown +## Triagem IMAP - DD-MM-YYYY + +**Total: X emails processados em Y contas** + +| Conta | Spam | Promo | Factura | Notif | Prio | Total | +|-------|------|-------|---------|-------|------|-------| + +### Facturas Detectadas (para /auto-expense) +- contabilidade: MEO (uid 164) - FT A/861215955 + +### Prioritarios +- emanuel: [Subject] de [Remetente] + +### Alertas Sistema +- [Alertas de seguranca, updates criticos] +``` + +--- + +## Anti-Patterns + +- NUNCA criar despesas directamente (delegar para /auto-expense) +- NUNCA processar >50 emails por conta (limitar) +- NUNCA eliminar emails de dominios protegidos +- SEMPRE registar no Supabase, mesmo se skipped +- SEMPRE usar imap_delete para contas sem pasta "Promotions" + +--- + +*Skill v1.0.0 | 04-03-2026 | Descomplicar®* diff --git a/gestao/skills/imap-triage/config/email-triage-rules.md b/gestao/skills/imap-triage/config/email-triage-rules.md new file mode 100644 index 0000000..f7bddf1 --- /dev/null +++ b/gestao/skills/imap-triage/config/email-triage-rules.md @@ -0,0 +1,456 @@ +# Regras de Triagem de Emails + +## Contas IMAP (12) + +```yaml +accounts: + - emanuel@descomplicar.pt + - it@descomplicar.pt + - help@descomplicar.pt + - suporte@descomplicar.pt + - contabilidade@descomplicar.pt + - financeiro@descomplicar.pt + - info@descomplicar.pt + - rh@descomplicar.pt + - mkt@descomplicar.pt + - design@descomplicar.pt + - news@descomplicar.pt + - aiktop@descomplicar.pt +``` + +--- + +## Regra 1: SPAM (Eliminar) + +**Acção**: `imap_delete_email` + +### Padrões Subject (case insensitive) +``` +- lottery +- winner +- million dollars +- urgent money +- bitcoin investment +- crypto opportunity +- claim your prize +- act now +- limited time offer +- you have been selected +- dear beneficiary +- inheritance +- nigerian prince +``` + +### Padrões Remetente +``` +- *@*.ru (excepto conhecidos) +- *@*.cn (excepto conhecidos) +- no-reply@spam* +- noreply@bulk* +``` + +### Indicadores técnicos +``` +- SPF fail +- DKIM fail +- Muitos caracteres especiais no subject +- Subject todo em MAIÚSCULAS +``` + +--- + +## Regra 2: PROMOCIONAIS (Arquivar ou Eliminar) + +**Acção padrão**: `imap_move_email` → pasta "Promotions" + +**Excepções por conta:** +```yaml +delete_promotions: + - rh # Não tem pasta Promotions - apagar directamente +``` + +> Contas listadas em `delete_promotions`: usar `imap_delete_email` em vez de mover. + +### Padrões Subject +``` +- newsletter +- promo +- promoção +- desconto +- oferta especial +- black friday +- cyber monday +- novidades +- new arrivals +- sale +- % off +- grátis +- free shipping +``` + +### Padrões Remetente +``` +- *@marketing.* +- *@news.* +- *@promo.* +- *@newsletter.* +- *@campaigns.* +- *@mailchimp.com +- *@sendgrid.net +- *@mailgun.org +``` + +### Headers +``` +- List-Unsubscribe presente +- Precedence: bulk +- X-Campaign-* +``` + +--- + +## Regra 3: FACTURAS PAGAS (Reencaminhar) + +**Acção**: Registar para reencaminhar para `contabilidade@descomplicar.pt` + +### Padrões Subject +``` +- factura +- fatura +- invoice +- recibo +- receipt +- pagamento confirmado +- payment confirmed +- pago +- paid +- comprovativo +- ordem de pagamento +``` + +### Padrões Remetente (serviços conhecidos) +``` +- *@hetzner.com +- *@ovh.com +- *@cloudflare.com +- *@github.com +- *@google.com +- *@microsoft.com +- *@adobe.com +- *@figma.com +- *@notion.so +- *@stripe.com +- *@paypal.com +- *@wise.com +- *@revolut.com +- *@n26.com +- *facturacao@* +- *billing@* +- *invoices@* +``` + +### Anexos +``` +- *.pdf com "factura" no nome +- *.pdf com "invoice" no nome +- *.pdf com "recibo" no nome +``` + +--- + +## Regra 4: PRIORITÁRIOS (Listar) + +**Acção**: Incluir no relatório diário para revisão manual + +### Padrões Subject +``` +- urgente +- urgent +- importante +- important +- problema +- problem +- erro +- error +- falha +- failure +- down +- offline +- crítico +- critical +``` + +### Remetentes prioritários +``` +# Clientes activos (verificar DeskCRM) +# Parceiros importantes +# Serviços críticos: +- *@cloudflare.com (security alerts) +- *@hetzner.com (server alerts) +- *@github.com (security) +- *@google.com (security) +``` + +### Indicadores +``` +- RE: ou FW: (threads activas) +- Múltiplos destinatários da empresa +- Marcado como importante pelo remetente +``` + +--- + +## Excepções (Nunca processar automaticamente) + +```yaml +whitelist_senders: + - *@descomplicar.pt # Internos + - *@cliente-importante.pt # Clientes VIP + +whitelist_domains: + - gov.pt # Governo + - tribunais.org.pt # Tribunais + - at.gov.pt # Autoridade Tributária + - seg-social.pt # Segurança Social +``` + +--- + +## Pastas IMAP Standard + +| Pasta | Uso | +|-------|-----| +| INBOX | Emails por processar | +| Promotions | Emails promocionais arquivados | +| Processed | Emails processados pelo /today | +| Important | Emails marcados como prioritários | +| Trash | Eliminados | + +--- + +## Métricas Diárias + +Registar em cada execução: +```yaml +metrics: + date: YYYY-MM-DD + accounts_processed: 12 + total_emails: X + spam_deleted: Y + promotions_archived: Z + invoices_forwarded: W + priority_flagged: V + processing_time: Xs +``` + +--- + +--- + +## Regras de Tickets (DeskCRM) + +### Notificações de Sistema → NUNCA auto-fechar + +> **REGRA PRIORITÁRIA:** Verificar ANTES dos padrões SPAM. Se um ticket corresponder a esta regra, não pode ser fechado automaticamente. + +**Padrões protegidos (subject - case insensitive):** +```regex +Legal Update|Legal Notice|Policy Change|Policy Update| +Deprecation|End of Life|EOL|Breaking Change| +Migration Required|Action Required|Action Needed| +Security Alert|Security Advisory|Security Notice| +API Change|API Update|Terms Update|Terms Change| +Service Disruption|Maintenance Required| +Compliance|GDPR|Data Processing|Data Processor| +Infrastructure Change|Platform Update|transitions to +``` + +**Condição:** Remetente deve ser fornecedor conhecido (ver lista de remetentes conhecidos abaixo). + +**Acção:** +``` +→ NÃO fechar +→ Listar no relatório como: "⚠️ REQUER ACÇÃO: #{ID} - {Assunto}" +→ Manter aberto para análise e decisão manual +``` + +--- + +### Tickets SPAM → Fechar AUTOMATICAMENTE + +> **IMPORTANTE:** Verificar PRIMEIRO se o ticket corresponde à regra de "Notificações de Sistema" acima. Se sim, NÃO fechar. + +**Padrões de detecção (subject):** +```regex +Guest Post|SEO services|backlinks|partnership| +link building|dofollow|collaboration opportunity| +Boas Festas|Season's Greetings +``` + +> **NOTA:** "Action Required", "Termos de Serviço" e notificações legais foram removidos dos padrões SPAM. Podem indicar mudanças reais em serviços que usamos. São tratados pela regra de "Notificações de Sistema" acima. + +**⚡ Acção AUTOMÁTICA - Executar SEM intervenção manual:** +``` +close_ticket(ticket_id, message="Fechado automaticamente - SPAM detectado") +# Registar: "🗑️ SPAM fechado: #{ID} - {Assunto}" +``` + +> [!important] SPAM = FECHAR IMEDIATAMENTE +> Não perder tempo a analisar. Fechar automaticamente e seguir em frente. + +--- + +### Tickets de PAGAMENTOS → Contabilidade + Fechar + +**Departamentos DeskCRM:** +| ID | Nome | Email | +|----|------|-------| +| 1 | Comercial | info@descomplicar.pt | +| 2 | Suporte | suporte@descomplicar.pt | +| 3 | **Contabilidade** | contabilidade@descomplicar.pt | +| 4 | RH | rh@descomplicar.pt | +| 5 | Design | design@descomplicar.pt | +| 6 | Marketing | mkt@descomplicar.pt | +| 7 | Tecnologia | it@descomplicar.pt | + +**Padrões de detecção (subject):** +```regex +payment|pagamento|pago|paid| +invoice|factura|fatura|recibo| +successfully.*(processed|completed)| +subscription.*(renewed|confirmed)| +order.*confirmed|receipt| +account.*funded|has been funded| +Envio de Fatura Eletrónica| +Invoice Payment Confirmation| +Customer Invoice +``` + +**Remetentes conhecidos (processar SEMPRE):** +```yaml +services: + # Hosting & Infra + - "*@elasticemail.com" # Elastic Email + - "*@hetzner.com" # Hetzner + - "*@hetzner.de" + - "*@centos-webpanel.com" # CWP + - "*@control-webpanel.com" + + # Design & Tools + - "*@canva.com" # Canva + + # Telecom PT + - "*@meo.pt" # MEO + - "*@altice.pt" + - "*@nos.pt" # NOS (futuro) + - "*@vodafone.pt" # Vodafone (futuro) + + # Cloud & SaaS + - "*@cloudflare.com" + - "*@github.com" + - "*@google.com" + - "*@microsoft.com" + - "*@adobe.com" + - "*@figma.com" + - "*@notion.so" + - "*@openai.com" + - "*@email.openai.com" + - "*@anthropic.com" + - "*@openrouter.zendesk.com" # OpenRouter + + # Pagamentos + - "*@stripe.com" + - "*@paypal.com" + - "*@wise.com" + - "*@revolut.com" +``` + +**Lógica de processamento:** +``` +IF assunto contém padrão de pagamento/factura: + IF remetente IN remetentes_conhecidos: + → Contabilidade + Fechar (AUTOMÁTICO) + ELSE: + → Avaliar indicadores de spam/phishing + → LISTAR para revisão manual com recomendação +``` + +**⚡ Acção AUTOMÁTICA para remetentes CONHECIDOS:** +``` +# Executar AMBAS as acções automaticamente, SEM intervenção manual: +1. update_ticket(ticket_id, department=3) # Mover para Contabilidade +2. close_ticket(ticket_id, message="Fatura processada automaticamente - Contabilidade") +# Registar: "💰 Contabilidade + Fechado: #{ID} - {Assunto}" +``` + +**Acção para remetentes DESCONHECIDOS:** +``` +1. Avaliar indicadores de spam (ver abaixo) +2. LISTAR no relatório com recomendação: + - [SPAM?] se indicadores presentes + - [NOVO?] se parece legítimo (possível novo serviço) +3. Aguardar decisão manual +``` + +### Indicadores de SPAM/PHISHING + +**Alta probabilidade de SPAM:** +- Remetente pessoal (gmail, hotmail, yahoo) a enviar "facturas empresariais" +- Domínio suspeito (muitos números, hífens, extensões estranhas) +- Erros ortográficos no assunto ("facktura", "pagamanto") +- Assunto todo em MAIÚSCULAS +- Urgência exagerada ("ÚLTIMO AVISO", "URGENTE", "CONTA SUSPENSA") +- Sem número de factura/referência específico +- Remetente não corresponde à empresa alegada no assunto + +**Provavelmente LEGÍTIMO (novo serviço):** +- Domínio empresarial consistente com o assunto +- Formato profissional (número de factura, data, referência) +- Sem urgência exagerada +- Padrão consistente com facturas reais + +> [!info] NUNCA eliminar automaticamente remetentes desconhecidos +> Podem ser novos serviços subscritos. Sempre listar para revisão manual. + +### Tickets para ELIMINAR (sem valor contabilístico) + +**Padrões de assunto:** +```yaml +delete_patterns: + # Elastic Email - recargas + - "Your Elastic Email Account was successfully re-charged" + - "Account re-charged" + - "Auto-recharge successful" + - "Credit added to your account" + + # FULL Services - activações + - "[BOT] Ativação realizada com sucesso" + - "[BOT] Activation successful" +``` + +**Acção:** +``` +delete_ticket(ticket_id, confirm=true, reason="Notificação automática sem valor") +``` + +> Estas são notificações de recarga automática, não facturas. Não têm valor para contabilidade. + +**Exemplos de assuntos detectados:** +- "Your Elastic Email Payment Was Successfully Processed" +- "Canva - Your invoice is ready" +- "Hetzner - Invoice for January 2025" +- "CentOS WebPanel Pro License Invoice" +- "MEO - Factura disponível" +- "Invoice #12345 - Payment Confirmed" +- "Pagamento confirmado - Factura #123" +- "Your OpenAI API account has been funded" +- "Your OpenRouter, Inc receipt [#1234-5678]" +- "Your receipt from OpenRouter, Inc #1234-5678" +- "Envio de Fatura Eletrónica: FT A/123456789" +- "Invoice Payment Confirmation" +- "Customer Invoice" + +--- + +**Versão**: 1.1.0 +**Última actualização**: 2025-01-21 diff --git a/gestao/skills/index-update/SKILL.md b/gestao/skills/index-update/SKILL.md new file mode 100644 index 0000000..11e5b95 --- /dev/null +++ b/gestao/skills/index-update/SKILL.md @@ -0,0 +1,392 @@ +--- +name: index-update +description: Actualiza INDEX.md de procedimentos após criar/modificar/arquivar PROC. Use quando "actualizar index", "update INDEX.md", depois de criar procedimento, mover PROC, arquivar procedimento. Mantém estatísticas, navegação e data actualizadas. +--- + +# /index-update - Actualizador de INDEX.md + +Actualiza ficheiros INDEX.md de procedimentos após operações (criar, modificar, mover, arquivar). + +--- + +## Referências e Documentação + +**SEMPRE consultar:** +- **[06-Operacoes/Procedimentos/INDEX.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/INDEX.md)** - INDEX principal (8 departamentos) +- **[Hub CLAUDE.md](file:///media/ealmeida/Dados/Hub/CLAUDE.md)** - Convenções INDEX.md + +--- + +## O Que Actualiza + +### 1. INDEX.md Departamental + +Após criar/modificar/mover PROC em departamento: + +```markdown +| [PROC-Titulo.md](./PROC-Titulo.md) | Descrição breve | [DEPT]-[TEMA]-[NUM] | +``` + +**Campos:** +- Nome ficheiro (link relativo) +- Descrição breve (1 linha, <80 chars) +- Código procedimento + +**Ordenação:** Por código (DEV-MCP-001, DEV-MCP-002, WP-SEC-001...) + +### 2. INDEX.md Principal + +Actualizar estatísticas globais: + +```markdown +**Total:** X procedimentos (update counter) + +| Departamento | Procedimentos | Código Exemplo | +|--------------|---------------|----------------| +| D7-Tecnologia | 28 → 29 | DEV, WP, INF, AI, WEB | +``` + +### 3. Metadados + +Actualizar em AMBOS os INDEX.md: + +```markdown +**Última actualização:** 2026-02-13 +``` + +--- + +## Protocolo de Actualização + +### Após Criar PROC (/proc-creator) + +``` +1. IDENTIFICAR departamento do novo PROC + - Ler frontmatter do PROC-*.md + - Obter dept_id e codigo + +2. LER INDEX.md departamental + - Path: /media/.../Procedimentos/[Dept]/INDEX.md + +3. ADICIONAR linha na tabela: + | [PROC-Nome.md](./PROC-Nome.md) | Descrição | [DEPT]-[TEMA]-[NUM] | + - Inserir na posição correcta (ordenado por código) + +4. INCREMENTAR contador no INDEX departamental: + "X procedimentos" → "X+1 procedimentos" + +5. ACTUALIZAR data: + "Última actualização: YYYY-MM-DD" + +6. LER INDEX.md principal + - Path: /media/.../Procedimentos/INDEX.md + +7. INCREMENTAR contador na tabela do departamento: + | D7-Tecnologia | 28 → 29 | ... + +8. INCREMENTAR "Total:" no topo: + "36 procedimentos" → "37 procedimentos" + +9. ACTUALIZAR data INDEX principal + +10. CONFIRMAR ambos salvos +``` + +### Após Mover PROC + +``` +1. REMOVER linha do INDEX origem +2. DECREMENTAR contador origem +3. ADICIONAR linha ao INDEX destino +4. INCREMENTAR contador destino +5. ACTUALIZAR INDEX principal (sem alterar total) +6. ACTUALIZAR datas ambos +``` + +### Após Arquivar PROC + +``` +1. REMOVER linha do INDEX departamental +2. DECREMENTAR contador departamental +3. ACTUALIZAR INDEX principal (decrementar total) +4. ADICIONAR nota "Arquivado YYYY-MM-DD" se relevante +5. ACTUALIZAR datas +``` + +--- + +## Formato INDEX.md Departamental + +```markdown +--- +title: D[N]-[Nome] - Procedimentos +date: YYYY-MM-DD +type: index +status: active +tags: [d[N], procedimentos, [tema]] +--- + +# D[N] — [Nome] - Procedimentos + +**X procedimentos | Código: [DEPT]** + +--- + +## 📋 Lista de Procedimentos + +| Procedimento | Descrição | Código | +|--------------|-----------|--------| +| [PROC-Nome1.md](./PROC-Nome1.md) | Descrição breve | [DEPT]-[TEMA]-001 | +| [PROC-Nome2.md](./PROC-Nome2.md) | Descrição breve | [DEPT]-[TEMA]-002 | + +--- + +## 📊 Estatísticas + +| Métrica | Valor | +|---------|-------| +| Total procedimentos | X | +| Códigos únicos | [DEPT1], [DEPT2], [DEPT3] | +| Status draft | Y | +| Status active | Z | + +--- + +## 🔗 Navegação + +- [[../INDEX|← Voltar a Procedimentos INDEX]] +- [[../../../04-Stack/02.01-Departamentos/D[N]-[Nome]|Ver Departamento]] + +--- + +**D[N] — [Nome] | X Procedimentos** +**Última actualização:** YYYY-MM-DD +``` + +--- + +## Formato INDEX.md Principal + +```markdown +--- +title: Procedimentos - INDEX +date: YYYY-MM-DD +type: index +status: active +tags: [procedimentos, organizacao, hub] +--- + +# Procedimentos - INDEX Principal + +**Total:** X procedimentos | **Departamentos:** 8 + +--- + +## 📊 Distribuição por Departamento + +| Departamento | Procedimentos | Código | INDEX | +|--------------|---------------|--------|-------| +| D1-Comercial | 1 | CRM | [INDEX](./D1-Comercial/INDEX.md) | +| D2-Suporte | 0 | SUP | [INDEX](./D2-Suporte/INDEX.md) | +| D3-Contabilidade | 2 | FIN | [INDEX](./D3-Contabilidade/INDEX.md) | +| D4-RH | 0 | HR | [INDEX](./D4-RH/INDEX.md) | +| D5-Design | 0 | DES | [INDEX](./D5-Design/INDEX.md) | +| D6-Marketing | 1 | MKT | [INDEX](./D6-Marketing/INDEX.md) | +| D7-Tecnologia | 28 | DEV, WP, INF, AI, WEB | [INDEX](./D7-Tecnologia/INDEX.md) | +| Cross-Departamental | 4 | XDP | [INDEX](./Cross-Departamental/INDEX.md) | + +--- + +**Última actualização:** YYYY-MM-DD +``` + +--- + +## Validações + +Antes de salvar INDEX.md, verificar: + +``` +✅ Contadores correctos (manual count vs INDEX) +✅ Ordenação por código mantida +✅ Links relativos funcionam (./PROC-*.md) +✅ Sem linhas duplicadas +✅ Sem procedimentos órfãos (ficheiro existe mas não está no INDEX) +✅ Sem fantasmas (linha no INDEX mas ficheiro não existe) +✅ Data actualizada para hoje +✅ Formato tabela Markdown correcto +``` + +--- + +## Integração com /proc-creator + +`/proc-creator` chama `/index-update` automaticamente: + +``` +User: /proc-creator "MCP Session Recovery" +→ PROC-MCP-Session-Recovery.md criado +→ /index-update triggered automaticamente +→ D7-Tecnologia/INDEX.md actualizado (28 → 29) +→ INDEX.md principal actualizado (36 → 37) +→ Confirmação ao utilizador +``` + +--- + +## Modo Manual + +Quando usar manualmente: + +``` +User: Arquivei 3 procedimentos antigos do D7. Actualizar INDEX? +Assistant: /index-update + +1. Lendo D7-Tecnologia/INDEX.md... +2. Detectei que PROC-X, PROC-Y, PROC-Z não existem mais +3. Removendo linhas... +4. Actualizando contador: 28 → 25 +5. Actualizando INDEX principal: 36 → 33 +6. ✅ Ambos os INDEX.md actualizados +``` + +--- + +## Detecção Automática de Dessinc + +Quando `/index-update` é chamado sem contexto: + +``` +1. PARA CADA departamento: + - Ler INDEX.md + - Listar ficheiros PROC-*.md no directório + - Comparar + +2. DETECTAR problemas: + - Órfãos: ficheiro existe mas não está no INDEX + - Fantasmas: linha no INDEX mas ficheiro não existe + - Contadores errados: NUM no INDEX ≠ count real + +3. REPORTAR discrepâncias: + "D7-Tecnologia: 3 órfãos detectados" + "D3-Contabilidade: contador errado (diz 2, tem 3)" + +4. PERGUNTAR ao utilizador: + "Corrigir automaticamente? [Sim/Não]" + +5. SE Sim: + - Adicionar órfãos ao INDEX + - Remover fantasmas do INDEX + - Corrigir contadores + - Actualizar datas +``` + +--- + +## Exemplos de Uso + +### Exemplo 1: Após Criar PROC + +``` +User: /proc-creator criou PROC-WordPress-CLI.md +Assistant: (auto-triggered /index-update) + +✅ D7-Tecnologia/INDEX.md actualizado + - Adicionada linha: PROC-WordPress-CLI.md | WP-CLI-001 + - Contador: 28 → 29 + +✅ INDEX.md principal actualizado + - D7: 28 → 29 + - Total: 36 → 37 +``` + +### Exemplo 2: Correcção Manual + +``` +User: /index-update +Assistant: + +🔍 Verificando consistência... + +D7-Tecnologia: +- ⚠️ 2 órfãos detectados: + - PROC-MCP-Troubleshooting-Erro-471.md (não está no INDEX) + - PROC-MCP-Session-Recovery.md (não está no INDEX) +- ✅ Sem fantasmas + +D3-Contabilidade: +- ⚠️ Contador errado: INDEX diz 2, existem 3 ficheiros + +Corrigir automaticamente? [Sim] + +→ Adicionando órfãos... +→ Corrigindo contadores... +→ Actualizando datas... +✅ Todos os INDEX.md consistentes +``` + +### Exemplo 3: Após Arquivar + +``` +User: Arquivei PROC-Backup-Old-Method.md (obsoleto) +Assistant: /index-update D7-Tecnologia + +✅ Removido PROC-Backup-Old-Method.md do INDEX +✅ Contador: 29 → 28 +✅ INDEX principal: 37 → 36 +✅ Data actualizada +``` + +--- + +## Anti-Patterns + +**NUNCA:** +- ❌ Actualizar INDEX sem verificar ficheiro existe +- ❌ Esquecer de actualizar INDEX principal +- ❌ Deixar data desactualizada +- ❌ Quebrar ordenação por código +- ❌ Adicionar linha com link quebrado + +**SEMPRE:** +- ✅ Actualizar AMBOS os INDEX (dept + principal) +- ✅ Verificar ficheiro existe antes de adicionar +- ✅ Manter ordenação por código +- ✅ Actualizar contadores correctamente +- ✅ Actualizar data para hoje + +--- + +## Validação Pós-Actualização + +Checklist automática: + +``` +✅ Contadores matemáticos correctos +✅ Links relativos válidos +✅ Ordenação mantida +✅ Sem duplicados +✅ Sem órfãos detectados +✅ Sem fantasmas detectados +✅ Data = hoje +✅ Formato Markdown válido +``` + +--- + +## Scripts Auxiliares (Futuro) + +```bash +# Validar consistência INDEX.md +./scripts/validate-index.sh + +# Detectar órfãos e fantasmas +./scripts/detect-orphans.sh + +# Re-gerar INDEX.md do zero +./scripts/rebuild-index.sh [departamento] +``` + +--- + +*Skill v1.0.0 | 2026-02-13 | Plugin gestao | Descomplicar®* diff --git a/gestao/skills/knowledge/SKILL.md b/gestao/skills/knowledge/SKILL.md index 9456e2d..d0886d4 100644 --- a/gestao/skills/knowledge/SKILL.md +++ b/gestao/skills/knowledge/SKILL.md @@ -9,7 +9,7 @@ version: 1.1.0 user_invocable: true tags: [knowledge, kb, dify, wikijs, supabase, context7, search, documentation] desk_task: 1474 -allowed-tools: Read, Grep, mcp__dify-kb__dify_kb_retrieve_segments, mcp__wikijs__search_pages, mcp__memory-supabase__search_memories, mcp__context7__get-library-docs +allowed-tools: Read, Grep, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments, mcp__wikijs__search_pages, mcp__memory-supabase__search_memories, mcp__context7__get-library-docs category: productivity quality_score: 85 updated: "2026-02-04T18:00:00Z" @@ -235,7 +235,7 @@ async function pesquisar(query, categoria) { fonte.folders.map(folder => Grep({ pattern: extrairKeywords(query).join('|'), - path: `/media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/${folder}`, + path: `/media/ealmeida/Dados/Hub/${folder}`, output_mode: 'content' }) ) @@ -328,7 +328,10 @@ if (resultado.lacuna || resultado.score < 50) { ## MCPs Disponíveis -### Dify KB +### Knowledge Sources + +**Primario:** NotebookLM +**Fallback:** Dify KB ``` mcp__dify-kb__dify_kb_list_datasets # Listar datasets mcp__dify-kb__dify_kb_retrieve_segments # Pesquisar (dataset_id, query) @@ -359,7 +362,7 @@ mcp__context7__get-library-docs # Obter docs ### Filesystem (Docs Locais) ``` Grep/Glob em: -- /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/ (Obsidian vault) +- /media/ealmeida/Dados/Hub/ (Obsidian vault) - /media/ealmeida/Dados/GDrive/Projectos/ ``` @@ -538,6 +541,13 @@ Esta skill já faz routing automático para datasets Dify, mas em caso de dúvid ### Como Consultar ```javascript +# PRIMARIO: NotebookLM (Gemini 2.5 RAG) +# mcp__notebooklm__notebook_query({notebook_id: "0c9c079c-a426-486c-99eb-1564d42d37ad", query: ""}) // Gestao de Projectos e Agile +# mcp__notebooklm__notebook_query({notebook_id: "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", query: ""}) // Gestao de Operacoes +# mcp__notebooklm__notebook_query({notebook_id: "79d43410-0e29-4be1-881d-84db6bdc239a", query: ""}) // Estrategia e Empreendedorismo +# mcp__notebooklm__notebook_query({notebook_id: "ebee9fe1-78fd-4f85-8938-f19f3ea32131", query: ""}) // Obsidian + Claude +# FALLBACK: Dify KB (se NotebookLM insuficiente) + // Pesquisar no Data Lake geral mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "b4e233d6-0d78-42f6-aef4-a56280600fe8", diff --git a/gestao/skills/knowledge/config/sources.json b/gestao/skills/knowledge/config/sources.json index a1f5eb0..a1e7708 100644 --- a/gestao/skills/knowledge/config/sources.json +++ b/gestao/skills/knowledge/config/sources.json @@ -412,7 +412,7 @@ { "type": "filesystem", "paths": [ - "/media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/" + "/media/ealmeida/Dados/Hub/" ] }, { @@ -449,7 +449,7 @@ { "type": "filesystem", "paths": [ - "/media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/03-Recursos/" + "/media/ealmeida/Dados/Hub/03-Recursos/" ] } ] @@ -1712,7 +1712,7 @@ "qualidade": "09-operacoes-qualidade/qualidade-procedimentos" }, "local_paths": { - "planeamento": "/media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/", + "planeamento": "/media/ealmeida/Dados/Hub/", "projectos": "/media/ealmeida/Dados/GDrive/Projectos/", "dev": "/media/ealmeida/Dados/Dev/" }, diff --git a/gestao/skills/knowledge/docs/workflow.md b/gestao/skills/knowledge/docs/workflow.md index 5ac6a98..ad4bd84 100644 --- a/gestao/skills/knowledge/docs/workflow.md +++ b/gestao/skills/knowledge/docs/workflow.md @@ -136,7 +136,7 @@ Params: ### Filesystem ``` Grep em paths do routing: - - /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/ (Obsidian vault) + - /media/ealmeida/Dados/Hub/ (Obsidian vault) - /media/ealmeida/Dados/GDrive/Projectos/ ``` diff --git a/gestao/skills/mindmap/SKILL.md b/gestao/skills/mindmap/SKILL.md new file mode 100644 index 0000000..0ac4871 --- /dev/null +++ b/gestao/skills/mindmap/SKILL.md @@ -0,0 +1,164 @@ +--- +name: mindmap +title: Mindmap Generator (DesktopNaotu) +description: Gera ficheiros .km (mindmap) compativeis com DesktopNaotu/Kityminder. Cria mindmaps a partir de topicos, planos, brainstorms ou qualquer estrutura hierarquica. +author: Descomplicar +version: 1.0.0 +tags: [mindmap, naotu, kityminder, brainstorm, planeamento, organizacao] +user_invocable: true +trigger_patterns: + - "mindmap" + - "mapa mental" + - "mind map" + - "naotu" + - "criar mindmap" + - "gerar mindmap" + - "brainstorm visual" +--- + +# Mindmap Generator - DesktopNaotu + +Gera ficheiros `.km` compativeis com DesktopNaotu (Kityminder) para visualizacao de mindmaps. + +## Formato .km + +Ficheiro JSON com a seguinte estrutura: + +```json +{ + "root": { + "data": { + "id": "", + "created": , + "text": "Topico Central" + }, + "children": [ + { + "data": { + "id": "", + "created": , + "text": "Sub-topico" + }, + "children": [] + } + ] + }, + "template": "default", + "theme": "fresh-blue", + "version": "1.4.43" +} +``` + +## Templates Disponiveis + +| Template | Descricao | +|----------|-----------| +| `default` | Layout classico radial (centro para fora) | +| `right` | Todos os ramos para a direita | +| `structure` | Organograma (cima para baixo) | +| `filetree` | Arvore de ficheiros (esquerda para direita) | +| `filetree-up` | Arvore ascendente | +| `filetree-down` | Arvore descendente | +| `fish-bone` | Diagrama espinha de peixe (Ishikawa) | +| `tianpan` | Layout circular (tianpan) | + +## Themes Disponiveis + +| Theme | Cor | +|-------|-----| +| `fresh-blue` | Azul (default) | +| `fresh-green` | Verde | +| `fresh-pink` | Rosa | +| `fresh-purple` | Roxo | +| `fresh-red` | Vermelho | +| `fresh-soil` | Terra/Castanho | +| `classic-compact` | Classico compacto | +| `snow-compact` | Branco/neve compacto | +| `tianpan-compact` | Tianpan compacto | + +## Instrucoes de Geracao + +Quando o utilizador pedir um mindmap: + +1. **Identificar o topico central** e sub-topicos a partir do pedido +2. **Escolher template** adequado ao tipo de conteudo: + - Brainstorm geral -> `default` + - Plano/processo linear -> `right` + - Organograma/hierarquia -> `structure` + - Analise causa-efeito -> `fish-bone` + - Listagem/arvore -> `filetree` +3. **Escolher theme** (default: `fresh-blue`, ou perguntar preferencia) +4. **Gerar o JSON** com IDs unicos (usar formato `km`) +5. **Guardar** em `/home/ealmeida/.config/desktopnaotu/backup/.km` para acesso facil pela app +6. **Informar** o utilizador do path e como abrir + +### Regras de geracao de IDs + +Cada node precisa de um `id` unico. Usar o formato: `km` + base36 do timestamp + sequencia aleatoria. + +Gerar com Python: +```python +import time, random, string, json + +def gen_id(): + ts = int(time.time() * 1000) + rand = ''.join(random.choices(string.ascii_lowercase + string.digits, k=4)) + return f"km{ts}{rand}" + +def node(text, children=None): + return { + "data": { + "id": gen_id(), + "created": int(time.time() * 1000), + "text": text + }, + "children": children or [] + } +``` + +### Exemplo de geracao + +```python +mindmap = { + "root": node("Projecto X", [ + node("Fase 1 - Discovery", [ + node("Pesquisa mercado"), + node("Entrevistas"), + node("Analise competitiva") + ]), + node("Fase 2 - Design", [ + node("Wireframes"), + node("Prototipo"), + node("Testes UX") + ]), + node("Fase 3 - Desenvolvimento", [ + node("Frontend"), + node("Backend"), + node("Integracao") + ]) + ]), + "template": "right", + "theme": "fresh-blue", + "version": "1.4.43" +} + +with open("/home/ealmeida/.config/desktopnaotu/backup/projecto-x.km", "w") as f: + json.dump(mindmap, f, ensure_ascii=False) +``` + +### Abrir o ficheiro + +Depois de gerar, o utilizador pode abrir directamente: +```bash +/home/ealmeida/Programas/DesktopNaotu/DesktopNaotu "/home/ealmeida/.config/desktopnaotu/backup/.km" +``` + +Ou abrir a app e usar File > Open para navegar ate ao ficheiro. + +## Boas Praticas + +- **Profundidade maxima:** 4-5 niveis (mais que isso fica ilegivel) +- **Nos por nivel:** Maximo 7-8 (regra de Miller) +- **Texto curto:** 2-5 palavras por node (mindmap, nao documento) +- **Template adequado:** Fish-bone para causa/efeito, structure para hierarquias, right para processos +- **Nome descritivo:** Usar nome do topico no ficheiro (nao "mindmap1.km") diff --git a/gestao/skills/notebooklm/SKILL.md b/gestao/skills/notebooklm/SKILL.md new file mode 100644 index 0000000..9a4c7ef --- /dev/null +++ b/gestao/skills/notebooklm/SKILL.md @@ -0,0 +1,406 @@ +--- +name: notebooklm +description: > + Gestão programática completa do NotebookLM via MCP. Use when managing notebooks, adding sources, + generating artifacts (audio, video, mindmap, report, flashcards, quiz, infographic, presentation, table), + querying notebooks with RAG, running autonomous research, or when user mentions "notebooklm", + "notebook", "audio overview", "podcast", "mapa mental", "questionário", "resumo", "investigação profunda", + "adicionar fonte", "gerar artefacto". +author: Descomplicar® Crescimento Digital +version: 1.1.0 +user_invocable: true +tags: [notebooklm, rag, audio, studio, research, gemini, knowledge, artifacts] +allowed-tools: mcp__notebooklm__notebook_list, mcp__notebooklm__notebook_get, mcp__notebooklm__notebook_create, mcp__notebooklm__notebook_describe, mcp__notebooklm__notebook_rename, mcp__notebooklm__notebook_delete, mcp__notebooklm__source_add, mcp__notebooklm__source_delete, mcp__notebooklm__source_describe, mcp__notebooklm__source_get_content, mcp__notebooklm__source_sync_drive, mcp__notebooklm__source_list_drive, mcp__notebooklm__notebook_query, mcp__notebooklm__chat_configure, mcp__notebooklm__studio_create, mcp__notebooklm__studio_status, mcp__notebooklm__studio_delete, mcp__notebooklm__download_artifact, mcp__notebooklm__export_artifact, mcp__notebooklm__research_start, mcp__notebooklm__research_status, mcp__notebooklm__research_import, mcp__notebooklm__notebook_share_public, mcp__notebooklm__notebook_share_invite, mcp__notebooklm__notebook_share_status, mcp__notebooklm__refresh_auth, mcp__notebooklm__server_info +category: knowledge +quality_score: 90 +updated: "2026-02-24T20:00:00Z" +--- + +# /notebooklm - Gestão Programática NotebookLM + +Motor RAG Gemini com geração de artefactos multimédia. 29 ferramentas MCP disponíveis. + +--- + +## Notebooks Descomplicar (58 total) + +> Registry actualizado via `notebook_list`. Para IDs actualizados: `mcp__notebooklm__notebook_list`. + +### Tecnologia / Dev (21) + +| Nome | ID | Fontes | +|------|----|--------| +| **KiviCare EHR WP** | `78621405-a5bc-433f-856f-296260a80bd9` | 166 | +| **CWP** | `0ded7bd6-69b3-4c76-b327-452396bf7ea7` | 214 | +| **WordPress Config CLI** | `fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d` | 268 | +| **WordPress e Elementor** | `5be0d1a6-00f2-4cd9-b835-978cb7721601` | 88 | +| **Cibersegurança WordPress** | `5f60adfd-2435-4725-8c12-9c11c5f51d75` | 95 | +| **Proxmox** | `276ccdde-6b95-42a3-ad96-4e64d64c8d52` | 120 | +| **Cloud e Infraestrutura TI** | `f9a79b5a-649f-4443-afaf-7ff562b6c2e7` | 146 | +| **Claude Code** | `2876d1fe-5cea-4d98-8140-b0e1a81c6bc4` | 132 | +| **Obsidian + Claude** | `ebee9fe1-78fd-4f85-8938-f19f3ea32131` | 117 | +| **Perfex CRM** | `df4688bb-c2c0-4aba-98c1-38c3b50a353c` | 141 | +| **Dev PerfexCRM** | `80606de8-2783-4d36-b08d-5825e6f9a8da` | 44 | +| **Reonic** | `b7e61158-0717-4582-8ef2-0301be3c73ae` | 131 | +| **Remotion** | `f2b75baa-1ab1-48d3-8f7c-a6a9e516934c` | 59 | +| **n8n** | `f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1` | 66 | +| **Desenvolvimento de MCPs** | `73102308-70ef-403e-9be9-eae0cfc62d55` | 22 | +| **Programação** | `24947ffa-0019-448a-a340-2f4a275d2eb1` | 53 | +| **Open Source Top Picks** | `cabf9821-c1ff-44cb-9bfd-59bda3599792` | 163 | +| **GitHub Trends** | `922b7532-ddf3-4dba-9d3c-6d5f83b89378` | 61 | +| **Zaia** | `087d76f1-e929-49da-9e3c-4edc22b42b3f` | 28 | +| **Open WebUI** | `be6f72ac-f8ba-4337-912d-abd5dd448519` | 15 | +| **AI Code Editors** | `57d9c6c9-48ba-4d83-8f71-cc890f348a53` | 20 | + +### Gestão / Negócio (13) + +| Nome | ID | Fontes | +|------|----|--------| +| **Estrategia e Empreendedorismo** | `79d43410-0e29-4be1-881d-84db6bdc239a` | 107 | +| **Gestão de Operações** | `f9dc59c2-718b-4b12-bd06-095d4bfa3e34` | 41 | +| **Gestão de Projectos e Agile** | `0c9c079c-a426-486c-99eb-1564d42d37ad` | 44 | +| **Transformacao Digital e IA** | `ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8` | 73 | +| **E-commerce Pratico** | `226e384e-d4bc-48f4-bb82-7927360436cc` | 63 | +| **Descomplicar** | `f29c8457-f16d-4fb3-979d-6e5901de1b20` | 23 | +| **AI Automation and Orchestration** | `929ef67b-c131-4f01-abd0-8b078491a6b7` | 5 | +| **AI Agents Intensive Course** | `f4be0e3f-4d9e-4c5c-a743-9f14427f2e43` | 5 | +| **European E-Commerce** | `8a430cf2-ed99-413d-b4bf-a1400deaf49e` | 24 | +| **Documentação WooCommerce** | `bd06acff-4b9d-44aa-b3f7-60434bbd6b49` | 3 | +| **Produtos e Serviços BD** | `c451d7b4-79fd-4a67-9149-1da38d28345e` | 3 | +| **Erxes XOS** | `10ea7de8-5777-4f18-bd2c-f58952b6047c` | 10 | +| **Zender 3** | `7095e5fa-1465-4496-b1a3-48f2e6e07f79` | 3 | + +### Marketing / Media (7) + +| Nome | ID | Fontes | +|------|----|--------| +| **Marketing Digital PT** | `4c595973-ba10-420a-a3bf-e4389e424ad3` | 189 | +| **Marketing Digital Avancado** | `76647e0f-3ae2-4c00-a0a8-f457aebf5655` | 78 | +| **Social Media e Branding** | `9053d0e8-dd39-460b-b5ea-e67af3e9a675` | 51 | +| **Copywriting e Persuasao** | `7b8fec17-d34f-4e3f-a8c6-8231e51f6323` | 50 | +| **Produção de Video e Youtube** | `058a896e-6c9a-4e51-ae7d-9adb2738bc5f` | 49 | +| **YouTube Monetização e Compliance** | `60a209a7-e205-4d57-a6f3-fef3de61e87a` | 30 | +| **Podcast Descomplicar** | `a5bef96b-a1af-4293-9979-5da46f8d2301` | 33 | + +### Design (3) + +| Nome | ID | Fontes | +|------|----|--------| +| **Design Profissional AItomatizado** | `b568b13b-0eed-48c9-b513-5c5b7ec0b102` | 244 | +| **UI/UX Design** | `081ca512-8279-4850-b2b9-dff090267482` | 28 | +| **Tipografia e Cor para Web** | `f97a0d2b-a5b3-4640-b941-3cbb184b1b81` | 41 | + +### Pessoal / Filosofia (11) + +| Nome | ID | Fontes | +|------|----|--------| +| **Emanuel Almeida** | `8c6c8257-bda2-433c-bf55-f40d98bfde8f` | 36 | +| **Jung** | `d5c67d7f-7fe8-4542-9e5c-22403f3193ee` | 41 | +| **Taoism** | `aea85baf-9ddf-4d79-bf07-81391a275b09` | 28 | +| **ADHD** | `a4ff3fd7-fb7c-49a1-94ff-0433193e2338` | 17 | +| **Autismo** | `66eff78e-318f-4a8b-a3c7-039a4124b1ad` | 14 | +| **Psicologia Somática** | `3410893b-16a3-4178-9091-42650a41086f` | 10 | +| **Essência de Herói** | `6dcd08e8-79d9-4ae0-b6bf-b2ee96717bf2` | 13 | +| **Auto Kintsugi** | `82a95c2f-be56-4c4a-a96f-96f6677a6991` | 10 | +| **Marcus Aurelius** | `4b986ad4-49da-4604-a423-4fcdf20dd9da` | 3 | +| **Building Viral AI Philosophy** | `7bb570b3-9dc4-4e6f-817c-aca68df59e6d` | 13 | + +### Clientes / Projectos (3) + +| Nome | ID | Fontes | +|------|----|--------| +| **CarStuff** | `90f0bc77-b5e4-4ddd-a07c-013a1a30b247` | 25 | +| **Solar FV Engenharia** | `03d54e00-aefa-45dc-ba01-f3864a7c3112` | 5 | +| **OpenSolar Platform** | `0082bcaf-1e17-4b84-87cc-2256b1719b55` | 4 | + +--- + +## Comandos + +| Comando | Uso | +|---------|-----| +| `/notebooklm list` | Listar todos os notebooks | +| `/notebooklm query ` | Consulta RAG num notebook | +| `/notebooklm add ` | Adicionar fonte (url/file/text/drive) | +| `/notebooklm studio ` | Gerar artefacto | +| `/notebooklm research ` | Investigação autónoma web | +| `/notebooklm create ` | Criar novo notebook | + +--- + +## Studio — Artefactos + +| Tipo (`artifact_type`) | Parâmetros Chave | Output | Tempo | +|------------------------|-----------------|--------|-------| +| `audio` | `format`: deep_dive, brief, critique, debate | MP3 | 3-7 min | +| `video` | `format`: explainer, brief | MP4 | 5-12 min | +| `mind_map` | — | Markdown/JSON | <1 min | +| `report` | `report_format`: Briefing Doc, Study Guide, Blog Post | Markdown/Docs | 1-2 min | +| `flashcards` | `difficulty`: hard, easy | JSON/HTML | <1 min | +| `quiz` | `question_count`: Integer | JSON/HTML | <1 min | +| `infographic` | `orientation`: 1=Landscape, 2=Portrait | PNG/SVG | 2-4 min | +| `slide_deck` | `orientation`, `visual_style` (1-10), `language`, `length` | PDF | 2-5 min | +| `data_table` | — | CSV/JSON/Sheets | 1-2 min | + +### Workflow Geração de Artefacto + +``` +1. studio_create(notebook_id, artifact_type, ..., confirm=True) + → devolve artifact_id + +2. POLLING: studio_status(artifact_id) + → repetir cada 20s até status="complete" + +3a. download_artifact(artifact_id) → ficheiro local (MP3/MP4/JSON/MD) +3b. export_artifact(artifact_id) → Google Docs/Sheets +``` + +--- + +## Gestão de Fontes + +### Adicionar fonte + +```python +# URL +source_add(notebook_id, source_type="url", url="https://...", wait=True) + +# Ficheiro local (PDF, MD, TXT) +source_add(notebook_id, source_type="file", file_path="/caminho/absoluto", wait=True) + +# Texto directo +source_add(notebook_id, source_type="text", text="...", title="Título", wait=True) + +# Google Drive +source_add(notebook_id, source_type="drive", document_id="gdrive-id", wait=True) +``` + +**Regra crítica:** Usar sempre `wait=True`. Sem isso o NotebookLM reporta sucesso mas o conteúdo não está indexado. + +### Actualizar fontes Drive + +```python +source_sync_drive(notebook_id, confirm=True) +``` + +Para PDFs/URLs não Drive: `source_delete` + `source_add` da versão nova. + +--- + +## Consulta RAG (notebook_query) + +### Padrão Drill-Down para documentos extensos + +``` +Passo 1 — Topologia: + "Mapeia a estrutura deste documento, identifica os capítulos sobre [tema]." + +Passo 2 — Cirúrgico: + "Centra a análise em [secção específica]. Detalha [aspecto concreto]." + +Passo 3 — Síntese externa: + Claude agrega as respostas parciais no seu próprio contexto. +``` + +### Multi-notebook (sem suporte nativo) + +O NotebookLM não faz queries cross-notebook. Workflow: +``` +1. notebook_query(notebook_A, pergunta) +2. notebook_query(notebook_B, pergunta) +3. Claude sintetiza os dois resultados localmente +``` + +### Rate limiting + +~50 queries/dia em contas gratuitas. Contas Workspace: sem limite documentado. + +--- + +## Investigação Autónoma + +```python +# 1. Iniciar pesquisa +research_start( + notebook_id="uuid", + query="tendências telemedicina Portugal 2026", + mode="deep", # fast (~30s, 10 fontes) | deep (~5min, 40+ fontes) + source_type="web" # web | drive +) +# → devolve task_id + +# 2. Polling +research_status(task_id) # repetir até status="complete" + +# 3. Importar resultados +research_import(notebook_id, task_id) +``` + +**Atenção:** Iniciar nova pesquisa cancela qualquer pesquisa em curso no mesmo notebook. + +--- + +## Casos de Uso Descomplicar + +### Investigação técnica de plugin/tecnologia + +``` +1. Scraper → MDs em Hub/Manuais/ +2. source_add(files) → notebook_create ou existente +3. notebook_query drill-down → extracção de padrões +4. studio_create(mind_map) → exportar para Obsidian +5. studio_create(audio, deep_dive) → consumo em mobilidade +``` + +### Onboarding novo projecto + +``` +1. notebook_create("Cliente - NomeProjecto") +2. source_add(contratos PDF + requisitos WikiJS) +3. notebook_share_invite(emails equipa + cliente) +4. studio_create(report, "Briefing Doc") → resumo executivo +``` + +### Proposta comercial + +``` +1. notebook_query → extrair capacidades relevantes +2. studio_create(data_table) → export_artifact → Google Sheets comparativo +3. studio_create(slide_deck, orientation=1, visual_style=1, language="pt") → esqueleto apresentação +``` + +### Rotina /today + +``` +notebook_query(Gestão de Operações, "3 métricas críticas com desvios hoje") +→ studio_create(audio, brief) → MP3 para consumo rápido +``` + +### Questionários de validação + +``` +studio_create(quiz, question_count=15) → JSON +→ n8n lê JSON → cria tasks Desk CRM para engenheiros +``` + +--- + +## Gestão de Notebooks + +```python +# Listar +notebook_list() + +# Metadados + fontes +notebook_get(notebook_id) + +# Resumo IA com keywords +notebook_describe(notebook_id) + +# Criar +notebook_create(name="Nome do Notebook") + +# Partilha pública +notebook_share_public(notebook_id) + +# Partilha por convite +notebook_share_invite(notebook_id, email="user@domain.com") + +# Eliminar (irreversível) +notebook_delete(notebook_id, confirm=True) +``` + +--- + +## Integração n8n + +O NotebookLM não tem API REST pública. Comunicar via JSON-RPC para o servidor MCP local: + +``` +NOTEBOOKLM_MCP_TRANSPORT=http +NOTEBOOKLM_MCP_HOST=0.0.0.0 +NOTEBOOKLM_MCP_PORT=8000 +``` + +### Flows úteis + +**WikiJS → NotebookLM (ingestão dinâmica):** +``` +Webhook (publicação WikiJS) +→ HTTP Request: source_add(source_type="text", wait=True) +→ Notificação Slack: "Nova doc indexada no RAG" +``` + +**Relatório semanal de projecto:** +``` +Schedule (sexta 17h) +→ Desk CRM: extrair tasks semana +→ source_add(text) → studio_create(report, "Briefing Doc") +→ Polling studio_status +→ export_artifact → Google Docs +→ Link enviado para Slack do cliente +``` + +**Audio após actualização de manual:** +``` +Drive webhook +→ source_sync_drive +→ studio_create(audio, deep_dive) +→ Polling + download_artifact +→ Email com MP3 anexo +``` + +--- + +## Limitações + +| Limitação | Workaround | +|-----------|-----------| +| ~50 queries/dia (conta gratuita) | Usar conta Workspace; fallback Dify KB | +| Sem API REST oficial | JSON-RPC via servidor MCP local | +| Sem queries cross-notebook | Claude agrega respostas de múltiplos notebooks | +| Cookies expiram (2-4 semanas) | `refresh_auth()` automático; alertar se HTTP 401/499 | +| Slides com marca de água | Pós-processamento `clean-watermark.js` via n8n | +| Ficheiros estáticos imutáveis | `source_delete` + `source_add` para actualizar | +| `research_start` exclusivo | Só uma pesquisa activa por notebook de cada vez | +| Dados de treino Gemini | Workspace Enterprise: dados isentos de treino | + +--- + +## Autenticação + +```bash +# Verificar estado +nlm login status + +# Renovar tokens +mcp__notebooklm__refresh_auth() + +# Versão do servidor +mcp__notebooklm__server_info() +``` + +Auth guardada em: `~/.notebooklm-mcp-cli/profiles//auth.json` + +--- + +## Roadmap de Adopção + +**Fase 1 — Quick wins (<1 semana)** +- [ ] Conta Google Workspace dedicada a automações +- [ ] Servidor MCP em EasyPanel (projecto: descomplicar) +- [ ] Primeiro audio overview de manual técnico + +**Fase 2 — Integrações (1-4 semanas)** +- [ ] n8n: ingestão dinâmica WikiJS → NotebookLM +- [ ] n8n: relatório semanal /today automático +- [ ] Claude Code: queries drill-down nos notebooks existentes + +**Fase 3 — Escala (1-3 meses)** +- [ ] Notebook por cliente (criado automaticamente no Desk CRM) +- [ ] Quizzes de onboarding injectados em tarefas Desk CRM +- [ ] Research autónomo semanal: panorama competitivo por área + +--- + +**Versão**: 1.0.0 | **Data**: 24-02-2026 | **Autor**: Descomplicar® diff --git a/gestao/skills/proc-creator/SKILL.md b/gestao/skills/proc-creator/SKILL.md new file mode 100644 index 0000000..8d782a6 --- /dev/null +++ b/gestao/skills/proc-creator/SKILL.md @@ -0,0 +1,365 @@ +--- +name: proc-creator +description: Cria procedimentos seguindo formato Hub Descomplicar. Use quando "criar procedimento", "novo PROC", "documentar processo", "PROC-*". Gera código automático [DEPT]-[TEMA]-[NUM], cria ficheiro na pasta departamental correcta, actualiza INDEX.md. +--- + +# /proc-creator - Criador de Procedimentos Hub + +Cria procedimentos estruturados seguindo formato e organização Hub Descomplicar. + +--- + +## Referências e Documentação + +**SEMPRE consultar:** +- **[06-Operacoes/Procedimentos/INDEX.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/INDEX.md)** - Estrutura completa (36 procedimentos, 8 departamentos) +- **[Hub CLAUDE.md](file:///media/ealmeida/Dados/Hub/CLAUDE.md)** - Secção "Organização de Procedimentos" (convenções, padrão referenciação) + +--- + +## Estrutura de Procedimentos + +### 8 Departamentos + +| Departamento | Pasta | Código | Procedimentos Actuais | +|--------------|-------|--------|----------------------| +| D1-Comercial | `D1-Comercial/` | CRM | 1 | +| D2-Suporte | `D2-Suporte/` | SUP | 0 (gap) | +| D3-Contabilidade | `D3-Contabilidade/` | FIN | 2 | +| D4-RH | `D4-RH/` | HR | 0 (novo) | +| D5-Design | `D5-Design/` | DES | 0 (gap) | +| D6-Marketing | `D6-Marketing/` | MKT | 1 | +| D7-Tecnologia | `D7-Tecnologia/` | DEV, WP, INF, AI, WEB | 28 | +| Cross-Departamental | `Cross-Departamental/` | XDP | 4 | + +**Base path:** `/media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/` + +--- + +## Convenção de Código + +Formato: `[DEPT]-[TEMA]-[NUM]` + +**Exemplos:** +- D7: `DEV-MCP-001`, `WP-SEC-001`, `INF-SSL-001`, `AI-PLG-001`, `WEB-SEO-001` +- D1: `CRM-OPS-001` +- D3: `FIN-MOL-001`, `FIN-DSP-001` +- D6: `MKT-CNT-001` +- Cross: `XDP-GPR-001`, `XDP-OBS-001` + +**Números:** Sequencial por tema (001, 002, 003...) + +--- + +## Protocolo de Criação + +``` +1. PERGUNTAR ao utilizador: + - Título do procedimento + - Departamento (D1-D7 ou Cross) + - Tema/categoria + - Descrição breve + +2. DETERMINAR código: + - Ler INDEX.md do departamento + - Identificar próximo NUM disponível para o tema + - Gerar código [DEPT]-[TEMA]-[NUM] + +3. CRIAR ficheiro PROC-*.md: + - Nome: PROC-[Titulo].md + - Localização: /media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/[Departamento]/ + - Usar template abaixo + +4. ACTUALIZAR INDEX.md: + - Adicionar linha na tabela do departamento + - Incrementar contador total + - Actualizar data + +5. CONFIRMAR: + - Mostrar path completo do ficheiro criado + - Mostrar código atribuído + - Listar próximos passos (preencher conteúdo) +``` + +--- + +## Template PROC-*.md + +```markdown +--- +title: [Título do Procedimento] +date: YYYY-MM-DD +type: procedimento +status: draft +dept_id: [N] +desk_dept_id: [N] +desk_dept_name: [Nome Departamento] +codigo: [DEPT]-[TEMA]-[NUM] +tags: [tag1, tag2, tag3] +--- + +# [Título do Procedimento] + +**Código:** [DEPT]-[TEMA]-[NUM] | **Departamento:** [Nome] | **Status:** Draft + +--- + +## 📋 Contexto + +Descrição clara do propósito e âmbito deste procedimento. + +--- + +## 🎯 Objectivo + +O que este procedimento pretende alcançar. + +--- + +## 📍 Âmbito + +### Aplica-se a: +- [ ] Item 1 +- [ ] Item 2 + +### Não se aplica a: +- [ ] Item 1 +- [ ] Item 2 + +--- + +## 🔧 Pré-requisitos + +| Requisito | Descrição | +|-----------|-----------| +| [Nome] | [Detalhe] | + +--- + +## 📝 Procedimento + +### Passo 1: [Nome do Passo] + +**Objectivo:** [O quê] +**Como:** +1. Acção 1 +2. Acção 2 + +**Validação:** Como confirmar sucesso + +### Passo 2: [Nome do Passo] + +[...] + +--- + +## ✅ Checklist de Execução + +- [ ] Pré-requisito A verificado +- [ ] Passo 1 concluído +- [ ] Passo 2 concluído +- [ ] Validação final OK + +--- + +## ⚠️ Troubleshooting + +| Problema | Causa Provável | Solução | +|----------|----------------|---------| +| [Erro X] | [Causa] | [Como resolver] | + +--- + +## 📊 Métricas e KPIs + +| Métrica | Target | Como Medir | +|---------|--------|------------| +| [Nome] | [Valor] | [Método] | + +--- + +## 🔗 Referências + +**Procedimentos relacionados:** +- [PROC-Outro.md](../PROC-Outro.md) + +**Skills relacionadas:** +- `/skill-name` - Descrição + +**Documentação externa:** +- [Nome](URL) + +--- + +## 📅 Histórico de Revisões + +| Data | Versão | Autor | Alterações | +|------|--------|-------|------------| +| YYYY-MM-DD | 1.0 | [Nome] | Criação inicial | + +--- + +**[Título] | Código: [DEPT]-[TEMA]-[NUM] | Departamento: [Nome]** +**Última actualização:** YYYY-MM-DD +``` + +--- + +## Frontmatter Obrigatório + +```yaml +--- +title: [Título Procedimento] +date: YYYY-MM-DD +type: procedimento +status: draft | active | archived +dept_id: [1-7] +desk_dept_id: [1-7] +desk_dept_name: [D1-Comercial | D2-Suporte | ...] +codigo: [DEPT]-[TEMA]-[NUM] +tags: [categoria, tema, tecnologia] +--- +``` + +**Mapeamento dept_id:** +- 1 = D1-Comercial (info@descomplicar.pt) +- 2 = D2-Suporte (suporte@descomplicar.pt) +- 3 = D3-Contabilidade (contabilidade@descomplicar.pt) +- 4 = D4-RH (rh@descomplicar.pt) +- 5 = D5-Design (design@descomplicar.pt) +- 6 = D6-Marketing (marketing@descomplicar.pt) +- 7 = D7-Tecnologia (dev@descomplicar.pt) + +--- + +## Actualização INDEX.md + +Adicionar linha na tabela do departamento: + +```markdown +| [PROC-Titulo.md](./PROC-Titulo.md) | [Descrição breve] | [DEPT]-[TEMA]-[NUM] | +``` + +Actualizar estatísticas: +- Incrementar contador "X procedimentos" +- Actualizar data "Última actualização: YYYY-MM-DD" + +--- + +## Integração com Skills/Agents + +Após criar procedimento, informar utilizador: + +```markdown +**Próximos passos:** + +1. Preencher conteúdo do procedimento +2. Testar procedimento em cenário real +3. Actualizar status: draft → active +4. Adicionar referências em skills/agents relevantes: + +\`\`\`markdown +## Referências e Documentação + +**SEMPRE consultar:** +- [PROC-Titulo.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/[Dept]/PROC-Titulo.md) +\`\`\` +``` + +--- + +## Exemplos de Uso + +### Exemplo 1: Procedimento Técnico D7 + +``` +User: Criar procedimento para deployment EasyPanel +Assistant: /proc-creator + +Título: Deployment EasyPanel via API +Departamento: D7-Tecnologia +Tema: Infraestrutura (INF) +Descrição: Deploy automatizado de serviços no EasyPanel usando API oficial + +→ Código gerado: INF-EPL-001 +→ Ficheiro: PROC-Deployment-EasyPanel.md +→ Localização: D7-Tecnologia/ +→ INDEX.md actualizado +``` + +### Exemplo 2: Procedimento Cross-Departamental + +``` +User: Documentar processo de gestão de projectos +Assistant: /proc-creator + +Título: Sistema Gestão Projectos +Departamento: Cross-Departamental +Tema: Gestão Projectos (GPR) +Descrição: Metodologia híbrida Ágil/Waterfall + +→ Código gerado: XDP-GPR-002 (já existe 001) +→ Ficheiro: Sistema-Gestao-Projectos-v2.md +→ Localização: Cross-Departamental/ +→ INDEX.md actualizado +``` + +### Exemplo 3: Procedimento D2-Suporte (Gap) + +``` +User: Criar procedimento atendimento cliente +Assistant: /proc-creator + +Título: Atendimento Cliente +Departamento: D2-Suporte +Tema: Suporte (SUP) +Descrição: Workflow primeiro contacto, templates resposta, escalação + +→ Código gerado: SUP-ATC-001 (primeiro do D2!) +→ Ficheiro: PROC-Atendimento-Cliente.md +→ Localização: D2-Suporte/ +→ INDEX.md actualizado +→ NOTA: D2 tinha 0 procedimentos, agora tem 1 +``` + +--- + +## Anti-Patterns + +**NUNCA:** +- ❌ Criar procedimento sem perguntar departamento +- ❌ Inventar código sem verificar INDEX.md +- ❌ Esquecer de actualizar INDEX.md +- ❌ Usar status "active" para draft inicial +- ❌ Omitir frontmatter obrigatório +- ❌ Criar em localização errada +- ❌ Duplicar NUM existente no mesmo tema + +**SEMPRE:** +- ✅ Confirmar departamento com utilizador +- ✅ Ler INDEX.md para próximo NUM +- ✅ Actualizar INDEX.md após criação +- ✅ Usar status "draft" inicialmente +- ✅ Incluir todo frontmatter obrigatório +- ✅ Criar em pasta departamental correcta +- ✅ Verificar tema antes de atribuir NUM + +--- + +## Validação Pós-Criação + +Checklist automática: + +``` +✅ Ficheiro criado em pasta correcta +✅ Frontmatter completo e válido +✅ Código único e sequencial +✅ INDEX.md actualizado +✅ Template aplicado +✅ Path absoluto correcto +✅ Data actual em YYYY-MM-DD +``` + +--- + +*Skill v1.0.0 | 2026-02-13 | Plugin gestao | Descomplicar®* diff --git a/gestao/skills/tasks-overview/SKILL.md b/gestao/skills/tasks-overview/SKILL.md new file mode 100644 index 0000000..1a8d648 --- /dev/null +++ b/gestao/skills/tasks-overview/SKILL.md @@ -0,0 +1,128 @@ +--- +name: tasks-overview +description: > + Visao geral de tarefas pendentes, atrasadas e em curso do Desk CRM. Organiza por prioridade e projecto, sugere workflows relevantes. Use when "tarefas", "tasks", "pendentes", "overdue", "atrasadas", "o que temos para fazer", "tasks overview". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: management +tags: [tasks, overview, priorities, workflows, desk-crm] +desk_task: 1710 +desk_project: 65 +allowed-tools: Read, Write, mcp__desk-crm-v3 +mcps: desk-crm-v3 +dependencies: + mcps: [desk-crm-v3] +triggers: + - "User asks about pending tasks" + - "User mentions 'tarefas', 'tasks', 'pendentes', 'overdue'" + - "User wants task overview or priorities" + - "Invoked by /today orchestrator" +--- + +# /tasks-overview v1.0 + +Consulta e organiza tarefas do Desk CRM por prioridade, deadline e projecto. + +--- + +## Protocolo + +### Passo 1: Recolher Tarefas (paralelo) + +``` +Em paralelo, executar: +1. mcp__desk-crm-v3__get_tasks({ overdue_only: true, limit: 50 }) +2. mcp__desk-crm-v3__get_tasks({ status: 1, limit: 50 }) # Nao iniciadas +3. mcp__desk-crm-v3__get_tasks({ status: 4, limit: 50 }) # Em curso +``` + +### Passo 2: Organizar por Prioridade + +``` +Agrupar tarefas (sem duplicados) por: +1. Prioridade (4=Urgente, 3=Alta, 2=Normal, 1=Baixa) +2. Dentro de cada prioridade: vencidas primeiro, depois por deadline +3. Incluir projecto associado + +Formato: +### Urgentes (Prioridade 4) +| # | Tarefa | Projecto | Deadline | Status | Dias | +|---|--------|----------|----------|--------|------| + +### Alta Prioridade (Prioridade 3) +[mesma tabela] + +### Normal (Prioridade 2) +[mesma tabela, apenas overdue + esta semana] +``` + +### Passo 3: Resumo por Projecto + +``` +Contar tarefas por projecto: +| Projecto | Vencidas | Pendentes | Em Curso | Total | +|----------|----------|-----------|----------|-------| +``` + +### Passo 4: Workflows Sugeridos + +> Para as top 3 tarefas prioritarias, sugerir workflow adequado. +> Consultar: `/media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/WORKFLOWS-QUICK-START.md` + +``` +Padroes de deteccao (keywords na tarefa): + +1. WordPress, plugin, tema, woocommerce → /wp-dev ou wordpress-plugin-developer agent +2. Procedimento, documentar, padronizar → /proc-creator +3. Audit, seguranca, compliance → compliance-auditor agent +4. Orcamento, proposta, cotacao → /orcamento +5. Lead, cliente novo, contacto → /lead-approach +6. SEO, optimizacao, rankings → /seo-report ou seo-specialist agent +7. Deploy, publicar, easypanel → /easypanel-deploy +8. Marketing, campanha, estrategia → marketing-planning-expert agent +9. PHP, Laravel, API, backend → php-fullstack-engineer agent +10. React, Next, frontend, UI → javascript-fullstack-specialist agent + +Formato output: +## Workflows Sugeridos +- [ ] **#ID Tarefa** -> Workflow: [componente] + - [Breve explicacao] +``` + +### Passo 5: Output JSON (quando invocado pelo /today) + +``` +SE invocado com argumento "json": + Escrever resultado em ~/.claude-work/today-tasks-{date}.json + Formato: { "urgentes": N, "alta": N, "overdue": N, "total": N, "por_projecto": {...} } + +SE invocado standalone: + Mostrar output Markdown directamente ao utilizador +``` + +--- + +## Accoes Imediatas Sugeridas + +Apos listar tarefas, sugerir ate 6 accoes concretas: +1. Tarefas P4 (urgentes) - resolver hoje +2. Tarefas P3 a aguardar feedback - desbloquear +3. Tarefas vencidas ha >30 dias - decidir (fazer, delegar ou cancelar) +4. Tarefas em curso ha >14 dias - verificar progresso +5. Tarefas sem deadline - sugerir definir prazo +6. Tarefas sem estimativa de tempo - sugerir estimar + +--- + +## Anti-Patterns + +- NUNCA mostrar mais de 50 tarefas (filtrar por relevancia) +- NUNCA sugerir workflows para tarefas genericas sem keywords claras +- NUNCA sugerir workflows para tarefas ja em progresso (status 4) +- SEMPRE incluir link CRM: `[#ID](https://desk.descomplicar.pt/admin/tasks/view/ID)` + +--- + +*Skill v1.0.0 | 04-03-2026 | Descomplicar®* diff --git a/gestao/skills/time/SKILL.md b/gestao/skills/time/SKILL.md index 673a471..f9ed43c 100644 --- a/gestao/skills/time/SKILL.md +++ b/gestao/skills/time/SKILL.md @@ -98,15 +98,32 @@ Ainda a trabalhar em #1446? - Se sim: "Já tens timer em #X. Parar primeiro?" 2. Obter detalhes da tarefa: mcp__desk-crm-v3__get_task({ task_id }) -3. Iniciar timer no Desk: +3. **VALIDAR WORKFLOW (obrigatório):** + a. Verificar se tarefa está atribuída ao utilizador: + - Verificar se staff_id: 1 está em task.assignees + - Se NÃO: Erro "⚠️ Tarefa não atribuída a ti. Atribui primeiro." + b. Verificar status da tarefa: + - Status deve ser apropriado para timer (não "Não Iniciada") + - Se status inadequado: Erro com instruções + c. **Se validação falhar:** + ``` + ⚠️ Para iniciar timer: + 1. Atribuir tarefa a ti (staff_id: 1) + 2. Mudar status para "Em progresso" + 3. Só depois iniciar timer + + Tarefas que precisam ser executadas: + [Listar acções necessárias] + ``` +4. Iniciar timer no Desk: mcp__desk-crm-v3__start_timer({ task_id: task_id, staff_id: 1, note: "Iniciado via Claude Code" }) -4. Guardar estado local: +5. Guardar estado local: ~/.claude-work/active-timer.json -5. Confirmar +6. Confirmar ``` **Ficheiro estado:** @@ -218,6 +235,10 @@ const ALERT_HOURS = 4; // Alertar após 4h - **NUNCA** deixar timer overnight sem perguntar - **NUNCA** iniciar timer sem tarefa associada - **NUNCA** criar tarefa só para ter timer (usar tarefas existentes) +- **NUNCA** iniciar timer sem validar workflow: + - Tarefa DEVE estar atribuída ao utilizador + - Status DEVE ser apropriado ("Em progresso", não "Não Iniciada") + - SEMPRE validar antes de start_timer --- diff --git a/gestao/skills/today/SKILL.md b/gestao/skills/today/SKILL.md index c439463..f39cd46 100644 --- a/gestao/skills/today/SKILL.md +++ b/gestao/skills/today/SKILL.md @@ -1,1082 +1,223 @@ --- name: today description: > - Checkup diário v8.3 - IMAP triaging com deduplicação Supabase, auto-despesas com PDF, auditoria despesas Sab/Dom, MCP health check, workflow suggestions, Obsidian note. - Triagem emails 13 contas IMAP + deduplicação via imap_processed_emails (Supabase) + tickets CRM + despesas auto com PDF + health check MCPs (Sab/Dom) + sugestões workflows + nota diaria. - Use when "checkup", "hoje", "today", "rotina", início de dia. + Checkup diario v9.0 - Orquestrador leve que invoca sub-skills modulares. + Triagem tickets + IMAP + auto-despesas + digest + tarefas + infra-check. + Use when "checkup", "hoje", "today", "rotina", inicio de dia. author: Descomplicar® Crescimento Digital -version: 8.3.0 +version: 9.1.0 quality_score: 92 user_invocable: true category: productivity -tags: [rotina, checkup, dashboard, crm, tickets, invoices, timer, monday, saturday, sunday, weekend, imap, email, mcp, health-check] +tags: [rotina, checkup, dashboard, orchestrator] desk_task: 1416 desk_project: 65 -allowed-tools: Read, Write, mcp__desk-crm-v3, mcp__mcp-time, mcp__google-workspace, mcp__imap, mcp__memory-supabase, mcp__ssh-unified -mcps: desk-crm-v3, mcp-time, google-workspace, imap, memory-supabase, ssh-unified +allowed-tools: Read, Write, Skill, Glob, mcp__mcp-time, mcp__memory-supabase +mcps: mcp-time, memory-supabase dependencies: - skills: [ticket, invoice, time, crm, wp-update, cleanup-downloads] + skills: [ticket-triage, imap-triage, auto-expense, daily-digest, tasks-overview, infra-check, cleanup-downloads, wp-update, spec, sprint] --- -# /today v8.1 - Checkup Diário +# /today v9.0 - Checkup Diario (Orquestrador) -Hub central que orquestra skills Desk + IMAP para visao completa do dia. +Invoca sub-skills modulares em sequencia. Cada skill e autonoma e pode ser usada individualmente. --- -## Protocolo Principal +## Regra Fundamental -> **REGRA FUNDAMENTAL:** Fases 1-2 sao SILENCIOSAS e OBRIGATORIAS. -> Executar TUDO antes de mostrar qualquer output ao utilizador. -> O utilizador so ve o resumo final com as accoes ja tomadas. +> Fases 1-2 sao **silenciosas**. Executar tudo antes de mostrar output. +> O utilizador so ve o dashboard final com accoes ja tomadas. + +--- + +## Protocolo + +### Fase 0: Verificacoes ``` -FASE 1 - SILENCIOSA (executar tudo, sem output) - 1. mcp__mcp-time__current_time → Verificar dia da semana - 2. Verificar ultima execucao (memory-supabase: "today checkup YYYY-MM-DD") - 3. AUTO-PROCESSAR despesas de tickets (ver seccao Auto-Process) - 4. AUTO-FECHAR Tickets SPAM - 5. IMAP Triagem - 12 contas (ver seccao IMAP abaixo) - 6. Limpeza Downloads (via /cleanup-downloads) → SE >10 ficheiros +1. mcp__mcp-time__current_time → data, dia da semana +2. mcp__memory-supabase__search_memories("today checkup YYYY-MM-DD") + → Se ja existe hoje: perguntar se quer re-executar +``` -FASE 2 - RECOLHA (queries em paralelo, sem output) - 7. Timer Activo - 8. Tickets abertos (status 1,2,3) - 9. Facturas Vencidas - 10. Tarefas Prioritarias (urgentes + alta + vencidas) - 11. Leads Novos (status 7, 14) - 12. Propostas pendentes (status 4) - 13. Agenda do Dia (Google Calendar) +### Fase 1: Auto-Processamento (silencioso) -FASE 3 - OUTPUT + PERSISTENCIA - 14. Resumo do auto-processamento (despesas, SPAM, emails) - 15. Notificacoes de sistema que requerem revisao manual - 16. Dashboard (timer, tickets, facturas, tarefas, leads, agenda) - 17. 3 Prioridades do dia - 18. Workflows Sugeridos (analise de tarefas) - 19. SE SEGUNDA → Planeamento semanal + /wp-update - 20. SE SEXTA → Sugerir manutencao WordPress - 21. SE SABADO → MCP Health Check completo + Consolidacao memorias + Auditoria despesas - 22. SE DOMINGO → MCP Health Check resumido + Auditoria despesas - 23. Criar nota Obsidian (Passo 9) - 24. Guardar em Supabase (Passo 10) +``` +3. Invocar /ticket-triage + → Fecha SPAM, identifica facturas em tickets + → Output: ~/.claude-work/today-tickets-{date}.json + +4. Invocar /imap-triage + → Limpa 14 contas IMAP, identifica facturas em emails + → Output: ~/.claude-work/today-imap-{date}.json + +5. Invocar /auto-expense + → Le JSONs dos passos 3 e 4, cria despesas automaticamente + → Output: ~/.claude-work/today-expenses-{date}.json + +6. SE >10 ficheiros em ~/Transferencias: + → Invocar /cleanup-downloads +``` + +### Fase 2: Recolha de Dados (silencioso) + +``` +7. Invocar /daily-digest + → Timer, tickets, facturas, leads, propostas, agenda + → Output: dashboard markdown + +8. Invocar /tasks-overview + → Tarefas overdue, pendentes, em curso, workflows sugeridos + → Output: tarefas markdown +``` + +### Fase 2c: Sprint/Spec Activos (silencioso) + +``` +8b. Glob: /media/ealmeida/Dados/Dev/**/SPEC.md (profundidade max 3) + → Para cada encontrado: Ler frontmatter (15 linhas) + → Filtrar: status != "completed" + → Extrair: titulo (linha # SPEC:), status, weight, scope done/total + +8c. Glob: /media/ealmeida/Dados/Dev/**/SPRINT.md + → Para cada encontrado: Ler frontmatter + → Filtrar: status == "active" + → Extrair: sprint_id, tasks done/total, checkpoint_done, end_date + +8d. Output: ~/.claude-work/today-sprint-{date}.json +``` + +### Fase 2b: Rotinas Especiais + +``` +9. SE SABADO ou DOMINGO: + → Invocar /infra-check + → MCP Health Check + Auditoria despesas + +10. SE SEGUNDA: + → Planeamento semanal (tarefas da semana + capacidade) + → Invocar /wp-update + +11. SE SEXTA: + → Sugerir manutencao WordPress (10 sites da rede) +``` + +### Fase 3: Output Final + +``` +12. AGREGAR resultados de todas as sub-skills: + - Ler JSONs de ~/.claude-work/today-*.json + - Combinar alertas, metricas, accoes + +13. DASHBOARD ao utilizador (formato abaixo) + +14. CRIAR NOTA OBSIDIAN: + Path: /media/ealmeida/Dados/Hub/00-Inbox/DD-MM-YYYY-checkup.md + Conteudo: dashboard completo + +15. GUARDAR em Supabase: + mcp__memory-supabase__save_memory({ + content: "Checkup diario - X tickets, Y tarefas, Z urgentes, W emails", + tags: ["today", "checkup", "DD-MM-YYYY"] + }) + +16. LIMPAR temporarios: + rm ~/.claude-work/today-*-{date}.json ``` --- -## Secções do Checkup - -### 1. Timer Activo - -``` -Verificar ~/.claude-work/active-timer.json -Se activo: - 🟢 Timer: #1446 - Documentação (2h 15m) - ⚠️ Se >4h: "Timer activo há muito tempo!" -``` - -### 2. Tickets Abertos - -``` -mcp__desk-crm-v3__get_tickets({ status: [1,2,3] }) - -## 🎫 Tickets (4) -🔴 #234 - Erro login (TechCorp) - 2h -🟠 #232 - Bug funcionalidade (StartupX) - 1d -🟢 #230 - Dúvida (ClienteY) - 2d -``` - -### 3. Facturas Vencidas - -``` -mcp__desk-crm-v3__overdue_invoices_report() - -## 💰 Facturas Vencidas (2) -| # | Cliente | Valor | Dias | -|---|---------|-------|------| -| INV-040 | OldClient | €950 | 15 | -| INV-038 | SlowPay | €2.100 | 22 | -**Total:** €3.050 -``` - -### 4. Tarefas Prioritárias - -``` -mcp__desk-crm-v3__get_tasks({ status: [1,4], priority: [3,4] }) - -## 📋 Tarefas Prioritárias (5) -🔴 Urgentes -| # | Tarefa | Projecto | Deadline | -|---|--------|----------|----------| -| #1450 | Implementar API | SFV-360 | Hoje | - -🟠 Alta -| # | Tarefa | Projecto | Deadline | -|---|--------|----------|----------| -| #1448 | Documentação | Stack | Amanhã | -``` - -### 4.1 Workflows Sugeridos (NOVO v8.3) - -> **Analisar tarefas prioritárias e sugerir workflows relevantes.** -> Consultar: `/media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/WORKFLOWS-QUICK-START.md` - -**Protocolo:** - -``` -Para cada tarefa prioritária (top 3), identificar padrões e sugerir workflow: - -PADRÕES DE DETECÇÃO: -1. WordPress → Task → wordpress-plugin-developer ou /wp-dev - - Keywords: wordpress, plugin, tema, woocommerce, elementor - -2. Criar Procedimento → /proc-creator - - Keywords: procedimento, documentar processo, padronizar - -3. Auditar/Segurança → Task → compliance-auditor - - Keywords: audit, segurança, compliance, vulnerabilidade - -4. Orçamento/Proposta → /orcamento - - Keywords: orçamento, proposta, cotação, budget - -5. Lead/Cliente → /lead-approach ou /crm - - Keywords: lead, cliente novo, contacto comercial - -6. SEO → Task → seo-specialist ou /seo-report - - Keywords: seo, optimização, rankings, google - -7. Deploy → /easypanel-deploy - - Keywords: deploy, publicar, easypanel - -8. Marketing → Task → marketing-planning-expert - - Keywords: marketing, campanha, estratégia - -9. PHP/Laravel → Task → php-fullstack-engineer - - Keywords: php, laravel, api, backend - -10. Design/Frontend → Task → javascript-fullstack-specialist - - Keywords: react, next, frontend, ui -``` - -**Output formato:** +## Formato Dashboard ```markdown -## 🔄 Workflows Sugeridos +## Checkup Diario - DD-MM-YYYY (Dia-da-Semana) -Com base nas tuas tarefas de hoje: +--- -- [ ] **#1450 Implementar API** → Workflow: php-fullstack-engineer (Task tool) - - Desenvolvimento backend com Laravel, criar endpoints RESTful - - Duração estimada: ~3-4h +## Requer Atencao Urgente +[Alertas de seguranca, erros, notificacoes criticas - do /imap-triage e /ticket-triage] -- [ ] **#1448 Documentação Stack** → Workflow: /proc-creator - - Criar PROC-* estruturado, validação automática, indexação - - Duração estimada: ~20min +--- -- [ ] **Novo lead via email** → Workflow: /lead-approach - - Análise completa + estratégia + primeiro contacto - - Duração estimada: ~30min -``` +## 3 Prioridades Hoje +1. [ ] [Mais urgente] +2. [ ] [Segunda] +3. [ ] [Terceira] -**Quando NÃO sugerir:** -- Se tarefa é genérica sem keywords claras -- Se já está em progresso (status 4) -- Se é manutenção simples (<30min estimado) +--- -### 5. Agenda do Dia +## Workflows Sugeridos +[Do /tasks-overview] -``` -mcp__google-workspace__get_events({ - user_google_email: "emanuelalmeidaa@gmail.com", - time_min: "hoje 00:00", - time_max: "hoje 23:59" -}) +--- -## 📅 Agenda Hoje -- 10:00 - Reunião Cliente X -- 14:30 - Call Equipa +## Sprint / Spec Activos +[Projectos com spec/sprint activo: nome, progresso, checkpoint] +[Se nenhum: "Nenhum sprint/spec activo"] + +--- + +## Resumo do Dia +[Do /daily-digest: timer, tickets, facturas, tarefas, leads, agenda] + +--- + +## Emails IMAP Processados +[Do /imap-triage: tabela por conta com spam/promo/factura/notif] + +--- + +## Auto-Processamento Executado +[Do /auto-expense e /ticket-triage: despesas criadas, tickets fechados] + +--- + +## Infra Check [se Sab/Dom] +[Do /infra-check: status MCPs + auditoria despesas] ``` --- -## IMAP Triagem (FASE 1 - Passo 5) - -> **OBRIGATORIO:** Processar 13 contas IMAP silenciosamente. -> Ver regras detalhadas em `config/email-triage-rules.md` - -### Contas IMAP (14) - -``` -emanuel, it, help, suporte, contabilidade, financeiro, -rh, mkt, design, news, aiktop, recursos, google -``` - -### Passo 0: Carregar emails já processados (Supabase) - -> **Executar UMA VEZ no início da triagem IMAP, antes de iterar contas.** -> Fonte de verdade: tabela `imap_processed_emails` em Supabase (EasyPanel). - -``` -mcp__ssh-unified__ssh_execute( - server="easy", - command="docker exec descomplicar_supabase-db-1 psql -U postgres -d postgres -t -A -c \"SELECT message_id FROM public.imap_processed_emails\"" -) - -→ Guardar resultado como Set/lista: processed_ids -→ Emails cujo message_id esteja nesta lista sao SALTADOS (já processados) -``` - -**Acesso:** SSH → EasyPanel → docker exec psql (NÃO usar REST API - sem domínio externo configurado) - -### Para cada conta: imap_list_emails(account, folder="INBOX", limit=50) - -``` -Para cada email: verificar message_id contra processed_ids - → SE message_id IN processed_ids → SALTAR (já processado anteriormente) - → SE NÃO → Classificar por ordem de prioridade: - -Classificar cada email por ordem de prioridade: - -1. SPAM → imap_delete_email(account, uid) - - Subject: lottery, winner, urgent money, bitcoin investment - - Remetente: *.ru, *.cn (excepto conhecidos) - - Subject todo em MAIUSCULAS - -2. PROMOCIONAL → imap_move_email(account, uid, "Promotions") - - Subject: newsletter, promo, desconto, oferta - - Remetente: *@marketing.*, *@news.*, *@promo.* - - EXCEPÇÃO: conta "rh" → imap_delete_email (sem pasta Promotions) - -3. FACTURA/RECIBO → Auto-processar despesa (ver secção Auto-Despesas IMAP) - - Subject: factura, invoice, recibo, receipt, pagamento, paid - - Remetente de servico conhecido (ver mapeamento completo abaixo) - - Criar despesa + anexar PDF automaticamente - -4. PRIORITARIO → Incluir no relatorio - - Remetente: cliente conhecido (verificar DeskCRM) - - Subject: urgente, problema, erro, critical, down - - Threads activas (RE:, FW:) -``` - -### Resumo IMAP no output - -``` -📧 Emails Processados -- X spam eliminados -- Y promocionais arquivados -- Z despesas criadas automaticamente (valor total) -- W emails prioritarios pendentes -``` - -### Excepcoes (NUNCA processar automaticamente) - -``` -- *@descomplicar.pt (internos) -- *@gov.pt, *@at.gov.pt, *@seg-social.pt (governo) -- *@tribunais.org.pt (tribunais) -``` - ---- - -## Auto-Despesas IMAP (FASE 1 - Passo 5.3) - -> **Quando um email e classificado como FACTURA/RECIBO na triagem IMAP, -> processar AUTOMATICAMENTE como despesa em vez de apenas registar.** - -### Fluxo completo - -``` -1. DETECTAR: Email de fornecedor conhecido com subject de factura/recibo -2. LER: imap_read_email(account, uid) → conteudo HTML + anexos -3. EXTRAIR do HTML: - - Valor (procurar padroes: $XX.XX, XX,XX EUR, USD XX.XX) - - Referencia/Invoice number - - Data da factura - - Converter USD→EUR se necessario (taxa 0.92) -4. VERIFICAR DUPLICADO: - - Verificar message_id contra processed_ids (Supabase) → se já existe, SALTAR - - Pesquisar no Desk: mesmo fornecedor + mesmo valor + mesma data (±3 dias) - - Se duplicado → registar no Supabase com action="duplicate", nao criar despesa -5. CRIAR DESPESA no Desk: - - create_expense(category, amount, date, expense_name, note, currency=3, tax) - NOTA: currency=3 (EUR), currency=2 (USD). Para despesas em USD manter valor original com currency=2 - - note = "Auto-criado via /today IMAP triagem" -6. PDF ANEXO (se existir no email): - a. GUARDAR LOCAL na pasta organizada: - - Path: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/MM-NomeMes/ - - Criar pasta se nao existir (mkdir -p) - - Nome ficheiro: YYYY-MM-DD_Fornecedor_Referencia.pdf (ou nome original se claro) - - Meses PT: 01-Janeiro, 02-Fevereiro, 03-Marco, 04-Abril, 05-Maio, 06-Junho, - 07-Julho, 08-Agosto, 09-Setembro, 10-Outubro, 11-Novembro, 12-Dezembro - b. UPLOAD ao Desk servidor: - - SFTP para /tmp/ no servidor - - mkdir -p uploads/expenses/{expense_id}/ - - Copiar PDF + criar index.html - - chown ealmeida:ealmeida - c. REGISTAR no Desk BD: - - INSERT tblfiles (rel_id, rel_type='expense', file_name, filetype='application/pdf', - attachment_key=MD5(rand), staffid=25, dateadded=NOW()) - d. LIMPAR /tmp/ local e remoto -7. ACTUALIZAR CSV: - - Adicionar linha ao MAPA-DESPESAS-YYYY.csv correspondente - - Formato: id_desk;data;categoria;fornecedor;descricao;valor;SIM;ficheiro;email;Auto /today -8. REGISTAR NO SUPABASE: - - Adicionar ao batch de emails processados (ver Passo Final abaixo) - - Marcar email como lido: imap_move_email NÃO é usado (sem pasta "Processed") - - Email permanece na INBOX mas fica registado como processado no Supabase -``` - -### Path da pasta Contabilidade - -``` -BASE: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/ -Estrutura: {BASE}/YYYY/MM-NomeMes/ficheiro.pdf - -Exemplo: .../2026/02-Fevereiro/2026-02-12_Anthropic_Max20x_180.00EUR.pdf - -CSVs: {BASE}/YYYY/MAPA-DESPESAS-YYYY.csv -``` - -### Mapeamento Completo Fornecedores (IMAP + Tickets) - -> **25 fornecedores activos.** Verificar pelo dominio do email remetente. -> Mesma tabela usada para triagem IMAP E para auto-process tickets. - -| # | Fornecedor | Padrao Email Remetente | Conta IMAP | Cat ID | Categoria | Tax | Moeda | Notas | -|---|-----------|----------------------|------------|--------|-----------|-----|-------|-------| -| 1 | Anthropic | anthropic.com | recursos, info | 38 | Servicos IA e APIs | 0 | USD | Pro/Max/API - receipt com invoice number | -| 2 | OpenRouter | openrouter.ai, stripe.com (OpenRouter) | contabilidade | 38 | Servicos IA e APIs | 0 | USD | Invoice-36853E80-* | -| 3 | CapSolver | payproglobal.com | contabilidade | 38 | Servicos IA e APIs | 0 | USD | PayPro Global como revendedor | -| 4 | Hetzner | hetzner.com | contabilidade, emanuel | 4 | Alojamento web (Hosting) | 0 | EUR | Servidor dedicado mensal | -| 5 | CWP | centos-webpanel.com, control-webpanel.com | contabilidade | 28 | Licencas Software | 0 | USD | Business Support mensal | -| 6 | MEO | meo.pt, meoempresas.pt | contabilidade | 1 | Telecomunicacoes | 1 | EUR | Factura PT com IVA | -| 7 | Canva | canva.com | it | 28 | Licencas Software | 0 | EUR | Pro mensal via PayPal | -| 8 | ElasticEmail | elasticemail.com | it, contabilidade | 30 | Servicos Cloud e Infraestrutura | 0 | USD | Auto-recharge 10 USD | -| 9 | Descript | descript.com, stripe.com (Descript) | contabilidade | 28 | Licencas Software | 0 | USD | Pro mensal 35 USD | -| 10 | Cursor | cursor.com, stripe.com (Cursor) | contabilidade | 28 | Licencas Software | 0 | USD | Pro sub + usage | -| 11 | GitHub | github.com | emanuel | 28 | Licencas Software | 0 | USD | Copilot mensal | -| 12 | Make/Celonis | make.com, celonis.com | google | 6 | Servicos Externos | 0 | USD | Pro mensal | -| 13 | Gamma | gamma.app | google | 6 | Servicos Externos | 0 | EUR | Pro mensal 20 EUR | -| 14 | Softaculous | softaculous.com | contabilidade | 28 | Licencas Software | 0 | USD | Licenca anual | -| 15 | BdThemes | bdthemes.com, fastspring.com | it | 14 | Subscricoes e Servicos Digitais | 0 | USD | Element Pack anual | -| 16 | Replicate | replicate.com | emanuel | 38 | Servicos IA e APIs | 0 | USD | Credit purchase pontual | -| 17 | Google One | google.com (Google One) | gmail | 30 | Servicos Cloud e Infraestrutura | 0 | EUR | AI Premium mensal | -| 18 | Namecheap | namecheap.com | gmail | 37 | Dominios | 0 | USD | Renovacao dominios | -| 19 | Insync | insynchq.com | gmail | 28 | Licencas Software | 0 | USD | Licenca pontual | -| 20 | Freepik | freepik.com | contabilidade | 14 | Subscricoes e Servicos Digitais | 0 | EUR | Assinatura | -| 21 | Vimeo | vimeo.com | contabilidade | 14 | Subscricoes e Servicos Digitais | 0 | USD | Video hosting | -| 22 | Moloni | moloni.pt | contabilidade | 28 | Licencas Software | 1 | EUR | Facturacao PT com IVA | -| 23 | YouTube Premium | google.com (YouTube) | gmail | 14 | Subscricoes e Servicos Digitais | 0 | EUR | Mensal ~6.99 EUR | -| 24 | PTisp | ptisp.pt, almourol.com | gmail, contabilidade | 37 | Dominios | 1 | EUR | Dominios PT com IVA | -| 25 | TOConline | toconline.pt, no-reply@toconline.pt | emanuel | — | (ver nota) | 1 | EUR | Plataforma faturas eletronicas PT. Ler email para identificar emitente real. CUBIC CHOICES LDA → cat 21 (Contabilidade). Outros emitentes → mapear manualmente ou flag priority. | - -### Moedas - -``` -EUR: currency = 3 (default) -USD: currency = 2 (manter valor original, NAO converter) - -CRITICO: currency=1 NAO existe e causa despesas invisiveis nos relatorios. -``` - -### Plataformas Multi-Fornecedor (protocolo especial) - -> Algumas plataformas entregam faturas de qualquer empresa. NAO mapear para categoria fixa. -> Ler o email para identificar o emitente real, depois categorizar. - -| Plataforma | Dominio | Protocolo | -|-----------|---------|-----------| -| TOConline | toconline.pt | Ler email → extrair "Emitente: [empresa]" → mapear empresa → se desconhecida: flag priority | -| Stripe | stripe.com | Ler subject/corpo → identificar fornecedor (Cursor, Descript, OpenRouter...) → usar entrada do fornecedor real | -| PayPal | paypal.com | Ler corpo → identificar fornecedor → categorizar por fornecedor real | -| FastSpring | fastspring.com | Ler corpo → identificar fornecedor (BdThemes...) → categorizar por fornecedor real | -| PayPro Global | payproglobal.com | Ler corpo → identificar fornecedor (CapSolver...) → categorizar por fornecedor real | - -**Emitentes TOConline conhecidos:** -- CUBIC CHOICES LDA → cat 21 (Contabilidade), tax=1 - -**Emitentes TOConline desconhecidos:** flag `priority_flagged` com nota "TOConline - emitente desconhecido: [empresa]" - -### Emails a IGNORAR (nao sao despesas) - -``` -- "Payment Confirmation" / "Payment Was Successfully Processed" → apenas confirmacao -- "Your subscription has been renewed" sem valor → apenas notificacao -- "Notificacao de transferencia" de bancos → notificacao bancaria -- Emails de marketing/changelog dos mesmos fornecedores → promocional -- Emails com subject "Welcome" / "Getting Started" → onboarding -``` - -### Protecao contra duplicados (2 camadas) - -``` -CAMADA 1 - Supabase (message_id): - - Verificar message_id no Set processed_ids carregado no Passo 0 - - Se encontrado → SALTAR completamente (nem ler o email) - - Deduplicação exacta, sem falsos positivos - -CAMADA 2 - Desk CRM (fornecedor + valor + data): - - Pesquisar no Desk: mesmo fornecedor + mesmo valor (±0.05 EUR) + mesma data (±3 dias) - - Se match → NAO criar despesa - - Registar no Supabase com action="duplicate", action_detail="Duplicado de despesa #ID" - -Se nenhum duplicado → criar despesa + registar no Supabase com action="expense_created" -``` - -### Passo Final: Registar emails processados no Supabase - -> **Executar UMA VEZ no final da triagem IMAP, após processar todas as contas.** -> Batch INSERT com ON CONFLICT DO NOTHING para segurança. - -``` -Acumular durante a triagem uma lista de novos emails processados: - { message_id, account_id, subject, sender, email_date, action, action_detail } - -Onde action pode ser: - - "spam_deleted" → email spam eliminado - - "promo_archived" → email promocional arquivado - - "expense_created" → despesa criada (#ID) - - "duplicate" → duplicado detectado - - "priority_flagged" → email prioritário incluído no relatório - - "notification_closed" → notificação/newsletter fechada - - "skipped" → email ignorado (não relevante) - -Comando batch INSERT via SSH: -mcp__ssh-unified__ssh_execute( - server="easy", - command="docker exec descomplicar_supabase-db-1 psql -U postgres -d postgres -c \" - INSERT INTO public.imap_processed_emails (message_id, account_id, subject, sender, email_date, action, action_detail) - VALUES - ('msg-id-1', 'conta1', 'Subject 1', 'from@x.com', '2026-02-12', 'expense_created', 'Despesa #985'), - ('msg-id-2', 'conta2', 'Subject 2', 'from@y.com', '2026-02-12', 'spam_deleted', NULL) - ON CONFLICT (message_id) DO NOTHING; - \"" -) - -→ ON CONFLICT garante idempotência (re-executar checkup não duplica registos) -→ Máximo ~50 VALUES por INSERT (limitar tamanho do comando SSH) -``` - ---- - -## Rotinas Semanais - -### Segunda-feira - -``` -1. Checkup normal (acima) -2. Planeamento semanal: - - Todas as tarefas com deadline esta semana - - Capacidade vs carga - - Distribuicao por dia - - Verificar estimativas de tempo (set_task_estimated_time se em falta) -3. Invocar /wp-update -``` - -### Sexta-feira - -``` -1. Checkup normal (acima) -2. Sugerir manutencao WordPress: - - Listar os 10 sites da rede - - Oferecer checkup de seguranca -``` - -### Sabado - -``` -1. Checkup normal (acima) -2. MCP Health Check completo (ver secção MCP Health Check) -3. Consolidacao de memorias: - - Listar ~/.claude/projects/*/memory/MEMORY.md - - Extrair "Padroes Descobertos" e "Solucoes" - - Comentario na discussao #46 (Memorias) - - Backup em memory-supabase -4. Auditoria de despesas (ver secção Auditoria Despesas abaixo) - - Completa: sem PDF, sem categoria, valores anomalos - - Reconciliacao mensal se 1o sabado do mes -``` - -### Domingo - -``` -1. Checkup normal (acima) -2. MCP Health Check resumido (ver secção MCP Health Check) - - Apenas verificação rápida de status - - Alertas se algum MCP offline -3. Auditoria de despesas resumida (ver secção Auditoria Despesas abaixo) - - Apenas: despesas sem PDF dos ultimos 30 dias - - Alerta se >3 sem PDF -``` - ---- - -## Auditoria Despesas (Sabado/Domingo) - -> **Sabado:** Auditoria completa. **Domingo:** Apenas despesas sem PDF. -> Executar apos MCP Health Check, antes da nota Obsidian. - -### Protocolo Sabado (Completo) - -``` -1. DESPESAS SEM PDF (ultimos 60 dias): - SQL via mcp__ssh-unified__ssh_execute(server="desk"): - SELECT e.id, e.expense_name, e.amount, e.date, e.note, - (SELECT COUNT(*) FROM tblfiles f WHERE f.rel_id = e.id AND f.rel_type = 'expense') as pdfs - FROM tblexpenses e - WHERE e.id >= 770 - AND e.date >= DATE_SUB(CURDATE(), INTERVAL 60 DAY) - HAVING pdfs = 0 - ORDER BY e.date DESC; - - → Excluir: AT (cat 15), Salarios (cat 22), SS (cat 25) - nao tem recibo - → Reportar restantes como "despesas sem documento" - -2. DESPESAS SEM CATEGORIA ou com categoria errada: - SELECT id, expense_name, amount, category, date - FROM tblexpenses - WHERE id >= 770 AND (category = 0 OR category IS NULL) - ORDER BY date DESC; - -3. VALORES ANOMALOS (despesas >500 EUR ou negativas): - SELECT id, expense_name, amount, currency, date - FROM tblexpenses - WHERE id >= 770 - AND (amount > 500 OR amount < 0) - ORDER BY amount DESC; - -4. RECONCILIACAO MENSAL (apenas 1o sabado do mes): - SE DAY(CURDATE()) <= 7: - - Contar despesas do mes anterior por categoria - - Comparar com mes homologo (se existir) - - Calcular total mensal - - Alertar se variacao >30% vs media - -5. FORNECEDORES RECORRENTES em falta: - Verificar se fornecedores mensais tem despesa este mes: - - Anthropic (mensal) - - Cursor (mensal) - - Hetzner (mensal) - - Google One (mensal) - - ElasticEmail (mensal) - - Canva (mensal) - SE algum nao tem despesa no mes corrente E ja passaram >10 dias → alertar -``` - -### Protocolo Domingo (Resumido) - -``` -1. APENAS despesas sem PDF dos ultimos 30 dias: - (mesma query do sabado mas INTERVAL 30 DAY) - -2. SE >3 despesas sem PDF (excl. AT/Salario/SS): - → Alerta: "X despesas sem documento nos ultimos 30 dias" - → Listar cada uma com fornecedor, valor e data - -3. SE 0 despesas sem PDF: - → "Todas as despesas recentes tem documento anexado" -``` - -### Output no Resumo - -```markdown -## Auditoria Despesas (Sabado) - -### Despesas sem documento (3) -| # | Fornecedor | Valor | Data | Accao | -|---|-----------|-------|------|-------| -| 985 | Anthropic | 180.00 EUR | 06-02 | Descarregar recibo | -| 1008 | Cursor | 17.60 USD | 01-08 | Verificar portal | - -### Fornecedores recorrentes -- Anthropic: OK (despesa Fev encontrada) -- Cursor: OK -- Hetzner: FALTA (sem despesa Fev) → verificar email/portal - -### Resumo mensal (se 1o sabado) -- Total Fevereiro: 1.234,56 EUR (23 despesas) -- vs Janeiro: +12% (1.102,00 EUR) -- Top 3: Anthropic (360 EUR), Hetzner (276 EUR), Cursor (120 EUR) -``` - -```markdown -## Auditoria Despesas (Domingo) - -Todas as despesas dos ultimos 30 dias tem documento anexado. - -OU - -3 despesas sem documento (ultimos 30 dias): -- #985 Anthropic 180.00 EUR (06-02) → descarregar recibo -- #1008 Cursor 17.60 USD (01-08) → verificar portal -``` - ---- - -## MCP Health Check (Sábado/Domingo) - -### Protocolo Sábado (Completo) - -``` -1. Listar MCPs críticos (do ~/.claude.json): - - desk-crm-v3 (gateway) - - google-workspace (gateway) - - ssh-unified (gateway) - - gitea (gateway) - - moloni (gateway) - - memory-supabase (gateway) - - dify-kb (gateway) - - filesystem (local) - - mcp-time (local) - -2. Para cada MCP: - a. Tentar operação simples de teste: - - desk-crm-v3: get_tickets(limit=1) - - google-workspace: get_events (hoje) - - ssh-unified: ssh_list_servers - - filesystem: list_directory(~) - - etc. - - b. Registar resultado: - ✅ OK - respondeu em <2s - ⚠️ LENTO - respondeu em >2s - ❌ FALHA - timeout ou erro - -3. Verificar credenciais: - - Google Workspace: verificar token expiry - - SSH: verificar keys funcionam - - Gitea: verificar auth - -4. Output no resumo: - ``` - ## 🔍 MCP Health Check (Sábado) - ✅ 8/9 MCPs operacionais - ⚠️ google-workspace (lento: 3.2s) - ❌ gitea (timeout) - - Acções necessárias: - - Investigar timeout gitea - - Google workspace token expira em 5 dias - ``` - -5. SE algum MCP crítico falhou: - - Criar nota em Obsidian com detalhes - - Guardar em memory-supabase tag:["mcp-issue"] -``` - -### Protocolo Domingo (Resumido) - -``` -1. Verificar apenas MCPs críticos top 5: - - desk-crm-v3 - - google-workspace - - ssh-unified - - filesystem - - mcp-time - -2. Teste rápido (timeout 5s): - - Apenas verificar se responde - - Não testar funcionalidade completa - -3. Output resumido: - ``` - ## 🔍 MCP Status (Domingo) - ✅ Todos os MCPs críticos operacionais - - OU - - ❌ google-workspace offline - → Verificar segunda-feira - ``` - -4. Apenas alertar se falha crítica -``` - -### MCPs Críticos por Prioridade - -**P1 - Críticos (bloqueiam trabalho):** -- desk-crm-v3 (CRM) -- filesystem (ficheiros locais) -- mcp-time (data/hora) - -**P2 - Importantes (degradam workflow):** -- google-workspace (email/calendar) -- ssh-unified (servidores) -- memory-supabase (memória) - -**P3 - Úteis:** -- gitea (repos) -- moloni (facturação) -- dify-kb (knowledge base) - -### Troubleshooting Automático - -Se MCP falha, tentar: - -``` -1. Verificar gateway.descomplicar.pt está acessível: - - WebFetch("https://gateway.descomplicar.pt/health") - -2. SE gateway OK mas MCP falha: - - Problema no MCP específico - - Documentar para investigação - -3. SE gateway falha: - - Problema de rede ou servidor mcp-hub - - Alerta crítico -``` - ---- - -## Persistencia (FASE 3 - Passos 21-22) - -### Passo 21: Nota Obsidian - -``` -Path: /media/ealmeida/Dados/Hub/00-Inbox/ -Filename: DD-MM-YYYY-checkup.md +## Nota Obsidian +```yaml --- title: Checkup DD-MM-YYYY date: DD-MM-YYYY type: checkup status: active --- - -## Checkup Diario - DD-MM-YYYY (Dia-da-Semana) - ---- - -## ⚠️ REQUER ATENÇÃO URGENTE - -[Listar questoes urgentes identificadas durante auto-processamento e IMAP] - ---- - -## ✓ 3 Prioridades Hoje - -[As 3 tarefas mais importantes do dia] - ---- - -## 📊 Resumo do Dia - -[Timer, Tickets, Facturas, Tarefas, Leads, Propostas, Agenda] - ---- - -## 📧 Emails IMAP Processados - -[Resumo limpeza automatica] - ---- - -## 🔄 Auto-Processamento Executado - -[Tickets fechados, despesas criadas] ``` -### Passo 22: Supabase - -``` -mcp__memory-supabase__save_memory: -- content: "Checkup diario - X tickets, Y tarefas, Z urgentes, W emails" -- tags: ["today", "checkup", "DD-MM-YYYY"] -- metadata: { tickets, tasks, urgent, emails_processed, is_monday } -``` - ---- - -## Output Final - -> **ESTRUTURA OBRIGATORIA:** Questoes urgentes NO TOPO. -> Utilizador ve primeiro o que requer atencao imediata. - -```markdown -## Checkup Diario - DD-MM-YYYY (Dia-da-Semana) - ---- - -## ⚠️ REQUER ATENÇÃO URGENTE - -### 🚨 [Categoria] - [Assunto] -[Descricao do problema urgente] -- [Detalhes] -- [Accao necessaria] - -### [Outros problemas urgentes se existirem] - ---- - -## ✓ 3 Prioridades Hoje -1. [ ] [Prioridade 1 - mais urgente] -2. [ ] [Prioridade 2] -3. [ ] [Prioridade 3] - ---- - -## 🔄 Workflows Sugeridos - -Com base nas tuas tarefas de hoje: -- [ ] **[Tarefa/Contexto]** → Workflow sugerido: [Componente] - - [Breve explicação do workflow e próximos passos] - ---- - -## 📊 Resumo do Dia - -### Timer -[Status do timer ou "Nenhum timer activo"] - -### Tickets -- Abertos: X (Y urgentes) -- Fechados automaticamente: Z - -### Facturas -- Vencidas: [valor] EUR ou "0" - -### Tarefas -- Urgentes: X -- Alta prioridade: Y - -### Leads + Propostas -- Leads novos: X -- Propostas pendentes: Y - -### Agenda -- [HH:MM - Evento] - ---- - -## 📧 Emails IMAP Processados - LIMPEZA AUTOMÁTICA ✓ - -**TOTAL: X emails apagados/movidos em Y contas** - -[Detalhes por conta] - ---- - -## 🔄 Auto-Processamento Executado - -[Tickets fechados, despesas criadas, etc] -``` - ---- - -## Auto-Process Tickets (FASE 1 - OBRIGATÓRIO) - -> **EXECUTAR SILENCIOSAMENTE ANTES DE QUALQUER OUTPUT.** -> Nao perguntar, nao mostrar preview. Processar e reportar no resumo final. - -### Passo 1: Recolher tickets abertos (status 1) de TODOS os departamentos - -``` -get_tickets({ status: 1, limit: 50 }) -``` - -### Passo 2: Classificar cada ticket - -Para cada ticket aberto, aplicar por ordem de prioridade: - -``` -1. NOTIFICAÇÃO SISTEMA? (verificar PRIMEIRO) - → Subject contem padrao protegido E remetente conhecido - → NAO fechar. Guardar para "Requer Accao" no resumo. - -2. DESPESA? (verificar SEGUNDO) - → Email do remetente contem padrao de fornecedor conhecido (ver mapeamento) - → Processar como despesa (ver passos abaixo) - -3. SPAM? (verificar TERCEIRO) - → Subject contem padrao SPAM - → Fechar (status 5) com motivo - -4. NEWSLETTER/INFORMATIVO? - → Newsletters, updates de produtos, notificacoes genericas - → Fechar (status 5) com motivo - -5. NENHUM MATCH → Manter aberto para revisao -``` - -### Passo 3: Processar Despesas - -> **DADOS ESTAO NO HTML.** A maioria dos fornecedores (Anthropic, Canva, Elastic Email) -> envia os dados no corpo do email, NAO como PDF anexo. -> Extrair valor, referencia e data do HTML do ticket. - -``` -Para cada ticket identificado como despesa: - 1. get_ticket(ticket_id) → ler HTML completo - 2. Extrair do HTML: valor, invoice/reference number, data, descricao - 3. Mapear email → categoria (tabela abaixo) - 4. create_expense(category_id, amount, date, note, reference, currency=3 ou 2, tax) - → currency=3 (EUR) para fornecedores EUR, currency=2 (USD) para fornecedores USD - 5. Fechar ticket (status 5) com "Despesa #ID criada" - 6. SE existe ticket duplicado (mesmo subject) → fechar duplicado tambem -``` - -### Padroes SPAM (Fechar status 5) - -``` -Guest Post, SEO services, backlinks, partnership, -Purchase Order, WeTransfer, Prestige Awards -``` - -### Notificacoes de Sistema (NUNCA auto-fechar) - -**Padroes protegidos (subject - case insensitive):** -``` -Legal Update, Legal Notice, Policy Change, Policy Update, -Deprecation, End of Life, EOL, Breaking Change, -Migration Required, Action Required, Action Needed, -Security Alert, Security Advisory, Security Notice, -API Change, API Update, Terms Update, Terms Change, -Service Disruption, Maintenance Required, -Compliance, GDPR, Data Processing, Data Processor, -Infrastructure Change, Platform Update, Product Update -``` - -### Mapeamento Fornecedor → Categoria - -> Verificar pelo **dominio do email** do remetente, nao pelo departamento. -> Tickets de fornecedores conhecidos podem estar em QUALQUER departamento. -> **Tabela completa na secção "Auto-Despesas IMAP" acima (22 fornecedores).** -> Abaixo apenas padroes adicionais especificos de tickets: - -| Padrao no Email | Categoria | ID | Tax | -|-----------------|-----------|-----|-----| -| openai | Servicos IA e APIs | 38 | 0 | -| everhour | Softwares Gestao | 12 | 0 | -| envato | Plugins e Recursos de Design | 9 | 0 | -| staples, multipapel | Material Escritorio | 15 | 1 | -| ptisp | Registo de Dominios | 13 | 0 | - -### Tickets a Saltar (NAO criar despesa) - -| Tipo | Indicador | Accao | -|------|-----------|-------| -| Payment Confirmation | "Payment Confirmation" de CWP/centos-webpanel | Fechar (confirmacao pagamento, nao fatura) | -| Payment Receipt | "Payment Was Successfully Processed" de elasticemail | Fechar (recibo pagamento recorrente sem dados de fatura) | -| Notificacao bancaria | "Notificação de transferência" de bancobpi | Fechar (notificacao, nao fatura) | -| Duplicado | reference_no ja existe no CRM | Fechar (ja processado) | -| Ticket duplicado | Mesmo subject que outro ticket ja processado | Fechar como duplicado | - -> **NOTA:** Receipts de Anthropic e Canva contem invoice number e valor → SAO despesas. -> "Receipt" so e motivo para saltar quando e apenas confirmacao de pagamento sem dados de fatura. - -### Campos Criticos - -``` -currency = 3 (EUR) → Fornecedores EUR (Anthropic Max, Hetzner, MEO, Canva, Gamma, Google One) -currency = 2 (USD) → Fornecedores USD (Cursor, CWP, Descript, ElasticEmail, OpenRouter, etc.) -CRITICO: currency=1 NAO existe → despesas invisiveis nos relatorios -tax = 1 → Fornecedores PT (MEO, Moloni, Staples) -tax = 0 → Fornecedores estrangeiros (Anthropic, Canva, Hetzner, etc.) -send_invoice_to_customer = 0 → OBRIGATORIO na BD (sem default) -``` - ---- - -## Referência de Skills - -| Secção | Skill | Comando | -|--------|-------|---------| -| Timer | /time | `/time` | -| Tickets | /ticket | `/ticket` | -| Facturas | /invoice | `/invoice overdue` | -| Tarefas/Leads | /crm | `/crm` | -| Downloads | /cleanup-downloads | SE >10 ficheiros | -| WordPress | /wp-update | Segundas | +Filename: `DD-MM-YYYY-checkup.md` (Regra #45: formato DD-MM-YYYY) --- ## Anti-Patterns -- **NUNCA** executar checkup sem verificar data/hora -- **NUNCA** duplicar logica de outras skills -- **NUNCA** mostrar mais de 3 prioridades (PHDA) -- **NUNCA** mostrar resumo ANTES de processar despesas e SPAM -- **NUNCA** perguntar ao utilizador se deve processar despesas (e automatico) -- **NUNCA** assumir que so dept 3 tem tickets de contabilidade (verificar email do remetente) -- **NUNCA** saltar receipt que contem invoice number e valor (e despesa) +- NUNCA mostrar output antes de terminar Fase 1 e 2 +- NUNCA mostrar mais de 3 prioridades (PHDA) +- NUNCA duplicar logica que ja existe nas sub-skills +- NUNCA executar sem verificar data/hora primeiro +- SEMPRE agregar resultados de TODAS as sub-skills antes de mostrar --- -## Changelog +## Sub-Skills Referencia -### v8.3.1 (2026-02-24) -- **PLATAFORMAS MULTI-FORNECEDOR:** Novo protocolo para plataformas que entregam faturas de qualquer empresa (TOConline, Stripe, PayPal, FastSpring, PayPro Global) -- **TOConline adicionado (#25):** Ler email para identificar emitente real. CUBIC CHOICES LDA → cat 21. Desconhecido → flag priority -- **Regra:** NUNCA mapear plataforma multi-fornecedor para categoria fixa sem ler o emitente real - -### v8.3.0 (2026-02-14) -- **WORKFLOWS SUGERIDOS:** Analisa tarefas prioritárias e sugere workflows/componentes relevantes -- **INTEGRAÇÃO QUICK-START:** Consulta `/media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/WORKFLOWS-QUICK-START.md` -- **10 PADRÕES:** WordPress, procedimentos, audit, orçamento, lead, SEO, deploy, marketing, PHP, design -- **OUTPUT CONTEXTUAL:** Sugere skill ou agent apropriado com duração estimada -- **DISCOVERY FIX:** Resolve problema de não saber qual componente usar para cada tarefa - -### v8.2.0 (2026-02-12) -- **AUDITORIA DESPESAS Sab/Dom:** Verifica despesas sem PDF, categorias em falta, valores anomalos -- **SABADO completo:** Sem PDF (60d), sem categoria, >500 EUR, reconciliacao mensal (1o sabado), fornecedores recorrentes em falta -- **DOMINGO resumido:** Apenas sem PDF (30d), alerta se >3 -- **CORRECCAO CURRENCY:** EUR = **3** (nao 2), USD = **2**. Corrigido em toda a skill -- **CATEGORIAS ALINHADAS:** 24 fornecedores com categorias corrigidas (consolidacao 12-02-2026) - - Hetzner: 10→4, Canva: 9→28, ElasticEmail: 5→30, Cursor: 38→28, GitHub: 38→28 - - Make/Gamma: 12/28→6, Google One: 38→30, Namecheap: 13→37, BdThemes: 9→14 -- **send_invoice_to_customer:** Documentado como campo obrigatorio (valor 0) -- **2 fornecedores adicionados:** YouTube Premium (#23), PTisp (#24) - -### v8.1.0 (2026-02-12) -- **DEDUPLICAÇÃO IMAP via Supabase:** Tabela `imap_processed_emails` como fonte de verdade -- **Passo 0:** Carrega message_ids já processados antes de iterar contas -- **Passo Final:** Batch INSERT de todos os emails processados com ON CONFLICT DO NOTHING -- **2 camadas anti-duplicados:** Supabase (message_id exacto) + Desk CRM (fornecedor+valor+data) -- **Sem pasta "Processed":** Emails permanecem na INBOX, tracking 100% via Supabase -- **Actions tipadas:** spam_deleted, expense_created, duplicate, priority_flagged, etc. -- **Acesso:** SSH → EasyPanel → docker exec psql (2 chamadas por checkup) - -### v8.0.0 (2026-02-12) -- **AUTO-DESPESAS IMAP:** Processamento completo de facturas/recibos detectados no IMAP -- **PDF ANEXO:** Extrai PDF do email, faz upload ao servidor, regista em tblfiles -- **22 FORNECEDORES:** Mapeamento completo com conta IMAP, categoria, tax, moeda -- **ANTI-DUPLICADOS:** Verificacao antes de criar (fornecedor + valor + data ±3d) -- **USD→EUR:** Conversao automatica taxa 0.92 -- **IMAP→DESK:** Ciclo completo: detectar → ler → extrair → criar despesa → anexar PDF → arquivar email - -### v7.7.0 (2026-02-10) -- **ESTRUTURA CHECKUP:** Questoes urgentes NO TOPO (Requer Atencao → Prioridades → Resumo) -- **FORMATO DATA:** DD-MM-YYYY obrigatorio (ex: 10-02-2026-checkup.md) -- **UX PHDA:** Informacao mais importante primeiro, micro-passos visiveis - -### v7.6.0 (2026-02-10) -- **MCP HEALTH CHECK:** Verificação completa aos sábados, resumida aos domingos -- **SABADO:** Health check de 9 MCPs críticos com troubleshooting automático -- **DOMINGO:** Verificação rápida top 5 MCPs com alertas se falha crítica -- **PROTOCOLO:** Testes automáticos, verificação credenciais, output estruturado - -### v7.5.0 (2026-02-06) -- **IMAP TRIAGEM:** Protocolo completo para 13 contas IMAP (spam, promo, facturas, prioritarios) -- **NOTA OBSIDIAN:** Criar nota diaria em /media/ealmeida/Dados/Hub/00-Inbox/ -- **SUPABASE SAVE:** Guardar resumo checkup em memory-supabase com metricas -- **LEADS + PROPOSTAS:** Adicionar verificacao de leads novos e propostas pendentes na Fase 2 -- **SEXTA-FEIRA:** Rotina de manutencao WordPress sugerida as sextas -- **VERIFICAR EXECUCAO:** Passo 2 verifica ultima execucao via memory-supabase -- **EXCEPCOES IMAP:** Dominos gov.pt, at.gov.pt, tribunais nunca processados automaticamente -- **BUG FIX:** Corrigido MCP IMAP (seq.fetch→fetch para operacoes UID-based) - -### v7.4.0 (2026-02-06) -- Protocolo 3 fases, scan todos departamentos, HTML fonte dados, mapeamento expandido - -### v7.3.0 (2026-02-05) -- Notificacoes de sistema protegidas - -### v7.2.0 (2026-02-05) -- Auto-despesas contabilidade (dept 3) - -### v7.1.0 (2026-02-05) -- Integracao com skills Desk +| Skill | Plugin | Responsabilidade | +|-------|--------|-----------------| +| `/ticket-triage` | crm-ops | Auto-process tickets (SPAM, facturas, notificacoes) | +| `/imap-triage` | gestao | Triagem IMAP 14 contas + dedup Supabase | +| `/auto-expense` | crm-ops | Criacao automatica de despesas | +| `/daily-digest` | gestao | Timer, tickets, facturas, leads, agenda | +| `/tasks-overview` | gestao | Tarefas pendentes/overdue + workflows | +| `/infra-check` | infraestrutura | MCP Health Check + auditoria despesas | +| `/cleanup-downloads` | gestao | Limpeza pasta Transferencias | +| `/wp-update` | wordpress | Actualizacoes WordPress (segundas) | +| `/spec` + `/sprint` | project-manager | Specs e sprints activos (leitura directa) | --- -*Skill v8.3.1 | 2026-02-24 | Descomplicar®* +*Skill v9.1.0 | 04-03-2026 | Descomplicar®* diff --git a/gestao/skills/today/config/email-triage-rules.md b/gestao/skills/today/config/email-triage-rules.md index ab329b3..f7bddf1 100644 --- a/gestao/skills/today/config/email-triage-rules.md +++ b/gestao/skills/today/config/email-triage-rules.md @@ -59,9 +59,17 @@ accounts: --- -## Regra 2: PROMOCIONAIS (Arquivar) +## Regra 2: PROMOCIONAIS (Arquivar ou Eliminar) -**Acção**: `imap_move_email` → pasta "Promotions" +**Acção padrão**: `imap_move_email` → pasta "Promotions" + +**Excepções por conta:** +```yaml +delete_promotions: + - rh # Não tem pasta Promotions - apagar directamente +``` + +> Contas listadas em `delete_promotions`: usar `imap_delete_email` em vez de mover. ### Padrões Subject ``` diff --git a/gestao/skills/today/prompts/execute.md b/gestao/skills/today/prompts/execute.md index 9293e8c..15cf3d9 100644 --- a/gestao/skills/today/prompts/execute.md +++ b/gestao/skills/today/prompts/execute.md @@ -1,405 +1,43 @@ -# /today - Checkup Diário +# /today - Checkup Diario (Orquestrador) -Executa o checkup diário completo seguindo estes passos: +Executa o checkup diario invocando sub-skills em sequencia. -## Passo 1: Verificar Última Execução +## Passo 1: Verificar data e ultima execucao ``` -Usar mcp__memory-supabase__search_memories com query "today checkup YYYY-MM-DD" -Se já existe entrada de hoje → perguntar se quer executar novamente +mcp__mcp-time__current_time +mcp__memory-supabase__search_memories("today checkup YYYY-MM-DD") +Se ja existe → perguntar se quer re-executar ``` -## Passo 2: Recolher Dados do DeskCRM +## Passo 2: Fase 1 - Auto-processamento (silencioso) -### 2.1 Tickets -``` -mcp__desk-crm-v3__get_tickets: -- date_from: ontem (YYYY-MM-DD) -- status: 1 (Aberto) ou 2 (Em Progresso) -- limit: 50 +Invocar em sequencia: +1. `/ticket-triage` → processa tickets abertos +2. `/imap-triage` → processa emails IMAP +3. `/auto-expense` → cria despesas dos resultados anteriores +4. `/cleanup-downloads` → se >10 ficheiros em Transferencias -Identificar: -- Tickets urgentes (priority: 3 ou 4) -- Tickets de clientes importantes -``` +## Passo 3: Fase 2 - Recolha de dados (silencioso) -### 2.2 Tickets SPAM → FECHAR AUTOMATICAMENTE -``` -⚡ ACÇÃO AUTOMÁTICA - Fechar SEM intervenção manual +Invocar: +1. `/daily-digest` → metricas do dia +2. `/tasks-overview` → tarefas e workflows -Padrões de SPAM: -- "Guest Post", "SEO services", "backlinks", "partnership" -- "link building", "dofollow", "collaboration opportunity" -- "Boas Festas", "Season's Greetings", "Termos de Serviço" -- Remetentes: noreply@*, no-reply@* (se não for serviço conhecido) +## Passo 3b: Sprint/Spec Activos (silencioso) -Se SPAM detectado → FECHAR IMEDIATAMENTE: - mcp__desk-crm-v3__close_ticket: - - ticket_id: {ID} - - message: "Fechado automaticamente - SPAM" +Glob SPEC.md e SPRINT.md em /media/ealmeida/Dados/Dev/. +Ler apenas frontmatter. Filtrar activos. Guardar em ~/.claude-work/today-sprint-{date}.json. -Registar no relatório: "🗑️ SPAM fechado: #{ID} - {Assunto}" -``` +## Passo 4: Rotinas especiais -### 2.3 Tickets para ELIMINAR (notificações sem valor) -``` -Verificar se assunto contém: -- "Your Elastic Email Account was successfully re-charged" -- "Account re-charged" -- "Auto-recharge successful" -- "Credit added to your account" -- "[BOT] Ativação realizada com sucesso" -- "[BOT] Activation successful" +- Segunda: planeamento semanal + `/wp-update` +- Sexta: sugerir manutencao WordPress +- Sabado/Domingo: `/infra-check` -Se SIM → Eliminar: - mcp__desk-crm-v3__delete_ticket: - - ticket_id: {ID} - - confirm: true - - reason: "Notificação automática sem valor contabilístico" -``` +## Passo 5: Dashboard final -### 2.3 Processamento Automático: Tickets de PAGAMENTOS -``` -Para cada ticket aberto, verificar se assunto contém: -- "payment", "pagamento", "pago", "paid" -- "invoice", "factura", "fatura", "recibo" -- "successfully processed", "confirmado" -- "subscription", "renewed", "renewal" -- "account funded", "has been funded" -- "Envio de Fatura Eletrónica" - -Se SIM → Verificar remetente: - - A) Remetente CONHECIDO (lista abaixo): - ⚡ ACÇÃO AUTOMÁTICA - Executar SEM intervenção manual: - 1. Mover para Contabilidade: - mcp__desk-crm-v3__update_ticket({ ticket_id: ID, department_id: 3 }) - 2. FECHAR o ticket: - mcp__desk-crm-v3__close_ticket({ ticket_id: ID, message: "Fatura processada - Contabilidade" }) - 3. Registar: "💰 Contabilidade + Fechado: #{ID} - {Assunto}" - - B) Remetente DESCONHECIDO: - → Avaliar indicadores de spam/phishing - → LISTAR no relatório para revisão manual - - Indicadores de SPAM: - - Remetente pessoal (gmail/hotmail) + factura empresarial - - Erros ortográficos, MAIÚSCULAS, urgência exagerada - - Domínio suspeito (muitos números, extensões estranhas) - - Sem número de factura/referência - - Output no relatório: - - [SPAM?] #ID - Assunto - remetente@suspeito.com - - [NOVO?] #ID - Assunto - remetente@empresa.com (possível novo serviço) -``` - -> [!warning] NUNCA eliminar automaticamente remetentes desconhecidos -> Podem ser novos serviços. Sempre pedir confirmação manual. - -**Remetentes CONHECIDOS (whitelist):** -``` -Domínios confiáveis: -- @elasticemail.com -- @hetzner.com, @hetzner.de -- @centos-webpanel.com, @control-webpanel.com -- @canva.com -- @meo.pt, @altice.pt, @documentos.meoempresas.pt -- @cloudflare.com -- @github.com -- @google.com -- @microsoft.com -- @adobe.com -- @figma.com -- @notion.so -- @openai.com, @email.openai.com -- @anthropic.com -- @openrouter.zendesk.com -- @stripe.com -- @paypal.com -- @wise.com -- @revolut.com -- @bancobpi.pt -``` - -Ver lista completa de remetentes e indicadores: `config/email-triage-rules.md` - -### 2.2 Projectos com Deadline -``` -mcp__desk-crm-v3__get_projects: -- status: 2 (Em Progresso) -- Filtrar: deadline esta semana -``` - -### 2.3 Tarefas Pendentes (OBRIGATÓRIO - sempre incluir) -``` -# Buscar TODAS as tarefas pendentes -mcp__desk-crm-v3__get_tasks({ status: 1, limit: 50 }) # Não iniciadas -mcp__desk-crm-v3__get_tasks({ status: 4, limit: 50 }) # Em curso -mcp__desk-crm-v3__get_tasks({ status: 2, limit: 50 }) # Aguarda feedback -mcp__desk-crm-v3__get_tasks({ overdue_only: true }) # Vencidas - -# Organizar por: -# 1. Prioridade (4=Urgente, 3=Alta, 2=Normal, 1=Baixa) -# 2. Deadline (vencidas primeiro) -# 3. Projecto (agrupar) - -# Formato output: -### 🔴 URGENTES (Prioridade 4) -| ID | Tarefa | Projecto | Deadline | Tempo Est. | -|----|--------|----------|----------|------------| - -### 🟠 ALTA (Prioridade 3) -... -``` - -### 2.4 Verificar Estimativas de Tempo -``` -Para cada tarefa importante, verificar se tem estimativa: -mcp__desk-crm-v3__get_task_time_estimates({ task_id: X }) - -Se não tem → sugerir definir: -mcp__desk-crm-v3__set_task_estimated_time({ - task_id: X, - estimated_hours: Y, - estimated_minutes: Z, - notes: "Estimativa" -}) -``` - -## Passo 3: Gestão de Emails (MCP IMAP) - -### 3.1 Listar contas disponíveis -``` -imap_list_accounts -# Verificar que todas as 12 contas estão acessíveis -``` - -### 3.2 Para CADA conta, processar emails -``` -Contas: emanuel, it, help, suporte, contabilidade, financeiro, - info, rh, mkt, design, news, aiktop - -Para cada conta: - 1. imap_list_emails(account, folder="INBOX", limit=50) - 2. Classificar cada email: - - SPAM (eliminar): - - Subject contém: "lottery", "winner", "urgent money" - - Remetente em blacklist conhecida - - Caracteres estranhos no subject - → imap_delete_email(account, uid) - - PROMOCIONAL (arquivar): - - Subject contém: "newsletter", "promo", "desconto", "oferta" - - Remetente: *@marketing.*, *@news.*, *@promo.* - - Headers: List-Unsubscribe presente - → imap_move_email(account, uid, "Promotions") - - FACTURA PAGA (reencaminhar): - - Subject contém: "factura", "invoice", "recibo", "pagamento" - - Subject contém: "pago", "paid", "confirmado" - - Anexos PDF com padrão de factura - → Registar para reencaminhar para contabilidade@descomplicar.pt - - PRIORITÁRIO (listar): - - Remetente: cliente conhecido (verificar DeskCRM) - - Subject contém: "urgente", "urgent", "problema", "erro" - - Resposta a thread existente - → Incluir no relatório diário -``` - -### 3.3 Resumo de acções -``` -Contabilizar: -- X emails eliminados (spam) -- Y emails arquivados (promocionais) -- Z facturas para contabilidade -- W emails prioritários pendentes -``` - -## Passo 4: Calendário (opcional) - -``` -# Se MCP Google Calendar disponível: -# google_calendar_list_events(date=today) -# Por agora: Verificar agenda manualmente -``` - -## Passo 5: Gerar Relatório - -Formatar output seguindo template: - -```markdown -## 📅 Checkup Diário - YYYY-MM-DD (Dia da Semana) - -### 🎫 Tickets (X abertos, Y urgentes) -[Lista de tickets urgentes com [!]] -[Lista de tickets abertos] - -### 📧 Emails Prioritários -[Quando disponível] - -### 📆 Agenda de Hoje -[Quando disponível] - -### 🎯 Prioridades Sugeridas -1. [Baseado em urgência e deadlines] -2. [...] -3. [...] - -### ⏰ Deadlines Esta Semana -[Lista de projectos/tarefas com deadline] -``` - -## Passo 6: SEGUNDA-FEIRA - Planeamento Semanal - -``` -Verificar dia da semana -Se SEGUNDA-FEIRA: - - 1. RECOLHER TAREFAS DA SEMANA INTEIRA - - Todas as tarefas pendentes (status 1, 2, 4) - - Todas as tarefas vencidas - - Filtrar: deadline até domingo - - Incluir estimativas de tempo - - 2. RECOLHER CALENDÁRIO DA SEMANA - mcp__google-workspace__get_events({ - user_google_email: "emanuelalmeidaa@gmail.com", - time_min: "YYYY-MM-DD" (hoje), - time_max: "YYYY-MM-DD" (domingo), - max_results: 50 - }) - - 3. VERIFICAR ESTIMATIVAS DE TEMPO - Para tarefas sem estimativa: - - Sugerir tempo baseado no tipo - - PERGUNTAR ao utilizador se correcto - - Definir via set_task_estimated_time - - 4. PEDIR INDICAÇÕES AO UTILIZADOR - Usar AskUserQuestion: - - Disponibilidade semanal (horas) - - Horários preferidos para foco - - Prioridades especiais - - Compromissos pessoais - - Tarefas para delegar - - 5. DISTRIBUIR TAREFAS PELA AGENDA - - Calcular capacidade vs carga - - Distribuir por dia/horário - - Criar eventos no calendário (opcional) - - Alertar se capacidade excedida - - 6. OUTPUT: Planeamento Semanal - - Tabela por dia com tarefas - - Total horas por dia - - Alertas de capacidade - - Lista de delegações -``` - -## Passo 7: Manutenção WordPress (se Sexta-feira) - -``` -Verificar dia da semana -Se sexta-feira: - - Listar os 10 sites da rede - - Sugerir executar manutenção - - Oferecer checkup de segurança -``` - -## Passo 8: Resumo de Pendentes (do CRM) - -``` -📊 RESUMO - Mostrar no relatório - -Os pendentes são obtidos directamente do Desk CRM (já recolhidos no Passo 2). -NÃO há documento PENDENTES separado - os dados ficam no relatório diário. - -### CATEGORIZAÇÃO - -Com base nos dados já recolhidos: -- 🔴 Urgentes: priority = 4 -- 🟠 Alta Prioridade: priority = 3 -- 🟡 Vencidas: overdue_only = true -- 🟢 Esta Semana: deadline dentro de 7 dias -- 🎫 Tickets: status 1, 2 -- 👤 Leads: status 7, 14 (Novos) -- 📝 Propostas: status 4 (Para Fazer) - -### FORMATO NO RELATÓRIO - -| Categoria | Qtd | -|----|----:| -| 🔴 Urgentes | X | -| 🟠 Alta Prioridade | X | -| 🟡 Vencidas | X | -| 🎫 Tickets Abertos | X | -| 👤 Leads Novos | X | - -### LINKS CRM - -| Tipo | Formato Link | -|------|--------------| -| Tarefa | [#ID](https://desk.descomplicar.pt/admin/tasks/view/ID) | -| Ticket | [#ID](https://desk.descomplicar.pt/admin/tickets/ticket/ID) | -| Lead | [LID](https://desk.descomplicar.pt/admin/leads/index/ID) | -``` - -## Passo 9: Criar Nota Diária no Obsidian - -``` -Criar ficheiro no vault Planeamento: -- Path: /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/00-Inbox/ -- Filename: YYYY-MM-DD-checkup.md -- Content: Relatório com dados recolhidos - -Template: ---- -title: Checkup YYYY-MM-DD -date: YYYY-MM-DD -type: checkup -status: active ---- - -## Checkup Diário - YYYY-MM-DD - -[Conteúdo do relatório] - -⚡ LINKS CRM: Todas as tarefas com link directo -- Formato: [#ID](https://desk.descomplicar.pt/admin/tasks/view/ID) - -Se segunda-feira: -- Incluir secção "Planeamento Semanal" -- Tabela com distribuição de tarefas por dia -``` - -## Passo 10: Guardar em Supabase - -``` -mcp__memory-supabase__save_memory: -- content: "Checkup diário executado - X tickets, Y tarefas, Z urgentes" -- tags: ["today", "checkup", "YYYY-MM-DD"] -- summary: "Checkup diário YYYY-MM-DD" -- metadata: { - tickets_count: X, - tasks_count: Y, - urgent_count: Z, - is_monday: true/false, - weekly_hours_planned: H - } -``` - -## Passo 11: Resumo Final - -Apresentar: -- Métricas do dia -- Top 3 prioridades recomendadas -- Alertas importantes -- Próximos passos sugeridos - -Se segunda-feira, adicionar: -- Resumo do planeamento semanal -- Capacidade vs carga -- Tarefas delegadas -- Alertas de sobrecarga +Agregar resultados de todas as sub-skills. +Criar nota Obsidian em `00-Inbox/DD-MM-YYYY-checkup.md`. +Guardar em Supabase. +Limpar temporarios `~/.claude-work/today-*.json`. diff --git a/gestao/skills/today/templates/daily-report.md b/gestao/skills/today/templates/daily-report.md index b062c7d..cf51432 100644 --- a/gestao/skills/today/templates/daily-report.md +++ b/gestao/skills/today/templates/daily-report.md @@ -120,6 +120,19 @@ aliases: ["{{DATE}}"] --- +## Sprint / Spec Activos + +| Projecto | Spec | Sprint | Progresso | Checkpoint | +|----------|------|--------|-----------|------------| +{{#ACTIVE_SPECS}} +| {{PROJECT}} | {{SPEC_STATUS}} | {{SPRINT_ID}} | {{TASKS_DONE}}/{{TASKS_TOTAL}} tasks | {{CHECKPOINT}} | +{{/ACTIVE_SPECS}} +{{^ACTIVE_SPECS}} +| — | Nenhum sprint/spec activo | — | — | — | +{{/ACTIVE_SPECS}} + +--- + ## 📝 Notas do Dia > [!note] Observações diff --git a/gestao/skills/validate-component/SKILL.md b/gestao/skills/validate-component/SKILL.md new file mode 100644 index 0000000..a990650 --- /dev/null +++ b/gestao/skills/validate-component/SKILL.md @@ -0,0 +1,365 @@ +--- +name: validate-component +description: Valida skills/agents para alinhamento com procedimentos Hub. Use quando "validar skill", "verificar agent", "audit component", "check procedure compliance", antes de deploy de nova skill/agent. Verifica se componente referencia procedimentos (não duplica), segue padrão de referenciação. +--- + +# /validate-component - Validador de Componentes + +Audita skills e agents para garantir alinhamento com padrão de centralização de procedimentos Hub. + +--- + +## Referências e Documentação + +**SEMPRE consultar:** +- **[Hub CLAUDE.md](file:///media/ealmeida/Dados/Hub/CLAUDE.md)** - Secção "Organização de Procedimentos" (padrão referenciação) +- **[/mcp-dev skill](file:///home/ealmeida/.claude/plugins/marketplaces/descomplicar-plugins/infraestrutura/skills/mcp-dev/SKILL.md)** - Exemplo padrão ouro de referenciação + +--- + +## O Que Valida + +### 1. Procedimentos Embeddados (RED FLAG) + +**Detecta conteúdo que deve estar em PROC-*:** +- ✗ Checklists extensas (>10 itens) +- ✗ Regras de validação detalhadas +- ✗ Troubleshooting guides completos +- ✗ Standards e convenções +- ✗ Best practices longas +- ✗ Workflows complexos passo-a-passo + +### 2. Referenciação Correcta (GREEN FLAG) + +**Verifica se componente referencia procedimentos:** +- ✓ Secção "Referências e Documentação" +- ✓ Links file:// para PROCs relevantes +- ✓ Descrição breve do que cada PROC cobre +- ✓ Instrução "SEMPRE consultar antes de..." + +### 3. Separação Clara + +**O que DEVE ficar no componente:** +- ✓ Comandos e templates +- ✓ Instruções operacionais curtas +- ✓ Decisão "quando usar" +- ✓ Exemplos práticos inline + +**O que DEVE ir para PROC:** +- ✗ Regras e standards +- ✗ Checklists de validação +- ✗ Troubleshooting detalhado +- ✗ Melhores práticas extensas + +--- + +## Protocolo de Validação + +### Para Skills + +``` +1. LER skill SKILL.md completo + +2. VERIFICAR secção "Referências e Documentação": + - Existe? (GREEN se sim, sugerir criar se não) + - Tem links file:// para PROCs? (GREEN se sim) + - Links são relevantes para o domínio da skill? + +3. DETECTAR procedimentos embeddados: + - Procurar padrões: "Checklist", "Steps", "Validação", "Troubleshooting" + - Se >100 linhas de instruções → SUGERIR extrair para PROC + +4. AVALIAR qualidade referenciação: + - Links funcionam? (teste paths) + - Descrição do PROC é clara? + - Indica quando consultar? + +5. GERAR relatório (ver formato abaixo) +``` + +### Para Agents + +``` +1. LER agent .md completo (frontmatter + system prompt) + +2. VERIFICAR system prompt tem secção "Referências": + - Existe? (GREEN se sim) + - Tem links file:// para PROCs relevantes? + +3. DETECTAR procedimentos embeddados no system prompt: + - Padrões similares a skills + - Workflows >50 linhas no prompt + +4. AVALIAR se agent conhece procedimentos do seu domínio: + - wordpress-plugin-developer → deve referenciar PROC-WordPress-* + - mcp-protocol-developer → deve referenciar PROC-MCP-* + +5. GERAR relatório +``` + +--- + +## Formato Relatório + +```markdown +# Relatório Validação: [nome-componente] + +**Tipo:** Skill | Agent +**Path:** [caminho completo] +**Data:** YYYY-MM-DD HH:MM + +--- + +## Status Geral + +**Score:** X/10 +- ✅ 8-10: Excelente (nada a fazer) +- ⚠️ 5-7: Atenção (melhorias sugeridas) +- ❌ 0-4: Crítico (refactoring necessário) + +--- + +## Checklist Validação + +### Referenciação (Peso: 40%) +- [ ] Secção "Referências e Documentação" existe +- [ ] Links file:// para PROCs relevantes +- [ ] Descrição clara do que cada PROC cobre +- [ ] Instrução "SEMPRE consultar antes de..." + +### Separação Conteúdo (Peso: 40%) +- [ ] Sem checklists longas (>10 itens) embeddadas +- [ ] Sem troubleshooting extenso embeddado +- [ ] Sem standards/conventions detalhadas embeddadas +- [ ] Sem workflows complexos embeddados + +### Qualidade (Peso: 20%) +- [ ] Links file:// funcionam (paths válidos) +- [ ] Referencia PROCs do departamento correcto +- [ ] Instruções operacionais concisas (<50 linhas) + +--- + +## Issues Detectadas + +### 🔴 Críticas (Bloqueia Deploy) + +1. **[Tipo Issue]** + - **Localização:** Linha X-Y + - **Problema:** Descrição + - **Impacto:** Duplicação procedimento / Info embeddada + - **Acção:** Extrair para PROC-[Nome].md em [Departamento]/ + +### ⚠️ Avisos (Recomendado Corrigir) + +1. **[Tipo Issue]** + - **Localização:** Secção X + - **Problema:** Descrição + - **Sugestão:** Adicionar referência a PROC-[Nome].md + +### ✅ Boas Práticas Observadas + +1. Secção "Referências" bem estruturada +2. Links file:// correctos +3. Separação clara comando vs regra + +--- + +## Recomendações + +### Imediatas (P1) +1. Extrair checklist linhas X-Y para PROC-[Nome].md +2. Adicionar link file:// para PROC-[Outro].md + +### Melhorias (P2) +1. Expandir descrição PROC na referência +2. Adicionar exemplo uso combinado skill + PROC + +### Opcional (P3) +1. Considerar criar PROC-[NovoTema].md para conteúdo Y + +--- + +## Procedimentos Relevantes Existentes + +| PROC | Departamento | Relevância | Status Link | +|------|--------------|------------|-------------| +| PROC-MCP-Desenvolvimento.md | D7 | Alta | ✅ Referenciado | +| PROC-WordPress-Hardening.md | D7 | Média | ❌ Não referenciado | + +--- + +## Próximos Passos + +1. [ ] Corrigir issues críticas (se houver) +2. [ ] Aplicar recomendações P1 +3. [ ] Re-validar com /validate-component +4. [ ] Deploy quando score ≥7/10 +``` + +--- + +## Exemplos de Uso + +### Exemplo 1: Skill com Boa Referenciação + +``` +User: /validate-component /mcp-dev +Assistant: + +# Relatório Validação: mcp-dev + +**Score:** 9/10 ✅ + +## Status Geral +Excelente! Padrão ouro de referenciação. + +## Issues Detectadas +Nenhuma crítica. Pequena sugestão: expandir descrição PROC-MCP-Session-Recovery.md. + +## Boas Práticas +- Secção "Referências e Documentação" completa +- 5 links file:// para PROCs relevantes +- Instruções "SEMPRE consultar antes de..." +- Separação clara: comandos na skill, regras nos PROCs +``` + +### Exemplo 2: Agent com Procedimentos Embeddados + +``` +User: /validate-component wordpress-plugin-developer +Assistant: + +# Relatório Validação: wordpress-plugin-developer + +**Score:** 4/10 ❌ + +## Issues Críticas + +1. **Checklist WordPress Security (60 linhas embeddadas)** + - Localização: Linhas 234-294 + - Problema: Checklist completa hardening no system prompt + - Acção: Extrair para PROC-WordPress-Hardening.md (D7-Tecnologia) + +2. **Sem Secção Referências** + - System prompt não referencia nenhum PROC + - Deve adicionar links para PROC-WordPress-* relevantes + +## Recomendações P1 + +1. Criar PROC-WordPress-Hardening.md com checklist +2. Criar PROC-WordPress-CLI.md com comandos WP-CLI +3. Adicionar secção "Referências" no system prompt +4. Re-validar após refactoring +``` + +### Exemplo 3: Skill Nova Antes de Deploy + +``` +User: Criei /easypanel-deploy skill. Validar antes de commit? +Assistant: /validate-component easypanel-deploy + +# Relatório Validação: easypanel-deploy + +**Score:** 6/10 ⚠️ + +## Avisos + +1. **Workflow Deploy (40 linhas)** + - Localização: Secção "Deployment Workflow" + - Problema: Workflow passo-a-passo detalhado + - Sugestão: Considerar PROC-Deployment-EasyPanel.md (D7/INF) + - Alternativa: Manter se workflow é core da skill + +2. **API Reference Embeddada** + - 80 linhas de endpoints EasyPanel + - Sugestão: Mover para references/easypanel-api.md + +## Recomendações + +Score 6/10 é aceitável para deploy. Opcionalmente: +- Extrair API reference para ficheiro separado (progressive disclosure) +- Se workflow deploy for usado por outros componentes → PROC +``` + +--- + +## Integração CI/CD + +Para validação automática antes de commit: + +```bash +# .git/hooks/pre-commit +if [[ $(git diff --cached --name-only) =~ (skills|agents) ]]; then + echo "Validating modified components..." + claude-code /validate-component [path] +fi +``` + +--- + +## Critérios de Score + +### Score 9-10 (Excelente) +- Secção "Referências" completa e bem estruturada +- Todos os PROCs relevantes referenciados +- Zero procedimentos embeddados +- Separação clara comando vs regra + +### Score 7-8 (Bom) +- Secção "Referências" existe +- Maioria dos PROCs referenciados +- Pequenos procedimentos embeddados (<20 linhas) +- Maioria do conteúdo bem separado + +### Score 5-6 (Aceitável) +- Algumas referências, mas incompletas +- Procedimentos embeddados médios (20-50 linhas) +- Separação parcial +- Deploy OK mas melhorias recomendadas + +### Score 3-4 (Crítico) +- Sem secção "Referências" ou vazia +- Procedimentos longos embeddados (>50 linhas) +- Má separação comando vs regra +- Refactoring necessário antes deploy + +### Score 0-2 (Bloqueado) +- Zero referências a PROCs +- Procedimentos extensos embeddados (>100 linhas) +- Duplicação crítica de conteúdo +- Deploy BLOQUEADO até corrigir + +--- + +## Anti-Patterns + +**NUNCA:** +- ❌ Aprovar deploy com score <5/10 +- ❌ Ignorar issues críticas +- ❌ Validar sem ler componente completo +- ❌ Sugerir extrair conteúdo que é core da skill + +**SEMPRE:** +- ✅ Testar links file:// funcionam +- ✅ Verificar departamento correcto dos PROCs +- ✅ Distinguir "core skill" vs "procedimento duplicado" +- ✅ Dar exemplos concretos de refactoring + +--- + +## Referência: /mcp-dev (Padrão Ouro) + +Ver secção "Referências e Documentação" em: +`/home/ealmeida/.claude/plugins/.../mcp-dev/SKILL.md` + +**O que faz bem:** +- Secção dedicada no topo +- 5 links file:// para PROCs D7-Tecnologia +- Descrição breve de cada PROC +- Instrução clara "SEMPRE consultar antes de criar/modificar MCPs" +- Quick Reference sintética (não duplica PROC) + +--- + +*Skill v1.0.0 | 2026-02-13 | Plugin gestao | Descomplicar®* diff --git a/gestao/skills/worklog/SKILL.md b/gestao/skills/worklog/SKILL.md index 963b689..0da3b00 100644 --- a/gestao/skills/worklog/SKILL.md +++ b/gestao/skills/worklog/SKILL.md @@ -6,7 +6,7 @@ description: > Auto-trigger >10 tool calls. Auto-alerts degradação >15%, error rate >10%. Use when "worklog", "reflect", "reflexão", "registar trabalho", "log", "análise", "melhoria", "insight", ao parar timer. author: Descomplicar® Crescimento Digital -version: 4.0.0 +version: 4.1.0 quality_score: 95 user_invocable: true category: productivity @@ -74,6 +74,12 @@ Skill unificada: regista trabalho, analisa sessão, sugere acções, guarda mem - Erros e soluções - Padrões detectados - Eficiência (tool calls vs resultado) +3b. VERIFICAR alinhamento com spec (se aplicavel): + - Detectar ficheiros modificados na sessao + - Procurar SPEC.md no directorio pai (ate 3 niveis) + - SE spec approved/in_progress: comparar ficheiros vs scope items + - SE ficheiro nao mapeia para scope: incluir SCOPE ALERT no worklog + - SE sem SPEC.md: ignorar silenciosamente 4. VERIFICAR se há algo novo a documentar - Se sessão vazia/sem dados → NÃO gerar 5. Gerar comentário HTML (ver formato abaixo) @@ -133,6 +139,11 @@ Memória: Guardada / N/A
Solução: Como foi resolvido +

Alertas de Scope

+
    +
  • SCOPE ALERT: path nao mapeado no SPEC
  • +
+

Padrões Detectados

  • Padrão identificado e impacto
  • @@ -270,7 +281,7 @@ Perguntas ao analisar sessão: - Faltou informação que deveria estar em memória? - Alguma regra CLAUDE.md foi violada? - Os MCPs funcionaram correctamente? -- Algum TaskForce foi utilizado? Registar métricas. +- **Context health:** CLAUDE.md global <200 linhas? MEMORY.md <80 linhas? (Ref: DEV-CTX-001) --- @@ -335,4 +346,4 @@ Perguntas ao analisar sessão: --- -*Skill v4.0.0 | 2026-02-06 | Descomplicar(R)* +*Skill v4.1.0 | 2026-03-04 | Descomplicar(R)* diff --git a/hello-plugin/.claude-plugin/plugin.json b/hello-plugin/.claude-plugin/plugin.json deleted file mode 100644 index f509363..0000000 --- a/hello-plugin/.claude-plugin/plugin.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "hello-plugin", - "description": "Plugin de exemplo para Claude Code. Demonstra skills, agents e hooks num formato minimo e didactico.", - "version": "1.0.0", - "author": { - "name": "Emanuel Almeida", - "url": "https://descomplicar.pt" - }, - "homepage": "https://git.descomplicar.pt/ealmeida/hello-plugin", - "repository": "https://git.descomplicar.pt/ealmeida/hello-plugin.git", - "license": "MIT", - "keywords": ["example", "tutorial", "hello-world"], - "skills": "./" -} diff --git a/hello-plugin/agents/SKILL.md b/hello-plugin/agents/SKILL.md deleted file mode 100644 index 253edb3..0000000 --- a/hello-plugin/agents/SKILL.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -name: explorer -description: > - Agente de exemplo que explora a estrutura de um directorio e resume o que encontra. - Use when user mentions "explorar directorio", "listar estrutura", "what's in this folder". - - Examples: - - "Explora a pasta src/" - - "O que tem neste directorio?" - - "Mostra a estrutura do projecto" ---- - -# Explorer Agent - -Es um agente simples que explora a estrutura de um directorio. - -## Comportamento - -1. Usa Glob para encontrar ficheiros no directorio indicado -2. Agrupa por tipo de ficheiro (extensao) -3. Conta ficheiros por categoria -4. Resume num formato limpo - -## Output esperado - -``` -Directorio: /caminho/indicado/ -Total: X ficheiros - -Por tipo: - .js - 12 ficheiros - .md - 5 ficheiros - .json - 3 ficheiros - -Ficheiros principais: - - package.json - - README.md - - index.js -``` - -Se conciso. Portugues europeu. diff --git a/hello-plugin/hooks/log-tools.sh b/hello-plugin/hooks/log-tools.sh deleted file mode 100644 index c588972..0000000 --- a/hello-plugin/hooks/log-tools.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -# Hook PreToolUse - Regista cada ferramenta utilizada num log -# -# Este hook demonstra como interceptar chamadas de ferramentas. -# Recebe JSON via stdin com informacao sobre a ferramenta. -# Escreve log para ficheiro e permite a execucao continuar. - -INPUT=$(cat) - -# Extrair nome da ferramenta do JSON -TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // "unknown"' 2>/dev/null) - -# Registar no log (append) -LOG_FILE="${HOME}/.claude/hello-plugin-tools.log" -echo "$(date '+%Y-%m-%d %H:%M:%S') | tool: ${TOOL_NAME}" >> "$LOG_FILE" - -# Nao bloquear - deixar continuar -exit 0 diff --git a/hello-plugin/skills/SKILL.md b/hello-plugin/skills/SKILL.md deleted file mode 100644 index cc984ab..0000000 --- a/hello-plugin/skills/SKILL.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -name: hello -description: > - Skill de exemplo que demonstra a estrutura base. - Use when user mentions "hello plugin", "exemplo plugin", "testar plugin". ---- - -# Hello Plugin - Skill de Exemplo - -Este e um skill de demonstracao do sistema de plugins Claude Code. - -## O que este skill faz - -Quando invocado, mostra informacao sobre o plugin e confirma que esta a funcionar. - -## Instrucoes - -Responde ao utilizador com: - -1. Confirmacao de que o plugin esta instalado e a funcionar -2. Lista dos componentes disponiveis neste plugin: - - **Skill hello**: Este proprio skill - - **Agent explorer**: Agente que explora ficheiros de um directorio - - **Hook log-tools**: Hook que regista ferramentas utilizadas -3. Versao do plugin: 1.0.0 - -Usa sempre portugues europeu. Se conciso e directo. diff --git a/infraestrutura/.claude-plugin/plugin.json b/infraestrutura/.claude-plugin/plugin.json index a19b952..b5eafe9 100644 --- a/infraestrutura/.claude-plugin/plugin.json +++ b/infraestrutura/.claude-plugin/plugin.json @@ -1,12 +1,25 @@ { "name": "infraestrutura", - "description": "Server management, CWP administration, EasyPanel deployments, security audits, backups and MCP development. Backed by 4 Dify KB datasets.", - "version": "1.0.0", + "description": "Server management, Proxmox VE/PBS/Clustering, CWP administration, EasyPanel deployments, security audits, backups and MCP development. Backed by 4 Dify KB datasets + NotebookLM Proxmox (150+ sources).", + "version": "1.2.0", "author": { "name": "Descomplicar - Crescimento Digital", "url": "https://descomplicar.pt" }, "homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins", "license": "MIT", - "keywords": ["servidor", "cwp", "easypanel", "seguranca", "backup", "infraestrutura"] + "keywords": [ + "servidor", + "proxmox", + "pve", + "pbs", + "clustering", + "ha", + "cwp", + "easypanel", + "seguranca", + "backup", + "infraestrutura", + "virtualizacao" + ] } diff --git a/infraestrutura/agents/backup-specialist.md b/infraestrutura/agents/backup-specialist.md index cbd2ce7..9e52568 100644 --- a/infraestrutura/agents/backup-specialist.md +++ b/infraestrutura/agents/backup-specialist.md @@ -5,6 +5,15 @@ role: Especialista em protecção de dados e disaster recovery domain: Infra model: sonnet tools: Read, Write, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - ssh-unified + - desk-crm-v3 + - filesystem +recommended_mcps: + - memory-supabase + - google-workspace skills: - _core - backup-strategies @@ -150,7 +159,15 @@ Você é um especialista em backup e continuidade de negócio responsável por: 7. Gerar relatório com recomendações ``` -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"backup disaster recovery RTO RPO" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"backup disaster recovery RTO RPO" diff --git a/infraestrutura/agents/cwp-server-manager.md b/infraestrutura/agents/cwp-server-manager.md index c79e6c7..8cdee69 100644 --- a/infraestrutura/agents/cwp-server-manager.md +++ b/infraestrutura/agents/cwp-server-manager.md @@ -5,6 +5,15 @@ role: Especialista em infraestrutura de servidores CWP domain: Infra model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - ssh-unified + - desk-crm-v3 + - cwp +recommended_mcps: + - filesystem + - memory-supabase skills: - _core - cwp-ssl @@ -25,9 +34,9 @@ tags: - cwp - hosting - infra -version: "2.0" +version: "2.1" status: active -quality_score: 70 +quality_score: 72 compliance: sacred_rules: true excellence_standards: true @@ -59,14 +68,40 @@ Especialista em infraestrutura de servidores CWP, entregando ambientes de hostin - Security hardening: firewall, malware protection, access control - Backup automatizado e disaster recovery -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### Manuais Hub (Primario - consultar PRIMEIRO) + +**Path:** `Hub/06-Operacoes/Documentacao/Manuais/CWP/` + +| Manual | Conteudo | Tamanho | +|--------|----------|---------| +| `CWP-Manual-Completo.md` | Admin Guide (148 pags) + Wiki (198 artigos) | 503KB | +| `CWP-Guia-do-Utilizador.md` | Painel do utilizador final (55 pags) | 72KB | +| `CWP-Ferramentas-Desenvolvimento.md` | API, modulos custom, temas (60 pags) | 82KB | +| `CWP-Guia-do-Revendedor.md` | Gestao de reseller (17 pags) | 17KB | + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**Como usar:** Ler seccao relevante do manual antes de executar comandos. Usar QR-CWP.md para localizar rapidamente a seccao correcta. + +### NotebookLM (Secundario - pesquisa AI sobre manuais) ``` -mcp__dify-kb__dify_kb_retrieve_segments dataset:"CWP Centos Web Panel" query:"hosting administracao" -mcp__dify-kb__dify_kb_retrieve_segments dataset:"Linux" query:"servidor seguranca" -mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"infraestrutura performance" +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"" ``` +Exemplos de queries: +- `query:"ssl certificado renovacao autossl"` - SSL/Certificados +- `query:"conta utilizador criar suspender"` - Gestao de contas +- `query:"apache nginx webserver rebuild"` - WebServers +- `query:"backup restore google drive"` - Backups +- `query:"csf firewall seguranca bloqueio"` - Seguranca +- `query:"email dkim spf postfix"` - Email +- `query:"php versao selector fpm"` - PHP +- `query:"api manager endpoints"` - API CWP +- `query:"reseller pacotes branding"` - Reseller + ## System Prompt ### Papel diff --git a/infraestrutura/agents/easypanel-specialist.md b/infraestrutura/agents/easypanel-specialist.md index 75d3680..b3fb87f 100644 --- a/infraestrutura/agents/easypanel-specialist.md +++ b/infraestrutura/agents/easypanel-specialist.md @@ -7,6 +7,15 @@ role: Especialista em gestao e otimizacao de servicos EasyPanel com foco em depl domain: Infra model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - ssh-unified + - desk-crm-v3 +recommended_mcps: + - filesystem + - gitea + - memory-supabase skills: - _core - easypanel-init @@ -48,7 +57,16 @@ Especialista em deployment de aplicacoes, orquestracao de containers e gestao de - Configuracao de bases de dados (PostgreSQL, MySQL, Redis) - Implementacao de estrategias de backup e disaster recovery -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"infrastructure deployment docker" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"infrastructure deployment docker" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Linux" query:"server containers orchestration" @@ -121,7 +139,7 @@ Especialista em deployment de aplicacoes, orquestracao de containers e gestao de ## MCPs Relevantes - `ssh-unified`: Acesso ao servidor EasyPanel - `desk-crm-v3`: Documentar deployments em projectos -- `dify-kb`: KB TI (infrastructure, docker), AWS (scaling) +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB TI (infrastructure, docker), AWS (scaling) ## Colaboracao - Reports to: Infrastructure Manager @@ -138,7 +156,8 @@ Especialista em deployment de aplicacoes, orquestracao de containers e gestao de - SSH, SFTP, servidor management - Usage: `mcp__ssh-unified__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/infraestrutura/agents/infrastructure-orchestrator.md b/infraestrutura/agents/infrastructure-orchestrator.md index a6bd237..de2a74a 100644 --- a/infraestrutura/agents/infrastructure-orchestrator.md +++ b/infraestrutura/agents/infrastructure-orchestrator.md @@ -4,6 +4,15 @@ description: > Orquestrador infraestrutura Claude Code. Diagnóstico, sync, plugins, performance. model: sonnet tools: Read, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - ssh-unified + - desk-crm-v3 + - filesystem +recommended_mcps: + - memory-supabase + - gitea allowed-mcps: desk-crm-v3, filesystem, mcp-time, gitea category: infra author: Descomplicar® diff --git a/infraestrutura/agents/proxmox-specialist.md b/infraestrutura/agents/proxmox-specialist.md new file mode 100644 index 0000000..bee7d47 --- /dev/null +++ b/infraestrutura/agents/proxmox-specialist.md @@ -0,0 +1,456 @@ +--- +name: proxmox-specialist +description: Especialista em Proxmox VE 8.x, PBS, Clustering e HA para Hetzner com + focus em migracao zero-downtime e backup strategies +role: Especialista em Proxmox VE 8.x, PBS, Clustering e HA para Hetzner com focus + em migracao zero-downtime e backup strategies +domain: Infra +model: sonnet +tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - ssh-unified + - desk-crm-v3 + - notebooklm +recommended_mcps: + - filesystem + - memory-supabase + - gitea +skills: +- _core +- proxmox-setup +- pbs-config +- vm-migration +- proxmox-cluster +- proxmox-ha +desk_task: 1712 +desk_project: 65 +tags: +- agent +- stackworkflow +- claude-code +- proxmox +- pve +- pbs +- clustering +- ha +- hetzner +- migration +version: '1.0' +status: active +quality_score: 75 +compliance: + sacred_rules: true + excellence_standards: true + data_sources: true + knowledge_first: true +created: '2026-02-14' +updated: '2026-02-14' +author: Descomplicar® +--- + + +# Proxmox Specialist Descomplicar + +Especialista em Proxmox VE 8.x, Proxmox Backup Server (PBS), Clustering e High Availability para servidores Hetzner com foco em migrações zero-downtime. + +## Responsabilidades +- Instalação e configuração Proxmox VE 8.x em servidores Hetzner (installimage) +- Networking avançado para single-IP Hetzner (NAT masquerading, port forwarding, vSwitch) +- Storage ZFS (RAID-1 mirror, ARC tuning, compression) +- Proxmox Backup Server (PBS) com deduplicação e remote sync +- Clustering 2+ nodes com Corosync e Quorum +- High Availability (HA Manager, fencing, live migration) +- Migração de workloads CWP/EasyPanel para Proxmox VMs/LXC +- Docker in LXC unprivileged (overlay2 workarounds) + +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primário - usar PRIMEIRO) + +**Notebook Proxmox Research:** +``` +mcp__notebooklm__notebook_query notebook_id:"276ccdde-6b95-42a3-ad96-4e64d64c8d52" query:"proxmox installation hetzner networking zfs" +``` + +**150+ fontes consolidadas:** +- Proxmox VE Admin Guide oficial +- Hetzner community tutorials +- ZFS tuning e best practices +- PBS deduplication e sync +- Terraform bpg/proxmox provider +- Clustering e HA configurations + +### Hub Docs (Secundário - referências técnicas) + +**Guia Definitivo Proxmox VE 8.x + Hetzner:** +``` +/media/ealmeida/Dados/Hub/05-Projectos/Cluster Descomplicar/Research/Proxmox-VE/Guia-Definitivo-Proxmox-Hetzner.md +``` + +**1200+ linhas técnicas:** +- Módulo 1: Instalação via installimage (ZFS vs LVM, Kernel PVE) +- Módulo 2: Networking (NAT, vSwitch MTU 1400, MAC filtering) +- Módulo 3: Storage (PBS, bind mounts, estratégia 3-2-1) +- Módulo 4: Workloads (Docker in LXC, Cloud-Init, GPU passthrough) +- Módulo 5: Automação (API tokens, Terraform, CLI tools) + +**Migration Plan Option A:** +``` +/media/ealmeida/Dados/Hub/05-Projectos/Cluster Descomplicar/Planning/Migration-Plan-OptionA.md +``` + +**Roadmap 3 fases (8 semanas):** +- Fase 1: Novo servidor + PBS + EasyPanel migration +- Fase 2: CWP migration com 7 dias validação +- Fase 3: Cluster formation + HA + cleanup + +### Dify KB (Terciário - se NotebookLM + Hub insuficientes) + +``` +mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"proxmox virtualization clustering" +mcp__dify-kb__dify_kb_retrieve_segments dataset:"Linux" query:"zfs raid storage backup" +``` + +## System Prompt + +### Papel +Especialista em Proxmox VE 8.x, PBS, Clustering e HA para Hetzner. Consulta NotebookLM research (150+ fontes) como fonte primária de conhecimento. Guia migrações complexas zero-downtime com backup strategies robustas. + +### Regras Obrigatórias (Proxmox + Hetzner Gotchas) + +1. **SEMPRE consultar NotebookLM** antes de decisões técnicas críticas +2. **NUNCA improvisar com Hetzner networking:** + - MAC filtering activo → bridged networking SEM virtual MAC = falha + - MTU 1400 obrigatório para vSwitch (não negociável) + - Gateway point-to-point: IP /32 com gateway fora da subnet +3. **Backup strategy ANTES de qualquer migração:** + - 3-2-1 rule (3 cópias, 2 médias, 1 offsite) + - PBS com deduplicação activa + - Validar restore procedures ANTES de migrar produção +4. **ZFS tuning para 128GB RAM:** + - ARC max 16GB (deixa 110GB para VMs) + - ashift=12 para NVMe (4K sectors) + - LZ4 compression (ratio típico 1.3-2x) +5. **Docker in LXC:** + - SEMPRE unprivileged (escape = UID 100000+, não root) + - ZFS overlay2 NÃO funciona → bind mount ext4 + - `nesting=1`, `keyctl=1`, `lxc.apparmor.profile: unconfined` +6. **Terraform provider:** + - bpg/proxmox é escolha correcta (Telmate abandonado) + - SDN.Use privilege obrigatória no PVE 8.x para VMs via API +7. **Documentar descobertas** em `/memory/` se padrão técnico útil + +### Output Format +- Comandos comentados com contexto Hetzner-specific +- ZFS pool creation com justificação de parâmetros +- Network config `/etc/network/interfaces` completa +- Backup plan antes de cada fase crítica +- Rollback procedures sempre definidas +- Gotchas Hetzner explicitados (MAC, MTU, gateway) + +## Proxmox Skills (Pending Creation) + +| Skill | Função | Status | +|-------|--------|--------| +| **/proxmox-setup** | Instalação node completa: installimage → ZFS → NAT networking | Pending | +| **/pbs-config** | PBS setup: datastore → sync jobs → retention policies | Pending | +| **/vm-migration** | Migração workloads: CWP → Proxmox, EasyPanel → Proxmox | Pending | +| **/proxmox-cluster** | Cluster formation: 2 nodes → Corosync → Quorum | Pending | +| **/proxmox-ha** | HA Manager: resource groups → fencing → live migration | Pending | + +**Workflow completo:** +``` +/proxmox-setup → /pbs-config → /vm-migration + ↓ + /proxmox-cluster → /proxmox-ha +``` + +## Workflows + +### Workflow 1: Setup Node Proxmox em Hetzner + +**Pre-requisites:** +- Servidor dedicado Hetzner contractado +- Rescue mode activo + +**Steps:** +1. **installimage** com Debian 12 + ZFS mirror NVMe + - Template customizado (ZFS RAID-1 2x 1TB NVMe) + - Kernel Proxmox PVE (não stock Debian) + - Swap em ZFS zvol (16GB para 128GB RAM) + +2. **Proxmox VE 8.x installation** + ```bash + apt update && apt install proxmox-ve + ``` + +3. **ZFS tuning** + ```bash + # ARC max 16GB, min 4GB + echo "options zfs zfs_arc_max=17179869184" >> /etc/modprobe.d/zfs.conf + echo "options zfs zfs_arc_min=4294967296" >> /etc/modprobe.d/zfs.conf + update-initramfs -u + ``` + +4. **NAT networking (single-IP Hetzner)** + - `/etc/network/interfaces` config completa + - iptables POSTROUTING MASQUERADE + - Port forwarding rules para serviços expostos + +5. **vSwitch configuration (se aplicável)** + - MTU 1400 obrigatório + - VLAN tagging + - Internal network 10.0.0.0/24 + +**Validation:** +- ZFS pool healthy (`zpool status`) +- Proxmox web UI acessível (https://IP:8006) +- NAT funcional (ping 8.8.8.8 de dentro de VM teste) + +### Workflow 2: PBS (Proxmox Backup Server) Setup + +**Steps:** +1. **PBS installation** (can be on same node temporarily) + ```bash + apt install proxmox-backup-server + ``` + +2. **Datastore creation** + - Local: 16TB HDD Enterprise (`/mnt/pbs-datastore`) + - Deduplicação activa (chunk-based) + - Retention policy: 7 daily, 4 weekly, 6 monthly + +3. **Sync jobs configuration** + - Primary PBS: cluster Node B (16TB HDD) + - Secondary PBS: cluster Node A remote sync (12TB HDD) + - Schedule: daily 02:00 UTC + +4. **Backup jobs** + - VMs críticas: diário 01:00 + - VMs secundárias: 3x semana + - LXC containers: snapshot antes de backups + +**Validation:** +- Primeiro backup manual successful +- Deduplicação ratio >1.3x +- Restore test de 1 VM não-crítica + +### Workflow 3: VM Migration (CWP/EasyPanel → Proxmox) + +**Strategy:** Phased migration com validation periods (Migration-Plan-OptionA.md) + +**Phase 1: EasyPanel Migration (Week 1-2)** +1. Backup EasyPanel containers em easy.descomplicar.pt +2. Criar VM Proxmox para Docker host +3. Migrar containers batch (5-10 de cada vez) +4. Validar health endpoints + DNS +5. Rollback immediato se >2 falhas consecutivas + +**Phase 2: CWP Migration (Week 3-6)** +1. **7 dias safety net:** server.descomplicar.pt intacto +2. Criar VM AlmaLinux 8 para CWP +3. Migrar contas CWP batch (rsync + mysql dump) +4. Validar sites (content, DB, email) +5. DNS cutover gradual (TTL 300s) +6. Rollback disponível durante 7 dias + +**Phase 3: Cluster Formation (Week 7-8)** +1. Preparar server.descomplicar.pt como Node A +2. `pvecm create cluster-descomplicar` +3. `pvecm add ` em Node B +4. Validar quorum (2 votes) +5. Configurar HA groups +6. Live migration test + +**Backup Strategy Durante Migração:** +- FASE 1: 3 locais (Server → PBS, Server → easy VPS backup, VM → PBS) +- FASE 2: Safety net 7 dias (VM CWP → PBS, Server antigo intacto) +- RPO: 1h | RTO: 2-4h + +### Workflow 4: Clustering & HA + +**Pre-requisites:** +- 2 nodes Proxmox instalados +- Networking configurado (mesmo subnet ou VPN) +- PBS configurado em ambos + +**Steps:** +1. **Cluster creation** (em Node B) + ```bash + pvecm create cluster-descomplicar + ``` + +2. **Node join** (em Node A) + ```bash + pvecm add + ``` + +3. **Quorum validation** + ```bash + pvecm status # Expected votes: 2 + ``` + +4. **HA Manager configuration** + - HA groups por criticidade (critical, medium, low) + - Fencing device (watchdog) + - Migration settings (max 2 concurrent) + +5. **Live migration test** + - Migrar VM teste entre nodes + - Validar zero-downtime (ping contínuo) + - Rollback test (failure simulation) + +**Validation:** +- Cluster healthy (`pvecm status`) +- HA functional (testar failover forçado) +- Live migration <30s downtime + +## Hetzner-Specific Gotchas (CRITICAL) + +### MAC Filtering +**Problema:** Hetzner filtra MACs não registados → bridged networking falha +**Solução:** +- Opção A: Pedir virtual MAC no Robot panel (grátis) +- Opção B: NAT masquerading (single-IP setups) +- **NUNCA assumir bridged networking funciona sem validar** + +### MTU 1400 vSwitch +**Problema:** vSwitch Hetzner requer MTU 1400 (não 1500 standard) +**Solução:** +```bash +auto vmbr1 +iface vmbr1 inet manual + bridge-ports enp7s0.4000 + bridge-stp off + bridge-fd 0 + mtu 1400 +``` + +### Gateway Point-to-Point +**Problema:** Gateway Hetzner fora da subnet (/32 setup) +**Solução:** +```bash +auto eno1 +iface eno1 inet static + address YOUR_IP/32 + gateway GATEWAY_IP + pointopoint GATEWAY_IP +``` + +### ZFS ARC vs KVM Memory +**Problema:** ZFS ARC compete com VMs por RAM +**Solução:** ARC max 16GB para 128GB RAM (deixa 110GB para VMs) + +### Docker Overlay2 em ZFS +**Problema:** ZFS não suporta overlay2 nativo +**Solução:** +- Criar ext4 bind mount: `/var/lib/docker` em ext4 filesystem +- LXC unprivileged com `nesting=1` + +## MCPs Relevantes +- `ssh-unified`: Acesso remoto aos nodes Proxmox +- `desk-crm-v3`: Documentar migration phases em task #1712 +- `notebooklm`: KB primária (Gemini 2.5 RAG, 150+ fontes) +- `memory-supabase`: Guardar gotchas descobertos durante migration +- `filesystem`: Ler/escrever configs e scripts locais +- `gitea`: Version control de Terraform configs + +## Colaboração +- Reports to: Infrastructure Manager +- Colabora com: System administrators, DevOps specialists, Backup specialists +- Escalate: Problemas de hardware Hetzner, suporte Proxmox Enterprise + +## Your Available MCPs + +### Primary MCPs (Your Domain) +✓ **desk-crm-v3** (business) + - Documentar migration progress em task #1712 + - Usage: `mcp__desk-crm-v3__*` + +✓ **ssh-unified** (infra) + - SSH para nodes Proxmox (cluster.descomplicar.pt, server.descomplicar.pt) + - Usage: `mcp__ssh-unified__*` + +✓ **notebooklm** (knowledge primária) + - 150+ fontes Proxmox research consolidadas + - Usage: `mcp__notebooklm__notebook_query` + +✓ **memory-supabase** (knowledge persistence) + - Guardar gotchas técnicos descobertos + - Usage: `mcp__memory-supabase__*` + +### Recommended for Proxmox +- **filesystem** - Configs locais, Terraform files +- **gitea** - Version control de infrastructure code +- **mcp-time** - Scheduling de backups e sync jobs + +### All Available (33 total) +moloni, context7, n8n, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, wikijs, gsc, dify-kb, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, magic, vimeo, design-systems, replicate, cwp, lighthouse, puppeteer + +**Discovery:** Use ToolSearch to find specific tools. +**Example:** `ToolSearch("ssh execute")` finds SSH execution tools. + + +## Your Available Skills + +### Primary Skills (Your Domain) +✓ **/proxmox-setup** - Instalação node Proxmox: installimage → ZFS → NAT networking (PENDING) + - Invoke: `/proxmox-setup` + +✓ **/pbs-config** - PBS configuration: datastore → sync jobs → retention (PENDING) + - Invoke: `/pbs-config` + +✓ **/vm-migration** - Migração workloads: CWP/EasyPanel → Proxmox (PENDING) + - Invoke: `/vm-migration` + +### Recommended for Proxmox +- **/backup-strategies** - Estratégias backup 3-2-1, RTO/RPO, disaster recovery +- **/security-audit** - Auditoria segurança (firewall, SSH hardening, updates) +- **/server-health** - Diagnóstico servidor (CPU, RAM, disk, services) + +### Core Skills (All Agents) +- **/reflect** - Auto-reflexão e melhoria contínua +- **/worklog** - Registo trabalho com migration phases tracking +- **/_core** - Sacred Rules, Excellence Standards +- **/knowledge** - Unified KB search (NotebookLM → Dify → Hub) +- **/desk** - Integração .desk-project (task #1712, project #65) + +### All Available (54 total) +/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /interview, /time, /today, /research, /youtube, /seo-audit, /seo-report, /metrics, /sdk + +**Discovery:** Use the Skill tool to invoke skills. +**Example:** `Skill("skill-name")` invokes the skill. + + +## Hardware Context (Current Mission) + +### New Server (cluster.descomplicar.pt) +- **CPU:** Intel i7-8700 (6 cores / 12 threads) +- **RAM:** 128GB DDR4 ECC +- **Storage:** + - 2x 1TB NVMe (ZFS RAID-1 mirror para VMs) + - 16TB HDD Enterprise (PBS primary datastore) +- **Network:** 1Gbit/s, single IPv4 +- **Location:** Hetzner FSN1-DC7 +- **Cost:** €70.70/month + +### Current Infrastructure (To Migrate) +- **server.descomplicar.pt** - Dedicated, CWP, CentOS 7 (EOL), 39 vhosts +- **easy.descomplicar.pt** - VPS, EasyPanel, 108 containers Docker + +### Target Architecture +- **2-node cluster:** cluster.descomplicar.pt (Node B) + server.descomplicar.pt (Node A) +- **HA enabled:** Critical VMs migrate automatically on failure +- **PBS redundancy:** Primary (Node B 16TB) + Remote sync (Node A 12TB) +- **Zero downtime:** Phased migration com rollback safety nets + +## Mission Timeline (Migration-Plan-OptionA.md) + +- **Week 1-2:** Setup Node B + PBS + EasyPanel migration +- **Week 3-6:** CWP migration com 7 dias validation window +- **Week 7-8:** Cluster formation + HA + cleanup legacy + +**Status:** Research phase | Awaiting hardware delivery +**Task:** #1712 (Desk CRM) | **Project:** #65 (Cluster Descomplicar) diff --git a/infraestrutura/agents/security-compliance-specialist.md b/infraestrutura/agents/security-compliance-specialist.md index f1df460..a14a115 100644 --- a/infraestrutura/agents/security-compliance-specialist.md +++ b/infraestrutura/agents/security-compliance-specialist.md @@ -9,6 +9,15 @@ role: USAR PROATIVAMENTE para security, seguranca, compliance, auditoria, cybers domain: Infra model: opus tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - ssh-unified + - desk-crm-v3 +recommended_mcps: + - filesystem + - lighthouse + - memory-supabase skills: - _core desk_task: 1515 @@ -44,7 +53,16 @@ Especialista senior em ciberseguranca, compliance regulamentar (GDPR, ISO27001, - Gerir riscos e implementar controlos de proteccao de dados - Configurar seguranca de rede, firewalls e sistemas de deteccao -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"seguranca ciberseguranca vulnerabilidades firewall" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"seguranca ciberseguranca vulnerabilidades firewall" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Linux" query:"hardening seguranca servidor auditoria" diff --git a/infraestrutura/knowledge/datasets.json b/infraestrutura/knowledge/datasets.json index 698cfe1..27e7133 100644 --- a/infraestrutura/knowledge/datasets.json +++ b/infraestrutura/knowledge/datasets.json @@ -1,10 +1,62 @@ { - "description": "Dify KB datasets for Infrastructure domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "b2a4d2c5-fe55-412c-bc28-74dbd611905d", "name": "CWP Centos Web Panel", "priority": 1, "document_count": 10, "word_count": 599430}, - {"id": "7f63ec0c-6321-488c-b107-980140199850", "name": "TI", "priority": 1, "document_count": 115, "word_count": 29448495}, - {"id": "bde4eddd-4618-402c-8bfb-bb947ed9219d", "name": "Linux", "priority": 2, "document_count": 4, "word_count": 336446}, - {"id": "cc7f000a-ad86-49b6-b59b-179e65f8a229", "name": "AWS", "priority": 2, "document_count": 14, "word_count": 5125632} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for Infrastructure domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "0ded7bd6-69b3-4c76-b327-452396bf7ea7", + "title": "CWP", + "topics": [ + "cwp", + "centos", + "web", + "panel" + ], + "maps_from_dify": "CWP Centos Web Panel" + }, + { + "id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", + "title": "Cloud e Infraestrutura TI", + "topics": [], + "maps_from_dify": "TI" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "b2a4d2c5-fe55-412c-bc28-74dbd611905d", + "name": "CWP Centos Web Panel", + "priority": 1, + "document_count": 10, + "word_count": 599430 + }, + { + "id": "7f63ec0c-6321-488c-b107-980140199850", + "name": "TI", + "priority": 1, + "document_count": 115, + "word_count": 29448495 + }, + { + "id": "bde4eddd-4618-402c-8bfb-bb947ed9219d", + "name": "Linux", + "priority": 2, + "document_count": 4, + "word_count": 336446 + }, + { + "id": "cc7f000a-ad86-49b6-b59b-179e65f8a229", + "name": "AWS", + "priority": 2, + "document_count": 14, + "word_count": 5125632 + } + ] + } + } +} \ No newline at end of file diff --git a/infraestrutura/skills/backup-strategies/SKILL.md b/infraestrutura/skills/backup-strategies/SKILL.md index fae557b..51baef1 100644 --- a/infraestrutura/skills/backup-strategies/SKILL.md +++ b/infraestrutura/skills/backup-strategies/SKILL.md @@ -663,7 +663,7 @@ Consultar para aprofundar conhecimento ou resolver casos específicos: ```javascript // Exemplo: pesquisar backup incremental MySQL -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7f63ec0c-6321-488c-b107-980140199850", query: "mysql binlog incremental backup recovery", top_k: 3 diff --git a/infraestrutura/skills/cwp-accounts/SKILL.md b/infraestrutura/skills/cwp-accounts/SKILL.md index 9e652ac..1ced5c3 100644 --- a/infraestrutura/skills/cwp-accounts/SKILL.md +++ b/infraestrutura/skills/cwp-accounts/SKILL.md @@ -2,8 +2,8 @@ name: cwp-accounts description: CWP user account management using official /scripts/cwp_api. Create, suspend, remove accounts, fix permissions. Based on official CWP documentation only. Use when user mentions "conta cwp", "user cwp", "criar conta", "suspender conta", "permissões cwp". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -29,6 +29,20 @@ Gestão de contas de utilizador no CWP usando API oficial. **Zero assumptions, z - [CWP Admin API](https://wiki.centos-webpanel.com/cwp-admin-api) - [CWP Scripts](https://wiki.centos-webpanel.com/cwp-scripts) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide (seccao User Accounts, Packages, Migration) + Wiki (User & Account Management) - **503KB** +- `CWP-Ferramentas-Desenvolvimento.md` - API Account (add/del/list/susp/unsp) - **82KB** +- `CWP-Guia-do-Revendedor.md` - Gestao de contas reseller - **17KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"conta utilizador criar suspender permissoes" +``` + --- ## Scripts de Consulta (Apenas Leitura) diff --git a/infraestrutura/skills/cwp-backup/SKILL.md b/infraestrutura/skills/cwp-backup/SKILL.md index 1966ad6..a6406b6 100644 --- a/infraestrutura/skills/cwp-backup/SKILL.md +++ b/infraestrutura/skills/cwp-backup/SKILL.md @@ -2,8 +2,8 @@ name: cwp-backup description: CWP backup creation and management using official scripts. Creates user backups, manages backup locations. Based on official CWP documentation only. Use when user mentions "backup cwp", "restaurar cwp", "backup conta", "user backup". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -29,6 +29,19 @@ Gestão de backups no CWP usando scripts oficiais. **Zero assumptions, zero hall - [CWP Scripts](https://wiki.centos-webpanel.com/cwp-scripts) - [CWP Backups](https://wiki.centos-webpanel.com/category/backups) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide (seccao Backup and Restore, Google Drive) + Wiki (Backup & Migration) - **503KB** +- `CWP-Guia-do-Utilizador.md` - Painel utilizador (seccao Backup and Restore) - **72KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"backup restore configuracao" +``` + --- ## Paths Oficiais diff --git a/infraestrutura/skills/cwp-email/SKILL.md b/infraestrutura/skills/cwp-email/SKILL.md index 4f89114..7199c70 100644 --- a/infraestrutura/skills/cwp-email/SKILL.md +++ b/infraestrutura/skills/cwp-email/SKILL.md @@ -2,8 +2,8 @@ name: cwp-email description: CWP email management including DKIM, SPF, mail queue. Based on official CWP documentation only. Use when user mentions "email cwp", "dkim", "spf", "mail queue", "postfix cwp". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -30,6 +30,20 @@ Gestão de email no CWP. **Zero assumptions, zero hallucinations** - apenas coma - [How to install DKIM 2048 bits](https://wiki.centos-webpanel.com/how-to-install-dkim-2048-bits-long-key) - [CWP Scripts](https://wiki.centos-webpanel.com/cwp-scripts) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide (seccao Email: Accounts, DKIM, SPF, Mail Queue, AntiSpam, Policyd) + Wiki (Email & Postfix) - **503KB** +- `CWP-Guia-do-Utilizador.md` - Painel utilizador (seccao Email Accounts, Auto Responders, Filters, Routing) - **72KB** +- `CWP-Ferramentas-Desenvolvimento.md` - API Email Admin Server - **82KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"email dkim spf postfix mail queue spam" +``` + --- ## Scripts Oficiais de Email diff --git a/infraestrutura/skills/cwp-php/SKILL.md b/infraestrutura/skills/cwp-php/SKILL.md index 0fb8afa..0400535 100644 --- a/infraestrutura/skills/cwp-php/SKILL.md +++ b/infraestrutura/skills/cwp-php/SKILL.md @@ -2,8 +2,8 @@ name: cwp-php description: CWP PHP version management. PHP Switcher, Selector, configuration. Based on official CWP documentation only. Use when user mentions "php cwp", "versão php", "php selector", "php switcher". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -30,6 +30,19 @@ Gestão de versões PHP no CWP. **Zero assumptions, zero hallucinations** - apen - [PHP Version Switcher](https://wiki.centos-webpanel.com/php-version-switcher) - [CWP Scripts](https://wiki.centos-webpanel.com/cwp-scripts) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide (seccao PHP Settings, Switcher, Selector, FPM, PECL) + Wiki (PHP Configuration) - **503KB** +- `CWP-Guia-do-Utilizador.md` - Painel utilizador (seccao Edit PHP.ini, PHP Selector) - **72KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"php versao selector switcher fpm configuracao" +``` + --- ## Ferramentas PHP no CWP diff --git a/infraestrutura/skills/cwp-scripts/SKILL.md b/infraestrutura/skills/cwp-scripts/SKILL.md index 3f461a6..abc9fb2 100644 --- a/infraestrutura/skills/cwp-scripts/SKILL.md +++ b/infraestrutura/skills/cwp-scripts/SKILL.md @@ -2,8 +2,8 @@ name: cwp-scripts description: Complete reference for CWP /scripts/ folder. All official CLI scripts documented. Based on official CWP documentation only. Use when user mentions "cwp scripts", "scripts cwp", "/scripts/", "comando cwp". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -28,6 +28,19 @@ Todos os scripts oficiais documentados do CWP. **Zero assumptions, zero hallucin - [CWP Scripts](https://wiki.centos-webpanel.com/cwp-scripts) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide + Wiki completo (todas as seccoes) - **503KB** +- `CWP-Ferramentas-Desenvolvimento.md` - API Manager completo (53 endpoints) - **82KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"scripts comandos cwp api" +``` + --- ## Como Executar diff --git a/infraestrutura/skills/cwp-security/SKILL.md b/infraestrutura/skills/cwp-security/SKILL.md index 4edfff0..9b9d8b4 100644 --- a/infraestrutura/skills/cwp-security/SKILL.md +++ b/infraestrutura/skills/cwp-security/SKILL.md @@ -2,8 +2,8 @@ name: cwp-security description: CWP security management with CSF firewall. Block/unblock IPs, configure firewall, security hardening. Based on official CWP documentation only. Use when user mentions "csf", "firewall cwp", "bloquear ip", "segurança cwp", "ban ip". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -30,6 +30,18 @@ Gestão de segurança no CWP usando CSF/LFD. **Zero assumptions, zero hallucinat - [CSF/LFD Firewall configuration](https://wiki.centos-webpanel.com/csflfd-firewall-configuration) - [CWP Security Instructions](https://wiki.centos-webpanel.com/cwp-security-instructions) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide (seccao Security: CSF, Mod Security, Maldet, RKHunter, Lynis, Symlink, Shell Access) + Wiki (Firewall, SSL & Security) - **503KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"csf firewall seguranca malware bloqueio ip" +``` + --- ## Paths de Configuração diff --git a/infraestrutura/skills/cwp-ssl/SKILL.md b/infraestrutura/skills/cwp-ssl/SKILL.md index 459db86..2b89061 100644 --- a/infraestrutura/skills/cwp-ssl/SKILL.md +++ b/infraestrutura/skills/cwp-ssl/SKILL.md @@ -2,8 +2,8 @@ name: cwp-ssl description: CWP AutoSSL management using native acme.sh. Manages SSL certificates, renewals, and troubleshooting. Based on official CWP documentation only. Use when user mentions "ssl cwp", "autossl", "certificado ssl", "renovar ssl", "acme.sh". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -29,6 +29,20 @@ Gestão de certificados SSL no CWP usando acme.sh nativo. **Zero assumptions, ze - [AutoSSL CWP Wiki](https://docs.control-webpanel.com/docs/admin-guide/ssl/autossl) - [acme.sh Documentation](https://wiki.centos-webpanel.com/) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide + Wiki (seccoes SSL & Security, WebServers) - **503KB** +- `CWP-Guia-do-Utilizador.md` - Painel utilizador (seccao AutoSSL) - **72KB** +- `CWP-Ferramentas-Desenvolvimento.md` - API AutoSSL (add/del/list/renew) - **82KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"ssl certificado autossl renovacao" +``` + --- ## Paths Oficiais (Documentados) diff --git a/infraestrutura/skills/cwp-webserver/SKILL.md b/infraestrutura/skills/cwp-webserver/SKILL.md index 81a42ed..610977a 100644 --- a/infraestrutura/skills/cwp-webserver/SKILL.md +++ b/infraestrutura/skills/cwp-webserver/SKILL.md @@ -2,8 +2,8 @@ name: cwp-webserver description: CWP webserver management with official API. Apache, Nginx, rebuild configurations, restart services. Based on official CWP documentation only. Use when user mentions "apache cwp", "nginx cwp", "webserver cwp", "vhost cwp". author: Descomplicar® Crescimento Digital -version: 1.0.0 -quality_score: 70 +version: 1.1.0 +quality_score: 72 user_invocable: true desk_task: null --- @@ -30,6 +30,19 @@ Gestão de webservers no CWP. **Zero assumptions, zero hallucinations** - apenas - [CWP Scripts](https://wiki.centos-webpanel.com/cwp-scripts) - [WebServers Update](https://wiki.centos-webpanel.com/webservers-update) +### Documentação Hub (Consultar SEMPRE) + +**Manuais locais** (`Hub/06-Operacoes/Documentacao/Manuais/CWP/`): +- `CWP-Manual-Completo.md` - Admin Guide (seccao WebServers Settings, Apache, Nginx) + Wiki (WebServers & Apache) - **503KB** +- `CWP-Guia-do-Utilizador.md` - Painel utilizador (seccao Domains, Redirect) - **72KB** + +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-CWP.md` + +**NotebookLM (pesquisa AI sobre toda a documentacao CWP):** +``` +mcp__notebooklm__notebook_query notebook_id:"0ded7bd6-69b3-4c76-b327-452396bf7ea7" query:"apache nginx webserver configuracao rebuild" +``` + --- ## API WebServers (Documentada) diff --git a/infraestrutura/skills/infra-check/SKILL.md b/infraestrutura/skills/infra-check/SKILL.md new file mode 100644 index 0000000..da21a3b --- /dev/null +++ b/infraestrutura/skills/infra-check/SKILL.md @@ -0,0 +1,180 @@ +--- +name: infra-check +description: > + MCP Health Check e auditoria de despesas. Sabado: check completo 9 MCPs + auditoria despesas completa. Domingo: check resumido top 5 + despesas sem PDF. Use when "infra check", "mcp health", "health check", "auditoria despesas", "verificar mcps". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: infrastructure +tags: [mcp, health-check, infrastructure, audit, expenses, monitoring] +desk_task: 1710 +desk_project: 65 +allowed-tools: Read, Write, mcp__desk-crm-v3, mcp__google-workspace, mcp__ssh-unified, mcp__filesystem, mcp__mcp-time, mcp__memory-supabase, WebFetch +mcps: desk-crm-v3, google-workspace, ssh-unified, filesystem, mcp-time, memory-supabase +dependencies: + mcps: [desk-crm-v3, ssh-unified, filesystem, mcp-time] +triggers: + - "User asks about MCP health" + - "User mentions 'health check', 'infra check', 'mcp status'" + - "Invoked by /today orchestrator on Saturday/Sunday" +--- + +# /infra-check v1.0 + +MCP Health Check + Auditoria de Despesas. + +--- + +## MCPs por Prioridade + +**P1 - Criticos (bloqueiam trabalho):** +- desk-crm-v3 (CRM) +- filesystem (ficheiros locais) +- mcp-time (data/hora) + +**P2 - Importantes (degradam workflow):** +- google-workspace (email/calendar) +- ssh-unified (servidores) +- memory-supabase (memoria) + +**P3 - Uteis:** +- gitea (repos) +- moloni (facturacao) +- dify-kb (knowledge base) + +--- + +## Protocolo Sabado (Completo) + +### 1. MCP Health Check (9 MCPs) + +``` +Para cada MCP, executar teste simples: + +| MCP | Teste | Timeout | +|-----|-------|---------| +| desk-crm-v3 | get_tickets(limit=1) | 5s | +| filesystem | list_directory(~) | 2s | +| mcp-time | current_time | 2s | +| google-workspace | calendar_get_events(hoje) | 5s | +| ssh-unified | ssh_list_servers | 3s | +| memory-supabase | search_memories("test") | 5s | +| gitea | list_my_repos | 5s | +| moloni | getall (companies) | 5s | +| dify-kb | list_datasets | 5s | + +Resultado por MCP: +- OK - respondeu em <2s +- LENTO - respondeu em >2s +- FALHA - timeout ou erro +``` + +### 2. Auditoria Despesas Completa + +``` +2a. DESPESAS SEM PDF (ultimos 60 dias): + mcp__ssh-unified__ssh_execute(server="desk", command=" + mysql -u ealmeida -p'9qPRdCGGqM4o' ealmeida_desk24 -e \" + SELECT e.id, e.expense_name, e.amount, e.date, e.note, + (SELECT COUNT(*) FROM tblfiles f WHERE f.rel_id = e.id AND f.rel_type = 'expense') as pdfs + FROM tblexpenses e + WHERE e.id >= 770 AND e.date >= DATE_SUB(CURDATE(), INTERVAL 60 DAY) + HAVING pdfs = 0 + ORDER BY e.date DESC; + \" + ") + Excluir: AT (cat 15), Salarios (cat 22), SS (cat 25) - nao tem recibo + +2b. DESPESAS SEM CATEGORIA: + WHERE id >= 770 AND (category = 0 OR category IS NULL) + +2c. VALORES ANOMALOS (>500 EUR ou negativos): + WHERE id >= 770 AND (amount > 500 OR amount < 0) + +2d. RECONCILIACAO MENSAL (apenas 1o sabado do mes, DAY(CURDATE()) <= 7): + - Contar despesas do mes anterior por categoria + - Comparar com mes homologo + - Alertar se variacao >30% + +2e. FORNECEDORES RECORRENTES em falta: + Verificar se fornecedores mensais tem despesa este mes: + Anthropic, Cursor, Hetzner, Google One, ElasticEmail, Canva + Alertar se falta apos dia 10 do mes +``` + +### 3. Verificar Gateway + +``` +WebFetch("https://gateway.descomplicar.pt/health") +Se falha → alerta critico (todos os MCPs gateway afectados) +``` + +--- + +## Protocolo Domingo (Resumido) + +### 1. MCP Health Check (top 5) + +``` +Apenas P1 + P2: +- desk-crm-v3, filesystem, mcp-time, google-workspace, ssh-unified +Teste rapido, timeout 5s +Apenas verificar se responde +``` + +### 2. Despesas sem PDF (30 dias) + +``` +Mesma query do sabado mas INTERVAL 30 DAY +SE >3 sem PDF (excl. AT/Salario/SS) → alertar +SE 0 → "Todas as despesas recentes tem documento" +``` + +--- + +## Output + +```markdown +## MCP Health Check ([Sabado/Domingo]) + +[status] X/Y MCPs operacionais +[alertas por MCP com problema] + +## Auditoria Despesas ([Sabado/Domingo]) + +### Despesas sem documento (N) [se sabado] +| # | Fornecedor | Valor | Data | Accao | + +### Fornecedores recorrentes [se sabado] +- [Fornecedor]: OK ou FALTA + +### Resumo mensal [se 1o sabado] +- Total [Mes]: X EUR (Y despesas) +- vs [Mes anterior]: +/-Z% + +[ou versao resumida se domingo] +``` + +--- + +## Troubleshooting Automatico + +``` +Se MCP falha: +1. Verificar gateway: WebFetch("https://gateway.descomplicar.pt/health") +2. Se gateway OK mas MCP falha → problema no MCP especifico → documentar +3. Se gateway falha → problema de rede/servidor mcp-hub → alerta critico +``` + +--- + +## Anti-Patterns + +- NUNCA executar health check em dias uteis (reservado para Sab/Dom via /today) +- NUNCA ignorar falha de MCP P1 (critico) +- SEMPRE incluir accao sugerida para cada problema encontrado + +--- + +*Skill v1.0.0 | 04-03-2026 | Descomplicar®* diff --git a/infraestrutura/skills/mcp-dev/SKILL.md b/infraestrutura/skills/mcp-dev/SKILL.md index a7aad53..133bc42 100644 --- a/infraestrutura/skills/mcp-dev/SKILL.md +++ b/infraestrutura/skills/mcp-dev/SKILL.md @@ -15,6 +15,8 @@ allowed-tools: Grep Skill para criação, configuração e gestão de servidores MCP customizados. +> **Regra #48:** Novos MCPs devem ser desenvolvidos no **container dev** (`server:"dev"`, path `/root/Dev/`). O path `/home/ealmeida/mcp-servers/` é para MCPs já em produção. Desenvolvimento inicial -> `/root/Dev/` -> depois mover para `mcp-servers/` no deploy final. + --- ## Comandos @@ -1031,18 +1033,42 @@ O agente `mcp-protocol-developer` é invocado para: ## Datasets Dify ``` -mcp__dify-kb__dify_kb_retrieve_segments dataset:"MCP Servers" query:"..." +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments dataset:"MCP Servers" query:"..." mcp__dify-kb__dify_kb_retrieve_segments dataset:"Claude Code" query:"..." mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"..." ``` --- -## Referências +## Referências e Documentação + +### Procedimentos Obrigatórios (D7-Tecnologia) + +**SEMPRE consultar antes de criar/modificar MCPs:** + +- **[PROC-MCP-Desenvolvimento.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/MCP/PROC-MCP-Desenvolvimento.md)** - Guia oficial v2.3: Regra de Ouro MCP, capabilities obrigatórias, validação pre-deploy, fallback enterprise +- **[PROC-MCP-Troubleshooting-Erro-471.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/MCP/PROC-MCP-Troubleshooting-Erro-471.md)** - Debug erro 471 (capabilities incompletas, too many requests) +- **[PROC-MCP-Google-Auth.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/MCP/PROC-MCP-Google-Auth.md)** - Autenticação OAuth Google Workspace, refresh tokens, troubleshooting +- **[PROC-MCP-Session-Recovery.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/MCP/PROC-MCP-Session-Recovery.md)** - Recuperação de sessões MCP após crash +- **[PROC-MCP-Desk-Timer.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/MCP/PROC-MCP-Desk-Timer.md)** - Workflow timer Desk CRM (atribuição e status obrigatórios) + +### Quick Reference (ver PROC-MCP-Desenvolvimento.md) + +- **ESLint + Prettier:** Ver PROC secção "Scripts package.json" +- **Husky pre-commit:** Ver PROC secção "Husky + Lint-Staged" +- **Checklist novo MCP:** Ver PROC secção "Checklist Desenvolvimento MCP" +- **Schema BD:** Ver PROC secção "Documentação Schema BD" +- **Validação pre-deploy:** Ver PROC secção "Validação Obrigatória" + +### Agente Especializado + +- **Agent:** `mcp-protocol-developer` - Desenvolvimento complexo, debug, optimização, recursos avançados + +### Documentação Técnica - [MCP SDK Documentation](https://modelcontextprotocol.io/) -- [[AGT-Sistema-Agentes|mcp-protocol-developer]] - [[Stack/Claude Code/MCPs/|MCPs Documentados]] +- [[D7-Tecnologia/INDEX|Ver Todos Procedimentos D7]] --- diff --git a/infraestrutura/skills/pbs-config/SKILL.md b/infraestrutura/skills/pbs-config/SKILL.md new file mode 100644 index 0000000..c473c25 --- /dev/null +++ b/infraestrutura/skills/pbs-config/SKILL.md @@ -0,0 +1,497 @@ +--- +name: pbs-config +description: Configuração Proxmox Backup Server (PBS) - datastore creation, retention policies, sync jobs, remote targets. Use when user mentions "pbs setup", "proxmox backup", "configure pbs", "backup server". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 75 +user_invocable: true +desk_task: 1712 +allowed-tools: Task, Read, Bash +dependencies: + - ssh-unified + - notebooklm +--- + +# PBS Config + +Configuração completa de Proxmox Backup Server (PBS) com datastores, políticas de retenção, sync jobs e estratégia de backup 3-2-1. + +## Quando Usar + +- Configurar PBS após instalação Proxmox +- Criar datastores para backups +- Definir retention policies (7 daily, 4 weekly, 6 monthly) +- Configurar remote sync entre nodes PBS +- Implementar estratégia 3-2-1 backup + +## Sintaxe + +```bash +/pbs-config [--retention 7:4:6] [--remote-sync node2] [--dedup on] +``` + +## Exemplos + +```bash +# PBS básico com retention padrão +/pbs-config /mnt/pbs-datastore + +# PBS com retention custom e remote sync +/pbs-config /mnt/pbs-datastore --retention 10:5:12 --remote-sync pbs-node2.descomplicar.pt + +# PBS sem deduplicação (se storage não suporta) +/pbs-config /mnt/pbs-main --dedup off +``` + +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM Proxmox Research +```bash +mcp__notebooklm__notebook_query \ + notebook_id:"276ccdde-6b95-42a3-ad96-4e64d64c8d52" \ + query:"proxmox backup server pbs datastore retention deduplication" +``` + +### Hub Docs +- Hub/05-Projectos/Cluster Descomplicar/Research/Proxmox-VE/Guia-Definitivo-Proxmox-Hetzner.md +- Módulo 3: Storage e Backups (PBS, estratégia 3-2-1, deduplicação) + +## Workflow Completo + +### Fase 1: PBS Installation (se ainda não instalado) + +**1.1 Verificar se PBS já está instalado** +```bash +dpkg -l | grep proxmox-backup-server + +# Se não instalado: +apt update +apt install proxmox-backup-server +``` + +**1.2 Aceder PBS Web UI** +``` +https://SERVER_IP:8007 + +User: root +Password: (root password do servidor) +``` + +**1.3 Configuração Inicial** +- Hostname +- DNS servers +- Time zone (Europe/Lisbon) + +### Fase 2: Datastore Creation + +**2.1 Preparar Storage** + +**Para ZFS (RECOMENDADO):** +```bash +# Já criado em /proxmox-setup: +# zfs create rpool/pbs-datastore + +# Verificar +zfs list | grep pbs-datastore + +# Optimizar para backup workload +zfs set compression=lz4 rpool/pbs-datastore +zfs set dedup=off rpool/pbs-datastore # Dedup no PBS, não no ZFS +zfs set recordsize=1M rpool/pbs-datastore # Large files +``` + +**Para ext4 (HDD 16TB):** +```bash +# Particionar HDD +parted /dev/sda mklabel gpt +parted /dev/sda mkpart primary ext4 0% 100% + +# Formatar +mkfs.ext4 /dev/sda1 + +# Montar +mkdir -p /mnt/pbs-datastore +echo "/dev/sda1 /mnt/pbs-datastore ext4 defaults 0 2" >> /etc/fstab +mount -a +``` + +**2.2 Criar Datastore via CLI** +```bash +proxmox-backup-manager datastore create main-store /mnt/pbs-datastore + +# Verificar +proxmox-backup-manager datastore list +``` + +**2.3 Configurar Retention Policy** +```bash +# 7 daily, 4 weekly, 6 monthly (padrão) +proxmox-backup-manager datastore update main-store \ + --keep-daily 7 \ + --keep-weekly 4 \ + --keep-monthly 6 \ + --keep-yearly 3 +``` + +**Explicação Retention:** +- `keep-daily 7`: Mantém 7 backups diários +- `keep-weekly 4`: Mantém 4 backups semanais (1 por semana) +- `keep-monthly 6`: Mantém 6 backups mensais (1 por mês) +- `keep-yearly 3`: Mantém 3 backups anuais + +**Gestão automática:** PBS elimina backups antigos baseado nestas regras. + +### Fase 3: PBS Users & Permissions + +**3.1 Criar User para PVE Backups** +```bash +# User dedicado para Proxmox enviar backups +proxmox-backup-manager user create pve-backup@pbs \ + --email admin@descomplicar.pt + +# Password +proxmox-backup-manager user update pve-backup@pbs --password + +# Atribuir permissões no datastore +proxmox-backup-manager acl update /datastore/main-store \ + --auth-id pve-backup@pbs \ + --role DatastoreBackup +``` + +**3.2 Criar API Token (para automação)** +```bash +# Token para scripts/Terraform +proxmox-backup-manager user token create pve-backup@pbs automation-token \ + --output-format json + +# Guardar token de forma segura +# Formato: pve-backup@pbs!automation-token= +``` + +### Fase 4: Configure PVE to Use PBS + +**4.1 Adicionar PBS Storage em Proxmox VE** + +Via Web UI (Datacenter → Storage → Add → Proxmox Backup Server): +- ID: `pbs-main` +- Server: `SERVER_IP` (ou hostname se cluster) +- Datastore: `main-store` +- Username: `pve-backup@pbs` +- Password: (password criado) +- Fingerprint: (auto-detect) + +Via CLI: +```bash +pvesm add pbs pbs-main \ + --server SERVER_IP \ + --datastore main-store \ + --username pve-backup@pbs \ + --password +``` + +**4.2 Verificar Conectividade** +```bash +pvesm status | grep pbs-main +``` + +### Fase 5: Backup Jobs (PVE) + +**5.1 Criar Backup Job para VMs Críticas** + +Via Web UI (Datacenter → Backup → Add): +- Storage: `pbs-main` +- Schedule: Daily 01:00 +- Mode: Snapshot (live backup) +- Compression: zstd +- Notification: email admin@descomplicar.pt + +Via CLI: +```bash +# Backup diário de todas VMs às 01:00 +vzdump --storage pbs-main --mode snapshot --compress zstd --all 1 +``` + +**5.2 Agendar via cron (alternativa)** +```bash +# /etc/cron.d/pve-backup-critical +0 1 * * * root vzdump --storage pbs-main --vmid 100,101,102 --mode snapshot --compress zstd +``` + +**5.3 Backup Seletivo** +```bash +# VMs críticas: diário +# VMs secundárias: 3x semana (Seg, Qua, Sex) +0 1 * * 1,3,5 root vzdump --storage pbs-main --vmid 200,201,202 --mode snapshot --compress zstd +``` + +### Fase 6: Remote Sync (2-Node Cluster) + +**Setup para cluster:** PBS em Node B (primary) + PBS em Node A (secondary) + +**6.1 Configurar Remote em PBS Secondary (Node A)** + +Via Web UI PBS Node A (Configuration → Remote): +- Name: `pbs-node-b` +- Host: `` ou `cluster.descomplicar.pt` +- Port: 8007 +- Auth ID: `pve-backup@pbs` +- Password: (password) +- Fingerprint: (auto-detect) + +**6.2 Criar Sync Job** + +Via Web UI PBS Node A (Configuration → Sync Jobs → Add): +- Remote: `pbs-node-b` +- Remote Datastore: `main-store` +- Local Datastore: `secondary-store` +- Schedule: Daily 03:00 (após backups) +- Remove vanished: Yes (sync deletes) + +Via CLI em Node A: +```bash +proxmox-backup-manager sync-job create sync-from-node-b \ + --remote pbs-node-b \ + --remote-store main-store \ + --store secondary-store \ + --schedule "0 3 * * *" \ + --remove-vanished true +``` + +**6.3 Testar Sync Manual** +```bash +proxmox-backup-manager sync-job run sync-from-node-b +``` + +### Fase 7: Monitoring & Maintenance + +**7.1 Verificar Deduplicação** +```bash +# Ver estatísticas datastore +proxmox-backup-manager datastore status main-store + +# Ratio deduplicação (típico 1.3-2.5x) +``` + +**7.2 Garbage Collection** +```bash +# Liberar espaço de backups removidos (retention) +proxmox-backup-manager garbage-collection start main-store + +# Agendar GC semanal (Domingo 02:00) +# Via Web UI: Datastore → main-store → Prune & GC +``` + +**7.3 Verificar Disk Usage** +```bash +df -h /mnt/pbs-datastore + +# ZFS +zfs list -o name,used,available,refer rpool/pbs-datastore +``` + +**7.4 Alertas Email** +```bash +# Configurar notificações +# Via Web UI: Configuration → Notifications +# SMTP server: mail.descomplicar.pt +# Alertas: disk usage >80%, backup failures +``` + +### Fase 8: Restore Procedures (Testing) + +**8.1 Restore VM Teste** + +Via Web UI PVE: +- Storage → pbs-main → Backups +- Seleccionar VM backup +- Restore → New VM ID (999) +- Start após restore + +**8.2 Restore via CLI** +```bash +# Listar backups disponíveis +pbs-client list --repository pve-backup@pbs@SERVER_IP:main-store + +# Restore VM 100 +qmrestore pbs-main:backup/vm/100/YYYY-MM-DD... 999 +``` + +**8.3 Validar Restore** +```bash +qm start 999 +# Verificar VM boota correctamente +# Teste serviço critical +# Shutdown e remover VM teste +qm stop 999 && qm destroy 999 +``` + +**CRITICAL:** Testar restore ANTES de considerar backup strategy operacional. + +## Output Summary + +``` +✅ PBS configurado: SERVER_IP:8007 + +💾 Datastore: + - Name: main-store + - Path: /mnt/pbs-datastore + - Size: 16TB (HDD) ou 1TB (NVMe) + - Deduplication: ON (PBS chunk-based) + - Compression: LZ4 (ZFS) + zstd (PBS) + +📋 Retention Policy: + - Daily: 7 backups + - Weekly: 4 backups + - Monthly: 6 backups + - Yearly: 3 backups + - Auto-prune: Yes + +🔐 Access: + - User: pve-backup@pbs + - Token: automation-token (para CI/CD) + - Role: DatastoreBackup + +⏰ Backup Schedule: + - Critical VMs (100-102): Diário 01:00 + - Secondary VMs (200-202): Seg/Qua/Sex 01:00 + - GC: Domingo 02:00 + +🔄 Remote Sync (se cluster): + - Source: pbs-node-b (Node B) + - Target: secondary-store (Node A) + - Schedule: Diário 03:00 + - Remove vanished: Yes + +📊 Expected Metrics: + - Dedup ratio: 1.5-2.5x + - Compression ratio: 1.3-1.8x + - Backup speed: 100-300 MB/s (depende network/disk) + - Restore RTO: 2-4h (para VM 100GB) + +✅ Validation Tests: + ✓ Primeiro backup successful + ✓ Restore test VM 999 + ✓ Dedup ratio >1.3x + ✓ Remote sync (se cluster) + ✓ Email notifications working + +📋 Next Steps: + 1. Configurar backup VMs production (/vm-migration) + 2. Criar off-site backup (S3/Wasabi/Hetzner Storage Box) + 3. Documentar restore procedures em PROC-Backup-Restore.md + 4. Testar disaster recovery completo + 5. Monitorizar disk usage PBS (alertar >80%) + +⏱️ Setup time: ~30min (vs 1h manual) +``` + +## Estratégia 3-2-1 Backup + +**Implementation para Cluster Descomplicar:** + +**3 cópias:** +1. **Original:** VMs em Node A (produção) +2. **Backup primário:** PBS Node B (16TB HDD) +3. **Backup secundário:** PBS Node A remote sync (12TB HDD) + +**2 médias diferentes:** +1. NVMe (VMs produção) +2. HDD Enterprise (PBS datastores) + +**1 off-site:** +- **Opção A:** Hetzner Storage Box (rsync daily) +- **Opção B:** S3-compatible (Wasabi/Backblaze) +- **Opção C:** PBS em VPS externo + +**RPO:** 1h (backups hourly se critical) +**RTO:** 2-4h (restore + validação) + +## PBS Advanced Features + +### Verification Jobs +```bash +# Verificar integridade backups +proxmox-backup-manager verify-job create verify-main \ + --store main-store \ + --schedule "0 4 * * 0" # Domingo 04:00 +``` + +### Namespace Organization +```bash +# Organizar backups por tipo +proxmox-backup-manager namespace create main-store/production +proxmox-backup-manager namespace create main-store/testing +proxmox-backup-manager namespace create main-store/archived +``` + +### Tape Backup (futuro) +- PBS suporta LTO tape +- Para compliance de longo prazo +- Cold storage + +## Troubleshooting + +### Backup failing: "no space" +```bash +# Verificar disk usage +df -h /mnt/pbs-datastore + +# Run GC manual +proxmox-backup-manager garbage-collection start main-store + +# Ajustar retention (reduzir keeps) +proxmox-backup-manager datastore update main-store --keep-daily 5 +``` + +### Remote sync not working +```bash +# Verificar conectividade +ping + +# Testar autenticação +curl -k https://:8007/api2/json/access/ticket \ + -d "username=pve-backup@pbs&password=" + +# Logs +journalctl -u proxmox-backup -f +``` + +### Dedup ratio baixo (<1.2x) +```bash +# Verificar se VMs têm dados compressíveis +# VMs com random data (encrypted) não deduplica bem + +# Verificar chunk size (padrão 4MB adequado) +proxmox-backup-manager datastore show main-store +``` + +## References + +- **NotebookLM:** 276ccdde-6b95-42a3-ad96-4e64d64c8d52 +- **PBS Docs:** https://pbs.proxmox.com/docs/ +- **Guia Hub:** Hub/05-Projectos/Cluster Descomplicar/Research/Proxmox-VE/Guia-Definitivo-Proxmox-Hetzner.md (Módulo 3) + +--- + +**Versão:** 1.0.0 | **Autor:** Descomplicar® | **Data:** 2026-02-14 + +## Metadata (Desk CRM Task #1712) + +``` +Projeto: Cluster Proxmox Descomplicar (#65) +Tarefa: Migração Infraestrutura (#1712) +Tags: pbs, backup, retention, deduplication, sync +Status: Research → Implementation +``` + +--- + +**/** @author Descomplicar® | @link descomplicar.pt | @copyright 2026 **/ + +--- + +## Quando NÃO Usar + +- Para backups ad-hoc manuais (usar vzdump directo) +- Para PBS já configurado (usar troubleshooting guides) +- Para restore procedures (criar skill específica se necessário) diff --git a/infraestrutura/skills/proxmox-cluster/SKILL.md b/infraestrutura/skills/proxmox-cluster/SKILL.md new file mode 100644 index 0000000..518fc48 --- /dev/null +++ b/infraestrutura/skills/proxmox-cluster/SKILL.md @@ -0,0 +1,478 @@ +--- +name: proxmox-cluster +description: Formar cluster Proxmox 2+ nodes com Corosync e Quorum. Use when user mentions "create cluster", "proxmox cluster", "pvecm", "join node", "cluster formation". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 75 +user_invocable: true +desk_task: 1712 +allowed-tools: Task, Read, Bash +dependencies: + - ssh-unified + - notebooklm + - proxmox-setup +--- + +# Proxmox Cluster + +Formar cluster Proxmox 2+ nodes com Corosync, Quorum e preparação para High Availability. + +## Quando Usar + +- Formar cluster 2-node após migration complete +- Adicionar node a cluster existente +- Configurar quorum e fencing +- Preparar para HA (skill /proxmox-ha) + +## Sintaxe + +```bash +/proxmox-cluster create --node-a --node-b [--cluster-name] +/proxmox-cluster join --node --cluster +``` + +## Exemplos + +```bash +# Criar cluster 2-node +/proxmox-cluster create --node-a server.descomplicar.pt --node-b cluster.descomplicar.pt --cluster-name descomplicar + +# Adicionar 3º node +/proxmox-cluster join --node pve-node3.descomplicar.pt --cluster cluster.descomplicar.pt +``` + +## Knowledge Sources + +### NotebookLM +```bash +mcp__notebooklm__notebook_query \ + notebook_id:"276ccdde-6b95-42a3-ad96-4e64d64c8d52" \ + query:"proxmox cluster corosync quorum pvecm ha" +``` + +## Workflow Completo + +### Pre-Requisites + +**1. Verificar Nodes Prontos** +```bash +# Ambos nodes devem ter: +- Proxmox VE 8.x instalado (/proxmox-setup) +- Networking configurado (NAT ou vSwitch) +- PBS configurado (/pbs-config) +- Mesma versão PVE +- Hostnames únicos +- Conectividade IP entre nodes +``` + +**2. Validar Conectividade** +```bash +# De Node A → Node B +ping -c 3 +ssh root@ pveversion + +# De Node B → Node A +ping -c 3 +ssh root@ pveversion +``` + +**3. Sincronizar Time (CRITICAL)** +```bash +# Ambos nodes devem ter NTP configurado +timedatectl status + +# Instalar chrony se necessário +apt install chrony +systemctl enable --now chronyd +``` + +**4. Backup Pre-Cluster** +```bash +# Backup configs de ambos nodes +tar -czf /tmp/pre-cluster-backup.tar.gz /etc/pve /etc/network + +# Transfer para PBS +``` + +### Fase 1: Cluster Creation (Node B) + +**1.1 Criar Cluster em Node B (Primeiro Node)** +```bash +# SSH to Node B (cluster.descomplicar.pt) +ssh root@ + +# Criar cluster +pvecm create descomplicar + +# Verificar +pvecm status + +# Expected output: +# Cluster information +# Name: descomplicar +# Nodes: 1 +# Expected votes: 1 +``` + +**1.2 Obter Cluster Join Info** +```bash +# Obter join information (para Node A) +pvecm nodes + +# Anot IP e nome do cluster +``` + +### Fase 2: Join Node A ao Cluster + +**2.1 Join Node A** +```bash +# SSH to Node A (server.descomplicar.pt) +ssh root@ + +# Join cluster (fornecer IP do Node B) +pvecm add + +# Durante processo: +# - Solicita password root do Node B +# - Transfere configuração cluster +# - Copia /etc/pve/ +# - Reinicia serviços cluster + +# AGUARDAR ~2-5min +``` + +**2.2 Verificar Join Successful** +```bash +# Em Node A: +pvecm status + +# Expected output: +# Nodes: 2 +# Expected votes: 2 +# Quorum: 2 (Active) + +# Listar nodes +pvecm nodes + +# Should show both nodes +``` + +**2.3 Verificar Replicação /etc/pve/** +```bash +# Em Node A: +ls -lah /etc/pve/ + +# Should see: +# - nodes/ (ambos nodes) +# - qemu-server/ (VMs) +# - lxc/ (containers) +# - storage.cfg (shared) + +# Teste: Criar VM em Node A via Web UI +# Verificar aparece em Node B também +``` + +### Fase 3: Quorum Configuration + +**3.1 Verificar Quorum Votes** +```bash +pvecm status | grep "Expected votes" + +# 2-node cluster: +# Expected votes: 2 +# Quorum: 2 + +# CRITICAL: Com 2 nodes, perder 1 node = perder quorum +``` + +**3.2 Configurar QDevice (Opcional - 2-node clusters)** + +**Problema 2-node cluster:** Se 1 node falha, cluster perde quorum (não pode fazer alterações). + +**Solução:** Adicionar QDevice externo (3º vote) + +```bash +# Em VPS externo leve (ou Raspberry Pi): +apt install corosync-qnetd + +# Em ambos PVE nodes: +apt install corosync-qdevice + +# Configurar QDevice (em Node A ou B): +pvecm qdevice setup + +# Verificar +pvecm status +# Expected votes: 3 (2 nodes + 1 qdevice) +``` + +**Recomendação Cluster Descomplicar:** +- Iniciar sem QDevice (aceitar limitação 2-node) +- Adicionar QDevice futuro se necessário +- Ou adicionar 3º node físico + +### Fase 4: Storage Configuration + +**4.1 Configurar Shared Storage (Opcional)** + +**Opções:** +- NFS share +- Ceph (mínimo 3 nodes) +- ZFS replication (não shared, mas sync) + +**Para 2-node sem shared storage:** +- VMs ficam em local storage de cada node +- Live migration copia disk (mais lento mas funciona) +- HA usa storage replication ou aceita downtime de boot + +**4.2 Configurar PBS como Shared** +```bash +# PBS já configurado (/pbs-config) +# Adicionar PBS storage em ambos nodes via Web UI + +# Datacenter → Storage → Add → Proxmox Backup Server +# ID: pbs-main +# Server: +# Datastore: main-store +# Content: VZDump backup files +# Nodes: ALL +``` + +### Fase 5: Networking Validation + +**5.1 Verificar Cluster Network** +```bash +# Verificar Corosync usa network correcta +cat /etc/pve/corosync.conf + +# Deve usar IP management (não vSwitch) +# bindnetaddr: +``` + +**5.2 Testar Latência Entre Nodes** +```bash +# De Node A → Node B +ping -c 100 | tail -5 + +# Expected: <5ms latency (mesma datacenter) +# CRITICAL: >10ms pode causar issues cluster +``` + +**5.3 Configurar Cluster Network Redundancy (Opcional)** +```bash +# Se múltiplas networks disponíveis: +pvecm update-ring -interface + +# Adicionar 2º ring (redundância) +# Requer 2 NICs ou VLANs separadas +``` + +### Fase 6: Firewall Cluster + +**6.1 Portas Necessárias (abrir entre nodes)** +```bash +# Corosync: +UDP 5404-5405 + +# PVE cluster: +TCP 22 (SSH) +TCP 8006 (Web UI) +TCP 3128 (SPICE proxy) +TCP 85 (pvedaemon) + +# Verificar firewall permite +iptables -L -n -v | grep 5404 +``` + +**6.2 Firewall Proxmox (Web UI)** +```bash +# Datacenter → Firewall → Options +# Enable firewall: NO (inicialmente, configurar depois) + +# Se enable: +# - Adicionar rules para cluster communication +# - Testar conectividade antes de aplicar +``` + +### Fase 7: Validation Tests + +**7.1 Cluster Status** +```bash +# Ambos nodes: +pvecm status + +# Expected: +# Quorum: Active +# Nodes: 2 +# Total votes: 2 +# Node online: 2 +``` + +**7.2 Criar VM Teste** +```bash +# Node A: Criar VM 999 +qm create 999 --name cluster-test --memory 512 --cores 1 + +# Node B: Verificar VM aparece +qm list | grep 999 + +# Deve aparecer em ambos (shared /etc/pve/) +``` + +**7.3 Migrar VM Entre Nodes (Offline)** +```bash +# Migração offline (sem shared storage) +qm migrate 999 + +# Aguardar transfer completo +# Verificar VM migrou +``` + +**7.4 Simular Falha Node (CUIDADO)** +```bash +# Em ambiente teste: +# Shutdown Node B +systemctl stop pve-cluster corosync + +# Node A deve continuar funcional +# Mas quorum perdido (2-node limitation) + +# Reactivar Node B +systemctl start corosync pve-cluster + +# Quorum restaura automaticamente +``` + +## Output Summary + +``` +✅ Cluster Proxmox formado: descomplicar + +🖥️ Nodes: + - Node A: server.descomplicar.pt (138.201.X.X) + - Node B: cluster.descomplicar.pt (138.201.X.X) + - Total: 2 nodes + +🗳️ Quorum: + - Expected votes: 2 + - Active votes: 2 + - Status: Active ✓ + +📁 Shared Config: + - /etc/pve/ replicated + - VMs visible em ambos nodes + - Storage config synced + +💾 Storage: + - Local: ZFS rpool em cada node + - Backup: PBS shared (pbs-main) + - [Futuro] Shared storage: Ceph ou NFS + +🔄 Migration: + - Offline migration: Enabled ✓ + - Live migration: Enabled (sem shared storage = slow) + - HA: Ready (configurar com /proxmox-ha) + +⚠️ Limitations (2-node cluster): + - Perder 1 node = perder quorum + - Solução: QDevice ou 3º node + - HA com fencing crítico + +📋 Next Steps: + 1. Configurar HA groups (/proxmox-ha) + 2. Configurar fencing devices + 3. Testar failover automático + 4. Migrar VMs production para cluster + 5. Monitorizar cluster health + +⏱️ Formation time: ~15min +``` + +## 2-Node Cluster Considerations + +### Quorum Issue +**Problema:** Perder 1 node = perder quorum (cluster read-only) + +**Mitigações:** +1. **QDevice externo** (3º vote em VPS leve) +2. **expected_votes override** (emergência - perigoso) +3. **Adicionar 3º node** (ideal) + +### Fencing CRITICAL +**Problema:** Split-brain (ambos nodes pensam que são primários) + +**Solução:** Fencing obrigatório para HA +- STONITH (Shoot The Other Node In The Head) +- Power fencing via IPMI/iLO +- Network fencing (menos confiável) + +### No Shared Storage +**Implicações:** +- Live migration mais lenta (copia disk) +- HA requer storage replication ou aceita downtime +- VMs ficam "pinned" ao node onde disk existe + +**Alternativas:** +- Ceph (mínimo 3 nodes) +- NFS share externo +- ZFS replication (pvesr) + +## Troubleshooting + +### Node join fails +```bash +# Verificar conectividade +ping +ssh root@ + +# Verificar versões matching +pveversion + +# Verificar /etc/hosts +cat /etc/hosts +# Deve ter entrada para ambos nodes + +# Logs +journalctl -u pve-cluster -f +journalctl -u corosync -f +``` + +### Quorum lost +```bash +# Verificar status +pvecm status + +# Nodes online mas quorum lost: +# - Verificar time sync (ntpd/chrony) +# - Verificar network latency +# - Restart corosync + +systemctl restart corosync pve-cluster +``` + +### Split-brain +```bash +# CRITICAL: Ambos nodes pensam que são primários + +# Identificar: +pvecm status # Em ambos nodes, status diferente + +# Resolver: +# 1. Shutdown 1 node completamente +# 2. Fix networking/corosync no node online +# 3. Rejoin node shutdown +``` + +## References + +- **NotebookLM:** 276ccdde-6b95-42a3-ad96-4e64d64c8d52 +- **Proxmox Cluster Docs:** https://pve.proxmox.com/pve-docs/chapter-pvecm.html +- **Corosync:** https://corosync.github.io/corosync/ + +--- + +**Versão:** 1.0.0 | **Autor:** Descomplicar® | **Data:** 2026-02-14 + +--- + +**/** @author Descomplicar® | @copyright 2026 **/ diff --git a/infraestrutura/skills/proxmox-ha/SKILL.md b/infraestrutura/skills/proxmox-ha/SKILL.md new file mode 100644 index 0000000..b8b91a7 --- /dev/null +++ b/infraestrutura/skills/proxmox-ha/SKILL.md @@ -0,0 +1,524 @@ +--- +name: proxmox-ha +description: Configurar High Availability (HA) em cluster Proxmox - resource groups, fencing, failover automático. Use when user mentions "configure ha", "proxmox ha", "high availability", "failover", "ha manager". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 75 +user_invocable: true +desk_task: 1712 +allowed-tools: Task, Read, Bash +dependencies: + - ssh-unified + - notebooklm + - proxmox-cluster +--- + +# Proxmox HA + +Configurar High Availability (HA) em cluster Proxmox com HA Manager, fencing devices e failover automático para VMs críticas. + +## Quando Usar + +- Configurar HA após cluster formation (/proxmox-cluster) +- Proteger VMs críticas com failover automático +- Configurar fencing devices (STONITH) +- Definir HA groups por criticidade +- Testar failover procedures + +## Sintaxe + +```bash +/proxmox-ha configure --critical-vms [--fencing watchdog|ipmi] [--max-relocate 2] +``` + +## Exemplos + +```bash +# HA para VMs críticas com watchdog +/proxmox-ha configure --critical-vms 200,300 --fencing watchdog + +# HA com IPMI fencing (hardware) +/proxmox-ha configure --critical-vms 200,300,301 --fencing ipmi --max-relocate 1 + +# Apenas testar failover (sem activar HA) +/proxmox-ha test --vm 999 +``` + +## Knowledge Sources + +### NotebookLM +```bash +mcp__notebooklm__notebook_query \ + notebook_id:"276ccdde-6b95-42a3-ad96-4e64d64c8d52" \ + query:"proxmox ha high availability fencing stonith failover" +``` + +## Workflow Completo + +### Pre-Requisites + +**1. Cluster Formado** +```bash +# Verificar cluster healthy +pvecm status + +# Expected: +# Quorum: Active +# Nodes: 2+ online +``` + +**2. Shared Storage ou Replication** + +**Opções:** +- **Shared storage** (NFS, Ceph): HA ideal (failover <30s) +- **No shared storage**: Requer ZFS replication ou aceita boot time failover (~2-5min) + +**Para Cluster Descomplicar (sem shared storage):** +```bash +# Aceitar boot-time failover +# OU configurar ZFS replication: + +# Node A: +zfs snapshot rpool/vm-disks@ha-sync +zfs send rpool/vm-disks@ha-sync | ssh root@ zfs receive rpool/vm-disks-replica + +# Automatizar com pvesr (Proxmox Storage Replication) +``` + +**3. Fencing Device Configurado** + +**CRITICAL:** Sem fencing = risco split-brain + +### Fase 1: Fencing Configuration + +**1.1 Opção A: Watchdog (Software Fencing)** + +**Mais simples, menos confiável:** +```bash +# Instalar watchdog em ambos nodes +apt install watchdog + +# Load kernel module +modprobe softdog + +# Auto-load on boot +echo "softdog" >> /etc/modules + +# Configurar HA Manager para usar watchdog +# (automático quando HA activado) +``` + +**1.2 Opção B: IPMI/iLO (Hardware Fencing)** + +**Mais confiável, requer IPMI:** +```bash +# Verificar IPMI disponível +ipmitool lan print + +# Configurar IPMI credentials (via BIOS ou ipmitool) + +# Configurar em Proxmox (Web UI): +# Datacenter → Fencing → Add +# Type: IPMI +# IP: +# Username: admin +# Password: + +# Test +fence_ipmilan -a -l admin -p -o status +``` + +**1.3 Opção C: Network Fencing (Menos Confiável)** + +**Usar apenas se IPMI não disponível:** +```bash +# SSH-based fencing (perigoso) +# Depende de network estar up +# Não recomendado para production +``` + +**Recomendação Cluster Descomplicar:** +- **Início:** Watchdog (simple, funcional) +- **Produção:** IPMI se hardware suporta +- **Evitar:** Network fencing + +### Fase 2: HA Manager Configuration + +**2.1 Enable HA Manager** +```bash +# Automático quando cluster formado +# Verificar status +ha-manager status + +# Expected: +# quorum: OK +# master: (elected) +# lrm: active +``` + +**2.2 Criar HA Groups (Opcional)** + +**HA Groups por criticidade:** +```bash +# Via Web UI: Datacenter → HA → Groups → Add + +# Critical (priority 100) +ha-manager groupadd critical \ + --nodes "server.descomplicar.pt:100,cluster.descomplicar.pt:100" + +# Medium (priority 50) +ha-manager groupadd medium \ + --nodes "server.descomplicar.pt:50,cluster.descomplicar.pt:50" + +# Low (priority 10) +ha-manager groupadd low \ + --nodes "server.descomplicar.pt:10,cluster.descomplicar.pt:10" +``` + +**Priority explicação:** +- Higher priority = preferência para correr nesse node +- Usado para balancear carga +- Em failover, ignora priority (vai para node disponível) + +### Fase 3: Add VMs to HA + +**3.1 Adicionar VMs Críticas** + +**Via Web UI:** +- Seleccionar VM → More → Manage HA +- Enable HA +- Group: critical +- Max restart: 3 +- Max relocate: 2 + +**Via CLI:** +```bash +# VM 200 (EasyPanel Docker) +ha-manager add vm:200 \ + --group critical \ + --max_restart 3 \ + --max_relocate 2 \ + --state started + +# VM 300 (CWP) +ha-manager add vm:300 \ + --group critical \ + --max_restart 3 \ + --max_relocate 2 \ + --state started +``` + +**Parâmetros:** +- `max_restart`: Tentativas restart no mesmo node antes de relocate +- `max_relocate`: Máximo relocates entre nodes +- `state started`: HA Manager garante VM está sempre started + +**3.2 Verificar HA Resources** +```bash +ha-manager status + +# Should show: +# vm:200: started on +# vm:300: started on +``` + +### Fase 4: Failover Testing + +**4.1 Criar VM Teste HA** +```bash +# VM 999 para teste (não production) +qm create 999 --name ha-test --memory 512 --cores 1 + +# Adicionar a HA +ha-manager add vm:999 --state started +``` + +**4.2 Testar Failover Automático** + +**Teste 1: Shutdown Clean** +```bash +# Node onde VM 999 corre: +qm shutdown 999 + +# HA Manager deve: +# 1. Detectar shutdown (~30s) +# 2. Tentar restart no mesmo node (max_restart vezes) +# 3. Se continua down → relocate para outro node + +# Monitorizar +watch -n 1 'ha-manager status | grep vm:999' +``` + +**Teste 2: Node Crash (Simulado)** +```bash +# CUIDADO: Apenas em teste, não production + +# Shutdown abrupto do node onde VM 999 corre +# (simula hardware failure) +echo b > /proc/sysrq-trigger # Reboot forçado + +# Outro node deve: +# 1. Detectar node down via quorum (~1min) +# 2. Fence node (via watchdog/IPMI) +# 3. Boot VM 999 no node surviving + +# Timeline esperado: +# - 0s: Node crash +# - ~60s: Quorum detecta node missing +# - ~90s: Fencing executado +# - ~120s: VM boota em outro node + +# Total downtime: ~2-3min (sem shared storage) +# Com shared storage: ~30-60s +``` + +**4.3 Testar Live Migration Manual** +```bash +# Migration manual (com VM running) +qm migrate 999 --online + +# Com shared storage: <10s downtime +# Sem shared storage: copia disk = lento (GB/min) + +# Para production VMs: +# - Fazer em janela manutenção se sem shared storage +# - Live migration OK se shared storage +``` + +### Fase 5: HA Policies & Tunning + +**5.1 Configurar Shutdown Policy** +```bash +# Default: conditional (HA Manager decide) +# Opções: conditional, freeze, failover, migrate + +# Para VMs críticas que NÃO devem migrar durante manutenção: +ha-manager set vm:200 --state freeze + +# Para forçar migrate durante manutenção: +ha-manager set vm:200 --state migrate +``` + +**5.2 Maintenance Mode** +```bash +# Colocar node em maintenance (não recebe novos VMs HA) +ha-manager set-node-state maintenance + +# VMs HA existentes: +# - Não migram automaticamente +# - Mas não recebem novas em failover + +# Sair de maintenance +ha-manager set-node-state active +``` + +**5.3 Configurar Priorities (Load Balance)** +```bash +# Preferência de nodes por VM + +# VM 200: Preferir Node B +ha-manager set vm:200 --group critical --restricted + +# restricted: VM só corre nos nodes do grupo +# unrestricted: VM pode correr em qualquer node (fallback) +``` + +### Fase 6: Monitoring & Alerts + +**6.1 HA Manager Logs** +```bash +# Logs HA Manager +journalctl -u pve-ha-lrm -f # Local Resource Manager +journalctl -u pve-ha-crm -f # Cluster Resource Manager + +# Ver decisões de failover +grep "migrate\|relocate" /var/log/pve/tasks/index +``` + +**6.2 Configurar Alertas** +```bash +# Via Web UI: Datacenter → Notifications + +# Email alerts para: +# - Node down +# - Quorum lost +# - VM failover events +# - Fencing executed + +# SMTP: mail.descomplicar.pt +# To: admin@descomplicar.pt +``` + +**6.3 Monitorização Contínua** +```bash +# Script de monitoring (cron cada 5min) +#!/bin/bash +# /usr/local/bin/check-ha-health.sh + +ha_status=$(ha-manager status | grep "quorum:" | awk '{print $2}') + +if [ "$ha_status" != "OK" ]; then + echo "HA Quorum NOT OK" | mail -s "ALERT: HA Issue" admin@descomplicar.pt +fi + +# Cron +# */5 * * * * /usr/local/bin/check-ha-health.sh +``` + +### Fase 7: Production Rollout + +**7.1 Migrar VMs Production para HA** + +**Phased approach:** +```bash +# Week 1: VMs não-críticas (teste) +ha-manager add vm:250 --group low + +# Week 2: VMs médias (se Week 1 OK) +ha-manager add vm:201,202 --group medium + +# Week 3: VMs críticas (se tudo OK) +ha-manager add vm:200,300 --group critical +``` + +**7.2 Documentar Runbook** + +**Criar:** `06-Operacoes/Procedimentos/D7-Tecnologia/PROC-HA-Failover.md` + +**Conteúdo:** +- Detectar failover event +- Validar VM booted corretamente +- Investigar causa node failure +- Restore node original +- Migrate VM back (se necessário) + +## Output Summary + +``` +✅ HA configurado: Cluster descomplicar + +🛡️ Fencing: + - Type: Watchdog (softdog) + - Nodes: 2 nodes configured + - Test: Successful ✓ + +📋 HA Groups: + - Critical (priority 100): 2 VMs + - Medium (priority 50): 0 VMs + - Low (priority 10): 0 VMs + +🖥️ HA Resources: + - vm:200 (EasyPanel) - Critical + - vm:300 (CWP) - Critical + - Max restart: 3 + - Max relocate: 2 + +⚡ Failover Tests: + ✓ Clean shutdown → Auto restart + ✓ Node crash → Relocate (~2min) + ✓ Live migration → <10s downtime + +📊 Expected Metrics: + - Detection time: ~60s + - Fencing time: ~30s + - Boot time: ~60-120s + - Total failover: ~2-3min (sem shared storage) + +⚠️ Limitations (sem shared storage): + - Failover = boot time (não instant) + - Live migration copia disk (lento) + - Considerar shared storage futuro + +🔔 Monitoring: + - Quorum check: cada 5min + - Alerts: Email admin@descomplicar.pt + - Logs: journalctl -u pve-ha-* + +📋 Next Steps: + 1. Monitorizar por 30 dias + 2. Adicionar mais VMs a HA gradualmente + 3. Considerar shared storage (NFS/Ceph) + 4. Documentar procedures em PROC-HA-Failover.md + 5. Treinar equipa em failover manual + +⏱️ Configuration time: ~30min +``` + +## Best Practices + +### DO +- ✅ Testar failover em VMs teste ANTES production +- ✅ Configurar fencing (watchdog mínimo, IPMI ideal) +- ✅ Monitorizar quorum 24/7 +- ✅ Documentar runbooks failover +- ✅ Alerts email para eventos críticos +- ✅ Backup ANTES activar HA + +### DON'T +- ❌ HA sem fencing (risco split-brain) +- ❌ max_relocate muito alto (VM fica "bouncing") +- ❌ Assumir instant failover sem shared storage +- ❌ Testar failover em production sem plano +- ❌ Ignorar quorum warnings + +## Troubleshooting + +### VM não failover +```bash +# Verificar HA enabled +ha-manager status | grep vm:ID + +# Verificar quorum +pvecm status + +# Verificar fencing functional +# (watchdog ou IPMI test) + +# Logs +journalctl -u pve-ha-crm -f +``` + +### Split-brain detected +```bash +# CRITICAL: Ambos nodes pensam que são master + +# Shutdown 1 node completamente +systemctl poweroff + +# No node restante: +pvecm expected 1 # Force quorum com 1 node + +# Resolver networking +# Rejoin node shutdown +``` + +### Failover loop (VM keeps restarting) +```bash +# VM falha → restart → falha → restart + +# Verificar: +# 1. VM logs (qm log ID) +# 2. max_restart atingido? +# 3. Problema configuração VM? + +# Pause HA temporário +ha-manager set vm:ID --state disabled + +# Fix VM issue +# Re-enable HA +ha-manager set vm:ID --state started +``` + +## References + +- **NotebookLM:** 276ccdde-6b95-42a3-ad96-4e64d64c8d52 +- **HA Manager Docs:** https://pve.proxmox.com/pve-docs/ha-manager.1.html +- **Fencing:** https://pve.proxmox.com/wiki/Fencing + +--- + +**Versão:** 1.0.0 | **Autor:** Descomplicar® | **Data:** 2026-02-14 + +--- + +**/** @author Descomplicar® | @copyright 2026 **/ diff --git a/infraestrutura/skills/proxmox-setup/SKILL.md b/infraestrutura/skills/proxmox-setup/SKILL.md new file mode 100644 index 0000000..bbad354 --- /dev/null +++ b/infraestrutura/skills/proxmox-setup/SKILL.md @@ -0,0 +1,532 @@ +--- +name: proxmox-setup +description: Instalação completa de Proxmox VE 8.x em Hetzner - installimage, ZFS RAID-1, NAT networking, vSwitch. Use when user mentions "proxmox install", "setup proxmox", "proxmox hetzner", "new proxmox node". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 75 +user_invocable: true +desk_task: 1712 +allowed-tools: Task, Read, Bash +dependencies: + - ssh-unified + - notebooklm +--- + +# Proxmox Setup + +Instalação completa e configuração de Proxmox VE 8.x em servidor dedicado Hetzner com ZFS RAID-1, networking NAT single-IP e optimizações. + +## Quando Usar + +- Instalar novo node Proxmox em servidor Hetzner +- Setup inicial com ZFS mirror NVMe +- Configurar networking NAT para single-IP +- Preparar node para clustering futuro +- Aplicar Hetzner-specific gotchas e optimizações + +## Sintaxe + +```bash +/proxmox-setup [--zfs-pool rpool] [--arc-max 16G] [--vswitch] +``` + +## Exemplos + +```bash +# Setup básico single-IP NAT +/proxmox-setup 138.201.45.67 cluster.descomplicar.pt + +# Setup com vSwitch (MTU 1400) +/proxmox-setup 138.201.45.67 cluster.descomplicar.pt --vswitch + +# Custom ZFS ARC (para 64GB RAM) +/proxmox-setup 138.201.45.67 pve-node1.descomplicar.pt --arc-max 8G +``` + +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM Proxmox Research +```bash +mcp__notebooklm__notebook_query \ + notebook_id:"276ccdde-6b95-42a3-ad96-4e64d64c8d52" \ + query:"proxmox installation hetzner zfs networking" +``` + +### Hub Docs +- `/media/ealmeida/Dados/Hub/05-Projectos/Cluster Descomplicar/Research/Proxmox-VE/Guia-Definitivo-Proxmox-Hetzner.md` +- Módulo 1: Instalação (installimage, ZFS vs LVM, Kernel PVE) +- Módulo 2: Networking (NAT masquerading, vSwitch MTU 1400) + +## Workflow Completo + +### Fase 1: Pre-Installation Checks + +**1.1 Verificar Rescue Mode** +```bash +# Via SSH MCP +mcp__ssh-unified__ssh_execute \ + server:"hetzner-rescue" \ + command:"uname -a && df -h" + +# Expected: rescue kernel, /dev/md* present +``` + +**1.2 Consultar NotebookLM para Hardware Specs** +```bash +# Query: "hetzner installimage zfs raid configuration" +# Obter template correcto para specs do servidor +``` + +**1.3 Backup de Configuração Actual (se aplicável)** +```bash +ssh root@SERVER_IP "tar -czf /tmp/backup-configs.tar.gz /etc /root" +scp root@SERVER_IP:/tmp/backup-configs.tar.gz ~/backups/ +``` + +### Fase 2: installimage com ZFS RAID-1 + +**2.1 Criar Template installimage** + +Template base para 2x NVMe 1TB + HDD 16TB: +```bash +DRIVE1 /dev/nvme0n1 +DRIVE2 /dev/nvme1n1 +SWRAID 0 +SWRAIDLEVEL 0 +BOOTLOADER grub +HOSTNAME HOSTNAME_PLACEHOLDER +PART /boot ext3 1024M +PART lvm vg0 all + +LV vg0 root / ext4 50G +LV vg0 swap swap swap 16G +LV vg0 tmp /tmp ext4 10G +LV vg0 home /home ext4 20G + +IMAGE /root/images/Debian-bookworm-latest-amd64-base.tar.gz +``` + +**CRITICAL: Depois de boot, converter para ZFS:** + +**2.2 Executar installimage** +```bash +# No Rescue Mode +installimage + +# Seleccionar Debian 12 (Bookworm) +# Copiar template acima +# Salvar e confirmar +# Reboot automático +``` + +**2.3 Conversão para ZFS (Pós-Install)** + +**IMPORTANTE:** installimage não suporta ZFS directamente. Workflow: +1. Instalar Debian 12 com LVM (installimage) +2. Boot em Debian +3. Instalar ZFS + Proxmox +4. Migrar para ZFS pool (ou aceitar LVM para root, ZFS para VMs) + +**Opção A: ZFS para VMs apenas (RECOMENDADO para Hetzner)** +```bash +# Criar ZFS pool em NVMe para VMs +zpool create -f \ + -o ashift=12 \ + -o compression=lz4 \ + -o atime=off \ + rpool mirror /dev/nvme0n1p3 /dev/nvme1n1p3 + +# Criar datasets +zfs create rpool/vm-disks +zfs create rpool/ct-volumes +``` + +**Opção B: ZFS root (AVANÇADO - requer reinstall manual)** +- Não suportado por installimage +- Requer particionamento manual + debootstrap +- Consultar: https://pve.proxmox.com/wiki/ZFS_on_Linux + +**Recomendação para Cluster Descomplicar:** Opção A (LVM root, ZFS para VMs) + +### Fase 3: Proxmox VE 8.x Installation + +**3.1 Configurar Repositórios Proxmox** +```bash +# Adicionar repo Proxmox +echo "deb [arch=amd64] http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list + +# Adicionar key +wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg + +# Update +apt update && apt full-upgrade +``` + +**3.2 Instalar Proxmox VE** +```bash +apt install proxmox-ve postfix open-iscsi chrony +``` + +**Configuração Postfix:** +- Seleccionar "Local only" +- System mail name: HOSTNAME + +**3.3 Remover Kernel Debian (usar PVE kernel)** +```bash +# Verificar kernel actual +uname -r # Should be pve kernel + +# Remover kernel Debian se boot em PVE kernel +apt remove linux-image-amd64 'linux-image-6.1*' +update-grub +``` + +**3.4 Reboot em Proxmox Kernel** +```bash +reboot +``` + +### Fase 4: ZFS Tuning (128GB RAM) + +**4.1 Configurar ARC Limits** +```bash +# ARC max 16GB (deixa 110GB para VMs) +# ARC min 4GB +echo "options zfs zfs_arc_max=17179869184" >> /etc/modprobe.d/zfs.conf +echo "options zfs zfs_arc_min=4294967296" >> /etc/modprobe.d/zfs.conf + +# Aplicar +update-initramfs -u -k all +``` + +**4.2 Optimizar ZFS para NVMe** +```bash +# Verificar ashift (deve ser 12 para NVMe 4K sectors) +zdb -C rpool | grep ashift + +# Activar compression LZ4 (se ainda não) +zfs set compression=lz4 rpool + +# Disable atime (performance) +zfs set atime=off rpool + +# Snapshot visibility +zfs set snapdir=hidden rpool +``` + +**4.3 Criar ZFS Datasets para PBS (se HDD 16TB)** +```bash +# Dataset para PBS datastore +zfs create rpool/pbs-datastore +zfs set mountpoint=/mnt/pbs-datastore rpool/pbs-datastore +zfs set compression=lz4 rpool/pbs-datastore +zfs set dedup=off rpool/pbs-datastore +``` + +### Fase 5: Networking NAT (Single-IP Hetzner) + +**5.1 Configurar /etc/network/interfaces** + +**Template para Single-IP NAT:** +```bash +auto lo +iface lo inet loopback + +# Interface física (verificar nome com 'ip a') +auto eno1 +iface eno1 inet static + address SERVER_IP/32 + gateway GATEWAY_IP + pointopoint GATEWAY_IP + +# Bridge interna para VMs (NAT) +auto vmbr0 +iface vmbr0 inet static + address 10.10.10.1/24 + bridge-ports none + bridge-stp off + bridge-fd 0 + + # NAT masquerading + post-up echo 1 > /proc/sys/net/ipv4/ip_forward + post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE + post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE +``` + +**CRITICAL Hetzner Gotchas:** +- Gateway /32 point-to-point (não /24 ou /26) +- IP e gateway podem estar em subnets diferentes +- Verificar IP real e gateway no Hetzner Robot + +**5.2 Aplicar Networking** +```bash +# Test config +ifup --no-act vmbr0 + +# Apply +systemctl restart networking + +# Verificar +ip a +ping -c 3 8.8.8.8 +``` + +**5.3 Port Forwarding (Opcional - para expor VMs)** +```bash +# Exemplo: Redirecionar porta 8080 host → porta 80 VM 10.10.10.100 +iptables -t nat -A PREROUTING -i eno1 -p tcp --dport 8080 -j DNAT --to 10.10.10.100:80 + +# Persistir com iptables-persistent +apt install iptables-persistent +iptables-save > /etc/iptables/rules.v4 +``` + +### Fase 6: vSwitch Configuration (Opcional) + +**Se --vswitch flag presente:** + +**6.1 Configurar VLAN no Robot Panel** +- Hetzner Robot → vSwitch → Create VLAN +- Anotar VLAN ID (ex: 4000) + +**6.2 Adicionar ao /etc/network/interfaces** +```bash +# vSwitch interface (MTU 1400 OBRIGATÓRIO) +auto enp7s0.4000 +iface enp7s0.4000 inet manual + mtu 1400 + +# Bridge vSwitch +auto vmbr1 +iface vmbr1 inet static + address 10.0.0.1/24 + bridge-ports enp7s0.4000 + bridge-stp off + bridge-fd 0 + mtu 1400 +``` + +**CRITICAL:** MTU 1400 não negociável para vSwitch Hetzner. + +### Fase 7: Proxmox Web UI + Storage + +**7.1 Aceder Web UI** +``` +https://SERVER_IP:8006 + +User: root +Password: (root password do servidor) +``` + +**7.2 Remover Enterprise Repo (se no-subscription)** +```bash +# Comentar enterprise repo +sed -i 's/^deb/#deb/' /etc/apt/sources.list.d/pve-enterprise.list + +# Verificar +apt update +``` + +**7.3 Configurar Storage no Web UI** +- Datacenter → Storage → Add +- **Directory:** Local (já existe) +- **ZFS:** rpool/vm-disks (para VMs) +- **PBS:** Adicionar PBS server (se já instalado) + +### Fase 8: Validation Checklist + +**8.1 Verificações Técnicas** +```bash +# PVE version +pveversion -v + +# ZFS status +zpool status +zpool list +zfs list + +# Networking +ping -c 3 8.8.8.8 +curl -I https://www.google.com + +# Web UI +curl -k https://localhost:8006 + +# ARC stats +arc_summary | grep "ARC size" +``` + +**8.2 Security Hardening** +```bash +# SSH: Disable root password (usar keys) +sed -i 's/#PermitRootLogin yes/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config +systemctl restart sshd + +# Firewall básico (opcional - configurar via Web UI depois) +pve-firewall start +``` + +**8.3 Criar VM Teste** +```bash +# Via CLI (ou Web UI) +qm create 100 \ + --name test-vm \ + --memory 1024 \ + --cores 1 \ + --net0 virtio,bridge=vmbr0 \ + --ide2 local:iso/debian-12.iso,media=cdrom \ + --bootdisk scsi0 \ + --scsi0 rpool/vm-disks:10 + +# Start +qm start 100 + +# Verificar consegue aceder internet (NAT funcional) +``` + +## Output Summary + +``` +✅ Proxmox VE 8.x instalado: HOSTNAME + +🖥️ Hardware: + - CPU: (detect) + - RAM: 128GB (ARC max 16GB, disponível 110GB para VMs) + - Storage: 2x 1TB NVMe ZFS RAID-1 + 16TB HDD + +💾 Storage: + - ZFS pool: rpool (mirror) + - Compression: LZ4 (ratio ~1.5x) + - ARC: 4GB min, 16GB max + - Datasets: vm-disks, ct-volumes, pbs-datastore + +🌐 Networking: + - Mode: NAT masquerading (single-IP) + - Internal subnet: 10.10.10.0/24 + - Gateway: GATEWAY_IP (point-to-point) + [Se vSwitch] vSwitch VLAN 4000: 10.0.0.0/24 (MTU 1400) + +🔐 Access: + - Web UI: https://SERVER_IP:8006 + - SSH: root@SERVER_IP (key only) + - API: https://SERVER_IP:8006/api2/json + +📋 Next Steps: + 1. Configurar firewall via Web UI (Datacenter → Firewall) + 2. Criar API token para Terraform (/pve-api-token) + 3. Setup PBS (/pbs-config) + 4. Criar Cloud-Init templates + 5. Migrar workloads (/vm-migration) + 6. [Futuro] Cluster formation (/proxmox-cluster) + +⚠️ Hetzner Gotchas Applied: + ✓ Gateway /32 point-to-point + ✓ NAT masquerading (MAC filtering bypass) + ✓ vSwitch MTU 1400 (se aplicável) + ✓ ZFS ARC tuning + ✓ PVE kernel (não Debian stock) + +⏱️ Setup time: ~45min (vs 2h manual) +``` + +## Hetzner-Specific Gotchas (CRITICAL) + +### 1. MAC Filtering +**Problema:** Bridged networking com MAC não registado = bloqueado +**Solução aplicada:** NAT masquerading (bypass MAC filtering) +**Alternativa:** Pedir virtual MAC no Robot panel (grátis) + +### 2. Gateway Point-to-Point +**Problema:** Gateway fora da subnet do IP principal +**Solução:** `address IP/32` + `pointopoint GATEWAY` (não /24 ou /26) + +### 3. vSwitch MTU 1400 +**Problema:** vSwitch Hetzner requer MTU 1400 (não 1500 standard) +**Solução:** Forçar `mtu 1400` em vmbr1 e enp7s0.4000 + +### 4. ZFS vs LVM Trade-off +**Problema:** installimage não suporta ZFS root directo +**Solução:** LVM para root (compatibilidade), ZFS para VMs (performance) + +### 5. Kernel PVE vs Debian +**Problema:** Kernel stock Debian não optimizado para virtualização +**Solução:** Instalar proxmox-ve + remover kernel Debian + +## Troubleshooting + +### Web UI não acessível +```bash +# Verificar serviço +systemctl status pveproxy + +# Logs +journalctl -u pveproxy -f + +# Firewall +iptables -L -n -v | grep 8006 +``` + +### VMs sem internet (NAT) +```bash +# Verificar IP forwarding +cat /proc/sys/net/ipv4/ip_forward # Should be 1 + +# Verificar iptables NAT +iptables -t nat -L -n -v + +# Re-aplicar regras +ifdown vmbr0 && ifup vmbr0 +``` + +### ZFS ARC não limita +```bash +# Verificar configs +cat /sys/module/zfs/parameters/zfs_arc_max + +# Re-aplicar +modprobe -r zfs +modprobe zfs +``` + +### vSwitch MTU issues +```bash +# Forçar MTU em todas interfaces +ip link set enp7s0.4000 mtu 1400 +ip link set vmbr1 mtu 1400 + +# Test +ping -M do -s 1372 10.0.0.2 # 1372 = 1400 - 28 (headers) +``` + +## References + +- **NotebookLM:** 276ccdde-6b95-42a3-ad96-4e64d64c8d52 (150+ fontes) +- **Guia Definitivo:** Hub/05-Projectos/Cluster Descomplicar/Research/Proxmox-VE/Guia-Definitivo-Proxmox-Hetzner.md +- **Proxmox Docs:** https://pve.proxmox.com/pve-docs/pve-admin-guide.html +- **Hetzner Docs:** https://docs.hetzner.com/robot/dedicated-server/ + +--- + +**Versão:** 1.0.0 | **Autor:** Descomplicar® | **Data:** 2026-02-14 + +## Metadata (Desk CRM Task #1712) + +``` +Projeto: Cluster Proxmox Descomplicar (#65) +Tarefa: Migração Infraestrutura para Cluster Proxmox HA (#1712) +Milestone: TBD +Tags: proxmox, pve, hetzner, zfs, networking, instalacao +Status: Research → Implementation +``` + +--- + +**/** @author Descomplicar® | @link descomplicar.pt | @copyright 2026 **/ + +--- + +## Quando NÃO Usar + +- Para servidores non-Hetzner (diferentes gotchas de networking) +- Para Proxmox já instalado (usar outras skills de config) +- Para troubleshooting (criar skill específica) diff --git a/infraestrutura/skills/security-audit/SKILL.md b/infraestrutura/skills/security-audit/SKILL.md index a1263d7..af265cc 100644 --- a/infraestrutura/skills/security-audit/SKILL.md +++ b/infraestrutura/skills/security-audit/SKILL.md @@ -744,7 +744,7 @@ Consultar para conhecimento aprofundado ou casos específicos: ```javascript // Exemplo: pesquisar hardening Nginx -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7f63ec0c-6321-488c-b107-980140199850", query: "nginx hardening security headers ssl tls", top_k: 3 diff --git a/infraestrutura/skills/server-health/SKILL.md b/infraestrutura/skills/server-health/SKILL.md index f7cb877..0192684 100644 --- a/infraestrutura/skills/server-health/SKILL.md +++ b/infraestrutura/skills/server-health/SKILL.md @@ -604,7 +604,7 @@ Antes de executar diagnóstico complexo ou para troubleshooting específico: ```javascript // Exemplo: pesquisar optimização MySQL -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7f63ec0c-6321-488c-b107-980140199850", query: "mysql slow query optimization innodb tuning", top_k: 3 diff --git a/infraestrutura/skills/vm-migration/SKILL.md b/infraestrutura/skills/vm-migration/SKILL.md new file mode 100644 index 0000000..5c06149 --- /dev/null +++ b/infraestrutura/skills/vm-migration/SKILL.md @@ -0,0 +1,571 @@ +--- +name: vm-migration +description: Migração zero-downtime de workloads CWP/EasyPanel para Proxmox VMs seguindo Migration-Plan-OptionA. Use when user mentions "migrate to proxmox", "cwp migration", "easypanel migration", "workload migration". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 75 +user_invocable: true +desk_task: 1712 +allowed-tools: Task, Read, Bash +dependencies: + - ssh-unified + - notebooklm + - proxmox-setup + - pbs-config +--- + +# VM Migration + +Migração zero-downtime de workloads CWP e EasyPanel para Proxmox VMs seguindo Migration-Plan-OptionA com safety nets e rollback procedures. + +## Quando Usar + +- Migrar servidores CWP para VMs Proxmox +- Migrar containers EasyPanel para VMs Proxmox +- Executar Migration-Plan-OptionA (3 fases) +- Migração phased com validation periods +- Zero-downtime para clientes production + +## Sintaxe + +```bash +/vm-migration [--phase 1|2|3] [--batch-size 5] [--validate-days 7] +``` + +## Exemplos + +```bash +# Fase 1: EasyPanel migration (batch 5 containers) +/vm-migration easypanel easy.descomplicar.pt --phase 1 --batch-size 5 + +# Fase 2: CWP migration com 7 dias validation +/vm-migration cwp server.descomplicar.pt --phase 2 --validate-days 7 + +# Fase 3: Apenas confirmar (sem migração) +/vm-migration finalize --phase 3 +``` + +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM Proxmox Research +```bash +mcp__notebooklm__notebook_query \ + notebook_id:"276ccdde-6b95-42a3-ad96-4e64d64c8d52" \ + query:"proxmox migration cwp easypanel docker lxc zero downtime" +``` + +### Hub Docs +- Hub/05-Projectos/Cluster Descomplicar/Planning/Migration-Plan-OptionA.md +- Fase 1: EasyPanel (Week 1-2) +- Fase 2: CWP (Week 3-6, 7 dias validation) +- Fase 3: Cluster + cleanup (Week 7-8) + +## Migration-Plan-OptionA Overview + +**Timeline:** 8 semanas +**Strategy:** Phased migration com safety nets +**Rollback:** Disponível em cada fase + +``` +Week 1-2: FASE 1 - EasyPanel Migration +├── Backup EasyPanel → PBS +├── Create Docker VM Proxmox +├── Migrate containers (batch 5-10) +├── DNS cutover gradual +└── Validation + Rollback window + +Week 3-6: FASE 2 - CWP Migration +├── 7 dias safety net (server intacto) +├── Create AlmaLinux 8 VM +├── Migrate CWP accounts (batch) +├── Validate sites + email +├── DNS cutover (TTL 300s) +└── Rollback até Day 7 + +Week 7-8: FASE 3 - Cluster Formation +├── Prepare server.descomplicar.pt as Node A +├── Form cluster (pvecm) +├── Configure HA groups +├── Live migration tests +└── Cleanup legacy servers +``` + +## Workflow Completo + +### PRE-MIGRATION (Todas Fases) + +**1. Backup Strategy Validation** +```bash +# Verificar PBS configurado +pvesm status | grep pbs + +# Criar backup point actual +vzdump --storage pbs-main --all 1 --mode snapshot + +# Verificar 3-2-1 compliance: +# - Original: source server +# - Backup 1: PBS Node B +# - Backup 2: PBS Node A remote sync (ou VPS backup) +``` + +**2. Documentar Estado Actual** +```bash +# CWP: Listar contas +/scripts/list_accounts > /tmp/cwp-accounts.txt + +# EasyPanel: Listar services +curl -s http://localhost:3000/api/trpc/projects.list | jq > /tmp/easypanel-services.json + +# DNS TTLs (baixar para 300s ANTES de migration) +# Verificar em: dns.descomplicar.pt ou Cloudflare +``` + +**3. Comunicar Clientes (se downtime esperado)** +- Email 48h antes +- Status page update +- Janela de manutenção agendada + +--- + +### FASE 1: EasyPanel Migration (Week 1-2) + +**Target:** Migrar 108 containers Docker para VM Proxmox + +**1.1 Criar VM Docker Host** +```bash +# Via Proxmox CLI +qm create 200 \ + --name easypanel-docker \ + --memory 32768 \ + --cores 8 \ + --net0 virtio,bridge=vmbr0 \ + --scsi0 rpool/vm-disks:200 \ + --ostype l26 \ + --boot order=scsi0 + +# Install Ubuntu 24.04 LTS +# Via Cloud-Init ou ISO manual +``` + +**1.2 Instalar Docker + EasyPanel** +```bash +# SSH to VM +ssh root@10.10.10.200 + +# Docker +curl -fsSL https://get.docker.com | sh + +# EasyPanel +curl -sSL https://get.easypanel.io | sh +``` + +**1.3 Backup Containers Actuais** +```bash +# Em easy.descomplicar.pt +# Backup docker volumes +tar -czf /tmp/easypanel-volumes.tar.gz /var/lib/easypanel/projects + +# Transfer para PBS ou storage temporário +scp /tmp/easypanel-volumes.tar.gz root@cluster.descomplicar.pt:/mnt/migration/ +``` + +**1.4 Migrar Containers (Batch 5-10)** + +**Batch 1 (não-críticos para teste):** +```bash +# Containers teste: dev environments, staging +# IDs: 1-5 + +# Por cada container: +1. Exportar env vars do EasyPanel +2. Exportar docker-compose.yml +3. Copiar volumes +4. Recriar em novo EasyPanel +5. Testar health endpoint +6. DNS cutover se OK +``` + +**Workflow Batch:** +```bash +# Script semi-automatizado +for container_id in 1 2 3 4 5; do + # Export config + curl -s http://easy.descomplicar.pt:3000/api/trpc/services.get \ + -d "serviceId=$container_id" > config_$container_id.json + + # Copiar volumes + rsync -avz /var/lib/easypanel/projects/$container_id/ \ + root@10.10.10.200:/var/lib/easypanel/projects/$container_id/ + + # Recriar service (via EasyPanel API ou UI) + + # Test + curl -I http://10.10.10.200:PORT/health + + # DNS cutover (se health OK) + # Actualizar DNS para apontar para 10.10.10.200 (via NAT port forward) +done +``` + +**1.5 Validation (24-48h por batch)** +```bash +# Monitoring: +- Uptime checks (UptimeRobot ou similar) +- Error rates (logs) +- Performance (response time <500ms) +- Cliente feedback + +# Rollback triggers: +- >2 containers falham consecutivamente +- Cliente reporta down +- Health checks fail >10min +``` + +**1.6 DNS Cutover** +```bash +# Baixar TTL para 300s (5min) 24h ANTES +# Ex: Cloudflare ou dns.descomplicar.pt + +# Cutover: +A record: old-ip → NAT port forward para 10.10.10.200:PORT + +# Monitorizar por 1h +# Reverter se problemas +``` + +**1.7 Rollback Procedure (se necessário)** +```bash +# Reverter DNS (TTL 300s = 5min propagação) +# Reactivar container antigo +# Investigar causa falha +# Re-tentar após fix +``` + +**Batch 2-N:** Repetir até 108 containers migrados. + +--- + +### FASE 2: CWP Migration (Week 3-6) + +**Target:** Migrar 39 vhosts CWP para VM AlmaLinux 8 + +**CRITICAL:** 7 dias safety net - server.descomplicar.pt intacto + +**2.1 Criar VM AlmaLinux 8 + CWP** +```bash +qm create 300 \ + --name cwp-legacy \ + --memory 16384 \ + --cores 6 \ + --net0 virtio,bridge=vmbr0 \ + --scsi0 rpool/vm-disks:150 \ + --ostype l26 + +# Instalar AlmaLinux 8 +# Instalar CWP7 +wget http://centos-webpanel.com/cwp-el8-latest +sh cwp-el8-latest +``` + +**2.2 Backup CWP Accounts** +```bash +# Em server.descomplicar.pt +for account in $(cat /tmp/cwp-accounts.txt); do + /scripts/pkgacct $account +done + +# Transfer backups +rsync -avz /home/backup-*/cpmove-*.tar.gz \ + root@cluster.descomplicar.pt:/mnt/migration/cwp/ +``` + +**2.3 Migrar Contas (Batch 3-5 contas)** + +**Workflow por conta:** +```bash +# 1. Restore backup em VM CWP +scp /mnt/migration/cwp/cpmove-ACCOUNT.tar.gz root@10.10.10.300:/home/ + +# 2. Restore via CWP +/scripts/restorepkg ACCOUNT + +# 3. Validar: +- Site carrega (HTTP 200) +- Database conecta +- Email funciona (send test) +- SSL certificado válido + +# 4. DNS cutover (TTL 300s) +A record: site.com → 10.10.10.300 (via NAT port forward) + +# 5. Monitorizar 24h +``` + +**2.4 Validation Period (7 dias)** +```bash +# Days 1-7 após migration: +- Server antigo (server.descomplicar.pt) INTACTO +- Rollback instantâneo se problema critical +- Cliente pode reverter DNS manualmente se necessário + +# Day 7: Confirmar com Emanuel +# Se tudo OK → proceder cleanup +# Se problemas → extend validation ou rollback completo +``` + +**2.5 Email Migration** +```bash +# Por cada conta CWP: + +# 1. Backup mailboxes +tar -czf /tmp/mail-ACCOUNT.tar.gz /home/ACCOUNT/mail/ + +# 2. Transfer +scp /tmp/mail-ACCOUNT.tar.gz root@10.10.10.300:/tmp/ + +# 3. Restore +cd /home/ACCOUNT/ +tar -xzf /tmp/mail-ACCOUNT.tar.gz + +# 4. Fix permissions +chown -R ACCOUNT:ACCOUNT /home/ACCOUNT/mail/ + +# 5. Testar IMAP/SMTP +telnet localhost 143 # IMAP +telnet localhost 25 # SMTP +``` + +**2.6 Rollback Procedure (Fase 2)** +```bash +# Disponível até Day 7 + +# 1. Reverter DNS (todos sites) +A records → IP antigo (server.descomplicar.pt) + +# 2. Verificar server antigo online +ping server.descomplicar.pt + +# 3. Comunicar clientes + +# 4. Analisar causa falha + +# 5. Ajustar plan e re-tentar +``` + +--- + +### FASE 3: Cluster Formation (Week 7-8) + +**Target:** Formar cluster 2-node, HA, cleanup + +**3.1 Preparar server.descomplicar.pt como Node A** +```bash +# APENAS após Fase 2 100% validada + +# Backup final completo +tar -czf /tmp/final-backup-server.tar.gz /etc /home /var/www + +# Reformatar com Proxmox (/proxmox-setup) +# Tornar Node A do cluster +``` + +**3.2 Cluster Formation** +```bash +# Usar skill /proxmox-cluster (criada a seguir) +/proxmox-cluster create --node-a server.descomplicar.pt --node-b cluster.descomplicar.pt +``` + +**3.3 HA Configuration** +```bash +# Usar skill /proxmox-ha (criada a seguir) +/proxmox-ha configure --critical-vms 200,300 +``` + +**3.4 Cleanup** +```bash +# Cancelar easy.descomplicar.pt VPS (após validação) +# Backup final de tudo +# Documentar nova arquitectura +``` + +--- + +## Backup Strategy Durante Migration + +### Fase 1 (EasyPanel) +**3 locais:** +1. Containers em easy.descomplicar.pt (original) +2. PBS Node B backup +3. easy.descomplicar.pt VPS backup (mantido durante Fase 1) + +### Fase 2 (CWP) +**Safety net 7 dias:** +1. Server antigo intacto (rollback rápido) +2. VM CWP → PBS backups automáticos +3. Backups manuais /mnt/migration/ + +**RPO:** 1h (PBS backups hourly se critical) +**RTO:** 2-4h (restore + DNS propagation) + +### Fase 3 (Cluster) +**Redundância completa:** +1. VMs em Node A + Node B +2. PBS primary (Node B 16TB) +3. PBS secondary remote sync (Node A 12TB) + +## Output Summary (Por Fase) + +### Fase 1 Complete: +``` +✅ EasyPanel migrado: 108 containers + +📦 Containers: + - Migrados: 108/108 + - Falhas: 0 + - Rollbacks: 0 + - Downtime médio: <2min por container + +🎯 Validation: + - Health checks: 100% OK + - Cliente feedback: 0 issues + - Performance: <500ms avg response + +🔄 DNS Cutover: + - TTL: 300s (5min) + - Domains migrados: ALL + - Rollback window: 7 dias + +📋 Next: Fase 2 (CWP migration) +``` + +### Fase 2 Complete: +``` +✅ CWP migrado: 39 vhosts + +🌐 Sites: + - Migrados: 39/39 + - HTTP 200: 100% + - SSL válido: 100% + - Email funcional: 100% + +⏱️ Timeline: + - Week 3-6: Migration + - Day 1-7: Validation period + - Day 8: Cleanup (se OK) + +🔒 Safety Net: + - Server antigo: ONLINE (Day 1-7) + - Rollback: Disponível (DNS reverter) + - Backups: 3 locais + +📋 Next: Fase 3 (Cluster formation) +``` + +### Fase 3 Complete: +``` +✅ Cluster Proxmox formado: 2 nodes + +🖥️ Nodes: + - Node A: server.descomplicar.pt (reformatado) + - Node B: cluster.descomplicar.pt + - Quorum: 2 votes + +🔄 HA: + - Critical VMs: 200, 300 + - Failover: Automatic + - Live migration: Enabled + +💾 PBS Redundancy: + - Primary: Node B (16TB) + - Secondary: Node A (12TB) remote sync + - RPO: 1h | RTO: 2-4h + +🎉 Migration Complete: + - Total time: 8 weeks + - Downtime: <5min total + - Issues: 0 critical + - Cliente satisfaction: HIGH + +📋 Post-Migration: + - Monitor por 30 dias + - Documentar em PROC-VM-Migration.md + - Cancelar VPS legacy + - Treino equipa Proxmox +``` + +## Troubleshooting + +### Container migration fails +```bash +# Verificar logs +docker logs CONTAINER_ID + +# Verificar volumes +ls -lah /var/lib/easypanel/projects/PROJECT/ + +# Testar manual +docker-compose up -d + +# Rollback e investigar +``` + +### CWP site não carrega após migration +```bash +# Verificar Apache +systemctl status httpd + +# Verificar vhost +cat /usr/local/apache/conf.d/vhosts/DOMAIN.conf + +# Verificar database +mysql -u USER -p DATABASE + +# Verificar DNS propagation +dig +short DOMAIN @8.8.8.8 +``` + +### Email não funciona +```bash +# Verificar Postfix +systemctl status postfix + +# Testar SMTP +telnet localhost 25 + +# Verificar DNS MX +dig +short MX DOMAIN + +# Verificar logs +tail -f /var/log/maillog +``` + +## References + +- **Migration Plan:** Hub/05-Projectos/Cluster Descomplicar/Planning/Migration-Plan-OptionA.md +- **NotebookLM:** 276ccdde-6b95-42a3-ad96-4e64d64c8d52 +- **Guia Hub:** Guia-Definitivo-Proxmox-Hetzner.md (Módulo 4: Workloads) + +--- + +**Versão:** 1.0.0 | **Autor:** Descomplicar® | **Data:** 2026-02-14 + +## Metadata (Desk CRM Task #1712) + +``` +Projeto: Cluster Proxmox Descomplicar (#65) +Tarefa: Migração Infraestrutura (#1712) +Tags: migration, cwp, easypanel, zero-downtime, phased +Status: Implementation +``` + +--- + +**/** @author Descomplicar® | @link descomplicar.pt | @copyright 2026 **/ + +--- + +## Quando NÃO Usar + +- Para migrações non-CWP/EasyPanel (criar plan específico) +- Para teste/dev environments (menos rigor) +- Para single-server setups (não cluster) diff --git a/marketing/agents/content-manager.md b/marketing/agents/content-manager.md index 695a9f0..505a1ec 100644 --- a/marketing/agents/content-manager.md +++ b/marketing/agents/content-manager.md @@ -9,6 +9,15 @@ version: 2.0.0 category: content model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-workspace +recommended_mcps: + - dify-kb + - memory-supabase + - outline-api allowed-mcps: google-workspace, desk-crm-v3, dify-kb, memory-supabase, youtube-research, youtube-uploader, elevenlabs, vimeo, outline-api skills: - _core @@ -147,7 +156,16 @@ Você é um gestor de conteúdo experiente responsável por: - Tom arrogante ou condescendente - Promessas irrealistas -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"estrategia editorial calendario" +mcp__notebooklm__notebook_query notebook_id:"7b8fec17-d34f-4e3f-a8c6-8231e51f6323" query:"brand voice storytelling" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing de Conteudo" query:"estrategia editorial calendario" diff --git a/marketing/agents/copywriter.md b/marketing/agents/copywriter.md index 2898c16..a5f8090 100644 --- a/marketing/agents/copywriter.md +++ b/marketing/agents/copywriter.md @@ -5,6 +5,14 @@ role: Copywriter de resposta directa domain: Marketing, Content model: sonnet tools: Read, Write, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - dify-kb +recommended_mcps: + - google-workspace + - memory-supabase skills: - _core - content-marketing-pt @@ -186,7 +194,17 @@ B: Benefício emocional ("para ti") - Promessas irrealistas - Tom condescendente -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"7b8fec17-d34f-4e3f-a8c6-8231e51f6323" query:"persuasao conversao AIDA PAS" +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"storytelling brand" +mcp__notebooklm__notebook_query notebook_id:"9053d0e8-dd39-460b-b5ea-e67af3e9a675" query:"brand voice tom comunicacao" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Copywriting" query:"persuasao conversao AIDA PAS" diff --git a/marketing/agents/marketing-planning-expert.md b/marketing/agents/marketing-planning-expert.md index ef3cd98..75802d8 100644 --- a/marketing/agents/marketing-planning-expert.md +++ b/marketing/agents/marketing-planning-expert.md @@ -98,7 +98,18 @@ Especialista em estrategia de marketing digital, desenvolvimento de campanhas e - Planeamento de content marketing e SEO strategy - Marketing automation e lead nurturing workflows -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"strategy campaigns analytics" +mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"growth marketing customer acquisition" +mcp__notebooklm__notebook_query notebook_id:"9053d0e8-dd39-460b-b5ea-e67af3e9a675" query:"social media engagement" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"strategy campaigns analytics" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao de Marketing" query:"campaign planning ROI optimization" diff --git a/marketing/agents/ppc-specialist.md b/marketing/agents/ppc-specialist.md index 128cc63..e358ba6 100644 --- a/marketing/agents/ppc-specialist.md +++ b/marketing/agents/ppc-specialist.md @@ -8,6 +8,15 @@ role: USAR PROATIVAMENTE para Google Ads, Meta Ads, LinkedIn Ads, PPC, campanhas domain: Marketing model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-analytics + - gsc +recommended_mcps: + - google-workspace + - dify-kb skills: - _core desk_task: null @@ -82,7 +91,16 @@ Gestor de campanhas pagas responsavel por criar, optimizar e reportar campanhas - google-workspace: Criar relatorios em Sheets/Docs - desk-crm-v3: Associar campanhas a projectos clientes -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"Google Ads PPC campanhas" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"Google Ads PPC campanhas" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"conversao ROI metricas" diff --git a/marketing/agents/seo-specialist.md b/marketing/agents/seo-specialist.md index 63a18e8..97eb70f 100644 --- a/marketing/agents/seo-specialist.md +++ b/marketing/agents/seo-specialist.md @@ -9,6 +9,16 @@ version: 2.0.0 category: business model: sonnet tools: Read, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - gsc + - google-analytics + - desk-crm-v3 +recommended_mcps: + - lighthouse + - dify-kb + - context7 allowed-mcps: ssh-unified, google-workspace, gsc, lighthouse, google-analytics, tavily skills: - _core @@ -29,7 +39,16 @@ Especialista em optimizacao para motores de busca, focado em crescimento de traf - Desenvolver estrategias de link building e autoridade de dominio - Monitorizar rankings e reportar metricas de trafego organico -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"keywords rankings optimizacao SERP" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"SEO" query:"keywords rankings optimizacao SERP" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"trafego organico conversao" diff --git a/marketing/agents/social-media-manager.md b/marketing/agents/social-media-manager.md index a281e86..49c3e04 100644 --- a/marketing/agents/social-media-manager.md +++ b/marketing/agents/social-media-manager.md @@ -9,6 +9,16 @@ version: 2.0.0 category: business model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - google-workspace +recommended_mcps: + - dify-kb + - memory-supabase + - pixabay + - pexels allowed-mcps: desk-crm-v3, google-workspace, google-analytics, youtube-research, pixabay, pexels, dify-kb, memory-supabase, elevenlabs, vimeo, replicate skills: - _core @@ -86,7 +96,17 @@ Responsavel por desenvolver estrategias social media, criar calendario editorial - **Click-through**: Traffic para website - **Conversions**: Leads/vendas atribuidas a social -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"redes sociais engagement estrategia" +mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"conteudo visual copywriting" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"redes sociais engagement estrategia" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"conteudo visual copywriting" diff --git a/marketing/agents/video-production-specialist.md b/marketing/agents/video-production-specialist.md index ce8e7de..2fc2b6e 100644 --- a/marketing/agents/video-production-specialist.md +++ b/marketing/agents/video-production-specialist.md @@ -8,6 +8,16 @@ role: USAR PROATIVAMENTE para video, Remotion, animacoes React, intros, promos, domain: Marketing model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - filesystem +recommended_mcps: + - google-workspace + - pixabay + - pexels + - vimeo skills: - _core - video @@ -101,7 +111,17 @@ Produtor de video responsavel por criar videos animados programaticamente com Re | LinkedIn | 1200x1200 | 1:1 | 30 | | TikTok | 1080x1920 | 9:16 | 30 | -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"video conteudo visual" +mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"animacao storytelling" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"video conteudo visual" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"animacao storytelling" diff --git a/marketing/agents/youtube-specialist.md b/marketing/agents/youtube-specialist.md index 246c2c9..3135fba 100644 --- a/marketing/agents/youtube-specialist.md +++ b/marketing/agents/youtube-specialist.md @@ -8,6 +8,15 @@ role: USAR PROATIVAMENTE para YouTube, canal, videos, SEO YouTube, thumbnails, a domain: Content model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - youtube-research +recommended_mcps: + - google-workspace + - dify-kb + - google-analytics skills: - _core - youtube @@ -115,7 +124,17 @@ Estratega YouTube responsavel por maximizar views, watch time e subscriber growt | Sub Conversion | >5% | Call-to-action eficaz | | RPM | >2€ | Monetizacao saudavel | -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"YouTube SEO video conteudo" +mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"storytelling engagement" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"YouTube SEO video conteudo" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"storytelling engagement" diff --git a/marketing/knowledge/datasets.json b/marketing/knowledge/datasets.json index cf7ff1a..ebcdbb3 100644 --- a/marketing/knowledge/datasets.json +++ b/marketing/knowledge/datasets.json @@ -1,31 +1,257 @@ { - "description": "Dify KB datasets for Marketing domain - includes 15 core datasets + 10 mentor datasets", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "0fe0199e-9859-4969-bf74-b24eb68491c8", "name": "Marketing", "priority": 1, "document_count": 30, "word_count": 8356497}, - {"id": "c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24", "name": "Marketing Digital", "priority": 1, "document_count": 124, "word_count": 13001825}, - {"id": "061f19a3-d4b6-4383-9f44-620742167201", "name": "Marketing de Conteudo", "priority": 1, "document_count": 18, "word_count": 1781689}, - {"id": "66117552-348f-455d-9aca-2da722567693", "name": "Marketing Redes Sociais", "priority": 1, "document_count": 35, "word_count": 4049108}, - {"id": "4fa03558-6a81-4620-9f8b-6de39d33e7d9", "name": "Gestao de Marketing", "priority": 1, "document_count": 17, "word_count": 15810824}, - {"id": "2bd26243-437b-46b2-99f6-a7e1d032644c", "name": "Gestao de Trafego", "priority": 1, "document_count": 16, "word_count": 2046225}, - {"id": "b93c6475-2f22-412e-ba9d-666eb081b872", "name": "SEO", "priority": 1, "document_count": 35, "word_count": 7620010}, - {"id": "78e36113-cb41-4bf4-bdb1-25a3f18d9b1f", "name": "Copywriting", "priority": 1, "document_count": 50, "word_count": 3847634}, - {"id": "27094c37-12c0-4fae-a926-382d20b45c09", "name": "Email Marketing", "priority": 2, "document_count": 6, "word_count": 176788}, - {"id": "aded3d71-ec6e-4ffb-aa52-75a3896a2e0d", "name": "Blogging", "priority": 2, "document_count": 5, "word_count": 717461}, - {"id": "baa1b3e6-ebf0-4413-84b2-63d1164867ea", "name": "Youtube Marketing", "priority": 2, "document_count": 5, "word_count": 374330}, - {"id": "ec06a8d0-f672-41f6-9abe-780f9c251c50", "name": "Branding", "priority": 2, "document_count": 11, "word_count": 2251189}, - {"id": "05754d68-180b-4885-9c3d-bf6900fd4ff0", "name": "Growth Hacking", "priority": 2, "document_count": 4, "word_count": 163069}, - {"id": "d769198a-0d80-43ac-890a-3e7ba1a8d746", "name": "Elastic Email", "priority": 3, "document_count": 2, "word_count": 33043}, - {"id": "a7ba6005-517c-41ab-ac5e-da1c1a1c62ef", "name": "Vendas", "priority": 2, "document_count": 5, "word_count": 454194}, - {"id": "3a2e536c-4985-42df-9a00-f0a4dfe720a3", "name": "Mentor: Seth Godin", "priority": 2, "document_count": 19, "word_count": 828132}, - {"id": "0e46a634-bd1e-4e11-937e-26d11b77211a", "name": "Mentor: Russel Brunson", "priority": 2, "document_count": 13, "word_count": 3316099}, - {"id": "6ff761b3-a054-435c-8fc3-a6e6c3a0afaf", "name": "Mentor: Neil Patel", "priority": 2, "document_count": 64, "word_count": 8493302}, - {"id": "1a243661-c3d5-49ce-a749-40865b6976ad", "name": "Mentor: Gary Vee", "priority": 2, "document_count": 20, "word_count": 6062799}, - {"id": "14fa612e-284c-436f-a145-76a5da66cce5", "name": "Mentor: Alex Vargas", "priority": 2, "document_count": 160, "word_count": 2029565}, - {"id": "d9ea0f19-7176-47eb-b7bf-e605b4550297", "name": "Mentor: Natanael Oliveira", "priority": 3, "document_count": 16, "word_count": 123419}, - {"id": "20e20347-8c57-495b-97aa-1a3ce86dd710", "name": "Mentor: Conrado Adolfo", "priority": 3, "document_count": 10, "word_count": 5269844}, - {"id": "d022a48a-59ac-4e27-b376-b58786a082c6", "name": "Mentor: Sam Ovens", "priority": 3, "document_count": 2, "word_count": 221336}, - {"id": "74b2862e-3ac0-4939-94ec-400eb212472b", "name": "Mentor: Ricardo Piovan", "priority": 3, "document_count": 8, "word_count": 545213}, - {"id": "c4ac6e3b-8173-46fb-8ad4-8051e15988c5", "name": "Mentor: Flavio Augusto", "priority": 3, "document_count": 3, "word_count": 578484} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for Marketing domain - includes 15 core datasets + 10 mentor datasets", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", + "title": "Marketing Digital Avancado", + "topics": [ + "marketing" + ], + "maps_from_dify": "Marketing" + }, + { + "id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", + "title": "Social Media e Branding", + "topics": [ + "marketing", + "redes", + "sociais" + ], + "maps_from_dify": "Marketing Redes Sociais" + }, + { + "id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", + "title": "Copywriting e Persuasao", + "topics": [ + "copywriting" + ], + "maps_from_dify": "Copywriting" + }, + { + "id": "058a896e-6c9a-4e51-ae7d-9adb2738bc5f", + "title": "Producao de Video e Youtube", + "topics": [ + "youtube", + "marketing" + ], + "maps_from_dify": "Youtube Marketing" + }, + { + "id": "79d43410-0e29-4be1-881d-84db6bdc239a", + "title": "Estrategia e Empreendedorismo", + "topics": [ + "mentor:", + "seth", + "godin" + ], + "maps_from_dify": "Mentor: Seth Godin" + }, + { + "id": "4c595973-ba10-420a-a3bf-e4389e424ad3", + "title": "Marketing Digital PT", + "topics": [ + "mentor:", + "alex", + "vargas" + ], + "maps_from_dify": "Mentor: Alex Vargas" + }, + { + "id": "0c9c079c-a426-486c-99eb-1564d42d37ad", + "title": "Gestao de Projectos e Agile", + "topics": [ + "mentor:", + "ricardo", + "piovan" + ], + "maps_from_dify": "Mentor: Ricardo Piovan" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "0fe0199e-9859-4969-bf74-b24eb68491c8", + "name": "Marketing", + "priority": 1, + "document_count": 30, + "word_count": 8356497 + }, + { + "id": "c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24", + "name": "Marketing Digital", + "priority": 1, + "document_count": 124, + "word_count": 13001825 + }, + { + "id": "061f19a3-d4b6-4383-9f44-620742167201", + "name": "Marketing de Conteudo", + "priority": 1, + "document_count": 18, + "word_count": 1781689 + }, + { + "id": "66117552-348f-455d-9aca-2da722567693", + "name": "Marketing Redes Sociais", + "priority": 1, + "document_count": 35, + "word_count": 4049108 + }, + { + "id": "4fa03558-6a81-4620-9f8b-6de39d33e7d9", + "name": "Gestao de Marketing", + "priority": 1, + "document_count": 17, + "word_count": 15810824 + }, + { + "id": "2bd26243-437b-46b2-99f6-a7e1d032644c", + "name": "Gestao de Trafego", + "priority": 1, + "document_count": 16, + "word_count": 2046225 + }, + { + "id": "b93c6475-2f22-412e-ba9d-666eb081b872", + "name": "SEO", + "priority": 1, + "document_count": 35, + "word_count": 7620010 + }, + { + "id": "78e36113-cb41-4bf4-bdb1-25a3f18d9b1f", + "name": "Copywriting", + "priority": 1, + "document_count": 50, + "word_count": 3847634 + }, + { + "id": "27094c37-12c0-4fae-a926-382d20b45c09", + "name": "Email Marketing", + "priority": 2, + "document_count": 6, + "word_count": 176788 + }, + { + "id": "aded3d71-ec6e-4ffb-aa52-75a3896a2e0d", + "name": "Blogging", + "priority": 2, + "document_count": 5, + "word_count": 717461 + }, + { + "id": "baa1b3e6-ebf0-4413-84b2-63d1164867ea", + "name": "Youtube Marketing", + "priority": 2, + "document_count": 5, + "word_count": 374330 + }, + { + "id": "ec06a8d0-f672-41f6-9abe-780f9c251c50", + "name": "Branding", + "priority": 2, + "document_count": 11, + "word_count": 2251189 + }, + { + "id": "05754d68-180b-4885-9c3d-bf6900fd4ff0", + "name": "Growth Hacking", + "priority": 2, + "document_count": 4, + "word_count": 163069 + }, + { + "id": "d769198a-0d80-43ac-890a-3e7ba1a8d746", + "name": "Elastic Email", + "priority": 3, + "document_count": 2, + "word_count": 33043 + }, + { + "id": "a7ba6005-517c-41ab-ac5e-da1c1a1c62ef", + "name": "Vendas", + "priority": 2, + "document_count": 5, + "word_count": 454194 + }, + { + "id": "3a2e536c-4985-42df-9a00-f0a4dfe720a3", + "name": "Mentor: Seth Godin", + "priority": 2, + "document_count": 19, + "word_count": 828132 + }, + { + "id": "0e46a634-bd1e-4e11-937e-26d11b77211a", + "name": "Mentor: Russel Brunson", + "priority": 2, + "document_count": 13, + "word_count": 3316099 + }, + { + "id": "6ff761b3-a054-435c-8fc3-a6e6c3a0afaf", + "name": "Mentor: Neil Patel", + "priority": 2, + "document_count": 64, + "word_count": 8493302 + }, + { + "id": "1a243661-c3d5-49ce-a749-40865b6976ad", + "name": "Mentor: Gary Vee", + "priority": 2, + "document_count": 20, + "word_count": 6062799 + }, + { + "id": "14fa612e-284c-436f-a145-76a5da66cce5", + "name": "Mentor: Alex Vargas", + "priority": 2, + "document_count": 160, + "word_count": 2029565 + }, + { + "id": "d9ea0f19-7176-47eb-b7bf-e605b4550297", + "name": "Mentor: Natanael Oliveira", + "priority": 3, + "document_count": 16, + "word_count": 123419 + }, + { + "id": "20e20347-8c57-495b-97aa-1a3ce86dd710", + "name": "Mentor: Conrado Adolfo", + "priority": 3, + "document_count": 10, + "word_count": 5269844 + }, + { + "id": "d022a48a-59ac-4e27-b376-b58786a082c6", + "name": "Mentor: Sam Ovens", + "priority": 3, + "document_count": 2, + "word_count": 221336 + }, + { + "id": "74b2862e-3ac0-4939-94ec-400eb212472b", + "name": "Mentor: Ricardo Piovan", + "priority": 3, + "document_count": 8, + "word_count": 545213 + }, + { + "id": "c4ac6e3b-8173-46fb-8ad4-8051e15988c5", + "name": "Mentor: Flavio Augusto", + "priority": 3, + "document_count": 3, + "word_count": 578484 + } + ] + } + } +} \ No newline at end of file diff --git a/marketing/skills/ads/SKILL.md b/marketing/skills/ads/SKILL.md index 2aefd98..80c899f 100644 --- a/marketing/skills/ads/SKILL.md +++ b/marketing/skills/ads/SKILL.md @@ -399,7 +399,7 @@ CTA + urgência ```javascript // Optimização Google Ads -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24", query: "google ads optimization ROAS CPA bidding 2026" }) diff --git a/marketing/skills/content-marketing-pt/SKILL.md b/marketing/skills/content-marketing-pt/SKILL.md index e2f9a50..c82e136 100644 --- a/marketing/skills/content-marketing-pt/SKILL.md +++ b/marketing/skills/content-marketing-pt/SKILL.md @@ -419,7 +419,7 @@ Para templates e exemplos extensos, consultar: ```javascript // Técnicas de copywriting persuasivo -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "78e36113-cb41-4bf4-bdb1-25a3f18d9b1f", query: "headlines persuasivas CTA conversão" }) diff --git a/marketing/skills/lead-approach/SKILL.md b/marketing/skills/lead-approach/SKILL.md index 3a122df..0811884 100644 --- a/marketing/skills/lead-approach/SKILL.md +++ b/marketing/skills/lead-approach/SKILL.md @@ -179,7 +179,7 @@ Task({ ```javascript // Estratégias de marketing do setor -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24", query: `${setor} lead generation estratégia`, retrieval_mode: "hybrid_search", diff --git a/marketing/skills/marketing-strategy/SKILL.md b/marketing/skills/marketing-strategy/SKILL.md index fc30af8..6a75bff 100644 --- a/marketing/skills/marketing-strategy/SKILL.md +++ b/marketing/skills/marketing-strategy/SKILL.md @@ -476,7 +476,7 @@ Loop 3: User → UGC (User Generated Content) → Social Proof → New User ```javascript // Frameworks estratégia marketing -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24", query: "marketing strategy framework OKRs positioning 2026" }) diff --git a/marketing/skills/seo-audit/SKILL.md b/marketing/skills/seo-audit/SKILL.md index 86252cd..d0890ac 100644 --- a/marketing/skills/seo-audit/SKILL.md +++ b/marketing/skills/seo-audit/SKILL.md @@ -467,7 +467,7 @@ Consultar os seguintes datasets via MCP para complementar análises: ```javascript // Pesquisar técnicas SEO técnico -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "b93c6475-2f22-412e-ba9d-666eb081b872", query: "core web vitals INP optimization 2026" }) diff --git a/marketing/skills/seo-content-optimization/SKILL.md b/marketing/skills/seo-content-optimization/SKILL.md index 70749d2..161ba0b 100644 --- a/marketing/skills/seo-content-optimization/SKILL.md +++ b/marketing/skills/seo-content-optimization/SKILL.md @@ -544,7 +544,7 @@ https://site.pt/artigo_novo_23_final_v2/ (underscores, versões) ```javascript // Pesquisar técnicas SEO on-page -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "b93c6475-2f22-412e-ba9d-666eb081b872", query: "keyword research on-page optimization 2026" }) diff --git a/marketing/skills/seo-report/SKILL.md b/marketing/skills/seo-report/SKILL.md index 5b1d31f..4c114f7 100644 --- a/marketing/skills/seo-report/SKILL.md +++ b/marketing/skills/seo-report/SKILL.md @@ -524,7 +524,7 @@ async function getGSCData(url) { ```javascript // Validar recomendações técnicas -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "b93c6475-2f22-412e-ba9d-666eb081b872", query: "INP optimization javascript performance 2026" }) diff --git a/marketing/skills/social-media/SKILL.md b/marketing/skills/social-media/SKILL.md index dfc3179..c03535c 100644 --- a/marketing/skills/social-media/SKILL.md +++ b/marketing/skills/social-media/SKILL.md @@ -448,7 +448,7 @@ Tu: "@user obrigado! Qual das dicas vais testar primeiro?" ```javascript // Estratégias crescimento Instagram -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "66117552-348f-455d-9aca-2da722567693", query: "instagram reels crescimento algoritmo 2026" }) diff --git a/marketing/skills/video/SKILL.md b/marketing/skills/video/SKILL.md index 6a86e5a..6929d6c 100644 --- a/marketing/skills/video/SKILL.md +++ b/marketing/skills/video/SKILL.md @@ -305,7 +305,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ```javascript // Princípios de design para vídeo -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7efc5db4-05b1-408a-9e41-b612188ee877", query: "animacao motion design" }) @@ -697,6 +697,16 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ### Como Consultar ```javascript +# PRIMARIO: NotebookLM (Gemini 2.5 RAG) +# mcp__notebooklm__notebook_query({notebook_id: "76647e0f-3ae2-4c00-a0a8-f457aebf5655", query: ""}) // Marketing Digital Avancado +# mcp__notebooklm__notebook_query({notebook_id: "9053d0e8-dd39-460b-b5ea-e67af3e9a675", query: ""}) // Social Media e Branding +# mcp__notebooklm__notebook_query({notebook_id: "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", query: ""}) // Copywriting e Persuasao +# mcp__notebooklm__notebook_query({notebook_id: "058a896e-6c9a-4e51-ae7d-9adb2738bc5f", query: ""}) // Producao de Video e Youtube +# mcp__notebooklm__notebook_query({notebook_id: "79d43410-0e29-4be1-881d-84db6bdc239a", query: ""}) // Estrategia e Empreendedorismo +# mcp__notebooklm__notebook_query({notebook_id: "4c595973-ba10-420a-a3bf-e4389e424ad3", query: ""}) // Marketing Digital PT +# mcp__notebooklm__notebook_query({notebook_id: "0c9c079c-a426-486c-99eb-1564d42d37ad", query: ""}) // Gestao de Projectos e Agile +# FALLBACK: Dify KB (se NotebookLM insuficiente) + // Princípios de design para vídeo mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7efc5db4-05b1-408a-9e41-b612188ee877", diff --git a/marketing/skills/youtube/SKILL.md b/marketing/skills/youtube/SKILL.md index 72e9546..f8648db 100644 --- a/marketing/skills/youtube/SKILL.md +++ b/marketing/skills/youtube/SKILL.md @@ -517,7 +517,7 @@ mcp__youtube-research__get-trending-videos({ ```javascript // Estratégias crescimento YouTube -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "baa1b3e6-ebf0-4413-84b2-63d1164867ea", query: "algoritmo youtube crescimento subscribers 2026" }) diff --git a/metabase/.claude-plugin/plugin.json b/metabase/.claude-plugin/plugin.json new file mode 100644 index 0000000..bcb9609 --- /dev/null +++ b/metabase/.claude-plugin/plugin.json @@ -0,0 +1,12 @@ +{ + "name": "metabase", + "description": "Metabase BI analytics - dashboards, SQL queries, database exploration and reporting via bi.descomplicar.pt. Powered by metabase-ai-assistant MCP.", + "version": "1.0.0", + "author": { + "name": "Descomplicar - Crescimento Digital", + "url": "https://descomplicar.pt" + }, + "homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins", + "license": "MIT", + "keywords": ["metabase", "bi", "analytics", "dashboards", "sql", "reporting", "dados"] +} diff --git a/metabase/agents/metabase-analyst.md b/metabase/agents/metabase-analyst.md new file mode 100644 index 0000000..7ae47f7 --- /dev/null +++ b/metabase/agents/metabase-analyst.md @@ -0,0 +1,159 @@ +--- +name: metabase-analyst +description: "USAR PROATIVAMENTE para analytics Metabase, dashboards BI, queries SQL, exploração de dados, métricas de negócio, relatórios. Analista de dados especializado em Metabase com acesso directo a bi.descomplicar.pt." +role: Analista de dados Metabase especializado em BI, dashboards e queries SQL +domain: Analytics, Business Intelligence +model: sonnet +tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - metabase + - desk-crm-v3 +recommended_mcps: + - google-analytics + - memory-supabase + - mcp-echarts +skills: + - _core +desk_project: 65 +tags: + - agent + - stackworkflow + - claude-code + - metabase + - analytics + - bi + - dashboards +version: "1.0" +status: active +quality_score: 70 +compliance: + sacred_rules: true + excellence_standards: true + data_sources: true + knowledge_first: true +reports_to: Master Orchestrator +collaborates_with: + - Analytics Insights Agent + - Finance Manager + - Database Design Specialist +escalates_to: + - Master Orchestrator (decisões estratégicas) + - Database Design Specialist (queries complexas) +created: "2026-02-12" +updated: "2026-02-12" +author: "Descomplicar®" +--- + +# Metabase Analyst Descomplicar + +Analista de dados especializado em Metabase BI que explora bases de dados, cria dashboards, executa queries SQL e gera insights accionáveis a partir de bi.descomplicar.pt. + +## System Prompt + +Você é um analista de dados experiente especializado em Metabase: +- Explorar bases de dados e tabelas disponíveis no Metabase +- Executar queries SQL para extrair dados e métricas +- Criar e gerir dashboards com visualizações úteis +- Criar questions/cards reutilizáveis +- Gerar insights accionáveis a partir dos dados + +### Regras obrigatórias + +- [ ] **Dados reais primeiro**: usar MCP Metabase ANTES de assumir +- [ ] **Read-only por defeito**: nunca modificar dados sem confirmação explícita +- [ ] **Validar SQL**: verificar query antes de executar +- [ ] **Contexto de negócio**: cruzar dados Metabase com Desk CRM quando relevante +- [ ] **Visualização clara**: usar tabelas Markdown, sugerir tipo de gráfico adequado +- [ ] **Insights accionáveis**: todo dado deve ter recomendação de acção + +### Output format esperado + +```markdown +## Análise: [Título] + +### Dados principais +[Tabela com métricas chave] + +### Tendências identificadas +1. **[Tendência 1]**: Descrição + números +2. **[Tendência 2]**: Descrição + números + +### Insights accionáveis +- **Atenção**: [Problema identificado] +- **Oportunidade**: [Área de melhoria] +- **Recomendação**: [Acção concreta] + +### Próximos passos +1. [Acção específica] +2. [Acção específica] +``` + +### MCPs a usar + +| MCP | Quando usar | +|-----|-------------| +| `metabase` | Databases, queries, dashboards, cards, collections | +| `desk-crm-v3` | Cruzar com clientes, projectos, facturas | +| `google-analytics` | Dados de tráfego web para correlação | +| `mcp-echarts` | Gerar gráficos programáticos | +| `memory-supabase` | Guardar análises anteriores | + +## Responsabilidades + +- Exploração de bases de dados e schemas disponíveis no Metabase +- Execução de queries SQL para extracção de dados e métricas +- Criação e gestão de dashboards e questions/cards +- Análise de tendências, padrões e anomalias nos dados +- Geração de relatórios com insights e recomendações +- Cruzamento de dados entre fontes (Metabase + Desk CRM + GA) + +## Workflows + +### 1. Explorar dados disponíveis +``` +1. Listar databases no Metabase +2. Para cada database, listar tabelas +3. Explorar schema e campos de tabelas relevantes +4. Documentar estrutura para referência futura +``` + +### 2. Análise ad-hoc com SQL +``` +1. Compreender pergunta de negócio +2. Identificar tabelas e campos relevantes +3. Construir query SQL optimizada +4. Executar e validar resultados +5. Formatar em tabela + insight +``` + +### 3. Criar dashboard +``` +1. Definir objectivo do dashboard +2. Criar questions/cards individuais +3. Organizar em dashboard com layout lógico +4. Adicionar filtros relevantes +5. Partilhar URL +``` + +### 4. Relatório periódico +``` +1. Executar queries de métricas-chave +2. Comparar com período anterior +3. Identificar variações significativas +4. Gerar resumo com tendências +5. Recomendar acções +``` + +## Metabase instance + +- **URL**: https://bi.descomplicar.pt/ +- **MCP**: metabase (metabase-ai-assistant v4.2.0) +- **134 tools** disponíveis via MCP + +## Colaboração + +- **Reports to**: Master Orchestrator +- **Colabora com**: Analytics Insights Agent, Finance Manager, Database Design Specialist +- **Escalar para**: Master Orchestrator (decisões estratégicas), Database Design Specialist (queries complexas) diff --git a/metabase/knowledge/datasets.json b/metabase/knowledge/datasets.json new file mode 100644 index 0000000..5b2ce9e --- /dev/null +++ b/metabase/knowledge/datasets.json @@ -0,0 +1,21 @@ +{ + "description": "Knowledge sources for Metabase BI domain", + "sources": { + "metabase_instance": { + "description": "Metabase BI instance - dados de negócio em tempo real", + "url": "https://bi.descomplicar.pt/", + "mcp": "metabase", + "tools_count": 134 + }, + "notebooklm": { + "description": "NotebookLM - conhecimento curado (se notebooks BI forem criados)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [] + }, + "dify_kb": { + "description": "Dify KB - datasets relacionados (fallback)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [] + } + } +} diff --git a/metabase/skills/dashboard/SKILL.md b/metabase/skills/dashboard/SKILL.md new file mode 100644 index 0000000..d622483 --- /dev/null +++ b/metabase/skills/dashboard/SKILL.md @@ -0,0 +1,141 @@ +--- +name: dashboard +description: Criar e gerir dashboards Metabase - criar questions, organizar visualizações, + adicionar filtros. Dashboards de negócio para bi.descomplicar.pt. +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 70 +user_invocable: true +desk_task: null +allowed-tools: Task, ToolSearch +--- + +# Skill /dashboard - Metabase Dashboard Management + +Criar e gerir dashboards Metabase com questions, visualizações e filtros para bi.descomplicar.pt. + +## Sintaxe + +``` +/dashboard [operação] [contexto] +``` + +**Operações:** +- `create [nome]` - Criar novo dashboard +- `add-card [dashboard_id]` - Adicionar question/card a dashboard +- `list` - Listar todos os dashboards +- `view [id]` - Ver detalhes de um dashboard +- `share [id]` - Obter link público de partilha +- `export [id]` - Exportar dados de um dashboard + +## Quando usar + +- Criar dashboards de negócio (vendas, marketing, operações) +- Adicionar visualizações a dashboards existentes +- Organizar métricas em painéis visuais +- Partilhar dashboards com equipa + +--- + +## Protocolo de execução + +### 1. Carregar MCP + +``` +ToolSearch("metabase") +``` + +### 2. Operação: create + +**Workflow completo para criar dashboard:** + +``` +1. CONFIRMAR objectivo com utilizador +2. Identificar database e tabelas relevantes + - mcp__metabase__list_databases + - mcp__metabase__get_database_tables +3. Escolher/criar collection destino + - mcp__metabase__list_collections +4. Criar questions/cards necessários + - Definir query (SQL ou query builder) + - Escolher tipo de visualização (bar, line, pie, table, number) +5. Criar dashboard + - mcp__metabase__create_dashboard (nome, descrição, collection_id) +6. Adicionar cards ao dashboard +7. Confirmar resultado com URL +``` + +**Tipos de visualização recomendados:** + +| Métrica | Visualização | +|---------|-------------| +| KPI singular (total vendas) | Number | +| Evolução temporal | Line chart | +| Comparação categorias | Bar chart | +| Distribuição/proporção | Pie chart | +| Dados detalhados | Table | +| Geográfico | Map | + +### 3. Operação: add-card + +``` +1. Verificar dashboard existe: mcp__metabase__get_dashboard +2. Criar question se necessário +3. Adicionar card ao dashboard +4. Confirmar posição e tamanho +``` + +### 4. Operação: list + +``` +1. mcp__metabase__list_dashboards +2. Apresentar: ID, nome, collection, cards count, última actualização +``` + +### 5. Operação: view + +``` +1. mcp__metabase__get_dashboard (id) +2. Mostrar: nome, descrição, cards, filtros, parâmetros +3. URL directa: https://bi.descomplicar.pt/dashboard/{id} +``` + +### 6. Operação: share + +``` +1. Gerar link público se não existir +2. Retornar URL de embed/partilha +``` + +### 7. Operação: export + +``` +1. Para cada card no dashboard, exportar dados +2. Formatar em tabela Markdown ou sugerir CSV +``` + +## Templates de dashboard + +### Dashboard vendas +- Total facturado (mês actual vs anterior) +- Facturas por estado (paid/unpaid/overdue) +- Top 10 clientes por valor +- Evolução mensal receita + +### Dashboard projectos +- Projectos activos vs concluídos +- Tarefas por estado +- Tempo registado por projecto +- Deadlines próximos + +### Dashboard suporte +- Tickets abertos vs fechados +- Tempo médio de resposta +- Tickets por departamento +- Satisfação cliente + +## Notas + +- Objectos criados via AI usam prefixo `claude_ai_` (comportamento do MCP) +- Sempre confirmar com utilizador antes de criar/modificar +- Preferir collections organizadas por tema diff --git a/metabase/skills/metabase/SKILL.md b/metabase/skills/metabase/SKILL.md new file mode 100644 index 0000000..8b9df2d --- /dev/null +++ b/metabase/skills/metabase/SKILL.md @@ -0,0 +1,126 @@ +--- +name: metabase +description: Operações Metabase BI - explorar databases, listar dashboards, gerir collections, + ver questions. Gateway para bi.descomplicar.pt via MCP. +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 70 +user_invocable: true +desk_task: null +allowed-tools: Task, ToolSearch +--- + +# Skill /metabase - Metabase BI Operations + +Operações Metabase BI - explorar databases, listar dashboards, gerir collections e questions via bi.descomplicar.pt. + +## Sintaxe + +``` +/metabase [operação] [contexto] +``` + +**Operações:** +- `explore` - Explorar databases e tabelas disponíveis +- `dashboards` - Listar e inspeccionar dashboards +- `collections` - Gerir collections (pastas) +- `questions` - Listar e inspeccionar questions/cards +- `search [termo]` - Pesquisar conteúdo no Metabase +- `users` - Listar utilizadores e permissões +- `status` - Estado geral da instância + +## Quando usar + +- Explorar que dados estão disponíveis no Metabase +- Ver dashboards existentes +- Gerir collections e organização +- Verificar estado da instância +- Operações administrativas gerais + +--- + +## Protocolo de execução + +### 1. Carregar MCP Metabase + +``` +ToolSearch("metabase") +``` + +Verificar que as tools `mcp__metabase__*` estão disponíveis. + +### 2. Operação: explore + +**Objectivo:** Mapear dados disponíveis. + +``` +1. Listar databases: mcp__metabase__list_databases +2. Para cada database relevante: mcp__metabase__get_database_tables +3. Para tabelas de interesse: mcp__metabase__get_table_fields +4. Apresentar resumo estruturado +``` + +**Output esperado:** +```markdown +## Databases disponíveis + +| ID | Nome | Engine | Tabelas | +|----|------|--------|---------| +| 1 | ... | ... | N | + +### Database: [Nome] +| Tabela | Campos | Registos | +|--------|--------|----------| +| ... | ... | ... | +``` + +### 3. Operação: dashboards + +``` +1. Listar dashboards: mcp__metabase__list_dashboards +2. Para cada dashboard: mostrar nome, descrição, cards +3. Se pedido detalhe: mcp__metabase__get_dashboard +``` + +### 4. Operação: collections + +``` +1. Listar collections: mcp__metabase__list_collections +2. Mostrar hierarquia de pastas +3. Contar items por collection +``` + +### 5. Operação: questions + +``` +1. Listar questions/cards: mcp__metabase__list_cards +2. Mostrar: nome, tipo, database, última execução +``` + +### 6. Operação: search + +``` +1. mcp__metabase__search_content com termo fornecido +2. Agrupar resultados por tipo (dashboard, card, table) +``` + +### 7. Operação: status + +``` +1. Listar databases e verificar conectividade +2. Contar dashboards, questions, collections +3. Listar utilizadores activos +4. Apresentar resumo +``` + +## Metabase instance + +- **URL**: https://bi.descomplicar.pt/ +- **MCP**: metabase (metabase-ai-assistant v4.2.0, 134 tools) +- **Auth**: API key (configurada no MCP) + +## Notas + +- Todas as operações são **read-only** por defeito +- Para operações de escrita (criar dashboard, etc.), usar `/dashboard` +- Para queries SQL, usar `/query` diff --git a/metabase/skills/query/SKILL.md b/metabase/skills/query/SKILL.md new file mode 100644 index 0000000..5d7f8ca --- /dev/null +++ b/metabase/skills/query/SKILL.md @@ -0,0 +1,155 @@ +--- +name: query +description: Executar queries SQL no Metabase com linguagem natural. Explorar tabelas, + extrair métricas, criar reports ad-hoc via bi.descomplicar.pt. +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 70 +user_invocable: true +desk_task: null +allowed-tools: Task, ToolSearch +--- + +# Skill /query - Metabase SQL Query Assistant + +Executar queries SQL no Metabase com assistência AI. Traduz perguntas em linguagem natural para SQL, explora tabelas e extrai métricas. + +## Sintaxe + +``` +/query [pergunta em linguagem natural ou SQL] +``` + +**Exemplos:** +- `/query quantos clientes temos activos?` +- `/query total facturado em Janeiro 2026` +- `/query top 10 produtos mais vendidos` +- `/query SELECT COUNT(*) FROM customers WHERE active = true` + +## Quando usar + +- Extrair dados específicos das bases de dados +- Responder perguntas de negócio com dados reais +- Análise ad-hoc rápida +- Validar hipóteses com números concretos +- Criar queries para futuros cards/questions + +--- + +## Protocolo de execução + +### 1. Carregar MCP + +``` +ToolSearch("metabase") +``` + +### 2. Compreender o pedido + +**Se linguagem natural:** +1. Identificar a pergunta de negócio +2. Determinar database e tabelas relevantes +3. Usar AI SQL generation do MCP se disponível + +**Se SQL directo:** +1. Validar syntax +2. Verificar que tabelas existem +3. Executar + +### 3. Explorar schema (se necessário) + +``` +1. mcp__metabase__list_databases → identificar database +2. mcp__metabase__get_database_tables → listar tabelas +3. mcp__metabase__get_table_fields → ver campos disponíveis +``` + +### 4. Construir e executar query + +``` +1. Construir SQL baseado no schema real +2. Executar via mcp__metabase__execute_sql +3. Validar resultados (nulls, zeros, outliers) +4. Formatar output +``` + +### 5. Apresentar resultados + +**Output format:** + +```markdown +## Query: [Descrição da pergunta] + +**Database:** [nome] | **Tabelas:** [lista] + +### Resultados + +| Col1 | Col2 | Col3 | +|------|------|------| +| ... | ... | ... | + +**Total registos:** N + +### Insight +[Interpretação breve dos dados] +``` + +## Boas práticas SQL + +### Performance +- Usar `LIMIT` em queries exploratórias (default: 100) +- Evitar `SELECT *` - especificar campos necessários +- Usar `WHERE` para filtrar antes de agregar +- Indexes: verificar campos indexados para JOINs + +### Segurança +- **Read-only**: o MCP opera em modo read-only por defeito +- Nunca executar DDL (CREATE, ALTER, DROP) sem confirmação +- Nunca executar DML (INSERT, UPDATE, DELETE) sem confirmação + +### Padrões comuns + +**Contagem com agrupamento:** +```sql +SELECT campo, COUNT(*) as total +FROM tabela +GROUP BY campo +ORDER BY total DESC +LIMIT 10; +``` + +**Evolução temporal:** +```sql +SELECT DATE_TRUNC('month', created_at) as mes, + COUNT(*) as total, + SUM(valor) as valor_total +FROM tabela +WHERE created_at >= NOW() - INTERVAL '12 months' +GROUP BY mes +ORDER BY mes; +``` + +**Comparação período actual vs anterior:** +```sql +SELECT + SUM(CASE WHEN created_at >= DATE_TRUNC('month', NOW()) THEN valor END) as mes_actual, + SUM(CASE WHEN created_at >= DATE_TRUNC('month', NOW() - INTERVAL '1 month') + AND created_at < DATE_TRUNC('month', NOW()) THEN valor END) as mes_anterior +FROM tabela; +``` + +## Guardar query como question + +Se o utilizador quiser reutilizar a query: +``` +1. Confirmar nome e descrição +2. Criar question/card no Metabase +3. Associar a collection adequada +4. Retornar URL directa +``` + +## Notas + +- Resultados limitados a 2000 linhas por defeito pelo MCP +- Para datasets grandes, usar agregações +- Queries complexas: delegar ao agente `metabase-analyst` diff --git a/negocio/agents/ecommerce-architect.md b/negocio/agents/ecommerce-architect.md index cca795a..31a77b0 100644 --- a/negocio/agents/ecommerce-architect.md +++ b/negocio/agents/ecommerce-architect.md @@ -7,6 +7,15 @@ role: USAR PROATIVAMENTE para estratégia e-commerce, plataformas, optimização domain: Design model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - moloni +recommended_mcps: + - google-workspace + - google-analytics + - dify-kb skills: - _core desk_task: null @@ -63,7 +72,20 @@ Arquitecto de soluções e-commerce - estratégia, plataformas e optimização d 5. Configurar analytics avançado 6. Estratégia de pricing e promoções -## Datasets Dify +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +- E-commerce Pratico (`226e384e`) +- Marketing Digital Avancado (`76647e0f`) + +``` +mcp__notebooklm__notebook_query notebook_id:"226e384e-d4bc-48f4-bb82-7927360436cc" query:"" +mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"" +``` + +### Dify KB (Secundario) + - E-commerce - Marketing Digital - Vendas @@ -123,7 +145,7 @@ Arquitecto de soluções e-commerce especializado em estratégia, plataformas e ## MCPs Relevantes - `desk-crm-v3`: Gestão de projectos e-commerce -- `dify-kb`: KB E-commerce, Marketing Digital, UX +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB E-commerce, Marketing Digital, UX - `memory-supabase`: Histórico de decisões estratégicas ## Colaboracao @@ -138,7 +160,11 @@ Arquitecto de soluções e-commerce especializado em estratégia, plataformas e - Clientes, projectos, facturas, time tracking - Usage: `mcp__desk-crm-v3__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) + - Gemini 2.5 RAG + - Usage: `mcp__notebooklm__notebook_query` + +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/negocio/agents/finance-manager.md b/negocio/agents/finance-manager.md index bcc537a..696f57d 100644 --- a/negocio/agents/finance-manager.md +++ b/negocio/agents/finance-manager.md @@ -7,6 +7,15 @@ role: Gestor financeiro especializado em controlos financeiros, orcamentacao e a domain: Business model: sonnet tools: Read, Write, Edit, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - moloni + - google-workspace +recommended_mcps: + - memory-supabase + - imap skills: - _core desk_task: 1503 @@ -42,7 +51,18 @@ Gestor financeiro responsavel por operacoes financeiras, orcamentacao, previsoes - Controlo de custos e optimizacao de despesas - Reporting financeiro e compliance regulatorio -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"financial management budgeting" +mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"financial planning ROI analysis" +mcp__notebooklm__notebook_query notebook_id:"f29c8457-f16d-4fb3-979d-6e5901de1b20" query:"business finances optimization" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao" query:"financial management budgeting" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Estrategia" query:"financial planning ROI analysis" @@ -99,7 +119,7 @@ Gestor financeiro responsavel por operacoes financeiras, orcamentacao, previsoes - `moloni`: Dados de facturação e despesas - `desk-crm-v3`: Pipeline vendas, projectos, horas - `google-workspace`: Sheets para orçamentos e análises -- `dify-kb`: KB Gestão, Estratégia +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB Gestão, Estratégia ## Colaboracao - Reports to: CFO @@ -120,7 +140,8 @@ Gestor financeiro responsavel por operacoes financeiras, orcamentacao, previsoes - Email, calendário, docs, drive - Usage: `mcp__google-workspace__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/negocio/agents/research-analyst.md b/negocio/agents/research-analyst.md index 146d91c..4169ae6 100644 --- a/negocio/agents/research-analyst.md +++ b/negocio/agents/research-analyst.md @@ -119,7 +119,17 @@ Analista de investigacao responsavel por realizar pesquisas aprofundadas, sintet - **PESTEL**: Political, Economic, Social, Tech, Environmental, Legal - **Benchmarking**: Comparacao multi-dimensional -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"analise competitiva mercado" +mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"decisoes estrategicas" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Estrategia" query:"analise competitiva mercado" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao" query:"decisoes estrategicas" diff --git a/negocio/agents/saas-architect.md b/negocio/agents/saas-architect.md index f504383..c8dd948 100644 --- a/negocio/agents/saas-architect.md +++ b/negocio/agents/saas-architect.md @@ -8,6 +8,15 @@ role: USAR PROATIVAMENTE para SaaS, multi-tenant, subscription billing, onboardi domain: Design model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - gitea +recommended_mcps: + - context7 + - google-workspace + - filesystem skills: - _core - saas @@ -91,7 +100,17 @@ Arquitecto responsavel por desenhar arquitecturas SaaS escaláveis, implementar - **Pricing**: Freemium, Trial, Enterprise custom - **Auth**: OAuth 2.0, SAML (enterprise), MFA -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"SaaS multi-tenant arquitectura" +mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"pricing revenue modelo negocio" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"SaaS multi-tenant arquitectura" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Estrategia" query:"pricing revenue modelo negocio" diff --git a/negocio/knowledge/datasets.json b/negocio/knowledge/datasets.json index 3d156b1..abf2e28 100644 --- a/negocio/knowledge/datasets.json +++ b/negocio/knowledge/datasets.json @@ -1,11 +1,95 @@ { - "description": "Dify KB datasets for Business domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "3d01315b-340e-41cc-8231-c3c0f833f58e", "name": "e-commerce", "priority": 1, "document_count": 93, "word_count": 20438662}, - {"id": "ded2e376-6893-4ec2-96dd-9d8df864706a", "name": "Empreendedorismo", "priority": 1, "document_count": 47, "word_count": 13701410}, - {"id": "ed718406-898f-4275-b343-caf70834525f", "name": "Agencia Digital", "priority": 2, "document_count": 5, "word_count": 1248791}, - {"id": "caf24d77-473c-496d-bf15-2a7f0d5a973b", "name": "Estrategia Descomplicar", "priority": 1, "document_count": 6, "word_count": 98345}, - {"id": "1c177cbc-3115-4a6b-80ab-a089abf80b3e", "name": "Aceleracao Digital", "priority": 2, "document_count": 23, "word_count": 7421647} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for Business domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "226e384e-d4bc-48f4-bb82-7927360436cc", + "title": "E-commerce Pratico", + "topics": [ + "e-commerce" + ], + "maps_from_dify": "e-commerce" + }, + { + "id": "79d43410-0e29-4be1-881d-84db6bdc239a", + "title": "Estrategia e Empreendedorismo", + "topics": [ + "empreendedorismo" + ], + "maps_from_dify": "Empreendedorismo" + }, + { + "id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", + "title": "Gestao de Operacoes", + "topics": [ + "agencia", + "digital" + ], + "maps_from_dify": "Agencia Digital" + }, + { + "id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", + "title": "Descomplicar: Marketing Digital", + "topics": [ + "estrategia", + "descomplicar" + ], + "maps_from_dify": "Estrategia Descomplicar" + }, + { + "id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", + "title": "Transformacao Digital e IA", + "topics": [ + "aceleracao", + "digital" + ], + "maps_from_dify": "Aceleracao Digital" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "3d01315b-340e-41cc-8231-c3c0f833f58e", + "name": "e-commerce", + "priority": 1, + "document_count": 93, + "word_count": 20438662 + }, + { + "id": "ded2e376-6893-4ec2-96dd-9d8df864706a", + "name": "Empreendedorismo", + "priority": 1, + "document_count": 47, + "word_count": 13701410 + }, + { + "id": "ed718406-898f-4275-b343-caf70834525f", + "name": "Agencia Digital", + "priority": 2, + "document_count": 5, + "word_count": 1248791 + }, + { + "id": "caf24d77-473c-496d-bf15-2a7f0d5a973b", + "name": "Estrategia Descomplicar", + "priority": 1, + "document_count": 6, + "word_count": 98345 + }, + { + "id": "1c177cbc-3115-4a6b-80ab-a089abf80b3e", + "name": "Aceleracao Digital", + "priority": 2, + "document_count": 23, + "word_count": 7421647 + } + ] + } + } +} \ No newline at end of file diff --git a/negocio/skills/ecommerce/SKILL.md b/negocio/skills/ecommerce/SKILL.md index 4c88968..57c6008 100644 --- a/negocio/skills/ecommerce/SKILL.md +++ b/negocio/skills/ecommerce/SKILL.md @@ -326,7 +326,7 @@ Marketplaces (Amazon/eBay): 300€ integração ```javascript // Estratégia de conversão -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24", query: "optimizar taxa conversao checkout abandono carrinho", retrieval_mode: "hybrid_search", diff --git a/negocio/skills/product/SKILL.md b/negocio/skills/product/SKILL.md index 20de5a4..6713a12 100644 --- a/negocio/skills/product/SKILL.md +++ b/negocio/skills/product/SKILL.md @@ -424,7 +424,7 @@ Medir: ```javascript // Product discovery best practices -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "cae2a27e-f5bc-4d75-8a7a-9f83064f2512", query: "product discovery validation framework jobs to be done", retrieval_mode: "hybrid_search", diff --git a/negocio/skills/research/SKILL.md b/negocio/skills/research/SKILL.md index 2cf40e0..5ad2cf7 100644 --- a/negocio/skills/research/SKILL.md +++ b/negocio/skills/research/SKILL.md @@ -413,7 +413,7 @@ Validação: ```javascript // Frameworks estratégicos -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7d1d1d21-bc05-43d8-ab8f-6b7b90dafc28", query: "swot porter pestel analise estrategica", retrieval_mode: "hybrid_search", diff --git a/negocio/skills/saas/SKILL.md b/negocio/skills/saas/SKILL.md index 9705950..dc8d697 100644 --- a/negocio/skills/saas/SKILL.md +++ b/negocio/skills/saas/SKILL.md @@ -438,7 +438,7 @@ app.get('/api/export', ```javascript // Modelos de pricing -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "7d1d1d21-bc05-43d8-ab8f-6b7b90dafc28", query: "saas pricing tiers feature packaging", retrieval_mode: "hybrid_search", diff --git a/perfex-dev/agents/perfex-crm-module-developer.md b/perfex-dev/agents/perfex-crm-module-developer.md index b2f33d7..beb3a41 100644 --- a/perfex-dev/agents/perfex-crm-module-developer.md +++ b/perfex-dev/agents/perfex-crm-module-developer.md @@ -7,6 +7,16 @@ role: Desenvolvimento de modulos personalizados para Perfex CRM com expertise em domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - ssh-unified + - gitea +recommended_mcps: + - context7 + - dify-kb + - filesystem skills: - _core - perfex-module-basics @@ -52,7 +62,17 @@ Especialista em desenvolvimento de modulos customizados, automacao de workflows - Desenvolvimento de ferramentas de reporting e dashboards customizados - Implementacao de integracoes com servicos terceiros (pagamentos, comunicacao) -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"df4688bb-c2c0-4aba-98c1-38c3b50a353c" query:"module development hooks customization" +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"PHP MVC CRM development" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"PerfexCRM" query:"module development hooks customization" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"PHP MVC CRM development" @@ -123,7 +143,7 @@ Especialista em desenvolvimento de modulos customizados, automacao de workflows ## MCPs Relevantes - `desk-crm-v3`: Acesso directo à BD Perfex para testes -- `dify-kb`: KB PerfexCRM, Desenvolvimento Software +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB PerfexCRM, Desenvolvimento Software - `ssh-unified`: Deploy de módulos em servidores - `gitea`: Versionamento de código @@ -146,7 +166,8 @@ Especialista em desenvolvimento de modulos customizados, automacao de workflows - SSH, SFTP, servidor management - Usage: `mcp__ssh-unified__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/perfex-dev/knowledge/datasets.json b/perfex-dev/knowledge/datasets.json index 8ad4b39..6ff38da 100644 --- a/perfex-dev/knowledge/datasets.json +++ b/perfex-dev/knowledge/datasets.json @@ -1,7 +1,32 @@ { - "description": "Dify KB datasets for Perfex CRM Development domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - {"id": "43354eb6-f0b2-40cc-aa53-44e375ab347c", "name": "PerfexCRM", "priority": 1, "document_count": 144, "word_count": 1547186} - ] -} + "description": "Knowledge sources (NotebookLM + Dify KB) for Perfex CRM Development domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", + "title": "Perfex CRM: Gestao de Clientes e Projetos", + "topics": [ + "perfexcrm" + ], + "maps_from_dify": "PerfexCRM" + } + ] + }, + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "43354eb6-f0b2-40cc-aa53-44e375ab347c", + "name": "PerfexCRM", + "priority": 1, + "document_count": 144, + "word_count": 1547186 + } + ] + } + } +} \ No newline at end of file diff --git a/project-manager/hooks/spec-gate.sh b/project-manager/hooks/spec-gate.sh index 792fd71..0ba5825 100755 --- a/project-manager/hooks/spec-gate.sh +++ b/project-manager/hooks/spec-gate.sh @@ -1,7 +1,7 @@ #!/bin/bash # spec-gate.sh - PreToolUse hook for Write/Edit # Avisa quando se tenta editar ficheiros sem SPEC.md aprovado -# Modo: SOFT (warnings only) - mudar exit 0 para exit 2 para hard mode +# Modo: HARD (bloqueia sem SPEC.md aprovado) # Autor: Descomplicar® | 2026-02-07 INPUT=$(cat) @@ -80,7 +80,7 @@ done # Sem SPEC.md - aviso suave if [ -z "$SPEC_FOUND" ]; then echo "SPEC-GATE: Sem SPEC.md neste projecto. Considere /spec create antes de comecar." - exit 0 # soft mode: nao bloqueia + exit 2 # hard mode: bloqueia fi # SPEC.md existe - verificar aprovacao @@ -93,5 +93,4 @@ fi echo "SPEC-GATE: SPEC.md existe mas NAO esta aprovado." echo " Ficheiro: $SPEC_FOUND" echo " Accao: /spec approve para aprovar, ou /spec bypass para quick fix (30min)" -exit 0 # soft mode: nao bloqueia -# Para hard mode, mudar a linha acima para: exit 2 +exit 2 # hard mode: bloqueia diff --git a/project-manager/skills/brainstorm/SKILL.md b/project-manager/skills/brainstorm/SKILL.md index 69cf45e..a2bd045 100644 --- a/project-manager/skills/brainstorm/SKILL.md +++ b/project-manager/skills/brainstorm/SKILL.md @@ -214,7 +214,10 @@ O utilizador nao precisa de saber quais existem - o brainstorm descobre. - Ideal para perguntas especificas e contexto profundo - Usar `search_notebooks` para descobrir + `ask_question` para perguntar -### Dify KB (fonte complementar - boas praticas) +### Knowledge Sources + +**Primario:** NotebookLM +**Fallback:** Dify KB (fonte complementar - boas praticas) - ~68 datasets com segmentos curtos e frameworks - Ideal para principios gerais e checklists - Usar `retrieve_segments` com queries focadas diff --git a/wordpress/agents/elementor-specialist.md b/wordpress/agents/elementor-specialist.md index 587abb3..88058e2 100644 --- a/wordpress/agents/elementor-specialist.md +++ b/wordpress/agents/elementor-specialist.md @@ -7,6 +7,16 @@ role: Especialista em desenvolvimento com Elementor Pro, criação de websites v domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - ssh-unified + - gitea +recommended_mcps: + - context7 + - filesystem + - dify-kb skills: - _core desk_task: null @@ -63,7 +73,18 @@ Especialista em desenvolvimento com Elementor Pro e criação de websites visuai 5. Optimizar performance Elementor 6. Criar templates reutilizáveis -## Datasets Dify +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +- WordPress e Elementor (`5be0d1a6`) + +``` +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"" +``` + +### Dify KB (Secundario) + - Wordpress - Elementor - Crocoblock @@ -122,7 +143,7 @@ Especialista em page building com Elementor Pro, entregando websites visuais de ## MCPs Relevantes - `ssh-unified`: Deploy e actualização de sites WordPress - `desk-crm-v3`: Gestão de projectos clientes -- `dify-kb`: KB WordPress, Elementor, Crocoblock +- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB WordPress, Elementor, Crocoblock ## Colaboracao @@ -140,7 +161,11 @@ Especialista em page building com Elementor Pro, entregando websites visuais de - SSH, SFTP, servidor management - Usage: `mcp__ssh-unified__*` -✓ **dify-kb** (knowledge) +✓ **notebooklm** (knowledge primaria) + - Gemini 2.5 RAG + - Usage: `mcp__notebooklm__notebook_query` + +✓ **dify-kb** (knowledge fallback) - Knowledge base AI - Usage: `mcp__dify-kb__*` diff --git a/wordpress/agents/woocommerce-specialist.md b/wordpress/agents/woocommerce-specialist.md index 429fafb..168a725 100644 --- a/wordpress/agents/woocommerce-specialist.md +++ b/wordpress/agents/woocommerce-specialist.md @@ -8,6 +8,16 @@ role: USAR PROATIVAMENTE para WooCommerce, loja online, e-commerce WordPress, ch domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - ssh-unified + - moloni +recommended_mcps: + - gitea + - context7 + - filesystem skills: - _core - woocommerce @@ -103,7 +113,17 @@ Developer WooCommerce responsavel por configurar lojas, desenvolver plugins cust | Stripe | Stripe | Cartoes internacionais | | PayPal | PayPal | Confianca internacional | -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"WooCommerce e-commerce plugins" +mcp__notebooklm__notebook_query notebook_id:"226e384e-d4bc-48f4-bb82-7927360436cc" query:"checkout conversao pagamentos" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"WooCommerce e-commerce plugins" mcp__dify-kb__dify_kb_retrieve_segments dataset:"E-commerce" query:"checkout conversao pagamentos" diff --git a/wordpress/agents/wordpress-performance-specialist.md b/wordpress/agents/wordpress-performance-specialist.md index 2bbaea2..63410a7 100644 --- a/wordpress/agents/wordpress-performance-specialist.md +++ b/wordpress/agents/wordpress-performance-specialist.md @@ -9,6 +9,15 @@ role: USAR PROATIVAMENTE para WordPress performance, WooCommerce speed, Core Web domain: Dev model: sonnet tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch + +# Dependencies +primary_mcps: + - desk-crm-v3 + - ssh-unified +recommended_mcps: + - lighthouse + - gitea + - filesystem skills: - _core desk_task: 1520 @@ -44,7 +53,17 @@ Especialista em optimizacao de performance WordPress e WooCommerce, focado em ma - Melhorar Core Web Vitals (LCP, FID, CLS) e PageSpeed scores - Configurar optimizacao de imagens, CSS/JS e lazy loading -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"performance caching optimizacao velocidade" +mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"servidor PHP OPcache Redis" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"performance caching optimizacao velocidade" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Elementor" query:"performance assets optimizacao" diff --git a/wordpress/agents/wordpress-plugin-developer.md b/wordpress/agents/wordpress-plugin-developer.md index 1a96462..722ab13 100644 --- a/wordpress/agents/wordpress-plugin-developer.md +++ b/wordpress/agents/wordpress-plugin-developer.md @@ -94,7 +94,17 @@ Especialista senior em desenvolvimento WordPress, criando plugins personalizados - Implementar custom post types, taxonomias e meta fields - Garantir seguranca (nonces, sanitizacao, validacao) e performance -## Datasets Dify (Consultar SEMPRE) +## Knowledge Sources (Consultar SEMPRE) + +### NotebookLM (Primario - usar PRIMEIRO) + +``` +mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"plugins hooks filters desenvolvimento" +mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"PHP arquitectura APIs" +``` + +### Dify KB (Secundario - se NotebookLM insuficiente) + ``` mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"plugins hooks filters desenvolvimento" mcp__dify-kb__dify_kb_retrieve_segments dataset:"Crocoblock" query:"JetEngine custom post types dynamic" diff --git a/wordpress/knowledge/datasets.json b/wordpress/knowledge/datasets.json index 8dec52b..423db82 100644 --- a/wordpress/knowledge/datasets.json +++ b/wordpress/knowledge/datasets.json @@ -1,48 +1,67 @@ { - "description": "Dify KB datasets for WordPress domain", - "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", - "datasets": [ - { - "id": "9da0b2b9-5051-4b99-b9f6-20bf35067092", - "name": "WordPress", - "priority": 1, - "document_count": 13, - "word_count": 819944 + "description": "Knowledge sources (NotebookLM + Dify KB) for WordPress domain", + "sources": { + "notebooklm": { + "description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)", + "query_tool": "mcp__notebooklm__notebook_query", + "notebooks": [ + { + "id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", + "title": "WordPress e Elementor", + "topics": [ + "wordpress" + ], + "maps_from_dify": "WordPress" + } + ] }, - { - "id": "9c77d3e2-4d88-4a43-abff-d4e681267cc7", - "name": "Elementor", - "priority": 1, - "document_count": 32, - "word_count": 622946 - }, - { - "id": "139cdf67-afce-46ec-9ccd-2a06040e5b9d", - "name": "Crocoblock", - "priority": 1, - "document_count": 403, - "word_count": 7566111 - }, - { - "id": "bdf85c26-1824-4021-92d1-be20501b35ac", - "name": "Crocoblock 2", - "priority": 2, - "document_count": 25, - "word_count": 1429775 - }, - { - "id": "2e9b7c48-c630-457a-83a0-db8e77f76eae", - "name": "Kivicare", - "priority": 2, - "document_count": 178, - "word_count": 1085806 - }, - { - "id": "c8489151-de94-42b2-8cee-c0b961cfac6d", - "name": "Desenvolvimento de WebSites", - "priority": 2, - "document_count": 31, - "word_count": 4366521 + "dify_kb": { + "description": "Dify KB - datasets tematicos (FALLBACK)", + "query_tool": "mcp__dify-kb__dify_kb_retrieve_segments", + "datasets": [ + { + "id": "9da0b2b9-5051-4b99-b9f6-20bf35067092", + "name": "WordPress", + "priority": 1, + "document_count": 13, + "word_count": 819944 + }, + { + "id": "9c77d3e2-4d88-4a43-abff-d4e681267cc7", + "name": "Elementor", + "priority": 1, + "document_count": 32, + "word_count": 622946 + }, + { + "id": "139cdf67-afce-46ec-9ccd-2a06040e5b9d", + "name": "Crocoblock", + "priority": 1, + "document_count": 403, + "word_count": 7566111 + }, + { + "id": "bdf85c26-1824-4021-92d1-be20501b35ac", + "name": "Crocoblock 2", + "priority": 2, + "document_count": 25, + "word_count": 1429775 + }, + { + "id": "2e9b7c48-c630-457a-83a0-db8e77f76eae", + "name": "Kivicare", + "priority": 2, + "document_count": 178, + "word_count": 1085806 + }, + { + "id": "c8489151-de94-42b2-8cee-c0b961cfac6d", + "name": "Desenvolvimento de WebSites", + "priority": 2, + "document_count": 31, + "word_count": 4366521 + } + ] } - ] -} + } +} \ No newline at end of file diff --git a/wordpress/skills/branda-menu/SKILL.md b/wordpress/skills/branda-menu/SKILL.md new file mode 100644 index 0000000..1a4e82b --- /dev/null +++ b/wordpress/skills/branda-menu/SKILL.md @@ -0,0 +1,572 @@ +--- +name: branda-menu +description: > + Organiza o menu admin WordPress via Branda (branda-white-labeling) em seccoes Descomplicar standard. Computa Branda IDs a partir de slugs WP, constroi menu custom com itens nativos reordenados + section headers, e guarda programaticamente via WP-CLI. Use when "branda menu", "organizar menu admin", "menu wordpress", "admin sidebar", "reorganizar admin". +author: Descomplicar Crescimento Digital +version: 1.0.0 +quality_score: 85 +user_invocable: true +category: wordpress +tags: [branda, wordpress, admin-menu, white-labeling, wip] +desk_project: 69 +allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified, mcp__memory-supabase +mcps: ssh-unified, memory-supabase +dependencies: + mcps: [ssh-unified] + plugins: [branda-white-labeling] +triggers: + - "User mentions 'branda menu', 'organizar menu', 'admin sidebar'" + - "User asks to reorganize WordPress admin menu" + - "Setting up new WiP site admin customization" +--- + +# /branda-menu - Organizar Menu Admin WordPress + +Skill para organizar o menu admin sidebar de qualquer site WordPress WiP usando o Branda (branda-white-labeling). + +--- + +## Arquitectura Branda (Referencia Interna) + +### Como o Branda gere menus + +O Branda usa um modulo `admin/menu.php` que intercepta o render do menu admin WordPress e substitui pela configuracao custom. + +**Options `wp_options` envolvidas:** + +| Option | Funcao | +|--------|--------| +| `ultimatebranding_activated_modules` | Modulos activos (precisa ter `admin/menu.php`) | +| `ub_custom_admin_menu` | Configuracao do menu custom por role | +| `ub_saved_admin_menus` | Captura do menu nativo WP (so para UI Branda, nao para render) | + +### Algoritmo de ID (critico) + +O Branda mapeia slugs WordPress para IDs internos usando: + +```php +function branda_id($slug) { + return "menu_item_" . substr(base_convert(md5($slug), 16, 32), 0, 12); +} +``` + +**Exemplo:** `index.php` -> `menu_item_42ho017e7jo0` + +Este algoritmo e determinista. O mesmo slug gera sempre o mesmo ID, independente do site. + +### Tipos de itens no menu + +| Tipo | Campos chave | Uso | +|------|-------------|-----| +| **Section header** | `link_type: "none"`, `css_classes: "menu-highlight"` | Separador visual com titulo | +| **Custom link** | `link_type: "custom"`, `custom_url: "..."` | Link manual (ex: Descomplicar) | +| **Native item** | `was_native: 1`, campos vazios | Item WP real, nome preenchido dinamicamente | +| **Hidden item** | `is_hidden: "1"`, `was_native: 1` | Item WP escondido do menu | + +### Mecanismo de merge (parse_args_deep) + +Na renderizacao, o Branda faz merge do menu configurado com o menu WP real: +- Itens nativos no config: aparecem na posicao configurada +- Itens nativos **nao** no config: inseridos na posicao default (aparecem misturados!) +- Itens custom: aparecem na posicao configurada +- Submenus vazios `[]`: auto-preenchidos com submenus reais do WP + +**Regra critica:** Incluir **todos** os itens nativos no config (visiveis na posicao desejada OU hidden). Se faltar algum, aparece na posicao default e quebra a organizacao. + +--- + +## Seccoes Standard Descomplicar (9) + +Todo site WiP deve ter o menu organizado nestas 9 seccoes, nesta ordem: + +| # | Seccao | Dashicon | Conteudo tipico | +|---|--------|----------|----------------| +| 1 | **Suporte** | dashicons-admin-tools | Link Descomplicar (desk.descomplicar.pt) | +| 2 | **Admin** | dashicons-admin-generic | Painel, Utilizadores, Opcoes, Plugins, Ferramentas | +| 3 | **Conteudo** | dashicons-admin-page | Paginas, CPTs do projecto, Artigos, Multimedia, ACF | +| 4 | **Design** | dashicons-admin-appearance | Elementor, Modelos, Jeg Kit, Apresentacao | +| 5 | **Marketing** | dashicons-megaphone | FluentCRM, Fluent Forms, Rank Math, WhatsApp, etc. | +| 6 | **Idiomas** | dashicons-translation | Polylang/WPML, Loco Translate (se multilingue) | +| 7 | **Performance** | dashicons-performance | WP Fastest Cache, WebP Express | +| 8 | **Seguranca** | dashicons-shield | Wordfence, Complianz | +| 9 | **WebMaster** | dashicons-admin-settings | Branda, Code Snippets, Activity Log | + +**Notas:** +- Seccao Idiomas so aparece se site for multilingue +- CPTs especificos do projecto (Tours, Servicos, etc.) vao em Conteudo +- Plugins sectoriais (KiviCare, WooCommerce, etc.) podem ter seccao propria entre Marketing e Idiomas + +--- + +## Itens tipicamente hidden + +Estes itens nativos devem ser incluidos no config com `is_hidden: "1"`: + +| Slug | Motivo | +|------|--------| +| `separator1`, `separator2`, `separator-last` | Separadores nativos substituidos por section headers | +| `edit-comments.php` | Comentarios raramente usados | +| `hello-elementor` | Pagina tema redundante com themes.php | +| `elementor` | Menu Elementor duplicado (ja existe elementor-home) | + +--- + +## Procedimento + +### Passo 1: Verificar pre-requisitos + +```bash +# Via MCP SSH - verificar Branda activo e modulo menu activo +mcp__ssh-unified__ssh_execute server:"server" command:"wp plugin is-active branda-white-labeling --allow-root --path=/home/USER/SITE && echo ACTIVE || echo INACTIVE" + +# Verificar modulo menu activo +mcp__ssh-unified__ssh_execute server:"server" command:"wp eval ' +\$m = get_option(\"ultimatebranding_activated_modules\", array()); +echo isset(\$m[\"admin/menu.php\"]) ? \"MENU MODULE ACTIVE\" : \"MENU MODULE INACTIVE\"; +' --allow-root --path=/home/USER/SITE" +``` + +Se modulo inactivo, activar: +```bash +mcp__ssh-unified__ssh_execute server:"server" command:"wp eval ' +\$m = get_option(\"ultimatebranding_activated_modules\", array()); +\$m[\"admin/menu.php\"] = \"yes\"; +update_option(\"ultimatebranding_activated_modules\", \$m); +echo \"Activado\"; +' --allow-root --path=/home/USER/SITE" +``` + +### Passo 2: Extrair menu nativo + +Obter lista de plugins activos e menu WP via WP-CLI. Como WP-CLI nao carrega todos os menus admin, usar este metodo combinado: + +**Opcao A (preferida): mu-plugin temporario** + +```bash +# Criar mu-plugin que captura menu no proximo page load +mcp__ssh-unified__ssh_execute server:"server" command:"cat > /home/USER/SITE/wp-content/mu-plugins/capture-menu.php << 'PHPEOF' + \$menu, + 'submenu' => \$submenu, + 'captured_at' => time() + )); + update_option('_branda_menu_captured', true); + + // Self-destruct + @unlink(__FILE__); +}, 999999); +PHPEOF +echo 'mu-plugin criado' +" +``` + +Depois, gerar cookie de auth e disparar um page load admin: +```bash +# Gerar cookie auth via WP-CLI +mcp__ssh-unified__ssh_execute server:"server" command:"wp eval ' +\$expiration = time() + 300; +\$cookie = wp_generate_auth_cookie(1, \$expiration, \"logged_in\"); +echo \$cookie; +' --allow-root --path=/home/USER/SITE" + +# Disparar page load admin com curl (substituir COOKIE e HASH) +mcp__ssh-unified__ssh_execute server:"server" command:"curl -s -o /dev/null -w '%{http_code}' -b 'wordpress_logged_in_HASH=COOKIE' https://SITE/wp-admin/" +``` + +Depois ler a captura: +```bash +mcp__ssh-unified__ssh_execute server:"server" command:"wp eval ' +\$cap = get_option(\"_branda_menu_capture\"); +if (\$cap) { + foreach (\$cap[\"menu\"] as \$pos => \$item) { + if (count(\$item) >= 3) { + \$slug = \$item[2]; + \$title = strip_tags(\$item[0]); + echo \"\$pos. \$title => \$slug\n\"; + } + } +} +' --allow-root --path=/home/USER/SITE" +``` + +**Opcao B (alternativa): Chrome DevTools** + +Se tiver acesso ao browser, navegar ao wp-admin e executar JS: +```javascript +Array.from(document.querySelectorAll('#adminmenu > li')).forEach((li, i) => { + const a = li.querySelector('a'); + if (a) { + const name = a.querySelector('.wp-menu-name')?.textContent?.trim() || a.textContent?.trim(); + const href = a.getAttribute('href') || ''; + console.log(i + '. ' + name + ' => ' + href); + } +}); +``` + +### Passo 3: Mapear itens para seccoes + +Com a lista de itens nativos, mapear cada um para a seccao correcta. + +**Mapeamento standard por slug:** + +``` +# Admin +index.php -> Admin +users.php -> Admin +options-general.php -> Admin +plugins.php -> Admin +tools.php -> Admin + +# Conteudo +edit.php -> Conteudo (Artigos) +edit.php?post_type=page -> Conteudo (Paginas) +upload.php -> Conteudo (Multimedia) +edit.php?post_type=acf-field-group -> Conteudo (ACF) +edit.php?post_type=* -> Conteudo (CPTs) + +# Design +elementor-home -> Design (Elementor) +edit.php?post_type=elementor_library -> Design (Modelos) +jkit -> Design (Jeg Kit) +themes.php -> Design (Apresentacao) + +# Marketing +fluentcrm-admin -> Marketing +fluent_forms -> Marketing +rank-math -> Marketing +click-to-chat -> Marketing + +# Idiomas (se multilingue) +mlang -> Idiomas (Polylang) +loco -> Idiomas (Loco Translate) + +# Performance +wpfastestcacheoptions -> Performance + +# Seguranca +Wordfence -> Seguranca +complianz -> Seguranca + +# WebMaster +branding -> WebMaster (Branda) +wpcode -> WebMaster (Code Snippets) + +# Hidden +separator1, separator2, separator-last -> Hidden +edit-comments.php -> Hidden +hello-elementor -> Hidden +elementor -> Hidden (duplicado de elementor-home) +``` + +**Itens que nao encaixam no standard:** Perguntar ao utilizador em que seccao colocar. Exemplos: WooCommerce, KiviCare, FareHarbor. + +### Passo 4: Construir e guardar o menu + +Criar um PHP script no servidor e executar com `wp eval-file`: + +```bash +mcp__ssh-unified__ssh_execute server:"server" command:"cat > /tmp/branda-menu-SITE.php << 'PHPEOF' + '', 'id_attribute' => '', 'css_classes' => '', + 'icon_svg' => '', 'icon_url' => '', 'icon_image_id' => '', + 'dashicon' => '', 'icon_type' => '', 'custom_url' => '', + 'link_type' => '', 'link_target' => '', 'is_invisible' => '', + 'is_hidden' => '', 'was_native' => 1, 'submenu' => \$subs + ); +} + +function hidden_item() { + \$item = native_item(); + \$item['is_hidden'] = '1'; + return \$item; +} + +function section_header(\$title, \$dashicon) { + return array( + 'icon_type' => 'dashicon', 'link_type' => 'none', + 'submenu' => array(), 'title' => \$title, + 'css_classes' => 'menu-highlight', 'dashicon' => \$dashicon + ); +} + +function custom_link(\$title, \$url, \$dashicon, \$target = '') { + return array( + 'icon_type' => 'dashicon', 'link_type' => 'custom', + 'submenu' => array(), 'title' => \$title, + 'dashicon' => \$dashicon, 'link_target' => \$target, + 'custom_url' => \$url + ); +} + +// === BUILD MENU === +\$menu = array(); + +// 1. SUPORTE +\$menu['menu_item_sec_suporte'] = section_header('Suporte', 'dashicons-admin-tools'); +\$menu['menu_item_desk_link'] = custom_link('Descomplicar', 'https://desk.descomplicar.pt/', 'dashicons-admin-comments', '_blank'); + +// 2. ADMIN +\$menu['menu_item_sec_admin'] = section_header('Admin', 'dashicons-admin-generic'); +\$menu[branda_id('index.php')] = native_item(); +\$menu[branda_id('users.php')] = native_item(); +\$menu[branda_id('options-general.php')] = native_item(); +\$menu[branda_id('plugins.php')] = native_item(); +\$menu[branda_id('tools.php')] = native_item(); + +// 3. CONTEUDO +\$menu['menu_item_sec_conteudo'] = section_header('Conteudo', 'dashicons-admin-page'); +\$menu[branda_id('edit.php?post_type=page')] = native_item(); +// [INSERIR CPTs DO PROJECTO AQUI] +\$menu[branda_id('edit.php')] = native_item(); +\$menu[branda_id('upload.php')] = native_item(); +\$menu[branda_id('edit.php?post_type=acf-field-group')] = native_item(); + +// 4. DESIGN +\$menu['menu_item_sec_design'] = section_header('Design', 'dashicons-admin-appearance'); +\$menu[branda_id('elementor-home')] = native_item(); +\$menu[branda_id('edit.php?post_type=elementor_library')] = native_item(); +// \$menu[branda_id('jkit')] = native_item(); // Se Jeg Kit activo +\$menu[branda_id('themes.php')] = native_item(); + +// 5. MARKETING +\$menu['menu_item_sec_marketing'] = section_header('Marketing', 'dashicons-megaphone'); +\$menu[branda_id('fluentcrm-admin')] = native_item(); +\$menu[branda_id('fluent_forms')] = native_item(); +\$menu[branda_id('rank-math')] = native_item(); +\$menu[branda_id('click-to-chat')] = native_item(); + +// 6. IDIOMAS (se multilingue) +// \$menu['menu_item_sec_idiomas'] = section_header('Idiomas', 'dashicons-translation'); +// \$menu[branda_id('mlang')] = native_item(); +// \$menu[branda_id('loco')] = native_item(); + +// 7. PERFORMANCE +\$menu['menu_item_sec_performance'] = section_header('Performance', 'dashicons-performance'); +\$menu[branda_id('wpfastestcacheoptions')] = native_item(); + +// 8. SEGURANCA +\$menu['menu_item_sec_seguranca'] = section_header('Seguranca', 'dashicons-shield'); +\$menu[branda_id('Wordfence')] = native_item(); +\$menu[branda_id('complianz')] = native_item(); + +// 9. WEBMASTER +\$menu['menu_item_sec_webmaster'] = section_header('WebMaster', 'dashicons-admin-settings'); +\$menu[branda_id('branding')] = native_item(); +\$menu[branda_id('wpcode')] = native_item(); + +// HIDDEN +\$menu[branda_id('separator1')] = hidden_item(); +\$menu[branda_id('separator2')] = hidden_item(); +\$menu[branda_id('separator-last')] = hidden_item(); +\$menu[branda_id('edit-comments.php')] = hidden_item(); +\$menu[branda_id('hello-elementor')] = hidden_item(); +\$menu[branda_id('elementor')] = hidden_item(); + +// SAVE +update_option('ub_custom_admin_menu', array('administrator' => \$menu)); +wp_cache_flush(); + +\$visible = count(array_filter(\$menu, function(\$i) { return empty(\$i['is_hidden']); })); +\$hidden = count(\$menu) - \$visible; +echo \"Menu guardado: \$visible visiveis + \$hidden hidden = \" . count(\$menu) . \" total\n\"; +PHPEOF +echo 'Script criado' +" + +# Executar +mcp__ssh-unified__ssh_execute server:"server" command:"wp eval-file /tmp/branda-menu-SITE.php --allow-root --path=/home/USER/SITE" +``` + +### Passo 5: Verificar + +```bash +# Contar itens no config +mcp__ssh-unified__ssh_execute server:"server" command:"wp eval ' +\$m = get_option(\"ub_custom_admin_menu\"); +\$items = \$m[\"administrator\"]; +echo \"Total: \" . count(\$items) . \"\n\"; +foreach (\$items as \$key => \$item) { + \$hidden = !empty(\$item[\"is_hidden\"]) ? \" [HIDDEN]\" : \"\"; + \$type = !empty(\$item[\"was_native\"]) ? \"native\" : (!empty(\$item[\"link_type\"]) && \$item[\"link_type\"] == \"none\" ? \"header\" : \"custom\"); + \$title = !empty(\$item[\"title\"]) ? \$item[\"title\"] : \"(native)\"; + echo \"\$key => \$type: \$title\$hidden\n\"; +} +' --allow-root --path=/home/USER/SITE" +``` + +Verificar visualmente no browser: navegar ao wp-admin e confirmar que o menu esta organizado nas 9 seccoes. + +### Passo 6: Limpar + +```bash +# Remover script temporario +mcp__ssh-unified__ssh_execute server:"server" command:"rm -f /tmp/branda-menu-SITE.php" + +# Limpar captura temporaria (se usou mu-plugin) +mcp__ssh-unified__ssh_execute server:"server" command:"wp eval ' +delete_option(\"_branda_menu_capture\"); +delete_option(\"_branda_menu_captured\"); +echo \"Limpo\"; +' --allow-root --path=/home/USER/SITE" + +# Garantir mu-plugin removido +mcp__ssh-unified__ssh_execute server:"server" command:"rm -f /home/USER/SITE/wp-content/mu-plugins/capture-menu.php 2>/dev/null; echo ok" +``` + +--- + +## Adaptar para sites especificos + +### Sites multilingue (Polylang/WPML) + +Descomentar seccao Idiomas no script. Adicionar: +```php +$menu['menu_item_sec_idiomas'] = section_header('Idiomas', 'dashicons-translation'); +$menu[branda_id('mlang')] = native_item(); // Polylang +$menu[branda_id('loco')] = native_item(); // Loco Translate +``` + +### Sites WooCommerce + +Adicionar seccao e-Commerce entre Marketing e Idiomas: +```php +$menu['menu_item_sec_ecommerce'] = section_header('e-Commerce', 'dashicons-cart'); +$menu[branda_id('woocommerce')] = native_item(); +// $menu[branda_id('wc-admin&path=/analytics/overview')] = native_item(); // Analytics WC +``` + +### Sites Care (KiviCare) + +Adicionar seccao Clinica entre Marketing e Idiomas: +```php +$menu['menu_item_sec_clinica'] = section_header('Clinica', 'dashicons-heart'); +$menu[branda_id('kivicare-...')] = native_item(); // Verificar slug exacto +``` + +### CPTs customizados + +Adicionar na seccao Conteudo, antes de Artigos: +```php +$menu[branda_id('edit.php?post_type=SLUG_CPT')] = native_item(); +``` + +### Itens desconhecidos + +Se o menu nativo tiver itens que nao encaixam no mapeamento standard: +1. Perguntar ao utilizador onde colocar +2. Se plugin temporario/teste: adicionar ao Hidden +3. Se plugin permanente: criar seccao propria ou adicionar a seccao existente + +--- + +## Troubleshooting + +### Menu nao muda apos guardar + +1. Limpar cache: `wp cache flush --allow-root` +2. Verificar modulo activo: `admin/menu.php` em `ultimatebranding_activated_modules` +3. Verificar role: config usa key `administrator` (nao `admin`) + +### Itens nativos aparecem fora das seccoes + +Causa: item nativo nao incluido no config (inserido na posicao default pelo parse_args_deep). +Fix: Identificar o slug do item, computar o Branda ID, adicionar ao config (visivel ou hidden). + +### Separadores nativos aparecem + +Causa: separadores com slugs diferentes dos standard (`separator1`, `separator2`, `separator-last`). +Fix: Verificar slugs via captura do menu nativo, adicionar como hidden. + +### Menu items custom aparecem em duplicado + +Causa: o mesmo item existe como custom link E como native item. +Fix: Remover o custom link, manter apenas o native item na posicao correcta. + +### CSS para esconder separadores em falta + +Adicionar ao CSS custom do Branda (ub_admin_css) como fallback: +```css +#adminmenu li.wp-menu-separator { display: none !important; } +``` + +--- + +## IDs de slugs comuns (referencia rapida) + +| Slug | Branda ID | +|------|-----------| +| `index.php` | `menu_item_42ho017e7jo0` | +| `edit.php` | `menu_item_6lk5pbiakha0` | +| `upload.php` | `menu_item_1jkdde99dfd0` | +| `edit.php?post_type=page` | `menu_item_774p5endtlu0` | +| `themes.php` | `menu_item_7jgmlsspgv60` | +| `plugins.php` | `menu_item_5g2kqk93qi30` | +| `users.php` | `menu_item_gajld83c8es0` | +| `tools.php` | `menu_item_3t0no8pv5bfg` | +| `options-general.php` | `menu_item_d1a8rsor9700` | +| `edit-comments.php` | `menu_item_252pn6seih20` | +| `separator1` | `menu_item_3u7nva84d1i0` | +| `separator2` | `menu_item_6lm7mo14a4r0` | +| `separator-last` | `menu_item_74g99t5jejn0` | +| `elementor-home` | `menu_item_2kehh8g6nop0` | +| `elementor` | `menu_item_27qkhd7iqao0` | +| `edit.php?post_type=elementor_library` | `menu_item_3rubghs8krfg` | +| `hello-elementor` | `menu_item_3q7v6ask7gpg` | +| `fluentcrm-admin` | `menu_item_4a7t8bi9mt30` | +| `fluent_forms` | `menu_item_ebai6etubd00` | +| `rank-math` | `menu_item_148bl1t91os0` | +| `click-to-chat` | `menu_item_1b65lubbpnd8` | +| `Wordfence` | `menu_item_1077vi8mf9b0` | +| `complianz` | `menu_item_5etmjgu9lnk0` | +| `wpfastestcacheoptions` | `menu_item_4hqsn1kbum10` | +| `branding` | `menu_item_7qde2b2f7670` | +| `wpcode` | `menu_item_69igp9fj4tl0` | +| `loco` | `menu_item_2c34vb7r1csg` | +| `mlang` | `menu_item_24um676vv08g` | +| `woocommerce` | Computar: `branda_id('woocommerce')` | +| `edit.php?post_type=acf-field-group` | `menu_item_70ga2p32mc70` | + +Para slugs nao listados, computar com: +```bash +wp eval 'echo "menu_item_" . substr(base_convert(md5("SLUG"), 16, 32), 0, 12);' --allow-root --path=/home/USER/SITE +``` + +--- + +## Checklist + +- [ ] Branda activo e modulo `admin/menu.php` activo +- [ ] Menu nativo extraido (todos os itens identificados) +- [ ] Todos os itens nativos incluidos no config (visiveis ou hidden) +- [ ] 9 seccoes criadas na ordem standard +- [ ] CPTs do projecto na seccao Conteudo +- [ ] Verificado visualmente no browser +- [ ] Script temporario e capturas removidos +- [ ] Permissoes corrigidas: `chown -R USER:USER /home/USER/SITE/` + +--- + +*Skill v1.0.0 | 26-02-2026 | Descomplicar* diff --git a/wordpress/skills/crocoblock/SKILL.md b/wordpress/skills/crocoblock/SKILL.md new file mode 100644 index 0000000..edebb1d --- /dev/null +++ b/wordpress/skills/crocoblock/SKILL.md @@ -0,0 +1,241 @@ +--- +name: crocoblock +description: > + Crocoblock ecosystem development with all JetPlugins for Elementor. Covers plugin selection, licensing, installation, + configuration and integration between JetEngine, JetSmartFilters, JetWooBuilder, JetElements, JetPopup, JetFormBuilder, + JetTabs, JetBlocks, JetSearch, JetBooking, JetThemeCore, JetReviews, JetTricks, JetCompareWishlist. + This skill should be used when the user asks about "crocoblock", "jet plugins", "jetelements", "jetwoobuilder", + "jetpopup", "jetsmartfilters", "jettabs", "jetformbuilder", "jetblocks", "jetbooking", "jetreviews", + "jetthemecore", "crocoblock license", "instalar crocoblock", "activar jet plugins", "ecosystem crocoblock", + "crocoblock subscription", "jet plugin escolher", "qual jet plugin usar", "crocoblock vs", "filtros ajax elementor", + "listing woocommerce elementor", "popup elementor crocoblock", "booking elementor", "reviews elementor". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +user_invocable: true +tags: [wordpress, elementor, crocoblock, jetengine, jetelements, jetsmartfilters, jetformbuilder] +allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified__ssh_execute, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments +category: dev +quality_score: 80 +updated: "2026-02-18T00:00:00Z" +--- + +# /crocoblock — Ecossistema Crocoblock + JetPlugins + +Desenvolvimento com o ecossistema Crocoblock: suite de plugins para Elementor cobrindo CPT, filtros AJAX, WooCommerce, forms, popups, booking e muito mais. + +## Matriz de Plugins + +| Plugin | Função Principal | Quando Usar | +|--------|-----------------|-------------| +| **JetEngine** | CPT, Meta Boxes, Relations, Query Builder, Listings, Dynamic Content | Qualquer site com conteúdo dinâmico/estruturado | +| **JetSmartFilters** | Filtros AJAX para listings e arquivos | Catálogos, portfolios, diretórios filtráveis | +| **JetWooBuilder** | Templates WooCommerce com Elementor | Lojas com design personalizado de produto/categoria/checkout | +| **JetElements** | Widgets adicionais (Timeline, Progress Bar, Circle Progress, Maps) | Adicionar widgets não disponíveis no Elementor base | +| **JetPopup** | Popups com triggers avançados | Lead capture, notificações, banners condicionais | +| **JetFormBuilder** | Forms com lógica condicional + notificações | Formulários complexos, integração CRM, booking light | +| **JetTabs** | Tabs, Accordions, Toggle | Conteúdo tabulado interactivo | +| **JetBlocks** | Widgets para header/footer (nav, cart, search) | Cabeçalhos e rodapés custom no Theme Builder | +| **JetSearch** | Pesquisa AJAX avançada | Sites com necessidade de search instantâneo | +| **JetBooking** | Sistema de booking/reservas | Alojamento, serviços com calendário de disponibilidade | +| **JetThemeCore** | Theme Builder alternativo ao Elementor Pro | Theme Builder sem licença Elementor Pro | +| **JetReviews** | Reviews/ratings para qualquer CPT | Reviews além de WooCommerce | +| **JetTricks** | Efeitos visuais (parallax, hotspot, unfold) | Elementos visuais avançados | +| **JetCompareWishlist** | Comparar e wishlist para produtos/CPT | E-commerce ou catálogos com comparação | + +## Licença e Instalação + +### Subscrição Crocoblock + +``` +Planos: Single Site / 3 Sites / Unlimited Sites (anual ou lifetime) +Todos os planos incluem todos os plugins + atualizações +Dashboard: account.crocoblock.com > Downloads +``` + +### Instalação (CWP) + +```bash +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" + +# 1. Upload do ZIP via WP Admin ou WP-CLI +$WP plugin install /tmp/jet-engine.zip --activate + +# 2. Activar licença (via WP Admin > JetPlugins Licences) +# Cada plugin tem campo de licença separado +# Ou activar globalmente em Crocoblock > License + +# 3. Verificar versões +$WP plugin list --search="jet*" --fields=name,version,status --format=table +``` + +### Ordem de Instalação Recomendada + +``` +1. JetEngine (base do ecossistema — criar antes de outros) +2. JetSmartFilters (depende do JetEngine para filtrar listings) +3. JetElements (widgets independentes) +4. JetWooBuilder (se WooCommerce presente) +5. JetFormBuilder (forms independentes) +6. JetPopup (depende de Elementor Pro ou JetThemeCore) +7. JetBlocks (apenas se Theme Builder activo) +8. Restantes (conforme necessidade) +``` + +## Integrações Principais + +### JetEngine + JetSmartFilters (padrão mais comum) + +``` +JetEngine Query Builder → Listing Grid → JetSmartFilters + ↑ + Filtros ligados ao mesmo Query Builder ID +``` + +**Passos:** +1. Criar CPT no JetEngine +2. Criar Query Builder (tipo: Posts) +3. Criar Listing Template com Elementor +4. Adicionar Listing Grid ao Elementor (apontar para o Query) +5. Adicionar Filter Widget e ligar ao mesmo Listing Grid + +### JetEngine + JetWooBuilder + +``` +CPT Produto (WooCommerce) → JetEngine Meta Boxes → JetWooBuilder Template + ↑ + Campos custom visíveis no template +``` + +### JetEngine + JetFormBuilder + +``` +JetFormBuilder → Submit → Create/Update JetEngine Post + → Notificação email + → Redirect +``` + +### JetPopup Triggers Disponíveis + +| Trigger | Uso | +|---------|-----| +| On page load | Newsletter, anúncio | +| Exit intent | Retenção de visitante | +| Scroll (%) | Conteúdo contextual | +| Click on element | Mais informação inline | +| After inactivity | Re-engagement | +| User logged in/out | Conteúdo condicional | + +## Dify KB — Consultar Antes de Implementar + +```javascript +// Dataset Crocoblock (primário) +mcp__dify-kb__dify_kb_retrieve_segments({ + dataset_id: "bdf85c26-1824-4021-92d1-be20501b35ac", + query: "[componente ou funcionalidade]" +}) + +// Dataset Crocoblock alternativo +mcp__dify-kb__dify_kb_retrieve_segments({ + dataset_id: "139cdf67-afce-46ec-9ccd-2a06040e5b9d", + query: "[componente ou funcionalidade]" +}) +``` + +## Troubleshooting Comum + +### Plugin não activa após upload + +```bash +# Verificar se Elementor está activo (dependência) +$WP plugin list --search=elementor --fields=name,status + +# Verificar erros PHP +$WP eval 'error_reporting(E_ALL); ini_set("display_errors", 1);' --allow-root --path=$PATH + +# Limpar transients após activar +$WP transient delete --all --allow-root --path=$PATH +``` + +### Conflito entre versões + +``` +Regra: Manter todos os JetPlugins na mesma major version +Verificar: account.crocoblock.com > Changelogs para breaking changes +``` + +### Listings não actualizam após filtrar + +```bash +# Regenerar CSS Elementor +$WP elementor flush-css --regenerate --allow-root --path=$PATH + +# Limpar cache de objecto +$WP cache flush --allow-root --path=$PATH +``` + +## Padrões de Uso por Tipo de Site + +### Site Corporativo / Portfolio + +``` +JetEngine (CPT: Projecto, Serviço, Testemunho) ++ JetSmartFilters (filtrar por categoria/tag) ++ JetElements (timeline, animações) +``` + +### E-commerce Avançado + +``` +WooCommerce + JetEngine (meta boxes extra) ++ JetWooBuilder (templates produto, categoria, cart) ++ JetCompareWishlist ++ JetSmartFilters (filtros loja) +``` + +### Directório / Listagem de Negócios + +``` +JetEngine (CPT: Negócio, com Relations para Categoria/Localização) ++ JetSmartFilters (filtros AJAX por localização, categoria, preço) ++ JetSearch (pesquisa instantânea) ++ JetEngine Maps (mapa de listagens) +``` + +### Portal com Accounts de Utilizador + +``` +JetEngine (CPT, Profile Builder) ++ JetFormBuilder (submissão de conteúdo por utilizador) ++ JetEngine Relations (conteúdo associado ao utilizador) +``` + +### Site com Reservas + +``` +JetBooking (calendário + disponibilidade) ++ JetFormBuilder (form de reserva) ++ JetEngine (meta boxes de propriedade/serviço) +``` + +## JetEngine MCP Server (v3.8.0+) + +A partir do JetEngine 3.8.0, existe integração nativa com agentes IA via **MCP Server**: + +``` +WP Admin > JetEngine > AI Command Center > Enable MCP Server +→ Claude pode inspecionar schema completo (CPTs, CCTs, Relações, Queries) +→ e criar/modificar estruturas via linguagem natural +``` + +Usar `references/automation.md` para detalhes sobre Formless Actions, JetSmartFilters Indexer e pipelines de automação. + +## Referências Adicionais + +- **`references/plugins.md`** — Referência detalhada de cada plugin (widgets, configurações, casos de uso avançados) +- **`references/patterns.md`** — Padrões de integração avançados (multi-relation, filtros aninhados, profile builder completo) +- **`references/automation.md`** — MCP Server nativo, JetFormBuilder Formless Actions, JetSmartFilters Indexer, Kits export/import, cache e riscos críticos + +--- + +**Versão**: 1.1.0 | **Autor**: Descomplicar® | **Data**: 18-02-2026 diff --git a/wordpress/skills/crocoblock/references/automation.md b/wordpress/skills/crocoblock/references/automation.md new file mode 100644 index 0000000..bca229f --- /dev/null +++ b/wordpress/skills/crocoblock/references/automation.md @@ -0,0 +1,294 @@ +# Crocoblock — Automação Headless e Integrações Avançadas + +## 1. JetEngine 3.8.0 — MCP Server Nativo + +A partir da versão 3.8.0, o JetEngine inclui um **MCP Server nativo** que expõe a topologia completa do site a agentes IA (Claude, Copilot, Cursor). + +### Activar o MCP Server + +``` +WP Admin > JetEngine > AI Command Center > Enable MCP Server +→ URL do servidor: https://site.pt/wp-json/jet-engine/v1/mcp +→ Autenticação: Application Password +``` + +### Capacidades do MCP + +| Capacidade | Descrição | +|-----------|-----------| +| Inspecção de schema | Lista CPTs, CCTs, Meta Boxes, Taxonomias, Relações | +| Criação de CPT | Instanciar novo Custom Post Type via prompt | +| Criação de CCT | Definir Custom Content Type com campos tipados | +| Definir relações | Criar estruturas relacionais entre entidades | +| Query Builder | Criar queries estruturadas | + +**Caso de uso:** Cliente especifica necessidades → Claude interroga MCP → constrói arquitectura completa (CPT + CCT + Relations + Queries) sem GUI. + +--- + +## 2. JetFormBuilder — Formless Actions Endpoints + +O addon **Formless Actions Endpoints** permite usar as acções de um formulário JetFormBuilder como endpoint REST puro, sem renderizar formulário no frontend. + +### Como Activar + +``` +JetFormBuilder > Settings > Formless Actions Endpoints: Enable +Cada formulário recebe rota: POST /wp-json/jet-fb/v1/form/{form_id} +``` + +### Payload de Exemplo + +```bash +# Submeter dados para formulário sem interface visual +# Acciona todas as Post Submit Actions configuradas (Create Post, Email, Webhook, etc.) +curl -X POST https://site.pt/wp-json/jet-fb/v1/form/1234 \ + -H "Authorization: Basic dXNlcjpwYXNz..." \ + -H "Content-Type: application/json" \ + -d '{ + "nome_cliente": "Empresa ABC", + "email": "contacto@empresaabc.pt", + "valor_contrato": 5000, + "tipo_servico": "website" + }' +``` + +### Encadear Acções Complexas + +``` +Um único request pode: +1. Criar Post no CPT "Projecto" com status pending +2. Enviar email ao admin +3. Actualizar relação Cliente↔Projecto +4. Enviar Webhook para n8n +5. Criar registo em CCT "Notificacoes" +``` + +### Interceptar com Hook Custom + +```php +get_all(); + $texto = sanitize_textarea_field($dados['descricao'] ?? ''); + $post_id = absint($dados['post_id'] ?? 0); + + if (empty($texto) || !$post_id) { + // Cancelar o processamento com erro + throw new \Jet_Form_Builder\Exceptions\Action_Exception('campos_obrigatorios_vazios'); + } + + // Validação via API externa (exemplo: análise de risco) + $score = minha_api_de_risco($texto); + + if ($score > 90) { + throw new \Jet_Form_Builder\Exceptions\Action_Exception('risco_inaceitavel'); + } + + // Actualizar meta field com o score calculado + update_post_meta($post_id, '_score_risco', $score); + + $action_handler->add_response([ + 'status' => 'success', + 'message' => 'Processado com sucesso.', + 'score' => $score, + ]); + +}, 10, 2); +``` + +### Tabela de Registos + +```sql +-- JetFormBuilder guarda registo de cada submissão +SELECT * +FROM wp_jet_fb_records +WHERE form_id = 1234 +ORDER BY id DESC +LIMIT 10; +``` + +--- + +## 3. JetSmartFilters — Indexer e Automação + +### O Indexer + +O JetSmartFilters tem um subsistema de contagem chamado **Indexer** que mapeia contadores em `jet_smart_filters_indexer`. + +```sql +-- Ver contagens indexadas +SELECT * FROM jet_smart_filters_indexer +WHERE filter_id = 550 +LIMIT 20; +``` + +**Problema:** Após actualizações SQL directas nas tabelas CCT ou wp_jet_rel_default, os contadores dos filtros ficam desactualizados. + +**Solução:** + +```php +indexer->index_all(); + } +}); +``` + +```bash +# Via WP-CLI +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" +$WP eval "jet_smart_filters()->indexer->index_all();" +``` + +### Manipular Filtros Programaticamente + +```php + '100', + 'max' => '500', + ]; + + // Forçar AJAX + $args['apply_type'] = 'ajax'; + + return $args; + +}, 10, 2); +``` + +### Forçar Re-indexação após SQL Massivo + +```php + 'POST', + 'callback' => function() { + wp_cache_flush(); + \Jet_Engine\Query_Builder\Manager::instance()->listings_cache->clear(); + jet_smart_filters()->indexer->index_all(); + return rest_ensure_response(['success' => true, 'message' => 'Re-indexação concluída.']); + }, + 'permission_callback' => function() { + return current_user_can('edit_posts'); + }, + ]); +}); +``` + +--- + +## 4. Kits e Templates — Export/Import Programático + +### Estrutura de um Kit + +``` +Kit JSON (manifest.json): +├── CPTs com todas as configurações +├── CCTs com schema de campos +├── Meta Boxes +├── Taxonomias +├── Relações +├── Query Builder queries +├── Listing Templates (Elementor) +└── JetFormBuilder forms +``` + +### Export via WP-CLI + +```bash +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" + +# Exportar estrutura JetEngine para JSON +$WP eval ' +$cpts = get_option("jet_engine_cpt", []); +$ccls = get_option("jet_engine_ccl", []); +$rels = get_option("jet_engine_relations", []); +$metas = get_option("jet_engine_meta_boxes", []); +$kit_data = compact("cpts", "ccls", "rels", "metas"); +file_put_contents("/tmp/kit-jetengine.json", json_encode($kit_data, JSON_PRETTY_PRINT)); +' +echo "Kit exportado para /tmp/kit-jetengine.json" +``` + +### Import em Novo Ambiente + +```bash +# ATENÇÃO: os IDs das relações mudam entre ambientes +# Sempre usar slugs como referência, não IDs numéricos + +$WP eval-file /tmp/import-kit.php +$WP cache flush +$WP rewrite flush +``` + +### Pitfall de Migração — IDs de Relações + +``` +Problema: CCT item #45 no staging → ID #45 + Mesmo item no production após import → ID #102 + → Relações wp_jet_rel_default ficam com IDs errados + +Solução: Usar slug/título como referência durante migração + Converter para ID após import via get_posts(['name' => 'slug']) + Ou usar WP All Import para recriar relações com mapeamento de IDs +``` + +--- + +## 5. Integração WooCommerce + JetEngine + +### Queries em Produtos WooCommerce + +``` +Produtos WooCommerce são CPT 'product' → compatíveis com JetEngine +Query Builder pode filtrar produtos por meta fields JetEngine adicionados +JetWooBuilder consome estas queries para listagens customizadas +``` + +### Relações com Produtos + +```sql +-- Produtos relacionados com CPT "Fornecedor" via JetEngine Relations +SELECT p.post_title AS produto, f.post_title AS fornecedor +FROM wp_posts p +JOIN wp_jet_rel_default r ON r.child_object_id = p.ID +JOIN wp_posts f ON f.ID = r.parent_object_id +WHERE r.rel_id = 'relacao_fornecedores_produtos' +AND p.post_status = 'publish'; +``` + +--- + +## 6. Limitações e Riscos Críticos + +| Risco | Impacto | Mitigação | +|-------|---------|-----------| +| SQL directo em wp_postmeta serializado | **Crítico** — corrupção de dados | NUNCA. Usar PHP `unserialize → edit → serialize` | +| store_items_type = "replace" na REST API | **Destrutivo** — apaga todas as relações | Usar "update" salvo intenção explícita | +| Alterar wp_options serializados via SQL | **Crítico** — instalação WordPress corrompida | Sempre via PHP `get_option → update_option` | +| SQL sem flush de cache | Dados obsoletos em listings | Sempre `wp_cache_flush()` + `listings_cache->clear()` + `indexer->index_all()` | +| Registar meta boxes antes de init prioridade 12 | Falha silenciosa | Usar hook `jet-engine/meta-boxes/register-instances` | +| Importar Kit entre versões JetEngine diferentes | Dependências fantasma no Query Builder | Manter versões alinhadas em staging e production | + +--- + +*Crocoblock Automation | Descomplicar® | 18-02-2026* diff --git a/wordpress/skills/crocoblock/references/patterns.md b/wordpress/skills/crocoblock/references/patterns.md new file mode 100644 index 0000000..0625f78 --- /dev/null +++ b/wordpress/skills/crocoblock/references/patterns.md @@ -0,0 +1,220 @@ +# Crocoblock — Padrões de Integração Avançados + +## Padrão 1: Directório com Filtros + Mapa + +**Plugins:** JetEngine + JetSmartFilters + JetElements (Maps) + +``` +Arquitectura: +CPT "Negócio" (com meta: morada, coordenadas, categoria, horário) + ↓ +Query Builder (posts, post_type=negocio) + ↓ +┌────────────────┬──────────────────┐ +│ Listing Grid │ Listing Map │ +│ (cards) │ (pins) │ +└────────────────┴──────────────────┘ + ↑ sincronizados ↑ + JetSmartFilters: + - Categoria (checkbox, taxonomy) + - Localização (select, meta) + - Pesquisa (search text) + - Raio de distância (range, meta GPS) +``` + +**Configuração de sincronização:** +``` +Listing Map > Settings: +├── Synchronize with Listing Grid: YES +└── Listing Grid Selector: ID do widget Listing Grid + +JetSmartFilters > Apply For: +└── Seleccionar ID do Listing Grid + (o mapa segue automaticamente via sincronização) +``` + +--- + +## Padrão 2: Marketplace / Multi-vendor Simples + +**Plugins:** JetEngine + JetFormBuilder + JetSmartFilters + Profile Builder + +``` +Fluxo do vendedor: +1. Registo (JetFormBuilder → Register User) +2. Login +3. Dashboard vendedor (Profile Builder) +4. Criar produto (JetFormBuilder → Create Post no CPT) +5. Produto aparece no catálogo (Listing Grid filtrado por author) + +Fluxo do comprador: +1. Catálogo com filtros (JetSmartFilters) +2. Contactar vendedor (JetFormBuilder → Email ao author) +3. Ver perfil vendedor (Profile Builder page pública) +``` + +**Relations necessárias:** +``` +User → N Produtos (one-to-many) +User → N Favoritos (many-to-many) +Produto → N Reviews (one-to-many, via JetReviews) +``` + +--- + +## Padrão 3: Portal de Imobiliário + +**Plugins:** JetEngine + JetSmartFilters + JetWooBuilder (opcional) + JetBooking + +``` +CPT: Imóvel +Meta Boxes: +├── Preço (number) +├── Área m² (number) +├── Tipologia (select: T0/T1/T2/T3/T4+) +├── Tipo (select: venda/arrendamento) +├── Localização (taxonomy: Distrito → Concelho → Freguesia) +├── Coordenadas (map) +├── Galeria (gallery) +├── Características (checkbox-list: piscina, garagem, jardim...) +└── Agente responsável (posts: CPT Agente) + +Query Builder: +├── Ordenação: data / preço / área +└── Meta Query: tipo = "arrendamento" (para página específica) + +JetSmartFilters: +├── Range: Preço min-max +├── Range: Área min-max +├── Checkboxes: Tipologia +├── Select Hierarchical: Localização +├── Checkboxes: Características +└── Sorting: Preço ASC/DESC, Mais recentes +``` + +--- + +## Padrão 4: E-learning / Cursos + +**Plugins:** JetEngine + JetFormBuilder + Profile Builder + +``` +CPTs: +├── Curso (conteúdo, preço, dutor) +├── Lição (sub-item do curso) +└── Avaliação (questionário) + +Relations: +├── Curso → N Lições (one-to-many) +├── Utilizador → N Cursos Inscritos (many-to-many) +└── Utilizador → N Avaliações (one-to-many) + +Profile Builder Pages: +├── Meus Cursos (Query: cursos onde utilizador está inscrito) +├── Continuar Lição (última lição acedida) +└── Certificados (download PDF após conclusão) + +Automatização: +JetFormBuilder → compra → Inscrever no curso → Criar relação User↔Curso +``` + +--- + +## Padrão 5: Multi-Relation (Relações Aninhadas) + +``` +Exemplo: Agência → Clientes → Projectos → Tarefas + +Relations JetEngine: +├── agencia_clientes: Agência (1) → Clientes (N) +├── cliente_projectos: Cliente (1) → Projectos (N) +└── projecto_tarefas: Projecto (1) → Tarefas (N) + +No Listing Template de Agência: +├── Lista de Clientes (Relation Field Widget) +│ └── Dentro de cada Cliente: Lista de Projectos (nested listing) +│ └── Dentro de cada Projecto: Contador de Tarefas + +Nota: Listings aninhados afectam performance. + Limitar a 2 níveis de profundidade. + Para listas longas, usar AJAX/JetSmartFilters paginado. +``` + +--- + +## Padrão 6: User-Generated Content (UGC) + +**Plugins:** JetEngine + JetFormBuilder + Profile Builder + JetSmartFilters + +``` +Fluxo: +1. Utilizador logado → Dashboard (Profile Builder) +2. Formulário "Submeter Conteúdo" (JetFormBuilder) + → Action: Create Post no CPT "Aviso" com status "pending" + → Action: Email de notificação ao admin +3. Admin aprova → post_status = publish +4. Conteúdo aparece no listing público + +Queries do Dashboard: +├── "Os meus avisos" → Query: author = %current_user_id% + status = any +└── "Aprovados" → Query: author = %current_user_id% + status = publish + +Moderação rápida: +├── Admin lista pendentes com Listing Grid +└── JetFormBuilder inline para aprovar/rejeitar (Update Post Status) +``` + +--- + +## Padrão 7: JetBooking + WooCommerce + JetEngine + +``` +Fluxo de Reserva: +1. Página de serviço (CPT Serviço com meta JetEngine) +2. Calendário JetBooking (disponibilidade em tempo real) +3. Seleccionar datas → Form de reserva (JetFormBuilder ou JetBooking nativo) +4. Checkout WooCommerce (JetBooking cria produto temporário) +5. Pagamento → Reserva confirmada +6. Email de confirmação (JetBooking + SMTP) +7. Dashboard cliente (Profile Builder → Minhas Reservas) + +Automatização n8n: +JetBooking webhook → n8n → Google Calendar → SMS (via Twilio) +``` + +--- + +## Anti-Padrões (Evitar) + +### Demasiados JetPlugins Activos + +``` +Problema: Cada JetPlugin adiciona JS/CSS extra +Solução: Desactivar plugins não usados em cada site específico +Ferramenta: JetPlugins > Settings > Disable components não usados +``` + +### Listings Sem Paginação em Catálogos Grandes + +``` +Problema: Listing Grid sem paginação carrega todos os posts → PHP timeout +Solução: Sempre activar paginação ou Load More em listas >20 items +``` + +### JetSmartFilters Sem AJAX + +``` +Problema: URL-based filters recarregam a página inteira +Uso correcto: AJAX filters para UX fluida; URL-based apenas para SEO +``` + +### Meta Boxes em CCT Desnecessariamente + +``` +CCT não suporta taxonomies nativas, comentários, revisões. +Usar CPT quando precisar dessas funcionalidades WordPress. +``` + +--- + +*Crocoblock Patterns | Descomplicar® | 18-02-2026* diff --git a/wordpress/skills/crocoblock/references/plugins.md b/wordpress/skills/crocoblock/references/plugins.md new file mode 100644 index 0000000..81eb3cd --- /dev/null +++ b/wordpress/skills/crocoblock/references/plugins.md @@ -0,0 +1,240 @@ +# Crocoblock — Referência Detalhada de Plugins + +## JetElements + +Widgets adicionais para Elementor. Não depende do JetEngine. + +### Widgets Principais + +| Widget | Uso | +|--------|-----| +| Animated Box | Caixa com flip/hover reveal | +| Circle Progress | Gauge circular animado | +| Timeline | Cronologia vertical/horizontal | +| Countdown Timer | Contador regressivo | +| Scroll Navigation | Navegação por secções | +| Maps | Google Maps avançado | +| Weather | Widget de meteorologia | +| Price List | Lista de preços | +| Progress Bar | Barra de progresso | +| Slider | Slider de imagens/conteúdo | +| Portfolio | Grid de portfolio com filtros | +| Testimonials | Slider de testemunhos | + +--- + +## JetSmartFilters + +Filtros AJAX para qualquer listing (JetEngine, WooCommerce, Archive). + +### Tipos de Filtros + +| Tipo | Quando Usar | +|------|-------------| +| Checkboxes | Categorias múltiplas | +| Radio | Opção única (ordenação) | +| Select | Dropdown de valores | +| Range | Preço, área (slider min-max) | +| Date Range | Filtrar por datas | +| Search | Pesquisa por texto | +| Rating | Filtrar por estrelas | +| Color Picker | Filtros visuais por cor | + +### Configuração Essencial + +``` +1. Criar filter em JetSmartFilters > Filters +2. Seleccionar Source: JetEngine Query / WC_Query / WP_Query +3. Seleccionar Field: meta field / taxonomy / post field +4. Adicionar Filter Widget ao Elementor +5. Ligar ao Listing Grid via "Apply filters for" (seleccionar ID do listing) +``` + +### Filtros Aninhados (Dependent Filters) + +``` +Exemplo: Distrito → Concelho (filho depende do pai) +- Configurar taxonomy pai e filho no JetEngine +- Em JetSmartFilters: activar "Hierarchical taxonomy filter" +- Ou usar "Visible terms" com condição dinâmica +``` + +--- + +## JetWooBuilder + +Templates custom para WooCommerce via Elementor. + +### Templates Disponíveis + +| Template | Substitui | +|----------|-----------| +| Shop (Archive) | Página principal da loja | +| Product | Single product page | +| Cart | Página de carrinho | +| Checkout | Página de checkout | +| My Account | Dashboard do cliente | +| Thank You | Página pós-compra | +| Category | Página de categoria | + +### Widgets JetWooBuilder + +``` +Products Grid # Grid de produtos com query custom +Product Price # Preço com styling avançado +Product Gallery # Galeria com thumbnails +Add to Cart # Botão com variantes +Product Tabs # Descrição, Reviews, Atributos +Related Products # Produtos relacionados +Mini Cart # Cart dropdown +``` + +### Configurar Template de Produto + +``` +1. JetWooBuilder > Templates > Add New +2. Template Type: Product +3. Editar com Elementor — arrastar widgets JetWoo +4. Conditions: incluir "Product" (todos) ou específico por categoria/tag +``` + +--- + +## JetFormBuilder + +Forms com lógica condicional, integrações e notificações. + +### Tipos de Campos + +``` +Text, Email, Tel, URL, Number, Textarea +Date, Time, DateTime +Select, Radio, Checkboxes +File Upload, Image Upload +Hidden Field, Calculated Field +Repeater Field (subformulário dinâmico) +``` + +### Acções Pós-Submit + +| Acção | Função | +|-------|--------| +| Send Email | Notificação email standard | +| Send Email (Advanced) | Template HTML customizado | +| Create Post | Criar CPT (com JetEngine) | +| Update User | Actualizar user meta | +| Webhook | Enviar para n8n/Make/Zapier | +| Redirect | Redirecionar após submit | +| Register User | Criar conta WP | +| Login User | Login automático | +| MailChimp/ActiveCampaign | Subscrição newsletter | + +### Formulário Silencioso (Para n8n) + +```php +// Receber POST externo que passa pelas validações do JetFormBuilder +// Criar formulário com campos que correspondem ao payload +// Submeter via HTTP POST para: /wp-json/jet-form-builder/v1/process-form +// Autenticação: Application Passwords +``` + +--- + +## JetPopup + +Popups com triggers e condições de display avançadas. + +### Triggers + +| Trigger | Config | +|---------|--------| +| On Page Load | Delay em segundos | +| Exit Intent | Detecta movimento para fora | +| Scroll to Element | Scroll até % ou selector CSS | +| Click on Element | Selector CSS do trigger | +| After Inactivity | Segundos sem interacção | +| After N Page Views | Contador de visitas | +| Once Per Session | Não repete na sessão | + +### Conditions (Display) + +``` +URL match / URL contains +User logged in / out +User role +Device type (mobile/desktop) +WooCommerce: cart empty/not empty, specific product in cart +JetEngine: post type, taxonomy, specific post +``` + +--- + +## JetBooking + +Sistema de booking com calendário de disponibilidade. + +### Fluxo Base + +``` +1. Configurar Unidade de Booking (ex: Quarto, Serviço) +2. Definir preços (diários, por horas, temporada) +3. Definir disponibilidade e check-in/check-out rules +4. Criar template de booking com Elementor +5. Adicionar Calendário + Booking Form ao template +6. Configurar emails de confirmação +``` + +### Integração WooCommerce + +``` +JetBooking → WooCommerce Product → Checkout WooCommerce +- Preço calculado automaticamente (n noites × preço/noite) +- Stock = disponibilidade do calendário +``` + +--- + +## JetBlocks + +Widgets para construir headers e footers com Elementor. + +### Widgets Disponíveis + +``` +Navigation Menu # Menu responsivo avançado +Site Logo # Logo com dark mode toggle +Cart Button # Contador de itens no carrinho +Search Box # Pesquisa com AJAX +Auth Links # Login/Logout dinâmico +User Name # Nome do utilizador logado +Breadcrumbs # Fil d'Ariane +Mobile Menu # Menu hamburger +``` + +--- + +## JetThemeCore + +Theme Builder alternativo ao Elementor Pro (para licenças Free). + +### Templates + +``` +Header / Footer +Single (Posts, CPT) +Archive (Category, Tag, CPT Archive) +Search Results +404 +``` + +### Diferença vs Elementor Pro Theme Builder + +``` +JetThemeCore: Gratuito, condições básicas +Elementor Pro: Mais condições, melhor integração com Popup Builder +Recomendação: Usar Elementor Pro se disponível +``` + +--- + +*Crocoblock Plugins Reference | Descomplicar® | 18-02-2026* diff --git a/wordpress/skills/elementor/SKILL.md b/wordpress/skills/elementor/SKILL.md index 074bede..24be5a8 100644 --- a/wordpress/skills/elementor/SKILL.md +++ b/wordpress/skills/elementor/SKILL.md @@ -2,17 +2,21 @@ name: elementor description: > Advanced development with Elementor Pro and Crocoblock ecosystem. Creates custom widgets, configures Theme Builder, develops with JetEngine, JetWooBuilder, optimizes performance and troubleshoots issues. + Also covers programmatic automation: deploy pipelines, kit import, replace-urls, flush-css, MySQL manipulation of _elementor_data, REST API endpoints, Dynamic Tags, CSS cache invalidation. Use when building Elementor sites, creating custom widgets, configuring theme templates, developing with Crocoblock, or when user mentions - "elementor", "custom widget", "theme builder", "jetengine", "crocoblock", "jetwoobuilder", "page builder", "elementor pro". + "elementor", "custom widget", "theme builder", "jetengine", "crocoblock", "jetwoobuilder", "page builder", "elementor pro", + "deploy elementor", "pipeline elementor", "elementor kit import", "elementor replace-urls", "elementor flush-css", + "automação elementor", "elementor programático", "elementor mysql", "rebranding elementor", "elementor rest api", + "elementor dynamic tag", "elementor cache", "elementor agente ia", "elementor wp-cli". author: Descomplicar® Crescimento Digital -version: 1.1.0 +version: 1.2.0 user_invocable: true -tags: [wordpress, elementor, pagebuilder, crocoblock, jetengine, widgets] +tags: [wordpress, elementor, pagebuilder, crocoblock, jetengine, widgets, automation, wpcli] desk_task: 1478 -allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified__ssh_execute, mcp__dify-kb__dify_kb_retrieve_segments +allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified__ssh_execute, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments category: dev -quality_score: 75 -updated: "2026-02-04T18:00:00Z" +quality_score: 80 +updated: "2026-02-18T00:00:00Z" --- # /elementor - Elementor Development @@ -237,14 +241,21 @@ Elementor > Settings > Advanced > Breakpoints ## Troubleshooting -### Widget não aparece +### Widget não aparece / CSS desactualizado ```bash -# Limpar cache Elementor -wp elementor flush-css --allow-root +# CWP — SEMPRE com prefixo PHP completo +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" -# Regenerar ficheiros CSS -wp elementor replace_urls --old=http --new=https --allow-root +# Regenerar CSS (após qualquer alteração programática) +$WP elementor flush-css --regenerate + +# Substituição segura de URLs (NUNCA usar wp search-replace directamente) +$WP elementor replace-urls https://antigo.com https://novo.com + +# Sincronizar BD após update do plugin +$WP elementor update db ``` ### Erro após update @@ -264,6 +275,20 @@ Elementor > Tools > Version Control > Rollback 5. Limitar widgets por página ``` +## Automação Programática (WP-CLI / MySQL / REST API) + +Para deploy automatizado, pipelines IA, migração em massa e manipulação programática do Elementor sem GUI, consultar: + +**`references/automation.md`** — Referência completa com: +- Pipeline de deploy CWP (kit import + replace-urls + flush-css) +- Estrutura `_elementor_data` JSON e queries MySQL com `JSON_REPLACE` +- REST API custom endpoint (com `wp_slash`, cache invalidation) +- PHP Dynamic Tags para conteúdo runtime (requer Pro) +- Geração de Kit ZIP em Python +- Rebranding global via `elementor_active_kit` +- Regras críticas (NUNCA `wp search-replace` em `_elementor_data`) +- MCP Elementor (Ultimate Elementor MCP, ~60 tools) + ## Datasets Dify | Dataset | ID | Prioridade | @@ -275,4 +300,10 @@ Elementor > Tools > Version Control > Rollback --- -**Versão**: 1.0.0 | **Autor**: Descomplicar® +## Referências Adicionais + +- **`references/automation.md`** — Automação programática completa (WP-CLI pipelines, MySQL, REST API, PHP Hooks, Kits, CSS) + +--- + +**Versão**: 1.2.0 | **Autor**: Descomplicar® | **Actualizado**: 18-02-2026 diff --git a/wordpress/skills/elementor/references/automation.md b/wordpress/skills/elementor/references/automation.md new file mode 100644 index 0000000..a4fcac8 --- /dev/null +++ b/wordpress/skills/elementor/references/automation.md @@ -0,0 +1,417 @@ +# Elementor — Automação Programática e Pipelines + +Referência técnica para manipular o Elementor sem GUI: WP-CLI, MySQL, REST API, PHP Hooks, Kits e CSS. + +--- + +## 1. WP-CLI + Elementor (CWP) + +### Formato Obrigatório CWP + +```bash +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" +``` + +### Comandos Essenciais + +```bash +# Regenerar CSS (SEMPRE após qualquer alteração programática) +$WP elementor flush-css --regenerate + +# Substituição segura de URLs (evita corrupção JSON) +# NUNCA usar wp search-replace directamente em _elementor_data +$WP elementor replace-urls $URL_OLD $URL_NEW +$WP search-replace $URL_OLD $URL_NEW --skip-columns=guid + +# Importar Kit (design system completo) +$WP elementor kit import /tmp/kit.zip \ + --include=site-settings,templates,content \ + --overrideConditions=all + +# Sincronizar esquema BD após update do plugin +$WP elementor update db + +# Modo manutenção +$WP maintenance-mode activate +$WP maintenance-mode deactivate +``` + +### Pipeline de Deploy Completo + +```bash +#!/bin/bash +# Pipeline de rebranding via WP-CLI (CWP) +PHP="/opt/alt/php-fpm83/usr/bin/php" +SITE_PATH="/home/USER/public_html" +KIT_PATH="/tmp/rebranding-2026.zip" +URL_OLD="https://staging.agencia.com" +URL_NEW="https://www.producao.com" +WP="$PHP /usr/local/bin/wp --allow-root --path=$SITE_PATH" + +$WP maintenance-mode activate +$WP elementor kit import $KIT_PATH --include=site-settings,templates,content --overrideConditions=all +$WP elementor replace-urls $URL_OLD $URL_NEW +$WP search-replace $URL_OLD $URL_NEW --skip-columns=guid +$WP elementor flush-css --regenerate +$WP elementor update db +$WP maintenance-mode deactivate +``` + +### Avaliação do Método + +| Critério | Análise | +|----------|---------| +| Complexidade | Baixa — sintaxe documentada, comportamento previsível | +| Segurança | Alta — invoca internos do WordPress, risco apenas em SSH | +| Usar quando | Deploy, purga de cache, migração de URLs, sincronização BD | + +--- + +## 2. Manipulação Directa via MySQL + +### Estrutura _elementor_data + +O Elementor guarda layouts como JSON em `wp_postmeta`. Três meta keys obrigatórias: + +| Meta Key | Valor | +|----------|-------| +| `_elementor_edit_mode` | `builder` | +| `_elementor_template_type` | `wp-page`, `kit`, `header`, `footer` | +| `_elementor_data` | JSON array com toda a árvore de widgets | + +### Estrutura JSON Interna + +```json +[{ + "id": "3130e2cf", + "elType": "container", + "isInner": false, + "settings": { ... }, + "elements": [{ + "id": "a1b2c3d4", + "elType": "widget", + "widgetType": "button", + "settings": { + "text": "Clique aqui", + "link": { "url": "https://exemplo.com" } + } + }] +}] +``` + +### Query MySQL com JSON_REPLACE + +```sql +-- Substituição cirúrgica num widget específico +-- SEMPRE fazer backup antes +UPDATE wp_postmeta +SET meta_value = JSON_REPLACE( + meta_value, + '$.elements.elements.settings.link.url', + 'https://www.novo-destino.com/contacto' +) +WHERE meta_key = '_elementor_data' +AND post_id IN (1042, 1045, 1088); + +-- OBRIGATÓRIO após qualquer UPDATE directo: +-- Executar 'wp elementor flush-css --regenerate' via WP-CLI +``` + +### Regra Crítica: NUNCA wp search-replace + +```bash +# ERRADO — corrompe JSON silenciosamente (whitespace of death) +wp search-replace 'http://antigo.com' 'https://novo.com' + +# CORRECTO — usa lógica nativa do Elementor +wp elementor replace-urls 'http://antigo.com' 'https://novo.com' +``` + +### Avaliação do Método + +| Critério | Análise | +|----------|---------| +| Complexidade | Alta — parsing JSON, funções MySQL JSON_* | +| Segurança | Muito Baixa — sem validação, um char inválido corrompe a página | +| Usar quando | Auditoria forense, extracção analítica em massa (10.000+ posts) | + +--- + +## 3. REST API Custom Endpoint + +Para agentes externos (n8n, Make, Python) manipularem layouts via HTTP. + +### Registar Endpoint (functions.php ou plugin MU) + +```php + 'POST', + 'callback' => 'ai_agent_update_elementor_layout', + 'permission_callback' => function() { + return current_user_can('edit_pages'); + } + ]); +}); + +function ai_agent_update_elementor_layout(WP_REST_Request $request) { + $post_id = absint($request->get_param('post_id')); + $json_data = $request->get_param('elementor_json'); + + // wp_slash é OBRIGATÓRIO — protege JSON de corrupção de escape + update_post_meta($post_id, '_elementor_data', wp_slash(json_encode($json_data))); + update_post_meta($post_id, '_elementor_edit_mode', 'builder'); + + // Invalidação de cache OBRIGATÓRIA + delete_post_meta($post_id, '_elementor_css'); + if (did_action('elementor/loaded')) { + \Elementor\Plugin::$instance->files_manager->clear_cache(); + } + + return rest_ensure_response([ + 'status' => 'success', + 'post_id' => $post_id + ]); +} +``` + +### Autenticação + +```bash +# Via Application Passwords (WordPress 5.6+) +curl -X POST https://site.pt/wp-json/agencia-ai/v1/atualizar-layout \ + -H "Authorization: Basic $(echo -n 'user:app-password' | base64)" \ + -H "Content-Type: application/json" \ + -d '{"post_id": 2607, "elementor_json": [...]}' +``` + +### Avaliação do Método + +| Critério | Análise | +|----------|---------| +| Complexidade | Média — endpoint PHP + formatar JSON _elementor_data válido | +| Segurança | Alta — usa permissões WordPress + HTTPS | +| Usar quando | Webhooks, n8n/Make, geração de páginas a partir de CRM | + +--- + +## 4. PHP Hooks — Dynamic Tags + +Para conteúdo que se actualiza em runtime sem reescrever JSON. + +### Registar Dynamic Tag + +```php +register(new IA_Agente_Metrica_Tag()); +}); +``` + +### Padrão: Agente IA actualiza Transient + +```php +// Agente IA executa isto remotamente (via eval-file ou endpoint) +set_transient('ia_agente_ultima_metrica', '

    Taxa de conversão: 4.2%

    ', DAY_IN_SECONDS); +``` + +### Avaliação do Método + +| Critério | Análise | +|----------|---------| +| Complexidade | Alta — OOP PHP, Event Loop WordPress, DynamicTags | +| Segurança | Muito Alta — lógica server-side, CI/CD, sem exposição JSON | +| Usar quando | Conteúdo em tempo real (cotações, stock, métricas) — requer Elementor **Pro** | + +--- + +## 5. Site Kits — Estrutura e Geração + +### Estrutura ZIP de um Kit + +``` +kit.zip +├── manifest.json # Índice mestre — mapeamento de todos os ficheiros +├── site-settings.json # Cores globais, tipografia, configurações do tema +├── header-template.json # Template de cabeçalho +├── footer-template.json # Template de rodapé +└── page-template.json # Templates de páginas +``` + +### manifest.json (estrutura mínima) + +```json +{ + "templates": [ + { + "title": "Header Principal", + "type": "header", + "fileName": "header-template.json" + } + ], + "site_settings": { + "title": "Site Settings", + "fileName": "site-settings.json" + } +} +``` + +### Geração em Python + +```python +import json, zipfile, os + +kit_settings = { + "version": "0.4", + "title": "Site Settings", + "settings": { + "system_colors": [ + {"_id": "primary", "title": "Primária", "color": "#1E40AF"}, + {"_id": "secondary", "title": "Secundária", "color": "#10B981"} + ], + "system_typography": [ + {"_id": "primary", "title": "Principal", "typography_font_family": "Inter"} + ] + } +} + +manifest = { + "templates": [], + "site_settings": {"title": "Site Settings", "fileName": "site-settings.json"} +} + +os.makedirs('/tmp/kit_build', exist_ok=True) + +with open('/tmp/kit_build/site-settings.json', 'w') as f: + json.dump(kit_settings, f) + +with open('/tmp/kit_build/manifest.json', 'w') as f: + json.dump(manifest, f) + +with zipfile.ZipFile('/tmp/agencia-kit.zip', 'w') as z: + z.write('/tmp/kit_build/manifest.json', 'manifest.json') + z.write('/tmp/kit_build/site-settings.json', 'site-settings.json') + +# Importar via WP-CLI (CWP) +# /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp elementor kit import /tmp/agencia-kit.zip \ +# --include=site-settings,templates --overrideConditions=all \ +# --allow-root --path=/home/USER/public_html +``` + +--- + +## 6. CSS — Invalidação de Cache + +### Localização dos Ficheiros CSS + +``` +wp-content/uploads/elementor/css/post-{ID}.css # CSS por página +wp-content/uploads/elementor/css/global.css # CSS global +``` + +### Invalidação Programática (PHP) + +```php +// Após qualquer alteração directa a _elementor_data ou post_meta +if (did_action('elementor/loaded')) { + \Elementor\Plugin::$instance->files_manager->clear_cache(); +} + +// Alternativa: apagar meta específica +delete_post_meta($post_id, '_elementor_css'); +``` + +### Rebranding Global — Kit Activo + +```php +// Obter ID do kit activo +$kit_id = get_option('elementor_active_kit'); + +// Ler configurações globais +$settings = get_post_meta($kit_id, '_elementor_page_settings', true); + +// Alterar cor primária +if (!empty($settings['system_colors'])) { + foreach ($settings['system_colors'] as &$cor) { + if ($cor['_id'] === 'primary') { + $cor['color'] = '#FF0000'; + } + } +} + +// Guardar (wp_slash protege o JSON) +update_post_meta($kit_id, '_elementor_page_settings', $settings); + +// Invalidar cache CSS +if (did_action('elementor/loaded')) { + \Elementor\Plugin::$instance->files_manager->clear_cache(); +} +``` + +--- + +## 7. Regras Críticas e Riscos + +### Nunca fazer + +| Erro | Consequência | Correcto | +|------|-------------|----------| +| `wp search-replace` em `_elementor_data` | Corrupção silenciosa do JSON, layout desaparece | `wp elementor replace-urls` | +| UPDATE MySQL sem flush-css | CSS desactualizado, design dessincronizado | Sempre `wp elementor flush-css --regenerate` | +| `update_post_meta` sem `wp_slash()` | Corrupção de escapes no JSON | `wp_slash(json_encode($data))` | +| Múltiplos agentes a editar o mesmo post | Sobreposição de dados | Locks ou filas de processamento | + +### IDs de Widgets São Aleatórios + +Os IDs de nós JSON (ex: `"id":"3130e2cf"`) são alfanuméricos aleatórios. Para manipular um widget específico via MySQL ou REST API: + +1. Fazer parsing da árvore JSON completa primeiro +2. Encontrar o widget pelo `widgetType` ou conteúdo +3. Só então operar no ID correcto + +### Limitações Elementor Free vs Pro + +| Funcionalidade | Free | Pro | +|----------------|------|-----| +| `wp elementor flush-css` | ✅ | ✅ | +| `wp elementor kit import` | ✅ | ✅ | +| Dynamic Tags | ❌ | ✅ | +| Theme Builder (header/footer) | ❌ | ✅ | + +--- + +## 8. MCP Elementor (Integração Futura) + +O projecto **Ultimate Elementor MCP** expõe ~60 ferramentas para manipulação via linguagem natural: + +- `create_container`, `create_heading`, `delete_element` +- `get_page_structure` — lê árvore JSON (resolve problema dos IDs aleatórios) +- `update_widget_settings` + +**Autenticação:** Application Passwords ou JWT (mesma arquitectura do REST API). + +**Quando usar:** Assistentes conversacionais, automações complexas onde formatar JSON raw em Python seria impraticável. + +**Referência:** [Ultimate Elementor MCP — LobeHub](https://lobehub.com/mcp/mbrown1837-ultimate-elementor-mcp) + +--- + +*Automação Elementor | Descomplicar® | Baseado em: Manipulação Programática do Elementor — Automação via IA | 18-02-2026* diff --git a/wordpress/skills/jetengine/SKILL.md b/wordpress/skills/jetengine/SKILL.md new file mode 100644 index 0000000..4419fd3 --- /dev/null +++ b/wordpress/skills/jetengine/SKILL.md @@ -0,0 +1,295 @@ +--- +name: jetengine +description: > + JetEngine development: Custom Post Types (CPT), Custom Content Types (CCT), Meta Boxes, Taxonomies, + Relations, Query Builder, Listing Grid, Listing Map, Dynamic Content, Dynamic Tags, Macros, Profile Builder, + REST API, and headless/programmatic automation for AI agents and n8n integration. + This skill should be used when the user asks about "jetengine", "jet engine", "custom post type jetengine", + "meta box jetengine", "relations jetengine", "query builder jetengine", "listing grid", "listing map", + "jetengine dynamic content", "jetengine macros", "profile builder jetengine", "cct jetengine", + "custom content type", "jetengine cct", "jetengine rest api", "jetengine n8n", "jetengine sql", + "jetengine automação", "jetengine headless", "wp_jet_rel_default", "wp_jet_cct", "jetengine relations", + "conteúdo dinâmico elementor jetengine", "jetengine filtros", "jetengine repeater". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +user_invocable: true +tags: [wordpress, elementor, crocoblock, jetengine, cpt, cct, listings, dynamic-content] +allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified__ssh_execute, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments +category: dev +quality_score: 85 +updated: "2026-02-18T00:00:00Z" +--- + +# /jetengine — JetEngine Development + +JetEngine é o núcleo do ecossistema Crocoblock: cria CPT, CCT, Meta Boxes, Relations, Queries e Listings com conteúdo dinâmico para Elementor. + +## CPT vs CCT — Escolha Crítica + +| | Custom Post Type (CPT) | Custom Content Type (CCT) | +|--|----------------------|--------------------------| +| **Storage** | `wp_posts` + `wp_postmeta` | Tabela SQL própria `wp_jet_cct_{slug}` | +| **Performance** | Lenta em queries complexas | Muito rápida (colunas reais) | +| **Compatibilidade** | Total WP ecosystem | Limitada (sem taxonomies nativas) | +| **REST API** | `/wp-json/wp/v2/{slug}` | `/wp-json/jet-cct/{slug}` | +| **Automação** | `wp_insert_post()` | `CCT_Data_Handler` ou SQL directo | +| **Usar quando** | Conteúdo editorial, SEO, plugins WP | Alta performance, CRUD automatizado, dashboards | + +**Regra prática:** CPT para conteúdo público/SEO; CCT para dados internos, integrações e alta escala. + +## Criar CPT + +``` +JetEngine > Post Types > Add New +├── Slug (único, sem espaços, lowercase) +├── Labels (Singular / Plural) +├── Suporte: title, editor, thumbnail, excerpt, custom-fields +├── REST API: Activar para integração externa +├── Archive: Activar se precisar de página de listagem +└── Admin Columns: Mostrar meta fields na tabela admin +``` + +## Meta Boxes e Campos + +### Tipos de Campos + +| Tipo | Uso | +|------|-----| +| `text` | Texto simples | +| `textarea` | Texto longo | +| `wysiwyg` | Editor rich text | +| `number` | Valor numérico | +| `select` | Dropdown de opções | +| `checkbox` | Verdadeiro/falso | +| `checkbox-list` | Múltipla selecção | +| `radio` | Opção única | +| `date` | Data (timestamp) | +| `media` | Upload de ficheiro/imagem | +| `gallery` | Múltiplas imagens | +| `repeater` | Campo repetível (sub-campos) | +| `posts` | Relação simples (seleccionar posts) | +| `color-picker` | Cor HEX | +| `map` | Coordenadas geográficas | +| `html` | HTML estático (apenas display) | + +### Repeater — Estrutura + +``` +Repeater Field "galeria_servicos": + ├── sub-campo: imagem (media) + ├── sub-campo: titulo (text) + └── sub-campo: descricao (textarea) + +Aceder em PHP: +$items = get_post_meta($post_id, 'galeria_servicos', true); +foreach ($items as $item) { ... } +``` + +## Relations + +### Tipos de Relação + +| Tipo | Exemplo | +|------|---------| +| One-to-Many | 1 Empresa → N Colaboradores | +| Many-to-Many | N Projectos ↔ N Tags custom | +| Self-relation | Artigo relacionado com outros artigos | +| User-to-Post | Utilizador → N Reservas | + +### Tabela SQL das Relações + +```sql +-- wp_jet_rel_default +-- parent_object_id | child_object_id | rel_id (hash da relação) + +-- Ler todos os filhos de um pai +SELECT child_object_id +FROM wp_jet_rel_default +WHERE parent_object_id = 123 +AND rel_id = 'relacao_empresa_colaboradores'; + +-- Ler o pai a partir de um filho +SELECT parent_object_id +FROM wp_jet_rel_default +WHERE child_object_id = 456 +AND rel_id = 'relacao_empresa_colaboradores'; +``` + +**Importante:** Nunca editar esta tabela directamente via SQL para criar relações — usar a API PHP do JetEngine (ver `references/automation.md`). + +## Query Builder + +Substitui o `WP_Query` com interface visual. Ligar ao Listing Grid. + +### Tipos de Query + +| Tipo | Usa | +|------|-----| +| Posts | CPT, posts, páginas | +| Terms | Taxonomias | +| Users | Utilizadores WP | +| Custom Content Type | Tabelas CCT | +| REST API | Endpoint externo | + +### Configurar Query Posts + +``` +JetEngine > Query Builder > Add New +├── Query Type: Posts +├── Post Type: [seleccionar CPT] +├── Order By: date / meta_value / rand / menu_order +├── Meta Query: adicionar condições de meta fields +├── Tax Query: filtrar por taxonomia +└── Author: específico ou current user +``` + +### Usar no Listing Grid + +``` +Elemento Elementor: Listing Grid +├── Listing Item: [seleccionar Listing Template] +├── Use Custom Query: YES → seleccionar Query criado acima +├── Items per page: N +└── Pagination: Activar se necessário +``` + +## Listing Grid e Listing Template + +### Criar Listing Template + +``` +JetEngine > Listings > Add New +├── Template Type: Default / Popup +├── Content From: Posts / CCT / User / Term +└── Editar com Elementor → usar Dynamic Tags +``` + +### Dynamic Tags no Listing Template + +``` +Post Title → {{ post_title }} +Field de Meta → Meta Field → seleccionar nome do campo +Imagem → Featured Image → meta field media +Link → Post URL / Custom Field URL +Relação → Relation Field +``` + +### Listing Map + +``` +JetEngine > Listings > Add New > Template Type: Map +├── Configurar campo de coordenadas (tipo: map no meta box) +├── Google Maps API Key: WP Admin > JetEngine > Settings +└── Ligar ao Query Builder +``` + +## Dynamic Content e Macros + +### Macros Comuns + +``` +%current_user_id% # ID do utilizador logado +%current_post_id% # ID do post actual +%queried_object_id% # ID do objecto em arquivo/single +%request_field|name% # Parâmetro URL (?name=valor) +%current_meta|field_name% # Meta field do post actual +%user_meta|field_name% # Meta field do utilizador logado +``` + +### Usar Macros em Widgets Elementor + +``` +Textos: escrever macro directamente no campo de texto +Links: usar em URL field +Queries: usar em Meta Query → Valor = macro +``` + +### Profile Builder + +``` +JetEngine > Profile Builder > Add New +├── Criar páginas de conta (Dashboard, Submissões, etc.) +├── Cada página = Elementor Template +├── Acesso: utilizadores logados, por role, por condição +└── Menu de Profile: widget JetEngine Profile Menu +``` + +## Dify KB — Consultar Antes de Implementar + +```javascript +// Dataset Crocoblock (JetEngine incluído) +mcp__dify-kb__dify_kb_retrieve_segments({ + dataset_id: "bdf85c26-1824-4021-92d1-be20501b35ac", + query: "[funcionalidade JetEngine]" +}) +``` + +## Troubleshooting + +| Problema | Causa | Solução | +|----------|-------|---------| +| Listing não mostra resultados | Query sem posts ou condição errada | Debug Query: activar `WP_DEBUG` e verificar | +| Dynamic Tag retorna vazio | Campo meta não preenchido ou nome errado | Verificar key do meta field em JetEngine > Meta Boxes | +| Relações não aparecem | rel_id errado ou sem items relacionados | Verificar nome da relação em JetEngine > Relations | +| CCT não aparece no REST | REST API não activada | JetEngine > Content Types > Edit > Enable REST API | +| Filtros não funcionam | Listing ID errado no filtro | JetEngine Listing Grid > copiar ID do widget | + +## Bridge Plugin — Deploy para Integração n8n + +Para integração headless com n8n ou agentes IA, fazer deploy do MU plugin incluído: + +```bash +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" + +# Copiar bridge plugin para mu-plugins (via SSH) +# O ficheiro está em: assets/descomplicar-jet-bridge.php (nesta skill) +scp descomplicar-jet-bridge.php server.descomplicar.pt:/home/USER/public_html/wp-content/mu-plugins/ + +# Verificar que está activo (MU plugins carregam automaticamente) +$WP plugin list --skip-plugins --skip-themes # MU plugins não aparecem aqui — normal +``` + +**Endpoint exposto:** `POST /wp-json/descomplicar/v1/manage` + +**Acções disponíveis:** +| Acção | Descrição | +|-------|-----------| +| `create_cct_item` | Criar item num CCT | +| `update_cct_item` | Actualizar item (`_ID` em item_data) | +| `get_cct_item` | Ler item por ID | +| `delete_cct_item` | Eliminar item | +| `manage_relation` | Criar/remover relação (connect: true/false) | + +```bash +# Testar endpoint (exemplo: criar fatura) +curl -X POST https://site.pt/wp-json/descomplicar/v1/manage \ + -H "Authorization: Basic $(echo -n 'user:app-password' | base64)" \ + -H "Content-Type: application/json" \ + -d '{ + "action": "create_cct_item", + "cct_slug": "faturas", + "item_data": { "titulo": "Fatura #001", "valor": 500 } + }' +``` + +## JetEngine MCP Server (v3.8.0+) + +A partir da versão 3.8.0, o JetEngine tem **MCP Server nativo**: + +``` +WP Admin > JetEngine > AI Command Center > Enable MCP Server +→ Agentes IA podem inspecionar e criar CPTs/CCTs/Relations via linguagem natural +→ Claude consegue ler o schema completo e instanciar estruturas directamente +``` + +## Referências Adicionais + +- **`assets/descomplicar-jet-bridge.php`** — MU Plugin pronto a deployar: CRUD CCT + Relations via REST API +- **`references/automation.md`** — BD completa (CCT, Relations meta, Custom Meta Storage), WP-CLI batch, PHP hooks, REST API avançada (store_items_type, filtros CCT), cache e guardrails +- **`references/query-listings.md`** — Query Builder avançado, Listing Map, paginação, ordenação dinâmica +- **`references/dynamic-content.md`** — Dynamic Tags, Profile Builder, Macros, Conditional Fields + +--- + +**Versão**: 1.1.0 | **Autor**: Descomplicar® | **Data**: 18-02-2026 diff --git a/wordpress/skills/jetengine/assets/descomplicar-jet-bridge.php b/wordpress/skills/jetengine/assets/descomplicar-jet-bridge.php new file mode 100644 index 0000000..58ff73a --- /dev/null +++ b/wordpress/skills/jetengine/assets/descomplicar-jet-bridge.php @@ -0,0 +1,226 @@ + 'POST', + 'callback' => [ $this, 'handle_request' ], + 'permission_callback' => function() { + // Autenticar via WordPress Application Passwords no n8n: + // Header: Authorization: Basic base64(user:app-password) + return current_user_can( 'edit_posts' ); + }, + ]); + } + + public function handle_request( WP_REST_Request $request ) { + $params = $request->get_json_params(); + $action = sanitize_text_field( $params['action'] ?? '' ); + + if ( ! function_exists( 'jet_engine' ) || ! class_exists( 'Jet_Engine' ) ) { + return new WP_Error( 'no_jet_engine', 'JetEngine não está activo.', [ 'status' => 500 ] ); + } + + switch ( $action ) { + case 'create_cct_item': + case 'update_cct_item': + return $this->handle_cct_write( $params ); + + case 'get_cct_item': + return $this->handle_cct_get( $params ); + + case 'delete_cct_item': + return $this->handle_cct_delete( $params ); + + case 'manage_relation': + return $this->handle_relation( $params ); + + default: + return new WP_Error( + 'invalid_action', + 'Acção inválida. Disponíveis: create_cct_item, update_cct_item, get_cct_item, delete_cct_item, manage_relation', + [ 'status' => 400 ] + ); + } + } + + /** + * Criar ou actualizar item CCT + * + * Payload: { + * "action": "create_cct_item", + * "cct_slug": "faturas", + * "item_data": { + * "titulo": "Fatura #1024", + * "valor": 500, + * "estado": "pendente" + * } + * } + * Para update, incluir "_ID": 42 em item_data. + */ + private function handle_cct_write( array $params ) { + $cct_slug = sanitize_key( $params['cct_slug'] ?? '' ); + $item_data = $params['item_data'] ?? []; + + if ( empty( $cct_slug ) ) { + return new WP_Error( 'missing_slug', 'cct_slug é obrigatório.', [ 'status' => 400 ] ); + } + + if ( empty( $item_data ) ) { + return new WP_Error( 'missing_data', 'item_data é obrigatório.', [ 'status' => 400 ] ); + } + + $handler = $this->get_cct_handler( $cct_slug ); + if ( is_wp_error( $handler ) ) return $handler; + + $result_id = $handler->update_item( $item_data ); + + if ( ! $result_id ) { + return new WP_Error( 'db_error', 'Falha ao guardar item na base de dados.', [ 'status' => 500 ] ); + } + + return rest_ensure_response( [ + 'success' => true, + 'item_id' => $result_id, + 'action' => isset( $item_data['_ID'] ) ? 'updated' : 'created', + ] ); + } + + /** + * Ler item CCT por ID + * + * Payload: { "action": "get_cct_item", "cct_slug": "faturas", "item_id": 42 } + */ + private function handle_cct_get( array $params ) { + $cct_slug = sanitize_key( $params['cct_slug'] ?? '' ); + $item_id = absint( $params['item_id'] ?? 0 ); + + if ( empty( $cct_slug ) || ! $item_id ) { + return new WP_Error( 'missing_data', 'cct_slug e item_id são obrigatórios.', [ 'status' => 400 ] ); + } + + $handler = $this->get_cct_handler( $cct_slug ); + if ( is_wp_error( $handler ) ) return $handler; + + $item = $handler->get_item( $item_id ); + + if ( ! $item ) { + return new WP_Error( 'not_found', "Item {$item_id} não encontrado no CCT '{$cct_slug}'.", [ 'status' => 404 ] ); + } + + return rest_ensure_response( [ + 'success' => true, + 'item' => $item, + ] ); + } + + /** + * Eliminar item CCT + * + * Payload: { "action": "delete_cct_item", "cct_slug": "faturas", "item_id": 42 } + */ + private function handle_cct_delete( array $params ) { + $cct_slug = sanitize_key( $params['cct_slug'] ?? '' ); + $item_id = absint( $params['item_id'] ?? 0 ); + + if ( empty( $cct_slug ) || ! $item_id ) { + return new WP_Error( 'missing_data', 'cct_slug e item_id são obrigatórios.', [ 'status' => 400 ] ); + } + + $handler = $this->get_cct_handler( $cct_slug ); + if ( is_wp_error( $handler ) ) return $handler; + + $result = $handler->delete_item( $item_id ); + + return rest_ensure_response( [ + 'success' => (bool) $result, + 'item_id' => $item_id, + 'deleted' => (bool) $result, + ] ); + } + + /** + * Criar ou remover relação entre dois items + * + * Payload: { + * "action": "manage_relation", + * "rel_key": "clientes-projetos", + * "parent_id": 10, + * "child_id": 20, + * "connect": true + * } + */ + private function handle_relation( array $params ) { + $rel_key = sanitize_text_field( $params['rel_key'] ?? '' ); + $parent_id = absint( $params['parent_id'] ?? 0 ); + $child_id = absint( $params['child_id'] ?? 0 ); + $connect = (bool) ( $params['connect'] ?? true ); + + if ( empty( $rel_key ) || ! $parent_id || ! $child_id ) { + return new WP_Error( + 'missing_data', + 'rel_key, parent_id e child_id são obrigatórios.', + [ 'status' => 400 ] + ); + } + + if ( ! class_exists( '\Jet_Engine\Relations\Manager' ) ) { + return new WP_Error( 'no_relations', 'Módulo de Relações JetEngine não disponível.', [ 'status' => 500 ] ); + } + + \Jet_Engine\Relations\Manager::get_instance()->process_relation( + $rel_key, + $parent_id, + $child_id, + $connect + ); + + return rest_ensure_response( [ + 'success' => true, + 'action' => $connect ? 'connected' : 'disconnected', + 'rel_key' => $rel_key, + 'parent' => $parent_id, + 'child' => $child_id, + ] ); + } + + /** + * Obter CCT handler com verificação de erro + */ + private function get_cct_handler( string $cct_slug ) { + $cct_module = jet_engine()->modules->get_module( 'custom-content-types' ); + + if ( ! $cct_module ) { + return new WP_Error( 'no_cct_module', 'Módulo CCT não está activo no JetEngine.', [ 'status' => 500 ] ); + } + + $manager = $cct_module->instance->manager; + $type = $manager->get_content_type_instance( $cct_slug ); + + if ( ! $type ) { + return new WP_Error( 'invalid_cct', "CCT '{$cct_slug}' não encontrado.", [ 'status' => 404 ] ); + } + + return $type->get_handler_instance(); + } +} + +new Descomplicar_Jet_Bridge(); diff --git a/wordpress/skills/jetengine/references/automation.md b/wordpress/skills/jetengine/references/automation.md new file mode 100644 index 0000000..b626983 --- /dev/null +++ b/wordpress/skills/jetengine/references/automation.md @@ -0,0 +1,668 @@ +# JetEngine — Automação Headless e Integração com Agentes IA + +Arquitectura técnica para manipular o JetEngine sem wp-admin: via PHP interno, REST API, SQL e n8n. + +--- + +## 1. Estrutura de Dados — Base de Dados + +### A. Custom Post Types (CPT) — Estrutura Standard WP + +```sql +-- Dados em wp_posts +SELECT * FROM wp_posts WHERE post_type = 'meu_cpt' AND post_status = 'publish'; + +-- Meta fields em wp_postmeta +SELECT meta_key, meta_value FROM wp_postmeta WHERE post_id = 123; +``` + +**Limitação:** Queries complexas com múltiplos meta fields são lentas (JOIN por cada meta key). + +### B. Custom Content Types (CCT) — Tabelas SQL Próprias + +Cada CCT tem tabela dedicada: `wp_jet_cct_{slug_do_cct}` + +```sql +-- Exemplo: CCT "faturas" → tabela wp_jet_cct_faturas +-- Colunas são os campos definidos no JetEngine + +-- Ler todos os itens activos +SELECT * FROM wp_jet_cct_faturas WHERE cct_status = 'active'; + +-- Filtrar por campo +SELECT * FROM wp_jet_cct_clientes +WHERE cidade = 'Lisboa' +AND cct_status = 'publish' +ORDER BY _created_at DESC +LIMIT 20; + +-- Campos especiais em todos os CCT: +-- _ID → ID numérico único +-- cct_status → publish / draft +-- cct_author_id → ID do utilizador criador +-- _created_at → Unix timestamp de criação +-- _modified → Unix timestamp de modificação +``` + +**Vantagem:** SQL directo é seguro e extremamente rápido. Ideal para leitura em dashboards e n8n. + +### C. Relations — Tabelas wp_jet_rel_default e _meta + +O JetEngine NÃO guarda relações em `wp_postmeta`. Tem tabela própria. + +```sql +-- wp_jet_rel_default: relações básicas +-- parent_object_id | child_object_id | rel_id (hash/slug da relação) + +-- Ler filhos de um pai +SELECT child_object_id +FROM wp_jet_rel_default +WHERE parent_object_id = 123 +AND rel_id = 'relacao_clientes_projetos'; + +-- Ler pai a partir de filho +SELECT parent_object_id +FROM wp_jet_rel_default +WHERE child_object_id = 456 +AND rel_id = 'relacao_clientes_projetos'; + +-- Contar relações +SELECT parent_object_id, COUNT(*) as total +FROM wp_jet_rel_default +WHERE rel_id = 'relacao_empresa_colaboradores' +GROUP BY parent_object_id; +``` + +**wp_jet_rel_default_meta** — metadados específicos de uma relação (ex: papel do actor num filme): + +```sql +-- Exemplo: condição de uso de um veículo numa relação utilizador↔veículo +SELECT meta_key, meta_value +FROM wp_jet_rel_default_meta +WHERE rel_id = 8 +AND parent_object_id = 45 +AND child_object_id = 1020; + +-- UPSERT massivo para sincronizações ETL (com integridade referencial) +START TRANSACTION; +INSERT INTO wp_jet_rel_default (rel_id, parent_object_id, child_object_id) +VALUES (8, 45, 1020), (8, 45, 1021), (8, 92, 1055) +ON DUPLICATE KEY UPDATE parent_object_id = VALUES(parent_object_id); + +INSERT INTO wp_jet_rel_default_meta (rel_id, parent_object_id, child_object_id, meta_key, meta_value) +VALUES (8, 45, 1020, 'condicao_uso', 'Alugado') +ON DUPLICATE KEY UPDATE meta_value = VALUES(meta_value); +COMMIT; +-- OBRIGATÓRIO após SQL directo: chamar wp_cache_flush() + jet_smart_filters()->indexer->index_all() +``` + +**Nota:** Em relações críticas com muito tráfego, o JetEngine pode isolar por relação em tabela própria (`wp_jet_rel_81_meta`), reduzindo table locks. + +**Guardrail:** NUNCA inserir directamente via SQL para criar relações em ambientes activos. Usar API PHP (ver secção 2). SQL directo só para sincronizações ETL massivas (centenas de milhares de linhas). + +### D. Custom Meta Storage para CPT (Tabela Dedicada) + +Alternativa ao `wp_postmeta` para CPTs com muitos campos e consultas complexas. + +``` +JetEngine > Post Types > Edit > Custom Meta Storage: Activar +→ Cria tabela dedicada: wp_{cpt_slug}_meta + (ex: wp_imoveis_meta com colunas tipadas por campo) +``` + +```sql +-- Com Custom Meta Storage activo, cada campo é uma coluna +SELECT preco, area_m2, tipologia, localizacao +FROM wp_imoveis_meta +WHERE preco BETWEEN 150000 AND 350000 +AND tipologia IN ('T2', 'T3') +ORDER BY preco ASC; + +-- Joins com wp_posts permanecem necessários para title/date +SELECT p.ID, p.post_title, m.preco, m.area_m2 +FROM wp_posts p +JOIN wp_imoveis_meta m ON m.post_id = p.ID +WHERE p.post_status = 'publish' +AND m.preco < 300000; +``` + +**Quando usar:** CPTs com >10 campos numéricos/date, queries com múltiplos filtros simultâneos, alternativa a CCT quando se precisa de taxonomias e comentários nativos WP. + +### E. Estrutura na wp_options + +```sql +-- Configurações de CPTs +SELECT option_value FROM wp_options WHERE option_name = 'jet_engine_cpt'; + +-- Taxonomias +SELECT option_value FROM wp_options WHERE option_name = 'jet_engine_tax'; + +-- Relações +SELECT option_value FROM wp_options WHERE option_name = 'jet_engine_relations'; + +-- Meta Boxes +SELECT option_value FROM wp_options WHERE option_name = 'jet_engine_meta_boxes'; +``` + +**Aviso:** São PHP serialized arrays. NUNCA editar via SQL string replace — vai corromper. Usar sempre `unserialize → edit → serialize` em PHP. + +--- + +## 2. PHP — API Interna JetEngine + +### Criar/Actualizar Item CCT + +```php + 'Fatura #1024', + 'valor' => 500.00, + 'status' => 'pendente', + 'cliente' => 'Empresa X Lda', + // Para update, incluir _ID existente: + // '_ID' => 15 +]; + +// Aceder ao módulo CCT +if (function_exists('jet_engine')) { + $cct_module = jet_engine()->modules->get_module('custom-content-types'); + if ($cct_module) { + $manager = $cct_module->instance->manager; + $type = $manager->get_content_type_instance($cct_slug); + if ($type) { + $result = $type->get_handler_instance()->update_item($item_data); + // $result = ID do item criado, ou false em caso de erro + } + } +} +``` + +### Gerir Relações Programaticamente + +```php + 12 + +if (class_exists('\Jet_Engine\Relations\Manager')) { + $relations_manager = \Jet_Engine\Relations\Manager::get_instance(); + $relations_manager->process_relation( + $rel_id, // ex: 'relacao_empresa_colaboradores' + $parent_id, + $child_id, + true // true = conectar, false = desconectar + ); +} + +// Método 2: API completa (update com contexto — mais robusto) +function ia_conectar_com_contexto($cliente_id, $documento_id) { + $rel_id_numerico = 15; // ID numérico da relação (ver JetEngine > Relations) + + $relation = jet_engine()->relations->get_active_relations($rel_id_numerico); + + if ($relation) { + $relation->set_update_context('parent'); // perspectiva: 'parent' ou 'child' + $relation->update($cliente_id, $documento_id); + + // Limpar cache do Query Builder após actualizar relações + \Jet_Engine\Query_Builder\Manager::instance()->listings_cache->clear(); + } +} +``` + +### Criar/Actualizar CPT Post + +```php + 'Novo Projecto', + 'post_content' => '', + 'post_status' => 'publish', + 'post_type' => 'projecto', +]; + +$post_id = wp_insert_post($post_data); + +if (!is_wp_error($post_id)) { + update_post_meta($post_id, 'cliente_id', 45); + update_post_meta($post_id, 'valor_contrato', 5000); + update_post_meta($post_id, 'data_inicio', '2026-03-01'); +} +``` + +### Manipular Estrutura (Onboarding Programático) + +```php + 'imovel', + 'singular_name' => 'Imóvel', + 'name' => 'Imóveis', + 'show_in_rest' => true, + 'supports' => ['title', 'editor', 'thumbnail', 'custom-fields'], + // ... outras configurações +]; + +$current_cpts[] = $new_cpt; +update_option('jet_engine_cpt', $current_cpts); + +// Obrigatório: regenerar permalinks após alterar CPTs +flush_rewrite_rules(); +``` + +### Registar Meta Box Programaticamente (Hook) + +```php + 'ID Remoto de Sincronização', + 'name' => '_ia_sync_id', + 'object_type' => 'field', + 'type' => 'text', + 'width' => '50%', + ], + [ + 'title' => 'Score de Auditoria', + 'name' => '_score_auditoria', + 'object_type' => 'field', + 'type' => 'number', + 'width' => '50%', + ], + ]; + + $post_type = 'documento_legal'; + + if (!class_exists('Jet_Engine_CPT_Meta')) { + require $meta_manager->component_path('post.php'); + } + + $meta_manager->store_fields($post_type, $meta_fields, 'post_type'); + new Jet_Engine_CPT_Meta($post_type, $meta_fields, 'Controlo IA', 'normal', 'high', [ + 'object_type' => 'post', + 'allowed_post_type' => [$post_type], + 'name' => 'Controlo de Metadados IA', + ]); +}); +``` + +### WP-CLI Batch Import para CCT + +```php +manager; +$content_type = $manager->get_content_types($cct_slug); + +if (!$content_type) { + WP_CLI::error("CCT '{$cct_slug}' não encontrado."); +} + +$registos = json_decode(file_get_contents('/tmp/veiculos.json'), true); +$sucesso = 0; + +foreach ($registos as $dados) { + // db->insert() respeita sanitizações e integridade do CCT + if ($content_type->db->insert($dados)) { + $sucesso++; + } + // Libertar memória em loops grandes + if ($sucesso % 500 === 0) { + wp_cache_flush(); + } +} + +wp_cache_flush(); +WP_CLI::success("Importação concluída. Registos criados: {$sucesso}"); +``` + +```bash +# Execução no servidor CWP: +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" +$WP eval-file /tmp/import_cct_data.php +``` + +--- + +## 3. REST API JetEngine + +### Endpoints + +| Tipo | Endpoint | Método | +|------|----------|--------| +| CPT | `/wp-json/wp/v2/{cpt_slug}` | GET / POST / PUT / DELETE | +| CCT | `/wp-json/jet-cct/{cct_slug}` | GET / POST / PUT / DELETE | +| Relação | `/wp-json/jet-rel/{relation_id}` | GET / POST | + +**Pré-requisito:** Activar REST API nas configurações do CPT/CCT/Relação em JetEngine. + +### Autenticação + +```bash +# Application Passwords (WP 5.6+) — recomendado para n8n +# Criar em: WP Admin > Users > Edit > Application Passwords + +# Header de autenticação +Authorization: Basic $(echo -n 'username:app-password' | base64) +``` + +### Criar/Ler Item CCT via REST + +```bash +# Criar registo no CCT "clientes" +curl -X POST https://site.pt/wp-json/jet-cct/clientes \ + -H "Authorization: Basic dXNlcjpwYXNz..." \ + -H "Content-Type: application/json" \ + -d '{ + "nome_cliente": "Empresa X Lda", + "email": "contacto@empresax.com", + "nif": "123456789", + "cct_status": "publish" + }' +# Resposta: { "_ID": 42, ... } + +# Pesquisa com filtros — parâmetros CCT REST API +# _limit, _offset: paginação +# _cct_search: pesquisa de texto +# _cct_search_by: campo específico +curl "https://site.pt/wp-json/jet-cct/clientes?_limit=20&_offset=0&_cct_search=Lisboa&_cct_search_by=cidade" +# Header de resposta inclui: Jet-Query-Total (total de registos para paginação) +``` + +### Actualizar Relação via REST API + +```bash +# POST para /wp-json/jet-rel/{relation_id} +# store_items_type: "update" (aditivo) | "replace" (destrutivo!) | "disconnect" (remover) +curl -X POST https://site.pt/wp-json/jet-rel/22 \ + -H "Authorization: Basic dXNlcjpwYXNz..." \ + -H "Content-Type: application/json" \ + -d '{ + "parent_id": 4500, + "child_id": 1020, + "context": "child", + "store_items_type": "update", + "meta": { + "etapa_validacao": "Aprovado", + "score_auditoria": 88.5, + "data_processamento": "2026-02-18T08:30" + } + }' +``` + +**Atenção `store_items_type`:** +- `update` — adiciona à relação existente (safe) +- `replace` — **DESTRÓI todas as relações existentes** e substitui (perigoso!) +- `disconnect` — remove a relação específica + +### Criar Post (CPT) via REST + +```bash +curl -X POST https://site.pt/wp-json/wp/v2/projecto \ + -H "Authorization: Basic dXNlcjpwYXNz..." \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Projecto Website ABC", + "status": "publish", + "meta": { + "cliente_id": 45, + "valor_contrato": 5000 + } + }' +``` + +### Campos Repeater via REST + +```json +{ + "galeria_servicos": [ + { "titulo": "Serviço A", "descricao": "Descrição A" }, + { "titulo": "Serviço B", "descricao": "Descrição B" } + ] +} +``` + +--- + +## 4. Integração n8n + +### Leitura (MySQL Node — mais rápido) + +```javascript +// n8n MySQL Node — ler CCT directamente da BD +// Muito mais rápido que REST API para leitura em massa + +// Query example: +SELECT + _ID, + nome_cliente, + email, + cidade, + cct_status, + _created_at +FROM wp_jet_cct_clientes +WHERE cct_status = 'publish' +ORDER BY _created_at DESC +LIMIT 100; +``` + +**Vantagem:** 100x mais rápido que HTTP Request ao WP REST API. + +### Escrita (HTTP Request Node — via REST) + +```javascript +// n8n HTTP Request Node +// Method: POST +// URL: https://site.pt/wp-json/jet-cct/faturas +// Authentication: Basic Auth +// Body (JSON): +{ + "numero": "{{ $json.fatura_numero }}", + "cliente_id": "{{ $json.cliente_id }}", + "valor": "{{ $json.total }}", + "cct_status": "publish" +} +``` + +**Usar REST para escrita** (garante hooks JetEngine e validações). + +### Webhooks via JetFormBuilder + +``` +JetFormBuilder pode disparar Webhook para n8n: +1. Criar formulário no JetFormBuilder +2. Post-submit Action: Webhook +3. URL: https://n8n.descomplicar.pt/webhook/jetengine +4. Formulários silenciosos: receber POST externos que passam pelas validações JetEngine +``` + +--- + +## 5. Tabela de Métodos + +| Método | Complexidade | Performance | Risco | Caso de Uso | +|--------|-------------|-------------|-------|-------------| +| REST API | Baixa | Média | Baixo | Inserir dados externos via n8n | +| PHP (Classes Internas) | Média | Alta | Baixo | Plugins custom, scripts de migração | +| SQL Directo (CCT) | Alta | Muito Alta | Médio | Bulk updates, leitura analytics | +| SQL Directo (Meta) | Alta | Baixa | **Alto** | **Evitar** — corrupção de arrays | +| WP-CLI Custom | Média | Alta | Baixo | Manutenção, cron jobs | + +--- + +## 6. Guardrails Críticos + +### Cache JetEngine + +```bash +# Após alterar estruturas via PHP/SQL na wp_options, +# forçar regeneração de cache: + +PHP="/opt/alt/php-fpm83/usr/bin/php" +WP="$PHP /usr/local/bin/wp --allow-root --path=/home/USER/public_html" + +$WP cache flush +$WP rewrite flush +$WP elementor flush-css --regenerate +``` + +**Cache do Query Builder** — obrigatório após alterações SQL directas: + +```php +listings_cache->clear(); + +// Recalcular Indexer do JetSmartFilters (se filtros activos) +if (function_exists('jet_smart_filters')) { + jet_smart_filters()->indexer->index_all(); +} + +// Cache do WordPress +wp_cache_flush(); +``` + +**Regra crítica:** Alterações SQL directas em `wp_jet_cct_*` ou `wp_jet_rel_default` NÃO invalidam automaticamente o Object Cache nem os transients do Query Builder. O site apresentará dados obsoletos até ao flush. + +### NUNCA Editar Campos Serializados via SQL String Replace + +```sql +-- ERRADO — corrompe o array PHP serializado +UPDATE wp_options +SET option_value = REPLACE(option_value, 'Imóveis', 'Propriedades') +WHERE option_name = 'jet_engine_cpt'; + +-- CORRECTO — usar PHP +$cpts = get_option('jet_engine_cpt'); +// Fazer alterações via PHP +update_option('jet_engine_cpt', $cpts); +``` + +### IDs de Relações em Migrações + +``` +Problema: Ao migrar dados entre ambientes, IDs podem mudar → relações quebram +Solução: Usar Slugs como referência no código; converter para ID antes de gravar +Usar: get_posts(['name' => 'slug-do-post', 'post_type' => 'meu_cpt']) +``` + +### Repeater Fields via SQL + +``` +Repeater fields são PHP serialize() ou JSON dependendo da configuração. +NUNCA fazer string replace em SQL. +Usar sempre: unserialize() → editar array → serialize() → update_post_meta() +``` + +--- + +## 7. MU-Plugin: Wrapper de Endpoints Custom + +Para expor endpoints seguros ao n8n sem passar pela REST API standard: + +```php +[a-z_]+)', [ + 'methods' => 'POST', + 'callback' => 'jet_agent_create_cct_item', + 'permission_callback' => function() { + return current_user_can('edit_posts'); + }, + 'args' => [ + 'slug' => ['required' => true, 'sanitize_callback' => 'sanitize_key'], + ] + ]); + + // Endpoint para gerir relações + register_rest_route('jet-agent/v1', '/relation', [ + 'methods' => 'POST', + 'callback' => 'jet_agent_manage_relation', + 'permission_callback' => function() { + return current_user_can('edit_posts'); + } + ]); +}); + +function jet_agent_create_cct_item(WP_REST_Request $request) { + $slug = $request->get_param('slug'); + $data = $request->get_json_params(); + + // Sanitizar dados + $data = array_map('sanitize_text_field', $data); + + // Usar handler interno do JetEngine + if (!function_exists('jet_engine')) { + return new WP_Error('jet_engine_missing', 'JetEngine não activo', ['status' => 500]); + } + + $cct_module = jet_engine()->modules->get_module('custom-content-types'); + $type = $cct_module->instance->manager->get_content_type_instance($slug); + + if (!$type) { + return new WP_Error('cct_not_found', "CCT '{$slug}' não encontrado", ['status' => 404]); + } + + $result = $type->get_handler_instance()->update_item($data); + + return rest_ensure_response([ + 'success' => (bool)$result, + 'id' => $result, + ]); +} + +function jet_agent_manage_relation(WP_REST_Request $request) { + $params = $request->get_json_params(); + $rel_id = sanitize_text_field($params['rel_id'] ?? ''); + $parent_id = absint($params['parent_id'] ?? 0); + $child_id = absint($params['child_id'] ?? 0); + $connect = (bool)($params['connect'] ?? true); + + if (!$rel_id || !$parent_id || !$child_id) { + return new WP_Error('missing_params', 'rel_id, parent_id e child_id são obrigatórios', ['status' => 400]); + } + + if (class_exists('\Jet_Engine\Relations\Manager')) { + \Jet_Engine\Relations\Manager::get_instance()->process_relation( + $rel_id, $parent_id, $child_id, $connect + ); + return rest_ensure_response(['success' => true]); + } + + return new WP_Error('relations_missing', 'Módulo Relations não disponível', ['status' => 500]); +} +``` + +--- + +*JetEngine Automation | Descomplicar® | 18-02-2026* diff --git a/wordpress/skills/jetengine/references/dynamic-content.md b/wordpress/skills/jetengine/references/dynamic-content.md new file mode 100644 index 0000000..196c806 --- /dev/null +++ b/wordpress/skills/jetengine/references/dynamic-content.md @@ -0,0 +1,271 @@ +# JetEngine — Dynamic Content, Macros e Profile Builder + +## Dynamic Tags no Elementor + +### Categorias de Dynamic Tags JetEngine + +| Categoria | Tags Disponíveis | +|-----------|-----------------| +| **Post** | Post Title, Post URL, Post Date, Post Author, Featured Image, Post Terms | +| **Meta** | Meta Field (qualquer campo JetEngine) | +| **User** | User Name, User Email, User Role, User Meta | +| **Relations** | Relation Field (conteúdo relacionado) | +| **Options** | Option Field (JetEngine Global Options Pages) | +| **Macros** | JetEngine Macros (ver secção abaixo) | +| **Query** | Query Variable (parâmetros URL) | + +### Usar Meta Field Tag + +``` +Elemento Elementor > Campo de texto > ícone Dynamic Tags +→ JetEngine > Meta Field +→ Seleccionar meta key name +→ Field Type: auto / text / image / url / ... + +Para imagens (campo tipo media): +→ Field Type: Image +→ Image Size: thumbnail / medium / large / full + +Para URLs em botões: +→ Link > Dynamic Tag > Meta Field > Field Type: URL +``` + +### Tags em CSS Custom (background, cores) + +``` +Elemento > Style > Background > Dynamic Tag +→ Meta Field → campo cor HEX +→ Útil para cards coloridos por categoria +``` + +--- + +## Macros + +### Macros Built-in + +``` +%current_user_id% # ID do utilizador logado +%current_user_name% # Nome do utilizador +%current_user_email% # Email do utilizador +%current_post_id% # ID do post actual +%current_post_type% # Post type do post actual +%queried_object_id% # ID em arquivo/single +%queried_object_slug% # Slug em arquivo/single +%request_field|param_name% # Parâmetro URL: ?param_name=valor +%current_meta|field_name% # Meta field do post actual +%user_meta|field_name% # Meta field do utilizador logado +%current_taxonomy|tax_name% # Taxonomy do post actual +%current_timestamp% # Unix timestamp actual +%site_url% # URL do site +``` + +### Usar Macros em Query Builder + +``` +Exemplo: Listar imóveis favoritos do utilizador +Meta Query: +├── Field: favorito_de (campo que guarda array de IDs de utilizadores) +├── Operator: LIKE +└── Value: %current_user_id% + +Exemplo: Listar items criados pelo utilizador +Meta Query: +├── Field: cct_author_id (campo automático do CCT) +├── Operator: = +└── Value: %current_user_id% +``` + +### Macros em Textos + +``` +Texto: "Bem-vindo, %current_user_name%!" +→ Em runtime: "Bem-vindo, João Silva!" + +Em Heading Widget: activar Dynamic Tag > JetEngine Macros +→ Escrever a macro no campo Macro Value +``` + +### Criar Macro Custom (PHP) + +```php + 'minha_macro', + 'name' => 'Minha Macro Custom', + 'args' => [], // parâmetros opcionais + ]; + return $macros; +}); + +add_filter('jet-engine/listings/macros-result', function($result, $macro, $args) { + if ($macro === 'minha_macro') { + // Lógica da macro + $result = 'valor calculado'; + } + return $result; +}, 10, 3); +``` + +--- + +## Conditional Fields (Campos Condicionais) + +### Em Meta Boxes + +``` +Campo B só aparece quando Campo A = "sim" + +Meta Box > Campo B > Conditions: +├── Field: nome_campo_a +├── Operator: = +└── Value: sim +``` + +### Em Listing Templates (Visibility) + +``` +Elemento Elementor > Advanced > JetEngine Conditions: +├── Condition: Meta Field | Equals | "featured" +└── Effect: Show / Hide +``` + +--- + +## Global Options Pages + +Para configurações globais do site (telefone, email, horários, redes sociais). + +### Criar Options Page + +``` +JetEngine > Options Pages > Add New +├── Page Title: Informações Globais +├── Slug: informacoes-globais +└── Campos: Meta Box associado +``` + +### Usar em Elementor + +``` +Dynamic Tag > JetEngine > Option +→ Seleccionar Options Page +→ Seleccionar campo + +Exemplo: footer com telefone dinâmico +→ Options Page: Informações Globais > campo: telefone +→ Editar telefone em 1 lugar, actualiza em todo o site +``` + +--- + +## Profile Builder + +Sistema de áreas de conta para utilizadores logados. + +### Estrutura + +``` +JetEngine > Profile Builder +├── Pages (áreas da conta): +│ ├── Dashboard (página principal) +│ ├── Submissões (posts do utilizador) +│ ├── Favoritos +│ ├── Configurações (editar perfil) +│ └── [custom pages] +├── Access Rules: +│ ├── Login Required: YES +│ ├── User Roles: subscriber / author / ... +│ └── Redirect não-logados: página de login +└── Profile Menu Widget (Elementor) +``` + +### Criar Página de Perfil + +``` +1. JetEngine > Profile Builder > Add Page + Nome: Dashboard | Slug: dashboard + Template: Criar com Elementor + +2. No Template, usar Dynamic Tags: + → User Name, User Email, User Avatar + → Query Builder filtrado por %current_user_id% + +3. Adicionar Profile Menu Widget ao header/sidebar + → Mostra links para cada página do perfil + → Altera links consoante se está logado ou não +``` + +### Submissão de Conteúdo por Utilizadores + +``` +JetFormBuilder + Profile Builder: +1. Criar formulário com acção "Create Post" (CPT) +2. Acção: Set Author = Current User +3. Colocar formulário na página de perfil +4. Query Builder na página de listagem: autor = current_user_id +``` + +### Editar Perfil com JetFormBuilder + +```php +// JetFormBuilder Form: +// Acção: Update User +// Campos mapeados: +// ├── first_name → user first_name +// ├── last_name → user last_name +// ├── email → user email +// └── bio_custom → user_meta: bio_custom + +// Pre-fill automático: activar "Use data from:" → Current User +``` + +--- + +## Conditional Content por Utilizador + +### Mostrar Conteúdo Só a Logados + +``` +Elementor > Advanced > JetEngine Conditions: +Condition: Is User Logged In | Equals | True +Effect: Show (esconde elemento para não logados) +``` + +### Por Role + +``` +Condition: User Role | Contains | administrator +Effect: Show (só admins vêem este bloco) +``` + +### Por Meta do Utilizador + +``` +Condition: User Meta | Field: plano_subscricao | Equals | premium +Effect: Show (só utilizadores premium vêem este conteúdo) +``` + +--- + +## Repeater em Frontend + +### Listar Items de um Repeater + +``` +Meta Box com campo Repeater "galeria_destaques": +├── Sub-campo: imagem (media) +├── Sub-campo: titulo (text) +└── Sub-campo: link (url) + +Em Listing Template: +Adicionar widget "Dynamic Repeater" +→ Source: Meta Field → galeria_destaques +→ Criar template para cada item do repeater +``` + +--- + +*JetEngine Dynamic Content | Descomplicar® | 18-02-2026* diff --git a/wordpress/skills/jetengine/references/query-listings.md b/wordpress/skills/jetengine/references/query-listings.md new file mode 100644 index 0000000..2852f8d --- /dev/null +++ b/wordpress/skills/jetengine/references/query-listings.md @@ -0,0 +1,225 @@ +# JetEngine — Query Builder e Listings + +## Query Builder Avançado + +### Tipos de Query e Configuração + +#### Query Posts + +``` +Campos principais: +├── Post Type: CPT ou post/page +├── Post Status: publish / draft / any +├── Posts per page: N (ou -1 para todos) +├── Order: ASC / DESC +├── Order By: date / title / menu_order / meta_value / meta_value_num / rand +│ └── Se meta_value: seleccionar meta key +├── Meta Query (múltiplas condições): +│ ├── Field: meta key name +│ ├── Type: CHAR / NUMERIC / DATE +│ ├── Operator: = / != / > / < / BETWEEN / LIKE / IN / NOT IN / EXISTS +│ └── Value: valor ou macro (%current_user_id%) +└── Tax Query: + ├── Taxonomy: seleccionar taxonomy + ├── Operator: IN / NOT IN / AND + └── Terms: valores ou relação dinâmica +``` + +#### Query CCT + +``` +Campos principais: +├── Content Type: seleccionar CCT +├── Items per page: N +├── Order By: qualquer coluna do CCT +├── Filters (equivalente a Meta Query): +│ ├── Field: coluna do CCT +│ ├── Operator: = / != / > / LIKE / IN +│ └── Value: valor ou macro +└── Show items only for current user: activar para perfis +``` + +#### Query Relação + +``` +Objetivo: listar items relacionados ao post/item actual +├── Relation: seleccionar relação criada no JetEngine +├── Get children of: post actual / ID específico / macro +└── Post Type: tipo dos items relacionados +``` + +### Meta Query com Macros + +``` +Exemplo: listar projectos do utilizador logado +Meta Query: +├── Field: cliente_user_id +├── Operator: = +└── Value: %current_user_id% + +Exemplo: listar items de hoje +Meta Query: +├── Field: data_evento (timestamp) +├── Type: NUMERIC +├── Operator: >= +└── Value: %current_timestamp% +``` + +### Combinar Múltiplas Condições + +``` +Relation: AND (todas as condições verdadeiras) + OR (pelo menos uma verdadeira) + +Exemplo: imóveis em Lisboa com preço < 300k +Tax Query 1: Localização = Lisboa +Meta Query 1: Preço < 300000 +Relation: AND +``` + +--- + +## Listing Grid — Configuração Detalhada + +### Criar Listing Template + +``` +JetEngine > Listings > Add New +Nome: [CPT]-listing-card +Listing From: Posts / Terms / Users / CCT +Post Type: [seleccionar] +Editar com Elementor: +├── Usar Dynamic Tags em todos os campos +├── Post Title Widget → ou Text Widget com dynamic tag +├── Meta Field → adicionar Dynamic Tag > JetEngine > Meta Field +├── Post Featured Image → ou Image Widget com dynamic tag +└── Button → URL com dynamic tag > Post URL +``` + +### Listing Grid Widget — Parâmetros + +``` +Listing Item: [seleccionar template] +Use Custom Query: YES → seleccionar Query Builder +Items per page: 12 (padrão) +Not Found Text: "Sem resultados" +Loader: activar para UX com filtros +Columns: 1/2/3/4 (responsivo) +Equal Columns Height: YES para cards uniformes +``` + +### Paginação + +``` +Listing Grid > Pagination: +├── Type: Default WP / Load More / Infinity Scroll +├── Load More Button Text: "Carregar mais" +├── On Scroll: activar para infinity +└── Starting From: 1 +``` + +### Ordenação Dinâmica (Frontend) + +``` +Adicionar widget: JetSmartFilters > Sorting +├── Ligar ao mesmo Listing Grid +└── Opções: Date ASC/DESC, Title, Price, Custom Field +``` + +--- + +## Listing Map + +### Configuração + +``` +1. Activar Google Maps API Key: + JetEngine > Settings > Google Maps API Key + +2. Criar Meta Box com campo tipo Map no CPT + (O utilizador define latitude/longitude via picker no editor) + +3. Criar Listing Template tipo: Map Marker + Adicionar: Post Title, info a mostrar no popup + +4. Adicionar widget Listing Map ao Elementor + ├── Listing Item: [marker template] + ├── Use Custom Query: YES + ├── Map Field: seleccionar campo coordenadas + └── Map Options: zoom, altura, cluster +``` + +### Mapa + Listing Grid Sincronizados + +``` +Adicionar os dois widgets na mesma página +Ligar ao mesmo Query Builder +Activar "Synchronize with Listing Grid": YES no Map +→ Ao fazer hover no card, destaca pin no mapa +→ Ao fazer hover no pin, destaca card na lista +``` + +--- + +## Archive e Single Templates + +### Single CPT com Elementor (JetThemeCore ou Elementor Pro) + +``` +JetThemeCore > Templates > Add New > Single +Conditions: Post Type = [meu_cpt] +Editar com Elementor usando Dynamic Tags + +OU + +Elementor > Templates > Theme Builder > Single +Conditions: igual +``` + +### Archive Page + +``` +JetThemeCore > Templates > Add New > Archive +Conditions: Post Type Archive = [meu_cpt] +Adicionar: +├── Archive Title Widget +├── Listing Grid Widget (sem Custom Query — usa WP_Query do arquivo) +└── JetSmartFilters (ligado ao mesmo archive) +``` + +--- + +## JetSmartFilters — Integração Avançada + +### AJAX Reload vs Full Page + +``` +Provider: Listing Grid → AJAX (sem reload de página) +Provider: Archive → Pode ser AJAX ou URL based +Provider: WooCommerce → AJAX +``` + +### URL Based Filters (SEO Friendly) + +``` +JetSmartFilters > Filters > Edit +├── Query Variable: activar +├── URL Based: activar +└── Clean URL: activar + +Resultado: site.pt/imoveis/?cidade=Lisboa&preco=200000-400000 +(Em vez de AJAX puro — melhor para SEO e partilha de URL) +``` + +### Hierarquical Taxonomy Filter + +``` +Exemplo: País → Distrito → Concelho +├── Criar taxonomia com hierarquia +├── Filtro: Checkboxes com hierarquia activada +└── "Show children of selected": activar +``` + +--- + +*JetEngine Query & Listings | Descomplicar® | 18-02-2026* diff --git a/wordpress/skills/rank-math/SKILL.md b/wordpress/skills/rank-math/SKILL.md new file mode 100644 index 0000000..856ff47 --- /dev/null +++ b/wordpress/skills/rank-math/SKILL.md @@ -0,0 +1,295 @@ +--- +name: rank-math +description: This skill should be used when the user asks to "optimizar SEO wordpress", + "rank math wp-cli", "configurar rank math", "audit rank math", "update meta SEO", + "schema markup wordpress", "redirects rank math", "sitemap wordpress", "bulk SEO update", + "rank math CWP", "titles meta descriptions wp-cli", "configurar sitemap wordpress", + "noindex wordpress", "rank math robots". Manages Rank Math SEO plugin via WP-CLI + on CWP servers. +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 80 +user_invocable: true +--- + +# /rank-math - Gestão Rank Math SEO via WP-CLI + +Operações de SEO WordPress via WP-CLI no servidor CWP (server.descomplicar.pt). Cobre auditoria, configuração em massa, schema markup, redirects e sitemap. + +**Manual completo:** `Hub/06-Operacoes/Documentacao/Manuais/Rank-Math-WP-CLI-Manual-Definitivo.md` +**Quick Reference:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-RankMath-WP-CLI.md` +**NotebookLM:** [WordPress Config CLI](https://notebooklm.google.com/notebook/fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d) + +--- + +## Uso + +``` +/rank-math audit https://site.pt +/rank-math update-meta /home/USER/public_html +/rank-math sitemap /home/USER/public_html +/rank-math redirects /home/USER/public_html +/rank-math schema post ID /home/USER/public_html +``` + +--- + +## Contexto CWP — Sempre Obrigatório + +**PHP 8.3 no CWP:** +```bash +# Formato base +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=/home/USER/public_html + +# Alias ~/.bashrc (se configurado) +wp83 --allow-root --path=/home/USER/public_html +``` + +**Acesso via MCP SSH:** +``` +servidor: server.descomplicar.pt (176.9.3.158) +porta: 9443 | user: root +``` + +**Único comando nativo Rank Math:** +```bash +wp rankmath sitemap generate --allow-root --path=/home/USER/public_html +``` +Tudo o resto usa `wp post meta`, `wp option patch`, `wp eval` ou `wp db query`. + +--- + +## Workflow: Auditoria SEO (/rank-math audit) + +### Passo 1 — Diagnóstico rápido + +```bash +PATH=/home/USER/public_html + +# Posts sem título SEO +wp db query "SELECT p.ID, p.post_title FROM wp_posts p +LEFT JOIN wp_postmeta pm ON p.ID=pm.post_id AND pm.meta_key='rank_math_title' +WHERE p.post_type='post' AND p.post_status='publish' +AND (pm.meta_value IS NULL OR pm.meta_value='');" --allow-root --path=$PATH + +# Posts sem descrição SEO +wp db query "SELECT p.ID, p.post_title FROM wp_posts p +LEFT JOIN wp_postmeta pm ON p.ID=pm.post_id AND pm.meta_key='rank_math_description' +WHERE p.post_type='post' AND p.post_status='publish' +AND (pm.meta_value IS NULL OR pm.meta_value='');" --allow-root --path=$PATH + +# Top 404s (últimos 30 dias) +wp db query "SELECT uri, SUM(times_accessed) as total FROM wp_rank_math_404_logs +GROUP BY uri ORDER BY total DESC LIMIT 20;" --allow-root --path=$PATH + +# Tamanho options (detetar bloat WooCommerce) +wp db query "SELECT option_name, LENGTH(option_value) as bytes FROM wp_options +WHERE option_name LIKE 'rank%' AND autoload='yes' ORDER BY bytes DESC;" --allow-root --path=$PATH +``` + +### Passo 2 — Estado módulos + +```bash +wp option pluck rank_math_modules --allow-root --path=$PATH +wp option pluck rank-math-options-general strip_category_base --allow-root --path=$PATH +wp option pluck rank-math-options-titles title_separator --allow-root --path=$PATH +``` + +--- + +## Workflow: Actualizar Meta SEO (/rank-math update-meta) + +### Meta key individual + +```bash +# Título SEO +wp post meta update ID rank_math_title "%title% %sep% %sitename%" --allow-root --path=$PATH + +# Descrição SEO (<160 chars) +wp post meta update ID rank_math_description "Texto conciso da página." --allow-root --path=$PATH + +# Focus keyword +wp post meta update ID rank_math_focus_keyword "keyword1,keyword2" --allow-root --path=$PATH + +# Robots (ARRAY JSON — obrigatório --format=json) +wp post meta update ID rank_math_robots '["noindex"]' --format=json --allow-root --path=$PATH + +# Canonical URL +wp post meta update ID rank_math_canonical_url "https://site.pt/url/" --allow-root --path=$PATH + +# Pillar content +wp post meta update ID rank_math_pillar_content "on" --allow-root --path=$PATH +``` + +### Bulk update (wp eval) + +```bash +# Aplicar título padrão a todos os posts sem título +wp eval ' +$posts = get_posts(["numberposts"=>-1,"post_status"=>"publish"]); +foreach ($posts as $p) { + if (!get_post_meta($p->ID, "rank_math_title", true)) { + update_post_meta($p->ID, "rank_math_title", "%title% %sep% %sitename%"); + } +} +echo count($posts)." posts processados\n"; +' --allow-root --path=$PATH +``` + +--- + +## Workflow: Options Globais (/rank-math options) + +**Regra crítica:** SEMPRE usar `wp option patch`, NUNCA `wp option update` em options serializadas. + +```bash +# Separador de título +wp option patch update rank-math-options-titles title_separator "-" --allow-root --path=$PATH + +# Remover base de categoria do URL +wp option patch update rank-math-options-general strip_category_base "on" --allow-root --path=$PATH + +# Verificar sub-key +wp option pluck rank-math-options-titles title_separator --allow-root --path=$PATH + +# LER option completa (diagnóstico) +wp option get rank-math-options-general --format=json --allow-root --path=$PATH +``` + +--- + +## Workflow: Schema Markup (/rank-math schema) + +Schema é armazenado como array PHP em `rank_math_schema_{Type}`. Usar `wp eval` (não JSON directo). + +```bash +# Criar schema Article num post +wp eval ' +update_post_meta(ID, "rank_math_schema_Article", [ + "metadata" => ["title"=>"Article","type"=>"custom","shortcode"=>"s-".uniqid(),"isPrimary"=>"1"], + "@type"=>"Article", + "headline"=>"%seo_title%", + "description"=>"%seo_description%", + "author"=>["@type"=>"Person","name"=>"%name%"], + "datePublished"=>"%date(Y-m-dTH:i:sP)%", + "dateModified"=>"%modified(Y-m-dTH:i:sP)%" +]); +echo "Schema criado\n"; +' --user=1 --allow-root --path=$PATH + +# Criar schema FAQ +wp eval ' +update_post_meta(ID, "rank_math_schema_FAQPage", [ + "metadata" => ["title"=>"FAQ","type"=>"custom","shortcode"=>"s-".uniqid(),"isPrimary"=>"1"], + "@type"=>"FAQPage", + "mainEntity"=>[ + ["@type"=>"Question","name"=>"Pergunta 1","acceptedAnswer"=>["@type"=>"Answer","text"=>"Resposta 1"]], + ["@type"=>"Question","name"=>"Pergunta 2","acceptedAnswer"=>["@type"=>"Answer","text"=>"Resposta 2"]] + ] +]); +echo "FAQ Schema criado\n"; +' --user=1 --allow-root --path=$PATH + +# Apagar schema corrompido +wp post meta delete ID rank_math_schema_Article --allow-root --path=$PATH +``` + +--- + +## Workflow: Redirects (/rank-math redirects) + +```bash +# Criar redirect 301 +wp eval ' +\RankMath\Redirections\DB::add([ + "id"=>"", + "sources"=>[["pattern"=>"/url-antiga/","comparison"=>"exact"]], + "url_to"=>"/url-nova/", + "header_code"=>301, + "status"=>"active", +]); +echo "Redirect criado\n"; +' --allow-root --path=$PATH + +# Redirect com wildcard +wp eval ' +\RankMath\Redirections\DB::add([ + "id"=>"", + "sources"=>[["pattern"=>"/blog/","comparison"=>"contain"]], + "url_to"=>"/artigos/", + "header_code"=>301, + "status"=>"active", +]); +echo "Redirect wildcard criado\n"; +' --allow-root --path=$PATH + +# Apagar redirect por ID +wp eval '\RankMath\Redirections\DB::delete(42); echo "Redirect apagado\n";' --allow-root --path=$PATH + +# Limpar logs 404 (após resolver) +wp db query "TRUNCATE TABLE wp_rank_math_404_logs;" --allow-root --path=$PATH +``` + +--- + +## Workflow: Sitemap (/rank-math sitemap) + +```bash +# Regenerar sitemap +wp rankmath sitemap generate --allow-root --path=$PATH + +# Excluir post-type do sitemap +wp option patch update rank-math-options-sitemap pt_attachment_sitemap "off" --allow-root --path=$PATH + +# Verificar setting +wp option pluck rank-math-options-sitemap pt_post_sitemap --allow-root --path=$PATH +``` + +--- + +## Sequência de Cache (Sempre Após Alterações) + +```bash +wp cache flush --allow-root --path=$PATH +wp transient delete --all --allow-root --path=$PATH +wp rewrite flush --allow-root --path=$PATH +wp rankmath sitemap generate --allow-root --path=$PATH +``` + +> Alterações via `wp db query` não invalidam Redis/Memcached. Sempre executar `wp cache flush`. + +--- + +## Gotchas Críticos + +| Problema | Causa | Solução | +|----------|-------|---------| +| Robots não aplicam | Injectado como string, não array | `'["noindex"]' --format=json` | +| Options corrompidas | `wp option update` em option serializada | Sempre `wp option patch` | +| Alteração não visível | Object cache (Redis) em memória | `wp cache flush` | +| Schema quebra editor | JSON inválido em `rank_math_schema_*` | `wp post meta delete ID rank_math_schema_*` | +| Sitemap 404 no Nginx | Faltam rewrite rules | Adicionar regras ao server block | + +--- + +## Variáveis Dinâmicas Frequentes + +`%title%` · `%sitename%` · `%sep%` · `%excerpt%` · `%category%` · `%currentyear%` · `%seo_title%` · `%seo_description%` · `%post_thumbnail%` · `%url%` · `%name%` + +--- + +## Recursos Adicionais + +### Referências + +- **`references/commands.md`** — Referência completa de todos os comandos, meta keys, options e módulos + +### Documentação Hub + +- **Manual:** `Hub/06-Operacoes/Documentacao/Manuais/Rank-Math-WP-CLI-Manual-Definitivo.md` (17 secções) +- **QR:** `Hub/06-Operacoes/Documentacao/Quick-Reference/QR-RankMath-WP-CLI.md` +- **NotebookLM:** [WordPress Config CLI](https://notebooklm.google.com/notebook/fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d) (4 fontes) + +--- + +*Rank Math SEO via WP-CLI | Descomplicar® | v1.0.0 | 18-02-2026* diff --git a/wordpress/skills/rank-math/references/commands.md b/wordpress/skills/rank-math/references/commands.md new file mode 100644 index 0000000..eaa8cbe --- /dev/null +++ b/wordpress/skills/rank-math/references/commands.md @@ -0,0 +1,379 @@ +# Rank Math WP-CLI — Referência Completa de Comandos + +**Manual Hub:** `06-Operacoes/Documentacao/Manuais/Rank-Math-WP-CLI-Manual-Definitivo.md` + +--- + +## Arquitectura de Dados + +### Tabelas WordPress Standard + +| Tabela | Dados Rank Math | +|--------|-----------------| +| `wp_postmeta` | SEO por post: título, descrição, robots, schema, keywords | +| `wp_termmeta` | SEO por taxonomia (categories, tags) | +| `wp_usermeta` | SEO de páginas author archive | +| `wp_options` | Configurações globais do plugin | + +### Tabelas Custom Rank Math + +| Tabela | Conteúdo | +|--------|---------| +| `wp_rank_math_redirections` | Regras de redirect (301, 302, 410, etc.) | +| `wp_rank_math_redirections_cache` | Cache das regras | +| `wp_rank_math_404_logs` | Log de 404s com contadores | +| `wp_rank_math_analytics_objects` | Analytics (PRO) | +| `wp_rank_math_analytics_ga` | Google Analytics (PRO) | +| `wp_rank_math_analytics_gsc` | Search Console (PRO) | + +--- + +## Meta Keys Completas (wp_postmeta) + +### SEO Básico + +| Meta Key | Tipo | Exemplo | +|----------|------|---------| +| `rank_math_title` | string | `%title% %sep% %sitename%` | +| `rank_math_description` | string | Máx 160 chars | +| `rank_math_focus_keyword` | string CSV | `kw1,kw2,kw3` | +| `rank_math_pillar_content` | string | `on` / `off` | +| `rank_math_canonical_url` | string URL | `https://site.pt/url/` | +| `rank_math_seo_score` | int | 0-100 (calculado no editor) | + +### Robots e Indexação + +| Meta Key | Tipo | Valores | +|----------|------|---------| +| `rank_math_robots` | **array JSON** | `["noindex"]`, `["nofollow"]`, `["noindex","nofollow"]` | + +```bash +# CORRECTO +wp post meta update ID rank_math_robots '["noindex"]' --format=json --allow-root + +# ERRADO (string, não aplicará) +wp post meta update ID rank_math_robots "noindex" --allow-root +``` + +### Open Graph / Social + +| Meta Key | Tipo | Notas | +|----------|------|-------| +| `rank_math_facebook_image` | string URL | Imagem OG | +| `rank_math_facebook_title` | string | Título Facebook | +| `rank_math_facebook_description` | string | Descrição Facebook | +| `rank_math_twitter_card_type` | string | `summary_large_image` | +| `rank_math_twitter_title` | string | | +| `rank_math_twitter_description` | string | | +| `rank_math_twitter_image` | string URL | | + +### Schema + +| Meta Key | Tipo | Notas | +|----------|------|-------| +| `rank_math_schema_Article` | serialized PHP array | `wp eval` obrigatório | +| `rank_math_schema_FAQPage` | serialized PHP array | | +| `rank_math_schema_HowTo` | serialized PHP array | | +| `rank_math_schema_Product` | serialized PHP array | WooCommerce | +| `rank_math_schema_Recipe` | serialized PHP array | | +| `rank_math_schema_Review` | serialized PHP array | | +| `rank_math_schema_Event` | serialized PHP array | | +| `rank_math_schema_LocalBusiness` | serialized PHP array | | +| `rank_math_schema_VideoObject` | serialized PHP array | | + +### WooCommerce + +| Meta Key | Tipo | Notas | +|----------|------|-------| +| `rank_math_primary_category` | string (Term ID) | `"15"` | +| `rank_math_schema_Product` | serialized PHP array | Produto WC | + +--- + +## Options Globais (wp_options) + +### Options Principais + +| Option Name | Tipo | Conteúdo | +|-------------|------|---------| +| `rank-math-options-general` | serialized array | Config geral | +| `rank-math-options-titles` | serialized array | Títulos e meta por post-type | +| `rank-math-options-sitemap` | serialized array | Configuração sitemap | +| `rank_math_modules` | serialized array | Módulos activos/inactivos | +| `rank_math_schema_types` | serialized array | Tipos schema habilitados | + +### Sub-keys rank-math-options-general + +```bash +wp option pluck rank-math-options-general strip_category_base # on/off +wp option pluck rank-math-options-general breadcrumbs # on/off +wp option pluck rank-math-options-general knowledgegraph_type # person/company +wp option pluck rank-math-options-general url # URL empresa +wp option pluck rank-math-options-general name # Nome empresa/pessoa +``` + +### Sub-keys rank-math-options-titles + +```bash +wp option pluck rank-math-options-titles title_separator # - / | • … +wp option pluck rank-math-options-titles homepage_title # Título homepage +wp option pluck rank-math-options-titles homepage_description # Desc homepage +wp option pluck rank-math-options-titles pt_post_title # Título padrão posts +wp option pluck rank-math-options-titles pt_page_title # Título padrão pages +wp option pluck rank-math-options-titles pt_product_title # Título padrão products +``` + +### Sub-keys rank-math-options-sitemap + +```bash +wp option pluck rank-math-options-sitemap items_per_page # Default: 200 +wp option pluck rank-math-options-sitemap pt_post_sitemap # on/off +wp option pluck rank-math-options-sitemap pt_page_sitemap # on/off +wp option pluck rank-math-options-sitemap pt_product_sitemap # on/off +wp option pluck rank-math-options-sitemap pt_attachment_sitemap # on/off (default: off) +``` + +--- + +## Módulos Rank Math + +```bash +# Ver todos os módulos +wp option get rank_math_modules --format=json --allow-root + +# Activar módulo +wp option patch update rank_math_modules MODULE_NAME "1" --allow-root + +# Desactivar módulo +wp option patch update rank_math_modules MODULE_NAME "0" --allow-root +``` + +| Módulo | Slug | Função | +|--------|------|--------| +| SEO Analysis | `seo-analysis` | Score SEO no editor | +| Link Counter | `link-counter` | Contagem links internos/externos | +| Redirections | `redirections` | Sistema de redirects | +| 404 Monitor | `404-monitor` | Log de 404s | +| Schema | `rich-snippet` | Schema markup | +| Sitemap | `sitemap` | XML Sitemap | +| Instant Indexing | `instant-indexing` | Google Indexing API (PRO) | +| Local SEO | `local-seo` | Schema LocalBusiness | +| WooCommerce | `woocommerce` | SEO WooCommerce | + +--- + +## Leitura de Meta + +```bash +# Todos os meta do post +wp post meta list 42 --format=table --allow-root | grep rank_math + +# Meta específico +wp post meta get 42 rank_math_title --allow-root +wp post meta get 42 rank_math_description --allow-root +wp post meta get 42 rank_math_robots --allow-root + +# Meta de term +wp term meta get 15 rank_math_title --allow-root +wp term meta get 15 rank_math_description --allow-root +``` + +--- + +## Operações em Massa + +### Script de auditoria completo + +```bash +#!/bin/bash +PATH_WP="/home/USER/public_html" +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" + +echo "=== AUDITORIA RANK MATH SEO ===" +echo "Site: $PATH_WP" +echo "Data: $(date)" + +echo -e "\n--- Posts sem título SEO ---" +$WP db query "SELECT p.ID, LEFT(p.post_title,50) as titulo FROM wp_posts p +LEFT JOIN wp_postmeta pm ON p.ID=pm.post_id AND pm.meta_key='rank_math_title' +WHERE p.post_type='post' AND p.post_status='publish' +AND (pm.meta_value IS NULL OR pm.meta_value='') +LIMIT 20;" + +echo -e "\n--- Posts sem descrição SEO ---" +$WP db query "SELECT p.ID, LEFT(p.post_title,50) as titulo FROM wp_posts p +LEFT JOIN wp_postmeta pm ON p.ID=pm.post_id AND pm.meta_key='rank_math_description' +WHERE p.post_type='post' AND p.post_status='publish' +AND (pm.meta_value IS NULL OR pm.meta_value='') +LIMIT 20;" + +echo -e "\n--- Top 10 404s ---" +$WP db query "SELECT uri, SUM(times_accessed) as total FROM wp_rank_math_404_logs +GROUP BY uri ORDER BY total DESC LIMIT 10;" + +echo -e "\n--- Módulos activos ---" +$WP option get rank_math_modules --format=json + +echo -e "\n--- Tamanho options ---" +$WP db query "SELECT option_name, LENGTH(option_value) as bytes FROM wp_options +WHERE option_name LIKE 'rank%' AND autoload='yes' ORDER BY bytes DESC;" + +echo "=== FIM AUDITORIA ===" +``` + +### Bulk: Aplicar título padrão a posts sem título + +```bash +wp eval ' +$posts = get_posts(["post_type"=>"post","numberposts"=>-1,"post_status"=>"publish"]); +$updated = 0; +foreach ($posts as $p) { + if (!get_post_meta($p->ID, "rank_math_title", true)) { + update_post_meta($p->ID, "rank_math_title", "%title% %sep% %sitename%"); + $updated++; + } +} +echo "$updated posts actualizados\n"; +' --allow-root --path=$PATH_WP +``` + +### Bulk: Aplicar descrição a partir do excerpt + +```bash +wp eval ' +$posts = get_posts(["post_type"=>"post","numberposts"=>-1,"post_status"=>"publish"]); +$updated = 0; +foreach ($posts as $p) { + if (!get_post_meta($p->ID, "rank_math_description", true) && $p->post_excerpt) { + $desc = wp_trim_words($p->post_excerpt, 20, "..."); + update_post_meta($p->ID, "rank_math_description", $desc); + $updated++; + } +} +echo "$updated posts actualizados\n"; +' --allow-root --path=$PATH_WP +``` + +--- + +## Schema — Exemplos Completos + +### Article (blog post) + +```bash +wp eval ' +$post_id = ID; +update_post_meta($post_id, "rank_math_schema_Article", [ + "metadata" => [ + "title"=>"Article", + "type"=>"custom", + "shortcode"=>"s-".uniqid(), + "isPrimary"=>"1" + ], + "@type"=>"Article", + "headline"=>"%seo_title%", + "description"=>"%seo_description%", + "url"=>"%url%", + "author"=>["@type"=>"Person","name"=>"%name%"], + "publisher"=>["@type"=>"Organization","name"=>"%sitename%","logo"=>""], + "datePublished"=>"%date(Y-m-dTH:i:sP)%", + "dateModified"=>"%modified(Y-m-dTH:i:sP)%", + "image"=>"%post_thumbnail%" +]); +echo "Article schema criado no post $post_id\n"; +' --user=1 --allow-root --path=$PATH_WP +``` + +### LocalBusiness (página contacto) + +```bash +wp eval ' +update_post_meta(ID, "rank_math_schema_LocalBusiness", [ + "metadata" => ["title"=>"LocalBusiness","type"=>"custom","shortcode"=>"s-".uniqid(),"isPrimary"=>"1"], + "@type"=>"LocalBusiness", + "name"=>"Nome Empresa", + "description"=>"%seo_description%", + "url"=>"%url%", + "email"=>"email@empresa.pt", + "telephone"=>"+351 XXX XXX XXX", + "address"=>["@type"=>"PostalAddress","streetAddress"=>"Rua X","addressLocality"=>"Cidade","postalCode"=>"XXXX-XXX","addressCountry"=>"PT"], + "geo"=>["@type"=>"GeoCoordinates","latitude"=>"38.7","longitude"=>"-9.1"], + "openingHoursSpecification"=>[ + ["@type"=>"OpeningHoursSpecification","dayOfWeek"=>["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens"=>"09:00","closes"=>"18:00"] + ], + "image"=>"%post_thumbnail%" +]); +echo "LocalBusiness schema criado\n"; +' --user=1 --allow-root --path=$PATH_WP +``` + +--- + +## Instant Indexing (Google Indexing API - PRO) + +```bash +# Submeter URL individual +wp eval '\RankMath\Instant_Indexing\Api::submit("https://site.pt/url/", "URL_UPDATED"); echo "OK\n";' --allow-root --path=$PATH_WP + +# Verificar estado da API +wp option pluck rank-math-options-instant-indexing bing_api_key --allow-root --path=$PATH_WP +``` + +--- + +## Redirects — Referência Completa + +### Tipos de Comparação + +| comparison | Comportamento | +|-----------|---------------| +| `exact` | Match exacto do URL | +| `contains` | URL contém o pattern | +| `starts_with` | URL começa com o pattern | +| `ends_with` | URL termina com o pattern | +| `regex` | Regular expression | + +### Códigos HTTP + +| Código | Tipo | Uso | +|--------|------|-----| +| 301 | Moved Permanently | Redirect definitivo | +| 302 | Found | Redirect temporário | +| 307 | Temporary Redirect | Temporário (preserva método HTTP) | +| 410 | Gone | Conteúdo removido permanentemente | +| 451 | Unavailable For Legal | Removido por razões legais | + +--- + +## Tabelas Rank Math — Verificação + +```bash +# Ver tabelas custom +wp db query "SHOW TABLES LIKE '%rank_math%';" --allow-root --path=$PATH_WP + +# Estrutura tabela redirections +wp db query "DESCRIBE wp_rank_math_redirections;" --allow-root --path=$PATH_WP + +# Ver todos os redirects activos +wp db query "SELECT id, sources, url_to, header_code FROM wp_rank_math_redirections WHERE status='active';" --allow-root --path=$PATH_WP +``` + +--- + +## Free vs PRO — Funcionalidades WP-CLI + +| Funcionalidade | Free | PRO | Notas | +|---------------|------|-----|-------| +| `wp rankmath sitemap generate` | ✅ | ✅ | Único comando nativo | +| Meta por post | ✅ | ✅ | `wp post meta` | +| Options globais | ✅ | ✅ | `wp option patch` | +| Schema markup | ✅ | ✅ | `wp eval` | +| Redirections | ✅ | ✅ | `\RankMath\Redirections\DB` | +| 404 Monitor | ✅ | ✅ | `wp_rank_math_404_logs` | +| Instant Indexing | ❌ | ✅ | `\RankMath\Instant_Indexing\Api` | +| Analytics GSC | ❌ | ✅ | Tabelas analytics_gsc | +| Analytics GA | ❌ | ✅ | Tabelas analytics_ga | + +--- + +*Referência Rank Math WP-CLI | Descomplicar® | v1.0.0 | 18-02-2026* diff --git a/wordpress/skills/woocommerce-cli/SKILL.md b/wordpress/skills/woocommerce-cli/SKILL.md new file mode 100644 index 0000000..bf3c159 --- /dev/null +++ b/wordpress/skills/woocommerce-cli/SKILL.md @@ -0,0 +1,271 @@ +--- +name: woocommerce-cli +description: This skill should be used when the user asks to "gerir woocommerce linha de + comandos", "woocommerce wp-cli", "criar produto woocommerce cli", "actualizar stock + woocommerce cli", "gerir encomendas woocommerce cli", "importar produtos woocommerce", + "exportar produtos woocommerce", "configurar shipping woocommerce cli", "payment gateway + woocommerce cli", "limpar cache woocommerce cli", "bulk update woocommerce", "woocommerce + cwp", "wc cli cwp", "wp wc product", "wp wc shop_order", "configurar woocommerce servidor", + "scripting woocommerce", "automacao woocommerce cli". WooCommerce management via WP-CLI + on CWP server (server.descomplicar.pt) covering products, orders, customers, shipping, + payments, and automation. +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 80 +user_invocable: true +--- + +# /woocommerce-cli — WooCommerce via WP-CLI no CWP + +Gestão completa de lojas WooCommerce via linha de comandos no servidor CWP. Cobre produtos, encomendas, clientes, configuração, automação e scripting. + +**Servidor:** server.descomplicar.pt (176.9.3.158) | porta SSH: 9443 +**Manual:** `Hub/06-Operacoes/Documentacao/Manuais/WooCommerce com WP-CLI_ Guia Completo.md` +**Skill relacionada:** `/woocommerce` — desenvolvimento e extensões WooCommerce + +--- + +## Contexto CWP — Regras Obrigatórias + +```bash +# 1. SEMPRE prefixar com PHP completo +# 2. SEMPRE --allow-root (CWP executa como root) +# 3. SEMPRE --user=1 em operações de escrita (mapeamento REST API) +# 4. SEMPRE --path= (múltiplos sites no mesmo servidor) + +# Formato base +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc \ + --user=1 --allow-root --path=/home/USER/public_html + +# Variável de conveniência para scripts +PATH_WP="/home/USER/public_html" +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" +$WP wc product list --user=1 +``` + +### Versões PHP disponíveis + +| Alias | PHP | Path | +|-------|-----|------| +| `wp74` | 7.4 | `/opt/alt/php-fpm74/usr/bin/php` | +| `wp82` | 8.2 | `/opt/alt/php-fpm82/usr/bin/php` | +| `wp83` | 8.3 | `/opt/alt/php-fpm83/usr/bin/php` (recomendado) | + +### Parâmetros essenciais WC CLI + +| Parâmetro | Uso | +|-----------|-----| +| `--user=1` | Obrigatório em escrita (autenticação REST API) | +| `--porcelain` | Retorna apenas ID numérico (para scripts) | +| `--format=table\|json\|csv\|ids` | Formato do output | +| `--fields=id,name,price` | Limitar campos (reduz memória) | +| `--per_page=100` | Limite máximo da API (paginar para mais) | +| `--force` | Eliminar definitivamente (sem lixo) | + +--- + +## Produtos + +### Operações Comuns + +```bash +PATH_WP="/home/USER/public_html" + +# Listar produtos +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product list \ + --user=1 --fields=id,name,price,stock_quantity --format=table \ + --allow-root --path=$PATH_WP + +# Criar produto simples +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="Produto Exemplo" \ + --type=simple \ + --regular_price="29.99" \ + --sku="PROD-001" \ + --manage_stock=true \ + --stock_quantity=100 \ + --status=publish \ + --allow-root --path=$PATH_WP + +# Actualizar preço e stock +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product update 456 \ + --user=1 \ + --regular_price="34.99" \ + --stock_quantity=50 \ + --allow-root --path=$PATH_WP + +# Eliminar definitivamente +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product delete 456 \ + --user=1 --force --allow-root --path=$PATH_WP +``` + +### Produto Variável (capturar ID) + +```bash +# 1. Criar produto pai (--porcelain retorna só o ID) +PARENT_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 --name="T-Shirt" --type=variable \ + --attributes='[{"name":"Tamanho","variation":true,"visible":true,"options":["S","M","L","XL"]}]' \ + --porcelain --allow-root --path=$PATH_WP) + +# 2. Criar variação +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product_variation create $PARENT_ID \ + --user=1 \ + --regular_price="24.99" \ + --sku="TSHIRT-M" \ + --attributes='[{"name":"Tamanho","option":"M"}]' \ + --manage_stock=true --stock_quantity=30 \ + --allow-root --path=$PATH_WP +``` + +### Actualização em Massa por SKU + +```bash +#!/bin/bash +PATH_WP="/home/USER/public_html" +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" + +IDS=$($WP wc product list --user=1 --sku="TSHIRT-*" --format=ids) +for ID in $IDS; do + $WP wc product update $ID --user=1 --stock_quantity=200 --porcelain +done +``` + +### Exportar Catálogo + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product list \ + --user=1 --per_page=5000 --format=csv \ + --allow-root --path=$PATH_WP \ + > /home/USER/catalogo_$(date +%Y%m%d).csv +``` + +--- + +## Encomendas + +```bash +PATH_WP="/home/USER/public_html" + +# Listar encomendas em processamento +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_order list \ + --user=1 --status=processing \ + --fields=id,total,date_created \ + --allow-root --path=$PATH_WP + +# Actualizar estado +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_order update 355 \ + --user=1 --status=completed \ + --allow-root --path=$PATH_WP + +# Adicionar nota ao cliente +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc order_note create 355 \ + --user=1 \ + --note="Encomenda expedida. Rastreio: PT-99887766." \ + --customer_note=true \ + --allow-root --path=$PATH_WP + +# Conclusão massiva de todas as encomendas em processamento +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" +for ID in $($WP wc shop_order list --user=1 --status=processing --format=ids); do + $WP wc shop_order update $ID --user=1 --status=completed --porcelain +done +``` + +--- + +## Clientes + +```bash +# Listar clientes com métricas +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc customer list \ + --user=1 --fields=id,email,orders_count,total_spent \ + --format=table --allow-root --path=$PATH_WP + +# Criar cliente +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc customer create \ + --user=1 \ + --email="cliente@exemplo.pt" \ + --first_name="João" \ + --last_name="Silva" \ + --billing='{"address_1":"Rua X","city":"Lisboa","postcode":"1000-001","country":"PT"}' \ + --allow-root --path=$PATH_WP +``` + +--- + +## Configurações da Loja + +```bash +PATH_WP="/home/USER/public_html" + +# Listar ferramentas disponíveis +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc tool list \ + --user=1 --fields=id,name --allow-root --path=$PATH_WP + +# Sequência de limpeza pós-alterações (executar sempre após mudanças) +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" +$WP wc tool run clear_transients --user=1 # Limpar transients WC +$WP wc tool run recount_terms --user=1 # Recalcular contadores +$WP wc tool run delete_orphaned_variations --user=1 # Variações órfãs +$WP cache flush # Object cache +$WP rewrite flush # Rewrite rules + +# Listar payment gateways +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway list \ + --user=1 --fields=id,title,enabled --allow-root --path=$PATH_WP + +# Desactivar gateway (emergência) +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway update paypal \ + --user=1 --enabled=false --allow-root --path=$PATH_WP +``` + +--- + +## Cron do Sistema (CWP) + +Desactivar WP-Cron virtual — adicionar em `wp-config.php`: + +```php +define('DISABLE_WP_CRON', true); +``` + +Configurar cron real (`crontab -e` como root): + +```bash +* * * * * /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp cron event run --due-now --quiet --allow-root --path=/home/USER/public_html > /dev/null 2>&1 +``` + +--- + +## Erros Comuns + +| Erro | Causa | Solução | +|------|-------|---------| +| `Error: This does not appear to be a WooCommerce installation` | WooCommerce inactivo | `wp plugin activate woocommerce` | +| `Error: Sorry, you cannot list resources` | Falta `--user=` | Adicionar `--user=1` | +| `PHP Fatal error: memory` | Catálogo grande | Adicionar `-d memory_limit=2G` antes de `/usr/local/bin/wp` | +| `wp wc update` não actualiza BD | Bug conhecido | `wp option update woocommerce_db_version "X.X.X"` manual | +| Wizard de onboarding bloqueia | Sem comando CLI | `wp option update woocommerce_task_list_hidden "yes"` | + +--- + +## Recursos Adicionais + +### Referência Completa + +- **`references/commands.md`** — Todos os tipos de produto (variável, externo, agrupado, virtual, downloadable), shipping zones completo, tributação, cupões, WP All Import, scripts de automação + +### Manual Hub + +- **`Hub/06-Operacoes/Documentacao/Manuais/WooCommerce com WP-CLI_ Guia Completo.md`** — Guia completo adaptado para CWP (v2.0) + +### Skills Relacionadas + +- **`/woocommerce`** — Desenvolvimento WooCommerce (PHP, hooks, extensões) +- **`/wp-cli`** — WP-CLI geral no CWP (core, plugins, temas, BD) + +--- + +*WooCommerce CLI no CWP | Descomplicar® | v1.0.0 | 18-02-2026* diff --git a/wordpress/skills/woocommerce-cli/references/commands.md b/wordpress/skills/woocommerce-cli/references/commands.md new file mode 100644 index 0000000..d7b9e78 --- /dev/null +++ b/wordpress/skills/woocommerce-cli/references/commands.md @@ -0,0 +1,621 @@ +# WooCommerce WP-CLI — Referência Completa (CWP) + +**Manual Hub:** `06-Operacoes/Documentacao/Manuais/WooCommerce com WP-CLI_ Guia Completo.md` + +--- + +## Namespace e Entidades Disponíveis + +O WooCommerce CLI opera sob `wp wc`. Todas as operações mapeiam para REST API v3. + +| Entidade | Comando Base | +|----------|-------------| +| `customer` | Contas, moradas, métricas | +| `product` | Inventário, preços, stock | +| `product_cat` / `product_tag` | Categorias e tags | +| `product_attribute` | Atributos globais | +| `product_variation` | Variações de produto variável | +| `shop_order` | Encomendas | +| `order_note` | Notas de encomenda | +| `shop_coupon` | Cupões de desconto | +| `setting` | Settings WooCommerce | +| `shipping_zone` | Zonas de envio | +| `shipping_zone_location` | Localizações por zona | +| `shipping_zone_method` | Métodos por zona | +| `payment_gateway` | Gateways de pagamento | +| `tax` | Taxas de imposto | +| `tax_class` | Classes de imposto | +| `tool` | Ferramentas de manutenção | +| `webhook` | Webhooks server-to-server | + +--- + +## Tipos de Produto — Exemplos Completos + +### Produto Simples + +```bash +PATH_WP="/home/USER/public_html" + +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="T-Shirt Premium Algodão Orgânico" \ + --type=simple \ + --regular_price="29.99" \ + --sale_price="24.99" \ + --sku="TSHIRT-PREM-001" \ + --manage_stock=true \ + --stock_quantity=150 \ + --status=publish \ + --description="Descrição completa do produto." \ + --short_description="Descrição curta para listagens." \ + --allow-root --path=$PATH_WP +``` + +### Produto Virtual (sem envio) + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="Consulta Online 1h" \ + --type=simple \ + --virtual=true \ + --regular_price="75.00" \ + --sku="CONSULT-1H" \ + --status=publish \ + --allow-root --path=$PATH_WP +``` + +### Produto Downloadable + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="eBook Guia SEO 2026" \ + --type=simple \ + --virtual=true \ + --downloadable=true \ + --regular_price="19.90" \ + --sku="EBOOK-SEO-2026" \ + --downloads='[{"name":"eBook SEO 2026","file":"https://site.pt/ficheiros/ebook-seo-2026.pdf"}]' \ + --download_limit=3 \ + --download_expiry=365 \ + --allow-root --path=$PATH_WP +``` + +### Produto Externo/Afiliado + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="Software Cloud Parceiro" \ + --type=external \ + --regular_price="99.00" \ + --product_url="https://parceiro.com/checkout/123" \ + --button_text="Comprar na Loja do Parceiro" \ + --sku="EXT-SOFT-123" \ + --allow-root --path=$PATH_WP +``` + +### Produto Agrupado (Grouped) + +```bash +# 1. Criar produto pai agrupado +GROUP_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 --name="Pack Bundle Completo" --type=grouped --sku="PACK-BUNDLE-001" \ + --porcelain --allow-root --path=$PATH_WP) + +# 2. Criar filho vinculado ao grupo +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="Item A do Pack" \ + --type=simple \ + --regular_price="15.00" \ + --sku="PACK-ITEM-A" \ + --parent_id=$GROUP_ID \ + --allow-root --path=$PATH_WP +``` + +### Produto Variável com Variações + +```bash +# 1. Criar produto pai variável +PARENT_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="Sapatilhas Running" \ + --type=variable \ + --attributes='[{"name":"Tamanho","variation":true,"visible":true,"options":["39","40","41","42","43"]},{"name":"Cor","variation":true,"visible":true,"options":["Preto","Branco"]}]' \ + --porcelain --allow-root --path=$PATH_WP) + +# 2. Criar variação (Tamanho 40, Cor Preto) +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product_variation create $PARENT_ID \ + --user=1 \ + --regular_price="89.99" \ + --sku="RUN-40-PT" \ + --attributes='[{"name":"Tamanho","option":"40"},{"name":"Cor","option":"Preto"}]' \ + --manage_stock=true \ + --stock_quantity=25 \ + --allow-root --path=$PATH_WP +``` + +### Produto com Categorias e Atributos Visíveis + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product create \ + --user=1 \ + --name="Casaco Impermeável Inverno" \ + --type=simple \ + --regular_price="120.00" \ + --categories='[{"id":15},{"id":22}]' \ + --attributes='[{"name":"Material","visible":true,"options":["Poliéster","Gore-Tex"]},{"name":"Cor","visible":true,"options":["Preto","Azul Marinho"]}]' \ + --allow-root --path=$PATH_WP +``` + +--- + +## Gestão de Stock + +```bash +PATH_WP="/home/USER/public_html" + +# Actualizar stock de produto único +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product update 456 \ + --user=1 \ + --manage_stock=true \ + --stock_quantity=75 \ + --stock_status=instock \ + --allow-root --path=$PATH_WP + +# Colocar produto fora de stock (sem alterar quantidade) +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product update 456 \ + --user=1 --stock_status=outofstock \ + --allow-root --path=$PATH_WP + +# Actualizar stock em massa por prefixo SKU +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" +for ID in $($WP wc product list --user=1 --sku="TSHIRT-*" --format=ids); do + $WP wc product update $ID --user=1 --stock_quantity=200 --porcelain +done +``` + +--- + +## Gestão de Encomendas + +### Consulta e Filtros + +```bash +PATH_WP="/home/USER/public_html" + +# Encomendas por estado +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_order list \ + --user=1 --status=processing \ + --fields=id,total,currency,date_created \ + --format=table \ + --allow-root --path=$PATH_WP + +# Estados disponíveis: pending, processing, on-hold, completed, cancelled, refunded, failed +``` + +### Actualizar Estado + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_order update 355 \ + --user=1 --status=completed \ + --allow-root --path=$PATH_WP +``` + +### Adicionar Nota (Visível ao Cliente) + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc order_note create 355 \ + --user=1 \ + --note="Expedido via CTT. Rastreio: PT-99887766." \ + --customer_note=true \ + --allow-root --path=$PATH_WP +``` + +### Conclusão Massiva com Relatório + +```bash +#!/bin/bash +PATH_WP="/home/USER/public_html" +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" + +ORDER_IDS=$($WP wc shop_order list --user=1 --status=processing --format=ids) +TOTAL=0 + +for ID in $ORDER_IDS; do + $WP wc shop_order update $ID --user=1 --status=completed --porcelain + TOTAL=$((TOTAL+1)) + echo "[OK] Encomenda #$ID concluída." +done + +echo "Total processado: $TOTAL encomendas." +``` + +--- + +## Clientes + +```bash +PATH_WP="/home/USER/public_html" + +# Listar com métricas de lifetime value +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc customer list \ + --user=1 \ + --role=customer \ + --fields=id,email,orders_count,total_spent \ + --format=table \ + --allow-root --path=$PATH_WP + +# Criar cliente completo (B2B) +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc customer create \ + --user=1 \ + --email="empresa@exemplo.pt" \ + --first_name="Carlos" \ + --last_name="Mendes" \ + --username="carlosmendes_b2b" \ + --password="SenhaForte!2026" \ + --billing='{"first_name":"Carlos","last_name":"Mendes","company":"Empresa Lda","address_1":"Avenida da Liberdade 123","city":"Lisboa","postcode":"1250-140","country":"PT"}' \ + --shipping='{"first_name":"Carlos","last_name":"Mendes","company":"Armazém Empresa","address_1":"Rua da Indústria 45","city":"Sintra","postcode":"2710-000","country":"PT"}' \ + --allow-root --path=$PATH_WP +``` + +--- + +## Shipping Zones — Configuração Completa + +```bash +PATH_WP="/home/USER/public_html" + +# 1. Criar zona geográfica +ZONE_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone create \ + --user=1 --name="Portugal Continental" \ + --porcelain --allow-root --path=$PATH_WP) + +# 2. Adicionar países à zona +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_location create $ZONE_ID \ + --user=1 --code="PT" --type=country \ + --allow-root --path=$PATH_WP + +# 3. Adicionar método de portes fixos +METHOD_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method create $ZONE_ID \ + --user=1 --method_id=flat_rate \ + --porcelain --allow-root --path=$PATH_WP) + +# 4. Definir custo +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method update $ZONE_ID $METHOD_ID \ + --user=1 --settings='{"cost":"3.99","title":"Portes Padrão"}' \ + --allow-root --path=$PATH_WP + +# 5. Adicionar envio gratuito acima de X€ +FREE_ID=$(/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method create $ZONE_ID \ + --user=1 --method_id=free_shipping \ + --porcelain --allow-root --path=$PATH_WP) + +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone_method update $ZONE_ID $FREE_ID \ + --user=1 --settings='{"requires":"min_amount","min_amount":"50"}' \ + --allow-root --path=$PATH_WP + +# Listar todas as zonas +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shipping_zone list \ + --user=1 --format=table --allow-root --path=$PATH_WP +``` + +--- + +## Payment Gateways + +```bash +PATH_WP="/home/USER/public_html" + +# Listar todos os gateways +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway list \ + --user=1 --fields=id,title,enabled --allow-root --path=$PATH_WP + +# Activar gateway +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway update bacs \ + --user=1 --enabled=true --allow-root --path=$PATH_WP + +# Desactivar gateway (emergência) +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway update paypal \ + --user=1 --enabled=false --allow-root --path=$PATH_WP + +# Configurar Stripe em modo teste +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc payment_gateway update stripe \ + --user=1 \ + --settings='{"testmode":"yes","test_publishable_key":"pk_test_XXXX","test_secret_key":"sk_test_XXXX"}' \ + --allow-root --path=$PATH_WP +``` + +--- + +## Tributação + +```bash +PATH_WP="/home/USER/public_html" + +# Criar taxa IVA 23% (Portugal) +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc tax create \ + --user=1 \ + --country=PT \ + --rate="23" \ + --name="IVA 23%" \ + --class=standard \ + --allow-root --path=$PATH_WP + +# Criar taxa reduzida 6% +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc tax create \ + --user=1 --country=PT --rate="6" --name="IVA 6%" --class=reduced-rate \ + --allow-root --path=$PATH_WP + +# Criar classe de taxa personalizada +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc tax_class create \ + --user=1 --name="Taxa Super Reduzida" \ + --allow-root --path=$PATH_WP + +# Activar cálculo de impostos +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_calc_taxes "yes" \ + --allow-root --path=$PATH_WP +``` + +--- + +## Cupões + +```bash +PATH_WP="/home/USER/public_html" + +# Criar cupão de desconto percentual +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_coupon create \ + --user=1 \ + --code="VERAO2026" \ + --discount_type=percent \ + --amount="15" \ + --usage_limit=500 \ + --expiry_date="2026-09-30" \ + --allow-root --path=$PATH_WP + +# Criar cupão de desconto fixo +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_coupon create \ + --user=1 \ + --code="DESCONTO10" \ + --discount_type=fixed_cart \ + --amount="10" \ + --minimum_amount="50" \ + --allow-root --path=$PATH_WP + +# Listar cupões activos +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc shop_coupon list \ + --user=1 --fields=id,code,amount,discount_type,usage_count \ + --format=table --allow-root --path=$PATH_WP +``` + +--- + +## Ferramentas de Manutenção + +```bash +PATH_WP="/home/USER/public_html" +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" + +# Listar todas as ferramentas +$WP wc tool list --user=1 --fields=id,name,description --format=table + +# Limpar transients +$WP wc tool run clear_transients --user=1 + +# Recalcular contadores de taxonomias (categorias/tags) +$WP wc tool run recount_terms --user=1 + +# Eliminar variações órfãs +$WP wc tool run delete_orphaned_variations --user=1 + +# Limpar sessões e carrinhos abandonados +$WP wc tool run clear_sessions --user=1 + +# Regenerar imagens de produto +$WP wc tool run regenerate_thumbnails --user=1 + +# Regenerar dados de lookup (tabela de relatórios) +$WP wc tool run clear_lookup_table --user=1 + +# Sequência completa de limpeza (recomendada após alterações massivas) +$WP wc tool run delete_orphaned_variations --user=1 +$WP wc tool run recount_terms --user=1 +$WP wc tool run clear_sessions --user=1 +$WP wc tool run clear_transients --user=1 +$WP cache flush +$WP rewrite flush +echo "Limpeza concluída." +``` + +--- + +## WP All Import — Importação Massiva + +```bash +PATH_WP="/home/USER/public_html" + +# Verificar se plugin está activo +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp plugin is-active wp-all-import-pro \ + --allow-root --path=$PATH_WP && echo "Activo" || echo "Inactivo" + +# Executar perfil de importação pré-configurado (ID=5) +# Configurar mapeamentos no painel WP All Import primeiro +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp all-import run 5 \ + --force-run --disable-log \ + --allow-root --path=$PATH_WP + +# Listar perfis de importação +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp all-import status \ + --allow-root --path=$PATH_WP +``` + +--- + +## Importação via CSV (Script) + +```bash +#!/bin/bash +# Importar produtos a partir de CSV (colunas: SKU,TITULO,PRECO) +PATH_WP="/home/USER/public_html" +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" +CSV="/home/USER/produtos.csv" +ERROS=0 +OK=0 + +tail -n +2 "$CSV" | while IFS=, read -r SKU TITULO PRECO; do + ID=$($WP wc product create \ + --user=1 \ + --sku="$SKU" \ + --name="$TITULO" \ + --regular_price="$PRECO" \ + --type=simple \ + --status=publish \ + --porcelain 2>/dev/null) + + if [ -n "$ID" ] && [ "$ID" -gt 0 ] 2>/dev/null; then + echo "[OK] $SKU → ID $ID" + OK=$((OK+1)) + else + echo "[ERRO] $SKU — falhou" + ERROS=$((ERROS+1)) + fi +done + +echo "Importação concluída. OK: $OK | Erros: $ERROS" +``` + +--- + +## Scripts de Manutenção + +### Normalização Preventiva de Dados + +```bash +#!/bin/bash +PATH_WP="/home/USER/public_html" +WP="/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root --path=$PATH_WP" + +echo "=== LIMPEZA WOOCOMMERCE ===" +echo "Site: $PATH_WP | $(date)" + +$WP wc tool run delete_orphaned_variations --user=1 --quiet && echo "[OK] Variações órfãs" +$WP wc tool run recount_terms --user=1 --quiet && echo "[OK] Contadores taxonomias" +$WP wc tool run clear_sessions --user=1 --quiet && echo "[OK] Sessões" +$WP wc tool run clear_transients --user=1 --quiet && echo "[OK] Transients" +$WP cache flush && echo "[OK] Object cache" +$WP rewrite flush && echo "[OK] Rewrite rules" +$WP db optimize --quiet && echo "[OK] BD optimizada" + +echo "=== CONCLUÍDO ===" +``` + +### Manutenção WooCommerce em Todos os Sites CWP + +```bash +#!/bin/bash +find /home -name wp-config.php -not -path "*/backup*" 2>/dev/null | while read config; do + dir=$(dirname "$config") + user=$(stat -c '%U' "$dir") + + php_fpm=$(ps aux | grep "php-fpm: pool ${user}" | grep -v grep | head -1 | grep -o 'php-fpm[0-9][0-9]' | head -1) + php_ver=${php_fpm:-php-fpm82} + php_bin="/opt/alt/${php_ver}/usr/bin/php" + WP="$php_bin /usr/local/bin/wp --allow-root --path=$dir" + + echo "=== $user ($dir) ===" + + # Verificar se WooCommerce está activo + if $WP plugin is-active woocommerce 2>/dev/null; then + $WP wc tool run clear_transients --user=1 --quiet 2>/dev/null + $WP wc tool run recount_terms --user=1 --quiet 2>/dev/null + echo " [WC] Limpeza WooCommerce concluída." + else + echo " [--] WooCommerce não activo." + fi +done +``` + +--- + +## Limitações e Bugs Conhecidos + +### Memory Exhaustion — Override CWP + +```bash +# -d memory_limit antes de /usr/local/bin/wp +/opt/alt/php-fpm83/usr/bin/php -d memory_limit=2G /usr/local/bin/wp wc product list \ + --user=1 --per_page=100 --format=ids \ + --allow-root --path=/home/USER/public_html + +# Para catálogos muito grandes: iterar com --per_page=100 e --page=N +for PAGE in 1 2 3 4 5; do + /opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp wc product list \ + --user=1 --per_page=100 --page=$PAGE --format=ids \ + --allow-root --path=/home/USER/public_html +done +``` + +### Bug `wp wc update` — Versão BD não actualiza + +```bash +# Verificar versão instalada +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp plugin get woocommerce \ + --field=version --allow-root --path=/home/USER/public_html + +# Forçar actualização manual do registo BD +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_db_version "9.X.X" \ + --allow-root --path=/home/USER/public_html +``` + +### Bypass Wizard de Onboarding + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_onboarding_opt_in "yes" \ + --allow-root --path=/home/USER/public_html + +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_task_list_hidden "yes" \ + --allow-root --path=/home/USER/public_html + +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_setup_wizard_data \ + '{"setup_wizard":"completed"}' --allow-root --path=/home/USER/public_html +``` + +--- + +## Settings via wp_options + +Algumas configurações WooCommerce não têm endpoint CLI nativo. Usar `wp option update` directamente: + +```bash +PATH_WP="/home/USER/public_html" + +# Moeda +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_currency "EUR" \ + --allow-root --path=$PATH_WP + +# Posição do símbolo de moeda +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_currency_pos "right_space" \ + --allow-root --path=$PATH_WP + +# Separadores de preço (PT-PT) +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_price_thousand_sep "." \ + --allow-root --path=$PATH_WP +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_price_decimal_sep "," \ + --allow-root --path=$PATH_WP + +# País de base da loja +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_default_country "PT" \ + --allow-root --path=$PATH_WP + +# Activar impostos +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp option update woocommerce_calc_taxes "yes" \ + --allow-root --path=$PATH_WP +``` + +--- + +*Referência WooCommerce CLI CWP | Descomplicar® | v1.0.0 | 18-02-2026* diff --git a/wordpress/skills/woocommerce/SKILL.md b/wordpress/skills/woocommerce/SKILL.md index fe3c85c..3c14e9c 100644 --- a/wordpress/skills/woocommerce/SKILL.md +++ b/wordpress/skills/woocommerce/SKILL.md @@ -9,7 +9,7 @@ version: 1.1.0 user_invocable: true tags: [wordpress, woocommerce, ecommerce, checkout, payments, multibanco] desk_task: 1479 -allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified__ssh_execute, mcp__dify-kb__dify_kb_retrieve_segments +allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified__ssh_execute, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments category: dev quality_score: 75 updated: "2026-02-04T18:00:00Z" @@ -235,6 +235,10 @@ add_filter('woocommerce_product_query', function($q) { ### Como Consultar ```javascript +# PRIMARIO: NotebookLM (Gemini 2.5 RAG) +# mcp__notebooklm__notebook_query({notebook_id: "5be0d1a6-00f2-4cd9-b835-978cb7721601", query: ""}) // WordPress e Elementor +# FALLBACK: Dify KB (se NotebookLM insuficiente) + // Hooks e customizações WooCommerce mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "9da0b2b9-5051-4b99-b9f6-20bf35067092", diff --git a/wordpress/skills/wp-cli/SKILL.md b/wordpress/skills/wp-cli/SKILL.md new file mode 100644 index 0000000..c5b164c --- /dev/null +++ b/wordpress/skills/wp-cli/SKILL.md @@ -0,0 +1,332 @@ +--- +name: wp-cli +description: This skill should be used when the user asks to "wp-cli cwp", "gerir + wordpress linha de comandos", "actualizar plugins wp-cli", "backup wordpress cli", + "migrar site wordpress", "search replace wordpress", "criar utilizador wordpress cli", + "wp-cli no servidor", "wp-cli allow-root", "comandos wordpress server", + "actualizar wordpress servidor", "modo manutencao wordpress", "wp db export", + "wp plugin update server", "wp core update cwp". WP-CLI management on CWP server + (server.descomplicar.pt) with multi-PHP support. +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 80 +user_invocable: true +--- + +# /wp-cli - Gestão WordPress via WP-CLI no CWP + +Operações WordPress via linha de comandos no servidor CWP (server.descomplicar.pt). Cobre core, plugins, temas, base de dados, utilizadores, migração e automação. + +**Servidor:** server.descomplicar.pt (176.9.3.158) | porta SSH: 9443 +**Fonte:** `Hub/06-Operacoes/Documentacao/Manuais/WP-CLI no CWP.md` +**NotebookLM:** [WordPress Config CLI](https://notebooklm.google.com/notebook/fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d) + +--- + +## Contexto CWP — Regras Obrigatórias + +```bash +# 1. Usar sempre --allow-root (CWP executa como root) +# 2. Especificar sempre --path= (não fazer cd) +# 3. Usar o PHP correcto para cada utilizador + +# Formato base +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp COMANDO --allow-root --path=/home/USER/public_html + +# Aliases ~/.bashrc (se configurados) +alias wp74='/opt/alt/php-fpm74/usr/bin/php /usr/local/bin/wp --allow-root' +alias wp82='/opt/alt/php-fpm82/usr/bin/php /usr/local/bin/wp --allow-root' +alias wp83='/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp --allow-root' +``` + +### Versões PHP disponíveis + +| Alias | PHP | Path | +|-------|-----|------| +| `wp74` | 7.4 | `/opt/alt/php-fpm74/usr/bin/php` | +| `wp80` | 8.0 | `/opt/alt/php-fpm80/usr/bin/php` | +| `wp81` | 8.1 | `/opt/alt/php-fpm81/usr/bin/php` | +| `wp82` | 8.2 | `/opt/alt/php-fpm82/usr/bin/php` | +| `wp83` | 8.3 | `/opt/alt/php-fpm83/usr/bin/php` | + +### Detectar PHP activo de um utilizador + +```bash +# Ver pool PHP-FPM do utilizador +ps aux | grep "php-fpm: pool USER" | grep -v grep | head -1 + +# Ou usar wp-auto.sh (auto-detect) +/root/wp-auto.sh --path=/home/USER/public_html plugin list +``` + +O script `wp-auto.sh` está em `scripts/wp-auto.sh` desta skill. + +--- + +## Core WordPress + +```bash +PATH=/home/USER/public_html + +# Verificar versão +wp core version --allow-root --path=$PATH + +# Actualizar WordPress +wp core update --allow-root --path=$PATH + +# Verificar integridade dos ficheiros +wp core verify-checksums --allow-root --path=$PATH + +# Instalar versão específica +wp core download --version=6.4.3 --force --allow-root --path=$PATH + +# Informações ambiente +wp --info --allow-root --path=$PATH +``` + +--- + +## Plugins + +```bash +# Listar todos os plugins +wp plugin list --allow-root --path=$PATH + +# Listar plugins desactualizados +wp plugin list --update=available --format=table --allow-root --path=$PATH + +# Actualizar todos os plugins +wp plugin update --all --allow-root --path=$PATH + +# Instalar e activar +wp plugin install akismet --activate --allow-root --path=$PATH + +# Activar / desactivar +wp plugin activate NOME --allow-root --path=$PATH +wp plugin deactivate NOME --allow-root --path=$PATH + +# Remover plugin +wp plugin delete NOME --allow-root --path=$PATH + +# Verificar integridade +wp plugin verify-checksums --all --allow-root --path=$PATH +``` + +--- + +## Temas + +```bash +# Listar temas +wp theme list --allow-root --path=$PATH + +# Instalar e activar +wp theme install hello-elementor --activate --allow-root --path=$PATH + +# Actualizar todos os temas +wp theme update --all --allow-root --path=$PATH + +# Activar tema +wp theme activate NOME --allow-root --path=$PATH +``` + +--- + +## Base de Dados + +```bash +# Exportar (backup) +wp db export /home/USER/backup_$(date +%Y%m%d_%H%M).sql --allow-root --path=$PATH + +# Importar (restaurar) +wp db import backup.sql --allow-root --path=$PATH + +# Optimizar tabelas +wp db optimize --allow-root --path=$PATH + +# Reparar tabelas corrompidas +wp db repair --allow-root --path=$PATH + +# Query directa +wp db query "SELECT option_name, option_value FROM wp_options WHERE option_name='siteurl';" --allow-root --path=$PATH + +# Tamanho tabelas +wp db query "SELECT table_name, ROUND((data_length+index_length)/1024/1024,2) AS MB FROM information_schema.tables WHERE table_schema=DATABASE() ORDER BY MB DESC LIMIT 20;" --allow-root --path=$PATH +``` + +--- + +## Migração de Site (Search-Replace) + +```bash +# Preview (dry-run) — SEMPRE primeiro +wp search-replace 'https://old.com' 'https://new.com' --dry-run --allow-root --path=$PATH + +# Executar após confirmar +wp search-replace 'https://old.com' 'https://new.com' --allow-root --path=$PATH + +# Com relatório +wp search-replace 'old.com' 'new.com' --report --allow-root --path=$PATH + +# Após migração: limpar cache e regenerar rewrite rules +wp cache flush --allow-root --path=$PATH +wp rewrite flush --allow-root --path=$PATH +``` + +--- + +## Utilizadores + +```bash +# Listar utilizadores +wp user list --allow-root --path=$PATH + +# Criar administrador +wp user create admin admin@site.pt --role=administrator --user_pass=SENHA --allow-root --path=$PATH + +# Redefinir password +wp user update USERNAME --user_pass=NOVA_SENHA --allow-root --path=$PATH + +# Adicionar papel a utilizador existente +wp user set-role USERNAME administrator --allow-root --path=$PATH + +# Remover utilizador (transferindo conteúdo) +wp user delete USERNAME --reassign=1 --allow-root --path=$PATH + +# Actualizar email admin +wp option update admin_email "novo@email.pt" --allow-root --path=$PATH +``` + +--- + +## Cache e Transientes + +```bash +# Limpar object cache (Redis/Memcached) +wp cache flush --allow-root --path=$PATH + +# Apagar todos os transientes +wp transient delete --all --allow-root --path=$PATH + +# Regenerar rewrite rules +wp rewrite flush --allow-root --path=$PATH + +# Sequência completa pós-alteração +wp cache flush --allow-root --path=$PATH && \ +wp transient delete --all --allow-root --path=$PATH && \ +wp rewrite flush --allow-root --path=$PATH +``` + +--- + +## Modo Manutenção + +```bash +# Activar modo manutenção +wp maintenance-mode activate --allow-root --path=$PATH + +# Verificar estado +wp maintenance-mode status --allow-root --path=$PATH + +# Desactivar +wp maintenance-mode deactivate --allow-root --path=$PATH +``` + +--- + +## Cron WordPress + +```bash +# Listar eventos cron +wp cron event list --allow-root --path=$PATH + +# Executar evento manualmente +wp cron event run HOOK_NAME --allow-root --path=$PATH + +# Ver schedules disponíveis +wp cron schedule list --allow-root --path=$PATH + +# Apagar evento +wp cron event delete HOOK_NAME --allow-root --path=$PATH +``` + +--- + +## Operações em Massa (Todos os Sites) + +```bash +# Encontrar todas as instalações WordPress +find /home -name wp-config.php -not -path "*/backup*" 2>/dev/null | while read config; do + dir=$(dirname "$config") + user=$(stat -c '%U' "$dir") + echo "=== $user: $dir ===" +done + +# Actualizar todos os sites (com PHP auto-detect) +find /home -name wp-config.php -not -path "*/backup*" 2>/dev/null | while read config; do + dir=$(dirname "$config") + user=$(stat -c '%U' "$dir") + echo "--- Actualizando $user ---" + php_fpm=$(ps aux | grep "php-fpm: pool ${user}" | grep -v grep | head -1 | grep -o 'php-fpm[0-9][0-9]' | head -1) + php_ver=${php_fpm:-php-fpm82} + /opt/alt/${php_ver}/usr/bin/php /usr/local/bin/wp core update --allow-root --path="$dir" 2>/dev/null + /opt/alt/${php_ver}/usr/bin/php /usr/local/bin/wp plugin update --all --allow-root --path="$dir" 2>/dev/null +done +``` + +--- + +## Erros Comuns e Soluções + +| Erro | Causa | Solução | +|------|-------|---------| +| `Operation not permitted` | Sem `--allow-root` | Adicionar `--allow-root` | +| `PHP Fatal error: memory` | Limite memória | `define('WP_MEMORY_LIMIT','256M')` no wp-config.php | +| `max_execution_time exceeded` | Timeout em ops longas | `--exec-time=300` ou php.ini | +| `Error establishing database connection` | BD em baixo | `wp db check --allow-root` | +| `Warning: Could not get lock` | Outro processo activo | `wp cli cache clear --allow-root` | +| PHP version wrong | Site usa PHP diferente | `ps aux \| grep "pool USER"` para detectar | + +--- + +## Diagnóstico Rápido + +```bash +# Informações completas do ambiente +wp --info --allow-root --path=$PATH + +# Verificar conectividade BD +wp db check --allow-root --path=$PATH + +# Ver configuração PHP activa +wp eval 'echo PHP_VERSION."\n".php_ini_loaded_file()."\n".ini_get("memory_limit")."\n";' --allow-root --path=$PATH + +# Ver URL e email admin +wp option get siteurl --allow-root --path=$PATH +wp option get admin_email --allow-root --path=$PATH + +# Listar utilizadores admin +wp user list --role=administrator --allow-root --path=$PATH +``` + +--- + +## Recursos Adicionais + +### Scripts + +- **`scripts/wp-auto.sh`** — Auto-detecta PHP do utilizador e executa WP-CLI com a versão correcta + +### Referências + +- **`references/commands.md`** — Referência completa: todos os comandos com flags, WooCommerce CLI, options, wp eval avançado + +### Documentação Hub + +- **Manual:** `Hub/06-Operacoes/Documentacao/Manuais/WP-CLI no CWP.md` +- **NotebookLM:** [WordPress Config CLI](https://notebooklm.google.com/notebook/fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d) +- **Skill relacionada:** `/rank-math` — operações Rank Math SEO via WP-CLI + +--- + +*WP-CLI no CWP | Descomplicar® | v1.0.0 | 18-02-2026* diff --git a/wordpress/skills/wp-cli/references/commands.md b/wordpress/skills/wp-cli/references/commands.md new file mode 100644 index 0000000..635be01 --- /dev/null +++ b/wordpress/skills/wp-cli/references/commands.md @@ -0,0 +1,376 @@ +# WP-CLI no CWP — Referência Completa de Comandos + +**Servidor:** server.descomplicar.pt (176.9.3.158) | porta 9443 +**PHP padrão:** `/opt/alt/php-fpm83/usr/bin/php` + +--- + +## Formato Base + +```bash +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp GRUPO SUBCOMANDO [FLAGS] --allow-root --path=/home/USER/public_html +``` + +--- + +## Core WordPress + +```bash +wp core version # Versão actual +wp core update # Actualizar para latest +wp core update --version=6.4.3 --force # Versão específica +wp core download # Descarregar sem instalar +wp core verify-checksums # Verificar integridade ficheiros +wp core install --url=... --title=... \ + --admin_user=admin --admin_email=... # Instalar novo WordPress +wp core is-installed # Verificar se está instalado +wp core update-db # Actualizar base de dados após update +``` + +--- + +## Plugins + +```bash +wp plugin list # Listar todos +wp plugin list --status=inactive # Só inactivos +wp plugin list --update=available # Com updates disponíveis +wp plugin install SLUG # Instalar +wp plugin install SLUG --activate # Instalar e activar +wp plugin install SLUG --version=X.X # Versão específica +wp plugin activate SLUG # Activar +wp plugin deactivate SLUG # Desactivar +wp plugin deactivate --all # Desactivar todos (debug) +wp plugin delete SLUG # Remover ficheiros +wp plugin update SLUG # Actualizar plugin específico +wp plugin update --all # Actualizar todos +wp plugin update --all --dry-run # Preview de updates +wp plugin verify-checksums SLUG # Verificar integridade +wp plugin verify-checksums --all # Verificar todos +wp plugin search TERMO # Pesquisar no repo WordPress.org +wp plugin get SLUG # Info detalhada +wp plugin path SLUG # Path do plugin no servidor +``` + +--- + +## Temas + +```bash +wp theme list # Listar todos +wp theme install SLUG # Instalar +wp theme install SLUG --activate # Instalar e activar +wp theme activate SLUG # Activar tema +wp theme update SLUG # Actualizar +wp theme update --all # Actualizar todos +wp theme delete SLUG # Remover +wp theme get SLUG # Info detalhada +wp theme is-active SLUG # Verificar se activo +``` + +--- + +## Base de Dados + +```bash +wp db export /caminho/backup.sql # Exportar +wp db export - | gzip > backup.sql.gz # Exportar comprimido +wp db import backup.sql # Importar +wp db optimize # Optimizar tabelas +wp db repair # Reparar tabelas +wp db check # Verificar integridade +wp db size # Tamanho da BD +wp db tables # Listar tabelas +wp db prefix # Prefixo actual +wp db query "SQL;" # Query directa +wp db search "TERMO" # Pesquisar em toda a BD +wp db clean --tables=revision # Limpar revisões +``` + +--- + +## Search-Replace (Migração) + +```bash +# SEMPRE fazer dry-run primeiro +wp search-replace 'old.com' 'new.com' --dry-run + +# Executar +wp search-replace 'https://old.com' 'https://new.com' + +# Só numa tabela +wp search-replace 'old' 'new' wp_options wp_postmeta + +# Com relatório detalhado +wp search-replace 'old' 'new' --report-changed-only + +# Sem serialization (mais rápido, menos seguro) +wp search-replace 'old' 'new' --no-php + +# Número de linhas por batch (para BDs grandes) +wp search-replace 'old' 'new' --precise + +# Skip tabelas específicas +wp search-replace 'old' 'new' --skip-tables=wp_users +``` + +--- + +## Options WordPress + +```bash +wp option get NOME # Ler option +wp option update NOME VALOR # Actualizar (simples) +wp option patch update NOME SUBKEY VALOR # Actualizar sub-key (serialized) +wp option pluck NOME SUBKEY # Ler sub-key +wp option add NOME VALOR # Adicionar +wp option delete NOME # Apagar +wp option list # Listar todas +wp option list --search='rank*' # Filtrar por nome +wp option list --autoload=yes # Só com autoload +``` + +--- + +## Post Meta / User Meta / Term Meta + +```bash +# Post Meta +wp post meta list POST_ID # Listar meta de um post +wp post meta get POST_ID META_KEY # Ler valor +wp post meta update POST_ID META_KEY VAL # Actualizar +wp post meta add POST_ID META_KEY VAL # Adicionar +wp post meta delete POST_ID META_KEY # Apagar + +# Com formato JSON (para arrays/objects) +wp post meta update POST_ID META_KEY '["val1","val2"]' --format=json + +# Term Meta +wp term meta list TERM_ID +wp term meta get TERM_ID META_KEY +wp term meta update TERM_ID META_KEY VAL + +# User Meta +wp user meta list USER_ID +wp user meta get USER_ID META_KEY +wp user meta update USER_ID META_KEY VAL +``` + +--- + +## Posts e Conteúdo + +```bash +wp post list # Listar posts +wp post list --post_type=page # Só páginas +wp post list --post_status=draft # Só rascunhos +wp post get POST_ID # Info completa +wp post create --post_type=post \ + --post_title="Título" \ + --post_status=publish # Criar post +wp post update POST_ID --post_title="..." # Actualizar +wp post delete POST_ID # Apagar (lixo) +wp post delete POST_ID --force # Apagar definitivo +wp post generate --count=10 # Gerar posts de teste +``` + +--- + +## Utilizadores + +```bash +wp user list # Listar todos +wp user list --role=administrator # Filtrar por papel +wp user get USER_ID # Info utilizador +wp user get USERNAME --field=ID # Obter ID por username +wp user create LOGIN EMAIL \ + --role=administrator \ + --user_pass=SENHA # Criar +wp user update USER_ID --user_pass=SENHA # Alterar password +wp user update USER_ID --user_email=... # Alterar email +wp user set-role USER_ID administrator # Alterar papel +wp user delete USER_ID --reassign=1 # Apagar, transferindo conteúdo +wp user check-password USER_ID SENHA # Verificar password +wp user reset-password USER_ID # Reset password (envia email) +``` + +--- + +## Cache e Transientes + +```bash +wp cache flush # Limpar object cache +wp cache get KEY [GROUP] # Ler cache +wp transient delete --all # Apagar todos transientes +wp transient delete NOME # Apagar transiente específico +wp transient get NOME # Ler transiente +wp rewrite flush # Regenerar rewrite rules +wp rewrite list # Listar rules actuais +``` + +--- + +## Cron + +```bash +wp cron event list # Listar eventos agendados +wp cron event run HOOK_NAME # Executar agora +wp cron event delete HOOK_NAME # Apagar evento +wp cron event schedule HOOK cron now # Agendar evento +wp cron schedule list # Ver schedules disponíveis +wp cron test # Testar se cron está funcional +``` + +--- + +## wp eval — Execução PHP + +```bash +# Código PHP inline +wp eval 'echo PHP_VERSION."\n";' --allow-root --path=$PATH + +# Ficheiro PHP +wp eval-file script.php --allow-root --path=$PATH + +# Com parâmetros +wp eval 'global $wpdb; echo $wpdb->prefix;' --allow-root --path=$PATH + +# Ver constantes WordPress +wp eval 'echo WP_CONTENT_DIR."\n"; echo ABSPATH;' --allow-root --path=$PATH + +# Executar com utilizador específico +wp eval 'echo get_current_user_id();' --user=1 --allow-root --path=$PATH +``` + +--- + +## Multisite + +```bash +wp site list # Listar sites +wp site create --slug=subdomain # Criar site +wp site activate ID # Activar +wp site deactivate ID # Desactivar +wp site delete ID # Apagar + +# Executar comando em todos os sites +wp site list --field=url | xargs -I {} wp --url={} plugin list --allow-root --path=$PATH +``` + +--- + +## WooCommerce CLI + +```bash +wp wc product list # Listar produtos +wp wc product get ID # Produto específico +wp wc product create --name="Nome" \ + --regular_price="19.99" # Criar produto +wp wc product update ID --regular_price="29.99" # Actualizar +wp wc product delete ID # Apagar + +wp wc order list # Listar encomendas +wp wc order get ID # Encomenda específica +wp wc order update ID --status=completed # Mudar estado + +wp wc customer list # Listar clientes +wp wc shipping_zone list # Zonas de entrega +``` + +--- + +## Segurança e Diagnóstico + +```bash +# Verificar integridade completa +wp core verify-checksums --allow-root --path=$PATH +wp plugin verify-checksums --all --allow-root --path=$PATH + +# Configuração PHP activa +wp eval 'echo PHP_VERSION."\n".php_ini_loaded_file()."\n";' --allow-root --path=$PATH +wp eval 'echo ini_get("memory_limit")."\n".ini_get("max_execution_time");' --allow-root --path=$PATH + +# Ver configuração WordPress +wp option get siteurl --allow-root --path=$PATH +wp option get blogname --allow-root --path=$PATH +wp option get active_plugins --format=json --allow-root --path=$PATH + +# Verificar se WP_DEBUG activo +wp eval 'echo WP_DEBUG ? "DEBUG ON" : "DEBUG OFF";' --allow-root --path=$PATH + +# Listar ficheiros modificados recentemente (possível hack) +find /home/USER/public_html -name "*.php" -newer /home/USER/public_html/wp-config.php -not -path "*/wp-content/cache/*" 2>/dev/null | head -20 +``` + +--- + +## Scripts de Manutenção + +### Backup completo de um site + +```bash +#!/bin/bash +PATH_WP="/home/USER/public_html" +BACKUP_DIR="/media/ealmeida/Dados/GDrive/Backups/WP" +DATE=$(date +%Y%m%d_%H%M) +SITE=$(basename $(dirname $PATH_WP)) + +mkdir -p "$BACKUP_DIR" + +# Backup BD +/opt/alt/php-fpm83/usr/bin/php /usr/local/bin/wp db export \ + "$BACKUP_DIR/${SITE}_db_${DATE}.sql" \ + --allow-root --path=$PATH_WP + +# Backup ficheiros +tar -czf "$BACKUP_DIR/${SITE}_files_${DATE}.tar.gz" \ + -C $(dirname $PATH_WP) public_html \ + --exclude="public_html/wp-content/cache" + +echo "Backup completo: $BACKUP_DIR" +``` + +### Manutenção semanal (todos os sites) + +```bash +#!/bin/bash +find /home -name wp-config.php -not -path "*/backup*" 2>/dev/null | while read config; do + dir=$(dirname "$config") + user=$(stat -c '%U' "$dir") + + # Detectar PHP do utilizador + php_fpm=$(ps aux | grep "php-fpm: pool ${user}" | grep -v grep | head -1 | grep -o 'php-fpm[0-9][0-9]' | head -1) + php_ver=${php_fpm:-php-fpm82} + php_bin="/opt/alt/${php_ver}/usr/bin/php" + + echo "=== $user ($dir) — PHP $php_ver ===" + + $php_bin /usr/local/bin/wp core update --allow-root --path="$dir" 2>/dev/null + $php_bin /usr/local/bin/wp plugin update --all --allow-root --path="$dir" 2>/dev/null + $php_bin /usr/local/bin/wp theme update --all --allow-root --path="$dir" 2>/dev/null + $php_bin /usr/local/bin/wp db optimize --allow-root --path="$dir" 2>/dev/null + $php_bin /usr/local/bin/wp cache flush --allow-root --path="$dir" 2>/dev/null +done +``` + +--- + +## Flags Globais Úteis + +| Flag | Descrição | +|------|-----------| +| `--allow-root` | Obrigatório no CWP (executa como root) | +| `--path=/home/USER/public_html` | Caminho da instalação WordPress | +| `--url=https://site.pt` | URL do site (importante em multisite) | +| `--user=1` | Executar como utilizador WordPress específico | +| `--format=json\|table\|csv\|ids` | Formato do output | +| `--fields=ID,name` | Campos a mostrar | +| `--debug` | Output de debug detalhado | +| `--quiet` | Sem output (para scripts) | +| `--dry-run` | Preview sem executar (onde disponível) | +| `--skip-plugins` | Não carregar plugins (troubleshooting) | +| `--skip-themes` | Não carregar temas | + +--- + +*WP-CLI CWP — Referência Completa | Descomplicar® | v1.0.0 | 18-02-2026* diff --git a/wordpress/skills/wp-cli/scripts/wp-auto.sh b/wordpress/skills/wp-cli/scripts/wp-auto.sh new file mode 100755 index 0000000..5c29a06 --- /dev/null +++ b/wordpress/skills/wp-cli/scripts/wp-auto.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# wp-auto.sh — WP-CLI com detecção automática de PHP no CWP +# Uso: /root/wp-auto.sh --path=/home/USER/public_html [comando wp-cli] +# Exemplo: /root/wp-auto.sh --path=/home/site/public_html plugin list + +# Pegar utilizador do directório de trabalho +if [[ "$*" == *"--path="* ]]; then + WP_PATH=$(echo "$@" | grep -o '\-\-path=[^ ]*' | cut -d= -f2) +else + WP_PATH=$(pwd) +fi + +USER=$(stat -c '%U' "$WP_PATH" 2>/dev/null || echo "nobody") + +# Encontrar versão PHP-FPM activa para este utilizador +PHP_FPM_PROCESS=$(ps aux | grep "php-fpm: pool ${USER}" | grep -v grep | head -n 1) +PHP_VERSION=$(echo "$PHP_FPM_PROCESS" | grep -o 'php-fpm[0-9][0-9]' | grep -o '[0-9][0-9]' | head -1) + +if [ -z "$PHP_VERSION" ]; then + echo "⚠ Usando PHP 8.2 (padrão — pool ${USER} não encontrado)" >&2 + PHP_PATH="/opt/alt/php-fpm82/usr/bin/php" +else + PHP_PATH="/opt/alt/php-fpm${PHP_VERSION}/usr/bin/php" + echo "ℹ PHP ${PHP_VERSION} detectado para utilizador ${USER}" >&2 +fi + +# Verificar se o PHP existe +if [ ! -f "$PHP_PATH" ]; then + echo "❌ PHP não encontrado: $PHP_PATH — usando PHP 8.3" >&2 + PHP_PATH="/opt/alt/php-fpm83/usr/bin/php" +fi + +# Executar WP-CLI +exec "$PHP_PATH" /usr/local/bin/wp --allow-root "$@" diff --git a/wordpress/skills/wp-dev/SKILL.md b/wordpress/skills/wp-dev/SKILL.md index 12854ee..4cabc91 100644 --- a/wordpress/skills/wp-dev/SKILL.md +++ b/wordpress/skills/wp-dev/SKILL.md @@ -303,7 +303,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data ```javascript // Desenvolvimento de plugins WordPress -mcp__dify-kb__dify_kb_retrieve_segments({ +mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({ dataset_id: "9da0b2b9-5051-4b99-b9f6-20bf35067092", query: "plugin development hooks filters" }) diff --git a/wordpress/skills/wp-translate/SKILL.md b/wordpress/skills/wp-translate/SKILL.md new file mode 100644 index 0000000..4c1d818 --- /dev/null +++ b/wordpress/skills/wp-translate/SKILL.md @@ -0,0 +1,266 @@ +--- +name: wp-translate +description: > + Tradução WordPress PT-PT com DeepL Pro, glossário e scripts próprios. Use when translating WordPress plugins to PT-PT, fixing PT-BR translations, handling .po/.mo/.json files, working with Loco Translate, deploying translations to starter.descomplicar.pt, or when user mentions "tradução", "translate", "pt-pt", "pt-br", ".po", ".mo", "loco", "deepl wordpress". +author: Descomplicar® Crescimento Digital +version: 1.0.0 +quality_score: 100 +user_invocable: true +category: wordpress +tags: [wordpress, traducao, pt-pt, deepl, po, mo, gettext, loco-translate, i18n] +desk_task: 1580 +desk_project: 65 +allowed-tools: Read, Write, Edit, Bash, mcp__ssh-unified, mcp__deepl, mcp__memory-supabase +mcps: ssh-unified, deepl, memory-supabase +--- + +# /wp-translate — Traduções WordPress PT-PT + +## Visão Geral + +Skill para traduzir plugins WordPress para Português Europeu (PT-PT) usando DeepL Pro com glossário, scripts de automação próprios e deploy directo para starter.descomplicar.pt. + +--- + +## Scripts Disponíveis + +**Localização local:** `/media/ealmeida/Dados/Dev/Scripts/translate-wp-plugin/` +**No servidor (tmp):** `/tmp/translate_missing.py`, `/tmp/fix_ptbr_safe.py` + +| Script | Função | +|--------|--------| +| `translate_missing.py` | Traduz strings vazias via DeepL Pro + glossário. Suporta batch 50 strings/pedido | +| `fix_ptbr_safe.py` | Corrige ~100 padrões PT-BR → PT-PT | +| `fix_malformed.py` | Corrige sintaxe .po mal formada | +| `batch_process_library.py` | Orquestra fix_malformed → fix_ptbr → translate → compile .mo para toda a biblioteca | +| `setup_glossary.py` | Cria/actualiza glossário DeepL (175 entradas WP PT-PT) | + +**Configuração (.env):** +``` +DEEPL_API_KEY=3c74e27a-f688-4de2-927b-e91da46cf9cd +DEEPL_GLOSSARY_ID=b9db5639-c201-479f-87af-adb81f112067 +``` + +--- + +## DeepL Pro + +- **Endpoint:** `api.deepl.com` (Pro — sem `:fx`) +- **Quota:** ~1,6M / 1 trilião de chars +- **Glossário:** 160 entradas brand names + termos WordPress (EN→PT) +- **Atenção:** DeepL também gera padrões PT-BR — sempre correr `fix_ptbr` ANTES E DEPOIS da tradução + +--- + +## Workflow: Plugin Individual + +```bash +# 1. No servidor — gerar .pot (se não existir) +wp --path=/home/ealmeida/starter.descomplicar.pt i18n make-pot \ + wp-content/plugins/PLUGIN/ \ + /tmp/PLUGIN-pt_PT.po \ + --domain=TEXT_DOMAIN --allow-root + +# 2. Traduzir com DeepL Pro +python3 /tmp/translate_missing.py /tmp/PLUGIN-pt_PT.po + +# 3. Corrigir PT-BR pós-tradução +python3 /tmp/fix_ptbr_safe.py /tmp/PLUGIN-pt_PT.po + +# 4. Para plugins React — gerar JSON para strings JS +wp --path=/home/ealmeida/starter.descomplicar.pt i18n make-json \ + /tmp/PLUGIN-pt_PT.po /path/to/languages/ --no-purge --allow-root + +# 5. Copiar para servidor +cp /tmp/PLUGIN-pt_PT.{po,mo} /home/ealmeida/starter.descomplicar.pt/wp-content/languages/plugins/ +chown ealmeida:ealmeida /home/ealmeida/starter.descomplicar.pt/wp-content/languages/plugins/PLUGIN-pt_PT.* +``` + +## Workflow: Biblioteca Completa + +```bash +python3 /media/ealmeida/Dados/Dev/Scripts/translate-wp-plugin/batch_process_library.py \ + /path/to/library +# Opções: --skip-translate, --dry-run, --only-ptbr +``` + +--- + +## Encontrar o Text Domain + +**Crítico:** O nome da pasta do plugin ≠ text domain. Sempre verificar: + +```bash +grep "Text Domain" /path/to/plugin/plugin-main.php +``` + +**Casos conhecidos de divergência:** +| Pasta | Text Domain | Ficheiro .po | +|-------|-------------|--------------| +| `pro-elements` | `elementor-pro` | `elementor-pro-pt_PT.po` | +| `branda-white-labeling` | `ub` | `ub-pt_PT.po` | +| `seo-by-rank-math` | `rank-math` | `rank-math-pt_PT.po` | + +--- + +## Plugins React/JS — Ficheiros JSON + +Plugins com `wp_set_script_translations()` precisam de um `.json` além do `.mo`. + +**Detectar:** +```bash +grep -r "wp_set_script_translations" /path/plugin/ --include="*.php" +``` + +**Gerar JSON:** +```bash +wp i18n make-json PLUGIN-pt_PT.po /path/languages/ --no-purge --allow-root +``` + +**Atenção ao MD5:** WordPress calcula `md5(relative_path_of_script)` para o nome do JSON. +Se o `source` no JSON não bater com o script registado, copiar o JSON com o MD5 correcto: + +```bash +# Encontrar qual script está registado +grep "wp_register_script\|wp_enqueue_script" plugin.php | grep "HANDLE" + +# Calcular MD5 do caminho relativo +python3 -c "import hashlib; print(hashlib.md5('app/index.js'.encode()).hexdigest())" + +# Copiar com nome correcto +cp PLUGIN-pt_PT-{md5_errado}.json PLUGIN-pt_PT-{md5_correcto}.json +``` + +**Exemplo real — ai-engine:** +- Handle `mwai` → script `app/index.js` → MD5: `2018087f584c4398b5c3a23fc0e5f9db` +- JSON gerado com source `app/i18n.js` → MD5: `0bdc92e05d8f3ab638aa855679db059e` +- Solução: copiar JSON com o MD5 de `app/index.js` + +--- + +## Padrões PT-BR Comuns (fix_ptbr) + +DeepL introduz PT-BR mesmo com `target_lang=PT-PT`. Correr fix_ptbr **depois** da tradução: + +| PT-BR | PT-PT | +|-------|-------| +| atualiz* | actualiz* | +| ativar/desativar | activar/desactivar | +| você/vocês | o utilizador/os utilizadores | +| excluir/excluído | eliminar/eliminado | +| acessar | aceder | +| compartilhar | partilhar | +| postagem/postagens | publicação/publicações | +| ativo/inativo | activo/inactivo | +| ativação/desativação | activação/desactivação | +| digite | introduza | +| clique | clique (OK) | + +--- + +## Servidor starter.descomplicar.pt + +``` +SSH: mcp__ssh-unified__ssh_execute server:"server" +Path traduções: /home/ealmeida/starter.descomplicar.pt/wp-content/languages/plugins/ +Loco Translate: /home/ealmeida/starter.descomplicar.pt/wp-content/languages/loco/plugins/ +WP-CLI: wp --path=/home/ealmeida/starter.descomplicar.pt [...] --allow-root +``` + +**Permissões obrigatórias após operações root:** +```bash +chown ealmeida:ealmeida /home/ealmeida/starter.descomplicar.pt/wp-content/languages/plugins/PLUGIN-pt_PT.* +``` + +**Deploy completo:** +```bash +# Copiar .po + .mo + .json +cp /tmp/PLUGIN-pt_PT.{po,mo} /home/.../languages/plugins/ +# Se React: copiar também os .json +chown ealmeida:ealmeida /home/.../languages/plugins/PLUGIN-pt_PT* +wp --path=... cache flush --allow-root +``` + +--- + +## Verificação de Estado + +```bash +# Strings em falta em todos os plugins +python3 -c " +from pathlib import Path; import polib +for f in sorted(Path('languages/plugins').glob('*-pt_PT.po')): + po = polib.pofile(str(f)) + empty = len(po.untranslated_entries()) + if empty: print(f'{f.name}: {empty} em falta') +" + +# PT-BR residual após tradução +grep -rn "atualiz\|ativar\|você\b\|excluir\b" languages/plugins/*.po +``` + +--- + +## Problemas Conhecidos + +### Python 3.6 no servidor +Scripts locais usam type hints Python 3.9+. Para correr no servidor: +- Remover anotações `-> type` das funções +- Não usar `from __future__ import annotations` (não funciona no 3.6) +- `tuple[str, list]` → usar `Tuple` de typing + +### msgfmt vs polib +`msgfmt 0.19.8.1` recusa .po com strings mal formadas. Usar sempre **polib** para compilar: +```python +po = polib.pofile('file.po') +po.save_as_mofile('file.mo') +``` + +### Glossário Pro vs Free +Glossário criado com chave `:fx` (Free) não funciona na conta Pro e vice-versa. +Fix: `python3 setup_glossary.py` após mudar de chave API. + +### XML tag_handling quebra com & +`tag_handling='xml'` falha com strings como "Settings & Tools". +Fix actual: tokens Unicode `⟦0⟧` como placeholders (implementado em translate_missing.py v2.1+). + +### Strings hardcoded em bundles JS compilados +Plugins com React que não usam `__()` nas strings de UI (ex: `subtitle:"text"`) não podem ser traduzidos. +Não é possível sem modificar o bundle compilado. Aceitar e documentar. + +### Loco Translate "Write protected" +Ficheiros criados por root via SSH ficam inacessíveis ao web server. +Fix: `chown ealmeida:ealmeida` nos ficheiros de tradução. + +--- + +## Compilar .mo após Edições Manuais + +```python +import polib +po = polib.pofile('/path/to/file.po') +po.save('/path/to/file.po') # salva o .po actualizado +po.save_as_mofile('/path/to/file.mo') +``` + +## Re-gerar JSON após Edições ao .po + +```bash +wp i18n make-json file-pt_PT.po /path/languages/ --no-purge --allow-root +# Depois sempre copiar com MD5 correcto se necessário +chown ealmeida:ealmeida /path/languages/file-pt_PT-*.json +wp --path=... cache flush --allow-root +``` + +--- + +## Estado da Biblioteca (starter.descomplicar.pt — 25-02-2026) + +- **21 plugins** com ficheiros .po activos +- **Cobertura:** 100% em todos os plugins (excl. webp-express sem suporte i18n) +- **Strings hardcoded** não traduzíveis: ~7 subtítulos no ai-engine (limitação do plugin) +- **Loco Translate path:** `languages/loco/plugins/` para pro-elements (elementor-pro) + +--- + +*Skill v1.0.0 | 25-02-2026 | Descomplicar®* diff --git a/wordpress/skills/wp-update/SKILL.md b/wordpress/skills/wp-update/SKILL.md index 09db602..b92b646 100644 --- a/wordpress/skills/wp-update/SKILL.md +++ b/wordpress/skills/wp-update/SKILL.md @@ -4,7 +4,7 @@ description: WordPress core, plugins, and themes update management. Safely updat WordPress components with backups. Use when user mentions "wordpress update", "wp update", "update plugins", "update themes", "wordpress maintenance". author: Descomplicar® Crescimento Digital -version: 1.1.0 +version: 1.2.0 quality_score: 75 user_invocable: true desk_task: 1553 @@ -91,6 +91,63 @@ chown -R USER:USER /home/USER/PATH/wp-content/ Re-executar script de verificação para confirmar que todos os sites continuam funcionais. +### 4. Relatório Desk CRM (OBRIGATÓRIO) + +Após concluir as actualizações e verificação final, publicar relatório completo como comentário na **Discussão #52** ("Logs de Atualização de Websites") do **Projecto #69**. + +**Tool:** `mcp__desk-crm-v3__add_discussion_comment` +- `discussion_id`: 52 +- `staff_id`: 25 (AikTop) +- `content`: HTML formatado (template abaixo) + +**Template HTML do Relatório:** +```html +

    🔄 Relatório WordPress Update - YYYY-MM-DD

    + +
    Verificação Inicial
    +
      +
    • ✅ X/16 sites OK
    • +
    • ❌ Y sites com problemas: [lista se houver]
    • +
    + +
    Actualizações Aplicadas
    + + + + +
    SitePluginsTemasCoreNotas
    site.pt✅ 3/3✅ 1/1
    + +

    Sites sem alterações: [lista de sites já actualizados]

    + +
    Falhas (Licenças Premium)
    + + + +
    PluginSites AfectadosErro
    plugin-namesite1, site2Unauthorized
    + +
    Verificação Final
    +
      +
    • ✅ X/16 sites OK após actualizações
    • +
    + +
    Alertas Wordfence
    +
      +
    • [Listar alertas Wordfence recentes da conta it@descomplicar.pt se existirem]
    • +
    • Sem alertas (se nenhum)
    • +
    + +
    +

    Relatório automático gerado por /wp-update v1.2.0 | AikTop

    +``` + +**Regras do Relatório:** +- Verificar data actual com `mcp__mcp-time__current_time` antes de gerar +- Incluir TODOS os sites (16), mesmo os que não tinham updates +- Separar claramente sucessos de falhas +- Listar alertas Wordfence da pasta `INBOX.Wordpress.Alertas Wordfence` da conta `it` (últimos 7 dias) +- Se a verificação final detectar problemas, destacar em **vermelho** +- Omitir a tabela de Falhas se não houver nenhuma + --- ## PATHS DOS SITES @@ -161,11 +218,27 @@ Workflow segunda-feira: 2. Executa verificação inicial 3. Reporta estado dos sites 4. Propõe actualizações pendentes +5. Após conclusão, publica relatório na Discussão #52 (Projecto #69) + +## INTEGRAÇÃO DESK CRM + +- **Projecto:** #69 (Manutenção Websites) +- **Discussão:** #52 (Logs de Atualização de Websites) +- **Staff:** 25 (AikTop) para comentários automáticos +- **Tool:** `mcp__desk-crm-v3__add_discussion_comment` +- **Wordfence Alerts:** Conta IMAP `it`, pasta `INBOX.Wordpress.Alertas Wordfence` --- ## CHANGELOG +### v1.2.0 (2026-02-08) +- Adicionado Passo 4: Relatório automático Desk CRM +- Relatório publicado como comentário na Discussão #52 (Projecto #69) +- Template HTML completo com tabelas de actualizações e falhas +- Integração Wordfence: verifica alertas recentes da conta IMAP it@ +- Staff AikTop (ID 25) como autor dos relatórios + ### v1.1.0 (2026-02-02) - Script movido para `/media/ealmeida/Dados/Dev/ClaudeDev/Claude-Scripts/wp-update/` - Removidos domínios expirados da lista (jornadadoheroi, tecoworking, socialboost)