@orkastery/cli 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/thread.js CHANGED
@@ -39,6 +39,7 @@ var __importStar = (this && this.__importStar) || (function () {
39
39
  };
40
40
  })();
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.TETO_DO_PEDIDO = exports.ARQUIVO_DO_PEDIDO = void 0;
42
43
  exports.dirThreads = dirThreads;
43
44
  exports.dirThread = dirThread;
44
45
  exports.caminhoThread = caminhoThread;
@@ -57,7 +58,12 @@ exports.avisoDeThreadSemWorktree = avisoDeThreadSemWorktree;
57
58
  exports.avisoDeWorktreeQueFalharia = avisoDeWorktreeQueFalharia;
58
59
  exports.avisoDeChaveSemCommit = avisoDeChaveSemCommit;
59
60
  exports.avisoDaWorktree = avisoDaWorktree;
61
+ exports.prepararPedido = prepararPedido;
62
+ exports.pedidoDaThread = pedidoDaThread;
60
63
  exports.novaThread = novaThread;
64
+ exports.dependenciasPendentes = dependenciasPendentes;
65
+ exports.prepararDependenciasPendentes = prepararDependenciasPendentes;
66
+ exports.prepararDependenciasDaThread = prepararDependenciasDaThread;
61
67
  exports.exigirVarianteCompativel = exigirVarianteCompativel;
62
68
  exports.blocoDaThread = blocoDaThread;
63
69
  exports.pausaNaThread = pausaNaThread;
@@ -67,20 +73,26 @@ exports.resumoDaThread = resumoDaThread;
67
73
  exports.threadsDaListagem = threadsDaListagem;
68
74
  exports.tabelaDeThreads = tabelaDeThreads;
69
75
  exports.exigirFase = exigirFase;
76
+ const worktree_local_1 = require("./worktree-local");
70
77
  const fs = __importStar(require("node:fs"));
71
78
  const path = __importStar(require("node:path"));
72
79
  const ciclos_1 = require("./ciclos");
73
80
  const modos_1 = require("./modos");
74
81
  const manifest_1 = require("./manifest");
75
82
  const slug_1 = require("./slug");
83
+ const node_crypto_1 = require("node:crypto");
76
84
  const types_1 = require("./types");
77
85
  const util_1 = require("./util");
78
86
  const ledger_1 = require("./ledger");
79
87
  const estado_thread_1 = require("./estado-thread");
80
88
  const creation_operation_store_1 = require("./creation-operation-store");
81
89
  const horario_1 = require("./horario");
90
+ const check_modo_1 = require("./check-modo");
82
91
  const maquina_1 = require("./maquina");
83
92
  const conducao_texto_1 = require("./conducao-texto");
93
+ const locale_1 = require("./locale");
94
+ const branch_de_estado_1 = require("./branch-de-estado");
95
+ const dependencias_da_worktree_1 = require("./dependencias-da-worktree");
84
96
  /** Diretorio de threads do projeto. */
