@fabioforest/openclaw 3.4.0 → 3.5.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/README.md +615 -46
- package/bin/openclaw.js +2 -0
- package/lib/cli/uninstall.js +194 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,73 +1,623 @@
|
|
|
1
|
-
# OpenClaw OS
|
|
1
|
+
# 🦀 OpenClaw AI OS
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Sistema universal de agentes para IDEs** — instale, configure e use via chat ou terminal.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
O OpenClaw transforma qualquer projeto em um workspace inteligente com skills, regras de segurança e roteamento econômico de modelos de IA. Funciona em **Cursor, VSCode, Gemini Code Assist, Antigravity** e qualquer IDE com suporte a agentes.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📦 Instalação
|
|
10
|
+
|
|
11
|
+
### Opção 1: Via npx (recomendado — sem instalar nada)
|
|
6
12
|
|
|
7
13
|
```bash
|
|
8
|
-
#
|
|
14
|
+
# Simula o que será feito (modo seguro, não altera nada)
|
|
9
15
|
npx @fabioforest/openclaw init
|
|
10
16
|
|
|
11
|
-
#
|
|
17
|
+
# Instala de fato no projeto
|
|
18
|
+
npx @fabioforest/openclaw init --apply
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Opção 2: Instalação global
|
|
22
|
+
|
|
23
|
+
```bash
|
|
12
24
|
npm install -g @fabioforest/openclaw
|
|
13
|
-
openclaw init
|
|
25
|
+
openclaw init --apply
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Opção 3: Instalação completa para IDEs
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Instala o "AI OS" com skills, rules, state e hooks
|
|
32
|
+
npx @fabioforest/openclaw ide install --apply
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
> **💡 Dica**: Todos os comandos operam em **modo PLAN por padrão** (read-only). Nada é alterado sem `--apply`.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 🎯 Quando usar cada comando
|
|
40
|
+
|
|
41
|
+
### Resumo rápido
|
|
42
|
+
|
|
43
|
+
| Situação | Comando | O que faz |
|
|
44
|
+
|----------|---------|-----------|
|
|
45
|
+
| Primeira vez no projeto | `init --apply` | Cria `.agent/` com templates |
|
|
46
|
+
| Atualizar skills/rules | `update --apply` | Atualiza preservando customizações |
|
|
47
|
+
| Desinstalar do projeto | `uninstall --apply` | Remove `.agent/` com backup |
|
|
48
|
+
| Ver o que está instalado | `status` | Lista componentes e config |
|
|
49
|
+
| Algo não funciona | `doctor` | Diagnóstico completo |
|
|
50
|
+
| Quero entender meu ambiente | `inspect` | Análise 100% read-only |
|
|
51
|
+
| Preciso de ajuda geral | `assist` | Assistente com roteamento de skills |
|
|
52
|
+
| Instalar AI OS na IDE | `ide install --apply` | Skills + rules + state + hooks |
|
|
53
|
+
| Verificar IDE configurada | `ide doctor` | Checa se tudo está "armado" |
|
|
54
|
+
| Configurar do zero | `setup` | Wizard interativo passo a passo |
|
|
55
|
+
| Problemas de rede/VPN | `debug` | Diagnóstico de conectividade |
|
|
56
|
+
| Instalar ou reparar (automático) | `check` | Orquestrador inteligente |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 📖 Manual de Uso Detalhado
|
|
61
|
+
|
|
62
|
+
### `openclaw init` — Instalar no projeto
|
|
63
|
+
|
|
64
|
+
**Quando usar:** Primeira vez que você quer adicionar o OpenClaw a um projeto.
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# 1. Primeiro, simule para ver o que vai acontecer
|
|
68
|
+
npx @fabioforest/openclaw init
|
|
69
|
+
# → Mostra plano: "CREATE .agent/", "COPY templates", "CREATE openclaw.json"
|
|
70
|
+
# → Nenhum arquivo é criado
|
|
71
|
+
|
|
72
|
+
# 2. Se estiver tudo certo, aplique
|
|
73
|
+
npx @fabioforest/openclaw init --apply
|
|
74
|
+
# → Cria .agent/ com skills, rules, hooks e workflows
|
|
75
|
+
# → Cria openclaw.json com configurações default
|
|
76
|
+
|
|
77
|
+
# 3. Se já existe e quer sobrescrever (exige confirmação forte)
|
|
78
|
+
npx @fabioforest/openclaw init --apply --force
|
|
79
|
+
# → Pede para digitar "DESTROY .agent" para confirmar
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Flags disponíveis:**
|
|
83
|
+
|
|
84
|
+
| Flag | O que faz |
|
|
85
|
+
|------|-----------|
|
|
86
|
+
| `--apply` | Executa de fato (sem isso, só simula) |
|
|
87
|
+
| `--force` | Permite sobrescrever `.agent/` existente |
|
|
88
|
+
| `--path ./dir` | Instala em outro diretório |
|
|
89
|
+
| `--yes` | Pula confirmações interativas |
|
|
90
|
+
| `--no-audit` | Não gera log de auditoria |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### `openclaw update` — Atualizar templates
|
|
95
|
+
|
|
96
|
+
**Quando usar:** Quando sair uma versão nova do OpenClaw e você quiser atualizar skills/rules sem perder customizações.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Simula a atualização (mostra o que mudou)
|
|
100
|
+
npx @fabioforest/openclaw update
|
|
101
|
+
|
|
102
|
+
# Aplica a atualização
|
|
103
|
+
npx @fabioforest/openclaw update --apply
|
|
104
|
+
|
|
105
|
+
# Merge seguro (preserva customizações)
|
|
106
|
+
npx @fabioforest/openclaw update --apply --merge
|
|
14
107
|
```
|
|
15
108
|
|
|
16
|
-
|
|
109
|
+
**Como funciona:**
|
|
110
|
+
- Compara cada arquivo por hash SHA-256
|
|
111
|
+
- Se você customizou um arquivo, faz backup (`.bak`) antes de atualizar
|
|
112
|
+
- Novos templates são copiados normalmente
|
|
113
|
+
- Tudo é registrado em `.agent/audit/`
|
|
114
|
+
|
|
115
|
+
---
|
|
17
116
|
|
|
18
|
-
|
|
19
|
-
|---------|-----------|
|
|
20
|
-
| `openclaw init` | Instala templates `.agent/` no projeto |
|
|
21
|
-
| `openclaw update` | Atualiza templates preservando customizações |
|
|
22
|
-
| `openclaw status` | Mostra status da instalação |
|
|
23
|
-
| `openclaw doctor` | Healthcheck automatizado do ambiente |
|
|
24
|
-
| `openclaw setup` | Roda wizard interativo de configuração |
|
|
117
|
+
---
|
|
25
118
|
|
|
26
|
-
###
|
|
119
|
+
### `openclaw uninstall` — Desinstalar do projeto
|
|
120
|
+
|
|
121
|
+
**Quando usar:** Quando quiser remover completamente o OpenClaw de um projeto.
|
|
27
122
|
|
|
28
123
|
```bash
|
|
29
|
-
|
|
30
|
-
openclaw
|
|
31
|
-
|
|
124
|
+
# 1. Simula a remoção (mostra o que seria deletado)
|
|
125
|
+
npx @fabioforest/openclaw uninstall
|
|
126
|
+
# → Mostra tree de .agent/ e openclaw.json
|
|
127
|
+
# → Alerta sobre audit logs e state que seriam perdidos
|
|
128
|
+
# → Nenhum arquivo é removido
|
|
129
|
+
|
|
130
|
+
# 2. Aplica a remoção (com backup automático)
|
|
131
|
+
npx @fabioforest/openclaw uninstall --apply
|
|
132
|
+
# → Pede para digitar "UNINSTALL" como confirmação
|
|
133
|
+
# → Oferece fazer backup (.agent.backup-<timestamp>/)
|
|
134
|
+
# → Remove .agent/ e openclaw.json
|
|
135
|
+
# → Salva log de auditoria no diretório
|
|
136
|
+
|
|
137
|
+
# 3. Remoção forçada (sem backup, com --yes pula confirmação)
|
|
138
|
+
npx @fabioforest/openclaw uninstall --apply --force --yes
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Saída de exemplo (modo PLAN):**
|
|
142
|
+
|
|
32
143
|
```
|
|
144
|
+
🗑️ OpenClaw Uninstall
|
|
145
|
+
|
|
146
|
+
📂 Diretório: /home/user/meu-projeto
|
|
147
|
+
|
|
148
|
+
🔴 REMOVER .agent/ (25 arquivos)
|
|
149
|
+
📁 agents (3 arquivos)
|
|
150
|
+
📁 audit (1 arquivos)
|
|
151
|
+
📁 hooks (1 arquivos)
|
|
152
|
+
📁 rules (5 arquivos)
|
|
153
|
+
📁 skills (11 arquivos)
|
|
154
|
+
📁 workflows (7 arquivos)
|
|
155
|
+
🔴 REMOVER openclaw.json
|
|
156
|
+
|
|
157
|
+
⚠️ 1 log(s) de auditoria serão perdidos!
|
|
158
|
+
|
|
159
|
+
🔒 Modo PLAN (Read-Only). Nenhuma alteração feita.
|
|
160
|
+
Para desinstalar, rode: npx @fabioforest/openclaw uninstall --apply
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
33
164
|
|
|
34
|
-
|
|
165
|
+
### `openclaw inspect` — Analisar ambiente (read-only)
|
|
35
166
|
|
|
36
|
-
|
|
167
|
+
**Quando usar:** Antes de qualquer ação, para entender o contexto. 100% read-only — nunca altera nada.
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
npx @fabioforest/openclaw inspect
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Saída de exemplo:**
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
🔎 OpenClaw Inspect (Read-Only)
|
|
177
|
+
|
|
178
|
+
🖥️ Plataforma: darwin
|
|
179
|
+
🐳 Docker: false
|
|
180
|
+
🪟 WSL: false
|
|
181
|
+
💻 IDE: cursor
|
|
182
|
+
📂 Path: /home/user/meu-projeto
|
|
183
|
+
📦 OpenClaw instalado: Sim
|
|
184
|
+
📋 Config: Sim
|
|
185
|
+
🐙 Git repo: Sim
|
|
186
|
+
|
|
187
|
+
🧠 Skills instaladas (15):
|
|
188
|
+
• content-sourcer • context-flush
|
|
189
|
+
• drive-organizer • linkedin-optimizer
|
|
190
|
+
• mission-control • openclaw-router
|
|
191
|
+
• smart-router • web-scraper
|
|
192
|
+
...
|
|
193
|
+
|
|
194
|
+
✅ Inspect concluído (nenhuma alteração feita).
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Modo JSON (para automações):**
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
npx @fabioforest/openclaw inspect --quiet
|
|
201
|
+
# → Retorna JSON puro, ideal para pipes e scripts
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
### `openclaw assist` — Assistente geral com roteamento
|
|
207
|
+
|
|
208
|
+
**Quando usar:** Quando não sabe qual skill usar. O assist analisa sua solicitação e sugere a skill mais adequada.
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
npx @fabioforest/openclaw assist
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Como funciona:**
|
|
215
|
+
1. Detecta contexto (IDE, plataforma, skills disponíveis)
|
|
216
|
+
2. Pede sua solicitação em linguagem natural
|
|
217
|
+
3. Roteia para a skill mais relevante via triggers
|
|
218
|
+
4. Mostra alternativas e protocolo recomendado
|
|
219
|
+
|
|
220
|
+
**Exemplo de interação:**
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
🧠 OpenClaw Assist — Modo PLAN por padrão (seguro)
|
|
224
|
+
IDE: cursor | OpenClaw: instalado
|
|
225
|
+
|
|
226
|
+
Descreva o que deseja fazer:
|
|
227
|
+
> otimizar meu perfil do linkedin
|
|
228
|
+
|
|
229
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
230
|
+
🎯 Skill selecionada: linkedin-optimizer
|
|
231
|
+
Descrição: Ajuda a otimizar perfil e posts para LinkedIn
|
|
232
|
+
|
|
233
|
+
Alternativas:
|
|
234
|
+
• content-sourcer: Busca fontes públicas
|
|
235
|
+
• smart-router: Roteia para perfis de modelo
|
|
236
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
### `openclaw ide install` — Instalar AI OS na IDE
|
|
242
|
+
|
|
243
|
+
**Quando usar:** Para preparar sua IDE para usar o OpenClaw como agente via chat. Instala skills, rules, hooks e state templates.
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# Simula a instalação (mostra o plano)
|
|
247
|
+
npx @fabioforest/openclaw ide install
|
|
248
|
+
|
|
249
|
+
# Aplica a instalação
|
|
250
|
+
npx @fabioforest/openclaw ide install --apply
|
|
251
|
+
|
|
252
|
+
# Força reinstalação completa
|
|
253
|
+
npx @fabioforest/openclaw ide install --apply --force
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**O que é instalado:**
|
|
37
257
|
|
|
38
258
|
```
|
|
39
259
|
.agent/
|
|
40
|
-
├── agents/ # Personas
|
|
41
|
-
├── hooks/ #
|
|
42
|
-
├── rules/ #
|
|
43
|
-
├──
|
|
44
|
-
│ ├──
|
|
45
|
-
│
|
|
46
|
-
|
|
260
|
+
├── agents/ # Personas (sysadmin, automator, setup)
|
|
261
|
+
├── hooks/ # pre-tool-use.js (bloqueia comandos destrutivos)
|
|
262
|
+
├── rules/ # 5 regras de segurança
|
|
263
|
+
│ ├── CONSENT_FIRST.md
|
|
264
|
+
│ ├── SECURITY.md
|
|
265
|
+
│ ├── ROUTER_PROTOCOL.md
|
|
266
|
+
│ ├── DEV_MODE.md
|
|
267
|
+
│ └── WEB_AUTOMATION.md
|
|
268
|
+
├── skills/ # 15 skills disponíveis
|
|
269
|
+
│ ├── openclaw-router/ # Roteador central chat-first
|
|
270
|
+
│ ├── openclaw-inspect/ # Inspeção read-only
|
|
271
|
+
│ ├── smart-router/ # Roteador econômico de modelos
|
|
272
|
+
│ ├── mission-control/ # Empresa de Agentes
|
|
273
|
+
│ ├── linkedin-optimizer/ # Otimização de LinkedIn
|
|
274
|
+
│ ├── drive-organizer/ # Google Drive via API
|
|
275
|
+
│ ├── site-tester/ # Lighthouse + Playwright
|
|
276
|
+
│ ├── web-scraper/ # Scraping responsável
|
|
277
|
+
│ ├── content-sourcer/ # Pesquisa de fontes
|
|
278
|
+
│ └── ... (+ 6 skills operacionais)
|
|
279
|
+
├── state/ # Estado persistente
|
|
280
|
+
│ ├── mission_control.json # Empresa de Agentes
|
|
281
|
+
│ └── MEMORY.md # Memória do workspace
|
|
282
|
+
└── workflows/ # Slash commands e runbooks
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
### `openclaw ide doctor` — Verificar IDE
|
|
288
|
+
|
|
289
|
+
**Quando usar:** Para confirmar que sua IDE está "armada" com todas as regras e skills necessárias.
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
npx @fabioforest/openclaw ide doctor
|
|
47
293
|
```
|
|
48
294
|
|
|
49
|
-
|
|
295
|
+
**Saída de exemplo:**
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
🏥 IDE Doctor — Verificando instalação para IDE:
|
|
50
299
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
| 06 | Audit Logging | Log JSON com redaction de segredos |
|
|
59
|
-
| 07 | Safe Update | Canary + rollback automático |
|
|
60
|
-
| 08 | Healthchecks | Circuit breaker + auto-restart |
|
|
300
|
+
✅ .agent/
|
|
301
|
+
✅ rules/CONSENT_FIRST.md
|
|
302
|
+
✅ rules/ROUTER_PROTOCOL.md
|
|
303
|
+
✅ skills/openclaw-router/SKILL.md
|
|
304
|
+
✅ skills/openclaw-inspect/SKILL.md
|
|
305
|
+
✅ skills/openclaw-dev/SKILL.md
|
|
306
|
+
✅ hooks/pre-tool-use.js
|
|
61
307
|
|
|
62
|
-
|
|
308
|
+
🎉 IDE está totalmente configurada!
|
|
309
|
+
```
|
|
63
310
|
|
|
64
|
-
|
|
65
|
-
- **bind localhost** + **auth token** por padrão
|
|
66
|
-
- **Hook `pre-tool-use`** — bloqueia comandos destrutivos (`rm -rf`, `mkfs`, `dd`, `shutdown`)
|
|
67
|
-
- **Break-glass** — acesso emergencial com expiração automática
|
|
68
|
-
- **Auditoria** — todos os eventos logados com `request_id`
|
|
311
|
+
---
|
|
69
312
|
|
|
70
|
-
|
|
313
|
+
### `openclaw status` — Ver status da instalação
|
|
314
|
+
|
|
315
|
+
**Quando usar:** Para ver rapidamente o que está instalado e configurado.
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
npx @fabioforest/openclaw status
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Mostra: componentes instalados, versão, config ativa (com tokens mascarados).
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
### `openclaw doctor` — Healthcheck completo
|
|
326
|
+
|
|
327
|
+
**Quando usar:** Quando algo não funciona. Faz diagnóstico completo do ambiente.
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
npx @fabioforest/openclaw doctor
|
|
331
|
+
npx @fabioforest/openclaw doctor --quiet # Saída mínima
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Verifica: config, portas, VPN, integridade de arquivos, dependências.
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
### `openclaw setup` — Wizard interativo
|
|
339
|
+
|
|
340
|
+
**Quando usar:** Primeira configuração completa com perguntas guiadas.
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
npx @fabioforest/openclaw setup
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Guia passo a passo para configurar ambiente, modelo de IA, canais e segurança.
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
### `openclaw check` — Orquestrador inteligente
|
|
351
|
+
|
|
352
|
+
**Quando usar:** Quando não sabe se precisa instalar ou reparar. Ele decide por você.
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
npx @fabioforest/openclaw check
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
Detecta se o OpenClaw já existe e oferece opções: instalar, atualizar, reparar ou forçar.
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
### `openclaw debug` — Diagnóstico avançado
|
|
363
|
+
|
|
364
|
+
**Quando usar:** Problemas de rede, VPN, npm ou GitHub.
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
npx @fabioforest/openclaw debug
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
Verifica conectividade, proxy, versões e integridade do ambiente.
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## 🧠 Skills Disponíveis (15)
|
|
375
|
+
|
|
376
|
+
### Core — Infraestrutura do AI OS
|
|
377
|
+
|
|
378
|
+
| Skill | O que faz | Quando usar |
|
|
379
|
+
|-------|-----------|-------------|
|
|
380
|
+
| `openclaw-router` | Roteador central chat-first | Sempre ativo — decide qual skill usar |
|
|
381
|
+
| `openclaw-inspect` | Inspeção read-only | Para analisar sem alterar |
|
|
382
|
+
| `openclaw-dev` | Modo Devin-like | Para criar features, backend, frontend |
|
|
383
|
+
| `openclaw-security` | Hardening | Para melhorar segurança do workspace |
|
|
384
|
+
| `openclaw-assist` | Assistente geral | Para menu de ações e ajuda |
|
|
385
|
+
| `mission-control` | Empresa de Agentes | Para orquestrar múltiplos agentes |
|
|
386
|
+
| `smart-router` | Roteador econômico | Para escolher modelo de IA por custo |
|
|
387
|
+
| `context-flush` | Flush de memória | Para economizar tokens em sessões longas |
|
|
388
|
+
|
|
389
|
+
### Produtividade — Automação e Web
|
|
390
|
+
|
|
391
|
+
| Skill | O que faz | Quando usar |
|
|
392
|
+
|-------|-----------|-------------|
|
|
393
|
+
| `linkedin-optimizer` | Textos para LinkedIn | Para otimizar perfil/posts (human-in-the-loop) |
|
|
394
|
+
| `drive-organizer` | Google Drive via API | Para organizar arquivos na nuvem |
|
|
395
|
+
| `site-tester` | Lighthouse + Playwright | Para testar performance/SEO/acessibilidade |
|
|
396
|
+
| `web-scraper` | Scraping responsável | Para extrair dados de sites |
|
|
397
|
+
| `content-sourcer` | Pesquisa de fontes | Para criar dossiês citáveis |
|
|
398
|
+
|
|
399
|
+
### Operacionais — DevOps e Infra
|
|
400
|
+
|
|
401
|
+
| Skill | O que faz | Quando usar |
|
|
402
|
+
|-------|-----------|-------------|
|
|
403
|
+
| `universal-setup` | Setup em qualquer ambiente | Para instalação em VPS/Docker/Mac/Windows |
|
|
404
|
+
| `openclaw-installation-debugger` | Debug de instalação | Para resolver problemas de setup |
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## 🔒 Segurança
|
|
409
|
+
|
|
410
|
+
O OpenClaw segue 3 princípios fundamentais:
|
|
411
|
+
|
|
412
|
+
### 1. Read-only por padrão
|
|
413
|
+
Todo comando opera em **modo PLAN** (simulação). Nada é alterado sem `--apply`.
|
|
414
|
+
|
|
415
|
+
### 2. Consent-first
|
|
416
|
+
Antes de qualquer alteração, o sistema mostra exatamente o que vai fazer e pede confirmação. Ações destrutivas exigem **confirmação forte** (digitar frase específica).
|
|
417
|
+
|
|
418
|
+
### 3. Audit-first
|
|
419
|
+
Toda ação gera log detalhado em `.agent/audit/` com timestamp, comando, modo, contexto e resultado.
|
|
420
|
+
|
|
421
|
+
### Proteções ativas
|
|
422
|
+
|
|
423
|
+
| Proteção | Como funciona |
|
|
424
|
+
|----------|---------------|
|
|
425
|
+
| **Hook pre-tool-use** | Bloqueia 12+ padrões destrutivos (`rm -rf`, `mkfs`, `dd`, `shutdown`) |
|
|
426
|
+
| **VPN-first** | Sem VPN, sem acesso remoto |
|
|
427
|
+
| **Bind localhost** | Serviços só acessíveis localmente por padrão |
|
|
428
|
+
| **Auth token** | Token obrigatório para acesso |
|
|
429
|
+
| **Break-glass** | Acesso emergencial com expiração automática |
|
|
430
|
+
| **WEB_AUTOMATION rule** | Checklist de compliance para automação web |
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## 💰 Roteador Econômico de Modelos
|
|
435
|
+
|
|
436
|
+
O `smart-router` escolhe automaticamente o modelo de IA mais econômico para cada tarefa:
|
|
437
|
+
|
|
438
|
+
| Perfil | Quando | Provedor default (free) |
|
|
439
|
+
|--------|--------|------------------------|
|
|
440
|
+
| **cheap** | Tarefas simples, formatação, resumos | Gemini Flash-Lite → Groq |
|
|
441
|
+
| **smart** | Planejamento, análise, raciocínio | Gemini Pro → Claude |
|
|
442
|
+
| **coding** | Código, debug, refactor, testes | Gemini Pro → GPT-5.2 |
|
|
443
|
+
|
|
444
|
+
Prioridade: **free-first** — só usa provedores pagos com autorização explícita.
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## 🚀 Guia Rápido: Do Zero ao Funcionando
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
# 1. Instale no seu projeto
|
|
452
|
+
npx @fabioforest/openclaw ide install --apply
|
|
453
|
+
|
|
454
|
+
# 2. Verifique se está tudo OK
|
|
455
|
+
npx @fabioforest/openclaw ide doctor
|
|
456
|
+
|
|
457
|
+
# 3. Analise seu ambiente
|
|
458
|
+
npx @fabioforest/openclaw inspect
|
|
459
|
+
|
|
460
|
+
# 4. Use o assistente
|
|
461
|
+
npx @fabioforest/openclaw assist
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**Ou via chat na IDE (Cursor, VSCode, Antigravity, Gemini):**
|
|
465
|
+
- Basta perguntar no chat! As skills e rules em `.agent/` guiam o agente automaticamente.
|
|
466
|
+
- O `openclaw-router` decide qual skill usar com base nos triggers de cada uma.
|
|
467
|
+
- Tudo segue o fluxo: **INSPECT → PLAN → CONSENT → APPLY → AUDIT**.
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## 💬 Exemplo Real: Usando o OpenClaw na IDE (Chat)
|
|
472
|
+
|
|
473
|
+
O OpenClaw funciona como agente via chat na IDE. Aqui está uma simulação de como seria o fluxo real:
|
|
474
|
+
|
|
475
|
+
### Exemplo 1: Otimizar perfil do LinkedIn
|
|
476
|
+
|
|
477
|
+
```
|
|
478
|
+
👤 Você (chat na IDE):
|
|
479
|
+
"Quero otimizar meu perfil do LinkedIn para vagas de AI Engineer"
|
|
480
|
+
|
|
481
|
+
🤖 Agente (openclaw-router detecta: linkedin-optimizer):
|
|
482
|
+
📋 INSPECT ─ Coletando contexto:
|
|
483
|
+
• Objetivo: otimizar perfil LinkedIn para AI Engineer
|
|
484
|
+
• Idioma: pt-BR
|
|
485
|
+
• Skills instaladas: linkedin-optimizer ✅
|
|
486
|
+
|
|
487
|
+
📝 PLAN ─ Proposta de ações:
|
|
488
|
+
1. Analisar headline atual e propor 2 versões A/B
|
|
489
|
+
2. Reescrever seção "Sobre" com keywords de AI/MLOps
|
|
490
|
+
3. Sugerir ajustes nas experiências com métricas
|
|
491
|
+
4. Gerar checklist de publicação
|
|
492
|
+
|
|
493
|
+
⚠️ RESTRIÇÃO: LinkedIn proíbe automação. Todo conteúdo
|
|
494
|
+
será gerado como rascunho para aplicação manual.
|
|
495
|
+
|
|
496
|
+
Deseja prosseguir? (S/n)
|
|
497
|
+
|
|
498
|
+
👤 Você: "S"
|
|
499
|
+
|
|
500
|
+
🤖 Agente:
|
|
501
|
+
✅ APPLY ─ Rascunhos salvos em .agent/state/linkedin/drafts.md
|
|
502
|
+
|
|
503
|
+
## Headline (opção A)
|
|
504
|
+
"AI Engineer | MLOps | Python | RAG & LLMs | Open Source"
|
|
505
|
+
|
|
506
|
+
## Headline (opção B)
|
|
507
|
+
"Engenheiro de IA | Construindo pipelines de ML em produção"
|
|
508
|
+
|
|
509
|
+
📝 AUDIT ─ log salvo em .agent/audit/
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### Exemplo 2: Testar performance de um site
|
|
513
|
+
|
|
514
|
+
```
|
|
515
|
+
👤 Você:
|
|
516
|
+
"Testa a performance do meu site https://meu-portfolio.dev"
|
|
517
|
+
|
|
518
|
+
🤖 Agente (openclaw-router detecta: site-tester):
|
|
519
|
+
📋 INSPECT:
|
|
520
|
+
• URL: https://meu-portfolio.dev
|
|
521
|
+
• robots.txt: verificado ✅
|
|
522
|
+
• Ferramentas disponíveis: PageSpeed Insights API
|
|
523
|
+
|
|
524
|
+
📝 PLAN:
|
|
525
|
+
1. Rodar Lighthouse via PageSpeed Insights (sem infra local)
|
|
526
|
+
2. Coletar métricas: Performance, SEO, Acessibilidade, PWA
|
|
527
|
+
3. Listar as 5 principais oportunidades de melhoria
|
|
528
|
+
4. Salvar relatório em .agent/state/site-tests/
|
|
529
|
+
|
|
530
|
+
Confirmar execução?
|
|
531
|
+
|
|
532
|
+
👤 Você: "sim"
|
|
533
|
+
|
|
534
|
+
🤖 Agente:
|
|
535
|
+
✅ Resultados:
|
|
536
|
+
• Performance: 87 → otimizar imagens (ganho estimado: +8pts)
|
|
537
|
+
• SEO: 95 ✅
|
|
538
|
+
• Acessibilidade: 72 → falta alt em 3 imagens + contraste baixo
|
|
539
|
+
• PWA: 60 → falta manifest.json e service worker
|
|
540
|
+
|
|
541
|
+
📊 Relatório salvo em .agent/state/site-tests/2026-02-19.json
|
|
542
|
+
📝 Audit salvo
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Exemplo 3: Atualizar skills após nova versão
|
|
546
|
+
|
|
547
|
+
```
|
|
548
|
+
👤 Você:
|
|
549
|
+
"Saiu versão nova do OpenClaw, como atualizo?"
|
|
550
|
+
|
|
551
|
+
🤖 Agente (openclaw-router detecta: assist):
|
|
552
|
+
Recomendo o seguinte fluxo:
|
|
553
|
+
|
|
554
|
+
1. Primeiro, veja o que mudaria (modo PLAN, seguro):
|
|
555
|
+
$ npx @fabioforest/openclaw update
|
|
556
|
+
|
|
557
|
+
2. Se estiver tudo OK, aplique:
|
|
558
|
+
$ npx @fabioforest/openclaw update --apply
|
|
559
|
+
|
|
560
|
+
3. Para preservar customizações:
|
|
561
|
+
$ npx @fabioforest/openclaw update --apply --merge
|
|
562
|
+
|
|
563
|
+
O update faz backup automático de arquivos customizados
|
|
564
|
+
antes de sobrescrever, e copia novos templates.
|
|
565
|
+
|
|
566
|
+
Quer que eu execute o passo 1 agora?
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
### Exemplo 4: Desinstalar o OpenClaw de um projeto
|
|
570
|
+
|
|
571
|
+
```
|
|
572
|
+
👤 Você:
|
|
573
|
+
"Quero remover o OpenClaw deste projeto"
|
|
574
|
+
|
|
575
|
+
🤖 Agente:
|
|
576
|
+
Vou simular a remoção primeiro (modo PLAN, seguro):
|
|
577
|
+
|
|
578
|
+
$ npx @fabioforest/openclaw uninstall
|
|
579
|
+
|
|
580
|
+
🗑️ PLAN — Seria removido:
|
|
581
|
+
.agent/ (25 arquivos, 15 skills, 5 rules)
|
|
582
|
+
openclaw.json
|
|
583
|
+
⚠️ 3 logs de auditoria seriam perdidos
|
|
584
|
+
|
|
585
|
+
Para aplicar de fato:
|
|
586
|
+
$ npx @fabioforest/openclaw uninstall --apply
|
|
587
|
+
|
|
588
|
+
O sistema vai pedir que você digite "UNINSTALL"
|
|
589
|
+
e oferecerá fazer backup antes de remover.
|
|
590
|
+
|
|
591
|
+
Quer que eu execute?
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## 🔄 Ciclo de Vida Completo
|
|
597
|
+
|
|
598
|
+
```
|
|
599
|
+
📦 INSTALAR → npx @fabioforest/openclaw init --apply
|
|
600
|
+
ou: npx @fabioforest/openclaw ide install --apply
|
|
601
|
+
|
|
602
|
+
🔍 INSPECIONAR → npx @fabioforest/openclaw inspect
|
|
603
|
+
npx @fabioforest/openclaw status
|
|
604
|
+
|
|
605
|
+
🛠️ USAR → Chat na IDE (skills + router fazem o resto)
|
|
606
|
+
ou: npx @fabioforest/openclaw assist
|
|
607
|
+
|
|
608
|
+
🔄 ATUALIZAR → npx @fabioforest/openclaw update --apply
|
|
609
|
+
(preserva customizações com --merge)
|
|
610
|
+
|
|
611
|
+
🏥 DIAGNOSTICAR → npx @fabioforest/openclaw doctor
|
|
612
|
+
npx @fabioforest/openclaw debug
|
|
613
|
+
|
|
614
|
+
🗑️ DESINSTALAR → npx @fabioforest/openclaw uninstall --apply
|
|
615
|
+
(backup automático + confirmação forte)
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
---
|
|
619
|
+
|
|
620
|
+
## 🛠️ Desenvolvimento
|
|
71
621
|
|
|
72
622
|
```bash
|
|
73
623
|
# Instalar dependências
|
|
@@ -83,6 +633,25 @@ npm run test:watch
|
|
|
83
633
|
npm run test:coverage
|
|
84
634
|
```
|
|
85
635
|
|
|
86
|
-
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## 📋 Flags Globais
|
|
639
|
+
|
|
640
|
+
Todas as flags funcionam com qualquer comando:
|
|
641
|
+
|
|
642
|
+
| Flag | Descrição | Padrão |
|
|
643
|
+
|------|-----------|--------|
|
|
644
|
+
| `--plan` | Modo simulação (read-only) | **Sim** |
|
|
645
|
+
| `--apply` | Modo execução (aplica alterações) | Não |
|
|
646
|
+
| `--yes, -y` | Pula confirmações interativas | Não |
|
|
647
|
+
| `--force, -f` | Permite operações destrutivas (sem backup no uninstall) | Não |
|
|
648
|
+
| `--path, -p <dir>` | Diretório alvo | `./` |
|
|
649
|
+
| `--quiet, -q` | Saída mínima | Não |
|
|
650
|
+
| `--no-audit` | Desabilita logs de auditoria | Não |
|
|
651
|
+
| `--merge` | Atualização segura (preserva customizações) | Não |
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
## 📄 Licença
|
|
87
656
|
|
|
88
657
|
MIT
|
package/bin/openclaw.js
CHANGED
|
@@ -24,6 +24,7 @@ const pkg = require("../package.json");
|
|
|
24
24
|
const COMMANDS = {
|
|
25
25
|
init: "../lib/cli/init",
|
|
26
26
|
update: "../lib/cli/update",
|
|
27
|
+
uninstall: "../lib/cli/uninstall",
|
|
27
28
|
status: "../lib/cli/status",
|
|
28
29
|
doctor: "../lib/cli/doctor",
|
|
29
30
|
debug: "../lib/cli/debug",
|
|
@@ -92,6 +93,7 @@ function showHelp() {
|
|
|
92
93
|
Comandos:
|
|
93
94
|
init Instala templates .agent/ no projeto atual
|
|
94
95
|
update Atualiza templates preservando customizações
|
|
96
|
+
uninstall Remove .agent/ e openclaw.json (com backup)
|
|
95
97
|
status Mostra status da instalação
|
|
96
98
|
doctor Healthcheck automatizado do ambiente
|
|
97
99
|
setup Roda wizard interativo de configuração
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Comando CLI: uninstall
|
|
5
|
+
*
|
|
6
|
+
* Remove a instalação do OpenClaw (.agent/) de um projeto.
|
|
7
|
+
* Segue o protocolo consent-first:
|
|
8
|
+
* - Modo PLAN por padrão (mostra o que seria removido)
|
|
9
|
+
* - Exige --apply para executar
|
|
10
|
+
* - Exige confirmação forte (digitar frase)
|
|
11
|
+
* - Backup opcional antes de remover
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const fs = require("fs");
|
|
15
|
+
const path = require("path");
|
|
16
|
+
const readline = require("readline");
|
|
17
|
+
const { detectContext, getAuditHeader } = require("../context");
|
|
18
|
+
|
|
19
|
+
function ask(q) {
|
|
20
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
21
|
+
return new Promise((res) => rl.question(q, (ans) => { rl.close(); res(ans.trim()); }));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Conta arquivos recursivamente em um diretório.
|
|
26
|
+
*/
|
|
27
|
+
function countFiles(dir) {
|
|
28
|
+
let count = 0;
|
|
29
|
+
if (!fs.existsSync(dir)) return 0;
|
|
30
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
31
|
+
if (entry.isDirectory()) {
|
|
32
|
+
count += countFiles(path.join(dir, entry.name));
|
|
33
|
+
} else {
|
|
34
|
+
count++;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return count;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Lista o conteúdo de um diretório de forma visual (tree).
|
|
42
|
+
*/
|
|
43
|
+
function listTree(dir, prefix = "") {
|
|
44
|
+
const lines = [];
|
|
45
|
+
if (!fs.existsSync(dir)) return lines;
|
|
46
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
47
|
+
entries.forEach((entry, i) => {
|
|
48
|
+
const isLast = i === entries.length - 1;
|
|
49
|
+
const connector = isLast ? "└── " : "├── ";
|
|
50
|
+
const icon = entry.isDirectory() ? "📁" : "📄";
|
|
51
|
+
lines.push(`${prefix}${connector}${icon} ${entry.name}`);
|
|
52
|
+
if (entry.isDirectory()) {
|
|
53
|
+
const childPrefix = prefix + (isLast ? " " : "│ ");
|
|
54
|
+
lines.push(...listTree(path.join(dir, entry.name), childPrefix));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return lines;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Executa o comando uninstall.
|
|
62
|
+
* @param {object} options
|
|
63
|
+
* @param {string} options.targetPath — diretório alvo
|
|
64
|
+
* @param {object} options.flags — flags do CLI
|
|
65
|
+
*/
|
|
66
|
+
async function run({ targetPath, flags }) {
|
|
67
|
+
const agentDir = path.join(targetPath, ".agent");
|
|
68
|
+
const configFile = path.join(targetPath, "openclaw.json");
|
|
69
|
+
const planMode = !flags.apply;
|
|
70
|
+
const ctx = detectContext(targetPath);
|
|
71
|
+
|
|
72
|
+
console.log("\n🗑️ OpenClaw Uninstall\n");
|
|
73
|
+
|
|
74
|
+
// Verificar se existe instalação
|
|
75
|
+
if (!fs.existsSync(agentDir) && !fs.existsSync(configFile)) {
|
|
76
|
+
console.log("ℹ️ Nenhuma instalação do OpenClaw encontrada neste diretório.");
|
|
77
|
+
console.log(` Path: ${targetPath}`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Mostrar o que será removido
|
|
82
|
+
console.log(` 📂 Diretório: ${targetPath}`);
|
|
83
|
+
console.log("");
|
|
84
|
+
|
|
85
|
+
const toRemove = [];
|
|
86
|
+
|
|
87
|
+
if (fs.existsSync(agentDir)) {
|
|
88
|
+
const fileCount = countFiles(agentDir);
|
|
89
|
+
toRemove.push({ path: agentDir, label: ".agent/", files: fileCount, isDir: true });
|
|
90
|
+
console.log(` 🔴 REMOVER .agent/ (${fileCount} arquivos)`);
|
|
91
|
+
|
|
92
|
+
// Mostrar tree resumido (primeiro nível)
|
|
93
|
+
const entries = fs.readdirSync(agentDir, { withFileTypes: true });
|
|
94
|
+
entries.forEach(e => {
|
|
95
|
+
const icon = e.isDirectory() ? "📁" : "📄";
|
|
96
|
+
const subCount = e.isDirectory() ? ` (${countFiles(path.join(agentDir, e.name))} arquivos)` : "";
|
|
97
|
+
console.log(` ${icon} ${e.name}${subCount}`);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (fs.existsSync(configFile)) {
|
|
102
|
+
toRemove.push({ path: configFile, label: "openclaw.json", isDir: false });
|
|
103
|
+
console.log(` 🔴 REMOVER openclaw.json`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Verificar audit logs que seriam perdidos
|
|
107
|
+
const auditDir = path.join(agentDir, "audit");
|
|
108
|
+
if (fs.existsSync(auditDir)) {
|
|
109
|
+
const auditCount = countFiles(auditDir);
|
|
110
|
+
if (auditCount > 0) {
|
|
111
|
+
console.log(`\n ⚠️ ${auditCount} log(s) de auditoria serão perdidos!`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Verificar state que seria perdido
|
|
116
|
+
const stateDir = path.join(agentDir, "state");
|
|
117
|
+
if (fs.existsSync(stateDir)) {
|
|
118
|
+
const stateCount = countFiles(stateDir);
|
|
119
|
+
if (stateCount > 0) {
|
|
120
|
+
console.log(` ⚠️ ${stateCount} arquivo(s) de estado serão perdidos (mission_control, MEMORY)!`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Modo PLAN: não faz nada
|
|
125
|
+
if (planMode) {
|
|
126
|
+
console.log("\n🔒 Modo PLAN (Read-Only). Nenhuma alteração feita.");
|
|
127
|
+
console.log(" Para desinstalar, rode: npx @fabioforest/openclaw uninstall --apply");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Modo APPLY: pedir confirmação forte
|
|
132
|
+
console.log("");
|
|
133
|
+
if (!flags.yes) {
|
|
134
|
+
const confirm = await ask("⚠️ Digite 'UNINSTALL' para confirmar a remoção: ");
|
|
135
|
+
if (confirm !== "UNINSTALL") {
|
|
136
|
+
console.log("⏹️ Cancelado. Nada foi removido.");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Backup opcional
|
|
142
|
+
if (!flags.force) {
|
|
143
|
+
const doBackup = flags.yes ? "s" : await ask("💾 Fazer backup antes de remover? (S/n): ");
|
|
144
|
+
if (doBackup.toLowerCase() !== "n") {
|
|
145
|
+
const backupName = `.agent.backup-${Date.now()}`;
|
|
146
|
+
const backupPath = path.join(targetPath, backupName);
|
|
147
|
+
try {
|
|
148
|
+
fs.cpSync(agentDir, backupPath, { recursive: true });
|
|
149
|
+
console.log(` ✅ Backup criado: ${backupName}/`);
|
|
150
|
+
} catch (err) {
|
|
151
|
+
console.error(` ⚠️ Falha no backup: ${err.message}`);
|
|
152
|
+
const cont = await ask(" Continuar sem backup? (y/N): ");
|
|
153
|
+
if (cont.toLowerCase() !== "y") {
|
|
154
|
+
console.log("⏹️ Cancelado.");
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Executar remoção
|
|
162
|
+
const audit = [getAuditHeader(ctx, "uninstall", flags)];
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
for (const item of toRemove) {
|
|
166
|
+
if (item.isDir) {
|
|
167
|
+
fs.rmSync(item.path, { recursive: true, force: true });
|
|
168
|
+
} else {
|
|
169
|
+
fs.unlinkSync(item.path);
|
|
170
|
+
}
|
|
171
|
+
console.log(` ✅ Removido: ${item.label}`);
|
|
172
|
+
audit.push(`- ACT: REMOVED ${item.label}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
console.log("\n✨ OpenClaw desinstalado com sucesso!");
|
|
176
|
+
console.log(" Para reinstalar: npx @fabioforest/openclaw init --apply\n");
|
|
177
|
+
|
|
178
|
+
// Gravar audit no diretório pai (já que .agent/ foi removido)
|
|
179
|
+
if (flags.audit !== false) {
|
|
180
|
+
const filename = `openclaw-uninstall-${new Date().toISOString().replace(/[:.]/g, "-")}.md`;
|
|
181
|
+
const auditPath = path.join(targetPath, filename);
|
|
182
|
+
try {
|
|
183
|
+
fs.writeFileSync(auditPath, audit.join("\n") + "\n", "utf8");
|
|
184
|
+
console.log(` 📝 Log de auditoria: ${filename}`);
|
|
185
|
+
} catch (e) { /* silencioso */ }
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
} catch (err) {
|
|
189
|
+
console.error(`\n❌ Falha: ${err.message}`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
module.exports = { run };
|