@orkastery/cli 0.5.3 → 0.6.0

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