@orkastery/cli 0.5.6 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) 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 +123 -9
  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/adapters/grok-events.js +227 -0
  105. package/dist/adapters/grok-mcp-servidor.js +612 -0
  106. package/dist/adapters/grok-mcp.js +178 -0
  107. package/dist/adapters/grok.js +686 -0
  108. package/dist/agendador-cpu.js +92 -0
  109. package/dist/atualizar-branch.js +245 -0
  110. package/dist/auditoria.js +13 -11
  111. package/dist/auditrun.js +51 -46
  112. package/dist/autorizacao-duravel.js +327 -0
  113. package/dist/board.js +94 -40
  114. package/dist/branch-de-estado.js +23 -10
  115. package/dist/busca-semantica.js +7 -5
  116. package/dist/catalogo.js +2 -1
  117. package/dist/changelog-reconciliacao.js +290 -0
  118. package/dist/check-agil.js +528 -0
  119. package/dist/check-modo.js +41 -0
  120. package/dist/check-paralelo.js +238 -0
  121. package/dist/ci.js +248 -45
  122. package/dist/ciclos.js +8 -6
  123. package/dist/claim-lint.js +12 -8
  124. package/dist/claims-conferir.js +47 -39
  125. package/dist/claims.js +10 -9
  126. package/dist/company-brain-client.js +10 -3
  127. package/dist/company-brain-migration.js +11 -5
  128. package/dist/conducao-batida.js +759 -0
  129. package/dist/conducao-sentinela.js +25 -8
  130. package/dist/conducao.js +89 -29
  131. package/dist/conhecimento-consulta.js +270 -0
  132. package/dist/conhecimento.js +111 -87
  133. package/dist/conta-esgotada.js +127 -0
  134. package/dist/dado-privado.js +816 -0
  135. package/dist/decisao-autonoma.js +5 -4
  136. package/dist/demo.js +14 -12
  137. package/dist/dependencias-da-worktree.js +25 -0
  138. package/dist/divida.js +38 -36
  139. package/dist/docs.js +89 -89
  140. package/dist/doctor-forja.js +343 -0
  141. package/dist/doctor-pulse-cron.js +113 -1
  142. package/dist/doctor.js +164 -6
  143. package/dist/dsn-da-memoria.js +417 -0
  144. package/dist/entrega-por-mod.js +503 -0
  145. package/dist/entrega-pr.js +154 -54
  146. package/dist/esgotamentos.js +13 -11
  147. package/dist/estado-thread.js +21 -18
  148. package/dist/evalrunner.js +35 -32
  149. package/dist/fabrica-batida.js +34 -21
  150. package/dist/fabrica-estado.js +33 -21
  151. package/dist/fix.js +21 -19
  152. package/dist/forja/adaptador.js +6 -0
  153. package/dist/forja/ambiente-de-ci.js +27 -0
  154. package/dist/forja/api.js +256 -0
  155. package/dist/forja/cache.js +89 -0
  156. package/dist/forja/cli.js +60 -0
  157. package/dist/forja/contrato.js +9 -0
  158. package/dist/forja/endereco.js +43 -0
  159. package/dist/forja/estado.js +22 -0
  160. package/dist/forja/executor.js +73 -0
  161. package/dist/forja/github/ci.js +95 -0
  162. package/dist/forja/github/dono-da-rede.js +18 -0
  163. package/dist/forja/github/metadados.js +15 -0
  164. package/dist/forja/github/pedidos.js +200 -0
  165. package/dist/forja/gitlab/ci.js +141 -0
  166. package/dist/forja/gitlab/consultas.js +59 -0
  167. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  168. package/dist/forja/gitlab/metadados.js +15 -0
  169. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  170. package/dist/forja/gitlab/pedidos.js +141 -0
  171. package/dist/forja/produtor.js +32 -0
  172. package/dist/forja/registro.js +31 -0
  173. package/dist/forja/resolver.js +121 -0
  174. package/dist/forja/texto.js +13 -0
  175. package/dist/forja/versao.js +71 -0
  176. package/dist/forja.js +123 -80
  177. package/dist/handoff.js +23 -13
  178. package/dist/hitl-contract.js +46 -43
  179. package/dist/hitl-curto.js +37 -25
  180. package/dist/hitl-gates.js +13 -11
  181. package/dist/hitl-local-receipt.js +51 -0
  182. package/dist/hitl-local.js +11 -2
  183. package/dist/hitl-lock.js +5 -11
  184. package/dist/hitl-public-receipt.js +11 -0
  185. package/dist/hitl-resumo.js +44 -1
  186. package/dist/hitl-sessions.js +62 -9
  187. package/dist/hitl-texto-livre.js +7 -4
  188. package/dist/hitl.js +34 -31
  189. package/dist/horario.js +20 -1
  190. package/dist/hosts.js +104 -134
  191. package/dist/index.js +864 -554
  192. package/dist/indice-vetorial.js +14 -12
  193. package/dist/init.js +11 -2
  194. package/dist/integracoes-locais.js +4 -0
  195. package/dist/intelligence-graph-cli.js +123 -69
  196. package/dist/intelligence-graph-query.js +37 -22
  197. package/dist/leases.js +19 -18
  198. package/dist/ledger-stats.js +17 -16
  199. package/dist/ledger.js +31 -1
  200. package/dist/licoes.js +12 -11
  201. package/dist/locale-accounts.js +228 -0
  202. package/dist/locale-adapter.js +291 -0
  203. package/dist/locale-ajuda.js +86 -10
  204. package/dist/locale-audit.js +199 -0
  205. package/dist/locale-claims.js +213 -0
  206. package/dist/locale-conducao.js +138 -0
  207. package/dist/locale-conhecimento.js +181 -0
  208. package/dist/locale-decisao.js +205 -0
  209. package/dist/locale-docs.js +230 -0
  210. package/dist/locale-estado.js +101 -0
  211. package/dist/locale-forja.js +288 -0
  212. package/dist/locale-gerados.js +5 -0
  213. package/dist/locale-grafo.js +129 -0
  214. package/dist/locale-master.js +83 -0
  215. package/dist/locale-network.js +524 -0
  216. package/dist/locale-operacao-restante.js +931 -0
  217. package/dist/locale-projetos.js +100 -0
  218. package/dist/locale-prompts.js +194 -0
  219. package/dist/locale-pulse.js +140 -2
  220. package/dist/locale-reservas.js +87 -0
  221. package/dist/locale-retry.js +183 -6
  222. package/dist/locale-security-scan.js +69 -0
  223. package/dist/locale-setup.js +192 -0
  224. package/dist/locale-ship.js +177 -66
  225. package/dist/locale-thread.js +149 -5
  226. package/dist/locale-verify.js +80 -4
  227. package/dist/locale-worktree.js +246 -0
  228. package/dist/locale.js +553 -9
  229. package/dist/maestro-runtime.js +22 -3
  230. package/dist/manifest.js +293 -12
  231. package/dist/maquina-ociosa.js +211 -0
  232. package/dist/maquina.js +10 -5
  233. package/dist/master-nota-local.js +200 -0
  234. package/dist/master-nota.js +10 -2
  235. package/dist/master.js +118 -41
  236. package/dist/mcp-conhecimento.js +52 -0
  237. package/dist/mcp-experiencia.js +26 -5
  238. package/dist/mcp-install.js +90 -15
  239. package/dist/mcp-noctum.js +101 -0
  240. package/dist/mcp-server.js +116 -22
  241. package/dist/mcp-ship-transporte.js +977 -0
  242. package/dist/mcp-ship.js +68 -24
  243. package/dist/mcp-transportes.js +17 -0
  244. package/dist/memoria.js +63 -58
  245. package/dist/merge-da-entrega.js +85 -0
  246. package/dist/modos-migracao.js +8 -6
  247. package/dist/modos.js +17 -18
  248. package/dist/network-roadmap.js +94 -54
  249. package/dist/noctum-aceite.js +929 -0
  250. package/dist/noctum-arco.js +540 -33
  251. package/dist/noctum-capacidade.js +3 -3
  252. package/dist/noctum-changelog.js +399 -0
  253. package/dist/noctum-cli.js +539 -0
  254. package/dist/noctum-coordenacao.js +1225 -0
  255. package/dist/noctum-entrega.js +1217 -0
  256. package/dist/noctum-envelope.js +253 -17
  257. package/dist/noctum-execucao.js +100 -24
  258. package/dist/noctum-fechamento.js +416 -0
  259. package/dist/noctum-fila.js +49 -10
  260. package/dist/noctum-guarda.js +333 -0
  261. package/dist/noctum-integracao.js +507 -0
  262. package/dist/noctum-maquinas.js +387 -0
  263. package/dist/noctum-medicao.js +450 -0
  264. package/dist/noctum-modo.js +390 -0
  265. package/dist/noctum-pergunta-canal.js +96 -0
  266. package/dist/noctum-pergunta.js +115 -0
  267. package/dist/noctum-provas.js +838 -0
  268. package/dist/noctum-reconciliacao.js +594 -0
  269. package/dist/noctum-rede.js +102 -0
  270. package/dist/noctum-registro.js +215 -0
  271. package/dist/noctum-relatorio.js +861 -0
  272. package/dist/noctum-resposta.js +207 -0
  273. package/dist/noctum-retomada-rede.js +71 -0
  274. package/dist/noctum-sessoes-em-voo.js +93 -0
  275. package/dist/noctum-supervisao.js +649 -0
  276. package/dist/noctum-terminal.js +459 -0
  277. package/dist/noctum-transporte.js +655 -0
  278. package/dist/noctum-vigia.js +679 -0
  279. package/dist/ocupacao.js +3 -1
  280. package/dist/onboarding.js +16 -5
  281. package/dist/orkmind.js +39 -23
  282. package/dist/orquestracao.js +31 -35
  283. package/dist/parado-no-condutor.js +160 -139
  284. package/dist/phase.js +96 -42
  285. package/dist/policies.js +33 -0
  286. package/dist/postura-local.js +11 -6
  287. package/dist/preflight.js +2 -1
  288. package/dist/procedencia.js +9 -14
  289. package/dist/projeto-alvo.js +59 -20
  290. package/dist/prompts.js +136 -42
  291. package/dist/prova-minima.js +5 -6
  292. package/dist/pulse-cadencia.js +5 -4
  293. package/dist/pulse-consentimento.js +53 -1
  294. package/dist/pulse-delivery.js +143 -27
  295. package/dist/pulse-resposta.js +368 -4
  296. package/dist/pulse.js +136 -3
  297. package/dist/ratelimit.js +13 -4
  298. package/dist/recall.js +14 -13
  299. package/dist/rede-adesao.js +13 -8
  300. package/dist/rede-forja.js +108 -24
  301. package/dist/rede-status.js +63 -45
  302. package/dist/rede.js +86 -46
  303. package/dist/retomada-checkpoint.js +101 -0
  304. package/dist/retry.js +326 -78
  305. package/dist/roadmap-reservas.js +32 -32
  306. package/dist/runtime-ambiente.js +5 -0
  307. package/dist/runtime-context.js +279 -85
  308. package/dist/runtime-escada.js +429 -0
  309. package/dist/runtime-profiles.js +130 -63
  310. package/dist/runtimes.js +42 -5
  311. package/dist/saida-segura.js +3 -2
  312. package/dist/security-scan/agil.js +366 -0
  313. package/dist/security-scan/cli.js +76 -0
  314. package/dist/security-scan/compare.js +149 -0
  315. package/dist/security-scan/config.js +93 -0
  316. package/dist/security-scan/detect.js +97 -0
  317. package/dist/security-scan/executor.js +196 -0
  318. package/dist/security-scan/guard.js +180 -0
  319. package/dist/security-scan/imagem-de-lint.js +96 -0
  320. package/dist/security-scan/normalize/actionlint.js +12 -0
  321. package/dist/security-scan/normalize/eslint.js +12 -0
  322. package/dist/security-scan/normalize/gitleaks.js +13 -0
  323. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  324. package/dist/security-scan/normalize/govulncheck.js +36 -0
  325. package/dist/security-scan/normalize/index.js +25 -0
  326. package/dist/security-scan/normalize/npm-audit.js +30 -0
  327. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  328. package/dist/security-scan/normalize/oxlint.js +51 -0
  329. package/dist/security-scan/normalize/pip-audit.js +16 -0
  330. package/dist/security-scan/normalize/ruff.js +12 -0
  331. package/dist/security-scan/normalize/semgrep.js +20 -0
  332. package/dist/security-scan/normalize/trivy.js +33 -0
  333. package/dist/security-scan/normalize/util.js +204 -0
  334. package/dist/security-scan/normalize/zizmor.js +19 -0
  335. package/dist/security-scan/report.js +156 -0
  336. package/dist/security-scan/run.js +448 -0
  337. package/dist/security-scan/tools.js +62 -0
  338. package/dist/security-scan/trabalhador.js +74 -0
  339. package/dist/security-scan/types.js +15 -0
  340. package/dist/session-events.js +19 -2
  341. package/dist/session-watcher-claude.js +74 -19
  342. package/dist/session-watcher-grok.js +425 -0
  343. package/dist/session-watcher.js +174 -13
  344. package/dist/sessoes-contas.js +42 -5
  345. package/dist/sessoes-inventario.js +1 -1
  346. package/dist/sessoes.js +25 -23
  347. package/dist/setup.js +67 -66
  348. package/dist/ship-publicar.js +263 -92
  349. package/dist/ship.js +160 -17
  350. package/dist/superficie.js +14 -11
  351. package/dist/thread-close.js +9 -9
  352. package/dist/thread.js +121 -18
  353. package/dist/tokens.js +15 -11
  354. package/dist/trabalho-thread.js +297 -0
  355. package/dist/transporte-do-canal.js +189 -0
  356. package/dist/types.js +12 -1
  357. package/dist/util.js +5 -2
  358. package/dist/varredura-acoes.js +500 -0
  359. package/dist/verify.js +491 -32
  360. package/dist/worktree-local.js +12 -10
  361. package/dist/worktree.js +81 -85
  362. package/eval/casos/check-quality.json +77 -0
  363. package/eval/casos/security-auditor.json +148 -0
  364. package/eval/casos/security-remediation.json +161 -0
  365. package/eval/fixtures/security-scan/README.md +8 -0
  366. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  367. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  368. package/eval/fixtures/security-scan/go/README.md +4 -0
  369. package/eval/fixtures/security-scan/go/config.go +4 -0
  370. package/eval/fixtures/security-scan/go/go.mod +5 -0
  371. package/eval/fixtures/security-scan/go/go.sum +2 -0
  372. package/eval/fixtures/security-scan/go/main.go +31 -0
  373. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  374. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  375. package/eval/fixtures/security-scan/js/README.md +4 -0
  376. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  377. package/eval/fixtures/security-scan/js/package.json +10 -0
  378. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  379. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  380. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  381. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  382. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  383. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  384. package/eval/fixtures/security-scan/python/README.md +4 -0
  385. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  386. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  387. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  388. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  389. package/package.json +10 -5
  390. package/references/security-checklist.md +3 -3
  391. package/skills/README.md +1 -0
  392. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  393. package/skills/phases/check-quality/SKILL.md +16 -0
  394. package/skills/phases/go-implementation/SKILL.md +6 -0
  395. package/skills/phases/security-remediation/SKILL.md +70 -0
  396. 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,20 +137,29 @@ 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");
137
146
  const runtime_profiles_1 = require("./runtime-profiles");
138
147
  const claude_bg_1 = require("./adapters/claude-bg");
139
148
  const codex_1 = require("./adapters/codex");
149
+ const grok_1 = require("./adapters/grok");
140
150
  const conducao_1 = require("./conducao");
141
151
  const conducao_sentinela_1 = require("./conducao-sentinela");
152
+ const autorizacao_duravel_1 = require("./autorizacao-duravel");
153
+ const atualizar_branch_1 = require("./atualizar-branch");
154
+ const conducao_batida_1 = require("./conducao-batida");
155
+ const pulse_delivery_1 = require("./pulse-delivery");
142
156
  const phase_1 = require("./phase");
143
157
  const prompts_1 = require("./prompts");
144
158
  const sessoes_2 = require("./sessoes");
145
159
  const util_1 = require("./util");
146
160
  const ship_1 = require("./ship");
147
161
  const ci_1 = require("./ci");
162
+ const dado_privado_1 = require("./dado-privado");
148
163
  const thread_1 = require("./thread");
149
164
  const docs_1 = require("./docs");
150
165
  const roadmap_reservas_1 = require("./roadmap-reservas");
@@ -162,6 +177,7 @@ const rede_status_1 = require("./rede-status");
162
177
  const ledger_1 = require("./ledger");
163
178
  const tokens_1 = require("./tokens");
164
179
  const types_1 = require("./types");
180
+ const dependencias_da_worktree_1 = require("./dependencias-da-worktree");
165
181
  const verify_1 = require("./verify");
166
182
  const fila_pesada_1 = require("./fila-pesada");
167
183
  const worktree_1 = require("./worktree");
@@ -172,6 +188,7 @@ const entrega_pr_1 = require("./entrega-pr");
172
188
  const ship_publicar_1 = require("./ship-publicar");
173
189
  const projeto_alvo_1 = require("./projeto-alvo");
174
190
  const worktree_local_1 = require("./worktree-local");
191
+ const mcp_transportes_1 = require("./mcp-transportes");
175
192
  const postura_local_1 = require("./postura-local");
176
193
  /** A versao publicada em `@orkastery/cli`, lida do package.json (`versao.ts`). */
177
194
  // Antes de qualquer arquivo ou despacho: sem escrita de grupo nem de outros, que o sensor recusaria.
@@ -267,11 +284,13 @@ function comandoThread(args) {
267
284
  if (args.posicionais[1] === 'close' || args.posicionais[1] === 'entrega') {
268
285
  const raiz = (0, manifest_1.exigirManifesto)().raiz, id = args.posicionais[2];
269
286
  if (!id)
270
- throw new Error('informe o id da thread');
287
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.informeOId);
271
288
  const por = texto(args.opcoes.por) ?? '';
272
- const r = args.posicionais[1] === 'close'
289
+ // RM-061 (F3b, D3): o fechamento e a entrega gravam (ledger, thread.json, a soltura do que a thread segurava) no
290
+ // escopo pt-BR; a recusa vem do catalogo e a entrada do CLI a remonta no locale do comando. O resultado e JSON.
291
+ const r = (0, locale_1.comLocale)('pt-BR', () => args.posicionais[1] === 'close'
273
292
  ? (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);
293
+ : (0, thread_close_1.registrarArtefato)(raiz, id, texto(args.opcoes.arquivo) ?? '', texto(args.opcoes.sha256) ?? '', por));
275
294
  console.log(JSON.stringify(r, null, 2));
276
295
  return 0;
277
296
  }
@@ -282,8 +301,14 @@ function comandoThread(args) {
282
301
  // O nome posicional passa a ser opcional, porque o titulo do achado ja serve de nome.
283
302
  const doAchado = texto(args.opcoes['from-finding']) ?? texto(args.opcoes['do-achado']);
284
303
  if (doAchado) {
304
+ const mf = (0, locale_1.msg)().thread.fromFinding;
285
305
  const brutoModoAchado = texto(args.opcoes.modo) ?? texto(args.opcoes.mode);
286
306
  let modoAchado;
307
+ // 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.
308
+ if (brutoModoAchado !== undefined && (0, noctum_modo_1.ehModoNoctum)(brutoModoAchado)) {
309
+ console.error((0, noctum_modo_1.recusaDoModoNaThread)(carregado.raiz).message);
310
+ return 2;
311
+ }
287
312
  if (brutoModoAchado !== undefined) {
288
313
  try {
289
314
  modoAchado = (0, modos_1.exigirModoVivo)(brutoModoAchado);
@@ -313,11 +338,12 @@ function comandoThread(args) {
313
338
  dryRun: args.opcoes['dry-run'] === true,
314
339
  });
315
340
  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}`);
341
+ const motivo = r.motivo ?? 'claims.failed';
342
+ console.error(mf.recusada(r.achado.id));
343
+ console.error(` ${mf.descricaoDoMotivo(motivo, auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[motivo])}`);
344
+ console.error(mf.motivoTipado(r.motivo));
345
+ console.error(mf.detalhe(r.detalhe));
346
+ console.error(mf.correcao(r.correcao));
321
347
  return 1;
322
348
  }
323
349
  const gravadaDoAchado = args.opcoes['dry-run'] !== true;
@@ -326,8 +352,8 @@ function comandoThread(args) {
326
352
  if (avisoDoRegistroDoAchado)
327
353
  console.error(avisoDoRegistroDoAchado);
328
354
  console.log(gravadaDoAchado
329
- ? `Thread criada a partir do achado ${r.achado.id}.`
330
- : 'Simulacao (--dry-run), nada foi gravado.');
355
+ ? mf.criada(r.achado.id)
356
+ : mf.simulacao);
331
357
  console.log((0, divida_1.textoDoAchado)(r.achado));
332
358
  console.log('');
333
359
  if (r.thread) {
@@ -357,14 +383,14 @@ function comandoThread(args) {
357
383
  }));
358
384
  }
359
385
  if (gravadaDoAchado && r.thread) {
360
- console.log(` origem do GOAL: .orkastery/threads/${r.thread.id}/achado.json`);
386
+ console.log(mf.origemDoGoal(r.thread.id));
361
387
  console.log('');
362
- console.log('Pedido de GOAL ja montado a partir do achado:');
388
+ console.log(mf.pedidoMontado);
363
389
  console.log('');
364
390
  console.log(r.pedido);
365
391
  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)"`);
392
+ console.log(mf.proximoPasso);
393
+ console.log(mf.comandoDoProximoPasso(r.thread.id));
368
394
  }
369
395
  return 0;
370
396
  }
@@ -378,6 +404,11 @@ function comandoThread(args) {
378
404
  if (avisoRoadmap)
379
405
  console.error(avisoRoadmap);
380
406
  const brutoModo = texto(args.opcoes.modo) ?? texto(args.opcoes.mode);
407
+ // 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.
408
+ if (brutoModo !== undefined && (0, noctum_modo_1.ehModoNoctum)(brutoModo)) {
409
+ console.error((0, noctum_modo_1.recusaDoModoNaThread)(carregado.raiz).message);
410
+ return 2;
411
+ }
381
412
  let modo;
382
413
  try {
383
414
  modo = brutoModo !== undefined
@@ -500,6 +531,7 @@ function comandoThread(args) {
500
531
  const linhaDaWorktreeNova = (0, thread_1.linhaDaWorktree)(criada.worktreePor, gravada, variante);
501
532
  if (linhaDaWorktreeNova)
502
533
  console.log(linhaDaWorktreeNova);
534
+ relatarDependencias(criada.dependencias, thread.worktree ?? '');
503
535
  const avisoDaWorktreeNova = criada.worktreeFalharia ? (0, thread_1.avisoDeWorktreeQueFalharia)(criada.worktreeFalharia)
504
536
  : (0, thread_1.avisoDaWorktree)(pedido.origem, criada, carregado.manifesto);
505
537
  const avisoSemBase = (0, thread_1.avisoDeThreadSemBase)(thread, gravada);
@@ -632,8 +664,9 @@ function comandoOnboarding(args) {
632
664
  }
633
665
  /**
634
666
  * I-33 (D8): `ork accounts list|add|remove|check`. O login e sempre do proprio CLI com o env do
635
- * perfil (`claude auth login`, `codex login`); o `ork` so guarda identidade, diretorio e estado,
636
- * nunca le, copia ou migra o que o CLI grava. A lista nao tem segredo porque o store nao tem.
667
+ * perfil (`claude auth login`, `codex login`, `grok login [--device-auth]`); o `ork` so guarda identidade,
668
+ * diretorio e estado, nunca le, copia ou migra o que o CLI grava (o `auth.json` do grok inclusive). A lista
669
+ * nao tem segredo porque o store nao tem.
637
670
  */
638
671
  /** A8: valor citado para colar no shell: aspas simples, e a aspa simples do proprio valor fechada e reaberta. */
639
672
  function aspasDeShell(valor) {
@@ -653,7 +686,13 @@ function comandoAccounts(args) {
653
686
  avisarChavesDePerfis(carregado);
654
687
  const raiz = carregado.raiz;
655
688
  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);
689
+ // RM-061 (F3b, GO-FIX 1): a conferencia roda no escopo pt-BR (o detalhe vai ao store), e a impressao o traduz.
690
+ const conferir = (p) => (0, locale_1.comLocale)('pt-BR', () => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p)
691
+ : p.runtime === 'grok' ? (0, grok_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p));
692
+ const detalhe = (auth) => ma.detalheDoLogin((0, locale_1.remontar)(auth.detalhe));
693
+ // RM-061 (F3b, D3): o texto pelo catalogo; o que se grava (store de perfis, registro de contas) roda no escopo pt-BR,
694
+ // e o id, o runtime, o diretorio, o motivo tipado e o detalhe que o CLI do runtime devolve saem como vieram.
695
+ const ma = (0, locale_1.msg)().accounts;
657
696
  const imprimir = () => {
658
697
  const store = (0, runtime_profiles_1.lerPerfis)(raiz);
659
698
  if (args.opcoes.json === true) {
@@ -662,8 +701,7 @@ function comandoAccounts(args) {
662
701
  }
663
702
  // I-49: a tabela mostra o que o despacho enxerga, com o que outra fabrica viu na mesma conta.
664
703
  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)));
704
+ console.log(visto.perfis.length === 0 ? ma.semPerfis : (0, util_1.tabela)([...ma.colunas], (0, runtime_profiles_1.linhasDePerfis)(visto)));
667
705
  // I-35: a tabela mostra horario do dono; o fuso sai uma vez, no fim da mensagem.
668
706
  if ((0, runtime_profiles_1.perfisComHorario)(store))
669
707
  console.log((0, horario_1.legendaDoFuso)());
@@ -674,8 +712,10 @@ function comandoAccounts(args) {
674
712
  }
675
713
  if (sub === 'add') {
676
714
  const id = args.posicionais[2], runtime = texto(args.opcoes.runtime), dirBruto = texto(args.opcoes.dir);
677
- if (!id || !runtime || !dirBruto) {
678
- console.error('uso: ork accounts add <id> --runtime claude-bg|codex --dir <diretorio> [--sem-login]');
715
+ // RM-067 (F3): o codigo de dispositivo e do login do grok; nos outros runtimes, a opcao e recusada.
716
+ const dispositivo = args.opcoes['device-auth'] === true;
717
+ if (!id || !runtime || !dirBruto || (dispositivo && runtime !== 'grok')) {
718
+ console.error(ma.usoAdd);
679
719
  return 2;
680
720
  }
681
721
  const dir = path.resolve(dirBruto);
@@ -684,77 +724,98 @@ function comandoAccounts(args) {
684
724
  // A7: diretorio inacessivel ou de outro usuario e recusado antes de qualquer gravacao no store.
685
725
  (0, runtime_profiles_1.prepararDiretorioDoPerfil)(dir);
686
726
  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 });
727
+ perfil = (0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.adicionarPerfil)(raiz, { id, runtime, dir }));
688
728
  if (desativado)
689
- console.log(`Perfil ${id} reativado: mesmo id, runtime e diretorio do perfil desativado.`);
729
+ console.log(ma.reativado(id));
690
730
  }
691
731
  catch (e) {
692
- console.error(`perfil recusado: ${e.message}`);
732
+ console.error(ma.recusado((0, locale_1.mensagemDoErro)(e)));
693
733
  return 1;
694
734
  }
695
735
  const despacho = (0, runtime_profiles_1.perfilDeDespacho)(perfil);
696
736
  const variavel = runtime_profiles_1.VARIAVEL_DO_PERFIL[perfil.runtime];
697
737
  // D13: o login do claude e fixado na assinatura (`--claudeai`), nunca no Console de API.
698
- const comando = perfil.runtime === 'claude-bg' ? ['claude', 'auth', 'login', '--claudeai'] : ['codex', 'login'];
738
+ // RM-067 (F3, D1 b): o grok entra pela assinatura, no login do proprio CLI (navegador ou codigo de dispositivo).
739
+ const comando = perfil.runtime === 'claude-bg' ? ['claude', 'auth', 'login', '--claudeai']
740
+ : perfil.runtime === 'grok' ? (0, grok_1.comandoDeLogin)(dispositivo) : ['codex', 'login'];
699
741
  if (args.opcoes['sem-login'] !== true && process.stdin.isTTY && process.stdout.isTTY) {
700
742
  // Login interativo do proprio CLI, com o env do perfil sobre a assinatura higienizada.
701
- const env = perfil.runtime === 'claude-bg' ? (0, claude_bg_1.ambienteDoPerfil)(despacho) : (0, codex_1.ambienteDoDespacho)(process.env, despacho);
743
+ const env = perfil.runtime === 'claude-bg' ? (0, claude_bg_1.ambienteDoPerfil)(despacho)
744
+ : perfil.runtime === 'grok' ? (0, grok_1.ambienteDoFilho)({ perfil: despacho }) : (0, codex_1.ambienteDoDespacho)(process.env, despacho);
702
745
  (0, node_child_process_1.spawnSync)(comando[0], comando.slice(1), { stdio: 'inherit', env });
703
746
  }
704
747
  else {
705
- console.log(`Login pendente: rode ${variavel}=${aspasDeShell(dir)} ${comando.join(' ')} e depois ork accounts check ${id}`);
748
+ console.log(ma.loginPendente(variavel, aspasDeShell(dir), comando.join(' '), id));
706
749
  }
707
750
  const auth = conferir(despacho);
708
751
  // A14: conferencia inconclusiva nao marca sem-auth; o preflight do proximo despacho confere de novo.
709
752
  if (!auth.ok && !auth.transitorio)
710
- (0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, id, auth.pago
753
+ (0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, id, auth.pago
711
754
  ? { 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`}`);
755
+ : { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe }));
756
+ console.log(ma.resultadoAdd(id, perfil.runtime, dir, auth.semConferencia ? ma.semConferenciaAdd(detalhe(auth)) : auth.ok ? ma.conferido
757
+ : auth.transitorio ? ma.inconclusivaAdd(detalhe(auth))
758
+ : auth.pago ? ma.pagoAdd(detalhe(auth)) : ma.semLoginAdd(detalhe(auth))));
716
759
  return 0;
717
760
  }
