@orkastery/cli 0.5.3 → 0.5.6

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 (212) hide show
  1. package/adapters/claude-code/README.md +158 -0
  2. package/adapters/claude-code/mods/autoridade.json +56 -0
  3. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  4. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  5. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  6. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  7. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  8. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  9. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  10. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  11. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  12. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  13. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  14. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  15. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  16. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  17. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  18. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  19. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  20. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  21. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  22. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  23. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  24. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  25. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  26. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  27. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  28. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  29. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
  30. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  31. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  32. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  33. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  34. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  35. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  36. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  37. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  38. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  39. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  40. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  41. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  42. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  43. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  44. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  45. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  46. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  47. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  48. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  49. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  50. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  51. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  52. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  53. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  54. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  55. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  56. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  57. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  58. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  59. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  60. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  61. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  62. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  63. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  64. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  65. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  66. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  67. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  68. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  69. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  70. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  71. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  72. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  73. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  74. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  75. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  76. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  77. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  78. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  79. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +1 -1
  80. package/adapters/openclaw/README.md +2 -1
  81. package/adapters/openclaw/openclaw.plugin.json +1 -1
  82. package/adapters/openclaw/package.json +1 -1
  83. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  84. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  85. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  86. package/assets/docs-en/produto/README.md +14 -0
  87. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  88. package/assets/docs-en/roadmap/README.md +14 -0
  89. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  90. package/dist/adapters/claude-bg.js +77 -13
  91. package/dist/adapters/codex.js +10 -1
  92. package/dist/agents-md.js +24 -15
  93. package/dist/auditrun.js +17 -2
  94. package/dist/board.js +4 -3
  95. package/dist/branch-de-estado.js +23 -1
  96. package/dist/catalogo.js +33 -0
  97. package/dist/ci.js +13 -7
  98. package/dist/claims-conferir.js +342 -0
  99. package/dist/claims.js +3 -1
  100. package/dist/company-brain-client.js +36 -1
  101. package/dist/company-brain-journal.js +2 -1
  102. package/dist/company-brain-migration.js +36 -1
  103. package/dist/conducao-sentinela.js +388 -0
  104. package/dist/conducao-texto.js +12 -18
  105. package/dist/conducao.js +122 -30
  106. package/dist/conhecimento.js +490 -0
  107. package/dist/docs.js +22 -8
  108. package/dist/doctor-pulse-cron.js +182 -27
  109. package/dist/doctor-rede.js +18 -17
  110. package/dist/doctor.js +115 -111
  111. package/dist/entrega-pr.js +22 -21
  112. package/dist/escopo-escrita.js +10 -1
  113. package/dist/estado-thread.js +23 -1
  114. package/dist/experiencia-instalacao.js +45 -25
  115. package/dist/fabrica-batida.js +310 -0
  116. package/dist/fabrica-estado.js +38 -8
  117. package/dist/fabrica-publicar.js +3 -1
  118. package/dist/fila-pesada.js +444 -0
  119. package/dist/fix.js +3 -2
  120. package/dist/forja.js +1 -1
  121. package/dist/gates.js +3 -28
  122. package/dist/handoff.js +10 -6
  123. package/dist/hitl-local-receipt.js +2 -0
  124. package/dist/hitl-resumo.js +29 -3
  125. package/dist/hitl-tempo-parado.js +4 -4
  126. package/dist/hitl.js +29 -33
  127. package/dist/horario.js +14 -7
  128. package/dist/hosts.js +52 -1
  129. package/dist/impedimento.js +108 -14
  130. package/dist/index.js +623 -521
  131. package/dist/indice.js +7 -1
  132. package/dist/init.js +43 -47
  133. package/dist/instabilidade.js +144 -0
  134. package/dist/integracoes-locais.js +2 -0
  135. package/dist/intelligence-graph-cli.js +92 -21
  136. package/dist/intelligence-graph-contexto.js +56 -17
  137. package/dist/intelligence-graph-contract.js +2 -1
  138. package/dist/intelligence-graph-extract-md.js +56 -4
  139. package/dist/intelligence-graph-extract-ts.js +71 -3
  140. package/dist/intelligence-graph-query.js +66 -19
  141. package/dist/ledger.js +15 -1
  142. package/dist/liveness.js +6 -3
  143. package/dist/locale-ajuda.js +761 -0
  144. package/dist/locale-gerados.js +160 -0
  145. package/dist/locale-master.js +99 -0
  146. package/dist/locale-onboarding.js +92 -0
  147. package/dist/locale-phase.js +151 -0
  148. package/dist/locale-pulse.js +211 -0
  149. package/dist/locale-retry.js +385 -0
  150. package/dist/locale-roadmap.js +102 -0
  151. package/dist/locale-ship.js +494 -0
  152. package/dist/locale-thread.js +277 -0
  153. package/dist/locale-verify.js +125 -0
  154. package/dist/locale.js +714 -0
  155. package/dist/manifest.js +129 -3
  156. package/dist/maquina.js +23 -4
  157. package/dist/master-digest.js +6 -1
  158. package/dist/master-nota.js +4 -6
  159. package/dist/master.js +21 -24
  160. package/dist/mcp-artifacts.js +11 -2
  161. package/dist/mcp-git.js +23 -6
  162. package/dist/mcp-grafo.js +7 -4
  163. package/dist/mcp-server.js +8 -2
  164. package/dist/mcp-ship.js +3 -1
  165. package/dist/mcp-verify.js +6 -1
  166. package/dist/modos.js +3 -6
  167. package/dist/network-roadmap.js +5 -2
  168. package/dist/noctum-arco.js +911 -0
  169. package/dist/noctum-capacidade.js +141 -0
  170. package/dist/noctum-envelope.js +810 -0
  171. package/dist/noctum-execucao.js +304 -0
  172. package/dist/noctum-fila.js +280 -0
  173. package/dist/ocupacao.js +29 -2
  174. package/dist/onboarding.js +40 -21
  175. package/dist/orkmind.js +9 -2
  176. package/dist/orquestracao.js +13 -12
  177. package/dist/parado-no-condutor.js +34 -9
  178. package/dist/phase.js +94 -39
  179. package/dist/policies.js +4 -4
  180. package/dist/portfolio.js +4 -2
  181. package/dist/postura-local.js +234 -0
  182. package/dist/preflight.js +11 -10
  183. package/dist/procedencia.js +225 -0
  184. package/dist/projeto-alvo.js +127 -4
  185. package/dist/prompts.js +6 -2
  186. package/dist/pulse-delivery.js +13 -2
  187. package/dist/pulse.js +52 -19
  188. package/dist/ratelimit.js +4 -2
  189. package/dist/redacao-saida.js +63 -0
  190. package/dist/rede-status.js +3 -2
  191. package/dist/retry.js +232 -148
  192. package/dist/roadmap-reservas.js +20 -3
  193. package/dist/roadmap-status.js +129 -33
  194. package/dist/runtime-context.js +181 -3
  195. package/dist/runtimes.js +2 -1
  196. package/dist/session-events.js +7 -3
  197. package/dist/session-watcher-claude.js +7 -1
  198. package/dist/session-watcher.js +185 -33
  199. package/dist/sessoes-contas.js +1 -1
  200. package/dist/ship-publicar.js +800 -0
  201. package/dist/ship.js +84 -81
  202. package/dist/steal.js +77 -0
  203. package/dist/thread-close.js +3 -2
  204. package/dist/thread.js +153 -82
  205. package/dist/util.js +8 -1
  206. package/dist/verify.js +141 -52
  207. package/dist/vida-da-thread.js +254 -0
  208. package/dist/worktree-local.js +165 -0
  209. package/dist/worktree.js +20 -0
  210. package/dist/yaml.js +27 -8
  211. package/package.json +1 -1
  212. package/schemas/code-artifact-graph.v1.schema.json +2 -1
package/dist/index.js CHANGED
@@ -93,6 +93,7 @@ const orquestracao_1 = require("./orquestracao");
93
93
  const divida_1 = require("./divida");
94
94
  const ciclos_1 = require("./ciclos");
95
95
  const claims_1 = require("./claims");
96
+ const claims_conferir_1 = require("./claims-conferir");
96
97
  const catalogo_1 = require("./catalogo");
97
98
  const doctor_1 = require("./doctor");
98
99
  const preflight_1 = require("./preflight");
@@ -118,7 +119,7 @@ const horario_1 = require("./horario");
118
119
  const onboarding_1 = require("./onboarding");
119
120
  const experiencia_1 = require("./experiencia");
120
121
  const hosts_2 = require("./hosts");
121
- const init_2 = require("./init");
122
+ const locale_1 = require("./locale");
122
123
  const memoria_1 = require("./memoria");
123
124
  const orkmind_1 = require("./orkmind");
124
125
  const indice_vetorial_1 = require("./indice-vetorial");
@@ -137,6 +138,7 @@ const runtime_profiles_1 = require("./runtime-profiles");
137
138
  const claude_bg_1 = require("./adapters/claude-bg");
138
139
  const codex_1 = require("./adapters/codex");
139
140
  const conducao_1 = require("./conducao");
141
+ const conducao_sentinela_1 = require("./conducao-sentinela");
140
142
  const phase_1 = require("./phase");
141
143
  const prompts_1 = require("./prompts");
142
144
  const sessoes_2 = require("./sessoes");
@@ -150,6 +152,7 @@ const fabrica_estado_1 = require("./fabrica-estado");
150
152
  const branch_de_estado_1 = require("./branch-de-estado");
151
153
  const network_roadmap_1 = require("./network-roadmap");
152
154
  const fabrica_publicar_1 = require("./fabrica-publicar");
155
+ const fabrica_batida_1 = require("./fabrica-batida");
153
156
  const maquina_1 = require("./maquina");
154
157
  const rede_1 = require("./rede");
155
158
  const rede_adesao_1 = require("./rede-adesao");
@@ -160,12 +163,16 @@ const ledger_1 = require("./ledger");
160
163
  const tokens_1 = require("./tokens");
161
164
  const types_1 = require("./types");
162
165
  const verify_1 = require("./verify");
166
+ const fila_pesada_1 = require("./fila-pesada");
163
167
  const worktree_1 = require("./worktree");
164
168
  const claim_lint_1 = require("./claim-lint");
165
169
  const licoes_1 = require("./licoes");
166
170
  const demo_1 = require("./demo");
167
171
  const entrega_pr_1 = require("./entrega-pr");
172
+ const ship_publicar_1 = require("./ship-publicar");
168
173
  const projeto_alvo_1 = require("./projeto-alvo");
174
+ const worktree_local_1 = require("./worktree-local");
175
+ const postura_local_1 = require("./postura-local");
169
176
  /** A versao publicada em `@orkastery/cli`, lida do package.json (`versao.ts`). */
170
177
  // Antes de qualquer arquivo ou despacho: sem escrita de grupo nem de outros, que o sensor recusaria.
171
178
  (0, preflight_1.endurecerUmask)();
