Skill de Revisão de Documento
Implante artigos/documentos no Cloudflare Pages com suporte a anotação inline de texto. Os revisores selecionam texto e adicionam comentários. Os comentários persistem no Cloudflare D1. O agente pode ler o feedback e iterar. Este skill é sempre protegido por senha.
Pré-requisitos
- Credenciais da Cloudflare:
$HOME/.openclaw/credentials/cloudflare.json - O token de API da Cloudflare deve ter a permissão D1 Edit
- O banco de dados D1 é criado automaticamente pelo deploy.sh — Proibido criar manualmente ou passar parâmetros DB
Regras Principais
- O nome do projeto deve terminar com
-review— o deploy.sh exige isso - Cada página de revisão tem seu próprio banco de dados D1 — regra de nomenclatura
review-<project-name>, criado automaticamente, proibido reutilizar - Diretório de persistência:
$HOME/.openclaw/published-content/<project-name>/— armazena meta.json, content.html, index.html - content.html é o artefato de build — ao reimplantar, regere a partir do arquivo fonte, não altere o content.html diretamente
Fluxo de Trabalho
1. Implantar para Revisão (primeira publicação)
- Identifique o arquivo fonte, gere HTML semântico puro (consulte as Regras de HTML de Conteúdo abaixo) → salve como
content.html - Execute o render.js para envolver com o tema → produz
index.html:node references/render.js \ --input /tmp/<project-name>/content.html \ --output /tmp/<project-name>/index.html \ --theme editorial - Implante (a injeção de anotações + criação do D1 é totalmente automática):
bash scripts/deploy.sh <project-name> /tmp/<project-name> - Após a implantação, atualize imediatamente o meta.json (o deploy.sh cria automaticamente um meta.json inicial; o agente deve complementar com as informações do arquivo fonte):
python3 -c " import json meta_path = '$HOME/.openclaw/published-content/<project-name>/meta.json' with open(meta_path) as f: meta = json.load(f) meta['source'] = '<caminho do arquivo fonte, ex: /caminho/para/seu/arquivo/fonte.md>' meta['sourceType'] = '<markdown|pdf|text|generated>' meta['theme'] = '<tema realmente usado>' with open(meta_path, 'w') as f: json.dump(meta, f, indent=2, ensure_ascii=False) "
Protegido por Senha com Senha Definida pelo Usuário
bash scripts/deploy.sh <project-name> /tmp/<project-name> --password <senha>
O script de implantação automaticamente:
- Cria um banco de dados D1 dedicado chamado
review-<project-name>(1:1 por projeto, nunca reutilizado) - Cria as tabelas de anotações + comentários
- Copia
functions/api/annotations.jsdereferences/annotations-api.js - Copia
functions/_middleware.jsdereferences/middleware-template.js - Define
PAGE_PASSWORDviawrangler pages secret put(senha nunca no código fonte) - Gera
wrangler.tomlcom a vinculação do D1 - Persiste content.html, index.html e meta.json em
$HOME/.openclaw/published-content/<project-name>/
⚠️ Proibido passar manualmente db-name ou db-id. O script gerencia tudo automaticamente, garantindo que cada página de revisão tenha seu próprio banco de dados D1.
Gerenciamento de senha:
- Primeira implantação: parâmetro
--passwordespecificado, ou gerado automaticamente - A senha é armazenada como Cloudflare Secret, não no meta.json nem no código fonte
- Trocar senha:
deploy.sh <project-name> --change-password <nova-senha>(atualiza secret + reimplanta + meta.json) - Reimplantação não requer redefinição de senha (secret persiste entre implantações)
2. Ler Feedback
Consulte o D1 para obter todas as anotações e comentários (o nome do banco é sempre review-<project-name>):
npx wrangler d1 execute review-<project-name> --remote --command "
SELECT a.text as highlighted, c.author, c.text as comment, c.created_at
FROM comments c JOIN annotations a ON c.annotation_id = a.id
ORDER BY c.created_at
"
Apresente o feedback como uma tabela ao usuário.
3. Iterar (Reimplante)
Quando o usuário solicitar alterações com base no feedback da revisão:
- Leia
$HOME/.openclaw/published-content/<project-name>/meta.json— obtenha o caminho do source e o sourceType - Leia o feedback do D1 (igual à Seção 2)
- Com base no sourceType, decida como atualizar:
markdown/text: releia o arquivo fonte do caminhosource→ regere o content.htmlpdf: se o arquivo fonte ainda existir, reextraia; caso contrário, use$HOME/.openclaw/published-content/<project-name>/content.htmlgenerated: use$HOME/.openclaw/published-content/<project-name>/content.htmlcomo base para modificar
- Renderize com o mesmo tema →
index.html - Reimplante com exatamente o mesmo project-name:
bash scripts/deploy.sh <project-name> /tmp/<project-name>- Mesmo nome de projeto → mesmo banco de dados → anotações são preservadas
- Ao reimplantar, é necessário passar
--passwordpara manter a senha original, caso contrário uma nova senha será gerada, sobrescrevendo o secret antigo
⚠️ Reimplantação deve usar o mesmo project-name. Trocar de nome = nova página + novo banco de dados, perda dos dados antigos.
Anotações processadas desaparecerão automaticamente (o texto destacado não corresponderá mais na nova página).
4. Limpeza (Remover)
Ao excluir um projeto, é necessário limpar também o banco de dados D1 e o diretório local de persistência, sem deixar resíduos.
# 1. Excluir o projeto Pages
npx wrangler pages project delete <project-name>
# 2. Excluir o banco de dados D1 correspondente (regra de nomenclatura fixa: review-<project-name>)
npx wrangler d1 delete review-<project-name>
# 3. Excluir o diretório local de persistência
rm -rf $HOME/.openclaw/published-content/<project-name>
As três etapas devem ser concluídas para que a limpeza seja considerada completa.
Schema meta.json
{
"type": "review",
"project": "my-report-review",
"source": "/caminho/para/seu/arquivo/fonte.md",
"sourceType": "markdown",
"theme": "editorial",
"dbName": "review-my-report-review",
"dbId": "uuid-aqui",
"created": "2026-04-12T13:20:00+08:00",
"lastDeployed": "2026-04-12T15:30:00+08:00"
}
Valores de sourceType:
markdown— arquivo .md em knowledge-base ou outro caminho (mais comum)pdf— arquivo PDFtext— arquivo de texto simplesgenerated— gerado diretamente na conversa, sem arquivo fonte
Configuração do Ambiente
Todos os comandos wrangler precisam de:
source <(python3 -c "
import json
with open('$HOME/.openclaw/credentials/cloudflare.json') as f:
c = json.load(f)
print(f'export CLOUDFLARE_ACCOUNT_ID={c[\"account_id\"]}')
print(f'export CLOUDFLARE_API_TOKEN={c[\"api_token\"]}')
")
Notas
- A senha é armazenada como Cloudflare Secret (PAGE_PASSWORD), nunca no código fonte ou meta.json
- Os comentários são armazenados com o nome de autor "Reviewer" por padrão (nenhum login necessário)
- Nível gratuito do D1: 5M leituras/dia, 100K escritas/dia — mais que suficiente
- A correspondência de anotações é baseada em texto; se o texto fonte mudar, os destaques antigos desaparecem naturalmente
- O estado persistente reside em
$HOME/.openclaw/published-content/<project-name>/— compartilhado entre todos os agentes - Os arquivos de tema são sincronizados a partir de
cloudflare-pages— não editethemes/ourender.jsdiretamente aqui. Modifique emcloudflare-pages/references/e depois executebash scripts/sync-themes.sh(do skill cloudflare-pages)
Regras de HTML de Conteúdo
Ao gerar conteúdo HTML para páginas de revisão, siga estas regras rigorosamente:
HTML Semântico Apenas
- Gere HTML semântico puro — sem tags
<style>, sem estilos inline, sem wrappers<html>/<head>/<body> - Use tags padrão:
<h1>-<h4>,<p>,<table>,<ul>/<ol>,<blockquote>,<details>,<hr>
Convenções Estruturais
<table>para comparações, pontuações, grades de dados<blockquote>para principais conclusões ou citações importantes<details><summary>para seções recolhíveis<div class="toc">para índice<p class="meta">para linhas de metadados (data, autor, etc.)<div class="footer">para texto de rodapé
Classes de Badge
<span class="badge badge-green">Pass</span>— positivo<span class="badge badge-yellow">Aviso</span>— cautela<span class="badge badge-red">Miss</span>— negativo
Biblioteca de Componentes (Importante — Deve Ser Usada)
Ao gerar content.html, é obrigatório usar ativamente os seguintes componentes para dar hierarquia visual ao conteúdo. HTML simples com <p> + <ul> é inaceitável.
Caixas de Destaque — destacar informações-chave
<div class="callout">Callout padrão: informações importantes em geral</div>
<div class="callout callout-conclusion"><strong>Conclusão:</strong> julgamento central e recomendação final</div>
<div class="callout callout-warning"><strong>Atenção:</strong> riscos, preocupações, problemas a serem observados</div>
<div class="callout callout-important"><strong>Importante:</strong> dados críticos, fatos que não podem ser ignorados</div>
Cartões de Caminho — comparação de opções/caminhos
<div class="path-card">
<div class="path-label">Plano A</div>
<p>Descrição...</p>
</div>
<div class="path-card recommended">
<div class="path-label">Plano B (Recomendado)</div>
<p>Descrição...</p>
</div>
Cadeia de Raciocínio — cadeia de raciocínio lógico
<div class="reasoning-chain">
<ol>
<li>Primeiro passo do raciocínio...</li>
<li>Segundo passo do raciocínio...</li>
<li>Portanto, concluímos que...</li>
</ol>
</div>
Itens de Ação — sugestões de ação
<div class="action-items">
<ol>
<li><strong>Curto prazo (1 semana):</strong> ação específica...</li>
<li><strong>Médio prazo (1 mês):</strong> ação específica...</li>
</ol>
</div>
Recomendação Final — bloco escuro
<div class="final-rec">
<p><strong>Recomendação final:</strong> conclusão central em uma frase, colocada ao final como encerramento.</p>
</div>
Palavras-chave — tags
<div class="keywords">
<span class="kw">Tag1</span>
<span class="kw">Tag2</span>
</div>
Divisores de Seção — melhor efeito nos temas magazine/refined
<div class="section-divider"><span class="num">Seção 01</span></div>
Aviso Legal — ao final do documento
<p class="disclaimer">Este relatório foi gerado por IA, é apenas para referência e não constitui aconselhamento profissional.</p>
Padrões de Qualidade do Conteúdo
Ao gerar content.html, certifique-se de:
- Cada seção h2 contém pelo menos 1 componente (callout / path-card / table / reasoning-chain etc.)
- Conclusões-chave devem usar callout-conclusion, não fique escondida em parágrafos comuns
- Se houver comparação, use path-card ou table, não apenas texto corrido
- Deve haver um final-rec ao final (se o conteúdo tiver conclusão/recomendação clara)
- TOC deve ser envolvido por
<div class="toc">, não use<ul>simples
Temas Disponíveis
editorial— estilo de análise de texto longo (serifa no corpo + sans-serif nos títulos, fundo cinza quente, acentos azul-acinzentados escuros, coluna estreita de 740px). Melhor para análises profundas, relatórios de pesquisa. Recursos: caixas de destaque, cartões de caminho, cadeias de raciocínio, itens de ação.magazine— estilo de revista de texto longo (Playfair Display nos títulos + DM Sans no corpo, cabeçalho escuro hero, acento vermelho, numeração "Seção 01", divisores ***). Melhor para peças editoriais de alto impacto, relatórios visualmente marcantes. Requer Google Fonts.swiss— estilo internacional suíço (IBM Plex Mono no corpo + Instrument Serif nos títulos, fundo branco puro, preto+vermelho+azul, layout de grade, 900px). Melhor para documentos ultra-limpos, racionais, com sensação de engenharia. Requer Google Fonts.refined— estilo premium refinado (Cormorant Garamond serifa no corpo + Outfit sans-serif nos rótulos, fundo creme com textura de pergaminho, ouro + verde sálvia + rosa, layout centralizado, 700px). Melhor para white papers premium, briefings executivos. Requer Google Fonts.
Seleção de Tema
- Se o usuário especificar um tema (por exemplo, "editorial", "magazine", "swiss", "refined"), use esse tema.
- Se o usuário não especificar, selecione automaticamente com base no tipo de conteúdo:
editorial: análise profunda, argumentos longos, comparações de escolas/produtos, briefings de pesquisa, relatórios formais, avaliações — escolha padrãomagazine: peças editoriais de alto impacto que se beneficiam de apresentação visual dramáticaswiss: documentos ultra-limpos, racionais, estilo engenharia, especificações técnicas, comparações, resumos de dadosrefined: white papers premium, briefings executivos, documentos com sensação de luxo, análise de alto risco
- Se não tiver certeza, o padrão é
editorial.