@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
@@ -19,12 +19,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.analisarComando = analisarComando;
20
20
  exports.analisarComandos = analisarComandos;
21
21
  exports.linhaDoLintDeClaim = linhaDoLintDeClaim;
22
+ const locale_1 = require("./locale");
23
+ /**
24
+ * A correcao que vai ao `claims.jsonl` com o achado: dado gravado, sempre em pt-BR. Fatia 2 do ensaio da 0.5.0 (P6): ela
25
+ * vale para qualquer projeto. RM-061 (F3b): o texto mora no catalogo (`claims.correcoesDoLint`), e a impressao do
26
+ * `claims add` a mostra no locale do comando, pela regra.
27
+ */
22
28
  const CORRECAO = {
23
- // Fatia 2 do ensaio da 0.5.0 (P6): a correcao vale para qualquer projeto; o script do Orkastery saiu daqui.
24
- 'suite-inteira': 'rode só o teste da claim (`node --test` no arquivo do teste, ou o comando do projeto que roda um arquivo) ' +
25
- 'ou um script hermético do projeto',
26
- 'sha-intermediario': 'ancore na base (`git diff "$(git merge-base origin/main HEAD)" HEAD`) ou prove ancestralidade com `git merge-base --is-ancestor <sha> HEAD`',
27
- 'contagem-de-commits': 'use `git merge-base --is-ancestor <commit> HEAD`: contagem de commits quebra com rebase e merge',
29
+ 'suite-inteira': (0, locale_1.msg)('pt-BR').claims.correcoesDoLint['suite-inteira'],
30
+ 'sha-intermediario': (0, locale_1.msg)('pt-BR').claims.correcoesDoLint['sha-intermediario'],
31
+ 'contagem-de-commits': (0, locale_1.msg)('pt-BR').claims.correcoesDoLint['contagem-de-commits'],
28
32
  };
29
33
  /**
30
34
  * (a) `npm [--prefix <dir>] [run] test` sem subcomando (`test:ci` nao casa) e sem arquivos
@@ -60,7 +64,7 @@ function analisarComandos(comandos) {
60
64
  }
61
65
  /** Uma linha por achado, para o terminal e para o ledger. */
