@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/auditrun.js CHANGED
@@ -51,6 +51,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
51
51
  exports.PACK_DA_SUPERFICIE = exports.VERSAO_DA_RODADA = void 0;
52
52
  exports.dirAuditorias = dirAuditorias;
53
53
  exports.dirRodada = dirRodada;
54
+ exports.exigirIdDeRodada = exigirIdDeRodada;
54
55
  exports.caminhoRodada = caminhoRodada;
55
56
  exports.listarRodadas = listarRodadas;
56
57
  exports.lerRodada = lerRodada;
@@ -76,6 +77,7 @@ const adapter = __importStar(require("./adapters/claude-bg"));
76
77
  const auditoria_1 = require("./auditoria");
77
78
  const phase_1 = require("./phase");
78
79
  const policies_1 = require("./policies");
80
+ const projeto_alvo_1 = require("./projeto-alvo");
79
81
  const manifest_1 = require("./manifest");
80
82
  const ledger_1 = require("./ledger");
81
83
  const divida_1 = require("./divida");
@@ -85,6 +87,7 @@ const thread_1 = require("./thread");
85
87
  const util_1 = require("./util");
86
88
  const verify_1 = require("./verify");
87
89
  const horario_1 = require("./horario");
90
+ const locale_1 = require("./locale");
88
91
  /** Versao do formato de `run.json`. */
89
92
  exports.VERSAO_DA_RODADA = 1;
90
93
  /** Diretorio das rodadas de auditoria do projeto. */
@@ -93,7 +96,17 @@ function dirAuditorias(raiz) {
93
96
  }
94
97
  /** Diretorio de uma rodada. */
95
98
  function dirRodada(raiz, id) {
96
- return path.join(dirAuditorias(raiz), id);
99
+ return path.join(dirAuditorias(raiz), exigirIdDeRodada(id));
100
+ }
101
+ /**
102
+ * RM-047 (fronteira de confiança): o id da rodada vira nome de pasta e de relatório, e o `run.json` que o
103
+ * traz pode ter vindo do clone. Um segmento só, como o que `novoIdDeRodada` gera, sem `/` nem `..`.
104
+ */
105
+ function exigirIdDeRodada(id) {
106
+ if (typeof id !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(id) || id.includes('..')) {
107
+ throw new Error(`audit.rodada-invalida: id de rodada ${JSON.stringify(String(id)).slice(0, 60)} não é um nome simples`);
108
+ }
109
+ return id;
97
110
  }
98
111
  /** Caminho do `run.json` da rodada. */
99
112
  function caminhoRodada(raiz, id) {
@@ -372,6 +385,9 @@ function rodarAuditoria(carregado, pack, opcoes = {}) {
372
385
  cwd: raiz,
373
386
  model: base.custo.model,
374
387
  effort,
388
+ // RM-052 (fatia 2, D2, aviso A1 do CHECK): a sessao da auditoria roda na raiz do projeto e le o
389
+ // projeto pelo proprio cwd; o `ORK_PROJETO` e o modo host de quem chamou (ou do daemon) nao a seguem.
390
+ ambienteExtra: { ...projeto_alvo_1.AMBIENTE_SEM_PROJETO_HERDADO },
375
391
  });
