@orkastery/cli 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
- package/adapters/openclaw/README.md +83 -10
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +53 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +188 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/claim-lint.js
CHANGED
|
@@ -19,12 +19,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
19
19
|
exports.analisarComando = analisarComando;
|
|
20
20
|
exports.analisarComandos = analisarComandos;
|
|
21
21
|
exports.linhaDoLintDeClaim = linhaDoLintDeClaim;
|
|
22
|
+
const locale_1 = require("./locale");
|
|
23
|
+
/**
|
|
24
|
+
* A correcao que vai ao `claims.jsonl` com o achado: dado gravado, sempre em pt-BR. Fatia 2 do ensaio da 0.5.0 (P6): ela
|
|
25
|
+
* vale para qualquer projeto. RM-061 (F3b): o texto mora no catalogo (`claims.correcoesDoLint`), e a impressao do
|
|
26
|
+
* `claims add` a mostra no locale do comando, pela regra.
|
|
27
|
+
*/
|
|
22
28
|
const CORRECAO = {
|
|
23
|
-
|
|
24
|
-
'
|
|
25
|
-
|
|
26
|
-
'sha-intermediario': 'ancore na base (`git diff "$(git merge-base origin/main HEAD)" HEAD`) ou prove ancestralidade com `git merge-base --is-ancestor <sha> HEAD`',
|
|
27
|
-
'contagem-de-commits': 'use `git merge-base --is-ancestor <commit> HEAD`: contagem de commits quebra com rebase e merge',
|
|
29
|
+
'suite-inteira': (0, locale_1.msg)('pt-BR').claims.correcoesDoLint['suite-inteira'],
|
|
30
|
+
'sha-intermediario': (0, locale_1.msg)('pt-BR').claims.correcoesDoLint['sha-intermediario'],
|
|
31
|
+
'contagem-de-commits': (0, locale_1.msg)('pt-BR').claims.correcoesDoLint['contagem-de-commits'],
|
|
28
32
|
};
|
|
29
33
|
/**
|
|
30
34
|
* (a) `npm [--prefix <dir>] [run] test` sem subcomando (`test:ci` nao casa) e sem arquivos
|
|
@@ -60,7 +64,7 @@ function analisarComandos(comandos) {
|
|
|
60
64
|
}
|
|
61
65
|
/** Uma linha por achado, para o terminal e para o ledger. */
|
|
62
66
|
function linhaDoLintDeClaim(claimId, a) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return
|
|
67
|
+
// RM-061 (F3b): nome e correcao pela regra, no locale ativo. F3d (GO-FIX 1): o montador fica registrado, e o `ci prepare`,
|
|
68
|
+
// que grava a linha no ledger no escopo pt-BR, a remonta no locale do comando ao imprimir.
|
|
69
|
+
return (0, locale_1.textoDoCatalogo)((m) => m.claims.linhaDoLint(claimId, m.claims.nomesDoLint[a.regra] ?? a.regra, a.trecho, m.claims.correcoesDoLint[a.regra] ?? a.correcao));
|
|
66
70
|
}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `ork claims conferir` (RM-059, T0.10): reexecuta so as claims pedidas, ou o verify de uma tarefa do
|
|
4
|
+
* plano da thread, no mesmo sandbox do `ork_verify`, sem gravar recibo.
|
|
5
|
+
*
|
|
6
|
+
* E por aqui que os mods de fase (Freio e Portao, no plano dos mods) conferem o que um lote do GO
|
|
7
|
+
* mexeu: o comando de claim e de verify e escrito pelo modelo, e fora do sandbox ele passaria longe do
|
|
8
|
+
* guard e daria resultado diferente do `ork verify` (D12 do plano). Por isso:
|
|
9
|
+
*
|
|
10
|
+
* - o executor e o confinado do codex (`criarExecutorSandbox`), um por comando, e nunca ha fallback:
|
|
11
|
+
* sem sandbox, a conferencia recusa (D6 da thread ork-rm059nucleo);
|
|
12
|
+
* - o julgamento de cada claim e o do `ork verify` (`verificarClaim`), sem regra paralela;
|
|
13
|
+
* - quem executa na worktree precisa da conducao da thread, como o `ork verify` (I-36): a sessao que
|
|
14
|
+
* conduz reentra pela identidade do despacho, e outra conducao recusa;
|
|
15
|
+
* - nada e gravado: nem `verify_run`, nem estado de claim, nem `gate_blocked`. Quem verifica de
|
|
16
|
+
* verdade continua sendo o `ork verify`.
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.ErroDeConferencia = exports.PRAZO_MAXIMO_MS = exports.PRAZO_PADRAO_MS = exports.FORMATO_DA_CONFERENCIA = void 0;
|
|
53
|
+
exports.idsDeClaims = idsDeClaims;
|
|
54
|
+
exports.verifyDaTarefa = verifyDaTarefa;
|
|
55
|
+
exports.conferirClaims = conferirClaims;
|
|
56
|
+
exports.textoDaConferencia = textoDaConferencia;
|
|
57
|
+
const fs = __importStar(require("node:fs"));
|
|
58
|
+
const path = __importStar(require("node:path"));
|
|
59
|
+
const node_crypto_1 = require("node:crypto");
|
|
60
|
+
const claims_1 = require("./claims");
|
|
61
|
+
const conducao_1 = require("./conducao");
|
|
62
|
+
const estado_thread_1 = require("./estado-thread");
|
|
63
|
+
const redacao_saida_1 = require("./redacao-saida");
|
|
64
|
+
const thread_1 = require("./thread");
|
|
65
|
+
const verify_1 = require("./verify");
|
|
66
|
+
const verify_sandbox_1 = require("./verify-sandbox");
|
|
67
|
+
const worktree_1 = require("./worktree");
|
|
68
|
+
const locale_1 = require("./locale");
|
|
69
|
+
exports.FORMATO_DA_CONFERENCIA = 'ork.claims-conferencia/v1';
|
|
70
|
+
/** O prazo total do `ork_verify` pelo MCP: a conferencia e pontual e nao deve demorar mais que ele. */
|
|
71
|
+
exports.PRAZO_PADRAO_MS = 180_000;
|
|
72
|
+
/** Teto: o prazo de um comando de verify. Pedir mais e pedir o `ork verify` inteiro. */
|
|
73
|
+
exports.PRAZO_MAXIMO_MS = verify_1.TIMEOUT_VERIFY_MS;
|
|
74
|
+
const PRAZO_MINIMO_MS = 10_000;
|
|
75
|
+
/** Folga para fechar o sandbox e responder dentro do prazo pedido. */
|
|
76
|
+
const RESERVA_MS = 5_000;
|
|
77
|
+
/** Erro de uso tipado: o CLI sai 2 com ele. */
|
|
78
|
+
class ErroDeConferencia extends locale_1.ErroDoCatalogo {
|
|
79
|
+
}
|
|
80
|
+
exports.ErroDeConferencia = ErroDeConferencia;
|
|
81
|
+
/** RM-061 (F3b): a recusa nasce do catalogo; o `--json` a leva como nasceu e o texto a remonta no locale do comando. */
|
|
82
|
+
const recusa = (motivo, detalhe) => new ErroDeConferencia((m) => m.claims.recusa(motivo, detalhe(m.claims)));
|
|
83
|
+
/** `C3,C7, c9` vira `['C3', 'C7', 'C9']`, sem repeticao e na ordem pedida. */
|
|
84
|
+
function idsDeClaims(bruto) {
|
|
85
|
+
const ids = bruto.split(',').map((s) => s.trim().toUpperCase()).filter(Boolean);
|
|
86
|
+
if (!ids.length)
|
|
87
|
+
throw recusa('uso', (m) => m.semClaims);
|
|
88
|
+
const invalido = ids.find((id) => !/^C\d+$/.test(id));
|
|
89
|
+
if (invalido)
|
|
90
|
+
throw recusa('uso', (m) => m.idInvalido(invalido));
|
|
91
|
+
const repetido = ids.find((id, i) => ids.indexOf(id) !== i);
|
|
92
|
+
if (repetido)
|
|
93
|
+
throw recusa('repetida', (m) => m.repetida(repetido));
|
|
94
|
+
return ids;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A linha de verify de uma tarefa nos formatos em uso nos planos: `- **verify:** ...`, `- **verify**: ...`,
|
|
98
|
+
* `- verify: ...`, `` - `verify`: ... `` e `Verify: ...` fora de lista. O grupo 1 e o que vem depois do rotulo.
|
|
99
|
+
*/
|
|
100
|
+
const ROTULO_DE_VERIFY = /^\s*(?:[-*]\s+)?(?:\*\*verify:\*\*|\*\*verify\*\*\s*:|`verify`\s*:|verify\s*:)\s*(.*)$/i;
|
|
101
|
+
/** Linha que abre outro item de lista, cabecalho ou cerca de codigo. */
|
|
102
|
+
const ABRE_BLOCO = /^\s*(?:[-*+]\s|\d+[.)]\s|#{1,6}\s|```|~~~)/;
|
|
103
|
+
const recuo = (linha) => /^[ \t]*/.exec(linha)[0].replace(/\t/g, ' ').length;
|
|
104
|
+
/**
|
|
105
|
+
* O item inteiro do verify da linha `k`: o texto depois do rotulo e as linhas que o Markdown junta a ele, a
|
|
106
|
+
* continuacao logo abaixo que nao abre outro item e as linhas mais recuadas que o rotulo, mesmo depois de
|
|
107
|
+
* linha em branco. Verify que quebra na linha seguinte ("e o teste da fatia 1 (`node --test ...`)") e um
|
|
108
|
+
* item so, e o pedaco da linha de baixo nao pode ficar de fora.
|
|
109
|
+
*/
|
|
110
|
+
function itemDoVerify(bloco, k, inicio) {
|
|
111
|
+
const base = recuo(bloco[k]);
|
|
112
|
+
const partes = [inicio];
|
|
113
|
+
let depoisDeBranco = false;
|
|
114
|
+
for (const linha of bloco.slice(k + 1)) {
|
|
115
|
+
if (!linha.trim()) {
|
|
116
|
+
depoisDeBranco = true;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (recuo(linha) <= base && (depoisDeBranco || ABRE_BLOCO.test(linha)))
|
|
120
|
+
break;
|
|
121
|
+
partes.push(linha.trim());
|
|
122
|
+
depoisDeBranco = false;
|
|
123
|
+
}
|
|
124
|
+
return partes.join(' ').trim();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* O comando de verify da tarefa `T<id>` no texto do plano (D7). O cabeçalho (niveis `##` a `######`)
|
|
128
|
+
* aparece uma vez so; no bloco dele, ate o proximo cabecalho de nivel igual ou maior, ha um unico
|
|
129
|
+
* item `verify`, e ele e um trecho entre crases e nada mais (ponto final aceito), contando as linhas
|
|
130
|
+
* de continuacao do item. Item com dois trechos ou com texto alem do comando ("`git status` vazio e
|
|
131
|
+
* `ork verify`") recusa: rodar so um pedaco daria "passou" a um verify que nao rodou inteiro.
|
|
132
|
+
*/
|
|
133
|
+
function verifyDaTarefa(plano, tarefaBruta) {
|
|
134
|
+
const id = tarefaBruta.trim().replace(/^T/i, '');
|
|
135
|
+
if (!/^\d+(?:\.\d+)*$/.test(id))
|
|
136
|
+
throw recusa('uso', (m) => m.tarefaInvalida(tarefaBruta));
|
|
137
|
+
const tarefa = `T${id}`;
|
|
138
|
+
const linhas = plano.replace(/\r\n/g, '\n').split('\n');
|
|
139
|
+
const cabecalho = /^(#{2,6})\s+T(\d+(?:\.\d+)*)(?=[\s.:)]|$)/;
|
|
140
|
+
const inicios = linhas.flatMap((l, i) => {
|
|
141
|
+
const m = cabecalho.exec(l);
|
|
142
|
+
return m && m[2] === id ? [{ i, nivel: m[1].length }] : [];
|
|
143
|
+
});
|
|
144
|
+
if (inicios.length === 0)
|
|
145
|
+
throw recusa('tarefa-ausente', (m) => m.tarefaAusente(tarefa));
|
|
146
|
+
if (inicios.length > 1)
|
|
147
|
+
throw recusa('tarefa-repetida', (m) => m.tarefaRepetida(inicios.length, tarefa));
|
|
148
|
+
const { i, nivel } = inicios[0];
|
|
149
|
+
const fimDoBloco = linhas.findIndex((l, j) => j > i && new RegExp(`^#{1,${nivel}}\\s`).test(l));
|
|
150
|
+
const bloco = linhas.slice(i + 1, fimDoBloco < 0 ? undefined : fimDoBloco);
|
|
151
|
+
const verifies = bloco.flatMap((l, k) => {
|
|
152
|
+
const m = ROTULO_DE_VERIFY.exec(l);
|
|
153
|
+
return m ? [itemDoVerify(bloco, k, m[1].trim())] : [];
|
|
154
|
+
});
|
|
155
|
+
if (verifies.length === 0)
|
|
156
|
+
throw recusa('tarefa-sem-verify', (m) => m.tarefaSemVerify(tarefa));
|
|
157
|
+
if (verifies.length > 1)
|
|
158
|
+
throw recusa('tarefa-ambigua', (m) => m.tarefaAmbigua(tarefa, verifies.length));
|
|
159
|
+
const resto = verifies[0];
|
|
160
|
+
const trechos = [...resto.matchAll(/`([^`]+)`/g)].length;
|
|
161
|
+
if (trechos === 0)
|
|
162
|
+
throw recusa('tarefa-sem-comando', (m) => m.tarefaSemComando(tarefa, resto.slice(0, 120)));
|
|
163
|
+
const unico = /^`([^`]+)`\s*\.?$/.exec(resto);
|
|
164
|
+
if (!unico || !unico[1].trim()) {
|
|
165
|
+
throw recusa('tarefa-ambigua', (m) => m.tarefaVariosTrechos(tarefa, trechos, resto.slice(0, 120)));
|
|
166
|
+
}
|
|
167
|
+
return { tarefa, comando: unico[1].trim() };
|
|
168
|
+
}
|
|
169
|
+
/** O teto dos documentos de fase (`docs/*.md` da thread). */
|
|
170
|
+
const LIMITE_DO_PLANO = 128 * 1024;
|
|
171
|
+
/**
|
|
172
|
+
* O `docs/plan.md` da thread, com o sha256 dos bytes lidos; `null` quando ele nao existe. Le pela pasta
|
|
173
|
+
* de estado da thread, que e a do checkout principal mesmo com o CLI rodando de dentro da worktree.
|
|
174
|
+
*/
|
|
175
|
+
function lerPlano(raiz, threadId) {
|
|
176
|
+
const arquivo = path.join((0, thread_1.dirThread)(raiz, threadId), 'docs', 'plan.md');
|
|
177
|
+
let fd;
|
|
178
|
+
try {
|
|
179
|
+
fd = fs.openSync(arquivo, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
if (e.code === 'ENOENT')
|
|
183
|
+
return null;
|
|
184
|
+
throw recusa('plano-inseguro', (m) => m.planoNaoAbre);
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const st = fs.fstatSync(fd);
|
|
188
|
+
if (!st.isFile() || st.size > LIMITE_DO_PLANO)
|
|
189
|
+
throw recusa('plano-inseguro', (m) => m.planoGrande);
|
|
190
|
+
const bytes = fs.readFileSync(fd);
|
|
191
|
+
return { arquivo: 'docs/plan.md', sha256: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex'), conteudo: bytes.toString('utf8') };
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
fs.closeSync(fd);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Como o `ork_verify` (`mcp-verify.ts`): so a worktree propria da thread, dentro do projeto e registrada no git
|
|
199
|
+
* dele na branch da thread, fica gravavel no sandbox. O projeto e a arvore principal, mesmo com o CLI rodando de
|
|
200
|
+
* dentro de uma worktree. Thread sem worktree seria conferida com a arvore principal gravavel, e worktree de
|
|
201
|
+
* outro repositorio numa branch de mesmo nome abriria escrita fora do projeto: as duas recusam.
|
|
202
|
+
*/
|
|
203
|
+
function worktreeConferida(raiz, thread) {
|
|
204
|
+
if (!thread.worktree)
|
|
205
|
+
throw recusa('sem-worktree', (m) => m.semWorktree(thread.id));
|
|
206
|
+
let dir;
|
|
207
|
+
try {
|
|
208
|
+
dir = fs.realpathSync(thread.worktree);
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
throw recusa('worktree-ausente', (m) => m.worktreeAusente(thread.id));
|
|
212
|
+
}
|
|
213
|
+
const projeto = fs.realpathSync((0, estado_thread_1.raizDoEstado)(raiz));
|
|
214
|
+
if (!dir.startsWith(projeto + path.sep))
|
|
215
|
+
throw recusa('worktree-fora-do-projeto', (m) => m.worktreeFora(thread.id));
|
|
216
|
+
const branch = (0, worktree_1.branchDaWorktree)(thread);
|
|
217
|
+
if (!(0, worktree_1.worktreesDoGit)(projeto).some((w) => w.dir === dir && w.branch === branch))
|
|
218
|
+
throw recusa('worktree-nao-registrada', (m) => m.worktreeNaoRegistrada(thread.id, branch));
|
|
219
|
+
return dir;
|
|
220
|
+
}
|
|
221
|
+
/** A fabrica padrao: o sandbox do codex, um por comando, como o `ork_verify`. */
|
|
222
|
+
const fabricaPadrao = (worktree, timeoutMs) => (0, verify_sandbox_1.criarExecutorSandbox)({ worktree, timeoutMs });
|
|
223
|
+
/** Sandbox que nao abre vira recusa tipada: a conferencia nunca roda fora dele (D6). */
|
|
224
|
+
function confinado(fabrica, worktree, timeoutMs) {
|
|
225
|
+
try {
|
|
226
|
+
return fabrica(worktree, timeoutMs);
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
// RM-061 (F3b, GO-FIX 1): o erro do catalogo guarda o montador; o do executor sai traduzido pela frase exata.
|
|
230
|
+
const erro = e instanceof locale_1.ErroDoCatalogo ? e.montar : (m) => m.claims.erroDoSandbox(e.message);
|
|
231
|
+
throw new ErroDeConferencia((m) => m.claims.recusa('sandbox-indisponivel', m.claims.sandboxIndisponivel(erro(m))));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function conferida(r) {
|
|
235
|
+
return {
|
|
236
|
+
nome: r.nome, comando: r.comando, ok: r.ok, code: r.code, executado: r.executado !== false,
|
|
237
|
+
...(r.causa ? { causa: r.causa } : {}),
|
|
238
|
+
...(r.prazoMs !== undefined ? { prazoMs: r.prazoMs } : {}),
|
|
239
|
+
...(r.duracaoMs !== undefined ? { duracaoMs: r.duracaoMs } : {}),
|
|
240
|
+
fim: r.resumo ? (0, redacao_saida_1.redigirSaida)(r.resumo) : '',
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/** `ork claims conferir`: so o que foi pedido, no sandbox, sob a conducao da thread, sem gravar nada. */
|
|
244
|
+
function conferirClaims(carregado, threadId, pedido) {
|
|
245
|
+
const { raiz, manifesto } = carregado;
|
|
246
|
+
if (!pedido.claims === !pedido.tarefa)
|
|
247
|
+
throw recusa('uso', (m) => m.claimsOuTarefa);
|
|
248
|
+
const prazoTotalMs = pedido.prazoMs ?? exports.PRAZO_PADRAO_MS;
|
|
249
|
+
if (!Number.isInteger(prazoTotalMs) || prazoTotalMs < PRAZO_MINIMO_MS || prazoTotalMs > exports.PRAZO_MAXIMO_MS)
|
|
250
|
+
throw recusa('prazo', (m) => m.prazo(PRAZO_MINIMO_MS / 1000, exports.PRAZO_MAXIMO_MS / 1000));
|
|
251
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(threadId) || !fs.existsSync((0, thread_1.caminhoThread)(raiz, threadId)))
|
|
252
|
+
throw recusa('thread-ausente', (m) => m.threadAusente(threadId));
|
|
253
|
+
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
254
|
+
if (thread.status === 'fechada')
|
|
255
|
+
throw recusa('thread-fechada', (m) => m.threadFechada(threadId));
|
|
256
|
+
const cwd = worktreeConferida(raiz, thread);
|
|
257
|
+
// O que vai rodar, inteiro resolvido antes de tomar a conducao: recusa de uso nao toca a worktree.
|
|
258
|
+
let alvo;
|
|
259
|
+
let selecionadas;
|
|
260
|
+
if (pedido.claims) {
|
|
261
|
+
const ids = pedido.claims;
|
|
262
|
+
const todas = (0, claims_1.lerClaims)(raiz, threadId);
|
|
263
|
+
selecionadas = ids.map((id) => {
|
|
264
|
+
const claim = todas.find((c) => c.id === id);
|
|
265
|
+
if (!claim)
|
|
266
|
+
throw recusa('desconhecida', (m) => m.desconhecida(id, threadId));
|
|
267
|
+
if (claim.estado === 'retirada') {
|
|
268
|
+
const motivo = claim.motivoDaRetirada;
|
|
269
|
+
throw recusa('retirada', (m) => m.retiradaNaConferencia(id, motivo));
|
|
270
|
+
}
|
|
271
|
+
return claim;
|
|
272
|
+
});
|
|
273
|
+
alvo = { tipo: 'claims', ids };
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
const plano = lerPlano(raiz, threadId);
|
|
277
|
+
if (!plano)
|
|
278
|
+
throw recusa('plano-ausente', (m) => m.planoAusente(threadId));
|
|
279
|
+
const { tarefa, comando } = verifyDaTarefa(plano.conteudo, pedido.tarefa);
|
|
280
|
+
// RM-061 (F3b, GO-FIX 1): a alegacao sintetica nasce pelo catalogo (pt-BR no `--json`) e o texto a remonta.
|
|
281
|
+
selecionadas = [{ id: tarefa, thread: threadId, fase: null, arquivo: plano.arquivo, alegacao: (0, locale_1.textoDoCatalogo)((m) => m.claims.verifyDaTarefa(tarefa)),
|
|
282
|
+
negativa: false, verificar: [comando], criadoEm: '', estado: 'pendente' }];
|
|
283
|
+
alvo = { tipo: 'tarefa', tarefa, plano: { arquivo: plano.arquivo, sha256: plano.sha256 }, comando };
|
|
284
|
+
}
|
|
285
|
+
// O sandbox e conferido antes da conducao: sem ele, nada toma o lease nem toca a worktree.
|
|
286
|
+
const fabrica = pedido.fabrica ?? fabricaPadrao;
|
|
287
|
+
confinado(fabrica, cwd, PRAZO_MINIMO_MS).fechar();
|
|
288
|
+
const pedidoDeConducao = {
|
|
289
|
+
canal: pedido.canal ?? (0, conducao_1.canalDoProcesso)(),
|
|
290
|
+
correlacao: pedido.correlacao ?? null,
|
|
291
|
+
operacao: 'verify',
|
|
292
|
+
identidade: (0, conducao_1.identidadeDoAmbiente)(threadId, process.env, raiz),
|
|
293
|
+
prazoMs: (0, conducao_1.prazoDaVerificacao)(prazoTotalMs, 1),
|
|
294
|
+
};
|
|
295
|
+
return (0, conducao_1.comConducao)(raiz, threadId, pedidoDeConducao, (tomada) => {
|
|
296
|
+
const prazoFinal = Date.now() + prazoTotalMs;
|
|
297
|
+
const executor = (nome, comando, dir) => {
|
|
298
|
+
const restante = prazoFinal - Date.now() - RESERVA_MS;
|
|
299
|
+
if (restante < 100) {
|
|
300
|
+
return { nome, comando, ok: false, code: -1, executado: false, resumo: (0, locale_1.textoDoCatalogo)((m) => m.claims.prazoEsgotado) };
|
|
301
|
+
}
|
|
302
|
+
const prazoMs = Math.min((0, verify_1.prazoDoComando)(manifesto, nome), restante);
|
|
303
|
+
tomada.renovar(prazoMs);
|
|
304
|
+
const sandbox = confinado(fabrica, cwd, prazoMs);
|
|
305
|
+
const inicio = Date.now();
|
|
306
|
+
try {
|
|
307
|
+
const r = sandbox.executar(nome, comando, dir);
|
|
308
|
+
const estourou = !r.ok && /timeout do sandbox/.test(`${r.stderr ?? ''}${r.resumo}`);
|
|
309
|
+
return { ...r, executado: true, prazoMs, duracaoMs: Date.now() - inicio, ...(estourou ? { causa: 'timeout' } : {}) };
|
|
310
|
+
}
|
|
311
|
+
finally {
|
|
312
|
+
sandbox.fechar();
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
const resultados = selecionadas.map((c) => (0, verify_1.verificarClaim)(c, cwd, executor));
|
|
316
|
+
const itens = resultados.map((r) => ({
|
|
317
|
+
id: r.claim.id, alegacao: r.claim.alegacao, arquivo: r.claim.arquivo ?? null, verificado: r.verificado,
|
|
318
|
+
motivo: r.motivo, detalhe: r.detalhe, execucoes: r.execucoes.map(conferida),
|
|
319
|
+
}));
|
|
320
|
+
const motivos = [...new Set(itens.map((i) => i.motivo).filter((m) => m !== null))];
|
|
321
|
+
return {
|
|
322
|
+
formato: exports.FORMATO_DA_CONFERENCIA, thread: threadId, commit: (0, verify_1.commitReal)(cwd), cwd, executor: 'codex-sandbox',
|
|
323
|
+
reciboOficial: false, prazoTotalMs, alvo, itens, ok: itens.every((i) => i.verificado), motivos,
|
|
324
|
+
};
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/** Texto de `ork claims conferir`, para quem roda no terminal. */
|
|
328
|
+
function textoDaConferencia(r) {
|
|
329
|
+
// RM-061 (F3b): a moldura pelo catalogo; o detalhe de cada claim (montado em pt-BR, como o --json o leva) remontado.
|
|
330
|
+
const m = (0, locale_1.msg)().claims;
|
|
331
|
+
const linhas = [m.conferencia(r.thread)];
|
|
332
|
+
linhas.push(m.headReal(r.commit));
|
|
333
|
+
linhas.push(m.executor(r.executor, Math.round(r.prazoTotalMs / 1000)));
|
|
334
|
+
linhas.push(r.alvo.tipo === 'claims'
|
|
335
|
+
? m.alvoClaims(r.alvo.ids.join(', '))
|
|
336
|
+
: m.alvoTarefa(r.alvo.tarefa, r.alvo.plano.sha256.slice(0, 12), r.alvo.comando));
|
|
337
|
+
linhas.push('');
|
|
338
|
+
for (const i of r.itens) {
|
|
339
|
+
linhas.push(m.item(i.id, i.verificado, i.motivo, (0, locale_1.remontar)(i.alegacao)));
|
|
340
|
+
if (!i.verificado) {
|
|
341
|
+
linhas.push(` ${(0, locale_1.remontar)(i.detalhe)}`);
|
|
342
|
+
const falhou = i.execucoes.find((e) => !e.ok);
|
|
343
|
+
if (falhou?.fim)
|
|
344
|
+
linhas.push(...(0, locale_1.remontar)(falhou.fim).split('\n').map((l) => ` | ${l}`));
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
linhas.push('');
|
|
348
|
+
linhas.push(r.ok ? m.tudoPassou : m.naoPassou(r.motivos.join(', ')));
|
|
349
|
+
return linhas.join('\n');
|
|
350
|
+
}
|
package/dist/claims.js
CHANGED
|
@@ -68,6 +68,7 @@ const policies_1 = require("./policies");
|
|
|
68
68
|
const verify_1 = require("./verify");
|
|
69
69
|
const util_1 = require("./util");
|
|
70
70
|
const claim_lint_1 = require("./claim-lint");
|
|
71
|
+
const locale_1 = require("./locale");
|
|
71
72
|
/** Caminho do `claims.jsonl` da thread (append-only, como o ledger). */
|
|
72
73
|
function caminhoClaims(raiz, threadId) {
|
|
73
74
|
return path.join((0, thread_1.dirThread)(raiz, threadId), 'claims.jsonl');
|
|
@@ -181,7 +182,9 @@ function conferirProvaLocal(raiz, thread, claim, executarProva) {
|
|
|
181
182
|
if (!carregado || claim.verificar.length === 0 || !(0, policies_1.policyDeProvaLocal)(carregado.manifesto))
|
|
182
183
|
return [];
|
|
183
184
|
const prazoMs = carregado.manifesto.verify.timeout_ms ?? verify_1.TIMEOUT_VERIFY_MS;
|
|
184
|
-
|
|
185
|
+
// RM-047 (P2): worktree apagada nao passa pela procedencia, porque nada roda nela; vira o aviso abaixo.
|
|
186
|
+
const apagada = thread.worktree && !fs.existsSync(thread.worktree) ? thread.worktree : undefined;
|
|
187
|
+
const cwd = apagada ?? (0, verify_1.cwdDaThread)(raiz, thread);
|
|
185
188
|
let reprovada;
|
|
186
189
|
// Suspeitas da revisao de 03/10: sem a worktree (apagada), nada roda e o aviso diz por que, sem culpar a claim.
|
|
187
190
|
if (!fs.existsSync(cwd))
|
|
@@ -248,7 +251,7 @@ function registrarCriteriosDePronto(raiz, threadId) {
|
|
|
248
251
|
function exigirClaim(raiz, threadId, claimId) {
|
|
249
252
|
const claim = lerClaims(raiz, threadId).find((c) => c.id === claimId);
|
|
250
253
|
if (!claim) {
|
|
251
|
-
throw new
|
|
254
|
+
throw new locale_1.ErroDoCatalogo((m) => m.claims.naoExiste(claimId, threadId));
|
|
252
255
|
}
|
|
253
256
|
return claim;
|
|
254
257
|
}
|
|
@@ -307,18 +310,18 @@ function carimbarEstado(raiz, claim, estado) {
|
|
|
307
310
|
/** Tabela de `ork claims list`. */
|
|
308
311
|
function tabelaDeClaims(raiz, threadId) {
|
|
309
312
|
const claims = lerClaims(raiz, threadId);
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
313
|
+
// RM-061 (F3b): o texto pelo catalogo; o estado (dado do `claims.jsonl`) so se traduz aqui, pelo id.
|
|
314
|
+
const m = (0, locale_1.msg)().claims;
|
|
315
|
+
if (claims.length === 0)
|
|
316
|
+
return m.listaVazia(threadId);
|
|
314
317
|
const linhas = claims.map((c) => [
|
|
315
318
|
c.id,
|
|
316
319
|
c.fase ?? '-',
|
|
317
|
-
c.estado,
|
|
318
|
-
c.negativa ?
|
|
320
|
+
m.estado(c.estado),
|
|
321
|
+
c.negativa ? m.sim : m.nao,
|
|
319
322
|
c.arquivo,
|
|
320
|
-
c.verificar.join(' && ') ||
|
|
323
|
+
c.verificar.join(' && ') || m.semComando,
|
|
321
324
|
c.alegacao,
|
|
322
325
|
]);
|
|
323
|
-
return (0, util_1.tabela)([
|
|
326
|
+
return (0, util_1.tabela)([...m.colunas], linhas);
|
|
324
327
|
}
|
|
@@ -1,11 +1,46 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.BRAIN_API = void 0;
|
|
4
37
|
exports.validateRequest = validateRequest;
|
|
5
38
|
exports.brainClient = brainClient;
|
|
39
|
+
const os = __importStar(require("node:os"));
|
|
6
40
|
const node_child_process_1 = require("node:child_process");
|
|
7
41
|
const project_state_1 = require("./project-state");
|
|
8
42
|
const company_brain_contract_1 = require("./company-brain-contract");
|
|
43
|
+
const dsn_da_memoria_1 = require("./dsn-da-memoria");
|
|
9
44
|
exports.BRAIN_API = 'orkmind.company-brain-api/v1';
|
|
10
45
|
function validateRequest(value) {
|
|
11
46
|
if (!value || typeof value !== 'object' || Array.isArray(value) || value.schema !== exports.BRAIN_API ||
|
|
@@ -30,20 +65,27 @@ function brainClient(loaded, execute = node_child_process_1.spawnSync) {
|
|
|
30
65
|
return raw => {
|
|
31
66
|
const request = validateRequest(raw);
|
|
32
67
|
const unavailable = (error) => ({ schema: exports.BRAIN_API, state: 'unavailable', error });
|
|
33
|
-
|
|
68
|
+
// RM-069: a DSN pelo resolvedor unico, no momento do pedido (a variavel ou o arquivo da pasta de segredos).
|
|
69
|
+
const dsn = (0, dsn_da_memoria_1.resolverDsn)(config).dsn;
|
|
34
70
|
if (config.mode !== 'orkmind' || (!dsn && request.operation !== 'capabilities'))
|
|
35
71
|
return unavailable('brain.configuration.missing');
|
|
36
72
|
const payload = request.payload;
|
|
37
73
|
if (payload?.tenant_id !== undefined && payload.tenant_id !== config.tenant)
|
|
38
74
|
return { schema: exports.BRAIN_API, state: 'forbidden', error: 'brain.tenant.mismatch' };
|
|
39
|
-
|
|
75
|
+
// RM-047: cwd fora do clone; um nome de interpretador em memory.cli não acha arquivo do repositório.
|
|
76
|
+
// RM-026 K7 (fatia 2, CHECK): timeout_ms fora da faixa (0, negativo, fração) vale o padrão de 15 s, nunca espera sem prazo.
|
|
77
|
+
const prazo = Number.isFinite(config.timeout_ms) && config.timeout_ms >= 1 ? Math.min(Math.floor(config.timeout_ms), 15000) : 15000;
|
|
78
|
+
const result = execute(config.cli, ['brain', 'request'], { cwd: os.homedir(), encoding: 'utf8', timeout: prazo,
|
|
40
79
|
maxBuffer: 2 * 1024 * 1024, input: JSON.stringify(request), shell: false,
|
|
41
80
|
env: { PATH: process.env.PATH ?? '/usr/bin:/bin', PYTHONDONTWRITEBYTECODE: '1',
|
|
42
|
-
ORKMIND_DATABASE_URL: dsn
|
|
81
|
+
ORKMIND_DATABASE_URL: dsn, ORKMIND_BRAIN_TENANT: config.tenant } });
|
|
43
82
|
if (result.error || result.signal)
|
|
44
83
|
return unavailable('brain.transport.unavailable');
|
|
45
84
|
try {
|
|
46
85
|
const response = JSON.parse(String(result.stdout));
|
|
86
|
+
// RM-069 (D21): a resposta que repete a DSN ou a senha dela nunca sai do cliente; recusada inteira, sem o valor.
|
|
87
|
+
if ((0, dsn_da_memoria_1.contemFragmentoDaDsn)(response, dsn))
|
|
88
|
+
return unavailable('brain.transport.secret');
|
|
47
89
|
if (response.schema !== exports.BRAIN_API || !['ok', 'empty', 'unknown', 'unavailable', 'withheld', 'forbidden', 'conflict'].includes(response.state))
|
|
48
90
|
throw Error();
|
|
49
91
|
if (response.state === 'ok' && result.status !== 0)
|
|
@@ -118,7 +118,8 @@ function withProcessLock(dir, busy, run) {
|
|
|
118
118
|
}
|
|
119
119
|
function durableAppend(file, value) {
|
|
120
120
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
121
|
-
|
|
121
|
+
// RM-047: O_NOFOLLOW; um ledger versionado como link não leva o append para fora da raiz.
|
|
122
|
+
const fd = fs.openSync(file, fs.constants.O_WRONLY | fs.constants.O_APPEND | fs.constants.O_CREAT | fs.constants.O_NOFOLLOW, 0o600);
|
|
122
123
|
try {
|
|
123
124
|
fs.writeFileSync(fd, JSON.stringify(value) + '\n');
|
|
124
125
|
fs.fsyncSync(fd);
|
|
@@ -1,32 +1,73 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.brainAdmin = brainAdmin;
|
|
4
37
|
exports.reconcileBrain = reconcileBrain;
|
|
5
38
|
exports.applyBrain = applyBrain;
|
|
39
|
+
const os = __importStar(require("node:os"));
|
|
6
40
|
const node_child_process_1 = require("node:child_process");
|
|
7
41
|
const project_state_1 = require("./project-state");
|
|
8
42
|
const portfolio_1 = require("./portfolio");
|
|
9
43
|
const company_brain_source_1 = require("./company-brain-source");
|
|
10
44
|
const company_brain_journal_1 = require("./company-brain-journal");
|
|
11
45
|
const company_brain_contract_1 = require("./company-brain-contract");
|
|
46
|
+
const dsn_da_memoria_1 = require("./dsn-da-memoria");
|
|
12
47
|
function brainAdmin(c) {
|
|
13
48
|
const config = (0, project_state_1.memoryState)(c).loaded.manifesto.memory;
|
|
14
49
|
return (operation, payload) => {
|
|
15
|
-
|
|
50
|
+
// RM-069: a DSN pelo resolvedor unico (a variavel ou o arquivo da pasta de segredos).
|
|
51
|
+
const dsn = (0, dsn_da_memoria_1.resolverDsn)(config).dsn;
|
|
16
52
|
if (config.mode !== 'orkmind' || !dsn)
|
|
17
53
|
throw Error('brain.configuration.missing');
|
|
18
|
-
|
|
54
|
+
// RM-047: cwd fora do clone; um nome de interpretador em memory.cli não acha arquivo do repositório.
|
|
55
|
+
const r = (0, node_child_process_1.spawnSync)(config.cli, ['brain', 'migration'], { cwd: os.homedir(), shell: false, encoding: 'utf8', timeout: Math.min(config.timeout_ms, 15000), maxBuffer: 2 * 1024 * 1024,
|
|
19
56
|
input: JSON.stringify({ schema: 'orkmind.company-brain-admin/v1', operation, payload }),
|
|
20
57
|
env: { PATH: process.env.PATH ?? '/usr/bin:/bin', PYTHONDONTWRITEBYTECODE: '1', ORKMIND_DATABASE_URL: dsn, ORKMIND_BRAIN_TENANT: config.tenant } });
|
|
58
|
+
let response;
|
|
21
59
|
try {
|
|
22
|
-
|
|
23
|
-
if (r.status !== 0 || response.state !== 'ok')
|
|
24
|
-
throw Error();
|
|
25
|
-
return response.result;
|
|
60
|
+
response = JSON.parse(r.stdout);
|
|
26
61
|
}
|
|
27
62
|
catch {
|
|
28
63
|
throw Error('brain.migration.unconfirmed');
|
|
29
64
|
}
|
|
65
|
+
// RM-069 (D21): a resposta que repete a DSN ou a senha dela nunca sai da migracao; recusada inteira, sem o valor.
|
|
66
|
+
if ((0, dsn_da_memoria_1.contemFragmentoDaDsn)(response, dsn))
|
|
67
|
+
throw Error('brain.migration.secret');
|
|
68
|
+
if (r.status !== 0 || response?.state !== 'ok')
|
|
69
|
+
throw Error('brain.migration.unconfirmed');
|
|
70
|
+
return response.result;
|
|
30
71
|
};
|
|
31
72
|
}
|
|
32
73
|
function reconcileBrain(c, scope, batch, transport = brainAdmin(c)) {
|