@orkastery/cli 0.5.6 → 0.6.1

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 (396) 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 +123 -9
  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/adapters/grok-events.js +227 -0
  105. package/dist/adapters/grok-mcp-servidor.js +612 -0
  106. package/dist/adapters/grok-mcp.js +178 -0
  107. package/dist/adapters/grok.js +686 -0
  108. package/dist/agendador-cpu.js +92 -0
  109. package/dist/atualizar-branch.js +245 -0
  110. package/dist/auditoria.js +13 -11
  111. package/dist/auditrun.js +51 -46
  112. package/dist/autorizacao-duravel.js +327 -0
  113. package/dist/board.js +94 -40
  114. package/dist/branch-de-estado.js +23 -10
  115. package/dist/busca-semantica.js +7 -5
  116. package/dist/catalogo.js +2 -1
  117. package/dist/changelog-reconciliacao.js +290 -0
  118. package/dist/check-agil.js +528 -0
  119. package/dist/check-modo.js +41 -0
  120. package/dist/check-paralelo.js +238 -0
  121. package/dist/ci.js +248 -45
  122. package/dist/ciclos.js +8 -6
  123. package/dist/claim-lint.js +12 -8
  124. package/dist/claims-conferir.js +47 -39
  125. package/dist/claims.js +10 -9
  126. package/dist/company-brain-client.js +10 -3
  127. package/dist/company-brain-migration.js +11 -5
  128. package/dist/conducao-batida.js +759 -0
  129. package/dist/conducao-sentinela.js +25 -8
  130. package/dist/conducao.js +89 -29
  131. package/dist/conhecimento-consulta.js +270 -0
  132. package/dist/conhecimento.js +111 -87
  133. package/dist/conta-esgotada.js +127 -0
  134. package/dist/dado-privado.js +816 -0
  135. package/dist/decisao-autonoma.js +5 -4
  136. package/dist/demo.js +14 -12
  137. package/dist/dependencias-da-worktree.js +25 -0
  138. package/dist/divida.js +38 -36
  139. package/dist/docs.js +89 -89
  140. package/dist/doctor-forja.js +343 -0
  141. package/dist/doctor-pulse-cron.js +113 -1
  142. package/dist/doctor.js +164 -6
  143. package/dist/dsn-da-memoria.js +417 -0
  144. package/dist/entrega-por-mod.js +503 -0
  145. package/dist/entrega-pr.js +154 -54
  146. package/dist/esgotamentos.js +13 -11
  147. package/dist/estado-thread.js +21 -18
  148. package/dist/evalrunner.js +35 -32
  149. package/dist/fabrica-batida.js +34 -21
  150. package/dist/fabrica-estado.js +33 -21
  151. package/dist/fix.js +21 -19
  152. package/dist/forja/adaptador.js +6 -0
  153. package/dist/forja/ambiente-de-ci.js +27 -0
  154. package/dist/forja/api.js +256 -0
  155. package/dist/forja/cache.js +89 -0
  156. package/dist/forja/cli.js +60 -0
  157. package/dist/forja/contrato.js +9 -0
  158. package/dist/forja/endereco.js +43 -0
  159. package/dist/forja/estado.js +22 -0
  160. package/dist/forja/executor.js +73 -0
  161. package/dist/forja/github/ci.js +95 -0
  162. package/dist/forja/github/dono-da-rede.js +18 -0
  163. package/dist/forja/github/metadados.js +15 -0
  164. package/dist/forja/github/pedidos.js +200 -0
  165. package/dist/forja/gitlab/ci.js +141 -0
  166. package/dist/forja/gitlab/consultas.js +59 -0
  167. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  168. package/dist/forja/gitlab/metadados.js +15 -0
  169. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  170. package/dist/forja/gitlab/pedidos.js +141 -0
  171. package/dist/forja/produtor.js +32 -0
  172. package/dist/forja/registro.js +31 -0
  173. package/dist/forja/resolver.js +121 -0
  174. package/dist/forja/texto.js +13 -0
  175. package/dist/forja/versao.js +71 -0
  176. package/dist/forja.js +123 -80
  177. package/dist/handoff.js +23 -13
  178. package/dist/hitl-contract.js +46 -43
  179. package/dist/hitl-curto.js +37 -25
  180. package/dist/hitl-gates.js +13 -11
  181. package/dist/hitl-local-receipt.js +51 -0
  182. package/dist/hitl-local.js +11 -2
  183. package/dist/hitl-lock.js +5 -11
  184. package/dist/hitl-public-receipt.js +11 -0
  185. package/dist/hitl-resumo.js +44 -1
  186. package/dist/hitl-sessions.js +62 -9
  187. package/dist/hitl-texto-livre.js +7 -4
  188. package/dist/hitl.js +34 -31
  189. package/dist/horario.js +20 -1
  190. package/dist/hosts.js +104 -134
  191. package/dist/index.js +864 -554
  192. package/dist/indice-vetorial.js +14 -12
  193. package/dist/init.js +11 -2
  194. package/dist/integracoes-locais.js +4 -0
  195. package/dist/intelligence-graph-cli.js +123 -69
  196. package/dist/intelligence-graph-query.js +37 -22
  197. package/dist/leases.js +19 -18
  198. package/dist/ledger-stats.js +17 -16
  199. package/dist/ledger.js +31 -1
  200. package/dist/licoes.js +12 -11
  201. package/dist/locale-accounts.js +228 -0
  202. package/dist/locale-adapter.js +291 -0
  203. package/dist/locale-ajuda.js +86 -10
  204. package/dist/locale-audit.js +199 -0
  205. package/dist/locale-claims.js +213 -0
  206. package/dist/locale-conducao.js +138 -0
  207. package/dist/locale-conhecimento.js +181 -0
  208. package/dist/locale-decisao.js +205 -0
  209. package/dist/locale-docs.js +230 -0
  210. package/dist/locale-estado.js +101 -0
  211. package/dist/locale-forja.js +288 -0
  212. package/dist/locale-gerados.js +5 -0
  213. package/dist/locale-grafo.js +129 -0
  214. package/dist/locale-master.js +83 -0
  215. package/dist/locale-network.js +524 -0
  216. package/dist/locale-operacao-restante.js +931 -0
  217. package/dist/locale-projetos.js +100 -0
  218. package/dist/locale-prompts.js +194 -0
  219. package/dist/locale-pulse.js +140 -2
  220. package/dist/locale-reservas.js +87 -0
  221. package/dist/locale-retry.js +183 -6
  222. package/dist/locale-security-scan.js +69 -0
  223. package/dist/locale-setup.js +192 -0
  224. package/dist/locale-ship.js +177 -66
  225. package/dist/locale-thread.js +149 -5
  226. package/dist/locale-verify.js +80 -4
  227. package/dist/locale-worktree.js +246 -0
  228. package/dist/locale.js +553 -9
  229. package/dist/maestro-runtime.js +22 -3
  230. package/dist/manifest.js +293 -12
  231. package/dist/maquina-ociosa.js +211 -0
  232. package/dist/maquina.js +10 -5
  233. package/dist/master-nota-local.js +200 -0
  234. package/dist/master-nota.js +10 -2
  235. package/dist/master.js +118 -41
  236. package/dist/mcp-conhecimento.js +52 -0
  237. package/dist/mcp-experiencia.js +26 -5
  238. package/dist/mcp-install.js +90 -15
  239. package/dist/mcp-noctum.js +101 -0
  240. package/dist/mcp-server.js +116 -22
  241. package/dist/mcp-ship-transporte.js +977 -0
  242. package/dist/mcp-ship.js +68 -24
  243. package/dist/mcp-transportes.js +17 -0
  244. package/dist/memoria.js +63 -58
  245. package/dist/merge-da-entrega.js +85 -0
  246. package/dist/modos-migracao.js +8 -6
  247. package/dist/modos.js +17 -18
  248. package/dist/network-roadmap.js +94 -54
  249. package/dist/noctum-aceite.js +929 -0
  250. package/dist/noctum-arco.js +540 -33
  251. package/dist/noctum-capacidade.js +3 -3
  252. package/dist/noctum-changelog.js +399 -0
  253. package/dist/noctum-cli.js +539 -0
  254. package/dist/noctum-coordenacao.js +1225 -0
  255. package/dist/noctum-entrega.js +1217 -0
  256. package/dist/noctum-envelope.js +253 -17
  257. package/dist/noctum-execucao.js +100 -24
  258. package/dist/noctum-fechamento.js +416 -0
  259. package/dist/noctum-fila.js +49 -10
  260. package/dist/noctum-guarda.js +333 -0
  261. package/dist/noctum-integracao.js +507 -0
  262. package/dist/noctum-maquinas.js +387 -0
  263. package/dist/noctum-medicao.js +450 -0
  264. package/dist/noctum-modo.js +390 -0
  265. package/dist/noctum-pergunta-canal.js +96 -0
  266. package/dist/noctum-pergunta.js +115 -0
  267. package/dist/noctum-provas.js +838 -0
  268. package/dist/noctum-reconciliacao.js +594 -0
  269. package/dist/noctum-rede.js +102 -0
  270. package/dist/noctum-registro.js +215 -0
  271. package/dist/noctum-relatorio.js +861 -0
  272. package/dist/noctum-resposta.js +207 -0
  273. package/dist/noctum-retomada-rede.js +71 -0
  274. package/dist/noctum-sessoes-em-voo.js +93 -0
  275. package/dist/noctum-supervisao.js +649 -0
  276. package/dist/noctum-terminal.js +459 -0
  277. package/dist/noctum-transporte.js +655 -0
  278. package/dist/noctum-vigia.js +679 -0
  279. package/dist/ocupacao.js +3 -1
  280. package/dist/onboarding.js +16 -5
  281. package/dist/orkmind.js +39 -23
  282. package/dist/orquestracao.js +31 -35
  283. package/dist/parado-no-condutor.js +160 -139
  284. package/dist/phase.js +96 -42
  285. package/dist/policies.js +33 -0
  286. package/dist/postura-local.js +11 -6
  287. package/dist/preflight.js +2 -1
  288. package/dist/procedencia.js +9 -14
  289. package/dist/projeto-alvo.js +59 -20
  290. package/dist/prompts.js +136 -42
  291. package/dist/prova-minima.js +5 -6
  292. package/dist/pulse-cadencia.js +5 -4
  293. package/dist/pulse-consentimento.js +53 -1
  294. package/dist/pulse-delivery.js +143 -27
  295. package/dist/pulse-resposta.js +368 -4
  296. package/dist/pulse.js +136 -3
  297. package/dist/ratelimit.js +13 -4
  298. package/dist/recall.js +14 -13
  299. package/dist/rede-adesao.js +13 -8
  300. package/dist/rede-forja.js +108 -24
  301. package/dist/rede-status.js +63 -45
  302. package/dist/rede.js +86 -46
  303. package/dist/retomada-checkpoint.js +101 -0
  304. package/dist/retry.js +326 -78
  305. package/dist/roadmap-reservas.js +32 -32
  306. package/dist/runtime-ambiente.js +5 -0
  307. package/dist/runtime-context.js +279 -85
  308. package/dist/runtime-escada.js +429 -0
  309. package/dist/runtime-profiles.js +130 -63
  310. package/dist/runtimes.js +42 -5
  311. package/dist/saida-segura.js +3 -2
  312. package/dist/security-scan/agil.js +366 -0
  313. package/dist/security-scan/cli.js +76 -0
  314. package/dist/security-scan/compare.js +149 -0
  315. package/dist/security-scan/config.js +93 -0
  316. package/dist/security-scan/detect.js +97 -0
  317. package/dist/security-scan/executor.js +196 -0
  318. package/dist/security-scan/guard.js +180 -0
  319. package/dist/security-scan/imagem-de-lint.js +96 -0
  320. package/dist/security-scan/normalize/actionlint.js +12 -0
  321. package/dist/security-scan/normalize/eslint.js +12 -0
  322. package/dist/security-scan/normalize/gitleaks.js +13 -0
  323. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  324. package/dist/security-scan/normalize/govulncheck.js +36 -0
  325. package/dist/security-scan/normalize/index.js +25 -0
  326. package/dist/security-scan/normalize/npm-audit.js +30 -0
  327. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  328. package/dist/security-scan/normalize/oxlint.js +51 -0
  329. package/dist/security-scan/normalize/pip-audit.js +16 -0
  330. package/dist/security-scan/normalize/ruff.js +12 -0
  331. package/dist/security-scan/normalize/semgrep.js +20 -0
  332. package/dist/security-scan/normalize/trivy.js +33 -0
  333. package/dist/security-scan/normalize/util.js +204 -0
  334. package/dist/security-scan/normalize/zizmor.js +19 -0
  335. package/dist/security-scan/report.js +156 -0
  336. package/dist/security-scan/run.js +448 -0
  337. package/dist/security-scan/tools.js +62 -0
  338. package/dist/security-scan/trabalhador.js +74 -0
  339. package/dist/security-scan/types.js +15 -0
  340. package/dist/session-events.js +19 -2
  341. package/dist/session-watcher-claude.js +74 -19
  342. package/dist/session-watcher-grok.js +425 -0
  343. package/dist/session-watcher.js +174 -13
  344. package/dist/sessoes-contas.js +42 -5
  345. package/dist/sessoes-inventario.js +1 -1
  346. package/dist/sessoes.js +25 -23
  347. package/dist/setup.js +67 -66
  348. package/dist/ship-publicar.js +263 -92
  349. package/dist/ship.js +160 -17
  350. package/dist/superficie.js +14 -11
  351. package/dist/thread-close.js +9 -9
  352. package/dist/thread.js +121 -18
  353. package/dist/tokens.js +15 -11
  354. package/dist/trabalho-thread.js +297 -0
  355. package/dist/transporte-do-canal.js +189 -0
  356. package/dist/types.js +12 -1
  357. package/dist/util.js +5 -2
  358. package/dist/varredura-acoes.js +500 -0
  359. package/dist/verify.js +491 -32
  360. package/dist/worktree-local.js +12 -10
  361. package/dist/worktree.js +81 -85
  362. package/eval/casos/check-quality.json +77 -0
  363. package/eval/casos/security-auditor.json +148 -0
  364. package/eval/casos/security-remediation.json +161 -0
  365. package/eval/fixtures/security-scan/README.md +8 -0
  366. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  367. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  368. package/eval/fixtures/security-scan/go/README.md +4 -0
  369. package/eval/fixtures/security-scan/go/config.go +4 -0
  370. package/eval/fixtures/security-scan/go/go.mod +5 -0
  371. package/eval/fixtures/security-scan/go/go.sum +2 -0
  372. package/eval/fixtures/security-scan/go/main.go +31 -0
  373. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  374. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  375. package/eval/fixtures/security-scan/js/README.md +4 -0
  376. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  377. package/eval/fixtures/security-scan/js/package.json +10 -0
  378. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  379. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  380. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  381. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  382. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  383. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  384. package/eval/fixtures/security-scan/python/README.md +4 -0
  385. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  386. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  387. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  388. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  389. package/package.json +10 -5
  390. package/references/security-checklist.md +3 -3
  391. package/skills/README.md +1 -0
  392. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  393. package/skills/phases/check-quality/SKILL.md +16 -0
  394. package/skills/phases/go-implementation/SKILL.md +6 -0
  395. package/skills/phases/security-remediation/SKILL.md +70 -0
  396. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/forja.js CHANGED
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mesmaForja = exports.rotuloDaForja = exports.executorPadrao = void 0;
3
+ exports.apiDoGitlab = exports.mesmaForja = exports.rotuloDaForja = exports.executorPadrao = void 0;
4
4
  exports.enderecoDoRemoto = enderecoDoRemoto;
