@orkastery/cli 0.5.6 → 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.
Files changed (385) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +118 -4
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. 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");
@@ -96,6 +101,7 @@ const claims_1 = require("./claims");
96
101
  const claims_conferir_1 = require("./claims-conferir");
97
102
  const catalogo_1 = require("./catalogo");
98
103
  const doctor_1 = require("./doctor");
104
+ const doctor_forja_1 = require("./doctor-forja");
99
105
  const preflight_1 = require("./preflight");
100
106
  const evalrunner_1 = require("./evalrunner");
101
107
  const gates_1 = require("./gates");
@@ -131,6 +137,9 @@ const ratelimit_1 = require("./ratelimit");
131
137
  const retry_1 = require("./retry");
132
138
  const prova_minima_1 = require("./prova-minima");
133
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");
134
143
  const modos_1 = require("./modos");
135
144
  const modos_migracao_1 = require("./modos-migracao");
136
145
  const setup_1 = require("./setup");
@@ -139,12 +148,17 @@ const claude_bg_1 = require("./adapters/claude-bg");
139
148
  const codex_1 = require("./adapters/codex");
140
149
  const conducao_1 = require("./conducao");
141
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");
142
155
  const phase_1 = require("./phase");
143
156
  const prompts_1 = require("./prompts");
144
157
  const sessoes_2 = require("./sessoes");
145
158
  const util_1 = require("./util");
146
159
  const ship_1 = require("./ship");
147
160
  const ci_1 = require("./ci");
161
+ const dado_privado_1 = require("./dado-privado");
148
162
  const thread_1 = require("./thread");
149
163
  const docs_1 = require("./docs");
150
164
  const roadmap_reservas_1 = require("./roadmap-reservas");
@@ -162,6 +176,7 @@ const rede_status_1 = require("./rede-status");
162
176
  const ledger_1 = require("./ledger");
163
177
  const tokens_1 = require("./tokens");
164
178
  const types_1 = require("./types");
179
+ const dependencias_da_worktree_1 = require("./dependencias-da-worktree");
165
180
  const verify_1 = require("./verify");
166
181
  const fila_pesada_1 = require("./fila-pesada");
167
182
  const worktree_1 = require("./worktree");
@@ -172,6 +187,7 @@ const entrega_pr_1 = require("./entrega-pr");
172
187
  const ship_publicar_1 = require("./ship-publicar");
173
188
  const projeto_alvo_1 = require("./projeto-alvo");
174
189
  const worktree_local_1 = require("./worktree-local");
190
+ const mcp_transportes_1 = require("./mcp-transportes");
175
191
  const postura_local_1 = require("./postura-local");
176
192
  /** A versao publicada em `@orkastery/cli`, lida do package.json (`versao.ts`). */
177
193
  // Antes de qualquer arquivo ou despacho: sem escrita de grupo nem de outros, que o sensor recusaria.
@@ -267,11 +283,13 @@ function comandoThread(args) {
267
283
  if (args.posicionais[1] === 'close' || args.posicionais[1] === 'entrega') {
268
284
  const raiz = (0, manifest_1.exigirManifesto)().raiz, id = args.posicionais[2];
269
285
  if (!id)
270
- throw new Error('informe o id da thread');
286
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.informeOId);
271
287
  const por = texto(args.opcoes.por) ?? '';
272
- const r = args.posicionais[1] === 'close'
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'
273
291
  ? (0, thread_close_1.fecharAdministrativamente)(raiz, id, { motivo: texto(args.opcoes.motivo) ?? '', por, justificativa: texto(args.opcoes.justificativa) ?? '' })
274
- : (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));
275
293
  console.log(JSON.stringify(r, null, 2));
276
294
  return 0;
277
295
  }
@@ -282,8 +300,14 @@ function comandoThread(args) {
282
300
  // O nome posicional passa a ser opcional, porque o titulo do achado ja serve de nome.
283
301
  const doAchado = texto(args.opcoes['from-finding']) ?? texto(args.opcoes['do-achado']);
284
302
  if (doAchado) {
303
+ const mf = (0, locale_1.msg)().thread.fromFinding;
285
304
  const brutoModoAchado = texto(args.opcoes.modo) ?? texto(args.opcoes.mode);
286
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
+ }
287
311
  if (brutoModoAchado !== undefined) {
288
312
  try {
289
313
  modoAchado = (0, modos_1.exigirModoVivo)(brutoModoAchado);
@@ -313,11 +337,12 @@ function comandoThread(args) {
313
337
  dryRun: args.opcoes['dry-run'] === true,
314
338
  });
315
339
  if (!r.ok) {
316
- console.error(`Thread a partir do achado ${r.achado.id} RECUSADA.`);
317
- console.error(` ${auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[r.motivo ?? 'claims.failed']}`);
318
- console.error(` motivo tipado: ${r.motivo}`);
319
- console.error(` detalhe: ${r.detalhe}`);
320
- console.error(` correcao: ${r.correcao}`);
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));
321
346
  return 1;
322
347
  }
323
348
  const gravadaDoAchado = args.opcoes['dry-run'] !== true;
@@ -326,8 +351,8 @@ function comandoThread(args) {
326
351
  if (avisoDoRegistroDoAchado)
327
352
  console.error(avisoDoRegistroDoAchado);
328
353
  console.log(gravadaDoAchado
329
- ? `Thread criada a partir do achado ${r.achado.id}.`
330
- : 'Simulacao (--dry-run), nada foi gravado.');
354
+ ? mf.criada(r.achado.id)
355
+ : mf.simulacao);
331
356
  console.log((0, divida_1.textoDoAchado)(r.achado));
332
357
  console.log('');
333
358
  if (r.thread) {
@@ -357,14 +382,14 @@ function comandoThread(args) {
357
382
  }));
358
383
  }
359
384
  if (gravadaDoAchado && r.thread) {
360
- console.log(` origem do GOAL: .orkastery/threads/${r.thread.id}/achado.json`);
385
+ console.log(mf.origemDoGoal(r.thread.id));
361
386
  console.log('');
362
- console.log('Pedido de GOAL ja montado a partir do achado:');
387
+ console.log(mf.pedidoMontado);
363
388
  console.log('');
364
389
  console.log(r.pedido);
365
390
  console.log('');
366
- console.log('Proximo passo:');
367
- console.log(` ork phase run ${r.thread.id} GOAL --prompt "$(cat .orkastery/threads/${r.thread.id}/pedido-goal.md)"`);
391
+ console.log(mf.proximoPasso);
392
+ console.log(mf.comandoDoProximoPasso(r.thread.id));
368
393
  }
369
394
  return 0;
370
395
  }
@@ -378,6 +403,11 @@ function comandoThread(args) {
378
403
  if (avisoRoadmap)
379
404
  console.error(avisoRoadmap);
380
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
+ }
381
411
  let modo;
382
412
  try {
383
413
  modo = brutoModo !== undefined
@@ -500,6 +530,7 @@ function comandoThread(args) {
500
530
  const linhaDaWorktreeNova = (0, thread_1.linhaDaWorktree)(criada.worktreePor, gravada, variante);
501
531
  if (linhaDaWorktreeNova)
502
532
  console.log(linhaDaWorktreeNova);
533
+ relatarDependencias(criada.dependencias, thread.worktree ?? '');
503
534
  const avisoDaWorktreeNova = criada.worktreeFalharia ? (0, thread_1.avisoDeWorktreeQueFalharia)(criada.worktreeFalharia)
504
535
  : (0, thread_1.avisoDaWorktree)(pedido.origem, criada, carregado.manifesto);
505
536
  const avisoSemBase = (0, thread_1.avisoDeThreadSemBase)(thread, gravada);
@@ -653,7 +684,12 @@ function comandoAccounts(args) {
653
684
  avisarChavesDePerfis(carregado);
654
685
  const raiz = carregado.raiz;
655
686
  const sub = args.posicionais[1] ?? 'list';
656
- const conferir = (p) => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p);
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;
657
693
  const imprimir = () => {
658
694
  const store = (0, runtime_profiles_1.lerPerfis)(raiz);
659
695
  if (args.opcoes.json === true) {
@@ -662,8 +698,7 @@ function comandoAccounts(args) {
662
698
  }
663
699
  // I-49: a tabela mostra o que o despacho enxerga, com o que outra fabrica viu na mesma conta.
664
700
  const visto = (0, runtime_profiles_1.lerPerfisComContas)(raiz);
665
- console.log(visto.perfis.length === 0 ? 'Nenhum perfil configurado: cada runtime despacha pelo ambiente do processo.'
666
- : (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)));
667
702
  // I-35: a tabela mostra horario do dono; o fuso sai uma vez, no fim da mensagem.
668
703
  if ((0, runtime_profiles_1.perfisComHorario)(store))
669
704
  console.log((0, horario_1.legendaDoFuso)());
@@ -675,7 +710,7 @@ function comandoAccounts(args) {
675
710
  if (sub === 'add') {
676
711
  const id = args.posicionais[2], runtime = texto(args.opcoes.runtime), dirBruto = texto(args.opcoes.dir);
677
712
  if (!id || !runtime || !dirBruto) {
678
- console.error('uso: ork accounts add <id> --runtime claude-bg|codex --dir <diretorio> [--sem-login]');
713
+ console.error(ma.usoAdd);
679
714
  return 2;
680
715
  }
681
716
  const dir = path.resolve(dirBruto);
@@ -684,12 +719,12 @@ function comandoAccounts(args) {
684
719
  // A7: diretorio inacessivel ou de outro usuario e recusado antes de qualquer gravacao no store.
685
720
  (0, runtime_profiles_1.prepararDiretorioDoPerfil)(dir);
686
721
  const desativado = (0, runtime_profiles_1.lerPerfis)(raiz).perfis.some(p => p.id === id && p.estado === 'desativado');
687
- 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 }));
688
723
  if (desativado)
689
- console.log(`Perfil ${id} reativado: mesmo id, runtime e diretorio do perfil desativado.`);
724
+ console.log(ma.reativado(id));
690
725
  }
691
726
  catch (e) {
692
- console.error(`perfil recusado: ${e.message}`);
727
+ console.error(ma.recusado((0, locale_1.mensagemDoErro)(e)));
693
728
  return 1;
694
729
  }
695
730
  const despacho = (0, runtime_profiles_1.perfilDeDespacho)(perfil);
@@ -702,59 +737,76 @@ function comandoAccounts(args) {
702
737
  (0, node_child_process_1.spawnSync)(comando[0], comando.slice(1), { stdio: 'inherit', env });
703
738
  }
704
739
  else {
705
- console.log(`Login pendente: rode ${variavel}=${aspasDeShell(dir)} ${comando.join(' ')} e depois ork accounts check ${id}`);
740
+ console.log(ma.loginPendente(variavel, aspasDeShell(dir), comando.join(' '), id));
706
741
  }
707
742
  const auth = conferir(despacho);
708
743
  // A14: conferencia inconclusiva nao marca sem-auth; o preflight do proximo despacho confere de novo.
709
744
  if (!auth.ok && !auth.transitorio)
710
- (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
711
746
  ? { estado: 'provider-pago', esgotadoAte: null, motivo: 'cost.violation', detalhe: auth.detalhe }
712
- : { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe });
713
- console.log(`Perfil ${id} (${perfil.runtime}) em ${dir}: ${auth.ok ? 'login de assinatura conferido'
714
- : auth.transitorio ? `conferencia de login inconclusiva (${auth.detalhe}); o proximo despacho confere de novo`
715
- : auth.pago ? `provider pago (${auth.detalhe}); nunca recebe despacho` : `sem login (${auth.detalhe}); fora do rodizio`}`);
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))));
716
751
  return 0;
717
752
  }
718
753
  if (sub === 'remove') {
719
754
  const id = args.posicionais[2];
720
755
  if (!id) {
721
- console.error('uso: ork accounts remove <id>');
756
+ console.error(ma.usoRemove);
722
757
  return 2;
723
758
  }
724
759
  try {
725
- (0, runtime_profiles_1.desativarPerfil)(raiz, id);
760
+ (0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.desativarPerfil)(raiz, id));
726
761
  }
727
762
  catch (e) {
728
- console.error(e.message);
763
+ console.error((0, locale_1.mensagemDoErro)(e));
729
764
  return 1;
730
765
  }
731
- console.log(`Perfil ${id} desativado: o diretorio e o login do CLI ficam onde estao.`);
766
+ console.log(ma.desativado(id));
732
767
  return 0;
733
768
  }
734
769
  if (sub === 'check') {
735
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));
736
772
  const perfis = (0, runtime_profiles_1.lerPerfis)(raiz).perfis.filter(p => p.estado !== 'desativado' && (alvo === undefined || p.id === alvo));
737
773
  if (alvo !== undefined && perfis.length === 0) {
738
- console.error(`perfil ativo "${alvo}" nao existe (veja: ork accounts list)`);
774
+ console.error(ma.perfilAtivoNaoExiste(alvo));
739
775
  return 1;
740
776
  }
777
+ const inventario = (0, sessoes_inventario_1.inventariarSessoes)(raiz, { global: true });
741
778
  let falhas = 0;
742
779
  for (const p of perfis) {
743
780
  const auth = conferir((0, runtime_profiles_1.perfilDeDespacho)(p));
744
- if (auth.ok && (p.estado === 'sem-auth' || p.estado === 'provider-pago'))
745
- (0, runtime_profiles_1.reativarPerfil)(raiz, p.id);
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
+ });
746
792
  if (!auth.ok)
747
793
  falhas++;
