@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.
- 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 +118 -4
- 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/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 +16 -8
- 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 +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -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 +84 -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 +81 -74
- package/dist/doctor-forja.js +345 -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 +143 -43
- 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 +13 -10
- 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 +16 -0
- package/dist/hosts.js +104 -134
- package/dist/index.js +848 -548
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +2 -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 +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +76 -4
- 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 +290 -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 +145 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +169 -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 +287 -11
- 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 +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +82 -14
- 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/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +85 -49
- package/dist/noctum-aceite.js +789 -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 +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +252 -16
- package/dist/noctum-execucao.js +95 -23
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +43 -9
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -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 +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -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 +639 -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 +146 -124
- package/dist/phase.js +53 -27
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +4 -3
- 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 +12 -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 +228 -73
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +117 -43
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -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 +188 -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.js +156 -10
- package/dist/sessoes-contas.js +9 -0
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- 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 +507 -0
- package/dist/verify.js +472 -29
- 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 +9 -4
- 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
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
|
|
24
|
-
*
|
|
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
|
|
32
|
+
const endereco_1 = require("./forja/endereco");
|
|
30
33
|
const hitl_1 = require("./hitl");
|
|
31
34
|
const policies_1 = require("./policies");
|
|
32
|
-
const
|
|
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
|
-
|
|
46
|
-
|
|
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
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
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
|
-
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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-
|
|
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
|
-
/**
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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-
|
|
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
|
-
|
|
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(
|
|
514
|
-
linhas.push(
|
|
515
|
-
linhas.push(
|
|
516
|
-
linhas.push(
|
|
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(
|
|
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(
|
|
531
|
+
linhas.push(m.proveniencia(i.proveniencia.location, i.proveniencia.sha256.slice(0, 12)));
|
|
522
532
|
}
|
|
523
533
|
linhas.push('');
|
|
524
|
-
linhas.push(
|
|
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(
|
|
531
|
-
linhas.push(
|
|
532
|
-
linhas.push(
|
|
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(
|
|
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(
|
|
548
|
+
linhas.push(m.proveniencia(s.provenance.location, s.provenance.sha256.slice(0, 12)));
|
|
539
549
|
}
|
|
540
550
|
return linhas.join('\n');
|
|
541
551
|
}
|