718
761
  if (sub === 'remove') {
719
762
  const id = args.posicionais[2];
720
763
  if (!id) {
721
- console.error('uso: ork accounts remove <id>');
764
+ console.error(ma.usoRemove);
722
765
  return 2;
723
766
  }
724
767
  try {
725
- (0, runtime_profiles_1.desativarPerfil)(raiz, id);
768
+ (0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.desativarPerfil)(raiz, id));
726
769
  }
727
770
  catch (e) {
728
- console.error(e.message);
771
+ console.error((0, locale_1.mensagemDoErro)(e));
729
772
  return 1;
730
773
  }
731
- console.log(`Perfil ${id} desativado: o diretorio e o login do CLI ficam onde estao.`);
774
+ console.log(ma.desativado(id));
732
775
  return 0;
733
776
  }
734
777
  if (sub === 'check') {
735
778
  const alvo = args.posicionais[2];
779
+ const expirados = new Set((0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.expirarPerfisVencidos)(raiz)).map(p => p.id));
736
780
  const perfis = (0, runtime_profiles_1.lerPerfis)(raiz).perfis.filter(p => p.estado !== 'desativado' && (alvo === undefined || p.id === alvo));
737
781
  if (alvo !== undefined && perfis.length === 0) {
738
- console.error(`perfil ativo "${alvo}" nao existe (veja: ork accounts list)`);
782
+ console.error(ma.perfilAtivoNaoExiste(alvo));
739
783
  return 1;
740
784
  }
785
+ const inventario = (0, sessoes_inventario_1.inventariarSessoes)(raiz, { global: true });
741
786
  let falhas = 0;
742
787
  for (const p of perfis) {
743
788
  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);
789
+ (0, locale_1.comLocale)('pt-BR', () => {
790
+ // RM-067 (F3): sem conferencia (grok), o estado fica: so o login que o proprio CLI confere devolve o perfil.
791
+ if (auth.ok && !auth.semConferencia && (p.estado === 'sem-auth' || p.estado === 'provider-pago'))
792
+ (0, runtime_profiles_1.reativarPerfil)(raiz, p.id);
793
+ if (!auth.ok && auth.transitorio)
794
+ (0, runtime_profiles_1.registrarConferenciaInconclusiva)(raiz, p.id, auth.detalhe);
795
+ else if (!auth.ok) {
796
+ (0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, p.id, auth.pago
797
+ ? { estado: 'provider-pago', esgotadoAte: null, motivo: 'cost.violation', detalhe: auth.detalhe }
798
+ : { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe });
799
+ }
800
+ });
746
801
  if (!auth.ok)
747
802
  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})`}`);
803
+ const atual = (0, runtime_profiles_1.lerPerfis)(raiz).perfis.find(x => x.id === p.id) ?? p;
804
+ const sessoes = inventario.sessoes.filter(s => s.viva && s.runtime === p.runtime && s.perfil === p.id);
805
+ const cargas = [...new Set(sessoes.flatMap(s => s.vinculos.length
806
+ ? s.vinculos.map(v => `${v.thread}:${v.fase}`) : [ma.sessaoSemVinculo(s.sessionId.slice(0, 8))]))];
807
+ const carga = !inventario.ok ? ma.cargaInconclusiva : cargas.length ? ma.cargaDaConta(cargas.join(', ')) : ma.cargaVazia;
808
+ const volta = atual.esgotadoAte ?? auth.cota?.resetEm ?? null;
809
+ const operacional = [
810
+ ma.limiteDaConta(ma.tipoDeLimite((0, runtime_profiles_1.tipoDeLimiteDoPerfil)(atual))),
811
+ ma.cotaDaConta(auth.cota ? ma.cotaMedida(auth.cota.usada, auth.cota.limite, auth.cota.unidade) : ma.cotaIndisponivel),
812
+ carga,
813
+ volta ? ma.voltaEm((0, horario_1.formatarDataHoraRotulada)(volta)) : ma.voltaSemMedida,
814
+ ...(expirados.has(p.id) ? [ma.marcaExpirada] : []),
815
+ ].join('; ');
816
+ console.log(`${ma.resultadoCheck(p.id, p.runtime, auth.semConferencia ? ma.semConferenciaCheck(detalhe(auth)) : auth.ok ? ma.conferido
817
+ : auth.transitorio ? ma.inconclusivaCheck(detalhe(auth))
818
+ : auth.pago ? ma.pagoCheck(detalhe(auth)) : ma.semLoginCheck(detalhe(auth)))}; ${operacional}`);
758
819
  }
759
820
  console.log('');
760
821
  imprimir();
@@ -767,13 +828,13 @@ function comandoAccounts(args) {
767
828
  relatorio = (0, esgotamentos_1.relatorioDeEsgotamentos)({ desde: texto(args.opcoes.desde) ?? '7d' });
768
829
  }
769
830
  catch (e) {
770
- console.error(`${e.message} (use --desde 7d, 24h, 30m ou uma data ISO)`);
831
+ console.error(ma.periodoInvalido(e.message));
771
832
  return 2;
772
833
  }
773
834
  console.log(args.opcoes.json === true ? JSON.stringify(relatorio, null, 2) : (0, esgotamentos_1.textoDosEsgotamentos)(relatorio));
774
835
  return 0;
775
836
  }
776
- console.error(`subcomando desconhecido: accounts ${sub} (use list, add, remove, check ou esgotamentos)`);
837
+ console.error(ma.desconhecido(sub));
777
838
  return 2;
778
839
  }
779
840
  function comandoSetup(args) {
@@ -781,6 +842,7 @@ function comandoSetup(args) {
781
842
  const raiz = carregado.raiz;
782
843
  const modoBruto = args.posicionais[1];
783
844
  const por = texto(args.opcoes.por) ?? 'owner';
845
+ const ms = (0, locale_1.msg)().setup.cli;
784
846
  if (modoBruto === 'versionar') {
785
847
  // I-52 (RM-047): o setup que vale agora vai para orkastery.setup.json, para entrar por PR.
786
848
  const r = (0, setup_1.versionarSetup)(raiz, por);
@@ -788,8 +850,8 @@ function comandoSetup(args) {
788
850
  console.log(JSON.stringify({ caminho: r.caminho, setup: r.setup }, null, 2));
789
851
  return 0;
790
852
  }
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.');
853
+ console.log(ms.versionado(r.caminho));
854
+ console.log(ms.levePorPr);
793
855
  return 0;
794
856
  }
795
857
  if (modoBruto === 'worktree') {
@@ -802,8 +864,8 @@ function comandoSetup(args) {
802
864
  console.log(JSON.stringify(local, null, 2));
803
865
  return 0;
804
866
  }
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.`);
867
+ console.log(ms.worktreeConfirmada(local.dir, local.raiz));
868
+ console.log(ms.worktreeGravada(worktree_local_1.ARQUIVO_WORKTREE_LOCAL));
807
869
  return 0;
808
870
  }
809
871
  if (acao === 'revogar') {
@@ -812,11 +874,11 @@ function comandoSetup(args) {
812
874
  console.log(JSON.stringify({ revogada: havia }, null, 2));
813
875
  return 0;
814
876
  }
815
- console.log(havia ? 'Confirmacao local da pasta das worktrees revogada.' : 'Nao havia confirmacao local da pasta das worktrees.');
877
+ console.log(havia ? ms.worktreeRevogada : ms.worktreeNaoHavia);
816
878
  return 0;
817
879
  }
818
880
  if (acao !== undefined) {
819
- console.error(`subcomando desconhecido: setup worktree ${acao} (use confirmar [<dir>] ou revogar)`);
881
+ console.error(ms.worktreeSubcomando(acao));
820
882
  return 2;
821
883
  }
822
884
  const pedida = (0, worktree_local_1.pastaDasWorktreesPedida)(raiz, carregado.manifesto);
@@ -827,9 +889,9 @@ function comandoSetup(args) {
827
889
  confirmadaNestaMaquina: local.local?.dir ?? null, criacao: recusa === null ? 'permitida' : 'recusada' }, null, 2));
828
890
  return 0;
829
891
  }
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}`);
892
+ console.log(ms.worktreeManifesto(carregado.manifesto.worktree.dir, pedida.dir, pedida.dentro));
893
+ console.log(ms.confirmacaoLocal(local.local ? local.local.dir : ms.nenhumaConfirmacao(String(local.motivo))));
894
+ console.log(recusa === null ? ms.criacaoPermitida : ms.criacaoRecusada(worktree_local_1.COMANDO_CONFIRMAR_WORKTREE));
833
895
  return 0;
834
896
  }
835
897
  if (modoBruto === 'sandbox') {
@@ -839,7 +901,7 @@ function comandoSetup(args) {
839
901
  if (acao === 'confirmar') {
840
902
  const postura = args.posicionais[3];
841
903
  if (!postura) {
842
- console.error('uso: ork setup sandbox confirmar <read-only|workspace-write|danger-full-access> [--por Q]');
904
+ console.error(ms.sandboxUso);
843
905
  return 2;
844
906
  }
845
907
  const p = (0, postura_local_1.confirmarPosturaLocal)(raiz, postura, por);
@@ -847,8 +909,8 @@ function comandoSetup(args) {
847
909
  console.log(JSON.stringify(p, null, 2));
848
910
  return 0;
849
911
  }
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.`);
912
+ console.log(ms.sandboxConfirmada(p.sandbox, p.raiz));
913
+ console.log(ms.sandboxGravada((0, postura_local_1.caminhoDaPosturaLocal)(raiz)));
852
914
  return 0;
853
915
  }
854
916
  if (acao === 'revogar') {
@@ -857,11 +919,11 @@ function comandoSetup(args) {
857
919
  console.log(JSON.stringify({ revogada: havia }, null, 2));
858
920
  return 0;
859
921
  }
860
- console.log(havia ? 'Confirmacao local da postura de sandbox revogada.' : 'Nao havia confirmacao local de postura de sandbox.');
922
+ console.log(havia ? ms.sandboxRevogada : ms.sandboxNaoHavia);
861
923
  return 0;
862
924
  }
863
925
  if (acao !== undefined) {
864
- console.error(`subcomando desconhecido: setup sandbox ${acao} (use confirmar <postura> ou revogar)`);
926
+ console.error(ms.sandboxSubcomando(acao));
865
927
  return 2;
866
928
  }
867
929
  const pedida = carregado.manifesto.runtime.sandbox;
@@ -872,9 +934,9 @@ function comandoSetup(args) {
872
934
  confirmadaNestaMaquina: local.postura?.sandbox ?? null, despachoCodex: recusa === null ? 'permitido' : 'recusado' }, null, 2));
873
935
  return 0;
874
936
  }
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)}`);
937
+ console.log(ms.sandboxManifesto(pedida));
938
+ console.log(ms.confirmacaoLocal(local.postura ? local.postura.sandbox : ms.nenhumaConfirmacao(String(local.motivo))));
939
+ console.log(recusa === null ? ms.despachoPermitido : ms.despachoRecusado((0, postura_local_1.comandoDeConfirmacao)(pedida)));
878
940
  return 0;
879
941
  }
880
942
  if (!modoBruto) {
@@ -884,7 +946,7 @@ function comandoSetup(args) {
884
946
  console.log(JSON.stringify((0, setup_1.lerSetup)(raiz), null, 2));
885
947
  return 0;
886
948
  }
887
- console.log('Setup resetado: todos os blocos de todos os modos voltaram ao default.');
949
+ console.log(ms.resetado);
888
950
  console.log((0, setup_1.textoDaEntrevista)(raiz));
889
951
  return 0;
890
952
  }
@@ -893,7 +955,7 @@ function comandoSetup(args) {
893
955
  }
894
956
  const modo = (0, modos_1.parseModo)(modoBruto);
895
957
  if (!modo) {
896
- console.error(`modo de conducao desconhecido: "${modoBruto}" (aceitos: ${modos_1.ORDEM_DOS_MODOS.join(', ')})`);
958
+ console.error(ms.modoDesconhecido(modoBruto, modos_1.ORDEM_DOS_MODOS.join(', ')));
897
959
  return 2;
898
960
  }
899
961
  if (args.opcoes.reset === true) {
@@ -902,7 +964,7 @@ function comandoSetup(args) {
902
964
  console.log(JSON.stringify((0, setup_1.lerSetup)(raiz).modos[modo], null, 2));
903
965
  return 0;
904
966
  }
905
- console.log(`Setup do modo ${modos_1.MODOS[modo].tag} resetado para o default.`);
967
+ console.log(ms.modoResetado(modos_1.MODOS[modo].tag));
906
968
  console.log('');
907
969
  console.log((0, setup_1.textoDoSetup)(raiz, modo));
908
970
  return 0;
@@ -915,26 +977,25 @@ function comandoSetup(args) {
915
977
  const fallbackBruto = args.opcoes.fallback === true ? '' : texto(args.opcoes.fallback);
916
978
  const fallback = fallbackBruto === undefined ? undefined : fallbackBruto.split(',').map(s => s.trim()).filter(s => s !== '');
917
979
  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,...]');
980
+ console.error(ms.informeBloco);
919
981
  return 2;
920
982
  }
921
983
  if (bloco !== undefined) {
922
984
  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');
985
+ console.error(ms.nadaParaEditar);
924
986
  return 2;
925
987
  }
926
988
  const r = (0, setup_1.editarBloco)(raiz, modo, Number(bloco), { runtime, model, effort, ...(fallback !== undefined ? { fallback } : {}) }, por);
927
989
  if (!r.ok) {
928
- console.error(`edicao recusada: ${r.erro}`);
990
+ console.error(ms.edicaoRecusada(r.erro ?? ''));
929
991
  return 1;
930
992
  }
931
993
  if (args.opcoes.json === true) {
932
994
  console.log(JSON.stringify(r.setup.modos[modo], null, 2));
933
995
  return 0;
934
996
  }
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`);
997
+ 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}`));
998
+ console.log(ms.gravado(r.caminho));
938
999
  console.log('');
939
1000
  console.log((0, setup_1.textoDoSetup)(raiz, modo));
940
1001
  return 0;
@@ -1073,10 +1134,11 @@ function comandoPhase(args) {
1073
1134
  function comandoLedger(args) {
1074
1135
  const carregado = (0, manifest_1.exigirManifesto)();
1075
1136
  const sub = args.posicionais[1];
1137
+ const m = (0, locale_1.msg)().operacao.ledger;
1076
1138
  if (sub === 'stats') {
1077
1139
  const desde = texto(args.opcoes.desde);
1078
1140
  if (!desde)
1079
- throw Error('uso: ork ledger stats --desde 7d [--ate ISO] [--thread T] [--modo M] [--runtime R] [--json]');
1141
+ throw Error(m.usoStats);
1080
1142
  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
1143
  console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, ledger_stats_1.textoDasEstatisticas)(r));
1082
1144
  return 0;
@@ -1085,12 +1147,12 @@ function comandoLedger(args) {
1085
1147
  const thread = args.posicionais[2], semIa = Number(texto(args.opcoes['sem-ia'])), iaSemOrk = Number(texto(args.opcoes['ia-sem-ork']));
1086
1148
  const por = texto(args.opcoes.por), metodo = texto(args.opcoes.metodo), premissas = texto(args.opcoes.premissas);
1087
1149
  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]');
1150
+ throw Error(m.usoEstimate);
1089
1151
  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.`);
1152
+ console.log(args.opcoes.json === true ? JSON.stringify(e, null, 2) : m.estimativa(thread, semIa, iaSemOrk));
1091
1153
  return 0;
1092
1154
  }
1093
- throw Error('uso: ork ledger stats|estimate ...');
1155
+ throw Error(m.uso);
1094
1156
  }
1095
1157
  /**
1096
1158
  * `ork sessions hitl`: quem, entre as sessoes do runtime, espera o humano AGORA.
@@ -1104,10 +1166,11 @@ function comandoLedger(args) {
1104
1166
  * como falha acionavel, sem precisar interpretar texto.
1105
1167
  */
1106
1168
  function comandoSessionsHitl(args, raiz) {
1169
+ const ms = (0, locale_1.msg)().operacao.restante.sessions;
1107
1170
  const bruto = texto(args.opcoes.atencao);
1108
1171
  const atencaoMin = bruto === undefined ? undefined : Number(bruto);
1109
1172
  if (atencaoMin !== undefined && (!Number.isFinite(atencaoMin) || atencaoMin < 0)) {
1110
- console.error(`--atencao espera minutos (inteiro >= 0), recebeu "${bruto}"`);
1173
+ console.error(ms.atencao(bruto ?? ''));
1111
1174
  return 2;
1112
1175
  }
1113
1176
  const radar = (0, hitl_1.varrerSessoes)({
@@ -1129,26 +1192,27 @@ function comandoSessionsHitl(args, raiz) {
1129
1192
  return 0;
1130
1193
  }
1131
1194
  function comandoSessions(args) {
1195
+ const ms = (0, locale_1.msg)().operacao.restante.sessions;
1132
1196
  const sub = args.posicionais[1];
1133
1197
  const carregado = (0, manifest_1.carregarManifesto)();
1134
1198
  const raiz = carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)();
1135
1199
  if (sub === 'watch') {
1136
1200
  const id = texto(args.opcoes.thread);
1137
1201
  if (!carregado || !id) {
1138
- console.error('uso: ork sessions watch --thread T [--sessao ID] [--once]');
1202
+ console.error(ms.usoWatch);
1139
1203
  return 2;
1140
1204
  }
1141
1205
  const thread = (0, thread_1.lerThread)(raiz, id);
1142
1206
  const sessionId = texto(args.opcoes.sessao) ?? thread.sessoes.at(-1)?.sessionId;
1143
1207
  if (!sessionId || !thread.sessoes.some(s => s.sessionId === sessionId))
1144
- throw new Error('sessão não pertence à thread');
1208
+ throw new Error(ms.sessaoDaThread);
1145
1209
  console.log(JSON.stringify(args.opcoes.once === true ? (0, session_watcher_1.observarSessao)(carregado, sessionId) : { pid: (0, session_watcher_1.iniciarWatcher)(raiz, sessionId) }));
1146
1210
  return 0;
1147
1211
  }
1148
1212
  if (sub === 'event') {
1149
1213
  const tipo = texto(args.opcoes.tipo), sessao = texto(args.opcoes.sessao);
1150
1214
  if (!carregado || !tipo || !sessao) {
1151
- console.error('uso: ork sessions event --tipo <tipo> --sessao <id> < payload.json (máximo 16384 bytes)');
1215
+ console.error(ms.usoEvent);
1152
1216
  return 2;
1153
1217
  }
1154
1218
  try {
@@ -1156,7 +1220,7 @@ function comandoSessions(args) {
1156
1220
  return 0;
1157
1221
  }
1158
1222
  catch (e) {
1159
- console.error(`evento recusado: ${e.message}`);
1223
+ console.error(ms.eventoRecusado(e.message));
1160
1224
  return 1;
1161
1225
  }
1162
1226
  }
@@ -1167,7 +1231,7 @@ function comandoSessions(args) {
1167
1231
  }
1168
1232
  if (sub === 'limpar-fantasmas') {
1169
1233
  if (!carregado) {
1170
- console.error('ork sessions limpar-fantasmas precisa de um projeto (orkastery.yaml)');
1234
+ console.error(ms.exigeProjeto);
1171
1235
  return 2;
1172
1236
  }
1173
1237
  const r = (0, sessoes_2.limparFantasmas)(raiz, { dryRun: args.opcoes['dry-run'] === true });
@@ -1181,14 +1245,14 @@ function comandoSessions(args) {
1181
1245
  const id = args.posicionais[2], sessionId = args.posicionais[3];
1182
1246
  const fase = texto(args.opcoes.fase), runtime = texto(args.opcoes.runtime), pergunta = texto(args.opcoes.pergunta);
1183
1247
  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');
1248
+ throw new Error(ms.request);
1185
1249
  console.log(JSON.stringify((0, hitl_sessions_1.abrirPedidoSessao)(raiz, id, sessionId, { fase: fase, runtime, pergunta, prazo: texto(args.opcoes.prazo) })));
1186
1250
  return 0;
1187
1251
  }
1188
1252
  if (sub === 'answer') {
1189
1253
  const id = args.posicionais[2], pedido = args.posicionais[3];
1190
1254
  if (!id || !pedido || args.opcoes.stdin !== true)
1191
- throw new Error('sessions answer exige thread, pedido e envelope autenticado em --stdin');
1255
+ throw new Error(ms.answer);
1192
1256
  const r = (0, hitl_gates_1.lerRespostaStdin)({ origem: texto(args.opcoes.origem), por: texto(args.opcoes.por),
1193
1257
  mensagem: texto(args.opcoes.mensagem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
1194
1258
  console.log(JSON.stringify((0, hitl_sessions_1.responderSessao)(raiz, id, pedido, r)));
@@ -1199,7 +1263,7 @@ function comandoSessions(args) {
1199
1263
  // pergunta ao receptor, pelo recibo correlacionado, se ele recebeu aquele envioId.
1200
1264
  const id = args.posicionais[2], pedido = args.posicionais[3];
1201
1265
  if (!id || !pedido)
1202
- throw new Error('sessions reconcile exige thread e pedido');
1266
+ throw new Error(ms.reconcile);
1203
1267
  const r = (0, hitl_sessions_1.reconciliarEnvioDeSessao)(raiz, id, pedido);
1204
1268
  console.log(JSON.stringify(r));
1205
1269
  return r.estado === 'entregue' ? 0 : 1;
@@ -1208,13 +1272,13 @@ function comandoSessions(args) {
1208
1272
  const id = args.posicionais[2], sessionId = args.posicionais[3];
1209
1273
  const fase = texto(args.opcoes.fase), runtime = texto(args.opcoes.runtime);
1210
1274
  if (!id || !sessionId || !fase || !types_1.FASES.includes(fase) || !runtime)
1211
- throw new Error('sessions supersede exige thread, UUID, --fase e --runtime');
1275
+ throw new Error(ms.supersede);
1212
1276
  console.log(JSON.stringify((0, hitl_sessions_1.superarSessao)(raiz, id, sessionId, fase, runtime)));
1213
1277
  return 0;
1214
1278
  }
1215
1279
  const chave = args.posicionais[2];
1216
1280
  if (!chave) {
1217
- console.error(`uso: ork sessions ${sub} <sessao>`);
1281
+ console.error(ms.usoSub(sub));
1218
1282
  return 2;
1219
1283
  }
1220
1284
  if (sub === 'adopt') {
@@ -1239,7 +1303,7 @@ function comandoSessions(args) {
1239
1303
  console.log(r.texto);
1240
1304
  return r.codigo;
1241
1305
  }
1242
- console.error(`subcomando desconhecido: sessions ${sub}`);
1306
+ console.error(ms.desconhecido(sub));
1243
1307
  return 2;
1244
1308
  }
1245
1309
  /**
@@ -1254,15 +1318,15 @@ function comandoDecisao(args) {
1254
1318
  const campo = (nome) => {
1255
1319
  const v = texto(args.opcoes[nome]);
1256
1320
  if (!v)
1257
- throw new Error(`decisao registrar exige --${nome}`);
1321
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.exigeFlag(nome));
1258
1322
  return v;
1259
1323
  };
1260
1324
  if (!id)
1261
- throw new Error('uso: ork decisao registrar <thread-id> --decidido D --porque P ...');
1325
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.usoRegistrar);
1262
1326
  const bruto = campo('criterio'), separador = bruto.indexOf(':');
1263
1327
  const tipo = bruto.slice(0, separador), referencia = bruto.slice(separador + 1);
1264
1328
  if (separador < 1 || !['manifesto', 'ledger', 'medicao'].includes(tipo) || !referencia.trim()) {
1265
- throw new Error('decisao registrar: --criterio manifesto:CHAVE, ledger:REF ou medicao:COMANDO');
1329
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.criterioUso);
1266
1330
  }
1267
1331
  const entrada = {
1268
1332
  decidido: campo('decidido'), porque: campo('porque'), comoMudar: campo('como-mudar'),
@@ -1284,8 +1348,10 @@ function comandoDecisao(args) {
1284
1348
  return 0;
1285
1349
  }
1286
1350
  if (sub === 'placar') {
1351
+ // RM-061 (F3b): o placar pelo catalogo; o `--json` e a fase de cada linha sao dado e nao mudam.
1352
+ const md = (0, locale_1.msg)().decisao;
1287
1353
  if (!id)
1288
- throw new Error('uso: ork decisao placar <thread-id> [--json]');
1354
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.usoPlacar);
1289
1355
  (0, thread_1.lerThread)(carregado.raiz, id);
1290
1356
  const placar = (0, decisao_autonoma_1.placarDaThread)((0, ledger_1.lerLedger)((0, thread_1.dirThread)(carregado.raiz, id)));
1291
1357
  const taxa = (0, decisao_autonoma_1.taxaDeReversao)(placar);
@@ -1293,12 +1359,12 @@ function comandoDecisao(args) {
1293
1359
  console.log(JSON.stringify({ thread: id, limiar: decisao_autonoma_1.LIMIAR_DE_DECISOES_POR_FASE, taxaDeReversao: taxa, fases: placar }, null, 2));
1294
1360
  return 0;
1295
1361
  }
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)}%`}`);
1362
+ 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),
1363
+ String(f.semRastro), f.acimaDoLimiar ? md.acimaDoLimiar(decisao_autonoma_1.LIMIAR_DE_DECISOES_POR_FASE) : md.dentroDoLimiar])));
1364
+ console.log(md.taxaDeReversao(taxa));
1299
1365
  return 0;
1300
1366
  }
1301
- throw new Error('uso: ork decisao registrar|placar <thread-id>');
1367
+ throw new locale_1.ErroDoCatalogo((m) => m.decisao.uso);
1302
1368
  }
1303
1369
  /**
1304
1370
  * I-50 (RM-039): a tag que o dono manda no Telegram, pelo terminal. Sem tag, mostra a cadencia em
@@ -1306,14 +1372,15 @@ function comandoDecisao(args) {
1306
1372
  */
1307
1373
  function comandoCadenciaDoPulse(args) {
1308
1374
  const carregado = (0, manifest_1.exigirManifesto)();
1375
+ const m = (0, locale_1.msg)().operacao.pulseCadencia;
1309
1376
  if (args.posicionais.length > 3)
1310
- throw new Error('pulse cadencia: uma tag por vez');
1377
+ throw new Error(m.umaTag);
1311
1378
  const bruta = args.posicionais[2];
1312
1379
  const agora = new Date().toISOString();
1313
1380
  if (bruta !== undefined) {
1314
1381
  const lido = (0, pulse_resposta_1.interpretarRespostaDoPulse)(bruta.trim().startsWith('#') ? bruta : `#${bruta.trim()}`);
