@orkastery/cli 0.5.6 → 0.6.1
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 +37 -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/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-pista/hooks/ci.ts +9 -5
- 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/hooks/vigia.ts +1 -1
- 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 +2 -2
- package/adapters/openclaw/README.md +81 -9
- 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/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 +123 -9
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +3 -1
- package/dist/adapters/grok-events.js +227 -0
- package/dist/adapters/grok-mcp-servidor.js +612 -0
- package/dist/adapters/grok-mcp.js +178 -0
- package/dist/adapters/grok.js +686 -0
- package/dist/agendador-cpu.js +92 -0
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +51 -46
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +94 -40
- package/dist/branch-de-estado.js +23 -10
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +2 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +528 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +238 -0
- package/dist/ci.js +248 -45
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +47 -39
- package/dist/claims.js +10 -9
- package/dist/company-brain-client.js +10 -3
- package/dist/company-brain-migration.js +11 -5
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +25 -8
- package/dist/conducao.js +89 -29
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +111 -87
- 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 +89 -89
- package/dist/doctor-forja.js +343 -0
- package/dist/doctor-pulse-cron.js +113 -1
- package/dist/doctor.js +164 -6
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +154 -54
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +21 -18
- package/dist/evalrunner.js +35 -32
- package/dist/fabrica-batida.js +34 -21
- package/dist/fabrica-estado.js +33 -21
- package/dist/fix.js +21 -19
- 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 +123 -80
- package/dist/handoff.js +23 -13
- 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 +51 -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 +44 -1
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +34 -31
- package/dist/horario.js +20 -1
- package/dist/hosts.js +104 -134
- package/dist/index.js +864 -554
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +123 -69
- package/dist/intelligence-graph-query.js +37 -22
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +31 -1
- package/dist/licoes.js +12 -11
- package/dist/locale-accounts.js +228 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +86 -10
- 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 +288 -0
- package/dist/locale-gerados.js +5 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +83 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +140 -2
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +183 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +177 -66
- package/dist/locale-thread.js +149 -5
- package/dist/locale-verify.js +80 -4
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +553 -9
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +293 -12
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +10 -5
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +10 -2
- package/dist/master.js +118 -41
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-install.js +90 -15
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +116 -22
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +68 -24
- package/dist/mcp-transportes.js +17 -0
- package/dist/memoria.js +63 -58
- package/dist/merge-da-entrega.js +85 -0
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +94 -54
- package/dist/noctum-aceite.js +929 -0
- package/dist/noctum-arco.js +540 -33
- package/dist/noctum-capacidade.js +3 -3
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +539 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1217 -0
- package/dist/noctum-envelope.js +253 -17
- package/dist/noctum-execucao.js +100 -24
- package/dist/noctum-fechamento.js +416 -0
- package/dist/noctum-fila.js +49 -10
- package/dist/noctum-guarda.js +333 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +387 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +390 -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 +594 -0
- package/dist/noctum-rede.js +102 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +861 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-retomada-rede.js +71 -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 +679 -0
- package/dist/ocupacao.js +3 -1
- package/dist/onboarding.js +16 -5
- package/dist/orkmind.js +39 -23
- package/dist/orquestracao.js +31 -35
- package/dist/parado-no-condutor.js +160 -139
- package/dist/phase.js +96 -42
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +11 -6
- package/dist/preflight.js +2 -1
- package/dist/procedencia.js +9 -14
- package/dist/projeto-alvo.js +59 -20
- package/dist/prompts.js +136 -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 +143 -27
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +136 -3
- package/dist/ratelimit.js +13 -4
- package/dist/recall.js +14 -13
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +63 -45
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +326 -78
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +279 -85
- package/dist/runtime-escada.js +429 -0
- package/dist/runtime-profiles.js +130 -63
- package/dist/runtimes.js +42 -5
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +366 -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 +196 -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 +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher-grok.js +425 -0
- package/dist/session-watcher.js +174 -13
- package/dist/sessoes-contas.js +42 -5
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +67 -66
- package/dist/ship-publicar.js +263 -92
- package/dist/ship.js +160 -17
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +9 -9
- package/dist/thread.js +121 -18
- 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 +5 -2
- package/dist/varredura-acoes.js +500 -0
- package/dist/verify.js +491 -32
- package/dist/worktree-local.js +12 -10
- package/dist/worktree.js +81 -85
- 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 +10 -5
- package/references/security-checklist.md +3 -3
- 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/runtime-context.js
CHANGED
|
@@ -33,9 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS = exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS = exports.MOTIVO_SEM_HOST_MCP = exports.RUNTIMES_SEM_HOST_MCP = void 0;
|
|
36
37
|
exports.novaIdentidadeDeDespacho = novaIdentidadeDeDespacho;
|
|
38
|
+
exports.capacidadeDoRuntimeNoProjeto = capacidadeDoRuntimeNoProjeto;
|
|
39
|
+
exports.capacidadeDaRotacao = capacidadeDaRotacao;
|
|
37
40
|
exports.contextoDoProjeto = contextoDoProjeto;
|
|
38
41
|
exports.validarContextoRuntime = validarContextoRuntime;
|
|
42
|
+
exports.validarContextoDoGrok = validarContextoDoGrok;
|
|
39
43
|
exports.lerDeclaracaoDeMod = lerDeclaracaoDeMod;
|
|
40
44
|
exports.modsDeFaseInstalados = modsDeFaseInstalados;
|
|
41
45
|
/** Contexto interno opt-in: configuracao M4 existente + catalogo instalado, nunca args do modelo. */
|
|
@@ -49,6 +53,7 @@ const hosts_1 = require("./hosts");
|
|
|
49
53
|
const worktree_1 = require("./worktree");
|
|
50
54
|
const mcp_install_1 = require("./mcp-install");
|
|
51
55
|
const mcp_grafo_1 = require("./mcp-grafo");
|
|
56
|
+
const mcp_transportes_1 = require("./mcp-transportes");
|
|
52
57
|
const hitl_public_receipt_1 = require("./hitl-public-receipt");
|
|
53
58
|
/** Correlação interna; nenhuma identidade de despacho concede poder de gate. */
|
|
54
59
|
function novaIdentidadeDeDespacho(threadId, fase) {
|
|
@@ -81,48 +86,89 @@ function ler(raiz, file, limite) {
|
|
|
81
86
|
fs.closeSync(fd);
|
|
82
87
|
}
|
|
83
88
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
/** A entrada `orkastery` de um host, conferida contra o perfil ja achado nos hosts anteriores; sem entrada, o perfil fica. */
|
|
90
|
+
function perfilDoHost(raiz, host, encontrado) {
|
|
91
|
+
const file = (0, mcp_install_1.arquivoDoHostMcp)(raiz, host), toml = host !== 'claude-code';
|
|
92
|
+
if (!fs.existsSync(file))
|
|
93
|
+
return encontrado;
|
|
94
|
+
let config;
|
|
95
|
+
try {
|
|
90
96
|
const text = ler(raiz, file, 262144).toString('utf8');
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
97
|
+
config = objeto(toml ? (0, smol_toml_1.parse)(text) : JSON.parse(text));
|
|
98
|
+
}
|
|
99
|
+
catch (erro) {
|
|
100
|
+
// RM-067 (F4b, GO-FIX A4 e N2): o motivo tipado do grok leva o codigo do erro de sistema ou a primeira linha do parser,
|
|
101
|
+
// sem o trecho do arquivo do time nem o caminho da maquina.
|
|
102
|
+
if (host !== 'grok')
|
|
103
|
+
throw erro;
|
|
104
|
+
const causa = erro.code ?? erro.message.split('\n')[0];
|
|
105
|
+
throw Error(`runtime.context.conflict: .grok/config.toml do projeto ilegivel (${causa}); conserte o arquivo ou tire dele a entrada orkastery`);
|
|
106
|
+
}
|
|
107
|
+
const chave = toml ? 'mcp_servers' : 'mcpServers';
|
|
108
|
+
if (config[chave] === undefined)
|
|
109
|
+
return encontrado;
|
|
110
|
+
const servidores = objeto(config[chave]);
|
|
111
|
+
if (!Object.hasOwn(servidores, 'orkastery'))
|
|
112
|
+
return encontrado;
|
|
113
|
+
const entrada = objeto(servidores.orkastery), padrao = (0, mcp_install_1.configuracaoServidorMcp)(raiz, host);
|
|
114
|
+
const legado = padrao.args.slice(0, -2);
|
|
115
|
+
let transporte = 'github-ssh';
|
|
116
|
+
let argv = entrada.args;
|
|
117
|
+
let permissoesFilho = 'interactive';
|
|
118
|
+
if (Array.isArray(argv) && argv[argv.length - 2] === '--child-permissions') {
|
|
119
|
+
if (!['interactive', 'worktree'].includes(argv[argv.length - 1]))
|
|
120
|
+
throw Error('runtime.context.conflict: perfil de filho invalido');
|
|
121
|
+
permissoesFilho = argv[argv.length - 1];
|
|
122
|
+
argv = argv.slice(0, -2);
|
|
123
|
+
}
|
|
124
|
+
if (JSON.stringify(argv) !== JSON.stringify(legado)) {
|
|
125
|
+
if (!Array.isArray(argv) || argv.length !== padrao.args.length ||
|
|
126
|
+
argv[argv.length - 2] !== '--ship-transport' || !(0, mcp_transportes_1.ehTransporteShipMcp)(argv[argv.length - 1]))
|
|
127
|
+
throw Error('runtime.context.conflict: MCP Orkastery divergente; transporte invalido ou argumentos extras');
|
|
128
|
+
transporte = argv[argv.length - 1];
|
|
129
|
+
}
|
|
130
|
+
const esperado = (0, mcp_install_1.configuracaoServidorMcp)(raiz, host, undefined, transporte);
|
|
131
|
+
if (entrada.command !== esperado.command || (JSON.stringify(argv) !== JSON.stringify(esperado.args) && JSON.stringify(argv) !== JSON.stringify(legado)))
|
|
132
|
+
throw Error('runtime.context.conflict: MCP Orkastery divergente; repare a instalacao do projeto');
|
|
133
|
+
if (encontrado !== undefined && encontrado.transporteShip !== transporte)
|
|
134
|
+
throw Error('runtime.context.conflict: transportes SHIP divergentes entre hosts');
|
|
135
|
+
if (encontrado !== undefined && encontrado.permissoesFilho !== permissoesFilho)
|
|
136
|
+
throw Error('runtime.context.conflict: perfis de filho divergentes entre hosts');
|
|
137
|
+
return { ...encontrado, transporteShip: transporte, permissoesFilho, ...(host === 'codex' ? { politicasCodex: entrada } : {}) };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* O perfil da instalacao MCP do projeto. RM-067 (F4b, GO-FIX A4): o `.grok/config.toml` tambem prepara, em TOML como o do
|
|
141
|
+
* codex, mas ele e a config do proprio grok, que o time pode manter: para quem nao e o grok (`quem`), a falha de leitura,
|
|
142
|
+
* de parse ou de conferencia dele nao derruba a preparacao dos outros hosts, e a entrada dele fica de fora. GO-FIX N1: sem
|
|
143
|
+
* outro host preparado, a entrada `orkastery` do grok e a preparacao do projeto, e engolir a falha dela faria o claude-bg
|
|
144
|
+
* e o codex despacharem como num projeto legado, sem o MCP; a falha volta, e so a config do time sem a entrada fica de fora.
|
|
145
|
+
*/
|
|
146
|
+
function preparado(raiz, quem) {
|
|
147
|
+
let encontrado;
|
|
148
|
+
let falhaDoGrok = null;
|
|
149
|
+
for (const host of mcp_install_1.HOSTS_MCP) {
|
|
150
|
+
try {
|
|
151
|
+
encontrado = perfilDoHost(raiz, host, encontrado);
|
|
108
152
|
}
|
|
109
|
-
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
transporte = argv[argv.length - 1];
|
|
153
|
+
catch (erro) {
|
|
154
|
+
if (host !== 'grok' || quem === undefined || quem === 'grok')
|
|
155
|
+
throw erro;
|
|
156
|
+
falhaDoGrok = erro;
|
|
114
157
|
}
|
|
115
|
-
const esperado = (0, mcp_install_1.configuracaoServidorMcp)(raiz, host, undefined, transporte);
|
|
116
|
-
if (entrada.command !== esperado.command || (JSON.stringify(argv) !== JSON.stringify(esperado.args) && JSON.stringify(argv) !== JSON.stringify(legado)))
|
|
117
|
-
throw Error('runtime.context.conflict: MCP Orkastery divergente; repare a instalacao do projeto');
|
|
118
|
-
if (encontrado !== undefined && encontrado.transporteShip !== transporte)
|
|
119
|
-
throw Error('runtime.context.conflict: transportes SHIP divergentes entre hosts');
|
|
120
|
-
if (encontrado !== undefined && encontrado.permissoesFilho !== permissoesFilho)
|
|
121
|
-
throw Error('runtime.context.conflict: perfis de filho divergentes entre hosts');
|
|
122
|
-
encontrado = { ...encontrado, transporteShip: transporte, permissoesFilho, ...(host === 'codex' ? { politicasCodex: entrada } : {}) };
|
|
123
158
|
}
|
|
159
|
+
if (falhaDoGrok !== null && encontrado === undefined && podeTerEntradaDoOrk(raiz))
|
|
160
|
+
throw falhaDoGrok;
|
|
124
161
|
return encontrado;
|
|
125
162
|
}
|
|
163
|
+
/** O `.grok/config.toml` do projeto tem, ou pode ter, a entrada `orkastery`; o que nao se le conta como se tivesse. */
|
|
164
|
+
function podeTerEntradaDoOrk(raiz) {
|
|
165
|
+
try {
|
|
166
|
+
return ler(raiz, (0, mcp_install_1.arquivoDoHostMcp)(raiz, 'grok'), 262144).toString('utf8').includes('orkastery');
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
126
172
|
function raizCanonica(projeto) {
|
|
127
173
|
if (!path.isAbsolute(projeto))
|
|
128
174
|
throw Error('runtime.context.invalid: projeto absoluto obrigatorio');
|
|
@@ -133,30 +179,141 @@ function raizCanonica(projeto) {
|
|
|
133
179
|
dentro(raiz, path.join(raiz, '.orkastery'));
|
|
134
180
|
return raiz;
|
|
135
181
|
}
|
|
182
|
+
function hostDoRuntime(runtime) {
|
|
183
|
+
if (runtime === 'claude-bg')
|
|
184
|
+
return 'claude-code';
|
|
185
|
+
if (runtime === 'codex')
|
|
186
|
+
return 'codex';
|
|
187
|
+
if (runtime === 'grok')
|
|
188
|
+
return 'grok';
|
|
189
|
+
throw Error('runtime.context.invalid: runtime desconhecido');
|
|
190
|
+
}
|
|
191
|
+
/** Confere o recibo e todos os bytes do adaptador antes de considerar o runtime um destino. */
|
|
192
|
+
function conferirInstalacaoDoHost(raiz, host) {
|
|
193
|
+
const def = hosts_1.HOSTS[host];
|
|
194
|
+
const instalacao = path.join(raiz, def.destinoPadrao, def.subdir ?? '');
|
|
195
|
+
let recibo;
|
|
196
|
+
try {
|
|
197
|
+
recibo = objeto(JSON.parse(ler(raiz, path.join(instalacao, 'INSTALADO.json'), 1048576).toString('utf8')));
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
throw Error('runtime.context.installation: instale/verifique o adaptador do runtime neste projeto');
|
|
201
|
+
}
|
|
202
|
+
if (recibo.contrato !== 'ork.adapter-install/v1' || recibo.host !== host || !Array.isArray(recibo.arquivos) || recibo.arquivos.length > 512)
|
|
203
|
+
throw Error('runtime.context.installation: recibo instalado invalido');
|
|
204
|
+
const arquivos = new Map();
|
|
205
|
+
// RM-059 (T0.7): os bytes ja conferidos da declaracao e do manifesto de cada mod, lidos uma vez so.
|
|
206
|
+
const conferidos = new Map();
|
|
207
|
+
for (const item of recibo.arquivos) {
|
|
208
|
+
const a = objeto(item);
|
|
209
|
+
if (typeof a.arquivo !== 'string' || path.isAbsolute(a.arquivo) || a.arquivo.split(/[\\/]/).includes('..') ||
|
|
210
|
+
typeof a.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(a.sha256) || arquivos.has(a.arquivo))
|
|
211
|
+
throw Error('runtime.context.installation: arquivo do recibo invalido');
|
|
212
|
+
const file = path.join(instalacao, a.arquivo);
|
|
213
|
+
if (!dentro(raiz, file).startsWith(instalacao + path.sep))
|
|
214
|
+
throw Error('runtime.context.installation: bytes instalados divergentes');
|
|
215
|
+
const bytes = ler(raiz, file, 1048576);
|
|
216
|
+
if ((0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex') !== a.sha256)
|
|
217
|
+
throw Error('runtime.context.installation: bytes instalados divergentes');
|
|
218
|
+
arquivos.set(a.arquivo, file);
|
|
219
|
+
if (DECLARACAO_OU_MANIFESTO_DE_MOD.test(a.arquivo))
|
|
220
|
+
conferidos.set(a.arquivo, bytes);
|
|
221
|
+
}
|
|
222
|
+
const bootstrap = arquivos.get('skills/core/orkastery-bootstrap/SKILL.md');
|
|
223
|
+
if (!bootstrap || (host === 'claude-code' && !arquivos.has('.claude-plugin/plugin.json')))
|
|
224
|
+
throw Error('runtime.context.installation: catalogo ou plugin incompleto');
|
|
225
|
+
return { instalacao, arquivos, conferidos, bootstrap };
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Um projeto preparado so pode escolher runtimes cujo adaptador esteja instalado e integro.
|
|
229
|
+
* Projeto legado, sem entrada MCP do Orkastery, conserva a selecao anterior.
|
|
230
|
+
*/
|
|
231
|
+
function capacidadeDoRuntimeNoProjeto(projeto, runtime) {
|
|
232
|
+
let host = null;
|
|
233
|
+
try {
|
|
234
|
+
const raiz = raizCanonica(projeto);
|
|
235
|
+
const perfil = preparado(raiz, runtime);
|
|
236
|
+
if (!perfil)
|
|
237
|
+
return { runtime, host: null, preparado: false, capaz: true, motivo: null };
|
|
238
|
+
if (exports.RUNTIMES_SEM_HOST_MCP.includes(runtime))
|
|
239
|
+
return { runtime, host: null, preparado: true, capaz: false, motivo: exports.MOTIVO_SEM_HOST_MCP };
|
|
240
|
+
host = hostDoRuntime(runtime);
|
|
241
|
+
// RM-067 (F4b, G6): o grok nao tem adaptador instalavel (plugin, skills, mods); o contexto dele e so o MCP.
|
|
242
|
+
if (host !== 'grok')
|
|
243
|
+
conferirInstalacaoDoHost(raiz, host);
|
|
244
|
+
if (exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS.includes(runtime))
|
|
245
|
+
return { runtime, host, preparado: true, capaz: false, motivo: exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS };
|
|
246
|
+
return { runtime, host, preparado: true, capaz: true, motivo: null };
|
|
247
|
+
}
|
|
248
|
+
catch (erro) {
|
|
249
|
+
return { runtime, host, preparado: true, capaz: false, motivo: erro.message };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* RM-067 (D15 da ork-grokbuild): runtimes homologados que ainda nao tem host MCP do Orkastery. A sessao filha deles
|
|
254
|
+
* despacha sem contexto, como num projeto sem entrada MCP, ate o host existir. A capacidade de rotacao
|
|
255
|
+
* (`capacidadeDoRuntimeNoProjeto`) nao muda: num projeto preparado, eles seguem fora dos destinos automaticos.
|
|
256
|
+
* RM-067 (F4b, G6): o grok saiu daqui com o host `grok`; a lista fica para o proximo runtime sem host.
|
|
257
|
+
*/
|
|
258
|
+
exports.RUNTIMES_SEM_HOST_MCP = [];
|
|
259
|
+
/** RM-067 (F4): o motivo tipado de um runtime sem host MCP num projeto preparado. */
|
|
260
|
+
exports.MOTIVO_SEM_HOST_MCP = 'runtime.context.no-host: runtime sem host MCP do Orkastery; a sessao despacha sem o contexto do projeto';
|
|
261
|
+
/**
|
|
262
|
+
* RM-067 (F4b, GO-FIX A5; F4c, D9): runtimes com o host MCP que, num projeto preparado, ficam fora dos destinos
|
|
263
|
+
* automaticos (o fallback do retry e a escada), porque o servidor MCP do ork nao grava o estado na sessao deles e a fase
|
|
264
|
+
* que chega por fallback pararia sem prova. O grok ficou aqui da F4b a F4c: o sandbox dele vale para o processo inteiro e
|
|
265
|
+
* os filhos (G17 da RM-067), e o servidor stdio era filho dele. Desde a F4c o servidor e um processo do ork, fora do
|
|
266
|
+
* sandbox (`adapters/grok-mcp.ts`), e a fase do grok no piso `workspace` fecha com prova; a lista fica vazia, para o
|
|
267
|
+
* proximo runtime cujo MCP nao grave o estado, como `RUNTIMES_SEM_HOST_MCP`.
|
|
268
|
+
*/
|
|
269
|
+
exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS = [];
|
|
270
|
+
exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS = 'runtime.context.sandbox: o sandbox do runtime vale tambem para o servidor MCP do ' +
|
|
271
|
+
'ork, que nao grava o estado; como destino automatico num projeto preparado, o runtime fica fora';
|
|
272
|
+
/**
|
|
273
|
+
* RM-067 (F4): a capacidade de um runtime para a rotacao do retry. A troca de perfil DENTRO do runtime em que a thread ja
|
|
274
|
+
* despachou (`mesmoRuntime`) vale para o runtime sem host MCP e para o que fica fora dos destinos automaticos: a sessao
|
|
275
|
+
* dele ja roda como rodava, e a outra conta nao muda isso, entao o `ork retry` troca o perfil dele como troca o dos outros
|
|
276
|
+
* runtimes. Como alvo de fallback num projeto preparado, ele segue incapaz. Desde a F4c, nenhum runtime homologado esta
|
|
277
|
+
* nas duas listas, e o grok e capaz nos dois papeis.
|
|
278
|
+
*/
|
|
279
|
+
function capacidadeDaRotacao(projeto, runtime, mesmoRuntime) {
|
|
280
|
+
const capacidade = capacidadeDoRuntimeNoProjeto(projeto, runtime);
|
|
281
|
+
if (capacidade.capaz || !mesmoRuntime)
|
|
282
|
+
return capacidade;
|
|
283
|
+
const soComoDestino = (exports.RUNTIMES_SEM_HOST_MCP.includes(runtime) && capacidade.motivo === exports.MOTIVO_SEM_HOST_MCP) ||
|
|
284
|
+
(exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS.includes(runtime) && capacidade.motivo === exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS);
|
|
285
|
+
return soComoDestino ? { ...capacidade, capaz: true } : capacidade;
|
|
286
|
+
}
|
|
136
287
|
/** Projeto sem entrada MCP Orkastery continua com o contrato legado. Nao instala nem altera arquivos. */
|
|
137
288
|
function contextoDoProjeto(projeto, runtime, cwd, threadId) {
|
|
138
289
|
const raiz = raizCanonica(projeto);
|
|
139
|
-
const perfil = preparado(raiz);
|
|
290
|
+
const perfil = preparado(raiz, runtime);
|
|
140
291
|
if (!perfil)
|
|
141
292
|
return undefined;
|
|
142
|
-
if (
|
|
143
|
-
|
|
293
|
+
if (exports.RUNTIMES_SEM_HOST_MCP.includes(runtime))
|
|
294
|
+
return undefined;
|
|
295
|
+
const host = hostDoRuntime(runtime);
|
|
144
296
|
if (!threadId)
|
|
145
297
|
throw Error('runtime.context.invalid: thread obrigatoria para sessao filha');
|
|
146
|
-
const contexto = { projeto: raiz, host
|
|
147
|
-
|
|
298
|
+
const contexto = { projeto: raiz, host, threadId, transporteShip: perfil.transporteShip, permissoesFilho: perfil.permissoesFilho };
|
|
299
|
+
if (host === 'grok')
|
|
300
|
+
validarContextoDoGrok(contexto, cwd);
|
|
301
|
+
else
|
|
302
|
+
validarContextoRuntime(contexto, cwd);
|
|
148
303
|
return contexto;
|
|
149
304
|
}
|
|
150
|
-
/**
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
305
|
+
/**
|
|
306
|
+
* A conferencia do vinculo, comum a todo host: projeto preparado, perfil e transporte iguais aos da instalacao, cwd e
|
|
307
|
+
* thread da sessao filha, identidade do despacho e, no perfil worktree, a worktree propria da thread. RM-067 (F4b, D2):
|
|
308
|
+
* saiu de `validarContextoRuntime` sem mudar a ordem das conferencias, para o contexto do grok usar a mesma.
|
|
309
|
+
*/
|
|
310
|
+
function conferirVinculo(contexto, cwd) {
|
|
311
|
+
if (contexto.transporteShip !== undefined && !(0, mcp_transportes_1.ehTransporteShipMcp)(contexto.transporteShip))
|
|
155
312
|
throw Error('runtime.context.invalid: transporte desconhecido');
|
|
156
313
|
const raiz = raizCanonica(contexto.projeto);
|
|
157
314
|
if (contexto.permissoesFilho !== undefined && !['interactive', 'worktree'].includes(contexto.permissoesFilho))
|
|
158
315
|
throw Error('runtime.context.invalid: perfil de filho desconhecido');
|
|
159
|
-
const perfil = preparado(raiz);
|
|
316
|
+
const perfil = preparado(raiz, contexto.host);
|
|
160
317
|
if (!perfil)
|
|
161
318
|
throw Error('runtime.context.missing: projeto nao preparado pelo instalador MCP');
|
|
162
319
|
const { transporteShip, permissoesFilho } = perfil;
|
|
@@ -183,38 +340,14 @@ function validarContextoRuntime(contexto, cwd) {
|
|
|
183
340
|
if (!(0, worktree_1.worktreesDoGit)(raiz).some(w => w.dir === cwd && w.branch === (0, worktree_1.branchDaWorktree)(thread)))
|
|
184
341
|
throw Error('runtime.context.worktree: worktree nao registrada na branch da thread');
|
|
185
342
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
if (recibo.contrato !== 'ork.adapter-install/v1' || recibo.host !== contexto.host || !Array.isArray(recibo.arquivos) || recibo.arquivos.length > 512)
|
|
196
|
-
throw Error('runtime.context.installation: recibo instalado invalido');
|
|
197
|
-
const arquivos = new Map();
|
|
198
|
-
// RM-059 (T0.7): os bytes ja conferidos da declaracao e do manifesto de cada mod, lidos uma vez so.
|
|
199
|
-
const conferidos = new Map();
|
|
200
|
-
for (const item of recibo.arquivos) {
|
|
201
|
-
const a = objeto(item);
|
|
202
|
-
if (typeof a.arquivo !== 'string' || path.isAbsolute(a.arquivo) || a.arquivo.split(/[\\/]/).includes('..') ||
|
|
203
|
-
typeof a.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(a.sha256) || arquivos.has(a.arquivo))
|
|
204
|
-
throw Error('runtime.context.installation: arquivo do recibo invalido');
|
|
205
|
-
const file = path.join(instalacao, a.arquivo);
|
|
206
|
-
if (!dentro(raiz, file).startsWith(instalacao + path.sep))
|
|
207
|
-
throw Error('runtime.context.installation: bytes instalados divergentes');
|
|
208
|
-
const bytes = ler(raiz, file, 1048576);
|
|
209
|
-
if ((0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex') !== a.sha256)
|
|
210
|
-
throw Error('runtime.context.installation: bytes instalados divergentes');
|
|
211
|
-
arquivos.set(a.arquivo, file);
|
|
212
|
-
if (DECLARACAO_OU_MANIFESTO_DE_MOD.test(a.arquivo))
|
|
213
|
-
conferidos.set(a.arquivo, bytes);
|
|
214
|
-
}
|
|
215
|
-
const bootstrap = arquivos.get('skills/core/orkastery-bootstrap/SKILL.md');
|
|
216
|
-
if (!bootstrap || (contexto.host === 'claude-code' && !arquivos.has('.claude-plugin/plugin.json')))
|
|
217
|
-
throw Error('runtime.context.installation: catalogo ou plugin incompleto');
|
|
343
|
+
return { raiz, perfil, transporteShip, permissoesFilho, thread };
|
|
344
|
+
}
|
|
345
|
+
/** Revalida no receptor do despacho, incluindo bytes instalados e escopo real do cwd. */
|
|
346
|
+
function validarContextoRuntime(contexto, cwd) {
|
|
347
|
+
if (!contexto || (contexto.host !== 'claude-code' && contexto.host !== 'codex'))
|
|
348
|
+
throw Error('runtime.context.invalid: host desconhecido');
|
|
349
|
+
const { raiz, perfil, transporteShip, permissoesFilho, thread } = conferirVinculo(contexto, cwd);
|
|
350
|
+
const { instalacao, arquivos, conferidos, bootstrap } = conferirInstalacaoDoHost(raiz, contexto.host);
|
|
218
351
|
const modsDeFase = contexto.host === 'claude-code' ? modsDeFaseInstalados(raiz, instalacao, arquivos, conferidos) : [];
|
|
219
352
|
// Capacidade derivada do bloco atual, nunca aceita como entrada do modelo.
|
|
220
353
|
const permiteEditarProduto = permissoesFilho === 'worktree' && (0, thread_1.blocoDaThread)(thread, thread.faseAtual).fases.includes('GO');
|
|
@@ -233,6 +366,25 @@ function validarContextoRuntime(contexto, cwd) {
|
|
|
233
366
|
...(contexto.host === 'codex' && permissoesFilho === 'worktree' ? (0, mcp_install_1.politicasFilhoCodex)(perfil.politicasCodex ?? {}) : {}) };
|
|
234
367
|
return { projeto: raiz, instalacao, bootstrap, permissoesFilho, permiteEditarProduto, grafoMcp, servidor, modsDeFase, agentTeams };
|
|
235
368
|
}
|
|
369
|
+
/**
|
|
370
|
+
* RM-067 (F4b, D2): o contexto do grok, revalidado no despacho. O vinculo e o mesmo dos outros hosts; nao ha adaptador
|
|
371
|
+
* instalado a conferir (o grok nao tem plugin, skills nem mods do Orkastery). Devolve o que o comando e o despacho usam:
|
|
372
|
+
* o perfil filho, a flag do grafo da raiz e, desde a F4c, a especificacao do servidor externo vinculado a thread e ao despacho.
|
|
373
|
+
*/
|
|
374
|
+
function validarContextoDoGrok(contexto, cwd) {
|
|
375
|
+
if (!contexto || contexto.host !== 'grok')
|
|
376
|
+
throw Error('runtime.context.invalid: host grok esperado');
|
|
377
|
+
const { raiz, transporteShip, permissoesFilho, thread } = conferirVinculo(contexto, cwd);
|
|
378
|
+
// RM-067 (F4b, GO-FIX B1): a config da sessao vai no cwd; na raiz do projeto ela viraria a entrada do host grok.
|
|
379
|
+
if (!thread.worktree || thread.worktree === raiz || cwd === raiz)
|
|
380
|
+
throw Error('runtime.context.worktree: o grok com o MCP do ork exige a worktree propria da thread; a config da sessao nunca vai a raiz do projeto');
|
|
381
|
+
const grafoMcp = (0, mcp_grafo_1.grafoLigado)((0, manifest_1.exigirManifesto)(raiz).manifesto);
|
|
382
|
+
const publicVerifiers = (0, hitl_public_receipt_1.publicHitlVerifiers)();
|
|
383
|
+
const servidor = { projeto: raiz, threadId: contexto.threadId,
|
|
384
|
+
dispatchId: contexto.identidade?.dispatchId ?? null, permissoesFilho, transporteShip,
|
|
385
|
+
...(publicVerifiers ? { env: { [hitl_public_receipt_1.ENV_HITL_VERIFIERS]: publicVerifiers } } : {}) };
|
|
386
|
+
return { projeto: raiz, threadId: contexto.threadId, permissoesFilho, grafoMcp, servidor };
|
|
387
|
+
}
|
|
236
388
|
const DECLARACAO_OU_MANIFESTO_DE_MOD = /^mods\/[^/]+\/(?:orkastery-mod\.json|\.claude-plugin\/plugin\.json)$/;
|
|
237
389
|
const DECLARACAO_DE_MOD = /^mods\/([^/]+)\/orkastery-mod\.json$/;
|
|
238
390
|
const NOME_DE_MOD = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
|
|
@@ -279,14 +431,52 @@ function dependenciasDoManifesto(texto) {
|
|
|
279
431
|
return typeof nome === 'string' && nome ? [nome.split('@')[0]] : [];
|
|
280
432
|
});
|
|
281
433
|
}
|
|
282
|
-
/** Os
|
|
283
|
-
function
|
|
284
|
-
|
|
434
|
+
/** Os arquivos comuns que o proprio Claude Code escreve na pasta do mod que ele carrega: declaracoes, nunca codigo. */
|
|
435
|
+
function arquivoDoMotor(raiz, arquivo, relativo) {
|
|
436
|
+
if (relativo === '.claude-plugin/types/.gitignore')
|
|
437
|
+
return true;
|
|
438
|
+
if (relativo.startsWith('.claude-plugin/types/') &&
|
|
439
|
+
(relativo.endsWith('.d.ts') || path.posix.basename(relativo) === 'tsconfig.json'))
|
|
440
|
+
return true;
|
|
441
|
+
if (relativo !== 'tsconfig.json')
|
|
442
|
+
return false;
|
|
443
|
+
try {
|
|
444
|
+
const config = objeto(JSON.parse(ler(raiz, arquivo, 4096).toString('utf8')));
|
|
445
|
+
return Object.keys(config).length === 1 && config.extends === './.claude-plugin/types/tsconfig.json';
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/** Link de tipos gerado pelo Claude Code: o alvo real continua preso a um .d.ts comprovado pelo recibo. */
|
|
452
|
+
function linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos) {
|
|
453
|
+
if (!relativo.startsWith('.claude-plugin/types/') || !relativo.endsWith('.d.ts'))
|
|
454
|
+
return false;
|
|
455
|
+
let alvo;
|
|
456
|
+
try {
|
|
457
|
+
alvo = fs.realpathSync(arquivo);
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
const relativoAoRecibo = path.relative(instalacao, alvo).split(path.sep).join('/');
|
|
463
|
+
if (!/^mods\/[^/]+\/types\/[^/]+\.d\.ts$/.test(relativoAoRecibo))
|
|
464
|
+
return false;
|
|
465
|
+
const comprovado = arquivos.get(relativoAoRecibo);
|
|
466
|
+
if (!comprovado)
|
|
467
|
+
return false;
|
|
468
|
+
try {
|
|
469
|
+
return fs.realpathSync(comprovado) === alvo && fs.statSync(alvo).isFile();
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
285
474
|
}
|
|
286
475
|
/**
|
|
287
476
|
* RM-059 (T0.7, D1): a pasta instalada de um mod de fase tem exatamente os arquivos do recibo. O
|
|
288
477
|
* `--plugin-dir` carrega o que estiver nela (comandos, agentes e skills sao descobertos), entao arquivo
|
|
289
|
-
* fora do recibo entraria na sessao de fase sem prova.
|
|
478
|
+
* fora do recibo entraria na sessao de fase sem prova. So o link de tipos gerado pelo motor conserva
|
|
479
|
+
* a prova pelo alvo real; outro link e arquivo especial recusam sempre.
|
|
290
480
|
*/
|
|
291
481
|
function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
|
|
292
482
|
const dir = path.join(instalacao, 'mods', nome);
|
|
@@ -296,15 +486,19 @@ function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
|
|
|
296
486
|
const visitar = (atual, prefixo) => {
|
|
297
487
|
for (const entrada of fs.readdirSync(atual, { withFileTypes: true })) {
|
|
298
488
|
const relativo = prefixo ? `${prefixo}/${entrada.name}` : entrada.name;
|
|
299
|
-
|
|
489
|
+
const arquivo = path.join(atual, entrada.name);
|
|
490
|
+
if (entrada.isSymbolicLink()) {
|
|
491
|
+
if (linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos))
|
|
492
|
+
continue;
|
|
300
493
|
throw recusa(`link em ${relativo}`);
|
|
494
|
+
}
|
|
301
495
|
if (entrada.isDirectory()) {
|
|
302
496
|
visitar(path.join(atual, entrada.name), relativo);
|
|
303
497
|
continue;
|
|
304
498
|
}
|
|
305
499
|
if (!entrada.isFile())
|
|
306
500
|
throw recusa(`arquivo especial em ${relativo}`);
|
|
307
|
-
if (!arquivos.has(`mods/${nome}/${relativo}`) && !
|
|
501
|
+
if (!arquivos.has(`mods/${nome}/${relativo}`) && !arquivoDoMotor(raiz, arquivo, relativo)) {
|
|
308
502
|
throw recusa(`arquivo fora do INSTALADO.json (${relativo})`, 'se ele saiu do catalogo, ork adapter install claude-code o tira da copia; ' +
|
|
309
503
|
`se foi editado ou acrescentado a mao, apague ${path.join(dir, relativo)}`);
|
|
310
504
|
}
|