748
- if (!auth.ok && auth.transitorio)
749
- (0, runtime_profiles_1.registrarConferenciaInconclusiva)(raiz, p.id, auth.detalhe);
750
- else if (!auth.ok) {
751
- (0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, p.id, auth.pago
752
- ? { estado: 'provider-pago', esgotadoAte: null, motivo: 'cost.violation', detalhe: auth.detalhe }
753
- : { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe });
754
- }
755
- console.log(`${p.id} (${p.runtime}): ${auth.ok ? 'login de assinatura conferido'
756
- : auth.transitorio ? `conferencia de login inconclusiva, estado mantido (${auth.detalhe})`
757
- : auth.pago ? `provider pago, nunca despacha (${auth.detalhe})` : `sem login (${auth.detalhe})`}`);
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}`);
758
810
  }
759
811
  console.log('');
760
812
  imprimir();
@@ -767,13 +819,13 @@ function comandoAccounts(args) {
767
819
  relatorio = (0, esgotamentos_1.relatorioDeEsgotamentos)({ desde: texto(args.opcoes.desde) ?? '7d' });
768
820
  }
769
821
  catch (e) {
770
- console.error(`${e.message} (use --desde 7d, 24h, 30m ou uma data ISO)`);
822
+ console.error(ma.periodoInvalido(e.message));
771
823
  return 2;
772
824
  }
773
825
  console.log(args.opcoes.json === true ? JSON.stringify(relatorio, null, 2) : (0, esgotamentos_1.textoDosEsgotamentos)(relatorio));
774
826
  return 0;
775
827
  }
776
- console.error(`subcomando desconhecido: accounts ${sub} (use list, add, remove, check ou esgotamentos)`);
828
+ console.error(ma.desconhecido(sub));
777
829
  return 2;
778
830
  }
779
831
  function comandoSetup(args) {
@@ -781,6 +833,7 @@ function comandoSetup(args) {
781
833
  const raiz = carregado.raiz;
782
834
  const modoBruto = args.posicionais[1];
783
835
  const por = texto(args.opcoes.por) ?? 'owner';
836
+ const ms = (0, locale_1.msg)().setup.cli;
784
837
  if (modoBruto === 'versionar') {
785
838
  // I-52 (RM-047): o setup que vale agora vai para orkastery.setup.json, para entrar por PR.
786
839
  const r = (0, setup_1.versionarSetup)(raiz, por);
@@ -788,8 +841,8 @@ function comandoSetup(args) {
788
841
  console.log(JSON.stringify({ caminho: r.caminho, setup: r.setup }, null, 2));
789
842
  return 0;
790
843
  }
791
- console.log(`Setup versionado em ${r.caminho}.`);
792
- console.log(' Leve para o repositorio por PR: dali em diante ele vale em todas as maquinas, e ork setup <modo> --bloco N passa a editar este arquivo.');
844
+ console.log(ms.versionado(r.caminho));
845
+ console.log(ms.levePorPr);
793
846
  return 0;
794
847
  }
795
848
  if (modoBruto === 'worktree') {
@@ -802,8 +855,8 @@ function comandoSetup(args) {
802
855
  console.log(JSON.stringify(local, null, 2));
803
856
  return 0;
804
857
  }
805
- console.log(`Pasta das worktrees "${local.dir}" confirmada nesta maquina para ${local.raiz}.`);
806
- console.log(` Gravada em .orkastery/private/${worktree_local_1.ARQUIVO_WORKTREE_LOCAL} (local, fora do git). Para desfazer: ork setup worktree revogar.`);
858
+ console.log(ms.worktreeConfirmada(local.dir, local.raiz));
859
+ console.log(ms.worktreeGravada(worktree_local_1.ARQUIVO_WORKTREE_LOCAL));
807
860
  return 0;
808
861
  }
809
862
  if (acao === 'revogar') {
@@ -812,11 +865,11 @@ function comandoSetup(args) {
812
865
  console.log(JSON.stringify({ revogada: havia }, null, 2));
813
866
  return 0;
814
867
  }
815
- console.log(havia ? 'Confirmacao local da pasta das worktrees revogada.' : 'Nao havia confirmacao local da pasta das worktrees.');
868
+ console.log(havia ? ms.worktreeRevogada : ms.worktreeNaoHavia);
816
869
  return 0;
817
870
  }
818
871
  if (acao !== undefined) {
819
- console.error(`subcomando desconhecido: setup worktree ${acao} (use confirmar [<dir>] ou revogar)`);
872
+ console.error(ms.worktreeSubcomando(acao));
820
873
  return 2;
821
874
  }
822
875
  const pedida = (0, worktree_local_1.pastaDasWorktreesPedida)(raiz, carregado.manifesto);
@@ -827,9 +880,9 @@ function comandoSetup(args) {
827
880
  confirmadaNestaMaquina: local.local?.dir ?? null, criacao: recusa === null ? 'permitida' : 'recusada' }, null, 2));
828
881
  return 0;
829
882
  }
830
- console.log(`worktree.dir no orkastery.yaml: ${carregado.manifesto.worktree.dir} (${pedida.dir}, ${pedida.dentro ? 'dentro' : 'fora'} da raiz)`);
831
- console.log(`confirmacao local desta maquina: ${local.local ? local.local.dir : `nenhuma (${local.motivo})`}`);
832
- console.log(recusa === null ? 'criacao de worktree: permitida' : `criacao de worktree: recusada. ${worktree_local_1.COMANDO_CONFIRMAR_WORKTREE}`);
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));
833
886
  return 0;
834
887
  }
835
888
  if (modoBruto === 'sandbox') {
@@ -839,7 +892,7 @@ function comandoSetup(args) {
839
892
  if (acao === 'confirmar') {
840
893
  const postura = args.posicionais[3];
841
894
  if (!postura) {
842
- console.error('uso: ork setup sandbox confirmar <read-only|workspace-write|danger-full-access> [--por Q]');
895
+ console.error(ms.sandboxUso);
843
896
  return 2;
844
897
  }
845
898
  const p = (0, postura_local_1.confirmarPosturaLocal)(raiz, postura, por);
@@ -847,8 +900,8 @@ function comandoSetup(args) {
847
900
  console.log(JSON.stringify(p, null, 2));
848
901
  return 0;
849
902
  }
850
- console.log(`Postura de sandbox "${p.sandbox}" confirmada nesta maquina para ${p.raiz}.`);
851
- console.log(` Gravada em ${(0, postura_local_1.caminhoDaPosturaLocal)(raiz)} (local, fora do git). Para desfazer: ork setup sandbox revogar.`);
903
+ console.log(ms.sandboxConfirmada(p.sandbox, p.raiz));
904
+ console.log(ms.sandboxGravada((0, postura_local_1.caminhoDaPosturaLocal)(raiz)));
852
905
  return 0;
853
906
  }
854
907
  if (acao === 'revogar') {
@@ -857,11 +910,11 @@ function comandoSetup(args) {
857
910
  console.log(JSON.stringify({ revogada: havia }, null, 2));
858
911
  return 0;
859
912
  }
860
- console.log(havia ? 'Confirmacao local da postura de sandbox revogada.' : 'Nao havia confirmacao local de postura de sandbox.');
913
+ console.log(havia ? ms.sandboxRevogada : ms.sandboxNaoHavia);
861
914
  return 0;
862
915
  }
863
916
  if (acao !== undefined) {
864
- console.error(`subcomando desconhecido: setup sandbox ${acao} (use confirmar <postura> ou revogar)`);
917
+ console.error(ms.sandboxSubcomando(acao));
865
918
  return 2;
866
919
  }
867
920
  const pedida = carregado.manifesto.runtime.sandbox;
@@ -872,9 +925,9 @@ function comandoSetup(args) {
872
925
  confirmadaNestaMaquina: local.postura?.sandbox ?? null, despachoCodex: recusa === null ? 'permitido' : 'recusado' }, null, 2));
873
926
  return 0;
874
927
  }
875
- console.log(`runtime.sandbox no orkastery.yaml: ${pedida}`);
876
- console.log(`confirmacao local desta maquina: ${local.postura ? local.postura.sandbox : `nenhuma (${local.motivo})`}`);
877
- console.log(recusa === null ? 'despacho pelo codex: permitido' : `despacho pelo codex: recusado. ${(0, postura_local_1.comandoDeConfirmacao)(pedida)}`);
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)));
878
931
  return 0;
879
932
  }
880
933
  if (!modoBruto) {
@@ -884,7 +937,7 @@ function comandoSetup(args) {
884
937
  console.log(JSON.stringify((0, setup_1.lerSetup)(raiz), null, 2));
885
938
  return 0;
886
939
  }
887
- console.log('Setup resetado: todos os blocos de todos os modos voltaram ao default.');
940
+ console.log(ms.resetado);
888
941
  console.log((0, setup_1.textoDaEntrevista)(raiz));
889
942
  return 0;
890
943
  }
@@ -893,7 +946,7 @@ function comandoSetup(args) {
893
946
  }
894
947
  const modo = (0, modos_1.parseModo)(modoBruto);
895
948
  if (!modo) {
896
- console.error(`modo de conducao desconhecido: "${modoBruto}" (aceitos: ${modos_1.ORDEM_DOS_MODOS.join(', ')})`);
949
+ console.error(ms.modoDesconhecido(modoBruto, modos_1.ORDEM_DOS_MODOS.join(', ')));
897
950
  return 2;
898
951
  }
899
952
  if (args.opcoes.reset === true) {
@@ -902,7 +955,7 @@ function comandoSetup(args) {
902
955
  console.log(JSON.stringify((0, setup_1.lerSetup)(raiz).modos[modo], null, 2));
903
956
  return 0;
904
957
  }
905
- console.log(`Setup do modo ${modos_1.MODOS[modo].tag} resetado para o default.`);
958
+ console.log(ms.modoResetado(modos_1.MODOS[modo].tag));
906
959
  console.log('');
907
960
  console.log((0, setup_1.textoDoSetup)(raiz, modo));
908
961
  return 0;
@@ -915,26 +968,25 @@ function comandoSetup(args) {
915
968
  const fallbackBruto = args.opcoes.fallback === true ? '' : texto(args.opcoes.fallback);
916
969
  const fallback = fallbackBruto === undefined ? undefined : fallbackBruto.split(',').map(s => s.trim()).filter(s => s !== '');
917
970
  if (bloco === undefined && (runtime !== undefined || model !== undefined || effort !== undefined || fallback !== undefined)) {
918
- console.error('para editar, informe o bloco: ork setup <modo> --bloco N [--runtime R] [--model M] [--effort E] [--fallback R:M,...]');
971
+ console.error(ms.informeBloco);
919
972
  return 2;
920
973
  }
921
974
  if (bloco !== undefined) {
922
975
  if (runtime === undefined && model === undefined && effort === undefined && fallback === undefined) {
923
- console.error('nada para editar: informe --runtime, --model, --effort e/ou --fallback junto de --bloco');
976
+ console.error(ms.nadaParaEditar);
924
977
  return 2;
925
978
  }
926
979
  const r = (0, setup_1.editarBloco)(raiz, modo, Number(bloco), { runtime, model, effort, ...(fallback !== undefined ? { fallback } : {}) }, por);
927
980
  if (!r.ok) {
928
- console.error(`edicao recusada: ${r.erro}`);
981
+ console.error(ms.edicaoRecusada(r.erro ?? ''));
929
982
  return 1;
930
983
  }
931
984
  if (args.opcoes.json === true) {
932
985
  console.log(JSON.stringify(r.setup.modos[modo], null, 2));
933
986
  return 0;
934
987
  }
935
- console.log(`Bloco ${r.bloco} do modo ${modos_1.MODOS[modo].tag}: ` +
936
- `${r.de?.runtime}/${r.de?.model}/${r.de?.effort} -> ${r.para?.runtime}/${r.para?.model}/${r.para?.effort}`);
937
- 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));
938
990
  console.log('');
939
991
  console.log((0, setup_1.textoDoSetup)(raiz, modo));
940
992
  return 0;
@@ -1073,10 +1125,11 @@ function comandoPhase(args) {
1073
1125
  function comandoLedger(args) {
1074
1126
  const carregado = (0, manifest_1.exigirManifesto)();
1075
1127
  const sub = args.posicionais[1];
1128
+ const m = (0, locale_1.msg)().operacao.ledger;
1076
1129
  if (sub === 'stats') {
1077
1130
  const desde = texto(args.opcoes.desde);
1078
1131
  if (!desde)
1079
- throw Error('uso: ork ledger stats --desde 7d [--ate ISO] [--thread T] [--modo M] [--runtime R] [--json]');
1132
+ throw Error(m.usoStats);
1080
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) });
1081
1134
  console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, ledger_stats_1.textoDasEstatisticas)(r));
1082
1135
  return 0;
@@ -1085,12 +1138,12 @@ function comandoLedger(args) {
1085
1138
  const thread = args.posicionais[2], semIa = Number(texto(args.opcoes['sem-ia'])), iaSemOrk = Number(texto(args.opcoes['ia-sem-ork']));
1086
1139
  const por = texto(args.opcoes.por), metodo = texto(args.opcoes.metodo), premissas = texto(args.opcoes.premissas);
1087
1140
  if (!thread || !por || !metodo || !premissas)
1088
- throw Error('uso: ork ledger estimate <thread-id> --sem-ia H --ia-sem-ork H --por Q --metodo M --premissas P [--incerteza I]');
1141
+ throw Error(m.usoEstimate);
1089
1142
  const e = (0, ledger_stats_1.registrarEstimativaPlano)(carregado.raiz, thread, { semIaHoras: semIa, iaSemOrkHoras: iaSemOrk, por, metodo, premissas, incerteza: texto(args.opcoes.incerteza) });
1090
- console.log(args.opcoes.json === true ? JSON.stringify(e, null, 2) : `Estimativa PLAN registrada em ${thread}: sem IA ${semIa} h; IA sem Orkastery ${iaSemOrk} h.`);
1143
+ console.log(args.opcoes.json === true ? JSON.stringify(e, null, 2) : m.estimativa(thread, semIa, iaSemOrk));
1091
1144
  return 0;
1092
1145
  }
1093
- throw Error('uso: ork ledger stats|estimate ...');
1146
+ throw Error(m.uso);
1094
1147
  }
1095
1148
  /**
1096
1149
  * `ork sessions hitl`: quem, entre as sessoes do runtime, espera o humano AGORA.
@@ -1104,10 +1157,11 @@ function comandoLedger(args) {
1104
1157
  * como falha acionavel, sem precisar interpretar texto.
1105
1158
  */
1106
1159
  function comandoSessionsHitl(args, raiz) {
1160
+ const ms = (0, locale_1.msg)().operacao.restante.sessions;
1107
1161
  const bruto = texto(args.opcoes.atencao);
1108
1162
  const atencaoMin = bruto === undefined ? undefined : Number(bruto);
1109
1163
  if (atencaoMin !== undefined && (!Number.isFinite(atencaoMin) || atencaoMin < 0)) {
1110
- console.error(`--atencao espera minutos (inteiro >= 0), recebeu "${bruto}"`);
1164
+ console.error(ms.atencao(bruto ?? ''));
1111
1165
  return 2;
1112
1166
  }
1113
1167
  const radar = (0, hitl_1.varrerSessoes)({
@@ -1129,26 +1183,27 @@ function comandoSessionsHitl(args, raiz) {
1129
1183
  return 0;
1130
1184
  }
1131
1185
  function comandoSessions(args) {
1186
+ const ms = (0, locale_1.msg)().operacao.restante.sessions;
1132
1187
  const sub = args.posicionais[1];
1133
1188
  const carregado = (0, manifest_1.carregarManifesto)();
1134
1189
  const raiz = carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)();
1135
1190
  if (sub === 'watch') {
1136
1191
  const id = texto(args.opcoes.thread);
1137
1192
  if (!carregado || !id) {
1138
- console.error('uso: ork sessions watch --thread T [--sessao ID] [--once]');
1193
+ console.error(ms.usoWatch);
1139
1194
  return 2;
1140
1195
  }
1141
1196
  const thread = (0, thread_1.lerThread)(raiz, id);
1142
1197
  const sessionId = texto(args.opcoes.sessao) ?? thread.sessoes.at(-1)?.sessionId;
1143
1198
  if (!sessionId || !thread.sessoes.some(s => s.sessionId === sessionId))
1144
- throw new Error('sessão não pertence à thread');
1199
+ throw new Error(ms.sessaoDaThread);
1145
1200
  console.log(JSON.stringify(args.opcoes.once === true ? (0, session_watcher_1.observarSessao)(carregado, sessionId) : { pid: (0, session_watcher_1.iniciarWatcher)(raiz, sessionId) }));
1146
1201
  return 0;
1147
1202
  }
1148
1203
  if (sub === 'event') {
1149
1204
  const tipo = texto(args.opcoes.tipo), sessao = texto(args.opcoes.sessao);
1150
1205
  if (!carregado || !tipo || !sessao) {
1151
- console.error('uso: ork sessions event --tipo <tipo> --sessao <id> < payload.json (máximo 16384 bytes)');
1206
+ console.error(ms.usoEvent);
1152
1207
  return 2;
1153
1208
  }
1154
1209
  try {
@@ -1156,7 +1211,7 @@ function comandoSessions(args) {
1156
1211
  return 0;
1157
1212
  }
1158
1213
  catch (e) {
1159
- console.error(`evento recusado: ${e.message}`);
1214
+ console.error(ms.eventoRecusado(e.message));
1160
1215
  return 1;
1161
1216
  }
1162
1217
  }
@@ -1167,7 +1222,7 @@ function comandoSessions(args) {
1167
1222
  }
1168
1223
  if (sub === 'limpar-fantasmas') {
1169
1224
  if (!carregado) {
1170
- console.error('ork sessions limpar-fantasmas precisa de um projeto (orkastery.yaml)');
1225
+ console.error(ms.exigeProjeto);
1171
1226
  return 2;
1172
1227
  }
1173
1228
  const r = (0, sessoes_2.limparFantasmas)(raiz, { dryRun: args.opcoes['dry-run'] === true });
@@ -1181,14 +1236,14 @@ function comandoSessions(args) {
1181
1236
  const id = args.posicionais[2], sessionId = args.posicionais[3];
1182
1237
  const fase = texto(args.opcoes.fase), runtime = texto(args.opcoes.runtime), pergunta = texto(args.opcoes.pergunta);
1183
1238
  if (!id || !sessionId || !fase || !types_1.FASES.includes(fase) || !runtime)
1184
- throw new Error('sessions request exige thread, UUID, --fase e --runtime; --pergunta só confere o conteúdo nativo');
1239
+ throw new Error(ms.request);
1185
1240
  console.log(JSON.stringify((0, hitl_sessions_1.abrirPedidoSessao)(raiz, id, sessionId, { fase: fase, runtime, pergunta, prazo: texto(args.opcoes.prazo) })));
1186
1241
  return 0;
1187
1242
  }
1188
1243
  if (sub === 'answer') {
1189
1244
  const id = args.posicionais[2], pedido = args.posicionais[3];
1190
1245
  if (!id || !pedido || args.opcoes.stdin !== true)
1191
- throw new Error('sessions answer exige thread, pedido e envelope autenticado em --stdin');
1246
+ throw new Error(ms.answer);
1192
1247
  const r = (0, hitl_gates_1.lerRespostaStdin)({ origem: texto(args.opcoes.origem), por: texto(args.opcoes.por),
1193
1248
  mensagem: texto(args.opcoes.mensagem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
1194
1249
  console.log(JSON.stringify((0, hitl_sessions_1.responderSessao)(raiz, id, pedido, r)));
@@ -1199,7 +1254,7 @@ function comandoSessions(args) {
1199
1254
  // pergunta ao receptor, pelo recibo correlacionado, se ele recebeu aquele envioId.
1200
1255
  const id = args.posicionais[2], pedido = args.posicionais[3];
1201
1256
  if (!id || !pedido)
1202
- throw new Error('sessions reconcile exige thread e pedido');
1257
+ throw new Error(ms.reconcile);
1203
1258
  const r = (0, hitl_sessions_1.reconciliarEnvioDeSessao)(raiz, id, pedido);
1204
1259
  console.log(JSON.stringify(r));
1205
1260
  return r.estado === 'entregue' ? 0 : 1;
@@ -1208,13 +1263,13 @@ function comandoSessions(args) {
1208
1263
  const id = args.posicionais[2], sessionId = args.posicionais[3];
1209
1264
  const fase = texto(args.opcoes.fase), runtime = texto(args.opcoes.runtime);
1210
1265
  if (!id || !sessionId || !fase || !types_1.FASES.includes(fase) || !runtime)
1211
- throw new Error('sessions supersede exige thread, UUID, --fase e --runtime');
1266
+ throw new Error(ms.supersede);
1212
1267
  console.log(JSON.stringify((0, hitl_sessions_1.superarSessao)(raiz, id, sessionId, fase, runtime)));
1213
1268
  return 0;
1214
1269
  }
1215
1270
  const chave = args.posicionais[2];
1216
1271
  if (!chave) {
1217
- console.error(`uso: ork sessions ${sub} <sessao>`);
1272
+ console.error(ms.usoSub(sub));
1218
1273
  return 2;
1219
1274
  }
1220
1275
  if (sub === 'adopt') {
@@ -1239,7 +1294,7 @@ function comandoSessions(args) {
1239
1294
  console.log(r.texto);
1240
1295
  return r.codigo;
1241
1296
  }
1242
- console.error(`subcomando desconhecido: sessions ${sub}`);
1297
+ console.error(ms.desconhecido(sub));
1243
1298
  return 2;
1244
1299
  }
1245
1300
  /**
@@ -1254,15 +1309,15 @@ function comandoDecisao(args) {
1254
1309
  const campo = (nome) => {
1255
1310
  const v = texto(args.opcoes[nome]);
1256
1311
  if (!v)
1257
- throw new Error(`decisao registrar exige --${nome}`);
1312
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.exigeFlag(nome));
1258
1313
  return v;
1259
1314
  };
1260
1315
  if (!id)
1261
- throw new Error('uso: ork decisao registrar <thread-id> --decidido D --porque P ...');
1316
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.usoRegistrar);
1262
1317
  const bruto = campo('criterio'), separador = bruto.indexOf(':');
1263
1318
  const tipo = bruto.slice(0, separador), referencia = bruto.slice(separador + 1);
1264
1319
  if (separador < 1 || !['manifesto', 'ledger', 'medicao'].includes(tipo) || !referencia.trim()) {
1265
- throw new Error('decisao registrar: --criterio manifesto:CHAVE, ledger:REF ou medicao:COMANDO');
1320
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.criterioUso);
1266
1321
  }
1267
1322
  const entrada = {
1268
1323
  decidido: campo('decidido'), porque: campo('porque'), comoMudar: campo('como-mudar'),
@@ -1284,8 +1339,10 @@ function comandoDecisao(args) {
1284
1339
  return 0;
1285
1340
  }
1286
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;
1287
1344
  if (!id)
1288
- throw new Error('uso: ork decisao placar <thread-id> [--json]');
1345
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.usoPlacar);
1289
1346
  (0, thread_1.lerThread)(carregado.raiz, id);
1290
1347
  const placar = (0, decisao_autonoma_1.placarDaThread)((0, ledger_1.lerLedger)((0, thread_1.dirThread)(carregado.raiz, id)));
1291
1348
  const taxa = (0, decisao_autonoma_1.taxaDeReversao)(placar);
@@ -1293,12 +1350,12 @@ function comandoDecisao(args) {
1293
1350
  console.log(JSON.stringify({ thread: id, limiar: decisao_autonoma_1.LIMIAR_DE_DECISOES_POR_FASE, taxaDeReversao: taxa, fases: placar }, null, 2));
1294
1351
  return 0;
1295
1352
  }
1296
- console.log((0, util_1.tabela)(['FASE', 'DECIDIDAS', 'INFORMADAS', 'PERGUNTAS', 'REVERTIDAS', 'SEM RASTRO', 'LIMIAR'], placar.map(f => [f.fase, String(f.decididas), String(f.informadas), String(f.perguntas), String(f.revertidas),
1297
- String(f.semRastro), f.acimaDoLimiar ? `acima de ${decisao_autonoma_1.LIMIAR_DE_DECISOES_POR_FASE}: revisar` : 'ok'])));
1298
- console.log(`\ntaxa de reversão das decisões informadas: ${taxa === null ? 'sem decisão informada ainda' : `${Math.round(taxa * 100)}%`}`);
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));
1299
1356
  return 0;
1300
1357
  }
1301
- throw new Error('uso: ork decisao registrar|placar <thread-id>');
1358
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.uso);
1302
1359
  }
1303
1360
  /**
1304
1361
  * I-50 (RM-039): a tag que o dono manda no Telegram, pelo terminal. Sem tag, mostra a cadencia em
@@ -1306,14 +1363,15 @@ function comandoDecisao(args) {
1306
1363
  */
1307
1364
  function comandoCadenciaDoPulse(args) {
1308
1365
  const carregado = (0, manifest_1.exigirManifesto)();
1366
+ const m = (0, locale_1.msg)().operacao.pulseCadencia;
1309
1367
  if (args.posicionais.length > 3)
1310
- throw new Error('pulse cadencia: uma tag por vez');
1368
+ throw new Error(m.umaTag);
1311
1369
  const bruta = args.posicionais[2];
1312
1370
  const agora = new Date().toISOString();
1313
1371
  if (bruta !== undefined) {
1314
1372
  const lido = (0, pulse_resposta_1.interpretarRespostaDoPulse)(bruta.trim().startsWith('#') ? bruta : `#${bruta.trim()}`);
1315
1373
  if (lido.forma !== 'cadencia') {
1316
- throw new Error(`pulse cadencia: tag desconhecida "${bruta}"; use ${Object.keys(pulse_cadencia_1.CADENCIAS).join(', ')}`);
1374
+ throw new Error(m.desconhecida(bruta, Object.keys(pulse_cadencia_1.CADENCIAS).join(', ')));
1317
1375
  }
1318
1376
  (0, pulse_cadencia_1.gravarCadencia)(carregado.raiz, lido.tag, { por: texto(args.opcoes.por) ?? (0, node_os_1.userInfo)().username,
1319
1377
  canal: texto(args.opcoes.canal) ?? 'terminal', em: agora });
@@ -1326,39 +1384,42 @@ function comandoCadenciaDoPulse(args) {
1326
1384
  }
1327
1385
  console.log((0, pulse_cadencia_1.textoDaCadencia)(vigente, agora));
1328
1386
  console.log(vigente.gravada
1329
- ? `Trocada por ${vigente.gravada.por} (${vigente.gravada.canal}) em ${(0, horario_1.formatarDataHoraRotulada)(vigente.gravada.em)}.`
1330
- : 'Nenhuma tag gravada: vale a cadência padrão.');
1387
+ ? m.trocada(vigente.gravada.por, vigente.gravada.canal, (0, horario_1.formatarDataHoraRotulada)(vigente.gravada.em))
1388
+ : m.padrao);
1331
1389
  return 0;
1332
1390
  }
1333
1391
  function comandoClaims(args) {
1334
1392
  const carregado = (0, manifest_1.exigirManifesto)();
1335
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;
1336
1397
  if (sub === 'add') {
1337
1398
  const id = args.posicionais[2];
1338
1399
  const arquivo = args.posicionais[3];
1339
1400
  const alegacao = texto(args.opcoes.claim) ?? texto(args.opcoes.alegacao);
1340
1401
  if (!id || !arquivo || !alegacao) {
1341
- console.error('uso: ork claims add <thread-id> <arquivo> --claim "<alegacao>" [--verificar "<comando>"]');
1402
+ console.error(mc.usoAdd);
1342
1403
  return 2;
1343
1404
  }
1344
1405
  const comando = texto(args.opcoes.verificar) ?? texto(args.opcoes.verify);
1345
1406
  const faseBruta = texto(args.opcoes.fase);
1346
1407
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
1347
- 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, {
1348
1409
  arquivo,
1349
1410
  alegacao,
1350
1411
  verificar: comando ? [comando] : [],
1351
1412
  fase: faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined,
1352
- });
1353
- console.log(`Claim ${claim.id} registrada na thread ${id}.`);
1354
- console.log(` arquivo ${claim.arquivo}`);
1355
- console.log(` alegacao ${claim.alegacao}`);
1356
- console.log(` negativa ${claim.negativa ? 'sim (exige comando de verificacao)' : 'nao'}`);
1357
- console.log(` verificar ${claim.verificar.join(' && ') || '(nenhum comando declarado)'}`);
1358
- console.log(` estado ${claim.estado}`);
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)));
1359
1420
  if (claim.negativa && claim.verificar.length === 0) {
1360
1421
  console.log('');
1361
- console.log('AVISO: alegacao negativa sem comando de verificacao reprova em `ork verify`.');
1422
+ console.log(mc.avisoNegativa);
1362
1423
  }
1363
1424
  // RM-008 (B8): a conferencia local da policy claim_sem_prova_local avisa e segue.
1364
1425
  const linhasDePolicy = (0, policies_1.linhasDeAviso)(claim.avisosDePolicy ?? []);
@@ -1370,7 +1431,7 @@ function comandoClaims(args) {
1370
1431
  // I-53 (RM-037, P6): o lint avisa aqui; a suite inteira e recusada no `ci prepare`.
1371
1432
  for (const a of claim.lint ?? []) {
1372
1433
  console.log('');
1373
- console.log(`AVISO: ${(0, claim_lint_1.linhaDoLintDeClaim)(claim.id, a)}${a.regra === 'suite-inteira' ? '. O `ci prepare` recusa esta claim.' : ''}`);
1434
+ console.log(mc.avisoDoLint((0, claim_lint_1.linhaDoLintDeClaim)(claim.id, a), a.regra === 'suite-inteira'));
1374
1435
  }
1375
1436
  return 0;
1376
1437
  }
@@ -1383,18 +1444,19 @@ function comandoClaims(args) {
1383
1444
  const prazo = texto(args.opcoes.prazo);
1384
1445
  const semValor = ['claims', 'tarefa', 'prazo'].some((o) => args.opcoes[o] === true);
1385
1446
  if (!id || semValor || (claims === undefined) === (tarefa === undefined)) {
1386
- console.error('uso: ork claims conferir <thread-id> --claims C1,C2 | --tarefa T1 [--prazo S] [--json]');
1447
+ console.error(mc.usoConferir);
1387
1448
  return 2;
1388
1449
  }
1389
1450
  const conducao = conducaoDoCli(args);
1390
1451
  try {
1391
- const r = (0, claims_conferir_1.conferirClaims)(carregado, id, {
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, {
1392
1454
  claims: claims !== undefined ? (0, claims_conferir_1.idsDeClaims)(claims) : undefined,
1393
1455
  tarefa,
1394
1456
  prazoMs: prazo !== undefined ? Number(prazo) * 1000 : undefined,
1395
1457
  canal: conducao.canal,
1396
1458
  correlacao: conducao.correlacao,
1397
- });
1459
+ }));
1398
1460
  console.log(json ? JSON.stringify(r, null, 2) : (0, claims_conferir_1.textoDaConferencia)(r));
1399
1461
  return r.ok ? 0 : 1;
1400
1462
  }
@@ -1404,7 +1466,7 @@ function comandoClaims(args) {
1404
1466
  if (json)
1405
1467
  console.log(JSON.stringify({ formato: claims_conferir_1.FORMATO_DA_CONFERENCIA, thread: id, ok: false, erro: e.message }, null, 2));
1406
1468
  else
1407
- console.error(e.message);
1469
+ console.error((0, locale_1.mensagemDoErro)(e));
1408
1470
  return 2;
1409
1471
  }
1410
1472
  }
@@ -1413,15 +1475,15 @@ function comandoClaims(args) {
1413
1475
  const claimId = args.posicionais[3];
1414
1476
  const comando = texto(args.opcoes.comando) ?? texto(args.opcoes.verificar);
1415
1477
  if (!id || !claimId || !comando) {
1416
- console.error('uso: ork claims verificar <thread-id> <claim-id> --comando "<comando>"');
1478
+ console.error(mc.usoVerificar);
1417
1479
  return 2;
1418
1480
  }
1419
- const claim = (0, claims_1.anexarComando)(carregado.raiz, id, claimId, comando);
1420
- console.log(`Claim ${claim.id} agora tem comando de verificacao.`);
1421
- console.log(` verificar ${claim.verificar.join(' && ')}`);
1422
- console.log(` estado ${claim.estado}`);
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)));
1423
1485
  console.log('');
