@neetru/cli 2.29.0 → 2.31.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/CHANGELOG.md +52 -0
- package/README.md +61 -17
- package/dist/commands/deploy.d.ts +45 -0
- package/dist/commands/deploy.js +134 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev-up.d.ts +7 -5
- package/dist/commands/dev-up.js +24 -23
- package/dist/commands/dev-up.js.map +1 -1
- package/dist/commands/docs-produto.d.ts +65 -0
- package/dist/commands/docs-produto.js +322 -0
- package/dist/commands/docs-produto.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +7 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.js +2 -0
- package/dist/commands/new.js.map +1 -1
- package/dist/index.js +72 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +8 -1
- package/dist/lib/api-client.js +20 -2
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/compose-generator.d.ts +13 -9
- package/dist/lib/compose-generator.js +28 -60
- package/dist/lib/compose-generator.js.map +1 -1
- package/dist/lib/config-schema.d.ts +40 -6
- package/dist/lib/config-schema.js +11 -0
- package/dist/lib/config-schema.js.map +1 -1
- package/dist/lib/product-docs/check.d.ts +62 -0
- package/dist/lib/product-docs/check.js +489 -0
- package/dist/lib/product-docs/check.js.map +1 -0
- package/dist/lib/product-docs/config.d.ts +66 -0
- package/dist/lib/product-docs/config.js +234 -0
- package/dist/lib/product-docs/config.js.map +1 -0
- package/dist/lib/product-docs/dates.d.ts +17 -0
- package/dist/lib/product-docs/dates.js +41 -0
- package/dist/lib/product-docs/dates.js.map +1 -0
- package/dist/lib/product-docs/frontmatter.d.ts +43 -0
- package/dist/lib/product-docs/frontmatter.js +302 -0
- package/dist/lib/product-docs/frontmatter.js.map +1 -0
- package/dist/lib/product-docs/git.d.ts +16 -0
- package/dist/lib/product-docs/git.js +92 -0
- package/dist/lib/product-docs/git.js.map +1 -0
- package/dist/lib/product-docs/markdown.d.ts +27 -0
- package/dist/lib/product-docs/markdown.js +98 -0
- package/dist/lib/product-docs/markdown.js.map +1 -0
- package/dist/lib/product-docs/ops.d.ts +133 -0
- package/dist/lib/product-docs/ops.js +975 -0
- package/dist/lib/product-docs/ops.js.map +1 -0
- package/dist/lib/product-docs/structure.d.ts +61 -0
- package/dist/lib/product-docs/structure.js +239 -0
- package/dist/lib/product-docs/structure.js.map +1 -0
- package/dist/lib/product-docs/sync.d.ts +101 -0
- package/dist/lib/product-docs/sync.js +313 -0
- package/dist/lib/product-docs/sync.js.map +1 -0
- package/dist/lib/product-docs/taxonomy.d.ts +46 -0
- package/dist/lib/product-docs/taxonomy.js +163 -0
- package/dist/lib/product-docs/taxonomy.js.map +1 -0
- package/dist/lib/product-docs/templates.d.ts +53 -0
- package/dist/lib/product-docs/templates.js +245 -0
- package/dist/lib/product-docs/templates.js.map +1 -0
- package/dist/lib/public-secret-scan.d.ts +76 -0
- package/dist/lib/public-secret-scan.js +446 -0
- package/dist/lib/public-secret-scan.js.map +1 -0
- package/package.json +1 -1
- package/templates/dev/Dockerfile.agent +0 -39
- package/templates/dev/agent-entrypoint.sh +0 -41
- package/templates/dev/docker-compose.dev.yml +0 -63
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modelos EMBUTIDOS dos docs de produto (PROTOCOLO_DOCS_PRODUTOS_SAAS §7.2/§7.4).
|
|
3
|
+
*
|
|
4
|
+
* Cada seção ganha um comentário `<!-- o que escrever aqui -->` que não aparece
|
|
5
|
+
* na leitura. Os modelos de `adr`, `plano` (rfc / spec-feature), `norma`
|
|
6
|
+
* (politica-acao) e o modelo de ameaças têm como base os de
|
|
7
|
+
* `neetru-zelo/docs/design/modelos/`, reescritos nas seções fixas do §7.4.
|
|
8
|
+
*/
|
|
9
|
+
import { serializeFrontmatter } from './frontmatter.js';
|
|
10
|
+
import { THREAT_MODEL_SECTIONS } from './structure.js';
|
|
11
|
+
export function renderDoc(spec) {
|
|
12
|
+
const fm = {
|
|
13
|
+
title: spec.title,
|
|
14
|
+
description: spec.description,
|
|
15
|
+
product: spec.product,
|
|
16
|
+
category: spec.category,
|
|
17
|
+
subcategory: spec.subcategory,
|
|
18
|
+
type: spec.type,
|
|
19
|
+
status: spec.status,
|
|
20
|
+
date: spec.date,
|
|
21
|
+
};
|
|
22
|
+
if (spec.updated)
|
|
23
|
+
fm.updated = spec.updated;
|
|
24
|
+
fm.owner = spec.owner ?? 'produto';
|
|
25
|
+
fm.audience = spec.audience;
|
|
26
|
+
if (spec.adr !== undefined)
|
|
27
|
+
fm.adr = spec.adr;
|
|
28
|
+
if (spec.order !== undefined)
|
|
29
|
+
fm.order = spec.order;
|
|
30
|
+
const parts = [serializeFrontmatter(fm), '', `# ${spec.title}`, '', `> ${spec.lead}`, ''];
|
|
31
|
+
for (const sec of spec.sections) {
|
|
32
|
+
parts.push(`## ${sec.title}`, '', `<!-- ${sec.hint}${sec.required ? ' (seção obrigatória)' : ''} -->`, '');
|
|
33
|
+
const extra = spec.extra?.[sec.title];
|
|
34
|
+
if (extra)
|
|
35
|
+
parts.push(extra, '');
|
|
36
|
+
}
|
|
37
|
+
return parts.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
|
|
38
|
+
}
|
|
39
|
+
// ─── extras dos modelos de base (zelo) ──────────────────────────────────────
|
|
40
|
+
export const ADR_EXTRA = {
|
|
41
|
+
'Alternativas consideradas': [
|
|
42
|
+
'### Opção A — <nome>',
|
|
43
|
+
'',
|
|
44
|
+
'- Prós:',
|
|
45
|
+
'- Contras:',
|
|
46
|
+
'- Custo e risco:',
|
|
47
|
+
'- Trade-off:',
|
|
48
|
+
'',
|
|
49
|
+
'### Opção B — <nome>',
|
|
50
|
+
'',
|
|
51
|
+
'- Prós:',
|
|
52
|
+
'- Contras:',
|
|
53
|
+
'- Custo e risco:',
|
|
54
|
+
'- Trade-off:',
|
|
55
|
+
].join('\n'),
|
|
56
|
+
'Consequências': [
|
|
57
|
+
'- Positivas:',
|
|
58
|
+
'- Negativas e dívida assumida:',
|
|
59
|
+
'- Como reverter:',
|
|
60
|
+
'- Onde a decisão passa a viver:',
|
|
61
|
+
'',
|
|
62
|
+
'| Requisito | Teste ou smoke que prova | Status |',
|
|
63
|
+
'|---|---|---|',
|
|
64
|
+
'| | | |',
|
|
65
|
+
].join('\n'),
|
|
66
|
+
};
|
|
67
|
+
export const PLANO_RFC_EXTRA = {
|
|
68
|
+
Proposta: [
|
|
69
|
+
'- Fluxo:',
|
|
70
|
+
'- Contrato (entrada, saída, erros):',
|
|
71
|
+
'- Estados e transições:',
|
|
72
|
+
'- Dados que trafegam:',
|
|
73
|
+
'',
|
|
74
|
+
'| Frente | O que muda | Risco |',
|
|
75
|
+
'|---|---|---|',
|
|
76
|
+
'| Interface | | |',
|
|
77
|
+
'| Servidor | | |',
|
|
78
|
+
'| Core | | |',
|
|
79
|
+
].join('\n'),
|
|
80
|
+
'Fases e critérios de aceite': ['- Rollout:', '- Rollback:', '- [ ] Critério verificável (teste, contrato, smoke)'].join('\n'),
|
|
81
|
+
'Decisões pendentes': ['- [ ] Dono: …', '- [ ] Core: …'].join('\n'),
|
|
82
|
+
};
|
|
83
|
+
export const PLANO_SPEC_EXTRA = {
|
|
84
|
+
Proposta: [
|
|
85
|
+
'- Resultado esperado (mensurável quando possível):',
|
|
86
|
+
'- Faz:',
|
|
87
|
+
'- Contrato e interface (entradas, saídas, erros, idempotência):',
|
|
88
|
+
'- Estados e transições (quem dispara, timeout, o que é auditado):',
|
|
89
|
+
'- Observabilidade (como saber que funcionou, sem dado pessoal):',
|
|
90
|
+
].join('\n'),
|
|
91
|
+
'Fora de escopo': '- Não faz:',
|
|
92
|
+
'Fases e critérios de aceite': ['- [ ] Teste:', '- [ ] Contrato:', '- [ ] Smoke:'].join('\n'),
|
|
93
|
+
Riscos: [
|
|
94
|
+
'- Offline e nova tentativa:',
|
|
95
|
+
'- Credencial inválida (401):',
|
|
96
|
+
'- Parâmetro ausente ou fora do intervalo:',
|
|
97
|
+
'- Concorrência e duplicidade:',
|
|
98
|
+
'- Dado velho:',
|
|
99
|
+
'- Privacidade e segurança (o que é coletado, o que nunca é):',
|
|
100
|
+
].join('\n'),
|
|
101
|
+
};
|
|
102
|
+
export const NORMA_POLITICA_EXTRA = {
|
|
103
|
+
Regras: [
|
|
104
|
+
'| Parâmetro | Tipo | Obrigatório | Valores aceitos | Validação |',
|
|
105
|
+
'|---|---|---|---|---|',
|
|
106
|
+
'| | | | | |',
|
|
107
|
+
].join('\n'),
|
|
108
|
+
'Como é verificado': [
|
|
109
|
+
'- [ ] Fora da lista permitida → recusado',
|
|
110
|
+
'- [ ] Parâmetro inválido → recusado antes de executar',
|
|
111
|
+
'- [ ] Expirado → não executa',
|
|
112
|
+
'- [ ] Resultado registrado na trilha de auditoria',
|
|
113
|
+
].join('\n'),
|
|
114
|
+
};
|
|
115
|
+
export const THREAT_EXTRA = {
|
|
116
|
+
'Ameaças': [
|
|
117
|
+
'| # | Categoria | Ameaça | Como exploraria | Impacto | Probabilidade | Risco |',
|
|
118
|
+
'|---|---|---|---|---|---|---|',
|
|
119
|
+
'| 1 | Falsificação de identidade | | | | | |',
|
|
120
|
+
'| 2 | Adulteração | | | | | |',
|
|
121
|
+
'| 3 | Repúdio | | | | | |',
|
|
122
|
+
'| 4 | Vazamento de informação | | | | | |',
|
|
123
|
+
'| 5 | Negação de serviço | | | | | |',
|
|
124
|
+
'| 6 | Elevação de privilégio | | | | | |',
|
|
125
|
+
].join('\n'),
|
|
126
|
+
'Mitigações': [
|
|
127
|
+
'| # | Mitigação | Tipo (prevenir, detectar, responder) | Onde implementa | Regra dura? |',
|
|
128
|
+
'|---|---|---|---|---|',
|
|
129
|
+
'| | | | | |',
|
|
130
|
+
].join('\n'),
|
|
131
|
+
};
|
|
132
|
+
export { THREAT_MODEL_SECTIONS };
|
|
133
|
+
// ─── README / CHANGELOG / index ─────────────────────────────────────────────
|
|
134
|
+
export function renderReadme(name) {
|
|
135
|
+
return [
|
|
136
|
+
`# ${name}`,
|
|
137
|
+
'',
|
|
138
|
+
'## O que é',
|
|
139
|
+
'',
|
|
140
|
+
'<!-- Em 2 ou 3 frases: o problema que o produto resolve e para quem. Detalhes em docs/produto/VISAO_DO_PRODUTO.md. -->',
|
|
141
|
+
'',
|
|
142
|
+
'## Como rodar local',
|
|
143
|
+
'',
|
|
144
|
+
'```bash',
|
|
145
|
+
'npm install',
|
|
146
|
+
'npm run dev',
|
|
147
|
+
'```',
|
|
148
|
+
'',
|
|
149
|
+
'<!-- Variáveis de ambiente de desenvolvimento, banco local (`neetru dev up`) e como logar. -->',
|
|
150
|
+
'',
|
|
151
|
+
'## Como fazer deploy',
|
|
152
|
+
'',
|
|
153
|
+
'```bash',
|
|
154
|
+
'neetru deploy --env staging',
|
|
155
|
+
'neetru deploy --env prod',
|
|
156
|
+
'```',
|
|
157
|
+
'',
|
|
158
|
+
'O passo a passo completo está em [docs/runbooks/RUNBOOK_DEPLOY.md](docs/runbooks/RUNBOOK_DEPLOY.md).',
|
|
159
|
+
'',
|
|
160
|
+
'## Documentação',
|
|
161
|
+
'',
|
|
162
|
+
'Comece por [docs/index.md](docs/index.md). Antes de abrir PR, rode `neetru docs check`.',
|
|
163
|
+
'',
|
|
164
|
+
].join('\n');
|
|
165
|
+
}
|
|
166
|
+
export function renderChangelog(seed) {
|
|
167
|
+
const head = [
|
|
168
|
+
'# Registro de mudanças',
|
|
169
|
+
'',
|
|
170
|
+
'Formato [Keep a Changelog](https://keepachangelog.com/pt-BR/), em PT-BR. A versão é a do `package.json`.',
|
|
171
|
+
'Cada linha é escrita para quem usa o produto; commit e PR entre parênteses no fim.',
|
|
172
|
+
'',
|
|
173
|
+
'## [Não lançado]',
|
|
174
|
+
'',
|
|
175
|
+
`## [${seed.version}] — ${seed.date}`,
|
|
176
|
+
'',
|
|
177
|
+
];
|
|
178
|
+
// Produto que já tem versões lançadas: nada de "primeira versão" — o
|
|
179
|
+
// registro só começa agora, e o histórico anterior está no git.
|
|
180
|
+
const body = seed.maduro
|
|
181
|
+
? ['### Alterado', '', '- Início do registro de mudanças neste formato. O histórico das versões anteriores está no git (`git log`).', '']
|
|
182
|
+
: ['### Adicionado', '', '- Primeira versão do produto.', ''];
|
|
183
|
+
return [...head, ...body].join('\n');
|
|
184
|
+
}
|
|
185
|
+
/** Link markdown seguro para caminhos com espaço/parênteses. */
|
|
186
|
+
function mdHref(rel) {
|
|
187
|
+
return rel
|
|
188
|
+
.split('/')
|
|
189
|
+
.map((seg) => encodeURIComponent(seg).replace(/\(/g, '%28').replace(/\)/g, '%29'))
|
|
190
|
+
.join('/');
|
|
191
|
+
}
|
|
192
|
+
export function renderIndex(opts) {
|
|
193
|
+
const fm = serializeFrontmatter({
|
|
194
|
+
title: `Documentação do ${opts.name}`,
|
|
195
|
+
description: `Porta de entrada da documentação do ${opts.name}: o que existe em cada pasta e por onde começar.`,
|
|
196
|
+
product: opts.product,
|
|
197
|
+
category: 'Documentação',
|
|
198
|
+
subcategory: 'indices',
|
|
199
|
+
type: 'indice',
|
|
200
|
+
status: 'draft',
|
|
201
|
+
date: opts.today,
|
|
202
|
+
updated: opts.today,
|
|
203
|
+
owner: 'produto',
|
|
204
|
+
audience: 'dev-produto',
|
|
205
|
+
});
|
|
206
|
+
const lines = [
|
|
207
|
+
fm,
|
|
208
|
+
'',
|
|
209
|
+
`# Documentação do ${opts.name}`,
|
|
210
|
+
'',
|
|
211
|
+
'> Para quem desenvolve e opera o produto. Segue o protocolo de documentação de produtos SaaS da Neetru (versão 1).',
|
|
212
|
+
'',
|
|
213
|
+
'## Por onde começar',
|
|
214
|
+
'',
|
|
215
|
+
'<!-- Ordem de leitura sugerida para quem chega ao produto. -->',
|
|
216
|
+
'',
|
|
217
|
+
];
|
|
218
|
+
for (const g of opts.groups) {
|
|
219
|
+
if (!g.files.length)
|
|
220
|
+
continue;
|
|
221
|
+
lines.push(`## ${g.label}`, '');
|
|
222
|
+
if (g.nota)
|
|
223
|
+
lines.push(`> ${g.nota}`, '');
|
|
224
|
+
for (const f of g.files) {
|
|
225
|
+
lines.push(`- [${f.title.replace(/[[\]]/g, '')}](${mdHref(f.rel)})${f.nomeForaDaRegra ? ' — nome fora da regra' : ''}`);
|
|
226
|
+
}
|
|
227
|
+
lines.push('');
|
|
228
|
+
}
|
|
229
|
+
lines.push('## Como manter', '', '- Doc novo: `neetru docs new <tipo> "<título>"` (cria na pasta certa, com nome e frontmatter do protocolo).', '- Antes de abrir PR: `neetru docs check --changed`.', '- Publicar no Core: `neetru docs sync` (ou `docs.publishOnDeploy: true` no neetru.config.json para publicar no deploy de produção).', '');
|
|
230
|
+
return lines.join('\n');
|
|
231
|
+
}
|
|
232
|
+
export const FOLDER_LABEL = {
|
|
233
|
+
produto: 'Produto',
|
|
234
|
+
arquitetura: 'Arquitetura',
|
|
235
|
+
api: 'API',
|
|
236
|
+
decisoes: 'Decisões',
|
|
237
|
+
runbooks: 'Runbooks',
|
|
238
|
+
guias: 'Guias',
|
|
239
|
+
integracoes: 'Integrações',
|
|
240
|
+
seguranca: 'Segurança',
|
|
241
|
+
usuario: 'Ajuda ao usuário',
|
|
242
|
+
planos: 'Planos',
|
|
243
|
+
relatorios: 'Relatórios',
|
|
244
|
+
};
|
|
245
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/lib/product-docs/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export interface SecretPattern {
|
|
2
|
+
id: 'nrt_key' | 'npk_key' | 'private_key';
|
|
3
|
+
label: string;
|
|
4
|
+
re: RegExp;
|
|
5
|
+
}
|
|
6
|
+
export declare const PUBLIC_SECRET_PATTERNS: readonly SecretPattern[];
|
|
7
|
+
/** Prefixos de env que os bundlers injetam no código do navegador/app. */
|
|
8
|
+
export declare const PUBLIC_ENV_PREFIXES: readonly ["NEXT_PUBLIC_", "EXPO_PUBLIC_", "VITE_", "REACT_APP_", "PUBLIC_"];
|
|
9
|
+
export declare function isKnownPublicValue(value: string): boolean;
|
|
10
|
+
export declare function isPublicSensitiveEnvName(name: string): boolean;
|
|
11
|
+
/** Até 8 caracteres iniciais (nunca mais que 1/4 do valor) + máscara. */
|
|
12
|
+
export declare function maskSecret(value: string): string;
|
|
13
|
+
/** Normaliza o nome de membro do tar: `\` → `/`, sem `./` nem `/` iniciais. */
|
|
14
|
+
export declare function normalizeEntryPath(p: string): string;
|
|
15
|
+
export declare function isPublicArtifactPath(relPath: string, stack?: string): boolean;
|
|
16
|
+
/** Arquivos maiores que isso não são varridos (e são reportados como não varridos). */
|
|
17
|
+
export declare const MAX_SCAN_FILE_BYTES: number;
|
|
18
|
+
export declare function isScannableFile(relPath: string): boolean;
|
|
19
|
+
export interface PublicSecretFinding {
|
|
20
|
+
/** Caminho relativo dentro do pacote. */
|
|
21
|
+
file: string;
|
|
22
|
+
/** `nrt_key` | `npk_key` | `private_key` | `public_env:<NOME>`. */
|
|
23
|
+
pattern: string;
|
|
24
|
+
/** Descrição PT-BR do padrão. */
|
|
25
|
+
label: string;
|
|
26
|
+
/** Prévia MASCARADA (nunca o segredo inteiro). */
|
|
27
|
+
preview: string;
|
|
28
|
+
}
|
|
29
|
+
export interface PublicEnvSecret {
|
|
30
|
+
name: string;
|
|
31
|
+
value: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ScanContext {
|
|
34
|
+
stack?: string;
|
|
35
|
+
envSecrets: readonly PublicEnvSecret[];
|
|
36
|
+
}
|
|
37
|
+
export interface ScanResult {
|
|
38
|
+
findings: PublicSecretFinding[];
|
|
39
|
+
scannedFiles: number;
|
|
40
|
+
/** Arquivos públicos grandes demais para varrer (caminhos). */
|
|
41
|
+
skippedLarge: string[];
|
|
42
|
+
}
|
|
43
|
+
/** Varre um conteúdo de arquivo. Dedup por (arquivo, padrão). */
|
|
44
|
+
export declare function scanContent(file: string, content: Buffer | string, envSecrets: readonly PublicEnvSecret[]): PublicSecretFinding[];
|
|
45
|
+
/** Parser mínimo de .env (KEY=VALUE, aspas simples/duplas, comentários). */
|
|
46
|
+
export declare function parseDotenv(content: string): Record<string, string>;
|
|
47
|
+
/** Arquivos .env que o bundler lê num build de produção (o `.env*` NÃO viaja no tarball). */
|
|
48
|
+
export declare const BUILD_ENV_FILES: readonly [".env", ".env.production", ".env.local", ".env.production.local"];
|
|
49
|
+
/**
|
|
50
|
+
* Coleta envs públicas com nome sensível a partir do ambiente do build:
|
|
51
|
+
* `.env*` do projeto, `--env-file` e `process.env` do CLI (o build roda com ele).
|
|
52
|
+
*/
|
|
53
|
+
export declare function collectPublicEnvSecrets(cwd: string, envFile?: string, processEnv?: NodeJS.ProcessEnv): Promise<PublicEnvSecret[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Lê um .tar.gz em streaming e chama `onFile` para cada arquivo regular que
|
|
56
|
+
* `want(nome, tamanho)` aceitar. Arquivos não desejados são pulados sem buffer.
|
|
57
|
+
*/
|
|
58
|
+
export declare function walkTarGz(tarPath: string, want: (name: string, size: number) => boolean, onFile: (name: string, data: Buffer) => void): Promise<void>;
|
|
59
|
+
/** Varre o tarball de deploy (o que de fato vai pro GCS). */
|
|
60
|
+
export declare function scanTarballForPublicSecrets(tarPath: string, ctx: ScanContext): Promise<ScanResult>;
|
|
61
|
+
/** Varre as pastas públicas no disco (target=cloud-run, onde não há tarball). */
|
|
62
|
+
export declare function scanDirectoryForPublicSecrets(root: string, ctx: ScanContext): Promise<ScanResult>;
|
|
63
|
+
export declare const ALLOW_PUBLIC_SECRET_FLAG = "--allow-public-secret";
|
|
64
|
+
/** Motivo mínimo do override (evita `--allow-public-secret x`). */
|
|
65
|
+
export declare const MIN_OVERRIDE_REASON_LENGTH = 10;
|
|
66
|
+
export declare function formatFindingsMessage(findings: readonly PublicSecretFinding[]): string;
|
|
67
|
+
export interface PublicSecretOverrideRecord {
|
|
68
|
+
reason: string;
|
|
69
|
+
findings: Array<{
|
|
70
|
+
file: string;
|
|
71
|
+
pattern: string;
|
|
72
|
+
}>;
|
|
73
|
+
at: string;
|
|
74
|
+
}
|
|
75
|
+
/** Registro do override — só caminho e tipo de padrão, NUNCA o valor. */
|
|
76
|
+
export declare function buildOverrideRecord(reason: string, findings: readonly PublicSecretFinding[], now?: Date): PublicSecretOverrideRecord;
|