@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.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +37 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
- package/adapters/openclaw/README.md +81 -9
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +123 -9
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +3 -1
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +612 -0
- package/dist/adapters/grok-mcp.js +178 -0
- package/dist/adapters/grok.js +686 -0
- package/dist/agendador-cpu.js +92 -0
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +51 -46
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +94 -40
- package/dist/branch-de-estado.js +23 -10
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +2 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +528 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +238 -0
- package/dist/ci.js +248 -45
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +47 -39
- package/dist/claims.js +10 -9
- package/dist/company-brain-client.js +10 -3
- package/dist/company-brain-migration.js +11 -5
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +25 -8
- package/dist/conducao.js +89 -29
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +111 -87
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +89 -89
- package/dist/doctor-forja.js +343 -0
- package/dist/doctor-pulse-cron.js +113 -1
- package/dist/doctor.js +164 -6
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +154 -54
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +21 -18
- package/dist/evalrunner.js +35 -32
- package/dist/fabrica-batida.js +34 -21
- package/dist/fabrica-estado.js +33 -21
- package/dist/fix.js +21 -19
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +123 -80
- package/dist/handoff.js +23 -13
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +51 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +44 -1
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +34 -31
- package/dist/horario.js +20 -1
- package/dist/hosts.js +104 -134
- package/dist/index.js +864 -554
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +123 -69
- package/dist/intelligence-graph-query.js +37 -22
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +31 -1
- package/dist/licoes.js +12 -11
- package/dist/locale-accounts.js +228 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +86 -10
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +288 -0
- package/dist/locale-gerados.js +5 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +83 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +140 -2
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +183 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +177 -66
- package/dist/locale-thread.js +149 -5
- package/dist/locale-verify.js +80 -4
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +553 -9
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +293 -12
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +10 -5
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +10 -2
- package/dist/master.js +118 -41
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-install.js +90 -15
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +116 -22
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +68 -24
- package/dist/mcp-transportes.js +17 -0
- package/dist/memoria.js +63 -58
- package/dist/merge-da-entrega.js +85 -0
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +94 -54
- package/dist/noctum-aceite.js +929 -0
- package/dist/noctum-arco.js +540 -33
- package/dist/noctum-capacidade.js +3 -3
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +539 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1217 -0
- package/dist/noctum-envelope.js +253 -17
- package/dist/noctum-execucao.js +100 -24
- package/dist/noctum-fechamento.js +416 -0
- package/dist/noctum-fila.js +49 -10
- package/dist/noctum-guarda.js +333 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +387 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +390 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +594 -0
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +861 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-retomada-rede.js +71 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +679 -0
- package/dist/ocupacao.js +3 -1
- package/dist/onboarding.js +16 -5
- package/dist/orkmind.js +39 -23
- package/dist/orquestracao.js +31 -35
- package/dist/parado-no-condutor.js +160 -139
- package/dist/phase.js +96 -42
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +11 -6
- package/dist/preflight.js +2 -1
- package/dist/procedencia.js +9 -14
- package/dist/projeto-alvo.js +59 -20
- package/dist/prompts.js +136 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +143 -27
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +136 -3
- package/dist/ratelimit.js +13 -4
- package/dist/recall.js +14 -13
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +63 -45
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +326 -78
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +279 -85
- package/dist/runtime-escada.js +429 -0
- package/dist/runtime-profiles.js +130 -63
- package/dist/runtimes.js +42 -5
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +366 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +196 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +174 -13
- package/dist/sessoes-contas.js +42 -5
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +67 -66
- package/dist/ship-publicar.js +263 -92
- package/dist/ship.js +160 -17
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +9 -9
- package/dist/thread.js +121 -18
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +5 -2
- package/dist/varredura-acoes.js +500 -0
- package/dist/verify.js +491 -32
- package/dist/worktree-local.js +12 -10
- package/dist/worktree.js +81 -85
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +10 -5
- package/references/security-checklist.md +3 -3
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- 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
|
+
}
|