1424
- console.log(`Prove agora: ork verify ${id}`);
1486
+ console.log(mc.proveAgora(id));
1425
1487
  return 0;
1426
1488
  }
1427
1489
  if (sub === 'retirar') {
@@ -1429,14 +1491,14 @@ function comandoClaims(args) {
1429
1491
  const claimId = args.posicionais[3];
1430
1492
  const motivo = texto(args.opcoes.motivo);
1431
1493
  if (!id || !claimId || !motivo) {
1432
- console.error('uso: ork claims retirar <thread-id> <claim-id> --motivo "<motivo>"');
1494
+ console.error(mc.usoRetirar);
1433
1495
  return 2;
1434
1496
  }
1435
- const claim = (0, claims_1.retirarClaim)(carregado.raiz, id, claimId, motivo);
1436
- console.log(`Claim ${claim.id} retirada da thread ${id}.`);
1437
- console.log(` alegacao ${claim.alegacao}`);
1438
- console.log(` motivo ${motivo}`);
1439
- console.log(' o historico da alegacao continua no claims.jsonl e no ledger.');
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);
1440
1502
  return 0;
1441
1503
  }
1442
1504
  if (sub === 'ausente') {
@@ -1444,24 +1506,24 @@ function comandoClaims(args) {
1444
1506
  const paths = (texto(args.opcoes.paths) ?? '').split(',').map((p) => p.trim()).filter(Boolean);
1445
1507
  const motivo = texto(args.opcoes.motivo);
1446
1508
  if (!id || paths.length === 0 || !motivo) {
1447
- console.error('uso: ork claims ausente <thread-id> --paths A,B --motivo "<motivo>" [--commit SHA]');
1509
+ console.error(mc.usoAusente);
1448
1510
  return 2;
1449
1511
  }
1450
- (0, prova_minima_1.registrarProvaAusente)(carregado.raiz, id, { paths, motivo, commit: texto(args.opcoes.commit) });
1451
- console.log(`Ausencia de prova registrada na thread ${id}: ${paths.join(', ')}.`);
1452
- console.log(` motivo ${motivo}`);
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));
1453
1515
  return 0;
1454
1516
  }
1455
1517
  if (sub === 'list' || sub === undefined) {
1456
1518
  const id = args.posicionais[2];
1457
1519
  if (!id) {
1458
- console.error('uso: ork claims list <thread-id>');
1520
+ console.error(mc.usoList);
1459
1521
  return 2;
1460
1522
  }
1461
1523
  console.log((0, claims_1.tabelaDeClaims)(carregado.raiz, id));
1462
1524
  return 0;
1463
1525
  }
1464
- console.error(`subcomando desconhecido: claims ${sub}`);
1526
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('claims', sub));
1465
1527
  return 2;
1466
1528
  }
1467
1529
  function comandoVerify(args) {
@@ -1472,6 +1534,13 @@ function comandoVerify(args) {
1472
1534
  console.error(m.uso);
1473
1535
  return 2;
1474
1536
  }
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
+ }
1475
1544
  // RM-058 N2 (D10): enquanto a fila de recursos pesados nao da a vez, o CLI diz uma vez por quem espera.
1476
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('; ')));
1477
1546
  const doCli = conducaoDoCli(args);
@@ -1480,12 +1549,12 @@ function comandoVerify(args) {
1480
1549
  comandoDeEsperar: `ork verify ${id}${args.opcoes.baseline === true ? ' --baseline' : ''} --esperar 120` } };
1481
1550
  if (args.opcoes.baseline === true) {
1482
1551
  // RM-061 (F2b, G2): a baseline e o ledger sao gravados em pt-BR; so a impressao segue o locale.
1483
- const b = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.gravarBaseline)(carregado, id, undefined, conducao));
1552
+ const b = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.gravarBaseline)(carregado, id, undefined, conducao, 'cli', undefined, check));
1484
1553
  console.log(m.baselineGravada(id));
1485
1554
  console.log(m.baselineCommit(b.commit));
1486
- for (const c of b.comandos) {
1487
- console.log(m.baselineComando(c.nome, c.ok, c.code, c.comando));
1488
- }
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);
1489
1558
  if (b.comandos.some((c) => !c.ok)) {
1490
1559
  // Ensaio de 03/10 (R7): "ja falhava" sem dizer onde ver a saida do comando.
1491
1560
  console.log(m.baselineSaida((0, thread_1.caminhoThread)(carregado.raiz, id), id));
@@ -1496,7 +1565,7 @@ function comandoVerify(args) {
1496
1565
  }
1497
1566
  return 0;
1498
1567
  }
1499
- const r = (0, locale_1.comLocale)('pt-BR', () => (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 }));
1500
1569
  console.log((0, verify_1.textoDoVerify)(r));
1501
1570
  return r.ok ? 0 : 1;
1502
1571
  }
@@ -1510,6 +1579,7 @@ function comandoVerify(args) {
1510
1579
  * `status --json` para ceder o despacho enquanto a presenca vale. Nada aqui despacha.
1511
1580
  */
1512
1581
  function comandoSentinela(carregado, args) {
1582
+ const m = (0, locale_1.msg)().conducao.cli;
1513
1583
  const acao = args.posicionais[2] ?? 'status';
1514
1584
  const json = args.opcoes.json === true;
1515
1585
  if (acao === 'status') {
@@ -1518,34 +1588,101 @@ function comandoSentinela(carregado, args) {
1518
1588
  return 0;
1519
1589
  }
1520
1590
  if (acao !== 'bater' && acao !== 'desligar')
1521
- throw new Error('uso: ork conducao sentinela status|bater|desligar [--sessao <id>] [--json]');
1591
+ throw new Error(m.sentinelaUso);
1522
1592
  const sessao = texto(args.opcoes.sessao);
1523
1593
  if (!sessao)
1524
- throw new Error(`uso: ork conducao sentinela ${acao} --sessao <id> [--json]`);
1594
+ throw new Error(m.sentinelaSessao(acao));
1525
1595
  if (acao === 'bater') {
1526
1596
  const r = (0, conducao_sentinela_1.baterSentinela)(carregado.raiz, { sessao });
1527
1597
  const curta = r.presenca.sessao.slice(0, 8);
1528
1598
  console.log(json ? JSON.stringify(r, null, 2) : r.ok
1529
- ? `Sentinela ${r.ligou ? 'ligada' : 'renovada'} na maquina ${r.presenca.maquina} pela sessao ${curta}; vale 3 min sem batida.`
1530
- : `Outra sessao (${curta}) conduz pela Sentinela na maquina ${r.presenca.maquina}; esta fica so olhando.`);
1599
+ ? m.sentinelaLigada(r.ligou, r.presenca.maquina, curta)
1600
+ : m.sentinelaOutra(curta, r.presenca.maquina));
1531
1601
  return r.ok ? 0 : 3;
1532
1602
  }
1533
1603
  const motivo = texto(args.opcoes.motivo);
1534
1604
  const r = (0, conducao_sentinela_1.desligarSentinela)(carregado.raiz, { sessao, ...(motivo ? { motivo } : {}) });
1535
- console.log(json ? JSON.stringify(r, null, 2) : r.desligada
1536
- ? 'Sentinela desligada nesta maquina; o condutor externo volta a conduzir.'
1537
- : 'Nada a desligar: a presenca nesta maquina nao e desta sessao.');
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'));
1538
1639
  return 0;
1539
1640
  }
1540
1641
  function comandoConducao(args) {
1541
1642
  const carregado = (0, manifest_1.exigirManifesto)();
1643
+ const m = (0, locale_1.msg)().conducao.cli;
1542
1644
  const sub = args.posicionais[1];
1543
1645
  const id = args.posicionais[2];
1544
1646
  if (sub === 'sentinela')
1545
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
+ }
1546
1683
  if (sub === 'status') {
1547
1684
  if (!id)
1548
- throw new Error('uso: ork conducao status <thread-id> [--json]');
1685
+ throw new Error(m.statusUso);
1549
1686
  (0, thread_1.lerThread)(carregado.raiz, id);
1550
1687
  (0, conducao_1.liberarSeOrfa)(carregado.raiz, id);
1551
1688
  const atual = (0, conducao_1.conducaoDaThread)(carregado.raiz, id);
@@ -1555,12 +1692,12 @@ function comandoConducao(args) {
1555
1692
  if (sub === 'assumir') {
1556
1693
  const por = texto(args.opcoes.por), motivo = texto(args.opcoes.motivo);
1557
1694
  if (!id || !por || !motivo)
1558
- throw new Error('uso: ork conducao assumir <thread-id> --por <quem> --motivo "<por que>" [--canal C]');
1695
+ throw new Error(m.assumirUso);
1559
1696
  const r = (0, conducao_1.assumirConducao)(carregado.raiz, id, { por, motivo, canal: conducaoDoCli(args).canal });
1560
- console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : `${r.ok ? 'Conducao assumida.' : 'Handoff recusado.'} ${r.detalhe}`);
1697
+ console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : m.assumida(r.ok, r.detalhe));
1561
1698
  return r.ok ? 0 : 3;
1562
1699
  }
1563
- throw new Error('uso: ork conducao status|assumir <thread-id> | ork conducao sentinela status|bater|desligar');
1700
+ throw new Error(m.uso);
1564
1701
  }
1565
1702
  /** RM-048 (D1): o gate aberto no contrato curto, com o codigo estavel e o "desde" do ledger. */
