@orkastery/cli 0.5.6 → 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 +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 +118 -4
- 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/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 +16 -8
- 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 +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -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 +84 -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 +81 -74
- package/dist/doctor-forja.js +345 -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 +143 -43
- 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 +13 -10
- 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 +16 -0
- package/dist/hosts.js +104 -134
- package/dist/index.js +848 -548
- package/dist/indice-vetorial.js +14 -12
- package/dist/init.js +11 -2
- package/dist/integracoes-locais.js +2 -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 +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +76 -4
- 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 +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 +145 -6
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +169 -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 +287 -11
- 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 +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +82 -14
- 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/modos-migracao.js +8 -6
- package/dist/modos.js +17 -18
- package/dist/network-roadmap.js +85 -49
- package/dist/noctum-aceite.js +789 -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 +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +252 -16
- package/dist/noctum-execucao.js +95 -23
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +43 -9
- 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 +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 +146 -124
- package/dist/phase.js +53 -27
- package/dist/policies.js +33 -0
- package/dist/postura-local.js +4 -3
- 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 +12 -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 +228 -73
- package/dist/roadmap-reservas.js +32 -32
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +117 -43
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- 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 +19 -2
- package/dist/session-watcher-claude.js +74 -19
- package/dist/session-watcher.js +156 -10
- package/dist/sessoes-contas.js +9 -0
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- 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 +507 -0
- package/dist/verify.js +472 -29
- 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 +9 -4
- 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/roadmap-reservas.js
CHANGED
|
@@ -195,11 +195,11 @@ function reservarFeat(raiz, opcoes = {}) {
|
|
|
195
195
|
for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
|
|
196
196
|
const { ponta, atualizado } = buscar(raiz, remoto);
|
|
197
197
|
if (!atualizado)
|
|
198
|
-
throw new
|
|
198
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaReservar(exports.BRANCH_DE_RESERVAS, remoto));
|
|
199
199
|
const feats = featsDaPonta(raiz, ponta);
|
|
200
200
|
const proximo = Math.max(maiorFeatConhecida(raiz, remoto), ...feats.map((r) => numeroDaFeat(r.feat))) + 1;
|
|
201
201
|
if (proximo > 999)
|
|
202
|
-
throw new
|
|
202
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.featsAcabaram);
|
|
203
203
|
const feat = `FEAT-${String(proximo).padStart(3, '0')}`;
|
|
204
204
|
const reserva = { contrato: exports.CONTRATO_FEAT, feat, por: eu.por, maquina: eu.maquina,
|
|
205
205
|
thread: opcoes.thread ?? null, nota: opcoes.nota ?? null, em: opcoes.agora ?? (0, util_1.agora)() };
|
|
@@ -210,7 +210,7 @@ function reservarFeat(raiz, opcoes = {}) {
|
|
|
210
210
|
if (commit)
|
|
211
211
|
return { feat, reserva, commit, tentativas: tentativa };
|
|
212
212
|
}
|
|
213
|
-
throw new
|
|
213
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
|
|
214
214
|
}
|
|
215
215
|
/** O `RESERVAS.md` da branch: a mesma lista, para quem abre o GitHub. */
|
|
216
216
|
function painelEmMarkdown(reservas, feats = []) {
|
|
@@ -243,14 +243,14 @@ function gravar(raiz, remoto, ponta, mudanca, todas, mensagem, rede = {}) {
|
|
|
243
243
|
function ehMinha(r, eu) {
|
|
244
244
|
return r.por === eu.por && r.maquina === eu.maquina;
|
|
245
245
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
246
|
+
/** RM-061 (F3b): a descricao no locale de quem a monta; o erro e o ledger a montam pelo catalogo. */
|
|
247
|
+
function descrever(r, m = (0, locale_1.msg)().reservas) {
|
|
248
|
+
return m.descricao(r.item, r.por, r.maquina, (0, horario_1.formatarDataHora)(r.desdeEm), r.thread ?? null);
|
|
249
249
|
}
|
|
250
250
|
function exigirMotivo(opcoes) {
|
|
251
251
|
const motivo = (opcoes.motivo ?? '').trim();
|
|
252
252
|
if (!motivo)
|
|
253
|
-
throw new
|
|
253
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.forcarSemMotivo);
|
|
254
254
|
return motivo;
|
|
255
255
|
}
|
|
256
256
|
/**
|
|
@@ -264,7 +264,7 @@ function pegarItem(raiz, item, opcoes = {}) {
|
|
|
264
264
|
for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
|
|
265
265
|
const { ponta, atualizado } = buscar(raiz, remoto, opcoes.rede);
|
|
266
266
|
if (!atualizado)
|
|
267
|
-
throw new
|
|
267
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaReservar(exports.BRANCH_DE_RESERVAS, remoto));
|
|
268
268
|
const todas = lerDaPonta(raiz, ponta);
|
|
269
269
|
const atual = todas.find((r) => r.item === id) ?? null;
|
|
270
270
|
if (opcoes.threadEsperada !== undefined && (atual?.thread ?? null) !== opcoes.threadEsperada) {
|
|
@@ -277,7 +277,7 @@ function pegarItem(raiz, item, opcoes = {}) {
|
|
|
277
277
|
acao = 'renovou';
|
|
278
278
|
else if (atual) {
|
|
279
279
|
if (!opcoes.forcar)
|
|
280
|
-
throw new
|
|
280
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.reservadoAoPegar(descrever(atual, m.reservas)));
|
|
281
281
|
tomadaDe = { por: atual.por, maquina: atual.maquina, motivo: exigirMotivo(opcoes) };
|
|
282
282
|
acao = 'tomou';
|
|
283
283
|
}
|
|
@@ -297,7 +297,7 @@ function pegarItem(raiz, item, opcoes = {}) {
|
|
|
297
297
|
if (commit)
|
|
298
298
|
return { acao, item: id, reserva, commit, tentativas: tentativa };
|
|
299
299
|
}
|
|
300
|
-
throw new
|
|
300
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
|
|
301
301
|
}
|
|
302
302
|
/** `ork roadmap soltar`: devolve o item. Soltar a reserva de outra maquina exige `--forcar --motivo`. */
|
|
303
303
|
function soltarItem(raiz, item, opcoes = {}) {
|
|
@@ -307,7 +307,7 @@ function soltarItem(raiz, item, opcoes = {}) {
|
|
|
307
307
|
for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
|
|
308
308
|
const { ponta, atualizado } = buscar(raiz, remoto, opcoes.rede);
|
|
309
309
|
if (!atualizado)
|
|
310
|
-
throw new
|
|
310
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaSoltar(exports.BRANCH_DE_RESERVAS, remoto));
|
|
311
311
|
const todas = lerDaPonta(raiz, ponta);
|
|
312
312
|
const atual = todas.find((r) => r.item === id);
|
|
313
313
|
if (!atual)
|
|
@@ -318,7 +318,7 @@ function soltarItem(raiz, item, opcoes = {}) {
|
|
|
318
318
|
let motivo = '';
|
|
319
319
|
if (!ehMinha(atual, eu)) {
|
|
320
320
|
if (!opcoes.forcar)
|
|
321
|
-
throw new
|
|
321
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.reservadoAoSoltar(descrever(atual, m.reservas)));
|
|
322
322
|
motivo = `: ${exigirMotivo(opcoes)}`;
|
|
323
323
|
}
|
|
324
324
|
const restantes = todas.filter((r) => r.item !== id);
|
|
@@ -327,7 +327,7 @@ function soltarItem(raiz, item, opcoes = {}) {
|
|
|
327
327
|
if (commit)
|
|
328
328
|
return { acao: 'soltou', item: id, reserva: atual, commit, tentativas: tentativa };
|
|
329
329
|
}
|
|
330
|
-
throw new
|
|
330
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
|
|
331
331
|
}
|
|
332
332
|
function threadsLocais(raiz) {
|
|
333
333
|
const threads = [];
|
|
@@ -367,10 +367,12 @@ function soltarOrfa(raiz, orfa, origem, opcoes) {
|
|
|
367
367
|
// A reserva mudou de dono no meio (ou ja tinha saido): nada foi gravado e nada vai ao ledger como soltura.
|
|
368
368
|
if (r.acao === 'nada') {
|
|
369
369
|
return { item, thread, acao: 'intocada', para: null, commit: null,
|
|
370
|
-
detalhe:
|
|
370
|
+
detalhe: (0, locale_1.textoDoCatalogo)((m) => m.reservas.mudouDeDono(item)) };
|
|
371
371
|
}
|
|
372
372
|
const acao = orfa.sucessora ? 'reapontada' : 'solta';
|
|
373
|
-
|
|
373
|
+
// RM-061 (F3b, G4): o detalhe vai ao ledger e ao --json em pt-BR; a impressao o remonta.
|
|
374
|
+
const sucessora = orfa.sucessora;
|
|
375
|
+
const detalhe = (0, locale_1.textoDoCatalogo)((m) => sucessora ? m.reservas.passouPara(item, sucessora) : m.reservas.devolvido(item));
|
|
374
376
|
// Sugestao 3 do CHECK 2: a soltura ja foi ao remoto; erro so no registro nao a transforma em pendencia.
|
|
375
377
|
try {
|
|
376
378
|
(0, ledger_1.registrarSeExiste)((0, thread_1.dirThread)(raiz, thread), thread, ledger_1.TIPOS_DE_EVENTO.reservaLiberada, { item, acao, para: orfa.sucessora, commit: r.commit, origem, detalhe });
|
|
@@ -418,7 +420,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
|
|
|
418
420
|
return [pendenteDaThread(raiz, threadId, oItem, primeiraLinha(e))];
|
|
419
421
|
}
|
|
420
422
|
if (!painel.atualizado) {
|
|
421
|
-
return [pendenteDaThread(raiz, threadId, oItem,
|
|
423
|
+
return [pendenteDaThread(raiz, threadId, oItem, (0, locale_1.textoDoCatalogo)((m) => m.reservas.semLeituraPendente(exports.BRANCH_DE_RESERVAS, remoto)))];
|
|
422
424
|
}
|
|
423
425
|
const dela = painel.reservas.filter((r) => r.thread === threadId);
|
|
424
426
|
let orfas;
|
|
@@ -432,7 +434,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
|
|
|
432
434
|
const saida = [];
|
|
433
435
|
// Sugestao 1 do CHECK 1: toda reserva da thread, nao so a primeira; a de outra maquina fica pendente.
|
|
434
436
|
for (const r of dela.filter((x) => !orfas.some((o) => o.reserva.item === x.item))) {
|
|
435
|
-
saida.push(pendenteDaThread(raiz, threadId, r.item,
|
|
437
|
+
saida.push(pendenteDaThread(raiz, threadId, r.item, (0, locale_1.textoDoCatalogo)((m) => m.reservas.soQuemPegou(descrever(r, m.reservas)))));
|
|
436
438
|
}
|
|
437
439
|
for (const orfa of orfas) {
|
|
438
440
|
try {
|
|
@@ -451,7 +453,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
|
|
|
451
453
|
function soltarReservasOrfas(raiz, opcoes = {}) {
|
|
452
454
|
const painel = listarReservas(raiz, { remoto: opcoes.remoto, rede: opcoes.rede });
|
|
453
455
|
if (!painel.atualizado)
|
|
454
|
-
throw new
|
|
456
|
+
throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaOrfas(exports.BRANCH_DE_RESERVAS));
|
|
455
457
|
return reservasOrfas(raiz, painel.reservas, opcoes).map((orfa) => {
|
|
456
458
|
try {
|
|
457
459
|
return soltarOrfa(raiz, orfa, 'orfas', opcoes);
|
|
@@ -470,33 +472,31 @@ function leituraDasReservas(p, temRemoto) {
|
|
|
470
472
|
function textoDasReservas(p, orfas = [], lida = {}) {
|
|
471
473
|
const remoto = lida.remoto ?? exports.REMOTO_PADRAO;
|
|
472
474
|
const leitura = leituraDasReservas(p, lida.temRemoto !== false);
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
if (leitura === 'sem-copia')
|
|
478
|
-
return
|
|
479
|
-
}
|
|
475
|
+
// RM-061 (F3b): o painel no terminal pelo catalogo; item, pessoa, maquina, thread e nota sao dado.
|
|
476
|
+
const m = (0, locale_1.msg)().reservas;
|
|
477
|
+
if (leitura === 'sem-remoto')
|
|
478
|
+
return m.semRemoto(lida.projeto ?? null, remoto, exports.BRANCH_DE_RESERVAS);
|
|
479
|
+
if (leitura === 'sem-copia')
|
|
480
|
+
return m.semCopia(remoto, exports.BRANCH_DE_RESERVAS);
|
|
480
481
|
const linhas = [];
|
|
481
482
|
if (!p.atualizado)
|
|
482
|
-
linhas.push(
|
|
483
|
+
linhas.push(m.copiaLocal, '');
|
|
483
484
|
const feats = p.feats ?? [];
|
|
484
|
-
const numeros = feats.length === 0 ? [] : ['',
|
|
485
|
-
feats.slice(-5).map((f) => `${f.feat} (${f.thread ?? f.maquina})`).join(', ') + '. O próximo sai de: ork roadmap feat'];
|
|
485
|
+
const numeros = feats.length === 0 ? [] : ['', m.numerosDeFeat(feats.length, feats.slice(-5).map((f) => `${f.feat} (${f.thread ?? f.maquina})`).join(', '))];
|
|
486
486
|
if (p.reservas.length === 0) {
|
|
487
|
-
linhas.push(
|
|
487
|
+
linhas.push(m.nenhuma, ...numeros);
|
|
488
488
|
return linhas.join('\n');
|
|
489
489
|
}
|
|
490
|
-
linhas.push(
|
|
490
|
+
linhas.push(m.cabecalho);
|
|
491
491
|
const orfaDoItem = new Map(orfas.map((o) => [o.reserva.item, o]));
|
|
492
492
|
for (const r of p.reservas) {
|
|
493
493
|
const orfa = orfaDoItem.get(r.item);
|
|
494
|
-
const marca = orfa ?
|
|
494
|
+
const marca = orfa ? m.orfa(orfa.sucessora) : '';
|
|
495
495
|
linhas.push(`${r.item.padEnd(8)} ${r.por.slice(0, 19).padEnd(19)} ${r.maquina.slice(0, 15).padEnd(15)} ` +
|
|
496
496
|
`${(r.thread ?? '-').slice(0, 18).padEnd(18)} ${(0, horario_1.formatarDataHora)(r.desdeEm)}` + (r.nota ? ` ${r.nota}` : '') + marca);
|
|
497
497
|
}
|
|
498
498
|
if (orfas.length > 0)
|
|
499
|
-
linhas.push('',
|
|
499
|
+
linhas.push('', m.orfas(orfas.length));
|
|
500
500
|
linhas.push(...numeros, '', (0, horario_1.legendaDoFuso)());
|
|
501
501
|
return linhas.join('\n');
|
|
502
502
|
}
|
package/dist/runtime-ambiente.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ENV_THREAD_DO_DESPACHO = exports.ENV_IDENTIDADE_DE_DESPACHO = exports.ENVS_DE_PROVIDER_PAGO = void 0;
|
|
4
4
|
exports.nomesDeProviderAtivos = nomesDeProviderAtivos;
|
|
5
|
+
exports.sessaoDespachada = sessaoDespachada;
|
|
5
6
|
exports.ambienteDeAssinatura = ambienteDeAssinatura;
|
|
6
7
|
const hitl_public_receipt_1 = require("./hitl-public-receipt");
|
|
7
8
|
/**
|
|
@@ -27,6 +28,10 @@ function nomesDeProviderAtivos(base = process.env) {
|
|
|
27
28
|
*/
|
|
28
29
|
exports.ENV_IDENTIDADE_DE_DESPACHO = 'ORK_DISPATCH_ID';
|
|
29
30
|
exports.ENV_THREAD_DO_DESPACHO = 'ORK_DISPATCH_THREAD';
|
|
31
|
+
/** O processo roda numa sessao despachada pelo `ork`: a identidade ou a thread do despacho estao no ambiente. */
|
|
32
|
+
function sessaoDespachada(env = process.env) {
|
|
33
|
+
return (env[exports.ENV_IDENTIDADE_DE_DESPACHO] ?? '').trim() !== '' || (env[exports.ENV_THREAD_DO_DESPACHO] ?? '').trim() !== '';
|
|
34
|
+
}
|
|
30
35
|
/** Copia, sem alterar o ambiente em que as policies ainda precisam ser avaliadas. */
|
|
31
36
|
function ambienteDeAssinatura(base = process.env) {
|
|
32
37
|
const env = { ...base };
|
package/dist/runtime-context.js
CHANGED
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.novaIdentidadeDeDespacho = novaIdentidadeDeDespacho;
|
|
37
|
+
exports.capacidadeDoRuntimeNoProjeto = capacidadeDoRuntimeNoProjeto;
|
|
37
38
|
exports.contextoDoProjeto = contextoDoProjeto;
|
|
38
39
|
exports.validarContextoRuntime = validarContextoRuntime;
|
|
39
40
|
exports.lerDeclaracaoDeMod = lerDeclaracaoDeMod;
|
|
@@ -49,6 +50,7 @@ const hosts_1 = require("./hosts");
|
|
|
49
50
|
const worktree_1 = require("./worktree");
|
|
50
51
|
const mcp_install_1 = require("./mcp-install");
|
|
51
52
|
const mcp_grafo_1 = require("./mcp-grafo");
|
|
53
|
+
const mcp_transportes_1 = require("./mcp-transportes");
|
|
52
54
|
const hitl_public_receipt_1 = require("./hitl-public-receipt");
|
|
53
55
|
/** Correlação interna; nenhuma identidade de despacho concede poder de gate. */
|
|
54
56
|
function novaIdentidadeDeDespacho(threadId, fase) {
|
|
@@ -108,7 +110,7 @@ function preparado(raiz) {
|
|
|
108
110
|
}
|
|
109
111
|
if (JSON.stringify(argv) !== JSON.stringify(legado)) {
|
|
110
112
|
if (!Array.isArray(argv) || argv.length !== padrao.args.length ||
|
|
111
|
-
argv[argv.length - 2] !== '--ship-transport' || !
|
|
113
|
+
argv[argv.length - 2] !== '--ship-transport' || !(0, mcp_transportes_1.ehTransporteShipMcp)(argv[argv.length - 1]))
|
|
112
114
|
throw Error('runtime.context.conflict: MCP Orkastery divergente; transporte invalido ou argumentos extras');
|
|
113
115
|
transporte = argv[argv.length - 1];
|
|
114
116
|
}
|
|
@@ -133,17 +135,78 @@ function raizCanonica(projeto) {
|
|
|
133
135
|
dentro(raiz, path.join(raiz, '.orkastery'));
|
|
134
136
|
return raiz;
|
|
135
137
|
}
|
|
138
|
+
function hostDoRuntime(runtime) {
|
|
139
|
+
if (runtime === 'claude-bg')
|
|
140
|
+
return 'claude-code';
|
|
141
|
+
if (runtime === 'codex')
|
|
142
|
+
return 'codex';
|
|
143
|
+
throw Error('runtime.context.invalid: runtime desconhecido');
|
|
144
|
+
}
|
|
145
|
+
/** Confere o recibo e todos os bytes do adaptador antes de considerar o runtime um destino. */
|
|
146
|
+
function conferirInstalacaoDoHost(raiz, host) {
|
|
147
|
+
const def = hosts_1.HOSTS[host];
|
|
148
|
+
const instalacao = path.join(raiz, def.destinoPadrao, def.subdir ?? '');
|
|
149
|
+
let recibo;
|
|
150
|
+
try {
|
|
151
|
+
recibo = objeto(JSON.parse(ler(raiz, path.join(instalacao, 'INSTALADO.json'), 1048576).toString('utf8')));
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
throw Error('runtime.context.installation: instale/verifique o adaptador do runtime neste projeto');
|
|
155
|
+
}
|
|
156
|
+
if (recibo.contrato !== 'ork.adapter-install/v1' || recibo.host !== host || !Array.isArray(recibo.arquivos) || recibo.arquivos.length > 512)
|
|
157
|
+
throw Error('runtime.context.installation: recibo instalado invalido');
|
|
158
|
+
const arquivos = new Map();
|
|
159
|
+
// RM-059 (T0.7): os bytes ja conferidos da declaracao e do manifesto de cada mod, lidos uma vez so.
|
|
160
|
+
const conferidos = new Map();
|
|
161
|
+
for (const item of recibo.arquivos) {
|
|
162
|
+
const a = objeto(item);
|
|
163
|
+
if (typeof a.arquivo !== 'string' || path.isAbsolute(a.arquivo) || a.arquivo.split(/[\\/]/).includes('..') ||
|
|
164
|
+
typeof a.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(a.sha256) || arquivos.has(a.arquivo))
|
|
165
|
+
throw Error('runtime.context.installation: arquivo do recibo invalido');
|
|
166
|
+
const file = path.join(instalacao, a.arquivo);
|
|
167
|
+
if (!dentro(raiz, file).startsWith(instalacao + path.sep))
|
|
168
|
+
throw Error('runtime.context.installation: bytes instalados divergentes');
|
|
169
|
+
const bytes = ler(raiz, file, 1048576);
|
|
170
|
+
if ((0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex') !== a.sha256)
|
|
171
|
+
throw Error('runtime.context.installation: bytes instalados divergentes');
|
|
172
|
+
arquivos.set(a.arquivo, file);
|
|
173
|
+
if (DECLARACAO_OU_MANIFESTO_DE_MOD.test(a.arquivo))
|
|
174
|
+
conferidos.set(a.arquivo, bytes);
|
|
175
|
+
}
|
|
176
|
+
const bootstrap = arquivos.get('skills/core/orkastery-bootstrap/SKILL.md');
|
|
177
|
+
if (!bootstrap || (host === 'claude-code' && !arquivos.has('.claude-plugin/plugin.json')))
|
|
178
|
+
throw Error('runtime.context.installation: catalogo ou plugin incompleto');
|
|
179
|
+
return { instalacao, arquivos, conferidos, bootstrap };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Um projeto preparado so pode escolher runtimes cujo adaptador esteja instalado e integro.
|
|
183
|
+
* Projeto legado, sem entrada MCP do Orkastery, conserva a selecao anterior.
|
|
184
|
+
*/
|
|
185
|
+
function capacidadeDoRuntimeNoProjeto(projeto, runtime) {
|
|
186
|
+
let host = null;
|
|
187
|
+
try {
|
|
188
|
+
const raiz = raizCanonica(projeto);
|
|
189
|
+
const perfil = preparado(raiz);
|
|
190
|
+
if (!perfil)
|
|
191
|
+
return { runtime, host: null, preparado: false, capaz: true, motivo: null };
|
|
192
|
+
host = hostDoRuntime(runtime);
|
|
193
|
+
conferirInstalacaoDoHost(raiz, host);
|
|
194
|
+
return { runtime, host, preparado: true, capaz: true, motivo: null };
|
|
195
|
+
}
|
|
196
|
+
catch (erro) {
|
|
197
|
+
return { runtime, host, preparado: true, capaz: false, motivo: erro.message };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
136
200
|
/** Projeto sem entrada MCP Orkastery continua com o contrato legado. Nao instala nem altera arquivos. */
|
|
137
201
|
function contextoDoProjeto(projeto, runtime, cwd, threadId) {
|
|
138
202
|
const raiz = raizCanonica(projeto);
|
|
139
203
|
const perfil = preparado(raiz);
|
|
140
204
|
if (!perfil)
|
|
141
205
|
return undefined;
|
|
142
|
-
|
|
143
|
-
throw Error('runtime.context.invalid: runtime desconhecido');
|
|
206
|
+
const host = hostDoRuntime(runtime);
|
|
144
207
|
if (!threadId)
|
|
145
208
|
throw Error('runtime.context.invalid: thread obrigatoria para sessao filha');
|
|
146
|
-
const contexto = { projeto: raiz, host
|
|
209
|
+
const contexto = { projeto: raiz, host, threadId, transporteShip: perfil.transporteShip, permissoesFilho: perfil.permissoesFilho };
|
|
147
210
|
validarContextoRuntime(contexto, cwd);
|
|
148
211
|
return contexto;
|
|
149
212
|
}
|
|
@@ -151,7 +214,7 @@ function contextoDoProjeto(projeto, runtime, cwd, threadId) {
|
|
|
151
214
|
function validarContextoRuntime(contexto, cwd) {
|
|
152
215
|
if (!contexto || !['claude-code', 'codex'].includes(contexto.host))
|
|
153
216
|
throw Error('runtime.context.invalid: host desconhecido');
|
|
154
|
-
if (contexto.transporteShip !== undefined && !
|
|
217
|
+
if (contexto.transporteShip !== undefined && !(0, mcp_transportes_1.ehTransporteShipMcp)(contexto.transporteShip))
|
|
155
218
|
throw Error('runtime.context.invalid: transporte desconhecido');
|
|
156
219
|
const raiz = raizCanonica(contexto.projeto);
|
|
157
220
|
if (contexto.permissoesFilho !== undefined && !['interactive', 'worktree'].includes(contexto.permissoesFilho))
|
|
@@ -183,38 +246,7 @@ function validarContextoRuntime(contexto, cwd) {
|
|
|
183
246
|
if (!(0, worktree_1.worktreesDoGit)(raiz).some(w => w.dir === cwd && w.branch === (0, worktree_1.branchDaWorktree)(thread)))
|
|
184
247
|
throw Error('runtime.context.worktree: worktree nao registrada na branch da thread');
|
|
185
248
|
}
|
|
186
|
-
const
|
|
187
|
-
const instalacao = path.join(raiz, def.destinoPadrao, def.subdir ?? '');
|
|
188
|
-
let recibo;
|
|
189
|
-
try {
|
|
190
|
-
recibo = objeto(JSON.parse(ler(raiz, path.join(instalacao, 'INSTALADO.json'), 1048576).toString('utf8')));
|
|
191
|
-
}
|
|
192
|
-
catch {
|
|
193
|
-
throw Error('runtime.context.installation: instale/verifique o adaptador do runtime neste projeto');
|
|
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');
|
|
249
|
+
const { instalacao, arquivos, conferidos, bootstrap } = conferirInstalacaoDoHost(raiz, contexto.host);
|
|
218
250
|
const modsDeFase = contexto.host === 'claude-code' ? modsDeFaseInstalados(raiz, instalacao, arquivos, conferidos) : [];
|
|
219
251
|
// Capacidade derivada do bloco atual, nunca aceita como entrada do modelo.
|
|
220
252
|
const permiteEditarProduto = permissoesFilho === 'worktree' && (0, thread_1.blocoDaThread)(thread, thread.faseAtual).fases.includes('GO');
|
|
@@ -279,14 +311,52 @@ function dependenciasDoManifesto(texto) {
|
|
|
279
311
|
return typeof nome === 'string' && nome ? [nome.split('@')[0]] : [];
|
|
280
312
|
});
|
|
281
313
|
}
|
|
282
|
-
/** Os
|
|
283
|
-
function
|
|
284
|
-
|
|
314
|
+
/** Os arquivos comuns que o proprio Claude Code escreve na pasta do mod que ele carrega: declaracoes, nunca codigo. */
|
|
315
|
+
function arquivoDoMotor(raiz, arquivo, relativo) {
|
|
316
|
+
if (relativo === '.claude-plugin/types/.gitignore')
|
|
317
|
+
return true;
|
|
318
|
+
if (relativo.startsWith('.claude-plugin/types/') &&
|
|
319
|
+
(relativo.endsWith('.d.ts') || path.posix.basename(relativo) === 'tsconfig.json'))
|
|
320
|
+
return true;
|
|
321
|
+
if (relativo !== 'tsconfig.json')
|
|
322
|
+
return false;
|
|
323
|
+
try {
|
|
324
|
+
const config = objeto(JSON.parse(ler(raiz, arquivo, 4096).toString('utf8')));
|
|
325
|
+
return Object.keys(config).length === 1 && config.extends === './.claude-plugin/types/tsconfig.json';
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/** Link de tipos gerado pelo Claude Code: o alvo real continua preso a um .d.ts comprovado pelo recibo. */
|
|
332
|
+
function linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos) {
|
|
333
|
+
if (!relativo.startsWith('.claude-plugin/types/') || !relativo.endsWith('.d.ts'))
|
|
334
|
+
return false;
|
|
335
|
+
let alvo;
|
|
336
|
+
try {
|
|
337
|
+
alvo = fs.realpathSync(arquivo);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
const relativoAoRecibo = path.relative(instalacao, alvo).split(path.sep).join('/');
|
|
343
|
+
if (!/^mods\/[^/]+\/types\/[^/]+\.d\.ts$/.test(relativoAoRecibo))
|
|
344
|
+
return false;
|
|
345
|
+
const comprovado = arquivos.get(relativoAoRecibo);
|
|
346
|
+
if (!comprovado)
|
|
347
|
+
return false;
|
|
348
|
+
try {
|
|
349
|
+
return fs.realpathSync(comprovado) === alvo && fs.statSync(alvo).isFile();
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
285
354
|
}
|
|
286
355
|
/**
|
|
287
356
|
* RM-059 (T0.7, D1): a pasta instalada de um mod de fase tem exatamente os arquivos do recibo. O
|
|
288
357
|
* `--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.
|
|
358
|
+
* fora do recibo entraria na sessao de fase sem prova. So o link de tipos gerado pelo motor conserva
|
|
359
|
+
* a prova pelo alvo real; outro link e arquivo especial recusam sempre.
|
|
290
360
|
*/
|
|
291
361
|
function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
|
|
292
362
|
const dir = path.join(instalacao, 'mods', nome);
|
|
@@ -296,15 +366,19 @@ function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
|
|
|
296
366
|
const visitar = (atual, prefixo) => {
|
|
297
367
|
for (const entrada of fs.readdirSync(atual, { withFileTypes: true })) {
|
|
298
368
|
const relativo = prefixo ? `${prefixo}/${entrada.name}` : entrada.name;
|
|
299
|
-
|
|
369
|
+
const arquivo = path.join(atual, entrada.name);
|
|
370
|
+
if (entrada.isSymbolicLink()) {
|
|
371
|
+
if (linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos))
|
|
372
|
+
continue;
|
|
300
373
|
throw recusa(`link em ${relativo}`);
|
|
374
|
+
}
|
|
301
375
|
if (entrada.isDirectory()) {
|
|
302
376
|
visitar(path.join(atual, entrada.name), relativo);
|
|
303
377
|
continue;
|
|
304
378
|
}
|
|
305
379
|
if (!entrada.isFile())
|
|
306
380
|
throw recusa(`arquivo especial em ${relativo}`);
|
|
307
|
-
if (!arquivos.has(`mods/${nome}/${relativo}`) && !
|
|
381
|
+
if (!arquivos.has(`mods/${nome}/${relativo}`) && !arquivoDoMotor(raiz, arquivo, relativo)) {
|
|
308
382
|
throw recusa(`arquivo fora do INSTALADO.json (${relativo})`, 'se ele saiu do catalogo, ork adapter install claude-code o tira da copia; ' +
|
|
309
383
|
`se foi editado ou acrescentado a mao, apague ${path.join(dir, relativo)}`);
|
|
310
384
|
}
|