@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/horario.js CHANGED
@@ -22,6 +22,7 @@ exports.definirFusoDoDono = definirFusoDoDono;
22
22
  exports.fusoDoDono = fusoDoDono;
23
23
  exports.partesLocais = partesLocais;
24
24
  exports.dataLocal = dataLocal;
25
+ exports.isoComFuso = isoComFuso;
25
26
  exports.instanteNoFuso = instanteNoFuso;
26
27
  exports.duracaoCurta = duracaoCurta;
27
28
  exports.duracaoRelativa = duracaoRelativa;
@@ -34,6 +35,7 @@ exports.formatarPrazo = formatarPrazo;
34
35
  exports.formatarDesde = formatarDesde;
35
36
  exports.localizarTexto = localizarTexto;
36
37
  exports.localizarTextoRotulado = localizarTextoRotulado;
38
+ const locale_1 = require("./locale");
37
39
  exports.CHAVE_DO_FUSO = 'owner.timezone';
38
40
  /** Único fuso com nome próprio no rótulo; exemplo da documentação e do `ork init`. */
39
41
  exports.FUSO_DE_BRASILIA = 'America/Sao_Paulo';
@@ -160,6 +162,21 @@ function desvioDoFuso(ms, fuso) {
160
162
  return Date.UTC(Number(p.ano), Number(p.mes) - 1, Number(p.dia), Number(p.hora), Number(p.minuto), Number(p.segundo)) -
161
163
  Math.floor(ms / 1000) * 1000;
162
164
  }
165
+ /**
166
+ * RM-063 (F7): o instante em ISO com o deslocamento do fuso escrito (`2026-10-18T23:59:00-03:00`, ou `Z` no UTC). O
167
+ * prazo da autorização durável é gravado assim: quem o lê em outro fuso chega ao mesmo instante.
168
+ */
169
+ function isoComFuso(quando, fuso = fusoDoDono().fuso) {
170
+ const ms = instante(quando);
171
+ if (!Number.isFinite(ms))
172
+ throw new Error('data inválida');
173
+ const p = partesLocais(ms, fuso);
174
+ const desvio = Math.round(desvioDoFuso(ms, fuso) / 60000);
175
+ const abs = Math.abs(desvio);
176
+ const deslocamento = desvio === 0 ? 'Z'
177
+ : `${desvio < 0 ? '-' : '+'}${String(Math.floor(abs / 60)).padStart(2, '0')}:${String(abs % 60).padStart(2, '0')}`;
178
+ return `${p.ano}-${p.mes}-${p.dia}T${p.hora}:${p.minuto}:${p.segundo}${deslocamento}`;
179
+ }
163
180
  /**
164
181
  * RM-037 (fatia 5): o instante de um relógio num fuso IANA (mês de 1 a 12). O runtime diz a hora de
165
182
  * volta da cota no fuso dele (`resets 4:40am (<fuso>)`), e lê-la no relógio desta máquina errava o
@@ -194,11 +211,11 @@ function duracaoCurta(minutos) {
194
211
  }
195
212
  /** Duração até ou desde agora: abaixo de 1 min diz `menos de 1 min`, nunca `0min`. */
196
213
  function duracaoRelativa(minutos) {
197
- return minutos < 1 ? 'menos de 1 min' : duracaoCurta(minutos);
214
+ return minutos < 1 ? (0, locale_1.msg)().horario.menosDeUmMin : duracaoCurta(minutos);
198
215
  }
