Merge remote-tracking branch 'origin/main'

# Conflicts:
#	.claude-plugin/marketplace.json
#	.gitignore
#	acidaos/skills/devops/SKILL.md
#	acidaos/skills/docs/SKILL.md
#	acidaos/skills/rust-dev/SKILL.md
#	acidaos/skills/spoke-dev/SKILL.md
#	automacao/agents/automation-lead.md
#	automacao/agents/mcp-protocol-developer.md
#	automacao/agents/n8n-automation-expert.md
#	automacao/skills/moloni-api/SKILL.md
#	automacao/skills/n8n/SKILL.md
#	core-tools/skills/_core/SKILL.md
#	core-tools/skills/agent-context-injector/SKILL.md
#	core-tools/skills/component-generator/SKILL.md
#	core-tools/skills/db-maintenance-manager/SKILL.md
#	core-tools/skills/infrastructure-manager/SKILL.md
#	core-tools/skills/metrics/SKILL.md
#	core-tools/skills/plugin-curator/SKILL.md
#	core-tools/skills/plugin-manager/SKILL.md
#	core-tools/skills/plugin-manager/profiles.json
#	core-tools/skills/quality-validator/SKILL.md
#	core-tools/skills/relationship-manager/SKILL.md
#	crm-ops/.claude-plugin/plugin.json
#	crm-ops/CHANGELOG.md
#	crm-ops/agents/budget-proposal-specialist.md
#	crm-ops/agents/lead-approach-strategist.md
#	crm-ops/agents/lead-qualifier.md
#	crm-ops/agents/sales-manager.md
#	crm-ops/agents/support-specialist.md
#	crm-ops/skills/auto-expense/SKILL.md
#	crm-ops/skills/billing-check/SKILL.md
#	crm-ops/skills/crm-admin/SKILL.md
#	crm-ops/skills/crm/SKILL.md
#	crm-ops/skills/desk/SKILL.md
#	crm-ops/skills/estrategia-marca/SKILL.md
#	crm-ops/skills/estrategia-marca/references/metodologia-acida.md
#	crm-ops/skills/estrategia-marca/references/template-documento.md
#	crm-ops/skills/expense/SKILL.md
#	crm-ops/skills/invoice/SKILL.md
#	crm-ops/skills/orcamento/SKILL-light.md
#	crm-ops/skills/orcamento/SKILL.md
#	crm-ops/skills/proposal-deck/SKILL.md
#	crm-ops/skills/proposta-visual/SKILL.md
#	crm-ops/skills/ticket-manage/SKILL.md
#	crm-ops/skills/ticket-triage/SKILL.md
#	crm-ops/skills/ticket/SKILL.md
#	design-media/agents/design-critic.md
#	design-media/agents/design-generator.md
#	design-media/agents/design-lead.md
#	design-media/agents/design-prompt-architect.md
#	design-media/agents/design-researcher.md
#	design-media/agents/ui-designer.md
#	design-media/agents/video-production-specialist.md
#	design-media/agents/web-designer.md
#	design-media/skills/brand-guidelines/SKILL.md
#	design-media/skills/brand-guidelines/references/descomplicar-theme.md
#	design-media/skills/cinematic-site/SKILL.md
#	design-media/skills/clone-style/SKILL.md
#	design-media/skills/design-b2b/SKILL.md
#	design-media/skills/design-ecommerce/SKILL.md
#	design-media/skills/design-saude/SKILL.md
#	design-media/skills/design-solar/SKILL.md
#	design-media/skills/design/SKILL.md
#	design-media/skills/design/references/premium-proposals.md
#	dev-tools/agents/database-design-specialist.md
#	dev-tools/agents/dev-helper.md
#	dev-tools/agents/development-lead.md
#	dev-tools/agents/javascript-fullstack-specialist.md
#	dev-tools/agents/nextjs-specialist.md
#	dev-tools/agents/php-fullstack-engineer.md
#	dev-tools/skills/benchmark/SKILL.md
#	dev-tools/skills/canary/SKILL.md
#	dev-tools/skills/chrome/SKILL.md
#	dev-tools/skills/db-design/SKILL.md
#	dev-tools/skills/dep-audit/SKILL.md
#	dev-tools/skills/diagrama/SKILL.md
#	dev-tools/skills/docx/SKILL-light.md
#	dev-tools/skills/docx/SKILL.md
#	dev-tools/skills/docx/scripts/__init__.py
#	dev-tools/skills/docx/scripts/office/pack.py
#	dev-tools/skills/docx/scripts/office/unpack.py
#	dev-tools/skills/docx/scripts/office/validate.py
#	dev-tools/skills/nextjs/SKILL.md
#	dev-tools/skills/pdf/SKILL-light.md
#	dev-tools/skills/pdf/SKILL.md
#	dev-tools/skills/php-dev/SKILL.md
#	dev-tools/skills/prompt-refine/SKILL.md
#	dev-tools/skills/react-patterns/SKILL.md
#	dev-tools/skills/skill-creator/SKILL.md
#	dev-tools/skills/skill-creator/references/descomplicar-standards.md
#	dev-tools/skills/webapp-testing/SKILL.md
#	dev-tools/skills/webapp-testing/scripts/with_server.py
#	dev-tools/skills/xlsx/SKILL.md
#	dev-tools/skills/xlsx/scripts/office/pack.py
#	dev-tools/skills/xlsx/scripts/office/unpack.py
#	dev-tools/skills/xlsx/scripts/office/validate.py
#	dev-tools/skills/youtube-extract/SKILL.md
#	gestao/.claude-plugin/plugin.json
#	gestao/agents/analytics-insights-agent.md
#	gestao/agents/compliance-auditor.md
#	gestao/agents/project-manager.md
#	gestao/agents/reflect-agent.md
#	gestao/agents/software-project-planner.md
#	gestao/agents/time-management-agent.md
#	gestao/agents/wiki-knowledge-agent.md
#	gestao/skills/aiktop-tasks/SKILL.md
#	gestao/skills/archive/SKILL.md
#	gestao/skills/calendar-manager/SKILL.md
#	gestao/skills/cleanup-downloads/SKILL.md
#	gestao/skills/clip-agent/SKILL.md
#	gestao/skills/clip-health/SKILL.md
#	gestao/skills/clip-instructions/SKILL.md
#	gestao/skills/clip-issue/SKILL.md
#	gestao/skills/clip-org/SKILL.md
#	gestao/skills/clip-routine/SKILL.md
#	gestao/skills/clip-skill/SKILL.md
#	gestao/skills/clip-vision/SKILL.md
#	gestao/skills/clip/SKILL.md
#	gestao/skills/daily-digest/SKILL.md
#	gestao/skills/deep-research/SKILL.md
#	gestao/skills/delegate/SKILL.md
#	gestao/skills/doc-coauthoring/SKILL.md
#	gestao/skills/dual-review/SKILL.md
#	gestao/skills/hub-compile/SKILL.md
#	gestao/skills/hub-search/SKILL.md
#	gestao/skills/imap-triage/SKILL.md
#	gestao/skills/index-update/SKILL.md
#	gestao/skills/knowledge/SKILL.md
#	gestao/skills/knowledge/docs/workflow.md
#	gestao/skills/knowledge/references/routing-guide.md
#	gestao/skills/mindmap/SKILL.md
#	gestao/skills/monday-briefing/SKILL.md
#	gestao/skills/notebooklm/SKILL.md
#	gestao/skills/office-hours/SKILL.md
#	gestao/skills/onboarding/SKILL.md
#	gestao/skills/proc-creator/SKILL.md
#	gestao/skills/reflect/SKILL.md
#	gestao/skills/report-templates/SKILL.md
#	gestao/skills/report/SKILL.md
#	gestao/skills/research-pipeline/SKILL.md
#	gestao/skills/review-corrections/SKILL.md
#	gestao/skills/spec-coauthor/SKILL.md
#	gestao/skills/task-state/SKILL.md
#	gestao/skills/tasks-overview/SKILL.md
#	gestao/skills/time/SKILL.md
#	gestao/skills/today/SETUP_MCPS.md
#	gestao/skills/today/SKILL.md
#	gestao/skills/today/prompts/execute.md
#	gestao/skills/today/templates/daily-report.md
#	gestao/skills/validate-component/SKILL.md
#	gestao/skills/worklog/SKILL.md
#	infraestrutura/.claude-plugin/plugin.json
#	infraestrutura/agents/backup-specialist.md
#	infraestrutura/agents/cwp-server-manager.md
#	infraestrutura/agents/easypanel-specialist.md
#	infraestrutura/agents/infrastructure-orchestrator.md
#	infraestrutura/agents/proxmox-specialist.md
#	infraestrutura/agents/security-compliance-specialist.md
#	infraestrutura/skills/authentik/SKILL.md
#	infraestrutura/skills/backup-strategies/SKILL.md
#	infraestrutura/skills/backup-strategies/references/scripts.md
#	infraestrutura/skills/cwp/SKILL.md
#	infraestrutura/skills/easypanel-api/SKILL.md
#	infraestrutura/skills/easypanel-cicd/SKILL.md
#	infraestrutura/skills/easypanel-deploy/SKILL.md
#	infraestrutura/skills/easypanel-init/SKILL.md
#	infraestrutura/skills/easypanel-monitor/SKILL.md
#	infraestrutura/skills/easypanel-rollback/SKILL.md
#	infraestrutura/skills/easypanel-troubleshoot/SKILL.md
#	infraestrutura/skills/easypanel-validate/SKILL.md
#	infraestrutura/skills/gateway-check/SKILL.md
#	infraestrutura/skills/infra-check/SKILL.md
#	infraestrutura/skills/mcp-dev/SKILL.md
#	infraestrutura/skills/mcp-dev/references/best-practices.md
#	infraestrutura/skills/mcp-dev/references/evaluation-guide.md
#	infraestrutura/skills/mcp-dev/references/templates.md
#	infraestrutura/skills/pbs-config/SKILL.md
#	infraestrutura/skills/proxmox-cluster/SKILL.md
#	infraestrutura/skills/proxmox-ha/SKILL.md
#	infraestrutura/skills/proxmox-setup/SKILL.md
#	infraestrutura/skills/security-audit/SKILL.md
#	infraestrutura/skills/security-check/SKILL.md
#	infraestrutura/skills/server-health/SKILL.md
#	infraestrutura/skills/vm-migration/SKILL.md
#	marketing/.claude-plugin/plugin.json
#	marketing/CHANGELOG.md
#	marketing/agents/content-manager.md
#	marketing/agents/copywriter.md
#	marketing/agents/marketing-planning-expert.md
#	marketing/agents/ppc-specialist.md
#	marketing/agents/seo-specialist.md
#	marketing/agents/social-media-manager.md
#	marketing/agents/video-production-specialist.md
#	marketing/agents/youtube-specialist.md
#	marketing/skills/ads/SKILL.md
#	marketing/skills/content-marketing-pt/SKILL.md
#	marketing/skills/lead-approach/SKILL.md
#	marketing/skills/marketing-strategy/SKILL.md
#	marketing/skills/seo-audit/SKILL.md
#	marketing/skills/seo-audit/references/ferramentas-api.md
#	marketing/skills/seo-audit/references/template-relatorio-auditoria.md
#	marketing/skills/seo-content-optimization/SKILL.md
#	marketing/skills/seo-content-optimization/references/structured-data.md
#	marketing/skills/seo-report/SKILL.md
#	marketing/skills/seo-report/references/implementacao-tecnica.md
#	marketing/skills/seo-report/references/template-relatorio.md
#	marketing/skills/social-media/SKILL.md
#	marketing/skills/trend-signal/SKILL.md
#	marketing/skills/video/SKILL.md
#	marketing/skills/video/rules/3d.md
#	marketing/skills/video/rules/animations.md
#	marketing/skills/video/rules/assets.md
#	marketing/skills/video/rules/audio.md
#	marketing/skills/video/rules/calculate-metadata.md
#	marketing/skills/video/rules/can-decode.md
#	marketing/skills/video/rules/charts.md
#	marketing/skills/video/rules/compositions.md
#	marketing/skills/video/rules/display-captions.md
#	marketing/skills/video/rules/extract-frames.md
#	marketing/skills/video/rules/fonts.md
#	marketing/skills/video/rules/get-audio-duration.md
#	marketing/skills/video/rules/get-video-dimensions.md
#	marketing/skills/video/rules/get-video-duration.md
#	marketing/skills/video/rules/gifs.md
#	marketing/skills/video/rules/images.md
#	marketing/skills/video/rules/import-srt-captions.md
#	marketing/skills/video/rules/lottie.md
#	marketing/skills/video/rules/maps.md
#	marketing/skills/video/rules/measuring-dom-nodes.md
#	marketing/skills/video/rules/measuring-text.md
#	marketing/skills/video/rules/parameters.md
#	marketing/skills/video/rules/sequencing.md
#	marketing/skills/video/rules/tailwind.md
#	marketing/skills/video/rules/text-animations.md
#	marketing/skills/video/rules/timing.md
#	marketing/skills/video/rules/transcribe-captions.md
#	marketing/skills/video/rules/transitions.md
#	marketing/skills/video/rules/trimming.md
#	marketing/skills/video/rules/videos.md
#	marketing/skills/youtube/SKILL.md
#	metabase/agents/metabase-analyst.md
#	metabase/skills/dashboard/SKILL.md
#	metabase/skills/metabase/SKILL.md
#	metabase/skills/query/SKILL.md
#	negocio/agents/ecommerce-architect.md
#	negocio/agents/finance-manager.md
#	negocio/agents/research-analyst.md
#	negocio/agents/saas-architect.md
#	negocio/skills/ecommerce/SKILL.md
#	negocio/skills/interview/SKILL.md
#	negocio/skills/product/SKILL.md
#	negocio/skills/research/SKILL.md
#	negocio/skills/saas/SKILL.md
#	perfex-dev/agents/perfex-crm-module-developer.md
#	perfex-dev/skills/perfex-controllers/SKILL.md
#	perfex-dev/skills/perfex-database/SKILL.md
#	perfex-dev/skills/perfex-forms/SKILL.md
#	perfex-dev/skills/perfex-hooks/SKILL.md
#	perfex-dev/skills/perfex-menus/SKILL.md
#	perfex-dev/skills/perfex-migrations/SKILL.md
#	perfex-dev/skills/perfex-module-basics/SKILL.md
#	perfex-dev/skills/perfex-permissions/SKILL.md
#	perfex-dev/skills/perfex-security/SKILL.md
#	perfex-dev/skills/perfex-views/SKILL.md
#	project-manager/.claude-plugin/plugin.json
#	project-manager/agents/scrum-master.md
#	project-manager/agents/spec-writer.md
#	project-manager/hooks/spec-gate.sh
#	project-manager/skills/brainstorm/SKILL.md
#	project-manager/skills/discover/SKILL.md
#	project-manager/skills/scope/SKILL.md
#	project-manager/skills/spec/SKILL.md
#	project-manager/skills/sprint/SKILL.md
#	project-manager/skills/status/SKILL.md
#	wordpress/.claude-plugin/plugin.json
#	wordpress/agents/elementor-specialist.md
#	wordpress/agents/woocommerce-specialist.md
#	wordpress/agents/wordpress-performance-specialist.md
#	wordpress/agents/wordpress-plugin-developer.md
#	wordpress/skills/branda-menu/SKILL.md
#	wordpress/skills/crocoblock/SKILL.md
#	wordpress/skills/elementor/SKILL.md
#	wordpress/skills/jetengine/SKILL.md
#	wordpress/skills/rank-math/SKILL.md
#	wordpress/skills/rank-math/references/commands.md
#	wordpress/skills/seo-post/SKILL.md
#	wordpress/skills/woocommerce-cli/SKILL.md
#	wordpress/skills/woocommerce/SKILL.md
#	wordpress/skills/wp-cli/SKILL.md
#	wordpress/skills/wp-cli/references/commands.md
#	wordpress/skills/wp-cli/scripts/wp-auto.sh
#	wordpress/skills/wp-dev/SKILL.md
#	wordpress/skills/wp-hardening/SKILL.md
#	wordpress/skills/wp-performance/SKILL.md
#	wordpress/skills/wp-translate/SKILL.md
#	wordpress/skills/wp-update/SKILL.md
This commit is contained in:
2026-10-28 16:11:16 +00:00
377 changed files with 36766 additions and 1824 deletions
-1
View File
@@ -1,7 +1,6 @@
---
name: docx
description: "Criação, edição e análise de documentos Word (.docx). Versão light para heartbeats."
layer: wiki
---
# DOCX — Referência Rápida
+381 -2
View File
@@ -1,7 +1,6 @@
---
name: docx
description: "Criacao, edicao e analise de documentos Word (.docx). Usar quando o utilizador mencionar \"Word\", \".docx\", ou pedir documentos profissionais com formatacao (indices, cabecalhos, numeracao de paginas, letterheads). Inclui extracao de conteudo, insercao/substituicao de imagens, find-and-replace, tracked changes, comentarios, e conversao de conteudo para Word. Aplica-se a relatorios, memorandos, cartas, templates e propostas em formato .docx. NAO usar para PDFs, folhas de calculo, Google Docs, ou tarefas de codigo nao relacionadas."
layer: wiki
---
# Criacao, edicao e analise de documentos DOCX
@@ -142,4 +141,384 @@ const doc = new Document({
```javascript
// ERRADO - nunca inserir caracteres de bullet manualmente
new Paragraph({ children: [new TextRun("* Item")] }) // MAU
new Paragraph({ children: [new TextRun("\u2022 Item")]
new Paragraph({ children: [new TextRun("\u2022 Item")] }) // MAU
// CORRECTO - usar config numbering com LevelFormat.BULLET
const doc = new Document({
numbering: {
config: [
{ reference: "bullets",
levels: [{ level: 0, format: LevelFormat.BULLET, text: "\u2022", alignment: AlignmentType.LEFT,
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
{ reference: "numbers",
levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
]
},
sections: [{
children: [
new Paragraph({ numbering: { reference: "bullets", level: 0 },
children: [new TextRun("Item com bullet")] }),
new Paragraph({ numbering: { reference: "numbers", level: 0 },
children: [new TextRun("Item numerado")] }),
]
}]
});
// ATENCAO: Cada reference cria numeracao INDEPENDENTE
// Mesma reference = continua (1,2,3 depois 4,5,6)
// Reference diferente = reinicia (1,2,3 depois 1,2,3)
```
### Tabelas
**CRITICO: Tabelas precisam de larguras duplas** - definir tanto `columnWidths` na tabela COMO `width` em cada celula. Sem ambos, tabelas renderizam incorrectamente em algumas plataformas.
```javascript
// CRITICO: Definir sempre largura da tabela para renderizacao consistente
// CRITICO: Usar ShadingType.CLEAR (nao SOLID) para evitar fundos pretos
const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
const borders = { top: border, bottom: border, left: border, right: border };
new Table({
width: { size: 9026, type: WidthType.DXA }, // Sempre usar DXA (percentagens quebram no Google Docs)
columnWidths: [4513, 4513], // Deve somar a largura da tabela (DXA: 1440 = 1 polegada)
rows: [
new TableRow({
children: [
new TableCell({
borders,
width: { size: 4513, type: WidthType.DXA }, // Tambem definir em cada celula
shading: { fill: "D5E8F0", type: ShadingType.CLEAR }, // CLEAR e nao SOLID
margins: { top: 80, bottom: 80, left: 120, right: 120 }, // Padding da celula (interno, nao adicionado a largura)
children: [new Paragraph({ children: [new TextRun("Celula")] })]
})
]
})
]
})
```
**Calculo de largura da tabela:**
Usar sempre `WidthType.DXA` — `WidthType.PERCENTAGE` quebra no Google Docs.
```javascript
// Largura da tabela = soma de columnWidths = largura do conteudo
// A4 com margens de 1": 11906 - 2880 = 9026 DXA
width: { size: 9026, type: WidthType.DXA },
columnWidths: [7000, 2026] // Deve somar a largura da tabela
```
**Regras de largura:**
- **Usar sempre `WidthType.DXA`** — nunca `WidthType.PERCENTAGE` (incompativel com Google Docs)
- Largura da tabela deve igualar a soma de `columnWidths`
- `width` da celula deve corresponder ao respectivo `columnWidth`
- `margins` da celula sao padding interno - reduzem a area de conteudo, nao adicionam a largura
- Para tabelas full-width: usar largura de conteudo (largura pagina menos margens esquerda e direita)
### Imagens
```javascript
// CRITICO: parametro type e OBRIGATORIO
new Paragraph({
children: [new ImageRun({
type: "png", // Obrigatorio: png, jpg, jpeg, gif, bmp, svg
data: fs.readFileSync("image.png"),
transformation: { width: 200, height: 150 },
altText: { title: "Titulo", description: "Desc", name: "Nome" } // Os tres sao obrigatorios
})]
})
```
### Quebras de pagina
```javascript
// CRITICO: PageBreak deve estar dentro de um Paragraph
new Paragraph({ children: [new PageBreak()] })
// Ou usar pageBreakBefore
new Paragraph({ pageBreakBefore: true, children: [new TextRun("Nova pagina")] })
```
### Indice (Table of Contents)
```javascript
// CRITICO: Headings devem usar HeadingLevel APENAS - sem estilos custom
new TableOfContents("Indice", { hyperlink: true, headingStyleRange: "1-3" })
```
### Cabecalhos/Rodapes
```javascript
sections: [{
properties: {
page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } // 1440 = 1 polegada
},
headers: {
default: new Header({ children: [new Paragraph({ children: [new TextRun("Cabecalho")] })] })
},
footers: {
default: new Footer({ children: [new Paragraph({
children: [new TextRun("Pagina "), new TextRun({ children: [PageNumber.CURRENT] })]
})] })
},
children: [/* conteudo */]
}]
```
### Regras criticas para docx-js
- **Definir tamanho de pagina explicitamente** - docx-js assume A4; para documentos PT/EU, A4 (11906 x 16838 DXA) e o padrao correcto
- **Paisagem: passar dimensoes retrato** - docx-js troca largura/altura internamente; passar lado curto como `width`, lado longo como `height`, e definir `orientation: PageOrientation.LANDSCAPE`
- **Nunca usar `\n`** - usar elementos Paragraph separados
- **Nunca usar bullets unicode** - usar `LevelFormat.BULLET` com config numbering
- **PageBreak deve estar em Paragraph** - standalone cria XML invalido
- **ImageRun requer `type`** - especificar sempre png/jpg/etc
- **Definir sempre `width` da tabela com DXA** - nunca usar `WidthType.PERCENTAGE` (quebra no Google Docs)
- **Tabelas precisam de larguras duplas** - array `columnWidths` E `width` da celula, ambos devem corresponder
- **Largura tabela = soma de columnWidths** - para DXA, garantir que somam exactamente
- **Adicionar sempre margins nas celulas** - usar `margins: { top: 80, bottom: 80, left: 120, right: 120 }` para padding legivel
- **Usar `ShadingType.CLEAR`** - nunca SOLID para shading de tabelas
- **TOC requer HeadingLevel apenas** - sem estilos custom nos paragrafos de heading
- **Override built-in styles** - usar IDs exactos: "Heading1", "Heading2", etc.
- **Incluir `outlineLevel`** - necessario para TOC (0 para H1, 1 para H2, etc.)
---
## Editar documentos existentes
**Seguir os 3 passos por ordem.**
### Passo 1: Descompactar
```bash
python scripts/office/unpack.py document.docx unpacked/
```
Extrai XML, pretty-prints, funde runs adjacentes e converte smart quotes para entidades XML (`“` etc.) para sobreviverem a edicao. Usar `--merge-runs false` para saltar a fusao de runs.
### Passo 2: Editar XML
Editar ficheiros em `unpacked/word/`. Ver Referencia XML abaixo para padroes.
**Usar "Claude" como autor** para tracked changes e comentarios, salvo se o utilizador pedir outro nome.
**Usar a ferramenta Edit directamente para substituicao de strings. Nao escrever scripts Python.** Scripts introduzem complexidade desnecessaria. A ferramenta Edit mostra exactamente o que esta a ser substituido.
**CRITICO: Usar smart quotes para novo conteudo.** Ao adicionar texto com apostrofos ou aspas, usar entidades XML para produzir smart quotes:
```xml
<!-- Usar estas entidades para tipografia profissional -->
<w:t>Here&#x2019;s a quote: &#x201C;Hello&#x201D;</w:t>
```
| Entidade | Caractere |
|----------|-----------|
| `&#x2018;` | ' (aspas simples esquerda) |
| `&#x2019;` | ' (aspas simples direita / apostrofo) |
| `&#x201C;` | " (aspas duplas esquerda) |
| `&#x201D;` | " (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 &amp; e &#x2019;"
python scripts/comment.py unpacked/ 1 "Texto de resposta" --parent 0 # resposta ao comentario 0
python scripts/comment.py unpacked/ 0 "Texto" --author "Autor Custom" # nome de autor custom
```
Depois adicionar marcadores ao document.xml (ver Comentarios na Referencia XML).
### Passo 3: Recompactar
```bash
python scripts/office/pack.py unpacked/ output.docx --original document.docx
```
Valida com auto-reparacao, condensa XML e cria DOCX. Usar `--validate false` para saltar.
**Auto-reparacao corrige:**
- `durableId` >= 0x7FFFFFFF (regenera ID valido)
- `xml:space="preserve"` em falta em `<w:t>` com whitespace
**Auto-reparacao nao corrige:**
- XML malformado, nesting de elementos invalido, relacoes em falta, violacoes de schema
### Erros comuns
- **Substituir elementos `<w:r>` inteiros**: Ao adicionar tracked changes, substituir o bloco `<w:r>...</w:r>` completo com `<w:del>...<w:ins>...` como siblings. Nao injectar tags de tracked change dentro de um run.
- **Preservar formatacao `<w:rPr>`**: Copiar o bloco `<w:rPr>` do run original para os runs de tracked change para manter bold, tamanho de fonte, etc.
---
## Referencia XML
### Conformidade com schema
- **Ordem de elementos em `<w:pPr>`**: `<w:pStyle>`, `<w:numPr>`, `<w:spacing>`, `<w:ind>`, `<w:jc>`, `<w:rPr>` por ultimo
- **Whitespace**: Adicionar `xml:space="preserve"` a `<w:t>` com espacos no inicio/fim
- **RSIDs**: Devem ser hex de 8 digitos (ex: `00AB1234`)
### Tracked Changes
**Insercao:**
```xml
<w:ins w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
<w:r><w:t>texto inserido</w:t></w:r>
</w:ins>
```
**Eliminacao:**
```xml
<w:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
<w:r><w:delText>texto eliminado</w:delText></w:r>
</w:del>
```
**Dentro de `<w:del>`**: Usar `<w:delText>` em vez de `<w:t>`, e `<w:delInstrText>` em vez de `<w:instrText>`.
**Edicoes minimas** - marcar apenas o que muda:
```xml
<!-- Alterar "30 dias" para "60 dias" -->
<w:r><w:t>O prazo e de </w:t></w:r>
<w:del w:id="1" w:author="Claude" w:date="...">
<w:r><w:delText>30</w:delText></w:r>
</w:del>
<w:ins w:id="2" w:author="Claude" w:date="...">
<w:r><w:t>60</w:t></w:r>
</w:ins>
<w:r><w:t> dias.</w:t></w:r>
```
**Eliminar paragrafos/itens de lista inteiros** - ao remover TODO o conteudo de um paragrafo, marcar tambem o paragraph mark como eliminado para fundir com o proximo paragrafo. Adicionar `<w:del/>` dentro de `<w:pPr><w:rPr>`:
```xml
<w:p>
<w:pPr>
<w:numPr>...</w:numPr> <!-- numeracao de lista se presente -->
<w:rPr>
<w:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z"/>
</w:rPr>
</w:pPr>
<w:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
<w:r><w:delText>Conteudo inteiro do paragrafo a ser eliminado...</w:delText></w:r>
</w:del>
</w:p>
```
Sem o `<w:del/>` em `<w:pPr><w:rPr>`, aceitar alteracoes deixa um paragrafo/item de lista vazio.
**Rejeitar insercao de outro autor** - aninhar eliminacao dentro da insercao:
```xml
<w:ins w:author="Maria" w:id="5">
<w:del w:author="Claude" w:id="10">
<w:r><w:delText>texto inserido por ela</w:delText></w:r>
</w:del>
</w:ins>
```
**Restaurar eliminacao de outro autor** - adicionar insercao depois (nao modificar a eliminacao):
```xml
<w:del w:author="Maria" w:id="5">
<w:r><w:delText>texto eliminado</w:delText></w:r>
</w:del>
<w:ins w:author="Claude" w:id="10">
<w:r><w:t>texto eliminado</w:t></w:r>
</w:ins>
```
### Comentarios
Apos executar `comment.py` (ver Passo 2), adicionar marcadores ao document.xml. Para respostas, usar flag `--parent` e aninhar marcadores dentro dos do pai.
**CRITICO: `<w:commentRangeStart>` e `<w:commentRangeEnd>` sao siblings de `<w:r>`, nunca dentro de `<w:r>`.**
```xml
<!-- Marcadores de comentario sao filhos directos de w:p, nunca dentro de w:r -->
<w:commentRangeStart w:id="0"/>
<w:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
<w:r><w:delText>eliminado</w:delText></w:r>
</w:del>
<w:r><w:t> mais texto</w:t></w:r>
<w:commentRangeEnd w:id="0"/>
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="0"/></w:r>
<!-- Comentario 0 com resposta 1 aninhada dentro -->
<w:commentRangeStart w:id="0"/>
<w:commentRangeStart w:id="1"/>
<w:r><w:t>texto</w:t></w:r>
<w:commentRangeEnd w:id="1"/>
<w:commentRangeEnd w:id="0"/>
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="0"/></w:r>
<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="1"/></w:r>
```
### Imagens
1. Adicionar ficheiro de imagem a `word/media/`
2. Adicionar relacao a `word/_rels/document.xml.rels`:
```xml
<Relationship Id="rId5" Type=".../image" Target="media/image1.png"/>
```
3. Adicionar content type a `[Content_Types].xml`:
```xml
<Default Extension="png" ContentType="image/png"/>
```
4. Referenciar no document.xml:
```xml
<w:drawing>
<wp:inline>
<wp:extent cx="914400" cy="914400"/> <!-- EMUs: 914400 = 1 polegada -->
<a:graphic>
<a:graphicData uri=".../picture">
<pic:pic>
<pic:blipFill><a:blip r:embed="rId5"/></pic:blipFill>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
```
---
## Dependencias
- **pandoc**: Extracao de texto
- **docx**: `npm install -g docx` (novos documentos)
- **LibreOffice**: Conversao PDF (auto-configurado para ambientes sandbox via `scripts/office/soffice.py`)
- **Poppler**: `pdftoppm` para imagens
---
## Integracao Descomplicar
### MCPs disponiveis
| MCP | Uso |
|-----|-----|
| `mcp__filesystem__*` | Ler/escrever ficheiros .docx locais, listar directorios |
| `mcp__google-workspace__*` | Upload para Google Drive, conversao para Google Docs |
| `mcp__ssh-unified__*` | Operacoes em ficheiros .docx em servidores remotos |
### Workflow tipico
1. **Criar documento** com docx-js conforme instrucoes acima
2. **Validar** com `scripts/office/validate.py`
3. **Guardar** via `mcp__filesystem__write_file` ou directamente no path do projecto
4. **Upload** (opcional) via `mcp__google-workspace__drive_upload_file` para partilha com cliente
### Convencoes Descomplicar
- **Formato de data** em documentos: DD-MM-YYYY (ex: 06-03-2026)
- **Formato monetario**: 1.234,56 EUR (separador milhar ponto, decimal virgula)
- **Fonte padrao**: Arial 12pt
- **Tamanho pagina padrao**: A4 (11906 x 16838 DXA)
- **Autor para tracked changes**: "Claude" (salvo indicacao contraria)
- **Idioma do documento**: PT-PT salvo indicacao contraria
---
**Versao**: 1.0.0 | **Autor**: Descomplicar®
---
## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"}
```
*Adicionar nova linha após cada erro corrigido.*