@orkastery/cli 0.5.6 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +123 -9
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/adapters/grok-events.js +227 -0
  105. package/dist/adapters/grok-mcp-servidor.js +612 -0
  106. package/dist/adapters/grok-mcp.js +178 -0
  107. package/dist/adapters/grok.js +686 -0
  108. package/dist/agendador-cpu.js +92 -0
  109. package/dist/atualizar-branch.js +245 -0
  110. package/dist/auditoria.js +13 -11
  111. package/dist/auditrun.js +51 -46
  112. package/dist/autorizacao-duravel.js +327 -0
  113. package/dist/board.js +94 -40
  114. package/dist/branch-de-estado.js +23 -10
  115. package/dist/busca-semantica.js +7 -5
  116. package/dist/catalogo.js +2 -1
  117. package/dist/changelog-reconciliacao.js +290 -0
  118. package/dist/check-agil.js +528 -0
  119. package/dist/check-modo.js +41 -0
  120. package/dist/check-paralelo.js +238 -0
  121. package/dist/ci.js +248 -45
  122. package/dist/ciclos.js +8 -6
  123. package/dist/claim-lint.js +12 -8
  124. package/dist/claims-conferir.js +47 -39
  125. package/dist/claims.js +10 -9
  126. package/dist/company-brain-client.js +10 -3
  127. package/dist/company-brain-migration.js +11 -5
  128. package/dist/conducao-batida.js +759 -0
  129. package/dist/conducao-sentinela.js +25 -8
  130. package/dist/conducao.js +89 -29
  131. package/dist/conhecimento-consulta.js +270 -0
  132. package/dist/conhecimento.js +111 -87
  133. package/dist/conta-esgotada.js +127 -0
  134. package/dist/dado-privado.js +816 -0
  135. package/dist/decisao-autonoma.js +5 -4
  136. package/dist/demo.js +14 -12
  137. package/dist/dependencias-da-worktree.js +25 -0
  138. package/dist/divida.js +38 -36
  139. package/dist/docs.js +89 -89
  140. package/dist/doctor-forja.js +343 -0
  141. package/dist/doctor-pulse-cron.js +113 -1
  142. package/dist/doctor.js +164 -6
  143. package/dist/dsn-da-memoria.js +417 -0
  144. package/dist/entrega-por-mod.js +503 -0
  145. package/dist/entrega-pr.js +154 -54
  146. package/dist/esgotamentos.js +13 -11
  147. package/dist/estado-thread.js +21 -18
  148. package/dist/evalrunner.js +35 -32
  149. package/dist/fabrica-batida.js +34 -21
  150. package/dist/fabrica-estado.js +33 -21
  151. package/dist/fix.js +21 -19
  152. package/dist/forja/adaptador.js +6 -0
  153. package/dist/forja/ambiente-de-ci.js +27 -0
  154. package/dist/forja/api.js +256 -0
  155. package/dist/forja/cache.js +89 -0
  156. package/dist/forja/cli.js +60 -0
  157. package/dist/forja/contrato.js +9 -0
  158. package/dist/forja/endereco.js +43 -0
  159. package/dist/forja/estado.js +22 -0
  160. package/dist/forja/executor.js +73 -0
  161. package/dist/forja/github/ci.js +95 -0
  162. package/dist/forja/github/dono-da-rede.js +18 -0
  163. package/dist/forja/github/metadados.js +15 -0
  164. package/dist/forja/github/pedidos.js +200 -0
  165. package/dist/forja/gitlab/ci.js +141 -0
  166. package/dist/forja/gitlab/consultas.js +59 -0
  167. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  168. package/dist/forja/gitlab/metadados.js +15 -0
  169. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  170. package/dist/forja/gitlab/pedidos.js +141 -0
  171. package/dist/forja/produtor.js +32 -0
  172. package/dist/forja/registro.js +31 -0
  173. package/dist/forja/resolver.js +121 -0
  174. package/dist/forja/texto.js +13 -0
  175. package/dist/forja/versao.js +71 -0
  176. package/dist/forja.js +123 -80
  177. package/dist/handoff.js +23 -13
  178. package/dist/hitl-contract.js +46 -43
  179. package/dist/hitl-curto.js +37 -25
  180. package/dist/hitl-gates.js +13 -11
  181. package/dist/hitl-local-receipt.js +51 -0
  182. package/dist/hitl-local.js +11 -2
  183. package/dist/hitl-lock.js +5 -11
  184. package/dist/hitl-public-receipt.js +11 -0
  185. package/dist/hitl-resumo.js +44 -1
  186. package/dist/hitl-sessions.js +62 -9
  187. package/dist/hitl-texto-livre.js +7 -4
  188. package/dist/hitl.js +34 -31
  189. package/dist/horario.js +20 -1
  190. package/dist/hosts.js +104 -134
  191. package/dist/index.js +864 -554
  192. package/dist/indice-vetorial.js +14 -12
  193. package/dist/init.js +11 -2
  194. package/dist/integracoes-locais.js +4 -0
  195. package/dist/intelligence-graph-cli.js +123 -69
  196. package/dist/intelligence-graph-query.js +37 -22
  197. package/dist/leases.js +19 -18
  198. package/dist/ledger-stats.js +17 -16
  199. package/dist/ledger.js +31 -1
  200. package/dist/licoes.js +12 -11
  201. package/dist/locale-accounts.js +228 -0
  202. package/dist/locale-adapter.js +291 -0
  203. package/dist/locale-ajuda.js +86 -10
  204. package/dist/locale-audit.js +199 -0
  205. package/dist/locale-claims.js +213 -0
  206. package/dist/locale-conducao.js +138 -0
  207. package/dist/locale-conhecimento.js +181 -0
  208. package/dist/locale-decisao.js +205 -0
  209. package/dist/locale-docs.js +230 -0
  210. package/dist/locale-estado.js +101 -0
  211. package/dist/locale-forja.js +288 -0
  212. package/dist/locale-gerados.js +5 -0
  213. package/dist/locale-grafo.js +129 -0
  214. package/dist/locale-master.js +83 -0
  215. package/dist/locale-network.js +524 -0
  216. package/dist/locale-operacao-restante.js +931 -0
  217. package/dist/locale-projetos.js +100 -0
  218. package/dist/locale-prompts.js +194 -0
  219. package/dist/locale-pulse.js +140 -2
  220. package/dist/locale-reservas.js +87 -0
  221. package/dist/locale-retry.js +183 -6
  222. package/dist/locale-security-scan.js +69 -0
  223. package/dist/locale-setup.js +192 -0
  224. package/dist/locale-ship.js +177 -66
  225. package/dist/locale-thread.js +149 -5
  226. package/dist/locale-verify.js +80 -4
  227. package/dist/locale-worktree.js +246 -0
  228. package/dist/locale.js +553 -9
  229. package/dist/maestro-runtime.js +22 -3
  230. package/dist/manifest.js +293 -12
  231. package/dist/maquina-ociosa.js +211 -0
  232. package/dist/maquina.js +10 -5
  233. package/dist/master-nota-local.js +200 -0
  234. package/dist/master-nota.js +10 -2
  235. package/dist/master.js +118 -41
  236. package/dist/mcp-conhecimento.js +52 -0
  237. package/dist/mcp-experiencia.js +26 -5
  238. package/dist/mcp-install.js +90 -15
  239. package/dist/mcp-noctum.js +101 -0
  240. package/dist/mcp-server.js +116 -22
  241. package/dist/mcp-ship-transporte.js +977 -0
  242. package/dist/mcp-ship.js +68 -24
  243. package/dist/mcp-transportes.js +17 -0
  244. package/dist/memoria.js +63 -58
  245. package/dist/merge-da-entrega.js +85 -0
  246. package/dist/modos-migracao.js +8 -6
  247. package/dist/modos.js +17 -18
  248. package/dist/network-roadmap.js +94 -54
  249. package/dist/noctum-aceite.js +929 -0
  250. package/dist/noctum-arco.js +540 -33
  251. package/dist/noctum-capacidade.js +3 -3
  252. package/dist/noctum-changelog.js +399 -0
  253. package/dist/noctum-cli.js +539 -0
  254. package/dist/noctum-coordenacao.js +1225 -0
  255. package/dist/noctum-entrega.js +1217 -0
  256. package/dist/noctum-envelope.js +253 -17
  257. package/dist/noctum-execucao.js +100 -24
  258. package/dist/noctum-fechamento.js +416 -0
  259. package/dist/noctum-fila.js +49 -10
  260. package/dist/noctum-guarda.js +333 -0
  261. package/dist/noctum-integracao.js +507 -0
  262. package/dist/noctum-maquinas.js +387 -0
  263. package/dist/noctum-medicao.js +450 -0
  264. package/dist/noctum-modo.js +390 -0
  265. package/dist/noctum-pergunta-canal.js +96 -0
  266. package/dist/noctum-pergunta.js +115 -0
  267. package/dist/noctum-provas.js +838 -0
  268. package/dist/noctum-reconciliacao.js +594 -0
  269. package/dist/noctum-rede.js +102 -0
  270. package/dist/noctum-registro.js +215 -0
  271. package/dist/noctum-relatorio.js +861 -0
  272. package/dist/noctum-resposta.js +207 -0
  273. package/dist/noctum-retomada-rede.js +71 -0
  274. package/dist/noctum-sessoes-em-voo.js +93 -0
  275. package/dist/noctum-supervisao.js +649 -0
  276. package/dist/noctum-terminal.js +459 -0
  277. package/dist/noctum-transporte.js +655 -0
  278. package/dist/noctum-vigia.js +679 -0
  279. package/dist/ocupacao.js +3 -1
  280. package/dist/onboarding.js +16 -5
  281. package/dist/orkmind.js +39 -23
  282. package/dist/orquestracao.js +31 -35
  283. package/dist/parado-no-condutor.js +160 -139
  284. package/dist/phase.js +96 -42
  285. package/dist/policies.js +33 -0
  286. package/dist/postura-local.js +11 -6
  287. package/dist/preflight.js +2 -1
  288. package/dist/procedencia.js +9 -14
  289. package/dist/projeto-alvo.js +59 -20
  290. package/dist/prompts.js +136 -42
  291. package/dist/prova-minima.js +5 -6
  292. package/dist/pulse-cadencia.js +5 -4
  293. package/dist/pulse-consentimento.js +53 -1
  294. package/dist/pulse-delivery.js +143 -27
  295. package/dist/pulse-resposta.js +368 -4
  296. package/dist/pulse.js +136 -3
  297. package/dist/ratelimit.js +13 -4
  298. package/dist/recall.js +14 -13
  299. package/dist/rede-adesao.js +13 -8
  300. package/dist/rede-forja.js +108 -24
  301. package/dist/rede-status.js +63 -45
  302. package/dist/rede.js +86 -46
  303. package/dist/retomada-checkpoint.js +101 -0
  304. package/dist/retry.js +326 -78
  305. package/dist/roadmap-reservas.js +32 -32
  306. package/dist/runtime-ambiente.js +5 -0
  307. package/dist/runtime-context.js +279 -85
  308. package/dist/runtime-escada.js +429 -0
  309. package/dist/runtime-profiles.js +130 -63
  310. package/dist/runtimes.js +42 -5
  311. package/dist/saida-segura.js +3 -2
  312. package/dist/security-scan/agil.js +366 -0
  313. package/dist/security-scan/cli.js +76 -0
  314. package/dist/security-scan/compare.js +149 -0
  315. package/dist/security-scan/config.js +93 -0
  316. package/dist/security-scan/detect.js +97 -0
  317. package/dist/security-scan/executor.js +196 -0
  318. package/dist/security-scan/guard.js +180 -0
  319. package/dist/security-scan/imagem-de-lint.js +96 -0
  320. package/dist/security-scan/normalize/actionlint.js +12 -0
  321. package/dist/security-scan/normalize/eslint.js +12 -0
  322. package/dist/security-scan/normalize/gitleaks.js +13 -0
  323. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  324. package/dist/security-scan/normalize/govulncheck.js +36 -0
  325. package/dist/security-scan/normalize/index.js +25 -0
  326. package/dist/security-scan/normalize/npm-audit.js +30 -0
  327. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  328. package/dist/security-scan/normalize/oxlint.js +51 -0
  329. package/dist/security-scan/normalize/pip-audit.js +16 -0
  330. package/dist/security-scan/normalize/ruff.js +12 -0
  331. package/dist/security-scan/normalize/semgrep.js +20 -0
  332. package/dist/security-scan/normalize/trivy.js +33 -0
  333. package/dist/security-scan/normalize/util.js +204 -0
  334. package/dist/security-scan/normalize/zizmor.js +19 -0
  335. package/dist/security-scan/report.js +156 -0
  336. package/dist/security-scan/run.js +448 -0
  337. package/dist/security-scan/tools.js +62 -0
  338. package/dist/security-scan/trabalhador.js +74 -0
  339. package/dist/security-scan/types.js +15 -0
  340. package/dist/session-events.js +19 -2
  341. package/dist/session-watcher-claude.js +74 -19
  342. package/dist/session-watcher-grok.js +425 -0
  343. package/dist/session-watcher.js +174 -13
  344. package/dist/sessoes-contas.js +42 -5
  345. package/dist/sessoes-inventario.js +1 -1
  346. package/dist/sessoes.js +25 -23
  347. package/dist/setup.js +67 -66
  348. package/dist/ship-publicar.js +263 -92
  349. package/dist/ship.js +160 -17
  350. package/dist/superficie.js +14 -11
  351. package/dist/thread-close.js +9 -9
  352. package/dist/thread.js +121 -18
  353. package/dist/tokens.js +15 -11
  354. package/dist/trabalho-thread.js +297 -0
  355. package/dist/transporte-do-canal.js +189 -0
  356. package/dist/types.js +12 -1
  357. package/dist/util.js +5 -2
  358. package/dist/varredura-acoes.js +500 -0
  359. package/dist/verify.js +491 -32
  360. package/dist/worktree-local.js +12 -10
  361. package/dist/worktree.js +81 -85
  362. package/eval/casos/check-quality.json +77 -0
  363. package/eval/casos/security-auditor.json +148 -0
  364. package/eval/casos/security-remediation.json +161 -0
  365. package/eval/fixtures/security-scan/README.md +8 -0
  366. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  367. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  368. package/eval/fixtures/security-scan/go/README.md +4 -0
  369. package/eval/fixtures/security-scan/go/config.go +4 -0
  370. package/eval/fixtures/security-scan/go/go.mod +5 -0
  371. package/eval/fixtures/security-scan/go/go.sum +2 -0
  372. package/eval/fixtures/security-scan/go/main.go +31 -0
  373. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  374. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  375. package/eval/fixtures/security-scan/js/README.md +4 -0
  376. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  377. package/eval/fixtures/security-scan/js/package.json +10 -0
  378. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  379. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  380. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  381. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  382. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  383. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  384. package/eval/fixtures/security-scan/python/README.md +4 -0
  385. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  386. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  387. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  388. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  389. package/package.json +10 -5
  390. package/references/security-checklist.md +3 -3
  391. package/skills/README.md +1 -0
  392. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  393. package/skills/phases/check-quality/SKILL.md +16 -0
  394. package/skills/phases/go-implementation/SKILL.md +6 -0
  395. package/skills/phases/security-remediation/SKILL.md +70 -0
  396. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/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,14 +314,15 @@ 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;
