@orkastery/cli 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/locale.js ADDED
@@ -0,0 +1,1258 @@
1
+ "use strict";
2
+ /**
3
+ * CLI em ingles e pt-BR (RM-061): F1 com `doctor` e `init`, F2a com o caminho da primeira experiencia.
4
+ *
5
+ * Um catalogo de mensagens por locale, sem dependencia nova: pt-BR e o padrao e a fonte; `en` e a
6
+ * alternativa. O catalogo ingles e tipado pelo portugues (`typeof PT_BR`), entao chave faltando ou
7
+ * assinatura diferente nao compila.
8
+ *
9
+ * Quem decide o locale, nesta ordem:
10
+ * 1. `owner.language` do manifesto, a escolha do onboarding (etapa maestro);
11
+ * 2. `LC_ALL`, `LC_MESSAGES` e `LANG`, a primeira nao vazia (a ordem do POSIX);
12
+ * 3. pt-BR.
13
+ * So `en*` vira ingles; qualquer outra lingua (es, fr, C, POSIX) fica no pt-BR, a lingua do CLI.
14
+ *
15
+ * O locale so vale nos comandos que o CLI ativa por `ativarLocale` (`COMANDOS_COM_LOCALE`, no texto;
16
+ * o `--json` e contrato e nao passa por aqui). Sem ativacao, tudo segue pt-BR: nenhum outro comando
17
+ * muda de lingua pela metade.
18
+ *
19
+ * F2a (D1 e D6 da thread ork-rm061f2a): o catalogo traduz o texto que o comando monta para a pessoa.
20
+ * Dado gravado (ledger, `thread.json`, prompt, estado do onboarding, recusa registrada, policy
21
+ * avaliada) e montado dentro de `comLocale('pt-BR', ...)` e sai como foi gravado. Valor que e dado,
22
+ * como o nome de um check ou o `pausaSobre` de um bloco, so e traduzido na impressao.
23
+ *
24
+ * D14: o erro que o catalogo monta e que nasce no escopo pt-BR da gravacao (`ErroDoCatalogo`: manifesto
25
+ * ausente, os erros de argumento de `thread new`, `--runtime` e o modelo ao trocar de runtime no `phase run`)
26
+ * e remontado no locale do comando pela entrada do CLI. Seguem como o modulo dono escreve, ate a familia dele migrar: o validador
27
+ * do manifesto (fora os avisos de preferencia da experiencia, traduzidos na impressao), o regime de
28
+ * memoria e o erro de estado durante a gravacao; a recusa `<prefixo>.remoto-invalido` do `exigirRemoto` (`branch-de-estado.ts`),
29
+ * que a F2b deixou em pt-BR, vai ao catalogo na F3b. O cabecalho `Projeto consultado:` e `Não lido:` e
30
+ * contrato do RM-052 com os hosts e fica igual nas duas linguas.
31
+ *
32
+ * F2b (G2 e D1 da thread ork-rm061f2b): o texto que o proprio comando monta e que tambem vai ao ledger ou
33
+ * ao `--json` (o detalhe de uma claim reexecutada, o bloqueio do ship, a razao do retry) nasce em pt-BR por
34
+ * `textoDoCatalogo`, dentro do escopo da gravacao, e a impressao o remonta no locale ativo por `remontar`.
35
+ * O registro dos montadores so existe nos comandos cobertos (`ligarRemontagem`); o servidor MCP e o cron
36
+ * nunca o ligam. O que outro processo gravou, a policy avaliada e a saida de ferramenta externa saem como
37
+ * vieram, e tambem (G5) o proximo passo e o estado da entrega de uma thread parada no condutor
38
+ * (`parado-no-condutor.ts`, a familia de entregas), ate a F3. Motivo tipado, acao e bloqueio do retry, codigo,
39
+ * comando e sha saem iguais nas duas linguas (G4); valor de estado mostrado em tabela ou entre parenteses (a
40
+ * acao do `registrar-pr`, o tipo da autorizacao do ship, o status da thread, o veredito e a cobertura do
41
+ * CHECK-REVERIFY, o titulo do grupo do roadmap, a classe do item do pulse) e dado do `--json` e so se traduz
42
+ * na impressao, pelo id (D4).
43
+ *
44
+ * F3a (D1 a D3 da thread ork-rm061f3a): o que o CLI escreve em arquivo para pessoas e agentes lerem (os comentarios
45
+ * do `orkastery.yaml`, o bloco do `AGENTS.md`, o bloco da experiencia no `CLAUDE.md` e os modelos do `ork docs init`)
46
+ * nasce na lingua do dono no momento da geracao, pela familia `gerados` e por `core/assets/docs-en/`.
47
+ * O gerador recebe o locale por parametro, com pt-BR por omissao, e so a entrada do CLI passa a lingua do dono: o
48
+ * locale ativo nunca escolhe a lingua de um arquivo. Chave, valor e marcador do arquivo nao mudam com a lingua.
49
+ *
50
+ * F3b (G4 e D1 a D5 da thread ork-rm061f3b): o resto da lista do dono (`thread list|close|entrega`, `worktree`,
51
+ * `claims`, `decisao placar`, `accounts`, `network`, `roadmap reservas|pegar|soltar|feat`, `docs verificar|sincronizar`,
52
+ * `adapter` e os erros de estado) sai pelo catalogo, com o que vai ao ledger, ao `claims.jsonl` ou ao `--json` nascido em
53
+ * pt-BR e remontado na impressao. O `ork adapter install` copia, com o dono em ingles, as variantes de
54
+ * `core/assets/{skills,references,adapters}-en/`. Seguem em pt-BR, para a F3c: `decisao registrar` (G5), `network roadmap`
55
+ * (G6), `thread new --from-finding` e os prompts de fase (G7).
56
+ *
57
+ * A família `forja` (o motivo dos erros `forja.*` e a seção forja do `ork doctor`) nasce coberta.
58
+ *
59
+ * Ingles (D8): curto, no imperativo onde e instrucao, com os mesmos termos em todo o CLI (`thread`,
60
+ * `phase`, `claim`, `verify`, `ship`, `pulse`, `lease`, `ledger`, `worktree`, `slug`). Comando, flag
61
+ * e identificador dentro de frase vao entre crases; valor que e so um comando (a linha `fix:`) fica nu.
62
+ */
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ exports.ErroDoCatalogo = exports.COMANDOS_COM_LOCALE = exports.LOCALE_PADRAO = void 0;
65
+ exports.chaveDoLocale = chaveDoLocale;
66
+ exports.cobreLocale = cobreLocale;
67
+ exports.localeDe = localeDe;
68
+ exports.resolverLocale = resolverLocale;
69
+ exports.linguaDeclaradaDoDono = linguaDeclaradaDoDono;
70
+ exports.ativarLocale = ativarLocale;
71
+ exports.localeAtivo = localeAtivo;
72
+ exports.comLocale = comLocale;
73
+ exports.msg = msg;
74
+ exports.mensagemDoErro = mensagemDoErro;
75
+ exports.textoDoErro = textoDoErro;
76
+ exports.ligarRemontagem = ligarRemontagem;
77
+ exports.textoDoCatalogo = textoDoCatalogo;
78
+ exports.montadorDe = montadorDe;
79
+ exports.remontar = remontar;
80
+ exports.nomeDoCheck = nomeDoCheck;
81
+ const locale_onboarding_1 = require("./locale-onboarding");
82
+ const locale_thread_1 = require("./locale-thread");
83
+ const locale_phase_1 = require("./locale-phase");
84
+ const locale_ajuda_1 = require("./locale-ajuda");
85
+ const locale_verify_1 = require("./locale-verify");
86
+ const locale_ship_1 = require("./locale-ship");
87
+ const locale_retry_1 = require("./locale-retry");
88
+ const locale_master_1 = require("./locale-master");
89
+ const locale_pulse_1 = require("./locale-pulse");
90
+ const locale_roadmap_1 = require("./locale-roadmap");
91
+ const locale_gerados_1 = require("./locale-gerados");
92
+ const locale_worktree_1 = require("./locale-worktree");
93
+ const locale_estado_1 = require("./locale-estado");
94
+ const locale_security_scan_1 = require("./locale-security-scan");
95
+ const locale_claims_1 = require("./locale-claims");
96
+ const locale_decisao_1 = require("./locale-decisao");
97
+ const locale_accounts_1 = require("./locale-accounts");
98
+ const locale_network_1 = require("./locale-network");
99
+ const locale_reservas_1 = require("./locale-reservas");
100
+ const locale_docs_1 = require("./locale-docs");
101
+ const locale_adapter_1 = require("./locale-adapter");
102
+ const locale_prompts_1 = require("./locale-prompts");
103
+ const locale_conhecimento_1 = require("./locale-conhecimento");
104
+ const locale_forja_1 = require("./locale-forja");
105
+ const locale_setup_1 = require("./locale-setup");
106
+ const locale_projetos_1 = require("./locale-projetos");
107
+ const locale_operacao_restante_1 = require("./locale-operacao-restante");
108
+ const locale_conducao_1 = require("./locale-conducao");
109
+ const locale_grafo_1 = require("./locale-grafo");
110
+ const locale_audit_1 = require("./locale-audit");
111
+ exports.LOCALE_PADRAO = 'pt-BR';
112
+ /**
113
+ * Comandos cujo texto ja sai pelo catalogo, por `comando` ou por `comando subcomando`; `comando ?` e o
114
+ * subcomando desconhecido (o erro de uso e do proprio comando). Os demais seguem em pt-BR. Ficam de
115
+ * fora por decisao (D2 da F2a): `doctor --modo`, `thread new --from-finding`, `onboarding sync` e
116
+ * `experiencia uninstall`. A F2b (G3) acrescenta `verify` (com `--baseline`),
117
+ * `ship`, `ship registrar-pr`, `retry plan`, `retry run`, `master` (o indice), `master aceitar-omissao` e
118
+ * `master pedir`, `pulse` (sem `responder` nem `cadencia`) e `roadmap status`. A F3a (D5) acrescenta `docs init`, e a
119
+ * F3b (D1), o resto da lista do dono; a F3c completa `decisao registrar` e `network roadmap`. O conhecimento escrito
120
+ * (RM-026 K7, fatia 2) nasce coberto: `conhecimento listar|mostrar|colecoes|verificar` e o uso errado dele.
121
+ */
122
+ exports.COMANDOS_COM_LOCALE = ['doctor', 'init', 'onboarding show', 'onboarding set', 'onboarding reset',
123
+ 'onboarding ?', 'experiencia show', 'experiencia ?', 'thread new', 'thread status', 'thread ?',
124
+ 'phase list', 'phase run', 'phase ?', 'verify', 'ship', 'ship registrar-pr', 'retry plan', 'retry run',
125
+ 'retry policy', 'retry parse', 'retry list', 'retry resume', 'retry cancel', 'retry ?',
126
+ 'master', 'master <thread>', 'master aceitar-omissao', 'master pedir', 'master classes', 'master batch',
127
+ 'pulse', 'roadmap status', 'docs init',
128
+ // F3b (D1): o resto do CLI, na ordem do pedido.
129
+ 'thread list', 'thread close', 'thread entrega', 'worktree ensure', 'worktree sync', 'worktree audit', 'worktree release', 'worktree ?',
130
+ 'claims add', 'claims conferir', 'claims verificar', 'claims retirar', 'claims ausente', 'claims list', 'claims ?',
131
+ 'decisao registrar', 'decisao placar', 'decisao ?',
132
+ 'accounts list', 'accounts add', 'accounts remove', 'accounts check', 'accounts esgotamentos', 'accounts ?',
133
+ // F3c preserva as tres linhas contratuais do panorama; o restante do texto segue o locale.
134
+ 'network status', 'network entrar', 'network sair', 'network publicar', 'network roadmap', 'network ?',
135
+ 'roadmap reservas', 'roadmap pegar', 'roadmap soltar', 'roadmap feat', 'roadmap ?',
136
+ // O contrato que o `docs verificar` le nas paginas (chaves, valores, secoes, marcadores) segue em pt-BR; so a mensagem muda.
137
+ 'docs verificar', 'docs sincronizar', 'docs ?',
138
+ 'adapter list', 'adapter show', 'adapter install', 'adapter ?',
139
+ 'prompt list', 'prompt lint', 'prompt render', 'prompt ?',
140
+ 'conhecimento listar', 'conhecimento mostrar', 'conhecimento colecoes', 'conhecimento verificar', 'conhecimento ?', 'security-scan',
141
+ // F3d: familias restantes, acrescentadas somente quando a familia inteira entra no catalogo.
142
+ 'modos', 'ciclos', 'setup', 'projetos', 'pulse cadencia', 'pulse responder', 'ledger',
143
+ 'portfolio', 'creation', 'objective', 'ci',
144
+ 'sessions watch', 'sessions event', 'sessions list', 'sessions limpar-fantasmas', 'sessions hitl',
145
+ 'sessions request', 'sessions answer', 'sessions reconcile', 'sessions supersede', 'sessions adopt',
146
+ 'sessions logs', 'sessions stop', 'sessions attach', 'sessions ?',
147
+ 'gate context', 'gate request', 'gate answer', 'gate next', 'gate approve', 'gate ?',
148
+ 'fix open', 'fix list', 'fix reverify', 'fix ?', 'handoff export', 'handoff recall', 'handoff ?', 'recall',
149
+ 'lease list', 'lease acquire', 'lease take', 'lease release', 'lease ?',
150
+ 'board list', 'board plan', 'board plano', 'board reap', 'board ?',
151
+ 'orquestracao status', 'orquestracao ?', 'monitor', 'licoes', 'demo',
152
+ 'fabrica list', 'fabrica publicar', 'fabrica entrar', 'fabrica sair', 'fabrica batida', 'fabrica ?', 'eval',
153
+ 'memory status', 'memory inventory', 'memory migrate', 'memory sync', 'memory search', 'memory index', 'memory ?',
154
+ 'mcp install', 'conducao status', 'conducao assumir', 'conducao atualizar', 'conducao autorizar',
155
+ 'conducao autorizacao', 'conducao batida', 'conducao sentinela', 'conducao ?', 'grafo',
156
+ 'audit packs', 'audit pack', 'audit lint', 'audit run', 'audit list', 'audit show', 'audit prompt',
157
+ 'audit ingest', 'audit finding', 'audit achado', 'audit verify', 'audit report', 'audit relatorio',
158
+ 'audit divida', 'audit board', 'audit surface', 'audit superficie', 'audit ?'];
159
+ /** Os comandos com subcomando: o padrao (sem subcomando) e os conhecidos; o resto vira `?`. */
160
+ const FAMILIAS = new Map([
161
+ ['onboarding', { padrao: 'show', conhecidos: ['show', 'set', 'reset', 'sync'] }],
162
+ ['experiencia', { padrao: 'show', conhecidos: ['show', 'uninstall'] }],
163
+ ['thread', { padrao: 'list', conhecidos: ['new', 'list', 'status', 'close', 'entrega'] }],
164
+ ['phase', { padrao: null, conhecidos: ['run', 'list'] }],
165
+ ['retry', { padrao: null, conhecidos: ['plan', 'run', 'policy', 'parse', 'list', 'resume', 'cancel'] }],
166
+ ['roadmap', { padrao: 'reservas', conhecidos: ['reservas', 'status', 'feat', 'pegar', 'soltar'] }],
167
+ ['docs', { padrao: 'verificar', conhecidos: ['verificar', 'sincronizar', 'init'] }],
168
+ ['worktree', { padrao: null, conhecidos: ['ensure', 'sync', 'audit', 'release'] }],
169
+ ['claims', { padrao: 'list', conhecidos: ['add', 'conferir', 'verificar', 'retirar', 'ausente', 'list'] }],
170
+ ['decisao', { padrao: null, conhecidos: ['registrar', 'placar'] }],
171
+ ['accounts', { padrao: 'list', conhecidos: ['list', 'add', 'remove', 'check', 'esgotamentos'] }],
172
+ ['network', { padrao: 'status', conhecidos: ['status', 'entrar', 'sair', 'publicar', 'roadmap'] }],
173
+ ['adapter', { padrao: 'list', conhecidos: ['list', 'show', 'install'] }],
174
+ ['prompt', { padrao: 'list', conhecidos: ['list', 'lint', 'render'] }],
175
+ ['conhecimento', { padrao: 'listar', conhecidos: ['listar', 'mostrar', 'colecoes', 'verificar'] }],
176
+ ['sessions', { padrao: 'list', conhecidos: ['watch', 'event', 'list', 'limpar-fantasmas', 'hitl', 'request', 'answer',
177
+ 'reconcile', 'supersede', 'adopt', 'logs', 'stop', 'attach'] }],
178
+ ['gate', { padrao: null, conhecidos: ['context', 'request', 'answer', 'next', 'approve'] }],
179
+ ['fix', { padrao: null, conhecidos: ['open', 'list', 'reverify'] }],
180
+ ['handoff', { padrao: null, conhecidos: ['export', 'recall'] }],
181
+ ['lease', { padrao: 'list', conhecidos: ['list', 'acquire', 'take', 'release'] }],
182
+ ['board', { padrao: 'list', conhecidos: ['list', 'plan', 'plano', 'reap'] }],
183
+ ['orquestracao', { padrao: 'status', conhecidos: ['status'] }],
184
+ ['fabrica', { padrao: 'list', conhecidos: ['list', 'publicar', 'entrar', 'sair', 'batida'] }],
185
+ ['memory', { padrao: 'status', conhecidos: ['status', 'inventory', 'migrate', 'sync', 'search', 'index'] }],
186
+ ['mcp', { padrao: null, conhecidos: ['install', 'serve'] }],
187
+ ['conducao', { padrao: null, conhecidos: ['status', 'assumir', 'atualizar', 'autorizar', 'autorizacao', 'batida', 'sentinela'] }],
188
+ ['audit', { padrao: 'packs', conhecidos: ['packs', 'pack', 'lint', 'run', 'list', 'show', 'prompt', 'ingest', 'finding', 'achado', 'verify', 'report', 'relatorio', 'divida', 'board', 'surface', 'superficie'] }],
189
+ ]);
190
+ /** A entrada de `COMANDOS_COM_LOCALE` que a linha de comando pede, com o subcomando padrao de cada um. */
191
+ function chaveDoLocale(posicionais, opcoes) {
192
+ const [comando = '', bruto] = posicionais;
193
+ // F2b (D2): `ork ship <thread>` tem a thread no lugar do subcomando; so `registrar-pr` e rota propria.
194
+ if (comando === 'ship')
195
+ return bruto === 'registrar-pr' ? 'ship registrar-pr' : 'ship';
196
+ if (comando === 'master')
197
+ return chaveDoMaster(bruto, opcoes);
198
+ // `ork pulse` le qualquer posicional como o pulse de sempre; `responder` e `cadencia` sao rotas proprias.
199
+ if (comando === 'pulse')
200
+ return bruto === 'responder' || bruto === 'cadencia' ? `pulse ${bruto}` : 'pulse';
201
+ const familia = FAMILIAS.get(comando);
202
+ if (!familia)
203
+ return comando;
204
+ const sub = comando === 'onboarding' && 'reset' in opcoes ? 'reset' : bruto ?? familia.padrao;
205
+ return `${comando} ${sub !== null && familia.conhecidos.includes(sub) ? sub : '?'}`;
206
+ }
207
+ /** Os subcomandos do `ork master` que nao seguem o locale (G3 da F2b): cada um e rota propria. */
208
+ const SUBCOMANDOS_DO_MASTER = ['audit', 'digest', 'migrar', 'classes', 'ratificar', 'batch', 'propor'];
209
+ /**
210
+ * A rota do `ork master`, na mesma ordem em que o comando a decide: `pedir` (nunca com `--formato json`),
211
+ * os subcomandos proprios, `--batch`, o aceite por omissao e, sem nada, o indice. A thread sozinha e a nota
212
+ * (`--score`), que segue em pt-BR.
213
+ */
214
+ function chaveDoMaster(bruto, opcoes) {
215
+ if (bruto === 'pedir')
216
+ return opcoes.formato === 'json' ? 'master pedir json' : 'master pedir';
217
+ if (bruto !== undefined && SUBCOMANDOS_DO_MASTER.includes(bruto))
218
+ return `master ${bruto}`;
219
+ if (opcoes.batch !== undefined)
220
+ return 'master batch';
221
+ if (opcoes['aceitar-omissao'] !== undefined)
222
+ return 'master aceitar-omissao';
223
+ return bruto === undefined ? 'master' : 'master <thread>';
224
+ }
225
+ /** O comando pede o texto pelo locale? Nunca com `--json`, nem nos recortes da D2. */
226
+ function cobreLocale(posicionais, opcoes) {
227
+ if (opcoes.json !== undefined)
228
+ return false;
229
+ if (posicionais[0] === 'doctor' && opcoes.modo !== undefined)
230
+ return false;
231
+ return exports.COMANDOS_COM_LOCALE.includes(chaveDoLocale(posicionais, opcoes));
232
+ }
233
+ /** `en_US.UTF-8`, `en-GB`, `en` viram `en`; `pt_BR.UTF-8`, `pt` viram pt-BR; o resto, undefined. */
234
+ function localeDe(valor) {
235
+ if (typeof valor !== 'string')
236
+ return undefined;
237
+ const lingua = valor.trim().split(/[.@]/)[0].replace(/_/g, '-').split('-')[0].toLowerCase();
238
+ if (lingua === 'en')
239
+ return 'en';
240
+ if (lingua === 'pt')
241
+ return 'pt-BR';
242
+ return undefined;
243
+ }
244
+ /** O locale do processo: a escolha do onboarding vence o ambiente; sem nenhum, pt-BR. */
245
+ function resolverLocale(ownerLanguage, env = process.env) {
246
+ if (typeof ownerLanguage === 'string' && ownerLanguage.trim()) {
247
+ return { locale: localeDe(ownerLanguage) ?? exports.LOCALE_PADRAO, origem: 'manifesto' };
248
+ }
249
+ for (const nome of ['LC_ALL', 'LC_MESSAGES', 'LANG']) {
250
+ const v = env[nome];
251
+ if (v && v.trim())
252
+ return { locale: localeDe(v) ?? exports.LOCALE_PADRAO, origem: nome };
253
+ }
254
+ return { locale: exports.LOCALE_PADRAO, origem: 'padrao' };
255
+ }
256
+ /**
257
+ * RM-061 F3c: a lingua do que o `ork` gera e grava para depois (o prompt despachado, o pedido do achado): so a
258
+ * declarada pelo dono em `owner.language`; sem ela, pt-BR. Nunca o locale de quem roda, nem o `--json`: o mesmo
259
+ * projeto grava o mesmo dado em qualquer maquina. O texto impresso segue o locale do CLI.
260
+ */
261
+ function linguaDeclaradaDoDono(ownerLanguage) {
262
+ return resolverLocale(ownerLanguage, {}).locale;
263
+ }
264
+ let ativo = exports.LOCALE_PADRAO;
265
+ /** Fixa o locale do processo (o CLI, nos comandos de `COMANDOS_COM_LOCALE`; os testes). */
266
+ function ativarLocale(locale) {
267
+ ativo = locale ?? exports.LOCALE_PADRAO;
268
+ }
269
+ function localeAtivo() {
270
+ return ativo;
271
+ }
272
+ /**
273
+ * Roda `fn` no locale pedido e volta ao anterior, mesmo com erro. Nos comandos cobertos, o que grava
274
+ * estado roda em `comLocale('pt-BR', ...)`: o texto sai em ingles, o dado gravado nao muda (D1, D6).
275
+ */
276
+ function comLocale(locale, fn) {
277
+ const anterior = ativo;
278
+ ativo = locale;
279
+ try {
280
+ return fn();
281
+ }
282
+ finally {
283
+ ativo = anterior;
284
+ }
285
+ }
286
+ // ---------------------------------------------------------------------------
287
+ // Catalogo
288
+ // ---------------------------------------------------------------------------
289
+ const PT_BR = {
290
+ cli: {
291
+ /** Prefixo do erro que a entrada do CLI imprime (D11). */
292
+ erro: (mensagem) => `erro: ${mensagem}`,
293
+ subcomandoDesconhecido: (comando, sub) => `subcomando desconhecido: ${comando} ${sub}`,
294
+ /** `exigirManifesto` fora de um projeto: o primeiro erro de quem chega (D14). */
295
+ manifestoNaoEncontrado: (nome, dir) => `manifesto ${nome} nao encontrado a partir de ${dir}. Rode: ork init`,
296
+ },
297
+ horario: {
298
+ brasilia: 'horário de Brasília',
299
+ legendaBrasilia: 'Horários de Brasília.',
300
+ legenda: (rotulo) => `Horários em ${rotulo}.`,
301
+ duracaoDesconhecida: 'tempo desconhecido',
302
+ menosDeUmMin: 'menos de 1 min',
303
+ /** `faltaPara` (ratelimit.ts): quanto falta para o pedido da fila liberar. */
304
+ jaLiberou: 'ja liberou',
305
+ emMinutos: (n) => `em ${n} min`,
306
+ emHoras: (h, mm) => `em ${h}h${mm}`,
307
+ },
308
+ doctor: {
309
+ titulo: 'ork doctor: o que vale nesta maquina agora',
310
+ correcao: 'correcao',
311
+ bloqueado: (falhas, avisos) => `Veredito: BLOQUEADO (${falhas} fail, ${avisos} warn). Corrija os itens acima antes de despachar fase.`,
312
+ pronto: (avisos) => `Veredito: PRONTO (${avisos} warn). Despacho de fase liberado por \`ork phase run\`.`,
313
+ /** Nome de cada check como aparece no texto; o `Check.nome` gravado nao muda. */
314
+ nomes: {},
315
+ instaleNode: 'instale Node 20 ou superior',
316
+ gitAusente: 'nao encontrado no PATH',
317
+ instaleGit: 'instale o git',
318
+ securityScanDocker: 'Docker disponivel: as ferramentas do security scan rodam em container',
319
+ securityScanNativo: 'sem Docker; todas as ferramentas do laco tem binario nativo aceito',
320
+ securityScanSemFerramenta: (lista) => `sem Docker, nao rodariam (unavailable): ${lista}`,
321
+ securityScanCorrecao: (nativos) => `instale o Docker (CLI e daemon ativo); alternativa, instale os binarios nativos na versao do catalogo: ${nativos}. pip-audit e govulncheck so rodam no Docker`,
322
+ branch: (branch, semCommit) => `branch ${branch}${semCommit ? ' (sem commit)' : ''}`,
323
+ foraDeRepo: 'fora de um repositorio git',
324
+ rodeDentroDeRepo: 'rode o ork dentro de um repositorio git',
325
+ versaoDesconhecida: 'versao desconhecida',
326
+ codexAusenteUsado: 'binario `codex` fora do PATH (o projeto despacha por ele: veja despacho pelo codex)',
327
+ codexAusenteOpcional: 'binario `codex` fora do PATH (opcional: claude-bg e o runtime padrao)',
328
+ instaleCodex: 'para despachar pelo codex, instale o Codex CLI e autentique com `codex login`',
329
+ sandboxOk: '`codex sandbox true` executa nesta maquina',
330
+ sandboxFalhou: (detalhe) => `sonda \`codex sandbox true\` falhou: ${detalhe}`,
331
+ sandboxCorrecao: (confirmar) => 'instale o pacote bubblewrap do sistema (o bwrap embutido nao cria user namespace ' +
332
+ `nesta maquina) ou declare runtime.sandbox: danger-full-access ciente do risco e confirme nesta maquina com ${confirmar}`,
333
+ manifestoAusente: (nome, dir) => `${nome} nao encontrado a partir de ${dir}`,
334
+ rodeInit: 'ork init',
335
+ entreNoRepoEInit: 'entre no repositorio do projeto (ou crie um com git init e o primeiro commit) e rode ork init',
336
+ corrijaManifesto: 'corrija o manifesto e rode ork doctor de novo',
337
+ abbrevOk: (abbrev) => `"${abbrev}" (parte 1 do slug de sessao)`,
338
+ abbrevCorrecao: 'defina project.abbrev com ate 3 caracteres [a-z0-9]',
339
+ modos: (padrao, permitidos) => `padrao ${padrao}; permitidos ${permitidos}`,
340
+ fusoDoManifesto: (fuso, chave, rotulo) => `${fuso} (${chave}); horarios para pessoas em ${rotulo}`,
341
+ fusoDoSistema: (fuso, chave) => `${fuso} (fuso do sistema; ${chave} nao configurado)`,
342
+ fusoCorrecao: (chave) => `corrija ${chave} com um nome IANA`,
343
+ filaVazia: 'vazia: nenhuma fase morreu por limite de uso neste projeto',
344
+ filaResumo: (esperando, escalados) => `${esperando} aguardando janela, ${escalados} escalado(s) para humano`,
345
+ filaProxima: (quando) => `; proxima janela em ${quando}`,
346
+ estadoOk: (dir, qtd) => `${dir} (${qtd} thread(s))`,
347
+ estadoAusente: (dir) => `${dir} ausente`,
348
+ estadoCorrecao: 'ork init cria o diretorio de estado',
349
+ claudeSemLogin: (detalhe, auth) => `${detalhe}; ${auth}: o despacho pelo claude-bg falharia`,
350
+ claudeLoginPago: 'faca o login de assinatura (claude.ai) no `claude`, sem API key nem provider de nuvem',
351
+ claudeLogin: 'rode `claude` uma vez, faca o login de assinatura (/login) e aceite a confianca no diretorio do projeto; ' +
352
+ 'ou crie um perfil com ork accounts add <id> --runtime claude-bg --dir <pasta>',
353
+ onboardingPendente: (n, etapas) => `${n} etapa(s) pendente(s): ${etapas}`,
354
+ onboardingCompleto: '9 etapas respondidas',
355
+ foraDaRede: 'fora da rede; ork network entrar poe esta maquina na rede da pessoa',
356
+ manifestoOk: (caminho, bytes, limite) => `${caminho} (${bytes} B de ${limite})`,
357
+ politicaViolada: (politica, envs) => `politica ${politica} violada: ${envs} redireciona o despacho do claude`,
358
+ politicaComPaga: (politica, envs) => `politica ${politica}; despacho segue na assinatura local, mas ha credencial paga no ambiente: ${envs}`,
359
+ politicaLimpa: (politica) => `politica ${politica}; nenhuma variavel de provider pago ativa`,
360
+ removaDoAmbiente: (envs) => `remova do ambiente: ${envs} (o despacho usa a assinatura Claude local)`,
361
+ nuncaDespachePorPaga: (envs) => `nenhuma acao obrigatoria; nunca despache fase por ${envs}`,
362
+ providersAtivos: (nomes) => `nomes ativos: ${nomes}`,
363
+ nenhumProvider: 'nenhum nome da lista de provider ativo',
364
+ memoriaFiles: 'files (fallback honesto: handoff por arquivos, ponteiro path#ancora)',
365
+ embeddingNone: 'memory.embedding com provider none: busca por significado desligada',
366
+ semPerfis: 'nenhum perfil configurado: cada runtime despacha pelo ambiente do processo',
367
+ // F2a: o resto do doctor.
368
+ manifestoForaDoRepo: (nome, caminho, topo) => `o ${nome} lido fica fora deste repositorio (${caminho}): o ork conduz o projeto daquela pasta, nao o de ${topo}`,
369
+ manifestoForaDoRepoCorrecao: (topo) => `rode ork init na raiz deste repositorio (${topo}); se o manifesto de fora ` +
370
+ 'nasceu por engano, apague-o junto com o AGENTS.md e o .orkastery/ ao lado dele',
371
+ storeInvalido: (erro) => `store de perfis invalido: ${erro}`,
372
+ storeCorrecao: 'o store fica em .orkastery/private/runtime-profiles.json (arquivo 0600, pasta 0700)',
373
+ contaPaga: 'provider pago (nunca despacha)',
374
+ contaInconclusiva: 'conferencia de login inconclusiva',
375
+ contaSemLogin: 'sem login',
376
+ contaPronta: 'pronto',
377
+ contaFora: (estado, ate) => `${estado}${ate ? ` ate ${ate}` : ''}`,
378
+ contasCorrecao: 'ork accounts check marca os perfis (sem-auth, provider-pago); ork accounts add refaz o login de assinatura ' +
379
+ 'pelo proprio CLI, nunca copiando credencial',
380
+ condutorCompartilha: (runtime, conta, fases) => `o condutor LLM (${runtime}, ${conta}) divide a conta com fases vivas: ${fases}`,
381
+ condutorSeparado: (runtime, conta) => `o condutor LLM (${runtime}, ${conta}) nao divide a conta com fase viva`,
382
+ contaDoAmbiente: 'ambiente do processo',
383
+ condutorCompartilhaCorrecao: 'rode o condutor em outra conta ou deixe a reacao a cota com `ork conducao batida`',
384
+ embeddingPago: (variavel) => `memory.embedding.api_key_env declara ${variavel}, nome da lista de provider pago`,
385
+ embeddingPagoCorrecao: 'use uma chave dedicada ao Orkastery com nome proprio, por exemplo ORKASTERY_EMBEDDING_API_KEY',
386
+ embeddingSemVariavel: (provider) => `memory.embedding com provider ${provider} sem api_key_env`,
387
+ embeddingSemVariavelCorrecao: 'declare em memory.embedding.api_key_env o NOME da variavel com a chave dedicada',
388
+ embeddingRecusada: (variavel) => `${variavel} tem valor recusado: parece URL, DSN ou texto com espaco (valor nunca impresso)`,
389
+ embeddingRecusadaCorrecao: (variavel) => `confira se ${variavel} guarda a chave dedicada, e nao outra credencial`,
390
+ embeddingPresente: (variavel, provider, modelo) => `${variavel} presente no ambiente (valor nunca impresso); ${provider} ${modelo}`,
391
+ embeddingAusente: (variavel) => `${variavel} ausente do ambiente: a busca por significado usa o fallback local ou cai para FTS; o regime nao muda`,
392
+ embeddingAusenteCorrecao: (variavel) => `exporte ${variavel} com a chave dedicada ao Orkastery (com limite de credito no painel do provider)`,
393
+ donoOutro: (total, dir, uids, uid, exemplos, parcialDe) => `${total} entrada(s) de ${dir} com outro dono (uid ${uids}; o do repositorio e ${uid}): ${exemplos}; o git do dono nao grava nelas, ` +
394
+ `e o fetch e o commit falham${parcialDe !== null ? ` (conferencia parcial: mais de ${parcialDe} entradas)` : ''}`,
395
+ donoCorrecao: (comando) => `${comando} (o ork nao roda isso sozinho)`,
396
+ donoParcial: (teto, dir) => `mais de ${teto} entradas em ${dir}: conferencia parcial, sem outro dono ate aqui`,
397
+ donoParcialCorrecao: (comando) => `confira o resto com: ${comando}`,
398
+ donoOk: (vistos, dir, uid) => `${vistos} entradas de ${dir} com o dono do repositorio (uid ${uid})`,
399
+ entrevistaMemoria: (escolha, declarado) => `entrevista escolheu ${escolha}; manifesto declara ${declarado}`,
400
+ entrevistaMemoriaCorrecao: (escolha) => `revise memory.mode: ${escolha} em orkastery.yaml; a entrevista não altera o manifesto`,
401
+ entrevistaFuso: (informado, declarado, chave) => `entrevista informou ${informado}; manifesto declara ${declarado ?? `${chave} ausente`}`,
402
+ entrevistaFusoCorrecao: (chave, informado) => `revise ${chave}: "${informado}" em orkastery.yaml; a entrevista não altera o manifesto`,
403
+ claudeOpcional: (fallback) => 'binario `claude` fora do PATH (opcional para as fases: nenhum bloco dos modos permitidos despacha pelo claude-bg' +
404
+ (fallback ? `; o fallback de ${fallback.blocos} bloco(s) cai nele e falharia: ${fallback.texto}` : '') +
405
+ '; o ork audit run ainda despacha por ele)',
406
+ claudeOpcionalCorrecao: 'para despachar pelo claude-bg (e rodar ork audit run), instale o Claude Code e garanta `claude` no PATH',
407
+ claudeAusente: (principal) => 'binario `claude` fora do PATH' +
408
+ (principal ? `; ${principal.blocos} bloco(s) dos modos permitidos despacham por ele (${principal.texto})` : ''),
409
+ claudeAusenteCorrecao: 'instale o Claude Code e garanta `claude` no PATH; so com o Codex, passe cada bloco para ele ' +
410
+ '(ork setup <modo> --bloco N --runtime codex --model <modelo>) ou tire o modo de conduction.allowed_modes ' +
411
+ '(mantenha o conduction.default_mode entre os permitidos)',
412
+ origemDoCodex: (pelaAdapter, blocos) => [pelaAdapter ? 'runtime.adapter: codex' : '',
413
+ blocos ? `${blocos.blocos} bloco(s) dos modos permitidos no codex (${blocos.texto})` : ''].filter(Boolean).join(' e '),
414
+ codexForaNoDespacho: (origem) => `${origem}, mas o binario \`codex\` esta fora do PATH`,
415
+ codexSandboxQuebrado: (origem, sandbox) => `${origem} com sandbox "${sandbox}", mas o sandbox nao executa nesta maquina (o agente narraria sucesso sem rodar nada)`,
416
+ codexSandboxOk: (origem, sandbox) => `${origem} com sandbox "${sandbox}"`,
417
+ codexSemConfirmacao: (origem, sandbox) => `${origem} com sandbox "${sandbox}" pedido pelo orkastery.yaml, ` +
418
+ 'sem a confirmacao desta maquina: o despacho recusa com runtime.sandbox-nao-confirmado',
419
+ codexForaNoDespachoCorrecao: 'instale o Codex CLI e autentique com `codex login` (assinatura, nunca API key)',
420
+ codexSandboxQuebradoCorrecao: (confirmar) => `instale o bubblewrap do sistema, ou declare runtime.sandbox: danger-full-access ciente do risco e confirme nesta maquina com ${confirmar}`,
421
+ codexSemConfirmacaoCorrecao: (confirmar) => `${confirmar} (ou volte o manifesto para workspace-write)`,
422
+ fabricaPedida: 'o orkastery.yaml pede fabrica.compartilhada: true e esta maquina nao entrou: nada desta maquina e publicado no remoto',
423
+ fabricaPedidaCorrecao: 'ork fabrica entrar, se esta maquina deve publicar o retrato dela no remoto do projeto',
424
+ pastaForaDaRaiz: (dir) => `worktree.dir "${dir}" leva para fora da raiz e esta maquina nao confirmou: a criacao de worktree recusa com worktree.dir-fora-da-raiz`,
425
+ pastaForaDaRaizCorrecao: (confirmar) => `${confirmar}, ou volte worktree.dir para dentro do projeto`,
426
+ fonteDaMemoria: (fonte, divergente) => `${fonte}${divergente ? ' (cópia da worktree divergente preservada)' : ''}`,
427
+ regimeDegradado: (motivo, detalhe) => `pedido orkmind, efetivo files (${motivo}): ${detalhe}`,
428
+ regimeOrkmind: (tenant, variavel) => `orkmind ativo no tenant "${tenant}" pela variavel ${variavel}`,
429
+ // RM-069: a fonte da DSN e a DSN no ambiente, pelo nome da variavel ou pelo rotulo do arquivo, nunca o valor.
430
+ regimeOrkmindPorArquivo: (tenant, arquivo) => `orkmind ativo no tenant "${tenant}" pelo arquivo ${arquivo}`,
431
+ dsnDaVariavel: (variavel) => `variável de ambiente ${variavel}, presente (valor nunca impresso)`,
432
+ dsnVariavelAusente: (variavel) => `variável de ambiente ${variavel} ausente: a memória cai para files`,
433
+ dsnVariavelAusenteCorrecao: (variavel) => `exporte ${variavel} com a DSN da base própria do tenant, ` +
434
+ 'ou passe-a por memory.database_url_file (arquivo 0600 em ~/.orkastery/segredos/)',
435
+ dsnDoArquivo: (rotulo, permissao) => `arquivo ${rotulo}, do usuário que roda o ork, permissão ${permissao}, uma linha (valor nunca impresso)`,
436
+ dsnArquivoFalhou: (rotulo, motivo, causa) => `arquivo ${rotulo} recusado (${motivo}): ${causa}; a memória cai para files, sem outra fonte`,
437
+ // O mesmo texto de `textoDaCausa` (dsn-da-memoria.ts); o teste DD11 confere causa por causa.
438
+ dsnCausa: (causa, permissao) => ({
439
+ forma: 'memory.database_url_file fora da forma ~/.orkastery/segredos/<nome> (valor omitido)',
440
+ raiz: 'a pasta do usuário do ork precisa ser caminho absoluto sem .., dentro da casa do usuário (HOME)',
441
+ 'nao-existe': 'não existe',
442
+ 'nao-abre': 'não foi possível abrir para leitura',
443
+ pasta: 'o caminho da pasta de segredos tem link simbólico ou algo que não é pasta',
444
+ 'dono-da-pasta': 'a pasta do usuário do ork não é do usuário que roda o ork',
445
+ link: 'link simbólico não é aceito',
446
+ 'nao-e-arquivo': 'não é arquivo comum',
447
+ plataforma: 'esta plataforma não confere dono nem permissão',
448
+ dono: 'o dono não é o usuário que roda o ork',
449
+ permissao: `permissão ${permissao}, diferente de 0600 e de 0400`,
450
+ tamanho: 'maior que 4 KiB',
451
+ vazio: 'vazio',
452
+ codificacao: 'não é texto UTF-8',
453
+ linhas: 'mais de uma linha',
454
+ controle: 'caractere de controle',
455
+ 'nome-valor': 'formato NOME=valor de arquivo de ambiente; grave só a DSN',
456
+ esquema: 'não é DSN com esquema (como postgresql://)',
457
+ espaco: 'espaço dentro da DSN',
458
+ leitura: 'não foi possível ler',
459
+ })[causa] ?? causa,
460
+ dsnArquivoCorrecao: (motivo, rotulo) => motivo === 'dsn.arquivo-ausente'
461
+ ? `grave a DSN da base própria do tenant em ${rotulo}, numa linha e com permissão 0600, sem passar pelo histórico do shell: ` +
462
+ `(umask 077; cat > ${rotulo})`
463
+ : motivo === 'dsn.arquivo-inseguro'
464
+ ? `deixe ${rotulo} como arquivo do usuário que roda o ork, numa pasta dele, com chmod 600 ${rotulo}`
465
+ : `regrave ${rotulo} como arquivo comum numa pasta de segredos comum, dentro da casa do usuário e sem link simbólico ` +
466
+ 'no caminho, só com a DSN (esquema://...), numa linha e sem NOME= na frente',
467
+ dsnNaSessao: (doProjeto, comSenha) => `no ambiente desta sessão despachada, o agente lê com env: ${[...doProjeto.map((n) => `${n} (DSN do projeto)`),
468
+ ...comSenha.map((n) => `${n} (URL com senha)`)].join(', ')} (valor nunca impresso)`,
469
+ dsnNoProcesso: (nomes) => `a DSN do arquivo também está no ambiente deste processo, em ${nomes.join(', ')}: quem herda este ambiente a vê (valor nunca impresso)`,
470
+ dsnSessaoLimpa: 'nenhuma DSN nem URL com senha no ambiente desta sessão despachada',
471
+ dsnProcessoLimpo: 'a DSN do arquivo não está no ambiente deste processo',
472
+ dsnNoAmbienteCorrecao: 'tire essas variáveis do ambiente que o host repassa aos agentes (no Hermes, ~/.hermes/.env), com backup, ' +
473
+ 'e passe a DSN do projeto por memory.database_url_file',
474
+ filaEscaladoCorrecao: 'pedido escalado alem do limite de retry.max_tentativas: ork retry list e ork gate request <thread>',
475
+ filaEsperaCorrecao: 'ork retry resume retoma o que ja liberou',
476
+ governanca: (g) => `${g.usuario}, Claude e Codex, global com histórico: ${g.total} sessões; ` +
477
+ `${g.semThread} sem thread; ${g.ambiguas} ambíguas; ` +
478
+ `inventário ${g.ok ? 'válido' : 'INCOMPLETO (zero não comprovado)'}` +
479
+ (g.ausentes.length ? `; fonte ausente: ${g.ausentes.join(', ')}` : ''),
480
+ governancaCorrecao: 'ork sessions --global --all --json; adote identidades sem vínculo com ork sessions adopt <id>',
481
+ umaskNaoMedido: 'umask do processo nao medido nesta plataforma',
482
+ umaskOk: (umask) => `umask ${umask} nega escrita de grupo e outros`,
483
+ umaskAberto: (umask) => `umask ${umask} permite escrita de grupo ou outros: o que o runtime criar sera recusado pelo sensor (bits 0o022)`,
484
+ umaskCorrecao: 'umask 022 (ou 077) no shell que roda o ork e os runtimes',
485
+ estadoNaoDiretorio: (dir) => `${dir} nao e diretorio real`,
486
+ estadoAberto: (dir, modo) => `${dir} com modo ${modo}: grupo ou outros podem escrever no estado`,
487
+ estadoComModo: (dir, modo) => `${dir} com modo ${modo}`,
488
+ privadaAusente: (dir) => `${dir} ausente: criada sob demanda com 0700`,
489
+ privadaAberta: (dir, modo) => `${dir} precisa ser diretorio 0700 do proprio usuario (modo ${modo}): recibo HITL e perfis recusam`,
490
+ privadaOk: (dir) => `${dir} com modo 0700`,
491
+ cronSemComando: 'comando crontab ausente nesta maquina',
492
+ cronFalhou: (detalhe) => `crontab -l falhou: ${detalhe}`,
493
+ cronSaiu: (codigo) => `crontab -l saiu ${codigo}`,
494
+ cronAdicione: (linha) => `adicione ao crontab (crontab -e), como no template monitor/pulse.cron: ${linha}`,
495
+ cronSemLeitura: (motivo) => `pulse-host.json presente, mas sem crontab para ler (${motivo}): a varredura nao bate`,
496
+ cronSemLinha: (script) => `pulse-host.json presente, e nenhuma linha do crontab roda ${script}: o resumo nao sai`,
497
+ cronOk: (linhas) => `varredura no cron a cada 15 minutos ou menos (${linhas} linha(s))`,
498
+ cronRitmo: (intervalo) => intervalo === null ? 'com horario que o doctor nao le'
499
+ : intervalo === 60 ? 'de hora em hora' : `a cada ${intervalo} minutos`,
500
+ cronLento: (ritmo, linha) => `a varredura do pulse bate ${ritmo} (\`${linha}\`): a cadencia por tag (RM-039) pede 15 minutos`,
501
+ cronTroque: (linha) => `troque a linha no crontab (crontab -e) por: ${linha}`,
502
+ // RM-063 (F1): com thread aberta, a falta da batida reprova, com ou sem pulse-host.json.
503
+ batidaAusente: (abertas, detalhe) => `${abertas} thread(s) aberta(s) e nenhuma batida da varredura: ${detalhe}; a fabrica para sem ninguem saber`,
504
+ batidaSemLeitura: (motivo) => `sem crontab para ler (${motivo})`,
505
+ batidaSemLinha: (script) => `nenhuma linha do crontab roda ${script} para este projeto`,
506
+ batidaInstale: (comando) => `${comando} (instala a linha do template monitor/pulse.cron no crontab desta maquina)`,
507
+ batidaPeloLog: (minutos) => `nenhuma linha no crontab, mas a varredura rodou ha ${minutos} min (hitl.log): a batida vem de outro agendador`,
508
+ // RM-063 (fatia 3, H1): a linha instalada nao prova a batida; a ultima rodada velha reprova.
509
+ batidaAtrasada: (minutos, linhas) => `a varredura esta no crontab (${linhas} linha(s)), mas a ultima rodada foi ha ${minutos} min (hitl.log): a batida parou`,
510
+ batidaAtrasadaCorrecao: 'ork fabrica batida status (a ultima rodada diz o codigo e o detalhe; confira o cron, o script e o PATH da linha)',
511
+ // RM-063 (fatia 3, H4): a falha do transporte do pulse, lida do transporte.log.
512
+ transporteOk: (host, quando) => `ultima entrega pelo ${host} em ${quando}`,
513
+ transporteDesvio: (falhou, host, quando) => `o transporte ${falhou} falhou em ${quando}, e o resumo saiu pelo ${host} (o outro host configurado)`,
514
+ transporteFalhou: (quando, tentativas) => `o resumo de ${quando} nao saiu por nenhum transporte configurado (${tentativas}): a novidade fica guardada para a proxima batida`,
515
+ transporteCorrecao: 'confira o executavel e o destino em .orkastery/monitor/pulse-host.json (o adaptador do host: openclaw message send ou o ork-pulse-enviar.py do Hermes)',
516
+ redeSaiu: 'fora da rede (saiu com ork network sair)',
517
+ redeMembroHerdado: 'membro herdado da fabrica',
518
+ redeMembro: 'membro',
519
+ redeCasa: (casa) => `casa ${casa}`,
520
+ redeSemCasa: 'casa ainda nao gravada',
521
+ redeBatida: (quando, idade) => `ultima batida ${quando} (ha ${idade})`,
522
+ redeSemBatida: 'nenhuma batida publicada',
523
+ redeFalha: (quando, origem, erro) => `ultima falha ${quando}${origem ? ` (${origem})` : ''}: ${erro}`,
524
+ redeSemDetalhe: 'sem detalhe',
525
+ redeSemFalha: 'nenhuma falha no rede.log',
526
+ redeParadaCorrecao: 'a batida sai do pulse: confira o cron do pulse e rode ork network publicar',
527
+ redeSemCasaCorrecao: 'a casa da rede ainda nao existe: o dono roda ork network entrar, que cria o repositorio privado; ' +
528
+ 'ou ork network sair, para tirar esta maquina da rede',
529
+ redeSemForjaCorrecao: 'faca login na forja (gh auth login ou glab auth login) e rode ork network publicar',
530
+ redePublicaCorrecao: 'torne a casa da rede privada na forja; nada e publicado num repositorio publico',
531
+ redeNomeCorrecao: 'escolha outro nome com ork network entrar --maquina NOME, ou tome este com --forcar',
532
+ redeOutraCorrecao: 'ork network status mostra as lacunas; ork network publicar tenta de novo',
533
+ /**
534
+ * Redacao do check "analisadores do grafo" (a forma de `RedacaoDosAnalisadores`). A familia do grafo nao
535
+ * importa o catalogo (fronteira do KG3): ela guarda o pt-BR para o `ork grafo status`, e o doctor passa
536
+ * esta. Um teste confere que o pt-BR das duas e o mesmo.
537
+ */
538
+ grafo: {
539
+ recusa: (motivo) => `${motivo}: o ork grafo indexar recusa nesta instalacao, e sem o indice as consultas e as tools ork_grafo_* tambem`,
540
+ soEsm: (versaoDoNode) => `o micromark e so ESM, e este Node (${versaoDoNode}) nao o carrega por require: use Node 20.19, ` +
541
+ '22.12 ou mais novo, sem a opcao --no-experimental-require-module (na linha de comando ou no NODE_OPTIONS)',
542
+ reinstale: (fixada) => `reinstale o ork global, que traz os analisadores como dependencias: npm install -g @orkastery/cli${fixada}` +
543
+ ' (instalado dentro de um projeto ou pelo npx, o npm deixa os analisadores fora do pacote do ork, e o grafo os recusa)',
544
+ },
545
+ /** A fonte de sessoes ausente, como o inventario a nomeia (dado); o ingles so troca o rotulo da conta. */
546
+ fonteDaSessao: (origem) => origem,
547
+ },
548
+ onboarding: locale_onboarding_1.ONBOARDING_PT_BR,
549
+ thread: locale_thread_1.THREAD_PT_BR,
550
+ phase: locale_phase_1.PHASE_PT_BR,
551
+ ajuda: locale_ajuda_1.AJUDA_PT_BR,
552
+ verify: locale_verify_1.VERIFY_PT_BR,
553
+ ship: locale_ship_1.SHIP_PT_BR,
554
+ retry: locale_retry_1.RETRY_PT_BR,
555
+ master: locale_master_1.MASTER_PT_BR,
556
+ pulse: locale_pulse_1.PULSE_PT_BR,
557
+ roadmap: locale_roadmap_1.ROADMAP_PT_BR,
558
+ gerados: locale_gerados_1.GERADOS_PT_BR,
559
+ worktree: locale_worktree_1.WORKTREE_PT_BR,
560
+ estado: locale_estado_1.ESTADO_PT_BR,
561
+ securityScan: locale_security_scan_1.SECURITY_SCAN_PT_BR,
562
+ claims: locale_claims_1.CLAIMS_PT_BR,
563
+ decisao: locale_decisao_1.DECISAO_PT_BR,
564
+ accounts: locale_accounts_1.ACCOUNTS_PT_BR,
565
+ network: locale_network_1.NETWORK_PT_BR,
566
+ reservas: locale_reservas_1.RESERVAS_PT_BR,
567
+ docs: locale_docs_1.DOCS_PT_BR,
568
+ adapter: locale_adapter_1.ADAPTER_PT_BR,
569
+ prompts: locale_prompts_1.PROMPTS_PT_BR,
570
+ conhecimento: locale_conhecimento_1.CONHECIMENTO_PT_BR,
571
+ conducao: locale_conducao_1.CONDUCAO_PT_BR,
572
+ grafo: locale_grafo_1.GRAFO_PT_BR,
573
+ audit: locale_audit_1.AUDIT_PT_BR,
574
+ forja: locale_forja_1.FORJA_PT_BR,
575
+ operacao: {
576
+ restante: locale_operacao_restante_1.OPERACAO_RESTANTE_PT_BR,
577
+ modos: {
578
+ titulo: 'Modos de conducao (a #TAG vai no proprio pedido ao orquestrador)',
579
+ cabecalho: ['#TAG', 'BLOCOS', 'PAUSAS', 'CICLO'],
580
+ marcaDaPausa: '* = bloco que pausa e espera veredito humano',
581
+ detalhe: 'Detalhe por modo:',
582
+ slug: 'slug das sessoes',
583
+ pausas: 'pausas',
584
+ nenhuma: 'nenhuma',
585
+ uso: 'uso',
586
+ pausaSobre: {
587
+ objetivo: 'objetivo', plano: 'plano', implementacao: 'implementacao', evidencias: 'evidencias',
588
+ push: 'push', score: 'score', premissas: 'premissas',
589
+ 'evidencias, com autorizacao antecipada de push': 'evidencias, com autorizacao antecipada de push',
590
+ },
591
+ recomendado: {
592
+ classic: 'O padrao: premissas delicadas com entrega confiavel',
593
+ maestro: 'Solucoes claras e ageis, sem muitos riscos ou tradeoffs',
594
+ auto: 'Solucoes menores, docs, estudos, pesquisas, configuracoes, auditorias, migracoes',
595
+ fast: 'Pedido pequeno e claro, de minutos: uma fase so (GO), sem cerimonia; o push pede autorizacao',
596
+ },
597
+ regra: 'REGRA CENTRAL: o modo afrouxa a pausa, NUNCA a verificacao.',
598
+ migracao: {
599
+ nada: 'Nada a migrar: nenhum modo aposentado na configuracao deste projeto.',
600
+ simulacao: 'Simulacao (--dry-run), nada foi gravado.',
601
+ aplicada: 'Migracao aplicada.',
602
+ de: 'de', para: 'para', backup: 'backup',
603
+ historico: 'Nenhum historico foi tocado: thread, ledger e recibo em modo aposentado ficam como estao.',
604
+ },
605
+ },
606
+ ciclos: {
607
+ titulo: 'Variantes de ciclo (`ork thread new --ciclo <variante>`)',
608
+ descricoes: {
609
+ greenfield: 'Comeco do zero: worktree isolada obrigatoria, partindo da base do manifesto',
610
+ 'merge-branch': 'Parte de uma branch que ja existe (`--branch`), sem criar branch nova',
611
+ 'goal-plan': 'Funde GOAL e PLAN num bloco so: uma pausa a menos quando o modo os separava',
612
+ gap: 'Analise de lacuna: sem GO e sem SHIP, a lacuna e publicada como lacuna',
613
+ 'feature-xl-faseada': 'Feature grande em fatias: o PLAN se compromete com N fatias verificaveis',
614
+ },
615
+ worktree: 'worktree isolada',
616
+ exige: 'exige', nada: 'nada', muda: 'muda os blocos do modo', sim: 'sim', nao: 'nao',
617
+ fecho: 'A variante muda como a thread NASCE. Verificacao e gates nao mudam.',
618
+ },
619
+ pulseCadencia: {
620
+ umaTag: 'pulse cadencia: uma tag por vez',
621
+ desconhecida: (tag, aceitas) => `pulse cadencia: tag desconhecida "${tag}"; use ${aceitas}`,
622
+ trocaSemAutor: 'pulse.cadencia: informe quem trocou a cadencia',
623
+ desconhecidaInterna: (tag) => `pulse.cadencia: tag desconhecida ${tag}`,
624
+ descricoes: {
625
+ '#OrkPulseOff': 'de 8 em 8 horas, as 08h, 16h e 00h', '#OrkPulseOn': 'de 2 em 2 horas',
626
+ '#OrkPulseOn-15m': 'de 15 em 15 minutos', '#OrkPulseOn-30m': 'de 30 em 30 minutos',
627
+ '#OrkPulseOn-60m': 'de hora em hora',
628
+ },
629
+ texto: (descricao, tag, proxima) => `Pulse ${descricao} (${tag}). Pergunta para você continua saindo na hora. Próximo resumo com novidade a partir de ${proxima}.`,
630
+ trocada: (por, canal, quando) => `Trocada por ${por} (${canal}) em ${quando}.`,
631
+ padrao: 'Nenhuma tag gravada: vale a cadência padrão.',
632
+ responderUso: 'pulse responder exige --resposta-stdin e o envelope do ingresso autenticado',
633
+ responderFormato: 'pulse responder: --formato telegram|terminal',
634
+ responderReferencia: 'pulse responder: --em-resposta-a recebe o código da pergunta e o id da mensagem respondida (por exemplo NX4K:4521), ou outra, a palavra solta em reply a outra mensagem',
635
+ },
636
+ ledger: {
637
+ usoStats: 'uso: ork ledger stats --desde 7d [--ate ISO] [--thread T] [--modo M] [--runtime R] [--json]',
638
+ usoEstimate: 'uso: ork ledger estimate <thread-id> --sem-ia H --ia-sem-ork H --por Q --metodo M --premissas P [--incerteza I]',
639
+ uso: 'uso: ork ledger stats|estimate ...',
640
+ estimativa: (thread, semIa, ia) => `Estimativa PLAN registrada em ${thread}: sem IA ${semIa} h; IA sem Orkastery ${ia} h.`,
641
+ periodo: (desde, ate, intervalo) => `Ledger stats ${desde} ate ${ate} ${intervalo}`,
642
+ sessoes: (threads, concluidas, despachos) => ` threads/sessoes ${threads} / ${concluidas} concluidas (${despachos} despachos)`,
643
+ throughput: (ships, retries) => ` throughput ${ships} ship(s); ${retries} retry(ies)`,
644
+ execucao: (horas, medidas, ausentes) => ` execucao ${horas} h (${medidas} medidas; ${ausentes} ausentes)`,
645
+ tokens: (total, input, cached, output) => ` tokens ${total} total; input ${input} (cached ${cached}); output ${output}`,
646
+ semCobertura: 'sem cobertura',
647
+ // GO-FIX 1: o travessao da base vira parenteses nas duas linguas (o catalogo nao leva U+2014).
648
+ custo: (valor) => ` custo referencia ${valor} (estimativa por tarifa publica, nao gasto/fatura)`,
649
+ espera: (horas, abertas) => ` espera humana ${horas} h; ${abertas} aberta(s)`,
650
+ semResposta: 'sem resposta medida',
651
+ metaDentro: ' (dentro da meta de 5 min)', metaFora: ' (acima da meta de 5 min)',
652
+ hitl: (pedidos, horas, mediana, meta, abertas, fora) => ` HITL de conducao ${pedidos} pergunta(s); parado ${horas} h; mediana ${mediana}${meta}; ${abertas} aberta(s); texto fora da excecao ${fora}`,
653
+ riscos: (total) => ` riscos evitados ${total} gate(s) preventivo(s)`,
654
+ estimativas: (total) => ` estimativas PLAN ${total} amostra(s)`,
655
+ cobertura: (texto) => ` cobertura ${texto}`,
656
+ observacao: (texto) => texto,
657
+ },
658
+ produto: {
659
+ portfolio: {
660
+ opcaoAposentada: (opcao) => `portfolio.opcao-aposentada: --${opcao} era do Objective Envelope, aposentado na I-43, e o\n` +
661
+ ' portfolio show nunca a leu. As duas vigas do envelope viraram propriedade de thread comum:\n' +
662
+ ' ork thread new "<nome>" --modo <MODO> --exige-runtime-diferente\n' +
663
+ ' o CHECK precisa de runtime que o GO nao usou\n' +
664
+ ' ork thread new "<nome>" --modo <MODO> --done "<criterio> :: <comando>"\n' +
665
+ ' criterio de pronto EXECUTAVEL, que vira claim e roda no ork verify',
666
+ usoInspect: 'uso: ork portfolio inspect <id> --json',
667
+ tipo: 'tipo deve ser product, project ou initiative',
668
+ vazio: 'Portfólio vazio.',
669
+ usoShow: 'uso: ork portfolio show <id>',
670
+ naoEncontrada: (id) => `entidade ${id} não encontrada`,
671
+ estado: (id, titulo, estado) => `${id}\n${titulo}\nEstado: ${estado}`,
672
+ usoCreate: 'uso: ork portfolio create <product|project|initiative> <id> --title T [--parent ID]',
673
+ desconhecido: (sub) => `subcomando desconhecido: portfolio ${sub}`,
674
+ },
675
+ creation: {
676
+ identidade: 'creation.identity: payload não escolhe principal',
677
+ usoStart: 'uso: ork creation start --input-file F --json',
678
+ arquivoGrande: 'creation.input: arquivo excede limite',
679
+ exigeId: 'creation exige id',
680
+ versao: 'creation exige --expected-version inteiro positivo',
681
+ desconhecido: 'subcomando creation desconhecido',
682
+ },
683
+ objective: (sub) => `objective.aposentado: o Objective Envelope saiu do produto na I-43 (subcomando "${sub}").\n` +
684
+ ' Ele descrevia um gate que nao bloqueava nada: das 137 threads do projeto, zero\n' +
685
+ ' tinham creationOrigin, que era a unica via pela qual o despacho o consultava.\n' +
686
+ ' As duas vigas que ele guardava viraram propriedade de thread comum:\n' +
687
+ ' ork thread new "<nome>" --modo <MODO> --exige-runtime-diferente\n' +
688
+ ' o CHECK precisa de runtime que o GO nao usou\n' +
689
+ ' ork thread new "<nome>" --modo <MODO> --done "<criterio> :: <comando>"\n' +
690
+ ' criterio de pronto EXECUTAVEL, que vira claim e roda no ork verify\n' +
691
+ ' Os envelopes ja gravados continuam em .orkastery/objectives, intocados.',
692
+ ci: {
693
+ usoPrepare: 'uso: ork ci prepare <thread-id>', aviso: (linha) => `AVISO: ${linha}`,
694
+ bundle: (arquivo) => `Bundle de CI: ${arquivo}`,
695
+ usoRun: 'uso: ork ci run <thread-id> [--json] | ork ci run --bundle <arquivo> | ork ci run --branch <branch>',
696
+ resultado: (ok, detalhe) => `${ok ? 'CI APROVADO' : 'CI REPROVADO'}: ${detalhe}`,
697
+ sha: 'erro: ci status: --sha exige o sha completo, de 40 caracteres hexadecimais minusculos ' +
698
+ '(git rev-parse HEAD); o check e consultado no commit exato, nunca por ref nem prefixo',
699
+ usoStatus: 'uso: ork ci status --sha <sha de 40 caracteres> [--remoto origin]',
700
+ status: (ok, detalhe) => `${ok ? 'CI VERDE' : 'CI NÃO LIBEROU'}: ${detalhe}`,
701
+ desconhecido: (sub) => `subcomando desconhecido: ci ${sub}`,
702
+ // GO-FIX 1: o lint do bundle nasce em pt-BR, que e o que vai ao ledger, e a impressao o remonta no locale do comando.
703
+ anteriorAoLint: (linha) => `${linha} (claim anterior ao lint: so aviso)`,
704
+ worktreeSumiu: (worktree) => `a worktree ${worktree} da thread nao existe mais; o bundle vai para a raiz do projeto`,
705
+ lintRecusado: (recusas) => `claims.lint: o bundle nao foi gerado; retire a claim e registre de novo com o comando focado:\n ${recusas}`,
706
+ },
707
+ },
708
+ },
709
+ setup: locale_setup_1.SETUP_PT_BR,
710
+ projetos: locale_projetos_1.PROJETOS_PT_BR,
711
+ init: {
712
+ foraDoRepositorio: (dir) => `init.fora-do-repositorio: ${dir} não está num repositório git; nada foi criado. ` +
713
+ 'Entre no repositório do projeto (ou crie um com git init e o primeiro commit) e rode ork init de novo.',
714
+ jaExiste: (caminho) => `Manifesto ja existe: ${caminho}`,
715
+ nadaSobrescrito: 'Nada foi sobrescrito. Use --force para regerar.',
716
+ agentsMd: (estado, caminho) => `AGENTS.md ${estado}: ${caminho}`,
717
+ agentsMdLinha: (estado, caminho) => ` AGENTS.md ${estado}: ${caminho}`,
718
+ estadosAgents: { criado: 'criado', atualizado: 'atualizado', inalterado: 'inalterado' },
719
+ criado: (caminho) => `Manifesto criado: ${caminho}`,
720
+ projeto: (nome, abbrev) => ` projeto ${nome} (abbrev "${abbrev}")`,
721
+ branchBase: (branch) => ` branch base ${branch}`,
722
+ gerenciador: (g) => ` gerenciador ${g}`,
723
+ verify: (v) => ` verify ${v}`,
724
+ semScript: '(nenhum script detectado)',
725
+ estado: (dir) => ` estado ${dir}/ fora do git (${dir}/.gitignore com *; o seu .gitignore fica como está)`,
726
+ proximoPasso: 'Proximo passo: ork doctor; depois ork onboarding para conduzir a entrevista do projeto.',
727
+ },
728
+ };
729
+ const EN = {
730
+ cli: {
731
+ erro: (mensagem) => `error: ${mensagem}`,
732
+ subcomandoDesconhecido: (comando, sub) => sub === undefined ? `missing subcommand: ${comando}` : `unknown subcommand: ${comando} ${sub}`,
733
+ manifestoNaoEncontrado: (nome, dir) => `\`${nome}\` not found in ${dir} or any parent directory; run \`ork init\` first.`,
734
+ },
735
+ horario: {
736
+ brasilia: 'Brasília time',
737
+ legendaBrasilia: 'Times in Brasília time.',
738
+ legenda: (rotulo) => `Times in ${rotulo}.`,
739
+ duracaoDesconhecida: 'unknown time',
740
+ menosDeUmMin: 'less than 1 min',
741
+ jaLiberou: 'already released',
742
+ emMinutos: (n) => `in ${n} min`,
743
+ emHoras: (h, mm) => `in ${h}h${mm}`,
744
+ },
745
+ doctor: {
746
+ titulo: 'ork doctor: what holds on this machine now',
747
+ correcao: 'fix',
748
+ bloqueado: (falhas, avisos) => `Verdict: BLOCKED (${falhas} fail, ${avisos} warn). Fix the items above before dispatching a phase.`,
749
+ pronto: (avisos) => `Verdict: READY (${avisos} warn). Phase dispatch allowed through \`ork phase run\`.`,
750
+ nomes: {
751
+ 'repositorio': 'repository',
752
+ 'manifesto': 'manifest',
753
+ 'manifesto do repositorio': 'repository manifest',
754
+ 'analisadores do grafo': 'graph analyzers',
755
+ 'abbrev do projeto': 'project abbrev',
756
+ 'modos de conducao': 'conduction modes',
757
+ 'fuso do dono': 'owner time zone',
758
+ 'despacho pelo codex': 'codex dispatch',
759
+ 'custo e provider herdado': 'cost and inherited provider',
760
+ 'provider efetivo da fabrica': 'effective factory provider',
761
+ 'fonte da memoria': 'memory source',
762
+ 'regime de memoria': 'memory regime',
763
+ 'fonte da DSN': 'DSN source',
764
+ 'DSN no ambiente': 'DSN in environment',
765
+ 'chave de embedding': 'embedding key',
766
+ 'fila de rate limit': 'rate limit queue',
767
+ 'estado do projeto': 'project state',
768
+ 'contas por runtime': 'accounts per runtime',
769
+ 'separacao da conducao': 'conduction account separation',
770
+ 'governanca de sessoes': 'session governance',
771
+ 'dono do .git': '.git owner',
772
+ 'onboarding memoria': 'onboarding memory',
773
+ 'onboarding fuso': 'onboarding time zone',
774
+ 'rede': 'network',
775
+ 'sandbox do codex': 'codex sandbox',
776
+ 'permissoes do estado': 'state permissions',
777
+ 'pasta privada': 'private folder',
778
+ 'cadencia do pulse no cron': 'pulse cron cadence',
779
+ 'transporte do pulse': 'pulse transport',
780
+ 'fabrica compartilhada': 'shared factory',
781
+ 'pasta das worktrees': 'worktree folder',
782
+ 'forja identidade': 'forge identity',
783
+ 'forja alcance': 'forge reach',
784
+ 'forja tls': 'forge TLS',
785
+ 'forja subcaminho': 'forge base path',
786
+ 'forja cli': 'forge CLI',
787
+ 'forja login': 'forge login',
788
+ 'forja servidor': 'forge server',
789
+ 'forja escopo': 'forge token scope',
790
+ 'forja projeto': 'forge project',
791
+ 'forja capacidades': 'forge capabilities',
792
+ },
793
+ instaleNode: 'install Node 20 or later',
794
+ gitAusente: 'not found on PATH',
795
+ instaleGit: 'install git',
796
+ securityScanDocker: 'Docker available: the security scan tools run in containers',
797
+ securityScanNativo: 'no Docker; every loop tool has an accepted native binary',
798
+ securityScanSemFerramenta: (lista) => `without Docker these would be unavailable: ${lista}`,
799
+ securityScanCorrecao: (nativos) => `install Docker (CLI and a running daemon); alternatively install the native binaries at the catalog version: ${nativos}. pip-audit and govulncheck only run in Docker`,
800
+ branch: (branch, semCommit) => `branch ${branch}${semCommit ? ' (no commit)' : ''}`,
801
+ foraDeRepo: 'outside a git repository',
802
+ rodeDentroDeRepo: 'run `ork` inside a git repository',
803
+ versaoDesconhecida: 'unknown version',
804
+ codexAusenteUsado: '`codex` binary not on PATH (the project dispatches through it: see codex dispatch)',
805
+ codexAusenteOpcional: '`codex` binary not on PATH (optional: claude-bg is the default runtime)',
806
+ instaleCodex: 'to dispatch through codex, install the Codex CLI and sign in with `codex login`',
807
+ sandboxOk: '`codex sandbox true` runs on this machine',
808
+ sandboxFalhou: (detalhe) => `probe \`codex sandbox true\` failed: ${detalhe}`,
809
+ sandboxCorrecao: (confirmar) => 'install the system bubblewrap package (the bundled bwrap cannot create a user namespace ' +
810
+ `on this machine) or declare \`runtime.sandbox: danger-full-access\` knowing the risk, and confirm on this machine with \`${confirmar}\``,
811
+ manifestoAusente: (nome, dir) => `${nome} not found in ${dir} or any parent directory`,
812
+ rodeInit: 'ork init',
813
+ entreNoRepoEInit: 'enter the project repository (or create one with `git init` and a first commit) and run `ork init`',
814
+ corrijaManifesto: 'fix the manifest and run `ork doctor` again',
815
+ abbrevOk: (abbrev) => `"${abbrev}" (part 1 of the session slug)`,
816
+ abbrevCorrecao: 'set project.abbrev with up to 3 characters [a-z0-9]',
817
+ modos: (padrao, permitidos) => `default ${padrao}; allowed ${permitidos}`,
818
+ fusoDoManifesto: (fuso, chave, rotulo) => `${fuso} (${chave}); times for people in ${rotulo}`,
819
+ fusoDoSistema: (fuso, chave) => `${fuso} (system time zone; ${chave} not set)`,
820
+ fusoCorrecao: (chave) => `set ${chave} to an IANA name`,
821
+ filaVazia: 'empty: no phase died from a usage limit in this project',
822
+ filaResumo: (esperando, escalados) => `${esperando} waiting for a window, ${escalados} escalated to a human`,
823
+ filaProxima: (quando) => `; next window at ${quando}`,
824
+ estadoOk: (dir, qtd) => `${dir} (${qtd} thread(s))`,
825
+ estadoAusente: (dir) => `${dir} missing`,
826
+ estadoCorrecao: '`ork init` creates the state directory',
827
+ claudeSemLogin: (detalhe, auth) => `${detalhe}; ${auth}: dispatch through claude-bg would fail`,
828
+ claudeLoginPago: 'sign in with a subscription (claude.ai) in `claude`, without an API key or a cloud provider',
829
+ claudeLogin: 'run `claude` once, sign in with your subscription (/login) and accept trust in the project directory; ' +
830
+ 'or create a profile with `ork accounts add <id> --runtime claude-bg --dir <folder>`',
831
+ onboardingPendente: (n, etapas) => `${n} step(s) pending: ${etapas}`,
832
+ onboardingCompleto: '9 steps answered',
833
+ foraDaRede: 'outside the network; `ork network entrar` puts this machine on your network',
834
+ manifestoOk: (caminho, bytes, limite) => `${caminho} (${bytes} B of ${limite})`,
835
+ politicaViolada: (politica, envs) => `policy ${politica} violated: ${envs} redirects the claude dispatch`,
836
+ politicaComPaga: (politica, envs) => `policy ${politica}; dispatch stays on the local subscription, but there is a paid credential in the environment: ${envs}`,
837
+ politicaLimpa: (politica) => `policy ${politica}; no paid provider variable active`,
838
+ removaDoAmbiente: (envs) => `remove from the environment: ${envs} (dispatch uses the local Claude subscription)`,
839
+ nuncaDespachePorPaga: (envs) => `no action required; never dispatch a phase through ${envs}`,
840
+ providersAtivos: (nomes) => `active names: ${nomes}`,
841
+ nenhumProvider: 'no name from the provider list is active',
842
+ memoriaFiles: 'files (honest fallback: handoff through files, path#anchor pointer)',
843
+ embeddingNone: 'memory.embedding with provider none: semantic search is off',
844
+ semPerfis: 'no profile configured: each runtime dispatches through the process environment',
845
+ manifestoForaDoRepo: (nome, caminho, topo) => `the ${nome} that was read sits outside this repository (${caminho}): ork runs the project in that folder, not the one in ${topo}`,
846
+ manifestoForaDoRepoCorrecao: (topo) => `run \`ork init\` at the root of this repository (${topo}); if the outside manifest ` +
847
+ 'was created by mistake, delete it together with the AGENTS.md and the .orkastery/ next to it',
848
+ storeInvalido: (erro) => `invalid profile store: ${erro}`,
849
+ storeCorrecao: 'the store lives in .orkastery/private/runtime-profiles.json (file 0600, folder 0700)',
850
+ contaPaga: 'paid provider (never dispatches)',
851
+ contaInconclusiva: 'login check inconclusive',
852
+ contaSemLogin: 'not signed in',
853
+ contaPronta: 'ready',
854
+ contaFora: (estado, ate) => `${estado}${ate ? ` until ${ate}` : ''}`,
855
+ contasCorrecao: '`ork accounts check` marks the profiles (sem-auth, provider-pago); `ork accounts add` redoes the subscription ' +
856
+ 'login through the CLI itself, never copying a credential',
857
+ condutorCompartilha: (runtime, conta, fases) => `the LLM conductor (${runtime}, ${conta}) shares its account with live phases: ${fases}`,
858
+ condutorSeparado: (runtime, conta) => `the LLM conductor (${runtime}, ${conta}) does not share its account with a live phase`,
859
+ contaDoAmbiente: 'process environment',
860
+ condutorCompartilhaCorrecao: 'run the conductor on another account or leave quota reaction to `ork conducao batida`',
861
+ embeddingPago: (variavel) => `memory.embedding.api_key_env declares ${variavel}, a name from the paid provider list`,
862
+ embeddingPagoCorrecao: 'use a key dedicated to Orkastery, with its own name, for example ORKASTERY_EMBEDDING_API_KEY',
863
+ embeddingSemVariavel: (provider) => `memory.embedding with provider ${provider} and no api_key_env`,
864
+ embeddingSemVariavelCorrecao: 'declare in memory.embedding.api_key_env the NAME of the variable that holds the dedicated key',
865
+ embeddingRecusada: (variavel) => `${variavel} has a refused value: it looks like a URL, a DSN or text with spaces (the value is never printed)`,
866
+ embeddingRecusadaCorrecao: (variavel) => `check that ${variavel} holds the dedicated key, not another credential`,
867
+ embeddingPresente: (variavel, provider, modelo) => `${variavel} present in the environment (value never printed); ${provider} ${modelo}`,
868
+ embeddingAusente: (variavel) => `${variavel} missing from the environment: semantic search uses the local fallback or falls back to FTS; the regime does not change`,
869
+ embeddingAusenteCorrecao: (variavel) => `export ${variavel} with the key dedicated to Orkastery (with a credit limit in the provider dashboard)`,
870
+ donoOutro: (total, dir, uids, uid, exemplos, parcialDe) => `${total} entry(ies) in ${dir} owned by another user (uid ${uids}; the repository owner is ${uid}): ${exemplos}; ` +
871
+ `the owner's git cannot write to them, so fetch and commit fail${parcialDe !== null ? ` (partial check: more than ${parcialDe} entries)` : ''}`,
872
+ donoCorrecao: (comando) => `${comando} (ork never runs this on its own)`,
873
+ donoParcial: (teto, dir) => `more than ${teto} entries in ${dir}: partial check, no other owner so far`,
874
+ donoParcialCorrecao: (comando) => `check the rest with: ${comando}`,
875
+ donoOk: (vistos, dir, uid) => `${vistos} entries in ${dir} owned by the repository owner (uid ${uid})`,
876
+ entrevistaMemoria: (escolha, declarado) => `the interview chose ${escolha}; the manifest declares ${declarado}`,
877
+ entrevistaMemoriaCorrecao: (escolha) => `review memory.mode: ${escolha} in orkastery.yaml; the interview does not change the manifest`,
878
+ entrevistaFuso: (informado, declarado, chave) => `the interview gave ${informado}; ${declarado ? `the manifest declares ${declarado}` : `the manifest has no ${chave}`}`,
879
+ entrevistaFusoCorrecao: (chave, informado) => `review ${chave}: "${informado}" in orkastery.yaml; the interview does not change the manifest`,
880
+ claudeOpcional: (fallback) => '`claude` binary not on PATH (optional for phases: no block of the allowed modes dispatches through claude-bg' +
881
+ (fallback ? `; the fallback of ${fallback.blocos} block(s) lands on it and would fail: ${fallback.texto}` : '') +
882
+ '; `ork audit run` still dispatches through it)',
883
+ claudeOpcionalCorrecao: 'to dispatch through claude-bg (and run `ork audit run`), install Claude Code and make sure `claude` is on PATH',
884
+ claudeAusente: (principal) => '`claude` binary not on PATH' +
885
+ (principal ? `; ${principal.blocos} block(s) of the allowed modes dispatch through it (${principal.texto})` : ''),
886
+ claudeAusenteCorrecao: 'install Claude Code and make sure `claude` is on PATH; with Codex only, move each block to it ' +
887
+ '(`ork setup <mode> --bloco N --runtime codex --model <model>`) or remove the mode from conduction.allowed_modes ' +
888
+ '(keep conduction.default_mode among the allowed ones)',
889
+ origemDoCodex: (pelaAdapter, blocos) => [pelaAdapter ? 'runtime.adapter: codex' : '',
890
+ blocos ? `${blocos.blocos} block(s) of the allowed modes on codex (${blocos.texto})` : ''].filter(Boolean).join(' and '),
891
+ codexForaNoDespacho: (origem) => `${origem}, but the \`codex\` binary is not on PATH`,
892
+ codexSandboxQuebrado: (origem, sandbox) => `${origem} with sandbox "${sandbox}", but the sandbox does not run on this machine (the agent would narrate success without running anything)`,
893
+ codexSandboxOk: (origem, sandbox) => `${origem} with sandbox "${sandbox}"`,
894
+ codexSemConfirmacao: (origem, sandbox) => `${origem} with sandbox "${sandbox}" requested by \`orkastery.yaml\` but not confirmed ` +
895
+ 'on this machine: dispatch is refused with `runtime.sandbox-nao-confirmado`',
896
+ codexForaNoDespachoCorrecao: 'install the Codex CLI and sign in with `codex login` (subscription, never an API key)',
897
+ codexSandboxQuebradoCorrecao: (confirmar) => `install the system bubblewrap, or declare \`runtime.sandbox: danger-full-access\` knowing the risk, and confirm on this machine with \`${confirmar}\``,
898
+ codexSemConfirmacaoCorrecao: (confirmar) => `\`${confirmar}\` (or set the manifest back to \`workspace-write\`)`,
899
+ fabricaPedida: '`orkastery.yaml` asks for `fabrica.compartilhada: true` and this machine has not joined: nothing from this machine is published to the remote',
900
+ fabricaPedidaCorrecao: '`ork fabrica entrar`, if this machine should publish its snapshot to the project remote',
901
+ pastaForaDaRaiz: (dir) => `\`worktree.dir\` "${dir}" points outside the project root and this machine has not confirmed it: worktree creation is refused with \`worktree.dir-fora-da-raiz\``,
902
+ pastaForaDaRaizCorrecao: (confirmar) => `\`${confirmar}\`, or move \`worktree.dir\` back inside the project`,
903
+ fonteDaMemoria: (fonte, divergente) => `${fonte}${divergente ? ' (divergent worktree copy kept)' : ''}`,
904
+ regimeDegradado: (motivo, detalhe) => `orkmind requested, files in effect (${motivo}): ${detalhe}`,
905
+ regimeOrkmind: (tenant, variavel) => `orkmind active in tenant "${tenant}" through the variable ${variavel}`,
906
+ regimeOrkmindPorArquivo: (tenant, arquivo) => `orkmind active in tenant "${tenant}" through the file \`${arquivo}\``,
907
+ dsnDaVariavel: (variavel) => `environment variable ${variavel}, present (value never printed)`,
908
+ dsnVariavelAusente: (variavel) => `environment variable ${variavel} missing: memory falls back to files`,
909
+ dsnVariavelAusenteCorrecao: (variavel) => `export ${variavel} with the DSN of the tenant's own database, ` +
910
+ 'or pass it through `memory.database_url_file` (a 0600 file in `~/.orkastery/segredos/`)',
911
+ dsnDoArquivo: (rotulo, permissao) => `file \`${rotulo}\`, owned by the user running ork, permission ${permissao}, one line (value never printed)`,
912
+ dsnArquivoFalhou: (rotulo, motivo, causa) => `file \`${rotulo}\` refused (\`${motivo}\`): ${causa}; memory falls back to files, with no other source`,
913
+ dsnCausa: (causa, permissao) => ({
914
+ forma: '`memory.database_url_file` outside the form `~/.orkastery/segredos/<name>` (value omitted)',
915
+ raiz: 'the ork user folder must be an absolute path without `..`, inside the user home (`HOME`)',
916
+ 'nao-existe': 'does not exist',
917
+ 'nao-abre': 'could not be opened for reading',
918
+ pasta: 'the path to the secrets folder has a symbolic link or something that is not a folder',
919
+ 'dono-da-pasta': 'the ork user folder is not owned by the user running ork',
920
+ link: 'symbolic link not accepted',
921
+ 'nao-e-arquivo': 'not a regular file',
922
+ plataforma: 'this platform checks neither owner nor permission',
923
+ dono: 'the owner is not the user running ork',
924
+ permissao: `permission ${permissao}, neither 0600 nor 0400`,
925
+ tamanho: 'larger than 4 KiB',
926
+ vazio: 'empty',
927
+ codificacao: 'not UTF-8 text',
928
+ linhas: 'more than one line',
929
+ controle: 'control character',
930
+ 'nome-valor': 'NAME=value environment file format; write only the DSN',
931
+ esquema: 'not a DSN with a scheme (such as `postgresql://`)',
932
+ espaco: 'whitespace inside the DSN',
933
+ leitura: 'could not be read',
934
+ })[causa] ?? causa,
935
+ dsnArquivoCorrecao: (motivo, rotulo) => motivo === 'dsn.arquivo-ausente'
936
+ ? `write the DSN of the tenant's own database to \`${rotulo}\`, on one line and with permission 0600, without the shell history: ` +
937
+ `\`(umask 077; cat > ${rotulo})\``
938
+ : motivo === 'dsn.arquivo-inseguro'
939
+ ? `make \`${rotulo}\` a file owned by the user running ork, in a folder of theirs, with \`chmod 600 ${rotulo}\``
940
+ : `rewrite \`${rotulo}\` as a regular file in a regular secrets folder, inside the user home and with no symbolic ` +
941
+ 'link on the path, with only the DSN (`scheme://...`), on one line and without a NAME= prefix',
942
+ dsnNaSessao: (doProjeto, comSenha) => `in this dispatched session's environment, the agent reads with \`env\`: ${[...doProjeto.map((n) => `${n} (project DSN)`),
943
+ ...comSenha.map((n) => `${n} (URL with password)`)].join(', ')} (value never printed)`,
944
+ dsnNoProcesso: (nomes) => `the file's DSN is also in this process environment, in ${nomes.join(', ')}: whoever inherits this environment sees it (value never printed)`,
945
+ dsnSessaoLimpa: 'no DSN and no URL with password in this dispatched session environment',
946
+ dsnProcessoLimpo: "the file's DSN is not in this process environment",
947
+ dsnNoAmbienteCorrecao: 'remove these variables from the environment the host passes to agents (in Hermes, `~/.hermes/.env`), ' +
948
+ 'with a backup, and pass the project DSN through `memory.database_url_file`',
949
+ filaEscaladoCorrecao: 'request escalated past the retry.max_tentativas limit: `ork retry list` and `ork gate request <thread>`',
950
+ filaEsperaCorrecao: '`ork retry resume` picks up what is already released',
951
+ governanca: (g) => `${g.usuario}, Claude and Codex, global with history: ${g.total} sessions; ` +
952
+ `${g.semThread} without a thread; ${g.ambiguas} ambiguous; ` +
953
+ `inventory ${g.ok ? 'valid' : 'INCOMPLETE (zero not proven)'}` +
954
+ (g.ausentes.length ? `; source missing: ${g.ausentes.join(', ')}` : ''),
955
+ governancaCorrecao: '`ork sessions --global --all --json`; adopt unlinked identities with `ork sessions adopt <id>`',
956
+ umaskNaoMedido: 'process umask not measured on this platform',
957
+ umaskOk: (umask) => `umask ${umask} denies write to group and others`,
958
+ umaskAberto: (umask) => `umask ${umask} allows write by group or others: whatever the runtime creates will be refused by the sensor (bits 0o022)`,
959
+ umaskCorrecao: '`umask 022` (or 077) in the shell that runs ork and the runtimes',
960
+ estadoNaoDiretorio: (dir) => `${dir} is not a real directory`,
961
+ estadoAberto: (dir, modo) => `${dir} with mode ${modo}: group or others can write to the state`,
962
+ estadoComModo: (dir, modo) => `${dir} with mode ${modo}`,
963
+ privadaAusente: (dir) => `${dir} missing: created on demand with 0700`,
964
+ privadaAberta: (dir, modo) => `${dir} must be a 0700 directory owned by the user (mode ${modo}): HITL receipts and profiles refuse it`,
965
+ privadaOk: (dir) => `${dir} with mode 0700`,
966
+ cronSemComando: 'crontab command missing on this machine',
967
+ cronFalhou: (detalhe) => `\`crontab -l\` failed: ${detalhe}`,
968
+ cronSaiu: (codigo) => `\`crontab -l\` exited ${codigo}`,
969
+ cronAdicione: (linha) => `add to the crontab (\`crontab -e\`), as in the \`monitor/pulse.cron\` template: ${linha}`,
970
+ cronSemLeitura: (motivo) => `pulse-host.json present, but there is no crontab to read (${motivo}): the scan never runs`,
971
+ cronSemLinha: (script) => `pulse-host.json present, and no crontab line runs ${script}: the summary never goes out`,
972
+ cronOk: (linhas) => `scan in cron every 15 minutes or less (${linhas} line(s))`,
973
+ cronRitmo: (intervalo) => intervalo === null ? 'on a schedule the doctor cannot read'
974
+ : intervalo === 60 ? 'every hour' : `every ${intervalo} minutes`,
975
+ cronLento: (ritmo, linha) => `the pulse scan runs ${ritmo} (\`${linha}\`): the cadence by tag (RM-039) needs 15 minutes`,
976
+ cronTroque: (linha) => `replace the crontab line (\`crontab -e\`) with: ${linha}`,
977
+ batidaAusente: (abertas, detalhe) => `${abertas} open thread(s) and no scan beat: ${detalhe}; the factory stops and nobody knows`,
978
+ batidaSemLeitura: (motivo) => `no crontab to read (${motivo})`,
979
+ batidaSemLinha: (script) => `no crontab line runs ${script} for this project`,
980
+ batidaInstale: (comando) => `\`${comando}\` (installs the \`monitor/pulse.cron\` template line in this machine's crontab)`,
981
+ batidaPeloLog: (minutos) => `no crontab line, but the scan ran ${minutos} min ago (hitl.log): the beat comes from another scheduler`,
982
+ batidaAtrasada: (minutos, linhas) => `the scan is in the crontab (${linhas} line(s)), but the last round was ${minutos} min ago (hitl.log): the beat stopped`,
983
+ batidaAtrasadaCorrecao: '`ork fabrica batida status` (the last round tells the code and the detail; check the cron, the script and the line PATH)',
984
+ transporteOk: (host, quando) => `last delivery through ${host} at ${quando}`,
985
+ transporteDesvio: (falhou, host, quando) => `transport ${falhou} failed at ${quando}, and the summary went out through ${host} (the other configured host)`,
986
+ transporteFalhou: (quando, tentativas) => `the summary of ${quando} went out through no configured transport (${tentativas}): the news stays kept for the next beat`,
987
+ transporteCorrecao: 'check the executable and the target in `.orkastery/monitor/pulse-host.json` (the host adapter: `openclaw message send` or the Hermes `ork-pulse-enviar.py`)',
988
+ redeSaiu: 'outside the network (left with `ork network sair`)',
989
+ redeMembroHerdado: 'member inherited from the factory',
990
+ redeMembro: 'member',
991
+ redeCasa: (casa) => `home ${casa}`,
992
+ redeSemCasa: 'home not recorded yet',
993
+ redeBatida: (quando, idade) => `last heartbeat ${quando} (${idade} ago)`,
994
+ redeSemBatida: 'no heartbeat published',
995
+ redeFalha: (quando, origem, erro) => `last failure ${quando}${origem ? ` (${origem})` : ''}: ${erro}`,
996
+ redeSemDetalhe: 'no detail',
997
+ redeSemFalha: 'no failure in rede.log',
998
+ redeParadaCorrecao: 'the heartbeat comes from the pulse: check the pulse cron and run `ork network publicar`',
999
+ redeSemCasaCorrecao: 'the network home does not exist yet: the owner runs `ork network entrar`, which creates the private ' +
1000
+ 'repository; or `ork network sair`, to take this machine out of the network',
1001
+ redeSemForjaCorrecao: 'sign in to the forge (`gh auth login` or `glab auth login`) and run `ork network publicar`',
1002
+ redePublicaCorrecao: 'make the network home private on the forge; nothing is published to a public repository',
1003
+ redeNomeCorrecao: 'pick another name with `ork network entrar --maquina NOME`, or take this one with `--forcar`',
1004
+ redeOutraCorrecao: '`ork network status` shows the gaps; `ork network publicar` tries again',
1005
+ grafo: {
1006
+ recusa: (motivo) => `${motivo}: \`ork grafo indexar\` refuses on this installation, and without the index the queries and the ork_grafo_* tools refuse too`,
1007
+ soEsm: (versaoDoNode) => `micromark is ESM only, and this Node (${versaoDoNode}) cannot load it with require: use Node 20.19, ` +
1008
+ '22.12 or newer, without the --no-experimental-require-module option (on the command line or in NODE_OPTIONS)',
1009
+ reinstale: (fixada) => `reinstall the global ork, which brings the analyzers as dependencies: npm install -g @orkastery/cli${fixada}` +
1010
+ ' (installed inside a project or through npx, npm leaves the analyzers outside the ork package, and the graph refuses them)',
1011
+ },
1012
+ fonteDaSessao: (origem) => origem.replace(/\(conta do processo\)$/, '(process account)').replace(/\(perfil ([^)]+)\)$/, '(profile $1)'),
1013
+ },
1014
+ onboarding: locale_onboarding_1.ONBOARDING_EN,
1015
+ thread: locale_thread_1.THREAD_EN,
1016
+ phase: locale_phase_1.PHASE_EN,
1017
+ ajuda: locale_ajuda_1.AJUDA_EN,
1018
+ verify: locale_verify_1.VERIFY_EN,
1019
+ ship: locale_ship_1.SHIP_EN,
1020
+ retry: locale_retry_1.RETRY_EN,
1021
+ master: locale_master_1.MASTER_EN,
1022
+ pulse: locale_pulse_1.PULSE_EN,
1023
+ roadmap: locale_roadmap_1.ROADMAP_EN,
1024
+ gerados: locale_gerados_1.GERADOS_EN,
1025
+ worktree: locale_worktree_1.WORKTREE_EN,
1026
+ estado: locale_estado_1.ESTADO_EN,
1027
+ securityScan: locale_security_scan_1.SECURITY_SCAN_EN,
1028
+ claims: locale_claims_1.CLAIMS_EN,
1029
+ decisao: locale_decisao_1.DECISAO_EN,
1030
+ accounts: locale_accounts_1.ACCOUNTS_EN,
1031
+ network: locale_network_1.NETWORK_EN,
1032
+ reservas: locale_reservas_1.RESERVAS_EN,
1033
+ docs: locale_docs_1.DOCS_EN,
1034
+ adapter: locale_adapter_1.ADAPTER_EN,
1035
+ prompts: locale_prompts_1.PROMPTS_EN,
1036
+ conhecimento: locale_conhecimento_1.CONHECIMENTO_EN,
1037
+ conducao: locale_conducao_1.CONDUCAO_EN,
1038
+ grafo: locale_grafo_1.GRAFO_EN,
1039
+ audit: locale_audit_1.AUDIT_EN,
1040
+ forja: locale_forja_1.FORJA_EN,
1041
+ operacao: {
1042
+ restante: locale_operacao_restante_1.OPERACAO_RESTANTE_EN,
1043
+ modos: {
1044
+ titulo: 'Conduction modes (put the #TAG in the request to the orchestrator)',
1045
+ cabecalho: ['#TAG', 'BLOCKS', 'PAUSES', 'CYCLE'],
1046
+ marcaDaPausa: '* = block that pauses and waits for a human verdict',
1047
+ detalhe: 'Details by mode:',
1048
+ slug: 'session slugs',
1049
+ pausas: 'pauses',
1050
+ nenhuma: 'none',
1051
+ uso: 'use',
1052
+ pausaSobre: {
1053
+ objetivo: 'goal', plano: 'plan', implementacao: 'implementation', evidencias: 'evidence',
1054
+ push: 'push', score: 'score', premissas: 'assumptions',
1055
+ 'evidencias, com autorizacao antecipada de push': 'evidence, with push authorized in advance',
1056
+ },
1057
+ recomendado: {
1058
+ classic: 'The default: careful assumptions with reliable delivery',
1059
+ maestro: 'Clear, agile solutions without many risks or tradeoffs',
1060
+ auto: 'Smaller solutions, docs, studies, research, configuration, audits, and migrations',
1061
+ fast: 'A small, clear request measured in minutes: GO only, no ceremony; push still requires authorization',
1062
+ },
1063
+ regra: 'CENTRAL RULE: the mode loosens pauses, NEVER verification.',
1064
+ migracao: {
1065
+ nada: 'Nothing to migrate: this project configuration has no retired mode.',
1066
+ simulacao: 'Simulation (`--dry-run`): nothing was written.',
1067
+ aplicada: 'Migration applied.',
1068
+ de: 'from', para: 'to', backup: 'backup',
1069
+ historico: 'No history was changed: threads, ledgers, and receipts in a retired mode stay as they are.',
1070
+ },
1071
+ },
1072
+ ciclos: {
1073
+ titulo: 'Cycle variants (`ork thread new --ciclo <variant>`)',
1074
+ descricoes: {
1075
+ greenfield: 'Start from scratch: requires an isolated worktree based on the manifest base',
1076
+ 'merge-branch': 'Start from an existing branch (`--branch`) without creating a new branch',
1077
+ 'goal-plan': 'Merge GOAL and PLAN into one block: one less pause when the mode separates them',
1078
+ gap: 'Gap analysis: no GO or SHIP; publish the gap as a gap',
1079
+ 'feature-xl-faseada': 'Large feature in slices: PLAN commits to N verifiable slices',
1080
+ },
1081
+ worktree: 'isolated worktree',
1082
+ exige: 'requires', nada: 'nothing', muda: 'changes the mode blocks', sim: 'yes', nao: 'no',
1083
+ fecho: 'The variant changes how the thread STARTS. Verification and gates do not change.',
1084
+ },
1085
+ pulseCadencia: {
1086
+ umaTag: 'pulse cadencia: provide one tag at a time',
1087
+ desconhecida: (tag, allowed) => `pulse cadencia: unknown tag "${tag}"; use ${allowed}`,
1088
+ trocaSemAutor: 'pulse.cadencia: provide who changed the cadence',
1089
+ desconhecidaInterna: (tag) => `pulse.cadencia: unknown tag ${tag}`,
1090
+ descricoes: {
1091
+ '#OrkPulseOff': 'every 8 hours, at 08:00, 16:00, and 00:00', '#OrkPulseOn': 'every 2 hours',
1092
+ '#OrkPulseOn-15m': 'every 15 minutes', '#OrkPulseOn-30m': 'every 30 minutes',
1093
+ '#OrkPulseOn-60m': 'hourly',
1094
+ },
1095
+ texto: (description, tag, next) => `Pulse ${description} (${tag}). Questions for you still go out immediately. Next summary with news starts at ${next}.`,
1096
+ trocada: (by, channel, when) => `Changed by ${by} (${channel}) at ${when}.`,
1097
+ padrao: 'No saved tag: the default cadence applies.',
1098
+ responderUso: 'pulse responder requires --resposta-stdin and the authenticated ingress envelope',
1099
+ responderFormato: 'pulse responder: --formato telegram|terminal',
1100
+ responderReferencia: 'pulse responder: --em-resposta-a takes the question code and the id of the replied message (for example NX4K:4521), or outra, the bare word in reply to another message',
1101
+ },
1102
+ ledger: {
1103
+ usoStats: 'usage: ork ledger stats --desde 7d [--ate ISO] [--thread T] [--modo M] [--runtime R] [--json]',
1104
+ usoEstimate: 'usage: ork ledger estimate <thread-id> --sem-ia H --ia-sem-ork H --por Q --metodo M --premissas P [--incerteza I]',
1105
+ uso: 'usage: ork ledger stats|estimate ...',
1106
+ estimativa: (thread, noAi, aiWithoutOrk) => `PLAN estimate recorded in ${thread}: no AI ${noAi} h; AI without Orkastery ${aiWithoutOrk} h.`,
1107
+ periodo: (from, to, interval) => `Ledger stats ${from} to ${to} ${interval}`,
1108
+ sessoes: (threads, completed, dispatches) => ` threads/sessions ${threads} / ${completed} completed (${dispatches} dispatches)`,
1109
+ throughput: (ships, retries) => ` throughput ${ships} ship(s); ${retries} retry(ies)`,
1110
+ execucao: (hours, measured, missing) => ` execution ${hours} h (${measured} measured; ${missing} missing)`,
1111
+ tokens: (total, input, cached, output) => ` tokens ${total} total; input ${input} (cached ${cached}); output ${output}`,
1112
+ semCobertura: 'no coverage',
1113
+ custo: (value) => ` reference cost ${value} (estimate from public rates, not spend or billing)`,
1114
+ espera: (hours, open) => ` human wait ${hours} h; ${open} open`,
1115
+ semResposta: 'no measured response',
1116
+ metaDentro: ' (within the 5 min target)', metaFora: ' (above the 5 min target)',
1117
+ hitl: (requests, hours, median, target, open, outside) => ` conduction HITL ${requests} question(s); stopped ${hours} h; median ${median}${target}; ${open} open; text outside exception ${outside}`,
1118
+ riscos: (total) => ` risks prevented ${total} preventive gate(s)`,
1119
+ estimativas: (total) => ` PLAN estimates ${total} sample(s)`,
1120
+ cobertura: (text) => ` coverage ${text}`,
1121
+ observacao: (text) => text
1122
+ .replace(/sessao\(oes\) sem medicao de tokens$/, 'session(s) without token measurement')
1123
+ .replace(/sessao\(oes\) com tokens, mas sem tarifa de referencia$/, 'session(s) with tokens but no reference rate')
1124
+ .replace(/linha\(s\) de ledger corrompida\(s\) ignorada\(s\)$/, 'corrupt ledger line(s) ignored'),
1125
+ },
1126
+ produto: {
1127
+ portfolio: {
1128
+ opcaoAposentada: (option) => `portfolio.opcao-aposentada: --${option} belonged to the Objective Envelope, retired in I-43, and\n` +
1129
+ ' portfolio show never read it. The envelope\'s two beams became regular thread properties:\n' +
1130
+ ' ork thread new "<name>" --modo <MODE> --exige-runtime-diferente\n' +
1131
+ ' CHECK requires a runtime that GO did not use\n' +
1132
+ ' ork thread new "<name>" --modo <MODE> --done "<criterion> :: <command>"\n' +
1133
+ ' an EXECUTABLE done criterion that becomes a claim and runs in ork verify',
1134
+ usoInspect: 'usage: ork portfolio inspect <id> --json',
1135
+ tipo: 'type must be product, project, or initiative',
1136
+ vazio: 'Portfolio is empty.',
1137
+ usoShow: 'usage: ork portfolio show <id>',
1138
+ naoEncontrada: (id) => `entity ${id} not found`,
1139
+ estado: (id, title, status) => `${id}\n${title}\nStatus: ${status}`,
1140
+ usoCreate: 'usage: ork portfolio create <product|project|initiative> <id> --title T [--parent ID]',
1141
+ desconhecido: (sub) => `unknown subcommand: portfolio ${sub}`,
1142
+ },
1143
+ creation: {
1144
+ identidade: 'creation.identity: payload cannot choose the principal',
1145
+ usoStart: 'usage: ork creation start --input-file F --json',
1146
+ arquivoGrande: 'creation.input: file exceeds the limit',
1147
+ exigeId: 'creation requires an id',
1148
+ versao: 'creation requires a positive integer --expected-version',
1149
+ desconhecido: 'unknown creation subcommand',
1150
+ },
1151
+ objective: (sub) => `objective.aposentado: the Objective Envelope left the product in I-43 (subcommand "${sub}").\n` +
1152
+ ' It described a gate that blocked nothing: of the project\'s 137 threads, zero\n' +
1153
+ ' had creationOrigin, the only path through which dispatch consulted it.\n' +
1154
+ ' Its two beams became regular thread properties:\n' +
1155
+ ' ork thread new "<name>" --modo <MODE> --exige-runtime-diferente\n' +
1156
+ ' CHECK requires a runtime that GO did not use\n' +
1157
+ ' ork thread new "<name>" --modo <MODE> --done "<criterion> :: <command>"\n' +
1158
+ ' an EXECUTABLE done criterion that becomes a claim and runs in ork verify\n' +
1159
+ ' Existing envelopes remain untouched in .orkastery/objectives.',
1160
+ ci: {
1161
+ usoPrepare: 'usage: ork ci prepare <thread-id>', aviso: (line) => `WARNING: ${line}`,
1162
+ bundle: (file) => `CI bundle: ${file}`,
1163
+ usoRun: 'usage: ork ci run <thread-id> [--json] | ork ci run --bundle <file> | ork ci run --branch <branch>',
1164
+ resultado: (ok, detail) => `${ok ? 'CI PASSED' : 'CI FAILED'}: ${detail}`,
1165
+ sha: 'error: ci status: --sha requires the full 40-character lowercase hexadecimal SHA ' +
1166
+ '(git rev-parse HEAD); the check is queried at the exact commit, never by ref or prefix',
1167
+ usoStatus: 'usage: ork ci status --sha <40-character sha> [--remoto origin]',
1168
+ status: (ok, detail) => `${ok ? 'CI GREEN' : 'CI NOT CLEARED'}: ${detail}`,
1169
+ desconhecido: (sub) => `unknown subcommand: ci ${sub}`,
1170
+ anteriorAoLint: (line) => `${line} (claim predates the lint: warning only)`,
1171
+ worktreeSumiu: (worktree) => `the thread worktree ${worktree} no longer exists; the bundle goes to the project root`,
1172
+ lintRecusado: (refusals) => `claims.lint: the bundle was not generated; withdraw the claim and register it again with the focused command:\n ${refusals}`,
1173
+ },
1174
+ },
1175
+ },
1176
+ setup: locale_setup_1.SETUP_EN,
1177
+ projetos: locale_projetos_1.PROJETOS_EN,
1178
+ init: {
1179
+ foraDoRepositorio: (dir) => `init.fora-do-repositorio: ${dir} is not inside a git repository; nothing was created. ` +
1180
+ 'Enter the project repository (or create one with `git init` and a first commit) and run `ork init` again.',
1181
+ jaExiste: (caminho) => `Manifest already exists: ${caminho}`,
1182
+ nadaSobrescrito: 'Nothing was overwritten. Use `--force` to regenerate.',
1183
+ agentsMd: (estado, caminho) => `AGENTS.md ${estado}: ${caminho}`,
1184
+ agentsMdLinha: (estado, caminho) => ` AGENTS.md ${estado}: ${caminho}`,
1185
+ estadosAgents: { criado: 'created', atualizado: 'updated', inalterado: 'unchanged' },
1186
+ criado: (caminho) => `Manifest created: ${caminho}`,
1187
+ projeto: (nome, abbrev) => ` project ${nome} (abbrev "${abbrev}")`,
1188
+ branchBase: (branch) => ` base branch ${branch}`,
1189
+ gerenciador: (g) => ` package mgr ${g}`,
1190
+ verify: (v) => ` verify ${v}`,
1191
+ semScript: '(no script detected)',
1192
+ estado: (dir) => ` state ${dir}/ kept out of git (${dir}/.gitignore with *; your .gitignore stays as is)`,
1193
+ proximoPasso: 'Next step: `ork doctor`; then `ork onboarding` to run the project interview.',
1194
+ },
1195
+ };
1196
+ const CATALOGO = { 'pt-BR': PT_BR, en: EN };
1197
+ /** As mensagens do locale pedido, ou do ativo. */
1198
+ function msg(locale = ativo) {
1199
+ return CATALOGO[locale];
1200
+ }
1201
+ /**
1202
+ * D14: erro cujo texto vem do catalogo. Ele nasce no locale ativo (dentro de `comLocale('pt-BR', ...)`,
1203
+ * em pt-BR, como o que la se grava), e a entrada do CLI o remonta no locale do comando ao imprimir.
1204
+ */
1205
+ class ErroDoCatalogo extends Error {
1206
+ montar;
1207
+ constructor(montar) {
1208
+ super(montar(msg()));
1209
+ this.montar = montar;
1210
+ }
1211
+ }
1212
+ exports.ErroDoCatalogo = ErroDoCatalogo;
1213
+ /** A mensagem de um erro para a pessoa: a do catalogo no locale ativo; as demais como vieram. */
1214
+ function mensagemDoErro(e) {
1215
+ return e instanceof ErroDoCatalogo ? e.montar(msg()) : e instanceof Error ? e.message : String(e);
1216
+ }
1217
+ /**
1218
+ * F3b (D3): o texto de um erro para guardar num resultado que o comando coberto imprime depois. O do catalogo e
1219
+ * registrado para a remontagem, como `textoDoCatalogo`; os demais saem como vieram.
1220
+ */
1221
+ function textoDoErro(e) {
1222
+ return e instanceof ErroDoCatalogo ? textoDoCatalogo(e.montar) : e instanceof Error ? e.message : String(e);
1223
+ }
1224
+ /** G2 e D1 da F2b: os montadores dos textos que o comando coberto guardou num resultado, pelo texto. */
1225
+ let remontagem = null;
1226
+ /**
1227
+ * Liga o registro dos montadores (o CLI, nos comandos cobertos) ou o desliga (o `main`, no comeco de cada
1228
+ * chamada). Desligado, nada se guarda: o servidor MCP e o cron nao acumulam texto.
1229
+ */
1230
+ function ligarRemontagem(ligada) {
1231
+ remontagem = ligada ? new Map() : null;
1232
+ }
1233
+ /**
1234
+ * O texto no locale ativo. No escopo da gravacao ele sai em pt-BR, como o ledger e o `--json` o guardam;
1235
+ * com o registro ligado, o montador fica guardado para a impressao remonta-lo no locale do comando.
1236
+ */
1237
+ function textoDoCatalogo(montar) {
1238
+ const texto = montar(msg());
1239
+ remontagem?.set(texto, montar);
1240
+ return texto;
1241
+ }
1242
+ /**
1243
+ * F3b: o montador registrado de um texto do catalogo, ou um que devolve o texto como veio. Serve ao erro que embute um
1244
+ * texto ja montado: o `ErroDoCatalogo` e remontado na entrada do CLI depois que o registro foi desligado, entao ele
1245
+ * guarda o montador do texto de dentro no momento em que nasce.
1246
+ */
1247
+ function montadorDe(texto) {
1248
+ return remontagem?.get(texto) ?? (() => texto);
1249
+ }
1250
+ /** O texto como a pessoa o le no locale ativo: o que veio do catalogo e remontado; o resto sai como veio. */
1251
+ function remontar(texto) {
1252
+ const montar = remontagem?.get(texto);
1253
+ return montar ? montar(msg()) : texto;
1254
+ }
1255
+ /** Nome de check como o texto o mostra no locale ativo. */
1256
+ function nomeDoCheck(nome, locale = ativo) {
1257
+ return CATALOGO[locale].doctor.nomes[nome] ?? nome;
1258
+ }