199
- function sigla(fuso, ms) {
216
+ function sigla(fuso, ms, locale = (0, locale_1.localeAtivo)()) {
200
217
  try {
201
- return new Intl.DateTimeFormat('pt-BR', { timeZone: fuso, timeZoneName: 'short' })
218
+ return new Intl.DateTimeFormat(locale === 'en' ? 'en-US' : 'pt-BR', { timeZone: fuso, timeZoneName: 'short' })
202
219
  .formatToParts(new Date(ms)).find(p => p.type === 'timeZoneName')?.value ?? '';
203
220
  }
204
221
  catch {
@@ -208,7 +225,7 @@ function sigla(fuso, ms) {
208
225
  /** Como o fuso aparece entre parênteses: `horário de Brasília`, `UTC`, `Europe/Lisbon, GMT+1`. */
209
226
  function rotuloDoFuso(fuso = fusoDoDono().fuso, quando) {
210
227
  if (fuso === exports.FUSO_DE_BRASILIA)
211
- return 'horário de Brasília';
228
+ return (0, locale_1.msg)().horario.brasilia;
212
229
  if (fuso === 'UTC')
213
230
  return 'UTC';
214
231
  const ms = instante(quando);
@@ -218,16 +235,22 @@ function rotuloDoFuso(fuso = fusoDoDono().fuso, quando) {
218
235
  /** Legenda de mensagem com vários horários: `Horários de Brasília.` */
219
236
  function legendaDoFuso(fuso = fusoDoDono().fuso, quando) {
220
237
  if (fuso === exports.FUSO_DE_BRASILIA)
221
- return 'Horários de Brasília.';
222
- return `Horários em ${rotuloDoFuso(fuso, quando)}.`;
238
+ return (0, locale_1.msg)().horario.legendaBrasilia;
239
+ return (0, locale_1.msg)().horario.legenda(rotuloDoFuso(fuso, quando));
223
240
  }
224
- /** `19/09 15:16`; `19/09/2025 15:16` quando o ano não é o corrente do dono. Inválido volta como veio. */
241
+ /**
242
+ * `19/09 15:16`; `19/09/2025 15:16` quando o ano não é o corrente do dono. Em `en`, sempre
243
+ * `2026-09-19 15:16` (EN6). Inválido volta como veio.
244
+ */
225
245
  function formatarDataHora(quando, opcoes = {}) {
226
246
  const ms = instante(quando ?? null);
227
247
  if (!Number.isFinite(ms))
228
248
  return quando === null || quando === undefined ? '' : String(quando);
229
249
  const fuso = opcoes.fuso ?? fusoDoDono().fuso;
230
250
  const p = partesLocais(ms, fuso), a = partesLocais(instante(opcoes.agora), fuso);
251
+ if ((opcoes.locale ?? (0, locale_1.localeAtivo)()) === 'en') {
252
+ return `${p.ano}-${p.mes}-${p.dia} ${p.hora}:${p.minuto}` + (opcoes.segundos ? `:${p.segundo}` : '');
253
+ }
231
254
  return `${p.dia}/${p.mes}${p.ano !== a.ano ? `/${p.ano}` : ''} ${p.hora}:${p.minuto}` +
232
255
  (opcoes.segundos ? `:${p.segundo}` : '');
233
256
  }
package/dist/hosts.js CHANGED
@@ -57,10 +57,12 @@ exports.ORDEM_DOS_HOSTS = exports.HOSTS = exports.MAESTRO_HOST_SURFACES = export
57
57
  exports.parseHost = parseHost;
58
58
  exports.lerRecibo = lerRecibo;
59
59
  exports.classificarDivergencia = classificarDivergencia;
60
+ exports.varianteEmIngles = varianteEmIngles;
60
61
  exports.avisoDoOrkNoPath = avisoDoOrkNoPath;
61
62
  exports.renderizarArquivo = renderizarArquivo;
62
63
  exports.instalarAdaptador = instalarAdaptador;
63
64
  exports.desinstalarExperiencia = desinstalarExperiencia;
65
+ exports.destinoPadraoDe = destinoPadraoDe;
64
66
  exports.tabelaDeHosts = tabelaDeHosts;
65
67
  exports.textoDosPitfalls = textoDosPitfalls;
66
68
  exports.textoDaInstalacao = textoDaInstalacao;
@@ -84,102 +86,42 @@ const versao_1 = require("./versao");
84
86
  const manifest_1 = require("./manifest");
85
87
  const experiencia_1 = require("./experiencia");
86
88
  const experiencia_instalacao_1 = require("./experiencia-instalacao");
89
+ const locale_1 = require("./locale");
90
+ const locale_adapter_1 = require("./locale-adapter");
91
+ /** RM-061 (F3b): a descricao e os pitfalls de cada host moram no catalogo (`locale-adapter.ts`), com o pt-BR como fonte. */
92
+ const DO_CATALOGO = locale_adapter_1.ADAPTER_PT_BR.hosts;
87
93
  exports.HOSTS = {
88
94
  'claude-code': {
89
95
  host: 'claude-code',
90
- descricao: 'Plugin com as skills do catalogo, subagentes de fase, entrada /orkastery:ork e hooks do Orkastery',
96
+ descricao: DO_CATALOGO['claude-code'].descricao,
91
97
  destinoPadrao: '.claude',
92
98
  subdir: path.join('plugins', 'orkastery'),
93
99
  levaCatalogo: true,
94
- pitfalls: [
95
- {
96
- titulo: 'manifesto sem os caminhos das skills instala limpo e nao expoe nada',
97
- detalhe: 'o plugin auto-descobre skills/<nome>/SKILL.md e para ai: ele nao desce nos buckets (core/, phases/, reviewers/, ...) que este catalogo usa, entao o plugin.json declara cada caminho de skill, um a um',
98
- prova: 'claude plugin details orkastery # Skills (N) soma as skills do plugin.json e os comandos de commands/',
99
- },
100
- {
101
- titulo: 'duas copias do catalogo divergem',
102
- detalhe: 'a fonte unica e skills/ na raiz do produto; o INSTALADO.json guarda a origem e o sha256 de cada arquivo, e reinstalar CLASSIFICA cada divergencia por ele: o que so mudou no catalogo ressincroniza sozinho, o que voce editou barra e pede decisao por arquivo (--aceitar-catalogo ou --manter-copia). Editar a copia instalada e bandeira vermelha',
103
- prova: 'ork adapter install claude-code --dry-run # mostra o que divergiu do catalogo',
104
- },
105
- {
106
- titulo: 'hook com caminho relativo nao roda, e o guard vira decoracao',
107
- detalhe: 'o hooks.json chama node "${CLAUDE_PLUGIN_ROOT}/hooks/ork-guard.js", nunca um caminho relativo ao diretorio de trabalho, que muda a cada worktree de thread',
108
- prova: 'echo \'{"tool_name":"Bash","tool_input":{"command":"git add -A"}}\' | node <destino>/hooks/ork-guard.js ; echo "codigo: $?" # 2 = guard vivo',
109
- },
110
- ],
100
+ pitfalls: DO_CATALOGO['claude-code'].pitfalls,
111
101
  },
112
102
  codex: {
113
103
  host: 'codex',
114
- descricao: 'Entrada $ork e catalogo de conducao em skills locais do projeto, sem configuracao global',
104
+ descricao: DO_CATALOGO.codex.descricao,
115
105
  destinoPadrao: '.agents',
116
106
  subdir: path.join('skills', 'orkastery'),
117
107
  levaCatalogo: true,
118
- pitfalls: [
119
- {
120
- titulo: 'skills instaladas fora do projeto da sessao',
121
- detalhe: 'Codex descobre .agents/skills a partir do diretorio da sessao ate a raiz do repositorio; outra worktree precisa da sua propria instalacao e comprovacao de descoberta',
122
- prova: 'No Codex aberto no projeto instalado: $ork',
123
- },
124
- {
125
- titulo: 'copia instalada diferente do catalogo',
126
- detalhe: 'o recibo INSTALADO.json registra os arquivos e hashes dentro da pasta propria orkastery; uma edicao divergente barra a reinstalacao sem substituir arquivos de outras skills',
127
- prova: 'ork adapter install codex --dry-run',
128
- },
129
- {
130
- titulo: 'skill confundida com autorizacao de runtime',
131
- detalhe: 'instalar instrucoes nao habilita permissoes, hooks ou sandbox; em projeto configurado, AGENTS.md recebe apenas o bloco reversível da experiência. Gates e preflight continuam no nucleo, e descoberta nao prova a jornada conversacional',
132
- prova: 'ork doctor',
133
- },
134
- ],
108
+ pitfalls: DO_CATALOGO.codex.pitfalls,
135
109
  },
136
110
  hermes: {
137
111
  host: 'hermes',
138
- descricao: 'Skill roteadora fina, plugin que a declara e script de abertura de thread',
112
+ descricao: DO_CATALOGO.hermes.descricao,
139
113
  destinoPadrao: '.hermes',
140
114
  subdir: '',
141
115
  levaCatalogo: false,
142
- pitfalls: [
143
- {
144
- titulo: 'ork fora do PATH do host',
145
- detalhe: 'o host roda com ambiente mais enxuto que o terminal do builder e ~/.local/bin pode nao estar la; o plugin grava o caminho absoluto e o script honra ORK_BIN',
146
- prova: 'ORK_BIN=$(command -v ork) ; "$ORK_BIN" doctor',
147
- },
148
- {
149
- titulo: 'reimplementar o parse da #TAG no host',
150
- detalhe: 'duas implementacoes divergem na primeira tag nova, e a divergencia aparece como thread aberta no modo errado, o que ninguem percebe ate a pausa que nao veio',
151
- prova: 'ork modos --do-pedido "teste #Maestro" # a unica fonte do modo',
152
- },
153
- {
154
- titulo: 'validar allowed_modes no host',
155
- detalhe: 'um host que recusa o modo antes de chamar o ork recusa com a regra que ele tem em cache, nao com a do manifesto do projeto; deixe o ork thread new recusar, com erro tipado',
156
- prova: 'ork thread new "teste" --mode look --dry-run',
157
- },
158
- ],
116
+ pitfalls: DO_CATALOGO.hermes.pitfalls,
159
117
  },
160
118
  openclaw: {
161
119
  host: 'openclaw',
162
- descricao: 'extensao do OpenClaw 2026.7.1 (package.json + dist/index.js) com as tools ork_*, cada uma uma chamada de CLI',
120
+ descricao: DO_CATALOGO.openclaw.descricao,
163
121
  destinoPadrao: '.openclaw',
164
122
  subdir: 'extensions/orkastery',
165
123
  levaCatalogo: false,
166
- pitfalls: [
167
- {
168
- titulo: 'placeholder {{ork_bin}} que fica no arquivo',
169
- detalhe: 'o entry executa o binario como ele esta: um placeholder nao renderizado cai no fallback (ORK_BIN ou o ork do PATH), e sem o fallback vira "comando nao encontrado" em toda tool, que a sessao so descobre depois de ja ter aberto thread na cabeca do agente',
170
- prova: 'grep -c "{{" <destino>/extensions/orkastery/dist/index.js # precisa devolver 0',
171
- },
172
- {
173
- titulo: 'argumento com espaco quebrado em varios argumentos',
174
- detalhe: 'cada tool monta o comando como VETOR de argv, nunca como string de shell, para o pedido do builder chegar inteiro em --prompt; string de shell aqui vira injecao de comando com o texto do builder dentro',
175
- prova: 'ork_phase_run com um prompt de varias linhas, conferido em ork phase list <thread>',
176
- },
177
- {
178
- titulo: 'tool que reimplementa regra do nucleo',
179
- detalhe: 'toda tool deste plugin e uma chamada de CLI e nada mais; tool nova que precisa de logica e sinal de que a logica pertence ao ork, com teste',
180
- prova: 'ork eval # o corpus reprova host com regra de negocio duplicada',
181
- },
182
- ],
124
+ pitfalls: DO_CATALOGO.openclaw.pitfalls,
183
125
  },
184
126
  };
185
127
  exports.ORDEM_DOS_HOSTS = ['claude-code', 'codex', 'hermes', 'openclaw'];
@@ -231,6 +173,25 @@ function classificarDivergencia(shaDoCatalogo, shaDaCopia, shaDoRecibo) {
231
173
  return 'copia-editada';
232
174
  return 'ambos-andaram';
233
175
  }
176
+ /** RM-061 (F3b, D4): as pastas das variantes inglesas, ao lado do catálogo (`core/assets` no repositório, `assets` no pacote). */
177
+ const PASTAS_DAS_VARIANTES = { skills: 'skills-en', references: 'references-en', adapters: 'adapters-en' };
178
+ /**
179
+ * RM-061 (F3b, D4): a variante inglesa de um arquivo `.md` do catálogo (`skills/<bucket>/<nome>/SKILL.md`,
180
+ * `references/<arquivo>.md`, `adapters/<host>/<relativo>.md`), quando existe; sem ela, `null` e o arquivo sai em pt-BR.
181
+ * A variante mora com o catálogo de onde o arquivo sai, nunca no pacote de outro: um catálogo sem `assets` instala em pt-BR.
182
+ * O par `orchestration-experience` e `orchestration-experience-pt-br` já é bilíngue e não tem variante.
183
+ */
184
+ function varianteEmIngles(catalogo, origem) {
185
+ const m = /^(skills|references|adapters)\/(.+\.md)$/.exec(path.relative(catalogo, origem).split(path.sep).join('/'));
186
+ if (!m)
187
+ return null;
188
+ for (const assets of [path.join(catalogo, 'core', 'assets'), path.join(catalogo, 'assets')]) {
189
+ const candidato = path.join(assets, PASTAS_DAS_VARIANTES[m[1]], ...m[2].split('/'));
190
+ if (fs.existsSync(candidato))
191
+ return candidato;
192
+ }
193
+ return null;
194
+ }
234
195
  function sha256(conteudo) {
235
196
  return (0, node_crypto_1.createHash)('sha256').update(conteudo).digest('hex');
236
197
  }
@@ -239,6 +200,9 @@ function listarArquivos(dir, prefixo = '') {
239
200
  for (const entrada of fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
240
201
  const origem = path.join(dir, entrada.name);
241
202
  const relativo = path.posix.join(prefixo, entrada.name);
203
+ // O cache de bytecode que o Python deixa no checkout nao e do catalogo: nao se instala nem entra no recibo.
204
+ if (entrada.name === '__pycache__' || entrada.name.endsWith('.pyc'))
205
+ continue;
242
206
  if (entrada.isDirectory()) {
243
207
  achados.push(...listarArquivos(origem, relativo));
244
208
  }
@@ -264,14 +228,14 @@ function avisoDoOrkNoPath(emExecucao, versao, env = process.env) {
264
228
  const doPath = (0, util_1.noPath)('ork', env);
265
229
  if (!doPath || mesmoArquivo(doPath, emExecucao))
266
230
  return undefined;
267
- let outra = 'versão desconhecida';
231
+ let outra;
268
232
  try {
269
233
  const saida = (0, node_child_process_1.execFileSync)(doPath, ['--version'], { encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'], env });
270
- outra = saida.trim().split('\n')[0]?.trim() || outra;
234
+ outra = saida.trim().split('\n')[0]?.trim() || undefined;
271
235
  }
272
236
  catch { /* o aviso sai mesmo sem a versão */ }
273
- return `o ork do PATH (${doPath}, ${outra}) não é o que roda este install (${emExecucao}, ${versao}). ` +
274
- `A extensão chama ${emExecucao}; para outro binário, passe --ork <caminho>.`;
237
+ // RM-061 (F3b): o aviso nasce pelo catalogo e o texto da instalacao o remonta no locale do comando.
238
+ return (0, locale_1.textoDoCatalogo)((m) => m.adapter.orkNoPath(doPath, outra ?? m.adapter.versaoDesconhecida, emExecucao, versao));
275
239
  }
276
240
  /** Substitui os tres placeholders. Nao ha template engine aqui de proposito. */
277
241
  function renderizarArquivo(conteudo, valores) {
@@ -300,7 +264,7 @@ function instalarAdaptador(host, opcoes = {}) {
300
264
  ? avisoDoOrkNoPath(opcoes.orkEmExecucao, versao) : undefined;
301
265
  const dirDoHost = path.join(catalogo, 'adapters', host);
302
266
  if (!fs.existsSync(dirDoHost)) {
303
- throw new Error(`adaptador do host ${host} nao existe em ${dirDoHost}`);
267
+ throw new locale_1.ErroDoCatalogo((m) => m.adapter.adaptadorNaoExiste(host, dirDoHost));
304
268
  }
305
269
  const fontes = listarArquivos(dirDoHost).map(fonte => host === 'hermes' && fonte.relativo.startsWith('hitl-ingress/')
306
270
  ? { ...fonte, relativo: fonte.relativo.replace(/^hitl-ingress\//, 'plugins/orkastery-hitl/') } : fonte);
@@ -320,19 +284,28 @@ function instalarAdaptador(host, opcoes = {}) {
320
284
  fontes.push({ origem: skill.caminho, relativo: path.posix.join('skills', skill.nome, 'SKILL.md') });
321
285
  }
322
286
  }
287
+ // RM-061 (F3b, D4): com o dono em inglês, o arquivo com variante sai dela, no mesmo destino; o recibo guarda a origem
288
+ // real, e reinstalar na outra língua troca no lugar a cópia intacta (`catalogo-andou`).
289
+ if (opcoes.locale === 'en') {
290
+ for (const fonte of fontes)
291
+ fonte.origem = varianteEmIngles(catalogo, fonte.origem) ?? fonte.origem;
292
+ }
323
293
  // A experiência é opcional: manifesto com erro, bloco alheio ou caminho inadequado pulam só a
324
- // ativação, com aviso, e o adaptador segue instalado como antes da RM-051.
325
- const segue = 'O restante da instalação do adaptador segue normalmente.';
294
+ // ativação, com aviso, e o adaptador segue instalado como antes da RM-051. RM-061 (F3b): o aviso nasce
295
+ // pelo catalogo e o texto da instalacao o remonta.
296
+ const pulado = (montar) => (0, locale_1.textoDoCatalogo)((m) => montar(m.adapter, m.adapter.segue));
326
297
  const carregado = (0, manifest_1.carregarManifesto)(projeto);
327
298
  let avisoExperiencia;
328
299
  if (carregado?.raiz === projeto && carregado.erros.length) {
329
- avisoExperiencia = `Pacote de experiência pulado: o manifesto tem erros (${carregado.erros[0]}). ${segue}`;
300
+ const erro = carregado.erros[0];
301
+ avisoExperiencia = pulado((a, segue) => a.puladoManifesto(erro, segue));
330
302
  }
331
303
  // Preferência inválida (ex.: experience: "false") não ativa nem remove nada: quem escreveu pode ter
332
304
  // tentado desligar o pacote. Corrigir com ork onboarding set maestro volta a instalar.
333
305
  const invalida = carregado?.raiz === projeto ? carregado.avisos.find(a => a.startsWith('experiencia.config.invalid')) : undefined;
334
- if (!avisoExperiencia && invalida)
335
- avisoExperiencia = `Pacote de experiência pulado: ${invalida}. ${segue}`;
306
+ if (!avisoExperiencia && invalida) {
307
+ avisoExperiencia = (0, locale_1.textoDoCatalogo)((m) => m.adapter.puladoInvalida(m.onboarding.avisoDaPreferencia(invalida), m.adapter.segue));
308
+ }
336
309
  const preferencias = carregado?.raiz === projeto && !avisoExperiencia ? (0, experiencia_1.resolverExperiencia)(carregado.manifesto.owner) : null;
337
310
  const hostComBloco = host === 'codex' || host === 'claude-code';
338
311
  // O bloco aponta o diretório relativo ao projeto: CLAUDE.md e AGENTS.md costumam ir ao repositório.
@@ -341,26 +314,27 @@ function instalarAdaptador(host, opcoes = {}) {
341
314
  if (preferencias?.experience && host !== 'openclaw') {
342
315
  const skillRelativa = host === 'hermes' ? `skills/${preferencias.skill}/SKILL.md`
343
316
  : `skills/core/${preferencias.skill}/SKILL.md`;
317
+ const skill = preferencias.skill;
344
318
  if (!fontes.some(f => f.relativo === skillRelativa)) {
345
- avisoExperiencia = `Pacote de experiência pulado: a skill ${preferencias.skill} não está no catálogo. ${segue}`;
319
+ avisoExperiencia = pulado((a, segue) => a.puladoSemSkill(skill, segue));
346
320
  }
347
321
  else if (hostComBloco && (diretorioExperiencia.startsWith('../') || path.isAbsolute(diretorioExperiencia))) {
348
- avisoExperiencia = `Pacote de experiência pulado: o adaptador fica fora do projeto e o bloco de instruções só aponta caminhos do projeto. ${segue}`;
322
+ avisoExperiencia = pulado((a, segue) => a.puladoForaDoProjeto(segue));
349
323
  }
350
324
  else if (hostComBloco && /[\r\n`]/.test(diretorioExperiencia)) {
351
- avisoExperiencia = `Pacote de experiência pulado: o caminho das skills contém quebra de linha ou crase, incompatível com o bloco de instruções. ${segue}`;
325
+ avisoExperiencia = pulado((a, segue) => a.puladoCaminho(segue));
352
326
  }
353
327
  }
354
328
  let planoExperiencia = null;
355
329
  if (preferencias && hostComBloco && !avisoExperiencia) {
356
330
  try {
357
- planoExperiencia = (0, experiencia_instalacao_1.planejarExperiencia)(projeto, host, preferencias.experience ? diretorioExperiencia : null);
331
+ planoExperiencia = (0, experiencia_instalacao_1.planejarExperiencia)(projeto, host, preferencias.experience ? diretorioExperiencia : null, opcoes.locale);
358
332
  }
359
333
  catch (e) {
360
334
  const motivo = e.message;
361
335
  if (!/^experiencia\.(bloco\.conflict|path\.unsafe)/.test(motivo))
362
336
  throw e;
363
- avisoExperiencia = `Pacote de experiência pulado: ${motivo.startsWith('experiencia.path') ? 'o arquivo de instruções é link ou não é arquivo comum' : `o bloco de instruções ou o recibo .orkastery/experiencia/${host}.json foi editado ou está duplicado`}; nada foi escrito. Revise os dois à mão. ${segue}`;
337
+ avisoExperiencia = pulado((a, segue) => a.puladoBloco(motivo.startsWith('experiencia.path'), host, segue));
364
338
  }
365
339
  }
366
340
  // O preflight cobre o destino e os arquivos do próprio adaptador antes de copiar o primeiro. Links
@@ -369,7 +343,7 @@ function instalarAdaptador(host, opcoes = {}) {
369
343
  for (let atual = alvo; atual !== path.dirname(destino) && atual !== path.dirname(atual); atual = path.dirname(atual)) {
370
344
  const stat = fs.lstatSync(atual, { throwIfNoEntry: false });
371
345
  if (stat && (stat.isSymbolicLink() || (atual === alvo ? !stat.isFile() || stat.nlink !== 1 : !stat.isDirectory()))) {
372
- throw Error('experiencia.path.unsafe: destino do adaptador');
346
+ throw new locale_1.ErroDoCatalogo((m) => m.adapter.destinoInseguro);
373
347
  }
374
348
  }
375
349
  }
@@ -421,6 +395,7 @@ function instalarAdaptador(host, opcoes = {}) {
421
395
  estado,
422
396
  });
423
397
  }
398
+ const removidos = sobrasDeMods(destino, recibo, arquivos);
424
399
  const conflitos = arquivos.filter((a) => a.estado === 'sobrescrito');
425
400
  /**
426
401
  * I-43 (D5): a divergencia continua sendo DETECTADA; ela deixa de BARRAR quando e
@@ -458,6 +433,7 @@ function instalarAdaptador(host, opcoes = {}) {
458
433
  ...(preferencias || avisoExperiencia ? { experiencia: { ativa: host !== 'openclaw' && !!preferencias?.experience && !avisoExperiencia,
459
434
  arquivos: planoExperiencia?.mudancas.map(m => path.relative(planoExperiencia.projeto, m.arquivo)) ?? [], skill: preferencias?.skill ?? '',
460
435
  ...(avisoExperiencia ? { aviso: avisoExperiencia } : {}) } } : {}),
436
+ ...(removidos.length ? { removidos } : {}),
461
437
  };
462
438
  if (opcoes.dryRun === true || barrado)
463
439
  return resultado;
@@ -477,6 +453,17 @@ function instalarAdaptador(host, opcoes = {}) {
477
453
  if (arquivo.executavel)
478
454
  fs.chmodSync(arquivo.destino, 0o755);
479
455
  }
456
+ // RM-059 (T0.7, A1 do CHECK): o que saiu do catalogo em `mods/` sai da copia, com a pasta que ficar vazia.
457
+ for (const relativo of removidos) {
458
+ const alvo = path.join(destino, relativo);
459
+ fs.unlinkSync(alvo);
460
+ const raizDoMod = path.join(destino, ...relativo.split('/').slice(0, 2));
461
+ for (let dir = path.dirname(alvo); dir.startsWith(raizDoMod); dir = path.dirname(dir)) {
462
+ if (fs.readdirSync(dir).length)
463
+ break;
464
+ fs.rmdirSync(dir);
465
+ }
466
+ }
480
467
  // O recibo: com ele da para saber, depois, se alguem editou a copia instalada em vez do
481
468
  // catalogo. Sem ele a instalacao e um monte de arquivo sem procedencia.
482
469
  fs.writeFileSync(path.join(destino, 'INSTALADO.json'), JSON.stringify({
@@ -497,6 +484,41 @@ function instalarAdaptador(host, opcoes = {}) {
497
484
  (0, experiencia_instalacao_1.aplicarExperiencia)(planoExperiencia);
498
485
  return resultado;
499
486
  }
487
+ /**
488
+ * RM-059 (T0.7, A1 do CHECK): os arquivos de `mods/` do recibo anterior que nao estao mais no catalogo e que a
489
+ * copia guarda como foram instalados (sha256 do recibo), os de cada mod e os comuns da raiz de `mods/` (N2 da
490
+ * rodada 2). Arquivo editado, link ou caminho fora do destino fica: o despacho continua recusando com o motivo,
491
+ * e a decisao e de quem editou.
492
+ */
493
+ function sobrasDeMods(destino, recibo, arquivos) {
494
+ if (!recibo)
495
+ return [];
496
+ const novos = new Set(arquivos.map((a) => a.relativo));
497
+ let base;
498
+ try {
499
+ base = fs.realpathSync(destino);
500
+ }
501
+ catch {
502
+ return [];
503
+ }
504
+ return recibo.arquivos.flatMap((a) => {
505
+ const rel = typeof a.arquivo === 'string' ? a.arquivo : '';
506
+ if (!/^mods\/[^/]+(?:$|\/.)/.test(rel) || novos.has(rel) || path.isAbsolute(rel) || rel.split('/').includes('..'))
507
+ return [];
508
+ const alvo = path.join(destino, rel);
509
+ const st = fs.lstatSync(alvo, { throwIfNoEntry: false });
510
+ if (!st || !st.isFile() || st.nlink !== 1)
511
+ return [];
512
+ try {
513
+ if (!fs.realpathSync(path.dirname(alvo)).startsWith(base + path.sep))
514
+ return [];
515
+ }
516
+ catch {
517
+ return [];
518
+ }
519
+ return sha256(fs.readFileSync(alvo)) === a.sha256 ? [rel] : [];
520
+ });
521
+ }
500
522
  /** Caminho real do maior ancestral existente, com o resto como está: o destino pode não existir ainda. */
501
523
  function caminhoReal(alvo) {
502
524
  let existente = path.resolve(alvo);
@@ -511,102 +533,101 @@ function desinstalarExperiencia(projeto, host, dryRun = false) {
511
533
  (0, experiencia_instalacao_1.aplicarExperiencia)(plano);
512
534
  return { host, dryRun, arquivos: plano.mudancas.map(m => path.relative(plano.projeto, m.arquivo)) };
513
535
  }
514
- /** Texto de `ork adapter list`. */
536
+ /** O destino padrao de um host, relativo a raiz do projeto (`.claude/plugins/orkastery`). */
537
+ function destinoPadraoDe(host) {
538
+ const def = exports.HOSTS[host];
539
+ return `${def.destinoPadrao}${def.subdir ? '/' + def.subdir : ''}`;
540
+ }
541
+ /** Texto de `ork adapter list`, no locale ativo; a descricao de cada host vem do catalogo. */
515
542
  function tabelaDeHosts() {
516
- const linhas = ['Adaptadores de host (Camada 1, o podio)', ''];
543
+ const m = (0, locale_1.msg)().adapter;
544
+ const linhas = [m.titulo, ''];
517
545
  for (const host of exports.ORDEM_DOS_HOSTS) {
518
- const def = exports.HOSTS[host];
519
- linhas.push(` ${host.padEnd(13)} ${def.descricao}`);
520
- linhas.push(` ${' '.repeat(13)} destino padrao: <projeto>/${def.destinoPadrao}${def.subdir ? '/' + def.subdir : ''}`);
521
- linhas.push(` ${' '.repeat(13)} catalogo de skills junto: ${def.levaCatalogo ? 'sim' : 'nao'}`);
546
+ linhas.push(` ${host.padEnd(13)} ${m.hosts[host].descricao}`);
547
+ linhas.push(` ${' '.repeat(13)} ${m.destinoPadrao(destinoPadraoDe(host))}`);
548
+ linhas.push(` ${' '.repeat(13)} ${m.catalogoJunto(exports.HOSTS[host].levaCatalogo)}`);
522
549
  }
523
550
  linhas.push('');
524
- linhas.push('Instale com: ork adapter install <host> [--dir DIR] [--dry-run] [--force]');
525
- linhas.push('Zero regra de negocio no host: a #TAG vira `--mode` e a validacao e do nucleo.');
551
+ linhas.push(m.instaleCom);
552
+ linhas.push(m.zeroRegra);
526
553
  return linhas.join('\n');
527
554
  }
528
- /** Texto dos pitfalls de um host, impresso no fim de toda instalacao. */
555
+ /** Texto dos pitfalls de um host, impresso no fim de toda instalacao, no locale ativo. */
529
556
  function textoDosPitfalls(host) {
530
- const def = exports.HOSTS[host];
531
- const linhas = [`Os 3 pitfalls de instalacao do ${host} (confira, nao suponha):`, ''];
532
- def.pitfalls.forEach((p, i) => {
557
+ const m = (0, locale_1.msg)().adapter;
558
+ const linhas = [m.tituloDosPitfalls(host), ''];
559
+ m.hosts[host].pitfalls.forEach((p, i) => {
533
560
  linhas.push(` ${i + 1}. ${p.titulo}`);
534
561
  linhas.push(` ${p.detalhe}`);
535
- linhas.push(` prova: ${p.prova}`);
562
+ linhas.push(` ${m.prova(p.prova)}`);
536
563
  linhas.push('');
537
564
  });
538
565
  return linhas.join('\n').replace(/\n$/, '');
539
566
  }
540
- /** Texto de `ork adapter install`. */
567
+ /** Texto de `ork adapter install`, no locale ativo; os avisos que a instalacao montou sao remontados. */
541
568
  function textoDaInstalacao(r) {
569
+ const m = (0, locale_1.msg)().adapter;
542
570
  const linhas = [];
543
571
  // Ensaio da 0.5.0: com o pacote ativo e pulado por aviso (catalogo fora do projeto), a linha dizia
544
572
  // "desativada"; o aviso logo abaixo diz o motivo.
545
- if (r.experiencia)
546
- linhas.push(`Experiência: ${r.experiencia.ativa ? 'ativação preparada'
547
- : r.experiencia.aviso ? 'pacote pulado nesta instalação, veja o aviso abaixo' : 'desativada ou sem integração de skills'}` +
548
- `${r.experiencia.skill ? ` (${r.experiencia.skill})` : ''}.`);
573
+ if (r.experiencia) {
574
+ linhas.push(m.experiencia(r.experiencia.ativa ? 'ativa' : r.experiencia.aviso ? 'pulada' : 'desativada', r.experiencia.skill));
575
+ }
549
576
  if (r.experiencia?.aviso)
550
- linhas.push(`Aviso: ${r.experiencia.aviso}`);
551
- linhas.push(r.dryRun
552
- ? `Simulacao (--dry-run) da instalacao do adaptador ${r.host}: nada foi escrito.`
553
- : r.ok
554
- ? `Arquivos do adaptador ${r.host} preparados.`
555
- : `Instalacao do adaptador ${r.host} BARRADA: ha arquivo diferente no destino.`);
577
+ linhas.push(m.aviso((0, locale_1.remontar)(r.experiencia.aviso)));
578
+ linhas.push(r.dryRun ? m.simulacao(r.host) : r.ok ? m.preparados(r.host) : m.barrada(r.host));
556
579
  // Ensaio de 03/10 (R6): a ativacao sai no comeco e de novo no fim, depois da lista de arquivos e dos
557
580
  // pitfalls, para que o fim da saida diga o proximo passo.
558
581
  const ativacao = [];
559
582
  if (r.ok && !r.dryRun && r.host === 'claude-code') {
560
583
  const destino = "'" + r.destino.replace(/'/g, "'\"'\"'") + "'";
561
- linhas.push('Uso no Claude Code ainda nao verificado por esta copia.');
562
- linhas.push('No diretorio deste projeto, valide e ative o plugin:');
584
+ linhas.push(m.claudeNaoVerificado);
585
+ linhas.push(m.claudeValide);
563
586
  ativacao.push(` claude plugin validate ${destino}`);
564
587
  ativacao.push(` claude plugin marketplace add ${destino} --scope project`);
565
588
  ativacao.push(' claude plugin install orkastery@orkastery --scope project');
566
589
  ativacao.push(' claude plugin list --json');
567
- ativacao.push('Depois, na sessao deste projeto: /orkastery:ork');
590
+ ativacao.push(m.claudeDepois);
568
591
  }
569
592
  else if (r.ok && !r.dryRun && r.host === 'codex') {
570
- ativacao.push('Abra o Codex neste projeto e use $ork.');
571
- ativacao.push('Descoberta e uso nativo ainda nao verificados por esta copia.');
593
+ ativacao.push(m.codexAbra);
594
+ ativacao.push(m.codexNaoVerificado);
572
595
  }
573
596
  if (r.ok && !r.dryRun && (r.host === 'codex' || r.host === 'claude-code')) {
574
597
  const projeto = "'" + r.projeto.replace(/'/g, "'\"'\"'") + "'";
575
- ativacao.push(`Prepare tambem as ferramentas do projeto: ork mcp install --project ${projeto} --host ${r.host}`);
598
+ ativacao.push(m.prepareMcp(projeto, r.host));
576
599
  }
577
600
  linhas.push(...ativacao);
578
601
  if (ativacao.length)
579
- linhas.push('A configuracao MCP exige descoberta e consentimento no cliente; a copia nao concede aprovacoes.');
580
- linhas.push(` catalogo: ${r.catalogo}`);
581
- linhas.push(` destino: ${r.destino}`);
582
- linhas.push(` ork: ${r.orkBin}`);
602
+ linhas.push(m.consentimento);
603
+ linhas.push(m.catalogo(r.catalogo));
604
+ linhas.push(m.destino(r.destino));
605
+ linhas.push(m.ork(r.orkBin));
583
606
  if (r.avisoOrk)
584
- linhas.push(` Aviso: ${r.avisoOrk}`);
607
+ linhas.push(m.avisoOrk((0, locale_1.remontar)(r.avisoOrk)));
585
608
  linhas.push('');
586
609
  const novos = r.arquivos.filter((a) => a.estado === 'novo').length;
587
610
  const iguais = r.arquivos.filter((a) => a.estado === 'igual').length;
588
611
  const catalogoAndou = r.conflitos.filter((a) => a.divergencia === 'catalogo-andou').length;
589
- linhas.push(` arquivos: ${r.arquivos.length} (${novos} novo(s), ${iguais} ja identico(s), ${r.conflitos.length} divergente(s))`);
612
+ linhas.push(m.arquivos(r.arquivos.length, novos, iguais, r.conflitos.length));
590
613
  for (const a of r.arquivos) {
591
614
  const marca = a.estado === 'novo' ? '+' : a.estado === 'igual' ? '=' : '!';
592
615
  const porque = a.divergencia ? ` (${a.divergencia})` : '';
593
616
  linhas.push(` ${marca} ${a.relativo}${porque}`);
594
617
  }
618
+ // RM-059 (T0.7): arquivo de mod que saiu do catalogo sai da copia, para o despacho nao recusar o mod.
619
+ for (const rel of r.removidos ?? [])
620
+ linhas.push(m.removido(rel, r.dryRun));
595
621
  // I-43 (D5): o `--dir` na raiz avisa, em vez de reportar "tudo novo" com saida 0.
596
622
  if (r.reciboVizinho) {
597
623
  linhas.push('');
598
- linhas.push(` ATENCAO: nao ha recibo em ${r.destino}, mas ha um em`);
599
- linhas.push(` ${r.reciboVizinho}`);
600
- linhas.push(' `--dir` e o destino COMPLETO, nao a raiz do projeto. Do jeito que esta, esta');
601
- linhas.push(' instalacao criaria uma copia nova ao lado da que ja existe, e a que existe');
602
- linhas.push(' ficaria sem conferencia nenhuma.');
624
+ linhas.push(...m.reciboVizinho(r.destino, r.reciboVizinho));
603
625
  }
604
626
  // I-43 (D5): o que o recibo garante seguro se resolve sozinho, e sai como uma linha
605
627
  // de resumo em vez de virar decisao do operador.
606
628
  if (catalogoAndou > 0) {
607
629
  linhas.push('');
608
- linhas.push(` ${catalogoAndou} divergente(s) sao "catalogo-andou": a copia esta como foi instalada`);
609
- linhas.push(' e quem mudou foi o catalogo. Sobrescrever nao perde trabalho de ninguem.');
630
+ linhas.push(...m.catalogoAndou(catalogoAndou));
610
631
  }
611
632
  if (!r.ok) {
612
633
  // A pergunta de UMA linha, com o arquivo NOMEADO e as duas saidas reais. O `--dir`
@@ -616,13 +637,13 @@ function textoDaInstalacao(r) {
616
637
  ? r.destino.slice(r.projeto.length + 1)
617
638
  : r.destino;
618
639
  linhas.push('');
619
- linhas.push(` ${r.precisamDeDecisao.length} arquivo(s) precisam de uma decisao sua:`);
640
+ linhas.push(m.precisamDeDecisao(r.precisamDeDecisao.length));
620
641
  for (const a of r.precisamDeDecisao) {
621
642
  linhas.push(` ${a.relativo} (${a.divergencia})`);
622
643
  linhas.push(` $ diff -u ${a.origem} ${a.destino}`);
623
644
  }
624
645
  linhas.push('');
625
- linhas.push(' Resolva em UM comando, por arquivo:');
646
+ linhas.push(m.resolva);
626
647
  const exemplo = r.precisamDeDecisao[0]?.relativo ?? '<arquivo>';
627
648
  linhas.push(` ork adapter install ${r.host} --dir ${dirEmUso} --aceitar-catalogo ${exemplo}`);
628
649
  linhas.push(` ork adapter install ${r.host} --dir ${dirEmUso} --manter-copia ${exemplo}`);
@@ -631,7 +652,7 @@ function textoDaInstalacao(r) {
631
652
  linhas.push(textoDosPitfalls(r.host));
632
653
  if (ativacao.length) {
633
654
  linhas.push('');
634
- linhas.push(r.host === 'claude-code' ? 'Proximo passo, no diretorio deste projeto (o mesmo do comeco):' : 'Proximo passo (o mesmo do comeco):');
655
+ linhas.push(r.host === 'claude-code' ? m.proximoPassoClaude : m.proximoPasso);
635
656
  linhas.push(...ativacao);
636
657
  }
637
658
  return linhas.join('\n');