1315
1382
  if (lido.forma !== 'cadencia') {
1316
- throw new Error(`pulse cadencia: tag desconhecida "${bruta}"; use ${Object.keys(pulse_cadencia_1.CADENCIAS).join(', ')}`);
1383
+ throw new Error(m.desconhecida(bruta, Object.keys(pulse_cadencia_1.CADENCIAS).join(', ')));
1317
1384
  }
1318
1385
  (0, pulse_cadencia_1.gravarCadencia)(carregado.raiz, lido.tag, { por: texto(args.opcoes.por) ?? (0, node_os_1.userInfo)().username,
1319
1386
  canal: texto(args.opcoes.canal) ?? 'terminal', em: agora });
@@ -1326,39 +1393,42 @@ function comandoCadenciaDoPulse(args) {
1326
1393
  }
1327
1394
  console.log((0, pulse_cadencia_1.textoDaCadencia)(vigente, agora));
1328
1395
  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.');
1396
+ ? m.trocada(vigente.gravada.por, vigente.gravada.canal, (0, horario_1.formatarDataHoraRotulada)(vigente.gravada.em))
1397
+ : m.padrao);
1331
1398
  return 0;
1332
1399
  }
1333
1400
  function comandoClaims(args) {
1334
1401
  const carregado = (0, manifest_1.exigirManifesto)();
1335
1402
  const sub = args.posicionais[1];
1403
+ // RM-061 (F3b, D3): o texto pelo catalogo; o que se grava (claims.jsonl, ledger) roda no escopo pt-BR, e a alegacao,
1404
+ // o arquivo, o comando e o motivo digitado saem como vieram. O estado da claim so se traduz na impressao.
1405
+ const mc = (0, locale_1.msg)().claims;
1336
1406
  if (sub === 'add') {
1337
1407
  const id = args.posicionais[2];
1338
1408
  const arquivo = args.posicionais[3];
1339
1409
  const alegacao = texto(args.opcoes.claim) ?? texto(args.opcoes.alegacao);
1340
1410
  if (!id || !arquivo || !alegacao) {
1341
- console.error('uso: ork claims add <thread-id> <arquivo> --claim "<alegacao>" [--verificar "<comando>"]');
1411
+ console.error(mc.usoAdd);
1342
1412
  return 2;
1343
1413
  }
1344
1414
  const comando = texto(args.opcoes.verificar) ?? texto(args.opcoes.verify);
1345
1415
  const faseBruta = texto(args.opcoes.fase);
1346
1416
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
1347
- const claim = (0, claims_1.adicionarClaim)(carregado.raiz, id, {
1417
+ const claim = (0, locale_1.comLocale)('pt-BR', () => (0, claims_1.adicionarClaim)(carregado.raiz, id, {
1348
1418
  arquivo,
1349
1419
  alegacao,
1350
1420
  verificar: comando ? [comando] : [],
1351
1421
  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}`);
1422
+ }));
1423
+ console.log(mc.registrada(claim.id, id));
1424
+ console.log(mc.campoArquivo(claim.arquivo));
1425
+ console.log(mc.campoAlegacao(claim.alegacao));
1426
+ console.log(mc.campoNegativa(claim.negativa));
1427
+ console.log(mc.campoVerificar(claim.verificar.join(' && ')));
1428
+ console.log(mc.campoEstado(mc.estado(claim.estado)));
1359
1429
  if (claim.negativa && claim.verificar.length === 0) {
1360
1430
  console.log('');
1361
- console.log('AVISO: alegacao negativa sem comando de verificacao reprova em `ork verify`.');
1431
+ console.log(mc.avisoNegativa);
1362
1432
  }
1363
1433
  // RM-008 (B8): a conferencia local da policy claim_sem_prova_local avisa e segue.
1364
1434
  const linhasDePolicy = (0, policies_1.linhasDeAviso)(claim.avisosDePolicy ?? []);
@@ -1370,7 +1440,7 @@ function comandoClaims(args) {
1370
1440
  // I-53 (RM-037, P6): o lint avisa aqui; a suite inteira e recusada no `ci prepare`.
1371
1441
  for (const a of claim.lint ?? []) {
1372
1442
  console.log('');
1373
- console.log(`AVISO: ${(0, claim_lint_1.linhaDoLintDeClaim)(claim.id, a)}${a.regra === 'suite-inteira' ? '. O `ci prepare` recusa esta claim.' : ''}`);
1443
+ console.log(mc.avisoDoLint((0, claim_lint_1.linhaDoLintDeClaim)(claim.id, a), a.regra === 'suite-inteira'));
1374
1444
  }
1375
1445
  return 0;
1376
1446
  }
@@ -1383,18 +1453,19 @@ function comandoClaims(args) {
1383
1453
  const prazo = texto(args.opcoes.prazo);
1384
1454
  const semValor = ['claims', 'tarefa', 'prazo'].some((o) => args.opcoes[o] === true);
1385
1455
  if (!id || semValor || (claims === undefined) === (tarefa === undefined)) {
1386
- console.error('uso: ork claims conferir <thread-id> --claims C1,C2 | --tarefa T1 [--prazo S] [--json]');
1456
+ console.error(mc.usoConferir);
1387
1457
  return 2;
1388
1458
  }
1389
1459
  const conducao = conducaoDoCli(args);
1390
1460
  try {
1391
- const r = (0, claims_conferir_1.conferirClaims)(carregado, id, {
1461
+ // O resultado e as recusas nascem em pt-BR, como o --json os leva; o texto os remonta no locale do comando.
1462
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, claims_conferir_1.conferirClaims)(carregado, id, {
1392
1463
  claims: claims !== undefined ? (0, claims_conferir_1.idsDeClaims)(claims) : undefined,
1393
1464
  tarefa,
1394
1465
  prazoMs: prazo !== undefined ? Number(prazo) * 1000 : undefined,
1395
1466
  canal: conducao.canal,
1396
1467
  correlacao: conducao.correlacao,
1397
- });
1468
+ }));
1398
1469
  console.log(json ? JSON.stringify(r, null, 2) : (0, claims_conferir_1.textoDaConferencia)(r));
1399
1470
  return r.ok ? 0 : 1;
1400
1471
  }
@@ -1404,7 +1475,7 @@ function comandoClaims(args) {
1404
1475
  if (json)
1405
1476
  console.log(JSON.stringify({ formato: claims_conferir_1.FORMATO_DA_CONFERENCIA, thread: id, ok: false, erro: e.message }, null, 2));
1406
1477
  else
1407
- console.error(e.message);
1478
+ console.error((0, locale_1.mensagemDoErro)(e));
1408
1479
  return 2;
1409
1480
  }
1410
1481
  }
@@ -1413,15 +1484,15 @@ function comandoClaims(args) {
1413
1484
  const claimId = args.posicionais[3];
1414
1485
  const comando = texto(args.opcoes.comando) ?? texto(args.opcoes.verificar);
1415
1486
  if (!id || !claimId || !comando) {
1416
- console.error('uso: ork claims verificar <thread-id> <claim-id> --comando "<comando>"');
1487
+ console.error(mc.usoVerificar);
1417
1488
  return 2;
1418
1489
  }
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}`);
1490
+ const claim = (0, locale_1.comLocale)('pt-BR', () => (0, claims_1.anexarComando)(carregado.raiz, id, claimId, comando));
1491
+ console.log(mc.comandoAnexado(claim.id));
1492
+ console.log(mc.campoVerificar(claim.verificar.join(' && ')));
1493
+ console.log(mc.campoEstado(mc.estado(claim.estado)));
1423
1494
  console.log('');
1424
- console.log(`Prove agora: ork verify ${id}`);
1495
+ console.log(mc.proveAgora(id));
1425
1496
  return 0;
1426
1497
  }
1427
1498
  if (sub === 'retirar') {
@@ -1429,14 +1500,14 @@ function comandoClaims(args) {
1429
1500
  const claimId = args.posicionais[3];
1430
1501
  const motivo = texto(args.opcoes.motivo);
1431
1502
  if (!id || !claimId || !motivo) {
1432
- console.error('uso: ork claims retirar <thread-id> <claim-id> --motivo "<motivo>"');
1503
+ console.error(mc.usoRetirar);
1433
1504
  return 2;
1434
1505
  }
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.');
1506
+ const claim = (0, locale_1.comLocale)('pt-BR', () => (0, claims_1.retirarClaim)(carregado.raiz, id, claimId, motivo));
1507
+ console.log(mc.retirada(claim.id, id));
1508
+ console.log(mc.campoAlegacao(claim.alegacao));
1509
+ console.log(mc.campoMotivo(motivo));
1510
+ console.log(mc.historicoContinua);
1440
1511
  return 0;
1441
1512
  }
1442
1513
  if (sub === 'ausente') {
@@ -1444,24 +1515,24 @@ function comandoClaims(args) {
1444
1515
  const paths = (texto(args.opcoes.paths) ?? '').split(',').map((p) => p.trim()).filter(Boolean);
1445
1516
  const motivo = texto(args.opcoes.motivo);
1446
1517
  if (!id || paths.length === 0 || !motivo) {
1447
- console.error('uso: ork claims ausente <thread-id> --paths A,B --motivo "<motivo>" [--commit SHA]');
1518
+ console.error(mc.usoAusente);
1448
1519
  return 2;
1449
1520
  }
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}`);
1521
+ (0, locale_1.comLocale)('pt-BR', () => (0, prova_minima_1.registrarProvaAusente)(carregado.raiz, id, { paths, motivo, commit: texto(args.opcoes.commit) }));
1522
+ console.log(mc.ausenciaRegistrada(id, paths.join(', ')));
1523
+ console.log(mc.campoMotivo(motivo));
1453
1524
  return 0;
1454
1525
  }
1455
1526
  if (sub === 'list' || sub === undefined) {
1456
1527
  const id = args.posicionais[2];
1457
1528
  if (!id) {
1458
- console.error('uso: ork claims list <thread-id>');
1529
+ console.error(mc.usoList);
1459
1530
  return 2;
1460
1531
  }
1461
1532
  console.log((0, claims_1.tabelaDeClaims)(carregado.raiz, id));
1462
1533
  return 0;
1463
1534
  }
1464
- console.error(`subcomando desconhecido: claims ${sub}`);
1535
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('claims', sub));
1465
1536
  return 2;
1466
1537
  }
1467
1538
  function comandoVerify(args) {
@@ -1472,6 +1543,13 @@ function comandoVerify(args) {
1472
1543
  console.error(m.uso);
1473
1544
  return 2;
1474
1545
  }
1546
+ // RM-072 (D1): `--check classic|agile` vence o `check.mode` do manifesto; outro valor sai com 2 e os dois aceitos.
1547
+ const brutoDoCheck = args.opcoes.check;
1548
+ const check = brutoDoCheck === undefined ? undefined : (0, check_modo_1.lerModo)(brutoDoCheck);
1549
+ if (check === null) {
1550
+ console.error(m.checkInvalido(typeof brutoDoCheck === 'string' ? brutoDoCheck : null));
1551
+ return 2;
1552
+ }
1475
1553
  // RM-058 N2 (D10): enquanto a fila de recursos pesados nao da a vez, o CLI diz uma vez por quem espera.
1476
1554
  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
1555
  const doCli = conducaoDoCli(args);
@@ -1480,12 +1558,12 @@ function comandoVerify(args) {
1480
1558
  comandoDeEsperar: `ork verify ${id}${args.opcoes.baseline === true ? ' --baseline' : ''} --esperar 120` } };
1481
1559
  if (args.opcoes.baseline === true) {
1482
1560
  // 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));
1561
+ const b = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.gravarBaseline)(carregado, id, undefined, conducao, 'cli', undefined, check));
1484
1562
  console.log(m.baselineGravada(id));
1485
1563
  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
- }
1564
+ // RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito nao sai como "ja falhava".
1565
+ for (const linha of (0, verify_1.linhasDaBaseline)(b, id))
1566
+ console.log(linha);
1489
1567
  if (b.comandos.some((c) => !c.ok)) {
1490
1568
  // Ensaio de 03/10 (R7): "ja falhava" sem dizer onde ver a saida do comando.
1491
1569
  console.log(m.baselineSaida((0, thread_1.caminhoThread)(carregado.raiz, id), id));
@@ -1496,7 +1574,7 @@ function comandoVerify(args) {
1496
1574
  }
1497
1575
  return 0;
1498
1576
  }
1499
- const r = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao }));
1577
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao, check }));
1500
1578
  console.log((0, verify_1.textoDoVerify)(r));
1501
1579
  return r.ok ? 0 : 1;
1502
1580
  }
@@ -1510,6 +1588,7 @@ function comandoVerify(args) {
1510
1588
  * `status --json` para ceder o despacho enquanto a presenca vale. Nada aqui despacha.
1511
1589
  */
1512
1590
  function comandoSentinela(carregado, args) {
1591
+ const m = (0, locale_1.msg)().conducao.cli;
1513
1592
  const acao = args.posicionais[2] ?? 'status';
1514
1593
  const json = args.opcoes.json === true;
1515
1594
  if (acao === 'status') {
@@ -1518,34 +1597,101 @@ function comandoSentinela(carregado, args) {
1518
1597
  return 0;
1519
1598
  }
1520
1599
  if (acao !== 'bater' && acao !== 'desligar')
1521
- throw new Error('uso: ork conducao sentinela status|bater|desligar [--sessao <id>] [--json]');
1600
+ throw new Error(m.sentinelaUso);
1522
1601
  const sessao = texto(args.opcoes.sessao);
1523
1602
  if (!sessao)
1524
- throw new Error(`uso: ork conducao sentinela ${acao} --sessao <id> [--json]`);
1603
+ throw new Error(m.sentinelaSessao(acao));
1525
1604
  if (acao === 'bater') {
1526
1605
  const r = (0, conducao_sentinela_1.baterSentinela)(carregado.raiz, { sessao });
1527
1606
  const curta = r.presenca.sessao.slice(0, 8);
1528
1607
  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.`);
1608
+ ? m.sentinelaLigada(r.ligou, r.presenca.maquina, curta)
1609
+ : m.sentinelaOutra(curta, r.presenca.maquina));
1531
1610
  return r.ok ? 0 : 3;
1532
1611
  }
1533
1612
  const motivo = texto(args.opcoes.motivo);
1534
1613
  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.');
1614
+ console.log(json ? JSON.stringify(r, null, 2) : r.desligada ? m.sentinelaOff : m.sentinelaNada);
1615
+ return 0;
1616
+ }
1617
+ /**
1618
+ * RM-063 (F7): `ork conducao autorizar|autorizacao`. A autorizacao duravel do dono nesta maquina
1619
+ * (`ork.autorizacao-duravel/v1`, fora do git): o que a batida da conducao pode fazer sozinha e ate quando.
1620
+ */
1621
+ function comandoAutorizacao(carregado, args, sub) {
1622
+ const m = (0, locale_1.msg)().conducao.cli;
1623
+ const json = args.opcoes.json === true;
1624
+ const projeto = carregado.manifesto.project.name;
1625
+ if (sub === 'autorizacao') {
1626
+ if (args.posicionais.length > 2)
1627
+ throw new Error(m.autorizacaoUso);
1628
+ const leitura = (0, autorizacao_duravel_1.lerAutorizacao)(carregado.raiz, { projeto });
1629
+ console.log(json ? JSON.stringify(leitura, null, 2) : (0, autorizacao_duravel_1.textoDaAutorizacao)(leitura));
1630
+ return 0;
1631
+ }
1632
+ const ate = texto(args.opcoes.ate), pode = texto(args.opcoes.pode);
1633
+ if (!ate || !pode || args.posicionais.length > 2) {
1634
+ throw new Error(m.autorizarUso);
1635
+ }
1636
+ const r = (0, autorizacao_duravel_1.gravarAutorizacao)(carregado.raiz, { ate, pode, por: texto(args.opcoes.por), nota: texto(args.opcoes.nota), projeto,
1637
+ fuso: (0, horario_1.fusoDoManifesto)(carregado).fuso, canal: conducaoDoCli(args).canal });
1638
+ if (!r.ok) {
1639
+ console.log(json ? JSON.stringify(r, null, 2) : m.autorizacaoRecusada(r.motivo, r.detalhe));
1640
+ return 1;
1641
+ }
1642
+ const a = r.anterior;
1643
+ console.log(json ? JSON.stringify({ ok: true, leitura: r.leitura, anterior: a }, null, 2) : [
1644
+ m.autorizacaoGravada((0, autorizacao_duravel_1.linhaDaAutorizacao)(r.leitura)),
1645
+ ...(a ? [m.substitui(a.por, (0, horario_1.formatarDataHoraRotulada)(a.ate), a.pode.join(', '))] : []),
1646
+ m.arquivo(r.leitura.arquivo)
1647
+ ].join('\n'));
1538
1648
  return 0;
1539
1649
  }
1540
1650
  function comandoConducao(args) {
1541
1651
  const carregado = (0, manifest_1.exigirManifesto)();
1652
+ const m = (0, locale_1.msg)().conducao.cli;
1542
1653
  const sub = args.posicionais[1];
1543
1654
  const id = args.posicionais[2];
1544
1655
  if (sub === 'sentinela')
1545
1656
  return comandoSentinela(carregado, args);
1657
+ if (sub === 'autorizar' || sub === 'autorizacao')
1658
+ return comandoAutorizacao(carregado, args, sub);
1659
+ if (sub === 'batida') {
1660
+ // RM-063 (F7): o passo deterministico da conducao, o mesmo que a varredura do cron roda depois do resumo.
1661
+ if (args.posicionais.length > 2)
1662
+ throw new Error(m.batidaUso);
1663
+ const r = (0, conducao_batida_1.baterConducao)(carregado, { canal: conducaoDoCli(args).canal });
1664
+ const textoDaRodada = (0, conducao_batida_1.textoDaBatida)(r);
1665
+ console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : textoDaRodada);
1666
+ // RM-063 (H2): o `#OrkRetomar` do canal roda esta batida em segundo plano; o que voltou a andar volta ao dono pelo
1667
+ // transporte do pulse (com o outro host configurado, se o primeiro falhar).
1668
+ if (args.opcoes.entregar === true) {
1669
+ const mensagem = `🔁 Orkastery, retomada em ${(0, maquina_1.nomeDaMaquina)()}:\n${textoDaRodada}`.slice(0, 3900);
1670
+ try {
1671
+ const e = (0, pulse_delivery_1.entregarPeloTransporte)(carregado.raiz, mensagem, { oQue: 'a retomada' });
1672
+ if (!e.ok)
1673
+ console.error(m.pulseAviso);
1674
+ }
1675
+ catch (e) {
1676
+ console.error(m.pulseFalha(e.message));
1677
+ }
1678
+ }
1679
+ return r.ocupada ? 3 : 0;
1680
+ }
1681
+ if (sub === 'atualizar') {
1682
+ // RM-063 (F7): o merge da base remota na branch da thread, com a reconciliacao do CHANGELOG; conflito em codigo aborta.
1683
+ if (!id || args.posicionais.length > 3)
1684
+ throw new Error(m.atualizarUso);
1685
+ (0, thread_1.lerThread)(carregado.raiz, id);
1686
+ const doCli = conducaoDoCli(args);
1687
+ const r = (0, atualizar_branch_1.atualizarBranchDaThread)(carregado, id, { enviar: args.opcoes.enviar === true, canal: doCli.canal, correlacao: doCli.correlacao,
1688
+ ...(doCli.esperarMs ? { esperarMs: doCli.esperarMs } : {}) });
1689
+ console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, atualizar_branch_1.textoDaAtualizacao)(r));
1690
+ return r.acao === 'mesclada' || r.acao === 'ja-atualizada' ? 0 : r.acao === 'recusada' && r.motivo === 'conduzida' ? 3 : 1;
1691
+ }
1546
1692
  if (sub === 'status') {
1547
1693
  if (!id)
1548
- throw new Error('uso: ork conducao status <thread-id> [--json]');
1694
+ throw new Error(m.statusUso);
1549
1695
  (0, thread_1.lerThread)(carregado.raiz, id);
1550
1696
  (0, conducao_1.liberarSeOrfa)(carregado.raiz, id);
1551
1697
  const atual = (0, conducao_1.conducaoDaThread)(carregado.raiz, id);
@@ -1555,12 +1701,12 @@ function comandoConducao(args) {
1555
1701
  if (sub === 'assumir') {
1556
1702
  const por = texto(args.opcoes.por), motivo = texto(args.opcoes.motivo);
1557
1703
  if (!id || !por || !motivo)
1558
- throw new Error('uso: ork conducao assumir <thread-id> --por <quem> --motivo "<por que>" [--canal C]');
1704
+ throw new Error(m.assumirUso);
1559
1705
  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}`);
1706
+ console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : m.assumida(r.ok, r.detalhe));
1561
1707
  return r.ok ? 0 : 3;
1562
1708
  }
1563
- throw new Error('uso: ork conducao status|assumir <thread-id> | ork conducao sentinela status|bater|desligar');
1709
+ throw new Error(m.uso);
1564
1710
  }
1565
1711
  /** RM-048 (D1): o gate aberto no contrato curto, com o codigo estavel e o "desde" do ledger. */
1566
1712
  function textoDoGateCurto(raiz, pedido, canal) {
@@ -1573,11 +1719,12 @@ function textoDoGateCurto(raiz, pedido, canal) {
1573
1719
  function comandoGate(args) {
1574
1720
  const carregado = (0, manifest_1.exigirManifesto)();
1575
1721
  const sub = args.posicionais[1];
1722
+ const mg = (0, locale_1.msg)().operacao.restante.gate;
1576
1723
  if (sub === 'context') {
1577
1724
  const id = args.posicionais[2], pedido = args.posicionais[3];
1578
1725
  if (!id || !pedido || args.posicionais.length !== 4 ||
1579
1726
  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]');
1727
+ throw Error(mg.usoContext);
1581
1728
  const view = (0, hitl_gates_1.contextoDoPedidoNativo)(carregado.raiz, id, pedido);
1582
1729
  const callback = args.opcoes['native-offer-stdin'] ? (0, hitl_native_offer_1.readNativeOfferStdin)() : undefined;
1583
1730
  console.log(JSON.stringify({ ...view, canais: (0, hitl_presentation_1.ofertaDoPedido)(view.pedido, [], callback === undefined ? undefined : { callback, raiz: carregado.raiz }),
@@ -1587,10 +1734,10 @@ function comandoGate(args) {
1587
1734
  if (sub === 'request') {
1588
1735
  const id = args.posicionais[2];
1589
1736
  if (!id)
1590
- throw new Error('gate request exige thread');
1737
+ throw new Error(mg.requestThread);
1591
1738
  const formato = texto(args.opcoes.formato);
1592
1739
  if (formato !== undefined && formato !== 'telegram' && formato !== 'terminal')
1593
- throw new Error('gate request: --formato telegram|terminal');
1740
+ throw new Error(mg.formato);
1594
1741
  const pedido = (0, hitl_gates_1.abrirPedidoGate)(carregado.raiz, id, texto(args.opcoes.motivo));
1595
1742
  // RM-048 (D1): com --formato, o que sai e o pedido no contrato curto, pronto para o canal, com
1596
1743
  // o codigo estavel na ultima linha. Sem ele, o JSON de sempre, para quem integra.
@@ -1600,7 +1747,7 @@ function comandoGate(args) {
1600
1747
  if (sub === 'answer') {
1601
1748
  const id = args.posicionais[2], pedido = args.posicionais[3];
1602
1749
  if (!id || !pedido || args.opcoes['resposta-stdin'] !== true || args.opcoes.resposta !== undefined)
1603
- throw new Error('gate answer exige thread, pedido e --resposta-stdin');
1750
+ throw new Error(mg.answer);
1604
1751
  const r = (0, hitl_gates_1.lerRespostaStdin)({ por: texto(args.opcoes.por), mensagem: texto(args.opcoes.mensagem),
1605
1752
  origem: texto(args.opcoes.origem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
1606
1753
  console.log(JSON.stringify((0, hitl_gates_1.responderGate)(carregado.raiz, id, pedido, r)));
@@ -1609,7 +1756,7 @@ function comandoGate(args) {
1609
1756
  if (sub === 'next') {
1610
1757
  const id = args.posicionais[2];
1611
1758
  if (!id) {
1612
- console.error('uso: ork gate next <thread-id> [--proximo FASE] [--ocupacao 0..1]');
1759
+ console.error(mg.usoNext);
1613
1760
  return 2;
1614
1761
  }
1615
1762
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
@@ -1633,18 +1780,18 @@ function comandoGate(args) {
1633
1780
  const sobre = args.posicionais[3];
1634
1781
  const por = texto(args.opcoes.por) ?? texto(args.opcoes.quem);
1635
1782
  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.');
1783
+ console.error(mg.approveAposentado);
1637
1784
  return 2;
1638
1785
  }
1639
1786
  (0, thread_1.lerThread)(carregado.raiz, id);
1640
1787
  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)}`);
1788
+ console.log(mg.registrado(id));
1789
+ console.log(mg.sobre(sobre));
1790
+ console.log(mg.autorizado(por));
1791
+ console.log(mg.quando((0, horario_1.formatarDataHoraRotulada)(e.ts)));
1645
1792
  return 0;
1646
1793
  }
