feat: refactor 30+ skills to Anthropic progressive disclosure pattern
- All SKILL.md files now <500 lines (avg reduction 69%) - Detailed content extracted to references/ subdirectories - Frontmatter standardised: only name + description (Anthropic standard) - New skills: brand-guidelines, spec-coauthor, report-templates, skill-creator - Design skills: anti-slop guidelines, premium-proposals reference - Removed non-standard frontmatter fields (triggers, version, author, category) Plugins affected: infraestrutura, marketing, dev-tools, crm-ops, gestao, core-tools, negocio, perfex-dev, wordpress, design-media Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -19,7 +19,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -39,7 +39,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -49,7 +49,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -69,7 +69,7 @@
|
||||
{
|
||||
"name": "infraestrutura",
|
||||
"source": "./infraestrutura",
|
||||
"description": "Server management, Proxmox VE/PBS/Clustering, CWP administration, EasyPanel deployments, security audits, backups and MCP development. Backed by 4 Dify KB datasets + NotebookLM Proxmox (150+ sources).",
|
||||
"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.1.0",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -79,7 +79,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -89,7 +89,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -99,7 +99,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -119,7 +119,7 @@
|
||||
{
|
||||
"name": "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",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
@@ -8,5 +8,5 @@
|
||||
},
|
||||
"homepage": "https://git.descomplicar.pt/ealmeida/descomplicar-plugins",
|
||||
"license": "MIT",
|
||||
"keywords": ["automacao", "n8n", "moloni", "dify", "workflows", "integracao"]
|
||||
"keywords": ["automacao", "n8n", "moloni", "workflows", "integracao"]
|
||||
}
|
||||
|
||||
@@ -159,15 +159,6 @@ mcp__notebooklm__notebook_query notebook_id:"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f
|
||||
mcp__notebooklm__notebook_query notebook_id:"929ef67b-c131-4f01-abd0-8b078491a6b7" query:"LLM workflows deployment"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"n8n" query:"workflows automacao integracao"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Ferramentas de Automacao e IA" query:"AI agents orchestration"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Dify" query:"LLM workflows deployment"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Flowise" query:"chatbots automation"
|
||||
```
|
||||
|
||||
## Your Available MCPs
|
||||
|
||||
### Recommended for automation
|
||||
@@ -177,16 +168,14 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Flowise" query:"chatbots automa
|
||||
- **gitea** - Repositórios Git, issues, PRs
|
||||
- **puppeteer** - Browser automation
|
||||
- **memory-supabase** - Memória longo prazo
|
||||
- **dify-kb** - Knowledge base AI
|
||||
- **** - Knowledge base AI
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -208,20 +197,16 @@ moloni, context7, cwp, google-analytics, google-workspace, imap, outline-api, yo
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Colaboração
|
||||
|
||||
- **Reports to**: CTO
|
||||
- **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)
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **2 SDKs** (TaskForce teams):
|
||||
@@ -231,9 +216,6 @@ You are part of **2 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -39,8 +39,6 @@ created: '2025-01-13'
|
||||
updated: '2026-02-04'
|
||||
author: Descomplicar®
|
||||
---
|
||||
|
||||
|
||||
# MCP Protocol Developer Descomplicar
|
||||
|
||||
Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e ferramentas customizadas que expandem o ecossistema Model Context Protocol.
|
||||
@@ -62,14 +60,6 @@ mcp__notebooklm__notebook_query notebook_id:"2876d1fe-5cea-4d98-8140-b0e1a81c6bc
|
||||
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"typescript nodejs api development"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"MCP Servers" query:"protocol development tools integration"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Claude Code" query:"MCP server configuration"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"typescript nodejs api development"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
@@ -119,7 +109,7 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe
|
||||
## MCPs Relevantes
|
||||
- `gitea`: Gestão de código MCP
|
||||
- `desk-crm-v3`: Tracking desenvolvimento (Proj #65, Milestone 256)
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `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
|
||||
|
||||
## Colaboracao
|
||||
@@ -142,9 +132,9 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe
|
||||
- Usage: `mcp__ssh-unified__*`
|
||||
|
||||
✓ **notebooklm** (knowledge primaria)
|
||||
✓ **dify-kb** (knowledge fallback)
|
||||
✓ **** (knowledge fallback)
|
||||
- Knowledge base AI
|
||||
- Usage: `mcp__dify-kb__*`
|
||||
- Usage: `mcp____*`
|
||||
|
||||
### Recommended for dev
|
||||
- **context7** - Context documentation
|
||||
@@ -155,13 +145,11 @@ Especialista em desenvolvimento, optimizacao e manutencao de servidores MCP e fe
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -195,13 +183,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **2 SDKs** (TaskForce teams):
|
||||
@@ -211,9 +197,6 @@ You are part of **2 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -38,8 +38,6 @@ created: '2025-01-13'
|
||||
updated: '2026-02-04'
|
||||
author: 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.
|
||||
@@ -61,14 +59,6 @@ mcp__notebooklm__notebook_query notebook_id:"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f
|
||||
mcp__notebooklm__notebook_query notebook_id:"929ef67b-c131-4f01-abd0-8b078491a6b7" query:"AI automation workflows"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"n8n" query:"workflow automation nodes triggers"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Ferramentas de Automacao e IA" query:"process automation integration"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Dify" query:"AI automation workflows"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
@@ -118,7 +108,7 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados
|
||||
|
||||
## MCPs Relevantes
|
||||
- `desk-crm-v3`: Dados para automações (leads, tarefas)
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB n8n, Ferramentas Automação, Dify
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG)
|
||||
- `memory-supabase`: Histórico de workflows criados
|
||||
|
||||
## Colaboracao
|
||||
@@ -137,9 +127,9 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados
|
||||
- Usage: `mcp__n8n__*`
|
||||
|
||||
✓ **notebooklm** (knowledge primaria)
|
||||
✓ **dify-kb** (knowledge fallback)
|
||||
✓ **** (knowledge fallback)
|
||||
- Knowledge base AI
|
||||
- Usage: `mcp__dify-kb__*`
|
||||
- Usage: `mcp____*`
|
||||
|
||||
✓ **memory-supabase** (system)
|
||||
- Memória longo prazo
|
||||
@@ -151,13 +141,11 @@ Especialista em design, desenvolvimento e optimizacao de workflows automatizados
|
||||
- **puppeteer** - Browser automation
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -179,13 +167,11 @@ moloni, context7, cwp, google-analytics, google-workspace, imap, outline-api, yo
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **2 SDKs** (TaskForce teams):
|
||||
@@ -195,9 +181,6 @@ You are part of **2 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"description": "Knowledge sources (NotebookLM + Dify KB) for Automation domain",
|
||||
"description": "Knowledge sources for Automation domain",
|
||||
"sources": {
|
||||
"notebooklm": {
|
||||
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||
@@ -10,16 +10,13 @@
|
||||
"title": "n8n",
|
||||
"topics": [
|
||||
"n8n"
|
||||
],
|
||||
"maps_from_dify": "n8n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "929ef67b-c131-4f01-abd0-8b078491a6b7",
|
||||
"title": "AI Automation Stack",
|
||||
"topics": [
|
||||
"dify"
|
||||
],
|
||||
"maps_from_dify": "Dify"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "be6f72ac-f8ba-4337-912d-abd5dd448519",
|
||||
@@ -27,8 +24,7 @@
|
||||
"topics": [
|
||||
"open",
|
||||
"webui"
|
||||
],
|
||||
"maps_from_dify": "Open WebUI"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8",
|
||||
@@ -36,79 +32,9 @@
|
||||
"topics": [
|
||||
"ferramentas",
|
||||
"automacao"
|
||||
],
|
||||
"maps_from_dify": "Ferramentas Automacao e IA"
|
||||
}
|
||||
]
|
||||
},
|
||||
"dify_kb": {
|
||||
"description": "Dify KB - datasets tematicos (FALLBACK)",
|
||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
||||
"datasets": [
|
||||
{
|
||||
"id": "f14521df-c44a-48f0-8703-b1d1cf77ca05",
|
||||
"name": "n8n",
|
||||
"priority": 1,
|
||||
"document_count": 1,
|
||||
"word_count": 206928
|
||||
},
|
||||
{
|
||||
"id": "44d1517b-65b8-4d81-8253-5683ff0b8830",
|
||||
"name": "Dify",
|
||||
"priority": 1,
|
||||
"document_count": 4,
|
||||
"word_count": 1244175
|
||||
},
|
||||
{
|
||||
"id": "b0a5e9e6-0d39-4e56-8c61-72c8e14ca41d",
|
||||
"name": "Flowise",
|
||||
"priority": 2,
|
||||
"document_count": 3,
|
||||
"word_count": 245565
|
||||
},
|
||||
{
|
||||
"id": "b3e994c9-f642-4f23-a3db-8d9e344d489f",
|
||||
"name": "Typebot",
|
||||
"priority": 2,
|
||||
"document_count": 1,
|
||||
"word_count": 79608
|
||||
},
|
||||
{
|
||||
"id": "728bed1f-79cb-4e56-aa8a-8dd961197354",
|
||||
"name": "Chatwoot",
|
||||
"priority": 2,
|
||||
"document_count": 7,
|
||||
"word_count": 149615
|
||||
},
|
||||
{
|
||||
"id": "76f14ca9-7e11-4924-9ebc-ccd79876aa78",
|
||||
"name": "Baserow",
|
||||
"priority": 2,
|
||||
"document_count": 1,
|
||||
"word_count": 53665
|
||||
},
|
||||
{
|
||||
"id": "ebf7e4aa-5d2c-49f0-bbb3-f73711a9e0b3",
|
||||
"name": "Open WebUI",
|
||||
"priority": 2,
|
||||
"document_count": 3,
|
||||
"word_count": 15266191
|
||||
},
|
||||
{
|
||||
"id": "22f1d0cf-0661-4a5d-ad0e-b3c1cd2c234a",
|
||||
"name": "Ferramentas Automacao e IA",
|
||||
"priority": 1,
|
||||
"document_count": 41,
|
||||
"word_count": 805400
|
||||
},
|
||||
{
|
||||
"id": "a8987108-2121-4e55-b055-67fe70f8aae0",
|
||||
"name": "Moodle",
|
||||
"priority": 3,
|
||||
"document_count": 40,
|
||||
"word_count": 764457
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
---
|
||||
name: moloni-api
|
||||
description: >-
|
||||
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.
|
||||
description: Referência da API Moloni v2 para facturação portuguesa — autenticação, documentos, clientes e produtos.
|
||||
---
|
||||
|
||||
# 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
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
Criar e gerir webhooks para receber dados externos.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: core-descomplicar
|
||||
description: Padrões fundamentais Descomplicar® - Sacred Rules, Excellence Standards, MCP Protocol. Skill base para todos os agentes.
|
||||
quality_score: 40
|
||||
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®
|
||||
@@ -42,6 +42,9 @@ 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
|
||||
@@ -118,4 +121,4 @@ mcp__memory-supabase__save_memory {
|
||||
|
||||
---
|
||||
|
||||
*Core Standards v1.0 | 2026-01-27*
|
||||
*Core Standards v1.1 | 2026-03-12*
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
---
|
||||
name: agent-context-injector
|
||||
description: >
|
||||
Injecção dinâmica de contexto específico para cada agente.
|
||||
Use when "contexto agente", "injectar", "SubagentStart",
|
||||
"recursos agente", "mcps disponíveis", "skills relevantes".
|
||||
author: Descomplicar®
|
||||
version: 1.0.0
|
||||
desk_task: 1441
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
---
|
||||
name: component-generator
|
||||
description: >
|
||||
Gera componentes Claude Code seguindo templates Descomplicar®.
|
||||
Use when "criar skill", "criar agent", "novo componente",
|
||||
"gerar template", "scaffolding", "criar command".
|
||||
author: Descomplicar®
|
||||
version: 1.0.0
|
||||
desk_task: 1441
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
---
|
||||
name: db-maintenance-manager
|
||||
description: >
|
||||
Manutenção automatizada das tabelas cr_* da infraestrutura Claude Code.
|
||||
Use when "manutenção BD", "limpeza órfãos", "migração schema",
|
||||
"backup tabelas", "archiving", "optimização BD", "database maintenance".
|
||||
author: Descomplicar®
|
||||
version: 1.0.0
|
||||
desk_task: 1441
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
---
|
||||
name: infrastructure-manager
|
||||
description: >
|
||||
Gestão automatizada da infraestrutura Claude Code Descomplicar.
|
||||
Use when "infraestrutura", "sistema", "componentes", "health",
|
||||
"sincronização", "relacionamentos", "mcps", "skills", "agents".
|
||||
author: Descomplicar®
|
||||
version: 1.0.0
|
||||
desk_task: 1441
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,91 +1,68 @@
|
||||
---
|
||||
name: metrics
|
||||
description: >
|
||||
Performance metrics dashboard for skills and agents with quantitative telemetry. Automatic tracking, temporal trending, degradation alerts, Dify KB impact analysis and ROI calculation per client/project.
|
||||
Use when analyzing performance, tracking improvements, validating PDCA cycles, calculating ROI, or when user mentions
|
||||
"metrics", "performance", "dashboard", "analytics", "trending", "degradation", "baseline", "improvement", "roi calculation".
|
||||
author: Descomplicar® Crescimento Digital
|
||||
version: 1.3.0
|
||||
user_invocable: true
|
||||
tags: [metrics, pdca, performance, dashboard, dify-kb, analytics, roi]
|
||||
desk_project: 65
|
||||
desk_task: 1637
|
||||
allowed-tools: mcp__desk-crm-v3__get_skill_metrics, mcp__desk-crm-v3__log_skill_metric, Read
|
||||
category: infra
|
||||
quality_score: 85
|
||||
updated: "2026-02-04T18:00:00Z"
|
||||
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
|
||||
|
||||
**Trigger:** `/metrics`
|
||||
## Proposito
|
||||
|
||||
---
|
||||
Dashboard interactivo de performance de skills e agents com metricas quantitativas automaticas gravadas em Desk DB.
|
||||
|
||||
## Propósito
|
||||
|
||||
Dashboard interactivo de performance de skills e agents com métricas quantitativas automáticas gravadas em Desk DB.
|
||||
|
||||
**Complementa:**
|
||||
- `/reflect` (qualitativo) com dados quantitativos
|
||||
- `/worklog` com métricas objectivas
|
||||
- PDCA com decisões data-driven
|
||||
Complementa `/reflect` (qualitativo) com dados quantitativos, `/worklog` com metricas objectivas, e PDCA com decisoes data-driven.
|
||||
|
||||
---
|
||||
|
||||
## Quando Usar
|
||||
|
||||
- Ver performance de skills/agents
|
||||
- Identificar degradações de performance
|
||||
- Identificar degradacoes de performance
|
||||
- Validar melhorias PDCA
|
||||
- Análise ROI de optimizações
|
||||
- Dashboard executivo de automação
|
||||
- Analise ROI de optimizacoes
|
||||
- Dashboard executivo de automacao
|
||||
|
||||
---
|
||||
|
||||
## Capabilities
|
||||
## Comandos
|
||||
|
||||
### Tipos de Análise
|
||||
|
||||
| Comando | Função |
|
||||
| Comando | Funcao |
|
||||
|---------|--------|
|
||||
| `/metrics` | Overview geral (30 dias) |
|
||||
| `/metrics <skill-name>` | Detalhes de skill específica |
|
||||
| `/metrics --project <id>` | Métricas por projecto |
|
||||
| `/metrics <skill-name>` | Detalhes de skill especifica |
|
||||
| `/metrics --project <id>` | Metricas por projecto |
|
||||
| `/metrics --trend` | Trending temporal |
|
||||
| `/metrics --compare` | Comparação vs baseline |
|
||||
| `/metrics --kb` | **NOVO v1.2** Métricas Dify KB |
|
||||
| `/metrics --roi` | **NOVO v1.2** ROI por cliente/projecto |
|
||||
| `/metrics --export` | **NOVO v1.2** Exportar JSON/CSV |
|
||||
| `/metrics --alerts` | **NOVO v1.2** Listar alertas activos |
|
||||
| `/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 |
|
||||
|
||||
### Agregações Disponíveis
|
||||
### Agregacoes Disponiveis
|
||||
|
||||
1. **avg** - Médias de performance (padrão)
|
||||
1. **avg** - Medias de performance (padrao)
|
||||
2. **count** - Contagens por status
|
||||
3. **trend** - Evolução temporal (semanal)
|
||||
4. **compare** - Comparação com baseline
|
||||
3. **trend** - Evolucao temporal (semanal)
|
||||
4. **compare** - Comparacao com baseline
|
||||
5. **detailed** - Listagem detalhada
|
||||
|
||||
---
|
||||
|
||||
## Execução
|
||||
## Execucao
|
||||
|
||||
### 1. Verificar Tools MCP Disponíveis
|
||||
### 1. Verificar Tools MCP
|
||||
|
||||
```javascript
|
||||
// Tools necessários (MCP desk-crm-v3)
|
||||
// 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 não disponíveis → query SQL directa como fallback
|
||||
// Se tools nao disponiveis -> query SQL directa como fallback
|
||||
```
|
||||
|
||||
### 2. Query Métricas (Via MCP ou SQL)
|
||||
### 2. Query Metricas
|
||||
|
||||
**Opção A: Via MCP (preferencial)**
|
||||
**Via MCP (preferencial):**
|
||||
|
||||
```javascript
|
||||
const metrics = await mcp__desk_crm_v3__get_skill_metrics({
|
||||
@@ -95,53 +72,22 @@ const metrics = await mcp__desk_crm_v3__get_skill_metrics({
|
||||
});
|
||||
```
|
||||
|
||||
**Opção B: Fallback SQL Directo**
|
||||
|
||||
```sql
|
||||
-- Via MCP desk-crm-v3 SQL directo se tools metrics não disponíveis
|
||||
SELECT
|
||||
name,
|
||||
type,
|
||||
COUNT(*) as executions,
|
||||
AVG(duration_ms) as avg_ms,
|
||||
(SUM(CASE WHEN status='error' THEN 1 ELSE 0 END) / COUNT(*) * 100) as error_rate
|
||||
FROM tblskill_agent_metrics
|
||||
WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||
GROUP BY name, type
|
||||
ORDER BY executions DESC
|
||||
LIMIT 10;
|
||||
```
|
||||
**Fallback SQL:** Ver [references/sql-queries.md](references/sql-queries.md)
|
||||
|
||||
### 3. Formatar Output
|
||||
|
||||
**Template Dashboard:**
|
||||
|
||||
```
|
||||
📊 Performance Overview (últimos {days} dias)
|
||||
Performance Overview (ultimos {days} dias)
|
||||
|
||||
Top Skills/Agents:
|
||||
┌─────────────────────┬────────┬──────────┬────────┬────────┐
|
||||
│ Nome │ Usos │ Avg Time │ Trend │ Status │
|
||||
├─────────────────────┼────────┼──────────┼────────┼────────┤
|
||||
│ /orcamento │ 45 │ 18min │ -12% ✓ │ ✅ │
|
||||
│ /lead-approach │ 38 │ 22min │ +5% ⚠ │ ⚠️ │
|
||||
│ wp-plugin-developer │ 32 │ 47min │ -8% ✓ │ ✅ │
|
||||
└─────────────────────┴────────┴──────────┴────────┴────────┘
|
||||
|
||||
⚠️ Alertas de Degradação:
|
||||
{se houver degradação >15%}
|
||||
|
||||
🎯 Dify KB Impact:
|
||||
- Coverage: {skills_com_dify}/{total_skills} ({pct}%)
|
||||
- Avg time reduction: {reducao_tempo}%
|
||||
- Cache hit rate: {cache_hit_rate}%
|
||||
|
||||
📈 Dashboard completo: https://plan-eal.descomplicar.pt/metrics
|
||||
| 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. Análise Específica
|
||||
|
||||
Se utilizador pedir skill específica:
|
||||
### 4. Analise Especifica
|
||||
|
||||
```javascript
|
||||
const details = await get_skill_metrics({
|
||||
@@ -150,52 +96,21 @@ const details = await get_skill_metrics({
|
||||
aggregate: 'detailed'
|
||||
});
|
||||
|
||||
// Calcular estatísticas
|
||||
const baseline = await query("SELECT baseline_duration_ms FROM tblskill_agent_baselines WHERE name = ?", [skill_name]);
|
||||
const baseline = await query(
|
||||
"SELECT baseline_duration_ms FROM tblskill_agent_baselines WHERE name = ?",
|
||||
[skill_name]
|
||||
);
|
||||
const improvement = ((baseline - current_avg) / baseline * 100);
|
||||
```
|
||||
|
||||
**Output Detalhado:**
|
||||
|
||||
```
|
||||
📊 {skill_name} - Análise Detalhada
|
||||
|
||||
Performance (30 dias):
|
||||
- Execuções: {count}
|
||||
- Tempo médio: {avg_ms}ms ({format_time})
|
||||
- Baseline: {baseline_ms}ms
|
||||
- Melhoria: {improvement}% {icon}
|
||||
- Error rate: {error_rate}%
|
||||
- Success rate: {success_rate}%
|
||||
|
||||
Dify KB:
|
||||
- Consultas: {kb_consulted_count}/{total} ({pct}%)
|
||||
- Com KB: {avg_with_kb}ms
|
||||
- Sem KB: {avg_without_kb}ms
|
||||
- Cache hit: {cache_hit_rate}%
|
||||
|
||||
Trending (últimas 4 semanas):
|
||||
Semana 1: {w1_avg}ms ({w1_count} usos)
|
||||
Semana 2: {w2_avg}ms ({w2_count} usos)
|
||||
Semana 3: {w3_avg}ms ({w3_count} usos)
|
||||
Semana 4: {w4_avg}ms ({w4_count} usos) {trend_icon}
|
||||
|
||||
Últimas 5 execuções:
|
||||
1. {timestamp} - {duration}ms - {status}
|
||||
2. ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Alertas Automáticos
|
||||
|
||||
### Detectar Degradação
|
||||
## Alertas Automaticos
|
||||
|
||||
```javascript
|
||||
// Query comparação com baseline
|
||||
const degraded = await get_skill_metrics({
|
||||
aggregate: 'compare',
|
||||
days: 7 // última semana
|
||||
days: 7
|
||||
});
|
||||
|
||||
const alerts = degraded.results.filter(r =>
|
||||
@@ -203,31 +118,11 @@ const alerts = degraded.results.filter(r =>
|
||||
);
|
||||
|
||||
if (alerts.length > 0) {
|
||||
// Output alertas
|
||||
for (const alert of alerts) {
|
||||
console.log(`⚠️ ${alert.name}: +${alert.degradation_pct}% vs baseline`);
|
||||
}
|
||||
|
||||
// Sugerir acção
|
||||
console.log("\n💡 Sugestão: Executar /reflect para investigar causas");
|
||||
// Output alertas e sugerir /reflect para investigar
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integração com Outros Sistemas
|
||||
|
||||
### Link para Desk CRM
|
||||
|
||||
```
|
||||
Ver métricas no Desk CRM:
|
||||
https://desk.descomplicar.pt/admin/projects/view/65
|
||||
|
||||
Relatório personalizado:
|
||||
Reports → Stack Performance
|
||||
```
|
||||
|
||||
### Trigger Reflect se Degradação
|
||||
### Trigger Reflect se Degradacao
|
||||
|
||||
```javascript
|
||||
if (degradation_pct > 15) {
|
||||
@@ -236,356 +131,47 @@ if (degradation_pct > 15) {
|
||||
subagent_type: 'reflect-agent',
|
||||
background: true,
|
||||
model: 'sonnet',
|
||||
prompt: `
|
||||
PERFORMANCE DEGRADATION DETECTED
|
||||
|
||||
Component: ${name}
|
||||
Baseline: ${baseline}ms
|
||||
Current: ${current}ms
|
||||
Degradation: ${degradation_pct}%
|
||||
|
||||
Analyze root cause and suggest fixes.
|
||||
`
|
||||
prompt: `PERFORMANCE DEGRADATION: ${name} +${degradation_pct}%`
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Queries SQL Úteis (Fallback)
|
||||
|
||||
### Top 10 Skills
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
name,
|
||||
COUNT(*) as uses,
|
||||
AVG(duration_ms)/60000 as avg_min,
|
||||
(SUM(CASE WHEN status='error' THEN 1 ELSE 0 END) / COUNT(*) * 100) as error_rate
|
||||
FROM tblskill_agent_metrics
|
||||
WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||
AND type = 'skill'
|
||||
GROUP BY name
|
||||
ORDER BY uses DESC
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
### ROI por Projecto
|
||||
|
||||
```sql
|
||||
WITH skill_savings AS (
|
||||
SELECT
|
||||
m.project_id,
|
||||
m.name,
|
||||
COUNT(*) as uses,
|
||||
(b.baseline_duration_ms - AVG(m.duration_ms))/60000 as saved_per_use_min
|
||||
FROM tblskill_agent_metrics m
|
||||
JOIN tblskill_agent_baselines b ON b.name = m.name
|
||||
WHERE m.status = 'success'
|
||||
GROUP BY m.project_id, m.name
|
||||
)
|
||||
SELECT
|
||||
p.name as project,
|
||||
c.company as client,
|
||||
s.name as skill,
|
||||
s.uses,
|
||||
ROUND(s.uses * s.saved_per_use_min/60, 1) as hours_saved,
|
||||
ROUND((s.uses * s.saved_per_use_min/60) * 50, 2) as value_eur
|
||||
FROM skill_savings s
|
||||
JOIN tblprojects p ON p.id = s.project_id
|
||||
JOIN tblclients c ON c.userid = p.clientid
|
||||
WHERE s.saved_per_use_min > 0
|
||||
ORDER BY hours_saved DESC;
|
||||
```
|
||||
|
||||
### Trending Semanal
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
name,
|
||||
DATE_FORMAT(created_at, '%Y-W%u') as week,
|
||||
COUNT(*) as executions,
|
||||
AVG(duration_ms) as avg_ms
|
||||
FROM tblskill_agent_metrics
|
||||
WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY)
|
||||
GROUP BY name, week
|
||||
ORDER BY name, week DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Exemplo de Uso
|
||||
|
||||
```bash
|
||||
# Dashboard geral
|
||||
> /metrics
|
||||
|
||||
📊 Performance Overview (últimos 30 dias)
|
||||
|
||||
Top Skills:
|
||||
┌─────────────────────┬────────┬──────────┬────────┐
|
||||
│ Skill │ Usos │ Avg Time │ Trend │
|
||||
├─────────────────────┼────────┼──────────┼────────┤
|
||||
│ /orcamento │ 45 │ 18min │ -12% ✓ │
|
||||
│ /lead-approach │ 38 │ 22min │ +5% ⚠ │
|
||||
│ /wp-dev │ 32 │ 47min │ -8% ✓ │
|
||||
└─────────────────────┴────────┴──────────┴────────┘
|
||||
|
||||
⚠️ 1 alerta detectado
|
||||
🎯 Dify KB: 35/43 skills (81%)
|
||||
|
||||
# Análise específica
|
||||
> /metrics /orcamento
|
||||
|
||||
📊 /orcamento - Análise Detalhada
|
||||
|
||||
Performance: 18min avg (vs 30min baseline) → -40% ✓
|
||||
Execuções: 45 (última semana: 12)
|
||||
Success: 96% | Errors: 4%
|
||||
|
||||
Trending: ↓ Melhoria constante
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Notas Técnicas
|
||||
|
||||
### Tools MCP Status
|
||||
|
||||
**Estado:** Implementados em `/opt/desk-crm-v3/src/tools/core/metrics.ts`
|
||||
**Compilados:** ✅ `/opt/desk-crm-v3/dist/tools/core/metrics.js`
|
||||
**Serviço:** ✅ desk-crm.service reiniciado (249 tools)
|
||||
**Disponibilidade:** Podem precisar de refresh Claude Code para serem descobertos
|
||||
|
||||
### Fallback Strategy
|
||||
|
||||
Se tools MCP não disponíveis:
|
||||
1. Usar queries SQL directas via `sql_direct` tool
|
||||
2. Funcionalidade completa mantém-se
|
||||
3. Performance ligeiramente inferior mas aceitável
|
||||
|
||||
### Tabelas DB
|
||||
|
||||
- `tblskill_agent_metrics` - Telemetria
|
||||
- `tblskill_agent_baselines` - Baselines
|
||||
- `tblskill_agent_pdca_cycles` - PDCA histórico
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## NOVO v1.2.0: Métricas Dify KB
|
||||
|
||||
### /metrics --kb
|
||||
|
||||
Dashboard específico de performance Dify Knowledge Base.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ DIFY KB PERFORMANCE DASHBOARD │
|
||||
│ 2026-02-03 │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ CACHE PERFORMANCE │
|
||||
│ ════════════════════════════════════════════════════════ │
|
||||
│ Hit Rate: ████░░░░░░░░░░░░░░░░ 6.3% (target: 40%+) │
|
||||
│ │
|
||||
│ Cache Breakdown: │
|
||||
│ ┌────────────────┬────────┬────────┬────────┐ │
|
||||
│ │ Skill │ Queries│ Hits │ Hit % │ │
|
||||
│ ├────────────────┼────────┼────────┼────────┤ │
|
||||
│ │ /orcamento │ 5 │ 1 │ 20% │ │
|
||||
│ │ /lead-approach │ 3 │ 0 │ 0% │ │
|
||||
│ │ /wp-dev │ 4 │ 0 │ 0% │ │
|
||||
│ │ /seo-content │ 2 │ 0 │ 0% │ │
|
||||
│ └────────────────┴────────┴────────┴────────┘ │
|
||||
│ │
|
||||
│ QUERY RELEVANCE (avg score) │
|
||||
│ ════════════════════════════════════════════════════════ │
|
||||
│ SEO: █████████████████░░░ 0.85 ⭐ │
|
||||
│ Perfex: ████████████████░░░░ 0.79 │
|
||||
│ Elementor: ██████████████░░░░░░ 0.70 │
|
||||
│ Marketing: █████████████░░░░░░░ 0.66 │
|
||||
│ Vendas: █████████░░░░░░░░░░░ 0.46 ⚠️ │
|
||||
│ │
|
||||
│ IMPACT ON PERFORMANCE │
|
||||
│ ════════════════════════════════════════════════════════ │
|
||||
│ Com Dify KB: 18 min avg │
|
||||
│ Sem Dify KB: 30 min avg (baseline) │
|
||||
│ Improvement: -40% ✓ │
|
||||
│ │
|
||||
│ GAPS DETECTED │
|
||||
│ ════════════════════════════════════════════════════════ │
|
||||
│ ⚠️ Vendas dataset: score 0.46 (queries mal formuladas) │
|
||||
│ ℹ️ Cache hit baixo: requer mais uso para acumular │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### /metrics --roi
|
||||
|
||||
ROI detalhado por cliente/projecto.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ ROI POR CLIENTE/PROJECTO │
|
||||
│ Últimos 30 dias │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ TOP CLIENTES POR VALOR GERADO │
|
||||
│ ════════════════════════════════════════════════════════ │
|
||||
│ ┌────────────────────┬────────┬────────┬──────────────┐ │
|
||||
│ │ Cliente │ Horas │ Skills │ Valor (€) │ │
|
||||
│ ├────────────────────┼────────┼────────┼──────────────┤ │
|
||||
│ │ SFV-360 │ 24h │ 45 │ €1.200,00 │ │
|
||||
│ │ Descomplicar │ 18h │ 32 │ €900,00 │ │
|
||||
│ │ INTERNAL │ 12h │ 28 │ €600,00 │ │
|
||||
│ └────────────────────┴────────┴────────┴──────────────┘ │
|
||||
│ │
|
||||
│ TOTAL PERÍODO: 54 horas poupadas = €2.700,00 │
|
||||
│ Custo hora interno: €50,00 │
|
||||
│ │
|
||||
│ BREAKDOWN POR SKILL │
|
||||
│ ════════════════════════════════════════════════════════ │
|
||||
│ /orcamento: 12h poupadas (baseline 30min→18min) │
|
||||
│ /wp-dev: 8h poupadas (baseline 4h→2h) │
|
||||
│ /lead-approach: 6h poupadas (baseline 25min→12min) │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### /metrics --export
|
||||
|
||||
Exportar métricas para integração.
|
||||
|
||||
```
|
||||
Formatos disponíveis:
|
||||
1. JSON - ~/.claude/skills/_metrics-export-YYYYMMDD.json
|
||||
2. CSV - ~/.claude/skills/_metrics-export-YYYYMMDD.csv
|
||||
3. Markdown - Para colar em documentos
|
||||
|
||||
Campos exportados:
|
||||
- name, type, executions, avg_ms, baseline_ms
|
||||
- improvement_pct, error_rate, kb_consulted
|
||||
- cache_hit_rate, project_id, client_name
|
||||
```
|
||||
|
||||
### /metrics --alerts
|
||||
|
||||
Sistema de alertas inteligentes.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ ALERTAS ACTIVOS │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ⚠️ DEGRADAÇÃO (>15% vs baseline) │
|
||||
│ ─────────────────────────────────────────────────────── │
|
||||
│ /lead-approach: +22% (baseline 12min → actual 15min) │
|
||||
│ Última ocorrência: 2026-02-02 │
|
||||
│ Afecta: 3 projectos │
|
||||
│ Acção: Executar /reflect para investigar │
|
||||
│ │
|
||||
│ ℹ️ LOW CACHE HIT (<30%) │
|
||||
│ ─────────────────────────────────────────────────────── │
|
||||
│ Cache hit rate: 6.3% │
|
||||
│ Target: 40% │
|
||||
│ Causa: Sistema recente, acumular com uso │
|
||||
│ Acção: Continuar monitorização │
|
||||
│ │
|
||||
│ ✅ MELHORIAS DETECTADAS │
|
||||
│ ─────────────────────────────────────────────────────── │
|
||||
│ /orcamento: -40% (era 30min, agora 18min) │
|
||||
│ /wp-dev: -50% (era 4h, agora 2h) │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
|
||||
Configurar alertas:
|
||||
- Degradação threshold: 15% (padrão)
|
||||
- Cache hit minimum: 30% (padrão)
|
||||
- Error rate maximum: 10% (padrão)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ASCII Charts Library
|
||||
|
||||
Templates reutilizáveis para visualização.
|
||||
|
||||
### Progress Bar
|
||||
```javascript
|
||||
function progressBar(value, max, width=20) {
|
||||
const filled = Math.round((value / max) * width);
|
||||
const empty = width - filled;
|
||||
return '█'.repeat(filled) + '░'.repeat(empty);
|
||||
}
|
||||
|
||||
// Exemplo: progressBar(40, 100, 20) → "████████░░░░░░░░░░░░"
|
||||
```
|
||||
|
||||
### Trending Arrow
|
||||
```javascript
|
||||
function trendIcon(pct) {
|
||||
if (pct < -10) return '↓↓ ✓'; // Grande melhoria
|
||||
if (pct < 0) return '↓ ✓'; // Melhoria
|
||||
if (pct === 0) return '→'; // Estável
|
||||
if (pct < 10) return '↑ ⚠'; // Pequena degradação
|
||||
return '↑↑ ⚠️'; // Grande degradação
|
||||
}
|
||||
```
|
||||
|
||||
### Mini Sparkline
|
||||
```javascript
|
||||
function sparkline(values) {
|
||||
const chars = '▁▂▃▄▅▆▇█';
|
||||
const min = Math.min(...values);
|
||||
const max = Math.max(...values);
|
||||
const range = max - min || 1;
|
||||
return values.map(v => chars[Math.floor((v - min) / range * 7)]).join('');
|
||||
}
|
||||
|
||||
// Exemplo: sparkline([10, 15, 8, 20, 12]) → "▃▅▁█▄"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integração com /taskforce kb-health
|
||||
|
||||
O comando `/metrics --kb` complementa `/taskforce kb-health`:
|
||||
## Integracao com Outros Sistemas
|
||||
|
||||
| Comando | Foco | Quando Usar |
|
||||
|---------|------|-------------|
|
||||
| `/taskforce kb-health` | Saúde sistema KB (coverage, gaps) | Visão arquitectural |
|
||||
| `/metrics --kb` | Performance queries KB | Análise operacional |
|
||||
| `/metrics --roi` | Valor económico gerado | Justificação investimento |
|
||||
| `/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
|
||||
|
||||
---
|
||||
|
||||
## Changelog
|
||||
|
||||
### v1.2.0 (2026-02-03)
|
||||
- **NOVO:** `/metrics --kb` - Dashboard Dify KB
|
||||
- **NOVO:** `/metrics --roi` - ROI por cliente/projecto
|
||||
- **NOVO:** `/metrics --export` - Export JSON/CSV
|
||||
- **NOVO:** `/metrics --alerts` - Sistema alertas
|
||||
- **NOVO:** ASCII Charts Library
|
||||
- **MELHORIA:** Integração com `/taskforce kb-health`
|
||||
- Frontmatter YAML standard
|
||||
|
||||
### v1.0.0 (2026-02-03)
|
||||
- Versão inicial
|
||||
- Dashboard overview
|
||||
- Análise por skill
|
||||
- Trending temporal
|
||||
- Comparação baseline
|
||||
Link Desk CRM: `https://desk.descomplicar.pt/admin/projects/view/65`
|
||||
|
||||
---
|
||||
|
||||
**Skill:** /metrics v1.2.0 | **Autor:** Descomplicar®
|
||||
**Parte de:** Sistema de Métricas Quantitativas
|
||||
**Desk CRM:** Projecto #65 | Task #1637
|
||||
## 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;
|
||||
```
|
||||
@@ -1,12 +1,6 @@
|
||||
---
|
||||
name: plugin-curator
|
||||
description: >
|
||||
Curadoria inteligente de plugins para o ecossistema Claude Code.
|
||||
Use when "plugins", "marketplace", "instalar plugin", "descobrir",
|
||||
"recomendações", "actualizar", "gaps funcionais", "extensões".
|
||||
author: Descomplicar®
|
||||
version: 1.0.0
|
||||
desk_task: 1441
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,17 +1,7 @@
|
||||
---
|
||||
name: plugin-config
|
||||
description: >
|
||||
Gestao inteligente de plugins por contexto v3.0. Avalia regras aditivas — activa
|
||||
cada plugin que fizer sentido para o contexto actual (directorio, ficheiros, conversa).
|
||||
Sem profiles rigidos. Use when "plugins", "plugin-config", "activar plugin",
|
||||
"desactivar plugin", "contexto plugins", "prompt too long".
|
||||
author: Descomplicar
|
||||
version: 3.1.0
|
||||
user_invocable: true
|
||||
category: system
|
||||
tags: [plugins, context, optimization, registry]
|
||||
desk_project: 65
|
||||
desk_task: 1754
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
---
|
||||
name: quality-validator
|
||||
description: >
|
||||
Valida componentes contra standards Descomplicar®.
|
||||
Use when "validar", "score", "qualidade", "audit",
|
||||
"verificar frontmatter", "checklist", "quality gate".
|
||||
author: Descomplicar®
|
||||
version: 1.0.0
|
||||
desk_task: 1441
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
---
|
||||
name: relationship-manager
|
||||
description: >
|
||||
Gestão inteligente de relacionamentos entre componentes do sistema.
|
||||
Use when "relacionamentos", "mapeamento", "colaborações", "dependências",
|
||||
"agent-mcp", "agent-skill", "sdk", "impacto", "inconsistências".
|
||||
author: Descomplicar®
|
||||
version: 1.0.0
|
||||
desk_task: 1441
|
||||
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
|
||||
---
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"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.1.0",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
|
||||
@@ -13,7 +13,6 @@ primary_mcps:
|
||||
recommended_mcps:
|
||||
- moloni
|
||||
- memory-supabase
|
||||
- dify-kb
|
||||
skills:
|
||||
- _core
|
||||
- orcamento
|
||||
@@ -116,7 +115,7 @@ Você é um especialista comercial responsável por:
|
||||
| `desk-crm-v3` | Verificar cliente, criar estimate |
|
||||
| `google-workspace` | Criar orçamento em Google Docs |
|
||||
| `memory-supabase` | Consultar orçamentos similares |
|
||||
| `dify-kb` | Best practices pricing |
|
||||
| `` | Best practices pricing |
|
||||
|
||||
## Responsabilidades
|
||||
|
||||
@@ -180,15 +179,6 @@ mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37a
|
||||
mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb7721601" query:"desenvolvimento custos"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"orcamento proposta pricing"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao" query:"projectos estimativa custos"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"servicos pacotes"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"desenvolvimento custos"
|
||||
```
|
||||
|
||||
## Your Available MCPs
|
||||
|
||||
### Recommended for business
|
||||
@@ -197,16 +187,14 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"desenvolvimen
|
||||
- **google-workspace** - Email, calendário, docs, drive
|
||||
- **imap** - Email IMAP
|
||||
- **memory-supabase** - Memória longo prazo
|
||||
- **dify-kb** - Knowledge base AI
|
||||
- **** - Knowledge base AI
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -235,13 +223,11 @@ context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-re
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Colaboração
|
||||
|
||||
- **Reports to**: Sales Manager
|
||||
|
||||
@@ -13,7 +13,6 @@ primary_mcps:
|
||||
- desk-crm-v3
|
||||
- google-workspace
|
||||
recommended_mcps:
|
||||
- dify-kb
|
||||
- memory-supabase
|
||||
- imap
|
||||
skills:
|
||||
@@ -38,8 +37,6 @@ created: '2025-01-13'
|
||||
updated: '2026-02-04'
|
||||
author: 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.
|
||||
@@ -86,9 +83,6 @@ Especialista em estratégia de abordagem de leads - análise de perfil, definiç
|
||||
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>"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario)
|
||||
|
||||
- Vendas
|
||||
- Marketing Digital
|
||||
- Copywriting
|
||||
@@ -147,7 +141,7 @@ Estrategista comercial especializado em análise de leads e criação de abordag
|
||||
|
||||
## MCPs Relevantes
|
||||
- `desk-crm-v3`: Dados de leads e histórico
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `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
|
||||
|
||||
## Colaboracao
|
||||
@@ -166,9 +160,9 @@ Estrategista comercial especializado em análise de leads e criação de abordag
|
||||
- Gemini 2.5 RAG
|
||||
- Usage: `mcp__notebooklm__notebook_query`
|
||||
|
||||
✓ **dify-kb** (knowledge fallback)
|
||||
✓ **** (knowledge fallback)
|
||||
- Knowledge base AI
|
||||
- Usage: `mcp__dify-kb__*`
|
||||
- Usage: `mcp____*`
|
||||
|
||||
✓ **memory-supabase** (system)
|
||||
- Memória longo prazo
|
||||
@@ -186,13 +180,11 @@ Estrategista comercial especializado em análise de leads e criação de abordag
|
||||
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -219,7 +211,7 @@ moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, imap, outline-api, w
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
|
||||
@@ -12,7 +12,6 @@ tools: Read, Glob, Grep, ToolSearch
|
||||
primary_mcps:
|
||||
- desk-crm-v3
|
||||
recommended_mcps:
|
||||
- dify-kb
|
||||
- google-workspace
|
||||
- memory-supabase
|
||||
skills:
|
||||
@@ -37,8 +36,6 @@ created: '2025-01-13'
|
||||
updated: '2026-02-04'
|
||||
author: 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.
|
||||
@@ -59,14 +56,6 @@ mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf565
|
||||
mcp__notebooklm__notebook_query notebook_id:"df4688bb-c2c0-4aba-98c1-38c3b50a353c" query:"lead management pipeline"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"lead qualification scoring criteria"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"lead generation conversion funnel"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"PerfexCRM" query:"lead management pipeline"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
@@ -120,7 +109,7 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr
|
||||
|
||||
## MCPs Relevantes
|
||||
- `desk-crm-v3`: Gestão de leads e pipeline
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `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
|
||||
|
||||
## Colaboracao
|
||||
@@ -135,9 +124,9 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr
|
||||
- Usage: `mcp__desk-crm-v3__*`
|
||||
|
||||
✓ **notebooklm** (knowledge primaria)
|
||||
✓ **dify-kb** (knowledge fallback)
|
||||
✓ **** (knowledge fallback)
|
||||
- Knowledge base AI
|
||||
- Usage: `mcp__dify-kb__*`
|
||||
- Usage: `mcp____*`
|
||||
|
||||
✓ **memory-supabase** (system)
|
||||
- Memória longo prazo
|
||||
@@ -149,13 +138,11 @@ Avalia e prioriza leads inbound, garantindo que a equipa de vendas se foca em pr
|
||||
- **imap** - Email IMAP
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -184,13 +171,11 @@ context7, gitea, n8n, cwp, filesystem, ssh-unified, google-analytics, youtube-re
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **3 SDKs** (TaskForce teams):
|
||||
@@ -200,9 +185,6 @@ You are part of **3 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -25,7 +25,6 @@ recommended_mcps:
|
||||
- moloni # Invoicing
|
||||
- imap # Email management
|
||||
- memory-supabase # Long-term memory
|
||||
- dify-kb # Knowledge base
|
||||
- outline-api # Documentation
|
||||
|
||||
primary_skills:
|
||||
@@ -91,14 +90,6 @@ mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf565
|
||||
mcp__notebooklm__notebook_query notebook_id:"df4688bb-c2c0-4aba-98c1-38c3b50a353c" query:"CRM clientes pipeline"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Vendas" query:"estrategias comerciais leads conversao"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"funil vendas qualificacao"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"PerfexCRM" query:"CRM clientes pipeline"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"description": "Knowledge sources (NotebookLM + Dify KB) for CRM Operations domain",
|
||||
"description": "Knowledge sources for CRM Operations domain",
|
||||
"sources": {
|
||||
"notebooklm": {
|
||||
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||
@@ -10,8 +10,7 @@
|
||||
"title": "Perfex CRM: Gestao de Clientes e Projetos",
|
||||
"topics": [
|
||||
"perfexcrm"
|
||||
],
|
||||
"maps_from_dify": "PerfexCRM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "f29c8457-f16d-4fb3-979d-6e5901de1b20",
|
||||
@@ -19,30 +18,9 @@
|
||||
"topics": [
|
||||
"servicos",
|
||||
"descomplicar"
|
||||
],
|
||||
"maps_from_dify": "Servicos Descomplicar"
|
||||
}
|
||||
]
|
||||
},
|
||||
"dify_kb": {
|
||||
"description": "Dify KB - datasets tematicos (FALLBACK)",
|
||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
||||
"datasets": [
|
||||
{
|
||||
"id": "43354eb6-f0b2-40cc-aa53-44e375ab347c",
|
||||
"name": "PerfexCRM",
|
||||
"priority": 1,
|
||||
"document_count": 144,
|
||||
"word_count": 1547186
|
||||
},
|
||||
{
|
||||
"id": "bd65f36e-6004-4584-b478-129b2c21b4d2",
|
||||
"name": "Servicos Descomplicar",
|
||||
"priority": 1,
|
||||
"document_count": 11,
|
||||
"word_count": 1095103
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,7 @@
|
||||
---
|
||||
name: auto-expense
|
||||
description: >
|
||||
Criacao automatica de despesas a partir de facturas detectadas no IMAP e tickets. Le ficheiros JSON de /imap-triage e /ticket-triage, extrai dados das facturas, cria despesas no Desk CRM com PDF. Use when "auto despesa", "processar facturas", "auto-expense", "despesas automaticas".
|
||||
author: Descomplicar® Crescimento Digital
|
||||
version: 1.0.0
|
||||
quality_score: 85
|
||||
user_invocable: true
|
||||
category: finance
|
||||
tags: [expense, auto, invoices, imap, tickets, pdf, desk-crm]
|
||||
desk_task: 1710
|
||||
desk_project: 65
|
||||
allowed-tools: Read, Write, mcp__desk-crm-v3, mcp__imap, mcp__ssh-unified
|
||||
mcps: desk-crm-v3, imap, ssh-unified
|
||||
dependencies:
|
||||
mcps: [desk-crm-v3, imap, ssh-unified]
|
||||
skills: [imap-triage, ticket-triage]
|
||||
files:
|
||||
- /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md
|
||||
triggers:
|
||||
- "User asks to process invoices as expenses"
|
||||
- "User mentions 'auto despesa', 'processar facturas'"
|
||||
- "Invoked by /today orchestrator after /imap-triage and /ticket-triage"
|
||||
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
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
---
|
||||
name: billing-check
|
||||
description: Billing verification and invoice validation. Checks billing accuracy,
|
||||
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
|
||||
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.
|
||||
---
|
||||
|
||||
# Billing Check - Desk vs Moloni (v2.0)
|
||||
|
||||
@@ -1,13 +1,7 @@
|
||||
---
|
||||
name: crm-admin
|
||||
description: Desk CRM administration and maintenance. Manages users, permissions,
|
||||
custom fields, and system configuration. Use when user mentions "crm admin", "desk
|
||||
admin", "crm configuration", "user management", "crm permissions".
|
||||
author: Descomplicar® Crescimento Digital
|
||||
version: 1.0.0
|
||||
quality_score: 75
|
||||
user_invocable: true
|
||||
desk_task: 1467
|
||||
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.
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# CRM Admin Specialist
|
||||
|
||||
@@ -1,42 +1,7 @@
|
||||
---
|
||||
name: crm-ops
|
||||
description: >
|
||||
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".
|
||||
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
|
||||
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.
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# /crm-ops - Operações CRM Seguras
|
||||
|
||||
@@ -1,22 +1,6 @@
|
||||
---
|
||||
name: crm
|
||||
description: >
|
||||
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"
|
||||
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.
|
||||
---
|
||||
|
||||
# /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
|
||||
|
||||
| Comando | Função |
|
||||
|
||||
@@ -1,21 +1,6 @@
|
||||
---
|
||||
name: desk
|
||||
description: >
|
||||
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"
|
||||
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.
|
||||
---
|
||||
|
||||
# /desk v3.0 - Contexto de Projecto
|
||||
|
||||
@@ -1,117 +1,49 @@
|
||||
---
|
||||
name: expense
|
||||
description: >
|
||||
Gestão de despesas Desk CRM v2.0. Documento PDF obrigatório para cada despesa. Registar, categorizar e analisar despesas com verificação de categorias e duplicados. Upload SFTP + arquivo mensal automatico. NUNCA cria sem PDF (excepto bypass explicito). Use when "despesa", "expense", "gasto", "custo", "categoria despesa", "registar despesa", "expense report", "processar tickets contabilidade", "recibo", "factura fornecedor".
|
||||
author: Descomplicar® Crescimento Digital
|
||||
version: 2.0.0
|
||||
quality_score: 90
|
||||
user_invocable: true
|
||||
category: finance
|
||||
tags: [expense, despesas, finance, categories, desk-crm, costs, reporting, tickets, receipts, pdf, sftp]
|
||||
desk_task: 1710
|
||||
desk_project: 65
|
||||
allowed-tools: Read, mcp__desk-crm-v3, mcp__ssh-unified
|
||||
mcps: desk-crm-v3, ssh-unified
|
||||
dependencies:
|
||||
mcps: [desk-crm-v3, ssh-unified]
|
||||
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
|
||||
description: Gestao de despesas Desk CRM com PDF obrigatorio. Registar, categorizar e analisar despesas com verificacao de duplicados, upload SFTP e arquivo mensal automatico.
|
||||
---
|
||||
|
||||
# /expense - Gestão de Despesas
|
||||
# /expense - Gestao de Despesas
|
||||
|
||||
Skill para gestão de despesas com verificação obrigatória de categorias existentes.
|
||||
|
||||
## Metadata
|
||||
- **Version**: 2.0.0
|
||||
- **Author**: Descomplicar
|
||||
- **Date**: 2026-02-12
|
||||
- **Status**: Active
|
||||
|
||||
---
|
||||
Skill para gestao de despesas com verificacao obrigatoria de categorias existentes.
|
||||
|
||||
## Quando Usar
|
||||
|
||||
- Registar nova despesa
|
||||
- Criar/gerir categorias de despesas
|
||||
- Consultar despesas por período/categoria
|
||||
- Consultar despesas por periodo/categoria
|
||||
- Associar despesas a projectos/clientes
|
||||
- Análise e relatórios de despesas
|
||||
- **Processar despesas de tickets de contabilidade (departamento 3)**
|
||||
- Importar recibos de serviços (Anthropic, Hetzner, etc.)
|
||||
- Analise e relatorios de despesas
|
||||
- Processar despesas de tickets de contabilidade (departamento 3)
|
||||
- Importar recibos de servicos (Anthropic, Hetzner, etc.)
|
||||
|
||||
## Quando NÃO Usar
|
||||
## Quando NAO Usar
|
||||
|
||||
- Para facturas a clientes (usar /invoice)
|
||||
- Para orçamentos (usar /orcamento)
|
||||
- Para orcamentos (usar /orcamento)
|
||||
- Para pagamentos recebidos (usar /crm)
|
||||
|
||||
---
|
||||
|
||||
## REGRA CRÍTICA: CATEGORIAS
|
||||
## REGRA CRITICA: CATEGORIAS
|
||||
|
||||
> **PROIBIDO criar categoria sem verificar se já existe.**
|
||||
|
||||
Esta regra é INVIOLÁVEL. SEMPRE:
|
||||
> **PROIBIDO criar categoria sem verificar se ja existe.**
|
||||
|
||||
```
|
||||
1. Listar categorias: get_expense_categories(with_stats=true)
|
||||
2. Pesquisar por nome similar na lista
|
||||
3. SE encontrar match ou similar:
|
||||
- USAR a categoria existente
|
||||
- NÃO criar duplicado
|
||||
4. SE realmente não existe:
|
||||
- PERGUNTAR: "Não encontrei categoria para X. Criar nova?"
|
||||
5. SÓ CRIAR após confirmação explícita
|
||||
3. SE encontrar match ou similar: USAR a categoria existente
|
||||
4. SE realmente nao existe: PERGUNTAR "Nao encontrei categoria para X. Criar nova?"
|
||||
5. SO CRIAR apos confirmacao explicita
|
||||
```
|
||||
|
||||
**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 Activas (top 8 - consolidacao 12-02-2026)
|
||||
|
||||
| ID | Nome | Fornecedores tipicos |
|
||||
|----|------|---------------------|
|
||||
| 1 | Telecomunicacoes | MEO |
|
||||
| 4 | Alojamento web (Hosting) | Hetzner, CWP |
|
||||
| 6 | Servicos Externos | Make/Celonis, Gamma |
|
||||
| 14 | Subscricoes e Servicos Digitais | YouTube Premium, BdThemes |
|
||||
| 28 | Licencas Software | Canva, Cursor, Descript, GitHub, Softaculous |
|
||||
| 30 | Servicos Cloud e Infraestrutura | Google One, Google Workspace, ElasticEmail |
|
||||
| 37 | Dominios | PTisp, Namecheap |
|
||||
| 38 | Servicos IA e APIs | Anthropic, OpenRouter, CapSolver, Replicate |
|
||||
|
||||
**NOTA:** Existem ~30 categorias na BD mas apenas 8 sao usadas regularmente. SEMPRE usar `get_expense_categories()` para lista completa e actual.
|
||||
|
||||
---
|
||||
|
||||
## Protocolo
|
||||
|
||||
### 1. Registar Despesa
|
||||
## Protocolo: Registar Despesa
|
||||
|
||||
> **Gate PDF obrigatorio:** Sem documento, nao regista. Unica excepcao: bypass explicito do utilizador (AT/Salario sem recibo).
|
||||
|
||||
@@ -122,407 +54,101 @@ Esta regra é INVIOLÁVEL. SEMPRE:
|
||||
- SE nao tem e pede bypass: PERGUNTAR "Confirmas despesa sem documento?"
|
||||
- Bypass valido apenas para: AT, Salarios, transferencias bancarias
|
||||
2. LER O PDF: Extrair dados reais do documento
|
||||
- NUNCA copiar valor de um PDF para outro, mesmo com nomes semelhantes
|
||||
- Cada documento tem o seu valor proprio
|
||||
- NUNCA copiar valor de um PDF para outro
|
||||
3. OBRIGATORIO: get_expense_categories(with_stats=true)
|
||||
4. Identificar categoria correcta na lista
|
||||
- SE categoria nao existe: PERGUNTAR antes de criar
|
||||
5. VERIFICAR DUPLICADOS:
|
||||
- get_expenses(search: "<fornecedor>")
|
||||
- Mesmo fornecedor + valor + data = duplicado
|
||||
- Mesmo numero factura = duplicado
|
||||
6. Recolher dados:
|
||||
- category_id (obrigatorio)
|
||||
- amount (obrigatorio - valor REAL extraido do documento)
|
||||
- currency (obrigatorio - EUR=3, USD=2)
|
||||
- date (obrigatorio, YYYY-MM-DD)
|
||||
- note (obrigatorio, incluir numero factura)
|
||||
- send_invoice_to_customer = 0 (obrigatorio na BD)
|
||||
- client_id (opcional)
|
||||
- project_id (opcional)
|
||||
- billable (opcional, default false)
|
||||
- tax (opcional)
|
||||
- category_id, amount, currency (EUR=3, USD=2), date (YYYY-MM-DD)
|
||||
- note (incluir numero factura), send_invoice_to_customer = 0
|
||||
- Opcionais: client_id, project_id, billable, tax
|
||||
7. CONFIRMAR com utilizador (mostrar resumo)
|
||||
8. create_expense (ou SQL directo se MCP indisponivel)
|
||||
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', file_name, filetype='application/pdf',
|
||||
visible_to_customer=0, staffid=1, contact_id=0, dateadded=NOW())
|
||||
10. ARQUIVO MENSAL: Mover PDF para pasta correspondente a data da factura:
|
||||
/media/ealmeida/Dados/GDrive/Cloud/ADM_Descomplicar/Financeiro/Contabilidade/YYYY/NN-NomeMes/
|
||||
(mkdir -p se pasta nao existir)
|
||||
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
|
||||
2. Verificar se existe categoria similar
|
||||
3. SE existe similar: USAR ESSA, não criar
|
||||
4. SE não existe nenhuma similar:
|
||||
- Perguntar confirmação ao utilizador
|
||||
- Aguardar resposta explícita
|
||||
5. SÓ APÓS confirmação: criar via SQL ou interface
|
||||
3. SE existe similar: USAR ESSA, nao criar
|
||||
4. SE nao existe: perguntar confirmacao ao utilizador
|
||||
5. SO APOS confirmacao: criar
|
||||
```
|
||||
|
||||
### 3. Consultar Despesas
|
||||
## Protocolo: Consultar Despesas
|
||||
|
||||
```
|
||||
1. get_expenses com filtros:
|
||||
- category (ID da categoria)
|
||||
- date_from / date_to (período)
|
||||
- client_id (cliente específico)
|
||||
- project_id (projecto específico)
|
||||
- limit (número resultados)
|
||||
1. get_expenses com filtros: category, date_from/date_to, client_id, project_id, limit
|
||||
2. Apresentar resumo ao utilizador
|
||||
```
|
||||
|
||||
### 4. Análise de Despesas
|
||||
## Protocolo: Analise de Despesas
|
||||
|
||||
```
|
||||
1. expense_analytics com parâmetros:
|
||||
- period: "month", "quarter", "year"
|
||||
- breakdown_by: "category", "client", "project"
|
||||
2. Apresentar insights:
|
||||
- Total por categoria
|
||||
- Tendências
|
||||
- Categorias mais usadas
|
||||
1. expense_analytics: period ("month"/"quarter"/"year"), breakdown_by ("category"/"client"/"project")
|
||||
2. Apresentar insights: total por categoria, tendencias, 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).
|
||||
> **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).
|
||||
Para protocolo completo de processamento de tickets de contabilidade: ver `references/ticket-processing.md`
|
||||
|
||||
```
|
||||
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. 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
|
||||
```
|
||||
|
||||
#### 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
|
||||
|
||||
#### Moedas e Valores
|
||||
|
||||
> **Despesas em USD:** Manter valor original em USD com `currency = 2`. **Nao converter** manualmente.
|
||||
> **Despesas em EUR:** Usar `currency = 3`.
|
||||
|
||||
| Moeda | currency ID | Exemplo |
|
||||
|-------|------------|---------|
|
||||
| EUR | **3** | Anthropic 180.00 EUR |
|
||||
| USD | **2** | Cursor 20.00 USD |
|
||||
|
||||
> **CRITICO:** `currency = 1` nao existe e causa despesas invisiveis nos relatorios. SEMPRE usar 2 (USD) ou 3 (EUR).
|
||||
|
||||
#### 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 Fornecedor → Categoria (consolidado 12-02-2026)
|
||||
|
||||
| Fornecedor | Categoria ID | Nome |
|
||||
|-----------|-------------|------|
|
||||
| Anthropic, OpenRouter, CapSolver, Replicate | 38 | Servicos IA e APIs |
|
||||
| Canva, Cursor, Descript, GitHub, Softaculous, CWP | 28 | Licencas Software |
|
||||
| Google One, Google Workspace, ElasticEmail | 30 | Servicos Cloud e Infraestrutura |
|
||||
| Hetzner | 4 | Alojamento web (Hosting) |
|
||||
| MEO | 1 | Telecomunicacoes |
|
||||
| PTisp, Namecheap | 37 | Dominios |
|
||||
| Make/Celonis, Gamma | 6 | Servicos Externos |
|
||||
| YouTube Premium, BdThemes | 14 | Subscricoes e Servicos Digitais |
|
||||
|
||||
#### Mapeamento Email → Categoria
|
||||
|
||||
| Dominio Email | Categoria ID | Fornecedor |
|
||||
|---------------|--------------|------------|
|
||||
| anthropic.com | 38 | Anthropic |
|
||||
| openrouter.ai | 38 | OpenRouter |
|
||||
| payproglobal.com | 38 | CapSolver |
|
||||
| replicate.com | 38 | Replicate |
|
||||
| cursor.com, anysphere.dev | 28 | Cursor |
|
||||
| canva.com | 28 | Canva |
|
||||
| descript.com | 28 | Descript |
|
||||
| github.com | 28 | GitHub |
|
||||
| softaculous.com | 28 | Softaculous |
|
||||
| centos-webpanel.com | 28 | CWP |
|
||||
| elasticemail.com | 30 | ElasticEmail |
|
||||
| google.com (One/Workspace) | 30 | Google Cloud |
|
||||
| hetzner.com | 4 | Hetzner |
|
||||
| meoempresas.pt | 1 | MEO |
|
||||
| namecheap.com | 37 | Namecheap |
|
||||
| ptisp.pt | 37 | PTisp |
|
||||
| make.com, celonis.com | 6 | Make/Celonis |
|
||||
| gamma.app | 6 | Gamma |
|
||||
|
||||
> **NOTA:** `moloni.com` NAO incluido - e plataforma de facturacao, emails podem ser de qualquer fornecedor.
|
||||
|
||||
#### Mapeamento Padrao PDF → Categoria
|
||||
|
||||
Para documentos financeiros, identificar fornecedor pelo conteudo do PDF:
|
||||
|
||||
| Padrao no PDF | Fornecedor | Categoria ID | Nome |
|
||||
|---------------|-----------|--------------|------|
|
||||
| `Gondooffice`, `Cubic Choices` | Gondooffice | 21 | Contabilidade |
|
||||
| `Autoridade Tributaria`, `emiteDoc`, `AT -` | AT | 15 | Planos Prestacionais |
|
||||
| `Staples`, `STP_ECOFACTURA` | Staples | 3 | Material de Escritorio |
|
||||
| `MEO`, `meoempresas` | MEO | 1 | Telecomunicacoes |
|
||||
| `TOConline`, `Recibo de Vencimento` | Salario | 22 | Salarios e Vencimentos |
|
||||
| `Seguranca Social` | SS | 25 | Contribuicoes SS |
|
||||
| `Cursor`, `Anysphere` | Cursor | 28 | Licencas Software |
|
||||
| `Anthropic` | Anthropic | 38 | Servicos IA e APIs |
|
||||
| `Hetzner` | Hetzner | 4 | Alojamento web (Hosting) |
|
||||
| `ElasticEmail` | ElasticEmail | 30 | Servicos Cloud e Infraestrutura |
|
||||
|
||||
#### Extracção de Dados de PDFs
|
||||
|
||||
**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 (contact_id obrigatorio!)
|
||||
INSERT INTO tblfiles (rel_id, rel_type, file_name, filetype, visible_to_customer, staffid, contact_id, dateadded)
|
||||
VALUES ({expense_id}, 'expense', '{filename}', 'application/pdf', 0, 1, 0, NOW())
|
||||
```
|
||||
|
||||
#### Campos para Rastreio de Duplicados
|
||||
|
||||
| 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}/`
|
||||
**Resumo:** Obter ticket -> verificar anexos -> verificar duplicados -> extrair dados -> confirmar -> criar despesa -> upload PDF -> arquivo mensal.
|
||||
|
||||
---
|
||||
|
||||
## Comandos
|
||||
|
||||
| Comando | Descrição |
|
||||
| Comando | Descricao |
|
||||
|---------|-----------|
|
||||
| `/expense create` | Registar nova despesa |
|
||||
| `/expense list` | Listar despesas recentes |
|
||||
| `/expense categories` | Listar categorias disponíveis |
|
||||
| `/expense report [período]` | Relatório de despesas |
|
||||
| `/expense categories` | Listar categorias disponiveis |
|
||||
| `/expense report [periodo]` | Relatorio de despesas |
|
||||
| `/expense search [termo]` | Pesquisar despesas |
|
||||
|
||||
---
|
||||
|
||||
## MCP Tools
|
||||
|
||||
### Despesas
|
||||
- `get_expenses` - Listar despesas com filtros
|
||||
- `create_expense` - Criar nova despesa
|
||||
- `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 = 3**, USD = 2) |
|
||||
| payment_mode | string | - | Metodo pagamento (default: 'online') |
|
||||
| send_invoice_to_customer | number | ✓ | **Obrigatorio na BD** (sem default). Usar sempre **0** |
|
||||
|
||||
### Campo expense_name (via SQL)
|
||||
|
||||
> **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 | USD | $ | Nao |
|
||||
| 3 | EUR | € | Sim |
|
||||
|
||||
> **CRITICO:** EUR = **3**, USD = **2**. Usar currency=1 causa despesas invisiveis nos relatorios. Para despesas em USD manter valor original com currency=2 (nao converter).
|
||||
**Despesas:** `get_expenses`, `create_expense`, `update_expense`, `delete_expense`, `bill_expense_to_customer`
|
||||
**Categorias:** `get_expense_categories` (usar with_stats=true)
|
||||
**Analise:** `expense_analytics`
|
||||
|
||||
---
|
||||
|
||||
## Anti-Patterns (NUNCA fazer)
|
||||
|
||||
### Categorias
|
||||
1. **NUNCA** criar categoria sem listar existentes primeiro
|
||||
2. **NUNCA** assumir que categoria não existe
|
||||
3. **NUNCA** criar categoria com nome similar a existente
|
||||
**Categorias:**
|
||||
1. Criar categoria sem listar existentes primeiro
|
||||
2. Assumir que categoria nao existe
|
||||
3. Criar categoria com nome similar a existente
|
||||
|
||||
### Despesas
|
||||
**Despesas:**
|
||||
4. Criar despesa sem category_id
|
||||
5. Usar nome da categoria em vez do ID
|
||||
6. Não validar data (formato YYYY-MM-DD)
|
||||
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
|
||||
5. Nao validar data (formato YYYY-MM-DD)
|
||||
6. Criar despesa sem verificar duplicados primeiro
|
||||
|
||||
### Valores de PDFs
|
||||
10. **NUNCA** assumir que ficheiros com nomes semelhantes têm o mesmo valor
|
||||
11. **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
|
||||
**Valores de PDFs:**
|
||||
7. Assumir que ficheiros com nomes semelhantes tem o mesmo valor
|
||||
8. SEMPRE ler CADA PDF individualmente para extrair o valor real
|
||||
|
||||
### Tickets
|
||||
13. Processar ticket sem verificar anexos PDF
|
||||
14. Assumir que ticket com recibo = despesa não lançada
|
||||
**Tickets:**
|
||||
9. Processar ticket sem verificar anexos PDF
|
||||
10. Assumir que ticket com recibo = despesa nao lancada
|
||||
|
||||
---
|
||||
|
||||
## Exemplos
|
||||
|
||||
### 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
|
||||
## Checklist Pre-Operacao
|
||||
|
||||
- [ ] Listar categorias existentes
|
||||
- [ ] Validar categoria correcta
|
||||
@@ -532,80 +158,12 @@ User: Registar 150€ de domínio para cliente TechStart
|
||||
|
||||
---
|
||||
|
||||
## Base de Dados
|
||||
## Referencias
|
||||
|
||||
- **Tabela categorias:** `tblexpenses_categories`
|
||||
- **Tabela despesas:** `tblexpenses`
|
||||
- **Campo categoria:** `category` (ID da categoria)
|
||||
- `references/category-mapping.md` - Mapeamento fornecedores, emails, padroes PDF, campos, moedas, SQL
|
||||
- `references/ticket-processing.md` - Protocolo completo de processamento de tickets
|
||||
- `references/changelog.md` - Historico de alteracoes
|
||||
|
||||
---
|
||||
|
||||
## Changelog
|
||||
|
||||
### v2.0.0 (2026-02-12) - Sistema Robusto 2026
|
||||
- **Gate PDF obrigatorio:** Despesa sem documento nao e registada (bypass explicito para AT/Salario)
|
||||
- **Upload SFTP:** Substituido `cp` local por `mcp__ssh-unified__sftp_upload` (Regra #41)
|
||||
- **Arquivo mensal:** PDF organizado em `Contabilidade/YYYY/NN-NomeMes/` automaticamente
|
||||
- **Campo `send_invoice_to_customer`:** Documentado como obrigatorio na BD (valor 0)
|
||||
- **Correccao currency:** EUR = **3** (nao 2), USD = **2**. Corrigido em toda a skill
|
||||
- **Categorias alinhadas com consolidacao:** 8 categorias activas com mapeamento correcto
|
||||
- Cursor/Canva/Descript/GitHub/Softaculous/CWP → 28 (Licencas Software)
|
||||
- Hetzner → 4 (Alojamento web)
|
||||
- ElasticEmail/Google → 30 (Servicos Cloud)
|
||||
- PTisp/Namecheap → 37 (Dominios)
|
||||
- YouTube/BdThemes → 14 (Subscricoes)
|
||||
- Make/Gamma → 6 (Servicos Externos)
|
||||
- **Verificacao duplicados reforçada:** Integrada no passo 5 do protocolo
|
||||
- **MCP ssh-unified adicionado** a dependencias
|
||||
- **Procedimento:** `06-Operacoes/Procedimentos/PROC-Skill-Expense.md`
|
||||
|
||||
### v1.5.0 (2026-02-05)
|
||||
- Adicionado mapeamento **Cursor (Anysphere)** → categoria 38 (Serviços IA e APIs)
|
||||
- Email: `cursor.com`
|
||||
- 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-12
|
||||
**Motivo:** Sistema robusto 2026 - PDF obrigatorio, SFTP, arquivo mensal, correccoes consolidacao
|
||||
**Criado:** 2026-02-05 | **Actualizado:** 2026-02-12
|
||||
|
||||
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
|
||||
description: >
|
||||
Gestão de facturação Desk CRM v1.0. Criar, enviar, pagamentos, vencidas, timesheets.
|
||||
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
|
||||
description: Gestão de facturação Desk CRM. Criar facturas, converter estimates, facturar timesheets, registar pagamentos e listar facturas vencidas.
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# /invoice v1.0 - Gestão de Facturação
|
||||
|
||||
@@ -1,183 +1,172 @@
|
||||
---
|
||||
name: orcamento
|
||||
description: >
|
||||
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".
|
||||
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
|
||||
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).
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# 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
|
||||
|
||||
- Criar orçamento para cliente novo ou existente
|
||||
- Gerar proposta comercial (proposal ou estimate)
|
||||
- Consultar preços oficiais de produtos/serviços
|
||||
- Criar orcamento para cliente novo ou existente
|
||||
- Gerar proposta comercial (estimate)
|
||||
- Consultar precos oficiais de produtos/servicos
|
||||
- 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 operações CRM genéricas (usar /crm-ops)
|
||||
- Para simples consulta de preços (ler CSV directamente)
|
||||
- Para analise estrategica de lead (usar /lead-approach)
|
||||
- Para operacoes CRM genericas (usar /crm-ops)
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
|
||||
### Fontes de Dados (OBRIGATÓRIO)
|
||||
|
||||
**IMPORTANTE**: Antes de criar qualquer orçamento, ler SEMPRE os dados actualizados de:
|
||||
### Sintaxe
|
||||
|
||||
```
|
||||
/media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/
|
||||
├── 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
|
||||
/orcamento [cliente] [tipo] [-MEN|-TRI]
|
||||
```
|
||||
|
||||
### 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 |
|
||||
|-------|-----------|
|
||||
| Codigo | Código único (ex: WEB-WP-001) |
|
||||
| Nome | Nome do produto/serviço |
|
||||
| Familia | Categoria principal (Websites, Design, Tecnologia, etc.) |
|
||||
| PrecoBase | Valor em euros |
|
||||
| Unidade | Tipo (Projeto, Hora, Investimento, Mês) |
|
||||
| DescricaoCurta | Para orçamento |
|
||||
| TempoEstimado | Em dias/semanas |
|
||||
**Tipos disponiveis:**
|
||||
| Codigo | Tipo | Grupo CRM |
|
||||
|--------|------|-----------|
|
||||
| `starter` | StarterWP | Websites |
|
||||
| `corporate` | CorporateWP | Websites |
|
||||
| `care` | CareWP (Clinicas) | Websites |
|
||||
| `ecom` | eCommerceWP | Websites |
|
||||
| `mkt` | Marketing Digital 360 | Marketing |
|
||||
| `man` | Manutencao | Suporte |
|
||||
| `deskcrm` | DeskCRM | DeskCRM |
|
||||
| `chatbot` | Chatbot | Chatbots |
|
||||
| `acceleratorx` | AcceleratorX | Tecnologia |
|
||||
|
||||
### Como Usar os CSVs
|
||||
|
||||
```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
|
||||
### Fase 1: Identificacao do Cliente
|
||||
|
||||
1. Se cliente fornecido, pesquisar no CRM:
|
||||
```
|
||||
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
|
||||
- NIF (opcional)
|
||||
- Email contacto
|
||||
@@ -187,107 +176,161 @@ with open('/media/.../Produtos_Servicos/tabela-geral.csv') as f:
|
||||
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
|
||||
2. Se não fornecido, apresentar menu interactivo via AskUserQuestion:
|
||||
- StarterWP (700€ + 250€/ano)
|
||||
- CorporateWP (900€ + 299€/ano)
|
||||
- CareWP (1.300€ + 350€/ano)
|
||||
- eCommerceWP (1.100€ + 349€/ano)
|
||||
- Marketing 360 (459€/mês)
|
||||
- Manutenção (150€/mês)
|
||||
2. Se nao fornecido, apresentar menu interactivo:
|
||||
- StarterWP | CorporateWP | CareWP | eCommerceWP
|
||||
- Marketing 360 | Manutencao
|
||||
- DeskCRM | Chatbot | AcceleratorX
|
||||
|
||||
### Fase 3: Personalização
|
||||
### Fase 3: Consultar Precos no CRM
|
||||
|
||||
1. Ler template seleccionado de `templates/`
|
||||
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`
|
||||
**OBRIGATORIO**: Consultar precos actualizados no Desk CRM antes de calcular.
|
||||
|
||||
### 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:
|
||||
- Subtotal por item
|
||||
- Subtotal por item (precos do CRM)
|
||||
- IVA 23%
|
||||
- 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
|
||||
client_id=[id]
|
||||
date=[hoje]
|
||||
expiry_date=[hoje + 30 dias]
|
||||
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
|
||||
|
||||
| Produto | Setup | Anuidade | Prazo |
|
||||
|---------|-------|----------|-------|
|
||||
| StarterWP | 700€ | 250€ | 3-5 sem |
|
||||
| CorporateWP | 900€ | 299€ | 4-6 sem |
|
||||
| eCommerceWP | 1.100€ | 349€ | 7-9 sem |
|
||||
| ChallengeWP | 700€ | 250€ | 8-10 sem |
|
||||
| CareWP | 1.300€ | 350€ | 4-6 sem |
|
||||
| StarterWP | 700 | 250 | 3-5 sem |
|
||||
| CorporateWP | 900 | 299 | 4-6 sem |
|
||||
| eCommerceWP | 1100 | 349 | 7-9 sem |
|
||||
| ChallengeWP | 700 | 250 | 8-10 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 |
|
||||
|----------------|-------|
|
||||
| EasyAppointment | 175€ (55+120) |
|
||||
| Chat da Página | 50€ + 50€/ano |
|
||||
| Forms Inteligentes | 150€ |
|
||||
| CartRecovery | 190€ (90+100) + 90€/ano |
|
||||
| Pixel + GTM | 50€ |
|
||||
| ShopBuilder | 5€/produto |
|
||||
### AcceleratorX
|
||||
| Produto | Setup |
|
||||
|---------|-------|
|
||||
| WP ProCMS | 650 |
|
||||
| e-Commerce | 750 |
|
||||
| Membership | 450 |
|
||||
| Booking | 450 |
|
||||
| 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 |
|
||||
|---------|--------------|-------------|
|
||||
| Marketing 360 | 459€ | 12 meses |
|
||||
| Manutenção | 150€ | 12 meses |
|
||||
|
||||
## Termos e Condições Padrão
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
### Design/Branding
|
||||
| Produto | Valor |
|
||||
|---------|-------|
|
||||
| Branding WOW Digital | 400 |
|
||||
| Branding WOW Essencial | 850 |
|
||||
| Branding Completo | 1100 |
|
||||
| Pack Rebranding | 1500 |
|
||||
| Pack Premium 360 | 5000 |
|
||||
|
||||
## Estrutura de Items para API
|
||||
|
||||
Cada item do orçamento segue o formato:
|
||||
Cada item do orcamento segue o formato:
|
||||
|
||||
```json
|
||||
{
|
||||
"description": "Descrição do serviço",
|
||||
"description": "Descricao do servico",
|
||||
"qty": 1,
|
||||
"rate": 700,
|
||||
"unit": "un"
|
||||
@@ -295,172 +338,144 @@ Cada item do orçamento segue o formato:
|
||||
```
|
||||
|
||||
**Unidades:**
|
||||
- `un` - Unidade (projecto/item único)
|
||||
- `mes` - Mês (serviço recorrente)
|
||||
- `ano` - Ano (anuidade)
|
||||
- `un` - Unidade (projecto/item unico)
|
||||
- `mes` ou `mensalidade` - Mes (servico recorrente mensal, usado com `-MEN`)
|
||||
- `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
|
||||
- [ ] Tipo de orçamento seleccionado
|
||||
- [ ] Template carregado
|
||||
- [ ] Tipo de orcamento seleccionado
|
||||
- [ ] Precos consultados no CRM (tblitems)
|
||||
- [ ] Funcionalidades adicionais identificadas
|
||||
- [ ] Valores calculados (subtotal + IVA)
|
||||
- [ ] Anuidade calculada (se aplicável)
|
||||
- [ ] Estimate criado no CRM
|
||||
- [ ] Recorrencia calculada (anuidade/trimestral/mensal conforme variante)
|
||||
- [ ] Estimate criado no CRM (status: Draft)
|
||||
- [ ] 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
|
||||
|
||||
```
|
||||
mcp__desk-crm-v3__search_customers - Pesquisar cliente
|
||||
mcp__desk-crm-v3__get_customer - Obter detalhes cliente
|
||||
mcp__desk-crm-v3__create_customer - Criar cliente novo
|
||||
mcp__desk-crm-v3__create_estimate - Criar orçamento
|
||||
mcp__desk-crm-v3__get_estimates - Listar orçamentos existentes
|
||||
mcp__desk-crm-v3__create_estimate - Criar orcamento
|
||||
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
|
||||
| Código | Produto | Preço |
|
||||
|--------|---------|-------|
|
||||
| WEB-WP-001 | StarterWP | 700€ |
|
||||
| WEB-WP-002 | CorporateWP | 900€ |
|
||||
| WEB-WP-003 | eCommerceWP | 1.100€ |
|
||||
| WEB-WP-004 | ChallengeWP | 700€ |
|
||||
| WEB-WP-005 | CareWP | 1.300€ |
|
||||
### Website Simples
|
||||
```
|
||||
Total = Base + Funcionalidades + Conteudos
|
||||
Anuidade = Anuidade_Base + Anuidades_Funcionalidades
|
||||
```
|
||||
|
||||
### Branding
|
||||
| Código | Produto | Preço |
|
||||
|--------|---------|-------|
|
||||
| DES-BRA-001 | Branding WOW Essencial | 850€ |
|
||||
| DES-BRA-002 | Branding Completo | 1.100€ |
|
||||
| DES-BRA-003 | Branding WOW Digital | 400€ |
|
||||
### Exemplo: Website Corporativo com Agendamento (sem variante)
|
||||
```
|
||||
CorporateWP: 900 (item CRM: "CorporateWP")
|
||||
EasyAppointment: 175 (item CRM: "EasyAppointment")
|
||||
Chat da Pagina: 50 (item CRM: "Chat da Pagina")
|
||||
Pixel + GTM: 50 (items CRM: "Configuracao Pixel Facebook" + "Configuracao GTM")
|
||||
---------------------------------
|
||||
Subtotal: 1175
|
||||
IVA 23%: 270.25
|
||||
TOTAL: 1445.25
|
||||
|
||||
### AcceleratorX
|
||||
| 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€ |
|
||||
Anuidade: 299 + 50 + 50 = 399 (items CRM com unit "anuidade")
|
||||
```
|
||||
|
||||
### Consultoria
|
||||
| Código | Produto | Preço |
|
||||
|--------|---------|-------|
|
||||
| EST-CON-001 | Consultoria Estratégica | 90€/hora |
|
||||
| EST-COA-001 | Coaching e Formação | 50€/hora |
|
||||
| EST-BRA-001 | Estratégia de Marca | 900€ |
|
||||
### Exemplo: Mesmo orcamento com `-MEN`
|
||||
```
|
||||
SETUP (pagamento unico):
|
||||
CorporateWP: 900
|
||||
EasyAppointment: 175
|
||||
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/e-commerce.md` - Template eCommerceWP
|
||||
- `templates/marketing-digital.md` - Template Marketing 360
|
||||
- `templates/manutencao.md` - Template Manutenção
|
||||
|
||||
## Fonte de Dados Principal
|
||||
|
||||
```
|
||||
/media/ealmeida/Dados/GDrive/Cloud/Docs/Produtos_Servicos/tabela-geral.csv
|
||||
```
|
||||
- `templates/manutencao.md` - Template Manutencao
|
||||
|
||||
---
|
||||
|
||||
## Datasets Dify (Consulta Obrigatória)
|
||||
|
||||
Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes datasets via MCP:
|
||||
## Datasets Dify (Consulta Complementar)
|
||||
|
||||
| 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 |
|
||||
| **Marketing Digital** | `c1ec779f-4cb1-4ecf-ba11-6b39b93d4e24` | 2 |
|
||||
| **Desenvolvimento de WebSites** | `c8489151-de94-42b2-8cee-c0b961cfac6d` | 2 |
|
||||
|
||||
### Como Consultar
|
||||
|
||||
```javascript
|
||||
// Pesquisar serviços e preços
|
||||
mcp__notebooklm__notebook_query, 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
|
||||
|
||||
- Definir escopo de projecto
|
||||
- Justificar preços ao cliente
|
||||
- Justificar precos ao cliente
|
||||
- Comparar funcionalidades entre pacotes
|
||||
- Criar proposta de valor diferenciada
|
||||
- Tecnicas de negociacao e fechamento
|
||||
|
||||
---
|
||||
|
||||
## Instrumentação Automática
|
||||
|
||||
Esta skill grava métricas automaticamente para análise PDCA.
|
||||
## Instrumentacao Automatica
|
||||
|
||||
### Baseline
|
||||
|
||||
| Métrica | Valor |
|
||||
| Metrica | Valor |
|
||||
|---------|-------|
|
||||
| Tempo baseline | 30 min |
|
||||
| Tempo target | 15 min |
|
||||
| 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)
|
||||
|
||||
```sql
|
||||
-- Executar via SSH ou MCP no final da skill
|
||||
INSERT INTO tblskill_agent_metrics (
|
||||
type, name, duration_ms, status, staff_id,
|
||||
kb_consulted, kb_cache_hit, tool_calls, project_id
|
||||
@@ -470,29 +485,30 @@ INSERT INTO tblskill_agent_metrics (
|
||||
);
|
||||
```
|
||||
|
||||
### Exemplo Completo
|
||||
---
|
||||
|
||||
```sql
|
||||
-- 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
|
||||
);
|
||||
```
|
||||
## Changelog
|
||||
|
||||
### 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
|
||||
/metrics /orcamento
|
||||
```
|
||||
### v4.0.0 (2026-03-05)
|
||||
- **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
|
||||
|
||||
Ver `~/.claude/skills/_core/instrumentation-protocol.md`
|
||||
### v3.1.0 (2026-02-03)
|
||||
- Instrumentacao automatica adicionada
|
||||
- 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
|
||||
@@ -1,25 +1,7 @@
|
||||
---
|
||||
name: ticket-triage
|
||||
description: >
|
||||
Auto-processamento de tickets abertos no Desk CRM. Fecha SPAM, identifica facturas para /auto-expense, protege notificacoes de sistema. Use when "tickets", "triagem tickets", "limpar tickets", "ticket triage", "processar tickets".
|
||||
author: Descomplicar® Crescimento Digital
|
||||
version: 1.0.0
|
||||
quality_score: 85
|
||||
user_invocable: true
|
||||
category: crm
|
||||
tags: [tickets, triage, spam, invoices, notifications, desk-crm]
|
||||
desk_task: 1710
|
||||
desk_project: 65
|
||||
allowed-tools: Read, Write, mcp__desk-crm-v3
|
||||
mcps: desk-crm-v3
|
||||
dependencies:
|
||||
mcps: [desk-crm-v3]
|
||||
files:
|
||||
- /media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/fornecedores-recorrentes.md
|
||||
triggers:
|
||||
- "User asks to process tickets"
|
||||
- "User mentions 'tickets', 'triagem', 'limpar tickets'"
|
||||
- "Invoked by /today orchestrator"
|
||||
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
|
||||
|
||||
@@ -1,17 +1,7 @@
|
||||
---
|
||||
name: ticket
|
||||
description: >
|
||||
Gestão de tickets de suporte Desk CRM v1.0. Ver, responder, fechar, escalar.
|
||||
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
|
||||
description: Gestão de tickets de suporte Desk CRM. Ver, responder, fechar e escalar tickets. Inclui templates de resposta e integração com /today.
|
||||
disable-model-invocation: true
|
||||
---
|
||||
|
||||
# /ticket v1.0 - Gestão de Suporte
|
||||
|
||||
@@ -49,14 +49,6 @@ mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb772160
|
||||
mcp__notebooklm__notebook_query notebook_id:"9053d0e8-dd39-460b-b5ea-e67af3e9a675" query:"visual design tipografia cores"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"interface design sistemas componentes"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de WebSites" query:"design responsivo layouts"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Canva" query:"visual design tipografia cores"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
@@ -114,11 +106,6 @@ Designer de interfaces responsavel por criar designs visuais apelativos, manter
|
||||
- **Consistency**: Mesmos patterns = menos cognitive load
|
||||
- **Feedback**: Sistema responde a accoes (loaders, confirmacoes)
|
||||
- **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
|
||||
@@ -144,13 +131,11 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Canva" query:"design visual tip
|
||||
- **elevenlabs** - Text-to-speech, voice cloning, audio transcription
|
||||
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
||||
|
||||
### All Available (33 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
|
||||
### All Available (32 total)
|
||||
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.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -175,13 +160,11 @@ desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **11 SDKs** (TaskForce teams):
|
||||
@@ -195,9 +178,6 @@ You are part of **11 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -32,8 +32,6 @@ created: '2025-01-13'
|
||||
updated: '2026-02-04'
|
||||
author: 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.
|
||||
@@ -110,13 +108,6 @@ mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf565
|
||||
mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"animacao storytelling"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Marketing Digital" query:"video conteudo visual"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"animacao storytelling"
|
||||
```
|
||||
|
||||
## Colaboracao
|
||||
- Reports to: Creative Director
|
||||
- Colabora com: Social Media Manager, Motion Designer, Copywriter
|
||||
@@ -136,13 +127,11 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Criatividade" query:"animacao s
|
||||
- **outline-api** - Outline documentation
|
||||
- **replicate** - AI models - imagem, vídeo, áudio, LLMs
|
||||
|
||||
### All Available (33 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
|
||||
### All Available (32 total)
|
||||
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.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -168,7 +157,7 @@ desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
|
||||
@@ -48,15 +48,6 @@ mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb772160
|
||||
mcp__notebooklm__notebook_query notebook_id:"081ca512-8279-4850-b2b9-dff090267482" query:"conversao usabilidade navegacao"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de WebSites" query:"layouts design web responsivo"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"themes templates design"
|
||||
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
|
||||
|
||||
### Papel
|
||||
@@ -117,12 +108,6 @@ Designer web responsavel por criar layouts visualmente impactantes e funcionais,
|
||||
- **White space**: Dar espaco para respirar, nao sobrecarregar
|
||||
- **Hierarchy**: Tamanhos, cores, contraste para guiar olho
|
||||
- **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
|
||||
@@ -148,13 +133,11 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"UX e Usabilidade" query:"navega
|
||||
- **elevenlabs** - Text-to-speech, voice cloning, audio transcription
|
||||
- **vimeo** - Video management - upload, metadata, transcripts, analytics
|
||||
|
||||
### All Available (33 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
|
||||
### All Available (32 total)
|
||||
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.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -179,13 +162,11 @@ desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, ssh-unified, google-
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **7 SDKs** (TaskForce teams):
|
||||
@@ -195,9 +176,6 @@ You are part of **7 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"description": "Knowledge sources (NotebookLM + Dify KB) for Design and Media domain",
|
||||
"description": "Knowledge sources for Design and Media domain",
|
||||
"sources": {
|
||||
"notebooklm": {
|
||||
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||
@@ -10,16 +10,14 @@
|
||||
"title": "Social Media e Branding",
|
||||
"topics": [
|
||||
"canva"
|
||||
],
|
||||
"maps_from_dify": "Canva"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "081ca512-8279-4850-b2b9-dff090267482",
|
||||
"title": "UI/UX Design",
|
||||
"topics": [
|
||||
"usabilidade"
|
||||
],
|
||||
"maps_from_dify": "UX e Usabilidade"
|
||||
]
|
||||
}
|
||||
],
|
||||
"pending": [
|
||||
@@ -35,33 +33,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"dify_kb": {
|
||||
"description": "Dify KB - datasets tematicos (FALLBACK)",
|
||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
||||
"datasets": [
|
||||
{
|
||||
"id": "7efc5db4-05b1-408a-9e41-b612188ee877",
|
||||
"name": "Canva",
|
||||
"priority": 1,
|
||||
"document_count": 24,
|
||||
"word_count": 148976
|
||||
},
|
||||
{
|
||||
"id": "e14ab89e-8910-43b6-becf-d57c78afd62d",
|
||||
"name": "UX e Usabilidade",
|
||||
"priority": 1,
|
||||
"document_count": 4,
|
||||
"word_count": 413593
|
||||
},
|
||||
{
|
||||
"id": "39818f77-8c70-4729-9b5c-6f92d3a2b418",
|
||||
"name": "Criatividade",
|
||||
"priority": 2,
|
||||
"document_count": 9,
|
||||
"word_count": 262795
|
||||
}
|
||||
]
|
||||
},
|
||||
"brand_packs": {
|
||||
"description": "Brand packs JSON para identidade visual por cliente",
|
||||
"path": "/media/ealmeida/Dados/Hub/04-Recursos/Design/brands/",
|
||||
@@ -69,8 +40,15 @@
|
||||
{
|
||||
"slug": "descomplicar",
|
||||
"name": "Descomplicar - Consultoria e Desenvolvimento",
|
||||
"colors": {"primary": "#dd7500", "secondary": "#cc8d00", "accent": "#f2d9a2"},
|
||||
"fonts": {"heading": "Nexa", "body": "Roboto"}
|
||||
"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®*
|
||||
@@ -1,28 +1,43 @@
|
||||
---
|
||||
name: design
|
||||
description: >
|
||||
Motor de design profissional multi-marca. Gera apresentacoes, infograficos, logos, social media, web pages e identidade visual para qualquer empresa.
|
||||
Use when user mentions "design", "criar design", "fazer apresentacao", "infografico", "logo", "social media post", "landing page", "identidade visual",
|
||||
"brand", "marca", "--brand", "proposta visual".
|
||||
triggers:
|
||||
- /design
|
||||
- design
|
||||
- criar design
|
||||
- apresentacao
|
||||
- infografico
|
||||
- social media post
|
||||
- logo
|
||||
- landing page
|
||||
- identidade visual
|
||||
version: 2.0.0
|
||||
author: Descomplicar Crescimento Digital
|
||||
category: design
|
||||
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 |
|
||||
|
||||
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",
|
||||
"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",
|
||||
"author": {
|
||||
"name": "Descomplicar - Crescimento Digital",
|
||||
|
||||
@@ -67,14 +67,6 @@ mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e
|
||||
mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb1" query:"arquitectura dados"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"database SQL optimizacao"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"arquitectura dados"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"AWS" query:"RDS cloud database"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
@@ -124,7 +116,7 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
||||
## MCPs Relevantes
|
||||
- `desk-crm-v3`: Acesso directo à BD Perfex para análise
|
||||
- `ssh-unified`: Acesso MySQL em servidores
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB TI (SQL, optimização), AWS (RDS)
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB TI (SQL, optimização), AWS (RDS)
|
||||
|
||||
## Colaboracao
|
||||
|
||||
@@ -142,9 +134,9 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
||||
- SSH, SFTP, servidor management
|
||||
- Usage: `mcp__ssh-unified__*`
|
||||
|
||||
✓ **dify-kb** (knowledge)
|
||||
✓ **** (knowledge)
|
||||
- Knowledge base AI
|
||||
- Usage: `mcp__dify-kb__*`
|
||||
- Usage: `mcp____*`
|
||||
|
||||
### Recommended for dev
|
||||
- **gitea** - Repositórios Git, issues, PRs
|
||||
@@ -156,13 +148,11 @@ Especialista em arquitectura de bases de dados, entregando solucoes eficientes,
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -196,13 +186,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **5 SDKs** (TaskForce teams):
|
||||
@@ -216,9 +204,6 @@ You are part of **5 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -73,7 +73,6 @@ Você é um desenvolvedor experiente generalista responsável por:
|
||||
- [ ] **Manutenibilidade**: Código legível > código "clever"
|
||||
- [ ] **Testar**: Validar sugestões quando possível
|
||||
- [ ] **Documentar**: Explicar "porquê", não só "como"
|
||||
- [ ] **Consultar Dify KB**: Verificar padrões estabelecidos
|
||||
|
||||
### Output Format Esperado
|
||||
|
||||
@@ -109,7 +108,7 @@ Você é um desenvolvedor experiente generalista responsável por:
|
||||
|
||||
| MCP | Quando Usar |
|
||||
|-----|-------------|
|
||||
| `dify-kb` | Best practices, padrões arquitectura |
|
||||
| `` | Best practices, padrões arquitectura |
|
||||
| `memory-supabase` | Soluções anteriores similares |
|
||||
| `gitea` | Consultar histórico código |
|
||||
|
||||
@@ -185,7 +184,7 @@ OBRIGATÓRIO antes de git commit:
|
||||
5. Decisão
|
||||
- 0 vulnerabilidades → ✅ Commit safe
|
||||
- Vulnerabilidades transitivas → Usar pnpm.overrides
|
||||
- Vulnerabilidades críticas → Corrigir ou invocar /security-check
|
||||
- Vulnerabilidades críticas → Corrigir ou invocar /dep-audit
|
||||
|
||||
6. Documentar
|
||||
- Se há vulnerabilidades conhecidas → Mencionar no commit message
|
||||
@@ -224,15 +223,6 @@ mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e
|
||||
mcp__notebooklm__notebook_query notebook_id:"2876d1fe-5cea-4d98-8140-b0e1a81c6bc4" query:"desenvolvimento assistente workflow"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"boas praticas SOLID clean code"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"debugging arquitectura troubleshooting"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Claude Code" query:"desenvolvimento assistente workflow"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Seguranca" query:"vulnerabilidades code security"
|
||||
```
|
||||
|
||||
## Your Available MCPs
|
||||
|
||||
### Recommended for dev
|
||||
@@ -242,18 +232,16 @@ mcp__dify-kb__dify_kb_retrieve_segments dataset:"Seguranca" query:"vulnerabilida
|
||||
- **n8n** - Workflows automation
|
||||
- **filesystem** - Ficheiros locais
|
||||
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
||||
- **dify-kb** - Knowledge base AI
|
||||
- **** - Knowledge base AI
|
||||
- **memory-supabase** - Memória longo prazo
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -287,20 +275,16 @@ desk-crm-v3, moloni, google-analytics, google-workspace, imap, outline-api, yout
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Colaboração
|
||||
|
||||
- **Reports to**: Development Lead
|
||||
- **Colabora com**: Todos os development specialists, System Architects, Database Design Specialist, Security Compliance Specialist
|
||||
- **Escalar para**: Development Lead (decisões arquitectura complexas), Security Compliance Specialist (vulnerabilidades críticas)
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **1 TaskForce** (TaskForce teams):
|
||||
@@ -310,9 +294,6 @@ You are part of **1 TaskForce** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**Your responsibilities in this TaskForce:**
|
||||
|
||||
- **Sistema de agentes especializados para delegacao de tarefas via Task tool com consulta automatica de datasets Dify.**: NULL
|
||||
|
||||
**Collaboration:**
|
||||
- Work with other agents in your TaskForce teams
|
||||
- Share knowledge and context across team members
|
||||
|
||||
@@ -69,14 +69,6 @@ mcp__notebooklm__notebook_query notebook_id:"0c9c079c-a426-486c-99eb-1564d42d37a
|
||||
mcp__notebooklm__notebook_query notebook_id:"79d43410-0e29-4be1-881d-84db6bdc239a" query:"arquitectura solucoes"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"lideranca tecnica"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Gestao de Projetos" query:"coordenacao equipas"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Estrategia" query:"arquitectura solucoes"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
@@ -109,7 +101,7 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
||||
|
||||
### Workflow 2: Decisão Arquitectural
|
||||
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
|
||||
4. Discussão com stakeholders
|
||||
5. Documentar decisão (ADR - Architecture Decision Record)
|
||||
@@ -127,7 +119,7 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
||||
- `desk-crm-v3`: Gestão de tarefas e projectos
|
||||
- `gitea`: Gestão de repositórios e PRs
|
||||
- `memory-supabase`: Histórico de decisões técnicas
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `dify-kb`: KB Desenvolvimento, Gestão Projectos
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | ``: KB Desenvolvimento, Gestão Projectos
|
||||
|
||||
## Colaboracao
|
||||
|
||||
@@ -145,9 +137,9 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
||||
- Repositórios Git, issues, PRs
|
||||
- Usage: `mcp__gitea__*`
|
||||
|
||||
✓ **dify-kb** (knowledge)
|
||||
✓ **** (knowledge)
|
||||
- Knowledge base AI
|
||||
- Usage: `mcp__dify-kb__*`
|
||||
- Usage: `mcp____*`
|
||||
|
||||
✓ **memory-supabase** (system)
|
||||
- Memória longo prazo
|
||||
@@ -162,13 +154,11 @@ Lider de desenvolvimento responsavel por liderar equipas, garantir qualidade de
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -202,13 +192,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **2 SDKs** (TaskForce teams):
|
||||
|
||||
@@ -39,8 +39,6 @@ created: '2025-01-13'
|
||||
updated: '2026-02-04'
|
||||
author: Descomplicar®
|
||||
---
|
||||
|
||||
|
||||
# JavaScript Fullstack Specialist Descomplicar
|
||||
|
||||
Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e backend para entregar aplicacoes web modernas, escalaveis e performantes.
|
||||
@@ -61,13 +59,6 @@ mcp__notebooklm__notebook_query notebook_id:"24947ffa-0019-448a-a340-2f4a275d2eb
|
||||
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"fullstack web development modern frameworks"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"javascript typescript react node"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"fullstack web development modern frameworks"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
@@ -117,7 +108,7 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
||||
## MCPs Relevantes
|
||||
- `gitea`: Gestão de repositórios e PRs
|
||||
- `desk-crm-v3`: Tracking de tarefas
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `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
|
||||
|
||||
## Colaboracao
|
||||
@@ -136,9 +127,9 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
||||
- Usage: `mcp__gitea__*`
|
||||
|
||||
✓ **notebooklm** (knowledge primaria)
|
||||
✓ **dify-kb** (knowledge fallback)
|
||||
✓ **** (knowledge fallback)
|
||||
- Knowledge base AI
|
||||
- Usage: `mcp__dify-kb__*`
|
||||
- Usage: `mcp____*`
|
||||
|
||||
✓ **memory-supabase** (system)
|
||||
- Memória longo prazo
|
||||
@@ -153,13 +144,11 @@ Especialista em desenvolvimento JavaScript fullstack, coordenando frontend e bac
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -193,13 +182,11 @@ moloni, google-analytics, google-workspace, imap, outline-api, youtube-research,
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
**Example:** `Skill("skill-name")` invokes the skill.
|
||||
|
||||
|
||||
## Your Team & Responsibilities
|
||||
|
||||
You are part of **6 SDKs** (TaskForce teams):
|
||||
@@ -213,9 +200,6 @@ You are part of **6 SDKs** (TaskForce teams):
|
||||
**Purpose:** NULL
|
||||
|
||||
**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
|
||||
|
||||
**Purpose:** NULL
|
||||
|
||||
@@ -97,9 +97,6 @@ Especialista em desenvolvimento Next.js - App Router, Server Components, e arqui
|
||||
```
|
||||
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"<tema>"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario)
|
||||
|
||||
- Desenvolvimento Software
|
||||
- TI
|
||||
- React
|
||||
@@ -166,7 +163,7 @@ Especialista em desenvolvimento Next.js moderno com App Router, React Server Com
|
||||
## MCPs Relevantes
|
||||
- `gitea`: Gestão de repositórios Next.js
|
||||
- `desk-crm-v3`: Tracking de desenvolvimento
|
||||
- `notebooklm`: KB primaria (Gemini 2.5 RAG) | `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)
|
||||
|
||||
## Colaboracao
|
||||
@@ -183,18 +180,16 @@ Especialista em desenvolvimento Next.js moderno com App Router, React Server Com
|
||||
- **n8n** - Workflows automation
|
||||
- **filesystem** - Ficheiros locais
|
||||
- **magic** - AI-powered UI component generation (tipo v0.dev)
|
||||
- **dify-kb** - Knowledge base AI
|
||||
- **** - Knowledge base AI
|
||||
- **memory-supabase** - Memória longo prazo
|
||||
- **cwp** - CentOS Web Panel
|
||||
- **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
|
||||
|
||||
**Discovery:** Use ToolSearch to find specific tools.
|
||||
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
|
||||
|
||||
|
||||
## Your Available Skills
|
||||
|
||||
### Primary Skills (Your Domain)
|
||||
@@ -228,7 +223,7 @@ desk-crm-v3, moloni, google-analytics, google-workspace, imap, outline-api, yout
|
||||
- **/knowledge** - Gestão unificada de conhecimento - pesquisa inteligente com
|
||||
- **/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
|
||||
|
||||
**Discovery:** Use the Skill tool to invoke skills.
|
||||
|
||||
@@ -22,7 +22,6 @@ primary_mcps:
|
||||
- desk-crm-v3 # Business operations
|
||||
- gitea # Version control
|
||||
- ssh-unified # Server deployment
|
||||
- dify-kb # Knowledge base
|
||||
recommended_mcps:
|
||||
- context7 # Technical documentation
|
||||
- n8n # Workflow automation
|
||||
@@ -105,14 +104,6 @@ mcp__notebooklm__notebook_query notebook_id:"5be0d1a6-00f2-4cd9-b835-978cb772160
|
||||
mcp__notebooklm__notebook_query notebook_id:"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" query:"backend MySQL PostgreSQL arquitectura"
|
||||
```
|
||||
|
||||
### Dify KB (Secundario - se NotebookLM insuficiente)
|
||||
|
||||
```
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"Desenvolvimento de Software" query:"PHP Laravel Symfony APIs"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"WordPress" query:"PHP WordPress WooCommerce"
|
||||
mcp__dify-kb__dify_kb_retrieve_segments dataset:"TI" query:"backend MySQL PostgreSQL arquitectura"
|
||||
```
|
||||
|
||||
## System Prompt
|
||||
|
||||
### Papel
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"description": "Knowledge sources (NotebookLM + Dify KB) for Development Tools domain",
|
||||
"description": "Knowledge sources for Development Tools domain",
|
||||
"sources": {
|
||||
"notebooklm": {
|
||||
"description": "NotebookLM - conhecimento curado profundo via Gemini 2.5 RAG (PRIMARIO)",
|
||||
@@ -11,8 +11,7 @@
|
||||
"topics": [
|
||||
"claude",
|
||||
"code"
|
||||
],
|
||||
"maps_from_dify": "Claude Code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "73102308-70ef-403e-9be9-eae0cfc62d55",
|
||||
@@ -20,16 +19,14 @@
|
||||
"topics": [
|
||||
"mcp",
|
||||
"servers"
|
||||
],
|
||||
"maps_from_dify": "MCP Servers"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "57d9c6c9-48ba-4d83-8f71-cc890f348a53",
|
||||
"title": "AI Code Editors",
|
||||
"topics": [
|
||||
"code"
|
||||
],
|
||||
"maps_from_dify": "VS Code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "24947ffa-0019-448a-a340-2f4a275d2eb1",
|
||||
@@ -37,8 +34,7 @@
|
||||
"topics": [
|
||||
"desenvolvimento",
|
||||
"software"
|
||||
],
|
||||
"maps_from_dify": "Desenvolvimento de Software"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ebee9fe1-78fd-4f85-8938-f19f3ea32131",
|
||||
@@ -47,65 +43,9 @@
|
||||
"obsidian",
|
||||
"claude",
|
||||
"code"
|
||||
],
|
||||
"maps_from_dify": "Obsidian + Claude Code"
|
||||
}
|
||||
]
|
||||
},
|
||||
"dify_kb": {
|
||||
"description": "Dify KB - datasets tematicos (FALLBACK)",
|
||||
"query_tool": "mcp__dify-kb__dify_kb_retrieve_segments",
|
||||
"datasets": [
|
||||
{
|
||||
"id": "98e74ec7-4b4d-4876-8321-7f26ae66c3a6",
|
||||
"name": "Claude Code",
|
||||
"priority": 1,
|
||||
"document_count": 53,
|
||||
"word_count": 1241283
|
||||
},
|
||||
{
|
||||
"id": "02ca690a-a901-4034-9165-5ef42830f91e",
|
||||
"name": "MCP Servers",
|
||||
"priority": 1,
|
||||
"document_count": 22,
|
||||
"word_count": 158091
|
||||
},
|
||||
{
|
||||
"id": "eafd864e-5331-4a1d-a7e2-603ec263e2e1",
|
||||
"name": "VS Code",
|
||||
"priority": 2,
|
||||
"document_count": 52,
|
||||
"word_count": 10450973
|
||||
},
|
||||
{
|
||||
"id": "66ce30ab-a630-402b-8ae8-c3f44312e228",
|
||||
"name": "Windsurf",
|
||||
"priority": 2,
|
||||
"document_count": 5,
|
||||
"word_count": 98903
|
||||
},
|
||||
{
|
||||
"id": "2e68ac58-12cc-4c6f-b000-2bfff8fe6fcb",
|
||||
"name": "Claude Computer Use",
|
||||
"priority": 2,
|
||||
"document_count": 4,
|
||||
"word_count": 17078
|
||||
},
|
||||
{
|
||||
"id": "e7c7decc-0ded-4351-ab14-b110b3c38ec9",
|
||||
"name": "Desenvolvimento de Software",
|
||||
"priority": 1,
|
||||
"document_count": 2,
|
||||
"word_count": 534153
|
||||
},
|
||||
{
|
||||
"id": "e38a510f-ca93-4407-8b44-c4c66efe01f8",
|
||||
"name": "Obsidian + Claude Code",
|
||||
"priority": 2,
|
||||
"document_count": 121,
|
||||
"word_count": 2292847
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
---
|
||||
name: chrome
|
||||
description: Chrome browser integration for Claude Code. Navigate pages, fill forms, debug console, extract data, test web apps, automate tasks. Use when user mentions "chrome", "browser", "navegar site", "abrir pagina", "testar site", "preencher formulario", "extrair dados", "screenshot site", "google docs", "authenticated site", "gravar gif", "console errors".
|
||||
author: Descomplicar® Crescimento Digital
|
||||
version: 2.0.0
|
||||
quality_score: 80
|
||||
user_invocable: true
|
||||
description: Integração com Chrome para automação browser — navegar páginas, preencher formulários, debug de consola, extracção de dados, testes e screenshots.
|
||||
allowed-tools: Bash, Read, Write, Glob
|
||||
---
|
||||
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
---
|
||||
name: db-design
|
||||
description: Database schema design and optimization. Creates normalized schemas,
|
||||
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
|
||||
description: Design e optimização de schemas de base de dados — normalização, índices, planos de migração e particionamento.
|
||||
---
|
||||
|
||||
# Database Design Specialist
|
||||
|
||||
@@ -1,22 +1,37 @@
|
||||
---
|
||||
name: security-check
|
||||
description: Comprehensive security audit for Node.js/PHP projects - dependency vulnerabilities, outdated packages, environment safety, type checking. Use before git commits.
|
||||
domain: Dev
|
||||
model: sonnet
|
||||
priority: high
|
||||
tags:
|
||||
- security
|
||||
- audit
|
||||
- vulnerabilities
|
||||
- npm
|
||||
- composer
|
||||
- mandatory
|
||||
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
|
||||
---
|
||||
|
||||
# /security-check - Security Audit Pre-Commit
|
||||
# /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
|
||||
@@ -407,7 +422,7 @@ Se não existe ou > 1h → **BLOQUEIA** commit
|
||||
# Workflow típico
|
||||
/time start 1446 # Tarefa Desk
|
||||
# ... fazer alterações ...
|
||||
/security-check # Antes de commit
|
||||
/dep-audit # Antes de commit
|
||||
git commit
|
||||
/time stop
|
||||
```
|
||||
@@ -428,7 +443,7 @@ git commit
|
||||
|----------|--------------|
|
||||
| Vulnerabilidades críticas não corrigíveis | Security Compliance Specialist |
|
||||
| Dúvidas sobre overrides | Development Lead |
|
||||
| Múltiplas vulnerabilidades altas | /security-check + manual review |
|
||||
| Múltiplas vulnerabilidades altas | /dep-audit + manual review |
|
||||
| Alternativas a packages | Research Analyst |
|
||||
|
||||
---
|
||||
@@ -444,5 +459,5 @@ git commit
|
||||
|
||||
---
|
||||
|
||||
**Skill v1.0** | 2026-02-14 | Descomplicar®
|
||||
**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>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/customXml"
|
||||
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/customXml"
|
||||
elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all">
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||
<xsd:complexType name="CT_DatastoreSchemaRef">
|
||||
<xsd:attribute name="uri" type="xsd:string" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_DatastoreSchemaRefs">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="schemaRef" type="CT_DatastoreSchemaRef" minOccurs="0" maxOccurs="unbounded"
|
||||
/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_DatastoreItem">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="schemaRefs" type="CT_DatastoreSchemaRefs" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="itemID" type="s:ST_Guid" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="datastoreItem" type="CT_DatastoreItem"/>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.openxmlformats.org/schemaLibrary/2006/main"
|
||||
targetNamespace="http://schemas.openxmlformats.org/schemaLibrary/2006/main"
|
||||
attributeFormDefault="qualified" elementFormDefault="qualified">
|
||||
<xsd:complexType name="CT_Schema">
|
||||
<xsd:attribute name="uri" type="xsd:string" default=""/>
|
||||
<xsd:attribute name="manifestLocation" type="xsd:string"/>
|
||||
<xsd:attribute name="schemaLocation" type="xsd:string"/>
|
||||
<xsd:attribute name="schemaLanguage" type="xsd:token"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SchemaLibrary">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="schema" type="CT_Schema" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="schemaLibrary" type="CT_SchemaLibrary"/>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
|
||||
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
|
||||
blockDefault="#all" elementFormDefault="qualified">
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||
schemaLocation="shared-documentPropertiesVariantTypes.xsd"/>
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||
<xsd:element name="Properties" type="CT_Properties"/>
|
||||
<xsd:complexType name="CT_Properties">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="property" minOccurs="0" maxOccurs="unbounded" type="CT_Property"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Property">
|
||||
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||
<xsd:element ref="vt:vector"/>
|
||||
<xsd:element ref="vt:array"/>
|
||||
<xsd:element ref="vt:blob"/>
|
||||
<xsd:element ref="vt:oblob"/>
|
||||
<xsd:element ref="vt:empty"/>
|
||||
<xsd:element ref="vt:null"/>
|
||||
<xsd:element ref="vt:i1"/>
|
||||
<xsd:element ref="vt:i2"/>
|
||||
<xsd:element ref="vt:i4"/>
|
||||
<xsd:element ref="vt:i8"/>
|
||||
<xsd:element ref="vt:int"/>
|
||||
<xsd:element ref="vt:ui1"/>
|
||||
<xsd:element ref="vt:ui2"/>
|
||||
<xsd:element ref="vt:ui4"/>
|
||||
<xsd:element ref="vt:ui8"/>
|
||||
<xsd:element ref="vt:uint"/>
|
||||
<xsd:element ref="vt:r4"/>
|
||||
<xsd:element ref="vt:r8"/>
|
||||
<xsd:element ref="vt:decimal"/>
|
||||
<xsd:element ref="vt:lpstr"/>
|
||||
<xsd:element ref="vt:lpwstr"/>
|
||||
<xsd:element ref="vt:bstr"/>
|
||||
<xsd:element ref="vt:date"/>
|
||||
<xsd:element ref="vt:filetime"/>
|
||||
<xsd:element ref="vt:bool"/>
|
||||
<xsd:element ref="vt:cy"/>
|
||||
<xsd:element ref="vt:error"/>
|
||||
<xsd:element ref="vt:stream"/>
|
||||
<xsd:element ref="vt:ostream"/>
|
||||
<xsd:element ref="vt:storage"/>
|
||||
<xsd:element ref="vt:ostorage"/>
|
||||
<xsd:element ref="vt:vstream"/>
|
||||
<xsd:element ref="vt:clsid"/>
|
||||
</xsd:choice>
|
||||
<xsd:attribute name="fmtid" use="required" type="s:ST_Guid"/>
|
||||
<xsd:attribute name="pid" use="required" type="xsd:int"/>
|
||||
<xsd:attribute name="name" use="optional" type="xsd:string"/>
|
||||
<xsd:attribute name="linkTarget" use="optional" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
||||
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
||||
elementFormDefault="qualified" blockDefault="#all">
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||
schemaLocation="shared-documentPropertiesVariantTypes.xsd"/>
|
||||
<xsd:element name="Properties" type="CT_Properties"/>
|
||||
<xsd:complexType name="CT_Properties">
|
||||
<xsd:all>
|
||||
<xsd:element name="Template" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||
<xsd:element name="Manager" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||
<xsd:element name="Company" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||
<xsd:element name="Pages" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="Words" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="Characters" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="PresentationFormat" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||
<xsd:element name="Lines" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="Paragraphs" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="Slides" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="Notes" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="TotalTime" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="HiddenSlides" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="MMClips" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="ScaleCrop" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||
<xsd:element name="HeadingPairs" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/>
|
||||
<xsd:element name="TitlesOfParts" minOccurs="0" maxOccurs="1" type="CT_VectorLpstr"/>
|
||||
<xsd:element name="LinksUpToDate" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||
<xsd:element name="CharactersWithSpaces" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
<xsd:element name="SharedDoc" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||
<xsd:element name="HyperlinkBase" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||
<xsd:element name="HLinks" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/>
|
||||
<xsd:element name="HyperlinksChanged" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||
<xsd:element name="DigSig" minOccurs="0" maxOccurs="1" type="CT_DigSigBlob"/>
|
||||
<xsd:element name="Application" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||
<xsd:element name="AppVersion" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||
<xsd:element name="DocSecurity" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||
</xsd:all>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_VectorVariant">
|
||||
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||
<xsd:element ref="vt:vector"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_VectorLpstr">
|
||||
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||
<xsd:element ref="vt:vector"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_DigSigBlob">
|
||||
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||
<xsd:element ref="vt:blob"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,195 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||
blockDefault="#all" elementFormDefault="qualified">
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||
<xsd:simpleType name="ST_VectorBaseType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="variant"/>
|
||||
<xsd:enumeration value="i1"/>
|
||||
<xsd:enumeration value="i2"/>
|
||||
<xsd:enumeration value="i4"/>
|
||||
<xsd:enumeration value="i8"/>
|
||||
<xsd:enumeration value="ui1"/>
|
||||
<xsd:enumeration value="ui2"/>
|
||||
<xsd:enumeration value="ui4"/>
|
||||
<xsd:enumeration value="ui8"/>
|
||||
<xsd:enumeration value="r4"/>
|
||||
<xsd:enumeration value="r8"/>
|
||||
<xsd:enumeration value="lpstr"/>
|
||||
<xsd:enumeration value="lpwstr"/>
|
||||
<xsd:enumeration value="bstr"/>
|
||||
<xsd:enumeration value="date"/>
|
||||
<xsd:enumeration value="filetime"/>
|
||||
<xsd:enumeration value="bool"/>
|
||||
<xsd:enumeration value="cy"/>
|
||||
<xsd:enumeration value="error"/>
|
||||
<xsd:enumeration value="clsid"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ArrayBaseType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="variant"/>
|
||||
<xsd:enumeration value="i1"/>
|
||||
<xsd:enumeration value="i2"/>
|
||||
<xsd:enumeration value="i4"/>
|
||||
<xsd:enumeration value="int"/>
|
||||
<xsd:enumeration value="ui1"/>
|
||||
<xsd:enumeration value="ui2"/>
|
||||
<xsd:enumeration value="ui4"/>
|
||||
<xsd:enumeration value="uint"/>
|
||||
<xsd:enumeration value="r4"/>
|
||||
<xsd:enumeration value="r8"/>
|
||||
<xsd:enumeration value="decimal"/>
|
||||
<xsd:enumeration value="bstr"/>
|
||||
<xsd:enumeration value="date"/>
|
||||
<xsd:enumeration value="bool"/>
|
||||
<xsd:enumeration value="cy"/>
|
||||
<xsd:enumeration value="error"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_Cy">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:pattern value="\s*[0-9]*\.[0-9]{4}\s*"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_Error">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:pattern value="\s*0x[0-9A-Za-z]{8}\s*"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_Empty"/>
|
||||
<xsd:complexType name="CT_Null"/>
|
||||
<xsd:complexType name="CT_Vector">
|
||||
<xsd:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xsd:element ref="variant"/>
|
||||
<xsd:element ref="i1"/>
|
||||
<xsd:element ref="i2"/>
|
||||
<xsd:element ref="i4"/>
|
||||
<xsd:element ref="i8"/>
|
||||
<xsd:element ref="ui1"/>
|
||||
<xsd:element ref="ui2"/>
|
||||
<xsd:element ref="ui4"/>
|
||||
<xsd:element ref="ui8"/>
|
||||
<xsd:element ref="r4"/>
|
||||
<xsd:element ref="r8"/>
|
||||
<xsd:element ref="lpstr"/>
|
||||
<xsd:element ref="lpwstr"/>
|
||||
<xsd:element ref="bstr"/>
|
||||
<xsd:element ref="date"/>
|
||||
<xsd:element ref="filetime"/>
|
||||
<xsd:element ref="bool"/>
|
||||
<xsd:element ref="cy"/>
|
||||
<xsd:element ref="error"/>
|
||||
<xsd:element ref="clsid"/>
|
||||
</xsd:choice>
|
||||
<xsd:attribute name="baseType" type="ST_VectorBaseType" use="required"/>
|
||||
<xsd:attribute name="size" type="xsd:unsignedInt" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Array">
|
||||
<xsd:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xsd:element ref="variant"/>
|
||||
<xsd:element ref="i1"/>
|
||||
<xsd:element ref="i2"/>
|
||||
<xsd:element ref="i4"/>
|
||||
<xsd:element ref="int"/>
|
||||
<xsd:element ref="ui1"/>
|
||||
<xsd:element ref="ui2"/>
|
||||
<xsd:element ref="ui4"/>
|
||||
<xsd:element ref="uint"/>
|
||||
<xsd:element ref="r4"/>
|
||||
<xsd:element ref="r8"/>
|
||||
<xsd:element ref="decimal"/>
|
||||
<xsd:element ref="bstr"/>
|
||||
<xsd:element ref="date"/>
|
||||
<xsd:element ref="bool"/>
|
||||
<xsd:element ref="error"/>
|
||||
<xsd:element ref="cy"/>
|
||||
</xsd:choice>
|
||||
<xsd:attribute name="lBounds" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="uBounds" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="baseType" type="ST_ArrayBaseType" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Variant">
|
||||
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||
<xsd:element ref="variant"/>
|
||||
<xsd:element ref="vector"/>
|
||||
<xsd:element ref="array"/>
|
||||
<xsd:element ref="blob"/>
|
||||
<xsd:element ref="oblob"/>
|
||||
<xsd:element ref="empty"/>
|
||||
<xsd:element ref="null"/>
|
||||
<xsd:element ref="i1"/>
|
||||
<xsd:element ref="i2"/>
|
||||
<xsd:element ref="i4"/>
|
||||
<xsd:element ref="i8"/>
|
||||
<xsd:element ref="int"/>
|
||||
<xsd:element ref="ui1"/>
|
||||
<xsd:element ref="ui2"/>
|
||||
<xsd:element ref="ui4"/>
|
||||
<xsd:element ref="ui8"/>
|
||||
<xsd:element ref="uint"/>
|
||||
<xsd:element ref="r4"/>
|
||||
<xsd:element ref="r8"/>
|
||||
<xsd:element ref="decimal"/>
|
||||
<xsd:element ref="lpstr"/>
|
||||
<xsd:element ref="lpwstr"/>
|
||||
<xsd:element ref="bstr"/>
|
||||
<xsd:element ref="date"/>
|
||||
<xsd:element ref="filetime"/>
|
||||
<xsd:element ref="bool"/>
|
||||
<xsd:element ref="cy"/>
|
||||
<xsd:element ref="error"/>
|
||||
<xsd:element ref="stream"/>
|
||||
<xsd:element ref="ostream"/>
|
||||
<xsd:element ref="storage"/>
|
||||
<xsd:element ref="ostorage"/>
|
||||
<xsd:element ref="vstream"/>
|
||||
<xsd:element ref="clsid"/>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Vstream">
|
||||
<xsd:simpleContent>
|
||||
<xsd:extension base="xsd:base64Binary">
|
||||
<xsd:attribute name="version" type="s:ST_Guid"/>
|
||||
</xsd:extension>
|
||||
</xsd:simpleContent>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="variant" type="CT_Variant"/>
|
||||
<xsd:element name="vector" type="CT_Vector"/>
|
||||
<xsd:element name="array" type="CT_Array"/>
|
||||
<xsd:element name="blob" type="xsd:base64Binary"/>
|
||||
<xsd:element name="oblob" type="xsd:base64Binary"/>
|
||||
<xsd:element name="empty" type="CT_Empty"/>
|
||||
<xsd:element name="null" type="CT_Null"/>
|
||||
<xsd:element name="i1" type="xsd:byte"/>
|
||||
<xsd:element name="i2" type="xsd:short"/>
|
||||
<xsd:element name="i4" type="xsd:int"/>
|
||||
<xsd:element name="i8" type="xsd:long"/>
|
||||
<xsd:element name="int" type="xsd:int"/>
|
||||
<xsd:element name="ui1" type="xsd:unsignedByte"/>
|
||||
<xsd:element name="ui2" type="xsd:unsignedShort"/>
|
||||
<xsd:element name="ui4" type="xsd:unsignedInt"/>
|
||||
<xsd:element name="ui8" type="xsd:unsignedLong"/>
|
||||
<xsd:element name="uint" type="xsd:unsignedInt"/>
|
||||
<xsd:element name="r4" type="xsd:float"/>
|
||||
<xsd:element name="r8" type="xsd:double"/>
|
||||
<xsd:element name="decimal" type="xsd:decimal"/>
|
||||
<xsd:element name="lpstr" type="xsd:string"/>
|
||||
<xsd:element name="lpwstr" type="xsd:string"/>
|
||||
<xsd:element name="bstr" type="xsd:string"/>
|
||||
<xsd:element name="date" type="xsd:dateTime"/>
|
||||
<xsd:element name="filetime" type="xsd:dateTime"/>
|
||||
<xsd:element name="bool" type="xsd:boolean"/>
|
||||
<xsd:element name="cy" type="ST_Cy"/>
|
||||
<xsd:element name="error" type="ST_Error"/>
|
||||
<xsd:element name="stream" type="xsd:base64Binary"/>
|
||||
<xsd:element name="ostream" type="xsd:base64Binary"/>
|
||||
<xsd:element name="storage" type="xsd:base64Binary"/>
|
||||
<xsd:element name="ostorage" type="xsd:base64Binary"/>
|
||||
<xsd:element name="vstream" type="CT_Vstream"/>
|
||||
<xsd:element name="clsid" type="s:ST_Guid"/>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,582 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
||||
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
||||
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all"
|
||||
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/math">
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||
schemaLocation="wml.xsd"/>
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
|
||||
<xsd:simpleType name="ST_Integer255">
|
||||
<xsd:restriction base="xsd:integer">
|
||||
<xsd:minInclusive value="1"/>
|
||||
<xsd:maxInclusive value="255"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_Integer255">
|
||||
<xsd:attribute name="val" type="ST_Integer255" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_Integer2">
|
||||
<xsd:restriction base="xsd:integer">
|
||||
<xsd:minInclusive value="-2"/>
|
||||
<xsd:maxInclusive value="2"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_Integer2">
|
||||
<xsd:attribute name="val" type="ST_Integer2" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_SpacingRule">
|
||||
<xsd:restriction base="xsd:integer">
|
||||
<xsd:minInclusive value="0"/>
|
||||
<xsd:maxInclusive value="4"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_SpacingRule">
|
||||
<xsd:attribute name="val" type="ST_SpacingRule" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_UnSignedInteger">
|
||||
<xsd:restriction base="xsd:unsignedInt"/>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_UnSignedInteger">
|
||||
<xsd:attribute name="val" type="ST_UnSignedInteger" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_Char">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:maxLength value="1"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_Char">
|
||||
<xsd:attribute name="val" type="ST_Char" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_OnOff">
|
||||
<xsd:attribute name="val" type="s:ST_OnOff"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_String">
|
||||
<xsd:attribute name="val" type="s:ST_String"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_XAlign">
|
||||
<xsd:attribute name="val" type="s:ST_XAlign" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_YAlign">
|
||||
<xsd:attribute name="val" type="s:ST_YAlign" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_Shp">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="centered"/>
|
||||
<xsd:enumeration value="match"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_Shp">
|
||||
<xsd:attribute name="val" type="ST_Shp" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_FType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="bar"/>
|
||||
<xsd:enumeration value="skw"/>
|
||||
<xsd:enumeration value="lin"/>
|
||||
<xsd:enumeration value="noBar"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_FType">
|
||||
<xsd:attribute name="val" type="ST_FType" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_LimLoc">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="undOvr"/>
|
||||
<xsd:enumeration value="subSup"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_LimLoc">
|
||||
<xsd:attribute name="val" type="ST_LimLoc" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_TopBot">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="top"/>
|
||||
<xsd:enumeration value="bot"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_TopBot">
|
||||
<xsd:attribute name="val" type="ST_TopBot" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_Script">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="roman"/>
|
||||
<xsd:enumeration value="script"/>
|
||||
<xsd:enumeration value="fraktur"/>
|
||||
<xsd:enumeration value="double-struck"/>
|
||||
<xsd:enumeration value="sans-serif"/>
|
||||
<xsd:enumeration value="monospace"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_Script">
|
||||
<xsd:attribute name="val" type="ST_Script"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_Style">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="p"/>
|
||||
<xsd:enumeration value="b"/>
|
||||
<xsd:enumeration value="i"/>
|
||||
<xsd:enumeration value="bi"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_Style">
|
||||
<xsd:attribute name="val" type="ST_Style"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_ManualBreak">
|
||||
<xsd:attribute name="alnAt" type="ST_Integer255"/>
|
||||
</xsd:complexType>
|
||||
<xsd:group name="EG_ScriptStyle">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="scr" minOccurs="0" type="CT_Script"/>
|
||||
<xsd:element name="sty" minOccurs="0" type="CT_Style"/>
|
||||
</xsd:sequence>
|
||||
</xsd:group>
|
||||
<xsd:complexType name="CT_RPR">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="lit" minOccurs="0" type="CT_OnOff"/>
|
||||
<xsd:choice>
|
||||
<xsd:element name="nor" minOccurs="0" type="CT_OnOff"/>
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="EG_ScriptStyle"/>
|
||||
</xsd:sequence>
|
||||
</xsd:choice>
|
||||
<xsd:element name="brk" minOccurs="0" type="CT_ManualBreak"/>
|
||||
<xsd:element name="aln" minOccurs="0" type="CT_OnOff"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Text">
|
||||
<xsd:simpleContent>
|
||||
<xsd:extension base="s:ST_String">
|
||||
<xsd:attribute ref="xml:space" use="optional"/>
|
||||
</xsd:extension>
|
||||
</xsd:simpleContent>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_R">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="rPr" type="CT_RPR" minOccurs="0"/>
|
||||
<xsd:group ref="w:EG_RPr" minOccurs="0"/>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:group ref="w:EG_RunInnerContent"/>
|
||||
<xsd:element name="t" type="CT_Text" minOccurs="0"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_CtrlPr">
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="w:EG_RPrMath" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_AccPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Acc">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="accPr" type="CT_AccPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_BarPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="pos" type="CT_TopBot" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Bar">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="barPr" type="CT_BarPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_BoxPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="opEmu" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="noBreak" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="diff" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="brk" type="CT_ManualBreak" minOccurs="0"/>
|
||||
<xsd:element name="aln" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Box">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="boxPr" type="CT_BoxPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_BorderBoxPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="hideTop" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="hideBot" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="hideLeft" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="hideRight" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="strikeH" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="strikeV" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="strikeBLTR" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="strikeTLBR" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_BorderBox">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="borderBoxPr" type="CT_BorderBoxPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_DPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="begChr" type="CT_Char" minOccurs="0"/>
|
||||
<xsd:element name="sepChr" type="CT_Char" minOccurs="0"/>
|
||||
<xsd:element name="endChr" type="CT_Char" minOccurs="0"/>
|
||||
<xsd:element name="grow" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="shp" type="CT_Shp" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_D">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="dPr" type="CT_DPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_EqArrPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/>
|
||||
<xsd:element name="maxDist" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="objDist" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||
<xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_EqArr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="eqArrPr" type="CT_EqArrPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_FPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="type" type="CT_FType" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_F">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="fPr" type="CT_FPr" minOccurs="0"/>
|
||||
<xsd:element name="num" type="CT_OMathArg"/>
|
||||
<xsd:element name="den" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_FuncPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Func">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="funcPr" type="CT_FuncPr" minOccurs="0"/>
|
||||
<xsd:element name="fName" type="CT_OMathArg"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_GroupChrPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||
<xsd:element name="pos" type="CT_TopBot" minOccurs="0"/>
|
||||
<xsd:element name="vertJc" type="CT_TopBot" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_GroupChr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="groupChrPr" type="CT_GroupChrPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_LimLowPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_LimLow">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="limLowPr" type="CT_LimLowPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
<xsd:element name="lim" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_LimUppPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_LimUpp">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="limUppPr" type="CT_LimUppPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
<xsd:element name="lim" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_MCPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="count" type="CT_Integer255" minOccurs="0"/>
|
||||
<xsd:element name="mcJc" type="CT_XAlign" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_MC">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="mcPr" type="CT_MCPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_MCS">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="mc" type="CT_MC" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_MPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/>
|
||||
<xsd:element name="plcHide" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||
<xsd:element name="cGpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||
<xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||
<xsd:element name="cSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||
<xsd:element name="cGp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||
<xsd:element name="mcs" type="CT_MCS" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_MR">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_M">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="mPr" type="CT_MPr" minOccurs="0"/>
|
||||
<xsd:element name="mr" type="CT_MR" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_NaryPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||
<xsd:element name="limLoc" type="CT_LimLoc" minOccurs="0"/>
|
||||
<xsd:element name="grow" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="subHide" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="supHide" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Nary">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="naryPr" type="CT_NaryPr" minOccurs="0"/>
|
||||
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_PhantPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="show" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="zeroWid" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="zeroAsc" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="zeroDesc" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="transp" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Phant">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="phantPr" type="CT_PhantPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_RadPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="degHide" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Rad">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="radPr" type="CT_RadPr" minOccurs="0"/>
|
||||
<xsd:element name="deg" type="CT_OMathArg"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SPrePr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SPre">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="sPrePr" type="CT_SPrePr" minOccurs="0"/>
|
||||
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SSubPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SSub">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="sSubPr" type="CT_SSubPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SSubSupPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="alnScr" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SSubSup">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="sSubSupPr" type="CT_SSubSupPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SSupPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SSup">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="sSupPr" type="CT_SSupPr" minOccurs="0"/>
|
||||
<xsd:element name="e" type="CT_OMathArg"/>
|
||||
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:group name="EG_OMathMathElements">
|
||||
<xsd:choice>
|
||||
<xsd:element name="acc" type="CT_Acc"/>
|
||||
<xsd:element name="bar" type="CT_Bar"/>
|
||||
<xsd:element name="box" type="CT_Box"/>
|
||||
<xsd:element name="borderBox" type="CT_BorderBox"/>
|
||||
<xsd:element name="d" type="CT_D"/>
|
||||
<xsd:element name="eqArr" type="CT_EqArr"/>
|
||||
<xsd:element name="f" type="CT_F"/>
|
||||
<xsd:element name="func" type="CT_Func"/>
|
||||
<xsd:element name="groupChr" type="CT_GroupChr"/>
|
||||
<xsd:element name="limLow" type="CT_LimLow"/>
|
||||
<xsd:element name="limUpp" type="CT_LimUpp"/>
|
||||
<xsd:element name="m" type="CT_M"/>
|
||||
<xsd:element name="nary" type="CT_Nary"/>
|
||||
<xsd:element name="phant" type="CT_Phant"/>
|
||||
<xsd:element name="rad" type="CT_Rad"/>
|
||||
<xsd:element name="sPre" type="CT_SPre"/>
|
||||
<xsd:element name="sSub" type="CT_SSub"/>
|
||||
<xsd:element name="sSubSup" type="CT_SSubSup"/>
|
||||
<xsd:element name="sSup" type="CT_SSup"/>
|
||||
<xsd:element name="r" type="CT_R"/>
|
||||
</xsd:choice>
|
||||
</xsd:group>
|
||||
<xsd:group name="EG_OMathElements">
|
||||
<xsd:choice>
|
||||
<xsd:group ref="EG_OMathMathElements"/>
|
||||
<xsd:group ref="w:EG_PContentMath"/>
|
||||
</xsd:choice>
|
||||
</xsd:group>
|
||||
<xsd:complexType name="CT_OMathArgPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="argSz" type="CT_Integer2" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_OMathArg">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="argPr" type="CT_OMathArgPr" minOccurs="0"/>
|
||||
<xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_Jc">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="left"/>
|
||||
<xsd:enumeration value="right"/>
|
||||
<xsd:enumeration value="center"/>
|
||||
<xsd:enumeration value="centerGroup"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_OMathJc">
|
||||
<xsd:attribute name="val" type="ST_Jc"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_OMathParaPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="jc" type="CT_OMathJc" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_TwipsMeasure">
|
||||
<xsd:attribute name="val" type="s:ST_TwipsMeasure" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_BreakBin">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="before"/>
|
||||
<xsd:enumeration value="after"/>
|
||||
<xsd:enumeration value="repeat"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_BreakBin">
|
||||
<xsd:attribute name="val" type="ST_BreakBin"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_BreakBinSub">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="--"/>
|
||||
<xsd:enumeration value="-+"/>
|
||||
<xsd:enumeration value="+-"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_BreakBinSub">
|
||||
<xsd:attribute name="val" type="ST_BreakBinSub"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_MathPr">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="mathFont" type="CT_String" minOccurs="0"/>
|
||||
<xsd:element name="brkBin" type="CT_BreakBin" minOccurs="0"/>
|
||||
<xsd:element name="brkBinSub" type="CT_BreakBinSub" minOccurs="0"/>
|
||||
<xsd:element name="smallFrac" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="dispDef" type="CT_OnOff" minOccurs="0"/>
|
||||
<xsd:element name="lMargin" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||
<xsd:element name="rMargin" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||
<xsd:element name="defJc" type="CT_OMathJc" minOccurs="0"/>
|
||||
<xsd:element name="preSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||
<xsd:element name="postSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||
<xsd:element name="interSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||
<xsd:element name="intraSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||
<xsd:choice minOccurs="0">
|
||||
<xsd:element name="wrapIndent" type="CT_TwipsMeasure"/>
|
||||
<xsd:element name="wrapRight" type="CT_OnOff"/>
|
||||
</xsd:choice>
|
||||
<xsd:element name="intLim" type="CT_LimLoc" minOccurs="0"/>
|
||||
<xsd:element name="naryLim" type="CT_LimLoc" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="mathPr" type="CT_MathPr"/>
|
||||
<xsd:complexType name="CT_OMathPara">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="oMathParaPr" type="CT_OMathParaPr" minOccurs="0"/>
|
||||
<xsd:element name="oMath" type="CT_OMath" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_OMath">
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="oMathPara" type="CT_OMathPara"/>
|
||||
<xsd:element name="oMath" type="CT_OMath"/>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||
elementFormDefault="qualified"
|
||||
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||
blockDefault="#all">
|
||||
<xsd:simpleType name="ST_RelationshipId">
|
||||
<xsd:restriction base="xsd:string"/>
|
||||
</xsd:simpleType>
|
||||
<xsd:attribute name="id" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="embed" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="link" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="dm" type="ST_RelationshipId" default=""/>
|
||||
<xsd:attribute name="lo" type="ST_RelationshipId" default=""/>
|
||||
<xsd:attribute name="qs" type="ST_RelationshipId" default=""/>
|
||||
<xsd:attribute name="cs" type="ST_RelationshipId" default=""/>
|
||||
<xsd:attribute name="blip" type="ST_RelationshipId" default=""/>
|
||||
<xsd:attribute name="pict" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="href" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="topLeft" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="topRight" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="bottomLeft" type="ST_RelationshipId"/>
|
||||
<xsd:attribute name="bottomRight" type="ST_RelationshipId"/>
|
||||
</xsd:schema>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,570 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:vml"
|
||||
xmlns:pvml="urn:schemas-microsoft-com:office:powerpoint"
|
||||
xmlns:o="urn:schemas-microsoft-com:office:office"
|
||||
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||
xmlns:w10="urn:schemas-microsoft-com:office:word"
|
||||
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||
xmlns:x="urn:schemas-microsoft-com:office:excel"
|
||||
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
targetNamespace="urn:schemas-microsoft-com:vml" elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
<xsd:import namespace="urn:schemas-microsoft-com:office:office"
|
||||
schemaLocation="vml-officeDrawing.xsd"/>
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||
schemaLocation="wml.xsd"/>
|
||||
<xsd:import namespace="urn:schemas-microsoft-com:office:word"
|
||||
schemaLocation="vml-wordprocessingDrawing.xsd"/>
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||
schemaLocation="shared-relationshipReference.xsd"/>
|
||||
<xsd:import namespace="urn:schemas-microsoft-com:office:excel"
|
||||
schemaLocation="vml-spreadsheetDrawing.xsd"/>
|
||||
<xsd:import namespace="urn:schemas-microsoft-com:office:powerpoint"
|
||||
schemaLocation="vml-presentationDrawing.xsd"/>
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||
<xsd:attributeGroup name="AG_Id">
|
||||
<xsd:attribute name="id" type="xsd:string" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_Style">
|
||||
<xsd:attribute name="style" type="xsd:string" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_Type">
|
||||
<xsd:attribute name="type" type="xsd:string" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_Adj">
|
||||
<xsd:attribute name="adj" type="xsd:string" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_Path">
|
||||
<xsd:attribute name="path" type="xsd:string" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_Fill">
|
||||
<xsd:attribute name="filled" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="fillcolor" type="s:ST_ColorType" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_Chromakey">
|
||||
<xsd:attribute name="chromakey" type="s:ST_ColorType" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_Ext">
|
||||
<xsd:attribute name="ext" form="qualified" type="ST_Ext"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_CoreAttributes">
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attributeGroup ref="AG_Style"/>
|
||||
<xsd:attribute name="href" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="target" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="class" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="title" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="alt" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="coordsize" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="coordorigin" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="wrapcoords" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="print" type="s:ST_TrueFalse" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_ShapeAttributes">
|
||||
<xsd:attributeGroup ref="AG_Chromakey"/>
|
||||
<xsd:attributeGroup ref="AG_Fill"/>
|
||||
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="stroked" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="strokecolor" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="strokeweight" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_OfficeCoreAttributes">
|
||||
<xsd:attribute ref="o:spid"/>
|
||||
<xsd:attribute ref="o:oned"/>
|
||||
<xsd:attribute ref="o:regroupid"/>
|
||||
<xsd:attribute ref="o:doubleclicknotify"/>
|
||||
<xsd:attribute ref="o:button"/>
|
||||
<xsd:attribute ref="o:userhidden"/>
|
||||
<xsd:attribute ref="o:bullet"/>
|
||||
<xsd:attribute ref="o:hr"/>
|
||||
<xsd:attribute ref="o:hrstd"/>
|
||||
<xsd:attribute ref="o:hrnoshade"/>
|
||||
<xsd:attribute ref="o:hrpct"/>
|
||||
<xsd:attribute ref="o:hralign"/>
|
||||
<xsd:attribute ref="o:allowincell"/>
|
||||
<xsd:attribute ref="o:allowoverlap"/>
|
||||
<xsd:attribute ref="o:userdrawn"/>
|
||||
<xsd:attribute ref="o:bordertopcolor"/>
|
||||
<xsd:attribute ref="o:borderleftcolor"/>
|
||||
<xsd:attribute ref="o:borderbottomcolor"/>
|
||||
<xsd:attribute ref="o:borderrightcolor"/>
|
||||
<xsd:attribute ref="o:dgmlayout"/>
|
||||
<xsd:attribute ref="o:dgmnodekind"/>
|
||||
<xsd:attribute ref="o:dgmlayoutmru"/>
|
||||
<xsd:attribute ref="o:insetmode"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_OfficeShapeAttributes">
|
||||
<xsd:attribute ref="o:spt"/>
|
||||
<xsd:attribute ref="o:connectortype"/>
|
||||
<xsd:attribute ref="o:bwmode"/>
|
||||
<xsd:attribute ref="o:bwpure"/>
|
||||
<xsd:attribute ref="o:bwnormal"/>
|
||||
<xsd:attribute ref="o:forcedash"/>
|
||||
<xsd:attribute ref="o:oleicon"/>
|
||||
<xsd:attribute ref="o:ole"/>
|
||||
<xsd:attribute ref="o:preferrelative"/>
|
||||
<xsd:attribute ref="o:cliptowrap"/>
|
||||
<xsd:attribute ref="o:clip"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_AllCoreAttributes">
|
||||
<xsd:attributeGroup ref="AG_CoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_OfficeCoreAttributes"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_AllShapeAttributes">
|
||||
<xsd:attributeGroup ref="AG_ShapeAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_OfficeShapeAttributes"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_ImageAttributes">
|
||||
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="cropleft" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="croptop" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="cropright" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="cropbottom" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="gain" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="blacklevel" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="gamma" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="grayscale" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="bilevel" type="s:ST_TrueFalse" use="optional"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:attributeGroup name="AG_StrokeAttributes">
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="weight" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="linestyle" type="ST_StrokeLineStyle" use="optional"/>
|
||||
<xsd:attribute name="miterlimit" type="xsd:decimal" use="optional"/>
|
||||
<xsd:attribute name="joinstyle" type="ST_StrokeJoinStyle" use="optional"/>
|
||||
<xsd:attribute name="endcap" type="ST_StrokeEndCap" use="optional"/>
|
||||
<xsd:attribute name="dashstyle" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="filltype" type="ST_FillType" use="optional"/>
|
||||
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="imageaspect" type="ST_ImageAspect" use="optional"/>
|
||||
<xsd:attribute name="imagesize" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="imagealignshape" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="startarrow" type="ST_StrokeArrowType" use="optional"/>
|
||||
<xsd:attribute name="startarrowwidth" type="ST_StrokeArrowWidth" use="optional"/>
|
||||
<xsd:attribute name="startarrowlength" type="ST_StrokeArrowLength" use="optional"/>
|
||||
<xsd:attribute name="endarrow" type="ST_StrokeArrowType" use="optional"/>
|
||||
<xsd:attribute name="endarrowwidth" type="ST_StrokeArrowWidth" use="optional"/>
|
||||
<xsd:attribute name="endarrowlength" type="ST_StrokeArrowLength" use="optional"/>
|
||||
<xsd:attribute ref="o:href"/>
|
||||
<xsd:attribute ref="o:althref"/>
|
||||
<xsd:attribute ref="o:title"/>
|
||||
<xsd:attribute ref="o:forcedash"/>
|
||||
<xsd:attribute ref="r:id" use="optional"/>
|
||||
<xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute ref="o:relid"/>
|
||||
</xsd:attributeGroup>
|
||||
<xsd:group name="EG_ShapeElements">
|
||||
<xsd:choice>
|
||||
<xsd:element ref="path"/>
|
||||
<xsd:element ref="formulas"/>
|
||||
<xsd:element ref="handles"/>
|
||||
<xsd:element ref="fill"/>
|
||||
<xsd:element ref="stroke"/>
|
||||
<xsd:element ref="shadow"/>
|
||||
<xsd:element ref="textbox"/>
|
||||
<xsd:element ref="textpath"/>
|
||||
<xsd:element ref="imagedata"/>
|
||||
<xsd:element ref="o:skew"/>
|
||||
<xsd:element ref="o:extrusion"/>
|
||||
<xsd:element ref="o:callout"/>
|
||||
<xsd:element ref="o:lock"/>
|
||||
<xsd:element ref="o:clippath"/>
|
||||
<xsd:element ref="o:signatureline"/>
|
||||
<xsd:element ref="w10:wrap"/>
|
||||
<xsd:element ref="w10:anchorlock"/>
|
||||
<xsd:element ref="w10:bordertop"/>
|
||||
<xsd:element ref="w10:borderbottom"/>
|
||||
<xsd:element ref="w10:borderleft"/>
|
||||
<xsd:element ref="w10:borderright"/>
|
||||
<xsd:element ref="x:ClientData" minOccurs="0"/>
|
||||
<xsd:element ref="pvml:textdata" minOccurs="0"/>
|
||||
</xsd:choice>
|
||||
</xsd:group>
|
||||
<xsd:element name="shape" type="CT_Shape"/>
|
||||
<xsd:element name="shapetype" type="CT_Shapetype"/>
|
||||
<xsd:element name="group" type="CT_Group"/>
|
||||
<xsd:element name="background" type="CT_Background"/>
|
||||
<xsd:complexType name="CT_Shape">
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:group ref="EG_ShapeElements"/>
|
||||
<xsd:element ref="o:ink"/>
|
||||
<xsd:element ref="pvml:iscomment"/>
|
||||
<xsd:element ref="o:equationxml"/>
|
||||
</xsd:choice>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_Type"/>
|
||||
<xsd:attributeGroup ref="AG_Adj"/>
|
||||
<xsd:attributeGroup ref="AG_Path"/>
|
||||
<xsd:attribute ref="o:gfxdata"/>
|
||||
<xsd:attribute name="equationxml" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Shapetype">
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xsd:element ref="o:complex" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_Adj"/>
|
||||
<xsd:attributeGroup ref="AG_Path"/>
|
||||
<xsd:attribute ref="o:master"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Group">
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:group ref="EG_ShapeElements"/>
|
||||
<xsd:element ref="group"/>
|
||||
<xsd:element ref="shape"/>
|
||||
<xsd:element ref="shapetype"/>
|
||||
<xsd:element ref="arc"/>
|
||||
<xsd:element ref="curve"/>
|
||||
<xsd:element ref="image"/>
|
||||
<xsd:element ref="line"/>
|
||||
<xsd:element ref="oval"/>
|
||||
<xsd:element ref="polyline"/>
|
||||
<xsd:element ref="rect"/>
|
||||
<xsd:element ref="roundrect"/>
|
||||
<xsd:element ref="o:diagram"/>
|
||||
</xsd:choice>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_Fill"/>
|
||||
<xsd:attribute name="editas" type="ST_EditAs" use="optional"/>
|
||||
<xsd:attribute ref="o:tableproperties"/>
|
||||
<xsd:attribute ref="o:tablelimits"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Background">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="fill" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attributeGroup ref="AG_Fill"/>
|
||||
<xsd:attribute ref="o:bwmode"/>
|
||||
<xsd:attribute ref="o:bwpure"/>
|
||||
<xsd:attribute ref="o:bwnormal"/>
|
||||
<xsd:attribute ref="o:targetscreensize"/>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="fill" type="CT_Fill"/>
|
||||
<xsd:element name="formulas" type="CT_Formulas"/>
|
||||
<xsd:element name="handles" type="CT_Handles"/>
|
||||
<xsd:element name="imagedata" type="CT_ImageData"/>
|
||||
<xsd:element name="path" type="CT_Path"/>
|
||||
<xsd:element name="textbox" type="CT_Textbox"/>
|
||||
<xsd:element name="shadow" type="CT_Shadow"/>
|
||||
<xsd:element name="stroke" type="CT_Stroke"/>
|
||||
<xsd:element name="textpath" type="CT_TextPath"/>
|
||||
<xsd:complexType name="CT_Fill">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="o:fill" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attribute name="type" type="ST_FillType" use="optional"/>
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute ref="o:href"/>
|
||||
<xsd:attribute ref="o:althref"/>
|
||||
<xsd:attribute name="size" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="origin" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="position" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="aspect" type="ST_ImageAspect" use="optional"/>
|
||||
<xsd:attribute name="colors" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="angle" type="xsd:decimal" use="optional"/>
|
||||
<xsd:attribute name="alignshape" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="focus" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="focussize" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="focusposition" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="method" type="ST_FillMethod" use="optional"/>
|
||||
<xsd:attribute ref="o:detectmouseclick"/>
|
||||
<xsd:attribute ref="o:title"/>
|
||||
<xsd:attribute ref="o:opacity2"/>
|
||||
<xsd:attribute name="recolor" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="rotate" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute ref="r:id" use="optional"/>
|
||||
<xsd:attribute ref="o:relid" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Formulas">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="f" type="CT_F" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_F">
|
||||
<xsd:attribute name="eqn" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Handles">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="h" type="CT_H" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_H">
|
||||
<xsd:attribute name="position" type="xsd:string"/>
|
||||
<xsd:attribute name="polar" type="xsd:string"/>
|
||||
<xsd:attribute name="map" type="xsd:string"/>
|
||||
<xsd:attribute name="invx" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="invy" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="switch" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:attribute name="xrange" type="xsd:string"/>
|
||||
<xsd:attribute name="yrange" type="xsd:string"/>
|
||||
<xsd:attribute name="radiusrange" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_ImageData">
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attributeGroup ref="AG_ImageAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_Chromakey"/>
|
||||
<xsd:attribute name="embosscolor" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="recolortarget" type="s:ST_ColorType"/>
|
||||
<xsd:attribute ref="o:href"/>
|
||||
<xsd:attribute ref="o:althref"/>
|
||||
<xsd:attribute ref="o:title"/>
|
||||
<xsd:attribute ref="o:oleid"/>
|
||||
<xsd:attribute ref="o:detectmouseclick"/>
|
||||
<xsd:attribute ref="o:movie"/>
|
||||
<xsd:attribute ref="o:relid"/>
|
||||
<xsd:attribute ref="r:id"/>
|
||||
<xsd:attribute ref="r:pict"/>
|
||||
<xsd:attribute ref="r:href"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Path">
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attribute name="v" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="limo" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="textboxrect" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="fillok" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="strokeok" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="shadowok" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="arrowok" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="gradientshapeok" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="textpathok" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="insetpenok" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute ref="o:connecttype"/>
|
||||
<xsd:attribute ref="o:connectlocs"/>
|
||||
<xsd:attribute ref="o:connectangles"/>
|
||||
<xsd:attribute ref="o:extrusionok"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Shadow">
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="type" type="ST_ShadowType" use="optional"/>
|
||||
<xsd:attribute name="obscured" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="offset" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="offset2" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="origin" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="matrix" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Stroke">
|
||||
<xsd:sequence>
|
||||
<xsd:element ref="o:left" minOccurs="0"/>
|
||||
<xsd:element ref="o:top" minOccurs="0"/>
|
||||
<xsd:element ref="o:right" minOccurs="0"/>
|
||||
<xsd:element ref="o:bottom" minOccurs="0"/>
|
||||
<xsd:element ref="o:column" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attributeGroup ref="AG_StrokeAttributes"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Textbox">
|
||||
<xsd:choice>
|
||||
<xsd:element ref="w:txbxContent" minOccurs="0"/>
|
||||
<xsd:any namespace="##local" processContents="skip"/>
|
||||
</xsd:choice>
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attributeGroup ref="AG_Style"/>
|
||||
<xsd:attribute name="inset" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute ref="o:singleclick"/>
|
||||
<xsd:attribute ref="o:insetmode"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_TextPath">
|
||||
<xsd:attributeGroup ref="AG_Id"/>
|
||||
<xsd:attributeGroup ref="AG_Style"/>
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="fitshape" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="fitpath" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="trim" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="xscale" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="string" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="arc" type="CT_Arc"/>
|
||||
<xsd:element name="curve" type="CT_Curve"/>
|
||||
<xsd:element name="image" type="CT_Image"/>
|
||||
<xsd:element name="line" type="CT_Line"/>
|
||||
<xsd:element name="oval" type="CT_Oval"/>
|
||||
<xsd:element name="polyline" type="CT_PolyLine"/>
|
||||
<xsd:element name="rect" type="CT_Rect"/>
|
||||
<xsd:element name="roundrect" type="CT_RoundRect"/>
|
||||
<xsd:complexType name="CT_Arc">
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attribute name="startAngle" type="xsd:decimal" use="optional"/>
|
||||
<xsd:attribute name="endAngle" type="xsd:decimal" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Curve">
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attribute name="from" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="control1" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="control2" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="to" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Image">
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_ImageAttributes"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Line">
|
||||
<xsd:sequence>
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attribute name="from" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="to" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Oval">
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:choice>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_PolyLine">
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:group ref="EG_ShapeElements"/>
|
||||
<xsd:element ref="o:ink"/>
|
||||
</xsd:choice>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attribute name="points" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Rect">
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:choice>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_RoundRect">
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:choice>
|
||||
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||
<xsd:attribute name="arcsize" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_Ext">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="view"/>
|
||||
<xsd:enumeration value="edit"/>
|
||||
<xsd:enumeration value="backwardCompatible"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_FillType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="solid"/>
|
||||
<xsd:enumeration value="gradient"/>
|
||||
<xsd:enumeration value="gradientRadial"/>
|
||||
<xsd:enumeration value="tile"/>
|
||||
<xsd:enumeration value="pattern"/>
|
||||
<xsd:enumeration value="frame"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_FillMethod">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="none"/>
|
||||
<xsd:enumeration value="linear"/>
|
||||
<xsd:enumeration value="sigma"/>
|
||||
<xsd:enumeration value="any"/>
|
||||
<xsd:enumeration value="linear sigma"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ShadowType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="single"/>
|
||||
<xsd:enumeration value="double"/>
|
||||
<xsd:enumeration value="emboss"/>
|
||||
<xsd:enumeration value="perspective"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_StrokeLineStyle">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="single"/>
|
||||
<xsd:enumeration value="thinThin"/>
|
||||
<xsd:enumeration value="thinThick"/>
|
||||
<xsd:enumeration value="thickThin"/>
|
||||
<xsd:enumeration value="thickBetweenThin"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_StrokeJoinStyle">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="round"/>
|
||||
<xsd:enumeration value="bevel"/>
|
||||
<xsd:enumeration value="miter"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_StrokeEndCap">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="flat"/>
|
||||
<xsd:enumeration value="square"/>
|
||||
<xsd:enumeration value="round"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_StrokeArrowLength">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="short"/>
|
||||
<xsd:enumeration value="medium"/>
|
||||
<xsd:enumeration value="long"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_StrokeArrowWidth">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="narrow"/>
|
||||
<xsd:enumeration value="medium"/>
|
||||
<xsd:enumeration value="wide"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_StrokeArrowType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="none"/>
|
||||
<xsd:enumeration value="block"/>
|
||||
<xsd:enumeration value="classic"/>
|
||||
<xsd:enumeration value="oval"/>
|
||||
<xsd:enumeration value="diamond"/>
|
||||
<xsd:enumeration value="open"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ImageAspect">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="ignore"/>
|
||||
<xsd:enumeration value="atMost"/>
|
||||
<xsd:enumeration value="atLeast"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_EditAs">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="canvas"/>
|
||||
<xsd:enumeration value="orgchart"/>
|
||||
<xsd:enumeration value="radial"/>
|
||||
<xsd:enumeration value="cycle"/>
|
||||
<xsd:enumeration value="stacked"/>
|
||||
<xsd:enumeration value="venn"/>
|
||||
<xsd:enumeration value="bullseye"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,509 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml"
|
||||
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
targetNamespace="urn:schemas-microsoft-com:office:office" elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
<xsd:import namespace="urn:schemas-microsoft-com:vml" schemaLocation="vml-main.xsd"/>
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||
schemaLocation="shared-relationshipReference.xsd"/>
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||
<xsd:attribute name="bwmode" type="ST_BWMode"/>
|
||||
<xsd:attribute name="bwpure" type="ST_BWMode"/>
|
||||
<xsd:attribute name="bwnormal" type="ST_BWMode"/>
|
||||
<xsd:attribute name="targetscreensize" type="ST_ScreenSize"/>
|
||||
<xsd:attribute name="insetmode" type="ST_InsetMode" default="custom"/>
|
||||
<xsd:attribute name="spt" type="xsd:float"/>
|
||||
<xsd:attribute name="wrapcoords" type="xsd:string"/>
|
||||
<xsd:attribute name="oned" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="regroupid" type="xsd:integer"/>
|
||||
<xsd:attribute name="doubleclicknotify" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="connectortype" type="ST_ConnectorType" default="straight"/>
|
||||
<xsd:attribute name="button" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="userhidden" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="forcedash" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="oleicon" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="ole" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:attribute name="preferrelative" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="cliptowrap" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="clip" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="bullet" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="hr" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="hrstd" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="hrnoshade" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="hrpct" type="xsd:float"/>
|
||||
<xsd:attribute name="hralign" type="ST_HrAlign" default="left"/>
|
||||
<xsd:attribute name="allowincell" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="allowoverlap" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="userdrawn" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="bordertopcolor" type="xsd:string"/>
|
||||
<xsd:attribute name="borderleftcolor" type="xsd:string"/>
|
||||
<xsd:attribute name="borderbottomcolor" type="xsd:string"/>
|
||||
<xsd:attribute name="borderrightcolor" type="xsd:string"/>
|
||||
<xsd:attribute name="connecttype" type="ST_ConnectType"/>
|
||||
<xsd:attribute name="connectlocs" type="xsd:string"/>
|
||||
<xsd:attribute name="connectangles" type="xsd:string"/>
|
||||
<xsd:attribute name="master" type="xsd:string"/>
|
||||
<xsd:attribute name="extrusionok" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="href" type="xsd:string"/>
|
||||
<xsd:attribute name="althref" type="xsd:string"/>
|
||||
<xsd:attribute name="title" type="xsd:string"/>
|
||||
<xsd:attribute name="singleclick" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="oleid" type="xsd:float"/>
|
||||
<xsd:attribute name="detectmouseclick" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="movie" type="xsd:float"/>
|
||||
<xsd:attribute name="spid" type="xsd:string"/>
|
||||
<xsd:attribute name="opacity2" type="xsd:string"/>
|
||||
<xsd:attribute name="relid" type="r:ST_RelationshipId"/>
|
||||
<xsd:attribute name="dgmlayout" type="ST_DiagramLayout"/>
|
||||
<xsd:attribute name="dgmnodekind" type="xsd:integer"/>
|
||||
<xsd:attribute name="dgmlayoutmru" type="ST_DiagramLayout"/>
|
||||
<xsd:attribute name="gfxdata" type="xsd:base64Binary"/>
|
||||
<xsd:attribute name="tableproperties" type="xsd:string"/>
|
||||
<xsd:attribute name="tablelimits" type="xsd:string"/>
|
||||
<xsd:element name="shapedefaults" type="CT_ShapeDefaults"/>
|
||||
<xsd:element name="shapelayout" type="CT_ShapeLayout"/>
|
||||
<xsd:element name="signatureline" type="CT_SignatureLine"/>
|
||||
<xsd:element name="ink" type="CT_Ink"/>
|
||||
<xsd:element name="diagram" type="CT_Diagram"/>
|
||||
<xsd:element name="equationxml" type="CT_EquationXml"/>
|
||||
<xsd:complexType name="CT_ShapeDefaults">
|
||||
<xsd:all minOccurs="0">
|
||||
<xsd:element ref="v:fill" minOccurs="0"/>
|
||||
<xsd:element ref="v:stroke" minOccurs="0"/>
|
||||
<xsd:element ref="v:textbox" minOccurs="0"/>
|
||||
<xsd:element ref="v:shadow" minOccurs="0"/>
|
||||
<xsd:element ref="skew" minOccurs="0"/>
|
||||
<xsd:element ref="extrusion" minOccurs="0"/>
|
||||
<xsd:element ref="callout" minOccurs="0"/>
|
||||
<xsd:element ref="lock" minOccurs="0"/>
|
||||
<xsd:element name="colormru" minOccurs="0" type="CT_ColorMru"/>
|
||||
<xsd:element name="colormenu" minOccurs="0" type="CT_ColorMenu"/>
|
||||
</xsd:all>
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="spidmax" type="xsd:integer" use="optional"/>
|
||||
<xsd:attribute name="style" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="fill" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="fillcolor" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="stroke" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="strokecolor" type="s:ST_ColorType"/>
|
||||
<xsd:attribute name="allowincell" form="qualified" type="s:ST_TrueFalse"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Ink">
|
||||
<xsd:sequence/>
|
||||
<xsd:attribute name="i" type="xsd:string"/>
|
||||
<xsd:attribute name="annotation" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="contentType" type="ST_ContentType" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_SignatureLine">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="issignatureline" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="id" type="s:ST_Guid"/>
|
||||
<xsd:attribute name="provid" type="s:ST_Guid"/>
|
||||
<xsd:attribute name="signinginstructionsset" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="allowcomments" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="showsigndate" type="s:ST_TrueFalse"/>
|
||||
<xsd:attribute name="suggestedsigner" type="xsd:string" form="qualified"/>
|
||||
<xsd:attribute name="suggestedsigner2" type="xsd:string" form="qualified"/>
|
||||
<xsd:attribute name="suggestedsigneremail" type="xsd:string" form="qualified"/>
|
||||
<xsd:attribute name="signinginstructions" type="xsd:string"/>
|
||||
<xsd:attribute name="addlxml" type="xsd:string"/>
|
||||
<xsd:attribute name="sigprovurl" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_ShapeLayout">
|
||||
<xsd:all>
|
||||
<xsd:element name="idmap" type="CT_IdMap" minOccurs="0"/>
|
||||
<xsd:element name="regrouptable" type="CT_RegroupTable" minOccurs="0"/>
|
||||
<xsd:element name="rules" type="CT_Rules" minOccurs="0"/>
|
||||
</xsd:all>
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_IdMap">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="data" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_RegroupTable">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="entry" type="CT_Entry" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Entry">
|
||||
<xsd:attribute name="new" type="xsd:int" use="optional"/>
|
||||
<xsd:attribute name="old" type="xsd:int" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Rules">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="r" type="CT_R" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_R">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="proxy" type="CT_Proxy" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="id" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="type" type="ST_RType" use="optional"/>
|
||||
<xsd:attribute name="how" type="ST_How" use="optional"/>
|
||||
<xsd:attribute name="idref" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Proxy">
|
||||
<xsd:attribute name="start" type="s:ST_TrueFalseBlank" use="optional" default="false"/>
|
||||
<xsd:attribute name="end" type="s:ST_TrueFalseBlank" use="optional" default="false"/>
|
||||
<xsd:attribute name="idref" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="connectloc" type="xsd:int" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Diagram">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="relationtable" type="CT_RelationTable" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="dgmstyle" type="xsd:integer" use="optional"/>
|
||||
<xsd:attribute name="autoformat" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="reverse" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="autolayout" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="dgmscalex" type="xsd:integer" use="optional"/>
|
||||
<xsd:attribute name="dgmscaley" type="xsd:integer" use="optional"/>
|
||||
<xsd:attribute name="dgmfontsize" type="xsd:integer" use="optional"/>
|
||||
<xsd:attribute name="constrainbounds" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="dgmbasetextscale" type="xsd:integer" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_EquationXml">
|
||||
<xsd:sequence>
|
||||
<xsd:any namespace="##any"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="contentType" type="ST_AlternateMathContentType" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_AlternateMathContentType">
|
||||
<xsd:restriction base="xsd:string"/>
|
||||
</xsd:simpleType>
|
||||
<xsd:complexType name="CT_RelationTable">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="rel" type="CT_Relation" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Relation">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="idsrc" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="iddest" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="idcntr" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_ColorMru">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="colors" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_ColorMenu">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="strokecolor" type="s:ST_ColorType"/>
|
||||
<xsd:attribute name="fillcolor" type="s:ST_ColorType"/>
|
||||
<xsd:attribute name="shadowcolor" type="s:ST_ColorType"/>
|
||||
<xsd:attribute name="extrusioncolor" type="s:ST_ColorType"/>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="skew" type="CT_Skew"/>
|
||||
<xsd:element name="extrusion" type="CT_Extrusion"/>
|
||||
<xsd:element name="callout" type="CT_Callout"/>
|
||||
<xsd:element name="lock" type="CT_Lock"/>
|
||||
<xsd:element name="OLEObject" type="CT_OLEObject"/>
|
||||
<xsd:element name="complex" type="CT_Complex"/>
|
||||
<xsd:element name="left" type="CT_StrokeChild"/>
|
||||
<xsd:element name="top" type="CT_StrokeChild"/>
|
||||
<xsd:element name="right" type="CT_StrokeChild"/>
|
||||
<xsd:element name="bottom" type="CT_StrokeChild"/>
|
||||
<xsd:element name="column" type="CT_StrokeChild"/>
|
||||
<xsd:element name="clippath" type="CT_ClipPath"/>
|
||||
<xsd:element name="fill" type="CT_Fill"/>
|
||||
<xsd:complexType name="CT_Skew">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="id" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="offset" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="origin" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="matrix" type="xsd:string" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Extrusion">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="type" type="ST_ExtrusionType" default="parallel" use="optional"/>
|
||||
<xsd:attribute name="render" type="ST_ExtrusionRender" default="solid" use="optional"/>
|
||||
<xsd:attribute name="viewpointorigin" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="viewpoint" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="plane" type="ST_ExtrusionPlane" default="XY" use="optional"/>
|
||||
<xsd:attribute name="skewangle" type="xsd:float" use="optional"/>
|
||||
<xsd:attribute name="skewamt" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="foredepth" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="backdepth" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="orientation" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="orientationangle" type="xsd:float" use="optional"/>
|
||||
<xsd:attribute name="lockrotationcenter" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="autorotationcenter" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="rotationcenter" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="rotationangle" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="colormode" type="ST_ColorMode" use="optional"/>
|
||||
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="shininess" type="xsd:float" use="optional"/>
|
||||
<xsd:attribute name="specularity" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="diffusity" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="metal" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="edge" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="facet" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="lightface" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="brightness" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="lightposition" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="lightlevel" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="lightharsh" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="lightposition2" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="lightlevel2" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="lightharsh2" type="s:ST_TrueFalse" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Callout">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="type" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="gap" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="angle" type="ST_Angle" use="optional"/>
|
||||
<xsd:attribute name="dropauto" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="drop" type="ST_CalloutDrop" use="optional"/>
|
||||
<xsd:attribute name="distance" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="lengthspecified" type="s:ST_TrueFalse" default="f" use="optional"/>
|
||||
<xsd:attribute name="length" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="accentbar" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="textborder" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="minusx" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="minusy" type="s:ST_TrueFalse" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Lock">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="position" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="selection" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="grouping" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="ungrouping" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="rotation" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="cropping" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="verticies" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="adjusthandles" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="text" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="aspectratio" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="shapetype" type="s:ST_TrueFalse" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_OLEObject">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="LinkType" type="ST_OLELinkType" minOccurs="0"/>
|
||||
<xsd:element name="LockedField" type="s:ST_TrueFalseBlank" minOccurs="0"/>
|
||||
<xsd:element name="FieldCodes" type="xsd:string" minOccurs="0"/>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="Type" type="ST_OLEType" use="optional"/>
|
||||
<xsd:attribute name="ProgID" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="ShapeID" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="DrawAspect" type="ST_OLEDrawAspect" use="optional"/>
|
||||
<xsd:attribute name="ObjectID" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute ref="r:id" use="optional"/>
|
||||
<xsd:attribute name="UpdateMode" type="ST_OLEUpdateMode" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Complex">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_StrokeChild">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="weight" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="linestyle" type="v:ST_StrokeLineStyle" use="optional"/>
|
||||
<xsd:attribute name="miterlimit" type="xsd:decimal" use="optional"/>
|
||||
<xsd:attribute name="joinstyle" type="v:ST_StrokeJoinStyle" use="optional"/>
|
||||
<xsd:attribute name="endcap" type="v:ST_StrokeEndCap" use="optional"/>
|
||||
<xsd:attribute name="dashstyle" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="filltype" type="v:ST_FillType" use="optional"/>
|
||||
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="imageaspect" type="v:ST_ImageAspect" use="optional"/>
|
||||
<xsd:attribute name="imagesize" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="imagealignshape" type="s:ST_TrueFalse" use="optional"/>
|
||||
<xsd:attribute name="startarrow" type="v:ST_StrokeArrowType" use="optional"/>
|
||||
<xsd:attribute name="startarrowwidth" type="v:ST_StrokeArrowWidth" use="optional"/>
|
||||
<xsd:attribute name="startarrowlength" type="v:ST_StrokeArrowLength" use="optional"/>
|
||||
<xsd:attribute name="endarrow" type="v:ST_StrokeArrowType" use="optional"/>
|
||||
<xsd:attribute name="endarrowwidth" type="v:ST_StrokeArrowWidth" use="optional"/>
|
||||
<xsd:attribute name="endarrowlength" type="v:ST_StrokeArrowLength" use="optional"/>
|
||||
<xsd:attribute ref="href"/>
|
||||
<xsd:attribute ref="althref"/>
|
||||
<xsd:attribute ref="title"/>
|
||||
<xsd:attribute ref="forcedash"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_ClipPath">
|
||||
<xsd:attribute name="v" type="xsd:string" use="required" form="qualified"/>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="CT_Fill">
|
||||
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||
<xsd:attribute name="type" type="ST_FillType"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_RType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="arc"/>
|
||||
<xsd:enumeration value="callout"/>
|
||||
<xsd:enumeration value="connector"/>
|
||||
<xsd:enumeration value="align"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_How">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="top"/>
|
||||
<xsd:enumeration value="middle"/>
|
||||
<xsd:enumeration value="bottom"/>
|
||||
<xsd:enumeration value="left"/>
|
||||
<xsd:enumeration value="center"/>
|
||||
<xsd:enumeration value="right"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_BWMode">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="color"/>
|
||||
<xsd:enumeration value="auto"/>
|
||||
<xsd:enumeration value="grayScale"/>
|
||||
<xsd:enumeration value="lightGrayscale"/>
|
||||
<xsd:enumeration value="inverseGray"/>
|
||||
<xsd:enumeration value="grayOutline"/>
|
||||
<xsd:enumeration value="highContrast"/>
|
||||
<xsd:enumeration value="black"/>
|
||||
<xsd:enumeration value="white"/>
|
||||
<xsd:enumeration value="hide"/>
|
||||
<xsd:enumeration value="undrawn"/>
|
||||
<xsd:enumeration value="blackTextAndLines"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ScreenSize">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="544,376"/>
|
||||
<xsd:enumeration value="640,480"/>
|
||||
<xsd:enumeration value="720,512"/>
|
||||
<xsd:enumeration value="800,600"/>
|
||||
<xsd:enumeration value="1024,768"/>
|
||||
<xsd:enumeration value="1152,862"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_InsetMode">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="auto"/>
|
||||
<xsd:enumeration value="custom"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ColorMode">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="auto"/>
|
||||
<xsd:enumeration value="custom"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ContentType">
|
||||
<xsd:restriction base="xsd:string"/>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_DiagramLayout">
|
||||
<xsd:restriction base="xsd:integer">
|
||||
<xsd:enumeration value="0"/>
|
||||
<xsd:enumeration value="1"/>
|
||||
<xsd:enumeration value="2"/>
|
||||
<xsd:enumeration value="3"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ExtrusionType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="perspective"/>
|
||||
<xsd:enumeration value="parallel"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ExtrusionRender">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="solid"/>
|
||||
<xsd:enumeration value="wireFrame"/>
|
||||
<xsd:enumeration value="boundingCube"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ExtrusionPlane">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="XY"/>
|
||||
<xsd:enumeration value="ZX"/>
|
||||
<xsd:enumeration value="YZ"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_Angle">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="any"/>
|
||||
<xsd:enumeration value="30"/>
|
||||
<xsd:enumeration value="45"/>
|
||||
<xsd:enumeration value="60"/>
|
||||
<xsd:enumeration value="90"/>
|
||||
<xsd:enumeration value="auto"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_CalloutDrop">
|
||||
<xsd:restriction base="xsd:string"/>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_CalloutPlacement">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="top"/>
|
||||
<xsd:enumeration value="center"/>
|
||||
<xsd:enumeration value="bottom"/>
|
||||
<xsd:enumeration value="user"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ConnectorType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="none"/>
|
||||
<xsd:enumeration value="straight"/>
|
||||
<xsd:enumeration value="elbow"/>
|
||||
<xsd:enumeration value="curved"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_HrAlign">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="left"/>
|
||||
<xsd:enumeration value="right"/>
|
||||
<xsd:enumeration value="center"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ConnectType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="none"/>
|
||||
<xsd:enumeration value="rect"/>
|
||||
<xsd:enumeration value="segments"/>
|
||||
<xsd:enumeration value="custom"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_OLELinkType">
|
||||
<xsd:restriction base="xsd:string"/>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_OLEType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="Embed"/>
|
||||
<xsd:enumeration value="Link"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_OLEDrawAspect">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="Content"/>
|
||||
<xsd:enumeration value="Icon"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_OLEUpdateMode">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="Always"/>
|
||||
<xsd:enumeration value="OnCall"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_FillType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="gradientCenter"/>
|
||||
<xsd:enumeration value="solid"/>
|
||||
<xsd:enumeration value="pattern"/>
|
||||
<xsd:enumeration value="tile"/>
|
||||
<xsd:enumeration value="frame"/>
|
||||
<xsd:enumeration value="gradientUnscaled"/>
|
||||
<xsd:enumeration value="gradientRadial"/>
|
||||
<xsd:enumeration value="gradient"/>
|
||||
<xsd:enumeration value="background"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="urn:schemas-microsoft-com:office:powerpoint"
|
||||
targetNamespace="urn:schemas-microsoft-com:office:powerpoint" elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
<xsd:element name="iscomment" type="CT_Empty"/>
|
||||
<xsd:element name="textdata" type="CT_Rel"/>
|
||||
<xsd:complexType name="CT_Empty"/>
|
||||
<xsd:complexType name="CT_Rel">
|
||||
<xsd:attribute name="id" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="urn:schemas-microsoft-com:office:excel"
|
||||
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
targetNamespace="urn:schemas-microsoft-com:office:excel" elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||
<xsd:element name="ClientData" type="CT_ClientData"/>
|
||||
<xsd:complexType name="CT_ClientData">
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element name="MoveWithCells" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="SizeWithCells" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Anchor" type="xsd:string"/>
|
||||
<xsd:element name="Locked" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="DefaultSize" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="PrintObject" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Disabled" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="AutoFill" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="AutoLine" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="AutoPict" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="FmlaMacro" type="xsd:string"/>
|
||||
<xsd:element name="TextHAlign" type="xsd:string"/>
|
||||
<xsd:element name="TextVAlign" type="xsd:string"/>
|
||||
<xsd:element name="LockText" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="JustLastX" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="SecretEdit" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Default" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Help" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Cancel" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Dismiss" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Accel" type="xsd:integer"/>
|
||||
<xsd:element name="Accel2" type="xsd:integer"/>
|
||||
<xsd:element name="Row" type="xsd:integer"/>
|
||||
<xsd:element name="Column" type="xsd:integer"/>
|
||||
<xsd:element name="Visible" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="RowHidden" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="ColHidden" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="VTEdit" type="xsd:integer"/>
|
||||
<xsd:element name="MultiLine" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="VScroll" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="ValidIds" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="FmlaRange" type="xsd:string"/>
|
||||
<xsd:element name="WidthMin" type="xsd:integer"/>
|
||||
<xsd:element name="Sel" type="xsd:integer"/>
|
||||
<xsd:element name="NoThreeD2" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="SelType" type="xsd:string"/>
|
||||
<xsd:element name="MultiSel" type="xsd:string"/>
|
||||
<xsd:element name="LCT" type="xsd:string"/>
|
||||
<xsd:element name="ListItem" type="xsd:string"/>
|
||||
<xsd:element name="DropStyle" type="xsd:string"/>
|
||||
<xsd:element name="Colored" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="DropLines" type="xsd:integer"/>
|
||||
<xsd:element name="Checked" type="xsd:integer"/>
|
||||
<xsd:element name="FmlaLink" type="xsd:string"/>
|
||||
<xsd:element name="FmlaPict" type="xsd:string"/>
|
||||
<xsd:element name="NoThreeD" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="FirstButton" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="FmlaGroup" type="xsd:string"/>
|
||||
<xsd:element name="Val" type="xsd:integer"/>
|
||||
<xsd:element name="Min" type="xsd:integer"/>
|
||||
<xsd:element name="Max" type="xsd:integer"/>
|
||||
<xsd:element name="Inc" type="xsd:integer"/>
|
||||
<xsd:element name="Page" type="xsd:integer"/>
|
||||
<xsd:element name="Horiz" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="Dx" type="xsd:integer"/>
|
||||
<xsd:element name="MapOCX" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="CF" type="ST_CF"/>
|
||||
<xsd:element name="Camera" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="RecalcAlways" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="AutoScale" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="DDE" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="UIObj" type="s:ST_TrueFalseBlank"/>
|
||||
<xsd:element name="ScriptText" type="xsd:string"/>
|
||||
<xsd:element name="ScriptExtended" type="xsd:string"/>
|
||||
<xsd:element name="ScriptLanguage" type="xsd:nonNegativeInteger"/>
|
||||
<xsd:element name="ScriptLocation" type="xsd:nonNegativeInteger"/>
|
||||
<xsd:element name="FmlaTxbx" type="xsd:string"/>
|
||||
</xsd:choice>
|
||||
<xsd:attribute name="ObjectType" type="ST_ObjectType" use="required"/>
|
||||
</xsd:complexType>
|
||||
<xsd:simpleType name="ST_CF">
|
||||
<xsd:restriction base="xsd:string"/>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_ObjectType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="Button"/>
|
||||
<xsd:enumeration value="Checkbox"/>
|
||||
<xsd:enumeration value="Dialog"/>
|
||||
<xsd:enumeration value="Drop"/>
|
||||
<xsd:enumeration value="Edit"/>
|
||||
<xsd:enumeration value="GBox"/>
|
||||
<xsd:enumeration value="Label"/>
|
||||
<xsd:enumeration value="LineA"/>
|
||||
<xsd:enumeration value="List"/>
|
||||
<xsd:enumeration value="Movie"/>
|
||||
<xsd:enumeration value="Note"/>
|
||||
<xsd:enumeration value="Pict"/>
|
||||
<xsd:enumeration value="Radio"/>
|
||||
<xsd:enumeration value="RectA"/>
|
||||
<xsd:enumeration value="Scroll"/>
|
||||
<xsd:enumeration value="Spin"/>
|
||||
<xsd:enumeration value="Shape"/>
|
||||
<xsd:enumeration value="Group"/>
|
||||
<xsd:enumeration value="Rect"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns="urn:schemas-microsoft-com:office:word"
|
||||
targetNamespace="urn:schemas-microsoft-com:office:word" elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified">
|
||||
<xsd:element name="bordertop" type="CT_Border"/>
|
||||
<xsd:element name="borderleft" type="CT_Border"/>
|
||||
<xsd:element name="borderright" type="CT_Border"/>
|
||||
<xsd:element name="borderbottom" type="CT_Border"/>
|
||||
<xsd:complexType name="CT_Border">
|
||||
<xsd:attribute name="type" type="ST_BorderType" use="optional"/>
|
||||
<xsd:attribute name="width" type="xsd:positiveInteger" use="optional"/>
|
||||
<xsd:attribute name="shadow" type="ST_BorderShadow" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="wrap" type="CT_Wrap"/>
|
||||
<xsd:complexType name="CT_Wrap">
|
||||
<xsd:attribute name="type" type="ST_WrapType" use="optional"/>
|
||||
<xsd:attribute name="side" type="ST_WrapSide" use="optional"/>
|
||||
<xsd:attribute name="anchorx" type="ST_HorizontalAnchor" use="optional"/>
|
||||
<xsd:attribute name="anchory" type="ST_VerticalAnchor" use="optional"/>
|
||||
</xsd:complexType>
|
||||
<xsd:element name="anchorlock" type="CT_AnchorLock"/>
|
||||
<xsd:complexType name="CT_AnchorLock"/>
|
||||
<xsd:simpleType name="ST_BorderType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="none"/>
|
||||
<xsd:enumeration value="single"/>
|
||||
<xsd:enumeration value="thick"/>
|
||||
<xsd:enumeration value="double"/>
|
||||
<xsd:enumeration value="hairline"/>
|
||||
<xsd:enumeration value="dot"/>
|
||||
<xsd:enumeration value="dash"/>
|
||||
<xsd:enumeration value="dotDash"/>
|
||||
<xsd:enumeration value="dashDotDot"/>
|
||||
<xsd:enumeration value="triple"/>
|
||||
<xsd:enumeration value="thinThickSmall"/>
|
||||
<xsd:enumeration value="thickThinSmall"/>
|
||||
<xsd:enumeration value="thickBetweenThinSmall"/>
|
||||
<xsd:enumeration value="thinThick"/>
|
||||
<xsd:enumeration value="thickThin"/>
|
||||
<xsd:enumeration value="thickBetweenThin"/>
|
||||
<xsd:enumeration value="thinThickLarge"/>
|
||||
<xsd:enumeration value="thickThinLarge"/>
|
||||
<xsd:enumeration value="thickBetweenThinLarge"/>
|
||||
<xsd:enumeration value="wave"/>
|
||||
<xsd:enumeration value="doubleWave"/>
|
||||
<xsd:enumeration value="dashedSmall"/>
|
||||
<xsd:enumeration value="dashDotStroked"/>
|
||||
<xsd:enumeration value="threeDEmboss"/>
|
||||
<xsd:enumeration value="threeDEngrave"/>
|
||||
<xsd:enumeration value="HTMLOutset"/>
|
||||
<xsd:enumeration value="HTMLInset"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_BorderShadow">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="t"/>
|
||||
<xsd:enumeration value="true"/>
|
||||
<xsd:enumeration value="f"/>
|
||||
<xsd:enumeration value="false"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_WrapType">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="topAndBottom"/>
|
||||
<xsd:enumeration value="square"/>
|
||||
<xsd:enumeration value="none"/>
|
||||
<xsd:enumeration value="tight"/>
|
||||
<xsd:enumeration value="through"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_WrapSide">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="both"/>
|
||||
<xsd:enumeration value="left"/>
|
||||
<xsd:enumeration value="right"/>
|
||||
<xsd:enumeration value="largest"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_HorizontalAnchor">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="margin"/>
|
||||
<xsd:enumeration value="page"/>
|
||||
<xsd:enumeration value="text"/>
|
||||
<xsd:enumeration value="char"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<xsd:simpleType name="ST_VerticalAnchor">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="margin"/>
|
||||
<xsd:enumeration value="page"/>
|
||||
<xsd:enumeration value="text"/>
|
||||
<xsd:enumeration value="line"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user