@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/conducao.js CHANGED
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ErroDeConducao = exports.ESPERA_PADRAO_MS = exports.PRAZO_DA_RESERVA_MS = exports.PRAZO_DE_SESSAO_PADRAO_MS = exports.MARGEM_DO_PRAZO_MS = exports.ENV_SESSAO_CLAUDE = exports.ENV_THREAD_DO_DESPACHO = exports.ENV_IDENTIDADE_DE_DESPACHO = exports.ENV_CANAL = exports.ERRO_CANAL_DESCONHECIDO = exports.CANAIS_DE_CONDUCAO = exports.conducaoDoLease = void 0;
36
+ exports.ErroDeConducao = exports.ESPERA_PADRAO_MS = exports.PRAZO_DA_RESERVA_MS = exports.PRAZO_DE_SESSAO_PADRAO_MS = exports.MARGEM_DO_PRAZO_MS = exports.ENV_SESSAO_CLAUDE = exports.ENV_THREAD_DO_DESPACHO = exports.ENV_IDENTIDADE_DE_DESPACHO = exports.ENV_CANAL = exports.BATIDA_DA_SENTINELA_MS = exports.PRAZO_DA_PRESENCA_MS = exports.CANAL_DA_SENTINELA = exports.CONTRATO_DA_SENTINELA = exports.ERRO_CANAL_DESCONHECIDO = exports.CANAIS_DE_CONDUCAO = exports.conducaoDoLease = void 0;
37
37
  exports.validarCanal = validarCanal;
38
38
  exports.canalDoProcesso = canalDoProcesso;
39
39
  exports.ambienteDaConducao = ambienteDaConducao;
@@ -85,10 +85,13 @@ const ledger_1 = require("./ledger");
85
85
  const maquina_1 = require("./maquina");
86
86
  const thread_1 = require("./thread");
87
87
  const horario_1 = require("./horario");
88
+ const locale_1 = require("./locale");
88
89
  const util_1 = require("./util");
90
+ const procedencia_1 = require("./procedencia");
89
91
  const runtime_ambiente_1 = require("./runtime-ambiente");
90
92
  Object.defineProperty(exports, "ENV_IDENTIDADE_DE_DESPACHO", { enumerable: true, get: function () { return runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO; } });
91
93
  Object.defineProperty(exports, "ENV_THREAD_DO_DESPACHO", { enumerable: true, get: function () { return runtime_ambiente_1.ENV_THREAD_DO_DESPACHO; } });
94
+ const projeto_alvo_1 = require("./projeto-alvo");
92
95
  // ---------------------------------------------------------------------------
93
96
  // Canais (D5, D6): registro fechado, declarado pela borda.
94
97
  // ---------------------------------------------------------------------------
@@ -121,6 +124,18 @@ exports.CANAIS_DE_CONDUCAO = {
121
124
  };
122
125
  /** Codigo tipado da recusa de canal fora do registro. */
123
126
  exports.ERRO_CANAL_DESCONHECIDO = 'conducao.canal-desconhecido';
127
+ // ---------------------------------------------------------------------------
128
+ // RM-059 (F6, T6.4; DD5 do plano dos mods): a conducao pela Sentinela do Condutor. A presenca e o passo
129
+ // do condutor moram em `conducao-sentinela.ts`; as constantes ficam aqui, para quem so conhece a conducao.
130
+ // ---------------------------------------------------------------------------
131
+ /** O contrato do `ork conducao sentinela status --json`. */
132
+ exports.CONTRATO_DA_SENTINELA = 'ork.conducao-sentinela/v1';
133
+ /** A Sentinela roda na sessao do dono no Claude Code: e o canal dela, sempre. */
134
+ exports.CANAL_DA_SENTINELA = 'claude-code';
135
+ /** A presenca vale ate 3 min depois da ultima batida; vencida, o condutor externo volta a conduzir. */
136
+ exports.PRAZO_DA_PRESENCA_MS = 3 * 60 * 1000;
137
+ /** A Sentinela bate a cada 60 s: tres batidas perdidas e a presenca vence. */
138
+ exports.BATIDA_DA_SENTINELA_MS = 60 * 1000;
124
139
  /** Canal fora do registro e recusado com motivo tipado, nunca adivinhado (T9). */
