@fabioforest/openclaw 3.4.1 → 3.6.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 +218 -4
- package/bin/openclaw.js +2 -0
- package/lib/cli/uninstall.js +194 -0
- package/package.json +1 -1
- package/templates/.agent/skills/code-quality/SKILL.md +93 -0
- package/templates/.agent/skills/devops-toolkit/SKILL.md +110 -0
- package/templates/.agent/skills/legacy-cleanup/SKILL.md +67 -0
- package/templates/.agent/skills/mlops-pipeline/SKILL.md +113 -0
- package/templates/.agent/skills/security-scanner/SKILL.md +121 -0
- package/templates/.agent/skills/test-engineer/SKILL.md +129 -0
package/README.md
CHANGED
|
@@ -44,6 +44,7 @@ npx @fabioforest/openclaw ide install --apply
|
|
|
44
44
|
|----------|---------|-----------|
|
|
45
45
|
| Primeira vez no projeto | `init --apply` | Cria `.agent/` com templates |
|
|
46
46
|
| Atualizar skills/rules | `update --apply` | Atualiza preservando customizações |
|
|
47
|
+
| Desinstalar do projeto | `uninstall --apply` | Remove `.agent/` com backup |
|
|
47
48
|
| Ver o que está instalado | `status` | Lista componentes e config |
|
|
48
49
|
| Algo não funciona | `doctor` | Diagnóstico completo |
|
|
49
50
|
| Quero entender meu ambiente | `inspect` | Análise 100% read-only |
|
|
@@ -113,6 +114,54 @@ npx @fabioforest/openclaw update --apply --merge
|
|
|
113
114
|
|
|
114
115
|
---
|
|
115
116
|
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
### `openclaw uninstall` — Desinstalar do projeto
|
|
120
|
+
|
|
121
|
+
**Quando usar:** Quando quiser remover completamente o OpenClaw de um projeto.
|
|
122
|
+
|
|
123
|
+
```bash
|
|
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
|
+
|
|
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
|
+
---
|
|
164
|
+
|
|
116
165
|
### `openclaw inspect` — Analisar ambiente (read-only)
|
|
117
166
|
|
|
118
167
|
**Quando usar:** Antes de qualquer ação, para entender o contexto. 100% read-only — nunca altera nada.
|
|
@@ -322,7 +371,7 @@ Verifica conectividade, proxy, versões e integridade do ambiente.
|
|
|
322
371
|
|
|
323
372
|
---
|
|
324
373
|
|
|
325
|
-
## 🧠 Skills Disponíveis (
|
|
374
|
+
## 🧠 Skills Disponíveis (21)
|
|
326
375
|
|
|
327
376
|
### Core — Infraestrutura do AI OS
|
|
328
377
|
|
|
@@ -337,6 +386,22 @@ Verifica conectividade, proxy, versões e integridade do ambiente.
|
|
|
337
386
|
| `smart-router` | Roteador econômico | Para escolher modelo de IA por custo |
|
|
338
387
|
| `context-flush` | Flush de memória | Para economizar tokens em sessões longas |
|
|
339
388
|
|
|
389
|
+
### Engenharia de Software — Código, Testes e Qualidade
|
|
390
|
+
|
|
391
|
+
| Skill | O que faz | Quando usar |
|
|
392
|
+
|-------|-----------|-------------|
|
|
393
|
+
| `code-quality` | SOLID, DRY, KISS, Clean Code | Para revisar e melhorar qualidade de código |
|
|
394
|
+
| `legacy-cleanup` | Refatoração segura de legado | Para remover dead code, deps obsoletas |
|
|
395
|
+
| `test-engineer` | Testes unitários/integração/E2E | Para criar e melhorar suite de testes |
|
|
396
|
+
| `security-scanner` | SAST, DAST, OWASP Top 10 | Para auditoria de segurança e vulnerabilidades |
|
|
397
|
+
|
|
398
|
+
### DevOps & MLOps — Infraestrutura e Machine Learning
|
|
399
|
+
|
|
400
|
+
| Skill | O que faz | Quando usar |
|
|
401
|
+
|-------|-----------|-------------|
|
|
402
|
+
| `devops-toolkit` | Docker, CI/CD, K8s, Terraform | Para automação de infra e deploy |
|
|
403
|
+
| `mlops-pipeline` | Treinamento, serving, RAG, drift | Para pipelines de ML em produção |
|
|
404
|
+
|
|
340
405
|
### Produtividade — Automação e Web
|
|
341
406
|
|
|
342
407
|
| Skill | O que faz | Quando usar |
|
|
@@ -347,7 +412,7 @@ Verifica conectividade, proxy, versões e integridade do ambiente.
|
|
|
347
412
|
| `web-scraper` | Scraping responsável | Para extrair dados de sites |
|
|
348
413
|
| `content-sourcer` | Pesquisa de fontes | Para criar dossiês citáveis |
|
|
349
414
|
|
|
350
|
-
### Operacionais —
|
|
415
|
+
### Operacionais — Setup e Debug
|
|
351
416
|
|
|
352
417
|
| Skill | O que faz | Quando usar |
|
|
353
418
|
|-------|-----------|-------------|
|
|
@@ -419,6 +484,155 @@ npx @fabioforest/openclaw assist
|
|
|
419
484
|
|
|
420
485
|
---
|
|
421
486
|
|
|
487
|
+
## 💬 Exemplo Real: Usando o OpenClaw na IDE (Chat)
|
|
488
|
+
|
|
489
|
+
O OpenClaw funciona como agente via chat na IDE. Aqui está uma simulação de como seria o fluxo real:
|
|
490
|
+
|
|
491
|
+
### Exemplo 1: Otimizar perfil do LinkedIn
|
|
492
|
+
|
|
493
|
+
```
|
|
494
|
+
👤 Você (chat na IDE):
|
|
495
|
+
"Quero otimizar meu perfil do LinkedIn para vagas de AI Engineer"
|
|
496
|
+
|
|
497
|
+
🤖 Agente (openclaw-router detecta: linkedin-optimizer):
|
|
498
|
+
📋 INSPECT ─ Coletando contexto:
|
|
499
|
+
• Objetivo: otimizar perfil LinkedIn para AI Engineer
|
|
500
|
+
• Idioma: pt-BR
|
|
501
|
+
• Skills instaladas: linkedin-optimizer ✅
|
|
502
|
+
|
|
503
|
+
📝 PLAN ─ Proposta de ações:
|
|
504
|
+
1. Analisar headline atual e propor 2 versões A/B
|
|
505
|
+
2. Reescrever seção "Sobre" com keywords de AI/MLOps
|
|
506
|
+
3. Sugerir ajustes nas experiências com métricas
|
|
507
|
+
4. Gerar checklist de publicação
|
|
508
|
+
|
|
509
|
+
⚠️ RESTRIÇÃO: LinkedIn proíbe automação. Todo conteúdo
|
|
510
|
+
será gerado como rascunho para aplicação manual.
|
|
511
|
+
|
|
512
|
+
Deseja prosseguir? (S/n)
|
|
513
|
+
|
|
514
|
+
👤 Você: "S"
|
|
515
|
+
|
|
516
|
+
🤖 Agente:
|
|
517
|
+
✅ APPLY ─ Rascunhos salvos em .agent/state/linkedin/drafts.md
|
|
518
|
+
|
|
519
|
+
## Headline (opção A)
|
|
520
|
+
"AI Engineer | MLOps | Python | RAG & LLMs | Open Source"
|
|
521
|
+
|
|
522
|
+
## Headline (opção B)
|
|
523
|
+
"Engenheiro de IA | Construindo pipelines de ML em produção"
|
|
524
|
+
|
|
525
|
+
📝 AUDIT ─ log salvo em .agent/audit/
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### Exemplo 2: Testar performance de um site
|
|
529
|
+
|
|
530
|
+
```
|
|
531
|
+
👤 Você:
|
|
532
|
+
"Testa a performance do meu site https://meu-portfolio.dev"
|
|
533
|
+
|
|
534
|
+
🤖 Agente (openclaw-router detecta: site-tester):
|
|
535
|
+
📋 INSPECT:
|
|
536
|
+
• URL: https://meu-portfolio.dev
|
|
537
|
+
• robots.txt: verificado ✅
|
|
538
|
+
• Ferramentas disponíveis: PageSpeed Insights API
|
|
539
|
+
|
|
540
|
+
📝 PLAN:
|
|
541
|
+
1. Rodar Lighthouse via PageSpeed Insights (sem infra local)
|
|
542
|
+
2. Coletar métricas: Performance, SEO, Acessibilidade, PWA
|
|
543
|
+
3. Listar as 5 principais oportunidades de melhoria
|
|
544
|
+
4. Salvar relatório em .agent/state/site-tests/
|
|
545
|
+
|
|
546
|
+
Confirmar execução?
|
|
547
|
+
|
|
548
|
+
👤 Você: "sim"
|
|
549
|
+
|
|
550
|
+
🤖 Agente:
|
|
551
|
+
✅ Resultados:
|
|
552
|
+
• Performance: 87 → otimizar imagens (ganho estimado: +8pts)
|
|
553
|
+
• SEO: 95 ✅
|
|
554
|
+
• Acessibilidade: 72 → falta alt em 3 imagens + contraste baixo
|
|
555
|
+
• PWA: 60 → falta manifest.json e service worker
|
|
556
|
+
|
|
557
|
+
📊 Relatório salvo em .agent/state/site-tests/2026-02-19.json
|
|
558
|
+
📝 Audit salvo
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
### Exemplo 3: Atualizar skills após nova versão
|
|
562
|
+
|
|
563
|
+
```
|
|
564
|
+
👤 Você:
|
|
565
|
+
"Saiu versão nova do OpenClaw, como atualizo?"
|
|
566
|
+
|
|
567
|
+
🤖 Agente (openclaw-router detecta: assist):
|
|
568
|
+
Recomendo o seguinte fluxo:
|
|
569
|
+
|
|
570
|
+
1. Primeiro, veja o que mudaria (modo PLAN, seguro):
|
|
571
|
+
$ npx @fabioforest/openclaw update
|
|
572
|
+
|
|
573
|
+
2. Se estiver tudo OK, aplique:
|
|
574
|
+
$ npx @fabioforest/openclaw update --apply
|
|
575
|
+
|
|
576
|
+
3. Para preservar customizações:
|
|
577
|
+
$ npx @fabioforest/openclaw update --apply --merge
|
|
578
|
+
|
|
579
|
+
O update faz backup automático de arquivos customizados
|
|
580
|
+
antes de sobrescrever, e copia novos templates.
|
|
581
|
+
|
|
582
|
+
Quer que eu execute o passo 1 agora?
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Exemplo 4: Desinstalar o OpenClaw de um projeto
|
|
586
|
+
|
|
587
|
+
```
|
|
588
|
+
👤 Você:
|
|
589
|
+
"Quero remover o OpenClaw deste projeto"
|
|
590
|
+
|
|
591
|
+
🤖 Agente:
|
|
592
|
+
Vou simular a remoção primeiro (modo PLAN, seguro):
|
|
593
|
+
|
|
594
|
+
$ npx @fabioforest/openclaw uninstall
|
|
595
|
+
|
|
596
|
+
🗑️ PLAN — Seria removido:
|
|
597
|
+
.agent/ (25 arquivos, 15 skills, 5 rules)
|
|
598
|
+
openclaw.json
|
|
599
|
+
⚠️ 3 logs de auditoria seriam perdidos
|
|
600
|
+
|
|
601
|
+
Para aplicar de fato:
|
|
602
|
+
$ npx @fabioforest/openclaw uninstall --apply
|
|
603
|
+
|
|
604
|
+
O sistema vai pedir que você digite "UNINSTALL"
|
|
605
|
+
e oferecerá fazer backup antes de remover.
|
|
606
|
+
|
|
607
|
+
Quer que eu execute?
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 🔄 Ciclo de Vida Completo
|
|
613
|
+
|
|
614
|
+
```
|
|
615
|
+
📦 INSTALAR → npx @fabioforest/openclaw init --apply
|
|
616
|
+
ou: npx @fabioforest/openclaw ide install --apply
|
|
617
|
+
|
|
618
|
+
🔍 INSPECIONAR → npx @fabioforest/openclaw inspect
|
|
619
|
+
npx @fabioforest/openclaw status
|
|
620
|
+
|
|
621
|
+
🛠️ USAR → Chat na IDE (skills + router fazem o resto)
|
|
622
|
+
ou: npx @fabioforest/openclaw assist
|
|
623
|
+
|
|
624
|
+
🔄 ATUALIZAR → npx @fabioforest/openclaw update --apply
|
|
625
|
+
(preserva customizações com --merge)
|
|
626
|
+
|
|
627
|
+
🏥 DIAGNOSTICAR → npx @fabioforest/openclaw doctor
|
|
628
|
+
npx @fabioforest/openclaw debug
|
|
629
|
+
|
|
630
|
+
🗑️ DESINSTALAR → npx @fabioforest/openclaw uninstall --apply
|
|
631
|
+
(backup automático + confirmação forte)
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
422
636
|
## 🛠️ Desenvolvimento
|
|
423
637
|
|
|
424
638
|
```bash
|
|
@@ -445,8 +659,8 @@ Todas as flags funcionam com qualquer comando:
|
|
|
445
659
|
|------|-----------|--------|
|
|
446
660
|
| `--plan` | Modo simulação (read-only) | **Sim** |
|
|
447
661
|
| `--apply` | Modo execução (aplica alterações) | Não |
|
|
448
|
-
| `--yes, -y` | Pula confirmações | Não |
|
|
449
|
-
| `--force, -f` | Permite operações destrutivas | Não |
|
|
662
|
+
| `--yes, -y` | Pula confirmações interativas | Não |
|
|
663
|
+
| `--force, -f` | Permite operações destrutivas (sem backup no uninstall) | Não |
|
|
450
664
|
| `--path, -p <dir>` | Diretório alvo | `./` |
|
|
451
665
|
| `--quiet, -q` | Saída mínima | Não |
|
|
452
666
|
| `--no-audit` | Desabilita logs de auditoria | Não |
|
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 };
|
package/package.json
CHANGED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-quality
|
|
3
|
+
description: Aplica boas práticas de código (SOLID, DRY, KISS, Clean Code). Analisa estilo, naming, estrutura, documentação e propõe melhorias.
|
|
4
|
+
triggers:
|
|
5
|
+
- boas práticas
|
|
6
|
+
- code review
|
|
7
|
+
- clean code
|
|
8
|
+
- solid
|
|
9
|
+
- dry
|
|
10
|
+
- kiss
|
|
11
|
+
- qualidade de código
|
|
12
|
+
- code quality
|
|
13
|
+
- lint
|
|
14
|
+
- estilo
|
|
15
|
+
- naming
|
|
16
|
+
- convenção
|
|
17
|
+
- padrão de código
|
|
18
|
+
- documentação
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Code Quality
|
|
22
|
+
|
|
23
|
+
## Objetivo
|
|
24
|
+
Garantir que o código siga boas práticas reconhecidas (SOLID, DRY, KISS, Clean Code), com foco em legibilidade, manutenibilidade e consistência.
|
|
25
|
+
|
|
26
|
+
## Contexto necessário
|
|
27
|
+
- Linguagem/framework do projeto
|
|
28
|
+
- Guia de estilo existente (se houver)
|
|
29
|
+
- Foco: revisão geral ou área específica
|
|
30
|
+
|
|
31
|
+
## Fluxo (inspect → plan → consent → apply → audit)
|
|
32
|
+
|
|
33
|
+
1. **INSPECT** (read-only):
|
|
34
|
+
- Verificar configuração de linter/formatter existente
|
|
35
|
+
- Analisar convenções de naming (camelCase, snake_case, PascalCase)
|
|
36
|
+
- Detectar violações de SOLID:
|
|
37
|
+
- **S**ingle Responsibility: classes/funções com mais de 1 responsabilidade
|
|
38
|
+
- **O**pen/Closed: código que exige modificação para extensão
|
|
39
|
+
- **L**iskov Substitution: subclasses que quebram contratos
|
|
40
|
+
- **I**nterface Segregation: interfaces muito grandes
|
|
41
|
+
- **D**ependency Inversion: dependências concretas no lugar de abstrações
|
|
42
|
+
- Detectar violações de DRY (duplicações)
|
|
43
|
+
- Verificar documentação (JSDoc, docstrings, README)
|
|
44
|
+
- Medir tamanho de funções/classes (threshold: 200 linhas/arquivo, 30 linhas/função)
|
|
45
|
+
|
|
46
|
+
2. **PLAN** — Propor melhorias categorizadas:
|
|
47
|
+
|
|
48
|
+
| Categoria | Exemplo |
|
|
49
|
+
|-----------|---------|
|
|
50
|
+
| 📝 Naming | `data` → `userProfiles`, `fn` → `calculateDiscount` |
|
|
51
|
+
| 📦 Estrutura | Extrair classe com 500 linhas em 3 módulos |
|
|
52
|
+
| 📖 Documentação | Adicionar JSDoc em funções públicas |
|
|
53
|
+
| 🔧 Linting | Configurar ESLint/Prettier/Ruff/Black |
|
|
54
|
+
| 🧪 Testabilidade | Injetar dependências para facilitar mocks |
|
|
55
|
+
|
|
56
|
+
3. **CONSENT**: Confirmar antes de aplicar
|
|
57
|
+
4. **APPLY**: Gerar patches unificados para cada melhoria
|
|
58
|
+
5. **AUDIT**: Registrar métricas antes/depois
|
|
59
|
+
|
|
60
|
+
## Checklists por cenário
|
|
61
|
+
|
|
62
|
+
### Criando código novo
|
|
63
|
+
- [ ] Nomes descritivos (sem abreviações crípticas)
|
|
64
|
+
- [ ] Funções com no máximo 30 linhas e 1 responsabilidade
|
|
65
|
+
- [ ] Arquivos com no máximo 200-300 linhas
|
|
66
|
+
- [ ] Sem dados simulados fora de testes
|
|
67
|
+
- [ ] Comentários explicam "por quê", não "o quê"
|
|
68
|
+
- [ ] Tratamento de erros com mensagens úteis
|
|
69
|
+
- [ ] Tipos/interfaces/schemas definidos
|
|
70
|
+
|
|
71
|
+
### Revisando código existente
|
|
72
|
+
- [ ] Sem variáveis não utilizadas
|
|
73
|
+
- [ ] Sem imports não utilizados
|
|
74
|
+
- [ ] Sem TODO/FIXME sem prazo
|
|
75
|
+
- [ ] Sem console.log/print de debug em produção
|
|
76
|
+
- [ ] Sem credenciais hardcoded
|
|
77
|
+
- [ ] Sem números mágicos (extrair constantes)
|
|
78
|
+
- [ ] Sem funções com mais de 3 níveis de aninhamento
|
|
79
|
+
|
|
80
|
+
## Ferramentas recomendadas
|
|
81
|
+
|
|
82
|
+
| Categoria | JavaScript/TS | Python | Go |
|
|
83
|
+
|-----------|--------------|--------|-----|
|
|
84
|
+
| Linter | ESLint | Ruff, Pylint | golangci-lint |
|
|
85
|
+
| Formatter | Prettier | Black, Ruff format | gofmt |
|
|
86
|
+
| Type check | TypeScript | mypy, pyright | built-in |
|
|
87
|
+
| Docs | JSDoc, TypeDoc | Sphinx, mkdocs | godoc |
|
|
88
|
+
| Complexidade | ESLint complexity | radon | gocyclo |
|
|
89
|
+
|
|
90
|
+
## Regras de segurança
|
|
91
|
+
- ✅ Nunca alterar lógica de negócio durante refatoração de estilo
|
|
92
|
+
- ✅ Commits separados: formatação vs refatoração vs lógica
|
|
93
|
+
- ❌ Nunca introduzir um novo padrão sem remover o antigo
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devops-toolkit
|
|
3
|
+
description: Automação de infraestrutura, CI/CD, containerização, monitoramento e deploy. Suporte a Docker, GitHub Actions, Terraform, Ansible e Kubernetes.
|
|
4
|
+
triggers:
|
|
5
|
+
- devops
|
|
6
|
+
- ci/cd
|
|
7
|
+
- pipeline
|
|
8
|
+
- deploy
|
|
9
|
+
- docker
|
|
10
|
+
- dockerfile
|
|
11
|
+
- docker-compose
|
|
12
|
+
- kubernetes
|
|
13
|
+
- k8s
|
|
14
|
+
- terraform
|
|
15
|
+
- ansible
|
|
16
|
+
- github actions
|
|
17
|
+
- gitlab ci
|
|
18
|
+
- infraestrutura
|
|
19
|
+
- infra
|
|
20
|
+
- monitoramento
|
|
21
|
+
- observabilidade
|
|
22
|
+
- nginx
|
|
23
|
+
- proxy reverso
|
|
24
|
+
- ssl
|
|
25
|
+
- https
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# DevOps Toolkit
|
|
29
|
+
|
|
30
|
+
## Objetivo
|
|
31
|
+
Automatizar infraestrutura, CI/CD, containerização, monitoramento e deploy seguindo boas práticas de Infrastructure as Code (IaC) e GitOps.
|
|
32
|
+
|
|
33
|
+
## Contexto necessário
|
|
34
|
+
- Provedor de cloud (AWS, GCP, Azure, VPS, local)
|
|
35
|
+
- Ferramenta de CI/CD em uso (GitHub Actions, GitLab CI, Jenkins)
|
|
36
|
+
- Stack do projeto (linguagem, framework, banco de dados)
|
|
37
|
+
- Ambiente alvo (dev, staging, prod)
|
|
38
|
+
|
|
39
|
+
## Fluxo (inspect → plan → consent → apply → verify → audit)
|
|
40
|
+
|
|
41
|
+
1. **INSPECT**: Analisar infra existente (Dockerfile, compose, CI configs, deploy scripts)
|
|
42
|
+
2. **PLAN**: Propor melhorias com diagrama de arquitetura
|
|
43
|
+
3. **CONSENT**: Confirmar antes de qualquer alteração em infra
|
|
44
|
+
4. **APPLY**: Gerar/modificar configs
|
|
45
|
+
5. **VERIFY**: Testar build, healthcheck, deploy em staging
|
|
46
|
+
6. **AUDIT**: Registrar mudanças de infra
|
|
47
|
+
|
|
48
|
+
## Capacidades
|
|
49
|
+
|
|
50
|
+
### 🐳 Containerização
|
|
51
|
+
- Criar/otimizar Dockerfiles (multi-stage builds, cache layers)
|
|
52
|
+
- Docker Compose para desenvolvimento local
|
|
53
|
+
- Boas práticas: non-root user, .dockerignore, health checks
|
|
54
|
+
- Reduzir tamanho de imagem (Alpine, distroless, slim)
|
|
55
|
+
|
|
56
|
+
### 🔄 CI/CD Pipelines
|
|
57
|
+
- GitHub Actions (workflows, matrix, caching, secrets)
|
|
58
|
+
- GitLab CI (stages, artifacts, environments)
|
|
59
|
+
- Estratégias: lint → test → build → deploy
|
|
60
|
+
- Cache de dependências para acelerar builds
|
|
61
|
+
- Deploy com rollback automático
|
|
62
|
+
|
|
63
|
+
### ☁️ Infrastructure as Code
|
|
64
|
+
- Terraform: providers, modules, state management
|
|
65
|
+
- Ansible: playbooks, roles, inventários
|
|
66
|
+
- Kubernetes: manifests, Helm charts, kustomize
|
|
67
|
+
|
|
68
|
+
### 📊 Monitoramento e Observabilidade
|
|
69
|
+
- Healthchecks e readiness probes
|
|
70
|
+
- Logging estruturado (JSON, correlação de requests)
|
|
71
|
+
- Métricas (Prometheus, Grafana, Datadog)
|
|
72
|
+
- Alertas baseados em SLOs/SLIs
|
|
73
|
+
|
|
74
|
+
### 🔒 Segurança de Infra
|
|
75
|
+
- Scan de vulnerabilidades em imagens Docker (Trivy, Snyk)
|
|
76
|
+
- Secrets management (Vault, SOPS, GitHub Secrets)
|
|
77
|
+
- Network policies e firewall rules
|
|
78
|
+
- TLS/SSL com renovação automática (Let's Encrypt, Certbot)
|
|
79
|
+
|
|
80
|
+
## Checklists
|
|
81
|
+
|
|
82
|
+
### Dockerfile
|
|
83
|
+
- [ ] Multi-stage build (builder + runner)
|
|
84
|
+
- [ ] Usuário non-root
|
|
85
|
+
- [ ] .dockerignore configurado
|
|
86
|
+
- [ ] HEALTHCHECK definido
|
|
87
|
+
- [ ] Apenas dependências de produção na imagem final
|
|
88
|
+
- [ ] Layers ordenadas por frequência de mudança (cache)
|
|
89
|
+
|
|
90
|
+
### CI/CD Pipeline
|
|
91
|
+
- [ ] Lint e testes rodam em cada PR
|
|
92
|
+
- [ ] Build e push de imagem em merge na main
|
|
93
|
+
- [ ] Deploy automático em staging, manual em prod
|
|
94
|
+
- [ ] Cache de dependências configurado
|
|
95
|
+
- [ ] Secrets não expostos em logs
|
|
96
|
+
- [ ] Rollback automático se healthcheck falhar
|
|
97
|
+
|
|
98
|
+
### Deploy em Produção
|
|
99
|
+
- [ ] Blue-green ou canary deployment
|
|
100
|
+
- [ ] Database migrations antes do deploy
|
|
101
|
+
- [ ] Backup antes de mudanças destrutivas
|
|
102
|
+
- [ ] Monitoramento ativo pós-deploy (5-15 min)
|
|
103
|
+
- [ ] Runbook de rollback documentado
|
|
104
|
+
|
|
105
|
+
## Regras de segurança
|
|
106
|
+
- ✅ Nunca commitar secrets no repositório
|
|
107
|
+
- ✅ Testar em staging antes de prod
|
|
108
|
+
- ✅ Infraestrutura versionada no Git (IaC)
|
|
109
|
+
- ❌ Nunca fazer deploy direto em prod sem pipeline
|
|
110
|
+
- ❌ Nunca rodar containers como root em produção
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: legacy-cleanup
|
|
3
|
+
description: Analisa e refatora código legado de forma segura. Identifica dead code, dependências obsoletas, padrões deprecados e propõe modernização incremental.
|
|
4
|
+
triggers:
|
|
5
|
+
- código legado
|
|
6
|
+
- legacy
|
|
7
|
+
- refatorar
|
|
8
|
+
- dead code
|
|
9
|
+
- código morto
|
|
10
|
+
- deprecado
|
|
11
|
+
- obsoleto
|
|
12
|
+
- modernizar
|
|
13
|
+
- dívida técnica
|
|
14
|
+
- technical debt
|
|
15
|
+
- cleanup
|
|
16
|
+
- limpar código
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Legacy Cleanup
|
|
20
|
+
|
|
21
|
+
## Objetivo
|
|
22
|
+
Identificar e remover código legado, dead code, dependências obsoletas e padrões deprecados de forma **segura e incremental**, sem quebrar funcionalidades existentes.
|
|
23
|
+
|
|
24
|
+
## Contexto necessário
|
|
25
|
+
- Linguagem/framework do projeto
|
|
26
|
+
- Se há testes automatizados (cobertura atual)
|
|
27
|
+
- Áreas prioritárias (ou análise completa)
|
|
28
|
+
- Tolerância a risco (conservador vs agressivo)
|
|
29
|
+
|
|
30
|
+
## Fluxo (inspect → plan → consent → apply → verify → audit)
|
|
31
|
+
|
|
32
|
+
1. **INSPECT** (read-only):
|
|
33
|
+
- Identificar dead code (funções/classes/módulos não referenciados)
|
|
34
|
+
- Listar dependências sem uso no `package.json` / `requirements.txt` / `Gemfile`
|
|
35
|
+
- Detectar padrões deprecados (callbacks → promises, var → const/let, etc.)
|
|
36
|
+
- Mapear duplicações (DRY violations)
|
|
37
|
+
- Verificar TODOs/FIXMEs/HACKs antigos
|
|
38
|
+
- Medir complexidade ciclomática por arquivo
|
|
39
|
+
|
|
40
|
+
2. **PLAN** — Propor ações categorizadas por risco:
|
|
41
|
+
|
|
42
|
+
| Risco | Ação | Exemplo |
|
|
43
|
+
|-------|------|---------|
|
|
44
|
+
| 🟢 Baixo | Remover imports não usados | `import * as _ from 'lodash'` sem uso |
|
|
45
|
+
| 🟡 Médio | Remover funções sem referência | Função helper nunca chamada |
|
|
46
|
+
| 🔴 Alto | Substituir padrão arquitetural | Migrar callbacks → async/await |
|
|
47
|
+
|
|
48
|
+
3. **CONSENT**: Confirmar cada categoria de risco separadamente
|
|
49
|
+
4. **APPLY**: Executar refatorações + rodar testes após cada batch
|
|
50
|
+
5. **VERIFY**: Confirmar que testes passam e build funciona
|
|
51
|
+
6. **AUDIT**: Registrar métricas antes/depois (linhas, complexidade, dependências)
|
|
52
|
+
|
|
53
|
+
## Ferramentas recomendadas por linguagem
|
|
54
|
+
|
|
55
|
+
| Linguagem | Dead code | Deps não usadas | Complexidade |
|
|
56
|
+
|-----------|-----------|-----------------|-------------|
|
|
57
|
+
| JavaScript/TS | `ts-prune`, ESLint `no-unused-vars` | `depcheck` | `plato`, ESLint |
|
|
58
|
+
| Python | `vulture`, `pylint` | `pip-autoremove` | `radon`, `flake8` |
|
|
59
|
+
| Go | `deadcode`, `staticcheck` | `go mod tidy` | `gocyclo` |
|
|
60
|
+
| Java | IntelliJ inspections, `spotbugs` | Maven dependency plugin | `PMD` |
|
|
61
|
+
|
|
62
|
+
## Regras de segurança
|
|
63
|
+
- ✅ Sempre rodar testes antes E depois de cada refatoração
|
|
64
|
+
- ✅ Commits atômicos (1 refatoração = 1 commit)
|
|
65
|
+
- ✅ Nunca remover código que tenha referência dinâmica sem confirmar
|
|
66
|
+
- ❌ Nunca refatorar sem testes que cubram a área alterada
|
|
67
|
+
- ❌ Nunca misturar refatoração com mudança de lógica de negócio
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mlops-pipeline
|
|
3
|
+
description: Boas práticas de MLOps — treinamento, versionamento de modelos, deploy de ML, monitoramento de drift, pipelines de dados e feature stores.
|
|
4
|
+
triggers:
|
|
5
|
+
- mlops
|
|
6
|
+
- machine learning
|
|
7
|
+
- modelo
|
|
8
|
+
- treinamento
|
|
9
|
+
- training
|
|
10
|
+
- deploy de modelo
|
|
11
|
+
- model serving
|
|
12
|
+
- feature store
|
|
13
|
+
- data pipeline
|
|
14
|
+
- drift
|
|
15
|
+
- experiment tracking
|
|
16
|
+
- mlflow
|
|
17
|
+
- wandb
|
|
18
|
+
- kubeflow
|
|
19
|
+
- bentoml
|
|
20
|
+
- rag
|
|
21
|
+
- fine-tuning
|
|
22
|
+
- embeddings
|
|
23
|
+
- vetor
|
|
24
|
+
- vector database
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# MLOps Pipeline
|
|
28
|
+
|
|
29
|
+
## Objetivo
|
|
30
|
+
Implementar e gerenciar pipelines de Machine Learning em produção, cobrindo todo o ciclo: dados → treinamento → avaliação → deploy → monitoramento → retraining.
|
|
31
|
+
|
|
32
|
+
## Contexto necessário
|
|
33
|
+
- Tipo de modelo (classificação, NLP, visão, LLM, recomendação)
|
|
34
|
+
- Framework (PyTorch, TensorFlow, scikit-learn, HuggingFace)
|
|
35
|
+
- Infraestrutura (local, cloud, GPU)
|
|
36
|
+
- Estágio atual (exploração, staging, produção)
|
|
37
|
+
|
|
38
|
+
## Fluxo (inspect → plan → consent → apply → verify → audit)
|
|
39
|
+
|
|
40
|
+
1. **INSPECT**: Analisar pipeline existente, dados, modelos e infra
|
|
41
|
+
2. **PLAN**: Propor arquitetura MLOps com componentes necessários
|
|
42
|
+
3. **CONSENT**: Confirmar custos de compute e storage
|
|
43
|
+
4. **APPLY**: Implementar/modificar pipeline
|
|
44
|
+
5. **VERIFY**: Validar métricas, latência, throughput
|
|
45
|
+
6. **AUDIT**: Registrar experimentos, versões e decisões
|
|
46
|
+
|
|
47
|
+
## Capacidades
|
|
48
|
+
|
|
49
|
+
### 📊 Experiment Tracking
|
|
50
|
+
- MLflow: experiments, runs, parâmetros, métricas, artefatos
|
|
51
|
+
- Weights & Biases (W&B): tracking, sweeps, reports
|
|
52
|
+
- Comparação entre runs e reprodutibilidade
|
|
53
|
+
|
|
54
|
+
### 📦 Versionamento de Modelos e Dados
|
|
55
|
+
- DVC: versionamento de datasets grandes
|
|
56
|
+
- MLflow Model Registry: staging → production
|
|
57
|
+
- Git LFS para artefatos pesados
|
|
58
|
+
- Hashes de datasets para reprodutibilidade
|
|
59
|
+
|
|
60
|
+
### 🔄 Pipelines de Treinamento
|
|
61
|
+
- Orquestração: Airflow, Prefect, Kubeflow Pipelines
|
|
62
|
+
- Feature engineering automatizado
|
|
63
|
+
- Validação de dados (Great Expectations, Pandera)
|
|
64
|
+
- Hyperparameter tuning (Optuna, Ray Tune)
|
|
65
|
+
|
|
66
|
+
### 🚀 Model Serving
|
|
67
|
+
- APIs REST/gRPC: FastAPI + ONNX, TorchServe, TF Serving
|
|
68
|
+
- BentoML: empacotamento e deploy de modelos
|
|
69
|
+
- Serverless: AWS Lambda + SageMaker, GCP Cloud Functions
|
|
70
|
+
- Edge: ONNX Runtime, TensorFlow Lite
|
|
71
|
+
|
|
72
|
+
### 🔍 Monitoramento em Produção
|
|
73
|
+
- Data drift detection (Evidently, NannyML)
|
|
74
|
+
- Model performance monitoring (accuracy decay)
|
|
75
|
+
- Latência e throughput (P50, P95, P99)
|
|
76
|
+
- Alertas para retraining automático
|
|
77
|
+
|
|
78
|
+
### 🧠 LLM Ops (RAG, Fine-tuning, Agents)
|
|
79
|
+
- RAG pipelines: embeddings → vector DB → retrieval → generation
|
|
80
|
+
- Vector databases: Qdrant, ChromaDB, Pinecone, Weaviate
|
|
81
|
+
- Fine-tuning: LoRA, QLoRA, em GPUs de consumo
|
|
82
|
+
- Avaliação de LLMs: BLEU, ROUGE, human eval, LLM-as-judge
|
|
83
|
+
- Guardrails: content filtering, prompt injection detection
|
|
84
|
+
|
|
85
|
+
## Checklists
|
|
86
|
+
|
|
87
|
+
### Antes de treinar
|
|
88
|
+
- [ ] Dados validados (schema, distribuição, missing values)
|
|
89
|
+
- [ ] Split reprodutível (train/val/test com seed fixa)
|
|
90
|
+
- [ ] Baseline definido (modelo simples para comparação)
|
|
91
|
+
- [ ] Métricas de avaliação escolhidas e documentadas
|
|
92
|
+
- [ ] Experiment tracking configurado
|
|
93
|
+
|
|
94
|
+
### Antes de deploy
|
|
95
|
+
- [ ] Modelo versionado com metadados (hash, métricas, dataset)
|
|
96
|
+
- [ ] Testes de integração (input → output esperado)
|
|
97
|
+
- [ ] Benchmark de latência e throughput
|
|
98
|
+
- [ ] Fallback definido (modelo anterior ou regra heurística)
|
|
99
|
+
- [ ] Monitoramento de drift configurado
|
|
100
|
+
|
|
101
|
+
### Em produção
|
|
102
|
+
- [ ] Alertas para degradação de performance
|
|
103
|
+
- [ ] Pipeline de retraining automatizado ou semi-automático
|
|
104
|
+
- [ ] A/B testing ou shadow mode para novos modelos
|
|
105
|
+
- [ ] Logs de predições para auditoria e debugging
|
|
106
|
+
- [ ] Custo de compute monitorado
|
|
107
|
+
|
|
108
|
+
## Regras de segurança
|
|
109
|
+
- ✅ Dados sensíveis devem ser anonimizados/mascarados antes de treinar
|
|
110
|
+
- ✅ Modelos devem ser escaneados para bias antes de deploy
|
|
111
|
+
- ✅ API keys de provedores de LLM devem usar secret management
|
|
112
|
+
- ❌ Nunca expor endpoints de model serving sem autenticação
|
|
113
|
+
- ❌ Nunca treinar com dados de produção sem aprovação de compliance
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security-scanner
|
|
3
|
+
description: Análise de segurança de código e infraestrutura — SAST, DAST, dependency audit, secrets scanning, OWASP Top 10 e hardening.
|
|
4
|
+
triggers:
|
|
5
|
+
- segurança
|
|
6
|
+
- security
|
|
7
|
+
- vulnerabilidade
|
|
8
|
+
- cve
|
|
9
|
+
- owasp
|
|
10
|
+
- pentest
|
|
11
|
+
- scan
|
|
12
|
+
- auditoria de segurança
|
|
13
|
+
- secrets
|
|
14
|
+
- injection
|
|
15
|
+
- xss
|
|
16
|
+
- csrf
|
|
17
|
+
- sql injection
|
|
18
|
+
- hardening
|
|
19
|
+
- sast
|
|
20
|
+
- dast
|
|
21
|
+
- dependências vulneráveis
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Security Scanner
|
|
25
|
+
|
|
26
|
+
## Objetivo
|
|
27
|
+
Identificar vulnerabilidades de segurança no código, dependências e infraestrutura, seguindo OWASP Top 10 e boas práticas de AppSec.
|
|
28
|
+
|
|
29
|
+
## Contexto necessário
|
|
30
|
+
- Linguagem/framework do projeto
|
|
31
|
+
- Tipo de aplicação (web, API, mobile, CLI)
|
|
32
|
+
- Ambiente (dev, staging, prod)
|
|
33
|
+
- Requisitos de compliance (SOC2, LGPD, PCI-DSS, HIPAA)
|
|
34
|
+
|
|
35
|
+
## Fluxo (inspect → plan → consent → apply → verify → audit)
|
|
36
|
+
|
|
37
|
+
1. **INSPECT** (read-only):
|
|
38
|
+
- Scan de dependências (CVEs conhecidos)
|
|
39
|
+
- Busca de secrets no código (API keys, senhas, tokens)
|
|
40
|
+
- Análise estática (SAST): injection, XSS, CSRF
|
|
41
|
+
- Verificação de configuração (CORS, headers, CSP)
|
|
42
|
+
- Análise de Dockerfile/compose (imagem base, root, ports)
|
|
43
|
+
|
|
44
|
+
2. **PLAN** — Relatório de vulnerabilidades por severidade:
|
|
45
|
+
|
|
46
|
+
| Severidade | Exemplo | Ação |
|
|
47
|
+
|-----------|---------|------|
|
|
48
|
+
| 🔴 Crítica | SQL injection, secret exposto | Fix imediato |
|
|
49
|
+
| 🟠 Alta | Dependência com CVE alto | Update urgente |
|
|
50
|
+
| 🟡 Média | CORS permissivo, headers faltando | Planejar fix |
|
|
51
|
+
| 🟢 Baixa | Versão desatualizada sem CVE | Monitorar |
|
|
52
|
+
|
|
53
|
+
3. **CONSENT**: Confirmar correções propostas
|
|
54
|
+
4. **APPLY**: Aplicar fixes + atualizar dependências
|
|
55
|
+
5. **VERIFY**: Re-scan para confirmar correção
|
|
56
|
+
6. **AUDIT**: Relatório de segurança antes/depois
|
|
57
|
+
|
|
58
|
+
## Capacidades
|
|
59
|
+
|
|
60
|
+
### 🔍 SAST (Static Application Security Testing)
|
|
61
|
+
- Análise de código sem executar
|
|
62
|
+
- Detecção de injection (SQL, NoSQL, command, LDAP)
|
|
63
|
+
- Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF)
|
|
64
|
+
- Insecure deserialization
|
|
65
|
+
- Path traversal e file inclusion
|
|
66
|
+
|
|
67
|
+
### 📦 Dependency Audit
|
|
68
|
+
- `npm audit` / `yarn audit` (JavaScript)
|
|
69
|
+
- `pip-audit` / `safety` (Python)
|
|
70
|
+
- `cargo audit` (Rust)
|
|
71
|
+
- `go vuln check` (Go)
|
|
72
|
+
- Snyk, Dependabot, Renovate para automação
|
|
73
|
+
|
|
74
|
+
### 🔑 Secrets Scanning
|
|
75
|
+
- Busca de: API keys, passwords, tokens, private keys, connection strings
|
|
76
|
+
- Ferramentas: gitleaks, truffleHog, detect-secrets
|
|
77
|
+
- Verificação em histórico do Git (commits antigos)
|
|
78
|
+
- Pre-commit hooks para prevenir novos leaks
|
|
79
|
+
|
|
80
|
+
### 🌐 DAST (Dynamic Application Security Testing)
|
|
81
|
+
- Scan de endpoint em runtime
|
|
82
|
+
- Ferramentas: OWASP ZAP, Nuclei, Burp Suite
|
|
83
|
+
- Verificação de headers de segurança (CSP, HSTS, X-Frame-Options)
|
|
84
|
+
- Teste de rate limiting e brute force
|
|
85
|
+
|
|
86
|
+
### 🏗️ Infrastructure Security
|
|
87
|
+
- Scan de imagens Docker (Trivy, Grype)
|
|
88
|
+
- Verificação de configuração cloud (Checkov, ScoutSuite)
|
|
89
|
+
- Network security (ports expostas, firewall rules)
|
|
90
|
+
- TLS/SSL assessment (testssl.sh, SSL Labs)
|
|
91
|
+
|
|
92
|
+
## OWASP Top 10 — Checklist
|
|
93
|
+
|
|
94
|
+
- [ ] **A01 Broken Access Control**: Verificar RBAC, IDOR, path traversal
|
|
95
|
+
- [ ] **A02 Cryptographic Failures**: TLS, hashing de senhas (bcrypt/argon2), encryption at rest
|
|
96
|
+
- [ ] **A03 Injection**: SQL, NoSQL, OS command, LDAP, XSS
|
|
97
|
+
- [ ] **A04 Insecure Design**: Threat modeling, abuse cases
|
|
98
|
+
- [ ] **A05 Security Misconfiguration**: Default configs, debug mode em prod, headers
|
|
99
|
+
- [ ] **A06 Vulnerable Components**: Dependencies com CVEs, EOL libraries
|
|
100
|
+
- [ ] **A07 Authentication Failures**: MFA, session management, brute force protection
|
|
101
|
+
- [ ] **A08 Data Integrity Failures**: CI/CD security, deserialization, updates sem verificação
|
|
102
|
+
- [ ] **A09 Logging Failures**: Logs sem dados sensíveis, monitoramento de atividade suspeita
|
|
103
|
+
- [ ] **A10 SSRF**: Validação de URLs, allowlists de destinos
|
|
104
|
+
|
|
105
|
+
## Ferramentas recomendadas
|
|
106
|
+
|
|
107
|
+
| Categoria | Ferramenta | Linguagem |
|
|
108
|
+
|-----------|-----------|-----------|
|
|
109
|
+
| SAST | Semgrep, CodeQL, SonarQube | Multi-linguagem |
|
|
110
|
+
| Deps | npm audit, pip-audit, Snyk | JS, Python, multi |
|
|
111
|
+
| Secrets | gitleaks, truffleHog | Qualquer |
|
|
112
|
+
| DAST | OWASP ZAP, Nuclei | Web apps |
|
|
113
|
+
| Docker | Trivy, Grype | Containers |
|
|
114
|
+
| Infra | Checkov, tfsec | Terraform, Cloud |
|
|
115
|
+
|
|
116
|
+
## Regras de segurança
|
|
117
|
+
- ✅ Scan de segurança deve rodar no CI/CD em cada PR
|
|
118
|
+
- ✅ Vulnerabilidades críticas bloqueiam merge
|
|
119
|
+
- ✅ Secrets encontrados devem ser revogados IMEDIATAMENTE
|
|
120
|
+
- ❌ Nunca ignorar CVEs críticos sem justificativa documentada
|
|
121
|
+
- ❌ Nunca publicar relatório de segurança detalhado em canal público
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-engineer
|
|
3
|
+
description: Criação e melhoria de testes (unitários, integração, E2E, performance). Cobertura, TDD, mocking, fixtures e estratégias de teste.
|
|
4
|
+
triggers:
|
|
5
|
+
- teste
|
|
6
|
+
- test
|
|
7
|
+
- tdd
|
|
8
|
+
- unitário
|
|
9
|
+
- integração
|
|
10
|
+
- e2e
|
|
11
|
+
- end-to-end
|
|
12
|
+
- cobertura
|
|
13
|
+
- coverage
|
|
14
|
+
- mock
|
|
15
|
+
- fixture
|
|
16
|
+
- pytest
|
|
17
|
+
- jest
|
|
18
|
+
- vitest
|
|
19
|
+
- playwright
|
|
20
|
+
- cypress
|
|
21
|
+
- benchmark
|
|
22
|
+
- performance test
|
|
23
|
+
- load test
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Test Engineer
|
|
27
|
+
|
|
28
|
+
## Objetivo
|
|
29
|
+
Criar, melhorar e manter testes robustos (unitários, integração, E2E, performance), garantindo cobertura adequada e confiança no deploy.
|
|
30
|
+
|
|
31
|
+
## Contexto necessário
|
|
32
|
+
- Linguagem/framework do projeto
|
|
33
|
+
- Framework de teste existente (Jest, Vitest, Pytest, Go test)
|
|
34
|
+
- Cobertura atual (se disponível)
|
|
35
|
+
- Áreas prioritárias ou código novo
|
|
36
|
+
|
|
37
|
+
## Fluxo (inspect → plan → consent → apply → verify → audit)
|
|
38
|
+
|
|
39
|
+
1. **INSPECT** (read-only):
|
|
40
|
+
- Verificar framework de teste configurado
|
|
41
|
+
- Medir cobertura atual por módulo
|
|
42
|
+
- Identificar áreas sem testes (módulos críticos)
|
|
43
|
+
- Listar funcionalidades sem cobertura E2E
|
|
44
|
+
|
|
45
|
+
2. **PLAN** — Estratégia de testes por camada:
|
|
46
|
+
|
|
47
|
+
| Camada | Proporção (Pirâmide) | Framework sugerido |
|
|
48
|
+
|--------|---------------------|-------------------|
|
|
49
|
+
| Unitários | ~70% | Jest, Vitest, Pytest, Go test |
|
|
50
|
+
| Integração | ~20% | Supertest, httpx, testcontainers |
|
|
51
|
+
| E2E | ~10% | Playwright, Cypress |
|
|
52
|
+
|
|
53
|
+
3. **CONSENT**: Confirmar escopo dos testes a criar
|
|
54
|
+
4. **APPLY**: Gerar testes + fixtures + mocks
|
|
55
|
+
5. **VERIFY**: Rodar testes, verificar cobertura
|
|
56
|
+
6. **AUDIT**: Registrar métricas de cobertura antes/depois
|
|
57
|
+
|
|
58
|
+
## Capacidades
|
|
59
|
+
|
|
60
|
+
### 🧪 Testes Unitários
|
|
61
|
+
- Testes isolados de funções/classes
|
|
62
|
+
- Mocking de dependências externas (APIs, DB, FS)
|
|
63
|
+
- Parametrização para múltiplos cenários
|
|
64
|
+
- Edge cases: null, undefined, empty, overflow, unicode
|
|
65
|
+
- Padrão AAA: Arrange → Act → Assert
|
|
66
|
+
|
|
67
|
+
### 🔗 Testes de Integração
|
|
68
|
+
- Testes de endpoints API (request → response)
|
|
69
|
+
- Testes com banco de dados real (testcontainers)
|
|
70
|
+
- Testes de filas/eventos (pub/sub, webhooks)
|
|
71
|
+
- Testes de contratos (consumer-driven contracts)
|
|
72
|
+
|
|
73
|
+
### 🌐 Testes E2E (End-to-End)
|
|
74
|
+
- Fluxos críticos de usuário (login, checkout, signup)
|
|
75
|
+
- Testes visuais (screenshot comparison)
|
|
76
|
+
- Testes cross-browser (Chrome, Firefox, Safari)
|
|
77
|
+
- Testes de acessibilidade (axe-core)
|
|
78
|
+
|
|
79
|
+
### ⚡ Testes de Performance
|
|
80
|
+
- Load testing (k6, Artillery, Locust)
|
|
81
|
+
- Benchmark de funções críticas
|
|
82
|
+
- Testes de latência e throughput
|
|
83
|
+
- Stress testing e limites de escalabilidade
|
|
84
|
+
|
|
85
|
+
### 📊 Cobertura e Métricas
|
|
86
|
+
- Cobertura de linhas, branches, funções
|
|
87
|
+
- Mutation testing (Stryker, mutmut) para medir qualidade dos testes
|
|
88
|
+
- Relatórios de tendência (cobertura ao longo do tempo)
|
|
89
|
+
|
|
90
|
+
## Checklists
|
|
91
|
+
|
|
92
|
+
### Escrevendo testes unitários
|
|
93
|
+
- [ ] Nome descritivo: `should_return_error_when_input_is_empty`
|
|
94
|
+
- [ ] Um assert por teste (preferencialmente)
|
|
95
|
+
- [ ] Sem dependência de estado externo (DB, rede, FS)
|
|
96
|
+
- [ ] Mocks com reset/cleanup entre testes
|
|
97
|
+
- [ ] Cobrir happy path + edge cases + error cases
|
|
98
|
+
- [ ] Sem sleep/wait — usar async assertions
|
|
99
|
+
|
|
100
|
+
### Escrevendo testes E2E
|
|
101
|
+
- [ ] Testar fluxo completo, não fragmentos
|
|
102
|
+
- [ ] Usar page objects / fixtures reutilizáveis
|
|
103
|
+
- [ ] Screenshots em caso de falha
|
|
104
|
+
- [ ] Retry para flakiness controlado
|
|
105
|
+
- [ ] Dados de teste isolados (seed + cleanup)
|
|
106
|
+
|
|
107
|
+
### Antes de deploy
|
|
108
|
+
- [ ] Todos os testes passam
|
|
109
|
+
- [ ] Cobertura mínima atendida (ex: 80%+)
|
|
110
|
+
- [ ] Nenhum teste flaky (intermitente)
|
|
111
|
+
- [ ] Testes de regressão validam fix de bugs anteriores
|
|
112
|
+
- [ ] Performance baseline mantida
|
|
113
|
+
|
|
114
|
+
## Ferramentas recomendadas
|
|
115
|
+
|
|
116
|
+
| Tipo | JavaScript/TS | Python | Go |
|
|
117
|
+
|------|--------------|--------|-----|
|
|
118
|
+
| Unitário | Jest, Vitest | Pytest | testing |
|
|
119
|
+
| API | Supertest | httpx, pytest-httpx | net/http/httptest |
|
|
120
|
+
| E2E | Playwright, Cypress | Playwright | chromedp |
|
|
121
|
+
| Performance | k6, Artillery | Locust | go-wrk |
|
|
122
|
+
| Cobertura | c8, istanbul | coverage.py | go test -cover |
|
|
123
|
+
| Mutation | Stryker | mutmut | go-mutesting |
|
|
124
|
+
|
|
125
|
+
## Regras de segurança
|
|
126
|
+
- ✅ Testes nunca devem conter dados reais de produção
|
|
127
|
+
- ✅ Fixtures devem usar dados sintéticos (faker, factory)
|
|
128
|
+
- ❌ Nunca desabilitar testes que falham — investigar e corrigir
|
|
129
|
+
- ❌ Nunca testar contra APIs de produção (usar mocks ou staging)
|