@orkastery/cli 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +118 -4
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mergeDaEntrega = mergeDaEntrega;
4
+ exports.enderecoDoRemotoDaRaiz = enderecoDoRemotoDaRaiz;
5
+ exports.forjaDaEntrega = forjaDaEntrega;
4
6
  exports.registrarEntregaPorPr = registrarEntregaPorPr;
5
7
  exports.registrarEntregaExternaPorPr = registrarEntregaExternaPorPr;
6
8
  exports.registrarEntregasPorPr = registrarEntregasPorPr;
@@ -17,13 +19,23 @@ exports.registrarEntregasPorPr = registrarEntregasPorPr;
17
19
  * head do PR. Sem CI verde, nao registra: merge sem prova independente nao e entrega.
18
20
  */
19
21
  const branch_de_estado_1 = require("./branch-de-estado");
22
+ const produtor_1 = require("./forja/produtor");
20
23
  const ci_1 = require("./ci");
24
+ const api_1 = require("./forja/api");
25
+ const cli_1 = require("./forja/cli");
26
+ const endereco_1 = require("./forja/endereco");
27
+ const pedidos_1 = require("./forja/gitlab/pedidos");
28
+ const cache_1 = require("./forja/cache");
29
+ const resolver_1 = require("./forja/resolver");
21
30
  const docs_1 = require("./docs");
22
31
  const fabrica_publicar_1 = require("./fabrica-publicar");
23
32
  const ledger_1 = require("./ledger");
24
33
  const modos_1 = require("./modos");
34
+ const noctum_guarda_1 = require("./noctum-guarda");
25
35
  const thread_1 = require("./thread");
26
36
  const util_1 = require("./util");
37
+ const executor_1 = require("./forja/executor");
38
+ const registro_1 = require("./forja/registro");
27
39
  const locale_1 = require("./locale");
28
40
  /** O merge `ship(<thread>)` mais recente na base remota, com o head do PR (segundo pai). */
29
41
  function mergeDaEntrega(raiz, thread, remoto, base) {
@@ -51,6 +63,28 @@ function avancarParaShip(raiz, threadId) {
51
63
  atualizada.faseAtual = 'SHIP';
52
64
  (0, thread_1.gravarThread)(raiz, atualizada);
53
65
  }
66
+ /** O endereco do remoto, de UM parse da URL; `null` quando o remoto nao existe ou nao tem host de forja. */
67
+ function enderecoDoRemotoDaRaiz(raiz, remoto) {
68
+ // Git local sem rede escondida nem pergunta de credencial no terminal.
69
+ const url = (0, util_1.exec)('git', ['remote', 'get-url', '--', remoto], raiz, 60000, { ...process.env, GIT_NO_LAZY_FETCH: '1', GIT_TERMINAL_PROMPT: '0' });
70
+ return url.ok ? (0, endereco_1.lerEnderecoDoRemoto)(url.stdout.trim()) : null;
71
+ }
72
+ /**
73
+ * A forja do remoto, de UM parse da URL e do resolver (o bloco `forja:`, o host conhecido ou a sondagem pela CLI com
74
+ * login no host): o nome do host nao decide o tipo. `erro` nulo: o remoto nao existe, nao tem host de forja (caminho
75
+ * local) ou aponta um caminho que a forja dele nao tem (subgrupo no GitHub).
76
+ */
77
+ function forjaDaEntrega(carregado, remoto, sondas = resolver_1.SONDAS_PADRAO) {
78
+ const endereco = enderecoDoRemotoDaRaiz(carregado.raiz, remoto);
79
+ if (!endereco)
80
+ return { ok: false, erro: null };
81
+ const r = (0, resolver_1.resolverForja)({ endereco, manifesto: carregado.manifesto.forja, sondas, cache: (0, cache_1.dirDoCacheDaForja)(carregado.raiz) });
82
+ if (!r.ok)
83
+ return { ok: false, erro: r.erro };
84
+ if (r.valor.tipo === 'github' && r.valor.repo.split('/').length !== 2)
85
+ return { ok: false, erro: null };
86
+ return { ok: true, valor: r.valor };
87
+ }
54
88
  function resultado(thread, acao, motivo, extra = {}) {
55
89
  return { thread, acao, motivo, mergeSha: null, headSha: null, ci: null, docsPendentes: [], ...extra };
56
90
  }
@@ -66,11 +100,26 @@ function registrarEntregaPorPr(carregado, threadId, opcoes = {}) {
66
100
  const thread = (0, thread_1.lerThread)(raiz, threadId);
67
101
  if (thread.status === 'fechada')
68
102
  return resultado(threadId, 'ja-registrada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prThreadFechada));
69
- if (opcoes.buscar !== false)
70
- (0, util_1.exec)('git', ['fetch', '-q', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], raiz);
103
+ // RM-058, integracao (T1.1, D3 da ork-rm058integra): a entrega da thread de um arco #Noctum e do passo da entrega dele,
104
+ // com as provas dele; antes de qualquer git, e sem ledger.
105
+ const guarda = (0, noctum_guarda_1.guardaDaThread)(raiz, threadId, opcoes.arcos?.quando, { arcos: opcoes.arcos });
106
+ if (guarda)
107
+ return resultado(threadId, 'recusada', guarda.texto, { codigo: guarda.motivo });
108
+ if (opcoes.buscar !== false) {
109
+ const busca = (0, util_1.exec)('git', ['fetch', '-q', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], raiz);
110
+ if (!busca.ok) {
111
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemLeitura(remoto, base)), { codigo: 'entrega.sem-leitura' });
112
+ }
113
+ }
71
114
  const encontrado = mergeDaEntrega(raiz, threadId, remoto, base);
72
115
  if (!encontrado)
73
116
  return resultado(threadId, 'sem-merge', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemMerge(threadId, remoto, base)));