125
140
  function validarCanal(bruto) {
126
141
  const canal = bruto.trim();
@@ -149,9 +164,14 @@ function canalDoProcesso(explicito, ambiente = process.env) {
149
164
  return 'hermes';
150
165
  return 'cli';
151
166
  }
152
- /** O que o despacho poe no ambiente da sessao filha: identidade, thread e canal de origem. */
167
+ /**
168
+ * O que o despacho poe no ambiente da sessao filha: identidade, thread e canal de origem. RM-052
169
+ * (fatia 2, D2): tambem neutraliza o projeto-alvo de quem despachou, porque a sessao roda dentro do
170
+ * projeto (a worktree da thread) e le o projeto pelo proprio cwd; o modo host do gateway nao a segue.
171
+ */
153
172
  function ambienteDaConducao(identidade, threadId, canal) {
154
- return { [runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO]: identidade, [runtime_ambiente_1.ENV_THREAD_DO_DESPACHO]: threadId, [exports.ENV_CANAL]: canal };
173
+ return { [runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO]: identidade, [runtime_ambiente_1.ENV_THREAD_DO_DESPACHO]: threadId, [exports.ENV_CANAL]: canal,
174
+ ...projeto_alvo_1.AMBIENTE_SEM_PROJETO_HERDADO };
155
175
  }
156
176
  /** Variavel que o Claude Code poe em cada sessao, com o UUID dela; nao vem do daemon. */
157
177
  exports.ENV_SESSAO_CLAUDE = 'CLAUDE_CODE_SESSION_ID';
@@ -219,10 +239,30 @@ function nomeDaConducao(threadId) {
219
239
  }
220
240
  /** Estados em que o runtime ja deu a sessao por encerrada. */
221
241
  const TERMINAIS = ['done', 'completed', 'exited', 'stopped', 'failed'];
242
+ /** Os eventos que sao contabilidade do proprio ork, e nao sinal de que a sessao voltou a trabalhar. */
243
+ const SO_DA_CONTABILIDADE = /^(conducao_|retry_|session_watcher_|despacho_idempotente$|varredura_acao$)/;
244
+ /**
245
+ * RM-063 (fatia 3, achado c): o observador viu a sessao num estado terminal do runtime (`done`, `failed`, `stopped`) e
246
+ * encerrou sem inferir a conclusao da fase (`session_watcher_error` com `estadoNativo`). A fase pode nao estar provada,
247
+ * mas a sessao nao executa mais nada: o lease dela cai. Vale o ultimo desses vistos, se nenhum evento da mesma sessao
248
+ * depois dele mostra trabalho (a sessao retomada por alguem).
249
+ */
250
+ function terminalVistoPeloObservador(eventos, sessionId, desde) {
251
+ let visto = null;
252
+ for (const e of eventos) {
253
+ if (e.sessionId !== sessionId || Date.parse(e.ts) < desde)
254
+ continue;
255
+ if (e.tipo === 'session_watcher_error' && typeof e.estadoNativo === 'string' && TERMINAIS.includes(e.estadoNativo))
256
+ visto = e;
257
+ else if (visto && !SO_DA_CONTABILIDADE.test(e.tipo))
258
+ visto = null;
259
+ }
260
+ return visto;
261
+ }
222
262
  /**
223
263
  * O evento que prova que a sessao dona do lease acabou: o resultado da fase dela (a prova da I-34
224
- * que o observador grava), a morte registrada, a superacao, ou a thread fechada. So conta evento
225
- * posterior ao inicio da conducao.
264
+ * que o observador grava), a morte registrada, a superacao, o estado terminal que o observador viu
265
+ * no runtime (RM-063), ou a thread fechada. So conta evento posterior ao inicio da conducao.
226
266
  */
227
267
  function fimDaSessao(eventos, lease) {
228
268
  const dono = lease.conducao?.dono;
@@ -230,7 +270,7 @@ function fimDaSessao(eventos, lease) {
230
270
  return null;
231
271
  const desde = Date.parse(lease.adquiridoEm);
232
272
  return eventos.find((e) => Date.parse(e.ts) >= desde && ((['phase_result', 'sessao_morta', 'session_superseded'].includes(e.tipo) && e.sessionId === dono.sessionId) ||
233
- ['thread_closed_admin', 'master_done'].includes(e.tipo))) ?? null;
273
+ ['thread_closed_admin', 'master_done'].includes(e.tipo))) ?? terminalVistoPeloObservador(eventos, dono.sessionId, desde);
234
274
  }
