@pathbit/agentdevkit 0.0.10 → 0.0.12

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.
Files changed (134) hide show
  1. package/.pbai4devs/COMPATIBILIDADE.md +6 -0
  2. package/.pbai4devs/INSTRUCTIONS.md +3 -0
  3. package/.pbai4devs/agents/README.md +19 -0
  4. package/.pbai4devs/agents/auditor-seguranca/AGENT.md +20 -0
  5. package/.pbai4devs/agents/auditor-seguranca/antigravity.yaml +8 -0
  6. package/.pbai4devs/agents/auditor-seguranca/claude.yaml +5 -0
  7. package/.pbai4devs/agents/auditor-seguranca/cursor.yaml +5 -0
  8. package/.pbai4devs/agents/auditor-seguranca/gemini.yaml +6 -0
  9. package/.pbai4devs/agents/auditor-seguranca/github.yaml +5 -0
  10. package/.pbai4devs/agents/auditor-seguranca/kimi-code.yaml +5 -0
  11. package/.pbai4devs/agents/auditor-seguranca/mimocode.yaml +8 -0
  12. package/.pbai4devs/agents/auditor-seguranca/opencode.yaml +11 -0
  13. package/.pbai4devs/agents/documentador/AGENT.md +19 -0
  14. package/.pbai4devs/agents/documentador/antigravity.yaml +8 -0
  15. package/.pbai4devs/agents/documentador/claude.yaml +5 -0
  16. package/.pbai4devs/agents/documentador/cursor.yaml +5 -0
  17. package/.pbai4devs/agents/documentador/gemini.yaml +6 -0
  18. package/.pbai4devs/agents/documentador/github.yaml +5 -0
  19. package/.pbai4devs/agents/documentador/kimi-code.yaml +5 -0
  20. package/.pbai4devs/agents/documentador/mimocode.yaml +8 -0
  21. package/.pbai4devs/agents/documentador/opencode.yaml +11 -0
  22. package/.pbai4devs/agents/implementador/AGENT.md +20 -0
  23. package/.pbai4devs/agents/implementador/antigravity.yaml +8 -0
  24. package/.pbai4devs/agents/implementador/claude.yaml +5 -0
  25. package/.pbai4devs/agents/implementador/cursor.yaml +5 -0
  26. package/.pbai4devs/agents/implementador/gemini.yaml +6 -0
  27. package/.pbai4devs/agents/implementador/github.yaml +5 -0
  28. package/.pbai4devs/agents/implementador/kimi-code.yaml +5 -0
  29. package/.pbai4devs/agents/implementador/mimocode.yaml +8 -0
  30. package/.pbai4devs/agents/implementador/opencode.yaml +11 -0
  31. package/.pbai4devs/agents/planejador/AGENT.md +19 -0
  32. package/.pbai4devs/agents/planejador/antigravity.yaml +8 -0
  33. package/.pbai4devs/agents/planejador/claude.yaml +5 -0
  34. package/.pbai4devs/agents/planejador/cursor.yaml +5 -0
  35. package/.pbai4devs/agents/planejador/gemini.yaml +6 -0
  36. package/.pbai4devs/agents/planejador/github.yaml +5 -0
  37. package/.pbai4devs/agents/planejador/kimi-code.yaml +5 -0
  38. package/.pbai4devs/agents/planejador/mimocode.yaml +8 -0
  39. package/.pbai4devs/agents/planejador/opencode.yaml +11 -0
  40. package/.pbai4devs/agents/validador/AGENT.md +19 -0
  41. package/.pbai4devs/agents/validador/antigravity.yaml +8 -0
  42. package/.pbai4devs/agents/validador/claude.yaml +5 -0
  43. package/.pbai4devs/agents/validador/cursor.yaml +5 -0
  44. package/.pbai4devs/agents/validador/gemini.yaml +6 -0
  45. package/.pbai4devs/agents/validador/github.yaml +5 -0
  46. package/.pbai4devs/agents/validador/kimi-code.yaml +5 -0
  47. package/.pbai4devs/agents/validador/mimocode.yaml +8 -0
  48. package/.pbai4devs/agents/validador/opencode.yaml +11 -0
  49. package/.pbai4devs/commands/README.md +13 -0
  50. package/.pbai4devs/commands/atualizar-documentacao/COMMAND.md +17 -0
  51. package/.pbai4devs/commands/auditar-seguranca/COMMAND.md +25 -0
  52. package/.pbai4devs/commands/implementar-entrega/COMMAND.md +20 -0
  53. package/.pbai4devs/commands/planejar-entrega/COMMAND.md +17 -0
  54. package/.pbai4devs/commands/preparar-seguranca/COMMAND.md +22 -0
  55. package/.pbai4devs/commands/validar-entrega/COMMAND.md +18 -0
  56. package/.pbai4devs/commands/verificar-dependencias/COMMAND.md +18 -0
  57. package/.pbai4devs/commands/verificar-segredos/COMMAND.md +19 -0
  58. package/.pbai4devs/external-skills/CATALOG.json +39 -1
  59. package/.pbai4devs/external-skills/README.md +13 -0
  60. package/.pbai4devs/rules/README.md +4 -0
  61. package/.pbai4devs/rules/documentacao/RULE.md +2 -0
  62. package/.pbai4devs/rules/execucao-local/RULE.md +20 -0
  63. package/.pbai4devs/rules/execucao-local/cursor.yaml +4 -0
  64. package/.pbai4devs/rules/seguranca/RULE.md +19 -0
  65. package/.pbai4devs/rules/seguranca/cursor.yaml +4 -0
  66. package/.pbai4devs/scripts/README.md +1 -0
  67. package/.pbai4devs/scripts/auditar-seguranca/README.md +57 -0
  68. package/.pbai4devs/scripts/auditar-seguranca/SCRIPT.mjs +411 -0
  69. package/.pbai4devs/scripts/auditar-seguranca/database-zip.mjs +143 -0
  70. package/.pbai4devs/scripts/auditar-seguranca/rules/javascript.yml +50 -0
  71. package/.pbai4devs/scripts/auditar-seguranca/tests/SMOKE.mjs +74 -0
  72. package/.pbai4devs/scripts/auditar-seguranca/tests/TEST.mjs +247 -0
  73. package/.pbai4devs/scripts/auditar-seguranca/tests/zip-fixture.mjs +45 -0
  74. package/.pbai4devs/scripts/lib/README.md +4 -0
  75. package/.pbai4devs/scripts/lib/gitignore.mjs +41 -4
  76. package/.pbai4devs/scripts/lib/managed-content.mjs +86 -0
  77. package/.pbai4devs/scripts/lib/managed-toml.mjs +192 -0
  78. package/.pbai4devs/scripts/lib/native-release.mjs +193 -0
  79. package/.pbai4devs/scripts/preparar-ferramentas/README.md +8 -2
  80. package/.pbai4devs/scripts/preparar-ferramentas/SCRIPT.mjs +46 -16
  81. package/.pbai4devs/scripts/preparar-ferramentas/tests/TEST.mjs +2 -0
  82. package/.pbai4devs/scripts/preparar-ferramentas/tests/native-release.test.mjs +103 -0
  83. package/.pbai4devs/scripts/sincronizar-agentes/README.md +9 -7
  84. package/.pbai4devs/scripts/sincronizar-agentes/SCRIPT.mjs +133 -38
  85. package/.pbai4devs/scripts/sincronizar-agentes/tests/COEXISTENCE.mjs +25 -15
  86. package/.pbai4devs/scripts/sincronizar-agentes/tests/HUMAN_OWNERSHIP.mjs +7 -2
  87. package/.pbai4devs/scripts/sincronizar-agentes/tests/LOCAL_IGNORE.mjs +3 -3
  88. package/.pbai4devs/scripts/sincronizar-agentes/tests/MANAGED_CONTENT.mjs +318 -0
  89. package/.pbai4devs/scripts/sincronizar-agentes/tests/TEST.mjs +47 -26
  90. package/.pbai4devs/scripts/verificar-recursos/SCRIPT.mjs +43 -7
  91. package/.pbai4devs/scripts/verificar-recursos/tests/TEST.mjs +3 -2
  92. package/.pbai4devs/skills/README.md +10 -2
  93. package/.pbai4devs/skills/projeto/preparar-ferramentas/SKILL.md +5 -1
  94. package/.pbai4devs/skills/seguranca/REFERENCE.md +104 -0
  95. package/.pbai4devs/skills/seguranca/corrigir-vulnerabilidade/SKILL.md +27 -0
  96. package/.pbai4devs/skills/seguranca/modelar-ameacas/SKILL.md +25 -0
  97. package/.pbai4devs/skills/seguranca/revisar-autorizacao/SKILL.md +29 -0
  98. package/.pbai4devs/skills/seguranca/revisar-seguranca/SKILL.md +27 -0
  99. package/.pbai4devs/templates/README.md +2 -0
  100. package/.pbai4devs/templates/revisao-seguranca/TEMPLATE.md +33 -0
  101. package/.pbai4devs/tools/README.md +11 -3
  102. package/.pbai4devs/tools/gitleaks/README.md +22 -0
  103. package/.pbai4devs/tools/gitleaks/SCRIPT.mjs +5 -0
  104. package/.pbai4devs/tools/gitleaks/TOOL.json +67 -0
  105. package/.pbai4devs/tools/opengrep/README.md +22 -0
  106. package/.pbai4devs/tools/opengrep/SCRIPT.mjs +5 -0
  107. package/.pbai4devs/tools/opengrep/TOOL.json +71 -0
  108. package/.pbai4devs/tools/osv-scanner/README.md +23 -0
  109. package/.pbai4devs/tools/osv-scanner/SCRIPT.mjs +5 -0
  110. package/.pbai4devs/tools/osv-scanner/TOOL.json +70 -0
  111. package/CHANGELOG.md +17 -0
  112. package/README.en.md +3 -2
  113. package/README.es.md +3 -2
  114. package/README.md +8 -3
  115. package/docs/README.md +6 -3
  116. package/docs/guides/README.md +1 -0
  117. package/docs/guides/cli.md +2 -1
  118. package/docs/guides/installation.md +25 -8
  119. package/docs/guides/resources.md +48 -1
  120. package/docs/guides/security-references.md +97 -0
  121. package/docs/guides/security.md +32 -0
  122. package/docs/guides/troubleshooting.md +8 -5
  123. package/docs/maintainers/maintenance.md +12 -0
  124. package/docs/maintainers/packages.md +2 -2
  125. package/docs/product/design.md +10 -3
  126. package/docs/product/prd.md +5 -1
  127. package/docs/product/roadmap.md +4 -0
  128. package/docs/specs/README.md +4 -0
  129. package/docs/specs/additive-integration/README.md +9 -0
  130. package/docs/specs/additive-integration/SPEC.md +53 -0
  131. package/docs/specs/security-ecosystem/README.md +9 -0
  132. package/docs/specs/security-ecosystem/SPEC.md +53 -0
  133. package/package.json +1 -1
  134. package/src/install.mjs +139 -63