@@ -201,13 +208,22 @@ function parseArgs(argv) {
201
208
  function texto(v) {
202
209
  return typeof v === 'string' ? v : undefined;
203
210
  }
211
+ /**
212
+ * RM-058 N2 (A1 da rodada 2 do CHECK): a fila de recursos pesados de um comando que verifica por dentro, pelo `--esperar`
213
+ * dele, com o aviso no stderr e o comando que a recusa sugere. Sem `--esperar`, vale o padrão curto do verify.
214
+ */
215
+ function filaPesadaDoCli(args, operacao, comandoDeEsperar) {
216
+ const m = (0, locale_1.msg)().verify;
217
+ return { esperarMs: conducaoDoCli(args).esperarMs, comandoDeEsperar,
218
+ aoEsperar: (ocupantes) => console.error(m.filaPesadaEsperando(operacao, ocupantes.map((o) => m.filaPesadaOcupante(o.operacao, o.thread, (0, horario_1.formatarDataHora)(o.desde))).join('; '))) };
219
+ }
204
220
  /**
205
221
  * I-36 (D2, D6): o que o CLI declara sobre a conducao. `--canal` (sem ele, o que a borda exporta),
206
222
  * `--correlacao` (conversa ou mensagem de origem) e `--esperar [minutos]` (sem valor, 30).
207
223
  */
208
224
  function conducaoDoCli(args) {
209
225
  if (args.opcoes.canal === true)
210
- throw new Error('uso: --canal <claude-code|hermes|openclaw|codex|mcp|cli>');
226
+ throw new Error((0, locale_1.msg)().phase.canalUso);
211
227
  const bruto = args.opcoes.esperar;
212
228
  let esperarMs;
213
229
  if (bruto === true)
@@ -215,368 +231,38 @@ function conducaoDoCli(args) {
215
231
  else if (typeof bruto === 'string') {
216
232
  const minutos = Number(bruto);
217
233
  if (!Number.isFinite(minutos) || minutos <= 0 || minutos > 24 * 60)
218
- throw new Error('uso: --esperar [minutos], de 1 a 1440 (sem valor, 30)');
234
+ throw new Error((0, locale_1.msg)().phase.esperarUso);
219
235
  esperarMs = Math.round(minutos * 60_000);
220
236
  }
221
237
  return { canal: (0, conducao_1.canalDoProcesso)(texto(args.opcoes.canal)), correlacao: texto(args.opcoes.correlacao) ?? null, esperarMs };
222
238
  }
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
- `;
239
+ /** RM-061 (F2a): o que a ajuda interpola; a redacao mora no catalogo (`msg().ajuda`, D10). */
240
+ function dadosDaAjuda(locale = (0, locale_1.localeAtivo)()) {
241
+ return { versao: VERSAO, modos: modos_1.ORDEM_DOS_MODOS.length, segredos: (0, locale_1.msg)(locale).onboarding.segredos,
242
+ tags: modos_1.ORDEM_DOS_MODOS.map((m) => modos_1.MODOS[m].tag).join(' ') };
243
+ }
244
+ /** A ajuda em pt-BR, o texto de sempre: o `docs verificar` a compara com a referencia do CLI. */
245
+ const AJUDA = (0, locale_1.msg)('pt-BR').ajuda.texto(dadosDaAjuda('pt-BR'));
246
+ /**
247
+ * RM-061 (F2a): a ajuda segue o locale como os comandos cobertos: `owner.language` do projeto de
248
+ * `--projeto` ou do diretorio, senao `LC_ALL`, `LC_MESSAGES` e `LANG`. Manifesto ilegivel nao derruba a ajuda.
249
+ */
250
+ function localeDaAjuda(projeto) {
251
+ // A ajuda sai antes de o projeto-alvo ser fixado: com `--projeto`, vale o manifesto dele (D14).
252
+ let raiz;
253
+ if (projeto !== undefined) {
254
+ try {
255
+ raiz = (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto })?.raiz;
256
+ }
257
+ catch { /* nome ambiguo ou desconhecido: o cwd */ }
258
+ }
259
+ let ownerLanguage;
260
+ try {
261
+ ownerLanguage = (0, manifest_1.carregarManifesto)(raiz)?.manifesto.owner?.language;
262
+ }
263
+ catch { /* vale o ambiente */ }
264
+ return (0, locale_1.resolverLocale)(ownerLanguage).locale;
265
+ }
580
266
  function comandoThread(args) {
581
267
  if (args.posicionais[1] === 'close' || args.posicionais[1] === 'entrega') {
582
268
  const raiz = (0, manifest_1.exigirManifesto)().raiz, id = args.posicionais[2];
@@ -683,8 +369,9 @@ function comandoThread(args) {
683
369
  return 0;
684
370
  }
685
371
  const nome = args.posicionais[2];
372
+ const mt = (0, locale_1.msg)().thread;
686
373
  if (!nome) {
687
- console.error('uso: ork thread new <nome> --modo <MODO>');
374
+ console.error(mt.usoNew);
688
375
  return 2;
689
376
  }
690
377
  const avisoRoadmap = avisoRoadmapSemAssociacao(nome, texto(args.opcoes.roadmap));
@@ -710,17 +397,31 @@ function comandoThread(args) {
710
397
  const doneWhen = (texto(args.opcoes.done) ?? '').split(';;').map((p) => p.trim()).filter(Boolean)
711
398
  .map((entrada) => {
712
399
  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
- }
400
+ if (corte < 0)
401
+ throw new Error(mt.doneSemComando(entrada));
717
402
  const criterio = entrada.slice(0, corte).trim();
718
403
  const comando = entrada.slice(corte + 2).trim();
719
404
  if (!criterio || !comando)
720
- throw new Error(`done.incompleto: "${entrada}" precisa de criterio E comando`);
405
+ throw new Error(mt.doneIncompleto(entrada));
721
406
  return { criterio, comando };
722
407
  });
723
408
  const dryRun = args.opcoes['dry-run'] === true;
409
+ // RM-059 (T6.0): o pedido do builder, guardado para o render da fase quando falta `--pedido`.
410
+ if (args.opcoes.pedido === true) {
411
+ console.error(mt.usoPedido);
412
+ return 2;
413
+ }
414
+ const pedidoDoBuilder = texto(args.opcoes.pedido);
415
+ // A4 do CHECK: pedido invalido e erro de uso, e sai antes da reserva do roadmap, que vai ao remoto.
416
+ if (pedidoDoBuilder !== undefined) {
417
+ try {
418
+ (0, thread_1.prepararPedido)(pedidoDoBuilder);
419
+ }
420
+ catch (e) {
421
+ console.error(mt.usoComMotivo((0, locale_1.mensagemDoErro)(e)));
422
+ return 2;
423
+ }
424
+ }
724
425
  // `--worktree auto` (ou `--worktree` sozinho) cria a worktree isolada da thread; um caminho reusa um
725
426
  // diretorio que ja existe. P4 do ensaio da 0.5.0: sem flag, `worktree.por_thread: true` cria como o
726
427
  // `--worktree auto`, e `--sem-worktree` cria sem ela. Uso invalido sai antes da reserva do roadmap.
@@ -735,13 +436,13 @@ function comandoThread(args) {
735
436
  const brutoCiclo = texto(args.opcoes.ciclo) ?? texto(args.opcoes.variante);
736
437
  const variante = brutoCiclo ? (0, ciclos_1.parseVariante)(brutoCiclo) : null;
737
438
  if (brutoCiclo && !variante) {
738
- console.error(`variante de ciclo invalida: "${brutoCiclo}". Use uma de: ${Object.keys(ciclos_1.VARIANTES).join(', ')}`);
439
+ console.error(mt.varianteInvalida(brutoCiclo, Object.keys(ciclos_1.VARIANTES).join(', ')));
739
440
  return 2;
740
441
  }
741
442
  // 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
443
  // uso; a do `novaThread` fica como defesa de quem o chama direto.
743
444
  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`);
445
+ console.error(mt.cicloExigeWorktree(variante));
745
446
  return 2;
746
447
  }
747
448
  const brutoFatias = texto(args.opcoes.fatias);
@@ -749,10 +450,11 @@ function comandoThread(args) {
749
450
  // atomico entre maquinas (o primeiro push vence); a thread e local. Se a criacao falhar,
750
451
  // a reserva e devolvida; se der certo, ela passa a apontar para a thread.
751
452
  const itemDoRoadmap = dryRun ? undefined : texto(args.opcoes.roadmap);
752
- const itemReservado = itemDoRoadmap ? (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap).item : undefined;
453
+ // RM-061 (F2a, D6): o que grava estado (reserva, thread, ledger, worktree, registro, publicacoes) roda em pt-BR.
454
+ const itemReservado = itemDoRoadmap ? (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap).item) : undefined;
753
455
  let criada;
754
456
  try {
755
- criada = (0, thread_1.novaThread)(carregado, {
457
+ criada = (0, locale_1.comLocale)('pt-BR', () => (0, thread_1.novaThread)(carregado, {
756
458
  nome,
757
459
  modo,
758
460
  slug: texto(args.opcoes.slug),
@@ -767,47 +469,52 @@ function comandoThread(args) {
767
469
  exigeRuntimeDiferente,
768
470
  doneWhen,
769
471
  roadmap: itemReservado,
770
- });
472
+ ...(pedidoDoBuilder !== undefined ? { pedido: pedidoDoBuilder } : {}),
473
+ }));
771
474
  }
772
475
  catch (e) {
773
476
  if (itemDoRoadmap) {
774
477
  try {
775
- (0, roadmap_reservas_1.soltarItem)(carregado.raiz, itemDoRoadmap);
478
+ (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.soltarItem)(carregado.raiz, itemDoRoadmap));
776
479
  }
777
480
  catch { /* fica reservado; `ork roadmap soltar` resolve */ }
778
481
  }
779
482
  throw e;
780
483
  }
781
484
  const { thread, gravada } = criada;
782
- const reservaDoItem = itemDoRoadmap && gravada ? (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap, { thread: thread.id }) : null;
485
+ const reservaDoItem = itemDoRoadmap && gravada
486
+ ? (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap, { thread: thread.id })) : null;
783
487
  // I-51 (RM-047): com a fabrica compartilhada, as outras maquinas veem a thread nova.
784
488
  if (gravada)
785
- (0, fabrica_publicar_1.publicarEmSegundoPlano)(carregado.raiz);
489
+ (0, locale_1.comLocale)('pt-BR', () => (0, fabrica_publicar_1.publicarEmSegundoPlano)(carregado.raiz));
786
490
  // 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;
491
+ const avisoDoRegistro = gravada ? (0, locale_1.comLocale)('pt-BR', () => (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'thread new')) : null;
788
492
  if (avisoDoRegistro)
789
493
  console.error(avisoDoRegistro);
790
- console.log(gravada ? 'Thread criada.' : 'Simulacao (--dry-run), nada foi gravado.');
494
+ console.log(gravada ? mt.criada : mt.simulacao);
791
495
  if (reservaDoItem)
792
- console.log(` roadmap: ${reservaDoItem.item} reservado para esta maquina (${reservaDoItem.reserva?.maquina})`);
496
+ console.log(mt.roadmapReservado(reservaDoItem.item, reservaDoItem.reserva?.maquina));
793
497
  console.log((0, thread_1.resumoDaThread)(thread));
794
498
  console.log('');
795
- console.log(` slug em 3 partes: ${(0, phase_1.descreverSlug)(thread.slug)}`);
499
+ console.log(mt.slugEm3Partes((0, phase_1.descreverSlug)(thread.slug)));
796
500
  const linhaDaWorktreeNova = (0, thread_1.linhaDaWorktree)(criada.worktreePor, gravada, variante);
797
501
  if (linhaDaWorktreeNova)
798
502
  console.log(linhaDaWorktreeNova);
799
503
  const avisoDaWorktreeNova = criada.worktreeFalharia ? (0, thread_1.avisoDeWorktreeQueFalharia)(criada.worktreeFalharia)
800
504
  : (0, thread_1.avisoDaWorktree)(pedido.origem, criada, carregado.manifesto);
801
505
  const avisoSemBase = (0, thread_1.avisoDeThreadSemBase)(thread, gravada);
506
+ if (thread.pedido) {
507
+ console.log(mt.pedidoGuardado(gravada, `.orkastery/threads/${thread.id}/${thread.pedido.arquivo}`, (0, util_1.shaCurto)(thread.pedido.sha256), thread.pedido.bytes));
508
+ }
802
509
  if (gravada) {
803
- console.log(` estado: .orkastery/threads/${thread.id}/thread.json`);
510
+ console.log(mt.estado(thread.id));
804
511
  // Bloco B6: a origem da thread e as policies do projeto vao para a memoria
805
512
  // semantica quando ela esta ligada. Em regime files nada muda nesta saida.
806
- relatarPublicacao((0, memoria_1.publicar)(carregado, thread.id));
513
+ relatarPublicacao((0, locale_1.comLocale)('pt-BR', () => (0, memoria_1.publicar)(carregado, thread.id)));
807
514
  // Thread sem base nao tem fase para rodar: o proximo passo e o do aviso.
808
515
  if (!avisoSemBase) {
809
516
  console.log('');
810
- console.log(`Proximo passo: ork phase run ${thread.id} ${thread.faseAtual} --prompt "<pedido>"`);
517
+ console.log(mt.proximoPasso(thread.id, thread.faseAtual));
811
518
  }
812
519
  }
813
520
  if (avisoDaWorktreeNova)