1566
1703
  function textoDoGateCurto(raiz, pedido, canal) {
@@ -1573,11 +1710,12 @@ function textoDoGateCurto(raiz, pedido, canal) {
1573
1710
  function comandoGate(args) {
1574
1711
  const carregado = (0, manifest_1.exigirManifesto)();
1575
1712
  const sub = args.posicionais[1];
1713
+ const mg = (0, locale_1.msg)().operacao.restante.gate;
1576
1714
  if (sub === 'context') {
1577
1715
  const id = args.posicionais[2], pedido = args.posicionais[3];
1578
1716
  if (!id || !pedido || args.posicionais.length !== 4 ||
1579
1717
  Object.entries(args.opcoes).some(([k, v]) => k !== 'native-offer-stdin' || v !== true))
1580
- throw Error('uso: ork gate context <thread> <pedido> [--native-offer-stdin]');
1718
+ throw Error(mg.usoContext);
1581
1719
  const view = (0, hitl_gates_1.contextoDoPedidoNativo)(carregado.raiz, id, pedido);
1582
1720
  const callback = args.opcoes['native-offer-stdin'] ? (0, hitl_native_offer_1.readNativeOfferStdin)() : undefined;
1583
1721
  console.log(JSON.stringify({ ...view, canais: (0, hitl_presentation_1.ofertaDoPedido)(view.pedido, [], callback === undefined ? undefined : { callback, raiz: carregado.raiz }),
@@ -1587,10 +1725,10 @@ function comandoGate(args) {
1587
1725
  if (sub === 'request') {
1588
1726
  const id = args.posicionais[2];
1589
1727
  if (!id)
1590
- throw new Error('gate request exige thread');
1728
+ throw new Error(mg.requestThread);
1591
1729
  const formato = texto(args.opcoes.formato);
1592
1730
  if (formato !== undefined && formato !== 'telegram' && formato !== 'terminal')
1593
- throw new Error('gate request: --formato telegram|terminal');
1731
+ throw new Error(mg.formato);
1594
1732
  const pedido = (0, hitl_gates_1.abrirPedidoGate)(carregado.raiz, id, texto(args.opcoes.motivo));
1595
1733
  // RM-048 (D1): com --formato, o que sai e o pedido no contrato curto, pronto para o canal, com
1596
1734
  // o codigo estavel na ultima linha. Sem ele, o JSON de sempre, para quem integra.
@@ -1600,7 +1738,7 @@ function comandoGate(args) {
1600
1738
  if (sub === 'answer') {
1601
1739
  const id = args.posicionais[2], pedido = args.posicionais[3];
1602
1740
  if (!id || !pedido || args.opcoes['resposta-stdin'] !== true || args.opcoes.resposta !== undefined)
1603
- throw new Error('gate answer exige thread, pedido e --resposta-stdin');
1741
+ throw new Error(mg.answer);
1604
1742
  const r = (0, hitl_gates_1.lerRespostaStdin)({ por: texto(args.opcoes.por), mensagem: texto(args.opcoes.mensagem),
1605
1743
  origem: texto(args.opcoes.origem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
1606
1744
  console.log(JSON.stringify((0, hitl_gates_1.responderGate)(carregado.raiz, id, pedido, r)));
@@ -1609,7 +1747,7 @@ function comandoGate(args) {
1609
1747
  if (sub === 'next') {
1610
1748
  const id = args.posicionais[2];
1611
1749
  if (!id) {
1612
- console.error('uso: ork gate next <thread-id> [--proximo FASE] [--ocupacao 0..1]');
1750
+ console.error(mg.usoNext);
1613
1751
  return 2;
1614
1752
  }
1615
1753
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
@@ -1633,18 +1771,18 @@ function comandoGate(args) {
1633
1771
  const sobre = args.posicionais[3];
1634
1772
  const por = texto(args.opcoes.por) ?? texto(args.opcoes.quem);
1635
1773
  if (!id || !sobre || !por) {
1636
- console.error('gate approve aposentado: aprovação sem pedido é recusada. Use ork gate request <thread-id> e responda pelo ingresso humano autenticado.');
1774
+ console.error(mg.approveAposentado);
1637
1775
  return 2;
1638
1776
  }
1639
1777
  (0, thread_1.lerThread)(carregado.raiz, id);
1640
1778
  const e = (0, gates_1.aprovarGateHumano)(carregado.raiz, id, sobre, por, texto(args.opcoes.obs));
1641
- console.log(`Autorizacao humana registrada no ledger da thread ${id}.`);
1642
- console.log(` sobre ${sobre}`);
1643
- console.log(` autorizado por ${por}`);
1644
- console.log(` quando ${(0, horario_1.formatarDataHoraRotulada)(e.ts)}`);
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)));
1645
1783
  return 0;
1646
1784
  }
1647
- console.error(`subcomando desconhecido: gate ${sub}`);
1785
+ console.error(mg.desconhecido(sub));
1648
1786
  return 2;
1649
1787
  }
1650
1788
  /**
@@ -1656,44 +1794,44 @@ function comandoGate(args) {
1656
1794
  */
1657
1795
  function comandoRetry(args) {
1658
1796
  const sub = args.posicionais[1];
1797
+ const mr = (0, locale_1.msg)().retry, mc = mr.complementar;
1659
1798
  if (sub === 'policy') {
1660
1799
  const alvo = texto(args.opcoes.motivo);
1661
1800
  if (alvo) {
1662
1801
  const politica = retry_1.POLITICA_DE_RETRY[alvo];
1663
1802
  if (!politica) {
1664
- console.error(`motivo tipado desconhecido: ${alvo}`);
1665
- console.error(` conhecidos: ${Object.keys(retry_1.POLITICA_DE_RETRY).join(', ')}`);
1803
+ console.error(mc.motivoDesconhecido(alvo));
1804
+ console.error(mc.conhecidos(Object.keys(retry_1.POLITICA_DE_RETRY).join(', ')));
1666
1805
  return 2;
1667
1806
  }
1668
1807
  if (args.opcoes.json === true) {
1669
1808
  console.log(JSON.stringify(politica, null, 2));
1670
1809
  return 0;
1671
1810
  }
1672
- console.log(`motivo tipado: ${politica.motivo}`);
1673
- console.log(` significado ${auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[politica.motivo]}`);
1674
- console.log(` acao ${politica.acao}`);
1675
- console.log(` automatica ${politica.automatica ? 'sim' : 'nao'}`);
1676
- console.log(` por que ${politica.porque}`);
1677
- console.log(` correcao ${politica.correcao}`);
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));
1678
1817
  return 0;
1679
1818
  }
1680
1819
  if (args.opcoes.json === true) {
1681
1820
  console.log(JSON.stringify(Object.values(retry_1.POLITICA_DE_RETRY), null, 2));
1682
1821
  return 0;
1683
1822
  }
1684
- console.log('Politica de retry por motivo tipado de gate (bloco B3)');
1823
+ console.log(mc.politicaTitulo);
1685
1824
  console.log('');
1686
1825
  console.log((0, retry_1.tabelaDaPolitica)());
1687
1826
  console.log('');
1688
- console.log('A politica e a MESMA em todos os modos: o modo afrouxa a pausa, nunca a');
1689
- console.log('verificacao. cost.violation nunca recebe retry automatico, e o limite de');
1690
- console.log('escalacao (retry.max_tentativas) pausa qualquer modo, inclusive #Auto.');
1827
+ for (const linha of mc.politicaFecho)
1828
+ console.log(linha);
1691
1829
  return 0;
1692
1830
  }
1693
1831
  if (sub === 'parse') {
1694
1832
  const bruto = texto(args.opcoes.stderr) ?? args.posicionais.slice(2).join(' ');
1695
1833
  if (!bruto) {
1696
- console.error('uso: ork retry parse --stderr "<texto do stderr do adapter>"');
1834
+ console.error(mc.usoParse);
1697
1835
  return 2;
1698
1836
  }
1699
1837
  const sinal = (0, ratelimit_1.parseRateLimit)(bruto);
@@ -1702,17 +1840,17 @@ function comandoRetry(args) {
1702
1840
  return sinal ? 0 : 1;
1703
1841
  }
1704
1842
  if (!sinal) {
1705
- console.log('Nenhum sinal de rate limit reconhecido neste texto.');
1843
+ console.log(mc.semSinal);
1706
1844
  return 1;
1707
1845
  }
1708
- console.log('Sinal de rate limit reconhecido no stderr do runtime:');
1709
- console.log(` fonte da hora ${sinal.fonte}`);
1710
- console.log(` reset em ${sinal.resetEm ? (0, horario_1.formatarDataHoraRotulada)(sinal.resetEm) : '(o runtime nao disse a hora)'}`);
1711
- console.log(` trecho ${sinal.trecho}`);
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));
1712
1850
  if (sinal.resetEm === null) {
1713
1851
  console.log('');
1714
- console.log(' Sem hora no texto, a fila usa retry.janela_padrao_min do manifesto e marca');
1715
- console.log(' o pedido como janela ESTIMADA. O `ork` nao inventa horario de reset.');
1852
+ for (const linha of mc.estimada)
1853
+ console.log(linha);
1716
1854
  }
1717
1855
  return 0;
1718
1856
  }
@@ -1769,8 +1907,8 @@ function comandoRetry(args) {
1769
1907
  const espera = (0, ratelimit_1.lerFilaDeRetomada)(carregado.raiz).filter((p) => p.estado === 'aguardando');
1770
1908
  if (espera.length > 0) {
1771
1909
  console.log('');
1772
- console.log(`Proxima janela: ${(0, horario_1.formatarDataHora)(espera[0].liberaEm)} (${(0, ratelimit_1.faltaPara)(espera[0])}).`);
1773
- console.log('Retome com: ork retry resume');
1910
+ console.log(mc.proxima((0, horario_1.formatarDataHora)(espera[0].liberaEm), (0, ratelimit_1.faltaPara)(espera[0])));
1911
+ console.log(mc.retome);
1774
1912
  }
1775
1913
  return 0;
1776
1914
  }
@@ -1800,17 +1938,17 @@ function comandoRetry(args) {
1800
1938
  const idPedido = args.posicionais[2];
1801
1939
  const motivo = texto(args.opcoes.motivo);
1802
1940
  if (!idPedido || !motivo) {
1803
- console.error('uso: ork retry cancel <id> --motivo "<motivo>"');
1941
+ console.error(mc.usoCancel);
1804
1942
  return 2;
1805
1943
  }
1806
1944
  const p = (0, retry_1.cancelarPedido)(carregado, idPedido, motivo);
1807
- console.log(`Pedido ${p.id} cancelado na fila de rate limit.`);
1808
- console.log(` thread ${p.thread}`);
1809
- console.log(` fase ${p.fase}`);
1810
- console.log(` motivo ${motivo}`);
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));
1811
1949
  return 0;
1812
1950
  }
1813
- console.error(`subcomando desconhecido: retry ${sub ?? ''}`);
1951
+ console.error(mc.desconhecido(sub ?? ''));
1814
1952
  return 2;
1815
1953
  }
1816
1954
  /**
@@ -1824,15 +1962,16 @@ function comandoFix(args) {
1824
1962
  const carregado = (0, manifest_1.exigirManifesto)();
1825
1963
  const sub = args.posicionais[1];
1826
1964
  const id = args.posicionais[2];
1965
+ const mf = (0, locale_1.msg)().operacao.restante.fix;
1827
1966
  if (sub === 'open') {
1828
1967
  if (!id) {
1829
- console.error('uso: ork fix open <thread-id> [--so-claims] [--reverify]');
1968
+ console.error(mf.usoOpen);
1830
1969
  return 2;
1831
1970
  }
1832
1971
  const conducao = { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix open ${id} --esperar 30`) };
1833
- const rodada = (0, fix_1.abrirRodada)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao });
1972
+ const rodada = (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.abrirRodada)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao }));
1834
1973
  const reverify = args.opcoes.reverify === true && rodada.correcoes.length > 0
1835
- ? (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 }))
1836
1975
  : null;
1837
1976
  if (args.opcoes.json === true) {
1838
1977
  console.log(JSON.stringify({ rodada, reverify }, null, 2));
@@ -1850,14 +1989,14 @@ function comandoFix(args) {
1850
1989
  }
1851
1990
  if (sub === 'list') {
1852
1991
  if (!id) {
1853
- console.error('uso: ork fix list <thread-id> [--rodada N]');
1992
+ console.error(mf.usoList);
1854
1993
  return 2;
1855
1994
  }
1856
1995
  (0, thread_1.lerThread)(carregado.raiz, id);
1857
1996
  const rodadaBruta = texto(args.opcoes.rodada);
1858
1997
  const rodada = rodadaBruta ? Number(rodadaBruta) : (0, fix_1.ultimaRodada)(carregado.raiz, id);
1859
1998
  if (rodada === 0) {
1860
- console.log(`A thread ${id} nao tem rodada de GO-FIX. Abra com: ork fix open ${id}`);
1999
+ console.log(mf.semRodada(id));
1861
2000
  return 0;
1862
2001
  }
1863
2002
  const correcoes = (0, fix_1.correcoesDaRodada)(carregado.raiz, id, rodada);
@@ -1865,29 +2004,29 @@ function comandoFix(args) {
1865
2004
  console.log(JSON.stringify(correcoes, null, 2));
1866
2005
  return 0;
1867
2006
  }
1868
- console.log(`Correcoes da rodada ${rodada} da thread ${id}`);
2007
+ console.log(mf.lista(rodada, id));
1869
2008
  console.log('');
1870
- console.log((0, util_1.tabela)(['ID', 'TIPO', 'MOTIVO', 'ALVO', 'ESTADO', 'JULGADO POR'], correcoes.map((c) => [
2009
+ console.log((0, util_1.tabela)([...mf.colunasLista], correcoes.map((c) => [
1871
2010
  c.id,
1872
2011
  c.tipo,
1873
2012
  c.origem,
1874
2013
  c.alvo,
1875
2014
  c.estado,
1876
- c.verificar.join(' && ') || '(verify completo)',
2015
+ c.verificar.join(' && ') || mf.verifyCompleto,
1877
2016
  ])));
1878
2017
  return 0;
1879
2018
  }
1880
2019
  if (sub === 'reverify') {
1881
2020
  if (!id) {
1882
- console.error('uso: ork fix reverify <thread-id> [--rodada N] [--parcial]');
2021
+ console.error(mf.usoReverify);
1883
2022
  return 2;
1884
2023
  }
1885
2024
  const rodadaBruta = texto(args.opcoes.rodada);
1886
- const r = (0, fix_1.reverificar)(carregado, id, {
2025
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.reverificar)(carregado, id, {
1887
2026
  conducao: { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix reverify ${id} --esperar 30`) },
1888
2027
  rodada: rodadaBruta ? Number(rodadaBruta) : undefined,
1889
2028
  parcial: args.opcoes.parcial === true,
1890
- });
2029
+ }));
1891
2030
  if (args.opcoes.json === true) {
1892
2031
  console.log(JSON.stringify(r, null, 2));
1893
2032
  }
@@ -1896,45 +2035,46 @@ function comandoFix(args) {
1896
2035
  }
1897
2036
  return r.veredito === 'PASSOU' ? 0 : 1;
1898
2037
  }
1899
- console.error(`subcomando desconhecido: fix ${sub ?? ''}`);
2038
+ console.error(mf.desconhecido(sub ?? ''));
1900
2039
  return 2;
1901
2040
  }
1902
2041
  function comandoHandoff(args) {
1903
2042
  const carregado = (0, manifest_1.exigirManifesto)();
1904
2043
  const sub = args.posicionais[1];
1905
2044
  const id = args.posicionais[2];
2045
+ const mh = (0, locale_1.msg)().operacao.restante.handoff;
1906
2046
  if (sub === 'export') {
1907
2047
  if (!id) {
1908
- console.error('uso: ork handoff export <thread-id> [--proxima-fase FASE]');
2048
+ console.error(mh.usoExport);
1909
2049
  return 2;
1910
2050
  }
1911
2051
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
1912
2052
  const faseBruta = texto(args.opcoes['proxima-fase']) ?? texto(args.opcoes.fase);
1913
- const r = (0, handoff_1.exportarHandoff)(carregado, id, {
2053
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, handoff_1.exportarHandoff)(carregado, id, {
1914
2054
  proximaFase: faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined,
1915
2055
  slugDestino: texto(args.opcoes.slug),
1916
- });
2056
+ }));
1917
2057
  console.log((0, handoff_1.textoDoHandoff)(r.handoff, r.caminho));
1918
2058
  console.log('');
1919
- console.log(`Historico: ${r.caminhoHistorico}`);
2059
+ console.log(mh.historico(r.caminhoHistorico));
1920
2060
  return 0;
1921
2061
  }
1922
2062
  if (sub === 'recall') {
1923
2063
  const ponteiro = args.posicionais[3];
1924
2064
  if (!id || !ponteiro) {
1925
- console.error('uso: ork handoff recall <thread-id> <path#ancora>');
2065
+ console.error(mh.usoRecall);
1926
2066
  return 2;
1927
2067
  }
1928
- const r = (0, handoff_1.recall)(carregado, id, ponteiro);
1929
- console.log(`Ponteiro resolvido: ${r.location}`);
1930
- console.log(` metodo ${r.metodo}`);
1931
- console.log(` sha256 ${r.sha256}`);
1932
- console.log(` linhas ${r.intervalo ? `${r.intervalo.inicio}-${r.intervalo.fim}` : '(nao aplicavel)'}`);
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));
1933
2073
  console.log('');
1934
2074
  console.log(r.conteudo);
1935
2075
  return 0;
1936
2076
  }
1937
- console.error(`subcomando desconhecido: handoff ${sub}`);
2077
+ console.error(mh.desconhecido(sub));
1938
2078
  return 2;
1939
2079
  }
1940
2080
  /**
@@ -2024,7 +2164,7 @@ function comandoShip(args) {
2024
2164
  const dryRun = args.opcoes['dry-run'] === true;
2025
2165
  // RM-061 (F2b, G2): o ship_done e o motivo nascem em pt-BR; so a impressao segue o locale.
2026
2166
  const r = (0, locale_1.comLocale)('pt-BR', () => alvo && repo
2027
- ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun })]
2167
+ ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun, remoto })]
2028
2168
  : alvo ? [(0, entrega_pr_1.registrarEntregaPorPr)(carregado, alvo, { remoto, dryRun })] : (0, entrega_pr_1.registrarEntregasPorPr)(carregado, { remoto, dryRun }));
2029
2169
  if (args.opcoes.json === true) {
2030
2170
  console.log(JSON.stringify(r, null, 2));
@@ -2074,6 +2214,12 @@ function comandoShip(args) {
2074
2214
  if (args.opcoes.remoto !== undefined)
2075
2215
  (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
2076
2216
  const autorizar = args.opcoes['autorizar-push'];
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
+ }
2077
2223
  // RM-061 (F2b, G2): o que o ship grava (ledger, verificacao, mensagem do merge) nasce em pt-BR.
2078
2224
  const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_1.ship)(carregado, id, {
2079
2225
  para,
@@ -2082,6 +2228,7 @@ function comandoShip(args) {
2082
2228
  mensagem: texto(args.opcoes.mensagem),
2083
2229
  dryRun: args.opcoes['dry-run'] === true,
2084
2230
  autorizarPush: typeof autorizar === 'string' ? autorizar : undefined,
2231
+ allowUnscanned: typeof semScan === 'string' ? semScan.trim() : undefined,
2085
2232
  semPush: args.opcoes['sem-push'] === true,
2086
2233
  // RM-058 N2 (A1 da rodada 2 do CHECK): o `--esperar` chega à fila pesada da verificação do ship, com aviso.
2087
2234
  ...((f) => ({ esperarFilaPesadaMs: f.esperarMs, avisoDaFilaPesada: { aoEsperar: f.aoEsperar, comandoDeEsperar: f.comandoDeEsperar } }))(filaPesadaDoCli(args, 'verify', `ork ship ${id} --para ${para} --esperar 30`)),
@@ -2097,21 +2244,17 @@ function comandoShip(args) {
2097
2244
  */
2098
2245
  const SOBRAS_DO_OBJECTIVE = ['constraints', 'outcomes', 'threads', 'execution-runtime', 'validation-runtimes'];
2099
2246
  function recusarSobraDoObjective(opcao) {
2100
- console.error(`portfolio.opcao-aposentada: --${opcao} era do Objective Envelope, aposentado na I-43, e o\n` +
2101
- ' portfolio show nunca a leu. As duas vigas do envelope viraram propriedade de thread comum:\n' +
2102
- ' ork thread new "<nome>" --modo <MODO> --exige-runtime-diferente\n' +
2103
- ' o CHECK precisa de runtime que o GO nao usou\n' +
2104
- ' ork thread new "<nome>" --modo <MODO> --done "<criterio> :: <comando>"\n' +
2105
- ' criterio de pronto EXECUTAVEL, que vira claim e roda no ork verify');
2247
+ console.error((0, locale_1.msg)().operacao.produto.portfolio.opcaoAposentada(opcao));
2106
2248
  return 2;
2107
2249
  }
2108
2250
  function comandoPortfolio(args) {
2109
2251
  const root = (0, manifest_1.exigirManifesto)().raiz;
2110
2252
  const sub = args.posicionais[1] ?? 'list';
2253
+ const m = (0, locale_1.msg)().operacao.produto.portfolio;
2111
2254
  if (sub === 'inspect') {
2112
2255
  const id = args.posicionais[2];
2113
2256
  if (!id) {
2114
- console.error('uso: ork portfolio inspect <id> --json');
2257
+ console.error(m.usoInspect);
2115
2258
  return 2;
2116
2259
  }
2117
2260
  console.log(JSON.stringify((0, portfolio_context_1.inspectPortfolio)(root, id), null, 2));
@@ -2123,12 +2266,12 @@ function comandoPortfolio(args) {
2123
2266
  const rawKind = args.posicionais[2];
2124
2267
  const kind = rawKind ? aliases[rawKind] : undefined;
2125
2268
  if (rawKind && !kind) {
2126
- console.error('tipo deve ser product, project ou initiative');
2269
+ console.error(m.tipo);
2127
2270
  return 2;
2128
2271
  }
2129
2272
  const items = (0, portfolio_1.listEntities)(root, kind, texto(args.opcoes.parent));
2130
2273
  console.log(args.opcoes.json === true ? JSON.stringify({ schema: 'ork.portfolio-list/v1', updatedAt: (0, portfolio_1.readPortfolio)(root).updatedAt, items }, null, 2)
2131
- : items.length ? items.map((item) => `${item.id}\t${item.kind}\t${item.status}\t${item.title}`).join('\n') : 'Portfólio vazio.');
2274
+ : items.length ? items.map((item) => `${item.id}\t${item.kind}\t${item.status}\t${item.title}`).join('\n') : m.vazio);
2132
2275
  return 0;
2133
2276
  }
2134
2277
  if (sub === 'show') {
@@ -2137,22 +2280,22 @@ function comandoPortfolio(args) {
2137
2280
  return recusarSobraDoObjective(sobra);
2138
2281
  const id = args.posicionais[2];
2139
2282
  if (!id) {
2140
- console.error('uso: ork portfolio show <id>');
2283
+ console.error(m.usoShow);
2141
2284
  return 2;
2142
2285
  }
2143
2286
  const item = (0, portfolio_1.findEntity)(root, id);
2144
2287
  if (!item) {
2145
- console.error(`entidade ${id} não encontrada`);
2288
+ console.error(m.naoEncontrada(id));
2146
2289
  return 1;
2147
2290
  }
2148
- console.log(args.opcoes.json === true ? JSON.stringify(item, null, 2) : `${item.id}\n${item.title}\nEstado: ${item.status}`);
2291
+ console.log(args.opcoes.json === true ? JSON.stringify(item, null, 2) : m.estado(item.id, item.title, item.status));
2149
2292
  return 0;
2150
2293
  }
2151
2294
  if (sub === 'create') {
2152
2295
  const kind = aliases[args.posicionais[2] ?? ''];
2153
2296
  const id = args.posicionais[3], title = texto(args.opcoes.title), parent = texto(args.opcoes.parent);
2154
2297
  if (!kind || !id || !title) {
2155
- console.error('uso: ork portfolio create <product|project|initiative> <id> --title T [--parent ID]');
2298
+ console.error(m.usoCreate);
2156
2299
  return 2;
2157
2300
  }
2158
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), ';') };
@@ -2162,7 +2305,7 @@ function comandoPortfolio(args) {
2162
2305
  console.log(JSON.stringify({ schema: 'ork.portfolio-created/v1', item }, null, 2));
2163
2306
  return 0;
2164
2307
  }
2165
- console.error(`subcomando desconhecido: portfolio ${sub}`);
2308
+ console.error(m.desconhecido(sub));
2166
2309
  return 2;
2167
2310
  }
2168
2311
  function comandoCreation(args) {
@@ -2171,8 +2314,9 @@ function comandoCreation(args) {
2171
2314
  // Fachadas HTTP devem usar a API com principal e authorize autenticados no servidor.
2172
2315
  const actor = { principal: `local:uid:${(0, node_os_1.userInfo)().uid}`, authorize: () => { } };
2173
2316
  const sub = args.posicionais[1], id = args.posicionais[2];
2317
+ const m = (0, locale_1.msg)().operacao.produto.creation;
2174
2318
  if (args.opcoes.principal !== undefined || args.opcoes.por !== undefined)
2175
- throw new Error('creation.identity: payload não escolhe principal');
2319
+ throw new Error(m.identidade);
2176
2320
  let result;
2177
2321
  if (sub === 'session') {
2178
2322
  const portfolio = (0, portfolio_1.readPortfolio)(loaded.raiz);
@@ -2186,18 +2330,18 @@ function comandoCreation(args) {
2186
2330
  else if (sub === 'start') {
2187
2331
  const file = texto(args.opcoes['input-file']);
2188
2332
  if (!file) {
2189
- console.error('uso: ork creation start --input-file F --json');
2333
+ console.error(m.usoStart);
2190
2334
  return 2;
2191
2335
  }
2192
2336
  const content = fs.readFileSync(file, 'utf8');
2193
2337
  if (Buffer.byteLength(content) > 100_000)
2194
- throw new Error('creation.input: arquivo excede limite');
2338
+ throw new Error(m.arquivoGrande);
2195
2339
  result = (0, creation_operation_1.startCreation)(loaded, actor, JSON.parse(content));
2196
2340
  }
2197
2341
  else if (sub === 'list')
2198
2342
  result = (0, creation_operation_store_1.listCreationOperations)(loaded.raiz, actor.principal);
2199
2343
  else if (!id) {
2200
- console.error('creation exige id');
2344
+ console.error(m.exigeId);
2201
2345
  return 2;
2202
2346
  }
2203
2347
  else if (sub === 'show' || sub === 'events') {
@@ -2207,13 +2351,13 @@ function comandoCreation(args) {
2207
2351
  else if (sub === 'resume' || sub === 'compensate') {
2208
2352
  const version = Number(texto(args.opcoes['expected-version']));
2209
2353
  if (!Number.isSafeInteger(version) || version < 1) {
2210
- console.error('creation exige --expected-version inteiro positivo');
2354
+ console.error(m.versao);
2211
2355
  return 2;
2212
2356
  }
2213
2357
  result = sub === 'resume' ? (0, creation_operation_1.resumeCreation)(loaded, actor, id, version) : (0, creation_operation_1.compensateCreation)(loaded, actor, id, version);
2214
2358
  }
2215
2359
  else {
2216
- console.error('subcomando creation desconhecido');
2360
+ console.error(m.desconhecido);
2217
2361
  return 2;
2218
2362
  }
2219
2363
  console.log(JSON.stringify(result, null, 2));
@@ -2239,28 +2383,33 @@ function comandoCreation(args) {
2239
2383
  */
2240
2384
  function comandoObjective(args) {
2241
2385
  const sub = args.posicionais[1] ?? 'list';
2242
- console.error(`objective.aposentado: o Objective Envelope saiu do produto na I-43 (subcomando "${sub}").\n` +
2243
- ' Ele descrevia um gate que nao bloqueava nada: das 137 threads do projeto, zero\n' +
2244
- ' tinham creationOrigin, que era a unica via pela qual o despacho o consultava.\n' +
2245
- ' As duas vigas que ele guardava viraram propriedade de thread comum:\n' +
2246
- ' ork thread new "<nome>" --modo <MODO> --exige-runtime-diferente\n' +
2247
- ' o CHECK precisa de runtime que o GO nao usou\n' +
2248
- ' ork thread new "<nome>" --modo <MODO> --done "<criterio> :: <comando>"\n' +
2249
- ' criterio de pronto EXECUTAVEL, que vira claim e roda no ork verify\n' +
2250
- ' Os envelopes ja gravados continuam em .orkastery/objectives, intocados.');
2386
+ console.error((0, locale_1.msg)().operacao.produto.objective(sub));
2251
2387
  return 2;
2252
2388
  }
2253
2389
  function comandoCi(args) {
2254
2390
  const carregado = (0, manifest_1.exigirManifesto)();
2255
2391
  const sub = args.posicionais[1] ?? 'status';
2392
+ const m = (0, locale_1.msg)().operacao.produto.ci;
2256
2393
  if (sub === 'prepare') {
2257
2394
  const thread = args.posicionais[2];
2258
2395
  if (!thread) {
2259
- console.error('uso: ork ci prepare <thread-id>');
2396
+ console.error(m.usoPrepare);
2260
2397
  return 2;
2261
2398
  }
2262
- const arquivo = (0, ci_1.prepararBundleCi)(carregado, thread, { aoAvisar: (linha) => console.log(`AVISO: ${linha}`) });
2263
- console.log(`Bundle de CI: ${arquivo}`);
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));
2264
2413
  return 0;
2265
2414
  }
2266
2415
  if (sub === 'run') {
@@ -2279,34 +2428,86 @@ function comandoCi(args) {
2279
2428
  }
2280
2429
  const thread = args.posicionais[2];
2281
2430
  if (!thread) {
2282
- console.error('uso: ork ci run <thread-id> [--json] | ork ci run --bundle <arquivo> | ork ci run --branch <branch>');
2431
+ console.error(m.usoRun);
2283
2432
  return 2;
2284
2433
  }
2285
2434
  const result = (0, ci_1.executarCi)(carregado, thread);
2286
- console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : `${result.status.ok ? 'CI APROVADO' : 'CI REPROVADO'}: ${result.status.detail}`);
2435
+ console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : m.resultado(result.status.ok, result.status.detail));
2287
2436
  return result.status.ok ? 0 : 1;
2288
2437
  }
2289
2438
  if (sub === 'status') {
2290
2439
  const sha = texto(args.opcoes.sha) ?? args.posicionais[2] ?? (0, util_1.exec)('git', ['rev-parse', 'HEAD'], carregado.raiz).stdout.trim();
2291
2440
  if (!/^[0-9a-f]{40}$/.test(sha)) {
2292
2441
  // Ensaio de 03/10 (R4): `--sha HEAD` ou um sha curto respondiam so a linha de uso, sem dizer por que.
2293
- console.error('erro: ci status: --sha exige o sha completo, de 40 caracteres hexadecimais minusculos ' +
2294
- '(git rev-parse HEAD); o check e consultado no commit exato, nunca por ref nem prefixo');
2295
- console.error('uso: ork ci status --sha <sha de 40 caracteres> [--remoto origin]');
2442
+ console.error(m.sha);
2443
+ console.error(m.usoStatus);
2296
2444
  return 2;
2297
2445
  }
2298
2446
  // RM-047: recusa o `--remoto` que nao e nome de remoto mesmo com o gate de CI desligado.
2299
2447
  const remoto = (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto === undefined ? 'origin' : args.opcoes.remoto, 'ci');
2300
2448
  const result = (0, ci_1.consultarCi)(carregado, sha, remoto);
2301
- console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : `${result.ok ? 'CI VERDE' : 'CI NÃO LIBEROU'}: ${result.detail}`);
2449
+ console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : m.status(result.ok, result.detail));
2302
2450
  return result.ok ? 0 : 1;
2303
2451
  }
2304
- console.error(`subcomando desconhecido: ci ${sub}`);
2452
+ console.error(m.desconhecido(sub));
2305
2453
  return 2;
2306
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
+ }
2307
2507
  function comandoLease(args) {
2308
2508
  const carregado = (0, manifest_1.exigirManifesto)();
2309
2509
  const sub = args.posicionais[1];
2510
+ const ml = (0, locale_1.msg)().operacao.restante.lease;
2310
2511
  if (sub === undefined || sub === 'list') {
2311
2512
  console.log((0, leases_1.tabelaDeLeases)(carregado.raiz));
2312
2513
  return 0;
@@ -2314,38 +2515,38 @@ function comandoLease(args) {
2314
2515
  if (sub === 'acquire' || sub === 'take') {
2315
2516
  const nome = args.posicionais[2];
2316
2517
  const thread = texto(args.opcoes.thread);
2317
- const motivo = texto(args.opcoes.motivo) ?? 'sem motivo declarado';
2518
+ const motivo = texto(args.opcoes.motivo) ?? (0, locale_1.msg)('pt-BR').operacao.restante.lease.semMotivo;
2318
2519
  if (!nome || !thread) {
2319
- console.error('uso: ork lease acquire <nome> --thread <thread-id> [--motivo "<motivo>"]');
2520
+ console.error(ml.usoAcquire);
2320
2521
  return 2;
2321
2522
  }
2322
2523
  (0, thread_1.lerThread)(carregado.raiz, thread);
2323
- 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 }));
2324
2525
  if (r.ok) {
2325
- console.log(`Lease ${r.nome} [${r.tipo}] adquirido pela thread ${thread}.`);
2326
- console.log(` expira em ${(0, horario_1.formatarDataHoraRotulada)(r.lease?.expiraEm)}`);
2526
+ console.log(ml.adquirido(r.nome, r.tipo, thread));
2527
+ console.log(ml.expira((0, horario_1.formatarDataHoraRotulada)(r.lease?.expiraEm)));
2327
2528
  if (r.tomadoDeVencido)
2328
- console.log(' (o lease anterior estava VENCIDO e foi tomado)');
2529
+ console.log(ml.tomado);
2329
2530
  return 0;
2330
2531
  }
2331
- console.error(`Lease ${r.nome} NAO adquirido.`);
2332
- console.error(` motivo tipado: ${r.motivo}`);
2333
- console.error(` detalhe: ${(0, horario_1.localizarTextoRotulado)(r.detalhe)}`);
2334
- console.error(` posicao na fila: ${r.posicaoNaFila}`);
2335
- console.error(` correcao: ${r.correcao}`);
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));
2336
2537
  return 1;
2337
2538
  }
2338
2539
  if (sub === 'release') {
2339
2540
  const nome = args.posicionais[2];
2340
2541
  if (!nome) {
2341
- console.error('uso: ork lease release <nome> [--thread <thread-id>] [--forcar]');
2542
+ console.error(ml.usoRelease);
2342
2543
  return 2;
2343
2544
  }
2344
- 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));
2345
2546
  console.log(r.detalhe);
2346
2547
  return r.ok ? 0 : 1;
2347
2548
  }
2348
- console.error(`subcomando desconhecido: lease ${sub}`);
2549
+ console.error(ml.desconhecido(sub));
2349
2550
  return 2;
2350
2551
  }
2351
2552
  /**
@@ -2369,6 +2570,7 @@ function comandoBoard(args) {
2369
2570
  const carregado = (0, manifest_1.exigirManifesto)();
2370
2571
  const sub = args.posicionais[1];
2371
2572
  const todos = args.opcoes.all === true || args.opcoes.todos === true;
2573
+ const mb = (0, locale_1.msg)().operacao.restante.board;
2372
2574
  if (sub === 'plan' || sub === 'plano') {
2373
2575
  const plano = (0, board_1.planejar)(carregado);
2374
2576
  const consulta = consultaDoBoard(carregado, { plano: true, todos: false });
@@ -2379,7 +2581,7 @@ function comandoBoard(args) {
2379
2581
  return 0;
2380
2582
  }
2381
2583
  if (sub === 'reap') {
2382
- 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) }));
2383
2585
  if (args.opcoes.json === true)
2384
2586
  console.log(JSON.stringify(devolvidas, null, 2));
2385
2587
  else
@@ -2387,8 +2589,8 @@ function comandoBoard(args) {
2387
2589
  return 0;
2388
2590
  }
2389
2591
  if (sub !== undefined && sub !== 'list') {
2390
- console.error(`subcomando desconhecido: board ${sub}`);
2391
- console.error('uso: ork board [list|plan|reap] [--all] [--por <quem>] [--json]');
2592
+ console.error(mb.desconhecido(sub));
2593
+ console.error(mb.uso);
2392
2594
  return 2;
2393
2595
  }
2394
2596
  const consulta = consultaDoBoard(carregado, { plano: false, todos });
@@ -2404,7 +2606,7 @@ function comandoBoard(args) {
2404
2606
  console.log('');
2405
2607
  // RM-052: sem o remoto, nada foi lido; dizer "nenhuma publicou" seria a frase do incidente de 29/09.
2406
2608
  if (consulta.projeto.remoto === null) {
2407
- console.log(`Outras maquinas: o projeto ${carregado.manifesto.project.name} nao tem o remoto ${carregado.manifesto.fabrica.remoto}; nada foi lido de ork/fabrica-estado.`);
2609
+ console.log(mb.semRemoto(carregado.manifesto.project.name, carregado.manifesto.fabrica.remoto));
2408
2610
  }
2409
2611
  else {
2410
2612
  const painel = (0, fabrica_estado_1.lerFabrica)(carregado.raiz, { remoto: carregado.manifesto.fabrica.remoto,
@@ -2424,6 +2626,7 @@ const CONTRATO_DO_BOARD = 'ork.board/v1';
2424
2626
  function comandoFabrica(args) {
2425
2627
  const carregado = (0, manifest_1.exigirManifesto)();
2426
2628
  const sub = args.posicionais[1];
2629
+ const mf = (0, locale_1.msg)().operacao.restante.fabrica;
2427
2630
  // RM-063 (F1): a batida e do crontab desta maquina; nao le nem escreve o remoto.
2428
2631
  if (sub === 'batida')
2429
2632
  return comandoDaBatida(carregado, args);
@@ -2444,15 +2647,13 @@ function comandoFabrica(args) {
2444
2647
  console.log(JSON.stringify(r, null, 2));
2445
2648
  else
2446
2649
  console.log(r.acao === 'publicou'
2447
- ? `Fabrica: ${r.maquina} publicou ${r.threads} thread(s) em ork/fabrica-estado (${r.commit?.slice(0, 7)}, ${r.tentativas} tentativa(s)).`
2448
- : r.acao === 'ocupado'
2449
- ? `Fabrica: outra publicacao desta maquina esta em andamento; tente de novo em instantes.`
2450
- : `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));
2451
2652
  if (!(0, maquina_1.fabricaCompartilhada)(carregado.manifesto) && !silencioso) {
2452
- console.log(' esta maquina nao entrou na fabrica compartilhada: so publica quando voce pede (ork fabrica entrar liga).');
2653
+ console.log(mf.soQuandoPede);
2453
2654
  // RM-047 (P5): o manifesto que pede a fabrica nao liga a publicacao desta maquina.
2454
2655
  if (carregado.manifesto.fabrica.compartilhada)
2455
- console.log(' o orkastery.yaml pede a fabrica compartilhada; quem liga e a maquina, com ork fabrica entrar.');
2656
+ console.log(mf.manifestoPede);
2456
2657
  }
2457
2658
  return 0;
2458
2659
  }
@@ -2473,27 +2674,25 @@ function comandoFabrica(args) {
2473
2674
  const avisoDoRegistro = (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'fabrica entrar');
2474
2675
  if (avisoDoRegistro)
2475
2676
  console.error(avisoDoRegistro);
2476
- console.log(`Fabrica: esta maquina entrou como ${config.nome}; publica ao criar thread, despachar fase, entregar e fechar,`);
2477
- console.log(` e a cada batida do pulse. Primeiro retrato: ${r.threads} thread(s) em ork/fabrica-estado (${r.commit?.slice(0, 7)}).`);
2677
+ console.log(mf.entrou(config.nome));
2678
+ console.log(mf.primeiro(r.threads, r.commit?.slice(0, 7)));
2478
2679
  if (process.env.ORK_MAQUINA && process.env.ORK_MAQUINA.trim() !== config.nome) {
2479
- console.log(` AVISO: ORK_MAQUINA=${process.env.ORK_MAQUINA} neste shell vence o arquivo; alinhe os dois.`);
2680
+ console.log(mf.maquinaAmbiente(process.env.ORK_MAQUINA));
2480
2681
  }
2481
2682
  return 0;
2482
2683
  }
2483
2684
  if (sub === 'sair') {
2484
2685
  const config = (0, maquina_1.gravarConfigDaMaquina)({ fabricaCompartilhada: false });
2485
2686
  const r = (0, fabrica_estado_1.removerMaquina)(carregado, { remoto });
2486
- console.log(`Fabrica: ${(0, maquina_1.nomeDaMaquina)()} saiu; nada mais e publicado daqui.` +
2487
- (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));
2488
2688
  if ((0, maquina_1.fabricaCompartilhada)(carregado.manifesto))
2489
- console.log(' AVISO: ORK_FABRICA_COMPARTILHADA=1 neste shell ainda liga a fabrica aqui.');
2689
+ console.log(mf.ambienteLiga);
2490
2690
  void config;
2491
2691
  return 0;
2492
2692
  }
2493
2693
  if (sub !== undefined && sub !== 'list') {
2494
- console.error(`subcomando desconhecido: fabrica ${sub}`);
2495
- console.error('uso: ork fabrica [--json] [--sem-remoto] | fabrica publicar [--forcar] [--json] | fabrica entrar [--maquina NOME] | fabrica sair' +
2496
- ' | fabrica batida [status|instalar|remover] [--por Q] [--json]');
2694
+ console.error(mf.desconhecido(sub));
2695
+ console.error(mf.uso);
2497
2696
  return 2;
2498
2697
  }
2499
2698
  // RM-052: a fabrica le a branch de UM projeto, no remoto dele; o cabecalho diz qual e o que ficou de fora.
@@ -2512,7 +2711,7 @@ function comandoFabrica(args) {
2512
2711
  }
2513
2712
  console.log([...(0, projeto_alvo_1.linhasDaConsulta)(consulta), ''].join('\n'));
2514
2713
  console.log(url === null
2515
- ? `Fabrica: o projeto ${carregado.manifesto.project.name} nao tem o remoto ${remoto}; nada foi lido de ork/fabrica-estado.`
2714
+ ? mf.semRemoto(carregado.manifesto.project.name, remoto)
2516
2715
  : (0, fabrica_estado_1.textoDaFabrica)(painel, (0, maquina_1.nomeDaMaquina)()));
2517
2716
  // RM-047 (P5): o manifesto pede a fabrica, mas quem liga a publicacao e a maquina.
2518
2717
  const pedida = (0, maquina_1.avisoDaFabricaPedida)(carregado.manifesto);
@@ -2529,7 +2728,7 @@ function comandoDaBatida(carregado, args) {
2529
2728
  const acao = args.posicionais[2] ?? 'status';
2530
2729
  const json = args.opcoes.json === true;
2531
2730
  if (acao === 'status') {
2532
- const estado = (0, fabrica_batida_1.estadoDaBatida)(carregado.raiz);
2731
+ const estado = (0, fabrica_batida_1.estadoDaBatida)(carregado.raiz, { projeto: carregado.manifesto.project.name });
2533
2732
  console.log(json ? JSON.stringify(estado, null, 2) : (0, fabrica_batida_1.textoDoEstadoDaBatida)(estado));
2534
2733
  return estado.leitura.ok && estado.instalada ? 0 : 1;
2535
2734
  }
@@ -2539,7 +2738,7 @@ function comandoDaBatida(carregado, args) {
2539
2738
  console.log(json ? JSON.stringify(r, null, 2) : (0, fabrica_batida_1.textoDoResultadoDaBatida)(r));
2540
2739
  return 0;
2541
2740
  }
2542
- console.error('uso: ork fabrica batida [status|instalar|remover] [--por Q] [--json]');
2741
+ console.error((0, locale_1.msg)().operacao.restante.fabrica.batida.uso);
2543
2742
  return 2;
2544
2743
  }
2545
2744
  /**
@@ -2549,84 +2748,77 @@ function comandoDaBatida(carregado, args) {
2549
2748
  */
2550
2749
  function comandoNetwork(args) {
2551
2750
  const sub = args.posicionais[1];
2552
- // 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).
2553
2752
  if (sub === 'roadmap')
2554
2753
  return comandoNetworkRoadmap(args);
2555
2754
  const diretorio = process.cwd();
2556
- const uso = 'uso: ork network [status] [--json] [--sem-remoto] | network entrar [--maquina NOME] [--forja github|gitlab] ' +
2557
- '[--repositorio [DONO/]NOME] [--forcar] | network publicar [--forcar] [--json] | network sair | ' +
2558
- 'network roadmap [--projeto P] [--json] [--sem-remoto]';
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;
2559
2758
  const forja = texto(args.opcoes.forja), repositorio = texto(args.opcoes.repositorio);
2560
2759
  if ((args.opcoes.forja !== undefined && !(0, rede_forja_1.ehNomeDeForja)(forja)) || args.opcoes.repositorio === true ||
2561
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))) {
2562
- console.error(uso);
2761
+ console.error(mn.uso);
2563
2762
  return 2;
2564
2763
  }
