@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/horario.js
CHANGED
|
@@ -22,6 +22,7 @@ exports.definirFusoDoDono = definirFusoDoDono;
|
|
|
22
22
|
exports.fusoDoDono = fusoDoDono;
|
|
23
23
|
exports.partesLocais = partesLocais;
|
|
24
24
|
exports.dataLocal = dataLocal;
|
|
25
|
+
exports.isoComFuso = isoComFuso;
|
|
25
26
|
exports.instanteNoFuso = instanteNoFuso;
|
|
26
27
|
exports.duracaoCurta = duracaoCurta;
|
|
27
28
|
exports.duracaoRelativa = duracaoRelativa;
|
|
@@ -34,6 +35,7 @@ exports.formatarPrazo = formatarPrazo;
|
|
|
34
35
|
exports.formatarDesde = formatarDesde;
|
|
35
36
|
exports.localizarTexto = localizarTexto;
|
|
36
37
|
exports.localizarTextoRotulado = localizarTextoRotulado;
|
|
38
|
+
const locale_1 = require("./locale");
|
|
37
39
|
exports.CHAVE_DO_FUSO = 'owner.timezone';
|
|
38
40
|
/** Único fuso com nome próprio no rótulo; exemplo da documentação e do `ork init`. */
|
|
39
41
|
exports.FUSO_DE_BRASILIA = 'America/Sao_Paulo';
|
|
@@ -160,6 +162,21 @@ function desvioDoFuso(ms, fuso) {
|
|
|
160
162
|
return Date.UTC(Number(p.ano), Number(p.mes) - 1, Number(p.dia), Number(p.hora), Number(p.minuto), Number(p.segundo)) -
|
|
161
163
|
Math.floor(ms / 1000) * 1000;
|
|
162
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* RM-063 (F7): o instante em ISO com o deslocamento do fuso escrito (`2026-10-18T23:59:00-03:00`, ou `Z` no UTC). O
|
|
167
|
+
* prazo da autorização durável é gravado assim: quem o lê em outro fuso chega ao mesmo instante.
|
|
168
|
+
*/
|
|
169
|
+
function isoComFuso(quando, fuso = fusoDoDono().fuso) {
|
|
170
|
+
const ms = instante(quando);
|
|
171
|
+
if (!Number.isFinite(ms))
|
|
172
|
+
throw new Error('data inválida');
|
|
173
|
+
const p = partesLocais(ms, fuso);
|
|
174
|
+
const desvio = Math.round(desvioDoFuso(ms, fuso) / 60000);
|
|
175
|
+
const abs = Math.abs(desvio);
|
|
176
|
+
const deslocamento = desvio === 0 ? 'Z'
|
|
177
|
+
: `${desvio < 0 ? '-' : '+'}${String(Math.floor(abs / 60)).padStart(2, '0')}:${String(abs % 60).padStart(2, '0')}`;
|
|
178
|
+
return `${p.ano}-${p.mes}-${p.dia}T${p.hora}:${p.minuto}:${p.segundo}${deslocamento}`;
|
|
179
|
+
}
|
|
163
180
|
/**
|
|
164
181
|
* RM-037 (fatia 5): o instante de um relógio num fuso IANA (mês de 1 a 12). O runtime diz a hora de
|
|
165
182
|
* volta da cota no fuso dele (`resets 4:40am (<fuso>)`), e lê-la no relógio desta máquina errava o
|
|
@@ -194,11 +211,11 @@ function duracaoCurta(minutos) {
|
|
|
194
211
|
}
|
|
195
212
|
/** Duração até ou desde agora: abaixo de 1 min diz `menos de 1 min`, nunca `0min`. */
|
|
196
213
|
function duracaoRelativa(minutos) {
|
|
197
|
-
return minutos < 1 ?
|
|
214
|
+
return minutos < 1 ? (0, locale_1.msg)().horario.menosDeUmMin : duracaoCurta(minutos);
|
|
198
215
|
}
|
|
199
|
-
function sigla(fuso, ms) {
|
|
216
|
+
function sigla(fuso, ms, locale = (0, locale_1.localeAtivo)()) {
|
|
200
217
|
try {
|
|
201
|
-
return new Intl.DateTimeFormat('pt-BR', { timeZone: fuso, timeZoneName: 'short' })
|
|
218
|
+
return new Intl.DateTimeFormat(locale === 'en' ? 'en-US' : 'pt-BR', { timeZone: fuso, timeZoneName: 'short' })
|
|
202
219
|
.formatToParts(new Date(ms)).find(p => p.type === 'timeZoneName')?.value ?? '';
|
|
203
220
|
}
|
|
204
221
|
catch {
|
|
@@ -208,7 +225,7 @@ function sigla(fuso, ms) {
|
|
|
208
225
|
/** Como o fuso aparece entre parênteses: `horário de Brasília`, `UTC`, `Europe/Lisbon, GMT+1`. */
|
|
209
226
|
function rotuloDoFuso(fuso = fusoDoDono().fuso, quando) {
|
|
210
227
|
if (fuso === exports.FUSO_DE_BRASILIA)
|
|
211
|
-
return
|
|
228
|
+
return (0, locale_1.msg)().horario.brasilia;
|
|
212
229
|
if (fuso === 'UTC')
|
|
213
230
|
return 'UTC';
|
|
214
231
|
const ms = instante(quando);
|
|
@@ -218,16 +235,22 @@ function rotuloDoFuso(fuso = fusoDoDono().fuso, quando) {
|
|
|
218
235
|
/** Legenda de mensagem com vários horários: `Horários de Brasília.` */
|
|
219
236
|
function legendaDoFuso(fuso = fusoDoDono().fuso, quando) {
|
|
220
237
|
if (fuso === exports.FUSO_DE_BRASILIA)
|
|
221
|
-
return
|
|
222
|
-
return
|
|
238
|
+
return (0, locale_1.msg)().horario.legendaBrasilia;
|
|
239
|
+
return (0, locale_1.msg)().horario.legenda(rotuloDoFuso(fuso, quando));
|
|
223
240
|
}
|
|
224
|
-
/**
|
|
241
|
+
/**
|
|
242
|
+
* `19/09 15:16`; `19/09/2025 15:16` quando o ano não é o corrente do dono. Em `en`, sempre
|
|
243
|
+
* `2026-09-19 15:16` (EN6). Inválido volta como veio.
|
|
244
|
+
*/
|
|
225
245
|
function formatarDataHora(quando, opcoes = {}) {
|
|
226
246
|
const ms = instante(quando ?? null);
|
|
227
247
|
if (!Number.isFinite(ms))
|
|
228
248
|
return quando === null || quando === undefined ? '' : String(quando);
|
|
229
249
|
const fuso = opcoes.fuso ?? fusoDoDono().fuso;
|
|
230
250
|
const p = partesLocais(ms, fuso), a = partesLocais(instante(opcoes.agora), fuso);
|
|
251
|
+
if ((opcoes.locale ?? (0, locale_1.localeAtivo)()) === 'en') {
|
|
252
|
+
return `${p.ano}-${p.mes}-${p.dia} ${p.hora}:${p.minuto}` + (opcoes.segundos ? `:${p.segundo}` : '');
|
|
253
|
+
}
|
|
231
254
|
return `${p.dia}/${p.mes}${p.ano !== a.ano ? `/${p.ano}` : ''} ${p.hora}:${p.minuto}` +
|
|
232
255
|
(opcoes.segundos ? `:${p.segundo}` : '');
|
|
233
256
|
}
|
package/dist/hosts.js
CHANGED
|
@@ -57,10 +57,12 @@ exports.ORDEM_DOS_HOSTS = exports.HOSTS = exports.MAESTRO_HOST_SURFACES = export
|
|
|
57
57
|
exports.parseHost = parseHost;
|
|
58
58
|
exports.lerRecibo = lerRecibo;
|
|
59
59
|
exports.classificarDivergencia = classificarDivergencia;
|
|
60
|
+
exports.varianteEmIngles = varianteEmIngles;
|
|
60
61
|
exports.avisoDoOrkNoPath = avisoDoOrkNoPath;
|
|
61
62
|
exports.renderizarArquivo = renderizarArquivo;
|
|
62
63
|
exports.instalarAdaptador = instalarAdaptador;
|
|
63
64
|
exports.desinstalarExperiencia = desinstalarExperiencia;
|
|
65
|
+
exports.destinoPadraoDe = destinoPadraoDe;
|
|
64
66
|
exports.tabelaDeHosts = tabelaDeHosts;
|
|
65
67
|
exports.textoDosPitfalls = textoDosPitfalls;
|
|
66
68
|
exports.textoDaInstalacao = textoDaInstalacao;
|
|
@@ -84,102 +86,42 @@ const versao_1 = require("./versao");
|
|
|
84
86
|
const manifest_1 = require("./manifest");
|
|
85
87
|
const experiencia_1 = require("./experiencia");
|
|
86
88
|
const experiencia_instalacao_1 = require("./experiencia-instalacao");
|
|
89
|
+
const locale_1 = require("./locale");
|
|
90
|
+
const locale_adapter_1 = require("./locale-adapter");
|
|
91
|
+
/** RM-061 (F3b): a descricao e os pitfalls de cada host moram no catalogo (`locale-adapter.ts`), com o pt-BR como fonte. */
|
|
92
|
+
const DO_CATALOGO = locale_adapter_1.ADAPTER_PT_BR.hosts;
|
|
87
93
|
exports.HOSTS = {
|
|
88
94
|
'claude-code': {
|
|
89
95
|
host: 'claude-code',
|
|
90
|
-
descricao: '
|
|
96
|
+
descricao: DO_CATALOGO['claude-code'].descricao,
|
|
91
97
|
destinoPadrao: '.claude',
|
|
92
98
|
subdir: path.join('plugins', 'orkastery'),
|
|
93
99
|
levaCatalogo: true,
|
|
94
|
-
pitfalls: [
|
|
95
|
-
{
|
|
96
|
-
titulo: 'manifesto sem os caminhos das skills instala limpo e nao expoe nada',
|
|
97
|
-
detalhe: 'o plugin auto-descobre skills/<nome>/SKILL.md e para ai: ele nao desce nos buckets (core/, phases/, reviewers/, ...) que este catalogo usa, entao o plugin.json declara cada caminho de skill, um a um',
|
|
98
|
-
prova: 'claude plugin details orkastery # Skills (N) soma as skills do plugin.json e os comandos de commands/',
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
titulo: 'duas copias do catalogo divergem',
|
|
102
|
-
detalhe: 'a fonte unica e skills/ na raiz do produto; o INSTALADO.json guarda a origem e o sha256 de cada arquivo, e reinstalar CLASSIFICA cada divergencia por ele: o que so mudou no catalogo ressincroniza sozinho, o que voce editou barra e pede decisao por arquivo (--aceitar-catalogo ou --manter-copia). Editar a copia instalada e bandeira vermelha',
|
|
103
|
-
prova: 'ork adapter install claude-code --dry-run # mostra o que divergiu do catalogo',
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
titulo: 'hook com caminho relativo nao roda, e o guard vira decoracao',
|
|
107
|
-
detalhe: 'o hooks.json chama node "${CLAUDE_PLUGIN_ROOT}/hooks/ork-guard.js", nunca um caminho relativo ao diretorio de trabalho, que muda a cada worktree de thread',
|
|
108
|
-
prova: 'echo \'{"tool_name":"Bash","tool_input":{"command":"git add -A"}}\' | node <destino>/hooks/ork-guard.js ; echo "codigo: $?" # 2 = guard vivo',
|
|
109
|
-
},
|
|
110
|
-
],
|
|
100
|
+
pitfalls: DO_CATALOGO['claude-code'].pitfalls,
|
|
111
101
|
},
|
|
112
102
|
codex: {
|
|
113
103
|
host: 'codex',
|
|
114
|
-
descricao:
|
|
104
|
+
descricao: DO_CATALOGO.codex.descricao,
|
|
115
105
|
destinoPadrao: '.agents',
|
|
116
106
|
subdir: path.join('skills', 'orkastery'),
|
|
117
107
|
levaCatalogo: true,
|
|
118
|
-
pitfalls:
|
|
119
|
-
{
|
|
120
|
-
titulo: 'skills instaladas fora do projeto da sessao',
|
|
121
|
-
detalhe: 'Codex descobre .agents/skills a partir do diretorio da sessao ate a raiz do repositorio; outra worktree precisa da sua propria instalacao e comprovacao de descoberta',
|
|
122
|
-
prova: 'No Codex aberto no projeto instalado: $ork',
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
titulo: 'copia instalada diferente do catalogo',
|
|
126
|
-
detalhe: 'o recibo INSTALADO.json registra os arquivos e hashes dentro da pasta propria orkastery; uma edicao divergente barra a reinstalacao sem substituir arquivos de outras skills',
|
|
127
|
-
prova: 'ork adapter install codex --dry-run',
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
titulo: 'skill confundida com autorizacao de runtime',
|
|
131
|
-
detalhe: 'instalar instrucoes nao habilita permissoes, hooks ou sandbox; em projeto configurado, AGENTS.md recebe apenas o bloco reversível da experiência. Gates e preflight continuam no nucleo, e descoberta nao prova a jornada conversacional',
|
|
132
|
-
prova: 'ork doctor',
|
|
133
|
-
},
|
|
134
|
-
],
|
|
108
|
+
pitfalls: DO_CATALOGO.codex.pitfalls,
|
|
135
109
|
},
|
|
136
110
|
hermes: {
|
|
137
111
|
host: 'hermes',
|
|
138
|
-
descricao:
|
|
112
|
+
descricao: DO_CATALOGO.hermes.descricao,
|
|
139
113
|
destinoPadrao: '.hermes',
|
|
140
114
|
subdir: '',
|
|
141
115
|
levaCatalogo: false,
|
|
142
|
-
pitfalls:
|
|
143
|
-
{
|
|
144
|
-
titulo: 'ork fora do PATH do host',
|
|
145
|
-
detalhe: 'o host roda com ambiente mais enxuto que o terminal do builder e ~/.local/bin pode nao estar la; o plugin grava o caminho absoluto e o script honra ORK_BIN',
|
|
146
|
-
prova: 'ORK_BIN=$(command -v ork) ; "$ORK_BIN" doctor',
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
titulo: 'reimplementar o parse da #TAG no host',
|
|
150
|
-
detalhe: 'duas implementacoes divergem na primeira tag nova, e a divergencia aparece como thread aberta no modo errado, o que ninguem percebe ate a pausa que nao veio',
|
|
151
|
-
prova: 'ork modos --do-pedido "teste #Maestro" # a unica fonte do modo',
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
titulo: 'validar allowed_modes no host',
|
|
155
|
-
detalhe: 'um host que recusa o modo antes de chamar o ork recusa com a regra que ele tem em cache, nao com a do manifesto do projeto; deixe o ork thread new recusar, com erro tipado',
|
|
156
|
-
prova: 'ork thread new "teste" --mode look --dry-run',
|
|
157
|
-
},
|
|
158
|
-
],
|
|
116
|
+
pitfalls: DO_CATALOGO.hermes.pitfalls,
|
|
159
117
|
},
|
|
160
118
|
openclaw: {
|
|
161
119
|
host: 'openclaw',
|
|
162
|
-
descricao:
|
|
120
|
+
descricao: DO_CATALOGO.openclaw.descricao,
|
|
163
121
|
destinoPadrao: '.openclaw',
|
|
164
122
|
subdir: 'extensions/orkastery',
|
|
165
123
|
levaCatalogo: false,
|
|
166
|
-
pitfalls:
|
|
167
|
-
{
|
|
168
|
-
titulo: 'placeholder {{ork_bin}} que fica no arquivo',
|
|
169
|
-
detalhe: 'o entry executa o binario como ele esta: um placeholder nao renderizado cai no fallback (ORK_BIN ou o ork do PATH), e sem o fallback vira "comando nao encontrado" em toda tool, que a sessao so descobre depois de ja ter aberto thread na cabeca do agente',
|
|
170
|
-
prova: 'grep -c "{{" <destino>/extensions/orkastery/dist/index.js # precisa devolver 0',
|
|
171
|
-
},
|
|
172
|
-
{
|
|
173
|
-
titulo: 'argumento com espaco quebrado em varios argumentos',
|
|
174
|
-
detalhe: 'cada tool monta o comando como VETOR de argv, nunca como string de shell, para o pedido do builder chegar inteiro em --prompt; string de shell aqui vira injecao de comando com o texto do builder dentro',
|
|
175
|
-
prova: 'ork_phase_run com um prompt de varias linhas, conferido em ork phase list <thread>',
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
titulo: 'tool que reimplementa regra do nucleo',
|
|
179
|
-
detalhe: 'toda tool deste plugin e uma chamada de CLI e nada mais; tool nova que precisa de logica e sinal de que a logica pertence ao ork, com teste',
|
|
180
|
-
prova: 'ork eval # o corpus reprova host com regra de negocio duplicada',
|
|
181
|
-
},
|
|
182
|
-
],
|
|
124
|
+
pitfalls: DO_CATALOGO.openclaw.pitfalls,
|
|
183
125
|
},
|
|
184
126
|
};
|
|
185
127
|
exports.ORDEM_DOS_HOSTS = ['claude-code', 'codex', 'hermes', 'openclaw'];
|
|
@@ -231,6 +173,25 @@ function classificarDivergencia(shaDoCatalogo, shaDaCopia, shaDoRecibo) {
|
|
|
231
173
|
return 'copia-editada';
|
|
232
174
|
return 'ambos-andaram';
|
|
233
175
|
}
|
|
176
|
+
/** RM-061 (F3b, D4): as pastas das variantes inglesas, ao lado do catálogo (`core/assets` no repositório, `assets` no pacote). */
|
|
177
|
+
const PASTAS_DAS_VARIANTES = { skills: 'skills-en', references: 'references-en', adapters: 'adapters-en' };
|
|
178
|
+
/**
|
|
179
|
+
* RM-061 (F3b, D4): a variante inglesa de um arquivo `.md` do catálogo (`skills/<bucket>/<nome>/SKILL.md`,
|
|
180
|
+
* `references/<arquivo>.md`, `adapters/<host>/<relativo>.md`), quando existe; sem ela, `null` e o arquivo sai em pt-BR.
|
|
181
|
+
* A variante mora com o catálogo de onde o arquivo sai, nunca no pacote de outro: um catálogo sem `assets` instala em pt-BR.
|
|
182
|
+
* O par `orchestration-experience` e `orchestration-experience-pt-br` já é bilíngue e não tem variante.
|
|
183
|
+
*/
|
|
184
|
+
function varianteEmIngles(catalogo, origem) {
|
|
185
|
+
const m = /^(skills|references|adapters)\/(.+\.md)$/.exec(path.relative(catalogo, origem).split(path.sep).join('/'));
|
|
186
|
+
if (!m)
|
|
187
|
+
return null;
|
|
188
|
+
for (const assets of [path.join(catalogo, 'core', 'assets'), path.join(catalogo, 'assets')]) {
|
|
189
|
+
const candidato = path.join(assets, PASTAS_DAS_VARIANTES[m[1]], ...m[2].split('/'));
|
|
190
|
+
if (fs.existsSync(candidato))
|
|
191
|
+
return candidato;
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
234
195
|
function sha256(conteudo) {
|
|
235
196
|
return (0, node_crypto_1.createHash)('sha256').update(conteudo).digest('hex');
|
|
236
197
|
}
|
|
@@ -239,6 +200,9 @@ function listarArquivos(dir, prefixo = '') {
|
|
|
239
200
|
for (const entrada of fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
240
201
|
const origem = path.join(dir, entrada.name);
|
|
241
202
|
const relativo = path.posix.join(prefixo, entrada.name);
|
|
203
|
+
// O cache de bytecode que o Python deixa no checkout nao e do catalogo: nao se instala nem entra no recibo.
|
|
204
|
+
if (entrada.name === '__pycache__' || entrada.name.endsWith('.pyc'))
|
|
205
|
+
continue;
|
|
242
206
|
if (entrada.isDirectory()) {
|
|
243
207
|
achados.push(...listarArquivos(origem, relativo));
|
|
244
208
|
}
|
|
@@ -264,14 +228,14 @@ function avisoDoOrkNoPath(emExecucao, versao, env = process.env) {
|
|
|
264
228
|
const doPath = (0, util_1.noPath)('ork', env);
|
|
265
229
|
if (!doPath || mesmoArquivo(doPath, emExecucao))
|
|
266
230
|
return undefined;
|
|
267
|
-
let outra
|
|
231
|
+
let outra;
|
|
268
232
|
try {
|
|
269
233
|
const saida = (0, node_child_process_1.execFileSync)(doPath, ['--version'], { encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'], env });
|
|
270
|
-
outra = saida.trim().split('\n')[0]?.trim() ||
|
|
234
|
+
outra = saida.trim().split('\n')[0]?.trim() || undefined;
|
|
271
235
|
}
|
|
272
236
|
catch { /* o aviso sai mesmo sem a versão */ }
|
|
273
|
-
|
|
274
|
-
|
|
237
|
+
// RM-061 (F3b): o aviso nasce pelo catalogo e o texto da instalacao o remonta no locale do comando.
|
|
238
|
+
return (0, locale_1.textoDoCatalogo)((m) => m.adapter.orkNoPath(doPath, outra ?? m.adapter.versaoDesconhecida, emExecucao, versao));
|
|
275
239
|
}
|
|
276
240
|
/** Substitui os tres placeholders. Nao ha template engine aqui de proposito. */
|
|
277
241
|
function renderizarArquivo(conteudo, valores) {
|
|
@@ -300,7 +264,7 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
300
264
|
? avisoDoOrkNoPath(opcoes.orkEmExecucao, versao) : undefined;
|
|
301
265
|
const dirDoHost = path.join(catalogo, 'adapters', host);
|
|
302
266
|
if (!fs.existsSync(dirDoHost)) {
|
|
303
|
-
throw new
|
|
267
|
+
throw new locale_1.ErroDoCatalogo((m) => m.adapter.adaptadorNaoExiste(host, dirDoHost));
|
|
304
268
|
}
|
|
305
269
|
const fontes = listarArquivos(dirDoHost).map(fonte => host === 'hermes' && fonte.relativo.startsWith('hitl-ingress/')
|
|
306
270
|
? { ...fonte, relativo: fonte.relativo.replace(/^hitl-ingress\//, 'plugins/orkastery-hitl/') } : fonte);
|
|
@@ -320,19 +284,28 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
320
284
|
fontes.push({ origem: skill.caminho, relativo: path.posix.join('skills', skill.nome, 'SKILL.md') });
|
|
321
285
|
}
|
|
322
286
|
}
|
|
287
|
+
// RM-061 (F3b, D4): com o dono em inglês, o arquivo com variante sai dela, no mesmo destino; o recibo guarda a origem
|
|
288
|
+
// real, e reinstalar na outra língua troca no lugar a cópia intacta (`catalogo-andou`).
|
|
289
|
+
if (opcoes.locale === 'en') {
|
|
290
|
+
for (const fonte of fontes)
|
|
291
|
+
fonte.origem = varianteEmIngles(catalogo, fonte.origem) ?? fonte.origem;
|
|
292
|
+
}
|
|
323
293
|
// A experiência é opcional: manifesto com erro, bloco alheio ou caminho inadequado pulam só a
|
|
324
|
-
// ativação, com aviso, e o adaptador segue instalado como antes da RM-051.
|
|
325
|
-
|
|
294
|
+
// ativação, com aviso, e o adaptador segue instalado como antes da RM-051. RM-061 (F3b): o aviso nasce
|
|
295
|
+
// pelo catalogo e o texto da instalacao o remonta.
|
|
296
|
+
const pulado = (montar) => (0, locale_1.textoDoCatalogo)((m) => montar(m.adapter, m.adapter.segue));
|
|
326
297
|
const carregado = (0, manifest_1.carregarManifesto)(projeto);
|
|
327
298
|
let avisoExperiencia;
|
|
328
299
|
if (carregado?.raiz === projeto && carregado.erros.length) {
|
|
329
|
-
|
|
300
|
+
const erro = carregado.erros[0];
|
|
301
|
+
avisoExperiencia = pulado((a, segue) => a.puladoManifesto(erro, segue));
|
|
330
302
|
}
|
|
331
303
|
// Preferência inválida (ex.: experience: "false") não ativa nem remove nada: quem escreveu pode ter
|
|
332
304
|
// tentado desligar o pacote. Corrigir com ork onboarding set maestro volta a instalar.
|
|
333
305
|
const invalida = carregado?.raiz === projeto ? carregado.avisos.find(a => a.startsWith('experiencia.config.invalid')) : undefined;
|
|
334
|
-
if (!avisoExperiencia && invalida)
|
|
335
|
-
avisoExperiencia =
|
|
306
|
+
if (!avisoExperiencia && invalida) {
|
|
307
|
+
avisoExperiencia = (0, locale_1.textoDoCatalogo)((m) => m.adapter.puladoInvalida(m.onboarding.avisoDaPreferencia(invalida), m.adapter.segue));
|
|
308
|
+
}
|
|
336
309
|
const preferencias = carregado?.raiz === projeto && !avisoExperiencia ? (0, experiencia_1.resolverExperiencia)(carregado.manifesto.owner) : null;
|
|
337
310
|
const hostComBloco = host === 'codex' || host === 'claude-code';
|
|
338
311
|
// O bloco aponta o diretório relativo ao projeto: CLAUDE.md e AGENTS.md costumam ir ao repositório.
|
|
@@ -341,26 +314,27 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
341
314
|
if (preferencias?.experience && host !== 'openclaw') {
|
|
342
315
|
const skillRelativa = host === 'hermes' ? `skills/${preferencias.skill}/SKILL.md`
|
|
343
316
|
: `skills/core/${preferencias.skill}/SKILL.md`;
|
|
317
|
+
const skill = preferencias.skill;
|
|
344
318
|
if (!fontes.some(f => f.relativo === skillRelativa)) {
|
|
345
|
-
avisoExperiencia =
|
|
319
|
+
avisoExperiencia = pulado((a, segue) => a.puladoSemSkill(skill, segue));
|
|
346
320
|
}
|
|
347
321
|
else if (hostComBloco && (diretorioExperiencia.startsWith('../') || path.isAbsolute(diretorioExperiencia))) {
|
|
348
|
-
avisoExperiencia =
|
|
322
|
+
avisoExperiencia = pulado((a, segue) => a.puladoForaDoProjeto(segue));
|
|
349
323
|
}
|
|
350
324
|
else if (hostComBloco && /[\r\n`]/.test(diretorioExperiencia)) {
|
|
351
|
-
avisoExperiencia =
|
|
325
|
+
avisoExperiencia = pulado((a, segue) => a.puladoCaminho(segue));
|
|
352
326
|
}
|
|
353
327
|
}
|
|
354
328
|
let planoExperiencia = null;
|
|
355
329
|
if (preferencias && hostComBloco && !avisoExperiencia) {
|
|
356
330
|
try {
|
|
357
|
-
planoExperiencia = (0, experiencia_instalacao_1.planejarExperiencia)(projeto, host, preferencias.experience ? diretorioExperiencia : null);
|
|
331
|
+
planoExperiencia = (0, experiencia_instalacao_1.planejarExperiencia)(projeto, host, preferencias.experience ? diretorioExperiencia : null, opcoes.locale);
|
|
358
332
|
}
|
|
359
333
|
catch (e) {
|
|
360
334
|
const motivo = e.message;
|
|
361
335
|
if (!/^experiencia\.(bloco\.conflict|path\.unsafe)/.test(motivo))
|
|
362
336
|
throw e;
|
|
363
|
-
avisoExperiencia =
|
|
337
|
+
avisoExperiencia = pulado((a, segue) => a.puladoBloco(motivo.startsWith('experiencia.path'), host, segue));
|
|
364
338
|
}
|
|
365
339
|
}
|
|
366
340
|
// O preflight cobre o destino e os arquivos do próprio adaptador antes de copiar o primeiro. Links
|
|
@@ -369,7 +343,7 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
369
343
|
for (let atual = alvo; atual !== path.dirname(destino) && atual !== path.dirname(atual); atual = path.dirname(atual)) {
|
|
370
344
|
const stat = fs.lstatSync(atual, { throwIfNoEntry: false });
|
|
371
345
|
if (stat && (stat.isSymbolicLink() || (atual === alvo ? !stat.isFile() || stat.nlink !== 1 : !stat.isDirectory()))) {
|
|
372
|
-
throw
|
|
346
|
+
throw new locale_1.ErroDoCatalogo((m) => m.adapter.destinoInseguro);
|
|
373
347
|
}
|
|
374
348
|
}
|
|
375
349
|
}
|
|
@@ -421,6 +395,7 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
421
395
|
estado,
|
|
422
396
|
});
|
|
423
397
|
}
|
|
398
|
+
const removidos = sobrasDeMods(destino, recibo, arquivos);
|
|
424
399
|
const conflitos = arquivos.filter((a) => a.estado === 'sobrescrito');
|
|
425
400
|
/**
|
|
426
401
|
* I-43 (D5): a divergencia continua sendo DETECTADA; ela deixa de BARRAR quando e
|
|
@@ -458,6 +433,7 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
458
433
|
...(preferencias || avisoExperiencia ? { experiencia: { ativa: host !== 'openclaw' && !!preferencias?.experience && !avisoExperiencia,
|
|
459
434
|
arquivos: planoExperiencia?.mudancas.map(m => path.relative(planoExperiencia.projeto, m.arquivo)) ?? [], skill: preferencias?.skill ?? '',
|
|
460
435
|
...(avisoExperiencia ? { aviso: avisoExperiencia } : {}) } } : {}),
|
|
436
|
+
...(removidos.length ? { removidos } : {}),
|
|
461
437
|
};
|
|
462
438
|
if (opcoes.dryRun === true || barrado)
|
|
463
439
|
return resultado;
|
|
@@ -477,6 +453,17 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
477
453
|
if (arquivo.executavel)
|
|
478
454
|
fs.chmodSync(arquivo.destino, 0o755);
|
|
479
455
|
}
|
|
456
|
+
// RM-059 (T0.7, A1 do CHECK): o que saiu do catalogo em `mods/` sai da copia, com a pasta que ficar vazia.
|
|
457
|
+
for (const relativo of removidos) {
|
|
458
|
+
const alvo = path.join(destino, relativo);
|
|
459
|
+
fs.unlinkSync(alvo);
|
|
460
|
+
const raizDoMod = path.join(destino, ...relativo.split('/').slice(0, 2));
|
|
461
|
+
for (let dir = path.dirname(alvo); dir.startsWith(raizDoMod); dir = path.dirname(dir)) {
|
|
462
|
+
if (fs.readdirSync(dir).length)
|
|
463
|
+
break;
|
|
464
|
+
fs.rmdirSync(dir);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
480
467
|
// O recibo: com ele da para saber, depois, se alguem editou a copia instalada em vez do
|
|
481
468
|
// catalogo. Sem ele a instalacao e um monte de arquivo sem procedencia.
|
|
482
469
|
fs.writeFileSync(path.join(destino, 'INSTALADO.json'), JSON.stringify({
|
|
@@ -497,6 +484,41 @@ function instalarAdaptador(host, opcoes = {}) {
|
|
|
497
484
|
(0, experiencia_instalacao_1.aplicarExperiencia)(planoExperiencia);
|
|
498
485
|
return resultado;
|
|
499
486
|
}
|
|
487
|
+
/**
|
|
488
|
+
* RM-059 (T0.7, A1 do CHECK): os arquivos de `mods/` do recibo anterior que nao estao mais no catalogo e que a
|
|
489
|
+
* copia guarda como foram instalados (sha256 do recibo), os de cada mod e os comuns da raiz de `mods/` (N2 da
|
|
490
|
+
* rodada 2). Arquivo editado, link ou caminho fora do destino fica: o despacho continua recusando com o motivo,
|
|
491
|
+
* e a decisao e de quem editou.
|
|
492
|
+
*/
|
|
493
|
+
function sobrasDeMods(destino, recibo, arquivos) {
|
|
494
|
+
if (!recibo)
|
|
495
|
+
return [];
|
|
496
|
+
const novos = new Set(arquivos.map((a) => a.relativo));
|
|
497
|
+
let base;
|
|
498
|
+
try {
|
|
499
|
+
base = fs.realpathSync(destino);
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
return [];
|
|
503
|
+
}
|
|
504
|
+
return recibo.arquivos.flatMap((a) => {
|
|
505
|
+
const rel = typeof a.arquivo === 'string' ? a.arquivo : '';
|
|
506
|
+
if (!/^mods\/[^/]+(?:$|\/.)/.test(rel) || novos.has(rel) || path.isAbsolute(rel) || rel.split('/').includes('..'))
|
|
507
|
+
return [];
|
|
508
|
+
const alvo = path.join(destino, rel);
|
|
509
|
+
const st = fs.lstatSync(alvo, { throwIfNoEntry: false });
|
|
510
|
+
if (!st || !st.isFile() || st.nlink !== 1)
|
|
511
|
+
return [];
|
|
512
|
+
try {
|
|
513
|
+
if (!fs.realpathSync(path.dirname(alvo)).startsWith(base + path.sep))
|
|
514
|
+
return [];
|
|
515
|
+
}
|
|
516
|
+
catch {
|
|
517
|
+
return [];
|
|
518
|
+
}
|
|
519
|
+
return sha256(fs.readFileSync(alvo)) === a.sha256 ? [rel] : [];
|
|
520
|
+
});
|
|
521
|
+
}
|
|
500
522
|
/** Caminho real do maior ancestral existente, com o resto como está: o destino pode não existir ainda. */
|
|
501
523
|
function caminhoReal(alvo) {
|
|
502
524
|
let existente = path.resolve(alvo);
|
|
@@ -511,102 +533,101 @@ function desinstalarExperiencia(projeto, host, dryRun = false) {
|
|
|
511
533
|
(0, experiencia_instalacao_1.aplicarExperiencia)(plano);
|
|
512
534
|
return { host, dryRun, arquivos: plano.mudancas.map(m => path.relative(plano.projeto, m.arquivo)) };
|
|
513
535
|
}
|
|
514
|
-
/**
|
|
536
|
+
/** O destino padrao de um host, relativo a raiz do projeto (`.claude/plugins/orkastery`). */
|
|
537
|
+
function destinoPadraoDe(host) {
|
|
538
|
+
const def = exports.HOSTS[host];
|
|
539
|
+
return `${def.destinoPadrao}${def.subdir ? '/' + def.subdir : ''}`;
|
|
540
|
+
}
|
|
541
|
+
/** Texto de `ork adapter list`, no locale ativo; a descricao de cada host vem do catalogo. */
|
|
515
542
|
function tabelaDeHosts() {
|
|
516
|
-
const
|
|
543
|
+
const m = (0, locale_1.msg)().adapter;
|
|
544
|
+
const linhas = [m.titulo, ''];
|
|
517
545
|
for (const host of exports.ORDEM_DOS_HOSTS) {
|
|
518
|
-
|
|
519
|
-
linhas.push(` ${
|
|
520
|
-
linhas.push(` ${' '.repeat(13)}
|
|
521
|
-
linhas.push(` ${' '.repeat(13)} catalogo de skills junto: ${def.levaCatalogo ? 'sim' : 'nao'}`);
|
|
546
|
+
linhas.push(` ${host.padEnd(13)} ${m.hosts[host].descricao}`);
|
|
547
|
+
linhas.push(` ${' '.repeat(13)} ${m.destinoPadrao(destinoPadraoDe(host))}`);
|
|
548
|
+
linhas.push(` ${' '.repeat(13)} ${m.catalogoJunto(exports.HOSTS[host].levaCatalogo)}`);
|
|
522
549
|
}
|
|
523
550
|
linhas.push('');
|
|
524
|
-
linhas.push(
|
|
525
|
-
linhas.push(
|
|
551
|
+
linhas.push(m.instaleCom);
|
|
552
|
+
linhas.push(m.zeroRegra);
|
|
526
553
|
return linhas.join('\n');
|
|
527
554
|
}
|
|
528
|
-
/** Texto dos pitfalls de um host, impresso no fim de toda instalacao. */
|
|
555
|
+
/** Texto dos pitfalls de um host, impresso no fim de toda instalacao, no locale ativo. */
|
|
529
556
|
function textoDosPitfalls(host) {
|
|
530
|
-
const
|
|
531
|
-
const linhas = [
|
|
532
|
-
|
|
557
|
+
const m = (0, locale_1.msg)().adapter;
|
|
558
|
+
const linhas = [m.tituloDosPitfalls(host), ''];
|
|
559
|
+
m.hosts[host].pitfalls.forEach((p, i) => {
|
|
533
560
|
linhas.push(` ${i + 1}. ${p.titulo}`);
|
|
534
561
|
linhas.push(` ${p.detalhe}`);
|
|
535
|
-
linhas.push(`
|
|
562
|
+
linhas.push(` ${m.prova(p.prova)}`);
|
|
536
563
|
linhas.push('');
|
|
537
564
|
});
|
|
538
565
|
return linhas.join('\n').replace(/\n$/, '');
|
|
539
566
|
}
|
|
540
|
-
/** Texto de `ork adapter install
|
|
567
|
+
/** Texto de `ork adapter install`, no locale ativo; os avisos que a instalacao montou sao remontados. */
|
|
541
568
|
function textoDaInstalacao(r) {
|
|
569
|
+
const m = (0, locale_1.msg)().adapter;
|
|
542
570
|
const linhas = [];
|
|
543
571
|
// Ensaio da 0.5.0: com o pacote ativo e pulado por aviso (catalogo fora do projeto), a linha dizia
|
|
544
572
|
// "desativada"; o aviso logo abaixo diz o motivo.
|
|
545
|
-
if (r.experiencia)
|
|
546
|
-
linhas.push(
|
|
547
|
-
|
|
548
|
-
`${r.experiencia.skill ? ` (${r.experiencia.skill})` : ''}.`);
|
|
573
|
+
if (r.experiencia) {
|
|
574
|
+
linhas.push(m.experiencia(r.experiencia.ativa ? 'ativa' : r.experiencia.aviso ? 'pulada' : 'desativada', r.experiencia.skill));
|
|
575
|
+
}
|
|
549
576
|
if (r.experiencia?.aviso)
|
|
550
|
-
linhas.push(
|
|
551
|
-
linhas.push(r.dryRun
|
|
552
|
-
? `Simulacao (--dry-run) da instalacao do adaptador ${r.host}: nada foi escrito.`
|
|
553
|
-
: r.ok
|
|
554
|
-
? `Arquivos do adaptador ${r.host} preparados.`
|
|
555
|
-
: `Instalacao do adaptador ${r.host} BARRADA: ha arquivo diferente no destino.`);
|
|
577
|
+
linhas.push(m.aviso((0, locale_1.remontar)(r.experiencia.aviso)));
|
|
578
|
+
linhas.push(r.dryRun ? m.simulacao(r.host) : r.ok ? m.preparados(r.host) : m.barrada(r.host));
|
|
556
579
|
// Ensaio de 03/10 (R6): a ativacao sai no comeco e de novo no fim, depois da lista de arquivos e dos
|
|
557
580
|
// pitfalls, para que o fim da saida diga o proximo passo.
|
|
558
581
|
const ativacao = [];
|
|
559
582
|
if (r.ok && !r.dryRun && r.host === 'claude-code') {
|
|
560
583
|
const destino = "'" + r.destino.replace(/'/g, "'\"'\"'") + "'";
|
|
561
|
-
linhas.push(
|
|
562
|
-
linhas.push(
|
|
584
|
+
linhas.push(m.claudeNaoVerificado);
|
|
585
|
+
linhas.push(m.claudeValide);
|
|
563
586
|
ativacao.push(` claude plugin validate ${destino}`);
|
|
564
587
|
ativacao.push(` claude plugin marketplace add ${destino} --scope project`);
|
|
565
588
|
ativacao.push(' claude plugin install orkastery@orkastery --scope project');
|
|
566
589
|
ativacao.push(' claude plugin list --json');
|
|
567
|
-
ativacao.push(
|
|
590
|
+
ativacao.push(m.claudeDepois);
|
|
568
591
|
}
|
|
569
592
|
else if (r.ok && !r.dryRun && r.host === 'codex') {
|
|
570
|
-
ativacao.push(
|
|
571
|
-
ativacao.push(
|
|
593
|
+
ativacao.push(m.codexAbra);
|
|
594
|
+
ativacao.push(m.codexNaoVerificado);
|
|
572
595
|
}
|
|
573
596
|
if (r.ok && !r.dryRun && (r.host === 'codex' || r.host === 'claude-code')) {
|
|
574
597
|
const projeto = "'" + r.projeto.replace(/'/g, "'\"'\"'") + "'";
|
|
575
|
-
ativacao.push(
|
|
598
|
+
ativacao.push(m.prepareMcp(projeto, r.host));
|
|
576
599
|
}
|
|
577
600
|
linhas.push(...ativacao);
|
|
578
601
|
if (ativacao.length)
|
|
579
|
-
linhas.push(
|
|
580
|
-
linhas.push(
|
|
581
|
-
linhas.push(
|
|
582
|
-
linhas.push(
|
|
602
|
+
linhas.push(m.consentimento);
|
|
603
|
+
linhas.push(m.catalogo(r.catalogo));
|
|
604
|
+
linhas.push(m.destino(r.destino));
|
|
605
|
+
linhas.push(m.ork(r.orkBin));
|
|
583
606
|
if (r.avisoOrk)
|
|
584
|
-
linhas.push(
|
|
607
|
+
linhas.push(m.avisoOrk((0, locale_1.remontar)(r.avisoOrk)));
|
|
585
608
|
linhas.push('');
|
|
586
609
|
const novos = r.arquivos.filter((a) => a.estado === 'novo').length;
|
|
587
610
|
const iguais = r.arquivos.filter((a) => a.estado === 'igual').length;
|
|
588
611
|
const catalogoAndou = r.conflitos.filter((a) => a.divergencia === 'catalogo-andou').length;
|
|
589
|
-
linhas.push(
|
|
612
|
+
linhas.push(m.arquivos(r.arquivos.length, novos, iguais, r.conflitos.length));
|
|
590
613
|
for (const a of r.arquivos) {
|
|
591
614
|
const marca = a.estado === 'novo' ? '+' : a.estado === 'igual' ? '=' : '!';
|
|
592
615
|
const porque = a.divergencia ? ` (${a.divergencia})` : '';
|
|
593
616
|
linhas.push(` ${marca} ${a.relativo}${porque}`);
|
|
594
617
|
}
|
|
618
|
+
// RM-059 (T0.7): arquivo de mod que saiu do catalogo sai da copia, para o despacho nao recusar o mod.
|
|
619
|
+
for (const rel of r.removidos ?? [])
|
|
620
|
+
linhas.push(m.removido(rel, r.dryRun));
|
|
595
621
|
// I-43 (D5): o `--dir` na raiz avisa, em vez de reportar "tudo novo" com saida 0.
|
|
596
622
|
if (r.reciboVizinho) {
|
|
597
623
|
linhas.push('');
|
|
598
|
-
linhas.push(
|
|
599
|
-
linhas.push(` ${r.reciboVizinho}`);
|
|
600
|
-
linhas.push(' `--dir` e o destino COMPLETO, nao a raiz do projeto. Do jeito que esta, esta');
|
|
601
|
-
linhas.push(' instalacao criaria uma copia nova ao lado da que ja existe, e a que existe');
|
|
602
|
-
linhas.push(' ficaria sem conferencia nenhuma.');
|
|
624
|
+
linhas.push(...m.reciboVizinho(r.destino, r.reciboVizinho));
|
|
603
625
|
}
|
|
604
626
|
// I-43 (D5): o que o recibo garante seguro se resolve sozinho, e sai como uma linha
|
|
605
627
|
// de resumo em vez de virar decisao do operador.
|
|
606
628
|
if (catalogoAndou > 0) {
|
|
607
629
|
linhas.push('');
|
|
608
|
-
linhas.push(
|
|
609
|
-
linhas.push(' e quem mudou foi o catalogo. Sobrescrever nao perde trabalho de ninguem.');
|
|
630
|
+
linhas.push(...m.catalogoAndou(catalogoAndou));
|
|
610
631
|
}
|
|
611
632
|
if (!r.ok) {
|
|
612
633
|
// A pergunta de UMA linha, com o arquivo NOMEADO e as duas saidas reais. O `--dir`
|
|
@@ -616,13 +637,13 @@ function textoDaInstalacao(r) {
|
|
|
616
637
|
? r.destino.slice(r.projeto.length + 1)
|
|
617
638
|
: r.destino;
|
|
618
639
|
linhas.push('');
|
|
619
|
-
linhas.push(
|
|
640
|
+
linhas.push(m.precisamDeDecisao(r.precisamDeDecisao.length));
|
|
620
641
|
for (const a of r.precisamDeDecisao) {
|
|
621
642
|
linhas.push(` ${a.relativo} (${a.divergencia})`);
|
|
622
643
|
linhas.push(` $ diff -u ${a.origem} ${a.destino}`);
|
|
623
644
|
}
|
|
624
645
|
linhas.push('');
|
|
625
|
-
linhas.push(
|
|
646
|
+
linhas.push(m.resolva);
|
|
626
647
|
const exemplo = r.precisamDeDecisao[0]?.relativo ?? '<arquivo>';
|
|
627
648
|
linhas.push(` ork adapter install ${r.host} --dir ${dirEmUso} --aceitar-catalogo ${exemplo}`);
|
|
628
649
|
linhas.push(` ork adapter install ${r.host} --dir ${dirEmUso} --manter-copia ${exemplo}`);
|
|
@@ -631,7 +652,7 @@ function textoDaInstalacao(r) {
|
|
|
631
652
|
linhas.push(textoDosPitfalls(r.host));
|
|
632
653
|
if (ativacao.length) {
|
|
633
654
|
linhas.push('');
|
|
634
|
-
linhas.push(r.host === 'claude-code' ?
|
|
655
|
+
linhas.push(r.host === 'claude-code' ? m.proximoPassoClaude : m.proximoPasso);
|
|
635
656
|
linhas.push(...ativacao);
|
|
636
657
|
}
|
|
637
658
|
return linhas.join('\n');
|