@orkastery/cli 0.5.6 → 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 (385) 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 +118 -4
  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/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/prompts.js CHANGED
@@ -49,7 +49,7 @@ var __importStar = (this && this.__importStar) || (function () {
49
49
  };
50
50
  })();
51
51
  Object.defineProperty(exports, "__esModule", { value: true });
52
- exports.TEMPLATES_EMBUTIDOS = exports.TEMPLATE_FASE_PADRAO = exports.PADROES_DE_HITL_EM_TEXTO_LIVRE = exports.CONTRATO_DE_FASE = exports.REGRA_CENTRAL = exports.SECOES_OBRIGATORIAS = exports.LIMITE_TEMPLATE_BYTES = void 0;
52
+ exports.TEMPLATES_EMBUTIDOS = exports.TEMPLATE_FASE_PADRAO_EN = exports.TEMPLATE_FASE_PADRAO = exports.PADROES_DE_HITL_EM_TEXTO_LIVRE = exports.CONTRATO_DE_FASE_EN = exports.CONTRATO_DE_FASE = exports.REGRA_CENTRAL_EN = exports.SECOES_OBRIGATORIAS_EN = exports.REGRA_CENTRAL = exports.SECOES_OBRIGATORIAS = exports.LIMITE_TEMPLATE_BYTES = void 0;
53
53
  exports.pedidoComDicaDoGrafo = pedidoComDicaDoGrafo;
54
54
  exports.dirDeTemplates = dirDeTemplates;
55
55
  exports.variaveisUsadas = variaveisUsadas;
@@ -61,6 +61,8 @@ exports.carregarTemplatesDe = carregarTemplatesDe;
61
61
  exports.carregarTemplates = carregarTemplates;
62
62
  exports.exigirTemplate = exigirTemplate;
63
63
  exports.templateDaFase = templateDaFase;
64
+ exports.idiomaDoTemplate = idiomaDoTemplate;
65
+ exports.avisosDeLingua = avisosDeLingua;
64
66
  exports.textoDoLint = textoDoLint;
65
67
  exports.tabelaDeTemplates = tabelaDeTemplates;
66
68
  exports.threadDeExemplo = threadDeExemplo;
@@ -69,20 +71,18 @@ const path = __importStar(require("node:path"));
69
71
  const modos_1 = require("./modos");
70
72
  const policies_1 = require("./policies");
71
73
  const types_1 = require("./types");
74
+ const locale_1 = require("./locale");
75
+ const locale_prompts_1 = require("./locale-prompts");
72
76
  /** Limite duro de um template, o mesmo do manifesto: prosa longa nao vira prompt. */
73
77
  exports.LIMITE_TEMPLATE_BYTES = 16384;
74
78
  /**
75
79
  * KG5 fatia 2: dica opt-in no pedido; desligada preserva o texto byte a byte. Fatia 5: a dica diz o que
76
80
  * a marca `arvore: modificada` quer dizer na aresta.
77
81
  */