235
275
  /**
236
276
  * A leitura pura, para quem so tem os dados (o snapshot do Maestro le por um leitor confinado).
@@ -355,16 +395,49 @@ const emCurso = new Map();
355
395
  function chave(raiz, threadId) {
356
396
  return `${(0, leases_1.caminhoLease)(raiz, nomeDaConducao(threadId))}`;
357
397
  }
398
+ /**
399
+ * RM-063 (fatia 3, achado c): a consulta do claude-bg na conta do perfil da sessao (`CLAUDE_CONFIG_DIR` dele). A conta do
400
+ * processo nao lista a sessao de outro perfil, e a ausencia la nao prova nada; na conta dela, prova. `null` quando o
401
+ * perfil nao esta mais no store desta maquina (vale a consulta de sempre).
402
+ */
403
+ function consultaNaContaDoPerfil(dono, raiz) {
404
+ if (dono.runtime !== 'claude-bg' || !dono.perfil)
405
+ return null;
406
+ // Carregados na hora, como o controle nativo: a leitura da conducao nao puxa o adapter inteiro.
407
+ const { lerPerfis, perfilDeDespacho } = require('./runtime-profiles');
408
+ const { ambienteDoPerfil, consultarSessoes } = require('./adapters/claude-bg');
409
+ let perfil = null;
410
+ try {
411
+ const p = lerPerfis(raiz).perfis.find((x) => x.id === dono.perfil && x.runtime === 'claude-bg');
412
+ perfil = p ? perfilDeDespacho(p) : null;
413
+ }
414
+ catch {
415
+ return null;
416
+ }
417
+ if (!perfil?.configDir)
418
+ return null;
419
+ const r = consultarSessoes(undefined, true, ambienteDoPerfil(perfil));
420
+ if (!r.ok)
421
+ return { ok: false, estado: null, detalhe: `o runtime nao respondeu a consulta na conta do perfil ${dono.perfil}`, naConta: true };
422
+ const achada = r.sessoes.find((x) => x.sessionId === dono.sessionId);
423
+ const estado = achada ? String(achada.state ?? achada.status ?? '') : null;
424
+ return { ok: true, estado, detalhe: achada ? `estado ${estado} na conta do perfil ${dono.perfil}` : `sessao ausente da conta do perfil ${dono.perfil}`,
425
+ naConta: true };
426
+ }
358
427
  /** A consulta padrao: o controle nativo do runtime (claude-bg ou o controller do codex). */