@@ -2,9 +2,12 @@
2
2
  import { existsSync, lstatSync, readFileSync, readdirSync } from 'node:fs';
3
3
  import { basename, dirname, extname, isAbsolute, join, relative, resolve, sep } from 'node:path';
4
4
  import { spawnSync } from 'node:child_process';
5
+ import { createHash } from 'node:crypto';
5
6
  import { isMain, projectRoot, requireNode } from '../lib/runtime.mjs';
6
7
  import { buildCatalog } from '../lib/catalog.mjs';
7
8
  import { isGeneratedOutput } from '../lib/gitignore.mjs';
9
+ import { canonicalEntrypoint, extractManagedBlock, managedBlockDigest } from '../lib/managed-content.mjs';
10
+ import { extractTomlManagedBlock, tomlManagedBlockDigest } from '../lib/managed-toml.mjs';
8
11
 
9
12
  const fail = message => { throw new Error(message); };
10
13
  const normalize = value => value.split(sep).join('/');
@@ -29,28 +32,38 @@ function checkedPath(root, path) {
29
32
 
30
33
  function ownership(root) {
31
34
  const file = checkedPath(root, '.pbai4devs/estado/agentdevkit.json');
32
- if (!checkedStat(root, file)) return null;
35
+ const derivedFile = checkedPath(root, '.pbai4devs/estado/derived.json');
36
+ if (!checkedStat(root, file) && !checkedStat(root, derivedFile)) return null;
33
37
  const readState = location => {
34
38
  try { return JSON.parse(readFileSync(location, 'utf8')); }
35
39
  catch { fail(`Estado invalido: ${normalize(relative(root, location))}`); }
36
40
  };
37
- const state = readState(file);
41
+ const state = checkedStat(root, file) ? readState(file) : { schemaVersion: 1, files: {}, blocks: {} };
38
42
  const validMap = value => value && typeof value === 'object' && !Array.isArray(value)
39
43
  && Object.values(value).every(hash => typeof hash === 'string' && /^[a-f0-9]{64}$/.test(hash));
40
44
  if (state?.schemaVersion !== 1 || !validMap(state.files) || !validMap(state.blocks)) fail('Estado de propriedade invalido.');
41
45
  const files = { ...state.files };
42
- const derivedFile = checkedPath(root, '.pbai4devs/estado/derived.json');
46
+ const blocks = { ...state.blocks };
43
47
  if (checkedStat(root, derivedFile)) {
44
48
  const derived = readState(derivedFile);
45
- if (derived?.schemaVersion !== 1 || !validMap(derived.entries) || Object.keys(derived.entries).some(path => !['AGENTS.md', 'CLAUDE.md', 'GEMINI.md'].includes(path))
49
+ if (derived?.schemaVersion !== 1 || !validMap(derived.entries) || Object.keys(derived.entries).some(path => !canonicalEntrypoint(path))
50
+ || !validMap(derived.files ?? {}) || !validMap(derived.blocks ?? {})
51
+ || !Array.isArray(derived.removedBlocks ?? []) || (derived.removedBlocks ?? []).some(path => typeof path !== 'string')
46
52
  || !validMap(derived.outputs ?? {}) || Object.keys(derived.outputs ?? {}).some(path => !/^\.[a-z0-9][a-z0-9-]*\/(?:skills|rules|agents)\.json$/.test(path))) fail('Estado de entradas derivadas invalido.');
47
- Object.assign(files, derived.entries, derived.outputs);
53
+ Object.assign(files, derived.entries, derived.outputs, derived.files);
54
+ for (const [path, hash] of Object.entries({ ...derived.entries, ...derived.files })) {
55
+ const location = checkedPath(root, path);
56
+ if (checkedStat(root, location)?.isFile() && createHash('sha256').update(readFileSync(location)).digest('hex') === hash) delete blocks[path];
57
+ }
58
+ for (const path of derived.removedBlocks ?? []) { checkedPath(root, path); delete blocks[path]; }
59
+ Object.assign(blocks, derived.blocks);
48
60
  }
49
- for (const path of [...Object.keys(files), ...Object.keys(state.blocks)]) {
61
+ for (const path of Object.keys(blocks)) delete files[path];
62
+ for (const path of [...Object.keys(files), ...Object.keys(blocks)]) {
50
63
  const location = checkedPath(root, path);
51
64
  if (!checkedStat(root, location)?.isFile()) fail(`Arquivo gerenciado ausente: ${path}`);
52
65
  }
53
- return { files, blocks: state.blocks };
66
+ return { files, blocks };
54
67
  }
55
68
 
56
69
  export function registryRoots(root) {
@@ -151,6 +164,28 @@ export function localLinkTargets(text) {
151
164
  }).filter(Boolean);
152
165
  }
153
166
 
167
+ export function checkManagedBlocks(root, blocks) {
168
+ for (const [path, expected] of Object.entries(blocks)) {
169
+ const toml = extname(path).toLowerCase() === '.toml';
170
+ if (!toml && !['.md', '.mdc'].includes(extname(path).toLowerCase())) continue;
171
+ const file = checkedPath(root, path), bytes = readFileSync(file);
172
+ if ((toml ? tomlManagedBlockDigest(bytes) : managedBlockDigest(bytes)) !== expected) fail(`Bloco AgentDevKit alterado ou ausente: ${path}`);
173
+ const block = toml ? extractTomlManagedBlock(bytes) : extractManagedBlock(bytes);
174
+ const imports = [...block.matchAll(/^@(?:\{([^}\r\n]+)\}|([^\r\n]+))$/gm)]
175
+ .filter(match => !match[2]?.startsWith('['))
176
+ .map(match => ({ target: match[1] || match[2], base: match[1] ? root : dirname(file) }));
177
+ for (const { target, base } of [...localLinkTargets(block).map(target => ({ target, base: dirname(file) })), ...imports]) {
178
+ const destination = resolve(base, target), local = normalize(relative(root, destination));
179
+ if (!local || isAbsolute(local) || local === '..' || local.startsWith('../')) fail(`Referencia fora do projeto: ${path}`);
180
+ if (canonicalEntrypoint(local)) {
181
+ // The user's root entry may be an existing link; do not follow it.
182
+ const item = lstatSync(destination);
183
+ if (!item.isFile() && !item.isSymbolicLink()) fail(`Referencia indisponivel: ${path}`);
184
+ } else if (!checkedStat(root, checkedPath(root, local))?.isFile()) fail(`Referencia indisponivel: ${path}`);
185
+ }
186
+ }
187
+ }
188
+
154
189
  export function checkMarkdown(root, files, { virtualPaths = new Set() } = {}) {
155
190
  for (const file of files) {
156
191
  const label = normalize(relative(root, file));
@@ -237,6 +272,7 @@ export function verifyResources({ root = projectRoot, sourceOnly = false, synchr
237
272
  const files = collectMarkdown(root, registry, { installed });
238
273
  const virtualPaths = new Set(sourceOnly ? [...built.outputs.keys(), '.pbai4devs/espelhos.conf'] : []);
239
274
  checkMarkdown(root, files, { virtualPaths });
275
+ if (installed) checkManagedBlocks(root, installed.blocks);
240
276
  checkResourceReferences(root, files);
241
277
  checkAgentExtras(root, registry.agents, { installed });
242
278
  return { files, messages: [...lint(root, files), 'recursos=passed'] };
@@ -162,10 +162,11 @@ test('instalação confere entradas derivadas sem aplicar lint a blocos humanos'
162
162
  const contents = document('# Entrada gerada\n');
163
163
  file('GEMINI.md', contents);
164
164
  file('.pbai4devs/estado/derived.json', JSON.stringify({ schemaVersion: 1, entries: { 'GEMINI.md': createHash('sha256').update(contents).digest('hex') } }));
165
- file('AGENTS.md', '# Instruções humanas sem frontmatter\n\n<!-- BEGIN AGENTDEVKIT -->\nLeia as fontes.\n<!-- END AGENTDEVKIT -->\n');
165
+ const block = '<!-- BEGIN AGENTDEVKIT -->\nLeia as fontes.\n<!-- END AGENTDEVKIT -->';
166
+ file('AGENTS.md', `# Instruções humanas sem frontmatter\n\n${block}\n`);
166
167
  const statePath = join(root, '.pbai4devs/estado/agentdevkit.json');
167
168
  const state = JSON.parse(readFileSync(statePath, 'utf8'));
168
- state.blocks['AGENTS.md'] = createHash('sha256').update('bloco registrado').digest('hex');
169
+ state.blocks['AGENTS.md'] = createHash('sha256').update(block).digest('hex');
169
170
  state.files['.pbai4devs/skills/exemplo/SKILL.md'] = createHash('sha256').update('fonte anterior').digest('hex');
170
171
  writeFileSync(statePath, JSON.stringify(state));
171
172
  const result = verify(root);
@@ -4,13 +4,19 @@ description: Finalidade e criação de skills compartilhadas.
4
4
 
5
5
  # Skills
6
6
 
7
- São procedimentos reutilizáveis, organizados em `git`, `projeto`, `produto` e
8
- `specs`. Cada skill usa `<grupo>/<nome>/SKILL.md` com nome e descrição no YAML.
7
+ São procedimentos reutilizáveis, organizados por assunto. Cada skill usa
8
+ `<grupo>/<nome>/SKILL.md` com nome e descrição no YAML. A skill orienta decisões;
9
+ o agente responsável pode acionar comandos, scripts e outros perfis conforme
10
+ as capacidades do cliente.
9
11
 
10
12
  - `git`: operações de versionamento.
11
13
  - `projeto`: configuração, criação e manutenção dos recursos.
12
14
  - `produto`: PRD, experiência e design técnico.
13
15
  - `specs`: especificações, roadmap e implementação.
16
+ - `seguranca`: [revisão](seguranca/revisar-seguranca/SKILL.md),
17
+ [autorização](seguranca/revisar-autorizacao/SKILL.md),
18
+ [ameaças](seguranca/modelar-ameacas/SKILL.md) e
19
+ [correção](seguranca/corrigir-vulnerabilidade/SKILL.md).
14
20
 
15
21
  Use `criar-skill` quando uma tarefa recorrente precisar de decisões próprias;
16
22
  use `criar-recurso` para encontrar um fluxo existente antes de criar outro.
@@ -21,4 +27,6 @@ Use [proximos-passos](projeto/proximos-passos/SKILL.md) para orientar a
21
27
  continuidade conforme a fase e as pendências reais.
22
28
 
23
29
  O [guia compartilhado](../INSTRUCTIONS.md) orienta o uso das skills.
30
+ As skills de segurança integram a instalação do kit; os scanners exigem
31
+ [preparo explícito](../commands/preparar-seguranca/COMMAND.md).
24
32
  Ao alterar o inventário, sincronize os índices e apontamentos locais.
@@ -24,7 +24,8 @@ instalador compartilhado.
24
24
  No preparo inicial, execute `preparar-ferramentas setup` pelo seletor:
25
25
  instala e verifica todas as ferramentas compatíveis, sem atualizar as saudáveis.
26
26
  Aceita seleção por nome/grupo; relate falhas e itens não aplicáveis.
27
- Para buscar versões novas, `update` consulta `latest` oficial.
27
+ Para npm, `update` consulta `latest` oficial; ferramentas nativas de segurança
28
+ seguem o pin revisado em `TOOL.json`, sem atualização silenciosa para outro binário.
28
29
  `install` reutiliza uma instalação saudável; `check` verifica sem rede;
29
30
  `info` mostra a configuração; `run <nome> [argumentos]` executa sem instalar.
30
31
  Sem ação, mostre ajuda. Não interprete ausência de argumentos como instalação.
@@ -41,6 +42,9 @@ Em `skills`, use `find` ou `add <origem> --list`; incorporações passam por
41
42
  O shell virtual não substitui testes reais. Só ative proxy, certificados,
42
43
  serviços ou gravação quando necessários à tarefa e com dependências preparadas.
43
44
 
45
+ Para segurança, use [preparar-seguranca](../../../commands/preparar-seguranca/COMMAND.md).
46
+ Preparar o CLI e atualizar bases são operações separadas da análise offline.
47
+
44
48
  Antes de usar agent-desktop, leia `skills get desktop` e `skills get platform`
45
49
  da versão instalada e confira `status`. Para agent-browser, leia
46
50
  `skills get core` e `--help` da versão instalada e
@@ -0,0 +1,104 @@
1
+ ---
2
+ description: Segurança com scanners locais, triagem e provas de controles.
3
+ ---
4
+
5
+ # Segurança local
6
+
7
+ A instalação do kit inclui skills, regras, comandos e perfis de segurança.
8
+ Os scanners são preparados por uma ação explícita; os arquivos de instrução
9
+ não iniciam auditorias, serviços ou downloads em segundo plano.
10
+
11
+ ## Como os componentes trabalham juntos
12
+
13
+ O comando [auditar-seguranca][audit] organiza o trabalho. A
14
+ [skill de revisão][review] define como analisar e o [auditor][auditor] faz a
15
+ triagem contextual. O script executa ferramentas e produz evidências; as
16
+ [regras][rules] orientam todas as etapas. Veja o [catálogo de comandos](../../commands/README.md).
17
+
18
+ | Ferramenta | Pergunta que ajuda a responder |
19
+ | --- | --- |
20
+ | [Gitleaks][gitleaks] | Há indícios de segredos nos arquivos analisados? |
21
+ | [OSV-Scanner][osv] | A base local conhece falhas nas versões das dependências? |
22
+ | [Opengrep][opengrep] | O código corresponde aos padrões das regras locais? |
23
+
24
+ As ferramentas executam localmente e não exigem conta ou assinatura.
25
+ Versões revisadas e suas origens ficam nos `TOOL.json`. Downloads públicos de
26
+ binários e bases são separados da análise. A política do cliente/modelo de IA
27
+ continua sendo própria; não coloque valores secretos no contexto da conversa.
28
+
29
+ ## Preparar e executar
30
+
31
+ Use Node.js 24+ e o projeto autorizado. O fluxo de
32
+ [preparar-seguranca][prepare] instala os scanners e confere seu funcionamento:
33
+
34
+ ```console
35
+ node .pbai4devs/scripts/preparar-ferramentas/SCRIPT.mjs setup security
36
+ ```
37
+
38
+ Para dependências, baixe a base dos ecossistemas realmente utilizados. Exemplo
39
+ para npm; substitua por `Go` ou pela seleção suportada que corresponda ao projeto:
40
+
41
+ ```console
42
+ node .pbai4devs/scripts/auditar-seguranca/SCRIPT.mjs update-data --ecosystems npm
43
+ node .pbai4devs/scripts/auditar-seguranca/SCRIPT.mjs check
44
+ node .pbai4devs/scripts/auditar-seguranca/SCRIPT.mjs run
45
+ ```
46
+
47
+ `run` usa os três checks: `secrets`, `dependencies` e `sast`. Para limitar,
48
+ use [verificar-segredos][secrets] ou [verificar-dependencias][dependencies].
49
+ A análise usa dados locais; base ausente não autoriza enviar o projeto a uma API.
50
+ Confira no relatório a versão da ferramenta, a base e o escopo efetivamente lido.
51
+
52
+ ## O que ainda precisa ser provado
53
+
54
+ O [artigo sobre falhas recorrentes][article] motiva os temas abaixo. As
55
+ verificações dependem da arquitetura e não equivalem a uma certificação.
56
+
57
+ | Tema | Prova necessária no projeto |
58
+ | --- | --- |
59
+ | Autorização no servidor | API direta recusa visitante e papel insuficiente. |
60
+ | Acesso por identificador | Usuário A não lê ou altera o recurso de B. |
61
+ | Isolamento dos dados | Policies/RLS ou Security Rules restringem o acesso. |
62
+ | Segredos | Credenciais privadas não chegam a fontes, bundles ou logs. |
63
+ | Entradas e abuso | Testes de validação, saída, upload e limites do fluxo. |
64
+
65
+ RLS é um controle de PostgreSQL usado pelo Supabase; Firebase tem Security Rules.
66
+ SDKs privilegiados podem atravessar esses controles e precisam de autorização
67
+ no servidor. Esconder um botão de administrador não protege a API.
68
+
69
+ Use [revisar-autorizacao][authorization] com identidades sintéticas distintas,
70
+ testes negativos e dados locais. Para entradas, prefira consultas parametrizadas,
71
+ codificação de saída por contexto e limites de upload; sanitização genérica não
72
+ resolve todos os casos. Teste a interface no navegador quando ela existir.
73
+ Sem aplicação executável, registre essas provas como **não verificadas**.
74
+
75
+ ## Interpretar e corrigir
76
+
77
+ O runner retorna `0` sem achados, `1` com achados e `2` em falha ou verificação
78
+ incompleta. Leia o estado de cada check: não aplicável e não executado não
79
+ significam aprovado. Regras locais e formatos suportados limitam a cobertura.
80
+
81
+ O relatório fica em `.agent-tests/security/<execucao>/report.json`, sem valores
82
+ secretos. O auditor distingue suspeitas, falhas confirmadas e falsos positivos.
83
+ Use [modelar-ameacas][threats] para novos fluxos e
84
+ [corrigir-vulnerabilidade][fix] para reparar a causa com teste de regressão.
85
+ Uma credencial real exposta precisa de revogação pelo responsável; não a teste
86
+ contra serviços externos. Feche a entrega com [revisão independente][gate].
87
+
88
+ [Skills](../README.md) · [Ferramentas](../../tools/README.md)
89
+
90
+ [audit]: ../../commands/auditar-seguranca/COMMAND.md
91
+ [review]: ../../skills/seguranca/revisar-seguranca/SKILL.md
92
+ [auditor]: ../../agents/auditor-seguranca/AGENT.md
93
+ [rules]: ../../rules/seguranca/RULE.md
94
+ [gitleaks]: ../../tools/gitleaks/README.md
95
+ [osv]: ../../tools/osv-scanner/README.md
96
+ [opengrep]: ../../tools/opengrep/README.md
97
+ [prepare]: ../../commands/preparar-seguranca/COMMAND.md
98
+ [secrets]: ../../commands/verificar-segredos/COMMAND.md
99
+ [dependencies]: ../../commands/verificar-dependencias/COMMAND.md
100
+ [authorization]: ../../skills/seguranca/revisar-autorizacao/SKILL.md
101
+ [threats]: ../../skills/seguranca/modelar-ameacas/SKILL.md
102
+ [fix]: ../../skills/seguranca/corrigir-vulnerabilidade/SKILL.md
103
+ [gate]: ../../commands/revisar-entrega/COMMAND.md
104
+ [article]: https://manodeyvin.com.br/p/5-vacilacoes-de-seguranca-que-a-ia
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: corrigir-vulnerabilidade
3
+ description: Corrige um achado validado e prova que a causa foi removida.
4
+ ---
5
+
6
+ # Corrigir vulnerabilidade
7
+
8
+ Receba o achado e sua evidência de [revisar-seguranca](../revisar-seguranca/SKILL.md).
9
+ Confirme o caminho de abuso e o escopo autorizado. Esclareça dúvidas e apresente
10
+ o plano antes de editar, respeitando aprovações já dadas.
11
+
12
+ Corrija a causa, preserve o contrato legítimo e acrescente um teste de regressão
13
+ que falhe antes e passe depois. Não silencie regra ou exclua arquivo apenas
14
+ para deixar o scanner verde; documente falsos positivos com justificativa.
15
+
16
+ Use [implementar-spec](../../specs/implementar-spec/SKILL.md) quando houver spec
17
+ e [verificar-trabalho](../../projeto/verificar-trabalho/SKILL.md) para as provas.
18
+ Repita o scanner relevante e o cenário original. Mudanças web exigem navegador;
19
+ autorização exige a matriz de [permissões](../revisar-autorizacao/SKILL.md).
20
+
21
+ Se houver segredo real, não o reproduza. Informe o responsável para revogação
22
+ e rotação pelo canal apropriado; remover do código não invalida a credencial.
23
+ Não altere contas, histórico Git ou serviços externos sem escopo explícito.
24
+
25
+ Saída: correção, teste, risco residual e documentação atualizada. Feche com
26
+ [revisar-entrega](../../../commands/revisar-entrega/COMMAND.md), incluindo
27
+ revisão independente e evidências ignoradas em `.agent-tests/security/`.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: modelar-ameacas
3
+ description: Identifica ativos, fronteiras de confiança e ameaças do escopo aprovado.
4
+ ---
5
+
6
+ # Modelar ameaças
7
+
8
+ Leia produto, design e código relacionados. Reúna primeiro as dúvidas sobre
9
+ dados, atores, operações privilegiadas e limites do ambiente. Registre o que
10
+ é fato, hipótese ou informação ausente; não invente arquitetura.
11
+
12
+ Mapeie os ativos, entradas, fluxos e fronteiras de confiança. Para cada ameaça,
13
+ descreva pré-condição, caminho de abuso, impacto, controle e teste observável.
14
+ Priorize o que o desenho realmente permite: acesso entre usuários, elevação
15
+ de privilégio, vazamento, injeção e abuso de recursos.
16
+
17
+ Use o [modelo de revisão](../../../templates/revisao-seguranca/TEMPLATE.md)
18
+ como apoio e o [auditor](../../../agents/auditor-seguranca/AGENT.md) para revisão.
19
+ Se o projeto precisar de um documento permanente, combine seu destino com o
20
+ usuário e siga [atualizar-documentacao](../../projeto/atualizar-documentacao/SKILL.md).
21
+ Rascunhos e evidências ficam em `.agent-tests/security/`.
22
+
23
+ Saída: ameaças priorizadas, controles existentes, lacunas e critérios de teste.
24
+ O modelo orienta [revisar-seguranca](../revisar-seguranca/SKILL.md); não comprova
25
+ que os controles foram implementados ou testados.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: revisar-autorizacao
3
+ description: Verifica identidade, permissões por recurso e isolamento entre usuários.
4
+ ---
5
+
6
+ # Revisar autorização
7
+
8
+ Identifique sujeitos, papéis, recursos e operações permitidas. Leia rotas,
9
+ middleware, políticas de dados e testes; não deduza autorização pela interface.
10
+ Se o contrato não existir, reúna as dúvidas antes de propor mudanças.
11
+
12
+ Confira autenticação e autorização no servidor em cada operação sensível,
13
+ incluindo IDs manipuláveis, operações em lote e ações administrativas.
14
+ Em PostgreSQL/Supabase, revise RLS, policies, papéis e acessos privilegiados.
15
+ Em Firebase, revise Security Rules e SDKs privilegiados; são controles distintos.
16
+
17
+ Com contas sintéticas no ambiente local autorizado, prove no mínimo:
18
+
19
+ - Visitante não autenticado recebe a recusa prevista.
20
+ - Usuário A acessa seu recurso e não acessa o de B trocando o identificador.
21
+ - Usuário comum não obtém a ação administrativa pela API direta.
22
+ - Listagens, alterações e exclusões obedecem ao mesmo isolamento.
23
+
24
+ Use testes de API e, quando houver interface, navegador conforme
25
+ [verificar-trabalho](../../projeto/verificar-trabalho/SKILL.md).
26
+ Não crie contas reais nem use dados de produção para essa prova.
27
+ Sem aplicação executável ou identidades de teste, registre **não verificado**.
28
+ Entregue matriz de permissões, resultados e achados sem segredos em
29
+ `.agent-tests/security/`, usando o [modelo](../../../templates/revisao-seguranca/TEMPLATE.md).
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: revisar-seguranca
3
+ description: Revisa riscos de segurança com análise local, contexto e provas.
4
+ ---
5
+
6
+ # Revisar segurança
7
+
8
+ Defina o escopo: mudança ou projeto, dados sensíveis, stack e ambiente autorizado.
9
+ Leia as regras de [segurança](../../../rules/seguranca/RULE.md) e
10
+ [execução local](../../../rules/execucao-local/RULE.md). Não amplie o alvo.
11
+
12
+ Use [auditar-seguranca](../../../commands/auditar-seguranca/COMMAND.md) para
13
+ os scanners disponíveis e o [auditor](../../../agents/auditor-seguranca/AGENT.md)
14
+ para interpretar os resultados. Uma ferramenta ausente ou base indisponível
15
+ gera pendência; resultado vazio não substitui análise de contexto.
16
+
17
+ Revise também autenticação, autorização por recurso, isolamento de dados,
18
+ segredos e entradas conforme o [guia](../REFERENCE.md).
19
+ Use [revisar-autorizacao](../revisar-autorizacao/SKILL.md) para permissões e
20
+ [modelar-ameacas](../modelar-ameacas/SKILL.md) quando houver novas fronteiras.
21
+
22
+ Registre achado, evidência, impacto, confiança e estado da triagem, sem valores
23
+ secretos. Diferencie vulnerabilidade confirmada, suspeita e falso positivo.
24
+ Prove cenários de API pelo terminal e fluxos web no navegador local autorizado,
25
+ seguindo [verificar-trabalho](../../projeto/verificar-trabalho/SKILL.md).
26
+ Salve o relatório em `.agent-tests/security/`; não declare o produto seguro
27
+ com base apenas em scanners. Encaminhe correções à skill correspondente.
@@ -28,6 +28,7 @@ enquanto o usuário estiver preparando somente a estrutura dos agentes.
28
28
  | [Revisão de entrega][revisao] | Implementação | Antes de commit/merge. |
29
29
  | [Release][release], [CHANGELOG][changelog] | Primeira entrega | Publicar. |
30
30
  | [SECURITY][security] | Suporte público | Política/suporte mudar. |
31
+ | [Revisão de segurança][security-review] | Análise autorizada | Ameaças e provas. |
31
32
  | [Comando][comando] | Recurso agêntico | Entrada ou fluxo mudar. |
32
33
 
33
34
  Antes, inventarie e leia os documentos existentes com `atualizar-documentacao`.
@@ -65,4 +66,5 @@ Modelos, configurações e relatórios não são espelhados nas pastas dos agent
65
66
  [release]: release/TEMPLATE.md
66
67
  [changelog]: changelog/TEMPLATE.md
67
68
  [security]: seguranca/TEMPLATE.md
69
+ [security-review]: revisao-seguranca/TEMPLATE.md
68
70
  [comando]: comando/TEMPLATE.md
@@ -0,0 +1,33 @@
1
+ ---
2
+ description: Modelo de contexto, ameaças, achados e provas de segurança.
3
+ status: modelo
4
+ ---
5
+
6
+ # Revisão de segurança
7
+
8
+ Preencha com fatos do escopo autorizado. Resultados e rascunhos ficam em
9
+ `.agent-tests/security/`; combine o destino de documentação permanente.
10
+ Este modelo complementa o relatório JSON dos scanners, sem substituir suas provas.
11
+
12
+ ## Contexto
13
+
14
+ Alvo, alteração, ambiente, ativos, atores, operações e fronteiras de confiança.
15
+ Registre fontes, hipóteses e dúvidas; não preencha lacunas com suposições.
16
+
17
+ ## Ameaças e controles
18
+
19
+ | Ameaça | Pré-condição | Impacto | Controle existente | Teste necessário |
20
+ | --- | --- | --- | --- | --- |
21
+ | A definir | A confirmar | A confirmar | Evidência | Resultado esperado |
22
+
23
+ ## Achados
24
+
25
+ | ID | Local | Evidência sem segredo | Confiança | Estado | Próxima ação |
26
+ | --- | --- | --- | --- | --- | --- |
27
+ | SEC-001 | Arquivo/linha | Evidência | A avaliar | A triar | Responsável |
28
+
29
+ ## Validação
30
+
31
+ Critério, comando ou cenário, resultado, caminho da prova e limitações.
32
+ Separe o que passou, falhou, não se aplica e não foi executado.
33
+ Registre revisão independente e risco residual antes de concluir.
@@ -8,8 +8,9 @@ Cada pasta mantém `TOOL.json`, `SCRIPT.mjs` e um guia.
8
8
  O catálogo local `catalog.json` relaciona essas definições aos comandos
9
9
  de instalação, atualização, verificação e execução. Ao editar definições,
10
10
  rode `sincronizar-agentes` e `--check`; versões instaladas ficam no estado local.
11
- O instalador comum consulta `latest` na origem oficial e instala com
12
- `--ignore-scripts`. Pacotes e estado ficam em `<nome>/.local/`; cache em
11
+ Para npm, o instalador consulta `latest` e usa `--ignore-scripts`.
12
+ Scanners nativos usam versões e SHA-256 revisados em `TOOL.json`; `update`
13
+ aplica esse pin. Pacotes e estado ficam em `<nome>/.local/`; cache em
13
14
  `.cache/` e atalhos em `bin/`, todos ignorados. Tools ficam só em `.pbai4devs`.
14
15
 
15
16
  | CLI | Grupo | Uso |
@@ -22,9 +23,14 @@ O instalador comum consulta `latest` na origem oficial e instala com
22
23
  | [opensrc][source] | source | Fontes de dependências. |
23
24
  | [webreel][video] | video | Roteiros e vídeos do navegador. |
24
25
  | [portless][proxy] | proxy | Proxy e URLs locais estáveis. |
26
+ | [gitleaks](gitleaks/README.md) | security | Segredos em arquivos e Git. |
27
+ | [osv-scanner](osv-scanner/README.md) | security | Dependências com base local. |
28
+ | [opengrep](opengrep/README.md) | security | Código com regras locais. |
25
29
 
26
30
  `setup` instala e verifica todos os CLIs compatíveis. O grupo `base` limita a
27
- seleção a navegador e lint; outros grupos permitem escolher por tarefa.
31
+ seleção a navegador e lint; `security` seleciona os três scanners.
32
+ As bases de vulnerabilidades são preparadas separadamente; instalar o CLI
33
+ não transforma uma base ausente em resultado limpo.
28
34
  Confira Node/npm pelo [primeiro uso][manager] antes de executar os scripts.
29
35
  O instalador usa o mesmo Node 24+ com npm em todos os sistemas. Plataformas aceitas
30
36
  ficam em cada `TOOL.json`; ausência de restrição npm não comprova teste do SO.
@@ -45,6 +51,8 @@ O [instalador comum][manager] aceita nomes ou grupos, como `setup`, `install bas
45
51
  `update video`, `check source` e `list`.
46
52
 
47
53
  O preparo verifica o CLI; fluxos de aplicação precisam de provas específicas.
54
+ O [fluxo de segurança](../commands/auditar-seguranca/COMMAND.md) usa análise
55
+ offline e relatórios redigidos. Downloads públicos exigem rede, não conta.
48
56
  Skills usa descoberta sem importação automática ou symlinks. Portless é opt-in:
49
57
  o preparo não inicia proxy. Webreel exige executáveis explícitos para gravar
50
58
  sem baixar recursos em `~/.webreel`; seu guia lista os overrides. Use caminhos
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: Instalacao local revisada do gitleaks.
3
+ ---
4
+
5
+ # gitleaks
6
+
7
+ Procura segredos em arquivos e no historico Git.
8
+
9
+ Versao revisada: **8.30.1**. Licenca: [MIT](https://github.com/gitleaks/gitleaks/blob/v8.30.1/LICENSE).
10
+ Downloads vem da [release oficial](https://github.com/gitleaks/gitleaks/releases/tag/v8.30.1);
11
+ cada plataforma tem SHA-256 fixado em `TOOL.json`.
12
+
13
+ `SCRIPT.mjs install` baixa e verifica o executavel. `update` aplica a versao
14
+ revisada do catalogo; nao seleciona `latest` sem revisao. `check` verifica
15
+ integridade e versao sem rede; `run` preserva argumentos e codigo de saida.
16
+ Use `node .pbai4devs/tools/gitleaks/SCRIPT.mjs <acao>`.
17
+
18
+ Use os comandos de seguranca do kit para obter saida redigida. Resultados
19
+ exigem triagem; revogar credenciais reais continua necessario.
20
+
21
+ Binarios, caches e resultados ficam locais e ignorados. O CLI nao exige
22
+ conta nem pagamento. Consulte o [gerenciador](../../scripts/preparar-ferramentas/README.md).
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { main } from '../../scripts/preparar-ferramentas/SCRIPT.mjs';
3
+
4
+ try { process.exitCode = await main(['--tool', "gitleaks", ...process.argv.slice(2)]); }
5
+ catch (error) { console.error(error.message); process.exitCode = 1; }
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "gitleaks",
3
+ "description": "Detecta segredos locais e no historico Git.",
4
+ "group": "security",
5
+ "source": "https://github.com/gitleaks/gitleaks/releases/tag/v8.30.1",
6
+ "license": "MIT",
7
+ "licenseSource": "https://github.com/gitleaks/gitleaks/blob/v8.30.1/LICENSE",
8
+ "download": {
9
+ "provider": "github-release",
10
+ "repository": "gitleaks/gitleaks",
11
+ "channel": "reviewed",
12
+ "version": "8.30.1",
13
+ "tag": "v8.30.1",
14
+ "assets": {
15
+ "darwin-arm64": {
16
+ "file": "gitleaks_8.30.1_darwin_arm64.tar.gz",
17
+ "format": "tar.gz",
18
+ "binary": "gitleaks",
19
+ "sha256": "b40ab0ae55c505963e365f271a8d3846efbc170aa17f2607f13df610a9aeb6a5"
20
+ },
21
+ "darwin-x64": {
22
+ "file": "gitleaks_8.30.1_darwin_x64.tar.gz",
23
+ "format": "tar.gz",
24
+ "binary": "gitleaks",
25
+ "sha256": "dfe101a4db2255fc85120ac7f3d25e4342c3c20cf749f2c20a18081af1952709"
26
+ },
27
+ "linux-arm64": {
28
+ "file": "gitleaks_8.30.1_linux_arm64.tar.gz",
29
+ "format": "tar.gz",
30
+ "binary": "gitleaks",
31
+ "sha256": "e4a487ee7ccd7d3a7f7ec08657610aa3606637dab924210b3aee62570fb4b080"
32
+ },
33
+ "linux-x64": {
34
+ "file": "gitleaks_8.30.1_linux_x64.tar.gz",
35
+ "format": "tar.gz",
36
+ "binary": "gitleaks",
37
+ "sha256": "551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb"
38
+ },
39
+ "win32-arm64": {
40
+ "file": "gitleaks_8.30.1_windows_arm64.zip",
41
+ "format": "zip",
42
+ "binary": "gitleaks.exe",
43
+ "sha256": "b95f5e4f5c425cedca7ee203d9afd29597e692c4924a12ed42f970537c72cc0f"
44
+ },
45
+ "win32-x64": {
46
+ "file": "gitleaks_8.30.1_windows_x64.zip",
47
+ "format": "zip",
48
+ "binary": "gitleaks.exe",
49
+ "sha256": "d29144deff3a68aa93ced33dddf84b7fdc26070add4aa0f4513094c8332afc4e"
50
+ }
51
+ }
52
+ },
53
+ "platforms": [
54
+ "darwin-arm64",
55
+ "darwin-x64",
56
+ "linux-arm64",
57
+ "linux-x64",
58
+ "win32-arm64",
59
+ "win32-x64"
60
+ ],
61
+ "scripts": {
62
+ "entry": "SCRIPT.mjs"
63
+ },
64
+ "probe": [
65
+ "version"
66
+ ]
67
+ }
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: Instalacao local revisada do opengrep.
3
+ ---
4
+
5
+ # opengrep
6
+
7
+ Executa regras SAST armazenadas no projeto.
8
+
9
+ Versao revisada: **1.33.1**. Licenca: [LGPL-2.1](https://github.com/opengrep/opengrep/blob/v1.33.1/LICENSE).
10
+ Downloads vem da [release oficial](https://github.com/opengrep/opengrep/releases/tag/v1.33.1);
11
+ cada plataforma tem SHA-256 fixado em `TOOL.json`.
12
+
13
+ `SCRIPT.mjs install` baixa e verifica o executavel. `update` aplica a versao
14
+ revisada do catalogo; nao seleciona `latest` sem revisao. `check` verifica
15
+ integridade e versao sem rede; `run` preserva argumentos e codigo de saida.
16
+ Use `node .pbai4devs/tools/opengrep/SCRIPT.mjs <acao>`.
17
+
18
+ Use `--config` com regras locais e `--disable-version-check`. Nao use `auto`
19
+ ou URLs de regras no modo local.
20
+
21
+ Binarios, caches e resultados ficam locais e ignorados. O CLI nao exige
22
+ conta nem pagamento. Consulte o [gerenciador](../../scripts/preparar-ferramentas/README.md).
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { main } from '../../scripts/preparar-ferramentas/SCRIPT.mjs';
3
+
4
+ try { process.exitCode = await main(['--tool', "opengrep", ...process.argv.slice(2)]); }
5
+ catch (error) { console.error(error.message); process.exitCode = 1; }