2565
2764
  if (sub === 'entrar') {
2566
- const r = (0, rede_1.entrarNaRede)({ maquina: texto(args.opcoes.maquina), forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio, diretorio,
2567
- tomarNome: args.opcoes.forcar === true });
2568
- console.log(`Rede: ${r.publicacao.maquina} entrou na Orkastery Network de ${r.casa.dono} (${r.casa.forja}: ${(0, rede_1.refDaCasa)(r.casa)}, ` +
2569
- `privado${r.criado ? ', criado agora' : ''}).`);
2570
- 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))));
2571
2769
  if (r.publicacao.tomouNome)
2572
- console.log(` Tomou o nome "${r.publicacao.maquina}" de outra instalacao; o commit registra.`);
2573
- console.log(' e ao criar thread, despachar fase, entregar e fechar. De qualquer maquina desta pessoa: ork network status');
2574
- for (const d of r.publicacao.descartados) {
2575
- console.log(` AVISO: um projeto ficou fora do retrato: padrao "${d.padrao}" em ${d.campo} (valor omitido de proposito).`);
2576
- }
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));
2577
2774
  if (process.env.ORK_MAQUINA && process.env.ORK_MAQUINA.trim() !== r.publicacao.maquina) {
2578
- console.log(` AVISO: ORK_MAQUINA=${process.env.ORK_MAQUINA} neste shell vence o nome gravado; alinhe os dois.`);
2775
+ console.log(mn.avisoOrkMaquina(process.env.ORK_MAQUINA));
2579
2776
  }
2580
2777
  return 0;
2581
2778
  }
2582
2779
  if (sub === 'sair') {
2583
- const r = (0, rede_1.sairDaRede)({ forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio });
2584
- console.log(`Rede: ${r.maquina} saiu; nada mais e publicado daqui.` + (r.commit
2585
- ? ` Retrato removido de ${r.casa} (${r.commit.slice(0, 7)}).`
2586
- : r.alheio
2587
- ? ` O retrato "${r.maquina}" em ${r.casa} e de outra instalacao com o mesmo nome; nada foi removido.` +
2588
- (r.mesmoHostname ? ' Ele tem o hostname desta maquina: se ~/.orkastery foi apagada, retome o nome com ork network entrar --forcar.' : '')
2589
- : ` Nao havia retrato desta maquina${r.casa ? ` em ${r.casa}` : ' numa casa alcancavel'}.`));
2590
- if ((0, maquina_1.lerConfigDaMaquina)()?.fabricaCompartilhada) {
2591
- console.log(' A fabrica compartilhada dos projetos continua publicando daqui (ork/fabrica-estado); ork fabrica sair em cada um para parar.');
2592
- }
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);
2593
2786
  return 0;
2594
2787
  }
2595
2788
  if (sub === 'publicar') {
2596
2789
  if (args.opcoes.silencioso === true) {
2597
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.
2598
2792
  try {
2599
- (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' }));
2600
2794
  return 0;
2601
2795
  }
2602
2796
  catch (e) {
2603
- (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 }));
2604
2798
  return 1;
2605
2799
  }
2606
2800
  }
2607
- const r = (0, rede_1.publicarRede)({ diretorio, forcar: args.opcoes.forcar === true, forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio });
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 }));
2608
2803
  if (args.opcoes.json === true)
2609
2804
  console.log(JSON.stringify(r, null, 2));
2610
2805
  else
2611
- console.log(r.acao === 'publicou'
2612
- ? `Rede: ${r.maquina} publicou o retrato em ${r.casa} (${r.commit?.slice(0, 7)}, ${r.tentativas} tentativa(s)).`
2613
- : r.acao === 'ocupado'
2614
- ? 'Rede: outra publicacao desta maquina esta em andamento; tente de novo em instantes.'
2615
- : `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));
2616
2808
  if (args.opcoes.json !== true) {
2617
2809
  for (const d of r.descartados)
2618
- console.log(` AVISO: um projeto ficou fora do retrato: padrao "${d.padrao}" em ${d.campo} (valor omitido de proposito).`);
2810
+ console.log(mn.avisoDescartado(d.padrao, d.campo));
2619
2811
  }
2620
2812
  return 0;
2621
2813
  }
2622
2814
  if (sub !== undefined && sub !== 'status') {
2623
- console.error(`subcomando desconhecido: network ${sub}`);
2624
- console.error(uso);
2815
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('network', sub));
2816
+ console.error(mn.uso);
2625
2817
  return 2;
2626
2818
  }
2627
2819
  // RM-054 (fatia 3): o host sem cwd de projeto (RM-052, D3) nao faz do diretorio do gateway um projeto lido.
2628
2820
  const doHost = (process.env[projeto_alvo_1.ENV_PROJETO_EXPLICITO] ?? '').trim() === '1';
2629
- 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 }));
2630
2822
  console.log(args.opcoes.json === true ? (0, rede_status_1.jsonDaRede)(status) : (0, rede_status_1.textoDaRede)(status));
2631
2823
  return 0;
2632
2824
  }
@@ -2637,54 +2829,55 @@ function comandoNetwork(args) {
2637
2829
  */
2638
2830
  function comandoProjetos(args, projeto) {
2639
2831
  const sub = args.posicionais[1] ?? 'list';
2832
+ const m = (0, locale_1.msg)().projetos.cli;
2640
2833
  if (sub === 'list' || sub === 'listar') {
2641
2834
  const projetos = (0, projeto_alvo_1.listarProjetos)();
2642
2835
  if (args.opcoes.json === true) {
2643
2836
  console.log(JSON.stringify({ contrato: projeto_alvo_1.CONTRATO_PROJETOS, arquivo: (0, projeto_alvo_1.caminhoDoRegistro)(), projetos }, null, 2));
2644
2837
  return 0;
2645
2838
  }
2646
- console.log(`Projetos conhecidos desta maquina (${(0, projeto_alvo_1.raizParaExibir)((0, projeto_alvo_1.caminhoDoRegistro)())})`);
2839
+ console.log(m.titulo((0, projeto_alvo_1.raizParaExibir)((0, projeto_alvo_1.caminhoDoRegistro)())));
2647
2840
  console.log('');
2648
2841
  if (projetos.length === 0) {
2649
- console.log(' Nenhum ainda. ork init, ork thread new e ork fabrica entrar registram; ou: ork projetos registrar <caminho>');
2842
+ console.log(m.nenhum);
2650
2843
  return 0;
2651
2844
  }
2652
- console.log((0, util_1.tabela)(['NOME', 'ABBREV', 'RAIZ', 'REMOTO', 'NO DISCO', 'ATUALIZADO'], projetos.map((p) => [
2653
- p.nome, p.abbrev || '-', (0, projeto_alvo_1.raizParaExibir)(p.raiz), p.remoto ?? 'sem remoto', p.presente ? 'sim' : 'ausente',
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,
2654
2847
  (0, horario_1.formatarDataHora)(p.atualizadoEm)
2655
2848
  ])));
2656
2849
  console.log('');
2657
- console.log('Use --projeto <nome> em qualquer comando (ORK_PROJETO vale para o shell inteiro). ' + (0, horario_1.legendaDoFuso)());
2850
+ console.log(`${m.selecao} ${(0, horario_1.legendaDoFuso)()}`);
2658
2851
  return 0;
2659
2852
  }
2660
2853
  if (sub === 'registrar') {
2661
2854
  const caminho = args.posicionais[2];
2662
2855
  if (caminho !== undefined && projeto !== undefined)
2663
- throw new Error('uso: ork projetos registrar [caminho] (um caminho ou --projeto, não os dois)');
2856
+ throw new Error(m.usoRegistrar);
2664
2857
  const alvo = caminho === undefined ? (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto ?? null }) : null;
2665
2858
  const p = (0, projeto_alvo_1.registrarProjeto)(caminho ?? alvo?.raiz ?? process.cwd(), 'projetos registrar');
2666
2859
  if (args.opcoes.json === true) {
2667
2860
  console.log(JSON.stringify(p, null, 2));
2668
2861
  return 0;
2669
2862
  }
2670
- console.log(`Projeto ${p.nome} (${p.abbrev || '-'}) registrado: ${(0, projeto_alvo_1.raizParaExibir)(p.raiz)} · ${p.remoto ?? 'sem remoto'}`);
2863
+ console.log(m.registrado(p.nome, p.abbrev || '-', (0, projeto_alvo_1.raizParaExibir)(p.raiz), p.remoto ?? m.semRemoto));
2671
2864
  return 0;
2672
2865
  }
2673
2866
  if (sub === 'esquecer') {
2674
2867
  const alvo = args.posicionais[2] ?? projeto;
2675
2868
  if (!alvo)
2676
- throw new Error('uso: ork projetos esquecer <nome|caminho>');
2869
+ throw new Error(m.usoEsquecer);
2677
2870
  const sairam = (0, projeto_alvo_1.esquecerProjeto)(alvo);
2678
2871
  if (args.opcoes.json === true) {
2679
2872
  console.log(JSON.stringify(sairam, null, 2));
2680
2873
  return 0;
2681
2874
  }
2682
2875
  for (const p of sairam)
2683
- console.log(`Projeto ${p.nome} esquecido: ${(0, projeto_alvo_1.raizParaExibir)(p.raiz)} (nada no disco foi apagado)`);
2876
+ console.log(m.esquecido(p.nome, (0, projeto_alvo_1.raizParaExibir)(p.raiz)));
2684
2877
  return 0;
2685
2878
  }
2686
- console.error(`subcomando desconhecido: projetos ${sub}`);
2687
- console.error('uso: ork projetos [--json] | projetos registrar [caminho] | projetos esquecer <nome|caminho>');
2879
+ console.error(m.desconhecido(sub));
2880
+ console.error(m.uso);
2688
2881
  return 2;
2689
2882
  }
2690
2883
  /**
@@ -2698,15 +2891,16 @@ function comandoProjetos(args, projeto) {
2698
2891
  function comandoOrquestracao(args) {
2699
2892
  const carregado = (0, manifest_1.exigirManifesto)();
2700
2893
  const sub = args.posicionais[1];
2894
+ const m = (0, locale_1.msg)().operacao.restante.monitor;
2701
2895
  if (sub !== undefined && sub !== 'status') {
2702
- console.error(`subcomando desconhecido: orquestracao ${sub}`);
2703
- console.error('uso: ork orquestracao status [--all] [--json] [--atencao N] [--so-paradas]');
2896
+ console.error(m.desconhecido(sub));
2897
+ console.error(m.uso);
2704
2898
  return 2;
2705
2899
  }
2706
2900
  const bruto = texto(args.opcoes.atencao);
2707
2901
  const atencaoMin = bruto === undefined ? undefined : Number(bruto);
2708
2902
  if (atencaoMin !== undefined && (!Number.isFinite(atencaoMin) || atencaoMin < 0)) {
2709
- console.error(`--atencao espera minutos (inteiro >= 0), recebeu "${bruto}"`);
2903
+ console.error(m.atencao(bruto ?? ''));
2710
2904
  return 2;
2711
2905
  }
2712
2906
  const monitor = (0, orquestracao_1.montarMonitor)(carregado, {
@@ -2724,74 +2918,88 @@ function comandoOrquestracao(args) {
2724
2918
  }
2725
2919
  return 0;
2726
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
+ }
2727
2934
  function comandoWorktree(args) {
2728
2935
  const carregado = (0, manifest_1.exigirManifesto)();
2729
2936
  const sub = args.posicionais[1];
2730
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;
2731
2941
  if (!sub || !id) {
2732
- console.error('uso: ork worktree <ensure|sync|audit|release> <thread-id>');
2942
+ console.error(m.uso);
2733
2943
  return 2;
2734
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
+ };
2735
2951
  if (sub === 'ensure') {
2736
- const r = (0, worktree_1.garantirWorktree)(carregado, id);
2952
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.garantirWorktree)(carregado, id));
2737
2953
  if (!r.ok) {
2738
- console.error(`Worktree da thread ${id} NAO garantida.`);
2739
- console.error(` motivo tipado: ${r.motivo}`);
2740
- console.error(` detalhe: ${r.detalhe}`);
2741
- console.error(` correcao: ${r.correcao}`);
2954
+ bloqueio(m.naoGarantida(id), r);
2742
2955
  return 1;
2743
2956
  }
2744
- console.log(r.criada ? `Worktree criada para a thread ${id}.` : `Worktree ja existia para a thread ${id}.`);
2745
- console.log(` dir ${r.dir}`);
2746
- console.log(` branch ${r.branch}`);
2747
- console.log(` base ${r.base} (resolvida pelo ork, nao pelo executor)`);
2748
- 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);
2749
2963
  return 0;
2750
2964
  }
2751
2965
  if (sub === 'sync') {
2752
- 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 }));
2753
2967
  if (!r.ok) {
2754
- console.error(`Sync da worktree da thread ${id} BLOQUEADO.`);
2755
- console.error(` motivo tipado: ${r.motivo}`);
2756
- console.error(` detalhe: ${r.detalhe}`);
2757
- console.error(` correcao: ${r.correcao}`);
2968
+ bloqueio(m.syncBloqueado(id), r);
2758
2969
  return 1;
2759
2970
  }
2760
- console.log(r.dryRun ? `Sync (--dry-run) da thread ${id}: nada foi executado.` : `Sync da thread ${id}.`);
2761
- console.log(` base ${r.base} @ ${r.shaBase.slice(0, 8)}`);
2762
- console.log(` branch ${r.branch} @ ${r.shaAntes.slice(0, 8)} -> ${r.shaDepois.slice(0, 8)}`);
2763
- console.log(` rebase ${r.rebaseFeito ? 'feito' : r.jaAtualizada ? 'desnecessario' : 'seria feito'}`);
2764
- 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)}`);
2765
2976
  if (r.passos.length > 0) {
2766
2977
  console.log('');
2767
- console.log(' Comandos reais, na ordem:');
2978
+ console.log(m.comandosReais);
2768
2979
  for (const passo of r.passos)
2769
- console.log(` ${passo}`);
2980
+ console.log(` ${(0, locale_1.remontar)(passo)}`);
2770
2981
  }
