Plugins
Plugin de oficina de Skills
Skill Workshop é experimental. Ele fica desativado por padrão, suas heurísticas de captura e prompts de revisor podem mudar entre versões, e escritas automáticas devem ser usadas apenas em workspaces confiáveis depois de revisar primeiro a saída do modo pendente.
Skill Workshop é memória procedural para Skills de workspace. Ele permite que um agente transforme
fluxos de trabalho reutilizáveis, correções do usuário, soluções conquistadas com esforço e armadilhas recorrentes
em arquivos SKILL.md em:
<workspace>/skills/<skill-name>/SKILL.md
Isso é diferente de memória de longo prazo:
- Memória armazena fatos, preferências, entidades e contexto passado.
- Skills armazenam procedimentos reutilizáveis que o agente deve seguir em tarefas futuras.
- Skill Workshop é a ponte de um turno útil para uma Skill durável de workspace, com verificações de segurança e aprovação opcional.
Skill Workshop é útil quando o agente aprende um procedimento como:
- como validar recursos de GIFs animados obtidos de fontes externas
- como substituir recursos de captura de tela e verificar dimensões
- como executar um cenário de QA específico do repositório
- como depurar uma falha recorrente de provedor
- como reparar uma nota obsoleta de fluxo de trabalho local
Ele não se destina a:
- fatos como "o usuário gosta de azul"
- memória autobiográfica ampla
- arquivamento bruto de transcrições
- segredos, credenciais ou texto oculto de prompt
- instruções pontuais que não se repetirão
Estado padrão
O Plugin incluído é experimental e desativado por padrão, a menos que seja
explicitamente ativado em plugins.entries.skill-workshop.
O manifesto do Plugin não define enabledByDefault: true. O padrão enabled: true
dentro do esquema de configuração do Plugin se aplica apenas depois que a entrada do Plugin já foi
selecionada e carregada.
Experimental significa:
- o Plugin tem suporte suficiente para testes opt-in e dogfooding
- o armazenamento de propostas, os limites do revisor e as heurísticas de captura podem evoluir
- aprovação pendente é o modo inicial recomendado
- aplicação automática é para configurações pessoais/de workspace confiáveis, não para ambientes compartilhados ou hostis com alto volume de entrada
Ativar
Configuração mínima segura:
{
plugins: {
entries: {
"skill-workshop": {
enabled: true,
config: {
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "hybrid",
},
},
},
},
}
Com esta configuração:
- a ferramenta
skill_workshopfica disponível - correções reutilizáveis explícitas são enfileiradas como propostas pendentes
- passagens de revisor baseadas em limite podem propor atualizações de Skills
- nenhum arquivo de Skill é escrito até que uma proposta pendente seja aplicada
Use escritas automáticas apenas em workspaces confiáveis:
{
plugins: {
entries: {
"skill-workshop": {
enabled: true,
config: {
autoCapture: true,
approvalPolicy: "auto",
reviewMode: "hybrid",
},
},
},
},
}
approvalPolicy: "auto" ainda usa o mesmo scanner e caminho de quarentena. Ele
não aplica propostas com achados críticos.
Configuração
| Chave | Padrão | Intervalo / valores | Significado |
|---|---|---|---|
enabled |
true |
boolean | Ativa o Plugin depois que a entrada do Plugin é carregada. |
autoCapture |
true |
boolean | Ativa captura/revisão pós-turno em turnos de agente bem-sucedidos. |
approvalPolicy |
"pending" |
"pending", "auto" |
Enfileira propostas ou escreve propostas seguras automaticamente. |
reviewMode |
"hybrid" |
"off", "heuristic", "llm", "hybrid" |
Escolhe captura de correção explícita, revisor LLM, ambos ou nenhum. |
reviewInterval |
15 |
1..200 |
Executa o revisor após este número de turnos bem-sucedidos. |
reviewMinToolCalls |
8 |
1..500 |
Executa o revisor após este número de chamadas de ferramenta observadas. |
reviewTimeoutMs |
45000 |
5000..180000 |
Tempo limite para a execução do revisor incorporado. |
maxPending |
50 |
1..200 |
Máximo de propostas pendentes/em quarentena mantidas por workspace. |
maxSkillBytes |
40000 |
1024..200000 |
Tamanho máximo de arquivo de Skill/suporte gerado. |
Perfis recomendados:
// Conservative: explicit tool use only, no automatic capture.
{
autoCapture: false,
approvalPolicy: "pending",
reviewMode: "off",
}
// Review-first: capture automatically, but require approval.
{
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "hybrid",
}
// Trusted automation: write safe proposals immediately.
{
autoCapture: true,
approvalPolicy: "auto",
reviewMode: "hybrid",
}
// Low-cost: no reviewer LLM call, only explicit correction phrases.
{
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "heuristic",
}
Caminhos de captura
Skill Workshop tem três caminhos de captura.
Sugestões de ferramenta
O modelo pode chamar skill_workshop diretamente quando vê um procedimento reutilizável
ou quando o usuário pede para salvar/atualizar uma Skill.
Este é o caminho mais explícito e funciona mesmo com autoCapture: false.
Captura heurística
Quando autoCapture está ativado e reviewMode é heuristic ou hybrid, o
Plugin examina turnos bem-sucedidos em busca de frases explícitas de correção do usuário:
next timefrom now onremember tomake sure toalways ... use/check/verify/record/save/preferprefer ... when/for/instead/usewhen asked
A heurística cria uma proposta a partir da instrução mais recente do usuário que corresponder. Ela usa dicas de tópico para escolher nomes de Skills para fluxos de trabalho comuns:
- tarefas de GIF animado ->
animated-gif-workflow - tarefas de captura de tela ou recursos ->
screenshot-asset-workflow - tarefas de QA ou cenário ->
qa-scenario-workflow - tarefas de PR do GitHub ->
github-pr-workflow - fallback ->
learned-workflows
A captura heurística é intencionalmente estreita. Ela é para correções claras e notas de processo repetíveis, não para sumarização geral de transcrições.
Revisor LLM
Quando autoCapture está ativado e reviewMode é llm ou hybrid, o Plugin
executa um revisor compacto incorporado após os limites serem atingidos.
O revisor recebe:
- o texto recente da transcrição, limitado aos últimos 12.000 caracteres
- até 12 Skills existentes do workspace
- até 2.000 caracteres de cada Skill existente
- instruções somente JSON
O revisor não tem ferramentas:
disableTools: truetoolsAllow: []disableMessageTool: true
O revisor retorna { "action": "none" } ou uma proposta. O campo action é create, append ou replace - prefira append/replace quando uma Skill relevante já existir; use create apenas quando nenhuma Skill existente se encaixar.
Exemplo de create:
{
"action": "create",
"skillName": "media-asset-qa",
"title": "Media Asset QA",
"reason": "Reusable animated media acceptance workflow",
"description": "Validate externally sourced animated media before product use.",
"body": "## Workflow\n\n- Verify true animation.\n- Record attribution.\n- Store a local approved copy.\n- Verify in product UI before final reply."
}
append adiciona section + body. replace troca oldText por newText na Skill nomeada.
Ciclo de vida da proposta
Toda atualização gerada vira uma proposta com:
idcreatedAtupdatedAtworkspaceDiragentIdopcionalsessionIdopcionalskillNametitlereasonsource:tool,agent_endoureviewerstatuschangescanFindingsopcionalquarantineReasonopcional
Status de propostas:
pending- aguardando aprovaçãoapplied- escrita em<workspace>/skillsrejected- rejeitada pelo operador/modeloquarantined- bloqueada por achados críticos do scanner
O estado é armazenado por espaço de trabalho no diretório de estado do Gateway:
<stateDir>/skill-workshop/<workspace-hash>.json
Propostas pendentes e em quarentena são desduplicadas por nome da skill e payload
de alteração. O armazenamento mantém as propostas pendentes/em quarentena mais recentes até
maxPending.
Referência da ferramenta
O plugin registra uma ferramenta de agente:
skill_workshop
status
Conta propostas por estado para o espaço de trabalho ativo.
{ "action": "status" }
Formato do resultado:
{
"workspaceDir": "/path/to/workspace",
"pending": 1,
"quarantined": 0,
"applied": 3,
"rejected": 0
}
list_pending
Lista propostas pendentes.
{ "action": "list_pending" }
Para listar outro status:
{ "action": "list_pending", "status": "applied" }
Valores válidos de status:
pendingappliedrejectedquarantined
list_quarantine
Lista propostas em quarentena.
{ "action": "list_quarantine" }
Use isto quando a captura automática parecer não fazer nada e os logs mencionarem
skill-workshop: quarantined <skill>.
inspect
Busca uma proposta por id.
{
"action": "inspect",
"id": "proposal-id"
}
suggest
Cria uma proposta. Com approvalPolicy: "pending" (padrão), isto enfileira em vez de escrever.
{
"action": "suggest",
"skillName": "animated-gif-workflow",
"title": "Animated GIF Workflow",
"reason": "User established reusable GIF validation rules.",
"description": "Validate animated GIF assets before using them.",
"body": "## Workflow\n\n- Verify the URL resolves to image/gif.\n- Confirm it has multiple frames.\n- Record attribution and license.\n- Avoid hotlinking when a local asset is needed."
}
Request immediate write in auto mode (apply: true)
{
"action": "suggest",
"apply": true,
"skillName": "animated-gif-workflow",
"description": "Validate animated GIF assets before using them.",
"body": "## Workflow\n\n- Verify true animation.\n- Record attribution."
}
Com approvalPolicy: "pending", apply: true ainda enfileira a proposta. Revise-a e então use
a ação apply após a aprovação.
Force pending under auto policy (apply: false)
{
"action": "suggest",
"apply": false,
"skillName": "screenshot-asset-workflow",
"description": "Screenshot replacement workflow.",
"body": "## Workflow\n\n- Verify dimensions.\n- Optimize the PNG.\n- Run the relevant gate."
}
Append to a named section
{
"action": "suggest",
"skillName": "qa-scenario-workflow",
"section": "Workflow",
"description": "QA scenario workflow.",
"body": "- For media QA, verify generated assets render and pass final assertions."
}
Replace exact text
{
"action": "suggest",
"skillName": "github-pr-workflow",
"oldText": "- Check the PR.",
"newText": "- Check unresolved review threads, CI status, linked issues, and changed files before deciding."
}
apply
Aplica uma proposta pendente.
Com approvalPolicy: "pending", esta ação solicita aprovação do operador antes de escrever a
skill do espaço de trabalho.
{
"action": "apply",
"id": "proposal-id"
}
apply recusa propostas em quarentena:
quarantined proposal cannot be applied
reject
Marca uma proposta como rejeitada.
{
"action": "reject",
"id": "proposal-id"
}
write_support_file
Escreve um arquivo de suporte dentro de um diretório de skill existente ou proposto.
Diretórios de suporte de nível superior permitidos:
references/templates/scripts/assets/
Exemplo:
{
"action": "write_support_file",
"skillName": "release-workflow",
"relativePath": "references/checklist.md",
"body": "# Release Checklist\n\n- Run release docs.\n- Verify changelog.\n"
}
Os arquivos de suporte têm escopo de workspace, passam por verificação de caminho, são limitados em bytes por
maxSkillBytes, escaneados e gravados atomicamente.
Escritas de Skills
Skill Workshop grava apenas em:
<workspace>/skills/<normalized-skill-name>/
Os nomes das Skills são normalizados:
- convertidos para minúsculas
- sequências não
[a-z0-9_-]viram- - não alfanuméricos no início/fim são removidos
- o comprimento máximo é 80 caracteres
- o nome final deve corresponder a
[a-z0-9][a-z0-9_-]{1,79}
Para create:
- se a skill não existir, Skill Workshop grava um novo
SKILL.md - se ela já existir, Skill Workshop acrescenta o corpo a
## Workflow
Para append:
- se a skill existir, Skill Workshop acrescenta à seção solicitada
- se ela não existir, Skill Workshop cria uma skill mínima e então acrescenta
Para replace:
- a skill já deve existir
oldTextdeve estar presente exatamente- apenas a primeira correspondência exata é substituída
Todas as gravações são atômicas e atualizam imediatamente o snapshot de skills em memória, para que a skill nova ou atualizada possa ficar visível sem reiniciar o Gateway.
Modelo de segurança
Skill Workshop tem um scanner de segurança para conteúdo gerado de SKILL.md e arquivos de suporte.
Achados críticos colocam propostas em quarentena:
| ID da regra | Bloqueia conteúdo que... |
|---|---|
prompt-injection-ignore-instructions |
instrui o agente a ignorar instruções anteriores/superiores |
prompt-injection-system |
referencia prompts do sistema, mensagens de desenvolvedor ou instruções ocultas |
prompt-injection-tool |
incentiva contornar permissão/aprovação de ferramenta |
shell-pipe-to-shell |
inclui curl/wget redirecionado para sh, bash ou zsh |
secret-exfiltration |
parece enviar dados de env/process env pela rede |
Achados de aviso são mantidos, mas não bloqueiam por si só:
| ID da regra | Avisa sobre... |
|---|---|
destructive-delete |
comandos amplos no estilo rm -rf |
unsafe-permissions |
uso de permissões no estilo chmod 777 |
Propostas em quarentena:
- mantêm
scanFindings - mantêm
quarantineReason - aparecem em
list_quarantine - não podem ser aplicadas por meio de
apply
Para se recuperar de uma proposta em quarentena, crie uma nova proposta segura com o conteúdo inseguro removido. Não edite o JSON do armazenamento manualmente.
Orientação de prompt
Quando ativado, Skill Workshop injeta uma seção curta de prompt que instrui o agente
a usar skill_workshop para memória procedural durável.
A orientação enfatiza:
- procedimentos, não fatos/preferências
- correções do usuário
- procedimentos bem-sucedidos não óbvios
- armadilhas recorrentes
- reparo de skill desatualizada/fraca/incorreta por append/replace
- salvar procedimento reutilizável depois de longos ciclos com ferramentas ou correções difíceis
- texto curto e imperativo para skills
- nenhum despejo de transcrição
O texto do modo de escrita muda conforme approvalPolicy:
- modo pendente: enfileirar sugestões; usar
applyapós aprovação explícita - modo automático: aplicar atualizações seguras de skills do workspace, a menos que
apply: falseenfileire em vez disso
Custos e comportamento em runtime
A captura heurística não chama um modelo.
A revisão por LLM usa uma execução embutida no modelo ativo/padrão do agente. Ela é baseada em limite, então não roda em todos os turnos por padrão.
O revisor:
- usa o mesmo contexto configurado de provedor/modelo quando disponível
- recorre aos padrões do agente em runtime
- tem
reviewTimeoutMs - usa contexto leve de bootstrap
- não tem ferramentas
- não grava nada diretamente
- só pode emitir uma proposta que passa pelo scanner normal e pelo caminho de aprovação/quarentena
Se o revisor falhar, exceder o tempo limite ou retornar JSON inválido, o plugin registra uma mensagem de aviso/debug e ignora essa passagem de revisão.
Padrões operacionais
Use Skill Workshop quando o usuário disser:
- "next time, do X"
- "from now on, prefer Y"
- "make sure to verify Z"
- "save this as a workflow"
- "this took a while; remember the process"
- "update the local skill for this"
Bom texto de skill:
## Workflow
- Verify the GIF URL resolves to `image/gif`.
- Confirm the file has multiple frames.
- Record source URL, license, and attribution.
- Store a local copy when the asset will ship with the product.
- Verify the local asset renders in the target UI before final reply.
Texto ruim de skill:
The user asked about a GIF and I searched two websites. Then one was blocked by
Cloudflare. The final answer said to check attribution.
Motivos pelos quais a versão ruim não deve ser salva:
- tem formato de transcrição
- não é imperativa
- inclui detalhes pontuais ruidosos
- não diz ao próximo agente o que fazer
Depuração
Verifique se o plugin está carregado:
openclaw plugins list --enabled
Verifique contagens de propostas a partir de um contexto de agente/ferramenta:
{ "action": "status" }
Inspecione propostas pendentes:
{ "action": "list_pending" }
Inspecione propostas em quarentena:
{ "action": "list_quarantine" }
Sintomas comuns:
| Sintoma | Causa provável | Verificação |
|---|---|---|
| A ferramenta está indisponível | A entrada do plugin não está ativada | plugins.entries.skill-workshop.enabled e openclaw plugins list |
| Nenhuma proposta automática aparece | autoCapture: false, reviewMode: "off" ou limites não atingidos |
Configuração, status da proposta, logs do Gateway |
| A heurística não capturou | A redação do usuário não correspondeu aos padrões de correção | Use skill_workshop.suggest explícito ou ative o revisor LLM |
| O revisor não criou uma proposta | O revisor retornou none, JSON inválido ou excedeu o tempo limite |
Logs do Gateway, reviewTimeoutMs, limites |
| A proposta não foi aplicada | approvalPolicy: "pending" |
list_pending, depois apply |
| A proposta desapareceu de pendentes | Proposta duplicada reutilizada, poda por máximo de pendentes, ou foi aplicada/rejeitada/quarentenada | status, list_pending com filtros de status, list_quarantine |
| O arquivo de skill existe, mas o modelo não o vê | O snapshot de skills não foi atualizado ou o gating de skills o exclui | status de openclaw skills e elegibilidade da skill do workspace |
Logs relevantes:
skill-workshop: queued <skill>skill-workshop: applied <skill>skill-workshop: quarantined <skill>skill-workshop: heuristic capture skipped: ...skill-workshop: reviewer skipped: ...skill-workshop: reviewer found no update
Cenários de QA
Cenários de QA baseados no repositório:
qa/scenarios/plugins/skill-workshop-animated-gif-autocreate.mdqa/scenarios/plugins/skill-workshop-pending-approval.mdqa/scenarios/plugins/skill-workshop-reviewer-autonomous.md
Execute a cobertura determinística:
pnpm openclaw qa suite \
--scenario skill-workshop-animated-gif-autocreate \
--scenario skill-workshop-pending-approval \
--concurrency 1
Execute a cobertura do revisor:
pnpm openclaw qa suite \
--scenario skill-workshop-reviewer-autonomous \
--concurrency 1
O cenário do revisor é intencionalmente separado porque ativa
reviewMode: "llm" e exercita a passagem embutida do revisor.
Quando não ativar aplicação automática
Evite approvalPolicy: "auto" quando:
- o workspace contém procedimentos sensíveis
- o agente está trabalhando com entrada não confiável
- skills são compartilhadas por uma equipe ampla
- você ainda está ajustando prompts ou regras do scanner
- o modelo lida com frequência com conteúdo hostil da web/e-mail
Use o modo pendente primeiro. Mude para o modo automático somente depois de revisar o tipo de skills que o agente propõe nesse workspace.