@orkastery/cli 0.5.6 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +37 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
- package/adapters/openclaw/README.md +81 -9
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +123 -9
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +3 -1
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +612 -0
- package/dist/adapters/grok-mcp.js +178 -0
- package/dist/adapters/grok.js +686 -0
- package/dist/agendador-cpu.js +92 -0
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +51 -46
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +94 -40
- package/dist/branch-de-estado.js +23 -10
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +2 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +528 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +238 -0
- package/dist/ci.js +248 -45
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +47 -39
- package/dist/claims.js +10 -9
- package/dist/company-brain-client.js +10 -3
- package/dist/company-brain-migration.js +11 -5
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +25 -8
- package/dist/conducao.js +89 -29
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +111 -87
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +89 -89
- package/dist/doctor-forja.js +343 -0
- package/dist/doctor-pulse-cron.js +113 -1
- package/dist/doctor.js +164 -6
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +154 -54
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +21 -18
- package/dist/evalrunner.js +35 -32
- package/dist/fabrica-batida.js +34 -21
- package/dist/fabrica-estado.js +33 -21
- package/dist/fix.js +21 -19
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +123 -80
- package/dist/handoff.js +23 -13
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +51 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +44 -1
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +34 -31
- package/dist/horario.js +20 -1
- package/dist/hosts.js +104 -134
- package/dist/index.js +864 -554
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +123 -69
- package/dist/intelligence-graph-query.js +37 -22
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +31 -1
- package/dist/licoes.js +12 -11
- package/dist/locale-accounts.js +228 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +86 -10
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +288 -0
- package/dist/locale-gerados.js +5 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +83 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +140 -2
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +183 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +177 -66
- package/dist/locale-thread.js +149 -5
- package/dist/locale-verify.js +80 -4
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +553 -9
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +293 -12
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +10 -5
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +10 -2
- package/dist/master.js +118 -41
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-install.js +90 -15
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +116 -22
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +68 -24
- package/dist/mcp-transportes.js +17 -0
- package/dist/memoria.js +63 -58
- package/dist/merge-da-entrega.js +85 -0
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +94 -54
- package/dist/noctum-aceite.js +929 -0
- package/dist/noctum-arco.js +540 -33
- package/dist/noctum-capacidade.js +3 -3
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +539 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1217 -0
- package/dist/noctum-envelope.js +253 -17
- package/dist/noctum-execucao.js +100 -24
- package/dist/noctum-fechamento.js +416 -0
- package/dist/noctum-fila.js +49 -10
- package/dist/noctum-guarda.js +333 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +387 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +390 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +594 -0
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +861 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-retomada-rede.js +71 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +679 -0
- package/dist/ocupacao.js +3 -1
- package/dist/onboarding.js +16 -5
- package/dist/orkmind.js +39 -23
- package/dist/orquestracao.js +31 -35
- package/dist/parado-no-condutor.js +160 -139
- package/dist/phase.js +96 -42
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +11 -6
- package/dist/preflight.js +2 -1
- package/dist/procedencia.js +9 -14
- package/dist/projeto-alvo.js +59 -20
- package/dist/prompts.js +136 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +143 -27
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +136 -3
- package/dist/ratelimit.js +13 -4
- package/dist/recall.js +14 -13
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +63 -45
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +326 -78
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +279 -85
- package/dist/runtime-escada.js +429 -0
- package/dist/runtime-profiles.js +130 -63
- package/dist/runtimes.js +42 -5
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +366 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +196 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +174 -13
- package/dist/sessoes-contas.js +42 -5
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +67 -66
- package/dist/ship-publicar.js +263 -92
- package/dist/ship.js +160 -17
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +9 -9
- package/dist/thread.js +121 -18
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +5 -2
- package/dist/varredura-acoes.js +500 -0
- package/dist/verify.js +491 -32
- package/dist/worktree-local.js +12 -10
- package/dist/worktree.js +81 -85
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +10 -5
- package/references/security-checklist.md +3 -3
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/entrega-pr.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mergeDaEntrega = mergeDaEntrega;
|
|
4
|
+
exports.enderecoDoRemotoDaRaiz = enderecoDoRemotoDaRaiz;
|
|
5
|
+
exports.forjaDaEntrega = forjaDaEntrega;
|
|
4
6
|
exports.registrarEntregaPorPr = registrarEntregaPorPr;
|
|
5
7
|
exports.registrarEntregaExternaPorPr = registrarEntregaExternaPorPr;
|
|
6
8
|
exports.registrarEntregasPorPr = registrarEntregasPorPr;
|
|
@@ -17,27 +19,37 @@ exports.registrarEntregasPorPr = registrarEntregasPorPr;
|
|
|
17
19
|
* head do PR. Sem CI verde, nao registra: merge sem prova independente nao e entrega.
|
|
18
20
|
*/
|
|
19
21
|
const branch_de_estado_1 = require("./branch-de-estado");
|
|
22
|
+
const produtor_1 = require("./forja/produtor");
|
|
20
23
|
const ci_1 = require("./ci");
|
|
24
|
+
const api_1 = require("./forja/api");
|
|
25
|
+
const cli_1 = require("./forja/cli");
|
|
26
|
+
const endereco_1 = require("./forja/endereco");
|
|
27
|
+
const pedidos_1 = require("./forja/gitlab/pedidos");
|
|
28
|
+
const cache_1 = require("./forja/cache");
|
|
29
|
+
const resolver_1 = require("./forja/resolver");
|
|
21
30
|
const docs_1 = require("./docs");
|
|
22
31
|
const fabrica_publicar_1 = require("./fabrica-publicar");
|
|
23
32
|
const ledger_1 = require("./ledger");
|
|
24
33
|
const modos_1 = require("./modos");
|
|
34
|
+
const noctum_guarda_1 = require("./noctum-guarda");
|
|
25
35
|
const thread_1 = require("./thread");
|
|
26
36
|
const util_1 = require("./util");
|
|
37
|
+
const executor_1 = require("./forja/executor");
|
|
38
|
+
const registro_1 = require("./forja/registro");
|
|
27
39
|
const locale_1 = require("./locale");
|
|
28
|
-
|
|
40
|
+
const merge_da_entrega_1 = require("./merge-da-entrega");
|
|
41
|
+
const worktree_1 = require("./worktree");
|
|
42
|
+
/** O merge da entrega mais recente na base remota, com o head do PR (segundo pai). */
|
|
29
43
|
function mergeDaEntrega(raiz, thread, remoto, base) {
|
|
30
|
-
|
|
31
|
-
|
|
44
|
+
let branch;
|
|
45
|
+
try {
|
|
46
|
+
branch = (0, merge_da_entrega_1.branchRegistradaDaEntrega)(raiz, thread) ?? (0, worktree_1.branchDaWorktree)((0, thread_1.lerThread)(raiz, thread));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
32
49
|
return null;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
continue;
|
|
37
|
-
const segundo = (pais ?? '').split(' ')[1] ?? null;
|
|
38
|
-
return { mergeSha: sha, headSha: segundo };
|
|
39
|
-
}
|
|
40
|
-
return null;
|
|
50
|
+
}
|
|
51
|
+
const merge = (0, merge_da_entrega_1.mergesDasEntregasNaBase)(raiz, `refs/remotes/${remoto}/${base}`, base, [{ thread, branch }]).get(thread)?.[0];
|
|
52
|
+
return merge ? { mergeSha: merge.mergeSha, headSha: merge.headSha } : null;
|
|
41
53
|
}
|
|
42
54
|
/**
|
|
43
55
|
* A thread chega ao SHIP quando o ciclo dela tem SHIP, e so AVANCA: o segundo PR da mesma entrega (os
|
|
@@ -51,6 +63,28 @@ function avancarParaShip(raiz, threadId) {
|
|
|
51
63
|
atualizada.faseAtual = 'SHIP';
|
|
52
64
|
(0, thread_1.gravarThread)(raiz, atualizada);
|
|
53
65
|
}
|
|
66
|
+
/** O endereco do remoto, de UM parse da URL; `null` quando o remoto nao existe ou nao tem host de forja. */
|
|
67
|
+
function enderecoDoRemotoDaRaiz(raiz, remoto) {
|
|
68
|
+
// Git local sem rede escondida nem pergunta de credencial no terminal.
|
|
69
|
+
const url = (0, util_1.exec)('git', ['remote', 'get-url', '--', remoto], raiz, 60000, { ...process.env, GIT_NO_LAZY_FETCH: '1', GIT_TERMINAL_PROMPT: '0' });
|
|
70
|
+
return url.ok ? (0, endereco_1.lerEnderecoDoRemoto)(url.stdout.trim()) : null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A forja do remoto, de UM parse da URL e do resolver (o bloco `forja:`, o host conhecido ou a sondagem pela CLI com
|
|
74
|
+
* login no host): o nome do host nao decide o tipo. `erro` nulo: o remoto nao existe, nao tem host de forja (caminho
|
|
75
|
+
* local) ou aponta um caminho que a forja dele nao tem (subgrupo no GitHub).
|
|
76
|
+
*/
|
|
77
|
+
function forjaDaEntrega(carregado, remoto, sondas = resolver_1.SONDAS_PADRAO) {
|
|
78
|
+
const endereco = enderecoDoRemotoDaRaiz(carregado.raiz, remoto);
|
|
79
|
+
if (!endereco)
|
|
80
|
+
return { ok: false, erro: null };
|
|
81
|
+
const r = (0, resolver_1.resolverForja)({ endereco, manifesto: carregado.manifesto.forja, sondas, cache: (0, cache_1.dirDoCacheDaForja)(carregado.raiz) });
|
|
82
|
+
if (!r.ok)
|
|
83
|
+
return { ok: false, erro: r.erro };
|
|
84
|
+
if (r.valor.tipo === 'github' && r.valor.repo.split('/').length !== 2)
|
|
85
|
+
return { ok: false, erro: null };
|
|
86
|
+
return { ok: true, valor: r.valor };
|
|
87
|
+
}
|
|
54
88
|
function resultado(thread, acao, motivo, extra = {}) {
|
|
55
89
|
return { thread, acao, motivo, mergeSha: null, headSha: null, ci: null, docsPendentes: [], ...extra };
|
|
56
90
|
}
|
|
@@ -66,11 +100,26 @@ function registrarEntregaPorPr(carregado, threadId, opcoes = {}) {
|
|
|
66
100
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
67
101
|
if (thread.status === 'fechada')
|
|
68
102
|
return resultado(threadId, 'ja-registrada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prThreadFechada));
|
|
69
|
-
|
|
70
|
-
|
|
103
|
+
// RM-058, integracao (T1.1, D3 da ork-rm058integra): a entrega da thread de um arco #Noctum e do passo da entrega dele,
|
|
104
|
+
// com as provas dele; antes de qualquer git, e sem ledger.
|
|
105
|
+
const guarda = (0, noctum_guarda_1.guardaDaThread)(raiz, threadId, opcoes.arcos?.quando, { arcos: opcoes.arcos });
|
|
106
|
+
if (guarda)
|
|
107
|
+
return resultado(threadId, 'recusada', guarda.texto, { codigo: guarda.motivo });
|
|
108
|
+
if (opcoes.buscar !== false) {
|
|
109
|
+
const busca = (0, util_1.exec)('git', ['fetch', '-q', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], raiz);
|
|
110
|
+
if (!busca.ok) {
|
|
111
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemLeitura(remoto, base)), { codigo: 'entrega.sem-leitura' });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
71
114
|
const encontrado = mergeDaEntrega(raiz, threadId, remoto, base);
|
|
72
115
|
if (!encontrado)
|
|
73
116
|
return resultado(threadId, 'sem-merge', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemMerge(threadId, remoto, base)));
|
|
117
|
+
// Squash ou rebase: sem segundo pai o merge nao se liga ao head que a CI verificou. Com a CI exigida, a CI do commit
|
|
118
|
+
// da base nao prova o head, e a entrega e recusada antes de qualquer consulta. Sem CI exigida, registra como sempre.
|
|
119
|
+
const exigeCi = carregado.manifesto.ci.required_for_ship;
|
|
120
|
+
if (encontrado.headSha === null && exigeCi) {
|
|
121
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemVinculo(threadId, encontrado.mergeSha.slice(0, 7))), { mergeSha: encontrado.mergeSha, codigo: 'entrega.sem-vinculo' });
|
|
122
|
+
}
|
|
74
123
|
// RM-044 (A3): o condutor roda o registrar-pr logo depois do merge; e aqui que ele fica sabendo da pagina que
|
|
75
124
|
// vai deixar o push da base vermelho, lida da base remota que o fetch acabou de trazer.
|
|
76
125
|
const merge = { ...encontrado, docsPendentes: (0, docs_1.docsPendentesDoMerge)(raiz, threadId, `refs/remotes/${remoto}/${base}`) };
|
|
@@ -84,7 +133,10 @@ function registrarEntregaPorPr(carregado, threadId, opcoes = {}) {
|
|
|
84
133
|
if (!ponta || !(0, util_1.exec)('git', ['merge-base', '--is-ancestor', merge.mergeSha, ponta], raiz).ok) {
|
|
85
134
|
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prForaDaPonta(merge.mergeSha.slice(0, 7), remoto, base)), merge);
|
|
86
135
|
}
|
|
87
|
-
|
|
136
|
+
// A CI so e consultada no head do PR; sem head (squash ou rebase), so chega aqui sem CI exigida, e nada e consultado.
|
|
137
|
+
const ci = encontrado.headSha !== null
|
|
138
|
+
? (0, ci_1.consultarCi)(carregado, encontrado.headSha, remoto, opcoes.executorCi)
|
|
139
|
+
: (0, ci_1.ciNaoExigida)(carregado, encontrado.mergeSha);
|
|
88
140
|
if (ci.required && !ci.ok) {
|
|
89
141
|
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemCiVerde((0, locale_1.remontar)(ci.detail))), { ...merge, ci });
|
|
90
142
|
}
|
|
@@ -117,23 +169,37 @@ function registrarEntregaPorPr(carregado, threadId, opcoes = {}) {
|
|
|
117
169
|
(0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
|
|
118
170
|
return resultado(threadId, 'registrou', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRegistrou(merge.mergeSha.slice(0, 7))), { ...merge, ci });
|
|
119
171
|
}
|
|
120
|
-
const ghApi = (caminho) =>
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
172
|
+
const ghApi = (caminho) => {
|
|
173
|
+
const r = (0, executor_1.rodarCli)({ cmd: 'gh', args: ['api', '--hostname', 'github.com', caminho, '-H', 'Accept: application/vnd.github+json'], prazoMs: 120000,
|
|
174
|
+
maxBuffer: 32 * 1024 * 1024 });
|
|
175
|
+
return { ok: r.status === 0, code: r.status ?? -1, stdout: r.stdout, stderr: r.stderr };
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* A forja do repositorio externo: a do projeto quando ela e um GitLab (o mesmo host, a mesma porta, o mesmo caminho
|
|
179
|
+
* base, outro projeto); o github.com quando a forja do projeto e o GitHub ou quando o projeto nao tem remoto de forja
|
|
180
|
+
* (sem remoto ou caminho local), como sempre. Nao ha host de reserva: o remoto que nomeia um host de forja que nao se
|
|
181
|
+
* resolve, e o projeto que declara `forja.tipo: gitlab` sem a forja resolvida, nunca caem no github.com.
|
|
182
|
+
*/
|
|
183
|
+
function forjaDoExterno(carregado, repo, opcoes) {
|
|
184
|
+
const remoto = opcoes.remoto ?? 'origin';
|
|
185
|
+
const doProjeto = opcoes.forja ? { ok: true, valor: opcoes.forja } : forjaDaEntrega(carregado, (0, branch_de_estado_1.exigirRemoto)(remoto, 'ship'), opcoes.sondas);
|
|
186
|
+
if (doProjeto.ok && doProjeto.valor.tipo === 'gitlab')
|
|
187
|
+
return { ok: true, gitlab: { ...doProjeto.valor, repo } };
|
|
188
|
+
if (carregado.manifesto.forja?.tipo === 'gitlab') {
|
|
189
|
+
return { ok: false, remoto, declarada: true,
|
|
190
|
+
erro: !doProjeto.ok && doProjeto.erro ? doProjeto.erro : { codigo: 'forja.desconhecida', detalhe: remoto } };
|
|
129
191
|
}
|
|
192
|
+
if (!doProjeto.ok && doProjeto.erro)
|
|
193
|
+
return { ok: false, erro: doProjeto.erro, remoto, declarada: false };
|
|
194
|
+
return { ok: true, gitlab: null };
|
|
130
195
|
}
|
|
131
196
|
/**
|
|
132
197
|
* `ork ship registrar-pr <thread> --repo <dono/nome> --pr <n>`: a thread que entrega por PR em outro
|
|
133
198
|
* repositorio (os sites, por exemplo) nao tinha como virar `ship_done`, e a entrega virava decisao. A
|
|
134
|
-
* exigencia e a mesma do caminho local: o merge dentro da ponta da base (pela API do
|
|
135
|
-
* repositorio nao e remoto deste checkout) e o check declarado verde no head do PR.
|
|
136
|
-
* estar declarado no manifesto; e o dono que diz onde, e com que check, a entrega vale.
|
|
199
|
+
* exigencia e a mesma do caminho local: o merge dentro da ponta da base (pela API da forja do repositorio, o GitHub
|
|
200
|
+
* ou o GitLab do projeto, porque o repositorio nao e remoto deste checkout) e o check declarado verde no head do PR.
|
|
201
|
+
* O repositorio precisa estar declarado no manifesto; e o dono que diz onde, e com que check, a entrega vale.
|
|
202
|
+
* Idempotente.
|
|
137
203
|
*/
|
|
138
204
|
function registrarEntregaExternaPorPr(carregado, threadId, opcoes) {
|
|
139
205
|
const raiz = carregado.raiz, repo = opcoes.repositorio, n = opcoes.pr;
|
|
@@ -147,66 +213,91 @@ function registrarEntregaExternaPorPr(carregado, threadId, opcoes) {
|
|
|
147
213
|
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
148
214
|
if (thread.status === 'fechada')
|
|
149
215
|
return resultado(threadId, 'ja-registrada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prThreadFechada));
|
|
216
|
+
// RM-058, integracao (T1.1): a mesma guarda do PR local, antes de consultar a forja.
|
|
217
|
+
const guarda = (0, noctum_guarda_1.guardaDaThread)(raiz, threadId);
|
|
218
|
+
if (guarda)
|
|
219
|
+
return resultado(threadId, 'recusada', guarda.texto, { codigo: guarda.motivo });
|
|
150
220
|
const dir = (0, thread_1.dirThread)(raiz, threadId);
|
|
151
221
|
if ((0, ledger_1.lerLedger)(dir).some((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.shipConcluido && e.repositorio === repo && e.pr === n)) {
|
|
152
222
|
return resultado(threadId, 'ja-registrada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoJaTem(n, repo)));
|
|
153
223
|
}
|
|
154
|
-
const
|
|
224
|
+
const daForja = forjaDoExterno(carregado, repo, opcoes);
|
|
225
|
+
if (!daForja.ok) {
|
|
226
|
+
const { erro, remoto, declarada } = daForja;
|
|
227
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => declarada ? m.ship.prForjaDoExterno(repo, m.forja.motivo(erro, 'gitlab'))
|
|
228
|
+
: m.ship.prForjaDoProjetoNaoResolvida(repo, remoto, m.forja.motivo(erro, null))), { codigo: 'entrega.sem-leitura' });
|
|
229
|
+
}
|
|
230
|
+
const gitlab = daForja.gitlab;
|
|
231
|
+
// O GitHub so tem dono/nome: o caminho com subgrupo e recusado antes de qualquer consulta.
|
|
232
|
+
if (!gitlab && repo.split('/').length !== 2) {
|
|
233
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRepoComSubgrupoNoGithub(repo)), { codigo: 'entrega.forja-mista' });
|
|
234
|
+
}
|
|
235
|
+
const nomeDaForja = gitlab ? 'GitLab' : undefined;
|
|
236
|
+
const forja = (0, registro_1.adaptadorDaForja)(gitlab ? 'gitlab' : 'github');
|
|
237
|
+
const api = gitlab ? (0, api_1.chamadorDaApi)(gitlab, opcoes.api ?? {}) : undefined;
|
|
238
|
+
const pr = (0, registro_1.exigirCapacidade)(forja, 'pedidoMesclado')({ repo, numero: n, executor: gh, api });
|
|
155
239
|
if (!pr)
|
|
156
|
-
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prConsultaFalhou(n, repo)));
|
|
157
|
-
const mergeSha
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
240
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prConsultaFalhou(n, repo, nomeDaForja)));
|
|
241
|
+
const { mergeSha, headSha, base } = pr;
|
|
242
|
+
if (pr.mesclado && mergeSha && base && !headSha) {
|
|
243
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemHead(n, repo, nomeDaForja)), { mergeSha, codigo: 'entrega.sem-head' });
|
|
244
|
+
}
|
|
245
|
+
if (!pr.mesclado || !mergeSha || !headSha || !base) {
|
|
246
|
+
return resultado(threadId, 'sem-merge', (0, locale_1.textoDoCatalogo)((m) => m.ship.prNaoMesclado(n, repo, !!gitlab)));
|
|
162
247
|
}
|
|
163
248
|
// Achado A4 do CHECK: o PR precisa ser DESTA thread e ter entrado na branch padrao do repositorio. Sem o
|
|
164
249
|
// vinculo, qualquer PR mesclado do repositorio viraria entrega de qualquer thread; sem a base, um PR
|
|
165
250
|
// empilhado numa branch de feature contaria como entrega.
|
|
166
|
-
const vinculo = [pr.
|
|
251
|
+
const vinculo = [pr.titulo, pr.corpo, pr.branch].filter((x) => typeof x === 'string')
|
|
167
252
|
// N4 do CHECK 2: a branch do proprio ork e `ork/<thread>-<variante>`, entao o hifen depois do id vale;
|
|
168
253
|
// letra ou digito colado nao (outro id). Sem diferenciar maiusculas.
|
|
169
254
|
.some((x) => new RegExp(`(^|[^a-z0-9-])${threadId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?![a-z0-9])`, 'i').test(x));
|
|
170
255
|
if (!vinculo) {
|
|
171
|
-
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prNaoCitaThread(n, repo, threadId)), { mergeSha, headSha });
|
|
256
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prNaoCitaThread(n, repo, threadId, !!gitlab)), { mergeSha, headSha });
|
|
172
257
|
}
|
|
173
|
-
const
|
|
174
|
-
if (
|
|
175
|
-
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRepoFalhou(repo)), { mergeSha, headSha });
|
|
176
|
-
if (
|
|
177
|
-
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prOutraBase(n, base, repo,
|
|
258
|
+
const branchPadrao = (0, registro_1.exigirCapacidade)(forja, 'branchPadrao')({ repo, executor: gh, api });
|
|
259
|
+
if (branchPadrao === null)
|
|
260
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prRepoFalhou(repo, nomeDaForja)), { mergeSha, headSha });
|
|
261
|
+
if (branchPadrao !== base) {
|
|
262
|
+
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prOutraBase(n, base, repo, branchPadrao || undefined, !!gitlab)), { mergeSha, headSha });
|
|
178
263
|
}
|
|
179
264
|
// A ponta da base AGORA, e o merge dentro dela: o push provado, pela mesma pergunta do ls-remote.
|
|
180
|
-
const
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
if (!ponta || !comparacao || !['ahead', 'identical'].includes(String(comparacao.status))) {
|
|
265
|
+
const ponta = (0, registro_1.exigirCapacidade)(forja, 'pontaDaBranch')({ repo, branch: base, executor: gh, api }) ?? '';
|
|
266
|
+
const comparacao = ponta ? (0, registro_1.exigirCapacidade)(forja, 'comparar')({ repo, de: mergeSha, ate: ponta, executor: gh, api }) : null;
|
|
267
|
+
if (!ponta || comparacao === null || !['ahead', 'identical'].includes(comparacao)) {
|
|
184
268
|
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoForaDaPonta(mergeSha.slice(0, 7), repo, base)), { mergeSha, headSha });
|
|
185
269
|
}
|
|
186
270
|
const check = declarados[repo];
|
|
187
|
-
const
|
|
271
|
+
const ciDaForja = opcoes.ciDaForja ?? ((f, sha, contexto) => (0, ci_1.consultarCiNaForja)(f, sha, contexto, (0, produtor_1.produtoresAceitos)(carregado.manifesto, 'gitlab'), { api: opcoes.api }));
|
|
272
|
+
const ci = !check ? null : gitlab ? ciDaForja(gitlab, headSha, check)
|
|
273
|
+
: (0, ci_1.consultarCiDoRepositorio)(repo, headSha, check, opcoes.executorCi, 'github.com', (0, produtor_1.produtoresAceitos)(carregado.manifesto, 'github'));
|
|
188
274
|
if (ci && !ci.ok) {
|
|
189
275
|
return resultado(threadId, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemCiVerde((0, locale_1.remontar)(ci.detail))), { mergeSha, headSha, ci });
|
|
190
276
|
}
|
|
191
277
|
if (opcoes.dryRun) {
|
|
192
|
-
return resultado(threadId, 'registraria', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistraria(mergeSha.slice(0, 7), n, repo)), { mergeSha, headSha, ci });
|
|
278
|
+
return resultado(threadId, 'registraria', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistraria(mergeSha.slice(0, 7), n, repo, !!gitlab)), { mergeSha, headSha, ci });
|
|
193
279
|
}
|
|
194
280
|
(0, ledger_1.registrar)(dir, threadId, ledger_1.TIPOS_DE_EVENTO.shipConcluido, {
|
|
195
281
|
de: thread.base?.branch ?? null,
|
|
196
282
|
para: `${repo}:${base}`,
|
|
197
283
|
repositorio: repo,
|
|
198
284
|
pr: n,
|
|
199
|
-
url: pr.
|
|
285
|
+
url: pr.url ?? (gitlab ? `https://${(0, cli_1.hostDaApi)(gitlab)}${gitlab.caminhoBase}/${repo}/-/merge_requests/${n}` : `https://github.com/${repo}/pull/${n}`),
|
|
200
286
|
shaDe: headSha,
|
|
201
287
|
mergeSha,
|
|
202
288
|
// RM-037 (fatia 5, A1; aviso da rodada 1 do CHECK): a ponta conferida vai em campo proprio, como no PR local; a
|
|
203
289
|
// comparacao aceita `ahead`, e o recibo do Maestro confere o push contra ela.
|
|
204
290
|
pontaDaBase: ponta,
|
|
205
291
|
jaIncorporado: true,
|
|
206
|
-
remoto:
|
|
292
|
+
remoto: `${gitlab ? 'gitlab' : 'github'}:${repo}`,
|
|
207
293
|
shaRemoto: ponta,
|
|
208
294
|
pushVerificado: true,
|
|
209
|
-
|
|
295
|
+
// `identical`: o merge e a propria ponta, e a comparacao nem e consultada.
|
|
296
|
+
fonteDaProva: gitlab && comparacao === 'identical'
|
|
297
|
+
? `merge = ponta de ${base} por glab api ${(0, pedidos_1.projetoNaApi)(repo)}/repository/branches/${encodeURIComponent(base)}`
|
|
298
|
+
: gitlab
|
|
299
|
+
? `glab api ${(0, pedidos_1.projetoNaApi)(repo)}/repository/compare?from=${ponta}&to=${mergeSha}&straight=false (status ${comparacao}; ponta de ${base} por glab api ${(0, pedidos_1.projetoNaApi)(repo)}/repository/branches/${encodeURIComponent(base)})`
|
|
300
|
+
: `gh api repos/${repo}/compare/${mergeSha}...${ponta} (status ${comparacao}; ponta de ${base} por gh api repos/${repo}/branches/${base})`,
|
|
210
301
|
autorizadoPor: ci ? 'merge de PR com o CI independente verde no SHA exato' : 'merge de PR em repositorio externo declarado sem CI no manifesto',
|
|
211
302
|
tipoDeAutorizacao: 'pr-externo',
|
|
212
303
|
modo: thread.modo,
|
|
@@ -216,19 +307,28 @@ function registrarEntregaExternaPorPr(carregado, threadId, opcoes) {
|
|
|
216
307
|
avancarParaShip(raiz, threadId);
|
|
217
308
|
if (opcoes.publicar !== false)
|
|
218
309
|
(0, fabrica_publicar_1.publicarEmSegundoPlano)(raiz);
|
|
219
|
-
return resultado(threadId, 'registrou', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistrou(mergeSha.slice(0, 7), n, repo)), { mergeSha, headSha, ci });
|
|
310
|
+
return resultado(threadId, 'registrou', (0, locale_1.textoDoCatalogo)((m) => m.ship.prExternoRegistrou(mergeSha.slice(0, 7), n, repo, !!gitlab)), { mergeSha, headSha, ci });
|
|
220
311
|
}
|
|
221
312
|
/** `ork ship registrar-pr --todas`: toda thread aberta que ja tem merge `ship(<thread>)` na base. */
|
|
222
313
|
function registrarEntregasPorPr(carregado, opcoes = {}) {
|
|
223
314
|
const remoto = (0, branch_de_estado_1.exigirRemoto)(opcoes.remoto ?? 'origin', 'ship');
|
|
224
315
|
const base = carregado.manifesto.worktree.base_branch;
|
|
225
|
-
(0, util_1.exec)('git', ['fetch', '-q', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], carregado.raiz);
|
|
226
|
-
const
|
|
227
|
-
|
|
316
|
+
const busca = (0, util_1.exec)('git', ['fetch', '-q', '--', remoto, `+refs/heads/${base}:refs/remotes/${remoto}/${base}`], carregado.raiz);
|
|
317
|
+
const abertas = (0, thread_1.listarIds)(carregado.raiz).filter((id) => (0, thread_1.lerThread)(carregado.raiz, id).status !== 'fechada');
|
|
318
|
+
// Sem leitura do remoto nao ha como saber quais threads tem merge: uma recusa por thread aberta, nunca lista vazia.
|
|
319
|
+
if (!busca.ok) {
|
|
320
|
+
return abertas.map((id) => resultado(id, 'recusada', (0, locale_1.textoDoCatalogo)((m) => m.ship.prSemLeitura(remoto, base)), { codigo: 'entrega.sem-leitura' }));
|
|
321
|
+
}
|
|
322
|
+
// RM-058, integracao (T1.1): os arcos lidos uma vez para o lote; a thread do arco e pulada com o motivo, e as outras seguem.
|
|
323
|
+
const arcos = (0, noctum_guarda_1.lerArcosDaRaiz)(carregado.raiz);
|
|
324
|
+
const r = abertas
|
|
228
325
|
.filter((id) => mergeDaEntrega(carregado.raiz, id, remoto, base) !== null)
|
|
229
326
|
.map((id) => {
|
|
230
327
|
try {
|
|
231
|
-
|
|
328
|
+
const guarda = (0, noctum_guarda_1.guardaDaThread)(carregado.raiz, id, arcos.quando, { arcos });
|
|
329
|
+
if (guarda)
|
|
330
|
+
return resultado(id, 'pulada', guarda.texto, { codigo: guarda.motivo });
|
|
331
|
+
return registrarEntregaPorPr(carregado, id, { ...opcoes, buscar: false, publicar: false, arcos });
|
|
232
332
|
}
|
|
233
333
|
catch (e) {
|
|
234
334
|
return resultado(id, 'recusada', e instanceof locale_1.ErroDoCatalogo ? (0, locale_1.textoDoCatalogo)(e.montar) : e.message);
|
package/dist/esgotamentos.js
CHANGED
|
@@ -63,9 +63,10 @@ const projeto_alvo_1 = require("./projeto-alvo");
|
|
|
63
63
|
const runtime_profiles_1 = require("./runtime-profiles");
|
|
64
64
|
const thread_1 = require("./thread");
|
|
65
65
|
const util_1 = require("./util");
|
|
66
|
+
const locale_1 = require("./locale");
|
|
66
67
|
exports.CONTRATO_ESGOTAMENTOS = 'ork.esgotamentos/v1';
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
/** O limite que o `--json` leva: dado, sempre em pt-BR (RM-061, F3b: o texto mora no catalogo). */
|
|
69
|
+
exports.LIMITE_DO_RELATORIO = (0, locale_1.msg)('pt-BR').accounts.limiteDoRelatorio;
|
|
69
70
|
exports.NAO_REGISTRADO = 'nao registrado';
|
|
70
71
|
function contaOpaca(chave) {
|
|
71
72
|
return (0, node_crypto_1.createHash)('sha256').update(chave).digest('hex').slice(0, 12);
|
|
@@ -160,22 +161,23 @@ function relatorioDeEsgotamentos(opcoes = {}) {
|
|
|
160
161
|
}
|
|
161
162
|
/** Texto para o terminal, com o horario do dono e o fuso uma vez no fim. */
|
|
162
163
|
function textoDosEsgotamentos(r) {
|
|
164
|
+
// RM-061 (F3b): o texto pelo catalogo; o estado da marca so se traduz aqui, e o limite do `--json` (pt-BR) sai no locale.
|
|
165
|
+
const t = (0, locale_1.msg)().accounts;
|
|
163
166
|
const linhas = [
|
|
164
|
-
|
|
165
|
-
|
|
167
|
+
t.esgotamentosTitulo((0, horario_1.formatarDataHora)(r.periodo.desde), (0, horario_1.formatarDataHora)(r.periodo.ate), r.periodo.intervalo),
|
|
168
|
+
t.marcasVivas(r.marcas.length),
|
|
166
169
|
];
|
|
167
170
|
for (const m of r.marcas) {
|
|
168
|
-
|
|
169
|
-
linhas.push(` conta ${m.conta} ${m.runtime} ${m.estado} desde ${(0, horario_1.formatarDataHora)(m.em)}, ${ate} visto em ${m.projeto} (${m.motivo})`);
|
|
171
|
+
linhas.push(t.marca(m.conta, m.runtime, t.estado(m.estado), (0, horario_1.formatarDataHora)(m.em), m.estado === 'esgotado' ? (0, horario_1.formatarDataHora)(m.esgotadoAte) : null, m.projeto, m.motivo));
|
|
170
172
|
}
|
|
171
|
-
linhas.push(
|
|
172
|
-
: r.projetos.map((p) =>
|
|
173
|
-
linhas.push(
|
|
173
|
+
linhas.push(t.projetosLidos(r.projetos.length === 0 ? null
|
|
174
|
+
: r.projetos.map((p) => t.projetoLido(p.nome, p.presente ? p.despachosComPerfil : null)).join(', ')));
|
|
175
|
+
linhas.push(t.despachosMarcados(r.total));
|
|
174
176
|
if (r.despachos.length > 0) {
|
|
175
|
-
linhas.push((0, util_1.tabela)([
|
|
177
|
+
linhas.push((0, util_1.tabela)([...t.colunasDosDespachos], r.despachos.map((d) => [(0, horario_1.formatarDataHora)(d.em), d.projeto, d.thread, d.fase ?? '-', d.perfil, d.conta, d.marcadaPor]))
|
|
176
178
|
.split('\n').map((l) => ` ${l}`).join('\n'));
|
|
177
179
|
}
|
|
178
|
-
linhas.push(
|
|
180
|
+
linhas.push(t.limite(r.limite === exports.LIMITE_DO_RELATORIO ? t.limiteDoRelatorio : r.limite));
|
|
179
181
|
linhas.push((0, horario_1.legendaDoFuso)());
|
|
180
182
|
return linhas.join('\n');
|
|
181
183
|
}
|
package/dist/estado-thread.js
CHANGED
|
@@ -44,6 +44,7 @@ const fs = __importStar(require("node:fs"));
|
|
|
44
44
|
const path = __importStar(require("node:path"));
|
|
45
45
|
const node_crypto_1 = require("node:crypto");
|
|
46
46
|
const util_1 = require("./util");
|
|
47
|
+
const locale_1 = require("./locale");
|
|
47
48
|
function raizDoEstado(raiz) {
|
|
48
49
|
const local = path.resolve(raiz);
|
|
49
50
|
const git = path.join(local, '.git');
|
|
@@ -51,7 +52,7 @@ function raizDoEstado(raiz) {
|
|
|
51
52
|
return local;
|
|
52
53
|
const match = /^gitdir: (.+)\s*$/m.exec(fs.readFileSync(git, 'utf8'));
|
|
53
54
|
if (!match)
|
|
54
|
-
throw new
|
|
55
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.gitInvalido(local));
|
|
55
56
|
const gitdir = path.resolve(local, match[1].trim());
|
|
56
57
|
const commondir = path.join(gitdir, 'commondir');
|
|
57
58
|
if (!fs.existsSync(commondir))
|
|
@@ -60,13 +61,13 @@ function raizDoEstado(raiz) {
|
|
|
60
61
|
const principal = path.dirname(comum);
|
|
61
62
|
if (!fs.existsSync(path.join(principal, '.git')) ||
|
|
62
63
|
fs.realpathSync(path.join(principal, '.git')) !== fs.realpathSync(comum)) {
|
|
63
|
-
throw new
|
|
64
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.arvorePrincipal(comum));
|
|
64
65
|
}
|
|
65
66
|
return principal;
|
|
66
67
|
}
|
|
67
68
|
function estadoCanonico(raiz, id) {
|
|
68
69
|
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(id))
|
|
69
|
-
throw new
|
|
70
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.idInvalido);
|
|
70
71
|
const principal = raizDoEstado(raiz);
|
|
71
72
|
exigirEstadoSemLink(principal, ['.orkastery', 'threads', id]);
|
|
72
73
|
return path.join(principal, '.orkastery', 'threads', id);
|
|
@@ -85,8 +86,8 @@ function exigirEstadoSemLink(principal, componentes) {
|
|
|
85
86
|
if (!stat)
|
|
86
87
|
return;
|
|
87
88
|
if (stat.isSymbolicLink()) {
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
const rel = path.relative(principal, atual);
|
|
90
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.link(rel));
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
}
|
|
@@ -97,11 +98,11 @@ function arquivos(dir, prefixo = '') {
|
|
|
97
98
|
return fs.readdirSync(path.join(dir, prefixo), { withFileTypes: true }).flatMap(e => {
|
|
98
99
|
const nome = path.join(prefixo, e.name);
|
|
99
100
|
if (e.isSymbolicLink())
|
|
100
|
-
throw new
|
|
101
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.legadoComLink(nome));
|
|
101
102
|
if (e.isDirectory())
|
|
102
103
|
return arquivos(dir, nome);
|
|
103
104
|
if (!e.isFile())
|
|
104
|
-
throw new
|
|
105
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.legadoEspecial(nome));
|
|
105
106
|
return [nome];
|
|
106
107
|
});
|
|
107
108
|
}
|
|
@@ -122,18 +123,18 @@ function vincularEstado(raiz, id, worktree, dryRun = false) {
|
|
|
122
123
|
if (path.resolve(local) === alvo)
|
|
123
124
|
return;
|
|
124
125
|
if (raizDoEstado(worktree) !== raizDoEstado(raiz))
|
|
125
|
-
throw new
|
|
126
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.foraDaArvore);
|
|
126
127
|
// O índice é próprio da linked worktree. A main continua versionando seu estado.
|
|
127
128
|
const rastreados = (0, util_1.exec)('git', ['ls-files', '-z', '--', `.orkastery/threads/${id}/`], worktree);
|
|
128
129
|
if (!rastreados.ok)
|
|
129
|
-
throw new
|
|
130
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.indiceIndisponivel(rastreados.stderr));
|
|
130
131
|
const nomes = rastreados.stdout.split('\0').filter(Boolean);
|
|
131
132
|
const prepararIndice = () => {
|
|
132
133
|
if (dryRun || nomes.length === 0)
|
|
133
134
|
return;
|
|
134
135
|
const r = (0, util_1.exec)('git', ['update-index', '--skip-worktree', '--', ...nomes], worktree);
|
|
135
136
|
if (!r.ok)
|
|
136
|
-
throw new
|
|
137
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.naoPreservou(r.stderr));
|
|
137
138
|
};
|
|
138
139
|
if (mesmoArquivo(local, alvo)) {
|
|
139
140
|
prepararIndice();
|
|
@@ -144,11 +145,11 @@ function vincularEstado(raiz, id, worktree, dryRun = false) {
|
|
|
144
145
|
const copiar = [];
|
|
145
146
|
const existe = fs.existsSync(local);
|
|
146
147
|
if (!existe && fs.lstatSync(path.dirname(local), { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
147
|
-
throw new
|
|
148
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.threadsVinculado);
|
|
148
149
|
}
|
|
149
150
|
if (existe) {
|
|
150
151
|
if (fs.lstatSync(local).isSymbolicLink())
|
|
151
|
-
throw new
|
|
152
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.linkOutroDestino(local));
|
|
152
153
|
for (const nome of arquivos(local)) {
|
|
153
154
|
const destino = path.join(alvo, nome);
|
|
154
155
|
if (!fs.existsSync(destino)) {
|
|
@@ -162,11 +163,11 @@ function vincularEstado(raiz, id, worktree, dryRun = false) {
|
|
|
162
163
|
// Prefixo JSONL já incorporado na main não é conflito nem deve ser duplicado.
|
|
163
164
|
if (nome.endsWith('.jsonl') && a.toString().endsWith('\n') && b.subarray(0, a.length).equals(a))
|
|
164
165
|
continue;
|
|
165
|
-
throw new
|
|
166
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.dividido(nome, local, alvo));
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
169
|
else if (fs.lstatSync(local, { throwIfNoEntry: false })) {
|
|
169
|
-
throw new
|
|
170
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.linkQuebrado(local));
|
|
170
171
|
}
|
|
171
172
|
// O ensaio executa o mesmo preflight, sem tocar em arquivos ou no índice.
|
|
172
173
|
if (dryRun)
|
|
@@ -200,7 +201,7 @@ function comEstadoParaGit(raiz, id, worktree, executar) {
|
|
|
200
201
|
const git = (args) => {
|
|
201
202
|
const r = (0, util_1.exec)('git', args, worktree);
|
|
202
203
|
if (!r.ok)
|
|
203
|
-
throw new
|
|
204
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.preparacaoFalhou(r.stderr || r.stdout));
|
|
204
205
|
return r.stdout;
|
|
205
206
|
};
|
|
206
207
|
const nomes = git(['ls-files', '-z', '--', prefixo]).split('\0').filter(Boolean);
|
|
@@ -220,7 +221,7 @@ function comEstadoParaGit(raiz, id, worktree, executar) {
|
|
|
220
221
|
const mudou = materializado && (!(0, util_1.exec)('git', ['diff', '--quiet', '--', prefixo], worktree).ok ||
|
|
221
222
|
git(['ls-files', '--others', '--', prefixo]).trim() !== '');
|
|
222
223
|
if (mudou)
|
|
223
|
-
throw new
|
|
224
|
+
throw new locale_1.ErroDoCatalogo((m) => m.estado.alteradoDuranteGit(local));
|
|
224
225
|
if (fs.existsSync(local)) {
|
|
225
226
|
const backup = path.join(raizDoEstado(raiz), '.orkastery', 'state-backups', `${id}-git-${(0, node_crypto_1.randomUUID)()}`);
|
|
226
227
|
fs.mkdirSync(path.dirname(backup), { recursive: true });
|
|
@@ -238,7 +239,9 @@ function auditarEstado(raiz, id, worktree) {
|
|
|
238
239
|
return fs.existsSync(file) ? fs.readFileSync(file, 'utf8').split('\n').filter(Boolean).length : 0;
|
|
239
240
|
};
|
|
240
241
|
const ok = mesmoArquivo(main, local);
|
|
242
|
+
// RM-061 (F3b, G4): o detalhe vai ao ledger do audit em pt-BR (escopo da gravacao) e a impressao o remonta.
|
|
243
|
+
const eventosMain = contar(main), eventosLocal = contar(local);
|
|
241
244
|
return { nome: 'estado-unico', nivel: ok ? 'ok' : 'fail',
|
|
242
|
-
detalhe:
|
|
243
|
-
...(ok ? {} : { correcao:
|
|
245
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.estado.estadoUnico(ok, eventosMain, eventosLocal, main)),
|
|
246
|
+
...(ok ? {} : { correcao: (0, locale_1.textoDoCatalogo)((m) => m.estado.estadoUnicoCorrecao(id)) }) };
|
|
244
247
|
}
|