@orkastery/cli 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -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/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -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-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- 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/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- 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 +3 -3
- package/adapters/openclaw/README.md +83 -10
- 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/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -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 +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -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 +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- 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 +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- 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 +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- 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 +53 -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 +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- 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 +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- 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 +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- 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 +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -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 +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- 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 +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- 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 +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- 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/schemas/code-artifact-graph.v1.schema.json +2 -1
- 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,507 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BUFFER_DA_HISTORIA = void 0;
|
|
37
|
+
exports.integrarComVez = integrarComVez;
|
|
38
|
+
exports.provaDoMerge = provaDoMerge;
|
|
39
|
+
exports.reconciliarIntegracao = reconciliarIntegracao;
|
|
40
|
+
/**
|
|
41
|
+
* RM-058, fatia N3 (D13 da ork-rm058n3): a vez de integrar por destino, válida entre as máquinas de um arco #Noctum.
|
|
42
|
+
*
|
|
43
|
+
* O `main-tree` do `ork ship` é um lease da raiz de estado, e não vale entre máquinas: a página da RM-058 pede coordenação
|
|
44
|
+
* compartilhada, com os HEADs revalidados depois de adquirir o direito de integrar. Aqui a vez é um registro do ramo de
|
|
45
|
+
* coordenação, por arco e destino (repositório e base), tomada por troca atômica com o candidato (branch, fonte, base e o
|
|
46
|
+
* hash das provas). Um integrador por destino: o outro recebe `noctum.integracao.ocupada`.
|
|
47
|
+
*
|
|
48
|
+
* Depois de tomar a vez, a base e a branch são relidas do remoto (`git ls-remote`): base ou fonte diferente do candidato o
|
|
49
|
+
* invalida (`noctum.integracao.base-mudou` ou `noctum.integracao.fonte-mudou`), a vez é solta e as provas se repetem sobre o
|
|
50
|
+
* candidato novo. Logo antes do efeito vêm a conferência da N1 com `merge` e a ordem relida, viva e não cancelada. A função
|
|
51
|
+
* que integra é de quem chama (no teste, merge e push no remoto de fixture; na N5, o caminho do SHIP), e o contrato dela é
|
|
52
|
+
* a cerca da base: o merge tem a base provada como primeiro pai (ou é a própria fonte, por avanço rápido), com push sem
|
|
53
|
+
* força, e o push de quem perdeu a vez é recusado se outro integrou. O núcleo confere no remoto que a fonte entrou na base
|
|
54
|
+
* por esse merge e grava a entrega e o fim da vez no mesmo commit. A fonte que entrou por um merge fora da base provada
|
|
55
|
+
* nunca vira entrega: `noctum.integracao.base-nao-provada`, e o trabalho espera a inspeção, sem ser refeito em outra
|
|
56
|
+
* máquina. Sem a fonte na base, `noctum.integracao.nao-provada`, e a vez fica até a reconciliação, que acha o merge provado
|
|
57
|
+
* na base (e registra a entrega sem integrar de novo) ou solta a vez. Um registro de entrega por trabalho: a segunda
|
|
58
|
+
* tentativa recebe `ja-entregue`.
|
|
59
|
+
*
|
|
60
|
+
* A vez é por arco: dois arcos no mesmo destino ao mesmo tempo não se veem por ela (limite dito na página). A vez da
|
|
61
|
+
* máquina que não dá sinal há mais de 15 min é abandonada pela autoridade (A7 da revisão), e o destino volta a andar; na
|
|
62
|
+
* volta, a reconciliação dela registra a entrega se o merge tiver chegado à base, e o trabalho não muda de máquina sem prova.
|
|
63
|
+
*/
|
|
64
|
+
const node_child_process_1 = require("node:child_process");
|
|
65
|
+
const fs = __importStar(require("node:fs"));
|
|
66
|
+
const path = __importStar(require("node:path"));
|
|
67
|
+
const branch_de_estado_1 = require("./branch-de-estado");
|
|
68
|
+
const estado_thread_1 = require("./estado-thread");
|
|
69
|
+
const fila_pesada_1 = require("./fila-pesada");
|
|
70
|
+
const maquina_1 = require("./maquina");
|
|
71
|
+
const noctum_arco_1 = require("./noctum-arco");
|
|
72
|
+
const noctum_coordenacao_1 = require("./noctum-coordenacao");
|
|
73
|
+
const noctum_envelope_1 = require("./noctum-envelope");
|
|
74
|
+
const noctum_transporte_1 = require("./noctum-transporte");
|
|
75
|
+
const recusa = (motivo, detalhe) => new noctum_envelope_1.RecusaDoArco(motivo, detalhe);
|
|
76
|
+
const sha = (v) => typeof v === 'string' && /^[0-9a-f]{40,64}$/.test(v);
|
|
77
|
+
const primeiraLinha = (e) => String(e?.message ?? e).split('\n')[0].slice(0, 300);
|
|
78
|
+
/** A trava local da integração do arco: a reconciliação desta máquina não mexe numa vez que um processo dela segura. */
|
|
79
|
+
function travaDaIntegracao(raiz, arco) {
|
|
80
|
+
if (!noctum_envelope_1.ID_DO_ARCO.test(arco))
|
|
81
|
+
throw recusa('noctum.envelope.invalido', 'identificador de arco inválido');
|
|
82
|
+
const principal = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
83
|
+
(0, estado_thread_1.exigirEstadoSemLink)(principal, ['.orkastery', 'noctum', 'arcos', arco]);
|
|
84
|
+
const dir = path.join(principal, '.orkastery', 'noctum', 'arcos', arco);
|
|
85
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
86
|
+
return (0, fila_pesada_1.tentarTravaExclusiva)(path.join(dir, 'integracao.lock'));
|
|
87
|
+
}
|
|
88
|
+
/** A vez ativa do destino, quando há uma. */
|
|
89
|
+
const ativaDo = (estado, chave) => estado.vezes.get(chave)?.find(v => !v.fim) ?? null;
|
|
90
|
+
const proximaDo = (estado, chave) => (estado.vezes.get(chave)?.length ?? 0) + 1;
|
|
91
|
+
/**
|
|
92
|
+
* O candidato conferido e reduzido aos quatro campos do contrato (B1 da rodada 2): o campo a mais que quem chama trouxer
|
|
93
|
+
* nunca vai ao ramo, onde o leitor o reprovaria.
|
|
94
|
+
*/
|
|
95
|
+
function conferirCandidato(c) {
|
|
96
|
+
if (!c || !(0, branch_de_estado_1.branchValida)(c.branch) || !sha(c.fonte) || !sha(c.base) || typeof c.provas !== 'string' || !/^[0-9a-f]{64}$/.test(c.provas)) {
|
|
97
|
+
throw recusa('noctum.envelope.invalido', 'o candidato traz a branch, a fonte e a base (sha) e o sha256 das provas');
|
|
98
|
+
}
|
|
99
|
+
return { branch: c.branch, fonte: c.fonte, base: c.base, provas: c.provas };
|
|
100
|
+
}
|
|
101
|
+
/** O destino do pedido, só com o repositório e a base: o resto (as permissões do envelope, por exemplo) não vai ao ramo. */
|
|
102
|
+
function conferirDestino(d) {
|
|
103
|
+
if (!d || typeof d.repositorio !== 'string' || !d.repositorio || typeof d.base !== 'string' || !d.base) {
|
|
104
|
+
throw recusa('noctum.envelope.invalido', 'o destino traz o repositório e a base');
|
|
105
|
+
}
|
|
106
|
+
return { repositorio: d.repositorio, base: d.base };
|
|
107
|
+
}
|
|
108
|
+
const mesmoCandidato = (a, b) => a.branch === b.branch && a.fonte === b.fonte && a.base === b.base && a.provas === b.provas;
|
|
109
|
+
/** Grava o fim da vez desta máquina; idempotente. Falha de rede aqui não esconde a recusa que veio antes. */
|
|
110
|
+
function encerrarVez(carregado, arco, chave, n, fim, opcoes) {
|
|
111
|
+
(0, noctum_coordenacao_1.gravarNaCoordenacao)(carregado, arco, opcoes, (leitura) => {
|
|
112
|
+
const vez = (0, noctum_coordenacao_1.derivarCoordenacao)(leitura).vezes.get(chave)?.find(v => v.n === n);
|
|
113
|
+
if (!vez || vez.fim)
|
|
114
|
+
return { novos: [], resultado: null };
|
|
115
|
+
return { novos: [{ tipo: 'vez-fim', chave, n, desfecho: fim.desfecho, motivo: fim.motivo.slice(0, 300).replace(/[\r\n]+/g, ' '),
|
|
116
|
+
merge: fim.merge ?? null }], resultado: null };
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function encerrarSemEsconder(carregado, arco, chave, n, fim, opcoes) {
|
|
120
|
+
try {
|
|
121
|
+
encerrarVez(carregado, arco, chave, n, fim, opcoes);
|
|
122
|
+
}
|
|
123
|
+
catch { /* a vez fica ativa até a reconciliação; a recusa original sobe */ }
|
|
124
|
+
}
|
|
125
|
+
/** A conferência da N1 do merge no destino, com o hash vigente: a janela, a revogação e a permissão (S4 da revisão). */
|
|
126
|
+
function conferirMerge(carregado, arco, envelopeSha256, destino, quando) {
|
|
127
|
+
(0, noctum_arco_1.conferirAntesDoEfeito)(carregado.raiz, { arco, envelopeSha256, acao: 'merge', repositorio: destino.repositorio, branch: destino.base }, quando);
|
|
128
|
+
}
|
|
129
|
+
/** A revogação gravada no ramo por outra máquina do arco também segura o merge (A8 da revisão). */
|
|
130
|
+
function exigirNaoRevogada(estado) {
|
|
131
|
+
if (estado.revogada) {
|
|
132
|
+
throw recusa('noctum.coordenacao.revogada', `o arco foi revogado na máquina ${estado.revogada.por}; nenhuma vez nova de integrar sai`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Integra o candidato no destino com a vez do arco: confere o envelope (N1, `merge`), toma a vez (troca atômica), relê a
|
|
137
|
+
* base e a fonte do remoto, confere a N1 e a ordem de novo logo antes do efeito, chama `integrar`, prova o merge no remoto e
|
|
138
|
+
* grava a entrega e o fim da vez juntos. Lança a recusa tipada; a vez é solta em toda recusa de antes do efeito.
|
|
139
|
+
*/
|
|
140
|
+
function integrarComVez(carregado, arco, pedido, integrar, opcoes = {}) {
|
|
141
|
+
const candidato = conferirCandidato(pedido.candidato);
|
|
142
|
+
const alvo = conferirDestino(pedido.destino);
|
|
143
|
+
const remoto = opcoes.remoto ?? carregado.manifesto.fabrica.remoto;
|
|
144
|
+
const trava = travaDaIntegracao(carregado.raiz, arco);
|
|
145
|
+
if (trava === null)
|
|
146
|
+
throw recusa('noctum.integracao.ocupada', 'outro processo desta máquina integra neste arco agora');
|
|
147
|
+
try {
|
|
148
|
+
const chave = (0, noctum_coordenacao_1.chaveDoDestino)(alvo);
|
|
149
|
+
// 1. A vez, por troca atômica sobre a leitura nova, depois da conferência da N1 (a janela e a revogação antes de tudo).
|
|
150
|
+
const tomada = (0, noctum_coordenacao_1.gravarNaCoordenacao)(carregado, arco, opcoes, (leitura) => {
|
|
151
|
+
const estado = (0, noctum_coordenacao_1.derivarCoordenacao)(leitura);
|
|
152
|
+
const { eu, vigente } = (0, noctum_transporte_1.euNaVersaoVigente)(carregado.raiz, leitura, opcoes);
|
|
153
|
+
conferirMerge(carregado, arco, vigente.envelopeSha256, alvo, opcoes.quando);
|
|
154
|
+
exigirNaoRevogada(estado);
|
|
155
|
+
const o = estado.ordens.get(pedido.ordem);
|
|
156
|
+
if (!o || o.maquina !== eu.nome || o.estado !== 'aceita') {
|
|
157
|
+
throw recusa('noctum.coordenacao.ordem-vencida', `a ordem ${pedido.ordem} não é uma ordem aceita e viva desta máquina`);
|
|
158
|
+
}
|
|
159
|
+
if (o.envelopeSha256 !== vigente.envelopeSha256)
|
|
160
|
+
throw recusa('noctum.efeito.hash-antigo', `a ordem ${pedido.ordem} é de outra versão do envelope`);
|
|
161
|
+
if (estado.entregas.has(o.trabalho) || estado.trabalhos.get(o.trabalho)?.estado === 'entregue') {
|
|
162
|
+
throw recusa('noctum.integracao.ja-entregue', `o trabalho ${o.trabalho} já foi entregue neste arco; nada é integrado de novo`);
|
|
163
|
+
}
|
|
164
|
+
const destino = vigente.conteudo.destinos.find(d => d.repositorio.toLowerCase() === alvo.repositorio.toLowerCase());
|
|
165
|
+
if (!destino || destino.base !== alvo.base || !destino.permissoes.includes('merge')) {
|
|
166
|
+
throw recusa('noctum.efeito.fora-do-destino', `merge em ${alvo.repositorio}, base ${alvo.base}, fora do envelope`);
|
|
167
|
+
}
|
|
168
|
+
const posteriores = entreguesDoDestino(estado, chave);
|
|
169
|
+
const ativa = ativaDo(estado, chave);
|
|
170
|
+
if (ativa) {
|
|
171
|
+
if (ativa.maquina === eu.nome && ativa.ordem === o.ordem && mesmoCandidato(ativa.candidato, candidato)) {
|
|
172
|
+
return { novos: [], resultado: { n: ativa.n, trabalho: o.trabalho, posteriores, repeticao: true } };
|
|
173
|
+
}
|
|
174
|
+
throw recusa('noctum.integracao.ocupada', `a vez de integrar em ${destino.repositorio}, base ${destino.base}, está com a máquina ${ativa.maquina} ` +
|
|
175
|
+
`(trabalho ${ativa.trabalho}); espere ela soltar e repita as provas sobre a base nova`);
|
|
176
|
+
}
|
|
177
|
+
const n = proximaDo(estado, chave);
|
|
178
|
+
return { novos: [{ tipo: 'vez', chave, n, destino: { repositorio: destino.repositorio, base: destino.base }, ordem: o.ordem,
|
|
179
|
+
trabalho: o.trabalho, candidato }], resultado: { n, trabalho: o.trabalho, posteriores, repeticao: false } };
|
|
180
|
+
}).resultado;
|
|
181
|
+
const { n, trabalho, posteriores, repeticao } = tomada;
|
|
182
|
+
// 2. Os HEADs, relidos do remoto depois de ter a vez.
|
|
183
|
+
let cabecas;
|
|
184
|
+
try {
|
|
185
|
+
cabecas = (0, noctum_transporte_1.cabecasNoRemoto)(carregado, [alvo.base, candidato.branch], opcoes);
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
if (repeticao) {
|
|
189
|
+
throw recusa('noctum.integracao.nao-provada', `os HEADs não se leram no remoto durante a repetição (${primeiraLinha(e)}); ` +
|
|
190
|
+
'o merge anterior pode ter chegado, e a vez fica até a reconciliação');
|
|
191
|
+
}
|
|
192
|
+
encerrarSemEsconder(carregado, arco, chave, n, { desfecho: 'desistiu', motivo: 'os HEADs não se leram no remoto' }, opcoes);
|
|
193
|
+
throw e;
|
|
194
|
+
}
|
|
195
|
+
const base = cabecas.get(alvo.base) ?? null, fonte = cabecas.get(candidato.branch) ?? null;
|
|
196
|
+
if (base !== candidato.base) {
|
|
197
|
+
// A1 da rodada 2: a base que andou com o próprio merge (a repetição depois de um `nao-provada` cujo push chegou) não
|
|
198
|
+
// invalida o candidato: a fonte já está nela, e a entrega é registrada sem integrar de novo, como na reconciliação.
|
|
199
|
+
const prova = base ? provaDoMerge(carregado, remoto, alvo.base, candidato, opcoes, posteriores) : null;
|
|
200
|
+
if (prova?.situacao === 'provado') {
|
|
201
|
+
registrarEntrega(carregado, arco, { chave, n, trabalho, ordem: pedido.ordem, destino: alvo, fonte: candidato.fonte,
|
|
202
|
+
base: candidato.base, merge: prova.merge }, opcoes);
|
|
203
|
+
return { trabalho, vez: n, merge: prova.merge };
|
|
204
|
+
}
|
|
205
|
+
if (prova?.situacao === 'sem-prova')
|
|
206
|
+
semProva(carregado, arco, chave, n, alvo, candidato, prova.ponta, opcoes);
|
|
207
|
+
if (base && prova === null && repeticao) {
|
|
208
|
+
// S-R3D-3 da R3-D: na repetição, o merge desta vez pode ser o que fez a base andar, e a história que não se lê (rede,
|
|
209
|
+
// buffer, prazo ou falha do git) não diz; a vez fica até a reconciliação, como no passo 5 (D45), sem invalidar o candidato.
|
|
210
|
+
throw recusa('noctum.integracao.nao-provada', `a base ${alvo.base} andou, e ela ou a história dela não se leram (rede, buffer, prazo ou falha do git): ` +
|
|
211
|
+
'a prova não sabe se o merge desta vez chegou, e a vez fica até a reconciliação');
|
|
212
|
+
}
|
|
213
|
+
const motivo = `a base ${alvo.base} está em ${base?.slice(0, 12) ?? 'nada'}, e o candidato foi provado sobre ${candidato.base.slice(0, 12)}`;
|
|
214
|
+
encerrarSemEsconder(carregado, arco, chave, n, { desfecho: 'invalidado', motivo: `base-mudou: ${motivo}` }, opcoes);
|
|
215
|
+
throw recusa('noctum.integracao.base-mudou', `${motivo}: o candidato foi invalidado; atualize, resolva os conflitos e repita as provas`);
|
|
216
|
+
}
|
|
217
|
+
if (fonte !== candidato.fonte) {
|
|
218
|
+
const motivo = `a branch ${candidato.branch} está em ${fonte?.slice(0, 12) ?? 'nada'}, e o candidato é ${candidato.fonte.slice(0, 12)}`;
|
|
219
|
+
encerrarSemEsconder(carregado, arco, chave, n, { desfecho: 'invalidado', motivo: `fonte-mudou: ${motivo}` }, opcoes);
|
|
220
|
+
throw recusa('noctum.integracao.fonte-mudou', `${motivo}: o candidato foi invalidado; as provas se repetem no SHA novo`);
|
|
221
|
+
}
|
|
222
|
+
// 3. A conferência da N1 e a ordem, logo antes do efeito.
|
|
223
|
+
try {
|
|
224
|
+
const estado = (0, noctum_coordenacao_1.lerCoordenacao)(carregado, arco, opcoes);
|
|
225
|
+
conferirMerge(carregado, arco, estado.vigente.envelopeSha256, alvo, opcoes.quando);
|
|
226
|
+
exigirNaoRevogada(estado);
|
|
227
|
+
const o = estado.ordens.get(pedido.ordem);
|
|
228
|
+
const vez = ativaDo(estado, chave);
|
|
229
|
+
if (!o || o.estado !== 'aceita')
|
|
230
|
+
throw recusa('noctum.coordenacao.ordem-vencida', `a ordem ${pedido.ordem} deixou de valer (${o?.estado ?? 'sumiu'}) antes do merge`);
|
|
231
|
+
if (!vez || vez.n !== n || vez.maquina !== (0, maquina_1.nomeDaMaquina)(opcoes.maquina))
|
|
232
|
+
throw recusa('noctum.integracao.ocupada', 'a vez de integrar mudou de mão antes do merge');
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
if (e instanceof noctum_envelope_1.RecusaDoArco)
|
|
236
|
+
encerrarSemEsconder(carregado, arco, chave, n, { desfecho: 'desistiu', motivo: `${e.motivo} antes do merge` }, opcoes);
|
|
237
|
+
throw e;
|
|
238
|
+
}
|
|
239
|
+
// 4. O efeito. Falha aqui deixa o resultado incerto: a vez fica, e a reconciliação decide pela base.
|
|
240
|
+
let merge;
|
|
241
|
+
try {
|
|
242
|
+
merge = integrar({ remoto, destino: { ...alvo }, candidato: { ...candidato } }).merge;
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
throw recusa('noctum.integracao.nao-provada', `a integração falhou ou ficou incerta (${primeiraLinha(e)}); a vez fica até a reconciliação`);
|
|
246
|
+
}
|
|
247
|
+
// 5. A prova no remoto (B-R2A-1 da rodada 2): a fonte entrou na base por um merge sobre a base provada, e esse merge é o
|
|
248
|
+
// commit que o integrador devolveu (B-R3A-1 da rodada 3): o merge da base nova por cima de um push recusado não vira entrega.
|
|
249
|
+
// As entregas do destino, relidas depois do efeito: com a vez abandonada, outra máquina pode ter integrado no meio.
|
|
250
|
+
let depoisDoEfeito;
|
|
251
|
+
try {
|
|
252
|
+
depoisDoEfeito = entreguesDoDestino((0, noctum_coordenacao_1.lerCoordenacao)(carregado, arco, opcoes), chave, n);
|
|
253
|
+
}
|
|
254
|
+
catch (e) {
|
|
255
|
+
throw recusa('noctum.integracao.nao-provada', `o ramo de coordenação não se leu depois do merge (${primeiraLinha(e)}); a vez fica até a reconciliação`);
|
|
256
|
+
}
|
|
257
|
+
const prova = provaDoMerge(carregado, remoto, alvo.base, candidato, opcoes, [...new Set([...posteriores, ...depoisDoEfeito])]);
|
|
258
|
+
if (prova === null) {
|
|
259
|
+
// S-R3C-5 da R3-C: a base ou a história dela não se leram (rede, buffer, prazo ou falha do git); a prova não sabe, e a vez espera.
|
|
260
|
+
throw recusa('noctum.integracao.nao-provada', `a base ${alvo.base} ou a história dela não se leram (rede, buffer, prazo ou falha do git): a prova não sabe, e a vez fica até a reconciliação`);
|
|
261
|
+
}
|
|
262
|
+
if (prova.situacao === 'sem-prova')
|
|
263
|
+
semProva(carregado, arco, chave, n, alvo, candidato, prova.ponta, opcoes);
|
|
264
|
+
if (prova.situacao !== 'provado') {
|
|
265
|
+
throw recusa('noctum.integracao.nao-provada', `a base ${alvo.base} não tem a fonte pelo merge ${String(merge).slice(0, 12)}; a vez fica até a reconciliação`);
|
|
266
|
+
}
|
|
267
|
+
const devolvido = commitDevolvido(carregado.raiz, merge);
|
|
268
|
+
if (!devolvido.lido) {
|
|
269
|
+
// S-R3D-2 da R3-D: o git não rodou (prazo, sinal ou falha ao abrir o processo); a prova não sabe, e a vez fica até a
|
|
270
|
+
// reconciliação (D45), em vez de terminar com o motivo de que o integrador não devolveu um commit.
|
|
271
|
+
throw recusa('noctum.integracao.nao-provada', 'o commit que o integrador devolveu não se conferiu neste clone (o git não rodou): ' +
|
|
272
|
+
'a vez fica até a reconciliação');
|
|
273
|
+
}
|
|
274
|
+
if (devolvido.commit === null) {
|
|
275
|
+
// S-R3C-1 da R3-C: sem o commit devolvido, o merge provado não se confere; o motivo diz o que houve, sem acusar a fonte.
|
|
276
|
+
fimSemProva(carregado, arco, chave, n, prova.ponta, opcoes, `o integrador não devolveu um commit que se resolva neste clone, e o merge ` +
|
|
277
|
+
`${prova.merge.slice(0, 12)} que leva a fonte ${candidato.fonte.slice(0, 12)} à base ${alvo.base} não se confere por ele`);
|
|
278
|
+
}
|
|
279
|
+
if (devolvido.commit !== prova.merge) {
|
|
280
|
+
// B-R3A-1 da rodada 3, A-R3D-1 e S-R3D-1 da R3-D: o merge provado está na base, mas o commit devolvido é outro (o merge
|
|
281
|
+
// da base nova por cima de um push recusado, a ponta com algo por cima do merge, um commit novo sobre a fonte que já era
|
|
282
|
+
// a base); o motivo diz isso, sem dizer que a fonte chegou à base por fora.
|
|
283
|
+
const merge = candidato.fonte === candidato.base
|
|
284
|
+
? `a fonte ${candidato.fonte.slice(0, 12)} já era a base provada, sem o que integrar`
|
|
285
|
+
: `o merge provado ${prova.merge.slice(0, 12)} leva a fonte ${candidato.fonte.slice(0, 12)} à base ${alvo.base}`;
|
|
286
|
+
fimSemProva(carregado, arco, chave, n, prova.ponta, opcoes, `o commit que o integrador devolveu não é o merge provado: ele devolveu ${devolvido.commit.slice(0, 12)}, e ${merge}`);
|
|
287
|
+
}
|
|
288
|
+
registrarEntrega(carregado, arco, { chave, n, trabalho, ordem: pedido.ordem, destino: alvo, fonte: candidato.fonte,
|
|
289
|
+
base: candidato.base, merge: prova.merge }, opcoes);
|
|
290
|
+
return { trabalho, vez: n, merge: prova.merge };
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
fs.closeSync(trava);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/** O buffer do git da prova pela história; a saída com os pais dos merges passa fácil de 1 MiB, o padrão do `spawnSync`. */
|
|
297
|
+
exports.BUFFER_DA_HISTORIA = 256 * 1024 * 1024;
|
|
298
|
+
/**
|
|
299
|
+
* O git da prova pela história (S-R3A-2 da rodada 3): a busca lê a história inteira entre a base provada e a ponta, sem
|
|
300
|
+
* corte por contagem. Estourado o buffer ou o prazo, a prova não sabe (`null`), e a vez espera.
|
|
301
|
+
*/
|
|
302
|
+
function gitDaHistoria(raiz, args) {
|
|
303
|
+
const r = (0, node_child_process_1.spawnSync)('git', args, { cwd: raiz, encoding: 'utf8', maxBuffer: exports.BUFFER_DA_HISTORIA, timeout: 120_000 });
|
|
304
|
+
return { ok: r.status === 0 && !r.error, stdout: (r.stdout ?? '').toString() };
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* A classe do G8-5, na prova da integração (N2 do CHECK-REVERIFY do GO-FIX 8): o `merge-base --is-ancestor` tem três saídas.
|
|
308
|
+
* A saída 1 é "não"; o git que falha (prazo, sinal, processo que não abre, saída 128) é "não sei", e a prova espera. A exceção
|
|
309
|
+
* é o commit que este clone não tem depois de buscar a base: ele não está nela, e a resposta é "não". O nome diz a regra que o
|
|
310
|
+
* `ancestral` do transporte não tem. Limite: o `rev-parse` que não abre o objeto também sai 1, e a falha dupla (o `merge-base`
|
|
311
|
+
* que falha e o objeto que não abre logo depois) vira "não".
|
|
312
|
+
*/
|
|
313
|
+
function ancestralNaBase(raiz, de, para) {
|
|
314
|
+
const r = (0, node_child_process_1.spawnSync)('git', ['merge-base', '--is-ancestor', de, para], { cwd: raiz, encoding: 'utf8', timeout: 60_000 });
|
|
315
|
+
if (!r.error && r.status === 0)
|
|
316
|
+
return 'sim';
|
|
317
|
+
if (!r.error && r.status === 1)
|
|
318
|
+
return 'nao';
|
|
319
|
+
for (const sha of [de, para]) {
|
|
320
|
+
const existe = (0, node_child_process_1.spawnSync)('git', ['rev-parse', '--verify', '--quiet', `${sha}^{commit}`], { cwd: raiz, encoding: 'utf8', timeout: 60_000 });
|
|
321
|
+
if (!existe.error && existe.status === 1)
|
|
322
|
+
return 'nao';
|
|
323
|
+
}
|
|
324
|
+
return 'ilegivel';
|
|
325
|
+
}
|
|
326
|
+
/** Os merges das vezes entregues deste destino no arco: as integrações que a prova de outra vez tem de respeitar. */
|
|
327
|
+
function entreguesDoDestino(estado, chave, fora) {
|
|
328
|
+
const dasVezes = (estado.vezes.get(chave) ?? []).filter(v => v.n !== fora && v.fim?.desfecho === 'entregue' && typeof v.fim.merge === 'string')
|
|
329
|
+
.map(v => v.fim.merge);
|
|
330
|
+
const registradas = [...estado.entregas.values()].filter((d) => {
|
|
331
|
+
const destino = d.destino;
|
|
332
|
+
return destino && typeof destino.repositorio === 'string' && typeof destino.base === 'string' && (0, noctum_coordenacao_1.chaveDoDestino)({
|
|
333
|
+
repositorio: destino.repositorio, base: destino.base,
|
|
334
|
+
}) === chave && typeof d.merge === 'string';
|
|
335
|
+
}).map(d => d.merge);
|
|
336
|
+
return [...new Set([...dasVezes, ...registradas])];
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* O commit que o integrador devolveu, resolvido no clone desta máquina; `commit: null` quando não é um commit daqui. O SHA vem
|
|
340
|
+
* aparado e em minúsculas (S-R3C-1 da R3-C): a saída do `git rev-parse` sem `trim` e o SHA em maiúsculas são o mesmo
|
|
341
|
+
* commit. Nome de ref não vale: resolvido aqui, diria o commit deste clone, não o que chegou à base. `lido: false` quando o
|
|
342
|
+
* git não rodou ou morreu por erro dele (S-R3D-2 e S-G6-2 da R3-D): prazo, sinal, falha ao abrir o processo ou a saída 128
|
|
343
|
+
* não dizem nada do valor.
|
|
344
|
+
*/
|
|
345
|
+
function commitDevolvido(raiz, merge) {
|
|
346
|
+
const valor = typeof merge === 'string' ? merge.trim().toLowerCase() : '';
|
|
347
|
+
if (!/^[0-9a-f]{7,64}$/.test(valor))
|
|
348
|
+
return { lido: true, commit: null };
|
|
349
|
+
const r = (0, node_child_process_1.spawnSync)('git', ['rev-parse', '--verify', '--quiet', `${valor}^{commit}`], { cwd: raiz, encoding: 'utf8', timeout: 60_000 });
|
|
350
|
+
// S-G6-2 da R3-D: o valor que o git recusa sai 1; o git que morre por erro dele sai 128 e também não diz nada do valor.
|
|
351
|
+
if (r.error || (r.status !== 0 && r.status !== 1))
|
|
352
|
+
return { lido: false };
|
|
353
|
+
return { lido: true, commit: r.status === 0 ? (r.stdout ?? '').trim() : null };
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* B-R2A-1 da rodada 2: a fonte entrou na base por um merge sobre a base provada? Busca a base e procura, entre a base
|
|
357
|
+
* provada e a ponta, o merge cujos pais são exatamente a base provada e a fonte, ou a própria fonte na história de primeiro
|
|
358
|
+
* pai da ponta, acima da base provada (o avanço rápido). B-R3A-1 da rodada 3: o merge achado tem de estar na mesma linha de
|
|
359
|
+
* cada entrega do destino posterior à base provada (`posteriores`); o merge que chegou à base dentro de outro merge, depois
|
|
360
|
+
* de uma integração seguinte, não se prova. Achou: `provado`, com o commit. A fonte na base por outro caminho, como o merge
|
|
361
|
+
* sobre a base de agora que o botão de uma forja faria, é `sem-prova`; a base sem a fonte é `ausente`; `null` quando a base
|
|
362
|
+
* ou a história não se leem, ou quando o git não diz se um commit desce do outro (N2 do CHECK-REVERIFY do GO-FIX 8).
|
|
363
|
+
*/
|
|
364
|
+
function provaDoMerge(carregado, remoto, base, candidato, opcoes, posteriores = []) {
|
|
365
|
+
const { raiz } = carregado;
|
|
366
|
+
let lida;
|
|
367
|
+
try {
|
|
368
|
+
lida = (0, branch_de_estado_1.buscarBranch)(raiz, remoto, base, 'noctum', opcoes.rede?.timeoutMs, opcoes.rede?.env);
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
if (!lida.atualizado || !lida.ponta)
|
|
374
|
+
return null;
|
|
375
|
+
const ponta = lida.ponta;
|
|
376
|
+
const naBase = ancestralNaBase(raiz, candidato.fonte, ponta);
|
|
377
|
+
if (naBase === 'ilegivel')
|
|
378
|
+
return null;
|
|
379
|
+
if (naBase === 'nao')
|
|
380
|
+
return { situacao: 'ausente', ponta };
|
|
381
|
+
const merges = gitDaHistoria(raiz, ['rev-list', '--ancestry-path', '--parents', `${candidato.base}..${ponta}`]);
|
|
382
|
+
const primeiros = gitDaHistoria(raiz, ['rev-list', '--first-parent', `${candidato.base}..${ponta}`]);
|
|
383
|
+
if (!merges.ok || !primeiros.ok)
|
|
384
|
+
return null;
|
|
385
|
+
let merge = null;
|
|
386
|
+
for (const linha of merges.stdout.split('\n')) {
|
|
387
|
+
const [commit, ...pais] = linha.trim().split(' ');
|
|
388
|
+
if (commit && pais.length === 2 && pais[0] === candidato.base && pais[1] === candidato.fonte) {
|
|
389
|
+
merge = commit;
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// O avanço rápido: a própria fonte foi ponta da base, acima da base provada, e ela contém a base provada (a branch
|
|
394
|
+
// atualizada com a base também).
|
|
395
|
+
if (!merge && primeiros.stdout.split('\n').some(x => x.trim() === candidato.fonte)) {
|
|
396
|
+
const sobreABase = ancestralNaBase(raiz, candidato.base, candidato.fonte);
|
|
397
|
+
if (sobreABase === 'ilegivel')
|
|
398
|
+
return null;
|
|
399
|
+
if (sobreABase === 'nao')
|
|
400
|
+
return { situacao: 'sem-prova', ponta };
|
|
401
|
+
merge = candidato.fonte;
|
|
402
|
+
}
|
|
403
|
+
// O avanço rápido vazio (S-R3C-8 da R3-C): a fonte é a própria base provada, a branch sem commit próprio, e não há o que
|
|
404
|
+
// integrar; a entrega fica com a base, como a branch já incorporada do `ork ship`.
|
|
405
|
+
if (!merge && candidato.fonte === candidato.base)
|
|
406
|
+
merge = candidato.base;
|
|
407
|
+
if (!merge)
|
|
408
|
+
return { situacao: 'sem-prova', ponta };
|
|
409
|
+
for (const x of posteriores) {
|
|
410
|
+
if (x === candidato.base)
|
|
411
|
+
continue;
|
|
412
|
+
const depoisDaBase = ancestralNaBase(raiz, candidato.base, x);
|
|
413
|
+
if (depoisDaBase === 'ilegivel')
|
|
414
|
+
return null;
|
|
415
|
+
if (depoisDaBase === 'nao')
|
|
416
|
+
continue;
|
|
417
|
+
const antes = ancestralNaBase(raiz, merge, x);
|
|
418
|
+
const depois = antes === 'nao' ? ancestralNaBase(raiz, x, merge) : antes;
|
|
419
|
+
if (antes === 'ilegivel' || depois === 'ilegivel')
|
|
420
|
+
return null;
|
|
421
|
+
if (antes === 'nao' && depois === 'nao')
|
|
422
|
+
return { situacao: 'sem-prova', ponta };
|
|
423
|
+
}
|
|
424
|
+
return { situacao: 'provado', merge, ponta };
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* A fonte chegou à base sem prova: a vez desta máquina, quando ainda é dela, termina `sem-prova` (o destino volta a andar), e
|
|
428
|
+
* nada vira entrega. O trabalho não é refeito em outra máquina: a ordem fica, e a inspeção é do dono.
|
|
429
|
+
*/
|
|
430
|
+
function semProva(carregado, arco, chave, n, alvo, candidato, ponta, opcoes) {
|
|
431
|
+
return fimSemProva(carregado, arco, chave, n, ponta, opcoes, `a fonte ${candidato.fonte.slice(0, 12)} chegou à base ${alvo.base} ` +
|
|
432
|
+
`por um merge fora da base provada ${candidato.base.slice(0, 12)}`);
|
|
433
|
+
}
|
|
434
|
+
/** O fim `sem-prova` da vez com o motivo que quem chama montou, e a recusa que diz que o trabalho espera a inspeção. */
|
|
435
|
+
function fimSemProva(carregado, arco, chave, n, ponta, opcoes, motivo) {
|
|
436
|
+
encerrarSemEsconder(carregado, arco, chave, n, { desfecho: 'sem-prova', motivo: `base-nao-provada: ${motivo}`, merge: ponta }, opcoes);
|
|
437
|
+
throw recusa('noctum.integracao.base-nao-provada', `${motivo}: nada foi registrado como entrega, e o trabalho espera a inspeção do dono, sem ser refeito`);
|
|
438
|
+
}
|
|
439
|
+
/** A entrega e o fim da vez no mesmo commit. Vale também com a ordem cancelada depois do merge: é a conta do que já foi feito. */
|
|
440
|
+
function registrarEntrega(carregado, arco, e, opcoes) {
|
|
441
|
+
(0, noctum_coordenacao_1.gravarNaCoordenacao)(carregado, arco, opcoes, (leitura) => {
|
|
442
|
+
const estado = (0, noctum_coordenacao_1.derivarCoordenacao)(leitura);
|
|
443
|
+
const vez = estado.vezes.get(e.chave)?.find(v => v.n === e.n);
|
|
444
|
+
const ja = estado.entregas.get(e.trabalho);
|
|
445
|
+
const novos = [];
|
|
446
|
+
if (!ja)
|
|
447
|
+
novos.push({ tipo: 'entrega', trabalho: e.trabalho, ordem: e.ordem, destino: { repositorio: e.destino.repositorio, base: e.destino.base }, fonte: e.fonte, base: e.base, merge: e.merge });
|
|
448
|
+
if (vez && !vez.fim)
|
|
449
|
+
novos.push({ tipo: 'vez-fim', chave: e.chave, n: e.n, desfecho: 'entregue', motivo: 'merge provado no remoto', merge: e.merge });
|
|
450
|
+
return { novos, resultado: null };
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* A reconciliação das vezes desta máquina que ninguém daqui segura: a fonte na base vira entrega registrada (sem integrar
|
|
455
|
+
* de novo); fora dela, a vez é solta e o candidato terá de ser provado de novo. Sem leitura da base, a vez fica. A vez que a
|
|
456
|
+
* autoridade abandonou passa pela mesma conferência: a fonte na base vira a entrega que faltava.
|
|
457
|
+
*/
|
|
458
|
+
function reconciliarIntegracao(carregado, arco, opcoes = {}) {
|
|
459
|
+
const r = { registradas: [], soltas: [], emCurso: [], semProva: [], abandonadasConferidas: [] };
|
|
460
|
+
const eu = (0, noctum_transporte_1.identidadeDaMaquina)(carregado.raiz, opcoes.maquina);
|
|
461
|
+
const estado = (0, noctum_coordenacao_1.lerCoordenacao)(carregado, arco, opcoes);
|
|
462
|
+
// G8-6: a vez da ordem que só outra chave da máquina pode fechar (a da raiz nova) fica para ela.
|
|
463
|
+
const todas = [...estado.vezes.values()].flat().filter(v => v.maquina === eu.nome && (0, noctum_coordenacao_1.ordemDaRaiz)(estado, estado.ordens.get(v.ordem), eu));
|
|
464
|
+
const minhas = todas.filter(v => !v.fim);
|
|
465
|
+
const abandonadas = todas.filter(v => v.fim?.desfecho === 'abandonada' && !estado.entregas.has(v.trabalho) &&
|
|
466
|
+
['aceita', 'isolada'].includes(estado.ordens.get(v.ordem)?.estado ?? ''));
|
|
467
|
+
if (!minhas.length && !abandonadas.length)
|
|
468
|
+
return r;
|
|
469
|
+
const trava = travaDaIntegracao(carregado.raiz, arco);
|
|
470
|
+
if (trava === null) {
|
|
471
|
+
r.emCurso.push(...[...minhas, ...abandonadas].map(v => `${v.chave}/${v.n}`));
|
|
472
|
+
return r;
|
|
473
|
+
}
|
|
474
|
+
try {
|
|
475
|
+
const remoto = opcoes.remoto ?? carregado.manifesto.fabrica.remoto;
|
|
476
|
+
for (const v of [...minhas, ...abandonadas]) {
|
|
477
|
+
// B-R2A-1 e S-R2A-4 da rodada 2: só o merge sobre a base provada vira entrega, com o commit dele, nunca a ponta da base.
|
|
478
|
+
const prova = provaDoMerge(carregado, remoto, v.destino.base, v.candidato, opcoes, entreguesDoDestino(estado, v.chave, v.n));
|
|
479
|
+
if (prova === null)
|
|
480
|
+
continue;
|
|
481
|
+
if (prova.situacao === 'provado') {
|
|
482
|
+
registrarEntrega(carregado, arco, { chave: v.chave, n: v.n, trabalho: v.trabalho, ordem: v.ordem, destino: v.destino,
|
|
483
|
+
fonte: v.candidato.fonte, base: v.candidato.base, merge: prova.merge }, opcoes);
|
|
484
|
+
r.registradas.push({ trabalho: v.trabalho, merge: prova.merge });
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
if (prova.situacao === 'sem-prova') {
|
|
488
|
+
if (!v.fim) {
|
|
489
|
+
encerrarVez(carregado, arco, v.chave, v.n, { desfecho: 'sem-prova', motivo: 'base-nao-provada: reconciliação: a fonte chegou à base por ' +
|
|
490
|
+
'um merge fora da base provada', merge: prova.ponta }, opcoes);
|
|
491
|
+
}
|
|
492
|
+
r.semProva.push(`${v.chave}/${v.n}`);
|
|
493
|
+
continue;
|
|
494
|
+
}
|
|
495
|
+
if (v.fim) {
|
|
496
|
+
r.abandonadasConferidas.push(`${v.chave}/${v.n}`);
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
encerrarVez(carregado, arco, v.chave, v.n, { desfecho: 'desistiu', motivo: 'reconciliação: a fonte não está na base; o candidato será provado de novo' }, opcoes);
|
|
500
|
+
r.soltas.push(`${v.chave}/${v.n}`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
finally {
|
|
504
|
+
fs.closeSync(trava);
|
|
505
|
+
}
|
|
506
|
+
return r;
|
|
507
|
+
}
|