1647
- console.error(`subcomando desconhecido: gate ${sub}`);
1794
+ console.error(mg.desconhecido(sub));
1648
1795
  return 2;
1649
1796
  }
1650
1797
  /**
@@ -1656,44 +1803,44 @@ function comandoGate(args) {
1656
1803
  */
1657
1804
  function comandoRetry(args) {
1658
1805
  const sub = args.posicionais[1];
1806
+ const mr = (0, locale_1.msg)().retry, mc = mr.complementar;
1659
1807
  if (sub === 'policy') {
1660
1808
  const alvo = texto(args.opcoes.motivo);
1661
1809
  if (alvo) {
1662
1810
  const politica = retry_1.POLITICA_DE_RETRY[alvo];
1663
1811
  if (!politica) {
1664
- console.error(`motivo tipado desconhecido: ${alvo}`);
1665
- console.error(` conhecidos: ${Object.keys(retry_1.POLITICA_DE_RETRY).join(', ')}`);
1812
+ console.error(mc.motivoDesconhecido(alvo));
1813
+ console.error(mc.conhecidos(Object.keys(retry_1.POLITICA_DE_RETRY).join(', ')));
1666
1814
  return 2;
1667
1815
  }
1668
1816
  if (args.opcoes.json === true) {
1669
1817
  console.log(JSON.stringify(politica, null, 2));
1670
1818
  return 0;
1671
1819
  }
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}`);
1820
+ console.log(mc.motivo(politica.motivo));
1821
+ console.log(mc.significado((0, locale_1.localeAtivo)() === 'en' ? mr.politica[politica.motivo].porque : auditoria_1.DESCRICAO_DO_MOTIVO_DE_AUDITORIA[politica.motivo]));
1822
+ console.log(mc.acao(politica.acao));
1823
+ console.log(mc.automatica(politica.automatica ? mc.sim : mc.nao));
1824
+ console.log(mc.porque(mr.politica[politica.motivo].porque));
1825
+ console.log(mc.correcao(mr.politica[politica.motivo].correcao));
1678
1826
  return 0;
1679
1827
  }
1680
1828
  if (args.opcoes.json === true) {
1681
1829
  console.log(JSON.stringify(Object.values(retry_1.POLITICA_DE_RETRY), null, 2));
1682
1830
  return 0;
1683
1831
  }
1684
- console.log('Politica de retry por motivo tipado de gate (bloco B3)');
1832
+ console.log(mc.politicaTitulo);
1685
1833
  console.log('');
1686
1834
  console.log((0, retry_1.tabelaDaPolitica)());
1687
1835
  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.');
1836
+ for (const linha of mc.politicaFecho)
1837
+ console.log(linha);
1691
1838
  return 0;
1692
1839
  }
1693
1840
  if (sub === 'parse') {
1694
1841
  const bruto = texto(args.opcoes.stderr) ?? args.posicionais.slice(2).join(' ');
1695
1842
  if (!bruto) {
1696
- console.error('uso: ork retry parse --stderr "<texto do stderr do adapter>"');
1843
+ console.error(mc.usoParse);
1697
1844
  return 2;
1698
1845
  }
1699
1846
  const sinal = (0, ratelimit_1.parseRateLimit)(bruto);
@@ -1702,17 +1849,17 @@ function comandoRetry(args) {
1702
1849
  return sinal ? 0 : 1;
1703
1850
  }
1704
1851
  if (!sinal) {
1705
- console.log('Nenhum sinal de rate limit reconhecido neste texto.');
1852
+ console.log(mc.semSinal);
1706
1853
  return 1;
1707
1854
  }
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}`);
1855
+ console.log(mc.sinal);
1856
+ console.log(mc.fonte(sinal.fonte));
1857
+ console.log(mc.reset(sinal.resetEm ? (0, horario_1.formatarDataHoraRotulada)(sinal.resetEm) : mc.semHora));
1858
+ console.log(mc.trecho(sinal.trecho));
1712
1859
  if (sinal.resetEm === null) {
1713
1860
  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.');
1861
+ for (const linha of mc.estimada)
1862
+ console.log(linha);
1716
1863
  }
1717
1864
  return 0;
1718
1865
  }
@@ -1769,8 +1916,8 @@ function comandoRetry(args) {
1769
1916
  const espera = (0, ratelimit_1.lerFilaDeRetomada)(carregado.raiz).filter((p) => p.estado === 'aguardando');
1770
1917
  if (espera.length > 0) {
1771
1918
  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');
1919
+ console.log(mc.proxima((0, horario_1.formatarDataHora)(espera[0].liberaEm), (0, ratelimit_1.faltaPara)(espera[0])));
1920
+ console.log(mc.retome);
1774
1921
  }
1775
1922
  return 0;
1776
1923
  }
@@ -1800,17 +1947,17 @@ function comandoRetry(args) {
1800
1947
  const idPedido = args.posicionais[2];
1801
1948
  const motivo = texto(args.opcoes.motivo);
1802
1949
  if (!idPedido || !motivo) {
1803
- console.error('uso: ork retry cancel <id> --motivo "<motivo>"');
1950
+ console.error(mc.usoCancel);
1804
1951
  return 2;
1805
1952
  }
1806
1953
  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}`);
1954
+ console.log(mc.cancelado(p.id));
1955
+ console.log(mc.thread(p.thread));
1956
+ console.log(mc.fase(p.fase));
1957
+ console.log(mc.motivoLinha(motivo));
1811
1958
  return 0;
1812
1959
  }
1813
- console.error(`subcomando desconhecido: retry ${sub ?? ''}`);
1960
+ console.error(mc.desconhecido(sub ?? ''));
1814
1961
  return 2;
1815
1962
  }
1816
1963
  /**
@@ -1824,15 +1971,16 @@ function comandoFix(args) {
1824
1971
  const carregado = (0, manifest_1.exigirManifesto)();
1825
1972
  const sub = args.posicionais[1];
1826
1973
  const id = args.posicionais[2];
1974
+ const mf = (0, locale_1.msg)().operacao.restante.fix;
1827
1975
  if (sub === 'open') {
1828
1976
  if (!id) {
1829
- console.error('uso: ork fix open <thread-id> [--so-claims] [--reverify]');
1977
+ console.error(mf.usoOpen);
1830
1978
  return 2;
1831
1979
  }
1832
1980
  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 });
1981
+ const rodada = (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.abrirRodada)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao }));
1834
1982
  const reverify = args.opcoes.reverify === true && rodada.correcoes.length > 0
1835
- ? (0, fix_1.reverificar)(carregado, id, { rodada: rodada.rodada, conducao })
1983
+ ? (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.reverificar)(carregado, id, { rodada: rodada.rodada, conducao }))
1836
1984
  : null;
1837
1985
  if (args.opcoes.json === true) {
1838
1986
  console.log(JSON.stringify({ rodada, reverify }, null, 2));
@@ -1850,14 +1998,14 @@ function comandoFix(args) {
1850
1998
  }
1851
1999
  if (sub === 'list') {
1852
2000
  if (!id) {
1853
- console.error('uso: ork fix list <thread-id> [--rodada N]');
2001
+ console.error(mf.usoList);
1854
2002
  return 2;
1855
2003
  }
1856
2004
  (0, thread_1.lerThread)(carregado.raiz, id);
1857
2005
  const rodadaBruta = texto(args.opcoes.rodada);
1858
2006
  const rodada = rodadaBruta ? Number(rodadaBruta) : (0, fix_1.ultimaRodada)(carregado.raiz, id);
1859
2007
  if (rodada === 0) {
1860
- console.log(`A thread ${id} nao tem rodada de GO-FIX. Abra com: ork fix open ${id}`);
2008
+ console.log(mf.semRodada(id));
1861
2009
  return 0;
1862
2010
  }
1863
2011
  const correcoes = (0, fix_1.correcoesDaRodada)(carregado.raiz, id, rodada);
@@ -1865,29 +2013,29 @@ function comandoFix(args) {
1865
2013
  console.log(JSON.stringify(correcoes, null, 2));
1866
2014
  return 0;
1867
2015
  }
1868
- console.log(`Correcoes da rodada ${rodada} da thread ${id}`);
2016
+ console.log(mf.lista(rodada, id));
1869
2017
  console.log('');
1870
- console.log((0, util_1.tabela)(['ID', 'TIPO', 'MOTIVO', 'ALVO', 'ESTADO', 'JULGADO POR'], correcoes.map((c) => [
2018
+ console.log((0, util_1.tabela)([...mf.colunasLista], correcoes.map((c) => [
1871
2019
  c.id,
1872
2020
  c.tipo,
1873
2021
  c.origem,
1874
2022
  c.alvo,
1875
2023
  c.estado,
1876
- c.verificar.join(' && ') || '(verify completo)',
2024
+ c.verificar.join(' && ') || mf.verifyCompleto,
1877
2025
  ])));
1878
2026
  return 0;
1879
2027
  }
1880
2028
  if (sub === 'reverify') {
1881
2029
  if (!id) {
1882
- console.error('uso: ork fix reverify <thread-id> [--rodada N] [--parcial]');
2030
+ console.error(mf.usoReverify);
1883
2031
  return 2;
1884
2032
  }
1885
2033
  const rodadaBruta = texto(args.opcoes.rodada);
1886
- const r = (0, fix_1.reverificar)(carregado, id, {
2034
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, fix_1.reverificar)(carregado, id, {
1887
2035
  conducao: { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix reverify ${id} --esperar 30`) },
1888
2036
  rodada: rodadaBruta ? Number(rodadaBruta) : undefined,
1889
2037
  parcial: args.opcoes.parcial === true,
1890
- });
2038
+ }));
1891
2039
  if (args.opcoes.json === true) {
1892
2040
  console.log(JSON.stringify(r, null, 2));
1893
2041
  }
@@ -1896,45 +2044,46 @@ function comandoFix(args) {
1896
2044
  }
1897
2045
  return r.veredito === 'PASSOU' ? 0 : 1;
1898
2046
  }
1899
- console.error(`subcomando desconhecido: fix ${sub ?? ''}`);
2047
+ console.error(mf.desconhecido(sub ?? ''));
1900
2048
  return 2;
1901
2049
  }
1902
2050
  function comandoHandoff(args) {
1903
2051
  const carregado = (0, manifest_1.exigirManifesto)();
1904
2052
  const sub = args.posicionais[1];
1905
2053
  const id = args.posicionais[2];
2054
+ const mh = (0, locale_1.msg)().operacao.restante.handoff;
1906
2055
  if (sub === 'export') {
1907
2056
  if (!id) {
1908
- console.error('uso: ork handoff export <thread-id> [--proxima-fase FASE]');
2057
+ console.error(mh.usoExport);
1909
2058
  return 2;
1910
2059
  }
1911
2060
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
1912
2061
  const faseBruta = texto(args.opcoes['proxima-fase']) ?? texto(args.opcoes.fase);
1913
- const r = (0, handoff_1.exportarHandoff)(carregado, id, {
2062
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, handoff_1.exportarHandoff)(carregado, id, {
1914
2063
  proximaFase: faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined,
1915
2064
  slugDestino: texto(args.opcoes.slug),
1916
- });
2065
+ }));
1917
2066
  console.log((0, handoff_1.textoDoHandoff)(r.handoff, r.caminho));
1918
2067
  console.log('');
1919
- console.log(`Historico: ${r.caminhoHistorico}`);
2068
+ console.log(mh.historico(r.caminhoHistorico));
1920
2069
  return 0;
1921
2070
  }
1922
2071
  if (sub === 'recall') {
1923
2072
  const ponteiro = args.posicionais[3];
1924
2073
  if (!id || !ponteiro) {
1925
- console.error('uso: ork handoff recall <thread-id> <path#ancora>');
2074
+ console.error(mh.usoRecall);
1926
2075
  return 2;
1927
2076
  }
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)'}`);
2077
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, handoff_1.recall)(carregado, id, ponteiro));
2078
+ console.log(mh.resolvido(r.location));
2079
+ console.log(mh.metodo(r.metodo));
2080
+ console.log(mh.sha(r.sha256));
2081
+ console.log(mh.linhas(r.intervalo ? `${r.intervalo.inicio}-${r.intervalo.fim}` : mh.naoAplicavel));
1933
2082
  console.log('');
1934
2083
  console.log(r.conteudo);
1935
2084
  return 0;
1936
2085
  }
1937
- console.error(`subcomando desconhecido: handoff ${sub}`);
2086
+ console.error(mh.desconhecido(sub));
1938
2087
  return 2;
1939
2088
  }
1940
2089
  /**
@@ -2024,7 +2173,7 @@ function comandoShip(args) {
2024
2173
  const dryRun = args.opcoes['dry-run'] === true;
2025
2174
  // RM-061 (F2b, G2): o ship_done e o motivo nascem em pt-BR; so a impressao segue o locale.
2026
2175
  const r = (0, locale_1.comLocale)('pt-BR', () => alvo && repo
2027
- ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun })]
2176
+ ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun, remoto })]
2028
2177
  : alvo ? [(0, entrega_pr_1.registrarEntregaPorPr)(carregado, alvo, { remoto, dryRun })] : (0, entrega_pr_1.registrarEntregasPorPr)(carregado, { remoto, dryRun }));
2029
2178
  if (args.opcoes.json === true) {
2030
2179
  console.log(JSON.stringify(r, null, 2));
@@ -2074,6 +2223,12 @@ function comandoShip(args) {
2074
2223
  if (args.opcoes.remoto !== undefined)
2075
2224
  (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
2076
2225
  const autorizar = args.opcoes['autorizar-push'];
2226
+ // Security scan: `--allow-unscanned` exige quem autoriza; sem valor nao vira autorizacao em silencio.
2227
+ const semScan = args.opcoes['allow-unscanned'];
2228
+ if (semScan !== undefined && (typeof semScan !== 'string' || !semScan.trim())) {
2229
+ console.error(m.allowUnscannedSemValor);
2230
+ return 2;
2231
+ }
2077
2232
  // RM-061 (F2b, G2): o que o ship grava (ledger, verificacao, mensagem do merge) nasce em pt-BR.
2078
2233
  const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_1.ship)(carregado, id, {
2079
2234
  para,
@@ -2082,6 +2237,7 @@ function comandoShip(args) {
2082
2237
  mensagem: texto(args.opcoes.mensagem),
2083
2238
  dryRun: args.opcoes['dry-run'] === true,
2084
2239
  autorizarPush: typeof autorizar === 'string' ? autorizar : undefined,
2240
+ allowUnscanned: typeof semScan === 'string' ? semScan.trim() : undefined,
2085
2241
  semPush: args.opcoes['sem-push'] === true,
2086
2242
  // RM-058 N2 (A1 da rodada 2 do CHECK): o `--esperar` chega à fila pesada da verificação do ship, com aviso.
2087
2243
  ...((f) => ({ esperarFilaPesadaMs: f.esperarMs, avisoDaFilaPesada: { aoEsperar: f.aoEsperar, comandoDeEsperar: f.comandoDeEsperar } }))(filaPesadaDoCli(args, 'verify', `ork ship ${id} --para ${para} --esperar 30`)),
@@ -2097,21 +2253,17 @@ function comandoShip(args) {
2097
2253
  */
2098
2254
  const SOBRAS_DO_OBJECTIVE = ['constraints', 'outcomes', 'threads', 'execution-runtime', 'validation-runtimes'];
2099
2255
  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');
2256
+ console.error((0, locale_1.msg)().operacao.produto.portfolio.opcaoAposentada(opcao));
2106
2257
  return 2;
2107
2258
  }
