@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/conducao.js
CHANGED
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ErroDeConducao = exports.ESPERA_PADRAO_MS = exports.PRAZO_DA_RESERVA_MS = exports.PRAZO_DE_SESSAO_PADRAO_MS = exports.MARGEM_DO_PRAZO_MS = exports.ENV_SESSAO_CLAUDE = exports.ENV_THREAD_DO_DESPACHO = exports.ENV_IDENTIDADE_DE_DESPACHO = exports.ENV_CANAL = exports.ERRO_CANAL_DESCONHECIDO = exports.CANAIS_DE_CONDUCAO = exports.conducaoDoLease = void 0;
|
|
36
|
+
exports.ErroDeConducao = exports.ESPERA_PADRAO_MS = exports.PRAZO_DA_RESERVA_MS = exports.PRAZO_DE_SESSAO_PADRAO_MS = exports.MARGEM_DO_PRAZO_MS = exports.ENV_SESSAO_CLAUDE = exports.ENV_THREAD_DO_DESPACHO = exports.ENV_IDENTIDADE_DE_DESPACHO = exports.ENV_CANAL = exports.BATIDA_DA_SENTINELA_MS = exports.PRAZO_DA_PRESENCA_MS = exports.CANAL_DA_SENTINELA = exports.CONTRATO_DA_SENTINELA = exports.ERRO_CANAL_DESCONHECIDO = exports.CANAIS_DE_CONDUCAO = exports.conducaoDoLease = void 0;
|
|
37
37
|
exports.validarCanal = validarCanal;
|
|
38
38
|
exports.canalDoProcesso = canalDoProcesso;
|
|
39
39
|
exports.ambienteDaConducao = ambienteDaConducao;
|
|
@@ -85,10 +85,13 @@ const ledger_1 = require("./ledger");
|
|
|
85
85
|
const maquina_1 = require("./maquina");
|
|
86
86
|
const thread_1 = require("./thread");
|
|
87
87
|
const horario_1 = require("./horario");
|
|
88
|
+
const locale_1 = require("./locale");
|
|
88
89
|
const util_1 = require("./util");
|
|
90
|
+
const procedencia_1 = require("./procedencia");
|
|
89
91
|
const runtime_ambiente_1 = require("./runtime-ambiente");
|
|
90
92
|
Object.defineProperty(exports, "ENV_IDENTIDADE_DE_DESPACHO", { enumerable: true, get: function () { return runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO; } });
|
|
91
93
|
Object.defineProperty(exports, "ENV_THREAD_DO_DESPACHO", { enumerable: true, get: function () { return runtime_ambiente_1.ENV_THREAD_DO_DESPACHO; } });
|
|
94
|
+
const projeto_alvo_1 = require("./projeto-alvo");
|
|
92
95
|
// ---------------------------------------------------------------------------
|
|
93
96
|
// Canais (D5, D6): registro fechado, declarado pela borda.
|
|
94
97
|
// ---------------------------------------------------------------------------
|
|
@@ -121,6 +124,18 @@ exports.CANAIS_DE_CONDUCAO = {
|
|
|
121
124
|
};
|
|
122
125
|
/** Codigo tipado da recusa de canal fora do registro. */
|
|
123
126
|
exports.ERRO_CANAL_DESCONHECIDO = 'conducao.canal-desconhecido';
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// RM-059 (F6, T6.4; DD5 do plano dos mods): a conducao pela Sentinela do Condutor. A presenca e o passo
|
|
129
|
+
// do condutor moram em `conducao-sentinela.ts`; as constantes ficam aqui, para quem so conhece a conducao.
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
/** O contrato do `ork conducao sentinela status --json`. */
|
|
132
|
+
exports.CONTRATO_DA_SENTINELA = 'ork.conducao-sentinela/v1';
|
|
133
|
+
/** A Sentinela roda na sessao do dono no Claude Code: e o canal dela, sempre. */
|
|
134
|
+
exports.CANAL_DA_SENTINELA = 'claude-code';
|
|
135
|
+
/** A presenca vale ate 3 min depois da ultima batida; vencida, o condutor externo volta a conduzir. */
|
|
136
|
+
exports.PRAZO_DA_PRESENCA_MS = 3 * 60 * 1000;
|
|
137
|
+
/** A Sentinela bate a cada 60 s: tres batidas perdidas e a presenca vence. */
|
|
138
|
+
exports.BATIDA_DA_SENTINELA_MS = 60 * 1000;
|
|
124
139
|
/** Canal fora do registro e recusado com motivo tipado, nunca adivinhado (T9). */
|
|
125
140
|
function validarCanal(bruto) {
|
|
126
141
|
const canal = bruto.trim();
|
|
@@ -149,9 +164,14 @@ function canalDoProcesso(explicito, ambiente = process.env) {
|
|
|
149
164
|
return 'hermes';
|
|
150
165
|
return 'cli';
|
|
151
166
|
}
|
|
152
|
-
/**
|
|
167
|
+
/**
|
|
168
|
+
* O que o despacho poe no ambiente da sessao filha: identidade, thread e canal de origem. RM-052
|
|
169
|
+
* (fatia 2, D2): tambem neutraliza o projeto-alvo de quem despachou, porque a sessao roda dentro do
|
|
170
|
+
* projeto (a worktree da thread) e le o projeto pelo proprio cwd; o modo host do gateway nao a segue.
|
|
171
|
+
*/
|
|
153
172
|
function ambienteDaConducao(identidade, threadId, canal) {
|
|
154
|
-
return { [runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO]: identidade, [runtime_ambiente_1.ENV_THREAD_DO_DESPACHO]: threadId, [exports.ENV_CANAL]: canal
|
|
173
|
+
return { [runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO]: identidade, [runtime_ambiente_1.ENV_THREAD_DO_DESPACHO]: threadId, [exports.ENV_CANAL]: canal,
|
|
174
|
+
...projeto_alvo_1.AMBIENTE_SEM_PROJETO_HERDADO };
|
|
155
175
|
}
|
|
156
176
|
/** Variavel que o Claude Code poe em cada sessao, com o UUID dela; nao vem do daemon. */
|
|
157
177
|
exports.ENV_SESSAO_CLAUDE = 'CLAUDE_CODE_SESSION_ID';
|
|
@@ -219,10 +239,30 @@ function nomeDaConducao(threadId) {
|
|
|
219
239
|
}
|
|
220
240
|
/** Estados em que o runtime ja deu a sessao por encerrada. */
|
|
221
241
|
const TERMINAIS = ['done', 'completed', 'exited', 'stopped', 'failed'];
|
|
242
|
+
/** Os eventos que sao contabilidade do proprio ork, e nao sinal de que a sessao voltou a trabalhar. */
|
|
243
|
+
const SO_DA_CONTABILIDADE = /^(conducao_|retry_|session_watcher_|despacho_idempotente$|varredura_acao$)/;
|
|
244
|
+
/**
|
|
245
|
+
* RM-063 (fatia 3, achado c): o observador viu a sessao num estado terminal do runtime (`done`, `failed`, `stopped`) e
|
|
246
|
+
* encerrou sem inferir a conclusao da fase (`session_watcher_error` com `estadoNativo`). A fase pode nao estar provada,
|
|
247
|
+
* mas a sessao nao executa mais nada: o lease dela cai. Vale o ultimo desses vistos, se nenhum evento da mesma sessao
|
|
248
|
+
* depois dele mostra trabalho (a sessao retomada por alguem).
|
|
249
|
+
*/
|
|
250
|
+
function terminalVistoPeloObservador(eventos, sessionId, desde) {
|
|
251
|
+
let visto = null;
|
|
252
|
+
for (const e of eventos) {
|
|
253
|
+
if (e.sessionId !== sessionId || Date.parse(e.ts) < desde)
|
|
254
|
+
continue;
|
|
255
|
+
if (e.tipo === 'session_watcher_error' && typeof e.estadoNativo === 'string' && TERMINAIS.includes(e.estadoNativo))
|
|
256
|
+
visto = e;
|
|
257
|
+
else if (visto && !SO_DA_CONTABILIDADE.test(e.tipo))
|
|
258
|
+
visto = null;
|
|
259
|
+
}
|
|
260
|
+
return visto;
|
|
261
|
+
}
|
|
222
262
|
/**
|
|
223
263
|
* O evento que prova que a sessao dona do lease acabou: o resultado da fase dela (a prova da I-34
|
|
224
|
-
* que o observador grava), a morte registrada, a superacao,
|
|
225
|
-
* posterior ao inicio da conducao.
|
|
264
|
+
* que o observador grava), a morte registrada, a superacao, o estado terminal que o observador viu
|
|
265
|
+
* no runtime (RM-063), ou a thread fechada. So conta evento posterior ao inicio da conducao.
|
|
226
266
|
*/
|
|
227
267
|
function fimDaSessao(eventos, lease) {
|
|
228
268
|
const dono = lease.conducao?.dono;
|
|
@@ -230,7 +270,7 @@ function fimDaSessao(eventos, lease) {
|
|
|
230
270
|
return null;
|
|
231
271
|
const desde = Date.parse(lease.adquiridoEm);
|
|
232
272
|
return eventos.find((e) => Date.parse(e.ts) >= desde && ((['phase_result', 'sessao_morta', 'session_superseded'].includes(e.tipo) && e.sessionId === dono.sessionId) ||
|
|
233
|
-
['thread_closed_admin', 'master_done'].includes(e.tipo))) ??
|
|
273
|
+
['thread_closed_admin', 'master_done'].includes(e.tipo))) ?? terminalVistoPeloObservador(eventos, dono.sessionId, desde);
|
|
234
274
|
}
|
|
235
275
|
/**
|
|
236
276
|
* A leitura pura, para quem so tem os dados (o snapshot do Maestro le por um leitor confinado).
|
|
@@ -355,16 +395,49 @@ const emCurso = new Map();
|
|
|
355
395
|
function chave(raiz, threadId) {
|
|
356
396
|
return `${(0, leases_1.caminhoLease)(raiz, nomeDaConducao(threadId))}`;
|
|
357
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* RM-063 (fatia 3, achado c): a consulta do claude-bg na conta do perfil da sessao (`CLAUDE_CONFIG_DIR` dele). A conta do
|
|
400
|
+
* processo nao lista a sessao de outro perfil, e a ausencia la nao prova nada; na conta dela, prova. `null` quando o
|
|
401
|
+
* perfil nao esta mais no store desta maquina (vale a consulta de sempre).
|
|
402
|
+
*/
|
|
403
|
+
function consultaNaContaDoPerfil(dono, raiz) {
|
|
404
|
+
if (dono.runtime !== 'claude-bg' || !dono.perfil)
|
|
405
|
+
return null;
|
|
406
|
+
// Carregados na hora, como o controle nativo: a leitura da conducao nao puxa o adapter inteiro.
|
|
407
|
+
const { lerPerfis, perfilDeDespacho } = require('./runtime-profiles');
|
|
408
|
+
const { ambienteDoPerfil, consultarSessoes } = require('./adapters/claude-bg');
|
|
409
|
+
let perfil = null;
|
|
410
|
+
try {
|
|
411
|
+
const p = lerPerfis(raiz).perfis.find((x) => x.id === dono.perfil && x.runtime === 'claude-bg');
|
|
412
|
+
perfil = p ? perfilDeDespacho(p) : null;
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
if (!perfil?.configDir)
|
|
418
|
+
return null;
|
|
419
|
+
const r = consultarSessoes(undefined, true, ambienteDoPerfil(perfil));
|
|
420
|
+
if (!r.ok)
|
|
421
|
+
return { ok: false, estado: null, detalhe: `o runtime nao respondeu a consulta na conta do perfil ${dono.perfil}`, naConta: true };
|
|
422
|
+
const achada = r.sessoes.find((x) => x.sessionId === dono.sessionId);
|
|
423
|
+
const estado = achada ? String(achada.state ?? achada.status ?? '') : null;
|
|
424
|
+
return { ok: true, estado, detalhe: achada ? `estado ${estado} na conta do perfil ${dono.perfil}` : `sessao ausente da conta do perfil ${dono.perfil}`,
|
|
425
|
+
naConta: true };
|
|
426
|
+
}
|
|
358
427
|
/** A consulta padrao: o controle nativo do runtime (claude-bg ou o controller do codex). */
|
|
359
428
|
const consultaNativa = (dono, raiz, threadId) => {
|
|
360
429
|
try {
|
|
430
|
+
const naConta = consultaNaContaDoPerfil(dono, raiz);
|
|
431
|
+
if (naConta)
|
|
432
|
+
return naConta;
|
|
361
433
|
// Carregado na hora: o modulo de sessoes puxa o HITL inteiro, que nao pertence a leitura.
|
|
362
434
|
const { controleNativo } = require('./hitl-sessions');
|
|
363
435
|
const r = controleNativo(dono.runtime, raiz, threadId, dono.sessionId).consultar();
|
|
364
436
|
if (!r.ok)
|
|
365
437
|
return { ok: false, estado: null, detalhe: 'o runtime nao respondeu a consulta' };
|
|
366
438
|
const achadas = r.sessoes.filter((s) => s.sessionId === dono.sessionId);
|
|
367
|
-
return { ok: true, estado: achadas[0]?.estado ?? null, detalhe: achadas.length ? `estado ${achadas[0].estado}` : 'sessao ausente'
|
|
439
|
+
return { ok: true, estado: achadas[0]?.estado ?? null, detalhe: achadas.length ? `estado ${achadas[0].estado}` : 'sessao ausente',
|
|
440
|
+
naConta: !dono.perfil };
|
|
368
441
|
}
|
|
369
442
|
catch (e) {
|
|
370
443
|
return { ok: false, estado: null, detalhe: e.message };
|
|
@@ -405,7 +478,9 @@ function provaDeFimDaSessao(raiz, threadId, lease, pedido, anotarEstado = () =>
|
|
|
405
478
|
anotarEstado(r.estado);
|
|
406
479
|
if (r.estado && TERMINAIS.includes(r.estado))
|
|
407
480
|
return { motivo: 'sessao-orfa', prova: `runtime ${dono.runtime}: ${r.detalhe}` };
|
|
408
|
-
|
|
481
|
+
// A ausencia so prova o fim quando a consulta foi feita na conta da sessao: sem perfil, a do processo; com perfil, a
|
|
482
|
+
// dele (RM-063, fatia 3, achado c).
|
|
483
|
+
if (r.estado === null && (!dono.perfil || r.naConta === true))
|
|
409
484
|
return { motivo: 'sessao-orfa', prova: `runtime ${dono.runtime}: ${r.detalhe}` };
|
|
410
485
|
return null;
|
|
411
486
|
}
|
|
@@ -604,9 +679,10 @@ function sucessaoAindaVale(raiz, threadId, estado) {
|
|
|
604
679
|
// Sem resposta do runtime nao ha prova de que ela segue parada: a sucessao nao vale.
|
|
605
680
|
if (!r.ok)
|
|
606
681
|
return false;
|
|
607
|
-
// S1 do CHECK 6: a sessao que sumiu do runtime, sem perfil, acabou; a mesma prova de
|
|
682
|
+
// S1 do CHECK 6: a sessao que sumiu do runtime, sem perfil (ou da conta do perfil dela), acabou; a mesma prova de
|
|
683
|
+
// `provaDeFimDaSessao`.
|
|
608
684
|
if (r.estado === null)
|
|
609
|
-
return !dono.perfil;
|
|
685
|
+
return !dono.perfil || r.naConta === true;
|
|
610
686
|
return r.estado === 'blocked' || TERMINAIS.includes(r.estado);
|
|
611
687
|
}
|
|
612
688
|
function renovar(raiz, threadId, estado, prazoDoProximoMs, agoraMs) {
|
|
@@ -698,6 +774,7 @@ function comandoDeEsperar(threadId, pedido) {
|
|
|
698
774
|
case 'baseline': return `ork verify ${threadId} --baseline --esperar 30`;
|
|
699
775
|
case 'fix.open': return `ork fix open ${threadId} --esperar 30`;
|
|
700
776
|
case 'fix.reverify': return `ork fix reverify ${threadId} --esperar 30`;
|
|
777
|
+
case 'branch.atualizar': return `ork conducao atualizar ${threadId} --esperar 30`;
|
|
701
778
|
default: return `ork verify ${threadId} --esperar 30`;
|
|
702
779
|
}
|
|
703
780
|
}
|
|
@@ -711,32 +788,30 @@ function comandoDeAcompanhar(threadId, atual) {
|
|
|
711
788
|
* aconteceu e o que fazer: o texto sai daqui e de lugar nenhum mais, e o JSON e a mesma estrutura.
|
|
712
789
|
*/
|
|
713
790
|
function recusaDeConducao(threadId, atual, pedido, opcoes = {}) {
|
|
791
|
+
const m = (0, locale_1.msg)().conducao.recusa;
|
|
714
792
|
const conducao = atual
|
|
715
793
|
? { ...atual, desdeLocal: (0, horario_1.formatarDataHoraRotulada)(atual.desde, opcoes), linha: (0, conducao_texto_1.linhaDeConducao)(atual, opcoes) }
|
|
716
794
|
: null;
|
|
717
795
|
const acoes = [
|
|
718
|
-
{ acao: 'esperar', comando: comandoDeEsperar(threadId, pedido),
|
|
719
|
-
|
|
720
|
-
{ acao: '
|
|
721
|
-
explicacao:
|
|
722
|
-
{ acao: 'assumir', comando: `ork conducao assumir ${threadId} --por <voce> --motivo "<por que>"`,
|
|
723
|
-
explicacao: 'Assumir a conducao: encerra a atual pelo proprio runtime e registra no ledger quem assumiu, de qual canal e por que.' },
|
|
796
|
+
{ acao: 'esperar', comando: comandoDeEsperar(threadId, pedido), explicacao: m.esperar },
|
|
797
|
+
{ acao: 'acompanhar', comando: comandoDeAcompanhar(threadId, atual), explicacao: m.acompanhar },
|
|
798
|
+
{ acao: 'assumir', comando: m.comandoAssumir(threadId),
|
|
799
|
+
explicacao: m.assumir },
|
|
724
800
|
];
|
|
725
801
|
const linhas = [
|
|
726
|
-
|
|
727
|
-
'se corrompem (foi o que aconteceu em 19/09/2026).',
|
|
802
|
+
m.titulo(threadId),
|
|
728
803
|
];
|
|
729
804
|
if (conducao) {
|
|
730
|
-
linhas.push(
|
|
805
|
+
linhas.push(m.quem(conducao.canal, (0, conducao_texto_1.quemConduz)(conducao), conducao.fase ?? '-', conducao.desdeLocal));
|
|
731
806
|
if (conducao.promptSha256)
|
|
732
|
-
linhas.push(
|
|
807
|
+
linhas.push(m.prompt(conducao.promptSha256.slice(0, 12)));
|
|
733
808
|
}
|
|
734
809
|
else {
|
|
735
|
-
linhas.push(
|
|
810
|
+
linhas.push(m.entrando);
|
|
736
811
|
}
|
|
737
|
-
linhas.push(
|
|
738
|
-
linhas.push(
|
|
739
|
-
acoes.forEach((a, i) => { linhas.push(
|
|
812
|
+
linhas.push(m.pedido((0, locale_1.msg)().thread.operacoes[pedido.operacao], pedido.fase ?? null, pedido.canal));
|
|
813
|
+
linhas.push(m.opcoes);
|
|
814
|
+
acoes.forEach((a, i) => { linhas.push(m.passo(i + 1, a.explicacao)); linhas.push(` ${a.comando}`); });
|
|
740
815
|
return {
|
|
741
816
|
contrato: 'ork.conducao-recusa/v1',
|
|
742
817
|
motivo: 'conducao.em-andamento',
|
|
@@ -752,12 +827,12 @@ function recusaDeConducao(threadId, atual, pedido, opcoes = {}) {
|
|
|
752
827
|
* e o texto diz onde acompanhar a sessao que ja atende o pedido.
|
|
753
828
|
*/
|
|
754
829
|
function textoDoPedidoRepetido(threadId, atual, opcoes = {}) {
|
|
830
|
+
// RM-061 (F2a): texto de impressao (o despacho nao o grava), no locale do comando.
|
|
831
|
+
const m = (0, locale_1.msg)().phase;
|
|
755
832
|
return [
|
|
756
|
-
|
|
757
|
-
`(sha256 ${(atual.promptSha256 ?? '').slice(0, 12)}) desde ${(0, horario_1.formatarDataHoraRotulada)(atual.desde, opcoes)}. ` +
|
|
758
|
-
'Nenhuma sessao nova foi aberta e nenhuma cota foi gasta.',
|
|
833
|
+
m.repetido(atual.fase ?? '-', threadId, (atual.promptSha256 ?? '').slice(0, 12), (0, horario_1.formatarDataHoraRotulada)(atual.desde, opcoes)),
|
|
759
834
|
` ${(0, conducao_texto_1.linhaDeConducao)(atual, opcoes)}`,
|
|
760
|
-
|
|
835
|
+
m.acompanhar(comandoDeAcompanhar(threadId, atual)),
|
|
761
836
|
].join('\n');
|
|
762
837
|
}
|
|
763
838
|
/** A recusa tipada como erro, para quem nao tem um resultado estruturado onde devolve-la. */
|
|
@@ -843,7 +918,8 @@ function liberarSeOrfa(raiz, threadId, opcoes = {}) {
|
|
|
843
918
|
function estadoDaWorktree(raiz, threadId) {
|
|
844
919
|
try {
|
|
845
920
|
const t = (0, thread_1.lerThread)(raiz, threadId);
|
|
846
|
-
|
|
921
|
+
// RM-047 (P2): o git do handoff so roda na worktree registrada.
|
|
922
|
+
const dir = (0, procedencia_1.diretorioDaThread)(raiz, t);
|
|
847
923
|
const head = (0, util_1.exec)('git', ['rev-parse', 'HEAD'], dir);
|
|
848
924
|
const st = (0, util_1.exec)('git', ['status', '--porcelain'], dir);
|
|
849
925
|
return { head: head.ok ? head.stdout.trim() : null, alterados: st.ok ? st.stdout.split('\n').filter(Boolean).slice(0, 40) : [] };
|
|
@@ -860,6 +936,68 @@ const controleNativoDoHandoff = (runtime, raiz, threadId, sessionId) => {
|
|
|
860
936
|
parar: (s) => ctl.parar(s),
|
|
861
937
|
};
|
|
862
938
|
};
|
|
939
|
+
/**
|
|
940
|
+
* A fonte fixada pelo sensor contém a identidade capturada no spawn, não um PID descoberto.
|
|
941
|
+
* Todos os watchers, o controller e o runtime precisam estar ausentes por identidade.
|
|
942
|
+
* Quem chama segura a trava da condução; nenhum prazo ou heartbeat autoriza esta soltura.
|
|
943
|
+
*/
|
|
944
|
+
function morteLocalDoCodex(raiz, threadId, lease) {
|
|
945
|
+
const dono = lease.conducao?.dono;
|
|
946
|
+
if (dono?.tipo !== 'sessao' || dono.runtime !== 'codex' || dono.maquina !== (0, maquina_1.nomeDaMaquina)())
|
|
947
|
+
return null;
|
|
948
|
+
try {
|
|
949
|
+
const t = (0, thread_1.lerThread)(raiz, threadId), sessao = t.sessoes.at(-1);
|
|
950
|
+
if (!sessao || sessao.sessionId !== dono.sessionId || sessao.runtime !== 'codex' || !sessao.despachadaEm ||
|
|
951
|
+
sessao.fase !== lease.conducao?.fase || sessao.promptSha256 !== lease.conducao?.promptSha256)
|
|
952
|
+
return null;
|
|
953
|
+
const dir = (0, thread_1.dirThread)(raiz, threadId), eventos = (0, ledger_1.lerLedger)(dir);
|
|
954
|
+
if (fimDaSessao(eventos, lease))
|
|
955
|
+
return null;
|
|
956
|
+
const mesmo = (e) => e.sessionId === dono.sessionId && e.despachoEm === sessao.despachadaEm;
|
|
957
|
+
const watchers = eventos.filter(e => e.tipo === 'session_watcher_started' && mesmo(e));
|
|
958
|
+
if (!watchers.length || watchers.some(watcher => {
|
|
959
|
+
const identidade = watcher.identidade;
|
|
960
|
+
return !identidade || watcher.pid !== identidade.pid || (0, codex_runner_1.estadoProcesso)(identidade) !== 'ausente';
|
|
961
|
+
}))
|
|
962
|
+
return null;
|
|
963
|
+
const registro = eventos.filter(e => e.tipo === 'session_sensor_registered' && mesmo(e)).at(-1);
|
|
964
|
+
const despacho = eventos.filter(e => e.tipo === 'phase_dispatch' && e.sessionId === dono.sessionId).at(-1);
|
|
965
|
+
if (!registro || typeof registro.controlador !== 'string' || typeof registro.cwd !== 'string' ||
|
|
966
|
+
registro.logPath || registro.processoPath || registro.reciboPath || registro.nativo ||
|
|
967
|
+
despacho?.controlador !== registro.controlador || despacho.cwd !== registro.cwd ||
|
|
968
|
+
(sessao.controlador && sessao.controlador !== registro.controlador))
|
|
969
|
+
return null;
|
|
970
|
+
const chave = (0, node_crypto_1.createHash)('sha256').update(dono.sessionId + '|' + sessao.despachadaEm).digest('hex');
|
|
971
|
+
const fixacao = path.join(dir, 'sessoes', `watcher-source-${chave}.json`);
|
|
972
|
+
// Recuperação não cria uma fonte nova nem depende do state.json mutável de um controller morto.
|
|
973
|
+
if (!fs.existsSync(fixacao))
|
|
974
|
+
return null;
|
|
975
|
+
const { registrarFonteController } = require('./adapters/codex-controller-sensor');
|
|
976
|
+
const fonte = registrarFonteController(registro.controlador, { dirSessoes: path.join(dir, 'sessoes'), fixacao,
|
|
977
|
+
sessionId: dono.sessionId, cwd: registro.cwd, despachoEm: sessao.despachadaEm,
|
|
978
|
+
vinculo: { thread: threadId, fase: sessao.fase, promptSha256: sessao.promptSha256 } });
|
|
979
|
+
const controller = fonte.processoController;
|
|
980
|
+
if (!controller || (0, codex_runner_1.estadoProcesso)({ pid: controller.pid, inicio: controller.inicio, boot: controller.bootId }) !== 'ausente')
|
|
981
|
+
return null;
|
|
982
|
+
const runtime = fonte.processoRuntime;
|
|
983
|
+
if (!runtime || (0, codex_runner_1.estadoProcesso)({ pid: runtime.pid, inicio: runtime.inicio, boot: runtime.bootId }) !== 'ausente')
|
|
984
|
+
return null;
|
|
985
|
+
// O watcher pode ter gravado o terminal e saído durante a prova dos processos.
|
|
986
|
+
if (fimDaSessao((0, ledger_1.lerLedger)(dir), lease))
|
|
987
|
+
return null;
|
|
988
|
+
return { sessionId: dono.sessionId, despachoEm: sessao.despachadaEm, fase: sessao.fase, runtime: 'codex',
|
|
989
|
+
origem: 'conducao.assumir', motivo: 'watchers-controlador-e-runtime-ausentes',
|
|
990
|
+
prova: { fonte: 'session_sensor_registered+controller-source-pin+/proc',
|
|
991
|
+
registroEventId: registro.eventId,
|
|
992
|
+
watchers: watchers.map(w => ({ eventId: w.eventId, identidade: w.identidade, estado: 'ausente' })),
|
|
993
|
+
controlador: { pid: controller.pid, inicio: controller.inicio, boot: controller.bootId, uid: controller.uid },
|
|
994
|
+
runtime: { pid: runtime.pid, inicio: runtime.inicio, boot: runtime.bootId, uid: runtime.uid },
|
|
995
|
+
estadoControlador: 'ausente', estadoRuntime: 'ausente' } };
|
|
996
|
+
}
|
|
997
|
+
catch {
|
|
998
|
+
return null;
|
|
999
|
+
} // Fonte ilegível, divergente ou identidade desconhecida nunca prova morte.
|
|
1000
|
+
}
|
|
863
1001
|
/**
|
|
864
1002
|
* `ork conducao assumir` (T15): encerra a conducao atual pelo mecanismo suportado do runtime, toma
|
|
865
1003
|
* uma reserva curta para o canal de quem assumiu e registra quem, de qual canal e por que. Processo
|
|
@@ -873,7 +1011,8 @@ function assumirConducao(raiz, threadId, opcoes) {
|
|
|
873
1011
|
throw new Error('conducao.assumir: informe --motivo; handoff sem razao registrada e o mesmo kill de antes, com outro nome');
|
|
874
1012
|
const dir = (0, thread_1.dirThread)(raiz, threadId);
|
|
875
1013
|
(0, thread_1.lerThread)(raiz, threadId);
|
|
876
|
-
|
|
1014
|
+
// A prova local vem antes de qualquer consulta ao runtime; ledger ainda libera sessões terminadas.
|
|
1015
|
+
liberarSeOrfa(raiz, threadId, { consultarRuntime: false });
|
|
877
1016
|
const fd = tentarTrava(raiz, threadId);
|
|
878
1017
|
if (fd === null) {
|
|
879
1018
|
const atual = conducaoDaThread(raiz, threadId);
|
|
@@ -889,30 +1028,38 @@ function assumirConducao(raiz, threadId, opcoes) {
|
|
|
889
1028
|
let prova = 'lease exec ausente';
|
|
890
1029
|
if (lease && anterior?.dono.tipo === 'sessao') {
|
|
891
1030
|
const dono = anterior.dono;
|
|
892
|
-
const
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
1031
|
+
const morte = morteLocalDoCodex(raiz, threadId, lease);
|
|
1032
|
+
if (morte) {
|
|
1033
|
+
(0, ledger_1.registrar)(dir, threadId, 'sessao_morta', morte);
|
|
1034
|
+
mecanismo = 'recuperação local: watchers, controlador e runtime ausentes por identidade';
|
|
1035
|
+
prova = 'ledger: sessao_morta com identidades capturadas e ausência conferida no kernel';
|
|
897
1036
|
}
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
1037
|
+
else {
|
|
1038
|
+
const ctl = (opcoes.controle ?? controleNativoDoHandoff)(dono.runtime, raiz, threadId, dono.sessionId);
|
|
1039
|
+
const antes = ctl.consultar();
|
|
1040
|
+
if (!antes.ok) {
|
|
1041
|
+
return { ok: false, thread: threadId, anterior, mecanismo: 'nenhum',
|
|
1042
|
+
detalhe: 'runtime.unavailable: nao consegui consultar a sessao no runtime; nada foi encerrado e a conducao segue com ela' };
|
|
903
1043
|
}
|
|
904
|
-
const
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
1044
|
+
const s = antes.sessoes.find((x) => x.sessionId === dono.sessionId);
|
|
1045
|
+
if (s && !TERMINAIS.includes(s.estado)) {
|
|
1046
|
+
if (!ctl.parar(s)) {
|
|
1047
|
+
return { ok: false, thread: threadId, anterior, mecanismo: `parar ${dono.runtime}`,
|
|
1048
|
+
detalhe: `runtime.unavailable: o runtime ${dono.runtime} nao confirmou o encerramento; a conducao segue com a sessao ${dono.sessionId.slice(0, 8)}` };
|
|
1049
|
+
}
|
|
1050
|
+
const depois = ctl.consultar();
|
|
1051
|
+
const ainda = depois.ok ? depois.sessoes.find((x) => x.sessionId === dono.sessionId) : s;
|
|
1052
|
+
if (!depois.ok || (ainda && !TERMINAIS.includes(ainda.estado))) {
|
|
1053
|
+
return { ok: false, thread: threadId, anterior, mecanismo: `parar ${dono.runtime}`,
|
|
1054
|
+
detalhe: 'runtime.unavailable: a consulta depois do encerramento nao confirma a sessao parada; o lease foi mantido' };
|
|
1055
|
+
}
|
|
1056
|
+
mecanismo = `parar pelo runtime ${dono.runtime} (controle homologado)`;
|
|
1057
|
+
prova = `runtime: ${s.estado} -> ${ainda?.estado ?? 'ausente'}`;
|
|
1058
|
+
}
|
|
1059
|
+
else {
|
|
1060
|
+
mecanismo = 'nenhum: a sessao ja tinha terminado';
|
|
1061
|
+
prova = `runtime: ${s?.estado ?? 'sessao ausente'}`;
|
|
909
1062
|
}
|
|
910
|
-
mecanismo = `parar pelo runtime ${dono.runtime} (controle homologado)`;
|
|
911
|
-
prova = `runtime: ${s.estado} -> ${ainda?.estado ?? 'ausente'}`;
|
|
912
|
-
}
|
|
913
|
-
else {
|
|
914
|
-
mecanismo = 'nenhum: a sessao ja tinha terminado';
|
|
915
|
-
prova = `runtime: ${s?.estado ?? 'sessao ausente'}`;
|
|
916
1063
|
}
|
|
917
1064
|
}
|
|
918
1065
|
else if (lease && anterior?.dono.tipo === 'reserva') {
|
|
@@ -940,8 +1087,7 @@ function assumirConducao(raiz, threadId, opcoes) {
|
|
|
940
1087
|
worktree: estadoDaWorktree(raiz, threadId),
|
|
941
1088
|
});
|
|
942
1089
|
return { ok: true, thread: threadId, anterior, mecanismo,
|
|
943
|
-
detalhe:
|
|
944
|
-
`${(0, horario_1.formatarDataHoraRotulada)(reserva.expiraEm)}` };
|
|
1090
|
+
detalhe: (0, locale_1.msg)().conducao.cli.detalheAssumida(por, opcoes.canal, (0, horario_1.formatarDataHoraRotulada)(reserva.expiraEm)) };
|
|
945
1091
|
}
|
|
946
1092
|
finally {
|
|
947
1093
|
fs.closeSync(fd);
|
|
@@ -949,14 +1095,15 @@ function assumirConducao(raiz, threadId, opcoes) {
|
|
|
949
1095
|
}
|
|
950
1096
|
/** Texto de `ork conducao status`. */
|
|
951
1097
|
function textoDoStatusDaConducao(threadId, atual) {
|
|
1098
|
+
const m = (0, locale_1.msg)().conducao.status;
|
|
952
1099
|
if (!atual)
|
|
953
|
-
return
|
|
954
|
-
const linhas = [
|
|
1100
|
+
return m.livre(threadId);
|
|
1101
|
+
const linhas = [m.titulo(threadId, (0, conducao_texto_1.linhaDeConducao)(atual))];
|
|
955
1102
|
if (atual.promptSha256)
|
|
956
|
-
linhas.push(
|
|
957
|
-
linhas.push(
|
|
1103
|
+
linhas.push(m.prompt(atual.promptSha256.slice(0, 12)));
|
|
1104
|
+
linhas.push(m.prazo((0, horario_1.formatarDataHoraRotulada)(atual.expiraEm)));
|
|
958
1105
|
if (atual.sessao)
|
|
959
|
-
linhas.push(
|
|
960
|
-
linhas.push(
|
|
1106
|
+
linhas.push(m.acompanhar(atual.sessao.slice(0, 8)));
|
|
1107
|
+
linhas.push(m.assumir(threadId));
|
|
961
1108
|
return linhas.join('\n');
|
|
962
1109
|
}
|