@@ -833,8 +540,9 @@ function comandoThread(args) {
833
540
  if (sub === 'status') {
834
541
  const carregado = (0, manifest_1.exigirManifesto)();
835
542
  const id = args.posicionais[2];
543
+ const mt = (0, locale_1.msg)().thread;
836
544
  if (!id) {
837
- console.error('uso: ork thread status <thread-id>');
545
+ console.error(mt.usoStatus);
838
546
  return 2;
839
547
  }
840
548
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
@@ -848,20 +556,19 @@ function comandoThread(args) {
848
556
  console.log((0, thread_1.resumoDaThread)(thread, (0, conducao_1.conducaoDaThread)(carregado.raiz, thread.id)));
849
557
  console.log('');
850
558
  if (thread.sessoes.length === 0) {
851
- console.log(' nenhuma sessao despachada ainda');
559
+ console.log(mt.nenhumaSessao);
852
560
  }
853
561
  else {
854
- console.log(' sessoes despachadas (estado real conferido em `ork sessions`)');
562
+ console.log(mt.sessoesDespachadas);
855
563
  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)}`);
564
+ 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
565
  }
859
566
  }
860
567
  console.log('');
861
- console.log(` pausas humanas do modo: ${(0, modos_1.pausasDoModo)(thread.modo)}`);
568
+ console.log(mt.pausasDoModo((0, modos_1.pausasDoModo)(thread.modo)));
862
569
  return 0;
863
570
  }
864
- console.error(`subcomando desconhecido: thread ${sub}`);
571
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('thread', sub));
865
572
  return 2;
866
573
  }
867
574
  /**
@@ -873,7 +580,7 @@ function comandoThread(args) {
873
580
  * Toda edicao vira evento `setup_configured` no ledger do projeto.
874
581
  */
875
582
  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]'); };
583
+ const invalido = () => { throw new Error((0, locale_1.msg)().onboarding.usoInvalido); };
877
584
  if (Object.keys(args.opcoes).some(k => !['conteudo', 'por', 'json', 'reset'].includes(k)))
878
585
  invalido();
879
586
  if ('json' in args.opcoes && args.opcoes.json !== true)
@@ -902,6 +609,7 @@ function comandoOnboarding(args) {
902
609
  return 0;
903
610
  }
904
611
  let estado;
612
+ // RM-061 (F2a, D6): a recusa de uso sai no locale do comando; a gravacao roda em pt-BR (o dado nao muda).
905
613
  if (sub === 'set') {
906
614
  let conteudo;
907
615
  try {
@@ -910,10 +618,13 @@ function comandoOnboarding(args) {
910
618
  catch {
911
619
  return invalido();
912
620
  }
913
- estado = (0, onboarding_1.gravarEtapa)(raiz, etapa, conteudo, por);
621
+ (0, onboarding_1.validarPedidoDeEtapa)(etapa, conteudo, por);
622
+ estado = (0, locale_1.comLocale)('pt-BR', () => (0, onboarding_1.gravarEtapa)(raiz, etapa, conteudo, por));
623
+ }
624
+ else if (sub === 'reset') {
625
+ (0, onboarding_1.validarPedidoDeEtapa)(etapa, undefined, por);
626
+ estado = (0, locale_1.comLocale)('pt-BR', () => (0, onboarding_1.resetarOnboarding)(raiz, etapa, por));
914
627
  }
915
- else if (sub === 'reset')
916
- estado = (0, onboarding_1.resetarOnboarding)(raiz, etapa, por);
917
628
  else
918
629
  estado = (0, onboarding_1.lerOnboarding)(raiz);
919
630
  console.log(args.opcoes.json === true ? JSON.stringify(estado, null, 2) : (0, onboarding_1.textoDaPauta)(estado, (0, manifest_1.exigirManifesto)(raiz).manifesto.owner));
@@ -935,7 +646,7 @@ function aspasDeShell(valor) {
935
646
  function avisarChavesDePerfis(carregado) {
936
647
  for (const a of carregado.avisos)
937
648
  if (a.startsWith('runtime_profiles.'))
938
- console.error(`aviso: ${a}`);
649
+ console.error((0, locale_1.msg)().phase.aviso(a));
939
650
  }
940
651
  function comandoAccounts(args) {
941
652
  const carregado = (0, manifest_1.exigirManifesto)();
@@ -1081,6 +792,91 @@ function comandoSetup(args) {
1081
792
  console.log(' Leve para o repositorio por PR: dali em diante ele vale em todas as maquinas, e ork setup <modo> --bloco N passa a editar este arquivo.');
1082
793
  return 0;
1083
794
  }
795
+ if (modoBruto === 'worktree') {
796
+ // RM-047 (P3): worktree.dir fora da raiz so cria checkout com a confirmacao desta maquina, fora do git.
797
+ const acao = args.posicionais[2];
798
+ const json = args.opcoes.json === true;
799
+ if (acao === 'confirmar') {
800
+ const local = (0, worktree_local_1.confirmarWorktreeLocal)(raiz, carregado.manifesto, por, args.posicionais[3]);
801
+ if (json) {
802
+ console.log(JSON.stringify(local, null, 2));
803
+ return 0;
804
+ }
805
+ console.log(`Pasta das worktrees "${local.dir}" confirmada nesta maquina para ${local.raiz}.`);
806
+ console.log(` Gravada em .orkastery/private/${worktree_local_1.ARQUIVO_WORKTREE_LOCAL} (local, fora do git). Para desfazer: ork setup worktree revogar.`);
807
+ return 0;
808
+ }
809
+ if (acao === 'revogar') {
810
+ const havia = (0, worktree_local_1.revogarWorktreeLocal)(raiz);
811
+ if (json) {
812
+ console.log(JSON.stringify({ revogada: havia }, null, 2));
813
+ return 0;
814
+ }
815
+ console.log(havia ? 'Confirmacao local da pasta das worktrees revogada.' : 'Nao havia confirmacao local da pasta das worktrees.');
816
+ return 0;
817
+ }
818
+ if (acao !== undefined) {
819
+ console.error(`subcomando desconhecido: setup worktree ${acao} (use confirmar [<dir>] ou revogar)`);
820
+ return 2;
821
+ }
822
+ const pedida = (0, worktree_local_1.pastaDasWorktreesPedida)(raiz, carregado.manifesto);
823
+ const local = (0, worktree_local_1.lerWorktreeLocal)(raiz);
824
+ const recusa = (0, worktree_local_1.recusaDePastaDasWorktrees)(raiz, carregado.manifesto);
825
+ if (json) {
826
+ console.log(JSON.stringify({ manifesto: carregado.manifesto.worktree.dir, dir: pedida.dir, dentroDaRaiz: pedida.dentro,
827
+ confirmadaNestaMaquina: local.local?.dir ?? null, criacao: recusa === null ? 'permitida' : 'recusada' }, null, 2));
828
+ return 0;
829
+ }
830
+ console.log(`worktree.dir no orkastery.yaml: ${carregado.manifesto.worktree.dir} (${pedida.dir}, ${pedida.dentro ? 'dentro' : 'fora'} da raiz)`);
831
+ console.log(`confirmacao local desta maquina: ${local.local ? local.local.dir : `nenhuma (${local.motivo})`}`);
832
+ console.log(recusa === null ? 'criacao de worktree: permitida' : `criacao de worktree: recusada. ${worktree_local_1.COMANDO_CONFIRMAR_WORKTREE}`);
833
+ return 0;
834
+ }
835
+ if (modoBruto === 'sandbox') {
836
+ // RM-047 (P1): a postura de sandbox que afrouxa so vale com a confirmacao desta maquina, fora do git.
837
+ const acao = args.posicionais[2];
838
+ const json = args.opcoes.json === true;
839
+ if (acao === 'confirmar') {
840
+ const postura = args.posicionais[3];
841
+ if (!postura) {
842
+ console.error('uso: ork setup sandbox confirmar <read-only|workspace-write|danger-full-access> [--por Q]');
843
+ return 2;
844
+ }
845
+ const p = (0, postura_local_1.confirmarPosturaLocal)(raiz, postura, por);
846
+ if (json) {
847
+ console.log(JSON.stringify(p, null, 2));
848
+ return 0;
849
+ }
850
+ console.log(`Postura de sandbox "${p.sandbox}" confirmada nesta maquina para ${p.raiz}.`);
851
+ console.log(` Gravada em ${(0, postura_local_1.caminhoDaPosturaLocal)(raiz)} (local, fora do git). Para desfazer: ork setup sandbox revogar.`);
852
+ return 0;
853
+ }
854
+ if (acao === 'revogar') {
855
+ const havia = (0, postura_local_1.revogarPosturaLocal)(raiz);
856
+ if (json) {
857
+ console.log(JSON.stringify({ revogada: havia }, null, 2));
858
+ return 0;
859
+ }
860
+ console.log(havia ? 'Confirmacao local da postura de sandbox revogada.' : 'Nao havia confirmacao local de postura de sandbox.');
861
+ return 0;
862
+ }
863
+ if (acao !== undefined) {
864
+ console.error(`subcomando desconhecido: setup sandbox ${acao} (use confirmar <postura> ou revogar)`);
865
+ return 2;
866
+ }
867
+ const pedida = carregado.manifesto.runtime.sandbox;
868
+ const local = (0, postura_local_1.lerPosturaLocal)(raiz);
869
+ const recusa = (0, postura_local_1.recusaDePostura)(raiz, carregado.manifesto, 'codex');
870
+ if (json) {
871
+ console.log(JSON.stringify({ manifesto: pedida, afrouxa: (0, postura_local_1.posturaAfrouxada)(carregado.manifesto) !== null,
872
+ confirmadaNestaMaquina: local.postura?.sandbox ?? null, despachoCodex: recusa === null ? 'permitido' : 'recusado' }, null, 2));
873
+ return 0;
874
+ }
875
+ console.log(`runtime.sandbox no orkastery.yaml: ${pedida}`);
876
+ console.log(`confirmacao local desta maquina: ${local.postura ? local.postura.sandbox : `nenhuma (${local.motivo})`}`);
877
+ console.log(recusa === null ? 'despacho pelo codex: permitido' : `despacho pelo codex: recusado. ${(0, postura_local_1.comandoDeConfirmacao)(pedida)}`);
878
+ return 0;
879
+ }
1084
880
  if (!modoBruto) {
1085
881
  if (args.opcoes.reset === true) {
1086
882
  (0, setup_1.resetarSetup)(raiz, undefined, por);
@@ -1149,19 +945,21 @@ function comandoSetup(args) {
1149
945
  function comandoPhase(args) {
1150
946
  const sub = args.posicionais[1];
1151
947
  const carregado = (0, manifest_1.exigirManifesto)();
948
+ const m = (0, locale_1.msg)().phase;
1152
949
  if (sub === 'run') {
1153
950
  avisarChavesDePerfis(carregado);
1154
951
  const id = args.posicionais[2];
1155
952
  const faseBruta = args.posicionais[3];
1156
953
  const prompt = texto(args.opcoes.prompt);
1157
954
  if (!id || !faseBruta || !prompt) {
1158
- console.error('uso: ork phase run <thread-id> <FASE> --prompt "<texto>"');
955
+ console.error(m.usoRun);
1159
956
  return 2;
1160
957
  }
1161
958
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
1162
959
  const fase = (0, thread_1.exigirFase)(thread, faseBruta);
1163
960
  const conducao = conducaoDoCli(args);
1164
- const r = (0, phase_1.rodarFase)(carregado, id, {
961
+ // RM-061 (F2a, D6): o despacho grava prompt, ledger, lease e pedidos em pt-BR; so a impressao segue o locale.
962
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, phase_1.rodarFase)(carregado, id, {
1165
963
  fase,
1166
964
  prompt,
1167
965
  runtime: texto(args.opcoes.runtime),
@@ -1172,7 +970,9 @@ function comandoPhase(args) {
1172
970
  canal: conducao.canal,
1173
971
  ...(conducao.correlacao ? { correlacao: conducao.correlacao } : {}),
1174
972
  ...(conducao.esperarMs ? { esperarMs: conducao.esperarMs } : {}),
1175
- });
973
+ // A baseline que o despacho grava espera a fila pesada com aviso; a recusa sugere gravá-la antes, com mais espera.
974
+ filaPesada: filaPesadaDoCli(args, 'baseline', `ork verify ${id} --baseline --esperar 120`),
975
+ }));
1176
976
  // I-36 (T12, T14): pedido repetido e segundo pedido tem resposta propria, antes dos outros gates.
1177
977
  if (r.idempotente && r.conducao) {
1178
978
  console.log((0, conducao_1.textoDoPedidoRepetido)(id, r.conducao));
@@ -1188,14 +988,13 @@ function comandoPhase(args) {
1188
988
  console.log(JSON.stringify({ motivo: r.motivo, ...r.vaga }, null, 2));
1189
989
  return 3;
1190
990
  }
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).`);
991
+ console.log(m.vagaRecusada(r.vaga.ocupam.length, r.vaga.limite));
1193
992
  for (const o of r.vaga.ocupam) {
1194
993
  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)}`);
994
+ `${o.sessao ? `${o.runtime} ${o.sessao.slice(0, 8)}` : m.despachoEmCurso}, ${m.desde((0, horario_1.localizarTextoRotulado)(o.desde))}`);
1196
995
  }
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.`);
996
+ console.log(m.correcao(r.vaga.correcao));
997
+ console.log(r.dryRun ? m.vagaEnsaio : m.vagaLedger(id));
1199
998
  return 3;
1200
999
  }
1201
1000
  // RM-037 (S-4 do CHECK 3): a baseline que o despacho nao conseguiu gravar nao e gate reprovado.
@@ -1204,69 +1003,71 @@ function comandoPhase(args) {
1204
1003
  console.log(JSON.stringify({ motivo: r.motivo, detalhe: r.erro }, null, 2));
1205
1004
  return 1;
1206
1005
  }
1207
- console.error(`Despacho recusado: ${r.erro}`);
1208
- console.error(' nenhuma sessao aberta; o ledger nao ganhou gate_blocked');
1006
+ console.error(m.recusado(`${r.erro}`));
1007
+ console.error(m.baselinePendente);
1209
1008
  return 1;
1210
1009
  }
1010
+ // RM-061 (F2a): o resumo do despacho sai pelo catalogo; o rotulo tem largura 14, como antes.
1011
+ const campo = (rotulo, valor) => ` ${rotulo.padEnd(14)} : ${valor}`, rt = m.rotulos;
1211
1012
  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}`);
1013
+ console.log(m.simulacao);
1014
+ console.log(campo(rt.slug, r.slug));
1015
+ console.log(campo(rt.prompt, `${r.promptPath}`));
1016
+ console.log(campo(rt.sha256, `${r.promptSha256}`));
1017
+ console.log(campo(rt.pausaAoFim, m.simNao(!!r.pausaAoFim)));
1018
+ console.log(campo(rt.runtime, `${r.runtime}`));
1019
+ console.log(campo(rt.modelo, `${r.model}/${r.effort}`));
1219
1020
  // 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(' ')}`);
1021
+ console.log(campo(rt.comando, r.comando.map((c) => (c.length > 80 ? '"<prompt>"' : c)).join(' ')));
1221
1022
  for (const l of (0, policies_1.linhasDeAviso)(r.violacoes ?? []))
1222
1023
  console.log(l);