359
428
  const consultaNativa = (dono, raiz, threadId) => {
360
429
  try {
430
+ const naConta = consultaNaContaDoPerfil(dono, raiz);
431
+ if (naConta)
432
+ return naConta;
361
433
  // Carregado na hora: o modulo de sessoes puxa o HITL inteiro, que nao pertence a leitura.
362
434
  const { controleNativo } = require('./hitl-sessions');
363
435
  const r = controleNativo(dono.runtime, raiz, threadId, dono.sessionId).consultar();
364
436
  if (!r.ok)
365
437
  return { ok: false, estado: null, detalhe: 'o runtime nao respondeu a consulta' };
366
438
  const achadas = r.sessoes.filter((s) => s.sessionId === dono.sessionId);
367
- return { ok: true, estado: achadas[0]?.estado ?? null, detalhe: achadas.length ? `estado ${achadas[0].estado}` : 'sessao ausente' };
439
+ return { ok: true, estado: achadas[0]?.estado ?? null, detalhe: achadas.length ? `estado ${achadas[0].estado}` : 'sessao ausente',
440
+ naConta: !dono.perfil };
368
441
  }
369
442
  catch (e) {
370
443
  return { ok: false, estado: null, detalhe: e.message };
@@ -405,7 +478,9 @@ function provaDeFimDaSessao(raiz, threadId, lease, pedido, anotarEstado = () =>
405
478
  anotarEstado(r.estado);
406
479
  if (r.estado && TERMINAIS.includes(r.estado))
407
480
  return { motivo: 'sessao-orfa', prova: `runtime ${dono.runtime}: ${r.detalhe}` };
408
- if (r.estado === null && !dono.perfil)
481
+ // A ausencia so prova o fim quando a consulta foi feita na conta da sessao: sem perfil, a do processo; com perfil, a
482
+ // dele (RM-063, fatia 3, achado c).
483
+ if (r.estado === null && (!dono.perfil || r.naConta === true))
409
484
  return { motivo: 'sessao-orfa', prova: `runtime ${dono.runtime}: ${r.detalhe}` };
410
485
  return null;
411
486
  }
@@ -604,9 +679,10 @@ function sucessaoAindaVale(raiz, threadId, estado) {
604
679
  // Sem resposta do runtime nao ha prova de que ela segue parada: a sucessao nao vale.
605
680
  if (!r.ok)
606
681
  return false;
607
- // S1 do CHECK 6: a sessao que sumiu do runtime, sem perfil, acabou; a mesma prova de `provaDeFimDaSessao`.
682
+ // S1 do CHECK 6: a sessao que sumiu do runtime, sem perfil (ou da conta do perfil dela), acabou; a mesma prova de
683
+ // `provaDeFimDaSessao`.
608
684
  if (r.estado === null)
609
- return !dono.perfil;
685
+ return !dono.perfil || r.naConta === true;
610
686
  return r.estado === 'blocked' || TERMINAIS.includes(r.estado);
611
687
  }
612
688
  function renovar(raiz, threadId, estado, prazoDoProximoMs, agoraMs) {
@@ -698,6 +774,7 @@ function comandoDeEsperar(threadId, pedido) {
698
774
  case 'baseline': return `ork verify ${threadId} --baseline --esperar 30`;
699
775
  case 'fix.open': return `ork fix open ${threadId} --esperar 30`;
700
776
  case 'fix.reverify': return `ork fix reverify ${threadId} --esperar 30`;
777
+ case 'branch.atualizar': return `ork conducao atualizar ${threadId} --esperar 30`;
701
778
  default: return `ork verify ${threadId} --esperar 30`;
702
779
  }
703
780
  }
@@ -711,32 +788,30 @@ function comandoDeAcompanhar(threadId, atual) {
711
788
  * aconteceu e o que fazer: o texto sai daqui e de lugar nenhum mais, e o JSON e a mesma estrutura.
712
789
  */
713
790
  function recusaDeConducao(threadId, atual, pedido, opcoes = {}) {
791
+ const m = (0, locale_1.msg)().conducao.recusa;
714
792
  const conducao = atual
715
793
  ? { ...atual, desdeLocal: (0, horario_1.formatarDataHoraRotulada)(atual.desde, opcoes), linha: (0, conducao_texto_1.linhaDeConducao)(atual, opcoes) }
716
794
  : null;
717
795
  const acoes = [
718
- { acao: 'esperar', comando: comandoDeEsperar(threadId, pedido),
719
- explicacao: 'Esperar a vez: repete este pedido e segue sozinho quando a conducao atual terminar (ate 30 min).' },
720
- { acao: 'acompanhar', comando: comandoDeAcompanhar(threadId, atual),
721
- explicacao: 'Acompanhar quem conduz, sem mexer em nada.' },
722
- { acao: 'assumir', comando: `ork conducao assumir ${threadId} --por <voce> --motivo "<por que>"`,
723
- explicacao: 'Assumir a conducao: encerra a atual pelo proprio runtime e registra no ledger quem assumiu, de qual canal e por que.' },
796
+ { acao: 'esperar', comando: comandoDeEsperar(threadId, pedido), explicacao: m.esperar },
797
+ { acao: 'acompanhar', comando: comandoDeAcompanhar(threadId, atual), explicacao: m.acompanhar },
798
+ { acao: 'assumir', comando: m.comandoAssumir(threadId),
799
+ explicacao: m.assumir },
724
800
  ];
725
801
  const linhas = [
726
- `Pedido nao executado: a thread ${threadId} ja esta sendo conduzida agora, e duas execucoes na mesma worktree ` +
727
- 'se corrompem (foi o que aconteceu em 19/09/2026).',
802
+ m.titulo(threadId),
728
803
  ];
729
804
  if (conducao) {
730
- linhas.push(` Quem conduz: canal ${conducao.canal}, ${(0, conducao_texto_1.quemConduz)(conducao)}, fase ${conducao.fase ?? '-'}, desde ${conducao.desdeLocal}.`);
805
+ linhas.push(m.quem(conducao.canal, (0, conducao_texto_1.quemConduz)(conducao), conducao.fase ?? '-', conducao.desdeLocal));
731
806
  if (conducao.promptSha256)
732
- linhas.push(` Pedido em curso: prompt sha256 ${conducao.promptSha256.slice(0, 12)}.`);
807
+ linhas.push(m.prompt(conducao.promptSha256.slice(0, 12)));
733
808
  }
734
809
  else {
735
- linhas.push(' Outra operacao esta tomando a conducao neste instante; o registro dela ainda nao apareceu.');
810
+ linhas.push(m.entrando);
736
811
  }
737
- linhas.push(` Pedido recusado: ${conducao_texto_1.NOME_DA_OPERACAO[pedido.operacao]}${pedido.fase ? ` da fase ${pedido.fase}` : ''}, pelo canal ${pedido.canal}.`);
738
- linhas.push('O que voce pode fazer:');
739
- acoes.forEach((a, i) => { linhas.push(` ${i + 1}. ${a.explicacao}`); linhas.push(` ${a.comando}`); });
812
+ linhas.push(m.pedido((0, locale_1.msg)().thread.operacoes[pedido.operacao], pedido.fase ?? null, pedido.canal));
813
+ linhas.push(m.opcoes);
814
+ acoes.forEach((a, i) => { linhas.push(m.passo(i + 1, a.explicacao)); linhas.push(` ${a.comando}`); });
740
815
  return {
741
816
  contrato: 'ork.conducao-recusa/v1',
742
817
  motivo: 'conducao.em-andamento',
@@ -752,12 +827,12 @@ function recusaDeConducao(threadId, atual, pedido, opcoes = {}) {
752
827
  * e o texto diz onde acompanhar a sessao que ja atende o pedido.
753
828
  */
754
829
  function textoDoPedidoRepetido(threadId, atual, opcoes = {}) {
830
+ // RM-061 (F2a): texto de impressao (o despacho nao o grava), no locale do comando.
831
+ const m = (0, locale_1.msg)().phase;
755
832
  return [
756
- `Pedido ja em andamento: a fase ${atual.fase ?? '-'} da thread ${threadId} roda com este mesmo prompt ` +
757
- `(sha256 ${(atual.promptSha256 ?? '').slice(0, 12)}) desde ${(0, horario_1.formatarDataHoraRotulada)(atual.desde, opcoes)}. ` +
758
- 'Nenhuma sessao nova foi aberta e nenhuma cota foi gasta.',
833
+ m.repetido(atual.fase ?? '-', threadId, (atual.promptSha256 ?? '').slice(0, 12), (0, horario_1.formatarDataHoraRotulada)(atual.desde, opcoes)),
759
834
  ` ${(0, conducao_texto_1.linhaDeConducao)(atual, opcoes)}`,
760
- ` acompanhar: ${comandoDeAcompanhar(threadId, atual)}`,
835
+ m.acompanhar(comandoDeAcompanhar(threadId, atual)),
761
836
  ].join('\n');
762
837
  }
763
838
  /** A recusa tipada como erro, para quem nao tem um resultado estruturado onde devolve-la. */
@@ -843,7 +918,8 @@ function liberarSeOrfa(raiz, threadId, opcoes = {}) {
843
918
  function estadoDaWorktree(raiz, threadId) {
844
919
  try {
845
920
  const t = (0, thread_1.lerThread)(raiz, threadId);
846
- const dir = t.worktree ?? raiz;
921
+ // RM-047 (P2): o git do handoff so roda na worktree registrada.
922
+ const dir = (0, procedencia_1.diretorioDaThread)(raiz, t);
847
923
  const head = (0, util_1.exec)('git', ['rev-parse', 'HEAD'], dir);
848
924
  const st = (0, util_1.exec)('git', ['status', '--porcelain'], dir);
849
925
  return { head: head.ok ? head.stdout.trim() : null, alterados: st.ok ? st.stdout.split('\n').filter(Boolean).slice(0, 40) : [] };
@@ -860,6 +936,68 @@ const controleNativoDoHandoff = (runtime, raiz, threadId, sessionId) => {
860
936
  parar: (s) => ctl.parar(s),
861
937
  };
862
938
  };
939
+ /**
940
+ * A fonte fixada pelo sensor contém a identidade capturada no spawn, não um PID descoberto.
941
+ * Todos os watchers, o controller e o runtime precisam estar ausentes por identidade.
942
+ * Quem chama segura a trava da condução; nenhum prazo ou heartbeat autoriza esta soltura.
943
+ */
944
+ function morteLocalDoCodex(raiz, threadId, lease) {
945
+ const dono = lease.conducao?.dono;
946
+ if (dono?.tipo !== 'sessao' || dono.runtime !== 'codex' || dono.maquina !== (0, maquina_1.nomeDaMaquina)())
947
+ return null;
948
+ try {
949
+ const t = (0, thread_1.lerThread)(raiz, threadId), sessao = t.sessoes.at(-1);
950
+ if (!sessao || sessao.sessionId !== dono.sessionId || sessao.runtime !== 'codex' || !sessao.despachadaEm ||
951
+ sessao.fase !== lease.conducao?.fase || sessao.promptSha256 !== lease.conducao?.promptSha256)
952
+ return null;
953
+ const dir = (0, thread_1.dirThread)(raiz, threadId), eventos = (0, ledger_1.lerLedger)(dir);
954
+ if (fimDaSessao(eventos, lease))
955
+ return null;
956
+ const mesmo = (e) => e.sessionId === dono.sessionId && e.despachoEm === sessao.despachadaEm;
957
+ const watchers = eventos.filter(e => e.tipo === 'session_watcher_started' && mesmo(e));
958
+ if (!watchers.length || watchers.some(watcher => {
959
+ const identidade = watcher.identidade;
960
+ return !identidade || watcher.pid !== identidade.pid || (0, codex_runner_1.estadoProcesso)(identidade) !== 'ausente';
961
+ }))
962
+ return null;
963
+ const registro = eventos.filter(e => e.tipo === 'session_sensor_registered' && mesmo(e)).at(-1);
964
+ const despacho = eventos.filter(e => e.tipo === 'phase_dispatch' && e.sessionId === dono.sessionId).at(-1);
965
+ if (!registro || typeof registro.controlador !== 'string' || typeof registro.cwd !== 'string' ||
966
+ registro.logPath || registro.processoPath || registro.reciboPath || registro.nativo ||
967
+ despacho?.controlador !== registro.controlador || despacho.cwd !== registro.cwd ||
968
+ (sessao.controlador && sessao.controlador !== registro.controlador))
969
+ return null;
970
+ const chave = (0, node_crypto_1.createHash)('sha256').update(dono.sessionId + '|' + sessao.despachadaEm).digest('hex');
971
+ const fixacao = path.join(dir, 'sessoes', `watcher-source-${chave}.json`);
972
+ // Recuperação não cria uma fonte nova nem depende do state.json mutável de um controller morto.
973
+ if (!fs.existsSync(fixacao))
974
+ return null;
975
+ const { registrarFonteController } = require('./adapters/codex-controller-sensor');
976
+ const fonte = registrarFonteController(registro.controlador, { dirSessoes: path.join(dir, 'sessoes'), fixacao,
977
+ sessionId: dono.sessionId, cwd: registro.cwd, despachoEm: sessao.despachadaEm,
978
+ vinculo: { thread: threadId, fase: sessao.fase, promptSha256: sessao.promptSha256 } });
979
+ const controller = fonte.processoController;
980
+ if (!controller || (0, codex_runner_1.estadoProcesso)({ pid: controller.pid, inicio: controller.inicio, boot: controller.bootId }) !== 'ausente')
981
+ return null;
982
+ const runtime = fonte.processoRuntime;
983
+ if (!runtime || (0, codex_runner_1.estadoProcesso)({ pid: runtime.pid, inicio: runtime.inicio, boot: runtime.bootId }) !== 'ausente')
984
+ return null;
985
+ // O watcher pode ter gravado o terminal e saído durante a prova dos processos.
986
+ if (fimDaSessao((0, ledger_1.lerLedger)(dir), lease))
987
+ return null;
988
+ return { sessionId: dono.sessionId, despachoEm: sessao.despachadaEm, fase: sessao.fase, runtime: 'codex',
989
+ origem: 'conducao.assumir', motivo: 'watchers-controlador-e-runtime-ausentes',
990
+ prova: { fonte: 'session_sensor_registered+controller-source-pin+/proc',
991
+ registroEventId: registro.eventId,
992
+ watchers: watchers.map(w => ({ eventId: w.eventId, identidade: w.identidade, estado: 'ausente' })),
993
+ controlador: { pid: controller.pid, inicio: controller.inicio, boot: controller.bootId, uid: controller.uid },
994
+ runtime: { pid: runtime.pid, inicio: runtime.inicio, boot: runtime.bootId, uid: runtime.uid },
995
+ estadoControlador: 'ausente', estadoRuntime: 'ausente' } };
996
+ }
997
+ catch {
998
+ return null;
999
+ } // Fonte ilegível, divergente ou identidade desconhecida nunca prova morte.
1000
+ }
863
1001
  /**
864
1002
  * `ork conducao assumir` (T15): encerra a conducao atual pelo mecanismo suportado do runtime, toma
865
1003
  * uma reserva curta para o canal de quem assumiu e registra quem, de qual canal e por que. Processo
@@ -873,7 +1011,8 @@ function assumirConducao(raiz, threadId, opcoes) {
873
1011
  throw new Error('conducao.assumir: informe --motivo; handoff sem razao registrada e o mesmo kill de antes, com outro nome');
874
1012
  const dir = (0, thread_1.dirThread)(raiz, threadId);
875
1013
  (0, thread_1.lerThread)(raiz, threadId);
876
- liberarSeOrfa(raiz, threadId, { consultarSessao: opcoes.consultarSessao });
1014
+ // A prova local vem antes de qualquer consulta ao runtime; ledger ainda libera sessões terminadas.
1015
+ liberarSeOrfa(raiz, threadId, { consultarRuntime: false });
877
1016
  const fd = tentarTrava(raiz, threadId);
878
1017
  if (fd === null) {
879
1018
  const atual = conducaoDaThread(raiz, threadId);
@@ -889,30 +1028,38 @@ function assumirConducao(raiz, threadId, opcoes) {
889
1028
  let prova = 'lease exec ausente';
890
1029
  if (lease && anterior?.dono.tipo === 'sessao') {
891
1030
  const dono = anterior.dono;
892
- const ctl = (opcoes.controle ?? controleNativoDoHandoff)(dono.runtime, raiz, threadId, dono.sessionId);
893
- const antes = ctl.consultar();
894
- if (!antes.ok) {
895
- return { ok: false, thread: threadId, anterior, mecanismo: 'nenhum',
896
- detalhe: 'runtime.unavailable: nao consegui consultar a sessao no runtime; nada foi encerrado e a conducao segue com ela' };
1031
+ const morte = morteLocalDoCodex(raiz, threadId, lease);
1032
+ if (morte) {
1033
+ (0, ledger_1.registrar)(dir, threadId, 'sessao_morta', morte);
1034
+ mecanismo = 'recuperação local: watchers, controlador e runtime ausentes por identidade';
1035
+ prova = 'ledger: sessao_morta com identidades capturadas e ausência conferida no kernel';
897
1036
  }
898
- const s = antes.sessoes.find((x) => x.sessionId === dono.sessionId);
899
- if (s && !TERMINAIS.includes(s.estado)) {
900
- if (!ctl.parar(s)) {
901
- return { ok: false, thread: threadId, anterior, mecanismo: `parar ${dono.runtime}`,
902
- detalhe: `runtime.unavailable: o runtime ${dono.runtime} nao confirmou o encerramento; a conducao segue com a sessao ${dono.sessionId.slice(0, 8)}` };
1037
+ else {
1038
+ const ctl = (opcoes.controle ?? controleNativoDoHandoff)(dono.runtime, raiz, threadId, dono.sessionId);
1039
+ const antes = ctl.consultar();
1040
+ if (!antes.ok) {
1041
+ return { ok: false, thread: threadId, anterior, mecanismo: 'nenhum',
1042
+ detalhe: 'runtime.unavailable: nao consegui consultar a sessao no runtime; nada foi encerrado e a conducao segue com ela' };
903
1043
  }
904
- const depois = ctl.consultar();
905
- const ainda = depois.ok ? depois.sessoes.find((x) => x.sessionId === dono.sessionId) : s;
906
- if (!depois.ok || (ainda && !TERMINAIS.includes(ainda.estado))) {
907
- return { ok: false, thread: threadId, anterior, mecanismo: `parar ${dono.runtime}`,
908
- detalhe: 'runtime.unavailable: a consulta depois do encerramento nao confirma a sessao parada; o lease foi mantido' };
1044
+ const s = antes.sessoes.find((x) => x.sessionId === dono.sessionId);
1045
+ if (s && !TERMINAIS.includes(s.estado)) {
1046
+ if (!ctl.parar(s)) {
1047
+ return { ok: false, thread: threadId, anterior, mecanismo: `parar ${dono.runtime}`,
1048
+ detalhe: `runtime.unavailable: o runtime ${dono.runtime} nao confirmou o encerramento; a conducao segue com a sessao ${dono.sessionId.slice(0, 8)}` };
1049
+ }
1050
+ const depois = ctl.consultar();
1051
+ const ainda = depois.ok ? depois.sessoes.find((x) => x.sessionId === dono.sessionId) : s;
1052
+ if (!depois.ok || (ainda && !TERMINAIS.includes(ainda.estado))) {
1053
+ return { ok: false, thread: threadId, anterior, mecanismo: `parar ${dono.runtime}`,
1054
+ detalhe: 'runtime.unavailable: a consulta depois do encerramento nao confirma a sessao parada; o lease foi mantido' };
1055
+ }
1056
+ mecanismo = `parar pelo runtime ${dono.runtime} (controle homologado)`;
1057
+ prova = `runtime: ${s.estado} -> ${ainda?.estado ?? 'ausente'}`;
1058
+ }
1059
+ else {
1060
+ mecanismo = 'nenhum: a sessao ja tinha terminado';
1061
+ prova = `runtime: ${s?.estado ?? 'sessao ausente'}`;
909
1062
  }
910
- mecanismo = `parar pelo runtime ${dono.runtime} (controle homologado)`;
911
- prova = `runtime: ${s.estado} -> ${ainda?.estado ?? 'ausente'}`;
912
- }
913
- else {
914
- mecanismo = 'nenhum: a sessao ja tinha terminado';
915
- prova = `runtime: ${s?.estado ?? 'sessao ausente'}`;
916
1063
  }
917
1064
  }
918
1065
  else if (lease && anterior?.dono.tipo === 'reserva') {
@@ -940,8 +1087,7 @@ function assumirConducao(raiz, threadId, opcoes) {
940
1087
  worktree: estadoDaWorktree(raiz, threadId),
941
1088
  });
942
1089
  return { ok: true, thread: threadId, anterior, mecanismo,
943
- detalhe: `conducao assumida por ${por} pelo canal ${opcoes.canal}; a proxima operacao desse canal usa a reserva ate ` +
944
- `${(0, horario_1.formatarDataHoraRotulada)(reserva.expiraEm)}` };
1090
+ detalhe: (0, locale_1.msg)().conducao.cli.detalheAssumida(por, opcoes.canal, (0, horario_1.formatarDataHoraRotulada)(reserva.expiraEm)) };
945
1091
  }
946
1092
  finally {
947
1093
  fs.closeSync(fd);
@@ -949,14 +1095,15 @@ function assumirConducao(raiz, threadId, opcoes) {
949
1095
  }
950
1096
  /** Texto de `ork conducao status`. */
951
1097
  function textoDoStatusDaConducao(threadId, atual) {
1098
+ const m = (0, locale_1.msg)().conducao.status;
952
1099
  if (!atual)
953
- return `Thread ${threadId}: ninguem conduz agora. Qualquer canal pode despachar ou verificar.`;
954
- const linhas = [`Thread ${threadId}: ${(0, conducao_texto_1.linhaDeConducao)(atual)}`];
1100
+ return m.livre(threadId);
1101
+ const linhas = [m.titulo(threadId, (0, conducao_texto_1.linhaDeConducao)(atual))];
955
1102
  if (atual.promptSha256)
956
- linhas.push(` prompt sha256 ${atual.promptSha256.slice(0, 12)}`);
957
- linhas.push(` prazo do lease (metadado, nao prova): ${(0, horario_1.formatarDataHoraRotulada)(atual.expiraEm)}`);
1103
+ linhas.push(m.prompt(atual.promptSha256.slice(0, 12)));
1104
+ linhas.push(m.prazo((0, horario_1.formatarDataHoraRotulada)(atual.expiraEm)));
958
1105
  if (atual.sessao)
959
- linhas.push(` acompanhar: ork sessions logs ${atual.sessao.slice(0, 8)}`);
960
- linhas.push(` assumir: ork conducao assumir ${threadId} --por <voce> --motivo "<por que>"`);
1106
+ linhas.push(m.acompanhar(atual.sessao.slice(0, 8)));
1107
+ linhas.push(m.assumir(threadId));
961
1108
  return linhas.join('\n');
962
1109
  }