@@ -360,7 +334,7 @@ function instalarAdaptador(host, opcoes = {}) {
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
  }
@@ -559,82 +533,83 @@ function desinstalarExperiencia(projeto, host, dryRun = false) {
559
533
  (0, experiencia_instalacao_1.aplicarExperiencia)(plano);
560
534
  return { host, dryRun, arquivos: plano.mudancas.map(m => path.relative(plano.projeto, m.arquivo)) };
561
535
  }
562
- /** 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. */
563
542
  function tabelaDeHosts() {
564
- const linhas = ['Adaptadores de host (Camada 1, o podio)', ''];
543
+ const m = (0, locale_1.msg)().adapter;
544
+ const linhas = [m.titulo, ''];
565
545
  for (const host of exports.ORDEM_DOS_HOSTS) {
566
- const def = exports.HOSTS[host];
567
- linhas.push(` ${host.padEnd(13)} ${def.descricao}`);
568
- linhas.push(` ${' '.repeat(13)} destino padrao: <projeto>/${def.destinoPadrao}${def.subdir ? '/' + def.subdir : ''}`);
569
- 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)}`);
570
549
  }
571
550
  linhas.push('');
572
- linhas.push('Instale com: ork adapter install <host> [--dir DIR] [--dry-run] [--force]');
573
- 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);
574
553
  return linhas.join('\n');
575
554
  }
576
- /** 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. */
577
556
  function textoDosPitfalls(host) {
578
- const def = exports.HOSTS[host];
579
- const linhas = [`Os 3 pitfalls de instalacao do ${host} (confira, nao suponha):`, ''];
580
- 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) => {
581
560
  linhas.push(` ${i + 1}. ${p.titulo}`);
582
561
  linhas.push(` ${p.detalhe}`);
583
- linhas.push(` prova: ${p.prova}`);
562
+ linhas.push(` ${m.prova(p.prova)}`);
584
563
  linhas.push('');
585
564
  });
586
565
  return linhas.join('\n').replace(/\n$/, '');
587
566
  }
588
- /** Texto de `ork adapter install`. */
567
+ /** Texto de `ork adapter install`, no locale ativo; os avisos que a instalacao montou sao remontados. */
589
568
  function textoDaInstalacao(r) {
569
+ const m = (0, locale_1.msg)().adapter;
590
570
  const linhas = [];
591
571
  // Ensaio da 0.5.0: com o pacote ativo e pulado por aviso (catalogo fora do projeto), a linha dizia
592
572
  // "desativada"; o aviso logo abaixo diz o motivo.
593
- if (r.experiencia)
594
- linhas.push(`Experiência: ${r.experiencia.ativa ? 'ativação preparada'
595
- : r.experiencia.aviso ? 'pacote pulado nesta instalação, veja o aviso abaixo' : 'desativada ou sem integração de skills'}` +
596
- `${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
+ }
597
576
  if (r.experiencia?.aviso)