1223
1024
  return 0;
1224
1025
  }
1225
1026
  if (r.bloqueado) {
1226
- console.error(`Despacho BLOQUEADO pelo gate tipado: ${r.motivo}`);
1027
+ console.error(m.bloqueado(`${r.motivo}`));
1227
1028
  for (const v of r.violacoes) {
1228
1029
  console.error(` [${v.severidade}] policy ${v.policy}: ${v.detalhe}`);
1229
- console.error(` correcao: ${v.correcao}`);
1030
+ console.error(m.violacaoCorrecao(v.correcao));
1230
1031
  }
1231
- console.error(` o prompt nao foi gravado em disco; evento gate_blocked no ledger de ${id}`);
1032
+ console.error(m.promptNaoGravado(id));
1232
1033
  return 1;
1233
1034
  }
1234
1035
  if (!r.sessionId) {
1235
1036
  // 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}`);
1037
+ console.error(m.falhou(`${r.erro ? (0, horario_1.localizarTextoRotulado)(r.erro) : r.erro}`));
1038
+ console.error(m.falhouLedger(id));
1238
1039
  return 1;
1239
1040
  }
1240
- console.log(`Fase ${fase} despachada como background agent.`);
1041
+ console.log(m.despachada(fase));
1241
1042
  for (const l of (0, policies_1.linhasDeAviso)(r.violacoes ?? []))
1242
1043
  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)'}`);
1044
+ console.log(campo(rt.sessionId, r.sessionId));
1045
+ console.log(campo(rt.slug, `${r.slug} (${(0, phase_1.descreverSlug)(r.slug)})`));
1046
+ console.log(campo(rt.prompt, `${r.promptPath}`));
1047
+ console.log(campo(rt.sha256, `${r.promptSha256}`));
1048
+ console.log(campo(rt.runtime, `${r.runtime}`));
1049
+ console.log(campo(rt.modelo, m.modeloGravado(`${r.model}`, `${r.effort}`)));
1050
+ console.log(m.verificada(!!r.verificada));
1051
+ console.log(m.pausaNoFim(!!r.pausaAoFim));
1251
1052
  console.log('');
1252
1053
  if (r.runtime === 'claude-bg') {
1253
- console.log(`Acompanhe: claude attach ${r.sessionId} | ork phase list ${id}`);
1054
+ console.log(m.acompanheClaude(r.sessionId, id));
1254
1055
  }
1255
1056
  else {
1256
- console.log(`Acompanhe: ork phase list ${id} (eventos do despacho no log da thread)`);
1057
+ console.log(m.acompanhe(id));
1257
1058
  }
1258
1059
  return r.verificada ? 0 : 1;
1259
1060
  }
1260
1061
  if (sub === 'list') {
1261
1062
  const id = args.posicionais[2];
1262
1063
  if (!id) {
1263
- console.error('uso: ork phase list <thread-id>');
1064
+ console.error(m.usoList);
1264
1065
  return 2;
1265
1066
  }
1266
1067
  console.log((0, phase_1.tabelaDoLedger)(carregado.raiz, id));
1267
1068
  return 0;
1268
1069
  }
1269
- console.error(`subcomando desconhecido: phase ${sub}`);
1070
+ console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('phase', sub));
1270
1071
  return 2;
1271
1072
  }
1272
1073
  function comandoLedger(args) {
@@ -1573,6 +1374,40 @@ function comandoClaims(args) {
1573
1374
  }
1574
1375
  return 0;
1575
1376
  }
1377
+ if (sub === 'conferir') {
1378
+ // RM-059 (T0.10): so o que foi pedido, no sandbox do verify, sob a conducao da thread, sem recibo.
1379
+ const id = args.posicionais[2];
1380
+ const json = args.opcoes.json === true;
1381
+ const claims = texto(args.opcoes.claims);
1382
+ const tarefa = texto(args.opcoes.tarefa);
1383
+ const prazo = texto(args.opcoes.prazo);
1384
+ const semValor = ['claims', 'tarefa', 'prazo'].some((o) => args.opcoes[o] === true);
1385
+ if (!id || semValor || (claims === undefined) === (tarefa === undefined)) {
1386
+ console.error('uso: ork claims conferir <thread-id> --claims C1,C2 | --tarefa T1 [--prazo S] [--json]');
1387
+ return 2;
1388
+ }
1389
+ const conducao = conducaoDoCli(args);
1390
+ try {
1391
+ const r = (0, claims_conferir_1.conferirClaims)(carregado, id, {
1392
+ claims: claims !== undefined ? (0, claims_conferir_1.idsDeClaims)(claims) : undefined,
1393
+ tarefa,
1394
+ prazoMs: prazo !== undefined ? Number(prazo) * 1000 : undefined,
1395
+ canal: conducao.canal,
1396
+ correlacao: conducao.correlacao,
1397
+ });
1398
+ console.log(json ? JSON.stringify(r, null, 2) : (0, claims_conferir_1.textoDaConferencia)(r));
1399
+ return r.ok ? 0 : 1;
1400
+ }
1401
+ catch (e) {
1402
+ if (!(e instanceof claims_conferir_1.ErroDeConferencia))
1403
+ throw e;
1404
+ if (json)
1405
+ console.log(JSON.stringify({ formato: claims_conferir_1.FORMATO_DA_CONFERENCIA, thread: id, ok: false, erro: e.message }, null, 2));
1406
+ else
1407
+ console.error(e.message);
1408
+ return 2;
1409
+ }
1410
+ }
1576
1411
  if (sub === 'verificar') {
1577
1412
  const id = args.posicionais[2];
1578
1413
  const claimId = args.posicionais[3];
@@ -1632,30 +1467,36 @@ function comandoClaims(args) {
1632
1467
  function comandoVerify(args) {
1633
1468
  const carregado = (0, manifest_1.exigirManifesto)();
1634
1469
  const id = args.posicionais[1];
1470
+ const m = (0, locale_1.msg)().verify;
1635
1471
  if (!id) {
1636
- console.error('uso: ork verify <thread-id> [--baseline] [--so-claims] [--canal C] [--esperar [min]]');
1472
+ console.error(m.uso);
1637
1473
  return 2;
1638
1474
  }
1639
- const conducao = conducaoDoCli(args);
1475
+ // RM-058 N2 (D10): enquanto a fila de recursos pesados nao da a vez, o CLI diz uma vez por quem espera.
1476
+ const aoEsperar = (ocupantes) => console.error(m.filaPesadaEsperando(args.opcoes.baseline === true ? 'baseline' : 'verify', ocupantes.map((o) => m.filaPesadaOcupante(o.operacao, o.thread, (0, horario_1.formatarDataHora)(o.desde))).join('; ')));
1477
+ const doCli = conducaoDoCli(args);
1478
+ // O `ork verify` do CLI espera a fila em primeiro plano ate `--esperar` ou 60 min; a recusa sugere o dobro.
1479
+ const conducao = { ...doCli, filaPesada: { aoEsperar, esperarMs: doCli.esperarMs ?? verify_1.ESPERA_DA_FILA_PESADA_MS,
1480
+ comandoDeEsperar: `ork verify ${id}${args.opcoes.baseline === true ? ' --baseline' : ''} --esperar 120` } };
1640
1481
  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}`);
1482
+ // RM-061 (F2b, G2): a baseline e o ledger sao gravados em pt-BR; so a impressao segue o locale.
1483
+ const b = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.gravarBaseline)(carregado, id, undefined, conducao));
1484
+ console.log(m.baselineGravada(id));
1485
+ console.log(m.baselineCommit(b.commit));
1644
1486
  for (const c of b.comandos) {
1645
- console.log(` ${c.nome.padEnd(10)} ${c.ok ? 'passava' : `ja falhava (codigo ${c.code})`} ${c.comando}`);
1487
+ console.log(m.baselineComando(c.nome, c.ok, c.code, c.comando));
1646
1488
  }
1647
1489
  if (b.comandos.some((c) => !c.ok)) {
1648
1490
  // 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}`);
1491
+ console.log(m.baselineSaida((0, thread_1.caminhoThread)(carregado.raiz, id), id));
1651
1492
  }
1652
1493
  if (b.comandos.length === 0) {
1653
1494
  // 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)');
1495
+ console.log(m.baselineSemComandos);
1655
1496
  }
1656
1497
  return 0;
1657
1498
  }
1658
- const r = (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao });
1499
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao }));
1659
1500
  console.log((0, verify_1.textoDoVerify)(r));
1660
1501
  return r.ok ? 0 : 1;
1661
1502
  }