78
- function pedidoComDicaDoGrafo(pedido, thread, ligado) {
82
+ function pedidoComDicaDoGrafo(pedido, thread, ligado, locale = (0, locale_1.localeAtivo)()) {
79
83
  if (!ligado)
80
84
  return pedido;
81
- return pedido.trimEnd() + '\n\n## Contexto do grafo (opcional)\n'
82
- + `Consulte ork_grafo_contexto {threadId: "${thread}"} ou ork grafo contexto ${thread} --json para o pacote da thread com evidencias e teto em bytes.\n`
83
- + 'As tools ork_grafo_vizinhos, ork_grafo_chamadores, ork_grafo_importadores e ork_grafo_caminho permitem aprofundar. '
84
- + 'Sem indice do HEAD, rode ork grafo indexar. O grafo e parcial e descreve o HEAD; '
85
- + 'aresta com arvore: modificada vem de fonte que mudou depois dele: confira o arquivo antes de usar.\n';
85
+ return pedido.trimEnd() + (locale === 'en' ? locale_prompts_1.PROMPTS_EN : locale_prompts_1.PROMPTS_PT_BR).contextoDoGrafo(thread);
86
86
  }
87
87
  /** Onde um projeto guarda os templates que sobrescrevem os embutidos. */
88
88
  function dirDeTemplates(raiz) {
@@ -110,7 +110,7 @@ function variaveisUsadas(corpo) {
110
110
  function renderizar(template, valores) {
111
111
  const faltando = variaveisUsadas(template.corpo).filter((v) => !(v in valores));
112
112
  if (faltando.length > 0) {
113
- throw new Error(`template ${template.id}: variavel sem valor na renderizacao: ${faltando.join(', ')}`);
113
+ throw new Error((0, locale_1.msg)().prompts.cli.variavelSemValor(template.id, faltando.join(', ')));
114
114
  }
115
115
  const linhas = template.corpo.split('\n');
116
116
  const saida = [];
@@ -141,7 +141,7 @@ function parseListaInline(bruto) {
141
141
  function parseTemplate(bruto, origem) {
142
142
  const casado = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/.exec(bruto);
143
143
  if (!casado) {
144
- throw new Error(`template em ${origem}: frontmatter ausente (esperado bloco --- ... ---)`);
144
+ throw new Error((0, locale_1.msg)().prompts.cli.frontmatterAusente(origem));
145
145
  }
146
146
  const campos = {};
147
147
  for (const linha of casado[1].split('\n')) {
@@ -177,6 +177,8 @@ exports.SECOES_OBRIGATORIAS = [
177
177
  ];
178
178
  /** A frase que nenhum template pode perder, porque ela e o contrato de todo modo. */
179
179
  exports.REGRA_CENTRAL = 'REGRA CENTRAL: o modo afrouxa a pausa, NUNCA a verificacao.';
180
+ exports.SECOES_OBRIGATORIAS_EN = locale_prompts_1.PROMPTS_EN.secoesObrigatorias;
181
+ exports.REGRA_CENTRAL_EN = locale_prompts_1.PROMPTS_EN.regraCentral;
180
182
  /** O contrato do prompt de fase (o do B4). */
181
183
  exports.CONTRATO_DE_FASE = {
182
184
  nome: 'fase',
@@ -185,6 +187,10 @@ exports.CONTRATO_DE_FASE = {
185
187
  variavelObrigatoria: 'pedido',
186
188
  validaFases: true,
187
189
  };
190
+ exports.CONTRATO_DE_FASE_EN = {
191
+ nome: 'phase', secoes: exports.SECOES_OBRIGATORIAS_EN, regraCentral: exports.REGRA_CENTRAL_EN,
192
+ variavelObrigatoria: 'pedido', validaFases: true,
193
+ };
188
194
  /**
189
195
  * RM-057: os jeitos de um template pedir ao dono texto livre ou texto colado. Lista fechada, como o
190
196
  * vocabulario do pulse: acrescentar um padrao e decisao de contrato, com teste. Casa sobre a linha
@@ -213,7 +219,9 @@ function procurarHitlEmTextoLivre(corpo) {
213
219
  * template que perdeu a regra dos modos, que esqueceu o pedido do builder, que declara variavel
214
220
  * que nao usa (ou usa variavel que nao declara) e que carrega credencial.
215
221
  */
216
- function lintTemplate(t, contrato = exports.CONTRATO_DE_FASE) {
222
+ function lintTemplate(t, contrato) {
223
+ contrato ??= t.id.endsWith('.en') ? exports.CONTRATO_DE_FASE_EN : exports.CONTRATO_DE_FASE;
224
+ const mc = (0, locale_1.msg)().prompts.cli;
217
225
  const problemas = [];
218
226
  const erro = (regra, detalhe) => {
219
227
  problemas.push({ template: t.id || t.origem, regra, gravidade: 'erro', detalhe });
@@ -222,56 +230,56 @@ function lintTemplate(t, contrato = exports.CONTRATO_DE_FASE) {
222
230
  problemas.push({ template: t.id || t.origem, regra, gravidade: 'aviso', detalhe });
223
231
  };
224
232
  if (!t.id)
225
- erro('id', 'frontmatter sem `id`');
233
+ erro('id', mc.idAusente);
226
234
  if (t.origem !== 'embutido') {
227
235
  const esperado = path.basename(t.origem, '.md');
228
236
  if (t.id && t.id !== esperado) {
229
- erro('id', `o id "${t.id}" nao bate com o nome do arquivo "${esperado}.md"`);
237
+ erro('id', mc.idDiverge(t.id, esperado));
230
238
  }
231
239
  }
232
240
  if (!Number.isInteger(t.versao) || t.versao < 1) {
233
- erro('versao', `versao "${t.versao}" invalida: esperado inteiro a partir de 1`);
241
+ erro('versao', mc.versaoInvalida(t.versao));
234
242
  }
235
243
  if (t.descricao.trim() === '')
236
- erro('descricao', 'frontmatter sem `descricao`');
244
+ erro('descricao', mc.descricaoAusente);
237
245
  if (contrato.validaFases) {
238
246
  for (const fase of t.fases) {
239
247
  if (!types_1.FASES.includes(fase)) {
240
- erro('fases', `"${fase}" nao e fase do ciclo canonico (${types_1.FASES.join(', ')})`);
248
+ erro('fases', mc.faseInvalida(fase, types_1.FASES.join(', ')));
241
249
  }
242
250
  }
243
251
  }
244
252
  const usadas = variaveisUsadas(t.corpo);
245
253
  const naoDeclaradas = usadas.filter((v) => !t.variaveis.includes(v));
246
254
  if (naoDeclaradas.length > 0) {
247
- erro('variaveis', `usadas no corpo e nao declaradas: ${naoDeclaradas.join(', ')}`);
255
+ erro('variaveis', mc.variaveisNaoDeclaradas(naoDeclaradas.join(', ')));
248
256
  }
249
257
  const naoUsadas = t.variaveis.filter((v) => !usadas.includes(v));
250
258
  if (naoUsadas.length > 0) {
251
- erro('variaveis', `declaradas e nao usadas: ${naoUsadas.join(', ')}`);
259
+ erro('variaveis', mc.variaveisNaoUsadas(naoUsadas.join(', ')));
252
260
  }
253
261
  for (const secao of contrato.secoes) {
254
262
  if (!t.corpo.includes(secao))
255
- erro('secoes', `secao obrigatoria ausente: ${secao}`);
263
+ erro('secoes', mc.secaoAusente(secao));
256
264
  }
257
265
  if (!t.corpo.includes(contrato.regraCentral)) {
258
- erro('regra-central', `o template perdeu a linha: ${contrato.regraCentral}`);
266
+ erro('regra-central', mc.regraCentralAusente(contrato.regraCentral));
259
267
  }
260
268
  if (contrato.variavelObrigatoria && !usadas.includes(contrato.variavelObrigatoria)) {
261
- erro(contrato.variavelObrigatoria, `o template nao usa {{${contrato.variavelObrigatoria}}}: despacharia uma ${contrato.nome} sem a demanda do builder`);
269
+ erro(contrato.variavelObrigatoria, mc.pedidoAusente(contrato.variavelObrigatoria, contrato.nome));
262
270
  }
263
271
  for (const achado of (0, policies_1.procurarSegredos)(t.bruto)) {
264
- erro('segredo', `padrao "${achado.nome}" casou na linha ${achado.linha} do template (trecho omitido de proposito)`);
272
+ erro('segredo', mc.segredo(achado.nome, achado.linha));
265
273
  }
266
274
  const bytes = Buffer.byteLength(t.bruto, 'utf8');
267
275
  if (bytes > exports.LIMITE_TEMPLATE_BYTES) {
268
- erro('tamanho', `${bytes} bytes acima do limite de ${exports.LIMITE_TEMPLATE_BYTES}`);
276
+ erro('tamanho', mc.tamanho(bytes, exports.LIMITE_TEMPLATE_BYTES));
269
277
  }
270
278
  for (const achado of procurarHitlEmTextoLivre(t.corpo)) {
271
- erro('hitl-texto-livre', `linha ${achado.linha} pede ${achado.oQue}; HITL de conducao e selecao de 3 a 5 alternativas com uma Recomendacao (RM-057)`);
279
+ erro('hitl-texto-livre', mc.hitlTextoLivre(achado.linha, achado.oQue));
272
280
  }
273
281
  if (t.bruto.includes('—')) {
274
- aviso('idioma', 'o template usa travessao longo (U+2014); o padrao do projeto e hifen ou virgula');
282
+ aviso('idioma', mc.travessao);
275
283
  }
276
284
  return problemas;
277
285
  }
@@ -284,10 +292,10 @@ function lintTemplate(t, contrato = exports.CONTRATO_DE_FASE) {
284
292
  */
285
293
  exports.TEMPLATE_FASE_PADRAO = `---
286
294
  id: fase-padrao
287
- versao: 3
295
+ versao: 4
288
296
  descricao: Prompt canonico de uma fase do ciclo GOAL..MASTER, com nomenclatura, modo de conducao, contexto da thread, memoria injetada e regras de evidencia.
289
297
  fases: [GOAL, PLAN, GO, CHECK, SHIP, MASTER]
290
- variaveis: [fase, thread, bloco, nome, ciclo_canonico, tag, blocos, pausas, linha_variante, regra_de_pausa, invariantes, slug, projeto_nome, projeto_abbrev, base_branch, base_commit, diretorio, pedido, memoria_injetada, regras_de_evidencia]
298
+ variaveis: [fase, thread, bloco, nome, ciclo_canonico, tag, blocos, pausas, linha_variante, regra_de_pausa, invariantes, slug, projeto_nome, projeto_abbrev, base_branch, base_commit, diretorio, trabalho, pedido, fecho_go, memoria_injetada, regras_de_evidencia]
291
299
  ---
292
300
  # Orkastery, fase {{fase}} da thread {{thread}}
293
301
 
@@ -321,12 +329,14 @@ REGRA CENTRAL: o modo afrouxa a pausa, NUNCA a verificacao.
321
329
  - projeto: {{projeto_nome}} (abbrev {{projeto_abbrev}})
322
330
  - base carimbada: {{base_branch}} @ {{base_commit}}
323
331
  - diretorio de trabalho: {{diretorio}}
332
+ - trabalho retomavel: {{trabalho}} (rascunhos de check e PR, pareceres e listas de prova)
324
333
  - estado da thread: .orkastery/threads/{{thread}}/thread.json
325
334
  - ledger: .orkastery/threads/{{thread}}/ledger.jsonl
326
335
 
327
336
  ## Pedido do builder
328
337
  {{pedido}}
329
338
  {{memoria_injetada}}
339
+ {{fecho_go}}
330
340
 
331
341
  ## Isolamento por sessão
332
342
 
@@ -338,9 +348,69 @@ Falha de autenticação permanece impedimento; não troque provider, sandbox ou
338
348
 
339
349
  ## Regras de evidencia
340
350
  {{regras_de_evidencia}}`;
351
+ /** English counterpart of the canonical phase prompt. The pt-BR template above remains the source contract. */
352
+ exports.TEMPLATE_FASE_PADRAO_EN = `---
353
+ id: fase-padrao.en
354
+ versao: 4
355
+ descricao: Canonical prompt for a GOAL..MASTER cycle phase, with naming, conduction mode, thread context, injected memory, and evidence rules.
356
+ fases: [GOAL, PLAN, GO, CHECK, SHIP, MASTER]
357
+ variaveis: [fase, thread, bloco, nome, ciclo_canonico, tag, blocos, pausas, linha_variante, regra_de_pausa, invariantes, slug, projeto_nome, projeto_abbrev, base_branch, base_commit, diretorio, trabalho, pedido, fecho_go, memoria_injetada, regras_de_evidencia]
358
+ ---
359
+ # Orkastery, {{fase}} phase of thread {{thread}}
360
+
361
+ You conduct block {{bloco}} of thread "{{nome}}". {{fase}} is the entry phase, not a new orchestration.
362
+ Run the phases in this block in canonical order, respecting each phase scope and the core gates; GOAL does not implement before GO.
363
+ Do not open another thread or redispatch yourself. If the project has an MCP server, prefer its tools for supported state and operations.
364
+ In Claude with the \`orkastery\` server, use the exposed full names: \`ToolSearch\` with \`select:mcp__orkastery__ork_thread_status,mcp__orkastery__ork_artifact_read\` discovers those reads; select the full name for any other tool. Do not search for \`select:ork_thread_status\`. Other hosts use their discovered namespace.
365
+ When available, use ork_artifact_read/write for the goal, plan, and review, and ork_claims_list/ork_claim_add for claims; do not write the ledger or canonical state directly.
366
+ Record every decision you make without asking the owner in the ledger with \`ork decisao registrar <thread>\` (or \`ork_decision_record\` in MCP because the Codex sandbox cannot write the ledger), including what was decided, why, how to change it, reversal cost now and later, the written criterion, who decided, and the evidence. This is how it reaches the owner in the summary instead of disappearing in the conversation.
367
+ An agent-authored artifact is not an official receipt; registering a claim does not verify it.
368
+ To record product changes, prefer ork_git_commit with the current HEAD and paths with claims; use ork_verify for real verification and ork_ship with checked source/destination HEADs for delivery. A local commit is not SHIP; an incomplete result requires reconciling state and remote before retrying. Permission to query does not grant those operations: respect native authorization and gates.
369
+ The conducting session presents an owner decision to the host; a child session neither answers nor assumes the owner's identity.
370
+ Preserve the configured child profile: \`interactive\` grants queries; \`worktree\` requires installation opt-in and authorizes exact tools in the validated worktree, without approving gates or assuming the owner. Do not change configuration to bypass a block.
371
+ Query \`ork_git_status\` for real HEADs and Git state; use \`ork_git_commit\`, \`ork_verify\`, and \`ork_ship\` through the core contracts, without Bash Git or invented SHAs. Use \`source.head\` as the commit \`expectedHead\`; query again after the commit and use \`source.head\`/\`destination.head\` as SHIP \`expectedSource\`/\`expectedDestination\`. A historical base does not replace the current query. Edit/deny rules are native tool permissions, not process sandbox rules.
372
+ A native permission failure or an operation without supported transport remains a real blocker, never a reason to alter the sandbox.
373
+
374
+ ## Canonical cycle
375
+ {{ciclo_canonico}}
376
+
377
+ ## Conduction mode: {{tag}}
378
+ Blocks in this thread: {{blocos}}
379
+ Human pauses in this thread: {{pausas}}
380
+ {{linha_variante}}
381
+ {{regra_de_pausa}}
382
+
383
+ CENTRAL RULE: the mode relaxes the pause, NEVER verification.
384
+ {{invariantes}}
385
+
386
+ ## Thread context
387
+ - thread: {{thread}} (slug {{slug}})
388
+ - project: {{projeto_nome}} (abbrev {{projeto_abbrev}})
389
+ - stamped base: {{base_branch}} @ {{base_commit}}
390
+ - working directory: {{diretorio}}
391
+ - resumable work: {{trabalho}} (check and PR drafts, reviews and proof lists)
392
+ - thread state: .orkastery/threads/{{thread}}/thread.json
393
+ - ledger: .orkastery/threads/{{thread}}/ledger.jsonl
394
+
395
+ ## Builder request
396
+ {{pedido}}
397
+ {{memoria_injetada}}
398
+ {{fecho_go}}
399
+
400
+ ## Session isolation
401
+
402
+ The runtime may be the same for the conductor and reviewer. Independence requires distinct native IDs
403
+ and links proven by the core; a role name in the prompt is not authority. This session executes the
404
+ received block without opening recursion, approving a gate, or validating its own work. Preserve the
405
+ configured runtime/model/effort and \`interactive\`/\`worktree\` profile. Authentication failure remains
406
+ a blocker; do not change provider, sandbox, or identity.
407
+
408
+ ## Evidence rules
409
+ {{regras_de_evidencia}}`;
341
410
  /** Os templates que vem dentro do `ork`, por id. */
342
411
  exports.TEMPLATES_EMBUTIDOS = {
343
412
  'fase-padrao': exports.TEMPLATE_FASE_PADRAO,
413
+ 'fase-padrao.en': exports.TEMPLATE_FASE_PADRAO_EN,
344
414
  };
345
415
  /**
346
416
  * Carrega templates de um conjunto de embutidos, sobrescritos pelos `.md` de um diretorio.
@@ -382,50 +452,74 @@ function exigirTemplate(id, raiz) {
382
452
  const achado = carregarTemplates(raiz).find((t) => t.id === id);
383
453
  if (!achado) {
384
454
  const ids = carregarTemplates(raiz).map((t) => t.id).join(', ');
385
- throw new Error(`template "${id}" nao existe (conhecidos: ${ids})`);
455
+ throw new Error((0, locale_1.msg)().prompts.cli.templateNaoExiste(id, ids));
386
456
  }
387
457
  return achado;
388
458
  }
389
459
  /**
390
460
  * O template que conduz a fase: `fase-<minuscula>` quando o projeto versionou um so para ela,
391
461
  * senao o `fase-padrao`. E o unico ponto de resolucao, para nao haver duas regras de escolha.
462
+ *
463
+ * RM-061 F3c: com o dono em ingles, o template do projeto vence o embutido e o da fase vence o padrao; no mesmo
464
+ * nivel, o `.en` vem antes. O projeto que versionou o proprio prompt nunca o perde porque o dono fala ingles: sem o
465
+ * par `.en`, a fase sai em pt-BR, e o `ork prompt lint` avisa (`avisosDeLingua`).
392
466
  */
393
- function templateDaFase(fase, raiz) {
467
+ function templateDaFase(fase, raiz, locale = (0, locale_1.localeAtivo)()) {
394
468
  const templates = carregarTemplates(raiz);
395
- const especifico = templates.find((t) => t.id === `fase-${fase.toLowerCase()}`);
396
- if (especifico)
397
- return especifico;
398
- const padrao = templates.find((t) => t.id === 'fase-padrao');
399
- if (!padrao)
400
- throw new Error('template `fase-padrao` ausente: o `ork` nao tem prompt de fase');
401
- return padrao;
469
+ const achar = (id, soDoProjeto = false) => templates.find((t) => t.id === id && (!soDoProjeto || t.origem !== 'embutido'));
470
+ const especifico = `fase-${fase.toLowerCase()}`;
471
+ const candidatos = locale === 'en'
472
+ ? [achar(`${especifico}.en`), achar(especifico), achar('fase-padrao.en', true), achar('fase-padrao', true), achar('fase-padrao.en')]
473
+ : [achar(especifico), achar('fase-padrao')];
474
+ const escolhido = candidatos.find((t) => t !== undefined);
475
+ if (!escolhido)
476
+ throw new Error((0, locale_1.msg)().prompts.cli.templatePadraoAusente);
477
+ return escolhido;
478
+ }
479
+ /** RM-061 F3c: a lingua de um template de fase, pelo sufixo do id; os valores do prompt falam a mesma. */
480
+ function idiomaDoTemplate(t) {
481
+ return t.id.endsWith('.en') ? 'en' : 'pt-BR';
482
+ }
483
+ /**
484
+ * RM-061 F3c: com o dono em ingles, o template de fase do projeto sem o par `.en` do projeto vale como esta, em
485
+ * pt-BR. O lint avisa, para a troca de lingua nunca ser silenciosa; em pt-BR nao ha o que avisar.
486
+ */
487
+ function avisosDeLingua(templates, lingua) {
488
+ if (lingua !== 'en')
489
+ return [];
490
+ const doProjeto = new Set(templates.filter((t) => t.origem !== 'embutido').map((t) => t.id));
491
+ return templates
492
+ .filter((t) => t.origem !== 'embutido' && t.id.startsWith('fase-') && !t.id.endsWith('.en') && !doProjeto.has(`${t.id}.en`))
493
+ .map((t) => ({ template: t.id, regra: 'idioma', gravidade: 'aviso', detalhe: (0, locale_1.msg)().prompts.cli.semParIngles(t.id) }));
402
494
  }
403
495
  /** Texto de `ork prompt lint` para a saida do CLI. */
404
496
  function textoDoLint(problemas, quantos) {
497
+ const m = (0, locale_1.msg)().prompts.cli;
405
498
  const linhas = [];
406
499
  const erros = problemas.filter((p) => p.gravidade === 'erro');
407
500
  const avisos = problemas.filter((p) => p.gravidade === 'aviso');
408
501
  for (const p of problemas) {
409
- linhas.push(` [${p.gravidade}] ${p.template} :: ${p.regra}`);
502
+ linhas.push(` [${m.gravidades[p.gravidade]}] ${p.template} :: ${p.regra}`);
410
503
  linhas.push(` ${p.detalhe}`);
411
504
  }
412
505
  if (problemas.length === 0) {
413
- linhas.push(` nenhum problema em ${quantos} template(s)`);
506
+ linhas.push(m.semProblema(quantos));
414
507
  }
415
508
  linhas.push('');
416
- linhas.push(`templates: ${quantos} | erros: ${erros.length} | avisos: ${avisos.length}`);
509
+ linhas.push(m.resumoLint(quantos, erros.length, avisos.length));
417
510
  return linhas.join('\n');
418
511
  }
419
512
  /** Texto de `ork prompt list`. */
420
513
  function tabelaDeTemplates(templates) {
421
- const linhas = ['Templates de prompt (o do projeto sobrescreve o embutido de mesmo id)', ''];
514
+ const m = (0, locale_1.msg)().prompts.cli;
515
+ const linhas = [m.tituloLista, ''];
422
516
  for (const t of templates) {
423
- linhas.push(` ${t.id.padEnd(16)} v${t.versao} origem: ${t.origem}`);
424
- linhas.push(` ${' '.repeat(16)} fases: ${t.fases.length > 0 ? t.fases.join(' ') : 'todas'}`);
517
+ linhas.push(` ${t.id.padEnd(16)} v${t.versao} ${m.origem(t.origem)}`);
518
+ linhas.push(` ${' '.repeat(16)} ${m.fases(t.fases.length > 0 ? t.fases.join(' ') : m.todas)}`);
425
519
  linhas.push(` ${' '.repeat(16)} ${t.descricao}`);
426
520
  }
427
521
  linhas.push('');
428
- linhas.push('Para versionar o seu: grave em prompts/<id>.md e rode `ork prompt lint`.');
522
+ linhas.push(m.comoVersionar);
429
523
  return linhas.join('\n');
430
524
  }
431
525
  /**
@@ -56,6 +56,7 @@ const fs = __importStar(require("node:fs"));
56
56
  const path = __importStar(require("node:path"));
57
57
  const ledger_1 = require("./ledger");
58
58
  const thread_1 = require("./thread");
59
+ const locale_1 = require("./locale");
59
60
  /** Teto de comandos por claim num ciclo sem CHECK (degrau 2). */
60
61
  exports.LIMITE_DE_COMANDOS_SEM_CHECK = 2;
61
62
  /** O ciclo da thread nao tem CHECK: a prova e a minima, feita pela propria GO. */
@@ -87,13 +88,11 @@ function comandoDoTesteFocado(teste) {
87
88
  */
88
89
  function validarProvaSemCheck(verificar, comandoDeTesteDoManifesto) {
89
90
  if (verificar.length > exports.LIMITE_DE_COMANDOS_SEM_CHECK) {
90
- throw new Error(`claims.custo: ciclo sem CHECK aceita ate ${exports.LIMITE_DE_COMANDOS_SEM_CHECK} comandos por claim ` +
91
- `(recebidos ${verificar.length}); use o teste focado ou declare a ausencia com ork claims ausente`);
91
+ throw new locale_1.ErroDoCatalogo((m) => m.claims.custoDeComandos(exports.LIMITE_DE_COMANDOS_SEM_CHECK, verificar.length));
92
92
  }
93
93
  const suite = comandoDeTesteDoManifesto?.trim();
94
94
  if (suite && verificar.some((c) => c.includes(suite))) {
95
- throw new Error(`claims.custo: ciclo sem CHECK nao roda a suite inteira ("${suite}"); ` +
96
- 'use o teste focado do arquivo que mudou');
95
+ throw new locale_1.ErroDoCatalogo((m) => m.claims.custoDaSuite(suite));
97
96
  }
98
97
  }
99
98
  /** Degrau 3: grava no ledger da thread que estes caminhos ficaram sem prova, e por que. */
@@ -101,9 +100,9 @@ function registrarProvaAusente(raiz, threadId, ausencia) {
101
100
  (0, thread_1.lerThread)(raiz, threadId); // a thread tem de existir
102
101
  const motivo = ausencia.motivo.trim();
103
102
  if (!motivo)
104
- throw new Error('prova.ausente: o motivo e obrigatorio (uma linha)');
103
+ throw new locale_1.ErroDoCatalogo((m) => m.claims.ausenteSemMotivo);
105
104
  if (ausencia.paths.length === 0)
106
- throw new Error('prova.ausente: informe os caminhos que ficaram sem prova');
105
+ throw new locale_1.ErroDoCatalogo((m) => m.claims.ausenteSemCaminhos);
107
106
  (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.provaAusente, {
108
107
  paths: ausencia.paths,
109
108
  motivo,
@@ -63,6 +63,7 @@ const fs = __importStar(require("node:fs"));
63
63
  const path = __importStar(require("node:path"));
64
64
  const horario_1 = require("./horario");
65
65
  const estado_thread_1 = require("./estado-thread");
66
+ const locale_1 = require("./locale");
66
67
  exports.CONTRATO_CADENCIA = 'ork.pulse-cadencia/v1';
67
68
  const ARQUIVO_CADENCIA = 'pulse-cadencia.json';
68
69
  const ARQUIVO_ULTIMO_RESUMO = 'pulse-ultimo-resumo.json';
@@ -100,10 +101,10 @@ function lerCadencia(raiz, estadoDir) {
100
101
  /** Grava a tag do dono. `por` e quem mandou (o remetente autenticado do canal, ou o operador). */
101
102
  function gravarCadencia(raiz, tag, origem, estadoDir) {
102
103
  if (!Object.hasOwn(exports.CADENCIAS, tag))
103
- throw new Error(`pulse.cadencia: tag desconhecida ${tag}`);
104
+ throw new Error((0, locale_1.msg)().operacao.pulseCadencia.desconhecidaInterna(tag));
104
105
  const por = origem.por.trim();
105
106
  if (!por)
106
- throw new Error('pulse.cadencia: informe quem trocou a cadencia');
107
+ throw new Error((0, locale_1.msg)().operacao.pulseCadencia.trocaSemAutor);
107
108
  const gravada = { contrato: exports.CONTRATO_CADENCIA, tag, por, canal: origem.canal, em: origem.em ?? new Date().toISOString() };
108
109
  const dir = dirDoMonitor(raiz, estadoDir);
109
110
  fs.mkdirSync(dir, { recursive: true });
@@ -158,6 +159,6 @@ function janelaAberta(def, ultimoResumoEm, quando, fuso = (0, horario_1.fusoDoDo
158
159
  }
159
160
  /** A confirmacao que volta ao dono pelo mesmo canal, no fuso dele. */
160
161
  function textoDaCadencia(def, quando) {
161
- return `Pulse ${def.descricao} (${def.tag}). Pergunta para você continua saindo na hora. ` +
162
- `Próximo resumo com novidade a partir de ${(0, horario_1.formatarDataHoraRotulada)(inicioDaProximaJanela(def, quando))}.`;
162
+ const m = (0, locale_1.msg)().operacao.pulseCadencia;
163
+ return m.texto(m.descricoes[def.tag] ?? def.descricao, def.tag, (0, horario_1.formatarDataHoraRotulada)(inicioDaProximaJanela(def, quando)));
163
164
  }
@@ -33,7 +33,11 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.PRAZO_PADRAO_MIN = exports.ENDERECO_DA_RESPOSTA = exports.ALVO_DO_PULSE = exports.TAMANHO_DO_CODIGO = exports.ALFABETO_DO_CODIGO = exports.CONTRATO_CONSENTIMENTO = void 0;
36
+ exports.PRAZO_PADRAO_MIN = exports.REPLY_A_OUTRA = exports.REFERENCIA_DO_REPLY = exports.CODIGO_CURTO = exports.ENDERECO_DA_RESPOSTA = exports.ALVO_DO_PULSE = exports.TAMANHO_DO_CODIGO = exports.ALFABETO_DO_CODIGO = exports.CONTRATO_CONSENTIMENTO = void 0;
37
+ exports.lerReferenciaDoReply = lerReferenciaDoReply;
38
+ exports.referenciaDoReplyValida = referenciaDoReplyValida;
39
+ exports.enderecoDoPulse = enderecoDoPulse;
40
+ exports.enderecoDoPulseValido = enderecoDoPulseValido;
37
41
  exports.arquivoDoConsentimento = arquivoDoConsentimento;
38
42
  exports.gerarCodigo = gerarCodigo;
39
43
  exports.interpretarResposta = interpretarResposta;
@@ -93,6 +97,54 @@ const LETRAS_DO_CODIGO = 'ABCDEFGHJKMNPQRSTVWXYZ';
93
97
  */
94
98
  exports.ALVO_DO_PULSE = 'pulse';
95
99
  exports.ENDERECO_DA_RESPOSTA = 'resposta';
100
+ /**
101
+ * RM-057 (resposta curta, D3 da ork-rm057respost): a forma de um código curto, como `gerarCodigo` o faz (letra na frente
102
+ * e ao menos um dígito), em maiúsculas.
103
+ */
104
+ exports.CODIGO_CURTO = /^(?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}$/;
105
+ /**
106
+ * RM-057 (resposta curta, D3; GO-FIX 1, achado 2): a referência do reply, `<código>:<id>`. O código vem do título da
107
+ * pergunta do arco que o dono respondeu, e o id é o da mensagem respondida no Telegram. O núcleo só aceita o reply quando
108
+ * esse id é o da mensagem em que a pergunta foi entregue, gravado na entrega: confirmação, recusa e conversa nunca são
109
+ * a pergunta, mesmo quando trazem o código.
110
+ */
111
+ exports.REFERENCIA_DO_REPLY = /^((?=[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{0,2}[2-9])[A-HJKMNP-TV-Z][2-9A-HJKMNP-TV-Z]{3}):([1-9][0-9]{0,19})$/;
112
+ /** O código e o id da mensagem respondida, ou `null` quando a referência não tem a forma. */
113
+ function lerReferenciaDoReply(referencia) {
114
+ const m = typeof referencia === 'string' ? exports.REFERENCIA_DO_REPLY.exec(referencia) : null;
115
+ return m ? { codigo: m[1], mensagem: m[2] } : null;
116
+ }
117
+ /**
118
+ * RM-057 (GO-FIX 2, R1 do CHECK da ork-rm057respost): a marca do reply a OUTRA mensagem. Quando o dono responde com a
119
+ * palavra solta em reply a uma mensagem que não é a pergunta do arco (a confirmação de um gate, a mensagem de outra pessoa
120
+ * do grupo, a do assistente), o gateway assina `resposta:outra`: a palavra nunca vira palavra solta, e o núcleo a recusa
121
+ * dizendo por quê. Nenhuma prova aceita este endereço.
122
+ */
123
+ exports.REPLY_A_OUTRA = 'outra';
124
+ /** A referência que o gateway pode assinar: a da pergunta respondida (`<código>:<id>`) ou a marca do reply a outra mensagem. */
125
+ function referenciaDoReplyValida(referencia) {
126
+ return referencia === exports.REPLY_A_OUTRA || lerReferenciaDoReply(referencia) !== null;
127
+ }
128
+ /**
129
+ * RM-057 (resposta curta, D3): o endereço que o gateway assina quando o dono responde EM REPLY à mensagem de uma pergunta.
130
+ * A referência (`<código>:<id da mensagem respondida>`) entra na posição de pedido do corpo assinado
131
+ * (`resposta:<código>:<id>`), dentro do HMAC, e o texto do dono continua na posição de resposta, como ele digitou. A
132
+ * palavra solta em reply a outra mensagem vai em `resposta:outra` (GO-FIX 2). Sem reply, o endereço é o de sempre.
133
+ */
134
+ function enderecoDoPulse(referencia) {
135
+ if (referencia === undefined || referencia === null)
136
+ return exports.ENDERECO_DA_RESPOSTA;
137
+ if (!referenciaDoReplyValida(referencia))
138
+ throw new Error('resposta do pulse: referência do reply fora da forma <código>:<mensagem> (ou outra)');
139
+ return `${exports.ENDERECO_DA_RESPOSTA}:${referencia}`;
140
+ }
141
+ /** Os dois endereços do pulse que provam resposta: o de sempre e o do reply. */
142
+ function enderecoDoPulseValido(endereco) {
143
+ if (endereco === exports.ENDERECO_DA_RESPOSTA)
144
+ return true;
145
+ return typeof endereco === 'string' && endereco.startsWith(`${exports.ENDERECO_DA_RESPOSTA}:`) &&
146
+ lerReferenciaDoReply(endereco.slice(exports.ENDERECO_DA_RESPOSTA.length + 1)) !== null;
147
+ }
96
148
  /** Uma hora, a mesma janela do resumo pedido em 20/09. Vencido nao nega: so deixa de valer. */
97
149
  exports.PRAZO_PADRAO_MIN = 60;
98
150
  const sha = (s) => (0, node_crypto_1.createHash)('sha256').update(s).digest('hex');