117
+ // Squash ou rebase: sem segundo pai o merge nao se liga ao head que a CI verificou. Com a CI exigida, a CI do commit
118
+ // da base nao prova o head, e a entrega e recusada antes de qualquer consulta. Sem CI exigida, registra como sempre.
119
+ const exigeCi = carregado.manifesto.ci.required_for_ship;
120
+ if (encontrado.headSha === null && exigeCi) {
121
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemVinculo(threadId, encontrado.mergeSha.slice(0, 7))), { mergeSha: encontrado.mergeSha, codigo: 'entrega.sem-vinculo' });
122
+ }
74
123
  // RM-044 (A3): o condutor roda o registrar-pr logo depois do merge; e aqui que ele fica sabendo da pagina que
75
124
  // vai deixar o push da base vermelho, lida da base remota que o fetch acabou de trazer.
76
125
  const merge = { ...encontrado, docsPendentes: (0, docs_1.docsPendentesDoMerge)(raiz, threadId, `refs/remotes/${remoto}/${base}`) };
@@ -84,7 +133,10 @@ function registrarEntregaPorPr(carregado, threadId, opcoes = {}) {
84
133
  if (!ponta || !(0, util_1.exec)('git', ['merge-base', '--is-ancestor', merge.mergeSha, ponta], raiz).ok) {
85
134
  return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prForaDaPonta(merge.mergeSha.slice(0, 7), remoto, base)), merge);
86
135
  }
87
- const ci = (0, ci_1.consultarCi)(carregado, merge.headSha ?? merge.mergeSha, remoto, opcoes.executorCi);
136
+ // A CI so e consultada no head do PR; sem head (squash ou rebase), so chega aqui sem CI exigida, e nada e consultado.
137
+ const ci = encontrado.headSha !== null
138
+ ? (0, ci_1.consultarCi)(carregado, encontrado.headSha, remoto, opcoes.executorCi)
139
+ : (0, ci_1.ciNaoExigida)(carregado, encontrado.mergeSha);
88
140
  if (ci.required && !ci.ok) {
89
141
  return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemCiVerde((0, locale_1.remontar)(ci.detail))), { ...merge, ci });
90
142
  }
@@ -117,23 +169,37 @@ function registrarEntregaPorPr(carregado, threadId, opcoes = {}) {
117
169
  (0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
118
170
  return resultado(threadId, 'registrou', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRegistrou(merge.mergeSha.slice(0, 7))), { ...merge, ci });
119
171
  }