@@ -1663,10 +1504,45 @@ function comandoVerify(args) {
1663
1504
  * `ork conducao status|assumir` (I-36, T15): quem conduz a thread agora, e o handoff explicito. O
1664
1505
  * status tambem libera, com prova no ledger, a conducao que ficou sem dono (T16).
1665
1506
  */
1507
+ /**
1508
+ * RM-059 (F6, T6.4; DD5 do plano dos mods): `ork conducao sentinela status|bater|desligar`. A presenca da
1509
+ * Sentinela do Condutor nesta maquina e o passo do condutor em cada thread aberta; o condutor externo le o
1510
+ * `status --json` para ceder o despacho enquanto a presenca vale. Nada aqui despacha.
1511
+ */
1512
+ function comandoSentinela(carregado, args) {
1513
+ const acao = args.posicionais[2] ?? 'status';
1514
+ const json = args.opcoes.json === true;
1515
+ if (acao === 'status') {
1516
+ const s = (0, conducao_sentinela_1.statusDaSentinela)(carregado);
1517
+ console.log(json ? JSON.stringify(s, null, 2) : (0, conducao_sentinela_1.textoDoStatusDaSentinela)(s));
1518
+ return 0;
1519
+ }
1520
+ if (acao !== 'bater' && acao !== 'desligar')
1521
+ throw new Error('uso: ork conducao sentinela status|bater|desligar [--sessao <id>] [--json]');
1522
+ const sessao = texto(args.opcoes.sessao);
1523
+ if (!sessao)
1524
+ throw new Error(`uso: ork conducao sentinela ${acao} --sessao <id> [--json]`);
1525
+ if (acao === 'bater') {
1526
+ const r = (0, conducao_sentinela_1.baterSentinela)(carregado.raiz, { sessao });
1527
+ const curta = r.presenca.sessao.slice(0, 8);
1528
+ console.log(json ? JSON.stringify(r, null, 2) : r.ok
1529
+ ? `Sentinela ${r.ligou ? 'ligada' : 'renovada'} na maquina ${r.presenca.maquina} pela sessao ${curta}; vale 3 min sem batida.`
1530
+ : `Outra sessao (${curta}) conduz pela Sentinela na maquina ${r.presenca.maquina}; esta fica so olhando.`);
1531
+ return r.ok ? 0 : 3;
1532
+ }
1533
+ const motivo = texto(args.opcoes.motivo);
1534
+ const r = (0, conducao_sentinela_1.desligarSentinela)(carregado.raiz, { sessao, ...(motivo ? { motivo } : {}) });
1535
+ console.log(json ? JSON.stringify(r, null, 2) : r.desligada
1536
+ ? 'Sentinela desligada nesta maquina; o condutor externo volta a conduzir.'
1537
+ : 'Nada a desligar: a presenca nesta maquina nao e desta sessao.');
1538
+ return 0;
1539
+ }
1666
1540
  function comandoConducao(args) {
1667
1541
  const carregado = (0, manifest_1.exigirManifesto)();
1668
1542
  const sub = args.posicionais[1];
1669
1543
  const id = args.posicionais[2];
1544
+ if (sub === 'sentinela')
1545
+ return comandoSentinela(carregado, args);
1670
1546
  if (sub === 'status') {
1671
1547
  if (!id)
1672
1548
  throw new Error('uso: ork conducao status <thread-id> [--json]');
@@ -1684,7 +1560,7 @@ function comandoConducao(args) {
1684
1560
  console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : `${r.ok ? 'Conducao assumida.' : 'Handoff recusado.'} ${r.detalhe}`);
1685
1561
  return r.ok ? 0 : 3;
1686
1562
  }
1687
- throw new Error('uso: ork conducao status|assumir <thread-id>');
1563
+ throw new Error('uso: ork conducao status|assumir <thread-id> | ork conducao sentinela status|bater|desligar');
1688
1564
  }
1689
1565
  /** RM-048 (D1): o gate aberto no contrato curto, com o codigo estavel e o "desde" do ledger. */
1690
1566
  function textoDoGateCurto(raiz, pedido, canal) {
@@ -1845,7 +1721,7 @@ function comandoRetry(args) {
1845
1721
  if (sub === 'plan' || sub === 'run') {
1846
1722
  const id = args.posicionais[2];
1847
1723
  if (!id) {
1848
- console.error(`uso: ork retry ${sub} <thread-id> [--motivo M] [--fase F]`);
1724
+ console.error((0, locale_1.msg)().retry.usoPlanRun(sub));
1849
1725
  return 2;
1850
1726
  }
1851
1727
  const thread = (0, thread_1.lerThread)(carregado.raiz, id);
@@ -1856,7 +1732,8 @@ function comandoRetry(args) {
1856
1732
  autorizadoPor: texto(args.opcoes.por) ?? texto(args.opcoes.quem),
1857
1733
  };
1858
1734
  if (sub === 'plan') {
1859
- const plano = (0, retry_1.planejarRetry)(carregado, id, opcoes);
1735
+ // RM-061 (F2b, G2): a razao nasce em pt-BR, como o --json e o ledger a guardam; so a impressao segue o locale.
1736
+ const plano = (0, locale_1.comLocale)('pt-BR', () => (0, retry_1.planejarRetry)(carregado, id, opcoes));
1860
1737
  if (args.opcoes.json === true) {
1861
1738
  console.log(JSON.stringify(plano, null, 2));
1862
1739
  return 0;
@@ -1868,11 +1745,11 @@ function comandoRetry(args) {
1868
1745
  const conducao = conducaoDoCli(args);
1869
1746
  if (conducao.esperarMs && args.opcoes['dry-run'] !== true)
1870
1747
  (0, conducao_1.esperarConducaoLivre)(carregado.raiz, id, conducao.esperarMs);
1871
- const r = (0, retry_1.executarRetry)(carregado, id, {
1748
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, retry_1.executarRetry)(carregado, id, {
1872
1749
  ...opcoes,
1873
1750
  dryRun: args.opcoes['dry-run'] === true,
1874
1751
  reverify: args.opcoes.reverify === true,
1875
- });
1752
+ }));
1876
1753
  if (args.opcoes.json === true) {
1877
1754
  console.log(JSON.stringify(r, null, 2));
1878
1755
  }
@@ -1952,7 +1829,7 @@ function comandoFix(args) {
1952
1829
  console.error('uso: ork fix open <thread-id> [--so-claims] [--reverify]');
1953
1830
  return 2;
1954
1831
  }
1955
- const conducao = conducaoDoCli(args);
1832
+ const conducao = { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix open ${id} --esperar 30`) };
1956
1833
  const rodada = (0, fix_1.abrirRodada)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao });
1957
1834
  const reverify = args.opcoes.reverify === true && rodada.correcoes.length > 0
1958
1835
  ? (0, fix_1.reverificar)(carregado, id, { rodada: rodada.rodada, conducao })
@@ -2007,7 +1884,7 @@ function comandoFix(args) {
2007
1884
  }
2008
1885
  const rodadaBruta = texto(args.opcoes.rodada);
2009
1886
  const r = (0, fix_1.reverificar)(carregado, id, {
2010
- conducao: conducaoDoCli(args),
1887
+ conducao: { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix reverify ${id} --esperar 30`) },
2011
1888
  rodada: rodadaBruta ? Number(rodadaBruta) : undefined,
2012
1889
  parcial: args.opcoes.parcial === true,
2013
1890
  });
@@ -2060,8 +1937,76 @@ function comandoHandoff(args) {
2060
1937
  console.error(`subcomando desconhecido: handoff ${sub}`);
2061
1938
  return 2;
2062
1939
  }
1940
+ /**
1941
+ * RM-059 (F7, T7.1; DD4 do plano dos mods): `ork ship publicar <thread>`. So publica no modo que ja autoriza push
1942
+ * (#Auto e #Maestro); a autorizacao humana na linha nao vale aqui (D1 da ork-rm059pista), e o push do modo que pausa
1943
+ * e do dono, no terminal dele.
1944
+ */
1945
+ function comandoShipPublicar(carregado, args) {
1946
+ const m = (0, locale_1.msg)().ship;
1947
+ const p = m.publicar;
1948
+ if (args.opcoes['autorizar-push'] !== undefined) {
1949
+ console.error(p.semAutorizarPush);
1950
+ return 2;
1951
+ }
1952
+ const alvo = args.posicionais[2];
1953
+ if (!alvo || args.posicionais.length > 3) {
1954
+ console.error(p.uso);
1955
+ return 2;
1956
+ }
1957
+ if (args.opcoes.remoto !== undefined)
1958
+ (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
1959
+ // Como o ship: o que o publicar grava (ledger, detalhe e correcao do --json) nasce em pt-BR.
1960
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_publicar_1.publicarEntrega)(carregado, alvo, {
1961
+ remoto: texto(args.opcoes.remoto), dryRun: args.opcoes['dry-run'] === true,
1962
+ }));
1963
+ if (args.opcoes.json === true) {
1964
+ console.log(JSON.stringify(r, null, 2));
1965
+ return r.acao === 'recusada' ? 1 : 0;
1966
+ }
1967
+ for (const linha of (0, ship_publicar_1.linhasDaPublicacao)(r))
1968
+ console.log(linha);
1969
+ return r.acao === 'recusada' ? 1 : 0;
1970
+ }
1971
+ /** RM-059 (F7, T7.1): `ork ship pista [<thread>]`, as etapas da entrega e o proximo passo que o nucleo declara. */
1972
+ function comandoShipPista(carregado, args) {
1973
+ const p = (0, locale_1.msg)().ship.publicar;
1974
+ if (args.posicionais.length > 3) {
1975
+ console.error(p.usoPista);
1976
+ return 2;
1977
+ }
1978
+ if (args.opcoes.remoto !== undefined)
1979
+ (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
1980
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_publicar_1.pistaDeEntrega)(carregado, { remoto: texto(args.opcoes.remoto), thread: args.posicionais[2] }));
1981
+ if (args.opcoes.json === true) {
1982
+ console.log(JSON.stringify(r, null, 2));
1983
+ return 0;
1984
+ }
1985
+ console.log(p.cabecalhoPista((0, horario_1.formatarDataHora)(r.lidoEm), r.remoto, r.base));
1986
+ if (!r.remotoLido)
1987
+ console.log(p.remotoNaoRespondeu(r.remoto));
1988
+ if (!r.prsLidos)
1989
+ console.log(p.prsNaoResponderam((0, locale_1.remontar)(r.prsNaoLidos ?? '-')));
1990
+ if (!r.pistas.length)
1991
+ console.log(p.semPistas);
1992
+ for (const pista of r.pistas) {
1993
+ console.log('');
1994
+ console.log(p.linhaDaThread(pista.thread, pista.tag, pista.branch));
1995
+ console.log(` ${pista.etapas.map((e) => `${p.nomeDaEtapa(e.id)} ${p.marcaDaEtapa(e.estado)}`).join(' | ')}`);
1996
+ for (const e of pista.etapas.filter((x) => x.estado !== 'feita' && x.estado !== 'nao-se-aplica')) {
1997
+ console.log(` ${p.nomeDaEtapa(e.id)}: ${(0, locale_1.remontar)(e.texto)}`);
1998
+ }
1999
+ console.log(p.linhaDoProximo((0, locale_1.remontar)(pista.proximo.texto), pista.proximo.comando));
2000
+ }
2001
+ return 0;
2002
+ }
2063
2003
  function comandoShip(args) {
2064
2004
  const carregado = (0, manifest_1.exigirManifesto)();
2005
+ const m = (0, locale_1.msg)().ship;
2006
+ if (args.posicionais[1] === 'publicar')
2007
+ return comandoShipPublicar(carregado, args);
2008
+ if (args.posicionais[1] === 'pista')
2009
+ return comandoShipPista(carregado, args);
2065
2010
  if (args.posicionais[1] === 'registrar-pr') {
2066
2011
  // I-57 (RM-008): a entrega feita por PR vira ship_done, provada no remoto e no CI.
2067
2012
  const alvo = args.posicionais[2];
@@ -2069,7 +2014,7 @@ function comandoShip(args) {
2069
2014
  // RM-037 (defeito 5): PR mesclado em repositorio externo declarado em ci.external_repositories.
2070
2015
  const repo = texto(args.opcoes.repo), numeroDoPr = texto(args.opcoes.pr);
2071
2016
  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]');
2017
+ console.error(m.usoRegistrarPr);
2073
2018
  return 2;
2074
2019
  }
2075
2020
  // RM-047: o `--remoto` da linha de comando so chega ao git como nome de remoto (ship.remoto-invalido).
@@ -2077,27 +2022,29 @@ function comandoShip(args) {
2077
2022
  (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
2078
2023
  // RM-037 (fatia 3, defeito 6): o `--dry-run` era ignorado, e o ensaio gravava o ship_done de verdade.
2079
2024
  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 });
2025
+ // RM-061 (F2b, G2): o ship_done e o motivo nascem em pt-BR; so a impressao segue o locale.
2026
+ const r = (0, locale_1.comLocale)('pt-BR', () => alvo && repo
2027
+ ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun })]
2028
+ : alvo ? [(0, entrega_pr_1.registrarEntregaPorPr)(carregado, alvo, { remoto, dryRun })] : (0, entrega_pr_1.registrarEntregasPorPr)(carregado, { remoto, dryRun }));
2082
2029
  if (args.opcoes.json === true) {
2083
2030
  console.log(JSON.stringify(r, null, 2));
2084
2031
  return r.some((x) => x.acao === 'recusada') ? 1 : 0;
2085
2032
  }
2086
2033
  if (dryRun)
2087
- console.log('Ensaio (--dry-run): nada foi gravado.');
2034
+ console.log(m.ensaio);
2088
2035
  if (r.length === 0)
2089
- console.log('Nenhuma thread aberta com merge ship(<thread>) na base.');
2036
+ console.log(m.nenhumaComMerge);
2090
2037
  for (const x of r)
2091
- console.log(` ${x.thread.padEnd(20)} ${x.acao.padEnd(13)} ${x.motivo}`);
2038
+ console.log(m.linhaDoRegistro(x.thread, m.acoes[x.acao] ?? x.acao, (0, locale_1.remontar)(x.motivo)));
2092
2039
  // RM-044 (A3): a pagina que o push da base vai reprovar em docs.paridade.merge, com o comando que corrige.
2093
2040
  // So aviso: nada e gravado e o codigo de saida nao muda.
2094
2041
  const pendentes = r.flatMap((x) => x.docsPendentes.map((d) => ({ thread: x.thread, ...d })));
2095
2042
  if (pendentes.length) {
2096
2043
  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:`);
2044
+ console.log(m.avisoDeDocs(pendentes.length));
2098
2045
  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)`);
2046
+ console.log(m.docPendente(d.id, d.arquivo, d.merge.slice(0, 7), d.thread, d.codigo));
2047
+ console.log(m.docPendenteComando(d.comando));
2101
2048
  }
2102
2049
  }
2103
2050
  const registradas = r.filter((x) => x.acao === 'registrou').length;
@@ -2106,20 +2053,20 @@ function comandoShip(args) {
2106
2053
  console.log('');
2107
2054
  // RM-008 (03/10): o texto ensina a forma COM a thread. A forma sem thread fechava tambem as
2108
2055
  // 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):`);
2056
+ console.log(m.registradas(registradas));
2110
2057
  for (const x of r.filter((y) => y.acao === 'registrou'))
2111
2058
  console.log(` ork master ${x.thread} --aceitar-omissao`);
2112
2059
  }
2113
2060
  if (registrariam) {
2114
2061
  console.log('');
2115
- console.log(`${registrariam} entrega(s) seria(m) registrada(s). Para gravar, rode o mesmo comando sem --dry-run.`);
2062
+ console.log(m.registrariam(registrariam));
2116
2063
  }
2117
2064
  return r.some((x) => x.acao === 'recusada') ? 1 : 0;
2118
2065
  }
2119
2066
  const id = args.posicionais[1];
2120
2067
  const para = texto(args.opcoes.para) ?? texto(args.opcoes.to);
2121
2068
  if (!id || !para) {
2122
- console.error('uso: ork ship <thread-id> --para <branch> [--de <branch>] [--dry-run]');
2069
+ console.error(m.uso);
2123
2070
  return 2;
2124
2071
  }
2125
2072
  // RM-047: como no registrar-pr, o `--remoto` so chega ao git como nome de remoto (ship.remoto-invalido),
@@ -2127,7 +2074,8 @@ function comandoShip(args) {
2127
2074
  if (args.opcoes.remoto !== undefined)
2128
2075
  (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
2129
2076
  const autorizar = args.opcoes['autorizar-push'];
2130
- const r = (0, ship_1.ship)(carregado, id, {
2077
+ // RM-061 (F2b, G2): o que o ship grava (ledger, verificacao, mensagem do merge) nasce em pt-BR.
2078
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_1.ship)(carregado, id, {
2131
2079
  para,
2132
2080
  de: texto(args.opcoes.de),
2133
2081
  remoto: texto(args.opcoes.remoto),
@@ -2135,10 +2083,28 @@ function comandoShip(args) {
2135
2083
  dryRun: args.opcoes['dry-run'] === true,
2136
2084
  autorizarPush: typeof autorizar === 'string' ? autorizar : undefined,
2137
2085
  semPush: args.opcoes['sem-push'] === true,
2138
- });
2086
+ // RM-058 N2 (A1 da rodada 2 do CHECK): o `--esperar` chega à fila pesada da verificação do ship, com aviso.
2087
+ ...((f) => ({ esperarFilaPesadaMs: f.esperarMs, avisoDaFilaPesada: { aoEsperar: f.aoEsperar, comandoDeEsperar: f.comandoDeEsperar } }))(filaPesadaDoCli(args, 'verify', `ork ship ${id} --para ${para} --esperar 30`)),
2088
+ }));
2139
2089
  console.log((0, ship_1.textoDoShip)(r));
2140
2090
  return r.ok ? 0 : 1;
2141
2091
  }
