@fabioforest/openclaw 3.0.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/openclaw.js +37 -8
- package/lib/cli/assist.js +84 -0
- package/lib/cli/doctor.js +37 -3
- package/lib/cli/ide.js +218 -0
- package/lib/cli/init.js +135 -79
- package/lib/cli/inspect.js +58 -0
- package/lib/cli/orchestrate.js +43 -15
- package/lib/cli/update.js +113 -47
- package/lib/context/collector.js +104 -0
- package/lib/context/index.js +75 -0
- package/lib/router/match.js +107 -0
- package/lib/setup/config_wizard.js +2 -0
- package/package.json +2 -2
- package/templates/.agent/agents/workflow-automator.md +31 -0
- package/templates/.agent/rules/CONSENT_FIRST.md +24 -0
- package/templates/.agent/rules/DEV_MODE.md +18 -0
- package/templates/.agent/rules/ROUTER_PROTOCOL.md +22 -0
- package/templates/.agent/rules/WEB_AUTOMATION.md +52 -0
- package/templates/.agent/skills/content-sourcer/SKILL.md +48 -0
- package/templates/.agent/skills/context-flush/SKILL.md +30 -0
- package/templates/.agent/skills/drive-organizer/SKILL.md +40 -0
- package/templates/.agent/skills/linkedin-optimizer/SKILL.md +48 -0
- package/templates/.agent/skills/mission-control/SKILL.md +37 -0
- package/templates/.agent/skills/openclaw-assist/SKILL.md +30 -0
- package/templates/.agent/skills/openclaw-dev/SKILL.md +26 -0
- package/templates/.agent/skills/openclaw-inspect/SKILL.md +21 -0
- package/templates/.agent/skills/openclaw-installation-debugger/scripts/debug.js +16 -2
- package/templates/.agent/skills/openclaw-router/SKILL.md +34 -0
- package/templates/.agent/skills/openclaw-security/SKILL.md +21 -0
- package/templates/.agent/skills/site-tester/SKILL.md +49 -0
- package/templates/.agent/skills/smart-router/SKILL.md +116 -0
- package/templates/.agent/skills/web-scraper/SKILL.md +51 -0
- package/templates/.agent/state/MEMORY.md +8 -0
- package/templates/.agent/state/mission_control.json +34 -0
- package/templates/.agent/workflows/ai-capture.md +39 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Context Collector — Read-only snapshot do ambiente.
|
|
5
|
+
* Nunca altera arquivos. Apenas lê e retorna dados.
|
|
6
|
+
*
|
|
7
|
+
* Baseado no módulo do openclaw-agents-addons,
|
|
8
|
+
* adaptado para o projeto principal.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const fs = require("fs");
|
|
12
|
+
const os = require("os");
|
|
13
|
+
const path = require("path");
|
|
14
|
+
|
|
15
|
+
function exists(p) {
|
|
16
|
+
try { return fs.existsSync(p); } catch { return false; }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Detecta IDE ativa no workspace.
|
|
21
|
+
*/
|
|
22
|
+
function detectIDE(targetPath) {
|
|
23
|
+
if (exists(path.join(targetPath, ".cursor"))) return "cursor";
|
|
24
|
+
if (exists(path.join(targetPath, ".vscode"))) return "vscode";
|
|
25
|
+
if (exists(path.join(targetPath, ".idea"))) return "jetbrains";
|
|
26
|
+
return "unknown";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Detecta ambiente de execução (SO, Docker, WSL).
|
|
31
|
+
*/
|
|
32
|
+
function detectEnvironment() {
|
|
33
|
+
const platform = os.platform();
|
|
34
|
+
const docker = exists("/.dockerenv") ||
|
|
35
|
+
(exists("/proc/1/cgroup") && fs.readFileSync("/proc/1/cgroup", "utf8").includes("docker"));
|
|
36
|
+
const wsl = platform === "linux" &&
|
|
37
|
+
(os.release().toLowerCase().includes("microsoft") || !!process.env.WSL_DISTRO_NAME);
|
|
38
|
+
return { platform, docker, wsl };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Detecta instalação existente do OpenClaw.
|
|
43
|
+
*/
|
|
44
|
+
function detectOpenClaw(targetPath) {
|
|
45
|
+
const agentDir = path.join(targetPath, ".agent");
|
|
46
|
+
const config = path.join(targetPath, "openclaw.json");
|
|
47
|
+
const dockerCompose = path.join(targetPath, "docker-compose.yml");
|
|
48
|
+
return {
|
|
49
|
+
hasAgentDir: exists(agentDir),
|
|
50
|
+
hasConfig: exists(config),
|
|
51
|
+
hasDockerCompose: exists(dockerCompose),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Lista skills disponíveis nos templates.
|
|
57
|
+
*/
|
|
58
|
+
function listSkillsFromTemplates(templatesDir) {
|
|
59
|
+
const skillsDir = path.join(templatesDir, ".agent", "skills");
|
|
60
|
+
if (!exists(skillsDir)) return [];
|
|
61
|
+
const out = [];
|
|
62
|
+
for (const name of fs.readdirSync(skillsDir)) {
|
|
63
|
+
const skillPath = path.join(skillsDir, name, "SKILL.md");
|
|
64
|
+
if (exists(skillPath)) out.push({ name, skillPath });
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Lista skills instaladas no workspace do usuário.
|
|
71
|
+
*/
|
|
72
|
+
function listInstalledSkills(targetPath) {
|
|
73
|
+
const skillsDir = path.join(targetPath, ".agent", "skills");
|
|
74
|
+
if (!exists(skillsDir)) return [];
|
|
75
|
+
const out = [];
|
|
76
|
+
for (const name of fs.readdirSync(skillsDir)) {
|
|
77
|
+
const skillPath = path.join(skillsDir, name, "SKILL.md");
|
|
78
|
+
if (exists(skillPath)) out.push({ name, skillPath });
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Coleta contexto completo (read-only).
|
|
85
|
+
* @param {object} options
|
|
86
|
+
* @param {string} options.targetPath — diretório do workspace
|
|
87
|
+
* @param {string} options.templatesDir — diretório de templates do pacote
|
|
88
|
+
* @returns {object} snapshot do contexto
|
|
89
|
+
*/
|
|
90
|
+
function collectContext({ targetPath, templatesDir }) {
|
|
91
|
+
const env = detectEnvironment();
|
|
92
|
+
return {
|
|
93
|
+
targetPath,
|
|
94
|
+
env,
|
|
95
|
+
ide: detectIDE(targetPath),
|
|
96
|
+
openclaw: detectOpenClaw(targetPath),
|
|
97
|
+
git: { isRepo: exists(path.join(targetPath, ".git")) },
|
|
98
|
+
skillsInTemplates: listSkillsFromTemplates(templatesDir),
|
|
99
|
+
skillsInstalled: listInstalledSkills(targetPath),
|
|
100
|
+
ts: new Date().toISOString(),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = collectContext;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const os = require("os");
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Detecta o ambiente de execução e metadados de contexto.
|
|
9
|
+
* Retorna um objeto seguro para logs e auditoria.
|
|
10
|
+
*/
|
|
11
|
+
function detectContext(cwd = process.cwd()) {
|
|
12
|
+
const ctx = {
|
|
13
|
+
timestamp: new Date().toISOString(),
|
|
14
|
+
platform: os.platform(),
|
|
15
|
+
cwd: cwd,
|
|
16
|
+
env: "local",
|
|
17
|
+
ide: "unknown",
|
|
18
|
+
isDocker: false,
|
|
19
|
+
hasExistingInstall: false,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// 1. Detectar Docker
|
|
23
|
+
if (fs.existsSync("/.dockerenv") || fs.existsSync("/run/.containerenv")) {
|
|
24
|
+
ctx.isDocker = true;
|
|
25
|
+
ctx.env = "docker";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 2. Detectar IDEs comuns
|
|
29
|
+
const ideMarkers = [
|
|
30
|
+
{ name: "vscode", path: ".vscode" },
|
|
31
|
+
{ name: "cursor", path: ".cursor" },
|
|
32
|
+
{ name: "idea", path: ".idea" },
|
|
33
|
+
{ name: "antigravity", path: ".agent/antigravity" } // Marcador fictício ou real se existir
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
for (const m of ideMarkers) {
|
|
37
|
+
if (fs.existsSync(path.join(cwd, m.path))) {
|
|
38
|
+
ctx.ide = m.name;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 3. Detectar instalação existente
|
|
44
|
+
const agentDir = path.join(cwd, ".agent");
|
|
45
|
+
const configPath = path.join(cwd, "openclaw.json");
|
|
46
|
+
|
|
47
|
+
if (fs.existsSync(agentDir) || fs.existsSync(configPath)) {
|
|
48
|
+
ctx.hasExistingInstall = true;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return ctx;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Gera um cabeçalho de auditoria formatado em Markdown.
|
|
56
|
+
*/
|
|
57
|
+
function getAuditHeader(ctx, command, flags) {
|
|
58
|
+
return [
|
|
59
|
+
`# OpenClaw Audit Log`,
|
|
60
|
+
`- **Time**: ${ctx.timestamp}`,
|
|
61
|
+
`- **Command**: ${command}`,
|
|
62
|
+
`- **Mode**: ${flags.plan ? "PLAN (Simulation)" : "APPLY (Execution)"}`,
|
|
63
|
+
`- **Environment**: ${ctx.env} (Docker: ${ctx.isDocker})`,
|
|
64
|
+
`- **IDE**: ${ctx.ide}`,
|
|
65
|
+
`- **Existing Install**: ${ctx.hasExistingInstall}`,
|
|
66
|
+
`- **Flags**: ${JSON.stringify(flags)}`,
|
|
67
|
+
`---`,
|
|
68
|
+
``
|
|
69
|
+
].join("\n");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
module.exports = {
|
|
73
|
+
detectContext,
|
|
74
|
+
getAuditHeader
|
|
75
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Skill Matcher — Escolhe a skill mais adequada para uma solicitação.
|
|
5
|
+
*
|
|
6
|
+
* Faz parse do YAML frontmatter de cada SKILL.md e pontua
|
|
7
|
+
* a relevância com base nos triggers e descrição.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Extrai metadados (name, description, triggers) do frontmatter YAML.
|
|
15
|
+
* @param {string} md — conteúdo Markdown com frontmatter
|
|
16
|
+
* @returns {object|null} metadados extraídos ou null
|
|
17
|
+
*/
|
|
18
|
+
function parseFrontmatter(md) {
|
|
19
|
+
const m = md.match(/^---\s*\n([\s\S]*?)\n---\s*\n/);
|
|
20
|
+
if (!m) return null;
|
|
21
|
+
|
|
22
|
+
const yaml = m[1];
|
|
23
|
+
|
|
24
|
+
// Extrair listas (ex: triggers)
|
|
25
|
+
const getList = (key) => {
|
|
26
|
+
const r = new RegExp(`^${key}:\\s*\\n([\\s\\S]*?)(\\n\\w|$)`, "m");
|
|
27
|
+
const mm = yaml.match(r);
|
|
28
|
+
if (!mm) return [];
|
|
29
|
+
return mm[1]
|
|
30
|
+
.split("\n")
|
|
31
|
+
.map(l => l.trim())
|
|
32
|
+
.filter(l => l.startsWith("-"))
|
|
33
|
+
.map(l => l.replace(/^-\s*/, "").trim())
|
|
34
|
+
.filter(Boolean);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Extrair escalares (ex: name, description)
|
|
38
|
+
const getScalar = (key) => {
|
|
39
|
+
const r = new RegExp(`^${key}:\\s*(.+)$`, "m");
|
|
40
|
+
const mm = yaml.match(r);
|
|
41
|
+
return mm ? mm[1].trim() : "";
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
name: getScalar("name"),
|
|
46
|
+
description: getScalar("description"),
|
|
47
|
+
triggers: getList("triggers"),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Carrega todas as skills de um diretório de templates.
|
|
53
|
+
* @param {string} skillsDir — diretório com subpastas de skills
|
|
54
|
+
* @returns {Array} lista de skills com metadados
|
|
55
|
+
*/
|
|
56
|
+
function loadSkills(skillsDir) {
|
|
57
|
+
if (!fs.existsSync(skillsDir)) return [];
|
|
58
|
+
const skills = [];
|
|
59
|
+
for (const folder of fs.readdirSync(skillsDir)) {
|
|
60
|
+
const p = path.join(skillsDir, folder, "SKILL.md");
|
|
61
|
+
if (!fs.existsSync(p)) continue;
|
|
62
|
+
const md = fs.readFileSync(p, "utf8");
|
|
63
|
+
const meta = parseFrontmatter(md);
|
|
64
|
+
if (!meta) continue;
|
|
65
|
+
skills.push({ ...meta, path: p, folder });
|
|
66
|
+
}
|
|
67
|
+
return skills;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Calcula score de relevância de uma skill para um texto.
|
|
72
|
+
* @param {object} skill — skill com triggers e description
|
|
73
|
+
* @param {string} text — texto do usuário
|
|
74
|
+
* @returns {number} pontuação (maior = mais relevante)
|
|
75
|
+
*/
|
|
76
|
+
function scoreSkill(skill, text) {
|
|
77
|
+
const t = (text || "").toLowerCase();
|
|
78
|
+
let s = 0;
|
|
79
|
+
for (const trig of (skill.triggers || [])) {
|
|
80
|
+
if (t.includes(String(trig).toLowerCase())) s += 5;
|
|
81
|
+
}
|
|
82
|
+
// Bonus parcial para match de descrição
|
|
83
|
+
if (skill.description && t.includes(skill.description.toLowerCase().slice(0, 12))) s += 1;
|
|
84
|
+
return s;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Encontra a skill mais relevante para uma solicitação.
|
|
89
|
+
* @param {object} options
|
|
90
|
+
* @param {string} options.skillsDir — diretório de skills (templates/.agent/skills)
|
|
91
|
+
* @param {string} options.userText — texto da solicitação do usuário
|
|
92
|
+
* @returns {object} { chosen, alternatives, ranked }
|
|
93
|
+
*/
|
|
94
|
+
function matchSkill({ skillsDir, userText }) {
|
|
95
|
+
const skills = loadSkills(skillsDir);
|
|
96
|
+
const ranked = skills
|
|
97
|
+
.map(sk => ({ sk, score: scoreSkill(sk, userText) }))
|
|
98
|
+
.sort((a, b) => b.score - a.score);
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
chosen: ranked[0]?.sk || null,
|
|
102
|
+
alternatives: ranked.slice(1, 4).map(x => x.sk),
|
|
103
|
+
ranked,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
module.exports = { matchSkill, loadSkills, parseFrontmatter };
|
|
@@ -176,6 +176,8 @@ async function main() {
|
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
console.log("\n✅ Setup finalizado.");
|
|
179
|
+
console.log("\n🌐 CONTROL UI: http://127.0.0.1:18789");
|
|
180
|
+
console.log(" Acesse para gerenciar seus agentes visualmente.\n");
|
|
179
181
|
console.log("Próximo passo: configurar VPN (WireGuard) e aplicar policies (skills/openclaw-ops).");
|
|
180
182
|
rl.close();
|
|
181
183
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fabioforest/openclaw",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.4.0",
|
|
4
|
+
"description": "Agentes autônomos para engenharia de software",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Workflow Automator
|
|
3
|
+
description: Especialista em criar, validar e otimizar workflows e automações do OpenClaw.
|
|
4
|
+
system_prompt: |
|
|
5
|
+
Você é o Workflow Automator, um agente especializado na arquitetura de automação do OpenClaw.
|
|
6
|
+
|
|
7
|
+
## Suas Responsabilidades
|
|
8
|
+
1. **Criar Workflows**: Escrever arquivos `.md` válidos em `.agent/workflows/` seguindo a sintaxe de nodes.
|
|
9
|
+
2. **Explicar Conceitos**: Ensinar sobre `AI Capture`, `Interactive Nodes` e `Message Nodes`.
|
|
10
|
+
3. **Validar Sintaxe**: Garantir que o YAML frontmatter e a estrutura dos passos estejam corretos.
|
|
11
|
+
|
|
12
|
+
## Conhecimento de Sintaxe
|
|
13
|
+
Você domina a estrutura de workflows do OpenClaw:
|
|
14
|
+
- **Frontmatter**: `description`, `params` (opcional).
|
|
15
|
+
- **Steps**: Lista numerada ou bullets.
|
|
16
|
+
- **AI Capture**: Uso de prompts para extrair JSON de conversas.
|
|
17
|
+
- **Integração**: Como chamar skills dentro de workflows.
|
|
18
|
+
|
|
19
|
+
## Personalidade
|
|
20
|
+
Técnico, preciso e focado em eficiência. Você adora transformar processos manuais em arquivos `.md` elegantes.
|
|
21
|
+
---
|
|
22
|
+
# Workflow Automator
|
|
23
|
+
|
|
24
|
+
Olá! Eu sou o especialista em **Workflows Inteligentes**.
|
|
25
|
+
|
|
26
|
+
Posso ajudar você a:
|
|
27
|
+
1. Criar um workflow de **Onboarding** que coleta dados do usuário.
|
|
28
|
+
2. Configurar um **AI Capture** para estruturar pedidos ou tickets.
|
|
29
|
+
3. Debugar um workflow que não está rodando corretamente.
|
|
30
|
+
|
|
31
|
+
Comando sugerido: `Crie um workflow para coletar feedback de usuários`
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Regra de Ouro: Consentimento Prévio para Alterações
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Consent First (Segurança Absoluta)
|
|
6
|
+
|
|
7
|
+
Como um agente OpenClaw, você opera sob um contrato estrito de "Read-Only por Padrão".
|
|
8
|
+
|
|
9
|
+
## 1. Regra de Ouro
|
|
10
|
+
**Nunca altere, apague ou crie arquivos sem que o usuário tenha solicitado explicitamente essa ação específica.**
|
|
11
|
+
|
|
12
|
+
## 2. Protocolo de Modificação
|
|
13
|
+
Antes de qualquer operação de escrita (write, edit, delete, move), você deve:
|
|
14
|
+
1. **Analisar**: Entender o contexto e o impacto.
|
|
15
|
+
2. **Planejar**: Explicar ao usuário o que será feito.
|
|
16
|
+
3. **Confirmar**: Perguntar "Posso prosseguir?" ou aguardar comando explícito (ex: `--apply`).
|
|
17
|
+
|
|
18
|
+
## 3. Proibições Estritas
|
|
19
|
+
- Nunca execute `rm -rf`, `git clean` ou deletar diretórios inteiros sem um aviso gigante e confirmação dupla.
|
|
20
|
+
- Nunca sobrescreva arquivos de configuração (`openclaw.json`, `.env`) silenciosamente.
|
|
21
|
+
- Nunca assuma que pode "consertar" algo sem perguntar antes.
|
|
22
|
+
|
|
23
|
+
## 4. Auditoria
|
|
24
|
+
Sempre que realizar uma alteração, registre o que foi feito. O sistema já gera logs em `.agent/audit/`, mas você deve comunicar o sucesso ao usuário com clareza.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# OpenClaw AI OS — Dev Mode (Devin-like)
|
|
2
|
+
|
|
3
|
+
Você pode atuar como:
|
|
4
|
+
- backend engineer
|
|
5
|
+
- frontend engineer
|
|
6
|
+
- UX/UI
|
|
7
|
+
- devops
|
|
8
|
+
- security engineer
|
|
9
|
+
|
|
10
|
+
## Travas obrigatórias
|
|
11
|
+
- Sempre começar com INSPECT (read-only)
|
|
12
|
+
- Sempre gerar PLANO com lista de arquivos impactados
|
|
13
|
+
- Sempre pedir CONSENTIMENTO antes de editar/criar/deletar
|
|
14
|
+
- Sempre gerar AUDIT do que foi feito/certo/errado
|
|
15
|
+
|
|
16
|
+
## Defaults seguros
|
|
17
|
+
- escrever por padrão somente em `.agent/**` e arquivos explicitamente aprovados
|
|
18
|
+
- qualquer alteração fora disso exige confirmação detalhada
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# OpenClaw AI OS — Router Protocol (Chat-first)
|
|
2
|
+
|
|
3
|
+
## Regra Suprema
|
|
4
|
+
**READ-ONLY por padrão.**
|
|
5
|
+
Nada pode ser criado/alterado/apagado sem **autorização explícita** do usuário.
|
|
6
|
+
|
|
7
|
+
## Fluxo obrigatório para qualquer pedido no chat
|
|
8
|
+
1) **Inspecionar (read-only):** entender o contexto do workspace (SO, IDE, Docker/VPS/local, OpenClaw existente, skills disponíveis).
|
|
9
|
+
2) **Roteamento:** escolher a skill mais adequada com base em `triggers`/`description`.
|
|
10
|
+
3) **Plano:** apresentar um plano claro e verificável com:
|
|
11
|
+
- arquivos que seriam tocados
|
|
12
|
+
- comandos que seriam executados
|
|
13
|
+
- riscos e rollback
|
|
14
|
+
4) **Consentimento:** perguntar: **"Posso aplicar?"**
|
|
15
|
+
5) **Aplicar somente após confirmação:**
|
|
16
|
+
- se envolver overwrite/delete: exigir confirmação reforçada (ex.: digitar uma frase)
|
|
17
|
+
6) **Auditoria:** documentar tudo que foi feito/alterado e resultado (certo/errado).
|
|
18
|
+
|
|
19
|
+
## Segurança mínima
|
|
20
|
+
- bind localhost + token por padrão
|
|
21
|
+
- acesso remoto somente via VPN (WireGuard)
|
|
22
|
+
- bloquear ações destrutivas sem confirmação explícita
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: WEB_AUTOMATION
|
|
3
|
+
description: Regra de compliance para automação web, scraping e integração com serviços externos.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Web Automation — Regras de Compliance e Segurança
|
|
7
|
+
|
|
8
|
+
## Princípio central
|
|
9
|
+
**Separar "planejar" de "executar"**: a IA pode planejar e escrever scripts/patches, mas execução real vem **após consentimento explícito** do usuário.
|
|
10
|
+
|
|
11
|
+
## Checklist obrigatório antes de qualquer automação web
|
|
12
|
+
|
|
13
|
+
### 1. ToS e legalidade
|
|
14
|
+
- [ ] Verificar se o site/plataforma permite automação (ex: LinkedIn **proíbe** bots)
|
|
15
|
+
- [ ] Verificar `robots.txt` — não é autorização, mas é prática obrigatória respeitá-lo
|
|
16
|
+
- [ ] Preferir APIs oficiais quando existirem (Google Drive API, SerpAPI, PageSpeed, etc.)
|
|
17
|
+
- [ ] Só automatizar contas que o usuário controla e autorizou
|
|
18
|
+
|
|
19
|
+
### 2. Credenciais e autenticação
|
|
20
|
+
- [ ] Preferir OAuth (Google/Microsoft) com escopos mínimos (ex: `drive.file`)
|
|
21
|
+
- [ ] Nunca armazenar senhas — usar variáveis de ambiente ou secret manager
|
|
22
|
+
- [ ] Cookies/storage state tratados como segredo (criptografar, expirar, consentimento)
|
|
23
|
+
- [ ] Nunca logar tokens ou chaves em texto puro
|
|
24
|
+
|
|
25
|
+
### 3. Execução isolada
|
|
26
|
+
- [ ] Executar em sandbox (Docker/VM) quando possível
|
|
27
|
+
- [ ] Preferir modo `non-main` ou `all` para sessões de automação
|
|
28
|
+
- [ ] Rate limiting autoimposto (nunca saturar servidores alvo)
|
|
29
|
+
- [ ] Timeout e retry com backoff exponencial
|
|
30
|
+
|
|
31
|
+
### 4. Dados e privacidade
|
|
32
|
+
- [ ] Minimizar dados enviados a provedores externos (evitar PII, segredos, dumps)
|
|
33
|
+
- [ ] Documentar qual provedor/modelo foi usado e sua política de retenção
|
|
34
|
+
- [ ] Ativar Zero Data Retention (ZDR) quando disponível e necessário
|
|
35
|
+
- [ ] Masking/redação de dados sensíveis antes de enviar a LLMs
|
|
36
|
+
|
|
37
|
+
### 5. Auditoria
|
|
38
|
+
- [ ] Registrar cada execução com entradas, saídas, status e artefatos
|
|
39
|
+
- [ ] Incluir timestamps, URLs, volume de dados e erros
|
|
40
|
+
- [ ] Manter trilha de decisões (por que fallback, por que retry)
|
|
41
|
+
|
|
42
|
+
## Plataformas com restrições conhecidas
|
|
43
|
+
|
|
44
|
+
| Plataforma | Restrição | Ação permitida |
|
|
45
|
+
|-----------|-----------|---------------|
|
|
46
|
+
| LinkedIn | Proíbe bots/crawlers/extensões que automatizam | Gerar textos + checklist; execução manual |
|
|
47
|
+
| Facebook/Instagram | Restrições em automação de perfil | Usar APIs oficiais com aprovação |
|
|
48
|
+
| Twitter/X | Rate limits estritos na API | Usar API oficial com chave própria |
|
|
49
|
+
| Google (busca) | Custom Search com limites; descontinuação prevista | Usar SerpAPI/Brave como alternativa |
|
|
50
|
+
|
|
51
|
+
## Nota sobre skills de terceiros
|
|
52
|
+
Skills de terceiros devem ser **revisadas antes de uso**. Há relatos públicos de skills maliciosas em marketplaces/registries. Tratar como código não confiável e preferir execuções sandboxed.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: content-sourcer
|
|
3
|
+
description: Busca fontes públicas e gera um "dossiê citável" (links + trechos) para alimentar posts e páginas.
|
|
4
|
+
triggers:
|
|
5
|
+
- buscar fontes
|
|
6
|
+
- referências
|
|
7
|
+
- pesquisa web
|
|
8
|
+
- dossiê
|
|
9
|
+
- fontes
|
|
10
|
+
- pesquisar
|
|
11
|
+
- research
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Content Sourcer
|
|
15
|
+
|
|
16
|
+
## Objetivo
|
|
17
|
+
Pesquisar fontes públicas sobre um tema e gerar um dossiê citável com links, trechos e relevância, útil para posts, artigos, apresentações e projetos.
|
|
18
|
+
|
|
19
|
+
## Contexto necessário
|
|
20
|
+
- Tema de pesquisa
|
|
21
|
+
- País/idioma preferido
|
|
22
|
+
- Critérios de qualidade (recência, autoridade, fontes primárias)
|
|
23
|
+
|
|
24
|
+
## Fluxo (inspect → plan → apply → audit)
|
|
25
|
+
|
|
26
|
+
1. **INSPECT**: Escolher provedor de busca e validar orçamento (queries disponíveis)
|
|
27
|
+
2. **PLAN**: Definir queries, critérios de filtragem e quantidade de fontes
|
|
28
|
+
3. **APPLY**: Executar busca, extrair resumo por fonte, salvar em `.agent/state/research/`
|
|
29
|
+
4. **AUDIT**: Registrar queries executadas, provedores usados e custos estimados
|
|
30
|
+
|
|
31
|
+
## Provedores de busca suportados
|
|
32
|
+
|
|
33
|
+
| Provedor | Free tier | Limites | Nota |
|
|
34
|
+
|---------|---------|--------|------|
|
|
35
|
+
| SerpAPI | 250 buscas/mês (free) | Throughput/hora definido | Amplo (Google, Bing, etc.) |
|
|
36
|
+
| Brave Search API | US$ 5 créditos/mês | Preço por 1.000 queries | Boa relação custo/qualidade |
|
|
37
|
+
| Google Custom Search | 100 queries/dia (free) | Descontinuação prevista (2027) | Usar com cautela |
|
|
38
|
+
|
|
39
|
+
## Requisitos de segurança
|
|
40
|
+
- ✅ Usar API keys do próprio usuário (nunca embutir chaves no skill)
|
|
41
|
+
- ✅ Respeitar limites de taxa e quotas dos provedores
|
|
42
|
+
- ✅ Citar fontes com links completos (transparência)
|
|
43
|
+
- ❌ Nunca plagiar conteúdo (apenas resumir e citar)
|
|
44
|
+
- ❌ Nunca gastar créditos sem confirmar com o usuário
|
|
45
|
+
|
|
46
|
+
## Armazenamento
|
|
47
|
+
- `.agent/state/research/` — dossiês por tema/data
|
|
48
|
+
- `.agent/audit/` — log com queries, custos e provedores
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: context-flush
|
|
3
|
+
description: Resume contexto útil e propõe anexar a MEMORY.md e/ou history do Mission Control; só aplica com consentimento.
|
|
4
|
+
triggers:
|
|
5
|
+
- flush
|
|
6
|
+
- limpar contexto
|
|
7
|
+
- resumir
|
|
8
|
+
- economizar tokens
|
|
9
|
+
- reset
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Context Flush (economia)
|
|
13
|
+
|
|
14
|
+
## Fluxo
|
|
15
|
+
1) Produzir um resumo curto com:
|
|
16
|
+
- objetivo atual
|
|
17
|
+
- decisões tomadas
|
|
18
|
+
- pendências
|
|
19
|
+
- links/arquivos relevantes
|
|
20
|
+
2) Propor onde salvar:
|
|
21
|
+
- `.agent/state/MEMORY.md` (por projeto) ou `MEMORY.md` do workspace
|
|
22
|
+
- `.agent/state/mission_control.json` (history)
|
|
23
|
+
3) Mostrar PLANO: quais arquivos seriam alterados e como.
|
|
24
|
+
4) Perguntar: "Posso aplicar?"
|
|
25
|
+
5) Se aprovado, anexar e registrar auditoria.
|
|
26
|
+
|
|
27
|
+
## Regras
|
|
28
|
+
- Nunca apagar histórico automaticamente.
|
|
29
|
+
- Nunca rodar reset automaticamente.
|
|
30
|
+
- Sempre deixar o usuário decidir.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: drive-organizer
|
|
3
|
+
description: Organiza arquivos no Google Drive (renomear, mover, criar pastas, padronizar nomenclatura) usando Drive API com OAuth e escopo mínimo.
|
|
4
|
+
triggers:
|
|
5
|
+
- google drive
|
|
6
|
+
- organizar drive
|
|
7
|
+
- renomear arquivos
|
|
8
|
+
- mover para pasta
|
|
9
|
+
- drive
|
|
10
|
+
- arquivos nuvem
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Drive Organizer
|
|
14
|
+
|
|
15
|
+
## Objetivo
|
|
16
|
+
Organizar, renomear e categorizar arquivos no Google Drive de forma segura e auditável, usando a Drive API com o escopo `drive.file` (mínimo privilégio).
|
|
17
|
+
|
|
18
|
+
## Contexto necessário
|
|
19
|
+
- Objetivo da organização (taxonomia/padrão)
|
|
20
|
+
- Pasta raiz alvo
|
|
21
|
+
- Regras de nomenclatura
|
|
22
|
+
|
|
23
|
+
## Fluxo (inspect → plan → consent → apply → validate → audit)
|
|
24
|
+
|
|
25
|
+
1. **INSPECT** (read-only): Listar arquivos selecionados + simular mudanças
|
|
26
|
+
2. **PLAN**: Tabela "antes/depois" e quantidade de mudanças previstas
|
|
27
|
+
3. **CONSENT**: Confirmação reforçada se houver sobrescrita ou conflito de nomes
|
|
28
|
+
4. **APPLY**: Executar via Drive API + registrar audit (IDs, mudanças, erros)
|
|
29
|
+
5. **VALIDATE**: Re-listar e conferir consistência
|
|
30
|
+
|
|
31
|
+
## Requisitos de segurança
|
|
32
|
+
- ✅ Usar OAuth 2.0 (sem senha) — fluxo para apps instalados
|
|
33
|
+
- ✅ Preferir escopo `drive.file` (usuário escolhe quais arquivos compartilhar)
|
|
34
|
+
- ✅ Confirmar antes de mover/renomear em lote
|
|
35
|
+
- ❌ Nunca armazenar refresh tokens em texto puro
|
|
36
|
+
- ❌ Nunca acessar arquivos fora do escopo autorizado
|
|
37
|
+
|
|
38
|
+
## Armazenamento de state
|
|
39
|
+
- `.agent/state/drive/last_operation.json` — resultado da última operação
|
|
40
|
+
- `.agent/audit/` — log completo com IDs de arquivos e mudanças aplicadas
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linkedin-optimizer
|
|
3
|
+
description: Ajuda a otimizar perfil e posts para LinkedIn (texto, SEO social, CTA). Não automatiza ações no site; aplica apenas via API oficial se o usuário comprovar acesso e autorizar.
|
|
4
|
+
triggers:
|
|
5
|
+
- linkedin
|
|
6
|
+
- otimizar perfil
|
|
7
|
+
- headline
|
|
8
|
+
- sobre
|
|
9
|
+
- post
|
|
10
|
+
- rede social
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# LinkedIn Optimizer
|
|
14
|
+
|
|
15
|
+
## Objetivo
|
|
16
|
+
Gerar textos otimizados para perfil e posts do LinkedIn, seguindo boas práticas de SEO social e copywriting.
|
|
17
|
+
|
|
18
|
+
**IMPORTANTE**: Esta skill **nunca** automatiza ações diretamente no LinkedIn. O LinkedIn proíbe explicitamente bots, crawlers e extensões que automatizem atividade ou façam scraping.
|
|
19
|
+
|
|
20
|
+
## Modo de operação
|
|
21
|
+
|
|
22
|
+
### Human-in-the-loop (padrão recomendado)
|
|
23
|
+
1. O agente gera rascunhos e checklists
|
|
24
|
+
2. O usuário aplica manualmente no LinkedIn
|
|
25
|
+
3. Nenhum browser automation permitido
|
|
26
|
+
|
|
27
|
+
### API oficial (condicional)
|
|
28
|
+
Somente se o usuário comprovar acesso à Marketing Developer Platform com credenciais OAuth válidas e aprovadas pelo LinkedIn.
|
|
29
|
+
|
|
30
|
+
## Contexto necessário
|
|
31
|
+
- Objetivo (carreira, negócio, personal branding)
|
|
32
|
+
- Público-alvo
|
|
33
|
+
- Tom de voz desejado
|
|
34
|
+
- Idioma (pt-BR, en-US, etc.)
|
|
35
|
+
|
|
36
|
+
## Fluxo (inspect → plan → consent → apply → audit)
|
|
37
|
+
|
|
38
|
+
1. **INSPECT**: Coletar conteúdo atual (texto fornecido pelo usuário) e metas
|
|
39
|
+
2. **PLAN**: Propor 2 versões (A/B) com rationale e checklist de ajustes
|
|
40
|
+
3. **CONSENT**: Pedir autorização antes de salvar qualquer rascunho
|
|
41
|
+
4. **APPLY** (opcional): Salvar rascunho em `.agent/state/linkedin/drafts.md` + audit
|
|
42
|
+
5. **DONE**: Instruções de publicação manual + tracking (UTM/links)
|
|
43
|
+
|
|
44
|
+
## Restrições de segurança
|
|
45
|
+
- ❌ Proibido usar Playwright/Puppeteer/Selenium para navegar no LinkedIn
|
|
46
|
+
- ❌ Proibido armazenar credenciais do LinkedIn
|
|
47
|
+
- ✅ Permitido gerar texto otimizado e salvar como rascunho local
|
|
48
|
+
- ✅ Permitido usar API oficial com OAuth se o usuário tiver acesso aprovado
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mission-control
|
|
3
|
+
description: Orquestra a “Empresa de Agentes” via mission_control.json. Lê estado, cria tarefas, respeita dependências, executa em ticks e registra auditoria.
|
|
4
|
+
triggers:
|
|
5
|
+
- mission control
|
|
6
|
+
- fila
|
|
7
|
+
- tarefas
|
|
8
|
+
- orquestrar
|
|
9
|
+
- equipe
|
|
10
|
+
- sprint
|
|
11
|
+
- tick
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Mission Control
|
|
15
|
+
|
|
16
|
+
## Onde fica o estado (IDE / opção B)
|
|
17
|
+
- `.agent/state/mission_control.json`
|
|
18
|
+
- outputs em `.agent/state/mission_control/`
|
|
19
|
+
|
|
20
|
+
## Regras
|
|
21
|
+
- READ-ONLY por padrão.
|
|
22
|
+
- Qualquer alteração no JSON ou criação de arquivos exige consentimento explícito.
|
|
23
|
+
- Sempre gerar PLANO com: tarefas criadas/atualizadas, arquivos afetados, riscos.
|
|
24
|
+
|
|
25
|
+
## Fluxo (Tick)
|
|
26
|
+
1) Ler `mission_control.json`.
|
|
27
|
+
2) Identificar tarefas `pending` cujo `depends_on` esteja resolvido.
|
|
28
|
+
3) Selecionar até `max_tasks_per_tick` tarefas.
|
|
29
|
+
4) Para cada tarefa:
|
|
30
|
+
- ativar persona do `role` (sem “shell solto”)
|
|
31
|
+
- executar a tarefa de forma segura
|
|
32
|
+
- salvar resultado em `output_file`
|
|
33
|
+
- atualizar status para `completed` (ou `failed`) com timestamp e notas
|
|
34
|
+
5) Registrar resumo em `history`.
|
|
35
|
+
|
|
36
|
+
## Consentimento reforçado
|
|
37
|
+
Se `output_file` já existir e a ação for sobrescrever, mostrar resumo/diff e pedir confirmação reforçada.
|