2108
2259
  function comandoPortfolio(args) {
2109
2260
  const root = (0, manifest_1.exigirManifesto)().raiz;
2110
2261
  const sub = args.posicionais[1] ?? 'list';
2262
+ const m = (0, locale_1.msg)().operacao.produto.portfolio;
2111
2263
  if (sub === 'inspect') {
2112
2264
  const id = args.posicionais[2];
2113
2265
  if (!id) {
2114
- console.error('uso: ork portfolio inspect <id> --json');
2266
+ console.error(m.usoInspect);
2115
2267
  return 2;
2116
2268
  }
2117
2269
  console.log(JSON.stringify((0, portfolio_context_1.inspectPortfolio)(root, id), null, 2));
@@ -2123,12 +2275,12 @@ function comandoPortfolio(args) {
2123
2275
  const rawKind = args.posicionais[2];
2124
2276
  const kind = rawKind ? aliases[rawKind] : undefined;
2125
2277
  if (rawKind && !kind) {
2126
- console.error('tipo deve ser product, project ou initiative');
2278
+ console.error(m.tipo);
2127
2279
  return 2;
2128
2280
  }
2129
2281
  const items = (0, portfolio_1.listEntities)(root, kind, texto(args.opcoes.parent));
2130
2282
  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.');
2283
+ : items.length ? items.map((item) => `${item.id}\t${item.kind}\t${item.status}\t${item.title}`).join('\n') : m.vazio);
2132
2284
  return 0;
2133
2285
  }
2134
2286
  if (sub === 'show') {
@@ -2137,22 +2289,22 @@ function comandoPortfolio(args) {
2137
2289
  return recusarSobraDoObjective(sobra);
2138
2290
  const id = args.posicionais[2];
2139
2291
  if (!id) {
2140
- console.error('uso: ork portfolio show <id>');
2292
+ console.error(m.usoShow);
2141
2293
  return 2;
2142
2294
  }
2143
2295
  const item = (0, portfolio_1.findEntity)(root, id);
2144
2296
  if (!item) {
2145
- console.error(`entidade ${id} não encontrada`);
2297
+ console.error(m.naoEncontrada(id));
2146
2298
  return 1;
2147
2299
  }
2148
- console.log(args.opcoes.json === true ? JSON.stringify(item, null, 2) : `${item.id}\n${item.title}\nEstado: ${item.status}`);
2300
+ console.log(args.opcoes.json === true ? JSON.stringify(item, null, 2) : m.estado(item.id, item.title, item.status));
2149
2301
  return 0;
2150
2302
  }
2151
2303
  if (sub === 'create') {
2152
2304
  const kind = aliases[args.posicionais[2] ?? ''];
2153
2305
  const id = args.posicionais[3], title = texto(args.opcoes.title), parent = texto(args.opcoes.parent);
2154
2306
  if (!kind || !id || !title) {
2155
- console.error('uso: ork portfolio create <product|project|initiative> <id> --title T [--parent ID]');
2307
+ console.error(m.usoCreate);
2156
2308
  return 2;
2157
2309
  }
2158
2310
  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 +2314,7 @@ function comandoPortfolio(args) {
2162
2314
  console.log(JSON.stringify({ schema: 'ork.portfolio-created/v1', item }, null, 2));
2163
2315
  return 0;
2164
2316
  }
2165
- console.error(`subcomando desconhecido: portfolio ${sub}`);
2317
+ console.error(m.desconhecido(sub));
2166
2318
  return 2;
2167
2319
  }
2168
2320
  function comandoCreation(args) {
@@ -2171,8 +2323,9 @@ function comandoCreation(args) {
2171
2323
  // Fachadas HTTP devem usar a API com principal e authorize autenticados no servidor.
2172
2324
  const actor = { principal: `local:uid:${(0, node_os_1.userInfo)().uid}`, authorize: () => { } };
2173
2325
  const sub = args.posicionais[1], id = args.posicionais[2];
2326
+ const m = (0, locale_1.msg)().operacao.produto.creation;
2174
2327
  if (args.opcoes.principal !== undefined || args.opcoes.por !== undefined)
2175
- throw new Error('creation.identity: payload não escolhe principal');
2328
+ throw new Error(m.identidade);
2176
2329
  let result;
2177
2330
  if (sub === 'session') {
2178
2331
  const portfolio = (0, portfolio_1.readPortfolio)(loaded.raiz);
@@ -2186,18 +2339,18 @@ function comandoCreation(args) {
2186
2339
  else if (sub === 'start') {
2187
2340
  const file = texto(args.opcoes['input-file']);
2188
2341
  if (!file) {
2189
- console.error('uso: ork creation start --input-file F --json');
2342
+ console.error(m.usoStart);
2190
2343
  return 2;
2191
2344
  }
2192
2345
  const content = fs.readFileSync(file, 'utf8');
2193
2346
  if (Buffer.byteLength(content) > 100_000)
2194
- throw new Error('creation.input: arquivo excede limite');
2347
+ throw new Error(m.arquivoGrande);
2195
2348
  result = (0, creation_operation_1.startCreation)(loaded, actor, JSON.parse(content));
2196
2349
  }
2197
2350
  else if (sub === 'list')
2198
2351
  result = (0, creation_operation_store_1.listCreationOperations)(loaded.raiz, actor.principal);
2199
2352
  else if (!id) {
2200
- console.error('creation exige id');
2353
+ console.error(m.exigeId);
2201
2354
  return 2;
2202
2355
  }
2203
2356
  else if (sub === 'show' || sub === 'events') {
@@ -2207,13 +2360,13 @@ function comandoCreation(args) {
2207
2360
  else if (sub === 'resume' || sub === 'compensate') {
2208
2361
  const version = Number(texto(args.opcoes['expected-version']));
2209
2362
  if (!Number.isSafeInteger(version) || version < 1) {
2210
- console.error('creation exige --expected-version inteiro positivo');
2363
+ console.error(m.versao);
2211
2364
  return 2;
2212
2365
  }
2213
2366
  result = sub === 'resume' ? (0, creation_operation_1.resumeCreation)(loaded, actor, id, version) : (0, creation_operation_1.compensateCreation)(loaded, actor, id, version);
2214
2367
  }
2215
2368
  else {
2216
- console.error('subcomando creation desconhecido');
2369
+ console.error(m.desconhecido);
2217
2370
  return 2;
2218
2371
  }
2219
2372
  console.log(JSON.stringify(result, null, 2));
@@ -2239,28 +2392,33 @@ function comandoCreation(args) {
2239
2392
  */
2240
2393
  function comandoObjective(args) {
2241
2394
  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.');
2395
+ console.error((0, locale_1.msg)().operacao.produto.objective(sub));
2251
2396
  return 2;
2252
2397
  }
2253
2398
  function comandoCi(args) {
2254
2399
  const carregado = (0, manifest_1.exigirManifesto)();
2255
2400
  const sub = args.posicionais[1] ?? 'status';
2401
+ const m = (0, locale_1.msg)().operacao.produto.ci;
2256
2402
  if (sub === 'prepare') {
2257
2403
  const thread = args.posicionais[2];
2258
2404
  if (!thread) {
2259
- console.error('uso: ork ci prepare <thread-id>');
2405
+ console.error(m.usoPrepare);
2260
2406
  return 2;
2261
2407
  }
2262
- const arquivo = (0, ci_1.prepararBundleCi)(carregado, thread, { aoAvisar: (linha) => console.log(`AVISO: ${linha}`) });
2263
- console.log(`Bundle de CI: ${arquivo}`);
2408
+ // 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
2409
+ // lista (D2); o aviso sai remontado no locale do comando, e a recusa, pela entrada do CLI. As linhas da barreira de
2410
+ // dado privado (RM-062) saem junto com os avisos, na ordem em que nascem.
2411
+ const linhas = [];
2412
+ let arquivo;
2413
+ try {
2414
+ arquivo = (0, locale_1.comLocale)('pt-BR', () => (0, ci_1.prepararBundleCi)(carregado, thread, { aoAvisar: (linha) => linhas.push({ aviso: true, linha }),
2415
+ aoInformar: (linha) => linhas.push({ aviso: false, linha }) }));
2416
+ }
2417
+ finally {
2418
+ for (const { aviso, linha } of linhas)
2419
+ console.log(aviso ? m.aviso((0, locale_1.remontar)(linha)) : (0, locale_1.remontar)(linha));
2420
+ }
2421
+ console.log(m.bundle(arquivo));
2264
2422
  return 0;
2265
2423
  }
2266
2424
  if (sub === 'run') {
@@ -2279,34 +2437,86 @@ function comandoCi(args) {
2279
2437
  }
2280
2438
  const thread = args.posicionais[2];
2281
2439
  if (!thread) {
2282
- console.error('uso: ork ci run <thread-id> [--json] | ork ci run --bundle <arquivo> | ork ci run --branch <branch>');
2440
+ console.error(m.usoRun);
2283
2441
  return 2;
2284
2442
  }
2285
2443
  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}`);
2444
+ console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : m.resultado(result.status.ok, result.status.detail));
2287
2445
  return result.status.ok ? 0 : 1;
2288
2446
  }
2289
2447
  if (sub === 'status') {
2290
2448
  const sha = texto(args.opcoes.sha) ?? args.posicionais[2] ?? (0, util_1.exec)('git', ['rev-parse', 'HEAD'], carregado.raiz).stdout.trim();
2291
2449
  if (!/^[0-9a-f]{40}$/.test(sha)) {
2292
2450
  // 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]');
2451
+ console.error(m.sha);
2452
+ console.error(m.usoStatus);
2296
2453
  return 2;
2297
2454
  }
2298
2455
  // RM-047: recusa o `--remoto` que nao e nome de remoto mesmo com o gate de CI desligado.
2299
2456
  const remoto = (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto === undefined ? 'origin' : args.opcoes.remoto, 'ci');
2300
2457
  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}`);
2458
+ console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : m.status(result.ok, result.detail));
2302
2459
  return result.ok ? 0 : 1;
2303
2460
  }
2304
- console.error(`subcomando desconhecido: ci ${sub}`);
2461
+ console.error(m.desconhecido(sub));
2305
2462
  return 2;
2306
2463
  }
2464
+ /**
2465
+ * RM-062 (F1): `ork privado varrer [--base REF] [--json]`, a varredura de dado privado do repositorio do diretorio
2466
+ * atual. Sem `--base`, os nomes e as linhas dos arquivos versionados (o passo do CI); com ela, o diff contra a
2467
+ * merge-base com `REF` e os nao rastreados. Sai 1 com achado sob a policy `dado_privado` em `block` ou sem a policy
2468
+ * (quem roda o comando pediu a varredura); em `warn` e `off`, 0 com o aviso. Sai 2 quando a varredura nao roda.
2469
+ */
2470
+ function comandoPrivado(args) {
2471
+ const uso = 'uso: ork privado varrer [--base REF] [--json]';
2472
+ const opcoes = Object.keys(args.opcoes);
2473
+ if (args.posicionais[1] !== 'varrer' || args.posicionais.length > 2 || opcoes.some((k) => k !== 'base' && k !== 'json') ||
2474
+ ('json' in args.opcoes && args.opcoes.json !== true) || ('base' in args.opcoes && typeof args.opcoes.base !== 'string')) {
2475
+ console.error(uso);
2476
+ return 2;
2477
+ }
2478
+ const topo = (0, util_1.exec)('git', ['rev-parse', '--show-toplevel'], process.cwd());
2479
+ if (!topo.ok) {
2480
+ console.error('erro: privado varrer: o diretorio atual nao esta num repositorio git');
2481
+ return 2;
2482
+ }
2483
+ const raiz = topo.stdout.trim();
2484
+ const carregado = (0, manifest_1.carregarManifesto)(raiz);
2485
+ const severidade = carregado ? (0, policies_1.severidadeDeclarada)(carregado.manifesto, 'dado_privado') : null;
2486
+ let estado = null;
2487
+ try {
2488
+ estado = (0, estado_thread_1.raizDoEstado)(raiz);
2489
+ }
2490
+ catch {
2491
+ estado = null;
2492
+ }
2493
+ const contexto = (0, dado_privado_1.contextoDaVarredura)(raiz, estado);
2494
+ const ref = texto(args.opcoes.base);
2495
+ const base = contexto.ok && ref ? (0, dado_privado_1.mergeBase)(raiz, ref) : null;
2496
+ const v = !contexto.ok ? null : ref ? (base ? (0, dado_privado_1.varrerDiff)(contexto.valor, base) : null) : (0, dado_privado_1.varrerArvore)(contexto.valor);
2497
+ const erro = !contexto.ok ? contexto.erro : !v ? `--base ${ref} nao tem merge-base com HEAD` : v.erro;
2498
+ const achados = v?.achados.length ?? 0;
2499
+ const reprova = !erro && achados > 0 && (severidade === null || severidade === 'block');
2500
+ if (args.opcoes.json === true) {
2501
+ console.log(JSON.stringify({ ...(v ?? {}), erro, severidade, ok: !erro && !reprova }, null, 2));
2502
+ }
2503
+ else {
2504
+ if (v)
2505
+ for (const linha of (0, dado_privado_1.relatorioDoDadoPrivado)(v))
2506
+ console.log(linha);
2507
+ const policy = severidade === null ? 'policy dado_privado nao declarada: o comando explicito reprova'
2508
+ : `policy dado_privado em ${severidade}`;
2509
+ console.log(erro ? `Veredito: NAO RODOU (${erro})`
2510
+ : !achados ? 'Veredito: nenhum dado privado nas linhas e nos nomes varridos.'
2511
+ : reprova ? `Veredito: REPROVADO (${achados} achado(s) de dado privado; ${policy})`
2512
+ : `Veredito: AVISO (${achados} achado(s) de dado privado; ${policy}, que nao reprova)`);
2513
+ }
2514
+ return erro ? 2 : reprova ? 1 : 0;
2515
+ }
2307
2516
  function comandoLease(args) {
2308
2517
  const carregado = (0, manifest_1.exigirManifesto)();
2309
2518
  const sub = args.posicionais[1];
2519
+ const ml = (0, locale_1.msg)().operacao.restante.lease;
2310
2520
  if (sub === undefined || sub === 'list') {
2311
2521
  console.log((0, leases_1.tabelaDeLeases)(carregado.raiz));
2312
2522
  return 0;
@@ -2314,38 +2524,38 @@ function comandoLease(args) {
2314
2524
  if (sub === 'acquire' || sub === 'take') {
2315
2525
  const nome = args.posicionais[2];
2316
2526
  const thread = texto(args.opcoes.thread);
2317
- const motivo = texto(args.opcoes.motivo) ?? 'sem motivo declarado';
2527
+ const motivo = texto(args.opcoes.motivo) ?? (0, locale_1.msg)('pt-BR').operacao.restante.lease.semMotivo;
2318
2528
  if (!nome || !thread) {
2319
- console.error('uso: ork lease acquire <nome> --thread <thread-id> [--motivo "<motivo>"]');
2529
+ console.error(ml.usoAcquire);
2320
2530
  return 2;
2321
2531
  }
2322
2532
  (0, thread_1.lerThread)(carregado.raiz, thread);
2323
- const r = (0, leases_1.adquirirRegiao)(carregado.raiz, nome, { thread, motivo });
2533
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, leases_1.adquirirRegiao)(carregado.raiz, nome, { thread, motivo }));
2324
2534
  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)}`);
2535
+ console.log(ml.adquirido(r.nome, r.tipo, thread));
2536
+ console.log(ml.expira((0, horario_1.formatarDataHoraRotulada)(r.lease?.expiraEm)));
2327
2537
  if (r.tomadoDeVencido)
2328
- console.log(' (o lease anterior estava VENCIDO e foi tomado)');
2538
+ console.log(ml.tomado);
2329
2539
  return 0;
2330
2540
  }
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}`);
2541
+ console.error(ml.naoAdquirido(r.nome));
2542
+ console.error(ml.motivoTipado(r.motivo));
2543
+ console.error(ml.detalhe((0, horario_1.localizarTextoRotulado)(r.detalhe)));
2544
+ console.error(ml.posicao(r.posicaoNaFila));
2545
+ console.error(ml.correcao(r.correcao));
2336
2546
  return 1;
2337
2547
  }
2338
2548
  if (sub === 'release') {
2339
2549
  const nome = args.posicionais[2];
2340
2550
  if (!nome) {
2341
- console.error('uso: ork lease release <nome> [--thread <thread-id>] [--forcar]');
2551
+ console.error(ml.usoRelease);
2342
2552
  return 2;
2343
2553
  }
2344
- const r = (0, leases_1.liberar)(carregado.raiz, nome, texto(args.opcoes.thread) ?? '', args.opcoes.forcar === true);
2554
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, leases_1.liberar)(carregado.raiz, nome, texto(args.opcoes.thread) ?? '', args.opcoes.forcar === true));
2345
2555
  console.log(r.detalhe);
2346
2556
  return r.ok ? 0 : 1;
2347
2557
  }
2348
- console.error(`subcomando desconhecido: lease ${sub}`);
2558
+ console.error(ml.desconhecido(sub));
2349
2559
  return 2;
2350
2560
  }
2351
2561
  /**
@@ -2369,6 +2579,7 @@ function comandoBoard(args) {
2369
2579
  const carregado = (0, manifest_1.exigirManifesto)();
2370
2580
  const sub = args.posicionais[1];
2371
2581
  const todos = args.opcoes.all === true || args.opcoes.todos === true;
2582
+ const mb = (0, locale_1.msg)().operacao.restante.board;
2372
2583
  if (sub === 'plan' || sub === 'plano') {
2373
2584
  const plano = (0, board_1.planejar)(carregado);
2374
2585
  const consulta = consultaDoBoard(carregado, { plano: true, todos: false });
@@ -2379,7 +2590,7 @@ function comandoBoard(args) {
2379
2590
  return 0;
2380
2591
  }
2381
2592
  if (sub === 'reap') {
2382
- const devolvidas = (0, board_1.devolverVagas)(carregado, { por: texto(args.opcoes.por) });
2593
+ const devolvidas = (0, locale_1.comLocale)('pt-BR', () => (0, board_1.devolverVagas)(carregado, { por: texto(args.opcoes.por) }));
2383
2594
  if (args.opcoes.json === true)
2384
2595
  console.log(JSON.stringify(devolvidas, null, 2));
2385
2596
  else
@@ -2387,8 +2598,8 @@ function comandoBoard(args) {
2387
2598
  return 0;
2388
2599
  }
2389
2600
  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]');
2601
+ console.error(mb.desconhecido(sub));
2602
+ console.error(mb.uso);
2392
2603
  return 2;
2393
2604
  }
2394
2605
  const consulta = consultaDoBoard(carregado, { plano: false, todos });
@@ -2404,7 +2615,7 @@ function comandoBoard(args) {
2404
2615
  console.log('');
2405
2616
  // RM-052: sem o remoto, nada foi lido; dizer "nenhuma publicou" seria a frase do incidente de 29/09.
2406
2617
  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.`);
2618
+ console.log(mb.semRemoto(carregado.manifesto.project.name, carregado.manifesto.fabrica.remoto));
2408
2619
  }
2409
2620
  else {
2410
2621
  const painel = (0, fabrica_estado_1.lerFabrica)(carregado.raiz, { remoto: carregado.manifesto.fabrica.remoto,
@@ -2424,6 +2635,7 @@ const CONTRATO_DO_BOARD = 'ork.board/v1';
2424
2635
  function comandoFabrica(args) {
2425
2636
  const carregado = (0, manifest_1.exigirManifesto)();
2426
2637
  const sub = args.posicionais[1];
2638
+ const mf = (0, locale_1.msg)().operacao.restante.fabrica;
2427
2639
  // RM-063 (F1): a batida e do crontab desta maquina; nao le nem escreve o remoto.
2428
2640
  if (sub === 'batida')
2429
2641
  return comandoDaBatida(carregado, args);
@@ -2444,15 +2656,13 @@ function comandoFabrica(args) {
2444
2656
  console.log(JSON.stringify(r, null, 2));
2445
2657
  else
2446
2658
  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).`);
2659
+ ? mf.publicou(r.maquina, r.threads, r.commit?.slice(0, 7), r.tentativas)
2660
+ : r.acao === 'ocupado' ? mf.ocupada : mf.igual(r.maquina));
2451
2661
  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).');
2662
+ console.log(mf.soQuandoPede);
2453
2663
  // RM-047 (P5): o manifesto que pede a fabrica nao liga a publicacao desta maquina.
2454
2664
  if (carregado.manifesto.fabrica.compartilhada)
2455
- console.log(' o orkastery.yaml pede a fabrica compartilhada; quem liga e a maquina, com ork fabrica entrar.');
2665
+ console.log(mf.manifestoPede);
2456
2666
  }
2457
2667
  return 0;
2458
2668
  }
@@ -2473,27 +2683,25 @@ function comandoFabrica(args) {
2473
2683
  const avisoDoRegistro = (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'fabrica entrar');
2474
2684
  if (avisoDoRegistro)
2475
2685
  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)}).`);
2686
+ console.log(mf.entrou(config.nome));
2687
+ console.log(mf.primeiro(r.threads, r.commit?.slice(0, 7)));
2478
2688
  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.`);
2689
+ console.log(mf.maquinaAmbiente(process.env.ORK_MAQUINA));
2480
2690
  }
2481
2691
  return 0;
2482
2692
  }
2483
2693
  if (sub === 'sair') {
2484
2694
  const config = (0, maquina_1.gravarConfigDaMaquina)({ fabricaCompartilhada: false });
2485
2695
  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.'));
2696
+ console.log(mf.saiu((0, maquina_1.nomeDaMaquina)(), r ? r.slice(0, 7) : null));
2488
2697
  if ((0, maquina_1.fabricaCompartilhada)(carregado.manifesto))
2489
- console.log(' AVISO: ORK_FABRICA_COMPARTILHADA=1 neste shell ainda liga a fabrica aqui.');
2698
+ console.log(mf.ambienteLiga);
2490
2699
  void config;
2491
2700
  return 0;
2492
2701
  }
2493
2702
  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]');
2703
+ console.error(mf.desconhecido(sub));
2704
+ console.error(mf.uso);
2497
2705
  return 2;
2498
2706
  }
2499
2707
  // 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 +2720,7 @@ function comandoFabrica(args) {
2512
2720
  }
2513
2721
  console.log([...(0, projeto_alvo_1.linhasDaConsulta)(consulta), ''].join('\n'));
2514
2722
  console.log(url === null
2515
- ? `Fabrica: o projeto ${carregado.manifesto.project.name} nao tem o remoto ${remoto}; nada foi lido de ork/fabrica-estado.`
2723
+ ? mf.semRemoto(carregado.manifesto.project.name, remoto)
2516
2724
  : (0, fabrica_estado_1.textoDaFabrica)(painel, (0, maquina_1.nomeDaMaquina)()));
2517
2725
  // RM-047 (P5): o manifesto pede a fabrica, mas quem liga a publicacao e a maquina.
2518
2726
  const pedida = (0, maquina_1.avisoDaFabricaPedida)(carregado.manifesto);
@@ -2529,7 +2737,7 @@ function comandoDaBatida(carregado, args) {
2529
2737
  const acao = args.posicionais[2] ?? 'status';
2530
2738
  const json = args.opcoes.json === true;
2531
2739
  if (acao === 'status') {
2532
- const estado = (0, fabrica_batida_1.estadoDaBatida)(carregado.raiz);
2740
+ const estado = (0, fabrica_batida_1.estadoDaBatida)(carregado.raiz, { projeto: carregado.manifesto.project.name });
2533
2741
  console.log(json ? JSON.stringify(estado, null, 2) : (0, fabrica_batida_1.textoDoEstadoDaBatida)(estado));
2534
2742
  return estado.leitura.ok && estado.instalada ? 0 : 1;
2535
2743
  }
@@ -2539,7 +2747,7 @@ function comandoDaBatida(carregado, args) {
2539
2747
  console.log(json ? JSON.stringify(r, null, 2) : (0, fabrica_batida_1.textoDoResultadoDaBatida)(r));
2540
2748
  return 0;
2541
2749
  }
2542
- console.error('uso: ork fabrica batida [status|instalar|remover] [--por Q] [--json]');
2750
+ console.error((0, locale_1.msg)().operacao.restante.fabrica.batida.uso);
2543
2751
  return 2;
2544
2752
  }
2545
2753
  /**
@@ -2549,84 +2757,77 @@ function comandoDaBatida(carregado, args) {
2549
2757
  */
2550
2758
  function comandoNetwork(args) {
2551
2759
  const sub = args.posicionais[1];
2552
- // RM-054: `network roadmap` tem o proprio --projeto e o proprio uso.
2760
+ // RM-054: `network roadmap` tem o proprio --projeto e o proprio uso (e segue em pt-BR, G6 da RM-061 F3b).
2553
2761
  if (sub === 'roadmap')
2554
2762
  return comandoNetworkRoadmap(args);
2555
2763
  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]';
2764
+ // RM-061 (F3b, D3): o texto pelo catalogo; o que se grava (adesao, retrato, casa) roda no escopo pt-BR, e o nome da
2765
+ // maquina, a casa, a forja e o commit saem como vieram.
2766
+ const mn = (0, locale_1.msg)().network;
2559
2767
  const forja = texto(args.opcoes.forja), repositorio = texto(args.opcoes.repositorio);
2560
2768
  if ((args.opcoes.forja !== undefined && !(0, rede_forja_1.ehNomeDeForja)(forja)) || args.opcoes.repositorio === true ||
2561
2769
  (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);
2770
+ console.error(mn.uso);
2563
2771
  return 2;
2564
2772
  }
2565
2773
  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`);
2774
+ 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,
2775
+ repositorio, diretorio, tomarNome: args.opcoes.forcar === true }));
2776
+ console.log(mn.entrou(r.publicacao.maquina, r.casa.dono, r.casa.forja, (0, rede_1.refDaCasa)(r.casa), r.criado));
2777
+ console.log(mn.primeiroRetrato(String(r.publicacao.commit?.slice(0, 7))));
2571
2778
  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
- }
2779
+ console.log(mn.tomouNome(r.publicacao.maquina));
2780
+ console.log(mn.eAoCriar);
2781
+ for (const d of r.publicacao.descartados)
2782
+ console.log(mn.avisoDescartado(d.padrao, d.campo));
2577
2783
  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.`);
2784
+ console.log(mn.avisoOrkMaquina(process.env.ORK_MAQUINA));
2579
2785
  }
2580
2786
  return 0;
2581
2787
  }
2582
2788
  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
- }
2789
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, rede_1.sairDaRede)({ forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio }));
2790
+ console.log(mn.saiu(r.maquina, r.commit ? mn.retratoRemovido(r.casa, r.commit.slice(0, 7))
2791
+ : r.alheio ? mn.retratoDeOutraInstalacao(r.maquina, r.casa, r.mesmoHostname === true)
2792
+ : mn.semRetrato(r.casa)));
2793
+ if ((0, maquina_1.lerConfigDaMaquina)()?.fabricaCompartilhada)
2794
+ console.log(mn.fabricaContinua);
2593
2795
  return 0;
2594
2796
  }
2595
2797
  if (sub === 'publicar') {
2596
2798
  if (args.opcoes.silencioso === true) {
2597
2799
  // O filho do evento de thread: quem disparou ja tomou a vez (teto de 14 min) e nao espera.
2800
+ // RM-061 (F3b): o rede.log guarda o que aconteceu em pt-BR, com qualquer lingua no ambiente.
2598
2801
  try {
2599
- (0, rede_adesao_1.registrarNaRede)({ ...(0, rede_1.publicarRede)({ diretorio }), origem: 'evento' });
2802
+ (0, locale_1.comLocale)('pt-BR', () => (0, rede_adesao_1.registrarNaRede)({ ...(0, rede_1.publicarRede)({ diretorio }), origem: 'evento' }));
2600
2803
  return 0;
2601
2804
  }
2602
2805
  catch (e) {
2603
- (0, rede_adesao_1.registrarNaRede)({ acao: 'falhou', origem: 'evento', erro: e.message });
2806
+ (0, locale_1.comLocale)('pt-BR', () => (0, rede_adesao_1.registrarNaRede)({ acao: 'falhou', origem: 'evento', erro: e.message }));
2604
2807
  return 1;
2605
2808
  }
2606
2809
  }
2607
- const r = (0, rede_1.publicarRede)({ diretorio, forcar: args.opcoes.forcar === true, forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio });
2810
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, rede_1.publicarRede)({ diretorio, forcar: args.opcoes.forcar === true,
2811
+ forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio }));
2608
2812
  if (args.opcoes.json === true)
2609
2813
  console.log(JSON.stringify(r, null, 2));
2610
2814
  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).`);
2815
+ console.log(r.acao === 'publicou' ? mn.publicou(r.maquina, r.casa, r.commit?.slice(0, 7), r.tentativas)
2816
+ : r.acao === 'ocupado' ? mn.ocupado : mn.igual(r.maquina, r.casa));
2616
2817
  if (args.opcoes.json !== true) {
2617
2818
  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).`);
2819
+ console.log(mn.avisoDescartado(d.padrao, d.campo));
2619
2820
  }
2620
2821
  return 0;
2621
2822
  }
2622
2823
  if (sub !== undefined && sub !== 'status') {
2623
- console.error(`subcomando desconhecido: network ${sub}`);
2624
- console.error(uso);
2824
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('network', sub));
2825
+ console.error(mn.uso);
2625
2826
  return 2;
2626
2827
  }
2627
2828
  // RM-054 (fatia 3): o host sem cwd de projeto (RM-052, D3) nao faz do diretorio do gateway um projeto lido.
2628
2829
  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 });
2830
+ const status = (0, locale_1.comLocale)('pt-BR', () => (0, rede_status_1.lerRede)({ semRemoto: args.opcoes['sem-remoto'] === true, diretorio: doHost ? null : diretorio }));
2630
2831
  console.log(args.opcoes.json === true ? (0, rede_status_1.jsonDaRede)(status) : (0, rede_status_1.textoDaRede)(status));
2631
2832
  return 0;
2632
2833
  }
@@ -2637,54 +2838,55 @@ function comandoNetwork(args) {
2637
2838
  */
2638
2839
  function comandoProjetos(args, projeto) {
2639
2840
  const sub = args.posicionais[1] ?? 'list';
2841
+ const m = (0, locale_1.msg)().projetos.cli;
2640
2842
  if (sub === 'list' || sub === 'listar') {
2641
2843
  const projetos = (0, projeto_alvo_1.listarProjetos)();
2642
2844
  if (args.opcoes.json === true) {
2643
2845
  console.log(JSON.stringify({ contrato: projeto_alvo_1.CONTRATO_PROJETOS, arquivo: (0, projeto_alvo_1.caminhoDoRegistro)(), projetos }, null, 2));
2644
2846
  return 0;
2645
2847
  }
2646
- console.log(`Projetos conhecidos desta maquina (${(0, projeto_alvo_1.raizParaExibir)((0, projeto_alvo_1.caminhoDoRegistro)())})`);
2848
+ console.log(m.titulo((0, projeto_alvo_1.raizParaExibir)((0, projeto_alvo_1.caminhoDoRegistro)())));
2647
2849
  console.log('');
2648
2850
  if (projetos.length === 0) {
2649
- console.log(' Nenhum ainda. ork init, ork thread new e ork fabrica entrar registram; ou: ork projetos registrar <caminho>');
2851
+ console.log(m.nenhum);
2650
2852
  return 0;
2651
2853
  }
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',
2854
+ console.log((0, util_1.tabela)([...m.cabecalho], projetos.map((p) => [
2855
+ p.nome, p.abbrev || '-', (0, projeto_alvo_1.raizParaExibir)(p.raiz), p.remoto ?? m.semRemoto, p.presente ? m.sim : m.ausente,
2654
2856
  (0, horario_1.formatarDataHora)(p.atualizadoEm)
2655
2857
  ])));
2656
2858
  console.log('');
2657
- console.log('Use --projeto <nome> em qualquer comando (ORK_PROJETO vale para o shell inteiro). ' + (0, horario_1.legendaDoFuso)());
2859
+ console.log(`${m.selecao} ${(0, horario_1.legendaDoFuso)()}`);
2658
2860
  return 0;
2659
2861
  }
2660
2862
  if (sub === 'registrar') {
2661
2863
  const caminho = args.posicionais[2];
2662
2864
  if (caminho !== undefined && projeto !== undefined)
2663
- throw new Error('uso: ork projetos registrar [caminho] (um caminho ou --projeto, não os dois)');
2865
+ throw new Error(m.usoRegistrar);
2664
2866
  const alvo = caminho === undefined ? (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto ?? null }) : null;
2665
2867
  const p = (0, projeto_alvo_1.registrarProjeto)(caminho ?? alvo?.raiz ?? process.cwd(), 'projetos registrar');
2666
2868
  if (args.opcoes.json === true) {
2667
2869
  console.log(JSON.stringify(p, null, 2));
2668
2870
  return 0;
2669
2871
  }
2670
- console.log(`Projeto ${p.nome} (${p.abbrev || '-'}) registrado: ${(0, projeto_alvo_1.raizParaExibir)(p.raiz)} · ${p.remoto ?? 'sem remoto'}`);
2872
+ console.log(m.registrado(p.nome, p.abbrev || '-', (0, projeto_alvo_1.raizParaExibir)(p.raiz), p.remoto ?? m.semRemoto));
2671
2873
  return 0;
2672
2874
  }
2673
2875
  if (sub === 'esquecer') {
2674
2876
  const alvo = args.posicionais[2] ?? projeto;
2675
2877
  if (!alvo)
2676
- throw new Error('uso: ork projetos esquecer <nome|caminho>');
2878
+ throw new Error(m.usoEsquecer);
2677
2879
  const sairam = (0, projeto_alvo_1.esquecerProjeto)(alvo);
2678
2880
  if (args.opcoes.json === true) {
2679
2881
  console.log(JSON.stringify(sairam, null, 2));
2680
2882
  return 0;
2681
2883
  }
2682
2884
  for (const p of sairam)
2683
- console.log(`Projeto ${p.nome} esquecido: ${(0, projeto_alvo_1.raizParaExibir)(p.raiz)} (nada no disco foi apagado)`);
2885
+ console.log(m.esquecido(p.nome, (0, projeto_alvo_1.raizParaExibir)(p.raiz)));
2684
2886
  return 0;
2685
2887
  }
2686
- console.error(`subcomando desconhecido: projetos ${sub}`);
2687
- console.error('uso: ork projetos [--json] | projetos registrar [caminho] | projetos esquecer <nome|caminho>');
2888
+ console.error(m.desconhecido(sub));
2889
+ console.error(m.uso);
2688
2890
  return 2;
2689
2891
  }