62
66
  function linhaDoLintDeClaim(claimId, a) {
63
- const nome = { 'suite-inteira': 'roda a suite inteira', 'sha-intermediario': 'fixa um SHA intermediario',
64
- 'contagem-de-commits': 'compara contagem de commits' }[a.regra];
65
- return `${claimId} ${nome} (${a.trecho}); ${a.correcao}`;
67
+ // RM-061 (F3b): nome e correcao pela regra, no locale ativo. F3d (GO-FIX 1): o montador fica registrado, e o `ci prepare`,
68
+ // que grava a linha no ledger no escopo pt-BR, a remonta no locale do comando ao imprimir.
69
+ return (0, locale_1.textoDoCatalogo)((m) => m.claims.linhaDoLint(claimId, m.claims.nomesDoLint[a.regra] ?? a.regra, a.trecho, m.claims.correcoesDoLint[a.regra] ?? a.correcao));
66
70
  }
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ /**
3
+ * `ork claims conferir` (RM-059, T0.10): reexecuta so as claims pedidas, ou o verify de uma tarefa do
4
+ * plano da thread, no mesmo sandbox do `ork_verify`, sem gravar recibo.
5
+ *
6
+ * E por aqui que os mods de fase (Freio e Portao, no plano dos mods) conferem o que um lote do GO
7
+ * mexeu: o comando de claim e de verify e escrito pelo modelo, e fora do sandbox ele passaria longe do
8
+ * guard e daria resultado diferente do `ork verify` (D12 do plano). Por isso:
9
+ *
10
+ * - o executor e o confinado do codex (`criarExecutorSandbox`), um por comando, e nunca ha fallback:
11
+ * sem sandbox, a conferencia recusa (D6 da thread ork-rm059nucleo);
12
+ * - o julgamento de cada claim e o do `ork verify` (`verificarClaim`), sem regra paralela;
13
+ * - quem executa na worktree precisa da conducao da thread, como o `ork verify` (I-36): a sessao que
14
+ * conduz reentra pela identidade do despacho, e outra conducao recusa;
15
+ * - nada e gravado: nem `verify_run`, nem estado de claim, nem `gate_blocked`. Quem verifica de
16
+ * verdade continua sendo o `ork verify`.
17
+ */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.ErroDeConferencia = exports.PRAZO_MAXIMO_MS = exports.PRAZO_PADRAO_MS = exports.FORMATO_DA_CONFERENCIA = void 0;
53
+ exports.idsDeClaims = idsDeClaims;
54
+ exports.verifyDaTarefa = verifyDaTarefa;
55
+ exports.conferirClaims = conferirClaims;
56
+ exports.textoDaConferencia = textoDaConferencia;
57
+ const fs = __importStar(require("node:fs"));
58
+ const path = __importStar(require("node:path"));
59
+ const node_crypto_1 = require("node:crypto");
60
+ const claims_1 = require("./claims");
61
+ const conducao_1 = require("./conducao");
62
+ const estado_thread_1 = require("./estado-thread");
63
+ const redacao_saida_1 = require("./redacao-saida");
64
+ const thread_1 = require("./thread");
65
+ const verify_1 = require("./verify");
66
+ const verify_sandbox_1 = require("./verify-sandbox");
67
+ const worktree_1 = require("./worktree");
68
+ const locale_1 = require("./locale");
69
+ exports.FORMATO_DA_CONFERENCIA = 'ork.claims-conferencia/v1';
70
+ /** O prazo total do `ork_verify` pelo MCP: a conferencia e pontual e nao deve demorar mais que ele. */
71
+ exports.PRAZO_PADRAO_MS = 180_000;
72
+ /** Teto: o prazo de um comando de verify. Pedir mais e pedir o `ork verify` inteiro. */
73
+ exports.PRAZO_MAXIMO_MS = verify_1.TIMEOUT_VERIFY_MS;
74
+ const PRAZO_MINIMO_MS = 10_000;
75
+ /** Folga para fechar o sandbox e responder dentro do prazo pedido. */
76
+ const RESERVA_MS = 5_000;
77
+ /** Erro de uso tipado: o CLI sai 2 com ele. */
78
+ class ErroDeConferencia extends locale_1.ErroDoCatalogo {
79
+ }
80
+ exports.ErroDeConferencia = ErroDeConferencia;
81
+ /** RM-061 (F3b): a recusa nasce do catalogo; o `--json` a leva como nasceu e o texto a remonta no locale do comando. */
82
+ const recusa = (motivo, detalhe) => new ErroDeConferencia((m) => m.claims.recusa(motivo, detalhe(m.claims)));
83
+ /** `C3,C7, c9` vira `['C3', 'C7', 'C9']`, sem repeticao e na ordem pedida. */
84
+ function idsDeClaims(bruto) {
85
+ const ids = bruto.split(',').map((s) => s.trim().toUpperCase()).filter(Boolean);
86
+ if (!ids.length)
87
+ throw recusa('uso', (m) => m.semClaims);
88
+ const invalido = ids.find((id) => !/^C\d+$/.test(id));
89
+ if (invalido)
90
+ throw recusa('uso', (m) => m.idInvalido(invalido));
91
+ const repetido = ids.find((id, i) => ids.indexOf(id) !== i);
92
+ if (repetido)
93
+ throw recusa('repetida', (m) => m.repetida(repetido));
94
+ return ids;
95
+ }
96
+ /**
97
+ * A linha de verify de uma tarefa nos formatos em uso nos planos: `- **verify:** ...`, `- **verify**: ...`,
98
+ * `- verify: ...`, `` - `verify`: ... `` e `Verify: ...` fora de lista. O grupo 1 e o que vem depois do rotulo.
99
+ */
100
+ const ROTULO_DE_VERIFY = /^\s*(?:[-*]\s+)?(?:\*\*verify:\*\*|\*\*verify\*\*\s*:|`verify`\s*:|verify\s*:)\s*(.*)$/i;
101
+ /** Linha que abre outro item de lista, cabecalho ou cerca de codigo. */
102
+ const ABRE_BLOCO = /^\s*(?:[-*+]\s|\d+[.)]\s|#{1,6}\s|```|~~~)/;
103
+ const recuo = (linha) => /^[ \t]*/.exec(linha)[0].replace(/\t/g, ' ').length;
104
+ /**
105
+ * O item inteiro do verify da linha `k`: o texto depois do rotulo e as linhas que o Markdown junta a ele, a
106
+ * continuacao logo abaixo que nao abre outro item e as linhas mais recuadas que o rotulo, mesmo depois de
107
+ * linha em branco. Verify que quebra na linha seguinte ("e o teste da fatia 1 (`node --test ...`)") e um
108
+ * item so, e o pedaco da linha de baixo nao pode ficar de fora.
109
+ */
110
+ function itemDoVerify(bloco, k, inicio) {
111
+ const base = recuo(bloco[k]);
112
+ const partes = [inicio];
113
+ let depoisDeBranco = false;
114
+ for (const linha of bloco.slice(k + 1)) {
115
+ if (!linha.trim()) {
116
+ depoisDeBranco = true;
117
+ continue;
118
+ }
119
+ if (recuo(linha) <= base && (depoisDeBranco || ABRE_BLOCO.test(linha)))
120
+ break;
121
+ partes.push(linha.trim());
122
+ depoisDeBranco = false;
123
+ }
124
+ return partes.join(' ').trim();
125
+ }
126
+ /**
127
+ * O comando de verify da tarefa `T<id>` no texto do plano (D7). O cabeçalho (niveis `##` a `######`)
128
+ * aparece uma vez so; no bloco dele, ate o proximo cabecalho de nivel igual ou maior, ha um unico
129
+ * item `verify`, e ele e um trecho entre crases e nada mais (ponto final aceito), contando as linhas
130
+ * de continuacao do item. Item com dois trechos ou com texto alem do comando ("`git status` vazio e
131
+ * `ork verify`") recusa: rodar so um pedaco daria "passou" a um verify que nao rodou inteiro.
132
+ */
133
+ function verifyDaTarefa(plano, tarefaBruta) {
134
+ const id = tarefaBruta.trim().replace(/^T/i, '');
135
+ if (!/^\d+(?:\.\d+)*$/.test(id))
136
+ throw recusa('uso', (m) => m.tarefaInvalida(tarefaBruta));
137
+ const tarefa = `T${id}`;
138
+ const linhas = plano.replace(/\r\n/g, '\n').split('\n');
139
+ const cabecalho = /^(#{2,6})\s+T(\d+(?:\.\d+)*)(?=[\s.:)]|$)/;
140
+ const inicios = linhas.flatMap((l, i) => {
141
+ const m = cabecalho.exec(l);
142
+ return m && m[2] === id ? [{ i, nivel: m[1].length }] : [];
143
+ });
144
+ if (inicios.length === 0)
145
+ throw recusa('tarefa-ausente', (m) => m.tarefaAusente(tarefa));
146
+ if (inicios.length > 1)
147
+ throw recusa('tarefa-repetida', (m) => m.tarefaRepetida(inicios.length, tarefa));
148
+ const { i, nivel } = inicios[0];
149
+ const fimDoBloco = linhas.findIndex((l, j) => j > i && new RegExp(`^#{1,${nivel}}\\s`).test(l));
150
+ const bloco = linhas.slice(i + 1, fimDoBloco < 0 ? undefined : fimDoBloco);
151
+ const verifies = bloco.flatMap((l, k) => {
152
+ const m = ROTULO_DE_VERIFY.exec(l);
153
+ return m ? [itemDoVerify(bloco, k, m[1].trim())] : [];
154
+ });
155
+ if (verifies.length === 0)
156
+ throw recusa('tarefa-sem-verify', (m) => m.tarefaSemVerify(tarefa));
157
+ if (verifies.length > 1)
158
+ throw recusa('tarefa-ambigua', (m) => m.tarefaAmbigua(tarefa, verifies.length));
159
+ const resto = verifies[0];
160
+ const trechos = [...resto.matchAll(/`([^`]+)`/g)].length;
161
+ if (trechos === 0)
162
+ throw recusa('tarefa-sem-comando', (m) => m.tarefaSemComando(tarefa, resto.slice(0, 120)));
163
+ const unico = /^`([^`]+)`\s*\.?$/.exec(resto);
164
+ if (!unico || !unico[1].trim()) {
165
+ throw recusa('tarefa-ambigua', (m) => m.tarefaVariosTrechos(tarefa, trechos, resto.slice(0, 120)));
166
+ }
167
+ return { tarefa, comando: unico[1].trim() };
168
+ }
169
+ /** O teto dos documentos de fase (`docs/*.md` da thread). */
170
+ const LIMITE_DO_PLANO = 128 * 1024;
171
+ /**
172
+ * O `docs/plan.md` da thread, com o sha256 dos bytes lidos; `null` quando ele nao existe. Le pela pasta
173
+ * de estado da thread, que e a do checkout principal mesmo com o CLI rodando de dentro da worktree.
174
+ */
175
+ function lerPlano(raiz, threadId) {
176
+ const arquivo = path.join((0, thread_1.dirThread)(raiz, threadId), 'docs', 'plan.md');
177
+ let fd;
178
+ try {
179
+ fd = fs.openSync(arquivo, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
180
+ }
181
+ catch (e) {
182
+ if (e.code === 'ENOENT')
183
+ return null;
184
+ throw recusa('plano-inseguro', (m) => m.planoNaoAbre);
185
+ }
186
+ try {
187
+ const st = fs.fstatSync(fd);
188
+ if (!st.isFile() || st.size > LIMITE_DO_PLANO)
189
+ throw recusa('plano-inseguro', (m) => m.planoGrande);
190
+ const bytes = fs.readFileSync(fd);
191
+ return { arquivo: 'docs/plan.md', sha256: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex'), conteudo: bytes.toString('utf8') };
192
+ }
193
+ finally {
194
+ fs.closeSync(fd);
195
+ }
196
+ }
197
+ /**
198
+ * Como o `ork_verify` (`mcp-verify.ts`): so a worktree propria da thread, dentro do projeto e registrada no git
199
+ * dele na branch da thread, fica gravavel no sandbox. O projeto e a arvore principal, mesmo com o CLI rodando de
200
+ * dentro de uma worktree. Thread sem worktree seria conferida com a arvore principal gravavel, e worktree de
201
+ * outro repositorio numa branch de mesmo nome abriria escrita fora do projeto: as duas recusam.
202
+ */
203
+ function worktreeConferida(raiz, thread) {
204
+ if (!thread.worktree)
205
+ throw recusa('sem-worktree', (m) => m.semWorktree(thread.id));
206
+ let dir;
207
+ try {
208
+ dir = fs.realpathSync(thread.worktree);
209
+ }
210
+ catch {
211
+ throw recusa('worktree-ausente', (m) => m.worktreeAusente(thread.id));
212
+ }
213
+ const projeto = fs.realpathSync((0, estado_thread_1.raizDoEstado)(raiz));
214
+ if (!dir.startsWith(projeto + path.sep))
215
+ throw recusa('worktree-fora-do-projeto', (m) => m.worktreeFora(thread.id));
216
+ const branch = (0, worktree_1.branchDaWorktree)(thread);
217
+ if (!(0, worktree_1.worktreesDoGit)(projeto).some((w) => w.dir === dir && w.branch === branch))
218
+ throw recusa('worktree-nao-registrada', (m) => m.worktreeNaoRegistrada(thread.id, branch));
219
+ return dir;
220
+ }
221
+ /** A fabrica padrao: o sandbox do codex, um por comando, como o `ork_verify`. */
222
+ const fabricaPadrao = (worktree, timeoutMs) => (0, verify_sandbox_1.criarExecutorSandbox)({ worktree, timeoutMs });
223
+ /** Sandbox que nao abre vira recusa tipada: a conferencia nunca roda fora dele (D6). */
224
+ function confinado(fabrica, worktree, timeoutMs) {
225
+ try {
226
+ return fabrica(worktree, timeoutMs);
227
+ }
228
+ catch (e) {
229
+ // RM-061 (F3b, GO-FIX 1): o erro do catalogo guarda o montador; o do executor sai traduzido pela frase exata.
230
+ const erro = e instanceof locale_1.ErroDoCatalogo ? e.montar : (m) => m.claims.erroDoSandbox(e.message);
231
+ throw new ErroDeConferencia((m) => m.claims.recusa('sandbox-indisponivel', m.claims.sandboxIndisponivel(erro(m))));
232
+ }
233
+ }
234
+ function conferida(r) {
235
+ return {
236
+ nome: r.nome, comando: r.comando, ok: r.ok, code: r.code, executado: r.executado !== false,
237
+ ...(r.causa ? { causa: r.causa } : {}),
238
+ ...(r.prazoMs !== undefined ? { prazoMs: r.prazoMs } : {}),
239
+ ...(r.duracaoMs !== undefined ? { duracaoMs: r.duracaoMs } : {}),
240
+ fim: r.resumo ? (0, redacao_saida_1.redigirSaida)(r.resumo) : '',
241
+ };
242
+ }
243
+ /** `ork claims conferir`: so o que foi pedido, no sandbox, sob a conducao da thread, sem gravar nada. */
244
+ function conferirClaims(carregado, threadId, pedido) {
245
+ const { raiz, manifesto } = carregado;
246
+ if (!pedido.claims === !pedido.tarefa)
247
+ throw recusa('uso', (m) => m.claimsOuTarefa);
248
+ const prazoTotalMs = pedido.prazoMs ?? exports.PRAZO_PADRAO_MS;
249
+ if (!Number.isInteger(prazoTotalMs) || prazoTotalMs < PRAZO_MINIMO_MS || prazoTotalMs > exports.PRAZO_MAXIMO_MS)
250
+ throw recusa('prazo', (m) => m.prazo(PRAZO_MINIMO_MS / 1000, exports.PRAZO_MAXIMO_MS / 1000));
251
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(threadId) || !fs.existsSync((0, thread_1.caminhoThread)(raiz, threadId)))
252
+ throw recusa('thread-ausente', (m) => m.threadAusente(threadId));
253
+ const thread = (0, thread_1.lerThread)(raiz, threadId);
254
+ if (thread.status === 'fechada')
255
+ throw recusa('thread-fechada', (m) => m.threadFechada(threadId));
256
+ const cwd = worktreeConferida(raiz, thread);
257
+ // O que vai rodar, inteiro resolvido antes de tomar a conducao: recusa de uso nao toca a worktree.
258
+ let alvo;
259
+ let selecionadas;
260
+ if (pedido.claims) {
261
+ const ids = pedido.claims;
262
+ const todas = (0, claims_1.lerClaims)(raiz, threadId);
263
+ selecionadas = ids.map((id) => {
264
+ const claim = todas.find((c) => c.id === id);
265
+ if (!claim)
266
+ throw recusa('desconhecida', (m) => m.desconhecida(id, threadId));
267
+ if (claim.estado === 'retirada') {
268
+ const motivo = claim.motivoDaRetirada;
269
+ throw recusa('retirada', (m) => m.retiradaNaConferencia(id, motivo));
270
+ }
271
+ return claim;
272
+ });
273
+ alvo = { tipo: 'claims', ids };
274
+ }
275
+ else {
276
+ const plano = lerPlano(raiz, threadId);
277
+ if (!plano)
278
+ throw recusa('plano-ausente', (m) => m.planoAusente(threadId));
279
+ const { tarefa, comando } = verifyDaTarefa(plano.conteudo, pedido.tarefa);
280
+ // RM-061 (F3b, GO-FIX 1): a alegacao sintetica nasce pelo catalogo (pt-BR no `--json`) e o texto a remonta.
281
+ selecionadas = [{ id: tarefa, thread: threadId, fase: null, arquivo: plano.arquivo, alegacao: (0, locale_1.textoDoCatalogo)((m) => m.claims.verifyDaTarefa(tarefa)),
282
+ negativa: false, verificar: [comando], criadoEm: '', estado: 'pendente' }];
283
+ alvo = { tipo: 'tarefa', tarefa, plano: { arquivo: plano.arquivo, sha256: plano.sha256 }, comando };
284
+ }
285
+ // O sandbox e conferido antes da conducao: sem ele, nada toma o lease nem toca a worktree.
286
+ const fabrica = pedido.fabrica ?? fabricaPadrao;
287
+ confinado(fabrica, cwd, PRAZO_MINIMO_MS).fechar();
288
+ const pedidoDeConducao = {
289
+ canal: pedido.canal ?? (0, conducao_1.canalDoProcesso)(),
290
+ correlacao: pedido.correlacao ?? null,
291
+ operacao: 'verify',
292
+ identidade: (0, conducao_1.identidadeDoAmbiente)(threadId, process.env, raiz),
293
+ prazoMs: (0, conducao_1.prazoDaVerificacao)(prazoTotalMs, 1),
294
+ };
295
+ return (0, conducao_1.comConducao)(raiz, threadId, pedidoDeConducao, (tomada) => {
296
+ const prazoFinal = Date.now() + prazoTotalMs;
297
+ const executor = (nome, comando, dir) => {
298
+ const restante = prazoFinal - Date.now() - RESERVA_MS;
299
+ if (restante < 100) {
300
+ return { nome, comando, ok: false, code: -1, executado: false, resumo: (0, locale_1.textoDoCatalogo)((m) => m.claims.prazoEsgotado) };
301
+ }
302
+ const prazoMs = Math.min((0, verify_1.prazoDoComando)(manifesto, nome), restante);
303
+ tomada.renovar(prazoMs);
304
+ const sandbox = confinado(fabrica, cwd, prazoMs);
305
+ const inicio = Date.now();
306
+ try {
307
+ const r = sandbox.executar(nome, comando, dir);
308
+ const estourou = !r.ok && /timeout do sandbox/.test(`${r.stderr ?? ''}${r.resumo}`);
309
+ return { ...r, executado: true, prazoMs, duracaoMs: Date.now() - inicio, ...(estourou ? { causa: 'timeout' } : {}) };
310
+ }
311
+ finally {
312
+ sandbox.fechar();
313
+ }
314
+ };
315
+ const resultados = selecionadas.map((c) => (0, verify_1.verificarClaim)(c, cwd, executor));
316
+ const itens = resultados.map((r) => ({
317
+ id: r.claim.id, alegacao: r.claim.alegacao, arquivo: r.claim.arquivo ?? null, verificado: r.verificado,
318
+ motivo: r.motivo, detalhe: r.detalhe, execucoes: r.execucoes.map(conferida),
319
+ }));
320
+ const motivos = [...new Set(itens.map((i) => i.motivo).filter((m) => m !== null))];
321
+ return {
322
+ formato: exports.FORMATO_DA_CONFERENCIA, thread: threadId, commit: (0, verify_1.commitReal)(cwd), cwd, executor: 'codex-sandbox',
323
+ reciboOficial: false, prazoTotalMs, alvo, itens, ok: itens.every((i) => i.verificado), motivos,
324
+ };
325
+ });
326
+ }
327
+ /** Texto de `ork claims conferir`, para quem roda no terminal. */
328
+ function textoDaConferencia(r) {
329
+ // RM-061 (F3b): a moldura pelo catalogo; o detalhe de cada claim (montado em pt-BR, como o --json o leva) remontado.
330
+ const m = (0, locale_1.msg)().claims;
331
+ const linhas = [m.conferencia(r.thread)];
332
+ linhas.push(m.headReal(r.commit));
333
+ linhas.push(m.executor(r.executor, Math.round(r.prazoTotalMs / 1000)));
334
+ linhas.push(r.alvo.tipo === 'claims'
335
+ ? m.alvoClaims(r.alvo.ids.join(', '))
336
+ : m.alvoTarefa(r.alvo.tarefa, r.alvo.plano.sha256.slice(0, 12), r.alvo.comando));
337
+ linhas.push('');
338
+ for (const i of r.itens) {
339
+ linhas.push(m.item(i.id, i.verificado, i.motivo, (0, locale_1.remontar)(i.alegacao)));
340
+ if (!i.verificado) {
341
+ linhas.push(` ${(0, locale_1.remontar)(i.detalhe)}`);
342
+ const falhou = i.execucoes.find((e) => !e.ok);
343
+ if (falhou?.fim)
344
+ linhas.push(...(0, locale_1.remontar)(falhou.fim).split('\n').map((l) => ` | ${l}`));
345
+ }
346
+ }
347
+ linhas.push('');
348
+ linhas.push(r.ok ? m.tudoPassou : m.naoPassou(r.motivos.join(', ')));
349
+ return linhas.join('\n');
350
+ }
package/dist/claims.js CHANGED
@@ -68,6 +68,7 @@ const policies_1 = require("./policies");
68
68
  const verify_1 = require("./verify");
69
69
  const util_1 = require("./util");
70
70
  const claim_lint_1 = require("./claim-lint");
71
+ const locale_1 = require("./locale");
71
72
  /** Caminho do `claims.jsonl` da thread (append-only, como o ledger). */
72
73
  function caminhoClaims(raiz, threadId) {
73
74
  return path.join((0, thread_1.dirThread)(raiz, threadId), 'claims.jsonl');
@@ -181,7 +182,9 @@ function conferirProvaLocal(raiz, thread, claim, executarProva) {
181
182
  if (!carregado || claim.verificar.length === 0 || !(0, policies_1.policyDeProvaLocal)(carregado.manifesto))
182
183
  return [];
183
184
  const prazoMs = carregado.manifesto.verify.timeout_ms ?? verify_1.TIMEOUT_VERIFY_MS;
184
- const cwd = (0, verify_1.cwdDaThread)(raiz, thread);
185
+ // RM-047 (P2): worktree apagada nao passa pela procedencia, porque nada roda nela; vira o aviso abaixo.
186
+ const apagada = thread.worktree && !fs.existsSync(thread.worktree) ? thread.worktree : undefined;
187
+ const cwd = apagada ?? (0, verify_1.cwdDaThread)(raiz, thread);
185
188
  let reprovada;
186
189
  // Suspeitas da revisao de 03/10: sem a worktree (apagada), nada roda e o aviso diz por que, sem culpar a claim.
187
190
  if (!fs.existsSync(cwd))
@@ -248,7 +251,7 @@ function registrarCriteriosDePronto(raiz, threadId) {
248
251
  function exigirClaim(raiz, threadId, claimId) {
249
252
  const claim = lerClaims(raiz, threadId).find((c) => c.id === claimId);
250
253
  if (!claim) {
251
- throw new Error(`claim "${claimId}" nao existe na thread ${threadId}`);
254
+ throw new locale_1.ErroDoCatalogo((m) => m.claims.naoExiste(claimId, threadId));
252
255
  }
253
256
  return claim;
254
257
  }
@@ -307,18 +310,18 @@ function carimbarEstado(raiz, claim, estado) {
307
310
  /** Tabela de `ork claims list`. */
308
311
  function tabelaDeClaims(raiz, threadId) {
309
312
  const claims = lerClaims(raiz, threadId);
310
- if (claims.length === 0) {
311
- return (`Nenhuma claim na thread ${threadId}.\n` +
312
- `Registre uma com: ork claims add ${threadId} <arquivo> --claim "<alegacao>" --verificar "<comando>"`);
313
- }
313
+ // RM-061 (F3b): o texto pelo catalogo; o estado (dado do `claims.jsonl`) so se traduz aqui, pelo id.
314
+ const m = (0, locale_1.msg)().claims;
315
+ if (claims.length === 0)
316
+ return m.listaVazia(threadId);
314
317
  const linhas = claims.map((c) => [
315
318
  c.id,
316
319
  c.fase ?? '-',
317
- c.estado,
318
- c.negativa ? 'sim' : 'nao',
320
+ m.estado(c.estado),
321
+ c.negativa ? m.sim : m.nao,
319
322
  c.arquivo,
320
- c.verificar.join(' && ') || '(sem comando)',
323
+ c.verificar.join(' && ') || m.semComando,
321
324
  c.alegacao,
322
325
  ]);
323
- return (0, util_1.tabela)(['ID', 'FASE', 'ESTADO', 'NEGATIVA', 'ARQUIVO', 'VERIFICAR', 'ALEGACAO'], linhas);
326
+ return (0, util_1.tabela)([...m.colunas], linhas);
324
327
  }
@@ -1,11 +1,46 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.BRAIN_API = void 0;
4
37
  exports.validateRequest = validateRequest;
5
38
  exports.brainClient = brainClient;
39
+ const os = __importStar(require("node:os"));
6
40
  const node_child_process_1 = require("node:child_process");
7
41
  const project_state_1 = require("./project-state");
8
42
  const company_brain_contract_1 = require("./company-brain-contract");
43
+ const dsn_da_memoria_1 = require("./dsn-da-memoria");
9
44
  exports.BRAIN_API = 'orkmind.company-brain-api/v1';
10
45
  function validateRequest(value) {
11
46
  if (!value || typeof value !== 'object' || Array.isArray(value) || value.schema !== exports.BRAIN_API ||
@@ -30,20 +65,27 @@ function brainClient(loaded, execute = node_child_process_1.spawnSync) {
30
65
  return raw => {
31
66
  const request = validateRequest(raw);
32
67
  const unavailable = (error) => ({ schema: exports.BRAIN_API, state: 'unavailable', error });
33
- const dsn = config.database_url_env ? process.env[config.database_url_env] : undefined;
68
+ // RM-069: a DSN pelo resolvedor unico, no momento do pedido (a variavel ou o arquivo da pasta de segredos).
69
+ const dsn = (0, dsn_da_memoria_1.resolverDsn)(config).dsn;
34
70
  if (config.mode !== 'orkmind' || (!dsn && request.operation !== 'capabilities'))
35
71
  return unavailable('brain.configuration.missing');
36
72
  const payload = request.payload;
37
73
  if (payload?.tenant_id !== undefined && payload.tenant_id !== config.tenant)
38
74
  return { schema: exports.BRAIN_API, state: 'forbidden', error: 'brain.tenant.mismatch' };
39
- const result = execute(config.cli, ['brain', 'request'], { cwd: loaded.raiz, encoding: 'utf8', timeout: Math.min(config.timeout_ms, 15000),
75
+ // RM-047: cwd fora do clone; um nome de interpretador em memory.cli não acha arquivo do repositório.
76
+ // RM-026 K7 (fatia 2, CHECK): timeout_ms fora da faixa (0, negativo, fração) vale o padrão de 15 s, nunca espera sem prazo.
77
+ const prazo = Number.isFinite(config.timeout_ms) && config.timeout_ms >= 1 ? Math.min(Math.floor(config.timeout_ms), 15000) : 15000;
78
+ const result = execute(config.cli, ['brain', 'request'], { cwd: os.homedir(), encoding: 'utf8', timeout: prazo,
40
79
  maxBuffer: 2 * 1024 * 1024, input: JSON.stringify(request), shell: false,
41
80
  env: { PATH: process.env.PATH ?? '/usr/bin:/bin', PYTHONDONTWRITEBYTECODE: '1',
42
- ORKMIND_DATABASE_URL: dsn ?? '', ORKMIND_BRAIN_TENANT: config.tenant } });
81
+ ORKMIND_DATABASE_URL: dsn, ORKMIND_BRAIN_TENANT: config.tenant } });
43
82
  if (result.error || result.signal)
44
83
  return unavailable('brain.transport.unavailable');
45
84
  try {
46
85
  const response = JSON.parse(String(result.stdout));
86
+ // RM-069 (D21): a resposta que repete a DSN ou a senha dela nunca sai do cliente; recusada inteira, sem o valor.
87
+ if ((0, dsn_da_memoria_1.contemFragmentoDaDsn)(response, dsn))
88
+ return unavailable('brain.transport.secret');
47
89
  if (response.schema !== exports.BRAIN_API || !['ok', 'empty', 'unknown', 'unavailable', 'withheld', 'forbidden', 'conflict'].includes(response.state))
48
90
  throw Error();
49
91
  if (response.state === 'ok' && result.status !== 0)
@@ -118,7 +118,8 @@ function withProcessLock(dir, busy, run) {
118
118
  }
119
119
  function durableAppend(file, value) {
120
120
  fs.mkdirSync(path.dirname(file), { recursive: true });
121
- const fd = fs.openSync(file, 'a', 0o600);
121
+ // RM-047: O_NOFOLLOW; um ledger versionado como link não leva o append para fora da raiz.
122
+ const fd = fs.openSync(file, fs.constants.O_WRONLY | fs.constants.O_APPEND | fs.constants.O_CREAT | fs.constants.O_NOFOLLOW, 0o600);
122
123
  try {
123
124
  fs.writeFileSync(fd, JSON.stringify(value) + '\n');
124
125
  fs.fsyncSync(fd);
@@ -1,32 +1,73 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.brainAdmin = brainAdmin;
4
37
  exports.reconcileBrain = reconcileBrain;
5
38
  exports.applyBrain = applyBrain;
39
+ const os = __importStar(require("node:os"));
6
40
  const node_child_process_1 = require("node:child_process");
7
41
  const project_state_1 = require("./project-state");
8
42
  const portfolio_1 = require("./portfolio");
9
43
  const company_brain_source_1 = require("./company-brain-source");
10
44
  const company_brain_journal_1 = require("./company-brain-journal");
11
45
  const company_brain_contract_1 = require("./company-brain-contract");
46
+ const dsn_da_memoria_1 = require("./dsn-da-memoria");
12
47
  function brainAdmin(c) {
13
48
  const config = (0, project_state_1.memoryState)(c).loaded.manifesto.memory;
14
49
  return (operation, payload) => {
15
- const dsn = config.database_url_env ? process.env[config.database_url_env] : undefined;
50
+ // RM-069: a DSN pelo resolvedor unico (a variavel ou o arquivo da pasta de segredos).
51
+ const dsn = (0, dsn_da_memoria_1.resolverDsn)(config).dsn;
16
52
  if (config.mode !== 'orkmind' || !dsn)
17
53
  throw Error('brain.configuration.missing');
18
- const r = (0, node_child_process_1.spawnSync)(config.cli, ['brain', 'migration'], { cwd: c.raiz, shell: false, encoding: 'utf8', timeout: Math.min(config.timeout_ms, 15000), maxBuffer: 2 * 1024 * 1024,
54
+ // RM-047: cwd fora do clone; um nome de interpretador em memory.cli não acha arquivo do repositório.
55
+ const r = (0, node_child_process_1.spawnSync)(config.cli, ['brain', 'migration'], { cwd: os.homedir(), shell: false, encoding: 'utf8', timeout: Math.min(config.timeout_ms, 15000), maxBuffer: 2 * 1024 * 1024,
19
56
  input: JSON.stringify({ schema: 'orkmind.company-brain-admin/v1', operation, payload }),
20
57
  env: { PATH: process.env.PATH ?? '/usr/bin:/bin', PYTHONDONTWRITEBYTECODE: '1', ORKMIND_DATABASE_URL: dsn, ORKMIND_BRAIN_TENANT: config.tenant } });
58
+ let response;
21
59
  try {
22
- const response = JSON.parse(r.stdout);
23
- if (r.status !== 0 || response.state !== 'ok')
24
- throw Error();
25
- return response.result;
60
+ response = JSON.parse(r.stdout);
26
61
  }
27
62
  catch {
28
63
  throw Error('brain.migration.unconfirmed');
29
64
  }
65
+ // RM-069 (D21): a resposta que repete a DSN ou a senha dela nunca sai da migracao; recusada inteira, sem o valor.
66
+ if ((0, dsn_da_memoria_1.contemFragmentoDaDsn)(response, dsn))
67
+ throw Error('brain.migration.secret');
68
+ if (r.status !== 0 || response?.state !== 'ok')
69
+ throw Error('brain.migration.unconfirmed');
70
+ return response.result;
30
71
  };
31
72
  }
32
73
  function reconcileBrain(c, scope, batch, transport = brainAdmin(c)) {