598
- linhas.push(`Aviso: ${r.experiencia.aviso}`);
599
- linhas.push(r.dryRun
600
- ? `Simulacao (--dry-run) da instalacao do adaptador ${r.host}: nada foi escrito.`
601
- : r.ok
602
- ? `Arquivos do adaptador ${r.host} preparados.`
603
- : `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));
604
579
  // Ensaio de 03/10 (R6): a ativacao sai no comeco e de novo no fim, depois da lista de arquivos e dos
605
580
  // pitfalls, para que o fim da saida diga o proximo passo.
606
581
  const ativacao = [];
607
582
  if (r.ok && !r.dryRun && r.host === 'claude-code') {
608
583
  const destino = "'" + r.destino.replace(/'/g, "'\"'\"'") + "'";
609
- linhas.push('Uso no Claude Code ainda nao verificado por esta copia.');
610
- linhas.push('No diretorio deste projeto, valide e ative o plugin:');
584
+ linhas.push(m.claudeNaoVerificado);
585
+ linhas.push(m.claudeValide);
611
586
  ativacao.push(` claude plugin validate ${destino}`);
612
587
  ativacao.push(` claude plugin marketplace add ${destino} --scope project`);
613
588
  ativacao.push(' claude plugin install orkastery@orkastery --scope project');
614
589
  ativacao.push(' claude plugin list --json');
615
- ativacao.push('Depois, na sessao deste projeto: /orkastery:ork');
590
+ ativacao.push(m.claudeDepois);
616
591
  }
617
592
  else if (r.ok && !r.dryRun && r.host === 'codex') {
618
- ativacao.push('Abra o Codex neste projeto e use $ork.');
619
- ativacao.push('Descoberta e uso nativo ainda nao verificados por esta copia.');
593
+ ativacao.push(m.codexAbra);
594
+ ativacao.push(m.codexNaoVerificado);
620
595
  }
621
596
  if (r.ok && !r.dryRun && (r.host === 'codex' || r.host === 'claude-code')) {
622
597
  const projeto = "'" + r.projeto.replace(/'/g, "'\"'\"'") + "'";
623
- ativacao.push(`Prepare tambem as ferramentas do projeto: ork mcp install --project ${projeto} --host ${r.host}`);
598
+ ativacao.push(m.prepareMcp(projeto, r.host));
624
599
  }
625
600
  linhas.push(...ativacao);
626
601
  if (ativacao.length)
627
- linhas.push('A configuracao MCP exige descoberta e consentimento no cliente; a copia nao concede aprovacoes.');
628
- linhas.push(` catalogo: ${r.catalogo}`);
629
- linhas.push(` destino: ${r.destino}`);
630
- 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));
631
606
  if (r.avisoOrk)
632
- linhas.push(` Aviso: ${r.avisoOrk}`);
607
+ linhas.push(m.avisoOrk((0, locale_1.remontar)(r.avisoOrk)));
633
608
  linhas.push('');
634
609
  const novos = r.arquivos.filter((a) => a.estado === 'novo').length;
635
610
  const iguais = r.arquivos.filter((a) => a.estado === 'igual').length;
636
611
  const catalogoAndou = r.conflitos.filter((a) => a.divergencia === 'catalogo-andou').length;
637
- 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));
638
613
  for (const a of r.arquivos) {
639
614
  const marca = a.estado === 'novo' ? '+' : a.estado === 'igual' ? '=' : '!';
640
615
  const porque = a.divergencia ? ` (${a.divergencia})` : '';
@@ -642,22 +617,17 @@ function textoDaInstalacao(r) {
642
617
  }
643
618
  // RM-059 (T0.7): arquivo de mod que saiu do catalogo sai da copia, para o despacho nao recusar o mod.
644
619
  for (const rel of r.removidos ?? [])
645
- linhas.push(` - ${rel} (saiu do catalogo${r.dryRun ? ', seria removido' : ', removido'})`);
620
+ linhas.push(m.removido(rel, r.dryRun));
646
621
  // I-43 (D5): o `--dir` na raiz avisa, em vez de reportar "tudo novo" com saida 0.
647
622
  if (r.reciboVizinho) {
648
623
  linhas.push('');
649
- linhas.push(` ATENCAO: nao ha recibo em ${r.destino}, mas ha um em`);
650
- linhas.push(` ${r.reciboVizinho}`);
651
- linhas.push(' `--dir` e o destino COMPLETO, nao a raiz do projeto. Do jeito que esta, esta');
652
- linhas.push(' instalacao criaria uma copia nova ao lado da que ja existe, e a que existe');
653
- linhas.push(' ficaria sem conferencia nenhuma.');
624
+ linhas.push(...m.reciboVizinho(r.destino, r.reciboVizinho));
654
625
  }
655
626
  // I-43 (D5): o que o recibo garante seguro se resolve sozinho, e sai como uma linha
656
627
  // de resumo em vez de virar decisao do operador.
657
628
  if (catalogoAndou > 0) {
658
629
  linhas.push('');
659
- linhas.push(` ${catalogoAndou} divergente(s) sao "catalogo-andou": a copia esta como foi instalada`);
660
- linhas.push(' e quem mudou foi o catalogo. Sobrescrever nao perde trabalho de ninguem.');
630
+ linhas.push(...m.catalogoAndou(catalogoAndou));
661
631
  }
662
632
  if (!r.ok) {
663
633
  // A pergunta de UMA linha, com o arquivo NOMEADO e as duas saidas reais. O `--dir`
@@ -667,13 +637,13 @@ function textoDaInstalacao(r) {
667
637
  ? r.destino.slice(r.projeto.length + 1)
668
638
  : r.destino;
669
639
  linhas.push('');
670
- linhas.push(` ${r.precisamDeDecisao.length} arquivo(s) precisam de uma decisao sua:`);
640
+ linhas.push(m.precisamDeDecisao(r.precisamDeDecisao.length));
671
641
  for (const a of r.precisamDeDecisao) {
672
642
  linhas.push(` ${a.relativo} (${a.divergencia})`);
673
643
  linhas.push(` $ diff -u ${a.origem} ${a.destino}`);
674
644
  }
675
645
  linhas.push('');
676
- linhas.push(' Resolva em UM comando, por arquivo:');
646
+ linhas.push(m.resolva);
677
647
  const exemplo = r.precisamDeDecisao[0]?.relativo ?? '<arquivo>';
678
648
  linhas.push(` ork adapter install ${r.host} --dir ${dirEmUso} --aceitar-catalogo ${exemplo}`);
679
649
  linhas.push(` ork adapter install ${r.host} --dir ${dirEmUso} --manter-copia ${exemplo}`);
@@ -682,7 +652,7 @@ function textoDaInstalacao(r) {
682
652
  linhas.push(textoDosPitfalls(r.host));
683
653
  if (ativacao.length) {
684
654
  linhas.push('');
685
- 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);
686
656
  linhas.push(...ativacao);
687
657
  }
688
658
  return linhas.join('\n');