Merge remote-tracking branch 'origin/main'
# Conflicts: # .claude-plugin/marketplace.json # .gitignore # acidaos/skills/devops/SKILL.md # acidaos/skills/docs/SKILL.md # acidaos/skills/rust-dev/SKILL.md # acidaos/skills/spoke-dev/SKILL.md # automacao/agents/automation-lead.md # automacao/agents/mcp-protocol-developer.md # automacao/agents/n8n-automation-expert.md # automacao/skills/moloni-api/SKILL.md # automacao/skills/n8n/SKILL.md # core-tools/skills/_core/SKILL.md # core-tools/skills/agent-context-injector/SKILL.md # core-tools/skills/component-generator/SKILL.md # core-tools/skills/db-maintenance-manager/SKILL.md # core-tools/skills/infrastructure-manager/SKILL.md # core-tools/skills/metrics/SKILL.md # core-tools/skills/plugin-curator/SKILL.md # core-tools/skills/plugin-manager/SKILL.md # core-tools/skills/plugin-manager/profiles.json # core-tools/skills/quality-validator/SKILL.md # core-tools/skills/relationship-manager/SKILL.md # crm-ops/.claude-plugin/plugin.json # crm-ops/CHANGELOG.md # crm-ops/agents/budget-proposal-specialist.md # crm-ops/agents/lead-approach-strategist.md # crm-ops/agents/lead-qualifier.md # crm-ops/agents/sales-manager.md # crm-ops/agents/support-specialist.md # crm-ops/skills/auto-expense/SKILL.md # crm-ops/skills/billing-check/SKILL.md # crm-ops/skills/crm-admin/SKILL.md # crm-ops/skills/crm/SKILL.md # crm-ops/skills/desk/SKILL.md # crm-ops/skills/estrategia-marca/SKILL.md # crm-ops/skills/estrategia-marca/references/metodologia-acida.md # crm-ops/skills/estrategia-marca/references/template-documento.md # crm-ops/skills/expense/SKILL.md # crm-ops/skills/invoice/SKILL.md # crm-ops/skills/orcamento/SKILL-light.md # crm-ops/skills/orcamento/SKILL.md # crm-ops/skills/proposal-deck/SKILL.md # crm-ops/skills/proposta-visual/SKILL.md # crm-ops/skills/ticket-manage/SKILL.md # crm-ops/skills/ticket-triage/SKILL.md # crm-ops/skills/ticket/SKILL.md # design-media/agents/design-critic.md # design-media/agents/design-generator.md # design-media/agents/design-lead.md # design-media/agents/design-prompt-architect.md # design-media/agents/design-researcher.md # design-media/agents/ui-designer.md # design-media/agents/video-production-specialist.md # design-media/agents/web-designer.md # design-media/skills/brand-guidelines/SKILL.md # design-media/skills/brand-guidelines/references/descomplicar-theme.md # design-media/skills/cinematic-site/SKILL.md # design-media/skills/clone-style/SKILL.md # design-media/skills/design-b2b/SKILL.md # design-media/skills/design-ecommerce/SKILL.md # design-media/skills/design-saude/SKILL.md # design-media/skills/design-solar/SKILL.md # design-media/skills/design/SKILL.md # design-media/skills/design/references/premium-proposals.md # dev-tools/agents/database-design-specialist.md # dev-tools/agents/dev-helper.md # dev-tools/agents/development-lead.md # dev-tools/agents/javascript-fullstack-specialist.md # dev-tools/agents/nextjs-specialist.md # dev-tools/agents/php-fullstack-engineer.md # dev-tools/skills/benchmark/SKILL.md # dev-tools/skills/canary/SKILL.md # dev-tools/skills/chrome/SKILL.md # dev-tools/skills/db-design/SKILL.md # dev-tools/skills/dep-audit/SKILL.md # dev-tools/skills/diagrama/SKILL.md # dev-tools/skills/docx/SKILL-light.md # dev-tools/skills/docx/SKILL.md # dev-tools/skills/docx/scripts/__init__.py # dev-tools/skills/docx/scripts/office/pack.py # dev-tools/skills/docx/scripts/office/unpack.py # dev-tools/skills/docx/scripts/office/validate.py # dev-tools/skills/nextjs/SKILL.md # dev-tools/skills/pdf/SKILL-light.md # dev-tools/skills/pdf/SKILL.md # dev-tools/skills/php-dev/SKILL.md # dev-tools/skills/prompt-refine/SKILL.md # dev-tools/skills/react-patterns/SKILL.md # dev-tools/skills/skill-creator/SKILL.md # dev-tools/skills/skill-creator/references/descomplicar-standards.md # dev-tools/skills/webapp-testing/SKILL.md # dev-tools/skills/webapp-testing/scripts/with_server.py # dev-tools/skills/xlsx/SKILL.md # dev-tools/skills/xlsx/scripts/office/pack.py # dev-tools/skills/xlsx/scripts/office/unpack.py # dev-tools/skills/xlsx/scripts/office/validate.py # dev-tools/skills/youtube-extract/SKILL.md # gestao/.claude-plugin/plugin.json # gestao/agents/analytics-insights-agent.md # gestao/agents/compliance-auditor.md # gestao/agents/project-manager.md # gestao/agents/reflect-agent.md # gestao/agents/software-project-planner.md # gestao/agents/time-management-agent.md # gestao/agents/wiki-knowledge-agent.md # gestao/skills/aiktop-tasks/SKILL.md # gestao/skills/archive/SKILL.md # gestao/skills/calendar-manager/SKILL.md # gestao/skills/cleanup-downloads/SKILL.md # gestao/skills/clip-agent/SKILL.md # gestao/skills/clip-health/SKILL.md # gestao/skills/clip-instructions/SKILL.md # gestao/skills/clip-issue/SKILL.md # gestao/skills/clip-org/SKILL.md # gestao/skills/clip-routine/SKILL.md # gestao/skills/clip-skill/SKILL.md # gestao/skills/clip-vision/SKILL.md # gestao/skills/clip/SKILL.md # gestao/skills/daily-digest/SKILL.md # gestao/skills/deep-research/SKILL.md # gestao/skills/delegate/SKILL.md # gestao/skills/doc-coauthoring/SKILL.md # gestao/skills/dual-review/SKILL.md # gestao/skills/hub-compile/SKILL.md # gestao/skills/hub-search/SKILL.md # gestao/skills/imap-triage/SKILL.md # gestao/skills/index-update/SKILL.md # gestao/skills/knowledge/SKILL.md # gestao/skills/knowledge/docs/workflow.md # gestao/skills/knowledge/references/routing-guide.md # gestao/skills/mindmap/SKILL.md # gestao/skills/monday-briefing/SKILL.md # gestao/skills/notebooklm/SKILL.md # gestao/skills/office-hours/SKILL.md # gestao/skills/onboarding/SKILL.md # gestao/skills/proc-creator/SKILL.md # gestao/skills/reflect/SKILL.md # gestao/skills/report-templates/SKILL.md # gestao/skills/report/SKILL.md # gestao/skills/research-pipeline/SKILL.md # gestao/skills/review-corrections/SKILL.md # gestao/skills/spec-coauthor/SKILL.md # gestao/skills/task-state/SKILL.md # gestao/skills/tasks-overview/SKILL.md # gestao/skills/time/SKILL.md # gestao/skills/today/SETUP_MCPS.md # gestao/skills/today/SKILL.md # gestao/skills/today/prompts/execute.md # gestao/skills/today/templates/daily-report.md # gestao/skills/validate-component/SKILL.md # gestao/skills/worklog/SKILL.md # infraestrutura/.claude-plugin/plugin.json # infraestrutura/agents/backup-specialist.md # infraestrutura/agents/cwp-server-manager.md # infraestrutura/agents/easypanel-specialist.md # infraestrutura/agents/infrastructure-orchestrator.md # infraestrutura/agents/proxmox-specialist.md # infraestrutura/agents/security-compliance-specialist.md # infraestrutura/skills/authentik/SKILL.md # infraestrutura/skills/backup-strategies/SKILL.md # infraestrutura/skills/backup-strategies/references/scripts.md # infraestrutura/skills/cwp/SKILL.md # infraestrutura/skills/easypanel-api/SKILL.md # infraestrutura/skills/easypanel-cicd/SKILL.md # infraestrutura/skills/easypanel-deploy/SKILL.md # infraestrutura/skills/easypanel-init/SKILL.md # infraestrutura/skills/easypanel-monitor/SKILL.md # infraestrutura/skills/easypanel-rollback/SKILL.md # infraestrutura/skills/easypanel-troubleshoot/SKILL.md # infraestrutura/skills/easypanel-validate/SKILL.md # infraestrutura/skills/gateway-check/SKILL.md # infraestrutura/skills/infra-check/SKILL.md # infraestrutura/skills/mcp-dev/SKILL.md # infraestrutura/skills/mcp-dev/references/best-practices.md # infraestrutura/skills/mcp-dev/references/evaluation-guide.md # infraestrutura/skills/mcp-dev/references/templates.md # infraestrutura/skills/pbs-config/SKILL.md # infraestrutura/skills/proxmox-cluster/SKILL.md # infraestrutura/skills/proxmox-ha/SKILL.md # infraestrutura/skills/proxmox-setup/SKILL.md # infraestrutura/skills/security-audit/SKILL.md # infraestrutura/skills/security-check/SKILL.md # infraestrutura/skills/server-health/SKILL.md # infraestrutura/skills/vm-migration/SKILL.md # marketing/.claude-plugin/plugin.json # marketing/CHANGELOG.md # marketing/agents/content-manager.md # marketing/agents/copywriter.md # marketing/agents/marketing-planning-expert.md # marketing/agents/ppc-specialist.md # marketing/agents/seo-specialist.md # marketing/agents/social-media-manager.md # marketing/agents/video-production-specialist.md # marketing/agents/youtube-specialist.md # marketing/skills/ads/SKILL.md # marketing/skills/content-marketing-pt/SKILL.md # marketing/skills/lead-approach/SKILL.md # marketing/skills/marketing-strategy/SKILL.md # marketing/skills/seo-audit/SKILL.md # marketing/skills/seo-audit/references/ferramentas-api.md # marketing/skills/seo-audit/references/template-relatorio-auditoria.md # marketing/skills/seo-content-optimization/SKILL.md # marketing/skills/seo-content-optimization/references/structured-data.md # marketing/skills/seo-report/SKILL.md # marketing/skills/seo-report/references/implementacao-tecnica.md # marketing/skills/seo-report/references/template-relatorio.md # marketing/skills/social-media/SKILL.md # marketing/skills/trend-signal/SKILL.md # marketing/skills/video/SKILL.md # marketing/skills/video/rules/3d.md # marketing/skills/video/rules/animations.md # marketing/skills/video/rules/assets.md # marketing/skills/video/rules/audio.md # marketing/skills/video/rules/calculate-metadata.md # marketing/skills/video/rules/can-decode.md # marketing/skills/video/rules/charts.md # marketing/skills/video/rules/compositions.md # marketing/skills/video/rules/display-captions.md # marketing/skills/video/rules/extract-frames.md # marketing/skills/video/rules/fonts.md # marketing/skills/video/rules/get-audio-duration.md # marketing/skills/video/rules/get-video-dimensions.md # marketing/skills/video/rules/get-video-duration.md # marketing/skills/video/rules/gifs.md # marketing/skills/video/rules/images.md # marketing/skills/video/rules/import-srt-captions.md # marketing/skills/video/rules/lottie.md # marketing/skills/video/rules/maps.md # marketing/skills/video/rules/measuring-dom-nodes.md # marketing/skills/video/rules/measuring-text.md # marketing/skills/video/rules/parameters.md # marketing/skills/video/rules/sequencing.md # marketing/skills/video/rules/tailwind.md # marketing/skills/video/rules/text-animations.md # marketing/skills/video/rules/timing.md # marketing/skills/video/rules/transcribe-captions.md # marketing/skills/video/rules/transitions.md # marketing/skills/video/rules/trimming.md # marketing/skills/video/rules/videos.md # marketing/skills/youtube/SKILL.md # metabase/agents/metabase-analyst.md # metabase/skills/dashboard/SKILL.md # metabase/skills/metabase/SKILL.md # metabase/skills/query/SKILL.md # negocio/agents/ecommerce-architect.md # negocio/agents/finance-manager.md # negocio/agents/research-analyst.md # negocio/agents/saas-architect.md # negocio/skills/ecommerce/SKILL.md # negocio/skills/interview/SKILL.md # negocio/skills/product/SKILL.md # negocio/skills/research/SKILL.md # negocio/skills/saas/SKILL.md # perfex-dev/agents/perfex-crm-module-developer.md # perfex-dev/skills/perfex-controllers/SKILL.md # perfex-dev/skills/perfex-database/SKILL.md # perfex-dev/skills/perfex-forms/SKILL.md # perfex-dev/skills/perfex-hooks/SKILL.md # perfex-dev/skills/perfex-menus/SKILL.md # perfex-dev/skills/perfex-migrations/SKILL.md # perfex-dev/skills/perfex-module-basics/SKILL.md # perfex-dev/skills/perfex-permissions/SKILL.md # perfex-dev/skills/perfex-security/SKILL.md # perfex-dev/skills/perfex-views/SKILL.md # project-manager/.claude-plugin/plugin.json # project-manager/agents/scrum-master.md # project-manager/agents/spec-writer.md # project-manager/hooks/spec-gate.sh # project-manager/skills/brainstorm/SKILL.md # project-manager/skills/discover/SKILL.md # project-manager/skills/scope/SKILL.md # project-manager/skills/spec/SKILL.md # project-manager/skills/sprint/SKILL.md # project-manager/skills/status/SKILL.md # wordpress/.claude-plugin/plugin.json # wordpress/agents/elementor-specialist.md # wordpress/agents/woocommerce-specialist.md # wordpress/agents/wordpress-performance-specialist.md # wordpress/agents/wordpress-plugin-developer.md # wordpress/skills/branda-menu/SKILL.md # wordpress/skills/crocoblock/SKILL.md # wordpress/skills/elementor/SKILL.md # wordpress/skills/jetengine/SKILL.md # wordpress/skills/rank-math/SKILL.md # wordpress/skills/rank-math/references/commands.md # wordpress/skills/seo-post/SKILL.md # wordpress/skills/woocommerce-cli/SKILL.md # wordpress/skills/woocommerce/SKILL.md # wordpress/skills/wp-cli/SKILL.md # wordpress/skills/wp-cli/references/commands.md # wordpress/skills/wp-cli/scripts/wp-auto.sh # wordpress/skills/wp-dev/SKILL.md # wordpress/skills/wp-hardening/SKILL.md # wordpress/skills/wp-performance/SKILL.md # wordpress/skills/wp-translate/SKILL.md # wordpress/skills/wp-update/SKILL.md
This commit is contained in:
@@ -7,6 +7,8 @@ model: sonnet
|
||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||
|
||||
# Dependencies
|
||||
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube
|
||||
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar.
|
||||
primary_mcps:
|
||||
- desk-crm-v3
|
||||
- ssh-unified
|
||||
@@ -43,7 +45,6 @@ collaborates_with:
|
||||
created: "2025-01-13"
|
||||
updated: "2026-02-04"
|
||||
author: "Descomplicar®"
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Database Design Specialist Descomplicar
|
||||
@@ -145,12 +146,12 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
||||
- **n8n** - Workflows automation
|
||||
- **filesystem** - Ficheiros locais
|
||||
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
||||
- **mem0** - Memória longo prazo
|
||||
- **mem0** - Mem0 (Tier 2, `mcp__mem0__*`) + IJFW (Tier 1, automático via hooks)
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **puppeteer** - Browser automation
|
||||
|
||||
### All Available (32 total)
|
||||
moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
@@ -160,4 +161,66 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
||||
✓ **/wp-dev** - Desenvolvimento WordPress especializado - plugins, temas, WooCommerce. Usar para
|
||||
- Invoke: `/wp-dev`
|
||||
|
||||
✓ **/php-dev** -
|
||||
✓ **/php-dev** - Desenvolvimento PHP fullstack - Laravel, Symfony, APIs RESTful, arquitectura bac
|
||||
- Invoke: `/php-dev`
|
||||
|
||||
✓ **/db-design** - Design de bases de dados - schema, optimização queries, MySQL/PostgreSQL, arquit
|
||||
- Invoke: `/db-design`
|
||||
|
||||
✓ **/mcp-dev** - Desenvolvimento de servidores MCP - criar, configurar, testar e documentar MCPs
|
||||
- Invoke: `/mcp-dev`
|
||||
|
||||
### Recommended for dev
|
||||
- **/react-patterns** - Padrões React modernos - Hooks, Server Components, State Man
|
||||
- **/nextjs** - Desenvolvimento Next.js moderno com App Router, Server Compo
|
||||
- **/elementor** - Desenvolvimento avançado com Elementor Pro e Crocoblock - wi
|
||||
- **/woocommerce** - Desenvolvimento e optimização de lojas WooCommerce - checkou
|
||||
- **/crm-admin** - Administração e desenvolvimento Perfex CRM - gestão dados, m
|
||||
- **/video** - Criar vídeos programáticos com Remotion e React. Gera intros
|
||||
- **/doc-sync** - Sincronização automática de documentação Stack/Vault. Garant
|
||||
- **/delegate** - Delegar tarefas dev para outros chats Claude com workflow co
|
||||
- **/time** - Time tracking integrado com Desk CRM. Inicia e para timers e
|
||||
|
||||
### Core Skills (All Agents)
|
||||
- **/reflect** - Auto-reflexão e melhoria contínua do sistema. Analisa sessõe
|
||||
- **/worklog** - Registo automático de trabalho - tarefas, problemas, soluçõe
|
||||
- **/_core** - Padrões fundamentais Descomplicar® - Sacred Rules, Excellenc
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||
|
||||
### All Available (53 total)
|
||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **5 SDKs** (TaskForce teams):
|
||||
|
||||
### TaskForce Bases de Dados
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
### TaskForce Claude Agents
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
**Your responsibilities in this TaskForce:**
|
||||
### TaskForce DeskDev
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
### TaskForce Gestão Administrativa e Financeira
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
### TaskForce SaaS
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
**Collaboration:**
|
||||
- Work with other agents in your TaskForce teams
|
||||
- Share knowledge and context across team members
|
||||
- Leverage team-specific skills and MCPs
|
||||
- Contribute to team goals and deliverables
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ model: sonnet
|
||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||
|
||||
# Dependencies
|
||||
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube
|
||||
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar.
|
||||
primary_mcps:
|
||||
- desk-crm-v3
|
||||
- gitea
|
||||
@@ -47,7 +49,6 @@ escalates_to:
|
||||
created: "2025-01-13"
|
||||
updated: "2026-02-14"
|
||||
author: "Descomplicar®"
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Dev Helper Descomplicar
|
||||
@@ -185,4 +186,119 @@ OBRIGATÓRIO antes de git commit:
|
||||
5. Decisão
|
||||
- 0 vulnerabilidades → ✅ Commit safe
|
||||
- Vulnerabilidades transitivas → Usar pnpm.overrides
|
||||
- Vulnerabilidades críticas → Corrigir o
|
||||
- Vulnerabilidades críticas → Corrigir ou invocar /dep-audit
|
||||
|
||||
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 |
|
||||
|-----------|-----------|----------------------|
|
||||
| **S**ingle Responsibility | Uma classe/função = uma responsabilidade | Classe User que envia emails |
|
||||
| **O**pen/Closed | Aberto extensão, fechado modificação | Modificar código existente para adicionar feature |
|
||||
| **L**iskov Substitution | Subclasses devem ser substituíveis | Override que muda comportamento drasticamente |
|
||||
| **I**nterface Segregation | Interfaces específicas > interfaces gerais | Interface com métodos não usados |
|
||||
| **D**ependency Inversion | Depender de abstracções | Instanciar dependências directamente |
|
||||
|
||||
## Code Smells Comuns
|
||||
|
||||
- **Duplicação**: Copy-paste code → Extrair função/classe
|
||||
- **Função Longa**: >20 linhas → Quebrar em funções menores
|
||||
- **Classe Grande**: Muitas responsabilidades → Separar em classes
|
||||
- **Lista Parâmetros**: >3 parâmetros → Usar objecto config
|
||||
- **Nomes Vagos**: `data`, `temp`, `x` → Nomes descritivos
|
||||
- **Comentários Excessivos**: Código deve ser auto-explicativo
|
||||
|
||||
## 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"
|
||||
```
|
||||
|
||||
## Your Available MCPs
|
||||
|
||||
### Recommended for dev
|
||||
- **ssh-unified** - SSH, SFTP, servidor management
|
||||
- **gitea** - Repositórios Git, issues, PRs
|
||||
- **context7** - Context documentation
|
||||
- **n8n** - Workflows automation
|
||||
- **filesystem** - Ficheiros locais
|
||||
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
||||
- **** - Knowledge base AI
|
||||
- **mem0** - Mem0 (Tier 2, `mcp__mem0__*`) + IJFW (Tier 1, automático via hooks)
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **puppeteer** - Browser automation
|
||||
|
||||
### All Available (32 total)
|
||||
desk-crm-v3, moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
✓ **/wp-dev** - Desenvolvimento WordPress especializado - plugins, temas, WooCommerce. Usar para
|
||||
- Invoke: `/wp-dev`
|
||||
|
||||
✓ **/php-dev** - Desenvolvimento PHP fullstack - Laravel, Symfony, APIs RESTful, arquitectura bac
|
||||
- Invoke: `/php-dev`
|
||||
|
||||
✓ **/db-design** - Design de bases de dados - schema, optimização queries, MySQL/PostgreSQL, arquit
|
||||
- Invoke: `/db-design`
|
||||
|
||||
✓ **/mcp-dev** - Desenvolvimento de servidores MCP - criar, configurar, testar e documentar MCPs
|
||||
- Invoke: `/mcp-dev`
|
||||
|
||||
### Recommended for dev
|
||||
- **/react-patterns** - Padrões React modernos - Hooks, Server Components, State Man
|
||||
- **/nextjs** - Desenvolvimento Next.js moderno com App Router, Server Compo
|
||||
- **/elementor** - Desenvolvimento avançado com Elementor Pro e Crocoblock - wi
|
||||
- **/woocommerce** - Desenvolvimento e optimização de lojas WooCommerce - checkou
|
||||
- **/crm-admin** - Administração e desenvolvimento Perfex CRM - gestão dados, m
|
||||
- **/video** - Criar vídeos programáticos com Remotion e React. Gera intros
|
||||
- **/doc-sync** - Sincronização automática de documentação Stack/Vault. Garant
|
||||
- **/delegate** - Delegar tarefas dev para outros chats Claude com workflow co
|
||||
- **/time** - Time tracking integrado com Desk CRM. Inicia e para timers e
|
||||
|
||||
### Core Skills (All Agents)
|
||||
- **/reflect** - Auto-reflexão e melhoria contínua do sistema. Analisa sessõe
|
||||
- **/worklog** - Registo automático de trabalho - tarefas, problemas, soluçõe
|
||||
- **/_core** - Padrões fundamentais Descomplicar® - Sacred Rules, Excellenc
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||
|
||||
### All Available (53 total)
|
||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
## Colaboração
|
||||
|
||||
- **Reports to**: Development Lead
|
||||
- **Colabora com**: Todos os development specialists, System Architects, Database Design Specialist, Security Compliance Specialist
|
||||
- **Escalar para**: Development Lead (decisões arquitectura complexas), Security Compliance Specialist (vulnerabilidades críticas)
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **1 TaskForce** (TaskForce teams):
|
||||
|
||||
### TaskForce Claude Agents
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
**Your responsibilities in this TaskForce:**
|
||||
**Collaboration:**
|
||||
- Work with other agents in your TaskForce teams
|
||||
- Share knowledge and context across team members
|
||||
- Leverage team-specific skills and MCPs
|
||||
- Contribute to team goals and deliverables
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ model: sonnet
|
||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||
|
||||
# Dependencies
|
||||
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube
|
||||
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar.
|
||||
primary_mcps:
|
||||
- desk-crm-v3
|
||||
- gitea
|
||||
@@ -44,7 +46,6 @@ collaborates_with:
|
||||
created: "2025-01-13"
|
||||
updated: "2026-02-04"
|
||||
author: "Descomplicar®"
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Development Lead Descomplicar
|
||||
@@ -144,7 +145,7 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
||||
|
||||
✓ **mem0** (system)
|
||||
- Memória longo prazo
|
||||
- Usage: `mcp__mem_*`
|
||||
- Usage: `mcp__mem0__*`
|
||||
|
||||
### Recommended for dev
|
||||
- **ssh-unified** - SSH, SFTP, servidor management
|
||||
@@ -156,10 +157,63 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
||||
- **puppeteer** - Browser automation
|
||||
|
||||
### All Available (32 total)
|
||||
moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Ski
|
||||
### Primary Skills (Your Domain)
|
||||
✓ **/wp-dev** - Desenvolvimento WordPress especializado - plugins, temas, WooCommerce. Usar para
|
||||
- Invoke: `/wp-dev`
|
||||
|
||||
✓ **/php-dev** - Desenvolvimento PHP fullstack - Laravel, Symfony, APIs RESTful, arquitectura bac
|
||||
- Invoke: `/php-dev`
|
||||
|
||||
✓ **/db-design** - Design de bases de dados - schema, optimização queries, MySQL/PostgreSQL, arquit
|
||||
- Invoke: `/db-design`
|
||||
|
||||
✓ **/mcp-dev** - Desenvolvimento de servidores MCP - criar, configurar, testar e documentar MCPs
|
||||
- Invoke: `/mcp-dev`
|
||||
|
||||
### Recommended for dev
|
||||
- **/react-patterns** - Padrões React modernos - Hooks, Server Components, State Man
|
||||
- **/nextjs** - Desenvolvimento Next.js moderno com App Router, Server Compo
|
||||
- **/elementor** - Desenvolvimento avançado com Elementor Pro e Crocoblock - wi
|
||||
- **/woocommerce** - Desenvolvimento e optimização de lojas WooCommerce - checkou
|
||||
- **/crm-admin** - Administração e desenvolvimento Perfex CRM - gestão dados, m
|
||||
- **/video** - Criar vídeos programáticos com Remotion e React. Gera intros
|
||||
- **/doc-sync** - Sincronização automática de documentação Stack/Vault. Garant
|
||||
- **/delegate** - Delegar tarefas dev para outros chats Claude com workflow co
|
||||
- **/time** - Time tracking integrado com Desk CRM. Inicia e para timers e
|
||||
|
||||
### Core Skills (All Agents)
|
||||
- **/reflect** - Auto-reflexão e melhoria contínua do sistema. Analisa sessõe
|
||||
- **/worklog** - Registo automático de trabalho - tarefas, problemas, soluçõe
|
||||
- **/_core** - Padrões fundamentais Descomplicar® - Sacred Rules, Excellenc
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||
|
||||
### All Available (53 total)
|
||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **2 SDKs** (TaskForce teams):
|
||||
|
||||
### TaskForce Product Manager
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
### TaskForce Segurança e Autenticação
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
**Collaboration:**
|
||||
- Work with other agents in your TaskForce teams
|
||||
- Share knowledge and context across team members
|
||||
- Leverage team-specific skills and MCPs
|
||||
- Contribute to team goals and deliverables
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@ model: sonnet
|
||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||
|
||||
# Dependencies
|
||||
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube
|
||||
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar.
|
||||
primary_mcps:
|
||||
- desk-crm-v3
|
||||
- gitea
|
||||
@@ -38,7 +40,6 @@ compliance:
|
||||
created: '2025-01-13'
|
||||
updated: '2026-02-04'
|
||||
author: Descomplicar®
|
||||
layer: wiki
|
||||
---
|
||||
# JavaScript Fullstack Specialist Descomplicar
|
||||
|
||||
@@ -134,7 +135,7 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
||||
|
||||
✓ **mem0** (system)
|
||||
- Memória longo prazo
|
||||
- Usage: `mcp__mem_*`
|
||||
- Usage: `mcp__mem0__*`
|
||||
|
||||
### Recommended for dev
|
||||
- **ssh-unified** - SSH, SFTP, servidor management
|
||||
@@ -146,7 +147,7 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
||||
- **puppeteer** - Browser automation
|
||||
|
||||
### All Available (32 total)
|
||||
moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
@@ -156,4 +157,74 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
||||
✓ **/wp-dev** - Desenvolvimento WordPress especializado - plugins, temas, WooCommerce. Usar para
|
||||
- Invoke: `/wp-dev`
|
||||
|
||||
✓ **/php-dev** - Desenvolvimento PHP fullstack - L
|
||||
✓ **/php-dev** - Desenvolvimento PHP fullstack - Laravel, Symfony, APIs RESTful, arquitectura bac
|
||||
- Invoke: `/php-dev`
|
||||
|
||||
✓ **/db-design** - Design de bases de dados - schema, optimização queries, MySQL/PostgreSQL, arquit
|
||||
- Invoke: `/db-design`
|
||||
|
||||
✓ **/mcp-dev** - Desenvolvimento de servidores MCP - criar, configurar, testar e documentar MCPs
|
||||
- Invoke: `/mcp-dev`
|
||||
|
||||
### Recommended for dev
|
||||
- **/react-patterns** - Padrões React modernos - Hooks, Server Components, State Man
|
||||
- **/nextjs** - Desenvolvimento Next.js moderno com App Router, Server Compo
|
||||
- **/elementor** - Desenvolvimento avançado com Elementor Pro e Crocoblock - wi
|
||||
- **/woocommerce** - Desenvolvimento e optimização de lojas WooCommerce - checkou
|
||||
- **/crm-admin** - Administração e desenvolvimento Perfex CRM - gestão dados, m
|
||||
- **/video** - Criar vídeos programáticos com Remotion e React. Gera intros
|
||||
- **/doc-sync** - Sincronização automática de documentação Stack/Vault. Garant
|
||||
- **/delegate** - Delegar tarefas dev para outros chats Claude com workflow co
|
||||
- **/time** - Time tracking integrado com Desk CRM. Inicia e para timers e
|
||||
|
||||
### Core Skills (All Agents)
|
||||
- **/reflect** - Auto-reflexão e melhoria contínua do sistema. Analisa sessõe
|
||||
- **/worklog** - Registo automático de trabalho - tarefas, problemas, soluçõe
|
||||
- **/_core** - Padrões fundamentais Descomplicar® - Sacred Rules, Excellenc
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||
|
||||
### All Available (53 total)
|
||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **6 SDKs** (TaskForce teams):
|
||||
|
||||
### TaskForce Bases de Dados
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
### TaskForce Claude Agents
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
**Your responsibilities in this TaskForce:**
|
||||
### TaskForce Dashboard
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
**Your responsibilities in this TaskForce:**
|
||||
|
||||
- **TaskForce interno para criar dashboards profissionais rapidamente. Design system Descomplicar com glassmorphism, bento grid e animações Framer Motion.**: NULL
|
||||
|
||||
### TaskForce Next.js
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
### TaskForce React
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
### TaskForce SaaS
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
**Collaboration:**
|
||||
- Work with other agents in your TaskForce teams
|
||||
- Share knowledge and context across team members
|
||||
- Leverage team-specific skills and MCPs
|
||||
- Contribute to team goals and deliverables
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ model: sonnet
|
||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||
|
||||
# Dependencies
|
||||
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube
|
||||
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar.
|
||||
primary_mcps:
|
||||
- desk-crm-v3
|
||||
- gitea
|
||||
@@ -43,7 +45,6 @@ collaborates_with:
|
||||
created: "2025-01-13"
|
||||
updated: "2026-02-04"
|
||||
author: "Descomplicar®"
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Next.js Specialist
|
||||
@@ -176,4 +177,56 @@ Especialista em desenvolvimento Next.js moderno com App Router, React Server Com
|
||||
|
||||
### Recommended for dev
|
||||
- **ssh-unified** - SSH, SFTP, servidor management
|
||||
- **gitea** - Repositórios Git, issues, P
|
||||
- **gitea** - Repositórios Git, issues, PRs
|
||||
- **context7** - Context documentation
|
||||
- **n8n** - Workflows automation
|
||||
- **filesystem** - Ficheiros locais
|
||||
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
||||
- **** - Knowledge base AI
|
||||
- **mem0** - Mem0 (Tier 2, `mcp__mem0__*`) + IJFW (Tier 1, automático via hooks)
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **puppeteer** - Browser automation
|
||||
|
||||
### All Available (32 total)
|
||||
desk-crm-v3, moloni, google-analytics, google-workspace, imap, outline-api, youtube-research, youtube-uploader, gsc, lighthouse, mcp-time, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, vimeo, design-systems, replicate
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
✓ **/wp-dev** - Desenvolvimento WordPress especializado - plugins, temas, WooCommerce. Usar para
|
||||
- Invoke: `/wp-dev`
|
||||
|
||||
✓ **/php-dev** - Desenvolvimento PHP fullstack - Laravel, Symfony, APIs RESTful, arquitectura bac
|
||||
- Invoke: `/php-dev`
|
||||
|
||||
✓ **/db-design** - Design de bases de dados - schema, optimização queries, MySQL/PostgreSQL, arquit
|
||||
- Invoke: `/db-design`
|
||||
|
||||
✓ **/mcp-dev** - Desenvolvimento de servidores MCP - criar, configurar, testar e documentar MCPs
|
||||
- Invoke: `/mcp-dev`
|
||||
|
||||
### Recommended for dev
|
||||
- **/react-patterns** - Padrões React modernos - Hooks, Server Components, State Man
|
||||
- **/nextjs** - Desenvolvimento Next.js moderno com App Router, Server Compo
|
||||
- **/elementor** - Desenvolvimento avançado com Elementor Pro e Crocoblock - wi
|
||||
- **/woocommerce** - Desenvolvimento e optimização de lojas WooCommerce - checkou
|
||||
- **/crm-admin** - Administração e desenvolvimento Perfex CRM - gestão dados, m
|
||||
- **/video** - Criar vídeos programáticos com Remotion e React. Gera intros
|
||||
- **/doc-sync** - Sincronização automática de documentação Stack/Vault. Garant
|
||||
- **/delegate** - Delegar tarefas dev para outros chats Claude com workflow co
|
||||
- **/time** - Time tracking integrado com Desk CRM. Inicia e para timers e
|
||||
|
||||
### Core Skills (All Agents)
|
||||
- **/reflect** - Auto-reflexão e melhoria contínua do sistema. Analisa sessõe
|
||||
- **/worklog** - Registo automático de trabalho - tarefas, problemas, soluçõe
|
||||
- **/_core** - Padrões fundamentais Descomplicar® - Sacred Rules, Excellenc
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||
|
||||
### All Available (53 total)
|
||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
@@ -18,6 +18,8 @@ user_invocable: true
|
||||
tier: 1
|
||||
|
||||
# Dependencies
|
||||
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube
|
||||
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar.
|
||||
primary_mcps:
|
||||
- desk-crm-v3 # Business operations
|
||||
- gitea # Version control
|
||||
@@ -27,7 +29,7 @@ recommended_mcps:
|
||||
- n8n # Workflow automation
|
||||
- filesystem # Local file operations
|
||||
- magic # UI component generation
|
||||
- mem0 # Long-term memory
|
||||
- mem0 # Memória longo prazo (Tier 2) via Mem0
|
||||
- cwp # Server management
|
||||
- puppeteer # Browser automation
|
||||
|
||||
@@ -81,7 +83,6 @@ collaborations:
|
||||
created: 2026-02-04
|
||||
last_updated: 2026-02-04
|
||||
quality_score: 85
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# PHP Fullstack Engineer Descomplicar
|
||||
@@ -146,4 +147,7 @@ Especialista senior em desenvolvimento PHP fullstack com expertise em frameworks
|
||||
### Workflow 3: Performance Optimization
|
||||
1. Audit queries (Query Monitor, Debug Bar)
|
||||
2. Implement caching (Redis/Memcached)
|
||||
3. Lazy loading e eager lo
|
||||
3. Lazy loading e eager loading (N+1)
|
||||
4. Queue jobs pesados (Laravel Queue)
|
||||
5. CDN para assets
|
||||
6. Profiling com Xdebug/Blackfire
|
||||
|
||||
@@ -4,7 +4,6 @@ description: >
|
||||
Mede Core Web Vitals e performance antes/depois de alterações. Detecta regressões.
|
||||
Usar antes e depois de qualquer alteração a WP, WooCommerce, Next.js ou infra.
|
||||
Baseado no gstack /benchmark. Eixo 2B.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# /benchmark — Performance Antes/Depois
|
||||
|
||||
@@ -4,7 +4,6 @@ description: >
|
||||
Monitorização pós-deploy — detecta regressões em produção. Verifica que o deploy
|
||||
não quebrou nada crítico nos 15min seguintes. Baseado no gstack /canary. Eixo 2B.
|
||||
Usar após qualquer deploy em produção.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# /canary — Monitorização Pós-Deploy
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
name: chrome
|
||||
description: Integração com Chrome para automação browser — navegar páginas, preencher formulários, debug de consola, extracção de dados, testes e screenshots.
|
||||
allowed-tools: Bash, Read, Write, Glob
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# /chrome - Chrome Browser Integration
|
||||
@@ -155,4 +154,162 @@ crm.example.com, clica "Adicionar Contacto" e preenche nome, email e telefone.
|
||||
### Escrever em Google Docs
|
||||
```
|
||||
Escreve um resumo do projecto baseado nos commits recentes
|
||||
no Google D
|
||||
no Google Doc docs.google.com/document/d/abc123
|
||||
```
|
||||
|
||||
### Extrair dados de paginas
|
||||
```
|
||||
Vai a pagina de produtos e extrai nome, preco e disponibilidade
|
||||
de cada item. Guarda como CSV.
|
||||
```
|
||||
|
||||
### Workflow multi-site
|
||||
```
|
||||
Verifica o meu calendario para reunioes amanha, depois para cada
|
||||
reuniao com participante externo, pesquisa o site da empresa.
|
||||
```
|
||||
|
||||
### Gravar demo GIF (Chrome extensao)
|
||||
```
|
||||
Grava um GIF mostrando o fluxo de checkout, desde adicionar item
|
||||
ao carrinho ate a pagina de confirmacao.
|
||||
```
|
||||
|
||||
### Performance audit (DevTools MCP)
|
||||
```
|
||||
Abre a pagina example.com, grava um performance trace durante 5 segundos
|
||||
e analisa LCP, TBT e CLS. Sugere melhorias.
|
||||
```
|
||||
|
||||
### 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 + GIF? -> **Chrome Extensao**
|
||||
- Debug/performance/network? -> **DevTools MCP**
|
||||
- Automacao headless CI/CD? -> **Puppeteer MCP**
|
||||
- Apenas ler conteudo publico? -> **WebFetch**
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### 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
|
||||
4. `/chrome` -> "Reconnect extension"
|
||||
5. Reiniciar Chrome E Claude Code
|
||||
|
||||
### Browser nao responde
|
||||
1. Verificar se modal dialog esta a bloquear (alert/confirm/prompt)
|
||||
2. Dispensar dialog manualmente, depois continuar
|
||||
3. Pedir nova tab
|
||||
4. Desactivar/reactivar extensao em `chrome://extensions`
|
||||
|
||||
### Conexao cai em sessoes longas
|
||||
- Service worker do Chrome pode ficar idle
|
||||
- Solucao: `/chrome` -> "Reconnect extension"
|
||||
|
||||
### Erros comuns
|
||||
|
||||
| Erro | Causa | Solucao |
|
||||
|------|-------|---------|
|
||||
| "Browser extension is not connected" | Native host nao alcanca extensao | Reiniciar Chrome + Claude, `/chrome` reconnect |
|
||||
| "Extension not detected" | Extensao nao instalada/desactivada | Instalar/activar em `chrome://extensions` |
|
||||
| "No tab available" | Accao antes de tab pronta | Pedir nova tab e retry |
|
||||
| "Receiving end does not exist" | Service worker idle | `/chrome` -> "Reconnect extension" |
|
||||
|
||||
### Verificar instalacao
|
||||
```bash
|
||||
# Chrome instalado?
|
||||
google-chrome --version
|
||||
|
||||
# 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
|
||||
```
|
||||
|
||||
## Permissoes de Sites
|
||||
|
||||
Permissoes por site sao geridas na **extensao Chrome** (nao no Claude Code):
|
||||
- Abrir extensao Claude in Chrome -> Settings
|
||||
- Configurar quais sites podem ser acedidos
|
||||
- Bloqueios aplicam-se a todas as sessoes
|
||||
|
||||
## Nota de Performance
|
||||
|
||||
Activar Chrome por defeito **aumenta consumo de context window** porque as ferramentas browser ficam sempre carregadas. Se notar degradacao:
|
||||
1. Desactivar default: `/chrome` -> desactivar
|
||||
2. Usar `claude --chrome` apenas quando necessario
|
||||
3. Preferir WebFetch para leituras simples de paginas publicas
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: db-design
|
||||
description: Design e optimização de schemas de base de dados — normalização, índices, planos de migração e particionamento.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Database Design Specialist
|
||||
@@ -20,8 +19,8 @@ Skill para design e optimização de bases de dados seguindo padrões Descomplic
|
||||
|
||||
### 1. Pesquisa Inicial
|
||||
```
|
||||
mcp__mem_search_memories "database [projecto]"
|
||||
mcp__wikijs__search_pages "database schema [sistema]"
|
||||
mcp__mem0__search_memories "database [projecto]"
|
||||
/knowledge (router Hub QR/PROC) + mcp__mem0__search_memories "database schema [sistema]"
|
||||
```
|
||||
|
||||
### 2. Verificar Schema Existente
|
||||
@@ -189,4 +188,68 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data
|
||||
### Como Consultar
|
||||
|
||||
```javascript
|
||||
// Pesquisar optimiza
|
||||
// Pesquisar optimização MySQL
|
||||
mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "7f63ec0c-6321-488c-b107-980140199850",
|
||||
query: "mysql index optimization slow query"
|
||||
})
|
||||
|
||||
// Padrões de design de bases de dados
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "e7c7decc-0ded-4351-ab14-b110b3c38ec9",
|
||||
query: "database schema design patterns"
|
||||
})
|
||||
|
||||
// RDS e bases de dados AWS
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "cc7f000a-ad86-49b6-b59b-179e65f8a229",
|
||||
query: "RDS aurora postgresql"
|
||||
})
|
||||
```
|
||||
|
||||
### Quando Consultar
|
||||
|
||||
- Antes de desenhar novo schema
|
||||
- Ao optimizar queries lentas
|
||||
- Para escolher tipo de índice adequado
|
||||
- Decidir entre MySQL/PostgreSQL
|
||||
- Configurar bases de dados em cloud
|
||||
|
||||
---
|
||||
**Versão**: 1.0.0 | **Autor**: Descomplicar®
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Quando NÃO Usar
|
||||
|
||||
- Para tarefas fora do domínio de especialização desta skill
|
||||
- Quando outra skill mais específica está disponível
|
||||
- Para operações que requerem confirmação manual do utilizador
|
||||
|
||||
|
||||
## Exemplos
|
||||
|
||||
### Exemplo 1: Uso Básico
|
||||
```
|
||||
Input: [descrição da tarefa]
|
||||
Output: [resultado esperado]
|
||||
```
|
||||
|
||||
### Exemplo 2: Uso Avançado
|
||||
```
|
||||
Input: [caso complexo]
|
||||
Output: [resultado detalhado]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
name: dep-audit
|
||||
description: Auditoria de dependencias para projectos Node.js e PHP — vulnerabilidades, pacotes desactualizados, seguranca de ambiente e verificacao de tipos. Obrigatoria antes de commits.
|
||||
disable-model-invocation: true
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# /dep-audit - Dependency Security Audit Pre-Commit
|
||||
@@ -211,4 +210,266 @@ Mitigation: [explanation]
|
||||
Fix critical/high vulnerabilities first. See PROC-DEV-SEC-001 for guidance.
|
||||
```
|
||||
|
||||
### 8. Criar F
|
||||
### 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 ...
|
||||
/dep-audit # 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 | /dep-audit + 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.1** | 12-03-2026 | Descomplicar® | Renomeado de /security-check para /dep-audit
|
||||
**Security First** - Zero vulnerabilities ou documentadas
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -5,7 +5,6 @@ description: "Gera diagramas de arquitectura, fluxo, ER e sequência em três fo
|
||||
version: "1.0.0"
|
||||
created: 2026-04-04
|
||||
tools: [mcp__claude_ai_Excalidraw__export_to_excalidraw, mcp__mcp-mermaid__generate, Write, Bash]
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Skill: /diagrama
|
||||
@@ -150,4 +149,119 @@ Usar o MCP `mcp__claude_ai_Excalidraw__export_to_excalidraw` para diagramas no e
|
||||
|
||||
## Geração Mermaid
|
||||
|
||||
Usar o MCP `mcp__mcp-mermaid__generate`
|
||||
Usar o MCP `mcp__mcp-mermaid__generate` para diagramas como código.
|
||||
|
||||
### Tipos suportados
|
||||
|
||||
**Fluxograma:**
|
||||
```
|
||||
flowchart TD
|
||||
A[Início] --> B{Condição}
|
||||
B -->|Sim| C[Acção]
|
||||
B -->|Não| D[Fim]
|
||||
```
|
||||
|
||||
**Sequência:**
|
||||
```
|
||||
sequenceDiagram
|
||||
participant U as Utilizador
|
||||
participant A as Claude Code
|
||||
participant N as n8n
|
||||
U->>A: Pedido
|
||||
A->>N: Trigger workflow
|
||||
N-->>A: Resultado
|
||||
A-->>U: Resposta
|
||||
```
|
||||
|
||||
**ER:**
|
||||
```
|
||||
erDiagram
|
||||
CLIENTE ||--o{ PROJECTO : tem
|
||||
PROJECTO ||--o{ TAREFA : contém
|
||||
TAREFA {
|
||||
int id
|
||||
string nome
|
||||
string estado
|
||||
}
|
||||
```
|
||||
|
||||
**Arquitectura de componentes (C4):**
|
||||
```
|
||||
C4Context
|
||||
title Stack Descomplicar
|
||||
Person(eal, "Emanuel", "Utilizador principal")
|
||||
System(cc, "Claude Code", "Interface interactiva")
|
||||
System(clip, "Paperclip", "Agentes autónomos")
|
||||
System(n8n, "n8n", "Automação determinística")
|
||||
Rel(eal, cc, "usa directamente")
|
||||
Rel(cc, clip, "delega tarefas complexas")
|
||||
Rel(cc, n8n, "activa workflows")
|
||||
```
|
||||
|
||||
### Guardar output
|
||||
|
||||
Guardar o código Mermaid em `/media/ealmeida/Dados/Hub/tmp/diagramas/NOME.mmd` e renderizar para SVG/PNG via MCP.
|
||||
|
||||
---
|
||||
|
||||
## Templates prontos por contexto
|
||||
|
||||
### Arquitectura StackDescomplicar
|
||||
|
||||
Gerar diagrama com as três camadas do stack:
|
||||
- **Camada 1:** Claude Code (trabalho interactivo)
|
||||
- **Camada 2:** n8n (automação determinística)
|
||||
- **Camada 3:** Paperclip (raciocínio autónomo)
|
||||
|
||||
### Proposta comercial
|
||||
|
||||
Diagrama da solução para o cliente com:
|
||||
- Infra-estrutura actual (antes)
|
||||
- Solução proposta (depois)
|
||||
- Componentes e integrações
|
||||
|
||||
### Pipeline de dados
|
||||
|
||||
Diagrama de fluxo com:
|
||||
- Fonte → Processamento → Destino
|
||||
- Triggers, transformações, outputs
|
||||
|
||||
### Diagrama ER Desk CRM
|
||||
|
||||
Entidades principais: Lead → Customer → Estimate → Invoice → Payment
|
||||
|
||||
---
|
||||
|
||||
## Boas práticas
|
||||
|
||||
- **Máx. 10-15 elementos** por diagrama (mais → dividir em sub-diagramas)
|
||||
- **Labels curtos:** 2-4 palavras por elemento
|
||||
- **Setas com label** quando o fluxo não é óbvio
|
||||
- **Cor consistente** por tipo de componente (seguir paleta Descomplicar)
|
||||
- **Nome descritivo** no ficheiro (não "diagrama1.drawio")
|
||||
- **Guardar em Hub/tmp/diagramas/** para fácil acesso
|
||||
|
||||
---
|
||||
|
||||
## Instalar draw.io MCP (opcional, para funcionalidades avançadas)
|
||||
|
||||
O vídeo #210 do Stack_Pesquisa_Videos.md demonstra um MCP draw.io com geração automática a partir de análise de código. Para instalar:
|
||||
|
||||
```bash
|
||||
# Verificar se há MCP draw.io disponível no gateway
|
||||
# Ver: Hub/04-Stack/claude-code-context-hygiene.md → secção MCPs
|
||||
```
|
||||
|
||||
Alternativa: usar draw.io via browser em https://app.diagrams.net (gratuito, sem instalação) e importar o `.drawio` gerado.
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: docx
|
||||
description: "Criação, edição e análise de documentos Word (.docx). Versão light para heartbeats."
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# DOCX — Referência Rápida
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: docx
|
||||
description: "Criacao, edicao e analise de documentos Word (.docx). Usar quando o utilizador mencionar \"Word\", \".docx\", ou pedir documentos profissionais com formatacao (indices, cabecalhos, numeracao de paginas, letterheads). Inclui extracao de conteudo, insercao/substituicao de imagens, find-and-replace, tracked changes, comentarios, e conversao de conteudo para Word. Aplica-se a relatorios, memorandos, cartas, templates e propostas em formato .docx. NAO usar para PDFs, folhas de calculo, Google Docs, ou tarefas de codigo nao relacionadas."
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Criacao, edicao e analise de documentos DOCX
|
||||
@@ -142,4 +141,384 @@ const doc = new Document({
|
||||
```javascript
|
||||
// ERRADO - nunca inserir caracteres de bullet manualmente
|
||||
new Paragraph({ children: [new TextRun("* Item")] }) // MAU
|
||||
new Paragraph({ children: [new TextRun("\u2022 Item")]
|
||||
new Paragraph({ children: [new TextRun("\u2022 Item")] }) // MAU
|
||||
|
||||
// CORRECTO - usar config numbering com LevelFormat.BULLET
|
||||
const doc = new Document({
|
||||
numbering: {
|
||||
config: [
|
||||
{ reference: "bullets",
|
||||
levels: [{ level: 0, format: LevelFormat.BULLET, text: "\u2022", alignment: AlignmentType.LEFT,
|
||||
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
|
||||
{ reference: "numbers",
|
||||
levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
|
||||
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
|
||||
]
|
||||
},
|
||||
sections: [{
|
||||
children: [
|
||||
new Paragraph({ numbering: { reference: "bullets", level: 0 },
|
||||
children: [new TextRun("Item com bullet")] }),
|
||||
new Paragraph({ numbering: { reference: "numbers", level: 0 },
|
||||
children: [new TextRun("Item numerado")] }),
|
||||
]
|
||||
}]
|
||||
});
|
||||
|
||||
// ATENCAO: Cada reference cria numeracao INDEPENDENTE
|
||||
// Mesma reference = continua (1,2,3 depois 4,5,6)
|
||||
// Reference diferente = reinicia (1,2,3 depois 1,2,3)
|
||||
```
|
||||
|
||||
### Tabelas
|
||||
|
||||
**CRITICO: Tabelas precisam de larguras duplas** - definir tanto `columnWidths` na tabela COMO `width` em cada celula. Sem ambos, tabelas renderizam incorrectamente em algumas plataformas.
|
||||
|
||||
```javascript
|
||||
// CRITICO: Definir sempre largura da tabela para renderizacao consistente
|
||||
// CRITICO: Usar ShadingType.CLEAR (nao SOLID) para evitar fundos pretos
|
||||
const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
|
||||
const borders = { top: border, bottom: border, left: border, right: border };
|
||||
|
||||
new Table({
|
||||
width: { size: 9026, type: WidthType.DXA }, // Sempre usar DXA (percentagens quebram no Google Docs)
|
||||
columnWidths: [4513, 4513], // Deve somar a largura da tabela (DXA: 1440 = 1 polegada)
|
||||
rows: [
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
borders,
|
||||
width: { size: 4513, type: WidthType.DXA }, // Tambem definir em cada celula
|
||||
shading: { fill: "D5E8F0", type: ShadingType.CLEAR }, // CLEAR e nao SOLID
|
||||
margins: { top: 80, bottom: 80, left: 120, right: 120 }, // Padding da celula (interno, nao adicionado a largura)
|
||||
children: [new Paragraph({ children: [new TextRun("Celula")] })]
|
||||
})
|
||||
]
|
||||
})
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
**Calculo de largura da tabela:**
|
||||
|
||||
Usar sempre `WidthType.DXA` — `WidthType.PERCENTAGE` quebra no Google Docs.
|
||||
|
||||
```javascript
|
||||
// Largura da tabela = soma de columnWidths = largura do conteudo
|
||||
// A4 com margens de 1": 11906 - 2880 = 9026 DXA
|
||||
width: { size: 9026, type: WidthType.DXA },
|
||||
columnWidths: [7000, 2026] // Deve somar a largura da tabela
|
||||
```
|
||||
|
||||
**Regras de largura:**
|
||||
- **Usar sempre `WidthType.DXA`** — nunca `WidthType.PERCENTAGE` (incompativel com Google Docs)
|
||||
- Largura da tabela deve igualar a soma de `columnWidths`
|
||||
- `width` da celula deve corresponder ao respectivo `columnWidth`
|
||||
- `margins` da celula sao padding interno - reduzem a area de conteudo, nao adicionam a largura
|
||||
- Para tabelas full-width: usar largura de conteudo (largura pagina menos margens esquerda e direita)
|
||||
|
||||
### Imagens
|
||||
|
||||
```javascript
|
||||
// CRITICO: parametro type e OBRIGATORIO
|
||||
new Paragraph({
|
||||
children: [new ImageRun({
|
||||
type: "png", // Obrigatorio: png, jpg, jpeg, gif, bmp, svg
|
||||
data: fs.readFileSync("image.png"),
|
||||
transformation: { width: 200, height: 150 },
|
||||
altText: { title: "Titulo", description: "Desc", name: "Nome" } // Os tres sao obrigatorios
|
||||
})]
|
||||
})
|
||||
```
|
||||
|
||||
### Quebras de pagina
|
||||
|
||||
```javascript
|
||||
// CRITICO: PageBreak deve estar dentro de um Paragraph
|
||||
new Paragraph({ children: [new PageBreak()] })
|
||||
|
||||
// Ou usar pageBreakBefore
|
||||
new Paragraph({ pageBreakBefore: true, children: [new TextRun("Nova pagina")] })
|
||||
```
|
||||
|
||||
### Indice (Table of Contents)
|
||||
|
||||
```javascript
|
||||
// CRITICO: Headings devem usar HeadingLevel APENAS - sem estilos custom
|
||||
new TableOfContents("Indice", { hyperlink: true, headingStyleRange: "1-3" })
|
||||
```
|
||||
|
||||
### Cabecalhos/Rodapes
|
||||
|
||||
```javascript
|
||||
sections: [{
|
||||
properties: {
|
||||
page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } // 1440 = 1 polegada
|
||||
},
|
||||
headers: {
|
||||
default: new Header({ children: [new Paragraph({ children: [new TextRun("Cabecalho")] })] })
|
||||
},
|
||||
footers: {
|
||||
default: new Footer({ children: [new Paragraph({
|
||||
children: [new TextRun("Pagina "), new TextRun({ children: [PageNumber.CURRENT] })]
|
||||
})] })
|
||||
},
|
||||
children: [/* conteudo */]
|
||||
}]
|
||||
```
|
||||
|
||||
### Regras criticas para docx-js
|
||||
|
||||
- **Definir tamanho de pagina explicitamente** - docx-js assume A4; para documentos PT/EU, A4 (11906 x 16838 DXA) e o padrao correcto
|
||||
- **Paisagem: passar dimensoes retrato** - docx-js troca largura/altura internamente; passar lado curto como `width`, lado longo como `height`, e definir `orientation: PageOrientation.LANDSCAPE`
|
||||
- **Nunca usar `\n`** - usar elementos Paragraph separados
|
||||
- **Nunca usar bullets unicode** - usar `LevelFormat.BULLET` com config numbering
|
||||
- **PageBreak deve estar em Paragraph** - standalone cria XML invalido
|
||||
- **ImageRun requer `type`** - especificar sempre png/jpg/etc
|
||||
- **Definir sempre `width` da tabela com DXA** - nunca usar `WidthType.PERCENTAGE` (quebra no Google Docs)
|
||||
- **Tabelas precisam de larguras duplas** - array `columnWidths` E `width` da celula, ambos devem corresponder
|
||||
- **Largura tabela = soma de columnWidths** - para DXA, garantir que somam exactamente
|
||||
- **Adicionar sempre margins nas celulas** - usar `margins: { top: 80, bottom: 80, left: 120, right: 120 }` para padding legivel
|
||||
- **Usar `ShadingType.CLEAR`** - nunca SOLID para shading de tabelas
|
||||
- **TOC requer HeadingLevel apenas** - sem estilos custom nos paragrafos de heading
|
||||
- **Override built-in styles** - usar IDs exactos: "Heading1", "Heading2", etc.
|
||||
- **Incluir `outlineLevel`** - necessario para TOC (0 para H1, 1 para H2, etc.)
|
||||
|
||||
---
|
||||
|
||||
## Editar documentos existentes
|
||||
|
||||
**Seguir os 3 passos por ordem.**
|
||||
|
||||
### Passo 1: Descompactar
|
||||
```bash
|
||||
python scripts/office/unpack.py document.docx unpacked/
|
||||
```
|
||||
Extrai XML, pretty-prints, funde runs adjacentes e converte smart quotes para entidades XML (`“` etc.) para sobreviverem a edicao. Usar `--merge-runs false` para saltar a fusao de runs.
|
||||
|
||||
### Passo 2: Editar XML
|
||||
|
||||
Editar ficheiros em `unpacked/word/`. Ver Referencia XML abaixo para padroes.
|
||||
|
||||
**Usar "Claude" como autor** para tracked changes e comentarios, salvo se o utilizador pedir outro nome.
|
||||
|
||||
**Usar a ferramenta Edit directamente para substituicao de strings. Nao escrever scripts Python.** Scripts introduzem complexidade desnecessaria. A ferramenta Edit mostra exactamente o que esta a ser substituido.
|
||||
|
||||
**CRITICO: Usar smart quotes para novo conteudo.** Ao adicionar texto com apostrofos ou aspas, usar entidades XML para produzir smart quotes:
|
||||
```xml
|
||||
<!-- Usar estas entidades para tipografia profissional -->
|
||||
<w:t>Here’s a quote: “Hello”</w:t>
|
||||
```
|
||||
| Entidade | Caractere |
|
||||
|----------|-----------|
|
||||
| `‘` | ' (aspas simples esquerda) |
|
||||
| `’` | ' (aspas simples direita / apostrofo) |
|
||||
| `“` | " (aspas duplas esquerda) |
|
||||
| `”` | " (aspas duplas direita) |
|
||||
|
||||
**Adicionar comentarios:** Usar `comment.py` para tratar boilerplate em multiplos ficheiros XML (texto deve ser XML pre-escaped):
|
||||
```bash
|
||||
python scripts/comment.py unpacked/ 0 "Texto do comentario com & e ’"
|
||||
python scripts/comment.py unpacked/ 1 "Texto de resposta" --parent 0 # resposta ao comentario 0
|
||||
python scripts/comment.py unpacked/ 0 "Texto" --author "Autor Custom" # nome de autor custom
|
||||
```
|
||||
Depois adicionar marcadores ao document.xml (ver Comentarios na Referencia XML).
|
||||
|
||||
### Passo 3: Recompactar
|
||||
```bash
|
||||
python scripts/office/pack.py unpacked/ output.docx --original document.docx
|
||||
```
|
||||
Valida com auto-reparacao, condensa XML e cria DOCX. Usar `--validate false` para saltar.
|
||||
|
||||
**Auto-reparacao corrige:**
|
||||
- `durableId` >= 0x7FFFFFFF (regenera ID valido)
|
||||
- `xml:space="preserve"` em falta em `<w:t>` com whitespace
|
||||
|
||||
**Auto-reparacao nao corrige:**
|
||||
- XML malformado, nesting de elementos invalido, relacoes em falta, violacoes de schema
|
||||
|
||||
### Erros comuns
|
||||
|
||||
- **Substituir elementos `<w:r>` inteiros**: Ao adicionar tracked changes, substituir o bloco `<w:r>...</w:r>` completo com `<w:del>...<w:ins>...` como siblings. Nao injectar tags de tracked change dentro de um run.
|
||||
- **Preservar formatacao `<w:rPr>`**: Copiar o bloco `<w:rPr>` do run original para os runs de tracked change para manter bold, tamanho de fonte, etc.
|
||||
|
||||
---
|
||||
|
||||
## Referencia XML
|
||||
|
||||
### Conformidade com schema
|
||||
|
||||
- **Ordem de elementos em `<w:pPr>`**: `<w:pStyle>`, `<w:numPr>`, `<w:spacing>`, `<w:ind>`, `<w:jc>`, `<w:rPr>` por ultimo
|
||||
- **Whitespace**: Adicionar `xml:space="preserve"` a `<w:t>` com espacos no inicio/fim
|
||||
- **RSIDs**: Devem ser hex de 8 digitos (ex: `00AB1234`)
|
||||
|
||||
### Tracked Changes
|
||||
|
||||
**Insercao:**
|
||||
```xml
|
||||
<w:ins w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
|
||||
<w:r><w:t>texto inserido</w:t></w:r>
|
||||
</w:ins>
|
||||
```
|
||||
|
||||
**Eliminacao:**
|
||||
```xml
|
||||
<w:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
|
||||
<w:r><w:delText>texto eliminado</w:delText></w:r>
|
||||
</w:del>
|
||||
```
|
||||
|
||||
**Dentro de `<w:del>`**: Usar `<w:delText>` em vez de `<w:t>`, e `<w:delInstrText>` em vez de `<w:instrText>`.
|
||||
|
||||
**Edicoes minimas** - marcar apenas o que muda:
|
||||
```xml
|
||||
<!-- Alterar "30 dias" para "60 dias" -->
|
||||
<w:r><w:t>O prazo e de </w:t></w:r>
|
||||
<w:del w:id="1" w:author="Claude" w:date="...">
|
||||
<w:r><w:delText>30</w:delText></w:r>
|
||||
</w:del>
|
||||
<w:ins w:id="2" w:author="Claude" w:date="...">
|
||||
<w:r><w:t>60</w:t></w:r>
|
||||
</w:ins>
|
||||
<w:r><w:t> dias.</w:t></w:r>
|
||||
```
|
||||
|
||||
**Eliminar paragrafos/itens de lista inteiros** - ao remover TODO o conteudo de um paragrafo, marcar tambem o paragraph mark como eliminado para fundir com o proximo paragrafo. Adicionar `<w:del/>` dentro de `<w:pPr><w:rPr>`:
|
||||
```xml
|
||||
<w:p>
|
||||
<w:pPr>
|
||||
<w:numPr>...</w:numPr> <!-- numeracao de lista se presente -->
|
||||
<w:rPr>
|
||||
<w:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z"/>
|
||||
</w:rPr>
|
||||
</w:pPr>
|
||||
<w:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
|
||||
<w:r><w:delText>Conteudo inteiro do paragrafo a ser eliminado...</w:delText></w:r>
|
||||
</w:del>
|
||||
</w:p>
|
||||
```
|
||||
Sem o `<w:del/>` em `<w:pPr><w:rPr>`, aceitar alteracoes deixa um paragrafo/item de lista vazio.
|
||||
|
||||
**Rejeitar insercao de outro autor** - aninhar eliminacao dentro da insercao:
|
||||
```xml
|
||||
<w:ins w:author="Maria" w:id="5">
|
||||
<w:del w:author="Claude" w:id="10">
|
||||
<w:r><w:delText>texto inserido por ela</w:delText></w:r>
|
||||
</w:del>
|
||||
</w:ins>
|
||||
```
|
||||
|
||||
**Restaurar eliminacao de outro autor** - adicionar insercao depois (nao modificar a eliminacao):
|
||||
```xml
|
||||
<w:del w:author="Maria" w:id="5">
|
||||
<w:r><w:delText>texto eliminado</w:delText></w:r>
|
||||
</w:del>
|
||||
<w:ins w:author="Claude" w:id="10">
|
||||
<w:r><w:t>texto eliminado</w:t></w:r>
|
||||
</w:ins>
|
||||
```
|
||||
|
||||
### Comentarios
|
||||
|
||||
Apos executar `comment.py` (ver Passo 2), adicionar marcadores ao document.xml. Para respostas, usar flag `--parent` e aninhar marcadores dentro dos do pai.
|
||||
|
||||
**CRITICO: `<w:commentRangeStart>` e `<w:commentRangeEnd>` sao siblings de `<w:r>`, nunca dentro de `<w:r>`.**
|
||||
|
||||
```xml
|
||||
<!-- Marcadores de comentario sao filhos directos de w:p, nunca dentro de w:r -->
|
||||
<w:commentRangeStart w:id="0"/>
|
||||
<w:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
|
||||
<w:r><w:delText>eliminado</w:delText></w:r>
|
||||
</w:del>
|
||||
<w:r><w:t> mais texto</w:t></w:r>
|
||||
<w:commentRangeEnd w:id="0"/>
|
||||
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="0"/></w:r>
|
||||
|
||||
<!-- Comentario 0 com resposta 1 aninhada dentro -->
|
||||
<w:commentRangeStart w:id="0"/>
|
||||
<w:commentRangeStart w:id="1"/>
|
||||
<w:r><w:t>texto</w:t></w:r>
|
||||
<w:commentRangeEnd w:id="1"/>
|
||||
<w:commentRangeEnd w:id="0"/>
|
||||
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="0"/></w:r>
|
||||
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="1"/></w:r>
|
||||
```
|
||||
|
||||
### Imagens
|
||||
|
||||
1. Adicionar ficheiro de imagem a `word/media/`
|
||||
2. Adicionar relacao a `word/_rels/document.xml.rels`:
|
||||
```xml
|
||||
<Relationship Id="rId5" Type=".../image" Target="media/image1.png"/>
|
||||
```
|
||||
3. Adicionar content type a `[Content_Types].xml`:
|
||||
```xml
|
||||
<Default Extension="png" ContentType="image/png"/>
|
||||
```
|
||||
4. Referenciar no document.xml:
|
||||
```xml
|
||||
<w:drawing>
|
||||
<wp:inline>
|
||||
<wp:extent cx="914400" cy="914400"/> <!-- EMUs: 914400 = 1 polegada -->
|
||||
<a:graphic>
|
||||
<a:graphicData uri=".../picture">
|
||||
<pic:pic>
|
||||
<pic:blipFill><a:blip r:embed="rId5"/></pic:blipFill>
|
||||
</pic:pic>
|
||||
</a:graphicData>
|
||||
</a:graphic>
|
||||
</wp:inline>
|
||||
</w:drawing>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependencias
|
||||
|
||||
- **pandoc**: Extracao de texto
|
||||
- **docx**: `npm install -g docx` (novos documentos)
|
||||
- **LibreOffice**: Conversao PDF (auto-configurado para ambientes sandbox via `scripts/office/soffice.py`)
|
||||
- **Poppler**: `pdftoppm` para imagens
|
||||
|
||||
---
|
||||
|
||||
## Integracao Descomplicar
|
||||
|
||||
### MCPs disponiveis
|
||||
|
||||
| MCP | Uso |
|
||||
|-----|-----|
|
||||
| `mcp__filesystem__*` | Ler/escrever ficheiros .docx locais, listar directorios |
|
||||
| `mcp__google-workspace__*` | Upload para Google Drive, conversao para Google Docs |
|
||||
| `mcp__ssh-unified__*` | Operacoes em ficheiros .docx em servidores remotos |
|
||||
|
||||
### Workflow tipico
|
||||
|
||||
1. **Criar documento** com docx-js conforme instrucoes acima
|
||||
2. **Validar** com `scripts/office/validate.py`
|
||||
3. **Guardar** via `mcp__filesystem__write_file` ou directamente no path do projecto
|
||||
4. **Upload** (opcional) via `mcp__google-workspace__drive_upload_file` para partilha com cliente
|
||||
|
||||
### Convencoes Descomplicar
|
||||
|
||||
- **Formato de data** em documentos: DD-MM-YYYY (ex: 06-03-2026)
|
||||
- **Formato monetario**: 1.234,56 EUR (separador milhar ponto, decimal virgula)
|
||||
- **Fonte padrao**: Arial 12pt
|
||||
- **Tamanho pagina padrao**: A4 (11906 x 16838 DXA)
|
||||
- **Autor para tracked changes**: "Claude" (salvo indicacao contraria)
|
||||
- **Idioma do documento**: PT-PT salvo indicacao contraria
|
||||
|
||||
---
|
||||
**Versao**: 1.0.0 | **Autor**: Descomplicar®
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
/home/ealmeida/.claude/plugins/anthropic-claude-code/plugins/frontend-design/skills/frontend-design
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: nextjs
|
||||
description: Desenvolvimento Next.js moderno (13+) com App Router, Server Components, rotas API e deployment seguindo padroes Descomplicar.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# /nextjs - Next.js Development
|
||||
@@ -23,20 +22,18 @@ mcp__notebooklm__notebook_query({
|
||||
|
||||
## Regra #48 - Dev Container (OBRIGATÓRIO)
|
||||
|
||||
**TODOS os projectos Next.js devem ser desenvolvidos no container dev.**
|
||||
**TODOS os projectos Next.js são desenvolvidos LOCALMENTE no desktop (regra 48 — CT 102 extinto em 20-04-2026).**
|
||||
|
||||
```
|
||||
SSH: server="dev" (mcp__ssh-unified__ssh_execute)
|
||||
Path: /root/Dev/<projecto>
|
||||
Sync: auto -> /media/ealmeida/Dados/Dev/<projecto> (Syncthing)
|
||||
Ambiente: Bash local no desktop (sem SSH)
|
||||
Path: /media/ealmeida/Dados/Dev/<projecto>
|
||||
```
|
||||
|
||||
**Workflow:**
|
||||
1. `mcp__ssh-unified__ssh_execute server:"dev" command:"mkdir -p /root/Dev/<projecto>"`
|
||||
1. `mkdir -p /media/ealmeida/Dados/Dev/<projecto>` (Bash local)
|
||||
2. Desenvolver e testar no container
|
||||
3. `npm run build` no container antes de deploy
|
||||
4. Deploy via EasyPanel
|
||||
5. Syncthing propaga automaticamente
|
||||
|
||||
**NUNCA:** `npx create-next-app` directamente no PC local para projectos colaborativos.
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: pdf
|
||||
description: Processamento de ficheiros PDF — leitura, extracção, merge, split, OCR, formulários. Versão light para heartbeats.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# PDF — Referência Rápida
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: pdf
|
||||
description: Processamento completo de ficheiros PDF — leitura, extraccao de texto/tabelas, merge, split, watermarks, encriptacao, OCR, criacao e preenchimento de formularios.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# PDF Processing Guide
|
||||
@@ -194,4 +193,616 @@ Para texto desenhado com canvas (nao Paragraph), ajustar manualmente o tamanho d
|
||||
pdftotext input.pdf output.txt
|
||||
|
||||
# Extract text preserving layout
|
||||
pdftotext -layout
|
||||
pdftotext -layout input.pdf output.txt
|
||||
|
||||
# Extract specific pages
|
||||
pdftotext -f 1 -l 5 input.pdf output.txt # Pages 1-5
|
||||
```
|
||||
|
||||
### qpdf
|
||||
```bash
|
||||
# Merge PDFs
|
||||
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
|
||||
|
||||
# Split pages
|
||||
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
|
||||
qpdf input.pdf --pages . 6-10 -- pages6-10.pdf
|
||||
|
||||
# Rotate pages
|
||||
qpdf input.pdf output.pdf --rotate=+90:1 # Rotate page 1 by 90 degrees
|
||||
|
||||
# Remove password
|
||||
qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf
|
||||
```
|
||||
|
||||
### pdftk (if available)
|
||||
```bash
|
||||
# Merge
|
||||
pdftk file1.pdf file2.pdf cat output merged.pdf
|
||||
|
||||
# Split
|
||||
pdftk input.pdf burst
|
||||
|
||||
# Rotate
|
||||
pdftk input.pdf rotate 1east output rotated.pdf
|
||||
```
|
||||
|
||||
## Tarefas comuns
|
||||
|
||||
### Extrair texto de PDFs digitalizados (OCR)
|
||||
```python
|
||||
# Requires: pip install pytesseract pdf2image
|
||||
import pytesseract
|
||||
from pdf2image import convert_from_path
|
||||
|
||||
# Convert PDF to images
|
||||
images = convert_from_path('scanned.pdf')
|
||||
|
||||
# OCR each page
|
||||
text = ""
|
||||
for i, image in enumerate(images):
|
||||
text += f"Page {i+1}:\n"
|
||||
text += pytesseract.image_to_string(image)
|
||||
text += "\n\n"
|
||||
|
||||
print(text)
|
||||
```
|
||||
|
||||
### Adicionar watermark
|
||||
```python
|
||||
from pypdf import PdfReader, PdfWriter
|
||||
|
||||
# Create watermark (or load existing)
|
||||
watermark = PdfReader("watermark.pdf").pages[0]
|
||||
|
||||
# Apply to all pages
|
||||
reader = PdfReader("document.pdf")
|
||||
writer = PdfWriter()
|
||||
|
||||
for page in reader.pages:
|
||||
page.merge_page(watermark)
|
||||
writer.add_page(page)
|
||||
|
||||
with open("watermarked.pdf", "wb") as output:
|
||||
writer.write(output)
|
||||
```
|
||||
|
||||
### Extrair imagens
|
||||
```bash
|
||||
# Using pdfimages (poppler-utils)
|
||||
pdfimages -j input.pdf output_prefix
|
||||
|
||||
# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.
|
||||
```
|
||||
|
||||
### Proteccao por password
|
||||
```python
|
||||
from pypdf import PdfReader, PdfWriter
|
||||
|
||||
reader = PdfReader("input.pdf")
|
||||
writer = PdfWriter()
|
||||
|
||||
for page in reader.pages:
|
||||
writer.add_page(page)
|
||||
|
||||
# Add password
|
||||
writer.encrypt("userpassword", "ownerpassword")
|
||||
|
||||
with open("encrypted.pdf", "wb") as output:
|
||||
writer.write(output)
|
||||
```
|
||||
|
||||
## Referencia rapida
|
||||
|
||||
| Tarefa | Melhor ferramenta | Comando/codigo |
|
||||
|--------|-------------------|----------------|
|
||||
| Merge PDFs | pypdf | `writer.add_page(page)` |
|
||||
| Split PDFs | pypdf | One page per file |
|
||||
| Extrair texto | pdfplumber | `page.extract_text()` |
|
||||
| Extrair tabelas | pdfplumber | `page.extract_tables()` |
|
||||
| Criar PDFs | reportlab | Canvas or Platypus |
|
||||
| Merge CLI | qpdf | `qpdf --empty --pages ...` |
|
||||
| OCR scanned PDFs | pytesseract | Convert to image first |
|
||||
| Preencher formularios | pypdf ou annotations | Ver seccao abaixo |
|
||||
|
||||
---
|
||||
|
||||
## Preenchimento de formularios
|
||||
|
||||
**Obrigatorio: seguir estes passos por ordem. Nao saltar para codigo directamente.**
|
||||
|
||||
Primeiro verificar se o PDF tem campos preenchíveis. Executar a partir da pasta de scripts desta skill:
|
||||
`python scripts/check_fillable_fields.py <file.pdf>`
|
||||
|
||||
Consoante o resultado, seguir a seccao "Campos preenchíveis" ou "Campos nao preenchíveis".
|
||||
|
||||
### Campos preenchíveis
|
||||
|
||||
Se o PDF tiver campos de formulario nativos:
|
||||
|
||||
1. Extrair informacao dos campos:
|
||||
`python scripts/extract_form_field_info.py <input.pdf> <field_info.json>`
|
||||
|
||||
O JSON resultante contem campos com esta estrutura:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"field_id": "(ID unico do campo)",
|
||||
"page": "(numero da pagina, 1-based)",
|
||||
"rect": "[left, bottom, right, top]",
|
||||
"type": "text | checkbox | radio_group | choice"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Para **checkboxes**: propriedades `checked_value` e `unchecked_value`.
|
||||
Para **radio groups**: lista `radio_options` com `value` e `rect`.
|
||||
Para **choice fields**: lista `choice_options` com `value` e `text`.
|
||||
|
||||
2. Converter PDF para imagens para analise visual:
|
||||
`python scripts/convert_pdf_to_images.py <file.pdf> <output_directory>`
|
||||
Analisar as imagens para determinar o proposito de cada campo.
|
||||
|
||||
3. Criar `field_values.json`:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"field_id": "last_name",
|
||||
"description": "Apelido do utilizador",
|
||||
"page": 1,
|
||||
"value": "Silva"
|
||||
},
|
||||
{
|
||||
"field_id": "Checkbox12",
|
||||
"description": "Checkbox para maiores de 18",
|
||||
"page": 1,
|
||||
"value": "/On"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
4. Preencher:
|
||||
`python scripts/fill_fillable_fields.py <input.pdf> <field_values.json> <output.pdf>`
|
||||
|
||||
### Campos nao preenchíveis
|
||||
|
||||
Se o PDF nao tiver campos nativos, usar anotacoes de texto. Tentar primeiro extraccao por estrutura (mais preciso), depois estimativa visual como fallback.
|
||||
|
||||
#### Passo 1: extraccao por estrutura
|
||||
|
||||
`python scripts/extract_form_structure.py <input.pdf> form_structure.json`
|
||||
|
||||
Extrai labels de texto, linhas horizontais e checkboxes com coordenadas exactas.
|
||||
|
||||
**Se form_structure.json tiver labels significativos** -> usar abordagem A (estrutura).
|
||||
**Se o PDF for digitalizado/imagem** -> usar abordagem B (visual).
|
||||
|
||||
#### Abordagem A: coordenadas por estrutura (preferida)
|
||||
|
||||
Analisar form_structure.json e identificar:
|
||||
- **Label groups**: elementos de texto adjacentes que formam um label
|
||||
- **Row structure**: labels com `top` similar estao na mesma linha
|
||||
- **Field columns**: areas de entrada comecam apos o label (x0 = label.x1 + gap)
|
||||
- **Checkboxes**: usar coordenadas directamente do JSON
|
||||
|
||||
Criar fields.json com `pdf_width`/`pdf_height`:
|
||||
```json
|
||||
{
|
||||
"pages": [
|
||||
{"page_number": 1, "pdf_width": 612, "pdf_height": 792}
|
||||
],
|
||||
"form_fields": [
|
||||
{
|
||||
"page_number": 1,
|
||||
"description": "Campo apelido",
|
||||
"field_label": "Apelido",
|
||||
"label_bounding_box": [43, 63, 87, 73],
|
||||
"entry_bounding_box": [92, 63, 260, 79],
|
||||
"entry_text": {"text": "Silva", "font_size": 10}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### Abordagem B: estimativa visual (fallback)
|
||||
|
||||
1. Converter PDF para imagens:
|
||||
`python scripts/convert_pdf_to_images.py <input.pdf> <images_dir/>`
|
||||
|
||||
2. Identificar campos e posicoes aproximadas nas imagens.
|
||||
|
||||
3. Refinar com zoom (ImageMagick):
|
||||
```bash
|
||||
magick <page_image> -crop <width>x<height>+<x>+<y> +repage <crop_output.png>
|
||||
```
|
||||
|
||||
Converter coordenadas do crop de volta para coordenadas da imagem completa:
|
||||
- full_x = crop_x + crop_offset_x
|
||||
- full_y = crop_y + crop_offset_y
|
||||
|
||||
4. Criar fields.json com `image_width`/`image_height`.
|
||||
|
||||
#### Abordagem hibrida
|
||||
|
||||
Quando a extraccao por estrutura funciona para a maioria dos campos mas falta alguns:
|
||||
1. Usar abordagem A para campos detectados
|
||||
2. Usar abordagem B para campos em falta
|
||||
3. Converter todas as coordenadas para PDF:
|
||||
- pdf_x = image_x * (pdf_width / image_width)
|
||||
- pdf_y = image_y * (pdf_height / image_height)
|
||||
4. Usar sistema de coordenadas unico com `pdf_width`/`pdf_height`
|
||||
|
||||
#### Validacao e preenchimento
|
||||
|
||||
Validar bounding boxes antes de preencher:
|
||||
`python scripts/check_bounding_boxes.py fields.json`
|
||||
|
||||
Preencher o formulario:
|
||||
`python scripts/fill_pdf_form_with_annotations.py <input.pdf> fields.json <output.pdf>`
|
||||
|
||||
Verificar resultado:
|
||||
`python scripts/convert_pdf_to_images.py <output.pdf> <verify_images/>`
|
||||
|
||||
Criar imagem de validacao com bounding boxes sobrepostas:
|
||||
`python scripts/create_validation_image.py <page_number> <fields.json> <input_image> <output_image>`
|
||||
|
||||
---
|
||||
|
||||
## Referencia avancada
|
||||
|
||||
### pypdfium2 — rendering rapido
|
||||
|
||||
```python
|
||||
import pypdfium2 as pdfium
|
||||
from PIL import Image
|
||||
|
||||
# Load PDF
|
||||
pdf = pdfium.PdfDocument("document.pdf")
|
||||
|
||||
# Render page to image
|
||||
page = pdf[0]
|
||||
bitmap = page.render(scale=2.0, rotation=0)
|
||||
img = bitmap.to_pil()
|
||||
img.save("page_1.png", "PNG")
|
||||
|
||||
# Process multiple pages
|
||||
for i, page in enumerate(pdf):
|
||||
bitmap = page.render(scale=1.5)
|
||||
img = bitmap.to_pil()
|
||||
img.save(f"page_{i+1}.jpg", "JPEG", quality=90)
|
||||
```
|
||||
|
||||
### pdfplumber — funcionalidades avancadas
|
||||
|
||||
#### Texto com coordenadas precisas
|
||||
```python
|
||||
import pdfplumber
|
||||
|
||||
with pdfplumber.open("document.pdf") as pdf:
|
||||
page = pdf.pages[0]
|
||||
|
||||
# Extract all text with coordinates
|
||||
chars = page.chars
|
||||
for char in chars[:10]:
|
||||
print(f"Char: '{char['text']}' at x:{char['x0']:.1f} y:{char['y0']:.1f}")
|
||||
|
||||
# Extract text by bounding box (left, top, right, bottom)
|
||||
bbox_text = page.within_bbox((100, 100, 400, 200)).extract_text()
|
||||
```
|
||||
|
||||
#### Tabelas complexas com settings customizados
|
||||
```python
|
||||
import pdfplumber
|
||||
import pandas as pd
|
||||
|
||||
with pdfplumber.open("complex_table.pdf") as pdf:
|
||||
page = pdf.pages[0]
|
||||
|
||||
table_settings = {
|
||||
"vertical_strategy": "lines",
|
||||
"horizontal_strategy": "lines",
|
||||
"snap_tolerance": 3,
|
||||
"intersection_tolerance": 15
|
||||
}
|
||||
tables = page.extract_tables(table_settings)
|
||||
|
||||
# Visual debugging for table extraction
|
||||
img = page.to_image(resolution=150)
|
||||
img.save("debug_layout.png")
|
||||
```
|
||||
|
||||
### reportlab — relatorios profissionais com tabelas
|
||||
|
||||
```python
|
||||
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
|
||||
from reportlab.lib.styles import getSampleStyleSheet
|
||||
from reportlab.lib import colors
|
||||
|
||||
data = [
|
||||
['Produto', 'Q1', 'Q2', 'Q3', 'Q4'],
|
||||
['Widgets', '120', '135', '142', '158'],
|
||||
['Gadgets', '85', '92', '98', '105']
|
||||
]
|
||||
|
||||
doc = SimpleDocTemplate("report.pdf")
|
||||
elements = []
|
||||
|
||||
styles = getSampleStyleSheet()
|
||||
title = Paragraph("Relatorio Trimestral de Vendas", styles['Title'])
|
||||
elements.append(title)
|
||||
|
||||
table = Table(data)
|
||||
table.setStyle(TableStyle([
|
||||
('BACKGROUND', (0, 0), (-1, 0), colors.grey),
|
||||
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
|
||||
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
|
||||
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
|
||||
('FONTSIZE', (0, 0), (-1, 0), 14),
|
||||
('BOTTOMPADDING', (0, 0), (-1, 0), 12),
|
||||
('BACKGROUND', (0, 1), (-1, -1), colors.beige),
|
||||
('GRID', (0, 0), (-1, -1), 1, colors.black)
|
||||
]))
|
||||
elements.append(table)
|
||||
|
||||
doc.build(elements)
|
||||
```
|
||||
|
||||
### JavaScript — pdf-lib (criacao e modificacao)
|
||||
|
||||
#### Load and Manipulate Existing PDF
|
||||
```javascript
|
||||
import { PDFDocument } from 'pdf-lib';
|
||||
import fs from 'fs';
|
||||
|
||||
async function manipulatePDF() {
|
||||
const existingPdfBytes = fs.readFileSync('input.pdf');
|
||||
const pdfDoc = await PDFDocument.load(existingPdfBytes);
|
||||
|
||||
const pageCount = pdfDoc.getPageCount();
|
||||
const newPage = pdfDoc.addPage([600, 400]);
|
||||
newPage.drawText('Added by pdf-lib', { x: 100, y: 300, size: 16 });
|
||||
|
||||
const pdfBytes = await pdfDoc.save();
|
||||
fs.writeFileSync('modified.pdf', pdfBytes);
|
||||
}
|
||||
```
|
||||
|
||||
#### Advanced Merge and Split
|
||||
```javascript
|
||||
import { PDFDocument } from 'pdf-lib';
|
||||
import fs from 'fs';
|
||||
|
||||
async function mergePDFs() {
|
||||
const mergedPdf = await PDFDocument.create();
|
||||
|
||||
const pdf1 = await PDFDocument.load(fs.readFileSync('doc1.pdf'));
|
||||
const pdf2 = await PDFDocument.load(fs.readFileSync('doc2.pdf'));
|
||||
|
||||
const pdf1Pages = await mergedPdf.copyPages(pdf1, pdf1.getPageIndices());
|
||||
pdf1Pages.forEach(page => mergedPdf.addPage(page));
|
||||
|
||||
const pdf2Pages = await mergedPdf.copyPages(pdf2, [0, 2, 4]);
|
||||
pdf2Pages.forEach(page => mergedPdf.addPage(page));
|
||||
|
||||
fs.writeFileSync('merged.pdf', await mergedPdf.save());
|
||||
}
|
||||
```
|
||||
|
||||
### Operacoes avancadas CLI
|
||||
|
||||
#### poppler-utils
|
||||
```bash
|
||||
# Text with bounding box coordinates
|
||||
pdftotext -bbox-layout document.pdf output.xml
|
||||
|
||||
# High-resolution PNG conversion
|
||||
pdftoppm -png -r 300 document.pdf output_prefix
|
||||
|
||||
# Specific page range with high resolution
|
||||
pdftoppm -png -r 600 -f 1 -l 3 document.pdf high_res_pages
|
||||
|
||||
# Extract all embedded images with metadata
|
||||
pdfimages -j -p document.pdf page_images
|
||||
|
||||
# List image info without extracting
|
||||
pdfimages -list document.pdf
|
||||
```
|
||||
|
||||
#### qpdf avancado
|
||||
```bash
|
||||
# Split PDF into groups of pages
|
||||
qpdf --split-pages=3 input.pdf output_group_%02d.pdf
|
||||
|
||||
# Complex page ranges from multiple PDFs
|
||||
qpdf --empty --pages doc1.pdf 1-3 doc2.pdf 5-7 doc3.pdf 2,4 -- combined.pdf
|
||||
|
||||
# Optimize for web (linearize)
|
||||
qpdf --linearize input.pdf optimized.pdf
|
||||
|
||||
# Repair corrupted PDF
|
||||
qpdf --check input.pdf
|
||||
qpdf --fix-qdf damaged.pdf repaired.pdf
|
||||
|
||||
# Advanced encryption with permissions
|
||||
qpdf --encrypt user_pass owner_pass 256 --print=none --modify=none -- input.pdf encrypted.pdf
|
||||
|
||||
# Check encryption status
|
||||
qpdf --show-encryption encrypted.pdf
|
||||
```
|
||||
|
||||
### Processamento em lote com error handling
|
||||
|
||||
```python
|
||||
import os
|
||||
import glob
|
||||
from pypdf import PdfReader, PdfWriter
|
||||
import logging
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def batch_process_pdfs(input_dir, operation='merge'):
|
||||
pdf_files = glob.glob(os.path.join(input_dir, "*.pdf"))
|
||||
|
||||
if operation == 'merge':
|
||||
writer = PdfWriter()
|
||||
for pdf_file in pdf_files:
|
||||
try:
|
||||
reader = PdfReader(pdf_file)
|
||||
for page in reader.pages:
|
||||
writer.add_page(page)
|
||||
logger.info(f"Processed: {pdf_file}")
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to process {pdf_file}: {e}")
|
||||
continue
|
||||
|
||||
with open("batch_merged.pdf", "wb") as output:
|
||||
writer.write(output)
|
||||
|
||||
elif operation == 'extract_text':
|
||||
for pdf_file in pdf_files:
|
||||
try:
|
||||
reader = PdfReader(pdf_file)
|
||||
text = ""
|
||||
for page in reader.pages:
|
||||
text += page.extract_text()
|
||||
|
||||
output_file = pdf_file.replace('.pdf', '.txt')
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(text)
|
||||
logger.info(f"Extracted text from: {pdf_file}")
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to extract text from {pdf_file}: {e}")
|
||||
continue
|
||||
```
|
||||
|
||||
### Cropping avancado
|
||||
|
||||
```python
|
||||
from pypdf import PdfWriter, PdfReader
|
||||
|
||||
reader = PdfReader("input.pdf")
|
||||
writer = PdfWriter()
|
||||
|
||||
page = reader.pages[0]
|
||||
page.mediabox.left = 50
|
||||
page.mediabox.bottom = 50
|
||||
page.mediabox.right = 550
|
||||
page.mediabox.top = 750
|
||||
|
||||
writer.add_page(page)
|
||||
with open("cropped.pdf", "wb") as output:
|
||||
writer.write(output)
|
||||
```
|
||||
|
||||
### Gestao de memoria para PDFs grandes
|
||||
|
||||
```python
|
||||
def process_large_pdf(pdf_path, chunk_size=10):
|
||||
reader = PdfReader(pdf_path)
|
||||
total_pages = len(reader.pages)
|
||||
|
||||
for start_idx in range(0, total_pages, chunk_size):
|
||||
end_idx = min(start_idx + chunk_size, total_pages)
|
||||
writer = PdfWriter()
|
||||
|
||||
for i in range(start_idx, end_idx):
|
||||
writer.add_page(reader.pages[i])
|
||||
|
||||
with open(f"chunk_{start_idx//chunk_size}.pdf", "wb") as output:
|
||||
writer.write(output)
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### PDFs encriptados
|
||||
```python
|
||||
from pypdf import PdfReader
|
||||
|
||||
try:
|
||||
reader = PdfReader("encrypted.pdf")
|
||||
if reader.is_encrypted:
|
||||
reader.decrypt("password")
|
||||
except Exception as e:
|
||||
print(f"Failed to decrypt: {e}")
|
||||
```
|
||||
|
||||
### PDFs corrompidos
|
||||
```bash
|
||||
qpdf --check corrupted.pdf
|
||||
qpdf --replace-input corrupted.pdf
|
||||
```
|
||||
|
||||
### Falha na extraccao de texto (fallback para OCR)
|
||||
```python
|
||||
import pytesseract
|
||||
from pdf2image import convert_from_path
|
||||
|
||||
def extract_text_with_ocr(pdf_path):
|
||||
images = convert_from_path(pdf_path)
|
||||
text = ""
|
||||
for i, image in enumerate(images):
|
||||
text += pytesseract.image_to_string(image)
|
||||
return text
|
||||
```
|
||||
|
||||
## Dicas de performance
|
||||
|
||||
1. **PDFs grandes**: usar streaming em vez de carregar tudo em memoria; `qpdf --split-pages` para dividir
|
||||
2. **Extraccao de texto**: `pdftotext -bbox-layout` e o mais rapido; pdfplumber para tabelas
|
||||
3. **Extraccao de imagens**: `pdfimages` e muito mais rapido que rendering de paginas
|
||||
4. **Preenchimento de formularios**: pdf-lib mantem melhor a estrutura do formulario
|
||||
5. **Memoria**: processar paginas individualmente com pypdfium2 para documentos grandes
|
||||
|
||||
---
|
||||
|
||||
## Integracao Descomplicar
|
||||
|
||||
### Caminhos frequentes para PDFs
|
||||
|
||||
| Localizacao | Caminho |
|
||||
|-------------|---------|
|
||||
| Documentos empresa | `/media/ealmeida/Dados/GDrive/Cloud/Descomplicar/` |
|
||||
| Propostas | `/media/ealmeida/Dados/Hub/03-Propostas/` |
|
||||
| Arquivo clientes | `/media/ealmeida/Dados/GDrive/Arquivo_de_Clientes/` |
|
||||
| Knowledge Base | `/media/ealmeida/Dados/Hub/06-Operacoes/Knowledge-Base/PDFs/` |
|
||||
| Backups | `/media/ealmeida/Externo/LocalBackups/` (espelhado p/ GDrive via rclone) |
|
||||
| Temporarios | `~/.claude-work/` (limpar ao concluir) |
|
||||
|
||||
### MCPs relevantes
|
||||
|
||||
- **mcp__filesystem__read_file** / **write_file**: ler e escrever PDFs locais
|
||||
- **mcp__filesystem__search_files**: encontrar PDFs no sistema
|
||||
- **mcp__google-workspace__drive_search_files**: encontrar PDFs no Google Drive
|
||||
- **mcp__google-workspace__drive_read_file_content**: ler conteudo de ficheiros no Drive
|
||||
- **mcp__google-workspace__drive_upload_file**: enviar PDFs processados para o Drive
|
||||
|
||||
### Workflow tipico Descomplicar
|
||||
|
||||
1. Localizar PDF (filesystem ou Google Drive)
|
||||
2. Descarregar para `~/.claude-work/` se necessario
|
||||
3. Processar (extrair, merge, split, OCR, etc.)
|
||||
4. Guardar resultado no destino final
|
||||
5. Limpar temporarios de `~/.claude-work/`
|
||||
|
||||
---
|
||||
|
||||
## Licencas das bibliotecas
|
||||
|
||||
- **pypdf**: BSD | **pdfplumber**: MIT | **pypdfium2**: Apache/BSD | **reportlab**: BSD
|
||||
- **poppler-utils**: GPL-2 | **qpdf**: Apache | **pdf-lib**: MIT | **pdfjs-dist**: Apache
|
||||
|
||||
---
|
||||
**Versao**: 1.0.0 | **Autor**: Descomplicar®
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
---
|
||||
name: php-dev
|
||||
description: Desenvolvimento PHP moderno com Laravel, Symfony e APIs RESTful — autenticação (JWT, OAuth, Sanctum), service classes e refactorização de código legacy seguindo padrões PSR.
|
||||
allowed-tools: Read, Write, Edit, Bash, mcp__mem_search_memories, mcp__context7__get-library-docs, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments
|
||||
layer: wiki
|
||||
allowed-tools: Read, Write, Edit, Bash, mcp__mem0__search_memories, mcp__context7__get-library-docs, mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments
|
||||
---
|
||||
|
||||
# PHP Fullstack Engineer
|
||||
@@ -34,7 +33,7 @@ mcp__notebooklm__notebook_query({
|
||||
|
||||
Integrar insights do NotebookLM nas recomendações e decisões.
|
||||
|
||||
> **Regra #48:** Projectos PHP/Laravel/Symfony devem ser desenvolvidos no **container dev** (`server:"dev"`, path `/root/Dev/<projecto>`). Sincroniza automaticamente com o PC local via Syncthing.
|
||||
> **Regra #48:** Projectos PHP/Laravel/Symfony são desenvolvidos **localmente no desktop** em `/media/ealmeida/Dados/Dev/<projecto>` (Bash local, sem SSH — CT 102 extinto em 20-04-2026).
|
||||
|
||||
## Quando Usar
|
||||
|
||||
@@ -48,8 +47,8 @@ Integrar insights do NotebookLM nas recomendações e decisões.
|
||||
|
||||
### 1. Pesquisa Inicial
|
||||
```
|
||||
mcp__mem_search_memories "[keywords php/laravel]"
|
||||
mcp__wikijs__search_pages "[framework] best practices"
|
||||
mcp__mem0__search_memories "[keywords php/laravel]"
|
||||
/knowledge (router Hub QR/PROC) + mcp__mem0__search_memories "[framework] best practices"
|
||||
mcp__context7__get-library-docs para documentação actualizada
|
||||
```
|
||||
|
||||
@@ -202,3 +201,206 @@ class ProductService
|
||||
}
|
||||
|
||||
public function create(array $data): Product
|
||||
{
|
||||
return $this->repository->create($data);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Repository
|
||||
```php
|
||||
<?php
|
||||
|
||||
namespace App\Repositories;
|
||||
|
||||
use App\Models\Product;
|
||||
use Illuminate\Pagination\LengthAwarePaginator;
|
||||
|
||||
/**
|
||||
* ProductRepository - Acesso a dados Produtos
|
||||
*
|
||||
* @author Descomplicar® Crescimento Digital
|
||||
* @link https://descomplicar.pt
|
||||
* @copyright 2025 Descomplicar®
|
||||
*/
|
||||
class ProductRepository
|
||||
{
|
||||
public function paginate(array $filters = []): LengthAwarePaginator
|
||||
{
|
||||
return Product::query()
|
||||
->when($filters['category'] ?? null, fn($q, $cat) => $q->where('category_id', $cat))
|
||||
->when($filters['active'] ?? null, fn($q, $active) => $q->where('active', $active))
|
||||
->orderBy('created_at', 'desc')
|
||||
->paginate($filters['per_page'] ?? 15);
|
||||
}
|
||||
|
||||
public function create(array $data): Product
|
||||
{
|
||||
return Product::create($data);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Debugging PHP
|
||||
|
||||
### Xdebug
|
||||
|
||||
```php
|
||||
// php.ini
|
||||
zend_extension=xdebug.so
|
||||
xdebug.mode=debug
|
||||
xdebug.start_with_request=yes
|
||||
xdebug.client_host=127.0.0.1
|
||||
xdebug.client_port=9003
|
||||
```
|
||||
|
||||
### Logging
|
||||
|
||||
```php
|
||||
// Monolog exemplo
|
||||
use Monolog\Logger;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
|
||||
$log = new Logger('app');
|
||||
$log->pushHandler(new StreamHandler('logs/app.log', Logger::DEBUG));
|
||||
|
||||
$log->info('User logged in', ['user_id' => $userId]);
|
||||
$log->error('Database error', ['exception' => $e->getMessage()]);
|
||||
```
|
||||
|
||||
### Profiling
|
||||
|
||||
```bash
|
||||
# Com Blackfire
|
||||
blackfire run php script.php
|
||||
|
||||
# Com Xhprof
|
||||
php -d extension=xhprof.so script.php
|
||||
```
|
||||
|
||||
## Testes Unitários
|
||||
|
||||
### PHPUnit
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ProductServiceTest extends TestCase
|
||||
{
|
||||
private ProductService $service;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->service = new ProductService(
|
||||
new InMemoryProductRepository()
|
||||
);
|
||||
}
|
||||
|
||||
public function test_create_product(): void
|
||||
{
|
||||
$product = $this->service->create([
|
||||
'name' => 'Test Product',
|
||||
'price' => 99.99
|
||||
]);
|
||||
|
||||
$this->assertInstanceOf(Product::class, $product);
|
||||
$this->assertEquals('Test Product', $product->name);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Pest (alternativa moderna)
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
test('creates product', function () {
|
||||
$product = app(ProductService::class)->create([
|
||||
'name' => 'Test',
|
||||
'price' => 99.99
|
||||
]);
|
||||
|
||||
expect($product)
|
||||
->toBeInstanceOf(Product::class)
|
||||
->name->toBe('Test');
|
||||
});
|
||||
```
|
||||
|
||||
## Checklist Entrega
|
||||
|
||||
- [ ] Assinatura Descomplicar® em todos os ficheiros
|
||||
- [ ] php -l sem erros
|
||||
- [ ] PHPDoc em funções públicas
|
||||
- [ ] Type hints completos
|
||||
- [ ] PSR-12 compliant
|
||||
- [ ] Segurança validada (injection, XSS)
|
||||
- [ ] Se API: documentação endpoints
|
||||
- [ ] Testes unitários (cobertura >70%)
|
||||
|
||||
---
|
||||
|
||||
## Datasets Dify (Consulta Obrigatória)
|
||||
|
||||
Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes datasets via MCP:
|
||||
|
||||
| Dataset | ID | Prioridade |
|
||||
|---------|----|-----------:|
|
||||
| **TI (Tecnologia da Informação)** | `7f63ec0c-6321-488c-b107-980140199850` | 1 |
|
||||
| **Desenvolvimento de Software** | `e7c7decc-0ded-4351-ab14-b110b3c38ec9` | 1 |
|
||||
| **Wordpress** | `9da0b2b9-5051-4b99-b9f6-20bf35067092` | 2 |
|
||||
| **PerfexCRM** | `43354eb6-f0b2-40cc-aa53-44e375ab347c` | 3 |
|
||||
|
||||
### Como Consultar
|
||||
|
||||
```javascript
|
||||
# PRIMARIO: NotebookLM (Gemini 2.5 RAG)
|
||||
# mcp__notebooklm__notebook_query({notebook_id: "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", query: "<tema>"}) // Claude Code
|
||||
# mcp__notebooklm__notebook_query({notebook_id: "73102308-70ef-403e-9be9-eae0cfc62d55", query: "<tema>"}) // Desenvolvimento de MCPs
|
||||
# mcp__notebooklm__notebook_query({notebook_id: "57d9c6c9-48ba-4d83-8f71-cc890f348a53", query: "<tema>"}) // AI Code Editors
|
||||
# mcp__notebooklm__notebook_query({notebook_id: "24947ffa-0019-448a-a340-2f4a275d2eb1", query: "<tema>"}) // Programacao
|
||||
# mcp__notebooklm__notebook_query({notebook_id: "ebee9fe1-78fd-4f85-8938-f19f3ea32131", query: "<tema>"}) // 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",
|
||||
query: "laravel service repository pattern"
|
||||
})
|
||||
|
||||
// APIs e autenticação
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "7f63ec0c-6321-488c-b107-980140199850",
|
||||
query: "api rest jwt sanctum"
|
||||
})
|
||||
|
||||
// Desenvolvimento Perfex
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "43354eb6-f0b2-40cc-aa53-44e375ab347c",
|
||||
query: "module development hooks"
|
||||
})
|
||||
```
|
||||
|
||||
### Quando Consultar
|
||||
|
||||
- Implementar padrões de arquitectura
|
||||
- Desenvolver APIs RESTful
|
||||
- Integrar sistemas de autenticação
|
||||
- Criar módulos Perfex CRM
|
||||
- Refactorizar código legacy
|
||||
|
||||
---
|
||||
**Versão**: 1.0.0 | **Autor**: Descomplicar®
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
---
|
||||
name: prompt-refine
|
||||
description: Transforma um pedido vago em prompt de excelência — especificação detalhada, inequívoca e estruturada para agentes de IA. Usar quando "refinar prompt", "melhorar prompt", "engenharia de prompts", "prompt para agente", "estruturar instrução IA", "prompt engineering".
|
||||
allowed-tools: Read, Write, mcp__mem_search_memories
|
||||
layer: wiki
|
||||
allowed-tools: Read, Write, mcp__mem0__search_memories
|
||||
---
|
||||
|
||||
# /prompt-refine — Engenharia de Prompts
|
||||
@@ -21,7 +20,7 @@ Transforma um pedido em linguagem natural num **prompt de excelência** pronto p
|
||||
### 1. Pesquisar contexto relevante
|
||||
|
||||
```
|
||||
mcp__mem_search_memories "<palavras-chave do pedido>"
|
||||
mcp__mem0__search_memories "<palavras-chave do pedido>"
|
||||
```
|
||||
|
||||
Verificar se há padrões ou decisões anteriores relacionadas.
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: react-patterns
|
||||
description: Padroes modernos React (18+/19) -- hooks, context, composicao, memoizacao, lazy loading e Server Components.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# React Patterns
|
||||
@@ -23,7 +22,7 @@ mcp__notebooklm__notebook_query({
|
||||
})
|
||||
```
|
||||
|
||||
> **Regra #48:** Projectos React devem ser desenvolvidos no **container dev** (`server:"dev"`, path `/root/Dev/<projecto>`). Sincroniza via Syncthing.
|
||||
> **Regra #48:** Projectos React são desenvolvidos **localmente no desktop** em `/media/ealmeida/Dados/Dev/<projecto>` (Bash local, sem SSH — CT 102 extinto em 20-04-2026).
|
||||
|
||||
## Quando Usar
|
||||
|
||||
@@ -178,4 +177,27 @@ components/
|
||||
ui/ # Componentes base (Button, Input, Card)
|
||||
features/ # Componentes feature-specific
|
||||
layouts/ # Layout components
|
||||
providers/ # Context
|
||||
providers/ # Context providers
|
||||
|
||||
hooks/
|
||||
useAuth.ts
|
||||
useLocalStorage.ts
|
||||
useDebounce.ts
|
||||
```
|
||||
|
||||
## Referencias
|
||||
|
||||
- `references/composition-patterns.md` - Compound components, providers, dependency injection (Vercel Engineering)
|
||||
- `references/custom-hooks.md` - useDebounce, useLocalStorage, useFetch com codigo completo
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: skill-creator
|
||||
description: Criar, melhorar e empacotar skills para o sistema de plugins Descomplicar. Usar quando o utilizador pede para criar uma nova skill, actualizar uma skill existente, ou quando é necessário estruturar conhecimento especializado em formato skill. Inclui padrões Anthropic oficiais (progressive disclosure, graus de liberdade) adaptados ao ecossistema Descomplicar com PT-PT estrito.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Skill Creator
|
||||
@@ -137,4 +136,65 @@ Calibrar o nível de especificidade ao risco da tarefa:
|
||||
- [ ] Scripts testados (se incluídos)
|
||||
- [ ] Sem ficheiros auxiliares (README.md, CHANGELOG.md, etc.)
|
||||
|
||||
**Padrões Descompl
|
||||
**Padrões Descomplicar:**
|
||||
- [ ] Assinatura Descomplicar® no código (quando aplicável)
|
||||
- [ ] MCPs relevantes referenciados
|
||||
- [ ] Monetário em EUR sem casas decimais desnecessárias
|
||||
|
||||
---
|
||||
|
||||
### Passo 6: Empacotar
|
||||
|
||||
**Script de packaging Anthropic** (quando disponível):
|
||||
```bash
|
||||
python scripts/package_skill.py <path/para/pasta-skill>
|
||||
# ou com output directory:
|
||||
python scripts/package_skill.py <path/para/pasta-skill> ./dist
|
||||
```
|
||||
|
||||
O script valida frontmatter, naming conventions, estrutura de directórios, e gera ficheiro `.skill` (zip com extensão .skill).
|
||||
|
||||
Se não estiver disponível, verificar manualmente com o checklist do Passo 5.
|
||||
|
||||
---
|
||||
|
||||
## Anti-Padrões a Evitar
|
||||
|
||||
**Má skill (demasiado vaga):**
|
||||
```yaml
|
||||
description: Ajuda com PHP.
|
||||
```
|
||||
|
||||
**Má skill (conteúdo duplicado em references e SKILL.md):**
|
||||
Documentar a mesma informação em dois locais — viola o princípio progressive disclosure.
|
||||
|
||||
**Má skill (ficheiros auxiliares):**
|
||||
Criar README.md, CHANGELOG.md, INSTALLATION_GUIDE.md — não devem existir numa skill.
|
||||
|
||||
**Boa skill:**
|
||||
```yaml
|
||||
description: >
|
||||
Desenvolvimento PHP moderno com Laravel e Symfony — autenticação JWT/OAuth,
|
||||
service classes, refactorização legacy. Usar quando: (1) criar APIs RESTful,
|
||||
(2) implementar autenticação, (3) desenvolver service classes, (4) refactorizar
|
||||
código PHP existente.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Exemplos Concretos: Bom vs Mau
|
||||
|
||||
Ver `references/anthropic-patterns.md` para exemplos detalhados de progressive disclosure.
|
||||
Ver `references/descomplicar-standards.md` para exemplos de skills Descomplicar bem estruturadas.
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -35,7 +35,7 @@ description: >
|
||||
name: nome-da-skill
|
||||
description: >
|
||||
Descrição da skill. Usar quando [contexto].
|
||||
allowed-tools: Read, Write, Edit, Bash, mcp__mem_search_memories
|
||||
allowed-tools: Read, Write, Edit, Bash, mcp__mem0__search_memories
|
||||
---
|
||||
```
|
||||
|
||||
@@ -120,10 +120,10 @@ Para skills que aprendem com execuções anteriores:
|
||||
## Memória
|
||||
|
||||
Pesquisar experiência anterior antes de começar:
|
||||
`mcp__mem_search_memories "[keywords relevantes]"`
|
||||
`mcp__mem0__search_memories "[keywords relevantes]"`
|
||||
|
||||
Guardar aprendizagens ao concluir:
|
||||
`mcp__mem_save_memory { text: "[domínio/skill] ..." }`
|
||||
`mcp__mem0__save_memory { content: "...", tags: ["domínio", "skill"] }`
|
||||
```
|
||||
|
||||
---
|
||||
@@ -213,7 +213,7 @@ O Anthropic define apenas `name` e `description` como obrigatórios. O sistema D
|
||||
name: nome-da-skill
|
||||
description: >
|
||||
Descrição completa com triggers.
|
||||
allowed-tools: Read, Write, Edit, Bash, mcp__mem_search_memories, mcp__notebooklm__notebook_query
|
||||
allowed-tools: Read, Write, Edit, Bash, mcp__mem0__search_memories, mcp__notebooklm__notebook_query
|
||||
---
|
||||
```
|
||||
|
||||
@@ -292,7 +292,7 @@ description: >
|
||||
|
||||
## Protocolo obrigatório
|
||||
|
||||
1. Pesquisar memória: `mcp__mem_search_memories "[keywords]"`
|
||||
1. Pesquisar memória: `mcp__mem0__search_memories "[keywords]"`
|
||||
2. Consultar NotebookLM: ver tabela em references/notebooklm-context.md
|
||||
3. Implementar com padrões Laravel: ver references/laravel-patterns.md
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: webapp-testing
|
||||
description: Testes e automacao de aplicacoes web locais com Playwright — verificacao de frontend, debug de UI, screenshots, logs de consola e gestao de ciclo de vida de servidores.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Web Application Testing
|
||||
@@ -114,4 +113,46 @@ with sync_playwright() as p:
|
||||
|
||||
| MCP | Uso com webapp-testing |
|
||||
|-----|----------------------|
|
||||
| `chrome-devtools` | Performance traces, network inspection
|
||||
| `chrome-devtools` | Performance traces, network inspection, DOM/CSS debugging — usar via skill /chrome |
|
||||
| `claude-in-chrome` | Testes em sites autenticados com sessao activa — usar via skill /chrome |
|
||||
| `lighthouse` | Auditorias completas de performance, SEO, a11y — complementa testes Playwright |
|
||||
| `puppeteer` | Alternativa headless para automacao simples sem Playwright |
|
||||
|
||||
### Workflow tipico Descomplicar
|
||||
|
||||
1. **Desenvolvimento local**: Playwright (esta skill) para testes funcionais headless
|
||||
2. **Debug visual**: /chrome (DevTools MCP) para inspeccao DOM/CSS/network em tempo real
|
||||
3. **Performance**: /chrome (DevTools MCP traces) + MCP lighthouse para auditorias
|
||||
4. **CI/CD**: Scripts Playwright commitados no repositorio, executados em pipeline Gitea Actions
|
||||
|
||||
### Executar no servidor dev (regra #48)
|
||||
|
||||
Para testes que requerem Node.js/Python:
|
||||
```bash
|
||||
# Via SSH MCP para o servidor dev
|
||||
cd /media/ealmeida/Dados/Dev/projecto && python test_automation.py # Bash local no desktop
|
||||
```
|
||||
|
||||
### Instalacao Playwright (se necessario)
|
||||
|
||||
```bash
|
||||
pip install playwright
|
||||
playwright install chromium
|
||||
```
|
||||
|
||||
No desktop, Playwright está disponível nos projectos em `/media/ealmeida/Dados/Dev`.
|
||||
|
||||
---
|
||||
**Versao**: 1.0.0 | **Autor**: Descomplicar®
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
---
|
||||
name: xlsx
|
||||
description: Criacao, edicao e analise de ficheiros Excel (.xlsx, .xlsm, .csv, .tsv) — formulas, formatacao, modelos financeiros e integracao com facturacao Moloni.
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Excel / XLSX Specialist
|
||||
@@ -131,4 +130,257 @@ df.describe() # Estatisticas
|
||||
df.to_excel('output.xlsx', index=False)
|
||||
```
|
||||
|
||||
#
|
||||
## Workflows Excel
|
||||
|
||||
## CRITICO: Usar formulas, NAO valores hardcoded
|
||||
|
||||
**Usar SEMPRE formulas Excel em vez de calcular valores em Python e hardcoda-los.** Isto garante que a folha permanece dinamica e actualizavel.
|
||||
|
||||
### ERRADO - Hardcoding de valores calculados
|
||||
```python
|
||||
# Mau: calcular em Python e hardcodar resultado
|
||||
total = df['Vendas'].sum()
|
||||
sheet['B10'] = total # Hardcoda 5000
|
||||
|
||||
# Mau: calcular taxa de crescimento em Python
|
||||
growth = (df.iloc[-1]['Receita'] - df.iloc[0]['Receita']) / df.iloc[0]['Receita']
|
||||
sheet['C5'] = growth # Hardcoda 0.15
|
||||
|
||||
# Mau: calculo Python para media
|
||||
avg = sum(values) / len(values)
|
||||
sheet['D20'] = avg # Hardcoda 42.5
|
||||
```
|
||||
|
||||
### CORRECTO - Usar formulas Excel
|
||||
```python
|
||||
# Bom: deixar Excel calcular a soma
|
||||
sheet['B10'] = '=SUM(B2:B9)'
|
||||
|
||||
# Bom: taxa de crescimento como formula Excel
|
||||
sheet['C5'] = '=(C4-C2)/C2'
|
||||
|
||||
# Bom: media usando funcao Excel
|
||||
sheet['D20'] = '=AVERAGE(D2:D19)'
|
||||
```
|
||||
|
||||
Isto aplica-se a TODOS os calculos - totais, percentagens, racios, diferencas, etc. A folha deve poder recalcular quando os dados de origem mudam.
|
||||
|
||||
## Workflow comum
|
||||
1. **Escolher ferramenta**: pandas para dados, openpyxl para formulas/formatacao
|
||||
2. **Criar/Carregar**: Criar novo workbook ou carregar ficheiro existente
|
||||
3. **Modificar**: Adicionar/editar dados, formulas e formatacao
|
||||
4. **Guardar**: Escrever para ficheiro
|
||||
5. **Recalcular formulas (OBRIGATORIO SE USAR FORMULAS)**: Usar o script scripts/recalc.py
|
||||
```bash
|
||||
python scripts/recalc.py output.xlsx
|
||||
```
|
||||
6. **Verificar e corrigir erros**:
|
||||
- O script retorna JSON com detalhes de erros
|
||||
- Se `status` for `errors_found`, verificar `error_summary` para tipos e localizacoes
|
||||
- Corrigir os erros identificados e recalcular novamente
|
||||
- Erros comuns a corrigir:
|
||||
- `#REF!`: Referencias de celula invalidas
|
||||
- `#DIV/0!`: Divisao por zero
|
||||
- `#VALUE!`: Tipo de dados errado na formula
|
||||
- `#NAME?`: Nome de formula nao reconhecido
|
||||
|
||||
### Criar novos ficheiros Excel
|
||||
|
||||
```python
|
||||
# Usando openpyxl para formulas e formatacao
|
||||
from openpyxl import Workbook
|
||||
from openpyxl.styles import Font, PatternFill, Alignment
|
||||
|
||||
wb = Workbook()
|
||||
sheet = wb.active
|
||||
|
||||
# Adicionar dados
|
||||
sheet['A1'] = 'Descricao'
|
||||
sheet['B1'] = 'Valor'
|
||||
sheet.append(['Linha', 'de', 'dados'])
|
||||
|
||||
# Adicionar formula
|
||||
sheet['B2'] = '=SUM(A1:A10)'
|
||||
|
||||
# Formatacao
|
||||
sheet['A1'].font = Font(bold=True, color='FF0000')
|
||||
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
|
||||
sheet['A1'].alignment = Alignment(horizontal='center')
|
||||
|
||||
# Largura da coluna
|
||||
sheet.column_dimensions['A'].width = 20
|
||||
|
||||
wb.save('output.xlsx')
|
||||
```
|
||||
|
||||
### Editar ficheiros Excel existentes
|
||||
|
||||
```python
|
||||
# Usando openpyxl para preservar formulas e formatacao
|
||||
from openpyxl import load_workbook
|
||||
|
||||
# Carregar ficheiro existente
|
||||
wb = load_workbook('existente.xlsx')
|
||||
sheet = wb.active # ou wb['NomeFolha'] para folha especifica
|
||||
|
||||
# Trabalhar com multiplas folhas
|
||||
for sheet_name in wb.sheetnames:
|
||||
sheet = wb[sheet_name]
|
||||
print(f"Folha: {sheet_name}")
|
||||
|
||||
# Modificar celulas
|
||||
sheet['A1'] = 'Novo Valor'
|
||||
sheet.insert_rows(2) # Inserir linha na posicao 2
|
||||
sheet.delete_cols(3) # Eliminar coluna 3
|
||||
|
||||
# Adicionar nova folha
|
||||
new_sheet = wb.create_sheet('NovaFolha')
|
||||
new_sheet['A1'] = 'Dados'
|
||||
|
||||
wb.save('modificado.xlsx')
|
||||
```
|
||||
|
||||
## Recalcular formulas
|
||||
|
||||
Ficheiros Excel criados ou modificados com openpyxl contem formulas como strings mas nao valores calculados. Usar o script `scripts/recalc.py` para recalcular formulas:
|
||||
|
||||
```bash
|
||||
python scripts/recalc.py <ficheiro_excel> [timeout_segundos]
|
||||
```
|
||||
|
||||
Exemplo:
|
||||
```bash
|
||||
python scripts/recalc.py output.xlsx 30
|
||||
```
|
||||
|
||||
O script:
|
||||
- Configura automaticamente a macro LibreOffice na primeira execucao
|
||||
- Recalcula todas as formulas em todas as folhas
|
||||
- Analisa TODAS as celulas a procura de erros Excel (#REF!, #DIV/0!, etc.)
|
||||
- Retorna JSON com localizacoes e contagens detalhadas de erros
|
||||
- Funciona em Linux e macOS
|
||||
|
||||
## Checklist de verificacao de formulas
|
||||
|
||||
Verificacoes rapidas para garantir que as formulas funcionam correctamente:
|
||||
|
||||
### Verificacao essencial
|
||||
- [ ] **Testar 2-3 referencias exemplo**: Verificar que obtem valores correctos antes de construir modelo completo
|
||||
- [ ] **Mapeamento de colunas**: Confirmar que colunas Excel correspondem (ex.: coluna 64 = BL, nao BK)
|
||||
- [ ] **Offset de linhas**: Lembrar que linhas Excel sao 1-indexed (DataFrame linha 5 = Excel linha 6)
|
||||
|
||||
### Armadilhas comuns
|
||||
- [ ] **Tratamento de NaN**: Verificar valores nulos com `pd.notna()`
|
||||
- [ ] **Colunas distantes**: Dados FY frequentemente em colunas 50+
|
||||
- [ ] **Multiplas correspondencias**: Pesquisar todas as ocorrencias, nao apenas a primeira
|
||||
- [ ] **Divisao por zero**: Verificar denominadores antes de usar `/` em formulas (#DIV/0!)
|
||||
- [ ] **Referencias erradas**: Verificar que todas as referencias apontam para celulas pretendidas (#REF!)
|
||||
- [ ] **Referencias entre folhas**: Usar formato correcto (Folha1!A1) para ligar folhas
|
||||
|
||||
### Estrategia de teste de formulas
|
||||
- [ ] **Comecar pequeno**: Testar formulas em 2-3 celulas antes de aplicar amplamente
|
||||
- [ ] **Verificar dependencias**: Confirmar que todas as celulas referenciadas existem
|
||||
- [ ] **Testar edge cases**: Incluir zero, negativos e valores muito grandes
|
||||
|
||||
### Interpretar output do scripts/recalc.py
|
||||
O script retorna JSON com detalhes de erros:
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"total_errors": 0,
|
||||
"total_formulas": 42,
|
||||
"error_summary": {
|
||||
"#REF!": {
|
||||
"count": 2,
|
||||
"locations": ["Folha1!B5", "Folha1!C10"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Boas praticas
|
||||
|
||||
### Seleccao de biblioteca
|
||||
- **pandas**: Melhor para analise de dados, operacoes em massa e exportacao simples
|
||||
- **openpyxl**: Melhor para formatacao complexa, formulas e funcionalidades especificas do Excel
|
||||
|
||||
### Trabalhar com openpyxl
|
||||
- Indices de celula sao 1-based (row=1, column=1 refere-se a celula A1)
|
||||
- Usar `data_only=True` para ler valores calculados: `load_workbook('ficheiro.xlsx', data_only=True)`
|
||||
- **Atencao**: Se aberto com `data_only=True` e guardado, as formulas sao substituidas por valores e perdidas permanentemente
|
||||
- Para ficheiros grandes: Usar `read_only=True` para leitura ou `write_only=True` para escrita
|
||||
- Formulas sao preservadas mas nao avaliadas — usar scripts/recalc.py para actualizar valores
|
||||
|
||||
### Trabalhar com pandas
|
||||
- Especificar tipos de dados para evitar problemas de inferencia: `pd.read_excel('ficheiro.xlsx', dtype={'id': str})`
|
||||
- Para ficheiros grandes, ler colunas especificas: `pd.read_excel('ficheiro.xlsx', usecols=['A', 'C', 'E'])`
|
||||
- Tratar datas correctamente: `pd.read_excel('ficheiro.xlsx', parse_dates=['coluna_data'])`
|
||||
|
||||
## Estilo de codigo
|
||||
**IMPORTANTE**: Ao gerar codigo Python para operacoes Excel:
|
||||
- Escrever codigo Python minimo e conciso sem comentarios desnecessarios
|
||||
- Evitar nomes de variaveis verbosos e operacoes redundantes
|
||||
- Evitar print statements desnecessarios
|
||||
|
||||
**Para os ficheiros Excel em si**:
|
||||
- Adicionar comentarios em celulas com formulas complexas ou pressupostos importantes
|
||||
- Documentar fontes de dados para valores hardcoded
|
||||
- Incluir notas para calculos-chave e seccoes do modelo
|
||||
|
||||
---
|
||||
|
||||
## Integracao Descomplicar
|
||||
|
||||
### Acesso a ficheiros via MCP filesystem
|
||||
```python
|
||||
# Ler ficheiros do sistema local
|
||||
mcp__filesystem__read_file(path="/media/ealmeida/Dados/...")
|
||||
|
||||
# Listar ficheiros para encontrar spreadsheets
|
||||
mcp__filesystem__list_directory(path="/media/ealmeida/Dados/GDrive/Cloud/Descomplicar/")
|
||||
```
|
||||
|
||||
### Integracao com Moloni (facturacao)
|
||||
Para exportar dados de facturacao Moloni para Excel:
|
||||
```python
|
||||
# Obter facturas do Moloni
|
||||
mcp__moloni__moloni_documents_invoices_getall(company_id=..., year=2026)
|
||||
|
||||
# Obter produtos
|
||||
mcp__moloni__moloni_products_products_getall(company_id=..., category_id=...)
|
||||
|
||||
# Obter clientes
|
||||
mcp__moloni__moloni_entities_customers_getall(company_id=...)
|
||||
```
|
||||
|
||||
### Integracao com Desk CRM
|
||||
Para exportar dados do CRM para Excel:
|
||||
```python
|
||||
# Relatorio de clientes
|
||||
mcp__desk-crm-v3__get_customers(limit=100)
|
||||
|
||||
# Relatorio de facturas
|
||||
mcp__desk-crm-v3__invoice_analytics(period="this_year")
|
||||
|
||||
# Relatorio de despesas
|
||||
mcp__desk-crm-v3__expense_analytics(period="this_year")
|
||||
```
|
||||
|
||||
### Tabela de precos Descomplicar
|
||||
O ficheiro de referencia de precos esta em:
|
||||
`/media/ealmeida/Dados/GDrive/Cloud/Descomplicar/Servicos/tabela-geral.csv`
|
||||
|
||||
---
|
||||
**Versao**: 1.0.0 | **Autor**: Descomplicar®
|
||||
|
||||
---
|
||||
|
||||
## Healing Log
|
||||
|
||||
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
|
||||
|
||||
```jsonl
|
||||
{"date":"","issue":"","fix":"","source":"user|auto"}
|
||||
```
|
||||
|
||||
*Adicionar nova linha após cada erro corrigido.*
|
||||
|
||||
@@ -5,7 +5,6 @@ description: "Extrai transcrições e metadados de vídeos, playlists e canais Y
|
||||
version: "1.0.0"
|
||||
created: 2026-04-04
|
||||
tools: [Bash]
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# Skill: /youtube-extract
|
||||
|
||||
Reference in New Issue
Block a user