@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
|
@@ -33,9 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.CONTRATO_FORJA_SEM_LEITURA = exports.FORJA_SEM_LEITURA = exports.LIMITE_DE_RECENTES = exports.LIMITE_DE_PRS = exports.VALIDADE_DO_RETRATO_MIN = exports.LIMIAR_PARADO_NO_CONDUTOR_MIN = exports.CONTRATO_PRS = void 0;
|
|
36
|
+
exports.CONTRATO_FORJA_SEM_LEITURA = exports.ghPadrao = exports.FORJA_SEM_LEITURA = exports.LIMITES_DOS_PEDIDOS = exports.LIMITE_DE_RECENTES = exports.LIMITE_DE_PRS = exports.VALIDADE_DO_RETRATO_MIN = exports.LIMIAR_PARADO_NO_CONDUTOR_MIN = exports.CONTRATO_PRS = void 0;
|
|
37
37
|
exports.nomeDeCheck = nomeDeCheck;
|
|
38
|
+
exports.prDaForja = prDaForja;
|
|
39
|
+
exports.githubDoRemoto = githubDoRemoto;
|
|
38
40
|
exports.repositorioDoRemoto = repositorioDoRemoto;
|
|
41
|
+
exports.forjaDoRemotoDoPulse = forjaDoRemotoDoPulse;
|
|
39
42
|
exports.lerPrsDaForja = lerPrsDaForja;
|
|
40
43
|
exports.gravarRetratoDePrs = gravarRetratoDePrs;
|
|
41
44
|
exports.avisarForjaSemLeitura = avisarForjaSemLeitura;
|
|
@@ -45,8 +48,10 @@ exports.lerRetratoDePrs = lerRetratoDePrs;
|
|
|
45
48
|
exports.perguntaAberta = perguntaAberta;
|
|
46
49
|
exports.fimDoTurno = fimDoTurno;
|
|
47
50
|
exports.pendenciaDoDono = pendenciaDoDono;
|
|
51
|
+
exports.conducaoAgora = conducaoAgora;
|
|
48
52
|
exports.esperaDoCondutor = esperaDoCondutor;
|
|
49
53
|
exports.sessaoSemPergunta = sessaoSemPergunta;
|
|
54
|
+
exports.refsLocais = refsLocais;
|
|
50
55
|
exports.entregasDoProjeto = entregasDoProjeto;
|
|
51
56
|
/**
|
|
52
57
|
* RM-037 (fatia 4): o trabalho parado no condutor.
|
|
@@ -74,11 +79,18 @@ exports.entregasDoProjeto = entregasDoProjeto;
|
|
|
74
79
|
*/
|
|
75
80
|
const fs = __importStar(require("node:fs"));
|
|
76
81
|
const path = __importStar(require("node:path"));
|
|
77
|
-
const
|
|
82
|
+
const api_1 = require("./forja/api");
|
|
83
|
+
const cli_1 = require("./forja/cli");
|
|
84
|
+
const endereco_1 = require("./forja/endereco");
|
|
85
|
+
const executor_1 = require("./forja/executor");
|
|
86
|
+
const resolver_1 = require("./forja/resolver");
|
|
87
|
+
const registro_1 = require("./forja/registro");
|
|
88
|
+
const estado_1 = require("./forja/estado");
|
|
78
89
|
const branch_de_estado_1 = require("./branch-de-estado");
|
|
79
90
|
const conducao_1 = require("./conducao");
|
|
80
91
|
const estado_thread_1 = require("./estado-thread");
|
|
81
92
|
const forja_1 = require("./forja");
|
|
93
|
+
const locale_1 = require("./locale");
|
|
82
94
|
const hitl_1 = require("./hitl");
|
|
83
95
|
const hitl_contract_1 = require("./hitl-contract");
|
|
84
96
|
const hitl_classificacao_1 = require("./hitl-classificacao");
|
|
@@ -99,41 +111,37 @@ exports.VALIDADE_DO_RETRATO_MIN = 60;
|
|
|
99
111
|
exports.LIMITE_DE_PRS = 200;
|
|
100
112
|
/** Quantos PRs recentes (de qualquer estado) a segunda leitura pede: so para achar o mesclado e o fechado. */
|
|
101
113
|
exports.LIMITE_DE_RECENTES = 100;
|
|
114
|
+
const PRAZO_DO_GH_MS = 30000;
|
|
115
|
+
/** Os tetos e o prazo de cada chamada da leitura de pedidos, que o adaptador de cada forja respeita. */
|
|
116
|
+
exports.LIMITES_DOS_PEDIDOS = { abertos: exports.LIMITE_DE_PRS, recentes: exports.LIMITE_DE_RECENTES, candidatas: 10,
|
|
117
|
+
minimoDaConferenciaMs: 5000, prazoMs: PRAZO_DO_GH_MS };
|
|
102
118
|
/** Retrato com data mais a frente do relogio do que isto nao vale (relogio adiantado ou arquivo mexido). */
|
|
103
119
|
const FOLGA_DO_RELOGIO_MIN = 5;
|
|
104
120
|
const ARQUIVO_DOS_PRS = 'prs.json';
|
|
105
|
-
const PRAZO_DO_GH_MS = 30000;
|
|
106
121
|
/** A leitura inteira da forja numa batida: cabe com folga nos 240 s que a varredura da ao subprocesso do pulse. */
|
|
107
122
|
const ORCAMENTO_DA_LEITURA_MS = 60000;
|
|
108
|
-
const CAMPOS_DOS_RECENTES = 'number,state,headRefName,headRefOid,baseRefName,isDraft,isCrossRepository,url,createdAt,mergedAt';
|
|
109
|
-
const CAMPOS_DO_GH = `${CAMPOS_DOS_RECENTES},statusCheckRollup`;
|
|
110
|
-
/** Quantas branches candidatas a "sem PR" sao conferidas uma a uma por batida; o resto fica "PR nao lido". */
|
|
111
|
-
const LIMITE_DE_CANDIDATAS = 10;
|
|
112
|
-
/** A conferencia de uma candidata so comeca com este tempo de sobra no orcamento; com menos, a branch fica sem conferir. */
|
|
113
|
-
const MINIMO_DA_CONFERENCIA_MS = 5000;
|
|
114
123
|
/** As fases que o ciclo despacha antes da entrega: depois de um bloco que para nelas, o passo e despachar, nao publicar. */
|
|
115
124
|
const FASES_ANTES_DA_ENTREGA = ['GOAL', 'PLAN', 'GO', 'CHECK'];
|
|
116
125
|
/** Os modos em que a #TAG ja autoriza o push (`autorizacaoDePush`, `core/src/ship.ts`). */
|
|
117
126
|
const MODOS_COM_PUSH_AUTORIZADO = ['auto', 'maestro'];
|
|
118
127
|
/** RM-037 (fatia 5, A5): o que as linhas e o resumo dizem quando a forja nao tem leitura de PR. */
|
|
119
128
|
exports.FORJA_SEM_LEITURA = 'forja sem leitura de PR';
|
|
120
|
-
/** O ambiente do `gh`: sem cor, sem prompt e sem host ou repositorio herdados (o host vai no `--repo`). */
|
|
121
|
-
function ambienteDoGh() {
|
|
122
|
-
const env = { ...process.env, GH_PROMPT_DISABLED: '1', NO_COLOR: '1', CLICOLOR: '0', CLICOLOR_FORCE: '0' };
|
|
123
|
-
delete env.GH_HOST;
|
|
124
|
-
delete env.GH_REPO;
|
|
125
|
-
delete env.GH_FORCE_TTY;
|
|
126
|
-
return env;
|
|
127
|
-
}
|
|
128
129
|
const ghPadrao = (args, timeoutMs) => {
|
|
129
|
-
const r = (0,
|
|
130
|
-
|
|
130
|
+
const r = (0, executor_1.rodarCli)({ cmd: 'gh', args, prazoMs: timeoutMs, maxBuffer: 16 * 1024 * 1024, procurarBinario: false,
|
|
131
|
+
acrescentar: { GH_PROMPT_DISABLED: '1', NO_COLOR: '1', CLICOLOR: '0', CLICOLOR_FORCE: '0' },
|
|
132
|
+
apagar: ['GH_HOST', 'GH_REPO', 'GH_FORCE_TTY'] });
|
|
133
|
+
return { status: r.status, stdout: r.stdout, stderr: r.mensagemDoErro ?? r.stderr };
|
|
131
134
|
};
|
|
135
|
+
exports.ghPadrao = ghPadrao;
|
|
132
136
|
/** Git local sem rede escondida: clone parcial nunca busca objeto durante uma leitura daqui. */
|
|
133
137
|
const git = (raiz, args) => (0, util_1.exec)('git', args, raiz, 60000, { ...process.env, GIT_NO_LAZY_FETCH: '1' });
|
|
134
138
|
const SHA = /^[0-9a-f]{40}$/;
|
|
135
139
|
const BRANCH = /^[A-Za-z0-9._/-]{1,200}$/;
|
|
136
140
|
const REPOSITORIO = /^[A-Za-z0-9_.-]{1,100}\/[A-Za-z0-9_.-]{1,100}$/;
|
|
141
|
+
/** O caminho do projeto no retrato: `dono/nome` no GitHub, o caminho completo com subgrupos no GitLab. */
|
|
142
|
+
const CAMINHO_DO_PROJETO = /^[A-Za-z0-9_.-]{1,100}(?:\/[A-Za-z0-9_.-]{1,100}){1,19}$/;
|
|
143
|
+
/** O caminho do projeto na forma, sem segmento `.` ou `..`. */
|
|
144
|
+
const caminhoDoProjeto = (v) => CAMINHO_DO_PROJETO.test(v) && v.split('/').every((p) => p !== '.' && p !== '..');
|
|
137
145
|
/** O host do GitHub Enterprise guardado no retrato: rotulos alfanumericos separados por ponto, como na forja. */
|
|
138
146
|
const HOST = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$/;
|
|
139
147
|
/** Texto curto vindo de fora: sem controle, num teto. */
|
|
@@ -179,11 +187,13 @@ function checkDaForja(c) {
|
|
|
179
187
|
let situacao;
|
|
180
188
|
if (o.__typename === 'StatusContext' || (o.status === undefined && typeof o.state === 'string')) {
|
|
181
189
|
const s = String(o.state ?? '').toUpperCase();
|
|
182
|
-
situacao =
|
|
190
|
+
situacao = (0, estado_1.estadoDoCheck)('commit-status', s, null);
|
|
183
191
|
}
|
|
184
192
|
else {
|
|
185
193
|
const status = String(o.status ?? '').toUpperCase(), conclusao = String(o.conclusion ?? '').toUpperCase();
|
|
186
|
-
|
|
194
|
+
// O pulse mostra o job pulado de proposito como verde, como sempre: so o gate trata `bloqueado` como nao verde.
|
|
195
|
+
const estado = (0, estado_1.estadoDoCheck)('check-run', status, conclusao);
|
|
196
|
+
situacao = estado === 'bloqueado' ? 'verde' : estado;
|
|
187
197
|
}
|
|
188
198
|
const concluidoEm = situacao === 'pendente' ? null : instante(o.completedAt) ?? instante(o.startedAt);
|
|
189
199
|
return { check: { nome, situacao, concluidoEm }, chave, inicio: instante(o.startedAt) ?? instante(o.completedAt) ?? '' };
|
|
@@ -220,8 +230,12 @@ function prDaForja(bruto, base) {
|
|
|
220
230
|
}
|
|
221
231
|
}
|
|
222
232
|
const url = typeof p.url === 'string' && /^https:\/\/[^\s]+$/.test(p.url) ? curto(p.url, 300) : null;
|
|
233
|
+
// RM-059 (F7): o estado de merge so vale do PR aberto, e so quando a leitura pediu o campo.
|
|
234
|
+
const conflito = estado !== 'aberto' || p.mergeable === undefined ? undefined
|
|
235
|
+
: p.mergeable === 'CONFLICTING' ? true : p.mergeable === 'MERGEABLE' ? false : null;
|
|
223
236
|
return { numero: numero, branch: p.headRefName, head, estado, rascunho: p.isDraft, url,
|
|
224
|
-
criadoEm: instante(p.createdAt), mescladoEm: instante(p.mergedAt), checks: [...porChave.values()].map((x) => x.check)
|
|
237
|
+
criadoEm: instante(p.createdAt), mescladoEm: instante(p.mergedAt), checks: [...porChave.values()].map((x) => x.check),
|
|
238
|
+
...(conflito !== undefined ? { conflito } : {}) };
|
|
225
239
|
}
|
|
226
240
|
/**
|
|
227
241
|
* RM-037 (fatia 5, A5): o host e o `dono/nome` do remoto quando ele pode ser um GitHub (o github.com ou um host
|
|
@@ -242,52 +256,97 @@ function repositorioDoRemoto(raiz, remoto) {
|
|
|
242
256
|
const github = githubDoRemoto(raiz, remoto);
|
|
243
257
|
return github && github.host === 'github.com' ? github.repositorio : null;
|
|
244
258
|
}
|
|
259
|
+
const githubResolvido = (f) => ({ tipo: 'github', host: f.host, porta: null,
|
|
260
|
+
caminhoBase: '', sshHost: null, sshPorta: null, ca: null, repo: f.repositorio,
|
|
261
|
+
origem: { tipo: 'remoto', host: 'remoto', porta: 'padrao', caminhoBase: 'padrao' } });
|
|
245
262
|
/**
|
|
246
|
-
*
|
|
247
|
-
*
|
|
248
|
-
*
|
|
249
|
-
* forja, que o pulse diz uma vez.
|
|
263
|
+
* As sondas do pulse: o GitHub pelo `gh auth status --hostname` de sempre (o host proprio em que o `gh` tem login e
|
|
264
|
+
* um GitHub Enterprise) e o GitLab pela sonda padrao (o `glab` com login no host responde o `metadata`). O `auth
|
|
265
|
+
* status` que falha por outro motivo que nao a falta de login (prazo, rede, `gh` ausente) fica em `falha`.
|
|
250
266
|
*/
|
|
251
|
-
function
|
|
267
|
+
function sondasDoPulse(executor, prazoMs, rodar, logins, falha) {
|
|
268
|
+
return {
|
|
269
|
+
github: (alvo) => {
|
|
270
|
+
if (alvo.caminhoBase)
|
|
271
|
+
return 'nao-responde';
|
|
272
|
+
// Com porta propria, o login se confere no `host:porta` exato, pela sonda padrao: o `--hostname` nao leva porta.
|
|
273
|
+
if (alvo.porta !== null && alvo.porta !== 443)
|
|
274
|
+
return (0, resolver_1.sondasPadrao)(rodar, logins).github(alvo);
|
|
275
|
+
const auth = executor(['auth', 'status', '--hostname', alvo.host], prazoMs);
|
|
276
|
+
if (auth.status === 0)
|
|
277
|
+
return 'responde';
|
|
278
|
+
// So a resposta de login ausente (o `gh` 2.46 diz "You are not logged into any accounts on <host>") e o estado
|
|
279
|
+
// da forja; prazo estourado, `gh` ausente ou host fora do ar sao falha desta batida.
|
|
280
|
+
if (auth.status === 1 && /\bnot logged in/i.test(`${auth.stdout}\n${auth.stderr}`)) {
|
|
281
|
+
falha.ghSemLogin = true;
|
|
282
|
+
return 'sem-login';
|
|
283
|
+
}
|
|
284
|
+
falha.gh = `gh auth status --hostname ${alvo.host} falhou (${auth.status === null ? 'sem código de saída' : `código ${auth.status}`}): ` +
|
|
285
|
+
(curto((0, hitl_1.redigirSegredos)(auth.stderr || auth.stdout || ''), 120) ?? 'sem detalhe');
|
|
286
|
+
return 'nao-responde';
|
|
287
|
+
},
|
|
288
|
+
gitlab: (alvo) => {
|
|
289
|
+
const r = (0, resolver_1.sondasPadrao)(rodar, logins).gitlab(alvo);
|
|
290
|
+
if (r === 'sem-login')
|
|
291
|
+
falha.glabSemLogin = true;
|
|
292
|
+
return r;
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* De onde o pulse le os pedidos do remoto: a forja resolvida pelo bloco `forja:` do manifesto, pelo host conhecido ou
|
|
298
|
+
* pela sondagem so por CLI com login no host (nunca pelo nome do host). Ficar sem leitura (remoto sem forja, forja
|
|
299
|
+
* que nao se resolve, tipo sem a capacidade) nao e falha desta batida: e o estado da forja, que o pulse diz uma vez.
|
|
300
|
+
*/
|
|
301
|
+
function forjaDosPrs(carregado, remoto, executor, prazoMs, rodar, logins, sondas) {
|
|
252
302
|
// RM-047: remoto que nao e nome de remoto nao chega ao git; para o pulse, e forja sem leitura.
|
|
253
303
|
if (!(0, branch_de_estado_1.remotoValido)(remoto)) {
|
|
254
304
|
return { leitura: false, host: null, motivo: `o remoto ${(0, branch_de_estado_1.remotoRedigido)(remoto)} não é nome de remoto do git`, semLeitura: true };
|
|
255
305
|
}
|
|
256
|
-
const url = git(raiz, ['remote', 'get-url', '--', remoto]);
|
|
306
|
+
const url = git(carregado.raiz, ['remote', 'get-url', '--', remoto]);
|
|
257
307
|
if (!url.ok)
|
|
258
308
|
return { leitura: false, host: null, motivo: `o remoto ${remoto} não está configurado neste checkout`, semLeitura: true };
|
|
259
|
-
const endereco = (0, forja_1.enderecoDoRemoto)(url.stdout.trim());
|
|
309
|
+
const endereco = (0, forja_1.enderecoDoRemoto)(url.stdout.trim()), lido = (0, endereco_1.lerEnderecoDoRemoto)(url.stdout.trim());
|
|
260
310
|
// Caminho local, ou apelido de SSH sem dominio (`git@github-trabalho:dono/repo.git`): nao ha host para ler.
|
|
261
|
-
if (!endereco) {
|
|
311
|
+
if (!endereco || !lido) {
|
|
262
312
|
return { leitura: false, host: null, motivo: `o remoto ${remoto} não tem host de forja (caminho local ou apelido de SSH)`, semLeitura: true };
|
|
263
313
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
314
|
+
const falha = {};
|
|
315
|
+
// Sem o cache de 24 h: o pulse percebe na batida seguinte a CLI que perdeu o login no host.
|
|
316
|
+
const r = (0, resolver_1.resolverForja)({ endereco: lido, manifesto: carregado.manifesto.forja, sondas: sondas ?? sondasDoPulse(executor, prazoMs, rodar, logins, falha) });
|
|
317
|
+
if (!r.ok) {
|
|
318
|
+
if (falha.gh)
|
|
319
|
+
return { leitura: false, host: endereco.host, semLeitura: false, motivo: falha.gh };
|
|
320
|
+
const erro = r.erro;
|
|
321
|
+
const motivo = erro.codigo === 'forja.desconhecida' && falha.ghSemLogin
|
|
322
|
+
? (0, locale_1.textoDoCatalogo)((m) => falha.glabSemLogin ? m.pulse.forjaSemLoginNasDuas(endereco.host, remoto) : m.pulse.forjaSemLogin('gh', endereco.host, remoto))
|
|
323
|
+
: (0, locale_1.textoDoCatalogo)((m) => m.pulse.forjaNaoResolvida(remoto, m.forja.motivo(erro, null)));
|
|
324
|
+
return { leitura: false, host: endereco.host, semLeitura: true, motivo };
|
|
267
325
|
}
|
|
268
|
-
const
|
|
269
|
-
if (!
|
|
326
|
+
const forja = r.valor;
|
|
327
|
+
if (forja.tipo === 'github' && !REPOSITORIO.test(forja.repo)) {
|
|
270
328
|
return { leitura: false, host: endereco.host, motivo: `o remoto ${remoto} (${endereco.host}) não aponta um repositório dono/nome`,
|
|
271
329
|
semLeitura: true };
|
|
272
330
|
}
|
|
273
|
-
if (
|
|
274
|
-
return { leitura:
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
331
|
+
if (!(0, registro_1.adaptadorDaForja)(forja.tipo).pedidosAbertos) {
|
|
332
|
+
return { leitura: false, host: endereco.host, semLeitura: true,
|
|
333
|
+
motivo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.forjaSemPedidos(forja.tipo, forja.host, remoto)) };
|
|
334
|
+
}
|
|
335
|
+
return { leitura: true, forja, hostDoRemoto: endereco.host };
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* A forja do remoto como o pulse a resolve (o bloco `forja:`, o host conhecido, o cache ou a sondagem pela CLI com
|
|
339
|
+
* login), sem ler pedido nenhum: a pista a usa num host proprio, para seguir o caminho da forja certa. `erro` e a frase
|
|
340
|
+
* que a leitura dos pedidos diria.
|
|
341
|
+
*/
|
|
342
|
+
function forjaDoRemotoDoPulse(carregado, remoto, opcoes = {}) {
|
|
343
|
+
const lido = forjaDosPrs(carregado, remoto, opcoes.executor ?? exports.ghPadrao, PRAZO_DO_GH_MS, opcoes.rodar ?? executor_1.rodarCli, new Map(), opcoes.sondas);
|
|
344
|
+
return lido.leitura ? { ok: true, forja: lido.forja } : { ok: false, erro: lido.motivo };
|
|
285
345
|
}
|
|
286
346
|
/**
|
|
287
|
-
* Le os
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
* vai no `--repo`; forja sem leitura de PR nao chama o `gh pr list`.
|
|
347
|
+
* Le os pedidos da base do projeto pela capacidade `pedidosAbertos` da forja resolvida: os abertos (so a lista deles
|
|
348
|
+
* pode dizer "sem PR"), os recentes de qualquer estado e as candidatas que nao apareceram. A CLI usa a autenticacao
|
|
349
|
+
* dela; nenhum token passa por aqui. Forja sem leitura de pedidos nao chama CLI nenhuma alem da sondagem.
|
|
291
350
|
*/
|
|
292
351
|
function lerPrsDaForja(carregado, opcoes = {}) {
|
|
293
352
|
const lidoEm = opcoes.quando ?? new Date().toISOString();
|
|
@@ -295,78 +354,52 @@ function lerPrsDaForja(carregado, opcoes = {}) {
|
|
|
295
354
|
const base = carregado.manifesto.worktree.base_branch;
|
|
296
355
|
const orcamento = opcoes.orcamentoMs ?? ORCAMENTO_DA_LEITURA_MS, fimDaLeitura = Date.now() + orcamento;
|
|
297
356
|
const resta = () => fimDaLeitura - Date.now();
|
|
298
|
-
const executor = opcoes.executor ?? ghPadrao;
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
return
|
|
316
|
-
|
|
317
|
-
catch (e) {
|
|
318
|
-
return `resposta do gh pr list fora do formato: ${curto((0, hitl_1.redigirSegredos)(e.message), 120) ?? 'sem detalhe'}`;
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
try {
|
|
322
|
-
const porNumero = new Map();
|
|
323
|
-
const juntar = (lista, comChecks) => {
|
|
324
|
-
for (const bruto of lista) {
|
|
325
|
-
const pr = prDaForja(bruto, base);
|
|
326
|
-
if (!pr || porNumero.has(pr.numero))
|
|
327
|
-
continue;
|
|
328
|
-
// S-b do CHECK (rodada 3): a leitura sem rollup nunca diz que o aberto nao tem checks.
|
|
329
|
-
if (!comChecks && pr.estado === 'aberto')
|
|
330
|
-
pr.checks = [{ nome: 'checks não lidos', situacao: 'pendente', concluidoEm: null }];
|
|
331
|
-
porNumero.set(pr.numero, pr);
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
const abertos = pedir(['--state=open', `--limit=${exports.LIMITE_DE_PRS}`, `--json=${CAMPOS_DO_GH}`]);
|
|
335
|
-
if (typeof abertos === 'string')
|
|
336
|
-
return { ok: false, lidoEm, erro: abertos };
|
|
337
|
-
juntar(abertos, true);
|
|
338
|
-
const recentes = pedir(['--state=all', `--limit=${exports.LIMITE_DE_RECENTES}`, `--json=${CAMPOS_DOS_RECENTES}`]);
|
|
339
|
-
if (typeof recentes === 'string')
|
|
340
|
-
return { ok: false, lidoEm, erro: recentes };
|
|
341
|
-
juntar(recentes, false);
|
|
342
|
-
// R1 do CHECK (rodada 3): antes de dizer "sem PR", a branch candidata e conferida sozinha (o mesclado velho
|
|
343
|
-
// fica fora dos recentes). Acima do teto da batida, a branch fica sem conferir, e isso e "PR nao lido".
|
|
344
|
-
const achadas = new Set([...porNumero.values()].map((p) => p.branch));
|
|
345
|
-
const faltam = [...new Set(opcoes.candidatas ?? [])].filter((b) => BRANCH.test(b) && !achadas.has(b));
|
|
346
|
-
const semConferir = [];
|
|
347
|
-
for (const [i, branch] of faltam.entries()) {
|
|
348
|
-
// Acima do teto da batida, sem tempo para a conferencia inteira ou com ela falhando, a candidata fica sem conferir
|
|
349
|
-
// ("PR nao lido") e o que ja foi lido vale (sugestao da seguranca na rodada 4 do CHECK).
|
|
350
|
-
if (i >= LIMITE_DE_CANDIDATAS || resta() < MINIMO_DA_CONFERENCIA_MS) {
|
|
351
|
-
semConferir.push(branch);
|
|
352
|
-
continue;
|
|
353
|
-
}
|
|
354
|
-
const daBranch = pedir(['--state=all', `--head=${branch}`, '--limit=5', `--json=${CAMPOS_DOS_RECENTES}`]);
|
|
355
|
-
try {
|
|
356
|
-
if (typeof daBranch === 'string')
|
|
357
|
-
throw new Error(daBranch);
|
|
358
|
-
juntar(daBranch, false);
|
|
359
|
-
}
|
|
360
|
-
catch {
|
|
361
|
-
semConferir.push(branch);
|
|
362
|
-
}
|
|
357
|
+
const executor = opcoes.executor ?? exports.ghPadrao, rodar = opcoes.rodar ?? executor_1.rodarCli, logins = new Map();
|
|
358
|
+
const lido = opcoes.resolvida ? { leitura: true, forja: opcoes.resolvida, hostDoRemoto: null }
|
|
359
|
+
: opcoes.forja ? { leitura: true, forja: githubResolvido(opcoes.forja), hostDoRemoto: null }
|
|
360
|
+
: forjaDosPrs(carregado, remoto, executor, Math.min(PRAZO_DO_GH_MS, Math.max(1, resta())), rodar, logins, opcoes.sondas);
|
|
361
|
+
if (!lido.leitura)
|
|
362
|
+
return { ok: false, lidoEm, erro: lido.motivo, ...(lido.semLeitura ? { semLeitura: { remoto, host: lido.host } } : {}) };
|
|
363
|
+
const forja = lido.forja;
|
|
364
|
+
const lidos = (0, registro_1.exigirCapacidade)((0, registro_1.adaptadorDaForja)(forja.tipo), 'pedidosAbertos')({ forja, base, candidatas: opcoes.candidatas ?? [],
|
|
365
|
+
contexto: carregado.manifesto.ci.context || 'ork-verify',
|
|
366
|
+
api: (0, api_1.chamadorDaApi)(forja, { rodar, logins }), executor, resta, orcamentoMs: orcamento, limites: exports.LIMITES_DOS_PEDIDOS });
|
|
367
|
+
if (!lidos.ok) {
|
|
368
|
+
const erro = lidos.erro, cli = cli_1.CLI_DA_FORJA[forja.tipo].cmd;
|
|
369
|
+
// O GitHub guarda a frase de sempre do `gh pr list` (o pulse e os snapshots a fixam); as outras dizem o motivo tipado.
|
|
370
|
+
if (forja.tipo === 'github')
|
|
371
|
+
return { ok: false, lidoEm, erro: erro.detalhe };
|
|
372
|
+
// A CLI sem login no host e o estado da forja, dito uma vez, como o `gh` sem login no host proprio.
|
|
373
|
+
if (erro.codigo === 'forja.sem-login') {
|
|
374
|
+
return { ok: false, lidoEm, erro: (0, locale_1.textoDoCatalogo)((m) => m.pulse.forjaSemLogin(cli, forja.host, remoto)),
|
|
375
|
+
semLeitura: { remoto, host: lido.hostDoRemoto ?? forja.host } };
|
|
363
376
|
}
|
|
364
|
-
return { ok:
|
|
365
|
-
parcial: abertos.length >= exports.LIMITE_DE_PRS, ...(semConferir.length ? { semConferir } : {}), prs: [...porNumero.values()] } };
|
|
366
|
-
}
|
|
367
|
-
catch (e) {
|
|
368
|
-
return { ok: false, lidoEm, erro: `resposta do gh pr list fora do formato: ${curto((0, hitl_1.redigirSegredos)(e.message), 120) ?? 'sem detalhe'}` };
|
|
377
|
+
return { ok: false, lidoEm, erro: (0, locale_1.textoDoCatalogo)((m) => m.forja.motivo(erro, forja.tipo)) };
|
|
369
378
|
}
|
|
379
|
+
return { ok: true, retrato: { contrato: exports.CONTRATO_PRS, lidoEm, repositorio: forja.repo, ...(forja.host !== 'github.com' ? { host: forja.host } : {}),
|
|
380
|
+
base, parcial: lidos.valor.parcial, ...(lidos.valor.semConferir.length ? { semConferir: lidos.valor.semConferir } : {}), prs: lidos.valor.prs } };
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* O host e o caminho do projeto no remoto, sem rede nem CLI: o que o retrato tem de bater. A resolucao roda sem
|
|
384
|
+
* sondas; sem tipo declarado e fora dos hosts conhecidos, valem o host (o declarado, senao o do remoto) e o caminho do
|
|
385
|
+
* remoto sem o caminho base.
|
|
386
|
+
*/
|
|
387
|
+
function forjaDoRemotoSemRede(carregado, remoto) {
|
|
388
|
+
if (!(0, branch_de_estado_1.remotoValido)(remoto))
|
|
389
|
+
return null;
|
|
390
|
+
const url = git(carregado.raiz, ['remote', 'get-url', '--', remoto]);
|
|
391
|
+
const endereco = url.ok ? (0, endereco_1.lerEnderecoDoRemoto)(url.stdout.trim()) : null;
|
|
392
|
+
if (!endereco)
|
|
393
|
+
return null;
|
|
394
|
+
const m = carregado.manifesto.forja;
|
|
395
|
+
const r = (0, resolver_1.resolverForja)({ endereco, manifesto: m, sondas: {} });
|
|
396
|
+
if (r.ok)
|
|
397
|
+
return { host: r.valor.host, repositorio: r.valor.repo };
|
|
398
|
+
if (r.erro.codigo !== 'forja.desconhecida')
|
|
399
|
+
return null;
|
|
400
|
+
const prefixo = m?.caminho_base ? `${m.caminho_base.slice(1)}/` : '';
|
|
401
|
+
return { host: m?.host ?? endereco.host,
|
|
402
|
+
repositorio: prefixo && endereco.caminho.startsWith(prefixo) ? endereco.caminho.slice(prefixo.length) : endereco.caminho };
|
|
370
403
|
}
|
|
371
404
|
const dirDoMonitor = (raiz) => path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery', 'monitor');
|
|
372
405
|
/** Grava o retrato de uma leitura que deu certo: arquivo novo exclusivo, so do dono, renomeado por cima. */
|
|
@@ -449,7 +482,7 @@ function lerRetratoDePrs(raiz) {
|
|
|
449
482
|
try {
|
|
450
483
|
const r = JSON.parse(fs.readFileSync(path.join(dirDoMonitor(raiz), ARQUIVO_DOS_PRS), 'utf8'));
|
|
451
484
|
const lidoEm = instante(r.lidoEm);
|
|
452
|
-
if (r.contrato !== exports.CONTRATO_PRS || !lidoEm || typeof r.repositorio !== 'string' || !
|
|
485
|
+
if (r.contrato !== exports.CONTRATO_PRS || !lidoEm || typeof r.repositorio !== 'string' || !caminhoDoProjeto(r.repositorio) ||
|
|
453
486
|
typeof r.base !== 'string' || typeof r.parcial !== 'boolean' || !Array.isArray(r.prs) ||
|
|
454
487
|
(r.host !== undefined && !(typeof r.host === 'string' && HOST.test(r.host))) ||
|
|
455
488
|
(r.semConferir !== undefined && !(Array.isArray(r.semConferir) && r.semConferir.every((b) => typeof b === 'string' && BRANCH.test(b)))))
|
|
@@ -702,6 +735,19 @@ function pendenciaDoDono(t, eventos, quando) {
|
|
|
702
735
|
}
|
|
703
736
|
return null;
|
|
704
737
|
}
|
|
738
|
+
/**
|
|
739
|
+
* Quem conduz a thread agora, ou `null`. P7: a sessao que ja encerrou o turno nao conduz mais nada, mesmo com o lease
|
|
740
|
+
* de pe. RM-059 (F7): a mesma regra do pulse decide se o `ork ship publicar` pode publicar a branch.
|
|
741
|
+
*/
|
|
742
|
+
function conducaoAgora(raiz, t, eventos, quando) {
|
|
743
|
+
const conducao = (0, conducao_1.conducaoDaThread)(raiz, t.id, { agora: new Date(quando) });
|
|
744
|
+
if (!conducao)
|
|
745
|
+
return null;
|
|
746
|
+
const despacho = ultimoDespacho(eventos);
|
|
747
|
+
const fim = despacho ? fimDoTurno(eventos, despacho, t.modo) : null;
|
|
748
|
+
const terminou = !!fim && fim.tipo !== 'outro';
|
|
749
|
+
return conducao.dono.tipo === 'sessao' && terminou && conducao.dono.sessionId === fim.sessionId ? null : conducao;
|
|
750
|
+
}
|
|
705
751
|
function esperaDoCondutor(t, eventos, quando) {
|
|
706
752
|
if (t.status === 'fechada')
|
|
707
753
|
return null;
|
|
@@ -856,7 +902,7 @@ function entregasDoProjeto(carregado, opcoes) {
|
|
|
856
902
|
const semLeituraDaForja = !!prs && !prs.ok && !!prs.semLeitura;
|
|
857
903
|
let retrato = null, semRetrato = prs && !prs.ok ? (semLeituraDaForja ? exports.FORJA_SEM_LEITURA : prs.erro) : 'sem leitura dos PRs';
|
|
858
904
|
if (prs?.ok) {
|
|
859
|
-
const r = prs.retrato, atual =
|
|
905
|
+
const r = prs.retrato, atual = forjaDoRemotoSemRede(carregado, remoto);
|
|
860
906
|
// O retrato vale do mesmo host: o do GitHub Enterprise (`host`) ou, sem ele, o github.com.
|
|
861
907
|
if (r.base !== baseBranch || !atual || r.repositorio !== atual.repositorio || (r.host ?? 'github.com') !== atual.host) {
|
|
862
908
|
semRetrato = 'retrato de PRs de outro repositório ou base';
|
|
@@ -886,9 +932,9 @@ function entregasDoProjeto(carregado, opcoes) {
|
|
|
886
932
|
doCondutor.turnosEncerrados.add(espera.sessionId);
|
|
887
933
|
}
|
|
888
934
|
}
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
const conduzidaAgora =
|
|
935
|
+
// A mesma regra do `ork ship publicar` (RM-059): quem conduz agora, ou ninguem.
|
|
936
|
+
const conducao = conducaoAgora(raiz, t, eventos, quando);
|
|
937
|
+
const conduzidaAgora = conducao !== null;
|
|
892
938
|
const doDono = pendenciaDoDono(t, eventos, quando);
|
|
893
939
|
// A2 do CHECK (rodada 3): depois do veredito do dono, o tempo do condutor conta a partir dele.
|
|
894
940
|
const aprovacao = despacho ? eventos.slice(eventos.lastIndexOf(despacho) + 1).filter(ocupacao_1.ehAprovacaoHumana).at(-1) : undefined;
|
|
@@ -1040,7 +1086,8 @@ function entregasDoProjeto(carregado, opcoes) {
|
|
|
1040
1086
|
: daBranch.fechado ? `branch publicada, PR #${daBranch.fechado.numero} fechado sem merge` : 'branch publicada sem PR')
|
|
1041
1087
|
: null;
|
|
1042
1088
|
estados.push({ thread: t.id, branch: f.branch, comProduto: f.comProduto, publicada, pr: prDaEntrega,
|
|
1043
|
-
prLidoEm: prLido && (usouPr || aberto) ? prLido.lidoEm : null, prNaoLido, conduzidaAgora,
|
|
1089
|
+
prLidoEm: prLido && (usouPr || aberto) ? prLido.lidoEm : null, prNaoLido, conduzidaAgora,
|
|
1090
|
+
donoDaConducao: conduzidaAgora && conducao ? conducao.dono.tipo : null, espera, parado, resumo });
|
|
1044
1091
|
}
|
|
1045
1092
|
// As sessoes `blocked` sem pergunta que sobraram: de thread fechada, ou de despacho antigo de thread aberta.
|
|
1046
1093
|
// A do despacho corrente fica com o predicado do ledger (`esperaDoCondutor`). Sem o carimbo do radar nao
|