120
- const ghApi = (caminho) => (0, util_1.exec)('gh', ['api', caminho, '-H', 'Accept: application/vnd.github+json'], process.cwd(), 120000);
121
- function lerJson(r) {
122
- if (!r.ok)
123
- return null;
124
- try {
125
- return JSON.parse(r.stdout);
126
- }
127
- catch {
128
- return null;
172
+ const ghApi = (caminho) => {
173
+ const r = (0, executor_1.rodarCli)({ cmd: 'gh', args: ['api', '--hostname', 'github.com', caminho, '-H', 'Accept: application/vnd.github+json'], prazoMs: 120000,
174
+ maxBuffer: 32 * 1024 * 1024 });
175
+ return { ok: r.status === 0, code: r.status ?? -1, stdout: r.stdout, stderr: r.stderr };
176
+ };
177
+ /**
178
+ * A forja do repositorio externo: a do projeto quando ela e um GitLab (o mesmo host, a mesma porta, o mesmo caminho
179
+ * base, outro projeto); o github.com quando a forja do projeto e o GitHub ou quando o projeto nao tem remoto de forja
180
+ * (sem remoto ou caminho local), como sempre. Nao ha host de reserva: o remoto que nomeia um host de forja que nao se
181
+ * resolve, e o projeto que declara `forja.tipo: gitlab` sem a forja resolvida, nunca caem no github.com.
182
+ */
183
+ function forjaDoExterno(carregado, repo, opcoes) {
184
+ const remoto = opcoes.remoto ?? 'origin';
185
+ const doProjeto = opcoes.forja ? { ok: true, valor: opcoes.forja } : forjaDaEntrega(carregado, (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship'), opcoes.sondas);
186
+ if (doProjeto.ok && doProjeto.valor.tipo === 'gitlab')
187
+ return { ok: true, gitlab: { ...doProjeto.valor, repo } };
188
+ if (carregado.manifesto.forja?.tipo === 'gitlab') {
189
+ return { ok: false, remoto, declarada: true,
190
+ erro: !doProjeto.ok && doProjeto.erro ? doProjeto.erro : { codigo: 'forja.desconhecida', detalhe: remoto } };
129
191
  }
192
+ if (!doProjeto.ok && doProjeto.erro)
193
+ return { ok: false, erro: doProjeto.erro, remoto, declarada: false };
194
+ return { ok: true, gitlab: null };
130
195
  }
131
196
  /**
132
197
  * `ork ship registrar-pr <thread> --repo <dono/nome> --pr <n>`: a thread que entrega por PR em outro
133
198
  * repositorio (os sites, por exemplo) nao tinha como virar `ship_done`, e a entrega virava decisao. A
134
- * exigencia e a mesma do caminho local: o merge dentro da ponta da base (pela API do GitHub, porque o
135
- * repositorio nao e remoto deste checkout) e o check declarado verde no head do PR. O repositorio precisa
136
- * estar declarado no manifesto; e o dono que diz onde, e com que check, a entrega vale. Idempotente.
199
+ * exigencia e a mesma do caminho local: o merge dentro da ponta da base (pela API da forja do repositorio, o GitHub
200
+ * ou o GitLab do projeto, porque o repositorio nao e remoto deste checkout) e o check declarado verde no head do PR.
201
+ * O repositorio precisa estar declarado no manifesto; e o dono que diz onde, e com que check, a entrega vale.
202
+ * Idempotente.
137
203
  */
138
204
  function registrarEntregaExternaPorPr(carregado, threadId, opcoes) {
139
205
  const raiz = carregado.raiz, repo = opcoes.repositorio, n = opcoes.pr;
@@ -147,66 +213,91 @@ function registrarEntregaExternaPorPr(carregado, threadId, opcoes) {
147
213
  const thread = (0, thread_1.lerThread)(raiz, threadId);
148
214
  if (thread.status === 'fechada')
149
215
  return resultado(threadId, 'ja-registrada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prThreadFechada));
216
+ // RM-058, integracao (T1.1): a mesma guarda do PR local, antes de consultar a forja.
217
+ const guarda = (0, noctum_guarda_1.guardaDaThread)(raiz, threadId);
218
+ if (guarda)
219
+ return resultado(threadId, 'recusada', guarda.texto, { codigo: guarda.motivo });
150
220
  const dir = (0, thread_1.dirThread)(raiz, threadId);
151
221
  if ((0, ledger_1.lerLedger)(dir).some((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.shipConcluido && e.repositorio === repo && e.pr === n)) {
152
222
  return resultado(threadId, 'ja-registrada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoJaTem(n, repo)));
153
223
  }
154
- const pr = lerJson(gh(`repos/${repo}/pulls/${n}`));
224
+ const daForja = forjaDoExterno(carregado, repo, opcoes);
225
+ if (!daForja.ok) {
226
+ const { erro, remoto, declarada } = daForja;
227
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => declarada ? m.ship.prForjaDoExterno(repo, m.forja.motivo(erro, 'gitlab'))
228
+ : m.ship.prForjaDoProjetoNaoResolvida(repo, remoto, m.forja.motivo(erro, null))), { codigo: 'entrega.sem-leitura' });
229
+ }
230
+ const gitlab = daForja.gitlab;
231
+ // O GitHub so tem dono/nome: o caminho com subgrupo e recusado antes de qualquer consulta.
232
+ if (!gitlab && repo.split('/').length !== 2) {
233
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRepoComSubgrupoNoGithub(repo)), { codigo: 'entrega.forja-mista' });
234
+ }
235
+ const nomeDaForja = gitlab ? 'GitLab' : undefined;
236
+ const forja = (0, registro_1.adaptadorDaForja)(gitlab ? 'gitlab' : 'github');
237
+ const api = gitlab ? (0, api_1.chamadorDaApi)(gitlab, opcoes.api ?? {}) : undefined;
238
+ const pr = (0, registro_1.exigirCapacidade)(forja, 'pedidoMesclado')({ repo, numero: n, executor: gh, api });
155
239
  if (!pr)
156
- return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prConsultaFalhou(n, repo)));
157
- const mergeSha = typeof pr.merge_commit_sha === 'string' && /^[0-9a-f]{40}$/.test(pr.merge_commit_sha) ? pr.merge_commit_sha : null;
158
- const headSha = typeof pr.head?.sha === 'string' && /^[0-9a-f]{40}$/.test(pr.head.sha) ? pr.head.sha : null;
159
- const base = typeof pr.base?.ref === 'string' && /^[A-Za-z0-9._/-]{1,200}$/.test(pr.base.ref) ? pr.base.ref : null;
160
- if (pr.merged !== true || !mergeSha || !headSha || !base) {
161
- return resultado(threadId, 'sem-merge', (0, locale_1.textoDoCatalogo)((m) => m.ship.prNaoMesclado(n, repo)));
240
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prConsultaFalhou(n, repo, nomeDaForja)));
241
+ const { mergeSha, headSha, base } = pr;
242
+ if (pr.mesclado && mergeSha && base && !headSha) {
243
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemHead(n, repo, nomeDaForja)), { mergeSha, codigo: 'entrega.sem-head' });
244
+ }
245
+ if (!pr.mesclado || !mergeSha || !headSha || !base) {
246
+ return resultado(threadId, 'sem-merge', (0, locale_1.textoDoCatalogo)((m) => m.ship.prNaoMesclado(n, repo, !!gitlab)));
162
247
  }
