@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rotuloDoNo = exports.ErroDeConsulta = exports.AVISO_DE_PARCIALIDADE = exports.CANDIDATOS_LISTADOS = exports.LIMITE_MAXIMO = exports.LIMITE_PADRAO = exports.PROFUNDIDADE_MAXIMA = exports.CONSULTA_SCHEMA = void 0;
|
|
3
|
+
exports.rotuloDoNo = exports.ErroDeConsulta = exports.TUDO_IGUAL = exports.TEXTOS_DA_CONSULTA = exports.AVISO_DE_PARCIALIDADE = exports.CANDIDATOS_LISTADOS = exports.LIMITE_MAXIMO = exports.LIMITE_PADRAO = exports.PROFUNDIDADE_MAXIMA = exports.CONSULTA_SCHEMA = void 0;
|
|
4
4
|
exports.filtrarGrafo = filtrarGrafo;
|
|
5
5
|
exports.prepararConsulta = prepararConsulta;
|
|
6
6
|
exports.resolverNo = resolverNo;
|
|
@@ -23,6 +23,10 @@ exports.textoDaResposta = textoDaResposta;
|
|
|
23
23
|
*
|
|
24
24
|
* D7: a resposta e a mesma para o mesmo grafo e a mesma pergunta, byte a byte, em texto e em JSON
|
|
25
25
|
* (`ork.code-graph-query/v0`, provisorio e fora do contrato): ordem por code point, sem horario.
|
|
26
|
+
*
|
|
27
|
+
* RM-031 KG5 fatia 5 (D2 a D4, D9, D10): a resposta traz `fontes`, o sha256 e o blob de cada caminho
|
|
28
|
+
* citado, e cada aresta diz se as fontes dela conferem com a arvore. Quem chama passa a situacao de
|
|
29
|
+
* cada caminho (o CLI le os bytes); sem ela, tudo vale `igual`, e a consulta continua sem arquivo.
|
|
26
30
|
*/
|
|
27
31
|
const intelligence_graph_contract_1 = require("./intelligence-graph-contract");
|
|
28
32
|
exports.CONSULTA_SCHEMA = 'ork.code-graph-query/v0';
|
|
@@ -32,6 +36,25 @@ exports.LIMITE_MAXIMO = 10_000;
|
|
|
32
36
|
/** Candidatos listados quando um nome solto e ambiguo. */
|
|
33
37
|
exports.CANDIDATOS_LISTADOS = 20;
|
|
34
38
|
exports.AVISO_DE_PARCIALIDADE = 'parcial: so arestas que o extrator prova; chamada por despacho de tipo, import nao resolvido e as lacunas do relatorio de extracao ficam fora';
|
|
39
|
+
exports.TEXTOS_DA_CONSULTA = {
|
|
40
|
+
titulo: (repositorio, revisao, chave, snapshot) => `grafo de ${repositorio} na revisao ${revisao}, indice ${chave}, snapshot ${snapshot}`,
|
|
41
|
+
arvore: 'aviso: a arvore tem mudanca rastreada; a resposta e do HEAD, nao da arvore',
|
|
42
|
+
fontes: (lista, resto) => `fontes que mudaram na arvore: ${lista}${resto ? ` e mais ${resto}` : ''}`,
|
|
43
|
+
marca: ' [fonte modificada na arvore]',
|
|
44
|
+
pagina: (pagina) => `pagina ${pagina}`,
|
|
45
|
+
extratores: (lista) => `extratores: ${lista}`,
|
|
46
|
+
semCaminho: (de, para, sentido, nos) => `sem caminho de ${de} para ${para} (sentido ${sentido}): ${nos} nos explorados`,
|
|
47
|
+
caminho: (de, para, sentido, passos) => `caminho de ${de} para ${para} (sentido ${sentido}): ${passos} passo(s)`,
|
|
48
|
+
contra: '(contra a aresta) ',
|
|
49
|
+
todos: 'todos',
|
|
50
|
+
resultado: (tipo, alvo, profundidade, filtro, arestas, nos) => `${tipo} de ${alvo} (profundidade ${profundidade}${filtro}): ${arestas} aresta(s), ${nos} no(s)`,
|
|
51
|
+
filtro: (sentido, tipos) => `, sentido ${sentido}, tipos ${tipos}`,
|
|
52
|
+
truncado: (devolvidas, total) => `truncado: ${devolvidas} de ${total} arestas, as mais perto do alvo; use --limite`,
|
|
53
|
+
parcial: exports.AVISO_DE_PARCIALIDADE,
|
|
54
|
+
};
|
|
55
|
+
/** Sem saber da arvore, toda fonte vale `igual`: e o que a arvore limpa garante. */
|
|
56
|
+
const TUDO_IGUAL = () => 'igual';
|
|
57
|
+
exports.TUDO_IGUAL = TUDO_IGUAL;
|
|
35
58
|
/** Erro tipado da consulta; `candidatos` so no nome ambiguo, e so com nos visiveis. */
|
|
36
59
|
class ErroDeConsulta extends Error {
|
|
37
60
|
codigo;
|
|
@@ -101,7 +124,11 @@ function prepararConsulta(grafoInteiro, concessao) {
|
|
|
101
124
|
lista.sort(ordem((a) => rotulos.get(a.from)));
|
|
102
125
|
for (const lista of porFragmento.values())
|
|
103
126
|
lista.sort((x, y) => (0, intelligence_graph_contract_1.compararUtf8)((0, exports.rotuloDoNo)(x), (0, exports.rotuloDoNo)(y)));
|
|
104
|
-
|
|
127
|
+
const fontes = new Map();
|
|
128
|
+
for (const m of grafo.snapshot.source_manifest)
|
|
129
|
+
if (visivel(m.access, concessao))
|
|
130
|
+
fontes.set(m.path, { source_hash: m.source_hash, source_version: m.source_version });
|
|
131
|
+
return { repository_id: grafo.repository_id, snapshot_id: grafo.snapshot.snapshot_id, nos, rotulos, porLocalizador, arquivos, porFragmento, saida, entrada, fontes };
|
|
105
132
|
}
|
|
106
133
|
function ambiguo(texto, candidatos) {
|
|
107
134
|
const rotulos = candidatos.map(exports.rotuloDoNo).sort(intelligence_graph_contract_1.compararUtf8);
|
|
@@ -169,6 +196,31 @@ function arestaDaResposta(g, a, distancia) {
|
|
|
169
196
|
|| (0, intelligence_graph_contract_1.compararUtf8)(x.extractor_id, y.extractor_id) || (0, intelligence_graph_contract_1.compararUtf8)(x.extraction_method, y.extraction_method));
|
|
170
197
|
return { kind: a.kind, from: g.rotulos.get(a.from), to: g.rotulos.get(a.to), edge_id: a.edge_id, distancia, evidencias };
|
|
171
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* KG5 fatia 5 (D4): a aresta so e `igual` quando as fontes dela inteiras conferem: o arquivo da origem, o
|
|
201
|
+
* do alvo (calls e imports resolvem o alvo nele) e os das evidencias. So as devolvidas pedem a situacao.
|
|
202
|
+
* Com teto, a busca binaria monta respostas com limites diferentes, e o CLI le os arquivos citados pela
|
|
203
|
+
* maior delas, a do limite pedido, mesmo os que o corte tira (CHECK rodada 1, S4).
|
|
204
|
+
*/
|
|
205
|
+
function comArvore(g, a, r, situacao) {
|
|
206
|
+
const caminhos = [g.nos.get(a.from).locator.path, g.nos.get(a.to).locator.path, ...r.evidencias.map((e) => e.path)];
|
|
207
|
+
const { evidencias, ...resto } = r;
|
|
208
|
+
return { ...resto, arvore: caminhos.every((p) => situacao(p) === 'igual') ? 'igual' : 'modificada', evidencias };
|
|
209
|
+
}
|
|
210
|
+
/** KG5 fatia 5 (D2, D10): uma entrada por caminho dos nos e das evidencias da resposta, em ordem UTF-8. */
|
|
211
|
+
function fontesDaResposta(g, nos, arestas, situacao) {
|
|
212
|
+
const caminhos = new Set(nos.map((n) => n.path));
|
|
213
|
+
for (const a of arestas)
|
|
214
|
+
for (const e of a.evidencias)
|
|
215
|
+
caminhos.add(e.path);
|
|
216
|
+
const fontes = [];
|
|
217
|
+
for (const p of [...caminhos].sort(intelligence_graph_contract_1.compararUtf8)) {
|
|
218
|
+
const f = g.fontes.get(p);
|
|
219
|
+
if (f)
|
|
220
|
+
fontes.push({ path: p, source_hash: f.source_hash, source_version: f.source_version, arvore: situacao(p) });
|
|
221
|
+
}
|
|
222
|
+
return fontes;
|
|
223
|
+
}
|
|
172
224
|
/** CHECK rodada 1 (A2): primeiro as arestas mais perto do alvo, e o limite corta as mais longe. */
|
|
173
225
|
const ordemDasArestas = (x, y) => (x.distancia - y.distancia)
|
|
174
226
|
|| (0, intelligence_graph_contract_1.compararUtf8)(x.kind, y.kind) || (0, intelligence_graph_contract_1.compararUtf8)(x.from, y.from) || (0, intelligence_graph_contract_1.compararUtf8)(x.to, y.to) || (0, intelligence_graph_contract_1.compararUtf8)(x.edge_id, y.edge_id);
|
|
@@ -204,7 +256,7 @@ function tiposValidos(tipos) {
|
|
|
204
256
|
* cada uma com a distancia do no que a explorou. `limite` corta pela distancia e pela ordem fixa, e
|
|
205
257
|
* a lista de nos so traz o alvo e as pontas das arestas devolvidas.
|
|
206
258
|
*/
|
|
207
|
-
function vizinhanca(g, cabecalho, tipo, texto, opcoes) {
|
|
259
|
+
function vizinhanca(g, cabecalho, tipo, texto, opcoes, situacao) {
|
|
208
260
|
const profundidade = inteiroEntre('profundidade', opcoes.profundidade ?? 1, 1, exports.PROFUNDIDADE_MAXIMA);
|
|
209
261
|
const limite = inteiroEntre('limite', opcoes.limite ?? exports.LIMITE_PADRAO, 1, exports.LIMITE_MAXIMO);
|
|
210
262
|
const sentido = opcoes.sentido ?? 'ambos';
|
|
@@ -228,8 +280,8 @@ function vizinhanca(g, cabecalho, tipo, texto, opcoes) {
|
|
|
228
280
|
}
|
|
229
281
|
camada = proxima;
|
|
230
282
|
}
|
|
231
|
-
const todas = [...vistas.values()].map(({ aresta, d }) => arestaDaResposta(g, aresta, d)).sort(ordemDasArestas);
|
|
232
|
-
const devolvidas = todas.slice(0, limite);
|
|
283
|
+
const todas = [...vistas.values()].map(({ aresta, d }) => ({ aresta, r: arestaDaResposta(g, aresta, d) })).sort((x, y) => ordemDasArestas(x.r, y.r));
|
|
284
|
+
const devolvidas = todas.slice(0, limite).map(({ aresta, r }) => comArvore(g, aresta, r, situacao));
|
|
233
285
|
const idPorRotulo = new Map([...distancia.keys()].map((id) => [g.rotulos.get(id), id]));
|
|
234
286
|
const pontas = new Set([alvo.node_id, ...devolvidas.flatMap((a) => [idPorRotulo.get(a.from), idPorRotulo.get(a.to)])]);
|
|
235
287
|
const nos = [...pontas].map((id) => noDaResposta(g, g.nos.get(id), distancia.get(id)))
|
|
@@ -239,31 +291,31 @@ function vizinhanca(g, cabecalho, tipo, texto, opcoes) {
|
|
|
239
291
|
consulta: { tipo, alvo: texto, para: null, profundidade, sentido, tipos, limite },
|
|
240
292
|
indice: cabecalho, alvo: noDaResposta(g, alvo, 0), para: null, nos, total_nos: distancia.size,
|
|
241
293
|
arestas: devolvidas, total_arestas: todas.length, truncado: todas.length > limite,
|
|
242
|
-
caminho: null, nos_explorados: null, parcial: exports.AVISO_DE_PARCIALIDADE,
|
|
294
|
+
caminho: null, nos_explorados: null, fontes: fontesDaResposta(g, nos, devolvidas, situacao), parcial: exports.AVISO_DE_PARCIALIDADE,
|
|
243
295
|
};
|
|
244
296
|
}
|
|
245
|
-
function vizinhos(g, cabecalho, alvo, opcoes = {}) {
|
|
246
|
-
return vizinhanca(g, cabecalho, 'vizinhos', alvo, opcoes);
|
|
297
|
+
function vizinhos(g, cabecalho, alvo, opcoes = {}, situacao = exports.TUDO_IGUAL) {
|
|
298
|
+
return vizinhanca(g, cabecalho, 'vizinhos', alvo, opcoes, situacao);
|
|
247
299
|
}
|
|
248
300
|
/** Quem chama o simbolo: as arestas `calls` que chegam, ate `profundidade` saltos. */
|
|
249
|
-
function chamadores(g, cabecalho, alvo, opcoes = {}) {
|
|
301
|
+
function chamadores(g, cabecalho, alvo, opcoes = {}, situacao = exports.TUDO_IGUAL) {
|
|
250
302
|
if (resolverNo(g, alvo).kind !== 'symbol')
|
|
251
303
|
throw new ErroDeConsulta('grafo.consulta.alvo-invalido', 'chamadores pede um simbolo; para arquivo, use importadores ou vizinhos');
|
|
252
|
-
return vizinhanca(g, cabecalho, 'chamadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['calls'] });
|
|
304
|
+
return vizinhanca(g, cabecalho, 'chamadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['calls'] }, situacao);
|
|
253
305
|
}
|
|
254
306
|
/** Quem importa o arquivo ou o simbolo: as arestas `imports` que chegam, ate `profundidade` saltos. */
|
|
255
|
-
function importadores(g, cabecalho, alvo, opcoes = {}) {
|
|
307
|
+
function importadores(g, cabecalho, alvo, opcoes = {}, situacao = exports.TUDO_IGUAL) {
|
|
256
308
|
const kind = resolverNo(g, alvo).kind;
|
|
257
309
|
if (kind !== 'file' && kind !== 'symbol')
|
|
258
310
|
throw new ErroDeConsulta('grafo.consulta.alvo-invalido', 'importadores pede um arquivo ou um simbolo');
|
|
259
|
-
return vizinhanca(g, cabecalho, 'importadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['imports'] });
|
|
311
|
+
return vizinhanca(g, cabecalho, 'importadores', alvo, { ...opcoes, sentido: 'entrada', tipos: ['imports'] }, situacao);
|
|
260
312
|
}
|
|
261
313
|
/**
|
|
262
314
|
* D5: o menor caminho de `de` a `para`, pelas arestas no sentido pedido (padrao: `saida`, a direcao
|
|
263
315
|
* da aresta). Busca em largura com a expansao na ordem fixa: entre caminhos do mesmo tamanho, sai
|
|
264
316
|
* sempre o mesmo. Sem caminho, `caminho` e `null`, com os nos explorados.
|
|
265
317
|
*/
|
|
266
|
-
function caminho(g, cabecalho, de, para, opcoes = {}) {
|
|
318
|
+
function caminho(g, cabecalho, de, para, opcoes = {}, situacao = exports.TUDO_IGUAL) {
|
|
267
319
|
const sentido = opcoes.sentido ?? 'saida';
|
|
268
320
|
if (!['entrada', 'saida', 'ambos'].includes(sentido))
|
|
269
321
|
throw new ErroDeConsulta('grafo.consulta.uso', `sentido desconhecido: ${sentido}`);
|
|
@@ -284,61 +336,71 @@ function caminho(g, cabecalho, de, para, opcoes = {}) {
|
|
|
284
336
|
if (anterior.has(destino.node_id)) {
|
|
285
337
|
const cadeia = [];
|
|
286
338
|
for (let id = destino.node_id, atual = anterior.get(id); atual; id = atual.de, atual = anterior.get(id)) {
|
|
287
|
-
cadeia.push({ id,
|
|
339
|
+
cadeia.push({ id, sentido: atual.sentido, aresta: atual.aresta });
|
|
288
340
|
}
|
|
289
341
|
cadeia.reverse();
|
|
290
|
-
cadeia.
|
|
291
|
-
passos = cadeia.map((c) => c.passo);
|
|
342
|
+
passos = cadeia.map((c, n) => ({ sentido: c.sentido, aresta: comArvore(g, c.aresta, arestaDaResposta(g, c.aresta, n), situacao) }));
|
|
292
343
|
nos = [origem.node_id, ...cadeia.map((c) => c.id)].map((id, d) => noDaResposta(g, g.nos.get(id), d));
|
|
293
344
|
}
|
|
345
|
+
const arestas = passos ? passos.map((p) => p.aresta) : [];
|
|
294
346
|
return {
|
|
295
347
|
schema: exports.CONSULTA_SCHEMA,
|
|
296
348
|
consulta: { tipo: 'caminho', alvo: de, para, profundidade: null, sentido, tipos, limite: null },
|
|
297
349
|
indice: cabecalho, alvo: noDaResposta(g, origem, 0), para: noDaResposta(g, destino, passos ? passos.length : null),
|
|
298
350
|
nos, total_nos: nos.length,
|
|
299
|
-
arestas
|
|
300
|
-
caminho: passos, nos_explorados: anterior.size, parcial: exports.AVISO_DE_PARCIALIDADE,
|
|
351
|
+
arestas, total_arestas: arestas.length, truncado: false,
|
|
352
|
+
caminho: passos, nos_explorados: anterior.size, fontes: fontesDaResposta(g, nos, arestas, situacao), parcial: exports.AVISO_DE_PARCIALIDADE,
|
|
301
353
|
};
|
|
302
354
|
}
|
|
303
355
|
function jsonDaResposta(r) {
|
|
304
356
|
return JSON.stringify(r, null, 2);
|
|
305
357
|
}
|
|
306
|
-
function linhasDaEvidencia(e) {
|
|
358
|
+
function linhasDaEvidencia(e, m) {
|
|
307
359
|
const s = e.span;
|
|
308
360
|
const onde = s.type === 'text'
|
|
309
361
|
? `${e.path}:${s.line_start ?? '?'}${s.line_end !== null && s.line_end !== s.line_start ? `-${s.line_end}` : ''}`
|
|
310
|
-
: `${e.path}
|
|
362
|
+
: `${e.path} ${m.pagina(s.page)}`;
|
|
311
363
|
return ` ${e.extractor_id} ${e.extraction_method} ${onde} bytes ${s.byte_start}-${s.byte_end}`;
|
|
312
364
|
}
|
|
313
|
-
|
|
314
|
-
|
|
365
|
+
/** KG5 fatia 5 (D9): a aresta cuja fonte mudou diz isso na propria linha, como o JSON diz no campo `arvore`. */
|
|
366
|
+
function linhasDaAresta(a, m, prefixo = ' ') {
|
|
367
|
+
const marca = a.arvore === 'modificada' ? m.marca : '';
|
|
368
|
+
return [`${prefixo}${a.kind} ${a.from} -> ${a.to}${marca}`, ...a.evidencias.map((e) => linhasDaEvidencia(e, m))];
|
|
369
|
+
}
|
|
370
|
+
/** KG5 fatia 5 (D9): ate cinco fontes que nao tem na arvore os bytes do indice, com a situacao de cada uma. */
|
|
371
|
+
function linhaDasFontesMudadas(fontes, m) {
|
|
372
|
+
const mudaram = fontes.filter((f) => f.arvore !== 'igual');
|
|
373
|
+
if (!mudaram.length)
|
|
374
|
+
return [];
|
|
375
|
+
return [m.fontes(mudaram.slice(0, 5).map((f) => `${f.path} (${f.arvore})`).join(', '), Math.max(0, mudaram.length - 5))];
|
|
315
376
|
}
|
|
316
|
-
function textoDaResposta(r) {
|
|
377
|
+
function textoDaResposta(r, m = exports.TEXTOS_DA_CONSULTA) {
|
|
317
378
|
const c = r.consulta, i = r.indice;
|
|
318
379
|
const linhas = [
|
|
319
|
-
|
|
380
|
+
m.titulo(i.repository_id, i.revision.slice(0, 12), i.chave.slice(0, 16), i.snapshot_id.slice(0, 17)),
|
|
320
381
|
];
|
|
321
382
|
if (i.arvore === 'modificada')
|
|
322
|
-
linhas.push(
|
|
323
|
-
linhas.push(
|
|
383
|
+
linhas.push(m.arvore);
|
|
384
|
+
linhas.push(...linhaDasFontesMudadas(r.fontes, m));
|
|
385
|
+
linhas.push(m.extratores(i.extratores.map((e) => `${e.extractor_id} ${e.extractor_version}`).join(', ')));
|
|
324
386
|
if (c.tipo === 'caminho') {
|
|
325
387
|
const para = r.para;
|
|
326
388
|
if (!r.caminho) {
|
|
327
|
-
linhas.push(
|
|
389
|
+
linhas.push(m.semCaminho(r.alvo.rotulo, para.rotulo, c.sentido, r.nos_explorados));
|
|
328
390
|
}
|
|
329
391
|
else {
|
|
330
|
-
linhas.push(
|
|
331
|
-
r.caminho.forEach((p, n) => linhas.push(...linhasDaAresta(p.aresta, ` ${n + 1}. ${p.sentido === 'entrada' ?
|
|
392
|
+
linhas.push(m.caminho(r.alvo.rotulo, para.rotulo, c.sentido, r.caminho.length));
|
|
393
|
+
r.caminho.forEach((p, n) => linhas.push(...linhasDaAresta(p.aresta, m, ` ${n + 1}. ${p.sentido === 'entrada' ? m.contra : ''}`)));
|
|
332
394
|
}
|
|
333
395
|
}
|
|
334
396
|
else {
|
|
335
|
-
const filtro = c.tipo === 'vizinhos' ?
|
|
336
|
-
linhas.push(
|
|
397
|
+
const filtro = c.tipo === 'vizinhos' ? m.filtro(c.sentido, c.tipos.length === intelligence_graph_contract_1.TIPOS_DE_ARESTA.length ? m.todos : c.tipos.join(',')) : '';
|
|
398
|
+
linhas.push(m.resultado(c.tipo, r.alvo.rotulo, c.profundidade, filtro, r.total_arestas, r.total_nos - 1));
|
|
337
399
|
for (const a of r.arestas)
|
|
338
|
-
linhas.push(...linhasDaAresta(a));
|
|
400
|
+
linhas.push(...linhasDaAresta(a, m));
|
|
339
401
|
if (r.truncado)
|
|
340
|
-
linhas.push(
|
|
402
|
+
linhas.push(m.truncado(r.arestas.length, r.total_arestas));
|
|
341
403
|
}
|
|
342
|
-
linhas.push(
|
|
404
|
+
linhas.push(m.parcial);
|
|
343
405
|
return linhas.join('\n');
|
|
344
406
|
}
|
package/dist/leases.js
CHANGED
|
@@ -97,6 +97,7 @@ const horario_1 = require("./horario");
|
|
|
97
97
|
const conducao_texto_1 = require("./conducao-texto");
|
|
98
98
|
const ledger_1 = require("./ledger");
|
|
99
99
|
const thread_1 = require("./thread");
|
|
100
|
+
const locale_1 = require("./locale");
|
|
100
101
|
/** Nome do lease que serializa o merge na base (visao, paridade 5). */
|
|
101
102
|
exports.LEASE_MAIN_TREE = 'main-tree';
|
|
102
103
|
/** TTL padrao de 30 minutos: um SHIP que passe disso deixou de existir. */
|
|
@@ -1033,24 +1034,25 @@ function adquirirRegiao(raiz, nome, opcoes) {
|
|
|
1033
1034
|
}
|
|
1034
1035
|
/** Texto de `ork lease list`: leases ativos, familias e a fila por colisao. */
|
|
1035
1036
|
function tabelaDeLeases(raiz) {
|
|
1037
|
+
const m = (0, locale_1.msg)().operacao.restante.lease;
|
|
1036
1038
|
const emDisco = leasesEmDisco(raiz);
|
|
1037
1039
|
const fila = lerFila(raiz);
|
|
1038
|
-
const linhas = [
|
|
1040
|
+
const linhas = [m.titulo, ''];
|
|
1039
1041
|
const principal = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
1040
1042
|
if (emDisco.length === 0) {
|
|
1041
|
-
linhas.push(
|
|
1043
|
+
linhas.push(m.nenhum);
|
|
1042
1044
|
}
|
|
1043
1045
|
else {
|
|
1044
1046
|
for (const { lease: l, legado } of emDisco) {
|
|
1045
|
-
const situacao = expirado(l) ?
|
|
1046
|
-
linhas.push(
|
|
1047
|
-
linhas.push(
|
|
1048
|
-
linhas.push(
|
|
1047
|
+
const situacao = expirado(l) ? m.situacao.vencido : m.situacao.ativo;
|
|
1048
|
+
linhas.push(m.item(textoSeguro(l.nome), tipoDoLease(l.nome), textoSeguro(l.thread), situacao));
|
|
1049
|
+
linhas.push(m.periodo((0, horario_1.formatarDataHora)(l.adquiridoEm), (0, horario_1.formatarDataHora)(l.expiraEm), l.pid));
|
|
1050
|
+
linhas.push(m.motivo(textoSeguro(l.motivo)));
|
|
1049
1051
|
// RM-036: a copia antiga e somente lida, ate vencer ou encerrar a janela.
|
|
1050
1052
|
if (legado) {
|
|
1051
1053
|
const relativo = path.relative(principal, legado);
|
|
1052
1054
|
const onde = relativo && !relativo.startsWith('..') && !path.isAbsolute(relativo) ? relativo : legado;
|
|
1053
|
-
linhas.push(
|
|
1055
|
+
linhas.push(m.legado(textoSeguro(onde)));
|
|
1054
1056
|
}
|
|
1055
1057
|
// I-36: o lease de execucao diz quem conduz, com a mesma linha das outras superficies.
|
|
1056
1058
|
const conducao = (0, conducao_texto_1.conducaoDoLease)(l);
|
|
@@ -1088,15 +1090,15 @@ function tabelaDeLeases(raiz) {
|
|
|
1088
1090
|
}
|
|
1089
1091
|
if (tipoDoLease(nome) === 'exec')
|
|
1090
1092
|
continue;
|
|
1091
|
-
linhas.push(
|
|
1092
|
-
linhas.push(
|
|
1093
|
+
linhas.push(m.legadoInvalido(textoSeguro(arquivo)));
|
|
1094
|
+
linhas.push(m.legadoPreservado);
|
|
1093
1095
|
}
|
|
1094
1096
|
}
|
|
1095
1097
|
linhas.push('');
|
|
1096
1098
|
// Consulta nao recolhe candidatos: mostra a fila, inclusive sobras de SIGKILL.
|
|
1097
1099
|
const pasta = dirLeases(raiz);
|
|
1098
1100
|
const retomadas = fs.existsSync(pasta) ? fs.readdirSync(pasta).filter((n) => n.endsWith('.json.retomadas')).sort() : [];
|
|
1099
|
-
linhas.push(
|
|
1101
|
+
linhas.push(m.filaRetomada(retomadas.length));
|
|
1100
1102
|
for (const nome of retomadas) {
|
|
1101
1103
|
const dir = path.join(pasta, nome);
|
|
1102
1104
|
linhas.push(` ${textoSeguro(nome)}`);
|
|
@@ -1108,25 +1110,24 @@ function tabelaDeLeases(raiz) {
|
|
|
1108
1110
|
if (!c)
|
|
1109
1111
|
continue;
|
|
1110
1112
|
const idade = Math.max(0, Date.now() - c.stat.mtimeMs), vencido = idade >= exports.TTL_PADRAO_MS;
|
|
1111
|
-
linhas.push(
|
|
1113
|
+
linhas.push(m.candidato(textoSeguro(c.nome), c.pid, c.ticket, Math.floor(idade / 1000)));
|
|
1112
1114
|
if (vencido)
|
|
1113
|
-
linhas.push(
|
|
1115
|
+
linhas.push(m.prazo);
|
|
1114
1116
|
}
|
|
1115
1117
|
}
|
|
1116
1118
|
catch {
|
|
1117
|
-
linhas.push(
|
|
1119
|
+
linhas.push(m.filaInsegura);
|
|
1118
1120
|
}
|
|
1119
1121
|
}
|
|
1120
1122
|
const merge = fila.filter((p) => p.tipo === 'main-tree');
|
|
1121
1123
|
const regiao = fila.filter((p) => p.tipo !== 'main-tree');
|
|
1122
|
-
linhas.push(
|
|
1124
|
+
linhas.push(m.filaMerge(merge.length));
|
|
1123
1125
|
merge.forEach((p, i) => {
|
|
1124
|
-
linhas.push(
|
|
1126
|
+
linhas.push(m.esperaMerge(i + 1, textoSeguro(p.thread), (0, horario_1.formatarDesde)(p.desdeEm), textoSeguro(p.bloqueadaPor)));
|
|
1125
1127
|
});
|
|
1126
|
-
linhas.push(
|
|
1128
|
+
linhas.push(m.filaRegiao(regiao.length));
|
|
1127
1129
|
regiao.forEach((p, i) => {
|
|
1128
|
-
linhas.push(
|
|
1129
|
-
`(thread ${textoSeguro(p.bloqueadaPor)}) desde ${(0, horario_1.formatarDesde)(p.desdeEm)}`);
|
|
1130
|
+
linhas.push(m.esperaRegiao(i + 1, textoSeguro(p.thread), textoSeguro(p.nome), textoSeguro(p.colidiuCom), textoSeguro(p.bloqueadaPor), (0, horario_1.formatarDesde)(p.desdeEm)));
|
|
1130
1131
|
});
|
|
1131
1132
|
if (emDisco.length > 0 || fila.length > 0)
|
|
1132
1133
|
linhas.push((0, horario_1.legendaDoFuso)());
|
package/dist/ledger-stats.js
CHANGED
|
@@ -45,6 +45,7 @@ const ledger_1 = require("./ledger");
|
|
|
45
45
|
const util_1 = require("./util");
|
|
46
46
|
const horario_1 = require("./horario");
|
|
47
47
|
const hitl_tempo_parado_1 = require("./hitl-tempo-parado");
|
|
48
|
+
const locale_1 = require("./locale");
|
|
48
49
|
const MOTIVOS_PREVENTIVOS = new Set([
|
|
49
50
|
'policy.violation', 'cost.violation', 'verify.regression', 'claims.failed', 'claims.unverifiable',
|
|
50
51
|
]);
|
|
@@ -260,27 +261,27 @@ function registrarEstimativaPlano(raiz, threadId, dados) {
|
|
|
260
261
|
throw Error('ledger.estimate.head-unavailable');
|
|
261
262
|
return (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, 'plan_estimate', { fase: 'PLAN', unidade: 'hours', semIaHoras: dados.semIaHoras, iaSemOrkHoras: dados.iaSemOrkHoras, por: dados.por, metodo: dados.metodo, premissas: dados.premissas, incerteza: dados.incerteza ?? 'nao informada', head: head.stdout.trim() });
|
|
262
263
|
}
|
|
263
|
-
const minutos = (ms) => ms === null ?
|
|
264
|
+
const minutos = (ms) => ms === null ? (0, locale_1.msg)().operacao.ledger.semResposta : `${(ms / 60_000).toFixed(1)} min`;
|
|
264
265
|
/** RM-057: uma linha, com a meta ao lado da mediana, para o dono ver o tempo parado sem abrir o JSON. */
|
|
265
266
|
function linhaDoHitlDeConducao(h) {
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
`texto fora da excecao ${h.emTexto.foraDaExcecao}`;
|
|
267
|
+
const m = (0, locale_1.msg)().operacao.ledger;
|
|
268
|
+
const meta = h.dentroDaMeta === null ? '' : h.dentroDaMeta ? m.metaDentro : m.metaFora;
|
|
269
|
+
return m.hitl(h.pedidos, (h.paradoMs / 3_600_000).toFixed(2), minutos(h.medianaRespostaMs), meta, h.abertos, h.emTexto.foraDaExcecao);
|
|
270
270
|
}
|
|
271
271
|
function textoDasEstatisticas(r) {
|
|
272
|
-
const
|
|
272
|
+
const m = (0, locale_1.msg)().operacao.ledger;
|
|
273
|
+
const dinheiro = r.custoReferencia.valor === null ? m.semCobertura : `USD ${r.custoReferencia.valor.toFixed(6)}`;
|
|
273
274
|
return [
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
275
|
+
m.periodo((0, horario_1.formatarDataHora)(r.periodo.desde), (0, horario_1.formatarDataHoraRotulada)(r.periodo.ate), r.periodo.intervalo),
|
|
276
|
+
m.sessoes(r.threads, r.sessoes.concluidas, r.sessoes.despachadas),
|
|
277
|
+
m.throughput(r.throughput.ships, r.sessoes.retries),
|
|
278
|
+
m.execucao(r.execucao.horas.toFixed(2), r.execucao.cobertura.medidas, r.execucao.cobertura.semMedida),
|
|
279
|
+
m.tokens(r.tokens.total, r.tokens.input, r.tokens.cachedInput, r.tokens.output),
|
|
280
|
+
m.custo(dinheiro),
|
|
281
|
+
m.espera((r.esperaHumana.milissegundos / 3_600_000).toFixed(2), r.esperaHumana.abertas),
|
|
281
282
|
linhaDoHitlDeConducao(r.hitlDeConducao),
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
...r.qualidade.observacoes.map(o =>
|
|
283
|
+
m.riscos(r.riscosPreventivos.total),
|
|
284
|
+
m.estimativas(r.estimativasPlano.amostras),
|
|
285
|
+
...r.qualidade.observacoes.map(o => m.cobertura(m.observacao(o))),
|
|
285
286
|
].join('\n');
|
|
286
287
|
}
|
package/dist/ledger.js
CHANGED
|
@@ -52,6 +52,7 @@ const path = __importStar(require("node:path"));
|
|
|
52
52
|
const util_1 = require("./util");
|
|
53
53
|
const node_crypto_1 = require("node:crypto");
|
|
54
54
|
const company_brain_journal_1 = require("./company-brain-journal");
|
|
55
|
+
const locale_1 = require("./locale");
|
|
55
56
|
/** Tipos de evento do ledger. B0 abriu a lista; o B1 acrescenta os seus. */
|
|
56
57
|
exports.TIPOS_DE_EVENTO = {
|
|
57
58
|
// Bloco B0
|
|
@@ -60,6 +61,10 @@ exports.TIPOS_DE_EVENTO = {
|
|
|
60
61
|
faseDespachada: 'phase_dispatch',
|
|
61
62
|
despachoVerificado: 'phase_dispatch_verified',
|
|
62
63
|
despachoFalhou: 'phase_dispatch_failed',
|
|
64
|
+
// RM-063 (F3): o prompt foi ao disco e ao ledger, com o sha256, ANTES do adaptador. O despacho que morre
|
|
65
|
+
// depois (contexto do runtime, adaptador que lanca, processo morto) deixa o que o `ork retry run`
|
|
66
|
+
// redespacha sem pedir o texto. Escritor: `phase.ts` (`rodarFaseSobLock`).
|
|
67
|
+
promptGravado: 'phase_prompt_recorded',
|
|
63
68
|
decisaoAutonoma: 'autonomous_decision',
|
|
64
69
|
pausaHumana: 'human_gate',
|
|
65
70
|
// Bloco B1: verdade, leases, ship e handoff
|
|
@@ -73,6 +78,10 @@ exports.TIPOS_DE_EVENTO = {
|
|
|
73
78
|
shipIniciado: 'ship_started',
|
|
74
79
|
shipConcluido: 'ship_done',
|
|
75
80
|
shipBloqueado: 'ship_blocked',
|
|
81
|
+
// Security scan: a loop category was not scanned for the candidate SHA and a human authorized the delivery anyway.
|
|
82
|
+
entregaSemScanAutorizada: 'ship_unscanned_authorized',
|
|
83
|
+
// RM-059 (F7, T7.1): o `ork ship publicar` publicou a branch ou abriu o PR, com a prova do `ls-remote`.
|
|
84
|
+
shipPublicado: 'ship_published',
|
|
76
85
|
/**
|
|
77
86
|
* I-43 (D3): a entrega foi revertida na base depois do ship.
|
|
78
87
|
*
|
|
@@ -96,6 +105,13 @@ exports.TIPOS_DE_EVENTO = {
|
|
|
96
105
|
handoffRecuperado: 'handoff_recalled',
|
|
97
106
|
// Bloco B2: worktree gerenciada, fila de leases, escalonador e MASTER/score
|
|
98
107
|
worktreeGarantida: 'worktree_ensured',
|
|
108
|
+
/** RM-037 (defeito 2 de 19 e 20/10/2026): o preparo de `worktree.dependencias` na worktree nova. */
|
|
109
|
+
worktreeDependencias: 'worktree_dependencias',
|
|
110
|
+
/**
|
|
111
|
+
* RM-037 (CHECK 3 da ork-rm037defeit2): o preparo que a criacao adiou (o passo do arco abre a thread sob a trava de
|
|
112
|
+
* despacho); a baseline e o verify o rodam antes do primeiro comando.
|
|
113
|
+
*/
|
|
114
|
+
worktreeDependenciasPendentes: 'worktree_dependencias_pendentes',
|
|
99
115
|
worktreeSincronizada: 'worktree_synced',
|
|
100
116
|
worktreeAuditada: 'worktree_audited',
|
|
101
117
|
worktreeLiberada: 'worktree_released',
|
|
@@ -175,6 +191,33 @@ exports.TIPOS_DE_EVENTO = {
|
|
|
175
191
|
// RM-037 (rm037defeito, A-1 do CHECK 3): o despacho recusado antes da sessao devolveu o lease que a tomada consumiu.
|
|
176
192
|
conducaoDevolvida: 'conducao_devolvida',
|
|
177
193
|
conducaoRenovada: 'conducao_renovada',
|
|
194
|
+
// RM-063 (F1): a batida da varredura instalada ou removida no crontab desta maquina, pelo
|
|
195
|
+
// `ork fabrica batida`. Mora no ledger da maquina (`~/.orkastery/ledger.jsonl`, thread `maquina`):
|
|
196
|
+
// o crontab e do usuario na maquina, nao de uma thread. Escritor: `fabrica-batida.ts`.
|
|
197
|
+
batidaInstalada: 'batida_instalada',
|
|
198
|
+
batidaRemovida: 'batida_removida',
|
|
199
|
+
// RM-063 (F4): um degrau da escada de recuperacao do runtime (reerguer o daemon, o fallback do bloco, outro
|
|
200
|
+
// perfil), feito, pulado ou falho, com o destino e o mesmo sha256 do prompt. Escritor: `runtime-escada.ts`.
|
|
201
|
+
recuperacaoDoRuntime: 'runtime_recuperacao',
|
|
202
|
+
// RM-063 (F5): uma acao da varredura (limpar sessao fantasma, registrar a entrega de PR mesclado, MASTER por omissao),
|
|
203
|
+
// feita ou recusada, com a autorizacao duravel do dono que a permitiu. Escritor: `varredura-acoes.ts`.
|
|
204
|
+
acaoDaVarredura: 'varredura_acao',
|
|
205
|
+
// RM-063 (F6): o dono foi avisado de que a maquina esta ociosa (vaga livre e item reservado para ela sem ninguem
|
|
206
|
+
// trabalhando), uma linha por episodio, no ledger do projeto. Escritor: a varredura (`pulse-delivery.ts`).
|
|
207
|
+
maquinaOciosaAvisada: 'maquina_ociosa_avisada',
|
|
208
|
+
// RM-063 (F7): o dono gravou a autorizacao duravel desta maquina (`ork conducao autorizar`), no ledger do projeto, com
|
|
209
|
+
// quem autorizou, ate quando, o que pode e a que ela substituiu. Escritor: `autorizacao-duravel.ts`.
|
|
210
|
+
autorizacaoConcedida: 'autorizacao_concedida',
|
|
211
|
+
// RM-059 (F6, T6.4): a Sentinela do Condutor ligou ou desligou nesta maquina (ledger do projeto, so na troca).
|
|
212
|
+
sentinelaLigada: 'sentinela_ligada',
|
|
213
|
+
sentinelaDesligada: 'sentinela_desligada',
|
|
214
|
+
// RM-059 (F9, T9.1): a resposta de sessao `claude-bg` pelo Mensageiro de Sessoes (`entrega-por-mod.ts`), sem o
|
|
215
|
+
// texto, so o sha256 do corpo. Na fila: o `enviar` do controle por mod, no servidor do dono que recebeu a resposta.
|
|
216
|
+
// Enviada: a `ork_session_outbox` com o resultado do `$.session.send`. Reservada: a `ork_session_inbox` do servidor
|
|
217
|
+
// preso ao despacho, quando a conferencia no receptor passa. O `session_answered` sai da reconciliacao de sempre.
|
|
218
|
+
entregaNaFila: 'session_delivery_queued',
|
|
219
|
+
entregaEnviada: 'session_delivery_sent',
|
|
220
|
+
entregaReservada: 'session_delivery_reserved',
|
|
178
221
|
};
|
|
179
222
|
/**
|
|
180
223
|
* I-41 (GO-FIX 1, B4 e D11): o rastro tipado da decisao autonoma.
|
|
@@ -190,7 +233,8 @@ function exigirRastroDeDecisaoAutonoma(dados) {
|
|
|
190
233
|
for (const campo of ['quemDecidiu', 'evidencia', 'razao']) {
|
|
191
234
|
const v = dados[campo];
|
|
192
235
|
if (typeof v !== 'string' || !v.trim() || v.length > 1000 || /[\x00-\x08\x0b-\x1f\x7f]/.test(v)) {
|
|
193
|
-
|
|
236
|
+
// RM-061 F3c: a recusa sai do catalogo, na lingua de quem a le; o pt-BR e o de sempre.
|
|
237
|
+
throw new locale_1.ErroDoCatalogo((m) => m.decisao.rastroObrigatorio(campo));
|
|
194
238
|
}
|
|
195
239
|
}
|
|
196
240
|
}
|
|
@@ -223,7 +267,7 @@ function registrarSeExiste(dirThread, threadId, tipo, dados = {}) {
|
|
|
223
267
|
return null;
|
|
224
268
|
let fd;
|
|
225
269
|
try {
|
|
226
|
-
fd = fs.openSync(caminhoLedger(dirThread), fs.constants.O_WRONLY | fs.constants.O_APPEND);
|
|
270
|
+
fd = fs.openSync(caminhoLedger(dirThread), fs.constants.O_WRONLY | fs.constants.O_APPEND | fs.constants.O_NOFOLLOW);
|
|
227
271
|
}
|
|
228
272
|
catch (e) {
|
|
229
273
|
if (e.code === 'ENOENT')
|
package/dist/licoes.js
CHANGED
|
@@ -58,6 +58,7 @@ const path = __importStar(require("node:path"));
|
|
|
58
58
|
const estado_thread_1 = require("./estado-thread");
|
|
59
59
|
const ledger_1 = require("./ledger");
|
|
60
60
|
const policies_1 = require("./policies");
|
|
61
|
+
const locale_1 = require("./locale");
|
|
61
62
|
/** O que evita cada bloqueio, na forma de comando. Sem dica, a licao so conta a recorrencia. */
|
|
62
63
|
exports.DICA_DO_MOTIVO = {
|
|
63
64
|
'claims.failed': 'rode o comando da claim antes de registra-la; claim sem prova local volta como GO-FIX',
|
|
@@ -154,17 +155,16 @@ const curto = (t, teto) => (t.length > teto ? `${t.slice(0, teto - 3)}...` : t);
|
|
|
154
155
|
function textoDasLicoes(r) {
|
|
155
156
|
if (r.threads === 0 || (r.motivos.length === 0 && r.classes.length === 0 && r.recentes.length === 0))
|
|
156
157
|
return '';
|
|
157
|
-
const
|
|
158
|
+
const m = (0, locale_1.msg)().operacao.restante.licoes;
|
|
159
|
+
const linhas = [m.resumo(r.threads)];
|
|
158
160
|
for (const m of r.motivos) {
|
|
159
|
-
linhas.push(
|
|
160
|
-
(m.dica ? `; o que evita: ${m.dica}` : ''));
|
|
161
|
+
linhas.push((0, locale_1.msg)().operacao.restante.licoes.bloqueio(m.nome, m.threads.length, m.threads.length === 1 ? 'thread' : 'threads', m.dica));
|
|
161
162
|
}
|
|
162
163
|
for (const c of r.classes) {
|
|
163
|
-
linhas.push(
|
|
164
|
-
(c.dica ? `; o que evita: ${c.dica}` : ''));
|
|
164
|
+
linhas.push(m.classe(c.nome, c.threads.length, c.threads.length === 1 ? 'thread' : 'threads', c.dica));
|
|
165
165
|
}
|
|
166
166
|
for (const l of r.recentes)
|
|
167
|
-
linhas.push(
|
|
167
|
+
linhas.push(m.nota(l.thread, l.score, curto(l.justificativa, 160)));
|
|
168
168
|
return linhas.join('\n');
|
|
169
169
|
}
|
|
170
170
|
/** Janela e piso da recorrencia que vira proposta de policy. */
|
|
@@ -208,16 +208,17 @@ function registrarPropostasNovas(raiz, agoraIso = new Date().toISOString()) {
|
|
|
208
208
|
}
|
|
209
209
|
/** `ork licoes`: o que volta no proximo GOAL e PLAN, e as propostas de policy. */
|
|
210
210
|
function textoDeLicoes(raiz, agoraIso = new Date().toISOString()) {
|
|
211
|
+
const m = (0, locale_1.msg)().operacao.restante.licoes;
|
|
211
212
|
const resumo = resumoDasLicoes(raiz, null);
|
|
212
|
-
const linhas = [
|
|
213
|
-
linhas.push(textoDasLicoes(resumo) ||
|
|
213
|
+
const linhas = [m.titulo, ''];
|
|
214
|
+
linhas.push(textoDasLicoes(resumo) || m.nenhuma);
|
|
214
215
|
const propostas = propostasDePolicy(raiz, agoraIso);
|
|
215
216
|
linhas.push('');
|
|
216
|
-
linhas.push(
|
|
217
|
+
linhas.push(m.propostas(exports.PISO_DA_PROPOSTA, exports.JANELA_DA_PROPOSTA_DIAS));
|
|
217
218
|
if (propostas.length === 0)
|
|
218
|
-
linhas.push(
|
|
219
|
+
linhas.push(m.propostaNenhuma);
|
|
219
220
|
for (const p of propostas)
|
|
220
221
|
linhas.push(` ${p.chave} em ${p.threads.length} threads (${p.threads.slice(0, 5).join(', ')})`, ` ${p.sugestao}`);
|
|
221
|
-
linhas.push('',
|
|
222
|
+
linhas.push('', m.fecho);
|
|
222
223
|
return linhas.join('\n');
|
|
223
224
|
}
|
package/dist/liveness.js
CHANGED
|
@@ -46,6 +46,7 @@ const thread_1 = require("./thread");
|
|
|
46
46
|
const ledger_1 = require("./ledger");
|
|
47
47
|
const retry_1 = require("./retry");
|
|
48
48
|
const util_1 = require("./util");
|
|
49
|
+
const procedencia_1 = require("./procedencia");
|
|
49
50
|
/**
|
|
50
51
|
* Transcrição local do Claude. O UUID evita interpretar identificador como caminho.
|
|
51
52
|
* I-33 (D4): `config` é o diretório já resolvido pelo perfil da sessão (ou o implícito, sem
|
|
@@ -70,8 +71,10 @@ function transcricaoClaude(sessionId, cwd, config) {
|
|
|
70
71
|
}
|
|
71
72
|
return undefined;
|
|
72
73
|
}
|
|
73
|
-
function fontesReais(t, d) {
|
|
74
|
-
|
|
74
|
+
function fontesReais(raiz, t, d) {
|
|
75
|
+
// RM-047 (P2): o git da prova de vida so roda na worktree registrada.
|
|
76
|
+
const wt = t.worktree ? (0, procedencia_1.cwdLocalOuNulo)(raiz, t.id, t.worktree, 'thread') : null;
|
|
77
|
+
const commit = wt ? (0, util_1.exec)('git', ['log', '-1', '--format=%cI'], wt) : null;
|
|
75
78
|
const commitEm = commit?.ok ? commit.stdout.trim() : undefined;
|
|
76
79
|
if (typeof d.sessionId !== 'string')
|
|
77
80
|
return { commitEm };
|
|
@@ -157,7 +160,7 @@ function detectarFasesOrfas(carregado, opcoes = {}) {
|
|
|
157
160
|
incorporar(e.ts, e.tipo);
|
|
158
161
|
}
|
|
159
162
|
}
|
|
160
|
-
const fontes =
|
|
163
|
+
const fontes = opcoes.fontes ? opcoes.fontes(t, d) : fontesReais(carregado.raiz, t, d);
|
|
161
164
|
incorporar(fontes.commitEm, 'commit na worktree');
|
|
162
165
|
const file = path.join(dir, 'liveness.json'), chave = `${d.ts}|${d.sessionId}`;
|
|
163
166
|
let anterior = null;
|