@orkastery/cli 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/ship.js CHANGED
@@ -50,6 +50,7 @@ var __importStar = (this && this.__importStar) || (function () {
50
50
  };
51
51
  })();
52
52
  Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.MODOS_QUE_AUTORIZAM_PUSH = void 0;
53
54
  exports.commitQueIncorporou = commitQueIncorporou;
54
55
  exports.autorizacaoDePush = autorizacaoDePush;
55
56
  exports.arvoreComBranch = arvoreComBranch;
@@ -58,6 +59,7 @@ exports.shaDaRef = shaDaRef;
58
59
  exports.shaNoRemoto = shaNoRemoto;
59
60
  exports.remotoConfigurado = remotoConfigurado;
60
61
  exports.detectarReversaoDaEntrega = detectarReversaoDaEntrega;
62
+ exports.unscannedCategories = unscannedCategories;
61
63
  exports.registrarReversaoDaEntrega = registrarReversaoDaEntrega;
62
64
  exports.ship = ship;
63
65
  exports.textoDoShip = textoDoShip;
@@ -70,15 +72,22 @@ const ledger_1 = require("./ledger");
70
72
  const manifest_1 = require("./manifest");
71
73
  const modos_1 = require("./modos");
72
74
  const policies_1 = require("./policies");
75
+ const estado_thread_1 = require("./estado-thread");
76
+ const report_1 = require("./security-scan/report");
77
+ const types_1 = require("./security-scan/types");
73
78
  const thread_1 = require("./thread");
74
79
  const util_1 = require("./util");
75
80
  const verify_1 = require("./verify");
76
81
  const ci_1 = require("./ci");
82
+ const forja_1 = require("./forja");
77
83
  const contrato_publico_1 = require("./contrato-publico");
78
84
  const prova_minima_1 = require("./prova-minima");
79
85
  const horario_1 = require("./horario");
80
86
  const fabrica_publicar_1 = require("./fabrica-publicar");
87
+ const mcp_ship_transporte_1 = require("./mcp-ship-transporte");
81
88
  const branch_de_estado_1 = require("./branch-de-estado");
89
+ const locale_1 = require("./locale");
90
+ const noctum_guarda_1 = require("./noctum-guarda");
82
91
  /**
83
92
  * RM-037 (fatia 5, A1): o commit de primeiro pai da base que incorporou o `shaDe`: o merge que trouxe a branch, ou
84
93
  * o proprio `shaDe` quando a base avancou por fast-forward ate ele. Com a branch ja incorporada, a ponta da base e
@@ -125,8 +134,8 @@ function contratosDaEntrega(raiz, shaPara, shaDe) {
125
134
  const diff = (0, util_1.exec)('git', ['diff', '--name-only', '--no-renames', base.stdout.trim(), shaDe], raiz);
126
135
  return diff.ok ? (0, contrato_publico_1.contratosTocados)(diff.stdout.split('\n').map((l) => l.trim()).filter(Boolean)) : [];
127
136
  }
128
- /** Modos em que a propria #TAG do pedido autoriza o push antecipadamente. */
129
- const MODOS_QUE_AUTORIZAM_PUSH = ['maestro', 'auto'];
137
+ /** Modos em que a propria #TAG do pedido autoriza o push antecipadamente (o `ork ship publicar` usa a mesma lista). */
138
+ exports.MODOS_QUE_AUTORIZAM_PUSH = ['maestro', 'auto'];
130
139
  /**
131
140
  * Quem autoriza o push desta thread.
132
141
  *
@@ -145,15 +154,15 @@ function autorizacaoDePush(raiz, thread, opcoes) {
145
154
  autorizado: true,
146
155
  tipo: 'humano-no-cli',
147
156
  por: opcoes.autorizarPush.trim(),
148
- razao: `pausa de push do modo ${tag} autorizada na linha de comando`,
157
+ razao: (0, locale_1.textoDoCatalogo)((m) => m.ship.autorizadoNaLinha(tag)),
149
158
  };
150
159
  }
151
- if (MODOS_QUE_AUTORIZAM_PUSH.includes(thread.modo)) {
160
+ if (exports.MODOS_QUE_AUTORIZAM_PUSH.includes(thread.modo)) {
152
161
  return {
153
162
  autorizado: true,
154
163
  tipo: 'modo',
155
- por: `#TAG ${tag} no pedido do builder`,
156
- razao: `o modo ${tag} entrega dentro de um bloco sem pausa: a #TAG e a autorizacao previa`,
164
+ por: (0, locale_1.textoDoCatalogo)((m) => m.ship.porTag(tag)),
165
+ razao: (0, locale_1.textoDoCatalogo)((m) => m.ship.autorizadoPeloModo(tag)),
157
166
  };
158
167
  }
159
168
  if (thread.modo === 'classic') {
@@ -162,8 +171,9 @@ function autorizacaoDePush(raiz, thread, opcoes) {
162
171
  return {
163
172
  autorizado: true,
164
173
  tipo: 'humano-antecipado',
165
- por: String(antecipada.autorizadoPor ?? 'humano'),
166
- razao: `autorizacao antecipada de push registrada no ledger em ${antecipada.ts}`,
174
+ por: antecipada.autorizadoPor !== undefined && antecipada.autorizadoPor !== null ? String(antecipada.autorizadoPor)
175
+ : (0, locale_1.textoDoCatalogo)((m) => m.ship.humano),
176
+ razao: (0, locale_1.textoDoCatalogo)((m) => m.ship.autorizadoAntes(String(antecipada.ts))),
167
177
  };
168
178
  }
169
179
  }
@@ -171,8 +181,7 @@ function autorizacaoDePush(raiz, thread, opcoes) {
171
181
  autorizado: false,
172
182
  tipo: 'pendente',
173
183
  por: '',
174
- razao: `o modo ${tag} pausa no push e ainda nao ha autorizacao humana registrada. ` +
175
- `Autorize na entrega: ork ship ${thread.id} --para <branch> --autorizar-push <quem>`,
184
+ razao: (0, locale_1.textoDoCatalogo)((m) => m.ship.semAutorizacao(tag, thread.id)),
176
185
  };
177
186
  }
178
187
  /** Diretorio temporario onde a arvore de merge e montada quando preciso. */