163
248
  // Achado A4 do CHECK: o PR precisa ser DESTA thread e ter entrado na branch padrao do repositorio. Sem o
164
249
  // vinculo, qualquer PR mesclado do repositorio viraria entrega de qualquer thread; sem a base, um PR
165
250
  // empilhado numa branch de feature contaria como entrega.
166
- const vinculo = [pr.title, pr.body, pr.head?.ref].filter((x) => typeof x === 'string')
251
+ const vinculo = [pr.titulo, pr.corpo, pr.branch].filter((x) => typeof x === 'string')
167
252
  // N4 do CHECK 2: a branch do proprio ork e `ork/<thread>-<variante>`, entao o hifen depois do id vale;
168
253
  // letra ou digito colado nao (outro id). Sem diferenciar maiusculas.
169
254
  .some((x) => new RegExp(`(^|[^a-z0-9-])${threadId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?![a-z0-9])`, 'i').test(x));
170
255
  if (!vinculo) {
171
- return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prNaoCitaThread(n, repo, threadId)), { mergeSha, headSha });
256
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prNaoCitaThread(n, repo, threadId, !!gitlab)), { mergeSha, headSha });
172
257
  }
173
- const repositorio = lerJson(gh(`repos/${repo}`));
174
- if (!repositorio)
175
- return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRepoFalhou(repo)), { mergeSha, headSha });
176
- if (repositorio.default_branch !== base) {
177
- return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prOutraBase(n, base, repo, repositorio.default_branch)), { mergeSha, headSha });
258
+ const branchPadrao = (0, registro_1.exigirCapacidade)(forja, 'branchPadrao')({ repo, executor: gh, api });
259
+ if (branchPadrao === null)
260
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRepoFalhou(repo, nomeDaForja)), { mergeSha, headSha });
261
+ if (branchPadrao !== base) {
262
+ return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prOutraBase(n, base, repo, branchPadrao || undefined, !!gitlab)), { mergeSha, headSha });
178
263
  }
179
264
  // A ponta da base AGORA, e o merge dentro dela: o push provado, pela mesma pergunta do ls-remote.
180
- const ramo = lerJson(gh(`repos/${repo}/branches/${encodeURIComponent(base)}`));
181
- const ponta = typeof ramo?.commit?.sha === 'string' && /^[0-9a-f]{40}$/.test(ramo.commit.sha) ? ramo.commit.sha : '';
182
- const comparacao = ponta ? lerJson(gh(`repos/${repo}/compare/${mergeSha}...${ponta}`)) : null;
183
- if (!ponta || !comparacao || !['ahead', 'identical'].includes(String(comparacao.status))) {
265
+ const ponta = (0, registro_1.exigirCapacidade)(forja, 'pontaDaBranch')({ repo, branch: base, executor: gh, api }) ?? '';
266
+ const comparacao = ponta ? (0, registro_1.exigirCapacidade)(forja, 'comparar')({ repo, de: mergeSha, ate: ponta, executor: gh, api }) : null;
267
+ if (!ponta || comparacao === null || !['ahead', 'identical'].includes(comparacao)) {
184
268
  return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoForaDaPonta(mergeSha.slice(0, 7), repo, base)), { mergeSha, headSha });
185
269
  }
186
270
  const check = declarados[repo];
187
- const ci = check ? (0, ci_1.consultarCiDoRepositorio)(repo, headSha, check, opcoes.executorCi) : null;
271
+ const ciDaForja = opcoes.ciDaForja ?? ((f, sha, contexto) => (0, ci_1.consultarCiNaForja)(f, sha, contexto, (0, produtor_1.produtoresAceitos)(carregado.manifesto, 'gitlab'), { api: opcoes.api }));
272
+ const ci = !check ? null : gitlab ? ciDaForja(gitlab, headSha, check)
273
+ : (0, ci_1.consultarCiDoRepositorio)(repo, headSha, check, opcoes.executorCi, 'github.com', (0, produtor_1.produtoresAceitos)(carregado.manifesto, 'github'));
188
274
  if (ci && !ci.ok) {
189
275
  return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemCiVerde((0, locale_1.remontar)(ci.detail))), { mergeSha, headSha, ci });