85
97
  function dirThreads(raiz) {
86
98
  return path.join((0, manifest_1.dirEstado)((0, estado_thread_1.raizDoEstado)(raiz)), 'threads');
@@ -108,7 +120,7 @@ function listarIds(raiz) {
108
120
  function lerThread(raiz, id) {
109
121
  const caminho = caminhoThread(raiz, id);
110
122
  if (!fs.existsSync(caminho)) {
111
- throw new Error(`thread "${id}" nao encontrada em ${dirThreads(raiz)}`);
123
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.naoEncontrada(id, dirThreads(raiz)));
112
124
  }
113
125
  return (0, util_1.lerJson)(caminho);
114
126
  }
@@ -133,11 +145,7 @@ function carimbarBase(raiz) {
133
145
  function avisoDeThreadSemBase(thread, gravada) {
134
146
  if (thread.base.commit !== util_1.COMMIT_DESCONHECIDO)
135
147
  return null;
136
- return gravada
137
- ? `Aviso: o repositório ainda não tem commit, e a thread ${thread.id} nasceu sem base: o ship não tem de onde partir. ` +
138
- `Faça o primeiro commit, feche esta com ork thread close ${thread.id} --motivo engano --por <quem> ` +
139
- '--justificativa "aberta antes do primeiro commit" e abra outra.'
140
- : 'Aviso: o repositório ainda não tem commit, e a thread nasceria sem base: faça o primeiro commit antes de abrir a primeira thread.';
148
+ return (0, locale_1.msg)().thread.semBase(thread.id, gravada);
141
149
  }
142
150
  /** Resolve um id livre a partir do assunto normalizado (`<abbrev>-<assunto>`). */
143
151
  function idDisponivel(raiz, abbrev, assunto) {
@@ -170,9 +178,11 @@ function alvoDaWorktree(carregado, id, slug, opcoes = {}) {
170
178
  */
171
179
  function worktreePrevista(carregado, id, slug, opcoes = {}) {
172
180
  const alvo = alvoDaWorktree(carregado, id, slug, opcoes);
181
+ const base = opcoes.base ?? carregado.manifesto.worktree.base_branch;
182
+ const remoto = (0, branch_de_estado_1.exigirRemoto)(carregado.manifesto.fabrica.remoto, 'worktree');
173
183
  const refs = opcoes.branchExistente
174
184
  ? [opcoes.branchExistente]
175
- : [opcoes.base ?? carregado.manifesto.worktree.base_branch, 'HEAD'];
185
+ : [(0, branch_de_estado_1.refRemota)(remoto, base), base, 'HEAD'];
176
186
  let commit = null;
177
187
  for (const ref of refs) {
178
188
  const r = (0, util_1.exec)('git', ['rev-parse', '--verify', ref], carregado.raiz);
@@ -187,6 +197,36 @@ function worktreePrevista(carregado, id, slug, opcoes = {}) {
187
197
  : commit === null ? 'sem-commit' : branchJaExiste ? 'branch-existe' : null;
188
198
  return { ...alvo, commit, falha };
189
199
  }
200
+ /**
201
+ * Resolve a base de uma worktree nova. Com remoto configurado e presente, a fonte e sempre
202
+ * `refs/remotes/<remoto>/<base>` atualizada por um fetch explicito; a branch local pode pertencer a
203
+ * outra worktree e ficar parada indefinidamente. Repositorio sem esse remoto preserva o caso local.
204
+ */
205
+ function baseAtualDaWorktree(carregado, base) {
206
+ const { raiz, manifesto } = carregado;
207
+ const remoto = (0, branch_de_estado_1.exigirRemoto)(manifesto.fabrica.remoto, 'worktree');
208
+ const temRemoto = (0, util_1.exec)('git', ['remote', 'get-url', '--', remoto], raiz).ok;
209
+ let ref = base;
210
+ if (temRemoto) {
211
+ ref = (0, branch_de_estado_1.refRemota)(remoto, base);
212
+ const ambiente = { ...process.env, GIT_TERMINAL_PROMPT: '0',
213
+ GIT_SSH_COMMAND: process.env.GIT_SSH_COMMAND ?? 'ssh -o BatchMode=yes' };
214
+ const fetch = (0, util_1.exec)('git', ['fetch', '-q', '--no-tags', '--', remoto,
215
+ `+refs/heads/${base}:${ref}`], raiz, 120000, ambiente);
216
+ if (!fetch.ok) {
217
+ const saida = (fetch.stderr || fetch.stdout).trim().split('\n').slice(-2).join(' | ');
218
+ throw new locale_1.ErroDoCatalogo((m) => m.worktree.baseRemotaFalhou(remoto, base, saida));
219
+ }
220
+ }
221
+ const resolvida = (0, util_1.exec)('git', ['rev-parse', '--verify', ref], raiz);
222
+ if (!resolvida.ok) {
223
+ // Repositorio local ainda sem a branch do manifesto conserva a recusa historica do
224
+ // `git worktree add ... HEAD`; com remoto presente, o fetch acima ja teria recusado.
225
+ const head = (0, util_1.exec)('git', ['rev-parse', '--verify', 'HEAD'], raiz);
226
+ return { ref: 'HEAD', commit: head.ok ? head.stdout.trim() : util_1.COMMIT_DESCONHECIDO };
227
+ }
228
+ return { ref, commit: resolvida.stdout.trim() };
229
+ }
190
230
  /**
191
231
  * Cria a worktree isolada da thread (paralelismo sem colisao entre threads).
192
232
  *
@@ -196,33 +236,42 @@ function worktreePrevista(carregado, id, slug, opcoes = {}) {
196
236
  */
197
237
  function criarWorktree(carregado, id, slug, opcoes = {}) {
198
238
  const { raiz, manifesto } = carregado;
239
+ // RM-047 (P3): worktree.dir do manifesto fora da raiz só cria checkout com a confirmação desta máquina.
240
+ (0, worktree_local_1.exigirPastaDasWorktrees)(raiz, manifesto);
199
241
  const { dir, branch } = alvoDaWorktree(carregado, id, slug, opcoes);
200
242
  if (fs.existsSync(dir)) {
201
- throw new Error(`worktree ja existe em ${dir}`);
243
+ throw new locale_1.ErroDoCatalogo((m) => m.worktree.worktreeJaExisteEm(dir));
202
244
  }
203
245
  const base = opcoes.base ?? manifesto.worktree.base_branch;
204
- const commitBase = (0, util_1.exec)('git', ['rev-parse', '--verify', base], raiz);
205
- const ref = commitBase.ok ? commitBase.stdout.trim() : 'HEAD';
246
+ const resolvida = opcoes.branchExistente
247
+ ? (() => {
248
+ const r = (0, util_1.exec)('git', ['rev-parse', '--verify', opcoes.branchExistente], raiz);
249
+ if (!r.ok)
250
+ throw new locale_1.ErroDoCatalogo((m) => m.worktree.baseInexistente(opcoes.branchExistente));
251
+ return { ref: opcoes.branchExistente, commit: r.stdout.trim() };
252
+ })()
253
+ : baseAtualDaWorktree(carregado, base);
206
254
  // Fatia 2 do ensaio da 0.5.0 (P3): a pasta das worktrees que o ork cria agora nasce fora do git.
207
255
  const pastaDasWorktrees = path.dirname(dir);
208
256
  const pastaNova = !fs.existsSync(pastaDasWorktrees);
209
257
  // Branch nova (`-b`) no caso comum; branch que ja existe no ciclo `merge-branch`.
210
258
  const argumentos = opcoes.branchExistente
211
259
  ? ['worktree', 'add', dir, opcoes.branchExistente]
212
- : ['worktree', 'add', '-b', branch, dir, ref];
260
+ : ['worktree', 'add', '-b', branch, dir, resolvida.ref];
213
261
  const r = (0, util_1.exec)('git', argumentos, raiz);
214
262
  if (!r.ok) {
215
- throw new Error(`git worktree add falhou: ${(r.stderr || r.stdout).trim()}`);
263
+ const saida = (r.stderr || r.stdout).trim();
264
+ throw new locale_1.ErroDoCatalogo((m) => m.worktree.worktreeAddFalhou(saida));
216
265
  }
217
266
  if (pastaNova)
218
267
  (0, util_1.ignorarPastaNoGit)(pastaDasWorktrees, (0, estado_thread_1.raizDoEstado)(raiz));
219
268
  const lista = (0, util_1.exec)('git', ['worktree', 'list', '--porcelain'], raiz);
220
269
  const criada = lista.ok && lista.stdout.split('\n').some((l) => l.trim() === `worktree ${dir}`);
221
270
  if (!criada) {
222
- throw new Error(`worktree nao apareceu em \`git worktree list\` apos a criacao: ${dir}`);
271
+ throw new locale_1.ErroDoCatalogo((m) => m.worktree.worktreeNaoApareceu(dir));
223
272
  }
224
273
  (0, estado_thread_1.vincularEstado)(raiz, id, dir);
225
- return { dir, branch };
274
+ return { dir, branch, commit: resolvida.commit };
226
275
  }
227
276
  /**
228
277
  * Resolve `--worktree`, `--sem-worktree` e `worktree.por_thread`. As flags vencem a chave; as duas juntas, ou
@@ -232,13 +281,12 @@ function criarWorktree(carregado, id, slug, opcoes = {}) {
232
281
  function pedidoDeWorktree(flags, porThread) {
233
282
  const worktree = flags.worktree === false ? undefined : flags.worktree;
234
283
  if (typeof worktree === 'string' && !worktree.trim())
235
- throw new Error('uso: --worktree pede auto ou um diretório que já existe');
236
- if (typeof flags.semWorktree === 'string') {
237
- throw new Error(`uso: --sem-worktree não leva valor (recebeu "${flags.semWorktree}")`);
238
- }
284
+ throw new Error((0, locale_1.msg)().thread.worktreeVazia);
285
+ if (typeof flags.semWorktree === 'string')
286
+ throw new Error((0, locale_1.msg)().thread.semWorktreeComValor(flags.semWorktree));
239
287
  const semWorktree = flags.semWorktree === true;
240
288
  if (semWorktree && worktree !== undefined)
241
- throw new Error('uso: --worktree e --sem-worktree se excluem; use um dos dois');
289
+ throw new Error((0, locale_1.msg)().thread.worktreeESemWorktree);
242
290
  if (semWorktree)
243
291
  return { criar: false, dir: null, origem: 'sem-worktree' };
244
292
  if (worktree === true || worktree === 'auto')
@@ -254,13 +302,12 @@ function pedidoDeWorktree(flags, porThread) {
254
302
  function linhaDaWorktree(por, gravada, variante) {
255
303
  if (!por || (gravada && por !== 'chave'))
256
304
  return null;
257
- const verbo = gravada ? 'criada' : 'seria criada';
258
- if (por === 'chave') {
259
- return ` worktree: ${verbo} pela chave worktree.por_thread do orkastery.yaml; para criar sem ela, use --sem-worktree`;
260
- }
305
+ const m = (0, locale_1.msg)().thread;
306
+ if (por === 'chave')
307
+ return m.worktreeChave(gravada);
261
308
  if (por === 'flag')
262
- return ` worktree: ${verbo} pelo --worktree auto`;
263
- return ` worktree: ${verbo} pelo ciclo ${variante ?? 'da thread'}, que exige worktree isolada`;
309
+ return m.worktreeFlag(gravada);
310
+ return m.worktreeCiclo(gravada, variante ?? null);
264
311
  }
265
312
  /**
266
313
  * P4 do ensaio da 0.5.0: o que acontece no SHIP com a thread criada por `--sem-worktree`. O `ork ship` entrega a
@@ -271,49 +318,27 @@ function linhaDaWorktree(por, gravada, variante) {
271
318
  function avisoDeThreadSemWorktree(thread, manifesto, gravada = true) {
272
319
  const base = manifesto.worktree.base_branch;
273
320
  const branch = thread.base.branch;
274
- const inicio = gravada
275
- ? `Aviso: thread ${thread.id} sem worktree (--sem-worktree): ela trabalha na raiz do projeto`
276
- : `Aviso: sem worktree (--sem-worktree), a thread ${thread.id} trabalharia na raiz do projeto`;
277
- const ensure = `Antes do GO, ork worktree ensure ${thread.id} cria a worktree e a branch da thread`;
278
- if (thread.base.commit === util_1.COMMIT_DESCONHECIDO) {
279
- // Sem commit, nem o `ork worktree ensure` tem de onde partir: o caminho e o do aviso de thread sem base.
280
- return `${inicio}, num repositório ainda sem commit, fora de qualquer branch, e o ork ship não tem branch de origem ` +
281
- 'para entregar. Faça o primeiro commit e siga o aviso de thread sem base.';
282
- }
283
- if (branch === 'HEAD') {
284
- return `${inicio}, com o HEAD destacado, fora de qualquer branch, e o ork ship não tem branch de origem para entregar. ${ensure}.`;
285
- }
286
- if (branch !== base) {
287
- return `${inicio}, na branch ${branch}, e o ork ship entrega essa branch como estiver, com o que mais entrar nela; ` +
288
- `com --para ${branch}, a entrega vira push direto, que a policy push_direto_na_base confere. ${ensure}.`;
289
- }
321
+ const aviso = (c) => (0, locale_1.msg)().thread.avisoSemWorktree(thread.id, gravada, c);
322
+ // Sem commit, nem o `ork worktree ensure` tem de onde partir: o caminho e o do aviso de thread sem base.
323
+ if (thread.base.commit === util_1.COMMIT_DESCONHECIDO)
324
+ return aviso({ caso: 'sem-commit' });
325
+ if (branch === 'HEAD')
326
+ return aviso({ caso: 'head' });
327
+ if (branch !== base)
328
+ return aviso({ caso: 'outra', branch });
290
329
  const policy = manifesto.policies?.push_direto_na_base;
291
- const efeito = policy === 'block'
292
- ? 'o ork ship barra a entrega por push_direto_na_base (block): não há branch de thread para mergear'
293
- : policy === undefined || policy === 'off'
294
- ? 'o ork ship empurra a base direto, sem branch de thread (push_direto_na_base desligada)'
295
- : `o ork ship avisa push_direto_na_base (${policy}) e empurra a base direto, sem branch de thread`;
296
- return `${inicio}, na branch base ${base}, e ${efeito}. ${ensure}; depois do GO, os commits já estão na base e o ship não os separa.`;
330
+ return aviso({ caso: 'base', base, policy: policy === undefined ? undefined : String(policy) });
297
331
  }
298
332
  /**
299
333
  * P4 do ensaio da 0.5.0 (CHECK): no `--dry-run`, por que a criacao de verdade recusaria a worktree, em vez de preve-la.
300
334
  * O ciclo que exige worktree nao aceita `--sem-worktree`, entao a saida so e sugerida para a chave e a flag.
301
335
  */
302
336
  function avisoDeWorktreeQueFalharia(f) {
303
- const semWorktree = f.por === 'ciclo' ? '' : ' ou crie com --sem-worktree';
304
- if (f.motivo === 'pasta-existe') {
305
- return `Aviso: a pasta ${f.dir} já existe, e a criação de verdade recusaria a worktree da thread: tire a pasta${semWorktree}.`;
306
- }
307
- if (f.motivo === 'branch-existe') {
308
- return `Aviso: a branch ${f.branch} já existe, e a criação de verdade recusaria a worktree da thread: tire a branch${semWorktree}.`;
309
- }
310
- return 'Aviso: o repositório ainda não tem commit, e a criação de verdade recusaria a worktree da thread no git worktree add: ' +
311
- 'faça o primeiro commit antes.';
337
+ return (0, locale_1.msg)().thread.worktreeFalharia(f.motivo, f.dir, f.branch, f.por === 'ciclo');
312
338
  }
313
339
  /** P4 do ensaio da 0.5.0: a worktree que a chave pede nao tem de onde partir num repositorio sem commit. */
314
340
  function avisoDeChaveSemCommit(gravada) {
315
- return 'Aviso: worktree.por_thread pede a worktree da thread, mas o repositório ainda não tem commit: ' +
316
- `a thread ${gravada ? 'nasceu' : 'nasceria'} na raiz do projeto, sem worktree.`;
341
+ return (0, locale_1.msg)().thread.chaveSemCommit(gravada);
317
342
  }
318
343
  /** P4: o aviso de worktree do `ork thread new`, para o stderr, ou `null` quando nao ha o que avisar. */
319
344
  function avisoDaWorktree(origem, resultado, manifesto) {
@@ -323,11 +348,147 @@ function avisoDaWorktree(origem, resultado, manifesto) {
323
348
  return avisoDeChaveSemCommit(resultado.gravada);
324
349
  return null;
325
350
  }
351
+ /** RM-059 (T6.0): o arquivo do pedido guardado, na pasta da thread. */
352
+ exports.ARQUIVO_DO_PEDIDO = 'pedido.md';
353
+ /**
354
+ * O prompt da fase vai inteiro como UM argumento do `claude --bg`, e o Linux recusa argumento acima de
355
+ * 128 KiB (MAX_ARG_STRLEN); o pedido fica com a metade, para o template caber junto.
356
+ */
357
+ exports.TETO_DO_PEDIDO = 64 * 1024;
358
+ /** O pedido como ele vai ser guardado: sem espaco nas pontas, nao vazio e dentro do teto. */
359
+ function prepararPedido(bruto) {
360
+ const texto = bruto.trim();
361
+ if (!texto)
362
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.pedidoVazio);
363
+ const bytes = Buffer.byteLength(texto, 'utf8');
364
+ if (bytes > exports.TETO_DO_PEDIDO)
365
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.pedidoGrande(bytes, exports.TETO_DO_PEDIDO));
366
+ return { texto, meta: { arquivo: exports.ARQUIVO_DO_PEDIDO, sha256: (0, node_crypto_1.createHash)('sha256').update(texto, 'utf8').digest('hex'), bytes } };
367
+ }
368
+ /**
369
+ * RM-059 (T6.0): o pedido guardado na criacao da thread, conferido contra o sha256 gravado; `null` na
370
+ * thread criada sem pedido. Arquivo que falta ou que nao bate com o sha256 (editado fora do nucleo) e
371
+ * erro tipado: o render nunca usa um pedido sem a prova de que e o da criacao.
372
+ */
373
+ function pedidoDaThread(raiz, thread) {
374
+ const meta = thread.pedido;
375
+ if (!meta)
376
+ return null;
377
+ const restaurar = 'passe --pedido no render ou restaure o arquivo';
378
+ // O nome do arquivo e fixo: um thread.json editado nao aponta o render para outro arquivo do projeto.
379
+ if (meta.arquivo !== exports.ARQUIVO_DO_PEDIDO || !/^[a-f0-9]{64}$/.test(String(meta.sha256))) {
380
+ throw new Error(`thread.pedido.divergente: o pedido da thread ${thread.id} no thread.json nao e o que a criacao grava; ${restaurar}`);
381
+ }
382
+ const arquivo = path.join(dirThread(raiz, thread.id), exports.ARQUIVO_DO_PEDIDO);
383
+ let fd;
384
+ try {
385
+ fd = fs.openSync(arquivo, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
386
+ }
387
+ catch (e) {
388
+ if (e.code === 'ENOENT')
389
+ throw new Error(`thread.pedido.ausente: a thread ${thread.id} guardou o pedido em ${meta.arquivo} e ele sumiu; ${restaurar}`);
390
+ throw new Error(`thread.pedido.divergente: ${meta.arquivo} da thread ${thread.id} nao abre como arquivo comum; ${restaurar}`);
391
+ }
392
+ try {
393
+ const st = fs.fstatSync(fd);
394
+ if (!st.isFile() || st.size > exports.TETO_DO_PEDIDO)
395
+ throw new Error(`thread.pedido.divergente: ${meta.arquivo} da thread ${thread.id} nao e o arquivo guardado; ${restaurar}`);
396
+ const bytes = fs.readFileSync(fd);
397
+ const sha256 = (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex');
398
+ if (sha256 !== meta.sha256) {
399
+ throw new Error(`thread.pedido.divergente: ${meta.arquivo} da thread ${thread.id} nao bate com o sha256 gravado na criacao ` +
400
+ `(${(0, util_1.shaCurto)(meta.sha256)}): foi editado fora do nucleo; ${restaurar}`);
401
+ }
402
+ return { texto: bytes.toString('utf8'), sha256 };
403
+ }
404
+ finally {
405
+ fs.closeSync(fd);
406
+ }
407
+ }
408
+ /**
409
+ * Grava o pedido sem meio-termo: escreve num temporario com fsync e o liga ao nome final, que nao pode existir
410
+ * (o `link` recusa sobrescrever). Uma falha no meio nao deixa `pedido.md` pela metade.
411
+ */
412
+ function gravarPedido(dir, texto) {
413
+ fs.mkdirSync(dir, { recursive: true });
414
+ const alvo = path.join(dir, exports.ARQUIVO_DO_PEDIDO);
415
+ const temporario = path.join(dir, `.${exports.ARQUIVO_DO_PEDIDO}.${process.pid}.${Date.now()}.tmp`);
416
+ const fd = fs.openSync(temporario, 'wx', 0o600);
417
+ try {
418
+ try {
419
+ fs.writeFileSync(fd, texto, 'utf8');
420
+ fs.fsyncSync(fd);
421
+ }
422
+ finally {
423
+ fs.closeSync(fd);
424
+ }
425
+ fs.linkSync(temporario, alvo);
426
+ }
427
+ finally {
428
+ fs.rmSync(temporario, { force: true });
429
+ }
430
+ }
326
431
  /** Cria a thread: valida modo contra o manifesto, gera o slug e carimba a base. */
327
432
  function novaThread(carregado, opcoes) {
328
433
  if (opcoes.dryRun)
329
434
  return criarThreadSerializada(carregado, opcoes);
330
- return (0, creation_operation_store_1.withCreationLock)((0, estado_thread_1.raizDoEstado)(carregado.raiz), 'threads', () => criarThreadSerializada(carregado, opcoes));
435
+ const criada = (0, creation_operation_store_1.withCreationLock)((0, estado_thread_1.raizDoEstado)(carregado.raiz), 'threads', () => criarThreadSerializada(carregado, opcoes));
436
+ // RM-037 (defeito 2 de 19 e 20/10/2026): o preparo das dependencias roda depois da trava de criacao, que espera
437
+ // segundos, e nao os minutos de um `npm ci`.
438
+ if (!criada.gravada || !criada.worktreePor || !criada.thread.worktree)
439
+ return criada;
440
+ if (opcoes.adiarDependencias) {
441
+ adiarDependenciasDaThread(carregado, criada.thread.id, criada.thread.worktree);
442
+ return { ...criada, dependencias: null };
443
+ }
444
+ return { ...criada, dependencias: prepararDependenciasDaThread(carregado, criada.thread.id, criada.thread.worktree) };
445
+ }
446
+ /** RM-037 (CHECK 3 da ork-rm037defeit2): a criacao que nao pode esperar o preparo so o anota como pendente. */
447
+ function adiarDependenciasDaThread(carregado, id, dir) {
448
+ const { dependencias } = carregado.manifesto.worktree;
449
+ if (!dependencias)
450
+ return;
451
+ (0, ledger_1.registrar)(dirThread(carregado.raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeDependenciasPendentes, { dir, comando: dependencias, fonte: 'worktree.dependencias do manifesto' });
452
+ }
453
+ /**
454
+ * RM-037 (CHECK 3 da ork-rm037defeit2): a worktree `dir` tem o preparo adiado na criacao sem um preparo ok depois dele? O
455
+ * preparo que falhou nao cobre: a baseline e o verify o repetem e recusam seguir enquanto ele falhar.
456
+ */
457
+ function dependenciasPendentes(eventos, dir) {
458
+ let pendente = false;
459
+ for (const e of eventos) {
460
+ if (typeof e.dir !== 'string' || path.resolve(e.dir) !== path.resolve(dir))
461
+ continue;
462
+ if (e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeDependenciasPendentes)
463
+ pendente = true;
464
+ else if (e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeDependencias && e.ok === true)
465
+ pendente = false;
466
+ }
467
+ return pendente;
468
+ }
469
+ /**
470
+ * RM-037 (CHECK 3 da ork-rm037defeit2): roda o preparo que a criacao adiou, antes de a baseline ou o verify rodarem um
471
+ * comando, com a vez na fila pesada que eles ja seguram; `antes` so e chamado quando ha preparo a rodar (a renovacao da
472
+ * conducao pelo prazo dele), e o `executor` da operacao, quando ela traz um (o do sandbox do MCP), roda o preparo no lugar
473
+ * do executor do verify. Devolve o preparo rodado agora, ou `null` sem nada pendente; quem chama recusa a falha.
474
+ */
475
+ function prepararDependenciasPendentes(carregado, id, dir, opcoes = {}) {
476
+ if (!dependenciasPendentes((0, ledger_1.lerLedger)(dirThread(carregado.raiz, id)), dir))
477
+ return null;
478
+ opcoes.antes?.();
479
+ return prepararDependenciasDaThread(carregado, id, dir, opcoes.executor);
480
+ }
481
+ /**
482
+ * RM-037 (defeito 2 de 19 e 20/10/2026): roda `worktree.dependencias` na worktree que acabou de nascer e grava o
483
+ * resultado no ledger da thread. Sem a chave no manifesto, nada roda e nada se grava. A falha nao desfaz nada.
484
+ */
485
+ function prepararDependenciasDaThread(carregado, id, dir, executor) {
486
+ const comando = carregado.manifesto.worktree.dependencias;
487
+ if (!comando)
488
+ return null;
489
+ const preparo = (0, dependencias_da_worktree_1.prepararDependencias)(dir, comando, undefined, executor);
490
+ (0, ledger_1.registrar)(dirThread(carregado.raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeDependencias, (0, dependencias_da_worktree_1.eventoDoPreparo)(dir, preparo));
491
+ return preparo;
331
492
  }
332
493
  /**
333
494
  * I-42 (D12): variante que redesenha blocos nao cabe num modo de bloco unico e parcial.
@@ -342,21 +503,23 @@ function exigirVarianteCompativel(variante, def) {
342
503
  return;
343
504
  const [unico, ...resto] = def.blocos;
344
505
  if (unico && resto.length === 0 && unico.fases.length < types_1.FASES.length) {
345
- throw new Error(`o ciclo ${variante} redesenha os blocos e o modo ${def.tag} tem um bloco so ` +
346
- `(${unico.fases.join('-')}): crie a thread sem --ciclo ou escolha um modo de ciclo completo`);
506
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.varianteIncompativel(variante, def.tag, unico.fases.join('-')));
347
507
  }
348
508
  }
349
509
  function criarThreadSerializada(carregado, opcoes) {
350
510
  const { raiz, manifesto } = carregado;
351
511
  const permitidos = manifesto.conduction.allowed_modes;
352
512
  if (!permitidos.includes(opcoes.modo)) {
353
- throw new Error(`modo ${modos_1.MODOS[opcoes.modo].tag} fora de conduction.allowed_modes ` +
354
- `(permitidos: ${permitidos.map((m) => modos_1.MODOS[m].tag).join(', ')})`);
513
+ const tag = modos_1.MODOS[opcoes.modo].tag, lista = permitidos.map((p) => modos_1.MODOS[p].tag).join(', ');
514
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.modoNaoPermitido(tag, lista));
355
515
  }
356
516
  const assuntoBruto = (0, slug_1.normalizarAssunto)(opcoes.assunto ?? opcoes.nome);
357
517
  if (!assuntoBruto) {
358
- throw new Error(`nome "${opcoes.nome}" nao produz assunto valido (esperado [a-z0-9])`);
518
+ const nome = opcoes.nome;
519
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.nomeSemAssunto(nome));
359
520
  }
521
+ // RM-059 (T6.0): o pedido e conferido antes de qualquer gravacao, tambem no ensaio.
522
+ const pedido = opcoes.pedido !== undefined ? prepararPedido(opcoes.pedido) : null;
360
523
  const abbrev = manifesto.project.abbrev;
361
524
  const def = (0, modos_1.definicaoDoModo)(opcoes.modo);
362
525
  const variante = opcoes.variante ?? null;
@@ -368,17 +531,18 @@ function criarThreadSerializada(carregado, opcoes) {
368
531
  if (variante) {
369
532
  const dv = (0, ciclos_1.definicaoDaVariante)(variante);
370
533
  if (dv.exigeBranch && !opcoes.branch) {
371
- throw new Error(`o ciclo ${variante} parte de uma branch que ja existe: informe --branch <branch>`);
534
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.cicloExigeBranch(variante));
372
535
  }
373
- if (opcoes.branch) {
374
- const existe = (0, util_1.exec)('git', ['rev-parse', '--verify', `refs/heads/${opcoes.branch}`], raiz);
536
+ const branch = opcoes.branch;
537
+ if (branch) {
538
+ const existe = (0, util_1.exec)('git', ['rev-parse', '--verify', `refs/heads/${branch}`], raiz);
375
539
  if (!existe.ok) {
376
- throw new Error(`branch "${opcoes.branch}" nao existe neste repositorio`);
540
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.branchInexistente(branch));
377
541
  }
378
542
  }
379
543
  }
380
544
  else if (opcoes.branch) {
381
- throw new Error('--branch so vale com --ciclo merge-branch');
545
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.branchSemCiclo);
382
546
  }
383
547
  // `greenfield`, `merge-branch` e `feature-xl-faseada` exigem worktree isolada: sao os
384
548
  // ciclos que escrevem codigo em paralelo com outras threads.
@@ -419,7 +583,7 @@ function criarThreadSerializada(carregado, opcoes) {
419
583
  const slug = opcoes.slug ?? (0, slug_1.montarSlug)(abbrev, assunto, blocos[0].slugFases);
420
584
  // O override `--slug` do builder tambem passa pela regex canonica.
421
585
  if (!(0, slug_1.slugValido)(slug)) {
422
- throw new Error(`slug invalido: "${slug}" (regex canonica: ${slug_1.REGEX_SLUG.source})`);
586
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.slugInvalido(slug, slug_1.REGEX_SLUG.source));
423
587
  }
424
588
  const thread = {
425
589
  ...(origin ? { creationOrigin: origin } : {}),
@@ -442,6 +606,7 @@ function criarThreadSerializada(carregado, opcoes) {
442
606
  sessoes: [],
443
607
  ...(opcoes.exigeRuntimeDiferente === true ? { exigeRuntimeDiferente: true } : {}),
444
608
  ...(opcoes.doneWhen && opcoes.doneWhen.length > 0 ? { doneWhen: opcoes.doneWhen } : {}),
609
+ ...(pedido ? { pedido: pedido.meta } : {}),
445
610
  decisoes: [],
446
611
  claims: [],
447
612
  leases: [],
@@ -478,8 +643,9 @@ function criarThreadSerializada(carregado, opcoes) {
478
643
  const ocupadaPelaChave = pelaChave && !exigeWorktree && prevista &&
479
644
  (prevista.falha === 'pasta-existe' || prevista.falha === 'branch-existe') ? prevista : null;
480
645
  if (ocupadaPelaChave) {
481
- const qual = ocupadaPelaChave.falha === 'pasta-existe' ? `a pasta ${ocupadaPelaChave.dir}` : `a branch ${ocupadaPelaChave.branch}`;
482
- throw new Error(`${qual} já existe, e a chave worktree.por_thread pede a worktree da thread: tire-a ou crie com --sem-worktree`);
646
+ const pasta = ocupadaPelaChave.falha === 'pasta-existe';
647
+ const alvo = pasta ? ocupadaPelaChave.dir : ocupadaPelaChave.branch;
648
+ throw new locale_1.ErroDoCatalogo((m) => m.thread.ocupadaPelaChave(pasta, alvo));
483
649
  }
484
650
  let worktreeCriada = null;
485
651
  if (worktreePor) {
@@ -487,12 +653,15 @@ function criarThreadSerializada(carregado, opcoes) {
487
653
  branchExistente: opcoes.branch,
488
654
  });
489
655
  thread.worktree = worktreeCriada.dir;
490
- const commitDaBranch = (0, util_1.exec)('git', ['rev-parse', worktreeCriada.branch], raiz);
491
656
  thread.base = {
492
657
  branch: worktreeCriada.branch,
493
- commit: commitDaBranch.ok ? commitDaBranch.stdout.trim() : thread.base.commit,
658
+ commit: worktreeCriada.commit,
494
659
  };
495
660
  }
661
+ // RM-059 (T6.0): o pedido vai ao lado do thread.json, so com permissao do dono, como ele, e antes dele: o
662
+ // thread.json nunca aponta para um pedido que nao foi gravado.
663
+ if (pedido)
664
+ gravarPedido(dirThread(raiz, id), pedido.texto);
496
665
  gravarThread(raiz, thread);
497
666
  (0, ledger_1.registrar)(dirThread(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.threadCriada, {
498
667
  ...(origin ? { creationOrigin: origin } : {}),
@@ -510,6 +679,7 @@ function criarThreadSerializada(carregado, opcoes) {
510
679
  branchDeOrigem: opcoes.branch ?? null,
511
680
  maquina: thread.maquina,
512
681
  ...(thread.roadmap ? { roadmap: thread.roadmap } : {}),
682
+ ...(pedido ? { pedido: pedido.meta } : {}),
513
683
  });
514
684
  if (worktreeCriada) {
515
685
  (0, ledger_1.registrar)(dirThread(raiz, id), id, ledger_1.TIPOS_DE_EVENTO.worktreeCriada, {
@@ -552,38 +722,43 @@ function canalDaSessao(s) {
552
722
  }
553
723
  function resumoDaThread(thread, conducao) {
554
724
  const def = (0, modos_1.definicaoDoModo)(thread.modo);
725
+ const m = (0, locale_1.msg)().thread, r = m.rotulos;
726
+ // RM-061 (F2a): o rotulo vem do catalogo, na largura do locale; o valor gravado (nome, criterio) sai como esta.
727
+ const campo = (rotulo, valor) => ` ${rotulo.padEnd(m.largura)} ${valor}`;
555
728
  const linhas = [];
556
- linhas.push(` id ${thread.id}`);
557
- linhas.push(` slug ${thread.slug}`);
558
- linhas.push(` nome ${thread.nome}`);
559
- linhas.push(` modo ${def.tag} (${pausasDaThread(thread)} pausas humanas previstas)`);
560
- linhas.push(` ciclo ${thread.variante ?? 'padrao do modo'}`);
561
- linhas.push(` fase ${thread.faseAtual}`);
562
- linhas.push(` status ${thread.status}`);
563
- linhas.push(` base ${thread.base.branch} @ ${(0, util_1.shaCurto)(thread.base.commit)}`);
564
- linhas.push(` worktree ${thread.worktree ?? '(raiz do projeto)'}`);
729
+ linhas.push(campo(r.id, thread.id));
730
+ linhas.push(campo(r.slug, thread.slug));
731
+ linhas.push(campo(r.nome, thread.nome));
732
+ linhas.push(campo(r.modo, m.modo(def.tag, pausasDaThread(thread))));
733
+ linhas.push(campo(r.ciclo, thread.variante ?? m.cicloPadrao));
734
+ linhas.push(campo(r.fase, thread.faseAtual));
735
+ linhas.push(campo(r.status, m.status(thread.status)));
736
+ linhas.push(campo(r.base, `${thread.base.branch} @ ${(0, util_1.shaCurto)(thread.base.commit)}`));
737
+ linhas.push(campo(r.worktree, thread.worktree ?? m.raizDoProjeto));
565
738
  // I-36 (T17): quem passa a leitura da conducao ve a linha unica; sem ela o resumo fica como era.
566
739
  if (conducao !== undefined)
567
- linhas.push(` conducao ${conducao ? (0, conducao_texto_1.linhaDeConducao)(conducao) : 'ninguem conduz agora'}`);
740
+ linhas.push(campo(r.conducao, conducao ? (0, conducao_texto_1.linhaDeConducao)(conducao) : m.ninguemConduz));
568
741
  // I-43 (D4, viga a): a exigencia so aparece quando existe, para nao poluir o resumo
569
742
  // das threads que nao a declararam.
570
- if (thread.exigeRuntimeDiferente === true) {
571
- linhas.push(' validacao CHECK em runtime diferente do GO (exigido pela thread)');
572
- }
743
+ if (thread.exigeRuntimeDiferente === true)
744
+ linhas.push(m.validacao);
573
745
  // I-43 (D4, viga b): o criterio aparece COM o comando. Mostrar so o criterio seria
574
746
  // reproduzir a prosa do envelope numa tela nova.
575
747
  if (thread.doneWhen && thread.doneWhen.length > 0) {
576
- linhas.push(` pronto quando (${thread.doneWhen.length} criterio(s) executaveis)`);
748
+ linhas.push(m.prontoQuando(thread.doneWhen.length));
577
749
  for (const d of thread.doneWhen)
578
750
  linhas.push(` ${d.criterio}\n $ ${d.comando}`);
579
751
  }
580
752
  if (thread.score) {
581
- linhas.push(` score ${thread.score.valor}/5 por ${thread.score.avaliadoPor} ` +
582
- `(${thread.score.regime}) em ${(0, horario_1.formatarDataHoraRotulada)(thread.score.avaliadoEm)}`);
753
+ linhas.push(campo(r.score, m.score(thread.score.valor, thread.score.avaliadoPor, thread.score.regime, (0, horario_1.formatarDataHoraRotulada)(thread.score.avaliadoEm))));
754
+ }
755
+ // RM-072 (D17): o modo do ultimo CHECK, so quando a thread ja teve verify.
756
+ if (thread.check) {
757
+ linhas.push(campo(r.check, m.check(check_modo_1.NOME_DO_MODO[thread.check.modo], thread.check.origem, (0, horario_1.formatarDataHoraRotulada)(thread.check.em), (0, util_1.shaCurto)(thread.check.commit))));
583
758
  }
584
- linhas.push(' blocos previstos');
759
+ linhas.push(m.blocosPrevistos);
585
760
  for (const b of thread.blocos) {
586
- const marca = b.pausa ? `pausa prevista: ${b.pausaSobre}` : 'sem pausa humana prevista';
761
+ const marca = b.pausa ? m.pausaPrevista(m.pausaSobre(b.pausaSobre)) : m.semPausa;
587
762
  linhas.push(` ${b.slugFases.padEnd(6)} ${b.fases.join('-').padEnd(18)} ${marca}`);
588
763
  }
589
764
  return linhas.join('\n');
@@ -617,29 +792,28 @@ function threadsDaListagem(raiz, opcoes = {}) {
617
792
  /** Tabela de `ork thread list`. */
618
793
  function tabelaDeThreads(raiz, opcoes = {}) {
619
794
  const linhas = threadsDaListagem(raiz, opcoes);
795
+ // RM-061 (F3b): o texto pelo catalogo; o status (dado do `--json`) so se traduz na impressao, pelo id.
796
+ const mt = (0, locale_1.msg)().thread;
620
797
  if (linhas.length === 0) {
621
798
  // A divida paga aqui: a mensagem sugeria `--modo default`, um modo que
622
799
  // `parseModo` recusa, e e a origem provavel das 3 threads com `modo: default`
623
800
  // gravadas em disco. A sugestao agora e um modo que existe.
624
- const vazio = opcoes.todas === true
625
- ? 'Nenhuma thread em .orkastery/threads.'
626
- : 'Nenhuma thread aberta ou pausada (use --todas para ver as fechadas).';
627
- return `${vazio} Crie uma com: ork thread new "<nome>" --modo ${modos_1.ORDEM_DOS_MODOS[0]}`;
801
+ return mt.listaVazia(opcoes.todas === true, modos_1.ORDEM_DOS_MODOS[0]);
628
802
  }
629
803
  const corpo = linhas.map((l) => [
630
- l.id, l.slug, l.tag, l.fase, l.status, String(l.pausas), String(l.sessoes),
804
+ l.id, l.slug, l.tag, l.fase, mt.status(l.status), String(l.pausas), String(l.sessoes),
631
805
  ]);
632
- const t = (0, util_1.tabela)(['ID', 'SLUG', 'MODO', 'FASE', 'STATUS', 'PAUSAS', 'SESSOES'], corpo);
806
+ const t = (0, util_1.tabela)([...mt.colunasDaLista], corpo);
633
807
  if (opcoes.todas === true)
634
808
  return t;
635
809
  const fechadas = listarIds(raiz).length - linhas.length;
636
- return fechadas > 0 ? `${t}\n\n ${fechadas} fechada(s) omitida(s). Use --todas para ver todas.` : t;
810
+ return fechadas > 0 ? `${t}\n\n${mt.fechadasOmitidas(fechadas)}` : t;
637
811
  }
638
812
  /** Fase valida e pertencente ao ciclo da thread. */
639
813
  function exigirFase(thread, bruto) {
640
814
  const fase = bruto.toUpperCase();
641
815
  if (!thread.fases.includes(fase)) {
642
- throw new Error(`fase invalida: "${bruto}" (esperado uma de ${thread.fases.join(', ')})`);
816
+ throw new Error((0, locale_1.msg)().phase.faseInvalida(bruto, thread.fases.join(', ')));
643
817
  }
644
818
  return fase;
645
819
  }