5
5
  exports.repositorioGithubNoHost = repositorioGithubNoHost;
6
6
  exports.identidadeDaForja = identidadeDaForja;
7
+ exports.identidadeDaForjaResolvida = identidadeDaForjaResolvida;
7
8
  exports.forjaDoArgumento = forjaDoArgumento;
8
9
  exports.detalheSeguro = detalheSeguro;
10
+ exports.detalheDoPush = detalheDoPush;
11
+ exports.pushRecusadoPelaProtecao = pushRecusadoPelaProtecao;
9
12
  exports.classificarFalha = classificarFalha;
10
13
  exports.lerCommitsDaForja = lerCommitsDaForja;
11
14
  exports.lerDaForja = lerDaForja;
@@ -20,16 +23,19 @@ exports.lerDaForja = lerDaForja;
20
23
  *
21
24
  * GitHub responde tudo em UMA consulta: a base com `docs/roadmap`, o manifesto e os commits desde
22
25
  * `desde`, e as duas branches de estado, cada parte no commit que a propria consulta devolve.
23
- * GitLab devolve a mesma leitura por consultas GraphQL e pelo REST de commits; sem `glab` na
24
- * maquina que construiu, o esquema dele esta provado so com resposta simulada (D4 do PLAN).
26
+ * GitLab devolve a mesma leitura por consultas GraphQL e pelo REST de commits, pela API da CLI
27
+ * logada (`forja/api.ts`); o esquema esta provado com as respostas gravadas de um GitLab de verdade.
25
28
  *