190
276
  }
191
277
  if (opcoes.dryRun) {
192
- return resultado(threadId, 'registraria', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistraria(mergeSha.slice(0, 7), n, repo)), { mergeSha, headSha, ci });
278
+ return resultado(threadId, 'registraria', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistraria(mergeSha.slice(0, 7), n, repo, !!gitlab)), { mergeSha, headSha, ci });
193
279
  }
194
280
  (0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.shipConcluido, {
195
281
  de: thread.base?.branch ?? null,
196
282
  para: `${repo}:${base}`,
197
283
  repositorio: repo,
198
284
  pr: n,
199
- url: pr.html_url ?? `https://github.com/${repo}/pull/${n}`,
285
+ url: pr.url ?? (gitlab ? `https://${(0, cli_1.hostDaApi)(gitlab)}${gitlab.caminhoBase}/${repo}/-/merge_requests/${n}` : `https://github.com/${repo}/pull/${n}`),
200
286
  shaDe: headSha,
201
287
  mergeSha,
202
288
  // RM-037 (fatia 5, A1; aviso da rodada 1 do CHECK): a ponta conferida vai em campo proprio, como no PR local; a
203
289
  // comparacao aceita `ahead`, e o recibo do Maestro confere o push contra ela.
204
290
  pontaDaBase: ponta,
205
291
  jaIncorporado: true,
206
- remoto: `github:${repo}`,
292
+ remoto: `${gitlab ? 'gitlab' : 'github'}:${repo}`,
207
293
  shaRemoto: ponta,
208
294
  pushVerificado: true,
209
- fonteDaProva: `gh api repos/${repo}/compare/${mergeSha}...${ponta} (status ${String(comparacao.status)}; ponta de ${base} por gh api repos/${repo}/branches/${base})`,
295
+ // `identical`: o merge e a propria ponta, e a comparacao nem e consultada.
296
+ fonteDaProva: gitlab && comparacao === 'identical'
297
+ ? `merge = ponta de ${base} por glab api ${(0, pedidos_1.projetoNaApi)(repo)}/repository/branches/${encodeURIComponent(base)}`
298
+ : gitlab
299
+ ? `glab api ${(0, pedidos_1.projetoNaApi)(repo)}/repository/compare?from=${ponta}&to=${mergeSha}&straight=false (status ${comparacao}; ponta de ${base} por glab api ${(0, pedidos_1.projetoNaApi)(repo)}/repository/branches/${encodeURIComponent(base)})`
300
+ : `gh api repos/${repo}/compare/${mergeSha}...${ponta} (status ${comparacao}; ponta de ${base} por gh api repos/${repo}/branches/${base})`,
210
301
  autorizadoPor: ci ? 'merge de PR com o CI independente verde no SHA exato' : 'merge de PR em repositorio externo declarado sem CI no manifesto',
211
302
  tipoDeAutorizacao: 'pr-externo',
212
303
  modo: thread.modo,
@@ -216,19 +307,28 @@ function registrarEntregaExternaPorPr(carregado, threadId, opcoes) {
216
307
  avancarParaShip(raiz, threadId);
217
308
  if (opcoes.publicar !== false)
218
309
  (0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
219
- return resultado(threadId, 'registrou', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistrou(mergeSha.slice(0, 7), n, repo)), { mergeSha, headSha, ci });
310
+ return resultado(threadId, 'registrou', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistrou(mergeSha.slice(0, 7), n, repo, !!gitlab)), { mergeSha, headSha, ci });
220
311
  }
221
312
  /** `ork ship registrar-pr --todas`: toda thread aberta que ja tem merge `ship(<thread>)` na base. */
222
313
  function registrarEntregasPorPr(carregado, opcoes = {}) {
223
314
  const remoto = (0, branch_de_estado_1.exigirRemoto)(opcoes.remoto ?? 'origin', 'ship');
224
315
  const base = carregado.manifesto.worktree.base_branch;
225
- (0, util_1.exec)('git', ['fetch', '-q', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], carregado.raiz);
226
- const r = (0, thread_1.listarIds)(carregado.raiz)
227
- .filter((id) => (0, thread_1.lerThread)(carregado.raiz, id).status !== 'fechada')
316
+ const busca = (0, util_1.exec)('git', ['fetch', '-q', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], carregado.raiz);
317
+ const abertas = (0, thread_1.listarIds)(carregado.raiz).filter((id) => (0, thread_1.lerThread)(carregado.raiz, id).status !== 'fechada');
318
+ // Sem leitura do remoto nao ha como saber quais threads tem merge: uma recusa por thread aberta, nunca lista vazia.
319
+ if (!busca.ok) {
320
+ return abertas.map((id) => resultado(id, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemLeitura(remoto, base)), { codigo: 'entrega.sem-leitura' }));
321
+ }
322
+ // RM-058, integracao (T1.1): os arcos lidos uma vez para o lote; a thread do arco e pulada com o motivo, e as outras seguem.
323
+ const arcos = (0, noctum_guarda_1.lerArcosDaRaiz)(carregado.raiz);
324
+ const r = abertas
228
325
  .filter((id) => mergeDaEntrega(carregado.raiz, id, remoto, base) !== null)
229
326
  .map((id) => {
230
327
  try {
231
- return registrarEntregaPorPr(carregado, id, { ...opcoes, buscar: false, publicar: false });
328
+ const guarda = (0, noctum_guarda_1.guardaDaThread)(carregado.raiz, id, arcos.quando, { arcos });
329
+ if (guarda)
330
+ return resultado(id, 'pulada', guarda.texto, { codigo: guarda.motivo });
331
+ return registrarEntregaPorPr(carregado, id, { ...opcoes, buscar: false, publicar: false, arcos });
232
332
  }
233
333
  catch (e) {
234
334
  return resultado(id, 'recusada', e instanceof locale_1.ErroDoCatalogo ? (0, locale_1.textoDoCatalogo)(e.montar) : e.message);
@@ -63,9 +63,10 @@ const projeto_alvo_1 = require("./projeto-alvo");
63
63
  const runtime_profiles_1 = require("./runtime-profiles");
64
64
  const thread_1 = require("./thread");
65
65
  const util_1 = require("./util");
66
+ const locale_1 = require("./locale");
66
67
  exports.CONTRATO_ESGOTAMENTOS = 'ork.esgotamentos/v1';
67
- exports.LIMITE_DO_RELATORIO = 'o registro guarda so as marcas vivas (uso bem sucedido, login reconferido e prazo vencido ' +
68
- 'apagam a marca): o total e um piso, valido enquanto a marca existe';
68
+ /** O limite que o `--json` leva: dado, sempre em pt-BR (RM-061, F3b: o texto mora no catalogo). */
69
+ exports.LIMITE_DO_RELATORIO = (0, locale_1.msg)('pt-BR').accounts.limiteDoRelatorio;
69
70
  exports.NAO_REGISTRADO = 'nao registrado';
70
71
  function contaOpaca(chave) {
71
72
  return (0, node_crypto_1.createHash)('sha256').update(chave).digest('hex').slice(0, 12);
@@ -160,22 +161,23 @@ function relatorioDeEsgotamentos(opcoes = {}) {
160
161
  }
161
162
  /** Texto para o terminal, com o horario do dono e o fuso uma vez no fim. */
162
163
  function textoDosEsgotamentos(r) {
164
+ // RM-061 (F3b): o texto pelo catalogo; o estado da marca so se traduz aqui, e o limite do `--json` (pt-BR) sai no locale.
165
+ const t = (0, locale_1.msg)().accounts;
163
166
  const linhas = [
164
- `Esgotamentos de conta ${(0, horario_1.formatarDataHora)(r.periodo.desde)} ate ${(0, horario_1.formatarDataHora)(r.periodo.ate)} ${r.periodo.intervalo}`,
165
- ` marcas vivas no registro: ${r.marcas.length}`,
167
+ t.esgotamentosTitulo((0, horario_1.formatarDataHora)(r.periodo.desde), (0, horario_1.formatarDataHora)(r.periodo.ate), r.periodo.intervalo),
168
+ t.marcasVivas(r.marcas.length),
166
169
  ];
167
170
  for (const m of r.marcas) {
168
- const ate = m.estado === 'esgotado' ? `ate ${(0, horario_1.formatarDataHora)(m.esgotadoAte)}` : 'sem prazo';
169
- linhas.push(` conta ${m.conta} ${m.runtime} ${m.estado} desde ${(0, horario_1.formatarDataHora)(m.em)}, ${ate} visto em ${m.projeto} (${m.motivo})`);
171
+ linhas.push(t.marca(m.conta, m.runtime, t.estado(m.estado), (0, horario_1.formatarDataHora)(m.em), m.estado === 'esgotado' ? (0, horario_1.formatarDataHora)(m.esgotadoAte) : null, m.projeto, m.motivo));
170
172
  }
171
- linhas.push(` projetos lidos: ${r.projetos.length === 0 ? 'nenhum registrado'
172
- : r.projetos.map((p) => `${p.nome} (${p.presente ? `${p.despachosComPerfil} despacho(s) com perfil` : 'fora do disco'})`).join(', ')}`);
173
- linhas.push(` despachos em conta marcada por outro projeto: ${r.total}`);
173
+ linhas.push(t.projetosLidos(r.projetos.length === 0 ? null
174
+ : r.projetos.map((p) => t.projetoLido(p.nome, p.presente ? p.despachosComPerfil : null)).join(', ')));
175
+ linhas.push(t.despachosMarcados(r.total));
174
176
  if (r.despachos.length > 0) {
175
- linhas.push((0, util_1.tabela)(['QUANDO', 'PROJETO', 'THREAD', 'FASE', 'PERFIL', 'CONTA', 'MARCADA POR'], r.despachos.map((d) => [(0, horario_1.formatarDataHora)(d.em), d.projeto, d.thread, d.fase ?? '-', d.perfil, d.conta, d.marcadaPor]))
177
+ linhas.push((0, util_1.tabela)([...t.colunasDosDespachos], r.despachos.map((d) => [(0, horario_1.formatarDataHora)(d.em), d.projeto, d.thread, d.fase ?? '-', d.perfil, d.conta, d.marcadaPor]))
176
178
  .split('\n').map((l) => ` ${l}`).join('\n'));
177
179
  }
178
- linhas.push(` limite: ${r.limite}`);
180
+ linhas.push(t.limite(r.limite === exports.LIMITE_DO_RELATORIO ? t.limiteDoRelatorio : r.limite));
179
181
  linhas.push((0, horario_1.legendaDoFuso)());
180
182
  return linhas.join('\n');
181
183
  }
@@ -44,6 +44,7 @@ const fs = __importStar(require("node:fs"));
44
44
  const path = __importStar(require("node:path"));
45
45
  const node_crypto_1 = require("node:crypto");
46
46
  const util_1 = require("./util");
47
+ const locale_1 = require("./locale");
47
48
  function raizDoEstado(raiz) {
48
49
  const local = path.resolve(raiz);
49
50
  const git = path.join(local, '.git');
@@ -51,7 +52,7 @@ function raizDoEstado(raiz) {
51
52
  return local;
52
53
  const match = /^gitdir: (.+)\s*$/m.exec(fs.readFileSync(git, 'utf8'));
53
54
  if (!match)
54
- throw new Error(`.git inválido em ${local}`);
55
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.gitInvalido(local));
55
56
  const gitdir = path.resolve(local, match[1].trim());
56
57
  const commondir = path.join(gitdir, 'commondir');
57
58
  if (!fs.existsSync(commondir))
@@ -60,13 +61,13 @@ function raizDoEstado(raiz) {
60
61
  const principal = path.dirname(comum);
61
62
  if (!fs.existsSync(path.join(principal, '.git')) ||
62
63
  fs.realpathSync(path.join(principal, '.git')) !== fs.realpathSync(comum)) {
63
- throw new Error(`árvore principal não resolvida pelo git-common-dir: ${comum}`);
64
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.arvorePrincipal(comum));
64
65
  }
65
66
  return principal;
66
67
  }
67
68
  function estadoCanonico(raiz, id) {
68
69
  if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(id))
69
- throw new Error('id de thread inválido');
70
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.idInvalido);
70
71
  const principal = raizDoEstado(raiz);
71
72
  exigirEstadoSemLink(principal, ['.orkastery', 'threads', id]);
72
73
  return path.join(principal, '.orkastery', 'threads', id);
@@ -85,8 +86,8 @@ function exigirEstadoSemLink(principal, componentes) {
85
86
  if (!stat)
86
87
  return;
87
88
  if (stat.isSymbolicLink()) {
88
- throw new Error(`estado.link: ${path.relative(principal, atual)} é link simbólico; o estado do ork fica em ` +
89
- 'pastas de verdade dentro da raiz (um link versionado levaria a escrita para fora dela). Remova o link.');
89
+ const rel = path.relative(principal, atual);
90
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.link(rel));
90
91
  }
91
92
  }
92
93
  }
@@ -97,11 +98,11 @@ function arquivos(dir, prefixo = '') {
97
98
  return fs.readdirSync(path.join(dir, prefixo), { withFileTypes: true }).flatMap(e => {
98
99
  const nome = path.join(prefixo, e.name);
99
100
  if (e.isSymbolicLink())
100
- throw new Error(`estado legado contém link: ${nome}`);
101
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.legadoComLink(nome));
101
102
  if (e.isDirectory())
102
103
  return arquivos(dir, nome);
103
104
  if (!e.isFile())
104
- throw new Error(`estado legado contém arquivo especial: ${nome}`);
105
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.legadoEspecial(nome));
105
106
  return [nome];
106
107
  });
107
108
  }
@@ -122,18 +123,18 @@ function vincularEstado(raiz, id, worktree, dryRun = false) {
122
123
  if (path.resolve(local) === alvo)
123
124
  return;
124
125
  if (raizDoEstado(worktree) !== raizDoEstado(raiz))
125
- throw new Error('worktree não pertence à árvore principal');
126
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.foraDaArvore);
126
127
  // O índice é próprio da linked worktree. A main continua versionando seu estado.
127
128
  const rastreados = (0, util_1.exec)('git', ['ls-files', '-z', '--', `.orkastery/threads/${id}/`], worktree);
128
129
  if (!rastreados.ok)
129
- throw new Error(`índice da worktree indisponível: ${rastreados.stderr}`);
130
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.indiceIndisponivel(rastreados.stderr));
130
131
  const nomes = rastreados.stdout.split('\0').filter(Boolean);