2771
2982
  return 0;
2772
2983
  }
2773
2984
  if (sub === 'audit') {
2774
- const r = (0, worktree_1.auditarWorktree)(carregado, id);
2985
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.auditarWorktree)(carregado, id));
2775
2986
  console.log((0, worktree_1.textoDoAudit)(id, r));
2776
2987
  return r.ok ? 0 : 1;
2777
2988
  }
2778
2989
  if (sub === 'release') {
2779
- 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 }));
2780
2991
  if (!r.ok) {
2781
- console.error(`Release da worktree da thread ${id} BLOQUEADO.`);
2782
- console.error(` motivo tipado: ${r.motivo}`);
2783
- console.error(` detalhe: ${r.detalhe}`);
2784
- console.error(` correcao: ${r.correcao}`);
2992
+ bloqueio(m.releaseBloqueado(id), r);
2785
2993
  return 1;
2786
2994
  }
2787
- console.log(`Worktree da thread ${id} liberada.`);
2788
- console.log(` dir ${r.dir}`);
2789
- console.log(` removida ${r.removida ? 'sim' : 'nao (o diretorio ja nao existia)'}`);
2790
- console.log(` leases ${r.leasesLiberados.join(', ') || '(nenhum lease de escrita para soltar)'}`);
2791
- 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)}`);
2792
3000
  return 0;
2793
3001
  }
2794
- console.error(`subcomando desconhecido: worktree ${sub}`);
3002
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('worktree', sub));
2795
3003
  return 2;
2796
3004
  }
2797
3005
  function comandoMaster(args) {
@@ -2864,12 +3072,7 @@ function comandoMaster(args) {
2864
3072
  // mudou, e para onde ir. Desaparecer sem dizer nada seria o mesmo pecado da #TAG
2865
3073
  // aposentada virando default.
2866
3074
  if (args.opcoes.batch === true || primeiro === 'batch') {
2867
- console.error('master.fila-aposentada: a fila de ratificacao de score saiu na I-43. ' +
2868
- 'Entregue e aceito, a menos que voce diga o contrario.\n' +
2869
- ' ork master as entregas, com o indice ja derivado do ledger\n' +
2870
- ' ork master <id> --aceitar-omissao aceita so esta entrega, com indice e insumos no ledger\n' +
2871
- ' ork master --aceitar-omissao aceita todas as entregues (--dry-run mostra quais)\n' +
2872
- ' ork master <id> --score <0-5> --justificativa "<por que>" --por <humano> para reclamar');
3075
+ console.error((0, locale_1.msg)().master.complementar.batchAposentado);
2873
3076
  return 2;
2874
3077
  }
2875
3078
  if (args.opcoes['aceitar-omissao'] !== undefined) {
@@ -2884,19 +3087,20 @@ function comandoMaster(args) {
2884
3087
  }
2885
3088
  const propor = primeiro === 'propor';
2886
3089
  const id = propor ? args.posicionais[2] : primeiro;
3090
+ const mm = (0, locale_1.msg)().master.complementar;
2887
3091
  if (!id)
2888
- throw new Error('informe a thread para propor MASTER');
3092
+ throw new Error(mm.informeThread);
2889
3093
  const brutoScore = texto(args.opcoes.score);
2890
3094
  const justificativa = texto(args.opcoes.justificativa) ?? texto(args.opcoes.porque);
2891
3095
  if (brutoScore === undefined) {
2892
- console.error('uso: ork master <thread-id> --score 0-5 --justificativa "<texto>" --por <seu-nome>');
2893
- console.error(' o score do MASTER e humano, de 0 a 5, e a justificativa e obrigatoria.');
3096
+ console.error(mm.usoScore);
3097
+ console.error(mm.scoreHumano);
2894
3098
  return 2;
2895
3099
  }
2896
3100
  if (!justificativa) {
2897
- console.error(`Score RECUSADO para a thread ${id}: falta --justificativa "<texto>".`);
2898
- console.error(' Score sem justificativa nao vira aprendizado; o `ork` nao o registra.');
2899
- console.error(` ork master ${id} --score ${brutoScore} --justificativa "<por que este score>"`);
3101
+ console.error(mm.justificativa(id));
3102
+ console.error(mm.justificativaRazao);
3103
+ console.error(mm.justificativaComando(id, brutoScore));
2900
3104
  return 2;
2901
3105
  }
2902
3106
  const brutasClasses = texto(args.opcoes.classe) ?? texto(args.opcoes.classes);
@@ -2904,8 +3108,8 @@ function comandoMaster(args) {
2904
3108
  for (const bruta of (brutasClasses ?? '').split(',').map((c) => c.trim()).filter(Boolean)) {
2905
3109
  const classe = (0, master_2.parseClasse)(bruta);
2906
3110
  if (!classe) {
2907
- console.error(`classe de falha invalida: "${bruta}".`);
2908
- console.error(` classes fixas: ${master_2.ORDEM_DAS_CLASSES.join(', ')}`);
3111
+ console.error(mm.classeInvalida(bruta));
3112
+ console.error(mm.classesFixas(master_2.ORDEM_DAS_CLASSES.join(', ')));
2909
3113
  return 2;
2910
3114
  }
2911
3115
  classes.push(classe);
@@ -2933,12 +3137,12 @@ function comandoMaster(args) {
2933
3137
  // vai ao ledger do projeto uma vez por janela; virar policy continua sendo do dono.
2934
3138
  for (const p of (0, licoes_1.registrarPropostasNovas)(carregado.raiz)) {
2935
3139
  console.log('');
2936
- console.log(`Proposta de policy: ${p.chave} em ${p.threads.length} threads nos ultimos ${p.janelaDias} dias.`);
3140
+ console.log(mm.proposta(p.chave, p.threads.length, p.janelaDias));
2937
3141
  console.log(` ${p.sugestao}`);
2938
- console.log(' So proposta: vira policy quando voce a declara em policies: no orkastery.yaml (ork licoes).');
3142
+ console.log(mm.soProposta);
2939
3143
  }
2940
3144
  console.log('');
2941
- console.log(`Proximo passo: ork board --all | entregas e indice: ork master`);
3145
+ console.log(mm.proximo);
2942
3146
  return 0;
2943
3147
  }
2944
3148
  /**
@@ -3053,12 +3257,14 @@ function comandoRoadmap(args) {
3053
3257
  if (sub === 'reservas') {
3054
3258
  // RM-037 (rm037noite, defeito 3): a reserva de thread ja fechada aparece como orfa e sai com registro.
3055
3259
  if (args.opcoes['soltar-orfas'] === true) {
3056
- const soltas = (0, roadmap_reservas_1.soltarReservasOrfas)(carregado.raiz, { remoto });
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;
3057
3263
  if (args.opcoes.json === true)
3058
3264
  console.log(JSON.stringify(soltas, null, 2));
3059
3265
  else
3060
- console.log(soltas.length === 0 ? 'Nenhuma reserva órfã desta máquina.'
3061
- : soltas.map((s) => `${s.item}: ${s.detalhe} (thread fechada ${s.thread})`).join('\n'));
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'));
3062
3268
  return 0;
3063
3269
  }
3064
3270
  // RM-052 (fatia 2, D4): as reservas moram no remoto do projeto. Sem ele, nada e lido; com ele mudo e
@@ -3098,21 +3304,21 @@ function comandoRoadmap(args) {
3098
3304
  }
3099
3305
  // RM-037 (rm037noite, defeito 6): o numero da FEAT nova sai da mesma branch de reservas.
3100
3306
  if (sub === 'feat') {
3101
- const r = (0, roadmap_reservas_1.reservarFeat)(carregado.raiz, { remoto, por: texto(args.opcoes.por), maquina: texto(args.opcoes.maquina),
3102
- 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;
3103
3310
  if (args.opcoes.json === true)
3104
3311
  console.log(JSON.stringify(r, null, 2));
3105
3312
  else {
3106
- console.log(`${r.feat}: reservado para esta maquina${r.reserva.thread ? `, thread ${r.reserva.thread}` : ''}.`);
3107
- console.log(` crie docs/produto/${r.feat}-<assunto>.md; o numero nao volta, mesmo que a feature nao saia`);
3108
- console.log(` branch ork/roadmap-reservas em ${r.commit.slice(0, 7)}`);
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)));
3109
3316
  }
3110
3317
  return 0;
3111
3318
  }
3112
3319
  const item = args.posicionais[2];
3113
3320
  if ((sub !== 'pegar' && sub !== 'soltar') || !item) {
3114
- console.error('uso: ork roadmap status [--json] | reservas [--soltar-orfas] | pegar <RM-NNN> [--thread T] [--nota N] | ' +
3115
- 'soltar <RM-NNN> [--forcar --motivo M] | feat [--thread T] [--nota N]');
3321
+ console.error((0, locale_1.msg)().reservas.uso);
3116
3322
  return 2;
3117
3323
  }
3118
3324
  const opcoes = {
@@ -3124,18 +3330,17 @@ function comandoRoadmap(args) {
3124
3330
  forcar: args.opcoes.forcar === true,
3125
3331
  motivo: texto(args.opcoes.motivo),
3126
3332
  };
3127
- 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));
3128
3334
  if (args.opcoes.json === true) {
3129
3335
  console.log(JSON.stringify(r, null, 2));
3130
3336
  return 0;
3131
3337
  }
3132
- const verbo = { pegou: 'reservado para esta maquina', renovou: 'reserva renovada', tomou: 'reserva TOMADA de outra maquina',
3133
- soltou: 'devolvido', nada: 'ja estava livre' }[r.acao];
3134
- console.log(`${r.item}: ${verbo}.`);
3338
+ const mr = (0, locale_1.msg)().reservas;
3339
+ console.log(mr.itemAcao(r.item, mr.acao(r.acao)));
3135
3340
  if (r.reserva && r.acao !== 'soltou')
3136
- console.log(` com ${r.reserva.por} em ${r.reserva.maquina}${r.reserva.thread ? `, thread ${r.reserva.thread}` : ''}`);
3341
+ console.log(mr.com(r.reserva.por, r.reserva.maquina, r.reserva.thread ?? null));
3137
3342
  if (r.commit)
3138
- console.log(` branch ork/roadmap-reservas em ${r.commit.slice(0, 7)}`);
3343
+ console.log(mr.branch(r.commit.slice(0, 7)));
3139
3344
  return 0;
3140
3345
  }
3141
3346
  /**
@@ -3145,7 +3350,7 @@ function comandoRoadmap(args) {
3145
3350
  function comandoNetworkRoadmap(args) {
3146
3351
  const pedido = texto(args.opcoes.projeto);
3147
3352
  if (args.posicionais[1] !== 'roadmap' || args.posicionais.length > 2 || (args.opcoes.projeto !== undefined && !pedido)) {
3148
- console.error('uso: ork network roadmap [--projeto <caminho|github:dono/repo|gitlab:grupo/repo|nome>] [--json] [--sem-remoto]');
3353
+ console.error((0, locale_1.msg)().network.roadmap.uso);
3149
3354
  return 2;
3150
3355
  }
3151
3356
  try {
@@ -3163,14 +3368,41 @@ function comandoNetworkRoadmap(args) {
3163
3368
  return network_roadmap_1.SAIDA_DO_PEDIDO;
3164
3369
  }
3165
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
+ }
3166
3396
  function comandoDocs(args) {
3167
3397
  const sub = args.posicionais[1] ?? 'verificar';
3168
3398
  const carregado = (0, manifest_1.carregarManifesto)();
3169
3399
  const raiz = carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)();
3170
3400
  const baseBranch = carregado?.manifesto.worktree?.base_branch ?? 'main';
3401
+ const md = (0, locale_1.msg)().docs;
3171
3402
  if (sub === 'verificar') {
3172
3403
  // RM-037 (fatia 3, GO-FIX 2): o CI passa --pr no pull_request; no push da main as duas regras novas reprovam.
3173
- const { docs, achados } = (0, docs_1.verificarDocs)(raiz, { baseBranch, ajudaDoCli: AJUDA, pr: args.opcoes.pr === true });
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 }));
3174
3406
  if (args.opcoes.json === true) {
3175
3407
  console.log(JSON.stringify({ paginas: docs.length, erros: achados.filter((a) => a.gravidade === 'erro').length,
3176
3408
  achados }, null, 2));
@@ -3187,31 +3419,31 @@ function comandoDocs(args) {
3187
3419
  // Sugestao 4 do CHECK 1 (e 8 do CHECK 2, `--so=`): `--so` sem item e erro de uso, nunca o escopo
3188
3420
  // padrao em silencio.
3189
3421
  if (args.opcoes.so === true || (typeof args.opcoes.so === 'string' && !args.opcoes.so.trim())) {
3190
- console.error('uso: ork docs sincronizar --so RM-NNN[,RM-MMM] (faltou o item depois de --so)');
3422
+ console.error(md.usoSoSemItem);
3191
3423
  return 2;
3192
3424
  }
3193
3425
  const so = texto(args.opcoes.so);
3194
3426
  let itens;
3195
- let escopo = 'todo item do roadmap';
3427
+ let escopo = md.escopoTodos;
3196
3428
  if (so) {
3197
3429
  itens = so.split(',').map((i) => i.trim().toUpperCase()).filter(Boolean);
3198
3430
  const fora = itens.filter((i) => !/^RM-\d{3}$/.test(i));
3199
3431
  if (fora.length || itens.length === 0) {
3200
- console.error(`uso: ork docs sincronizar --so RM-NNN[,RM-MMM] (recebido: ${so})`);
3432
+ console.error(md.usoSoInvalido(so));
3201
3433
  return 2;
3202
3434
  }
3203
- escopo = `so ${itens.join(', ')} (--so)`;
3435
+ escopo = md.escopoSo(itens.join(', '));
3204
3436
  }
3205
3437
  else if (args.opcoes.todos !== true) {
3206
3438
  const padrao = (0, docs_1.escopoPadraoDoSync)(raiz);
3207
3439
  if (padrao.itens) {
3208
3440
  itens = padrao.itens;
3209
- escopo = `so ${itens.join(', ')}, o item da thread ${padrao.thread} desta worktree (--todos para todo item)`;
3441
+ escopo = md.escopoDaThread(itens.join(', '), String(padrao.thread));
3210
3442
  }
3211
3443
  }
3212
- 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 }));
3213
3445
  console.log(args.opcoes.json === true ? JSON.stringify({ ...r, escopo: itens ?? null }, null, 2)
3214
- : `Escopo: ${escopo}.\n${(0, docs_1.textoDaSincronizacao)(r, escrever)}`);
3446
+ : `${md.escopo(escopo)}\n${(0, docs_1.textoDaSincronizacao)(r, escrever)}`);
3215
3447
  return 0;
3216
3448
  }
3217
3449
  if (sub === 'init') {
@@ -3224,29 +3456,36 @@ function comandoDocs(args) {
3224
3456
  : [m.criado, ...criados.map((c) => ` ${c}`), '', m.proximoPasso].join('\n'));
3225
3457
  return 0;
3226
3458
  }
3227
- console.error(`uso: ork docs verificar [--json] [--pr] | sincronizar [--escrever] [--so RM-NNN] [--todos] | init`);
3459
+ console.error(md.uso);
3228
3460
  return 2;
3229
3461
  }
3230
3462
  function comandoPrompt(args) {
3231
3463
  const sub = args.posicionais[1] ?? 'list';
3232
3464
  const carregado = (0, manifest_1.carregarManifesto)();
3233
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')));
3234
3472
  if (sub === 'list') {
3235
- console.log((0, prompts_1.tabelaDeTemplates)((0, prompts_1.carregarTemplates)(raiz)));
3473
+ console.log((0, prompts_1.tabelaDeTemplates)(templatesDaLingua()));
3236
3474
  return 0;
3237
3475
  }
3238
3476
  if (sub === 'lint') {
3239
3477
  const id = texto(args.opcoes.template);
3240
- const templates = id ? [(0, prompts_1.exigirTemplate)(id, raiz)] : (0, prompts_1.carregarTemplates)(raiz);
3241
- const problemas = templates.flatMap((t) => (0, prompts_1.lintTemplate)(t));
3242
- console.log(`Lint dos templates de prompt${raiz ? ` (projeto ${raiz})` : ' (somente embutidos)'}`);
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));
3243
3482
  console.log('');
3244
3483
  console.log((0, prompts_1.textoDoLint)(problemas, templates.length));
3245
3484
  return problemas.some((p) => p.gravidade === 'erro') ? 2 : 0;
3246
3485
  }
3247
3486
  if (sub === 'render') {
3248
3487
  const fase = exigirFaseCanonica(texto(args.opcoes.fase) ?? args.posicionais[3]);
3249
- const pedido = texto(args.opcoes.pedido) ?? '<pedido do builder>';
3488
+ const pedido = texto(args.opcoes.pedido) ?? mp.pedidoExemplo;
3250
3489
  const idTemplate = texto(args.opcoes.template);
3251
3490
  // Modo exemplo: renderiza sem thread nenhuma, para revisar o texto de um modo antes de
3252
3491
  // abrir trabalho. Nada e gravado, e o `ork` diz em voz alta que a thread e ficticia.
@@ -3261,10 +3500,10 @@ function comandoPrompt(args) {
3261
3500
  return 2;
3262
3501
  }
3263
3502
  const exemplo = (0, prompts_1.threadDeExemplo)(modo, fase, carregado?.manifesto.project);
3264
- const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, raiz) : (0, prompts_1.templateDaFase)(fase, raiz);
3265
- const prompt = (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(exemplo, fase, pedido));
3266
- console.log(`# template ${template.id} v${template.versao} (origem: ${template.origem})`);
3267
- console.log(`# thread de EXEMPLO (nada foi gravado), modo ${modos_1.MODOS[modo].tag}, sha256 ${(0, phase_1.hashDoPrompt)(prompt)}`);
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)));
3268
3507
  console.log('');
3269
3508
  console.log(prompt);
3270
3509
  return 0;
@@ -3272,8 +3511,8 @@ function comandoPrompt(args) {
3272
3511
  const obrigatorio = (0, manifest_1.exigirManifesto)();
3273
3512
  const threadId = args.posicionais[2];
3274
3513
  if (!threadId) {
3275
- console.error('uso: ork prompt render <thread-id> <FASE> --pedido "<texto>"');
3276
- console.error(' ork prompt render --exemplo --fase GOAL --modo auto --pedido "<texto>"');
3514
+ console.error(mp.usoRenderThread);
3515
+ console.error(mp.usoRenderExemplo);
3277
3516
  return 2;
3278
3517
  }
3279
3518
  const thread = (0, thread_1.lerThread)(obrigatorio.raiz, threadId);
@@ -3281,26 +3520,26 @@ function comandoPrompt(args) {
3281
3520
  // guardado segue com o texto de exemplo, como antes.
3282
3521
  const guardado = texto(args.opcoes.pedido) === undefined ? (0, thread_1.pedidoDaThread)(obrigatorio.raiz, thread) : null;
3283
3522
  const pedidoDaFase = guardado?.texto ?? pedido;
3284
- const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, obrigatorio.raiz) : (0, prompts_1.templateDaFase)(fase, obrigatorio.raiz);
3523
+ const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, obrigatorio.raiz) : (0, prompts_1.templateDaFase)(fase, obrigatorio.raiz, linguaDoPrompt);
3285
3524
  const prompt = idTemplate
3286
- ? (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(thread, fase, pedidoDaFase))
3287
- : (0, phase_1.montarPrompt)(thread, fase, pedidoDaFase, obrigatorio.raiz);
3288
- console.log(`# template ${template.id} v${template.versao} (origem: ${template.origem})`);
3289
- console.log(`# thread ${thread.id}, fase ${fase}, sha256 ${(0, phase_1.hashDoPrompt)(prompt)}`);
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)));
3290
3529
  if (guardado)
3291
- console.log(`# pedido guardado na criacao da thread (sha256 ${(0, util_1.shaCurto)(guardado.sha256)})`);
3530
+ console.log(mp.pedidoGuardado((0, util_1.shaCurto)(guardado.sha256)));
3292
3531
  console.log('');
3293
3532
  console.log(prompt);
3294
3533
  return 0;
3295
3534
  }
3296
- console.error(`subcomando desconhecido: prompt ${sub}`);
3535
+ console.error(mp.subcomandoDesconhecido(sub));
3297
3536
  return 2;
3298
3537
  }
3299
3538
  /** Fase canonica a partir do texto do usuario, com erro tipado quando nao existe. */
3300
3539
  function exigirFaseCanonica(bruto) {
3301
3540
  const alvo = (bruto ?? '').toUpperCase();
3302
3541
  if (!types_1.FASES.includes(alvo)) {
3303
- throw new Error(`fase "${bruto ?? ''}" fora do ciclo canonico (${types_1.FASES.join(' ')})`);
3542
+ throw new Error((0, locale_1.msg)().prompts.cli.faseForaDoCiclo(bruto ?? '', types_1.FASES.join(' ')));
3304
3543
  }
3305
3544
  return alvo;
3306
3545
  }
@@ -3322,6 +3561,7 @@ function orkEmExecucao() {
3322
3561
  }