376
392
  if (!resultado.ok || !resultado.sessionId) {
377
393
  const rodada = {
@@ -724,7 +740,7 @@ function relatorioDaRodada(carregado, rodadaId, opcoes = {}) {
724
740
  (0, util_1.gravar)(caminho, texto);
725
741
  let publicado = null;
726
742
  if (opcoes.publicar) {
727
- publicado = path.join(raiz, 'docs', 'audit', `${rodada.id}.md`);
743
+ publicado = path.join(raiz, 'docs', 'audit', `${exigirIdDeRodada(rodada.id)}.md`);
728
744
  (0, util_1.gravar)(publicado, texto);
729
745
  }
730
746
  rodada.status = 'relatada';
@@ -744,9 +760,10 @@ function relatorioDaRodada(carregado, rodadaId, opcoes = {}) {
744
760
  // ---------------------------------------------------------------------------
745
761
  /** Tabela de `ork audit list`. */
746
762
  function tabelaDeRodadas(raiz) {
763
+ const m = (0, locale_1.msg)().audit.rodadas;
747
764
  const ids = listarRodadas(raiz);
748
765
  if (ids.length === 0) {
749
- return 'Nenhuma rodada de auditoria em .orkastery/audits. Rode: ork audit run <pack>';
766
+ return m.vazia;
750
767
  }
751
768
  const linhas = ids.map((id) => {
752
769
  const r = lerRodada(raiz, id);
@@ -758,92 +775,93 @@ function tabelaDeRodadas(raiz) {
758
775
  r.status,
759
776
  r.motivo ?? '-',
760
777
  String(r.achados.length),
761
- r.veredito ? (r.veredito.ok ? 'sustentado' : 'REPROVADO') : 'nao verificado',
778
+ r.veredito ? (r.veredito.ok ? m.sustentado : m.reprovado) : m.naoVerificado,
762
779
  r.escopo.since ?? 'total',
763
780
  ];
764
781
  });
765
- return (0, util_1.tabela)(['RODADA', 'PACK', 'PERFIL', 'ESTAGIO', 'STATUS', 'MOTIVO', 'ACHADOS', 'CLAIMS', 'ESCOPO'], linhas);
782
+ return (0, util_1.tabela)([...m.cabecalho], linhas);
766
783
  }
767
784
  /** Texto de `ork audit show`. */
768
785
  function textoDaRodada(raiz, id) {
769
786
  const r = lerRodada(raiz, id);
770
787
  const achados = (0, divida_1.achadosDaRodada)(raiz, id);
771
788
  const L = [];
772
- L.push(`Rodada de auditoria ${r.id}`);
773
- L.push(` pack ${r.pack} (${auditoria_1.PACKS[r.pack].titulo})`);
774
- L.push(` produto ${r.produto} (perfil ${r.perfil})`);
775
- L.push(` estagio ${r.estagio}, postura ${r.postura}`);
776
- L.push(` escopo ${r.escopo.detalhe}`);
777
- L.push(` graphify ${r.escopo.graphify}`);
778
- L.push(` custo effort ${r.custo.effort}, model ${r.custo.model}`);
779
- L.push(` janela ${r.custo.janela.detalhe}`);
789
+ const m = (0, locale_1.msg)().audit.rodadas;
790
+ L.push(m.titulo(r.id));
791
+ L.push(m.campo(m.campos.pack, `${r.pack} (${auditoria_1.PACKS[r.pack].titulo})`));
792
+ L.push(m.campo(m.campos.produto, `${r.produto} ${m.perfil(r.perfil)}`));
793
+ L.push(m.campo(m.campos.estagio, `${r.estagio}, ${m.postura(r.postura)}`));
794
+ L.push(m.campo(m.campos.escopo, r.escopo.detalhe));
795
+ L.push(m.campo(m.campos.graphify, r.escopo.graphify));
796
+ L.push(m.campo(m.campos.custo, m.custo(r.custo.effort, r.custo.model)));
797
+ L.push(m.campo(m.campos.janela, r.custo.janela.detalhe));
780
798
  if (r.custo.autorizadaPor)
781
- L.push(` autorizada fora da janela por ${r.custo.autorizadaPor}`);
782
- L.push(` runtime ${r.runtime}, sessao ${r.sessionId ?? '(nao despachada)'}`);
783
- L.push(` prompt ${r.promptPath} (sha256 ${r.promptSha256 || '(nao montado)'})`);
784
- L.push(` status ${r.status}${r.motivo ? ` (motivo tipado: ${r.motivo})` : ''}`);
799
+ L.push(m.campo(m.campos.autorizada, m.autorizada(r.custo.autorizadaPor)));
800
+ L.push(m.campo(m.campos.runtime, `${r.runtime}, ${m.detalhes.sessao(r.sessionId ?? m.sessaoAusente)}`));
801
+ L.push(m.campo(m.campos.prompt, `${r.promptPath} (sha256 ${r.promptSha256 || m.promptAusente})`));
802
+ L.push(m.campo(m.campos.status, `${r.status}${r.motivo ? ` ${m.motivo(r.motivo)}` : ''}`));
785
803
  if (r.superficie) {
786
- L.push(` superficie ${r.superficie.detalhe}`);
787
- L.push(` registrados ${r.superficie.registrados}, a confirmar ${r.superficie.aConfirmar}, ` +
788
- `frameworks: ${r.superficie.frameworks.join(', ') || '(nenhum reconhecido)'}`);
804
+ L.push(m.campo(m.campos.superficie, r.superficie.detalhe));
805
+ L.push(` ${m.superficieResumo(r.superficie.registrados, r.superficie.aConfirmar, r.superficie.frameworks.join(', ') || m.nenhumFramework)}`);
789
806
  }
790
807
  if (r.detalhe)
791
- L.push(` detalhe ${r.detalhe}`);
808
+ L.push(m.campo(m.campos.detalhe, r.detalhe));
792
809
  L.push('');
793
- L.push(` Achados (${achados.length}):`);
810
+ L.push(m.achados(achados.length));
794
811
  if (achados.length === 0)
795
- L.push(' (nenhum achado registrado nesta rodada ainda)');
812
+ L.push(m.nenhumAchado);
796
813
  for (const a of achados)
797
814
  L.push((0, divida_1.textoDoAchado)(a));
798
815
  L.push('');
799
816
  if (r.veredito) {
800
- L.push(` Claims do auditor: ${r.veredito.ok ? 'SUSTENTADAS' : 'REPROVADAS'} ` +
801
- `(motivos: ${r.veredito.motivos.join(', ') || 'nenhum'}) no HEAD ${(0, util_1.shaCurto)(r.veredito.commit)}`);
817
+ L.push(m.claims(r.veredito.ok, r.veredito.motivos.join(', '), (0, util_1.shaCurto)(r.veredito.commit)));
802
818
  }
803
819
  else {
804
- L.push(` Claims do auditor: NAO verificadas. Rode: ork audit verify ${r.id}`);
820
+ L.push(m.claimsPendentes(r.id));
805
821
  }
806
822
  L.push('');
807
- L.push(` Relatorio com o bloco de propostas: ork audit report ${r.id}`);
823
+ L.push(m.relatorio(r.id));
808
824
  return L.join('\n');
809
825
  }
810
826
  /** Ledger de uma rodada, para `ork audit show --ledger`. */
811
827
  function tabelaDoLedgerDaRodada(raiz, id) {
828
+ const m = (0, locale_1.msg)().audit.rodadas;
812
829
  lerRodada(raiz, id);
813
830
  const eventos = (0, ledger_1.lerLedger)(dirRodada(raiz, id));
814
831
  if (eventos.length === 0)
815
- return `Ledger vazio para a rodada ${id}.`;
832
+ return m.ledgerVazio(id);
816
833
  const linhas = eventos.map((e) => {
817
834
  const detalhe = [];
818
835
  if (e.pack)
819
836
  detalhe.push(String(e.pack));
820
837
  if (e.achado)
821
- detalhe.push(`achado ${String(e.achado)}`);
838
+ detalhe.push(m.detalhes.achado(String(e.achado)));
822
839
  if (e.motivo)
823
- detalhe.push(`motivo ${String(e.motivo)}`);
840
+ detalhe.push(m.detalhes.motivo(String(e.motivo)));
824
841
  if (e.sessionId)
825
- detalhe.push(`sessao ${String(e.sessionId).slice(0, 8)}`);
842
+ detalhe.push(m.detalhes.sessao(String(e.sessionId).slice(0, 8)));
826
843
  if (e.veredito)
827
- detalhe.push(`veredito: ${String(e.veredito)}`);
844
+ detalhe.push(m.detalhes.veredito(String(e.veredito)));
828
845
  if (e.destino)
829
- detalhe.push(`destino ${String(e.destino)}`);
846
+ detalhe.push(m.detalhes.destino(String(e.destino)));
830
847
  // `e.thread` e o dono do evento, que aqui e a propria rodada: so vale imprimir quando
831
848
  // for OUTRO id, que e o caso do evento finding_to_thread.
832
849
  if (e.thread && e.thread !== id)
833
- detalhe.push(`thread ${String(e.thread)}`);
850
+ detalhe.push(m.detalhes.thread(String(e.thread)));
834
851
  if (e.detalhe)
835
852
  detalhe.push((0, horario_1.localizarTexto)(String(e.detalhe)).slice(0, 90));
836
853
  return [(0, horario_1.formatarDataHora)(e.ts, { segundos: true }), e.tipo, detalhe.join(' | ')];
837
854
  });
838
- return `${(0, util_1.tabela)(['QUANDO', 'EVENTO', 'DETALHE'], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
855
+ return `${(0, util_1.tabela)([...m.ledgerCabecalho], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
839
856
  }
840
857
  /** Quantos achados abertos existem por pack, para o resumo do CLI. */
841
858
  function resumoDoBoard(raiz) {
859
+ const m = (0, locale_1.msg)().audit.rodadas;
842
860
  const board = (0, divida_1.lerBoard)(raiz);
843
861
  if (board.length === 0)
844
- return 'board de divida vazio';
862
+ return m.boardVazio;
845
863
  const abertos = board.filter((a) => a.estado === 'aberto').length;
846
- return `${board.length} achado(s) no board de divida, ${abertos} aberto(s)`;
864
+ return m.board(board.length, abertos);
847
865
  }
848
866
  /**
849
867
  * Abre a thread que nasce de um achado de auditoria.
@@ -857,7 +875,10 @@ function resumoDoBoard(raiz) {
857
875
  function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
858
876
  const { raiz, manifesto } = carregado;
859
877
  const achado = (0, divida_1.exigirAchado)(raiz, achadoId);
860
- const pedido = (0, divida_1.pedidoDoAchado)(achado);
878
+ // RM-061 F3c: o pedido vai a arquivo (pedido-goal.md e achado.json) e vira o --prompt do GOAL: e dado, na lingua
879
+ // declarada do dono, nunca na de quem roda nem conforme o --json. So o resultado impresso segue o locale ativo.
880
+ const pedido = (0, locale_1.comLocale)((0, locale_1.linguaDeclaradaDoDono)(manifesto.owner?.language), () => (0, divida_1.pedidoDoAchado)(achado));
881
+ const m = (0, locale_1.msg)().thread.fromFinding;
861
882
  if (achado.estado === 'virou-thread' && achado.thread) {
862
883
  return {
863
884
  ok: false,
@@ -865,8 +886,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
865
886
  thread: null,
866
887
  pedido,
867
888
  motivo: 'achado.ja-virou-thread',
868
- detalhe: `o achado ${achado.id} ja originou a thread ${achado.thread}`,
869
- correcao: `continue naquela thread: ork thread status ${achado.thread}`,
889
+ detalhe: m.jaVirouThread(achado.id, achado.thread),
890
+ correcao: m.continueNaThread(achado.thread),
870
891
  };
871
892
  }
872
893
  if (achado.claim.estado === 'pendente') {
@@ -876,9 +897,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
876
897
  thread: null,
877
898
  pedido,
878
899
  motivo: 'claims.failed',
879
- detalhe: `a claim ${achado.claim.id} do achado ainda nao foi reexecutada no HEAD real: ` +
880
- 'o auditor nao tem direito a self-report',
881
- correcao: `prove o achado antes de abrir trabalho: ork audit verify ${achado.rodada}`,
900
+ detalhe: m.claimPendente(achado.claim.id),
901
+ correcao: m.proveOAchado(achado.rodada),
882
902
  };
883
903
  }
884
904
  if (achado.claim.estado === 'reprovado') {
@@ -888,8 +908,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
888
908
  thread: null,
889
909
  pedido,
890
910
  motivo: 'claims.failed',
891
- detalhe: `a claim ${achado.claim.id} do achado REPROVOU na reexecucao no HEAD real`,
892
- correcao: 'o achado nao se sustenta: corrija a evidencia na rodada, ou descarte o achado, em vez de abrir thread sobre ele',
911
+ detalhe: m.claimReprovada(achado.claim.id),
912
+ correcao: m.descarteOAchado,
893
913
  };
894
914
  }
895
915
  const modo = opcoes.modo ?? manifesto.conduction.default_mode;
@@ -913,7 +933,7 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
913
933
  worktreePor,
914
934
  worktreeFalharia,
915
935
  motivo: null,
916
- detalhe: 'simulacao (--dry-run): nenhuma thread e nenhum carimbo no board foram gravados',
936
+ detalhe: m.simulacaoDetalhe,
917
937
  correcao: '',
918
938
  };
919
939
  }
@@ -974,8 +994,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
974
994
  worktreePor,
975
995
  motivo: achado.claim.estado === 'nao-verificavel' ? 'claims.unverifiable' : null,
976
996
  detalhe: achado.claim.estado === 'nao-verificavel'
977
- ? `AVISO: a claim ${achado.claim.id} do achado nao tem comando de verificacao (motivo tipado claims.unverifiable, que avisa e nao bloqueia)`
978
- : `achado ${achado.id} aberto como thread ${thread.id}, com a evidencia e a claim junto`,
997
+ ? m.claimSemComando(achado.claim.id)
998
+ : m.achadoAberto(achado.id, thread.id),
979
999
  correcao: '',
980
1000
  };
981
1001
  }
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PRAZO_MAXIMO_DIAS = exports.ACOES_DA_AUTORIZACAO = exports.ARQUIVO_DA_AUTORIZACAO = exports.CONTRATO_DA_AUTORIZACAO = void 0;
37
+ exports.caminhoDaAutorizacao = caminhoDaAutorizacao;
38
+ exports.lerAutorizacao = lerAutorizacao;
39
+ exports.autorizada = autorizada;
40
+ exports.referenciaDaAutorizacao = referenciaDaAutorizacao;
41
+ exports.linhaDaAutorizacao = linhaDaAutorizacao;
42
+ exports.prazoDoPedido = prazoDoPedido;
43
+ exports.gravarAutorizacao = gravarAutorizacao;
44
+ exports.textoDaAutorizacao = textoDaAutorizacao;
45
+ /**
46
+ * RM-063 (F5): a autorizacao duravel do dono para a varredura agir sozinha nesta maquina.
47
+ *
48
+ * Incidente de 03 a 12/10/2026 (P4 e P5 da pagina da RM-063): o PR #112 foi mesclado e ficou dois dias sem
49
+ * `ork ship registrar-pr`, e as sessoes fantasmas de threads fechadas ficaram registradas, porque nada roda esses
50
+ * comandos sem um condutor. Agora a batida da varredura (`pulse-delivery`) faz isso sozinha, mas SO com a autorizacao
51
+ * do dono gravada nesta maquina, com prazo e com a lista do que ela pode. Sem autorizacao (ou com ela vencida,
52
+ * ilegivel, de outra maquina ou de outro projeto), cada acao vira um item da fila do pulse com o comando pronto.
53
+ *
54
+ * O arquivo e desta maquina e fica fora do git, como o `pulse-host.json` (RM-047):
55
+ * `.orkastery/monitor/autorizacao.json` no checkout canonico. O contrato e `ork.autorizacao-duravel/v1`; a referencia
56
+ * esta em `docs/referencia/contratos/autorizacao-duravel-rm063.md`. A leitura (`lerAutorizacao`) nunca grava; a F7
57
+ * grava pelo `ork conducao autorizar` (`gravarAutorizacao`), ato do dono, na mesma forma que a leitura confere.
58
+ */
59
+ const fs = __importStar(require("node:fs"));
60
+ const path = __importStar(require("node:path"));
61
+ const node_crypto_1 = require("node:crypto");
62
+ const estado_thread_1 = require("./estado-thread");
63
+ const horario_1 = require("./horario");
64
+ const ledger_1 = require("./ledger");
65
+ const master_1 = require("./master");
66
+ const master_nota_1 = require("./master-nota");
67
+ const maquina_1 = require("./maquina");
68
+ const procedencia_1 = require("./procedencia");
69
+ const runtime_ambiente_1 = require("./runtime-ambiente");
70
+ const util_1 = require("./util");
71
+ const locale_1 = require("./locale");
72
+ exports.CONTRATO_DA_AUTORIZACAO = 'ork.autorizacao-duravel/v1';
73
+ exports.ARQUIVO_DA_AUTORIZACAO = 'autorizacao.json';
74
+ /** Um arquivo de autorizacao tem poucas linhas; acima disto, nao e o que o dono gravou. */
75
+ const TETO_DO_ARQUIVO = 64 * 1024;
76
+ /**
77
+ * As acoes do contrato. A varredura da F5 faz `limpar` (sessoes fantasmas), `registrar` (a entrega de PR ja mesclado)
78
+ * e `master` (o MASTER por omissao); a batida da conducao da F7 (`ork conducao batida`) faz tambem `merge` (o PR verde de
79
+ * branch `ork/*`) e `despachar` (a fase seguinte com o prompt gravado). Tag e publicacao nunca entram.
80
+ */
81
+ exports.ACOES_DA_AUTORIZACAO = ['limpar', 'registrar', 'master', 'merge', 'despachar'];
82
+ /** O arquivo da autorizacao desta maquina, no checkout canonico (de dentro de uma worktree, o da raiz). */
83
+ function caminhoDaAutorizacao(raiz) {
84
+ return path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery', 'monitor', exports.ARQUIVO_DA_AUTORIZACAO);
85
+ }
86
+ /** A data e a hora existem no calendario (o `Date.parse` aceitaria 30/02 e o levaria a marco, calado). */
87
+ const noCalendario = (v) => {
88
+ const m = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/.exec(v);
89
+ if (!m)
90
+ return false;
91
+ const [ano, mes, dia, hora, minuto] = m.slice(1).map(Number);
92
+ const d = new Date(Date.UTC(ano, mes - 1, dia));
93
+ return d.getUTCFullYear() === ano && d.getUTCMonth() === mes - 1 && d.getUTCDate() === dia && hora <= 23 && minuto <= 59;
94
+ };
95
+ /** O instante com o fuso explicito (`Z` ou `-03:00`): sem ele, o prazo dependeria do fuso de quem le. */
96
+ const instante = (v) => typeof v === 'string' &&
97
+ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?(Z|[+-]\d{2}:\d{2})$/.test(v) && noCalendario(v) &&
98
+ Number.isFinite(Date.parse(v));
99
+ const textoCurto = (v, teto) => typeof v === 'string' && v.trim() !== '' && v.length <= teto &&
100
+ !/\p{Cc}/u.test(v);
101
+ /**
102
+ * Le e confere a autorizacao desta maquina. Cada recusa tem motivo tipado e detalhe; so a valida, no prazo, desta
103
+ * maquina e deste projeto, autoriza alguma coisa.
104
+ */
105
+ function lerAutorizacao(raiz, opcoes) {
106
+ const arquivo = caminhoDaAutorizacao(raiz);
107
+ const recusa = (motivo, detalhe, autorizacao) => ({ valida: false, arquivo, motivo, detalhe, ...(autorizacao ? { autorizacao } : {}) });
108
+ const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
109
+ if (!st)
110
+ return recusa('autorizacao.ausente', 'nenhuma autorizacao duravel gravada nesta maquina');
111
+ // RM-047: como o transporte do pulse, a autorizacao so vale do arquivo local desta maquina.
112
+ if (!st.isFile())
113
+ return recusa('autorizacao.rastreada', 'a autorizacao precisa ser um arquivo comum desta maquina, nao link nem diretorio');
114
+ if ((0, procedencia_1.rastreadoPeloGit)(raiz, arquivo))
115
+ return recusa('autorizacao.rastreada', 'a autorizacao esta versionada no git; ela so vale do arquivo local desta maquina');
116
+ if (st.size > TETO_DO_ARQUIVO)
117
+ return recusa('autorizacao.ilegivel', `o arquivo passa de ${TETO_DO_ARQUIVO} bytes`);
118
+ let bruto, dado;
119
+ try {
120
+ bruto = fs.readFileSync(arquivo, 'utf8');
121
+ const lido = JSON.parse(bruto);
122
+ if (!lido || typeof lido !== 'object' || Array.isArray(lido))
123
+ throw new Error('nao e um objeto JSON');
124
+ dado = lido;
125
+ }
126
+ catch (e) {
127
+ return recusa('autorizacao.ilegivel', `o arquivo nao e JSON valido (${e.message.slice(0, 120)})`);
128
+ }
129
+ if (dado.contrato !== exports.CONTRATO_DA_AUTORIZACAO)
130
+ return recusa('autorizacao.contrato', `o contrato precisa ser ${exports.CONTRATO_DA_AUTORIZACAO}`);
131
+ for (const [campo, teto] of [['maquina', 80], ['projeto', 80], ['por', 120]]) {
132
+ if (!textoCurto(dado[campo], teto))
133
+ return recusa('autorizacao.campo', `o campo ${campo} precisa ser texto de ate ${teto} caracteres`);
134
+ }
135
+ // A autoria e a mesma regra da nota do MASTER: nome de agente, de runtime ou generico nao autoriza nada.
136
+ if (!(0, master_1.autoriaHumana)(dado.por)) {
137
+ return recusa('autorizacao.campo', 'o campo por precisa nomear a pessoa que autorizou; agente, runtime ou nome generico nao autoriza');
138
+ }
139
+ for (const campo of ['concedidaEm', 'ate']) {
140
+ if (!instante(dado[campo])) {
141
+ return recusa('autorizacao.campo', `o campo ${campo} precisa ser um instante ISO com fuso (Z ou -03:00), como 2026-10-18T23:59:00-03:00`);
142
+ }
143
+ }
144
+ if (dado.nota !== undefined && !textoCurto(dado.nota, 300))
145
+ return recusa('autorizacao.campo', 'a nota precisa ser texto de ate 300 caracteres');
146
+ const pode = dado.pode;
147
+ if (!Array.isArray(pode) || pode.length === 0 || pode.some((a) => typeof a !== 'string') || new Set(pode).size !== pode.length) {
148
+ return recusa('autorizacao.campo', 'o campo pode precisa ser uma lista de acoes, sem repeticao');
149
+ }
150
+ const desconhecida = pode.find((a) => !exports.ACOES_DA_AUTORIZACAO.includes(a));
151
+ if (desconhecida !== undefined) {
152
+ return recusa('autorizacao.acao-desconhecida', `a acao ${JSON.stringify(desconhecida)} nao e do contrato (${exports.ACOES_DA_AUTORIZACAO.join(', ')})`);
153
+ }
154
+ const autorizacao = {
155
+ contrato: exports.CONTRATO_DA_AUTORIZACAO, maquina: dado.maquina, projeto: dado.projeto, por: dado.por,
156
+ concedidaEm: dado.concedidaEm, ate: dado.ate, pode: pode,
157
+ ...(typeof dado.nota === 'string' ? { nota: dado.nota } : {}),
158
+ };
159
+ const maquina = opcoes.maquina ?? (0, maquina_1.nomeDaMaquina)();
160
+ if (autorizacao.maquina !== maquina) {
161
+ return recusa('autorizacao.outra-maquina', `a autorizacao e da maquina ${autorizacao.maquina}, e esta e ${maquina}`, autorizacao);
162
+ }
163
+ if (autorizacao.projeto !== opcoes.projeto) {
164
+ return recusa('autorizacao.outro-projeto', `a autorizacao e do projeto ${autorizacao.projeto}, e este e ${opcoes.projeto}`, autorizacao);
165
+ }
166
+ const agora = opcoes.agora ?? new Date();
167
+ if (Date.parse(autorizacao.ate) <= agora.getTime()) {
168
+ return recusa('autorizacao.expirada', `o prazo acabou em ${(0, horario_1.formatarDataHoraRotulada)(autorizacao.ate, { agora: agora.toISOString() })}`, autorizacao);
169
+ }
170
+ return { valida: true, arquivo, autorizacao, sha256: (0, node_crypto_1.createHash)('sha256').update(bruto, 'utf8').digest('hex') };
171
+ }
172
+ /** A acao esta autorizada agora? */
173
+ function autorizada(leitura, acao) {
174
+ return leitura.valida && leitura.autorizacao.pode.includes(acao);
175
+ }
176
+ /** A referencia que vai ao ledger com cada acao feita: quem autorizou, ate quando e qual arquivo. */
177
+ function referenciaDaAutorizacao(leitura) {
178
+ if (!leitura.valida)
179
+ return null;
180
+ const a = leitura.autorizacao;
181
+ return { contrato: a.contrato, por: a.por, ate: a.ate, pode: a.pode, sha256: leitura.sha256, ...(a.nota ? { nota: a.nota } : {}) };
182
+ }
183
+ /** Uma linha para o `ork fabrica batida status` e para o pulse. */
184
+ function linhaDaAutorizacao(leitura, agora = new Date().toISOString()) {
185
+ const m = (0, locale_1.msg)().conducao.autorizacao;
186
+ if (leitura.valida) {
187
+ const a = leitura.autorizacao;
188
+ return m.linhaValida(a.por, (0, horario_1.formatarDataHoraRotulada)(a.ate, { agora }), a.pode.join(', '));
189
+ }
190
+ if (leitura.motivo === 'autorizacao.ausente') {
191
+ return m.linhaAusente;
192
+ }
193
+ return m.linhaInvalida(leitura.motivo, leitura.detalhe);
194
+ }
195
+ // ---------------------------------------------------------------------------
196
+ // RM-063 (F7): a gravacao, pelo `ork conducao autorizar`.
197
+ // ---------------------------------------------------------------------------
198
+ /** O que nunca entra na autorizacao duravel, nem com o nome que o dono der: fica sempre com ele. */
199
+ const ACOES_PROIBIDAS = ['tag', 'tags', 'publicar', 'publicacao', 'publicação', 'release', 'publish', 'npm', 'versao', 'versão'];
200
+ /**
201
+ * O prazo mais longo que uma autorizacao pode ter: o dono renova quando quiser, e a permissao esquecida nao vale para
202
+ * sempre.
203
+ */
204
+ exports.PRAZO_MAXIMO_DIAS = 31;
205
+ /**
206
+ * O prazo do `--ate`, sempre com o fuso escrito. Instante com fuso vale como veio; so a data vale ate 23:59 dela no fuso
207
+ * do dono; data e hora sem fuso, no fuso do dono. O resto e recusado: o prazo nao e adivinhado.
208
+ */
209
+ function prazoDoPedido(bruto, fuso) {
210
+ const v = bruto.trim();
211
+ if (instante(v))
212
+ return v;
213
+ const m = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2}))?$/.exec(v);
214
+ const nome = (0, horario_1.normalizarFuso)(fuso);
215
+ if (!m || !nome)
216
+ return null;
217
+ const hora = m[4] ? Number(m[4]) : 23, minuto = m[5] ? Number(m[5]) : 59;
218
+ if (hora > 23 || minuto > 59)
219
+ return null;
220
+ const ms = (0, horario_1.instanteNoFuso)(Number(m[1]), Number(m[2]), Number(m[3]), hora, minuto, nome);
221
+ return Number.isFinite(ms) ? (0, horario_1.isoComFuso)(ms, nome) : null;
222
+ }
223
+ /** O `user.name` do git do checkout, quando nomeia uma pessoa. */
224
+ function autorDoGit(raiz) {
225
+ const r = (0, util_1.exec)('git', ['config', 'user.name'], (0, estado_thread_1.raizDoEstado)(raiz), 10000);
226
+ const nome = r.ok ? r.stdout.trim() : '';
227
+ return nome && textoCurto(nome, 120) && (0, master_1.autoriaHumana)(nome) ? nome : null;
228
+ }
229
+ /**
230
+ * RM-063 (F7): grava a autorizacao duravel do dono nesta maquina, na forma que `lerAutorizacao` confere. E ato do dono:
231
+ * a sessao despachada pelo `ork` (com a identidade de despacho no ambiente) nunca concede autorizacao a si mesma. O
232
+ * arquivo novo substitui o anterior inteiro, e cada concessao vai ao ledger do projeto (`autorizacao_concedida`), com a
233
+ * que ela substituiu. Tag e publicacao nunca entram, nem com outro nome.
234
+ */
235
+ function gravarAutorizacao(raiz, pedido) {
236
+ const recusa = (motivo, detalhe) => ({ ok: false, motivo, detalhe });
237
+ const ambiente = pedido.ambiente ?? process.env;
238
+ if ((ambiente[runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO] ?? '').trim() || (ambiente[runtime_ambiente_1.ENV_THREAD_DO_DESPACHO] ?? '').trim()) {
239
+ return recusa('autorizacao.sessao-despachada', 'a autorização durável é ato do dono: uma sessão despachada pelo ork não a concede ' +
240
+ '(rode no terminal do dono, fora da sessão da fase)');
241
+ }
242
+ // A mesma regra da nota do MASTER em nome de pessoa (D8): de dentro de um host de agente (Claude Code, Codex, Hermes,
243
+ // OpenClaw), quem escreve o --por e o agente. O dono autoriza no proprio terminal.
244
+ const host = (0, master_nota_1.marcaDeHost)(ambiente);
245
+ if (host) {
246
+ return recusa('autorizacao.host', `a autorização durável é ato do dono no terminal dele: vinda de ${host}, ela não vale ` +
247
+ '(o agente não autoriza a si mesmo)');
248
+ }
249
+ const agora = pedido.agora ?? new Date();
250
+ const ate = prazoDoPedido(pedido.ate, pedido.fuso);
251
+ if (!ate) {
252
+ return recusa('autorizacao.ate-invalido', `--ate ${JSON.stringify(pedido.ate)} não é um prazo: use 2026-10-18 (até 23:59 no fuso ` +
253
+ `${pedido.fuso}), 2026-10-18T18:00 ou um instante com fuso, como 2026-10-18T23:59:00-03:00`);
254
+ }
255
+ if (Date.parse(ate) <= agora.getTime()) {
256
+ return recusa('autorizacao.ate-passado', `o prazo ${(0, horario_1.formatarDataHoraRotulada)(ate, { agora: agora.toISOString() })} já passou`);
257
+ }
258
+ if (Date.parse(ate) - agora.getTime() > exports.PRAZO_MAXIMO_DIAS * 24 * 60 * 60 * 1000) {
259
+ return recusa('autorizacao.ate-longe', `o prazo vai além de ${exports.PRAZO_MAXIMO_DIAS} dias: autorize por menos e renove quando quiser`);
260
+ }
261
+ const pode = pedido.pode.split(',').map((a) => a.trim().toLowerCase()).filter(Boolean);
262
+ if (!pode.length)
263
+ return recusa('autorizacao.pode-vazio', `--pode precisa de pelo menos uma ação (${exports.ACOES_DA_AUTORIZACAO.join(', ')})`);
264
+ if (new Set(pode).size !== pode.length)
265
+ return recusa('autorizacao.pode-repetido', '--pode repete uma ação');
266
+ const proibida = pode.find((a) => ACOES_PROIBIDAS.includes(a));
267
+ if (proibida) {
268
+ return recusa('autorizacao.acao-proibida', `${JSON.stringify(proibida)}: tag e publicação nunca entram na autorização durável; ` +
269
+ 'ficam sempre com o dono');
270
+ }
271
+ const desconhecida = pode.find((a) => !exports.ACOES_DA_AUTORIZACAO.includes(a));
272
+ if (desconhecida !== undefined) {
273
+ return recusa('autorizacao.acao-desconhecida', `a ação ${JSON.stringify(desconhecida)} não é do contrato (${exports.ACOES_DA_AUTORIZACAO.join(', ')})`);
274
+ }
275
+ const por = (pedido.por ?? '').trim() || autorDoGit(raiz);
276
+ if (!por || !textoCurto(por, 120) || !(0, master_1.autoriaHumana)(por)) {
277
+ return recusa('autorizacao.por', por ? `--por ${JSON.stringify(por)} não nomeia uma pessoa (agente, runtime ou nome genérico não autoriza)`
278
+ : 'informe --por <seu nome>: o git deste checkout não tem user.name de uma pessoa');
279
+ }
280
+ const nota = (pedido.nota ?? '').trim();
281
+ if (nota && !textoCurto(nota, 300))
282
+ return recusa('autorizacao.nota', 'a nota precisa ser texto de até 300 caracteres, sem controle');
283
+ const arquivo = caminhoDaAutorizacao(raiz);
284
+ const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
285
+ if ((st && !st.isFile()) || (0, procedencia_1.rastreadoPeloGit)(raiz, arquivo)) {
286
+ return recusa('autorizacao.rastreada', `${arquivo} está no git, ou é link ou diretório: a autorização só vale do arquivo local desta máquina`);
287
+ }
288
+ const lida = lerAutorizacao(raiz, { projeto: pedido.projeto, agora, maquina: pedido.maquina });
289
+ const anterior = lida.valida ? lida.autorizacao : null;
290
+ const autorizacao = {
291
+ contrato: exports.CONTRATO_DA_AUTORIZACAO, maquina: pedido.maquina ?? (0, maquina_1.nomeDaMaquina)(), projeto: pedido.projeto, por,
292
+ concedidaEm: (0, horario_1.isoComFuso)(agora.getTime(), (0, horario_1.normalizarFuso)(pedido.fuso) ?? 'UTC'), ate, pode: pode,
293
+ ...(nota ? { nota } : {}),
294
+ };
295
+ fs.mkdirSync(path.dirname(arquivo), { recursive: true });
296
+ const temporario = `${arquivo}.${process.pid}.${(0, node_crypto_1.randomUUID)().slice(0, 8)}.tmp`;
297
+ try {
298
+ fs.writeFileSync(temporario, JSON.stringify(autorizacao, null, 2) + '\n', { encoding: 'utf8', mode: 0o600, flag: 'wx' });
299
+ fs.renameSync(temporario, arquivo);
300
+ }
301
+ finally {
302
+ fs.rmSync(temporario, { force: true });
303
+ }
304
+ const leitura = lerAutorizacao(raiz, { projeto: pedido.projeto, agora, maquina: pedido.maquina });
305
+ if (!leitura.valida)
306
+ throw new Error(`a autorização gravada não foi aceita na releitura (${leitura.motivo}: ${leitura.detalhe})`);
307
+ try {
308
+ (0, ledger_1.registrar)(path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery'), 'projeto', ledger_1.TIPOS_DE_EVENTO.autorizacaoConcedida, {
309
+ maquina: autorizacao.maquina, por, concedidaEm: autorizacao.concedidaEm, ate, pode, ...(nota ? { nota } : {}),
310
+ sha256: leitura.sha256, canal: pedido.canal ?? null,
311
+ substituiu: anterior ? { por: anterior.por, ate: anterior.ate, pode: anterior.pode } : null,
312
+ });
313
+ }
314
+ catch { /* o arquivo e a autorizacao; o ledger do projeto e o rastro, e a releitura ja provou o arquivo */ }
315
+ return { ok: true, leitura, anterior };
316
+ }
317
+ /** O texto do `ork conducao autorizacao`: a vigente, ou por que nao ha, e o que isso quer dizer para a batida. */
318
+ function textoDaAutorizacao(leitura, agora = new Date().toISOString()) {
319
+ const m = (0, locale_1.msg)().conducao.autorizacao;
320
+ if (!leitura.valida) {
321
+ return [m.sem(leitura.motivo, leitura.detalhe), m.semEfeito, m.autorizar].join('\n');
322
+ }
323
+ const a = leitura.autorizacao;
324
+ return [m.valida(a.por, (0, horario_1.formatarDataHoraRotulada)(a.ate, { agora }), a.pode.join(', ')),
325
+ m.concedida((0, horario_1.formatarDataHoraRotulada)(a.concedidaEm, { agora }), a.maquina, a.projeto, a.nota ?? ''),
326
+ m.arquivo(leitura.arquivo, leitura.sha256.slice(0, 12)), m.limite].join('\n');
327
+ }