@orkastery/cli 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -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/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -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-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- 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/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- 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 +3 -3
- package/adapters/openclaw/README.md +83 -10
- 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/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -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 +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- 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 +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- 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 +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- 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 +53 -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 +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- 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 +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -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 +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -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 +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -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 +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -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 +188 -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 +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- 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 +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- 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 +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- 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/index.js
CHANGED
|
@@ -40,8 +40,12 @@ exports.avisoRoadmapSemAssociacao = avisoRoadmapSemAssociacao;
|
|
|
40
40
|
exports.extrairOpcaoDeProjeto = extrairOpcaoDeProjeto;
|
|
41
41
|
exports.main = main;
|
|
42
42
|
const company_brain_cli_1 = require("./company-brain-cli");
|
|
43
|
+
const conhecimento_1 = require("./conhecimento");
|
|
44
|
+
const conhecimento_consulta_1 = require("./conhecimento-consulta");
|
|
43
45
|
const estado_thread_1 = require("./estado-thread");
|
|
44
46
|
const intelligence_graph_cli_1 = require("./intelligence-graph-cli");
|
|
47
|
+
const cli_1 = require("./security-scan/cli");
|
|
48
|
+
const check_modo_1 = require("./check-modo");
|
|
45
49
|
const mcp_grafo_1 = require("./mcp-grafo");
|
|
46
50
|
const maestro_cli_1 = require("./maestro-cli");
|
|
47
51
|
const hitl_public_receipt_1 = require("./hitl-public-receipt");
|
|
@@ -86,6 +90,7 @@ const board_1 = require("./board");
|
|
|
86
90
|
const hitl_1 = require("./hitl");
|
|
87
91
|
const pulse_1 = require("./pulse");
|
|
88
92
|
const pulse_resposta_1 = require("./pulse-resposta");
|
|
93
|
+
const pulse_consentimento_1 = require("./pulse-consentimento");
|
|
89
94
|
const pulse_cadencia_1 = require("./pulse-cadencia");
|
|
90
95
|
const decisao_autonoma_1 = require("./decisao-autonoma");
|
|
91
96
|
const hitl_contract_1 = require("./hitl-contract");
|
|
@@ -93,8 +98,10 @@ const orquestracao_1 = require("./orquestracao");
|
|
|
93
98
|
const divida_1 = require("./divida");
|
|
94
99
|
const ciclos_1 = require("./ciclos");
|
|
95
100
|
const claims_1 = require("./claims");
|
|
101
|
+
const claims_conferir_1 = require("./claims-conferir");
|
|
96
102
|
const catalogo_1 = require("./catalogo");
|
|
97
103
|
const doctor_1 = require("./doctor");
|
|
104
|
+
const doctor_forja_1 = require("./doctor-forja");
|
|
98
105
|
const preflight_1 = require("./preflight");
|
|
99
106
|
const evalrunner_1 = require("./evalrunner");
|
|
100
107
|
const gates_1 = require("./gates");
|
|
@@ -118,7 +125,7 @@ const horario_1 = require("./horario");
|
|
|
118
125
|
const onboarding_1 = require("./onboarding");
|
|
119
126
|
const experiencia_1 = require("./experiencia");
|
|
120
127
|
const hosts_2 = require("./hosts");
|
|
121
|
-
const
|
|
128
|
+
const locale_1 = require("./locale");
|
|
122
129
|
const memoria_1 = require("./memoria");
|
|
123
130
|
const orkmind_1 = require("./orkmind");
|
|
124
131
|
const indice_vetorial_1 = require("./indice-vetorial");
|
|
@@ -130,6 +137,9 @@ const ratelimit_1 = require("./ratelimit");
|
|
|
130
137
|
const retry_1 = require("./retry");
|
|
131
138
|
const prova_minima_1 = require("./prova-minima");
|
|
132
139
|
const versao_1 = require("./versao");
|
|
140
|
+
const noctum_cli_1 = require("./noctum-cli");
|
|
141
|
+
const noctum_envelope_1 = require("./noctum-envelope");
|
|
142
|
+
const noctum_modo_1 = require("./noctum-modo");
|
|
133
143
|
const modos_1 = require("./modos");
|
|
134
144
|
const modos_migracao_1 = require("./modos-migracao");
|
|
135
145
|
const setup_1 = require("./setup");
|
|
@@ -137,12 +147,18 @@ const runtime_profiles_1 = require("./runtime-profiles");
|
|
|
137
147
|
const claude_bg_1 = require("./adapters/claude-bg");
|
|
138
148
|
const codex_1 = require("./adapters/codex");
|
|
139
149
|
const conducao_1 = require("./conducao");
|
|
150
|
+
const conducao_sentinela_1 = require("./conducao-sentinela");
|
|
151
|
+
const autorizacao_duravel_1 = require("./autorizacao-duravel");
|
|
152
|
+
const atualizar_branch_1 = require("./atualizar-branch");
|
|
153
|
+
const conducao_batida_1 = require("./conducao-batida");
|
|
154
|
+
const pulse_delivery_1 = require("./pulse-delivery");
|
|
140
155
|
const phase_1 = require("./phase");
|
|
141
156
|
const prompts_1 = require("./prompts");
|
|
142
157
|
const sessoes_2 = require("./sessoes");
|
|
143
158
|
const util_1 = require("./util");
|
|
144
159
|
const ship_1 = require("./ship");
|
|
145
160
|
const ci_1 = require("./ci");
|
|
161
|
+
const dado_privado_1 = require("./dado-privado");
|
|
146
162
|
const thread_1 = require("./thread");
|
|
147
163
|
const docs_1 = require("./docs");
|
|
148
164
|
const roadmap_reservas_1 = require("./roadmap-reservas");
|
|
@@ -150,6 +166,7 @@ const fabrica_estado_1 = require("./fabrica-estado");
|
|
|
150
166
|
const branch_de_estado_1 = require("./branch-de-estado");
|
|
151
167
|
const network_roadmap_1 = require("./network-roadmap");
|
|
152
168
|
const fabrica_publicar_1 = require("./fabrica-publicar");
|
|
169
|
+
const fabrica_batida_1 = require("./fabrica-batida");
|
|
153
170
|
const maquina_1 = require("./maquina");
|
|
154
171
|
const rede_1 = require("./rede");
|
|
155
172
|
const rede_adesao_1 = require("./rede-adesao");
|
|
@@ -159,13 +176,19 @@ const rede_status_1 = require("./rede-status");
|
|
|
159
176
|
const ledger_1 = require("./ledger");
|
|
160
177
|
const tokens_1 = require("./tokens");
|
|
161
178
|
const types_1 = require("./types");
|
|
179
|
+
const dependencias_da_worktree_1 = require("./dependencias-da-worktree");
|
|
162
180
|
const verify_1 = require("./verify");
|
|
181
|
+
const fila_pesada_1 = require("./fila-pesada");
|
|
163
182
|
const worktree_1 = require("./worktree");
|
|
164
183
|
const claim_lint_1 = require("./claim-lint");
|
|
165
184
|
const licoes_1 = require("./licoes");
|
|
166
185
|
const demo_1 = require("./demo");
|
|
167
186
|
const entrega_pr_1 = require("./entrega-pr");
|
|
187
|
+
const ship_publicar_1 = require("./ship-publicar");
|
|
168
188
|
const projeto_alvo_1 = require("./projeto-alvo");
|
|
189
|
+
const worktree_local_1 = require("./worktree-local");
|
|
190
|
+
const mcp_transportes_1 = require("./mcp-transportes");
|
|
191
|
+
const postura_local_1 = require("./postura-local");
|
|
169
192
|
/** A versao publicada em `@orkastery/cli`, lida do package.json (`versao.ts`). */
|
|
170
193
|
// Antes de qualquer arquivo ou despacho: sem escrita de grupo nem de outros, que o sensor recusaria.
|
|
171
194
|
(0, preflight_1.endurecerUmask)();
|
|
@@ -201,13 +224,22 @@ function parseArgs(argv) {
|
|
|
201
224
|
function texto(v) {
|
|
202
225
|
return typeof v === 'string' ? v : undefined;
|
|
203
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* RM-058 N2 (A1 da rodada 2 do CHECK): a fila de recursos pesados de um comando que verifica por dentro, pelo `--esperar`
|
|
229
|
+
* dele, com o aviso no stderr e o comando que a recusa sugere. Sem `--esperar`, vale o padrão curto do verify.
|
|
230
|
+
*/
|
|
231
|
+
function filaPesadaDoCli(args, operacao, comandoDeEsperar) {
|
|
232
|
+
const m = (0, locale_1.msg)().verify;
|
|
233
|
+
return { esperarMs: conducaoDoCli(args).esperarMs, comandoDeEsperar,
|
|
234
|
+
aoEsperar: (ocupantes) => console.error(m.filaPesadaEsperando(operacao, ocupantes.map((o) => m.filaPesadaOcupante(o.operacao, o.thread, (0, horario_1.formatarDataHora)(o.desde))).join('; '))) };
|
|
235
|
+
}
|
|
204
236
|
/**
|
|
205
237
|
* I-36 (D2, D6): o que o CLI declara sobre a conducao. `--canal` (sem ele, o que a borda exporta),
|
|
206
238
|
* `--correlacao` (conversa ou mensagem de origem) e `--esperar [minutos]` (sem valor, 30).
|
|
207
239
|
*/
|
|
208
240
|
function conducaoDoCli(args) {
|
|
209
241
|
if (args.opcoes.canal === true)
|
|
210
|
-
throw new Error(
|
|
242
|
+
throw new Error((0, locale_1.msg)().phase.canalUso);
|
|
211
243
|
const bruto = args.opcoes.esperar;
|
|
212
244
|
let esperarMs;
|
|
213
245
|
if (bruto === true)
|
|
@@ -215,377 +247,49 @@ function conducaoDoCli(args) {
|
|
|
215
247
|
else if (typeof bruto === 'string') {
|
|
216
248
|
const minutos = Number(bruto);
|
|
217
249
|
if (!Number.isFinite(minutos) || minutos <= 0 || minutos > 24 * 60)
|
|
218
|
-
throw new Error(
|
|
250
|
+
throw new Error((0, locale_1.msg)().phase.esperarUso);
|
|
219
251
|
esperarMs = Math.round(minutos * 60_000);
|
|
220
252
|
}
|
|
221
253
|
return { canal: (0, conducao_1.canalDoProcesso)(texto(args.opcoes.canal)), correlacao: texto(args.opcoes.correlacao) ?? null, esperarMs };
|
|
222
254
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
accounts list [--json] Perfis de conta por runtime, sem segredo (I-33)
|
|
251
|
-
accounts add <id> --runtime R --dir D Cria o perfil e roda o login do proprio CLI com o env
|
|
252
|
-
[--sem-login] do perfil (nunca copia credencial)
|
|
253
|
-
accounts remove <id> Desativa o perfil (diretorio e login ficam onde estao)
|
|
254
|
-
accounts check [<id>] Confere o login de cada perfil e marca o store
|
|
255
|
-
accounts esgotamentos [--desde 7d] [--json]
|
|
256
|
-
Despachos numa conta que outro projeto desta maquina viu esgotada
|
|
257
|
-
(RM-040), so leitura: conta opaca, perfil pelo id, sem diretorio
|
|
258
|
-
setup [<modo>] --reset Volta o modo (ou tudo) ao default
|
|
259
|
-
setup versionar Leva o setup que vale para orkastery.setup.json: por PR, vale em
|
|
260
|
-
todas as maquinas e passa a ser o arquivo editado (I-52)
|
|
261
|
-
|
|
262
|
-
thread new <nome> --modo <MODO> Cria a thread, o slug de 3 partes e o ledger
|
|
263
|
-
[--exige-runtime-diferente] o CHECK precisa de runtime que o GO nao usou
|
|
264
|
-
[--done "<criterio> :: <comando>"] criterio de pronto EXECUTAVEL (use ;; para varios)
|
|
265
|
-
[--slug S] [--assunto A] [--worktree auto|DIR] [--dry-run]
|
|
266
|
-
[--sem-worktree] cria sem worktree (na branch base, o ship barra a entrega com
|
|
267
|
-
push_direto_na_base: block, o padrão do ork init); com
|
|
268
|
-
worktree.por_thread: true, a worktree nasce sem flag
|
|
269
|
-
[--roadmap RM-NNN] reserva o item do roadmap antes de criar (I-47)
|
|
270
|
-
thread list [--todas] [--json] Threads NAO fechadas do projeto (--todas inclui as fechadas)
|
|
271
|
-
thread close <id> --motivo orfa|engano|superada --por Q --justificativa J
|
|
272
|
-
thread entrega <id> --arquivo A --sha256 H --por Q
|
|
273
|
-
thread status <thread-id> [--json] Estado da thread, cruzado com o runtime
|
|
274
|
-
|
|
275
|
-
portfolio inspect <id> --json Entidade, origem e ciclos com lacunas explícitas
|
|
276
|
-
creation start --input-file F --json Criação durável com identidade do processo local
|
|
277
|
-
creation show|list|events [id] --json Consulta journal e recuperação
|
|
278
|
-
creation resume|compensate <id> --expected-version N --json
|
|
279
|
-
portfolio create <product|project|initiative> <id> --title T [--parent ID]
|
|
280
|
-
portfolio list [product|project|initiative] [--parent ID] [--json]
|
|
281
|
-
portfolio show <id> [--json] Catálogo prod -> proj -> init
|
|
282
|
-
[--constraints A;B] [--outcomes A;B] [--threads N]
|
|
283
|
-
[--execution-runtime R] [--validation-runtimes R1,R2]
|
|
284
|
-
objective ... Aposentado na I-43: as duas vigas viraram
|
|
285
|
-
--exige-runtime-diferente e --done de thread
|
|
286
|
-
|
|
287
|
-
phase run <thread-id> <FASE> --prompt "<texto>"
|
|
288
|
-
[--runtime R] [--model M] Despacha a fase como background agent
|
|
289
|
-
[--effort E] [--dry-run] (runtime: CLI > setup do bloco > manifesto;
|
|
290
|
-
so --model assume --effort high; o trio
|
|
291
|
-
efetivo vai ao ledger como fato verificavel)
|
|
292
|
-
[--canal C] [--correlacao ID] Canal de origem (sem ele, o que o host declara)
|
|
293
|
-
[--esperar [min]] Com a thread ja conduzida, espera a vez (sem: recusa na hora)
|
|
294
|
-
[--perfil ID] Conta do despacho (ork accounts list); inexistente, de outro
|
|
295
|
-
runtime, esgotado ou sem login recusa com motivo tipado
|
|
296
|
-
phase list <thread-id> Historico do ledger da thread
|
|
297
|
-
(mostra o modelo/esforco reais de cada fase)
|
|
298
|
-
ledger stats --desde 7d [--ate ISO] Telemetria economica do ledger (intervalo [desde,ate))
|
|
299
|
-
[--thread T] [--modo M] [--runtime R] [--json]
|
|
300
|
-
ledger estimate <thread-id> --sem-ia H --ia-sem-ork H --por Q --metodo M --premissas P
|
|
301
|
-
[--incerteza I] Registra estimativas explicitas da fase PLAN
|
|
302
|
-
|
|
303
|
-
sessions [--all] [--global] [--json] Inventário Claude e Codex da conta do processo e de cada perfil
|
|
304
|
-
[--exigir-limpo] Sai != 0 com fonte inválida ou sessão sem thread
|
|
305
|
-
sessions adopt <id> [--json] Adota identidade real sem executar prompt
|
|
306
|
-
sessions event --tipo T --sessao ID Ingere JSON limitado no stdin; observa sem aprovar gates
|
|
307
|
-
sessions watch --thread T [--sessao ID] Observa somente a sessão selecionada; --once faz uma varredura
|
|
308
|
-
sessions limpar-fantasmas [--dry-run] Solta do ork (sessao_morta no ledger) a sessao sem pid e sem processo;
|
|
309
|
-
[--json] nunca toca no runtime (RM-056)
|
|
310
|
-
sessions logs <sessao> [--linhas N] Logs de uma sessao
|
|
311
|
-
sessions supersede <thread> <UUID> --fase F --runtime R Confirma encerramento de sessão superada
|
|
312
|
-
sessions request <thread> <UUID> --fase F --runtime R --pergunta P Abre pedido vinculado ao prompt nativo
|
|
313
|
-
sessions answer <thread> <pedido> --stdin --origem telegram --canal C --por ID --mensagem REF [--conta ID] Confirma entrega autenticada
|
|
314
|
-
sessions reconcile <thread> <pedido> Fecha envio pendente so com thread e pedido; consulta recibo, nunca reenvia
|
|
315
|
-
sessions stop <sessao> Para uma sessao
|
|
316
|
-
sessions attach <sessao> Imprime o comando de attach (precisa de TTY)
|
|
317
|
-
pulse [--json] [--registrar] Fila unificada de atenção humana e retry de órfãs
|
|
318
|
-
pulse responder --resposta-stdin --origem telegram --canal C --por ID --mensagem REF [--conta ID]
|
|
319
|
-
Recebe o que o dono digitou no canal do resumo (P4EJ a, 1a 2c)
|
|
320
|
-
pulse cadencia [<tag>] [--por P] [--json] Mostra ou troca a cadencia do resumo: OrkPulseOn, OrkPulseOn-15m,
|
|
321
|
-
-30m, -60m ou OrkPulseOff; pergunta nova sai na hora (I-50)
|
|
322
|
-
sessions hitl [--json] [--so-paradas] Radar de sessoes que exigem acao humana AGORA:
|
|
323
|
-
[--atencao N] [--sem-logs] classifica o estado de cada sessao do runtime,
|
|
324
|
-
[--so-da-raiz] [--exigir-limpo] le a pergunta que a sessao trava e diz o que
|
|
325
|
-
destrava (pega HITL de sessao SEM thread)
|
|
326
|
-
|
|
327
|
-
claims add <thread-id> <arquivo> --claim "<alegacao>" [--verificar "<comando>"] [--fase F]
|
|
328
|
-
Registra alegacao verificavel da thread
|
|
329
|
-
claims list <thread-id> Claims da thread e o estado de cada uma
|
|
330
|
-
decisao registrar <thread-id> --decidido D --porque P --como-mudar C --custo-agora A --custo-depois B
|
|
331
|
-
--criterio manifesto:CHAVE|ledger:REF|medicao:COMANDO --quem Q --evidencia E [--razao R] [--reverte ID]
|
|
332
|
-
Decisao tomada sem perguntar: chega ao dono no resumo
|
|
333
|
-
decisao placar <thread-id> [--json] Decididas contra perguntas por fase, reversoes e o limiar
|
|
334
|
-
claims verificar <thread-id> <claim-id> --comando "<comando>"
|
|
335
|
-
Anexa o comando que comprova uma claim ja feita
|
|
336
|
-
claims retirar <thread-id> <claim-id> --motivo "<motivo>"
|
|
337
|
-
Retira a alegacao (o historico fica no claims.jsonl)
|
|
338
|
-
claims ausente <thread-id> --paths A,B --motivo "<motivo>" [--commit SHA]
|
|
339
|
-
Ciclo sem CHECK: declara no ledger o que ficou sem prova
|
|
340
|
-
verify <thread-id> [--baseline] Reexecuta claims e verify do manifesto no HEAD real
|
|
341
|
-
[--so-claims] --baseline grava o estado do mundo antes do GO
|
|
342
|
-
[--canal C] [--esperar [min]] So executa com a conducao da thread (sai 3 se outra conduz)
|
|
343
|
-
ci prepare <thread-id> Exporta claims/comandos para a candidata (.ork-ci/<thread>.json)
|
|
344
|
-
ci run [<thread-id>] [--bundle ARQ] Executa o CHECK no runner independente
|
|
345
|
-
[--branch B] acha o bundle da thread pelo nome da branch (o CI usa)
|
|
346
|
-
ci status [--sha SHA] [--remoto origin] Consulta o check exato publicado no GitHub
|
|
347
|
-
|
|
348
|
-
gate next <thread-id> [--proximo FASE] Gate de tokens: mesma sessao ou nova sessao
|
|
349
|
-
[--ocupacao 0..1] [--fonte F] [--transcript ARQ] [--janela N] [--refazer]
|
|
350
|
-
gate request <thread-id> [--motivo M] Apresenta pedido HITL correlacionado à pausa
|
|
351
|
-
[--formato telegram|terminal] no contrato curto, com o codigo estavel para responder
|
|
352
|
-
gate answer <thread-id> <pedido> Recebe envelope do ingresso humano autenticado
|
|
353
|
-
--resposta-stdin --por Q --mensagem ID --origem telegram [--canal hermes|openclaw]
|
|
354
|
-
[--conta ID] conta homologada do canal; obrigatoria no canal openclaw
|
|
355
|
-
gate approve Aposentado: aprovação sem pedido é recusada
|
|
356
|
-
|
|
357
|
-
retry policy [--motivo M] [--json] Politica de retry por motivo tipado de gate
|
|
358
|
-
retry plan <thread-id> [--motivo M] O que o ork faria pelo ultimo gate reprovado
|
|
359
|
-
[--fase F] [--json] (calcula, nao executa, nao gasta tentativa)
|
|
360
|
-
retry run <thread-id> [--reverify] Executa a acao tipada do ultimo gate reprovado
|
|
361
|
-
[--por Q] [--dry-run] (--por autoriza quando o bloco do modo pausa)
|
|
362
|
-
retry list [--json] Fila DURAVEL de rate limit do projeto
|
|
363
|
-
retry resume [--id R1] [--agora ISO] Retoma a fase morta por rate limit na janela seguinte
|
|
364
|
-
[--ocupacao 0..1] [--forcar] [--dry-run] (playbooks: mesma-sessao, nova-sessao, escalada)
|
|
365
|
-
retry cancel <id> --motivo M Tira um pedido da fila, com motivo registrado
|
|
366
|
-
retry parse --stderr "<texto>" Le o horario de reset do stderr do adapter
|
|
367
|
-
|
|
368
|
-
fix open <thread-id> [--so-claims] GO-FIX: deriva a spec exata do CHECK reprovado
|
|
369
|
-
[--reverify] [--json] (uma correcao por motivo tipado, tipo A ou B)
|
|
370
|
-
fix list <thread-id> [--rodada N] Correcoes da rodada e o veredito de cada uma
|
|
371
|
-
fix reverify <thread-id> [--rodada N] CHECK-REVERIFY com veredito POR correcao
|
|
372
|
-
[--parcial] [--json] (--parcial e RECUSADO se houver tipo B)
|
|
373
|
-
|
|
374
|
-
handoff export <thread-id> Handoff triado CRITICO/IMPORTANTE/RESUMIVEL
|
|
375
|
-
[--proxima-fase FASE] [--slug S]
|
|
376
|
-
handoff recall <thread-id> <ponteiro> Resolve um ponteiro path#ancora de volta ao conteudo
|
|
377
|
-
|
|
378
|
-
recall <thread-id> --fase FASE Recuperacao TARDIA: resolve so os ponteiros do
|
|
379
|
-
[--id ptr-N] [--todos] [--forcar] momento (retrieve_when), nunca a janela inteira
|
|
380
|
-
[--sem-conteudo] [--json] (orkmind por tag, files por path#ancora)
|
|
381
|
-
|
|
382
|
-
brain status|inventory|get|query|receipts|context|dossie|sync|reconcile|apply|rollback|bind
|
|
383
|
-
brain dossie --thread T [--decisao ID] Dossie de decisao: vinculo, contexto citavel, alternativas,
|
|
384
|
-
quem decidiu e evidencia, com os ids do Brain (so leitura)
|
|
385
|
-
memory status [--json] [--sondar] Regime efetivo (files|orkmind), tenant, degradacao e embeddings
|
|
386
|
-
(--sondar: uma chamada real de embedding, com a latencia)
|
|
387
|
-
memory sync [<thread-id>] [--json] Publica decisoes, policies, handoff, licao e roadmap
|
|
388
|
-
memory inventory --escopo <threads> [--json] Inventaria fontes canonicas e tenants excluidos, sem gravar
|
|
389
|
-
memory migrate --operadora <thread> --escopo <threads> [--dry-run] [--json] Migra handoffs por G3, com pacote integral e readback
|
|
390
|
-
memory search --tags '<json>' [--colecao C] Busca deterministica por tag (mandatory sempre volta)
|
|
391
|
-
[--thread ID] [--restrito] [--janela N] [--limite N] [--json]
|
|
392
|
-
memory search --texto "<frase>" Busca por significado (I-38): vetor + FTS por RRF no tenant,
|
|
393
|
-
[--modo hibrido|vetor|fts] NAO deterministica; nao combina com --tags nem --thread
|
|
394
|
-
[--colecao C] [--limite N] [--json]
|
|
395
|
-
memory index [--modelo primario|fallback|todos] Indice vetorial local do tenant (I-38), idempotente,
|
|
396
|
-
[--dry-run] [--json] com tokens e custo estimados; --dry-run nao chama o provider
|
|
397
|
-
|
|
398
|
-
grafo indexar [--verificar] [--forcar] Indice do grafo de codigo do HEAD limpo (RM-031 KG3) no estado do projeto:
|
|
399
|
-
[--json] pastas 0700, chave por revisao e extrator, idempotente; incremental (KG4)
|
|
400
|
-
a partir do indice ancestral, ou completo com o motivo; --forcar extrai
|
|
401
|
-
completo; --verificar confere contrato, bytes, determinismo e o incremental
|
|
402
|
-
contra a completa; precisa de typescript e micromark
|
|
403
|
-
grafo status [--json] Indices guardados, o do HEAD, os analisadores e o tamanho
|
|
404
|
-
grafo contexto <thread> [--json] Pacote da thread com evidencias e medida em bytes [--teto-bytes N]
|
|
405
|
-
grafo vizinhos <no> [--profundidade N] Vizinhanca de arquivo ou simbolo, com extrator e evidencia de cada aresta
|
|
406
|
-
[--sentido entrada|saida|ambos] [--tipo T,...] [--limite N] [--json]
|
|
407
|
-
grafo chamadores <simbolo> Quem chama (arestas calls que chegam) [--profundidade N] [--limite N] [--json]
|
|
408
|
-
grafo importadores <arquivo|simbolo> Quem importa (arestas imports que chegam) [--profundidade N] [--limite N] [--json]
|
|
409
|
-
grafo caminho <de> <para> Menor caminho pelas arestas [--sentido saida|entrada|ambos] [--tipo T,...] [--json]
|
|
410
|
-
[--json --teto-bytes N] Nas quatro consultas (KG5): JSON compacto de no maximo N bytes; as arestas mais
|
|
411
|
-
longe do alvo saem ate caber, e o caminho que nao cabe recusa
|
|
412
|
-
grafo amostra [--por-estrato N] Amostra de arestas para auditoria manual; --conferir ARQ confere a auditada
|
|
413
|
-
grafo limpar [--tudo] [--json] Apaga os indices que nao sao do HEAD e as sobras com mais de uma hora
|
|
414
|
-
|
|
415
|
-
ship <thread-id> --para <branch> Merge --no-ff serializado por lease e push PROVADO
|
|
416
|
-
ship registrar-pr <thread-id>|--todas A entrega feita por PR vira ship_done: merge ship(<thread>) na base
|
|
417
|
-
[--remoto R] [--json] remota e CI verde no head do PR; depois, ork master <thread> --aceitar-omissao
|
|
418
|
-
[--repo <dono/nome> --pr <n>] PR mesclado em repositorio externo de ci.external_repositories
|
|
419
|
-
[--dry-run] Ensaio: as mesmas conferencias, sem gravar ship_done, fase nem fabrica
|
|
420
|
-
[--de <branch>] [--remoto origin] [--autorizar-push <quem>] [--sem-push] [--dry-run]
|
|
421
|
-
|
|
422
|
-
board [--all] [--sem-remoto] Visao unica das threads (todos os perfis com --all); com a
|
|
423
|
-
fabrica compartilhada, tambem as outras maquinas (I-51)
|
|
424
|
-
board plan Escalonador: quem avanca agora, quem espera e por que
|
|
425
|
-
|
|
426
|
-
orquestracao status [--all] [--json] Monitor PROATIVO de pausas e impedimentos: quem esta
|
|
427
|
-
[--atencao N] [--so-paradas] parado, esperando o que, ha quanto tempo e o que
|
|
428
|
-
[--sem-runtime] [--exigir-limpo] destrava (alias curto: ork monitor)
|
|
429
|
-
|
|
430
|
-
worktree ensure <thread-id> Garante a worktree da thread (base resolvida pelo ork)
|
|
431
|
-
worktree sync <thread-id> [--dry-run] Rebasa a branch da thread quando a base avancou
|
|
432
|
-
worktree audit <thread-id> Confere a worktree no proprio git (sai != 0 se divergir)
|
|
433
|
-
worktree release <thread-id> [--forcar] Remove a worktree e limpa o registro
|
|
434
|
-
|
|
435
|
-
activation plan|status|enable|disable Escrita escopada com aceite, hash, leases e recibo
|
|
436
|
-
lease list Leases, familias e as filas (merge e colisao de regiao)
|
|
437
|
-
lease acquire <nome> --thread T --motivo M Toma um lease tipado (entra na fila se colidir)
|
|
438
|
-
lease release <nome> [--thread T] [--forcar]
|
|
439
|
-
conducao status <thread-id> [--json] Quem conduz a thread agora (canal, sessao, fase, desde)
|
|
440
|
-
conducao assumir <thread-id> --por Q --motivo M
|
|
441
|
-
Handoff: encerra a conducao atual pelo runtime e registra quem assumiu
|
|
442
|
-
|
|
443
|
-
master propor <id> --score N --justificativa J --por <agente>
|
|
444
|
-
master batch --aceitar <thread:assinatura,...> --por <humano>
|
|
445
|
-
master migrar --dry-run --por Q Inspeciona correções sem alterar originais
|
|
446
|
-
master digest <enviar|preview|responder> Digest semanal com recibos do host
|
|
447
|
-
master <thread-id> --score 0-5 --justificativa "<texto>" --por <seu-nome>
|
|
448
|
-
[--classe C[,C]] [--resumo R] [--refazer]
|
|
449
|
-
Fecha a thread: POSTMORTEM + MASTER log + score (so do terminal;
|
|
450
|
-
de processo de host e recusado com master.prova-de-canal)
|
|
451
|
-
master pedir <thread-id> [--formato telegram|terminal|json]
|
|
452
|
-
Pede a nota ao dono com codigo curto; ele responde pelo Telegram
|
|
453
|
-
(<codigo> <0 a 5> <porque>) e a nota vai ao ledger com o recibo (RM-048)
|
|
454
|
-
master [--todas] [--json] As entregas, com o indice derivado do ledger
|
|
455
|
-
master <thread-id> --aceitar-omissao Aceita por omissao SO a entrega desta thread, com registro (ou --thread T)
|
|
456
|
-
[--dry-run] [--json] --dry-run lista o que seria fechado, sem gravar
|
|
457
|
-
master --aceitar-omissao [--dry-run] [--json]
|
|
458
|
-
Aceita TODAS as entregues por omissao, listando cada uma
|
|
459
|
-
(de processo de agente com mais de uma, avisa em stderr)
|
|
460
|
-
master classes As classes de falha fixas do POSTMORTEM
|
|
461
|
-
licoes [--json] O que volta no GOAL e no PLAN da proxima thread (POSTMORTEM e
|
|
462
|
-
MASTER) e as propostas de policy por recorrencia (I-55)
|
|
463
|
-
|
|
464
|
-
demo [--manter] [--dir D] A promessa em 30 s: uma afirmacao falsa reprovada e a corrigida aceita,
|
|
465
|
-
offline, num repositorio temporario (I-56)
|
|
466
|
-
ciclos Variantes de ciclo de "ork thread new --ciclo"
|
|
467
|
-
modos --do-pedido "<texto>" [--json] Le a #TAG do pedido do builder (usado pelos adaptadores)
|
|
468
|
-
modos migrar [--dry-run] [--por Q] Tira modo aposentado do orkastery.yaml e do setup.json
|
|
469
|
-
[--json] (idempotente, com backup; nao toca em historico)
|
|
470
|
-
|
|
471
|
-
prompt list Templates de prompt (embutidos e os do projeto)
|
|
472
|
-
prompt lint [--template ID] Reprova template quebrado antes de ele virar despacho
|
|
473
|
-
prompt render <thread-id> --fase F Mostra o prompt exato, com o sha256 que vai ao ledger
|
|
474
|
-
[--pedido "<texto>"] [--template ID]
|
|
475
|
-
prompt render --exemplo --fase F --modo M Renderiza sem thread nenhuma, para revisar o texto
|
|
476
|
-
|
|
477
|
-
roadmap status [--json] Status report unico do roadmap: grupos com icones, #HITL no que espera
|
|
478
|
-
voce e o fecho com o que precisa de voce e o que vem a seguir (RM-048)
|
|
479
|
-
roadmap reservas [--json] [--remoto R] Quem esta com cada item do roadmap, lido da branch ork/roadmap-reservas
|
|
480
|
-
[--soltar-orfas] marca a reserva de thread ja fechada (orfa) e, com a opcao, solta
|
|
481
|
-
ou passa para outra thread aberta do mesmo item, com registro
|
|
482
|
-
roadmap pegar <RM-NNN> [--thread T] Reserva o item para esta maquina (push atomico: o primeiro vence)
|
|
483
|
-
[--nota N] [--por Q] [--maquina M] maquina = --maquina, ORK_MAQUINA ou o hostname
|
|
484
|
-
[--forcar --motivo M] tomar a reserva de outra maquina fica registrado
|
|
485
|
-
roadmap soltar <RM-NNN> [--forcar --motivo M] Devolve o item
|
|
486
|
-
roadmap feat [--thread T] [--nota N] Reserva o proximo numero de FEAT na mesma branch (push atomico: duas
|
|
487
|
-
maquinas nunca levam o mesmo numero; numero reservado nao volta)
|
|
488
|
-
fabrica [--json] [--sem-remoto] O que cada maquina conduz, lido da branch ork/fabrica-estado (I-51)
|
|
489
|
-
fabrica entrar [--maquina NOME] Esta maquina entra na fabrica compartilhada deste usuario, com
|
|
490
|
-
este nome (~/.orkastery/maquina.json), e publica o primeiro retrato
|
|
491
|
-
fabrica publicar [--forcar] [--json] Grava o retrato desta maquina na branch (push atomico, sem forca);
|
|
492
|
-
depois de entrar, sai sozinho ao criar thread, despachar fase,
|
|
493
|
-
entregar e fechar, e a cada batida do pulse
|
|
494
|
-
fabrica sair Para de publicar daqui e tira o retrato desta maquina da branch
|
|
495
|
-
network status [--json] [--sem-remoto] A Orkastery Network desta pessoa: as maquinas, de qualquer diretorio,
|
|
496
|
-
com a fonte, as lacunas e o que nao foi lido (RM-053)
|
|
497
|
-
network entrar [--maquina NOME] Esta maquina entra na rede: repositorio privado <usuario>/orkastery-network
|
|
498
|
-
[--forja github|gitlab] [--repositorio [DONO/]NOME] na forja (criado se falta) e o primeiro retrato;
|
|
499
|
-
[--forcar] --forcar toma um nome que outra instalacao usa (fica no commit)
|
|
500
|
-
network publicar [--forcar] [--json] Grava o retrato desta maquina na casa da rede (push sem forca); depois de
|
|
501
|
-
entrar, sai sozinho na batida do pulse e nos eventos de thread
|
|
502
|
-
network sair Para de publicar daqui e tira o retrato desta maquina da casa
|
|
503
|
-
network roadmap [--projeto P] [--json] Roadmap, reservas e threads de cada maquina de cada projeto, de qualquer diretorio:
|
|
504
|
-
[--sem-remoto] fonte e hora de cada parte, lacuna tipada no que nao leu. P = caminho do clone,
|
|
505
|
-
github:dono/repo, gitlab:grupo/repo ou nome conhecido; sem clone, le a forja (RM-054)
|
|
506
|
-
docs verificar [--json] [--pr] Documentacao de produto e roadmap contra o codigo e o git; no PR (--pr),
|
|
507
|
-
o merge de outra thread e o indice que divergem da main so avisam
|
|
508
|
-
(padrao do dono: frontmatter, leitura, paridade; sai != 0 com erro)
|
|
509
|
-
docs sincronizar [--escrever] Fatos do ledger e do git para o roadmap (merge, fase) e indices;
|
|
510
|
-
sem --escrever so mostra; nunca muda status por passagem de tempo
|
|
511
|
-
[--so RM-NNN[,RM-MMM]] [--todos] so esses itens (e os indices); na worktree de uma thread com item,
|
|
512
|
-
o padrao e o item dela; --todos volta a todo item (RM-037)
|
|
513
|
-
docs init Cria padroes, modelos, indices e o lint de Markdown no projeto
|
|
514
|
-
|
|
515
|
-
mcp serve --project RAIZ --host HOST Servidor MCP stdio deste projeto (codex|claude-code)
|
|
516
|
-
mcp install --project RAIZ --host HOST Prepara MCP; aceita --dry-run, --ship-transport, --child-permissions e --owner-permissions (Codex)
|
|
517
|
-
|
|
518
|
-
adapter list Adaptadores de host (Camada 1) e o destino de cada um
|
|
519
|
-
adapter show <host> Os 3 pitfalls de instalacao do host
|
|
520
|
-
adapter install <host> [--dir D] Instala o adaptador (claude-code|codex|hermes|openclaw)
|
|
521
|
-
[--dry-run] [--force] divergencia segura resolve sozinha; o resto pergunta
|
|
522
|
-
[--aceitar-catalogo <arquivo>] sobrescreve a copia com o catalogo, arquivo a arquivo
|
|
523
|
-
[--manter-copia <arquivo>] deixa a copia como esta, arquivo a arquivo
|
|
524
|
-
|
|
525
|
-
eval [--skill S] [--canario C] Canarios de comportamento + corpus das skills finas
|
|
526
|
-
[--so-canarios] [--so-skills] [--json] (sai != 0 em qualquer falha)
|
|
527
|
-
|
|
528
|
-
audit packs [--estagio E] [--pack P] Os 7 packs, o estagio que os ativa e a postura
|
|
529
|
-
audit run <pack> [--profile P] Monta o prompt do pack e despacha pelo runtime adapter
|
|
530
|
-
[--since Nd] [--tudo] [--effort E] [--model M] [--agora "<quem>"] [--forcar] [--dry-run]
|
|
531
|
-
audit list Rodadas de auditoria do projeto
|
|
532
|
-
audit show <rodada> [--ledger] Contexto, achados e propostas de uma rodada
|
|
533
|
-
audit prompt <pack> [--since Nd] O prompt exato do pack, com o sha256 que vai ao ledger
|
|
534
|
-
audit lint Reprova template de auditoria quebrado (auditors/)
|
|
535
|
-
audit ingest <rodada> --arquivo J Registra em lote os achados que o auditor escreveu
|
|
536
|
-
audit finding add <rodada> --regra R Registra um achado com evidencia, claim e proposta
|
|
537
|
-
--titulo T --arquivo caminho:linha --impacto I --fix F --estimativa E
|
|
538
|
-
[--severidade critico|maior|menor] [--irreversivel "<passo>"] [--verificar "<comando>"]
|
|
539
|
-
audit verify <rodada> Reexecuta as claims dos achados (auditor sem self-report)
|
|
540
|
-
audit report <rodada> [--publicar] Relatorio com o bloco OBRIGATORIO de propostas
|
|
541
|
-
audit divida [--pack P] [--todos] Board de divida: propostas abertas e recorrencia
|
|
542
|
-
audit surface [<dir>] [--regra SPn] Varredura DETERMINISTICA da superficie de ataque de rede
|
|
543
|
-
[--limite N] [--json] (SP8..SP12; sai != 0 quando ha achado)
|
|
544
|
-
audit surface --registrar <rodada> Grava os achados da varredura no board da rodada
|
|
545
|
-
audit finding estado <id> <estado> Carimba o achado (aberto|adiado|resolvido|descartado)
|
|
546
|
-
|
|
547
|
-
thread new <nome> --from-finding <ID> Abre a thread a partir de um achado de auditoria
|
|
548
|
-
[--modo M] [--worktree auto] [--sem-worktree] [--dry-run]
|
|
549
|
-
(evidencia, claim e proposta viajam junto; a worktree segue
|
|
550
|
-
worktree.por_thread como no thread new)
|
|
551
|
-
|
|
552
|
-
Regimes de memoria: files (fallback honesto) e orkmind (bloco B6, base propria por tenant
|
|
553
|
-
declarada em memory.database_url_env pelo NOME da variavel de ambiente, sem fallback).
|
|
554
|
-
Colecoes gravadas no OrkMind: decision, handoff, rule, learning, roadmap (source=agent,
|
|
555
|
-
nunca mandatory: regra critica so nasce de humano autenticado).
|
|
556
|
-
|
|
557
|
-
Retry tipado (bloco B3): reexecutar, corrigir-dirigido, sincronizar-worktree,
|
|
558
|
-
escalar-esforco, esperar-janela, escalar-humano, sem-retry. Violacao de custo
|
|
559
|
-
(cost.violation) NUNCA recebe retry automatico. O limite de escalacao do manifesto
|
|
560
|
-
(retry.max_tentativas) pausa QUALQUER modo, inclusive #Auto.
|
|
561
|
-
|
|
562
|
-
Monitor de orquestracao (ork orquestracao status / ork monitor): duas naturezas de parada.
|
|
563
|
-
pausa-humana e a parada PREVISTA pelo modo (o bloco fechou e espera veredito, com o
|
|
564
|
-
pausaSobre do bloco dizendo o que o humano decide); impedimento e a nao prevista
|
|
565
|
-
(lease.busy, runtime.rate-limited, concurrency.limite e os demais gates tipados). Tudo e
|
|
566
|
-
DERIVADO de thread.json, ledger.jsonl e das filas em disco: o monitor le, nunca grava.
|
|
567
|
-
--exigir-limpo sai != 0 enquanto houver thread parada, para virar watchdog do orquestrador.
|
|
568
|
-
|
|
569
|
-
Fases: GOAL PLAN GO CHECK SHIP MASTER. Modos: ${modos_1.ORDEM_DOS_MODOS.map((m) => modos_1.MODOS[m].tag).join(' ')}.
|
|
570
|
-
Familias de lease: main-tree, worktree-write:<thread>, path:<glob>, board:<card>, service:<porta>.
|
|
571
|
-
Ciclos: greenfield, merge-branch, goal-plan, gap, feature-xl-faseada.
|
|
572
|
-
Fontes de medida do gate de tokens: runtime_reported, estimated, informada, unavailable.
|
|
573
|
-
Hosts de Camada 1: claude-code, codex, hermes, openclaw. Canarios: fx-happy, fx-hallucination,
|
|
574
|
-
fx-stale-base, fx-wiki-destroy, fx-schema-drift, fx-concurrency.
|
|
575
|
-
Packs de auditoria: clean-code, reuse, architecture, data-model, ux, security-privacy, process.
|
|
576
|
-
Superficie de ataque de rede (SP8..SP12, varredura deterministica): rota sem auth, endpoint de
|
|
577
|
-
administracao exposto, rota sem rate limit, CORS permissivo, rota sem esquema de payload.
|
|
578
|
-
Estagios do produto: nascente, crescendo, maduro (hardening gradual, visao secao 5.2).
|
|
579
|
-
`;
|
|
255
|
+
/** RM-061 (F2a): o que a ajuda interpola; a redacao mora no catalogo (`msg().ajuda`, D10). */
|
|
256
|
+
function dadosDaAjuda(locale = (0, locale_1.localeAtivo)()) {
|
|
257
|
+
return { versao: VERSAO, modos: modos_1.ORDEM_DOS_MODOS.length, segredos: (0, locale_1.msg)(locale).onboarding.segredos,
|
|
258
|
+
tags: modos_1.ORDEM_DOS_MODOS.map((m) => modos_1.MODOS[m].tag).join(' ') };
|
|
259
|
+
}
|
|
260
|
+
/** A ajuda em pt-BR, o texto de sempre: o `docs verificar` a compara com a referencia do CLI. */
|
|
261
|
+
const AJUDA = (0, locale_1.msg)('pt-BR').ajuda.texto(dadosDaAjuda('pt-BR'));
|
|
262
|
+
/**
|
|
263
|
+
* RM-061 (F2a): a ajuda segue o locale como os comandos cobertos: `owner.language` do projeto de
|
|
264
|
+
* `--projeto` ou do diretorio, senao `LC_ALL`, `LC_MESSAGES` e `LANG`. Manifesto ilegivel nao derruba a ajuda.
|
|
265
|
+
*/
|
|
266
|
+
function localeDaAjuda(projeto) {
|
|
267
|
+
// A ajuda sai antes de o projeto-alvo ser fixado: com `--projeto`, vale o manifesto dele (D14).
|
|
268
|
+
let raiz;
|
|
269
|
+
if (projeto !== undefined) {
|
|
270
|
+
try {
|
|
271
|
+
raiz = (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto })?.raiz;
|
|
272
|
+
}
|
|
273
|
+
catch { /* nome ambiguo ou desconhecido: o cwd */ }
|
|
274
|
+
}
|
|
275
|
+
let ownerLanguage;
|
|
276
|
+
try {
|
|
277
|
+
ownerLanguage = (0, manifest_1.carregarManifesto)(raiz)?.manifesto.owner?.language;
|
|
278
|
+
}
|
|
279
|
+
catch { /* vale o ambiente */ }
|
|
280
|
+
return (0, locale_1.resolverLocale)(ownerLanguage).locale;
|
|
281
|
+
}
|
|
580
282
|
function comandoThread(args) {
|
|
581
283
|
if (args.posicionais[1] === 'close' || args.posicionais[1] === 'entrega') {
|
|
582
284
|
const raiz = (0, manifest_1.exigirManifesto)().raiz, id = args.posicionais[2];
|
|
583
285
|
if (!id)
|
|
584
|
-
throw new
|
|
286
|
+
throw new locale_1.ErroDoCatalogo((m) => m.thread.informeOId);
|
|
585
287
|
const por = texto(args.opcoes.por) ?? '';
|
|
586
|
-
|
|
288
|
+
// RM-061 (F3b, D3): o fechamento e a entrega gravam (ledger, thread.json, a soltura do que a thread segurava) no
|
|
289
|
+
// escopo pt-BR; a recusa vem do catalogo e a entrada do CLI a remonta no locale do comando. O resultado e JSON.
|
|
290
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => args.posicionais[1] === 'close'
|
|
587
291
|
? (0, thread_close_1.fecharAdministrativamente)(raiz, id, { motivo: texto(args.opcoes.motivo) ?? '', por, justificativa: texto(args.opcoes.justificativa) ?? '' })
|
|
588
|
-
: (0, thread_close_1.registrarArtefato)(raiz, id, texto(args.opcoes.arquivo) ?? '', texto(args.opcoes.sha256) ?? '', por);
|
|
292
|
+
: (0, thread_close_1.registrarArtefato)(raiz, id, texto(args.opcoes.arquivo) ?? '', texto(args.opcoes.sha256) ?? '', por));
|
|
589
293
|
console.log(JSON.stringify(r, null, 2));
|
|
590
294
|
return 0;
|
|
591
295
|
}
|
|
@@ -596,8 +300,14 @@ function comandoThread(args) {
|
|
|
596
300
|
// O nome posicional passa a ser opcional, porque o titulo do achado ja serve de nome.
|
|
597
301
|
const doAchado = texto(args.opcoes['from-finding']) ?? texto(args.opcoes['do-achado']);
|
|
598
302
|
if (doAchado) {
|
|
303
|
+
const mf = (0, locale_1.msg)().thread.fromFinding;
|
|
599
304
|
const brutoModoAchado = texto(args.opcoes.modo) ?? texto(args.opcoes.mode);
|
|
600
305
|
let modoAchado;
|
|
306
|
+
// RM-058 N6 (D1): thread em modo #Noctum não existe; a recusa diz se falta o envelope ou se a lista do arco é fechada.
|
|
307
|
+
if (brutoModoAchado !== undefined && (0, noctum_modo_1.ehModoNoctum)(brutoModoAchado)) {
|
|
308
|
+
console.error((0, noctum_modo_1.recusaDoModoNaThread)(carregado.raiz).message);
|
|
309
|
+
return 2;
|
|
310
|
+
}
|
|
601
311
|
if (brutoModoAchado !== undefined) {
|
|
602
312
|
try {
|
|
603
313
|
modoAchado = (0, modos_1.exigirModoVivo)(brutoModoAchado);
|
|
@@ -627,11 +337,12 @@ function comandoThread(args) {
|
|
|
627
337
|
dryRun: args.opcoes['dry-run'] === true,
|
|
628
338
|
});
|
|
629
339
|
if (!r.ok) {
|
|
630
|
-
|
|
631
|
-
console.error(
|
|
632
|
-
console.error(`
|
|
633
|
-
console.error(
|
|
634
|
-
console.error(
|
|
340
|
+
const motivo = r.motivo ?? 'claims.failed';
|
|
341
|
+
console.error(mf.recusada(r.achado.id));
|
|
342
|
+
console.error(` ${mf.descricaoDoMotivo(motivo, auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[motivo])}`);
|
|
343
|
+
console.error(mf.motivoTipado(r.motivo));
|
|
344
|
+
console.error(mf.detalhe(r.detalhe));
|
|
345
|
+
console.error(mf.correcao(r.correcao));
|
|
635
346
|
return 1;
|
|
636
347
|
}
|
|
637
348
|
const gravadaDoAchado = args.opcoes['dry-run'] !== true;
|
|
@@ -640,8 +351,8 @@ function comandoThread(args) {
|
|
|
640
351
|
if (avisoDoRegistroDoAchado)
|
|
641
352
|
console.error(avisoDoRegistroDoAchado);
|
|
642
353
|
console.log(gravadaDoAchado
|
|
643
|
-
?
|
|
644
|
-
:
|
|
354
|
+
? mf.criada(r.achado.id)
|
|
355
|
+
: mf.simulacao);
|
|
645
356
|
console.log((0, divida_1.textoDoAchado)(r.achado));
|
|
646
357
|
console.log('');
|
|
647
358
|
if (r.thread) {
|
|
@@ -671,26 +382,32 @@ function comandoThread(args) {
|
|
|
671
382
|
}));
|
|
672
383
|
}
|
|
673
384
|
if (gravadaDoAchado && r.thread) {
|
|
674
|
-
console.log(
|
|
385
|
+
console.log(mf.origemDoGoal(r.thread.id));
|
|
675
386
|
console.log('');
|
|
676
|
-
console.log(
|
|
387
|
+
console.log(mf.pedidoMontado);
|
|
677
388
|
console.log('');
|
|
678
389
|
console.log(r.pedido);
|
|
679
390
|
console.log('');
|
|
680
|
-
console.log(
|
|
681
|
-
console.log(
|
|
391
|
+
console.log(mf.proximoPasso);
|
|
392
|
+
console.log(mf.comandoDoProximoPasso(r.thread.id));
|
|
682
393
|
}
|
|
683
394
|
return 0;
|
|
684
395
|
}
|
|
685
396
|
const nome = args.posicionais[2];
|
|
397
|
+
const mt = (0, locale_1.msg)().thread;
|
|
686
398
|
if (!nome) {
|
|
687
|
-
console.error(
|
|
399
|
+
console.error(mt.usoNew);
|
|
688
400
|
return 2;
|
|
689
401
|
}
|
|
690
402
|
const avisoRoadmap = avisoRoadmapSemAssociacao(nome, texto(args.opcoes.roadmap));
|
|
691
403
|
if (avisoRoadmap)
|
|
692
404
|
console.error(avisoRoadmap);
|
|
693
405
|
const brutoModo = texto(args.opcoes.modo) ?? texto(args.opcoes.mode);
|
|
406
|
+
// RM-058 N6 (D1): thread em modo #Noctum não existe; a recusa diz se falta o envelope ou se a lista do arco é fechada.
|
|
407
|
+
if (brutoModo !== undefined && (0, noctum_modo_1.ehModoNoctum)(brutoModo)) {
|
|
408
|
+
console.error((0, noctum_modo_1.recusaDoModoNaThread)(carregado.raiz).message);
|
|
409
|
+
return 2;
|
|
410
|
+
}
|
|
694
411
|
let modo;
|
|
695
412
|
try {
|
|
696
413
|
modo = brutoModo !== undefined
|
|
@@ -710,17 +427,31 @@ function comandoThread(args) {
|
|
|
710
427
|
const doneWhen = (texto(args.opcoes.done) ?? '').split(';;').map((p) => p.trim()).filter(Boolean)
|
|
711
428
|
.map((entrada) => {
|
|
712
429
|
const corte = entrada.indexOf('::');
|
|
713
|
-
if (corte < 0)
|
|
714
|
-
throw new Error(
|
|
715
|
-
+ 'Use --done "<criterio> :: <comando que o prova>"; criterio sem comando e prosa, nao criterio de pronto.');
|
|
716
|
-
}
|
|
430
|
+
if (corte < 0)
|
|
431
|
+
throw new Error(mt.doneSemComando(entrada));
|
|
717
432
|
const criterio = entrada.slice(0, corte).trim();
|
|
718
433
|
const comando = entrada.slice(corte + 2).trim();
|
|
719
434
|
if (!criterio || !comando)
|
|
720
|
-
throw new Error(
|
|
435
|
+
throw new Error(mt.doneIncompleto(entrada));
|
|
721
436
|
return { criterio, comando };
|
|
722
437
|
});
|
|
723
438
|
const dryRun = args.opcoes['dry-run'] === true;
|
|
439
|
+
// RM-059 (T6.0): o pedido do builder, guardado para o render da fase quando falta `--pedido`.
|
|
440
|
+
if (args.opcoes.pedido === true) {
|
|
441
|
+
console.error(mt.usoPedido);
|
|
442
|
+
return 2;
|
|
443
|
+
}
|
|
444
|
+
const pedidoDoBuilder = texto(args.opcoes.pedido);
|
|
445
|
+
// A4 do CHECK: pedido invalido e erro de uso, e sai antes da reserva do roadmap, que vai ao remoto.
|
|
446
|
+
if (pedidoDoBuilder !== undefined) {
|
|
447
|
+
try {
|
|
448
|
+
(0, thread_1.prepararPedido)(pedidoDoBuilder);
|
|
449
|
+
}
|
|
450
|
+
catch (e) {
|
|
451
|
+
console.error(mt.usoComMotivo((0, locale_1.mensagemDoErro)(e)));
|
|
452
|
+
return 2;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
724
455
|
// `--worktree auto` (ou `--worktree` sozinho) cria a worktree isolada da thread; um caminho reusa um
|
|
725
456
|
// diretorio que ja existe. P4 do ensaio da 0.5.0: sem flag, `worktree.por_thread: true` cria como o
|
|
726
457
|
// `--worktree auto`, e `--sem-worktree` cria sem ela. Uso invalido sai antes da reserva do roadmap.
|
|
@@ -735,13 +466,13 @@ function comandoThread(args) {
|
|
|
735
466
|
const brutoCiclo = texto(args.opcoes.ciclo) ?? texto(args.opcoes.variante);
|
|
736
467
|
const variante = brutoCiclo ? (0, ciclos_1.parseVariante)(brutoCiclo) : null;
|
|
737
468
|
if (brutoCiclo && !variante) {
|
|
738
|
-
console.error(
|
|
469
|
+
console.error(mt.varianteInvalida(brutoCiclo, Object.keys(ciclos_1.VARIANTES).join(', ')));
|
|
739
470
|
return 2;
|
|
740
471
|
}
|
|
741
472
|
// P4 do ensaio da 0.5.0 (D4, CHECK): a recusa do ciclo sai antes da reserva do roadmap, como os outros erros de
|
|
742
473
|
// uso; a do `novaThread` fica como defesa de quem o chama direto.
|
|
743
474
|
if (variante && (0, ciclos_1.definicaoDaVariante)(variante).exigeWorktree && pedido.origem === 'sem-worktree') {
|
|
744
|
-
console.error(
|
|
475
|
+
console.error(mt.cicloExigeWorktree(variante));
|
|
745
476
|
return 2;
|
|
746
477
|
}
|
|
747
478
|
const brutoFatias = texto(args.opcoes.fatias);
|
|
@@ -749,10 +480,11 @@ function comandoThread(args) {
|
|
|
749
480
|
// atomico entre maquinas (o primeiro push vence); a thread e local. Se a criacao falhar,
|
|
750
481
|
// a reserva e devolvida; se der certo, ela passa a apontar para a thread.
|
|
751
482
|
const itemDoRoadmap = dryRun ? undefined : texto(args.opcoes.roadmap);
|
|
752
|
-
|
|
483
|
+
// RM-061 (F2a, D6): o que grava estado (reserva, thread, ledger, worktree, registro, publicacoes) roda em pt-BR.
|
|
484
|
+
const itemReservado = itemDoRoadmap ? (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap).item) : undefined;
|
|
753
485
|
let criada;
|
|
754
486
|
try {
|
|
755
|
-
criada = (0, thread_1.novaThread)(carregado, {
|
|
487
|
+
criada = (0, locale_1.comLocale)('pt-BR', () => (0, thread_1.novaThread)(carregado, {
|
|
756
488
|
nome,
|
|
757
489
|
modo,
|
|
758
490
|
slug: texto(args.opcoes.slug),
|
|
@@ -767,47 +499,53 @@ function comandoThread(args) {
|
|
|
767
499
|
exigeRuntimeDiferente,
|
|
768
500
|
doneWhen,
|
|
769
501
|
roadmap: itemReservado,
|
|
770
|
-
|
|
502
|
+
...(pedidoDoBuilder !== undefined ? { pedido: pedidoDoBuilder } : {}),
|
|
503
|
+
}));
|
|
771
504
|
}
|
|
772
505
|
catch (e) {
|
|
773
506
|
if (itemDoRoadmap) {
|
|
774
507
|
try {
|
|
775
|
-
(0, roadmap_reservas_1.soltarItem)(carregado.raiz, itemDoRoadmap);
|
|
508
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.soltarItem)(carregado.raiz, itemDoRoadmap));
|
|
776
509
|
}
|
|
777
510
|
catch { /* fica reservado; `ork roadmap soltar` resolve */ }
|
|
778
511
|
}
|
|
779
512
|
throw e;
|
|
780
513
|
}
|
|
781
514
|
const { thread, gravada } = criada;
|
|
782
|
-
const reservaDoItem = itemDoRoadmap && gravada
|
|
515
|
+
const reservaDoItem = itemDoRoadmap && gravada
|
|
516
|
+
? (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap, { thread: thread.id })) : null;
|
|
783
517
|
// I-51 (RM-047): com a fabrica compartilhada, as outras maquinas veem a thread nova.
|
|
784
518
|
if (gravada)
|
|
785
|
-
(0, fabrica_publicar_1.publicarEmSegundoPlano)(carregado.raiz);
|
|
519
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, fabrica_publicar_1.publicarEmSegundoPlano)(carregado.raiz));
|
|
786
520
|
// RM-052 (D7): quem abre thread aqui conhece este projeto; o aviso nunca derruba a criacao.
|
|
787
|
-
const avisoDoRegistro = gravada ? (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'thread new') : null;
|
|
521
|
+
const avisoDoRegistro = gravada ? (0, locale_1.comLocale)('pt-BR', () => (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'thread new')) : null;
|
|
788
522
|
if (avisoDoRegistro)
|
|
789
523
|
console.error(avisoDoRegistro);
|
|
790
|
-
console.log(gravada ?
|
|
524
|
+
console.log(gravada ? mt.criada : mt.simulacao);
|
|
791
525
|
if (reservaDoItem)
|
|
792
|
-
console.log(
|
|
526
|
+
console.log(mt.roadmapReservado(reservaDoItem.item, reservaDoItem.reserva?.maquina));
|
|
793
527
|
console.log((0, thread_1.resumoDaThread)(thread));
|
|
794
528
|
console.log('');
|
|
795
|
-
console.log(
|
|
529
|
+
console.log(mt.slugEm3Partes((0, phase_1.descreverSlug)(thread.slug)));
|
|
796
530
|
const linhaDaWorktreeNova = (0, thread_1.linhaDaWorktree)(criada.worktreePor, gravada, variante);
|
|
797
531
|
if (linhaDaWorktreeNova)
|
|
798
532
|
console.log(linhaDaWorktreeNova);
|
|
533
|
+
relatarDependencias(criada.dependencias, thread.worktree ?? '');
|
|
799
534
|
const avisoDaWorktreeNova = criada.worktreeFalharia ? (0, thread_1.avisoDeWorktreeQueFalharia)(criada.worktreeFalharia)
|
|
800
535
|
: (0, thread_1.avisoDaWorktree)(pedido.origem, criada, carregado.manifesto);
|
|
801
536
|
const avisoSemBase = (0, thread_1.avisoDeThreadSemBase)(thread, gravada);
|
|
537
|
+
if (thread.pedido) {
|
|
538
|
+
console.log(mt.pedidoGuardado(gravada, `.orkastery/threads/${thread.id}/${thread.pedido.arquivo}`, (0, util_1.shaCurto)(thread.pedido.sha256), thread.pedido.bytes));
|
|
539
|
+
}
|
|
802
540
|
if (gravada) {
|
|
803
|
-
console.log(
|
|
541
|
+
console.log(mt.estado(thread.id));
|
|
804
542
|
// Bloco B6: a origem da thread e as policies do projeto vao para a memoria
|
|
805
543
|
// semantica quando ela esta ligada. Em regime files nada muda nesta saida.
|
|
806
|
-
relatarPublicacao((0, memoria_1.publicar)(carregado, thread.id));
|
|
544
|
+
relatarPublicacao((0, locale_1.comLocale)('pt-BR', () => (0, memoria_1.publicar)(carregado, thread.id)));
|
|
807
545
|
// Thread sem base nao tem fase para rodar: o proximo passo e o do aviso.
|
|
808
546
|
if (!avisoSemBase) {
|
|
809
547
|
console.log('');
|
|
810
|
-
console.log(
|
|
548
|
+
console.log(mt.proximoPasso(thread.id, thread.faseAtual));
|
|
811
549
|
}
|
|
812
550
|
}
|
|
813
551
|
if (avisoDaWorktreeNova)
|
|
@@ -833,8 +571,9 @@ function comandoThread(args) {
|
|
|
833
571
|
if (sub === 'status') {
|
|
834
572
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
835
573
|
const id = args.posicionais[2];
|
|
574
|
+
const mt = (0, locale_1.msg)().thread;
|
|
836
575
|
if (!id) {
|
|
837
|
-
console.error(
|
|
576
|
+
console.error(mt.usoStatus);
|
|
838
577
|
return 2;
|
|
839
578
|
}
|
|
840
579
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
@@ -848,20 +587,19 @@ function comandoThread(args) {
|
|
|
848
587
|
console.log((0, thread_1.resumoDaThread)(thread, (0, conducao_1.conducaoDaThread)(carregado.raiz, thread.id)));
|
|
849
588
|
console.log('');
|
|
850
589
|
if (thread.sessoes.length === 0) {
|
|
851
|
-
console.log(
|
|
590
|
+
console.log(mt.nenhumaSessao);
|
|
852
591
|
}
|
|
853
592
|
else {
|
|
854
|
-
console.log(
|
|
593
|
+
console.log(mt.sessoesDespachadas);
|
|
855
594
|
for (const s of thread.sessoes) {
|
|
856
|
-
console.log(` ${s.slug.padEnd(24)} ${s.fase.padEnd(6)} ${s.sessionId.slice(0, 8)} ` +
|
|
857
|
-
`verificada no runtime: ${s.verificada ? 'sim' : 'nao'} canal: ${(0, thread_1.canalDaSessao)(s)}`);
|
|
595
|
+
console.log(` ${s.slug.padEnd(24)} ${s.fase.padEnd(6)} ${s.sessionId.slice(0, 8)} ` + mt.sessao(s.verificada, (0, thread_1.canalDaSessao)(s)));
|
|
858
596
|
}
|
|
859
597
|
}
|
|
860
598
|
console.log('');
|
|
861
|
-
console.log(
|
|
599
|
+
console.log(mt.pausasDoModo((0, modos_1.pausasDoModo)(thread.modo)));
|
|
862
600
|
return 0;
|
|
863
601
|
}
|
|
864
|
-
console.error(
|
|
602
|
+
console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('thread', sub));
|
|
865
603
|
return 2;
|
|
866
604
|
}
|
|
867
605
|
/**
|
|
@@ -873,7 +611,7 @@ function comandoThread(args) {
|
|
|
873
611
|
* Toda edicao vira evento `setup_configured` no ledger do projeto.
|
|
874
612
|
*/
|
|
875
613
|
function comandoOnboarding(args) {
|
|
876
|
-
const invalido = () => { throw new Error(
|
|
614
|
+
const invalido = () => { throw new Error((0, locale_1.msg)().onboarding.usoInvalido); };
|
|
877
615
|
if (Object.keys(args.opcoes).some(k => !['conteudo', 'por', 'json', 'reset'].includes(k)))
|
|
878
616
|
invalido();
|
|
879
617
|
if ('json' in args.opcoes && args.opcoes.json !== true)
|
|
@@ -902,6 +640,7 @@ function comandoOnboarding(args) {
|
|
|
902
640
|
return 0;
|
|
903
641
|
}
|
|
904
642
|
let estado;
|
|
643
|
+
// RM-061 (F2a, D6): a recusa de uso sai no locale do comando; a gravacao roda em pt-BR (o dado nao muda).
|
|
905
644
|
if (sub === 'set') {
|
|
906
645
|
let conteudo;
|
|
907
646
|
try {
|
|
@@ -910,10 +649,13 @@ function comandoOnboarding(args) {
|
|
|
910
649
|
catch {
|
|
911
650
|
return invalido();
|
|
912
651
|
}
|
|
913
|
-
|
|
652
|
+
(0, onboarding_1.validarPedidoDeEtapa)(etapa, conteudo, por);
|
|
653
|
+
estado = (0, locale_1.comLocale)('pt-BR', () => (0, onboarding_1.gravarEtapa)(raiz, etapa, conteudo, por));
|
|
654
|
+
}
|
|
655
|
+
else if (sub === 'reset') {
|
|
656
|
+
(0, onboarding_1.validarPedidoDeEtapa)(etapa, undefined, por);
|
|
657
|
+
estado = (0, locale_1.comLocale)('pt-BR', () => (0, onboarding_1.resetarOnboarding)(raiz, etapa, por));
|
|
914
658
|
}
|
|
915
|
-
else if (sub === 'reset')
|
|
916
|
-
estado = (0, onboarding_1.resetarOnboarding)(raiz, etapa, por);
|
|
917
659
|
else
|
|
918
660
|
estado = (0, onboarding_1.lerOnboarding)(raiz);
|
|
919
661
|
console.log(args.opcoes.json === true ? JSON.stringify(estado, null, 2) : (0, onboarding_1.textoDaPauta)(estado, (0, manifest_1.exigirManifesto)(raiz).manifesto.owner));
|
|
@@ -935,14 +677,19 @@ function aspasDeShell(valor) {
|
|
|
935
677
|
function avisarChavesDePerfis(carregado) {
|
|
936
678
|
for (const a of carregado.avisos)
|
|
937
679
|
if (a.startsWith('runtime_profiles.'))
|
|
938
|
-
console.error(
|
|
680
|
+
console.error((0, locale_1.msg)().phase.aviso(a));
|
|
939
681
|
}
|
|
940
682
|
function comandoAccounts(args) {
|
|
941
683
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
942
684
|
avisarChavesDePerfis(carregado);
|
|
943
685
|
const raiz = carregado.raiz;
|
|
944
686
|
const sub = args.posicionais[1] ?? 'list';
|
|
945
|
-
|
|
687
|
+
// RM-061 (F3b, GO-FIX 1): a conferencia roda no escopo pt-BR (o detalhe vai ao store), e a impressao o traduz.
|
|
688
|
+
const conferir = (p) => (0, locale_1.comLocale)('pt-BR', () => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p));
|
|
689
|
+
const detalhe = (auth) => ma.detalheDoLogin((0, locale_1.remontar)(auth.detalhe));
|
|
690
|
+
// RM-061 (F3b, D3): o texto pelo catalogo; o que se grava (store de perfis, registro de contas) roda no escopo pt-BR,
|
|
691
|
+
// e o id, o runtime, o diretorio, o motivo tipado e o detalhe que o CLI do runtime devolve saem como vieram.
|
|
692
|
+
const ma = (0, locale_1.msg)().accounts;
|
|
946
693
|
const imprimir = () => {
|
|
947
694
|
const store = (0, runtime_profiles_1.lerPerfis)(raiz);
|
|
948
695
|
if (args.opcoes.json === true) {
|
|
@@ -951,8 +698,7 @@ function comandoAccounts(args) {
|
|
|
951
698
|
}
|
|
952
699
|
// I-49: a tabela mostra o que o despacho enxerga, com o que outra fabrica viu na mesma conta.
|
|
953
700
|
const visto = (0, runtime_profiles_1.lerPerfisComContas)(raiz);
|
|
954
|
-
console.log(visto.perfis.length === 0 ?
|
|
955
|
-
: (0, util_1.tabela)(runtime_profiles_1.COLUNAS_DE_PERFIS, (0, runtime_profiles_1.linhasDePerfis)(visto)));
|
|
701
|
+
console.log(visto.perfis.length === 0 ? ma.semPerfis : (0, util_1.tabela)([...ma.colunas], (0, runtime_profiles_1.linhasDePerfis)(visto)));
|
|
956
702
|
// I-35: a tabela mostra horario do dono; o fuso sai uma vez, no fim da mensagem.
|
|
957
703
|
if ((0, runtime_profiles_1.perfisComHorario)(store))
|
|
958
704
|
console.log((0, horario_1.legendaDoFuso)());
|
|
@@ -964,7 +710,7 @@ function comandoAccounts(args) {
|
|
|
964
710
|
if (sub === 'add') {
|
|
965
711
|
const id = args.posicionais[2], runtime = texto(args.opcoes.runtime), dirBruto = texto(args.opcoes.dir);
|
|
966
712
|
if (!id || !runtime || !dirBruto) {
|
|
967
|
-
console.error(
|
|
713
|
+
console.error(ma.usoAdd);
|
|
968
714
|
return 2;
|
|
969
715
|
}
|
|
970
716
|
const dir = path.resolve(dirBruto);
|
|
@@ -973,12 +719,12 @@ function comandoAccounts(args) {
|
|
|
973
719
|
// A7: diretorio inacessivel ou de outro usuario e recusado antes de qualquer gravacao no store.
|
|
974
720
|
(0, runtime_profiles_1.prepararDiretorioDoPerfil)(dir);
|
|
975
721
|
const desativado = (0, runtime_profiles_1.lerPerfis)(raiz).perfis.some(p => p.id === id && p.estado === 'desativado');
|
|
976
|
-
perfil = (0, runtime_profiles_1.adicionarPerfil)(raiz, { id, runtime, dir });
|
|
722
|
+
perfil = (0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.adicionarPerfil)(raiz, { id, runtime, dir }));
|
|
977
723
|
if (desativado)
|
|
978
|
-
console.log(
|
|
724
|
+
console.log(ma.reativado(id));
|
|
979
725
|
}
|
|
980
726
|
catch (e) {
|
|
981
|
-
console.error(
|
|
727
|
+
console.error(ma.recusado((0, locale_1.mensagemDoErro)(e)));
|
|
982
728
|
return 1;
|
|
983
729
|
}
|
|
984
730
|
const despacho = (0, runtime_profiles_1.perfilDeDespacho)(perfil);
|
|
@@ -991,59 +737,76 @@ function comandoAccounts(args) {
|
|
|
991
737
|
(0, node_child_process_1.spawnSync)(comando[0], comando.slice(1), { stdio: 'inherit', env });
|
|
992
738
|
}
|
|
993
739
|
else {
|
|
994
|
-
console.log(
|
|
740
|
+
console.log(ma.loginPendente(variavel, aspasDeShell(dir), comando.join(' '), id));
|
|
995
741
|
}
|
|
996
742
|
const auth = conferir(despacho);
|
|
997
743
|
// A14: conferencia inconclusiva nao marca sem-auth; o preflight do proximo despacho confere de novo.
|
|
998
744
|
if (!auth.ok && !auth.transitorio)
|
|
999
|
-
(0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, id, auth.pago
|
|
745
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, id, auth.pago
|
|
1000
746
|
? { estado: 'provider-pago', esgotadoAte: null, motivo: 'cost.violation', detalhe: auth.detalhe }
|
|
1001
|
-
: { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe });
|
|
1002
|
-
console.log(
|
|
1003
|
-
: auth.transitorio ?
|
|
1004
|
-
: auth.pago ?
|
|
747
|
+
: { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe }));
|
|
748
|
+
console.log(ma.resultadoAdd(id, perfil.runtime, dir, auth.ok ? ma.conferido
|
|
749
|
+
: auth.transitorio ? ma.inconclusivaAdd(detalhe(auth))
|
|
750
|
+
: auth.pago ? ma.pagoAdd(detalhe(auth)) : ma.semLoginAdd(detalhe(auth))));
|
|
1005
751
|
return 0;
|
|
1006
752
|
}
|
|
1007
753
|
if (sub === 'remove') {
|
|
1008
754
|
const id = args.posicionais[2];
|
|
1009
755
|
if (!id) {
|
|
1010
|
-
console.error(
|
|
756
|
+
console.error(ma.usoRemove);
|
|
1011
757
|
return 2;
|
|
1012
758
|
}
|
|
1013
759
|
try {
|
|
1014
|
-
(0, runtime_profiles_1.desativarPerfil)(raiz, id);
|
|
760
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.desativarPerfil)(raiz, id));
|
|
1015
761
|
}
|
|
1016
762
|
catch (e) {
|
|
1017
|
-
console.error(
|
|
763
|
+
console.error((0, locale_1.mensagemDoErro)(e));
|
|
1018
764
|
return 1;
|
|
1019
765
|
}
|
|
1020
|
-
console.log(
|
|
766
|
+
console.log(ma.desativado(id));
|
|
1021
767
|
return 0;
|
|
1022
768
|
}
|
|
1023
769
|
if (sub === 'check') {
|
|
1024
770
|
const alvo = args.posicionais[2];
|
|
771
|
+
const expirados = new Set((0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.expirarPerfisVencidos)(raiz)).map(p => p.id));
|
|
1025
772
|
const perfis = (0, runtime_profiles_1.lerPerfis)(raiz).perfis.filter(p => p.estado !== 'desativado' && (alvo === undefined || p.id === alvo));
|
|
1026
773
|
if (alvo !== undefined && perfis.length === 0) {
|
|
1027
|
-
console.error(
|
|
774
|
+
console.error(ma.perfilAtivoNaoExiste(alvo));
|
|
1028
775
|
return 1;
|
|
1029
776
|
}
|
|
777
|
+
const inventario = (0, sessoes_inventario_1.inventariarSessoes)(raiz, { global: true });
|
|
1030
778
|
let falhas = 0;
|
|
1031
779
|
for (const p of perfis) {
|
|
1032
780
|
const auth = conferir((0, runtime_profiles_1.perfilDeDespacho)(p));
|
|
1033
|
-
|
|
1034
|
-
(
|
|
781
|
+
(0, locale_1.comLocale)('pt-BR', () => {
|
|
782
|
+
if (auth.ok && (p.estado === 'sem-auth' || p.estado === 'provider-pago'))
|
|
783
|
+
(0, runtime_profiles_1.reativarPerfil)(raiz, p.id);
|
|
784
|
+
if (!auth.ok && auth.transitorio)
|
|
785
|
+
(0, runtime_profiles_1.registrarConferenciaInconclusiva)(raiz, p.id, auth.detalhe);
|
|
786
|
+
else if (!auth.ok) {
|
|
787
|
+
(0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, p.id, auth.pago
|
|
788
|
+
? { estado: 'provider-pago', esgotadoAte: null, motivo: 'cost.violation', detalhe: auth.detalhe }
|
|
789
|
+
: { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe });
|
|
790
|
+
}
|
|
791
|
+
});
|
|
1035
792
|
if (!auth.ok)
|
|
1036
793
|
falhas++;
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
794
|
+
const atual = (0, runtime_profiles_1.lerPerfis)(raiz).perfis.find(x => x.id === p.id) ?? p;
|
|
795
|
+
const sessoes = inventario.sessoes.filter(s => s.viva && s.runtime === p.runtime && s.perfil === p.id);
|
|
796
|
+
const cargas = [...new Set(sessoes.flatMap(s => s.vinculos.length
|
|
797
|
+
? s.vinculos.map(v => `${v.thread}:${v.fase}`) : [ma.sessaoSemVinculo(s.sessionId.slice(0, 8))]))];
|
|
798
|
+
const carga = !inventario.ok ? ma.cargaInconclusiva : cargas.length ? ma.cargaDaConta(cargas.join(', ')) : ma.cargaVazia;
|
|
799
|
+
const volta = atual.esgotadoAte ?? auth.cota?.resetEm ?? null;
|
|
800
|
+
const operacional = [
|
|
801
|
+
ma.limiteDaConta(ma.tipoDeLimite((0, runtime_profiles_1.tipoDeLimiteDoPerfil)(atual))),
|
|
802
|
+
ma.cotaDaConta(auth.cota ? ma.cotaMedida(auth.cota.usada, auth.cota.limite, auth.cota.unidade) : ma.cotaIndisponivel),
|
|
803
|
+
carga,
|
|
804
|
+
volta ? ma.voltaEm((0, horario_1.formatarDataHoraRotulada)(volta)) : ma.voltaSemMedida,
|
|
805
|
+
...(expirados.has(p.id) ? [ma.marcaExpirada] : []),
|
|
806
|
+
].join('; ');
|
|
807
|
+
console.log(`${ma.resultadoCheck(p.id, p.runtime, auth.ok ? ma.conferido
|
|
808
|
+
: auth.transitorio ? ma.inconclusivaCheck(detalhe(auth))
|
|
809
|
+
: auth.pago ? ma.pagoCheck(detalhe(auth)) : ma.semLoginCheck(detalhe(auth)))}; ${operacional}`);
|
|
1047
810
|
}
|
|
1048
811
|
console.log('');
|
|
1049
812
|
imprimir();
|
|
@@ -1056,13 +819,13 @@ function comandoAccounts(args) {
|
|
|
1056
819
|
relatorio = (0, esgotamentos_1.relatorioDeEsgotamentos)({ desde: texto(args.opcoes.desde) ?? '7d' });
|
|
1057
820
|
}
|
|
1058
821
|
catch (e) {
|
|
1059
|
-
console.error(
|
|
822
|
+
console.error(ma.periodoInvalido(e.message));
|
|
1060
823
|
return 2;
|
|
1061
824
|
}
|
|
1062
825
|
console.log(args.opcoes.json === true ? JSON.stringify(relatorio, null, 2) : (0, esgotamentos_1.textoDosEsgotamentos)(relatorio));
|
|
1063
826
|
return 0;
|
|
1064
827
|
}
|
|
1065
|
-
console.error(
|
|
828
|
+
console.error(ma.desconhecido(sub));
|
|
1066
829
|
return 2;
|
|
1067
830
|
}
|
|
1068
831
|
function comandoSetup(args) {
|
|
@@ -1070,6 +833,7 @@ function comandoSetup(args) {
|
|
|
1070
833
|
const raiz = carregado.raiz;
|
|
1071
834
|
const modoBruto = args.posicionais[1];
|
|
1072
835
|
const por = texto(args.opcoes.por) ?? 'owner';
|
|
836
|
+
const ms = (0, locale_1.msg)().setup.cli;
|
|
1073
837
|
if (modoBruto === 'versionar') {
|
|
1074
838
|
// I-52 (RM-047): o setup que vale agora vai para orkastery.setup.json, para entrar por PR.
|
|
1075
839
|
const r = (0, setup_1.versionarSetup)(raiz, por);
|
|
@@ -1077,8 +841,93 @@ function comandoSetup(args) {
|
|
|
1077
841
|
console.log(JSON.stringify({ caminho: r.caminho, setup: r.setup }, null, 2));
|
|
1078
842
|
return 0;
|
|
1079
843
|
}
|
|
1080
|
-
console.log(
|
|
1081
|
-
console.log(
|
|
844
|
+
console.log(ms.versionado(r.caminho));
|
|
845
|
+
console.log(ms.levePorPr);
|
|
846
|
+
return 0;
|
|
847
|
+
}
|
|
848
|
+
if (modoBruto === 'worktree') {
|
|
849
|
+
// RM-047 (P3): worktree.dir fora da raiz so cria checkout com a confirmacao desta maquina, fora do git.
|
|
850
|
+
const acao = args.posicionais[2];
|
|
851
|
+
const json = args.opcoes.json === true;
|
|
852
|
+
if (acao === 'confirmar') {
|
|
853
|
+
const local = (0, worktree_local_1.confirmarWorktreeLocal)(raiz, carregado.manifesto, por, args.posicionais[3]);
|
|
854
|
+
if (json) {
|
|
855
|
+
console.log(JSON.stringify(local, null, 2));
|
|
856
|
+
return 0;
|
|
857
|
+
}
|
|
858
|
+
console.log(ms.worktreeConfirmada(local.dir, local.raiz));
|
|
859
|
+
console.log(ms.worktreeGravada(worktree_local_1.ARQUIVO_WORKTREE_LOCAL));
|
|
860
|
+
return 0;
|
|
861
|
+
}
|
|
862
|
+
if (acao === 'revogar') {
|
|
863
|
+
const havia = (0, worktree_local_1.revogarWorktreeLocal)(raiz);
|
|
864
|
+
if (json) {
|
|
865
|
+
console.log(JSON.stringify({ revogada: havia }, null, 2));
|
|
866
|
+
return 0;
|
|
867
|
+
}
|
|
868
|
+
console.log(havia ? ms.worktreeRevogada : ms.worktreeNaoHavia);
|
|
869
|
+
return 0;
|
|
870
|
+
}
|
|
871
|
+
if (acao !== undefined) {
|
|
872
|
+
console.error(ms.worktreeSubcomando(acao));
|
|
873
|
+
return 2;
|
|
874
|
+
}
|
|
875
|
+
const pedida = (0, worktree_local_1.pastaDasWorktreesPedida)(raiz, carregado.manifesto);
|
|
876
|
+
const local = (0, worktree_local_1.lerWorktreeLocal)(raiz);
|
|
877
|
+
const recusa = (0, worktree_local_1.recusaDePastaDasWorktrees)(raiz, carregado.manifesto);
|
|
878
|
+
if (json) {
|
|
879
|
+
console.log(JSON.stringify({ manifesto: carregado.manifesto.worktree.dir, dir: pedida.dir, dentroDaRaiz: pedida.dentro,
|
|
880
|
+
confirmadaNestaMaquina: local.local?.dir ?? null, criacao: recusa === null ? 'permitida' : 'recusada' }, null, 2));
|
|
881
|
+
return 0;
|
|
882
|
+
}
|
|
883
|
+
console.log(ms.worktreeManifesto(carregado.manifesto.worktree.dir, pedida.dir, pedida.dentro));
|
|
884
|
+
console.log(ms.confirmacaoLocal(local.local ? local.local.dir : ms.nenhumaConfirmacao(String(local.motivo))));
|
|
885
|
+
console.log(recusa === null ? ms.criacaoPermitida : ms.criacaoRecusada(worktree_local_1.COMANDO_CONFIRMAR_WORKTREE));
|
|
886
|
+
return 0;
|
|
887
|
+
}
|
|
888
|
+
if (modoBruto === 'sandbox') {
|
|
889
|
+
// RM-047 (P1): a postura de sandbox que afrouxa so vale com a confirmacao desta maquina, fora do git.
|
|
890
|
+
const acao = args.posicionais[2];
|
|
891
|
+
const json = args.opcoes.json === true;
|
|
892
|
+
if (acao === 'confirmar') {
|
|
893
|
+
const postura = args.posicionais[3];
|
|
894
|
+
if (!postura) {
|
|
895
|
+
console.error(ms.sandboxUso);
|
|
896
|
+
return 2;
|
|
897
|
+
}
|
|
898
|
+
const p = (0, postura_local_1.confirmarPosturaLocal)(raiz, postura, por);
|
|
899
|
+
if (json) {
|
|
900
|
+
console.log(JSON.stringify(p, null, 2));
|
|
901
|
+
return 0;
|
|
902
|
+
}
|
|
903
|
+
console.log(ms.sandboxConfirmada(p.sandbox, p.raiz));
|
|
904
|
+
console.log(ms.sandboxGravada((0, postura_local_1.caminhoDaPosturaLocal)(raiz)));
|
|
905
|
+
return 0;
|
|
906
|
+
}
|
|
907
|
+
if (acao === 'revogar') {
|
|
908
|
+
const havia = (0, postura_local_1.revogarPosturaLocal)(raiz);
|
|
909
|
+
if (json) {
|
|
910
|
+
console.log(JSON.stringify({ revogada: havia }, null, 2));
|
|
911
|
+
return 0;
|
|
912
|
+
}
|
|
913
|
+
console.log(havia ? ms.sandboxRevogada : ms.sandboxNaoHavia);
|
|
914
|
+
return 0;
|
|
915
|
+
}
|
|
916
|
+
if (acao !== undefined) {
|
|
917
|
+
console.error(ms.sandboxSubcomando(acao));
|
|
918
|
+
return 2;
|
|
919
|
+
}
|
|
920
|
+
const pedida = carregado.manifesto.runtime.sandbox;
|
|
921
|
+
const local = (0, postura_local_1.lerPosturaLocal)(raiz);
|
|
922
|
+
const recusa = (0, postura_local_1.recusaDePostura)(raiz, carregado.manifesto, 'codex');
|
|
923
|
+
if (json) {
|
|
924
|
+
console.log(JSON.stringify({ manifesto: pedida, afrouxa: (0, postura_local_1.posturaAfrouxada)(carregado.manifesto) !== null,
|
|
925
|
+
confirmadaNestaMaquina: local.postura?.sandbox ?? null, despachoCodex: recusa === null ? 'permitido' : 'recusado' }, null, 2));
|
|
926
|
+
return 0;
|
|
927
|
+
}
|
|
928
|
+
console.log(ms.sandboxManifesto(pedida));
|
|
929
|
+
console.log(ms.confirmacaoLocal(local.postura ? local.postura.sandbox : ms.nenhumaConfirmacao(String(local.motivo))));
|
|
930
|
+
console.log(recusa === null ? ms.despachoPermitido : ms.despachoRecusado((0, postura_local_1.comandoDeConfirmacao)(pedida)));
|
|
1082
931
|
return 0;
|
|
1083
932
|
}
|
|
1084
933
|
if (!modoBruto) {
|
|
@@ -1088,7 +937,7 @@ function comandoSetup(args) {
|
|
|
1088
937
|
console.log(JSON.stringify((0, setup_1.lerSetup)(raiz), null, 2));
|
|
1089
938
|
return 0;
|
|
1090
939
|
}
|
|
1091
|
-
console.log(
|
|
940
|
+
console.log(ms.resetado);
|
|
1092
941
|
console.log((0, setup_1.textoDaEntrevista)(raiz));
|
|
1093
942
|
return 0;
|
|
1094
943
|
}
|
|
@@ -1097,7 +946,7 @@ function comandoSetup(args) {
|
|
|
1097
946
|
}
|
|
1098
947
|
const modo = (0, modos_1.parseModo)(modoBruto);
|
|
1099
948
|
if (!modo) {
|
|
1100
|
-
console.error(
|
|
949
|
+
console.error(ms.modoDesconhecido(modoBruto, modos_1.ORDEM_DOS_MODOS.join(', ')));
|
|
1101
950
|
return 2;
|
|
1102
951
|
}
|
|
1103
952
|
if (args.opcoes.reset === true) {
|
|
@@ -1106,7 +955,7 @@ function comandoSetup(args) {
|
|
|
1106
955
|
console.log(JSON.stringify((0, setup_1.lerSetup)(raiz).modos[modo], null, 2));
|
|
1107
956
|
return 0;
|
|
1108
957
|
}
|
|
1109
|
-
console.log(
|
|
958
|
+
console.log(ms.modoResetado(modos_1.MODOS[modo].tag));
|
|
1110
959
|
console.log('');
|
|
1111
960
|
console.log((0, setup_1.textoDoSetup)(raiz, modo));
|
|
1112
961
|
return 0;
|
|
@@ -1119,26 +968,25 @@ function comandoSetup(args) {
|
|
|
1119
968
|
const fallbackBruto = args.opcoes.fallback === true ? '' : texto(args.opcoes.fallback);
|
|
1120
969
|
const fallback = fallbackBruto === undefined ? undefined : fallbackBruto.split(',').map(s => s.trim()).filter(s => s !== '');
|
|
1121
970
|
if (bloco === undefined && (runtime !== undefined || model !== undefined || effort !== undefined || fallback !== undefined)) {
|
|
1122
|
-
console.error(
|
|
971
|
+
console.error(ms.informeBloco);
|
|
1123
972
|
return 2;
|
|
1124
973
|
}
|
|
1125
974
|
if (bloco !== undefined) {
|
|
1126
975
|
if (runtime === undefined && model === undefined && effort === undefined && fallback === undefined) {
|
|
1127
|
-
console.error(
|
|
976
|
+
console.error(ms.nadaParaEditar);
|
|
1128
977
|
return 2;
|
|
1129
978
|
}
|
|
1130
979
|
const r = (0, setup_1.editarBloco)(raiz, modo, Number(bloco), { runtime, model, effort, ...(fallback !== undefined ? { fallback } : {}) }, por);
|
|
1131
980
|
if (!r.ok) {
|
|
1132
|
-
console.error(
|
|
981
|
+
console.error(ms.edicaoRecusada(r.erro ?? ''));
|
|
1133
982
|
return 1;
|
|
1134
983
|
}
|
|
1135
984
|
if (args.opcoes.json === true) {
|
|
1136
985
|
console.log(JSON.stringify(r.setup.modos[modo], null, 2));
|
|
1137
986
|
return 0;
|
|
1138
987
|
}
|
|
1139
|
-
console.log(
|
|
1140
|
-
|
|
1141
|
-
console.log(` gravado em ${r.caminho}; evento setup_configured no ledger do projeto`);
|
|
988
|
+
console.log(ms.blocoAlterado(r.bloco, modos_1.MODOS[modo].tag, `${r.de?.runtime}/${r.de?.model}/${r.de?.effort}`, `${r.para?.runtime}/${r.para?.model}/${r.para?.effort}`));
|
|
989
|
+
console.log(ms.gravado(r.caminho));
|
|
1142
990
|
console.log('');
|
|
1143
991
|
console.log((0, setup_1.textoDoSetup)(raiz, modo));
|
|
1144
992
|
return 0;
|
|
@@ -1149,19 +997,21 @@ function comandoSetup(args) {
|
|
|
1149
997
|
function comandoPhase(args) {
|
|
1150
998
|
const sub = args.posicionais[1];
|
|
1151
999
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1000
|
+
const m = (0, locale_1.msg)().phase;
|
|
1152
1001
|
if (sub === 'run') {
|
|
1153
1002
|
avisarChavesDePerfis(carregado);
|
|
1154
1003
|
const id = args.posicionais[2];
|
|
1155
1004
|
const faseBruta = args.posicionais[3];
|
|
1156
1005
|
const prompt = texto(args.opcoes.prompt);
|
|
1157
1006
|
if (!id || !faseBruta || !prompt) {
|
|
1158
|
-
console.error(
|
|
1007
|
+
console.error(m.usoRun);
|
|
1159
1008
|
return 2;
|
|
1160
1009
|
}
|
|
1161
1010
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
1162
1011
|
const fase = (0, thread_1.exigirFase)(thread, faseBruta);
|
|
1163
1012
|
const conducao = conducaoDoCli(args);
|
|
1164
|
-
|
|
1013
|
+
// RM-061 (F2a, D6): o despacho grava prompt, ledger, lease e pedidos em pt-BR; so a impressao segue o locale.
|
|
1014
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, phase_1.rodarFase)(carregado, id, {
|
|
1165
1015
|
fase,
|
|
1166
1016
|
prompt,
|
|
1167
1017
|
runtime: texto(args.opcoes.runtime),
|
|
@@ -1172,7 +1022,9 @@ function comandoPhase(args) {
|
|
|
1172
1022
|
canal: conducao.canal,
|
|
1173
1023
|
...(conducao.correlacao ? { correlacao: conducao.correlacao } : {}),
|
|
1174
1024
|
...(conducao.esperarMs ? { esperarMs: conducao.esperarMs } : {}),
|
|
1175
|
-
|
|
1025
|
+
// A baseline que o despacho grava espera a fila pesada com aviso; a recusa sugere gravá-la antes, com mais espera.
|
|
1026
|
+
filaPesada: filaPesadaDoCli(args, 'baseline', `ork verify ${id} --baseline --esperar 120`),
|
|
1027
|
+
}));
|
|
1176
1028
|
// I-36 (T12, T14): pedido repetido e segundo pedido tem resposta propria, antes dos outros gates.
|
|
1177
1029
|
if (r.idempotente && r.conducao) {
|
|
1178
1030
|
console.log((0, conducao_1.textoDoPedidoRepetido)(id, r.conducao));
|
|
@@ -1188,14 +1040,13 @@ function comandoPhase(args) {
|
|
|
1188
1040
|
console.log(JSON.stringify({ motivo: r.motivo, ...r.vaga }, null, 2));
|
|
1189
1041
|
return 3;
|
|
1190
1042
|
}
|
|
1191
|
-
console.log(
|
|
1192
|
-
`em outras threads e o limite e ${r.vaga.limite} (concurrency.max_parallel_threads).`);
|
|
1043
|
+
console.log(m.vagaRecusada(r.vaga.ocupam.length, r.vaga.limite));
|
|
1193
1044
|
for (const o of r.vaga.ocupam) {
|
|
1194
1045
|
console.log(` ${o.thread.padEnd(20)} ${(o.fase ?? '-').padEnd(6)} ` +
|
|
1195
|
-
`${o.sessao ? `${o.runtime} ${o.sessao.slice(0, 8)}` :
|
|
1046
|
+
`${o.sessao ? `${o.runtime} ${o.sessao.slice(0, 8)}` : m.despachoEmCurso}, ${m.desde((0, horario_1.localizarTextoRotulado)(o.desde))}`);
|
|
1196
1047
|
}
|
|
1197
|
-
console.log(
|
|
1198
|
-
console.log(r.dryRun ?
|
|
1048
|
+
console.log(m.correcao(r.vaga.correcao));
|
|
1049
|
+
console.log(r.dryRun ? m.vagaEnsaio : m.vagaLedger(id));
|
|
1199
1050
|
return 3;
|
|
1200
1051
|
}
|
|
1201
1052
|
// RM-037 (S-4 do CHECK 3): a baseline que o despacho nao conseguiu gravar nao e gate reprovado.
|
|
@@ -1204,78 +1055,81 @@ function comandoPhase(args) {
|
|
|
1204
1055
|
console.log(JSON.stringify({ motivo: r.motivo, detalhe: r.erro }, null, 2));
|
|
1205
1056
|
return 1;
|
|
1206
1057
|
}
|
|
1207
|
-
console.error(
|
|
1208
|
-
console.error(
|
|
1058
|
+
console.error(m.recusado(`${r.erro}`));
|
|
1059
|
+
console.error(m.baselinePendente);
|
|
1209
1060
|
return 1;
|
|
1210
1061
|
}
|
|
1062
|
+
// RM-061 (F2a): o resumo do despacho sai pelo catalogo; o rotulo tem largura 14, como antes.
|
|
1063
|
+
const campo = (rotulo, valor) => ` ${rotulo.padEnd(14)} : ${valor}`, rt = m.rotulos;
|
|
1211
1064
|
if (r.dryRun && !r.bloqueado) {
|
|
1212
|
-
console.log(
|
|
1213
|
-
console.log(
|
|
1214
|
-
console.log(
|
|
1215
|
-
console.log(
|
|
1216
|
-
console.log(
|
|
1217
|
-
console.log(
|
|
1218
|
-
console.log(
|
|
1065
|
+
console.log(m.simulacao);
|
|
1066
|
+
console.log(campo(rt.slug, r.slug));
|
|
1067
|
+
console.log(campo(rt.prompt, `${r.promptPath}`));
|
|
1068
|
+
console.log(campo(rt.sha256, `${r.promptSha256}`));
|
|
1069
|
+
console.log(campo(rt.pausaAoFim, m.simNao(!!r.pausaAoFim)));
|
|
1070
|
+
console.log(campo(rt.runtime, `${r.runtime}`));
|
|
1071
|
+
console.log(campo(rt.modelo, `${r.model}/${r.effort}`));
|
|
1219
1072
|
// O prompt inteiro nao cabe na tela: o argumento longo aparece mascarado.
|
|
1220
|
-
console.log(
|
|
1073
|
+
console.log(campo(rt.comando, r.comando.map((c) => (c.length > 80 ? '"<prompt>"' : c)).join(' ')));
|
|
1221
1074
|
for (const l of (0, policies_1.linhasDeAviso)(r.violacoes ?? []))
|
|
1222
1075
|
console.log(l);
|
|
1223
1076
|
return 0;
|
|
1224
1077
|
}
|
|
1225
1078
|
if (r.bloqueado) {
|
|
1226
|
-
console.error(
|
|
1079
|
+
console.error(m.bloqueado(`${r.motivo}`));
|
|
1227
1080
|
for (const v of r.violacoes) {
|
|
1228
1081
|
console.error(` [${v.severidade}] policy ${v.policy}: ${v.detalhe}`);
|
|
1229
|
-
console.error(
|
|
1082
|
+
console.error(m.violacaoCorrecao(v.correcao));
|
|
1230
1083
|
}
|
|
1231
|
-
console.error(
|
|
1084
|
+
console.error(m.promptNaoGravado(id));
|
|
1232
1085
|
return 1;
|
|
1233
1086
|
}
|
|
1234
1087
|
if (!r.sessionId) {
|
|
1235
1088
|
// I-35: o erro vai ao ledger com o ISO; o dono le no fuso dele, com o fuso dito uma vez.
|
|
1236
|
-
console.error(
|
|
1237
|
-
console.error(
|
|
1089
|
+
console.error(m.falhou(`${r.erro ? (0, horario_1.localizarTextoRotulado)(r.erro) : r.erro}`));
|
|
1090
|
+
console.error(m.falhouLedger(id));
|
|
1238
1091
|
return 1;
|
|
1239
1092
|
}
|
|
1240
|
-
console.log(
|
|
1093
|
+
console.log(m.despachada(fase));
|
|
1241
1094
|
for (const l of (0, policies_1.linhasDeAviso)(r.violacoes ?? []))
|
|
1242
1095
|
console.log(l);
|
|
1243
|
-
console.log(
|
|
1244
|
-
console.log(
|
|
1245
|
-
console.log(
|
|
1246
|
-
console.log(
|
|
1247
|
-
console.log(
|
|
1248
|
-
console.log(
|
|
1249
|
-
console.log(
|
|
1250
|
-
console.log(
|
|
1096
|
+
console.log(campo(rt.sessionId, r.sessionId));
|
|
1097
|
+
console.log(campo(rt.slug, `${r.slug} (${(0, phase_1.descreverSlug)(r.slug)})`));
|
|
1098
|
+
console.log(campo(rt.prompt, `${r.promptPath}`));
|
|
1099
|
+
console.log(campo(rt.sha256, `${r.promptSha256}`));
|
|
1100
|
+
console.log(campo(rt.runtime, `${r.runtime}`));
|
|
1101
|
+
console.log(campo(rt.modelo, m.modeloGravado(`${r.model}`, `${r.effort}`)));
|
|
1102
|
+
console.log(m.verificada(!!r.verificada));
|
|
1103
|
+
console.log(m.pausaNoFim(!!r.pausaAoFim));
|
|
1251
1104
|
console.log('');
|
|
1252
1105
|
if (r.runtime === 'claude-bg') {
|
|
1253
|
-
console.log(
|
|
1106
|
+
console.log(m.acompanheClaude(r.sessionId, id));
|
|
1254
1107
|
}
|
|
1255
1108
|
else {
|
|
1256
|
-
console.log(
|
|
1109
|
+
console.log(m.acompanhe(id));
|
|
1257
1110
|
}
|
|
1258
1111
|
return r.verificada ? 0 : 1;
|
|
1259
1112
|
}
|
|
1260
1113
|
if (sub === 'list') {
|
|
1261
1114
|
const id = args.posicionais[2];
|
|
1262
1115
|
if (!id) {
|
|
1263
|
-
console.error(
|
|
1116
|
+
console.error(m.usoList);
|
|
1264
1117
|
return 2;
|
|
1265
1118
|
}
|
|
1266
1119
|
console.log((0, phase_1.tabelaDoLedger)(carregado.raiz, id));
|
|
1267
1120
|
return 0;
|
|
1268
1121
|
}
|
|
1269
|
-
console.error(
|
|
1122
|
+
console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('phase', sub));
|
|
1270
1123
|
return 2;
|
|
1271
1124
|
}
|
|
1272
1125
|
function comandoLedger(args) {
|
|
1273
1126
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1274
1127
|
const sub = args.posicionais[1];
|
|
1128
|
+
const m = (0, locale_1.msg)().operacao.ledger;
|
|
1275
1129
|
if (sub === 'stats') {
|
|
1276
1130
|
const desde = texto(args.opcoes.desde);
|
|
1277
1131
|
if (!desde)
|
|
1278
|
-
throw Error(
|
|
1132
|
+
throw Error(m.usoStats);
|
|
1279
1133
|
const r = (0, ledger_stats_1.coletarEstatisticas)(carregado.raiz, { desde, ate: texto(args.opcoes.ate), thread: texto(args.opcoes.thread), modo: texto(args.opcoes.modo), runtime: texto(args.opcoes.runtime) });
|
|
1280
1134
|
console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, ledger_stats_1.textoDasEstatisticas)(r));
|
|
1281
1135
|
return 0;
|
|
@@ -1284,12 +1138,12 @@ function comandoLedger(args) {
|
|
|
1284
1138
|
const thread = args.posicionais[2], semIa = Number(texto(args.opcoes['sem-ia'])), iaSemOrk = Number(texto(args.opcoes['ia-sem-ork']));
|
|
1285
1139
|
const por = texto(args.opcoes.por), metodo = texto(args.opcoes.metodo), premissas = texto(args.opcoes.premissas);
|
|
1286
1140
|
if (!thread || !por || !metodo || !premissas)
|
|
1287
|
-
throw Error(
|
|
1141
|
+
throw Error(m.usoEstimate);
|
|
1288
1142
|
const e = (0, ledger_stats_1.registrarEstimativaPlano)(carregado.raiz, thread, { semIaHoras: semIa, iaSemOrkHoras: iaSemOrk, por, metodo, premissas, incerteza: texto(args.opcoes.incerteza) });
|
|
1289
|
-
console.log(args.opcoes.json === true ? JSON.stringify(e, null, 2) :
|
|
1143
|
+
console.log(args.opcoes.json === true ? JSON.stringify(e, null, 2) : m.estimativa(thread, semIa, iaSemOrk));
|
|
1290
1144
|
return 0;
|
|
1291
1145
|
}
|
|
1292
|
-
throw Error(
|
|
1146
|
+
throw Error(m.uso);
|
|
1293
1147
|
}
|
|
1294
1148
|
/**
|
|
1295
1149
|
* `ork sessions hitl`: quem, entre as sessoes do runtime, espera o humano AGORA.
|
|
@@ -1303,10 +1157,11 @@ function comandoLedger(args) {
|
|
|
1303
1157
|
* como falha acionavel, sem precisar interpretar texto.
|
|
1304
1158
|
*/
|
|
1305
1159
|
function comandoSessionsHitl(args, raiz) {
|
|
1160
|
+
const ms = (0, locale_1.msg)().operacao.restante.sessions;
|
|
1306
1161
|
const bruto = texto(args.opcoes.atencao);
|
|
1307
1162
|
const atencaoMin = bruto === undefined ? undefined : Number(bruto);
|
|
1308
1163
|
if (atencaoMin !== undefined && (!Number.isFinite(atencaoMin) || atencaoMin < 0)) {
|
|
1309
|
-
console.error(
|
|
1164
|
+
console.error(ms.atencao(bruto ?? ''));
|
|
1310
1165
|
return 2;
|
|
1311
1166
|
}
|
|
1312
1167
|
const radar = (0, hitl_1.varrerSessoes)({
|
|
@@ -1328,26 +1183,27 @@ function comandoSessionsHitl(args, raiz) {
|
|
|
1328
1183
|
return 0;
|
|
1329
1184
|
}
|
|
1330
1185
|
function comandoSessions(args) {
|
|
1186
|
+
const ms = (0, locale_1.msg)().operacao.restante.sessions;
|
|
1331
1187
|
const sub = args.posicionais[1];
|
|
1332
1188
|
const carregado = (0, manifest_1.carregarManifesto)();
|
|
1333
1189
|
const raiz = carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)();
|
|
1334
1190
|
if (sub === 'watch') {
|
|
1335
1191
|
const id = texto(args.opcoes.thread);
|
|
1336
1192
|
if (!carregado || !id) {
|
|
1337
|
-
console.error(
|
|
1193
|
+
console.error(ms.usoWatch);
|
|
1338
1194
|
return 2;
|
|
1339
1195
|
}
|
|
1340
1196
|
const thread = (0, thread_1.lerThread)(raiz, id);
|
|
1341
1197
|
const sessionId = texto(args.opcoes.sessao) ?? thread.sessoes.at(-1)?.sessionId;
|
|
1342
1198
|
if (!sessionId || !thread.sessoes.some(s => s.sessionId === sessionId))
|
|
1343
|
-
throw new Error(
|
|
1199
|
+
throw new Error(ms.sessaoDaThread);
|
|
1344
1200
|
console.log(JSON.stringify(args.opcoes.once === true ? (0, session_watcher_1.observarSessao)(carregado, sessionId) : { pid: (0, session_watcher_1.iniciarWatcher)(raiz, sessionId) }));
|
|
1345
1201
|
return 0;
|
|
1346
1202
|
}
|
|
1347
1203
|
if (sub === 'event') {
|
|
1348
1204
|
const tipo = texto(args.opcoes.tipo), sessao = texto(args.opcoes.sessao);
|
|
1349
1205
|
if (!carregado || !tipo || !sessao) {
|
|
1350
|
-
console.error(
|
|
1206
|
+
console.error(ms.usoEvent);
|
|
1351
1207
|
return 2;
|
|
1352
1208
|
}
|
|
1353
1209
|
try {
|
|
@@ -1355,7 +1211,7 @@ function comandoSessions(args) {
|
|
|
1355
1211
|
return 0;
|
|
1356
1212
|
}
|
|
1357
1213
|
catch (e) {
|
|
1358
|
-
console.error(
|
|
1214
|
+
console.error(ms.eventoRecusado(e.message));
|
|
1359
1215
|
return 1;
|
|
1360
1216
|
}
|
|
1361
1217
|
}
|
|
@@ -1366,7 +1222,7 @@ function comandoSessions(args) {
|
|
|
1366
1222
|
}
|
|
1367
1223
|
if (sub === 'limpar-fantasmas') {
|
|
1368
1224
|
if (!carregado) {
|
|
1369
|
-
console.error(
|
|
1225
|
+
console.error(ms.exigeProjeto);
|
|
1370
1226
|
return 2;
|
|
1371
1227
|
}
|
|
1372
1228
|
const r = (0, sessoes_2.limparFantasmas)(raiz, { dryRun: args.opcoes['dry-run'] === true });
|
|
@@ -1380,14 +1236,14 @@ function comandoSessions(args) {
|
|
|
1380
1236
|
const id = args.posicionais[2], sessionId = args.posicionais[3];
|
|
1381
1237
|
const fase = texto(args.opcoes.fase), runtime = texto(args.opcoes.runtime), pergunta = texto(args.opcoes.pergunta);
|
|
1382
1238
|
if (!id || !sessionId || !fase || !types_1.FASES.includes(fase) || !runtime)
|
|
1383
|
-
throw new Error(
|
|
1239
|
+
throw new Error(ms.request);
|
|
1384
1240
|
console.log(JSON.stringify((0, hitl_sessions_1.abrirPedidoSessao)(raiz, id, sessionId, { fase: fase, runtime, pergunta, prazo: texto(args.opcoes.prazo) })));
|
|
1385
1241
|
return 0;
|
|
1386
1242
|
}
|
|
1387
1243
|
if (sub === 'answer') {
|
|
1388
1244
|
const id = args.posicionais[2], pedido = args.posicionais[3];
|
|
1389
1245
|
if (!id || !pedido || args.opcoes.stdin !== true)
|
|
1390
|
-
throw new Error(
|
|
1246
|
+
throw new Error(ms.answer);
|
|
1391
1247
|
const r = (0, hitl_gates_1.lerRespostaStdin)({ origem: texto(args.opcoes.origem), por: texto(args.opcoes.por),
|
|
1392
1248
|
mensagem: texto(args.opcoes.mensagem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
|
|
1393
1249
|
console.log(JSON.stringify((0, hitl_sessions_1.responderSessao)(raiz, id, pedido, r)));
|
|
@@ -1398,7 +1254,7 @@ function comandoSessions(args) {
|
|
|
1398
1254
|
// pergunta ao receptor, pelo recibo correlacionado, se ele recebeu aquele envioId.
|
|
1399
1255
|
const id = args.posicionais[2], pedido = args.posicionais[3];
|
|
1400
1256
|
if (!id || !pedido)
|
|
1401
|
-
throw new Error(
|
|
1257
|
+
throw new Error(ms.reconcile);
|
|
1402
1258
|
const r = (0, hitl_sessions_1.reconciliarEnvioDeSessao)(raiz, id, pedido);
|
|
1403
1259
|
console.log(JSON.stringify(r));
|
|
1404
1260
|
return r.estado === 'entregue' ? 0 : 1;
|
|
@@ -1407,13 +1263,13 @@ function comandoSessions(args) {
|
|
|
1407
1263
|
const id = args.posicionais[2], sessionId = args.posicionais[3];
|
|
1408
1264
|
const fase = texto(args.opcoes.fase), runtime = texto(args.opcoes.runtime);
|
|
1409
1265
|
if (!id || !sessionId || !fase || !types_1.FASES.includes(fase) || !runtime)
|
|
1410
|
-
throw new Error(
|
|
1266
|
+
throw new Error(ms.supersede);
|
|
1411
1267
|
console.log(JSON.stringify((0, hitl_sessions_1.superarSessao)(raiz, id, sessionId, fase, runtime)));
|
|
1412
1268
|
return 0;
|
|
1413
1269
|
}
|
|
1414
1270
|
const chave = args.posicionais[2];
|
|
1415
1271
|
if (!chave) {
|
|
1416
|
-
console.error(
|
|
1272
|
+
console.error(ms.usoSub(sub));
|
|
1417
1273
|
return 2;
|
|
1418
1274
|
}
|
|
1419
1275
|
if (sub === 'adopt') {
|
|
@@ -1438,7 +1294,7 @@ function comandoSessions(args) {
|
|
|
1438
1294
|
console.log(r.texto);
|
|
1439
1295
|
return r.codigo;
|
|
1440
1296
|
}
|
|
1441
|
-
console.error(
|
|
1297
|
+
console.error(ms.desconhecido(sub));
|
|
1442
1298
|
return 2;
|
|
1443
1299
|
}
|
|
1444
1300
|
/**
|
|
@@ -1453,15 +1309,15 @@ function comandoDecisao(args) {
|
|
|
1453
1309
|
const campo = (nome) => {
|
|
1454
1310
|
const v = texto(args.opcoes[nome]);
|
|
1455
1311
|
if (!v)
|
|
1456
|
-
throw new
|
|
1312
|
+
throw new locale_1.ErroDoCatalogo((m) => m.decisao.exigeFlag(nome));
|
|
1457
1313
|
return v;
|
|
1458
1314
|
};
|
|
1459
1315
|
if (!id)
|
|
1460
|
-
throw new
|
|
1316
|
+
throw new locale_1.ErroDoCatalogo((m) => m.decisao.usoRegistrar);
|
|
1461
1317
|
const bruto = campo('criterio'), separador = bruto.indexOf(':');
|
|
1462
1318
|
const tipo = bruto.slice(0, separador), referencia = bruto.slice(separador + 1);
|
|
1463
1319
|
if (separador < 1 || !['manifesto', 'ledger', 'medicao'].includes(tipo) || !referencia.trim()) {
|
|
1464
|
-
throw new
|
|
1320
|
+
throw new locale_1.ErroDoCatalogo((m) => m.decisao.criterioUso);
|
|
1465
1321
|
}
|
|
1466
1322
|
const entrada = {
|
|
1467
1323
|
decidido: campo('decidido'), porque: campo('porque'), comoMudar: campo('como-mudar'),
|
|
@@ -1483,8 +1339,10 @@ function comandoDecisao(args) {
|
|
|
1483
1339
|
return 0;
|
|
1484
1340
|
}
|
|
1485
1341
|
if (sub === 'placar') {
|
|
1342
|
+
// RM-061 (F3b): o placar pelo catalogo; o `--json` e a fase de cada linha sao dado e nao mudam.
|
|
1343
|
+
const md = (0, locale_1.msg)().decisao;
|
|
1486
1344
|
if (!id)
|
|
1487
|
-
throw new
|
|
1345
|
+
throw new locale_1.ErroDoCatalogo((m) => m.decisao.usoPlacar);
|
|
1488
1346
|
(0, thread_1.lerThread)(carregado.raiz, id);
|
|
1489
1347
|
const placar = (0, decisao_autonoma_1.placarDaThread)((0, ledger_1.lerLedger)((0, thread_1.dirThread)(carregado.raiz, id)));
|
|
1490
1348
|
const taxa = (0, decisao_autonoma_1.taxaDeReversao)(placar);
|
|
@@ -1492,12 +1350,12 @@ function comandoDecisao(args) {
|
|
|
1492
1350
|
console.log(JSON.stringify({ thread: id, limiar: decisao_autonoma_1.LIMIAR_DE_DECISOES_POR_FASE, taxaDeReversao: taxa, fases: placar }, null, 2));
|
|
1493
1351
|
return 0;
|
|
1494
1352
|
}
|
|
1495
|
-
console.log((0, util_1.tabela)([
|
|
1496
|
-
String(f.semRastro), f.acimaDoLimiar ?
|
|
1497
|
-
console.log(
|
|
1353
|
+
console.log((0, util_1.tabela)([...md.colunasDoPlacar], placar.map(f => [f.fase, String(f.decididas), String(f.informadas), String(f.perguntas), String(f.revertidas),
|
|
1354
|
+
String(f.semRastro), f.acimaDoLimiar ? md.acimaDoLimiar(decisao_autonoma_1.LIMIAR_DE_DECISOES_POR_FASE) : md.dentroDoLimiar])));
|
|
1355
|
+
console.log(md.taxaDeReversao(taxa));
|
|
1498
1356
|
return 0;
|
|
1499
1357
|
}
|
|
1500
|
-
throw new
|
|
1358
|
+
throw new locale_1.ErroDoCatalogo((m) => m.decisao.uso);
|
|
1501
1359
|
}
|
|
1502
1360
|
/**
|
|
1503
1361
|
* I-50 (RM-039): a tag que o dono manda no Telegram, pelo terminal. Sem tag, mostra a cadencia em
|
|
@@ -1505,14 +1363,15 @@ function comandoDecisao(args) {
|
|
|
1505
1363
|
*/
|
|
1506
1364
|
function comandoCadenciaDoPulse(args) {
|
|
1507
1365
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1366
|
+
const m = (0, locale_1.msg)().operacao.pulseCadencia;
|
|
1508
1367
|
if (args.posicionais.length > 3)
|
|
1509
|
-
throw new Error(
|
|
1368
|
+
throw new Error(m.umaTag);
|
|
1510
1369
|
const bruta = args.posicionais[2];
|
|
1511
1370
|
const agora = new Date().toISOString();
|
|
1512
1371
|
if (bruta !== undefined) {
|
|
1513
1372
|
const lido = (0, pulse_resposta_1.interpretarRespostaDoPulse)(bruta.trim().startsWith('#') ? bruta : `#${bruta.trim()}`);
|
|
1514
1373
|
if (lido.forma !== 'cadencia') {
|
|
1515
|
-
throw new Error(
|
|
1374
|
+
throw new Error(m.desconhecida(bruta, Object.keys(pulse_cadencia_1.CADENCIAS).join(', ')));
|
|
1516
1375
|
}
|
|
1517
1376
|
(0, pulse_cadencia_1.gravarCadencia)(carregado.raiz, lido.tag, { por: texto(args.opcoes.por) ?? (0, node_os_1.userInfo)().username,
|
|
1518
1377
|
canal: texto(args.opcoes.canal) ?? 'terminal', em: agora });
|
|
@@ -1525,39 +1384,42 @@ function comandoCadenciaDoPulse(args) {
|
|
|
1525
1384
|
}
|
|
1526
1385
|
console.log((0, pulse_cadencia_1.textoDaCadencia)(vigente, agora));
|
|
1527
1386
|
console.log(vigente.gravada
|
|
1528
|
-
?
|
|
1529
|
-
:
|
|
1387
|
+
? m.trocada(vigente.gravada.por, vigente.gravada.canal, (0, horario_1.formatarDataHoraRotulada)(vigente.gravada.em))
|
|
1388
|
+
: m.padrao);
|
|
1530
1389
|
return 0;
|
|
1531
1390
|
}
|
|
1532
1391
|
function comandoClaims(args) {
|
|
1533
1392
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1534
1393
|
const sub = args.posicionais[1];
|
|
1394
|
+
// RM-061 (F3b, D3): o texto pelo catalogo; o que se grava (claims.jsonl, ledger) roda no escopo pt-BR, e a alegacao,
|
|
1395
|
+
// o arquivo, o comando e o motivo digitado saem como vieram. O estado da claim so se traduz na impressao.
|
|
1396
|
+
const mc = (0, locale_1.msg)().claims;
|
|
1535
1397
|
if (sub === 'add') {
|
|
1536
1398
|
const id = args.posicionais[2];
|
|
1537
1399
|
const arquivo = args.posicionais[3];
|
|
1538
1400
|
const alegacao = texto(args.opcoes.claim) ?? texto(args.opcoes.alegacao);
|
|
1539
1401
|
if (!id || !arquivo || !alegacao) {
|
|
1540
|
-
console.error(
|
|
1402
|
+
console.error(mc.usoAdd);
|
|
1541
1403
|
return 2;
|
|
1542
1404
|
}
|
|
1543
1405
|
const comando = texto(args.opcoes.verificar) ?? texto(args.opcoes.verify);
|
|
1544
1406
|
const faseBruta = texto(args.opcoes.fase);
|
|
1545
1407
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
1546
|
-
const claim = (0, claims_1.adicionarClaim)(carregado.raiz, id, {
|
|
1408
|
+
const claim = (0, locale_1.comLocale)('pt-BR', () => (0, claims_1.adicionarClaim)(carregado.raiz, id, {
|
|
1547
1409
|
arquivo,
|
|
1548
1410
|
alegacao,
|
|
1549
1411
|
verificar: comando ? [comando] : [],
|
|
1550
1412
|
fase: faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined,
|
|
1551
|
-
});
|
|
1552
|
-
console.log(
|
|
1553
|
-
console.log(
|
|
1554
|
-
console.log(
|
|
1555
|
-
console.log(
|
|
1556
|
-
console.log(
|
|
1557
|
-
console.log(
|
|
1413
|
+
}));
|
|
1414
|
+
console.log(mc.registrada(claim.id, id));
|
|
1415
|
+
console.log(mc.campoArquivo(claim.arquivo));
|
|
1416
|
+
console.log(mc.campoAlegacao(claim.alegacao));
|
|
1417
|
+
console.log(mc.campoNegativa(claim.negativa));
|
|
1418
|
+
console.log(mc.campoVerificar(claim.verificar.join(' && ')));
|
|
1419
|
+
console.log(mc.campoEstado(mc.estado(claim.estado)));
|
|
1558
1420
|
if (claim.negativa && claim.verificar.length === 0) {
|
|
1559
1421
|
console.log('');
|
|
1560
|
-
console.log(
|
|
1422
|
+
console.log(mc.avisoNegativa);
|
|
1561
1423
|
}
|
|
1562
1424
|
// RM-008 (B8): a conferencia local da policy claim_sem_prova_local avisa e segue.
|
|
1563
1425
|
const linhasDePolicy = (0, policies_1.linhasDeAviso)(claim.avisosDePolicy ?? []);
|
|
@@ -1569,24 +1431,59 @@ function comandoClaims(args) {
|
|
|
1569
1431
|
// I-53 (RM-037, P6): o lint avisa aqui; a suite inteira e recusada no `ci prepare`.
|
|
1570
1432
|
for (const a of claim.lint ?? []) {
|
|
1571
1433
|
console.log('');
|
|
1572
|
-
console.log(
|
|
1434
|
+
console.log(mc.avisoDoLint((0, claim_lint_1.linhaDoLintDeClaim)(claim.id, a), a.regra === 'suite-inteira'));
|
|
1573
1435
|
}
|
|
1574
1436
|
return 0;
|
|
1575
1437
|
}
|
|
1438
|
+
if (sub === 'conferir') {
|
|
1439
|
+
// RM-059 (T0.10): so o que foi pedido, no sandbox do verify, sob a conducao da thread, sem recibo.
|
|
1440
|
+
const id = args.posicionais[2];
|
|
1441
|
+
const json = args.opcoes.json === true;
|
|
1442
|
+
const claims = texto(args.opcoes.claims);
|
|
1443
|
+
const tarefa = texto(args.opcoes.tarefa);
|
|
1444
|
+
const prazo = texto(args.opcoes.prazo);
|
|
1445
|
+
const semValor = ['claims', 'tarefa', 'prazo'].some((o) => args.opcoes[o] === true);
|
|
1446
|
+
if (!id || semValor || (claims === undefined) === (tarefa === undefined)) {
|
|
1447
|
+
console.error(mc.usoConferir);
|
|
1448
|
+
return 2;
|
|
1449
|
+
}
|
|
1450
|
+
const conducao = conducaoDoCli(args);
|
|
1451
|
+
try {
|
|
1452
|
+
// O resultado e as recusas nascem em pt-BR, como o --json os leva; o texto os remonta no locale do comando.
|
|
1453
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, claims_conferir_1.conferirClaims)(carregado, id, {
|
|
1454
|
+
claims: claims !== undefined ? (0, claims_conferir_1.idsDeClaims)(claims) : undefined,
|
|
1455
|
+
tarefa,
|
|
1456
|
+
prazoMs: prazo !== undefined ? Number(prazo) * 1000 : undefined,
|
|
1457
|
+
canal: conducao.canal,
|
|
1458
|
+
correlacao: conducao.correlacao,
|
|
1459
|
+
}));
|
|
1460
|
+
console.log(json ? JSON.stringify(r, null, 2) : (0, claims_conferir_1.textoDaConferencia)(r));
|
|
1461
|
+
return r.ok ? 0 : 1;
|
|
1462
|
+
}
|
|
1463
|
+
catch (e) {
|
|
1464
|
+
if (!(e instanceof claims_conferir_1.ErroDeConferencia))
|
|
1465
|
+
throw e;
|
|
1466
|
+
if (json)
|
|
1467
|
+
console.log(JSON.stringify({ formato: claims_conferir_1.FORMATO_DA_CONFERENCIA, thread: id, ok: false, erro: e.message }, null, 2));
|
|
1468
|
+
else
|
|
1469
|
+
console.error((0, locale_1.mensagemDoErro)(e));
|
|
1470
|
+
return 2;
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1576
1473
|
if (sub === 'verificar') {
|
|
1577
1474
|
const id = args.posicionais[2];
|
|
1578
1475
|
const claimId = args.posicionais[3];
|
|
1579
1476
|
const comando = texto(args.opcoes.comando) ?? texto(args.opcoes.verificar);
|
|
1580
1477
|
if (!id || !claimId || !comando) {
|
|
1581
|
-
console.error(
|
|
1478
|
+
console.error(mc.usoVerificar);
|
|
1582
1479
|
return 2;
|
|
1583
1480
|
}
|
|
1584
|
-
const claim = (0, claims_1.anexarComando)(carregado.raiz, id, claimId, comando);
|
|
1585
|
-
console.log(
|
|
1586
|
-
console.log(
|
|
1587
|
-
console.log(
|
|
1481
|
+
const claim = (0, locale_1.comLocale)('pt-BR', () => (0, claims_1.anexarComando)(carregado.raiz, id, claimId, comando));
|
|
1482
|
+
console.log(mc.comandoAnexado(claim.id));
|
|
1483
|
+
console.log(mc.campoVerificar(claim.verificar.join(' && ')));
|
|
1484
|
+
console.log(mc.campoEstado(mc.estado(claim.estado)));
|
|
1588
1485
|
console.log('');
|
|
1589
|
-
console.log(
|
|
1486
|
+
console.log(mc.proveAgora(id));
|
|
1590
1487
|
return 0;
|
|
1591
1488
|
}
|
|
1592
1489
|
if (sub === 'retirar') {
|
|
@@ -1594,14 +1491,14 @@ function comandoClaims(args) {
|
|
|
1594
1491
|
const claimId = args.posicionais[3];
|
|
1595
1492
|
const motivo = texto(args.opcoes.motivo);
|
|
1596
1493
|
if (!id || !claimId || !motivo) {
|
|
1597
|
-
console.error(
|
|
1494
|
+
console.error(mc.usoRetirar);
|
|
1598
1495
|
return 2;
|
|
1599
1496
|
}
|
|
1600
|
-
const claim = (0, claims_1.retirarClaim)(carregado.raiz, id, claimId, motivo);
|
|
1601
|
-
console.log(
|
|
1602
|
-
console.log(
|
|
1603
|
-
console.log(
|
|
1604
|
-
console.log(
|
|
1497
|
+
const claim = (0, locale_1.comLocale)('pt-BR', () => (0, claims_1.retirarClaim)(carregado.raiz, id, claimId, motivo));
|
|
1498
|
+
console.log(mc.retirada(claim.id, id));
|
|
1499
|
+
console.log(mc.campoAlegacao(claim.alegacao));
|
|
1500
|
+
console.log(mc.campoMotivo(motivo));
|
|
1501
|
+
console.log(mc.historicoContinua);
|
|
1605
1502
|
return 0;
|
|
1606
1503
|
}
|
|
1607
1504
|
if (sub === 'ausente') {
|
|
@@ -1609,53 +1506,66 @@ function comandoClaims(args) {
|
|
|
1609
1506
|
const paths = (texto(args.opcoes.paths) ?? '').split(',').map((p) => p.trim()).filter(Boolean);
|
|
1610
1507
|
const motivo = texto(args.opcoes.motivo);
|
|
1611
1508
|
if (!id || paths.length === 0 || !motivo) {
|
|
1612
|
-
console.error(
|
|
1509
|
+
console.error(mc.usoAusente);
|
|
1613
1510
|
return 2;
|
|
1614
1511
|
}
|
|
1615
|
-
(0, prova_minima_1.registrarProvaAusente)(carregado.raiz, id, { paths, motivo, commit: texto(args.opcoes.commit) });
|
|
1616
|
-
console.log(
|
|
1617
|
-
console.log(
|
|
1512
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, prova_minima_1.registrarProvaAusente)(carregado.raiz, id, { paths, motivo, commit: texto(args.opcoes.commit) }));
|
|
1513
|
+
console.log(mc.ausenciaRegistrada(id, paths.join(', ')));
|
|
1514
|
+
console.log(mc.campoMotivo(motivo));
|
|
1618
1515
|
return 0;
|
|
1619
1516
|
}
|
|
1620
1517
|
if (sub === 'list' || sub === undefined) {
|
|
1621
1518
|
const id = args.posicionais[2];
|
|
1622
1519
|
if (!id) {
|
|
1623
|
-
console.error(
|
|
1520
|
+
console.error(mc.usoList);
|
|
1624
1521
|
return 2;
|
|
1625
1522
|
}
|
|
1626
1523
|
console.log((0, claims_1.tabelaDeClaims)(carregado.raiz, id));
|
|
1627
1524
|
return 0;
|
|
1628
1525
|
}
|
|
1629
|
-
console.error(
|
|
1526
|
+
console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('claims', sub));
|
|
1630
1527
|
return 2;
|
|
1631
1528
|
}
|
|
1632
1529
|
function comandoVerify(args) {
|
|
1633
1530
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1634
1531
|
const id = args.posicionais[1];
|
|
1532
|
+
const m = (0, locale_1.msg)().verify;
|
|
1635
1533
|
if (!id) {
|
|
1636
|
-
console.error(
|
|
1534
|
+
console.error(m.uso);
|
|
1637
1535
|
return 2;
|
|
1638
1536
|
}
|
|
1639
|
-
|
|
1537
|
+
// RM-072 (D1): `--check classic|agile` vence o `check.mode` do manifesto; outro valor sai com 2 e os dois aceitos.
|
|
1538
|
+
const brutoDoCheck = args.opcoes.check;
|
|
1539
|
+
const check = brutoDoCheck === undefined ? undefined : (0, check_modo_1.lerModo)(brutoDoCheck);
|
|
1540
|
+
if (check === null) {
|
|
1541
|
+
console.error(m.checkInvalido(typeof brutoDoCheck === 'string' ? brutoDoCheck : null));
|
|
1542
|
+
return 2;
|
|
1543
|
+
}
|
|
1544
|
+
// RM-058 N2 (D10): enquanto a fila de recursos pesados nao da a vez, o CLI diz uma vez por quem espera.
|
|
1545
|
+
const aoEsperar = (ocupantes) => console.error(m.filaPesadaEsperando(args.opcoes.baseline === true ? 'baseline' : 'verify', ocupantes.map((o) => m.filaPesadaOcupante(o.operacao, o.thread, (0, horario_1.formatarDataHora)(o.desde))).join('; ')));
|
|
1546
|
+
const doCli = conducaoDoCli(args);
|
|
1547
|
+
// O `ork verify` do CLI espera a fila em primeiro plano ate `--esperar` ou 60 min; a recusa sugere o dobro.
|
|
1548
|
+
const conducao = { ...doCli, filaPesada: { aoEsperar, esperarMs: doCli.esperarMs ?? verify_1.ESPERA_DA_FILA_PESADA_MS,
|
|
1549
|
+
comandoDeEsperar: `ork verify ${id}${args.opcoes.baseline === true ? ' --baseline' : ''} --esperar 120` } };
|
|
1640
1550
|
if (args.opcoes.baseline === true) {
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
console.log(
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1551
|
+
// RM-061 (F2b, G2): a baseline e o ledger sao gravados em pt-BR; so a impressao segue o locale.
|
|
1552
|
+
const b = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.gravarBaseline)(carregado, id, undefined, conducao, 'cli', undefined, check));
|
|
1553
|
+
console.log(m.baselineGravada(id));
|
|
1554
|
+
console.log(m.baselineCommit(b.commit));
|
|
1555
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito nao sai como "ja falhava".
|
|
1556
|
+
for (const linha of (0, verify_1.linhasDaBaseline)(b, id))
|
|
1557
|
+
console.log(linha);
|
|
1647
1558
|
if (b.comandos.some((c) => !c.ok)) {
|
|
1648
1559
|
// Ensaio de 03/10 (R7): "ja falhava" sem dizer onde ver a saida do comando.
|
|
1649
|
-
console.log(
|
|
1650
|
-
`(resumo e trecho); o evento baseline_recorded esta em ork phase list ${id}`);
|
|
1560
|
+
console.log(m.baselineSaida((0, thread_1.caminhoThread)(carregado.raiz, id), id));
|
|
1651
1561
|
}
|
|
1652
1562
|
if (b.comandos.length === 0) {
|
|
1653
1563
|
// Fatia 2 do ensaio da 0.5.0 (R5): a baseline foi gravada; o que falta e comando, nao baseline.
|
|
1654
|
-
console.log(
|
|
1564
|
+
console.log(m.baselineSemComandos);
|
|
1655
1565
|
}
|
|
1656
1566
|
return 0;
|
|
1657
1567
|
}
|
|
1658
|
-
const r = (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao });
|
|
1568
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao, check }));
|
|
1659
1569
|
console.log((0, verify_1.textoDoVerify)(r));
|
|
1660
1570
|
return r.ok ? 0 : 1;
|
|
1661
1571
|
}
|
|
@@ -1663,13 +1573,116 @@ function comandoVerify(args) {
|
|
|
1663
1573
|
* `ork conducao status|assumir` (I-36, T15): quem conduz a thread agora, e o handoff explicito. O
|
|
1664
1574
|
* status tambem libera, com prova no ledger, a conducao que ficou sem dono (T16).
|
|
1665
1575
|
*/
|
|
1576
|
+
/**
|
|
1577
|
+
* RM-059 (F6, T6.4; DD5 do plano dos mods): `ork conducao sentinela status|bater|desligar`. A presenca da
|
|
1578
|
+
* Sentinela do Condutor nesta maquina e o passo do condutor em cada thread aberta; o condutor externo le o
|
|
1579
|
+
* `status --json` para ceder o despacho enquanto a presenca vale. Nada aqui despacha.
|
|
1580
|
+
*/
|
|
1581
|
+
function comandoSentinela(carregado, args) {
|
|
1582
|
+
const m = (0, locale_1.msg)().conducao.cli;
|
|
1583
|
+
const acao = args.posicionais[2] ?? 'status';
|
|
1584
|
+
const json = args.opcoes.json === true;
|
|
1585
|
+
if (acao === 'status') {
|
|
1586
|
+
const s = (0, conducao_sentinela_1.statusDaSentinela)(carregado);
|
|
1587
|
+
console.log(json ? JSON.stringify(s, null, 2) : (0, conducao_sentinela_1.textoDoStatusDaSentinela)(s));
|
|
1588
|
+
return 0;
|
|
1589
|
+
}
|
|
1590
|
+
if (acao !== 'bater' && acao !== 'desligar')
|
|
1591
|
+
throw new Error(m.sentinelaUso);
|
|
1592
|
+
const sessao = texto(args.opcoes.sessao);
|
|
1593
|
+
if (!sessao)
|
|
1594
|
+
throw new Error(m.sentinelaSessao(acao));
|
|
1595
|
+
if (acao === 'bater') {
|
|
1596
|
+
const r = (0, conducao_sentinela_1.baterSentinela)(carregado.raiz, { sessao });
|
|
1597
|
+
const curta = r.presenca.sessao.slice(0, 8);
|
|
1598
|
+
console.log(json ? JSON.stringify(r, null, 2) : r.ok
|
|
1599
|
+
? m.sentinelaLigada(r.ligou, r.presenca.maquina, curta)
|
|
1600
|
+
: m.sentinelaOutra(curta, r.presenca.maquina));
|
|
1601
|
+
return r.ok ? 0 : 3;
|
|
1602
|
+
}
|
|
1603
|
+
const motivo = texto(args.opcoes.motivo);
|
|
1604
|
+
const r = (0, conducao_sentinela_1.desligarSentinela)(carregado.raiz, { sessao, ...(motivo ? { motivo } : {}) });
|
|
1605
|
+
console.log(json ? JSON.stringify(r, null, 2) : r.desligada ? m.sentinelaOff : m.sentinelaNada);
|
|
1606
|
+
return 0;
|
|
1607
|
+
}
|
|
1608
|
+
/**
|
|
1609
|
+
* RM-063 (F7): `ork conducao autorizar|autorizacao`. A autorizacao duravel do dono nesta maquina
|
|
1610
|
+
* (`ork.autorizacao-duravel/v1`, fora do git): o que a batida da conducao pode fazer sozinha e ate quando.
|
|
1611
|
+
*/
|
|
1612
|
+
function comandoAutorizacao(carregado, args, sub) {
|
|
1613
|
+
const m = (0, locale_1.msg)().conducao.cli;
|
|
1614
|
+
const json = args.opcoes.json === true;
|
|
1615
|
+
const projeto = carregado.manifesto.project.name;
|
|
1616
|
+
if (sub === 'autorizacao') {
|
|
1617
|
+
if (args.posicionais.length > 2)
|
|
1618
|
+
throw new Error(m.autorizacaoUso);
|
|
1619
|
+
const leitura = (0, autorizacao_duravel_1.lerAutorizacao)(carregado.raiz, { projeto });
|
|
1620
|
+
console.log(json ? JSON.stringify(leitura, null, 2) : (0, autorizacao_duravel_1.textoDaAutorizacao)(leitura));
|
|
1621
|
+
return 0;
|
|
1622
|
+
}
|
|
1623
|
+
const ate = texto(args.opcoes.ate), pode = texto(args.opcoes.pode);
|
|
1624
|
+
if (!ate || !pode || args.posicionais.length > 2) {
|
|
1625
|
+
throw new Error(m.autorizarUso);
|
|
1626
|
+
}
|
|
1627
|
+
const r = (0, autorizacao_duravel_1.gravarAutorizacao)(carregado.raiz, { ate, pode, por: texto(args.opcoes.por), nota: texto(args.opcoes.nota), projeto,
|
|
1628
|
+
fuso: (0, horario_1.fusoDoManifesto)(carregado).fuso, canal: conducaoDoCli(args).canal });
|
|
1629
|
+
if (!r.ok) {
|
|
1630
|
+
console.log(json ? JSON.stringify(r, null, 2) : m.autorizacaoRecusada(r.motivo, r.detalhe));
|
|
1631
|
+
return 1;
|
|
1632
|
+
}
|
|
1633
|
+
const a = r.anterior;
|
|
1634
|
+
console.log(json ? JSON.stringify({ ok: true, leitura: r.leitura, anterior: a }, null, 2) : [
|
|
1635
|
+
m.autorizacaoGravada((0, autorizacao_duravel_1.linhaDaAutorizacao)(r.leitura)),
|
|
1636
|
+
...(a ? [m.substitui(a.por, (0, horario_1.formatarDataHoraRotulada)(a.ate), a.pode.join(', '))] : []),
|
|
1637
|
+
m.arquivo(r.leitura.arquivo)
|
|
1638
|
+
].join('\n'));
|
|
1639
|
+
return 0;
|
|
1640
|
+
}
|
|
1666
1641
|
function comandoConducao(args) {
|
|
1667
1642
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1643
|
+
const m = (0, locale_1.msg)().conducao.cli;
|
|
1668
1644
|
const sub = args.posicionais[1];
|
|
1669
1645
|
const id = args.posicionais[2];
|
|
1646
|
+
if (sub === 'sentinela')
|
|
1647
|
+
return comandoSentinela(carregado, args);
|
|
1648
|
+
if (sub === 'autorizar' || sub === 'autorizacao')
|
|
1649
|
+
return comandoAutorizacao(carregado, args, sub);
|
|
1650
|
+
if (sub === 'batida') {
|
|
1651
|
+
// RM-063 (F7): o passo deterministico da conducao, o mesmo que a varredura do cron roda depois do resumo.
|
|
1652
|
+
if (args.posicionais.length > 2)
|
|
1653
|
+
throw new Error(m.batidaUso);
|
|
1654
|
+
const r = (0, conducao_batida_1.baterConducao)(carregado, { canal: conducaoDoCli(args).canal });
|
|
1655
|
+
const textoDaRodada = (0, conducao_batida_1.textoDaBatida)(r);
|
|
1656
|
+
console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : textoDaRodada);
|
|
1657
|
+
// RM-063 (H2): o `#OrkRetomar` do canal roda esta batida em segundo plano; o que voltou a andar volta ao dono pelo
|
|
1658
|
+
// transporte do pulse (com o outro host configurado, se o primeiro falhar).
|
|
1659
|
+
if (args.opcoes.entregar === true) {
|
|
1660
|
+
const mensagem = `🔁 Orkastery, retomada em ${(0, maquina_1.nomeDaMaquina)()}:\n${textoDaRodada}`.slice(0, 3900);
|
|
1661
|
+
try {
|
|
1662
|
+
const e = (0, pulse_delivery_1.entregarPeloTransporte)(carregado.raiz, mensagem, { oQue: 'a retomada' });
|
|
1663
|
+
if (!e.ok)
|
|
1664
|
+
console.error(m.pulseAviso);
|
|
1665
|
+
}
|
|
1666
|
+
catch (e) {
|
|
1667
|
+
console.error(m.pulseFalha(e.message));
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
return r.ocupada ? 3 : 0;
|
|
1671
|
+
}
|
|
1672
|
+
if (sub === 'atualizar') {
|
|
1673
|
+
// RM-063 (F7): o merge da base remota na branch da thread, com a reconciliacao do CHANGELOG; conflito em codigo aborta.
|
|
1674
|
+
if (!id || args.posicionais.length > 3)
|
|
1675
|
+
throw new Error(m.atualizarUso);
|
|
1676
|
+
(0, thread_1.lerThread)(carregado.raiz, id);
|
|
1677
|
+
const doCli = conducaoDoCli(args);
|
|
1678
|
+
const r = (0, atualizar_branch_1.atualizarBranchDaThread)(carregado, id, { enviar: args.opcoes.enviar === true, canal: doCli.canal, correlacao: doCli.correlacao,
|
|
1679
|
+
...(doCli.esperarMs ? { esperarMs: doCli.esperarMs } : {}) });
|
|
1680
|
+
console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, atualizar_branch_1.textoDaAtualizacao)(r));
|
|
1681
|
+
return r.acao === 'mesclada' || r.acao === 'ja-atualizada' ? 0 : r.acao === 'recusada' && r.motivo === 'conduzida' ? 3 : 1;
|
|
1682
|
+
}
|
|
1670
1683
|
if (sub === 'status') {
|
|
1671
1684
|
if (!id)
|
|
1672
|
-
throw new Error(
|
|
1685
|
+
throw new Error(m.statusUso);
|
|
1673
1686
|
(0, thread_1.lerThread)(carregado.raiz, id);
|
|
1674
1687
|
(0, conducao_1.liberarSeOrfa)(carregado.raiz, id);
|
|
1675
1688
|
const atual = (0, conducao_1.conducaoDaThread)(carregado.raiz, id);
|
|
@@ -1679,12 +1692,12 @@ function comandoConducao(args) {
|
|
|
1679
1692
|
if (sub === 'assumir') {
|
|
1680
1693
|
const por = texto(args.opcoes.por), motivo = texto(args.opcoes.motivo);
|
|
1681
1694
|
if (!id || !por || !motivo)
|
|
1682
|
-
throw new Error(
|
|
1695
|
+
throw new Error(m.assumirUso);
|
|
1683
1696
|
const r = (0, conducao_1.assumirConducao)(carregado.raiz, id, { por, motivo, canal: conducaoDoCli(args).canal });
|
|
1684
|
-
console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) :
|
|
1697
|
+
console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : m.assumida(r.ok, r.detalhe));
|
|
1685
1698
|
return r.ok ? 0 : 3;
|
|
1686
1699
|
}
|
|
1687
|
-
throw new Error(
|
|
1700
|
+
throw new Error(m.uso);
|
|
1688
1701
|
}
|
|
1689
1702
|
/** RM-048 (D1): o gate aberto no contrato curto, com o codigo estavel e o "desde" do ledger. */
|
|
1690
1703
|
function textoDoGateCurto(raiz, pedido, canal) {
|
|
@@ -1697,11 +1710,12 @@ function textoDoGateCurto(raiz, pedido, canal) {
|
|
|
1697
1710
|
function comandoGate(args) {
|
|
1698
1711
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1699
1712
|
const sub = args.posicionais[1];
|
|
1713
|
+
const mg = (0, locale_1.msg)().operacao.restante.gate;
|
|
1700
1714
|
if (sub === 'context') {
|
|
1701
1715
|
const id = args.posicionais[2], pedido = args.posicionais[3];
|
|
1702
1716
|
if (!id || !pedido || args.posicionais.length !== 4 ||
|
|
1703
1717
|
Object.entries(args.opcoes).some(([k, v]) => k !== 'native-offer-stdin' || v !== true))
|
|
1704
|
-
throw Error(
|
|
1718
|
+
throw Error(mg.usoContext);
|
|
1705
1719
|
const view = (0, hitl_gates_1.contextoDoPedidoNativo)(carregado.raiz, id, pedido);
|
|
1706
1720
|
const callback = args.opcoes['native-offer-stdin'] ? (0, hitl_native_offer_1.readNativeOfferStdin)() : undefined;
|
|
1707
1721
|
console.log(JSON.stringify({ ...view, canais: (0, hitl_presentation_1.ofertaDoPedido)(view.pedido, [], callback === undefined ? undefined : { callback, raiz: carregado.raiz }),
|
|
@@ -1711,10 +1725,10 @@ function comandoGate(args) {
|
|
|
1711
1725
|
if (sub === 'request') {
|
|
1712
1726
|
const id = args.posicionais[2];
|
|
1713
1727
|
if (!id)
|
|
1714
|
-
throw new Error(
|
|
1728
|
+
throw new Error(mg.requestThread);
|
|
1715
1729
|
const formato = texto(args.opcoes.formato);
|
|
1716
1730
|
if (formato !== undefined && formato !== 'telegram' && formato !== 'terminal')
|
|
1717
|
-
throw new Error(
|
|
1731
|
+
throw new Error(mg.formato);
|
|
1718
1732
|
const pedido = (0, hitl_gates_1.abrirPedidoGate)(carregado.raiz, id, texto(args.opcoes.motivo));
|
|
1719
1733
|
// RM-048 (D1): com --formato, o que sai e o pedido no contrato curto, pronto para o canal, com
|
|
1720
1734
|
// o codigo estavel na ultima linha. Sem ele, o JSON de sempre, para quem integra.
|
|
@@ -1724,7 +1738,7 @@ function comandoGate(args) {
|
|
|
1724
1738
|
if (sub === 'answer') {
|
|
1725
1739
|
const id = args.posicionais[2], pedido = args.posicionais[3];
|
|
1726
1740
|
if (!id || !pedido || args.opcoes['resposta-stdin'] !== true || args.opcoes.resposta !== undefined)
|
|
1727
|
-
throw new Error(
|
|
1741
|
+
throw new Error(mg.answer);
|
|
1728
1742
|
const r = (0, hitl_gates_1.lerRespostaStdin)({ por: texto(args.opcoes.por), mensagem: texto(args.opcoes.mensagem),
|
|
1729
1743
|
origem: texto(args.opcoes.origem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
|
|
1730
1744
|
console.log(JSON.stringify((0, hitl_gates_1.responderGate)(carregado.raiz, id, pedido, r)));
|
|
@@ -1733,7 +1747,7 @@ function comandoGate(args) {
|
|
|
1733
1747
|
if (sub === 'next') {
|
|
1734
1748
|
const id = args.posicionais[2];
|
|
1735
1749
|
if (!id) {
|
|
1736
|
-
console.error(
|
|
1750
|
+
console.error(mg.usoNext);
|
|
1737
1751
|
return 2;
|
|
1738
1752
|
}
|
|
1739
1753
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
@@ -1757,18 +1771,18 @@ function comandoGate(args) {
|
|
|
1757
1771
|
const sobre = args.posicionais[3];
|
|
1758
1772
|
const por = texto(args.opcoes.por) ?? texto(args.opcoes.quem);
|
|
1759
1773
|
if (!id || !sobre || !por) {
|
|
1760
|
-
console.error(
|
|
1774
|
+
console.error(mg.approveAposentado);
|
|
1761
1775
|
return 2;
|
|
1762
1776
|
}
|
|
1763
1777
|
(0, thread_1.lerThread)(carregado.raiz, id);
|
|
1764
1778
|
const e = (0, gates_1.aprovarGateHumano)(carregado.raiz, id, sobre, por, texto(args.opcoes.obs));
|
|
1765
|
-
console.log(
|
|
1766
|
-
console.log(
|
|
1767
|
-
console.log(
|
|
1768
|
-
console.log(
|
|
1779
|
+
console.log(mg.registrado(id));
|
|
1780
|
+
console.log(mg.sobre(sobre));
|
|
1781
|
+
console.log(mg.autorizado(por));
|
|
1782
|
+
console.log(mg.quando((0, horario_1.formatarDataHoraRotulada)(e.ts)));
|
|
1769
1783
|
return 0;
|
|
1770
1784
|
}
|
|
1771
|
-
console.error(
|
|
1785
|
+
console.error(mg.desconhecido(sub));
|
|
1772
1786
|
return 2;
|
|
1773
1787
|
}
|
|
1774
1788
|
/**
|
|
@@ -1780,44 +1794,44 @@ function comandoGate(args) {
|
|
|
1780
1794
|
*/
|
|
1781
1795
|
function comandoRetry(args) {
|
|
1782
1796
|
const sub = args.posicionais[1];
|
|
1797
|
+
const mr = (0, locale_1.msg)().retry, mc = mr.complementar;
|
|
1783
1798
|
if (sub === 'policy') {
|
|
1784
1799
|
const alvo = texto(args.opcoes.motivo);
|
|
1785
1800
|
if (alvo) {
|
|
1786
1801
|
const politica = retry_1.POLITICA_DE_RETRY[alvo];
|
|
1787
1802
|
if (!politica) {
|
|
1788
|
-
console.error(
|
|
1789
|
-
console.error(
|
|
1803
|
+
console.error(mc.motivoDesconhecido(alvo));
|
|
1804
|
+
console.error(mc.conhecidos(Object.keys(retry_1.POLITICA_DE_RETRY).join(', ')));
|
|
1790
1805
|
return 2;
|
|
1791
1806
|
}
|
|
1792
1807
|
if (args.opcoes.json === true) {
|
|
1793
1808
|
console.log(JSON.stringify(politica, null, 2));
|
|
1794
1809
|
return 0;
|
|
1795
1810
|
}
|
|
1796
|
-
console.log(
|
|
1797
|
-
console.log(
|
|
1798
|
-
console.log(
|
|
1799
|
-
console.log(
|
|
1800
|
-
console.log(
|
|
1801
|
-
console.log(
|
|
1811
|
+
console.log(mc.motivo(politica.motivo));
|
|
1812
|
+
console.log(mc.significado((0, locale_1.localeAtivo)() === 'en' ? mr.politica[politica.motivo].porque : auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[politica.motivo]));
|
|
1813
|
+
console.log(mc.acao(politica.acao));
|
|
1814
|
+
console.log(mc.automatica(politica.automatica ? mc.sim : mc.nao));
|
|
1815
|
+
console.log(mc.porque(mr.politica[politica.motivo].porque));
|
|
1816
|
+
console.log(mc.correcao(mr.politica[politica.motivo].correcao));
|
|
1802
1817
|
return 0;
|
|
1803
1818
|
}
|
|
1804
1819
|
if (args.opcoes.json === true) {
|
|
1805
1820
|
console.log(JSON.stringify(Object.values(retry_1.POLITICA_DE_RETRY), null, 2));
|
|
1806
1821
|
return 0;
|
|
1807
1822
|
}
|
|
1808
|
-
console.log(
|
|
1823
|
+
console.log(mc.politicaTitulo);
|
|
1809
1824
|
console.log('');
|
|
1810
1825
|
console.log((0, retry_1.tabelaDaPolitica)());
|
|
1811
1826
|
console.log('');
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
console.log('escalacao (retry.max_tentativas) pausa qualquer modo, inclusive #Auto.');
|
|
1827
|
+
for (const linha of mc.politicaFecho)
|
|
1828
|
+
console.log(linha);
|
|
1815
1829
|
return 0;
|
|
1816
1830
|
}
|
|
1817
1831
|
if (sub === 'parse') {
|
|
1818
1832
|
const bruto = texto(args.opcoes.stderr) ?? args.posicionais.slice(2).join(' ');
|
|
1819
1833
|
if (!bruto) {
|
|
1820
|
-
console.error(
|
|
1834
|
+
console.error(mc.usoParse);
|
|
1821
1835
|
return 2;
|
|
1822
1836
|
}
|
|
1823
1837
|
const sinal = (0, ratelimit_1.parseRateLimit)(bruto);
|
|
@@ -1826,17 +1840,17 @@ function comandoRetry(args) {
|
|
|
1826
1840
|
return sinal ? 0 : 1;
|
|
1827
1841
|
}
|
|
1828
1842
|
if (!sinal) {
|
|
1829
|
-
console.log(
|
|
1843
|
+
console.log(mc.semSinal);
|
|
1830
1844
|
return 1;
|
|
1831
1845
|
}
|
|
1832
|
-
console.log(
|
|
1833
|
-
console.log(
|
|
1834
|
-
console.log(
|
|
1835
|
-
console.log(
|
|
1846
|
+
console.log(mc.sinal);
|
|
1847
|
+
console.log(mc.fonte(sinal.fonte));
|
|
1848
|
+
console.log(mc.reset(sinal.resetEm ? (0, horario_1.formatarDataHoraRotulada)(sinal.resetEm) : mc.semHora));
|
|
1849
|
+
console.log(mc.trecho(sinal.trecho));
|
|
1836
1850
|
if (sinal.resetEm === null) {
|
|
1837
1851
|
console.log('');
|
|
1838
|
-
|
|
1839
|
-
|
|
1852
|
+
for (const linha of mc.estimada)
|
|
1853
|
+
console.log(linha);
|
|
1840
1854
|
}
|
|
1841
1855
|
return 0;
|
|
1842
1856
|
}
|
|
@@ -1845,7 +1859,7 @@ function comandoRetry(args) {
|
|
|
1845
1859
|
if (sub === 'plan' || sub === 'run') {
|
|
1846
1860
|
const id = args.posicionais[2];
|
|
1847
1861
|
if (!id) {
|
|
1848
|
-
console.error(
|
|
1862
|
+
console.error((0, locale_1.msg)().retry.usoPlanRun(sub));
|
|
1849
1863
|
return 2;
|
|
1850
1864
|
}
|
|
1851
1865
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
@@ -1856,7 +1870,8 @@ function comandoRetry(args) {
|
|
|
1856
1870
|
autorizadoPor: texto(args.opcoes.por) ?? texto(args.opcoes.quem),
|
|
1857
1871
|
};
|
|
1858
1872
|
if (sub === 'plan') {
|
|
1859
|
-
|
|
1873
|
+
// RM-061 (F2b, G2): a razao nasce em pt-BR, como o --json e o ledger a guardam; so a impressao segue o locale.
|
|
1874
|
+
const plano = (0, locale_1.comLocale)('pt-BR', () => (0, retry_1.planejarRetry)(carregado, id, opcoes));
|
|
1860
1875
|
if (args.opcoes.json === true) {
|
|
1861
1876
|
console.log(JSON.stringify(plano, null, 2));
|
|
1862
1877
|
return 0;
|
|
@@ -1868,11 +1883,11 @@ function comandoRetry(args) {
|
|
|
1868
1883
|
const conducao = conducaoDoCli(args);
|
|
1869
1884
|
if (conducao.esperarMs && args.opcoes['dry-run'] !== true)
|
|
1870
1885
|
(0, conducao_1.esperarConducaoLivre)(carregado.raiz, id, conducao.esperarMs);
|
|
1871
|
-
const r = (0, retry_1.executarRetry)(carregado, id, {
|
|
1886
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, retry_1.executarRetry)(carregado, id, {
|
|
1872
1887
|
...opcoes,
|
|
1873
1888
|
dryRun: args.opcoes['dry-run'] === true,
|
|
1874
1889
|
reverify: args.opcoes.reverify === true,
|
|
1875
|
-
});
|
|
1890
|
+
}));
|
|
1876
1891
|
if (args.opcoes.json === true) {
|
|
1877
1892
|
console.log(JSON.stringify(r, null, 2));
|
|
1878
1893
|
}
|
|
@@ -1892,8 +1907,8 @@ function comandoRetry(args) {
|
|
|
1892
1907
|
const espera = (0, ratelimit_1.lerFilaDeRetomada)(carregado.raiz).filter((p) => p.estado === 'aguardando');
|
|
1893
1908
|
if (espera.length > 0) {
|
|
1894
1909
|
console.log('');
|
|
1895
|
-
console.log(
|
|
1896
|
-
console.log(
|
|
1910
|
+
console.log(mc.proxima((0, horario_1.formatarDataHora)(espera[0].liberaEm), (0, ratelimit_1.faltaPara)(espera[0])));
|
|
1911
|
+
console.log(mc.retome);
|
|
1897
1912
|
}
|
|
1898
1913
|
return 0;
|
|
1899
1914
|
}
|
|
@@ -1923,17 +1938,17 @@ function comandoRetry(args) {
|
|
|
1923
1938
|
const idPedido = args.posicionais[2];
|
|
1924
1939
|
const motivo = texto(args.opcoes.motivo);
|
|
1925
1940
|
if (!idPedido || !motivo) {
|
|
1926
|
-
console.error(
|
|
1941
|
+
console.error(mc.usoCancel);
|
|
1927
1942
|
return 2;
|
|
1928
1943
|
}
|
|
1929
1944
|
const p = (0, retry_1.cancelarPedido)(carregado, idPedido, motivo);
|
|
1930
|
-
console.log(
|
|
1931
|
-
console.log(
|
|
1932
|
-
console.log(
|
|
1933
|
-
console.log(
|
|
1945
|
+
console.log(mc.cancelado(p.id));
|
|
1946
|
+
console.log(mc.thread(p.thread));
|
|
1947
|
+
console.log(mc.fase(p.fase));
|
|
1948
|
+
console.log(mc.motivoLinha(motivo));
|
|
1934
1949
|
return 0;
|
|
1935
1950
|
}
|
|
1936
|
-
console.error(
|
|
1951
|
+
console.error(mc.desconhecido(sub ?? ''));
|
|
1937
1952
|
return 2;
|
|
1938
1953
|
}
|
|
1939
1954
|
/**
|
|
@@ -1947,15 +1962,16 @@ function comandoFix(args) {
|
|
|
1947
1962
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1948
1963
|
const sub = args.posicionais[1];
|
|
1949
1964
|
const id = args.posicionais[2];
|
|
1965
|
+
const mf = (0, locale_1.msg)().operacao.restante.fix;
|
|
1950
1966
|
if (sub === 'open') {
|
|
1951
1967
|
if (!id) {
|
|
1952
|
-
console.error(
|
|
1968
|
+
console.error(mf.usoOpen);
|
|
1953
1969
|
return 2;
|
|
1954
1970
|
}
|
|
1955
|
-
const conducao = conducaoDoCli(args);
|
|
1956
|
-
const rodada = (0, fix_1.abrirRodada)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao });
|
|
1971
|
+
const conducao = { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix open ${id} --esperar 30`) };
|
|
1972
|
+
const rodada = (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.abrirRodada)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao }));
|
|
1957
1973
|
const reverify = args.opcoes.reverify === true && rodada.correcoes.length > 0
|
|
1958
|
-
? (0, fix_1.reverificar)(carregado, id, { rodada: rodada.rodada, conducao })
|
|
1974
|
+
? (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.reverificar)(carregado, id, { rodada: rodada.rodada, conducao }))
|
|
1959
1975
|
: null;
|
|
1960
1976
|
if (args.opcoes.json === true) {
|
|
1961
1977
|
console.log(JSON.stringify({ rodada, reverify }, null, 2));
|
|
@@ -1973,14 +1989,14 @@ function comandoFix(args) {
|
|
|
1973
1989
|
}
|
|
1974
1990
|
if (sub === 'list') {
|
|
1975
1991
|
if (!id) {
|
|
1976
|
-
console.error(
|
|
1992
|
+
console.error(mf.usoList);
|
|
1977
1993
|
return 2;
|
|
1978
1994
|
}
|
|
1979
1995
|
(0, thread_1.lerThread)(carregado.raiz, id);
|
|
1980
1996
|
const rodadaBruta = texto(args.opcoes.rodada);
|
|
1981
1997
|
const rodada = rodadaBruta ? Number(rodadaBruta) : (0, fix_1.ultimaRodada)(carregado.raiz, id);
|
|
1982
1998
|
if (rodada === 0) {
|
|
1983
|
-
console.log(
|
|
1999
|
+
console.log(mf.semRodada(id));
|
|
1984
2000
|
return 0;
|
|
1985
2001
|
}
|
|
1986
2002
|
const correcoes = (0, fix_1.correcoesDaRodada)(carregado.raiz, id, rodada);
|
|
@@ -1988,29 +2004,29 @@ function comandoFix(args) {
|
|
|
1988
2004
|
console.log(JSON.stringify(correcoes, null, 2));
|
|
1989
2005
|
return 0;
|
|
1990
2006
|
}
|
|
1991
|
-
console.log(
|
|
2007
|
+
console.log(mf.lista(rodada, id));
|
|
1992
2008
|
console.log('');
|
|
1993
|
-
console.log((0, util_1.tabela)([
|
|
2009
|
+
console.log((0, util_1.tabela)([...mf.colunasLista], correcoes.map((c) => [
|
|
1994
2010
|
c.id,
|
|
1995
2011
|
c.tipo,
|
|
1996
2012
|
c.origem,
|
|
1997
2013
|
c.alvo,
|
|
1998
2014
|
c.estado,
|
|
1999
|
-
c.verificar.join(' && ') ||
|
|
2015
|
+
c.verificar.join(' && ') || mf.verifyCompleto,
|
|
2000
2016
|
])));
|
|
2001
2017
|
return 0;
|
|
2002
2018
|
}
|
|
2003
2019
|
if (sub === 'reverify') {
|
|
2004
2020
|
if (!id) {
|
|
2005
|
-
console.error(
|
|
2021
|
+
console.error(mf.usoReverify);
|
|
2006
2022
|
return 2;
|
|
2007
2023
|
}
|
|
2008
2024
|
const rodadaBruta = texto(args.opcoes.rodada);
|
|
2009
|
-
const r = (0, fix_1.reverificar)(carregado, id, {
|
|
2010
|
-
conducao: conducaoDoCli(args),
|
|
2025
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.reverificar)(carregado, id, {
|
|
2026
|
+
conducao: { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix reverify ${id} --esperar 30`) },
|
|
2011
2027
|
rodada: rodadaBruta ? Number(rodadaBruta) : undefined,
|
|
2012
2028
|
parcial: args.opcoes.parcial === true,
|
|
2013
|
-
});
|
|
2029
|
+
}));
|
|
2014
2030
|
if (args.opcoes.json === true) {
|
|
2015
2031
|
console.log(JSON.stringify(r, null, 2));
|
|
2016
2032
|
}
|
|
@@ -2019,49 +2035,118 @@ function comandoFix(args) {
|
|
|
2019
2035
|
}
|
|
2020
2036
|
return r.veredito === 'PASSOU' ? 0 : 1;
|
|
2021
2037
|
}
|
|
2022
|
-
console.error(
|
|
2038
|
+
console.error(mf.desconhecido(sub ?? ''));
|
|
2023
2039
|
return 2;
|
|
2024
2040
|
}
|
|
2025
2041
|
function comandoHandoff(args) {
|
|
2026
2042
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2027
2043
|
const sub = args.posicionais[1];
|
|
2028
2044
|
const id = args.posicionais[2];
|
|
2045
|
+
const mh = (0, locale_1.msg)().operacao.restante.handoff;
|
|
2029
2046
|
if (sub === 'export') {
|
|
2030
2047
|
if (!id) {
|
|
2031
|
-
console.error(
|
|
2048
|
+
console.error(mh.usoExport);
|
|
2032
2049
|
return 2;
|
|
2033
2050
|
}
|
|
2034
2051
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
2035
2052
|
const faseBruta = texto(args.opcoes['proxima-fase']) ?? texto(args.opcoes.fase);
|
|
2036
|
-
const r = (0, handoff_1.exportarHandoff)(carregado, id, {
|
|
2053
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, handoff_1.exportarHandoff)(carregado, id, {
|
|
2037
2054
|
proximaFase: faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined,
|
|
2038
2055
|
slugDestino: texto(args.opcoes.slug),
|
|
2039
|
-
});
|
|
2056
|
+
}));
|
|
2040
2057
|
console.log((0, handoff_1.textoDoHandoff)(r.handoff, r.caminho));
|
|
2041
2058
|
console.log('');
|
|
2042
|
-
console.log(
|
|
2059
|
+
console.log(mh.historico(r.caminhoHistorico));
|
|
2043
2060
|
return 0;
|
|
2044
2061
|
}
|
|
2045
2062
|
if (sub === 'recall') {
|
|
2046
2063
|
const ponteiro = args.posicionais[3];
|
|
2047
2064
|
if (!id || !ponteiro) {
|
|
2048
|
-
console.error(
|
|
2065
|
+
console.error(mh.usoRecall);
|
|
2049
2066
|
return 2;
|
|
2050
2067
|
}
|
|
2051
|
-
const r = (0, handoff_1.recall)(carregado, id, ponteiro);
|
|
2052
|
-
console.log(
|
|
2053
|
-
console.log(
|
|
2054
|
-
console.log(
|
|
2055
|
-
console.log(
|
|
2068
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, handoff_1.recall)(carregado, id, ponteiro));
|
|
2069
|
+
console.log(mh.resolvido(r.location));
|
|
2070
|
+
console.log(mh.metodo(r.metodo));
|
|
2071
|
+
console.log(mh.sha(r.sha256));
|
|
2072
|
+
console.log(mh.linhas(r.intervalo ? `${r.intervalo.inicio}-${r.intervalo.fim}` : mh.naoAplicavel));
|
|
2056
2073
|
console.log('');
|
|
2057
2074
|
console.log(r.conteudo);
|
|
2058
2075
|
return 0;
|
|
2059
2076
|
}
|
|
2060
|
-
console.error(
|
|
2077
|
+
console.error(mh.desconhecido(sub));
|
|
2061
2078
|
return 2;
|
|
2062
2079
|
}
|
|
2080
|
+
/**
|
|
2081
|
+
* RM-059 (F7, T7.1; DD4 do plano dos mods): `ork ship publicar <thread>`. So publica no modo que ja autoriza push
|
|
2082
|
+
* (#Auto e #Maestro); a autorizacao humana na linha nao vale aqui (D1 da ork-rm059pista), e o push do modo que pausa
|
|
2083
|
+
* e do dono, no terminal dele.
|
|
2084
|
+
*/
|
|
2085
|
+
function comandoShipPublicar(carregado, args) {
|
|
2086
|
+
const m = (0, locale_1.msg)().ship;
|
|
2087
|
+
const p = m.publicar;
|
|
2088
|
+
if (args.opcoes['autorizar-push'] !== undefined) {
|
|
2089
|
+
console.error(p.semAutorizarPush);
|
|
2090
|
+
return 2;
|
|
2091
|
+
}
|
|
2092
|
+
const alvo = args.posicionais[2];
|
|
2093
|
+
if (!alvo || args.posicionais.length > 3) {
|
|
2094
|
+
console.error(p.uso);
|
|
2095
|
+
return 2;
|
|
2096
|
+
}
|
|
2097
|
+
if (args.opcoes.remoto !== undefined)
|
|
2098
|
+
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
2099
|
+
// Como o ship: o que o publicar grava (ledger, detalhe e correcao do --json) nasce em pt-BR.
|
|
2100
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_publicar_1.publicarEntrega)(carregado, alvo, {
|
|
2101
|
+
remoto: texto(args.opcoes.remoto), dryRun: args.opcoes['dry-run'] === true,
|
|
2102
|
+
}));
|
|
2103
|
+
if (args.opcoes.json === true) {
|
|
2104
|
+
console.log(JSON.stringify(r, null, 2));
|
|
2105
|
+
return r.acao === 'recusada' ? 1 : 0;
|
|
2106
|
+
}
|
|
2107
|
+
for (const linha of (0, ship_publicar_1.linhasDaPublicacao)(r))
|
|
2108
|
+
console.log(linha);
|
|
2109
|
+
return r.acao === 'recusada' ? 1 : 0;
|
|
2110
|
+
}
|
|
2111
|
+
/** RM-059 (F7, T7.1): `ork ship pista [<thread>]`, as etapas da entrega e o proximo passo que o nucleo declara. */
|
|
2112
|
+
function comandoShipPista(carregado, args) {
|
|
2113
|
+
const p = (0, locale_1.msg)().ship.publicar;
|
|
2114
|
+
if (args.posicionais.length > 3) {
|
|
2115
|
+
console.error(p.usoPista);
|
|
2116
|
+
return 2;
|
|
2117
|
+
}
|
|
2118
|
+
if (args.opcoes.remoto !== undefined)
|
|
2119
|
+
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
2120
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_publicar_1.pistaDeEntrega)(carregado, { remoto: texto(args.opcoes.remoto), thread: args.posicionais[2] }));
|
|
2121
|
+
if (args.opcoes.json === true) {
|
|
2122
|
+
console.log(JSON.stringify(r, null, 2));
|
|
2123
|
+
return 0;
|
|
2124
|
+
}
|
|
2125
|
+
console.log(p.cabecalhoPista((0, horario_1.formatarDataHora)(r.lidoEm), r.remoto, r.base));
|
|
2126
|
+
if (!r.remotoLido)
|
|
2127
|
+
console.log(p.remotoNaoRespondeu(r.remoto));
|
|
2128
|
+
if (!r.prsLidos)
|
|
2129
|
+
console.log(p.prsNaoResponderam((0, locale_1.remontar)(r.prsNaoLidos ?? '-')));
|
|
2130
|
+
if (!r.pistas.length)
|
|
2131
|
+
console.log(p.semPistas);
|
|
2132
|
+
for (const pista of r.pistas) {
|
|
2133
|
+
console.log('');
|
|
2134
|
+
console.log(p.linhaDaThread(pista.thread, pista.tag, pista.branch));
|
|
2135
|
+
console.log(` ${pista.etapas.map((e) => `${p.nomeDaEtapa(e.id)} ${p.marcaDaEtapa(e.estado)}`).join(' | ')}`);
|
|
2136
|
+
for (const e of pista.etapas.filter((x) => x.estado !== 'feita' && x.estado !== 'nao-se-aplica')) {
|
|
2137
|
+
console.log(` ${p.nomeDaEtapa(e.id)}: ${(0, locale_1.remontar)(e.texto)}`);
|
|
2138
|
+
}
|
|
2139
|
+
console.log(p.linhaDoProximo((0, locale_1.remontar)(pista.proximo.texto), pista.proximo.comando));
|
|
2140
|
+
}
|
|
2141
|
+
return 0;
|
|
2142
|
+
}
|
|
2063
2143
|
function comandoShip(args) {
|
|
2064
2144
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2145
|
+
const m = (0, locale_1.msg)().ship;
|
|
2146
|
+
if (args.posicionais[1] === 'publicar')
|
|
2147
|
+
return comandoShipPublicar(carregado, args);
|
|
2148
|
+
if (args.posicionais[1] === 'pista')
|
|
2149
|
+
return comandoShipPista(carregado, args);
|
|
2065
2150
|
if (args.posicionais[1] === 'registrar-pr') {
|
|
2066
2151
|
// I-57 (RM-008): a entrega feita por PR vira ship_done, provada no remoto e no CI.
|
|
2067
2152
|
const alvo = args.posicionais[2];
|
|
@@ -2069,7 +2154,7 @@ function comandoShip(args) {
|
|
|
2069
2154
|
// RM-037 (defeito 5): PR mesclado em repositorio externo declarado em ci.external_repositories.
|
|
2070
2155
|
const repo = texto(args.opcoes.repo), numeroDoPr = texto(args.opcoes.pr);
|
|
2071
2156
|
if ((!alvo && args.opcoes.todas !== true) || (!!repo !== !!numeroDoPr) || (repo && !alvo)) {
|
|
2072
|
-
console.error(
|
|
2157
|
+
console.error(m.usoRegistrarPr);
|
|
2073
2158
|
return 2;
|
|
2074
2159
|
}
|
|
2075
2160
|
// RM-047: o `--remoto` da linha de comando so chega ao git como nome de remoto (ship.remoto-invalido).
|
|
@@ -2077,27 +2162,29 @@ function comandoShip(args) {
|
|
|
2077
2162
|
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
2078
2163
|
// RM-037 (fatia 3, defeito 6): o `--dry-run` era ignorado, e o ensaio gravava o ship_done de verdade.
|
|
2079
2164
|
const dryRun = args.opcoes['dry-run'] === true;
|
|
2080
|
-
|
|
2081
|
-
|
|
2165
|
+
// RM-061 (F2b, G2): o ship_done e o motivo nascem em pt-BR; so a impressao segue o locale.
|
|
2166
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => alvo && repo
|
|
2167
|
+
? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun, remoto })]
|
|
2168
|
+
: alvo ? [(0, entrega_pr_1.registrarEntregaPorPr)(carregado, alvo, { remoto, dryRun })] : (0, entrega_pr_1.registrarEntregasPorPr)(carregado, { remoto, dryRun }));
|
|
2082
2169
|
if (args.opcoes.json === true) {
|
|
2083
2170
|
console.log(JSON.stringify(r, null, 2));
|
|
2084
2171
|
return r.some((x) => x.acao === 'recusada') ? 1 : 0;
|
|
2085
2172
|
}
|
|
2086
2173
|
if (dryRun)
|
|
2087
|
-
console.log(
|
|
2174
|
+
console.log(m.ensaio);
|
|
2088
2175
|
if (r.length === 0)
|
|
2089
|
-
console.log(
|
|
2176
|
+
console.log(m.nenhumaComMerge);
|
|
2090
2177
|
for (const x of r)
|
|
2091
|
-
console.log(
|
|
2178
|
+
console.log(m.linhaDoRegistro(x.thread, m.acoes[x.acao] ?? x.acao, (0, locale_1.remontar)(x.motivo)));
|
|
2092
2179
|
// RM-044 (A3): a pagina que o push da base vai reprovar em docs.paridade.merge, com o comando que corrige.
|
|
2093
2180
|
// So aviso: nada e gravado e o codigo de saida nao muda.
|
|
2094
2181
|
const pendentes = r.flatMap((x) => x.docsPendentes.map((d) => ({ thread: x.thread, ...d })));
|
|
2095
2182
|
if (pendentes.length) {
|
|
2096
2183
|
console.log('');
|
|
2097
|
-
console.log(
|
|
2184
|
+
console.log(m.avisoDeDocs(pendentes.length));
|
|
2098
2185
|
for (const d of pendentes) {
|
|
2099
|
-
console.log(
|
|
2100
|
-
console.log(
|
|
2186
|
+
console.log(m.docPendente(d.id, d.arquivo, d.merge.slice(0, 7), d.thread, d.codigo));
|
|
2187
|
+
console.log(m.docPendenteComando(d.comando));
|
|
2101
2188
|
}
|
|
2102
2189
|
}
|
|
2103
2190
|
const registradas = r.filter((x) => x.acao === 'registrou').length;
|
|
@@ -2106,20 +2193,20 @@ function comandoShip(args) {
|
|
|
2106
2193
|
console.log('');
|
|
2107
2194
|
// RM-008 (03/10): o texto ensina a forma COM a thread. A forma sem thread fechava tambem as
|
|
2108
2195
|
// entregues de outras frentes paralelas, e era ela que os condutores copiavam daqui.
|
|
2109
|
-
console.log(
|
|
2196
|
+
console.log(m.registradas(registradas));
|
|
2110
2197
|
for (const x of r.filter((y) => y.acao === 'registrou'))
|
|
2111
2198
|
console.log(` ork master ${x.thread} --aceitar-omissao`);
|
|
2112
2199
|
}
|
|
2113
2200
|
if (registrariam) {
|
|
2114
2201
|
console.log('');
|
|
2115
|
-
console.log(
|
|
2202
|
+
console.log(m.registrariam(registrariam));
|
|
2116
2203
|
}
|
|
2117
2204
|
return r.some((x) => x.acao === 'recusada') ? 1 : 0;
|
|
2118
2205
|
}
|
|
2119
2206
|
const id = args.posicionais[1];
|
|
2120
2207
|
const para = texto(args.opcoes.para) ?? texto(args.opcoes.to);
|
|
2121
2208
|
if (!id || !para) {
|
|
2122
|
-
console.error(
|
|
2209
|
+
console.error(m.uso);
|
|
2123
2210
|
return 2;
|
|
2124
2211
|
}
|
|
2125
2212
|
// RM-047: como no registrar-pr, o `--remoto` so chega ao git como nome de remoto (ship.remoto-invalido),
|
|
@@ -2127,25 +2214,47 @@ function comandoShip(args) {
|
|
|
2127
2214
|
if (args.opcoes.remoto !== undefined)
|
|
2128
2215
|
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
2129
2216
|
const autorizar = args.opcoes['autorizar-push'];
|
|
2130
|
-
|
|
2217
|
+
// Security scan: `--allow-unscanned` exige quem autoriza; sem valor nao vira autorizacao em silencio.
|
|
2218
|
+
const semScan = args.opcoes['allow-unscanned'];
|
|
2219
|
+
if (semScan !== undefined && (typeof semScan !== 'string' || !semScan.trim())) {
|
|
2220
|
+
console.error(m.allowUnscannedSemValor);
|
|
2221
|
+
return 2;
|
|
2222
|
+
}
|
|
2223
|
+
// RM-061 (F2b, G2): o que o ship grava (ledger, verificacao, mensagem do merge) nasce em pt-BR.
|
|
2224
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_1.ship)(carregado, id, {
|
|
2131
2225
|
para,
|
|
2132
2226
|
de: texto(args.opcoes.de),
|
|
2133
2227
|
remoto: texto(args.opcoes.remoto),
|
|
2134
2228
|
mensagem: texto(args.opcoes.mensagem),
|
|
2135
2229
|
dryRun: args.opcoes['dry-run'] === true,
|
|
2136
2230
|
autorizarPush: typeof autorizar === 'string' ? autorizar : undefined,
|
|
2231
|
+
allowUnscanned: typeof semScan === 'string' ? semScan.trim() : undefined,
|
|
2137
2232
|
semPush: args.opcoes['sem-push'] === true,
|
|
2138
|
-
|
|
2233
|
+
// RM-058 N2 (A1 da rodada 2 do CHECK): o `--esperar` chega à fila pesada da verificação do ship, com aviso.
|
|
2234
|
+
...((f) => ({ esperarFilaPesadaMs: f.esperarMs, avisoDaFilaPesada: { aoEsperar: f.aoEsperar, comandoDeEsperar: f.comandoDeEsperar } }))(filaPesadaDoCli(args, 'verify', `ork ship ${id} --para ${para} --esperar 30`)),
|
|
2235
|
+
}));
|
|
2139
2236
|
console.log((0, ship_1.textoDoShip)(r));
|
|
2140
2237
|
return r.ok ? 0 : 1;
|
|
2141
2238
|
}
|
|
2239
|
+
/**
|
|
2240
|
+
* RM-043 (sobra achada na RM-044): opcoes que o `portfolio show` herdou do `objective`,
|
|
2241
|
+
* aposentado na I-43. A ajuda as listava e o `parseArgs` as aceitava, mas o `show` nunca as
|
|
2242
|
+
* leu: eram ignoradas em silencio. A recusa e tipada e diz para onde ir, como a do
|
|
2243
|
+
* `objective.aposentado`.
|
|
2244
|
+
*/
|
|
2245
|
+
const SOBRAS_DO_OBJECTIVE = ['constraints', 'outcomes', 'threads', 'execution-runtime', 'validation-runtimes'];
|
|
2246
|
+
function recusarSobraDoObjective(opcao) {
|
|
2247
|
+
console.error((0, locale_1.msg)().operacao.produto.portfolio.opcaoAposentada(opcao));
|
|
2248
|
+
return 2;
|
|
2249
|
+
}
|
|
2142
2250
|
function comandoPortfolio(args) {
|
|
2143
2251
|
const root = (0, manifest_1.exigirManifesto)().raiz;
|
|
2144
2252
|
const sub = args.posicionais[1] ?? 'list';
|
|
2253
|
+
const m = (0, locale_1.msg)().operacao.produto.portfolio;
|
|
2145
2254
|
if (sub === 'inspect') {
|
|
2146
2255
|
const id = args.posicionais[2];
|
|
2147
2256
|
if (!id) {
|
|
2148
|
-
console.error(
|
|
2257
|
+
console.error(m.usoInspect);
|
|
2149
2258
|
return 2;
|
|
2150
2259
|
}
|
|
2151
2260
|
console.log(JSON.stringify((0, portfolio_context_1.inspectPortfolio)(root, id), null, 2));
|
|
@@ -2157,33 +2266,36 @@ function comandoPortfolio(args) {
|
|
|
2157
2266
|
const rawKind = args.posicionais[2];
|
|
2158
2267
|
const kind = rawKind ? aliases[rawKind] : undefined;
|
|
2159
2268
|
if (rawKind && !kind) {
|
|
2160
|
-
console.error(
|
|
2269
|
+
console.error(m.tipo);
|
|
2161
2270
|
return 2;
|
|
2162
2271
|
}
|
|
2163
2272
|
const items = (0, portfolio_1.listEntities)(root, kind, texto(args.opcoes.parent));
|
|
2164
2273
|
console.log(args.opcoes.json === true ? JSON.stringify({ schema: 'ork.portfolio-list/v1', updatedAt: (0, portfolio_1.readPortfolio)(root).updatedAt, items }, null, 2)
|
|
2165
|
-
: items.length ? items.map((item) => `${item.id}\t${item.kind}\t${item.status}\t${item.title}`).join('\n') :
|
|
2274
|
+
: items.length ? items.map((item) => `${item.id}\t${item.kind}\t${item.status}\t${item.title}`).join('\n') : m.vazio);
|
|
2166
2275
|
return 0;
|
|
2167
2276
|
}
|
|
2168
2277
|
if (sub === 'show') {
|
|
2278
|
+
const sobra = SOBRAS_DO_OBJECTIVE.find((opcao) => args.opcoes[opcao] !== undefined);
|
|
2279
|
+
if (sobra)
|
|
2280
|
+
return recusarSobraDoObjective(sobra);
|
|
2169
2281
|
const id = args.posicionais[2];
|
|
2170
2282
|
if (!id) {
|
|
2171
|
-
console.error(
|
|
2283
|
+
console.error(m.usoShow);
|
|
2172
2284
|
return 2;
|
|
2173
2285
|
}
|
|
2174
2286
|
const item = (0, portfolio_1.findEntity)(root, id);
|
|
2175
2287
|
if (!item) {
|
|
2176
|
-
console.error(
|
|
2288
|
+
console.error(m.naoEncontrada(id));
|
|
2177
2289
|
return 1;
|
|
2178
2290
|
}
|
|
2179
|
-
console.log(args.opcoes.json === true ? JSON.stringify(item, null, 2) :
|
|
2291
|
+
console.log(args.opcoes.json === true ? JSON.stringify(item, null, 2) : m.estado(item.id, item.title, item.status));
|
|
2180
2292
|
return 0;
|
|
2181
2293
|
}
|
|
2182
2294
|
if (sub === 'create') {
|
|
2183
2295
|
const kind = aliases[args.posicionais[2] ?? ''];
|
|
2184
2296
|
const id = args.posicionais[3], title = texto(args.opcoes.title), parent = texto(args.opcoes.parent);
|
|
2185
2297
|
if (!kind || !id || !title) {
|
|
2186
|
-
console.error(
|
|
2298
|
+
console.error(m.usoCreate);
|
|
2187
2299
|
return 2;
|
|
2188
2300
|
}
|
|
2189
2301
|
const common = { id, title, description: texto(args.opcoes.description), ownerId: texto(args.opcoes.owner), status: texto(args.opcoes.status), acceptanceCriteria: split(texto(args.opcoes.acceptance), ';') };
|
|
@@ -2193,7 +2305,7 @@ function comandoPortfolio(args) {
|
|
|
2193
2305
|
console.log(JSON.stringify({ schema: 'ork.portfolio-created/v1', item }, null, 2));
|
|
2194
2306
|
return 0;
|
|
2195
2307
|
}
|
|
2196
|
-
console.error(
|
|
2308
|
+
console.error(m.desconhecido(sub));
|
|
2197
2309
|
return 2;
|
|
2198
2310
|
}
|
|
2199
2311
|
function comandoCreation(args) {
|
|
@@ -2202,8 +2314,9 @@ function comandoCreation(args) {
|
|
|
2202
2314
|
// Fachadas HTTP devem usar a API com principal e authorize autenticados no servidor.
|
|
2203
2315
|
const actor = { principal: `local:uid:${(0, node_os_1.userInfo)().uid}`, authorize: () => { } };
|
|
2204
2316
|
const sub = args.posicionais[1], id = args.posicionais[2];
|
|
2317
|
+
const m = (0, locale_1.msg)().operacao.produto.creation;
|
|
2205
2318
|
if (args.opcoes.principal !== undefined || args.opcoes.por !== undefined)
|
|
2206
|
-
throw new Error(
|
|
2319
|
+
throw new Error(m.identidade);
|
|
2207
2320
|
let result;
|
|
2208
2321
|
if (sub === 'session') {
|
|
2209
2322
|
const portfolio = (0, portfolio_1.readPortfolio)(loaded.raiz);
|
|
@@ -2217,18 +2330,18 @@ function comandoCreation(args) {
|
|
|
2217
2330
|
else if (sub === 'start') {
|
|
2218
2331
|
const file = texto(args.opcoes['input-file']);
|
|
2219
2332
|
if (!file) {
|
|
2220
|
-
console.error(
|
|
2333
|
+
console.error(m.usoStart);
|
|
2221
2334
|
return 2;
|
|
2222
2335
|
}
|
|
2223
2336
|
const content = fs.readFileSync(file, 'utf8');
|
|
2224
2337
|
if (Buffer.byteLength(content) > 100_000)
|
|
2225
|
-
throw new Error(
|
|
2338
|
+
throw new Error(m.arquivoGrande);
|
|
2226
2339
|
result = (0, creation_operation_1.startCreation)(loaded, actor, JSON.parse(content));
|
|
2227
2340
|
}
|
|
2228
2341
|
else if (sub === 'list')
|
|
2229
2342
|
result = (0, creation_operation_store_1.listCreationOperations)(loaded.raiz, actor.principal);
|
|
2230
2343
|
else if (!id) {
|
|
2231
|
-
console.error(
|
|
2344
|
+
console.error(m.exigeId);
|
|
2232
2345
|
return 2;
|
|
2233
2346
|
}
|
|
2234
2347
|
else if (sub === 'show' || sub === 'events') {
|
|
@@ -2238,13 +2351,13 @@ function comandoCreation(args) {
|
|
|
2238
2351
|
else if (sub === 'resume' || sub === 'compensate') {
|
|
2239
2352
|
const version = Number(texto(args.opcoes['expected-version']));
|
|
2240
2353
|
if (!Number.isSafeInteger(version) || version < 1) {
|
|
2241
|
-
console.error(
|
|
2354
|
+
console.error(m.versao);
|
|
2242
2355
|
return 2;
|
|
2243
2356
|
}
|
|
2244
2357
|
result = sub === 'resume' ? (0, creation_operation_1.resumeCreation)(loaded, actor, id, version) : (0, creation_operation_1.compensateCreation)(loaded, actor, id, version);
|
|
2245
2358
|
}
|
|
2246
2359
|
else {
|
|
2247
|
-
console.error(
|
|
2360
|
+
console.error(m.desconhecido);
|
|
2248
2361
|
return 2;
|
|
2249
2362
|
}
|
|
2250
2363
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -2270,28 +2383,33 @@ function comandoCreation(args) {
|
|
|
2270
2383
|
*/
|
|
2271
2384
|
function comandoObjective(args) {
|
|
2272
2385
|
const sub = args.posicionais[1] ?? 'list';
|
|
2273
|
-
console.error(
|
|
2274
|
-
' Ele descrevia um gate que nao bloqueava nada: das 137 threads do projeto, zero\n' +
|
|
2275
|
-
' tinham creationOrigin, que era a unica via pela qual o despacho o consultava.\n' +
|
|
2276
|
-
' As duas vigas que ele guardava viraram propriedade de thread comum:\n' +
|
|
2277
|
-
' ork thread new "<nome>" --modo <MODO> --exige-runtime-diferente\n' +
|
|
2278
|
-
' o CHECK precisa de runtime que o GO nao usou\n' +
|
|
2279
|
-
' ork thread new "<nome>" --modo <MODO> --done "<criterio> :: <comando>"\n' +
|
|
2280
|
-
' criterio de pronto EXECUTAVEL, que vira claim e roda no ork verify\n' +
|
|
2281
|
-
' Os envelopes ja gravados continuam em .orkastery/objectives, intocados.');
|
|
2386
|
+
console.error((0, locale_1.msg)().operacao.produto.objective(sub));
|
|
2282
2387
|
return 2;
|
|
2283
2388
|
}
|
|
2284
2389
|
function comandoCi(args) {
|
|
2285
2390
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2286
2391
|
const sub = args.posicionais[1] ?? 'status';
|
|
2392
|
+
const m = (0, locale_1.msg)().operacao.produto.ci;
|
|
2287
2393
|
if (sub === 'prepare') {
|
|
2288
2394
|
const thread = args.posicionais[2];
|
|
2289
2395
|
if (!thread) {
|
|
2290
|
-
console.error(
|
|
2396
|
+
console.error(m.usoPrepare);
|
|
2291
2397
|
return 2;
|
|
2292
2398
|
}
|
|
2293
|
-
|
|
2294
|
-
|
|
2399
|
+
// RM-061 (F3d, GO-FIX 1): o lint vai ao ledger e o bundle ao disco no escopo pt-BR, como antes do `ci` entrar na
|
|
2400
|
+
// lista (D2); o aviso sai remontado no locale do comando, e a recusa, pela entrada do CLI. As linhas da barreira de
|
|
2401
|
+
// dado privado (RM-062) saem junto com os avisos, na ordem em que nascem.
|
|
2402
|
+
const linhas = [];
|
|
2403
|
+
let arquivo;
|
|
2404
|
+
try {
|
|
2405
|
+
arquivo = (0, locale_1.comLocale)('pt-BR', () => (0, ci_1.prepararBundleCi)(carregado, thread, { aoAvisar: (linha) => linhas.push({ aviso: true, linha }),
|
|
2406
|
+
aoInformar: (linha) => linhas.push({ aviso: false, linha }) }));
|
|
2407
|
+
}
|
|
2408
|
+
finally {
|
|
2409
|
+
for (const { aviso, linha } of linhas)
|
|
2410
|
+
console.log(aviso ? m.aviso((0, locale_1.remontar)(linha)) : (0, locale_1.remontar)(linha));
|
|
2411
|
+
}
|
|
2412
|
+
console.log(m.bundle(arquivo));
|
|
2295
2413
|
return 0;
|
|
2296
2414
|
}
|
|
2297
2415
|
if (sub === 'run') {
|
|
@@ -2310,34 +2428,86 @@ function comandoCi(args) {
|
|
|
2310
2428
|
}
|
|
2311
2429
|
const thread = args.posicionais[2];
|
|
2312
2430
|
if (!thread) {
|
|
2313
|
-
console.error(
|
|
2431
|
+
console.error(m.usoRun);
|
|
2314
2432
|
return 2;
|
|
2315
2433
|
}
|
|
2316
2434
|
const result = (0, ci_1.executarCi)(carregado, thread);
|
|
2317
|
-
console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) :
|
|
2435
|
+
console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : m.resultado(result.status.ok, result.status.detail));
|
|
2318
2436
|
return result.status.ok ? 0 : 1;
|
|
2319
2437
|
}
|
|
2320
2438
|
if (sub === 'status') {
|
|
2321
2439
|
const sha = texto(args.opcoes.sha) ?? args.posicionais[2] ?? (0, util_1.exec)('git', ['rev-parse', 'HEAD'], carregado.raiz).stdout.trim();
|
|
2322
2440
|
if (!/^[0-9a-f]{40}$/.test(sha)) {
|
|
2323
2441
|
// Ensaio de 03/10 (R4): `--sha HEAD` ou um sha curto respondiam so a linha de uso, sem dizer por que.
|
|
2324
|
-
console.error(
|
|
2325
|
-
|
|
2326
|
-
console.error('uso: ork ci status --sha <sha de 40 caracteres> [--remoto origin]');
|
|
2442
|
+
console.error(m.sha);
|
|
2443
|
+
console.error(m.usoStatus);
|
|
2327
2444
|
return 2;
|
|
2328
2445
|
}
|
|
2329
2446
|
// RM-047: recusa o `--remoto` que nao e nome de remoto mesmo com o gate de CI desligado.
|
|
2330
2447
|
const remoto = (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto === undefined ? 'origin' : args.opcoes.remoto, 'ci');
|
|
2331
2448
|
const result = (0, ci_1.consultarCi)(carregado, sha, remoto);
|
|
2332
|
-
console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) :
|
|
2449
|
+
console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : m.status(result.ok, result.detail));
|
|
2333
2450
|
return result.ok ? 0 : 1;
|
|
2334
2451
|
}
|
|
2335
|
-
console.error(
|
|
2452
|
+
console.error(m.desconhecido(sub));
|
|
2336
2453
|
return 2;
|
|
2337
2454
|
}
|
|
2455
|
+
/**
|
|
2456
|
+
* RM-062 (F1): `ork privado varrer [--base REF] [--json]`, a varredura de dado privado do repositorio do diretorio
|
|
2457
|
+
* atual. Sem `--base`, os nomes e as linhas dos arquivos versionados (o passo do CI); com ela, o diff contra a
|
|
2458
|
+
* merge-base com `REF` e os nao rastreados. Sai 1 com achado sob a policy `dado_privado` em `block` ou sem a policy
|
|
2459
|
+
* (quem roda o comando pediu a varredura); em `warn` e `off`, 0 com o aviso. Sai 2 quando a varredura nao roda.
|
|
2460
|
+
*/
|
|
2461
|
+
function comandoPrivado(args) {
|
|
2462
|
+
const uso = 'uso: ork privado varrer [--base REF] [--json]';
|
|
2463
|
+
const opcoes = Object.keys(args.opcoes);
|
|
2464
|
+
if (args.posicionais[1] !== 'varrer' || args.posicionais.length > 2 || opcoes.some((k) => k !== 'base' && k !== 'json') ||
|
|
2465
|
+
('json' in args.opcoes && args.opcoes.json !== true) || ('base' in args.opcoes && typeof args.opcoes.base !== 'string')) {
|
|
2466
|
+
console.error(uso);
|
|
2467
|
+
return 2;
|
|
2468
|
+
}
|
|
2469
|
+
const topo = (0, util_1.exec)('git', ['rev-parse', '--show-toplevel'], process.cwd());
|
|
2470
|
+
if (!topo.ok) {
|
|
2471
|
+
console.error('erro: privado varrer: o diretorio atual nao esta num repositorio git');
|
|
2472
|
+
return 2;
|
|
2473
|
+
}
|
|
2474
|
+
const raiz = topo.stdout.trim();
|
|
2475
|
+
const carregado = (0, manifest_1.carregarManifesto)(raiz);
|
|
2476
|
+
const severidade = carregado ? (0, policies_1.severidadeDeclarada)(carregado.manifesto, 'dado_privado') : null;
|
|
2477
|
+
let estado = null;
|
|
2478
|
+
try {
|
|
2479
|
+
estado = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
2480
|
+
}
|
|
2481
|
+
catch {
|
|
2482
|
+
estado = null;
|
|
2483
|
+
}
|
|
2484
|
+
const contexto = (0, dado_privado_1.contextoDaVarredura)(raiz, estado);
|
|
2485
|
+
const ref = texto(args.opcoes.base);
|
|
2486
|
+
const base = contexto.ok && ref ? (0, dado_privado_1.mergeBase)(raiz, ref) : null;
|
|
2487
|
+
const v = !contexto.ok ? null : ref ? (base ? (0, dado_privado_1.varrerDiff)(contexto.valor, base) : null) : (0, dado_privado_1.varrerArvore)(contexto.valor);
|
|
2488
|
+
const erro = !contexto.ok ? contexto.erro : !v ? `--base ${ref} nao tem merge-base com HEAD` : v.erro;
|
|
2489
|
+
const achados = v?.achados.length ?? 0;
|
|
2490
|
+
const reprova = !erro && achados > 0 && (severidade === null || severidade === 'block');
|
|
2491
|
+
if (args.opcoes.json === true) {
|
|
2492
|
+
console.log(JSON.stringify({ ...(v ?? {}), erro, severidade, ok: !erro && !reprova }, null, 2));
|
|
2493
|
+
}
|
|
2494
|
+
else {
|
|
2495
|
+
if (v)
|
|
2496
|
+
for (const linha of (0, dado_privado_1.relatorioDoDadoPrivado)(v))
|
|
2497
|
+
console.log(linha);
|
|
2498
|
+
const policy = severidade === null ? 'policy dado_privado nao declarada: o comando explicito reprova'
|
|
2499
|
+
: `policy dado_privado em ${severidade}`;
|
|
2500
|
+
console.log(erro ? `Veredito: NAO RODOU (${erro})`
|
|
2501
|
+
: !achados ? 'Veredito: nenhum dado privado nas linhas e nos nomes varridos.'
|
|
2502
|
+
: reprova ? `Veredito: REPROVADO (${achados} achado(s) de dado privado; ${policy})`
|
|
2503
|
+
: `Veredito: AVISO (${achados} achado(s) de dado privado; ${policy}, que nao reprova)`);
|
|
2504
|
+
}
|
|
2505
|
+
return erro ? 2 : reprova ? 1 : 0;
|
|
2506
|
+
}
|
|
2338
2507
|
function comandoLease(args) {
|
|
2339
2508
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2340
2509
|
const sub = args.posicionais[1];
|
|
2510
|
+
const ml = (0, locale_1.msg)().operacao.restante.lease;
|
|
2341
2511
|
if (sub === undefined || sub === 'list') {
|
|
2342
2512
|
console.log((0, leases_1.tabelaDeLeases)(carregado.raiz));
|
|
2343
2513
|
return 0;
|
|
@@ -2345,38 +2515,38 @@ function comandoLease(args) {
|
|
|
2345
2515
|
if (sub === 'acquire' || sub === 'take') {
|
|
2346
2516
|
const nome = args.posicionais[2];
|
|
2347
2517
|
const thread = texto(args.opcoes.thread);
|
|
2348
|
-
const motivo = texto(args.opcoes.motivo) ??
|
|
2518
|
+
const motivo = texto(args.opcoes.motivo) ?? (0, locale_1.msg)('pt-BR').operacao.restante.lease.semMotivo;
|
|
2349
2519
|
if (!nome || !thread) {
|
|
2350
|
-
console.error(
|
|
2520
|
+
console.error(ml.usoAcquire);
|
|
2351
2521
|
return 2;
|
|
2352
2522
|
}
|
|
2353
2523
|
(0, thread_1.lerThread)(carregado.raiz, thread);
|
|
2354
|
-
const r = (0, leases_1.adquirirRegiao)(carregado.raiz, nome, { thread, motivo });
|
|
2524
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, leases_1.adquirirRegiao)(carregado.raiz, nome, { thread, motivo }));
|
|
2355
2525
|
if (r.ok) {
|
|
2356
|
-
console.log(
|
|
2357
|
-
console.log(
|
|
2526
|
+
console.log(ml.adquirido(r.nome, r.tipo, thread));
|
|
2527
|
+
console.log(ml.expira((0, horario_1.formatarDataHoraRotulada)(r.lease?.expiraEm)));
|
|
2358
2528
|
if (r.tomadoDeVencido)
|
|
2359
|
-
console.log(
|
|
2529
|
+
console.log(ml.tomado);
|
|
2360
2530
|
return 0;
|
|
2361
2531
|
}
|
|
2362
|
-
console.error(
|
|
2363
|
-
console.error(
|
|
2364
|
-
console.error(
|
|
2365
|
-
console.error(
|
|
2366
|
-
console.error(
|
|
2532
|
+
console.error(ml.naoAdquirido(r.nome));
|
|
2533
|
+
console.error(ml.motivoTipado(r.motivo));
|
|
2534
|
+
console.error(ml.detalhe((0, horario_1.localizarTextoRotulado)(r.detalhe)));
|
|
2535
|
+
console.error(ml.posicao(r.posicaoNaFila));
|
|
2536
|
+
console.error(ml.correcao(r.correcao));
|
|
2367
2537
|
return 1;
|
|
2368
2538
|
}
|
|
2369
2539
|
if (sub === 'release') {
|
|
2370
2540
|
const nome = args.posicionais[2];
|
|
2371
2541
|
if (!nome) {
|
|
2372
|
-
console.error(
|
|
2542
|
+
console.error(ml.usoRelease);
|
|
2373
2543
|
return 2;
|
|
2374
2544
|
}
|
|
2375
|
-
const r = (0, leases_1.liberar)(carregado.raiz, nome, texto(args.opcoes.thread) ?? '', args.opcoes.forcar === true);
|
|
2545
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, leases_1.liberar)(carregado.raiz, nome, texto(args.opcoes.thread) ?? '', args.opcoes.forcar === true));
|
|
2376
2546
|
console.log(r.detalhe);
|
|
2377
2547
|
return r.ok ? 0 : 1;
|
|
2378
2548
|
}
|
|
2379
|
-
console.error(
|
|
2549
|
+
console.error(ml.desconhecido(sub));
|
|
2380
2550
|
return 2;
|
|
2381
2551
|
}
|
|
2382
2552
|
/**
|
|
@@ -2400,6 +2570,7 @@ function comandoBoard(args) {
|
|
|
2400
2570
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2401
2571
|
const sub = args.posicionais[1];
|
|
2402
2572
|
const todos = args.opcoes.all === true || args.opcoes.todos === true;
|
|
2573
|
+
const mb = (0, locale_1.msg)().operacao.restante.board;
|
|
2403
2574
|
if (sub === 'plan' || sub === 'plano') {
|
|
2404
2575
|
const plano = (0, board_1.planejar)(carregado);
|
|
2405
2576
|
const consulta = consultaDoBoard(carregado, { plano: true, todos: false });
|
|
@@ -2410,7 +2581,7 @@ function comandoBoard(args) {
|
|
|
2410
2581
|
return 0;
|
|
2411
2582
|
}
|
|
2412
2583
|
if (sub === 'reap') {
|
|
2413
|
-
const devolvidas = (0, board_1.devolverVagas)(carregado, { por: texto(args.opcoes.por) });
|
|
2584
|
+
const devolvidas = (0, locale_1.comLocale)('pt-BR', () => (0, board_1.devolverVagas)(carregado, { por: texto(args.opcoes.por) }));
|
|
2414
2585
|
if (args.opcoes.json === true)
|
|
2415
2586
|
console.log(JSON.stringify(devolvidas, null, 2));
|
|
2416
2587
|
else
|
|
@@ -2418,8 +2589,8 @@ function comandoBoard(args) {
|
|
|
2418
2589
|
return 0;
|
|
2419
2590
|
}
|
|
2420
2591
|
if (sub !== undefined && sub !== 'list') {
|
|
2421
|
-
console.error(
|
|
2422
|
-
console.error(
|
|
2592
|
+
console.error(mb.desconhecido(sub));
|
|
2593
|
+
console.error(mb.uso);
|
|
2423
2594
|
return 2;
|
|
2424
2595
|
}
|
|
2425
2596
|
const consulta = consultaDoBoard(carregado, { plano: false, todos });
|
|
@@ -2435,7 +2606,7 @@ function comandoBoard(args) {
|
|
|
2435
2606
|
console.log('');
|
|
2436
2607
|
// RM-052: sem o remoto, nada foi lido; dizer "nenhuma publicou" seria a frase do incidente de 29/09.
|
|
2437
2608
|
if (consulta.projeto.remoto === null) {
|
|
2438
|
-
console.log(
|
|
2609
|
+
console.log(mb.semRemoto(carregado.manifesto.project.name, carregado.manifesto.fabrica.remoto));
|
|
2439
2610
|
}
|
|
2440
2611
|
else {
|
|
2441
2612
|
const painel = (0, fabrica_estado_1.lerFabrica)(carregado.raiz, { remoto: carregado.manifesto.fabrica.remoto,
|
|
@@ -2455,6 +2626,10 @@ const CONTRATO_DO_BOARD = 'ork.board/v1';
|
|
|
2455
2626
|
function comandoFabrica(args) {
|
|
2456
2627
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2457
2628
|
const sub = args.posicionais[1];
|
|
2629
|
+
const mf = (0, locale_1.msg)().operacao.restante.fabrica;
|
|
2630
|
+
// RM-063 (F1): a batida e do crontab desta maquina; nao le nem escreve o remoto.
|
|
2631
|
+
if (sub === 'batida')
|
|
2632
|
+
return comandoDaBatida(carregado, args);
|
|
2458
2633
|
// RM-047: o remoto vem do manifesto de quem fez o repositorio; fora do formato, recusa antes do git.
|
|
2459
2634
|
// O `publicar` recusa dentro do try (publicarMaquina), para o silencioso deixar a recusa no log.
|
|
2460
2635
|
const remoto = texto(args.opcoes.remoto) ?? carregado.manifesto.fabrica.remoto;
|
|
@@ -2472,12 +2647,13 @@ function comandoFabrica(args) {
|
|
|
2472
2647
|
console.log(JSON.stringify(r, null, 2));
|
|
2473
2648
|
else
|
|
2474
2649
|
console.log(r.acao === 'publicou'
|
|
2475
|
-
?
|
|
2476
|
-
: r.acao === 'ocupado'
|
|
2477
|
-
? `Fabrica: outra publicacao desta maquina esta em andamento; tente de novo em instantes.`
|
|
2478
|
-
: `Fabrica: retrato de ${r.maquina} igual ao ultimo publicado; nada a enviar (use --forcar para publicar mesmo assim).`);
|
|
2650
|
+
? mf.publicou(r.maquina, r.threads, r.commit?.slice(0, 7), r.tentativas)
|
|
2651
|
+
: r.acao === 'ocupado' ? mf.ocupada : mf.igual(r.maquina));
|
|
2479
2652
|
if (!(0, maquina_1.fabricaCompartilhada)(carregado.manifesto) && !silencioso) {
|
|
2480
|
-
console.log(
|
|
2653
|
+
console.log(mf.soQuandoPede);
|
|
2654
|
+
// RM-047 (P5): o manifesto que pede a fabrica nao liga a publicacao desta maquina.
|
|
2655
|
+
if (carregado.manifesto.fabrica.compartilhada)
|
|
2656
|
+
console.log(mf.manifestoPede);
|
|
2481
2657
|
}
|
|
2482
2658
|
return 0;
|
|
2483
2659
|
}
|
|
@@ -2498,26 +2674,25 @@ function comandoFabrica(args) {
|
|
|
2498
2674
|
const avisoDoRegistro = (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'fabrica entrar');
|
|
2499
2675
|
if (avisoDoRegistro)
|
|
2500
2676
|
console.error(avisoDoRegistro);
|
|
2501
|
-
console.log(
|
|
2502
|
-
console.log(
|
|
2677
|
+
console.log(mf.entrou(config.nome));
|
|
2678
|
+
console.log(mf.primeiro(r.threads, r.commit?.slice(0, 7)));
|
|
2503
2679
|
if (process.env.ORK_MAQUINA && process.env.ORK_MAQUINA.trim() !== config.nome) {
|
|
2504
|
-
console.log(
|
|
2680
|
+
console.log(mf.maquinaAmbiente(process.env.ORK_MAQUINA));
|
|
2505
2681
|
}
|
|
2506
2682
|
return 0;
|
|
2507
2683
|
}
|
|
2508
2684
|
if (sub === 'sair') {
|
|
2509
2685
|
const config = (0, maquina_1.gravarConfigDaMaquina)({ fabricaCompartilhada: false });
|
|
2510
2686
|
const r = (0, fabrica_estado_1.removerMaquina)(carregado, { remoto });
|
|
2511
|
-
console.log(
|
|
2512
|
-
(r ? ` Retrato removido de ork/fabrica-estado (${r.slice(0, 7)}).` : ' Nao havia retrato desta maquina na branch.'));
|
|
2687
|
+
console.log(mf.saiu((0, maquina_1.nomeDaMaquina)(), r ? r.slice(0, 7) : null));
|
|
2513
2688
|
if ((0, maquina_1.fabricaCompartilhada)(carregado.manifesto))
|
|
2514
|
-
console.log(
|
|
2689
|
+
console.log(mf.ambienteLiga);
|
|
2515
2690
|
void config;
|
|
2516
2691
|
return 0;
|
|
2517
2692
|
}
|
|
2518
2693
|
if (sub !== undefined && sub !== 'list') {
|
|
2519
|
-
console.error(
|
|
2520
|
-
console.error(
|
|
2694
|
+
console.error(mf.desconhecido(sub));
|
|
2695
|
+
console.error(mf.uso);
|
|
2521
2696
|
return 2;
|
|
2522
2697
|
}
|
|
2523
2698
|
// RM-052: a fabrica le a branch de UM projeto, no remoto dele; o cabecalho diz qual e o que ficou de fora.
|
|
@@ -2536,10 +2711,36 @@ function comandoFabrica(args) {
|
|
|
2536
2711
|
}
|
|
2537
2712
|
console.log([...(0, projeto_alvo_1.linhasDaConsulta)(consulta), ''].join('\n'));
|
|
2538
2713
|
console.log(url === null
|
|
2539
|
-
?
|
|
2714
|
+
? mf.semRemoto(carregado.manifesto.project.name, remoto)
|
|
2540
2715
|
: (0, fabrica_estado_1.textoDaFabrica)(painel, (0, maquina_1.nomeDaMaquina)()));
|
|
2716
|
+
// RM-047 (P5): o manifesto pede a fabrica, mas quem liga a publicacao e a maquina.
|
|
2717
|
+
const pedida = (0, maquina_1.avisoDaFabricaPedida)(carregado.manifesto);
|
|
2718
|
+
if (pedida)
|
|
2719
|
+
console.log(`\n${pedida}`);
|
|
2541
2720
|
return 0;
|
|
2542
2721
|
}
|
|
2722
|
+
/**
|
|
2723
|
+
* RM-063 (F1): `ork fabrica batida` instala, mostra e remove a batida da varredura do pulse no crontab desta
|
|
2724
|
+
* maquina. `status` sai 0 com a batida instalada e 1 sem ela (ou sem crontab legivel); `instalar` e
|
|
2725
|
+
* `remover` gravam o evento no ledger da maquina quando o crontab muda.
|
|
2726
|
+
*/
|
|
2727
|
+
function comandoDaBatida(carregado, args) {
|
|
2728
|
+
const acao = args.posicionais[2] ?? 'status';
|
|
2729
|
+
const json = args.opcoes.json === true;
|
|
2730
|
+
if (acao === 'status') {
|
|
2731
|
+
const estado = (0, fabrica_batida_1.estadoDaBatida)(carregado.raiz, { projeto: carregado.manifesto.project.name });
|
|
2732
|
+
console.log(json ? JSON.stringify(estado, null, 2) : (0, fabrica_batida_1.textoDoEstadoDaBatida)(estado));
|
|
2733
|
+
return estado.leitura.ok && estado.instalada ? 0 : 1;
|
|
2734
|
+
}
|
|
2735
|
+
if ((acao === 'instalar' || acao === 'remover') && args.posicionais.length === 3) {
|
|
2736
|
+
const por = texto(args.opcoes.por);
|
|
2737
|
+
const r = acao === 'instalar' ? (0, fabrica_batida_1.instalarBatida)(carregado.raiz, { por }) : (0, fabrica_batida_1.removerBatida)(carregado.raiz, { por });
|
|
2738
|
+
console.log(json ? JSON.stringify(r, null, 2) : (0, fabrica_batida_1.textoDoResultadoDaBatida)(r));
|
|
2739
|
+
return 0;
|
|
2740
|
+
}
|
|
2741
|
+
console.error((0, locale_1.msg)().operacao.restante.fabrica.batida.uso);
|
|
2742
|
+
return 2;
|
|
2743
|
+
}
|
|
2543
2744
|
/**
|
|
2544
2745
|
* RM-053: `ork network` e a Orkastery Network, as maquinas de uma pessoa em rede. Roda de qualquer
|
|
2545
2746
|
* diretorio, com ou sem projeto: a rede e da pessoa, nao de um repositorio. O projeto do diretorio
|
|
@@ -2547,84 +2748,77 @@ function comandoFabrica(args) {
|
|
|
2547
2748
|
*/
|
|
2548
2749
|
function comandoNetwork(args) {
|
|
2549
2750
|
const sub = args.posicionais[1];
|
|
2550
|
-
// RM-054: `network roadmap` tem o proprio --projeto e o proprio uso.
|
|
2751
|
+
// RM-054: `network roadmap` tem o proprio --projeto e o proprio uso (e segue em pt-BR, G6 da RM-061 F3b).
|
|
2551
2752
|
if (sub === 'roadmap')
|
|
2552
2753
|
return comandoNetworkRoadmap(args);
|
|
2553
2754
|
const diretorio = process.cwd();
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2755
|
+
// RM-061 (F3b, D3): o texto pelo catalogo; o que se grava (adesao, retrato, casa) roda no escopo pt-BR, e o nome da
|
|
2756
|
+
// maquina, a casa, a forja e o commit saem como vieram.
|
|
2757
|
+
const mn = (0, locale_1.msg)().network;
|
|
2557
2758
|
const forja = texto(args.opcoes.forja), repositorio = texto(args.opcoes.repositorio);
|
|
2558
2759
|
if ((args.opcoes.forja !== undefined && !(0, rede_forja_1.ehNomeDeForja)(forja)) || args.opcoes.repositorio === true ||
|
|
2559
2760
|
(repositorio !== undefined && !/^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,99}\/)?[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/.test(repositorio))) {
|
|
2560
|
-
console.error(uso);
|
|
2761
|
+
console.error(mn.uso);
|
|
2561
2762
|
return 2;
|
|
2562
2763
|
}
|
|
2563
2764
|
if (sub === 'entrar') {
|
|
2564
|
-
const r = (0, rede_1.entrarNaRede)({ maquina: texto(args.opcoes.maquina), forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined,
|
|
2565
|
-
tomarNome: args.opcoes.forcar === true });
|
|
2566
|
-
console.log(
|
|
2567
|
-
|
|
2568
|
-
console.log(` Primeiro retrato publicado (${r.publicacao.commit?.slice(0, 7)}). Depois, esta maquina publica sozinha na batida do pulse`);
|
|
2765
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, rede_1.entrarNaRede)({ maquina: texto(args.opcoes.maquina), forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined,
|
|
2766
|
+
repositorio, diretorio, tomarNome: args.opcoes.forcar === true }));
|
|
2767
|
+
console.log(mn.entrou(r.publicacao.maquina, r.casa.dono, r.casa.forja, (0, rede_1.refDaCasa)(r.casa), r.criado));
|
|
2768
|
+
console.log(mn.primeiroRetrato(String(r.publicacao.commit?.slice(0, 7))));
|
|
2569
2769
|
if (r.publicacao.tomouNome)
|
|
2570
|
-
console.log(
|
|
2571
|
-
console.log(
|
|
2572
|
-
for (const d of r.publicacao.descartados)
|
|
2573
|
-
console.log(
|
|
2574
|
-
}
|
|
2770
|
+
console.log(mn.tomouNome(r.publicacao.maquina));
|
|
2771
|
+
console.log(mn.eAoCriar);
|
|
2772
|
+
for (const d of r.publicacao.descartados)
|
|
2773
|
+
console.log(mn.avisoDescartado(d.padrao, d.campo));
|
|
2575
2774
|
if (process.env.ORK_MAQUINA && process.env.ORK_MAQUINA.trim() !== r.publicacao.maquina) {
|
|
2576
|
-
console.log(
|
|
2775
|
+
console.log(mn.avisoOrkMaquina(process.env.ORK_MAQUINA));
|
|
2577
2776
|
}
|
|
2578
2777
|
return 0;
|
|
2579
2778
|
}
|
|
2580
2779
|
if (sub === 'sair') {
|
|
2581
|
-
const r = (0, rede_1.sairDaRede)({ forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio });
|
|
2582
|
-
console.log(
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
: ` Nao havia retrato desta maquina${r.casa ? ` em ${r.casa}` : ' numa casa alcancavel'}.`));
|
|
2588
|
-
if ((0, maquina_1.lerConfigDaMaquina)()?.fabricaCompartilhada) {
|
|
2589
|
-
console.log(' A fabrica compartilhada dos projetos continua publicando daqui (ork/fabrica-estado); ork fabrica sair em cada um para parar.');
|
|
2590
|
-
}
|
|
2780
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, rede_1.sairDaRede)({ forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio }));
|
|
2781
|
+
console.log(mn.saiu(r.maquina, r.commit ? mn.retratoRemovido(r.casa, r.commit.slice(0, 7))
|
|
2782
|
+
: r.alheio ? mn.retratoDeOutraInstalacao(r.maquina, r.casa, r.mesmoHostname === true)
|
|
2783
|
+
: mn.semRetrato(r.casa)));
|
|
2784
|
+
if ((0, maquina_1.lerConfigDaMaquina)()?.fabricaCompartilhada)
|
|
2785
|
+
console.log(mn.fabricaContinua);
|
|
2591
2786
|
return 0;
|
|
2592
2787
|
}
|
|
2593
2788
|
if (sub === 'publicar') {
|
|
2594
2789
|
if (args.opcoes.silencioso === true) {
|
|
2595
2790
|
// O filho do evento de thread: quem disparou ja tomou a vez (teto de 14 min) e nao espera.
|
|
2791
|
+
// RM-061 (F3b): o rede.log guarda o que aconteceu em pt-BR, com qualquer lingua no ambiente.
|
|
2596
2792
|
try {
|
|
2597
|
-
(0, rede_adesao_1.registrarNaRede)({ ...(0, rede_1.publicarRede)({ diretorio }), origem: 'evento' });
|
|
2793
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, rede_adesao_1.registrarNaRede)({ ...(0, rede_1.publicarRede)({ diretorio }), origem: 'evento' }));
|
|
2598
2794
|
return 0;
|
|
2599
2795
|
}
|
|
2600
2796
|
catch (e) {
|
|
2601
|
-
(0, rede_adesao_1.registrarNaRede)({ acao: 'falhou', origem: 'evento', erro: e.message });
|
|
2797
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, rede_adesao_1.registrarNaRede)({ acao: 'falhou', origem: 'evento', erro: e.message }));
|
|
2602
2798
|
return 1;
|
|
2603
2799
|
}
|
|
2604
2800
|
}
|
|
2605
|
-
const r = (0, rede_1.publicarRede)({ diretorio, forcar: args.opcoes.forcar === true,
|
|
2801
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, rede_1.publicarRede)({ diretorio, forcar: args.opcoes.forcar === true,
|
|
2802
|
+
forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio }));
|
|
2606
2803
|
if (args.opcoes.json === true)
|
|
2607
2804
|
console.log(JSON.stringify(r, null, 2));
|
|
2608
2805
|
else
|
|
2609
|
-
console.log(r.acao === 'publicou'
|
|
2610
|
-
|
|
2611
|
-
: r.acao === 'ocupado'
|
|
2612
|
-
? 'Rede: outra publicacao desta maquina esta em andamento; tente de novo em instantes.'
|
|
2613
|
-
: `Rede: retrato de ${r.maquina} igual ao ultimo publicado em ${r.casa}; nada a enviar (use --forcar para publicar mesmo assim).`);
|
|
2806
|
+
console.log(r.acao === 'publicou' ? mn.publicou(r.maquina, r.casa, r.commit?.slice(0, 7), r.tentativas)
|
|
2807
|
+
: r.acao === 'ocupado' ? mn.ocupado : mn.igual(r.maquina, r.casa));
|
|
2614
2808
|
if (args.opcoes.json !== true) {
|
|
2615
2809
|
for (const d of r.descartados)
|
|
2616
|
-
console.log(
|
|
2810
|
+
console.log(mn.avisoDescartado(d.padrao, d.campo));
|
|
2617
2811
|
}
|
|
2618
2812
|
return 0;
|
|
2619
2813
|
}
|
|
2620
2814
|
if (sub !== undefined && sub !== 'status') {
|
|
2621
|
-
console.error(
|
|
2622
|
-
console.error(uso);
|
|
2815
|
+
console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('network', sub));
|
|
2816
|
+
console.error(mn.uso);
|
|
2623
2817
|
return 2;
|
|
2624
2818
|
}
|
|
2625
2819
|
// RM-054 (fatia 3): o host sem cwd de projeto (RM-052, D3) nao faz do diretorio do gateway um projeto lido.
|
|
2626
2820
|
const doHost = (process.env[projeto_alvo_1.ENV_PROJETO_EXPLICITO] ?? '').trim() === '1';
|
|
2627
|
-
const status = (0, rede_status_1.lerRede)({ semRemoto: args.opcoes['sem-remoto'] === true, diretorio: doHost ? null : diretorio });
|
|
2821
|
+
const status = (0, locale_1.comLocale)('pt-BR', () => (0, rede_status_1.lerRede)({ semRemoto: args.opcoes['sem-remoto'] === true, diretorio: doHost ? null : diretorio }));
|
|
2628
2822
|
console.log(args.opcoes.json === true ? (0, rede_status_1.jsonDaRede)(status) : (0, rede_status_1.textoDaRede)(status));
|
|
2629
2823
|
return 0;
|
|
2630
2824
|
}
|
|
@@ -2635,54 +2829,55 @@ function comandoNetwork(args) {
|
|
|
2635
2829
|
*/
|
|
2636
2830
|
function comandoProjetos(args, projeto) {
|
|
2637
2831
|
const sub = args.posicionais[1] ?? 'list';
|
|
2832
|
+
const m = (0, locale_1.msg)().projetos.cli;
|
|
2638
2833
|
if (sub === 'list' || sub === 'listar') {
|
|
2639
2834
|
const projetos = (0, projeto_alvo_1.listarProjetos)();
|
|
2640
2835
|
if (args.opcoes.json === true) {
|
|
2641
2836
|
console.log(JSON.stringify({ contrato: projeto_alvo_1.CONTRATO_PROJETOS, arquivo: (0, projeto_alvo_1.caminhoDoRegistro)(), projetos }, null, 2));
|
|
2642
2837
|
return 0;
|
|
2643
2838
|
}
|
|
2644
|
-
console.log(
|
|
2839
|
+
console.log(m.titulo((0, projeto_alvo_1.raizParaExibir)((0, projeto_alvo_1.caminhoDoRegistro)())));
|
|
2645
2840
|
console.log('');
|
|
2646
2841
|
if (projetos.length === 0) {
|
|
2647
|
-
console.log(
|
|
2842
|
+
console.log(m.nenhum);
|
|
2648
2843
|
return 0;
|
|
2649
2844
|
}
|
|
2650
|
-
console.log((0, util_1.tabela)([
|
|
2651
|
-
p.nome, p.abbrev || '-', (0, projeto_alvo_1.raizParaExibir)(p.raiz), p.remoto ??
|
|
2845
|
+
console.log((0, util_1.tabela)([...m.cabecalho], projetos.map((p) => [
|
|
2846
|
+
p.nome, p.abbrev || '-', (0, projeto_alvo_1.raizParaExibir)(p.raiz), p.remoto ?? m.semRemoto, p.presente ? m.sim : m.ausente,
|
|
2652
2847
|
(0, horario_1.formatarDataHora)(p.atualizadoEm)
|
|
2653
2848
|
])));
|
|
2654
2849
|
console.log('');
|
|
2655
|
-
console.log(
|
|
2850
|
+
console.log(`${m.selecao} ${(0, horario_1.legendaDoFuso)()}`);
|
|
2656
2851
|
return 0;
|
|
2657
2852
|
}
|
|
2658
2853
|
if (sub === 'registrar') {
|
|
2659
2854
|
const caminho = args.posicionais[2];
|
|
2660
2855
|
if (caminho !== undefined && projeto !== undefined)
|
|
2661
|
-
throw new Error(
|
|
2856
|
+
throw new Error(m.usoRegistrar);
|
|
2662
2857
|
const alvo = caminho === undefined ? (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto ?? null }) : null;
|
|
2663
2858
|
const p = (0, projeto_alvo_1.registrarProjeto)(caminho ?? alvo?.raiz ?? process.cwd(), 'projetos registrar');
|
|
2664
2859
|
if (args.opcoes.json === true) {
|
|
2665
2860
|
console.log(JSON.stringify(p, null, 2));
|
|
2666
2861
|
return 0;
|
|
2667
2862
|
}
|
|
2668
|
-
console.log(
|
|
2863
|
+
console.log(m.registrado(p.nome, p.abbrev || '-', (0, projeto_alvo_1.raizParaExibir)(p.raiz), p.remoto ?? m.semRemoto));
|
|
2669
2864
|
return 0;
|
|
2670
2865
|
}
|
|
2671
2866
|
if (sub === 'esquecer') {
|
|
2672
2867
|
const alvo = args.posicionais[2] ?? projeto;
|
|
2673
2868
|
if (!alvo)
|
|
2674
|
-
throw new Error(
|
|
2869
|
+
throw new Error(m.usoEsquecer);
|
|
2675
2870
|
const sairam = (0, projeto_alvo_1.esquecerProjeto)(alvo);
|
|
2676
2871
|
if (args.opcoes.json === true) {
|
|
2677
2872
|
console.log(JSON.stringify(sairam, null, 2));
|
|
2678
2873
|
return 0;
|
|
2679
2874
|
}
|
|
2680
2875
|
for (const p of sairam)
|
|
2681
|
-
console.log(
|
|
2876
|
+
console.log(m.esquecido(p.nome, (0, projeto_alvo_1.raizParaExibir)(p.raiz)));
|
|
2682
2877
|
return 0;
|
|
2683
2878
|
}
|
|
2684
|
-
console.error(
|
|
2685
|
-
console.error(
|
|
2879
|
+
console.error(m.desconhecido(sub));
|
|
2880
|
+
console.error(m.uso);
|
|
2686
2881
|
return 2;
|
|
2687
2882
|
}
|
|
2688
2883
|
/**
|
|
@@ -2696,15 +2891,16 @@ function comandoProjetos(args, projeto) {
|
|
|
2696
2891
|
function comandoOrquestracao(args) {
|
|
2697
2892
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2698
2893
|
const sub = args.posicionais[1];
|
|
2894
|
+
const m = (0, locale_1.msg)().operacao.restante.monitor;
|
|
2699
2895
|
if (sub !== undefined && sub !== 'status') {
|
|
2700
|
-
console.error(
|
|
2701
|
-
console.error(
|
|
2896
|
+
console.error(m.desconhecido(sub));
|
|
2897
|
+
console.error(m.uso);
|
|
2702
2898
|
return 2;
|
|
2703
2899
|
}
|
|
2704
2900
|
const bruto = texto(args.opcoes.atencao);
|
|
2705
2901
|
const atencaoMin = bruto === undefined ? undefined : Number(bruto);
|
|
2706
2902
|
if (atencaoMin !== undefined && (!Number.isFinite(atencaoMin) || atencaoMin < 0)) {
|
|
2707
|
-
console.error(
|
|
2903
|
+
console.error(m.atencao(bruto ?? ''));
|
|
2708
2904
|
return 2;
|
|
2709
2905
|
}
|
|
2710
2906
|
const monitor = (0, orquestracao_1.montarMonitor)(carregado, {
|
|
@@ -2722,74 +2918,88 @@ function comandoOrquestracao(args) {
|
|
|
2722
2918
|
}
|
|
2723
2919
|
return 0;
|
|
2724
2920
|
}
|
|
2921
|
+
/**
|
|
2922
|
+
* RM-037 (defeito 2 de 19 e 20/10/2026): o preparo de `worktree.dependencias` na worktree nova, dito ao lado dela. A
|
|
2923
|
+
* falha vai ao stderr com o comando exato e o diretorio, e a thread continua criada.
|
|
2924
|
+
*/
|
|
2925
|
+
function relatarDependencias(p, dir) {
|
|
2926
|
+
if (!p)
|
|
2927
|
+
return;
|
|
2928
|
+
const m = (0, locale_1.msg)().worktree;
|
|
2929
|
+
if (p.ok)
|
|
2930
|
+
console.log(m.dependenciasProntas(p.comando, Math.round(p.duracaoMs / 1000)));
|
|
2931
|
+
else
|
|
2932
|
+
console.error(m.dependenciasFalharam(p.comando, p.code, p.causa === 'timeout', dir, (0, dependencias_da_worktree_1.ultimaLinhaDoPreparo)(p)));
|
|
2933
|
+
}
|
|
2725
2934
|
function comandoWorktree(args) {
|
|
2726
2935
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2727
2936
|
const sub = args.posicionais[1];
|
|
2728
2937
|
const id = args.posicionais[2];
|
|
2938
|
+
// RM-061 (F3b, D3): a moldura pelo catalogo; o que os quatro subcomandos gravam (ledger, thread.json, a soltura dos
|
|
2939
|
+
// leases) roda no escopo pt-BR, e o detalhe e a correcao do resultado sao remontados no locale do comando.
|
|
2940
|
+
const m = (0, locale_1.msg)().worktree;
|
|
2729
2941
|
if (!sub || !id) {
|
|
2730
|
-
console.error(
|
|
2942
|
+
console.error(m.uso);
|
|
2731
2943
|
return 2;
|
|
2732
2944
|
}
|
|
2945
|
+
const bloqueio = (titulo, r) => {
|
|
2946
|
+
console.error(titulo);
|
|
2947
|
+
console.error(m.motivoTipado(r.motivo));
|
|
2948
|
+
console.error(m.detalhe((0, locale_1.remontar)(r.detalhe)));
|
|
2949
|
+
console.error(m.correcao((0, locale_1.remontar)(r.correcao)));
|
|
2950
|
+
};
|
|
2733
2951
|
if (sub === 'ensure') {
|
|
2734
|
-
const r = (0, worktree_1.garantirWorktree)(carregado, id);
|
|
2952
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.garantirWorktree)(carregado, id));
|
|
2735
2953
|
if (!r.ok) {
|
|
2736
|
-
|
|
2737
|
-
console.error(` motivo tipado: ${r.motivo}`);
|
|
2738
|
-
console.error(` detalhe: ${r.detalhe}`);
|
|
2739
|
-
console.error(` correcao: ${r.correcao}`);
|
|
2954
|
+
bloqueio(m.naoGarantida(id), r);
|
|
2740
2955
|
return 1;
|
|
2741
2956
|
}
|
|
2742
|
-
console.log(r.criada ?
|
|
2743
|
-
console.log(
|
|
2744
|
-
console.log(
|
|
2745
|
-
console.log(
|
|
2746
|
-
console.log(` ${r.detalhe}`);
|
|
2957
|
+
console.log(r.criada ? m.criada(id) : m.jaExistia(id));
|
|
2958
|
+
console.log(m.linhaDir(r.dir));
|
|
2959
|
+
console.log(m.linhaBranch(r.branch));
|
|
2960
|
+
console.log(m.linhaBase(r.base));
|
|
2961
|
+
console.log(` ${(0, locale_1.remontar)(r.detalhe)}`);
|
|
2962
|
+
relatarDependencias(r.dependencias, r.dir);
|
|
2747
2963
|
return 0;
|
|
2748
2964
|
}
|
|
2749
2965
|
if (sub === 'sync') {
|
|
2750
|
-
const r = (0, worktree_1.sincronizarWorktree)(carregado, id, { dryRun: args.opcoes['dry-run'] === true });
|
|
2966
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.sincronizarWorktree)(carregado, id, { dryRun: args.opcoes['dry-run'] === true }));
|
|
2751
2967
|
if (!r.ok) {
|
|
2752
|
-
|
|
2753
|
-
console.error(` motivo tipado: ${r.motivo}`);
|
|
2754
|
-
console.error(` detalhe: ${r.detalhe}`);
|
|
2755
|
-
console.error(` correcao: ${r.correcao}`);
|
|
2968
|
+
bloqueio(m.syncBloqueado(id), r);
|
|
2756
2969
|
return 1;
|
|
2757
2970
|
}
|
|
2758
|
-
console.log(r.dryRun ?
|
|
2759
|
-
console.log(
|
|
2760
|
-
console.log(
|
|
2761
|
-
console.log(
|
|
2762
|
-
console.log(` ${r.detalhe}`);
|
|
2971
|
+
console.log(r.dryRun ? m.syncEnsaio(id) : m.syncFeito(id));
|
|
2972
|
+
console.log(m.syncBase(r.base, r.shaBase.slice(0, 8)));
|
|
2973
|
+
console.log(m.syncBranch(r.branch, r.shaAntes.slice(0, 8), r.shaDepois.slice(0, 8)));
|
|
2974
|
+
console.log(m.syncRebase(r.rebaseFeito ? 'feito' : r.jaAtualizada ? 'desnecessario' : 'seria feito'));
|
|
2975
|
+
console.log(` ${(0, locale_1.remontar)(r.detalhe)}`);
|
|
2763
2976
|
if (r.passos.length > 0) {
|
|
2764
2977
|
console.log('');
|
|
2765
|
-
console.log(
|
|
2978
|
+
console.log(m.comandosReais);
|
|
2766
2979
|
for (const passo of r.passos)
|
|
2767
|
-
console.log(` ${passo}`);
|
|
2980
|
+
console.log(` ${(0, locale_1.remontar)(passo)}`);
|
|
2768
2981
|
}
|
|
2769
2982
|
return 0;
|
|
2770
2983
|
}
|
|
2771
2984
|
if (sub === 'audit') {
|
|
2772
|
-
const r = (0, worktree_1.auditarWorktree)(carregado, id);
|
|
2985
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.auditarWorktree)(carregado, id));
|
|
2773
2986
|
console.log((0, worktree_1.textoDoAudit)(id, r));
|
|
2774
2987
|
return r.ok ? 0 : 1;
|
|
2775
2988
|
}
|
|
2776
2989
|
if (sub === 'release') {
|
|
2777
|
-
const r = (0, worktree_1.liberarWorktree)(carregado, id, { forcar: args.opcoes.forcar === true });
|
|
2990
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.liberarWorktree)(carregado, id, { forcar: args.opcoes.forcar === true }));
|
|
2778
2991
|
if (!r.ok) {
|
|
2779
|
-
|
|
2780
|
-
console.error(` motivo tipado: ${r.motivo}`);
|
|
2781
|
-
console.error(` detalhe: ${r.detalhe}`);
|
|
2782
|
-
console.error(` correcao: ${r.correcao}`);
|
|
2992
|
+
bloqueio(m.releaseBloqueado(id), r);
|
|
2783
2993
|
return 1;
|
|
2784
2994
|
}
|
|
2785
|
-
console.log(
|
|
2786
|
-
console.log(
|
|
2787
|
-
console.log(
|
|
2788
|
-
console.log(
|
|
2789
|
-
console.log(` ${r.detalhe}`);
|
|
2995
|
+
console.log(m.liberada(id));
|
|
2996
|
+
console.log(m.releaseDir(r.dir));
|
|
2997
|
+
console.log(m.releaseRemovida(r.removida));
|
|
2998
|
+
console.log(m.releaseLeases(r.leasesLiberados.join(', ')));
|
|
2999
|
+
console.log(` ${(0, locale_1.remontar)(r.detalhe)}`);
|
|
2790
3000
|
return 0;
|
|
2791
3001
|
}
|
|
2792
|
-
console.error(
|
|
3002
|
+
console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('worktree', sub));
|
|
2793
3003
|
return 2;
|
|
2794
3004
|
}
|
|
2795
3005
|
function comandoMaster(args) {
|
|
@@ -2805,8 +3015,9 @@ function comandoMaster(args) {
|
|
|
2805
3015
|
const id = args.posicionais[2];
|
|
2806
3016
|
const formato = texto(args.opcoes.formato) ?? 'telegram';
|
|
2807
3017
|
if (!id || !['telegram', 'terminal', 'json'].includes(formato))
|
|
2808
|
-
throw new Error(
|
|
2809
|
-
|
|
3018
|
+
throw new Error((0, locale_1.msg)().master.usoPedir);
|
|
3019
|
+
// RM-061 (F2b, G2): o pedido de nota e gravado no escopo pt-BR; o erro da entrega volta no locale do comando.
|
|
3020
|
+
const pedido = (0, locale_1.comLocale)('pt-BR', () => (0, master_nota_1.pedirNota)(carregado.raiz, id, { codigosEmUso: (0, pulse_resposta_1.codigosEmUso)(carregado.raiz) }));
|
|
2810
3021
|
console.log(formato === 'json' ? JSON.stringify(pedido, null, 2) : (0, master_nota_1.textoDoPedidoDeNota)(carregado.raiz, pedido, formato));
|
|
2811
3022
|
return 0;
|
|
2812
3023
|
}
|
|
@@ -2861,12 +3072,7 @@ function comandoMaster(args) {
|
|
|
2861
3072
|
// mudou, e para onde ir. Desaparecer sem dizer nada seria o mesmo pecado da #TAG
|
|
2862
3073
|
// aposentada virando default.
|
|
2863
3074
|
if (args.opcoes.batch === true || primeiro === 'batch') {
|
|
2864
|
-
console.error(
|
|
2865
|
-
'Entregue e aceito, a menos que voce diga o contrario.\n' +
|
|
2866
|
-
' ork master as entregas, com o indice ja derivado do ledger\n' +
|
|
2867
|
-
' ork master <id> --aceitar-omissao aceita so esta entrega, com indice e insumos no ledger\n' +
|
|
2868
|
-
' ork master --aceitar-omissao aceita todas as entregues (--dry-run mostra quais)\n' +
|
|
2869
|
-
' ork master <id> --score <0-5> --justificativa "<por que>" --por <humano> para reclamar');
|
|
3075
|
+
console.error((0, locale_1.msg)().master.complementar.batchAposentado);
|
|
2870
3076
|
return 2;
|
|
2871
3077
|
}
|
|
2872
3078
|
if (args.opcoes['aceitar-omissao'] !== undefined) {
|
|
@@ -2881,19 +3087,20 @@ function comandoMaster(args) {
|
|
|
2881
3087
|
}
|
|
2882
3088
|
const propor = primeiro === 'propor';
|
|
2883
3089
|
const id = propor ? args.posicionais[2] : primeiro;
|
|
3090
|
+
const mm = (0, locale_1.msg)().master.complementar;
|
|
2884
3091
|
if (!id)
|
|
2885
|
-
throw new Error(
|
|
3092
|
+
throw new Error(mm.informeThread);
|
|
2886
3093
|
const brutoScore = texto(args.opcoes.score);
|
|
2887
3094
|
const justificativa = texto(args.opcoes.justificativa) ?? texto(args.opcoes.porque);
|
|
2888
3095
|
if (brutoScore === undefined) {
|
|
2889
|
-
console.error(
|
|
2890
|
-
console.error(
|
|
3096
|
+
console.error(mm.usoScore);
|
|
3097
|
+
console.error(mm.scoreHumano);
|
|
2891
3098
|
return 2;
|
|
2892
3099
|
}
|
|
2893
3100
|
if (!justificativa) {
|
|
2894
|
-
console.error(
|
|
2895
|
-
console.error(
|
|
2896
|
-
console.error(
|
|
3101
|
+
console.error(mm.justificativa(id));
|
|
3102
|
+
console.error(mm.justificativaRazao);
|
|
3103
|
+
console.error(mm.justificativaComando(id, brutoScore));
|
|
2897
3104
|
return 2;
|
|
2898
3105
|
}
|
|
2899
3106
|
const brutasClasses = texto(args.opcoes.classe) ?? texto(args.opcoes.classes);
|
|
@@ -2901,8 +3108,8 @@ function comandoMaster(args) {
|
|
|
2901
3108
|
for (const bruta of (brutasClasses ?? '').split(',').map((c) => c.trim()).filter(Boolean)) {
|
|
2902
3109
|
const classe = (0, master_2.parseClasse)(bruta);
|
|
2903
3110
|
if (!classe) {
|
|
2904
|
-
console.error(
|
|
2905
|
-
console.error(
|
|
3111
|
+
console.error(mm.classeInvalida(bruta));
|
|
3112
|
+
console.error(mm.classesFixas(master_2.ORDEM_DAS_CLASSES.join(', ')));
|
|
2906
3113
|
return 2;
|
|
2907
3114
|
}
|
|
2908
3115
|
classes.push(classe);
|
|
@@ -2930,12 +3137,12 @@ function comandoMaster(args) {
|
|
|
2930
3137
|
// vai ao ledger do projeto uma vez por janela; virar policy continua sendo do dono.
|
|
2931
3138
|
for (const p of (0, licoes_1.registrarPropostasNovas)(carregado.raiz)) {
|
|
2932
3139
|
console.log('');
|
|
2933
|
-
console.log(
|
|
3140
|
+
console.log(mm.proposta(p.chave, p.threads.length, p.janelaDias));
|
|
2934
3141
|
console.log(` ${p.sugestao}`);
|
|
2935
|
-
console.log(
|
|
3142
|
+
console.log(mm.soProposta);
|
|
2936
3143
|
}
|
|
2937
3144
|
console.log('');
|
|
2938
|
-
console.log(
|
|
3145
|
+
console.log(mm.proximo);
|
|
2939
3146
|
return 0;
|
|
2940
3147
|
}
|
|
2941
3148
|
/**
|
|
@@ -2952,7 +3159,7 @@ function comandoAceitarOmissao(args, raiz, posicional) {
|
|
|
2952
3159
|
const candidatos = [posicional, texto(args.opcoes.thread), typeof bruto === 'string' ? bruto : undefined]
|
|
2953
3160
|
.filter((v) => typeof v === 'string' && v.trim() !== '').map((v) => v.trim());
|
|
2954
3161
|
if (args.opcoes.thread === true || new Set(candidatos).size > 1) {
|
|
2955
|
-
console.error(
|
|
3162
|
+
console.error((0, locale_1.msg)().master.usoOmissao);
|
|
2956
3163
|
return 2;
|
|
2957
3164
|
}
|
|
2958
3165
|
const alvo = candidatos[0];
|
|
@@ -2974,32 +3181,35 @@ function comandoAceitarOmissao(args, raiz, posicional) {
|
|
|
2974
3181
|
console.log(JSON.stringify({ dryRun: true, fecharia }, null, 2));
|
|
2975
3182
|
return 0;
|
|
2976
3183
|
}
|
|
2977
|
-
|
|
3184
|
+
const m = (0, locale_1.msg)().master;
|
|
3185
|
+
console.log(m.ensaio);
|
|
2978
3186
|
if (fecharia.length === 0) {
|
|
2979
|
-
console.log(
|
|
3187
|
+
console.log(m.nadaEsperando);
|
|
2980
3188
|
return 0;
|
|
2981
3189
|
}
|
|
2982
|
-
console.log(
|
|
3190
|
+
console.log(m.fecharia(fecharia.length));
|
|
2983
3191
|
for (const f of fecharia)
|
|
2984
|
-
console.log(
|
|
3192
|
+
console.log(m.linhaDoIndice(f.thread, f.indice.valor, f.indice.base));
|
|
2985
3193
|
avisoDeOmissaoSemAlvo(alvo, fecharia.length, true);
|
|
2986
3194
|
return 0;
|
|
2987
3195
|
}
|
|
2988
|
-
|
|
3196
|
+
// RM-061 (F2b, G2): o MASTER log, o POSTMORTEM e o registro da omissao nascem em pt-BR.
|
|
3197
|
+
const aceitos = (0, locale_1.comLocale)('pt-BR', () => (0, master_2.aceitarPendentesPorOmissao)(raiz, { thread: alvo }));
|
|
2989
3198
|
avisoDeOmissaoSemAlvo(alvo, aceitos.length, false);
|
|
2990
3199
|
if (json) {
|
|
2991
3200
|
console.log(JSON.stringify(aceitos, null, 2));
|
|
2992
3201
|
return 0;
|
|
2993
3202
|
}
|
|
3203
|
+
const m = (0, locale_1.msg)().master;
|
|
2994
3204
|
if (aceitos.length === 0) {
|
|
2995
|
-
console.log(
|
|
3205
|
+
console.log(m.nadaEsperando);
|
|
2996
3206
|
return 0;
|
|
2997
3207
|
}
|
|
2998
|
-
console.log(
|
|
3208
|
+
console.log(m.aceitas(aceitos.length));
|
|
2999
3209
|
for (const a of aceitos)
|
|
3000
|
-
console.log(
|
|
3210
|
+
console.log(m.linhaDoIndice(a.thread, a.indice.valor, a.indice.base));
|
|
3001
3211
|
console.log('');
|
|
3002
|
-
console.log(
|
|
3212
|
+
console.log(m.discordou);
|
|
3003
3213
|
return 0;
|
|
3004
3214
|
}
|
|
3005
3215
|
/**
|
|
@@ -3015,10 +3225,8 @@ function avisoDeOmissaoSemAlvo(alvo, quantas, ensaio) {
|
|
|
3015
3225
|
return;
|
|
3016
3226
|
const propria = (process.env[runtime_ambiente_1.ENV_THREAD_DO_DESPACHO] ?? '').trim();
|
|
3017
3227
|
console.error('');
|
|
3018
|
-
console.error(
|
|
3019
|
-
|
|
3020
|
-
console.error(` Para fechar so a sua: ork master ${propria || '<thread-id>'} --aceitar-omissao` +
|
|
3021
|
-
(ensaio ? '' : ' (a nota humana sobrescreve o aceite de quem nao era seu)'));
|
|
3228
|
+
console.error((0, locale_1.msg)().master.avisoSemThread(marca, ensaio, quantas));
|
|
3229
|
+
console.error((0, locale_1.msg)().master.avisoSoASua(propria || '<thread-id>', ensaio));
|
|
3022
3230
|
}
|
|
3023
3231
|
/** I-55 (RM-008): `ork licoes` mostra o que volta no proximo GOAL e PLAN, e as propostas de policy. */
|
|
3024
3232
|
function comandoLicoes(args) {
|
|
@@ -3049,17 +3257,36 @@ function comandoRoadmap(args) {
|
|
|
3049
3257
|
if (sub === 'reservas') {
|
|
3050
3258
|
// RM-037 (rm037noite, defeito 3): a reserva de thread ja fechada aparece como orfa e sai com registro.
|
|
3051
3259
|
if (args.opcoes['soltar-orfas'] === true) {
|
|
3052
|
-
|
|
3260
|
+
// RM-061 (F3b, D3): a soltura grava no escopo pt-BR (ledger, branch de reservas); o detalhe e remontado no texto.
|
|
3261
|
+
const soltas = (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.soltarReservasOrfas)(carregado.raiz, { remoto }));
|
|
3262
|
+
const mr = (0, locale_1.msg)().reservas;
|
|
3053
3263
|
if (args.opcoes.json === true)
|
|
3054
3264
|
console.log(JSON.stringify(soltas, null, 2));
|
|
3055
3265
|
else
|
|
3056
|
-
console.log(soltas.length === 0 ?
|
|
3057
|
-
: soltas.map((s) =>
|
|
3266
|
+
console.log(soltas.length === 0 ? mr.nenhumaOrfa
|
|
3267
|
+
: soltas.map((s) => mr.soltura(s.item, (0, locale_1.remontar)(s.detalhe), s.thread)).join('\n'));
|
|
3058
3268
|
return 0;
|
|
3059
3269
|
}
|
|
3060
|
-
|
|
3270
|
+
// RM-052 (fatia 2, D4): as reservas moram no remoto do projeto. Sem ele, nada e lido; com ele mudo e
|
|
3271
|
+
// sem copia, tambem nao. A resposta diz qual projeto leu e o que ficou de fora, nunca "nenhum item".
|
|
3272
|
+
// RM-047: nome fora do formato de remoto recusa antes do git, como sempre.
|
|
3273
|
+
const nomeDoRemoto = (0, branch_de_estado_1.exigirRemoto)(remoto ?? roadmap_reservas_1.REMOTO_PADRAO, 'roadmap');
|
|
3274
|
+
const url = (0, projeto_alvo_1.remotoDoProjeto)(carregado.raiz, nomeDoRemoto);
|
|
3275
|
+
const painel = url === null ? { reservas: [], feats: [], atualizado: false, ponta: null }
|
|
3276
|
+
: (0, roadmap_reservas_1.listarReservas)(carregado.raiz, { remoto });
|
|
3277
|
+
const leitura = (0, roadmap_reservas_1.leituraDasReservas)(painel, url !== null);
|
|
3061
3278
|
const orfas = (0, roadmap_reservas_1.reservasOrfas)(carregado.raiz, painel.reservas);
|
|
3062
|
-
|
|
3279
|
+
const lido = leitura === 'lido-agora' || leitura === 'copia-local';
|
|
3280
|
+
const consulta = (0, projeto_alvo_1.consultaDoProjeto)(carregado, {
|
|
3281
|
+
remoto: url,
|
|
3282
|
+
lido: lido ? [`reservas do roadmap (${roadmap_reservas_1.BRANCH_DE_RESERVAS} em ${nomeDoRemoto}, ${leitura === 'lido-agora' ? 'lido agora' : 'última cópia local'})`] : [],
|
|
3283
|
+
naoLido: [projeto_alvo_1.FORA_DA_CONSULTA.roadmap,
|
|
3284
|
+
...(leitura === 'sem-remoto' ? [`reservas do roadmap: o projeto não tem o remoto ${nomeDoRemoto}, nada foi lido de ${roadmap_reservas_1.BRANCH_DE_RESERVAS}`]
|
|
3285
|
+
: leitura === 'sem-copia' ? [`reservas do roadmap: o remoto ${nomeDoRemoto} não respondeu e não há cópia local de ${roadmap_reservas_1.BRANCH_DE_RESERVAS}`]
|
|
3286
|
+
: [])],
|
|
3287
|
+
});
|
|
3288
|
+
console.log(args.opcoes.json === true ? JSON.stringify({ ...painel, orfas, leitura, consulta }, null, 2)
|
|
3289
|
+
: [...(0, projeto_alvo_1.linhasDaConsulta)(consulta), '', (0, roadmap_reservas_1.textoDasReservas)(painel, orfas, { remoto: nomeDoRemoto, projeto: carregado.manifesto.project.name, temRemoto: url !== null })].join('\n'));
|
|
3063
3290
|
return 0;
|
|
3064
3291
|
}
|
|
3065
3292
|
if (sub === 'status') {
|
|
@@ -3067,27 +3294,31 @@ function comandoRoadmap(args) {
|
|
|
3067
3294
|
// RM-052: com o projeto consultado e o que ficou de fora (as outras maquinas nao sao lidas aqui).
|
|
3068
3295
|
const consulta = (0, projeto_alvo_1.consultaDoProjeto)(carregado, { lido: ['roadmap (docs/roadmap)', projeto_alvo_1.FORA_DA_CONSULTA.threadsDaMaquina],
|
|
3069
3296
|
naoLido: [projeto_alvo_1.FORA_DA_CONSULTA.reservas, 'threads de outras máquinas (ork network roadmap)'] });
|
|
3070
|
-
|
|
3297
|
+
// RM-061 (F2b, G2): o status e montado em pt-BR, como o --json; so o texto segue o locale. Os canais (Hermes,
|
|
3298
|
+
// OpenClaw) transportam o texto: com owner.language ou LANG en no host, o dono o recebe em ingles.
|
|
3299
|
+
// RM-063 (F2): o fecho le a mesma fila do `ork pulse`, sem forja e sem registrar.
|
|
3300
|
+
const status = (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_status_1.montarStatusDoRoadmap)(carregado.raiz, { projeto: carregado.manifesto.project.name, consulta,
|
|
3301
|
+
fila: (quando) => (0, pulse_1.filaDoDono)(carregado, { quando }) }));
|
|
3071
3302
|
console.log(args.opcoes.json === true ? JSON.stringify(status, null, 2) : (0, roadmap_status_1.textoDoStatusDoRoadmap)(status));
|
|
3072
3303
|
return 0;
|
|
3073
3304
|
}
|
|
3074
3305
|
// RM-037 (rm037noite, defeito 6): o numero da FEAT nova sai da mesma branch de reservas.
|
|
3075
3306
|
if (sub === 'feat') {
|
|
3076
|
-
const r = (0, roadmap_reservas_1.reservarFeat)(carregado.raiz, { remoto, por: texto(args.opcoes.por), maquina: texto(args.opcoes.maquina),
|
|
3077
|
-
thread: texto(args.opcoes.thread) ?? null, nota: texto(args.opcoes.nota) ?? null });
|
|
3307
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.reservarFeat)(carregado.raiz, { remoto, por: texto(args.opcoes.por), maquina: texto(args.opcoes.maquina),
|
|
3308
|
+
thread: texto(args.opcoes.thread) ?? null, nota: texto(args.opcoes.nota) ?? null }));
|
|
3309
|
+
const mr = (0, locale_1.msg)().reservas;
|
|
3078
3310
|
if (args.opcoes.json === true)
|
|
3079
3311
|
console.log(JSON.stringify(r, null, 2));
|
|
3080
3312
|
else {
|
|
3081
|
-
console.log(
|
|
3082
|
-
console.log(
|
|
3083
|
-
console.log(
|
|
3313
|
+
console.log(mr.feat(r.feat, r.reserva.thread ?? null));
|
|
3314
|
+
console.log(mr.crieAPagina(r.feat));
|
|
3315
|
+
console.log(mr.branch(r.commit.slice(0, 7)));
|
|
3084
3316
|
}
|
|
3085
3317
|
return 0;
|
|
3086
3318
|
}
|
|
3087
3319
|
const item = args.posicionais[2];
|
|
3088
3320
|
if ((sub !== 'pegar' && sub !== 'soltar') || !item) {
|
|
3089
|
-
console.error(
|
|
3090
|
-
'soltar <RM-NNN> [--forcar --motivo M] | feat [--thread T] [--nota N]');
|
|
3321
|
+
console.error((0, locale_1.msg)().reservas.uso);
|
|
3091
3322
|
return 2;
|
|
3092
3323
|
}
|
|
3093
3324
|
const opcoes = {
|
|
@@ -3099,18 +3330,17 @@ function comandoRoadmap(args) {
|
|
|
3099
3330
|
forcar: args.opcoes.forcar === true,
|
|
3100
3331
|
motivo: texto(args.opcoes.motivo),
|
|
3101
3332
|
};
|
|
3102
|
-
const r = sub === 'pegar' ? (0, roadmap_reservas_1.pegarItem)(carregado.raiz, item, opcoes) : (0, roadmap_reservas_1.soltarItem)(carregado.raiz, item, opcoes);
|
|
3333
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => sub === 'pegar' ? (0, roadmap_reservas_1.pegarItem)(carregado.raiz, item, opcoes) : (0, roadmap_reservas_1.soltarItem)(carregado.raiz, item, opcoes));
|
|
3103
3334
|
if (args.opcoes.json === true) {
|
|
3104
3335
|
console.log(JSON.stringify(r, null, 2));
|
|
3105
3336
|
return 0;
|
|
3106
3337
|
}
|
|
3107
|
-
const
|
|
3108
|
-
|
|
3109
|
-
console.log(`${r.item}: ${verbo}.`);
|
|
3338
|
+
const mr = (0, locale_1.msg)().reservas;
|
|
3339
|
+
console.log(mr.itemAcao(r.item, mr.acao(r.acao)));
|
|
3110
3340
|
if (r.reserva && r.acao !== 'soltou')
|
|
3111
|
-
console.log(
|
|
3341
|
+
console.log(mr.com(r.reserva.por, r.reserva.maquina, r.reserva.thread ?? null));
|
|
3112
3342
|
if (r.commit)
|
|
3113
|
-
console.log(
|
|
3343
|
+
console.log(mr.branch(r.commit.slice(0, 7)));
|
|
3114
3344
|
return 0;
|
|
3115
3345
|
}
|
|
3116
3346
|
/**
|
|
@@ -3120,7 +3350,7 @@ function comandoRoadmap(args) {
|
|
|
3120
3350
|
function comandoNetworkRoadmap(args) {
|
|
3121
3351
|
const pedido = texto(args.opcoes.projeto);
|
|
3122
3352
|
if (args.posicionais[1] !== 'roadmap' || args.posicionais.length > 2 || (args.opcoes.projeto !== undefined && !pedido)) {
|
|
3123
|
-
console.error(
|
|
3353
|
+
console.error((0, locale_1.msg)().network.roadmap.uso);
|
|
3124
3354
|
return 2;
|
|
3125
3355
|
}
|
|
3126
3356
|
try {
|
|
@@ -3138,14 +3368,41 @@ function comandoNetworkRoadmap(args) {
|
|
|
3138
3368
|
return network_roadmap_1.SAIDA_DO_PEDIDO;
|
|
3139
3369
|
}
|
|
3140
3370
|
}
|
|
3371
|
+
/**
|
|
3372
|
+
* RM-026 K7 (fatia 2, D11 e D13): o conhecimento escrito, so leitura. O JSON e o das tools `ork_conhecimento_*`,
|
|
3373
|
+
* em pt-BR nas duas linguas; so o texto segue o locale. Sai 1 quando a consulta nao responde e 2 com uso errado
|
|
3374
|
+
* (D13 revista no CHECK: o gate de CI separa o erro de digitacao da lacuna).
|
|
3375
|
+
*/
|
|
3376
|
+
function comandoConhecimento(args) {
|
|
3377
|
+
const [, sub = 'listar', id, ...resto] = args.posicionais;
|
|
3378
|
+
const colecao = args.opcoes.colecao;
|
|
3379
|
+
const valido = conhecimento_consulta_1.CONSULTAS_DO_CONHECIMENTO.includes(sub) && !resto.length &&
|
|
3380
|
+
(args.opcoes.json === undefined || args.opcoes.json === true) &&
|
|
3381
|
+
Object.keys(args.opcoes).every((k) => k === 'json' || (k === 'colecao' && sub === 'listar')) &&
|
|
3382
|
+
(colecao === undefined || (typeof colecao === 'string' && conhecimento_1.NOME_DE_COLECAO.test(colecao))) &&
|
|
3383
|
+
(sub === 'mostrar' ? typeof id === 'string' && conhecimento_1.ID_DE_DOCUMENTO.test(id) : id === undefined);
|
|
3384
|
+
if (!valido) {
|
|
3385
|
+
console.error((0, locale_1.msg)().cli.erro((0, locale_1.msg)().conhecimento.uso));
|
|
3386
|
+
return 2;
|
|
3387
|
+
}
|
|
3388
|
+
const pedido = sub === 'mostrar' ? { consulta: 'mostrar', id }
|
|
3389
|
+
: sub === 'listar' ? { consulta: 'listar', ...(typeof colecao === 'string' ? { colecao } : {}) }
|
|
3390
|
+
: { consulta: sub };
|
|
3391
|
+
const carregado = (0, manifest_1.exigirManifesto)();
|
|
3392
|
+
const r = (0, conhecimento_consulta_1.consultarConhecimento)(carregado, pedido);
|
|
3393
|
+
console.log(args.opcoes.json === true ? (0, saida_segura_1.jsonSemInvisivel)(r) : (0, conhecimento_consulta_1.textoDoConhecimento)(r));
|
|
3394
|
+
return (0, conhecimento_consulta_1.consultaRespondeu)(r) ? 0 : 1;
|
|
3395
|
+
}
|
|
3141
3396
|
function comandoDocs(args) {
|
|
3142
3397
|
const sub = args.posicionais[1] ?? 'verificar';
|
|
3143
3398
|
const carregado = (0, manifest_1.carregarManifesto)();
|
|
3144
3399
|
const raiz = carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)();
|
|
3145
3400
|
const baseBranch = carregado?.manifesto.worktree?.base_branch ?? 'main';
|
|
3401
|
+
const md = (0, locale_1.msg)().docs;
|
|
3146
3402
|
if (sub === 'verificar') {
|
|
3147
3403
|
// RM-037 (fatia 3, GO-FIX 2): o CI passa --pr no pull_request; no push da main as duas regras novas reprovam.
|
|
3148
|
-
|
|
3404
|
+
// RM-061 (F3b, G4): verifica no escopo pt-BR, como o `--json` leva os achados; o texto os remonta no locale do comando.
|
|
3405
|
+
const { docs, achados } = (0, locale_1.comLocale)('pt-BR', () => (0, docs_1.verificarDocs)(raiz, { baseBranch, ajudaDoCli: AJUDA, pr: args.opcoes.pr === true }));
|
|
3149
3406
|
if (args.opcoes.json === true) {
|
|
3150
3407
|
console.log(JSON.stringify({ paginas: docs.length, erros: achados.filter((a) => a.gravidade === 'erro').length,
|
|
3151
3408
|
achados }, null, 2));
|
|
@@ -3162,64 +3419,73 @@ function comandoDocs(args) {
|
|
|
3162
3419
|
// Sugestao 4 do CHECK 1 (e 8 do CHECK 2, `--so=`): `--so` sem item e erro de uso, nunca o escopo
|
|
3163
3420
|
// padrao em silencio.
|
|
3164
3421
|
if (args.opcoes.so === true || (typeof args.opcoes.so === 'string' && !args.opcoes.so.trim())) {
|
|
3165
|
-
console.error(
|
|
3422
|
+
console.error(md.usoSoSemItem);
|
|
3166
3423
|
return 2;
|
|
3167
3424
|
}
|
|
3168
3425
|
const so = texto(args.opcoes.so);
|
|
3169
3426
|
let itens;
|
|
3170
|
-
let escopo =
|
|
3427
|
+
let escopo = md.escopoTodos;
|
|
3171
3428
|
if (so) {
|
|
3172
3429
|
itens = so.split(',').map((i) => i.trim().toUpperCase()).filter(Boolean);
|
|
3173
3430
|
const fora = itens.filter((i) => !/^RM-\d{3}$/.test(i));
|
|
3174
3431
|
if (fora.length || itens.length === 0) {
|
|
3175
|
-
console.error(
|
|
3432
|
+
console.error(md.usoSoInvalido(so));
|
|
3176
3433
|
return 2;
|
|
3177
3434
|
}
|
|
3178
|
-
escopo =
|
|
3435
|
+
escopo = md.escopoSo(itens.join(', '));
|
|
3179
3436
|
}
|
|
3180
3437
|
else if (args.opcoes.todos !== true) {
|
|
3181
3438
|
const padrao = (0, docs_1.escopoPadraoDoSync)(raiz);
|
|
3182
3439
|
if (padrao.itens) {
|
|
3183
3440
|
itens = padrao.itens;
|
|
3184
|
-
escopo =
|
|
3441
|
+
escopo = md.escopoDaThread(itens.join(', '), String(padrao.thread));
|
|
3185
3442
|
}
|
|
3186
3443
|
}
|
|
3187
|
-
const r = (0, docs_1.sincronizarDocs)(raiz, { baseBranch, escrever, itens });
|
|
3444
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, docs_1.sincronizarDocs)(raiz, { baseBranch, escrever, itens }));
|
|
3188
3445
|
console.log(args.opcoes.json === true ? JSON.stringify({ ...r, escopo: itens ?? null }, null, 2)
|
|
3189
|
-
:
|
|
3446
|
+
: `${md.escopo(escopo)}\n${(0, docs_1.textoDaSincronizacao)(r, escrever)}`);
|
|
3190
3447
|
return 0;
|
|
3191
3448
|
}
|
|
3192
3449
|
if (sub === 'init') {
|
|
3193
|
-
|
|
3450
|
+
// RM-061 (F3a, D1 e D5): os sete arquivos nascem na lingua do dono, resolvida pelo manifesto (tambem com `--json`,
|
|
3451
|
+
// que tira so o texto impresso do locale); o texto segue o locale do comando coberto.
|
|
3452
|
+
const criados = (0, docs_1.iniciarDocs)(raiz, (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale);
|
|
3453
|
+
const m = (0, locale_1.msg)().gerados.docsInit;
|
|
3194
3454
|
console.log(criados.length === 0
|
|
3195
|
-
?
|
|
3196
|
-
: [
|
|
3197
|
-
'Proximo passo: copie docs/produto/_modelo-feature.md e docs/roadmap/_modelo-item.md, e rode ork docs verificar'].join('\n'));
|
|
3455
|
+
? m.jaEstava
|
|
3456
|
+
: [m.criado, ...criados.map((c) => ` ${c}`), '', m.proximoPasso].join('\n'));
|
|
3198
3457
|
return 0;
|
|
3199
3458
|
}
|
|
3200
|
-
console.error(
|
|
3459
|
+
console.error(md.uso);
|
|
3201
3460
|
return 2;
|
|
3202
3461
|
}
|
|
3203
3462
|
function comandoPrompt(args) {
|
|
3204
3463
|
const sub = args.posicionais[1] ?? 'list';
|
|
3205
3464
|
const carregado = (0, manifest_1.carregarManifesto)();
|
|
3206
3465
|
const raiz = carregado?.raiz;
|
|
3466
|
+
const mp = (0, locale_1.msg)().prompts.cli;
|
|
3467
|
+
// RM-061 F3c: o template e a lingua do prompt sao os do despacho (a lingua declarada do dono, `owner.language`;
|
|
3468
|
+
// sem ela, pt-BR), para o render mostrar o que o `phase run` grava; so o texto do CLI em volta segue o locale ativo.
|
|
3469
|
+
// Os templates do projeto sempre aparecem; dos embutidos, o da lingua do prompt.
|
|
3470
|
+
const linguaDoPrompt = (0, locale_1.linguaDeclaradaDoDono)(carregado?.manifesto.owner?.language);
|
|
3471
|
+
const templatesDaLingua = () => (0, prompts_1.carregarTemplates)(raiz).filter((t) => t.origem !== 'embutido' || (linguaDoPrompt === 'en' ? t.id.endsWith('.en') : !t.id.endsWith('.en')));
|
|
3207
3472
|
if (sub === 'list') {
|
|
3208
|
-
console.log((0, prompts_1.tabelaDeTemplates)((
|
|
3473
|
+
console.log((0, prompts_1.tabelaDeTemplates)(templatesDaLingua()));
|
|
3209
3474
|
return 0;
|
|
3210
3475
|
}
|
|
3211
3476
|
if (sub === 'lint') {
|
|
3212
3477
|
const id = texto(args.opcoes.template);
|
|
3213
|
-
const templates = id ? [(0, prompts_1.exigirTemplate)(id, raiz)] : (
|
|
3214
|
-
const problemas = templates.flatMap((t) => (0, prompts_1.lintTemplate)(t))
|
|
3215
|
-
|
|
3478
|
+
const templates = id ? [(0, prompts_1.exigirTemplate)(id, raiz)] : templatesDaLingua();
|
|
3479
|
+
const problemas = [...templates.flatMap((t) => (0, prompts_1.lintTemplate)(t)),
|
|
3480
|
+
...(id ? [] : (0, prompts_1.avisosDeLingua)(templates, linguaDoPrompt))];
|
|
3481
|
+
console.log(mp.lintTitulo(raiz ?? null));
|
|
3216
3482
|
console.log('');
|
|
3217
3483
|
console.log((0, prompts_1.textoDoLint)(problemas, templates.length));
|
|
3218
3484
|
return problemas.some((p) => p.gravidade === 'erro') ? 2 : 0;
|
|
3219
3485
|
}
|
|
3220
3486
|
if (sub === 'render') {
|
|
3221
3487
|
const fase = exigirFaseCanonica(texto(args.opcoes.fase) ?? args.posicionais[3]);
|
|
3222
|
-
const pedido = texto(args.opcoes.pedido) ??
|
|
3488
|
+
const pedido = texto(args.opcoes.pedido) ?? mp.pedidoExemplo;
|
|
3223
3489
|
const idTemplate = texto(args.opcoes.template);
|
|
3224
3490
|
// Modo exemplo: renderiza sem thread nenhuma, para revisar o texto de um modo antes de
|
|
3225
3491
|
// abrir trabalho. Nada e gravado, e o `ork` diz em voz alta que a thread e ficticia.
|
|
@@ -3234,10 +3500,10 @@ function comandoPrompt(args) {
|
|
|
3234
3500
|
return 2;
|
|
3235
3501
|
}
|
|
3236
3502
|
const exemplo = (0, prompts_1.threadDeExemplo)(modo, fase, carregado?.manifesto.project);
|
|
3237
|
-
const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, raiz) : (0, prompts_1.templateDaFase)(fase, raiz);
|
|
3238
|
-
const prompt = (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(exemplo, fase, pedido));
|
|
3239
|
-
console.log(
|
|
3240
|
-
console.log(
|
|
3503
|
+
const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, raiz) : (0, prompts_1.templateDaFase)(fase, raiz, linguaDoPrompt);
|
|
3504
|
+
const prompt = (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(exemplo, fase, pedido, '', (0, prompts_1.idiomaDoTemplate)(template)));
|
|
3505
|
+
console.log(mp.cabecalhoTemplate(template.id, template.versao, template.origem));
|
|
3506
|
+
console.log(mp.cabecalhoExemplo(modos_1.MODOS[modo].tag, (0, phase_1.hashDoPrompt)(prompt)));
|
|
3241
3507
|
console.log('');
|
|
3242
3508
|
console.log(prompt);
|
|
3243
3509
|
return 0;
|
|
@@ -3245,29 +3511,35 @@ function comandoPrompt(args) {
|
|
|
3245
3511
|
const obrigatorio = (0, manifest_1.exigirManifesto)();
|
|
3246
3512
|
const threadId = args.posicionais[2];
|
|
3247
3513
|
if (!threadId) {
|
|
3248
|
-
console.error(
|
|
3249
|
-
console.error(
|
|
3514
|
+
console.error(mp.usoRenderThread);
|
|
3515
|
+
console.error(mp.usoRenderExemplo);
|
|
3250
3516
|
return 2;
|
|
3251
3517
|
}
|
|
3252
3518
|
const thread = (0, thread_1.lerThread)(obrigatorio.raiz, threadId);
|
|
3253
|
-
|
|
3519
|
+
// RM-059 (T6.0): sem --pedido, o pedido guardado na criacao, conferido pelo sha256; thread sem pedido
|
|
3520
|
+
// guardado segue com o texto de exemplo, como antes.
|
|
3521
|
+
const guardado = texto(args.opcoes.pedido) === undefined ? (0, thread_1.pedidoDaThread)(obrigatorio.raiz, thread) : null;
|
|
3522
|
+
const pedidoDaFase = guardado?.texto ?? pedido;
|
|
3523
|
+
const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, obrigatorio.raiz) : (0, prompts_1.templateDaFase)(fase, obrigatorio.raiz, linguaDoPrompt);
|
|
3254
3524
|
const prompt = idTemplate
|
|
3255
|
-
? (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(thread, fase,
|
|
3256
|
-
: (0, phase_1.montarPrompt)(thread, fase,
|
|
3257
|
-
console.log(
|
|
3258
|
-
console.log(
|
|
3525
|
+
? (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(thread, fase, pedidoDaFase, '', (0, prompts_1.idiomaDoTemplate)(template)))
|
|
3526
|
+
: (0, phase_1.montarPrompt)(thread, fase, pedidoDaFase, obrigatorio.raiz, '', linguaDoPrompt);
|
|
3527
|
+
console.log(mp.cabecalhoTemplate(template.id, template.versao, template.origem));
|
|
3528
|
+
console.log(mp.cabecalhoThread(thread.id, fase, (0, phase_1.hashDoPrompt)(prompt)));
|
|
3529
|
+
if (guardado)
|
|
3530
|
+
console.log(mp.pedidoGuardado((0, util_1.shaCurto)(guardado.sha256)));
|
|
3259
3531
|
console.log('');
|
|
3260
3532
|
console.log(prompt);
|
|
3261
3533
|
return 0;
|
|
3262
3534
|
}
|
|
3263
|
-
console.error(
|
|
3535
|
+
console.error(mp.subcomandoDesconhecido(sub));
|
|
3264
3536
|
return 2;
|
|
3265
3537
|
}
|
|
3266
3538
|
/** Fase canonica a partir do texto do usuario, com erro tipado quando nao existe. */
|
|
3267
3539
|
function exigirFaseCanonica(bruto) {
|
|
3268
3540
|
const alvo = (bruto ?? '').toUpperCase();
|
|
3269
3541
|
if (!types_1.FASES.includes(alvo)) {
|
|
3270
|
-
throw new Error(
|
|
3542
|
+
throw new Error((0, locale_1.msg)().prompts.cli.faseForaDoCiclo(bruto ?? '', types_1.FASES.join(' ')));
|
|
3271
3543
|
}
|
|
3272
3544
|
return alvo;
|
|
3273
3545
|
}
|
|
@@ -3289,6 +3561,7 @@ function orkEmExecucao() {
|
|
|
3289
3561
|
}
|
|
3290
3562
|
function comandoAdapter(args) {
|
|
3291
3563
|
const sub = args.posicionais[1] ?? 'list';
|
|
3564
|
+
const ma = (0, locale_1.msg)().adapter;
|
|
3292
3565
|
if (sub === 'list') {
|
|
3293
3566
|
console.log((0, hosts_1.tabelaDeHosts)());
|
|
3294
3567
|
return 0;
|
|
@@ -3296,13 +3569,12 @@ function comandoAdapter(args) {
|
|
|
3296
3569
|
if (sub === 'show') {
|
|
3297
3570
|
const host = (0, hosts_1.parseHost)(args.posicionais[2]);
|
|
3298
3571
|
if (!host) {
|
|
3299
|
-
console.error(
|
|
3572
|
+
console.error(ma.hostDesconhecido(args.posicionais[2] ?? '', hosts_1.ORDEM_DOS_HOSTS.join(' | ')));
|
|
3300
3573
|
return 2;
|
|
3301
3574
|
}
|
|
3302
|
-
|
|
3303
|
-
console.log(`
|
|
3304
|
-
console.log(` ${
|
|
3305
|
-
console.log(` destino padrao: <projeto>/${def.destinoPadrao}${def.subdir ? '/' + def.subdir : ''}`);
|
|
3575
|
+
console.log(ma.adaptador(host));
|
|
3576
|
+
console.log(` ${ma.hosts[host].descricao}`);
|
|
3577
|
+
console.log(` ${ma.destinoPadrao((0, hosts_1.destinoPadraoDe)(host))}`);
|
|
3306
3578
|
console.log('');
|
|
3307
3579
|
console.log((0, hosts_1.textoDosPitfalls)(host));
|
|
3308
3580
|
return 0;
|
|
@@ -3310,11 +3582,12 @@ function comandoAdapter(args) {
|
|
|
3310
3582
|
if (sub === 'install') {
|
|
3311
3583
|
const host = (0, hosts_1.parseHost)(args.posicionais[2]);
|
|
3312
3584
|
if (!host) {
|
|
3313
|
-
console.error(
|
|
3585
|
+
console.error(ma.hostDesconhecido(args.posicionais[2] ?? '', hosts_1.ORDEM_DOS_HOSTS.join(' | ')));
|
|
3314
3586
|
return 2;
|
|
3315
3587
|
}
|
|
3316
3588
|
const carregado = (0, manifest_1.carregarManifesto)();
|
|
3317
|
-
|
|
3589
|
+
// RM-061 (F3b, G4): instala no escopo pt-BR; os avisos nascem pelo catalogo e o texto os remonta no locale do comando.
|
|
3590
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, hosts_1.instalarAdaptador)(host, {
|
|
3318
3591
|
projeto: carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)(),
|
|
3319
3592
|
dir: texto(args.opcoes.dir),
|
|
3320
3593
|
dryRun: args.opcoes['dry-run'] === true,
|
|
@@ -3327,11 +3600,13 @@ function comandoAdapter(args) {
|
|
|
3327
3600
|
// unico caminho de saida. `;` separa varios, como o resto do CLI ja faz.
|
|
3328
3601
|
aceitarCatalogo: (texto(args.opcoes['aceitar-catalogo']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
|
|
3329
3602
|
manterCopia: (texto(args.opcoes['manter-copia']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
|
|
3330
|
-
|
|
3603
|
+
// RM-061 (F3a, D1 e D9): o bloco da experiência nasce na língua do dono; na F3b, o texto impresso segue o locale.
|
|
3604
|
+
locale: (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale,
|
|
3605
|
+
}));
|
|
3331
3606
|
console.log((0, hosts_1.textoDaInstalacao)(r));
|
|
3332
3607
|
return r.ok ? 0 : 2;
|
|
3333
3608
|
}
|
|
3334
|
-
console.error(
|
|
3609
|
+
console.error(ma.subcomandoDesconhecido(sub));
|
|
3335
3610
|
return 2;
|
|
3336
3611
|
}
|
|
3337
3612
|
/**
|
|
@@ -3341,7 +3616,8 @@ function comandoAdapter(args) {
|
|
|
3341
3616
|
* de zero em qualquer falha, para o CI do kit poder barrar merge sem eval.
|
|
3342
3617
|
*/
|
|
3343
3618
|
function comandoEval(args) {
|
|
3344
|
-
|
|
3619
|
+
// RM-047 (P4): o eval so executa o catalogo do proprio pacote, nunca o achado a partir do cwd.
|
|
3620
|
+
const catalogo = (0, catalogo_1.exigirCatalogoDoPacote)((0, manifest_1.carregarManifesto)()?.raiz ?? (0, manifest_1.diretorioDoProjeto)());
|
|
3345
3621
|
const lista = (v) => {
|
|
3346
3622
|
const t = texto(v);
|
|
3347
3623
|
return t ? t.split(',').map((x) => x.trim()).filter(Boolean) : undefined;
|
|
@@ -3369,6 +3645,7 @@ function comandoEval(args) {
|
|
|
3369
3645
|
* diferente de zero quando reprova, para o agendador do host perceber sem ler texto.
|
|
3370
3646
|
*/
|
|
3371
3647
|
function comandoAudit(args) {
|
|
3648
|
+
const m = (0, locale_1.msg)().audit;
|
|
3372
3649
|
if (args.posicionais[1] === 'process') {
|
|
3373
3650
|
const r = (0, process_audit_1.auditarProcesso)((0, manifest_1.exigirManifesto)(), args.opcoes.registrar === true);
|
|
3374
3651
|
console.log(JSON.stringify(r, null, 2));
|
|
@@ -3382,26 +3659,26 @@ function comandoAudit(args) {
|
|
|
3382
3659
|
const bruto = texto(args.opcoes.estagio) ?? texto(args.opcoes.stage);
|
|
3383
3660
|
const estagio = bruto ? (0, auditoria_1.parseEstagio)(bruto) : carregado?.manifesto.project.stage;
|
|
3384
3661
|
if (bruto && !estagio) {
|
|
3385
|
-
console.error(
|
|
3662
|
+
console.error(m.erro.estagio(bruto));
|
|
3386
3663
|
return 2;
|
|
3387
3664
|
}
|
|
3388
3665
|
const pack = texto(args.opcoes.pack) ?? args.posicionais[2];
|
|
3389
3666
|
if (pack) {
|
|
3390
3667
|
const alvo = (0, auditoria_1.parsePack)(pack);
|
|
3391
3668
|
if (!alvo) {
|
|
3392
|
-
console.error(
|
|
3669
|
+
console.error(m.erro.pack(pack, auditoria_1.ORDEM_DOS_PACKS.join(', ')));
|
|
3393
3670
|
return 2;
|
|
3394
3671
|
}
|
|
3395
3672
|
console.log((0, auditoria_1.textoDoPack)(alvo, estagio ?? undefined));
|
|
3396
3673
|
return 0;
|
|
3397
3674
|
}
|
|
3398
|
-
console.log(
|
|
3675
|
+
console.log(m.packs.titulo(estagio ?? undefined));
|
|
3399
3676
|
console.log('');
|
|
3400
3677
|
console.log((0, auditoria_1.tabelaDePacks)(estagio ?? undefined));
|
|
3401
3678
|
if (estagio) {
|
|
3402
3679
|
console.log('');
|
|
3403
|
-
console.log(
|
|
3404
|
-
console.log(
|
|
3680
|
+
console.log(m.packs.ativo((0, auditoria_1.packsAtivos)(estagio).join(', ')));
|
|
3681
|
+
console.log(m.packs.postura((0, auditoria_1.posturaDoPack)(estagio)));
|
|
3405
3682
|
}
|
|
3406
3683
|
return 0;
|
|
3407
3684
|
}
|
|
@@ -3409,25 +3686,24 @@ function comandoAudit(args) {
|
|
|
3409
3686
|
const raiz = (0, manifest_1.carregarManifesto)()?.raiz;
|
|
3410
3687
|
const templates = (0, auditoria_1.carregarTemplatesDeAuditoria)(raiz);
|
|
3411
3688
|
const problemas = templates.flatMap((t) => (0, auditoria_1.lintTemplateDeAuditoria)(t));
|
|
3412
|
-
console.log(
|
|
3689
|
+
console.log(m.cli.lintTitulo(raiz));
|
|
3413
3690
|
console.log('');
|
|
3414
3691
|
for (const p of problemas) {
|
|
3415
|
-
console.log(
|
|
3416
|
-
console.log(
|
|
3692
|
+
console.log(m.cli.lintItem(p.gravidade, p.template, p.regra));
|
|
3693
|
+
console.log(m.cli.lintDetalhe(p.detalhe));
|
|
3417
3694
|
}
|
|
3418
3695
|
if (problemas.length === 0)
|
|
3419
|
-
console.log(
|
|
3696
|
+
console.log(m.cli.lintOk(templates.length));
|
|
3420
3697
|
console.log('');
|
|
3421
|
-
console.log(
|
|
3422
|
-
`avisos: ${problemas.filter((p) => p.gravidade === 'aviso').length}`);
|
|
3698
|
+
console.log(m.cli.lintResumo(templates.length, problemas.filter((p) => p.gravidade === 'erro').length, problemas.filter((p) => p.gravidade === 'aviso').length));
|
|
3423
3699
|
return problemas.some((p) => p.gravidade === 'erro') ? 2 : 0;
|
|
3424
3700
|
}
|
|
3425
3701
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
3426
3702
|
if (sub === 'run') {
|
|
3427
3703
|
const pack = (0, auditoria_1.parsePack)(args.posicionais[2]);
|
|
3428
3704
|
if (!pack) {
|
|
3429
|
-
console.error('
|
|
3430
|
-
console.error(
|
|
3705
|
+
console.error(m.uso('run'));
|
|
3706
|
+
console.error(m.cli.packs(auditoria_1.ORDEM_DOS_PACKS.join(', ')));
|
|
3431
3707
|
return 2;
|
|
3432
3708
|
}
|
|
3433
3709
|
const autorizar = args.opcoes.agora;
|
|
@@ -3442,15 +3718,15 @@ function comandoAudit(args) {
|
|
|
3442
3718
|
forcar: args.opcoes.forcar === true || args.opcoes.force === true,
|
|
3443
3719
|
});
|
|
3444
3720
|
if (r.status === 'bloqueada') {
|
|
3445
|
-
console.error(
|
|
3721
|
+
console.error(m.cli.bloqueada(r.id));
|
|
3446
3722
|
console.error(` ${auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[r.motivo ?? 'runtime.unavailable']}`);
|
|
3447
|
-
console.error(
|
|
3448
|
-
console.error(
|
|
3449
|
-
console.error(
|
|
3723
|
+
console.error(m.cli.motivo(String(r.motivo)));
|
|
3724
|
+
console.error(m.cli.detalhe(r.detalhe));
|
|
3725
|
+
console.error(m.cli.estado(r.id));
|
|
3450
3726
|
return 1;
|
|
3451
3727
|
}
|
|
3452
3728
|
if (r.status === 'ensaio') {
|
|
3453
|
-
console.log(
|
|
3729
|
+
console.log(m.cli.ensaio(r.id));
|
|
3454
3730
|
console.log(` pack ${r.pack} (postura ${r.postura} no estagio ${r.estagio})`);
|
|
3455
3731
|
console.log(` escopo ${r.escopo.detalhe}`);
|
|
3456
3732
|
console.log(` graphify ${r.escopo.graphify}`);
|
|
@@ -3459,11 +3735,11 @@ function comandoAudit(args) {
|
|
|
3459
3735
|
console.log(` comando claude --bg "<prompt>" --name ${r.slug} --model ${r.custo.model} --effort ${r.custo.effort}`);
|
|
3460
3736
|
if (r.superficie) {
|
|
3461
3737
|
console.log(` superficie ${r.superficie.detalhe}`);
|
|
3462
|
-
console.log(
|
|
3738
|
+
console.log(m.cli.superficieDry(r.id));
|
|
3463
3739
|
}
|
|
3464
3740
|
return 0;
|
|
3465
3741
|
}
|
|
3466
|
-
console.log(
|
|
3742
|
+
console.log(m.cli.despachada(r.id, r.runtime));
|
|
3467
3743
|
console.log(` pack ${r.pack} (${auditoria_1.PACKS[r.pack].titulo})`);
|
|
3468
3744
|
console.log(` produto ${r.produto} (perfil ${r.perfil}), estagio ${r.estagio}, postura ${r.postura}`);
|
|
3469
3745
|
console.log(` escopo ${r.escopo.detalhe}`);
|
|
@@ -3472,29 +3748,29 @@ function comandoAudit(args) {
|
|
|
3472
3748
|
console.log(` janela ${r.custo.janela.detalhe}`);
|
|
3473
3749
|
console.log(` sessionId ${r.sessionId}`);
|
|
3474
3750
|
console.log(` prompt ${r.promptPath} (sha256 ${r.promptSha256})`);
|
|
3475
|
-
console.log(
|
|
3751
|
+
console.log(m.cli.verificada(r.verificada));
|
|
3476
3752
|
if (r.superficie) {
|
|
3477
3753
|
console.log(` superficie ${r.superficie.detalhe}`);
|
|
3478
|
-
console.log(
|
|
3479
|
-
(r.superficie.aConfirmar > 0
|
|
3480
|
-
? `, ${r.superficie.aConfirmar} com confianca baixa (pedem confirmacao humana)`
|
|
3481
|
-
: ''));
|
|
3754
|
+
console.log(m.cli.superficieBoard(r.superficie.registrados, r.superficie.aConfirmar));
|
|
3482
3755
|
}
|
|
3483
3756
|
console.log('');
|
|
3484
|
-
console.log(
|
|
3485
|
-
console.log(
|
|
3757
|
+
console.log(m.cli.proposta);
|
|
3758
|
+
console.log(m.cli.depois(r.id));
|
|
3486
3759
|
return r.verificada ? 0 : 1;
|
|
3487
3760
|
}
|
|
3488
3761
|
if (sub === 'list') {
|
|
3489
3762
|
console.log((0, auditrun_1.tabelaDeRodadas)(carregado.raiz));
|
|
3490
3763
|
console.log('');
|
|
3491
|
-
console.log(
|
|
3764
|
+
console.log(m.cli.board((0, auditrun_1.resumoDoBoard)(carregado.raiz)));
|
|
3492
3765
|
return 0;
|
|
3493
3766
|
}
|
|
3494
3767
|
if (sub === 'show') {
|
|
3768
|
+
const sobra = SOBRAS_DO_OBJECTIVE.find((opcao) => args.opcoes[opcao] !== undefined);
|
|
3769
|
+
if (sobra)
|
|
3770
|
+
return recusarSobraDoObjective(sobra);
|
|
3495
3771
|
const id = args.posicionais[2];
|
|
3496
3772
|
if (!id) {
|
|
3497
|
-
console.error('
|
|
3773
|
+
console.error(m.uso('show'));
|
|
3498
3774
|
return 2;
|
|
3499
3775
|
}
|
|
3500
3776
|
if (args.opcoes.ledger === true) {
|
|
@@ -3507,8 +3783,8 @@ function comandoAudit(args) {
|
|
|
3507
3783
|
if (sub === 'prompt') {
|
|
3508
3784
|
const pack = (0, auditoria_1.parsePack)(args.posicionais[2]);
|
|
3509
3785
|
if (!pack) {
|
|
3510
|
-
console.error('
|
|
3511
|
-
console.error(
|
|
3786
|
+
console.error(m.uso('prompt'));
|
|
3787
|
+
console.error(m.cli.packs(auditoria_1.ORDEM_DOS_PACKS.join(', ')));
|
|
3512
3788
|
return 2;
|
|
3513
3789
|
}
|
|
3514
3790
|
const { raiz, manifesto } = carregado;
|
|
@@ -3541,16 +3817,16 @@ function comandoAudit(args) {
|
|
|
3541
3817
|
const id = args.posicionais[2];
|
|
3542
3818
|
const arquivo = texto(args.opcoes.arquivo) ?? texto(args.opcoes.file);
|
|
3543
3819
|
if (!id || !arquivo) {
|
|
3544
|
-
console.error('
|
|
3820
|
+
console.error(m.uso('ingest'));
|
|
3545
3821
|
return 2;
|
|
3546
3822
|
}
|
|
3547
3823
|
const r = (0, auditrun_1.ingerirAchados)(carregado, id, arquivo);
|
|
3548
|
-
console.log(
|
|
3824
|
+
console.log(m.cli.ingestao(r.rodada, r.registrados.length));
|
|
3549
3825
|
// Bloco B6: cada proposta enderecada ao roadmap tambem vai para a colecao `roadmap`.
|
|
3550
3826
|
if (r.registrados.length > 0) {
|
|
3551
3827
|
const naMemoria = (0, memoria_1.publicarPropostas)(carregado, r.registrados);
|
|
3552
3828
|
if (naMemoria.regime === 'orkmind') {
|
|
3553
|
-
console.log(
|
|
3829
|
+
console.log(m.cli.memoriaMuitas(naMemoria.detalhe));
|
|
3554
3830
|
}
|
|
3555
3831
|
}
|
|
3556
3832
|
for (const a of r.registrados) {
|
|
@@ -3558,18 +3834,17 @@ function comandoAudit(args) {
|
|
|
3558
3834
|
}
|
|
3559
3835
|
if (r.duplicados.length > 0) {
|
|
3560
3836
|
console.log('');
|
|
3561
|
-
console.log(
|
|
3562
|
-
r.duplicados.map((a) => a.id).join(', '));
|
|
3837
|
+
console.log(m.cli.duplicados(r.duplicados.map((a) => a.id).join(', ')));
|
|
3563
3838
|
}
|
|
3564
3839
|
if (r.recusados.length > 0) {
|
|
3565
3840
|
console.log('');
|
|
3566
|
-
console.error(
|
|
3841
|
+
console.error(m.cli.recusados(r.recusados.length));
|
|
3567
3842
|
for (const rec of r.recusados) {
|
|
3568
|
-
console.error(
|
|
3843
|
+
console.error(m.cli.recusado(rec.indice + 1, rec.erro));
|
|
3569
3844
|
}
|
|
3570
3845
|
}
|
|
3571
3846
|
console.log('');
|
|
3572
|
-
console.log(
|
|
3847
|
+
console.log(m.cli.prove(r.rodada));
|
|
3573
3848
|
return r.recusados.length > 0 ? 1 : 0;
|
|
3574
3849
|
}
|
|
3575
3850
|
if (sub === 'finding' || sub === 'achado') {
|
|
@@ -3594,11 +3869,11 @@ function comandoAudit(args) {
|
|
|
3594
3869
|
irreversivel: texto(args.opcoes.irreversivel) ?? 'nenhum',
|
|
3595
3870
|
estimativa: texto(args.opcoes.estimativa),
|
|
3596
3871
|
});
|
|
3597
|
-
console.log(
|
|
3872
|
+
console.log(m.cli.achadoRegistrado(achado.id, id));
|
|
3598
3873
|
console.log((0, divida_1.textoDoAchado)(achado));
|
|
3599
3874
|
const naMemoria = (0, memoria_1.publicarPropostas)(carregado, [achado]);
|
|
3600
3875
|
if (naMemoria.regime === 'orkmind') {
|
|
3601
|
-
console.log(
|
|
3876
|
+
console.log(m.cli.memoriaUma(naMemoria.detalhe));
|
|
3602
3877
|
}
|
|
3603
3878
|
return 0;
|
|
3604
3879
|
}
|
|
@@ -3610,66 +3885,66 @@ function comandoAudit(args) {
|
|
|
3610
3885
|
return 2;
|
|
3611
3886
|
}
|
|
3612
3887
|
if (estado === 'virou-thread') {
|
|
3613
|
-
console.error(
|
|
3888
|
+
console.error(m.cli.estadoReservado);
|
|
3614
3889
|
return 2;
|
|
3615
3890
|
}
|
|
3616
3891
|
const achado = (0, divida_1.exigirAchado)(carregado.raiz, id);
|
|
3617
3892
|
const atualizado = (0, divida_1.carimbarAchado)(carregado.raiz, achado, { estado });
|
|
3618
|
-
console.log(
|
|
3893
|
+
console.log(m.cli.achadoEstado(atualizado.id, atualizado.estado));
|
|
3619
3894
|
console.log((0, divida_1.textoDoAchado)(atualizado));
|
|
3620
3895
|
return 0;
|
|
3621
3896
|
}
|
|
3622
|
-
console.error(
|
|
3897
|
+
console.error(m.cli.findingDesconhecido(acao ?? ''));
|
|
3623
3898
|
return 2;
|
|
3624
3899
|
}
|
|
3625
3900
|
if (sub === 'verify') {
|
|
3626
3901
|
const id = args.posicionais[2];
|
|
3627
3902
|
if (!id) {
|
|
3628
|
-
console.error('
|
|
3903
|
+
console.error(m.uso('verify'));
|
|
3629
3904
|
return 2;
|
|
3630
3905
|
}
|
|
3631
3906
|
const v = (0, auditrun_1.verificarRodada)(carregado, id);
|
|
3632
|
-
console.log(
|
|
3633
|
-
console.log(
|
|
3634
|
-
console.log(
|
|
3907
|
+
console.log(m.cli.verifyTitulo(v.rodada));
|
|
3908
|
+
console.log(m.cli.verifyHead(v.commit));
|
|
3909
|
+
console.log(m.cli.verifyDir(v.cwd));
|
|
3635
3910
|
console.log('');
|
|
3636
3911
|
if (v.resultados.length === 0) {
|
|
3637
|
-
console.log(
|
|
3912
|
+
console.log(m.cli.verifyVazio);
|
|
3638
3913
|
}
|
|
3639
3914
|
for (const r of v.resultados) {
|
|
3640
|
-
console.log(
|
|
3641
|
-
console.log(
|
|
3642
|
-
console.log(
|
|
3915
|
+
console.log(m.cli.verifyClaim(r.claim.id, r.verificado, r.claim.alegacao));
|
|
3916
|
+
console.log(m.cli.arquivo(r.claim.arquivo));
|
|
3917
|
+
console.log(r.claim.verificar.length > 0 ? m.cli.comandos(r.claim.verificar.join(' && ')) : m.cli.semComando);
|
|
3643
3918
|
if (!r.verificado)
|
|
3644
|
-
console.log(
|
|
3919
|
+
console.log(m.cli.motivoDetalhe(String(r.motivo), r.detalhe));
|
|
3645
3920
|
}
|
|
3646
3921
|
console.log('');
|
|
3647
3922
|
console.log(v.ok
|
|
3648
|
-
?
|
|
3649
|
-
:
|
|
3923
|
+
? m.cli.vereditoOk
|
|
3924
|
+
: m.cli.vereditoRuim(v.motivos.join(', ')));
|
|
3650
3925
|
if (v.motivos.includes('claims.unverifiable')) {
|
|
3651
|
-
console.log(
|
|
3926
|
+
console.log(m.cli.unverifiable);
|
|
3652
3927
|
}
|
|
3653
3928
|
return v.ok ? 0 : 1;
|
|
3654
3929
|
}
|
|
3655
3930
|
if (sub === 'report' || sub === 'relatorio') {
|
|
3656
3931
|
const id = args.posicionais[2];
|
|
3657
3932
|
if (!id) {
|
|
3658
|
-
console.error('
|
|
3933
|
+
console.error(m.uso('report'));
|
|
3659
3934
|
return 2;
|
|
3660
3935
|
}
|
|
3661
3936
|
const r = (0, auditrun_1.relatorioDaRodada)(carregado, id, { publicar: args.opcoes.publicar === true });
|
|
3662
3937
|
console.log(r.texto);
|
|
3663
|
-
console.log(
|
|
3938
|
+
console.log(m.cli.relatorio(r.caminho));
|
|
3664
3939
|
if (r.publicado)
|
|
3665
|
-
console.log(
|
|
3940
|
+
console.log(m.cli.publicado(r.publicado));
|
|
3666
3941
|
return 0;
|
|
3667
3942
|
}
|
|
3668
3943
|
if (sub === 'divida' || sub === 'board') {
|
|
3669
3944
|
const bruto = texto(args.opcoes.pack);
|
|
3670
3945
|
const pack = bruto ? (0, auditoria_1.parsePack)(bruto) : undefined;
|
|
3671
3946
|
if (bruto && !pack) {
|
|
3672
|
-
console.error(
|
|
3947
|
+
console.error(m.erro.pack(bruto, auditoria_1.ORDEM_DOS_PACKS.join(', ')));
|
|
3673
3948
|
return 2;
|
|
3674
3949
|
}
|
|
3675
3950
|
console.log((0, divida_1.tabelaDaDivida)(carregado.raiz, {
|
|
@@ -3685,14 +3960,14 @@ function comandoAudit(args) {
|
|
|
3685
3960
|
if (sub === 'surface' || sub === 'superficie') {
|
|
3686
3961
|
const bruta = texto(args.opcoes.regra);
|
|
3687
3962
|
if (bruta && !superficie_1.REGRAS_DE_SUPERFICIE.includes(bruta.toUpperCase())) {
|
|
3688
|
-
console.error(
|
|
3963
|
+
console.error(m.erro.regra(bruta, superficie_1.REGRAS_DE_SUPERFICIE.join(', ')));
|
|
3689
3964
|
return 2;
|
|
3690
3965
|
}
|
|
3691
3966
|
const regra = bruta ? bruta.toUpperCase() : undefined;
|
|
3692
3967
|
const limiteBruto = texto(args.opcoes.limite);
|
|
3693
3968
|
const limite = limiteBruto ? Number(limiteBruto) : undefined;
|
|
3694
3969
|
if (limite !== undefined && (!Number.isFinite(limite) || limite < 1)) {
|
|
3695
|
-
console.error(
|
|
3970
|
+
console.error(m.erro.limite(limiteBruto ?? ''));
|
|
3696
3971
|
return 2;
|
|
3697
3972
|
}
|
|
3698
3973
|
const rodadaAlvo = texto(args.opcoes.registrar);
|
|
@@ -3700,17 +3975,17 @@ function comandoAudit(args) {
|
|
|
3700
3975
|
const r = (0, auditrun_1.varrerSuperficieDaRodada)(carregado, rodadaAlvo, { registrar: true, limitePorRegra: limite });
|
|
3701
3976
|
console.log((0, superficie_1.textoDaVarredura)(r.resultado));
|
|
3702
3977
|
console.log('');
|
|
3703
|
-
console.log(
|
|
3978
|
+
console.log(m.cli.rodadaRegistrada(r.rodada, r.registrados.length));
|
|
3704
3979
|
for (const a of r.registrados)
|
|
3705
3980
|
console.log(` ${a.id} ${a.regra} ${a.arquivo}:${a.linha} ${a.titulo}`);
|
|
3706
3981
|
if (r.duplicados.length > 0) {
|
|
3707
|
-
console.log(
|
|
3982
|
+
console.log(m.cli.jaRegistrados(r.duplicados.map((a) => a.id).join(', ')));
|
|
3708
3983
|
}
|
|
3709
3984
|
for (const rec of r.recusados) {
|
|
3710
|
-
console.error(
|
|
3985
|
+
console.error(m.cli.recusadoSuperficie(rec.achado.regra, rec.achado.arquivo, rec.achado.linha, rec.erro));
|
|
3711
3986
|
}
|
|
3712
3987
|
console.log('');
|
|
3713
|
-
console.log(
|
|
3988
|
+
console.log(m.cli.prove(r.rodada));
|
|
3714
3989
|
if (r.recusados.length > 0)
|
|
3715
3990
|
return 1;
|
|
3716
3991
|
return r.registrados.length > 0 ? 1 : 0;
|
|
@@ -3729,7 +4004,7 @@ function comandoAudit(args) {
|
|
|
3729
4004
|
// Codigo != 0 com achado: o agendador do host percebe a superficie aberta sem ler texto.
|
|
3730
4005
|
return resultado.achados.length > 0 ? 1 : 0;
|
|
3731
4006
|
}
|
|
3732
|
-
console.error(
|
|
4007
|
+
console.error(m.uso(sub));
|
|
3733
4008
|
return 2;
|
|
3734
4009
|
}
|
|
3735
4010
|
/** Roteia o comando. Devolve o codigo de saida do processo. */
|
|
@@ -3740,8 +4015,9 @@ function comandoAudit(args) {
|
|
|
3740
4015
|
* que sempre teve. E o que garante que ligar o B6 nao muda o que o builder ja conhece.
|
|
3741
4016
|
*/
|
|
3742
4017
|
function relatarPublicacao(r) {
|
|
4018
|
+
const m = (0, locale_1.msg)().thread;
|
|
3743
4019
|
if (r.publicacao?.estado === 'pendente') {
|
|
3744
|
-
console.log(
|
|
4020
|
+
console.log(m.publicacaoPendente(`${r.publicacao.motivo}`));
|
|
3745
4021
|
return;
|
|
3746
4022
|
}
|
|
3747
4023
|
if (r.regime !== 'orkmind')
|
|
@@ -3754,9 +4030,9 @@ function relatarPublicacao(r) {
|
|
|
3754
4030
|
r.roadmap?.ok ? '1 roadmap' : '',
|
|
3755
4031
|
].filter((t) => t !== '');
|
|
3756
4032
|
console.log('');
|
|
3757
|
-
console.log(
|
|
4033
|
+
console.log(m.memoriaGravada(`${r.estado.tenant}`, gravados.join(', ') || m.nadaAGravar));
|
|
3758
4034
|
if (r.falhas > 0)
|
|
3759
|
-
console.log(
|
|
4035
|
+
console.log(m.gravacoesFalhas(r.falhas));
|
|
3760
4036
|
}
|
|
3761
4037
|
/** Janela de origem e corte de apresentação são inteiros positivos explícitos. */
|
|
3762
4038
|
function limiteDeLeitura(valor) {
|
|
@@ -3772,19 +4048,19 @@ function comandoRecall(args) {
|
|
|
3772
4048
|
const carregado = (0, project_state_1.memoryState)((0, manifest_1.exigirManifesto)()).loaded;
|
|
3773
4049
|
const id = args.posicionais[1];
|
|
3774
4050
|
if (!id) {
|
|
3775
|
-
console.error(
|
|
4051
|
+
console.error((0, locale_1.msg)().operacao.restante.recall.uso);
|
|
3776
4052
|
return 2;
|
|
3777
4053
|
}
|
|
3778
4054
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
3779
4055
|
const faseBruta = texto(args.opcoes.fase) ?? texto(args.opcoes.momento);
|
|
3780
4056
|
const momento = faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined;
|
|
3781
4057
|
const memoria = (0, memoria_1.abrirMemoria)(carregado, { leituraRestrita: { thread: id, limite: limiteDeLeitura(args.opcoes.janela) } });
|
|
3782
|
-
const r = (0, recall_1.recallDaThread)(carregado, memoria, id, {
|
|
4058
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, recall_1.recallDaThread)(carregado, memoria, id, {
|
|
3783
4059
|
momento,
|
|
3784
4060
|
id: texto(args.opcoes.id),
|
|
3785
4061
|
todos: args.opcoes.todos === true,
|
|
3786
4062
|
forcar: args.opcoes.forcar === true,
|
|
3787
|
-
});
|
|
4063
|
+
}));
|
|
3788
4064
|
if (args.opcoes.json === true) {
|
|
3789
4065
|
console.log(JSON.stringify(r, null, 2));
|
|
3790
4066
|
}
|
|
@@ -3799,15 +4075,16 @@ function comandoMemory(args) {
|
|
|
3799
4075
|
const candidate = (0, manifest_1.exigirManifesto)();
|
|
3800
4076
|
const carregado = (0, project_state_1.memoryState)(candidate).loaded;
|
|
3801
4077
|
const sub = args.posicionais[1] ?? 'status';
|
|
4078
|
+
const mm = (0, locale_1.msg)().operacao.restante.memory.cli;
|
|
3802
4079
|
const escopo = texto(args.opcoes.escopo)?.split(',').map(s => s.trim());
|
|
3803
4080
|
if (sub === 'inventory' || (sub === 'migrate' && args.opcoes['dry-run'] === true)) {
|
|
3804
4081
|
const r = (0, memory_migration_1.inventariarHandoffs)(carregado, escopo);
|
|
3805
4082
|
if (args.opcoes.json === true)
|
|
3806
4083
|
console.log(JSON.stringify(r, null, 2));
|
|
3807
4084
|
else {
|
|
3808
|
-
console.log(
|
|
4085
|
+
console.log(mm.inventario(r.tenant, r.incluidos, r.excluidos));
|
|
3809
4086
|
for (const f of r.fontes)
|
|
3810
|
-
console.log(
|
|
4087
|
+
console.log(mm.fonte(f.incluir, f.arquivo, f.motivo));
|
|
3811
4088
|
}
|
|
3812
4089
|
return r.fontes.some(f => f.bloqueante) ? 1 : 0;
|
|
3813
4090
|
}
|
|
@@ -3824,7 +4101,7 @@ function comandoMemory(args) {
|
|
|
3824
4101
|
if (args.opcoes.json === true)
|
|
3825
4102
|
console.log(JSON.stringify(r, null, 2));
|
|
3826
4103
|
else {
|
|
3827
|
-
console.log(
|
|
4104
|
+
console.log(mm.migracao(r.inventario.tenant, r.resultados.filter(i => i.ok).length, r.falhas, r.inventario.excluidos));
|
|
3828
4105
|
for (const item of r.resultados)
|
|
3829
4106
|
console.log(` ${item.arquivo}: ${item.ok ? item.gravacao?.id : item.erro}`);
|
|
3830
4107
|
}
|
|
@@ -3865,13 +4142,13 @@ function comandoMemory(args) {
|
|
|
3865
4142
|
const motivo = error instanceof Error
|
|
3866
4143
|
? /^(?:write\.activation|scope|memory)\.[a-z.-]+/.exec(error.message)?.[0] ?? 'write.activation.invalid'
|
|
3867
4144
|
: 'write.activation.invalid';
|
|
3868
|
-
const detalhe = '
|
|
4145
|
+
const detalhe = (0, locale_1.comLocale)('pt-BR', () => (0, locale_1.textoDoCatalogo)(m => m.operacao.restante.memory.cli.syncDetalhe));
|
|
3869
4146
|
if (args.opcoes.json === true)
|
|
3870
4147
|
console.log(JSON.stringify({
|
|
3871
4148
|
regime: memoria.regime, estado: memoria.estado, thread: threadId ?? null, perfil,
|
|
3872
4149
|
publicacao: { estado: 'pendente', motivo }, falhas: 1, gravadas: [], erro: motivo, detalhe,
|
|
3873
4150
|
}, null, 2));
|
|
3874
|
-
console.error(`${motivo}: ${detalhe}`);
|
|
4151
|
+
console.error(`${motivo}: ${(0, locale_1.remontar)(detalhe)}`);
|
|
3875
4152
|
return 1;
|
|
3876
4153
|
}
|
|
3877
4154
|
}
|
|
@@ -3895,7 +4172,7 @@ function comandoMemory(args) {
|
|
|
3895
4172
|
const janela = limiteDeLeitura(args.opcoes.janela);
|
|
3896
4173
|
const tagsBrutas = texto(args.opcoes.tags);
|
|
3897
4174
|
if (!tagsBrutas) {
|
|
3898
|
-
console.error(
|
|
4175
|
+
console.error(mm.tagsUso);
|
|
3899
4176
|
return 2;
|
|
3900
4177
|
}
|
|
3901
4178
|
let tags;
|
|
@@ -3903,7 +4180,7 @@ function comandoMemory(args) {
|
|
|
3903
4180
|
tags = JSON.parse(tagsBrutas);
|
|
3904
4181
|
}
|
|
3905
4182
|
catch (e) {
|
|
3906
|
-
console.error(
|
|
4183
|
+
console.error(mm.tagsInvalidas(e.message));
|
|
3907
4184
|
return 2;
|
|
3908
4185
|
}
|
|
3909
4186
|
const colecao = texto(args.opcoes.colecao) ?? texto(args.opcoes.collection);
|
|
@@ -3920,16 +4197,16 @@ function comandoMemory(args) {
|
|
|
3920
4197
|
limite,
|
|
3921
4198
|
});
|
|
3922
4199
|
if (threadId && memoria.regime === 'files')
|
|
3923
|
-
console.error(
|
|
4200
|
+
console.error(mm.files(`${memoria.estado.motivo}`));
|
|
3924
4201
|
if (args.opcoes.json === true) {
|
|
3925
4202
|
console.log(JSON.stringify(entradas, null, 2));
|
|
3926
4203
|
return 0;
|
|
3927
4204
|
}
|
|
3928
|
-
console.log(
|
|
4205
|
+
console.log(mm.buscaTag(memoria.regime));
|
|
3929
4206
|
console.log('');
|
|
3930
4207
|
if (memoria.regime === 'files') {
|
|
3931
4208
|
console.log(` ${memoria.estado.detalhe}`);
|
|
3932
|
-
console.log(
|
|
4209
|
+
console.log(mm.correcao(memoria.estado.correcao));
|
|
3933
4210
|
return 0;
|
|
3934
4211
|
}
|
|
3935
4212
|
for (const e of entradas) {
|
|
@@ -3937,13 +4214,13 @@ function comandoMemory(args) {
|
|
|
3937
4214
|
console.log(` ${e.content.split('\n')[0].slice(0, 100)}`);
|
|
3938
4215
|
}
|
|
3939
4216
|
console.log('');
|
|
3940
|
-
console.log(
|
|
4217
|
+
console.log(mm.entradas(entradas.length));
|
|
3941
4218
|
return 0;
|
|
3942
4219
|
}
|
|
3943
4220
|
if (sub === 'index') {
|
|
3944
4221
|
const modelo = texto(args.opcoes.modelo) ?? 'primario';
|
|
3945
4222
|
if (!['primario', 'fallback', 'todos'].includes(modelo)) {
|
|
3946
|
-
console.error(
|
|
4223
|
+
console.error(mm.indexUso);
|
|
3947
4224
|
return 2;
|
|
3948
4225
|
}
|
|
3949
4226
|
const memoria = (0, memoria_1.abrirMemoria)(carregado);
|
|
@@ -3952,7 +4229,7 @@ function comandoMemory(args) {
|
|
|
3952
4229
|
if (args.opcoes.json === true)
|
|
3953
4230
|
console.log(JSON.stringify(falha, null, 2));
|
|
3954
4231
|
else
|
|
3955
|
-
console.error(
|
|
4232
|
+
console.error(mm.indexFalha(memoria.regime, `${memoria.estado.motivo}`, memoria.estado.correcao));
|
|
3956
4233
|
return 1;
|
|
3957
4234
|
}
|
|
3958
4235
|
const config = (0, manifest_1.configDeEmbedding)(carregado.manifesto);
|
|
@@ -3965,11 +4242,11 @@ function comandoMemory(args) {
|
|
|
3965
4242
|
}
|
|
3966
4243
|
catch (erro) {
|
|
3967
4244
|
const motivo = (0, indice_vetorial_1.codigoDaFalha)(erro);
|
|
3968
|
-
const detalhe =
|
|
4245
|
+
const detalhe = mm.universoDetalhe;
|
|
3969
4246
|
if (args.opcoes.json === true)
|
|
3970
4247
|
console.log(JSON.stringify({ motivo, detalhe }, null, 2));
|
|
3971
4248
|
else
|
|
3972
|
-
console.error(
|
|
4249
|
+
console.error(mm.universoFalhou(motivo, detalhe));
|
|
3973
4250
|
return 1;
|
|
3974
4251
|
}
|
|
3975
4252
|
const alvos = modelo === 'todos' ? ['primario', 'fallback'] : [modelo];
|
|
@@ -3988,7 +4265,7 @@ function comandoMemory(args) {
|
|
|
3988
4265
|
}
|
|
3989
4266
|
return resultados.some(r => !r.dryRun && r.motivo) ? 1 : 0;
|
|
3990
4267
|
}
|
|
3991
|
-
console.error(
|
|
4268
|
+
console.error(mm.desconhecido(sub));
|
|
3992
4269
|
return 2;
|
|
3993
4270
|
}
|
|
3994
4271
|
/** Aviso informativo: não consulta rede, não reserva e não bloqueia criação. */
|
|
@@ -3996,17 +4273,18 @@ function avisoRoadmapSemAssociacao(nome, roadmap) {
|
|
|
3996
4273
|
const item = /\bRM-\d{3}\b/i.exec(nome)?.[0].toUpperCase();
|
|
3997
4274
|
if (!item || roadmap)
|
|
3998
4275
|
return null;
|
|
3999
|
-
return
|
|
4276
|
+
return (0, locale_1.msg)().thread.roadmapNoNome(item);
|
|
4000
4277
|
}
|
|
4001
4278
|
/**
|
|
4002
4279
|
* `ork memory search --texto` (I-38 D7): busca por significado, separada da busca por tag.
|
|
4003
4280
|
* Nao combina com --tags nem com a leitura restrita por thread nesta versao (erro tipado).
|
|
4004
4281
|
*/
|
|
4005
4282
|
function buscaPorTexto(args, carregado) {
|
|
4283
|
+
const mm = (0, locale_1.msg)().operacao.restante.memory.cli;
|
|
4006
4284
|
const frase = texto(args.opcoes.texto);
|
|
4007
4285
|
if (args.opcoes.tags !== undefined || args.opcoes.thread !== undefined || args.opcoes.restrito !== undefined ||
|
|
4008
4286
|
args.opcoes.janela !== undefined) {
|
|
4009
|
-
console.error(
|
|
4287
|
+
console.error(mm.textoExclusivo);
|
|
4010
4288
|
return 2;
|
|
4011
4289
|
}
|
|
4012
4290
|
const modo = (texto(args.opcoes.modo) ?? 'hibrido');
|
|
@@ -4016,7 +4294,7 @@ function buscaPorTexto(args, carregado) {
|
|
|
4016
4294
|
if (!(0, orkmind_1.textoDeBuscaValido)(frase) || !busca_semantica_1.MODOS_DE_BUSCA.includes(modo) ||
|
|
4017
4295
|
(colecao !== undefined && !orkmind_1.COLECOES_DO_ORK.includes(colecao)) ||
|
|
4018
4296
|
!Number.isInteger(limite) || limite < 1 || limite > busca_semantica_1.LIMITE_MAXIMO_DA_BUSCA) {
|
|
4019
|
-
console.error(
|
|
4297
|
+
console.error(mm.textoUso(busca_semantica_1.MODOS_DE_BUSCA.join('|'), orkmind_1.COLECOES_DO_ORK.join('|'), busca_semantica_1.LIMITE_MAXIMO_DA_BUSCA));
|
|
4020
4298
|
return 2;
|
|
4021
4299
|
}
|
|
4022
4300
|
const memoria = (0, memoria_1.abrirMemoria)(carregado);
|
|
@@ -4039,7 +4317,7 @@ function buscaPorTexto(args, carregado) {
|
|
|
4039
4317
|
}
|
|
4040
4318
|
else if (!universo) {
|
|
4041
4319
|
// RM-038: sem o universo inteiro nao ha busca; o motivo tipado sai, nunca um resultado parcial.
|
|
4042
|
-
r = { ...vazio, motivo: falhaDoUniverso, detalhe:
|
|
4320
|
+
r = { ...vazio, motivo: falhaDoUniverso, detalhe: mm.buscaUniversoDetalhe };
|
|
4043
4321
|
}
|
|
4044
4322
|
else {
|
|
4045
4323
|
const driver = (0, orkmind_1.configDoManifesto)(carregado.manifesto);
|
|
@@ -4087,25 +4365,60 @@ function extrairOpcaoDeProjeto(argv) {
|
|
|
4087
4365
|
return { argv: resto, projeto };
|
|
4088
4366
|
}
|
|
4089
4367
|
/** Comandos que nao leem projeto: o alvo nao e resolvido (nem recusado) para eles. */
|
|
4090
|
-
|
|
4368
|
+
// RM-062 (F1): `privado varrer` le o repositorio do diretorio atual (o checkout do CI, o clone de um site), nao o alvo.
|
|
4369
|
+
const COMANDOS_SEM_PROJETO = new Set(['demo', 'ciclos', 'mcp', 'init', 'projetos', 'privado']);
|
|
4370
|
+
/**
|
|
4371
|
+
* Fatia 2 (D3): os comandos que leem projeto e nao terminam com a linha `Projeto consultado`. Hoje so
|
|
4372
|
+
* o `sessions event`, o sensor dos hooks do Claude Code: maquina falando com maquina, e o sensor compara
|
|
4373
|
+
* o stderr da recusa. O `maestro` declara no snapshot e nao passa por aqui.
|
|
4374
|
+
*/
|
|
4375
|
+
const SEM_DECLARACAO_DO_PROJETO = new Set(['sessions event']);
|
|
4091
4376
|
/**
|
|
4092
4377
|
* Comandos cujo `--projeto` e DELES (RM-054: `ork network roadmap --projeto github:dono/repo`, que
|
|
4093
4378
|
* le varios projetos). A opcao volta intacta ao argv do subcomando e o alvo global nao e resolvido:
|
|
4094
4379
|
* nem `--projeto`, nem `ORK_PROJETO`, nem o modo host escolhem um projeto por eles.
|
|
4095
4380
|
*/
|
|
4096
4381
|
exports.COMANDOS_COM_PROJETO_PROPRIO = new Set(['network']);
|
|
4097
|
-
/**
|
|
4098
|
-
|
|
4382
|
+
/**
|
|
4383
|
+
* Resolve e fixa o projeto-alvo do processo (D2, D3). `null`: vale o cwd de sempre. Fatia 2 (D3): com
|
|
4384
|
+
* `declarar`, o comando termina dizendo qual projeto leu, quando o leitor nao tem como saber.
|
|
4385
|
+
*/
|
|
4386
|
+
function fixarAlvoDoProcesso(projeto, declarar = true) {
|
|
4099
4387
|
const alvo = (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto ?? null });
|
|
4100
4388
|
(0, projeto_alvo_1.fixarProjetoAlvo)(alvo);
|
|
4389
|
+
if (declarar)
|
|
4390
|
+
(0, projeto_alvo_1.pedirDeclaracaoDoProjeto)(alvo);
|
|
4101
4391
|
return alvo;
|
|
4102
4392
|
}
|
|
4393
|
+
/**
|
|
4394
|
+
* RM-052 (fatia 2, D3): o comando que leu um projeto que o leitor nao tem como adivinhar (no host, ou
|
|
4395
|
+
* fora do diretorio dele) escreve no fim a linha `Projeto consultado: ...` no stderr, salvo se ja montou
|
|
4396
|
+
* o proprio cabecalho. Quando ele falha, a linha sai antes da mensagem de erro, que a entrada imprime.
|
|
4397
|
+
*/
|
|
4103
4398
|
function main(argvBruto) {
|
|
4104
4399
|
// I-35: todo horário para pessoa sai no fuso do dono deste projeto (lido só se for preciso, e já
|
|
4105
4400
|
// depois de o projeto-alvo abaixo estar fixado: a fonte é preguiçosa).
|
|
4106
4401
|
(0, horario_1.registrarFonteDoFuso)(() => (0, horario_1.fusoDoManifesto)((0, manifest_1.carregarManifesto)()));
|
|
4107
4402
|
// RM-052: sem alvo herdado de uma chamada anterior no mesmo processo (os testes chamam `main` em serie).
|
|
4108
4403
|
(0, projeto_alvo_1.fixarProjetoAlvo)(null);
|
|
4404
|
+
// Prova de conceito do CLI por locale: cada chamada comeca em pt-BR; so os comandos cobertos trocam.
|
|
4405
|
+
(0, locale_1.ativarLocale)(undefined);
|
|
4406
|
+
// RM-061 (F2b, D1): e sem o registro dos textos remontaveis, que so os comandos cobertos ligam.
|
|
4407
|
+
(0, locale_1.ligarRemontagem)(false);
|
|
4408
|
+
(0, projeto_alvo_1.iniciarDeclaracaoDoProjeto)();
|
|
4409
|
+
try {
|
|
4410
|
+
return executarComando(argvBruto);
|
|
4411
|
+
}
|
|
4412
|
+
finally {
|
|
4413
|
+
// RM-061 (F2b): o registro dos textos remontaveis nao sobrevive a chamada (o locale sim: a entrada do CLI
|
|
4414
|
+
// ainda imprime o erro no locale do comando).
|
|
4415
|
+
(0, locale_1.ligarRemontagem)(false);
|
|
4416
|
+
const linha = (0, projeto_alvo_1.declaracaoQueFaltou)();
|
|
4417
|
+
if (linha)
|
|
4418
|
+
console.error(linha);
|
|
4419
|
+
}
|
|
4420
|
+
}
|
|
4421
|
+
function executarComando(argvBruto) {
|
|
4109
4422
|
const extraida = extrairOpcaoDeProjeto(argvBruto);
|
|
4110
4423
|
const proprio = exports.COMANDOS_COM_PROJETO_PROPRIO.has(parseArgs(extraida.argv).posicionais[0] ?? '');
|
|
4111
4424
|
const argv = proprio && extraida.projeto !== undefined
|
|
@@ -4132,8 +4445,9 @@ function main(argvBruto) {
|
|
|
4132
4445
|
if (argv[0] === 'maestro') {
|
|
4133
4446
|
if (argv.length === 2 && argv[1] === '--help')
|
|
4134
4447
|
return (0, maestro_cli_1.runMaestroCli)(argv.slice(1));
|
|
4135
|
-
// RM-052: o alvo explicito vira SELECAO entre as raizes permitidas; sem ele, o cwd de sempre.
|
|
4136
|
-
|
|
4448
|
+
// RM-052: o alvo explicito vira SELECAO entre as raizes permitidas; sem ele, o cwd de sempre. O
|
|
4449
|
+
// snapshot ja declara o projeto consultado (project.root, notConsulted): sem a linha da fatia 2.
|
|
4450
|
+
const alvo = fixarAlvoDoProcesso(projeto, false);
|
|
4137
4451
|
return alvo ? (0, maestro_cli_1.runMaestroCli)(argv.slice(1), alvo.raiz, { allowedRoots: [alvo.raiz], selected: alvo.raiz })
|
|
4138
4452
|
: (0, maestro_cli_1.runMaestroCli)(argv.slice(1));
|
|
4139
4453
|
}
|
|
@@ -4145,11 +4459,13 @@ function main(argvBruto) {
|
|
|
4145
4459
|
return 0;
|
|
4146
4460
|
}
|
|
4147
4461
|
if (!comando || args.opcoes.help === true || comando === 'help') {
|
|
4148
|
-
|
|
4462
|
+
(0, locale_1.ativarLocale)(localeDaAjuda(projeto));
|
|
4463
|
+
console.log((0, locale_1.msg)().ajuda.texto(dadosDaAjuda()));
|
|
4149
4464
|
return 0;
|
|
4150
4465
|
}
|
|
4151
|
-
if (!COMANDOS_SEM_PROJETO.has(comando) && !proprio)
|
|
4152
|
-
fixarAlvoDoProcesso(projeto);
|
|
4466
|
+
if (!COMANDOS_SEM_PROJETO.has(comando) && !proprio) {
|
|
4467
|
+
fixarAlvoDoProcesso(projeto, !SEM_DECLARACAO_DO_PROJETO.has(`${comando} ${args.posicionais[1] ?? ''}`.trim()));
|
|
4468
|
+
}
|
|
4153
4469
|
else if (projeto !== undefined && comando !== 'projetos') {
|
|
4154
4470
|
throw new Error(comando === 'init'
|
|
4155
4471
|
? 'uso: ork init cria o projeto no diretório atual; entre nele e rode ork init, sem --projeto'
|
|
@@ -4167,33 +4483,46 @@ function main(argvBruto) {
|
|
|
4167
4483
|
for (const nome of runtime_ambiente_1.ENVS_DE_PROVIDER_PAGO)
|
|
4168
4484
|
delete process.env[nome];
|
|
4169
4485
|
}
|
|
4486
|
+
// CLI por locale (RM-061, EN1 e EN7): a escolha do onboarding (owner.language) ou o LC_ALL/LC_MESSAGES/LANG
|
|
4487
|
+
// decidem a lingua do TEXTO dos comandos cobertos (`cobreLocale`); `--json` e contrato, e os recortes ainda
|
|
4488
|
+
// fora do catalogo (`doctor --modo` e os subcomandos fora da lista) ficam em pt-BR.
|
|
4489
|
+
if ((0, locale_1.cobreLocale)(args.posicionais, args.opcoes)) {
|
|
4490
|
+
(0, locale_1.ativarLocale)((0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale);
|
|
4491
|
+
(0, locale_1.ligarRemontagem)(true);
|
|
4492
|
+
}
|
|
4170
4493
|
switch (comando) {
|
|
4171
4494
|
case 'mcp': {
|
|
4172
4495
|
const projeto = texto(args.opcoes.project), host = texto(args.opcoes.host), threadId = texto(args.opcoes.thread);
|
|
4173
4496
|
// I-36 (D4): a identidade do despacho so chega com a thread vinculada da sessao filha.
|
|
4174
4497
|
const dispatchId = texto(args.opcoes.dispatch);
|
|
4175
|
-
const
|
|
4498
|
+
const transporteDado = texto(args.opcoes['ship-transport']);
|
|
4499
|
+
const transporteShip = transporteDado ?? 'github-ssh';
|
|
4500
|
+
const impressaoSsh = texto(args.opcoes['ssh-fingerprint']);
|
|
4176
4501
|
const permissoesFilho = texto(args.opcoes['child-permissions']) ?? 'interactive';
|
|
4177
4502
|
const permissoesDono = texto(args.opcoes['owner-permissions']);
|
|
4178
4503
|
const acao = args.posicionais[1];
|
|
4179
4504
|
if (args.posicionais.length !== 2 || !['serve', 'install'].includes(acao) || !projeto ||
|
|
4180
4505
|
(host !== 'codex' && host !== 'claude-code') ||
|
|
4181
|
-
Object.keys(args.opcoes).some(k => !['project', 'host', 'ship-transport', 'child-permissions', ...(acao === 'install' ? ['dry-run', 'owner-permissions'] : ['thread', 'dispatch'])].includes(k)) ||
|
|
4506
|
+
Object.keys(args.opcoes).some(k => !['project', 'host', 'ship-transport', 'child-permissions', ...(acao === 'install' ? ['dry-run', 'owner-permissions', 'ssh-fingerprint'] : ['thread', 'dispatch'])].includes(k)) ||
|
|
4182
4507
|
(args.opcoes.dispatch !== undefined && (!threadId || !dispatchId || !/^[a-f0-9-]{36}$/.test(dispatchId))) ||
|
|
4183
4508
|
argv.filter(a => a === '--ship-transport' || a.startsWith('--ship-transport=')).length > 1 ||
|
|
4184
4509
|
argv.filter(a => a === '--child-permissions' || a.startsWith('--child-permissions=')).length > 1 ||
|
|
4510
|
+
argv.filter(a => a === '--ssh-fingerprint' || a.startsWith('--ssh-fingerprint=')).length > 1 ||
|
|
4511
|
+
(args.opcoes['ssh-fingerprint'] !== undefined && (transporteShip !== 'forja-ssh' || typeof args.opcoes['ssh-fingerprint'] !== 'string' || !/^SHA256:[A-Za-z0-9+/]{43}$/.test(impressaoSsh ?? ''))) ||
|
|
4185
4512
|
(args.opcoes['owner-permissions'] !== undefined && (host !== 'codex' || typeof args.opcoes['owner-permissions'] !== 'string' || !['interactive', 'orchestrate'].includes(permissoesDono ?? ''))) ||
|
|
4186
4513
|
argv.filter(a => a === '--owner-permissions' || a.startsWith('--owner-permissions=')).length > 1 ||
|
|
4187
4514
|
!['interactive', 'worktree'].includes(permissoesFilho) ||
|
|
4188
4515
|
(args.opcoes['child-permissions'] !== undefined && typeof args.opcoes['child-permissions'] !== 'string') ||
|
|
4189
|
-
!
|
|
4516
|
+
!(0, mcp_transportes_1.ehTransporteShipMcp)(transporteShip) ||
|
|
4190
4517
|
(args.opcoes['ship-transport'] !== undefined && typeof args.opcoes['ship-transport'] !== 'string') ||
|
|
4191
4518
|
(args.opcoes.thread !== undefined && (!threadId || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(threadId))) ||
|
|
4192
4519
|
(args.opcoes['dry-run'] !== undefined && args.opcoes['dry-run'] !== true))
|
|
4193
|
-
throw new Error(
|
|
4520
|
+
throw new Error((0, locale_1.msg)().operacao.restante.mcp.uso);
|
|
4194
4521
|
if (acao === 'install') {
|
|
4195
|
-
void Promise.resolve().then(() => __importStar(require('./mcp-install'))).then(({ instalarMcp, textoInstalacaoMcp }) => console.log(textoInstalacaoMcp(instalarMcp({ projeto, host, dryRun: args.opcoes['dry-run'] === true,
|
|
4196
|
-
|
|
4522
|
+
void Promise.resolve().then(() => __importStar(require('./mcp-install'))).then(({ instalarMcp, textoInstalacaoMcp }) => console.log(textoInstalacaoMcp(instalarMcp({ projeto, host, dryRun: args.opcoes['dry-run'] === true,
|
|
4523
|
+
transporteShip: transporteDado === undefined ? undefined : transporteShip, impressaoSsh,
|
|
4524
|
+
permissoesFilho: permissoesFilho, permissoesDono: permissoesDono }))))
|
|
4525
|
+
.catch(e => { console.error((0, locale_1.msg)().operacao.restante.mcp.erro(e.message)); process.exitCode = 1; });
|
|
4197
4526
|
return 0;
|
|
4198
4527
|
}
|
|
4199
4528
|
void Promise.resolve().then(() => __importStar(require('./mcp-server'))).then(({ servirMcp }) => servirMcp({ projeto, host, threadId, dispatchId, nomesProviderHerdados: nomesHerdados, transporteShip: transporteShip, permissoesFilho: permissoesFilho })).catch(e => { console.error(`mcp: ${e.message}`); process.exitCode = 1; });
|
|
@@ -4210,40 +4539,60 @@ function main(argvBruto) {
|
|
|
4210
4539
|
return r.prontoPrimeiroBloco ? 0 : 1;
|
|
4211
4540
|
}
|
|
4212
4541
|
// RM-031: o check dos analisadores do grafo entra por aqui, a porta da familia do grafo (fronteira do KG1).
|
|
4213
|
-
|
|
4542
|
+
// RM-061 (F2a): a redacao do check vem do catalogo, no locale do comando (a familia do grafo nao o importa).
|
|
4543
|
+
const analisadores = () => (0, intelligence_graph_cli_1.checarAnalisadoresDoGrafo)(versao_1.VERSAO_DO_ORK, undefined, undefined, (0, locale_1.msg)().doctor.grafo);
|
|
4544
|
+
// `--forja=false` ou `--forja <valor>` nao vira `nao-medida` calado: a flag e booleana.
|
|
4545
|
+
if (args.opcoes.forja !== undefined && args.opcoes.forja !== true) {
|
|
4546
|
+
console.error((0, locale_1.msg)().forja.doctor.flagComValor);
|
|
4547
|
+
return 2;
|
|
4548
|
+
}
|
|
4549
|
+
// RM-063 (fatia 3, H1): `--json` e o contrato `ork.doctor/v1` que a batida do host le, com a idade da batida.
|
|
4550
|
+
if (args.opcoes.json === true) {
|
|
4551
|
+
// A batida dos hosts le o --json com frequencia: a secao forja (rede e CLI) so com --forja.
|
|
4552
|
+
const j = (0, doctor_1.doctorJson)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, analisadores, undefined, args.opcoes.forja === true ? doctor_forja_1.checarForja : undefined);
|
|
4553
|
+
console.log(JSON.stringify(j.json, null, 2));
|
|
4554
|
+
return j.codigo;
|
|
4555
|
+
}
|
|
4556
|
+
const r = (0, doctor_1.doctor)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, analisadores, doctor_forja_1.checarForja);
|
|
4214
4557
|
console.log(r.texto);
|
|
4215
4558
|
return r.codigo;
|
|
4216
4559
|
}
|
|
4217
4560
|
case 'init': {
|
|
4218
4561
|
(0, init_1.exigirRepositorioParaInit)(process.cwd());
|
|
4562
|
+
// RM-061 (F3a, D1 e D2): os arquivos nascem na lingua do dono no momento da geracao, resolvida pelo manifesto lido
|
|
4563
|
+
// antes do `--force` regrava-lo (o YAML e o AGENTS.md saem na mesma lingua) e independente do texto impresso, que
|
|
4564
|
+
// nao segue o locale com `--json` (GO-FIX do CHECK, W3).
|
|
4565
|
+
const localeDosArquivos = (0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale;
|
|
4219
4566
|
const r = (0, init_1.init)(process.cwd(), {
|
|
4220
4567
|
force: args.opcoes.force === true,
|
|
4221
4568
|
nome: texto(args.opcoes.name) ?? texto(args.opcoes.nome),
|
|
4222
4569
|
abbrev: texto(args.opcoes.abbrev),
|
|
4570
|
+
locale: localeDosArquivos,
|
|
4223
4571
|
});
|
|
4224
4572
|
const carregado = (0, manifest_1.exigirManifesto)(r.deteccao.raiz);
|
|
4225
|
-
const agents = (0, agents_md_1.atualizarAgentsMd)(r.deteccao.raiz, carregado.manifesto);
|
|
4573
|
+
const agents = (0, agents_md_1.atualizarAgentsMd)(r.deteccao.raiz, carregado.manifesto, localeDosArquivos);
|
|
4226
4574
|
// RM-052 (D7): o projeto entra no registro desta maquina; falha vira aviso, nunca derruba o init.
|
|
4227
4575
|
const avisoDoRegistro = (0, projeto_alvo_1.registrarProjetoEmSilencio)(r.deteccao.raiz, 'init');
|
|
4228
4576
|
if (avisoDoRegistro)
|
|
4229
4577
|
console.error(avisoDoRegistro);
|
|
4578
|
+
const m = (0, locale_1.msg)().init, estadoAgents = m.estadosAgents[agents.estado] ?? agents.estado;
|
|
4230
4579
|
if (!r.criado) {
|
|
4231
|
-
console.log(
|
|
4232
|
-
console.log(
|
|
4233
|
-
console.log(
|
|
4580
|
+
console.log(m.jaExiste(r.caminho));
|
|
4581
|
+
console.log(m.nadaSobrescrito);
|
|
4582
|
+
console.log(m.agentsMd(estadoAgents, agents.caminho));
|
|
4234
4583
|
return 0;
|
|
4235
4584
|
}
|
|
4236
|
-
console.log(
|
|
4237
|
-
console.log(
|
|
4238
|
-
console.log(
|
|
4239
|
-
console.log(
|
|
4240
|
-
console.log(
|
|
4241
|
-
console.log(
|
|
4585
|
+
console.log(m.criado(r.caminho));
|
|
4586
|
+
console.log(m.projeto(r.deteccao.nome, r.deteccao.abbrev));
|
|
4587
|
+
console.log(m.branchBase(r.deteccao.baseBranch));
|
|
4588
|
+
console.log(m.gerenciador(r.deteccao.gerenciador));
|
|
4589
|
+
console.log(m.verify(Object.entries(r.deteccao.verify).map(([k, v]) => `${k}="${v}"`).join(', ') || m.semScript));
|
|
4590
|
+
console.log(m.agentsMdLinha(estadoAgents, agents.caminho));
|
|
4242
4591
|
// Fatia 2 do ensaio da 0.5.0 (P3): o estado fica fora do git por um `.gitignore` proprio.
|
|
4243
4592
|
if (r.estadoIgnorado)
|
|
4244
|
-
console.log(
|
|
4593
|
+
console.log(m.estado(manifest_1.DIR_ESTADO));
|
|
4245
4594
|
console.log('');
|
|
4246
|
-
console.log(
|
|
4595
|
+
console.log(m.proximoPasso);
|
|
4247
4596
|
return 0;
|
|
4248
4597
|
}
|
|
4249
4598
|
case 'modos': {
|
|
@@ -4267,6 +4616,23 @@ function main(argvBruto) {
|
|
|
4267
4616
|
const carregado = (0, manifest_1.carregarManifesto)();
|
|
4268
4617
|
// I-43: `#Look` no pedido nao pode cair no default em silencio. O adaptador
|
|
4269
4618
|
// recebe a recusa tipada e saida != 0, e quem escreveu a #TAG fica sabendo.
|
|
4619
|
+
// RM-058 N6 (D1): `#Noctum` é o modo do arco e só vale com envelope vigente; sem ele, recusa tipada, nunca o padrão.
|
|
4620
|
+
if ((0, noctum_modo_1.tagNoctumNoPedido)(pedido)) {
|
|
4621
|
+
let arcos;
|
|
4622
|
+
try {
|
|
4623
|
+
arcos = (0, noctum_modo_1.aceitarModoNoctum)(carregado?.raiz ?? null);
|
|
4624
|
+
}
|
|
4625
|
+
catch (e) {
|
|
4626
|
+
if (e instanceof noctum_envelope_1.RecusaDoArco) {
|
|
4627
|
+
console.error(e.message);
|
|
4628
|
+
return 2;
|
|
4629
|
+
}
|
|
4630
|
+
throw e;
|
|
4631
|
+
}
|
|
4632
|
+
console.log(args.opcoes.json === true ? JSON.stringify({ modo: 'noctum', tag: '#Noctum', daTag: true, origem: 'tag no pedido',
|
|
4633
|
+
arcos, modoDasThreads: 'auto' }) : 'noctum');
|
|
4634
|
+
return 0;
|
|
4635
|
+
}
|
|
4270
4636
|
const aposentado = (0, modos_1.extrairTagAposentadaDoPedido)(pedido);
|
|
4271
4637
|
if (aposentado) {
|
|
4272
4638
|
console.error((0, modos_1.recusaDeModoAposentado)(aposentado));
|
|
@@ -4311,16 +4677,17 @@ function main(argvBruto) {
|
|
|
4311
4677
|
}
|
|
4312
4678
|
if ((args.posicionais[1] ?? 'show') !== 'show' || args.posicionais.length > 2 ||
|
|
4313
4679
|
Object.keys(args.opcoes).some(k => k !== 'json') || ('json' in args.opcoes && args.opcoes.json !== true)) {
|
|
4314
|
-
throw Error(
|
|
4680
|
+
throw Error((0, locale_1.msg)().onboarding.experienciaUso);
|
|
4315
4681
|
}
|
|
4316
4682
|
const manifesto = (0, manifest_1.exigirManifesto)(), p = (0, experiencia_1.resolverExperiencia)(manifesto.manifesto.owner);
|
|
4317
4683
|
// Preferência inválida vale o padrão e faz o adapter install pular o pacote: a consulta avisa.
|
|
4318
4684
|
const avisos = manifesto.avisos.filter(a => a.startsWith('experiencia.config.invalid'));
|
|
4685
|
+
const m = (0, locale_1.msg)().onboarding;
|
|
4319
4686
|
console.log(args.opcoes.json ? JSON.stringify({ ...p, avisos }, null, 2) :
|
|
4320
|
-
|
|
4687
|
+
`${m.experiencia(p.experience, p.language, p.timezone, p.depth)}\nSkill: ${p.skill}\n` +
|
|
4321
4688
|
// Fatia 2 do ensaio da 0.5.0 (R2): as origens em texto, e nao o JSON cru.
|
|
4322
|
-
|
|
4323
|
-
avisos.map(a => `\
|
|
4689
|
+
m.experienciaOrigens(Object.entries(p.origem).map(([chave, origem]) => `${chave} ${m.origemDaPreferencia(origem)}`).join(', ')) +
|
|
4690
|
+
avisos.map(a => `\n${m.experienciaAviso(m.avisoDaPreferencia(a))}`).join(''));
|
|
4324
4691
|
return 0;
|
|
4325
4692
|
}
|
|
4326
4693
|
case 'thread':
|
|
@@ -4337,28 +4704,41 @@ function main(argvBruto) {
|
|
|
4337
4704
|
return comandoLedger(args);
|
|
4338
4705
|
case 'sessions':
|
|
4339
4706
|
return comandoSessions(args);
|
|
4707
|
+
case 'noctum':
|
|
4708
|
+
// RM-058 N6: a porta do CLI para o arco #Noctum (propor, responder, status, tique e relatorio).
|
|
4709
|
+
return (0, noctum_cli_1.comandoNoctum)(args);
|
|
4340
4710
|
case 'pulse': {
|
|
4341
4711
|
if (args.posicionais[1] === 'responder') {
|
|
4342
4712
|
// I-41 (GO-FIX 1, B1 e B2): o caminho de volta do resumo. So o ingresso autenticado chama;
|
|
4343
4713
|
// argv traz identificadores e o envelope assinado vem por stdin, como no `gate answer`.
|
|
4344
4714
|
if (args.opcoes['resposta-stdin'] !== true || args.opcoes.resposta !== undefined || args.posicionais.length !== 2) {
|
|
4345
|
-
throw new Error(
|
|
4715
|
+
throw new Error((0, locale_1.msg)().operacao.pulseCadencia.responderUso);
|
|
4346
4716
|
}
|
|
4347
4717
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
4348
4718
|
const envelope = (0, hitl_gates_1.lerRespostaStdin)({ por: texto(args.opcoes.por), mensagem: texto(args.opcoes.mensagem),
|
|
4349
4719
|
origem: texto(args.opcoes.origem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
|
|
4350
4720
|
const formato = texto(args.opcoes.formato);
|
|
4351
4721
|
if (formato !== undefined && formato !== 'telegram' && formato !== 'terminal')
|
|
4352
|
-
throw new Error(
|
|
4353
|
-
|
|
4722
|
+
throw new Error((0, locale_1.msg)().operacao.pulseCadencia.responderFormato);
|
|
4723
|
+
// RM-057 (resposta curta, D3; GO-FIX 1, achado 2): a mensagem respondida (reply), `<código>:<id>`, que o gateway
|
|
4724
|
+
// assinou no endereço do pulse; o núcleo só a aceita quando o id é o da mensagem em que a pergunta foi entregue.
|
|
4725
|
+
// GO-FIX 2 (R1): `outra` é a palavra solta em reply a outra mensagem, que o núcleo recusa dizendo por quê.
|
|
4726
|
+
const referencia = args.opcoes['em-resposta-a'];
|
|
4727
|
+
if (referencia !== undefined && !(0, pulse_consentimento_1.referenciaDoReplyValida)(referencia)) {
|
|
4728
|
+
throw new Error((0, locale_1.msg)().operacao.pulseCadencia.responderReferencia);
|
|
4729
|
+
}
|
|
4730
|
+
console.log(JSON.stringify((0, pulse_resposta_1.responderPeloPulse)(carregado.raiz, envelope, { canal: formato ?? 'telegram',
|
|
4731
|
+
...(typeof referencia === 'string' ? { referencia } : {}) })));
|
|
4354
4732
|
return 0;
|
|
4355
4733
|
}
|
|
4356
4734
|
if (args.posicionais[1] === 'cadencia')
|
|
4357
4735
|
return comandoCadenciaDoPulse(args);
|
|
4358
|
-
|
|
4736
|
+
// RM-061 (F2b, G2): o pulse grava (sensores, condução) e monta o --json em pt-BR; so o texto segue o locale.
|
|
4737
|
+
const carregadoDoPulse = (0, manifest_1.exigirManifesto)();
|
|
4738
|
+
const p = (0, locale_1.comLocale)('pt-BR', () => (0, pulse_1.montarPulse)(carregadoDoPulse, { registrar: args.opcoes.registrar === true,
|
|
4359
4739
|
escopo: texto(args.opcoes.escopo)?.split(',').map(s => s.trim()),
|
|
4360
4740
|
semRuntime: args.opcoes['sem-runtime'] === true,
|
|
4361
|
-
linhasLogs: texto(args.opcoes.linhas) === undefined ? undefined : Number(texto(args.opcoes.linhas)) });
|
|
4741
|
+
linhasLogs: texto(args.opcoes.linhas) === undefined ? undefined : Number(texto(args.opcoes.linhas)) }));
|
|
4362
4742
|
console.log(args.opcoes.json === true ? JSON.stringify(p, null, 2) : (0, pulse_1.textoDoPulse)(p));
|
|
4363
4743
|
return p.runtime.ok || args.opcoes['sem-runtime'] === true ? 0 : 1;
|
|
4364
4744
|
}
|
|
@@ -4370,6 +4750,8 @@ function main(argvBruto) {
|
|
|
4370
4750
|
return comandoVerify(args);
|
|
4371
4751
|
case 'ci':
|
|
4372
4752
|
return comandoCi(args);
|
|
4753
|
+
case 'privado':
|
|
4754
|
+
return comandoPrivado(args);
|
|
4373
4755
|
case 'gate':
|
|
4374
4756
|
return comandoGate(args);
|
|
4375
4757
|
case 'retry':
|
|
@@ -4385,6 +4767,8 @@ function main(argvBruto) {
|
|
|
4385
4767
|
console.log(JSON.stringify(result, null, 2));
|
|
4386
4768
|
return ['ok', 'empty', 'unknown', 'withheld', 'applied', 'rolled-back'].includes(result.state) ? 0 : 1;
|
|
4387
4769
|
}
|
|
4770
|
+
case 'conhecimento':
|
|
4771
|
+
return comandoConhecimento(args);
|
|
4388
4772
|
case 'memory':
|
|
4389
4773
|
return comandoMemory(args);
|
|
4390
4774
|
case 'grafo': {
|
|
@@ -4392,8 +4776,18 @@ function main(argvBruto) {
|
|
|
4392
4776
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
4393
4777
|
return (0, intelligence_graph_cli_1.executarGrafo)(argv.slice(argv.indexOf('grafo') + 1), { raiz: carregado.raiz, estado: (0, estado_thread_1.raizDoEstado)(carregado.raiz), repositorio: carregado.manifesto.project.name, versao: versao_1.VERSAO_DO_ORK,
|
|
4394
4778
|
contextoDaThread: (id) => (0, mcp_grafo_1.lerEntradaDaThread)(carregado.raiz, id),
|
|
4779
|
+
// RM-061 (F3d): a familia do grafo nao importa o catalogo (fronteira do KG3); a redacao vem daqui, no locale do comando.
|
|
4780
|
+
textos: (0, locale_1.msg)().grafo,
|
|
4395
4781
|
escrever: (texto) => console.log(texto) });
|
|
4396
4782
|
}
|
|
4783
|
+
case 'security-scan': {
|
|
4784
|
+
// Relatorio por SHA no estado da arvore principal; o argv cru depois do comando (o parser e estrito).
|
|
4785
|
+
const carregado = (0, manifest_1.exigirManifesto)();
|
|
4786
|
+
return (0, cli_1.executarSecurityScan)(argv.slice(argv.indexOf('security-scan') + 1), { raiz: carregado.raiz, estado: (0, estado_thread_1.raizDoEstado)(carregado.raiz), escrever: (texto) => console.log(texto),
|
|
4787
|
+
...(carregado.manifesto.check?.mode ? { modoDoManifesto: carregado.manifesto.check.mode } : {}),
|
|
4788
|
+
...(carregado.manifesto.check?.agile ? { agile: { osv_scanner: carregado.manifesto.check.agile.osv_scanner,
|
|
4789
|
+
oxlint: carregado.manifesto.check.agile.oxlint } } : {}) });
|
|
4790
|
+
}
|
|
4397
4791
|
case 'ship':
|
|
4398
4792
|
return comandoShip(args);
|
|
4399
4793
|
case 'activation':
|
|
@@ -4440,8 +4834,9 @@ function main(argvBruto) {
|
|
|
4440
4834
|
console.log((0, ciclos_1.tabelaDeVariantes)());
|
|
4441
4835
|
return 0;
|
|
4442
4836
|
default:
|
|
4443
|
-
|
|
4444
|
-
console.
|
|
4837
|
+
(0, locale_1.ativarLocale)(localeDaAjuda());
|
|
4838
|
+
console.error((0, locale_1.msg)().ajuda.comandoDesconhecido(comando));
|
|
4839
|
+
console.log((0, locale_1.msg)().ajuda.texto(dadosDaAjuda()));
|
|
4445
4840
|
return 2;
|
|
4446
4841
|
}
|
|
4447
4842
|
}
|
|
@@ -4455,13 +4850,20 @@ if (require.main === module) {
|
|
|
4455
4850
|
console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.recusa.texto);
|
|
4456
4851
|
process.exitCode = 3;
|
|
4457
4852
|
}
|
|
4853
|
+
else if (e instanceof fila_pesada_1.ErroDaFilaPesada) {
|
|
4854
|
+
// RM-058 N2 (D10): a fila pesada que nao deu a vez no prazo responde como a conducao: o texto ou o JSON, e 3.
|
|
4855
|
+
console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.recusa.texto);
|
|
4856
|
+
process.exitCode = 3;
|
|
4857
|
+
}
|
|
4458
4858
|
else if (e instanceof projeto_alvo_1.ErroDeProjeto) {
|
|
4459
4859
|
// RM-052 (D3): a recusa de projeto-alvo e a resposta (a escolha, os candidatos), nao um stack trace.
|
|
4460
4860
|
console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.texto);
|
|
4461
4861
|
process.exitCode = projeto_alvo_1.SAIDA_DE_PROJETO;
|
|
4462
4862
|
}
|
|
4463
4863
|
else {
|
|
4464
|
-
|
|
4864
|
+
// RM-061 (F2a, D11): o prefixo segue o locale do comando coberto; a mensagem sai como veio, salvo o
|
|
4865
|
+
// erro do catalogo, remontado no locale do comando (D14).
|
|
4866
|
+
console.error((0, locale_1.msg)().cli.erro((0, locale_1.mensagemDoErro)(e)));
|
|
4465
4867
|
process.exitCode = 1;
|
|
4466
4868
|
}
|
|
4467
4869
|
}
|