@neetru/cli 2.29.0 → 2.32.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 +141 -0
- package/README.md +63 -17
- package/dist/cli-kit/choices.d.ts +33 -0
- package/dist/cli-kit/choices.js +32 -0
- package/dist/cli-kit/command-context.d.ts +98 -0
- package/dist/cli-kit/command-context.js +108 -0
- package/dist/cli-kit/errors.d.ts +79 -0
- package/dist/cli-kit/errors.js +94 -0
- package/dist/cli-kit/index.d.ts +8 -0
- package/dist/cli-kit/index.js +8 -0
- package/dist/cli-kit/suggest.d.ts +74 -0
- package/dist/cli-kit/suggest.js +207 -0
- package/dist/commands/admin/oidc-login.js +1 -1
- package/dist/commands/admin/sdk-credential.js +1 -1
- package/dist/commands/autocomplete.d.ts +1 -1
- package/dist/commands/autocomplete.js +1 -0
- package/dist/commands/bug.d.ts +59 -0
- package/dist/commands/bug.js +114 -2
- package/dist/commands/build.d.ts +24 -1
- package/dist/commands/build.js +195 -73
- package/dist/commands/chat.d.ts +94 -1
- package/dist/commands/chat.js +258 -26
- package/dist/commands/customers.js +1 -1
- package/dist/commands/db-move.js +3 -3
- package/dist/commands/db.js +17 -24
- package/dist/commands/deploy.d.ts +136 -2
- package/dist/commands/deploy.js +547 -69
- package/dist/commands/deployments.js +11 -6
- package/dist/commands/dev-context.js +15 -5
- package/dist/commands/dev-up.d.ts +7 -5
- package/dist/commands/dev-up.js +24 -23
- package/dist/commands/docs-produto.d.ts +90 -0
- package/dist/commands/docs-produto.js +384 -0
- package/dist/commands/doctor.js +36 -1
- package/dist/commands/domains.js +85 -4
- package/dist/commands/env.d.ts +9 -3
- package/dist/commands/env.js +23 -3
- package/dist/commands/infra-read.js +2 -2
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +14 -1
- package/dist/commands/login.js +35 -8
- package/dist/commands/logs.js +12 -4
- package/dist/commands/mobile.js +33 -9
- package/dist/commands/new.d.ts +31 -1
- package/dist/commands/new.js +94 -4
- package/dist/commands/open.js +16 -6
- package/dist/commands/ops.js +1 -1
- package/dist/commands/products-db.d.ts +1 -0
- package/dist/commands/products-db.js +41 -8
- package/dist/commands/products.d.ts +17 -3
- package/dist/commands/products.js +84 -16
- package/dist/commands/promote.js +30 -5
- package/dist/commands/secrets.d.ts +91 -0
- package/dist/commands/secrets.js +471 -0
- package/dist/commands/servers.js +6 -4
- package/dist/commands/status.js +2 -2
- package/dist/commands/support.js +5 -3
- package/dist/commands/tenants.js +28 -16
- package/dist/commands/upgrade.d.ts +9 -0
- package/dist/commands/upgrade.js +50 -1
- package/dist/commands/vm-memory.js +1 -0
- package/dist/commands/webhooks.d.ts +2 -0
- package/dist/commands/webhooks.js +9 -3
- package/dist/commands/workspaces.js +42 -11
- package/dist/index.js +142 -20
- package/dist/lib/api-client.d.ts +22 -1
- package/dist/lib/api-client.js +79 -8
- package/dist/lib/api-error.d.ts +14 -0
- package/dist/lib/api-error.js +107 -46
- package/dist/lib/build-targets.d.ts +127 -0
- package/dist/lib/build-targets.js +348 -0
- package/dist/lib/cli-error.d.ts +13 -0
- package/dist/lib/cli-error.js +24 -0
- package/dist/lib/cli-write.d.ts +43 -9
- package/dist/lib/cli-write.js +154 -45
- package/dist/lib/compose-generator.d.ts +13 -9
- package/dist/lib/compose-generator.js +28 -60
- package/dist/lib/config-schema.d.ts +36 -2
- package/dist/lib/config-schema.js +11 -0
- package/dist/lib/db-local/db-json.d.ts +1 -1
- package/dist/lib/db-local/db-json.js +13 -5
- package/dist/lib/db-local/env.d.ts +15 -3
- package/dist/lib/db-local/env.js +37 -10
- package/dist/lib/db-pipeline/build-deps.d.ts +5 -1
- package/dist/lib/db-pipeline/build-deps.js +23 -3
- package/dist/lib/db-pipeline/types.d.ts +6 -2
- package/dist/lib/db-pipeline/types.js +0 -18
- package/dist/lib/deploy-target-contract.d.ts +152 -0
- package/dist/lib/deploy-target-contract.js +411 -0
- package/dist/lib/env-file-do-build.d.ts +19 -0
- package/dist/lib/env-file-do-build.js +44 -0
- package/dist/lib/envs.d.ts +108 -0
- package/dist/lib/envs.js +127 -0
- package/dist/lib/fs-seguro.d.ts +63 -0
- package/dist/lib/fs-seguro.js +108 -0
- package/dist/lib/mobile-local/mobile-json.js +10 -4
- package/dist/lib/pickers.d.ts +44 -7
- package/dist/lib/pickers.js +60 -4
- package/dist/lib/product-docs/check.d.ts +62 -0
- package/dist/lib/product-docs/check.js +489 -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/dates.d.ts +17 -0
- package/dist/lib/product-docs/dates.js +41 -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/git.d.ts +16 -0
- package/dist/lib/product-docs/git.js +92 -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/ops.d.ts +133 -0
- package/dist/lib/product-docs/ops.js +975 -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/sync.d.ts +107 -0
- package/dist/lib/product-docs/sync.js +322 -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/templates.d.ts +53 -0
- package/dist/lib/product-docs/templates.js +245 -0
- package/dist/lib/public-secret-scan.d.ts +117 -0
- package/dist/lib/public-secret-scan.js +771 -0
- package/dist/lib/render.d.ts +16 -0
- package/dist/lib/render.js +34 -4
- package/dist/lib/segredo-produto.d.ts +124 -0
- package/dist/lib/segredo-produto.js +336 -0
- package/dist/lib/texto-utf8.d.ts +96 -0
- package/dist/lib/texto-utf8.js +196 -0
- package/package.json +2 -1
- package/dist/cli-kit/format.js.map +0 -1
- package/dist/cli-kit/glyphs.js.map +0 -1
- package/dist/cli-kit/index.js.map +0 -1
- package/dist/cli-kit/palette.js.map +0 -1
- package/dist/commands/add.js.map +0 -1
- package/dist/commands/admin/iam-check.js.map +0 -1
- package/dist/commands/admin/oidc-login.js.map +0 -1
- package/dist/commands/admin/sdk-credential.js.map +0 -1
- package/dist/commands/agent-release.js.map +0 -1
- package/dist/commands/agent-write.js.map +0 -1
- package/dist/commands/ai-models.js.map +0 -1
- package/dist/commands/ai.js.map +0 -1
- package/dist/commands/api-catalog.js.map +0 -1
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/artifact-registry.js.map +0 -1
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/autocomplete.js.map +0 -1
- package/dist/commands/billing.js.map +0 -1
- package/dist/commands/bootstrap.js.map +0 -1
- package/dist/commands/bug.js.map +0 -1
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/chat-menu.js.map +0 -1
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/cloud-run.js.map +0 -1
- package/dist/commands/code.js.map +0 -1
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/customers.js.map +0 -1
- package/dist/commands/db-move.js.map +0 -1
- package/dist/commands/db.js.map +0 -1
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/deployments.js.map +0 -1
- package/dist/commands/dev-context.js.map +0 -1
- package/dist/commands/dev-up.js.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/docs.js.map +0 -1
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/domains.js.map +0 -1
- package/dist/commands/dr.js.map +0 -1
- package/dist/commands/env.js.map +0 -1
- package/dist/commands/hosting-write.js.map +0 -1
- package/dist/commands/infra-read.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/mobile.js.map +0 -1
- package/dist/commands/mocks.js.map +0 -1
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/open.js.map +0 -1
- package/dist/commands/ops.js.map +0 -1
- package/dist/commands/products-db.js.map +0 -1
- package/dist/commands/products.js.map +0 -1
- package/dist/commands/promote.js.map +0 -1
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/schema.js.map +0 -1
- package/dist/commands/servers.js.map +0 -1
- package/dist/commands/smoke.js.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/support.js.map +0 -1
- package/dist/commands/surface-status.js.map +0 -1
- package/dist/commands/tenants.js.map +0 -1
- package/dist/commands/ui.js.map +0 -1
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/vm-memory.js.map +0 -1
- package/dist/commands/vm.js.map +0 -1
- package/dist/commands/webhooks.js.map +0 -1
- package/dist/commands/whoami.js.map +0 -1
- package/dist/commands/workspaces.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/agent-artifact-url.js.map +0 -1
- package/dist/lib/agent-commands.js.map +0 -1
- package/dist/lib/ai/auth-discovery.js.map +0 -1
- package/dist/lib/ai/context.js.map +0 -1
- package/dist/lib/ai/orchestrator.js.map +0 -1
- package/dist/lib/api-client.js.map +0 -1
- package/dist/lib/api-error.js.map +0 -1
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/cli-read.js.map +0 -1
- package/dist/lib/cli-write.js.map +0 -1
- package/dist/lib/code-agent-budget.js.map +0 -1
- package/dist/lib/code-agent-files.js.map +0 -1
- package/dist/lib/code-agent-gateway.js.map +0 -1
- package/dist/lib/code-agent-git-tools.js.map +0 -1
- package/dist/lib/code-agent-protocol.js.map +0 -1
- package/dist/lib/code-agent-session.js.map +0 -1
- package/dist/lib/code-agent-settings.js.map +0 -1
- package/dist/lib/code-agent-skills.js.map +0 -1
- package/dist/lib/code-agent-subagents.js.map +0 -1
- package/dist/lib/code-agent-tools.js.map +0 -1
- package/dist/lib/code-agent-tui.js.map +0 -1
- package/dist/lib/code-agent-types.js.map +0 -1
- package/dist/lib/code-agent-ui.js.map +0 -1
- package/dist/lib/code-agent-web-tools.js.map +0 -1
- package/dist/lib/code-agent-write-tools.js.map +0 -1
- package/dist/lib/compose-generator.js.map +0 -1
- package/dist/lib/config-schema.js.map +0 -1
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/db-local/db-json.js.map +0 -1
- package/dist/lib/db-local/env.js.map +0 -1
- package/dist/lib/db-local/fingerprint.js.map +0 -1
- package/dist/lib/db-local/index.js.map +0 -1
- package/dist/lib/db-pipeline/build-deps.js.map +0 -1
- package/dist/lib/db-pipeline/errors.js.map +0 -1
- package/dist/lib/db-pipeline/index.js.map +0 -1
- package/dist/lib/db-pipeline/pipeline.js.map +0 -1
- package/dist/lib/db-pipeline/rehearse.js.map +0 -1
- package/dist/lib/db-pipeline/types.js.map +0 -1
- package/dist/lib/dev-local-context.js.map +0 -1
- package/dist/lib/iam-preflight.js.map +0 -1
- package/dist/lib/mobile-local/index.js.map +0 -1
- package/dist/lib/mobile-local/mobile-json.js.map +0 -1
- package/dist/lib/pickers.js.map +0 -1
- package/dist/lib/product-config.js.map +0 -1
- package/dist/lib/render.js.map +0 -1
- package/dist/lib/schema-cache.js.map +0 -1
- package/dist/lib/sse.js.map +0 -1
- package/dist/lib/telemetry.js.map +0 -1
- package/dist/lib/token-resolver.js.map +0 -1
- package/dist/lib/url-allowlist.js.map +0 -1
- package/dist/lib/version-check.js.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/logo.js.map +0 -1
- package/dist/utils/safe-exit.js.map +0 -1
- package/dist/utils/spinner-registry.js.map +0 -1
- package/dist/version.js.map +0 -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,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estrutura do `docs/` de um produto SaaS (PROTOCOLO_DOCS_PRODUTOS_SAAS §3, §6, §7)
|
|
3
|
+
* e modelos por tipo (PROTOCOLO_WIKI_INTERNA §7.4, §8).
|
|
4
|
+
*
|
|
5
|
+
* Tudo aqui é dado puro — sem I/O — para o validador, o `init`, o `new` e o
|
|
6
|
+
* `--migrar` lerem da mesma tabela.
|
|
7
|
+
*/
|
|
8
|
+
export interface FolderRule {
|
|
9
|
+
/** Pasta de primeiro nível dentro de `docs/` ('' = a raiz de `docs/`). */
|
|
10
|
+
folder: string;
|
|
11
|
+
types: string[] | 'qualquer';
|
|
12
|
+
category: string;
|
|
13
|
+
subcategory: string;
|
|
14
|
+
audience: 'dev-produto' | 'publico' | 'staff';
|
|
15
|
+
idade: 'corrente' | 'intermediaria' | 'permanente' | 'gerada';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* §3 do protocolo de produtos. `category/subcategory` são o PADRÃO da pasta
|
|
19
|
+
* (o protocolo diz "a do assunto" em várias — o padrão é só o ponto de partida).
|
|
20
|
+
*/
|
|
21
|
+
export declare const FOLDER_RULES: FolderRule[];
|
|
22
|
+
/** Pastas do §3 que o `docs init` cria. */
|
|
23
|
+
export declare const STANDARD_FOLDERS: string[];
|
|
24
|
+
/** Pastas que o validador não visita. `_audit/` é saída de script (só FM001). */
|
|
25
|
+
export declare const SKIP_DIRS: Set<string>;
|
|
26
|
+
/** Primeira pasta de um caminho relativo a `docs/` ('' para a raiz). */
|
|
27
|
+
export declare function topFolder(relPath: string): string;
|
|
28
|
+
export declare function folderRule(relPath: string): FolderRule | undefined;
|
|
29
|
+
export interface DayOneItem {
|
|
30
|
+
/** Caminho relativo à RAIZ do repositório. */
|
|
31
|
+
path: string;
|
|
32
|
+
/** Obrigatório só quando o produto expõe /api/v1. */
|
|
33
|
+
soComApi?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare const DAY_ONE: DayOneItem[];
|
|
36
|
+
/** "No primeiro mês" (recomendado; o validador só sugere). */
|
|
37
|
+
export declare const FIRST_MONTH: string[];
|
|
38
|
+
/** Seções que o README da raiz precisa ter (§7) — casamento tolerante. */
|
|
39
|
+
export declare const README_SECTIONS: Array<{
|
|
40
|
+
label: string;
|
|
41
|
+
match: RegExp;
|
|
42
|
+
}>;
|
|
43
|
+
export interface Section {
|
|
44
|
+
title: string;
|
|
45
|
+
required: boolean;
|
|
46
|
+
/** Orientação que vira `<!-- … -->` dentro da seção. */
|
|
47
|
+
hint: string;
|
|
48
|
+
}
|
|
49
|
+
export declare const TYPE_MODELS: Record<string, Section[]>;
|
|
50
|
+
/** Modelo de ameaças (base: `neetru-zelo/docs/design/modelos/threat-model.md`) — um `referencia` em `seguranca/`. */
|
|
51
|
+
export declare const THREAT_MODEL_SECTIONS: Section[];
|
|
52
|
+
/** Seções obrigatórias dos docs do mínimo do primeiro dia (§7.2), por caminho relativo a `docs/`. */
|
|
53
|
+
export declare const DAY_ONE_MODELS: Record<string, Section[]>;
|
|
54
|
+
export declare const FILE_NAME_REGEX: RegExp;
|
|
55
|
+
/** Prefixo de nome por tipo (doc novo). `referencia` não tem prefixo obrigatório. */
|
|
56
|
+
export declare const TYPE_PREFIX: Record<string, string>;
|
|
57
|
+
/** Pasta onde `docs new <tipo>` cria o doc, quando a categoria não decide. */
|
|
58
|
+
export declare const TYPE_DEFAULT_FOLDER: Record<string, string>;
|
|
59
|
+
/** Pasta preferida por categoria (quando o tipo cabe nela). */
|
|
60
|
+
export declare const CATEGORY_FOLDER: Record<string, string>;
|
|
61
|
+
export declare const STOPWORDS: Set<string>;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Estrutura do `docs/` de um produto SaaS (PROTOCOLO_DOCS_PRODUTOS_SAAS §3, §6, §7)
|
|
3
|
+
* e modelos por tipo (PROTOCOLO_WIKI_INTERNA §7.4, §8).
|
|
4
|
+
*
|
|
5
|
+
* Tudo aqui é dado puro — sem I/O — para o validador, o `init`, o `new` e o
|
|
6
|
+
* `--migrar` lerem da mesma tabela.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* §3 do protocolo de produtos. `category/subcategory` são o PADRÃO da pasta
|
|
10
|
+
* (o protocolo diz "a do assunto" em várias — o padrão é só o ponto de partida).
|
|
11
|
+
*/
|
|
12
|
+
export const FOLDER_RULES = [
|
|
13
|
+
// raiz: `index.md`. `changelog` também é aceito aqui (tipo próprio de produto, §4).
|
|
14
|
+
{ folder: '', types: ['indice', 'changelog'], category: 'Documentação', subcategory: 'indices', audience: 'dev-produto', idade: 'corrente' },
|
|
15
|
+
{ folder: 'produto', types: ['referencia', 'plano'], category: 'Produto', subcategory: 'visao', audience: 'dev-produto', idade: 'corrente' },
|
|
16
|
+
{ folder: 'arquitetura', types: ['arquitetura', 'referencia'], category: 'Plataforma', subcategory: 'visao-geral', audience: 'dev-produto', idade: 'corrente' },
|
|
17
|
+
{ folder: 'api', types: ['referencia'], category: 'API', subcategory: 'rest-v1', audience: 'dev-produto', idade: 'corrente' },
|
|
18
|
+
{ folder: 'decisoes', types: ['adr'], category: 'Plataforma', subcategory: 'decisoes', audience: 'dev-produto', idade: 'corrente' },
|
|
19
|
+
{ folder: 'runbooks', types: ['runbook'], category: 'Operações', subcategory: 'producao', audience: 'dev-produto', idade: 'corrente' },
|
|
20
|
+
{ folder: 'guias', types: ['guia'], category: 'Desenvolvimento', subcategory: 'ambiente-local', audience: 'dev-produto', idade: 'corrente' },
|
|
21
|
+
{ folder: 'integracoes', types: ['referencia', 'guia'], category: 'Integrações', subcategory: 'outras', audience: 'dev-produto', idade: 'corrente' },
|
|
22
|
+
{ folder: 'seguranca', types: ['norma', 'referencia'], category: 'Segurança', subcategory: 'configuracao-segura', audience: 'dev-produto', idade: 'corrente' },
|
|
23
|
+
{ folder: 'usuario', types: ['guia', 'referencia'], category: 'Ajuda ao usuário', subcategory: 'tarefas', audience: 'publico', idade: 'corrente' },
|
|
24
|
+
{ folder: 'planos', types: ['plano'], category: 'Plataforma', subcategory: 'roadmap', audience: 'dev-produto', idade: 'intermediaria' },
|
|
25
|
+
{ folder: 'superpowers', types: ['plano'], category: 'Plataforma', subcategory: 'roadmap', audience: 'dev-produto', idade: 'intermediaria' },
|
|
26
|
+
{ folder: 'relatorios', types: ['relatorio', 'incidente', 'ata'], category: 'Plataforma', subcategory: 'visao-geral', audience: 'dev-produto', idade: 'intermediaria' },
|
|
27
|
+
{ folder: '_archive', types: 'qualquer', category: 'Plataforma', subcategory: 'visao-geral', audience: 'dev-produto', idade: 'permanente' },
|
|
28
|
+
];
|
|
29
|
+
/** Pastas do §3 que o `docs init` cria. */
|
|
30
|
+
export const STANDARD_FOLDERS = [
|
|
31
|
+
'produto', 'arquitetura', 'api', 'decisoes', 'runbooks', 'guias', 'integracoes',
|
|
32
|
+
'seguranca', 'usuario', 'planos', 'relatorios', '_archive',
|
|
33
|
+
];
|
|
34
|
+
/** Pastas que o validador não visita. `_audit/` é saída de script (só FM001). */
|
|
35
|
+
export const SKIP_DIRS = new Set(['.git', 'node_modules', '.obsidian', '_assets', '_brand', '_diagrams']);
|
|
36
|
+
/** Primeira pasta de um caminho relativo a `docs/` ('' para a raiz). */
|
|
37
|
+
export function topFolder(relPath) {
|
|
38
|
+
const parts = relPath.replace(/\\/g, '/').split('/');
|
|
39
|
+
return parts.length > 1 ? parts[0] : '';
|
|
40
|
+
}
|
|
41
|
+
export function folderRule(relPath) {
|
|
42
|
+
const top = topFolder(relPath);
|
|
43
|
+
return FOLDER_RULES.find((r) => r.folder === top);
|
|
44
|
+
}
|
|
45
|
+
export const DAY_ONE = [
|
|
46
|
+
{ path: 'README.md' },
|
|
47
|
+
{ path: 'CHANGELOG.md' },
|
|
48
|
+
{ path: 'docs/index.md' },
|
|
49
|
+
{ path: 'docs/produto/VISAO_DO_PRODUTO.md' },
|
|
50
|
+
{ path: 'docs/arquitetura/ARQUITETURA.md' },
|
|
51
|
+
{ path: 'docs/runbooks/RUNBOOK_DEPLOY.md' },
|
|
52
|
+
{ path: 'docs/api/API_V1.md', soComApi: true },
|
|
53
|
+
];
|
|
54
|
+
/** "No primeiro mês" (recomendado; o validador só sugere). */
|
|
55
|
+
export const FIRST_MONTH = [
|
|
56
|
+
'docs/arquitetura/MODELO_DE_DADOS.md',
|
|
57
|
+
'docs/runbooks/RUNBOOK_INCIDENTES.md',
|
|
58
|
+
'docs/produto/GLOSSARIO.md',
|
|
59
|
+
'docs/guias/GUIA_DESENVOLVIMENTO_LOCAL.md',
|
|
60
|
+
];
|
|
61
|
+
/** Seções que o README da raiz precisa ter (§7) — casamento tolerante. */
|
|
62
|
+
export const README_SECTIONS = [
|
|
63
|
+
{ label: 'O que é', match: /o que (e|é)|sobre/i },
|
|
64
|
+
{ label: 'Como rodar local', match: /rodar|local|desenvolv/i },
|
|
65
|
+
{ label: 'Como fazer deploy', match: /deploy|publica/i },
|
|
66
|
+
];
|
|
67
|
+
const s = (title, required, hint) => ({ title, required, hint });
|
|
68
|
+
export const TYPE_MODELS = {
|
|
69
|
+
runbook: [
|
|
70
|
+
s('Quando usar', true, 'Em que situação este procedimento é executado e o que ele resolve.'),
|
|
71
|
+
s('Pré-requisitos', false, 'Acessos, ferramentas e estado que precisam existir antes de começar.'),
|
|
72
|
+
s('Passo a passo', true, 'Passos numerados e verificáveis, com o comando exato de cada um.'),
|
|
73
|
+
s('Verificação', true, 'Como provar que deu certo (comando, URL, resultado esperado).'),
|
|
74
|
+
s('Como desfazer', false, 'Como voltar ao estado anterior se algo der errado.'),
|
|
75
|
+
s('Problemas comuns', false, 'Sintoma, causa e correção dos erros que já apareceram.'),
|
|
76
|
+
s('Relacionados', false, 'Links relativos (com .md) para docs próximos.'),
|
|
77
|
+
],
|
|
78
|
+
guia: [
|
|
79
|
+
s('Objetivo', true, 'O que a pessoa consegue fazer ao fim do guia.'),
|
|
80
|
+
s('Pré-requisitos', false, 'O que precisa estar pronto antes.'),
|
|
81
|
+
s('Passo a passo', false, 'Passos em ordem, ou uma seção por tarefa.'),
|
|
82
|
+
s('Problemas comuns', false, 'Erros frequentes e como resolver.'),
|
|
83
|
+
s('Relacionados', false, 'Links relativos (com .md) para docs próximos.'),
|
|
84
|
+
],
|
|
85
|
+
referencia: [
|
|
86
|
+
s('Visão geral', true, 'O que esta referência lista e como ler.'),
|
|
87
|
+
s('Exemplos', false, 'Exemplos reais de uso.'),
|
|
88
|
+
s('Relacionados', false, 'Links relativos (com .md) para docs próximos.'),
|
|
89
|
+
],
|
|
90
|
+
arquitetura: [
|
|
91
|
+
s('Contexto', true, 'Que problema esta parte resolve e que restrições pesam.'),
|
|
92
|
+
s('Visão geral', true, 'O desenho em poucas linhas e, se ajudar, um diagrama.'),
|
|
93
|
+
s('Componentes', false, 'As peças, o papel de cada uma e onde moram no código.'),
|
|
94
|
+
s('Fluxos', false, 'Os caminhos principais de ponta a ponta.'),
|
|
95
|
+
s('Decisões e alternativas', false, 'Por que foi desenhado assim; aponte os ADRs.'),
|
|
96
|
+
s('Limites e riscos', false, 'O que não cobre, limites conhecidos e riscos.'),
|
|
97
|
+
s('Relacionados', false, 'Links relativos (com .md) para docs próximos.'),
|
|
98
|
+
],
|
|
99
|
+
adr: [
|
|
100
|
+
s('Contexto', true, 'O que força a decisão: restrições, contrato, limite, fase. Só fatos.'),
|
|
101
|
+
s('Decisão', true, 'A opção escolhida e o motivo em 1 a 3 linhas. Diga também o que NÃO está decidido.'),
|
|
102
|
+
s('Alternativas consideradas', false, 'Uma H3 por opção ("### Opção A — <nome>") com prós, contras, custo/risco e o trade-off.'),
|
|
103
|
+
s('Consequências', true, 'Positivas; negativas e dívida assumida; como reverter; onde a decisão passa a viver (código, contrato da API, arquitetura). Se houver, a rastreabilidade: requisito, teste que prova, status.'),
|
|
104
|
+
s('Referências', false, 'Links relativos (com .md), PRs e commits.'),
|
|
105
|
+
],
|
|
106
|
+
norma: [
|
|
107
|
+
s('Objetivo', true, 'Que risco ou bagunça esta norma evita.'),
|
|
108
|
+
s('Escopo', false, 'Onde vale e onde não vale.'),
|
|
109
|
+
s('Regras', true, 'Regras numeradas e verificáveis. Para uma ação ou política: nome, o que faz, se é reversível, privilégio, parâmetros tipados e validados (nada de texto livre que vire comando), quando dispara e o modo padrão (sugerir; agir é opt-in).'),
|
|
110
|
+
s('Como é verificado', false, 'Teste, validador ou revisão que prova o cumprimento. Inclua os critérios de aceite (fora da lista → recusado; parâmetro inválido → recusado antes de executar).'),
|
|
111
|
+
s('Exceções', false, 'Exceções aceitas, cada uma com motivo.'),
|
|
112
|
+
s('Histórico de mudanças', false, 'Versão, data e mudança.'),
|
|
113
|
+
],
|
|
114
|
+
plano: [
|
|
115
|
+
s('Resumo', true, 'Um parágrafo: o que muda e por quê.'),
|
|
116
|
+
s('Problema', false, 'Sintoma observável, sem citar a solução.'),
|
|
117
|
+
s('Proposta', true, 'Fluxo, contrato (entradas, saídas, erros, idempotência), estados e transições, dados que trafegam e o impacto por frente.'),
|
|
118
|
+
s('Fora de escopo', false, 'O que este plano não faz.'),
|
|
119
|
+
s('Fases e critérios de aceite', false, 'Fases, rollout e rollback, e critérios verificáveis (teste, contrato, smoke).'),
|
|
120
|
+
s('Riscos', false, 'Casos de borda (offline, credencial inválida, concorrência, dado velho), privacidade e segurança.'),
|
|
121
|
+
s('Decisões pendentes', false, 'O que depende do dono ou do Core, com opções.'),
|
|
122
|
+
s('Status e evidência', false, 'Estado atual com evidência (arquivo:linha, commit, PR).'),
|
|
123
|
+
],
|
|
124
|
+
relatorio: [
|
|
125
|
+
s('Resumo', true, 'O que foi olhado e a conclusão em poucas linhas.'),
|
|
126
|
+
s('Escopo e método', false, 'O que entrou, o que ficou de fora e como foi feito.'),
|
|
127
|
+
s('Achados', true, 'Por severidade: crítico, alto, médio, baixo. Cada achado com evidência.'),
|
|
128
|
+
s('Recomendações', false, 'O que fazer, em ordem de prioridade.'),
|
|
129
|
+
s('Decisões do dono', false, 'O que precisa de decisão.'),
|
|
130
|
+
s('Evidências', false, 'Comandos, saídas, links.'),
|
|
131
|
+
],
|
|
132
|
+
incidente: [
|
|
133
|
+
s('Resumo', true, 'O que quebrou, em uma frase.'),
|
|
134
|
+
s('Impacto', true, 'Quem foi afetado, por quanto tempo, o que deixou de funcionar.'),
|
|
135
|
+
s('Linha do tempo', true, 'Horários (com fuso) do início, da detecção, da mitigação e do fim.'),
|
|
136
|
+
s('Causa raiz', true, 'A causa confirmada, com evidência — hipótese não é diagnóstico.'),
|
|
137
|
+
s('Correção', false, 'O que foi feito para resolver.'),
|
|
138
|
+
s('Ações de prevenção', false, 'O que muda para não repetir, com responsável.'),
|
|
139
|
+
s('Evidências', false, 'Logs, comandos, PRs.'),
|
|
140
|
+
],
|
|
141
|
+
ata: [
|
|
142
|
+
s('Participantes', false, 'Quem esteve.'),
|
|
143
|
+
s('Pauta', false, 'Os assuntos.'),
|
|
144
|
+
s('Discussão', false, 'O que foi discutido.'),
|
|
145
|
+
s('Decisões', true, 'O que foi decidido.'),
|
|
146
|
+
s('Encaminhamentos', true, 'Cada um com responsável e prazo.'),
|
|
147
|
+
],
|
|
148
|
+
juridico: [
|
|
149
|
+
s('Objeto', true, 'Do que trata o texto.'),
|
|
150
|
+
s('Vigência e versão', true, 'Desde quando vale e qual versão é.'),
|
|
151
|
+
s('Onde é publicado', false, 'Página ou superfície onde aparece.'),
|
|
152
|
+
],
|
|
153
|
+
conteudo: [
|
|
154
|
+
s('Objetivo', true, 'Para que serve a peça.'),
|
|
155
|
+
s('Público', false, 'Para quem.'),
|
|
156
|
+
s('Peças', false, 'As peças.'),
|
|
157
|
+
s('Aprovação', false, 'Quem aprovou e quando.'),
|
|
158
|
+
],
|
|
159
|
+
indice: [],
|
|
160
|
+
tour: [],
|
|
161
|
+
changelog: [],
|
|
162
|
+
};
|
|
163
|
+
/** Modelo de ameaças (base: `neetru-zelo/docs/design/modelos/threat-model.md`) — um `referencia` em `seguranca/`. */
|
|
164
|
+
export const THREAT_MODEL_SECTIONS = [
|
|
165
|
+
s('Visão geral', true, 'Superfície analisada (login, comando, credencial, transporte…), versão do desenho e data.'),
|
|
166
|
+
s('Ativos', true, 'Ativos (credencial, canal de comando, binário, dados) e fronteiras de confiança: navegador │ rede │ produto │ Core. O que cruza cada fronteira.'),
|
|
167
|
+
s('Ameaças', true, 'Tabela STRIDE: #, categoria (falsificação, adulteração, repúdio, vazamento, negação de serviço, elevação de privilégio), ameaça, como exploraria, impacto, probabilidade, risco.'),
|
|
168
|
+
s('Mitigações', true, 'Tabela: #, mitigação, tipo (prevenir/detectar/responder), onde implementa, se é regra dura.'),
|
|
169
|
+
s('Riscos aceitos', true, 'O que fica em aberto, por quê e quem é o dono do risco.'),
|
|
170
|
+
s('Relacionados', false, 'Como a mitigação é provada (teste, revisão) e os ADRs derivados.'),
|
|
171
|
+
];
|
|
172
|
+
/** Seções obrigatórias dos docs do mínimo do primeiro dia (§7.2), por caminho relativo a `docs/`. */
|
|
173
|
+
export const DAY_ONE_MODELS = {
|
|
174
|
+
'produto/VISAO_DO_PRODUTO.md': [
|
|
175
|
+
s('Problema que resolve', true, 'A dor do cliente, com exemplo concreto. Sem métrica inventada.'),
|
|
176
|
+
s('Para quem', true, 'Quem usa (perfil de empresa e de pessoa) e quem decide a compra.'),
|
|
177
|
+
s('O que o produto faz', true, 'As capacidades principais, em linguagem do cliente.'),
|
|
178
|
+
s('O que não faz', false, 'Limites claros, para não prometer o que não existe.'),
|
|
179
|
+
s('Como se mede o resultado', false, 'Só métricas reais, com a fonte.'),
|
|
180
|
+
s('Relacionados', false, 'Links relativos (com .md).'),
|
|
181
|
+
],
|
|
182
|
+
'arquitetura/ARQUITETURA.md': [
|
|
183
|
+
s('Contexto', true, 'O que o produto é tecnicamente e que restrições pesam.'),
|
|
184
|
+
s('Visão geral', true, 'O desenho em poucas linhas: front, servidor, banco, integrações.'),
|
|
185
|
+
s('Componentes', false, 'As peças, o papel de cada uma e onde moram no código.'),
|
|
186
|
+
s('Integração com o Core', true, 'SDK @neetru/sdk como ÚNICO caminho de dados; login OIDC do Core; banco por produto provisionado pelo Core; credenciais injetadas no servidor (nunca no navegador, nunca em .env versionado); ambientes dev → homologação → produção.'),
|
|
187
|
+
s('Dados', false, 'Entidades principais e onde ficam; aponte o MODELO_DE_DADOS.md quando existir.'),
|
|
188
|
+
s('Limites e riscos', false, 'Limites conhecidos e riscos.'),
|
|
189
|
+
s('Relacionados', false, 'Links relativos (com .md).'),
|
|
190
|
+
],
|
|
191
|
+
'api/API_V1.md': [
|
|
192
|
+
s('Base e autenticação', true, 'Base https://<produto>.neetru.com/api/v1. Authorization: Bearer com token OIDC no app, cookie de sessão na web. O tenant vem sempre do servidor, nunca do corpo.'),
|
|
193
|
+
s('Formato de erro', true, 'Sempre {"error":{"code","message","requestId"}}. Liste os códigos.'),
|
|
194
|
+
s('Idempotência', false, 'Idempotency-Key obrigatório em escrita que mexe com dinheiro ou estoque.'),
|
|
195
|
+
s('Limites de uso', false, '429 com Retry-After; os limites por rota.'),
|
|
196
|
+
s('Paginação, datas e dinheiro', false, 'Paginação por cursor, datas em ISO UTC, dinheiro em centavos.'),
|
|
197
|
+
s('Versionamento', true, 'A v1 só ganha campos; o que quebra vai para /api/v2. Se o produto foge da convenção, diga onde e por quê.'),
|
|
198
|
+
s('Endpoints', true, 'Uma H3 por endpoint (ex.: "### GET /api/v1/me") com autenticação, corpo, respostas, erros e exemplo.'),
|
|
199
|
+
],
|
|
200
|
+
'runbooks/RUNBOOK_DEPLOY.md': TYPE_MODELS.runbook,
|
|
201
|
+
};
|
|
202
|
+
// ─── nomes de arquivo (§8 da wiki, §6 de produtos) ──────────────────────────
|
|
203
|
+
export const FILE_NAME_REGEX = /^(ADR-\d{4}_[A-Z0-9]+(_[A-Z0-9]+)*|[A-Z][A-Z0-9]*(_[A-Z0-9]+)*(_\d{4}-\d{2}(-\d{2})?)?)\.md$/;
|
|
204
|
+
/** Prefixo de nome por tipo (doc novo). `referencia` não tem prefixo obrigatório. */
|
|
205
|
+
export const TYPE_PREFIX = {
|
|
206
|
+
runbook: 'RUNBOOK',
|
|
207
|
+
guia: 'GUIA',
|
|
208
|
+
arquitetura: 'ARQUITETURA',
|
|
209
|
+
norma: 'POLITICA',
|
|
210
|
+
plano: 'PLANO',
|
|
211
|
+
relatorio: 'RELATORIO',
|
|
212
|
+
incidente: 'INCIDENTE',
|
|
213
|
+
ata: 'ATA',
|
|
214
|
+
referencia: '',
|
|
215
|
+
adr: 'ADR',
|
|
216
|
+
};
|
|
217
|
+
/** Pasta onde `docs new <tipo>` cria o doc, quando a categoria não decide. */
|
|
218
|
+
export const TYPE_DEFAULT_FOLDER = {
|
|
219
|
+
guia: 'guias',
|
|
220
|
+
referencia: 'arquitetura',
|
|
221
|
+
arquitetura: 'arquitetura',
|
|
222
|
+
adr: 'decisoes',
|
|
223
|
+
runbook: 'runbooks',
|
|
224
|
+
norma: 'seguranca',
|
|
225
|
+
plano: 'planos',
|
|
226
|
+
relatorio: 'relatorios',
|
|
227
|
+
incidente: 'relatorios',
|
|
228
|
+
ata: 'relatorios',
|
|
229
|
+
};
|
|
230
|
+
/** Pasta preferida por categoria (quando o tipo cabe nela). */
|
|
231
|
+
export const CATEGORY_FOLDER = {
|
|
232
|
+
Produto: 'produto',
|
|
233
|
+
'Ajuda ao usuário': 'usuario',
|
|
234
|
+
'Integrações': 'integracoes',
|
|
235
|
+
'Segurança': 'seguranca',
|
|
236
|
+
API: 'api',
|
|
237
|
+
};
|
|
238
|
+
export const STOPWORDS = new Set(['DE', 'DA', 'DO', 'DAS', 'DOS', 'E', 'O', 'A', 'OS', 'AS', 'EM', 'NO', 'NA', 'NOS', 'NAS', 'PARA', 'POR', 'COM', 'UM', 'UMA']);
|
|
239
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type FmData } from './frontmatter.js';
|
|
2
|
+
import type { DocsTaxonomy } from './taxonomy.js';
|
|
3
|
+
import type { ProductRepo } from './config.js';
|
|
4
|
+
export declare const MAX_PRODUCT_DOCS = 200;
|
|
5
|
+
export declare const MAX_PRODUCT_DOCS_BYTES: number;
|
|
6
|
+
/** Teto por doc no Core (`MAX_PRODUCT_DOC_BYTES`, 413 `doc_too_large`). */
|
|
7
|
+
export declare const MAX_PRODUCT_DOC_BYTES: number;
|
|
8
|
+
/** Abaixo do `cliWrite` do Core (30/min por IP), com folga para outro comando na mesma rede. */
|
|
9
|
+
export declare const POSTS_PER_MINUTE = 25;
|
|
10
|
+
/** Tentativas extras quando o Core responde 429/503. */
|
|
11
|
+
export declare const MAX_RETRIES = 3;
|
|
12
|
+
export type SyncStatus = 'ok' | 'parcial' | 'nada-a-enviar' | 'core-sem-suporte' | 'desligado' | 'sem-login' | 'limite-excedido' | 'produto-nao-encontrado' | 'falha';
|
|
13
|
+
export interface RemoteDoc {
|
|
14
|
+
slug: string;
|
|
15
|
+
title?: string | null;
|
|
16
|
+
description?: string | null;
|
|
17
|
+
category?: string | null;
|
|
18
|
+
subcategory?: string | null;
|
|
19
|
+
type?: string | null;
|
|
20
|
+
status?: string | null;
|
|
21
|
+
audience?: string | null;
|
|
22
|
+
order?: number | null;
|
|
23
|
+
updated?: string | null;
|
|
24
|
+
date?: string | null;
|
|
25
|
+
visibility?: string;
|
|
26
|
+
sha256?: string;
|
|
27
|
+
version?: number;
|
|
28
|
+
}
|
|
29
|
+
/** Metadados que o GET do Core devolve e que a CLI compara (o que vier). */
|
|
30
|
+
export declare const COMPARED_METADATA: readonly ["title", "description", "category", "subcategory", "type", "status", "audience", "order", "updated", "date"];
|
|
31
|
+
export interface LocalDoc {
|
|
32
|
+
file: string;
|
|
33
|
+
slug: string;
|
|
34
|
+
content: string;
|
|
35
|
+
frontmatter: FmData;
|
|
36
|
+
visibility: 'public' | 'internal';
|
|
37
|
+
sha256: string;
|
|
38
|
+
bytes: number;
|
|
39
|
+
}
|
|
40
|
+
export interface SyncResult {
|
|
41
|
+
status: SyncStatus;
|
|
42
|
+
message: string;
|
|
43
|
+
product: string;
|
|
44
|
+
dryRun: boolean;
|
|
45
|
+
enviados: Array<{
|
|
46
|
+
slug: string;
|
|
47
|
+
version?: number;
|
|
48
|
+
created?: boolean;
|
|
49
|
+
visibility: string;
|
|
50
|
+
}>;
|
|
51
|
+
inalterados: string[];
|
|
52
|
+
bloqueados: Array<{
|
|
53
|
+
file: string;
|
|
54
|
+
codes: string[];
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Docs que o Core recusou. `httpStatus` é o status da resposta (0 = sem
|
|
58
|
+
* resposta HTTP: rede, timeout) — é dele que sai o código de saída de cada
|
|
59
|
+
* falha no `neetru docs sync` (P105).
|
|
60
|
+
*/
|
|
61
|
+
falhas: Array<{
|
|
62
|
+
slug: string;
|
|
63
|
+
message: string;
|
|
64
|
+
httpStatus: number;
|
|
65
|
+
}>;
|
|
66
|
+
/** Não enviados por regra do Core conferida localmente (slug, tamanho). */
|
|
67
|
+
recusados: Array<{
|
|
68
|
+
file: string;
|
|
69
|
+
motivo: string;
|
|
70
|
+
}>;
|
|
71
|
+
orfaos: string[];
|
|
72
|
+
/** Plano local (dry-run sem login / antes do envio). */
|
|
73
|
+
planejados: Array<{
|
|
74
|
+
slug: string;
|
|
75
|
+
visibility: string;
|
|
76
|
+
bytes: number;
|
|
77
|
+
}>;
|
|
78
|
+
}
|
|
79
|
+
export declare function visibilityFor(fm: FmData): 'public' | 'internal';
|
|
80
|
+
export declare function docSlugFor(relInDocs: string): string;
|
|
81
|
+
/**
|
|
82
|
+
* Motivo pelo qual o Core recusaria o slug (mesmas regras de
|
|
83
|
+
* `productDocSlugSchema`), ou null se ele passa.
|
|
84
|
+
*/
|
|
85
|
+
export declare function slugProblem(slug: string): string | null;
|
|
86
|
+
/** Monta o lote local (sem I/O de rede). */
|
|
87
|
+
export declare function collectLocalDocs(repo: ProductRepo, taxonomy: DocsTaxonomy): Promise<{
|
|
88
|
+
docs: LocalDoc[];
|
|
89
|
+
bloqueados: SyncResult['bloqueados'];
|
|
90
|
+
recusados: SyncResult['recusados'];
|
|
91
|
+
}>;
|
|
92
|
+
export interface SyncOptions {
|
|
93
|
+
taxonomy: DocsTaxonomy;
|
|
94
|
+
dryRun?: boolean;
|
|
95
|
+
/** Token já resolvido (teste/deploy); senão lê a sessão. */
|
|
96
|
+
token?: string | null;
|
|
97
|
+
/** Relógio e espera injetáveis (teste). */
|
|
98
|
+
now?: () => number;
|
|
99
|
+
sleep?: (ms: number) => Promise<void>;
|
|
100
|
+
/** Chamado antes de cada espera (para mostrar "aguardando…"). */
|
|
101
|
+
onWait?: (ms: number, motivo: 'ritmo' | 'retry-after') => void;
|
|
102
|
+
}
|
|
103
|
+
/** O doc local é igual ao do Core (conteúdo + metadados que o GET devolve)? */
|
|
104
|
+
export declare function sameAsRemote(d: LocalDoc, r: RemoteDoc | undefined): boolean;
|
|
105
|
+
/** Janela deslizante: no máximo `limit` envios em 60 s. */
|
|
106
|
+
export declare function createPacer(limit: number, now: () => number, sleep: (ms: number) => Promise<void>, onWait?: SyncOptions['onWait']): () => Promise<void>;
|
|
107
|
+
export declare function syncProductDocs(repo: ProductRepo, opts: SyncOptions): Promise<SyncResult>;
|