3323
3562
  function comandoAdapter(args) {
3324
3563
  const sub = args.posicionais[1] ?? 'list';
3564
+ const ma = (0, locale_1.msg)().adapter;
3325
3565
  if (sub === 'list') {
3326
3566
  console.log((0, hosts_1.tabelaDeHosts)());
3327
3567
  return 0;
@@ -3329,13 +3569,12 @@ function comandoAdapter(args) {
3329
3569
  if (sub === 'show') {
3330
3570
  const host = (0, hosts_1.parseHost)(args.posicionais[2]);
3331
3571
  if (!host) {
3332
- console.error(`host desconhecido: "${args.posicionais[2] ?? ''}". Use: ${hosts_1.ORDEM_DOS_HOSTS.join(' | ')}`);
3572
+ console.error(ma.hostDesconhecido(args.posicionais[2] ?? '', hosts_1.ORDEM_DOS_HOSTS.join(' | ')));
3333
3573
  return 2;
3334
3574
  }
3335
- const def = hosts_1.HOSTS[host];
3336
- console.log(`Adaptador ${host}`);
3337
- console.log(` ${def.descricao}`);
3338
- 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))}`);
3339
3578
  console.log('');
3340
3579
  console.log((0, hosts_1.textoDosPitfalls)(host));
3341
3580
  return 0;
@@ -3343,11 +3582,12 @@ function comandoAdapter(args) {
3343
3582
  if (sub === 'install') {
3344
3583
  const host = (0, hosts_1.parseHost)(args.posicionais[2]);
3345
3584
  if (!host) {
3346
- console.error(`host desconhecido: "${args.posicionais[2] ?? ''}". Use: ${hosts_1.ORDEM_DOS_HOSTS.join(' | ')}`);
3585
+ console.error(ma.hostDesconhecido(args.posicionais[2] ?? '', hosts_1.ORDEM_DOS_HOSTS.join(' | ')));
3347
3586
  return 2;
3348
3587
  }
3349
3588
  const carregado = (0, manifest_1.carregarManifesto)();
3350
- const r = (0, hosts_1.instalarAdaptador)(host, {
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, {
3351
3591
  projeto: carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)(),
3352
3592
  dir: texto(args.opcoes.dir),
3353
3593
  dryRun: args.opcoes['dry-run'] === true,
@@ -3360,13 +3600,13 @@ function comandoAdapter(args) {
3360
3600
  // unico caminho de saida. `;` separa varios, como o resto do CLI ja faz.
3361
3601
  aceitarCatalogo: (texto(args.opcoes['aceitar-catalogo']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
3362
3602
  manterCopia: (texto(args.opcoes['manter-copia']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
3363
- // RM-061 (F3a, D1 e D9): o bloco da experiência nasce na língua do dono; o texto impresso segue em pt-BR (F3b).
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.
3364
3604
  locale: (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale,
3365
- });
3605
+ }));
3366
3606
  console.log((0, hosts_1.textoDaInstalacao)(r));
3367
3607
  return r.ok ? 0 : 2;
3368
3608
  }
3369
- console.error(`subcomando desconhecido: adapter ${sub}`);
3609
+ console.error(ma.subcomandoDesconhecido(sub));
3370
3610
  return 2;
3371
3611
  }
3372
3612
  /**
@@ -3405,6 +3645,7 @@ function comandoEval(args) {
3405
3645
  * diferente de zero quando reprova, para o agendador do host perceber sem ler texto.
3406
3646
  */
3407
3647
  function comandoAudit(args) {
3648
+ const m = (0, locale_1.msg)().audit;
3408
3649
  if (args.posicionais[1] === 'process') {
3409
3650
  const r = (0, process_audit_1.auditarProcesso)((0, manifest_1.exigirManifesto)(), args.opcoes.registrar === true);
3410
3651
  console.log(JSON.stringify(r, null, 2));
@@ -3418,26 +3659,26 @@ function comandoAudit(args) {
3418
3659
  const bruto = texto(args.opcoes.estagio) ?? texto(args.opcoes.stage);
3419
3660
  const estagio = bruto ? (0, auditoria_1.parseEstagio)(bruto) : carregado?.manifesto.project.stage;
3420
3661
  if (bruto && !estagio) {
3421
- console.error(`estagio invalido: "${bruto}". Use: nascente | crescendo | maduro`);
3662
+ console.error(m.erro.estagio(bruto));
3422
3663
  return 2;
3423
3664
  }
3424
3665
  const pack = texto(args.opcoes.pack) ?? args.posicionais[2];
3425
3666
  if (pack) {
3426
3667
  const alvo = (0, auditoria_1.parsePack)(pack);
3427
3668
  if (!alvo) {
3428
- console.error(`pack desconhecido: "${pack}". Use um de: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3669
+ console.error(m.erro.pack(pack, auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3429
3670
  return 2;
3430
3671
  }
3431
3672
  console.log((0, auditoria_1.textoDoPack)(alvo, estagio ?? undefined));
3432
3673
  return 0;
3433
3674
  }
3434
- console.log(`Packs de auditoria periodica${estagio ? ` (estagio declarado do projeto: ${estagio})` : ''}`);
3675
+ console.log(m.packs.titulo(estagio ?? undefined));
3435
3676
  console.log('');
3436
3677
  console.log((0, auditoria_1.tabelaDePacks)(estagio ?? undefined));
3437
3678
  if (estagio) {
3438
3679
  console.log('');
3439
- console.log(`Ativos aqui e agora: ${(0, auditoria_1.packsAtivos)(estagio).join(', ')}`);
3440
- console.log(`Postura: ${(0, auditoria_1.posturaDoPack)(estagio)}`);
3680
+ console.log(m.packs.ativo((0, auditoria_1.packsAtivos)(estagio).join(', ')));
3681
+ console.log(m.packs.postura((0, auditoria_1.posturaDoPack)(estagio)));
3441
3682
  }
3442
3683
  return 0;
3443
3684
  }
@@ -3445,25 +3686,24 @@ function comandoAudit(args) {
3445
3686
  const raiz = (0, manifest_1.carregarManifesto)()?.raiz;
3446
3687
  const templates = (0, auditoria_1.carregarTemplatesDeAuditoria)(raiz);
3447
3688
  const problemas = templates.flatMap((t) => (0, auditoria_1.lintTemplateDeAuditoria)(t));
3448
- console.log(`Lint dos templates de auditoria${raiz ? ` (projeto ${raiz})` : ' (somente embutidos)'}`);
3689
+ console.log(m.cli.lintTitulo(raiz));
3449
3690
  console.log('');
3450
3691
  for (const p of problemas) {
3451
- console.log(` [${p.gravidade}] ${p.template} :: ${p.regra}`);
3452
- console.log(` ${p.detalhe}`);
3692
+ console.log(m.cli.lintItem(p.gravidade, p.template, p.regra));
3693
+ console.log(m.cli.lintDetalhe(p.detalhe));
3453
3694
  }
3454
3695
  if (problemas.length === 0)
3455
- console.log(` nenhum problema em ${templates.length} template(s)`);
3696
+ console.log(m.cli.lintOk(templates.length));
3456
3697
  console.log('');
3457
- console.log(`templates: ${templates.length} | erros: ${problemas.filter((p) => p.gravidade === 'erro').length} | ` +
3458
- `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));
3459
3699
  return problemas.some((p) => p.gravidade === 'erro') ? 2 : 0;
3460
3700
  }
3461
3701
  const carregado = (0, manifest_1.exigirManifesto)();
3462
3702
  if (sub === 'run') {
3463
3703
  const pack = (0, auditoria_1.parsePack)(args.posicionais[2]);
3464
3704
  if (!pack) {
3465
- console.error('uso: ork audit run <pack> [--profile P] [--since Nd]');
3466
- console.error(` packs: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3705
+ console.error(m.uso('run'));
3706
+ console.error(m.cli.packs(auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3467
3707
  return 2;
3468
3708
  }
3469
3709
  const autorizar = args.opcoes.agora;
@@ -3478,15 +3718,15 @@ function comandoAudit(args) {
3478
3718
  forcar: args.opcoes.forcar === true || args.opcoes.force === true,
3479
3719
  });
3480
3720
  if (r.status === 'bloqueada') {
3481
- console.error(`Rodada de auditoria ${r.id} BLOQUEADA.`);
3721
+ console.error(m.cli.bloqueada(r.id));
3482
3722
  console.error(` ${auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[r.motivo ?? 'runtime.unavailable']}`);
3483
- console.error(` motivo tipado: ${r.motivo}`);
3484
- console.error(` detalhe: ${r.detalhe}`);
3485
- console.error(` estado da rodada: .orkastery/audits/${r.id}/run.json`);
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));
3486
3726
  return 1;
3487
3727
  }
3488
3728
  if (r.status === 'ensaio') {
3489
- console.log(`Simulacao (--dry-run) da rodada ${r.id}: nada foi despachado.`);
3729
+ console.log(m.cli.ensaio(r.id));
3490
3730
  console.log(` pack ${r.pack} (postura ${r.postura} no estagio ${r.estagio})`);
3491
3731
  console.log(` escopo ${r.escopo.detalhe}`);
3492
3732
  console.log(` graphify ${r.escopo.graphify}`);
@@ -3495,11 +3735,11 @@ function comandoAudit(args) {
3495
3735
  console.log(` comando claude --bg "<prompt>" --name ${r.slug} --model ${r.custo.model} --effort ${r.custo.effort}`);
3496
3736
  if (r.superficie) {
3497
3737
  console.log(` superficie ${r.superficie.detalhe}`);
3498
- console.log(` nada registrado no board (--dry-run). Para gravar: ork audit surface --registrar ${r.id}`);
3738
+ console.log(m.cli.superficieDry(r.id));
3499
3739
  }
3500
3740
  return 0;
3501
3741
  }
3502
- console.log(`Rodada de auditoria ${r.id} despachada pelo runtime adapter ${r.runtime}.`);
3742
+ console.log(m.cli.despachada(r.id, r.runtime));
3503
3743
  console.log(` pack ${r.pack} (${auditoria_1.PACKS[r.pack].titulo})`);
3504
3744
  console.log(` produto ${r.produto} (perfil ${r.perfil}), estagio ${r.estagio}, postura ${r.postura}`);
3505
3745
  console.log(` escopo ${r.escopo.detalhe}`);
@@ -3508,23 +3748,20 @@ function comandoAudit(args) {
3508
3748
  console.log(` janela ${r.custo.janela.detalhe}`);
3509
3749
  console.log(` sessionId ${r.sessionId}`);
3510
3750
  console.log(` prompt ${r.promptPath} (sha256 ${r.promptSha256})`);
3511
- console.log(` verificada no runtime: ${r.verificada ? 'sim' : 'NAO (confira `ork sessions`)'}`);
3751
+ console.log(m.cli.verificada(r.verificada));
3512
3752
  if (r.superficie) {
3513
3753
  console.log(` superficie ${r.superficie.detalhe}`);
3514
- console.log(` ${r.superficie.registrados} achado(s) de superficie ja no board de divida` +
3515
- (r.superficie.aConfirmar > 0
3516
- ? `, ${r.superficie.aConfirmar} com confianca baixa (pedem confirmacao humana)`
3517
- : ''));
3754
+ console.log(m.cli.superficieBoard(r.superficie.registrados, r.superficie.aConfirmar));
3518
3755
  }
3519
3756
  console.log('');
3520
- console.log('A rodada termina em PROPOSTA para o roadmap, nunca em correcao aplicada.');
3521
- console.log(`Depois dos achados: ork audit verify ${r.id} && ork audit report ${r.id}`);
3757
+ console.log(m.cli.proposta);
3758
+ console.log(m.cli.depois(r.id));
3522
3759
  return r.verificada ? 0 : 1;
3523
3760
  }
3524
3761
  if (sub === 'list') {
3525
3762
  console.log((0, auditrun_1.tabelaDeRodadas)(carregado.raiz));
3526
3763
  console.log('');
3527
- console.log(`Board de divida: ${(0, auditrun_1.resumoDoBoard)(carregado.raiz)}`);
3764
+ console.log(m.cli.board((0, auditrun_1.resumoDoBoard)(carregado.raiz)));
3528
3765
  return 0;
3529
3766
  }
3530
3767
  if (sub === 'show') {
@@ -3533,7 +3770,7 @@ function comandoAudit(args) {
3533
3770
  return recusarSobraDoObjective(sobra);
3534
3771
  const id = args.posicionais[2];
3535
3772
  if (!id) {
3536
- console.error('uso: ork audit show <rodada> [--ledger]');
3773
+ console.error(m.uso('show'));
3537
3774
  return 2;
3538
3775
  }
3539
3776
  if (args.opcoes.ledger === true) {
@@ -3546,8 +3783,8 @@ function comandoAudit(args) {
3546
3783
  if (sub === 'prompt') {
3547
3784
  const pack = (0, auditoria_1.parsePack)(args.posicionais[2]);
3548
3785
  if (!pack) {
3549
- console.error('uso: ork audit prompt <pack> [--since Nd]');
3550
- console.error(` packs: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3786
+ console.error(m.uso('prompt'));
3787
+ console.error(m.cli.packs(auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3551
3788
  return 2;
3552
3789
  }
3553
3790
  const { raiz, manifesto } = carregado;
@@ -3580,16 +3817,16 @@ function comandoAudit(args) {
3580
3817
  const id = args.posicionais[2];
3581
3818
  const arquivo = texto(args.opcoes.arquivo) ?? texto(args.opcoes.file);
3582
3819
  if (!id || !arquivo) {
3583
- console.error('uso: ork audit ingest <rodada> --arquivo <achados.json>');
3820
+ console.error(m.uso('ingest'));
3584
3821
  return 2;
3585
3822
  }
3586
3823
  const r = (0, auditrun_1.ingerirAchados)(carregado, id, arquivo);
3587
- console.log(`Ingestao da rodada ${r.rodada}: ${r.registrados.length} achado(s) no board de divida.`);
3824
+ console.log(m.cli.ingestao(r.rodada, r.registrados.length));
3588
3825
  // Bloco B6: cada proposta enderecada ao roadmap tambem vai para a colecao `roadmap`.
3589
3826
  if (r.registrados.length > 0) {
3590
3827
  const naMemoria = (0, memoria_1.publicarPropostas)(carregado, r.registrados);
3591
3828
  if (naMemoria.regime === 'orkmind') {
3592
- console.log(`Memoria (orkmind): propostas na colecao roadmap, ${naMemoria.detalhe}.`);
3829
+ console.log(m.cli.memoriaMuitas(naMemoria.detalhe));
3593
3830
  }
3594
3831
  }
3595
3832
  for (const a of r.registrados) {
@@ -3597,18 +3834,17 @@ function comandoAudit(args) {
3597
3834
  }
3598
3835
  if (r.duplicados.length > 0) {
3599
3836
  console.log('');
3600
- console.log('Ja registrados nesta rodada, ignorados (a ingestao e idempotente): ' +
3601
- r.duplicados.map((a) => a.id).join(', '));
3837
+ console.log(m.cli.duplicados(r.duplicados.map((a) => a.id).join(', ')));
3602
3838
  }
3603
3839
  if (r.recusados.length > 0) {
3604
3840
  console.log('');
3605
- console.error(`RECUSADOS (${r.recusados.length}):`);
3841
+ console.error(m.cli.recusados(r.recusados.length));
3606
3842
  for (const rec of r.recusados) {
3607
- console.error(` achado #${rec.indice + 1}: ${rec.erro}`);
3843
+ console.error(m.cli.recusado(rec.indice + 1, rec.erro));
3608
3844
  }
3609
3845
  }
3610
3846
  console.log('');
3611
- console.log(`Prove os achados antes de qualquer thread: ork audit verify ${r.rodada}`);
3847
+ console.log(m.cli.prove(r.rodada));
3612
3848
  return r.recusados.length > 0 ? 1 : 0;
3613
3849
  }
3614
3850
  if (sub === 'finding' || sub === 'achado') {
@@ -3633,11 +3869,11 @@ function comandoAudit(args) {
3633
3869
  irreversivel: texto(args.opcoes.irreversivel) ?? 'nenhum',
3634
3870
  estimativa: texto(args.opcoes.estimativa),
3635
3871
  });
3636
- console.log(`Achado ${achado.id} registrado no board de divida da rodada ${id}.`);
3872
+ console.log(m.cli.achadoRegistrado(achado.id, id));
3637
3873
  console.log((0, divida_1.textoDoAchado)(achado));
3638
3874
  const naMemoria = (0, memoria_1.publicarPropostas)(carregado, [achado]);
3639
3875
  if (naMemoria.regime === 'orkmind') {
3640
- console.log(`Memoria (orkmind): proposta na colecao roadmap, ${naMemoria.detalhe}.`);
3876
+ console.log(m.cli.memoriaUma(naMemoria.detalhe));
3641
3877
  }
3642
3878
  return 0;
3643
3879
  }
@@ -3649,66 +3885,66 @@ function comandoAudit(args) {
3649
3885
  return 2;
3650
3886
  }
3651
3887
  if (estado === 'virou-thread') {
3652
- console.error('o estado `virou-thread` e carimbado pelo proprio `ork thread new --from-finding`.');
3888
+ console.error(m.cli.estadoReservado);
3653
3889
  return 2;
3654
3890
  }
3655
3891
  const achado = (0, divida_1.exigirAchado)(carregado.raiz, id);
3656
3892
  const atualizado = (0, divida_1.carimbarAchado)(carregado.raiz, achado, { estado });
3657
- console.log(`Achado ${atualizado.id} agora esta ${atualizado.estado}.`);
3893
+ console.log(m.cli.achadoEstado(atualizado.id, atualizado.estado));
3658
3894
  console.log((0, divida_1.textoDoAchado)(atualizado));
3659
3895
  return 0;
3660
3896
  }
3661
- console.error(`subcomando desconhecido: audit finding ${acao ?? ''}`);
3897
+ console.error(m.cli.findingDesconhecido(acao ?? ''));
3662
3898
  return 2;
3663
3899
  }
3664
3900
  if (sub === 'verify') {
3665
3901
  const id = args.posicionais[2];
3666
3902
  if (!id) {
3667
- console.error('uso: ork audit verify <rodada>');
3903
+ console.error(m.uso('verify'));
3668
3904
  return 2;
3669
3905
  }
3670
3906
  const v = (0, auditrun_1.verificarRodada)(carregado, id);
3671
- console.log(`Claims dos achados da rodada ${v.rodada}, reexecutadas no HEAD real.`);
3672
- console.log(` HEAD real ${v.commit}`);
3673
- console.log(` diretorio ${v.cwd}`);
3907
+ console.log(m.cli.verifyTitulo(v.rodada));
3908
+ console.log(m.cli.verifyHead(v.commit));
3909
+ console.log(m.cli.verifyDir(v.cwd));
3674
3910
  console.log('');
3675
3911
  if (v.resultados.length === 0) {
3676
- console.log(' (nenhum achado aberto nesta rodada)');
3912
+ console.log(m.cli.verifyVazio);
3677
3913
  }
3678
3914
  for (const r of v.resultados) {
3679
- console.log(` ${r.claim.id} verificado: ${r.verificado ? 'sim' : 'NAO'} ${r.claim.alegacao}`);
3680
- console.log(` arquivo: ${r.claim.arquivo}`);
3681
- console.log(` ${r.claim.verificar.length > 0 ? `comando(s): ${r.claim.verificar.join(' && ')}` : 'sem comando de verificacao'}`);
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);
3682
3918
  if (!r.verificado)
3683
- console.log(` motivo tipado: ${r.motivo} (${r.detalhe})`);
3919
+ console.log(m.cli.motivoDetalhe(String(r.motivo), r.detalhe));
3684
3920
  }
3685
3921
  console.log('');
3686
3922
  console.log(v.ok
3687
- ? 'Veredito: ACHADOS SUSTENTADOS (o auditor provou o que alegou).'
3688
- : `Veredito: REPROVADO. Motivos tipados: ${v.motivos.join(', ')}`);
3923
+ ? m.cli.vereditoOk
3924
+ : m.cli.vereditoRuim(v.motivos.join(', ')));
3689
3925
  if (v.motivos.includes('claims.unverifiable')) {
3690
- console.log(' aviso: achado sem comando de verificacao avisa e nao bloqueia (regra do gate do B1).');
3926
+ console.log(m.cli.unverifiable);
3691
3927
  }
3692
3928
  return v.ok ? 0 : 1;
3693
3929
  }
3694
3930
  if (sub === 'report' || sub === 'relatorio') {
3695
3931
  const id = args.posicionais[2];
3696
3932
  if (!id) {
3697
- console.error('uso: ork audit report <rodada> [--publicar]');
3933
+ console.error(m.uso('report'));
3698
3934
  return 2;
3699
3935
  }
3700
3936
  const r = (0, auditrun_1.relatorioDaRodada)(carregado, id, { publicar: args.opcoes.publicar === true });
3701
3937
  console.log(r.texto);
3702
- console.log(`(relatorio gravado em ${r.caminho})`);
3938
+ console.log(m.cli.relatorio(r.caminho));
3703
3939
  if (r.publicado)
3704
- console.log(`(publicado em ${r.publicado})`);
3940
+ console.log(m.cli.publicado(r.publicado));
3705
3941
  return 0;
3706
3942
  }