@@ -219,8 +228,7 @@ function prepararArvore(raiz, para) {
219
228
  const dona = arvoreComBranch(raiz, para);
220
229
  if (dona) {
221
230
  if (temAlteracaoNaoCommitada(dona)) {
222
- throw new Error(`a branch de destino "${para}" esta em check-out em ${dona} com alteracoes nao commitadas; ` +
223
- 'commite ou reverta la antes do ship');
231
+ throw new locale_1.ErroDoCatalogo((m) => m.ship.arvoreSuja(para, dona));
224
232
  }
225
233
  return { dir: dona, temporaria: false };
226
234
  }
@@ -228,17 +236,23 @@ function prepararArvore(raiz, para) {
228
236
  fs.mkdirSync(path.dirname(dir), { recursive: true });
229
237
  const r = (0, util_1.exec)('git', ['worktree', 'add', '--', dir, para], raiz);
230
238
  if (!r.ok) {
231
- throw new Error(`nao foi possivel montar a arvore de merge de "${para}": ${(r.stderr || r.stdout).trim()}`);
239
+ const erro = (r.stderr || r.stdout).trim();
240
+ throw new locale_1.ErroDoCatalogo((m) => m.ship.arvoreNaoMontada(para, erro));
232
241
  }
233
242
  return { dir, temporaria: true };
234
243
  }
235
244
  /** Remove a worktree temporaria do merge (best effort: o lease ja foi liberado). */
236
- function descartarArvore(raiz, arvore) {
245
+ function descartarArvore(raiz, arvore, trava = []) {
237
246
  if (!arvore.temporaria)
238
247
  return;
239
- (0, util_1.exec)('git', ['worktree', 'remove', '--force', arvore.dir], raiz);
240
- (0, util_1.exec)('git', ['worktree', 'prune'], raiz);
248
+ (0, util_1.exec)('git', [...trava, 'worktree', 'remove', '--force', arvore.dir], raiz);
249
+ (0, util_1.exec)('git', [...trava, 'worktree', 'prune'], raiz);
241
250
  }
251
+ /**
252
+ * O git local que o transporte fixado roda no projeto depois da ultima conferencia: nenhum hook (o
253
+ * `reference-transaction` do `update-ref`, inclusive) e nenhum fsmonitor, que o agente pode ter posto ali durante o push.
254
+ */
255
+ const TRAVA_LOCAL_DO_FIXADO = ['-c', 'core.hooksPath=/dev/null', '-c', 'core.fsmonitor='];
242
256
  /** sha de uma referencia local, ou null quando ela nao existe. */
243
257
  function shaDaRef(dir, ref) {
244
258
  const r = (0, util_1.exec)('git', ['rev-parse', '--verify', '--quiet', ref], dir);
@@ -251,17 +265,49 @@ function shaDaRef(dir, ref) {
251
265
  * E o unico jeito aceito de provar push nesta maquina: `gh api` e imprevisivel aqui, e o
252
266
  * codigo de saida do `git push` nao prova que o remoto ficou com o commit certo.
253
267
  */
254
- function shaNoRemoto(dir, remoto, branch) {
268
+ function shaNoRemoto(dir, remoto, branch, config = []) {
255
269
  // RM-047: so nome de remoto chega ao git, e depois do `--` (nunca vira opcao nem transporte).
256
- const r = (0, util_1.exec)('git', ['ls-remote', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship'), `refs/heads/${branch}`], dir, 120000);
270
+ const r = (0, util_1.exec)('git', [...configDoRemotoValida(config), 'ls-remote', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship'), `refs/heads/${branch}`], dir, 120000);
271
+ return shaDoLsRemote(r, branch);
272
+ }
273
+ function validarUrlFixada(url, config) {
274
+ const protocolo = (0, mcp_ship_transporte_1.protocoloDaConfigDeRede)(config);
275
+ const recusa = () => { throw new locale_1.ErroDoCatalogo((m) => m.ship.configDoRemotoInvalida('urlFixada')); };
276
+ if (!protocolo || typeof url !== 'string' || /[\x00-\x20\x7f]/.test(url) || url.startsWith('-'))
277
+ return recusa();
278
+ try {
279
+ const e = (0, mcp_ship_transporte_1.enderecoDoOrigin)(protocolo === 'ssh' ? 'forja-ssh' : 'forja-https', url);
280
+ if (e.transporte === 'forja-https' && (0, mcp_ship_transporte_1.urlDaConfigDeRede)(config) !== url)
281
+ return recusa();
282
+ }
283
+ catch {
284
+ return recusa();
285
+ }
286
+ return { url, protocolo };
287
+ }
288
+ /** O git que vai a rede no transporte fixado: do gitdir privado, so com o protocolo do modo. */
289
+ function gitDoRemotoFixado(f, args, timeoutMs) {
290
+ return (0, util_1.exec)('git', [`--git-dir=${f.gitdir}`, ...f.config, ...args], f.gitdir, timeoutMs, { ...process.env, GIT_ALLOW_PROTOCOL: f.protocolo });
291
+ }
292
+ function shaNoRemotoFixado(f, branch) {
293
+ return shaDoLsRemote(gitDoRemotoFixado(f, ['ls-remote', '--', f.url, `refs/heads/${branch}`], 120000), branch);
294
+ }
295
+ function shaDoLsRemote(r, branch) {
257
296
  if (!r.ok)
258
297
  return null;
259
- const linha = r.stdout.split('\n').find((l) => l.trim() !== '');
260
- if (!linha)
261
- return null;
262
- const sha = linha.split(/\s+/)[0];
298
+ // RM-059 (S1 da revisao da ork-rm059pista): o padrao do ls-remote casa por sufixo; vale so a linha da ref exata.
299
+ const linha = r.stdout.split('\n').map((l) => l.trim().split(/\s+/)).find((partes) => partes[1] === `refs/heads/${branch}`);
300
+ const sha = linha?.[0] ?? '';
263
301
  return /^[0-9a-f]{40}$/.test(sha) ? sha : null;
264
302
  }
303
+ /** So a lista que `configDeRede` emite, chave e valor: nenhuma outra opcao, chave ou valor chega antes do subcomando de rede. */
304
+ function configDoRemotoValida(config) {
305
+ const recusada = (0, mcp_ship_transporte_1.chaveRecusadaDaConfigDeRede)(config);
306
+ // Nunca ecoa o valor: so a chave (ate 80 caracteres) mostra o que foi recusado.
307
+ if (recusada !== null)
308
+ throw new locale_1.ErroDoCatalogo((m) => m.ship.configDoRemotoInvalida(recusada.slice(0, 80)));
309
+ return config;
310
+ }
265
311
  /** O remoto esta configurado neste repositorio? */
266
312
  function remotoConfigurado(dir, remoto) {
267
313
  return (0, util_1.exec)('git', ['remote', 'get-url', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship')], dir).ok;
@@ -320,7 +366,9 @@ function detectarReversaoDaEntrega(raiz, thread, para) {
320
366
  const entregas = (0, ledger_1.lerLedger)(dir)
321
367
  .filter((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.shipConcluido && typeof e.mergeSha === 'string')
322
368
  .map((e) => ({ mergeSha: String(e.mergeSha), para: para ?? String(e.para ?? '') }))
323
- .filter((e) => e.para.length > 0);
369
+ // RM-047 (fronteira de confiança): o ledger pode vir do clone. Só sha hexadecimal e nome de branch
370
+ // chegam ao `git log`; qualquer outro valor viraria opção dele e é ignorado.
371
+ .filter((e) => e.para.length > 0 && (0, branch_de_estado_1.shaValido)(e.mergeSha) && (0, branch_de_estado_1.branchValida)(e.para));
324
372
  if (entregas.length === 0)
325
373
  return null;
326
374
  const perguntados = new Set();
@@ -330,7 +378,7 @@ function detectarReversaoDaEntrega(raiz, thread, para) {
330
378
  continue;
331
379
  perguntados.add(intervalo);
332
380
  // O historico e append-only: o merge continua la, e o revert vem DEPOIS dele.
333
- const log = (0, util_1.exec)('git', ['log', '--format=%H%x1f%B%x1e', intervalo], raiz, 60000);
381
+ const log = (0, util_1.exec)('git', ['log', '--format=%H%x1f%B%x1e', '--end-of-options', intervalo], raiz, 60000);
334
382
  if (!log.ok)
335
383
  continue;
336
384
  for (const bruto of log.stdout.split('\x1e')) {
@@ -344,6 +392,23 @@ function detectarReversaoDaEntrega(raiz, thread, para) {
344
392
  }
345
393
  return null;
346
394
  }
395
+ /**
396
+ * Loop categories (secret, dependency, sast, iac, workflow) not scanned for `sha` (spec 11.2): `[]` without
397
+ * `verify.security_scan` and with `ci.required_for_ship` (the scan is then in the CI bundle, which the independent CI
398
+ * check covers). Otherwise the report of `sha` decides: a loop tool `unavailable` or `failed` leaves its category
399
+ * unscanned (the spec says `unavailable`; a `failed` loop tool is equally not scanned, never clean), except the
400
+ * "nothing to scan" reasons excused by `isExcusedUnscanned` (same rule as the exit code), and no report at all leaves
401
+ * every loop category unscanned (no evidence is not clean). Sorted, distinct.
402
+ */
403
+ function unscannedCategories(carregado, sha) {
404
+ if (carregado.manifesto.verify.security_scan === undefined || carregado.manifesto.ci.required_for_ship)
405
+ return [];
406
+ const report = (0, report_1.readReport)((0, estado_thread_1.raizDoEstado)(carregado.raiz), sha);
407
+ if (!report)
408
+ return [...types_1.LOOP_CATEGORIES].sort();
409
+ const missing = (0, report_1.unscannedLoopTools)(report).map(t => t.category);
410
+ return [...new Set(missing)].sort();
411
+ }
347
412
  /**
348
413
  * Grava `rollback_done` quando a reversao e nova, e devolve o que encontrou.
349
414
  *
@@ -376,7 +441,20 @@ function ship(carregado, threadId, opcoes) {
376
441
  // so nome de remoto passa; o resto recusa com `ship.remoto-invalido`, e o ship nao entrega sem push provado
377
442
  // por um remoto que nunca existiu.
378
443
  const remoto = (0, branch_de_estado_1.exigirRemoto)(opcoes.remoto ?? 'origin', 'ship');
444
+ const configDoRemoto = configDoRemotoValida(opcoes.configDoRemoto ?? []);
445
+ const comConfig = (args) => `git ${[...configDoRemoto, ...args].join(' ')}`;
446
+ const urlFixada = opcoes.urlFixada === undefined ? null : validarUrlFixada(opcoes.urlFixada, configDoRemoto);
447
+ // Nos passos, o gitdir privado e a URL fixada vao por nome: o caminho temporario nao diz nada a quem le.
379
448
  const r = baseDoResultado(thread, de, opcoes);
449
+ // RM-058, integracao (T1.1, D3 da ork-rm058integra): a thread de um arco #Noctum que a guarda e entregue pelo passo da
450
+ // entrega do arco, nunca por aqui (nem pelo `ork_ship` do MCP, que chama este mesmo ship). A recusa vem antes de qualquer
451
+ // git e nao vai ao ledger da thread: um `ship_blocked` ou um gate por uma tentativa de fora pesaria no indice da thread e
452
+ // apareceria como pausa do dono na fila do arco.
453
+ const guarda = (0, noctum_guarda_1.guardaDaThread)(raiz, threadId);
454
+ if (guarda) {
455
+ return { ...r, autorizacao: autorizacaoDePush(raiz, thread, opcoes), bloqueado: true, ok: false, motivo: 'policy.violation',
456
+ codigo: guarda.motivo, detalhe: guarda.detalhe, correcao: guarda.correcao };
457
+ }
380
458
  // I-43 (T7): antes de qualquer coisa, se a entrega ANTERIOR desta thread foi
381
459
  // revertida na base, isso vira `rollback_done`. E o insumo de maior peso do indice
382
460
  // de qualidade, e o unico fato que diz sem interpretacao que a entrega nao servia.
@@ -385,7 +463,18 @@ function ship(carregado, threadId, opcoes) {
385
463
  registrarReversaoDaEntrega(raiz, thread, para);
386
464
  }
387
465
  catch { /* git indisponivel nao barra o ship */ }
388
- const bloquear = (motivo, detalhe, correcao) => {
466
+ // O push pode ter saido: a troca do origin ou da config durante ele bloqueia o gate no ledger e sobe tipada.
467
+ const conferirDepoisDoPush = (passos) => {
468
+ try {
469
+ opcoes.conferirDepoisDoPush?.();
470
+ }
471
+ catch (e) {
472
+ r.passos = passos;
473
+ bloquear('runtime.unavailable', e instanceof locale_1.ErroDoCatalogo ? (0, locale_1.textoDoCatalogo)(e.montar) : e.message, (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProvaCorrecao), 'transport.mudou-no-push');
474
+ throw e;
475
+ }
476
+ };
477
+ const bloquear = (motivo, detalhe, correcao, codigo) => {
389
478
  (0, gates_1.registrarGateBloqueado)(dir, threadId, {
390
479
  gate: 'ship',
391
480
  motivo,
@@ -401,18 +490,19 @@ function ship(carregado, threadId, opcoes) {
401
490
  de,
402
491
  para,
403
492
  motivo,
493
+ ...(codigo ? { codigo } : {}),
404
494
  detalhe,
405
495
  correcao,
406
496
  modo: thread.modo,
407
497
  dryRun: r.dryRun,
408
498
  });
409
- return { ...r, bloqueado: true, ok: false, motivo, detalhe, correcao };
499
+ return { ...r, bloqueado: true, ok: false, motivo, detalhe, correcao, ...(codigo ? { codigo } : {}) };
410
500
  };
411
501
  // 1. Autorizacao de push pelo gate do modo de conducao.
412
502
  const autorizacao = autorizacaoDePush(raiz, thread, opcoes);
413
503
  r.autorizacao = autorizacao;
414
504
  if (!autorizacao.autorizado) {
415
- return bloquear('human.pending', autorizacao.razao, `ork ship ${threadId} --para <branch> --autorizar-push <quem>`);
505
+ return bloquear('human.pending', autorizacao.razao, (0, locale_1.textoDoCatalogo)((m) => m.ship.autorizeNaEntrega(threadId)));
416
506
  }
417
507
  // 2. Policies do manifesto que valem no gate `ship`. RM-008 (fatia 3): a branch da thread
418
508
  // atras da base e fato do git, calculado aqui (a ponta da base nao esta contida na branch).
@@ -463,20 +553,21 @@ function ship(carregado, threadId, opcoes) {
463
553
  return bloquear('policy.violation', bloqueiam.map((v) => `${v.policy}: ${v.detalhe}`).join('; '), bloqueiam.map((v) => v.correcao).join('; '));
464
554
  }
465
555
  // 3. Verificacao independente: reexecuta claims e comandos no HEAD real da thread.
466
- const verificacao = (0, verify_1.verificar)(carregado, threadId, { executor: opcoes.executorVerify });
556
+ const verificacao = (0, verify_1.verificar)(carregado, threadId, { executor: opcoes.executorVerify,
557
+ conducao: { filaPesada: { ...opcoes.avisoDaFilaPesada, esperarMs: opcoes.esperarFilaPesadaMs } } });
467
558
  r.verificacao = verificacao;
468
559
  if (!verificacao.ok) {
469
560
  const motivo = verificacao.motivos.find((m) => m !== 'claims.unverifiable');
470
- return bloquear(motivo, `verificacao reprovou no HEAD ${verificacao.commit}: ${verificacao.motivos.join(', ')}`, 'rode `ork verify ' + threadId + '` e corrija antes de entregar');
561
+ return bloquear(motivo, (0, locale_1.textoDoCatalogo)((m) => m.ship.verificacaoReprovou(verificacao.commit, verificacao.motivos.join(', '))), (0, locale_1.textoDoCatalogo)((m) => m.ship.rodeVerify(threadId)));
471
562
  }
472
563
  // Referencias locais, resolvidas antes de tomar o lease.
473
564
  const shaDe = shaDaRef(raiz, `refs/heads/${de}`);
474
565
  const shaPara = shaDaRef(raiz, `refs/heads/${para}`);
475
566
  if (!shaDe) {
476
- return bloquear('artifact.missing', `branch de origem "${de}" nao existe neste repositorio`, `use --de <branch> ou crie a branch da thread`);
567
+ return bloquear('artifact.missing', (0, locale_1.textoDoCatalogo)((m) => m.ship.origemAusente(de)), (0, locale_1.textoDoCatalogo)((m) => m.ship.origemAusenteCorrecao));
477
568
  }
478
569
  if (!shaPara) {
479
- return bloquear('artifact.missing', `branch de destino "${para}" nao existe neste repositorio`, `crie a branch de destino ou informe outra em --para`);
570
+ return bloquear('artifact.missing', (0, locale_1.textoDoCatalogo)((m) => m.ship.destinoAusente(para)), (0, locale_1.textoDoCatalogo)((m) => m.ship.destinoAusenteCorrecao));
480
571
  }
481
572
  r.shaDe = shaDe;
482
573
  r.shaParaAntes = shaPara;
@@ -484,14 +575,29 @@ function ship(carregado, threadId, opcoes) {
484
575
  // por git direto. Ciclo sem PLAN nem CHECK nao entrega contrato publico.
485
576
  const tocados = (0, prova_minima_1.cicloSemCheck)(thread) ? contratosDaEntrega(raiz, shaPara, shaDe) : [];
486
577
  if (tocados.length > 0) {
487
- return bloquear('policy.violation', `contrato publico em ciclo sem PLAN nem CHECK: ${tocados.join(', ')}`, 'refaca a mudanca numa thread #Classic, #Maestro ou #Auto');
578
+ return bloquear('policy.violation', (0, locale_1.textoDoCatalogo)((m) => m.ship.contratoPublico(tocados.join(', '))), (0, locale_1.textoDoCatalogo)((m) => m.ship.contratoPublicoCorrecao));
488
579
  }
489
580
  // O recibo vem do provedor e pertence ao SHA exato da candidata. Teste local
490
581
  // verde ou status de outro commit não libera a entrega.
491
582
  const ci = (0, ci_1.consultarCi)(carregado, shaDe, remoto, opcoes.executorCi);
492
583
  r.ci = ci;
493
584
  if (!ci.ok) {
494
- return bloquear('ci.failed', `${ci.detail} (commit ${shaDe}, contexto ${ci.context})`, `publique a branch, aguarde o check ${ci.context} verde no GitHub e repita o SHIP`);
585
+ return bloquear('ci.failed', (0, locale_1.textoDoCatalogo)((m) => m.ship.ciReprovou((0, locale_1.remontar)(ci.detail), shaDe, ci.context)), (0, locale_1.textoDoCatalogo)((m) => m.ship.ciReprovouCorrecao(ci.context)));
586
+ }
587
+ // Security scan (spec 11.2): com `verify.security_scan` e sem o scan no bundle do CI, categoria do laco sem varredura
588
+ // no SHA da candidata pede autorizacao humana, antes de qualquer push.
589
+ const naoVarridas = unscannedCategories(carregado, shaDe);
590
+ let autorizariaSemScan = null;
591
+ if (naoVarridas.length > 0) {
592
+ const quem = opcoes.allowUnscanned?.trim();
593
+ if (!quem) {
594
+ return bloquear('human.pending', (0, locale_1.textoDoCatalogo)((m) => m.ship.scanNaoVarrido(naoVarridas.join(', '), shaDe)), (0, locale_1.textoDoCatalogo)((m) => m.ship.scanNaoVarridoCorrecao(threadId)));
595
+ }
596
+ // O ensaio nao grava a autorizacao: so diz, nos passos, o que o ship real gravaria.
597
+ if (r.dryRun)
598
+ autorizariaSemScan = (0, locale_1.textoDoCatalogo)((m) => m.ship.passoAutorizariaSemScan(quem, naoVarridas.join(', '), shaDe));
599
+ else
600
+ (0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.entregaSemScanAutorizada, { por: quem, categorias: naoVarridas, sha: shaDe });
495
601
  }
496
602
  // 4. Lease `main-tree`: so uma thread mergeia por vez.
497
603
  if (r.dryRun) {
@@ -500,20 +606,21 @@ function ship(carregado, threadId, opcoes) {
500
606
  // O ensaio tambem responde ONDE o merge aconteceria e se aquela arvore esta limpa:
501
607
  // descobrir isso so na hora do merge real seria descobrir tarde demais.
502
608
  const dona = arvoreComBranch(raiz, para);
503
- const arvoreDoMerge = dona
504
- ? `${dona} (arvore que tem ${para} em check-out; ${temAlteracaoNaoCommitada(dona) ? 'SUJA, o ship reprovaria com tree.blocked' : 'limpa'})`
505
- : `worktree temporaria em ${path.join((0, manifest_1.dirEstado)(raiz), 'tmp')} (ninguem tem ${para} em check-out)`;
506
- r.detalhe = `arvore de merge: ${arvoreDoMerge}`;
609
+ const suja = dona ? temAlteracaoNaoCommitada(dona) : false;
610
+ const temporaria = path.join((0, manifest_1.dirEstado)(raiz), 'tmp');
611
+ const arvoreDoMerge = (m) => dona ? m.ship.arvoreDona(dona, para, suja) : m.ship.arvoreTemporaria(temporaria, para);
612
+ r.detalhe = (0, locale_1.textoDoCatalogo)((m) => m.ship.arvoreDeMerge(arvoreDoMerge(m)));
507
613
  // Ensaio de 03/10 (R5): sem remoto (ou com --sem-push), o ensaio diz o mesmo que o ship real, e nao
508
614
  // promete um push e uma prova que nao vao acontecer.
509
- const semPushNoReal = opcoes.semPush ? 'push nao executado por --sem-push (merge local concluido)'
510
- : !remotoConfigurado(raiz, remoto) ? `remoto "${remoto}" nao configurado: merge local concluido, sem push a provar` : null;
615
+ const semPushNoReal = opcoes.semPush || !remotoConfigurado(raiz, remoto)
616
+ ? (m) => opcoes.semPush ? m.ship.semPushPorFlag : m.ship.semRemoto(remoto) : null;
511
617
  r.passos = [
512
- `arvore de merge: ${arvoreDoMerge}`,
513
- `git merge --no-ff ${de} -m "<mensagem de ship>"`,
514
- ...(semPushNoReal ? [`sem push: ${semPushNoReal}`] : [
618
+ r.detalhe,
619
+ ...(autorizariaSemScan ? [autorizariaSemScan] : []),
620
+ (0, locale_1.textoDoCatalogo)((m) => m.ship.passoMerge(de)),
621
+ ...(semPushNoReal ? [(0, locale_1.textoDoCatalogo)((m) => m.ship.passoSemPush(semPushNoReal(m)))] : [
515
622
  `git push ${remoto} ${para}`,
516
- `git ls-remote ${remoto} refs/heads/${para} (prova do push)`,
623
+ (0, locale_1.textoDoCatalogo)((m) => m.ship.passoProvaDoPush(remoto, para)),
517
624
  ]),
518
625
  ];
519
626
  (0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.shipIniciado, {
@@ -547,9 +654,7 @@ function ship(carregado, threadId, opcoes) {
547
654
  bloqueadaPor: dono?.thread ?? '(desconhecida)',
548
655
  motivo: aquisicao.motivo ?? 'lease.busy',
549
656
  });
550
- return bloquear(aquisicao.motivo ?? 'lease.busy', aquisicao.falhaRetomada ? aquisicao.detalhe : `lease ${leases_1.LEASE_MAIN_TREE} esta com a thread ${dono?.thread ?? '(desconhecida)'} ` +
551
- `desde ${dono?.adquiridoEm ?? '?'} (${dono?.motivo ?? 'sem motivo'}); ` +
552
- `esta thread entrou na merge queue na posicao ${aquisicao.posicaoNaFila}`, aquisicao.correcao);
657
+ return bloquear(aquisicao.motivo ?? 'lease.busy', aquisicao.falhaRetomada ? aquisicao.detalhe : (0, locale_1.textoDoCatalogo)((m) => m.ship.leaseComOutra(leases_1.LEASE_MAIN_TREE, dono?.thread ?? m.ship.desconhecida, dono?.adquiridoEm ?? '?', dono?.motivo ?? m.ship.semMotivo, aquisicao.posicaoNaFila)), aquisicao.correcao);
553
658
  }
554
659
  r.lease = aquisicao.lease;
555
660
  (0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.leaseAdquirido, {
@@ -576,7 +681,7 @@ function ship(carregado, threadId, opcoes) {
576
681
  }
577
682
  catch (e) {
578
683
  // Arvore de destino indisponivel e reprovacao tipada, nao excecao vazando pelo CLI.
579
- return bloquear('tree.blocked', e.message, 'deixe a arvore da branch de destino limpa (ou libere a branch) e rode o ship de novo');
684
+ return bloquear('tree.blocked', e instanceof locale_1.ErroDoCatalogo ? (0, locale_1.textoDoCatalogo)(e.montar) : e.message, (0, locale_1.textoDoCatalogo)((m) => m.ship.arvoreCorrecao));
580
685
  }
581
686
  const passos = [];
582
687
  opcoes.revalidarGit?.('merge', arvore.dir);
@@ -600,11 +705,12 @@ function ship(carregado, threadId, opcoes) {
600
705
  if (!merge.ok) {
601
706
  (0, util_1.exec)('git', ['merge', '--abort'], arvore.dir);
602
707
  r.passos = [...passos, 'git merge --abort'];
603
- return bloquear('artifact.missing', `merge de ${de} em ${para} falhou: ${(merge.stderr || merge.stdout).trim().slice(0, 400)}`, 'resolva o conflito na branch da thread e rode o ship de novo');
708
+ const erro = (merge.stderr || merge.stdout).trim().slice(0, 400);
709
+ return bloquear('artifact.missing', (0, locale_1.textoDoCatalogo)((m) => m.ship.mergeFalhou(de, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.mergeFalhouCorrecao));
604
710
  }
605
711
  const novo = shaDaRef(arvore.dir, 'HEAD');
606
712
  if (!novo) {
607
- return bloquear('artifact.missing', 'nao foi possivel ler o HEAD apos o merge', 'confira o repositorio');
713
+ return bloquear('artifact.missing', (0, locale_1.textoDoCatalogo)((m) => m.ship.headIlegivel), (0, locale_1.textoDoCatalogo)((m) => m.ship.confiraRepositorio));
608
714
  }
609
715
  mergeSha = novo;
610
716
  pontaDaBase = novo;
@@ -612,50 +718,87 @@ function ship(carregado, threadId, opcoes) {
612
718
  const incorporou = (0, util_1.exec)('git', ['merge-base', '--is-ancestor', shaDe, mergeSha], arvore.dir).ok;
613
719
  passos.push(`git merge-base --is-ancestor ${shaDe.slice(0, 8)} ${mergeSha.slice(0, 8)}`);
614
720
  if (!incorporou) {
615
- return bloquear('artifact.missing', `o commit de ${de} nao aparece como ancestral do merge ${mergeSha}`, 'nao empurre: investigue o estado do repositorio');
721
+ return bloquear('artifact.missing', (0, locale_1.textoDoCatalogo)((m) => m.ship.naoAncestral(de, mergeSha)), (0, locale_1.textoDoCatalogo)((m) => m.ship.naoEmpurre));
616
722
  }
617
723
  }
618
724
  else {
619
725
  // RM-037 (fatia 5, A1): o merge que trouxe a branch, e nao a ponta da base.
620
726
  const incorporadoEm = commitQueIncorporou(raiz, shaDe, shaPara, passos);
621
727
  if (!incorporadoEm) {
622
- return bloquear('artifact.missing', `${de} ja e ancestral de ${para}, mas o git nao achou o commit de primeiro pai que o incorporou`, 'confira o repositorio: o ship_done precisa do merge que entregou a thread');
728
+ return bloquear('artifact.missing', (0, locale_1.textoDoCatalogo)((m) => m.ship.semPrimeiroPai(de, para)), (0, locale_1.textoDoCatalogo)((m) => m.ship.semPrimeiroPaiCorrecao));
623
729
  }
624
730
  mergeSha = incorporadoEm;
625
- passos.push(`(nada a mergear: ${de} ja e ancestral de ${para}, incorporado em ${mergeSha.slice(0, 8)})`);
731
+ const incorporado = mergeSha.slice(0, 8);
732
+ passos.push((0, locale_1.textoDoCatalogo)((m) => m.ship.passoJaIncorporado(de, para, incorporado)));
626
733
  }
627
734
  r.mergeSha = mergeSha;
628
735
  r.pontaDaBase = pontaDaBase;
629
736
  opcoes.revalidarGit?.('push', arvore.dir);
630
737
  // 6. Push PROVADO por ls-remote.
631
- const temRemoto = remotoConfigurado(arvore.dir, remoto);
738
+ const temRemoto = urlFixada !== null || remotoConfigurado(arvore.dir, remoto);
632
739
  r.remoto = temRemoto ? remoto : null;
633
- if (opcoes.semPush || !temRemoto) {
740
+ if (urlFixada && !opcoes.semPush) {
741
+ const fixado = { gitdir: (0, mcp_ship_transporte_1.criarGitdirDoPush)(raiz), ...urlFixada, config: configDoRemoto };
742
+ const comFixado = (args) => `git --git-dir=<gitdir privado> ${[...configDoRemoto, ...args].join(' ')}`.replaceAll(urlFixada.url, '<origin fixado>');
743
+ try {
744
+ // O sha e o decidido aqui. Sem `-u`: o gitdir privado nao tem branch para rastrear, e gravar o upstream na
745
+ // config do projeto mudaria a config conferida; o `ls-remote` que so decidia o `-u` sai junto.
746
+ const argsPush = ['push', '--', urlFixada.url, `${pontaDaBase}:refs/heads/${para}`];
747
+ const push = gitDoRemotoFixado(fixado, argsPush, 300000);
748
+ passos.push(comFixado(argsPush));
749
+ if (!push.ok) {
750
+ r.passos = passos;
751
+ const erro = (0, forja_1.detalheDoPush)(push.stderr || push.stdout);
752
+ if ((0, forja_1.pushRecusadoPelaProtecao)(`${push.stderr}\n${push.stdout}`)) {
753
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegida(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegidaCorrecao(threadId)), 'entrega.base-protegida');
754
+ }
755
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhou(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhouCorrecao));
756
+ }
757
+ const shaRemoto = shaNoRemotoFixado(fixado, para);
758
+ passos.push(comFixado(['ls-remote', '--', urlFixada.url, `refs/heads/${para}`]));
759
+ conferirDepoisDoPush(passos);
760
+ r.shaRemoto = shaRemoto;
761
+ r.pushVerificado = shaRemoto !== null && shaRemoto === pontaDaBase;
762
+ if (!r.pushVerificado) {
763
+ r.passos = passos;
764
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProva(shaRemoto, pontaDaBase)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProvaCorrecao));
765
+ }
766
+ // A ref de rastreio do projeto acompanha o remoto provado, como no push por nome; local, sem rede.
767
+ (0, util_1.exec)('git', [...TRAVA_LOCAL_DO_FIXADO, 'update-ref', '--', `refs/remotes/${remoto}/${para}`, pontaDaBase], raiz);
768
+ }
769
+ finally {
770
+ fs.rmSync(fixado.gitdir, { recursive: true, force: true });
771
+ }
772
+ }
773
+ else if (opcoes.semPush || !temRemoto) {
634
774
  r.pushVerificado = false;
635
- r.detalhe = opcoes.semPush
636
- ? 'push nao executado por --sem-push (merge local concluido)'
637
- : `remoto "${remoto}" nao configurado: merge local concluido, sem push a provar`;
775
+ r.detalhe = (0, locale_1.textoDoCatalogo)((m) => opcoes.semPush ? m.ship.semPushPorFlag : m.ship.semRemoto(remoto));
638
776
  }
639
777
  else {
640
- const existeNoRemoto = shaNoRemoto(arvore.dir, remoto, para) !== null;
778
+ const existeNoRemoto = shaNoRemoto(arvore.dir, remoto, para, configDoRemoto) !== null;
641
779
  const argsPush = existeNoRemoto
642
780
  ? ['push', '--', remoto, `refs/heads/${para}:refs/heads/${para}`]
643
781
  : ['push', '-u', '--', remoto, `refs/heads/${para}:refs/heads/${para}`];
644
- const push = (0, util_1.exec)('git', argsPush, arvore.dir, 300000);
645
- passos.push(`git ${argsPush.join(' ')}`);
782
+ const push = (0, util_1.exec)('git', [...configDoRemoto, ...argsPush], arvore.dir, 300000);
783
+ passos.push(comConfig(argsPush));
646
784
  if (!push.ok) {
647
785
  r.passos = passos;
648
- return bloquear('runtime.unavailable', `push para ${remoto}/${para} falhou: ${(push.stderr || push.stdout).trim().slice(0, 400)}`, 'resolva o acesso ao remoto e rode o ship de novo (o merge local ja aconteceu)');
786
+ const erro = (0, forja_1.detalheDoPush)(push.stderr || push.stdout);
787
+ // A protecao da base recusou: a entrega e por PR/MR e o registro dele. O motivo do gate nao muda, so a orientacao.
788
+ if ((0, forja_1.pushRecusadoPelaProtecao)(`${push.stderr}\n${push.stdout}`)) {
789
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegida(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushBaseProtegidaCorrecao(threadId)), 'entrega.base-protegida');
790
+ }
791
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhou(remoto, para, erro)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushFalhouCorrecao));
649
792
  }
650
793
  // A prova: o sha que o REMOTO devolve tem que ser o mesmo do destino local.
651
- const shaRemoto = shaNoRemoto(arvore.dir, remoto, para);
652
- passos.push(`git ls-remote ${remoto} refs/heads/${para}`);
794
+ const shaRemoto = shaNoRemoto(arvore.dir, remoto, para, configDoRemoto);
795
+ passos.push(comConfig(['ls-remote', remoto, `refs/heads/${para}`]));
796
+ conferirDepoisDoPush(passos);
653
797
  r.shaRemoto = shaRemoto;
654
798
  r.pushVerificado = shaRemoto !== null && shaRemoto === pontaDaBase;
655
799
  if (!r.pushVerificado) {
656
800
  r.passos = passos;
657
- return bloquear('runtime.unavailable', `ls-remote devolveu ${shaRemoto ?? '(nada)'} e o destino local esta em ${pontaDaBase}: ` +
658
- 'o push nao ficou provado', 'rode o ship de novo e confira o remoto');
801
+ return bloquear('runtime.unavailable', (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProva(shaRemoto, pontaDaBase)), (0, locale_1.textoDoCatalogo)((m) => m.ship.pushSemProvaCorrecao));
659
802
  }
660
803
  }
661
804
  r.passos = passos;
@@ -693,7 +836,9 @@ function ship(carregado, threadId, opcoes) {
693
836
  passos,
694
837
  },
695
838
  });
696
- (0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
839
+ // A publicacao da fabrica empurra pelo origin do projeto, sem o transporte fixado: no fixado, nao sai daqui.
840
+ if (!urlFixada)
841
+ (0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
697
842
  const atualizada = (0, thread_1.lerThread)(raiz, threadId);
698
843
  // I-42: ciclo sem SHIP (o `#Fast`) entrega sem trocar de fase; `faseAtual` fica sempre
699
844
  // dentro do ciclo, porque board, pulse e prompt resolvem o bloco a partir dela.
@@ -708,7 +853,7 @@ function ship(carregado, threadId, opcoes) {
708
853
  }
709
854
  finally {
710
855
  if (arvore)
711
- descartarArvore(raiz, arvore);
856
+ descartarArvore(raiz, arvore, urlFixada ? TRAVA_LOCAL_DO_FIXADO : []);
712
857
  const solto = (0, leases_1.liberar)(raiz, leases_1.LEASE_MAIN_TREE, threadId);
713
858
  (0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.leaseLiberado, {
714
859
  lease: leases_1.LEASE_MAIN_TREE,
@@ -717,74 +862,75 @@ function ship(carregado, threadId, opcoes) {
717
862
  });
718
863
  }
719
864
  }
720
- /** Texto de `ork ship` para o CLI. */
865
+ /**
866
+ * Texto de `ork ship` para o CLI. A razao, o detalhe, a correcao e os passos que o ship montou pelo catalogo
867
+ * vieram em pt-BR (como o ledger os guarda) e saem remontados no locale ativo (G2 da F2b).
868
+ */
721
869
  function textoDoShip(r) {
870
+ const m = (0, locale_1.msg)().ship;
722
871
  const linhas = [];
723
872
  // I-35: horários no fuso do dono, sem rótulo por linha; o fuso é dito uma vez, no fim.
724
873
  let comHorario = false;
725
874
  const local = (texto) => {
726
- const localizado = (0, horario_1.localizarTexto)(texto);
727
- if (localizado !== texto)
875
+ const remontado = (0, locale_1.remontar)(texto);
876
+ const localizado = (0, horario_1.localizarTexto)(remontado);
877
+ if (localizado !== remontado)
728
878
  comHorario = true;
729
879
  return localizado;
730
880
  };
731
881
  const fechar = () => (comHorario ? [...linhas, (0, horario_1.legendaDoFuso)()] : linhas).join('\n');
732
- const cabecalho = r.dryRun ? 'ork ship (--dry-run, nada foi executado)' : 'ork ship';
733
- linhas.push(`${cabecalho}: thread ${r.thread}`);
734
- linhas.push(` de ${r.de}${r.shaDe ? ` @ ${r.shaDe.slice(0, 8)}` : ''}`);
735
- linhas.push(` para ${r.para}${r.shaParaAntes ? ` @ ${r.shaParaAntes.slice(0, 8)}` : ''}`);
736
- linhas.push(` autorizacao ${r.autorizacao.autorizado ? `AUTORIZADO por ${r.autorizacao.por} (${r.autorizacao.tipo})` : 'AGUARDANDO AUTORIZACAO HUMANA'}`);
737
- linhas.push(` ${local(r.autorizacao.razao)}`);
882
+ linhas.push(m.cabecalho(r.dryRun, r.thread));
883
+ linhas.push(m.de(r.de, r.shaDe ? r.shaDe.slice(0, 8) : ''));
884
+ linhas.push(m.para(r.para, r.shaParaAntes ? r.shaParaAntes.slice(0, 8) : ''));
885
+ linhas.push(r.autorizacao.autorizado
886
+ ? m.autorizado((0, locale_1.remontar)(r.autorizacao.por), m.tiposDeAutorizacao[r.autorizacao.tipo] ?? r.autorizacao.tipo) : m.aguardandoAutorizacao);
887
+ linhas.push(m.razao(local(r.autorizacao.razao)));
738
888
  if (r.verificacao) {
739
889
  const v = r.verificacao;
740
- linhas.push(` verificacao ${v.ok ? 'passou' : 'REPROVOU'} no HEAD ${(0, util_1.shaCurto)(v.commit)} ` +
741
- `(${v.claims.filter((c) => c.verificado).length}/${v.claims.length} claims, ` +
742
- `${v.comandos.filter((c) => c.ok).length}/${v.comandos.length} comandos)`);
890
+ linhas.push(m.verificacao(v.ok, (0, util_1.shaCurto)(v.commit), v.claims.filter((c) => c.verificado).length, v.claims.length, v.comandos.filter((c) => c.ok).length, v.comandos.length));
743
891
  }
744
892
  if (r.ci) {
745
- linhas.push(` ci ${r.ci.required ? `${r.ci.state.toUpperCase()} ${r.ci.context} em ${r.ci.sha.slice(0, 8)}` : 'não exigido'}`);
893
+ linhas.push(r.ci.required ? m.ciExigido(r.ci.state.toUpperCase(), r.ci.context, r.ci.sha.slice(0, 8)) : m.ciNaoExigido);
746
894
  }
747
895
  linhas.push(...(0, policies_1.linhasDeAviso)(r.violacoes ?? []));
748
896
  if (r.leaseOcupadoPor) {
749
897
  comHorario = true;
750
- linhas.push(` lease ${leases_1.LEASE_MAIN_TREE} OCUPADO pela thread ${r.leaseOcupadoPor.thread} (desde ${(0, horario_1.formatarDataHora)(r.leaseOcupadoPor.adquiridoEm)})`);
898
+ linhas.push(m.leaseOcupado(leases_1.LEASE_MAIN_TREE, r.leaseOcupadoPor.thread, (0, horario_1.formatarDataHora)(r.leaseOcupadoPor.adquiridoEm)));
751
899
  }
752
900
  else if (r.lease) {
753
- linhas.push(` lease ${leases_1.LEASE_MAIN_TREE} tomado por ${r.thread} e liberado ao fim`);
901
+ linhas.push(m.leaseTomado(leases_1.LEASE_MAIN_TREE, r.thread));
754
902
  }
755
903
  else if (r.dryRun) {
756
- linhas.push(` lease ${leases_1.LEASE_MAIN_TREE} livre`);
904
+ linhas.push(m.leaseLivre(leases_1.LEASE_MAIN_TREE));
757
905
  }
758
906
  if (r.bloqueado) {
759
907
  linhas.push('');
760
- linhas.push(`BLOQUEADO. motivo tipado: ${r.motivo}`);
761
- linhas.push(` detalhe ${local(r.detalhe)}`);
762
- linhas.push(` correcao ${r.correcao}`);
908
+ linhas.push(m.bloqueado(String(r.motivo)));
909
+ linhas.push(m.detalhe(local(r.detalhe)));
910
+ linhas.push(m.correcao((0, locale_1.remontar)(r.correcao)));
763
911
  return fechar();
764
912
  }
765
913
  if (r.dryRun) {
766
914
  linhas.push('');
767
- linhas.push('Passos que o ship real executaria, nesta ordem:');
915
+ linhas.push(m.passosDoEnsaio);
768
916
  for (const p of r.passos)
769
- linhas.push(` ${p}`);
917
+ linhas.push(` ${(0, locale_1.remontar)(p)}`);
770
918
  return fechar();
771
919
  }
772
920
  linhas.push('');
773
- linhas.push(r.jaIncorporado
774
- ? `Nada a mergear: ${r.de} ja estava em ${r.para}, incorporado em ${r.mergeSha}.`
775
- : `Merge --no-ff concluido: ${r.mergeSha}`);
921
+ linhas.push(r.jaIncorporado ? m.nadaAMergear(r.de, r.para, String(r.mergeSha)) : m.mergeConcluido(String(r.mergeSha)));
776
922
  if (r.pushVerificado) {
777
- linhas.push(`Push PROVADO: ls-remote de ${r.remoto}/${r.para} devolveu ${r.shaRemoto}`);
778
- linhas.push(` e o destino local esta no mesmo sha: ${r.pontaDaBase ?? r.mergeSha}`);
923
+ linhas.push(m.pushProvado(String(r.remoto), r.para, String(r.shaRemoto)));
924
+ linhas.push(m.mesmoSha(r.pontaDaBase ?? String(r.mergeSha)));
779
925
  }
780
926
  else {
781
- linhas.push(`Push nao provado: ${local(r.detalhe) || 'sem remoto configurado'}`);
927
+ linhas.push(m.pushNaoProvado(local(r.detalhe) || m.semRemotoConfigurado));
782
928
  }
783
929
  linhas.push('');
784
- linhas.push('Evidencia (comandos executados):');
930
+ linhas.push(m.evidencia);
785
931
  for (const p of r.passos)
786
- linhas.push(` ${p}`);
932
+ linhas.push(` ${(0, locale_1.remontar)(p)}`);
787
933
  linhas.push('');
788
- linhas.push(`Ledger: ork phase list ${r.thread} (evento ship_done)`);
934
+ linhas.push(m.ledger(r.thread));
789
935
  return fechar();
790
936
  }