26
29
  * Resposta fora do formato vira erro tipado, nunca lista vazia: quem le nao confunde "nao li" com
27
30
  * "nao tem".
28
31
  */
29
- const node_child_process_1 = require("node:child_process");
32
+ const endereco_1 = require("./forja/endereco");
30
33
  const hitl_1 = require("./hitl");
31
34
  const policies_1 = require("./policies");
32
- const rede_forja_1 = require("./rede-forja");
35
+ const executor_1 = require("./forja/executor");
36
+ const api_1 = require("./forja/api");
37
+ const consultas_1 = require("./forja/gitlab/consultas");
38
+ const pedidos_1 = require("./forja/gitlab/pedidos");
33
39
  const PRAZO_MS = 30000;
34
40
  const SHA = /^[0-9a-f]{40}$/;
35
41
  const SEGMENTO = /^[A-Za-z0-9_.-]+$/;
@@ -41,18 +47,17 @@ const HOST = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9]
41
47
  * usuario (`~/.local/bin` e as outras): o gateway e o cron rodam com PATH curto, e o `gh` da maquina-b
42
48
  * mora em `~/.local/bin`. Sem achar, o nome vai cru ao spawn, e o ENOENT continua `forja.ausente`.
43
49
  */
44
- const executorPadrao = (cmd, args, entrada, timeoutMs) => {
45
- const r = (0, node_child_process_1.spawnSync)((0, rede_forja_1.acharBinario)(cmd) ?? cmd, [...args], {
46
- input: entrada, encoding: 'utf8', timeout: timeoutMs, maxBuffer: 32 * 1024 * 1024,
47
- env: { ...process.env, GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1', GLAB_CHECK_UPDATE: 'false', NO_COLOR: '1' },
48
- });
49
- return { status: r.status, stdout: (r.stdout ?? '').toString(), stderr: (r.stderr ?? '').toString(), sinal: r.signal ?? null,
50
- ...(r.error ? { erro: r.error.code ?? r.error.message } : {}) };
51
- };
50
+ const executorPadrao = (cmd, args, entrada, timeoutMs) => (0, executor_1.rodarCli)({ cmd, args, entrada,
51
+ prazoMs: timeoutMs, maxBuffer: 32 * 1024 * 1024,
52
+ acrescentar: { GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1', GLAB_CHECK_UPDATE: 'false', NO_COLOR: '1' } });
52
53
  exports.executorPadrao = executorPadrao;
53
54
  // ---------------------------------------------------------------------------
54
55
  // Identidade
55
56
  // ---------------------------------------------------------------------------
57
+ /**
58
+ * O tipo pelo nome do host. So vale onde nao ha manifesto nem login para resolver: a rede le os remotos de outros
59
+ * projetos. A CI do projeto usa a forja resolvida (`forja/resolver.ts`), que nao decide pelo nome.
60
+ */
56
61
  function tipoDoHost(host) {
57
62
  if (host === 'github.com' || /(^|[.-])github([.-]|$)/.test(host))
58
63
  return 'github';
@@ -75,14 +80,9 @@ function montar(tipo, host, caminho) {
75
80
  * na URL nunca entra; caminho local e host que nao e hostname voltam null.
76
81
  */
77
82
  function enderecoDoRemoto(url) {
78
- const t = url.trim();
79
- const esquema = /^(?:https?|ssh|git|git\+ssh|ssh\+git):\/\/(?:[^@/]*@)?([^/:?#@]+)(?::\d+)?\/([^?#\s]+)$/i.exec(t);
80
- const scp = esquema ? null : /^(?:[^@\s/:]+@)?([^:\s/@]+):(?!\/\/)([^\s]+)$/.exec(t);
81
- const achado = esquema ?? scp;
82
- if (!achado)
83
- return null;
84
- const host = achado[1].toLowerCase();
85
- return HOST.test(host) ? { host, caminho: achado[2].replace(/^\/+/, '') } : null;
83
+ // Parser unico (forja/endereco.ts); aqui so o `HOST` com ponto e o caminho como escrito (`montar` o valida).
84
+ const lido = (0, endereco_1.lerHostDoRemoto)(url);
85
+ return lido && HOST.test(lido.host) ? { host: lido.host, caminho: lido.caminhoBruto } : null;
86
86
  }
87
87
  /**
88
88
  * RM-037 (fatia 5, A5): o `dono/nome` de um repositorio do GitHub no host do remoto, com qualquer host: o GitHub
@@ -99,7 +99,29 @@ function repositorioGithubNoHost(url) {
99
99
  function identidadeDaForja(url) {
100
100
  const endereco = enderecoDoRemoto(url);
101
101
  const tipo = endereco ? tipoDoHost(endereco.host) : null;
102
- return endereco && tipo ? montar(tipo, endereco.host, endereco.caminho) : null;
102
+ const id = endereco && tipo ? montar(tipo, endereco.host, endereco.caminho) : null;
103
+ const porta = id?.tipo === 'gitlab' ? portaDaApiNoRemoto(url) : null;
104
+ return id && porta !== null ? { ...id, porta } : id;
105
+ }
106
+ /**
107
+ * A identidade de uma forja ja resolvida (o bloco `forja:`, o host conhecido), na forma que a leitura do roadmap usa. A
108
+ * porta, o caminho base e a CA so entram no GitLab: o GitHub le pelo `gh` com o host.
109
+ */
110
+ function identidadeDaForjaResolvida(f) {
111
+ const id = montar(f.tipo, f.host, f.repo);
112
+ if (!id || id.tipo !== 'gitlab')
113
+ return id;
114
+ return { ...id, ...(f.porta !== null ? { porta: f.porta } : {}), ...(f.caminhoBase ? { caminhoBase: f.caminhoBase } : {}),
115
+ ...(f.ca ? { ca: f.ca } : {}) };
116
+ }
117
+ /** A porta da API num remoto https/http, quando nao e a do esquema; a porta de ssh e do ssh e nunca entra. */
118
+ function portaDaApiNoRemoto(url) {
119
+ const lido = (0, endereco_1.lerHostDoRemoto)(url);
120
+ if (!lido || (lido.protocolo !== 'https' && lido.protocolo !== 'http') || lido.porta === null)
121
+ return null;
122
+ if (lido.porta < 1 || lido.porta > 65535 || lido.porta === (lido.protocolo === 'https' ? 443 : 80))
123
+ return null;
124
+ return lido.porta;
103
125
  }
104
126
  /** `github:dono/repo`, `gitlab:grupo/sub/repo` (com host proprio: `gitlab:host.tld/grupo/repo`) ou uma URL. */
105
127
  function forjaDoArgumento(texto) {
@@ -115,20 +137,57 @@ function forjaDoArgumento(texto) {
115
137
  return /^[a-z+]+:\/\//i.test(t) || /^[^@\s/:]+@[^:\s/]+:/.test(t) ? identidadeDaForja(t) : null;
116
138
  }
117
139
  /** Como a forja aparece para gente: `github.com/orkastery/orkastery`. */
118
- const rotuloDaForja = (f) => `${f.host}/${f.repo}`;
140
+ const rotuloDaForja = (f) => `${f.host}${f.porta ? `:${f.porta}` : ''}/${f.repo}`;
119
141
  exports.rotuloDaForja = rotuloDaForja;
142
+ /** O mesmo repositorio: tipo, host e repo. A porta da API nao entra, senao o mesmo repo por ssh, https e `gitlab:host/g/r` nao casaria. */
120
143
  const mesmaForja = (a, b) => !!a && !!b && a.tipo === b.tipo && a.host === b.host && a.repo.toLowerCase() === b.repo.toLowerCase();
121
144
  exports.mesmaForja = mesmaForja;
122
145
  // ---------------------------------------------------------------------------
123
146
  // Erros
124
147
  // ---------------------------------------------------------------------------
148
+ /**
149
+ * O texto inteiro sem segredo. Os tokens do GitLab podem ter ponto (formato roteavel, `glpat-xxxx.01.yyyy`), por isso a
150
+ * classe inclui o ponto e nao ha `\b` no fim, que cortaria no ponto e deixaria o sufixo; o token de registro de runner
151
+ * legado tem o prefixo fixo `GR1348941`.
152
+ */
153
+ function redigirDaForja(texto) {
154
+ return (0, hitl_1.redigirSegredos)(texto)
155
+ .replace(/\b(?:glpat|gldt|glrt|glptt|glcbt|gloas|glft|glimt|glsoat)-[A-Za-z0-9_.-]{16,}/g, '[redigido]')
156
+ .replace(/\bGR1348941[A-Za-z0-9_-]{20,}/g, '[redigido]')
157
+ .replace(/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g, '[redigido]');
158
+ }
159
+ const OMITIDO = '[detalhe omitido: um padrão de segredo casou]';
125
160
  /** O fim da saida de erro, sem segredo: redigido, e descartado inteiro se ainda casar um padrao. */
126
161
  function detalheSeguro(texto) {
127
- const redigido = (0, hitl_1.redigirSegredos)(texto)
128
- .replace(/\b(?:glpat|gldt|glrt|glptt|glcbt)-[A-Za-z0-9_-]{16,}\b/g, '[redigido]')
129
- .replace(/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g, '[redigido]');
130
- const linha = redigido.split('\n').map((l) => l.trim()).filter(Boolean).slice(-2).join(' ').slice(0, 240);
131
- return (0, policies_1.procurarSegredos)(linha).length ? '[detalhe omitido: um padrão de segredo casou]' : linha;
162
+ const linha = redigirDaForja(texto).split('\n').map((l) => l.trim()).filter(Boolean).slice(-2).join(' ').slice(0, 240);
163
+ return (0, policies_1.procurarSegredos)(linha).length ? OMITIDO : linha;
164
+ }
165
+ /**
166
+ * O motivo de um `git push` recusado, sem segredo. O texto inteiro e redigido antes do corte; as linhas `hint:` saem,
167
+ * e fica o comeco do resto (ate 400 caracteres), onde o git poe o `! [rejected]` ou `! [remote rejected]` e o
168
+ * `error: failed to push`. Guardar so o fim perderia o motivo: num non-fast-forward, as ultimas linhas sao hints.
169
+ */
170
+ function detalheDoPush(texto) {
171
+ const linhas = redigirDaForja(texto).split('\n').map((l) => l.trim()).filter((l) => l && !/^hint:/i.test(l));
172
+ const detalhe = linhas.join(' ').slice(0, 400);
173
+ return (0, policies_1.procurarSegredos)(detalhe).length ? OMITIDO : detalhe;
174
+ }
175
+ /**
176
+ * O push recusado pela protecao da branch. O GitHub diz `GH006: Protected branch update failed` e
177
+ * `protected branch hook declined`; o GitLab diz `You are not allowed to push code to protected branches` (ou
178
+ * `force push code to a protected branch`) antes do `pre-receive hook declined`. O `GH013` (regras do repositorio) e
179
+ * generico: tambem vem da protecao contra segredo, de regra de caminho ou de mensagem de commit. Por isso so conta com
180
+ * o sinal da protecao da branch na mesma saida (`Changes must be made through a pull request` ou `Cannot update this
181
+ * protected ref`), e nunca com `PUSH PROTECTION` / `Push cannot contain secrets`. O `pre-receive hook declined` sozinho
182
+ * e de qualquer gancho, e o "not allowed to push code to this project" do GitLab e falta de acesso ao projeto.
183
+ */
184
+ function pushRecusadoPelaProtecao(texto) {
185
+ if (/PUSH PROTECTION|Push cannot contain secrets/i.test(texto))
186
+ return false;
187
+ if (/\bGH006\b|protected branch hook declined|not allowed to (?:force )?push code to (?:a )?protected branch/i.test(texto))
188
+ return true;
189
+ return /\bGH013\b|repository rule violations/i.test(texto)
190
+ && /Changes must be made through a pull request|Cannot update this protected ref/i.test(texto);
132
191
  }
133
192
  function erro(codigo, detalhe) {
134
193
  return { ok: false, erro: { codigo, detalhe } };
@@ -138,16 +197,16 @@ function classificarFalha(cmd, s) {
138
197
  if (s.erro === 'ENOENT')
139
198
  return { codigo: 'forja.ausente', detalhe: `${cmd} não está instalado nesta máquina` };
140
199
  if (s.erro === 'ETIMEDOUT' || s.sinal === 'SIGTERM')
141
- return { codigo: 'forja.tempo-esgotado', detalhe: `${cmd} não respondeu em ${PRAZO_MS / 1000} s` };
200
+ return { codigo: 'forja.indisponivel', detalhe: `${cmd} não respondeu em ${PRAZO_MS / 1000} s` };
142
201
  const texto = `${s.stderr}\n${s.stdout}`;
143
202
  const detalhe = detalheSeguro(s.stderr || s.stdout || s.erro || `${cmd} saiu com ${s.status}`);
144
203
  if (/"type"\s*:\s*"NOT_FOUND"|Could not resolve to a Repository|404 Not Found|HTTP 404|project not found/i.test(texto)) {
145
- return { codigo: 'forja.nao-encontrado', detalhe };
204
+ return { codigo: 'forja.nao-achei', detalhe };
146
205
  }
147
206
  if (/auth login|not logged|authentication|HTTP 401|Bad credentials|GH_TOKEN|GITLAB_TOKEN|unauthorized|no token/i.test(texto)) {
148
207
  return { codigo: 'forja.sem-login', detalhe };
149
208
  }
150
- return { codigo: 'forja.inacessivel', detalhe };
209
+ return { codigo: 'forja.indisponivel', detalhe };
151
210
  }
152
211
  const obj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
153
212
  class RespostaInvalida extends Error {
@@ -170,7 +229,7 @@ function chamarJson(executor, cmd, args, corpo) {
170
229
  const falha = classificarFalha(cmd, s.erro || s.status !== 0 ? s : { ...s, status: 1, stderr: JSON.stringify(json) });
171
230
  // `gh` sai 1 com NOT_FOUND no corpo: o tipo do erro GraphQL vale mais que a frase.
172
231
  if (erros && json.errors.some((e) => obj(e) && e.type === 'NOT_FOUND')) {
173
- return { ok: false, erro: { codigo: 'forja.nao-encontrado', detalhe: falha.detalhe } };
232
+ return { ok: false, erro: { codigo: 'forja.nao-achei', detalhe: falha.detalhe } };
174
233
  }
175
234
  return { ok: false, erro: falha };
176
235
  }
@@ -178,10 +237,7 @@ function chamarJson(executor, cmd, args, corpo) {
178
237
  return { ok: false, erro: { codigo: 'forja.resposta-invalida', detalhe: `${cmd} não devolveu JSON` } };
179
238
  return { ok: true, json };
180
239
  }
181
- /**
182
- * O host vai sempre explicito: sem ele, o `gh` usa `GH_HOST` ou o unico host com login, e o `glab`,
183
- * o host do remoto do cwd; a consulta iria para outra forja.
184
- */
240
+ /** So o `gh`: o host vai sempre explicito, ou ele usaria `GH_HOST` ou o unico host com login e a consulta iria para outra forja. */
185
241
  const hostnameDe = (f) => ['--hostname', f.host];
186
242
  function arquivosDoGithub(entrada, dir) {
187
243
  if (entrada === null)
@@ -220,19 +276,27 @@ function commitsDoHistorico(historico, onde) {
220
276
  parciais: obj(h.pageInfo) && h.pageInfo.hasNextPage === true,
221
277
  };
222
278
  }
223
- /** Os commits da base desde `desde`, pelo REST do GitLab (GET), e se vieram 100 (pagina cheia). */
224
- function commitsDoGitlab(forja, commit, desde, executor) {
225
- const rest = executor('glab', ['api', `projects/${encodeURIComponent(forja.repo)}/repository/commits?ref_name=${encodeURIComponent(commit)}` +
226
- `&since=${encodeURIComponent(desde)}&per_page=100`, ...hostnameDe(forja)], '', PRAZO_MS);
227
- if (rest.erro || rest.status !== 0)
228
- return { ok: false, erro: classificarFalha('glab', rest) };
229
- let lista;
230
- try {
231
- lista = JSON.parse(rest.stdout);
232
- }
233
- catch {
234
- lista = undefined;
279
+ /** A API do GitLab de uma forja: o host e a porta da API, e o caminho base e a CA quando vieram do bloco `forja:`. */
280
+ const apiDoGitlab = (forja, opcoes = {}) => (0, api_1.chamadorDaApi)({ tipo: 'gitlab', host: forja.host, porta: forja.porta ?? null, caminhoBase: forja.caminhoBase ?? '', ca: forja.ca ?? null }, opcoes);
281
+ exports.apiDoGitlab = apiDoGitlab;
282
+ /** Uma consulta GraphQL do GitLab; `errors` no corpo e erro tipado, nunca resposta. */
283
+ function graphqlDoGitlab(api, query, variables) {
284
+ const r = api({ metodo: 'POST', caminho: 'graphql', corpo: { query, variables }, prazoMs: PRAZO_MS });
285
+ if (!r.ok)
286
+ return r;
287
+ const json = r.valor.corpo;
288
+ if (obj(json) && Array.isArray(json.errors) && json.errors.length) {
289
+ return { ok: false, erro: { codigo: 'forja.resposta-invalida', detalhe: detalheSeguro(JSON.stringify(json.errors)) } };
235
290
  }
291
+ return { ok: true, json };
292
+ }
293
+ /** Os commits da base desde `desde`, pelo REST do GitLab (GET), e se vieram 100 (pagina cheia). */
294
+ function commitsDoGitlab(forja, commit, desde, api) {
295
+ const r = api({ metodo: 'GET', caminho: `${(0, pedidos_1.projetoNaApi)(forja.repo)}/repository/commits?ref_name=${encodeURIComponent(commit)}` +
296
+ `&since=${encodeURIComponent(desde)}&per_page=100`, prazoMs: PRAZO_MS });
297
+ if (!r.ok)
298
+ return r;
299
+ const lista = r.valor.corpo;
236
300
  exigir(Array.isArray(lista), 'commits');
237
301
  const commits = lista.map((c) => {
238
302
  exigir(obj(c) && typeof c.id === 'string' && typeof c.title === 'string' && typeof c.committed_date === 'string', 'commit');
@@ -289,30 +353,9 @@ function lerDoGithub(forja, pedido, executor, lidoEm) {
289
353
  return { ok: true, leitura: { forja, lidoEm, chamadas: 1, base: leituraDaBase,
290
354
  reservas: estado(repo.reservas, pedido.reservas), fabrica: estado(repo.fabrica, pedido.fabrica) } };
291
355
  }
292
- const CONSULTA_RAIZ_GITLAB = 'query($path: ID!) { project(fullPath: $path) { repository { rootRef } } }';
293
- const CONSULTA_ARVORES_GITLAB = `query($path: ID!, $base: String!, $dirRoadmap: String!, $refReservas: String!, $dirReservas: String!,
294
- $refFabrica: String!, $dirFabrica: String!) {
295
- project(fullPath: $path) { repository {
296
- baseTopo: tree(ref: $base) { lastCommit { sha committedDate } }
297
- baseDir: tree(ref: $base, path: $dirRoadmap) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
298
- reservasTopo: tree(ref: $refReservas) { lastCommit { sha committedDate } }
299
- reservasDir: tree(ref: $refReservas, path: $dirReservas) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
300
- fabricaTopo: tree(ref: $refFabrica) { lastCommit { sha committedDate } }
301
- fabricaDir: tree(ref: $refFabrica, path: $dirFabrica) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
302
- } }
303
- }`;
304
- /** Os blobs de cada ponta que existe; so as partes pedidas entram na consulta (texto fixo, sem interpolar o pedido). */
305
- function consultaDeBlobsDoGitlab(partes) {
306
- const sufixo = { base: 'Base', reservas: 'Reservas', fabrica: 'Fabrica' };
307
- const declaracoes = ['$path: ID!', ...partes.flatMap((p) => [`$ref${sufixo[p]}: String!`, `$paths${sufixo[p]}: [String!]!`])];
308
- const campos = partes.map((p) => `${p}: blobs(ref: $ref${sufixo[p]}, paths: $paths${sufixo[p]}, first: 100) ` +
309
- '{ pageInfo { hasNextPage } nodes { path rawTextBlob } }');
310
- return `query(${declaracoes.join(', ')}) { project(fullPath: $path) { repository { ${campos.join(' ')} } } }`;
311
- }
312
- function lerDoGitlab(forja, pedido, executor, lidoEm) {
313
- const args = ['api', 'graphql', '--method', 'POST', '--input', '-', ...hostnameDe(forja)];
356
+ function lerDoGitlab(forja, pedido, api, lidoEm) {
314
357
  let chamadas = 0;
315
- const graphql = (query, variables) => { chamadas++; return chamarJson(executor, 'glab', args, JSON.stringify({ query, variables })); };
358
+ const graphql = (query, variables) => { chamadas++; return graphqlDoGitlab(api, query, variables); };
316
359
  const repositorio = (json) => {
317
360
  const projeto = obj(json) && obj(json.data) ? json.data.project : undefined;
318
361
  if (projeto === null)
@@ -322,13 +365,13 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
322
365
  };
323
366
  let base = pedido.base ?? null;
324
367
  if (!base) {
325
- const r = graphql(CONSULTA_RAIZ_GITLAB, { path: forja.repo });
368
+ const r = graphql(consultas_1.CONSULTA_RAIZ_GITLAB, { path: forja.repo });
326
369
  if (!r.ok)
327
370
  return r;
328
371
  const raiz = repositorio(r.json).rootRef;
329
372
  base = typeof raiz === 'string' && raiz ? raiz : null;
330
373
  }
331
- const arvores = graphql(CONSULTA_ARVORES_GITLAB, { path: forja.repo, base: base ?? 'HEAD', dirRoadmap: pedido.dirRoadmap,
374
+ const arvores = graphql(consultas_1.CONSULTA_ARVORES_GITLAB, { path: forja.repo, base: base ?? 'HEAD', dirRoadmap: pedido.dirRoadmap,
332
375
  refReservas: pedido.reservas.branch, dirReservas: pedido.reservas.dir, refFabrica: pedido.fabrica.branch, dirFabrica: pedido.fabrica.dir });
333
376
  if (!arvores.ok)
334
377
  return arvores;
@@ -373,7 +416,7 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
373
416
  variaveis[`ref${sufixo[parte]}`] = ponta.commit;
374
417
  variaveis[`paths${sufixo[parte]}`] = paths;
375
418
  }
376
- const blobs = graphql(consultaDeBlobsDoGitlab(pedidos.map(([parte]) => parte)), variaveis);
419
+ const blobs = graphql((0, consultas_1.consultaDeBlobsDoGitlab)(pedidos.map(([parte]) => parte)), variaveis);
377
420
  if (!blobs.ok)
378
421
  return blobs;
379
422
  conteudo = repositorio(blobs.json);
@@ -394,7 +437,7 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
394
437
  let commitsParciais = false;
395
438
  if (pontaBase) {
396
439
  chamadas++;
397
- const r = commitsDoGitlab(forja, pontaBase.commit, pedido.desde, executor);
440
+ const r = commitsDoGitlab(forja, pontaBase.commit, pedido.desde, api);
398
441
  if (!r.ok)
399
442
  return r;
400
443
  commits = r.commits;
@@ -418,12 +461,12 @@ const CONSULTA_DE_COMMITS_GITHUB = `query($owner: String!, $name: String!, $oid:
418
461
  * So os commits de um commit da base desde `desde`, quando a janela da primeira leitura ficou curta:
419
462
  * o fuso do projeto so se conhece depois de ler o manifesto dele (achado 5 da rodada 2). So consulta.
420
463
  */
421
- function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao) {
464
+ function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao, api) {
422
465
  if (!SHA.test(pedido.commit))
423
466
  return erro('forja.resposta-invalida', 'commit da base fora do formato');
424
467
  try {
425
468
  if (forja.tipo === 'gitlab')
426
- return commitsDoGitlab(forja, pedido.commit, pedido.desde, executor);
469
+ return commitsDoGitlab(forja, pedido.commit, pedido.desde, api ?? (0, exports.apiDoGitlab)(forja));
427
470
  const [owner, name] = forja.repo.split('/');
428
471
  const r = chamarJson(executor, 'gh', ['api', 'graphql', '--method', 'POST', '--input', '-', ...hostnameDe(forja)], JSON.stringify({ query: CONSULTA_DE_COMMITS_GITHUB, variables: { owner, name, oid: pedido.commit, desde: pedido.desde } }));
429
472
  if (!r.ok)
@@ -444,14 +487,14 @@ function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao) {
444
487
  * Le da forja a base (com `docs/roadmap`, o manifesto e os commits desde `desde`) e as duas branches
445
488
  * de estado. So consulta; qualquer falha volta como erro tipado, com o detalhe redigido.
446
489
  */
447
- function lerDaForja(forja, pedido, executor = exports.executorPadrao) {
490
+ function lerDaForja(forja, pedido, executor = exports.executorPadrao, api) {
448
491
  const lidoEm = pedido.lidoEm ?? new Date().toISOString();
449
492
  try {
450
- return forja.tipo === 'github' ? lerDoGithub(forja, pedido, executor, lidoEm) : lerDoGitlab(forja, pedido, executor, lidoEm);
493
+ return forja.tipo === 'github' ? lerDoGithub(forja, pedido, executor, lidoEm) : lerDoGitlab(forja, pedido, api ?? (0, exports.apiDoGitlab)(forja), lidoEm);
451
494
  }
452
495
  catch (e) {
453
496
  if (e instanceof NaoEncontrado)
454
- return erro('forja.nao-encontrado', `${(0, exports.rotuloDaForja)(forja)} não existe ou não é visível para o login da forja`);
497
+ return erro('forja.nao-achei', `${(0, exports.rotuloDaForja)(forja)} não existe ou não é visível para o login da forja`);
455
498
  if (e instanceof RespostaInvalida)
456
499
  return erro('forja.resposta-invalida', `resposta fora do formato esperado em ${e.message}`);
457
500
  throw e;
package/dist/handoff.js CHANGED
@@ -73,7 +73,15 @@ const phase_1 = require("./phase");
73
73
  const thread_1 = require("./thread");
74
74
  const memoria_1 = require("./memoria");
75
75
  const util_1 = require("./util");
76
+ const verify_1 = require("./verify");
76
77
  const procedencia_1 = require("./procedencia");
78
+ const locale_1 = require("./locale");
79
+ /** RM-037 (defeito 1 de 19 e 20/10/2026): o rotulo de cada comando da baseline no handoff, que vai em pt-BR. */
80
+ const ROTULO_DA_BASELINE = {
81
+ passava: 'passava',
82
+ 'ja-falhava': 'ja falhava',
83
+ 'sem-veredito': 'sem veredito (estouro, sinal, relogio sob steal ou nao rodou: nao vale como ja falhava)',
84
+ };
77
85
  /** sha256 de um arquivo em disco, a prova de proveniencia de cada item. */
78
86
  function sha256DoArquivo(caminho) {
79
87
  if (!fs.existsSync(caminho))
@@ -217,7 +225,8 @@ function exportarHandoff(carregado, threadId, opcoes = {}) {
217
225
  if (thread.baseline) {
218
226
  const b = thread.baseline;
219
227
  addInline('Baseline gravada antes do GO', `commit ${b.commit} em ${b.gravadaEm}\n` +
220
- b.comandos.map((c) => ` ${c.nome}: ${c.ok ? 'passava' : 'ja falhava'} (${c.comando})`).join('\n'), proveniencia(raiz, caminhoThreadJson, 'json:baseline'));
228
+ // RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito na baseline nao e divida anterior.
229
+ b.comandos.map((c) => ` ${c.nome}: ${ROTULO_DA_BASELINE[(0, verify_1.vereditoDaBaseline)(c)]} (${c.comando})`).join('\n'), proveniencia(raiz, caminhoThreadJson, 'json:baseline'));
221
230
  }
222
231
  // IMPORTANTE: os prompts ja despachados, com o pedido original do builder.
223
232
  for (const s of thread.sessoes) {
@@ -509,33 +518,34 @@ function recall(carregado, threadId, ponteiro) {
509
518
  }
510
519
  /** Texto de `ork handoff export`. */
511
520
  function textoDoHandoff(h, caminho) {
521
+ const m = (0, locale_1.msg)().operacao.restante.handoff;
512
522
  const linhas = [];
513
- linhas.push(`Handoff exportado da thread ${h.thread} (regime memory: ${h.memory})`);
514
- linhas.push(` de ${h.de.slug} (fase ${h.de.fase})`);
515
- linhas.push(` para ${h.para.slug} (fase ${h.para.fase})`);
516
- linhas.push(` arquivo ${caminho}`);
523
+ linhas.push(m.exportado(h.thread, h.memory));
524
+ linhas.push(m.de(h.de.slug, h.de.fase));
525
+ linhas.push(m.para(h.para.slug, h.para.fase));
526
+ linhas.push(m.arquivo(caminho));
517
527
  linhas.push('');
518
- linhas.push(`CRITICO (${h.inline.length} item(ns), vao inline no prompt da nova sessao):`);
528
+ linhas.push(m.critico(h.inline.length));
519
529
  for (const i of h.inline) {
520
530
  linhas.push(` ${i.id} ${i.titulo}`);
521
- linhas.push(` proveniencia: ${i.proveniencia.location} (sha256 ${i.proveniencia.sha256.slice(0, 12)})`);
531
+ linhas.push(m.proveniencia(i.proveniencia.location, i.proveniencia.sha256.slice(0, 12)));
522
532
  }
523
533
  linhas.push('');
524
- linhas.push(`IMPORTANTE (${h.pointers.length} ponteiro(s), recuperados sob demanda):`);
534
+ linhas.push(m.importante(h.pointers.length));
525
535
  for (const p of h.pointers) {
526
536
  linhas.push(` ${p.id} ${p.titulo}`);
527
537
  linhas.push(` location: ${p.location} (sha256 ${p.sha256.slice(0, 12)})`);
528
538
  if (p.orkmind)
529
539
  linhas.push(` orkmind: ${p.orkmind}`);
530
- linhas.push(` quando: ${p.retrieve_when}`);
531
- linhas.push(` recuperar: ${p.retrieve_via}`);
532
- linhas.push(` no momento: ork recall ${h.thread} --fase ${p.retrieve_when}`);
540
+ linhas.push(m.quando(p.retrieve_when));
541
+ linhas.push(m.recuperar(p.retrieve_via));
542
+ linhas.push(m.noMomento(h.thread, p.retrieve_when));
533
543
  }
534
544
  linhas.push('');
535
- linhas.push(`RESUMIVEL (${h.summaries.length} resumo(s), com proveniencia declarada):`);
545
+ linhas.push(m.resumivel(h.summaries.length));
536
546
  for (const s of h.summaries) {
537
547
  linhas.push(` ${s.id} ${s.text}`);
538
- linhas.push(` proveniencia: ${s.provenance.location} (sha256 ${s.provenance.sha256.slice(0, 12)})`);
548
+ linhas.push(m.proveniencia(s.provenance.location, s.provenance.sha256.slice(0, 12)));
539
549
  }
540
550
  return linhas.join('\n');
541
551
  }