@orkastery/cli 0.5.6 → 0.6.1
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/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +37 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
- package/adapters/openclaw/README.md +81 -9
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +123 -9
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +3 -1
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +612 -0
- package/dist/adapters/grok-mcp.js +178 -0
- package/dist/adapters/grok.js +686 -0
- package/dist/agendador-cpu.js +92 -0
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +51 -46
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +94 -40
- package/dist/branch-de-estado.js +23 -10
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +2 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +528 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +238 -0
- package/dist/ci.js +248 -45
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +47 -39
- package/dist/claims.js +10 -9
- package/dist/company-brain-client.js +10 -3
- package/dist/company-brain-migration.js +11 -5
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +25 -8
- package/dist/conducao.js +89 -29
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +111 -87
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +89 -89
- package/dist/doctor-forja.js +343 -0
- package/dist/doctor-pulse-cron.js +113 -1
- package/dist/doctor.js +164 -6
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +154 -54
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +21 -18
- package/dist/evalrunner.js +35 -32
- package/dist/fabrica-batida.js +34 -21
- package/dist/fabrica-estado.js +33 -21
- package/dist/fix.js +21 -19
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +123 -80
- package/dist/handoff.js +23 -13
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +51 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +44 -1
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +34 -31
- package/dist/horario.js +20 -1
- package/dist/hosts.js +104 -134
- package/dist/index.js +864 -554
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +123 -69
- package/dist/intelligence-graph-query.js +37 -22
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +31 -1
- package/dist/licoes.js +12 -11
- package/dist/locale-accounts.js +228 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +86 -10
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +288 -0
- package/dist/locale-gerados.js +5 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +83 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +140 -2
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +183 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +177 -66
- package/dist/locale-thread.js +149 -5
- package/dist/locale-verify.js +80 -4
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +553 -9
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +293 -12
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +10 -5
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +10 -2
- package/dist/master.js +118 -41
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-install.js +90 -15
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +116 -22
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +68 -24
- package/dist/mcp-transportes.js +17 -0
- package/dist/memoria.js +63 -58
- package/dist/merge-da-entrega.js +85 -0
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +94 -54
- package/dist/noctum-aceite.js +929 -0
- package/dist/noctum-arco.js +540 -33
- package/dist/noctum-capacidade.js +3 -3
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +539 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1217 -0
- package/dist/noctum-envelope.js +253 -17
- package/dist/noctum-execucao.js +100 -24
- package/dist/noctum-fechamento.js +416 -0
- package/dist/noctum-fila.js +49 -10
- package/dist/noctum-guarda.js +333 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +387 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +390 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +594 -0
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +861 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-retomada-rede.js +71 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +679 -0
- package/dist/ocupacao.js +3 -1
- package/dist/onboarding.js +16 -5
- package/dist/orkmind.js +39 -23
- package/dist/orquestracao.js +31 -35
- package/dist/parado-no-condutor.js +160 -139
- package/dist/phase.js +96 -42
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +11 -6
- package/dist/preflight.js +2 -1
- package/dist/procedencia.js +9 -14
- package/dist/projeto-alvo.js +59 -20
- package/dist/prompts.js +136 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +143 -27
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +136 -3
- package/dist/ratelimit.js +13 -4
- package/dist/recall.js +14 -13
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +63 -45
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +326 -78
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +279 -85
- package/dist/runtime-escada.js +429 -0
- package/dist/runtime-profiles.js +130 -63
- package/dist/runtimes.js +42 -5
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +366 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +196 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +174 -13
- package/dist/sessoes-contas.js +42 -5
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +67 -66
- package/dist/ship-publicar.js +263 -92
- package/dist/ship.js +160 -17
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +9 -9
- package/dist/thread.js +121 -18
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +5 -2
- package/dist/varredura-acoes.js +500 -0
- package/dist/verify.js +491 -32
- package/dist/worktree-local.js +12 -10
- package/dist/worktree.js +81 -85
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +10 -5
- package/references/security-checklist.md +3 -3
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/docs.js
CHANGED
|
@@ -81,6 +81,7 @@ const thread_1 = require("./thread");
|
|
|
81
81
|
const ledger_1 = require("./ledger");
|
|
82
82
|
const branch_de_estado_1 = require("./branch-de-estado");
|
|
83
83
|
const locale_1 = require("./locale");
|
|
84
|
+
const merge_da_entrega_1 = require("./merge-da-entrega");
|
|
84
85
|
exports.DIR_PRODUTO = 'docs/produto';
|
|
85
86
|
exports.DIR_ROADMAP = 'docs/roadmap';
|
|
86
87
|
exports.DIR_PADROES = 'docs/padroes';
|
|
@@ -163,17 +164,18 @@ function paginas(raiz, dir) {
|
|
|
163
164
|
function documentoDeTexto(arquivo, texto) {
|
|
164
165
|
const { bruto, corpo } = separarFrontmatter(texto);
|
|
165
166
|
if (bruto === null) {
|
|
166
|
-
return { achado: erro(arquivo, undefined, 'docs.frontmatter.ausente',
|
|
167
|
+
return { achado: erro(arquivo, undefined, 'docs.frontmatter.ausente', (m) => m.semFrontmatter, (m) => m.semFrontmatterCorrecao) };
|
|
167
168
|
}
|
|
168
169
|
let dados;
|
|
169
170
|
try {
|
|
170
171
|
dados = (0, yaml_1.lerYaml)(bruto);
|
|
171
172
|
}
|
|
172
173
|
catch (e) {
|
|
173
|
-
|
|
174
|
+
const detalhe = e.message;
|
|
175
|
+
return { achado: erro(arquivo, undefined, 'docs.frontmatter.invalido', (m) => m.frontmatterInvalido(detalhe)) };
|
|
174
176
|
}
|
|
175
177
|
if (!ehMapa(dados)) {
|
|
176
|
-
return { achado: erro(arquivo, undefined, 'docs.frontmatter.invalido',
|
|
178
|
+
return { achado: erro(arquivo, undefined, 'docs.frontmatter.invalido', (m) => m.frontmatterNaoMapa) };
|
|
177
179
|
}
|
|
178
180
|
return { doc: { arquivo, tipo: dados.tipo, id: String(dados.id ?? ''), dados, corpo } };
|
|
179
181
|
}
|
|
@@ -189,11 +191,15 @@ function carregarDocs(raiz) {
|
|
|
189
191
|
}
|
|
190
192
|
return { docs, achados };
|
|
191
193
|
}
|
|
194
|
+
function achado(gravidade, arquivo, id, regra, mensagem, correcao) {
|
|
195
|
+
const texto = (montar) => (0, locale_1.textoDoCatalogo)((m) => montar(m.docs));
|
|
196
|
+
return { arquivo, ...(id ? { id } : {}), regra, gravidade, mensagem: texto(mensagem), ...(correcao ? { correcao: texto(correcao) } : {}) };
|
|
197
|
+
}
|
|
192
198
|
function erro(arquivo, id, regra, mensagem, correcao) {
|
|
193
|
-
return
|
|
199
|
+
return achado('erro', arquivo, id, regra, mensagem, correcao);
|
|
194
200
|
}
|
|
195
201
|
function aviso(arquivo, id, regra, mensagem, correcao) {
|
|
196
|
-
return
|
|
202
|
+
return achado('aviso', arquivo, id, regra, mensagem, correcao);
|
|
197
203
|
}
|
|
198
204
|
function git(raiz, args) {
|
|
199
205
|
const r = (0, node_child_process_1.spawnSync)('git', args, { cwd: raiz, encoding: 'utf8' });
|
|
@@ -233,23 +239,23 @@ function verificarDocs(raiz, opcoes = {}) {
|
|
|
233
239
|
const porId = new Map();
|
|
234
240
|
for (const d of docs) {
|
|
235
241
|
if (!TIPOS.includes(d.tipo)) {
|
|
236
|
-
achados.push(erro(d.arquivo, d.id || undefined, 'docs.tipo',
|
|
242
|
+
achados.push(erro(d.arquivo, d.id || undefined, 'docs.tipo', (m) => m.tipoDesconhecido(String(d.dados.tipo)), (m) => m.useUmDe(TIPOS.join(', '))));
|
|
237
243
|
continue;
|
|
238
244
|
}
|
|
239
245
|
if (!PADRAO_ID[d.tipo].test(d.id)) {
|
|
240
|
-
achados.push(erro(d.arquivo, d.id || undefined, 'docs.id.formato',
|
|
246
|
+
achados.push(erro(d.arquivo, d.id || undefined, 'docs.id.formato', (m) => m.idForaDoPadrao(d.id, d.tipo), (m) => m.formatoEsperado(PADRAO_ID[d.tipo].source.replace(/[\^$\\]/g, ''))));
|
|
241
247
|
}
|
|
242
248
|
const nome = path.posix.basename(d.arquivo);
|
|
243
249
|
if (!(nome === `${d.id}.md` || nome.startsWith(`${d.id}-`))) {
|
|
244
|
-
achados.push(erro(d.arquivo, d.id, 'docs.id.arquivo',
|
|
250
|
+
achados.push(erro(d.arquivo, d.id, 'docs.id.arquivo', (m) => m.arquivoSemId, (m) => m.renomeie(d.id)));
|
|
245
251
|
}
|
|
246
252
|
const pastaCerta = d.tipo === 'roadmap' ? exports.DIR_ROADMAP : exports.DIR_PRODUTO;
|
|
247
253
|
if (path.posix.dirname(d.arquivo) !== pastaCerta) {
|
|
248
|
-
achados.push(erro(d.arquivo, d.id, 'docs.pasta',
|
|
254
|
+
achados.push(erro(d.arquivo, d.id, 'docs.pasta', (m) => m.pastaErrada(d.tipo, pastaCerta)));
|
|
249
255
|
}
|
|
250
256
|
const anterior = porId.get(d.id);
|
|
251
257
|
if (anterior) {
|
|
252
|
-
achados.push(erro(d.arquivo, d.id, 'docs.id.duplicado',
|
|
258
|
+
achados.push(erro(d.arquivo, d.id, 'docs.id.duplicado', (m) => m.idRepetido(anterior.arquivo), (m) => m.idRepetidoCorrecao));
|
|
253
259
|
}
|
|
254
260
|
else {
|
|
255
261
|
porId.set(d.id, d);
|
|
@@ -257,7 +263,7 @@ function verificarDocs(raiz, opcoes = {}) {
|
|
|
257
263
|
}
|
|
258
264
|
const base = opcoes.semGit ? null : resolverBase(raiz, opcoes.baseBranch);
|
|
259
265
|
if (!opcoes.semGit && !base) {
|
|
260
|
-
achados.push(aviso('.', undefined, 'docs.git.base',
|
|
266
|
+
achados.push(aviso('.', undefined, 'docs.git.base', (m) => m.baseAusente(opcoes.baseBranch ?? 'main'), (m) => m.baseAusenteCorrecao));
|
|
261
267
|
}
|
|
262
268
|
const comandos = opcoes.ajudaDoCli ? comandosDaAjuda(opcoes.ajudaDoCli) : null;
|
|
263
269
|
for (const d of docs) {
|
|
@@ -274,56 +280,59 @@ function verificarDocs(raiz, opcoes = {}) {
|
|
|
274
280
|
verificarTabelasDeEstado(d, achados);
|
|
275
281
|
}
|
|
276
282
|
}
|
|
277
|
-
verificarIndices(raiz, docs, achados
|
|
283
|
+
verificarIndices(raiz, docs, achados);
|
|
278
284
|
return { docs, achados };
|
|
279
285
|
}
|
|
280
286
|
function verificarChaves(d, achados) {
|
|
281
287
|
for (const k of CHAVES[d.tipo]) {
|
|
282
288
|
if (!(k in d.dados)) {
|
|
283
|
-
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.chave',
|
|
289
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.chave', (m) => m.faltaChave(k), (m) => m.faltaChaveCorrecao));
|
|
284
290
|
}
|
|
285
291
|
}
|
|
286
292
|
if (d.tipo !== 'roadmap' && 'estado' in d.dados) {
|
|
287
293
|
const e = String(d.dados.estado);
|
|
288
294
|
if (!exports.ESTADOS_DA_ESPECIFICACAO.includes(e)) {
|
|
289
|
-
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor',
|
|
295
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor', (m) => m.estadoForaDoPadrao(e), (m) => m.useUmDe(exports.ESTADOS_DA_ESPECIFICACAO.join(', '))));
|
|
290
296
|
}
|
|
291
297
|
}
|
|
292
298
|
if (d.tipo === 'roadmap') {
|
|
293
299
|
const cat = String(d.dados.categoria ?? '');
|
|
294
300
|
if ('categoria' in d.dados && !exports.CATEGORIAS.includes(cat)) {
|
|
295
|
-
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor',
|
|
301
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor', (m) => m.categoriaForaDoPadrao(cat), (m) => m.useUmaDe(exports.CATEGORIAS.join(', '))));
|
|
296
302
|
}
|
|
297
303
|
const estado = d.dados.estado;
|
|
298
304
|
if ('estado' in d.dados && !ehMapa(estado)) {
|
|
299
|
-
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor',
|
|
305
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor', (m) => m.estadoNaoMapa, (m) => m.dimensoes(Object.keys(exports.DIMENSOES).join(', '))));
|
|
300
306
|
}
|
|
301
307
|
else if (ehMapa(estado)) {
|
|
302
308
|
for (const [dim, valores] of Object.entries(exports.DIMENSOES)) {
|
|
303
309
|
if (!(dim in estado)) {
|
|
304
|
-
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.chave',
|
|
310
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.chave', (m) => m.faltaDimensao(dim), (m) => m.faltaDimensaoCorrecao));
|
|
305
311
|
}
|
|
306
312
|
else if (!valores.includes(String(estado[dim]))) {
|
|
307
|
-
|
|
313
|
+
const valor = String(estado[dim]);
|
|
314
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor', (m) => m.dimensaoForaDoPadrao(dim, valor), (m) => m.useUmDe(valores.join(', '))));
|
|
308
315
|
}
|
|
309
316
|
}
|
|
310
317
|
for (const dim of Object.keys(estado)) {
|
|
311
318
|
if (!(dim in exports.DIMENSOES)) {
|
|
312
|
-
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.chave',
|
|
319
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.chave', (m) => m.dimensaoDesconhecida(dim)));
|
|
313
320
|
}
|
|
314
321
|
}
|
|
315
322
|
}
|
|
316
323
|
}
|
|
317
324
|
for (const k of ['verificado_em', 'atualizado_em']) {
|
|
318
325
|
if (k in d.dados && !ISO_COM_FUSO.test(String(d.dados[k]))) {
|
|
319
|
-
|
|
326
|
+
const valor = String(d.dados[k]);
|
|
327
|
+
achados.push(erro(d.arquivo, d.id, 'docs.data', (m) => m.dataSemFuso(k, valor), (m) => m.dataExemplo));
|
|
320
328
|
}
|
|
321
329
|
}
|
|
322
330
|
// Valor de modelo esquecido no frontmatter: `<...>` ou ID zerado (FEAT-000, MOD-00, RM-000).
|
|
323
331
|
const visitar = (v, onde) => {
|
|
324
332
|
if (typeof v === 'string') {
|
|
325
333
|
if (/^<[^>]*>$/.test(v.trim()) || /^(PLAT|SYS|MOD|FEAT|RM)-0+$/.test(v.trim()) || /@0{7}$/.test(v.trim())) {
|
|
326
|
-
|
|
334
|
+
const valor = v;
|
|
335
|
+
achados.push(erro(d.arquivo, d.id, 'docs.modelo', (m) => m.valorDoModelo(onde, valor)));
|
|
327
336
|
}
|
|
328
337
|
}
|
|
329
338
|
else if (Array.isArray(v))
|
|
@@ -397,15 +406,15 @@ function substituirBloco(corpo, ini, fim, conteudo) {
|
|
|
397
406
|
}
|
|
398
407
|
function verificarTabelasDeEstado(d, achados) {
|
|
399
408
|
for (const [ini, fim, render, nome] of [
|
|
400
|
-
[RELANCE_INI, RELANCE_FIM, renderizarRelance,
|
|
401
|
-
[ESTADO_INI, ESTADO_FIM, renderizarEstado,
|
|
409
|
+
[RELANCE_INI, RELANCE_FIM, renderizarRelance, (m) => m.nomeDaRelance],
|
|
410
|
+
[ESTADO_INI, ESTADO_FIM, renderizarEstado, (m) => m.nomeDoEstado],
|
|
402
411
|
]) {
|
|
403
412
|
const atual = blocoEntre(d.corpo, ini, fim);
|
|
404
413
|
if (atual === null) {
|
|
405
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.estado',
|
|
414
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.estado', (m) => m.faltaTabela(nome(m)), (m) => m.faltaTabelaCorrecao));
|
|
406
415
|
}
|
|
407
416
|
else if (atual !== render(d)) {
|
|
408
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.estado',
|
|
417
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.estado', (m) => m.tabelaDiverge(nome(m)), (m) => m.tabelaDivergeCorrecao));
|
|
409
418
|
}
|
|
410
419
|
}
|
|
411
420
|
}
|
|
@@ -415,14 +424,14 @@ function verificarReferencias(raiz, d, porId, achados) {
|
|
|
415
424
|
if (esperadoDoPai && pai !== undefined && pai !== null) {
|
|
416
425
|
const idPai = String(pai);
|
|
417
426
|
if (!esperadoDoPai.test(idPai)) {
|
|
418
|
-
achados.push(erro(d.arquivo, d.id, 'docs.referencia',
|
|
427
|
+
achados.push(erro(d.arquivo, d.id, 'docs.referencia', (m) => m.paiDeOutroNivel(idPai, d.tipo)));
|
|
419
428
|
}
|
|
420
429
|
else if (!porId.has(idPai)) {
|
|
421
|
-
achados.push(erro(d.arquivo, d.id, 'docs.referencia',
|
|
430
|
+
achados.push(erro(d.arquivo, d.id, 'docs.referencia', (m) => m.paiNaoExiste(idPai), (m) => m.paiNaoExisteCorrecao));
|
|
422
431
|
}
|
|
423
432
|
}
|
|
424
433
|
else if (esperadoDoPai && d.tipo !== 'roadmap' && (pai === undefined || pai === null)) {
|
|
425
|
-
achados.push(erro(d.arquivo, d.id, 'docs.referencia',
|
|
434
|
+
achados.push(erro(d.arquivo, d.id, 'docs.referencia', (m) => m.precisaDePai(d.tipo)));
|
|
426
435
|
}
|
|
427
436
|
const cruzadas = d.tipo === 'feature' ? [['roadmap', 'roadmap', 'features']]
|
|
428
437
|
: d.tipo === 'roadmap' ? [['features', 'feature', 'roadmap']] : [];
|
|
@@ -430,10 +439,10 @@ function verificarReferencias(raiz, d, porId, achados) {
|
|
|
430
439
|
for (const alvo of lista(d.dados[chave])) {
|
|
431
440
|
const outro = porId.get(alvo);
|
|
432
441
|
if (!outro || outro.tipo !== tipoAlvo) {
|
|
433
|
-
achados.push(erro(d.arquivo, d.id, 'docs.referencia',
|
|
442
|
+
achados.push(erro(d.arquivo, d.id, 'docs.referencia', (m) => m.citaInexistente(chave, alvo, tipoAlvo)));
|
|
434
443
|
}
|
|
435
444
|
else if (!lista(outro.dados[chaveDeVolta]).includes(d.id)) {
|
|
436
|
-
achados.push(aviso(d.arquivo, d.id, 'docs.referencia.reciproca',
|
|
445
|
+
achados.push(aviso(d.arquivo, d.id, 'docs.referencia.reciproca', (m) => m.naoCitaDeVolta(alvo, d.id), (m) => m.naoCitaDeVoltaCorrecao(d.id, chaveDeVolta, alvo)));
|
|
437
446
|
}
|
|
438
447
|
}
|
|
439
448
|
}
|
|
@@ -444,7 +453,7 @@ function verificarReferencias(raiz, d, porId, achados) {
|
|
|
444
453
|
continue;
|
|
445
454
|
const abs = path.resolve(path.dirname(path.join(raiz, d.arquivo)), decodeURIComponent(alvo));
|
|
446
455
|
if (!fs.existsSync(abs)) {
|
|
447
|
-
achados.push(erro(d.arquivo, d.id, 'docs.link',
|
|
456
|
+
achados.push(erro(d.arquivo, d.id, 'docs.link', (m) => m.linkQuebrado(alvo)));
|
|
448
457
|
}
|
|
449
458
|
}
|
|
450
459
|
}
|
|
@@ -456,36 +465,36 @@ function verificarLeitura(d, achados) {
|
|
|
456
465
|
const linhas = d.corpo.split('\n');
|
|
457
466
|
const h1 = linhas.find((l) => l.startsWith('# '));
|
|
458
467
|
if (!h1 || !h1.includes(d.id)) {
|
|
459
|
-
achados.push(erro(d.arquivo, d.id, 'docs.leitura.titulo',
|
|
468
|
+
achados.push(erro(d.arquivo, d.id, 'docs.leitura.titulo', (m) => m.tituloSemId, (m) => m.tituloSemIdCorrecao(d.id)));
|
|
460
469
|
}
|
|
461
470
|
const frase = linhas.find((l) => /^>\s*\*\*Em uma frase:\*\*/.test(l));
|
|
462
471
|
if (!frase) {
|
|
463
|
-
achados.push(erro(d.arquivo, d.id, 'docs.leitura.resumo',
|
|
472
|
+
achados.push(erro(d.arquivo, d.id, 'docs.leitura.resumo', (m) => m.faltaFrase, (m) => m.faltaFraseCorrecao));
|
|
464
473
|
}
|
|
465
474
|
else {
|
|
466
475
|
const n = frase.replace(/^>\s*\*\*Em uma frase:\*\*\s*/, '').trim().length;
|
|
467
476
|
if (n === 0)
|
|
468
|
-
achados.push(erro(d.arquivo, d.id, 'docs.leitura.resumo',
|
|
477
|
+
achados.push(erro(d.arquivo, d.id, 'docs.leitura.resumo', (m) => m.fraseVazia));
|
|
469
478
|
else if (n > exports.LIMITE_DA_FRASE) {
|
|
470
|
-
achados.push(erro(d.arquivo, d.id, 'docs.leitura.resumo',
|
|
479
|
+
achados.push(erro(d.arquivo, d.id, 'docs.leitura.resumo', (m) => m.fraseLonga(n, exports.LIMITE_DA_FRASE), (m) => m.fraseLongaCorrecao));
|
|
471
480
|
}
|
|
472
481
|
}
|
|
473
482
|
const h2 = new Set(linhas.filter((l) => l.startsWith('## ')).map((l) => l.slice(3).trim()));
|
|
474
483
|
for (const s of SECOES[d.tipo]) {
|
|
475
484
|
if (!h2.has(s)) {
|
|
476
|
-
achados.push(erro(d.arquivo, d.id, 'docs.secao',
|
|
485
|
+
achados.push(erro(d.arquivo, d.id, 'docs.secao', (m) => m.faltaSecao(s), (m) => m.faltaSecaoCorrecao));
|
|
477
486
|
}
|
|
478
487
|
}
|
|
479
488
|
const texto = semCodigo(d.corpo);
|
|
480
|
-
for (const
|
|
481
|
-
achados.push(erro(d.arquivo, d.id, 'docs.modelo',
|
|
489
|
+
for (const [, campo] of texto.matchAll(/\[(\.\.\.|[^\]\n]{1,60})\](?!\()/g)) {
|
|
490
|
+
achados.push(erro(d.arquivo, d.id, 'docs.modelo', (m) => m.campoDoModelo(campo), (m) => m.campoDoModeloCorrecao));
|
|
482
491
|
}
|
|
483
492
|
for (const p of texto.split(/\n\s*\n/)) {
|
|
484
493
|
const bloco = p.trim();
|
|
485
494
|
if (!bloco || /^(#|>|\||[-*+] |\d+\. |<!--)/.test(bloco))
|
|
486
495
|
continue;
|
|
487
496
|
if (bloco.length > exports.LIMITE_DO_PARAGRAFO) {
|
|
488
|
-
achados.push(aviso(d.arquivo, d.id, 'docs.leitura.paragrafo',
|
|
497
|
+
achados.push(aviso(d.arquivo, d.id, 'docs.leitura.paragrafo', (m) => m.paragrafoLongo(bloco.length), (m) => m.paragrafoLongoCorrecao));
|
|
489
498
|
}
|
|
490
499
|
}
|
|
491
500
|
}
|
|
@@ -494,36 +503,36 @@ function verificarFontes(raiz, d, comandos, achados) {
|
|
|
494
503
|
if (f === undefined || f === null)
|
|
495
504
|
return;
|
|
496
505
|
if (!ehMapa(f)) {
|
|
497
|
-
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor',
|
|
506
|
+
achados.push(erro(d.arquivo, d.id, 'docs.frontmatter.valor', (m) => m.fontesNaoMapa));
|
|
498
507
|
return;
|
|
499
508
|
}
|
|
500
509
|
const existe = (p) => fs.existsSync(path.join(raiz, p));
|
|
501
510
|
for (const chave of ['codigo', 'testes', 'docs']) {
|
|
502
511
|
for (const p of lista(f[chave])) {
|
|
503
512
|
if (path.isAbsolute(p) || p.split('/').includes('..')) {
|
|
504
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.fonte',
|
|
513
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.fonte', (m) => m.caminhoFora(p), (m) => m.caminhoForaCorrecao));
|
|
505
514
|
}
|
|
506
515
|
else if (!existe(p)) {
|
|
507
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.fonte',
|
|
516
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.fonte', (m) => m.caminhoNaoExiste(p), (m) => m.caminhoNaoExisteCorrecao));
|
|
508
517
|
}
|
|
509
518
|
}
|
|
510
519
|
}
|
|
511
520
|
for (const s of lista(f.simbolos)) {
|
|
512
521
|
const [arq, simbolo] = s.split('#');
|
|
513
522
|
if (!arq || !simbolo) {
|
|
514
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.simbolo',
|
|
523
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.simbolo', (m) => m.simboloForaDoFormato(s)));
|
|
515
524
|
}
|
|
516
525
|
else if (!existe(arq)) {
|
|
517
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.simbolo',
|
|
526
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.simbolo', (m) => m.arquivoDoSimbolo(arq, simbolo)));
|
|
518
527
|
}
|
|
519
528
|
else if (!new RegExp(`\\b${escapar(simbolo)}\\b`).test(fs.readFileSync(path.join(raiz, arq), 'utf8'))) {
|
|
520
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.simbolo',
|
|
529
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.simbolo', (m) => m.simboloAusente(simbolo, arq), (m) => m.simboloAusenteCorrecao));
|
|
521
530
|
}
|
|
522
531
|
}
|
|
523
532
|
const codigo = lista(f.codigo).filter(existe).map((p) => fs.readFileSync(path.join(raiz, p), 'utf8'));
|
|
524
533
|
for (const c of lista(f.contratos)) {
|
|
525
534
|
if (!codigo.some((t) => t.includes(c))) {
|
|
526
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.contrato',
|
|
535
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.contrato', (m) => m.contratoAusente(c)));
|
|
527
536
|
}
|
|
528
537
|
}
|
|
529
538
|
if (comandos) {
|
|
@@ -535,7 +544,8 @@ function verificarFontes(raiz, d, comandos, achados) {
|
|
|
535
544
|
const temSubcomandos = [...comandos].some((c) => c.startsWith(`${topo} `));
|
|
536
545
|
const exigePar = temSubcomandos && /^[a-z][a-z-]*$/.test(sub);
|
|
537
546
|
if (!comandos.has(topo) || (exigePar && !comandos.has(`${topo} ${sub}`))) {
|
|
538
|
-
|
|
547
|
+
const comando = [programa, topo, sub].join(' ').trim();
|
|
548
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.comando', (m) => m.comandoAusente(comando), (m) => m.comandoAusenteCorrecao));
|
|
539
549
|
}
|
|
540
550
|
}
|
|
541
551
|
}
|
|
@@ -551,27 +561,28 @@ function verificarEstadoDoRoadmap(raiz, d, base, achados) {
|
|
|
551
561
|
const [ciclo, codigo, testes, deploy] = [e.ciclo, e.codigo, e.testes, e.deploy].map((v) => String(v ?? ''));
|
|
552
562
|
// Coerencia entre dimensoes (padrao 3.6): o status nao pode esconder o que falta.
|
|
553
563
|
if (ciclo === 'Concluído' && codigo !== 'Mesclado') {
|
|
554
|
-
achados.push(erro(d.arquivo, d.id, 'docs.estado.coerencia',
|
|
564
|
+
achados.push(erro(d.arquivo, d.id, 'docs.estado.coerencia', (m) => m.concluidoSemMerge));
|
|
555
565
|
}
|
|
556
566
|
if (ciclo === 'Concluído' && testes !== 'Aprovados') {
|
|
557
|
-
achados.push(erro(d.arquivo, d.id, 'docs.estado.coerencia',
|
|
567
|
+
achados.push(erro(d.arquivo, d.id, 'docs.estado.coerencia', (m) => m.concluidoSemTestes));
|
|
558
568
|
}
|
|
559
569
|
if (deploy === 'Produção' && codigo !== 'Mesclado') {
|
|
560
|
-
achados.push(erro(d.arquivo, d.id, 'docs.estado.coerencia',
|
|
570
|
+
achados.push(erro(d.arquivo, d.id, 'docs.estado.coerencia', (m) => m.producaoSemMerge));
|
|
561
571
|
}
|
|
562
572
|
if (ciclo === 'Bloqueado' && !ehMapa(d.dados.bloqueio)) {
|
|
563
|
-
achados.push(erro(d.arquivo, d.id, 'docs.estado.bloqueio',
|
|
573
|
+
achados.push(erro(d.arquivo, d.id, 'docs.estado.bloqueio', (m) => m.bloqueadoSemMapa, (m) => m.bloqueadoSemMapaCorrecao));
|
|
564
574
|
}
|
|
565
575
|
if (codigo === 'Mesclado' && !commit) {
|
|
566
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.git',
|
|
576
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.git', (m) => m.mescladoSemCommit, (m) => m.mescladoSemCommitCorrecao));
|
|
567
577
|
}
|
|
568
578
|
if (commit && base) {
|
|
569
579
|
// RM-047: o commit vem do frontmatter do clone; só sha hexadecimal vai ao git.
|
|
570
580
|
if (!(0, branch_de_estado_1.shaValido)(commit) || !git(raiz, ['cat-file', '-e', `${commit}^{commit}`]).ok) {
|
|
571
|
-
achados.push(erro(d.arquivo, d.id, 'docs.paridade.git',
|
|
581
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.git', (m) => m.commitInexistente(commit)));
|
|
572
582
|
}
|
|
573
583
|
else if (codigo === 'Mesclado' && !git(raiz, ['merge-base', '--is-ancestor', commit, base]).ok) {
|
|
574
|
-
|
|
584
|
+
const naBase = base;
|
|
585
|
+
achados.push(erro(d.arquivo, d.id, 'docs.paridade.git', (m) => m.commitForaDaBase(commit, naBase), (m) => m.commitForaDaBaseCorrecao));
|
|
575
586
|
}
|
|
576
587
|
}
|
|
577
588
|
}
|
|
@@ -587,9 +598,7 @@ function verificarMergeDaThread(raiz, d, base, achados, pr = false) {
|
|
|
587
598
|
if (!pendente)
|
|
588
599
|
return;
|
|
589
600
|
const { thread, merges, codigo } = pendente;
|
|
590
|
-
achados.push((pr ? aviso : erro)(d.arquivo, d.id, 'docs.paridade.merge',
|
|
591
|
-
(pr ? ' (no PR, aviso: o push da main reprova)' : ''), `abra um PR de docs sobre a ${base} atualizada com ork docs sincronizar --escrever --so ${d.id} (o item e os índices); ` +
|
|
592
|
-
`se o item tem outra fatia em curso, aponte sdlc.thread para a thread dela`));
|
|
601
|
+
achados.push((pr ? aviso : erro)(d.arquivo, d.id, 'docs.paridade.merge', (m) => m.mergeDaThread(thread, base, merges[0].slice(0, 7), codigo, pr), (m) => m.mergeDaThreadCorrecao(base, d.id)));
|
|
593
602
|
}
|
|
594
603
|
/**
|
|
595
604
|
* A regra do `docs.paridade.merge`, isolada para o `ork ship registrar-pr` (RM-044, A3): a pagina cujo
|
|
@@ -645,7 +654,7 @@ const INDICES_GERADOS = [
|
|
|
645
654
|
* do mesmo jeito: sem a RM-051 e com a RM-031 de antes. Divergente reprova; vazio (o modelo recem-copiado
|
|
646
655
|
* pelo `ork docs init`) so avisa; sem os marcadores, nao ha indice gerado para conferir.
|
|
647
656
|
*/
|
|
648
|
-
function verificarIndices(raiz, docs, achados
|
|
657
|
+
function verificarIndices(raiz, docs, achados) {
|
|
649
658
|
for (const [arquivo, gerar] of INDICES_GERADOS) {
|
|
650
659
|
const abs = path.join(raiz, arquivo);
|
|
651
660
|
if (!fs.existsSync(abs))
|
|
@@ -656,34 +665,33 @@ function verificarIndices(raiz, docs, achados, pr = false) {
|
|
|
656
665
|
continue;
|
|
657
666
|
if (atual === '') {
|
|
658
667
|
if (docs.length > 0) {
|
|
659
|
-
achados.push(aviso(arquivo, undefined, 'docs.paridade.indice',
|
|
668
|
+
achados.push(aviso(arquivo, undefined, 'docs.paridade.indice', (m) => m.indiceNaoGerado, (m) => m.indiceNaoGeradoCorrecao));
|
|
660
669
|
}
|
|
661
670
|
}
|
|
662
671
|
else if (atual !== gerar(docs)) {
|
|
663
|
-
achados.push(
|
|
672
|
+
achados.push(erro(arquivo, undefined, 'docs.paridade.indice', (m) => m.indiceDiverge(false), (m) => m.indiceDivergeCorrecao));
|
|
664
673
|
}
|
|
665
674
|
}
|
|
666
675
|
}
|
|
667
676
|
// --------------------------------------------------------------------------------------------
|
|
668
677
|
// Saida para humano (TDAH) e para agente
|
|
678
|
+
/** O texto da verificacao, no locale ativo; a mensagem e a correcao de cada achado sao remontadas (G4 da F3b). */
|
|
669
679
|
function textoDaVerificacao(docs, achados) {
|
|
680
|
+
const m = (0, locale_1.msg)().docs;
|
|
670
681
|
const conta = (t) => docs.filter((d) => d.tipo === t).length;
|
|
671
682
|
const erros = achados.filter((a) => a.gravidade === 'erro');
|
|
672
683
|
const avisos = achados.filter((a) => a.gravidade === 'aviso');
|
|
673
684
|
const L = [];
|
|
674
|
-
L.push(
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
? `OK: nenhum erro de paridade${avisos.length ? ` · ${avisos.length} aviso(s) de leitura` : ''}`
|
|
678
|
-
: `REPROVADO: ${erros.length} erro(s)${avisos.length ? ` · ${avisos.length} aviso(s)` : ''}`);
|
|
679
|
-
for (const [titulo, grupo] of [['Erros', erros], ['Avisos', avisos]]) {
|
|
685
|
+
L.push(m.resumo(docs.length, conta('feature'), conta('roadmap'), conta('plataforma') + conta('sistema') + conta('modulo')));
|
|
686
|
+
L.push(erros.length === 0 ? m.semErro(avisos.length) : m.reprovado(erros.length, avisos.length));
|
|
687
|
+
for (const [titulo, grupo] of [[m.tituloErros, erros], [m.tituloAvisos, avisos]]) {
|
|
680
688
|
if (grupo.length === 0)
|
|
681
689
|
continue;
|
|
682
690
|
L.push('', titulo);
|
|
683
691
|
for (const a of grupo) {
|
|
684
|
-
L.push(` ${(a.id ?? a.arquivo).padEnd(9)} ${a.mensagem}`);
|
|
692
|
+
L.push(` ${(a.id ?? a.arquivo).padEnd(9)} ${(0, locale_1.remontar)(a.mensagem)}`);
|
|
685
693
|
if (a.correcao)
|
|
686
|
-
L.push(` ${''.padEnd(9)} → ${a.correcao}`);
|
|
694
|
+
L.push(` ${''.padEnd(9)} → ${(0, locale_1.remontar)(a.correcao)}`);
|
|
687
695
|
}
|
|
688
696
|
}
|
|
689
697
|
return L.join('\n');
|
|
@@ -772,22 +780,14 @@ function mergeDaThread(raiz, thread, base) {
|
|
|
772
780
|
return null;
|
|
773
781
|
}
|
|
774
782
|
/**
|
|
775
|
-
* Os
|
|
783
|
+
* Os merges da entrega na base, do mais velho ao mais novo, so pelo git (o CI pode nao ter ledger).
|
|
776
784
|
* RM-037 (fatia 3): um lugar so para o `sincronizarDocs` e o `verificarDocs` acharem o mesmo merge.
|
|
777
785
|
*/
|
|
778
786
|
function mergesDaThreadNoGit(raiz, thread, base) {
|
|
779
|
-
//
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
if (!(0, branch_de_estado_1.branchValida)(base))
|
|
784
|
-
return [];
|
|
785
|
-
const log = git(raiz, ['log', base, '--first-parent', '--reverse', '--format=%H%x09%s', '--fixed-strings', `--grep=ship(${thread})`]);
|
|
786
|
-
if (!log.ok)
|
|
787
|
-
return [];
|
|
788
|
-
return log.saida.split('\n').map((l) => l.split('\t'))
|
|
789
|
-
.filter(([sha, assunto]) => !!sha && typeof assunto === 'string' && assunto.startsWith(`ship(${thread})`))
|
|
790
|
-
.map(([sha]) => sha);
|
|
787
|
+
// O ref resolvido pode ser local, remoto abreviado ou remoto completo; a mensagem padrao do GitLab leva so a base.
|
|
788
|
+
const destino = base.replace(/^refs\/heads\//, '').replace(/^refs\/remotes\/[^/]+\//, '').replace(/^origin\//, '');
|
|
789
|
+
const branch = (0, merge_da_entrega_1.branchRegistradaDaEntrega)(raiz, thread);
|
|
790
|
+
return ((0, merge_da_entrega_1.mergesDasEntregasNaBase)(raiz, base, destino, [{ thread, branch }], true).get(thread) ?? []).map((m) => m.mergeSha);
|
|
791
791
|
}
|
|
792
792
|
function temBranch(raiz, thread) {
|
|
793
793
|
const r = git(raiz, ['for-each-ref', '--format=%(refname:short)', `refs/heads/ork/${thread}-*`, `refs/remotes/origin/ork/${thread}-*`]);
|
|
@@ -938,18 +938,18 @@ function tabelaDoProduto(docs) {
|
|
|
938
938
|
}
|
|
939
939
|
return L.join('\n');
|
|
940
940
|
}
|
|
941
|
+
/** O texto da sincronizacao, no locale ativo; o campo e os valores de cada mudanca sao dado e so a impressao os traduz. */
|
|
941
942
|
function textoDaSincronizacao(r, escreveu) {
|
|
943
|
+
const m = (0, locale_1.msg)().docs;
|
|
942
944
|
const L = [];
|
|
943
|
-
const ids = new Set(r.mudancas.map((
|
|
944
|
-
L.push(r.mudancas.length === 0 && r.indices.length === 0
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
for (const m of r.mudancas)
|
|
948
|
-
L.push(` ${m.id.padEnd(7)} ${m.campo}: ${m.de || '—'} → ${m.para} (${m.fonte})`);
|
|
945
|
+
const ids = new Set(r.mudancas.map((x) => x.id));
|
|
946
|
+
L.push(r.mudancas.length === 0 && r.indices.length === 0 ? m.sincronizado : m.aAtualizar(escreveu, ids.size, r.indices.length));
|
|
947
|
+
for (const x of r.mudancas)
|
|
948
|
+
L.push(m.linhaDaMudanca(x.id, x.campo, x.de, x.para, x.fonte));
|
|
949
949
|
for (const i of r.indices)
|
|
950
|
-
L.push(
|
|
950
|
+
L.push(m.indice(i));
|
|
951
951
|
if (!escreveu && (r.mudancas.length || r.indices.length))
|
|
952
|
-
L.push('',
|
|
952
|
+
L.push('', m.nadaGravado);
|
|
953
953
|
return L.join('\n');
|
|
954
954
|
}
|
|
955
955
|
// --------------------------------------------------------------------------------------------
|