131
132
  const prepararIndice = () => {
132
133
  if (dryRun || nomes.length === 0)
133
134
  return;
134
135
  const r = (0, util_1.exec)('git', ['update-index', '--skip-worktree', '--', ...nomes], worktree);
135
136
  if (!r.ok)
136
- throw new Error(`não foi possível preservar o estado versionado no índice: ${r.stderr}`);
137
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.naoPreservou(r.stderr));
137
138
  };
138
139
  if (mesmoArquivo(local, alvo)) {
139
140
  prepararIndice();
@@ -144,11 +145,11 @@ function vincularEstado(raiz, id, worktree, dryRun = false) {
144
145
  const copiar = [];
145
146
  const existe = fs.existsSync(local);
146
147
  if (!existe && fs.lstatSync(path.dirname(local), { throwIfNoEntry: false })?.isSymbolicLink()) {
147
- throw new Error('diretório de threads inesperadamente vinculado');
148
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.threadsVinculado);
148
149
  }
149
150
  if (existe) {
150
151
  if (fs.lstatSync(local).isSymbolicLink())
151
- throw new Error(`link de estado aponta para outro destino: ${local}`);
152
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.linkOutroDestino(local));
152
153
  for (const nome of arquivos(local)) {
153
154
  const destino = path.join(alvo, nome);
154
155
  if (!fs.existsSync(destino)) {
@@ -162,11 +163,11 @@ function vincularEstado(raiz, id, worktree, dryRun = false) {
162
163
  // Prefixo JSONL já incorporado na main não é conflito nem deve ser duplicado.
163
164
  if (nome.endsWith('.jsonl') && a.toString().endsWith('\n') && b.subarray(0, a.length).equals(a))
164
165
  continue;
165
- throw new Error(`estado dividido: ${nome} diverge entre ${local} e ${alvo}; reconcilie antes do sync`);
166
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.dividido(nome, local, alvo));
166
167
  }
167
168
  }
168
169
  else if (fs.lstatSync(local, { throwIfNoEntry: false })) {
169
- throw new Error(`link de estado quebrado: ${local}`);
170
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.linkQuebrado(local));
170
171
  }
