@orkastery/cli 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
- package/adapters/openclaw/README.md +83 -10
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +53 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +188 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/runtime-context.js
CHANGED
|
@@ -34,8 +34,11 @@ 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;
|
|
40
|
+
exports.lerDeclaracaoDeMod = lerDeclaracaoDeMod;
|
|
41
|
+
exports.modsDeFaseInstalados = modsDeFaseInstalados;
|
|
39
42
|
/** Contexto interno opt-in: configuracao M4 existente + catalogo instalado, nunca args do modelo. */
|
|
40
43
|
const fs = __importStar(require("node:fs"));
|
|
41
44
|
const path = __importStar(require("node:path"));
|
|
@@ -47,6 +50,7 @@ const hosts_1 = require("./hosts");
|
|
|
47
50
|
const worktree_1 = require("./worktree");
|
|
48
51
|
const mcp_install_1 = require("./mcp-install");
|
|
49
52
|
const mcp_grafo_1 = require("./mcp-grafo");
|
|
53
|
+
const mcp_transportes_1 = require("./mcp-transportes");
|
|
50
54
|
const hitl_public_receipt_1 = require("./hitl-public-receipt");
|
|
51
55
|
/** Correlação interna; nenhuma identidade de despacho concede poder de gate. */
|
|
52
56
|
function novaIdentidadeDeDespacho(threadId, fase) {
|
|
@@ -106,7 +110,7 @@ function preparado(raiz) {
|
|
|
106
110
|
}
|
|
107
111
|
if (JSON.stringify(argv) !== JSON.stringify(legado)) {
|
|
108
112
|
if (!Array.isArray(argv) || argv.length !== padrao.args.length ||
|
|
109
|
-
argv[argv.length - 2] !== '--ship-transport' || !
|
|
113
|
+
argv[argv.length - 2] !== '--ship-transport' || !(0, mcp_transportes_1.ehTransporteShipMcp)(argv[argv.length - 1]))
|
|
110
114
|
throw Error('runtime.context.conflict: MCP Orkastery divergente; transporte invalido ou argumentos extras');
|
|
111
115
|
transporte = argv[argv.length - 1];
|
|
112
116
|
}
|
|
@@ -131,17 +135,78 @@ function raizCanonica(projeto) {
|
|
|
131
135
|
dentro(raiz, path.join(raiz, '.orkastery'));
|
|
132
136
|
return raiz;
|
|
133
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
|
+
}
|
|
134
200
|
/** Projeto sem entrada MCP Orkastery continua com o contrato legado. Nao instala nem altera arquivos. */
|
|
135
201
|
function contextoDoProjeto(projeto, runtime, cwd, threadId) {
|
|
136
202
|
const raiz = raizCanonica(projeto);
|
|
137
203
|
const perfil = preparado(raiz);
|
|
138
204
|
if (!perfil)
|
|
139
205
|
return undefined;
|
|
140
|
-
|
|
141
|
-
throw Error('runtime.context.invalid: runtime desconhecido');
|
|
206
|
+
const host = hostDoRuntime(runtime);
|
|
142
207
|
if (!threadId)
|
|
143
208
|
throw Error('runtime.context.invalid: thread obrigatoria para sessao filha');
|
|
144
|
-
const contexto = { projeto: raiz, host
|
|
209
|
+
const contexto = { projeto: raiz, host, threadId, transporteShip: perfil.transporteShip, permissoesFilho: perfil.permissoesFilho };
|
|
145
210
|
validarContextoRuntime(contexto, cwd);
|
|
146
211
|
return contexto;
|
|
147
212
|
}
|
|
@@ -149,7 +214,7 @@ function contextoDoProjeto(projeto, runtime, cwd, threadId) {
|
|
|
149
214
|
function validarContextoRuntime(contexto, cwd) {
|
|
150
215
|
if (!contexto || !['claude-code', 'codex'].includes(contexto.host))
|
|
151
216
|
throw Error('runtime.context.invalid: host desconhecido');
|
|
152
|
-
if (contexto.transporteShip !== undefined && !
|
|
217
|
+
if (contexto.transporteShip !== undefined && !(0, mcp_transportes_1.ehTransporteShipMcp)(contexto.transporteShip))
|
|
153
218
|
throw Error('runtime.context.invalid: transporte desconhecido');
|
|
154
219
|
const raiz = raizCanonica(contexto.projeto);
|
|
155
220
|
if (contexto.permissoesFilho !== undefined && !['interactive', 'worktree'].includes(contexto.permissoesFilho))
|
|
@@ -181,39 +246,226 @@ function validarContextoRuntime(contexto, cwd) {
|
|
|
181
246
|
if (!(0, worktree_1.worktreesDoGit)(raiz).some(w => w.dir === cwd && w.branch === (0, worktree_1.branchDaWorktree)(thread)))
|
|
182
247
|
throw Error('runtime.context.worktree: worktree nao registrada na branch da thread');
|
|
183
248
|
}
|
|
184
|
-
const
|
|
185
|
-
const
|
|
186
|
-
let recibo;
|
|
187
|
-
try {
|
|
188
|
-
recibo = objeto(JSON.parse(ler(raiz, path.join(instalacao, 'INSTALADO.json'), 1048576).toString('utf8')));
|
|
189
|
-
}
|
|
190
|
-
catch {
|
|
191
|
-
throw Error('runtime.context.installation: instale/verifique o adaptador do runtime neste projeto');
|
|
192
|
-
}
|
|
193
|
-
if (recibo.contrato !== 'ork.adapter-install/v1' || recibo.host !== contexto.host || !Array.isArray(recibo.arquivos) || recibo.arquivos.length > 512)
|
|
194
|
-
throw Error('runtime.context.installation: recibo instalado invalido');
|
|
195
|
-
const arquivos = new Map();
|
|
196
|
-
for (const item of recibo.arquivos) {
|
|
197
|
-
const a = objeto(item);
|
|
198
|
-
if (typeof a.arquivo !== 'string' || path.isAbsolute(a.arquivo) || a.arquivo.split(/[\\/]/).includes('..') ||
|
|
199
|
-
typeof a.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(a.sha256) || arquivos.has(a.arquivo))
|
|
200
|
-
throw Error('runtime.context.installation: arquivo do recibo invalido');
|
|
201
|
-
const file = path.join(instalacao, a.arquivo);
|
|
202
|
-
if (!dentro(raiz, file).startsWith(instalacao + path.sep) || (0, node_crypto_1.createHash)('sha256').update(ler(raiz, file, 1048576)).digest('hex') !== a.sha256)
|
|
203
|
-
throw Error('runtime.context.installation: bytes instalados divergentes');
|
|
204
|
-
arquivos.set(a.arquivo, file);
|
|
205
|
-
}
|
|
206
|
-
const bootstrap = arquivos.get('skills/core/orkastery-bootstrap/SKILL.md');
|
|
207
|
-
if (!bootstrap || (contexto.host === 'claude-code' && !arquivos.has('.claude-plugin/plugin.json')))
|
|
208
|
-
throw Error('runtime.context.installation: catalogo ou plugin incompleto');
|
|
249
|
+
const { instalacao, arquivos, conferidos, bootstrap } = conferirInstalacaoDoHost(raiz, contexto.host);
|
|
250
|
+
const modsDeFase = contexto.host === 'claude-code' ? modsDeFaseInstalados(raiz, instalacao, arquivos, conferidos) : [];
|
|
209
251
|
// Capacidade derivada do bloco atual, nunca aceita como entrada do modelo.
|
|
210
252
|
const permiteEditarProduto = permissoesFilho === 'worktree' && (0, thread_1.blocoDaThread)(thread, thread.faseAtual).fases.includes('GO');
|
|
211
253
|
// RM-031 KG5 (D2, D7): as tools do grafo seguem a flag do manifesto da raiz, que o servidor do filho tambem le;
|
|
212
254
|
// o manifesto da worktree da thread e o pedido do modelo nao ligam nada.
|
|
213
|
-
const
|
|
255
|
+
const manifestoDaRaiz = (0, manifest_1.exigirManifesto)(raiz).manifesto;
|
|
256
|
+
const grafoMcp = (0, mcp_grafo_1.grafoLigado)(manifestoDaRaiz);
|
|
257
|
+
// RM-059 (T10.4, D11 da thread ork-rm059portao): os tetos do piloto de agent teams so vao ao despacho do Claude Code
|
|
258
|
+
// quando o bloco da fase atual tem o GO, a mesma regra da edicao de produto; o manifesto da raiz decide, nunca o
|
|
259
|
+
// pedido do modelo. Quem liga de fato e o `montarComando`, e so com o Portao de Tarefas na sessao.
|
|
260
|
+
const tetos = contexto.host === 'claude-code' ? manifestoDaRaiz.runtime.agent_teams : undefined;
|
|
261
|
+
const agentTeams = tetos && (0, thread_1.blocoDaThread)(thread, thread.faseAtual).fases.includes('GO') ? { ...tetos } : null;
|
|
214
262
|
const publicVerifiers = (0, hitl_public_receipt_1.publicHitlVerifiers)();
|
|
215
263
|
const servidor = { ...(0, mcp_install_1.configuracaoServidorMcp)(raiz, contexto.host, contexto.threadId, transporteShip, permissoesFilho, contexto.identidade?.dispatchId),
|
|
216
264
|
...(publicVerifiers ? { env: { [hitl_public_receipt_1.ENV_HITL_VERIFIERS]: publicVerifiers } } : {}),
|
|
217
265
|
...(contexto.host === 'codex' && permissoesFilho === 'worktree' ? (0, mcp_install_1.politicasFilhoCodex)(perfil.politicasCodex ?? {}) : {}) };
|
|
218
|
-
return { projeto: raiz, instalacao, bootstrap, permissoesFilho, permiteEditarProduto, grafoMcp, servidor };
|
|
266
|
+
return { projeto: raiz, instalacao, bootstrap, permissoesFilho, permiteEditarProduto, grafoMcp, servidor, modsDeFase, agentTeams };
|
|
267
|
+
}
|
|
268
|
+
const DECLARACAO_OU_MANIFESTO_DE_MOD = /^mods\/[^/]+\/(?:orkastery-mod\.json|\.claude-plugin\/plugin\.json)$/;
|
|
269
|
+
const DECLARACAO_DE_MOD = /^mods\/([^/]+)\/orkastery-mod\.json$/;
|
|
270
|
+
const NOME_DE_MOD = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
|
|
271
|
+
/** A declaracao de papel de um mod; o erro diz o que esta fora da convencao. */
|
|
272
|
+
function lerDeclaracaoDeMod(texto) {
|
|
273
|
+
let bruto;
|
|
274
|
+
try {
|
|
275
|
+
bruto = JSON.parse(texto);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
throw Error('orkastery-mod.json nao e JSON');
|
|
279
|
+
}
|
|
280
|
+
if (!bruto || typeof bruto !== 'object' || Array.isArray(bruto))
|
|
281
|
+
throw Error('orkastery-mod.json precisa ser objeto');
|
|
282
|
+
const d = bruto;
|
|
283
|
+
if (d.formato !== 'ork.mod/v1')
|
|
284
|
+
throw Error('orkastery-mod.json com formato diferente de ork.mod/v1');
|
|
285
|
+
const papeis = d.papeis;
|
|
286
|
+
if (!Array.isArray(papeis) || papeis.length === 0 || papeis.some((p) => p !== 'dono' && p !== 'fase') ||
|
|
287
|
+
new Set(papeis).size !== papeis.length)
|
|
288
|
+
throw Error('orkastery-mod.json com papeis fora de dono e fase, vazios ou repetidos');
|
|
289
|
+
if (typeof d.claudeCodeMinimo !== 'string' || !/^\d+\.\d+\.\d+$/.test(d.claudeCodeMinimo))
|
|
290
|
+
throw Error('orkastery-mod.json com claudeCodeMinimo fora do formato X.Y.Z');
|
|
291
|
+
return { formato: 'ork.mod/v1', papeis: papeis, claudeCodeMinimo: d.claudeCodeMinimo };
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* RM-059 (T0.7, D3): os nomes que o `dependencies` do `plugin.json` de um mod cita, em melhor esforco:
|
|
295
|
+
* lista de nomes (com ou sem `@marketplace`), objeto com os nomes nas chaves, ou lista de objetos com `name`.
|
|
296
|
+
*/
|
|
297
|
+
function dependenciasDoManifesto(texto) {
|
|
298
|
+
let manifesto;
|
|
299
|
+
try {
|
|
300
|
+
manifesto = JSON.parse(texto);
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
throw Error('.claude-plugin/plugin.json nao e JSON');
|
|
304
|
+
}
|
|
305
|
+
if (!manifesto || typeof manifesto !== 'object' || Array.isArray(manifesto))
|
|
306
|
+
throw Error('.claude-plugin/plugin.json precisa ser objeto');
|
|
307
|
+
const deps = manifesto.dependencies;
|
|
308
|
+
const itens = Array.isArray(deps) ? deps : deps && typeof deps === 'object' ? Object.keys(deps) : [];
|
|
309
|
+
return itens.flatMap((item) => {
|
|
310
|
+
const nome = typeof item === 'string' ? item : item && typeof item === 'object' ? item.name : undefined;
|
|
311
|
+
return typeof nome === 'string' && nome ? [nome.split('@')[0]] : [];
|
|
312
|
+
});
|
|
313
|
+
}
|
|
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
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* RM-059 (T0.7, D1): a pasta instalada de um mod de fase tem exatamente os arquivos do recibo. O
|
|
357
|
+
* `--plugin-dir` carrega o que estiver nela (comandos, agentes e skills sao descobertos), entao arquivo
|
|
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.
|
|
360
|
+
*/
|
|
361
|
+
function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
|
|
362
|
+
const dir = path.join(instalacao, 'mods', nome);
|
|
363
|
+
const recusa = (motivo, correcao = 'reinstale com ork adapter install claude-code') => Error(`runtime.context.installation: mod ${nome}: ${motivo}; ${correcao}`);
|
|
364
|
+
if (!fs.lstatSync(dir, { throwIfNoEntry: false })?.isDirectory() || dentro(raiz, dir) !== dir)
|
|
365
|
+
throw recusa('pasta instalada ausente ou fora da instalacao');
|
|
366
|
+
const visitar = (atual, prefixo) => {
|
|
367
|
+
for (const entrada of fs.readdirSync(atual, { withFileTypes: true })) {
|
|
368
|
+
const relativo = prefixo ? `${prefixo}/${entrada.name}` : entrada.name;
|
|
369
|
+
const arquivo = path.join(atual, entrada.name);
|
|
370
|
+
if (entrada.isSymbolicLink()) {
|
|
371
|
+
if (linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos))
|
|
372
|
+
continue;
|
|
373
|
+
throw recusa(`link em ${relativo}`);
|
|
374
|
+
}
|
|
375
|
+
if (entrada.isDirectory()) {
|
|
376
|
+
visitar(path.join(atual, entrada.name), relativo);
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (!entrada.isFile())
|
|
380
|
+
throw recusa(`arquivo especial em ${relativo}`);
|
|
381
|
+
if (!arquivos.has(`mods/${nome}/${relativo}`) && !arquivoDoMotor(raiz, arquivo, relativo)) {
|
|
382
|
+
throw recusa(`arquivo fora do INSTALADO.json (${relativo})`, 'se ele saiu do catalogo, ork adapter install claude-code o tira da copia; ' +
|
|
383
|
+
`se foi editado ou acrescentado a mao, apague ${path.join(dir, relativo)}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
visitar(dir, '');
|
|
388
|
+
return dir;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* RM-059 (rodada 2 do CHECK, N2): o arquivo comum da raiz de `mods/` tambem so vale com prova. A ponte le a lista
|
|
392
|
+
* de autoridade em `../autoridade.json` antes da propria pasta, entao uma copia velha ou escrita a mao ali mudaria o
|
|
393
|
+
* que a sessao de fase aceita. Com mod de fase no despacho, todo arquivo direto em `mods/` esta no recibo (que ja
|
|
394
|
+
* conferiu os bytes); link e arquivo especial recusam. Pastas sao os mods, conferidos um a um.
|
|
395
|
+
*/
|
|
396
|
+
function conferirRaizDosMods(raiz, instalacao, arquivos) {
|
|
397
|
+
const dir = path.join(instalacao, 'mods');
|
|
398
|
+
const recusa = (motivo, correcao = 'reinstale com ork adapter install claude-code') => Error(`runtime.context.installation: mods/: ${motivo}; ${correcao}`);
|
|
399
|
+
if (!fs.lstatSync(dir, { throwIfNoEntry: false })?.isDirectory() || dentro(raiz, dir) !== dir)
|
|
400
|
+
throw recusa('pasta instalada ausente ou fora da instalacao');
|
|
401
|
+
for (const entrada of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
402
|
+
if (entrada.isSymbolicLink())
|
|
403
|
+
throw recusa(`link em ${entrada.name}`);
|
|
404
|
+
if (entrada.isDirectory())
|
|
405
|
+
continue;
|
|
406
|
+
if (!entrada.isFile())
|
|
407
|
+
throw recusa(`arquivo especial em ${entrada.name}`);
|
|
408
|
+
if (!arquivos.has(`mods/${entrada.name}`)) {
|
|
409
|
+
throw recusa(`arquivo fora do INSTALADO.json (${entrada.name})`, 'se ele saiu do catalogo, ork adapter install claude-code o tira da copia; ' +
|
|
410
|
+
`se foi editado ou acrescentado a mao, apague ${path.join(dir, entrada.name)}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* RM-059 (T0.7): os mods de papel `fase` da instalacao, lidos do recibo ja conferido e na ordem da D3:
|
|
416
|
+
* a dependencia antes de quem depende, depois o nome. Declaracao ou manifesto invalidos recusam como
|
|
417
|
+
* um byte divergente (D2): e instalacao corrompida, e o CI do catalogo ja reprova esse caso.
|
|
418
|
+
*/
|
|
419
|
+
function modsDeFaseInstalados(raiz, instalacao, arquivos, conferidos) {
|
|
420
|
+
const achados = [];
|
|
421
|
+
const nomes = [...arquivos.keys()].flatMap((arquivo) => DECLARACAO_DE_MOD.exec(arquivo)?.[1] ?? []).sort();
|
|
422
|
+
const daInstalacao = new Set(nomes);
|
|
423
|
+
for (const nome of nomes) {
|
|
424
|
+
const arquivo = `mods/${nome}/orkastery-mod.json`;
|
|
425
|
+
const recusa = (motivo) => Error(`runtime.context.installation: mod ${nome}: ${motivo}; reinstale com ork adapter install claude-code`);
|
|
426
|
+
if (!NOME_DE_MOD.test(nome))
|
|
427
|
+
throw recusa('nome fora de letras minusculas, digitos e hifen');
|
|
428
|
+
let declaracao;
|
|
429
|
+
try {
|
|
430
|
+
declaracao = lerDeclaracaoDeMod(conferidos.get(arquivo).toString('utf8'));
|
|
431
|
+
}
|
|
432
|
+
catch (e) {
|
|
433
|
+
throw recusa(e.message);
|
|
434
|
+
}
|
|
435
|
+
if (!declaracao.papeis.includes('fase'))
|
|
436
|
+
continue;
|
|
437
|
+
const manifesto = conferidos.get(`mods/${nome}/.claude-plugin/plugin.json`);
|
|
438
|
+
if (!manifesto)
|
|
439
|
+
throw recusa('.claude-plugin/plugin.json fora do recibo');
|
|
440
|
+
let dependencias;
|
|
441
|
+
try {
|
|
442
|
+
dependencias = dependenciasDoManifesto(manifesto.toString('utf8')).filter((d) => daInstalacao.has(d) && d !== nome);
|
|
443
|
+
}
|
|
444
|
+
catch (e) {
|
|
445
|
+
throw recusa(e.message);
|
|
446
|
+
}
|
|
447
|
+
achados.push({ nome, dir: conferirPastaDoMod(raiz, instalacao, nome, arquivos), claudeCodeMinimo: declaracao.claudeCodeMinimo, dependencias });
|
|
448
|
+
}
|
|
449
|
+
if (achados.length)
|
|
450
|
+
conferirRaizDosMods(raiz, instalacao, arquivos);
|
|
451
|
+
const porNome = new Map(achados.map((m) => [m.nome, m]));
|
|
452
|
+
const ordem = [];
|
|
453
|
+
const feitos = new Set(), abertos = new Set();
|
|
454
|
+
// Busca em profundidade: a dependencia sai antes; num ciclo, a aresta de volta e ignorada (melhor esforco).
|
|
455
|
+
const visitar = (m) => {
|
|
456
|
+
if (feitos.has(m.nome) || abertos.has(m.nome))
|
|
457
|
+
return;
|
|
458
|
+
abertos.add(m.nome);
|
|
459
|
+
for (const dep of [...m.dependencias].sort()) {
|
|
460
|
+
const alvo = porNome.get(dep);
|
|
461
|
+
if (alvo)
|
|
462
|
+
visitar(alvo);
|
|
463
|
+
}
|
|
464
|
+
abertos.delete(m.nome);
|
|
465
|
+
feitos.add(m.nome);
|
|
466
|
+
ordem.push(m);
|
|
467
|
+
};
|
|
468
|
+
for (const m of achados)
|
|
469
|
+
visitar(m);
|
|
470
|
+
return ordem;
|
|
219
471
|
}
|