@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,183 @@
|
|
|
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.argvDoItem = argvDoItem;
|
|
37
|
+
exports.esperaDoGrupo = esperaDoGrupo;
|
|
38
|
+
exports.rodarEmParalelo = rodarEmParalelo;
|
|
39
|
+
/**
|
|
40
|
+
* RM-072 (D6 da ork-check5x): o grupo paralelo do Agile Check sem mudar a assinatura do `verificar`.
|
|
41
|
+
*
|
|
42
|
+
* O `verificar` e sincrono e tem varios chamadores (CLI, MCP, ship, fix, retry, ci, noctum). Para rodar as lanes de teste
|
|
43
|
+
* e a varredura ao mesmo tempo, o verify chama este modulo com `spawnSync` como processo auxiliar: ele lanca cada
|
|
44
|
+
* comando ao mesmo tempo, cada um com o mesmo `timeout(1)` do `executar` (o estouro leva o grupo de processos inteiro),
|
|
45
|
+
* grava a saida de cada um num arquivo e espera todos. O pai le os arquivos e monta cada resultado pela mesma funcao do
|
|
46
|
+
* `executar`. O ambiente vem do pai, ja sem `ORK_HITL_*`; cada item so acrescenta variaveis sem segredo (o modo, o
|
|
47
|
+
* relatorio do CHECK, o prazo interno do scan). O item que nomeia outros em `apos` so comeca quando eles terminam (a lane
|
|
48
|
+
* de integracao depois da varredura), e `maxParalelo` limita quantos rodam ao mesmo tempo.
|
|
49
|
+
*/
|
|
50
|
+
const node_child_process_1 = require("node:child_process");
|
|
51
|
+
const fs = __importStar(require("node:fs"));
|
|
52
|
+
const os = __importStar(require("node:os"));
|
|
53
|
+
const path = __importStar(require("node:path"));
|
|
54
|
+
const TIMEOUT_BIN = '/usr/bin/timeout';
|
|
55
|
+
const NICE_BIN = '/usr/bin/nice';
|
|
56
|
+
/** O argv de um item: `nice` (se pedido e existir), `timeout(1)` (se existir) e `bash -c`. */
|
|
57
|
+
function argvDoItem(item, comGrupo = fs.existsSync(TIMEOUT_BIN), comNice = fs.existsSync(NICE_BIN)) {
|
|
58
|
+
const base = comGrupo
|
|
59
|
+
? [TIMEOUT_BIN, '--kill-after=15', `${Math.ceil(item.prazoMs / 1000)}`, 'bash', '-c', item.comando]
|
|
60
|
+
: ['bash', '-c', item.comando];
|
|
61
|
+
return item.nice && comNice ? [NICE_BIN, '-n', String(item.nice), ...base] : base;
|
|
62
|
+
}
|
|
63
|
+
/** As vagas do grupo: no maximo `max` comandos ao mesmo tempo, na ordem em que pediram. */
|
|
64
|
+
function vagas(max) {
|
|
65
|
+
let livres = max;
|
|
66
|
+
const fila = [];
|
|
67
|
+
return {
|
|
68
|
+
tomar: () => new Promise((pronto) => { if (livres > 0) {
|
|
69
|
+
livres--;
|
|
70
|
+
pronto();
|
|
71
|
+
}
|
|
72
|
+
else
|
|
73
|
+
fila.push(pronto); }),
|
|
74
|
+
soltar: () => { const proximo = fila.shift(); if (proximo)
|
|
75
|
+
proximo();
|
|
76
|
+
else
|
|
77
|
+
livres++; },
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* O lado do auxiliar: lanca cada item quando os de `apos` terminam e ha vaga, espera todos e grava `resultado.json` ao
|
|
82
|
+
* lado das saidas.
|
|
83
|
+
*/
|
|
84
|
+
async function rodarEspecificacao(esp) {
|
|
85
|
+
const comGrupo = fs.existsSync(TIMEOUT_BIN);
|
|
86
|
+
const limite = vagas(esp.maxParalelo && esp.maxParalelo > 0 ? esp.maxParalelo : esp.itens.length);
|
|
87
|
+
const porNome = new Map();
|
|
88
|
+
const terminados = await Promise.all(esp.itens.map((item, i) => {
|
|
89
|
+
const vez = (async () => {
|
|
90
|
+
for (const nome of item.apos ?? [])
|
|
91
|
+
await porNome.get(nome);
|
|
92
|
+
await limite.tomar();
|
|
93
|
+
try {
|
|
94
|
+
return await lancar(item, i);
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
limite.soltar();
|
|
98
|
+
}
|
|
99
|
+
})();
|
|
100
|
+
porNome.set(item.nome, vez);
|
|
101
|
+
return vez;
|
|
102
|
+
}));
|
|
103
|
+
fs.writeFileSync(path.join(esp.dir, 'resultado.json'), JSON.stringify(terminados), { mode: 0o600 });
|
|
104
|
+
function lancar(item, i) {
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
const saida = fs.openSync(path.join(esp.dir, `${i}.out`), 'w', 0o600);
|
|
107
|
+
const erro = fs.openSync(path.join(esp.dir, `${i}.err`), 'w', 0o600);
|
|
108
|
+
const inicio = Date.now();
|
|
109
|
+
const [bin, ...args] = argvDoItem(item, comGrupo);
|
|
110
|
+
let fim = null;
|
|
111
|
+
const encerrar = (t) => {
|
|
112
|
+
if (fim)
|
|
113
|
+
return;
|
|
114
|
+
fim = t;
|
|
115
|
+
fs.closeSync(saida);
|
|
116
|
+
fs.closeSync(erro);
|
|
117
|
+
resolve(t);
|
|
118
|
+
};
|
|
119
|
+
// Sem o `timeout(1)`, o proprio auxiliar mata pelo prazo, como o `spawnSync` do `exec` faria.
|
|
120
|
+
const filho = (0, node_child_process_1.spawn)(bin, args, { cwd: item.cwd, env: { ...process.env, ...item.ambiente }, stdio: ['ignore', saida, erro],
|
|
121
|
+
...(comGrupo ? {} : { timeout: item.prazoMs, killSignal: 'SIGTERM' }) });
|
|
122
|
+
filho.on('error', (e) => encerrar({ nome: item.nome, code: null, signal: null,
|
|
123
|
+
error: e.code ?? e.message, duracaoMs: Date.now() - inicio, comGrupo }));
|
|
124
|
+
filho.on('close', (code, signal) => encerrar({ nome: item.nome, code, signal,
|
|
125
|
+
...(!comGrupo && signal && Date.now() - inicio >= item.prazoMs ? { error: 'ETIMEDOUT' } : {}),
|
|
126
|
+
duracaoMs: Date.now() - inicio, comGrupo }));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* A espera do grupo inteiro: o maior prazo, ou a soma deles quando ha fila (item com `apos` ou vagas a menos que itens),
|
|
132
|
+
* que e o teto do pior caso.
|
|
133
|
+
*/
|
|
134
|
+
function esperaDoGrupo(itens, maxParalelo) {
|
|
135
|
+
const comFila = itens.some((i) => i.apos?.length) || (!!maxParalelo && maxParalelo < itens.length);
|
|
136
|
+
return comFila ? itens.reduce((t, i) => t + i.prazoMs, 0) : Math.max(...itens.map((i) => i.prazoMs));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* O lado do pai: roda o grupo pelo auxiliar e devolve cada processo, na ordem dos itens. A espera e a do grupo
|
|
140
|
+
* (`esperaDoGrupo`), com folga para o `--kill-after` e para o auxiliar gravar; o diretorio das saidas some no fim.
|
|
141
|
+
*/
|
|
142
|
+
function rodarEmParalelo(itens, ambiente = process.env, opcoes = {}) {
|
|
143
|
+
if (itens.length === 0)
|
|
144
|
+
return [];
|
|
145
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ork-check-paralelo-'));
|
|
146
|
+
try {
|
|
147
|
+
const especificacao = path.join(dir, 'especificacao.json');
|
|
148
|
+
const esp = { itens, dir, ...(opcoes.maxParalelo ? { maxParalelo: opcoes.maxParalelo } : {}) };
|
|
149
|
+
fs.writeFileSync(especificacao, JSON.stringify(esp), { mode: 0o600 });
|
|
150
|
+
const prazo = esperaDoGrupo(itens, opcoes.maxParalelo) + 60_000;
|
|
151
|
+
const r = (0, node_child_process_1.spawnSync)(process.execPath, [__filename, especificacao], { env: ambiente, encoding: 'utf8', timeout: prazo,
|
|
152
|
+
killSignal: 'SIGKILL' });
|
|
153
|
+
let terminados = [];
|
|
154
|
+
try {
|
|
155
|
+
terminados = JSON.parse(fs.readFileSync(path.join(dir, 'resultado.json'), 'utf8'));
|
|
156
|
+
}
|
|
157
|
+
catch { /* abaixo */ }
|
|
158
|
+
return itens.map((item, i) => {
|
|
159
|
+
const t = terminados[i];
|
|
160
|
+
const ler = (sufixo) => { try {
|
|
161
|
+
return fs.readFileSync(path.join(dir, `${i}.${sufixo}`), 'utf8');
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return '';
|
|
165
|
+
} };
|
|
166
|
+
if (!t) {
|
|
167
|
+
// O auxiliar morreu antes de gravar: o comando nao tem veredito, e a causa vai junto.
|
|
168
|
+
const motivo = r.error ? r.error.code ?? r.error.message : `auxiliar saiu ${r.status ?? r.signal}`;
|
|
169
|
+
return { nome: item.nome, ok: false, code: -1, signal: r.signal ?? null, error: motivo, stdout: ler('out'),
|
|
170
|
+
stderr: `${ler('err')}${r.stderr ?? ''}`, duracaoMs: 0, comGrupo: fs.existsSync(TIMEOUT_BIN), semResultado: true };
|
|
171
|
+
}
|
|
172
|
+
return { nome: item.nome, ok: t.code === 0, code: t.code ?? -1, signal: t.signal, ...(t.error ? { error: t.error } : {}),
|
|
173
|
+
stdout: ler('out'), stderr: ler('err'), duracaoMs: t.duracaoMs, comGrupo: t.comGrupo };
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (require.main === module) {
|
|
181
|
+
const esp = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
|
|
182
|
+
rodarEspecificacao(esp).then(() => process.exit(0), (e) => { process.stderr.write(`check-paralelo: ${e.message}\n`); process.exit(1); });
|
|
183
|
+
}
|
package/dist/ci.js
CHANGED
|
@@ -36,10 +36,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.BUNDLE_LEGADO = exports.DIR_DO_BUNDLE = void 0;
|
|
37
37
|
exports.motivoDiferimentoCi = motivoDiferimentoCi;
|
|
38
38
|
exports.repositorioGitHub = repositorioGitHub;
|
|
39
|
+
exports.loginDoGh = loginDoGh;
|
|
40
|
+
exports.ciNaoExigida = ciNaoExigida;
|
|
39
41
|
exports.consultarCi = consultarCi;
|
|
40
42
|
exports.consultarCiDoRepositorio = consultarCiDoRepositorio;
|
|
43
|
+
exports.consultarCiNaForja = consultarCiNaForja;
|
|
41
44
|
exports.executarCi = executarCi;
|
|
42
45
|
exports.arquivoDoBundle = arquivoDoBundle;
|
|
46
|
+
exports.comandosDoBundle = comandosDoBundle;
|
|
43
47
|
exports.lintDoBundle = lintDoBundle;
|
|
44
48
|
exports.destinoDoBundle = destinoDoBundle;
|
|
45
49
|
exports.prepararBundleCi = prepararBundleCi;
|
|
@@ -47,9 +51,22 @@ exports.bundleDaBranch = bundleDaBranch;
|
|
|
47
51
|
exports.executarCiDaBranch = executarCiDaBranch;
|
|
48
52
|
exports.executarBundleCi = executarBundleCi;
|
|
49
53
|
/** GitHub CI como CHECK independente (I-12). */
|
|
54
|
+
const ambiente_de_ci_1 = require("./forja/ambiente-de-ci");
|
|
55
|
+
const endereco_1 = require("./forja/endereco");
|
|
56
|
+
const forja_1 = require("./forja");
|
|
57
|
+
const cli_1 = require("./forja/cli");
|
|
58
|
+
const api_1 = require("./forja/api");
|
|
59
|
+
const versao_1 = require("./forja/versao");
|
|
60
|
+
const resolver_1 = require("./forja/resolver");
|
|
61
|
+
const cache_1 = require("./forja/cache");
|
|
50
62
|
const branch_de_estado_1 = require("./branch-de-estado");
|
|
51
63
|
const util_1 = require("./util");
|
|
64
|
+
const executor_1 = require("./forja/executor");
|
|
65
|
+
const estado_1 = require("./forja/estado");
|
|
66
|
+
const produtor_1 = require("./forja/produtor");
|
|
67
|
+
const registro_1 = require("./forja/registro");
|
|
52
68
|
const worktree_1 = require("./worktree");
|
|
69
|
+
const procedencia_1 = require("./procedencia");
|
|
53
70
|
const verify_1 = require("./verify");
|
|
54
71
|
const verify_2 = require("./verify");
|
|
55
72
|
const claims_1 = require("./claims");
|
|
@@ -59,6 +76,11 @@ const claim_lint_1 = require("./claim-lint");
|
|
|
59
76
|
const integracoes_locais_1 = require("./integracoes-locais");
|
|
60
77
|
const ledger_1 = require("./ledger");
|
|
61
78
|
const thread_1 = require("./thread");
|
|
79
|
+
const locale_1 = require("./locale");
|
|
80
|
+
const dado_privado_1 = require("./dado-privado");
|
|
81
|
+
const policies_1 = require("./policies");
|
|
82
|
+
/** O comeco de todo retrato da CI exigida; `fonte` e `produtor` so com check decisivo. */
|
|
83
|
+
const baseDaCi = (provider, repository, sha, context) => ({ schema: 'ork.ci-status/v2', required: true, provider, repository, sha, context, fonte: null, produtor: null });
|
|
62
84
|
const MARCADORES_DE_HOST = [
|
|
63
85
|
/(^|[\s;&|])\/home\//,
|
|
64
86
|
/(^|[\s;&|])localhost(?=[:/\s;&|]|$)/,
|
|
@@ -125,61 +147,206 @@ function motivoDiferimentoCi(claim, raiz) {
|
|
|
125
147
|
return null;
|
|
126
148
|
}
|
|
127
149
|
function repositorioGitHub(url) {
|
|
128
|
-
const
|
|
129
|
-
return
|
|
150
|
+
const e = (0, endereco_1.lerEnderecoDoRemoto)(url);
|
|
151
|
+
return e && (e.host === 'github.com' || e.host === 'ssh.github.com') && e.caminho.split('/').length === 2 ? e.caminho : null;
|
|
152
|
+
}
|
|
153
|
+
/** O host da API para o gh: `--hostname host`, ou `GH_HOST=host:porta` (o gh recusa `--hostname` com porta). */
|
|
154
|
+
function hostDoGh(host) {
|
|
155
|
+
return host.includes(':') ? { args: [], acrescentar: { GH_HOST: host } } : { args: ['--hostname', host] };
|
|
130
156
|
}
|
|
131
157
|
function executorPadrao(input) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
158
|
+
// 32 MiB, o teto do `forja.ts`: uma pagina de 100 check-runs passa de 1 MiB com facilidade.
|
|
159
|
+
const h = hostDoGh(input.host ?? 'github.com');
|
|
160
|
+
const r = (0, executor_1.rodarCli)({ cmd: 'gh', args: ['api', ...h.args, input.caminho ?? `repos/${input.repository}/commits/${input.sha}/check-runs`,
|
|
161
|
+
'-H', 'Accept: application/vnd.github+json'], prazoMs: 120000, maxBuffer: 32 * 1024 * 1024, acrescentar: h.acrescentar });
|
|
162
|
+
return { ok: r.status === 0, code: r.status ?? -1, stdout: r.stdout, stderr: r.stderr };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* O `gh` tem login no host exato (`host` ou `host:porta`)? So o github.com dispensa a pergunta. Com porta o
|
|
166
|
+
* `auth status` roda sem `--hostname` e sai 0 se QUALQUER host tem login: o `temLogin` confere a linha do host exato.
|
|
167
|
+
*/
|
|
168
|
+
function loginDoGh(host, rodar) {
|
|
169
|
+
const m = /^(.+?)(?::(\d+))?$/.exec(host);
|
|
170
|
+
return (0, api_1.temLogin)({ tipo: 'github', host: m ? m[1] : host, porta: m?.[2] ? Number(m[2]) : null, caminhoBase: '', ca: null }, rodar);
|
|
171
|
+
}
|
|
172
|
+
const loginPadrao = (host) => loginDoGh(host);
|
|
173
|
+
/**
|
|
174
|
+
* A forja do remoto: o repositorio e o host saem de UM parse do remoto (`lerEnderecoDoRemoto`) e da forja resolvida (o
|
|
175
|
+
* bloco `forja:`, o host conhecido ou a sondagem pela CLI com login no host), sem host de reserva: o caminho nunca e
|
|
176
|
+
* consultado num host que o remoto ou o manifesto nao nomeiam. O nome do host nao decide o tipo. No GitHub o
|
|
177
|
+
* repositorio e `dono/nome`; no GitLab, o caminho inteiro, com subgrupos. `ssh.github.com` (SSH pela 443) e o
|
|
178
|
+
* github.com; a porta de um remoto SSH nao e a da API.
|
|
179
|
+
*/
|
|
180
|
+
function alvoDaCi(carregado, remoto, url, sondas) {
|
|
181
|
+
const naoReconhecido = () => ({ ok: false, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciRemotoNaoGithub(remoto)) });
|
|
182
|
+
const endereco = (0, endereco_1.lerEnderecoDoRemoto)(url.trim());
|
|
183
|
+
if (!endereco)
|
|
184
|
+
return naoReconhecido();
|
|
185
|
+
// O tipo sondado fica 24 h no cache da raiz: um GHE sem bloco `forja:` nao paga as sondas a cada consulta.
|
|
186
|
+
const forja = (0, resolver_1.resolverForja)({ endereco, manifesto: carregado.manifesto.forja, sondas, cache: (0, cache_1.dirDoCacheDaForja)(carregado.raiz) });
|
|
187
|
+
if (!forja.ok)
|
|
188
|
+
return { ok: false, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciForjaNaoResolvida(remoto, m.forja.motivo(forja.erro, null))) };
|
|
189
|
+
if (forja.valor.tipo === 'github' && forja.valor.repo.split('/').length !== 2)
|
|
190
|
+
return naoReconhecido();
|
|
191
|
+
return { ok: true, forja: forja.valor };
|
|
192
|
+
}
|
|
193
|
+
/** O resultado da CI quando o projeto nao a exige (`ci.required_for_ship: false`): nada e consultado na forja. */
|
|
194
|
+
function ciNaoExigida(carregado, sha) {
|
|
195
|
+
const context = carregado.manifesto.ci.context || 'ork-verify';
|
|
196
|
+
return { ...baseDaCi(null, null, sha, context), required: false, ok: true, state: 'disabled', url: null,
|
|
197
|
+
detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciNaoExigidoDetalhe) };
|
|
136
198
|
}
|
|
137
|
-
function consultarCi(carregado, sha, remoto = 'origin', executor = executorPadrao) {
|
|
199
|
+
function consultarCi(carregado, sha, remoto = 'origin', executor = executorPadrao, loginNoHost = loginPadrao, sondas = resolver_1.SONDAS_PADRAO, api = {}) {
|
|
138
200
|
const { ci } = carregado.manifesto;
|
|
139
201
|
const context = ci.context || 'ork-verify';
|
|
202
|
+
const falha = (detalhe, provider = null) => ({ ...baseDaCi(provider, null, sha, context), ok: false, state: 'unavailable', url: null, detail: detalhe });
|
|
140
203
|
if (!ci.required_for_ship)
|
|
141
|
-
return
|
|
204
|
+
return ciNaoExigida(carregado, sha);
|
|
142
205
|
// RM-047: o `--remoto` do `ork ci status` vem da linha de comando; so nome de remoto chega ao git.
|
|
143
206
|
const remote = (0, util_1.exec)('git', ['remote', 'get-url', '--', (0, branch_de_estado_1.exigirRemoto)(remoto, 'ci')], carregado.raiz);
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
207
|
+
const alvo = remote.ok ? alvoDaCi(carregado, remoto, remote.stdout, sondas)
|
|
208
|
+
: { ok: false, detalhe: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciRemotoNaoGithub(remoto)) };
|
|
209
|
+
if (!alvo.ok)
|
|
210
|
+
return falha(alvo.detalhe);
|
|
211
|
+
const { forja } = alvo;
|
|
212
|
+
const produtores = (0, produtor_1.produtoresAceitos)(carregado.manifesto, forja.tipo);
|
|
213
|
+
// Fora do GitHub, a CI vai pela API da CLI logada (`chamarApi`), que confere o login no host antes da primeira chamada.
|
|
214
|
+
if (forja.tipo !== 'github')
|
|
215
|
+
return consultarCiNaForja(forja, sha, context, produtores, { api, cache: (0, cache_1.dirDoCacheDaForja)(carregado.raiz) });
|
|
216
|
+
// Fronteira de confianca: so o github.com e consultado sem pergunta; outro host so com login do `gh` nele.
|
|
217
|
+
const host = (0, cli_1.hostDaApi)(forja);
|
|
218
|
+
if (host !== 'github.com' && !loginNoHost(host))
|
|
219
|
+
return falha((0, locale_1.textoDoCatalogo)((m) => m.ship.ciHostSemLogin(host)), 'github');
|
|
220
|
+
return consultarCiDoRepositorio(forja.repo, sha, context, executor, host, produtores);
|
|
148
221
|
}
|
|
149
222
|
/**
|
|
150
223
|
* O check `context` no `sha` de um repositorio GitHub ja resolvido: o do remoto do projeto ou, desde a
|
|
151
|
-
* RM-037 (rm037defeito, defeito 5), um repositorio externo declarado em `ci.external_repositories`.
|
|
224
|
+
* RM-037 (rm037defeito, defeito 5), um repositorio externo declarado em `ci.external_repositories`. So produtor de
|
|
225
|
+
* `produtores` (`ci.produtor`) aprova.
|
|
152
226
|
*/
|
|
153
|
-
function consultarCiDoRepositorio(repository, sha, context, executor = executorPadrao) {
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
payload = JSON.parse(result.stdout);
|
|
227
|
+
function consultarCiDoRepositorio(repository, sha, context, executor = executorPadrao, host = 'github.com', produtores = produtor_1.PRODUTORES_PADRAO.github) {
|
|
228
|
+
const base = baseDaCi('github', repository, sha, context);
|
|
229
|
+
const lido = (0, registro_1.exigirCapacidade)((0, registro_1.adaptadorDaForja)('github'), 'checksNoCommit')({ repository, sha, context, executor, host });
|
|
230
|
+
if (!lido.ok && lido.erro.codigo === 'forja.resposta-invalida') {
|
|
231
|
+
return { ...base, ok: false, state: 'unavailable', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => lido.erro.detalhe === 'incompleto'
|
|
232
|
+
? m.ship.ciIncompleto(context) : m.ship.ciRespostaInvalida) };
|
|
160
233
|
}
|
|
161
|
-
|
|
162
|
-
return {
|
|
234
|
+
if (!lido.ok)
|
|
235
|
+
return { ...base, ok: false, state: 'unavailable', url: null, detail: (0, forja_1.detalheSeguro)(lido.erro.detalhe || (0, locale_1.textoDoCatalogo)((m) => m.ship.ciConsultaFalhou)) };
|
|
236
|
+
return decidirCi(base, lido.valor, produtores, (m) => m.ship.ciVerde);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* O check `context` no `sha` pela API da forja ja resolvida (`estadoDeCi`): o GitLab do projeto ou, na entrega externa,
|
|
240
|
+
* o de um repositorio declarado. A versao abaixo do piso recusa antes de ler a CI. So produtor de `produtores` aprova; o
|
|
241
|
+
* check que so rodou em resultado mesclado sem vinculo com o `sha` nunca aprova (`ci.merged-results-sem-vinculo`).
|
|
242
|
+
*/
|
|
243
|
+
function consultarCiNaForja(forja, sha, context, produtores, o = {}) {
|
|
244
|
+
const base = baseDaCi(forja.tipo, forja.repo, sha, context);
|
|
245
|
+
const naoLida = (erro) => ({ ...base, ok: false, state: 'unavailable', url: null,
|
|
246
|
+
detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciLeituraFalhou(context, m.forja.motivo(erro, forja.tipo))) });
|
|
247
|
+
const ler = (0, registro_1.adaptadorDaForja)(forja.tipo).estadoDeCi;
|
|
248
|
+
if (!ler)
|
|
249
|
+
return naoLida({ codigo: 'forja.sem-capacidade', detalhe: `${forja.tipo}: estadoDeCi` });
|
|
250
|
+
const api = (0, api_1.chamadorDaApi)(forja, o.api);
|
|
251
|
+
const meta = (0, versao_1.lerMetadados)(forja, { cache: o.cache ?? null, api });
|
|
252
|
+
if (!meta.ok)
|
|
253
|
+
return naoLida(meta.erro);
|
|
254
|
+
const piso = (0, versao_1.recusaAbaixoDoPiso)(forja.tipo, meta.valor);
|
|
255
|
+
if (piso)
|
|
256
|
+
return naoLida(piso);
|
|
257
|
+
const lido = ler({ api, repo: forja.repo, sha, context, edicao: meta.valor.edicao });
|
|
258
|
+
if (!lido.ok)
|
|
259
|
+
return naoLida(lido.erro);
|
|
260
|
+
const decidido = decidirCi(base, lido.valor.checks, produtores, (m) => (forja.tipo === 'gitlab' ? m.ship.ciVerdeNoGitlab : m.ship.ciVerde));
|
|
261
|
+
if (lido.valor.mescladoSemVinculo && decidido.state !== 'failure' && decidido.state !== 'pending') {
|
|
262
|
+
return { ...base, ok: false, state: 'missing', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciMescladoSemVinculo(context, sha.slice(0, 8))) };
|
|
163
263
|
}
|
|
164
|
-
|
|
264
|
+
return decidido;
|
|
265
|
+
}
|
|
266
|
+
/** O motivo de um check bloqueado: a conclusao do check-run ou, sem ela, o estado do job (`manual`, `skipped`). */
|
|
267
|
+
const motivoDoBloqueio = (c) => c.conclusao ?? c.status;
|
|
268
|
+
/**
|
|
269
|
+
* A regra do gate sobre os checks lidos de qualquer forja. O mais novo de cada produtor conta. So produtor da lista
|
|
270
|
+
* aprova: o verde de quem esta fora dela e descartado; vermelho, pendente ou bloqueado de qualquer um continua contando
|
|
271
|
+
* (quem escreve status no repositorio pode atrasar o gate, nunca aprova-lo). Com varios, a combinacao e conservadora:
|
|
272
|
+
* vermelho ou bloqueado de qualquer um reprova; senao, pendente de qualquer um espera; so todos verdes passam. A fonte
|
|
273
|
+
* e o produtor do retrato sao os do check que decidiu.
|
|
274
|
+
*/
|
|
275
|
+
function decidirCi(base, checks, produtores, verde) {
|
|
276
|
+
const context = base.context;
|
|
165
277
|
if (!checks.length)
|
|
166
|
-
return {
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
278
|
+
return { ...base, ok: false, state: 'missing', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciSemCheck(context)) };
|
|
279
|
+
const escolhidos = maisNovoPorProdutor(checks);
|
|
280
|
+
const contam = escolhidos.filter((c) => (0, produtor_1.produtorAceito)(c, produtores) || (0, estado_1.estadoDoCheck)(c.fonte, c.status, c.conclusao) !== 'verde');
|
|
281
|
+
if (!contam.length) {
|
|
282
|
+
const descartados = escolhidos.map(nomeDoProdutor).join(', ');
|
|
283
|
+
return { ...base, ok: false, state: 'missing', url: null, detail: (0, locale_1.textoDoCatalogo)((m) => escolhidos.every((c) => c.fonte === 'commit-status')
|
|
284
|
+
? m.ship.ciStatusSemProdutorConfiavel(context) : m.ship.ciSemProdutorAceito(context, descartados, produtores.join(', '))) };
|
|
285
|
+
}
|
|
286
|
+
if (contam.length === 1) {
|
|
287
|
+
const check = contam[0];
|
|
288
|
+
const estado = (0, estado_1.estadoDoCheck)(check.fonte, check.status, check.conclusao);
|
|
289
|
+
const state = estadoNoGate(estado);
|
|
290
|
+
return { ...base, fonte: check.fonte, produtor: (0, produtor_1.produtorDeSaida)(check), ok: state === 'success', state, url: check.url || null,
|
|
291
|
+
...(estado === 'bloqueado' ? { bloqueado: true } : {}),
|
|
292
|
+
detail: (0, locale_1.textoDoCatalogo)((m) => state === 'success' ? verde(m) : estado === 'bloqueado' ? m.ship.ciBloqueado(context, motivoDoBloqueio(check))
|
|
293
|
+
: m.ship.ciEstado(context, String(check.status), check.conclusao ?? '')) };
|
|
294
|
+
}
|
|
295
|
+
const lidos = contam.map((check) => {
|
|
296
|
+
const estado = (0, estado_1.estadoDoCheck)(check.fonte, check.status, check.conclusao);
|
|
297
|
+
return { check, estado, state: estadoNoGate(estado) };
|
|
298
|
+
});
|
|
299
|
+
const state = lidos.some((l) => l.state === 'failure') ? 'failure' : lidos.some((l) => l.state === 'pending') ? 'pending' : 'success';
|
|
300
|
+
const decisivo = lidos.find((l) => l.state === state);
|
|
301
|
+
// O estado do ork por produtor, com o motivo do bloqueio.
|
|
302
|
+
const porProdutor = lidos.map((l) => `${nomeDoProdutor(l.check)} ${l.estado}${l.estado === 'bloqueado' ? ` (${motivoDoBloqueio(l.check)})` : ''}`).join(', ');
|
|
303
|
+
// Bloqueado so quando todo check que conta e verde ou bloqueado: pendente ou vermelho de qualquer um desfaz a marca.
|
|
304
|
+
const soBloqueados = state === 'failure' && lidos.every((l) => l.estado === 'verde' || l.estado === 'bloqueado')
|
|
305
|
+
&& lidos.some((l) => l.estado === 'bloqueado');
|
|
306
|
+
return { ...base, fonte: decisivo.check.fonte, produtor: (0, produtor_1.produtorDeSaida)(decisivo.check), ok: state === 'success', state, url: decisivo.check.url || null,
|
|
307
|
+
...(soBloqueados ? { bloqueado: true } : {}),
|
|
308
|
+
detail: (0, locale_1.textoDoCatalogo)((m) => m.ship.ciProdutores(context, porProdutor)) };
|
|
173
309
|
}
|
|
174
|
-
function
|
|
310
|
+
function estadoNoGate(estado) {
|
|
311
|
+
return estado === 'verde' ? 'success' : estado === 'pendente' ? 'pending' : 'failure';
|
|
312
|
+
}
|
|
313
|
+
/** O produtor como aparece no detalhe; check-run e commit status do mesmo nome sao produtores distintos. */
|
|
314
|
+
function nomeDoProdutor(check) {
|
|
315
|
+
return `${check.produtor ?? '?'}${check.fonte === 'commit-status' ? ' (status)' : ''}`;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* O check mais novo de cada produtor: maior `concluidoEm`, depois maior `ordem`. Sem `concluidoEm` (ainda rodando) e
|
|
319
|
+
* o mais novo; data ilegivel e a mais velha. Saida ordenada pelo nome do produtor, para o detalhe ser estavel.
|
|
320
|
+
*/
|
|
321
|
+
function maisNovoPorProdutor(checks) {
|
|
322
|
+
const quando = (c) => {
|
|
323
|
+
if (c.concluidoEm === null)
|
|
324
|
+
return Number.POSITIVE_INFINITY;
|
|
325
|
+
const t = Date.parse(c.concluidoEm);
|
|
326
|
+
return Number.isNaN(t) ? Number.NEGATIVE_INFINITY : t;
|
|
327
|
+
};
|
|
328
|
+
const porProdutor = new Map();
|
|
329
|
+
for (const c of checks) {
|
|
330
|
+
const chave = nomeDoProdutor(c);
|
|
331
|
+
const atual = porProdutor.get(chave);
|
|
332
|
+
if (!atual || quando(c) > quando(atual) || (quando(c) === quando(atual) && c.ordem > atual.ordem))
|
|
333
|
+
porProdutor.set(chave, c);
|
|
334
|
+
}
|
|
335
|
+
return [...porProdutor.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)).map(([, c]) => c);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* `ork ci run <thread>`: o verify da thread no runner. O runner (GitHub Actions ou GitLab CI) diz a forja, o projeto e
|
|
339
|
+
* a pagina do job; fora dele, so o commit verificado.
|
|
340
|
+
*/
|
|
341
|
+
function executarCi(carregado, threadId, env = process.env) {
|
|
175
342
|
const verify = (0, verify_1.verificar)(carregado, threadId);
|
|
176
343
|
const context = carregado.manifesto.ci.context || 'ork-verify';
|
|
177
|
-
const
|
|
344
|
+
const runner = (0, ambiente_de_ci_1.ambienteDeCi)(env);
|
|
178
345
|
return {
|
|
179
346
|
status: {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
347
|
+
...baseDaCi(runner?.tipo ?? null, runner?.repository ?? null, verify.commit, context), ok: verify.ok,
|
|
348
|
+
state: verify.ok ? 'success' : 'failure', url: runner?.url ?? null,
|
|
349
|
+
fonte: runner ? (runner.tipo === 'github' ? 'check-run' : 'pipeline-job') : null, produtor: runner?.produtor ?? null,
|
|
183
350
|
detail: verify.ok ? 'ork verify aprovado no runner independente' : `ork verify reprovou: ${verify.motivos.join(', ')}`,
|
|
184
351
|
},
|
|
185
352
|
verify,
|
|
@@ -202,10 +369,15 @@ function arquivoDoBundle(threadId) {
|
|
|
202
369
|
throw new Error(`ci.bundle: "${threadId}" nao e id de thread`);
|
|
203
370
|
return `${threadId}.json`;
|
|
204
371
|
}
|
|
372
|
+
/** Os comandos que o bundle leva ao runner; o `ork ship publicar` confere os do bundle no HEAD contra estes. */
|
|
205
373
|
function comandosDoBundle(carregado) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
:
|
|
374
|
+
// O scan e obrigatorio no runner: la a ferramenta ausente reprova em vez de ficar `unavailable` em silencio.
|
|
375
|
+
const doManifesto = (0, verify_2.comandosDoManifesto)(carregado.manifesto).map(({ nome, comando }) => ({
|
|
376
|
+
name: nome, command: nome === 'security_scan' ? `ORK_SECURITY_SCAN_REQUIRED=1 ${comando}` : comando,
|
|
377
|
+
}));
|
|
378
|
+
if (!carregado.manifesto.ci.command)
|
|
379
|
+
return doManifesto;
|
|
380
|
+
return [{ name: 'ci', command: carregado.manifesto.ci.command }, ...doManifesto.filter((c) => c.name === 'security_scan')];
|
|
209
381
|
}
|
|
210
382
|
/**
|
|
211
383
|
* I-53 (RM-037, P6): o lint no `ci prepare`. Claim nascida sob a regra (com o campo `lint`) que
|
|
@@ -220,11 +392,16 @@ function lintDoBundle(claims) {
|
|
|
220
392
|
if (achado.regra === 'suite-inteira' && claim.lint !== undefined)
|
|
221
393
|
recusas.push(linha);
|
|
222
394
|
else
|
|
223
|
-
avisos.push(achado.regra === 'suite-inteira' ?
|
|
395
|
+
avisos.push(achado.regra === 'suite-inteira' ? anteriorAoLint(linha) : linha);
|
|
224
396
|
}
|
|
225
397
|
}
|
|
226
398
|
return { recusas, avisos };
|
|
227
399
|
}
|
|
400
|
+
/** RM-061 (F3d, GO-FIX 1): a linha da claim anterior ao lint, remontavel no locale do comando como a linha de dentro. */
|
|
401
|
+
function anteriorAoLint(linha) {
|
|
402
|
+
const montar = (0, locale_1.montadorDe)(linha);
|
|
403
|
+
return (0, locale_1.textoDoCatalogo)((m) => m.operacao.produto.ci.anteriorAoLint(montar(m)));
|
|
404
|
+
}
|
|
228
405
|
/**
|
|
229
406
|
* RM-037 (rm037defeito, defeito 6): onde o bundle nasce. Ele e artefato da branch da thread (o commit
|
|
230
407
|
* `ci(<thread>)` vai no PR dela), entao o destino e a worktree da thread, rodando o `ork` da raiz ou da
|
|
@@ -233,7 +410,9 @@ function lintDoBundle(claims) {
|
|
|
233
410
|
*/
|
|
234
411
|
function destinoDoBundle(carregado, threadId) {
|
|
235
412
|
const worktree = (0, thread_1.lerThread)(carregado.raiz, threadId).worktree;
|
|
236
|
-
|
|
413
|
+
// RM-047 (P2): o bundle so e gravado na worktree registrada; outro diretorio do thread.json cai na raiz.
|
|
414
|
+
return worktree && fs.existsSync(worktree) && (0, procedencia_1.cwdLocalOuNulo)(carregado.raiz, threadId, worktree, 'thread') !== null
|
|
415
|
+
? worktree : carregado.raiz;
|
|
237
416
|
}
|
|
238
417
|
function prepararBundleCi(carregado, threadId, opcoes = {}) {
|
|
239
418
|
const commands = comandosDoBundle(carregado);
|
|
@@ -247,14 +426,14 @@ function prepararBundleCi(carregado, threadId, opcoes = {}) {
|
|
|
247
426
|
for (const aviso of lint.avisos)
|
|
248
427
|
opcoes.aoAvisar?.(aviso);
|
|
249
428
|
if (lint.recusas.length) {
|
|
250
|
-
|
|
251
|
-
|
|
429
|
+
const montadores = lint.recusas.map(locale_1.montadorDe);
|
|
430
|
+
throw new locale_1.ErroDoCatalogo((m) => m.operacao.produto.ci.lintRecusado(montadores.map((montar) => montar(m)).join('\n ')));
|
|
252
431
|
}
|
|
253
432
|
const destino = destinoDoBundle(carregado, threadId);
|
|
254
433
|
// Achado S8 do CHECK: a worktree registrada que sumiu nao e silencio; o bundle na raiz vem com aviso.
|
|
255
434
|
const registrada = (0, thread_1.lerThread)(carregado.raiz, threadId).worktree;
|
|
256
435
|
if (registrada && destino !== registrada) {
|
|
257
|
-
opcoes.aoAvisar?.(
|
|
436
|
+
opcoes.aoAvisar?.((0, locale_1.textoDoCatalogo)((m) => m.operacao.produto.ci.worktreeSumiu(registrada)));
|
|
258
437
|
}
|
|
259
438
|
const classified = activeClaims.map((claim) => ({
|
|
260
439
|
claim,
|
|
@@ -271,12 +450,37 @@ function prepararBundleCi(carregado, threadId, opcoes = {}) {
|
|
|
271
450
|
.map((item) => ({ id: item.claim.id, reason: item.reason })),
|
|
272
451
|
commands,
|
|
273
452
|
};
|
|
453
|
+
const texto = JSON.stringify(bundle, null, 2) + '\n';
|
|
454
|
+
barreiraDoBundle(carregado, threadId, destino, path.posix.join(exports.DIR_DO_BUNDLE, nomeDoArquivo), texto, opcoes);
|
|
274
455
|
const dir = path.join(destino, '.ork-ci');
|
|
275
456
|
fs.mkdirSync(dir, { recursive: true });
|
|
276
457
|
const file = path.join(dir, nomeDoArquivo);
|
|
277
|
-
fs.writeFileSync(file,
|
|
458
|
+
fs.writeFileSync(file, texto, 'utf8');
|
|
278
459
|
return file;
|
|
279
460
|
}
|
|
461
|
+
/**
|
|
462
|
+
* RM-062 (F2): com a policy `dado_privado`, o diff da thread e o texto do bundle novo passam pela barreira antes de o
|
|
463
|
+
* arquivo existir. O bundle anterior da propria thread sai do diff, porque o novo o substitui. Em `block`, achado
|
|
464
|
+
* recusa e nada e gravado; em `warn`, avisa e grava. A linha da lista local (presente ou ausente) sai sempre.
|
|
465
|
+
*/
|
|
466
|
+
function barreiraDoBundle(carregado, threadId, destino, caminho, texto, opcoes) {
|
|
467
|
+
const barreira = (0, dado_privado_1.barreiraDaThread)(carregado, (0, thread_1.lerThread)(carregado.raiz, threadId), destino, 'ci.prepare', { extra: (c) => (0, dado_privado_1.varrerTexto)(c, caminho, texto), ignorar: [caminho] });
|
|
468
|
+
if (!barreira)
|
|
469
|
+
return;
|
|
470
|
+
const v = barreira.varredura;
|
|
471
|
+
opcoes.aoInformar?.(`dado privado (policy dado_privado em ${barreira.severidade}): ${(0, dado_privado_1.textoDoEscopo)(v)}; ` +
|
|
472
|
+
`lista local ${(0, dado_privado_1.textoDaListaLocal)(v)}`);
|
|
473
|
+
const recusas = (0, policies_1.bloqueantes)(barreira.violacoes);
|
|
474
|
+
if (recusas.length) {
|
|
475
|
+
throw new Error(`privado.achado: o bundle nao foi gerado; ${recusas.map((r) => r.detalhe).join('; ')}\n ` +
|
|
476
|
+
[...v.achados.slice(0, 20).map(dado_privado_1.linhaDoAchado), `correcao: ${recusas[0].correcao}`].join('\n '));
|
|
477
|
+
}
|
|
478
|
+
for (const aviso of (0, policies_1.avisos)(barreira.violacoes)) {
|
|
479
|
+
(0, ledger_1.registrar)((0, thread_1.dirThread)(carregado.raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.politicaAviso, { gate: 'ci.prepare',
|
|
480
|
+
policy: aviso.policy, motivo: aviso.motivo, detalhe: aviso.detalhe, correcao: aviso.correcao });
|
|
481
|
+
opcoes.aoAvisar?.(`policy ${aviso.policy}: ${aviso.detalhe}`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
280
484
|
function lerBundle(raiz, file) {
|
|
281
485
|
const absolute = path.resolve(raiz, file);
|
|
282
486
|
const stat = fs.statSync(absolute);
|
|
@@ -354,8 +558,13 @@ function rodarBundle(carregado, bundle) {
|
|
|
354
558
|
const preparo = comandoDoPreparo
|
|
355
559
|
? (0, verify_2.executar)('preparo', comandoDoPreparo, carregado.raiz, (0, verify_2.prazoDoComando)(carregado.manifesto, 'preparo'))
|
|
356
560
|
: null;
|
|
357
|
-
const claims = bundle.claims.map((claim) => (0, verify_2.verificarClaim)(claim, carregado.raiz));
|
|
358
|
-
|
|
561
|
+
const claims = bundle.claims.map((claim) => (0, verify_2.verificarClaim)(claim, carregado.raiz, (0, verify_2.executorDoManifesto)(carregado.manifesto)));
|
|
562
|
+
// O comando lógico `ci` executa o script de testes hermético (`test:ci`) e herda o mesmo teto configurado
|
|
563
|
+
// para `test`. Assim a suíte não volta silenciosamente ao default de 600 s no runner hospedado.
|
|
564
|
+
const doManifesto = (0, verify_2.executorDoManifesto)(carregado.manifesto);
|
|
565
|
+
const commands = bundle.commands.map((item) => item.name === 'ci'
|
|
566
|
+
? (0, verify_2.executar)(item.name, item.command, carregado.raiz, (0, verify_2.prazoDoComando)(carregado.manifesto, 'test'))
|
|
567
|
+
: doManifesto(item.name, item.command, carregado.raiz));
|
|
359
568
|
const ok = claims.every((item) => item.verificado || item.motivo === 'claims.unverifiable') && commands.every((item) => item.ok);
|
|
360
569
|
return { schema: 'ork.ci-run/v1', ok, thread: bundle.thread, commit: (0, verify_2.commitReal)(carregado.raiz), preparo, claims, commands };
|
|
361
570
|
}
|
package/dist/ciclos.js
CHANGED
|
@@ -16,6 +16,7 @@ exports.somenteAnalise = somenteAnalise;
|
|
|
16
16
|
exports.aplicarVariante = aplicarVariante;
|
|
17
17
|
exports.tabelaDeVariantes = tabelaDeVariantes;
|
|
18
18
|
const modos_1 = require("./modos");
|
|
19
|
+
const locale_1 = require("./locale");
|
|
19
20
|
/** As 5 variantes de ciclo, com o que cada uma muda na criacao da thread. */
|
|
20
21
|
exports.VARIANTES = {
|
|
21
22
|
greenfield: {
|
|
@@ -139,19 +140,20 @@ function aplicarVariante(blocos, variante) {
|
|
|
139
140
|
}
|
|
140
141
|
/** Tabela das variantes de ciclo, usada por `ork ciclos`. */
|
|
141
142
|
function tabelaDeVariantes() {
|
|
142
|
-
const
|
|
143
|
+
const m = (0, locale_1.msg)().operacao.ciclos;
|
|
144
|
+
const linhas = [m.titulo, ''];
|
|
143
145
|
for (const v of exports.ORDEM_DAS_VARIANTES) {
|
|
144
146
|
const def = exports.VARIANTES[v];
|
|
145
147
|
const exige = [];
|
|
146
148
|
if (def.exigeBranch)
|
|
147
149
|
exige.push('--branch <existente>');
|
|
148
150
|
if (def.exigeWorktree)
|
|
149
|
-
exige.push(
|
|
150
|
-
linhas.push(` ${v.padEnd(20)} ${def.descricao}`);
|
|
151
|
-
linhas.push(` ${''.padEnd(20)} exige: ${exige.join(', ') ||
|
|
152
|
-
|
|
151
|
+
exige.push(m.worktree);
|
|
152
|
+
linhas.push(` ${v.padEnd(20)} ${m.descricoes[v] ?? def.descricao}`);
|
|
153
|
+
linhas.push(` ${''.padEnd(20)} ${m.exige}: ${exige.join(', ') || m.nada} | ` +
|
|
154
|
+
`${m.muda}: ${def.mudaBlocos ? m.sim : m.nao}`);
|
|
153
155
|
}
|
|
154
156
|
linhas.push('');
|
|
155
|
-
linhas.push(
|
|
157
|
+
linhas.push(m.fecho);
|
|
156
158
|
return linhas.join('\n');
|
|
157
159
|
}
|