@orkastery/cli 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
- package/adapters/openclaw/README.md +83 -10
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +53 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +188 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.VALIDADE_DA_VIDA_NO_RETRATO_MS = exports.VIDA_NAO_VERIFICADA = exports.chaveDaConta = exports.PRAZO_DA_LEITURA_MS = void 0;
|
|
37
|
+
exports.motivoDaCausa = motivoDaCausa;
|
|
38
|
+
exports.lerRuntime = lerRuntime;
|
|
39
|
+
exports.vidaDaThread = vidaDaThread;
|
|
40
|
+
exports.paradaDesde = paradaDesde;
|
|
41
|
+
exports.textoDaParada = textoDaParada;
|
|
42
|
+
exports.sessaoVivaNaThread = sessaoVivaNaThread;
|
|
43
|
+
exports.vidaDoRetrato = vidaDoRetrato;
|
|
44
|
+
/**
|
|
45
|
+
* RM-063 (F2): a sessao de cada thread, verificada no runtime, para as superficies que dizem "sigo".
|
|
46
|
+
*
|
|
47
|
+
* Incidente de 12/10/2026 (P2 da pagina da RM-063): com o despacho do GO da K7 morto e o daemon do
|
|
48
|
+
* claude-bg fora do ar, o `ork roadmap status` disse "sigo ork-rm026k7conhe na fase GO". O "sigo" saia de
|
|
49
|
+
* toda thread aberta com fase, ou do lease de conducao, que sobrevive a sessao morta ate a prova do fim.
|
|
50
|
+
*
|
|
51
|
+
* Agora so diz "sigo" quem tem sessao viva verificada no runtime: o `claude agents --json --all` de cada
|
|
52
|
+
* conta e os rollouts do codex, pela mesma consulta do inventario da RM-056 (fantasma e a sessao sem
|
|
53
|
+
* processo). Sessao fantasma, despacho falho ou nenhuma sessao viram "<thread> parada desde HH:MM:
|
|
54
|
+
* <motivo>", com o ultimo sinal de vida que o ledger guarda.
|
|
55
|
+
*/
|
|
56
|
+
const fs = __importStar(require("node:fs"));
|
|
57
|
+
const path = __importStar(require("node:path"));
|
|
58
|
+
const sessoes_contas_1 = require("./sessoes-contas");
|
|
59
|
+
const estado_thread_1 = require("./estado-thread");
|
|
60
|
+
const ledger_1 = require("./ledger");
|
|
61
|
+
const horario_1 = require("./horario");
|
|
62
|
+
const locale_roadmap_1 = require("./locale-roadmap");
|
|
63
|
+
/** O prazo do `claude agents` na leitura da vida: o status nao espera um daemon travado por minutos. */
|
|
64
|
+
exports.PRAZO_DA_LEITURA_MS = 20_000;
|
|
65
|
+
/** A chave de uma conta que respondeu: o runtime, e o perfil quando a conta e de um perfil do store. */
|
|
66
|
+
const chaveDaConta = (runtime, perfil) => `${runtime}:${perfil ?? ''}`;
|
|
67
|
+
exports.chaveDaConta = chaveDaConta;
|
|
68
|
+
/** O motivo de uma causa, no catalogo pedido (pt-BR por padrao: e o que vai ao `--json` e ao retrato). */
|
|
69
|
+
function motivoDaCausa(c, m = locale_roadmap_1.ROADMAP_PT_BR.motivoDaParada) {
|
|
70
|
+
switch (c.tipo) {
|
|
71
|
+
case 'nenhumaSessao': return m.nenhumaSessao(c.fase);
|
|
72
|
+
case 'despachoFalhou': return m.despachoFalhou(c.fase, c.detalhe);
|
|
73
|
+
case 'sessaoCaiu': return m.sessaoCaiu(c.sessao, c.motivo);
|
|
74
|
+
case 'runtimeSemResposta': return m.runtimeSemResposta(c.runtime, c.detalhe, c.sessao);
|
|
75
|
+
case 'naoAparece': return m.naoAparece(c.sessao);
|
|
76
|
+
case 'fantasma': return m.fantasma(c.sessao);
|
|
77
|
+
case 'encerrada': return m.encerrada(c.sessao, c.estado);
|
|
78
|
+
case 'naoLida': return m.naoLida(c.detalhe);
|
|
79
|
+
case 'semAtividade': return m.semAtividade(c.sessao, c.minutos);
|
|
80
|
+
case 'retratoVelho': return m.retratoVelho(c.minutos);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const curto = (texto, teto = 100) => {
|
|
84
|
+
const limpo = String(texto ?? '').replace(/[\p{Cc}\s]+/gu, ' ').trim();
|
|
85
|
+
return limpo.length > teto ? `${limpo.slice(0, teto - 3)}...` : limpo;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* `claude agents` e os rollouts do codex de cada conta desta maquina (a do processo e cada perfil do store), conta a
|
|
89
|
+
* conta: o que uma conta nao respondeu nao vira "a sessao nao aparece". Falha vira falha, nunca "sem sessao".
|
|
90
|
+
*/
|
|
91
|
+
function lerRuntime(raiz, prazoMs = exports.PRAZO_DA_LEITURA_MS) {
|
|
92
|
+
const responderam = new Set(), falhas = [], sessoes = [];
|
|
93
|
+
try {
|
|
94
|
+
const canonica = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
95
|
+
const { contas, fontes } = (0, sessoes_contas_1.contasDeSessoes)(canonica);
|
|
96
|
+
for (const f of fontes)
|
|
97
|
+
if (!f.ok)
|
|
98
|
+
falhas.push(curto(f.detalhe, 120));
|
|
99
|
+
for (const conta of contas) {
|
|
100
|
+
const r = (0, sessoes_contas_1.consultarContas)(canonica, { todas: true, contas: [conta], prazoMs });
|
|
101
|
+
if (r.fontes.some((f) => f.ok)) {
|
|
102
|
+
responderam.add(conta.runtime);
|
|
103
|
+
responderam.add((0, exports.chaveDaConta)(conta.runtime, conta.perfil?.id ?? null));
|
|
104
|
+
}
|
|
105
|
+
else
|
|
106
|
+
falhas.push(...r.fontes.filter((f) => !f.ok).map((f) => `${f.origem}: ${curto(f.detalhe, 120)}`));
|
|
107
|
+
for (const s of r.sessoes) {
|
|
108
|
+
sessoes.push({ sessionId: s.sessionId, runtime: s.runtime, viva: s.viva, fantasma: s.fantasma,
|
|
109
|
+
estado: String(s.state ?? s.status ?? '').trim().toLowerCase(), perfil: s.perfil,
|
|
110
|
+
atividadeEm: typeof s.atividadeEm === 'number' ? s.atividadeEm : null });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
falhas.push(curto(e.message, 160));
|
|
116
|
+
}
|
|
117
|
+
return { responderam: [...responderam], falhas, sessoes };
|
|
118
|
+
}
|
|
119
|
+
/** O motivo tipado com o detalhe, sem repetir o motivo quando o detalhe ja comeca por ele. */
|
|
120
|
+
function motivoComDetalhe(e) {
|
|
121
|
+
const motivo = typeof e.motivo === 'string' ? e.motivo : '';
|
|
122
|
+
const detalhe = typeof e.detalhe === 'string' ? e.detalhe : typeof e.erro === 'string' ? e.erro : '';
|
|
123
|
+
return !detalhe ? motivo || 'sem detalhe' : !motivo || detalhe.startsWith(motivo) ? detalhe : `${motivo}: ${detalhe}`;
|
|
124
|
+
}
|
|
125
|
+
function causaDaFalha(e, sessionId) {
|
|
126
|
+
if (sessionId && e.sessionId === sessionId)
|
|
127
|
+
return { tipo: 'sessaoCaiu', sessao: sessionId.slice(0, 8), motivo: curto(e.motivo, 40) };
|
|
128
|
+
return { tipo: 'despachoFalhou', fase: typeof e.fase === 'string' && e.fase ? e.fase : null, detalhe: curto(motivoComDetalhe(e), 90) };
|
|
129
|
+
}
|
|
130
|
+
/** Eventos que o proprio `ork` grava sobre a sessao: nao sao sinal de vida dela. */
|
|
131
|
+
const SO_DO_ORK = /^(conducao_|retry_|despacho_idempotente$)/;
|
|
132
|
+
/**
|
|
133
|
+
* A vida da thread: a sessao do despacho mais recente, de qualquer fase (o despacho de GO que falha deixa a thread
|
|
134
|
+
* em GOAL), e a falha do runtime depois dele. `leitura` so e chamada quando ha sessao a conferir: thread sem
|
|
135
|
+
* despacho nao custa consulta ao runtime.
|
|
136
|
+
*/
|
|
137
|
+
function vidaDaThread(t, eventos, leitura, agoraMs = Date.now()) {
|
|
138
|
+
const fase = t.faseAtual;
|
|
139
|
+
const parada = (desdeEm, causa, sessionId = null) => ({ viva: false, sessionId, desdeEm: desdeEm ?? null, motivo: motivoDaCausa(causa), causa });
|
|
140
|
+
const ultimoSinal = eventos.at(-1)?.ts ?? t.atualizadaEm ?? t.criadaEm ?? null;
|
|
141
|
+
let iDespacho = -1;
|
|
142
|
+
for (let i = eventos.length - 1; i >= 0; i--) {
|
|
143
|
+
const e = eventos[i];
|
|
144
|
+
if (e.tipo === ledger_1.TIPOS_DE_EVENTO.faseDespachada && typeof e.sessionId === 'string' && e.sessionId) {
|
|
145
|
+
iDespacho = i;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const despacho = iDespacho >= 0 ? eventos[iDespacho] : null;
|
|
150
|
+
const registrada = (t.sessoes ?? []).at(-1) ?? null;
|
|
151
|
+
const sessionId = despacho ? String(despacho.sessionId) : registrada?.sessionId ?? null;
|
|
152
|
+
const runtime = (typeof despacho?.runtime === 'string' && despacho.runtime) || registrada?.runtime || 'claude-bg';
|
|
153
|
+
const perfilDoDespacho = despacho?.perfil?.id ??
|
|
154
|
+
registrada?.perfil?.id;
|
|
155
|
+
const perfil = typeof perfilDoDespacho === 'string' && perfilDoDespacho ? perfilDoDespacho : null;
|
|
156
|
+
// A falha que vale e a de depois do despacho corrente (a de antes ja foi superada por ele), e que nada superou depois:
|
|
157
|
+
// o gate liberado do mesmo motivo ou da mesma sessao, ou a fase que terminou bem.
|
|
158
|
+
const depois = eventos.slice(iDespacho + 1);
|
|
159
|
+
const falha = [...depois.entries()].reverse().find(([k, e]) => (e.tipo === ledger_1.TIPOS_DE_EVENTO.despachoFalhou ||
|
|
160
|
+
(e.tipo === ledger_1.TIPOS_DE_EVENTO.gateBloqueado && typeof e.motivo === 'string' && e.motivo.startsWith('runtime.'))) &&
|
|
161
|
+
!depois.slice(k + 1).some((p) => (p.tipo === ledger_1.TIPOS_DE_EVENTO.gateLiberado && (p.motivo === e.motivo ||
|
|
162
|
+
(!!e.sessionId && p.sessionId === e.sessionId))) || (p.tipo === 'phase_result' && p.ok === true)))?.[1] ?? null;
|
|
163
|
+
if (!sessionId) {
|
|
164
|
+
return falha ? parada(falha.ts, causaDaFalha(falha, null)) : parada(ultimoSinal, { tipo: 'nenhumaSessao', fase });
|
|
165
|
+
}
|
|
166
|
+
const l = leitura();
|
|
167
|
+
const s = l.sessoes.find((x) => x.runtime === runtime && (x.sessionId === sessionId || x.sessionId.startsWith(sessionId)));
|
|
168
|
+
if (s?.viva)
|
|
169
|
+
return { viva: true, sessionId, desdeEm: null, motivo: null };
|
|
170
|
+
if (falha)
|
|
171
|
+
return parada(falha.ts, causaDaFalha(falha, sessionId), sessionId);
|
|
172
|
+
const id = sessionId.slice(0, 8);
|
|
173
|
+
const daSessao = [...eventos].reverse().find((e) => e.sessionId === sessionId && !SO_DO_ORK.test(e.tipo))?.ts ?? despacho?.ts ?? ultimoSinal;
|
|
174
|
+
// A conta do despacho precisa ter respondido: a do perfil, ou qualquer uma do runtime quando o despacho nao teve perfil.
|
|
175
|
+
if (!l.responderam.includes(perfil ? (0, exports.chaveDaConta)(runtime, perfil) : runtime)) {
|
|
176
|
+
return parada(daSessao, { tipo: 'runtimeSemResposta', runtime, detalhe: l.falhas.length ? curto(l.falhas[0], 80) : null, sessao: id }, sessionId);
|
|
177
|
+
}
|
|
178
|
+
if (!s)
|
|
179
|
+
return parada(daSessao, { tipo: 'naoAparece', sessao: id }, sessionId);
|
|
180
|
+
if (s.fantasma)
|
|
181
|
+
return parada(daSessao, { tipo: 'fantasma', sessao: id }, sessionId);
|
|
182
|
+
// O codex so conta como vivo com atividade recente no rollout: sem ela e sem estado final, e silencio, nao fim.
|
|
183
|
+
if (s.runtime === 'codex' && s.estado !== 'completed' && typeof s.atividadeEm === 'number') {
|
|
184
|
+
return parada(new Date(s.atividadeEm).toISOString(), { tipo: 'semAtividade', sessao: id, minutos: Math.max(0, Math.floor((agoraMs - s.atividadeEm) / 60000)) }, sessionId);
|
|
185
|
+
}
|
|
186
|
+
return parada(daSessao, { tipo: 'encerrada', sessao: id, estado: s.estado || 'sem estado' }, sessionId);
|
|
187
|
+
}
|
|
188
|
+
/** "parada desde HH:MM: <motivo>", no fuso do dono; sem o instante, so o motivo. */
|
|
189
|
+
function paradaDesde(v, opcoes = {}) {
|
|
190
|
+
const desde = v.desdeEm && Number.isFinite(Date.parse(v.desdeEm)) ? ` desde ${(0, horario_1.formatarHora)(v.desdeEm, opcoes)}` : '';
|
|
191
|
+
return `parada${desde}: ${v.motivo ?? 'sem sessão viva verificada no runtime'}`;
|
|
192
|
+
}
|
|
193
|
+
/** "<thread> parada desde HH:MM: <motivo>": a linha que substitui o "sigo" quando a sessao nao esta viva. */
|
|
194
|
+
function textoDaParada(thread, v, opcoes = {}) {
|
|
195
|
+
return `${thread} ${paradaDesde(v, opcoes)}`;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* RM-063 (F3, GO-FIX): ha sessao viva trabalhando na thread? Pelo sessionId conhecido ou pela worktree dela (o
|
|
199
|
+
* adaptador que falha ou lanca depois de abrir a sessao nao devolve o id). E a prova que o `ork retry run` pede antes
|
|
200
|
+
* de redespachar: sem ela, a fase pode ganhar uma segunda sessao na mesma worktree. `respondeu: false` quando o
|
|
201
|
+
* runtime nao respondeu: sem prova, nada e redespachado.
|
|
202
|
+
*/
|
|
203
|
+
function sessaoVivaNaThread(raiz, thread, ids, consultar = () => (0, sessoes_contas_1.consultarContas)((0, estado_thread_1.raizDoEstado)(raiz), { todas: false, prazoMs: exports.PRAZO_DA_LEITURA_MS })) {
|
|
204
|
+
let r;
|
|
205
|
+
try {
|
|
206
|
+
r = consultar();
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
return { respondeu: false, sessionId: null, detalhe: curto(e.message, 120) };
|
|
210
|
+
}
|
|
211
|
+
const falha = r.fontes.find((f) => f.origem.startsWith('claude agents') && !f.ok);
|
|
212
|
+
if (falha)
|
|
213
|
+
return { respondeu: false, sessionId: null, detalhe: curto(`${f(falha.origem)}: ${falha.detalhe}`, 160) };
|
|
214
|
+
const real = (p) => { try {
|
|
215
|
+
return fs.realpathSync(p);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return path.resolve(p);
|
|
219
|
+
} };
|
|
220
|
+
const worktree = thread.worktree ? real(thread.worktree) : null;
|
|
221
|
+
const naWorktree = (cwd) => typeof cwd === 'string' && !!worktree &&
|
|
222
|
+
(real(cwd) === worktree || real(cwd).startsWith(worktree + path.sep));
|
|
223
|
+
const viva = r.sessoes.find((s) => s.viva && (ids.some((id) => id && (s.sessionId === id || s.sessionId.startsWith(id))) || naWorktree(s.cwd)));
|
|
224
|
+
return { respondeu: true, sessionId: viva?.sessionId ?? null, detalhe: null };
|
|
225
|
+
}
|
|
226
|
+
const f = (origem) => origem.replace(/\s+/g, ' ');
|
|
227
|
+
/** A vida de quem nao foi verificado: o retrato de outra maquina que nao publica a sessao. */
|
|
228
|
+
exports.VIDA_NAO_VERIFICADA = Object.freeze({ viva: false, sessionId: null, desdeEm: null, motivo: null });
|
|
229
|
+
/**
|
|
230
|
+
* A vida que vem no retrato de outra maquina (`ork/fabrica-estado`): so vale com os tipos certos. Retrato
|
|
231
|
+
* antigo, sem o campo, ou com o campo fora do formato, vira "nao verificada", e a linha nao diz "sigo".
|
|
232
|
+
*/
|
|
233
|
+
function vidaDoRetrato(bruto, publicadoEm, quando) {
|
|
234
|
+
if (!bruto || typeof bruto !== 'object')
|
|
235
|
+
return exports.VIDA_NAO_VERIFICADA;
|
|
236
|
+
const v = bruto;
|
|
237
|
+
const textoOuNulo = (x) => x === null || typeof x === 'string';
|
|
238
|
+
if (typeof v.viva !== 'boolean' || !textoOuNulo(v.desdeEm) || !textoOuNulo(v.motivo))
|
|
239
|
+
return exports.VIDA_NAO_VERIFICADA;
|
|
240
|
+
// A sessao viva de um retrato velho nao e "sigo": a maquina que morreu depois de publicar seguiria "viva" para sempre.
|
|
241
|
+
const idadeMs = publicadoEm && quando ? Date.parse(quando) - Date.parse(publicadoEm) : NaN;
|
|
242
|
+
if (v.viva && Number.isFinite(idadeMs) && idadeMs > exports.VALIDADE_DA_VIDA_NO_RETRATO_MS) {
|
|
243
|
+
const causa = { tipo: 'retratoVelho', minutos: Math.floor(idadeMs / 60000) };
|
|
244
|
+
return { viva: false, sessionId: null, desdeEm: publicadoEm ?? null, motivo: motivoDaCausa(causa), causa };
|
|
245
|
+
}
|
|
246
|
+
// Parada sem motivo publicado nao vira "nao verificada": a outra maquina disse que a sessao nao esta viva.
|
|
247
|
+
const motivo = v.motivo === null ? (v.viva ? null : 'sem sessão viva') : curto(v.motivo, 120);
|
|
248
|
+
return { viva: v.viva, sessionId: null, desdeEm: v.desdeEm, motivo };
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Ate quando a sessao viva de um retrato publicado vale: o retrato igual so volta ao remoto de hora em hora
|
|
252
|
+
* (`PULSACAO_MS` da fabrica), mais uma batida do pulse de folga.
|
|
253
|
+
*/
|
|
254
|
+
exports.VALIDADE_DA_VIDA_NO_RETRATO_MS = 75 * 60 * 1000;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.COMANDO_CONFIRMAR_WORKTREE = exports.ARQUIVO_WORKTREE_LOCAL = exports.CONTRATO_WORKTREE_LOCAL = void 0;
|
|
37
|
+
exports.caminhoRealPrevisto = caminhoRealPrevisto;
|
|
38
|
+
exports.pastaDasWorktreesPedida = pastaDasWorktreesPedida;
|
|
39
|
+
exports.lerWorktreeLocal = lerWorktreeLocal;
|
|
40
|
+
exports.recusaDePastaDasWorktrees = recusaDePastaDasWorktrees;
|
|
41
|
+
exports.exigirPastaDasWorktrees = exigirPastaDasWorktrees;
|
|
42
|
+
exports.confirmarWorktreeLocal = confirmarWorktreeLocal;
|
|
43
|
+
exports.revogarWorktreeLocal = revogarWorktreeLocal;
|
|
44
|
+
/**
|
|
45
|
+
* RM-047 (fronteira de confiança, P3): a pasta das worktrees fora da raiz vale só com a confirmação
|
|
46
|
+
* desta máquina.
|
|
47
|
+
*
|
|
48
|
+
* O `worktree.dir` mora no `orkastery.yaml`, que vem com o repositório, e o `git worktree add` cria o
|
|
49
|
+
* checkout (e o `.gitignore` da pasta) onde ele apontar. Dentro da raiz do projeto, pelo caminho real,
|
|
50
|
+
* nada muda. Fora dela (`..`, caminho absoluto ou um link versionado que leva para fora), a criação
|
|
51
|
+
* recusa com `worktree.dir-fora-da-raiz` até a máquina confirmar a mesma pasta com
|
|
52
|
+
* `ork setup worktree confirmar`. A confirmação fica em `.orkastery/private/worktree-local.json`, com
|
|
53
|
+
* as mesmas regras da postura de sandbox (P1): pasta 0700, arquivo 0600, nunca link, nunca rastreado
|
|
54
|
+
* pelo git, e só para este checkout e esta pasta.
|
|
55
|
+
*/
|
|
56
|
+
const fs = __importStar(require("node:fs"));
|
|
57
|
+
const path = __importStar(require("node:path"));
|
|
58
|
+
const estado_thread_1 = require("./estado-thread");
|
|
59
|
+
const postura_local_1 = require("./postura-local");
|
|
60
|
+
const util_1 = require("./util");
|
|
61
|
+
const locale_1 = require("./locale");
|
|
62
|
+
exports.CONTRATO_WORKTREE_LOCAL = 'ork.worktree-local/v1';
|
|
63
|
+
exports.ARQUIVO_WORKTREE_LOCAL = 'worktree-local.json';
|
|
64
|
+
/**
|
|
65
|
+
* Caminho real de um caminho que talvez ainda não exista: o real do ancestral mais próximo que existe,
|
|
66
|
+
* mais o resto. Um link no caminho (inclusive versionado no clone) é resolvido aqui.
|
|
67
|
+
*/
|
|
68
|
+
function caminhoRealPrevisto(alvo) {
|
|
69
|
+
let atual = path.resolve(alvo);
|
|
70
|
+
const resto = [];
|
|
71
|
+
for (;;) {
|
|
72
|
+
try {
|
|
73
|
+
return path.join(fs.realpathSync(atual), ...resto.reverse());
|
|
74
|
+
}
|
|
75
|
+
catch { /* sobe */ }
|
|
76
|
+
const pai = path.dirname(atual);
|
|
77
|
+
if (pai === atual)
|
|
78
|
+
return path.resolve(alvo);
|
|
79
|
+
resto.push(path.basename(atual));
|
|
80
|
+
atual = pai;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** A pasta das worktrees que o manifesto pede, pelo caminho real, e se ela fica dentro da raiz. */
|
|
84
|
+
function pastaDasWorktreesPedida(raiz, manifesto) {
|
|
85
|
+
let principal;
|
|
86
|
+
try {
|
|
87
|
+
principal = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
principal = path.resolve(raiz);
|
|
91
|
+
}
|
|
92
|
+
const raizReal = caminhoRealPrevisto(principal);
|
|
93
|
+
const dir = caminhoRealPrevisto(path.resolve(principal, manifesto.worktree.dir));
|
|
94
|
+
const rel = path.relative(raizReal, dir);
|
|
95
|
+
const primeiro = rel.split(path.sep)[0];
|
|
96
|
+
const dentro = !rel.startsWith('..') && !path.isAbsolute(rel) && primeiro !== '.git';
|
|
97
|
+
return { dir, dentro };
|
|
98
|
+
}
|
|
99
|
+
/** Lê a confirmação local; `null` com o motivo quando ela não existe ou não vale. */
|
|
100
|
+
function lerWorktreeLocal(raiz) {
|
|
101
|
+
const { bruto: o, motivo } = (0, postura_local_1.lerArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL);
|
|
102
|
+
if (!o)
|
|
103
|
+
return { local: null, motivo };
|
|
104
|
+
if (o.contrato !== exports.CONTRATO_WORKTREE_LOCAL || typeof o.dir !== 'string' || typeof o.raiz !== 'string' ||
|
|
105
|
+
typeof o.confirmadoEm !== 'string' || typeof o.por !== 'string') {
|
|
106
|
+
return { local: null, motivo: `${exports.ARQUIVO_WORKTREE_LOCAL} fora do contrato ${exports.CONTRATO_WORKTREE_LOCAL}` };
|
|
107
|
+
}
|
|
108
|
+
if (o.raiz !== (0, postura_local_1.raizRealDoEstado)(raiz))
|
|
109
|
+
return { local: null, motivo: 'a confirmação local é de outro checkout' };
|
|
110
|
+
return { local: o, motivo: null };
|
|
111
|
+
}
|
|
112
|
+
/** Comando que confirma a pasta nesta máquina; vai em toda recusa. */
|
|
113
|
+
exports.COMANDO_CONFIRMAR_WORKTREE = 'ork setup worktree confirmar';
|
|
114
|
+
/**
|
|
115
|
+
* A recusa da criação de worktree: `null` quando a pasta do manifesto fica dentro da raiz, ou quando
|
|
116
|
+
* a máquina confirmou exatamente essa pasta; senão o erro tipado com o comando que confirma.
|
|
117
|
+
*/
|
|
118
|
+
function recusaDePastaDasWorktrees(raiz, manifesto) {
|
|
119
|
+
const montar = montadorDaRecusa(raiz, manifesto);
|
|
120
|
+
return montar ? montar((0, locale_1.msg)('pt-BR')) : null;
|
|
121
|
+
}
|
|
122
|
+
/** RM-061 (F3b): a recusa pelo catalogo, com o que ela cita lido antes; `null` quando a pasta vale. */
|
|
123
|
+
function montadorDaRecusa(raiz, manifesto) {
|
|
124
|
+
const { dir, dentro } = pastaDasWorktreesPedida(raiz, manifesto);
|
|
125
|
+
if (dentro)
|
|
126
|
+
return null;
|
|
127
|
+
const { local, motivo } = lerWorktreeLocal(raiz);
|
|
128
|
+
if (local && local.dir === dir)
|
|
129
|
+
return null;
|
|
130
|
+
const pedido = JSON.stringify(manifesto.worktree.dir).slice(0, 200);
|
|
131
|
+
return (m) => m.worktree.dirForaDaRaiz(pedido, dir, local ? local.dir : null, motivo, exports.COMANDO_CONFIRMAR_WORKTREE);
|
|
132
|
+
}
|
|
133
|
+
/** Lança a recusa, quando houver, pelo catalogo: o CLI a remonta no locale do comando. */
|
|
134
|
+
function exigirPastaDasWorktrees(raiz, manifesto) {
|
|
135
|
+
const montar = montadorDaRecusa(raiz, manifesto);
|
|
136
|
+
if (montar)
|
|
137
|
+
throw new locale_1.ErroDoCatalogo(montar);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Grava a confirmação local da pasta que o manifesto pede hoje. Com `esperado`, ele precisa levar à
|
|
141
|
+
* mesma pasta: a máquina confirma o que leu, não o que o manifesto pode passar a dizer depois.
|
|
142
|
+
*/
|
|
143
|
+
function confirmarWorktreeLocal(raiz, manifesto, por, esperado) {
|
|
144
|
+
const { dir, dentro } = pastaDasWorktreesPedida(raiz, manifesto);
|
|
145
|
+
if (esperado !== undefined) {
|
|
146
|
+
let principal;
|
|
147
|
+
try {
|
|
148
|
+
principal = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
principal = path.resolve(raiz);
|
|
152
|
+
}
|
|
153
|
+
const pedido = caminhoRealPrevisto(path.resolve(principal, esperado));
|
|
154
|
+
if (pedido !== dir) {
|
|
155
|
+
throw new Error(`worktree.dir-divergente: o orkastery.yaml leva a ${dir}, não a ${pedido}; nada foi confirmado`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (dentro)
|
|
159
|
+
throw new Error(`worktree.dir-dentro-da-raiz: ${dir} fica dentro do projeto e não precisa de confirmação`);
|
|
160
|
+
const local = { contrato: exports.CONTRATO_WORKTREE_LOCAL, dir, raiz: (0, postura_local_1.raizRealDoEstado)(raiz), confirmadoEm: (0, util_1.agora)(), por };
|
|
161
|
+
(0, postura_local_1.gravarArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL, local);
|
|
162
|
+
return local;
|
|
163
|
+
}
|
|
164
|
+
/** Apaga a confirmação local; devolve se havia uma. */
|
|
165
|
+
function revogarWorktreeLocal(raiz) {
|
|
166
|
+
return (0, postura_local_1.revogarArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL);
|
|
167
|
+
}
|