2092
+ /**
2093
+ * RM-043 (sobra achada na RM-044): opcoes que o `portfolio show` herdou do `objective`,
2094
+ * aposentado na I-43. A ajuda as listava e o `parseArgs` as aceitava, mas o `show` nunca as
2095
+ * leu: eram ignoradas em silencio. A recusa e tipada e diz para onde ir, como a do
2096
+ * `objective.aposentado`.
2097
+ */
2098
+ const SOBRAS_DO_OBJECTIVE = ['constraints', 'outcomes', 'threads', 'execution-runtime', 'validation-runtimes'];
2099
+ function recusarSobraDoObjective(opcao) {
2100
+ console.error(`portfolio.opcao-aposentada: --${opcao} era do Objective Envelope, aposentado na I-43, e o\n` +
2101
+ ' portfolio show nunca a leu. As duas vigas do envelope viraram propriedade de thread comum:\n' +
2102
+ ' ork thread new "<nome>" --modo <MODO> --exige-runtime-diferente\n' +
2103
+ ' o CHECK precisa de runtime que o GO nao usou\n' +
2104
+ ' ork thread new "<nome>" --modo <MODO> --done "<criterio> :: <comando>"\n' +
2105
+ ' criterio de pronto EXECUTAVEL, que vira claim e roda no ork verify');
2106
+ return 2;
2107
+ }
2142
2108
  function comandoPortfolio(args) {
2143
2109
  const root = (0, manifest_1.exigirManifesto)().raiz;
2144
2110
  const sub = args.posicionais[1] ?? 'list';
@@ -2166,6 +2132,9 @@ function comandoPortfolio(args) {
2166
2132
  return 0;
2167
2133
  }
2168
2134
  if (sub === 'show') {
2135
+ const sobra = SOBRAS_DO_OBJECTIVE.find((opcao) => args.opcoes[opcao] !== undefined);
2136
+ if (sobra)
2137
+ return recusarSobraDoObjective(sobra);
2169
2138
  const id = args.posicionais[2];
2170
2139
  if (!id) {
2171
2140
  console.error('uso: ork portfolio show <id>');
@@ -2455,6 +2424,9 @@ const CONTRATO_DO_BOARD = 'ork.board/v1';
2455
2424
  function comandoFabrica(args) {
2456
2425
  const carregado = (0, manifest_1.exigirManifesto)();
2457
2426
  const sub = args.posicionais[1];
2427
+ // RM-063 (F1): a batida e do crontab desta maquina; nao le nem escreve o remoto.
2428
+ if (sub === 'batida')
2429
+ return comandoDaBatida(carregado, args);
2458
2430
  // RM-047: o remoto vem do manifesto de quem fez o repositorio; fora do formato, recusa antes do git.
2459
2431
  // O `publicar` recusa dentro do try (publicarMaquina), para o silencioso deixar a recusa no log.
2460
2432
  const remoto = texto(args.opcoes.remoto) ?? carregado.manifesto.fabrica.remoto;
@@ -2478,6 +2450,9 @@ function comandoFabrica(args) {
2478
2450
  : `Fabrica: retrato de ${r.maquina} igual ao ultimo publicado; nada a enviar (use --forcar para publicar mesmo assim).`);
2479
2451
  if (!(0, maquina_1.fabricaCompartilhada)(carregado.manifesto) && !silencioso) {
2480
2452
  console.log(' esta maquina nao entrou na fabrica compartilhada: so publica quando voce pede (ork fabrica entrar liga).');
2453
+ // RM-047 (P5): o manifesto que pede a fabrica nao liga a publicacao desta maquina.
2454
+ if (carregado.manifesto.fabrica.compartilhada)
2455
+ console.log(' o orkastery.yaml pede a fabrica compartilhada; quem liga e a maquina, com ork fabrica entrar.');
2481
2456
  }
2482
2457
  return 0;
2483
2458
  }
@@ -2511,13 +2486,14 @@ function comandoFabrica(args) {
2511
2486
  console.log(`Fabrica: ${(0, maquina_1.nomeDaMaquina)()} saiu; nada mais e publicado daqui.` +
2512
2487
  (r ? ` Retrato removido de ork/fabrica-estado (${r.slice(0, 7)}).` : ' Nao havia retrato desta maquina na branch.'));
2513
2488
  if ((0, maquina_1.fabricaCompartilhada)(carregado.manifesto))
2514
- console.log(' AVISO: o manifesto do projeto (ou ORK_FABRICA_COMPARTILHADA) ainda liga a fabrica aqui.');
2489
+ console.log(' AVISO: ORK_FABRICA_COMPARTILHADA=1 neste shell ainda liga a fabrica aqui.');
2515
2490
  void config;
2516
2491
  return 0;
2517
2492
  }
2518
2493
  if (sub !== undefined && sub !== 'list') {
2519
2494
  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');
2495
+ console.error('uso: ork fabrica [--json] [--sem-remoto] | fabrica publicar [--forcar] [--json] | fabrica entrar [--maquina NOME] | fabrica sair' +
2496
+ ' | fabrica batida [status|instalar|remover] [--por Q] [--json]');
2521
2497
  return 2;
2522
2498
  }
2523
2499
  // RM-052: a fabrica le a branch de UM projeto, no remoto dele; o cabecalho diz qual e o que ficou de fora.
@@ -2538,8 +2514,34 @@ function comandoFabrica(args) {
2538
2514
  console.log(url === null
2539
2515
  ? `Fabrica: o projeto ${carregado.manifesto.project.name} nao tem o remoto ${remoto}; nada foi lido de ork/fabrica-estado.`
2540
2516
  : (0, fabrica_estado_1.textoDaFabrica)(painel, (0, maquina_1.nomeDaMaquina)()));
2517
+ // RM-047 (P5): o manifesto pede a fabrica, mas quem liga a publicacao e a maquina.
2518
+ const pedida = (0, maquina_1.avisoDaFabricaPedida)(carregado.manifesto);
2519
+ if (pedida)
2520
+ console.log(`\n${pedida}`);
2541
2521
  return 0;
2542
2522
  }
2523
+ /**
2524
+ * RM-063 (F1): `ork fabrica batida` instala, mostra e remove a batida da varredura do pulse no crontab desta
2525
+ * maquina. `status` sai 0 com a batida instalada e 1 sem ela (ou sem crontab legivel); `instalar` e
2526
+ * `remover` gravam o evento no ledger da maquina quando o crontab muda.
2527
+ */
2528
+ function comandoDaBatida(carregado, args) {
2529
+ const acao = args.posicionais[2] ?? 'status';
2530
+ const json = args.opcoes.json === true;
2531
+ if (acao === 'status') {
2532
+ const estado = (0, fabrica_batida_1.estadoDaBatida)(carregado.raiz);
2533
+ console.log(json ? JSON.stringify(estado, null, 2) : (0, fabrica_batida_1.textoDoEstadoDaBatida)(estado));
2534
+ return estado.leitura.ok && estado.instalada ? 0 : 1;
2535
+ }
2536
+ if ((acao === 'instalar' || acao === 'remover') && args.posicionais.length === 3) {
2537
+ const por = texto(args.opcoes.por);
2538
+ const r = acao === 'instalar' ? (0, fabrica_batida_1.instalarBatida)(carregado.raiz, { por }) : (0, fabrica_batida_1.removerBatida)(carregado.raiz, { por });
2539
+ console.log(json ? JSON.stringify(r, null, 2) : (0, fabrica_batida_1.textoDoResultadoDaBatida)(r));
2540
+ return 0;
2541
+ }
2542
+ console.error('uso: ork fabrica batida [status|instalar|remover] [--por Q] [--json]');
2543
+ return 2;
2544
+ }
2543
2545
  /**
2544
2546
  * RM-053: `ork network` e a Orkastery Network, as maquinas de uma pessoa em rede. Roda de qualquer
2545
2547
  * diretorio, com ou sem projeto: a rede e da pessoa, nao de um repositorio. O projeto do diretorio
@@ -2805,8 +2807,9 @@ function comandoMaster(args) {
2805
2807
  const id = args.posicionais[2];
2806
2808
  const formato = texto(args.opcoes.formato) ?? 'telegram';
2807
2809
  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) });
2810
+ throw new Error((0, locale_1.msg)().master.usoPedir);
2811
+ // RM-061 (F2b, G2): o pedido de nota e gravado no escopo pt-BR; o erro da entrega volta no locale do comando.
2812
+ 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
2813
  console.log(formato === 'json' ? JSON.stringify(pedido, null, 2) : (0, master_nota_1.textoDoPedidoDeNota)(carregado.raiz, pedido, formato));
2811
2814
  return 0;
2812
2815
  }
@@ -2952,7 +2955,7 @@ function comandoAceitarOmissao(args, raiz, posicional) {
2952
2955
  const candidatos = [posicional, texto(args.opcoes.thread), typeof bruto === 'string' ? bruto : undefined]
2953
2956
  .filter((v) => typeof v === 'string' && v.trim() !== '').map((v) => v.trim());
2954
2957
  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)');
2958
+ console.error((0, locale_1.msg)().master.usoOmissao);
2956
2959
  return 2;
2957
2960
  }
2958
2961
  const alvo = candidatos[0];
@@ -2974,32 +2977,35 @@ function comandoAceitarOmissao(args, raiz, posicional) {
2974
2977
  console.log(JSON.stringify({ dryRun: true, fecharia }, null, 2));
2975
2978
  return 0;
2976
2979
  }
2977
- console.log('Ensaio (--dry-run): nada foi gravado.');
2980
+ const m = (0, locale_1.msg)().master;
2981
+ console.log(m.ensaio);
2978
2982
  if (fecharia.length === 0) {
2979
- console.log('Nenhuma entrega esperando decisao.');
2983
+ console.log(m.nadaEsperando);
2980
2984
  return 0;
2981
2985
  }
2982
- console.log(`Fecharia por omissao: ${fecharia.length}.`);
2986
+ console.log(m.fecharia(fecharia.length));
2983
2987
  for (const f of fecharia)
2984
- console.log(` ${f.thread.padEnd(20)} indice ${f.indice.valor}/${f.indice.base}`);
2988
+ console.log(m.linhaDoIndice(f.thread, f.indice.valor, f.indice.base));
2985
2989
  avisoDeOmissaoSemAlvo(alvo, fecharia.length, true);
2986
2990
  return 0;
2987
2991
  }
2988
- const aceitos = (0, master_2.aceitarPendentesPorOmissao)(raiz, { thread: alvo });
2992
+ // RM-061 (F2b, G2): o MASTER log, o POSTMORTEM e o registro da omissao nascem em pt-BR.
2993
+ const aceitos = (0, locale_1.comLocale)('pt-BR', () => (0, master_2.aceitarPendentesPorOmissao)(raiz, { thread: alvo }));
2989
2994
  avisoDeOmissaoSemAlvo(alvo, aceitos.length, false);
2990
2995
  if (json) {
2991
2996
  console.log(JSON.stringify(aceitos, null, 2));
2992
2997
  return 0;
2993
2998
  }
2999
+ const m = (0, locale_1.msg)().master;
2994
3000
  if (aceitos.length === 0) {
2995
- console.log('Nenhuma entrega esperando decisao.');
3001
+ console.log(m.nadaEsperando);
2996
3002
  return 0;
2997
3003
  }
2998
- console.log(`Aceitas por omissao: ${aceitos.length}. O indice e os insumos foram ao ledger.`);
3004
+ console.log(m.aceitas(aceitos.length));
2999
3005
  for (const a of aceitos)
3000
- console.log(` ${a.thread.padEnd(20)} indice ${a.indice.valor}/${a.indice.base}`);
3006
+ console.log(m.linhaDoIndice(a.thread, a.indice.valor, a.indice.base));
3001
3007
  console.log('');
3002
- console.log('Discordou? A nota humana sobrescreve, e o registro da omissao permanece.');
3008
+ console.log(m.discordou);
3003
3009
  return 0;
3004
3010
  }
3005
3011
  /**
@@ -3015,10 +3021,8 @@ function avisoDeOmissaoSemAlvo(alvo, quantas, ensaio) {
3015
3021
  return;
3016
3022
  const propria = (process.env[runtime_ambiente_1.ENV_THREAD_DO_DESPACHO] ?? '').trim();
3017
3023
  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)'));
3024
+ console.error((0, locale_1.msg)().master.avisoSemThread(marca, ensaio, quantas));
3025
+ console.error((0, locale_1.msg)().master.avisoSoASua(propria || '<thread-id>', ensaio));
3022
3026
  }
3023
3027
  /** I-55 (RM-008): `ork licoes` mostra o que volta no proximo GOAL e PLAN, e as propostas de policy. */
3024
3028
  function comandoLicoes(args) {
@@ -3057,9 +3061,26 @@ function comandoRoadmap(args) {
3057
3061
  : soltas.map((s) => `${s.item}: ${s.detalhe} (thread fechada ${s.thread})`).join('\n'));
3058
3062
  return 0;
3059
3063
  }
3060
- const painel = (0, roadmap_reservas_1.listarReservas)(carregado.raiz, { remoto });
3064
+ // RM-052 (fatia 2, D4): as reservas moram no remoto do projeto. Sem ele, nada e lido; com ele mudo e
3065
+ // sem copia, tambem nao. A resposta diz qual projeto leu e o que ficou de fora, nunca "nenhum item".
3066
+ // RM-047: nome fora do formato de remoto recusa antes do git, como sempre.
3067
+ const nomeDoRemoto = (0, branch_de_estado_1.exigirRemoto)(remoto ?? roadmap_reservas_1.REMOTO_PADRAO, 'roadmap');
3068
+ const url = (0, projeto_alvo_1.remotoDoProjeto)(carregado.raiz, nomeDoRemoto);
3069
+ const painel = url === null ? { reservas: [], feats: [], atualizado: false, ponta: null }
3070
+ : (0, roadmap_reservas_1.listarReservas)(carregado.raiz, { remoto });
3071
+ const leitura = (0, roadmap_reservas_1.leituraDasReservas)(painel, url !== null);
3061
3072
  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));
3073
+ const lido = leitura === 'lido-agora' || leitura === 'copia-local';
3074
+ const consulta = (0, projeto_alvo_1.consultaDoProjeto)(carregado, {
3075
+ remoto: url,
3076
+ lido: lido ? [`reservas do roadmap (${roadmap_reservas_1.BRANCH_DE_RESERVAS} em ${nomeDoRemoto}, ${leitura === 'lido-agora' ? 'lido agora' : 'última cópia local'})`] : [],
3077
+ naoLido: [projeto_alvo_1.FORA_DA_CONSULTA.roadmap,
3078
+ ...(leitura === 'sem-remoto' ? [`reservas do roadmap: o projeto não tem o remoto ${nomeDoRemoto}, nada foi lido de ${roadmap_reservas_1.BRANCH_DE_RESERVAS}`]
3079
+ : 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}`]
3080
+ : [])],
3081
+ });
3082
+ console.log(args.opcoes.json === true ? JSON.stringify({ ...painel, orfas, leitura, consulta }, null, 2)
3083
+ : [...(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
3084
  return 0;
3064
3085
  }
3065
3086
  if (sub === 'status') {
@@ -3067,7 +3088,11 @@ function comandoRoadmap(args) {
3067
3088
  // RM-052: com o projeto consultado e o que ficou de fora (as outras maquinas nao sao lidas aqui).
3068
3089
  const consulta = (0, projeto_alvo_1.consultaDoProjeto)(carregado, { lido: ['roadmap (docs/roadmap)', projeto_alvo_1.FORA_DA_CONSULTA.threadsDaMaquina],
3069
3090
  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 });
3091
+ // RM-061 (F2b, G2): o status e montado em pt-BR, como o --json; so o texto segue o locale. Os canais (Hermes,
3092
+ // OpenClaw) transportam o texto: com owner.language ou LANG en no host, o dono o recebe em ingles.
3093
+ // RM-063 (F2): o fecho le a mesma fila do `ork pulse`, sem forja e sem registrar.
3094
+ const status = (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_status_1.montarStatusDoRoadmap)(carregado.raiz, { projeto: carregado.manifesto.project.name, consulta,
3095
+ fila: (quando) => (0, pulse_1.filaDoDono)(carregado, { quando }) }));
3071
3096
  console.log(args.opcoes.json === true ? JSON.stringify(status, null, 2) : (0, roadmap_status_1.textoDoStatusDoRoadmap)(status));
3072
3097
  return 0;
3073
3098
  }
@@ -3190,11 +3215,13 @@ function comandoDocs(args) {
3190
3215
  return 0;
3191
3216
  }
3192
3217
  if (sub === 'init') {
3193
- const criados = (0, docs_1.iniciarDocs)(raiz);
3218
+ // RM-061 (F3a, D1 e D5): os sete arquivos nascem na lingua do dono, resolvida pelo manifesto (tambem com `--json`,
3219
+ // que tira so o texto impresso do locale); o texto segue o locale do comando coberto.
3220
+ const criados = (0, docs_1.iniciarDocs)(raiz, (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale);
3221
+ const m = (0, locale_1.msg)().gerados.docsInit;
3194
3222
  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'));
3223
+ ? m.jaEstava
3224
+ : [m.criado, ...criados.map((c) => ` ${c}`), '', m.proximoPasso].join('\n'));
3198
3225
  return 0;
3199
3226
  }
3200
3227
  console.error(`uso: ork docs verificar [--json] [--pr] | sincronizar [--escrever] [--so RM-NNN] [--todos] | init`);
@@ -3250,12 +3277,18 @@ function comandoPrompt(args) {
3250
3277
  return 2;
3251
3278
  }
3252
3279
  const thread = (0, thread_1.lerThread)(obrigatorio.raiz, threadId);
3280
+ // RM-059 (T6.0): sem --pedido, o pedido guardado na criacao, conferido pelo sha256; thread sem pedido
3281
+ // guardado segue com o texto de exemplo, como antes.
3282
+ const guardado = texto(args.opcoes.pedido) === undefined ? (0, thread_1.pedidoDaThread)(obrigatorio.raiz, thread) : null;
3283
+ const pedidoDaFase = guardado?.texto ?? pedido;
3253
3284
  const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, obrigatorio.raiz) : (0, prompts_1.templateDaFase)(fase, obrigatorio.raiz);
3254
3285
  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);
3286
+ ? (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(thread, fase, pedidoDaFase))
3287
+ : (0, phase_1.montarPrompt)(thread, fase, pedidoDaFase, obrigatorio.raiz);
3257
3288
  console.log(`# template ${template.id} v${template.versao} (origem: ${template.origem})`);
3258
3289
  console.log(`# thread ${thread.id}, fase ${fase}, sha256 ${(0, phase_1.hashDoPrompt)(prompt)}`);
3290
+ if (guardado)
3291
+ console.log(`# pedido guardado na criacao da thread (sha256 ${(0, util_1.shaCurto)(guardado.sha256)})`);
3259
3292
  console.log('');
3260
3293
  console.log(prompt);
3261
3294
  return 0;
@@ -3327,6 +3360,8 @@ function comandoAdapter(args) {
3327
3360
  // unico caminho de saida. `;` separa varios, como o resto do CLI ja faz.
3328
3361
  aceitarCatalogo: (texto(args.opcoes['aceitar-catalogo']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
3329
3362
  manterCopia: (texto(args.opcoes['manter-copia']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
3363
+ // RM-061 (F3a, D1 e D9): o bloco da experiência nasce na língua do dono; o texto impresso segue em pt-BR (F3b).
3364
+ locale: (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale,
3330
3365
  });
3331
3366
  console.log((0, hosts_1.textoDaInstalacao)(r));
3332
3367
  return r.ok ? 0 : 2;
@@ -3341,7 +3376,8 @@ function comandoAdapter(args) {
3341
3376
  * de zero em qualquer falha, para o CI do kit poder barrar merge sem eval.
3342
3377
  */
3343
3378
  function comandoEval(args) {
3344
- const catalogo = (0, catalogo_1.exigirCatalogo)((0, manifest_1.carregarManifesto)()?.raiz ?? (0, manifest_1.diretorioDoProjeto)());
3379
+ // RM-047 (P4): o eval so executa o catalogo do proprio pacote, nunca o achado a partir do cwd.
3380
+ const catalogo = (0, catalogo_1.exigirCatalogoDoPacote)((0, manifest_1.carregarManifesto)()?.raiz ?? (0, manifest_1.diretorioDoProjeto)());
3345
3381
  const lista = (v) => {
3346
3382
  const t = texto(v);
3347
3383
  return t ? t.split(',').map((x) => x.trim()).filter(Boolean) : undefined;
@@ -3492,6 +3528,9 @@ function comandoAudit(args) {
3492
3528
  return 0;
3493
3529
  }
3494
3530
  if (sub === 'show') {
3531
+ const sobra = SOBRAS_DO_OBJECTIVE.find((opcao) => args.opcoes[opcao] !== undefined);
3532
+ if (sobra)
3533
+ return recusarSobraDoObjective(sobra);
3495
3534
  const id = args.posicionais[2];
3496
3535
  if (!id) {
3497
3536
  console.error('uso: ork audit show <rodada> [--ledger]');
@@ -3740,8 +3779,9 @@ function comandoAudit(args) {
3740
3779
  * que sempre teve. E o que garante que ligar o B6 nao muda o que o builder ja conhece.
3741
3780
  */
3742
3781
  function relatarPublicacao(r) {
3782
+ const m = (0, locale_1.msg)().thread;
3743
3783
  if (r.publicacao?.estado === 'pendente') {
3744
- console.log(`Memoria: publicacao pendente (${r.publicacao.motivo}); ativacao explicita necessaria.`);
3784
+ console.log(m.publicacaoPendente(`${r.publicacao.motivo}`));
3745
3785
  return;
3746
3786
  }
3747
3787
  if (r.regime !== 'orkmind')
@@ -3754,9 +3794,9 @@ function relatarPublicacao(r) {
3754
3794
  r.roadmap?.ok ? '1 roadmap' : '',
3755
3795
  ].filter((t) => t !== '');
3756
3796
  console.log('');
3757
- console.log(`Memoria (orkmind, tenant ${r.estado.tenant}): ${gravados.join(', ') || 'nada a gravar'}.`);
3797
+ console.log(m.memoriaGravada(`${r.estado.tenant}`, gravados.join(', ') || m.nadaAGravar));
3758
3798
  if (r.falhas > 0)
3759
- console.log(` ${r.falhas} gravacao(oes) nao concluida(s); veja ork memory status.`);
3799
+ console.log(m.gravacoesFalhas(r.falhas));
3760
3800
  }
3761
3801
  /** Janela de origem e corte de apresentação são inteiros positivos explícitos. */
3762
3802
  function limiteDeLeitura(valor) {
@@ -3996,7 +4036,7 @@ function avisoRoadmapSemAssociacao(nome, roadmap) {
3996
4036
  const item = /\bRM-\d{3}\b/i.exec(nome)?.[0].toUpperCase();
3997
4037
  if (!item || roadmap)
3998
4038
  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.`;
4039
+ return (0, locale_1.msg)().thread.roadmapNoNome(item);
4000
4040
  }
4001
4041
  /**
4002
4042
  * `ork memory search --texto` (I-38 D7): busca por significado, separada da busca por tag.
@@ -4088,24 +4128,58 @@ function extrairOpcaoDeProjeto(argv) {
4088
4128
  }
4089
4129
  /** Comandos que nao leem projeto: o alvo nao e resolvido (nem recusado) para eles. */
4090
4130
  const COMANDOS_SEM_PROJETO = new Set(['demo', 'ciclos', 'mcp', 'init', 'projetos']);
4131
+ /**
4132
+ * Fatia 2 (D3): os comandos que leem projeto e nao terminam com a linha `Projeto consultado`. Hoje so
4133
+ * o `sessions event`, o sensor dos hooks do Claude Code: maquina falando com maquina, e o sensor compara
4134
+ * o stderr da recusa. O `maestro` declara no snapshot e nao passa por aqui.
4135
+ */
4136
+ const SEM_DECLARACAO_DO_PROJETO = new Set(['sessions event']);
4091
4137
  /**
4092
4138
  * Comandos cujo `--projeto` e DELES (RM-054: `ork network roadmap --projeto github:dono/repo`, que
4093
4139
  * le varios projetos). A opcao volta intacta ao argv do subcomando e o alvo global nao e resolvido:
4094
4140
  * nem `--projeto`, nem `ORK_PROJETO`, nem o modo host escolhem um projeto por eles.
4095
4141
  */
4096
4142
  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) {
4143
+ /**
4144
+ * Resolve e fixa o projeto-alvo do processo (D2, D3). `null`: vale o cwd de sempre. Fatia 2 (D3): com
4145
+ * `declarar`, o comando termina dizendo qual projeto leu, quando o leitor nao tem como saber.
4146
+ */
4147
+ function fixarAlvoDoProcesso(projeto, declarar = true) {
4099
4148
  const alvo = (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto ?? null });
4100
4149
  (0, projeto_alvo_1.fixarProjetoAlvo)(alvo);
4150
+ if (declarar)
4151
+ (0, projeto_alvo_1.pedirDeclaracaoDoProjeto)(alvo);
4101
4152
  return alvo;
4102
4153
  }
4154
+ /**
4155
+ * RM-052 (fatia 2, D3): o comando que leu um projeto que o leitor nao tem como adivinhar (no host, ou
4156
+ * fora do diretorio dele) escreve no fim a linha `Projeto consultado: ...` no stderr, salvo se ja montou
4157
+ * o proprio cabecalho. Quando ele falha, a linha sai antes da mensagem de erro, que a entrada imprime.
4158
+ */
4103
4159
  function main(argvBruto) {
4104
4160
  // I-35: todo horário para pessoa sai no fuso do dono deste projeto (lido só se for preciso, e já
4105
4161
  // depois de o projeto-alvo abaixo estar fixado: a fonte é preguiçosa).
4106
4162
  (0, horario_1.registrarFonteDoFuso)(() => (0, horario_1.fusoDoManifesto)((0, manifest_1.carregarManifesto)()));
4107
4163
  // RM-052: sem alvo herdado de uma chamada anterior no mesmo processo (os testes chamam `main` em serie).
4108
4164
  (0, projeto_alvo_1.fixarProjetoAlvo)(null);
4165
+ // Prova de conceito do CLI por locale: cada chamada comeca em pt-BR; so os comandos cobertos trocam.
4166
+ (0, locale_1.ativarLocale)(undefined);
4167
+ // RM-061 (F2b, D1): e sem o registro dos textos remontaveis, que so os comandos cobertos ligam.
4168
+ (0, locale_1.ligarRemontagem)(false);
4169
+ (0, projeto_alvo_1.iniciarDeclaracaoDoProjeto)();
4170
+ try {
4171
+ return executarComando(argvBruto);
4172
+ }
4173
+ finally {
4174
+ // RM-061 (F2b): o registro dos textos remontaveis nao sobrevive a chamada (o locale sim: a entrada do CLI
4175
+ // ainda imprime o erro no locale do comando).
4176
+ (0, locale_1.ligarRemontagem)(false);
4177
+ const linha = (0, projeto_alvo_1.declaracaoQueFaltou)();
4178
+ if (linha)
4179
+ console.error(linha);
4180
+ }
4181
+ }
4182
+ function executarComando(argvBruto) {
4109
4183
  const extraida = extrairOpcaoDeProjeto(argvBruto);
4110
4184
  const proprio = exports.COMANDOS_COM_PROJETO_PROPRIO.has(parseArgs(extraida.argv).posicionais[0] ?? '');
4111
4185
  const argv = proprio && extraida.projeto !== undefined
@@ -4132,8 +4206,9 @@ function main(argvBruto) {
4132
4206
  if (argv[0] === 'maestro') {
4133
4207
  if (argv.length === 2 && argv[1] === '--help')
4134
4208
  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);
4209
+ // RM-052: o alvo explicito vira SELECAO entre as raizes permitidas; sem ele, o cwd de sempre. O
4210
+ // snapshot ja declara o projeto consultado (project.root, notConsulted): sem a linha da fatia 2.
4211
+ const alvo = fixarAlvoDoProcesso(projeto, false);
4137
4212
  return alvo ? (0, maestro_cli_1.runMaestroCli)(argv.slice(1), alvo.raiz, { allowedRoots: [alvo.raiz], selected: alvo.raiz })
4138
4213
  : (0, maestro_cli_1.runMaestroCli)(argv.slice(1));
4139
4214
  }
@@ -4145,11 +4220,13 @@ function main(argvBruto) {
4145
4220
  return 0;
4146
4221
  }
4147
4222
  if (!comando || args.opcoes.help === true || comando === 'help') {
4148
- console.log(AJUDA);
4223
+ (0, locale_1.ativarLocale)(localeDaAjuda(projeto));
4224
+ console.log((0, locale_1.msg)().ajuda.texto(dadosDaAjuda()));
4149
4225
  return 0;
4150
4226
  }
4151
- if (!COMANDOS_SEM_PROJETO.has(comando) && !proprio)
4152
- fixarAlvoDoProcesso(projeto);
4227
+ if (!COMANDOS_SEM_PROJETO.has(comando) && !proprio) {
4228
+ fixarAlvoDoProcesso(projeto, !SEM_DECLARACAO_DO_PROJETO.has(`${comando} ${args.posicionais[1] ?? ''}`.trim()));
4229
+ }
4153
4230
  else if (projeto !== undefined && comando !== 'projetos') {
4154
4231
  throw new Error(comando === 'init'
4155
4232
  ? 'uso: ork init cria o projeto no diretório atual; entre nele e rode ork init, sem --projeto'
@@ -4167,6 +4244,13 @@ function main(argvBruto) {
4167
4244
  for (const nome of runtime_ambiente_1.ENVS_DE_PROVIDER_PAGO)
4168
4245
  delete process.env[nome];
4169
4246
  }
4247
+ // CLI por locale (RM-061, EN1 e EN7): a escolha do onboarding (owner.language) ou o LC_ALL/LC_MESSAGES/LANG
4248
+ // decidem a lingua do TEXTO dos comandos cobertos (`cobreLocale`); `--json` e contrato, e os recortes da D2
4249
+ // da F2a (`doctor --modo`, `thread new --from-finding` e os subcomandos fora da lista) ficam em pt-BR.
4250
+ if ((0, locale_1.cobreLocale)(args.posicionais, args.opcoes)) {
4251
+ (0, locale_1.ativarLocale)((0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale);
4252
+ (0, locale_1.ligarRemontagem)(true);
4253
+ }
4170
4254
  switch (comando) {
4171
4255
  case 'mcp': {
4172
4256
  const projeto = texto(args.opcoes.project), host = texto(args.opcoes.host), threadId = texto(args.opcoes.thread);
@@ -4210,40 +4294,47 @@ function main(argvBruto) {
4210
4294
  return r.prontoPrimeiroBloco ? 0 : 1;
4211
4295
  }
4212
4296
  // 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));
4297
+ // RM-061 (F2a): a redacao do check vem do catalogo, no locale do comando (a familia do grafo nao o importa).
4298
+ const r = (0, doctor_1.doctor)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, () => (0, intelligence_graph_cli_1.checarAnalisadoresDoGrafo)(versao_1.VERSAO_DO_ORK, undefined, undefined, (0, locale_1.msg)().doctor.grafo));
4214
4299
  console.log(r.texto);
4215
4300
  return r.codigo;
4216
4301
  }
4217
4302
  case 'init': {
4218
4303
  (0, init_1.exigirRepositorioParaInit)(process.cwd());
4304
+ // RM-061 (F3a, D1 e D2): os arquivos nascem na lingua do dono no momento da geracao, resolvida pelo manifesto lido
4305
+ // antes do `--force` regrava-lo (o YAML e o AGENTS.md saem na mesma lingua) e independente do texto impresso, que
4306
+ // nao segue o locale com `--json` (GO-FIX do CHECK, W3).
4307
+ const localeDosArquivos = (0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale;
4219
4308
  const r = (0, init_1.init)(process.cwd(), {
4220
4309
  force: args.opcoes.force === true,
4221
4310
  nome: texto(args.opcoes.name) ?? texto(args.opcoes.nome),
4222
4311
  abbrev: texto(args.opcoes.abbrev),
4312
+ locale: localeDosArquivos,
4223
4313
  });
4224
4314
  const carregado = (0, manifest_1.exigirManifesto)(r.deteccao.raiz);
4225
- const agents = (0, agents_md_1.atualizarAgentsMd)(r.deteccao.raiz, carregado.manifesto);
4315
+ const agents = (0, agents_md_1.atualizarAgentsMd)(r.deteccao.raiz, carregado.manifesto, localeDosArquivos);
4226
4316
  // RM-052 (D7): o projeto entra no registro desta maquina; falha vira aviso, nunca derruba o init.
4227
4317
  const avisoDoRegistro = (0, projeto_alvo_1.registrarProjetoEmSilencio)(r.deteccao.raiz, 'init');
4228
4318
  if (avisoDoRegistro)
4229
4319
  console.error(avisoDoRegistro);
4320
+ const m = (0, locale_1.msg)().init, estadoAgents = m.estadosAgents[agents.estado] ?? agents.estado;
4230
4321
  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}`);
4322
+ console.log(m.jaExiste(r.caminho));
4323
+ console.log(m.nadaSobrescrito);
4324
+ console.log(m.agentsMd(estadoAgents, agents.caminho));
4234
4325
  return 0;
4235
4326
  }
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}`);
4327
+ console.log(m.criado(r.caminho));
4328
+ console.log(m.projeto(r.deteccao.nome, r.deteccao.abbrev));
4329
+ console.log(m.branchBase(r.deteccao.baseBranch));
4330
+ console.log(m.gerenciador(r.deteccao.gerenciador));
4331
+ console.log(m.verify(Object.entries(r.deteccao.verify).map(([k, v]) => `${k}="${v}"`).join(', ') || m.semScript));
4332
+ console.log(m.agentsMdLinha(estadoAgents, agents.caminho));
4242
4333
  // Fatia 2 do ensaio da 0.5.0 (P3): o estado fica fora do git por um `.gitignore` proprio.
4243
4334
  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á)`);
4335
+ console.log(m.estado(manifest_1.DIR_ESTADO));
4245
4336
  console.log('');
4246
- console.log(init_2.PROXIMO_PASSO_INIT);
4337
+ console.log(m.proximoPasso);
4247
4338
  return 0;
4248
4339
  }
4249
4340
  case 'modos': {
@@ -4311,16 +4402,17 @@ function main(argvBruto) {
4311
4402
  }
4312
4403
  if ((args.posicionais[1] ?? 'show') !== 'show' || args.posicionais.length > 2 ||
4313
4404
  Object.keys(args.opcoes).some(k => k !== 'json') || ('json' in args.opcoes && args.opcoes.json !== true)) {
4314
- throw Error('uso: ork experiencia show [--json]');
4405
+ throw Error((0, locale_1.msg)().onboarding.experienciaUso);
4315
4406
  }
4316
4407
  const manifesto = (0, manifest_1.exigirManifesto)(), p = (0, experiencia_1.resolverExperiencia)(manifesto.manifesto.owner);
4317
4408
  // Preferência inválida vale o padrão e faz o adapter install pular o pacote: a consulta avisa.
4318
4409
  const avisos = manifesto.avisos.filter(a => a.startsWith('experiencia.config.invalid'));
4410
+ const m = (0, locale_1.msg)().onboarding;
4319
4411
  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` +
4412
+ `${m.experiencia(p.experience, p.language, p.timezone, p.depth)}\nSkill: ${p.skill}\n` +
4321
4413
  // 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(''));
4414
+ m.experienciaOrigens(Object.entries(p.origem).map(([chave, origem]) => `${chave} ${m.origemDaPreferencia(origem)}`).join(', ')) +
4415
+ avisos.map(a => `\n${m.experienciaAviso(m.avisoDaPreferencia(a))}`).join(''));
4324
4416
  return 0;
4325
4417
  }
4326
4418
  case 'thread':
@@ -4355,10 +4447,12 @@ function main(argvBruto) {
4355
4447
  }
4356
4448
  if (args.posicionais[1] === 'cadencia')
4357
4449
  return comandoCadenciaDoPulse(args);
4358
- const p = (0, pulse_1.montarPulse)((0, manifest_1.exigirManifesto)(), { registrar: args.opcoes.registrar === true,
4450
+ // RM-061 (F2b, G2): o pulse grava (sensores, condução) e monta o --json em pt-BR; so o texto segue o locale.
4451
+ const carregadoDoPulse = (0, manifest_1.exigirManifesto)();
4452
+ const p = (0, locale_1.comLocale)('pt-BR', () => (0, pulse_1.montarPulse)(carregadoDoPulse, { registrar: args.opcoes.registrar === true,
4359
4453
  escopo: texto(args.opcoes.escopo)?.split(',').map(s => s.trim()),
4360
4454
  semRuntime: args.opcoes['sem-runtime'] === true,
4361
- linhasLogs: texto(args.opcoes.linhas) === undefined ? undefined : Number(texto(args.opcoes.linhas)) });
4455
+ linhasLogs: texto(args.opcoes.linhas) === undefined ? undefined : Number(texto(args.opcoes.linhas)) }));
4362
4456
  console.log(args.opcoes.json === true ? JSON.stringify(p, null, 2) : (0, pulse_1.textoDoPulse)(p));
4363
4457
  return p.runtime.ok || args.opcoes['sem-runtime'] === true ? 0 : 1;
4364
4458
  }
@@ -4440,8 +4534,9 @@ function main(argvBruto) {
4440
4534
  console.log((0, ciclos_1.tabelaDeVariantes)());
4441
4535
  return 0;
4442
4536
  default:
4443
- console.error(`comando desconhecido: ${comando}`);
4444
- console.log(AJUDA);
4537
+ (0, locale_1.ativarLocale)(localeDaAjuda());
4538
+ console.error((0, locale_1.msg)().ajuda.comandoDesconhecido(comando));
4539
+ console.log((0, locale_1.msg)().ajuda.texto(dadosDaAjuda()));
4445
4540
  return 2;
4446
4541
  }
4447
4542
  }
@@ -4455,13 +4550,20 @@ if (require.main === module) {
4455
4550
  console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.recusa.texto);
4456
4551
  process.exitCode = 3;
4457
4552
  }
4553
+ else if (e instanceof fila_pesada_1.ErroDaFilaPesada) {
4554
+ // 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.
4555
+ console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.recusa.texto);
4556
+ process.exitCode = 3;
4557
+ }
4458
4558
  else if (e instanceof projeto_alvo_1.ErroDeProjeto) {
4459
4559
  // RM-052 (D3): a recusa de projeto-alvo e a resposta (a escolha, os candidatos), nao um stack trace.
4460
4560
  console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.texto);
4461
4561
  process.exitCode = projeto_alvo_1.SAIDA_DE_PROJETO;
4462
4562
  }
4463
4563
  else {
4464
- console.error(`erro: ${e.message}`);
4564
+ // RM-061 (F2a, D11): o prefixo segue o locale do comando coberto; a mensagem sai como veio, salvo o
4565
+ // erro do catalogo, remontado no locale do comando (D14).
4566
+ console.error((0, locale_1.msg)().cli.erro((0, locale_1.mensagemDoErro)(e)));
4465
4567
  process.exitCode = 1;
4466
4568
  }
4467
4569
  }