171
172
  // O ensaio executa o mesmo preflight, sem tocar em arquivos ou no índice.
172
173
  if (dryRun)
@@ -200,7 +201,7 @@ function comEstadoParaGit(raiz, id, worktree, executar) {
200
201
  const git = (args) => {
201
202
  const r = (0, util_1.exec)('git', args, worktree);
202
203
  if (!r.ok)
203
- throw new Error(`preparação do estado para Git falhou: ${r.stderr || r.stdout}`);
204
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.preparacaoFalhou(r.stderr || r.stdout));
204
205
  return r.stdout;
205
206
  };
206
207
  const nomes = git(['ls-files', '-z', '--', prefixo]).split('\0').filter(Boolean);
@@ -220,7 +221,7 @@ function comEstadoParaGit(raiz, id, worktree, executar) {
220
221
  const mudou = materializado && (!(0, util_1.exec)('git', ['diff', '--quiet', '--', prefixo], worktree).ok ||
221
222
  git(['ls-files', '--others', '--', prefixo]).trim() !== '');
222
223
  if (mudou)
223
- throw new Error(`estado local alterado durante operação Git: ${local}; cópia e main preservadas para reconciliação`);
224
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.alteradoDuranteGit(local));
224
225
  if (fs.existsSync(local)) {
225
226
  const backup = path.join(raizDoEstado(raiz), '.orkastery', 'state-backups', `${id}-git-${(0, node_crypto_1.randomUUID)()}`);
226
227
  fs.mkdirSync(path.dirname(backup), { recursive: true });
@@ -238,7 +239,9 @@ function auditarEstado(raiz, id, worktree) {
238
239
  return fs.existsSync(file) ? fs.readFileSync(file, 'utf8').split('\n').filter(Boolean).length : 0;
239
240
  };
240
241
  const ok = mesmoArquivo(main, local);
242
+ // RM-061 (F3b, G4): o detalhe vai ao ledger do audit em pt-BR (escopo da gravacao) e a impressao o remonta.
243
+ const eventosMain = contar(main), eventosLocal = contar(local);
241
244
  return { nome: 'estado-unico', nivel: ok ? 'ok' : 'fail',
242
- detalhe: `${ok ? 'mesmo estado' : 'estado dividido'}: main=${contar(main)} eventos, worktree=${contar(local)} eventos; ${main}`,
243
- ...(ok ? {} : { correcao: `ork worktree sync ${id}; divergências exigem reconciliação preservando evidências` }) };
245
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => m.estado.estadoUnico(ok, eventosMain, eventosLocal, main)),
246
+ ...(ok ? {} : { correcao: (0, locale_1.textoDoCatalogo)((m) => m.estado.estadoUnicoCorrecao(id)) }) };
244
247
  }