2690
2892
  /**
@@ -2698,15 +2900,16 @@ function comandoProjetos(args, projeto) {
2698
2900
  function comandoOrquestracao(args) {
2699
2901
  const carregado = (0, manifest_1.exigirManifesto)();
2700
2902
  const sub = args.posicionais[1];
2903
+ const m = (0, locale_1.msg)().operacao.restante.monitor;
2701
2904
  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]');
2905
+ console.error(m.desconhecido(sub));
2906
+ console.error(m.uso);
2704
2907
  return 2;
2705
2908
  }
2706
2909
  const bruto = texto(args.opcoes.atencao);
2707
2910
  const atencaoMin = bruto === undefined ? undefined : Number(bruto);
2708
2911
  if (atencaoMin !== undefined && (!Number.isFinite(atencaoMin) || atencaoMin < 0)) {
2709
- console.error(`--atencao espera minutos (inteiro >= 0), recebeu "${bruto}"`);
2912
+ console.error(m.atencao(bruto ?? ''));
2710
2913
  return 2;
2711
2914
  }
2712
2915
  const monitor = (0, orquestracao_1.montarMonitor)(carregado, {
@@ -2724,74 +2927,88 @@ function comandoOrquestracao(args) {
2724
2927
  }
2725
2928
  return 0;
2726
2929
  }
2930
+ /**
2931
+ * RM-037 (defeito 2 de 19 e 20/10/2026): o preparo de `worktree.dependencias` na worktree nova, dito ao lado dela. A
2932
+ * falha vai ao stderr com o comando exato e o diretorio, e a thread continua criada.
2933
+ */
2934
+ function relatarDependencias(p, dir) {
2935
+ if (!p)
2936
+ return;
2937
+ const m = (0, locale_1.msg)().worktree;
2938
+ if (p.ok)
2939
+ console.log(m.dependenciasProntas(p.comando, Math.round(p.duracaoMs / 1000)));
2940
+ else
2941
+ console.error(m.dependenciasFalharam(p.comando, p.code, p.causa === 'timeout', dir, (0, dependencias_da_worktree_1.ultimaLinhaDoPreparo)(p)));
2942
+ }
2727
2943
  function comandoWorktree(args) {
2728
2944
  const carregado = (0, manifest_1.exigirManifesto)();
2729
2945
  const sub = args.posicionais[1];
2730
2946
  const id = args.posicionais[2];
2947
+ // RM-061 (F3b, D3): a moldura pelo catalogo; o que os quatro subcomandos gravam (ledger, thread.json, a soltura dos
2948
+ // leases) roda no escopo pt-BR, e o detalhe e a correcao do resultado sao remontados no locale do comando.
2949
+ const m = (0, locale_1.msg)().worktree;
2731
2950
  if (!sub || !id) {
2732
- console.error('uso: ork worktree <ensure|sync|audit|release> <thread-id>');
2951
+ console.error(m.uso);
2733
2952
  return 2;
2734
2953
  }
2954
+ const bloqueio = (titulo, r) => {
2955
+ console.error(titulo);
2956
+ console.error(m.motivoTipado(r.motivo));
2957
+ console.error(m.detalhe((0, locale_1.remontar)(r.detalhe)));
2958
+ console.error(m.correcao((0, locale_1.remontar)(r.correcao)));
2959
+ };
2735
2960
  if (sub === 'ensure') {
2736
- const r = (0, worktree_1.garantirWorktree)(carregado, id);
2961
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.garantirWorktree)(carregado, id));
2737
2962
  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}`);
2963
+ bloqueio(m.naoGarantida(id), r);
2742
2964
  return 1;
2743
2965
  }
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}`);
2966
+ console.log(r.criada ? m.criada(id) : m.jaExistia(id));
2967
+ console.log(m.linhaDir(r.dir));
2968
+ console.log(m.linhaBranch(r.branch));
2969
+ console.log(m.linhaBase(r.base));
2970
+ console.log(` ${(0, locale_1.remontar)(r.detalhe)}`);
2971
+ relatarDependencias(r.dependencias, r.dir);
2749
2972
  return 0;
2750
2973
  }
2751
2974
  if (sub === 'sync') {
2752
- const r = (0, worktree_1.sincronizarWorktree)(carregado, id, { dryRun: args.opcoes['dry-run'] === true });
2975
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.sincronizarWorktree)(carregado, id, { dryRun: args.opcoes['dry-run'] === true }));
2753
2976
  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}`);
2977
+ bloqueio(m.syncBloqueado(id), r);
2758
2978
  return 1;
2759
2979
  }
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}`);
2980
+ console.log(r.dryRun ? m.syncEnsaio(id) : m.syncFeito(id));
2981
+ console.log(m.syncBase(r.base, r.shaBase.slice(0, 8)));
2982
+ console.log(m.syncBranch(r.branch, r.shaAntes.slice(0, 8), r.shaDepois.slice(0, 8)));
2983
+ console.log(m.syncRebase(r.rebaseFeito ? 'feito' : r.jaAtualizada ? 'desnecessario' : 'seria feito'));
2984
+ console.log(` ${(0, locale_1.remontar)(r.detalhe)}`);
2765
2985
  if (r.passos.length > 0) {
2766
2986
  console.log('');
2767
- console.log(' Comandos reais, na ordem:');
2987
+ console.log(m.comandosReais);
2768
2988
  for (const passo of r.passos)
2769
- console.log(` ${passo}`);
2989
+ console.log(` ${(0, locale_1.remontar)(passo)}`);
2770
2990
  }
2771
2991
  return 0;
2772
2992
  }
2773
2993
  if (sub === 'audit') {
2774
- const r = (0, worktree_1.auditarWorktree)(carregado, id);
2994
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.auditarWorktree)(carregado, id));
2775
2995
  console.log((0, worktree_1.textoDoAudit)(id, r));
2776
2996
  return r.ok ? 0 : 1;
2777
2997
  }
2778
2998
  if (sub === 'release') {
2779
- const r = (0, worktree_1.liberarWorktree)(carregado, id, { forcar: args.opcoes.forcar === true });
2999
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, worktree_1.liberarWorktree)(carregado, id, { forcar: args.opcoes.forcar === true }));
2780
3000
  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}`);
3001
+ bloqueio(m.releaseBloqueado(id), r);
2785
3002
  return 1;
2786
3003
  }
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}`);
3004
+ console.log(m.liberada(id));
3005
+ console.log(m.releaseDir(r.dir));
3006
+ console.log(m.releaseRemovida(r.removida));
3007
+ console.log(m.releaseLeases(r.leasesLiberados.join(', ')));
3008
+ console.log(` ${(0, locale_1.remontar)(r.detalhe)}`);
2792
3009
  return 0;
2793
3010
  }
2794
- console.error(`subcomando desconhecido: worktree ${sub}`);
3011
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('worktree', sub));
2795
3012
  return 2;
2796
3013
  }
2797
3014
  function comandoMaster(args) {
@@ -2864,12 +3081,7 @@ function comandoMaster(args) {
2864
3081
  // mudou, e para onde ir. Desaparecer sem dizer nada seria o mesmo pecado da #TAG
2865
3082
  // aposentada virando default.
2866
3083
  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');
3084
+ console.error((0, locale_1.msg)().master.complementar.batchAposentado);
2873
3085
  return 2;
2874
3086
  }
2875
3087
  if (args.opcoes['aceitar-omissao'] !== undefined) {
@@ -2884,19 +3096,20 @@ function comandoMaster(args) {
2884
3096
  }
2885
3097
  const propor = primeiro === 'propor';
2886
3098
  const id = propor ? args.posicionais[2] : primeiro;
3099
+ const mm = (0, locale_1.msg)().master.complementar;
2887
3100
  if (!id)
2888
- throw new Error('informe a thread para propor MASTER');
3101
+ throw new Error(mm.informeThread);
2889
3102
  const brutoScore = texto(args.opcoes.score);
2890
3103
  const justificativa = texto(args.opcoes.justificativa) ?? texto(args.opcoes.porque);
2891
3104
  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.');
3105
+ console.error(mm.usoScore);
3106
+ console.error(mm.scoreHumano);
2894
3107
  return 2;
2895
3108
  }
2896
3109
  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>"`);
3110
+ console.error(mm.justificativa(id));
3111
+ console.error(mm.justificativaRazao);
3112
+ console.error(mm.justificativaComando(id, brutoScore));
2900
3113
  return 2;
2901
3114
  }
2902
3115
  const brutasClasses = texto(args.opcoes.classe) ?? texto(args.opcoes.classes);
@@ -2904,8 +3117,8 @@ function comandoMaster(args) {
2904
3117
  for (const bruta of (brutasClasses ?? '').split(',').map((c) => c.trim()).filter(Boolean)) {
2905
3118
  const classe = (0, master_2.parseClasse)(bruta);
2906
3119
  if (!classe) {
2907
- console.error(`classe de falha invalida: "${bruta}".`);
2908
- console.error(` classes fixas: ${master_2.ORDEM_DAS_CLASSES.join(', ')}`);
3120
+ console.error(mm.classeInvalida(bruta));
3121
+ console.error(mm.classesFixas(master_2.ORDEM_DAS_CLASSES.join(', ')));
2909
3122
  return 2;
2910
3123
  }
2911
3124
  classes.push(classe);
@@ -2933,12 +3146,12 @@ function comandoMaster(args) {
2933
3146
  // vai ao ledger do projeto uma vez por janela; virar policy continua sendo do dono.
2934
3147
  for (const p of (0, licoes_1.registrarPropostasNovas)(carregado.raiz)) {
2935
3148
  console.log('');
2936
- console.log(`Proposta de policy: ${p.chave} em ${p.threads.length} threads nos ultimos ${p.janelaDias} dias.`);
3149
+ console.log(mm.proposta(p.chave, p.threads.length, p.janelaDias));
2937
3150
  console.log(` ${p.sugestao}`);
2938
- console.log(' So proposta: vira policy quando voce a declara em policies: no orkastery.yaml (ork licoes).');
3151
+ console.log(mm.soProposta);
2939
3152
  }
2940
3153
  console.log('');
2941
- console.log(`Proximo passo: ork board --all | entregas e indice: ork master`);
3154
+ console.log(mm.proximo);
2942
3155
  return 0;
2943
3156
  }
2944
3157
  /**
@@ -3053,12 +3266,14 @@ function comandoRoadmap(args) {
3053
3266
  if (sub === 'reservas') {
3054
3267
  // RM-037 (rm037noite, defeito 3): a reserva de thread ja fechada aparece como orfa e sai com registro.
3055
3268
  if (args.opcoes['soltar-orfas'] === true) {
3056
- const soltas = (0, roadmap_reservas_1.soltarReservasOrfas)(carregado.raiz, { remoto });
3269
+ // RM-061 (F3b, D3): a soltura grava no escopo pt-BR (ledger, branch de reservas); o detalhe e remontado no texto.
3270
+ const soltas = (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.soltarReservasOrfas)(carregado.raiz, { remoto }));
3271
+ const mr = (0, locale_1.msg)().reservas;
3057
3272
  if (args.opcoes.json === true)
3058
3273
  console.log(JSON.stringify(soltas, null, 2));
3059
3274
  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'));
3275
+ console.log(soltas.length === 0 ? mr.nenhumaOrfa
3276
+ : soltas.map((s) => mr.soltura(s.item, (0, locale_1.remontar)(s.detalhe), s.thread)).join('\n'));
3062
3277
  return 0;
3063
3278
  }
3064
3279
  // RM-052 (fatia 2, D4): as reservas moram no remoto do projeto. Sem ele, nada e lido; com ele mudo e
@@ -3098,21 +3313,21 @@ function comandoRoadmap(args) {
3098
3313
  }
3099
3314
  // RM-037 (rm037noite, defeito 6): o numero da FEAT nova sai da mesma branch de reservas.
3100
3315
  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 });
3316
+ 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),
3317
+ thread: texto(args.opcoes.thread) ?? null, nota: texto(args.opcoes.nota) ?? null }));
3318
+ const mr = (0, locale_1.msg)().reservas;
3103
3319
  if (args.opcoes.json === true)
3104
3320
  console.log(JSON.stringify(r, null, 2));
3105
3321
  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)}`);
3322
+ console.log(mr.feat(r.feat, r.reserva.thread ?? null));
3323
+ console.log(mr.crieAPagina(r.feat));
3324
+ console.log(mr.branch(r.commit.slice(0, 7)));
3109
3325
  }
3110
3326
  return 0;
3111
3327
  }
3112
3328
  const item = args.posicionais[2];
3113
3329
  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]');
3330
+ console.error((0, locale_1.msg)().reservas.uso);
3116
3331
  return 2;
3117
3332
  }
3118
3333
  const opcoes = {
@@ -3124,18 +3339,17 @@ function comandoRoadmap(args) {
3124
3339
  forcar: args.opcoes.forcar === true,
3125
3340
  motivo: texto(args.opcoes.motivo),
3126
3341
  };
3127
- const r = sub === 'pegar' ? (0, roadmap_reservas_1.pegarItem)(carregado.raiz, item, opcoes) : (0, roadmap_reservas_1.soltarItem)(carregado.raiz, item, opcoes);
3342
+ 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
3343
  if (args.opcoes.json === true) {
3129
3344
  console.log(JSON.stringify(r, null, 2));
3130
3345
  return 0;
3131
3346
  }
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}.`);
3347
+ const mr = (0, locale_1.msg)().reservas;
3348
+ console.log(mr.itemAcao(r.item, mr.acao(r.acao)));
3135
3349
  if (r.reserva && r.acao !== 'soltou')
3136
- console.log(` com ${r.reserva.por} em ${r.reserva.maquina}${r.reserva.thread ? `, thread ${r.reserva.thread}` : ''}`);
3350
+ console.log(mr.com(r.reserva.por, r.reserva.maquina, r.reserva.thread ?? null));
3137
3351
  if (r.commit)
3138
- console.log(` branch ork/roadmap-reservas em ${r.commit.slice(0, 7)}`);
3352
+ console.log(mr.branch(r.commit.slice(0, 7)));
3139
3353
  return 0;
3140
3354
  }
3141
3355
  /**
@@ -3145,7 +3359,7 @@ function comandoRoadmap(args) {
3145
3359
  function comandoNetworkRoadmap(args) {
3146
3360
  const pedido = texto(args.opcoes.projeto);
3147
3361
  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]');
3362
+ console.error((0, locale_1.msg)().network.roadmap.uso);
3149
3363
  return 2;
3150
3364
  }
3151
3365
  try {
@@ -3163,14 +3377,41 @@ function comandoNetworkRoadmap(args) {
3163
3377
  return network_roadmap_1.SAIDA_DO_PEDIDO;
3164
3378
  }
3165
3379
  }
3380
+ /**
3381
+ * RM-026 K7 (fatia 2, D11 e D13): o conhecimento escrito, so leitura. O JSON e o das tools `ork_conhecimento_*`,
3382
+ * em pt-BR nas duas linguas; so o texto segue o locale. Sai 1 quando a consulta nao responde e 2 com uso errado
3383
+ * (D13 revista no CHECK: o gate de CI separa o erro de digitacao da lacuna).
3384
+ */
3385
+ function comandoConhecimento(args) {
3386
+ const [, sub = 'listar', id, ...resto] = args.posicionais;
3387
+ const colecao = args.opcoes.colecao;
3388
+ const valido = conhecimento_consulta_1.CONSULTAS_DO_CONHECIMENTO.includes(sub) && !resto.length &&
3389
+ (args.opcoes.json === undefined || args.opcoes.json === true) &&
3390
+ Object.keys(args.opcoes).every((k) => k === 'json' || (k === 'colecao' && sub === 'listar')) &&
3391
+ (colecao === undefined || (typeof colecao === 'string' && conhecimento_1.NOME_DE_COLECAO.test(colecao))) &&
3392
+ (sub === 'mostrar' ? typeof id === 'string' && conhecimento_1.ID_DE_DOCUMENTO.test(id) : id === undefined);
3393
+ if (!valido) {
3394
+ console.error((0, locale_1.msg)().cli.erro((0, locale_1.msg)().conhecimento.uso));
3395
+ return 2;
3396
+ }
3397
+ const pedido = sub === 'mostrar' ? { consulta: 'mostrar', id }
3398
+ : sub === 'listar' ? { consulta: 'listar', ...(typeof colecao === 'string' ? { colecao } : {}) }
3399
+ : { consulta: sub };
3400
+ const carregado = (0, manifest_1.exigirManifesto)();
3401
+ const r = (0, conhecimento_consulta_1.consultarConhecimento)(carregado, pedido);
3402
+ console.log(args.opcoes.json === true ? (0, saida_segura_1.jsonSemInvisivel)(r) : (0, conhecimento_consulta_1.textoDoConhecimento)(r));
3403
+ return (0, conhecimento_consulta_1.consultaRespondeu)(r) ? 0 : 1;
3404
+ }
3166
3405
  function comandoDocs(args) {
3167
3406
  const sub = args.posicionais[1] ?? 'verificar';
3168
3407
  const carregado = (0, manifest_1.carregarManifesto)();
3169
3408
  const raiz = carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)();
3170
3409
  const baseBranch = carregado?.manifesto.worktree?.base_branch ?? 'main';
3410
+ const md = (0, locale_1.msg)().docs;
3171
3411
  if (sub === 'verificar') {
3172
3412
  // 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 });
3413
+ // RM-061 (F3b, G4): verifica no escopo pt-BR, como o `--json` leva os achados; o texto os remonta no locale do comando.
3414
+ const { docs, achados } = (0, locale_1.comLocale)('pt-BR', () => (0, docs_1.verificarDocs)(raiz, { baseBranch, ajudaDoCli: AJUDA, pr: args.opcoes.pr === true }));
3174
3415
  if (args.opcoes.json === true) {
3175
3416
  console.log(JSON.stringify({ paginas: docs.length, erros: achados.filter((a) => a.gravidade === 'erro').length,
3176
3417
  achados }, null, 2));
@@ -3187,31 +3428,31 @@ function comandoDocs(args) {
3187
3428
  // Sugestao 4 do CHECK 1 (e 8 do CHECK 2, `--so=`): `--so` sem item e erro de uso, nunca o escopo
3188
3429
  // padrao em silencio.
3189
3430
  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)');
3431
+ console.error(md.usoSoSemItem);
3191
3432
  return 2;
3192
3433
  }
3193
3434
  const so = texto(args.opcoes.so);
3194
3435
  let itens;
3195
- let escopo = 'todo item do roadmap';
3436
+ let escopo = md.escopoTodos;
3196
3437
  if (so) {
3197
3438
  itens = so.split(',').map((i) => i.trim().toUpperCase()).filter(Boolean);
3198
3439
  const fora = itens.filter((i) => !/^RM-\d{3}$/.test(i));
3199
3440
  if (fora.length || itens.length === 0) {
3200
- console.error(`uso: ork docs sincronizar --so RM-NNN[,RM-MMM] (recebido: ${so})`);
3441
+ console.error(md.usoSoInvalido(so));
3201
3442
  return 2;
3202
3443
  }
3203
- escopo = `so ${itens.join(', ')} (--so)`;
3444
+ escopo = md.escopoSo(itens.join(', '));
3204
3445
  }
3205
3446
  else if (args.opcoes.todos !== true) {
3206
3447
  const padrao = (0, docs_1.escopoPadraoDoSync)(raiz);
3207
3448
  if (padrao.itens) {
3208
3449
  itens = padrao.itens;
3209
- escopo = `so ${itens.join(', ')}, o item da thread ${padrao.thread} desta worktree (--todos para todo item)`;
3450
+ escopo = md.escopoDaThread(itens.join(', '), String(padrao.thread));
3210
3451
  }
3211
3452
  }
3212
- const r = (0, docs_1.sincronizarDocs)(raiz, { baseBranch, escrever, itens });
3453
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, docs_1.sincronizarDocs)(raiz, { baseBranch, escrever, itens }));
3213
3454
  console.log(args.opcoes.json === true ? JSON.stringify({ ...r, escopo: itens ?? null }, null, 2)
3214
- : `Escopo: ${escopo}.\n${(0, docs_1.textoDaSincronizacao)(r, escrever)}`);
3455
+ : `${md.escopo(escopo)}\n${(0, docs_1.textoDaSincronizacao)(r, escrever)}`);
3215
3456
  return 0;
3216
3457
  }
3217
3458
  if (sub === 'init') {
@@ -3224,29 +3465,36 @@ function comandoDocs(args) {
3224
3465
  : [m.criado, ...criados.map((c) => ` ${c}`), '', m.proximoPasso].join('\n'));
3225
3466
  return 0;
3226
3467
  }
3227
- console.error(`uso: ork docs verificar [--json] [--pr] | sincronizar [--escrever] [--so RM-NNN] [--todos] | init`);
3468
+ console.error(md.uso);
3228
3469
  return 2;
3229
3470
  }
3230
3471
  function comandoPrompt(args) {
3231
3472
  const sub = args.posicionais[1] ?? 'list';
3232
3473
  const carregado = (0, manifest_1.carregarManifesto)();
3233
3474
  const raiz = carregado?.raiz;
3475
+ const mp = (0, locale_1.msg)().prompts.cli;
3476
+ // RM-061 F3c: o template e a lingua do prompt sao os do despacho (a lingua declarada do dono, `owner.language`;
3477
+ // 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.
3478
+ // Os templates do projeto sempre aparecem; dos embutidos, o da lingua do prompt.
3479
+ const linguaDoPrompt = (0, locale_1.linguaDeclaradaDoDono)(carregado?.manifesto.owner?.language);
3480
+ const templatesDaLingua = () => (0, prompts_1.carregarTemplates)(raiz).filter((t) => t.origem !== 'embutido' || (linguaDoPrompt === 'en' ? t.id.endsWith('.en') : !t.id.endsWith('.en')));
3234
3481
  if (sub === 'list') {
3235
- console.log((0, prompts_1.tabelaDeTemplates)((0, prompts_1.carregarTemplates)(raiz)));
3482
+ console.log((0, prompts_1.tabelaDeTemplates)(templatesDaLingua()));
3236
3483
  return 0;
3237
3484
  }
3238
3485
  if (sub === 'lint') {
3239
3486
  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)'}`);
3487
+ const templates = id ? [(0, prompts_1.exigirTemplate)(id, raiz)] : templatesDaLingua();
3488
+ const problemas = [...templates.flatMap((t) => (0, prompts_1.lintTemplate)(t)),
3489
+ ...(id ? [] : (0, prompts_1.avisosDeLingua)(templates, linguaDoPrompt))];
3490
+ console.log(mp.lintTitulo(raiz ?? null));
3243
3491
  console.log('');
3244
3492
  console.log((0, prompts_1.textoDoLint)(problemas, templates.length));
3245
3493
  return problemas.some((p) => p.gravidade === 'erro') ? 2 : 0;
3246
3494
  }
