@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
package/dist/pulse.js
CHANGED
|
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.JANELA_DAS_DECISOES_MS = exports.CONTRATO_PULSE = void 0;
|
|
4
4
|
exports.apresentacaoCurtaDoItem = apresentacaoCurtaDoItem;
|
|
5
5
|
exports.comporPulse = comporPulse;
|
|
6
|
+
exports.comandoDaAcaoDaVarredura = comandoDaAcaoDaVarredura;
|
|
7
|
+
exports.textoDaAcaoDaVarredura = textoDaAcaoDaVarredura;
|
|
8
|
+
exports.varreduraDoPulse = varreduraDoPulse;
|
|
6
9
|
exports.montarPulse = montarPulse;
|
|
10
|
+
exports.filaDoDono = filaDoDono;
|
|
7
11
|
exports.textoDoPulse = textoDoPulse;
|
|
8
12
|
const escopo_escrita_1 = require("./escopo-escrita");
|
|
9
13
|
/** D4: uma fila para quem precisa de humano, com fontes e espera observada. */
|
|
@@ -14,12 +18,18 @@ const master_1 = require("./master");
|
|
|
14
18
|
const master_batch_1 = require("./master-batch");
|
|
15
19
|
const orquestracao_1 = require("./orquestracao");
|
|
16
20
|
const impedimento_1 = require("./impedimento");
|
|
21
|
+
const runtime_escada_1 = require("./runtime-escada");
|
|
22
|
+
const autorizacao_duravel_1 = require("./autorizacao-duravel");
|
|
23
|
+
const varredura_acoes_1 = require("./varredura-acoes");
|
|
24
|
+
const conducao_batida_1 = require("./conducao-batida");
|
|
25
|
+
const maquina_ociosa_1 = require("./maquina-ociosa");
|
|
17
26
|
const thread_1 = require("./thread");
|
|
18
27
|
const sessoes_adopt_1 = require("./sessoes-adopt");
|
|
19
28
|
const ledger_1 = require("./ledger");
|
|
20
29
|
const types_1 = require("./types");
|
|
21
30
|
const util_1 = require("./util");
|
|
22
31
|
const horario_1 = require("./horario");
|
|
32
|
+
const locale_1 = require("./locale");
|
|
23
33
|
const hitl_presentation_1 = require("./hitl-presentation");
|
|
24
34
|
const hitl_contract_1 = require("./hitl-contract");
|
|
25
35
|
const hitl_curto_1 = require("./hitl-curto");
|
|
@@ -173,21 +183,47 @@ function comporPulse(carregado, entrada) {
|
|
|
173
183
|
fontes: ['monitor'], contextoLogs: [] };
|
|
174
184
|
// RM-055: o impedimento do despacho sai no contrato curto, com o comando exato e o re-despacho depois.
|
|
175
185
|
if (p.impedimento) {
|
|
186
|
+
item.impedimento = { motivo: p.motivo, comando: p.impedimento.comando, retry: `ork retry run ${l.thread}` };
|
|
176
187
|
try {
|
|
177
188
|
const curto = (0, impedimento_1.pedidoCurtoDoImpedimento)({ thread: l.thread, fase: p.fase, motivo: p.motivo, detalhe: p.detalhe,
|
|
178
189
|
desdeEm: p.desdeEm, impedimento: p.impedimento }, quando);
|
|
179
190
|
item.apresentacaoCurta = { telegram: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'telegram'), terminal: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'terminal') };
|
|
180
|
-
item.opcoes = curto.alternativas.map(a => `${a.chave}. ${a.texto}`);
|
|
181
|
-
item.comandoResposta =
|
|
191
|
+
item.opcoes = curto.alternativas.map(a => (0, locale_1.textoDoCatalogo)((m) => `${a.chave}. ${m.pulse.alternativaDoImpedimento(a.texto)}`));
|
|
192
|
+
item.comandoResposta = item.impedimento.retry;
|
|
182
193
|
}
|
|
183
194
|
catch {
|
|
184
195
|
item.evidencia.push('Pedido curto do impedimento indisponível; a correção acima vale.');
|
|
185
196
|
}
|
|
186
197
|
}
|
|
198
|
+
// RM-063 (F4): a escada de recuperacao do runtime que acabou sai como o impedimento, com o comando que confere o
|
|
199
|
+
// runtime, o que retoma a fase com o mesmo prompt e o pedido curto com as tres alternativas (RM-057).
|
|
200
|
+
if (p.escada) {
|
|
201
|
+
item.impedimento = { motivo: p.motivo, comando: p.escada.conferir, retry: p.escada.retomar };
|
|
202
|
+
item.comandoResposta = p.escada.retomar;
|
|
203
|
+
try {
|
|
204
|
+
const curto = (0, runtime_escada_1.pedidoCurtoDaEscada)({ thread: l.thread, fase: p.fase, desdeEm: p.desdeEm, escada: p.escada }, quando);
|
|
205
|
+
item.apresentacaoCurta = { telegram: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'telegram'), terminal: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'terminal') };
|
|
206
|
+
item.opcoes = curto.alternativas.map(a => (0, locale_1.textoDoCatalogo)((m) => `${a.chave}. ${m.pulse.alternativaDoImpedimento(a.texto)}`));
|
|
207
|
+
const recomendada = curto.alternativas.find(a => a.recomendada);
|
|
208
|
+
if (recomendada)
|
|
209
|
+
item.recomendacao = `${recomendada.chave}. ${recomendada.texto}: ${recomendada.recomendada.porque}`;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
item.evidencia.push('Pedido curto da escada indisponível; a correção acima vale.');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
187
215
|
// I-45: vaga parada e sinal do escalonador (`ork board reap` devolve a vaga), nao pergunta ao dono.
|
|
188
216
|
const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale'].includes(p.motivo);
|
|
189
217
|
(esperaAutomatica ? automaticas : humanos).push(item);
|
|
190
218
|
}
|
|
219
|
+
// RM-063 (F5): o MASTER por omissao da varredura nao vira item do dono (I-45: a entrega sem nota fica na faixa
|
|
220
|
+
// automatica). Ele completa o item da entrega com o comando desta thread so (RM-008) e com quem o faz agora.
|
|
221
|
+
const v = entrada.varredura;
|
|
222
|
+
const recomendacaoDaVarredura = (a) => a.quemFaz === 'varredura' && v.autorizacao.por && v.autorizacao.ate
|
|
223
|
+
? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.daVarredura(v.autorizacao.por, (0, horario_1.formatarDataHoraRotulada)(v.autorizacao.ate, { agora: quando })))
|
|
224
|
+
: a.bloqueio ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comBloqueioRecomendacao(a.thread, a.comando))
|
|
225
|
+
: (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.doDono(a.acao));
|
|
226
|
+
const masterDaVarredura = new Map((v?.pendentes ?? []).filter(a => a.acao === 'master').map(a => [a.thread, a]));
|
|
191
227
|
for (const b of batch) {
|
|
192
228
|
const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(carregado.raiz, b.thread.id));
|
|
193
229
|
const desde = eventos.filter(e => e.tipo === 'ship_done').at(-1)?.ts ??
|
|
@@ -204,19 +240,45 @@ function comporPulse(carregado, entrada) {
|
|
|
204
240
|
recomendacao: 'Aceitar por padrão com registro; a nota humana, quando vier, sobrescreve.',
|
|
205
241
|
comandoResposta: 'ork master --aceitar-omissao',
|
|
206
242
|
evidencia: [`ork master; regime ${b.regime}`], fontes: ['master'], contextoLogs: [] });
|
|
243
|
+
const daVarredura = masterDaVarredura.get(b.thread.id);
|
|
244
|
+
if (daVarredura) {
|
|
245
|
+
const item = automaticas[automaticas.length - 1];
|
|
246
|
+
item.comandoResposta = comandoDaAcaoDaVarredura(daVarredura);
|
|
247
|
+
item.recomendacao = recomendacaoDaVarredura(daVarredura);
|
|
248
|
+
if (daVarredura.bloqueio || daVarredura.recusa)
|
|
249
|
+
item.pergunta = `${item.pergunta} ${textoDaAcaoDaVarredura(daVarredura)}`;
|
|
250
|
+
item.evidencia.push(daVarredura.evidencia);
|
|
251
|
+
if (!item.fontes.includes('varredura'))
|
|
252
|
+
item.fontes.push('varredura');
|
|
253
|
+
masterDaVarredura.delete(b.thread.id);
|
|
254
|
+
}
|
|
207
255
|
}
|
|
208
256
|
for (const o of orfas) {
|
|
209
257
|
if (ehRegistro(o.thread))
|
|
210
258
|
continue;
|
|
211
259
|
const item = { id: `orfa:${o.thread}:${o.fase}:${o.sessionId}`, classe: o.classe, motivo: o.motivo,
|
|
212
260
|
thread: o.thread, fase: o.fase, sessionId: o.sessionId, desdeEm: o.desdeEm, paradaHaMin: minutos(o.desdeEm, quando),
|
|
213
|
-
impacto: impacto(o.fase), pergunta:
|
|
261
|
+
impacto: impacto(o.fase), pergunta: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semHeartbeat(o.fase, o.ultimoHeartbeatEm)),
|
|
214
262
|
opcoes: [], recomendacao: o.retry.razao,
|
|
215
263
|
comandoResposta: o.retry.automatica ? `ork retry run ${o.thread} --motivo runtime.silencio --fase ${o.fase}` :
|
|
216
264
|
`ork retry plan ${o.thread} --motivo runtime.silencio --fase ${o.fase}`,
|
|
217
265
|
evidencia: [...o.evidencia, `retry ${o.retry.tentativas}/${o.retry.limite}`], fontes: ['liveness'], contextoLogs: [] };
|
|
218
266
|
(o.retry.automatica ? automaticas : humanos).push(item);
|
|
219
267
|
}
|
|
268
|
+
// RM-063 (F5): cada acao da varredura e um item. Sem a autorizacao do dono para ela (ou com bloqueio, ou com a tentativa
|
|
269
|
+
// recusada), e do dono, com o comando pronto; autorizada, e acao automatica da proxima batida. O MASTER ja foi no item
|
|
270
|
+
// da entrega sem nota; so o que sobrou dele (sem item de entrega) entra aqui, na faixa automatica.
|
|
271
|
+
for (const a of v?.pendentes ?? []) {
|
|
272
|
+
if (a.acao === 'master' && !masterDaVarredura.has(a.thread))
|
|
273
|
+
continue;
|
|
274
|
+
const daVarredura = a.quemFaz === 'varredura' || a.acao === 'master';
|
|
275
|
+
const item = { id: `varredura:${a.acao}:${a.thread}${a.sessionId ? `:${a.sessionId.slice(0, 8)}` : ''}`,
|
|
276
|
+
classe: 'varredura', motivo: `varredura.${a.acao}`, thread: a.thread, fase: a.fase, sessionId: null, desdeEm: a.desdeEm,
|
|
277
|
+
paradaHaMin: minutos(a.desdeEm, quando), impacto: impacto(a.fase), pergunta: textoDaAcaoDaVarredura(a), opcoes: [],
|
|
278
|
+
recomendacao: recomendacaoDaVarredura(a), comandoResposta: comandoDaAcaoDaVarredura(a), evidencia: [a.evidencia],
|
|
279
|
+
fontes: ['varredura'], contextoLogs: [] };
|
|
280
|
+
(daVarredura ? automaticas : humanos).push(item);
|
|
281
|
+
}
|
|
220
282
|
const unicos = (items) => [...new Map(items.map(i => [i.id, i])).values()].sort(ordenar);
|
|
221
283
|
const h = unicos(humanos), a = unicos(automaticas);
|
|
222
284
|
for (const item of h) {
|
|
@@ -253,7 +315,30 @@ function comporPulse(carregado, entrada) {
|
|
|
253
315
|
}
|
|
254
316
|
return { contrato: exports.CONTRATO_PULSE, consultadoEm: quando, runtime: { ok: radar.runtimeConsultado, detalhe: radar.runtimeDetalhe },
|
|
255
317
|
precisaDeHumanoAgora: h, acoesAutomaticas: a, resumo: { humanos: h.length, automaticas: a.length, scores: batch.length, fasesOrfas: orfas.length },
|
|
256
|
-
...(entregas?.parados.length ? { paradoNoCondutor: entregas.parados } : {})
|
|
318
|
+
...(entregas?.parados.length ? { paradoNoCondutor: entregas.parados } : {}),
|
|
319
|
+
...(v && (v.pendentes.length || v.feitas.length || v.autorizacao.estado !== 'ausente') ? { varredura: v } : {}) };
|
|
320
|
+
}
|
|
321
|
+
/** RM-063 (F5): com bloqueio, o comando do dono e olhar a thread: a acao iria por cima do trabalho que esta nela. */
|
|
322
|
+
function comandoDaAcaoDaVarredura(a) {
|
|
323
|
+
return a.bloqueio ? `ork thread status ${a.thread}` : a.comando;
|
|
324
|
+
}
|
|
325
|
+
/** RM-063 (F5): o que a acao faz, com o motivo da ultima recusa ou do bloqueio quando ha. */
|
|
326
|
+
function textoDaAcaoDaVarredura(a) {
|
|
327
|
+
return a.recusa ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comRecusa(a.oQue, a.recusa.detalhe))
|
|
328
|
+
: a.bloqueio ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comBloqueio(a.oQue, a.bloqueio)) : a.oQue;
|
|
329
|
+
}
|
|
330
|
+
/** RM-063 (F5): os estados em que a sessao da consulta ja nao trabalha na worktree. */
|
|
331
|
+
const TERMINAIS_DA_CONSULTA = ['failed', 'done', 'stopped', 'completed', 'exited'];
|
|
332
|
+
/** RM-063 (F5): a autorizacao e as acoes como o pulse as leva: cada acao com quem a faz agora. */
|
|
333
|
+
function varreduraDoPulse(leitura, pendentes, feitas) {
|
|
334
|
+
const a = leitura.valida ? leitura.autorizacao : null;
|
|
335
|
+
return {
|
|
336
|
+
autorizacao: { estado: leitura.valida ? 'valida' : leitura.motivo === 'autorizacao.ausente' ? 'ausente' : 'invalida',
|
|
337
|
+
motivo: leitura.valida ? null : leitura.motivo, detalhe: leitura.valida ? null : leitura.detalhe,
|
|
338
|
+
por: a?.por ?? null, ate: a?.ate ?? null, pode: a ? [...a.pode] : [] },
|
|
339
|
+
pendentes: pendentes.map((p) => ({ ...p, quemFaz: (0, autorizacao_duravel_1.autorizada)(leitura, p.acao) && !p.bloqueio && !p.recusa ? 'varredura' : 'dono' })),
|
|
340
|
+
feitas: feitas.map((f) => ({ acao: f.acao, thread: f.thread, detalhe: f.detalhe, em: f.em, eventId: f.eventId })),
|
|
341
|
+
};
|
|
257
342
|
}
|
|
258
343
|
function montarPulse(carregado, opcoes = {}) {
|
|
259
344
|
if (opcoes.registrar)
|
|
@@ -261,11 +346,12 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
261
346
|
const diagnosticos = [];
|
|
262
347
|
const quando = opcoes.quando ?? (0, util_1.agora)();
|
|
263
348
|
const consulta = opcoes.consulta ?? (opcoes.semRuntime
|
|
264
|
-
? { ok: false, sessoes: [], detalhe:
|
|
349
|
+
? { ok: false, sessoes: [], detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semRuntime) } : (0, claude_bg_1.consultarSessoes)(undefined, true));
|
|
265
350
|
const estados = consulta.ok ? new Map(consulta.sessoes.map(s => [s.sessionId ?? '', (0, hitl_1.estadoBruto)(s)])) : null;
|
|
266
351
|
const radar = (0, hitl_1.varrerSessoes)({ raiz: carregado.raiz, consulta, agora: quando, registrar: opcoes.registrar, escopo: opcoes.escopo, linhasLogs: opcoes.linhasLogs });
|
|
267
|
-
|
|
268
|
-
|
|
352
|
+
const telasAdiadas = radar.telasAdiadas;
|
|
353
|
+
if (telasAdiadas)
|
|
354
|
+
diagnosticos.push((0, locale_1.textoDoCatalogo)((m) => m.pulse.telasAdiadas(telasAdiadas)));
|
|
269
355
|
// Falha de observação não prova silêncio: Claude indisponível preserva sua guarda de HITL e Codex mantém sua coleta independente.
|
|
270
356
|
const orfas = (0, liveness_1.detectarFasesOrfas)(carregado, { quando, registrar: opcoes.registrar, escopo: opcoes.escopo, diagnosticos,
|
|
271
357
|
fontes: opcoes.fontes, estados: estados ?? undefined, runtimes: consulta.ok ? undefined : ['codex'] });
|
|
@@ -284,8 +370,9 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
284
370
|
// retrato que o status do roadmap le sem rede. Falha de leitura e diagnostico, nunca "sem PR".
|
|
285
371
|
let entregas;
|
|
286
372
|
try {
|
|
287
|
-
entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: (candidatas) => {
|
|
288
|
-
const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas
|
|
373
|
+
entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: opcoes.semForja ? () => null : (candidatas) => {
|
|
374
|
+
const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas, rodar: opcoes.rodarDaForja,
|
|
375
|
+
sondas: opcoes.sondasDaForja });
|
|
289
376
|
if (leitura.ok) {
|
|
290
377
|
try {
|
|
291
378
|
(0, parado_no_condutor_1.gravarRetratoDePrs)(carregado.raiz, leitura.retrato);
|
|
@@ -315,8 +402,34 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
315
402
|
catch (e) {
|
|
316
403
|
diagnosticos.push(`entregas.indisponiveis: ${e.message.slice(0, 120)}`);
|
|
317
404
|
}
|
|
318
|
-
|
|
319
|
-
|
|
405
|
+
// RM-063 (F5): o que a varredura faria sozinha, com a autorizacao duravel desta maquina. Leitura; falhar aqui nunca
|
|
406
|
+
// derruba a fila de atencao.
|
|
407
|
+
let varredura;
|
|
408
|
+
try {
|
|
409
|
+
const leitura = (0, autorizacao_duravel_1.lerAutorizacao)(carregado.raiz, { projeto: carregado.manifesto.project.name, agora: new Date(quando) });
|
|
410
|
+
// Com a consulta injetada (os testes) ou sem o runtime, as sessoes vem dela: sem a leitura, nada se afirma, e o
|
|
411
|
+
// registro e o MASTER ficam com o dono (`sessoes-sem-leitura`).
|
|
412
|
+
const injetada = opcoes.fantasmas || opcoes.consulta || opcoes.semRuntime;
|
|
413
|
+
const consultada = consulta;
|
|
414
|
+
const pendentes = (0, varredura_acoes_1.acoesPendentes)(carregado, { quando, ...(injetada ? {
|
|
415
|
+
fantasmas: opcoes.fantasmas ?? (() => null),
|
|
416
|
+
vivas: () => consultada.ok ? consultada.sessoes.filter((s) => typeof s.cwd === 'string' && !TERMINAIS_DA_CONSULTA.includes((0, hitl_1.estadoBruto)(s)))
|
|
417
|
+
.map((s) => ({ sessionId: s.sessionId, cwd: s.cwd })) : null,
|
|
418
|
+
} : {}) });
|
|
419
|
+
// RM-063 (F7): o merge e o despacho que a ultima batida da conducao deixou pendentes (check pendente, sem autorizacao,
|
|
420
|
+
// conflito em codigo, PR em rascunho, fase sem prompt gravado), do retrato dela, enquanto ele vale.
|
|
421
|
+
pendentes.push(...(0, conducao_batida_1.pendentesDaUltimaBatida)(carregado.raiz, quando));
|
|
422
|
+
const feitas = (0, varredura_acoes_1.acoesFeitasDesde)(carregado.raiz, new Date(Date.parse(quando) - exports.JANELA_DAS_DECISOES_MS).toISOString());
|
|
423
|
+
varredura = varreduraDoPulse(leitura, pendentes, feitas);
|
|
424
|
+
}
|
|
425
|
+
catch (e) {
|
|
426
|
+
diagnosticos.push(`varredura.indisponivel: ${e.message.slice(0, 120)}`);
|
|
427
|
+
}
|
|
428
|
+
const pulse = comporPulse(carregado, { radar, monitor, orfas, batch: (0, master_1.pendentesDeScore)(carregado.raiz), ...(entregas ? { entregas } : {}),
|
|
429
|
+
...(varredura ? { varredura } : {}) });
|
|
430
|
+
// RM-061 (F2b, G2): a linha de conducao e da familia `thread` e segue o locale ativo; o JSON a guarda em pt-BR.
|
|
431
|
+
const conducoes = monitor.linhas.filter((l) => l.conducao)
|
|
432
|
+
.map((l) => ({ thread: l.thread, linha: (0, locale_1.textoDoCatalogo)(() => (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando })) }));
|
|
320
433
|
if (conducoes.length > 0)
|
|
321
434
|
pulse.conducoes = conducoes;
|
|
322
435
|
// B4: a metade que presta contas. Leitura pura; falhar aqui nunca derruba a fila de atencao.
|
|
@@ -337,43 +450,96 @@ function montarPulse(carregado, opcoes = {}) {
|
|
|
337
450
|
catch (e) {
|
|
338
451
|
diagnosticos.push(`hitl-conducao.indisponivel: ${e.message.slice(0, 120)}`);
|
|
339
452
|
}
|
|
453
|
+
// RM-063 (F6): a maquina ociosa, leitura pura das vagas, das reservas locais e do passo do condutor.
|
|
454
|
+
try {
|
|
455
|
+
const ociosa = (0, maquina_ociosa_1.maquinaOciosa)(carregado, { quando });
|
|
456
|
+
if (ociosa)
|
|
457
|
+
pulse.maquinaOciosa = ociosa;
|
|
458
|
+
}
|
|
459
|
+
catch (e) {
|
|
460
|
+
diagnosticos.push(`ociosidade.indisponivel: ${e.message.slice(0, 120)}`);
|
|
461
|
+
}
|
|
340
462
|
if (diagnosticos.length)
|
|
341
463
|
pulse.runtime.detalhe = [pulse.runtime.detalhe, ...diagnosticos].filter(Boolean).join('; ');
|
|
342
464
|
return pulse;
|
|
343
465
|
}
|
|
466
|
+
/**
|
|
467
|
+
* RM-063 (F2): a fila do dono que o `ork roadmap status` le, a MESMA do `ork pulse` (`precisaDeHumanoAgora`). Em 12/10/2026
|
|
468
|
+
* o status disse "Nada agora" com o pulse contando 3: as duas superficies montavam a fila cada uma do seu jeito. Sem
|
|
469
|
+
* forja e sem registrar; o texto de cada item sai numa linha, redigido.
|
|
470
|
+
*/
|
|
471
|
+
function filaDoDono(carregado, opcoes = {}) {
|
|
472
|
+
const linha = (texto, teto) => {
|
|
473
|
+
const limpo = (0, hitl_1.redigirSegredos)(texto).replace(/[\p{Cc}\s]+/gu, ' ').trim();
|
|
474
|
+
return limpo.length > teto ? `${limpo.slice(0, teto - 3)}...` : limpo;
|
|
475
|
+
};
|
|
476
|
+
try {
|
|
477
|
+
const p = montarPulse(carregado, { quando: opcoes.quando, semForja: true });
|
|
478
|
+
// Sem o `claude` nesta maquina nao ha sessao dele a perder: a fila do monitor e do ledger esta inteira.
|
|
479
|
+
const lida = p.runtime.ok || !(0, util_1.noPath)('claude');
|
|
480
|
+
return { lida, detalhe: lida ? null : linha(p.runtime.detalhe, 160),
|
|
481
|
+
itens: p.precisaDeHumanoAgora.map(i => ({ id: i.id, thread: i.thread, sessionId: i.sessionId, fase: i.fase, classe: i.classe,
|
|
482
|
+
motivo: i.motivo, pergunta: linha(i.pergunta || i.motivo, 200), comando: linha(i.comandoResposta, 160), paradaHaMin: i.paradaHaMin })) };
|
|
483
|
+
}
|
|
484
|
+
catch (e) {
|
|
485
|
+
return { lida: false, detalhe: linha(e.message, 160), itens: [] };
|
|
486
|
+
}
|
|
487
|
+
}
|
|
344
488
|
function textoDoPulse(p) {
|
|
489
|
+
const m = (0, locale_1.msg)().pulse;
|
|
345
490
|
// I-35: o pulse guarda ISO; o texto ao dono sai no fuso dele, rotulado no cabeçalho.
|
|
346
|
-
|
|
347
|
-
const
|
|
491
|
+
// RM-061 (F2b, G2): o que o pulse montou pelo catalogo sai remontado; o resto (pedido HITL, ledger) como veio.
|
|
492
|
+
const local = (texto) => (0, horario_1.localizarTexto)((0, locale_1.remontar)(texto), { agora: p.consultadoEm });
|
|
493
|
+
// O detalhe do runtime junta partes separadas por "; ": cada uma e remontada.
|
|
494
|
+
const detalhe = (texto) => (0, horario_1.localizarTexto)(texto.split('; ').map(locale_1.remontar).join('; '), { agora: p.consultadoEm });
|
|
495
|
+
const linhas = [m.cabecalho(p.contrato, (0, horario_1.formatarDataHoraRotulada)(p.consultadoEm, { agora: p.consultadoEm })), m.precisaDeHumano(p.resumo.humanos), m.semNota(p.resumo.scores)];
|
|
348
496
|
// RM-037 (fatia 4): PR nao lido tambem e dito, para a falta de linha do condutor nao parecer "nada parado".
|
|
349
497
|
if (p.runtime.ok && ['liveness.snapshot.invalid', 'prs.nao-lidos', 'prs.sem-leitura', 'entregas.indisponiveis'].some(d => p.runtime.detalhe.includes(d))) {
|
|
350
|
-
linhas.push(
|
|
498
|
+
linhas.push(m.diagnostico(detalhe(p.runtime.detalhe)));
|
|
351
499
|
}
|
|
352
500
|
if (!p.runtime.ok)
|
|
353
|
-
linhas.push(
|
|
501
|
+
linhas.push(m.consultaIncompleta(detalhe(p.runtime.detalhe)));
|
|
354
502
|
for (const i of p.precisaDeHumanoAgora) {
|
|
355
|
-
linhas.push('',
|
|
503
|
+
linhas.push('', m.item(String(i.thread ?? i.sessionId), m.classe(i.classe), i.paradaHaMin == null ? m.desconhecido : i.paradaHaMin < 1 ? m.menosDeUm : String(i.paradaHaMin)), local(i.pergunta), ...i.opcoes.map(o => m.opcao((0, locale_1.remontar)(o))), m.recomendacao((0, locale_1.remontar)(i.recomendacao)), m.responder((0, locale_1.remontar)(i.comandoResposta)), ...i.contextoLogs.map(l => m.log(l)));
|
|
356
504
|
}
|
|
357
505
|
if (p.conducoes?.length) {
|
|
358
|
-
linhas.push('',
|
|
506
|
+
linhas.push('', m.conduzidas(p.conducoes.length));
|
|
359
507
|
for (const c of p.conducoes)
|
|
360
|
-
linhas.push(
|
|
508
|
+
linhas.push(m.conducao(c.thread, (0, locale_1.remontar)(c.linha)));
|
|
361
509
|
}
|
|
362
510
|
// RM-037 (fatia 4): o que espera o condutor, uma linha por thread; nao e pergunta ao dono.
|
|
363
511
|
if (p.paradoNoCondutor?.length) {
|
|
364
|
-
linhas.push('',
|
|
512
|
+
linhas.push('', m.paradoNoCondutor(p.paradoNoCondutor.length));
|
|
365
513
|
for (const x of p.paradoNoCondutor)
|
|
366
514
|
linhas.push((0, hitl_resumo_1.linhaDoParadoNoCondutor)(x, { agora: p.consultadoEm }));
|
|
367
515
|
}
|
|
368
516
|
// RM-057 (fatia 3): quanto tempo cada pergunta de conducao aberta ja parou a thread, e a mediana da semana.
|
|
369
517
|
if (p.hitlDeConducao) {
|
|
370
518
|
const h = p.hitlDeConducao;
|
|
371
|
-
linhas.push('',
|
|
519
|
+
linhas.push('', m.hitlDeConducao(h.abertas.length, (0, hitl_tempo_parado_1.textoDaMediana)(h)));
|
|
372
520
|
for (const a of h.abertas)
|
|
373
521
|
linhas.push((0, hitl_tempo_parado_1.linhaDaPerguntaParada)(a, { agora: p.consultadoEm }));
|
|
374
522
|
}
|
|
375
|
-
linhas.push('',
|
|
523
|
+
linhas.push('', m.automaticas(p.resumo.automaticas));
|
|
524
|
+
// RM-061 (F2b, D4): o item do radar sem tipo de HITL usa a classe como motivo; ela sai pelo id, o motivo tipado fica.
|
|
376
525
|
for (const i of p.acoesAutomaticas)
|
|
377
|
-
linhas.push(
|
|
526
|
+
linhas.push(m.automatica(String(i.thread), i.motivo === i.classe ? m.classe(i.motivo) : i.motivo, (0, locale_1.remontar)(i.comandoResposta)));
|
|
527
|
+
// RM-063 (F5): a autorizacao da varredura e o que ela fez sozinha na semana.
|
|
528
|
+
if (p.varredura) {
|
|
529
|
+
const v = p.varredura, a = v.autorizacao;
|
|
530
|
+
linhas.push('', a.estado === 'valida' ? m.varredura.autorizacaoValida(String(a.por), (0, horario_1.formatarDataHoraRotulada)(String(a.ate), { agora: p.consultadoEm }), a.pode.join(', ')) : a.estado === 'ausente' ? m.varredura.autorizacaoAusente : m.varredura.autorizacaoInvalida(String(a.motivo), String(a.detalhe)));
|
|
531
|
+
if (v.feitas.length) {
|
|
532
|
+
linhas.push(m.varredura.feitas(v.feitas.length));
|
|
533
|
+
for (const f of v.feitas)
|
|
534
|
+
linhas.push(m.varredura.feita(f.thread, f.acao, f.detalhe));
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
// RM-063 (F6): a maquina ociosa e as proximas threads sugeridas.
|
|
538
|
+
if (p.maquinaOciosa) {
|
|
539
|
+
const o = p.maquinaOciosa;
|
|
540
|
+
linhas.push('', m.ociosa.linha(o.maquina, o.livres, o.limite, o.reservados));
|
|
541
|
+
for (const s of o.sugeridas)
|
|
542
|
+
linhas.push(m.ociosa.sugerida(s.item, s.thread ? `${s.thread}, ${s.fase}` : m.ociosa.semThread, (0, locale_1.remontar)(s.passo), s.comando));
|
|
543
|
+
}
|
|
378
544
|
return linhas.join('\n');
|
|
379
545
|
}
|
package/dist/ratelimit.js
CHANGED
|
@@ -59,6 +59,7 @@ exports.dirRetry = dirRetry;
|
|
|
59
59
|
exports.caminhoDaFila = caminhoDaFila;
|
|
60
60
|
exports.lerFilaDeRetomada = lerFilaDeRetomada;
|
|
61
61
|
exports.janelaPadraoMs = janelaPadraoMs;
|
|
62
|
+
exports.arcoDoPedido = arcoDoPedido;
|
|
62
63
|
exports.enfileirar = enfileirar;
|
|
63
64
|
exports.prazoDaConta = prazoDaConta;
|
|
64
65
|
exports.prazoDaCotaVista = prazoDaCotaVista;
|
|
@@ -73,6 +74,7 @@ const path = __importStar(require("node:path"));
|
|
|
73
74
|
const manifest_1 = require("./manifest");
|
|
74
75
|
const util_1 = require("./util");
|
|
75
76
|
const horario_1 = require("./horario");
|
|
77
|
+
const locale_1 = require("./locale");
|
|
76
78
|
const runtime_profiles_1 = require("./runtime-profiles");
|
|
77
79
|
var claude_bg_1 = require("./adapters/claude-bg");
|
|
78
80
|
Object.defineProperty(exports, "parseRateLimit", { enumerable: true, get: function () { return claude_bg_1.parseRateLimit; } });
|
|
@@ -103,6 +105,11 @@ function lerFilaDeRetomada(raiz) {
|
|
|
103
105
|
function janelaPadraoMs(manifesto) {
|
|
104
106
|
return manifesto.retry.janela_padrao_min * 60 * 1000;
|
|
105
107
|
}
|
|
108
|
+
/** RM-058 N4 (D17): o arco #Noctum do pedido, quando o despacho que caiu no limite de uso era dele. */
|
|
109
|
+
function arcoDoPedido(pedido) {
|
|
110
|
+
const c = pedido.correlacao;
|
|
111
|
+
return typeof c === 'string' && c.startsWith('noctum:') && c.length > 'noctum:'.length ? c.slice('noctum:'.length) : null;
|
|
112
|
+
}
|
|
106
113
|
/**
|
|
107
114
|
* Enfileira a fase morta por rate limit.
|
|
108
115
|
*
|
|
@@ -136,6 +143,7 @@ function enfileirar(carregado, novo, agoraMs = Date.now()) {
|
|
|
136
143
|
...(novo.runtime !== undefined ? { runtime: novo.runtime } : {}),
|
|
137
144
|
...(novo.perfil !== undefined ? { perfil: novo.perfil } : {}),
|
|
138
145
|
...(novo.motivo !== undefined ? { motivo: novo.motivo } : {}),
|
|
146
|
+
...(novo.correlacao ? { correlacao: novo.correlacao } : {}),
|
|
139
147
|
};
|
|
140
148
|
(0, util_1.anexarJsonl)(caminhoDaFila(raiz), pedido);
|
|
141
149
|
return pedido;
|
|
@@ -204,26 +212,28 @@ function vencidos(raiz, quando = (0, util_1.agora)()) {
|
|
|
204
212
|
/** Quanto falta para a janela de um pedido, em texto curto para o CLI. */
|
|
205
213
|
function faltaPara(pedido, quando = (0, util_1.agora)()) {
|
|
206
214
|
const ms = new Date(pedido.liberaEm).getTime() - new Date(quando).getTime();
|
|
215
|
+
const m = (0, locale_1.msg)().horario;
|
|
207
216
|
if (ms <= 0)
|
|
208
|
-
return
|
|
217
|
+
return m.jaLiberou;
|
|
209
218
|
const min = Math.ceil(ms / 60000);
|
|
210
|
-
return min < 60 ?
|
|
219
|
+
return min < 60 ? m.emMinutos(min) : m.emHoras(Math.floor(min / 60), String(min % 60).padStart(2, '0'));
|
|
211
220
|
}
|
|
212
221
|
/** Tabela de `ork retry list`. */
|
|
213
222
|
function tabelaDaFila(raiz, quando = (0, util_1.agora)()) {
|
|
214
223
|
const fila = lerFilaDeRetomada(raiz).sort((a, b) => a.id.localeCompare(b.id, 'en', { numeric: true }));
|
|
224
|
+
const m = (0, locale_1.msg)().retry.complementar;
|
|
215
225
|
if (fila.length === 0) {
|
|
216
|
-
return
|
|
226
|
+
return m.filaVazia;
|
|
217
227
|
}
|
|
218
228
|
const linhas = fila.map((p) => [
|
|
219
229
|
p.id,
|
|
220
230
|
p.thread,
|
|
221
231
|
p.fase,
|
|
222
|
-
p.estado,
|
|
232
|
+
m.estados[p.estado] ?? p.estado,
|
|
223
233
|
(0, horario_1.formatarDataHora)(p.liberaEm, { agora: quando }),
|
|
224
|
-
p.janelaEstimada ?
|
|
234
|
+
p.janelaEstimada ? m.horaEstimada(p.sinal.fonte) : m.horaRuntime(p.sinal.fonte),
|
|
225
235
|
p.estado === 'aguardando' ? faltaPara(p, quando) : '',
|
|
226
236
|
String(p.tentativas),
|
|
227
237
|
]);
|
|
228
|
-
return (0, util_1.tabela)([
|
|
238
|
+
return (0, util_1.tabela)([...m.colunasFila], linhas) + `\n${(0, horario_1.legendaDoFuso)(undefined, quando)}`;
|
|
229
239
|
}
|
package/dist/recall.js
CHANGED
|
@@ -65,6 +65,7 @@ const memoria_1 = require("./memoria");
|
|
|
65
65
|
const orkmind_1 = require("./orkmind");
|
|
66
66
|
const thread_1 = require("./thread");
|
|
67
67
|
const util_1 = require("./util");
|
|
68
|
+
const locale_1 = require("./locale");
|
|
68
69
|
/** Momento do ponteiro e momento pedido casam? Comparacao exata, sem case. */
|
|
69
70
|
function momentoCasa(ponteiro, momento) {
|
|
70
71
|
return ponteiro.retrieve_when.trim().toLowerCase() === momento.trim().toLowerCase();
|
|
@@ -291,18 +292,18 @@ function recallDaThread(carregado, memoria, threadId, opcoes = {}) {
|
|
|
291
292
|
}
|
|
292
293
|
/** Texto de `ork recall`. */
|
|
293
294
|
function textoDoRecall(r, comConteudo = true) {
|
|
295
|
+
const m = (0, locale_1.msg)().operacao.restante.recall;
|
|
294
296
|
const linhas = [];
|
|
295
|
-
linhas.push(
|
|
296
|
-
`(regime efetivo ${r.regime}, handoff escrito em regime ${r.regimeDoHandoff})`);
|
|
297
|
+
linhas.push(m.titulo(r.thread, r.momento ?? m.todos, r.regime, r.regimeDoHandoff));
|
|
297
298
|
linhas.push('');
|
|
298
|
-
linhas.push(
|
|
299
|
+
linhas.push(m.resolvidos(r.resolvidos.length));
|
|
299
300
|
for (const p of r.resolvidos) {
|
|
300
301
|
linhas.push(` ${p.id} ${p.titulo}`);
|
|
301
|
-
linhas.push(
|
|
302
|
-
linhas.push(
|
|
302
|
+
linhas.push(m.via(p.via, p.metodo));
|
|
303
|
+
linhas.push(m.location(p.location));
|
|
303
304
|
if (p.orkmind)
|
|
304
305
|
linhas.push(` orkmind ${p.orkmind}`);
|
|
305
|
-
linhas.push(
|
|
306
|
+
linhas.push(m.quando(p.retrieve_when));
|
|
306
307
|
if (comConteudo) {
|
|
307
308
|
linhas.push('');
|
|
308
309
|
for (const l of p.conteudo.split('\n'))
|
|
@@ -311,20 +312,20 @@ function textoDoRecall(r, comConteudo = true) {
|
|
|
311
312
|
}
|
|
312
313
|
}
|
|
313
314
|
linhas.push('');
|
|
314
|
-
linhas.push(
|
|
315
|
+
linhas.push(m.adiados(r.adiados.length));
|
|
315
316
|
for (const p of r.adiados) {
|
|
316
317
|
linhas.push(` ${p.id} ${p.titulo}`);
|
|
317
|
-
linhas.push(
|
|
318
|
-
linhas.push(
|
|
319
|
-
linhas.push(
|
|
318
|
+
linhas.push(m.quando(p.retrieve_when));
|
|
319
|
+
linhas.push(m.onde(p.location));
|
|
320
|
+
linhas.push(m.recuperar(r.thread, p.retrieve_when));
|
|
320
321
|
}
|
|
321
322
|
if (r.falhas.length > 0) {
|
|
322
323
|
linhas.push('');
|
|
323
|
-
linhas.push(
|
|
324
|
+
linhas.push(m.falhas(r.falhas.length));
|
|
324
325
|
for (const p of r.falhas) {
|
|
325
326
|
linhas.push(` ${p.id} ${p.titulo}`);
|
|
326
|
-
linhas.push(
|
|
327
|
-
linhas.push(
|
|
327
|
+
linhas.push(m.motivo(p.motivo));
|
|
328
|
+
linhas.push(m.detalhe(p.detalhe));
|
|
328
329
|
}
|
|
329
330
|
}
|
|
330
331
|
return linhas.join('\n');
|
package/dist/redacao-saida.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.LIMITE_DE_TESTES = exports.LIMITE_DO_TRECHO = void 0;
|
|
4
4
|
exports.redigirSaida = redigirSaida;
|
|
5
5
|
exports.testesQueCairam = testesQueCairam;
|
|
6
|
+
exports.falhasDeTeste = falhasDeTeste;
|
|
6
7
|
/**
|
|
7
8
|
* I-37 (D9): a saida de um comando que falhou, pronta para ir ao ledger.
|
|
8
9
|
*
|
|
@@ -41,5 +42,67 @@ function testesQueCairam(saida) {
|
|
|
41
42
|
if (nomes.length === exports.LIMITE_DE_TESTES)
|
|
42
43
|
break;
|
|
43
44
|
}
|
|
45
|
+
// RM-037 (fatia 6): o reporter `spec`, o padrao do `node --test` 24 fora de TTY, nao imprime `not ok`;
|
|
46
|
+
// os nomes moram na secao "failing tests" do fim da saida.
|
|
47
|
+
if (nomes.length === 0)
|
|
48
|
+
return falhasDeTeste(saida).map((f) => f.nome).slice(0, exports.LIMITE_DE_TESTES);
|
|
44
49
|
return nomes;
|
|
45
50
|
}
|
|
51
|
+
/** As frases do `node --test` para a falha que e do relogio, e nao da asercao. */
|
|
52
|
+
const ASSINATURA_DE_RELOGIO = /test timed out after \d+ms|test did not finish before its parent and was cancelled/;
|
|
53
|
+
const TIPO_DE_RELOGIO = /failureType:\s*'(?:testTimeoutFailure|cancelledByParent)'/;
|
|
54
|
+
/** O teste que so agrega os filhos (subtestes ou arquivo) nao e uma falha por si. */
|
|
55
|
+
const TIPO_DE_AGREGADO = /failureType:\s*'subtestsFailed'/;
|
|
56
|
+
/**
|
|
57
|
+
* RM-037 (fatia 6): os testes reprovados, folha a folha, com a natureza da falha, para o verify saber
|
|
58
|
+
* se a reprovacao e so de relogio. Le o TAP do `node --test` (o bloco YAML depois do `not ok`, pulando
|
|
59
|
+
* o agregado `subtestsFailed`) e a secao "failing tests" do reporter `spec`. Outros runners (jest,
|
|
60
|
+
* vitest) nao dizem a natureza: os nomes saem com `relogio: false`, e nada e atenuado.
|
|
61
|
+
*/
|
|
62
|
+
function falhasDeTeste(saida) {
|
|
63
|
+
const linhas = saida.split('\n');
|
|
64
|
+
const falhas = [];
|
|
65
|
+
const somar = (nome, relogio) => {
|
|
66
|
+
const limpo = nome.trim().slice(0, LIMITE_DO_NOME);
|
|
67
|
+
if (!limpo)
|
|
68
|
+
return;
|
|
69
|
+
const ja = falhas.find((f) => f.nome === limpo);
|
|
70
|
+
if (ja)
|
|
71
|
+
ja.relogio = ja.relogio && relogio;
|
|
72
|
+
else
|
|
73
|
+
falhas.push({ nome: limpo, relogio });
|
|
74
|
+
};
|
|
75
|
+
for (let i = 0; i < linhas.length; i++) {
|
|
76
|
+
const tap = /^\s*not ok \d+ - (.+?)\s*(?:#.*)?$/.exec(linhas[i]);
|
|
77
|
+
if (!tap)
|
|
78
|
+
continue;
|
|
79
|
+
const bloco = [];
|
|
80
|
+
for (let j = i + 1; j < linhas.length && !/^\s*(?:not )?ok \d+ /.test(linhas[j]); j++)
|
|
81
|
+
bloco.push(linhas[j]);
|
|
82
|
+
const texto = bloco.join('\n');
|
|
83
|
+
if (TIPO_DE_AGREGADO.test(texto))
|
|
84
|
+
continue;
|
|
85
|
+
somar(tap[1], TIPO_DE_RELOGIO.test(texto) || ASSINATURA_DE_RELOGIO.test(texto));
|
|
86
|
+
}
|
|
87
|
+
const inicio = linhas.findIndex((l) => /^\s*✖ failing tests:\s*$/.test(l));
|
|
88
|
+
if (inicio >= 0) {
|
|
89
|
+
for (let i = inicio + 1; i < linhas.length; i++) {
|
|
90
|
+
const cabeca = /^✖ (.+?)(?: \([\d.]+m?s\))?\s*$/.exec(linhas[i]);
|
|
91
|
+
if (!cabeca)
|
|
92
|
+
continue;
|
|
93
|
+
const corpo = [];
|
|
94
|
+
for (let j = i + 1; j < linhas.length && !/^(?:✖ |test at )/.test(linhas[j]); j++)
|
|
95
|
+
corpo.push(linhas[j]);
|
|
96
|
+
const primeira = corpo.find((l) => l.trim() !== '') ?? '';
|
|
97
|
+
somar(cabeca[1], ASSINATURA_DE_RELOGIO.test(primeira));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (falhas.length === 0) {
|
|
101
|
+
for (const linha of linhas) {
|
|
102
|
+
const fail = /^\s*(?:FAIL|✕|×)\s+(\S.*?)\s*$/.exec(linha);
|
|
103
|
+
if (fail)
|
|
104
|
+
somar(fail[1], false);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return falhas;
|
|
108
|
+
}
|
package/dist/rede-adesao.js
CHANGED
|
@@ -64,6 +64,7 @@ const path = __importStar(require("node:path"));
|
|
|
64
64
|
const maquina_1 = require("./maquina");
|
|
65
65
|
const monitor_lock_1 = require("./monitor-lock");
|
|
66
66
|
const util_1 = require("./util");
|
|
67
|
+
const locale_1 = require("./locale");
|
|
67
68
|
exports.CONTRATO_DA_ADESAO = 'ork.rede/v1';
|
|
68
69
|
exports.REPOSITORIO_PADRAO = 'orkastery-network';
|
|
69
70
|
/**
|
|
@@ -78,6 +79,8 @@ exports.pastaDaRede = pastaDaRede;
|
|
|
78
79
|
const arquivoDaConfig = () => path.join((0, maquina_1.pastaDoUsuario)(), 'rede.json');
|
|
79
80
|
const arquivoDaTentativa = () => path.join((0, exports.pastaDaRede)(), 'tentativa.json');
|
|
80
81
|
const IDENTIFICADOR = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
|
|
82
|
+
/** O dono da casa: o login, ou o caminho de um grupo com subgrupos (`time/sub`). */
|
|
83
|
+
const DONO = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}(?:\/[A-Za-z0-9][A-Za-z0-9._-]{0,99}){0,19}$/;
|
|
81
84
|
const HOST = /^[A-Za-z0-9.-]+(?::\d+)?$/;
|
|
82
85
|
const texto = (v, padrao) => typeof v === 'string' && padrao.test(v) ? v : null;
|
|
83
86
|
function lerConfigDaRede() {
|
|
@@ -88,7 +91,7 @@ function lerConfigDaRede() {
|
|
|
88
91
|
return {
|
|
89
92
|
contrato: exports.CONTRATO_DA_ADESAO, membro: bruto.membro,
|
|
90
93
|
forja: bruto.forja === 'github' || bruto.forja === 'gitlab' ? bruto.forja : null,
|
|
91
|
-
host: texto(bruto.host, HOST), dono: texto(bruto.dono,
|
|
94
|
+
host: texto(bruto.host, HOST), dono: texto(bruto.dono, DONO), repositorio: texto(bruto.repositorio, IDENTIFICADOR),
|
|
92
95
|
atualizadoEm: typeof bruto.atualizadoEm === 'string' ? bruto.atualizadoEm : '',
|
|
93
96
|
};
|
|
94
97
|
}
|
|
@@ -108,11 +111,13 @@ function gravarConfigDaRede(mudanca) {
|
|
|
108
111
|
repositorio: mudanca.repositorio !== undefined ? mudanca.repositorio : atual?.repositorio ?? null,
|
|
109
112
|
atualizadoEm: new Date().toISOString(),
|
|
110
113
|
};
|
|
111
|
-
if (config.host !== null && !HOST.test(config.host))
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
if (config.host !== null && !HOST.test(config.host)) {
|
|
115
|
+
const host = config.host;
|
|
116
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.hostInvalido(host));
|
|
117
|
+
}
|
|
118
|
+
for (const [campo, valor, padrao] of [['dono', config.dono, DONO], ['repositorio', config.repositorio, IDENTIFICADOR]]) {
|
|
119
|
+
if (valor !== null && !padrao.test(valor))
|
|
120
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.campoInvalido(campo, valor));
|
|
116
121
|
}
|
|
117
122
|
const dir = (0, maquina_1.pastaDoUsuario)();
|
|
118
123
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -180,7 +185,7 @@ function idDaMaquina() {
|
|
|
180
185
|
}
|
|
181
186
|
const persistido = lerId(arquivo);
|
|
182
187
|
if (!persistido)
|
|
183
|
-
throw new
|
|
188
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.idNaoGravou(arquivo));
|
|
184
189
|
return persistido;
|
|
185
190
|
}
|
|
186
191
|
function gravarTemporario(conteudo) {
|
|
@@ -290,7 +295,7 @@ function trocarIdInvalido(arquivo, st) {
|
|
|
290
295
|
return;
|
|
291
296
|
}
|
|
292
297
|
else {
|
|
293
|
-
throw new
|
|
298
|
+
throw new locale_1.ErroDoCatalogo((m) => m.network.idNaoArquivo(arquivo));
|
|
294
299
|
}
|
|
295
300
|
// X6 do CHECK 6: a reserva da troca e chaveada pelo que todo host ve igual do arquivo ruim (conteudo,
|
|
296
301
|
// tamanho e hora); `dev` e local a cada host e fica so no id derivado, o caminho de quando a reserva falha.
|