3707
3943
  if (sub === 'divida' || sub === 'board') {
3708
3944
  const bruto = texto(args.opcoes.pack);
3709
3945
  const pack = bruto ? (0, auditoria_1.parsePack)(bruto) : undefined;
3710
3946
  if (bruto && !pack) {
3711
- console.error(`pack desconhecido: "${bruto}". Use um de: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3947
+ console.error(m.erro.pack(bruto, auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3712
3948
  return 2;
3713
3949
  }
3714
3950
  console.log((0, divida_1.tabelaDaDivida)(carregado.raiz, {
@@ -3724,14 +3960,14 @@ function comandoAudit(args) {
3724
3960
  if (sub === 'surface' || sub === 'superficie') {
3725
3961
  const bruta = texto(args.opcoes.regra);
3726
3962
  if (bruta && !superficie_1.REGRAS_DE_SUPERFICIE.includes(bruta.toUpperCase())) {
3727
- console.error(`regra desconhecida: "${bruta}". Use uma de: ${superficie_1.REGRAS_DE_SUPERFICIE.join(', ')}`);
3963
+ console.error(m.erro.regra(bruta, superficie_1.REGRAS_DE_SUPERFICIE.join(', ')));
3728
3964
  return 2;
3729
3965
  }
3730
3966
  const regra = bruta ? bruta.toUpperCase() : undefined;
3731
3967
  const limiteBruto = texto(args.opcoes.limite);
3732
3968
  const limite = limiteBruto ? Number(limiteBruto) : undefined;
3733
3969
  if (limite !== undefined && (!Number.isFinite(limite) || limite < 1)) {
3734
- console.error(`--limite invalido: "${limiteBruto}". Use um inteiro >= 1.`);
3970
+ console.error(m.erro.limite(limiteBruto ?? ''));
3735
3971
  return 2;
3736
3972
  }
3737
3973
  const rodadaAlvo = texto(args.opcoes.registrar);
@@ -3739,17 +3975,17 @@ function comandoAudit(args) {
3739
3975
  const r = (0, auditrun_1.varrerSuperficieDaRodada)(carregado, rodadaAlvo, { registrar: true, limitePorRegra: limite });
3740
3976
  console.log((0, superficie_1.textoDaVarredura)(r.resultado));
3741
3977
  console.log('');
3742
- console.log(`Rodada ${r.rodada}: ${r.registrados.length} achado(s) registrado(s) no board de divida.`);
3978
+ console.log(m.cli.rodadaRegistrada(r.rodada, r.registrados.length));
3743
3979
  for (const a of r.registrados)
3744
3980
  console.log(` ${a.id} ${a.regra} ${a.arquivo}:${a.linha} ${a.titulo}`);
3745
3981
  if (r.duplicados.length > 0) {
3746
- console.log(` ja registrados nesta rodada: ${r.duplicados.map((a) => a.id).join(', ')}`);
3982
+ console.log(m.cli.jaRegistrados(r.duplicados.map((a) => a.id).join(', ')));
3747
3983
  }
3748
3984
  for (const rec of r.recusados) {
3749
- console.error(` RECUSADO ${rec.achado.regra} ${rec.achado.arquivo}:${rec.achado.linha}: ${rec.erro}`);
3985
+ console.error(m.cli.recusadoSuperficie(rec.achado.regra, rec.achado.arquivo, rec.achado.linha, rec.erro));
3750
3986
  }
3751
3987
  console.log('');
3752
- console.log(`Prove os achados antes de qualquer thread: ork audit verify ${r.rodada}`);
3988
+ console.log(m.cli.prove(r.rodada));
3753
3989
  if (r.recusados.length > 0)
3754
3990
  return 1;
3755
3991
  return r.registrados.length > 0 ? 1 : 0;
@@ -3768,7 +4004,7 @@ function comandoAudit(args) {
3768
4004
  // Codigo != 0 com achado: o agendador do host percebe a superficie aberta sem ler texto.
3769
4005
  return resultado.achados.length > 0 ? 1 : 0;
3770
4006
  }
3771
- console.error(`subcomando desconhecido: audit ${sub}`);
4007
+ console.error(m.uso(sub));
3772
4008
  return 2;
3773
4009
  }
3774
4010
  /** Roteia o comando. Devolve o codigo de saida do processo. */
@@ -3812,19 +4048,19 @@ function comandoRecall(args) {
3812
4048
  const carregado = (0, project_state_1.memoryState)((0, manifest_1.exigirManifesto)()).loaded;
3813
4049
  const id = args.posicionais[1];
3814
4050
  if (!id) {
3815
- console.error('uso: ork recall <thread-id> [--fase FASE] [--id ptr-N] [--todos] [--forcar]');
4051
+ console.error((0, locale_1.msg)().operacao.restante.recall.uso);
3816
4052
  return 2;
3817
4053
  }
3818
4054
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
3819
4055
  const faseBruta = texto(args.opcoes.fase) ?? texto(args.opcoes.momento);
3820
4056
  const momento = faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined;
3821
4057
  const memoria = (0, memoria_1.abrirMemoria)(carregado, { leituraRestrita: { thread: id, limite: limiteDeLeitura(args.opcoes.janela) } });
3822
- 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, {
3823
4059
  momento,
3824
4060
  id: texto(args.opcoes.id),
3825
4061
  todos: args.opcoes.todos === true,
3826
4062
  forcar: args.opcoes.forcar === true,
3827
- });
4063
+ }));
3828
4064
  if (args.opcoes.json === true) {
3829
4065
  console.log(JSON.stringify(r, null, 2));
3830
4066
  }
@@ -3839,15 +4075,16 @@ function comandoMemory(args) {
3839
4075
  const candidate = (0, manifest_1.exigirManifesto)();
3840
4076
  const carregado = (0, project_state_1.memoryState)(candidate).loaded;
3841
4077
  const sub = args.posicionais[1] ?? 'status';
4078
+ const mm = (0, locale_1.msg)().operacao.restante.memory.cli;
3842
4079
  const escopo = texto(args.opcoes.escopo)?.split(',').map(s => s.trim());
3843
4080
  if (sub === 'inventory' || (sub === 'migrate' && args.opcoes['dry-run'] === true)) {
3844
4081
  const r = (0, memory_migration_1.inventariarHandoffs)(carregado, escopo);
3845
4082
  if (args.opcoes.json === true)
3846
4083
  console.log(JSON.stringify(r, null, 2));
3847
4084
  else {
3848
- console.log(`Inventario do tenant ${r.tenant}: ${r.incluidos} incluidos, ${r.excluidos} excluidos.`);
4085
+ console.log(mm.inventario(r.tenant, r.incluidos, r.excluidos));
3849
4086
  for (const f of r.fontes)
3850
- console.log(` ${f.incluir ? 'incluir' : 'excluir'} ${f.arquivo}: ${f.motivo}`);
4087
+ console.log(mm.fonte(f.incluir, f.arquivo, f.motivo));
3851
4088
  }
3852
4089
  return r.fontes.some(f => f.bloqueante) ? 1 : 0;
3853
4090
  }
@@ -3864,7 +4101,7 @@ function comandoMemory(args) {
3864
4101
  if (args.opcoes.json === true)
3865
4102
  console.log(JSON.stringify(r, null, 2));
3866
4103
  else {
3867
- console.log(`Migracao do tenant ${r.inventario.tenant}: ${r.resultados.filter(i => i.ok).length} confirmados, ${r.falhas} falhas, ${r.inventario.excluidos} excluidos.`);
4104
+ console.log(mm.migracao(r.inventario.tenant, r.resultados.filter(i => i.ok).length, r.falhas, r.inventario.excluidos));
3868
4105
  for (const item of r.resultados)
3869
4106
  console.log(` ${item.arquivo}: ${item.ok ? item.gravacao?.id : item.erro}`);
3870
4107
  }
@@ -3905,13 +4142,13 @@ function comandoMemory(args) {
3905
4142
  const motivo = error instanceof Error
3906
4143
  ? /^(?:write\.activation|scope|memory)\.[a-z.-]+/.exec(error.message)?.[0] ?? 'write.activation.invalid'
3907
4144
  : 'write.activation.invalid';
3908
- const detalhe = 'sync nao executado; colisao legada nao foi reavaliada';
4145
+ const detalhe = (0, locale_1.comLocale)('pt-BR', () => (0, locale_1.textoDoCatalogo)(m => m.operacao.restante.memory.cli.syncDetalhe));
3909
4146
  if (args.opcoes.json === true)
3910
4147
  console.log(JSON.stringify({
3911
4148
  regime: memoria.regime, estado: memoria.estado, thread: threadId ?? null, perfil,
3912
4149
  publicacao: { estado: 'pendente', motivo }, falhas: 1, gravadas: [], erro: motivo, detalhe,
3913
4150
  }, null, 2));
3914
- console.error(`${motivo}: ${detalhe}`);
4151
+ console.error(`${motivo}: ${(0, locale_1.remontar)(detalhe)}`);
3915
4152
  return 1;
3916
4153
  }
3917
4154
  }
@@ -3935,7 +4172,7 @@ function comandoMemory(args) {
3935
4172
  const janela = limiteDeLeitura(args.opcoes.janela);
3936
4173
  const tagsBrutas = texto(args.opcoes.tags);
3937
4174
  if (!tagsBrutas) {
3938
- console.error('uso: ork memory search --tags \'{"project":["orkastery"],"skill":["orkastery-decision"]}\'');
4175
+ console.error(mm.tagsUso);
3939
4176
  return 2;
3940
4177
  }
3941
4178
  let tags;
@@ -3943,7 +4180,7 @@ function comandoMemory(args) {
3943
4180
  tags = JSON.parse(tagsBrutas);
3944
4181
  }
3945
4182
  catch (e) {
3946
- console.error(`--tags nao e JSON valido: ${e.message}`);
4183
+ console.error(mm.tagsInvalidas(e.message));
3947
4184
  return 2;
3948
4185
  }
3949
4186
  const colecao = texto(args.opcoes.colecao) ?? texto(args.opcoes.collection);
@@ -3960,16 +4197,16 @@ function comandoMemory(args) {
3960
4197
  limite,
3961
4198
  });
3962
4199
  if (threadId && memoria.regime === 'files')
3963
- console.error(`memory.query.files: ${memoria.estado.motivo}; resultado nao comprova ausencia na memoria semantica`);
4200
+ console.error(mm.files(`${memoria.estado.motivo}`));
3964
4201
  if (args.opcoes.json === true) {
3965
4202
  console.log(JSON.stringify(entradas, null, 2));
3966
4203
  return 0;
3967
4204
  }
3968
- console.log(`Busca deterministica por tag (regime ${memoria.regime})`);
4205
+ console.log(mm.buscaTag(memoria.regime));
3969
4206
  console.log('');
3970
4207
  if (memoria.regime === 'files') {
3971
4208
  console.log(` ${memoria.estado.detalhe}`);
3972
- console.log(` correcao: ${memoria.estado.correcao}`);
4209
+ console.log(mm.correcao(memoria.estado.correcao));
3973
4210
  return 0;
3974
4211
  }
3975
4212
  for (const e of entradas) {
@@ -3977,13 +4214,13 @@ function comandoMemory(args) {
3977
4214
  console.log(` ${e.content.split('\n')[0].slice(0, 100)}`);
3978
4215
  }
3979
4216
  console.log('');
3980
- console.log(` ${entradas.length} entrada(s)`);
4217
+ console.log(mm.entradas(entradas.length));
3981
4218
  return 0;
3982
4219
  }
3983
4220
  if (sub === 'index') {
3984
4221
  const modelo = texto(args.opcoes.modelo) ?? 'primario';
3985
4222
  if (!['primario', 'fallback', 'todos'].includes(modelo)) {
3986
- console.error('uso: ork memory index [--modelo primario|fallback|todos] [--dry-run] [--json]');
4223
+ console.error(mm.indexUso);
3987
4224
  return 2;
3988
4225
  }
3989
4226
  const memoria = (0, memoria_1.abrirMemoria)(carregado);
@@ -3992,7 +4229,7 @@ function comandoMemory(args) {
3992
4229
  if (args.opcoes.json === true)
3993
4230
  console.log(JSON.stringify(falha, null, 2));
3994
4231
  else
3995
- console.error(`memory.index: regime ${memoria.regime} (${memoria.estado.motivo}); ${memoria.estado.correcao}`);
4232
+ console.error(mm.indexFalha(memoria.regime, `${memoria.estado.motivo}`, memoria.estado.correcao));
3996
4233
  return 1;
3997
4234
  }
3998
4235
  const config = (0, manifest_1.configDeEmbedding)(carregado.manifesto);
@@ -4005,11 +4242,11 @@ function comandoMemory(args) {
4005
4242
  }
4006
4243
  catch (erro) {
4007
4244
  const motivo = (0, indice_vetorial_1.codigoDaFalha)(erro);
4008
- const detalhe = 'o universo da busca nao foi lido inteiro; nada foi embedado';
4245
+ const detalhe = mm.universoDetalhe;
4009
4246
  if (args.opcoes.json === true)
4010
4247
  console.log(JSON.stringify({ motivo, detalhe }, null, 2));
4011
4248
  else
4012
- console.error(`memory.index: ${motivo}; ${detalhe}`);
4249
+ console.error(mm.universoFalhou(motivo, detalhe));
4013
4250
  return 1;
4014
4251
  }
4015
4252
  const alvos = modelo === 'todos' ? ['primario', 'fallback'] : [modelo];
@@ -4028,7 +4265,7 @@ function comandoMemory(args) {
4028
4265
  }
4029
4266
  return resultados.some(r => !r.dryRun && r.motivo) ? 1 : 0;
4030
4267
  }
4031
- console.error(`subcomando desconhecido: memory ${sub}`);
4268
+ console.error(mm.desconhecido(sub));
4032
4269
  return 2;
4033
4270
  }
4034
4271
  /** Aviso informativo: não consulta rede, não reserva e não bloqueia criação. */
@@ -4043,10 +4280,11 @@ function avisoRoadmapSemAssociacao(nome, roadmap) {
4043
4280
  * Nao combina com --tags nem com a leitura restrita por thread nesta versao (erro tipado).
4044
4281
  */
4045
4282
  function buscaPorTexto(args, carregado) {
4283
+ const mm = (0, locale_1.msg)().operacao.restante.memory.cli;
4046
4284
  const frase = texto(args.opcoes.texto);
4047
4285
  if (args.opcoes.tags !== undefined || args.opcoes.thread !== undefined || args.opcoes.restrito !== undefined ||
4048
4286
  args.opcoes.janela !== undefined) {
4049
- console.error('memory.search.texto-exclusivo: --texto nao combina com --tags, --thread, --restrito nem --janela');
4287
+ console.error(mm.textoExclusivo);
4050
4288
  return 2;
4051
4289
  }
4052
4290
  const modo = (texto(args.opcoes.modo) ?? 'hibrido');
@@ -4056,7 +4294,7 @@ function buscaPorTexto(args, carregado) {
4056
4294
  if (!(0, orkmind_1.textoDeBuscaValido)(frase) || !busca_semantica_1.MODOS_DE_BUSCA.includes(modo) ||
4057
4295
  (colecao !== undefined && !orkmind_1.COLECOES_DO_ORK.includes(colecao)) ||
4058
4296
  !Number.isInteger(limite) || limite < 1 || limite > busca_semantica_1.LIMITE_MAXIMO_DA_BUSCA) {
4059
- console.error(`uso: ork memory search --texto "<frase>" [--modo ${busca_semantica_1.MODOS_DE_BUSCA.join('|')}] [--colecao ${orkmind_1.COLECOES_DO_ORK.join('|')}] [--limite 1..${busca_semantica_1.LIMITE_MAXIMO_DA_BUSCA}] [--json]`);
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));
4060
4298
  return 2;
4061
4299
  }
4062
4300
  const memoria = (0, memoria_1.abrirMemoria)(carregado);
@@ -4079,7 +4317,7 @@ function buscaPorTexto(args, carregado) {
4079
4317
  }
4080
4318
  else if (!universo) {
4081
4319
  // RM-038: sem o universo inteiro nao ha busca; o motivo tipado sai, nunca um resultado parcial.
4082
- r = { ...vazio, motivo: falhaDoUniverso, detalhe: 'o universo da busca nao foi lido inteiro; nada foi buscado' };
4320
+ r = { ...vazio, motivo: falhaDoUniverso, detalhe: mm.buscaUniversoDetalhe };
4083
4321
  }
4084
4322
  else {
4085
4323
  const driver = (0, orkmind_1.configDoManifesto)(carregado.manifesto);
@@ -4127,7 +4365,8 @@ function extrairOpcaoDeProjeto(argv) {
4127
4365
  return { argv: resto, projeto };
4128
4366
  }
4129
4367
  /** Comandos que nao leem projeto: o alvo nao e resolvido (nem recusado) para eles. */
4130
- const COMANDOS_SEM_PROJETO = new Set(['demo', 'ciclos', 'mcp', 'init', 'projetos']);
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']);
4131
4370
  /**
4132
4371
  * Fatia 2 (D3): os comandos que leem projeto e nao terminam com a linha `Projeto consultado`. Hoje so
4133
4372
  * o `sessions event`, o sensor dos hooks do Claude Code: maquina falando com maquina, e o sensor compara
@@ -4245,8 +4484,8 @@ function executarComando(argvBruto) {
4245
4484
  delete process.env[nome];
4246
4485
  }
4247
4486
  // CLI por locale (RM-061, EN1 e EN7): a escolha do onboarding (owner.language) ou o LC_ALL/LC_MESSAGES/LANG
4248
- // decidem a lingua do TEXTO dos comandos cobertos (`cobreLocale`); `--json` e contrato, e os recortes da D2
4249
- // da F2a (`doctor --modo`, `thread new --from-finding` e os subcomandos fora da lista) ficam em pt-BR.
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.
4250
4489
  if ((0, locale_1.cobreLocale)(args.posicionais, args.opcoes)) {
4251
4490
  (0, locale_1.ativarLocale)((0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale);
4252
4491
  (0, locale_1.ligarRemontagem)(true);
@@ -4256,28 +4495,34 @@ function executarComando(argvBruto) {
4256
4495
  const projeto = texto(args.opcoes.project), host = texto(args.opcoes.host), threadId = texto(args.opcoes.thread);
4257
4496
  // I-36 (D4): a identidade do despacho so chega com a thread vinculada da sessao filha.
4258
4497
  const dispatchId = texto(args.opcoes.dispatch);
4259
- const transporteShip = texto(args.opcoes['ship-transport']) ?? 'github-ssh';
4498
+ const transporteDado = texto(args.opcoes['ship-transport']);
4499
+ const transporteShip = transporteDado ?? 'github-ssh';
4500
+ const impressaoSsh = texto(args.opcoes['ssh-fingerprint']);
4260
4501
  const permissoesFilho = texto(args.opcoes['child-permissions']) ?? 'interactive';
4261
4502
  const permissoesDono = texto(args.opcoes['owner-permissions']);
4262
4503
  const acao = args.posicionais[1];
4263
4504
  if (args.posicionais.length !== 2 || !['serve', 'install'].includes(acao) || !projeto ||
4264
4505
  (host !== 'codex' && host !== 'claude-code') ||
4265
- 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)) ||
4266
4507
  (args.opcoes.dispatch !== undefined && (!threadId || !dispatchId || !/^[a-f0-9-]{36}$/.test(dispatchId))) ||
4267
4508
  argv.filter(a => a === '--ship-transport' || a.startsWith('--ship-transport=')).length > 1 ||
4268
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 ?? ''))) ||
4269
4512
  (args.opcoes['owner-permissions'] !== undefined && (host !== 'codex' || typeof args.opcoes['owner-permissions'] !== 'string' || !['interactive', 'orchestrate'].includes(permissoesDono ?? ''))) ||
4270
4513
  argv.filter(a => a === '--owner-permissions' || a.startsWith('--owner-permissions=')).length > 1 ||
4271
4514
  !['interactive', 'worktree'].includes(permissoesFilho) ||
4272
4515
  (args.opcoes['child-permissions'] !== undefined && typeof args.opcoes['child-permissions'] !== 'string') ||
4273
- !['github-ssh', 'bare-local'].includes(transporteShip) ||
4516
+ !(0, mcp_transportes_1.ehTransporteShipMcp)(transporteShip) ||
4274
4517
  (args.opcoes['ship-transport'] !== undefined && typeof args.opcoes['ship-transport'] !== 'string') ||
4275
4518
  (args.opcoes.thread !== undefined && (!threadId || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(threadId))) ||
4276
4519
  (args.opcoes['dry-run'] !== undefined && args.opcoes['dry-run'] !== true))
4277
- throw new Error('uso: ork mcp serve|install --project <raiz absoluta> --host codex|claude-code [--ship-transport github-ssh|bare-local] [--child-permissions interactive|worktree] [--owner-permissions interactive|orchestrate somente install Codex] [--dry-run somente install]');
4520
+ throw new Error((0, locale_1.msg)().operacao.restante.mcp.uso);
4278
4521
  if (acao === 'install') {
4279
- void Promise.resolve().then(() => __importStar(require('./mcp-install'))).then(({ instalarMcp, textoInstalacaoMcp }) => console.log(textoInstalacaoMcp(instalarMcp({ projeto, host, dryRun: args.opcoes['dry-run'] === true, transporteShip: transporteShip, permissoesFilho: permissoesFilho, permissoesDono: permissoesDono }))))
4280
- .catch(e => { console.error(`mcp: ${e.message}`); process.exitCode = 1; });
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; });
4281
4526
  return 0;
4282
4527
  }
4283
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; });
@@ -4295,7 +4540,20 @@ function executarComando(argvBruto) {
4295
4540
  }
4296
4541
  // RM-031: o check dos analisadores do grafo entra por aqui, a porta da familia do grafo (fronteira do KG1).
4297
4542
  // RM-061 (F2a): a redacao do check vem do catalogo, no locale do comando (a familia do grafo nao o importa).
4298
- const r = (0, doctor_1.doctor)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, () => (0, intelligence_graph_cli_1.checarAnalisadoresDoGrafo)(versao_1.VERSAO_DO_ORK, undefined, undefined, (0, locale_1.msg)().doctor.grafo));
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);
4299
4557
  console.log(r.texto);
4300
4558
  return r.codigo;
4301
4559
  }
@@ -4358,6 +4616,23 @@ function executarComando(argvBruto) {
4358
4616
  const carregado = (0, manifest_1.carregarManifesto)();
4359
4617
  // I-43: `#Look` no pedido nao pode cair no default em silencio. O adaptador
4360
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
+ }
4361
4636
  const aposentado = (0, modos_1.extrairTagAposentadaDoPedido)(pedido);
4362
4637
  if (aposentado) {
4363
4638
  console.error((0, modos_1.recusaDeModoAposentado)(aposentado));
@@ -4429,20 +4704,31 @@ function executarComando(argvBruto) {
4429
4704
  return comandoLedger(args);
4430
4705
  case 'sessions':
4431
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);
4432
4710
  case 'pulse': {
4433
4711
  if (args.posicionais[1] === 'responder') {
4434
4712
  // I-41 (GO-FIX 1, B1 e B2): o caminho de volta do resumo. So o ingresso autenticado chama;
4435
4713
  // argv traz identificadores e o envelope assinado vem por stdin, como no `gate answer`.
4436
4714
  if (args.opcoes['resposta-stdin'] !== true || args.opcoes.resposta !== undefined || args.posicionais.length !== 2) {
4437
- throw new Error('pulse responder exige --resposta-stdin e o envelope do ingresso autenticado');
4715
+ throw new Error((0, locale_1.msg)().operacao.pulseCadencia.responderUso);
4438
4716
  }
4439
4717
  const carregado = (0, manifest_1.exigirManifesto)();
4440
4718
  const envelope = (0, hitl_gates_1.lerRespostaStdin)({ por: texto(args.opcoes.por), mensagem: texto(args.opcoes.mensagem),
4441
4719
  origem: texto(args.opcoes.origem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
4442
4720
  const formato = texto(args.opcoes.formato);
4443
4721
  if (formato !== undefined && formato !== 'telegram' && formato !== 'terminal')
4444
- throw new Error('pulse responder: --formato telegram|terminal');
4445
- console.log(JSON.stringify((0, pulse_resposta_1.responderPeloPulse)(carregado.raiz, envelope, { canal: formato ?? 'telegram' })));
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 } : {}) })));
4446
4732
  return 0;
4447
4733
  }
4448
4734
  if (args.posicionais[1] === 'cadencia')
@@ -4464,6 +4750,8 @@ function executarComando(argvBruto) {
4464
4750
  return comandoVerify(args);
4465
4751
  case 'ci':
4466
4752
  return comandoCi(args);
4753
+ case 'privado':
4754
+ return comandoPrivado(args);
4467
4755
  case 'gate':
4468
4756
  return comandoGate(args);
4469
4757
  case 'retry':
@@ -4479,6 +4767,8 @@ function executarComando(argvBruto) {
4479
4767
  console.log(JSON.stringify(result, null, 2));
4480
4768
  return ['ok', 'empty', 'unknown', 'withheld', 'applied', 'rolled-back'].includes(result.state) ? 0 : 1;
4481
4769
  }
4770
+ case 'conhecimento':
4771
+ return comandoConhecimento(args);
4482
4772
  case 'memory':
4483
4773
  return comandoMemory(args);
4484
4774
  case 'grafo': {
@@ -4486,8 +4776,18 @@ function executarComando(argvBruto) {
4486
4776
  const carregado = (0, manifest_1.exigirManifesto)();
4487
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,
4488
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,
4489
4781
  escrever: (texto) => console.log(texto) });
4490
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
+ }
4491
4791
  case 'ship':
4492
4792
  return comandoShip(args);
4493
4793
  case 'activation':