3247
3495
  if (sub === 'render') {
3248
3496
  const fase = exigirFaseCanonica(texto(args.opcoes.fase) ?? args.posicionais[3]);
3249
- const pedido = texto(args.opcoes.pedido) ?? '<pedido do builder>';
3497
+ const pedido = texto(args.opcoes.pedido) ?? mp.pedidoExemplo;
3250
3498
  const idTemplate = texto(args.opcoes.template);
3251
3499
  // Modo exemplo: renderiza sem thread nenhuma, para revisar o texto de um modo antes de
3252
3500
  // abrir trabalho. Nada e gravado, e o `ork` diz em voz alta que a thread e ficticia.
@@ -3261,10 +3509,10 @@ function comandoPrompt(args) {
3261
3509
  return 2;
3262
3510
  }
3263
3511
  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)}`);
3512
+ const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, raiz) : (0, prompts_1.templateDaFase)(fase, raiz, linguaDoPrompt);
3513
+ const prompt = (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(exemplo, fase, pedido, '', (0, prompts_1.idiomaDoTemplate)(template)));
3514
+ console.log(mp.cabecalhoTemplate(template.id, template.versao, template.origem));
3515
+ console.log(mp.cabecalhoExemplo(modos_1.MODOS[modo].tag, (0, phase_1.hashDoPrompt)(prompt)));
3268
3516
  console.log('');
3269
3517
  console.log(prompt);
3270
3518
  return 0;
@@ -3272,8 +3520,8 @@ function comandoPrompt(args) {
3272
3520
  const obrigatorio = (0, manifest_1.exigirManifesto)();
3273
3521
  const threadId = args.posicionais[2];
3274
3522
  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>"');
3523
+ console.error(mp.usoRenderThread);
3524
+ console.error(mp.usoRenderExemplo);
3277
3525
  return 2;
3278
3526
  }
3279
3527
  const thread = (0, thread_1.lerThread)(obrigatorio.raiz, threadId);
@@ -3281,26 +3529,26 @@ function comandoPrompt(args) {
3281
3529
  // guardado segue com o texto de exemplo, como antes.
3282
3530
  const guardado = texto(args.opcoes.pedido) === undefined ? (0, thread_1.pedidoDaThread)(obrigatorio.raiz, thread) : null;
3283
3531
  const pedidoDaFase = guardado?.texto ?? pedido;
3284
- const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, obrigatorio.raiz) : (0, prompts_1.templateDaFase)(fase, obrigatorio.raiz);
3532
+ const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, obrigatorio.raiz) : (0, prompts_1.templateDaFase)(fase, obrigatorio.raiz, linguaDoPrompt);
3285
3533
  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)}`);
3534
+ ? (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(thread, fase, pedidoDaFase, '', (0, prompts_1.idiomaDoTemplate)(template)))
3535
+ : (0, phase_1.montarPrompt)(thread, fase, pedidoDaFase, obrigatorio.raiz, '', linguaDoPrompt);
3536
+ console.log(mp.cabecalhoTemplate(template.id, template.versao, template.origem));
3537
+ console.log(mp.cabecalhoThread(thread.id, fase, (0, phase_1.hashDoPrompt)(prompt)));
3290
3538
  if (guardado)
3291
- console.log(`# pedido guardado na criacao da thread (sha256 ${(0, util_1.shaCurto)(guardado.sha256)})`);
3539
+ console.log(mp.pedidoGuardado((0, util_1.shaCurto)(guardado.sha256)));
3292
3540
  console.log('');
3293
3541
  console.log(prompt);
3294
3542
  return 0;
3295
3543
  }
3296
- console.error(`subcomando desconhecido: prompt ${sub}`);
3544
+ console.error(mp.subcomandoDesconhecido(sub));
3297
3545
  return 2;
3298
3546
  }
3299
3547
  /** Fase canonica a partir do texto do usuario, com erro tipado quando nao existe. */
3300
3548
  function exigirFaseCanonica(bruto) {
3301
3549
  const alvo = (bruto ?? '').toUpperCase();
3302
3550
  if (!types_1.FASES.includes(alvo)) {
3303
- throw new Error(`fase "${bruto ?? ''}" fora do ciclo canonico (${types_1.FASES.join(' ')})`);
3551
+ throw new Error((0, locale_1.msg)().prompts.cli.faseForaDoCiclo(bruto ?? '', types_1.FASES.join(' ')));
3304
3552
  }
3305
3553
  return alvo;
3306
3554
  }
@@ -3322,6 +3570,7 @@ function orkEmExecucao() {
3322
3570
  }
3323
3571
  function comandoAdapter(args) {
3324
3572
  const sub = args.posicionais[1] ?? 'list';
3573
+ const ma = (0, locale_1.msg)().adapter;
3325
3574
  if (sub === 'list') {
3326
3575
  console.log((0, hosts_1.tabelaDeHosts)());
3327
3576
  return 0;
@@ -3329,13 +3578,12 @@ function comandoAdapter(args) {
3329
3578
  if (sub === 'show') {
3330
3579
  const host = (0, hosts_1.parseHost)(args.posicionais[2]);
3331
3580
  if (!host) {
3332
- console.error(`host desconhecido: "${args.posicionais[2] ?? ''}". Use: ${hosts_1.ORDEM_DOS_HOSTS.join(' | ')}`);
3581
+ console.error(ma.hostDesconhecido(args.posicionais[2] ?? '', hosts_1.ORDEM_DOS_HOSTS.join(' | ')));
3333
3582
  return 2;
3334
3583
  }
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 : ''}`);
3584
+ console.log(ma.adaptador(host));
3585
+ console.log(` ${ma.hosts[host].descricao}`);
3586
+ console.log(` ${ma.destinoPadrao((0, hosts_1.destinoPadraoDe)(host))}`);
3339
3587
  console.log('');
3340
3588
  console.log((0, hosts_1.textoDosPitfalls)(host));
3341
3589
  return 0;
@@ -3343,11 +3591,12 @@ function comandoAdapter(args) {
3343
3591
  if (sub === 'install') {
3344
3592
  const host = (0, hosts_1.parseHost)(args.posicionais[2]);
3345
3593
  if (!host) {
3346
- console.error(`host desconhecido: "${args.posicionais[2] ?? ''}". Use: ${hosts_1.ORDEM_DOS_HOSTS.join(' | ')}`);
3594
+ console.error(ma.hostDesconhecido(args.posicionais[2] ?? '', hosts_1.ORDEM_DOS_HOSTS.join(' | ')));
3347
3595
  return 2;
3348
3596
  }
3349
3597
  const carregado = (0, manifest_1.carregarManifesto)();
3350
- const r = (0, hosts_1.instalarAdaptador)(host, {
3598
+ // RM-061 (F3b, G4): instala no escopo pt-BR; os avisos nascem pelo catalogo e o texto os remonta no locale do comando.
3599
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, hosts_1.instalarAdaptador)(host, {
3351
3600
  projeto: carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)(),
3352
3601
  dir: texto(args.opcoes.dir),
3353
3602
  dryRun: args.opcoes['dry-run'] === true,
@@ -3360,13 +3609,13 @@ function comandoAdapter(args) {
3360
3609
  // unico caminho de saida. `;` separa varios, como o resto do CLI ja faz.
3361
3610
  aceitarCatalogo: (texto(args.opcoes['aceitar-catalogo']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
3362
3611
  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).
3612
+ // 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
3613
  locale: (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale,
3365
- });
3614
+ }));
3366
3615
  console.log((0, hosts_1.textoDaInstalacao)(r));
3367
3616
  return r.ok ? 0 : 2;
3368
3617
  }
3369
- console.error(`subcomando desconhecido: adapter ${sub}`);
3618
+ console.error(ma.subcomandoDesconhecido(sub));
3370
3619
  return 2;
3371
3620
  }
3372
3621
  /**
@@ -3405,6 +3654,7 @@ function comandoEval(args) {
3405
3654
  * diferente de zero quando reprova, para o agendador do host perceber sem ler texto.
3406
3655
  */
3407
3656
  function comandoAudit(args) {
3657
+ const m = (0, locale_1.msg)().audit;
3408
3658
  if (args.posicionais[1] === 'process') {
3409
3659
  const r = (0, process_audit_1.auditarProcesso)((0, manifest_1.exigirManifesto)(), args.opcoes.registrar === true);
3410
3660
  console.log(JSON.stringify(r, null, 2));
@@ -3418,26 +3668,26 @@ function comandoAudit(args) {
3418
3668
  const bruto = texto(args.opcoes.estagio) ?? texto(args.opcoes.stage);
3419
3669
  const estagio = bruto ? (0, auditoria_1.parseEstagio)(bruto) : carregado?.manifesto.project.stage;
3420
3670
  if (bruto && !estagio) {
3421
- console.error(`estagio invalido: "${bruto}". Use: nascente | crescendo | maduro`);
3671
+ console.error(m.erro.estagio(bruto));
3422
3672
  return 2;
3423
3673
  }
3424
3674
  const pack = texto(args.opcoes.pack) ?? args.posicionais[2];
3425
3675
  if (pack) {
3426
3676
  const alvo = (0, auditoria_1.parsePack)(pack);
3427
3677
  if (!alvo) {
3428
- console.error(`pack desconhecido: "${pack}". Use um de: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3678
+ console.error(m.erro.pack(pack, auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3429
3679
  return 2;
3430
3680
  }
3431
3681
  console.log((0, auditoria_1.textoDoPack)(alvo, estagio ?? undefined));
3432
3682
  return 0;
3433
3683
  }
3434
- console.log(`Packs de auditoria periodica${estagio ? ` (estagio declarado do projeto: ${estagio})` : ''}`);
3684
+ console.log(m.packs.titulo(estagio ?? undefined));
3435
3685
  console.log('');
3436
3686
  console.log((0, auditoria_1.tabelaDePacks)(estagio ?? undefined));
3437
3687
  if (estagio) {
3438
3688
  console.log('');
3439
- console.log(`Ativos aqui e agora: ${(0, auditoria_1.packsAtivos)(estagio).join(', ')}`);
3440
- console.log(`Postura: ${(0, auditoria_1.posturaDoPack)(estagio)}`);
3689
+ console.log(m.packs.ativo((0, auditoria_1.packsAtivos)(estagio).join(', ')));
3690
+ console.log(m.packs.postura((0, auditoria_1.posturaDoPack)(estagio)));
3441
3691
  }
3442
3692
  return 0;
3443
3693
  }
@@ -3445,25 +3695,24 @@ function comandoAudit(args) {
3445
3695
  const raiz = (0, manifest_1.carregarManifesto)()?.raiz;
3446
3696
  const templates = (0, auditoria_1.carregarTemplatesDeAuditoria)(raiz);
3447
3697
  const problemas = templates.flatMap((t) => (0, auditoria_1.lintTemplateDeAuditoria)(t));
3448
- console.log(`Lint dos templates de auditoria${raiz ? ` (projeto ${raiz})` : ' (somente embutidos)'}`);
3698
+ console.log(m.cli.lintTitulo(raiz));
3449
3699
  console.log('');
3450
3700
  for (const p of problemas) {
3451
- console.log(` [${p.gravidade}] ${p.template} :: ${p.regra}`);
3452
- console.log(` ${p.detalhe}`);
3701
+ console.log(m.cli.lintItem(p.gravidade, p.template, p.regra));
3702
+ console.log(m.cli.lintDetalhe(p.detalhe));
3453
3703
  }
3454
3704
  if (problemas.length === 0)
3455
- console.log(` nenhum problema em ${templates.length} template(s)`);
3705
+ console.log(m.cli.lintOk(templates.length));
3456
3706
  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}`);
3707
+ console.log(m.cli.lintResumo(templates.length, problemas.filter((p) => p.gravidade === 'erro').length, problemas.filter((p) => p.gravidade === 'aviso').length));
3459
3708
  return problemas.some((p) => p.gravidade === 'erro') ? 2 : 0;
3460
3709
  }
3461
3710
  const carregado = (0, manifest_1.exigirManifesto)();
3462
3711
  if (sub === 'run') {
3463
3712
  const pack = (0, auditoria_1.parsePack)(args.posicionais[2]);
3464
3713
  if (!pack) {
3465
- console.error('uso: ork audit run <pack> [--profile P] [--since Nd]');
3466
- console.error(` packs: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3714
+ console.error(m.uso('run'));
3715
+ console.error(m.cli.packs(auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3467
3716
  return 2;
3468
3717
  }
3469
3718
  const autorizar = args.opcoes.agora;
@@ -3478,15 +3727,15 @@ function comandoAudit(args) {
3478
3727
  forcar: args.opcoes.forcar === true || args.opcoes.force === true,
3479
3728
  });
3480
3729
  if (r.status === 'bloqueada') {
3481
- console.error(`Rodada de auditoria ${r.id} BLOQUEADA.`);
3730
+ console.error(m.cli.bloqueada(r.id));
3482
3731
  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`);
3732
+ console.error(m.cli.motivo(String(r.motivo)));
3733
+ console.error(m.cli.detalhe(r.detalhe));
3734
+ console.error(m.cli.estado(r.id));
3486
3735
  return 1;
3487
3736
  }
3488
3737
  if (r.status === 'ensaio') {
3489
- console.log(`Simulacao (--dry-run) da rodada ${r.id}: nada foi despachado.`);
3738
+ console.log(m.cli.ensaio(r.id));
3490
3739
  console.log(` pack ${r.pack} (postura ${r.postura} no estagio ${r.estagio})`);
3491
3740
  console.log(` escopo ${r.escopo.detalhe}`);
3492
3741
  console.log(` graphify ${r.escopo.graphify}`);
@@ -3495,11 +3744,11 @@ function comandoAudit(args) {
3495
3744
  console.log(` comando claude --bg "<prompt>" --name ${r.slug} --model ${r.custo.model} --effort ${r.custo.effort}`);
3496
3745
  if (r.superficie) {
3497
3746
  console.log(` superficie ${r.superficie.detalhe}`);
3498
- console.log(` nada registrado no board (--dry-run). Para gravar: ork audit surface --registrar ${r.id}`);
3747
+ console.log(m.cli.superficieDry(r.id));
3499
3748
  }
3500
3749
  return 0;
3501
3750
  }
3502
- console.log(`Rodada de auditoria ${r.id} despachada pelo runtime adapter ${r.runtime}.`);
3751
+ console.log(m.cli.despachada(r.id, r.runtime));
3503
3752
  console.log(` pack ${r.pack} (${auditoria_1.PACKS[r.pack].titulo})`);
3504
3753
  console.log(` produto ${r.produto} (perfil ${r.perfil}), estagio ${r.estagio}, postura ${r.postura}`);
3505
3754
  console.log(` escopo ${r.escopo.detalhe}`);
@@ -3508,23 +3757,20 @@ function comandoAudit(args) {
3508
3757
  console.log(` janela ${r.custo.janela.detalhe}`);
3509
3758
  console.log(` sessionId ${r.sessionId}`);
3510
3759
  console.log(` prompt ${r.promptPath} (sha256 ${r.promptSha256})`);
3511
- console.log(` verificada no runtime: ${r.verificada ? 'sim' : 'NAO (confira `ork sessions`)'}`);
3760
+ console.log(m.cli.verificada(r.verificada));
3512
3761
  if (r.superficie) {
3513
3762
  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
- : ''));
3763
+ console.log(m.cli.superficieBoard(r.superficie.registrados, r.superficie.aConfirmar));
3518
3764
  }
3519
3765
  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}`);
3766
+ console.log(m.cli.proposta);
3767
+ console.log(m.cli.depois(r.id));
3522
3768
  return r.verificada ? 0 : 1;
3523
3769
  }
3524
3770
  if (sub === 'list') {
3525
3771
  console.log((0, auditrun_1.tabelaDeRodadas)(carregado.raiz));
3526
3772
  console.log('');
3527
- console.log(`Board de divida: ${(0, auditrun_1.resumoDoBoard)(carregado.raiz)}`);
3773
+ console.log(m.cli.board((0, auditrun_1.resumoDoBoard)(carregado.raiz)));
3528
3774
  return 0;
3529
3775
  }
3530
3776
  if (sub === 'show') {
@@ -3533,7 +3779,7 @@ function comandoAudit(args) {
3533
3779
  return recusarSobraDoObjective(sobra);
3534
3780
  const id = args.posicionais[2];
3535
3781
  if (!id) {
3536
- console.error('uso: ork audit show <rodada> [--ledger]');
3782
+ console.error(m.uso('show'));
3537
3783
  return 2;
3538
3784
  }
3539
3785
  if (args.opcoes.ledger === true) {
@@ -3546,8 +3792,8 @@ function comandoAudit(args) {
3546
3792
  if (sub === 'prompt') {
3547
3793
  const pack = (0, auditoria_1.parsePack)(args.posicionais[2]);
3548
3794
  if (!pack) {
3549
- console.error('uso: ork audit prompt <pack> [--since Nd]');
3550
- console.error(` packs: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3795
+ console.error(m.uso('prompt'));
3796
+ console.error(m.cli.packs(auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3551
3797
  return 2;
3552
3798
  }
3553
3799
  const { raiz, manifesto } = carregado;
@@ -3580,16 +3826,16 @@ function comandoAudit(args) {
3580
3826
  const id = args.posicionais[2];
3581
3827
  const arquivo = texto(args.opcoes.arquivo) ?? texto(args.opcoes.file);
3582
3828
  if (!id || !arquivo) {
3583
- console.error('uso: ork audit ingest <rodada> --arquivo <achados.json>');
3829
+ console.error(m.uso('ingest'));
3584
3830
  return 2;
3585
3831
  }
3586
3832
  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.`);
3833
+ console.log(m.cli.ingestao(r.rodada, r.registrados.length));
3588
3834
  // Bloco B6: cada proposta enderecada ao roadmap tambem vai para a colecao `roadmap`.
3589
3835
  if (r.registrados.length > 0) {
3590
3836
  const naMemoria = (0, memoria_1.publicarPropostas)(carregado, r.registrados);
3591
3837
  if (naMemoria.regime === 'orkmind') {
3592
- console.log(`Memoria (orkmind): propostas na colecao roadmap, ${naMemoria.detalhe}.`);
3838
+ console.log(m.cli.memoriaMuitas(naMemoria.detalhe));
3593
3839
  }
3594
3840
  }
3595
3841
  for (const a of r.registrados) {
@@ -3597,18 +3843,17 @@ function comandoAudit(args) {
3597
3843
  }
3598
3844
  if (r.duplicados.length > 0) {
3599
3845
  console.log('');
3600
- console.log('Ja registrados nesta rodada, ignorados (a ingestao e idempotente): ' +
3601
- r.duplicados.map((a) => a.id).join(', '));
3846
+ console.log(m.cli.duplicados(r.duplicados.map((a) => a.id).join(', ')));
3602
3847
  }
3603
3848
  if (r.recusados.length > 0) {
3604
3849
  console.log('');
3605
- console.error(`RECUSADOS (${r.recusados.length}):`);
3850
+ console.error(m.cli.recusados(r.recusados.length));
3606
3851
  for (const rec of r.recusados) {
3607
- console.error(` achado #${rec.indice + 1}: ${rec.erro}`);
3852
+ console.error(m.cli.recusado(rec.indice + 1, rec.erro));
3608
3853
  }
3609
3854
  }
3610
3855
  console.log('');
3611
- console.log(`Prove os achados antes de qualquer thread: ork audit verify ${r.rodada}`);
3856
+ console.log(m.cli.prove(r.rodada));
3612
3857
  return r.recusados.length > 0 ? 1 : 0;
3613
3858
  }
3614
3859
  if (sub === 'finding' || sub === 'achado') {
@@ -3633,11 +3878,11 @@ function comandoAudit(args) {
3633
3878
  irreversivel: texto(args.opcoes.irreversivel) ?? 'nenhum',
3634
3879
  estimativa: texto(args.opcoes.estimativa),
3635
3880
  });
3636
- console.log(`Achado ${achado.id} registrado no board de divida da rodada ${id}.`);
3881
+ console.log(m.cli.achadoRegistrado(achado.id, id));
3637
3882
  console.log((0, divida_1.textoDoAchado)(achado));
3638
3883
  const naMemoria = (0, memoria_1.publicarPropostas)(carregado, [achado]);
3639
3884
  if (naMemoria.regime === 'orkmind') {
3640
- console.log(`Memoria (orkmind): proposta na colecao roadmap, ${naMemoria.detalhe}.`);
3885
+ console.log(m.cli.memoriaUma(naMemoria.detalhe));
3641
3886
  }
3642
3887
  return 0;
3643
3888
  }
@@ -3649,66 +3894,66 @@ function comandoAudit(args) {
3649
3894
  return 2;
3650
3895
  }
3651
3896
  if (estado === 'virou-thread') {
3652
- console.error('o estado `virou-thread` e carimbado pelo proprio `ork thread new --from-finding`.');
3897
+ console.error(m.cli.estadoReservado);
3653
3898
  return 2;
3654
3899
  }
3655
3900
  const achado = (0, divida_1.exigirAchado)(carregado.raiz, id);
3656
3901
  const atualizado = (0, divida_1.carimbarAchado)(carregado.raiz, achado, { estado });
3657
- console.log(`Achado ${atualizado.id} agora esta ${atualizado.estado}.`);
3902
+ console.log(m.cli.achadoEstado(atualizado.id, atualizado.estado));
3658
3903
  console.log((0, divida_1.textoDoAchado)(atualizado));
3659
3904
  return 0;
3660
3905
  }
3661
- console.error(`subcomando desconhecido: audit finding ${acao ?? ''}`);
3906
+ console.error(m.cli.findingDesconhecido(acao ?? ''));
3662
3907
  return 2;
3663
3908
  }
3664
3909
  if (sub === 'verify') {
3665
3910
  const id = args.posicionais[2];
3666
3911
  if (!id) {
3667
- console.error('uso: ork audit verify <rodada>');
3912
+ console.error(m.uso('verify'));
3668
3913
  return 2;
3669
3914
  }
3670
3915
  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}`);
3916
+ console.log(m.cli.verifyTitulo(v.rodada));
3917
+ console.log(m.cli.verifyHead(v.commit));
3918
+ console.log(m.cli.verifyDir(v.cwd));
3674
3919
  console.log('');
3675
3920
  if (v.resultados.length === 0) {
3676
- console.log(' (nenhum achado aberto nesta rodada)');
3921
+ console.log(m.cli.verifyVazio);
3677
3922
  }
3678
3923
  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'}`);
3924
+ console.log(m.cli.verifyClaim(r.claim.id, r.verificado, r.claim.alegacao));
3925
+ console.log(m.cli.arquivo(r.claim.arquivo));
3926
+ console.log(r.claim.verificar.length > 0 ? m.cli.comandos(r.claim.verificar.join(' && ')) : m.cli.semComando);
3682
3927
  if (!r.verificado)
3683
- console.log(` motivo tipado: ${r.motivo} (${r.detalhe})`);
3928
+ console.log(m.cli.motivoDetalhe(String(r.motivo), r.detalhe));
3684
3929
  }
3685
3930
  console.log('');
3686
3931
  console.log(v.ok
3687
- ? 'Veredito: ACHADOS SUSTENTADOS (o auditor provou o que alegou).'
3688
- : `Veredito: REPROVADO. Motivos tipados: ${v.motivos.join(', ')}`);
3932
+ ? m.cli.vereditoOk
3933
+ : m.cli.vereditoRuim(v.motivos.join(', ')));
3689
3934
  if (v.motivos.includes('claims.unverifiable')) {
3690
- console.log(' aviso: achado sem comando de verificacao avisa e nao bloqueia (regra do gate do B1).');
3935
+ console.log(m.cli.unverifiable);
3691
3936
  }
3692
3937
  return v.ok ? 0 : 1;
3693
3938
  }
3694
3939
  if (sub === 'report' || sub === 'relatorio') {
3695
3940
  const id = args.posicionais[2];
3696
3941
  if (!id) {
3697
- console.error('uso: ork audit report <rodada> [--publicar]');
3942
+ console.error(m.uso('report'));
3698
3943
  return 2;
3699
3944
  }
3700
3945
  const r = (0, auditrun_1.relatorioDaRodada)(carregado, id, { publicar: args.opcoes.publicar === true });
3701
3946
  console.log(r.texto);
3702
- console.log(`(relatorio gravado em ${r.caminho})`);
3947
+ console.log(m.cli.relatorio(r.caminho));
3703
3948
  if (r.publicado)
3704
- console.log(`(publicado em ${r.publicado})`);
3949
+ console.log(m.cli.publicado(r.publicado));
3705
3950
  return 0;
3706
3951
  }
