Compare commits
3 Commits
e2c3afd4e2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b3a6f2698 | |||
| 9404af7ac9 | |||
| f2b5171ea2 |
@@ -9,7 +9,7 @@
|
|||||||
{
|
{
|
||||||
"name": "automacao",
|
"name": "automacao",
|
||||||
"source": "./automacao",
|
"source": "./automacao",
|
||||||
"description": "Process automation with n8n workflows, Moloni integration, Dify, Flowise, Typebot, Chatwoot and AI tools. Backed by 9 Dify KB datasets.",
|
"description": "Process automation with n8n workflows, Moloni integration, Flowise, Typebot, Chatwoot and AI tools. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
{
|
{
|
||||||
"name": "crm-ops",
|
"name": "crm-ops",
|
||||||
"source": "./crm-ops",
|
"source": "./crm-ops",
|
||||||
"description": "CRM operations, sales management, leads, customers, estimates, invoices, tickets and expense tracking with Desk CRM. Backed by 2 Dify KB datasets.",
|
"description": "CRM operations, sales management, leads, customers, estimates, invoices, tickets and expense tracking with Desk CRM. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -29,8 +29,8 @@
|
|||||||
{
|
{
|
||||||
"name": "design-media",
|
"name": "design-media",
|
||||||
"source": "./design-media",
|
"source": "./design-media",
|
||||||
"description": "UI/UX design, web design, video production with Remotion and PowerPoint generation. Backed by 3 Dify KB datasets.",
|
"description": "Motor de design profissional multi-marca. 5 MCPs (Presenton, Penpot, Stitch, Figma, Design-Engine), 8 agents, 4 skills. Apresentacoes, infograficos, social media, web pages, logos, identidade visual.",
|
||||||
"version": "1.0.0",
|
"version": "2.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
"url": "https://descomplicar.pt"
|
"url": "https://descomplicar.pt"
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
{
|
{
|
||||||
"name": "dev-tools",
|
"name": "dev-tools",
|
||||||
"source": "./dev-tools",
|
"source": "./dev-tools",
|
||||||
"description": "PHP, React, Next.js development, database design and frontend patterns. Backed by 7 Dify KB datasets.",
|
"description": "PHP, React, Next.js development, database design and frontend patterns. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
{
|
{
|
||||||
"name": "gestao",
|
"name": "gestao",
|
||||||
"source": "./gestao",
|
"source": "./gestao",
|
||||||
"description": "Project management, time tracking, daily checkups, worklogs, reflections, knowledge management and archiving. Backed by 6 Dify KB datasets.",
|
"description": "Project management, time tracking, daily checkups, worklogs, reflections, knowledge management and archiving. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -57,20 +57,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "hello-plugin",
|
"name": "core-tools",
|
||||||
"source": "./hello-plugin",
|
"source": "./core-tools",
|
||||||
"description": "Plugin de exemplo para Claude Code. Demonstra skills, agents e hooks num formato minimo e didactico.",
|
"description": "Core system tools for plugin management, metrics, and infrastructure meta-operations.",
|
||||||
"version": "1.0.0",
|
"version": "2.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Emanuel Almeida",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
"url": "https://descomplicar.pt"
|
"url": "https://descomplicar.pt"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "infraestrutura",
|
"name": "infraestrutura",
|
||||||
"source": "./infraestrutura",
|
"source": "./infraestrutura",
|
||||||
"description": "Server management, CWP administration, EasyPanel deployments, security audits, backups and MCP development. Backed by 4 Dify KB datasets.",
|
"description": "Server management, Proxmox VE/PBS/Clustering, CWP administration, EasyPanel deployments, security audits, backups and MCP development. Backed by NotebookLM notebooks (Proxmox 150+ sources).",
|
||||||
"version": "1.0.0",
|
"version": "1.1.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
"url": "https://descomplicar.pt"
|
"url": "https://descomplicar.pt"
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
{
|
{
|
||||||
"name": "marketing",
|
"name": "marketing",
|
||||||
"source": "./marketing",
|
"source": "./marketing",
|
||||||
"description": "Digital marketing strategy, SEO, content marketing, social media, ads, copywriting, video and YouTube. Backed by 25 Dify KB datasets including 10 marketing mentors.",
|
"description": "Digital marketing strategy, SEO, content marketing, social media, ads, copywriting, video and YouTube. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
{
|
{
|
||||||
"name": "negocio",
|
"name": "negocio",
|
||||||
"source": "./negocio",
|
"source": "./negocio",
|
||||||
"description": "E-commerce architecture, SaaS strategy, product management, competitive research and financial management. Backed by 5 Dify KB datasets.",
|
"description": "E-commerce architecture, SaaS strategy, product management, competitive research and financial management. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
{
|
{
|
||||||
"name": "perfex-dev",
|
"name": "perfex-dev",
|
||||||
"source": "./perfex-dev",
|
"source": "./perfex-dev",
|
||||||
"description": "Perfex CRM module development - controllers, views, forms, hooks, menus, migrations, permissions, security and database. Backed by 1 Dify KB dataset.",
|
"description": "Perfex CRM module development - controllers, views, forms, hooks, menus, migrations, permissions, security and database. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -119,7 +119,17 @@
|
|||||||
{
|
{
|
||||||
"name": "wordpress",
|
"name": "wordpress",
|
||||||
"source": "./wordpress",
|
"source": "./wordpress",
|
||||||
"description": "WordPress development, maintenance and optimization - plugins, themes, WooCommerce, Elementor, Crocoblock. Backed by 6 Dify KB datasets.",
|
"description": "WordPress development, maintenance and optimization - plugins, themes, WooCommerce, Elementor, Crocoblock. Backed by NotebookLM notebooks.",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
|
"url": "https://descomplicar.pt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "metabase",
|
||||||
|
"source": "./metabase",
|
||||||
|
"description": "Metabase BI analytics - dashboards, SQL queries, database exploration and reporting via bi.descomplicar.pt. Powered by metabase-ai-assistant MCP.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "automacao",
|
"name": "automacao",
|
||||||
"description": "Process automation with n8n workflows, Moloni integration, Dify, Flowise, Typebot, Chatwoot and AI tools. Backed by 9 Dify KB datasets.",
|
"description": "Process automation with n8n workflows, Moloni integration, Flowise, Typebot, Chatwoot and AI tools. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
@@ -8,5 +8,5 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins",
|
"homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"keywords": ["automacao", "n8n", "moloni", "dify", "workflows", "integracao"]
|
"keywords": ["automacao", "n8n", "moloni", "workflows", "integracao"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,16 @@ role: Líder técnico de automação e orquestração
|
|||||||
domain: Automation
|
domain: Automation
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- n8n
|
||||||
|
- ssh-unified
|
||||||
|
recommended_mcps:
|
||||||
|
- gitea
|
||||||
|
- memory-supabase
|
||||||
|
- filesystem
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1492
|
desk_task: 1492
|
||||||
@@ -139,13 +149,14 @@ Trigger → [Passo 1] → [Passo 2] → Output
|
|||||||
6. Registar performance
|
6. Registar performance
|
||||||
```
|
```
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"n8n" query:"workflows automacao integracao"
|
mcp__notebooklm__notebook_query notebook_id:"f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1" query:"workflows automacao integracao"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Ferramentas de Automacao e IA" query:"AI agents orchestration"
|
mcp__notebooklm__notebook_query notebook_id:"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8" query:"AI agents orchestration"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Dify" query:"LLM workflows deployment"
|
mcp__notebooklm__notebook_query notebook_id:"929ef67b-c131-4f01-abd0-8b078491a6b7" query:"LLM workflows deployment"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Flowise" query:"chatbots automation"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Your Available MCPs
|
## Your Available MCPs
|
||||||
@@ -157,16 +168,14 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Flowise" query:"chatbots automa
|
|||||||
- **gitea** - Repositórios Git, issues, PRs
|
- **gitea** - Repositórios Git, issues, PRs
|
||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
- **memory-supabase** - Memória longo prazo
|
- **memory-supabase** - Memória longo prazo
|
||||||
- **dify-kb** - Knowledge base AI
|
- **** - Knowledge base AI
|
||||||
- **filesystem** - Ficheiros locais
|
- **filesystem** - Ficheiros locais
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
moloni, context7, cwp, 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, magic, vimeo, design-systems, replicate
|
moloni, context7, cwp, 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, magic, vimeo, design-systems, replicate
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -188,20 +197,16 @@ moloni, context7, cwp, google-analytics, google-workspace, imap, outline-api, yo
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /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, /metrics
|
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /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, /metrics
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Colaboração
|
## Colaboração
|
||||||
|
|
||||||
- **Reports to**: CTO
|
- **Reports to**: CTO
|
||||||
- **Colabora com**: N8N Automation Expert, MCP Protocol Developer, Development Lead, All department heads
|
- **Colabora com**: N8N Automation Expert, MCP Protocol Developer, Development Lead, All department heads
|
||||||
- **Escalar para**: CTO (decisões estratégicas), Security Compliance Specialist (segurança workflows)
|
- **Escalar para**: CTO (decisões estratégicas), Security Compliance Specialist (segurança workflows)
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **2 SDKs** (TaskForce teams):
|
You are part of **2 SDKs** (TaskForce teams):
|
||||||
@@ -211,9 +216,6 @@ You are part of **2 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce Claude Workflow
|
### TaskForce Claude Workflow
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -7,6 +7,16 @@ role: Especialista em desenvolvimento de servidores MCP e integracoes para o eco
|
|||||||
domain: Dev
|
domain: Dev
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- gitea
|
||||||
|
- ssh-unified
|
||||||
|
recommended_mcps:
|
||||||
|
- context7
|
||||||
|
- filesystem
|
||||||
|
- memory-supabase
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1508
|
desk_task: 1508
|
||||||
@@ -29,8 +39,6 @@ created: '2025-01-13'
|
|||||||
updated: '2026-02-04'
|
updated: '2026-02-04'
|
||||||
author: Descomplicar®
|
author: Descomplicar®
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# MCP Protocol Developer Descomplicar
|
# MCP Protocol Developer Descomplicar
|
||||||
|
|
||||||
Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e ferramentas customizadas que expandem o ecossistema Model Context Protocol.
|
Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e ferramentas customizadas que expandem o ecossistema Model Context Protocol.
|
||||||
@@ -42,11 +50,14 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe
|
|||||||
- Design de estrategias de caching e transformacao de dados
|
- Design de estrategias de caching e transformacao de dados
|
||||||
- Testes de compliance e validacao de protocolo MCP
|
- Testes de compliance e validacao de protocolo MCP
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"MCP Servers" query:"protocol development tools integration"
|
mcp__notebooklm__notebook_query notebook_id:"73102308-70ef-403e-9be9-eae0cfc62d55" query:"protocol development tools integration"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Claude Code" query:"MCP server configuration"
|
mcp__notebooklm__notebook_query notebook_id:"2876d1fe-5cea-4d98-8140-b0e1a81c6bc4" query:"MCP server configuration"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"typescript nodejs api development"
|
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"typescript nodejs api development"
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -98,7 +109,7 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe
|
|||||||
## MCPs Relevantes
|
## MCPs Relevantes
|
||||||
- `gitea`: Gestão de código MCP
|
- `gitea`: Gestão de código MCP
|
||||||
- `desk-crm-v3`: Tracking desenvolvimento (Proj #65, Milestone 256)
|
- `desk-crm-v3`: Tracking desenvolvimento (Proj #65, Milestone 256)
|
||||||
- `dify-kb`: KB MCP Servers, Claude Code, Desenvolvimento Software
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB MCP Servers, Claude Code, Desenvolvimento Software
|
||||||
- `ssh-unified`: Deploy em servidores
|
- `ssh-unified`: Deploy em servidores
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -120,9 +131,10 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe
|
|||||||
- SSH, SFTP, servidor management
|
- SSH, SFTP, servidor management
|
||||||
- Usage: `mcp__ssh-unified__*`
|
- Usage: `mcp__ssh-unified__*`
|
||||||
|
|
||||||
✓ **dify-kb** (knowledge)
|
✓ **notebooklm** (knowledge primaria)
|
||||||
|
✓ **** (knowledge fallback)
|
||||||
- Knowledge base AI
|
- Knowledge base AI
|
||||||
- Usage: `mcp__dify-kb__*`
|
- Usage: `mcp____*`
|
||||||
|
|
||||||
### Recommended for dev
|
### Recommended for dev
|
||||||
- **context7** - Context documentation
|
- **context7** - Context documentation
|
||||||
@@ -133,13 +145,11 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe
|
|||||||
- **cwp** - CentOS Web Panel
|
- **cwp** - CentOS Web Panel
|
||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
|
|
||||||
### All Available (33 total)
|
### 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, wikijs, 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.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -173,13 +183,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### 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
|
/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.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **2 SDKs** (TaskForce teams):
|
You are part of **2 SDKs** (TaskForce teams):
|
||||||
@@ -189,9 +197,6 @@ You are part of **2 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce MCP
|
### TaskForce MCP
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -7,6 +7,15 @@ role: Especialista em automacao de processos usando N8N para criacao de workflow
|
|||||||
domain: Automation
|
domain: Automation
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- n8n
|
||||||
|
- desk-crm-v3
|
||||||
|
recommended_mcps:
|
||||||
|
- ssh-unified
|
||||||
|
- gitea
|
||||||
|
- filesystem
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1509
|
desk_task: 1509
|
||||||
@@ -29,8 +38,6 @@ created: '2025-01-13'
|
|||||||
updated: '2026-02-04'
|
updated: '2026-02-04'
|
||||||
author: Descomplicar®
|
author: Descomplicar®
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# N8N Automation Expert Descomplicar
|
# N8N Automation Expert Descomplicar
|
||||||
|
|
||||||
Especialista em design, desenvolvimento e optimizacao de workflows automatizados usando N8N para automacao de processos e integracao seamless de sistemas.
|
Especialista em design, desenvolvimento e optimizacao de workflows automatizados usando N8N para automacao de processos e integracao seamless de sistemas.
|
||||||
@@ -42,11 +49,14 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados
|
|||||||
- Implementacao de error handling robusto e retry logic
|
- Implementacao de error handling robusto e retry logic
|
||||||
- Monitorizacao e alertas para saude dos workflows
|
- Monitorizacao e alertas para saude dos workflows
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"n8n" query:"workflow automation nodes triggers"
|
mcp__notebooklm__notebook_query notebook_id:"f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1" query:"workflow automation nodes triggers"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Ferramentas de Automacao e IA" query:"process automation integration"
|
mcp__notebooklm__notebook_query notebook_id:"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8" query:"process automation integration"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Dify" query:"AI automation workflows"
|
mcp__notebooklm__notebook_query notebook_id:"929ef67b-c131-4f01-abd0-8b078491a6b7" query:"AI automation workflows"
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -98,7 +108,7 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados
|
|||||||
|
|
||||||
## MCPs Relevantes
|
## MCPs Relevantes
|
||||||
- `desk-crm-v3`: Dados para automações (leads, tarefas)
|
- `desk-crm-v3`: Dados para automações (leads, tarefas)
|
||||||
- `dify-kb`: KB n8n, Ferramentas Automação, Dify
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG)
|
||||||
- `memory-supabase`: Histórico de workflows criados
|
- `memory-supabase`: Histórico de workflows criados
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -116,9 +126,10 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados
|
|||||||
- Workflows automation
|
- Workflows automation
|
||||||
- Usage: `mcp__n8n__*`
|
- Usage: `mcp__n8n__*`
|
||||||
|
|
||||||
✓ **dify-kb** (knowledge)
|
✓ **notebooklm** (knowledge primaria)
|
||||||
|
✓ **** (knowledge fallback)
|
||||||
- Knowledge base AI
|
- Knowledge base AI
|
||||||
- Usage: `mcp__dify-kb__*`
|
- Usage: `mcp____*`
|
||||||
|
|
||||||
✓ **memory-supabase** (system)
|
✓ **memory-supabase** (system)
|
||||||
- Memória longo prazo
|
- Memória longo prazo
|
||||||
@@ -130,13 +141,11 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados
|
|||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
- **filesystem** - Ficheiros locais
|
- **filesystem** - Ficheiros locais
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
moloni, context7, cwp, 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, magic, vimeo, design-systems, replicate
|
moloni, context7, cwp, 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, magic, vimeo, design-systems, replicate
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -158,13 +167,11 @@ moloni, context7, cwp, google-analytics, google-workspace, imap, outline-api, yo
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /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, /metrics
|
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /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, /metrics
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **2 SDKs** (TaskForce teams):
|
You are part of **2 SDKs** (TaskForce teams):
|
||||||
@@ -174,9 +181,6 @@ You are part of **2 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce Claude Workflow
|
### TaskForce Claude Workflow
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -1,15 +1,40 @@
|
|||||||
{
|
{
|
||||||
"description": "Dify KB datasets for Automation domain",
|
"description": "Knowledge sources for Automation domain",
|
||||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
"sources": {
|
||||||
"datasets": [
|
"notebooklm": {
|
||||||
{"id": "f14521df-c44a-48f0-8703-b1d1cf77ca05", "name": "n8n", "priority": 1, "document_count": 1, "word_count": 206928},
|
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||||
{"id": "44d1517b-65b8-4d81-8253-5683ff0b8830", "name": "Dify", "priority": 1, "document_count": 4, "word_count": 1244175},
|
"query_tool": "mcp__notebooklm__notebook_query",
|
||||||
{"id": "b0a5e9e6-0d39-4e56-8c61-72c8e14ca41d", "name": "Flowise", "priority": 2, "document_count": 3, "word_count": 245565},
|
"notebooks": [
|
||||||
{"id": "b3e994c9-f642-4f23-a3db-8d9e344d489f", "name": "Typebot", "priority": 2, "document_count": 1, "word_count": 79608},
|
{
|
||||||
{"id": "728bed1f-79cb-4e56-aa8a-8dd961197354", "name": "Chatwoot", "priority": 2, "document_count": 7, "word_count": 149615},
|
"id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1",
|
||||||
{"id": "76f14ca9-7e11-4924-9ebc-ccd79876aa78", "name": "Baserow", "priority": 2, "document_count": 1, "word_count": 53665},
|
"title": "n8n",
|
||||||
{"id": "ebf7e4aa-5d2c-49f0-bbb3-f73711a9e0b3", "name": "Open WebUI", "priority": 2, "document_count": 3, "word_count": 15266191},
|
"topics": [
|
||||||
{"id": "22f1d0cf-0661-4a5d-ad0e-b3c1cd2c234a", "name": "Ferramentas Automacao e IA", "priority": 1, "document_count": 41, "word_count": 805400},
|
"n8n"
|
||||||
{"id": "a8987108-2121-4e55-b055-67fe70f8aae0", "name": "Moodle", "priority": 3, "document_count": 40, "word_count": 764457}
|
]
|
||||||
]
|
},
|
||||||
|
{
|
||||||
|
"id": "929ef67b-c131-4f01-abd0-8b078491a6b7",
|
||||||
|
"title": "AI Automation Stack",
|
||||||
|
"topics": [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "be6f72ac-f8ba-4337-912d-abd5dd448519",
|
||||||
|
"title": "Open WebUI",
|
||||||
|
"topics": [
|
||||||
|
"open",
|
||||||
|
"webui"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8",
|
||||||
|
"title": "Transformacao Digital e IA",
|
||||||
|
"topics": [
|
||||||
|
"ferramentas",
|
||||||
|
"automacao"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: moloni-api
|
name: moloni-api
|
||||||
description: >-
|
description: Referência da API Moloni v2 para facturação portuguesa — autenticação, documentos, clientes e produtos.
|
||||||
Moloni API v2 para facturacao portuguesa - autenticacao, documentos, clientes, produtos.
|
|
||||||
Usar quando trabalhar com Moloni API, criar/consultar facturas, recibos, notas de credito,
|
|
||||||
clientes, ou qualquer operacao de facturacao via Moloni. Triggers: moloni, factura, recibo,
|
|
||||||
nota de credito, billing, invoicing, facturacao portuguesa.
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Moloni API v2
|
# Moloni API v2
|
||||||
|
|||||||
@@ -1,7 +1,29 @@
|
|||||||
|
---
|
||||||
|
name: n8n-chatbot
|
||||||
|
description: Criação de chatbots e workflows com inteligência artificial usando LangChain no n8n.
|
||||||
|
---
|
||||||
|
|
||||||
# /n8n-chatbot - Chatbots e AI Agents n8n
|
# /n8n-chatbot - Chatbots e AI Agents n8n
|
||||||
|
|
||||||
Criar chatbots e workflows com AI usando LangChain.
|
Criar chatbots e workflows com AI usando LangChain.
|
||||||
|
|
||||||
|
## Contexto NotebookLM
|
||||||
|
|
||||||
|
ANTES de executar, consultar notebooks para contexto especializado:
|
||||||
|
|
||||||
|
| Notebook | ID | Consultar quando |
|
||||||
|
|----------|-----|-----------------|
|
||||||
|
| n8n Deep Research | f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1 | Sempre |
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1",
|
||||||
|
query: "<adaptar ao contexto do pedido do utilizador>"
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Integrar insights do NotebookLM nas recomendações e decisões.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Uso
|
## Uso
|
||||||
|
|||||||
@@ -1,7 +1,29 @@
|
|||||||
|
---
|
||||||
|
name: n8n-health
|
||||||
|
description: Diagnóstico de conectividade e estado da instância n8n. Verificação de saúde do sistema.
|
||||||
|
---
|
||||||
|
|
||||||
# /n8n-health - Diagnóstico n8n
|
# /n8n-health - Diagnóstico n8n
|
||||||
|
|
||||||
Verificar conectividade e estado da instância n8n.
|
Verificar conectividade e estado da instância n8n.
|
||||||
|
|
||||||
|
## Contexto NotebookLM
|
||||||
|
|
||||||
|
ANTES de executar, consultar notebooks para contexto especializado:
|
||||||
|
|
||||||
|
| Notebook | ID | Consultar quando |
|
||||||
|
|----------|-----|-----------------|
|
||||||
|
| n8n Deep Research | f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1 | Sempre |
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1",
|
||||||
|
query: "<adaptar ao contexto do pedido do utilizador>"
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Integrar insights do NotebookLM nas recomendações e decisões.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Uso
|
## Uso
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
---
|
||||||
|
name: n8n-notify
|
||||||
|
description: Criação de sistemas de notificações e alertas n8n via Slack, email e SMS.
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
# /n8n-notify - Notificações e Alertas n8n
|
# /n8n-notify - Notificações e Alertas n8n
|
||||||
|
|
||||||
Criar sistemas de alertas via Slack, email, SMS.
|
Criar sistemas de alertas via Slack, email, SMS.
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
---
|
||||||
|
name: n8n-schedule
|
||||||
|
description: Criação de workflows n8n com execução agendada via cron para automações recorrentes.
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
# /n8n-schedule - Automações Agendadas n8n
|
# /n8n-schedule - Automações Agendadas n8n
|
||||||
|
|
||||||
Criar workflows com execução agendada (cron).
|
Criar workflows com execução agendada (cron).
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
---
|
||||||
|
name: n8n-sync
|
||||||
|
description: Sincronização de dados entre sistemas via workflows n8n. Mantém dados consistentes entre plataformas.
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
# /n8n-sync - Sincronização de Dados n8n
|
# /n8n-sync - Sincronização de Dados n8n
|
||||||
|
|
||||||
Manter dados sincronizados entre sistemas.
|
Manter dados sincronizados entre sistemas.
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
---
|
||||||
|
name: n8n-webhook
|
||||||
|
description: Criação e gestão de webhooks n8n para receber dados de sistemas externos.
|
||||||
|
---
|
||||||
|
|
||||||
# /n8n-webhook - Webhooks n8n
|
# /n8n-webhook - Webhooks n8n
|
||||||
|
|
||||||
Criar e gerir webhooks para receber dados externos.
|
Criar e gerir webhooks para receber dados externos.
|
||||||
|
|||||||
12
core-tools/.claude-plugin/plugin.json
Normal file
12
core-tools/.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "core-tools",
|
||||||
|
"description": "Core system tools for plugin management, metrics, and infrastructure meta-operations",
|
||||||
|
"version": "2.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Descomplicar",
|
||||||
|
"url": "https://descomplicar.pt"
|
||||||
|
},
|
||||||
|
"homepage": "https://descomplicar.pt",
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": ["core", "plugins", "management", "profiles", "infrastructure", "meta"]
|
||||||
|
}
|
||||||
41
core-tools/README.md
Normal file
41
core-tools/README.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Core Tools Plugin
|
||||||
|
|
||||||
|
**Versão:** 1.0.0
|
||||||
|
**Autor:** Descomplicar®
|
||||||
|
**Desk Project:** #65 Stack Workflow
|
||||||
|
|
||||||
|
## Descrição
|
||||||
|
|
||||||
|
Core system tools for Claude Code infrastructure and meta-management.
|
||||||
|
|
||||||
|
Este plugin contém skills fundamentais para gestão e manutenção do ecossistema Claude Code.
|
||||||
|
|
||||||
|
## Skills Incluídas
|
||||||
|
|
||||||
|
### Infraestrutura
|
||||||
|
- **infrastructure-manager** - Gestão automatizada da infraestrutura Claude Code
|
||||||
|
- **db-maintenance-manager** - Manutenção das tabelas cr_* do sistema
|
||||||
|
- **relationship-manager** - Gestão de relacionamentos entre componentes
|
||||||
|
|
||||||
|
### Plugins & Componentes
|
||||||
|
- **plugin-manager** - Gestão dinâmica de plugins (activar/desactivar por perfil)
|
||||||
|
- **plugin-curator** - Curadoria inteligente de plugins
|
||||||
|
- **component-generator** - Gera skills/agents/commands automaticamente
|
||||||
|
- **quality-validator** - Valida componentes contra standards
|
||||||
|
|
||||||
|
### Agentes
|
||||||
|
- **agent-context-injector** - Injeta contexto específico quando um agente é iniciado
|
||||||
|
|
||||||
|
### Métricas
|
||||||
|
- **metrics** - Dashboard de performance com ROI e telemetria
|
||||||
|
|
||||||
|
### Core
|
||||||
|
- **_core** - Padrões fundamentais Descomplicar® (Sacred Rules, Excellence Standards, MCP Protocol)
|
||||||
|
|
||||||
|
## Utilização
|
||||||
|
|
||||||
|
Skills activadas automaticamente pelo sistema quando necessário.
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
infrastructure, meta, system, core
|
||||||
23
core-tools/plugin.json
Normal file
23
core-tools/plugin.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "core-tools",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Core system tools for Claude Code infrastructure and meta-management",
|
||||||
|
"author": "Descomplicar®",
|
||||||
|
"skills": [
|
||||||
|
"agent-context-injector",
|
||||||
|
"component-generator",
|
||||||
|
"metrics",
|
||||||
|
"plugin-curator",
|
||||||
|
"plugin-manager",
|
||||||
|
"quality-validator",
|
||||||
|
"relationship-manager",
|
||||||
|
"infrastructure-manager",
|
||||||
|
"db-maintenance-manager",
|
||||||
|
"_core"
|
||||||
|
],
|
||||||
|
"agents": [],
|
||||||
|
"hooks": [],
|
||||||
|
"commands": [],
|
||||||
|
"tags": ["infrastructure", "meta", "system", "core"],
|
||||||
|
"desk_project": 65
|
||||||
|
}
|
||||||
124
core-tools/skills/_core/SKILL.md
Normal file
124
core-tools/skills/_core/SKILL.md
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
---
|
||||||
|
name: core-descomplicar
|
||||||
|
description: Padrões fundamentais Descomplicar® — regras sagradas, standards de excelência e protocolo MCP. Skill base para todos os agentes.
|
||||||
|
user-invocable: false
|
||||||
|
---
|
||||||
|
|
||||||
|
# Core Standards Descomplicar®
|
||||||
|
|
||||||
|
Padrões obrigatórios para todos os agentes do sistema.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔟 REGRAS SAGRADAS
|
||||||
|
|
||||||
|
### 1. É permitido falhar
|
||||||
|
Reportar erros com transparência. Falhar rápido, aprender mais rápido.
|
||||||
|
|
||||||
|
### 2. Transparência e honestidade
|
||||||
|
Comunicar claramente. Não omitir informações.
|
||||||
|
|
||||||
|
### 3. Más notícias primeiro
|
||||||
|
Escalar problemas imediatamente.
|
||||||
|
|
||||||
|
### 4. Foco na resolução
|
||||||
|
Todo problema deve incluir soluções propostas.
|
||||||
|
|
||||||
|
### 5. Nunca prejudicar
|
||||||
|
Princípio "do no harm". Proteger dados e sistemas.
|
||||||
|
|
||||||
|
### 6. Passar a bola certa
|
||||||
|
Delegar para o especialista quando necessário.
|
||||||
|
|
||||||
|
### 7. 3x antes de escalar
|
||||||
|
Três tentativas documentadas antes de escalação.
|
||||||
|
|
||||||
|
### 8. Feedback protocol
|
||||||
|
Crítica privada, elogio público.
|
||||||
|
|
||||||
|
### 9. Perguntar sempre
|
||||||
|
Pedir esclarecimento quando incerto.
|
||||||
|
|
||||||
|
### 10. Crescimento contínuo
|
||||||
|
Mentalidade de aprendizagem constante.
|
||||||
|
|
||||||
|
### 11. CWP: Zero Invenção (CLAUDE.md #38)
|
||||||
|
Sempre pesquisar wiki CWP e skills `/cwp-*` antes de qualquer operação CWP. Apenas scripts oficiais (`/scripts/*`). Nunca inventar comandos ou paths CWP sem verificação prévia.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 PADRÕES DE EXCELÊNCIA
|
||||||
|
|
||||||
|
### Qualidade Mínima: 100/100
|
||||||
|
|
||||||
|
- **Precisão**: 100% informação verificada
|
||||||
|
- **Completude**: Especificações cumpridas
|
||||||
|
- **Consistência**: Alinhamento com padrões
|
||||||
|
- **Usabilidade**: Solução funcional
|
||||||
|
- **Manutenibilidade**: Sustentável longo prazo
|
||||||
|
|
||||||
|
### Dados Reais Obrigatórios
|
||||||
|
|
||||||
|
**NUNCA simular quando dados reais existem.**
|
||||||
|
|
||||||
|
Hierarquia:
|
||||||
|
1. MCPs especializados (desk-crm, dify-kb, wikijs)
|
||||||
|
2. Sistemas internos (Gitea, Drive)
|
||||||
|
3. Documentação oficial (Context7)
|
||||||
|
4. Simulação APENAS se dados não existem
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ PROTOCOLO MCP (3 PASSOS)
|
||||||
|
|
||||||
|
### PASSO 1: Recuperação de Contexto
|
||||||
|
|
||||||
|
```
|
||||||
|
SEMPRE EXECUTAR PRIMEIRO:
|
||||||
|
1. mcp__memory-supabase__search_memories → Experiência histórica
|
||||||
|
2. mcp__wikijs__search_pages → Documentação interna
|
||||||
|
3. mcp__dify-kb__dify_kb_retrieve_segments → Knowledge base temática
|
||||||
|
```
|
||||||
|
|
||||||
|
### PASSO 2: Hierarquia de Fontes
|
||||||
|
|
||||||
|
```
|
||||||
|
🥇 1ª: MCPs especializados (memory-supabase, dify-kb, desk-crm-v3)
|
||||||
|
🥈 2ª: MCPs de sistema (wikijs, filesystem, google-workspace)
|
||||||
|
🥉 3ª: MCPs complementares (context7, puppeteer)
|
||||||
|
🔧 ÚLTIMO: Ferramentas nativas Claude
|
||||||
|
```
|
||||||
|
|
||||||
|
### PASSO 3: Captura de Aprendizagem
|
||||||
|
|
||||||
|
```
|
||||||
|
SEMPRE GUARDAR ao final:
|
||||||
|
mcp__memory-supabase__save_memory {
|
||||||
|
"content": "[Resumo do trabalho e decisões]",
|
||||||
|
"tags": ["[área]", "[projecto]", "[tipo]"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ CHECKLIST PRE-ENTREGA
|
||||||
|
|
||||||
|
- [ ] Dados verificados com fontes reais
|
||||||
|
- [ ] Qualidade técnica validada (100/100)
|
||||||
|
- [ ] Padrões Descomplicar® seguidos
|
||||||
|
- [ ] Documentação clara
|
||||||
|
- [ ] Testes executados (quando aplicável)
|
||||||
|
- [ ] Aprendizagens capturadas
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 OUTPUT
|
||||||
|
|
||||||
|
- **Assinatura**: `/** @author Descomplicar® | @link descomplicar.pt | @copyright 2026 */`
|
||||||
|
- **Markdown**: Obsidian-ready (frontmatter, wikilinks, callouts)
|
||||||
|
- **Língua**: Português Europeu (PT-PT)
|
||||||
|
- **Monetário**: 95€ (não 95,00€)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Core Standards v1.1 | 2026-03-12*
|
||||||
283
core-tools/skills/_core/datasets-mapping.json
Normal file
283
core-tools/skills/_core/datasets-mapping.json
Normal file
@@ -0,0 +1,283 @@
|
|||||||
|
{
|
||||||
|
"mapping": {
|
||||||
|
"analytics-insights-agent": {
|
||||||
|
"model": "haiku",
|
||||||
|
"tools": ["Read", "Glob", "Grep"],
|
||||||
|
"datasets": ["Marketing Digital", "Gestão de Marketing", "SEO (Search Engine Optimization)", "Gestão de Tráfego"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"},
|
||||||
|
{"id": "4c595973-ba10-420a-a3bf-e4389e424ad3", "title": "Marketing Digital PT"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"automation-lead": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["n8n", "Ferramentas de Automação e IA", "Dify", "Flowise"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", "title": "n8n"},
|
||||||
|
{"id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "title": "Transformacao Digital e IA"},
|
||||||
|
{"id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "title": "AI Automation Stack"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"backup-specialist": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["TI (Tecnologia da Informação)", "Linux", "CWP Centos Web Panel", "AWS (Amazon Web Services)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"},
|
||||||
|
{"id": "0ded7bd6-69b3-4c76-b327-452396bf7ea7", "title": "CWP"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"content-manager": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["Marketing de Conteúdo", "Copywriting", "Blogging", "Marketing Digital"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"},
|
||||||
|
{"id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "title": "Copywriting e Persuasao"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"copywriter": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Glob", "Grep"],
|
||||||
|
"datasets": ["Copywriting", "Marketing de Conteúdo", "Escrever PT-PT", "Branding"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "title": "Copywriting e Persuasao"},
|
||||||
|
{"id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "title": "Social Media e Branding"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"crm-admin-specialist": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["PerfexCRM", "Gestão", "Gestão de Processos"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"},
|
||||||
|
{"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"},
|
||||||
|
{"id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", "title": "Gestao de Operacoes"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"cwp-server-manager": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["CWP Centos Web Panel", "Linux", "TI (Tecnologia da Informação)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "0ded7bd6-69b3-4c76-b327-452396bf7ea7", "title": "CWP"},
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"database-design-specialist": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["TI (Tecnologia da Informação)", "Desenvolvimento de Software", "AWS (Amazon Web Services)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"},
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"dev-helper": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["Desenvolvimento de Software", "TI (Tecnologia da Informação)", "Claude Code"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"},
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"},
|
||||||
|
{"id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", "title": "Claude Code"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"development-lead": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["Desenvolvimento de Software", "Gestão de Projetos", "Estratégia"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"},
|
||||||
|
{"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"},
|
||||||
|
{"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"easypanel-specialist": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["TI (Tecnologia da Informação)", "Linux", "AWS (Amazon Web Services)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"finance-manager": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["Gestão", "Estratégia", "Estratégia Descomplicar"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"},
|
||||||
|
{"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"},
|
||||||
|
{"id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "title": "Descomplicar: Marketing Digital"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"javascript-fullstack-specialist": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["Desenvolvimento de Software", "TI (Tecnologia da Informação)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"},
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"lead-qualifier": {
|
||||||
|
"model": "haiku",
|
||||||
|
"tools": ["Read", "Glob", "Grep"],
|
||||||
|
"datasets": ["Vendas", "Marketing Digital", "PerfexCRM"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"},
|
||||||
|
{"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"marketing-planning-expert": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["Marketing Digital", "Gestão de Marketing", "Estratégia", "Marketing Redes Sociais"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"},
|
||||||
|
{"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"},
|
||||||
|
{"id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "title": "Social Media e Branding"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"master-orchestrator": {
|
||||||
|
"model": "opus",
|
||||||
|
"tools": ["Task", "Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["Gestão de Projetos", "Gestão", "Estratégia", "Estratégia Descomplicar"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"},
|
||||||
|
{"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"},
|
||||||
|
{"id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "title": "Descomplicar: Marketing Digital"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mcp-protocol-developer": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["MCP Servers", "Claude Code", "Desenvolvimento de Software"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "73102308-70ef-403e-9be9-eae0cfc62d55", "title": "Desenvolvimento de MCPs"},
|
||||||
|
{"id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", "title": "Claude Code"},
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"n8n-automation-expert": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["n8n", "Ferramentas de Automação e IA", "Dify"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", "title": "n8n"},
|
||||||
|
{"id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "title": "Transformacao Digital e IA"},
|
||||||
|
{"id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "title": "AI Automation Stack"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"perfex-crm-module-developer": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["PerfexCRM", "Desenvolvimento de Software"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"},
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"performance-optimization-engineer": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["TI (Tecnologia da Informação)", "Desenvolvimento de Software", "AWS (Amazon Web Services)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"},
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"php-fullstack-engineer": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["Desenvolvimento de Software", "WordPress", "TI (Tecnologia da Informação)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"},
|
||||||
|
{"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"},
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"project-manager": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["Gestão de Projetos", "Gestão", "Estratégia"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"},
|
||||||
|
{"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"sales-manager": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["Vendas", "Marketing Digital", "PerfexCRM"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"},
|
||||||
|
{"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "title": "Perfex CRM: Gestao de Clientes e Projetos"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"security-compliance-specialist": {
|
||||||
|
"model": "opus",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["TI (Tecnologia da Informação)", "Linux", "AWS (Amazon Web Services)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"seo-specialist": {
|
||||||
|
"model": "haiku",
|
||||||
|
"tools": ["Read", "Glob", "Grep"],
|
||||||
|
"datasets": ["SEO (Search Engine Optimization)", "Marketing Digital", "Marketing de Conteúdo"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "title": "Marketing Digital Avancado"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"software-project-planner": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["Gestão de Projetos", "Desenvolvimento de Software", "Estratégia"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "title": "Gestao de Projectos e Agile"},
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"},
|
||||||
|
{"id": "79d43410-0e29-4be1-881d-84db6bdc239a", "title": "Estrategia e Empreendedorismo"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ui-designer": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["UX e Usabilidade", "Desenvolvimento de WebSites", "Canva"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "081ca512-8279-4850-b2b9-dff090267482", "title": "UI/UX Design"},
|
||||||
|
{"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"},
|
||||||
|
{"id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "title": "Social Media e Branding"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"web-designer": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Glob", "Grep"],
|
||||||
|
"datasets": ["Desenvolvimento de WebSites", "WordPress", "Elementor", "UX e Usabilidade"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"},
|
||||||
|
{"id": "081ca512-8279-4850-b2b9-dff090267482", "title": "UI/UX Design"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"wordpress-performance-specialist": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["WordPress", "Elementor", "Crocoblock", "TI (Tecnologia da Informação)"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"},
|
||||||
|
{"id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "title": "Cloud e Infraestrutura TI"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"wordpress-plugin-developer": {
|
||||||
|
"model": "sonnet",
|
||||||
|
"tools": ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
|
||||||
|
"datasets": ["WordPress", "Crocoblock", "Elementor", "Desenvolvimento de Software"],
|
||||||
|
"notebooks": [
|
||||||
|
{"id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "title": "WordPress e Elementor"},
|
||||||
|
{"id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "title": "Programacao"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
128
core-tools/skills/_core/dify-integration-protocol.md
Normal file
128
core-tools/skills/_core/dify-integration-protocol.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Protocolo de Knowledge Sources v2.0
|
||||||
|
|
||||||
|
**Data:** 2026-02-12
|
||||||
|
**Propósito:** Consulta inteligente de conhecimento com dual-source (NotebookLM + Dify KB)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Visão Geral
|
||||||
|
|
||||||
|
Skills e agents consultam conhecimento via dual-source:
|
||||||
|
1. **NotebookLM** (primario) - Gemini 2.5 RAG com conhecimento curado
|
||||||
|
2. **Dify KB** (fallback) - Datasets tematicos quando NotebookLM insuficiente
|
||||||
|
|
||||||
|
## Fluxo de Consulta
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Skill/Agent precisa conhecimento
|
||||||
|
2. Consultar NotebookLM (primario)
|
||||||
|
→ mcp__notebooklm__notebook_query notebook_id:"<id>" query:"<tema>"
|
||||||
|
3. Se resultado suficiente → usar
|
||||||
|
4. Se insuficiente → consultar Dify KB (fallback)
|
||||||
|
→ mcp__dify-kb__dify_kb_retrieve_segments dataset:"<nome>" query:"<tema>"
|
||||||
|
5. Agregar resultados
|
||||||
|
```
|
||||||
|
|
||||||
|
## Como Consultar NotebookLM (Primario)
|
||||||
|
|
||||||
|
### 1. Identificar Notebook (via notebooklm-mapping.json)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Ler mapeamento
|
||||||
|
const mapping = require('./notebooklm-mapping.json').mapping;
|
||||||
|
const notebook = mapping['WordPress'];
|
||||||
|
// → {notebook_id: "5be0d1a6-...", notebook_title: "WordPress e Elementor"}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Consultar Notebook
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"elementor custom widgets"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Múltiplos Notebooks
|
||||||
|
|
||||||
|
Quando o tema cobre vários notebooks, consultar em paralelo:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Paralelo: WordPress + Dev
|
||||||
|
mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-..." query:"tema"
|
||||||
|
mcp__notebooklm__notebook_query notebook_id:"24947ffa-..." query:"tema"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Como Consultar Dify KB (Fallback)
|
||||||
|
|
||||||
|
### 1. Identificar Dataset
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||||
|
dataset: "WordPress",
|
||||||
|
query: "elementor custom widgets",
|
||||||
|
top_k: 5
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Consulta Paralela (Múltiplos Datasets)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Lançar consultas em paralelo para datasets prioritarios
|
||||||
|
const results = await Promise.all([
|
||||||
|
dify_kb_retrieve(dataset1, query),
|
||||||
|
dify_kb_retrieve(dataset2, query)
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Mapeamento Notebooks
|
||||||
|
|
||||||
|
Ficheiro central: `notebooklm-mapping.json` (mesmo directorio)
|
||||||
|
|
||||||
|
51 notebooks disponiveis cobrindo:
|
||||||
|
- Marketing (5 notebooks)
|
||||||
|
- Desenvolvimento (8 notebooks)
|
||||||
|
- Infraestrutura (3 notebooks)
|
||||||
|
- Gestao (3 notebooks)
|
||||||
|
- Negocio (4 notebooks)
|
||||||
|
- Automacao (3 notebooks)
|
||||||
|
- Design (2 notebooks)
|
||||||
|
|
||||||
|
## Template para Agents
|
||||||
|
|
||||||
|
Secção standard nos agents:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query notebook_id:"<uuid>" query:"<tema>"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__dify-kb__dify_kb_retrieve_segments dataset:"<nome>" query:"<tema>"
|
||||||
|
```
|
||||||
|
```
|
||||||
|
|
||||||
|
## Template para Skills
|
||||||
|
|
||||||
|
Adicionar no SKILL.md:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# PRIMARIO: NotebookLM (Gemini 2.5 RAG)
|
||||||
|
# mcp__notebooklm__notebook_query notebook_id:"<uuid>"
|
||||||
|
# FALLBACK: Dify KB
|
||||||
|
mcp__dify-kb__dify_kb_retrieve_segments dataset:"<nome>" query:"<tema>"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Metricas
|
||||||
|
|
||||||
|
Rastrear na instrumentacao:
|
||||||
|
- `kb_source`: "notebooklm" ou "dify"
|
||||||
|
- `kb_consulted`: 1 se consultou KB
|
||||||
|
- `kb_fallback`: 1 se precisou de Dify apos NotebookLM
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Protocolo v2.0** | 2026-02-12 | Dual-source (NotebookLM + Dify KB)
|
||||||
157
core-tools/skills/_core/instrumentation-protocol.md
Normal file
157
core-tools/skills/_core/instrumentation-protocol.md
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
# Protocolo de Instrumentação Automática v1.0
|
||||||
|
|
||||||
|
**Data:** 2026-02-03
|
||||||
|
**Propósito:** Auto-registar métricas de execução de skills para análise PDCA
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Visão Geral
|
||||||
|
|
||||||
|
Toda skill instrumentada deve gravar automaticamente métricas de execução na tabela `tblskill_agent_metrics` do Desk CRM.
|
||||||
|
|
||||||
|
## Quando Instrumentar
|
||||||
|
|
||||||
|
Skills que:
|
||||||
|
- Têm baseline definido em `_knowledge-map.json`
|
||||||
|
- São frequentemente usadas (>5x/semana)
|
||||||
|
- Estão em processo de optimização
|
||||||
|
|
||||||
|
## Estrutura de Instrumentação
|
||||||
|
|
||||||
|
### 1. Início de Execução
|
||||||
|
|
||||||
|
Ao iniciar a skill, registar:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const SKILL_START = Date.now();
|
||||||
|
const SESSION_ID = crypto.randomUUID(); // ou usar session_id existente
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Rastreio de Consultas KB
|
||||||
|
|
||||||
|
Se a skill consultar Dify KB:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
let KB_CONSULTED = false;
|
||||||
|
let KB_HITS = 0;
|
||||||
|
let KB_MISS = 0;
|
||||||
|
|
||||||
|
// Após cada consulta Dify bem sucedida
|
||||||
|
KB_CONSULTED = true;
|
||||||
|
KB_HITS++;
|
||||||
|
|
||||||
|
// Se consulta falhou ou sem resultados
|
||||||
|
KB_MISS++;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Contagem de Tool Calls
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
let TOOL_CALLS = 0;
|
||||||
|
|
||||||
|
// Incrementar a cada tool call
|
||||||
|
TOOL_CALLS++;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Fim de Execução - Gravar Métrica
|
||||||
|
|
||||||
|
**Via SQL directo (fallback robusto):**
|
||||||
|
|
||||||
|
```sql
|
||||||
|
INSERT INTO tblskill_agent_metrics (
|
||||||
|
type, name, duration_ms, status,
|
||||||
|
session_id, task_id, project_id, staff_id,
|
||||||
|
kb_consulted, kb_hits, kb_miss, tool_calls,
|
||||||
|
error_type, error_message, context_tokens, output_tokens,
|
||||||
|
model_used, created_at
|
||||||
|
) VALUES (
|
||||||
|
'skill', '/nome-skill', {DURATION_MS}, '{STATUS}',
|
||||||
|
'{SESSION_ID}', {TASK_ID}, {PROJECT_ID}, 25,
|
||||||
|
{KB_CONSULTED}, {KB_HITS}, {KB_MISS}, {TOOL_CALLS},
|
||||||
|
NULL, NULL, NULL, NULL,
|
||||||
|
'opus-4.5', NOW()
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Via MCP tool (quando disponível):**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
mcp__desk-crm-v3__log_skill_metric({
|
||||||
|
type: 'skill',
|
||||||
|
name: '/nome-skill',
|
||||||
|
duration_ms: Date.now() - SKILL_START,
|
||||||
|
status: 'success', // ou 'error', 'partial'
|
||||||
|
session_id: SESSION_ID,
|
||||||
|
task_id: CURRENT_TASK_ID,
|
||||||
|
project_id: CURRENT_PROJECT_ID,
|
||||||
|
staff_id: 25, // AikTop
|
||||||
|
kb_consulted: KB_CONSULTED,
|
||||||
|
kb_hits: KB_HITS,
|
||||||
|
kb_miss: KB_MISS,
|
||||||
|
tool_calls: TOOL_CALLS
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Status Possíveis
|
||||||
|
|
||||||
|
| Status | Quando Usar |
|
||||||
|
|--------|-------------|
|
||||||
|
| `success` | Skill completou com sucesso |
|
||||||
|
| `error` | Skill falhou com erro |
|
||||||
|
| `partial` | Skill completou parcialmente |
|
||||||
|
| `cancelled` | Utilizador cancelou |
|
||||||
|
|
||||||
|
## Campos Opcionais
|
||||||
|
|
||||||
|
| Campo | Quando Preencher |
|
||||||
|
|-------|------------------|
|
||||||
|
| `task_id` | Se executando dentro de tarefa Desk |
|
||||||
|
| `project_id` | Se contexto de projecto conhecido |
|
||||||
|
| `error_type` | Se status = 'error' |
|
||||||
|
| `error_message` | Se status = 'error' |
|
||||||
|
| `context_tokens` | Se disponível via API |
|
||||||
|
| `output_tokens` | Se disponível via API |
|
||||||
|
|
||||||
|
## Template para Skills
|
||||||
|
|
||||||
|
Adicionar esta secção no final de cada SKILL.md instrumentada:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
|
||||||
|
## Instrumentação Automática
|
||||||
|
|
||||||
|
Esta skill grava métricas automaticamente para análise PDCA.
|
||||||
|
|
||||||
|
### Ao Executar Esta Skill
|
||||||
|
|
||||||
|
1. **Início:** Registar timestamp inicial
|
||||||
|
2. **Consultas KB:** Rastrear hits/miss do Dify
|
||||||
|
3. **Fim:** Gravar métrica via SQL ou MCP
|
||||||
|
|
||||||
|
### Query para Gravar (executar no final)
|
||||||
|
|
||||||
|
\`\`\`sql
|
||||||
|
INSERT INTO tblskill_agent_metrics (type, name, duration_ms, status, staff_id, kb_consulted, created_at)
|
||||||
|
VALUES ('skill', '/nome-skill', {DURACAO_MS}, '{STATUS}', 25, {KB_CONSULTADO}, NOW());
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
### Ver Métricas
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
/metrics /nome-skill
|
||||||
|
\`\`\`
|
||||||
|
```
|
||||||
|
|
||||||
|
## Integração com /reflect
|
||||||
|
|
||||||
|
Se degradação detectada (performance >15% pior que baseline):
|
||||||
|
|
||||||
|
1. `/metrics` mostra alerta
|
||||||
|
2. Sugerir `/reflect` para investigação
|
||||||
|
3. `/reflect` analisa padrões e propõe melhorias
|
||||||
|
4. Registar ciclo PDCA em `tblskill_agent_pdca_cycles`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Protocolo v1.0** | 2026-02-03
|
||||||
69
core-tools/skills/_core/notebooklm-mapping.json
Normal file
69
core-tools/skills/_core/notebooklm-mapping.json
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"description": "Mapeamento Dify KB datasets -> NotebookLM notebooks. NotebookLM e fonte primaria (Gemini 2.5 RAG). Dify KB e fallback.",
|
||||||
|
"updated": "2026-02-12",
|
||||||
|
"query_tool": "mcp__notebooklm__notebook_query",
|
||||||
|
"fallback_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
||||||
|
"mapping": {
|
||||||
|
"Marketing Digital": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"},
|
||||||
|
"Marketing": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"},
|
||||||
|
"Gestao de Marketing": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"},
|
||||||
|
"Gestao de Trafego": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"},
|
||||||
|
"Marketing de Conteudo": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"},
|
||||||
|
"Growth Hacking": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"},
|
||||||
|
"Marketing Redes Sociais": {"notebook_id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "notebook_title": "Social Media e Branding"},
|
||||||
|
"Branding": {"notebook_id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "notebook_title": "Social Media e Branding"},
|
||||||
|
"Canva": {"notebook_id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675", "notebook_title": "Social Media e Branding"},
|
||||||
|
"SEO (Search Engine Optimization)": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "SEO coberto genericamente no Marketing Avancado"},
|
||||||
|
"SEO": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado"},
|
||||||
|
"Copywriting": {"notebook_id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "notebook_title": "Copywriting e Persuasao"},
|
||||||
|
"Youtube Marketing": {"notebook_id": "058a896e-6c9a-4e51-ae7d-9adb2738bc5f", "notebook_title": "Producao de Video e Youtube"},
|
||||||
|
"Vendas": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "Sem notebook dedicado, coberto parcialmente"},
|
||||||
|
"Email Marketing": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "Sem notebook dedicado"},
|
||||||
|
"Blogging": {"notebook_id": "76647e0f-3ae2-4c00-a0a8-f457aebf5655", "notebook_title": "Marketing Digital Avancado", "note": "Sem notebook dedicado"},
|
||||||
|
"Mentor: Seth Godin": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"},
|
||||||
|
"Mentor: Russel Brunson": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"},
|
||||||
|
"Mentor: Gary Vee": {"notebook_id": "7b8fec17-d34f-4e3f-a8c6-8231e51f6323", "notebook_title": "Copywriting e Persuasao"},
|
||||||
|
"Mentor: Alex Vargas": {"notebook_id": "4c595973-ba10-420a-a3bf-e4389e424ad3", "notebook_title": "Marketing Digital PT"},
|
||||||
|
"Mentor: Natanael Oliveira": {"notebook_id": "4c595973-ba10-420a-a3bf-e4389e424ad3", "notebook_title": "Marketing Digital PT"},
|
||||||
|
"Mentor: Ricardo Piovan": {"notebook_id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "notebook_title": "Gestao de Projectos e Agile"},
|
||||||
|
"Claude Code": {"notebook_id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", "notebook_title": "Claude Code"},
|
||||||
|
"MCP Servers": {"notebook_id": "73102308-70ef-403e-9be9-eae0cfc62d55", "notebook_title": "Desenvolvimento de MCPs"},
|
||||||
|
"VS Code": {"notebook_id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53", "notebook_title": "AI Code Editors"},
|
||||||
|
"Windsurf": {"notebook_id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53", "notebook_title": "AI Code Editors"},
|
||||||
|
"Claude Computer Use": {"notebook_id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53", "notebook_title": "AI Code Editors"},
|
||||||
|
"Desenvolvimento de Software": {"notebook_id": "24947ffa-0019-448a-a340-2f4a275d2eb1", "notebook_title": "Programacao"},
|
||||||
|
"Obsidian + Claude Code": {"notebook_id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131", "notebook_title": "Obsidian + Claude"},
|
||||||
|
"WordPress": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"},
|
||||||
|
"Elementor": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"},
|
||||||
|
"Crocoblock": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"},
|
||||||
|
"Desenvolvimento de WebSites": {"notebook_id": "5be0d1a6-00f2-4cd9-b835-978cb7721601", "notebook_title": "WordPress e Elementor"},
|
||||||
|
"CWP Centos Web Panel": {"notebook_id": "0ded7bd6-69b3-4c76-b327-452396bf7ea7", "notebook_title": "CWP"},
|
||||||
|
"TI (Tecnologia da Informação)": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"},
|
||||||
|
"TI": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"},
|
||||||
|
"Linux": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"},
|
||||||
|
"AWS (Amazon Web Services)": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"},
|
||||||
|
"AWS": {"notebook_id": "f9a79b5a-649f-4443-afaf-7ff562b6c2e7", "notebook_title": "Cloud e Infraestrutura TI"},
|
||||||
|
"Gestao": {"notebook_id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "notebook_title": "Gestao de Projectos e Agile"},
|
||||||
|
"Gestao de Projetos": {"notebook_id": "0c9c079c-a426-486c-99eb-1564d42d37ad", "notebook_title": "Gestao de Projectos e Agile"},
|
||||||
|
"Gestao de Processos": {"notebook_id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", "notebook_title": "Gestao de Operacoes"},
|
||||||
|
"Estrategia": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"},
|
||||||
|
"Estratégia": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"},
|
||||||
|
"Produtividade": {"notebook_id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131", "notebook_title": "Obsidian + Claude"},
|
||||||
|
"Escrever PT-PT": {"notebook_id": null, "notebook_title": null, "note": "Sem equivalente NotebookLM - usar apenas Dify"},
|
||||||
|
"n8n": {"notebook_id": "f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1", "notebook_title": "n8n"},
|
||||||
|
"Dify": {"notebook_id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "notebook_title": "AI Automation Stack"},
|
||||||
|
"Flowise": {"notebook_id": "929ef67b-c131-4f01-abd0-8b078491a6b7", "notebook_title": "AI Automation Stack", "note": "Coberto parcialmente"},
|
||||||
|
"Open WebUI": {"notebook_id": "be6f72ac-f8ba-4337-912d-abd5dd448519", "notebook_title": "Open WebUI"},
|
||||||
|
"Ferramentas de Automação e IA": {"notebook_id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "notebook_title": "Transformacao Digital e IA"},
|
||||||
|
"Ferramentas Automacao e IA": {"notebook_id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "notebook_title": "Transformacao Digital e IA"},
|
||||||
|
"PerfexCRM": {"notebook_id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c", "notebook_title": "Perfex CRM: Gestao de Clientes e Projetos"},
|
||||||
|
"Servicos Descomplicar": {"notebook_id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "notebook_title": "Descomplicar: Marketing Digital"},
|
||||||
|
"e-commerce": {"notebook_id": "226e384e-d4bc-48f4-bb82-7927360436cc", "notebook_title": "E-commerce Pratico"},
|
||||||
|
"Empreendedorismo": {"notebook_id": "79d43410-0e29-4be1-881d-84db6bdc239a", "notebook_title": "Estrategia e Empreendedorismo"},
|
||||||
|
"Agencia Digital": {"notebook_id": "f9dc59c2-718b-4b12-bd06-095d4bfa3e34", "notebook_title": "Gestao de Operacoes"},
|
||||||
|
"Estrategia Descomplicar": {"notebook_id": "f29c8457-f16d-4fb3-979d-6e5901de1b20", "notebook_title": "Descomplicar: Marketing Digital"},
|
||||||
|
"Aceleracao Digital": {"notebook_id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", "notebook_title": "Transformacao Digital e IA"},
|
||||||
|
"UX e Usabilidade": {"notebook_id": "081ca512-8279-4850-b2b9-dff090267482", "notebook_title": "UI/UX Design"},
|
||||||
|
"Criatividade": {"notebook_id": "081ca512-8279-4850-b2b9-dff090267482", "notebook_title": "UI/UX Design", "note": "Sem notebook dedicado"}
|
||||||
|
}
|
||||||
|
}
|
||||||
149
core-tools/skills/agent-context-injector/SKILL.md
Normal file
149
core-tools/skills/agent-context-injector/SKILL.md
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
---
|
||||||
|
name: agent-context-injector
|
||||||
|
description: Injecção dinâmica de contexto específico para cada agente — MCPs disponíveis, skills relevantes e datasets Dify.
|
||||||
|
user-invocable: false
|
||||||
|
allowed-tools: Read, Glob, Grep, ToolSearch
|
||||||
|
---
|
||||||
|
|
||||||
|
# Agent Context Injector
|
||||||
|
|
||||||
|
Injecção dinâmica de contexto específico para cada agente.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill é activada automaticamente via hook `SubagentStart` quando:
|
||||||
|
- Um subagente é iniciado via Task tool
|
||||||
|
- Contexto precisa ser enriquecido com recursos do agente
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. Context Building
|
||||||
|
- Consultar mapeamento agente → recursos na BD
|
||||||
|
- Gerar lista de MCPs disponíveis para o agente
|
||||||
|
- Gerar lista de skills relevantes
|
||||||
|
- Incluir datasets Dify para consulta automática
|
||||||
|
|
||||||
|
### 2. Token Optimization
|
||||||
|
- Calcular tokens do contexto gerado
|
||||||
|
- Priorizar recursos por relevância
|
||||||
|
- Truncar se exceder limite (~800 tokens)
|
||||||
|
- Cache de contextos frequentes
|
||||||
|
|
||||||
|
### 3. Dynamic Injection
|
||||||
|
- Adicionar contexto ao prompt do agente
|
||||||
|
- Incluir instruções de uso dos recursos
|
||||||
|
- Configurar auto-consult para datasets
|
||||||
|
|
||||||
|
## Template de Contexto
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Recursos Disponíveis
|
||||||
|
|
||||||
|
### MCPs Activos
|
||||||
|
$MCP_LIST
|
||||||
|
- Usar proactivamente para operações relevantes
|
||||||
|
|
||||||
|
### Skills Recomendadas
|
||||||
|
$SKILLS_LIST
|
||||||
|
- Invocar quando tarefa corresponder
|
||||||
|
|
||||||
|
### Knowledge Base (Dify)
|
||||||
|
$DATASETS_LIST
|
||||||
|
- AUTO-CONSULT: Consultar ANTES de responder
|
||||||
|
- Query template: "$QUERY_TEMPLATE"
|
||||||
|
|
||||||
|
### Plugins
|
||||||
|
$PLUGINS_LIST
|
||||||
|
- Comandos disponíveis: $PLUGIN_COMMANDS
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
SUBAGENT START → QUERY BD → BUILD CONTEXT → INJECT → EXECUTE
|
||||||
|
```
|
||||||
|
|
||||||
|
1. **Hook SubagentStart** dispara
|
||||||
|
2. **Identificar agente** pelo `subagent_type`
|
||||||
|
3. **Query MySQL**:
|
||||||
|
```sql
|
||||||
|
SELECT r.resource_type, r.resource_id, r.priority
|
||||||
|
FROM cr_agent_resources r
|
||||||
|
JOIN cr_agents a ON r.agent_id = a.id
|
||||||
|
WHERE a.slug = '{agent_slug}'
|
||||||
|
AND r.auto_inject = TRUE
|
||||||
|
ORDER BY r.priority ASC;
|
||||||
|
```
|
||||||
|
4. **Consultar agent-knowledge-config.json** para datasets
|
||||||
|
5. **Gerar contexto** com template
|
||||||
|
6. **Calcular tokens** e optimizar se necessário
|
||||||
|
7. **Injectar** no prompt do agente
|
||||||
|
|
||||||
|
## Métricas Target
|
||||||
|
|
||||||
|
| Métrica | Target |
|
||||||
|
|---------|--------|
|
||||||
|
| Tempo de injecção | < 2s |
|
||||||
|
| Tokens médios | ~772 |
|
||||||
|
| Cache hit rate | > 60% |
|
||||||
|
| Erro rate | < 1% |
|
||||||
|
|
||||||
|
## Exemplo de Output
|
||||||
|
|
||||||
|
Para `wordpress-plugin-developer`:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Recursos Disponíveis
|
||||||
|
|
||||||
|
### MCPs Activos
|
||||||
|
- `cwp` - Gestão servidor CentOS WebPanel
|
||||||
|
- `ssh-unified` - Acesso SSH a servidores
|
||||||
|
- `filesystem` - Operações de ficheiros
|
||||||
|
|
||||||
|
### Skills Recomendadas
|
||||||
|
- `/wp-dev` - Desenvolvimento WordPress
|
||||||
|
- `/wp-performance` - Optimização performance
|
||||||
|
- `/elementor` - Desenvolvimento Elementor
|
||||||
|
|
||||||
|
### Knowledge Base (Dify)
|
||||||
|
- `wordpress-development` - Docs WP, hooks, filters
|
||||||
|
- `woocommerce-api` - API WooCommerce
|
||||||
|
- AUTO-CONSULT: Consultar ANTES de implementar
|
||||||
|
|
||||||
|
### Plugins
|
||||||
|
- `superpowers` - TDD obrigatório
|
||||||
|
- `code-review` - Review automático
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuração
|
||||||
|
|
||||||
|
Ficheiro `agent-knowledge-config.json`:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"wordpress-plugin-developer": {
|
||||||
|
"datasets": ["wordpress-development", "woocommerce-api"],
|
||||||
|
"auto_consult": true,
|
||||||
|
"query_template": "WordPress {topic} best practices 2026",
|
||||||
|
"priority_datasets": ["wordpress-development"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Integração com Scripts Existentes
|
||||||
|
|
||||||
|
Este skill complementa (não substitui) os scripts Python existentes:
|
||||||
|
- `inject-mcp-context.py` - Continua activo
|
||||||
|
- `inject-skills-context.py` - Continua activo
|
||||||
|
|
||||||
|
A skill adiciona:
|
||||||
|
- Datasets Dify dinâmicos
|
||||||
|
- Plugins activos
|
||||||
|
- Contexto mais rico e actualizado
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- Máximo ~800 tokens de contexto injectado (para preservar espaço)
|
||||||
|
- Não modifica comportamento do agente, apenas enriquece contexto
|
||||||
|
- Depende de mapeamentos correctos em `cr_agent_resources`
|
||||||
|
- Cache de 5 minutos pode mostrar dados desactualizados
|
||||||
|
- Não funciona para agentes não registados na BD
|
||||||
285
core-tools/skills/component-generator/SKILL.md
Normal file
285
core-tools/skills/component-generator/SKILL.md
Normal file
@@ -0,0 +1,285 @@
|
|||||||
|
---
|
||||||
|
name: component-generator
|
||||||
|
description: Gera componentes Claude Code (skills, agents, commands) seguindo templates Descomplicar® com ciclo criar, validar e registar.
|
||||||
|
disable-model-invocation: true
|
||||||
|
allowed-tools: Read, Write, Edit, Glob, ToolSearch
|
||||||
|
---
|
||||||
|
|
||||||
|
# Component Generator
|
||||||
|
|
||||||
|
Skill para criar componentes de alta qualidade automaticamente, fechando o ciclo CRIAR → VALIDAR → REGISTAR.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill deve ser activada quando:
|
||||||
|
- Utilizador pede para criar nova skill
|
||||||
|
- Utilizador pede para criar novo agent
|
||||||
|
- Utilizador pede para criar novo command
|
||||||
|
- Necessidade de scaffold de componente identificada
|
||||||
|
- Comando `/descomplicar:create` é invocado
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. Scaffold Skill
|
||||||
|
|
||||||
|
Cria estrutura completa de skill com frontmatter obrigatório.
|
||||||
|
|
||||||
|
**Comando:**
|
||||||
|
```
|
||||||
|
/descomplicar:create skill <name>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Template Gerado:**
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
name: <name>
|
||||||
|
description: >
|
||||||
|
[Capability]. Use when "[trigger1]", "[trigger2]",
|
||||||
|
"[keyword1]", "[keyword2]", "[keyword3]".
|
||||||
|
author: Descomplicar®
|
||||||
|
version: 1.0.0
|
||||||
|
desk_task: XXXX
|
||||||
|
allowed-tools: Read, Glob, Grep
|
||||||
|
---
|
||||||
|
|
||||||
|
# <Name>
|
||||||
|
|
||||||
|
[Descrição da skill]
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill deve ser activada quando:
|
||||||
|
- [Trigger 1]
|
||||||
|
- [Trigger 2]
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. [Capability 1]
|
||||||
|
[Descrição]
|
||||||
|
|
||||||
|
### 2. [Capability 2]
|
||||||
|
[Descrição]
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
[PASSO1] → [PASSO2] → [PASSO3] → [PASSO4]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exemplo de Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
User: [Exemplo de input]
|
||||||
|
Assistant: [Exemplo de output]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- [Quando NÃO usar]
|
||||||
|
- [Escopo máximo]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Acções Automáticas:**
|
||||||
|
1. Criar directório `skills/<name>/`
|
||||||
|
2. Gerar `SKILL.md` com template
|
||||||
|
3. Registar em `cr_skills` (MySQL)
|
||||||
|
4. Criar tarefa Desk CRM (se desk_task fornecido)
|
||||||
|
|
||||||
|
### 2. Scaffold Agent
|
||||||
|
|
||||||
|
Cria ficheiro de agente com mapeamento de MCPs por categoria.
|
||||||
|
|
||||||
|
**Comando:**
|
||||||
|
```
|
||||||
|
/descomplicar:create agent <name> [--category dev|business|marketing|infra]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Template Gerado:**
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
name: <name>
|
||||||
|
description: >
|
||||||
|
[Descrição]. Use for [uso1], [uso2], [uso3].
|
||||||
|
model: sonnet
|
||||||
|
tools: Read, Glob, Grep, ToolSearch
|
||||||
|
allowed-mcps: [MCPs baseados na categoria]
|
||||||
|
category: <category>
|
||||||
|
author: Descomplicar®
|
||||||
|
version: 1.0.0
|
||||||
|
desk_task: XXXX
|
||||||
|
---
|
||||||
|
|
||||||
|
# <Name>
|
||||||
|
|
||||||
|
[Descrição do agente]
|
||||||
|
|
||||||
|
## Quando Usar
|
||||||
|
|
||||||
|
USAR PROATIVAMENTE para:
|
||||||
|
- [Caso de uso 1]
|
||||||
|
- [Caso de uso 2]
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### [Capability 1]
|
||||||
|
- [Detalhe]
|
||||||
|
|
||||||
|
## Tools Disponíveis
|
||||||
|
|
||||||
|
| Tool | Uso |
|
||||||
|
|------|-----|
|
||||||
|
| [tool] | [descrição] |
|
||||||
|
|
||||||
|
## Workflow Típico
|
||||||
|
|
||||||
|
```
|
||||||
|
1. [Passo 1]
|
||||||
|
2. [Passo 2]
|
||||||
|
3. [Passo 3]
|
||||||
|
4. [Passo 4]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Colaborações
|
||||||
|
|
||||||
|
- [Agente relacionado 1]
|
||||||
|
- [Agente relacionado 2]
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- [Limite 1]
|
||||||
|
- [Limite 2]
|
||||||
|
```
|
||||||
|
|
||||||
|
**MCPs por Categoria:**
|
||||||
|
| Categoria | MCPs Primary | MCPs Recommended |
|
||||||
|
|-----------|--------------|------------------|
|
||||||
|
| dev | gitea, filesystem | ssh-unified, desk-crm-v3 |
|
||||||
|
| business | desk-crm-v3, moloni | google-workspace |
|
||||||
|
| marketing | google-workspace, tavily | desk-crm-v3 |
|
||||||
|
| infra | ssh-unified, cwp | filesystem, gitea |
|
||||||
|
|
||||||
|
**Acções Automáticas:**
|
||||||
|
1. Criar `agents/<name>.md`
|
||||||
|
2. Registar em `cr_agents` (MySQL)
|
||||||
|
3. Criar mapeamentos em `cr_agent_mcps`
|
||||||
|
4. Sugerir colaborações em `cr_agent_collaborations`
|
||||||
|
5. Criar tarefa Desk CRM
|
||||||
|
|
||||||
|
### 3. Scaffold Command
|
||||||
|
|
||||||
|
Cria ficheiro de comando com namespace e arguments.
|
||||||
|
|
||||||
|
**Comando:**
|
||||||
|
```
|
||||||
|
/descomplicar:create command <name>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Template Gerado:**
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
name: <name>
|
||||||
|
description: >
|
||||||
|
[Descrição do comando]. [O que faz].
|
||||||
|
argument-hint: "[argumentos opcionais]"
|
||||||
|
---
|
||||||
|
|
||||||
|
# /descomplicar:<name>
|
||||||
|
|
||||||
|
[Descrição detalhada]
|
||||||
|
|
||||||
|
## Objectivo
|
||||||
|
|
||||||
|
[O que este comando faz]
|
||||||
|
|
||||||
|
## Sintaxe
|
||||||
|
|
||||||
|
```
|
||||||
|
/descomplicar:<name> [action] [args]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Acções Disponíveis
|
||||||
|
|
||||||
|
### 1. [Acção 1]
|
||||||
|
|
||||||
|
```
|
||||||
|
/descomplicar:<name> [action1]
|
||||||
|
```
|
||||||
|
|
||||||
|
[Descrição]
|
||||||
|
|
||||||
|
## Output Esperado
|
||||||
|
|
||||||
|
```
|
||||||
|
╔═══════════════════════════════════════════╗
|
||||||
|
║ [OUTPUT VISUAL] ║
|
||||||
|
╚═══════════════════════════════════════════╝
|
||||||
|
```
|
||||||
|
```
|
||||||
|
|
||||||
|
**Acções Automáticas:**
|
||||||
|
1. Criar `commands/<name>.md`
|
||||||
|
2. Actualizar `plugin.json` com novo command
|
||||||
|
|
||||||
|
### 4. Registar em MySQL
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Para Skills
|
||||||
|
INSERT INTO cr_skills (slug, name, category, status, desk_task, created_at)
|
||||||
|
VALUES (?, ?, ?, 'active', ?, NOW());
|
||||||
|
|
||||||
|
-- Para Agents
|
||||||
|
INSERT INTO cr_agents (slug, name, category, status, desk_task, created_at)
|
||||||
|
VALUES (?, ?, ?, 'active', ?, NOW());
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Criar Tarefa Desk CRM
|
||||||
|
|
||||||
|
```sql
|
||||||
|
INSERT INTO tbltasks (name, description, rel_type, rel_id, milestone, status, dateadded, startdate, addedfrom)
|
||||||
|
VALUES (
|
||||||
|
'<Type>: <name>',
|
||||||
|
'<h4>Propósito</h4><p>...</p><h4>Estado</h4><p>Em desenvolvimento</p>',
|
||||||
|
'project', 65, -- Stack Workflow
|
||||||
|
?, -- Milestone apropriado
|
||||||
|
1, NOW(), CURDATE(), 1
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflow Completo
|
||||||
|
|
||||||
|
```
|
||||||
|
CREATE → VALIDATE → REGISTER → DESK TASK → READY
|
||||||
|
↓ ↓ ↓ ↓
|
||||||
|
Template Score≥70 MySQL Tracking
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validação Automática
|
||||||
|
|
||||||
|
Após criação, invoca `quality-validator` para garantir score >= 70:
|
||||||
|
- Se score < 70: ALERTA + sugestões de melhoria
|
||||||
|
- Se score >= 70: componente activado
|
||||||
|
|
||||||
|
## Exemplo de Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
User: Cria uma nova skill para gestão de backups
|
||||||
|
|
||||||
|
Component Generator:
|
||||||
|
1. [Cria directório skills/backup-manager/]
|
||||||
|
2. [Gera SKILL.md com template Descomplicar®]
|
||||||
|
3. [Valida: score 65/100 - Draft]
|
||||||
|
4. [Regista em cr_skills (id: 55)]
|
||||||
|
5. [Cria tarefa Desk #1503]
|
||||||
|
6. Resposta: "Skill backup-manager criada com sucesso!
|
||||||
|
- Path: skills/backup-manager/SKILL.md
|
||||||
|
- Score: 65/100 (Draft)
|
||||||
|
- Próximo passo: Editar e correr /descomplicar:validate"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- Apenas cria estrutura base - conteúdo deve ser desenvolvido
|
||||||
|
- Score inicial tipicamente 50-70 (Draft)
|
||||||
|
- Não cria componentes duplicados (verifica slug existente)
|
||||||
|
- Requer conexão MySQL para registo em cr_*
|
||||||
|
- Não modifica componentes existentes (usar Edit tool)
|
||||||
262
core-tools/skills/db-maintenance-manager/SKILL.md
Normal file
262
core-tools/skills/db-maintenance-manager/SKILL.md
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
---
|
||||||
|
name: db-maintenance-manager
|
||||||
|
description: Manutenção automatizada das tabelas cr_* da infraestrutura Claude Code — limpeza de órfãos, migração de schema, backups e optimização.
|
||||||
|
disable-model-invocation: true
|
||||||
|
allowed-tools: Read, Glob, Grep, ToolSearch
|
||||||
|
---
|
||||||
|
|
||||||
|
# DB Maintenance Manager
|
||||||
|
|
||||||
|
Gestão e manutenção automatizada das tabelas cr_* (Claude Resources) na base de dados Desk CRM.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill deve ser activada quando:
|
||||||
|
- Utilizador menciona "manutenção BD", "database maintenance"
|
||||||
|
- Detectados órfãos nas tabelas de relacionamento
|
||||||
|
- Telemetria antiga (>90 dias) a ocupar espaço
|
||||||
|
- Necessidade de migração de schema
|
||||||
|
- Backup/restore de componentes
|
||||||
|
|
||||||
|
## Schema das Tabelas cr_*
|
||||||
|
|
||||||
|
### Core Tables (Entidades)
|
||||||
|
|
||||||
|
| Tabela | Descrição | Manutenção |
|
||||||
|
|--------|-----------|------------|
|
||||||
|
| `cr_agents` | Agentes especializados | Sync, Backup |
|
||||||
|
| `cr_skills` | Skills invocáveis | Sync, Backup |
|
||||||
|
| `cr_mcps` | Servidores MCP | Sync, Backup |
|
||||||
|
| `cr_lsps` | Language Server Protocols | Sync, Backup |
|
||||||
|
| `cr_plugins` | Software Development Kits | Sync, Backup |
|
||||||
|
| `cr_mcp_tools` | Ferramentas por MCP | Sync |
|
||||||
|
| `cr_plugins` | Plugins instalados | Sync, Backup |
|
||||||
|
| `cr_hooks` | Hooks configurados | Sync, Backup |
|
||||||
|
|
||||||
|
### Relationship Tables (Limpeza de Órfãos)
|
||||||
|
|
||||||
|
| Tabela | FK Agent | FK Resource | Cleanup Priority |
|
||||||
|
|--------|----------|-------------|------------------|
|
||||||
|
| `cr_agent_mcps` | agent_id → cr_agents | mcp_id → cr_mcps | Alta |
|
||||||
|
| `cr_agent_lsps` | agent_id → cr_agents | lsp_id → cr_lsps | Alta |
|
||||||
|
| `cr_plugin_agents` | sdk_id → cr_plugins | agent_id → cr_agents | Média |
|
||||||
|
| `cr_plugin_skills` | sdk_id → cr_plugins | skill_id → cr_skills | Média |
|
||||||
|
| `cr_plugin_mcps` | sdk_id → cr_plugins | mcp_id → cr_mcps | Média |
|
||||||
|
| `cr_agent_skills` | agent_id → cr_agents | skill_id → cr_skills | Alta |
|
||||||
|
| `cr_skill_mcps` | skill_id → cr_skills | mcp_id → cr_mcps | Alta |
|
||||||
|
| `cr_agent_collaborations` | agent_id → cr_agents | collaborator_id → cr_agents | Média |
|
||||||
|
|
||||||
|
### Telemetry Tables (Archiving)
|
||||||
|
|
||||||
|
| Tabela | Retenção Activa | Archive After |
|
||||||
|
|--------|-----------------|---------------|
|
||||||
|
| `cr_agent_usage` | 90 dias | cr_agent_usage_archive |
|
||||||
|
| `cr_skill_usage` | 90 dias | cr_skill_usage_archive |
|
||||||
|
| `cr_mcp_tool_usage` | 90 dias | cr_mcp_tool_usage_archive |
|
||||||
|
| `cr_lsp_usage` | 90 dias | cr_lsp_usage_archive |
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. Cleanup de Órfãos
|
||||||
|
|
||||||
|
Detecta e remove referências inválidas nas tabelas de relacionamento.
|
||||||
|
|
||||||
|
**Detecção:**
|
||||||
|
```sql
|
||||||
|
-- Órfãos em cr_agent_mcps
|
||||||
|
SELECT am.id, am.agent_id, am.mcp_id
|
||||||
|
FROM cr_agent_mcps am
|
||||||
|
LEFT JOIN cr_agents a ON am.agent_id = a.id
|
||||||
|
LEFT JOIN cr_mcps m ON am.mcp_id = m.id
|
||||||
|
WHERE a.id IS NULL OR m.id IS NULL;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Limpeza (com confirmação):**
|
||||||
|
```sql
|
||||||
|
-- Backup antes de limpar
|
||||||
|
CREATE TABLE cr_agent_mcps_orphans_backup_YYYYMMDD AS
|
||||||
|
SELECT * FROM cr_agent_mcps am
|
||||||
|
WHERE agent_id NOT IN (SELECT id FROM cr_agents)
|
||||||
|
OR mcp_id NOT IN (SELECT id FROM cr_mcps);
|
||||||
|
|
||||||
|
-- Limpar órfãos
|
||||||
|
DELETE FROM cr_agent_mcps
|
||||||
|
WHERE agent_id NOT IN (SELECT id FROM cr_agents)
|
||||||
|
OR mcp_id NOT IN (SELECT id FROM cr_mcps);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Migração de Schema
|
||||||
|
|
||||||
|
Gestão de alterações estruturais nas tabelas cr_*.
|
||||||
|
|
||||||
|
**Estrutura de Migrations:**
|
||||||
|
```
|
||||||
|
migrations/
|
||||||
|
├── 001_initial_schema.sql
|
||||||
|
├── 002_add_lsp_tables.sql
|
||||||
|
├── 003_add_telemetry.sql
|
||||||
|
├── 004_add_archive_tables.sql
|
||||||
|
└── migrations_log.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
**Tabela de Controlo:**
|
||||||
|
```sql
|
||||||
|
CREATE TABLE IF NOT EXISTS cr_migrations (
|
||||||
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
migration_name VARCHAR(100) NOT NULL,
|
||||||
|
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
checksum VARCHAR(64),
|
||||||
|
status ENUM('applied', 'rolled_back', 'failed') DEFAULT 'applied'
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Backup Selectivo
|
||||||
|
|
||||||
|
Backup apenas das tabelas cr_* (não toda a BD Desk).
|
||||||
|
|
||||||
|
**Tabelas a incluir:**
|
||||||
|
```sql
|
||||||
|
-- Lista de tabelas para backup
|
||||||
|
SELECT table_name
|
||||||
|
FROM information_schema.tables
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND table_name LIKE 'cr_%';
|
||||||
|
```
|
||||||
|
|
||||||
|
**Formato de Backup:**
|
||||||
|
```
|
||||||
|
backups/
|
||||||
|
└── cr_backup_YYYYMMDD_HHMMSS/
|
||||||
|
├── manifest.json
|
||||||
|
├── cr_agents.sql
|
||||||
|
├── cr_skills.sql
|
||||||
|
├── cr_mcps.sql
|
||||||
|
└── ... (todas as tabelas cr_*)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Archiving de Telemetria
|
||||||
|
|
||||||
|
Move dados antigos para tabelas de arquivo.
|
||||||
|
|
||||||
|
**Processo:**
|
||||||
|
```sql
|
||||||
|
-- 1. Criar tabela archive se não existir
|
||||||
|
CREATE TABLE IF NOT EXISTS cr_agent_usage_archive LIKE cr_agent_usage;
|
||||||
|
|
||||||
|
-- 2. Mover dados > 90 dias
|
||||||
|
INSERT INTO cr_agent_usage_archive
|
||||||
|
SELECT * FROM cr_agent_usage
|
||||||
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
|
||||||
|
|
||||||
|
-- 3. Limpar tabela principal
|
||||||
|
DELETE FROM cr_agent_usage
|
||||||
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
|
||||||
|
|
||||||
|
-- 4. Registar operação
|
||||||
|
INSERT INTO cr_maintenance_log (operation, table_name, rows_affected, executed_at)
|
||||||
|
VALUES ('archive', 'cr_agent_usage', ROW_COUNT(), NOW());
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Optimização
|
||||||
|
|
||||||
|
Manutenção de performance das tabelas.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Optimizar tabelas fragmentadas
|
||||||
|
OPTIMIZE TABLE cr_agent_usage, cr_skill_usage, cr_mcp_tool_usage;
|
||||||
|
|
||||||
|
-- Analisar estatísticas
|
||||||
|
ANALYZE TABLE cr_agents, cr_skills, cr_mcps, cr_agent_mcps;
|
||||||
|
|
||||||
|
-- Verificar índices em falta
|
||||||
|
SELECT DISTINCT table_name, column_name
|
||||||
|
FROM information_schema.columns c
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND table_name LIKE 'cr_%'
|
||||||
|
AND column_name LIKE '%_id'
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1 FROM information_schema.statistics s
|
||||||
|
WHERE s.table_schema = c.table_schema
|
||||||
|
AND s.table_name = c.table_name
|
||||||
|
AND s.column_name = c.column_name
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
ANALISAR → BACKUP → EXECUTAR → VALIDAR → REPORTAR
|
||||||
|
```
|
||||||
|
|
||||||
|
1. **ANALISAR**: Identificar necessidades de manutenção
|
||||||
|
2. **BACKUP**: Criar backup antes de operações destrutivas
|
||||||
|
3. **EXECUTAR**: Correr operação com transação
|
||||||
|
4. **VALIDAR**: Verificar integridade pós-operação
|
||||||
|
5. **REPORTAR**: Registar em cr_maintenance_log
|
||||||
|
|
||||||
|
## Integrações
|
||||||
|
|
||||||
|
- **MCP**: desk-crm-v3 (operações MySQL)
|
||||||
|
- **Commands**:
|
||||||
|
- `/descomplicar:db-cleanup` - Limpeza de órfãos
|
||||||
|
- `/descomplicar:db-migrate` - Migração de schema
|
||||||
|
- `/descomplicar:db-backup` - Backup selectivo
|
||||||
|
- `/descomplicar:db-archive` - Archiving telemetria
|
||||||
|
- **Skills**: infrastructure-manager (detecção), quality-validator (validação)
|
||||||
|
|
||||||
|
## Métricas de Sucesso
|
||||||
|
|
||||||
|
| Métrica | Target |
|
||||||
|
|---------|--------|
|
||||||
|
| Órfãos | 0 |
|
||||||
|
| Telemetria activa | < 90 dias |
|
||||||
|
| Backup age | < 7 dias |
|
||||||
|
| Migrations pendentes | 0 |
|
||||||
|
|
||||||
|
## Exemplo de Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
User: A BD tem dados antigos e órfãos. Limpa tudo.
|
||||||
|
|
||||||
|
DB Maintenance Manager:
|
||||||
|
1. [Analisa estado actual]
|
||||||
|
- Órfãos: 12 em cr_agent_mcps, 3 em cr_skill_mcps
|
||||||
|
- Telemetria: 45.000 registos > 90 dias
|
||||||
|
- Último backup: há 15 dias
|
||||||
|
|
||||||
|
2. [Cria backup preventivo]
|
||||||
|
✓ Backup criado: cr_backup_20260204_163000/
|
||||||
|
|
||||||
|
3. [Executa limpeza órfãos]
|
||||||
|
✓ cr_agent_mcps: 12 órfãos removidos
|
||||||
|
✓ cr_skill_mcps: 3 órfãos removidos
|
||||||
|
|
||||||
|
4. [Executa archiving]
|
||||||
|
✓ cr_agent_usage: 15.000 → archive
|
||||||
|
✓ cr_skill_usage: 20.000 → archive
|
||||||
|
✓ cr_mcp_tool_usage: 10.000 → archive
|
||||||
|
|
||||||
|
5. [Valida resultado]
|
||||||
|
✓ Integridade OK
|
||||||
|
✓ 0 órfãos
|
||||||
|
✓ Telemetria < 90 dias
|
||||||
|
|
||||||
|
Resultado:
|
||||||
|
╔════════════════════════════════════════╗
|
||||||
|
║ DB MAINTENANCE COMPLETE ║
|
||||||
|
╠════════════════════════════════════════╣
|
||||||
|
║ Órfãos removidos: 15 ║
|
||||||
|
║ Registos arquivados: 45.000 ║
|
||||||
|
║ Espaço libertado: ~12 MB ║
|
||||||
|
║ Backup: ✓ Criado ║
|
||||||
|
╚════════════════════════════════════════╝
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- Não executa operações destrutivas sem backup prévio
|
||||||
|
- Archiving mantém dados (move, não apaga)
|
||||||
|
- Migrations requerem aprovação manual
|
||||||
|
- Backup não inclui tabelas não-cr_*
|
||||||
|
- Optimização pode demorar em tabelas grandes (>1M registos)
|
||||||
|
- Não substitui backups gerais do Desk CRM
|
||||||
205
core-tools/skills/infrastructure-manager/SKILL.md
Normal file
205
core-tools/skills/infrastructure-manager/SKILL.md
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
---
|
||||||
|
name: infrastructure-manager
|
||||||
|
description: Gestão automatizada da infraestrutura Claude Code Descomplicar — componentes, health, sincronização e relacionamentos entre MCPs, skills e agentes.
|
||||||
|
allowed-tools: Read, Glob, Grep, ToolSearch
|
||||||
|
---
|
||||||
|
|
||||||
|
# Infrastructure Manager
|
||||||
|
|
||||||
|
Gestão automatizada da infraestrutura Claude Code Descomplicar com suporte completo a relacionamentos.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill deve ser activada quando:
|
||||||
|
- Utilizador menciona "infraestrutura", "sistema", "componentes"
|
||||||
|
- Há problemas de sincronização detectados
|
||||||
|
- Health score cai abaixo de 90
|
||||||
|
- Novo componente é adicionado ao sistema
|
||||||
|
- Relacionamentos inconsistentes detectados
|
||||||
|
|
||||||
|
## Schema da Base de Dados
|
||||||
|
|
||||||
|
### Core Tables (Entidades)
|
||||||
|
|
||||||
|
| Tabela | Registos | Descrição |
|
||||||
|
|--------|----------|-----------|
|
||||||
|
| `cr_agents` | 46 | Agentes especializados |
|
||||||
|
| `cr_skills` | 54 | Skills invocáveis |
|
||||||
|
| `cr_mcps` | 33 | Servidores MCP |
|
||||||
|
| `cr_lsps` | 11+ | Language Server Protocols |
|
||||||
|
| `cr_plugins` | 29 | Software Development Kits |
|
||||||
|
| `cr_mcp_tools` | 822 | Ferramentas por MCP |
|
||||||
|
| `cr_plugins` | 5+ | Plugins instalados |
|
||||||
|
| `cr_hooks` | 6+ | Hooks configurados |
|
||||||
|
|
||||||
|
### Relationship Tables (800+ relacionamentos)
|
||||||
|
|
||||||
|
| Tabela | Registos | Relacionamento |
|
||||||
|
|--------|----------|----------------|
|
||||||
|
| `cr_agent_mcps` | 483 | Agente ↔ MCP (primary/recommended/available) |
|
||||||
|
| `cr_agent_lsps` | ~40 | Agente ↔ LSP (primary/recommended/available) |
|
||||||
|
| `cr_plugin_agents` | 131 | TaskForce ↔ Agente |
|
||||||
|
| `cr_plugin_skills` | 75 | TaskForce ↔ Skill |
|
||||||
|
| `cr_plugin_mcps` | 56 | TaskForce ↔ MCP |
|
||||||
|
| `cr_agent_skills` | ~50 | Agente ↔ Skill |
|
||||||
|
| `cr_skill_mcps` | ~45 | Skill ↔ MCP |
|
||||||
|
| `cr_agent_collaborations` | ~30 | Agente ↔ Agente |
|
||||||
|
|
||||||
|
### Telemetry Tables
|
||||||
|
|
||||||
|
| Tabela | Descrição |
|
||||||
|
|--------|-----------|
|
||||||
|
| `cr_agent_usage` | Tracking uso de agentes |
|
||||||
|
| `cr_skill_usage` | Tracking uso de skills |
|
||||||
|
| `cr_mcp_tool_usage` | Tracking uso de ferramentas MCP |
|
||||||
|
| `cr_lsp_usage` | Tracking uso de LSPs |
|
||||||
|
|
||||||
|
### Intelligence Tables
|
||||||
|
|
||||||
|
| Tabela | Registos | Descrição |
|
||||||
|
|--------|----------|-----------|
|
||||||
|
| `cr_decision_trees` | 5 | Árvores de decisão para selecção de agentes |
|
||||||
|
| `cr_recommendations` | 3 | Sugestões de melhorias |
|
||||||
|
| `cr_component_issues` | 2 | Issues abertos |
|
||||||
|
| `cr_reflections` | 1 | Reflexões do sistema |
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. Monitorização Completa
|
||||||
|
|
||||||
|
**Entidades:**
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
'agents' as type, COUNT(*) as total,
|
||||||
|
SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) as active
|
||||||
|
FROM cr_agents
|
||||||
|
UNION ALL
|
||||||
|
SELECT 'skills', COUNT(*), SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) FROM cr_skills
|
||||||
|
UNION ALL
|
||||||
|
SELECT 'mcps', COUNT(*), SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) FROM cr_mcps
|
||||||
|
UNION ALL
|
||||||
|
SELECT 'sdks', COUNT(*), SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) FROM cr_plugins;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Relacionamentos:**
|
||||||
|
```sql
|
||||||
|
SELECT 'agent_mcps' as table_name, COUNT(*) as count FROM cr_agent_mcps
|
||||||
|
UNION ALL SELECT 'agent_lsps', COUNT(*) FROM cr_agent_lsps
|
||||||
|
UNION ALL SELECT 'sdk_agents', COUNT(*) FROM cr_plugin_agents
|
||||||
|
UNION ALL SELECT 'sdk_skills', COUNT(*) FROM cr_plugin_skills
|
||||||
|
UNION ALL SELECT 'sdk_mcps', COUNT(*) FROM cr_plugin_mcps
|
||||||
|
UNION ALL SELECT 'agent_skills', COUNT(*) FROM cr_agent_skills
|
||||||
|
UNION ALL SELECT 'skill_mcps', COUNT(*) FROM cr_skill_mcps
|
||||||
|
UNION ALL SELECT 'agent_collaborations', COUNT(*) FROM cr_agent_collaborations;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Órfãos (inconsistências):**
|
||||||
|
```sql
|
||||||
|
-- Agent_mcps com agentes inexistentes
|
||||||
|
SELECT COUNT(*) FROM cr_agent_mcps am
|
||||||
|
LEFT JOIN cr_agents a ON am.agent_id = a.id
|
||||||
|
WHERE a.id IS NULL;
|
||||||
|
|
||||||
|
-- Repetir para todas as tabelas de relacionamento
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Auto-Repair de Relacionamentos
|
||||||
|
|
||||||
|
Quando detectados órfãos:
|
||||||
|
```sql
|
||||||
|
-- Limpar referências inválidas
|
||||||
|
DELETE FROM cr_agent_mcps WHERE agent_id NOT IN (SELECT id FROM cr_agents);
|
||||||
|
DELETE FROM cr_agent_mcps WHERE mcp_id NOT IN (SELECT id FROM cr_mcps);
|
||||||
|
DELETE FROM cr_plugin_agents WHERE sdk_id NOT IN (SELECT id FROM cr_plugins);
|
||||||
|
DELETE FROM cr_plugin_agents WHERE agent_id NOT IN (SELECT id FROM cr_agents);
|
||||||
|
-- ... repetir para outras tabelas
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Health Score Calculation
|
||||||
|
|
||||||
|
```
|
||||||
|
Health Score = (
|
||||||
|
entities_sync * 20 +
|
||||||
|
relationships_consistent * 20 +
|
||||||
|
mcps_responsive * 15 +
|
||||||
|
hooks_healthy * 15 +
|
||||||
|
decision_trees_valid * 10 +
|
||||||
|
telemetry_active * 10 +
|
||||||
|
plugins_functional * 10
|
||||||
|
) / 100
|
||||||
|
```
|
||||||
|
|
||||||
|
**Thresholds:**
|
||||||
|
- >= 90: Excelente (verde)
|
||||||
|
- 70-89: Bom (amarelo)
|
||||||
|
- < 70: Crítico (vermelho)
|
||||||
|
|
||||||
|
### 4. Reporting Detalhado
|
||||||
|
|
||||||
|
Dashboard completo incluindo:
|
||||||
|
- Contagem de entidades
|
||||||
|
- Contagem de relacionamentos
|
||||||
|
- Órfãos detectados
|
||||||
|
- Telemetria (30 dias)
|
||||||
|
- Decision trees status
|
||||||
|
- Recommendations pendentes
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
DETECTAR → DIAGNOSTICAR → REPARAR → VALIDAR → REPORTAR
|
||||||
|
```
|
||||||
|
|
||||||
|
1. **DETECTAR**: Query todas as tabelas
|
||||||
|
2. **DIAGNOSTICAR**: Identificar inconsistências
|
||||||
|
3. **REPARAR**: Limpar órfãos, actualizar telemetria
|
||||||
|
4. **VALIDAR**: Re-verificar consistência
|
||||||
|
5. **REPORTAR**: Gerar dashboard com métricas
|
||||||
|
|
||||||
|
## Integrações
|
||||||
|
|
||||||
|
- **MCPs**: desk-crm-v3, filesystem, mcp-time
|
||||||
|
- **Commands**:
|
||||||
|
- `/descomplicar:status` - Dashboard completo
|
||||||
|
- `/descomplicar:sync` - Sincronização
|
||||||
|
- `/descomplicar:relationships` - Gestão relacionamentos
|
||||||
|
- `/descomplicar:telemetry` - Métricas de uso
|
||||||
|
- `/descomplicar:decision-trees` - Gestão decision trees
|
||||||
|
- `/descomplicar:lsps` - Gestão Language Server Protocols
|
||||||
|
|
||||||
|
## Métricas de Sucesso
|
||||||
|
|
||||||
|
| Métrica | Target |
|
||||||
|
|---------|--------|
|
||||||
|
| Health Score | >= 90 |
|
||||||
|
| Órfãos | 0 |
|
||||||
|
| Sync latency | < 5s |
|
||||||
|
| Telemetry coverage | 100% |
|
||||||
|
|
||||||
|
## Exemplo de Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
User: Qual o estado da infraestrutura?
|
||||||
|
|
||||||
|
Infrastructure Manager:
|
||||||
|
1. [Verifica data/hora: 2026-02-04 16:00]
|
||||||
|
2. [Query entidades: 46 agents, 54 skills, 33 MCPs]
|
||||||
|
3. [Query relacionamentos: 800+ total, 0 órfãos]
|
||||||
|
4. [Calcula Health Score: 95/100]
|
||||||
|
5. Resposta:
|
||||||
|
"Health Score: 95/100 ████████████████████░ EXCELENTE
|
||||||
|
|
||||||
|
Core: 46 agents ✓ | 54 skills ✓ | 33 MCPs ✓
|
||||||
|
Relacionamentos: 800+ (0 órfãos) ✓
|
||||||
|
Última sync: há 2h
|
||||||
|
|
||||||
|
Alerta menor: MCP 'moloni' com latência 2.1s"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- Health Score é indicativo, não absoluto
|
||||||
|
- Sync pode demorar > 5s em bases de dados grandes
|
||||||
|
- Detecção de órfãos limitada a tabelas cr_* conhecidas
|
||||||
|
- Não corrige problemas automaticamente (apenas reporta)
|
||||||
|
- Telemetria depende de hooks activos e funcionais
|
||||||
177
core-tools/skills/metrics/SKILL.md
Normal file
177
core-tools/skills/metrics/SKILL.md
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
---
|
||||||
|
name: metrics
|
||||||
|
description: Dashboard de metricas de performance de skills e agentes com telemetria quantitativa, trending temporal, alertas de degradacao e calculo de ROI.
|
||||||
|
---
|
||||||
|
|
||||||
|
# SKILL: Performance Metrics Dashboard
|
||||||
|
|
||||||
|
## Proposito
|
||||||
|
|
||||||
|
Dashboard interactivo de performance de skills e agents com metricas quantitativas automaticas gravadas em Desk DB.
|
||||||
|
|
||||||
|
Complementa `/reflect` (qualitativo) com dados quantitativos, `/worklog` com metricas objectivas, e PDCA com decisoes data-driven.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quando Usar
|
||||||
|
|
||||||
|
- Ver performance de skills/agents
|
||||||
|
- Identificar degradacoes de performance
|
||||||
|
- Validar melhorias PDCA
|
||||||
|
- Analise ROI de optimizacoes
|
||||||
|
- Dashboard executivo de automacao
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comandos
|
||||||
|
|
||||||
|
| Comando | Funcao |
|
||||||
|
|---------|--------|
|
||||||
|
| `/metrics` | Overview geral (30 dias) |
|
||||||
|
| `/metrics <skill-name>` | Detalhes de skill especifica |
|
||||||
|
| `/metrics --project <id>` | Metricas por projecto |
|
||||||
|
| `/metrics --trend` | Trending temporal |
|
||||||
|
| `/metrics --compare` | Comparacao vs baseline |
|
||||||
|
| `/metrics --kb` | Metricas Dify KB |
|
||||||
|
| `/metrics --roi` | ROI por cliente/projecto |
|
||||||
|
| `/metrics --export` | Exportar JSON/CSV |
|
||||||
|
| `/metrics --alerts` | Listar alertas activos |
|
||||||
|
|
||||||
|
### Agregacoes Disponiveis
|
||||||
|
|
||||||
|
1. **avg** - Medias de performance (padrao)
|
||||||
|
2. **count** - Contagens por status
|
||||||
|
3. **trend** - Evolucao temporal (semanal)
|
||||||
|
4. **compare** - Comparacao com baseline
|
||||||
|
5. **detailed** - Listagem detalhada
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Execucao
|
||||||
|
|
||||||
|
### 1. Verificar Tools MCP
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Tools necessarios (MCP desk-crm-v3)
|
||||||
|
const REQUIRED_TOOLS = [
|
||||||
|
'mcp__desk-crm-v3__log_skill_metric',
|
||||||
|
'mcp__desk-crm-v3__get_skill_metrics'
|
||||||
|
];
|
||||||
|
// Se tools nao disponiveis -> query SQL directa como fallback
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Query Metricas
|
||||||
|
|
||||||
|
**Via MCP (preferencial):**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const metrics = await mcp__desk_crm_v3__get_skill_metrics({
|
||||||
|
days: 30,
|
||||||
|
aggregate: 'avg',
|
||||||
|
limit: 10
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Fallback SQL:** Ver [references/sql-queries.md](references/sql-queries.md)
|
||||||
|
|
||||||
|
### 3. Formatar Output
|
||||||
|
|
||||||
|
```
|
||||||
|
Performance Overview (ultimos {days} dias)
|
||||||
|
|
||||||
|
Top Skills/Agents:
|
||||||
|
| Nome | Usos | Avg Time | Trend | Status |
|
||||||
|
|----------------|------|----------|-------|--------|
|
||||||
|
| /orcamento | 45 | 18min | -12% | OK |
|
||||||
|
| /lead-approach | 38 | 22min | +5% | Alerta |
|
||||||
|
| wp-plugin-dev | 32 | 47min | -8% | OK |
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Analise Especifica
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const details = await get_skill_metrics({
|
||||||
|
name: skill_name,
|
||||||
|
days: 30,
|
||||||
|
aggregate: 'detailed'
|
||||||
|
});
|
||||||
|
|
||||||
|
const baseline = await query(
|
||||||
|
"SELECT baseline_duration_ms FROM tblskill_agent_baselines WHERE name = ?",
|
||||||
|
[skill_name]
|
||||||
|
);
|
||||||
|
const improvement = ((baseline - current_avg) / baseline * 100);
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Alertas Automaticos
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const degraded = await get_skill_metrics({
|
||||||
|
aggregate: 'compare',
|
||||||
|
days: 7
|
||||||
|
});
|
||||||
|
|
||||||
|
const alerts = degraded.results.filter(r =>
|
||||||
|
r.performance_status === 'DEGRADED'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (alerts.length > 0) {
|
||||||
|
// Output alertas e sugerir /reflect para investigar
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Trigger Reflect se Degradacao
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
if (degradation_pct > 15) {
|
||||||
|
// AUTO: Invocar reflect-agent em background
|
||||||
|
Task({
|
||||||
|
subagent_type: 'reflect-agent',
|
||||||
|
background: true,
|
||||||
|
model: 'sonnet',
|
||||||
|
prompt: `PERFORMANCE DEGRADATION: ${name} +${degradation_pct}%`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Integracao com Outros Sistemas
|
||||||
|
|
||||||
|
| Comando | Foco | Quando Usar |
|
||||||
|
|---------|------|-------------|
|
||||||
|
| `/taskforce kb-health` | Saude sistema KB | Visao arquitectural |
|
||||||
|
| `/metrics --kb` | Performance queries KB | Analise operacional |
|
||||||
|
| `/metrics --roi` | Valor economico gerado | Justificacao investimento |
|
||||||
|
|
||||||
|
**Workflow recomendado:**
|
||||||
|
1. `/taskforce kb-health` - Verificar gaps e coverage
|
||||||
|
2. `/metrics --kb` - Analisar performance queries
|
||||||
|
3. `/metrics --roi` - Calcular ROI para stakeholders
|
||||||
|
|
||||||
|
Link Desk CRM: `https://desk.descomplicar.pt/admin/projects/view/65`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notas Tecnicas
|
||||||
|
|
||||||
|
**Tabelas DB:** `tblskill_agent_metrics` (telemetria), `tblskill_agent_baselines` (baselines), `tblskill_agent_pdca_cycles` (PDCA historico)
|
||||||
|
|
||||||
|
**Tools:** Implementados em `/opt/desk-crm-v3/src/tools/core/metrics.ts`
|
||||||
|
|
||||||
|
**Fallback:** Se tools MCP nao disponiveis, usar queries SQL directas via `sql_direct`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Conteudo Detalhado
|
||||||
|
|
||||||
|
| Referencia | Conteudo |
|
||||||
|
|------------|----------|
|
||||||
|
| [references/sql-queries.md](references/sql-queries.md) | Queries SQL completas (top 10, ROI, trending) |
|
||||||
|
| [references/dashboards-templates.md](references/dashboards-templates.md) | Templates visuais KB, ROI, alertas, export, ASCII charts |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Desk CRM:** Projecto #65, Task #1637
|
||||||
126
core-tools/skills/metrics/references/dashboards-templates.md
Normal file
126
core-tools/skills/metrics/references/dashboards-templates.md
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
# Metrics - Templates de Dashboards
|
||||||
|
|
||||||
|
## Dashboard KB Performance
|
||||||
|
|
||||||
|
```
|
||||||
|
DIFY KB PERFORMANCE DASHBOARD
|
||||||
|
|
||||||
|
CACHE PERFORMANCE
|
||||||
|
Hit Rate: [barra progresso] X% (target: 40%+)
|
||||||
|
|
||||||
|
Cache Breakdown:
|
||||||
|
| Skill | Queries | Hits | Hit % |
|
||||||
|
|----------------|---------|------|-------|
|
||||||
|
| /orcamento | 5 | 1 | 20% |
|
||||||
|
| /lead-approach | 3 | 0 | 0% |
|
||||||
|
| /wp-dev | 4 | 0 | 0% |
|
||||||
|
|
||||||
|
QUERY RELEVANCE (avg score)
|
||||||
|
SEO: 0.85
|
||||||
|
Perfex: 0.79
|
||||||
|
Elementor: 0.70
|
||||||
|
Marketing: 0.66
|
||||||
|
Vendas: 0.46 (alerta)
|
||||||
|
|
||||||
|
IMPACT ON PERFORMANCE
|
||||||
|
Com Dify KB: 18 min avg
|
||||||
|
Sem Dify KB: 30 min avg (baseline)
|
||||||
|
Improvement: -40%
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dashboard ROI por Cliente/Projecto
|
||||||
|
|
||||||
|
```
|
||||||
|
ROI POR CLIENTE/PROJECTO (ultimos 30 dias)
|
||||||
|
|
||||||
|
TOP CLIENTES POR VALOR GERADO
|
||||||
|
| Cliente | Horas | Skills | Valor (EUR) |
|
||||||
|
|--------------|-------|--------|-------------|
|
||||||
|
| SFV-360 | 24h | 45 | 1.200,00 |
|
||||||
|
| Descomplicar | 18h | 32 | 900,00 |
|
||||||
|
| INTERNAL | 12h | 28 | 600,00 |
|
||||||
|
|
||||||
|
TOTAL PERIODO: 54 horas poupadas = 2.700,00 EUR
|
||||||
|
Custo hora interno: 50,00 EUR
|
||||||
|
|
||||||
|
BREAKDOWN POR SKILL
|
||||||
|
/orcamento: 12h poupadas (baseline 30min->18min)
|
||||||
|
/wp-dev: 8h poupadas (baseline 4h->2h)
|
||||||
|
/lead-approach: 6h poupadas (baseline 25min->12min)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dashboard Alertas
|
||||||
|
|
||||||
|
```
|
||||||
|
ALERTAS ACTIVOS
|
||||||
|
|
||||||
|
DEGRADACAO (>15% vs baseline)
|
||||||
|
/lead-approach: +22% (baseline 12min -> actual 15min)
|
||||||
|
Ultima ocorrencia: 2026-02-02
|
||||||
|
Afecta: 3 projectos
|
||||||
|
Accao: Executar /reflect para investigar
|
||||||
|
|
||||||
|
LOW CACHE HIT (<30%)
|
||||||
|
Cache hit rate: 6.3%
|
||||||
|
Target: 40%
|
||||||
|
Causa: Sistema recente, acumular com uso
|
||||||
|
|
||||||
|
MELHORIAS DETECTADAS
|
||||||
|
/orcamento: -40% (era 30min, agora 18min)
|
||||||
|
/wp-dev: -50% (era 4h, agora 2h)
|
||||||
|
|
||||||
|
Configurar alertas:
|
||||||
|
- Degradacao threshold: 15% (padrao)
|
||||||
|
- Cache hit minimum: 30% (padrao)
|
||||||
|
- Error rate maximum: 10% (padrao)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dashboard Export
|
||||||
|
|
||||||
|
```
|
||||||
|
Formatos disponiveis:
|
||||||
|
1. JSON - ~/.claude/skills/_metrics-export-YYYYMMDD.json
|
||||||
|
2. CSV - ~/.claude/skills/_metrics-export-YYYYMMDD.csv
|
||||||
|
3. Markdown - Para colar em documentos
|
||||||
|
|
||||||
|
Campos exportados:
|
||||||
|
- name, type, executions, avg_ms, baseline_ms
|
||||||
|
- improvement_pct, error_rate, kb_consulted
|
||||||
|
- cache_hit_rate, project_id, client_name
|
||||||
|
```
|
||||||
|
|
||||||
|
## ASCII Charts Library
|
||||||
|
|
||||||
|
### Progress Bar
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
function progressBar(value, max, width=20) {
|
||||||
|
const filled = Math.round((value / max) * width);
|
||||||
|
const empty = width - filled;
|
||||||
|
return '#'.repeat(filled) + '-'.repeat(empty);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Trending Arrow
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
function trendIcon(pct) {
|
||||||
|
if (pct < -10) return 'melhoria significativa';
|
||||||
|
if (pct < 0) return 'melhoria';
|
||||||
|
if (pct === 0) return 'estavel';
|
||||||
|
if (pct < 10) return 'degradacao ligeira';
|
||||||
|
return 'degradacao significativa';
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mini Sparkline
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
function sparkline(values) {
|
||||||
|
const chars = '________';
|
||||||
|
const min = Math.min(...values);
|
||||||
|
const max = Math.max(...values);
|
||||||
|
const range = max - min || 1;
|
||||||
|
return values.map(v => chars[Math.floor((v - min) / range * 7)]).join('');
|
||||||
|
}
|
||||||
|
```
|
||||||
77
core-tools/skills/metrics/references/sql-queries.md
Normal file
77
core-tools/skills/metrics/references/sql-queries.md
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# Metrics - Queries SQL (Fallback)
|
||||||
|
|
||||||
|
Queries para usar quando tools MCP nao estao disponiveis.
|
||||||
|
|
||||||
|
## Top 10 Skills
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
name,
|
||||||
|
COUNT(*) as uses,
|
||||||
|
AVG(duration_ms)/60000 as avg_min,
|
||||||
|
(SUM(CASE WHEN status='error' THEN 1 ELSE 0 END) / COUNT(*) * 100) as error_rate
|
||||||
|
FROM tblskill_agent_metrics
|
||||||
|
WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||||
|
AND type = 'skill'
|
||||||
|
GROUP BY name
|
||||||
|
ORDER BY uses DESC
|
||||||
|
LIMIT 10;
|
||||||
|
```
|
||||||
|
|
||||||
|
## ROI por Projecto
|
||||||
|
|
||||||
|
```sql
|
||||||
|
WITH skill_savings AS (
|
||||||
|
SELECT
|
||||||
|
m.project_id,
|
||||||
|
m.name,
|
||||||
|
COUNT(*) as uses,
|
||||||
|
(b.baseline_duration_ms - AVG(m.duration_ms))/60000 as saved_per_use_min
|
||||||
|
FROM tblskill_agent_metrics m
|
||||||
|
JOIN tblskill_agent_baselines b ON b.name = m.name
|
||||||
|
WHERE m.status = 'success'
|
||||||
|
GROUP BY m.project_id, m.name
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
p.name as project,
|
||||||
|
c.company as client,
|
||||||
|
s.name as skill,
|
||||||
|
s.uses,
|
||||||
|
ROUND(s.uses * s.saved_per_use_min/60, 1) as hours_saved,
|
||||||
|
ROUND((s.uses * s.saved_per_use_min/60) * 50, 2) as value_eur
|
||||||
|
FROM skill_savings s
|
||||||
|
JOIN tblprojects p ON p.id = s.project_id
|
||||||
|
JOIN tblclients c ON c.userid = p.clientid
|
||||||
|
WHERE s.saved_per_use_min > 0
|
||||||
|
ORDER BY hours_saved DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Trending Semanal
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
name,
|
||||||
|
DATE_FORMAT(created_at, '%Y-W%u') as week,
|
||||||
|
COUNT(*) as executions,
|
||||||
|
AVG(duration_ms) as avg_ms
|
||||||
|
FROM tblskill_agent_metrics
|
||||||
|
WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||||
|
GROUP BY name, week
|
||||||
|
ORDER BY name, week DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Query Basica via MCP
|
||||||
|
|
||||||
|
```sql
|
||||||
|
SELECT
|
||||||
|
name,
|
||||||
|
type,
|
||||||
|
COUNT(*) as executions,
|
||||||
|
AVG(duration_ms) as avg_ms,
|
||||||
|
(SUM(CASE WHEN status='error' THEN 1 ELSE 0 END) / COUNT(*) * 100) as error_rate
|
||||||
|
FROM tblskill_agent_metrics
|
||||||
|
WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||||
|
GROUP BY name, type
|
||||||
|
ORDER BY executions DESC
|
||||||
|
LIMIT 10;
|
||||||
|
```
|
||||||
99
core-tools/skills/plugin-curator/SKILL.md
Normal file
99
core-tools/skills/plugin-curator/SKILL.md
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
---
|
||||||
|
name: plugin-curator
|
||||||
|
description: Curadoria inteligente de plugins para o ecossistema Claude Code — descoberta, recomendações, actualizações e identificação de gaps funcionais.
|
||||||
|
allowed-tools: Read, Glob, Grep, WebFetch, WebSearch
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Curator
|
||||||
|
|
||||||
|
Curadoria inteligente de plugins para o ecossistema Claude Code.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill deve ser activada quando:
|
||||||
|
- Utilizador pede recomendações de plugins
|
||||||
|
- Novo tipo de tarefa sem skill/plugin adequado
|
||||||
|
- Actualização disponível para plugins instalados
|
||||||
|
- Gap identificado na cobertura funcional
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. Discovery
|
||||||
|
- Pesquisar marketplaces oficiais e comunitários
|
||||||
|
- Avaliar relevância baseada no contexto actual
|
||||||
|
- Identificar plugins com funcionalidades sobrepostas
|
||||||
|
- Detectar plugins desactualizados ou abandonados
|
||||||
|
|
||||||
|
### 2. Evaluation
|
||||||
|
- Analisar qualidade do código (se open source)
|
||||||
|
- Verificar compatibilidade com sistema actual
|
||||||
|
- Avaliar segurança (hooks, permissões)
|
||||||
|
- Medir popularidade e manutenção activa
|
||||||
|
|
||||||
|
### 3. Installation Management
|
||||||
|
- Instalar plugins recomendados
|
||||||
|
- Configurar hooks e MCPs do plugin
|
||||||
|
- Resolver conflitos com plugins existentes
|
||||||
|
- Gerir actualizações e rollbacks
|
||||||
|
|
||||||
|
### 4. Gap Analysis
|
||||||
|
- Mapear funcionalidades existentes
|
||||||
|
- Identificar áreas sem cobertura
|
||||||
|
- Sugerir plugins ou skills a desenvolver
|
||||||
|
- Priorizar baseado em uso real
|
||||||
|
|
||||||
|
## Marketplaces Conhecidos
|
||||||
|
|
||||||
|
| Marketplace | URL | Tipo |
|
||||||
|
|-------------|-----|------|
|
||||||
|
| anthropics/claude-plugins-official | github.com | Oficial |
|
||||||
|
| coreyhaines31/marketingskills | github.com | Marketing |
|
||||||
|
| alirezarezvani/claude-skills | github.com | Geral |
|
||||||
|
| Chat2AnyLLM/awesome-claude-plugins | github.com | Curadoria |
|
||||||
|
| obra/superpowers | github.com | Metodologia |
|
||||||
|
|
||||||
|
## Scoring Algorithm
|
||||||
|
|
||||||
|
```
|
||||||
|
score = 0
|
||||||
|
score += keyword_match * 3 # Max 3
|
||||||
|
score += category_align * 2 # Max 2
|
||||||
|
score += popularity # Max 2 (>1k stars)
|
||||||
|
score += recent_update # Max 1 (<30 days)
|
||||||
|
score += no_conflicts * 2 # Max 2
|
||||||
|
# Total max: 10
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
ANALYSE GAPS → SEARCH MARKETPLACES → EVALUATE → RECOMMEND → INSTALL
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exemplo de Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
User: Preciso de ajuda com testes automatizados
|
||||||
|
Assistant: [Activa plugin-curator]
|
||||||
|
- Verifica skills de testing existentes: Nenhuma
|
||||||
|
- Pesquisa marketplaces por "testing", "QA", "automation"
|
||||||
|
- Encontra: pr-review-toolkit (6 agents QA), superpowers (TDD)
|
||||||
|
- Recomenda: "Encontrei 2 plugins relevantes para testing:
|
||||||
|
1. pr-review-toolkit - 6 agents especializados em QA
|
||||||
|
2. superpowers - Metodologia TDD integrada
|
||||||
|
Qual preferes instalar?"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- Não instala plugins automaticamente (requer confirmação)
|
||||||
|
- Não avalia plugins de fontes privadas/não acessíveis
|
||||||
|
- Score máximo 10 - pode não reflectir 100% da qualidade real
|
||||||
|
- Depende de metadados disponíveis nos marketplaces
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
- NUNCA instalar plugins sem confirmação do utilizador
|
||||||
|
- NUNCA instalar plugins de fontes não verificadas
|
||||||
|
- Verificar SEMPRE conflitos antes de instalar
|
||||||
|
- Manter registo de todos os plugins avaliados
|
||||||
143
core-tools/skills/plugin-manager/SKILL.md
Normal file
143
core-tools/skills/plugin-manager/SKILL.md
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
---
|
||||||
|
name: plugin-config
|
||||||
|
description: Gestão inteligente de plugins por contexto. Avalia regras aditivas e activa cada plugin relevante para o contexto actual (directório, ficheiros, conversa).
|
||||||
|
user-invocable: false
|
||||||
|
allowed-tools: Read, Bash, Glob
|
||||||
|
---
|
||||||
|
|
||||||
|
# /plugin-config v3.0 - Gestao Inteligente de Plugins
|
||||||
|
|
||||||
|
Cada plugin tem regras de activacao. O sistema avalia todas e activa o que fizer sentido.
|
||||||
|
Sem profiles — aditivo, contextual, automatico.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comandos
|
||||||
|
|
||||||
|
| Comando | Funcao |
|
||||||
|
|---------|--------|
|
||||||
|
| `/plugin-config status` | Plugins activos/inactivos e porquê |
|
||||||
|
| `/plugin-config apply` | Avalia regras e aplica alteracoes ao settings.json |
|
||||||
|
| `/plugin-config enable <plugin>` | Forca activacao de um plugin |
|
||||||
|
| `/plugin-config disable <plugin>` | Forca desactivacao de um plugin |
|
||||||
|
| `/plugin-config reset` | Activa todos os plugins |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Como funciona
|
||||||
|
|
||||||
|
### Registry (profiles.json v3.0)
|
||||||
|
|
||||||
|
Cada plugin tem regras `activate_when`:
|
||||||
|
- **directories** — $PWD comeca com este path
|
||||||
|
- **files** — ficheiro existe no projecto (ate 2 niveis acima)
|
||||||
|
- **keywords** — palavra aparece no contexto da conversa
|
||||||
|
- **ssh_context** — quando trabalho via SSH envolve estes termos
|
||||||
|
- **content_match** — conteudo especifico dentro de um ficheiro
|
||||||
|
|
||||||
|
Regras sao **aditivas**: se qualquer regra de um plugin faz match, esse plugin activa.
|
||||||
|
Multiplos plugins podem activar simultaneamente.
|
||||||
|
|
||||||
|
### Always-on (4 plugins)
|
||||||
|
|
||||||
|
Nunca desactivados, independentemente do contexto:
|
||||||
|
- gestao, crm-ops, core-tools, superpowers
|
||||||
|
|
||||||
|
### Contextuais (19 plugins)
|
||||||
|
|
||||||
|
| Plugin | Activa quando |
|
||||||
|
|--------|---------------|
|
||||||
|
| **project-manager** | SPEC.md, SPRINT.md, .desk-project, Dev/ ou Hub/ directory |
|
||||||
|
| **wordpress** | wp-config.php, wordpress, elementor, woocommerce |
|
||||||
|
| **dev-tools** | package.json, composer.json, react, typescript, refactor |
|
||||||
|
| **infraestrutura** | docker-compose.yml, servidor, cwp, easypanel, ssl, deploy |
|
||||||
|
| **marketing** | seo, campanha, google ads, social media, copywriting |
|
||||||
|
| **design-media** | design, ui, ux, apresentacao, video, figma |
|
||||||
|
| **metabase** | metabase, dashboard bi, kpi, query sql |
|
||||||
|
| **automacao** | n8n, workflow, moloni, webhook, mcp server |
|
||||||
|
| **perfex-dev** | init.php + register_module, perfex |
|
||||||
|
| **negocio** | estrategia negocio, saas, e-commerce, pricing, swot |
|
||||||
|
| **plugin-dev** | .claude-plugin, SKILL.md, criar skill/agent/hook |
|
||||||
|
| **feature-dev** | package.json, implementar feature, nova feature |
|
||||||
|
| **frontend-design** | tailwind.config, css, frontend design, layout |
|
||||||
|
| **frontend-excellence** | next.config.*, react avancado, nextjs, state management |
|
||||||
|
| **cache-components** | next.config.*, cache component, ppr |
|
||||||
|
| **pr-review-toolkit** | .git, review, pull request, code review |
|
||||||
|
| **context7** | package.json, docs, documentacao biblioteca |
|
||||||
|
| **ralph-loop** | ralph, loop autonomo |
|
||||||
|
| **playground** | playground, html interactivo |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Protocolo: /plugin-config apply
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Ler profiles.json (registry)
|
||||||
|
2. Para CADA plugin contextual:
|
||||||
|
a. Avaliar activate_when.directories vs $PWD
|
||||||
|
b. Avaliar activate_when.files vs ficheiros no projecto
|
||||||
|
c. Avaliar activate_when.keywords vs contexto da conversa
|
||||||
|
d. Se qualquer regra match → marcar para activar
|
||||||
|
e. Se nenhuma regra match → marcar para desactivar
|
||||||
|
3. Construir mapa enabledPlugins:
|
||||||
|
- always_on → sempre true
|
||||||
|
- matched → true
|
||||||
|
- nao matched → false
|
||||||
|
4. Aplicar via jq em ~/.claude/settings.json
|
||||||
|
5. Output: lista de alteracoes
|
||||||
|
6. Informar: "Alteracoes aplicadas. Restart sessao para efeito."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Protocolo: /plugin-config status
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Ler ~/.claude/settings.json → enabledPlugins
|
||||||
|
2. Ler profiles.json → registry
|
||||||
|
3. Para cada plugin:
|
||||||
|
- Estado actual (activo/inactivo)
|
||||||
|
- Tipo (always_on / contextual)
|
||||||
|
- Regras que fazem match no contexto actual
|
||||||
|
4. Mostrar tabela organizada
|
||||||
|
```
|
||||||
|
|
||||||
|
## Protocolo: /plugin-config enable <plugin>
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Activar plugin via jq em settings.json
|
||||||
|
2. Informar: "Plugin activado. Restart sessao para efeito."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Protocolo: /plugin-config disable <plugin>
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Verificar que nao esta em always_on
|
||||||
|
2. Desactivar via jq em settings.json
|
||||||
|
3. Informar: "Plugin desactivado. Restart sessao para efeito."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Protocolo: /plugin-config reset
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Activar TODOS os plugins (contextual + always_on) em settings.json
|
||||||
|
2. Informar: "Todos os plugins activados."
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Hook automatico
|
||||||
|
|
||||||
|
`~/.claude/hooks/plugin-context-detector.sh` corre no inicio de cada sessao (UserPromptSubmit).
|
||||||
|
Avalia todas as regras e sugere `/plugin-config apply` se detectar alteracoes necessarias.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
- NUNCA desactivar plugins always_on
|
||||||
|
- NUNCA editar settings.json sem jq (Regra #40)
|
||||||
|
- NUNCA prometer efeito imediato — restart e necessario
|
||||||
|
- NUNCA ignorar sugestao do hook — executar /plugin-config apply
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Skill v3.0.0 | 04-03-2026 | Descomplicar*
|
||||||
143
core-tools/skills/plugin-manager/profiles.json
Normal file
143
core-tools/skills/plugin-manager/profiles.json
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
{
|
||||||
|
"version": "3.1",
|
||||||
|
"type": "plugin-registry",
|
||||||
|
"always_on": [
|
||||||
|
"gestao@descomplicar-plugins",
|
||||||
|
"crm-ops@descomplicar-plugins",
|
||||||
|
"core-tools@descomplicar-plugins",
|
||||||
|
"superpowers@claude-plugins-official"
|
||||||
|
],
|
||||||
|
"plugins": {
|
||||||
|
"wordpress@descomplicar-plugins": {
|
||||||
|
"description": "WordPress, Elementor, WooCommerce, themes, plugins WP",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["wp-config.php", "wp-content", "functions.php", "style.css"],
|
||||||
|
"keywords": ["wordpress", "elementor", "woocommerce", "wp-cli", "theme wordpress", "plugin wp", "rank math", "branda", "wp-admin", "wp update"],
|
||||||
|
"ssh_context": ["cwp", "public_html", "wp-admin"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dev-tools@descomplicar-plugins": {
|
||||||
|
"description": "Desenvolvimento JS/PHP/DB, React, arquitectura, code review",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["package.json", "composer.json", "tsconfig.json", "artisan", ".eslintrc", "Makefile", "pom.xml"],
|
||||||
|
"keywords": ["react", "typescript", "javascript", "php", "laravel", "api rest", "database design", "schema", "refactor", "debug codigo", "componente react", "fullstack", "backend", "endpoint"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"infraestrutura@descomplicar-plugins": {
|
||||||
|
"description": "Servidores, CWP, EasyPanel, Proxmox, SSL, DNS, Docker, backups servidor",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["docker-compose.yml", "Dockerfile", ".env.production"],
|
||||||
|
"directories": ["/root/Dev"],
|
||||||
|
"keywords": ["servidor", "server", "cwp", "easypanel", "proxmox", "ssl certificado", "dns", "docker", "deploy", "backup servidor", "nginx", "apache", "firewall", "ssh servidor", "email servidor", "postfix", "pbs", "migration vm"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"marketing@descomplicar-plugins": {
|
||||||
|
"description": "SEO, campanhas, ads, social media, conteudo, copywriting",
|
||||||
|
"activate_when": {
|
||||||
|
"keywords": ["seo", "marketing", "campanha", "google ads", "meta ads", "social media", "copywriting", "newsletter", "email marketing", "landing page", "conversao", "lead approach", "conteudo marketing", "instagram", "linkedin", "tiktok", "youtube marketing", "ppc"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"design-media@descomplicar-plugins": {
|
||||||
|
"description": "Design UI/UX, apresentacoes, infograficos, video, identidade visual",
|
||||||
|
"activate_when": {
|
||||||
|
"keywords": ["design", "ui design", "ux design", "apresentacao", "infografico", "logo", "identidade visual", "pptx", "slides", "remotion", "video producao", "thumbnail", "figma", "penpot", "mockup", "wireframe", "brand"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"metabase@descomplicar-plugins": {
|
||||||
|
"description": "BI, dashboards Metabase, queries SQL analytics",
|
||||||
|
"activate_when": {
|
||||||
|
"keywords": ["metabase", "dashboard bi", "analytics dados", "kpi dashboard", "query sql metabase", "relatorio dados"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"automacao@descomplicar-plugins": {
|
||||||
|
"description": "N8N, workflows, integracoes, Moloni, MCPs dev, webhooks",
|
||||||
|
"activate_when": {
|
||||||
|
"keywords": ["n8n", "workflow automacao", "moloni", "webhook", "integracao sistemas", "mcp server", "mcp desenvolvimento", "automacao processo"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"perfex-dev@descomplicar-plugins": {
|
||||||
|
"description": "Modulos Perfex CRM, controllers, hooks, views, migrations Perfex",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["init.php"],
|
||||||
|
"content_match": "register_module",
|
||||||
|
"keywords": ["perfex", "modulo perfex", "perfex crm"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"negocio@descomplicar-plugins": {
|
||||||
|
"description": "Estrategia, pesquisa mercado, SaaS, e-commerce, produto",
|
||||||
|
"activate_when": {
|
||||||
|
"keywords": ["estrategia negocio", "pesquisa mercado", "saas", "e-commerce", "produto digital", "pricing", "business model", "swot", "porter", "concorrencia", "proposta valor"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"project-manager@descomplicar-plugins": {
|
||||||
|
"description": "Specs, sprints, brainstorm, status projecto, scope",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["SPEC.md", "SPRINT.md", ".desk-project"],
|
||||||
|
"directories": ["/media/ealmeida/Dados/Dev", "/media/ealmeida/Dados/Hub"],
|
||||||
|
"keywords": ["spec", "sprint", "brainstorm", "status projecto", "scope", "planeamento dev", "fase projecto", "milestone"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugin-dev@claude-plugins-official": {
|
||||||
|
"description": "Criar/editar plugins Claude Code, skills, agents, hooks",
|
||||||
|
"activate_when": {
|
||||||
|
"directories": ["/home/ealmeida/.claude/plugins"],
|
||||||
|
"files": [".claude-plugin", "SKILL.md", "plugin.json"],
|
||||||
|
"keywords": ["criar plugin", "criar skill", "criar agent", "criar hook", "plugin-dev", "editar skill", "novo agent"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"feature-dev@claude-plugins-official": {
|
||||||
|
"description": "Desenvolvimento guiado de features com exploracao de codebase",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["package.json", "composer.json", "tsconfig.json"],
|
||||||
|
"keywords": ["feature dev", "implementar feature", "desenvolver funcionalidade", "nova feature", "feature branch"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frontend-design@claude-plugins-official": {
|
||||||
|
"description": "Design frontend, componentes visuais, CSS, Tailwind",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["tailwind.config.js", "tailwind.config.ts", "postcss.config.js", "globals.css"],
|
||||||
|
"keywords": ["frontend design", "css", "tailwind", "componente visual", "responsive design", "layout pagina", "estilo css", "styled components"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frontend-excellence@dotclaude-plugins": {
|
||||||
|
"description": "React avancado, state management, performance frontend",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["next.config.js", "next.config.mjs", "next.config.ts", "vite.config.ts"],
|
||||||
|
"keywords": ["react avancado", "next.js", "nextjs", "state management", "zustand", "redux", "performance frontend", "core web vitals", "server components"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cache-components@nextjs": {
|
||||||
|
"description": "Next.js Cache Components e Partial Prerendering",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["next.config.js", "next.config.mjs", "next.config.ts"],
|
||||||
|
"keywords": ["cache component", "ppr", "partial prerendering", "next.js cache", "isr"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pr-review-toolkit@claude-plugins-official": {
|
||||||
|
"description": "Code review, PR review, analise de codigo, silent failures",
|
||||||
|
"activate_when": {
|
||||||
|
"files": [".git"],
|
||||||
|
"keywords": ["review", "code review", "pull request", "pr review", "review codigo", "merge", "git diff", "commit review"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ralph-loop@claude-plugins-official": {
|
||||||
|
"description": "Loop autonomo iterativo para tarefas complexas",
|
||||||
|
"activate_when": {
|
||||||
|
"keywords": ["ralph", "loop autonomo", "iteracao autonoma", "ralph loop"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playground@claude-plugins-official": {
|
||||||
|
"description": "Playgrounds HTML interactivos para exploracao visual",
|
||||||
|
"activate_when": {
|
||||||
|
"keywords": ["playground", "html interactivo", "explorador visual", "configurador visual"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"context7@claude-plugins-official": {
|
||||||
|
"description": "Documentacao actualizada de bibliotecas e frameworks",
|
||||||
|
"activate_when": {
|
||||||
|
"files": ["package.json", "composer.json", "requirements.txt", "Gemfile"],
|
||||||
|
"keywords": ["docs", "documentacao biblioteca", "context7", "como usar", "api reference", "exemplo codigo"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
190
core-tools/skills/quality-validator/SKILL.md
Normal file
190
core-tools/skills/quality-validator/SKILL.md
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
---
|
||||||
|
name: quality-validator
|
||||||
|
description: Validação de componentes contra os standards Descomplicar® — frontmatter, checklists e quality gates antes de activação ou release.
|
||||||
|
allowed-tools: Read, Glob, Grep
|
||||||
|
---
|
||||||
|
|
||||||
|
# Quality Validator
|
||||||
|
|
||||||
|
Skill para validar componentes e garantir qualidade mínima antes de activação.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill deve ser activada quando:
|
||||||
|
- Novo componente é criado
|
||||||
|
- Comando `/descomplicar:validate` é invocado
|
||||||
|
- Antes de release (`/descomplicar:release`)
|
||||||
|
- Após edição de componente existente
|
||||||
|
- Durante sync para bloquear componentes inválidos
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. Validar Skill
|
||||||
|
|
||||||
|
**Checklist Obrigatório:**
|
||||||
|
|
||||||
|
| Campo | Obrigatório | Peso |
|
||||||
|
|-------|-------------|------|
|
||||||
|
| `name:` | Sim | 15 |
|
||||||
|
| `description:` | Sim | 20 |
|
||||||
|
| `author:` | Sim | 5 |
|
||||||
|
| `version:` | Sim | 5 |
|
||||||
|
| `desk_task:` | Não | 5 |
|
||||||
|
| `allowed-tools:` | Sim | 10 |
|
||||||
|
| Triggers section | Sim | 10 |
|
||||||
|
| Capabilities section | Sim | 10 |
|
||||||
|
| Workflow | Não | 5 |
|
||||||
|
| Exemplo de Uso | Não | 10 |
|
||||||
|
| Limites section | Não | 5 |
|
||||||
|
|
||||||
|
**Validações de Qualidade:**
|
||||||
|
- `description:` contém triggers (keywords) → +5 pontos
|
||||||
|
- `description:` tem 5+ keywords → +5 pontos
|
||||||
|
- Tamanho < 500 linhas → +5 pontos
|
||||||
|
- Sem erros de sintaxe YAML → obrigatório
|
||||||
|
|
||||||
|
### 2. Validar Agent
|
||||||
|
|
||||||
|
**Checklist Obrigatório:**
|
||||||
|
|
||||||
|
| Campo | Obrigatório | Peso |
|
||||||
|
|-------|-------------|------|
|
||||||
|
| `name:` | Sim | 15 |
|
||||||
|
| `description:` | Sim | 20 |
|
||||||
|
| `model:` | Sim | 10 |
|
||||||
|
| `tools:` | Sim | 10 |
|
||||||
|
| `allowed-mcps:` | Sim | 15 |
|
||||||
|
| `category:` | Sim | 10 |
|
||||||
|
| `author:` | Sim | 5 |
|
||||||
|
| `version:` | Sim | 5 |
|
||||||
|
| Quando Usar section | Não | 5 |
|
||||||
|
| Workflow section | Não | 5 |
|
||||||
|
|
||||||
|
**Validações de Qualidade:**
|
||||||
|
- MCPs mapeados existem em `cr_mcps` → +5 pontos
|
||||||
|
- Categoria válida (dev|business|marketing|infra) → obrigatório
|
||||||
|
- Model válido (sonnet|opus|haiku) → obrigatório
|
||||||
|
|
||||||
|
### 3. Validar Command
|
||||||
|
|
||||||
|
**Checklist Obrigatório:**
|
||||||
|
|
||||||
|
| Campo | Obrigatório | Peso |
|
||||||
|
|-------|-------------|------|
|
||||||
|
| `name:` | Sim | 20 |
|
||||||
|
| `description:` | Sim | 30 |
|
||||||
|
| `argument-hint:` | Não | 10 |
|
||||||
|
| Objectivo section | Sim | 15 |
|
||||||
|
| Sintaxe section | Sim | 15 |
|
||||||
|
| Output section | Não | 10 |
|
||||||
|
|
||||||
|
### 4. Calcular Score
|
||||||
|
|
||||||
|
**Fórmula:**
|
||||||
|
```
|
||||||
|
score = (campos_obrigatorios * peso_obrigatorio) + (campos_opcionais * peso_opcional) + bonus_qualidade
|
||||||
|
```
|
||||||
|
|
||||||
|
**Interpretação:**
|
||||||
|
| Score | Status | Acção |
|
||||||
|
|-------|--------|-------|
|
||||||
|
| >= 90 | Production | Pronto para uso |
|
||||||
|
| 70-89 | Beta | Pode activar com aviso |
|
||||||
|
| 50-69 | Draft | Requer melhorias |
|
||||||
|
| < 50 | Invalid | **BLOQUEAR** activação |
|
||||||
|
|
||||||
|
### 5. Gerar Relatório
|
||||||
|
|
||||||
|
**Output:**
|
||||||
|
```
|
||||||
|
╔══════════════════════════════════════════════════════════════════════╗
|
||||||
|
║ QUALITY VALIDATION: <component-name> ║
|
||||||
|
║ Type: Skill | Path: skills/<name>/SKILL.md ║
|
||||||
|
╠══════════════════════════════════════════════════════════════════════╣
|
||||||
|
║ FRONTMATTER ║
|
||||||
|
║ ├── name: ✓ Present ║
|
||||||
|
║ ├── description: ✓ Present (5 keywords detected) ║
|
||||||
|
║ ├── author: ✓ Present ║
|
||||||
|
║ ├── version: ✓ Present (1.0.0) ║
|
||||||
|
║ ├── desk_task: ✗ Missing (optional) ║
|
||||||
|
║ └── allowed-tools: ✓ Present (Read, Glob, Grep) ║
|
||||||
|
╠══════════════════════════════════════════════════════════════════════╣
|
||||||
|
║ CONTENT SECTIONS ║
|
||||||
|
║ ├── Triggers: ✓ Present ║
|
||||||
|
║ ├── Capabilities: ✓ Present (3 capabilities) ║
|
||||||
|
║ ├── Workflow: ✓ Present ║
|
||||||
|
║ ├── Exemplo: ✗ Missing (recommended) ║
|
||||||
|
║ └── Limites: ✗ Missing (recommended) ║
|
||||||
|
╠══════════════════════════════════════════════════════════════════════╣
|
||||||
|
║ QUALITY CHECKS ║
|
||||||
|
║ ├── Lines: 234 (< 500 ✓) ║
|
||||||
|
║ ├── YAML syntax: Valid ✓ ║
|
||||||
|
║ └── Keywords: 5 detected ✓ ║
|
||||||
|
╠══════════════════════════════════════════════════════════════════════╣
|
||||||
|
║ SCORE: 78/100 ████████████████░░░░ BETA ║
|
||||||
|
╠══════════════════════════════════════════════════════════════════════╣
|
||||||
|
║ SUGGESTIONS ║
|
||||||
|
║ 1. Adicionar secção "Exemplo de Uso" (+10 pontos) ║
|
||||||
|
║ 2. Adicionar secção "Limites" (+5 pontos) ║
|
||||||
|
║ 3. Adicionar desk_task no frontmatter (+5 pontos) ║
|
||||||
|
╚══════════════════════════════════════════════════════════════════════╝
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quality Gates
|
||||||
|
|
||||||
|
### Gate 1: Criação
|
||||||
|
- Score >= 50 para criar componente
|
||||||
|
- Se < 50: BLOQUEAR e mostrar erros
|
||||||
|
|
||||||
|
### Gate 2: Activação
|
||||||
|
- Score >= 70 para activar componente
|
||||||
|
- Se < 70: AVISO + sugestões
|
||||||
|
|
||||||
|
### Gate 3: Release
|
||||||
|
- Score >= 90 para todos os componentes
|
||||||
|
- Se algum < 90: BLOQUEAR release
|
||||||
|
|
||||||
|
## Integração com Sync
|
||||||
|
|
||||||
|
Durante `/descomplicar:sync`:
|
||||||
|
```sql
|
||||||
|
-- Verificar componentes com score baixo
|
||||||
|
SELECT c.slug, c.quality_score, c.status
|
||||||
|
FROM cr_skills c
|
||||||
|
WHERE c.quality_score < 70 AND c.status = 'active';
|
||||||
|
|
||||||
|
-- Marcar para revisão
|
||||||
|
UPDATE cr_skills
|
||||||
|
SET status = 'review_required'
|
||||||
|
WHERE quality_score < 70 AND status = 'active';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
READ COMPONENT → PARSE FRONTMATTER → CHECK SECTIONS → CALCULATE SCORE → REPORT
|
||||||
|
↓ ↓ ↓ ↓ ↓
|
||||||
|
File path YAML valid All present 0-100 Suggestions
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exemplo de Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
User: Valida a skill infrastructure-manager
|
||||||
|
|
||||||
|
Quality Validator:
|
||||||
|
1. [Lê skills/infrastructure-manager/SKILL.md]
|
||||||
|
2. [Verifica frontmatter: 6/6 campos]
|
||||||
|
3. [Verifica secções: 4/5 presentes]
|
||||||
|
4. [Calcula score: 85/100]
|
||||||
|
5. Resultado:
|
||||||
|
"Score: 85/100 (BETA)
|
||||||
|
✓ Pronto para uso
|
||||||
|
Sugestão: Adicionar secção 'Limites' para score 90+"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- Não modifica componentes (apenas lê e reporta)
|
||||||
|
- Não cria componentes (usar component-generator)
|
||||||
|
- Não executa correções automáticas (usar /descomplicar:upgrade)
|
||||||
225
core-tools/skills/relationship-manager/SKILL.md
Normal file
225
core-tools/skills/relationship-manager/SKILL.md
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
---
|
||||||
|
name: relationship-manager
|
||||||
|
description: Gestão inteligente de relacionamentos entre componentes do sistema — mapeamento de dependências, colaborações agent-MCP/skill e análise de impacto.
|
||||||
|
allowed-tools: Read, Glob, Grep, ToolSearch
|
||||||
|
---
|
||||||
|
|
||||||
|
# Relationship Manager
|
||||||
|
|
||||||
|
Gestão inteligente de relacionamentos entre componentes do sistema.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
Esta skill deve ser activada quando:
|
||||||
|
- Utilizador pede para configurar relacionamentos
|
||||||
|
- Novo componente é adicionado e precisa de mapeamentos
|
||||||
|
- Inconsistências detectadas em relacionamentos
|
||||||
|
- Análise de impacto de mudanças
|
||||||
|
|
||||||
|
## Schema de Relacionamentos
|
||||||
|
|
||||||
|
### Hierarquia
|
||||||
|
|
||||||
|
```
|
||||||
|
TaskForce (Plugin)
|
||||||
|
├── cr_plugin_agents → Agentes do Plugin
|
||||||
|
├── cr_plugin_skills → Skills do Plugin
|
||||||
|
└── cr_plugin_mcps → MCPs do Plugin
|
||||||
|
|
||||||
|
Agent
|
||||||
|
├── cr_agent_mcps → MCPs do Agente (primary/recommended/available)
|
||||||
|
├── cr_agent_skills → Skills do Agente
|
||||||
|
└── cr_agent_collaborations → Colaborações com outros Agentes
|
||||||
|
|
||||||
|
Skill
|
||||||
|
└── cr_skill_mcps → MCPs necessários para a Skill
|
||||||
|
|
||||||
|
Decision Tree
|
||||||
|
└── Referencia um Agent para selecção automática
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tipos de Relacionamento
|
||||||
|
|
||||||
|
**cr_agent_mcps.relationship_type:**
|
||||||
|
- `primary` - MCPs essenciais, sempre disponíveis
|
||||||
|
- `recommended` - MCPs recomendados, usar quando relevante
|
||||||
|
- `available` - MCPs opcionais, disponíveis se necessário
|
||||||
|
|
||||||
|
**cr_agent_collaborations.collaboration_type:**
|
||||||
|
- `technical` - Colaboração técnica (mesmo domínio)
|
||||||
|
- `cross-domain` - Colaboração entre domínios diferentes
|
||||||
|
- `sequential` - Um passa trabalho para outro
|
||||||
|
- `parallel` - Trabalham em paralelo
|
||||||
|
|
||||||
|
## Capabilities
|
||||||
|
|
||||||
|
### 1. Análise de Relacionamentos
|
||||||
|
|
||||||
|
**Ver todos os relacionamentos de um componente:**
|
||||||
|
```sql
|
||||||
|
-- Para um Agente
|
||||||
|
SELECT 'MCP' as type, m.slug, am.relationship_type
|
||||||
|
FROM cr_agent_mcps am
|
||||||
|
JOIN cr_mcps m ON am.mcp_id = m.id
|
||||||
|
WHERE am.agent_id = (SELECT id FROM cr_agents WHERE slug = ?)
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT 'Skill', s.slug, 'uses'
|
||||||
|
FROM cr_agent_skills ags
|
||||||
|
JOIN cr_skills s ON ags.skill_id = s.id
|
||||||
|
WHERE ags.agent_id = (SELECT id FROM cr_agents WHERE slug = ?)
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT 'TaskForce', p.slug, 'member'
|
||||||
|
FROM cr_plugin_agents pa
|
||||||
|
JOIN cr_plugins p ON pa.plugin_id = p.id
|
||||||
|
WHERE pa.agent_id = (SELECT id FROM cr_agents WHERE slug = ?)
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT 'Collaborator', a2.slug, ac.collaboration_type
|
||||||
|
FROM cr_agent_collaborations ac
|
||||||
|
JOIN cr_agents a2 ON ac.collaborator_id = a2.id
|
||||||
|
WHERE ac.agent_id = (SELECT id FROM cr_agents WHERE slug = ?);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Sugestão de Relacionamentos
|
||||||
|
|
||||||
|
Baseado em padrões existentes:
|
||||||
|
```sql
|
||||||
|
-- MCPs usados por agentes similares (mesma categoria)
|
||||||
|
SELECT
|
||||||
|
m.slug,
|
||||||
|
COUNT(*) as usage_count,
|
||||||
|
GROUP_CONCAT(DISTINCT a.slug) as used_by
|
||||||
|
FROM cr_agent_mcps am
|
||||||
|
JOIN cr_mcps m ON am.mcp_id = m.id
|
||||||
|
JOIN cr_agents a ON am.agent_id = a.id
|
||||||
|
WHERE a.category = (SELECT category FROM cr_agents WHERE slug = ?)
|
||||||
|
AND am.agent_id != (SELECT id FROM cr_agents WHERE slug = ?)
|
||||||
|
AND m.id NOT IN (
|
||||||
|
SELECT mcp_id FROM cr_agent_mcps
|
||||||
|
WHERE agent_id = (SELECT id FROM cr_agents WHERE slug = ?)
|
||||||
|
)
|
||||||
|
GROUP BY m.id
|
||||||
|
ORDER BY usage_count DESC
|
||||||
|
LIMIT 5;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Validação de Consistência
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Verificar órfãos em todas as tabelas
|
||||||
|
SELECT 'cr_agent_mcps (agent)' as issue,
|
||||||
|
COUNT(*) as orphans
|
||||||
|
FROM cr_agent_mcps am
|
||||||
|
LEFT JOIN cr_agents a ON am.agent_id = a.id
|
||||||
|
WHERE a.id IS NULL
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT 'cr_agent_mcps (mcp)',
|
||||||
|
COUNT(*)
|
||||||
|
FROM cr_agent_mcps am
|
||||||
|
LEFT JOIN cr_mcps m ON am.mcp_id = m.id
|
||||||
|
WHERE m.id IS NULL
|
||||||
|
|
||||||
|
-- ... continuar para todas as tabelas
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Propagação de Mudanças
|
||||||
|
|
||||||
|
Quando um componente é removido/desactivado:
|
||||||
|
```sql
|
||||||
|
-- Marcar relacionamentos como inactivos (não deletar)
|
||||||
|
UPDATE cr_agent_mcps
|
||||||
|
SET status = 'inactive', updated_at = NOW()
|
||||||
|
WHERE agent_id = (SELECT id FROM cr_agents WHERE slug = ?);
|
||||||
|
|
||||||
|
-- Ou limpar (se preferido)
|
||||||
|
DELETE FROM cr_agent_mcps
|
||||||
|
WHERE agent_id = (SELECT id FROM cr_agents WHERE slug = ?);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Análise de Impacto
|
||||||
|
|
||||||
|
Antes de remover um componente, verificar dependências:
|
||||||
|
```sql
|
||||||
|
-- Impacto de remover um MCP
|
||||||
|
SELECT
|
||||||
|
'Agents afectados' as impact,
|
||||||
|
COUNT(DISTINCT am.agent_id) as count,
|
||||||
|
GROUP_CONCAT(DISTINCT a.slug) as list
|
||||||
|
FROM cr_agent_mcps am
|
||||||
|
JOIN cr_agents a ON am.agent_id = a.id
|
||||||
|
WHERE am.mcp_id = (SELECT id FROM cr_mcps WHERE slug = ?)
|
||||||
|
AND am.relationship_type = 'primary'
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
'Skills afectadas',
|
||||||
|
COUNT(DISTINCT sm.skill_id),
|
||||||
|
GROUP_CONCAT(DISTINCT s.slug)
|
||||||
|
FROM cr_skill_mcps sm
|
||||||
|
JOIN cr_skills s ON sm.skill_id = s.id
|
||||||
|
WHERE sm.mcp_id = (SELECT id FROM cr_mcps WHERE slug = ?);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Workflows
|
||||||
|
|
||||||
|
### Adicionar Novo Agente
|
||||||
|
|
||||||
|
1. Inserir em `cr_agents`
|
||||||
|
2. Mapear MCPs em `cr_agent_mcps`:
|
||||||
|
- Identificar MCPs primários (essenciais)
|
||||||
|
- Identificar MCPs recomendados (úteis)
|
||||||
|
- Listar MCPs disponíveis (opcionais)
|
||||||
|
3. Mapear Skills em `cr_agent_skills`
|
||||||
|
4. Associar a TaskForces em `cr_plugin_agents`
|
||||||
|
5. Definir colaborações em `cr_agent_collaborations`
|
||||||
|
6. Criar decision tree se necessário
|
||||||
|
|
||||||
|
### Remover Componente
|
||||||
|
|
||||||
|
1. Verificar impacto com análise de dependências
|
||||||
|
2. Confirmar com utilizador
|
||||||
|
3. Remover relacionamentos (ou marcar inactive)
|
||||||
|
4. Actualizar decision trees
|
||||||
|
5. Log em telemetria
|
||||||
|
|
||||||
|
## Métricas
|
||||||
|
|
||||||
|
| Métrica | Descrição |
|
||||||
|
|---------|-----------|
|
||||||
|
| Densidade | Média de relacionamentos por componente |
|
||||||
|
| Cobertura | % de componentes com relacionamentos |
|
||||||
|
| Consistência | % de relacionamentos válidos |
|
||||||
|
| Conectividade | Componentes isolados vs conectados |
|
||||||
|
|
||||||
|
## Exemplo de Uso
|
||||||
|
|
||||||
|
```
|
||||||
|
User: Configura o novo agente video-editor com os MCPs necessários
|
||||||
|
|
||||||
|
Relationship Manager:
|
||||||
|
1. [Analisa agentes similares na categoria 'content']
|
||||||
|
2. [Identifica MCPs comuns: filesystem, google-workspace, elevenlabs]
|
||||||
|
3. [Sugere relacionamentos:]
|
||||||
|
- PRIMARY: filesystem, elevenlabs
|
||||||
|
- RECOMMENDED: google-workspace, pexels, pixabay
|
||||||
|
- AVAILABLE: vimeo, youtube-uploader
|
||||||
|
4. [Cria mapeamentos em cr_agent_mcps]
|
||||||
|
5. [Sugere colaborações: content-manager, copywriter]
|
||||||
|
6. [Reporta: "Agente video-editor configurado com 7 MCPs e 2 colaborações"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limites
|
||||||
|
|
||||||
|
- Não cria componentes novos (apenas relacionamentos)
|
||||||
|
- Sugestões baseadas em padrões podem não ser 100% precisas
|
||||||
|
- Análise de impacto limitada a relacionamentos directos
|
||||||
|
- Não propaga alterações automaticamente (requer confirmação)
|
||||||
|
- Depende de consistência das tabelas cr_* na BD
|
||||||
@@ -1,12 +1,19 @@
|
|||||||
{
|
{
|
||||||
"name": "crm-ops",
|
"name": "crm-ops",
|
||||||
"description": "CRM operations, sales management, leads, customers, estimates, invoices, tickets and expense tracking with Desk CRM. Backed by 2 Dify KB datasets.",
|
"description": "CRM operations, sales management, leads, customers, estimates, invoices, tickets and expense tracking with Desk CRM. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.1.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
"url": "https://descomplicar.pt"
|
"url": "https://descomplicar.pt"
|
||||||
},
|
},
|
||||||
"homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins",
|
"homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"keywords": ["crm", "vendas", "leads", "facturacao", "tickets", "orcamento"]
|
"keywords": [
|
||||||
|
"crm",
|
||||||
|
"vendas",
|
||||||
|
"leads",
|
||||||
|
"facturacao",
|
||||||
|
"tickets",
|
||||||
|
"orcamento"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,14 @@ role: Especialista em orçamentos e propostas comerciais
|
|||||||
domain: Business
|
domain: Business
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Glob, ToolSearch
|
tools: Read, Write, Edit, Glob, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- google-workspace
|
||||||
|
recommended_mcps:
|
||||||
|
- moloni
|
||||||
|
- memory-supabase
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
- orcamento
|
- orcamento
|
||||||
@@ -107,7 +115,7 @@ Você é um especialista comercial responsável por:
|
|||||||
| `desk-crm-v3` | Verificar cliente, criar estimate |
|
| `desk-crm-v3` | Verificar cliente, criar estimate |
|
||||||
| `google-workspace` | Criar orçamento em Google Docs |
|
| `google-workspace` | Criar orçamento em Google Docs |
|
||||||
| `memory-supabase` | Consultar orçamentos similares |
|
| `memory-supabase` | Consultar orçamentos similares |
|
||||||
| `dify-kb` | Best practices pricing |
|
| `` | Best practices pricing |
|
||||||
|
|
||||||
## Responsabilidades
|
## Responsabilidades
|
||||||
|
|
||||||
@@ -161,13 +169,14 @@ Você é um especialista comercial responsável por:
|
|||||||
| SEO/Conteúdo | 300€ - 1.500€/mês | Artigos, optimização, keywords, linkbuilding |
|
| SEO/Conteúdo | 300€ - 1.500€/mês | Artigos, optimização, keywords, linkbuilding |
|
||||||
| Manutenção | 150€ - 500€/mês | Updates, backups, monitoring, suporte |
|
| Manutenção | 150€ - 500€/mês | Updates, backups, monitoring, suporte |
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"orcamento proposta pricing"
|
mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"orcamento proposta pricing"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao" query:"projectos estimativa custos"
|
mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"projectos estimativa custos"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"servicos pacotes"
|
mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"desenvolvimento custos"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"desenvolvimento custos"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Your Available MCPs
|
## Your Available MCPs
|
||||||
@@ -178,16 +187,14 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"desenvolvimen
|
|||||||
- **google-workspace** - Email, calendário, docs, drive
|
- **google-workspace** - Email, calendário, docs, drive
|
||||||
- **imap** - Email IMAP
|
- **imap** - Email IMAP
|
||||||
- **memory-supabase** - Memória longo prazo
|
- **memory-supabase** - Memória longo prazo
|
||||||
- **dify-kb** - Knowledge base AI
|
- **** - Knowledge base AI
|
||||||
- **outline-api** - Outline documentation
|
- **outline-api** - Outline documentation
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, magic, vimeo, design-systems, replicate
|
context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, magic, vimeo, design-systems, replicate
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -216,13 +223,11 @@ context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-re
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
/content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Colaboração
|
## Colaboração
|
||||||
|
|
||||||
- **Reports to**: Sales Manager
|
- **Reports to**: Sales Manager
|
||||||
|
|||||||
@@ -7,6 +7,14 @@ role: USAR PROATIVAMENTE para estratégia de abordagem de leads - análise de pe
|
|||||||
domain: Marketing
|
domain: Marketing
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- google-workspace
|
||||||
|
recommended_mcps:
|
||||||
|
- memory-supabase
|
||||||
|
- imap
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: null
|
desk_task: null
|
||||||
@@ -29,8 +37,6 @@ created: '2025-01-13'
|
|||||||
updated: '2026-02-04'
|
updated: '2026-02-04'
|
||||||
author: Descomplicar®
|
author: Descomplicar®
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# Lead Approach Strategist Descomplicar
|
# Lead Approach Strategist Descomplicar
|
||||||
|
|
||||||
Especialista em estratégia de abordagem de leads - análise de perfil, definição de estratégia e criação de primeiro contacto personalizado.
|
Especialista em estratégia de abordagem de leads - análise de perfil, definição de estratégia e criação de primeiro contacto personalizado.
|
||||||
@@ -66,7 +72,17 @@ Especialista em estratégia de abordagem de leads - análise de perfil, definiç
|
|||||||
- Script de chamada
|
- Script de chamada
|
||||||
- Follow-up sequence
|
- Follow-up sequence
|
||||||
|
|
||||||
## Datasets Dify
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
|
- Marketing Digital Avancado (`76647e0f`)
|
||||||
|
- Copywriting e Persuasao (`7b8fec17`)
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"<tema>"
|
||||||
|
mcp__notebooklm__notebook_query notebook_id:"7b8fec17-d34f-4e3f-a8c6-8231e51f6323" query:"<tema>"
|
||||||
|
```
|
||||||
- Vendas
|
- Vendas
|
||||||
- Marketing Digital
|
- Marketing Digital
|
||||||
- Copywriting
|
- Copywriting
|
||||||
@@ -125,7 +141,7 @@ Estrategista comercial especializado em análise de leads e criação de abordag
|
|||||||
|
|
||||||
## MCPs Relevantes
|
## MCPs Relevantes
|
||||||
- `desk-crm-v3`: Dados de leads e histórico
|
- `desk-crm-v3`: Dados de leads e histórico
|
||||||
- `dify-kb`: KB Vendas, Marketing Digital, Copywriting
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB Vendas, Marketing Digital, Copywriting
|
||||||
- `memory-supabase`: Padrões de abordagem bem-sucedidos
|
- `memory-supabase`: Padrões de abordagem bem-sucedidos
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -140,9 +156,13 @@ Estrategista comercial especializado em análise de leads e criação de abordag
|
|||||||
- Clientes, projectos, facturas, time tracking
|
- Clientes, projectos, facturas, time tracking
|
||||||
- Usage: `mcp__desk-crm-v3__*`
|
- Usage: `mcp__desk-crm-v3__*`
|
||||||
|
|
||||||
✓ **dify-kb** (knowledge)
|
✓ **notebooklm** (knowledge primaria)
|
||||||
|
- Gemini 2.5 RAG
|
||||||
|
- Usage: `mcp__notebooklm__notebook_query`
|
||||||
|
|
||||||
|
✓ **** (knowledge fallback)
|
||||||
- Knowledge base AI
|
- Knowledge base AI
|
||||||
- Usage: `mcp__dify-kb__*`
|
- Usage: `mcp____*`
|
||||||
|
|
||||||
✓ **memory-supabase** (system)
|
✓ **memory-supabase** (system)
|
||||||
- Memória longo prazo
|
- Memória longo prazo
|
||||||
@@ -160,13 +180,11 @@ Estrategista comercial especializado em análise de leads e criação de abordag
|
|||||||
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
||||||
- **replicate** - AI models - imagem, vídeo, áudio, LLMs
|
- **replicate** - AI models - imagem, vídeo, áudio, LLMs
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, imap, outline-api, wikijs, gsc, lighthouse, mcp-time, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, magic, design-systems
|
moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, imap, outline-api, wikijs, gsc, lighthouse, mcp-time, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, magic, design-systems
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -193,7 +211,7 @@ moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, imap, outline-api, w
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/billing-check, /crm-ops, /ecommerce, /orcamento, /saas, /remotion-video, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /doc-sync, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
/billing-check, /crm-ops, /ecommerce, /orcamento, /saas, /remotion-video, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /doc-sync, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
|
|||||||
@@ -7,6 +7,13 @@ role: Lead Qualifier especializado em avaliacao e priorizacao de leads para gara
|
|||||||
domain: Marketing
|
domain: Marketing
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Glob, Grep, ToolSearch
|
tools: Read, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
recommended_mcps:
|
||||||
|
- google-workspace
|
||||||
|
- memory-supabase
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1505
|
desk_task: 1505
|
||||||
@@ -29,8 +36,6 @@ created: '2025-01-13'
|
|||||||
updated: '2026-02-04'
|
updated: '2026-02-04'
|
||||||
author: Descomplicar®
|
author: Descomplicar®
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# Lead Qualifier Descomplicar
|
# Lead Qualifier Descomplicar
|
||||||
|
|
||||||
Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em prospects de alta qualidade enquanto nutre os que ainda nao estao prontos para comprar.
|
Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em prospects de alta qualidade enquanto nutre os que ainda nao estao prontos para comprar.
|
||||||
@@ -42,11 +47,13 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr
|
|||||||
- Nurturing de leads nao prontos para vendas
|
- Nurturing de leads nao prontos para vendas
|
||||||
- Manutencao da base de dados de leads actualizada
|
- Manutencao da base de dados de leads actualizada
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"lead qualification scoring criteria"
|
mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"lead qualification scoring criteria"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"lead generation conversion funnel"
|
mcp__notebooklm__notebook_query notebook_id:"df4688bb-c2c0-4aba-98c1-38c3b50a353c" query:"lead management pipeline"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"PerfexCRM" query:"lead management pipeline"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -102,7 +109,7 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr
|
|||||||
|
|
||||||
## MCPs Relevantes
|
## MCPs Relevantes
|
||||||
- `desk-crm-v3`: Gestão de leads e pipeline
|
- `desk-crm-v3`: Gestão de leads e pipeline
|
||||||
- `dify-kb`: KB Vendas (qualification), Marketing Digital
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB Vendas (qualification), Marketing Digital
|
||||||
- `memory-supabase`: Histórico de qualificações bem-sucedidas
|
- `memory-supabase`: Histórico de qualificações bem-sucedidas
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -116,9 +123,10 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr
|
|||||||
- Clientes, projectos, facturas, time tracking
|
- Clientes, projectos, facturas, time tracking
|
||||||
- Usage: `mcp__desk-crm-v3__*`
|
- Usage: `mcp__desk-crm-v3__*`
|
||||||
|
|
||||||
✓ **dify-kb** (knowledge)
|
✓ **notebooklm** (knowledge primaria)
|
||||||
|
✓ **** (knowledge fallback)
|
||||||
- Knowledge base AI
|
- Knowledge base AI
|
||||||
- Usage: `mcp__dify-kb__*`
|
- Usage: `mcp____*`
|
||||||
|
|
||||||
✓ **memory-supabase** (system)
|
✓ **memory-supabase** (system)
|
||||||
- Memória longo prazo
|
- Memória longo prazo
|
||||||
@@ -130,13 +138,11 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr
|
|||||||
- **imap** - Email IMAP
|
- **imap** - Email IMAP
|
||||||
- **outline-api** - Outline documentation
|
- **outline-api** - Outline documentation
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, magic, vimeo, design-systems, replicate
|
context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, elevenlabs, magic, vimeo, design-systems, replicate
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -165,13 +171,11 @@ context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-re
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
/content-marketing-pt, /remotion-video, /seo-content-optimization, /social-media, /video, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **3 SDKs** (TaskForce teams):
|
You are part of **3 SDKs** (TaskForce teams):
|
||||||
@@ -181,9 +185,6 @@ You are part of **3 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce Marketing Estratégico
|
### TaskForce Marketing Estratégico
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ recommended_mcps:
|
|||||||
- moloni # Invoicing
|
- moloni # Invoicing
|
||||||
- imap # Email management
|
- imap # Email management
|
||||||
- memory-supabase # Long-term memory
|
- memory-supabase # Long-term memory
|
||||||
- dify-kb # Knowledge base
|
|
||||||
- outline-api # Documentation
|
- outline-api # Documentation
|
||||||
|
|
||||||
primary_skills:
|
primary_skills:
|
||||||
@@ -82,11 +81,13 @@ Gestor comercial especializado em estrategias de vendas, gestao de CRM, qualific
|
|||||||
- Criar forecasting de receita e relatorios de performance
|
- Criar forecasting de receita e relatorios de performance
|
||||||
- Coordenar equipas de vendas e territorios comerciais
|
- Coordenar equipas de vendas e territorios comerciais
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"estrategias comerciais leads conversao"
|
mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"estrategias comerciais leads conversao"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"funil vendas qualificacao"
|
mcp__notebooklm__notebook_query notebook_id:"df4688bb-c2c0-4aba-98c1-38c3b50a353c" query:"CRM clientes pipeline"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"PerfexCRM" query:"CRM clientes pipeline"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
|
|||||||
@@ -1,8 +1,26 @@
|
|||||||
{
|
{
|
||||||
"description": "Dify KB datasets for CRM Operations domain",
|
"description": "Knowledge sources for CRM Operations domain",
|
||||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
"sources": {
|
||||||
"datasets": [
|
"notebooklm": {
|
||||||
{"id": "43354eb6-f0b2-40cc-aa53-44e375ab347c", "name": "PerfexCRM", "priority": 1, "document_count": 144, "word_count": 1547186},
|
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||||
{"id": "bd65f36e-6004-4584-b478-129b2c21b4d2", "name": "Servicos Descomplicar", "priority": 1, "document_count": 11, "word_count": 1095103}
|
"query_tool": "mcp__notebooklm__notebook_query",
|
||||||
]
|
"notebooks": [
|
||||||
|
{
|
||||||
|
"id": "df4688bb-c2c0-4aba-98c1-38c3b50a353c",
|
||||||
|
"title": "Perfex CRM: Gestao de Clientes e Projetos",
|
||||||
|
"topics": [
|
||||||
|
"perfexcrm"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "f29c8457-f16d-4fb3-979d-6e5901de1b20",
|
||||||
|
"title": "Descomplicar: Marketing Digital",
|
||||||
|
"topics": [
|
||||||
|
"servicos",
|
||||||
|
"descomplicar"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
189
crm-ops/skills/auto-expense/SKILL.md
Normal file
189
crm-ops/skills/auto-expense/SKILL.md
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
name: auto-expense
|
||||||
|
description: Criação automática de despesas a partir de facturas detectadas no IMAP e tickets. Extrai dados, verifica duplicados e cria despesas no Desk CRM com PDF anexo.
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# /auto-expense v1.0
|
||||||
|
|
||||||
|
Cria despesas automaticamente a partir de facturas detectadas pelo IMAP e tickets.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Protocolo
|
||||||
|
|
||||||
|
### Passo 1: Carregar inputs
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Ler ficheiro fornecedores:
|
||||||
|
Read: /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md
|
||||||
|
|
||||||
|
2. Ler facturas IMAP (se existir):
|
||||||
|
Read: ~/.claude-work/today-imap-{date}.json → campo "facturas"
|
||||||
|
|
||||||
|
3. Ler facturas tickets (se existir):
|
||||||
|
Read: ~/.claude-work/today-tickets-{date}.json → campo "facturas"
|
||||||
|
|
||||||
|
4. Se nenhum ficheiro existe E invocado standalone:
|
||||||
|
→ Perguntar ao utilizador: "processar IMAP, tickets ou ambos?"
|
||||||
|
→ Se IMAP: executar /imap-triage primeiro
|
||||||
|
→ Se tickets: executar /ticket-triage primeiro
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 2: Para cada factura, processar
|
||||||
|
|
||||||
|
```
|
||||||
|
Para cada factura na lista:
|
||||||
|
|
||||||
|
1. DETECTAR FORNECEDOR:
|
||||||
|
a. Fornecedor directo: dominio remetente na tabela
|
||||||
|
→ categoria, tax e moeda ja conhecidos
|
||||||
|
b. Plataforma multi-fornecedor (toconline, stripe, paypal, fastspring, payproglobal):
|
||||||
|
→ LER email completo → EXTRAIR emitente real
|
||||||
|
→ Procurar emitente na tabela "Emitentes Conhecidos por Plataforma"
|
||||||
|
→ SE desconhecido: registar como priority_flagged, PARAR este email
|
||||||
|
|
||||||
|
2. LER EMAIL/TICKET:
|
||||||
|
- IMAP: imap_read_email(account, uid) → HTML + anexos
|
||||||
|
- Ticket: mcp__desk-crm-v3__get_ticket(ticket_id) → HTML
|
||||||
|
|
||||||
|
3. EXTRAIR DO HTML:
|
||||||
|
- Valor (padroes: $XX.XX, XX,XX EUR, USD XX.XX, Total: XX.XX)
|
||||||
|
- Referencia/Invoice number
|
||||||
|
- Data da factura
|
||||||
|
|
||||||
|
4. VERIFICAR DUPLICADO (2 camadas):
|
||||||
|
Camada 1 - Desk CRM:
|
||||||
|
Pesquisar: mesmo fornecedor + mesmo valor (±0.05) + mesma data (±3 dias)
|
||||||
|
Se match → NAO criar, registar como duplicado
|
||||||
|
|
||||||
|
5. CRIAR DESPESA:
|
||||||
|
mcp__desk-crm-v3__create_expense({
|
||||||
|
category: [cat_id da tabela],
|
||||||
|
amount: [valor],
|
||||||
|
date: [data factura YYYY-MM-DD],
|
||||||
|
expense_name: "[Fornecedor] - [Referencia]",
|
||||||
|
note: "Auto-criado via /auto-expense",
|
||||||
|
currency: [2=USD ou 3=EUR],
|
||||||
|
tax: [0 ou 1],
|
||||||
|
send_invoice_to_customer: 0
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 3: PDF (se existir anexo)
|
||||||
|
|
||||||
|
```
|
||||||
|
a. GUARDAR LOCAL:
|
||||||
|
Path: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/MM-NomeMes/
|
||||||
|
Criar pasta: mkdir -p
|
||||||
|
Nome: YYYY-MM-DD_Fornecedor_Referencia.pdf
|
||||||
|
Meses PT: 01-Janeiro, 02-Fevereiro, 03-Marco, 04-Abril, 05-Maio, 06-Junho,
|
||||||
|
07-Julho, 08-Agosto, 09-Setembro, 10-Outubro, 11-Novembro, 12-Dezembro
|
||||||
|
|
||||||
|
b. UPLOAD ao Desk servidor:
|
||||||
|
mcp__ssh-unified__sftp_upload(server="desk", local_path, remote_path="/tmp/")
|
||||||
|
mcp__ssh-unified__ssh_execute(server="desk", command="
|
||||||
|
mkdir -p /home/ealmeida/desk24/uploads/expenses/{expense_id}/
|
||||||
|
cp /tmp/{filename} /home/ealmeida/desk24/uploads/expenses/{expense_id}/
|
||||||
|
chown -R ealmeida:ealmeida /home/ealmeida/desk24/uploads/expenses/{expense_id}/
|
||||||
|
rm /tmp/{filename}
|
||||||
|
")
|
||||||
|
|
||||||
|
c. REGISTAR no Desk BD:
|
||||||
|
mcp__ssh-unified__ssh_execute(server="desk", command="
|
||||||
|
mysql -u ealmeida -p'9qPRdCGGqM4o' ealmeida_desk24 -e \"
|
||||||
|
INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, attachment_key, staffid, dateadded)
|
||||||
|
VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', MD5(RAND()), 25, NOW());
|
||||||
|
\"
|
||||||
|
")
|
||||||
|
|
||||||
|
d. LIMPAR temporarios
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 4: Actualizar CSV
|
||||||
|
|
||||||
|
```
|
||||||
|
CSV Path: /media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/MAPA-DESPESAS-YYYY.csv
|
||||||
|
Formato linha: id_desk;data;categoria;fornecedor;descricao;valor;SIM;ficheiro;email;Auto /auto-expense
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 5: Escrever output JSON
|
||||||
|
|
||||||
|
```
|
||||||
|
Escrever em ~/.claude-work/today-expenses-{date}.json:
|
||||||
|
{
|
||||||
|
"despesas_criadas": [
|
||||||
|
{"id": 1180, "fornecedor": "MEO", "valor": 76.26, "moeda": "EUR", "referencia": "FT A/861215955"}
|
||||||
|
],
|
||||||
|
"duplicados": 0,
|
||||||
|
"flagged": [
|
||||||
|
{"fornecedor": "Desconhecido", "nota": "TOConline - emitente desconhecido: XPTO LDA"}
|
||||||
|
],
|
||||||
|
"erros": [],
|
||||||
|
"total_processadas": 1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Plataformas Multi-Fornecedor - Padroes de Extracao
|
||||||
|
|
||||||
|
> Ver tabela completa em: Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md
|
||||||
|
|
||||||
|
| Plataforma | Padrao no Subject/HTML |
|
||||||
|
|-----------|----------------------|
|
||||||
|
| TOConline | "Emitido por:", "Emitente:" no HTML |
|
||||||
|
| Stripe | "Receipt from [Empresa]" ou "Your receipt from [Empresa]" no subject |
|
||||||
|
| PayPal | "You paid [Empresa]" no subject |
|
||||||
|
| FastSpring | "Order from [Empresa]" no subject/corpo |
|
||||||
|
| PayPro Global | Nome produto/empresa no corpo |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Campos Criticos Desk CRM
|
||||||
|
|
||||||
|
```
|
||||||
|
currency = 3 (EUR) → Fornecedores EUR
|
||||||
|
currency = 2 (USD) → Fornecedores USD (manter valor original, NAO converter)
|
||||||
|
currency = 1 → NAO EXISTE - causa despesas invisiveis
|
||||||
|
|
||||||
|
tax = 1 → Fornecedores PT (MEO, Moloni, PTisp, Staples)
|
||||||
|
tax = 0 → Fornecedores estrangeiros
|
||||||
|
|
||||||
|
send_invoice_to_customer = 0 → OBRIGATORIO (sem default na BD)
|
||||||
|
|
||||||
|
reference_no → coluna correcta (NAO "reference")
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Output Standalone
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Auto-Despesas - DD-MM-YYYY
|
||||||
|
|
||||||
|
### Despesas Criadas (X)
|
||||||
|
| # Desk | Fornecedor | Valor | Moeda | Ref | PDF |
|
||||||
|
|--------|-----------|-------|-------|-----|-----|
|
||||||
|
|
||||||
|
### Duplicados Detectados (Y)
|
||||||
|
- [Fornecedor] [Valor] - ja existe como #ID
|
||||||
|
|
||||||
|
### Pendentes Revisao (Z)
|
||||||
|
- [Plataforma] - emitente desconhecido: [nome]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
- NUNCA usar currency=1 (nao existe)
|
||||||
|
- NUNCA converter USD para EUR (manter original com currency=2)
|
||||||
|
- NUNCA criar despesa sem verificar duplicado primeiro
|
||||||
|
- NUNCA omitir send_invoice_to_customer=0
|
||||||
|
- SEMPRE ler o email/ticket HTML para extrair valor real (nunca assumir)
|
||||||
|
- SEMPRE incluir reference_no quando disponivel
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Skill v1.0.0 | 04-03-2026 | Descomplicar®*
|
||||||
@@ -1,14 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: billing-check
|
name: billing-check
|
||||||
description: Billing verification and invoice validation. Checks billing accuracy,
|
description: Verificação de facturação e validação de facturas. Sincroniza facturas Moloni com horas Desk CRM para projectos 360, compara horas facturadas vs entregues e calcula saldos.
|
||||||
matches invoices with contracts. Use when user mentions "billing check", "invoice
|
|
||||||
verification", "billing audit", "payment verification", "billing validation".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 2.0.0
|
|
||||||
quality_score: 75
|
|
||||||
user_invocable: true
|
|
||||||
desk_task: 1464
|
|
||||||
allowed-tools: ToolSearch
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Billing Check - Desk vs Moloni (v2.0)
|
# Billing Check - Desk vs Moloni (v2.0)
|
||||||
|
|||||||
@@ -1,13 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: crm-admin
|
name: crm-admin
|
||||||
description: Desk CRM administration and maintenance. Manages users, permissions,
|
description: Administração e manutenção do Desk CRM. Gestão de utilizadores, permissões, campos personalizados, configuração de sistema e módulos Perfex.
|
||||||
custom fields, and system configuration. Use when user mentions "crm admin", "desk
|
disable-model-invocation: true
|
||||||
admin", "crm configuration", "user management", "crm permissions".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 1.0.0
|
|
||||||
quality_score: 75
|
|
||||||
user_invocable: true
|
|
||||||
desk_task: 1467
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# CRM Admin Specialist
|
# CRM Admin Specialist
|
||||||
@@ -145,7 +139,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data
|
|||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// Pesquisar funcionalidades Perfex
|
// Pesquisar funcionalidades Perfex
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({
|
||||||
dataset_id: "43354eb6-f0b2-40cc-aa53-44e375ab347c",
|
dataset_id: "43354eb6-f0b2-40cc-aa53-44e375ab347c",
|
||||||
query: "modulo facturas automaticas"
|
query: "modulo facturas automaticas"
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,42 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: crm-ops
|
name: crm-ops
|
||||||
description: >
|
description: Operações CRM seguras com verificação obrigatória de duplicados e confirmações. Distinção Lead vs Customer, Proposal vs Estimate. Criação de entidades CRM.
|
||||||
Operações CRM seguras com verificações obrigatórias de duplicados e confirmações. Entende distinção crítica Lead vs Customer, Proposal vs Estimate. NUNCA cria entidade sem verificar existência. Use when creating leads, customers, proposals, estimates, or when user mentions "crm", "lead", "customer", "orçamento", "proposta", "estimate", "perfex".
|
disable-model-invocation: true
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 1.2.0
|
|
||||||
quality_score: 80
|
|
||||||
user_invocable: true
|
|
||||||
category: business
|
|
||||||
tags: [crm, leads, customers, proposals, estimates, perfex, validation, duplicates, sales-process]
|
|
||||||
desk_task: 1468
|
|
||||||
desk_project: 65
|
|
||||||
allowed-tools: Read, Bash, mcp__desk-crm-v3
|
|
||||||
mcps: desk-crm-v3
|
|
||||||
dependencies:
|
|
||||||
mcps: [desk-crm-v3]
|
|
||||||
triggers:
|
|
||||||
- "User wants to create lead, customer, proposal, estimate"
|
|
||||||
- "User mentions 'crm', 'lead', 'orçamento', 'proposta'"
|
|
||||||
- "Creating any CRM entity"
|
|
||||||
- "User says 'cliente', 'customer', 'estimate'"
|
|
||||||
anti_patterns:
|
|
||||||
critical:
|
|
||||||
- "NEVER create lead/customer without checking existence"
|
|
||||||
- "NEVER create customer automatically for estimate"
|
|
||||||
- "NEVER assume entity doesn't exist"
|
|
||||||
entities:
|
|
||||||
- "Creating customer when should be lead"
|
|
||||||
- "Using estimate for leads (use proposal)"
|
|
||||||
- "Using proposal for qualified customers (use estimate)"
|
|
||||||
technical:
|
|
||||||
- "Converting non-accepted estimate to invoice"
|
|
||||||
- "Accessing email directly in tblclients (JOIN tblcontacts)"
|
|
||||||
- "Using invented tables (verify schema first)"
|
|
||||||
performance:
|
|
||||||
baseline_duration_ms: 300000
|
|
||||||
target_duration_ms: 180000
|
|
||||||
last_run_duration_ms: null
|
|
||||||
success_rate: 0.92
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# /crm-ops - Operações CRM Seguras
|
# /crm-ops - Operações CRM Seguras
|
||||||
|
|||||||
@@ -1,22 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: crm
|
name: crm
|
||||||
description: >
|
description: Operações CRM unificadas. Leads, customers, proposals, estimates e visão 360 do cliente. Consolida crm-ops e crm-admin com verificação obrigatória de duplicados.
|
||||||
Operações CRM unificadas v2.0. Consolida crm-ops + crm-admin. Leads, customers, proposals, estimates, visão 360.
|
|
||||||
Use when "crm", "lead", "cliente", "customer", "orçamento", "proposta", "estimate", "360".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 2.0.0
|
|
||||||
quality_score: 85
|
|
||||||
user_invocable: true
|
|
||||||
category: business
|
|
||||||
tags: [crm, leads, customers, proposals, estimates, 360, sales]
|
|
||||||
desk_task: 1468
|
|
||||||
desk_project: 65
|
|
||||||
allowed-tools: Read, mcp__desk-crm-v3
|
|
||||||
mcps: desk-crm-v3
|
|
||||||
anti_patterns:
|
|
||||||
- "NUNCA criar lead/customer sem verificar duplicados"
|
|
||||||
- "NUNCA criar customer automaticamente para estimate"
|
|
||||||
- "NUNCA fechar tarefa sem autorização"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# /crm v2.0 - Operações CRM Unificadas
|
# /crm v2.0 - Operações CRM Unificadas
|
||||||
@@ -25,6 +9,28 @@ Consolida /crm-ops + /crm-admin numa única skill com subcomandos.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Contexto NotebookLM
|
||||||
|
|
||||||
|
ANTES de executar, consultar notebooks para contexto especializado:
|
||||||
|
|
||||||
|
| Notebook | ID | Consultar quando |
|
||||||
|
|----------|-----|-----------------|
|
||||||
|
| Perfex CRM: Gestão de Clientes e Projectos | df4688bb | Sempre |
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "df4688bb-c2c0-4aba-98c1-38c3b50a353c",
|
||||||
|
query: "<adaptar ao contexto do pedido do utilizador>"
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Integrar insights do NotebookLM nas recomendações e decisões.
|
||||||
|
|
||||||
|
### Procedimentos Relacionados
|
||||||
|
- `PROC-CRM-Operacoes.md` — Operações CRM padrão
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Comandos
|
## Comandos
|
||||||
|
|
||||||
| Comando | Função |
|
| Comando | Função |
|
||||||
|
|||||||
@@ -1,21 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: desk
|
name: desk
|
||||||
description: >
|
description: Contexto de projecto via .desk-project. Auto-detecção, integração com /time, status rápido, criação de tarefas e changelog. Sistema Triângulo Desk-GDrive-Local.
|
||||||
Contexto de projecto via .desk-project v3.0. Integração /time, status rápido.
|
|
||||||
Use when .desk-project exists, "desk", "projecto", "contexto", "desk-task".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 3.0.0
|
|
||||||
quality_score: 90
|
|
||||||
user_invocable: true
|
|
||||||
category: productivity
|
|
||||||
tags: [desk, crm, projecto, contexto, triangulo, integration]
|
|
||||||
desk_task: 1471
|
|
||||||
desk_project: 65
|
|
||||||
allowed-tools: Read, Write, Bash, mcp__desk-crm-v3, mcp__mcp-time
|
|
||||||
mcps: desk-crm-v3, mcp-time
|
|
||||||
auto_detection:
|
|
||||||
enabled: true
|
|
||||||
file: ".desk-project"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# /desk v3.0 - Contexto de Projecto
|
# /desk v3.0 - Contexto de Projecto
|
||||||
|
|||||||
@@ -1,507 +1,154 @@
|
|||||||
---
|
---
|
||||||
name: expense
|
name: expense
|
||||||
description: >
|
description: Gestao de despesas Desk CRM com PDF obrigatorio. Registar, categorizar e analisar despesas com verificacao de duplicados, upload SFTP e arquivo mensal automatico.
|
||||||
Gestão de despesas Desk CRM v1.3. Registar, categorizar e analisar despesas com verificação obrigatória de categorias existentes. Processa despesas de tickets de contabilidade com anexos PDF. Conversão USD→EUR automática. NUNCA cria categoria duplicada. Use when "despesa", "expense", "gasto", "custo", "categoria despesa", "registar despesa", "expense report", "processar tickets contabilidade".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 1.5.0
|
|
||||||
quality_score: 88
|
|
||||||
user_invocable: true
|
|
||||||
category: finance
|
|
||||||
tags: [expense, despesas, finance, categories, desk-crm, costs, reporting, tickets, receipts]
|
|
||||||
desk_task: null
|
|
||||||
desk_project: 65
|
|
||||||
allowed-tools: Read, mcp__desk-crm-v3
|
|
||||||
mcps: desk-crm-v3
|
|
||||||
dependencies:
|
|
||||||
mcps: [desk-crm-v3]
|
|
||||||
triggers:
|
|
||||||
- "User wants to create expense"
|
|
||||||
- "User mentions 'despesa', 'expense', 'gasto', 'custo'"
|
|
||||||
- "User wants to categorize expenses"
|
|
||||||
- "User asks about expense categories"
|
|
||||||
- "User needs expense report or analysis"
|
|
||||||
- "User wants to process expenses from tickets"
|
|
||||||
- "User mentions 'tickets contabilidade', 'recibos', 'receipts'"
|
|
||||||
anti_patterns:
|
|
||||||
critical:
|
|
||||||
- "NEVER create category without checking if exists"
|
|
||||||
- "NEVER assume category doesn't exist"
|
|
||||||
- "ALWAYS list categories before creating new one"
|
|
||||||
categories:
|
|
||||||
- "Creating duplicate categories"
|
|
||||||
- "Using similar name instead of existing category"
|
|
||||||
- "Not checking existing categories first"
|
|
||||||
technical:
|
|
||||||
- "Creating expense without category_id"
|
|
||||||
- "Using category name instead of ID"
|
|
||||||
performance:
|
|
||||||
baseline_duration_ms: 60000
|
|
||||||
target_duration_ms: 30000
|
|
||||||
last_run_duration_ms: null
|
|
||||||
success_rate: 0.95
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# /expense - Gestão de Despesas
|
# /expense - Gestao de Despesas
|
||||||
|
|
||||||
Skill para gestão de despesas com verificação obrigatória de categorias existentes.
|
Skill para gestao de despesas com verificacao obrigatoria de categorias existentes.
|
||||||
|
|
||||||
## Metadata
|
|
||||||
- **Version**: 1.3.0
|
|
||||||
- **Author**: Descomplicar
|
|
||||||
- **Date**: 2026-02-05
|
|
||||||
- **Status**: Active
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Quando Usar
|
## Quando Usar
|
||||||
|
|
||||||
- Registar nova despesa
|
- Registar nova despesa
|
||||||
- Criar/gerir categorias de despesas
|
- Criar/gerir categorias de despesas
|
||||||
- Consultar despesas por período/categoria
|
- Consultar despesas por periodo/categoria
|
||||||
- Associar despesas a projectos/clientes
|
- Associar despesas a projectos/clientes
|
||||||
- Análise e relatórios de despesas
|
- Analise e relatorios de despesas
|
||||||
- **Processar despesas de tickets de contabilidade (departamento 3)**
|
- Processar despesas de tickets de contabilidade (departamento 3)
|
||||||
- Importar recibos de serviços (Anthropic, Hetzner, etc.)
|
- Importar recibos de servicos (Anthropic, Hetzner, etc.)
|
||||||
|
|
||||||
## Quando NÃO Usar
|
## Quando NAO Usar
|
||||||
|
|
||||||
- Para facturas a clientes (usar /invoice)
|
- Para facturas a clientes (usar /invoice)
|
||||||
- Para orçamentos (usar /orcamento)
|
- Para orcamentos (usar /orcamento)
|
||||||
- Para pagamentos recebidos (usar /crm)
|
- Para pagamentos recebidos (usar /crm)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## REGRA CRÍTICA: CATEGORIAS
|
## REGRA CRITICA: CATEGORIAS
|
||||||
|
|
||||||
> **PROIBIDO criar categoria sem verificar se já existe.**
|
> **PROIBIDO criar categoria sem verificar se ja existe.**
|
||||||
|
|
||||||
Esta regra é INVIOLÁVEL. SEMPRE:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
1. Listar categorias: get_expense_categories(with_stats=true)
|
1. Listar categorias: get_expense_categories(with_stats=true)
|
||||||
2. Pesquisar por nome similar na lista
|
2. Pesquisar por nome similar na lista
|
||||||
3. SE encontrar match ou similar:
|
3. SE encontrar match ou similar: USAR a categoria existente
|
||||||
- USAR a categoria existente
|
4. SE realmente nao existe: PERGUNTAR "Nao encontrei categoria para X. Criar nova?"
|
||||||
- NÃO criar duplicado
|
5. SO CRIAR apos confirmacao explicita
|
||||||
4. SE realmente não existe:
|
|
||||||
- PERGUNTAR: "Não encontrei categoria para X. Criar nova?"
|
|
||||||
5. SÓ CRIAR após confirmação explícita
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Violação desta regra causa duplicados que prejudicam relatórios financeiros.**
|
**Violacao desta regra causa duplicados que prejudicam relatorios financeiros.**
|
||||||
|
|
||||||
|
Para mapeamento completo de fornecedores, emails e padroes PDF para categorias: ver `references/category-mapping.md`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Categorias Existentes (Referência)
|
## Protocolo: Registar Despesa
|
||||||
|
|
||||||
| ID | Nome | Uso |
|
> **Gate PDF obrigatorio:** Sem documento, nao regista. Unica excepcao: bypass explicito do utilizador (AT/Salario sem recibo).
|
||||||
|----|------|-----|
|
|
||||||
| 1 | Telecomunicações | Net+móvel |
|
|
||||||
| 2 | Serviços Bancários | Comissões, taxas |
|
|
||||||
| 3 | Material de Escritório | Consumíveis |
|
|
||||||
| 4 | FB e Google ADS | Publicidade |
|
|
||||||
| 5 | E-mail MKT | ElasticEmail |
|
|
||||||
| 6 | Seguros | Apólices |
|
|
||||||
| 7 | Equipamento Informático e Audiovisual | Hardware |
|
|
||||||
| 8 | Remunerações | Salários pagos |
|
|
||||||
| 9 | Plugins e Recursos de Design | FULL, Freepik, etc |
|
|
||||||
| 10 | Alojamento de Servidores | Hetzner |
|
|
||||||
| 11 | Software Faturação | Moloni |
|
|
||||||
| 12 | Softwares Gestão | Everhour |
|
|
||||||
| 13 | Registo de Domínios | Ptisp, NameCheap |
|
|
||||||
| 14 | Impostos | SS, IRS, IVA |
|
|
||||||
| 15 | Planos Prestacionais | Pagamentos acordados |
|
|
||||||
| 16 | Manutenção e Suporte | Serviços técnicos |
|
|
||||||
| 17 | Outras | Não classificadas |
|
|
||||||
| 18 | Ofertas a Clientes | Brindes |
|
|
||||||
| 19 | Plataformas Armazenamento | Vimeo, MyAirBridge |
|
|
||||||
| 21 | Contabilidade | GONDOOFFICE |
|
|
||||||
| 22 | Salários e Vencimentos | Recibos vencimento |
|
|
||||||
| 23 | IRC - Imposto sobre Rendimento | Pagamentos IRC |
|
|
||||||
| 24 | IRS - Imposto sobre Rendimento | Retenções IRS |
|
|
||||||
| 25 | Contribuições Segurança Social | SS mensal |
|
|
||||||
| 26 | Hosting e Servidores | Alojamento web |
|
|
||||||
| 28 | Licenças Software | Painéis controlo |
|
|
||||||
| 29 | Reembolsos e Créditos | Valores recebidos |
|
|
||||||
| 38 | Serviços IA e APIs | Anthropic, OpenAI, CapSolver |
|
|
||||||
|
|
||||||
**NOTA:** Esta lista pode estar desactualizada. SEMPRE usar `get_expense_categories()` para lista actual.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Protocolo
|
|
||||||
|
|
||||||
### 1. Registar Despesa
|
|
||||||
|
|
||||||
```
|
```
|
||||||
1. OBRIGATÓRIO: get_expense_categories(with_stats=true)
|
1. GATE PDF: Verificar que existe ficheiro PDF
|
||||||
2. Identificar categoria correcta na lista
|
- SE utilizador forneceu PDF: prosseguir
|
||||||
3. SE categoria não existe: PERGUNTAR antes de criar
|
- SE nao forneceu: PEDIR o ficheiro
|
||||||
4. SE dados vêm de PDFs: ler CADA ficheiro individualmente com pdftotext
|
- SE nao tem e pede bypass: PERGUNTAR "Confirmas despesa sem documento?"
|
||||||
- NUNCA copiar valor de um PDF para outro, mesmo com nomes semelhantes
|
- Bypass valido apenas para: AT, Salarios, transferencias bancarias
|
||||||
- Cada documento tem o seu valor próprio
|
2. LER O PDF: Extrair dados reais do documento
|
||||||
5. Recolher dados:
|
- NUNCA copiar valor de um PDF para outro
|
||||||
- category_id (obrigatório)
|
3. OBRIGATORIO: get_expense_categories(with_stats=true)
|
||||||
- amount (obrigatório - valor REAL extraído do documento)
|
4. Identificar categoria correcta na lista
|
||||||
- date (obrigatório, YYYY-MM-DD)
|
5. VERIFICAR DUPLICADOS:
|
||||||
- note (obrigatório, descrição)
|
- get_expenses(search: "<fornecedor>")
|
||||||
- client_id (opcional)
|
- Mesmo fornecedor + valor + data = duplicado
|
||||||
- project_id (opcional)
|
- Mesmo numero factura = duplicado
|
||||||
- billable (opcional, default false)
|
6. Recolher dados:
|
||||||
- tax (opcional)
|
- category_id, amount, currency (EUR=3, USD=2), date (YYYY-MM-DD)
|
||||||
6. create_expense com dados validados
|
- note (incluir numero factura), send_invoice_to_customer = 0
|
||||||
7. Confirmar criação ao utilizador
|
- Opcionais: client_id, project_id, billable, tax
|
||||||
|
7. CONFIRMAR com utilizador (mostrar resumo)
|
||||||
|
8. create_expense
|
||||||
|
9. UPLOAD PDF ao Desk via SFTP:
|
||||||
|
a. mkdir -p no servidor: /home/ealmeida/desk.descomplicar.pt/uploads/expenses/<id>
|
||||||
|
b. mcp__ssh-unified__sftp_upload(server:"desk", local_path, remote_path)
|
||||||
|
c. chown -R ealmeida:ealmeida
|
||||||
|
d. INSERT INTO tblfiles (rel_id, rel_type='expense', ...)
|
||||||
|
10. ARQUIVO MENSAL: Mover PDF para Contabilidade/YYYY/NN-NomeMes/
|
||||||
|
11. Confirmar criacao ao utilizador
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Criar Categoria (APENAS se necessário)
|
## Protocolo: Criar Categoria
|
||||||
|
|
||||||
```
|
```
|
||||||
1. get_expense_categories() - listar todas
|
1. get_expense_categories() - listar todas
|
||||||
2. Verificar se existe categoria similar
|
2. Verificar se existe categoria similar
|
||||||
3. SE existe similar: USAR ESSA, não criar
|
3. SE existe similar: USAR ESSA, nao criar
|
||||||
4. SE não existe nenhuma similar:
|
4. SE nao existe: perguntar confirmacao ao utilizador
|
||||||
- Perguntar confirmação ao utilizador
|
5. SO APOS confirmacao: criar
|
||||||
- Aguardar resposta explícita
|
|
||||||
5. SÓ APÓS confirmação: criar via SQL ou interface
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Consultar Despesas
|
## Protocolo: Consultar Despesas
|
||||||
|
|
||||||
```
|
```
|
||||||
1. get_expenses com filtros:
|
1. get_expenses com filtros: category, date_from/date_to, client_id, project_id, limit
|
||||||
- category (ID da categoria)
|
|
||||||
- date_from / date_to (período)
|
|
||||||
- client_id (cliente específico)
|
|
||||||
- project_id (projecto específico)
|
|
||||||
- limit (número resultados)
|
|
||||||
2. Apresentar resumo ao utilizador
|
2. Apresentar resumo ao utilizador
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. Análise de Despesas
|
## Protocolo: Analise de Despesas
|
||||||
|
|
||||||
```
|
```
|
||||||
1. expense_analytics com parâmetros:
|
1. expense_analytics: period ("month"/"quarter"/"year"), breakdown_by ("category"/"client"/"project")
|
||||||
- period: "month", "quarter", "year"
|
2. Apresentar insights: total por categoria, tendencias, categorias mais usadas
|
||||||
- breakdown_by: "category", "client", "project"
|
|
||||||
2. Apresentar insights:
|
|
||||||
- Total por categoria
|
|
||||||
- Tendências
|
|
||||||
- Categorias mais usadas
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. Processar Despesas de Tickets (Contabilidade)
|
## Processar Despesas de Tickets
|
||||||
|
|
||||||
> **REGRA 1:** Processar tickets UM A UM com confirmação do utilizador (ou em lote se solicitado).
|
Para protocolo completo de processamento de tickets de contabilidade: ver `references/ticket-processing.md`
|
||||||
> **REGRA 2:** Verificar SEMPRE se despesa já foi lançada (prevenir duplicados).
|
|
||||||
> **REGRA 3:** NÃO adicionar respostas aos tickets - apenas criar despesa e anexos.
|
|
||||||
> **REGRA 4:** Converter SEMPRE USD para EUR antes de criar despesa.
|
|
||||||
> **REGRA 5:** Saltar tickets que são apenas recibos de pagamento (não são facturas).
|
|
||||||
|
|
||||||
```
|
**Resumo:** Obter ticket -> verificar anexos -> verificar duplicados -> extrair dados -> confirmar -> criar despesa -> upload PDF -> arquivo mensal.
|
||||||
1. Obter ticket: get_ticket(ticket_id)
|
|
||||||
2. Verificar anexos: SELECT * FROM tblticket_attachments WHERE ticketid = X
|
|
||||||
3. SE não tem PDFs: SALTAR ticket (apenas notificação)
|
|
||||||
4. VERIFICAR DUPLICADOS (OBRIGATÓRIO):
|
|
||||||
SELECT id, amount, date, note FROM tblexpenses
|
|
||||||
WHERE reference_no LIKE '%{receipt_number}%' OR note LIKE '%ticket #{ticket_id}%'
|
|
||||||
SE encontrar: PARAR e informar "Despesa já existe: #ID"
|
|
||||||
5. Extrair dados:
|
|
||||||
- Do HTML do ticket (valor, data, referência)
|
|
||||||
- OU usar script Python: python3 /home/ealmeida/scripts/extract_invoice_data.py {pdf_path}
|
|
||||||
6. APRESENTAR resumo ao utilizador e AGUARDAR confirmação
|
|
||||||
7. Após confirmação:
|
|
||||||
a. create_expense(category_id, amount, date, note, tax=1, reference)
|
|
||||||
b. UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {id}
|
|
||||||
c. mkdir -p uploads/expenses/{expenseid}
|
|
||||||
d. cp uploads/ticket_attachments/{ticketid}/*.pdf uploads/expenses/{expenseid}/
|
|
||||||
e. chown -R ealmeida:ealmeida uploads/expenses/{expenseid}
|
|
||||||
f. INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, ...)
|
|
||||||
8. Confirmar ao utilizador e passar ao próximo
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Script Python para Extracção de PDFs
|
|
||||||
|
|
||||||
Localização: `/home/ealmeida/scripts/extract_invoice_data.py`
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 /home/ealmeida/scripts/extract_invoice_data.py /path/to/invoice.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
Retorna JSON com: vendor, cat_id, total, date, invoice, currency, text
|
|
||||||
|
|
||||||
#### Conversão USD → EUR
|
|
||||||
|
|
||||||
> **OBRIGATÓRIO:** Todas as despesas devem ser registadas em EUR.
|
|
||||||
|
|
||||||
Taxa aproximada: **1 USD ≈ 0.92 EUR** (verificar taxa actual se necessário)
|
|
||||||
|
|
||||||
Exemplos:
|
|
||||||
- $19.99 USD → €18.39 EUR
|
|
||||||
- $100.00 USD → €92.00 EUR
|
|
||||||
|
|
||||||
```sql
|
|
||||||
-- Após criar despesa em USD, actualizar para EUR
|
|
||||||
UPDATE tblexpenses SET amount = {valor_eur}, currency = 2 WHERE id = {expense_id};
|
|
||||||
```
|
|
||||||
|
|
||||||
> **CRÍTICO:** O ID da moeda EUR é **2** (não 1). Usar currency=1 faz despesas não aparecerem nos relatórios.
|
|
||||||
|
|
||||||
#### Tickets a Saltar
|
|
||||||
|
|
||||||
| Tipo | Descrição | Acção |
|
|
||||||
|------|-----------|-------|
|
|
||||||
| Payment Receipt | Recibo de pagamento (não é fatura) | SALTAR - não criar despesa |
|
|
||||||
| Duplicado | Mesmo nº fatura já processado | SALTAR - informar utilizador |
|
|
||||||
| Sem anexo PDF | Apenas notificação por email | SALTAR - dados insuficientes |
|
|
||||||
|
|
||||||
Exemplos de tickets a saltar:
|
|
||||||
- "Invoice Payment Confirmation" (é recibo, não fatura)
|
|
||||||
- Ticket com mesmo invoice_number de outro já processado
|
|
||||||
|
|
||||||
#### Credenciais Base de Dados
|
|
||||||
|
|
||||||
Localização: `/home/ealmeida/desk.descomplicar.pt/application/config/app-config.php`
|
|
||||||
|
|
||||||
```bash
|
|
||||||
grep -E "APP_DB" /home/ealmeida/desk.descomplicar.pt/application/config/app-config.php
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Processamento em Lote
|
|
||||||
|
|
||||||
Se utilizador pedir "criar todas" ou "processar em lote":
|
|
||||||
1. Obter todos os tickets pendentes em paralelo
|
|
||||||
2. Identificar duplicados e tickets a saltar
|
|
||||||
3. Criar despesas em paralelo via `create_expense`
|
|
||||||
4. Actualizar `expense_name` e `reference_no` em batch via SQL
|
|
||||||
5. Copiar PDFs em batch
|
|
||||||
6. Registar ficheiros em batch via SQL INSERT múltiplo
|
|
||||||
|
|
||||||
#### Mapeamento Email → Categoria
|
|
||||||
|
|
||||||
| Domínio Email | Categoria ID | Nome |
|
|
||||||
|---------------|--------------|------|
|
|
||||||
| anthropic.com | 38 | Serviços IA e APIs |
|
|
||||||
| openai.com | 38 | Serviços IA e APIs |
|
|
||||||
| payproglobal.com | 38 | Serviços IA e APIs (CapSolver) |
|
|
||||||
| elasticemail.com | 5 | E-mail MKT |
|
|
||||||
| hetzner.com | 10 | Alojamento de Servidores |
|
|
||||||
| meoempresas.pt | 1 | Telecomunicações |
|
|
||||||
| centos-webpanel.com | 28 | Licenças Software |
|
|
||||||
| canva.com | 9 | Plugins e Recursos de Design |
|
|
||||||
| freepik.com | 9 | Plugins e Recursos de Design |
|
|
||||||
| namecheap.com | 13 | Registo de Domínios |
|
|
||||||
| ptisp.pt | 13 | Registo de Domínios |
|
|
||||||
| vimeo.com | 19 | Plataformas Armazenamento |
|
|
||||||
| everhour.com | 12 | Softwares Gestão |
|
|
||||||
| cursor.com | 38 | Serviços IA e APIs (Cursor) |
|
|
||||||
|
|
||||||
> **NOTA:** `moloni.com` NÃO incluído - é plataforma de facturação, emails podem ser de qualquer fornecedor. Verificar conteúdo do PDF para identificar o fornecedor real.
|
|
||||||
|
|
||||||
#### Mapeamento Fornecedor (PDF) → Categoria
|
|
||||||
|
|
||||||
Para documentos financeiros transferidos (não tickets), identificar fornecedor pelo conteúdo do PDF:
|
|
||||||
|
|
||||||
| Padrão no PDF | Fornecedor | Categoria ID | Nome |
|
|
||||||
|---------------|-----------|--------------|------|
|
|
||||||
| `Gondooffice`, `Cubic Choices`, `GONDOOFFICE` | Gondooffice (Cubic Choices) | 21 | Contabilidade |
|
|
||||||
| `Autoridade Tributária`, `emiteDoc`, `AT -` | AT - Autoridade Tributária | 15 | Planos Prestacionais |
|
|
||||||
| `Staples`, `STAPLES`, `STP_ECOFACTURA` | Staples | 3 | Material de Escritório |
|
|
||||||
| `MEO`, `Serviços _ Compras`, `meoempresas` | MEO Empresas | 1 | Telecomunicações |
|
|
||||||
| `TOConline`, `metta`, `Recibo de Vencimento` | Salário/Vencimento | 22 | Salários e Vencimentos |
|
|
||||||
| `NOS Comunicações`, `NOS ` | NOS | 1 | Telecomunicações |
|
|
||||||
| `Vodafone` | Vodafone | 1 | Telecomunicações |
|
|
||||||
| `EDP`, `E-REDES` | EDP | 17 | Outras |
|
|
||||||
| `Segurança Social`, `Seg. Social` | Segurança Social | 25 | Contribuições SS |
|
|
||||||
| `Cursor`, `Anysphere`, `cursor.com` | Cursor (Anysphere) | 38 | Serviços IA e APIs |
|
|
||||||
|
|
||||||
#### Extracção de Dados de PDFs
|
|
||||||
|
|
||||||
**Método 1: Script Python (recomendado)**
|
|
||||||
```bash
|
|
||||||
python3 /home/ealmeida/scripts/extract_invoice_data.py /path/to/invoice.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
**Método 2: pdfplumber directo**
|
|
||||||
```bash
|
|
||||||
python3 -c "
|
|
||||||
import pdfplumber
|
|
||||||
with pdfplumber.open('/path/to/file.pdf') as pdf:
|
|
||||||
for p in pdf.pages:
|
|
||||||
t = p.extract_text()
|
|
||||||
if t: print(t)
|
|
||||||
" | grep -iE "total|iva|€"
|
|
||||||
```
|
|
||||||
|
|
||||||
**Método 3: pdftotext (fallback)**
|
|
||||||
```bash
|
|
||||||
pdftotext /path/to/file.pdf - | head -80
|
|
||||||
```
|
|
||||||
|
|
||||||
> **NOTA:** Se PDF não extrair texto (imagem), usar dados do HTML do ticket email.
|
|
||||||
|
|
||||||
#### Comandos SQL
|
|
||||||
|
|
||||||
```sql
|
|
||||||
-- 1. VERIFICAR DUPLICADOS (EXECUTAR PRIMEIRO!)
|
|
||||||
SELECT id, amount, date, note, reference_no FROM tblexpenses
|
|
||||||
WHERE reference_no LIKE '%{receipt_number}%'
|
|
||||||
OR note LIKE '%ticket #{ticket_id}%'
|
|
||||||
|
|
||||||
-- 2. Verificar anexos do ticket
|
|
||||||
SELECT id, file_name, filetype FROM tblticket_attachments WHERE ticketid = {ID}
|
|
||||||
|
|
||||||
-- 3. Actualizar nome fornecedor
|
|
||||||
UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {expense_id}
|
|
||||||
|
|
||||||
-- 4. Registar anexo na despesa
|
|
||||||
INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, visible_to_customer, staffid, dateadded)
|
|
||||||
VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', 0, 1, NOW())
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Campos para Rastreio de Duplicados
|
|
||||||
|
|
||||||
| Campo | Conteúdo | Exemplo |
|
|
||||||
|-------|----------|---------|
|
|
||||||
| reference | Número do recibo | `2810-3712-9577` |
|
|
||||||
| note | Incluir ticket ID | `Anthropic Max (ticket #9648)` |
|
|
||||||
|
|
||||||
#### Paths de Ficheiros
|
|
||||||
|
|
||||||
- Anexos ticket: `/uploads/ticket_attachments/{ticketid}/`
|
|
||||||
- Anexos despesa: `/uploads/expenses/{expenseid}/`
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Comandos
|
## Comandos
|
||||||
|
|
||||||
| Comando | Descrição |
|
| Comando | Descricao |
|
||||||
|---------|-----------|
|
|---------|-----------|
|
||||||
| `/expense create` | Registar nova despesa |
|
| `/expense create` | Registar nova despesa |
|
||||||
| `/expense list` | Listar despesas recentes |
|
| `/expense list` | Listar despesas recentes |
|
||||||
| `/expense categories` | Listar categorias disponíveis |
|
| `/expense categories` | Listar categorias disponiveis |
|
||||||
| `/expense report [período]` | Relatório de despesas |
|
| `/expense report [periodo]` | Relatorio de despesas |
|
||||||
| `/expense search [termo]` | Pesquisar despesas |
|
| `/expense search [termo]` | Pesquisar despesas |
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## MCP Tools
|
## MCP Tools
|
||||||
|
|
||||||
### Despesas
|
**Despesas:** `get_expenses`, `create_expense`, `update_expense`, `delete_expense`, `bill_expense_to_customer`
|
||||||
- `get_expenses` - Listar despesas com filtros
|
**Categorias:** `get_expense_categories` (usar with_stats=true)
|
||||||
- `create_expense` - Criar nova despesa
|
**Analise:** `expense_analytics`
|
||||||
- `update_expense` - Actualizar despesa
|
|
||||||
- `delete_expense` - Eliminar despesa
|
|
||||||
- `bill_expense_to_customer` - Facturar ao cliente
|
|
||||||
|
|
||||||
### Categorias
|
|
||||||
- `get_expense_categories` - Listar categorias (usar with_stats=true)
|
|
||||||
|
|
||||||
### Análise
|
|
||||||
- `expense_analytics` - Métricas e análise
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Campos create_expense
|
|
||||||
|
|
||||||
| Campo | Tipo | Obrigatório | Descrição |
|
|
||||||
|-------|------|-------------|-----------|
|
|
||||||
| category_id | number | ✓ | ID da categoria |
|
|
||||||
| amount | number | ✓ | Valor da despesa |
|
|
||||||
| date | string | ✓ | Data (YYYY-MM-DD) |
|
|
||||||
| note | string | ✓ | Descrição (incluir ticket ID) |
|
|
||||||
| reference | string | ✓ | Número fatura/recibo (para duplicados) |
|
|
||||||
| tax | number | ✓ | **ID da taxa** (1 = IVA 23%) |
|
|
||||||
| client_id | number | - | Cliente associado |
|
|
||||||
| project_id | number | - | Projecto associado |
|
|
||||||
| billable | boolean | - | Facturável (default: false) |
|
|
||||||
| tax2 | number | - | Segunda taxa imposto |
|
|
||||||
| currency | number | - | ID moeda (**EUR = 2**) |
|
|
||||||
| payment_mode | string | - | Método pagamento |
|
|
||||||
|
|
||||||
### Campo expense_name (via SQL)
|
|
||||||
|
|
||||||
> **IMPORTANTE:** Após criar despesa, actualizar `expense_name` com nome do fornecedor.
|
|
||||||
|
|
||||||
```sql
|
|
||||||
UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {expense_id};
|
|
||||||
```
|
|
||||||
|
|
||||||
### Taxas de Imposto (tbltaxes)
|
|
||||||
|
|
||||||
| ID | Nome | Taxa |
|
|
||||||
|----|------|------|
|
|
||||||
| 1 | IVA Tx Normal | 23% |
|
|
||||||
|
|
||||||
### Moedas (tblcurrencies)
|
|
||||||
|
|
||||||
| ID | Nome | Símbolo | Default |
|
|
||||||
|----|------|---------|---------|
|
|
||||||
| 2 | EUR | € | Sim |
|
|
||||||
|
|
||||||
> **CRÍTICO:** Usar sempre `currency = 2` para EUR. O ID 1 não existe e causa despesas invisíveis nos relatórios.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Anti-Patterns (NUNCA fazer)
|
## Anti-Patterns (NUNCA fazer)
|
||||||
|
|
||||||
### Categorias
|
**Categorias:**
|
||||||
1. **NUNCA** criar categoria sem listar existentes primeiro
|
1. Criar categoria sem listar existentes primeiro
|
||||||
2. **NUNCA** assumir que categoria não existe
|
2. Assumir que categoria nao existe
|
||||||
3. **NUNCA** criar categoria com nome similar a existente
|
3. Criar categoria com nome similar a existente
|
||||||
|
|
||||||
### Despesas
|
**Despesas:**
|
||||||
4. Criar despesa sem category_id
|
4. Criar despesa sem category_id
|
||||||
5. Usar nome da categoria em vez do ID
|
5. Nao validar data (formato YYYY-MM-DD)
|
||||||
6. Não validar data (formato YYYY-MM-DD)
|
6. Criar despesa sem verificar duplicados primeiro
|
||||||
7. Criar despesa sem note/descrição
|
|
||||||
8. **NUNCA** criar despesa sem verificar duplicados primeiro
|
|
||||||
9. **NUNCA** processar ticket sem verificar se já foi lançado
|
|
||||||
|
|
||||||
### Valores de PDFs
|
**Valores de PDFs:**
|
||||||
10. **NUNCA** assumir que ficheiros com nomes semelhantes têm o mesmo valor
|
7. Assumir que ficheiros com nomes semelhantes tem o mesmo valor
|
||||||
11. **SEMPRE** ler CADA PDF individualmente para extrair o valor real
|
8. SEMPRE ler CADA PDF individualmente para extrair o valor real
|
||||||
12. Exemplo real: `emiteDoc.pdf` a `emiteDoc (12).pdf` tinham valores de 25,80€ a 100,53€ - todos diferentes
|
|
||||||
|
|
||||||
### Tickets
|
**Tickets:**
|
||||||
13. Processar ticket sem verificar anexos PDF
|
9. Processar ticket sem verificar anexos PDF
|
||||||
14. Assumir que ticket com recibo = despesa não lançada
|
10. Assumir que ticket com recibo = despesa nao lancada
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Exemplos
|
## Checklist Pre-Operacao
|
||||||
|
|
||||||
### Exemplo 1: Registar despesa com categoria existente
|
|
||||||
```
|
|
||||||
User: Registar despesa de 50€ de telecomunicações
|
|
||||||
→ get_expense_categories()
|
|
||||||
→ Encontra ID 1 = Telecomunicações
|
|
||||||
→ create_expense(category_id=1, amount=50, date="2026-02-05", note="Telecomunicações")
|
|
||||||
→ "Despesa #X criada: 50€ em Telecomunicações"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Exemplo 2: Despesa com categoria a verificar
|
|
||||||
```
|
|
||||||
User: Registar despesa de formação 200€
|
|
||||||
→ get_expense_categories()
|
|
||||||
→ NÃO encontra "Formação"
|
|
||||||
→ "Não encontrei categoria 'Formação'. Usar 'Outras' (ID 17) ou criar nova categoria?"
|
|
||||||
→ User: Usar Outras
|
|
||||||
→ create_expense(category_id=17, amount=200, date="2026-02-05", note="Formação profissional")
|
|
||||||
```
|
|
||||||
|
|
||||||
### Exemplo 3: Despesa facturável a cliente
|
|
||||||
```
|
|
||||||
User: Registar 150€ de domínio para cliente TechStart
|
|
||||||
→ get_expense_categories() → ID 13 = Registo de Domínios
|
|
||||||
→ search_customers("TechStart") → client_id=42
|
|
||||||
→ create_expense(category_id=13, amount=150, date="2026-02-05",
|
|
||||||
note="Domínio techstart.pt", client_id=42, billable=true)
|
|
||||||
→ "Despesa facturável criada para TechStart"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Checklist Pré-Operação
|
|
||||||
|
|
||||||
- [ ] Listar categorias existentes
|
- [ ] Listar categorias existentes
|
||||||
- [ ] Validar categoria correcta
|
- [ ] Validar categoria correcta
|
||||||
@@ -511,63 +158,12 @@ User: Registar 150€ de domínio para cliente TechStart
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Base de Dados
|
## Referencias
|
||||||
|
|
||||||
- **Tabela categorias:** `tblexpenses_categories`
|
- `references/category-mapping.md` - Mapeamento fornecedores, emails, padroes PDF, campos, moedas, SQL
|
||||||
- **Tabela despesas:** `tblexpenses`
|
- `references/ticket-processing.md` - Protocolo completo de processamento de tickets
|
||||||
- **Campo categoria:** `category` (ID da categoria)
|
- `references/changelog.md` - Historico de alteracoes
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Changelog
|
**Criado:** 2026-02-05 | **Actualizado:** 2026-02-12
|
||||||
|
|
||||||
### v1.5.0 (2026-02-05)
|
|
||||||
- Adicionado mapeamento **Cursor (Anysphere)** → categoria 38 (Serviços IA e APIs)
|
|
||||||
- Email: `cursor.com`
|
|
||||||
- PDF patterns: `Cursor`, `Anysphere`, `cursor.com`
|
|
||||||
|
|
||||||
### v1.4.0 (2026-02-05)
|
|
||||||
- **CORRECÇÃO CRÍTICA:** ID moeda EUR = **2** (não 1)
|
|
||||||
- Despesas com currency=1 não aparecem em relatórios
|
|
||||||
- Corrigidas 22 despesas existentes via `UPDATE tblexpenses SET currency = 2 WHERE currency = 1`
|
|
||||||
- Documentada tabela tblcurrencies com IDs correctos
|
|
||||||
|
|
||||||
### v1.3.0 (2026-02-05)
|
|
||||||
- **Conversão USD → EUR obrigatória** (taxa ~0.92, $19.99 → €18.39)
|
|
||||||
- **Processamento em lote** quando utilizador pede "criar todas"
|
|
||||||
- Tickets a saltar documentados (payment receipts, duplicados, sem PDF)
|
|
||||||
- Localização credenciais BD: `app-config.php`
|
|
||||||
- Regras 4 e 5 adicionadas ao protocolo de tickets
|
|
||||||
- 9 despesas processadas em sessão de teste: €857.73 total
|
|
||||||
|
|
||||||
### v1.2.0 (2026-02-05)
|
|
||||||
- Campo `expense_name` obrigatório com nome do fornecedor (via SQL UPDATE)
|
|
||||||
- Campo `tax` é ID da taxa de imposto (1 = IVA 23%), não percentagem
|
|
||||||
- Coluna BD é `reference_no`, não `reference`
|
|
||||||
- Script Python para extracção de PDFs: `/home/ealmeida/scripts/extract_invoice_data.py`
|
|
||||||
- 3 métodos de extracção PDF documentados (script, pdfplumber, pdftotext)
|
|
||||||
- Workflow actualizado: processar UM A UM com confirmação
|
|
||||||
- Removido: adicionar respostas aos tickets (apenas criar despesa + anexos)
|
|
||||||
- SQL commands actualizados com expense_name
|
|
||||||
|
|
||||||
### v1.1.0 (2026-02-05)
|
|
||||||
- Processamento de despesas a partir de tickets de contabilidade
|
|
||||||
- Mapeamento automático email domain → categoria
|
|
||||||
- Workflow completo com verificação de anexos PDF
|
|
||||||
- Cópia automática de anexos ticket → despesa
|
|
||||||
- Registo de ficheiros em tblfiles
|
|
||||||
|
|
||||||
### v1.0.0 (2026-02-05)
|
|
||||||
- Versão inicial
|
|
||||||
- Regra crítica de verificação de categorias
|
|
||||||
- Lista de categorias de referência
|
|
||||||
- Fluxos para criar/consultar despesas
|
|
||||||
- Integração com MCP desk-crm-v3
|
|
||||||
- Anti-patterns documentados
|
|
||||||
- Criada após limpeza de 9 categorias duplicadas
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Criado:** 2026-02-05
|
|
||||||
**Actualizado:** 2026-02-05
|
|
||||||
**Motivo:** Prevenção de categorias duplicadas + processamento de tickets
|
|
||||||
|
|||||||
187
crm-ops/skills/expense/references/category-mapping.md
Normal file
187
crm-ops/skills/expense/references/category-mapping.md
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
# /expense - Mapeamento de Categorias e Dados Técnicos
|
||||||
|
|
||||||
|
## Categorias Activas (consolidacao 12-02-2026)
|
||||||
|
|
||||||
|
| ID | Nome | Fornecedores típicos |
|
||||||
|
|----|------|---------------------|
|
||||||
|
| 1 | Telecomunicacoes | MEO |
|
||||||
|
| 4 | Alojamento web (Hosting) | Hetzner, CWP |
|
||||||
|
| 6 | Servicos Externos | Make/Celonis, Gamma |
|
||||||
|
| 14 | Subscricoes e Servicos Digitais | YouTube Premium, BdThemes |
|
||||||
|
| 28 | Licencas Software | Canva, Cursor, Descript, GitHub, Softaculous |
|
||||||
|
| 30 | Servicos Cloud e Infraestrutura | Google One, Google Workspace, ElasticEmail |
|
||||||
|
| 37 | Dominios | PTisp, Namecheap |
|
||||||
|
| 38 | Servicos IA e APIs | Anthropic, OpenRouter, CapSolver, Replicate |
|
||||||
|
|
||||||
|
Existem ~30 categorias na BD mas apenas 8 são usadas regularmente. SEMPRE usar `get_expense_categories()` para lista completa.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mapeamento Fornecedor → Categoria
|
||||||
|
|
||||||
|
| Fornecedor | Categoria ID | Nome |
|
||||||
|
|-----------|-------------|------|
|
||||||
|
| Anthropic, OpenRouter, CapSolver, Replicate | 38 | Servicos IA e APIs |
|
||||||
|
| Canva, Cursor, Descript, GitHub, Softaculous, CWP | 28 | Licencas Software |
|
||||||
|
| Google One, Google Workspace, ElasticEmail | 30 | Servicos Cloud e Infraestrutura |
|
||||||
|
| Hetzner | 4 | Alojamento web (Hosting) |
|
||||||
|
| MEO | 1 | Telecomunicacoes |
|
||||||
|
| PTisp, Namecheap | 37 | Dominios |
|
||||||
|
| Make/Celonis, Gamma | 6 | Servicos Externos |
|
||||||
|
| YouTube Premium, BdThemes | 14 | Subscricoes e Servicos Digitais |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mapeamento Email → Categoria
|
||||||
|
|
||||||
|
| Dominio Email | Categoria ID | Fornecedor |
|
||||||
|
|---------------|--------------|------------|
|
||||||
|
| anthropic.com | 38 | Anthropic |
|
||||||
|
| openrouter.ai | 38 | OpenRouter |
|
||||||
|
| payproglobal.com | 38 | CapSolver |
|
||||||
|
| replicate.com | 38 | Replicate |
|
||||||
|
| cursor.com, anysphere.dev | 28 | Cursor |
|
||||||
|
| canva.com | 28 | Canva |
|
||||||
|
| descript.com | 28 | Descript |
|
||||||
|
| github.com | 28 | GitHub |
|
||||||
|
| softaculous.com | 28 | Softaculous |
|
||||||
|
| centos-webpanel.com | 28 | CWP |
|
||||||
|
| elasticemail.com | 30 | ElasticEmail |
|
||||||
|
| google.com (One/Workspace) | 30 | Google Cloud |
|
||||||
|
| hetzner.com | 4 | Hetzner |
|
||||||
|
| meoempresas.pt | 1 | MEO |
|
||||||
|
| namecheap.com | 37 | Namecheap |
|
||||||
|
| ptisp.pt | 37 | PTisp |
|
||||||
|
| make.com, celonis.com | 6 | Make/Celonis |
|
||||||
|
| gamma.app | 6 | Gamma |
|
||||||
|
|
||||||
|
> `moloni.com` NAO incluido - é plataforma de facturação.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mapeamento Padrão PDF → Categoria
|
||||||
|
|
||||||
|
| Padrão no PDF | Fornecedor | Categoria ID |
|
||||||
|
|---------------|-----------|--------------|
|
||||||
|
| `Gondooffice`, `Cubic Choices` | Gondooffice | 21 Contabilidade |
|
||||||
|
| `Autoridade Tributaria`, `emiteDoc`, `AT -` | AT | 15 Planos Prestacionais |
|
||||||
|
| `Staples`, `STP_ECOFACTURA` | Staples | 3 Material Escritorio |
|
||||||
|
| `MEO`, `meoempresas` | MEO | 1 Telecomunicacoes |
|
||||||
|
| `TOConline`, `Recibo de Vencimento` | Salario | 22 Salarios |
|
||||||
|
| `Seguranca Social` | SS | 25 Contribuicoes SS |
|
||||||
|
| `Cursor`, `Anysphere` | Cursor | 28 Licencas Software |
|
||||||
|
| `Anthropic` | Anthropic | 38 Servicos IA e APIs |
|
||||||
|
| `Hetzner` | Hetzner | 4 Alojamento web |
|
||||||
|
| `ElasticEmail` | ElasticEmail | 30 Servicos Cloud |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Campos create_expense
|
||||||
|
|
||||||
|
| Campo | Tipo | Obrigatório | Descrição |
|
||||||
|
|-------|------|-------------|-----------|
|
||||||
|
| category_id | number | Sim | ID da categoria |
|
||||||
|
| amount | number | Sim | Valor da despesa |
|
||||||
|
| date | string | Sim | Data (YYYY-MM-DD) |
|
||||||
|
| note | string | Sim | Descrição (incluir ticket ID) |
|
||||||
|
| reference | string | Sim | Número fatura/recibo |
|
||||||
|
| tax | number | Sim | ID da taxa (1 = IVA 23%) |
|
||||||
|
| currency | number | Sim | EUR = **3**, USD = 2 |
|
||||||
|
| send_invoice_to_customer | number | Sim | Sempre **0** |
|
||||||
|
| client_id | number | Não | Cliente associado |
|
||||||
|
| project_id | number | Não | Projecto associado |
|
||||||
|
| billable | boolean | Não | Facturável (default: false) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Moedas
|
||||||
|
|
||||||
|
| ID | Nome | Símbolo | Default |
|
||||||
|
|----|------|---------|---------|
|
||||||
|
| 2 | USD | $ | Não |
|
||||||
|
| 3 | EUR | € | Sim |
|
||||||
|
|
||||||
|
> **CRITICO:** EUR = **3**, USD = **2**. `currency = 1` não existe e causa despesas invisíveis nos relatórios.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Taxas de Imposto
|
||||||
|
|
||||||
|
| ID | Nome | Taxa |
|
||||||
|
|----|------|------|
|
||||||
|
| 1 | IVA Tx Normal | 23% |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comandos SQL
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 1. VERIFICAR DUPLICADOS (EXECUTAR PRIMEIRO)
|
||||||
|
SELECT id, amount, date, note, reference_no FROM tblexpenses
|
||||||
|
WHERE reference_no LIKE '%{receipt_number}%'
|
||||||
|
OR note LIKE '%ticket #{ticket_id}%'
|
||||||
|
|
||||||
|
-- 2. Verificar anexos do ticket
|
||||||
|
SELECT id, file_name, filetype FROM tblticket_attachments WHERE ticketid = {ID}
|
||||||
|
|
||||||
|
-- 3. Actualizar nome fornecedor (obrigatorio apos criar)
|
||||||
|
UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {expense_id}
|
||||||
|
|
||||||
|
-- 4. Registar anexo na despesa
|
||||||
|
INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, visible_to_customer, staffid, contact_id, dateadded)
|
||||||
|
VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', 0, 1, 0, NOW())
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Extracção de Dados de PDFs
|
||||||
|
|
||||||
|
**Método 1: Script Python (recomendado)**
|
||||||
|
```bash
|
||||||
|
python3 /home/ealmeida/scripts/extract_invoice_data.py /path/to/invoice.pdf
|
||||||
|
```
|
||||||
|
Retorna JSON com: vendor, cat_id, total, date, invoice, currency, text
|
||||||
|
|
||||||
|
**Método 2: pdfplumber directo**
|
||||||
|
```bash
|
||||||
|
python3 -c "
|
||||||
|
import pdfplumber
|
||||||
|
with pdfplumber.open('/path/to/file.pdf') as pdf:
|
||||||
|
for p in pdf.pages:
|
||||||
|
t = p.extract_text()
|
||||||
|
if t: print(t)
|
||||||
|
" | grep -iE "total|iva|€"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Método 3: pdftotext (fallback)**
|
||||||
|
```bash
|
||||||
|
pdftotext /path/to/file.pdf - | head -80
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paths de Ficheiros
|
||||||
|
|
||||||
|
- Anexos ticket: `/uploads/ticket_attachments/{ticketid}/`
|
||||||
|
- Anexos despesa: `/uploads/expenses/{expenseid}/`
|
||||||
|
- Arquivo mensal: `/media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/NN-NomeMes/`
|
||||||
|
- Credenciais BD: `/home/ealmeida/desk.descomplicar.pt/application/config/app-config.php`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tickets a Saltar
|
||||||
|
|
||||||
|
| Tipo | Descrição | Acção |
|
||||||
|
|------|-----------|-------|
|
||||||
|
| Payment Receipt | Recibo de pagamento (não é fatura) | SALTAR |
|
||||||
|
| Duplicado | Mesmo nº fatura já processado | SALTAR |
|
||||||
|
| Sem anexo PDF | Apenas notificação por email | SALTAR |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Campos para Rastreio de Duplicados
|
||||||
|
|
||||||
|
| Campo | Conteúdo | Exemplo |
|
||||||
|
|-------|----------|---------|
|
||||||
|
| reference | Número do recibo | `2810-3712-9577` |
|
||||||
|
| note | Incluir ticket ID | `Anthropic Max (ticket #9648)` |
|
||||||
56
crm-ops/skills/expense/references/changelog.md
Normal file
56
crm-ops/skills/expense/references/changelog.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# /expense - Changelog
|
||||||
|
|
||||||
|
## v2.0.0 (2026-02-12) - Sistema Robusto 2026
|
||||||
|
|
||||||
|
- **Gate PDF obrigatorio:** Despesa sem documento nao e registada (bypass explicito para AT/Salario)
|
||||||
|
- **Upload SFTP:** Substituido `cp` local por `mcp__ssh-unified__sftp_upload` (Regra #41)
|
||||||
|
- **Arquivo mensal:** PDF organizado em `Contabilidade/YYYY/NN-NomeMes/` automaticamente
|
||||||
|
- **Campo `send_invoice_to_customer`:** Documentado como obrigatorio na BD (valor 0)
|
||||||
|
- **Correccao currency:** EUR = **3** (nao 2), USD = **2**. Corrigido em toda a skill
|
||||||
|
- **Categorias alinhadas com consolidacao:** 8 categorias activas com mapeamento correcto
|
||||||
|
- Cursor/Canva/Descript/GitHub/Softaculous/CWP -> 28 (Licencas Software)
|
||||||
|
- Hetzner -> 4 (Alojamento web)
|
||||||
|
- ElasticEmail/Google -> 30 (Servicos Cloud)
|
||||||
|
- PTisp/Namecheap -> 37 (Dominios)
|
||||||
|
- YouTube/BdThemes -> 14 (Subscricoes)
|
||||||
|
- Make/Gamma -> 6 (Servicos Externos)
|
||||||
|
- **Verificacao duplicados reforcada:** Integrada no passo 5 do protocolo
|
||||||
|
- **MCP ssh-unified adicionado** a dependencias
|
||||||
|
- **Procedimento:** `06-Operacoes/Procedimentos/PROC-Skill-Expense.md`
|
||||||
|
|
||||||
|
## v1.5.0 (2026-02-05)
|
||||||
|
|
||||||
|
- Adicionado mapeamento **Cursor (Anysphere)** -> categoria 38 (Servicos IA e APIs)
|
||||||
|
|
||||||
|
## v1.4.0 (2026-02-05)
|
||||||
|
|
||||||
|
- **CORRECCAO CRITICA:** ID moeda EUR = **2** (nao 1)
|
||||||
|
- Despesas com currency=1 nao aparecem em relatorios
|
||||||
|
- Corrigidas 22 despesas existentes via `UPDATE tblexpenses SET currency = 2 WHERE currency = 1`
|
||||||
|
|
||||||
|
## v1.3.0 (2026-02-05)
|
||||||
|
|
||||||
|
- **Conversao USD -> EUR obrigatoria** (taxa ~0.92, $19.99 -> 18.39 EUR)
|
||||||
|
- **Processamento em lote** quando utilizador pede "criar todas"
|
||||||
|
- Tickets a saltar documentados (payment receipts, duplicados, sem PDF)
|
||||||
|
- 9 despesas processadas em sessao de teste: 857.73 EUR total
|
||||||
|
|
||||||
|
## v1.2.0 (2026-02-05)
|
||||||
|
|
||||||
|
- Campo `expense_name` obrigatorio com nome do fornecedor (via SQL UPDATE)
|
||||||
|
- Campo `tax` e ID da taxa de imposto (1 = IVA 23%), nao percentagem
|
||||||
|
- Coluna BD e `reference_no`, nao `reference`
|
||||||
|
- Script Python para extraccao de PDFs
|
||||||
|
- 3 metodos de extraccao PDF documentados
|
||||||
|
|
||||||
|
## v1.1.0 (2026-02-05)
|
||||||
|
|
||||||
|
- Processamento de despesas a partir de tickets de contabilidade
|
||||||
|
- Mapeamento automatico email domain -> categoria
|
||||||
|
- Workflow completo com verificacao de anexos PDF
|
||||||
|
|
||||||
|
## v1.0.0 (2026-02-05)
|
||||||
|
|
||||||
|
- Versao inicial
|
||||||
|
- Regra critica de verificacao de categorias
|
||||||
|
- Criada apos limpeza de 9 categorias duplicadas
|
||||||
75
crm-ops/skills/expense/references/ticket-processing.md
Normal file
75
crm-ops/skills/expense/references/ticket-processing.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# /expense - Processamento de Despesas de Tickets
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
1. Processar tickets UM A UM com confirmacao do utilizador (ou em lote se solicitado)
|
||||||
|
2. Verificar SEMPRE se despesa ja foi lancada (prevenir duplicados)
|
||||||
|
3. NAO adicionar respostas aos tickets - apenas criar despesa e anexos
|
||||||
|
4. Manter valor original na moeda do documento (EUR=3, USD=2)
|
||||||
|
5. Saltar tickets que sao apenas recibos de pagamento (nao sao facturas)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Protocolo Ticket a Ticket
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Obter ticket: get_ticket(ticket_id)
|
||||||
|
2. Verificar anexos: SELECT * FROM tblticket_attachments WHERE ticketid = X
|
||||||
|
3. SE nao tem PDFs: SALTAR ticket (apenas notificacao)
|
||||||
|
4. VERIFICAR DUPLICADOS (OBRIGATORIO):
|
||||||
|
SELECT id, amount, date, note FROM tblexpenses
|
||||||
|
WHERE reference_no LIKE '%{receipt_number}%' OR note LIKE '%ticket #{ticket_id}%'
|
||||||
|
SE encontrar: PARAR e informar "Despesa ja existe: #ID"
|
||||||
|
5. Extrair dados:
|
||||||
|
- Do HTML do ticket (valor, data, referencia)
|
||||||
|
- OU usar script Python: python3 /home/ealmeida/scripts/extract_invoice_data.py {pdf_path}
|
||||||
|
6. APRESENTAR resumo ao utilizador e AGUARDAR confirmacao
|
||||||
|
7. Apos confirmacao:
|
||||||
|
a. SQL: INSERT INTO tblexpenses (..., send_invoice_to_customer, ...) VALUES (..., 0, ...)
|
||||||
|
OU create_expense via MCP (se disponivel)
|
||||||
|
b. UPDATE tblexpenses SET expense_name = '{Fornecedor}' WHERE id = {id}
|
||||||
|
c. mcp__ssh-unified__ssh_execute: mkdir -p uploads/expenses/{expenseid}
|
||||||
|
d. mcp__ssh-unified__sftp_upload: PDF para uploads/expenses/{expenseid}/
|
||||||
|
e. mcp__ssh-unified__ssh_execute: chown -R ealmeida:ealmeida uploads/expenses/{expenseid}
|
||||||
|
f. SQL: INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype,
|
||||||
|
visible_to_customer, staffid, contact_id, dateadded)
|
||||||
|
VALUES ({id}, 'expense', '{file}', 'application/pdf', 0, 1, 0, NOW())
|
||||||
|
g. Mover PDF para arquivo mensal: Contabilidade/YYYY/NN-NomeMes/
|
||||||
|
8. Confirmar ao utilizador e passar ao proximo
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Processamento em Lote
|
||||||
|
|
||||||
|
Se utilizador pedir "criar todas" ou "processar em lote":
|
||||||
|
1. Obter todos os tickets pendentes em paralelo
|
||||||
|
2. Identificar duplicados e tickets a saltar
|
||||||
|
3. Criar despesas em paralelo via `create_expense`
|
||||||
|
4. Actualizar `expense_name` e `reference_no` em batch via SQL
|
||||||
|
5. Copiar PDFs em batch
|
||||||
|
6. Registar ficheiros em batch via SQL INSERT multiplo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tickets a Saltar
|
||||||
|
|
||||||
|
| Tipo | Descricao | Accao |
|
||||||
|
|------|-----------|-------|
|
||||||
|
| Payment Receipt | Recibo de pagamento (nao e fatura) | SALTAR |
|
||||||
|
| Duplicado | Mesmo numero fatura ja processado | SALTAR |
|
||||||
|
| Sem anexo PDF | Apenas notificacao por email | SALTAR |
|
||||||
|
|
||||||
|
Exemplos:
|
||||||
|
- "Invoice Payment Confirmation" (e recibo, nao fatura)
|
||||||
|
- Ticket com mesmo invoice_number de outro ja processado
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Credenciais Base de Dados
|
||||||
|
|
||||||
|
Localizacao: `/home/ealmeida/desk.descomplicar.pt/application/config/app-config.php`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
grep -E "APP_DB" /home/ealmeida/desk.descomplicar.pt/application/config/app-config.php
|
||||||
|
```
|
||||||
@@ -1,17 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: invoice
|
name: invoice
|
||||||
description: >
|
description: Gestão de facturação Desk CRM. Criar facturas, converter estimates, facturar timesheets, registar pagamentos e listar facturas vencidas.
|
||||||
Gestão de facturação Desk CRM v1.0. Criar, enviar, pagamentos, vencidas, timesheets.
|
disable-model-invocation: true
|
||||||
Use when "invoice", "factura", "fatura", "pagamento", "vencida", "facturar", "billing".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 1.0.0
|
|
||||||
quality_score: 75
|
|
||||||
user_invocable: true
|
|
||||||
category: business
|
|
||||||
tags: [invoice, factura, billing, payments, desk, crm]
|
|
||||||
desk_project: 65
|
|
||||||
allowed-tools: Read, mcp__desk-crm-v3, mcp__mcp-time
|
|
||||||
mcps: desk-crm-v3, mcp-time
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# /invoice v1.0 - Gestão de Facturação
|
# /invoice v1.0 - Gestão de Facturação
|
||||||
|
|||||||
@@ -1,183 +1,172 @@
|
|||||||
---
|
---
|
||||||
name: orcamento
|
name: orcamento
|
||||||
description: >
|
description: Criação sistemática de orçamentos Descomplicar baseados nos itens oficiais do Desk CRM. Suporta StarterWP, CorporateWP, CareWP, eCommerceWP, Marketing 360, Manutenção, AcceleratorX, DeskCRM e Chatbots. Variantes -MEN (mensal) e -TRI (trimestral).
|
||||||
Criação sistemática de orçamentos Descomplicar® baseados em tabela oficial de preços (tabela-geral.csv). Integração directa CRM para proposals/estimates. Suporta StarterWP, CorporateWP, CareWP, eCommerceWP, Marketing 360, Manutenção. Consulta obrigatória datasets Dify (Serviços, Vendas). Use when user asks to create, generate or elaborate budget/proposal, or mentions "orçamento", "proposta", "estimate", "pricing", "website budget".
|
disable-model-invocation: true
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 3.1.0
|
|
||||||
quality_score: 100
|
|
||||||
user_invocable: true
|
|
||||||
category: business
|
|
||||||
tags: [orcamento, proposta, pricing, crm, proposals, estimates, vendas, packages]
|
|
||||||
desk_task: 1415
|
|
||||||
desk_project: 65
|
|
||||||
allowed-tools: Read, Bash, mcp__desk-crm-v3, mcp__dify-kb
|
|
||||||
mcps: desk-crm-v3, dify-kb
|
|
||||||
data_sources:
|
|
||||||
- path: /media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/tabela-geral.csv
|
|
||||||
priority: 1
|
|
||||||
usage: All products/services with pricing
|
|
||||||
- path: /media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/items-subscricao.csv
|
|
||||||
priority: 2
|
|
||||||
usage: Subscription services
|
|
||||||
- path: /media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/chatbots-precos.csv
|
|
||||||
priority: 2
|
|
||||||
usage: Chatbot pricing
|
|
||||||
- path: /media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/items-faturacao-deskcrm.csv
|
|
||||||
priority: 2
|
|
||||||
usage: Billing items
|
|
||||||
datasets:
|
|
||||||
- id: bd65f36e-6004-4584-b478-129b2c21b4d2
|
|
||||||
name: Serviços Descomplicar
|
|
||||||
priority: 1
|
|
||||||
usage: Packages, pricing justification
|
|
||||||
- id: a7ba6005-517c-41ab-ac5e-da1c1a1c62ef
|
|
||||||
name: Vendas
|
|
||||||
priority: 1
|
|
||||||
usage: Proposal techniques, negotiation
|
|
||||||
- id: c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24
|
|
||||||
name: Marketing Digital
|
|
||||||
priority: 2
|
|
||||||
usage: Value proposition, ROI
|
|
||||||
- id: c8489151-de94-42b2-8cee-c0b961cfac6d
|
|
||||||
name: Websites
|
|
||||||
priority: 2
|
|
||||||
usage: Website features comparison
|
|
||||||
dependencies:
|
|
||||||
skills: [crm-ops, lead-approach]
|
|
||||||
mcps: [desk-crm-v3, dify-kb]
|
|
||||||
triggers:
|
|
||||||
- "User asks to create/generate/elaborate budget"
|
|
||||||
- "User mentions 'orçamento', 'proposta', 'pricing'"
|
|
||||||
- "User asks for 'estimate', 'quote', 'proposal'"
|
|
||||||
- "Creating pricing for leads or customers"
|
|
||||||
packages:
|
|
||||||
- code: starter
|
|
||||||
name: StarterWP
|
|
||||||
base_price: 700
|
|
||||||
annual_fee: 250
|
|
||||||
timeline: 3-5 weeks
|
|
||||||
- code: corporate
|
|
||||||
name: CorporateWP
|
|
||||||
base_price: 900
|
|
||||||
annual_fee: 299
|
|
||||||
timeline: 4-6 weeks
|
|
||||||
- code: care
|
|
||||||
name: CareWP
|
|
||||||
base_price: 1300
|
|
||||||
annual_fee: 350
|
|
||||||
timeline: 4-6 weeks
|
|
||||||
- code: ecom
|
|
||||||
name: eCommerceWP
|
|
||||||
base_price: 1100
|
|
||||||
annual_fee: 349
|
|
||||||
timeline: 7-9 weeks
|
|
||||||
- code: mkt
|
|
||||||
name: Marketing 360
|
|
||||||
base_price: 459
|
|
||||||
billing: monthly
|
|
||||||
commitment: 12 months
|
|
||||||
- code: man
|
|
||||||
name: Manutenção
|
|
||||||
base_price: 150
|
|
||||||
billing: monthly
|
|
||||||
commitment: 12 months
|
|
||||||
performance:
|
|
||||||
baseline_duration_ms: 1800000
|
|
||||||
target_duration_ms: 900000
|
|
||||||
last_run_duration_ms: null
|
|
||||||
success_rate: 0.92
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Skill /orcamento - Criação Sistemática de Orçamentos
|
# Skill /orcamento - Criacao Sistematica de Orcamentos
|
||||||
|
|
||||||
Skill para criar orçamentos profissionais baseados na tabela oficial de preços Descomplicar®, com integração directa ao CRM.
|
Skill para criar orcamentos profissionais baseados nos itens oficiais do Desk CRM, com integracao directa ao CRM.
|
||||||
|
|
||||||
|
## Fonte de Verdade
|
||||||
|
|
||||||
|
**IMPORTANTE**: A fonte de verdade para precos e servicos e o Desk CRM (`tblitems` + `tblitems_groups`).
|
||||||
|
|
||||||
|
- **651 itens** em **14 grupos**: Websites, DeskCRM, Licencas, Tecnologia, Servicos, Chatbots, Marketing, Suporte, Comunicacao, Design, Estrategia, Mobile, IA, Alojamento
|
||||||
|
- Cada servico pode ter variantes de facturacao: Investimento, Anuidade, Trimestral, Mensalidade
|
||||||
|
- Os precos no CRM sao actualizados pela equipa e reflectem-se automaticamente nos orcamentos
|
||||||
|
|
||||||
|
### Grupos de Itens (tblitems_groups)
|
||||||
|
|
||||||
|
| ID | Grupo | Total Itens | Tipo Principal |
|
||||||
|
|----|-------|-------------|----------------|
|
||||||
|
| 1 | Websites | 183 | Pacotes WP + funcionalidades + anuidades |
|
||||||
|
| 14 | DeskCRM | 127 | Pacotes CRM + modulos |
|
||||||
|
| 8 | Licencas | 108 | Plugins WP + renovacoes |
|
||||||
|
| 3 | Tecnologia | 63 | AcceleratorX + WhatSMS |
|
||||||
|
| 2 | Servicos | 62 | Packs de horas |
|
||||||
|
| 13 | Chatbots | 46 | Chatbots + integracoes |
|
||||||
|
| 4 | Marketing | 34 | Packs SEO, Email, Ads |
|
||||||
|
| 9 | Suporte | 8 | Bancos de horas |
|
||||||
|
| 5 | Comunicacao | 5 | Packs copywriting |
|
||||||
|
| 6 | Design | 5 | Branding |
|
||||||
|
| 7 | Estrategia | 5 | Consultoria, coaching |
|
||||||
|
| 10 | Mobile | 3 | App React Native |
|
||||||
|
| 12 | IA | 2 | Agentes virtuais |
|
||||||
|
| 11 | Alojamento Web | — | Incluido nos websites |
|
||||||
|
|
||||||
|
### Como Consultar Itens
|
||||||
|
|
||||||
|
```
|
||||||
|
# Listar itens por grupo
|
||||||
|
mcp__desk-crm-v3__price_management action="get_pricing_insights" params={"group": "Websites"}
|
||||||
|
|
||||||
|
# Pesquisar item especifico via SQL (ssh server)
|
||||||
|
mysql -u root ealmeida_desk24 -e "
|
||||||
|
SELECT i.description, i.rate, i.unit, g.name as grupo
|
||||||
|
FROM tblitems i
|
||||||
|
JOIN tblitems_groups g ON i.group_id = g.id
|
||||||
|
WHERE i.description LIKE '%StarterWP%'
|
||||||
|
ORDER BY i.description;"
|
||||||
|
|
||||||
|
# Listar todos os itens de um grupo (ex: grupo 1 = Websites)
|
||||||
|
mysql -u root ealmeida_desk24 -e "
|
||||||
|
SELECT i.description, i.rate, i.unit
|
||||||
|
FROM tblitems i
|
||||||
|
WHERE i.group_id = 1
|
||||||
|
AND i.unit NOT IN ('mensalidade','trimestral','anuidade')
|
||||||
|
ORDER BY i.description;"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Variantes de Facturacao
|
||||||
|
|
||||||
|
Cada servico recorrente tem 4 variantes no CRM. Por defeito, o estimate usa o **item base**. Com os flags `-MEN` ou `-TRI`, os itens recorrentes sao incluidos directamente na variante pretendida.
|
||||||
|
|
||||||
|
| Tipo | Sufixo no CRM | Flag | Quando usar |
|
||||||
|
|------|---------------|------|-------------|
|
||||||
|
| Investimento/Projeto | (sem sufixo) | (nenhum) | Projectos unicos |
|
||||||
|
| Anuidade | "Anuidade ..." | (nenhum) | Servicos com renovacao anual |
|
||||||
|
| Trimestral | "Trimestral ..." | `-TRI` | Cliente quer facturacao trimestral |
|
||||||
|
| Mensalidade | "Mensalidade ..." | `-MEN` | Cliente quer facturacao mensal |
|
||||||
|
|
||||||
|
**Regra por defeito** (sem flag): No estimate, incluir o item base. Ao converter para invoice, seleccionar a variante de facturacao acordada.
|
||||||
|
|
||||||
|
**Regra com flag `-MEN` ou `-TRI`**: Pesquisar itens recorrentes pela variante correspondente (prefixo "Mensalidade ..." ou "Trimestral ..."). Itens pontuais (setup, configuracao) mantêm-se inalterados. Apenas itens com unit "anuidade" sao substituidos pela variante equivalente.
|
||||||
|
|
||||||
|
### Mapeamento de Variantes
|
||||||
|
|
||||||
|
Ao usar `-MEN` ou `-TRI`, para cada item recorrente (unit = "anuidade"):
|
||||||
|
|
||||||
|
1. Pesquisar no CRM o item equivalente com o prefixo da variante:
|
||||||
|
- `-MEN`: `WHERE description LIKE 'Mensalidade %' AND description LIKE '%[NOME_ITEM]%'`
|
||||||
|
- `-TRI`: `WHERE description LIKE 'Trimestral %' AND description LIKE '%[NOME_ITEM]%'`
|
||||||
|
2. Se encontrado, usar o preco e unit da variante
|
||||||
|
3. Se nao encontrado, manter item base e avisar o utilizador
|
||||||
|
|
||||||
|
**Calculo de valores com variantes:**
|
||||||
|
|
||||||
|
| Flag | Unit no estimate | Qty | Calculo |
|
||||||
|
|------|-----------------|-----|---------|
|
||||||
|
| (nenhum) | `ano` | 1 | Valor anual |
|
||||||
|
| `-TRI` | `trimestral` | 1 | Valor trimestral (tipicamente anuidade / 4 * 1.05-1.10) |
|
||||||
|
| `-MEN` | `mensalidade` | 1 | Valor mensal (tipicamente anuidade / 12 * 1.10-1.15) |
|
||||||
|
|
||||||
|
**Nota**: Os precos das variantes sao definidos no CRM e podem incluir markup sobre o valor anual. Consultar SEMPRE o CRM, nunca calcular por divisao simples.
|
||||||
|
|
||||||
## Quando Usar
|
## Quando Usar
|
||||||
|
|
||||||
- Criar orçamento para cliente novo ou existente
|
- Criar orcamento para cliente novo ou existente
|
||||||
- Gerar proposta comercial (proposal ou estimate)
|
- Gerar proposta comercial (estimate)
|
||||||
- Consultar preços oficiais de produtos/serviços
|
- Consultar precos oficiais de produtos/servicos
|
||||||
- Calcular valores com IVA e anuidades
|
- Calcular valores com IVA e anuidades
|
||||||
- Integrar orçamento directamente no CRM
|
- Integrar orcamento directamente no CRM
|
||||||
|
|
||||||
## Quando NÃO Usar
|
## Quando NAO Usar
|
||||||
|
|
||||||
- Para análise estratégica de lead (usar /lead-approach)
|
- Para analise estrategica de lead (usar /lead-approach)
|
||||||
- Para operações CRM genéricas (usar /crm-ops)
|
- Para operacoes CRM genericas (usar /crm-ops)
|
||||||
- Para simples consulta de preços (ler CSV directamente)
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contexto NotebookLM
|
||||||
|
|
||||||
|
ANTES de executar, consultar notebooks para contexto especializado:
|
||||||
|
|
||||||
|
| Notebook | ID | Consultar quando |
|
||||||
|
|----------|-----|-----------------|
|
||||||
|
| Estratégia e Empreendedorismo | 79d43410 | Para enquadramento estratégico de preços |
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "79d43410-0e29-4be1-881d-84db6bdc239a",
|
||||||
|
query: "<adaptar ao contexto do pedido do utilizador>"
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Integrar insights do NotebookLM nas recomendações e decisões.
|
||||||
|
|
||||||
|
### Procedimentos Relacionados
|
||||||
|
- `PROC-Catalogo-Codificacao-Produtos.md` — Codificação e catálogo de produtos
|
||||||
|
- `PROC-CRM-Operacoes.md` — Operações CRM padrão
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Protocolo
|
## Protocolo
|
||||||
|
|
||||||
### Fontes de Dados (OBRIGATÓRIO)
|
### Sintaxe
|
||||||
|
|
||||||
**IMPORTANTE**: Antes de criar qualquer orçamento, ler SEMPRE os dados actualizados de:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
/media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/
|
/orcamento [cliente] [tipo] [-MEN|-TRI]
|
||||||
├── tabela-geral.csv ← Todos os produtos/serviços com preços
|
|
||||||
├── items-subscricao.csv ← Serviços de subscrição
|
|
||||||
├── chatbots-precos.csv ← Preços de chatbots
|
|
||||||
└── items-faturacao-deskcrm.csv ← Items para facturação
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Estrutura do CSV Principal (tabela-geral.csv)
|
**Parametros:**
|
||||||
|
- `cliente` - Nome ou ID do cliente (opcional, sera solicitado se omitido)
|
||||||
|
- `tipo` - Tipo de orcamento (opcional, sera apresentado menu se omitido)
|
||||||
|
- `-MEN` - Variante mensal: usa itens com unit "mensalidade" e calcula valor/mes
|
||||||
|
- `-TRI` - Variante trimestral: usa itens com unit "trimestral" e calcula valor/trimestre
|
||||||
|
- (sem flag) - Comportamento actual: item base (Investimento/Projeto/Anual)
|
||||||
|
|
||||||
| Campo | Descrição |
|
**Tipos disponiveis:**
|
||||||
|-------|-----------|
|
| Codigo | Tipo | Grupo CRM |
|
||||||
| Codigo | Código único (ex: WEB-WP-001) |
|
|--------|------|-----------|
|
||||||
| Nome | Nome do produto/serviço |
|
| `starter` | StarterWP | Websites |
|
||||||
| Familia | Categoria principal (Websites, Design, Tecnologia, etc.) |
|
| `corporate` | CorporateWP | Websites |
|
||||||
| PrecoBase | Valor em euros |
|
| `care` | CareWP (Clinicas) | Websites |
|
||||||
| Unidade | Tipo (Projeto, Hora, Investimento, Mês) |
|
| `ecom` | eCommerceWP | Websites |
|
||||||
| DescricaoCurta | Para orçamento |
|
| `mkt` | Marketing Digital 360 | Marketing |
|
||||||
| TempoEstimado | Em dias/semanas |
|
| `man` | Manutencao | Suporte |
|
||||||
|
| `deskcrm` | DeskCRM | DeskCRM |
|
||||||
|
| `chatbot` | Chatbot | Chatbots |
|
||||||
|
| `acceleratorx` | AcceleratorX | Tecnologia |
|
||||||
|
|
||||||
### Como Usar os CSVs
|
### Fase 1: Identificacao do Cliente
|
||||||
|
|
||||||
```python
|
|
||||||
# Exemplo de leitura
|
|
||||||
import csv
|
|
||||||
with open('/media/.../Produtos_Servicos/tabela-geral.csv') as f:
|
|
||||||
reader = csv.DictReader(f)
|
|
||||||
for row in reader:
|
|
||||||
if row['Codigo'] == 'WEB-WP-001': # StarterWP
|
|
||||||
preco = float(row['PrecoBase']) # 700
|
|
||||||
```
|
|
||||||
|
|
||||||
**Regra**: Os CSVs são a fonte de verdade. O pricing-guide.md é referência rápida.
|
|
||||||
|
|
||||||
## Sintaxe
|
|
||||||
|
|
||||||
```
|
|
||||||
/orcamento [cliente] [tipo]
|
|
||||||
```
|
|
||||||
|
|
||||||
**Parâmetros:**
|
|
||||||
- `cliente` - Nome ou ID do cliente (opcional, será solicitado se omitido)
|
|
||||||
- `tipo` - Tipo de orçamento (opcional, será apresentado menu se omitido)
|
|
||||||
|
|
||||||
**Tipos disponíveis:**
|
|
||||||
| Código | Tipo | Template | Valor Base |
|
|
||||||
|--------|------|----------|------------|
|
|
||||||
| `starter` | StarterWP | `templates/website-corporativo.md` | 700€ |
|
|
||||||
| `corporate` | CorporateWP | `templates/website-corporativo.md` | 900€ |
|
|
||||||
| `care` | CareWP (Clínicas) | `templates/website-corporativo.md` | 1.300€ |
|
|
||||||
| `ecom` | eCommerceWP | `templates/e-commerce.md` | 1.100€ |
|
|
||||||
| `mkt` | Marketing Digital 360 | `templates/marketing-digital.md` | 459€/mês |
|
|
||||||
| `man` | Manutenção | `templates/manutencao.md` | 150€/mês |
|
|
||||||
|
|
||||||
## Fluxo de Execução
|
|
||||||
|
|
||||||
### Fase 1: Identificação do Cliente
|
|
||||||
|
|
||||||
1. Se cliente fornecido, pesquisar no CRM:
|
1. Se cliente fornecido, pesquisar no CRM:
|
||||||
```
|
```
|
||||||
mcp__desk-crm-v3__search_customers query="[nome]" fields="company,vat"
|
mcp__desk-crm-v3__search_customers query="[nome]" fields="company,vat"
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Se não encontrado ou não fornecido, solicitar dados:
|
2. Se nao encontrado ou nao fornecido, solicitar dados:
|
||||||
- Nome da empresa
|
- Nome da empresa
|
||||||
- NIF (opcional)
|
- NIF (opcional)
|
||||||
- Email contacto
|
- Email contacto
|
||||||
@@ -187,107 +176,161 @@ with open('/media/.../Produtos_Servicos/tabela-geral.csv') as f:
|
|||||||
mcp__desk-crm-v3__create_customer company="..." vat="..." ...
|
mcp__desk-crm-v3__create_customer company="..." vat="..." ...
|
||||||
```
|
```
|
||||||
|
|
||||||
### Fase 2: Selecção de Template
|
### Fase 2: Seleccao de Template
|
||||||
|
|
||||||
1. Se tipo fornecido, carregar template correspondente
|
1. Se tipo fornecido, carregar template correspondente
|
||||||
2. Se não fornecido, apresentar menu interactivo via AskUserQuestion:
|
2. Se nao fornecido, apresentar menu interactivo:
|
||||||
- StarterWP (700€ + 250€/ano)
|
- StarterWP | CorporateWP | CareWP | eCommerceWP
|
||||||
- CorporateWP (900€ + 299€/ano)
|
- Marketing 360 | Manutencao
|
||||||
- CareWP (1.300€ + 350€/ano)
|
- DeskCRM | Chatbot | AcceleratorX
|
||||||
- eCommerceWP (1.100€ + 349€/ano)
|
|
||||||
- Marketing 360 (459€/mês)
|
|
||||||
- Manutenção (150€/mês)
|
|
||||||
|
|
||||||
### Fase 3: Personalização
|
### Fase 3: Consultar Precos no CRM
|
||||||
|
|
||||||
1. Ler template seleccionado de `templates/`
|
**OBRIGATORIO**: Consultar precos actualizados no Desk CRM antes de calcular.
|
||||||
2. Apresentar questões de personalização específicas do tipo
|
|
||||||
3. Adicionar funcionalidades conforme requisitos
|
|
||||||
4. Calcular valores usando tabela de `references/pricing-guide.md`
|
|
||||||
|
|
||||||
### Fase 4: Geração do Orçamento
|
#### Sem variante (comportamento actual)
|
||||||
|
```bash
|
||||||
|
# Buscar preco do pacote base
|
||||||
|
mysql -u root ealmeida_desk24 -e "
|
||||||
|
SELECT description, rate, unit FROM tblitems
|
||||||
|
WHERE group_id = [GROUP_ID]
|
||||||
|
AND description LIKE '%[PACOTE]%'
|
||||||
|
AND unit NOT IN ('mensalidade','trimestral','anuidade')
|
||||||
|
ORDER BY description;"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Com `-MEN` (variante mensal)
|
||||||
|
```bash
|
||||||
|
# Buscar itens base (setup/pontuais - mantêm-se iguais)
|
||||||
|
mysql -u root ealmeida_desk24 -e "
|
||||||
|
SELECT description, rate, unit FROM tblitems
|
||||||
|
WHERE group_id = [GROUP_ID]
|
||||||
|
AND description LIKE '%[PACOTE]%'
|
||||||
|
AND unit NOT IN ('mensalidade','trimestral','anuidade')
|
||||||
|
ORDER BY description;"
|
||||||
|
|
||||||
|
# Buscar itens recorrentes na variante mensal
|
||||||
|
mysql -u root ealmeida_desk24 -e "
|
||||||
|
SELECT description, rate, unit FROM tblitems
|
||||||
|
WHERE group_id = [GROUP_ID]
|
||||||
|
AND description LIKE 'Mensalidade%[PACOTE]%'
|
||||||
|
ORDER BY description;"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Com `-TRI` (variante trimestral)
|
||||||
|
```bash
|
||||||
|
# Buscar itens base (setup/pontuais - mantêm-se iguais)
|
||||||
|
mysql -u root ealmeida_desk24 -e "
|
||||||
|
SELECT description, rate, unit FROM tblitems
|
||||||
|
WHERE group_id = [GROUP_ID]
|
||||||
|
AND description LIKE '%[PACOTE]%'
|
||||||
|
AND unit NOT IN ('mensalidade','trimestral','anuidade')
|
||||||
|
ORDER BY description;"
|
||||||
|
|
||||||
|
# Buscar itens recorrentes na variante trimestral
|
||||||
|
mysql -u root ealmeida_desk24 -e "
|
||||||
|
SELECT description, rate, unit FROM tblitems
|
||||||
|
WHERE group_id = [GROUP_ID]
|
||||||
|
AND description LIKE 'Trimestral%[PACOTE]%'
|
||||||
|
ORDER BY description;"
|
||||||
|
```
|
||||||
|
|
||||||
|
Ou via MCP:
|
||||||
|
```
|
||||||
|
mcp__desk-crm-v3__price_management action="get_pricing_insights" params={"group": "[GRUPO]", "search": "[PACOTE]"}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fase 4: Personalizacao
|
||||||
|
|
||||||
|
1. Apresentar questoes de personalizacao especificas do tipo
|
||||||
|
2. Adicionar funcionalidades conforme requisitos
|
||||||
|
3. Para cada funcionalidade, buscar item correspondente no CRM
|
||||||
|
|
||||||
|
### Fase 5: Geracao do Orcamento
|
||||||
|
|
||||||
1. Calcular valores finais:
|
1. Calcular valores finais:
|
||||||
- Subtotal por item
|
- Subtotal por item (precos do CRM)
|
||||||
- IVA 23%
|
- IVA 23%
|
||||||
- Total
|
- Total
|
||||||
- Anuidade (se aplicável)
|
- Recorrencia (anuidade, trimestral ou mensal conforme variante)
|
||||||
|
|
||||||
2. Criar estimate no CRM:
|
2. Ajustar items conforme variante:
|
||||||
|
- **Sem flag**: Itens base + anuidade separada
|
||||||
|
- **`-MEN`**: Itens setup + itens "Mensalidade ..." do CRM (unit: "mensalidade")
|
||||||
|
- **`-TRI`**: Itens setup + itens "Trimestral ..." do CRM (unit: "trimestral")
|
||||||
|
|
||||||
|
3. Criar estimate no CRM:
|
||||||
```
|
```
|
||||||
mcp__desk-crm-v3__create_estimate
|
mcp__desk-crm-v3__create_estimate
|
||||||
client_id=[id]
|
client_id=[id]
|
||||||
date=[hoje]
|
date=[hoje]
|
||||||
expiry_date=[hoje + 30 dias]
|
expiry_date=[hoje + 30 dias]
|
||||||
items=[items calculados]
|
items=[items calculados]
|
||||||
terms="Condições de Pagamento: 50% na adjudicação + 50% na entrega"
|
terms="[termos ajustados a variante]"
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Apresentar resumo ao utilizador com link para CRM
|
4. Termos ajustados por variante:
|
||||||
|
- **Sem flag**: "Condicoes de Pagamento: 50% na adjudicacao + 50% na entrega"
|
||||||
|
- **`-MEN`**: "Condicoes de Pagamento: Setup - 50% na adjudicacao + 50% na entrega | Recorrencia - facturacao mensal antecipada"
|
||||||
|
- **`-TRI`**: "Condicoes de Pagamento: Setup - 50% na adjudicacao + 50% na entrega | Recorrencia - facturacao trimestral antecipada"
|
||||||
|
|
||||||
## Tabela de Preços Base
|
5. Apresentar resumo ao utilizador com link para CRM
|
||||||
|
|
||||||
Ver `references/pricing-guide.md` para tabela completa.
|
## Pacotes Principais (referencia rapida)
|
||||||
|
|
||||||
|
**Nota**: Estes valores sao referencia. Consultar SEMPRE o CRM para precos actualizados.
|
||||||
|
|
||||||
### Websites
|
### Websites
|
||||||
|
|
||||||
| Produto | Setup | Anuidade | Prazo |
|
| Produto | Setup | Anuidade | Prazo |
|
||||||
|---------|-------|----------|-------|
|
|---------|-------|----------|-------|
|
||||||
| StarterWP | 700€ | 250€ | 3-5 sem |
|
| StarterWP | 700 | 250 | 3-5 sem |
|
||||||
| CorporateWP | 900€ | 299€ | 4-6 sem |
|
| CorporateWP | 900 | 299 | 4-6 sem |
|
||||||
| eCommerceWP | 1.100€ | 349€ | 7-9 sem |
|
| eCommerceWP | 1100 | 349 | 7-9 sem |
|
||||||
| ChallengeWP | 700€ | 250€ | 8-10 sem |
|
| ChallengeWP | 700 | 250 | 8-10 sem |
|
||||||
| CareWP | 1.300€ | 350€ | 4-6 sem |
|
| CareWP | 1300 | 350 | 4-6 sem |
|
||||||
|
|
||||||
### Funcionalidades Frequentes
|
### DeskCRM
|
||||||
|
| Produto | Setup | Anuidade |
|
||||||
|
|---------|-------|----------|
|
||||||
|
| DeskCRM Starter | (ver CRM) | 400 |
|
||||||
|
| DeskCRM Profissional | (ver CRM) | 800 |
|
||||||
|
| DeskCRM Avancado | (ver CRM) | 1500 |
|
||||||
|
| DeskCRM Enterprise | (ver CRM) | 3000 |
|
||||||
|
|
||||||
| Funcionalidade | Valor |
|
### AcceleratorX
|
||||||
|----------------|-------|
|
| Produto | Setup |
|
||||||
| EasyAppointment | 175€ (55+120) |
|
|---------|-------|
|
||||||
| Chat da Página | 50€ + 50€/ano |
|
| WP ProCMS | 650 |
|
||||||
| Forms Inteligentes | 150€ |
|
| e-Commerce | 750 |
|
||||||
| CartRecovery | 190€ (90+100) + 90€/ano |
|
| Membership | 450 |
|
||||||
| Pixel + GTM | 50€ |
|
| Booking | 450 |
|
||||||
| ShopBuilder | 5€/produto |
|
| Care | 750 |
|
||||||
|
| Meet | 650 |
|
||||||
|
| School Manager | 850 |
|
||||||
|
|
||||||
### Serviços Recorrentes
|
### Chatbots
|
||||||
|
| Produto | Setup |
|
||||||
|
|---------|-------|
|
||||||
|
| Chatbot Basico | 350 |
|
||||||
|
| Chatbot Avancado | 850 |
|
||||||
|
| Chatbot Care | 850 |
|
||||||
|
|
||||||
| Serviço | Valor Mensal | Compromisso |
|
### Design/Branding
|
||||||
|---------|--------------|-------------|
|
| Produto | Valor |
|
||||||
| Marketing 360 | 459€ | 12 meses |
|
|---------|-------|
|
||||||
| Manutenção | 150€ | 12 meses |
|
| Branding WOW Digital | 400 |
|
||||||
|
| Branding WOW Essencial | 850 |
|
||||||
## Termos e Condições Padrão
|
| Branding Completo | 1100 |
|
||||||
|
| Pack Rebranding | 1500 |
|
||||||
```
|
| Pack Premium 360 | 5000 |
|
||||||
CONDIÇÕES DE PAGAMENTO
|
|
||||||
|
|
||||||
1. Projectos: 50% na adjudicação + 50% na entrega
|
|
||||||
2. Serviços recorrentes: facturação mensal antecipada
|
|
||||||
|
|
||||||
VALIDADE
|
|
||||||
|
|
||||||
Orçamento válido por 30 dias a partir da data de emissão.
|
|
||||||
|
|
||||||
ANUIDADE
|
|
||||||
|
|
||||||
A anuidade inclui:
|
|
||||||
- Alojamento Premium SSD NVMe
|
|
||||||
- Certificado SSL
|
|
||||||
- Actualizações de segurança
|
|
||||||
- Suporte técnico básico
|
|
||||||
|
|
||||||
Descomplicar® Crescimento Digital
|
|
||||||
NIF: 514 623 168 | descomplicar.pt
|
|
||||||
```
|
|
||||||
|
|
||||||
## Estrutura de Items para API
|
## Estrutura de Items para API
|
||||||
|
|
||||||
Cada item do orçamento segue o formato:
|
Cada item do orcamento segue o formato:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"description": "Descrição do serviço",
|
"description": "Descricao do servico",
|
||||||
"qty": 1,
|
"qty": 1,
|
||||||
"rate": 700,
|
"rate": 700,
|
||||||
"unit": "un"
|
"unit": "un"
|
||||||
@@ -295,172 +338,144 @@ Cada item do orçamento segue o formato:
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Unidades:**
|
**Unidades:**
|
||||||
- `un` - Unidade (projecto/item único)
|
- `un` - Unidade (projecto/item unico)
|
||||||
- `mes` - Mês (serviço recorrente)
|
- `mes` ou `mensalidade` - Mes (servico recorrente mensal, usado com `-MEN`)
|
||||||
- `ano` - Ano (anuidade)
|
- `trimestral` - Trimestre (servico recorrente trimestral, usado com `-TRI`)
|
||||||
|
- `ano` ou `anuidade` - Ano (anuidade, comportamento por defeito)
|
||||||
|
|
||||||
## Checklist de Execução
|
## Termos e Condicoes Padrao
|
||||||
|
|
||||||
|
```
|
||||||
|
CONDICOES DE PAGAMENTO
|
||||||
|
|
||||||
|
1. Projectos: 50% na adjudicacao + 50% na entrega
|
||||||
|
2. Servicos recorrentes: facturacao mensal antecipada
|
||||||
|
|
||||||
|
VALIDADE
|
||||||
|
|
||||||
|
Orcamento valido por 30 dias a partir da data de emissao.
|
||||||
|
|
||||||
|
ANUIDADE
|
||||||
|
|
||||||
|
A anuidade inclui:
|
||||||
|
- Alojamento Premium SSD NVMe
|
||||||
|
- Certificado SSL
|
||||||
|
- Actualizacoes de seguranca
|
||||||
|
- Suporte tecnico basico
|
||||||
|
|
||||||
|
Descomplicar Crescimento Digital
|
||||||
|
NIF: 514 623 168 | descomplicar.pt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Checklist de Execucao
|
||||||
|
|
||||||
- [ ] Cliente identificado/criado no CRM
|
- [ ] Cliente identificado/criado no CRM
|
||||||
- [ ] Tipo de orçamento seleccionado
|
- [ ] Tipo de orcamento seleccionado
|
||||||
- [ ] Template carregado
|
- [ ] Precos consultados no CRM (tblitems)
|
||||||
- [ ] Funcionalidades adicionais identificadas
|
- [ ] Funcionalidades adicionais identificadas
|
||||||
- [ ] Valores calculados (subtotal + IVA)
|
- [ ] Valores calculados (subtotal + IVA)
|
||||||
- [ ] Anuidade calculada (se aplicável)
|
- [ ] Recorrencia calculada (anuidade/trimestral/mensal conforme variante)
|
||||||
- [ ] Estimate criado no CRM
|
- [ ] Estimate criado no CRM (status: Draft)
|
||||||
- [ ] Resumo apresentado ao utilizador
|
- [ ] Resumo apresentado ao utilizador
|
||||||
|
|
||||||
## Exemplos de Uso
|
|
||||||
|
|
||||||
### Exemplo 1: Website simples
|
|
||||||
```
|
|
||||||
/orcamento "TechStartup Lda" starter
|
|
||||||
→ StarterWP: 700€ + IVA
|
|
||||||
→ Anuidade: 250€/ano
|
|
||||||
```
|
|
||||||
|
|
||||||
### Exemplo 2: E-commerce com funcionalidades
|
|
||||||
```
|
|
||||||
/orcamento "Loja Online SA" ecom
|
|
||||||
→ Questiona: Nº produtos? Gateways? Transportadoras?
|
|
||||||
→ Calcula com funcionalidades
|
|
||||||
→ Gera orçamento detalhado
|
|
||||||
```
|
|
||||||
|
|
||||||
### Exemplo 3: Interactivo completo
|
|
||||||
```
|
|
||||||
/orcamento
|
|
||||||
→ Solicita cliente
|
|
||||||
→ Apresenta menu de tipos
|
|
||||||
→ Questões de personalização
|
|
||||||
→ Gera orçamento no CRM
|
|
||||||
```
|
|
||||||
|
|
||||||
## MCPs Utilizados
|
## MCPs Utilizados
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__desk-crm-v3__search_customers - Pesquisar cliente
|
mcp__desk-crm-v3__search_customers - Pesquisar cliente
|
||||||
mcp__desk-crm-v3__get_customer - Obter detalhes cliente
|
mcp__desk-crm-v3__get_customer - Obter detalhes cliente
|
||||||
mcp__desk-crm-v3__create_customer - Criar cliente novo
|
mcp__desk-crm-v3__create_customer - Criar cliente novo
|
||||||
mcp__desk-crm-v3__create_estimate - Criar orçamento
|
mcp__desk-crm-v3__create_estimate - Criar orcamento
|
||||||
mcp__desk-crm-v3__get_estimates - Listar orçamentos existentes
|
mcp__desk-crm-v3__get_estimates - Listar orcamentos existentes
|
||||||
|
mcp__desk-crm-v3__price_management - Consultar precos e itens
|
||||||
```
|
```
|
||||||
|
|
||||||
## Códigos de Produtos (tabela-geral.csv)
|
## Formulas de Calculo
|
||||||
|
|
||||||
### Websites
|
### Website Simples
|
||||||
| Código | Produto | Preço |
|
```
|
||||||
|--------|---------|-------|
|
Total = Base + Funcionalidades + Conteudos
|
||||||
| WEB-WP-001 | StarterWP | 700€ |
|
Anuidade = Anuidade_Base + Anuidades_Funcionalidades
|
||||||
| WEB-WP-002 | CorporateWP | 900€ |
|
```
|
||||||
| WEB-WP-003 | eCommerceWP | 1.100€ |
|
|
||||||
| WEB-WP-004 | ChallengeWP | 700€ |
|
|
||||||
| WEB-WP-005 | CareWP | 1.300€ |
|
|
||||||
|
|
||||||
### Branding
|
### Exemplo: Website Corporativo com Agendamento (sem variante)
|
||||||
| Código | Produto | Preço |
|
```
|
||||||
|--------|---------|-------|
|
CorporateWP: 900 (item CRM: "CorporateWP")
|
||||||
| DES-BRA-001 | Branding WOW Essencial | 850€ |
|
EasyAppointment: 175 (item CRM: "EasyAppointment")
|
||||||
| DES-BRA-002 | Branding Completo | 1.100€ |
|
Chat da Pagina: 50 (item CRM: "Chat da Pagina")
|
||||||
| DES-BRA-003 | Branding WOW Digital | 400€ |
|
Pixel + GTM: 50 (items CRM: "Configuracao Pixel Facebook" + "Configuracao GTM")
|
||||||
|
---------------------------------
|
||||||
|
Subtotal: 1175
|
||||||
|
IVA 23%: 270.25
|
||||||
|
TOTAL: 1445.25
|
||||||
|
|
||||||
### AcceleratorX
|
Anuidade: 299 + 50 + 50 = 399 (items CRM com unit "anuidade")
|
||||||
| Código | Produto | Preço |
|
```
|
||||||
|--------|---------|-------|
|
|
||||||
| TEC-WPC-001 | AcceleratorX WP ProCMS | 650€ |
|
|
||||||
| TEC-ECO-001 | AcceleratorX e-Commerce | 750€ |
|
|
||||||
| TEC-MEM-001 | AcceleratorX Membership | 450€ |
|
|
||||||
| TEC-BOO-001 | AcceleratorX Booking | 450€ |
|
|
||||||
| TEC-CAR-001 | AcceleratorX Care | 750€ |
|
|
||||||
|
|
||||||
### Consultoria
|
### Exemplo: Mesmo orcamento com `-MEN`
|
||||||
| Código | Produto | Preço |
|
```
|
||||||
|--------|---------|-------|
|
SETUP (pagamento unico):
|
||||||
| EST-CON-001 | Consultoria Estratégica | 90€/hora |
|
CorporateWP: 900
|
||||||
| EST-COA-001 | Coaching e Formação | 50€/hora |
|
EasyAppointment: 175
|
||||||
| EST-BRA-001 | Estratégia de Marca | 900€ |
|
Chat da Pagina: 50
|
||||||
|
Pixel + GTM: 50
|
||||||
|
---------------------------------
|
||||||
|
Subtotal Setup: 1175
|
||||||
|
IVA 23%: 270.25
|
||||||
|
TOTAL Setup: 1445.25
|
||||||
|
|
||||||
## Referências
|
RECORRENCIA MENSAL (items CRM com prefixo "Mensalidade"):
|
||||||
|
Mensalidade CorporateWP: 29.90 (item CRM: "Mensalidade CorporateWP")
|
||||||
|
Mensalidade EasyAppointment: 5.90 (item CRM: "Mensalidade EasyAppointment")
|
||||||
|
Mensalidade Chat da Pagina: 4.90 (item CRM: "Mensalidade Chat da Pagina")
|
||||||
|
---------------------------------
|
||||||
|
Subtotal Mensal: 40.70
|
||||||
|
IVA 23%: 9.36
|
||||||
|
TOTAL Mensal: 50.06/mes
|
||||||
|
|
||||||
- `references/pricing-guide.md` - Tabela de preços rápida
|
Nota: precos mensais sao exemplificativos - consultar CRM para valores reais.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referencias
|
||||||
|
|
||||||
|
- `references/pricing-guide.md` - Tabela de precos rapida (referencia, nao fonte de verdade)
|
||||||
- `templates/website-corporativo.md` - Templates StarterWP, CorporateWP, CareWP
|
- `templates/website-corporativo.md` - Templates StarterWP, CorporateWP, CareWP
|
||||||
- `templates/e-commerce.md` - Template eCommerceWP
|
- `templates/e-commerce.md` - Template eCommerceWP
|
||||||
- `templates/marketing-digital.md` - Template Marketing 360
|
- `templates/marketing-digital.md` - Template Marketing 360
|
||||||
- `templates/manutencao.md` - Template Manutenção
|
- `templates/manutencao.md` - Template Manutencao
|
||||||
|
|
||||||
## Fonte de Dados Principal
|
|
||||||
|
|
||||||
```
|
|
||||||
/media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/tabela-geral.csv
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Datasets Dify (Consulta Obrigatória)
|
## Datasets Dify (Consulta Complementar)
|
||||||
|
|
||||||
Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes datasets via MCP:
|
|
||||||
|
|
||||||
| Dataset | ID | Prioridade |
|
| Dataset | ID | Prioridade |
|
||||||
|---------|----|-----------:|
|
|---------|----|-----------:|
|
||||||
| **Serviços Descomplicar** | `bd65f36e-6004-4584-b478-129b2c21b4d2` | 1 |
|
| **Servicos Descomplicar** | `bd65f36e-6004-4584-b478-129b2c21b4d2` | 1 |
|
||||||
| **Vendas** | `a7ba6005-517c-41ab-ac5e-da1c1a1c62ef` | 1 |
|
| **Vendas** | `a7ba6005-517c-41ab-ac5e-da1c1a1c62ef` | 1 |
|
||||||
| **Marketing Digital** | `c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24` | 2 |
|
| **Marketing Digital** | `c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24` | 2 |
|
||||||
| **Desenvolvimento de WebSites** | `c8489151-de94-42b2-8cee-c0b961cfac6d` | 2 |
|
| **Desenvolvimento de WebSites** | `c8489151-de94-42b2-8cee-c0b961cfac6d` | 2 |
|
||||||
|
|
||||||
### Como Consultar
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// Pesquisar serviços e preços
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
|
||||||
dataset_id: "bd65f36e-6004-4584-b478-129b2c21b4d2",
|
|
||||||
query: "pacote website ecommerce"
|
|
||||||
})
|
|
||||||
|
|
||||||
// Técnicas de proposta e negociação
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
|
||||||
dataset_id: "a7ba6005-517c-41ab-ac5e-da1c1a1c62ef",
|
|
||||||
query: "proposta comercial fechamento"
|
|
||||||
})
|
|
||||||
|
|
||||||
// Funcionalidades de websites
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
|
||||||
dataset_id: "c8489151-de94-42b2-8cee-c0b961cfac6d",
|
|
||||||
query: "funcionalidades website corporativo"
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Quando Consultar
|
### Quando Consultar
|
||||||
|
|
||||||
- Definir escopo de projecto
|
- Justificar precos ao cliente
|
||||||
- Justificar preços ao cliente
|
|
||||||
- Comparar funcionalidades entre pacotes
|
- Comparar funcionalidades entre pacotes
|
||||||
- Criar proposta de valor diferenciada
|
- Criar proposta de valor diferenciada
|
||||||
|
- Tecnicas de negociacao e fechamento
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Instrumentação Automática
|
## Instrumentacao Automatica
|
||||||
|
|
||||||
Esta skill grava métricas automaticamente para análise PDCA.
|
|
||||||
|
|
||||||
### Baseline
|
### Baseline
|
||||||
|
|
||||||
| Métrica | Valor |
|
| Metrica | Valor |
|
||||||
|---------|-------|
|
|---------|-------|
|
||||||
| Tempo baseline | 30 min |
|
| Tempo baseline | 30 min |
|
||||||
| Tempo target | 15 min |
|
| Tempo target | 15 min |
|
||||||
| Melhoria esperada | -50% |
|
| Melhoria esperada | -50% |
|
||||||
|
|
||||||
### Ao Executar Esta Skill
|
|
||||||
|
|
||||||
1. **Início:** Registar `SKILL_START = Date.now()`
|
|
||||||
2. **Consultas KB:** Rastrear consultas Dify (KB_CONSULTED, KB_HITS)
|
|
||||||
3. **Tool calls:** Contar chamadas MCP
|
|
||||||
4. **Fim:** Gravar métrica
|
|
||||||
|
|
||||||
### Query para Gravar (executar no final da skill)
|
### Query para Gravar (executar no final da skill)
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
-- Executar via SSH ou MCP no final da skill
|
|
||||||
INSERT INTO tblskill_agent_metrics (
|
INSERT INTO tblskill_agent_metrics (
|
||||||
type, name, duration_ms, status, staff_id,
|
type, name, duration_ms, status, staff_id,
|
||||||
kb_consulted, kb_cache_hit, tool_calls, project_id
|
kb_consulted, kb_cache_hit, tool_calls, project_id
|
||||||
@@ -470,29 +485,30 @@ INSERT INTO tblskill_agent_metrics (
|
|||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
### Exemplo Completo
|
---
|
||||||
|
|
||||||
```sql
|
## Changelog
|
||||||
-- Orçamento criado com sucesso em 20 minutos, consultou Dify, sem cache
|
|
||||||
INSERT INTO tblskill_agent_metrics (
|
|
||||||
type, name, duration_ms, status, staff_id,
|
|
||||||
kb_consulted, kb_cache_hit, tool_calls, project_id
|
|
||||||
) VALUES (
|
|
||||||
'skill', '/orcamento', 1200000, 'success', 25,
|
|
||||||
1, 0, 8, 65
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Ver Métricas
|
### v4.1.0 (2026-03-12)
|
||||||
|
- Suporte para variantes `-MEN` (mensal) e `-TRI` (trimestral) na sintaxe
|
||||||
|
- Fase 3 actualizada com queries especificas por variante
|
||||||
|
- Fase 5 actualizada com termos de pagamento ajustados por variante
|
||||||
|
- Mapeamento de variantes documentado (pesquisa por prefixo no CRM)
|
||||||
|
- Exemplo adicional com `-MEN` para demonstrar separacao setup/recorrencia
|
||||||
|
- Retrocompativel: sem flag = comportamento anterior (item base)
|
||||||
|
|
||||||
```bash
|
### v4.0.0 (2026-03-05)
|
||||||
/metrics /orcamento
|
- **BREAKING**: Fonte de verdade migrada de CSVs para Desk CRM (tblitems + tblitems_groups)
|
||||||
```
|
- Removidas referencias a tabela-geral.csv, items-subscricao.csv, chatbots-precos.csv, items-faturacao-deskcrm.csv
|
||||||
|
- Adicionados grupos DeskCRM, Chatbots, AcceleratorX como tipos de orcamento
|
||||||
|
- Protocolo actualizado para consultar precos via MCP/SQL em vez de CSVs
|
||||||
|
- Tabela de referencia rapida mantida mas marcada como "nao fonte de verdade"
|
||||||
|
- Adicionada documentacao de variantes de facturacao (Investimento/Anuidade/Trimestral/Mensalidade)
|
||||||
|
|
||||||
### Protocolo
|
### v3.1.0 (2026-02-03)
|
||||||
|
- Instrumentacao automatica adicionada
|
||||||
Ver `~/.claude/skills/_core/instrumentation-protocol.md`
|
- Datasets Dify integrados
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Versão**: 3.1.0 | **Data**: 2026-02-03 | **Instrumentação**: Activa
|
**Versao**: 4.1.0 | **Data**: 2026-03-12 | **Fonte de Verdade**: Desk CRM (tblitems)
|
||||||
|
|||||||
367
crm-ops/skills/proposal-deck/SKILL.md
Normal file
367
crm-ops/skills/proposal-deck/SKILL.md
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
---
|
||||||
|
name: proposal-deck
|
||||||
|
description: Geracao de apresentacoes PPTX de propostas comerciais profissionais com branding Descomplicar. Integra dados do CRM, tabela de precos e template curado de 16 layouts.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill /proposal-deck - Apresentacoes de Propostas Comerciais
|
||||||
|
|
||||||
|
Gera apresentacoes PPTX profissionais para propostas comerciais da Descomplicar, usando um template curado com 16 layouts e branding oficial.
|
||||||
|
|
||||||
|
## Triggers
|
||||||
|
|
||||||
|
- `/proposal-deck`
|
||||||
|
- "proposta", "apresentacao cliente", "deck proposta", "proposta comercial", "apresentacao proposta"
|
||||||
|
|
||||||
|
## Quando Usar
|
||||||
|
|
||||||
|
- Preparar apresentacao visual de proposta para reuniao com cliente
|
||||||
|
- Criar deck profissional para acompanhar orcamento/estimate
|
||||||
|
- Gerar proposta completa com branding para envio por email
|
||||||
|
- Complementar `/orcamento` com material visual
|
||||||
|
|
||||||
|
## Quando NAO Usar
|
||||||
|
|
||||||
|
- Para criar orcamento sem apresentacao (usar `/orcamento`)
|
||||||
|
- Para analise estrategica de lead (usar `/lead-approach`)
|
||||||
|
- Para operacoes CRM genericas (usar `/crm-ops`)
|
||||||
|
- Para apresentacoes sem contexto comercial (usar pptx-generator directamente)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Template
|
||||||
|
|
||||||
|
**Localizacao:** `/media/ealmeida/Dados/Hub/90-Templates/Comercial/descomplicar-proposal-template.pptx`
|
||||||
|
|
||||||
|
### Layouts Disponiveis (16)
|
||||||
|
|
||||||
|
| # | Nome | Funcao | Quando usar |
|
||||||
|
|---|------|--------|-------------|
|
||||||
|
| 1 | capa | Titulo da proposta + subtitulo + ano | Sempre (obrigatorio) |
|
||||||
|
| 2 | divisor-seccao | Fundo escuro com titulo centrado | Entre seccoes principais |
|
||||||
|
| 3 | sobre-nos | Card texto + imagem lateral | Sempre (quem somos) |
|
||||||
|
| 4 | objectivos | Fundo escuro + objectivos + logo cliente | Sempre (o que vamos resolver) |
|
||||||
|
| 5 | processo-3-passos | 3 colunas douradas com texto | Explicar metodologia |
|
||||||
|
| 6 | fases-3-blocos | 3 blocos numerados verticais | Fases do projecto (3 items) |
|
||||||
|
| 7 | grid-4-cards | Grid 4 cards com icones | Valores, diferenciais, pilares (4 items) |
|
||||||
|
| 8 | beneficios-6 | 6 blocos com icones e setas | Beneficios (6 items) |
|
||||||
|
| 9 | pilares-engrenagens | 4 pilares em engrenagens | Solucao completa (4 pilares) |
|
||||||
|
| 10 | detalhe-servico | Titulo + features list + foto + CTA | Detalhe de um servico/pack |
|
||||||
|
| 11 | deliverables | 4 rows dourados com bullets | Lista deliverables/escopo |
|
||||||
|
| 12 | timeline-etapas | 5 etapas coloridas horizontais | Cronograma/fases com precos |
|
||||||
|
| 13 | pack-pricing | Checklist com preco e foto | Pack/avenca mensal |
|
||||||
|
| 14 | resumo-financeiro | Timeline com precos por fase | Resumo valores total |
|
||||||
|
| 15 | contacto | Foto gestor + dados | Sempre (obrigatorio) |
|
||||||
|
| 16 | encerramento | Lobo + branding nocturno | Sempre (obrigatorio) |
|
||||||
|
|
||||||
|
### Slides Obrigatorios
|
||||||
|
|
||||||
|
Toda proposta inclui **no minimo**: capa (1) + sobre-nos (3) + objectivos (4) + contacto (15) + encerramento (16).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scripts PPTX
|
||||||
|
|
||||||
|
**Base path:** `~/.claude/plugins/marketplaces/descomplicar-plugins/design-media/skills/pptx-generator/scripts/`
|
||||||
|
|
||||||
|
| Script | Funcao |
|
||||||
|
|--------|--------|
|
||||||
|
| `office/unpack.py` | Descompactar PPTX em XML editavel |
|
||||||
|
| `office/pack.py` | Recompactar XML em PPTX valido |
|
||||||
|
| `clean.py` | Limpar XMLs (namespaces, refs orfas) |
|
||||||
|
| `add_slide.py` | Adicionar slides ao XML |
|
||||||
|
| `office/validate.py` | Validar estrutura do PPTX |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Protocolo
|
||||||
|
|
||||||
|
### Sintaxe
|
||||||
|
|
||||||
|
```
|
||||||
|
/proposal-deck [cliente] [tipo]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parametros:**
|
||||||
|
- `cliente` - Nome ou ID do cliente (opcional, sera solicitado se omitido)
|
||||||
|
- `tipo` - Complexidade da proposta (opcional): `minima`, `standard`, `completa`
|
||||||
|
|
||||||
|
### Fase 1: Recolha de Informacao
|
||||||
|
|
||||||
|
1. **Identificar cliente no CRM:**
|
||||||
|
```
|
||||||
|
mcp__desk-crm-v3__search_customers query="[nome]" fields="company,vat"
|
||||||
|
mcp__desk-crm-v3__get_customer customer_id=[id]
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Verificar orcamentos existentes:**
|
||||||
|
```
|
||||||
|
mcp__desk-crm-v3__get_estimates status="draft" client_id=[id]
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Consultar tabela de precos** (complementar ao CRM):
|
||||||
|
- Ficheiro: `/media/ealmeida/Dados/GDrive/Cloud/Descomplicar/Servicos/tabela-geral.csv`
|
||||||
|
- CRM (fonte de verdade): `mcp__desk-crm-v3__price_management action="get_pricing_insights"`
|
||||||
|
|
||||||
|
4. **Solicitar dados em falta** (se nao disponiveis no CRM):
|
||||||
|
|
||||||
|
| Campo | Obrigatorio | Default |
|
||||||
|
|-------|:-----------:|---------|
|
||||||
|
| Nome do cliente | Sim | — |
|
||||||
|
| Sector/industria | Sim | — |
|
||||||
|
| Objectivos | Sim | — |
|
||||||
|
| Servicos a propor | Sim | — |
|
||||||
|
| Precos | Sim | CRM |
|
||||||
|
| Prazo estimado | Nao | "a definir" |
|
||||||
|
| Gestor de conta | Nao | Emanuel Almeida |
|
||||||
|
|
||||||
|
### Fase 2: Seleccao de Layouts
|
||||||
|
|
||||||
|
Seleccionar layouts com base na complexidade e servicos propostos.
|
||||||
|
|
||||||
|
#### Proposta Minima (8 slides)
|
||||||
|
Para projectos simples, orcamentos rapidos.
|
||||||
|
|
||||||
|
| Ordem | Layout | Conteudo |
|
||||||
|
|:-----:|--------|----------|
|
||||||
|
| 1 | capa | "Proposta [Servico]" + nome cliente + ano |
|
||||||
|
| 2 | sobre-nos | Apresentacao Descomplicar |
|
||||||
|
| 3 | objectivos | 3-5 objectivos do cliente |
|
||||||
|
| 4 | processo-3-passos | Metodologia de trabalho |
|
||||||
|
| 5 | deliverables | O que esta incluido |
|
||||||
|
| 6 | pack-pricing | Preco + o que inclui |
|
||||||
|
| 7 | contacto | Dados do gestor |
|
||||||
|
| 8 | encerramento | Branding Descomplicar |
|
||||||
|
|
||||||
|
#### Proposta Standard (12 slides)
|
||||||
|
Para projectos de media complexidade (websites, marketing).
|
||||||
|
|
||||||
|
| Ordem | Layout | Conteudo |
|
||||||
|
|:-----:|--------|----------|
|
||||||
|
| 1 | capa | Titulo + cliente + ano |
|
||||||
|
| 2 | sobre-nos | Apresentacao Descomplicar |
|
||||||
|
| 3 | divisor-seccao | "Desafio" |
|
||||||
|
| 4 | objectivos | Objectivos do cliente |
|
||||||
|
| 5 | processo-3-passos | Metodologia |
|
||||||
|
| 6 | fases-3-blocos | Fases do projecto |
|
||||||
|
| 7 | divisor-seccao | "Solucao" |
|
||||||
|
| 8 | beneficios-6 | Beneficios da solucao |
|
||||||
|
| 9 | deliverables | Escopo detalhado |
|
||||||
|
| 10 | timeline-etapas | Cronograma com precos |
|
||||||
|
| 11 | contacto | Dados do gestor |
|
||||||
|
| 12 | encerramento | Branding Descomplicar |
|
||||||
|
|
||||||
|
#### Proposta Completa (16 slides)
|
||||||
|
Para projectos complexos, concursos, clientes enterprise.
|
||||||
|
|
||||||
|
Usa todos os 16 layouts na ordem numerica original.
|
||||||
|
|
||||||
|
### Fase 3: Geracao do PPTX
|
||||||
|
|
||||||
|
**Directorio de trabalho:** `~/.claude-work/proposal-[cliente-slug]/`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Criar directorio e copiar template
|
||||||
|
mkdir -p ~/.claude-work/proposal-[slug]/
|
||||||
|
cp "/media/ealmeida/Dados/Hub/90-Templates/Comercial/descomplicar-proposal-template.pptx" \
|
||||||
|
~/.claude-work/proposal-[slug]/template.pptx
|
||||||
|
|
||||||
|
# 2. Descompactar template
|
||||||
|
python3 ~/.claude/plugins/marketplaces/descomplicar-plugins/design-media/skills/pptx-generator/scripts/office/unpack.py \
|
||||||
|
~/.claude-work/proposal-[slug]/template.pptx \
|
||||||
|
~/.claude-work/proposal-[slug]/unpacked/
|
||||||
|
|
||||||
|
# 3. Editar slides XML (ver seccao "Edicao de Conteudo XML")
|
||||||
|
|
||||||
|
# 4. Remover slides nao necessarios de presentation.xml
|
||||||
|
# (alterar rIdX refs e apagar ficheiros slideN.xml correspondentes)
|
||||||
|
|
||||||
|
# 5. Limpar XMLs
|
||||||
|
python3 ~/.claude/plugins/marketplaces/descomplicar-plugins/design-media/skills/pptx-generator/scripts/clean.py \
|
||||||
|
~/.claude-work/proposal-[slug]/unpacked/
|
||||||
|
|
||||||
|
# 6. Recompactar
|
||||||
|
python3 ~/.claude/plugins/marketplaces/descomplicar-plugins/design-media/skills/pptx-generator/scripts/office/pack.py \
|
||||||
|
~/.claude-work/proposal-[slug]/unpacked/ \
|
||||||
|
~/.claude-work/proposal-[slug]/proposta-[slug].pptx \
|
||||||
|
--original ~/.claude-work/proposal-[slug]/template.pptx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Edicao de Conteudo XML
|
||||||
|
|
||||||
|
Cada slide e um ficheiro `ppt/slides/slideN.xml`. Localizar placeholders pelo texto visivel e substituir:
|
||||||
|
|
||||||
|
| Placeholder | Substituir por | Exemplo |
|
||||||
|
|-------------|----------------|---------|
|
||||||
|
| `[TITULO_PROPOSTA]` | Nome do servico proposto | "Website Corporativo" |
|
||||||
|
| `[SUBTITULO]` | Nome do cliente | "Para Empresa XYZ" |
|
||||||
|
| `[ANO]` | Ano corrente | "2026" |
|
||||||
|
| `[OBJECTIVO_N]` | Objectivo N do cliente | "Aumentar presenca online" |
|
||||||
|
| `[FASE_N_TITULO]` | Titulo da fase N | "Fase 1: Descoberta" |
|
||||||
|
| `[FASE_N_DESC]` | Descricao da fase N | "Analise de requisitos..." |
|
||||||
|
| `[DELIVERABLE_N]` | Item do escopo | "Website responsivo" |
|
||||||
|
| `[PRECO]` | Valor formatado | "1.200 EUR" |
|
||||||
|
| `[PRECO_TOTAL]` | Valor total | "2.500 EUR + IVA" |
|
||||||
|
| `[TIMELINE_N]` | Etapa do cronograma | "Semana 1-2" |
|
||||||
|
| `[GESTOR_NOME]` | Nome do gestor | "Emanuel Almeida" |
|
||||||
|
| `[GESTOR_EMAIL]` | Email do gestor | "emanuel@descomplicar.pt" |
|
||||||
|
| `[GESTOR_TEL]` | Telefone | "911 510 005" |
|
||||||
|
|
||||||
|
**Tecnica XML:** Localizar `<a:t>` tags dentro de `<a:r>` runs. Substituir texto preservando formatacao:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Exemplo: substituir texto num slide
|
||||||
|
import re
|
||||||
|
|
||||||
|
def replace_placeholder(xml_content, placeholder, value):
|
||||||
|
"""Substituir placeholder preservando formatacao XML."""
|
||||||
|
# Placeholders podem estar fragmentados em multiplos <a:t> tags
|
||||||
|
# Usar regex para localizar e substituir
|
||||||
|
return xml_content.replace(placeholder, value)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Regra critica:** Nunca alterar atributos de formatacao (`<a:rPr>`, `<a:pPr>`). Apenas substituir conteudo textual dentro de `<a:t>`.
|
||||||
|
|
||||||
|
### Fase 4: Entrega
|
||||||
|
|
||||||
|
1. **Guardar PPTX final:**
|
||||||
|
```
|
||||||
|
Hub/03-Propostas/[cliente]/proposta-[servico]-[data].pptx
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Upload para Google Drive** (opcional):
|
||||||
|
```
|
||||||
|
mcp__google-workspace__drive_upload_file
|
||||||
|
file_path="~/.claude-work/proposal-[slug]/proposta-[slug].pptx"
|
||||||
|
folder_id="[pasta-cliente-drive]"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Registar no CRM** (se nao existir estimate):
|
||||||
|
```
|
||||||
|
mcp__desk-crm-v3__create_estimate
|
||||||
|
client_id=[id]
|
||||||
|
date=[hoje]
|
||||||
|
expiry_date=[hoje + 30 dias]
|
||||||
|
items=[items]
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Limpar temporarios:**
|
||||||
|
```bash
|
||||||
|
rm -rf ~/.claude-work/proposal-[slug]/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Exemplos de Propostas Tipicas
|
||||||
|
|
||||||
|
### Website Corporativo (CorporateWP)
|
||||||
|
|
||||||
|
**Tipo:** Standard (12 slides)
|
||||||
|
**Servico:** CorporateWP
|
||||||
|
**Slides seleccionados:** capa, sobre-nos, divisor, objectivos, processo-3-passos, fases-3-blocos, divisor, beneficios-6, deliverables, timeline-etapas, contacto, encerramento
|
||||||
|
|
||||||
|
**Conteudo tipico:**
|
||||||
|
- **Objectivos:** Presenca profissional online, geracao de leads, credibilidade digital
|
||||||
|
- **3 Passos:** Descoberta -> Desenvolvimento -> Lancamento
|
||||||
|
- **3 Fases:** Analise e Conteudo (S1-2) -> Design e Desenvolvimento (S3-5) -> Testes e Lancamento (S6)
|
||||||
|
- **6 Beneficios:** Design responsivo, SEO optimizado, painel intuitivo, SSL incluido, suporte dedicado, performance rapida
|
||||||
|
- **Deliverables:** Website responsivo, 5-8 paginas, formularios, integracao redes sociais, Google Analytics, formacao
|
||||||
|
- **Timeline:** 4-6 semanas, 900 EUR + IVA, anuidade 299 EUR
|
||||||
|
|
||||||
|
### Marketing 360
|
||||||
|
|
||||||
|
**Tipo:** Completa (16 slides)
|
||||||
|
**Servico:** Marketing Digital 360
|
||||||
|
**Slides seleccionados:** todos os 16
|
||||||
|
|
||||||
|
**Conteudo tipico:**
|
||||||
|
- **Objectivos:** Aumentar visibilidade, gerar leads qualificados, ROI mensuravel, posicionamento digital
|
||||||
|
- **4 Pilares (engrenagens):** SEO, Redes Sociais, Publicidade Online, Email Marketing
|
||||||
|
- **Processo:** Auditoria -> Estrategia -> Execucao
|
||||||
|
- **6 Beneficios:** Mais trafego, leads qualificados, brand awareness, ROI mensuravel, relatorios mensais, equipa dedicada
|
||||||
|
- **Deliverables:** Auditoria inicial, plano estrategico, gestao redes sociais, campanhas Ads, relatorios mensais, reunioes quinzenais
|
||||||
|
- **Timeline:** Ongoing, setup 500-1500 EUR, mensalidade 300-800 EUR
|
||||||
|
|
||||||
|
### SEO / Optimizacao
|
||||||
|
|
||||||
|
**Tipo:** Standard (12 slides)
|
||||||
|
**Servico:** Pack SEO
|
||||||
|
**Slides seleccionados:** capa, sobre-nos, divisor, objectivos, processo-3-passos, grid-4-cards, divisor, detalhe-servico, deliverables, pack-pricing, contacto, encerramento
|
||||||
|
|
||||||
|
**Conteudo tipico:**
|
||||||
|
- **Objectivos:** Melhorar posicionamento Google, aumentar trafego organico, ultrapassar concorrencia
|
||||||
|
- **3 Passos:** Auditoria Tecnica -> Optimizacao On-Page -> Link Building
|
||||||
|
- **4 Cards:** Pesquisa Keywords, SEO Tecnico, Conteudo Optimizado, Relatorios Mensais
|
||||||
|
- **Deliverables:** Auditoria inicial, optimizacao 10-20 paginas, blog mensal, relatorio posicoes, Google Search Console
|
||||||
|
- **Pricing:** Mensalidade 300-600 EUR conforme pack
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## MCPs Utilizados
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__desk-crm-v3__search_customers - Pesquisar cliente
|
||||||
|
mcp__desk-crm-v3__get_customer - Obter detalhes cliente
|
||||||
|
mcp__desk-crm-v3__get_estimates - Verificar orcamentos existentes
|
||||||
|
mcp__desk-crm-v3__create_estimate - Registar estimate no CRM
|
||||||
|
mcp__desk-crm-v3__price_management - Consultar precos oficiais
|
||||||
|
mcp__google-workspace__drive_upload_file - Upload para Google Drive
|
||||||
|
mcp__mcp-time__current_time - Data/hora actual
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist de Execucao
|
||||||
|
|
||||||
|
- [ ] Cliente identificado no CRM
|
||||||
|
- [ ] Dados recolhidos (objectivos, servicos, precos)
|
||||||
|
- [ ] Tipo de proposta seleccionado (minima/standard/completa)
|
||||||
|
- [ ] Layouts seleccionados e conteudo definido
|
||||||
|
- [ ] Template copiado para ~/.claude-work/
|
||||||
|
- [ ] PPTX descompactado
|
||||||
|
- [ ] Slides editados com dados do cliente
|
||||||
|
- [ ] Slides desnecessarios removidos
|
||||||
|
- [ ] XMLs limpos (clean.py)
|
||||||
|
- [ ] PPTX recompactado e validado
|
||||||
|
- [ ] Ficheiro guardado em Hub/03-Propostas/[cliente]/
|
||||||
|
- [ ] Temporarios limpos
|
||||||
|
- [ ] Estimate registado no CRM (se aplicavel)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
| Fazer | NAO Fazer |
|
||||||
|
|-------|-----------|
|
||||||
|
| Personalizar cada slide com dados reais do cliente | Usar placeholders genericos ou "Lorem ipsum" |
|
||||||
|
| Consultar CRM para precos actualizados | Inventar precos de memoria |
|
||||||
|
| Seleccionar layouts relevantes para o servico | Incluir todos os 16 slides quando 8 bastam |
|
||||||
|
| Manter branding Descomplicar (cores, fontes, logo) | Alterar formatacao XML (cores, tamanhos, posicoes) |
|
||||||
|
| Guardar em Hub/03-Propostas/ com nome descritivo | Deixar ficheiros em ~/.claude-work/ |
|
||||||
|
| Usar slug sem espacos no nome do ficheiro | Espacos ou caracteres especiais no nome |
|
||||||
|
| Verificar PPTX abre correctamente apos geracao | Entregar sem validar |
|
||||||
|
| Adaptar objectivos ao sector do cliente | Copiar objectivos genericos entre propostas |
|
||||||
|
| Incluir dados de contacto do gestor real | Dados de contacto ficticios |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Procedimentos Relacionados
|
||||||
|
|
||||||
|
- `PROC-Catalogo-Codificacao-Produtos.md` - Codificacao e catalogo de produtos
|
||||||
|
- `PROC-CRM-Operacoes.md` - Operacoes CRM padrao
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
### v1.0.0 (2026-03-06)
|
||||||
|
- Versao inicial da skill /proposal-deck
|
||||||
|
- 16 layouts mapeados do template PPTX curado
|
||||||
|
- 3 niveis de complexidade: minima (8), standard (12), completa (16)
|
||||||
|
- Integracao CRM (cliente, estimates, precos)
|
||||||
|
- Workflow completo: recolha -> seleccao -> geracao -> entrega
|
||||||
|
- Exemplos para website, marketing 360, SEO
|
||||||
|
- Anti-patterns documentados
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Versao**: 1.0.0 | **Data**: 2026-03-06 | **Template**: descomplicar-proposal-template.pptx
|
||||||
171
crm-ops/skills/ticket-triage/SKILL.md
Normal file
171
crm-ops/skills/ticket-triage/SKILL.md
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
---
|
||||||
|
name: ticket-triage
|
||||||
|
description: Auto-processamento de tickets abertos no Desk CRM. Fecha SPAM, identifica facturas para /auto-expense e protege notificações de sistema.
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
|
# /ticket-triage v1.0
|
||||||
|
|
||||||
|
Auto-processamento de tickets abertos no Desk CRM.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Protocolo
|
||||||
|
|
||||||
|
### Passo 1: Recolher tickets abertos
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__desk-crm-v3__get_tickets({ status: 1, limit: 50 })
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 2: Carregar tabela de fornecedores
|
||||||
|
|
||||||
|
```
|
||||||
|
Read: /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md
|
||||||
|
Extrair dominios de fornecedores e plataformas multi-fornecedor
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 3: Classificar cada ticket
|
||||||
|
|
||||||
|
> Aplicar por ordem de prioridade. Primeiro match ganha.
|
||||||
|
|
||||||
|
```
|
||||||
|
Para cada ticket aberto:
|
||||||
|
|
||||||
|
1. NOTIFICACAO SISTEMA? (verificar PRIMEIRO)
|
||||||
|
Subject contem padrao protegido E remetente conhecido
|
||||||
|
→ NAO fechar. Guardar para "Requer Accao" no output.
|
||||||
|
|
||||||
|
2. DESPESA? (verificar SEGUNDO)
|
||||||
|
Email do remetente contem dominio de fornecedor conhecido
|
||||||
|
Subject contem: payment, pagamento, invoice, factura, recibo, receipt, paid, renewed
|
||||||
|
→ Registar no output como factura para /auto-expense
|
||||||
|
→ Fechar ticket (status 5) com nota "Factura flagged para /auto-expense"
|
||||||
|
|
||||||
|
3. SPAM? (verificar TERCEIRO)
|
||||||
|
→ Fechar (status 5) com motivo
|
||||||
|
|
||||||
|
4. NEWSLETTER/INFORMATIVO?
|
||||||
|
→ Fechar (status 5) com motivo
|
||||||
|
|
||||||
|
5. NENHUM MATCH
|
||||||
|
→ Manter aberto para revisao
|
||||||
|
```
|
||||||
|
|
||||||
|
### Passo 4: Escrever output JSON
|
||||||
|
|
||||||
|
```
|
||||||
|
Escrever em ~/.claude-work/today-tickets-{date}.json:
|
||||||
|
{
|
||||||
|
"spam_fechados": 3,
|
||||||
|
"newsletters_fechadas": 1,
|
||||||
|
"facturas": [
|
||||||
|
{"ticket_id": 456, "fornecedor": "Anthropic", "subject": "Receipt", "sender": "..."}
|
||||||
|
],
|
||||||
|
"notificacoes": [
|
||||||
|
{"ticket_id": 789, "subject": "Security Alert", "sender": "..."}
|
||||||
|
],
|
||||||
|
"mantidos_abertos": 2,
|
||||||
|
"total_processados": 12
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Padroes SPAM (fechar status 5)
|
||||||
|
|
||||||
|
```
|
||||||
|
Keywords no subject (case-insensitive):
|
||||||
|
- Guest Post, SEO services, backlinks, partnership
|
||||||
|
- link building, dofollow, collaboration opportunity
|
||||||
|
- Purchase Order (de desconhecidos)
|
||||||
|
- WeTransfer (phishing), Prestige Awards
|
||||||
|
- lottery, winner, urgent money, bitcoin
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notificacoes de Sistema (NUNCA auto-fechar)
|
||||||
|
|
||||||
|
```
|
||||||
|
Padroes protegidos no subject (case-insensitive):
|
||||||
|
- Legal Update, Legal Notice, Policy Change, Policy Update
|
||||||
|
- Deprecation, End of Life, EOL, Breaking Change
|
||||||
|
- Migration Required, Action Required, Action Needed
|
||||||
|
- Security Alert, Security Advisory, Security Notice
|
||||||
|
- API Change, API Update, Terms Update, Terms Change
|
||||||
|
- Service Disruption, Maintenance Required
|
||||||
|
- Compliance, GDPR, Data Processing
|
||||||
|
- Infrastructure Change, Platform Update, Product Update
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tickets a Saltar (NAO criar despesa)
|
||||||
|
|
||||||
|
| Tipo | Indicador | Accao |
|
||||||
|
|------|-----------|-------|
|
||||||
|
| Payment Confirmation | "Payment Confirmation" de CWP | Fechar (confirmacao, nao factura) |
|
||||||
|
| Payment Receipt | "Payment Was Successfully Processed" de elasticemail | Fechar (recibo sem dados) |
|
||||||
|
| Notificacao bancaria | "Notificacao de transferencia" de bancobpi | Fechar |
|
||||||
|
| Duplicado | Mesmo subject que ticket ja processado | Fechar como duplicado |
|
||||||
|
|
||||||
|
> **Nota:** Receipts de Anthropic e Canva contem invoice number e valor -> SAO despesas.
|
||||||
|
> "Receipt" so e motivo para saltar quando e apenas confirmacao sem dados de factura.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tickets para ELIMINAR (notificacoes sem valor)
|
||||||
|
|
||||||
|
```
|
||||||
|
Subject contem:
|
||||||
|
- "Your Elastic Email Account was successfully re-charged"
|
||||||
|
- "Account re-charged", "Auto-recharge successful"
|
||||||
|
- "Credit added to your account"
|
||||||
|
- "[BOT] Ativacao realizada com sucesso"
|
||||||
|
|
||||||
|
→ mcp__desk-crm-v3__delete_ticket({ ticket_id: ID, confirm: true })
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Remetentes Conhecidos (whitelist facturas)
|
||||||
|
|
||||||
|
> Ver tabela completa em: Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md
|
||||||
|
> Verificar pelo DOMINIO do email remetente, nao pelo departamento.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Output Standalone
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Triagem Tickets - DD-MM-YYYY
|
||||||
|
|
||||||
|
**Total: X tickets processados**
|
||||||
|
|
||||||
|
### SPAM Fechado (Y)
|
||||||
|
- #123 - "Guest Post SEO" - spam@dominio.com
|
||||||
|
|
||||||
|
### Facturas Identificadas (Z)
|
||||||
|
- #456 - "Receipt" - billing@anthropic.com -> /auto-expense
|
||||||
|
|
||||||
|
### Notificacoes Sistema (W)
|
||||||
|
- #789 - "Security Alert" - noreply@n8n.io -> requer accao
|
||||||
|
|
||||||
|
### Mantidos Abertos (N)
|
||||||
|
- #012 - "Pedido de suporte" - cliente@empresa.pt
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Anti-Patterns
|
||||||
|
|
||||||
|
- NUNCA eliminar tickets de remetentes desconhecidos com facturas
|
||||||
|
- NUNCA fechar notificacoes protegidas automaticamente
|
||||||
|
- NUNCA processar despesas directamente (delegar para /auto-expense)
|
||||||
|
- SEMPRE verificar dominio do remetente na tabela de fornecedores
|
||||||
|
- SEMPRE usar staff_id: 25 (AikTop) nos comentarios
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Skill v1.0.0 | 04-03-2026 | Descomplicar®*
|
||||||
@@ -1,17 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: ticket
|
name: ticket
|
||||||
description: >
|
description: Gestão de tickets de suporte Desk CRM. Ver, responder, fechar e escalar tickets. Inclui templates de resposta e integração com /today.
|
||||||
Gestão de tickets de suporte Desk CRM v1.0. Ver, responder, fechar, escalar.
|
disable-model-invocation: true
|
||||||
Use when "ticket", "suporte", "support", "incidente", "helpdesk".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 1.0.0
|
|
||||||
quality_score: 75
|
|
||||||
user_invocable: true
|
|
||||||
category: business
|
|
||||||
tags: [ticket, support, suporte, helpdesk, desk, crm]
|
|
||||||
desk_project: 65
|
|
||||||
allowed-tools: Read, mcp__desk-crm-v3, mcp__mcp-time
|
|
||||||
mcps: desk-crm-v3, mcp-time
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# /ticket v1.0 - Gestão de Suporte
|
# /ticket v1.0 - Gestão de Suporte
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "design-media",
|
"name": "design-media",
|
||||||
"description": "UI/UX design, web design, video production with Remotion and PowerPoint generation. Backed by 3 Dify KB datasets.",
|
"description": "Motor de design profissional multi-marca. UI/UX, web design, apresentacoes AI, infograficos, social media, video Remotion. 5 MCPs: Presenton, Penpot, Stitch, Figma, Design-Engine.",
|
||||||
"version": "1.0.0",
|
"version": "2.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
"url": "https://descomplicar.pt"
|
"url": "https://descomplicar.pt"
|
||||||
},
|
},
|
||||||
"homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins",
|
"homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"keywords": ["design", "ui-ux", "video", "remotion", "powerpoint", "criatividade"]
|
"keywords": ["design", "ui-ux", "video", "remotion", "powerpoint", "criatividade", "presenton", "penpot", "stitch", "figma", "brand", "infografico", "social-media", "logo"]
|
||||||
}
|
}
|
||||||
|
|||||||
83
design-media/agents/design-critic.md
Normal file
83
design-media/agents/design-critic.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
name: design-critic
|
||||||
|
description: >
|
||||||
|
Avalia qualidade de outputs de design em 5 dimensoes (0-10). Re-itera se score < 7. Garante qualidade profissional antes de entregar.
|
||||||
|
Use for design quality assessment, brand compliance verification, visual quality review,
|
||||||
|
or when evaluating generated designs before presenting to client.
|
||||||
|
author: Descomplicar Crescimento Digital
|
||||||
|
version: 2.0.0
|
||||||
|
category: design
|
||||||
|
model: sonnet
|
||||||
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
primary_mcps:
|
||||||
|
- design-engine
|
||||||
|
recommended_mcps:
|
||||||
|
- stitch
|
||||||
|
- design-systems
|
||||||
|
allowed-mcps: desk-crm-v3
|
||||||
|
skills:
|
||||||
|
- _core
|
||||||
|
- ui-ux-pro-max
|
||||||
|
desk_task: 1518
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design Critic - Avaliacao de Qualidade
|
||||||
|
|
||||||
|
Avalia outputs de design em 5 dimensoes e decide se aprovar ou re-iterar.
|
||||||
|
|
||||||
|
## Responsabilidades
|
||||||
|
- Avaliar cada output gerado em 5 dimensoes (0-10)
|
||||||
|
- Identificar problemas especificos e sugerir correccoes
|
||||||
|
- Re-iterar com generator se score insuficiente (max 3 iteracoes)
|
||||||
|
- Aprovar outputs com score >= 7/10 em todas as dimensoes
|
||||||
|
- Rankear variacoes e recomendar melhor opcao
|
||||||
|
|
||||||
|
## 5 Dimensoes de Avaliacao
|
||||||
|
|
||||||
|
| Dimensao | Peso | O que avalia |
|
||||||
|
|---|---|---|
|
||||||
|
| **Fidelidade ao pedido** | 25% | Corresponde ao que foi pedido? Conteudo correcto? |
|
||||||
|
| **Concisao visual** | 20% | Informacao clara sem ruido? Hierarquia visual? |
|
||||||
|
| **Legibilidade** | 20% | Texto legivel? Contraste adequado? Tamanho adequado? |
|
||||||
|
| **Profissionalismo** | 20% | Aspecto profissional? Alinhamentos? Espacamento? |
|
||||||
|
| **Brand compliance** | 15% | Cores da marca? Fontes correctas? Logo presente? |
|
||||||
|
|
||||||
|
## Score System
|
||||||
|
|
||||||
|
```
|
||||||
|
Score = (fidelidade * 0.25) + (concisao * 0.20) + (legibilidade * 0.20) +
|
||||||
|
(profissionalismo * 0.20) + (brand * 0.15)
|
||||||
|
|
||||||
|
Score >= 7.0 -> APROVAR (apresentar ao utilizador)
|
||||||
|
Score 5.0-6.9 -> RE-ITERAR (feedback especifico ao generator)
|
||||||
|
Score < 5.0 -> REJEITAR (novo prompt ao architect)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Formato de Avaliacao
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"output_id": "design-123",
|
||||||
|
"scores": {
|
||||||
|
"fidelidade": 8,
|
||||||
|
"concisao": 7,
|
||||||
|
"legibilidade": 9,
|
||||||
|
"profissionalismo": 7,
|
||||||
|
"brand_compliance": 8
|
||||||
|
},
|
||||||
|
"weighted_score": 7.75,
|
||||||
|
"verdict": "APROVAR",
|
||||||
|
"feedback": "Bom equilibrio visual. Logo bem posicionado.",
|
||||||
|
"issues": [],
|
||||||
|
"suggestions": ["Aumentar contraste no subtitulo"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
1. **Objectividade** - avaliar com criterios concretos, nao preferencias
|
||||||
|
2. **Max 3 iteracoes** - se apos 3 rondas score < 7, entregar melhor versao com nota
|
||||||
|
3. **Feedback actionable** - "aumentar contraste" nao "melhorar cores"
|
||||||
|
4. **Brand e critico** - se marca fornecida, brand compliance pesa mais
|
||||||
|
5. **Sem brand** - ignorar dimensao brand_compliance (peso redistribuido)
|
||||||
96
design-media/agents/design-generator.md
Normal file
96
design-media/agents/design-generator.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
---
|
||||||
|
name: design-generator
|
||||||
|
description: >
|
||||||
|
Executa geracao de design via MCPs. Gera imagens (Fibo/Gemini), compoe layouts (Penpot), cria apresentacoes (Presenton) e web pages (Stitch).
|
||||||
|
Use for image generation, layout composition, presentation creation, export to PNG/SVG/PDF/PPTX,
|
||||||
|
or when executing design prompts from the prompt architect.
|
||||||
|
author: Descomplicar Crescimento Digital
|
||||||
|
version: 2.0.0
|
||||||
|
category: design
|
||||||
|
model: sonnet
|
||||||
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
primary_mcps:
|
||||||
|
- design-engine
|
||||||
|
- presenton
|
||||||
|
- penpot
|
||||||
|
- stitch
|
||||||
|
recommended_mcps:
|
||||||
|
- pixabay
|
||||||
|
- pexels
|
||||||
|
allowed-mcps: desk-crm-v3
|
||||||
|
skills:
|
||||||
|
- _core
|
||||||
|
- pptx-generator
|
||||||
|
- remotion-video
|
||||||
|
desk_task: 1518
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design Generator - Execucao
|
||||||
|
|
||||||
|
Executa prompts e planos de design, gerando outputs concretos via MCPs.
|
||||||
|
|
||||||
|
## Responsabilidades
|
||||||
|
- Executar prompts de imagem via design-engine (Fibo/Gemini)
|
||||||
|
- Compor layouts no Penpot (frames, texto, imagens, brand)
|
||||||
|
- Gerar apresentacoes no Presenton (prompt ou JSON)
|
||||||
|
- Criar web pages via Stitch
|
||||||
|
- Gerar 3-5 variacoes por pedido
|
||||||
|
- Exportar para formato final (PNG/SVG/PDF/PPTX/HTML)
|
||||||
|
- Organizar outputs em `outputs/design-[timestamp]/`
|
||||||
|
|
||||||
|
## Pipelines de Execucao
|
||||||
|
|
||||||
|
### Pipeline Presenton (apresentacoes)
|
||||||
|
```
|
||||||
|
1. generate_presentation(content, tone, template, language)
|
||||||
|
OU generate_from_json(slides)
|
||||||
|
2. Aguardar processamento (async)
|
||||||
|
3. export_presentation(id, format="pptx")
|
||||||
|
4. Guardar PPTX em outputs/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pipeline Penpot (composicao visual)
|
||||||
|
```
|
||||||
|
1. Criar projecto/frame com dimensoes correctas
|
||||||
|
2. Adicionar elementos: texto (brand fonts), shapes, imagens
|
||||||
|
3. Posicionar elementos conforme layout plan
|
||||||
|
4. Aplicar cores da marca
|
||||||
|
5. export_object(frame_id, format="png")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pipeline Stitch (web design)
|
||||||
|
```
|
||||||
|
1. Gerar screen com prompt optimizado
|
||||||
|
2. Extrair Design DNA se marca fornecida
|
||||||
|
3. Iterar com feedback (stitch-loop)
|
||||||
|
4. Exportar HTML/CSS/Astro
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pipeline Imagens AI
|
||||||
|
```
|
||||||
|
1. generate_image_fibo(prompt, aspect_ratio)
|
||||||
|
OU generate_image_gemini(prompt, size)
|
||||||
|
2. SE necessario: remove_background(image_path)
|
||||||
|
3. Guardar em outputs/
|
||||||
|
4. Gerar 3-5 variacoes com prompts variados
|
||||||
|
```
|
||||||
|
|
||||||
|
## Dimensoes Social Media
|
||||||
|
|
||||||
|
| Formato | Dimensoes | Aspecto |
|
||||||
|
|---|---|---|
|
||||||
|
| Instagram Post | 1080x1080 | 1:1 |
|
||||||
|
| Instagram Story | 1080x1920 | 9:16 |
|
||||||
|
| LinkedIn Post | 1200x628 | ~2:1 |
|
||||||
|
| YouTube Thumbnail | 1280x720 | 16:9 |
|
||||||
|
| OG Image | 1200x630 | ~2:1 |
|
||||||
|
| Facebook Cover | 820x312 | ~3:1 |
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
1. **3-5 variacoes** - nunca entregar opcao unica
|
||||||
|
2. **Outputs organizados** - pasta `outputs/design-[timestamp]/` com README
|
||||||
|
3. **Brand aplicada** - cores, fontes e logo em todos os outputs
|
||||||
|
4. **Formatos correctos** - social media com dimensoes exactas
|
||||||
|
5. **Fallback** - se motor principal falhar, usar alternativa (ex: python-pptx)
|
||||||
81
design-media/agents/design-lead.md
Normal file
81
design-media/agents/design-lead.md
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
---
|
||||||
|
name: design-lead
|
||||||
|
description: >
|
||||||
|
Orquestrador de design profissional multi-marca. Recebe pedidos, carrega brand pack, delega a agentes especializados e apresenta resultados.
|
||||||
|
Use for design orchestration, brand-aware design, multi-format output,
|
||||||
|
or when user mentions "design", "criar design", "apresentacao", "infografico", "logo", "identidade visual", "brand", "/design".
|
||||||
|
author: Descomplicar Crescimento Digital
|
||||||
|
version: 2.0.0
|
||||||
|
category: design
|
||||||
|
model: sonnet
|
||||||
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
primary_mcps:
|
||||||
|
- design-engine
|
||||||
|
- presenton
|
||||||
|
- penpot
|
||||||
|
- stitch
|
||||||
|
recommended_mcps:
|
||||||
|
- figma
|
||||||
|
- pixabay
|
||||||
|
- pexels
|
||||||
|
allowed-mcps: desk-crm-v3, google-workspace, powerpoint
|
||||||
|
skills:
|
||||||
|
- _core
|
||||||
|
- design
|
||||||
|
- ui-ux-pro-max
|
||||||
|
- pptx-generator
|
||||||
|
desk_task: 1518
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design Lead - Orquestrador de Design
|
||||||
|
|
||||||
|
Agente orquestrador do motor de design profissional. Nunca gera outputs directamente - delega a agentes especializados e coordena o pipeline completo.
|
||||||
|
|
||||||
|
## Responsabilidades
|
||||||
|
- Receber e interpretar pedidos de design
|
||||||
|
- Carregar brand pack do cliente via `brand_load`
|
||||||
|
- Fazer perguntas de clarificacao quando necessario
|
||||||
|
- Delegar a agentes especializados (researcher, prompt-architect, generator, critic)
|
||||||
|
- Apresentar resultados finais rankados por qualidade
|
||||||
|
- Garantir brand compliance em todos os outputs
|
||||||
|
|
||||||
|
## Pipeline de Design
|
||||||
|
|
||||||
|
```
|
||||||
|
1. RECEBER pedido do utilizador
|
||||||
|
2. IDENTIFICAR tipo de output (apresentacao, infografico, social, web, logo, brand)
|
||||||
|
3. CARREGAR brand pack (se --brand especificado)
|
||||||
|
4. SE referencia visual -> DELEGAR a design-researcher
|
||||||
|
5. DELEGAR a design-prompt-architect (routing motor + prompts)
|
||||||
|
6. DELEGAR a design-generator (execucao)
|
||||||
|
7. DELEGAR a design-critic (avaliacao)
|
||||||
|
8. SE score < 7 -> re-iterar (max 3x)
|
||||||
|
9. APRESENTAR resultados ao utilizador
|
||||||
|
```
|
||||||
|
|
||||||
|
## Routing de Motores
|
||||||
|
|
||||||
|
| Tipo | Motor principal | Fallback |
|
||||||
|
|---|---|---|
|
||||||
|
| Apresentacao, slides, proposta | Presenton (slide.descomplicar.pt) | python-pptx |
|
||||||
|
| Infografico, poster, flyer | Penpot (pen.descomplicar.pt) + AI | HTML via chrome |
|
||||||
|
| Social media (IG, LinkedIn, YT) | Penpot (dimensoes correctas) | Stitch |
|
||||||
|
| Landing page, web page, UI | Stitch (Google) | HTML manual |
|
||||||
|
| Logo, icone, marca | Penpot + Fibo | SVG manual |
|
||||||
|
| Identidade visual completa | Todos | - |
|
||||||
|
| Referencia visual (URL/Figma) | Figma MCP + screenshots | - |
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
1. **Nunca gerar directamente** - sempre delegar a agentes especializados
|
||||||
|
2. **Sempre carregar brand** quando disponivel
|
||||||
|
3. **Perguntar antes de assumir** - tipo, estilo, publico-alvo, dimensoes
|
||||||
|
4. **3-5 variacoes** - nunca entregar opcao unica
|
||||||
|
5. **Score minimo 7/10** antes de apresentar ao utilizador
|
||||||
|
|
||||||
|
## Colaboracao
|
||||||
|
|
||||||
|
- Reports to: Emanuel (utilizador)
|
||||||
|
- Delega a: design-researcher, design-prompt-architect, design-generator, design-critic
|
||||||
|
- Colabora com: ui-designer, web-designer (agentes existentes)
|
||||||
108
design-media/agents/design-prompt-architect.md
Normal file
108
design-media/agents/design-prompt-architect.md
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
name: design-prompt-architect
|
||||||
|
description: >
|
||||||
|
Arquitecto de prompts e routing de motores de design. Recebe style brief + brand pack, escolhe motor (Presenton/Penpot/Stitch) e cria prompts optimizados.
|
||||||
|
Use for design prompt creation, engine routing, presentation structure, layout planning,
|
||||||
|
or when translating design requirements into executable prompts.
|
||||||
|
author: Descomplicar Crescimento Digital
|
||||||
|
version: 2.0.0
|
||||||
|
category: design
|
||||||
|
model: sonnet
|
||||||
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
primary_mcps:
|
||||||
|
- design-engine
|
||||||
|
- presenton
|
||||||
|
- penpot
|
||||||
|
- stitch
|
||||||
|
recommended_mcps:
|
||||||
|
- figma
|
||||||
|
allowed-mcps: desk-crm-v3
|
||||||
|
skills:
|
||||||
|
- _core
|
||||||
|
- ui-ux-pro-max
|
||||||
|
- pptx-generator
|
||||||
|
desk_task: 1518
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design Prompt Architect - Routing e Prompts
|
||||||
|
|
||||||
|
Recebe style brief e brand pack, escolhe o motor de design correcto e cria prompts optimizados para cada pipeline.
|
||||||
|
|
||||||
|
## Responsabilidades
|
||||||
|
- Analisar tipo de output pedido
|
||||||
|
- Escolher motor(es) de design adequados
|
||||||
|
- Criar prompts optimizados para cada motor
|
||||||
|
- Aplicar constrains da marca nos prompts
|
||||||
|
- Estruturar slides JSON para Presenton
|
||||||
|
- Planear layouts para Penpot
|
||||||
|
|
||||||
|
## Routing por Motor
|
||||||
|
|
||||||
|
### Presenton (apresentacoes)
|
||||||
|
```
|
||||||
|
Input: tema, tone, n_slides, brand
|
||||||
|
Output: prompt narrativo OU slides JSON estruturado
|
||||||
|
Parametros: tone=professional|casual|sales_pitch|educational
|
||||||
|
```
|
||||||
|
|
||||||
|
### Penpot (composicao visual)
|
||||||
|
```
|
||||||
|
Input: tipo, dimensoes, brand, elementos
|
||||||
|
Output: plano de layout (frames, posicoes, elementos)
|
||||||
|
Pipeline: criar frame -> adicionar elementos -> aplicar brand -> exportar
|
||||||
|
```
|
||||||
|
|
||||||
|
### Stitch (web design)
|
||||||
|
```
|
||||||
|
Input: descricao pagina, estilo, brand
|
||||||
|
Output: prompt optimizado Stitch com Design DNA
|
||||||
|
Pipeline: gerar screen -> iterar -> exportar HTML/CSS
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fibo/Gemini (imagens AI)
|
||||||
|
```
|
||||||
|
Input: descricao imagem, estilo, aspect_ratio
|
||||||
|
Output Fibo: prompt JSON estruturado (composicao precisa)
|
||||||
|
Output Gemini: prompt narrativo (bom para texto em imagens)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Formato Prompt por Motor
|
||||||
|
|
||||||
|
### Presenton - Prompt Narrativo
|
||||||
|
```
|
||||||
|
"Apresentacao profissional sobre [tema].
|
||||||
|
Tom: [tone]. [n_slides] slides.
|
||||||
|
Cores da marca: [primary] e [secondary].
|
||||||
|
Incluir: introducao, problema, solucao, beneficios, CTA.
|
||||||
|
Idioma: Portugues europeu."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Presenton - JSON Estruturado
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{"title": "Titulo", "content": "Bullets", "layout": "title_slide", "notes": ""},
|
||||||
|
{"title": "Contexto", "content": "Dados", "layout": "two_column", "notes": ""}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fibo - Prompt JSON
|
||||||
|
```
|
||||||
|
"Professional infographic about [tema], clean design,
|
||||||
|
[primary_color] and [secondary_color] color scheme,
|
||||||
|
[aspect_ratio], high quality, corporate style"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Gemini - Prompt Narrativo
|
||||||
|
```
|
||||||
|
"Create a [tipo] with the text '[texto]' prominently displayed.
|
||||||
|
Style: modern, professional. Colors: [primary] on [background].
|
||||||
|
Font style: bold sans-serif. High resolution."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
1. **Brand always first** - cores, fontes e logo da marca em todos os prompts
|
||||||
|
2. **Motor adequado** - nao usar Gemini para layouts, nao usar Penpot para texto AI
|
||||||
|
3. **Dimensoes exactas** - sempre especificar para social media
|
||||||
|
4. **Fallback plan** - sempre ter alternativa se motor principal falhar
|
||||||
78
design-media/agents/design-researcher.md
Normal file
78
design-media/agents/design-researcher.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
name: design-researcher
|
||||||
|
description: >
|
||||||
|
Analisa referencias visuais via Figma MCP, Stitch DNA, screenshots e UIUX Pro Max. Extrai paletas, tipografia, composicao e mood.
|
||||||
|
Use for visual reference analysis, design DNA extraction, style analysis, competitive design research,
|
||||||
|
or when user provides Figma links, design URLs, or visual references.
|
||||||
|
author: Descomplicar Crescimento Digital
|
||||||
|
version: 2.0.0
|
||||||
|
category: design
|
||||||
|
model: sonnet
|
||||||
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
primary_mcps:
|
||||||
|
- figma
|
||||||
|
- stitch
|
||||||
|
recommended_mcps:
|
||||||
|
- design-engine
|
||||||
|
- pixabay
|
||||||
|
- pexels
|
||||||
|
allowed-mcps: desk-crm-v3, design-systems
|
||||||
|
skills:
|
||||||
|
- _core
|
||||||
|
- ui-ux-pro-max
|
||||||
|
desk_task: 1518
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design Researcher - Investigador Visual
|
||||||
|
|
||||||
|
Analisa referencias visuais de qualquer fonte e produz style briefs estruturados para alimentar o pipeline de design.
|
||||||
|
|
||||||
|
## Responsabilidades
|
||||||
|
- Analisar URLs de referencia (via claude-in-chrome screenshots)
|
||||||
|
- Analisar Figma links (via Figma MCP read-only: extrair estilos, componentes, tokens)
|
||||||
|
- Extrair Design DNA via Stitch MCP
|
||||||
|
- Consultar UIUX Pro Max para estilos/paletas profissionais
|
||||||
|
- Produzir style brief JSON estruturado
|
||||||
|
|
||||||
|
## Fontes de Analise
|
||||||
|
|
||||||
|
| Fonte | Ferramenta | O que extrai |
|
||||||
|
|---|---|---|
|
||||||
|
| URL website | claude-in-chrome (screenshots) | Layout, cores, tipografia, mood |
|
||||||
|
| Figma link | Figma MCP (read-only) | Estilos, componentes, tokens, spacing |
|
||||||
|
| Design existente | Stitch DNA extraction | Fonts, cores, layouts, componentes |
|
||||||
|
| Estilo abstracto | UIUX Pro Max skill | 57 estilos, 95 paletas, 57 font pairings |
|
||||||
|
|
||||||
|
## Output: Style Brief JSON
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mood": "profissional, moderno, clean",
|
||||||
|
"colors": {
|
||||||
|
"primary": "#HEX",
|
||||||
|
"secondary": "#HEX",
|
||||||
|
"accent": "#HEX",
|
||||||
|
"background": "#HEX"
|
||||||
|
},
|
||||||
|
"typography": {
|
||||||
|
"heading": "Font Name",
|
||||||
|
"body": "Font Name",
|
||||||
|
"style": "sans-serif/serif/mixed"
|
||||||
|
},
|
||||||
|
"composition": {
|
||||||
|
"layout": "grid/asymmetric/centered",
|
||||||
|
"whitespace": "generous/moderate/compact",
|
||||||
|
"hierarchy": "strong/moderate/flat"
|
||||||
|
},
|
||||||
|
"references": ["url1", "url2"],
|
||||||
|
"constraints": ["dimensoes", "formato", "marca"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
1. **Nunca copiar** - inspirar e adaptar, nunca replicar
|
||||||
|
2. **Objectivo sobre subjectivo** - cores HEX, nao "azulado"
|
||||||
|
3. **Sempre incluir constraints** - dimensoes, formato, marca
|
||||||
|
4. **Multiplas referencias** quando possivel - cruzar padroes
|
||||||
@@ -9,6 +9,16 @@ version: 2.0.0
|
|||||||
category: design
|
category: design
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- design-systems
|
||||||
|
recommended_mcps:
|
||||||
|
- stitch
|
||||||
|
- magic
|
||||||
|
- pixabay
|
||||||
|
- pexels
|
||||||
allowed-mcps: google-workspace, penpot, powerpoint, design-systems, pixabay, pexels
|
allowed-mcps: google-workspace, penpot, powerpoint, design-systems, pixabay, pexels
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
@@ -29,11 +39,14 @@ Designer de interfaces especializado em criar designs visuais apelativos e funci
|
|||||||
- Garantir consistencia visual e acessibilidade (WCAG) em todas as plataformas
|
- Garantir consistencia visual e acessibilidade (WCAG) em todas as plataformas
|
||||||
- Colaborar com developers no handoff e implementacao de designs
|
- Colaborar com developers no handoff e implementacao de designs
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"interface design sistemas componentes"
|
mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"interface design sistemas componentes"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de WebSites" query:"design responsivo layouts"
|
mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"design responsivo layouts"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Canva" query:"visual design tipografia cores"
|
mcp__notebooklm__notebook_query notebook_id:"9053d0e8-dd39-460b-b5ea-e67af3e9a675" query:"visual design tipografia cores"
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -93,11 +106,6 @@ Designer de interfaces responsavel por criar designs visuais apelativos, manter
|
|||||||
- **Consistency**: Mesmos patterns = menos cognitive load
|
- **Consistency**: Mesmos patterns = menos cognitive load
|
||||||
- **Feedback**: Sistema responde a accoes (loaders, confirmacoes)
|
- **Feedback**: Sistema responde a accoes (loaders, confirmacoes)
|
||||||
- **Simplicity**: Remover tudo que nao adiciona valor
|
- **Simplicity**: Remover tudo que nao adiciona valor
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
|
||||||
```
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"interface design componentes acessibilidade"
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Canva" query:"design visual tipografia cores"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -123,13 +131,11 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Canva" query:"design visual tip
|
|||||||
- **elevenlabs** - Text-to-speech, voice cloning, audio transcription
|
- **elevenlabs** - Text-to-speech, voice cloning, audio transcription
|
||||||
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, imap, outline-api, youtube-research, youtube-uploader, dify-kb, wikijs, gsc, lighthouse, mcp-time, memory-supabase, puppeteer, tavily, replicate
|
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, imap, outline-api, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, memory-supabase, puppeteer, tavily, replicate
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -154,13 +160,11 @@ desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **11 SDKs** (TaskForce teams):
|
You are part of **11 SDKs** (TaskForce teams):
|
||||||
@@ -174,9 +178,6 @@ You are part of **11 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce E-commerce
|
### TaskForce E-commerce
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ created: '2025-01-13'
|
|||||||
updated: '2026-02-04'
|
updated: '2026-02-04'
|
||||||
author: Descomplicar®
|
author: Descomplicar®
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# Video Production Specialist Descomplicar
|
# Video Production Specialist Descomplicar
|
||||||
|
|
||||||
Especialista em criacao de videos programaticos usando Remotion e React para produzir intros, promos, social media content e tutoriais animados escaláveis.
|
Especialista em criacao de videos programaticos usando Remotion e React para produzir intros, promos, social media content e tutoriais animados escaláveis.
|
||||||
@@ -101,10 +99,13 @@ Produtor de video responsavel por criar videos animados programaticamente com Re
|
|||||||
| LinkedIn | 1200x1200 | 1:1 | 30 |
|
| LinkedIn | 1200x1200 | 1:1 | 30 |
|
||||||
| TikTok | 1080x1920 | 9:16 | 30 |
|
| TikTok | 1080x1920 | 9:16 | 30 |
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"video conteudo visual"
|
mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"video conteudo visual"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"animacao storytelling"
|
mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"animacao storytelling"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -126,13 +127,11 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"animacao s
|
|||||||
- **outline-api** - Outline documentation
|
- **outline-api** - Outline documentation
|
||||||
- **replicate** - AI models - imagem, vídeo, áudio, LLMs
|
- **replicate** - AI models - imagem, vídeo, áudio, LLMs
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, imap, dify-kb, wikijs, gsc, lighthouse, mcp-time, memory-supabase, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, magic, design-systems
|
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, imap, wikijs, gsc, lighthouse, mcp-time, memory-supabase, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, tavily, magic, design-systems
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -158,7 +157,7 @@ desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /ui-ux-pro-max-repo, /brand-voice-generator, /frontend-design, /pptx-generator, /ui-ux-pro-max, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
|
|||||||
@@ -9,6 +9,16 @@ version: 2.0.0
|
|||||||
category: design
|
category: design
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- design-systems
|
||||||
|
recommended_mcps:
|
||||||
|
- stitch
|
||||||
|
- lighthouse
|
||||||
|
- magic
|
||||||
|
- pexels
|
||||||
allowed-mcps: google-workspace, penpot, powerpoint, lighthouse, gsc, design-systems, pixabay, pexels
|
allowed-mcps: google-workspace, penpot, powerpoint, lighthouse, gsc, design-systems, pixabay, pexels
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
@@ -29,12 +39,13 @@ Designer web especializado em criar websites visualmente impactantes e funcionai
|
|||||||
- Optimizar designs para performance web e Core Web Vitals
|
- Optimizar designs para performance web e Core Web Vitals
|
||||||
- Garantir compatibilidade cross-browser e acessibilidade
|
- Garantir compatibilidade cross-browser e acessibilidade
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de WebSites" query:"layouts design web responsivo"
|
mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"layouts design web responsivo"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"themes templates design"
|
mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"conversao usabilidade navegacao"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Elementor" query:"page builder design visual"
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"conversao usabilidade navegacao"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -97,12 +108,6 @@ Designer web responsavel por criar layouts visualmente impactantes e funcionais,
|
|||||||
- **White space**: Dar espaco para respirar, nao sobrecarregar
|
- **White space**: Dar espaco para respirar, nao sobrecarregar
|
||||||
- **Hierarchy**: Tamanhos, cores, contraste para guiar olho
|
- **Hierarchy**: Tamanhos, cores, contraste para guiar olho
|
||||||
- **Responsiveness**: Breakpoints logicos (mobile, tablet, desktop)
|
- **Responsiveness**: Breakpoints logicos (mobile, tablet, desktop)
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
|
||||||
```
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de WebSites" query:"layouts design responsivo conversao"
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"temas templates design"
|
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"navegacao usabilidade heuristicas"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -128,13 +133,11 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"navega
|
|||||||
- **elevenlabs** - Text-to-speech, voice cloning, audio transcription
|
- **elevenlabs** - Text-to-speech, voice cloning, audio transcription
|
||||||
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, imap, outline-api, youtube-research, youtube-uploader, dify-kb, wikijs, gsc, lighthouse, mcp-time, memory-supabase, puppeteer, tavily, replicate
|
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, imap, outline-api, youtube-research, youtube-uploader, wikijs, gsc, lighthouse, mcp-time, memory-supabase, puppeteer, tavily, replicate
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -159,13 +162,11 @@ desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### All Available (53 total)
|
||||||
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
/billing-check, /crm-ops, /ecommerce, /lead-approach, /orcamento, /saas, /content-marketing-pt, /seo-content-optimization, /social-media, /ui-ux-pro-max-repo, /crm-admin, /db-design, /elementor, /mcp-dev, /nextjs, /php-dev, /react-patterns, /woocommerce, /wp-dev, /backup-strategies, /security-audit, /server-health, /wp-performance, /wp-update, /second-brain-repo, /ads, /doc-sync, /marketing-strategy, /product, /skill-creator, /sop-creator, /calendar-manager, /delegate, /interview, /time, /today, /research, /youtube, /seo-audit, /seo-report, /archive, /metrics, /sdk
|
||||||
|
|
||||||
**Discovery:** Use the Skill tool to invoke skills.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **7 SDKs** (TaskForce teams):
|
You are part of **7 SDKs** (TaskForce teams):
|
||||||
@@ -175,9 +176,6 @@ You are part of **7 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce E-commerce
|
### TaskForce E-commerce
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -1,9 +1,56 @@
|
|||||||
{
|
{
|
||||||
"description": "Dify KB datasets for Design and Media domain",
|
"description": "Knowledge sources for Design and Media domain",
|
||||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
"sources": {
|
||||||
"datasets": [
|
"notebooklm": {
|
||||||
{"id": "7efc5db4-05b1-408a-9e41-b612188ee877", "name": "Canva", "priority": 1, "document_count": 24, "word_count": 148976},
|
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||||
{"id": "e14ab89e-8910-43b6-becf-d57c78afd62d", "name": "UX e Usabilidade", "priority": 1, "document_count": 4, "word_count": 413593},
|
"query_tool": "mcp__notebooklm__notebook_query",
|
||||||
{"id": "39818f77-8c70-4729-9b5c-6f92d3a2b418", "name": "Criatividade", "priority": 2, "document_count": 9, "word_count": 262795}
|
"notebooks": [
|
||||||
]
|
{
|
||||||
|
"id": "9053d0e8-dd39-460b-b5ea-e67af3e9a675",
|
||||||
|
"title": "Social Media e Branding",
|
||||||
|
"topics": [
|
||||||
|
"canva"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "081ca512-8279-4850-b2b9-dff090267482",
|
||||||
|
"title": "UI/UX Design",
|
||||||
|
"topics": [
|
||||||
|
"usabilidade"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pending": [
|
||||||
|
{
|
||||||
|
"title": "Manual Normas Graficas Descomplicar 2023",
|
||||||
|
"source": "PDF 64.5MB - Hub/02-Descomplicar/Design/Identidade/Manual_Descomplicar_2023.pdf",
|
||||||
|
"status": "pendente - upload manual necessario"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Brand Strategy (Brand Master Academy)",
|
||||||
|
"source": "11 podcasts - Hub/04-Recursos/Knowledge-Base/MDs/YouTube/Brand_Master_Academy/",
|
||||||
|
"status": "pendente - criar notebook + upload"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"brand_packs": {
|
||||||
|
"description": "Brand packs JSON para identidade visual por cliente",
|
||||||
|
"path": "/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/",
|
||||||
|
"brands": [
|
||||||
|
{
|
||||||
|
"slug": "descomplicar",
|
||||||
|
"name": "Descomplicar - Consultoria e Desenvolvimento",
|
||||||
|
"colors": {
|
||||||
|
"primary": "#dd7500",
|
||||||
|
"secondary": "#cc8d00",
|
||||||
|
"accent": "#f2d9a2"
|
||||||
|
},
|
||||||
|
"fonts": {
|
||||||
|
"heading": "Nexa",
|
||||||
|
"body": "Roboto"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
318
design-media/skills/brand-guidelines/SKILL.md
Normal file
318
design-media/skills/brand-guidelines/SKILL.md
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
---
|
||||||
|
name: brand-guidelines
|
||||||
|
description: Guia de identidade visual Descomplicar® — cores, tipografia, logotipo, tom de comunicacao e aplicacao por contexto (slides, docs, web, emails). Usar quando "brand descomplicar", "marca descomplicar", "cores descomplicar", "identidade visual", "branding", "paleta de cores", "guia de marca", ou qualquer material que necessite conformidade visual com a marca.
|
||||||
|
---
|
||||||
|
|
||||||
|
# /brand-guidelines - Identidade Visual Descomplicar®
|
||||||
|
|
||||||
|
Referencia normativa da marca Descomplicar®. Aplicar em todos os materiais de comunicacao,
|
||||||
|
design e desenvolvimento.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Identidade da Marca
|
||||||
|
|
||||||
|
**Nome oficial:** Descomplicar®
|
||||||
|
**Slogan:** Crescimento Digital
|
||||||
|
**Website:** descomplicar.pt
|
||||||
|
**Tom:** Profissional mas acessivel, tecnologico sem ser frio
|
||||||
|
**Valores:** Simplicidade, transparencia, resultados mensuraveis
|
||||||
|
|
||||||
|
> A marca registada (®) e obrigatoria na primeira ocorrencia em qualquer documento ou comunicacao.
|
||||||
|
> Nas ocorrencias seguintes, pode usar-se apenas "Descomplicar".
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paleta de Cores Principal
|
||||||
|
|
||||||
|
| Nome | Hex | RGB | Uso |
|
||||||
|
|------|-----|-----|-----|
|
||||||
|
| Azul Escuro | `#1a365d` | 26, 54, 93 | Texto principal, fundos escuros, cabecalhos |
|
||||||
|
| Azul Medio | `#2b6cb0` | 43, 108, 176 | Links, acentos, botoes secundarios |
|
||||||
|
| Laranja | `#dd6b20` | 221, 107, 32 | CTA, destaques, elementos de accao |
|
||||||
|
| Branco | `#ffffff` | 255, 255, 255 | Fundos claros, texto sobre escuro |
|
||||||
|
| Cinza Claro | `#f7fafc` | 247, 250, 252 | Fundos secundarios, secoes alternadas |
|
||||||
|
| Cinza Texto | `#4a5568` | 74, 85, 104 | Texto de corpo, descricoes |
|
||||||
|
|
||||||
|
Paleta completa com variacoes de contexto: `references/color-palettes.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CSS Variables (Web)
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
/* Cores principais */
|
||||||
|
--color-primary: #1a365d;
|
||||||
|
--color-secondary: #2b6cb0;
|
||||||
|
--color-accent: #dd6b20;
|
||||||
|
|
||||||
|
/* Neutros */
|
||||||
|
--color-white: #ffffff;
|
||||||
|
--color-bg-light: #f7fafc;
|
||||||
|
--color-text-body: #4a5568;
|
||||||
|
--color-text-heading: #1a365d;
|
||||||
|
|
||||||
|
/* Estados */
|
||||||
|
--color-primary-hover: #2a4a7f;
|
||||||
|
--color-secondary-hover: #2c5282;
|
||||||
|
--color-accent-hover: #c05621;
|
||||||
|
|
||||||
|
/* Bordas e divisores */
|
||||||
|
--color-border: #e2e8f0;
|
||||||
|
--color-border-light: #edf2f7;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipografia
|
||||||
|
|
||||||
|
### Hierarquia
|
||||||
|
|
||||||
|
| Elemento | Familia | Peso | Tamanho base |
|
||||||
|
|----------|---------|------|--------------|
|
||||||
|
| H1 / Titulo principal | Montserrat | Extra Bold (800) | 48px / 3rem |
|
||||||
|
| H2 / Titulo secao | Montserrat | Bold (700) | 36px / 2.25rem |
|
||||||
|
| H3 / Subtitulo | Montserrat | Semi Bold (600) | 24px / 1.5rem |
|
||||||
|
| H4 / Label | Montserrat | Semi Bold (600) | 18px / 1.125rem |
|
||||||
|
| Corpo / Paragrafo | Open Sans | Regular (400) | 16px / 1rem |
|
||||||
|
| Destaque / Lead | Open Sans | Semi Bold (600) | 18px / 1.125rem |
|
||||||
|
| Legenda / Caption | Open Sans | Regular (400) | 14px / 0.875rem |
|
||||||
|
| Codigo | JetBrains Mono | Regular (400) | 14px / 0.875rem |
|
||||||
|
|
||||||
|
### CSS Tipografia
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
--font-heading: 'Montserrat', 'Arial Black', sans-serif;
|
||||||
|
--font-body: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
--font-code: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace;
|
||||||
|
|
||||||
|
--line-height-heading: 1.2;
|
||||||
|
--line-height-body: 1.6;
|
||||||
|
--letter-spacing-heading: -0.025em;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fallbacks de Sistema
|
||||||
|
|
||||||
|
- **Montserrat** indisponivel: `'Arial Black', 'Impact', sans-serif`
|
||||||
|
- **Open Sans** indisponivel: `'Helvetica Neue', Arial, sans-serif`
|
||||||
|
- **JetBrains Mono** indisponivel: `'Fira Code', 'Courier New', monospace`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Logótipo
|
||||||
|
|
||||||
|
### Regras de Uso
|
||||||
|
|
||||||
|
| Regra | Descricao |
|
||||||
|
|-------|-----------|
|
||||||
|
| Espaco minimo | Margem de pelo menos 2x a altura da letra "D" em todos os lados |
|
||||||
|
| Tamanho minimo | 120px de largura em digital; 30mm em impressao |
|
||||||
|
| Fundo permitido | Branco `#ffffff`, Azul Escuro `#1a365d`, Cinza Claro `#f7fafc` |
|
||||||
|
| Fundo proibido | Qualquer fundo com baixo contraste, fotografias sem overlay |
|
||||||
|
| Distorcao | Nunca esticar, rodar ou alterar proporcoes |
|
||||||
|
| Cores proibidas | Nunca alterar as cores do logótipo original |
|
||||||
|
| Texto junto | Nunca sobrepor texto ao logótipo |
|
||||||
|
|
||||||
|
### Variantes Disponiveis
|
||||||
|
|
||||||
|
| Variante | Quando usar |
|
||||||
|
|----------|-------------|
|
||||||
|
| Principal (horizontal) | Uso geral, cabecalhos, documentos |
|
||||||
|
| Compacta (icone + nome vertical) | Espacos reduzidos, avatares |
|
||||||
|
| Monocromatica escura | Documentos a preto e branco, impressao simples |
|
||||||
|
| Monocromatica clara | Sobre fundos escuros, rodapes |
|
||||||
|
| Icone isolado | Favicon, app icon, redes sociais (foto de perfil) |
|
||||||
|
|
||||||
|
### Ficheiros Logótipo
|
||||||
|
|
||||||
|
```
|
||||||
|
Hub/04-Recursos/Design/brands/descomplicar/
|
||||||
|
logo-principal.svg
|
||||||
|
logo-compacto.svg
|
||||||
|
logo-mono-escuro.svg
|
||||||
|
logo-mono-claro.svg
|
||||||
|
favicon.png
|
||||||
|
favicon.svg
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aplicacao por Contexto
|
||||||
|
|
||||||
|
### Apresentacoes e Slides
|
||||||
|
|
||||||
|
```
|
||||||
|
Fundo slides: #1a365d (escuro) ou #ffffff (claro)
|
||||||
|
Titulo slide: Montserrat Extra Bold, #ffffff (sobre escuro) / #1a365d (sobre claro)
|
||||||
|
Corpo texto: Open Sans Regular, #ffffff ou #4a5568
|
||||||
|
Destaques/CTA: #dd6b20
|
||||||
|
Divisores: #2b6cb0
|
||||||
|
Slide titulo (capa): fundo #1a365d, logótipo variante clara
|
||||||
|
```
|
||||||
|
|
||||||
|
Modelo: `/design presentation --brand descomplicar`
|
||||||
|
|
||||||
|
### Documentos e Propostas
|
||||||
|
|
||||||
|
```
|
||||||
|
Cabecalho: fundo #1a365d, logótipo clara, texto branco
|
||||||
|
Corpo: fundo #ffffff, texto #4a5568
|
||||||
|
Titulos secao: Montserrat Bold, #1a365d
|
||||||
|
Destaques/callouts: fundo #f7fafc, borda esquerda #dd6b20
|
||||||
|
Links: #2b6cb0, sublinhado no hover
|
||||||
|
Rodape: fundo #f7fafc, texto #4a5568, borda topo #e2e8f0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Web e Landing Pages
|
||||||
|
|
||||||
|
```
|
||||||
|
Hero section: fundo #1a365d ou gradiente #1a365d -> #2b6cb0
|
||||||
|
Botao primario (CTA): fundo #dd6b20, texto #ffffff, hover #c05621
|
||||||
|
Botao secundario: borda #2b6cb0, texto #2b6cb0, hover fundo #2b6cb0 branco
|
||||||
|
Seccao alternada: fundo #f7fafc
|
||||||
|
Cards: fundo #ffffff, sombra suave, borda-topo #2b6cb0 (destaque)
|
||||||
|
Cards destaque: borda-topo ou borda-esquerda #dd6b20
|
||||||
|
```
|
||||||
|
|
||||||
|
### Emails e Newsletter
|
||||||
|
|
||||||
|
```
|
||||||
|
Pre-header: fundo #1a365d, texto #ffffff
|
||||||
|
Corpo email: fundo #ffffff, texto #4a5568
|
||||||
|
Cabecalhos: Montserrat Bold, #1a365d
|
||||||
|
CTA button: fundo #dd6b20, texto #ffffff, border-radius 4px
|
||||||
|
Rodape email: fundo #f7fafc, texto #4a5568 (tamanho reduzido)
|
||||||
|
Links: #2b6cb0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Redes Sociais
|
||||||
|
|
||||||
|
```
|
||||||
|
Fundo posts: #1a365d (principal) ou #ffffff
|
||||||
|
Texto sobre escuro: #ffffff (titulo), #f7fafc (corpo)
|
||||||
|
Texto sobre claro: #1a365d (titulo), #4a5568 (corpo)
|
||||||
|
Elemento de marca (cantos, bandas): #dd6b20 ou #2b6cb0
|
||||||
|
Hashtags/links: #2b6cb0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tom de Comunicacao
|
||||||
|
|
||||||
|
### Principios
|
||||||
|
|
||||||
|
| Principio | Descricao |
|
||||||
|
|-----------|-----------|
|
||||||
|
| Claro e directo | Frases curtas, vocabulario acessivel, sem jargao desnecessario |
|
||||||
|
| Confiante mas humilde | Mostramos resultados, nao promessas vazias |
|
||||||
|
| Tecnico sem ser frio | Tecnologia ao servico das pessoas, nao o contrario |
|
||||||
|
| Orientado a resultados | Sempre ligar accoes a beneficios mensuravelis |
|
||||||
|
| Em portugues correcto | PT-PT sempre, sem brasileirismos, sem calao |
|
||||||
|
|
||||||
|
### Vocabulario da Marca
|
||||||
|
|
||||||
|
| Usar | Evitar |
|
||||||
|
|------|--------|
|
||||||
|
| crescimento digital | growth hacking |
|
||||||
|
| resultados mensuraveis | metricas (sem contexto) |
|
||||||
|
| simplicidade | user-friendly (em textos publicos) |
|
||||||
|
| parceiros / clientes | users / leads (em comunicacao externa) |
|
||||||
|
| solucoes | produtos (quando sao servicos) |
|
||||||
|
| equipa | time (brasileirismo) |
|
||||||
|
|
||||||
|
### Voz por Canal
|
||||||
|
|
||||||
|
- **Website / Propostas:** Formal-acessivel. Nos apresentamos, o cliente decide.
|
||||||
|
- **Redes Sociais:** Mais conversacional, com pergunta ou convite a interaccao.
|
||||||
|
- **Emails:** Directo e pessoal, nome do destinatario sempre que possivel.
|
||||||
|
- **Documentacao tecnica:** Preciso e estruturado, sem ambiguidade.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Iconografia e Imagens
|
||||||
|
|
||||||
|
### Icones
|
||||||
|
|
||||||
|
- **Estilo:** Linear, peso medio (1.5-2px), cantos ligeiramente arredondados
|
||||||
|
- **Bibliotecas recomendadas:** Lucide Icons, Heroicons, Phosphor Icons
|
||||||
|
- **Tamanhos:** 16px, 20px, 24px, 32px (escala 4px)
|
||||||
|
- **Cor:** Herdar da cor de texto do contexto ou usar cor de acento
|
||||||
|
|
||||||
|
### Fotografia
|
||||||
|
|
||||||
|
- **Estilo:** Profissional, luminosa, pessoas reais em contexto de trabalho
|
||||||
|
- **Tratamento:** Sem filtros excessivos; overlay azul escuro (#1a365d, 20-40% opacidade) para texto
|
||||||
|
- **Evitar:** Stock photos genericas, imagens de baixa qualidade, estilos vintage/retro
|
||||||
|
|
||||||
|
### Ilustracoes e Graficos
|
||||||
|
|
||||||
|
- **Estilo:** Flat design com linhas limpas, paleta restrita as cores da marca
|
||||||
|
- **Graficos de dados:** Usar sempre cores da paleta principal, legenda clara
|
||||||
|
- **Infograficos:** Fundo branco ou cinza claro, acentos em laranja para destaques
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Espacamento e Grid
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
/* Espacamento base: multiplos de 4px */
|
||||||
|
--space-1: 4px;
|
||||||
|
--space-2: 8px;
|
||||||
|
--space-3: 12px;
|
||||||
|
--space-4: 16px;
|
||||||
|
--space-6: 24px;
|
||||||
|
--space-8: 32px;
|
||||||
|
--space-12: 48px;
|
||||||
|
--space-16: 64px;
|
||||||
|
--space-24: 96px;
|
||||||
|
|
||||||
|
/* Border radius */
|
||||||
|
--radius-sm: 4px;
|
||||||
|
--radius-md: 8px;
|
||||||
|
--radius-lg: 16px;
|
||||||
|
|
||||||
|
/* Sombras */
|
||||||
|
--shadow-sm: 0 1px 3px rgba(26, 54, 93, 0.1);
|
||||||
|
--shadow-md: 0 4px 12px rgba(26, 54, 93, 0.15);
|
||||||
|
--shadow-lg: 0 8px 24px rgba(26, 54, 93, 0.2);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Acessibilidade
|
||||||
|
|
||||||
|
| Par de cores | Racio contraste | Nivel WCAG |
|
||||||
|
|-------------|-----------------|------------|
|
||||||
|
| Branco sobre Azul Escuro | 12.6:1 | AAA |
|
||||||
|
| Branco sobre Azul Medio | 5.1:1 | AA |
|
||||||
|
| Branco sobre Laranja | 3.1:1 | AA (texto grande) |
|
||||||
|
| Cinza Texto sobre Branco | 7.0:1 | AAA |
|
||||||
|
| Azul Escuro sobre Cinza Claro | 11.9:1 | AAA |
|
||||||
|
|
||||||
|
> Texto de corpo (abaixo de 18px normal ou 14px bold) requer minimo AA (4.5:1).
|
||||||
|
> Nunca usar Laranja como fundo de texto de corpo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Conformidade de Marca
|
||||||
|
|
||||||
|
- [ ] Logótipo com espaco de respiro correcto
|
||||||
|
- [ ] Apenas cores da paleta oficial
|
||||||
|
- [ ] Tipografia Montserrat (headings) e Open Sans (corpo)
|
||||||
|
- [ ] Tom de comunicacao adequado ao canal
|
||||||
|
- [ ] Marca registada (®) na primeira ocorrencia
|
||||||
|
- [ ] Contraste WCAG AA minimo em texto
|
||||||
|
- [ ] Slogan "Crescimento Digital" presente (quando relevante)
|
||||||
|
- [ ] Sem brasileirismos no texto
|
||||||
|
- [ ] Espacamento em multiplos de 4px
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Versao**: 1.0.0 | **Data**: 2026-03-10 | **Autor**: Descomplicar®
|
||||||
|
*Paletas detalhadas por contexto: `references/color-palettes.md`*
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
# Paletas de Cores Descomplicar® — Referencia Detalhada
|
||||||
|
|
||||||
|
Extensao de `brand-guidelines/SKILL.md`. Paletas completas com variacoes de contexto,
|
||||||
|
estados de interaccao e combinacoes aprovadas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paleta Principal
|
||||||
|
|
||||||
|
| Token | Hex | RGB | HSL |
|
||||||
|
|-------|-----|-----|-----|
|
||||||
|
| `--color-primary` | `#1a365d` | 26, 54, 93 | 213°, 56%, 23% |
|
||||||
|
| `--color-secondary` | `#2b6cb0` | 43, 108, 176 | 211°, 61%, 43% |
|
||||||
|
| `--color-accent` | `#dd6b20` | 221, 107, 32 | 27°, 74%, 50% |
|
||||||
|
| `--color-white` | `#ffffff` | 255, 255, 255 | — |
|
||||||
|
| `--color-bg-light` | `#f7fafc` | 247, 250, 252 | 204°, 33%, 98% |
|
||||||
|
| `--color-text-body` | `#4a5568` | 74, 85, 104 | 220°, 17%, 35% |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Escala Azul Escuro (Primary)
|
||||||
|
|
||||||
|
| Variacao | Hex | Uso |
|
||||||
|
|----------|-----|-----|
|
||||||
|
| 50 (mais claro) | `#ebf4ff` | Fundos hover muito suaves |
|
||||||
|
| 100 | `#dbeafe` | Fundos informativos |
|
||||||
|
| 200 | `#bfdbfe` | Bordas suaves |
|
||||||
|
| 300 | `#93c5fd` | Icones em fundo claro |
|
||||||
|
| 400 | `#60a5fa` | Interaccao hover em elementos claros |
|
||||||
|
| 500 | `#2b6cb0` | Azul medio (secondary) |
|
||||||
|
| 600 | `#1d4ed8` | Links hover |
|
||||||
|
| 700 | `#1e40af` | Botoes primarios hover |
|
||||||
|
| 800 | `#1e3a8a` | Variacao escura |
|
||||||
|
| **900 (base)** | `#1a365d` | **Cor primaria — uso principal** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Escala Laranja (Accent)
|
||||||
|
|
||||||
|
| Variacao | Hex | Uso |
|
||||||
|
|----------|-----|-----|
|
||||||
|
| 50 | `#fff7ed` | Fundo callout de atencao |
|
||||||
|
| 100 | `#ffedd5` | Destaque suave |
|
||||||
|
| 200 | `#fed7aa` | Borda callout |
|
||||||
|
| 300 | `#fdba74` | Icones de alerta em fundo claro |
|
||||||
|
| 400 | `#fb923c` | Hover em elementos de acento |
|
||||||
|
| **500 (base)** | `#dd6b20` | **Cor de acento — CTA principal** |
|
||||||
|
| 600 | `#c05621` | Hover botao CTA |
|
||||||
|
| 700 | `#9c4221` | Pressed state / active |
|
||||||
|
| 800 | `#7c2d12` | Texto sobre fundo laranja claro |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Escala de Neutros
|
||||||
|
|
||||||
|
| Token | Hex | Uso |
|
||||||
|
|-------|-----|-----|
|
||||||
|
| Branco | `#ffffff` | Fundos principais, texto sobre escuro |
|
||||||
|
| Gray 50 | `#f7fafc` | Fundos secundarios, seccoes alternadas |
|
||||||
|
| Gray 100 | `#edf2f7` | Hover em items de lista |
|
||||||
|
| Gray 200 | `#e2e8f0` | Bordas, divisores |
|
||||||
|
| Gray 300 | `#cbd5e0` | Bordas de formularios desactivados |
|
||||||
|
| Gray 400 | `#a0aec0` | Placeholder text, icones inactivos |
|
||||||
|
| Gray 500 | `#718096` | Texto auxiliar, labels |
|
||||||
|
| **Gray 600** | `#4a5568` | **Texto de corpo principal** |
|
||||||
|
| Gray 700 | `#2d3748` | Texto secundario escuro |
|
||||||
|
| Gray 800 | `#1a202c` | Texto titulo alternativo |
|
||||||
|
| Gray 900 | `#171923` | Fundo ultra-escuro (raro) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Combinacoes de Cor Aprovadas
|
||||||
|
|
||||||
|
### Combinacoes de Alta Prioridade (CTA e Heroi)
|
||||||
|
|
||||||
|
| Fundo | Texto / Elemento | Racio | Nota |
|
||||||
|
|-------|-----------------|-------|------|
|
||||||
|
| `#1a365d` | `#ffffff` | 12.6:1 | Preferencial — hero, capa, footer |
|
||||||
|
| `#2b6cb0` | `#ffffff` | 5.1:1 | Botoes, badges, chips |
|
||||||
|
| `#dd6b20` | `#ffffff` | 3.1:1 | CTA (apenas texto grande >=18px ou bold >=14px) |
|
||||||
|
| `#ffffff` | `#1a365d` | 12.6:1 | Documentos, corpo pagina |
|
||||||
|
| `#f7fafc` | `#1a365d` | 11.9:1 | Cards, seccoes alternadas |
|
||||||
|
|
||||||
|
### Combinacoes de Texto (Corpo)
|
||||||
|
|
||||||
|
| Fundo | Texto | Racio | Nivel WCAG |
|
||||||
|
|-------|-------|-------|-----------|
|
||||||
|
| `#ffffff` | `#4a5568` | 7.0:1 | AAA |
|
||||||
|
| `#f7fafc` | `#4a5568` | 6.6:1 | AAA |
|
||||||
|
| `#ffffff` | `#2d3748` | 10.7:1 | AAA |
|
||||||
|
| `#1a365d` | `#f7fafc` | 12.0:1 | AAA |
|
||||||
|
|
||||||
|
### Combinacoes Proibidas
|
||||||
|
|
||||||
|
| Fundo | Texto | Motivo |
|
||||||
|
|-------|-------|--------|
|
||||||
|
| `#dd6b20` | `#ffffff` | Contraste insuficiente para texto pequeno (3.1:1) |
|
||||||
|
| `#2b6cb0` | `#1a365d` | Contraste insuficiente entre tons de azul (2.2:1) |
|
||||||
|
| `#4a5568` | `#2b6cb0` | Baixo contraste em textos de corpo (2.8:1) |
|
||||||
|
| Qualquer cor | `#a0aec0` | Gray 400 nunca como texto (max 2.9:1 sobre branco) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paleta por Contexto de Produto
|
||||||
|
|
||||||
|
### Dashboard / Aplicacao Web
|
||||||
|
|
||||||
|
```
|
||||||
|
Sidebar: fundo #1a365d, icones #f7fafc (inactivo), #dd6b20 (activo)
|
||||||
|
Top bar: fundo #ffffff, borda inferior #e2e8f0
|
||||||
|
Conteudo: fundo #f7fafc
|
||||||
|
Cards: fundo #ffffff, sombra --shadow-sm
|
||||||
|
Tabelas: linhas alternas #f7fafc / #ffffff
|
||||||
|
Botao primario: #dd6b20 (fundo), #ffffff (texto)
|
||||||
|
Botao secundario: #2b6cb0 (borda e texto), transparente (fundo)
|
||||||
|
Botao ghost: #4a5568 (texto), hover #f7fafc (fundo)
|
||||||
|
Links inline: #2b6cb0, hover #1a365d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Apresentacoes (Slides)
|
||||||
|
|
||||||
|
```
|
||||||
|
Slide escuro (capa, divider): fundo #1a365d
|
||||||
|
- Titulo: Montserrat 800, #ffffff
|
||||||
|
- Subtitulo: Montserrat 600, #f7fafc
|
||||||
|
- Acento barra: #dd6b20
|
||||||
|
- Logótipo: variante clara
|
||||||
|
|
||||||
|
Slide claro (conteudo): fundo #ffffff
|
||||||
|
- Titulo: Montserrat 700, #1a365d
|
||||||
|
- Corpo: Open Sans 400, #4a5568
|
||||||
|
- Highlight box: fundo #f7fafc, borda esquerda #dd6b20 4px
|
||||||
|
- Numero/stat: Montserrat 800, #dd6b20 ou #2b6cb0
|
||||||
|
|
||||||
|
Slide citacao: fundo #f7fafc
|
||||||
|
- Aspas: #dd6b20
|
||||||
|
- Texto citacao: Montserrat 600, #1a365d
|
||||||
|
- Atribuicao: Open Sans 400, #4a5568
|
||||||
|
```
|
||||||
|
|
||||||
|
### Email Marketing
|
||||||
|
|
||||||
|
```
|
||||||
|
Wrapper: fundo #f7fafc
|
||||||
|
Container: fundo #ffffff, max-width 600px
|
||||||
|
Pre-header (top bar): fundo #1a365d, altura 4px ou bloco com logótipo
|
||||||
|
Header: fundo #1a365d, logótipo clara, padding 32px
|
||||||
|
Titulo: Montserrat 700, #ffffff, 28px
|
||||||
|
Body: fundo #ffffff, padding 32px
|
||||||
|
H2: Montserrat 600, #1a365d, 22px
|
||||||
|
Paragrafo: Open Sans 400, #4a5568, 16px, line-height 1.6
|
||||||
|
Link inline: #2b6cb0
|
||||||
|
CTA block: centrado, botao #dd6b20, texto #ffffff, border-radius 4px, padding 14px 28px
|
||||||
|
Divisor: border-top 1px solid #e2e8f0
|
||||||
|
Footer: fundo #f7fafc, texto #718096, 13px, links #4a5568
|
||||||
|
```
|
||||||
|
|
||||||
|
### Social Media
|
||||||
|
|
||||||
|
```
|
||||||
|
Post Instagram (1080x1080):
|
||||||
|
Opcao A (escuro): fundo #1a365d, titulo #ffffff, acento #dd6b20
|
||||||
|
Opcao B (claro): fundo #ffffff, titulo #1a365d, detalhe #dd6b20
|
||||||
|
Borda/frame: strip #dd6b20 (8-12px) em baixo ou em cima
|
||||||
|
Logo: canto inferior direito, variante adequada ao fundo
|
||||||
|
|
||||||
|
Story Instagram (1080x1920):
|
||||||
|
Gradiente vertical: #1a365d (topo) -> #2b6cb0 (base)
|
||||||
|
Texto: #ffffff
|
||||||
|
CTA button area: #dd6b20
|
||||||
|
|
||||||
|
LinkedIn Banner (1584x396):
|
||||||
|
Fundo: #1a365d ou fotografia com overlay #1a365d 60%
|
||||||
|
Texto: #ffffff (titulo), #f7fafc (sub)
|
||||||
|
Acento: strip ou elemento #dd6b20
|
||||||
|
```
|
||||||
|
|
||||||
|
### Documentos PDF / Propostas
|
||||||
|
|
||||||
|
```
|
||||||
|
Capa: fundo #1a365d
|
||||||
|
Logo: variante clara, centrado no topo
|
||||||
|
Titulo: Montserrat 800, #ffffff, 36px
|
||||||
|
Subtitulo: Montserrat 400, #f7fafc, 18px
|
||||||
|
Data/ref: Open Sans 400, #a0aec0, 14px, em baixo
|
||||||
|
|
||||||
|
Paginas internas:
|
||||||
|
Cabecalho: altura 48px, fundo #1a365d, logótipo pequena (variante clara), numero de pagina
|
||||||
|
Titulo capitulo: Montserrat 700, #1a365d, 22px, fundo #f7fafc, padding 12px, borda esquerda #dd6b20 4px
|
||||||
|
Corpo: Open Sans 400, #4a5568, 11pt, line-height 1.6
|
||||||
|
Callout/destaque: fundo #f7fafc, borda #dd6b20, icone #dd6b20
|
||||||
|
Tabelas: header fundo #1a365d texto #ffffff; linhas alternas #f7fafc / #ffffff
|
||||||
|
Rodape: borda topo #e2e8f0, texto #718096, 9pt
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Gradientes Aprovados
|
||||||
|
|
||||||
|
| Nome | Valor CSS | Uso |
|
||||||
|
|------|-----------|-----|
|
||||||
|
| Hero primario | `linear-gradient(135deg, #1a365d 0%, #2b6cb0 100%)` | Heroi web, fundo apresentacao |
|
||||||
|
| Acento | `linear-gradient(135deg, #dd6b20 0%, #f6ad55 100%)` | Banners promocionais |
|
||||||
|
| Escuro suave | `linear-gradient(180deg, #1a365d 0%, #2d3748 100%)` | Sidebars, overlays |
|
||||||
|
| Claro | `linear-gradient(180deg, #ffffff 0%, #f7fafc 100%)` | Seccoes de transicao |
|
||||||
|
|
||||||
|
> Nunca usar gradientes em texto (excecto como elemento decorativo com contraste garantido).
|
||||||
|
> Maximo 2 gradientes por composicao visual.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cores de Estado e Feedback
|
||||||
|
|
||||||
|
| Estado | Cor | Hex | Uso |
|
||||||
|
|--------|-----|-----|-----|
|
||||||
|
| Sucesso | Verde | `#38a169` | Confirmacoes, checkmarks, alertas positivos |
|
||||||
|
| Aviso | Amarelo | `#d69e2e` | Alertas de atencao, pendentes |
|
||||||
|
| Erro | Vermelho | `#e53e3e` | Erros, validacoes negativas |
|
||||||
|
| Informacao | Azul Medio | `#2b6cb0` | Mensagens informativas, tooltips |
|
||||||
|
|
||||||
|
> Cores de estado nao fazem parte da identidade visual principal.
|
||||||
|
> Usar apenas para feedback de interface, nunca como cor de marca.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Referencia de paletas v1.0.0 | 2026-03-10 | Descomplicar®*
|
||||||
|
*Fonte principal: `brand-guidelines/SKILL.md`*
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
---
|
||||||
|
name: "Descomplicar Digital"
|
||||||
|
description: "Professional technology consulting theme with warm accents"
|
||||||
|
version: "1.0.0"
|
||||||
|
updated: "2026-03-10"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Tema Descomplicar Digital
|
||||||
|
|
||||||
|
Tema oficial Descomplicar® para uso em apresentações, relatórios, designs e qualquer material de comunicação.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paleta de Cores
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
colors:
|
||||||
|
primary: "#1a365d" # Azul escuro — headers, fundos principais
|
||||||
|
secondary: "#2b6cb0" # Azul médio — links, sub-headers
|
||||||
|
accent: "#dd6b20" # Laranja — CTAs, destaques, números
|
||||||
|
background: "#ffffff" # Branco — fundo principal
|
||||||
|
surface: "#f7fafc" # Cinza muito claro — secções alternadas
|
||||||
|
text_primary: "#2d3748" # Cinza escuro — texto corpo
|
||||||
|
text_secondary: "#4a5568" # Cinza médio — subtítulos, legendas
|
||||||
|
border: "#e2e8f0" # Cinza claro — bordas, separadores
|
||||||
|
success: "#38a169" # Verde — confirmações
|
||||||
|
warning: "#d69e2e" # Amarelo — avisos
|
||||||
|
error: "#e53e3e" # Vermelho — erros
|
||||||
|
```
|
||||||
|
|
||||||
|
### Referência Visual
|
||||||
|
|
||||||
|
| Token | Hex | Uso |
|
||||||
|
|-------|-----|-----|
|
||||||
|
| `primary` | `#1a365d` | Headers H1/H2, fundos de navegação, capa de apresentação |
|
||||||
|
| `secondary` | `#2b6cb0` | Links, H3/H4, badges, ícones activos |
|
||||||
|
| `accent` | `#dd6b20` | Botões CTA, números em destaque, linhas de separação principais |
|
||||||
|
| `background` | `#ffffff` | Fundo padrão de slides e páginas |
|
||||||
|
| `surface` | `#f7fafc` | Slides alternados, tabelas linha par, painéis laterais |
|
||||||
|
| `text_primary` | `#2d3748` | Corpo de texto, parágrafos, listas |
|
||||||
|
| `text_secondary` | `#4a5568` | Subtítulos, legendas, texto auxiliar |
|
||||||
|
| `border` | `#e2e8f0` | Bordas de tabela, separadores horizontais, cards |
|
||||||
|
| `success` | `#38a169` | Confirmações, métricas positivas, status "concluído" |
|
||||||
|
| `warning` | `#d69e2e` | Avisos, métricas de atenção, status "em risco" |
|
||||||
|
| `error` | `#e53e3e` | Erros, métricas negativas, status "crítico" |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipografia
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
fonts:
|
||||||
|
heading: "Montserrat"
|
||||||
|
heading_weight: "700, 800"
|
||||||
|
heading_fallback: "Arial, sans-serif"
|
||||||
|
body: "Open Sans"
|
||||||
|
body_weight: "400, 600"
|
||||||
|
body_fallback: "Helvetica, sans-serif"
|
||||||
|
code: "JetBrains Mono"
|
||||||
|
code_fallback: "Consolas, monospace"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hierarquia Tipográfica
|
||||||
|
|
||||||
|
| Nível | Fonte | Peso | Tamanho (slides) | Tamanho (docs) |
|
||||||
|
|-------|-------|------|-----------------|----------------|
|
||||||
|
| H1 — Título principal | Montserrat | 800 | 40-48px | 32px |
|
||||||
|
| H2 — Título secção | Montserrat | 700 | 28-36px | 24px |
|
||||||
|
| H3 — Subtítulo | Montserrat | 700 | 22-26px | 20px |
|
||||||
|
| H4 — Label | Open Sans | 600 | 18-20px | 16px |
|
||||||
|
| Corpo | Open Sans | 400 | 16-18px | 14-16px |
|
||||||
|
| Caption | Open Sans | 400 | 12-14px | 12px |
|
||||||
|
| Código | JetBrains Mono | 400 | 14-16px | 13px |
|
||||||
|
|
||||||
|
### Google Fonts — Import
|
||||||
|
|
||||||
|
```css
|
||||||
|
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@700;800&family=Open+Sans:wght@400;600&family=JetBrains+Mono&display=swap');
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regras de Uso
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
usage_notes:
|
||||||
|
- Usar laranja com moderação (apenas CTAs e destaques-chave)
|
||||||
|
- Azul escuro para headers e elementos de navegação
|
||||||
|
- Fundos alternados branco/cinza para secções longas
|
||||||
|
- Nunca usar mais de 3 cores numa slide
|
||||||
|
- Manter contraste WCAG AA em todos os textos
|
||||||
|
```
|
||||||
|
|
||||||
|
### Regras Expandidas
|
||||||
|
|
||||||
|
**Cores**
|
||||||
|
- O laranja (`accent`) é reservado para no máximo 1-2 elementos por slide/página
|
||||||
|
- Nunca usar `primary` e `accent` em simultâneo em texto — garante legibilidade
|
||||||
|
- Fundo `surface` em slides alternados cria ritmo visual sem poluição
|
||||||
|
- Combinação permitida em texto: `primary` fundo + `background` texto, ou `background` fundo + `primary` texto
|
||||||
|
|
||||||
|
**Tipografia**
|
||||||
|
- Nunca misturar Montserrat com outra fonte de títulos no mesmo documento
|
||||||
|
- Open Sans é a única fonte de corpo permitida
|
||||||
|
- Código inline e blocos de código: sempre JetBrains Mono
|
||||||
|
- Não usar itálico em títulos — usar peso (bold) para ênfase
|
||||||
|
|
||||||
|
**Contraste WCAG AA**
|
||||||
|
- `text_primary` (#2d3748) sobre `background` (#ffffff): rácio 12.6:1 — aprovado
|
||||||
|
- `text_secondary` (#4a5568) sobre `background` (#ffffff): rácio 7.4:1 — aprovado
|
||||||
|
- `accent` (#dd6b20) sobre `background` (#ffffff): rácio 3.8:1 — aprovado para texto grande (>18px bold)
|
||||||
|
- `background` (#ffffff) sobre `primary` (#1a365d): rácio 12.6:1 — aprovado
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aplicação em Slides
|
||||||
|
|
||||||
|
### Layout Tipo Capa
|
||||||
|
|
||||||
|
```
|
||||||
|
[Fundo: primary #1a365d]
|
||||||
|
[Logo Descomplicar — branco, topo esquerdo]
|
||||||
|
[H1: Montserrat 800, branco]
|
||||||
|
[H2: Montserrat 700, accent #dd6b20]
|
||||||
|
[Rodapé: Open Sans 400, text_secondary, separador border]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Layout Tipo Conteúdo
|
||||||
|
|
||||||
|
```
|
||||||
|
[Fundo: background #ffffff]
|
||||||
|
[Header barra: primary #1a365d, 8px altura]
|
||||||
|
[H2: primary #1a365d, Montserrat 700]
|
||||||
|
[Corpo: text_primary #2d3748, Open Sans 400]
|
||||||
|
[Sidebar ou destaque: surface #f7fafc]
|
||||||
|
[CTA ou número chave: accent #dd6b20, Montserrat 800]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Layout Tipo Dados / Métricas
|
||||||
|
|
||||||
|
```
|
||||||
|
[Fundo alternado: surface #f7fafc]
|
||||||
|
[Número grande: accent #dd6b20, Montserrat 800, 60-80px]
|
||||||
|
[Label: text_secondary #4a5568, Open Sans 600, 14px]
|
||||||
|
[Ícone: secondary #2b6cb0]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aplicação em HTML (Desk CRM / Relatórios)
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
--color-primary: #1a365d;
|
||||||
|
--color-secondary: #2b6cb0;
|
||||||
|
--color-accent: #dd6b20;
|
||||||
|
--color-background: #ffffff;
|
||||||
|
--color-surface: #f7fafc;
|
||||||
|
--color-text-primary: #2d3748;
|
||||||
|
--color-text-secondary: #4a5568;
|
||||||
|
--color-border: #e2e8f0;
|
||||||
|
--color-success: #38a169;
|
||||||
|
--color-warning: #d69e2e;
|
||||||
|
--color-error: #e53e3e;
|
||||||
|
--font-heading: 'Montserrat', Arial, sans-serif;
|
||||||
|
--font-body: 'Open Sans', Helvetica, sans-serif;
|
||||||
|
--font-code: 'JetBrains Mono', Consolas, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2 { font-family: var(--font-heading); font-weight: 800; color: var(--color-primary); }
|
||||||
|
h3, h4 { font-family: var(--font-heading); font-weight: 700; color: var(--color-secondary); }
|
||||||
|
p, li { font-family: var(--font-body); color: var(--color-text-primary); }
|
||||||
|
code { font-family: var(--font-code); }
|
||||||
|
.accent { color: var(--color-accent); }
|
||||||
|
.surface { background: var(--color-surface); }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Compatibilidade com /design
|
||||||
|
|
||||||
|
Este tema é carregado automaticamente quando se usa `--brand descomplicar` no skill `/design`.
|
||||||
|
|
||||||
|
**Pack JSON:** `/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/descomplicar.json`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Tema v1.0.0 | 2026-03-10 | Descomplicar®*
|
||||||
156
design-media/skills/design/SKILL.md
Normal file
156
design-media/skills/design/SKILL.md
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
---
|
||||||
|
name: design
|
||||||
|
description: Motor de design profissional multi-marca. Gera apresentações, infográficos, logos, social media, web pages e identidade visual.
|
||||||
|
---
|
||||||
|
|
||||||
|
# /design - Motor de Design Profissional
|
||||||
|
|
||||||
|
Ponto de entrada unificado para o sistema de design multi-marca. Routing automatico para o motor adequado.
|
||||||
|
|
||||||
|
## Contexto NotebookLM
|
||||||
|
|
||||||
|
ANTES de executar, consultar notebooks para contexto especializado:
|
||||||
|
|
||||||
|
| Notebook | ID | Consultar quando |
|
||||||
|
|----------|-----|-----------------|
|
||||||
|
| Tipografia e Cor para Web | f97a0d2b | Sempre |
|
||||||
|
| UI/UX Design | 081ca512 | Para decisões de interface |
|
||||||
|
| Design Profissional AItomatizado | b568b13b-0eed-48c9-b513-5c5b7ec0b102 | Sempre |
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "f97a0d2b-a5b3-4640-b941-3cbb184b1b81",
|
||||||
|
query: "<adaptar ao contexto do pedido do utilizador>"
|
||||||
|
})
|
||||||
|
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "081ca512-8279-4850-b2b9-dff090267482",
|
||||||
|
query: "<adaptar ao contexto de interface/UX do pedido>"
|
||||||
|
})
|
||||||
|
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "b568b13b-0eed-48c9-b513-5c5b7ec0b102",
|
||||||
|
query: "<adaptar ao contexto de design profissional e automação>"
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Integrar insights do NotebookLM nas recomendações e decisões.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comandos
|
||||||
|
|
||||||
|
| Comando | Output | Motor |
|
||||||
|
|---------|--------|-------|
|
||||||
|
| `/design [descricao]` | Routing automatico | Auto |
|
||||||
|
| `/design presentation [tema]` | Apresentacao PPTX/PDF | Presenton |
|
||||||
|
| `/design infographic [tema]` | Infografico PNG/PDF | Penpot + AI |
|
||||||
|
| `/design social [plataforma] [tema]` | Post redes sociais | Penpot |
|
||||||
|
| `/design web [descricao]` | Landing page / web component | Stitch |
|
||||||
|
| `/design logo [nome]` | Logo SVG + variacoes | Penpot + Fibo |
|
||||||
|
| `/design brand [empresa]` | Identidade visual completa | Todos |
|
||||||
|
| `/design from-reference [url]` | Analisa e recria adaptado | Auto |
|
||||||
|
|
||||||
|
## Parametros Opcionais
|
||||||
|
|
||||||
|
| Parametro | Descricao | Exemplo |
|
||||||
|
|-----------|-----------|---------|
|
||||||
|
| `--brand [nome]` | Aplicar identidade de marca | `--brand descomplicar` |
|
||||||
|
| `--tone [tom]` | Tom da apresentacao | `--tone sales_pitch` |
|
||||||
|
| `--format [fmt]` | Formato de exportacao | `--format pdf` |
|
||||||
|
| `--variations [n]` | Numero de variacoes | `--variations 5` |
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
```
|
||||||
|
1. PARSE comando e parametros
|
||||||
|
2. IDENTIFICAR tipo de output
|
||||||
|
- "presentation" / "slides" / "proposta" -> Presenton
|
||||||
|
- "infographic" / "poster" / "flyer" -> Penpot
|
||||||
|
- "social" / "instagram" / "linkedin" -> Penpot (dimensoes)
|
||||||
|
- "web" / "landing" / "page" / "ui" -> Stitch
|
||||||
|
- "logo" / "icone" / "marca" -> Penpot + Fibo
|
||||||
|
- "brand" / "identidade" -> Pipeline completo
|
||||||
|
- "from-reference" -> Researcher primeiro
|
||||||
|
3. SE --brand especificado:
|
||||||
|
- Carregar brand pack via design-engine MCP: brand_load(nome)
|
||||||
|
- Aplicar cores, fontes e logo a todos os outputs
|
||||||
|
4. DELEGAR a design-lead agent (orquestrador)
|
||||||
|
5. APRESENTAR resultados ao utilizador
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exemplos de Uso
|
||||||
|
|
||||||
|
### Apresentacao com marca
|
||||||
|
```
|
||||||
|
/design presentation "Proposta de servicos web para empresa X" --brand descomplicar
|
||||||
|
```
|
||||||
|
Resultado: PPTX profissional via Presenton com cores dourado/preto, logo Descomplicar, fonte Nexa.
|
||||||
|
|
||||||
|
### Post Instagram
|
||||||
|
```
|
||||||
|
/design social instagram "Promocao Black Friday -30%"
|
||||||
|
```
|
||||||
|
Resultado: Imagem 1080x1080 composta no Penpot com texto, cores e layout profissional.
|
||||||
|
|
||||||
|
### Landing page
|
||||||
|
```
|
||||||
|
/design web "Landing page para agencia de marketing digital" --brand descomplicar
|
||||||
|
```
|
||||||
|
Resultado: HTML/CSS via Stitch com Design DNA da marca.
|
||||||
|
|
||||||
|
### Infografico
|
||||||
|
```
|
||||||
|
/design infographic "Top 10 tendencias AI 2026"
|
||||||
|
```
|
||||||
|
Resultado: PNG/PDF vertical composto no Penpot com icones, dados e hierarquia visual.
|
||||||
|
|
||||||
|
### Identidade visual completa
|
||||||
|
```
|
||||||
|
/design brand "Nova Empresa Tech"
|
||||||
|
```
|
||||||
|
Resultado: Logo + paleta + tipografia + templates social + template apresentacao.
|
||||||
|
|
||||||
|
### A partir de referencia
|
||||||
|
```
|
||||||
|
/design from-reference https://figma.com/file/abc123
|
||||||
|
```
|
||||||
|
Resultado: Analisa design Figma, extrai estilo, recria adaptado.
|
||||||
|
|
||||||
|
## 5 MCPs de Design
|
||||||
|
|
||||||
|
| MCP | Funcao |
|
||||||
|
|-----|--------|
|
||||||
|
| **design-engine** | Imagens AI (Fibo/Gemini) + brand packs + rembg |
|
||||||
|
| **presenton** | Apresentacoes AI (slide.descomplicar.pt) |
|
||||||
|
| **penpot** | Compositor visual (pen.descomplicar.pt) |
|
||||||
|
| **stitch** | Web design AI (Google) |
|
||||||
|
| **figma** | Analise referencias (read-only) |
|
||||||
|
|
||||||
|
## Brand Packs Disponiveis
|
||||||
|
|
||||||
|
Verificar com: `brand_list()` via design-engine MCP.
|
||||||
|
|
||||||
|
Brand packs em: `/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/`
|
||||||
|
|
||||||
|
Formato: `{nome}.json` com cores, fontes, logos, voz, estilo.
|
||||||
|
|
||||||
|
## Dimensoes Social Media
|
||||||
|
|
||||||
|
| Plataforma | Formato | Dimensoes |
|
||||||
|
|------------|---------|-----------|
|
||||||
|
| Instagram Post | 1:1 | 1080x1080 |
|
||||||
|
| Instagram Story | 9:16 | 1080x1920 |
|
||||||
|
| LinkedIn Post | ~2:1 | 1200x628 |
|
||||||
|
| YouTube Thumbnail | 16:9 | 1280x720 |
|
||||||
|
| OG Image | ~2:1 | 1200x630 |
|
||||||
|
| Facebook Cover | ~3:1 | 820x312 |
|
||||||
|
|
||||||
|
## Qualidade
|
||||||
|
|
||||||
|
Todos os outputs passam pelo design-critic com score minimo 7/10 em 5 dimensoes:
|
||||||
|
fidelidade, concisao visual, legibilidade, profissionalismo, brand compliance.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Versao**: 2.0.0 | **Data**: 2026-02-12 | **Autor**: Descomplicar
|
||||||
289
design-media/skills/design/references/premium-proposals.md
Normal file
289
design-media/skills/design/references/premium-proposals.md
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
# Referência: Propostas Premium — Design de Capas e Páginas Visuais
|
||||||
|
|
||||||
|
Guia prático para criar páginas visuais de impacto em propostas comerciais Descomplicar.
|
||||||
|
Baseado na filosofia canvas-design: design-forward, cada página comunica antes de ser lida.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Filosofia de Design
|
||||||
|
|
||||||
|
**Princípio central:** o cliente forma opinião sobre a proposta nos primeiros 3 segundos.
|
||||||
|
Cada página deve funcionar como imagem antes de funcionar como texto.
|
||||||
|
|
||||||
|
| Princípio | Aplicação |
|
||||||
|
|-----------|-----------|
|
||||||
|
| Visual-first | Imagem/composição comunica o tema antes do texto |
|
||||||
|
| Texto mínimo | Menos palavras, mais impacto por palavra |
|
||||||
|
| Espaço negativo | Respiração generosa — o vazio é parte do design |
|
||||||
|
| Tipografia como design | O tipo de letra é um elemento visual, não só legível |
|
||||||
|
| Paleta disciplinada | Máximo 3 cores por página (+ neutros) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paleta Descomplicar
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Cores base da marca — aplicar consistentemente
|
||||||
|
PALETA = {
|
||||||
|
"dourado": "#C9A84C", # acento principal
|
||||||
|
"dourado_lt": "#E8D5A3", # acento suave / fundo dourado
|
||||||
|
"preto": "#0D0D0D", # fundo principal dark
|
||||||
|
"cinza_esc": "#1A1A1A", # fundo secundário
|
||||||
|
"cinza_med": "#3D3D3D", # separadores
|
||||||
|
"cinza_lt": "#F5F5F5", # fundo light / texto em dark
|
||||||
|
"branco": "#FFFFFF", # texto em dark, fundo clean
|
||||||
|
}
|
||||||
|
|
||||||
|
# Tipografia (Nexa é a fonte da marca)
|
||||||
|
FONTES = {
|
||||||
|
"heading": "Nexa Bold",
|
||||||
|
"subheading":"Nexa Light",
|
||||||
|
"corpo": "Source Sans 3",
|
||||||
|
"detalhe": "IBM Plex Mono", # para números, códigos
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Workflow: do conceito à página
|
||||||
|
|
||||||
|
```
|
||||||
|
1. BRIEFING — que secção é esta? qual a mensagem principal?
|
||||||
|
2. COMPOSIÇÃO — escolher layout base (ver tipos abaixo)
|
||||||
|
3. HIERARQUIA — definir 3 níveis: âncora visual / título / detalhe
|
||||||
|
4. COR — aplicar paleta com dominante + acento
|
||||||
|
5. TIPOGRAFIA — tamanhos com contraste forte (ex: 72pt / 14pt)
|
||||||
|
6. REFINAMENTO — remover tudo o que não é necessário
|
||||||
|
7. EXPORTAÇÃO — PDF vector (300dpi para imprimir, 72dpi para digital)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipos de Página por Secção
|
||||||
|
|
||||||
|
### Capa de Proposta (primeira página)
|
||||||
|
|
||||||
|
**Objectivo:** impressionar, identificar o cliente, criar antecipação.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Composição com python-reportlab
|
||||||
|
from reportlab.lib.pagesizes import A4
|
||||||
|
from reportlab.pdfgen import canvas
|
||||||
|
from reportlab.lib.colors import HexColor
|
||||||
|
|
||||||
|
W, H = A4 # 595 x 842 pontos
|
||||||
|
|
||||||
|
def criar_capa(c: canvas.Canvas, nome_cliente: str, titulo: str):
|
||||||
|
# Fundo preto total
|
||||||
|
c.setFillColor(HexColor("#0D0D0D"))
|
||||||
|
c.rect(0, 0, W, H, fill=1, stroke=0)
|
||||||
|
|
||||||
|
# Barra dourada lateral esquerda (elemento âncora)
|
||||||
|
c.setFillColor(HexColor("#C9A84C"))
|
||||||
|
c.rect(0, 0, 8, H, fill=1, stroke=0)
|
||||||
|
|
||||||
|
# Logo Descomplicar (topo direito)
|
||||||
|
c.drawImage("assets/logo-white.png", W - 130, H - 60, 110, 40, mask="auto")
|
||||||
|
|
||||||
|
# Título em grande — dois terços da página
|
||||||
|
c.setFillColor(HexColor("#FFFFFF"))
|
||||||
|
c.setFont("Nexa-Bold", 52)
|
||||||
|
# Quebra em 2 linhas se necessário
|
||||||
|
linhas = quebrar_texto(titulo, max_chars=24)
|
||||||
|
y = H * 0.55
|
||||||
|
for linha in linhas:
|
||||||
|
c.drawString(48, y, linha)
|
||||||
|
y -= 64
|
||||||
|
|
||||||
|
# Nome do cliente — acento dourado
|
||||||
|
c.setFillColor(HexColor("#C9A84C"))
|
||||||
|
c.setFont("Nexa-Light", 18)
|
||||||
|
c.drawString(48, H * 0.35, f"Preparado para {nome_cliente}")
|
||||||
|
|
||||||
|
# Data — rodapé discreto
|
||||||
|
c.setFillColor(HexColor("#3D3D3D"))
|
||||||
|
c.setFont("SourceSans3-Regular", 10)
|
||||||
|
c.drawString(48, 32, f"Descomplicar® · descomplicar.pt · Março 2026")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Composição alternativa (versão light):**
|
||||||
|
- Fundo branco com mancha fotográfica no lado direito (60% da largura)
|
||||||
|
- Título sobreposto à foto com overlay escuro
|
||||||
|
- Logo em preto, barra dourada mantida
|
||||||
|
|
||||||
|
### Separador de Secção
|
||||||
|
|
||||||
|
**Objectivo:** pausar o ritmo, anunciar o tema seguinte.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def criar_separador(c: canvas.Canvas, numero: str, titulo_seccao: str):
|
||||||
|
# Fundo dourado total — inversão de cor
|
||||||
|
c.setFillColor(HexColor("#C9A84C"))
|
||||||
|
c.rect(0, 0, W, H, fill=1, stroke=0)
|
||||||
|
|
||||||
|
# Número enorme em background (marca de água visual)
|
||||||
|
c.setFillColor(HexColor("#E8D5A3")) # dourado claro
|
||||||
|
c.setFont("Nexa-Bold", 280)
|
||||||
|
c.drawString(-20, H * 0.1, numero) # pode sair do bounds — intencional
|
||||||
|
|
||||||
|
# Título da secção — preto sobre dourado
|
||||||
|
c.setFillColor(HexColor("#0D0D0D"))
|
||||||
|
c.setFont("Nexa-Bold", 42)
|
||||||
|
c.drawString(48, H * 0.45, titulo_seccao)
|
||||||
|
|
||||||
|
# Linha divisória fina
|
||||||
|
c.setStrokeColor(HexColor("#0D0D0D"))
|
||||||
|
c.setLineWidth(1)
|
||||||
|
c.line(48, H * 0.42, W - 48, H * 0.42)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Infográfico de Dados
|
||||||
|
|
||||||
|
**Objectivo:** tornar números abstractos em narrativa visual.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def criar_infografico_metricas(c: canvas.Canvas, metricas: list[dict]):
|
||||||
|
"""
|
||||||
|
metricas = [
|
||||||
|
{"valor": "3x", "label": "Aumento de tráfego", "icone": "trend"},
|
||||||
|
{"valor": "47%", "label": "Redução de custo por lead", "icone": "savings"},
|
||||||
|
{"valor": "12", "label": "Palavras-chave no Top 3", "icone": "star"},
|
||||||
|
]
|
||||||
|
"""
|
||||||
|
# Fundo neutro quente
|
||||||
|
c.setFillColor(HexColor("#F5F5F5"))
|
||||||
|
c.rect(0, 0, W, H, fill=1, stroke=0)
|
||||||
|
|
||||||
|
# Título da página
|
||||||
|
c.setFillColor(HexColor("#0D0D0D"))
|
||||||
|
c.setFont("Nexa-Bold", 32)
|
||||||
|
c.drawString(48, H - 80, "Resultados Projectados")
|
||||||
|
|
||||||
|
# Grid de métricas (3 colunas)
|
||||||
|
col_w = (W - 96) / len(metricas)
|
||||||
|
for i, m in enumerate(metricas):
|
||||||
|
x = 48 + i * col_w
|
||||||
|
y_center = H * 0.5
|
||||||
|
|
||||||
|
# Caixa de métrica
|
||||||
|
c.setFillColor(HexColor("#FFFFFF"))
|
||||||
|
c.roundRect(x + 8, y_center - 80, col_w - 16, 160, 12, fill=1, stroke=0)
|
||||||
|
|
||||||
|
# Valor principal — grande e dourado
|
||||||
|
c.setFillColor(HexColor("#C9A84C"))
|
||||||
|
c.setFont("Nexa-Bold", 56)
|
||||||
|
c.drawCentredString(x + col_w / 2, y_center + 20, m["valor"])
|
||||||
|
|
||||||
|
# Label — preto, pequeno
|
||||||
|
c.setFillColor(HexColor("#3D3D3D"))
|
||||||
|
c.setFont("SourceSans3-Regular", 11)
|
||||||
|
c.drawCentredString(x + col_w / 2, y_center - 20, m["label"])
|
||||||
|
```
|
||||||
|
|
||||||
|
### Página de Pricing Visual
|
||||||
|
|
||||||
|
**Objectivo:** apresentar preços sem que pareçam uma tabela de custos.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def criar_pricing(c: canvas.Canvas, planos: list[dict]):
|
||||||
|
"""
|
||||||
|
planos = [
|
||||||
|
{"nome": "Essencial", "preco": 450, "destaque": False,
|
||||||
|
"items": ["SEO On-page", "Relatório mensal", "2 artigos/mês"]},
|
||||||
|
{"nome": "Crescimento", "preco": 850, "destaque": True,
|
||||||
|
"items": ["SEO completo", "Google Ads", "4 artigos/mês", "Dashboard BI"]},
|
||||||
|
]
|
||||||
|
"""
|
||||||
|
# Fundo escuro para pricing
|
||||||
|
c.setFillColor(HexColor("#0D0D0D"))
|
||||||
|
c.rect(0, 0, W, H, fill=1, stroke=0)
|
||||||
|
|
||||||
|
card_w = (W - 96 - 16 * (len(planos) - 1)) / len(planos)
|
||||||
|
|
||||||
|
for i, p in enumerate(planos):
|
||||||
|
x = 48 + i * (card_w + 16)
|
||||||
|
y_top = H * 0.75
|
||||||
|
|
||||||
|
if p["destaque"]:
|
||||||
|
# Card dourado para o plano recomendado
|
||||||
|
c.setFillColor(HexColor("#C9A84C"))
|
||||||
|
c.roundRect(x - 4, y_top - 4, card_w + 8, H * 0.5 + 8, 16, fill=1, stroke=0)
|
||||||
|
texto_cor = HexColor("#0D0D0D")
|
||||||
|
else:
|
||||||
|
c.setFillColor(HexColor("#1A1A1A"))
|
||||||
|
c.roundRect(x, y_top, card_w, H * 0.5, 12, fill=1, stroke=0)
|
||||||
|
texto_cor = HexColor("#FFFFFF")
|
||||||
|
|
||||||
|
# Nome do plano
|
||||||
|
c.setFillColor(texto_cor)
|
||||||
|
c.setFont("Nexa-Bold", 20)
|
||||||
|
c.drawString(x + 20, y_top + H * 0.5 - 44, p["nome"])
|
||||||
|
|
||||||
|
# Preço
|
||||||
|
c.setFont("Nexa-Bold", 48)
|
||||||
|
c.drawString(x + 20, y_top + H * 0.5 - 100, f"{p['preco']}€")
|
||||||
|
c.setFont("SourceSans3-Regular", 11)
|
||||||
|
c.drawString(x + 20, y_top + H * 0.5 - 118, "/ mês + IVA")
|
||||||
|
|
||||||
|
# Items incluídos
|
||||||
|
c.setFont("SourceSans3-Regular", 12)
|
||||||
|
y_item = y_top + H * 0.5 - 150
|
||||||
|
for item in p["items"]:
|
||||||
|
c.drawString(x + 28, y_item, f"— {item}")
|
||||||
|
y_item -= 22
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ferramentas: python-reportlab vs pptxgenjs
|
||||||
|
|
||||||
|
| Critério | python-reportlab | pptxgenjs (Node) |
|
||||||
|
|----------|-----------------|------------------|
|
||||||
|
| Output | PDF nativo | PPTX (editável) |
|
||||||
|
| Controlo | Pixel-perfect | Aproximado |
|
||||||
|
| Fontes custom | Suporte completo | Limitado |
|
||||||
|
| Melhor para | Proposta final PDF | Template editável pelo cliente |
|
||||||
|
| Ambiente | Servidor dev (`/root/Dev`) | Servidor dev ou local |
|
||||||
|
|
||||||
|
**Recomendação:** usar reportlab para proposta final; pptxgenjs se o cliente precisar de editar.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Instalar no servidor dev
|
||||||
|
pip install reportlab Pillow
|
||||||
|
|
||||||
|
# Registar fontes Nexa
|
||||||
|
from reportlab.pdfbase import pdfmetrics
|
||||||
|
from reportlab.pdfbase.ttfonts import TTFont
|
||||||
|
pdfmetrics.registerFont(TTFont("Nexa-Bold", "/root/Dev/assets/fonts/Nexa-Bold.ttf"))
|
||||||
|
pdfmetrics.registerFont(TTFont("Nexa-Light", "/root/Dev/assets/fonts/Nexa-Light.ttf"))
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regras de Composição (resumo operacional)
|
||||||
|
|
||||||
|
1. **Uma mensagem por página** — se precisas de duas frases para explicar, remove uma
|
||||||
|
2. **Âncora visual primeiro** — o olho precisa de um ponto de entrada (número grande, foto, cor)
|
||||||
|
3. **Contraste de escala** — combinar elemento 280pt com texto 12pt (não 24pt com 18pt)
|
||||||
|
4. **Margens generosas** — margem mínima de 48pt em A4; prefere 64pt
|
||||||
|
5. **Rodapé discreto** — página + marca em 9pt, nunca competir com conteúdo
|
||||||
|
6. **Máximo 3 fontes** — Nexa Bold + Nexa Light + Source Sans 3 (IBM Plex Mono opcional para dados)
|
||||||
|
7. **Alinhamento consistente** — escolher esquerda ou centrado para o documento inteiro
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist de Qualidade
|
||||||
|
|
||||||
|
- [ ] Capa com nome do cliente e data correctos
|
||||||
|
- [ ] Logo Descomplicar presente em todas as páginas (rodapé ou canto)
|
||||||
|
- [ ] Paleta restrita a 3 cores por página
|
||||||
|
- [ ] Nenhuma fonte genérica (Arial, Calibri, Times)
|
||||||
|
- [ ] Espaço negativo generoso — sem páginas "cheias"
|
||||||
|
- [ ] Preços em EUR sem decimais desnecessários (850EUR, não 850,00EUR)
|
||||||
|
- [ ] PDF exportado em vector (não rasterizado)
|
||||||
|
- [ ] Tamanho final < 10MB para envio por email
|
||||||
|
- [ ] Testar visualização em modo claro e escuro (PDF viewer)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Referência: premium-proposals v1.0 | 2026-03-10 | Descomplicar®*
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "dev-tools",
|
"name": "dev-tools",
|
||||||
"description": "PHP, React, Next.js development, database design and frontend patterns. Backed by 7 Dify KB datasets.",
|
"description": "PHP, React, Next.js development, database design and frontend patterns. Backed by NotebookLM notebooks.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Descomplicar - Crescimento Digital",
|
"name": "Descomplicar - Crescimento Digital",
|
||||||
|
|||||||
@@ -5,6 +5,15 @@ role: Especialista em arquitectura de bases de dados
|
|||||||
domain: Dev
|
domain: Dev
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- ssh-unified
|
||||||
|
recommended_mcps:
|
||||||
|
- gitea
|
||||||
|
- context7
|
||||||
|
- filesystem
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1498
|
desk_task: 1498
|
||||||
@@ -49,12 +58,13 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
|||||||
- Backup e disaster recovery com testes automatizados
|
- Backup e disaster recovery com testes automatizados
|
||||||
- Migracao de dados e integracao multi-sistema
|
- Migracao de dados e integracao multi-sistema
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"database SQL optimizacao"
|
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"database SQL optimizacao"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"arquitectura dados"
|
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"arquitectura dados"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"AWS" query:"RDS cloud database"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -106,7 +116,7 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
|||||||
## MCPs Relevantes
|
## MCPs Relevantes
|
||||||
- `desk-crm-v3`: Acesso directo à BD Perfex para análise
|
- `desk-crm-v3`: Acesso directo à BD Perfex para análise
|
||||||
- `ssh-unified`: Acesso MySQL em servidores
|
- `ssh-unified`: Acesso MySQL em servidores
|
||||||
- `dify-kb`: KB TI (SQL, optimização), AWS (RDS)
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB TI (SQL, optimização), AWS (RDS)
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
|
|
||||||
@@ -124,9 +134,9 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
|||||||
- SSH, SFTP, servidor management
|
- SSH, SFTP, servidor management
|
||||||
- Usage: `mcp__ssh-unified__*`
|
- Usage: `mcp__ssh-unified__*`
|
||||||
|
|
||||||
✓ **dify-kb** (knowledge)
|
✓ **** (knowledge)
|
||||||
- Knowledge base AI
|
- Knowledge base AI
|
||||||
- Usage: `mcp__dify-kb__*`
|
- Usage: `mcp____*`
|
||||||
|
|
||||||
### Recommended for dev
|
### Recommended for dev
|
||||||
- **gitea** - Repositórios Git, issues, PRs
|
- **gitea** - Repositórios Git, issues, PRs
|
||||||
@@ -138,13 +148,11 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
|||||||
- **cwp** - CentOS Web Panel
|
- **cwp** - CentOS Web Panel
|
||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
|
|
||||||
### All Available (33 total)
|
### 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, wikijs, 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.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -178,13 +186,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### 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
|
/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.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **5 SDKs** (TaskForce teams):
|
You are part of **5 SDKs** (TaskForce teams):
|
||||||
@@ -198,9 +204,6 @@ You are part of **5 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce DeskDev
|
### TaskForce DeskDev
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -5,6 +5,16 @@ role: Assistente de desenvolvimento generalista
|
|||||||
domain: Dev
|
domain: Dev
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- gitea
|
||||||
|
- filesystem
|
||||||
|
recommended_mcps:
|
||||||
|
- context7
|
||||||
|
- ssh-unified
|
||||||
|
- memory-supabase
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1500
|
desk_task: 1500
|
||||||
@@ -16,14 +26,15 @@ tags:
|
|||||||
- claude-code
|
- claude-code
|
||||||
- dev-helper
|
- dev-helper
|
||||||
- code-review
|
- code-review
|
||||||
version: "2.0"
|
version: "2.1"
|
||||||
status: active
|
status: active
|
||||||
quality_score: 70
|
quality_score: 75
|
||||||
compliance:
|
compliance:
|
||||||
sacred_rules: true
|
sacred_rules: true
|
||||||
excellence_standards: true
|
excellence_standards: true
|
||||||
data_sources: true
|
data_sources: true
|
||||||
knowledge_first: true
|
knowledge_first: true
|
||||||
|
security_audit: true
|
||||||
reports_to: Development Lead
|
reports_to: Development Lead
|
||||||
collaborates_with:
|
collaborates_with:
|
||||||
- All development specialists
|
- All development specialists
|
||||||
@@ -34,7 +45,7 @@ escalates_to:
|
|||||||
- Development Lead (decisões arquitectura complexas)
|
- Development Lead (decisões arquitectura complexas)
|
||||||
- Security Compliance Specialist (vulnerabilidades críticas)
|
- Security Compliance Specialist (vulnerabilidades críticas)
|
||||||
created: "2025-01-13"
|
created: "2025-01-13"
|
||||||
updated: "2026-02-04"
|
updated: "2026-02-14"
|
||||||
author: "Descomplicar®"
|
author: "Descomplicar®"
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -57,11 +68,11 @@ Você é um desenvolvedor experiente generalista responsável por:
|
|||||||
- [ ] **Entender Contexto**: Ler código existente ANTES de sugerir mudanças
|
- [ ] **Entender Contexto**: Ler código existente ANTES de sugerir mudanças
|
||||||
- [ ] **Boas Práticas**: Seguir SOLID, DRY, KISS
|
- [ ] **Boas Práticas**: Seguir SOLID, DRY, KISS
|
||||||
- [ ] **Segurança Primeiro**: Identificar vulnerabilidades (SQL injection, XSS)
|
- [ ] **Segurança Primeiro**: Identificar vulnerabilidades (SQL injection, XSS)
|
||||||
|
- [ ] **Security Audit**: Se commit pendente, executar `pnpm audit` - 0 vulnerabilidades ou documentar
|
||||||
- [ ] **Performance**: Considerar impacto em escala
|
- [ ] **Performance**: Considerar impacto em escala
|
||||||
- [ ] **Manutenibilidade**: Código legível > código "clever"
|
- [ ] **Manutenibilidade**: Código legível > código "clever"
|
||||||
- [ ] **Testar**: Validar sugestões quando possível
|
- [ ] **Testar**: Validar sugestões quando possível
|
||||||
- [ ] **Documentar**: Explicar "porquê", não só "como"
|
- [ ] **Documentar**: Explicar "porquê", não só "como"
|
||||||
- [ ] **Consultar Dify KB**: Verificar padrões estabelecidos
|
|
||||||
|
|
||||||
### Output Format Esperado
|
### Output Format Esperado
|
||||||
|
|
||||||
@@ -97,7 +108,7 @@ Você é um desenvolvedor experiente generalista responsável por:
|
|||||||
|
|
||||||
| MCP | Quando Usar |
|
| MCP | Quando Usar |
|
||||||
|-----|-------------|
|
|-----|-------------|
|
||||||
| `dify-kb` | Best practices, padrões arquitectura |
|
| `` | Best practices, padrões arquitectura |
|
||||||
| `memory-supabase` | Soluções anteriores similares |
|
| `memory-supabase` | Soluções anteriores similares |
|
||||||
| `gitea` | Consultar histórico código |
|
| `gitea` | Consultar histórico código |
|
||||||
|
|
||||||
@@ -153,6 +164,36 @@ Você é um desenvolvedor experiente generalista responsável por:
|
|||||||
4. Manter actualizada (parte do PR)
|
4. Manter actualizada (parte do PR)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 5. Pre-Commit Security Check
|
||||||
|
```
|
||||||
|
OBRIGATÓRIO antes de git commit:
|
||||||
|
|
||||||
|
1. Security Audit
|
||||||
|
pnpm audit # Node.js
|
||||||
|
composer audit # PHP
|
||||||
|
|
||||||
|
2. Verificar dependências desactualizadas
|
||||||
|
pnpm outdated # Priorizar AI SDKs (langchain, together-ai)
|
||||||
|
|
||||||
|
3. Environment Safety
|
||||||
|
git diff .env.local # Garantir placeholders, NUNCA keys reais
|
||||||
|
|
||||||
|
4. Type Safety (se TypeScript)
|
||||||
|
pnpm type
|
||||||
|
|
||||||
|
5. Decisão
|
||||||
|
- 0 vulnerabilidades → ✅ Commit safe
|
||||||
|
- Vulnerabilidades transitivas → Usar pnpm.overrides
|
||||||
|
- Vulnerabilidades críticas → Corrigir ou invocar /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ípios SOLID
|
||||||
|
|
||||||
| Princípio | Descrição | Exemplo Anti-Pattern |
|
| Princípio | Descrição | Exemplo Anti-Pattern |
|
||||||
@@ -172,13 +213,14 @@ Você é um desenvolvedor experiente generalista responsável por:
|
|||||||
- **Nomes Vagos**: `data`, `temp`, `x` → Nomes descritivos
|
- **Nomes Vagos**: `data`, `temp`, `x` → Nomes descritivos
|
||||||
- **Comentários Excessivos**: Código deve ser auto-explicativo
|
- **Comentários Excessivos**: Código deve ser auto-explicativo
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"boas praticas SOLID clean code"
|
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"boas praticas SOLID clean code"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"debugging arquitectura troubleshooting"
|
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"debugging arquitectura troubleshooting"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Claude Code" query:"desenvolvimento assistente workflow"
|
mcp__notebooklm__notebook_query notebook_id:"2876d1fe-5cea-4d98-8140-b0e1a81c6bc4" query:"desenvolvimento assistente workflow"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Seguranca" query:"vulnerabilidades code security"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Your Available MCPs
|
## Your Available MCPs
|
||||||
@@ -190,18 +232,16 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Seguranca" query:"vulnerabilida
|
|||||||
- **n8n** - Workflows automation
|
- **n8n** - Workflows automation
|
||||||
- **filesystem** - Ficheiros locais
|
- **filesystem** - Ficheiros locais
|
||||||
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
||||||
- **dify-kb** - Knowledge base AI
|
- **** - Knowledge base AI
|
||||||
- **memory-supabase** - Memória longo prazo
|
- **memory-supabase** - Memória longo prazo
|
||||||
- **cwp** - CentOS Web Panel
|
- **cwp** - CentOS Web Panel
|
||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
desk-crm-v3, 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
|
desk-crm-v3, 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
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -235,20 +275,16 @@ desk-crm-v3, moloni, google-analytics, google-workspace, imap, outline-api, yout
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### 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
|
/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.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Colaboração
|
## Colaboração
|
||||||
|
|
||||||
- **Reports to**: Development Lead
|
- **Reports to**: Development Lead
|
||||||
- **Colabora com**: Todos os development specialists, System Architects, Database Design Specialist, Security Compliance Specialist
|
- **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)
|
- **Escalar para**: Development Lead (decisões arquitectura complexas), Security Compliance Specialist (vulnerabilidades críticas)
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **1 TaskForce** (TaskForce teams):
|
You are part of **1 TaskForce** (TaskForce teams):
|
||||||
@@ -258,9 +294,6 @@ You are part of **1 TaskForce** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
**Collaboration:**
|
**Collaboration:**
|
||||||
- Work with other agents in your TaskForce teams
|
- Work with other agents in your TaskForce teams
|
||||||
- Share knowledge and context across team members
|
- Share knowledge and context across team members
|
||||||
|
|||||||
@@ -5,6 +5,16 @@ role: Líder de desenvolvimento e arquitectura
|
|||||||
domain: Dev
|
domain: Dev
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- gitea
|
||||||
|
- ssh-unified
|
||||||
|
recommended_mcps:
|
||||||
|
- context7
|
||||||
|
- google-workspace
|
||||||
|
- memory-supabase
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1499
|
desk_task: 1499
|
||||||
@@ -49,12 +59,14 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
|||||||
- Decisoes tecnicas e definicao de standards
|
- Decisoes tecnicas e definicao de standards
|
||||||
- Integracao e colaboracao cross-team
|
- Integracao e colaboracao cross-team
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"lideranca tecnica"
|
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"lideranca tecnica"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao de Projetos" query:"coordenacao equipas"
|
mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37ad" query:"coordenacao equipas"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Estrategia" query:"arquitectura solucoes"
|
mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"arquitectura solucoes"
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -89,7 +101,7 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
|||||||
|
|
||||||
### Workflow 2: Decisão Arquitectural
|
### Workflow 2: Decisão Arquitectural
|
||||||
1. Entender problema e contexto
|
1. Entender problema e contexto
|
||||||
2. Pesquisar soluções existentes (memory, dify-kb)
|
2. Pesquisar soluções existentes (memory)
|
||||||
3. Propor 2-3 opções com tradeoffs
|
3. Propor 2-3 opções com tradeoffs
|
||||||
4. Discussão com stakeholders
|
4. Discussão com stakeholders
|
||||||
5. Documentar decisão (ADR - Architecture Decision Record)
|
5. Documentar decisão (ADR - Architecture Decision Record)
|
||||||
@@ -107,7 +119,7 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
|||||||
- `desk-crm-v3`: Gestão de tarefas e projectos
|
- `desk-crm-v3`: Gestão de tarefas e projectos
|
||||||
- `gitea`: Gestão de repositórios e PRs
|
- `gitea`: Gestão de repositórios e PRs
|
||||||
- `memory-supabase`: Histórico de decisões técnicas
|
- `memory-supabase`: Histórico de decisões técnicas
|
||||||
- `dify-kb`: KB Desenvolvimento, Gestão Projectos
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB Desenvolvimento, Gestão Projectos
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
|
|
||||||
@@ -125,9 +137,9 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
|||||||
- Repositórios Git, issues, PRs
|
- Repositórios Git, issues, PRs
|
||||||
- Usage: `mcp__gitea__*`
|
- Usage: `mcp__gitea__*`
|
||||||
|
|
||||||
✓ **dify-kb** (knowledge)
|
✓ **** (knowledge)
|
||||||
- Knowledge base AI
|
- Knowledge base AI
|
||||||
- Usage: `mcp__dify-kb__*`
|
- Usage: `mcp____*`
|
||||||
|
|
||||||
✓ **memory-supabase** (system)
|
✓ **memory-supabase** (system)
|
||||||
- Memória longo prazo
|
- Memória longo prazo
|
||||||
@@ -142,13 +154,11 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
|||||||
- **cwp** - CentOS Web Panel
|
- **cwp** - CentOS Web Panel
|
||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
|
|
||||||
### All Available (33 total)
|
### 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, wikijs, 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.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -182,13 +192,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### 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
|
/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.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **2 SDKs** (TaskForce teams):
|
You are part of **2 SDKs** (TaskForce teams):
|
||||||
|
|||||||
@@ -7,6 +7,16 @@ role: Especialista em desenvolvimento JavaScript fullstack com expertise em fram
|
|||||||
domain: Dev
|
domain: Dev
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- gitea
|
||||||
|
recommended_mcps:
|
||||||
|
- context7
|
||||||
|
- filesystem
|
||||||
|
- ssh-unified
|
||||||
|
- n8n
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
desk_task: 1504
|
desk_task: 1504
|
||||||
@@ -29,8 +39,6 @@ created: '2025-01-13'
|
|||||||
updated: '2026-02-04'
|
updated: '2026-02-04'
|
||||||
author: Descomplicar®
|
author: Descomplicar®
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
# JavaScript Fullstack Specialist Descomplicar
|
# JavaScript Fullstack Specialist Descomplicar
|
||||||
|
|
||||||
Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e backend para entregar aplicacoes web modernas, escalaveis e performantes.
|
Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e backend para entregar aplicacoes web modernas, escalaveis e performantes.
|
||||||
@@ -42,10 +50,13 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
|||||||
- Implementacao de testes automatizados (Jest, Cypress, Playwright)
|
- Implementacao de testes automatizados (Jest, Cypress, Playwright)
|
||||||
- Optimizacao de performance e Core Web Vitals
|
- Optimizacao de performance e Core Web Vitals
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"javascript typescript react node"
|
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"javascript typescript react node"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"fullstack web development modern frameworks"
|
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"fullstack web development modern frameworks"
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
@@ -97,7 +108,7 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
|||||||
## MCPs Relevantes
|
## MCPs Relevantes
|
||||||
- `gitea`: Gestão de repositórios e PRs
|
- `gitea`: Gestão de repositórios e PRs
|
||||||
- `desk-crm-v3`: Tracking de tarefas
|
- `desk-crm-v3`: Tracking de tarefas
|
||||||
- `dify-kb`: KB Desenvolvimento Software, TI
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB Desenvolvimento Software, TI
|
||||||
- `memory-supabase`: Padrões e decisões técnicas
|
- `memory-supabase`: Padrões e decisões técnicas
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -115,9 +126,10 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
|||||||
- Repositórios Git, issues, PRs
|
- Repositórios Git, issues, PRs
|
||||||
- Usage: `mcp__gitea__*`
|
- Usage: `mcp__gitea__*`
|
||||||
|
|
||||||
✓ **dify-kb** (knowledge)
|
✓ **notebooklm** (knowledge primaria)
|
||||||
|
✓ **** (knowledge fallback)
|
||||||
- Knowledge base AI
|
- Knowledge base AI
|
||||||
- Usage: `mcp__dify-kb__*`
|
- Usage: `mcp____*`
|
||||||
|
|
||||||
✓ **memory-supabase** (system)
|
✓ **memory-supabase** (system)
|
||||||
- Memória longo prazo
|
- Memória longo prazo
|
||||||
@@ -132,13 +144,11 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
|||||||
- **cwp** - CentOS Web Panel
|
- **cwp** - CentOS Web Panel
|
||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
|
|
||||||
### All Available (33 total)
|
### 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, wikijs, 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.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -172,13 +182,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### 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
|
/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.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
**Example:** `Skill("skill-name")` invokes the skill.
|
**Example:** `Skill("skill-name")` invokes the skill.
|
||||||
|
|
||||||
|
|
||||||
## Your Team & Responsibilities
|
## Your Team & Responsibilities
|
||||||
|
|
||||||
You are part of **6 SDKs** (TaskForce teams):
|
You are part of **6 SDKs** (TaskForce teams):
|
||||||
@@ -192,9 +200,6 @@ You are part of **6 SDKs** (TaskForce teams):
|
|||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|
||||||
**Your responsibilities in this TaskForce:**
|
**Your responsibilities in this TaskForce:**
|
||||||
|
|
||||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
|
||||||
|
|
||||||
### TaskForce Dashboard
|
### TaskForce Dashboard
|
||||||
|
|
||||||
**Purpose:** NULL
|
**Purpose:** NULL
|
||||||
|
|||||||
@@ -5,6 +5,15 @@ role: Especialista em desenvolvimento Next.js moderno
|
|||||||
domain: Dev
|
domain: Dev
|
||||||
model: sonnet
|
model: sonnet
|
||||||
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
tools: Read, Write, Edit, Bash, Glob, Grep, ToolSearch
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
primary_mcps:
|
||||||
|
- desk-crm-v3
|
||||||
|
- gitea
|
||||||
|
recommended_mcps:
|
||||||
|
- context7
|
||||||
|
- filesystem
|
||||||
|
- stitch
|
||||||
skills:
|
skills:
|
||||||
- _core
|
- _core
|
||||||
- nextjs
|
- nextjs
|
||||||
@@ -79,7 +88,15 @@ Especialista em desenvolvimento Next.js - App Router, Server Components, e arqui
|
|||||||
- Route Handlers
|
- Route Handlers
|
||||||
- Middleware
|
- Middleware
|
||||||
|
|
||||||
## Datasets Dify
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
|
- Cloud e Infraestrutura TI (`f9a79b5a`)
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"<tema>"
|
||||||
|
```
|
||||||
- Desenvolvimento Software
|
- Desenvolvimento Software
|
||||||
- TI
|
- TI
|
||||||
- React
|
- React
|
||||||
@@ -146,7 +163,7 @@ Especialista em desenvolvimento Next.js moderno com App Router, React Server Com
|
|||||||
## MCPs Relevantes
|
## MCPs Relevantes
|
||||||
- `gitea`: Gestão de repositórios Next.js
|
- `gitea`: Gestão de repositórios Next.js
|
||||||
- `desk-crm-v3`: Tracking de desenvolvimento
|
- `desk-crm-v3`: Tracking de desenvolvimento
|
||||||
- `dify-kb`: KB Desenvolvimento Software, React, TI
|
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB Desenvolvimento Software, React, TI
|
||||||
- `ssh-unified`: Deploy (Docker ou Node.js)
|
- `ssh-unified`: Deploy (Docker ou Node.js)
|
||||||
|
|
||||||
## Colaboracao
|
## Colaboracao
|
||||||
@@ -163,18 +180,16 @@ Especialista em desenvolvimento Next.js moderno com App Router, React Server Com
|
|||||||
- **n8n** - Workflows automation
|
- **n8n** - Workflows automation
|
||||||
- **filesystem** - Ficheiros locais
|
- **filesystem** - Ficheiros locais
|
||||||
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
||||||
- **dify-kb** - Knowledge base AI
|
- **** - Knowledge base AI
|
||||||
- **memory-supabase** - Memória longo prazo
|
- **memory-supabase** - Memória longo prazo
|
||||||
- **cwp** - CentOS Web Panel
|
- **cwp** - CentOS Web Panel
|
||||||
- **puppeteer** - Browser automation
|
- **puppeteer** - Browser automation
|
||||||
|
|
||||||
### All Available (33 total)
|
### All Available (32 total)
|
||||||
desk-crm-v3, 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
|
desk-crm-v3, 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
|
||||||
|
|
||||||
**Discovery:** Use ToolSearch to find specific tools.
|
**Discovery:** Use ToolSearch to find specific tools.
|
||||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||||
|
|
||||||
|
|
||||||
## Your Available Skills
|
## Your Available Skills
|
||||||
|
|
||||||
### Primary Skills (Your Domain)
|
### Primary Skills (Your Domain)
|
||||||
@@ -208,7 +223,7 @@ desk-crm-v3, moloni, google-analytics, google-workspace, imap, outline-api, yout
|
|||||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||||
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
- **/desk** - Integração com Desk CRM via ficheiro .desk-project. Auto-det
|
||||||
|
|
||||||
### All Available (54 total)
|
### 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
|
/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.
|
**Discovery:** Use the Skill tool to invoke skills.
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ primary_mcps:
|
|||||||
- desk-crm-v3 # Business operations
|
- desk-crm-v3 # Business operations
|
||||||
- gitea # Version control
|
- gitea # Version control
|
||||||
- ssh-unified # Server deployment
|
- ssh-unified # Server deployment
|
||||||
- dify-kb # Knowledge base
|
|
||||||
recommended_mcps:
|
recommended_mcps:
|
||||||
- context7 # Technical documentation
|
- context7 # Technical documentation
|
||||||
- n8n # Workflow automation
|
- n8n # Workflow automation
|
||||||
@@ -95,11 +94,14 @@ Especialista senior em desenvolvimento PHP fullstack com expertise em frameworks
|
|||||||
- Implementar seguranca OWASP e validacao de dados
|
- Implementar seguranca OWASP e validacao de dados
|
||||||
- Integrar sistemas WordPress, WooCommerce e PerfexCRM
|
- Integrar sistemas WordPress, WooCommerce e PerfexCRM
|
||||||
|
|
||||||
## Datasets Dify (Consultar SEMPRE)
|
## Knowledge Sources (Consultar SEMPRE)
|
||||||
|
|
||||||
|
### NotebookLM (Primario - usar PRIMEIRO)
|
||||||
|
|
||||||
```
|
```
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"PHP Laravel Symfony APIs"
|
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"PHP Laravel Symfony APIs"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"PHP WordPress WooCommerce"
|
mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"PHP WordPress WooCommerce"
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"backend MySQL PostgreSQL arquitectura"
|
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"backend MySQL PostgreSQL arquitectura"
|
||||||
```
|
```
|
||||||
|
|
||||||
## System Prompt
|
## System Prompt
|
||||||
|
|||||||
@@ -1,13 +1,51 @@
|
|||||||
{
|
{
|
||||||
"description": "Dify KB datasets for Development Tools domain",
|
"description": "Knowledge sources for Development Tools domain",
|
||||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
"sources": {
|
||||||
"datasets": [
|
"notebooklm": {
|
||||||
{"id": "98e74ec7-4b4d-4876-8321-7f26ae66c3a6", "name": "Claude Code", "priority": 1, "document_count": 53, "word_count": 1241283},
|
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||||
{"id": "02ca690a-a901-4034-9165-5ef42830f91e", "name": "MCP Servers", "priority": 1, "document_count": 22, "word_count": 158091},
|
"query_tool": "mcp__notebooklm__notebook_query",
|
||||||
{"id": "eafd864e-5331-4a1d-a7e2-603ec263e2e1", "name": "VS Code", "priority": 2, "document_count": 52, "word_count": 10450973},
|
"notebooks": [
|
||||||
{"id": "66ce30ab-a630-402b-8ae8-c3f44312e228", "name": "Windsurf", "priority": 2, "document_count": 5, "word_count": 98903},
|
{
|
||||||
{"id": "2e68ac58-12cc-4c6f-b000-2bfff8fe6fcb", "name": "Claude Computer Use", "priority": 2, "document_count": 4, "word_count": 17078},
|
"id": "2876d1fe-5cea-4d98-8140-b0e1a81c6bc4",
|
||||||
{"id": "e7c7decc-0ded-4351-ab14-b110b3c38ec9", "name": "Desenvolvimento de Software", "priority": 1, "document_count": 2, "word_count": 534153},
|
"title": "Claude Code",
|
||||||
{"id": "e38a510f-ca93-4407-8b44-c4c66efe01f8", "name": "Obsidian + Claude Code", "priority": 2, "document_count": 121, "word_count": 2292847}
|
"topics": [
|
||||||
]
|
"claude",
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "73102308-70ef-403e-9be9-eae0cfc62d55",
|
||||||
|
"title": "Desenvolvimento de MCPs",
|
||||||
|
"topics": [
|
||||||
|
"mcp",
|
||||||
|
"servers"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53",
|
||||||
|
"title": "AI Code Editors",
|
||||||
|
"topics": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "24947ffa-0019-448a-a340-2f4a275d2eb1",
|
||||||
|
"title": "Programacao",
|
||||||
|
"topics": [
|
||||||
|
"desenvolvimento",
|
||||||
|
"software"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131",
|
||||||
|
"title": "Obsidian + Claude",
|
||||||
|
"topics": [
|
||||||
|
"obsidian",
|
||||||
|
"claude",
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
---
|
---
|
||||||
name: chrome
|
name: chrome
|
||||||
description: Chrome browser integration for Claude Code. Navigate pages, fill forms, debug console, extract data, test web apps, automate tasks. Use when user mentions "chrome", "browser", "navegar site", "abrir pagina", "testar site", "preencher formulario", "extrair dados", "screenshot site", "google docs", "authenticated site", "gravar gif", "console errors".
|
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.
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 1.0.0
|
|
||||||
quality_score: 80
|
|
||||||
user_invocable: true
|
|
||||||
allowed-tools: Bash, Read, Write, Glob
|
allowed-tools: Bash, Read, Write, Glob
|
||||||
---
|
---
|
||||||
|
|
||||||
# /chrome - Chrome Browser Integration
|
# /chrome - Chrome Browser Integration
|
||||||
|
|
||||||
Integra Claude Code com o Chrome para automacao browser, testes, debug e extraccao de dados.
|
Integra Claude Code com o Chrome para automacao browser, testes, debug, performance e extraccao de dados. Suporta dois backends: **Claude in Chrome** (extensao) e **Chrome DevTools MCP** (npm).
|
||||||
|
|
||||||
## Pre-Requisitos
|
## Backends Disponiveis
|
||||||
|
|
||||||
|
### Backend A: Claude in Chrome (Extensao)
|
||||||
|
|
||||||
|
Extensao oficial Anthropic. Requer instalacao manual no browser.
|
||||||
|
|
||||||
| Requisito | Minimo | Verificar |
|
| Requisito | Minimo | Verificar |
|
||||||
|-----------|--------|-----------|
|
|-----------|--------|-----------|
|
||||||
@@ -24,29 +24,59 @@ Integra Claude Code com o Chrome para automacao browser, testes, debug e extracc
|
|||||||
|
|
||||||
**Limitacoes:** Apenas Google Chrome (nao Brave/Arc). Nao suportado em WSL.
|
**Limitacoes:** Apenas Google Chrome (nao Brave/Arc). Nao suportado em WSL.
|
||||||
|
|
||||||
## Activacao
|
**Activacao:**
|
||||||
|
|
||||||
### Por sessao
|
|
||||||
```bash
|
```bash
|
||||||
|
# Por sessao
|
||||||
claude --chrome
|
claude --chrome
|
||||||
```
|
|
||||||
|
|
||||||
### Por defeito (aliases .bashrc)
|
# Por defeito (alias .bashrc)
|
||||||
```bash
|
|
||||||
alias cc="claude --permission-mode bypassPermissions --chrome"
|
alias cc="claude --permission-mode bypassPermissions --chrome"
|
||||||
```
|
|
||||||
|
|
||||||
### Dentro de sessao activa
|
# Dentro de sessao activa
|
||||||
```
|
/chrome -> "Enabled by default"
|
||||||
/chrome
|
|
||||||
# Seleccionar "Enabled by default"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Ver ferramentas disponiveis
|
# Ver ferramentas
|
||||||
```
|
|
||||||
/mcp -> seleccionar claude-in-chrome
|
/mcp -> seleccionar claude-in-chrome
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Backend B: Chrome DevTools MCP (npm)
|
||||||
|
|
||||||
|
Pacote oficial Google (`chrome-devtools-mcp`). Controla Chrome via DevTools Protocol. Nao requer extensao.
|
||||||
|
|
||||||
|
| Requisito | Minimo | Verificar |
|
||||||
|
|-----------|--------|-----------|
|
||||||
|
| Google Chrome | Instalado | `google-chrome --version` |
|
||||||
|
| Node.js | v18+ | `node --version` |
|
||||||
|
| chrome-devtools-mcp | latest | `claude mcp list` |
|
||||||
|
|
||||||
|
**Instalacao:**
|
||||||
|
```bash
|
||||||
|
claude mcp add chrome-devtools --scope user -- npx -y chrome-devtools-mcp@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**Activacao:**
|
||||||
|
```bash
|
||||||
|
# Lancar Chrome com remote debugging
|
||||||
|
google-chrome --remote-debugging-port=9222
|
||||||
|
|
||||||
|
# Reiniciar sessao Claude Code para carregar ferramentas
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ferramentas disponibilizadas:**
|
||||||
|
- `page_navigate`, `page_go_back`, `page_go_forward` - Navegacao
|
||||||
|
- `page_screenshot` - Captura de ecra
|
||||||
|
- `page_click`, `page_type`, `page_select_option` - Interaccao
|
||||||
|
- `page_execute_javascript` - Executar JS no contexto da pagina
|
||||||
|
- `page_wait_for_selector` - Esperar por elementos
|
||||||
|
- `console_get_logs` - Ler consola (logs, errors, warnings)
|
||||||
|
- `network_get_requests`, `network_get_response_body` - Inspeccionar rede
|
||||||
|
- `dom_get_element`, `dom_query_selector` - Inspeccionar DOM
|
||||||
|
- `css_get_computed_styles`, `css_get_matched_styles` - Inspeccionar CSS
|
||||||
|
- `performance_start_trace`, `performance_stop_trace` - Gravar traces
|
||||||
|
- `performance_analyze_insight` - Metricas automaticas (LCP, TBT, CLS)
|
||||||
|
- `accessibility_get_tree` - Arvore de acessibilidade
|
||||||
|
- `storage_get_cookies`, `storage_get_local_storage` - Inspecionar storage
|
||||||
|
|
||||||
## Capacidades
|
## Capacidades
|
||||||
|
|
||||||
### 1. Navegacao e Interaccao
|
### 1. Navegacao e Interaccao
|
||||||
@@ -58,32 +88,47 @@ alias cc="claude --permission-mode bypassPermissions --chrome"
|
|||||||
|
|
||||||
### 2. Debug e Diagnostico
|
### 2. Debug e Diagnostico
|
||||||
- Ler console logs, errors, warnings
|
- Ler console logs, errors, warnings
|
||||||
- Inspeccionar DOM state
|
- Inspeccionar DOM state e CSS computado
|
||||||
- Verificar network requests
|
- Verificar network requests e response bodies
|
||||||
- Ler JavaScript errors em tempo real
|
- Ler JavaScript errors em tempo real
|
||||||
|
- Inspeccionar cookies, localStorage, sessionStorage
|
||||||
|
|
||||||
### 3. Extraccao de Dados
|
### 3. Performance (DevTools MCP)
|
||||||
|
- Gravar performance traces completos
|
||||||
|
- Metricas automaticas: LCP, TBT, CLS, FCP, TTFB
|
||||||
|
- Identificar JavaScript nao utilizado
|
||||||
|
- Analise de recursos (tamanho, tempo de carga)
|
||||||
|
- Equivalente a Lighthouse audit on-demand
|
||||||
|
|
||||||
|
### 4. Acessibilidade (DevTools MCP)
|
||||||
|
- Arvore de acessibilidade completa
|
||||||
|
- Verificar roles ARIA, labels, estados
|
||||||
|
- Identificar elementos sem texto alternativo
|
||||||
|
|
||||||
|
### 5. Extraccao de Dados
|
||||||
- Extrair texto estruturado de paginas
|
- Extrair texto estruturado de paginas
|
||||||
- Scraping de tabelas, listas, precos
|
- Scraping de tabelas, listas, precos
|
||||||
- Guardar dados como CSV/JSON local
|
- Guardar dados como CSV/JSON local
|
||||||
- Ler conteudo de paginas autenticadas
|
- Ler conteudo de paginas autenticadas (Chrome extensao)
|
||||||
|
- Query DOM com selectores CSS/XPath
|
||||||
|
|
||||||
### 4. Testes Web
|
### 6. Testes Web
|
||||||
- Testar forms com dados invalidos
|
- Testar forms com dados invalidos
|
||||||
- Verificar UI contra mocks
|
- Verificar UI contra mocks
|
||||||
- Validar user flows completos
|
- Validar user flows completos
|
||||||
- Testar responsividade
|
- Testar responsividade
|
||||||
|
- Monitorizar network requests durante testes
|
||||||
|
|
||||||
### 5. Sites Autenticados
|
### 7. Sites Autenticados (Chrome extensao)
|
||||||
- Google Docs, Gmail, Sheets
|
- Google Docs, Gmail, Sheets
|
||||||
- Notion, Slack web
|
- Notion, Slack web
|
||||||
- CRMs, dashboards
|
- CRMs, dashboards
|
||||||
- Qualquer site com sessao activa no Chrome
|
- Qualquer site com sessao activa no Chrome
|
||||||
|
|
||||||
### 6. Automacao
|
### 8. Automacao
|
||||||
- Data entry repetitivo
|
- Data entry repetitivo
|
||||||
- Multi-site workflows
|
- Multi-site workflows
|
||||||
- Gravar demos como GIF
|
- Gravar demos como GIF (Chrome extensao)
|
||||||
- Preencher CRMs a partir de CSV
|
- Preencher CRMs a partir de CSV
|
||||||
|
|
||||||
## Workflows Comuns
|
## Workflows Comuns
|
||||||
@@ -124,35 +169,77 @@ Verifica o meu calendario para reunioes amanha, depois para cada
|
|||||||
reuniao com participante externo, pesquisa o site da empresa.
|
reuniao com participante externo, pesquisa o site da empresa.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Gravar demo GIF
|
### Gravar demo GIF (Chrome extensao)
|
||||||
```
|
```
|
||||||
Grava um GIF mostrando o fluxo de checkout, desde adicionar item
|
Grava um GIF mostrando o fluxo de checkout, desde adicionar item
|
||||||
ao carrinho ate a pagina de confirmacao.
|
ao carrinho ate a pagina de confirmacao.
|
||||||
```
|
```
|
||||||
|
|
||||||
## Chrome vs Puppeteer vs WebFetch
|
### Performance audit (DevTools MCP)
|
||||||
|
```
|
||||||
|
Abre a pagina example.com, grava um performance trace durante 5 segundos
|
||||||
|
e analisa LCP, TBT e CLS. Sugere melhorias.
|
||||||
|
```
|
||||||
|
|
||||||
| Feature | Chrome (`--chrome`) | Puppeteer MCP | WebFetch |
|
### Debug network (DevTools MCP)
|
||||||
|---------|-------------------|---------------|----------|
|
```
|
||||||
| Sessoes autenticadas | Sim | Nao | Nao |
|
Abre a pagina do dashboard, monitoriza os requests de API
|
||||||
| Janela visivel | Sim | Opcional | N/A |
|
e identifica quais estao a falhar ou demorar mais de 2 segundos.
|
||||||
| Sites privados | Sim (se logado) | Nao | Nao |
|
```
|
||||||
| Headless | Nao | Sim | Sim |
|
|
||||||
| Interaccao UI | Completa | Completa | Nao |
|
### Inspeccionar acessibilidade (DevTools MCP)
|
||||||
| Screenshots | Sim | Sim | Nao |
|
```
|
||||||
| Gravar GIF | Sim | Nao | Nao |
|
Abre a pagina de contacto e verifica a arvore de acessibilidade.
|
||||||
| Console logs | Sim | Sim | Nao |
|
Identifica elementos sem labels ou roles ARIA incorrectos.
|
||||||
| Sem Chrome | N/A | Funciona | Funciona |
|
```
|
||||||
| Context usage | Alto (tools loaded) | Medio | Baixo |
|
|
||||||
|
### 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:**
|
**Regra de decisao:**
|
||||||
- Precisa de login/sessao? -> **Chrome**
|
- Precisa de login/sessao + GIF? -> **Chrome Extensao**
|
||||||
- Automacao headless? -> **Puppeteer MCP**
|
- Debug/performance/network? -> **DevTools MCP**
|
||||||
|
- Automacao headless CI/CD? -> **Puppeteer MCP**
|
||||||
- Apenas ler conteudo publico? -> **WebFetch**
|
- Apenas ler conteudo publico? -> **WebFetch**
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
### Extensao nao detectada
|
### DevTools MCP nao conecta
|
||||||
|
1. Verificar Chrome lancado com `--remote-debugging-port=9222`
|
||||||
|
2. Testar: `curl http://localhost:9222/json/version`
|
||||||
|
3. Verificar MCP registado: `claude mcp list`
|
||||||
|
4. Reiniciar sessao Claude Code
|
||||||
|
|
||||||
|
### DevTools MCP sem ferramentas
|
||||||
|
1. Verificar: `claude mcp list | grep chrome-devtools`
|
||||||
|
2. Se nao aparece: `claude mcp add chrome-devtools --scope user -- npx -y chrome-devtools-mcp@latest`
|
||||||
|
3. Reiniciar sessao Claude Code
|
||||||
|
|
||||||
|
### Extensao nao detectada (Chrome extensao)
|
||||||
1. Verificar extensao em `chrome://extensions`
|
1. Verificar extensao em `chrome://extensions`
|
||||||
2. Verificar versao Claude Code: `claude --version` (>= 2.0.73)
|
2. Verificar versao Claude Code: `claude --version` (>= 2.0.73)
|
||||||
3. Confirmar Chrome aberto
|
3. Confirmar Chrome aberto
|
||||||
@@ -183,12 +270,20 @@ ao carrinho ate a pagina de confirmacao.
|
|||||||
# Chrome instalado?
|
# Chrome instalado?
|
||||||
google-chrome --version
|
google-chrome --version
|
||||||
|
|
||||||
# Native host configurado?
|
|
||||||
cat ~/.config/google-chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json
|
|
||||||
|
|
||||||
# Claude Code compativel?
|
# Claude Code compativel?
|
||||||
claude --version
|
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?
|
# Host script existe?
|
||||||
ls -la ~/.claude/chrome/chrome-native-host
|
ls -la ~/.claude/chrome/chrome-native-host
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: db-design
|
name: db-design
|
||||||
description: Database schema design and optimization. Creates normalized schemas,
|
description: Design e optimização de schemas de base de dados — normalização, índices, planos de migração e particionamento.
|
||||||
indexes, and migration plans. Use when user mentions "database design", "schema",
|
|
||||||
"modelo dados", "database optimization", "sql design".
|
|
||||||
author: Descomplicar® Crescimento Digital
|
|
||||||
version: 1.0.0
|
|
||||||
quality_score: 75
|
|
||||||
user_invocable: true
|
|
||||||
desk_task: 1469
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Database Design Specialist
|
# Database Design Specialist
|
||||||
@@ -196,7 +189,7 @@ Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes data
|
|||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// Pesquisar optimização MySQL
|
// Pesquisar optimização MySQL
|
||||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({
|
||||||
dataset_id: "7f63ec0c-6321-488c-b107-980140199850",
|
dataset_id: "7f63ec0c-6321-488c-b107-980140199850",
|
||||||
query: "mysql index optimization slow query"
|
query: "mysql index optimization slow query"
|
||||||
})
|
})
|
||||||
|
|||||||
463
dev-tools/skills/dep-audit/SKILL.md
Normal file
463
dev-tools/skills/dep-audit/SKILL.md
Normal file
@@ -0,0 +1,463 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
|
---
|
||||||
|
|
||||||
|
# /dep-audit - Dependency Security Audit Pre-Commit
|
||||||
|
|
||||||
|
> **Renomeado de /security-check (12-03-2026).** `/security-check` e agora a skill de auditoria de infraestrutura (plugin infraestrutura).
|
||||||
|
|
||||||
|
Auditoria de segurança completa para projectos Node.js e PHP. **Obrigatória antes de commits** (Regra CLAUDE.md #47).
|
||||||
|
|
||||||
|
## Contexto NotebookLM
|
||||||
|
|
||||||
|
ANTES de executar, consultar notebooks para contexto especializado:
|
||||||
|
|
||||||
|
| Notebook | ID | Consultar quando |
|
||||||
|
|----------|-----|-----------------|
|
||||||
|
| Programação | 24947ffa-0019-448a-a340-2f4a275d2eb1 | Para contexto de vulnerabilidades |
|
||||||
|
|
||||||
|
```
|
||||||
|
mcp__notebooklm__notebook_query({
|
||||||
|
notebook_id: "24947ffa-0019-448a-a340-2f4a275d2eb1",
|
||||||
|
query: "<adaptar ao contexto do pedido do utilizador>"
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Integrar insights do NotebookLM nas recomendações e decisões.
|
||||||
|
|
||||||
|
### Procedimentos relacionados
|
||||||
|
|
||||||
|
- [PROC-DEV-SEC-001-Security-Audit.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/Seguranca/PROC-DEV-SEC-001-Security-Audit.md)
|
||||||
|
- [PROC-Security-Audit-API-Keys.md](file:///media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/D7-Tecnologia/Seguranca/PROC-Security-Audit-API-Keys.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quando Usar
|
||||||
|
|
||||||
|
### OBRIGATÓRIO:
|
||||||
|
- Antes de `git commit`
|
||||||
|
- Antes de `git push`
|
||||||
|
- Antes de criar Pull Request
|
||||||
|
- Antes de deploy para produção
|
||||||
|
|
||||||
|
### RECOMENDADO:
|
||||||
|
- Após `pnpm add <package>` (especialmente AI SDKs)
|
||||||
|
- Semanalmente em projectos activos
|
||||||
|
- Após actualizar dependências major
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Workflow Completo
|
||||||
|
|
||||||
|
### 1. Detectar Tipo de Projecto
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Verificar package managers
|
||||||
|
if [ -f "package.json" ]; then
|
||||||
|
# Node.js detected
|
||||||
|
MANAGER="pnpm" # ou npm/yarn
|
||||||
|
elif [ -f "composer.json" ]; then
|
||||||
|
# PHP detected
|
||||||
|
MANAGER="composer"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Dependency Security Audit
|
||||||
|
|
||||||
|
**Node.js:**
|
||||||
|
```bash
|
||||||
|
pnpm audit --json > ~/.claude-work/security-audit.json
|
||||||
|
```
|
||||||
|
|
||||||
|
**PHP:**
|
||||||
|
```bash
|
||||||
|
composer audit --format=json > ~/.claude-work/security-audit.json
|
||||||
|
```
|
||||||
|
|
||||||
|
**Parse resultados:**
|
||||||
|
- Contar: critical, high, moderate, low
|
||||||
|
- Identificar se são directas ou transitivas
|
||||||
|
- Listar pacotes afectados
|
||||||
|
|
||||||
|
### 3. Outdated Dependencies
|
||||||
|
|
||||||
|
**Node.js:**
|
||||||
|
```bash
|
||||||
|
pnpm outdated --json > ~/.claude-work/security-outdated.json
|
||||||
|
```
|
||||||
|
|
||||||
|
**Priorizar:**
|
||||||
|
- AI SDKs: langchain, together-ai, @tavily/core, @langchain/core
|
||||||
|
- Security packages: @auth/*, axios, form-data
|
||||||
|
- Framework core: next, react, prisma
|
||||||
|
|
||||||
|
### 4. Environment Safety Check
|
||||||
|
|
||||||
|
**Verificar ficheiros:**
|
||||||
|
```bash
|
||||||
|
# Lista de ficheiros a verificar
|
||||||
|
FILES=(.env .env.local .env.production .env.development)
|
||||||
|
|
||||||
|
for file in "${FILES[@]}"; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
# Verificar se tem placeholders ou keys reais
|
||||||
|
grep -E "(API_KEY|SECRET|TOKEN|PASSWORD)" "$file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
**Validação:**
|
||||||
|
- ✅ `API_KEY=placeholder` (safe)
|
||||||
|
- ❌ `API_KEY=sk-proj-abc123...` (UNSAFE - real key)
|
||||||
|
|
||||||
|
### 5. Type Safety (se TypeScript)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Verificar se é TypeScript
|
||||||
|
if [ -f "tsconfig.json" ]; then
|
||||||
|
pnpm type # ou tsc --noEmit
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Análise de Risco AI SDKs
|
||||||
|
|
||||||
|
**Padrões conhecidos:**
|
||||||
|
|
||||||
|
| Pacote | Risco | Acção |
|
||||||
|
|--------|-------|-------|
|
||||||
|
| `langchain` | Alto | Verificar @langchain/core |
|
||||||
|
| `together-ai` | Alto | form-data transitiva |
|
||||||
|
| `@tavily/core` | Alto | axios transitiva |
|
||||||
|
| `@platejs/ai` | Médio | lodash transitiva |
|
||||||
|
|
||||||
|
**Workflow AI SDKs:**
|
||||||
|
```bash
|
||||||
|
# 1. Verificar se @langchain/core está desactualizado
|
||||||
|
pnpm list @langchain/core
|
||||||
|
|
||||||
|
# 2. Se versão < 0.3.80 (vulnerável)
|
||||||
|
pnpm add @langchain/core@latest
|
||||||
|
|
||||||
|
# 3. Re-audit
|
||||||
|
pnpm audit
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Gerar Relatório
|
||||||
|
|
||||||
|
**Formato output:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Security Audit Report
|
||||||
|
|
||||||
|
**Status:** [✅ SAFE | ⚠️ ISSUES FOUND | ❌ CRITICAL]
|
||||||
|
**Data:** YYYY-MM-DD HH:MM
|
||||||
|
|
||||||
|
| Category | Status |
|
||||||
|
|----------|--------|
|
||||||
|
| Vulnerabilities | [N critical, M high, P moderate, Q low] |
|
||||||
|
| Outdated Packages | N total (M major updates) |
|
||||||
|
| Environment Safety | ✅ Placeholders only / ❌ Real keys found |
|
||||||
|
| Type Safety | ✅ 0 errors / ❌ N errors |
|
||||||
|
|
||||||
|
### Vulnerabilities Detail
|
||||||
|
|
||||||
|
#### Critical (N)
|
||||||
|
- package@version (via path) - description
|
||||||
|
- **Patched:** >=safe-version
|
||||||
|
- **Action:** [Override | Update | Replace]
|
||||||
|
|
||||||
|
#### High (M)
|
||||||
|
[...]
|
||||||
|
|
||||||
|
### Outdated Packages (Priority)
|
||||||
|
|
||||||
|
**AI SDKs:**
|
||||||
|
- langchain: current → latest
|
||||||
|
- @langchain/core: current → latest (SECURITY UPDATE)
|
||||||
|
|
||||||
|
**Framework:**
|
||||||
|
- next: current → latest
|
||||||
|
|
||||||
|
### Action Required
|
||||||
|
|
||||||
|
**Priority 1 (Critical):**
|
||||||
|
1. [Acção específica]
|
||||||
|
|
||||||
|
**Priority 2 (High):**
|
||||||
|
1. [Acção específica]
|
||||||
|
|
||||||
|
**Priority 3 (Maintenance):**
|
||||||
|
1. [Acção específica]
|
||||||
|
|
||||||
|
### Safe to Commit?
|
||||||
|
|
||||||
|
[✅ YES | ⚠️ YES (with documentation) | ❌ NO (fix critical first)]
|
||||||
|
|
||||||
|
**If YES with documentation:**
|
||||||
|
```
|
||||||
|
git commit -m "feat: feature X
|
||||||
|
|
||||||
|
Known vulnerabilities (will be resolved):
|
||||||
|
- package@version (severity) - waiting for upstream update
|
||||||
|
|
||||||
|
Mitigation: [explanation]
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
**If NO:**
|
||||||
|
Fix critical/high vulnerabilities first. See PROC-DEV-SEC-001 for guidance.
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. Criar Flag
|
||||||
|
|
||||||
|
```bash
|
||||||
|
touch ~/.claude-work/.last-security-audit
|
||||||
|
```
|
||||||
|
|
||||||
|
**Propósito:** Hook pre-git-commit verifica esta flag. Se existe e < 1h, permite commit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Recomendações Específicas
|
||||||
|
|
||||||
|
### Para Vulnerabilidades Transitivas
|
||||||
|
|
||||||
|
**Exemplo: form-data via together-ai**
|
||||||
|
|
||||||
|
```json
|
||||||
|
// package.json
|
||||||
|
{
|
||||||
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"form-data": ">=4.0.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Depois:
|
||||||
|
```bash
|
||||||
|
pnpm install
|
||||||
|
pnpm audit # Verificar se resolveu
|
||||||
|
```
|
||||||
|
|
||||||
|
### Para Dependências Incompatíveis
|
||||||
|
|
||||||
|
**Exemplo: @langchain/core desactualizado**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# langchain pina versão antiga
|
||||||
|
# Solução: instalar como dependência explícita
|
||||||
|
pnpm add @langchain/core@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Para Vulnerabilidades Críticas
|
||||||
|
|
||||||
|
**Workflow:**
|
||||||
|
1. Verificar se há fix disponível
|
||||||
|
2. Se sim: actualizar
|
||||||
|
3. Se não: avaliar alternativas ao package
|
||||||
|
4. Se nenhuma: escalar para Security Compliance Specialist
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Output Examples
|
||||||
|
|
||||||
|
### Exemplo 1: Clean (0 vulnerabilities)
|
||||||
|
|
||||||
|
```
|
||||||
|
## Security Audit Report
|
||||||
|
|
||||||
|
**Status:** ✅ SAFE
|
||||||
|
**Data:** 2026-02-14 03:00
|
||||||
|
|
||||||
|
| Category | Status |
|
||||||
|
|----------|--------|
|
||||||
|
| Vulnerabilities | 0 (all categories) ✅ |
|
||||||
|
| Outdated Packages | 3 (1 major) |
|
||||||
|
| Environment Safety | ✅ Placeholders only |
|
||||||
|
| Type Safety | ✅ 0 errors |
|
||||||
|
|
||||||
|
### Outdated Packages
|
||||||
|
|
||||||
|
**Framework:**
|
||||||
|
- next: 16.1.6 → 16.2.0 (minor)
|
||||||
|
|
||||||
|
**Action Required:** Optional - update at convenience
|
||||||
|
|
||||||
|
### Safe to Commit?
|
||||||
|
|
||||||
|
✅ **YES** - No security issues found
|
||||||
|
|
||||||
|
Created flag: ~/.claude-work/.last-security-audit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Exemplo 2: Transitivas (precisa overrides)
|
||||||
|
|
||||||
|
```
|
||||||
|
## Security Audit Report
|
||||||
|
|
||||||
|
**Status:** ⚠️ ISSUES FOUND (transitivas)
|
||||||
|
**Data:** 2026-02-14 03:00
|
||||||
|
|
||||||
|
| Category | Status |
|
||||||
|
|----------|--------|
|
||||||
|
| Vulnerabilities | 0 critical, 0 high, 2 moderate, 1 low |
|
||||||
|
| Outdated Packages | 5 (2 major) |
|
||||||
|
| Environment Safety | ✅ Placeholders only |
|
||||||
|
| Type Safety | ✅ 0 errors |
|
||||||
|
|
||||||
|
### Vulnerabilities Detail
|
||||||
|
|
||||||
|
#### Moderate (2)
|
||||||
|
- lodash@4.17.21 (via @platejs/ai)
|
||||||
|
- **Issue:** Prototype pollution
|
||||||
|
- **Patched:** >=4.17.23
|
||||||
|
- **Action:** Override
|
||||||
|
|
||||||
|
- undici@6.22.0 (via @platejs/juice → cheerio)
|
||||||
|
- **Issue:** Resource exhaustion
|
||||||
|
- **Patched:** >=6.23.0
|
||||||
|
- **Action:** Override
|
||||||
|
|
||||||
|
#### Low (1)
|
||||||
|
- cookie@0.6.0 (via @auth/core)
|
||||||
|
- **Issue:** Out of bounds characters
|
||||||
|
- **Patched:** >=0.7.0
|
||||||
|
- **Action:** Override
|
||||||
|
|
||||||
|
### Recommended Fix
|
||||||
|
|
||||||
|
Add to package.json:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"lodash": ">=4.17.23",
|
||||||
|
"undici": ">=6.23.0",
|
||||||
|
"cookie": ">=0.7.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run: `pnpm install && pnpm audit`
|
||||||
|
|
||||||
|
### Safe to Commit?
|
||||||
|
|
||||||
|
⚠️ **YES (with documentation)**
|
||||||
|
|
||||||
|
Document in commit message:
|
||||||
|
- 3 moderate/low vulnerabilities (all transitivas)
|
||||||
|
- Fixed with pnpm.overrides
|
||||||
|
```
|
||||||
|
|
||||||
|
### Exemplo 3: Critical (bloquear commit)
|
||||||
|
|
||||||
|
```
|
||||||
|
## Security Audit Report
|
||||||
|
|
||||||
|
**Status:** ❌ CRITICAL
|
||||||
|
**Data:** 2026-02-14 03:00
|
||||||
|
|
||||||
|
| Category | Status |
|
||||||
|
|----------|--------|
|
||||||
|
| Vulnerabilities | 1 critical, 0 high, 0 moderate, 0 low |
|
||||||
|
| Outdated Packages | 8 (3 major) |
|
||||||
|
| Environment Safety | ✅ Placeholders only |
|
||||||
|
| Type Safety | ✅ 0 errors |
|
||||||
|
|
||||||
|
### Vulnerabilities Detail
|
||||||
|
|
||||||
|
#### Critical (1)
|
||||||
|
- form-data@4.0.3 (via together-ai → @types/node-fetch)
|
||||||
|
- **Issue:** Unsafe random function in boundary selection
|
||||||
|
- **Patched:** >=4.0.4
|
||||||
|
- **Action:** Override OR replace together-ai
|
||||||
|
|
||||||
|
### Immediate Action Required
|
||||||
|
|
||||||
|
**Option 1: Override (quick fix)**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"pnpm": {
|
||||||
|
"overrides": {
|
||||||
|
"form-data": ">=4.0.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option 2: Evaluate alternatives**
|
||||||
|
- Check if together-ai is essential
|
||||||
|
- Evaluate alternative AI SDKs
|
||||||
|
- Contact Security Compliance Specialist
|
||||||
|
|
||||||
|
### Safe to Commit?
|
||||||
|
|
||||||
|
❌ **NO** - Fix critical vulnerability first
|
||||||
|
|
||||||
|
DO NOT create flag. DO NOT commit.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Integration
|
||||||
|
|
||||||
|
### Com Hook pre-git-commit
|
||||||
|
|
||||||
|
Hook verifica:
|
||||||
|
```bash
|
||||||
|
~/.claude-work/.last-security-audit
|
||||||
|
```
|
||||||
|
|
||||||
|
Se ficheiro existe e < 1h → permite commit
|
||||||
|
Se não existe ou > 1h → **BLOQUEIA** commit
|
||||||
|
|
||||||
|
### Com /time
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Workflow típico
|
||||||
|
/time start 1446 # Tarefa Desk
|
||||||
|
# ... fazer alterações ...
|
||||||
|
/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
|
||||||
512
dev-tools/skills/docx/SKILL.md
Normal file
512
dev-tools/skills/docx/SKILL.md
Normal file
@@ -0,0 +1,512 @@
|
|||||||
|
---
|
||||||
|
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."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Criacao, edicao e analise de documentos DOCX
|
||||||
|
|
||||||
|
## Visao geral
|
||||||
|
|
||||||
|
Um ficheiro .docx e um arquivo ZIP contendo ficheiros XML.
|
||||||
|
|
||||||
|
## Referencia rapida
|
||||||
|
|
||||||
|
| Tarefa | Abordagem |
|
||||||
|
|--------|-----------|
|
||||||
|
| Ler/analisar conteudo | `pandoc` ou descompactar para XML bruto |
|
||||||
|
| Criar novo documento | Usar `docx-js` - ver seccao Criar Novos Documentos |
|
||||||
|
| Editar documento existente | Descompactar -> editar XML -> recompactar - ver seccao Editar Documentos Existentes |
|
||||||
|
|
||||||
|
### Converter .doc para .docx
|
||||||
|
|
||||||
|
Ficheiros legacy `.doc` devem ser convertidos antes de editar:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/office/soffice.py --headless --convert-to docx document.doc
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ler conteudo
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Extracao de texto com tracked changes
|
||||||
|
pandoc --track-changes=all document.docx -o output.md
|
||||||
|
|
||||||
|
# Acesso ao XML bruto
|
||||||
|
python scripts/office/unpack.py document.docx unpacked/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Converter para imagens
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/office/soffice.py --headless --convert-to pdf document.docx
|
||||||
|
pdftoppm -jpeg -r 150 document.pdf page
|
||||||
|
```
|
||||||
|
|
||||||
|
### Aceitar tracked changes
|
||||||
|
|
||||||
|
Para produzir um documento limpo com todas as alteracoes aceites (requer LibreOffice):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/accept_changes.py input.docx output.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Criar novos documentos
|
||||||
|
|
||||||
|
Gerar ficheiros .docx com JavaScript, depois validar. Instalacao: `npm install -g docx`
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
```javascript
|
||||||
|
const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, ImageRun,
|
||||||
|
Header, Footer, AlignmentType, PageOrientation, LevelFormat, ExternalHyperlink,
|
||||||
|
TableOfContents, HeadingLevel, BorderStyle, WidthType, ShadingType,
|
||||||
|
VerticalAlign, PageNumber, PageBreak } = require('docx');
|
||||||
|
|
||||||
|
const doc = new Document({ sections: [{ children: [/* conteudo */] }] });
|
||||||
|
Packer.toBuffer(doc).then(buffer => fs.writeFileSync("doc.docx", buffer));
|
||||||
|
```
|
||||||
|
|
||||||
|
### Validacao
|
||||||
|
Apos criar o ficheiro, validar. Se a validacao falhar, descompactar, corrigir o XML e recompactar.
|
||||||
|
```bash
|
||||||
|
python scripts/office/validate.py doc.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tamanho da pagina
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// CRITICO: docx-js assume A4 por defeito
|
||||||
|
// Definir sempre o tamanho da pagina explicitamente para resultados consistentes
|
||||||
|
// Para documentos PT/EU, A4 e o padrao correcto
|
||||||
|
sections: [{
|
||||||
|
properties: {
|
||||||
|
page: {
|
||||||
|
size: {
|
||||||
|
width: 11906, // A4: 210mm em DXA
|
||||||
|
height: 16838 // A4: 297mm em DXA
|
||||||
|
},
|
||||||
|
margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } // 1 polegada de margens
|
||||||
|
}
|
||||||
|
},
|
||||||
|
children: [/* conteudo */]
|
||||||
|
}]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Tamanhos de pagina comuns (unidades DXA, 1440 DXA = 1 polegada):**
|
||||||
|
|
||||||
|
| Papel | Largura | Altura | Largura conteudo (margens 1") |
|
||||||
|
|-------|---------|--------|-------------------------------|
|
||||||
|
| A4 (padrao PT/EU) | 11.906 | 16.838 | 9.026 |
|
||||||
|
| US Letter | 12.240 | 15.840 | 9.360 |
|
||||||
|
|
||||||
|
**Orientacao paisagem:** docx-js troca largura/altura internamente, por isso passar dimensoes retrato e deixar a biblioteca tratar:
|
||||||
|
```javascript
|
||||||
|
size: {
|
||||||
|
width: 11906, // Passar lado CURTO como width
|
||||||
|
height: 16838, // Passar lado LONGO como height
|
||||||
|
orientation: PageOrientation.LANDSCAPE // docx-js troca no XML
|
||||||
|
},
|
||||||
|
// Largura de conteudo = 16838 - margem esquerda - margem direita (usa o lado longo)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Estilos (Override Built-in Headings)
|
||||||
|
|
||||||
|
Usar Arial como fonte por defeito (suporte universal). Manter titulos a preto para legibilidade.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const doc = new Document({
|
||||||
|
styles: {
|
||||||
|
default: { document: { run: { font: "Arial", size: 24 } } }, // 12pt por defeito
|
||||||
|
paragraphStyles: [
|
||||||
|
// IMPORTANTE: Usar IDs exactos para override dos estilos built-in
|
||||||
|
{ id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
|
||||||
|
run: { size: 32, bold: true, font: "Arial" },
|
||||||
|
paragraph: { spacing: { before: 240, after: 240 }, outlineLevel: 0 } }, // outlineLevel necessario para TOC
|
||||||
|
{ id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
|
||||||
|
run: { size: 28, bold: true, font: "Arial" },
|
||||||
|
paragraph: { spacing: { before: 180, after: 180 }, outlineLevel: 1 } },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
sections: [{
|
||||||
|
children: [
|
||||||
|
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Titulo")] }),
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Listas (NUNCA usar bullets unicode)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// ERRADO - nunca inserir caracteres de bullet manualmente
|
||||||
|
new Paragraph({ children: [new TextRun("* Item")] }) // MAU
|
||||||
|
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®
|
||||||
1
dev-tools/skills/docx/scripts/__init__.py
Executable file
1
dev-tools/skills/docx/scripts/__init__.py
Executable file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
135
dev-tools/skills/docx/scripts/accept_changes.py
Normal file
135
dev-tools/skills/docx/scripts/accept_changes.py
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
"""Accept all tracked changes in a DOCX file using LibreOffice.
|
||||||
|
|
||||||
|
Requires LibreOffice (soffice) to be installed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from office.soffice import get_soffice_env
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
LIBREOFFICE_PROFILE = "/tmp/libreoffice_docx_profile"
|
||||||
|
MACRO_DIR = f"{LIBREOFFICE_PROFILE}/user/basic/Standard"
|
||||||
|
|
||||||
|
ACCEPT_CHANGES_MACRO = """<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
|
||||||
|
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Module1" script:language="StarBasic">
|
||||||
|
Sub AcceptAllTrackedChanges()
|
||||||
|
Dim document As Object
|
||||||
|
Dim dispatcher As Object
|
||||||
|
|
||||||
|
document = ThisComponent.CurrentController.Frame
|
||||||
|
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
|
||||||
|
|
||||||
|
dispatcher.executeDispatch(document, ".uno:AcceptAllTrackedChanges", "", 0, Array())
|
||||||
|
ThisComponent.store()
|
||||||
|
ThisComponent.close(True)
|
||||||
|
End Sub
|
||||||
|
</script:module>"""
|
||||||
|
|
||||||
|
|
||||||
|
def accept_changes(
|
||||||
|
input_file: str,
|
||||||
|
output_file: str,
|
||||||
|
) -> tuple[None, str]:
|
||||||
|
input_path = Path(input_file)
|
||||||
|
output_path = Path(output_file)
|
||||||
|
|
||||||
|
if not input_path.exists():
|
||||||
|
return None, f"Error: Input file not found: {input_file}"
|
||||||
|
|
||||||
|
if not input_path.suffix.lower() == ".docx":
|
||||||
|
return None, f"Error: Input file is not a DOCX file: {input_file}"
|
||||||
|
|
||||||
|
try:
|
||||||
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
shutil.copy2(input_path, output_path)
|
||||||
|
except Exception as e:
|
||||||
|
return None, f"Error: Failed to copy input file to output location: {e}"
|
||||||
|
|
||||||
|
if not _setup_libreoffice_macro():
|
||||||
|
return None, "Error: Failed to setup LibreOffice macro"
|
||||||
|
|
||||||
|
cmd = [
|
||||||
|
"soffice",
|
||||||
|
"--headless",
|
||||||
|
f"-env:UserInstallation=file://{LIBREOFFICE_PROFILE}",
|
||||||
|
"--norestore",
|
||||||
|
"vnd.sun.star.script:Standard.Module1.AcceptAllTrackedChanges?language=Basic&location=application",
|
||||||
|
str(output_path.absolute()),
|
||||||
|
]
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
cmd,
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=30,
|
||||||
|
check=False,
|
||||||
|
env=get_soffice_env(),
|
||||||
|
)
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
return (
|
||||||
|
None,
|
||||||
|
f"Successfully accepted all tracked changes: {input_file} -> {output_file}",
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.returncode != 0:
|
||||||
|
return None, f"Error: LibreOffice failed: {result.stderr}"
|
||||||
|
|
||||||
|
return (
|
||||||
|
None,
|
||||||
|
f"Successfully accepted all tracked changes: {input_file} -> {output_file}",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _setup_libreoffice_macro() -> bool:
|
||||||
|
macro_dir = Path(MACRO_DIR)
|
||||||
|
macro_file = macro_dir / "Module1.xba"
|
||||||
|
|
||||||
|
if macro_file.exists() and "AcceptAllTrackedChanges" in macro_file.read_text():
|
||||||
|
return True
|
||||||
|
|
||||||
|
if not macro_dir.exists():
|
||||||
|
subprocess.run(
|
||||||
|
[
|
||||||
|
"soffice",
|
||||||
|
"--headless",
|
||||||
|
f"-env:UserInstallation=file://{LIBREOFFICE_PROFILE}",
|
||||||
|
"--terminate_after_init",
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
timeout=10,
|
||||||
|
check=False,
|
||||||
|
env=get_soffice_env(),
|
||||||
|
)
|
||||||
|
macro_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
try:
|
||||||
|
macro_file.write_text(ACCEPT_CHANGES_MACRO)
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Failed to setup LibreOffice macro: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Accept all tracked changes in a DOCX file"
|
||||||
|
)
|
||||||
|
parser.add_argument("input_file", help="Input DOCX file with tracked changes")
|
||||||
|
parser.add_argument(
|
||||||
|
"output_file", help="Output DOCX file (clean, no tracked changes)"
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
_, message = accept_changes(args.input_file, args.output_file)
|
||||||
|
print(message)
|
||||||
|
|
||||||
|
if "Error" in message:
|
||||||
|
raise SystemExit(1)
|
||||||
318
dev-tools/skills/docx/scripts/comment.py
Normal file
318
dev-tools/skills/docx/scripts/comment.py
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
"""Add comments to DOCX documents.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python comment.py unpacked/ 0 "Comment text"
|
||||||
|
python comment.py unpacked/ 1 "Reply text" --parent 0
|
||||||
|
|
||||||
|
Text should be pre-escaped XML (e.g., & for &, ’ for smart quotes).
|
||||||
|
|
||||||
|
After running, add markers to document.xml:
|
||||||
|
<w:commentRangeStart w:id="0"/>
|
||||||
|
... commented content ...
|
||||||
|
<w:commentRangeEnd w:id="0"/>
|
||||||
|
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="0"/></w:r>
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import random
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import defusedxml.minidom
|
||||||
|
|
||||||
|
TEMPLATE_DIR = Path(__file__).parent / "templates"
|
||||||
|
NS = {
|
||||||
|
"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
|
||||||
|
"w14": "http://schemas.microsoft.com/office/word/2010/wordml",
|
||||||
|
"w15": "http://schemas.microsoft.com/office/word/2012/wordml",
|
||||||
|
"w16cid": "http://schemas.microsoft.com/office/word/2016/wordml/cid",
|
||||||
|
"w16cex": "http://schemas.microsoft.com/office/word/2018/wordml/cex",
|
||||||
|
}
|
||||||
|
|
||||||
|
COMMENT_XML = """\
|
||||||
|
<w:comment w:id="{id}" w:author="{author}" w:date="{date}" w:initials="{initials}">
|
||||||
|
<w:p w14:paraId="{para_id}" w14:textId="77777777">
|
||||||
|
<w:r>
|
||||||
|
<w:rPr><w:rStyle w:val="CommentReference"/></w:rPr>
|
||||||
|
<w:annotationRef/>
|
||||||
|
</w:r>
|
||||||
|
<w:r>
|
||||||
|
<w:rPr>
|
||||||
|
<w:color w:val="000000"/>
|
||||||
|
<w:sz w:val="20"/>
|
||||||
|
<w:szCs w:val="20"/>
|
||||||
|
</w:rPr>
|
||||||
|
<w:t>{text}</w:t>
|
||||||
|
</w:r>
|
||||||
|
</w:p>
|
||||||
|
</w:comment>"""
|
||||||
|
|
||||||
|
COMMENT_MARKER_TEMPLATE = """
|
||||||
|
Add to document.xml (markers must be direct children of w:p, never inside w:r):
|
||||||
|
<w:commentRangeStart w:id="{cid}"/>
|
||||||
|
<w:r>...</w:r>
|
||||||
|
<w:commentRangeEnd w:id="{cid}"/>
|
||||||
|
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="{cid}"/></w:r>"""
|
||||||
|
|
||||||
|
REPLY_MARKER_TEMPLATE = """
|
||||||
|
Nest markers inside parent {pid}'s markers (markers must be direct children of w:p, never inside w:r):
|
||||||
|
<w:commentRangeStart w:id="{pid}"/><w:commentRangeStart w:id="{cid}"/>
|
||||||
|
<w:r>...</w:r>
|
||||||
|
<w:commentRangeEnd w:id="{cid}"/><w:commentRangeEnd w:id="{pid}"/>
|
||||||
|
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="{pid}"/></w:r>
|
||||||
|
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="{cid}"/></w:r>"""
|
||||||
|
|
||||||
|
|
||||||
|
def _generate_hex_id() -> str:
|
||||||
|
return f"{random.randint(0, 0x7FFFFFFE):08X}"
|
||||||
|
|
||||||
|
|
||||||
|
SMART_QUOTE_ENTITIES = {
|
||||||
|
"\u201c": "“",
|
||||||
|
"\u201d": "”",
|
||||||
|
"\u2018": "‘",
|
||||||
|
"\u2019": "’",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _encode_smart_quotes(text: str) -> str:
|
||||||
|
for char, entity in SMART_QUOTE_ENTITIES.items():
|
||||||
|
text = text.replace(char, entity)
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
def _append_xml(xml_path: Path, root_tag: str, content: str) -> None:
|
||||||
|
dom = defusedxml.minidom.parseString(xml_path.read_text(encoding="utf-8"))
|
||||||
|
root = dom.getElementsByTagName(root_tag)[0]
|
||||||
|
ns_attrs = " ".join(f'xmlns:{k}="{v}"' for k, v in NS.items())
|
||||||
|
wrapper_dom = defusedxml.minidom.parseString(f"<root {ns_attrs}>{content}</root>")
|
||||||
|
for child in wrapper_dom.documentElement.childNodes:
|
||||||
|
if child.nodeType == child.ELEMENT_NODE:
|
||||||
|
root.appendChild(dom.importNode(child, True))
|
||||||
|
output = _encode_smart_quotes(dom.toxml(encoding="UTF-8").decode("utf-8"))
|
||||||
|
xml_path.write_text(output, encoding="utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def _find_para_id(comments_path: Path, comment_id: int) -> str | None:
|
||||||
|
dom = defusedxml.minidom.parseString(comments_path.read_text(encoding="utf-8"))
|
||||||
|
for c in dom.getElementsByTagName("w:comment"):
|
||||||
|
if c.getAttribute("w:id") == str(comment_id):
|
||||||
|
for p in c.getElementsByTagName("w:p"):
|
||||||
|
if pid := p.getAttribute("w14:paraId"):
|
||||||
|
return pid
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _get_next_rid(rels_path: Path) -> int:
|
||||||
|
dom = defusedxml.minidom.parseString(rels_path.read_text(encoding="utf-8"))
|
||||||
|
max_rid = 0
|
||||||
|
for rel in dom.getElementsByTagName("Relationship"):
|
||||||
|
rid = rel.getAttribute("Id")
|
||||||
|
if rid and rid.startswith("rId"):
|
||||||
|
try:
|
||||||
|
max_rid = max(max_rid, int(rid[3:]))
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return max_rid + 1
|
||||||
|
|
||||||
|
|
||||||
|
def _has_relationship(rels_path: Path, target: str) -> bool:
|
||||||
|
dom = defusedxml.minidom.parseString(rels_path.read_text(encoding="utf-8"))
|
||||||
|
for rel in dom.getElementsByTagName("Relationship"):
|
||||||
|
if rel.getAttribute("Target") == target:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def _has_content_type(ct_path: Path, part_name: str) -> bool:
|
||||||
|
dom = defusedxml.minidom.parseString(ct_path.read_text(encoding="utf-8"))
|
||||||
|
for override in dom.getElementsByTagName("Override"):
|
||||||
|
if override.getAttribute("PartName") == part_name:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def _ensure_comment_relationships(unpacked_dir: Path) -> None:
|
||||||
|
rels_path = unpacked_dir / "word" / "_rels" / "document.xml.rels"
|
||||||
|
if not rels_path.exists():
|
||||||
|
return
|
||||||
|
|
||||||
|
if _has_relationship(rels_path, "comments.xml"):
|
||||||
|
return
|
||||||
|
|
||||||
|
dom = defusedxml.minidom.parseString(rels_path.read_text(encoding="utf-8"))
|
||||||
|
root = dom.documentElement
|
||||||
|
next_rid = _get_next_rid(rels_path)
|
||||||
|
|
||||||
|
rels = [
|
||||||
|
(
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
|
||||||
|
"comments.xml",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"http://schemas.microsoft.com/office/2011/relationships/commentsExtended",
|
||||||
|
"commentsExtended.xml",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"http://schemas.microsoft.com/office/2016/09/relationships/commentsIds",
|
||||||
|
"commentsIds.xml",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible",
|
||||||
|
"commentsExtensible.xml",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
for rel_type, target in rels:
|
||||||
|
rel = dom.createElement("Relationship")
|
||||||
|
rel.setAttribute("Id", f"rId{next_rid}")
|
||||||
|
rel.setAttribute("Type", rel_type)
|
||||||
|
rel.setAttribute("Target", target)
|
||||||
|
root.appendChild(rel)
|
||||||
|
next_rid += 1
|
||||||
|
|
||||||
|
rels_path.write_bytes(dom.toxml(encoding="UTF-8"))
|
||||||
|
|
||||||
|
|
||||||
|
def _ensure_comment_content_types(unpacked_dir: Path) -> None:
|
||||||
|
ct_path = unpacked_dir / "[Content_Types].xml"
|
||||||
|
if not ct_path.exists():
|
||||||
|
return
|
||||||
|
|
||||||
|
if _has_content_type(ct_path, "/word/comments.xml"):
|
||||||
|
return
|
||||||
|
|
||||||
|
dom = defusedxml.minidom.parseString(ct_path.read_text(encoding="utf-8"))
|
||||||
|
root = dom.documentElement
|
||||||
|
|
||||||
|
overrides = [
|
||||||
|
(
|
||||||
|
"/word/comments.xml",
|
||||||
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"/word/commentsExtended.xml",
|
||||||
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"/word/commentsIds.xml",
|
||||||
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"/word/commentsExtensible.xml",
|
||||||
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
for part_name, content_type in overrides:
|
||||||
|
override = dom.createElement("Override")
|
||||||
|
override.setAttribute("PartName", part_name)
|
||||||
|
override.setAttribute("ContentType", content_type)
|
||||||
|
root.appendChild(override)
|
||||||
|
|
||||||
|
ct_path.write_bytes(dom.toxml(encoding="UTF-8"))
|
||||||
|
|
||||||
|
|
||||||
|
def add_comment(
|
||||||
|
unpacked_dir: str,
|
||||||
|
comment_id: int,
|
||||||
|
text: str,
|
||||||
|
author: str = "Claude",
|
||||||
|
initials: str = "C",
|
||||||
|
parent_id: int | None = None,
|
||||||
|
) -> tuple[str, str]:
|
||||||
|
word = Path(unpacked_dir) / "word"
|
||||||
|
if not word.exists():
|
||||||
|
return "", f"Error: {word} not found"
|
||||||
|
|
||||||
|
para_id, durable_id = _generate_hex_id(), _generate_hex_id()
|
||||||
|
ts = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||||
|
|
||||||
|
comments = word / "comments.xml"
|
||||||
|
first_comment = not comments.exists()
|
||||||
|
if first_comment:
|
||||||
|
shutil.copy(TEMPLATE_DIR / "comments.xml", comments)
|
||||||
|
_ensure_comment_relationships(Path(unpacked_dir))
|
||||||
|
_ensure_comment_content_types(Path(unpacked_dir))
|
||||||
|
_append_xml(
|
||||||
|
comments,
|
||||||
|
"w:comments",
|
||||||
|
COMMENT_XML.format(
|
||||||
|
id=comment_id,
|
||||||
|
author=author,
|
||||||
|
date=ts,
|
||||||
|
initials=initials,
|
||||||
|
para_id=para_id,
|
||||||
|
text=text,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
ext = word / "commentsExtended.xml"
|
||||||
|
if not ext.exists():
|
||||||
|
shutil.copy(TEMPLATE_DIR / "commentsExtended.xml", ext)
|
||||||
|
if parent_id is not None:
|
||||||
|
parent_para = _find_para_id(comments, parent_id)
|
||||||
|
if not parent_para:
|
||||||
|
return "", f"Error: Parent comment {parent_id} not found"
|
||||||
|
_append_xml(
|
||||||
|
ext,
|
||||||
|
"w15:commentsEx",
|
||||||
|
f'<w15:commentEx w15:paraId="{para_id}" w15:paraIdParent="{parent_para}" w15:done="0"/>',
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
_append_xml(
|
||||||
|
ext,
|
||||||
|
"w15:commentsEx",
|
||||||
|
f'<w15:commentEx w15:paraId="{para_id}" w15:done="0"/>',
|
||||||
|
)
|
||||||
|
|
||||||
|
ids = word / "commentsIds.xml"
|
||||||
|
if not ids.exists():
|
||||||
|
shutil.copy(TEMPLATE_DIR / "commentsIds.xml", ids)
|
||||||
|
_append_xml(
|
||||||
|
ids,
|
||||||
|
"w16cid:commentsIds",
|
||||||
|
f'<w16cid:commentId w16cid:paraId="{para_id}" w16cid:durableId="{durable_id}"/>',
|
||||||
|
)
|
||||||
|
|
||||||
|
extensible = word / "commentsExtensible.xml"
|
||||||
|
if not extensible.exists():
|
||||||
|
shutil.copy(TEMPLATE_DIR / "commentsExtensible.xml", extensible)
|
||||||
|
_append_xml(
|
||||||
|
extensible,
|
||||||
|
"w16cex:commentsExtensible",
|
||||||
|
f'<w16cex:commentExtensible w16cex:durableId="{durable_id}" w16cex:dateUtc="{ts}"/>',
|
||||||
|
)
|
||||||
|
|
||||||
|
action = "reply" if parent_id is not None else "comment"
|
||||||
|
return para_id, f"Added {action} {comment_id} (para_id={para_id})"
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
p = argparse.ArgumentParser(description="Add comments to DOCX documents")
|
||||||
|
p.add_argument("unpacked_dir", help="Unpacked DOCX directory")
|
||||||
|
p.add_argument("comment_id", type=int, help="Comment ID (must be unique)")
|
||||||
|
p.add_argument("text", help="Comment text")
|
||||||
|
p.add_argument("--author", default="Claude", help="Author name")
|
||||||
|
p.add_argument("--initials", default="C", help="Author initials")
|
||||||
|
p.add_argument("--parent", type=int, help="Parent comment ID (for replies)")
|
||||||
|
args = p.parse_args()
|
||||||
|
|
||||||
|
para_id, msg = add_comment(
|
||||||
|
args.unpacked_dir,
|
||||||
|
args.comment_id,
|
||||||
|
args.text,
|
||||||
|
args.author,
|
||||||
|
args.initials,
|
||||||
|
args.parent,
|
||||||
|
)
|
||||||
|
print(msg)
|
||||||
|
if "Error" in msg:
|
||||||
|
sys.exit(1)
|
||||||
|
cid = args.comment_id
|
||||||
|
if args.parent is not None:
|
||||||
|
print(REPLY_MARKER_TEMPLATE.format(pid=args.parent, cid=cid))
|
||||||
|
else:
|
||||||
|
print(COMMENT_MARKER_TEMPLATE.format(cid=cid))
|
||||||
199
dev-tools/skills/docx/scripts/office/helpers/merge_runs.py
Normal file
199
dev-tools/skills/docx/scripts/office/helpers/merge_runs.py
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
"""Merge adjacent runs with identical formatting in DOCX.
|
||||||
|
|
||||||
|
Merges adjacent <w:r> elements that have identical <w:rPr> properties.
|
||||||
|
Works on runs in paragraphs and inside tracked changes (<w:ins>, <w:del>).
|
||||||
|
|
||||||
|
Also:
|
||||||
|
- Removes rsid attributes from runs (revision metadata that doesn't affect rendering)
|
||||||
|
- Removes proofErr elements (spell/grammar markers that block merging)
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import defusedxml.minidom
|
||||||
|
|
||||||
|
|
||||||
|
def merge_runs(input_dir: str) -> tuple[int, str]:
|
||||||
|
doc_xml = Path(input_dir) / "word" / "document.xml"
|
||||||
|
|
||||||
|
if not doc_xml.exists():
|
||||||
|
return 0, f"Error: {doc_xml} not found"
|
||||||
|
|
||||||
|
try:
|
||||||
|
dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8"))
|
||||||
|
root = dom.documentElement
|
||||||
|
|
||||||
|
_remove_elements(root, "proofErr")
|
||||||
|
_strip_run_rsid_attrs(root)
|
||||||
|
|
||||||
|
containers = {run.parentNode for run in _find_elements(root, "r")}
|
||||||
|
|
||||||
|
merge_count = 0
|
||||||
|
for container in containers:
|
||||||
|
merge_count += _merge_runs_in(container)
|
||||||
|
|
||||||
|
doc_xml.write_bytes(dom.toxml(encoding="UTF-8"))
|
||||||
|
return merge_count, f"Merged {merge_count} runs"
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return 0, f"Error: {e}"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def _find_elements(root, tag: str) -> list:
|
||||||
|
results = []
|
||||||
|
|
||||||
|
def traverse(node):
|
||||||
|
if node.nodeType == node.ELEMENT_NODE:
|
||||||
|
name = node.localName or node.tagName
|
||||||
|
if name == tag or name.endswith(f":{tag}"):
|
||||||
|
results.append(node)
|
||||||
|
for child in node.childNodes:
|
||||||
|
traverse(child)
|
||||||
|
|
||||||
|
traverse(root)
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def _get_child(parent, tag: str):
|
||||||
|
for child in parent.childNodes:
|
||||||
|
if child.nodeType == child.ELEMENT_NODE:
|
||||||
|
name = child.localName or child.tagName
|
||||||
|
if name == tag or name.endswith(f":{tag}"):
|
||||||
|
return child
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _get_children(parent, tag: str) -> list:
|
||||||
|
results = []
|
||||||
|
for child in parent.childNodes:
|
||||||
|
if child.nodeType == child.ELEMENT_NODE:
|
||||||
|
name = child.localName or child.tagName
|
||||||
|
if name == tag or name.endswith(f":{tag}"):
|
||||||
|
results.append(child)
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def _is_adjacent(elem1, elem2) -> bool:
|
||||||
|
node = elem1.nextSibling
|
||||||
|
while node:
|
||||||
|
if node == elem2:
|
||||||
|
return True
|
||||||
|
if node.nodeType == node.ELEMENT_NODE:
|
||||||
|
return False
|
||||||
|
if node.nodeType == node.TEXT_NODE and node.data.strip():
|
||||||
|
return False
|
||||||
|
node = node.nextSibling
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def _remove_elements(root, tag: str):
|
||||||
|
for elem in _find_elements(root, tag):
|
||||||
|
if elem.parentNode:
|
||||||
|
elem.parentNode.removeChild(elem)
|
||||||
|
|
||||||
|
|
||||||
|
def _strip_run_rsid_attrs(root):
|
||||||
|
for run in _find_elements(root, "r"):
|
||||||
|
for attr in list(run.attributes.values()):
|
||||||
|
if "rsid" in attr.name.lower():
|
||||||
|
run.removeAttribute(attr.name)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def _merge_runs_in(container) -> int:
|
||||||
|
merge_count = 0
|
||||||
|
run = _first_child_run(container)
|
||||||
|
|
||||||
|
while run:
|
||||||
|
while True:
|
||||||
|
next_elem = _next_element_sibling(run)
|
||||||
|
if next_elem and _is_run(next_elem) and _can_merge(run, next_elem):
|
||||||
|
_merge_run_content(run, next_elem)
|
||||||
|
container.removeChild(next_elem)
|
||||||
|
merge_count += 1
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
_consolidate_text(run)
|
||||||
|
run = _next_sibling_run(run)
|
||||||
|
|
||||||
|
return merge_count
|
||||||
|
|
||||||
|
|
||||||
|
def _first_child_run(container):
|
||||||
|
for child in container.childNodes:
|
||||||
|
if child.nodeType == child.ELEMENT_NODE and _is_run(child):
|
||||||
|
return child
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _next_element_sibling(node):
|
||||||
|
sibling = node.nextSibling
|
||||||
|
while sibling:
|
||||||
|
if sibling.nodeType == sibling.ELEMENT_NODE:
|
||||||
|
return sibling
|
||||||
|
sibling = sibling.nextSibling
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _next_sibling_run(node):
|
||||||
|
sibling = node.nextSibling
|
||||||
|
while sibling:
|
||||||
|
if sibling.nodeType == sibling.ELEMENT_NODE:
|
||||||
|
if _is_run(sibling):
|
||||||
|
return sibling
|
||||||
|
sibling = sibling.nextSibling
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _is_run(node) -> bool:
|
||||||
|
name = node.localName or node.tagName
|
||||||
|
return name == "r" or name.endswith(":r")
|
||||||
|
|
||||||
|
|
||||||
|
def _can_merge(run1, run2) -> bool:
|
||||||
|
rpr1 = _get_child(run1, "rPr")
|
||||||
|
rpr2 = _get_child(run2, "rPr")
|
||||||
|
|
||||||
|
if (rpr1 is None) != (rpr2 is None):
|
||||||
|
return False
|
||||||
|
if rpr1 is None:
|
||||||
|
return True
|
||||||
|
return rpr1.toxml() == rpr2.toxml()
|
||||||
|
|
||||||
|
|
||||||
|
def _merge_run_content(target, source):
|
||||||
|
for child in list(source.childNodes):
|
||||||
|
if child.nodeType == child.ELEMENT_NODE:
|
||||||
|
name = child.localName or child.tagName
|
||||||
|
if name != "rPr" and not name.endswith(":rPr"):
|
||||||
|
target.appendChild(child)
|
||||||
|
|
||||||
|
|
||||||
|
def _consolidate_text(run):
|
||||||
|
t_elements = _get_children(run, "t")
|
||||||
|
|
||||||
|
for i in range(len(t_elements) - 1, 0, -1):
|
||||||
|
curr, prev = t_elements[i], t_elements[i - 1]
|
||||||
|
|
||||||
|
if _is_adjacent(prev, curr):
|
||||||
|
prev_text = prev.firstChild.data if prev.firstChild else ""
|
||||||
|
curr_text = curr.firstChild.data if curr.firstChild else ""
|
||||||
|
merged = prev_text + curr_text
|
||||||
|
|
||||||
|
if prev.firstChild:
|
||||||
|
prev.firstChild.data = merged
|
||||||
|
else:
|
||||||
|
prev.appendChild(run.ownerDocument.createTextNode(merged))
|
||||||
|
|
||||||
|
if merged.startswith(" ") or merged.endswith(" "):
|
||||||
|
prev.setAttribute("xml:space", "preserve")
|
||||||
|
elif prev.hasAttribute("xml:space"):
|
||||||
|
prev.removeAttribute("xml:space")
|
||||||
|
|
||||||
|
run.removeChild(curr)
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
"""Simplify tracked changes by merging adjacent w:ins or w:del elements.
|
||||||
|
|
||||||
|
Merges adjacent <w:ins> elements from the same author into a single element.
|
||||||
|
Same for <w:del> elements. This makes heavily-redlined documents easier to
|
||||||
|
work with by reducing the number of tracked change wrappers.
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
- Only merges w:ins with w:ins, w:del with w:del (same element type)
|
||||||
|
- Only merges if same author (ignores timestamp differences)
|
||||||
|
- Only merges if truly adjacent (only whitespace between them)
|
||||||
|
"""
|
||||||
|
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
import zipfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import defusedxml.minidom
|
||||||
|
|
||||||
|
WORD_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
|
||||||
|
|
||||||
|
def simplify_redlines(input_dir: str) -> tuple[int, str]:
|
||||||
|
doc_xml = Path(input_dir) / "word" / "document.xml"
|
||||||
|
|
||||||
|
if not doc_xml.exists():
|
||||||
|
return 0, f"Error: {doc_xml} not found"
|
||||||
|
|
||||||
|
try:
|
||||||
|
dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8"))
|
||||||
|
root = dom.documentElement
|
||||||
|
|
||||||
|
merge_count = 0
|
||||||
|
|
||||||
|
containers = _find_elements(root, "p") + _find_elements(root, "tc")
|
||||||
|
|
||||||
|
for container in containers:
|
||||||
|
merge_count += _merge_tracked_changes_in(container, "ins")
|
||||||
|
merge_count += _merge_tracked_changes_in(container, "del")
|
||||||
|
|
||||||
|
doc_xml.write_bytes(dom.toxml(encoding="UTF-8"))
|
||||||
|
return merge_count, f"Simplified {merge_count} tracked changes"
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return 0, f"Error: {e}"
|
||||||
|
|
||||||
|
|
||||||
|
def _merge_tracked_changes_in(container, tag: str) -> int:
|
||||||
|
merge_count = 0
|
||||||
|
|
||||||
|
tracked = [
|
||||||
|
child
|
||||||
|
for child in container.childNodes
|
||||||
|
if child.nodeType == child.ELEMENT_NODE and _is_element(child, tag)
|
||||||
|
]
|
||||||
|
|
||||||
|
if len(tracked) < 2:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
while i < len(tracked) - 1:
|
||||||
|
curr = tracked[i]
|
||||||
|
next_elem = tracked[i + 1]
|
||||||
|
|
||||||
|
if _can_merge_tracked(curr, next_elem):
|
||||||
|
_merge_tracked_content(curr, next_elem)
|
||||||
|
container.removeChild(next_elem)
|
||||||
|
tracked.pop(i + 1)
|
||||||
|
merge_count += 1
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
return merge_count
|
||||||
|
|
||||||
|
|
||||||
|
def _is_element(node, tag: str) -> bool:
|
||||||
|
name = node.localName or node.tagName
|
||||||
|
return name == tag or name.endswith(f":{tag}")
|
||||||
|
|
||||||
|
|
||||||
|
def _get_author(elem) -> str:
|
||||||
|
author = elem.getAttribute("w:author")
|
||||||
|
if not author:
|
||||||
|
for attr in elem.attributes.values():
|
||||||
|
if attr.localName == "author" or attr.name.endswith(":author"):
|
||||||
|
return attr.value
|
||||||
|
return author
|
||||||
|
|
||||||
|
|
||||||
|
def _can_merge_tracked(elem1, elem2) -> bool:
|
||||||
|
if _get_author(elem1) != _get_author(elem2):
|
||||||
|
return False
|
||||||
|
|
||||||
|
node = elem1.nextSibling
|
||||||
|
while node and node != elem2:
|
||||||
|
if node.nodeType == node.ELEMENT_NODE:
|
||||||
|
return False
|
||||||
|
if node.nodeType == node.TEXT_NODE and node.data.strip():
|
||||||
|
return False
|
||||||
|
node = node.nextSibling
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _merge_tracked_content(target, source):
|
||||||
|
while source.firstChild:
|
||||||
|
child = source.firstChild
|
||||||
|
source.removeChild(child)
|
||||||
|
target.appendChild(child)
|
||||||
|
|
||||||
|
|
||||||
|
def _find_elements(root, tag: str) -> list:
|
||||||
|
results = []
|
||||||
|
|
||||||
|
def traverse(node):
|
||||||
|
if node.nodeType == node.ELEMENT_NODE:
|
||||||
|
name = node.localName or node.tagName
|
||||||
|
if name == tag or name.endswith(f":{tag}"):
|
||||||
|
results.append(node)
|
||||||
|
for child in node.childNodes:
|
||||||
|
traverse(child)
|
||||||
|
|
||||||
|
traverse(root)
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def get_tracked_change_authors(doc_xml_path: Path) -> dict[str, int]:
|
||||||
|
if not doc_xml_path.exists():
|
||||||
|
return {}
|
||||||
|
|
||||||
|
try:
|
||||||
|
tree = ET.parse(doc_xml_path)
|
||||||
|
root = tree.getroot()
|
||||||
|
except ET.ParseError:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
namespaces = {"w": WORD_NS}
|
||||||
|
author_attr = f"{{{WORD_NS}}}author"
|
||||||
|
|
||||||
|
authors: dict[str, int] = {}
|
||||||
|
for tag in ["ins", "del"]:
|
||||||
|
for elem in root.findall(f".//w:{tag}", namespaces):
|
||||||
|
author = elem.get(author_attr)
|
||||||
|
if author:
|
||||||
|
authors[author] = authors.get(author, 0) + 1
|
||||||
|
|
||||||
|
return authors
|
||||||
|
|
||||||
|
|
||||||
|
def _get_authors_from_docx(docx_path: Path) -> dict[str, int]:
|
||||||
|
try:
|
||||||
|
with zipfile.ZipFile(docx_path, "r") as zf:
|
||||||
|
if "word/document.xml" not in zf.namelist():
|
||||||
|
return {}
|
||||||
|
with zf.open("word/document.xml") as f:
|
||||||
|
tree = ET.parse(f)
|
||||||
|
root = tree.getroot()
|
||||||
|
|
||||||
|
namespaces = {"w": WORD_NS}
|
||||||
|
author_attr = f"{{{WORD_NS}}}author"
|
||||||
|
|
||||||
|
authors: dict[str, int] = {}
|
||||||
|
for tag in ["ins", "del"]:
|
||||||
|
for elem in root.findall(f".//w:{tag}", namespaces):
|
||||||
|
author = elem.get(author_attr)
|
||||||
|
if author:
|
||||||
|
authors[author] = authors.get(author, 0) + 1
|
||||||
|
return authors
|
||||||
|
except (zipfile.BadZipFile, ET.ParseError):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
def infer_author(modified_dir: Path, original_docx: Path, default: str = "Claude") -> str:
|
||||||
|
modified_xml = modified_dir / "word" / "document.xml"
|
||||||
|
modified_authors = get_tracked_change_authors(modified_xml)
|
||||||
|
|
||||||
|
if not modified_authors:
|
||||||
|
return default
|
||||||
|
|
||||||
|
original_authors = _get_authors_from_docx(original_docx)
|
||||||
|
|
||||||
|
new_changes: dict[str, int] = {}
|
||||||
|
for author, count in modified_authors.items():
|
||||||
|
original_count = original_authors.get(author, 0)
|
||||||
|
diff = count - original_count
|
||||||
|
if diff > 0:
|
||||||
|
new_changes[author] = diff
|
||||||
|
|
||||||
|
if not new_changes:
|
||||||
|
return default
|
||||||
|
|
||||||
|
if len(new_changes) == 1:
|
||||||
|
return next(iter(new_changes))
|
||||||
|
|
||||||
|
raise ValueError(
|
||||||
|
f"Multiple authors added new changes: {new_changes}. "
|
||||||
|
"Cannot infer which author to validate."
|
||||||
|
)
|
||||||
159
dev-tools/skills/docx/scripts/office/pack.py
Executable file
159
dev-tools/skills/docx/scripts/office/pack.py
Executable file
@@ -0,0 +1,159 @@
|
|||||||
|
"""Pack a directory into a DOCX, PPTX, or XLSX file.
|
||||||
|
|
||||||
|
Validates with auto-repair, condenses XML formatting, and creates the Office file.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python pack.py <input_directory> <output_file> [--original <file>] [--validate true|false]
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
python pack.py unpacked/ output.docx --original input.docx
|
||||||
|
python pack.py unpacked/ output.pptx --validate false
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
import tempfile
|
||||||
|
import zipfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import defusedxml.minidom
|
||||||
|
|
||||||
|
from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
|
||||||
|
|
||||||
|
def pack(
|
||||||
|
input_directory: str,
|
||||||
|
output_file: str,
|
||||||
|
original_file: str | None = None,
|
||||||
|
validate: bool = True,
|
||||||
|
infer_author_func=None,
|
||||||
|
) -> tuple[None, str]:
|
||||||
|
input_dir = Path(input_directory)
|
||||||
|
output_path = Path(output_file)
|
||||||
|
suffix = output_path.suffix.lower()
|
||||||
|
|
||||||
|
if not input_dir.is_dir():
|
||||||
|
return None, f"Error: {input_dir} is not a directory"
|
||||||
|
|
||||||
|
if suffix not in {".docx", ".pptx", ".xlsx"}:
|
||||||
|
return None, f"Error: {output_file} must be a .docx, .pptx, or .xlsx file"
|
||||||
|
|
||||||
|
if validate and original_file:
|
||||||
|
original_path = Path(original_file)
|
||||||
|
if original_path.exists():
|
||||||
|
success, output = _run_validation(
|
||||||
|
input_dir, original_path, suffix, infer_author_func
|
||||||
|
)
|
||||||
|
if output:
|
||||||
|
print(output)
|
||||||
|
if not success:
|
||||||
|
return None, f"Error: Validation failed for {input_dir}"
|
||||||
|
|
||||||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
temp_content_dir = Path(temp_dir) / "content"
|
||||||
|
shutil.copytree(input_dir, temp_content_dir)
|
||||||
|
|
||||||
|
for pattern in ["*.xml", "*.rels"]:
|
||||||
|
for xml_file in temp_content_dir.rglob(pattern):
|
||||||
|
_condense_xml(xml_file)
|
||||||
|
|
||||||
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zf:
|
||||||
|
for f in temp_content_dir.rglob("*"):
|
||||||
|
if f.is_file():
|
||||||
|
zf.write(f, f.relative_to(temp_content_dir))
|
||||||
|
|
||||||
|
return None, f"Successfully packed {input_dir} to {output_file}"
|
||||||
|
|
||||||
|
|
||||||
|
def _run_validation(
|
||||||
|
unpacked_dir: Path,
|
||||||
|
original_file: Path,
|
||||||
|
suffix: str,
|
||||||
|
infer_author_func=None,
|
||||||
|
) -> tuple[bool, str | None]:
|
||||||
|
output_lines = []
|
||||||
|
validators = []
|
||||||
|
|
||||||
|
if suffix == ".docx":
|
||||||
|
author = "Claude"
|
||||||
|
if infer_author_func:
|
||||||
|
try:
|
||||||
|
author = infer_author_func(unpacked_dir, original_file)
|
||||||
|
except ValueError as e:
|
||||||
|
print(f"Warning: {e} Using default author 'Claude'.", file=sys.stderr)
|
||||||
|
|
||||||
|
validators = [
|
||||||
|
DOCXSchemaValidator(unpacked_dir, original_file),
|
||||||
|
RedliningValidator(unpacked_dir, original_file, author=author),
|
||||||
|
]
|
||||||
|
elif suffix == ".pptx":
|
||||||
|
validators = [PPTXSchemaValidator(unpacked_dir, original_file)]
|
||||||
|
|
||||||
|
if not validators:
|
||||||
|
return True, None
|
||||||
|
|
||||||
|
total_repairs = sum(v.repair() for v in validators)
|
||||||
|
if total_repairs:
|
||||||
|
output_lines.append(f"Auto-repaired {total_repairs} issue(s)")
|
||||||
|
|
||||||
|
success = all(v.validate() for v in validators)
|
||||||
|
|
||||||
|
if success:
|
||||||
|
output_lines.append("All validations PASSED!")
|
||||||
|
|
||||||
|
return success, "\n".join(output_lines) if output_lines else None
|
||||||
|
|
||||||
|
|
||||||
|
def _condense_xml(xml_file: Path) -> None:
|
||||||
|
try:
|
||||||
|
with open(xml_file, encoding="utf-8") as f:
|
||||||
|
dom = defusedxml.minidom.parse(f)
|
||||||
|
|
||||||
|
for element in dom.getElementsByTagName("*"):
|
||||||
|
if element.tagName.endswith(":t"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
for child in list(element.childNodes):
|
||||||
|
if (
|
||||||
|
child.nodeType == child.TEXT_NODE
|
||||||
|
and child.nodeValue
|
||||||
|
and child.nodeValue.strip() == ""
|
||||||
|
) or child.nodeType == child.COMMENT_NODE:
|
||||||
|
element.removeChild(child)
|
||||||
|
|
||||||
|
xml_file.write_bytes(dom.toxml(encoding="UTF-8"))
|
||||||
|
except Exception as e:
|
||||||
|
print(f"ERROR: Failed to parse {xml_file.name}: {e}", file=sys.stderr)
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Pack a directory into a DOCX, PPTX, or XLSX file"
|
||||||
|
)
|
||||||
|
parser.add_argument("input_directory", help="Unpacked Office document directory")
|
||||||
|
parser.add_argument("output_file", help="Output Office file (.docx/.pptx/.xlsx)")
|
||||||
|
parser.add_argument(
|
||||||
|
"--original",
|
||||||
|
help="Original file for validation comparison",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--validate",
|
||||||
|
type=lambda x: x.lower() == "true",
|
||||||
|
default=True,
|
||||||
|
metavar="true|false",
|
||||||
|
help="Run validation with auto-repair (default: true)",
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
_, message = pack(
|
||||||
|
args.input_directory,
|
||||||
|
args.output_file,
|
||||||
|
original_file=args.original,
|
||||||
|
validate=args.validate,
|
||||||
|
)
|
||||||
|
print(message)
|
||||||
|
|
||||||
|
if "Error" in message:
|
||||||
|
sys.exit(1)
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,146 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:complexType name="CT_ShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="textlink" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ConnectorNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Connector">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional" default=""/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrameNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGraphicFramePr" type="CT_GraphicFrameNonVisual" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ObjectChoices">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_MarkerCoordinate">
|
||||||
|
<xsd:restriction base="xsd:double">
|
||||||
|
<xsd:minInclusive value="0.0"/>
|
||||||
|
<xsd:maxInclusive value="1.0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Marker">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="x" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="y" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_RelSizeAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AbsSizeAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_Anchor">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="relSizeAnchor" type="CT_RelSizeAnchor"/>
|
||||||
|
<xsd:element name="absSizeAnchor" type="CT_AbsSizeAnchor"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Drawing">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:element name="lockedCanvas" type="a:CT_GvmlGroupShape"/>
|
||||||
|
</xsd:schema>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:import schemaLocation="shared-relationshipReference.xsd"
|
||||||
|
namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:complexType name="CT_AnchorClientData">
|
||||||
|
<xsd:attribute name="fLocksWithSheet" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPrintsWithSheet" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="textlink" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ConnectorNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Connector">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional" default=""/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicalObjectFrameNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicalObjectFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGraphicFramePr" type="CT_GraphicalObjectFrameNonVisual" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ObjectChoices">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_Rel"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Rel">
|
||||||
|
<xsd:attribute ref="r:id" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_ColID">
|
||||||
|
<xsd:restriction base="xsd:int">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RowID">
|
||||||
|
<xsd:restriction base="xsd:int">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Marker">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="col" type="ST_ColID"/>
|
||||||
|
<xsd:element name="colOff" type="a:ST_Coordinate"/>
|
||||||
|
<xsd:element name="row" type="ST_RowID"/>
|
||||||
|
<xsd:element name="rowOff" type="a:ST_Coordinate"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_EditAs">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="twoCell"/>
|
||||||
|
<xsd:enumeration value="oneCell"/>
|
||||||
|
<xsd:enumeration value="absolute"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_TwoCellAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="editAs" type="ST_EditAs" use="optional" default="twoCell"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OneCellAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AbsoluteAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="pos" type="a:CT_Point2D"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_Anchor">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="twoCellAnchor" type="CT_TwoCellAnchor"/>
|
||||||
|
<xsd:element name="oneCellAnchor" type="CT_OneCellAnchor"/>
|
||||||
|
<xsd:element name="absoluteAnchor" type="CT_AbsoluteAnchor"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Drawing">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="wsDr" type="CT_Drawing"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,287 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
xmlns:dpct="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:import schemaLocation="wml.xsd"
|
||||||
|
namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
schemaLocation="dml-picture.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
schemaLocation="shared-relationshipReference.xsd"/>
|
||||||
|
<xsd:complexType name="CT_EffectExtent">
|
||||||
|
<xsd:attribute name="l" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="t" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="r" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="b" type="a:ST_Coordinate" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_WrapDistance">
|
||||||
|
<xsd:restriction base="xsd:unsignedInt"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Inline">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
<xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_WrapText">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="bothSides"/>
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="largest"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_WrapPath">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="start" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="lineTo" type="a:CT_Point2D" minOccurs="2" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="edited" type="xsd:boolean" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapNone"/>
|
||||||
|
<xsd:complexType name="CT_WrapSquare">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapTight">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapThrough">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapTopBottom">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_WrapType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="wrapNone" type="CT_WrapNone" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapSquare" type="CT_WrapSquare" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapTight" type="CT_WrapTight" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapThrough" type="CT_WrapThrough" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapTopAndBottom" type="CT_WrapTopBottom" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_PositionOffset">
|
||||||
|
<xsd:restriction base="xsd:int"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlignH">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RelFromH">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="column"/>
|
||||||
|
<xsd:enumeration value="character"/>
|
||||||
|
<xsd:enumeration value="leftMargin"/>
|
||||||
|
<xsd:enumeration value="rightMargin"/>
|
||||||
|
<xsd:enumeration value="insideMargin"/>
|
||||||
|
<xsd:enumeration value="outsideMargin"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_PosH">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="align" type="ST_AlignH" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="relativeFrom" type="ST_RelFromH" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_AlignV">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RelFromV">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="paragraph"/>
|
||||||
|
<xsd:enumeration value="line"/>
|
||||||
|
<xsd:enumeration value="topMargin"/>
|
||||||
|
<xsd:enumeration value="bottomMargin"/>
|
||||||
|
<xsd:enumeration value="insideMargin"/>
|
||||||
|
<xsd:enumeration value="outsideMargin"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_PosV">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="align" type="ST_AlignV" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="relativeFrom" type="ST_RelFromV" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Anchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="simplePos" type="a:CT_Point2D"/>
|
||||||
|
<xsd:element name="positionH" type="CT_PosH"/>
|
||||||
|
<xsd:element name="positionV" type="CT_PosV"/>
|
||||||
|
<xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_WrapType"/>
|
||||||
|
<xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="simplePos" type="xsd:boolean"/>
|
||||||
|
<xsd:attribute name="relativeHeight" type="xsd:unsignedInt" use="required"/>
|
||||||
|
<xsd:attribute name="behindDoc" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="locked" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="layoutInCell" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="hidden" type="xsd:boolean" use="optional"/>
|
||||||
|
<xsd:attribute name="allowOverlap" type="xsd:boolean" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TxbxContent">
|
||||||
|
<xsd:group ref="w:EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TextboxInfo">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="txbxContent" type="CT_TxbxContent" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="id" type="xsd:unsignedShort" use="optional" default="0"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LinkedTextboxInformation">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="id" type="xsd:unsignedShort" use="required"/>
|
||||||
|
<xsd:attribute name="seq" type="xsd:unsignedShort" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingShape">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCnPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="1">
|
||||||
|
<xsd:element name="txbx" type="CT_TextboxInfo" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="linkedTxbx" type="CT_LinkedTextboxInformation" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="bodyPr" type="a:CT_TextBodyProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="normalEastAsianFlow" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvFrPr" type="a:CT_NonVisualGraphicFrameProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingContentPartNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvContentPartPr" type="a:CT_NonVisualContentPartProperties" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingContentPart">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvContentPartPr" type="CT_WordprocessingContentPartNonVisual" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="bwMode" type="a:ST_BlackWhiteMode" use="optional"/>
|
||||||
|
<xsd:attribute ref="r:id" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingGroup">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="wsp"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_WordprocessingGroup"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element ref="dpct:pic"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_WordprocessingContentPart"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingCanvas">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="bg" type="a:CT_BackgroundFormatting" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="whole" type="a:CT_WholeE2oFormatting" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="wsp"/>
|
||||||
|
<xsd:element ref="dpct:pic"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_WordprocessingContentPart"/>
|
||||||
|
<xsd:element ref="wgp"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="wpc" type="CT_WordprocessingCanvas"/>
|
||||||
|
<xsd:element name="wgp" type="CT_WordprocessingGroup"/>
|
||||||
|
<xsd:element name="wsp" type="CT_WordprocessingShape"/>
|
||||||
|
<xsd:element name="inline" type="CT_Inline"/>
|
||||||
|
<xsd:element name="anchor" type="CT_Anchor"/>
|
||||||
|
</xsd:schema>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/characteristics"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/characteristics"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:complexType name="CT_AdditionalCharacteristics">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="characteristic" type="CT_Characteristic" minOccurs="0"
|
||||||
|
maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Characteristic">
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="relation" type="ST_Relation" use="required"/>
|
||||||
|
<xsd:attribute name="val" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="vocabulary" type="xsd:anyURI" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Relation">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="ge"/>
|
||||||
|
<xsd:enumeration value="le"/>
|
||||||
|
<xsd:enumeration value="gt"/>
|
||||||
|
<xsd:enumeration value="lt"/>
|
||||||
|
<xsd:enumeration value="eq"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:element name="additionalCharacteristics" type="CT_AdditionalCharacteristics"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:simpleType name="ST_SourceType">
|
||||||
|
<xsd:restriction base="s:ST_String">
|
||||||
|
<xsd:enumeration value="ArticleInAPeriodical"/>
|
||||||
|
<xsd:enumeration value="Book"/>
|
||||||
|
<xsd:enumeration value="BookSection"/>
|
||||||
|
<xsd:enumeration value="JournalArticle"/>
|
||||||
|
<xsd:enumeration value="ConferenceProceedings"/>
|
||||||
|
<xsd:enumeration value="Report"/>
|
||||||
|
<xsd:enumeration value="SoundRecording"/>
|
||||||
|
<xsd:enumeration value="Performance"/>
|
||||||
|
<xsd:enumeration value="Art"/>
|
||||||
|
<xsd:enumeration value="DocumentFromInternetSite"/>
|
||||||
|
<xsd:enumeration value="InternetSite"/>
|
||||||
|
<xsd:enumeration value="Film"/>
|
||||||
|
<xsd:enumeration value="Interview"/>
|
||||||
|
<xsd:enumeration value="Patent"/>
|
||||||
|
<xsd:enumeration value="ElectronicSource"/>
|
||||||
|
<xsd:enumeration value="Case"/>
|
||||||
|
<xsd:enumeration value="Misc"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_NameListType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Person" type="CT_PersonType" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PersonType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Last" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="First" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="Middle" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NameType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NameOrCorporateType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="1">
|
||||||
|
<xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="Corporate" minOccurs="1" maxOccurs="1" type="s:ST_String"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AuthorType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="Artist" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Author" type="CT_NameOrCorporateType"/>
|
||||||
|
<xsd:element name="BookAuthor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Compiler" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Composer" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Conductor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Counsel" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Director" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Editor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Interviewee" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Interviewer" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Inventor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Performer" type="CT_NameOrCorporateType"/>
|
||||||
|
<xsd:element name="ProducerName" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Translator" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Writer" type="CT_NameType"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SourceType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="AbbreviatedCaseNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="AlbumTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Author" type="CT_AuthorType"/>
|
||||||
|
<xsd:element name="BookTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Broadcaster" type="s:ST_String"/>
|
||||||
|
<xsd:element name="BroadcastTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="CaseNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ChapterNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="City" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Comments" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ConferenceName" type="s:ST_String"/>
|
||||||
|
<xsd:element name="CountryRegion" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Court" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Day" type="s:ST_String"/>
|
||||||
|
<xsd:element name="DayAccessed" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Department" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Distributor" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Edition" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Guid" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Institution" type="s:ST_String"/>
|
||||||
|
<xsd:element name="InternetSiteTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Issue" type="s:ST_String"/>
|
||||||
|
<xsd:element name="JournalName" type="s:ST_String"/>
|
||||||
|
<xsd:element name="LCID" type="s:ST_Lang"/>
|
||||||
|
<xsd:element name="Medium" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Month" type="s:ST_String"/>
|
||||||
|
<xsd:element name="MonthAccessed" type="s:ST_String"/>
|
||||||
|
<xsd:element name="NumberVolumes" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Pages" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PatentNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PeriodicalTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ProductionCompany" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PublicationTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Publisher" type="s:ST_String"/>
|
||||||
|
<xsd:element name="RecordingNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="RefOrder" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Reporter" type="s:ST_String"/>
|
||||||
|
<xsd:element name="SourceType" type="ST_SourceType"/>
|
||||||
|
<xsd:element name="ShortTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="StandardNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="StateProvince" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Station" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Tag" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Theater" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ThesisType" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Title" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Type" type="s:ST_String"/>
|
||||||
|
<xsd:element name="URL" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Version" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Volume" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Year" type="s:ST_String"/>
|
||||||
|
<xsd:element name="YearAccessed" type="s:ST_String"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="Sources" type="CT_Sources"/>
|
||||||
|
<xsd:complexType name="CT_Sources">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Source" type="CT_SourceType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="SelectedStyle" type="s:ST_String"/>
|
||||||
|
<xsd:attribute name="StyleName" type="s:ST_String"/>
|
||||||
|
<xsd:attribute name="URI" type="s:ST_String"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:simpleType name="ST_Lang">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_HexColorRGB">
|
||||||
|
<xsd:restriction base="xsd:hexBinary">
|
||||||
|
<xsd:length value="3" fixed="true"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Panose">
|
||||||
|
<xsd:restriction base="xsd:hexBinary">
|
||||||
|
<xsd:length value="10"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CalendarType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="gregorian"/>
|
||||||
|
<xsd:enumeration value="gregorianUs"/>
|
||||||
|
<xsd:enumeration value="gregorianMeFrench"/>
|
||||||
|
<xsd:enumeration value="gregorianArabic"/>
|
||||||
|
<xsd:enumeration value="hijri"/>
|
||||||
|
<xsd:enumeration value="hebrew"/>
|
||||||
|
<xsd:enumeration value="taiwan"/>
|
||||||
|
<xsd:enumeration value="japan"/>
|
||||||
|
<xsd:enumeration value="thai"/>
|
||||||
|
<xsd:enumeration value="korea"/>
|
||||||
|
<xsd:enumeration value="saka"/>
|
||||||
|
<xsd:enumeration value="gregorianXlitEnglish"/>
|
||||||
|
<xsd:enumeration value="gregorianXlitFrench"/>
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlgClass">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="hash"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CryptProv">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="rsaAES"/>
|
||||||
|
<xsd:enumeration value="rsaFull"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlgType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="typeAny"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ColorType">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Guid">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:pattern value="\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OnOff">
|
||||||
|
<xsd:union memberTypes="xsd:boolean ST_OnOff1"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OnOff1">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="on"/>
|
||||||
|
<xsd:enumeration value="off"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_String">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_XmlName">
|
||||||
|
<xsd:restriction base="xsd:NCName">
|
||||||
|
<xsd:minLength value="1"/>
|
||||||
|
<xsd:maxLength value="255"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TrueFalse">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="f"/>
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TrueFalseBlank">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="f"/>
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
<xsd:enumeration value=""/>
|
||||||
|
<xsd:enumeration value="True"/>
|
||||||
|
<xsd:enumeration value="False"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_UnsignedDecimalNumber">
|
||||||
|
<xsd:restriction base="xsd:decimal">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TwipsMeasure">
|
||||||
|
<xsd:union memberTypes="ST_UnsignedDecimalNumber ST_PositiveUniversalMeasure"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_VerticalAlignRun">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="baseline"/>
|
||||||
|
<xsd:enumeration value="superscript"/>
|
||||||
|
<xsd:enumeration value="subscript"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Xstring">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_XAlign">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_YAlign">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="inline"/>
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ConformanceClass">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="strict"/>
|
||||||
|
<xsd:enumeration value="transitional"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_UniversalMeasure">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="-?[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositiveUniversalMeasure">
|
||||||
|
<xsd:restriction base="ST_UniversalMeasure">
|
||||||
|
<xsd:pattern value="[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Percentage">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="-?[0-9]+(\.[0-9]+)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_FixedPercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="-?((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositivePercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="[0-9]+(\.[0-9]+)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositiveFixedPercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user