@orkastery/cli 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +37 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +118 -4
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ESTADOS_DO_MR = exports.projetoNaApi = void 0;
4
+ exports.prDoMr = prDoMr;
5
+ exports.caminhoDosMrsDaBranch = caminhoDosMrsDaBranch;
6
+ exports.pedidosDaBranchGitlab = pedidosDaBranchGitlab;
7
+ exports.abrirPedidoGitlab = abrirPedidoGitlab;
8
+ exports.pedidoMescladoGitlab = pedidoMescladoGitlab;
9
+ exports.branchPadraoGitlab = branchPadraoGitlab;
10
+ exports.pontaDaBranchGitlab = pontaDaBranchGitlab;
11
+ exports.compararGitlab = compararGitlab;
12
+ const texto_1 = require("../texto");
13
+ const SHA = /^[0-9a-f]{40}$/, BRANCH = /^[A-Za-z0-9._/-]{1,200}$/;
14
+ /** O projeto na API: o caminho completo codificado (`projects/grupo%2Fsub%2Fprojeto`). */
15
+ const projetoNaApi = (repo) => `projects/${encodeURIComponent(repo)}`;
16
+ exports.projetoNaApi = projetoNaApi;
17
+ /** O estado do MR, no REST e no GraphQL. `locked` e o merge em curso: o MR ainda nao entrou na base. */
18
+ exports.ESTADOS_DO_MR = { opened: 'aberto', locked: 'aberto', merged: 'mesclado', closed: 'fechado' };
19
+ /** O GitLab ainda calcula a mesclabilidade: o conflito nao e conhecido. */
20
+ const EM_CALCULO = new Set(['unchecked', 'checking', 'preparing', 'approvals_syncing']);
21
+ function instante(v) {
22
+ if (typeof v !== 'string')
23
+ return null;
24
+ const ms = Date.parse(v);
25
+ return Number.isFinite(ms) ? new Date(ms).toISOString() : null;
26
+ }
27
+ /**
28
+ * Um MR da resposta, ou `null` quando nao e desta base nem deste projeto: de fork (outro projeto de origem), de outra
29
+ * base ou de branch que nao e nome de branch. Formato errado lanca: a leitura inteira vira "nao lida". Os checks ficam
30
+ * vazios: a lista nao traz o job do head.
31
+ */
32
+ function prDoMr(bruto, base) {
33
+ if (!bruto || typeof bruto !== 'object')
34
+ throw new Error('MR fora do formato');
35
+ const m = bruto;
36
+ const estado = exports.ESTADOS_DO_MR[String(m.state)];
37
+ // As versoes antigas so tem `work_in_progress`.
38
+ const rascunho = typeof m.draft === 'boolean' ? m.draft : m.work_in_progress;
39
+ if (typeof m.iid !== 'number' || !Number.isSafeInteger(m.iid) || m.iid < 1 || typeof m.sha !== 'string' || !SHA.test(m.sha) || !estado ||
40
+ typeof rascunho !== 'boolean' || !Number.isSafeInteger(m.source_project_id) || !Number.isSafeInteger(m.target_project_id)) {
41
+ throw new Error('MR fora do formato');
42
+ }
43
+ if (m.source_project_id !== m.target_project_id || m.target_branch !== base || typeof m.source_branch !== 'string' ||
44
+ !BRANCH.test(m.source_branch))
45
+ return null;
46
+ const url = typeof m.web_url === 'string' && /^https?:\/\/\S+$/.test(m.web_url) ? m.web_url.slice(0, 300) : null;
47
+ const conflito = estado !== 'aberto' ? undefined : m.has_conflicts === true ? true
48
+ : m.has_conflicts === false && !EM_CALCULO.has(String(m.detailed_merge_status)) ? false : null;
49
+ return { numero: m.iid, branch: m.source_branch, head: m.sha, estado, rascunho, url, criadoEm: instante(m.created_at),
50
+ mescladoEm: instante(m.merged_at), checks: [], ...(conflito !== undefined ? { conflito } : {}) };
51
+ }
52
+ /** O caminho da lista de MRs de uma branch na API, como a leitura o pede. */
53
+ function caminhoDosMrsDaBranch(repo, branch) {
54
+ const consulta = new URLSearchParams({ source_branch: branch, state: 'all', per_page: '100' });
55
+ return `${(0, exports.projetoNaApi)(repo)}/merge_requests?${consulta.toString()}`;
56
+ }
57
+ /** Os MRs de uma branch na base, do mais novo para o mais velho; `erro` com o codigo `forja.*` quando a leitura falha. */
58
+ function pedidosDaBranchGitlab(e) {
59
+ if (!e.api)
60
+ return { prs: [], erro: 'forja.sem-capacidade: pedidosDaBranch sem a API do GitLab' };
61
+ const r = e.api({ metodo: 'GET', caminho: caminhoDosMrsDaBranch(e.repositorio, e.branch), prazoMs: e.prazoMs });
62
+ if (!r.ok)
63
+ return { prs: [], erro: (0, texto_1.deFora)(`${r.erro.codigo}: ${r.erro.detalhe}`) };
64
+ // Mais de 100 MRs da mesma branch: a lista nao foi lida inteira, e nunca vira a lista curta.
65
+ if (r.valor.cabecalhos['x-next-page'])
66
+ return { prs: [], erro: (0, texto_1.deFora)(`forja.incompleto: ${e.branch} > 100`) };
67
+ if (!Array.isArray(r.valor.corpo))
68
+ return { prs: [], erro: 'forja.resposta-invalida: a resposta nao e uma lista' };
69
+ try {
70
+ const prs = r.valor.corpo.map((x) => prDoMr(x, e.base)).filter((p) => !!p && p.branch === e.branch);
71
+ return { prs: prs.sort((a, b) => b.numero - a.numero), erro: null };
72
+ }
73
+ catch (err) {
74
+ return { prs: [], erro: (0, texto_1.deFora)(`forja.resposta-invalida: ${err.message}`) };
75
+ }
76
+ }
77
+ /**
78
+ * Abre o MR da branch na base. Escrita: nunca se repete sozinha (quem chamou rele a lista). O status e o stderr
79
+ * seguem o `gh pr create` (0, ou 1 com o codigo `forja.*` no stderr); o stdout e o JSON do MR criado.
80
+ */
81
+ function abrirPedidoGitlab(e) {
82
+ if (!e.api)
83
+ return { status: 1, stdout: '', stderr: 'forja.sem-capacidade: abrirPedido sem a API do GitLab' };
84
+ const r = e.api({ metodo: 'POST', caminho: `${(0, exports.projetoNaApi)(e.repositorio)}/merge_requests`, prazoMs: e.prazoMs,
85
+ corpo: { source_branch: e.branch, target_branch: e.base, title: e.titulo, description: e.corpo } });
86
+ return r.ok ? { status: 0, stdout: JSON.stringify(r.valor.corpo), stderr: '' }
87
+ : { status: 1, stdout: '', stderr: (0, texto_1.deFora)(`${r.erro.codigo}: ${r.erro.detalhe}`, 300) };
88
+ }
89
+ /** O corpo de um GET que deu certo, quando e objeto; `null` sem a API, com erro ou fora do formato. */
90
+ function lerObjeto(api, caminho) {
91
+ if (!api)
92
+ return null;
93
+ const r = api({ metodo: 'GET', caminho });
94
+ return r.ok && r.valor.corpo !== null && typeof r.valor.corpo === 'object' && !Array.isArray(r.valor.corpo) ? r.valor.corpo : null;
95
+ }
96
+ const sha = (v) => (typeof v === 'string' && SHA.test(v) ? v : null);
97
+ /**
98
+ * O MR da entrega externa, pelo `iid`; `null` quando a consulta falha. O merge e o commit de merge (metodos `merge` e
99
+ * `rebase_merge`), o do squash (`ff` com squash) ou o proprio head (`ff` sem squash: o head entra na base sem commit
100
+ * novo, e o `ship(<thread>)` nunca chega a ela; e por isso que essa entrega vem por aqui).
101
+ */
102
+ function pedidoMescladoGitlab(e) {
103
+ const mr = lerObjeto(e.api, `${(0, exports.projetoNaApi)(e.repo)}/merge_requests/${e.numero}`);
104
+ if (!mr)
105
+ return null;
106
+ const mesclado = mr.state === 'merged';
107
+ const headSha = sha(mr.sha);
108
+ return {
109
+ numero: e.numero, mesclado, headSha,
110
+ mergeSha: sha(mr.merge_commit_sha) ?? sha(mr.squash_commit_sha) ?? (mesclado ? headSha : null),
111
+ base: typeof mr.target_branch === 'string' && BRANCH.test(mr.target_branch) ? mr.target_branch : null,
112
+ branch: typeof mr.source_branch === 'string' ? mr.source_branch : null,
113
+ titulo: typeof mr.title === 'string' ? mr.title : null, corpo: typeof mr.description === 'string' ? mr.description : null,
114
+ url: typeof mr.web_url === 'string' && /^https?:\/\/\S+$/.test(mr.web_url) ? mr.web_url : null,
115
+ };
116
+ }
117
+ /** A branch padrao do projeto; `''` se a resposta nao a traz; `null` quando a consulta falha. */
118
+ function branchPadraoGitlab(e) {
119
+ const p = lerObjeto(e.api, (0, exports.projetoNaApi)(e.repo));
120
+ return p ? (typeof p.default_branch === 'string' ? p.default_branch : '') : null;
121
+ }
122
+ /** O sha da ponta da branch (`commit.id` no GitLab); `null` quando a consulta falha ou nao ha sha valido. */
123
+ function pontaDaBranchGitlab(e) {
124
+ const b = lerObjeto(e.api, `${(0, exports.projetoNaApi)(e.repo)}/repository/branches/${encodeURIComponent(e.branch)}`);
125
+ return sha(b?.commit?.id);
126
+ }
127
+ /**
128
+ * A ponta `ate` contem o merge `de`? Pela base de mesclagem (`straight=false`): os commits de `de` que a base de
129
+ * mesclagem com `ate` nao tem. Nenhum: `ahead`; algum: `diverged` (o GitLab nao separa `behind`). `null` sem leitura.
130
+ */
131
+ function compararGitlab(e) {
132
+ if (!sha(e.de) || !sha(e.ate))
133
+ return null;
134
+ if (e.de === e.ate)
135
+ return 'identical';
136
+ const consulta = new URLSearchParams({ from: e.ate, to: e.de, straight: 'false' });
137
+ const r = lerObjeto(e.api, `${(0, exports.projetoNaApi)(e.repo)}/repository/compare?${consulta.toString()}`);
138
+ if (!r || r.compare_timeout === true || !Array.isArray(r.commits))
139
+ return null;
140
+ return r.commits.length === 0 ? 'ahead' : 'diverged';
141
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PRODUTORES_PADRAO = void 0;
4
+ exports.produtoresAceitos = produtoresAceitos;
5
+ exports.produtorAceito = produtorAceito;
6
+ exports.produtorDeSaida = produtorDeSaida;
7
+ exports.PRODUTORES_PADRAO = {
8
+ github: ['github-actions'],
9
+ gitlab: ['gitlab-ci'],
10
+ };
11
+ /** Os produtores aceitos para uma forja do tipo: os do manifesto ou, sem eles, o padrao. */
12
+ function produtoresAceitos(m, tipo) {
13
+ return m.ci.produtor ?? exports.PRODUTORES_PADRAO[tipo];
14
+ }
15
+ /** O check veio de um produtor da lista? Produtor desconhecido (`null`) nunca e aceito. */
16
+ function produtorAceito(c, aceitos) {
17
+ if (!c.produtor)
18
+ return false;
19
+ if (c.fonte !== 'commit-status')
20
+ return aceitos.includes(c.produtor);
21
+ const app = /^(.+)\[bot\]$/.exec(c.produtor)?.[1];
22
+ return (app !== undefined && aceitos.includes(app)) || aceitos.includes(`status:${c.produtor}`);
23
+ }
24
+ /**
25
+ * O produtor como a pessoa o escreve em `ci.produtor` (e como o `ork ci status --json` o devolve): o slug para check-run
26
+ * e job da forja, o slug do app para a conta `<slug>[bot]` e `status:<login>` para qualquer outra conta de commit status.
27
+ */
28
+ function produtorDeSaida(c) {
29
+ if (!c.produtor || c.fonte !== 'commit-status')
30
+ return c.produtor;
31
+ return /^(.+)\[bot\]$/.exec(c.produtor)?.[1] ?? `status:${c.produtor}`;
32
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adaptadorDaForja = void 0;
4
+ exports.exigirCapacidade = exigirCapacidade;
5
+ const metadados_1 = require("./github/metadados");
6
+ const metadados_2 = require("./gitlab/metadados");
7
+ const dono_da_rede_1 = require("./github/dono-da-rede");
8
+ const ci_1 = require("./github/ci");
9
+ const ci_2 = require("./gitlab/ci");
10
+ const dono_da_rede_2 = require("./gitlab/dono-da-rede");
11
+ const pedidos_1 = require("./gitlab/pedidos");
12
+ const pedidos_abertos_1 = require("./gitlab/pedidos-abertos");
13
+ const pedidos_2 = require("./github/pedidos");
14
+ const ADAPTADORES = {
15
+ github: { tipo: 'github', checksNoCommit: ci_1.checksNoCommitGithub, estadoDeCi: ci_1.estadoDeCiGithub,
16
+ pedidoMesclado: pedidos_2.pedidoMescladoGithub, branchPadrao: pedidos_2.branchPadraoGithub, pontaDaBranch: pedidos_2.pontaDaBranchGithub, comparar: pedidos_2.compararGithub,
17
+ pedidosDaBranch: pedidos_2.pedidosDaBranchGithub, abrirPedido: pedidos_2.abrirPedidoGithub, metadados: metadados_1.metadadosGithub,
18
+ pedidosAbertos: pedidos_2.pedidosAbertosGithub, donoDaRede: dono_da_rede_1.donoDaRedeGithub },
19
+ // O GitLab le a CI so pelo `estadoDeCi`: o `checksNoCommit` e o caminho antigo do executor do `gh`, e o doctor nao o cobra.
20
+ gitlab: { tipo: 'gitlab', estadoDeCi: ci_2.estadoDeCiGitlab, metadados: metadados_2.metadadosGitlab, pedidosAbertos: pedidos_abertos_1.pedidosAbertosGitlab,
21
+ donoDaRede: dono_da_rede_2.donoDaRedeGitlab, pedidosDaBranch: pedidos_1.pedidosDaBranchGitlab, abrirPedido: pedidos_1.abrirPedidoGitlab,
22
+ pedidoMesclado: pedidos_1.pedidoMescladoGitlab, branchPadrao: pedidos_1.branchPadraoGitlab, pontaDaBranch: pedidos_1.pontaDaBranchGitlab, comparar: pedidos_1.compararGitlab },
23
+ };
24
+ const adaptadorDaForja = (tipo) => ADAPTADORES[tipo];
25
+ exports.adaptadorDaForja = adaptadorDaForja;
26
+ function exigirCapacidade(a, k) {
27
+ const f = a[k];
28
+ if (!f)
29
+ throw new Error(`forja.sem-capacidade: ${a.tipo} não tem ${k}`);
30
+ return f;
31
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SONDAS_PADRAO = exports.hostConhecido = void 0;
4
+ exports.sondasPadrao = sondasPadrao;
5
+ exports.resolverForja = resolverForja;
6
+ const api_1 = require("./api");
7
+ const cache_1 = require("./cache");
8
+ const cli_1 = require("./cli");
9
+ const contrato_1 = require("./contrato");
10
+ const executor_1 = require("./executor");
11
+ const HOSTS_CONHECIDOS = {
12
+ 'github.com': { tipo: 'github', host: 'github.com' },
13
+ 'ssh.github.com': { tipo: 'github', host: 'github.com' },
14
+ 'gitlab.com': { tipo: 'gitlab', host: 'gitlab.com' },
15
+ 'altssh.gitlab.com': { tipo: 'gitlab', host: 'gitlab.com' },
16
+ };
17
+ /** O tipo e o host da web de um host conhecido (o SSH pela 443 tambem), ou `null`. */
18
+ const hostConhecido = (host) => HOSTS_CONHECIDOS[host] ?? null;
19
+ exports.hostConhecido = hostConhecido;
20
+ const PRAZO_DA_SONDA_MS = 15_000;
21
+ const objeto = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
22
+ /** As sondas pela CLI com login: o login e conferido antes; sem ele, a API nao e chamada. */
23
+ function sondasPadrao(rodar = executor_1.rodarCli, logins) {
24
+ return {
25
+ github: (alvo) => {
26
+ // O GitHub nao e servido em subcaminho.
27
+ if (alvo.caminhoBase)
28
+ return 'nao-responde';
29
+ const f = { tipo: 'github', ...alvo };
30
+ if (!(0, api_1.temLogin)(f, rodar))
31
+ return 'sem-login';
32
+ const r = (0, api_1.chamarApi)(f, { metodo: 'GET', caminho: 'meta', prazoMs: PRAZO_DA_SONDA_MS }, { rodar, logins });
33
+ return r.ok && objeto(r.valor.corpo) && typeof r.valor.corpo.verifiable_password_authentication === 'boolean' ? 'responde' : 'nao-responde';
34
+ },
35
+ // O `chamarApi` confere o login do glab antes do pedido.
36
+ gitlab: (alvo) => {
37
+ const r = (0, api_1.chamarApi)({ tipo: 'gitlab', ...alvo }, { metodo: 'GET', caminho: 'metadata', prazoMs: PRAZO_DA_SONDA_MS }, { rodar, logins });
38
+ if (!r.ok)
39
+ return r.erro.codigo === 'forja.sem-login' ? 'sem-login' : 'nao-responde';
40
+ return objeto(r.valor.corpo) && typeof r.valor.corpo.version === 'string' ? 'responde' : 'nao-responde';
41
+ },
42
+ };
43
+ }
44
+ exports.SONDAS_PADRAO = sondasPadrao();
45
+ const erro = (codigo, detalhe) => ({ ok: false, erro: { codigo, detalhe } });
46
+ function resolverForja(e) {
47
+ const m = e.manifesto ?? {};
48
+ const r = e.endereco;
49
+ const web = r.protocolo === 'https' || r.protocolo === 'http';
50
+ const ssh = r.protocolo === 'ssh' || r.protocolo === 'scp' || r.protocolo === 'git';
51
+ const conhecidoDoRemoto = (0, exports.hostConhecido)(r.host);
52
+ const hostDoRemoto = conhecidoDoRemoto?.host ?? r.host;
53
+ const declarado = m.host ? ((0, exports.hostConhecido)(m.host)?.host ?? m.host) : null;
54
+ const portaPadrao = r.protocolo === 'http' ? 80 : 443;
55
+ const portaDoRemoto = web && !conhecidoDoRemoto && r.porta !== null && r.porta !== portaPadrao ? r.porta : null;
56
+ // O host da API sai do remoto: o manifesto so o confirma, nunca o troca. A unica troca e a do SSH declarado
57
+ // (`ssh_host`), em que o remoto nomeia o host do SSH e o manifesto, o da web.
58
+ // So `ssh` e `scp` dividem (nao o `git://`, sem autenticacao), e o host da web declarado nunca e um host conhecido:
59
+ // o gate dispensa o login no github.com, entao um manifesto nao pode apontar o SSH de um terceiro para ele.
60
+ const dividido = (r.protocolo === 'ssh' || r.protocolo === 'scp') && !conhecidoDoRemoto && !!m.ssh_host && r.host === m.ssh_host;
61
+ if (dividido && m.host && (0, exports.hostConhecido)(m.host))
62
+ return erro('forja.remoto-divergente', `${r.host} !~ ${m.host}`);
63
+ if (declarado && !dividido && declarado !== hostDoRemoto)
64
+ return erro('forja.remoto-divergente', `${r.host} != ${declarado}`);
65
+ const host = dividido ? (declarado ?? r.host) : hostDoRemoto;
66
+ if (m.porta !== undefined && !dividido) {
67
+ // A porta do remoto SSH e a do SSH, nao a da API: so um remoto web ou um host conhecido restringe a porta.
68
+ const exigida = conhecidoDoRemoto ? null : web ? portaDoRemoto : m.porta;
69
+ if (m.porta !== exigida)
70
+ return erro('forja.remoto-divergente', `${host}: porta ${m.porta} != ${exigida ?? 'padrao'}`);
71
+ }
72
+ const caminhoBase = m.caminho_base ?? '';
73
+ let repo = r.caminho;
74
+ if (caminhoBase && web) {
75
+ const prefixo = `${caminhoBase.slice(1)}/`;
76
+ if (!repo.startsWith(prefixo) || repo.slice(prefixo.length).split('/').length < 2) {
77
+ return erro('forja.remoto-divergente', `${r.caminho} !~ ${caminhoBase}`);
78
+ }
79
+ repo = repo.slice(prefixo.length);
80
+ }
81
+ const porta = m.porta ?? portaDoRemoto;
82
+ const valor = {
83
+ host, porta, caminhoBase,
84
+ sshHost: m.ssh_host ?? (ssh && r.host !== host ? r.host : null),
85
+ sshPorta: m.ssh_porta ?? (r.protocolo === 'ssh' ? r.porta : null),
86
+ ca: m.ca ?? null, repo,
87
+ };
88
+ const origem = {
89
+ host: (m.host ? 'manifesto' : 'remoto'),
90
+ porta: (m.porta !== undefined ? 'manifesto' : portaDoRemoto !== null ? 'remoto' : 'padrao'),
91
+ caminhoBase: (m.caminho_base !== undefined ? 'manifesto' : 'padrao'),
92
+ };
93
+ const conhecido = (0, exports.hostConhecido)(host);
94
+ if (m.tipo) {
95
+ if (conhecido && conhecido.tipo !== m.tipo)
96
+ return erro('forja.remoto-divergente', `${host}: ${conhecido.tipo} != ${m.tipo}`);
97
+ return { ok: true, valor: { tipo: m.tipo, ...valor, origem: { tipo: 'manifesto', ...origem } } };
98
+ }
99
+ if (conhecido)
100
+ return { ok: true, valor: { tipo: conhecido.tipo, ...valor, origem: { tipo: 'remoto', ...origem } } };
101
+ const sondas = e.sondas ?? exports.SONDAS_PADRAO;
102
+ const alvo = { host, porta, caminhoBase, ca: valor.ca };
103
+ // O tipo sondado vale 24 h: so a resposta unica e guardada; a duvida volta a sondar.
104
+ const agora = e.agoraMs ?? Date.now();
105
+ const chaveDoCache = `sondagem ${(0, cli_1.hostDaApi)(alvo)}${caminhoBase}`;
106
+ const guardado = (0, cache_1.lerDoCache)(e.cache ?? null, chaveDoCache, agora)?.tipo;
107
+ if (contrato_1.TIPOS_DE_FORJA.includes(guardado)) {
108
+ return { ok: true, valor: { tipo: guardado, ...valor, origem: { tipo: 'sondagem', ...origem } } };
109
+ }
110
+ const respostas = contrato_1.TIPOS_DE_FORJA.flatMap((tipo) => {
111
+ const sonda = sondas[tipo];
112
+ return sonda ? [{ tipo, resposta: sonda(alvo) }] : [];
113
+ });
114
+ const responderam = respostas.filter((x) => x.resposta === 'responde');
115
+ if (responderam.length === 1) {
116
+ (0, cache_1.gravarNoCache)(e.cache ?? null, chaveDoCache, { tipo: responderam[0].tipo }, agora);
117
+ return { ok: true, valor: { tipo: responderam[0].tipo, ...valor, origem: { tipo: 'sondagem', ...origem } } };
118
+ }
119
+ const resumo = respostas.map((x) => `${x.tipo} ${x.resposta}`).join(', ');
120
+ return erro(responderam.length > 1 ? 'forja.ambigua' : 'forja.desconhecida', `${(0, cli_1.hostDaApi)(alvo)}${caminhoBase} (${resumo})`);
121
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.umaLinha = umaLinha;
4
+ exports.deFora = deFora;
5
+ const hitl_1 = require("../hitl");
6
+ /** Texto curto: uma linha, sem controle, com teto. */
7
+ function umaLinha(texto, teto = 200) {
8
+ return Array.from(texto.replace(/\p{Cc}/gu, ' ').replace(/\s+/g, ' ').trim()).slice(0, teto).join('') || '-';
9
+ }
10
+ /** Texto de fora (stderr do git ou do gh): sem segredo, numa linha e com teto, antes de ir ao `--json` e ao ledger. */
11
+ function deFora(texto, teto = 200) {
12
+ return umaLinha((0, hitl_1.redigirSegredos)(texto), teto);
13
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FAIXAS = exports.VALIDADE_DO_CACHE_MS = void 0;
4
+ exports.faixaDaVersao = faixaDaVersao;
5
+ exports.recusaAbaixoDoPiso = recusaAbaixoDoPiso;
6
+ exports.lerMetadados = lerMetadados;
7
+ /**
8
+ * A versao e a edicao do servidor da forja, e a faixa de compromisso dela: `testada` (as minors em que a bateria de
9
+ * contrato roda antes de cada release), `compativel` (do piso em diante; funciona, com degradacao explicita onde
10
+ * faltar recurso) e `abaixo-do-piso` (recusa clara, nunca comportamento parcial). A leitura fica 24 h no cache da forja
11
+ * (`forja/cache.ts`), por host.
12
+ */
13
+ const api_1 = require("./api");
14
+ const cache_1 = require("./cache");
15
+ const cli_1 = require("./cli");
16
+ const registro_1 = require("./registro");
17
+ const texto_1 = require("./texto");
18
+ var cache_2 = require("./cache");
19
+ Object.defineProperty(exports, "VALIDADE_DO_CACHE_MS", { enumerable: true, get: function () { return cache_2.VALIDADE_DO_CACHE_MS; } });
20
+ /**
21
+ * A janela testada e o piso de cada forja com faixas. A janela sao as tres minors mantidas pelo GitLab na data da
22
+ * release do ork: atualize a lista a cada release, depois de a bateria de contrato passar nelas.
23
+ */
24
+ exports.FAIXAS = {
25
+ gitlab: { testadas: ['19.4', '19.3', '19.2'], piso: '17.0' },
26
+ };
27
+ const minor = (v) => {
28
+ const m = /^(\d+)\.(\d+)/.exec(v);
29
+ return m ? [Number(m[1]), Number(m[2])] : null;
30
+ };
31
+ const comparar = (a, b) => a[0] - b[0] || a[1] - b[1];
32
+ function faixaDaVersao(tipo, versao) {
33
+ const f = exports.FAIXAS[tipo];
34
+ const v = versao ? minor(versao) : null;
35
+ if (!f || !v)
36
+ return 'sem-faixa';
37
+ if (comparar(v, minor(f.piso)) < 0)
38
+ return 'abaixo-do-piso';
39
+ return f.testadas.some((t) => comparar(v, minor(t)) === 0) ? 'testada' : 'compativel';
40
+ }
41
+ /**
42
+ * O erro de quem nao opera abaixo do piso; `null` na faixa. Na forja com faixas, a versao ilegivel (a do cache com
43
+ * `versao: null` ou fora de `N.N`) tambem recusa: sem saber a versao, o piso nao esta provado.
44
+ */
45
+ function recusaAbaixoDoPiso(tipo, m) {
46
+ if (m.faixa === 'abaixo-do-piso')
47
+ return { codigo: 'forja.versao-abaixo-do-piso', detalhe: `${tipo} ${m.versao} < ${exports.FAIXAS[tipo]?.piso}` };
48
+ if (m.faixa === 'sem-faixa' && exports.FAIXAS[tipo]) {
49
+ return { codigo: 'forja.versao-abaixo-do-piso', detalhe: `${tipo}: versão ilegível (${m.versao === null ? 'nula' : (0, texto_1.deFora)(m.versao)})` };
50
+ }
51
+ return null;
52
+ }
53
+ /** A versao, a edicao e a faixa da forja; do cache quando ele tem menos de 24 h. */
54
+ function lerMetadados(f, o) {
55
+ const agora = o.agoraMs ?? Date.now();
56
+ const chave = `metadados ${f.tipo} ${(0, cli_1.hostDaApi)(f)}${f.caminhoBase}`;
57
+ const g = (0, cache_1.lerDoCache)(o.cache, chave, agora);
58
+ if (g && (g.versao === null || typeof g.versao === 'string') && (g.edicao === null || g.edicao === 'ce' || g.edicao === 'ee')) {
59
+ const versao = g.versao;
60
+ return { ok: true, valor: { versao, edicao: g.edicao, lidoEm: String(g.lidoEm),
61
+ faixa: faixaDaVersao(f.tipo, versao), doCache: true } };
62
+ }
63
+ const capacidade = (0, registro_1.adaptadorDaForja)(f.tipo).metadados;
64
+ if (!capacidade)
65
+ return { ok: false, erro: { codigo: 'forja.sem-capacidade', detalhe: `${f.tipo} metadados` } };
66
+ const lido = capacidade({ api: o.api ?? (0, api_1.chamadorDaApi)(f, { rodar: o.rodar }) });
67
+ if (!lido.ok)
68
+ return lido;
69
+ (0, cache_1.gravarNoCache)(o.cache, chave, { ...lido.valor }, agora);
70
+ return { ok: true, valor: { ...lido.valor, lidoEm: new Date(agora).toISOString(), faixa: faixaDaVersao(f.tipo, lido.valor.versao), doCache: false } };
71
+ }