3707
3952
  if (sub === 'divida' || sub === 'board') {
3708
3953
  const bruto = texto(args.opcoes.pack);
3709
3954
  const pack = bruto ? (0, auditoria_1.parsePack)(bruto) : undefined;
3710
3955
  if (bruto && !pack) {
3711
- console.error(`pack desconhecido: "${bruto}". Use um de: ${auditoria_1.ORDEM_DOS_PACKS.join(', ')}`);
3956
+ console.error(m.erro.pack(bruto, auditoria_1.ORDEM_DOS_PACKS.join(', ')));
3712
3957
  return 2;
3713
3958
  }
3714
3959
  console.log((0, divida_1.tabelaDaDivida)(carregado.raiz, {
@@ -3724,14 +3969,14 @@ function comandoAudit(args) {
3724
3969
  if (sub === 'surface' || sub === 'superficie') {
3725
3970
  const bruta = texto(args.opcoes.regra);
3726
3971
  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(', ')}`);
3972
+ console.error(m.erro.regra(bruta, superficie_1.REGRAS_DE_SUPERFICIE.join(', ')));
3728
3973
  return 2;
3729
3974
  }
3730
3975
  const regra = bruta ? bruta.toUpperCase() : undefined;
3731
3976
  const limiteBruto = texto(args.opcoes.limite);
3732
3977
  const limite = limiteBruto ? Number(limiteBruto) : undefined;
3733
3978
  if (limite !== undefined && (!Number.isFinite(limite) || limite < 1)) {
3734
- console.error(`--limite invalido: "${limiteBruto}". Use um inteiro >= 1.`);
3979
+ console.error(m.erro.limite(limiteBruto ?? ''));
3735
3980
  return 2;
3736
3981
  }
3737
3982
  const rodadaAlvo = texto(args.opcoes.registrar);
@@ -3739,17 +3984,17 @@ function comandoAudit(args) {
3739
3984
  const r = (0, auditrun_1.varrerSuperficieDaRodada)(carregado, rodadaAlvo, { registrar: true, limitePorRegra: limite });
3740
3985
  console.log((0, superficie_1.textoDaVarredura)(r.resultado));
3741
3986
  console.log('');
3742
- console.log(`Rodada ${r.rodada}: ${r.registrados.length} achado(s) registrado(s) no board de divida.`);
3987
+ console.log(m.cli.rodadaRegistrada(r.rodada, r.registrados.length));
3743
3988
  for (const a of r.registrados)
3744
3989
  console.log(` ${a.id} ${a.regra} ${a.arquivo}:${a.linha} ${a.titulo}`);
3745
3990
  if (r.duplicados.length > 0) {
3746
- console.log(` ja registrados nesta rodada: ${r.duplicados.map((a) => a.id).join(', ')}`);
3991
+ console.log(m.cli.jaRegistrados(r.duplicados.map((a) => a.id).join(', ')));
3747
3992
  }
3748
3993
  for (const rec of r.recusados) {
3749
- console.error(` RECUSADO ${rec.achado.regra} ${rec.achado.arquivo}:${rec.achado.linha}: ${rec.erro}`);
3994
+ console.error(m.cli.recusadoSuperficie(rec.achado.regra, rec.achado.arquivo, rec.achado.linha, rec.erro));
3750
3995
  }
3751
3996
  console.log('');
3752
- console.log(`Prove os achados antes de qualquer thread: ork audit verify ${r.rodada}`);
3997
+ console.log(m.cli.prove(r.rodada));
3753
3998
  if (r.recusados.length > 0)
3754
3999
  return 1;
3755
4000
  return r.registrados.length > 0 ? 1 : 0;
@@ -3768,7 +4013,7 @@ function comandoAudit(args) {
3768
4013
  // Codigo != 0 com achado: o agendador do host percebe a superficie aberta sem ler texto.
3769
4014
  return resultado.achados.length > 0 ? 1 : 0;
3770
4015
  }
3771
- console.error(`subcomando desconhecido: audit ${sub}`);
4016
+ console.error(m.uso(sub));
3772
4017
  return 2;
3773
4018
  }
3774
4019
  /** Roteia o comando. Devolve o codigo de saida do processo. */
@@ -3812,19 +4057,19 @@ function comandoRecall(args) {
3812
4057
  const carregado = (0, project_state_1.memoryState)((0, manifest_1.exigirManifesto)()).loaded;
3813
4058
  const id = args.posicionais[1];
3814
4059
  if (!id) {
3815
- console.error('uso: ork recall <thread-id> [--fase FASE] [--id ptr-N] [--todos] [--forcar]');
4060
+ console.error((0, locale_1.msg)().operacao.restante.recall.uso);
3816
4061
  return 2;
3817
4062
  }
3818
4063
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
3819
4064
  const faseBruta = texto(args.opcoes.fase) ?? texto(args.opcoes.momento);
3820
4065
  const momento = faseBruta ? (0, thread_1.exigirFase)(thread, faseBruta) : undefined;
3821
4066
  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, {
4067
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, recall_1.recallDaThread)(carregado, memoria, id, {
3823
4068
  momento,
3824
4069
  id: texto(args.opcoes.id),
3825
4070
  todos: args.opcoes.todos === true,
3826
4071
  forcar: args.opcoes.forcar === true,
3827
- });
4072
+ }));
3828
4073
  if (args.opcoes.json === true) {
3829
4074
  console.log(JSON.stringify(r, null, 2));
3830
4075
  }
@@ -3839,15 +4084,16 @@ function comandoMemory(args) {
3839
4084
  const candidate = (0, manifest_1.exigirManifesto)();
3840
4085
  const carregado = (0, project_state_1.memoryState)(candidate).loaded;
3841
4086
  const sub = args.posicionais[1] ?? 'status';
4087
+ const mm = (0, locale_1.msg)().operacao.restante.memory.cli;
3842
4088
  const escopo = texto(args.opcoes.escopo)?.split(',').map(s => s.trim());
3843
4089
  if (sub === 'inventory' || (sub === 'migrate' && args.opcoes['dry-run'] === true)) {
3844
4090
  const r = (0, memory_migration_1.inventariarHandoffs)(carregado, escopo);
3845
4091
  if (args.opcoes.json === true)
3846
4092
  console.log(JSON.stringify(r, null, 2));
3847
4093
  else {
3848
- console.log(`Inventario do tenant ${r.tenant}: ${r.incluidos} incluidos, ${r.excluidos} excluidos.`);
4094
+ console.log(mm.inventario(r.tenant, r.incluidos, r.excluidos));
3849
4095
  for (const f of r.fontes)
3850
- console.log(` ${f.incluir ? 'incluir' : 'excluir'} ${f.arquivo}: ${f.motivo}`);
4096
+ console.log(mm.fonte(f.incluir, f.arquivo, f.motivo));
3851
4097
  }
3852
4098
  return r.fontes.some(f => f.bloqueante) ? 1 : 0;
3853
4099
  }
@@ -3864,7 +4110,7 @@ function comandoMemory(args) {
3864
4110
  if (args.opcoes.json === true)
3865
4111
  console.log(JSON.stringify(r, null, 2));
3866
4112
  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.`);
4113
+ console.log(mm.migracao(r.inventario.tenant, r.resultados.filter(i => i.ok).length, r.falhas, r.inventario.excluidos));
3868
4114
  for (const item of r.resultados)
3869
4115
  console.log(` ${item.arquivo}: ${item.ok ? item.gravacao?.id : item.erro}`);
3870
4116
  }
@@ -3905,13 +4151,13 @@ function comandoMemory(args) {
3905
4151
  const motivo = error instanceof Error
3906
4152
  ? /^(?:write\.activation|scope|memory)\.[a-z.-]+/.exec(error.message)?.[0] ?? 'write.activation.invalid'
3907
4153
  : 'write.activation.invalid';
3908
- const detalhe = 'sync nao executado; colisao legada nao foi reavaliada';
4154
+ const detalhe = (0, locale_1.comLocale)('pt-BR', () => (0, locale_1.textoDoCatalogo)(m => m.operacao.restante.memory.cli.syncDetalhe));
3909
4155
  if (args.opcoes.json === true)
3910
4156
  console.log(JSON.stringify({
3911
4157
  regime: memoria.regime, estado: memoria.estado, thread: threadId ?? null, perfil,
3912
4158
  publicacao: { estado: 'pendente', motivo }, falhas: 1, gravadas: [], erro: motivo, detalhe,
3913
4159
  }, null, 2));
3914
- console.error(`${motivo}: ${detalhe}`);
4160
+ console.error(`${motivo}: ${(0, locale_1.remontar)(detalhe)}`);
3915
4161
  return 1;
3916
4162
  }
3917
4163
  }
@@ -3935,7 +4181,7 @@ function comandoMemory(args) {
3935
4181
  const janela = limiteDeLeitura(args.opcoes.janela);
3936
4182
  const tagsBrutas = texto(args.opcoes.tags);
3937
4183
  if (!tagsBrutas) {
3938
- console.error('uso: ork memory search --tags \'{"project":["orkastery"],"skill":["orkastery-decision"]}\'');
4184
+ console.error(mm.tagsUso);
3939
4185
  return 2;
3940
4186
  }
3941
4187
  let tags;
@@ -3943,7 +4189,7 @@ function comandoMemory(args) {
3943
4189
  tags = JSON.parse(tagsBrutas);
3944
4190
  }
3945
4191
  catch (e) {
3946
- console.error(`--tags nao e JSON valido: ${e.message}`);
4192
+ console.error(mm.tagsInvalidas(e.message));
3947
4193
  return 2;
3948
4194
  }
3949
4195
  const colecao = texto(args.opcoes.colecao) ?? texto(args.opcoes.collection);
@@ -3960,16 +4206,16 @@ function comandoMemory(args) {
3960
4206
  limite,
3961
4207
  });
3962
4208
  if (threadId && memoria.regime === 'files')
3963
- console.error(`memory.query.files: ${memoria.estado.motivo}; resultado nao comprova ausencia na memoria semantica`);
4209
+ console.error(mm.files(`${memoria.estado.motivo}`));
3964
4210
  if (args.opcoes.json === true) {
3965
4211
  console.log(JSON.stringify(entradas, null, 2));
3966
4212
  return 0;
3967
4213
  }
3968
- console.log(`Busca deterministica por tag (regime ${memoria.regime})`);
4214
+ console.log(mm.buscaTag(memoria.regime));
3969
4215
  console.log('');
3970
4216
  if (memoria.regime === 'files') {
3971
4217
  console.log(` ${memoria.estado.detalhe}`);
3972
- console.log(` correcao: ${memoria.estado.correcao}`);
4218
+ console.log(mm.correcao(memoria.estado.correcao));
3973
4219
  return 0;
3974
4220
  }
3975
4221
  for (const e of entradas) {
@@ -3977,13 +4223,13 @@ function comandoMemory(args) {
3977
4223
  console.log(` ${e.content.split('\n')[0].slice(0, 100)}`);
3978
4224
  }
3979
4225
  console.log('');
3980
- console.log(` ${entradas.length} entrada(s)`);
4226
+ console.log(mm.entradas(entradas.length));
3981
4227
  return 0;
3982
4228
  }
3983
4229
  if (sub === 'index') {
3984
4230
  const modelo = texto(args.opcoes.modelo) ?? 'primario';
3985
4231
  if (!['primario', 'fallback', 'todos'].includes(modelo)) {
3986
- console.error('uso: ork memory index [--modelo primario|fallback|todos] [--dry-run] [--json]');
4232
+ console.error(mm.indexUso);
3987
4233
  return 2;
3988
4234
  }
3989
4235
  const memoria = (0, memoria_1.abrirMemoria)(carregado);
@@ -3992,7 +4238,7 @@ function comandoMemory(args) {
3992
4238
  if (args.opcoes.json === true)
3993
4239
  console.log(JSON.stringify(falha, null, 2));
3994
4240
  else
3995
- console.error(`memory.index: regime ${memoria.regime} (${memoria.estado.motivo}); ${memoria.estado.correcao}`);
4241
+ console.error(mm.indexFalha(memoria.regime, `${memoria.estado.motivo}`, memoria.estado.correcao));
3996
4242
  return 1;
3997
4243
  }
3998
4244
  const config = (0, manifest_1.configDeEmbedding)(carregado.manifesto);
@@ -4005,11 +4251,11 @@ function comandoMemory(args) {
4005
4251
  }
4006
4252
  catch (erro) {
4007
4253
  const motivo = (0, indice_vetorial_1.codigoDaFalha)(erro);
4008
- const detalhe = 'o universo da busca nao foi lido inteiro; nada foi embedado';
4254
+ const detalhe = mm.universoDetalhe;
4009
4255
  if (args.opcoes.json === true)
4010
4256
  console.log(JSON.stringify({ motivo, detalhe }, null, 2));
4011
4257
  else
4012
- console.error(`memory.index: ${motivo}; ${detalhe}`);
4258
+ console.error(mm.universoFalhou(motivo, detalhe));
4013
4259
  return 1;
4014
4260
  }
4015
4261
  const alvos = modelo === 'todos' ? ['primario', 'fallback'] : [modelo];
@@ -4028,7 +4274,7 @@ function comandoMemory(args) {
4028
4274
  }
4029
4275
  return resultados.some(r => !r.dryRun && r.motivo) ? 1 : 0;
4030
4276
  }
4031
- console.error(`subcomando desconhecido: memory ${sub}`);
4277
+ console.error(mm.desconhecido(sub));
4032
4278
  return 2;
4033
4279
  }
4034
4280
  /** Aviso informativo: não consulta rede, não reserva e não bloqueia criação. */
@@ -4043,10 +4289,11 @@ function avisoRoadmapSemAssociacao(nome, roadmap) {
4043
4289
  * Nao combina com --tags nem com a leitura restrita por thread nesta versao (erro tipado).
4044
4290
  */
4045
4291
  function buscaPorTexto(args, carregado) {
4292
+ const mm = (0, locale_1.msg)().operacao.restante.memory.cli;
4046
4293
  const frase = texto(args.opcoes.texto);
4047
4294
  if (args.opcoes.tags !== undefined || args.opcoes.thread !== undefined || args.opcoes.restrito !== undefined ||
4048
4295
  args.opcoes.janela !== undefined) {
4049
- console.error('memory.search.texto-exclusivo: --texto nao combina com --tags, --thread, --restrito nem --janela');
4296
+ console.error(mm.textoExclusivo);
4050
4297
  return 2;
4051
4298
  }
4052
4299
  const modo = (texto(args.opcoes.modo) ?? 'hibrido');
@@ -4056,7 +4303,7 @@ function buscaPorTexto(args, carregado) {
4056
4303
  if (!(0, orkmind_1.textoDeBuscaValido)(frase) || !busca_semantica_1.MODOS_DE_BUSCA.includes(modo) ||
4057
4304
  (colecao !== undefined && !orkmind_1.COLECOES_DO_ORK.includes(colecao)) ||
4058
4305
  !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]`);
4306
+ 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
4307
  return 2;
4061
4308
  }
4062
4309
  const memoria = (0, memoria_1.abrirMemoria)(carregado);
@@ -4079,7 +4326,7 @@ function buscaPorTexto(args, carregado) {
4079
4326
  }
4080
4327
  else if (!universo) {
4081
4328
  // 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' };
4329
+ r = { ...vazio, motivo: falhaDoUniverso, detalhe: mm.buscaUniversoDetalhe };
4083
4330
  }
4084
4331
  else {
4085
4332
  const driver = (0, orkmind_1.configDoManifesto)(carregado.manifesto);
@@ -4127,7 +4374,8 @@ function extrairOpcaoDeProjeto(argv) {
4127
4374
  return { argv: resto, projeto };
4128
4375
  }
4129
4376
  /** 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']);
4377
+ // RM-062 (F1): `privado varrer` le o repositorio do diretorio atual (o checkout do CI, o clone de um site), nao o alvo.
4378
+ const COMANDOS_SEM_PROJETO = new Set(['demo', 'ciclos', 'mcp', 'init', 'projetos', 'privado']);
4131
4379
  /**
4132
4380
  * Fatia 2 (D3): os comandos que leem projeto e nao terminam com a linha `Projeto consultado`. Hoje so
4133
4381
  * o `sessions event`, o sensor dos hooks do Claude Code: maquina falando com maquina, e o sensor compara
@@ -4245,8 +4493,8 @@ function executarComando(argvBruto) {
4245
4493
  delete process.env[nome];
4246
4494
  }
4247
4495
  // 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.
4496
+ // decidem a lingua do TEXTO dos comandos cobertos (`cobreLocale`); `--json` e contrato, e os recortes ainda
4497
+ // fora do catalogo (`doctor --modo` e os subcomandos fora da lista) ficam em pt-BR.
4250
4498
  if ((0, locale_1.cobreLocale)(args.posicionais, args.opcoes)) {
4251
4499
  (0, locale_1.ativarLocale)((0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale);
4252
4500
  (0, locale_1.ligarRemontagem)(true);
@@ -4256,28 +4504,35 @@ function executarComando(argvBruto) {
4256
4504
  const projeto = texto(args.opcoes.project), host = texto(args.opcoes.host), threadId = texto(args.opcoes.thread);
4257
4505
  // I-36 (D4): a identidade do despacho so chega com a thread vinculada da sessao filha.
4258
4506
  const dispatchId = texto(args.opcoes.dispatch);
4259
- const transporteShip = texto(args.opcoes['ship-transport']) ?? 'github-ssh';
4507
+ const transporteDado = texto(args.opcoes['ship-transport']);
4508
+ const transporteShip = transporteDado ?? 'github-ssh';
4509
+ const impressaoSsh = texto(args.opcoes['ssh-fingerprint']);
4260
4510
  const permissoesFilho = texto(args.opcoes['child-permissions']) ?? 'interactive';
4261
4511
  const permissoesDono = texto(args.opcoes['owner-permissions']);
4262
4512
  const acao = args.posicionais[1];
4513
+ // RM-067 (F4b): o grok e host do install e do serve; o servidor dele recusa sem --thread (so a sessao filha).
4263
4514
  if (args.posicionais.length !== 2 || !['serve', 'install'].includes(acao) || !projeto ||
4264
- (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)) ||
4515
+ (host !== 'codex' && host !== 'claude-code' && host !== 'grok') ||
4516
+ 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
4517
  (args.opcoes.dispatch !== undefined && (!threadId || !dispatchId || !/^[a-f0-9-]{36}$/.test(dispatchId))) ||
4267
4518
  argv.filter(a => a === '--ship-transport' || a.startsWith('--ship-transport=')).length > 1 ||
4268
4519
  argv.filter(a => a === '--child-permissions' || a.startsWith('--child-permissions=')).length > 1 ||
4520
+ argv.filter(a => a === '--ssh-fingerprint' || a.startsWith('--ssh-fingerprint=')).length > 1 ||
4521
+ (args.opcoes['ssh-fingerprint'] !== undefined && (transporteShip !== 'forja-ssh' || typeof args.opcoes['ssh-fingerprint'] !== 'string' || !/^SHA256:[A-Za-z0-9+/]{43}$/.test(impressaoSsh ?? ''))) ||
4269
4522
  (args.opcoes['owner-permissions'] !== undefined && (host !== 'codex' || typeof args.opcoes['owner-permissions'] !== 'string' || !['interactive', 'orchestrate'].includes(permissoesDono ?? ''))) ||
4270
4523
  argv.filter(a => a === '--owner-permissions' || a.startsWith('--owner-permissions=')).length > 1 ||
4271
4524
  !['interactive', 'worktree'].includes(permissoesFilho) ||
4272
4525
  (args.opcoes['child-permissions'] !== undefined && typeof args.opcoes['child-permissions'] !== 'string') ||
4273
- !['github-ssh', 'bare-local'].includes(transporteShip) ||
4526
+ !(0, mcp_transportes_1.ehTransporteShipMcp)(transporteShip) ||
4274
4527
  (args.opcoes['ship-transport'] !== undefined && typeof args.opcoes['ship-transport'] !== 'string') ||
4275
4528
  (args.opcoes.thread !== undefined && (!threadId || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(threadId))) ||
4276
4529
  (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]');
4530
+ throw new Error((0, locale_1.msg)().operacao.restante.mcp.uso);
4278
4531
  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; });
4532
+ void Promise.resolve().then(() => __importStar(require('./mcp-install'))).then(({ instalarMcp, textoInstalacaoMcp }) => console.log(textoInstalacaoMcp(instalarMcp({ projeto, host, dryRun: args.opcoes['dry-run'] === true,
4533
+ transporteShip: transporteDado === undefined ? undefined : transporteShip, impressaoSsh,
4534
+ permissoesFilho: permissoesFilho, permissoesDono: permissoesDono }))))
4535
+ .catch(e => { console.error((0, locale_1.msg)().operacao.restante.mcp.erro(e.message)); process.exitCode = 1; });
4281
4536
  return 0;
4282
4537
  }
4283
4538
  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 +4550,20 @@ function executarComando(argvBruto) {
4295
4550
  }
4296
4551
  // RM-031: o check dos analisadores do grafo entra por aqui, a porta da familia do grafo (fronteira do KG1).
4297
4552
  // 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));
4553
+ const analisadores = () => (0, intelligence_graph_cli_1.checarAnalisadoresDoGrafo)(versao_1.VERSAO_DO_ORK, undefined, undefined, (0, locale_1.msg)().doctor.grafo);
4554
+ // `--forja=false` ou `--forja <valor>` nao vira `nao-medida` calado: a flag e booleana.
4555
+ if (args.opcoes.forja !== undefined && args.opcoes.forja !== true) {
4556
+ console.error((0, locale_1.msg)().forja.doctor.flagComValor);
4557
+ return 2;
4558
+ }
4559
+ // RM-063 (fatia 3, H1): `--json` e o contrato `ork.doctor/v1` que a batida do host le, com a idade da batida.
4560
+ if (args.opcoes.json === true) {
4561
+ // A batida dos hosts le o --json com frequencia: a secao forja (rede e CLI) so com --forja.
4562
+ const j = (0, doctor_1.doctorJson)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, analisadores, undefined, args.opcoes.forja === true ? doctor_forja_1.checarForja : undefined);
4563
+ console.log(JSON.stringify(j.json, null, 2));
4564
+ return j.codigo;
4565
+ }
4566
+ const r = (0, doctor_1.doctor)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, analisadores, doctor_forja_1.checarForja);
4299
4567
  console.log(r.texto);
4300
4568
  return r.codigo;
4301
4569
  }
@@ -4358,6 +4626,23 @@ function executarComando(argvBruto) {
4358
4626
  const carregado = (0, manifest_1.carregarManifesto)();
4359
4627
  // I-43: `#Look` no pedido nao pode cair no default em silencio. O adaptador
4360
4628
  // recebe a recusa tipada e saida != 0, e quem escreveu a #TAG fica sabendo.
4629
+ // RM-058 N6 (D1): `#Noctum` é o modo do arco e só vale com envelope vigente; sem ele, recusa tipada, nunca o padrão.
4630
+ if ((0, noctum_modo_1.tagNoctumNoPedido)(pedido)) {
4631
+ let arcos;
4632
+ try {
4633
+ arcos = (0, noctum_modo_1.aceitarModoNoctum)(carregado?.raiz ?? null);
4634
+ }
4635
+ catch (e) {
4636
+ if (e instanceof noctum_envelope_1.RecusaDoArco) {
4637
+ console.error(e.message);
4638
+ return 2;
4639
+ }
4640
+ throw e;
4641
+ }
4642
+ console.log(args.opcoes.json === true ? JSON.stringify({ modo: 'noctum', tag: '#Noctum', daTag: true, origem: 'tag no pedido',
4643
+ arcos, modoDasThreads: 'auto' }) : 'noctum');
4644
+ return 0;
4645
+ }
4361
4646
  const aposentado = (0, modos_1.extrairTagAposentadaDoPedido)(pedido);
4362
4647
  if (aposentado) {
4363
4648
  console.error((0, modos_1.recusaDeModoAposentado)(aposentado));
@@ -4429,20 +4714,31 @@ function executarComando(argvBruto) {
4429
4714
  return comandoLedger(args);
4430
4715
  case 'sessions':
4431
4716
  return comandoSessions(args);
4717
+ case 'noctum':
4718
+ // RM-058 N6: a porta do CLI para o arco #Noctum (propor, responder, status, tique e relatorio).
4719
+ return (0, noctum_cli_1.comandoNoctum)(args);
4432
4720
  case 'pulse': {
4433
4721
  if (args.posicionais[1] === 'responder') {
4434
4722
  // I-41 (GO-FIX 1, B1 e B2): o caminho de volta do resumo. So o ingresso autenticado chama;
4435
4723
  // argv traz identificadores e o envelope assinado vem por stdin, como no `gate answer`.
4436
4724
  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');
4725
+ throw new Error((0, locale_1.msg)().operacao.pulseCadencia.responderUso);
4438
4726
  }
4439
4727
  const carregado = (0, manifest_1.exigirManifesto)();
4440
4728
  const envelope = (0, hitl_gates_1.lerRespostaStdin)({ por: texto(args.opcoes.por), mensagem: texto(args.opcoes.mensagem),
4441
4729
  origem: texto(args.opcoes.origem), canal: texto(args.opcoes.canal), conta: texto(args.opcoes.conta) });
4442
4730
  const formato = texto(args.opcoes.formato);
4443
4731
  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' })));
4732
+ throw new Error((0, locale_1.msg)().operacao.pulseCadencia.responderFormato);
4733
+ // RM-057 (resposta curta, D3; GO-FIX 1, achado 2): a mensagem respondida (reply), `<código>:<id>`, que o gateway
4734
+ // assinou no endereço do pulse; o núcleo só a aceita quando o id é o da mensagem em que a pergunta foi entregue.
4735
+ // GO-FIX 2 (R1): `outra` é a palavra solta em reply a outra mensagem, que o núcleo recusa dizendo por quê.
4736
+ const referencia = args.opcoes['em-resposta-a'];
4737
+ if (referencia !== undefined && !(0, pulse_consentimento_1.referenciaDoReplyValida)(referencia)) {
4738
+ throw new Error((0, locale_1.msg)().operacao.pulseCadencia.responderReferencia);
4739
+ }
4740
+ console.log(JSON.stringify((0, pulse_resposta_1.responderPeloPulse)(carregado.raiz, envelope, { canal: formato ?? 'telegram',
4741
+ ...(typeof referencia === 'string' ? { referencia } : {}) })));
4446
4742
  return 0;
4447
4743
  }
4448
4744
  if (args.posicionais[1] === 'cadencia')
@@ -4464,6 +4760,8 @@ function executarComando(argvBruto) {
4464
4760
  return comandoVerify(args);
4465
4761
  case 'ci':
4466
4762
  return comandoCi(args);
4763
+ case 'privado':
4764
+ return comandoPrivado(args);
4467
4765
  case 'gate':
4468
4766
  return comandoGate(args);
4469
4767
  case 'retry':
@@ -4479,6 +4777,8 @@ function executarComando(argvBruto) {
4479
4777
  console.log(JSON.stringify(result, null, 2));
4480
4778
  return ['ok', 'empty', 'unknown', 'withheld', 'applied', 'rolled-back'].includes(result.state) ? 0 : 1;
4481
4779
  }
4780
+ case 'conhecimento':
4781
+ return comandoConhecimento(args);
4482
4782
  case 'memory':
4483
4783
  return comandoMemory(args);
4484
4784
  case 'grafo': {
@@ -4486,8 +4786,18 @@ function executarComando(argvBruto) {
4486
4786
  const carregado = (0, manifest_1.exigirManifesto)();
4487
4787
  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
4788
  contextoDaThread: (id) => (0, mcp_grafo_1.lerEntradaDaThread)(carregado.raiz, id),
4789
+ // RM-061 (F3d): a familia do grafo nao importa o catalogo (fronteira do KG3); a redacao vem daqui, no locale do comando.
4790
+ textos: (0, locale_1.msg)().grafo,
4489
4791
  escrever: (texto) => console.log(texto) });
4490
4792
  }
4793
+ case 'security-scan': {
4794
+ // Relatorio por SHA no estado da arvore principal; o argv cru depois do comando (o parser e estrito).
4795
+ const carregado = (0, manifest_1.exigirManifesto)();
4796
+ 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),
4797
+ ...(carregado.manifesto.check?.mode ? { modoDoManifesto: carregado.manifesto.check.mode } : {}),
4798
+ ...(carregado.manifesto.check?.agile ? { agile: { osv_scanner: carregado.manifesto.check.agile.osv_scanner,
4799
+ oxlint: carregado.manifesto.check.agile.oxlint } } : {}) });
4800
+ }
4491
4801
  case 'ship':
4492
4802
  return comandoShip(args);
4493
4803
  case 'activation':