@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/forja.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mesmaForja = exports.rotuloDaForja = exports.executorPadrao = void 0;
|
|
3
|
+
exports.apiDoGitlab = exports.mesmaForja = exports.rotuloDaForja = exports.executorPadrao = void 0;
|
|
4
4
|
exports.enderecoDoRemoto = enderecoDoRemoto;
|
|
5
5
|
exports.repositorioGithubNoHost = repositorioGithubNoHost;
|
|
6
6
|
exports.identidadeDaForja = identidadeDaForja;
|
|
7
|
+
exports.identidadeDaForjaResolvida = identidadeDaForjaResolvida;
|
|
7
8
|
exports.forjaDoArgumento = forjaDoArgumento;
|
|
8
9
|
exports.detalheSeguro = detalheSeguro;
|
|
10
|
+
exports.detalheDoPush = detalheDoPush;
|
|
11
|
+
exports.pushRecusadoPelaProtecao = pushRecusadoPelaProtecao;
|
|
9
12
|
exports.classificarFalha = classificarFalha;
|
|
10
13
|
exports.lerCommitsDaForja = lerCommitsDaForja;
|
|
11
14
|
exports.lerDaForja = lerDaForja;
|
|
@@ -20,16 +23,19 @@ exports.lerDaForja = lerDaForja;
|
|
|
20
23
|
*
|
|
21
24
|
* GitHub responde tudo em UMA consulta: a base com `docs/roadmap`, o manifesto e os commits desde
|
|
22
25
|
* `desde`, e as duas branches de estado, cada parte no commit que a propria consulta devolve.
|
|
23
|
-
* GitLab devolve a mesma leitura por consultas GraphQL e pelo REST de commits
|
|
24
|
-
*
|
|
26
|
+
* GitLab devolve a mesma leitura por consultas GraphQL e pelo REST de commits, pela API da CLI
|
|
27
|
+
* logada (`forja/api.ts`); o esquema esta provado com as respostas gravadas de um GitLab de verdade.
|
|
25
28
|
*
|
|
26
29
|
* Resposta fora do formato vira erro tipado, nunca lista vazia: quem le nao confunde "nao li" com
|
|
27
30
|
* "nao tem".
|
|
28
31
|
*/
|
|
29
|
-
const
|
|
32
|
+
const endereco_1 = require("./forja/endereco");
|
|
30
33
|
const hitl_1 = require("./hitl");
|
|
31
34
|
const policies_1 = require("./policies");
|
|
32
|
-
const
|
|
35
|
+
const executor_1 = require("./forja/executor");
|
|
36
|
+
const api_1 = require("./forja/api");
|
|
37
|
+
const consultas_1 = require("./forja/gitlab/consultas");
|
|
38
|
+
const pedidos_1 = require("./forja/gitlab/pedidos");
|
|
33
39
|
const PRAZO_MS = 30000;
|
|
34
40
|
const SHA = /^[0-9a-f]{40}$/;
|
|
35
41
|
const SEGMENTO = /^[A-Za-z0-9_.-]+$/;
|
|
@@ -38,21 +44,20 @@ const HOST = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9]
|
|
|
38
44
|
/**
|
|
39
45
|
* Sem shell, sem token: a CLI usa a autenticacao que ja tem; prompt e aviso de versao desligados.
|
|
40
46
|
* RM-054 (fatia 3): o binario e procurado como na rede (D11 da RM-053), no PATH e depois nas pastas de
|
|
41
|
-
* usuario (`~/.local/bin` e as outras): o gateway e o cron rodam com PATH curto, e o `gh` da
|
|
47
|
+
* usuario (`~/.local/bin` e as outras): o gateway e o cron rodam com PATH curto, e o `gh` da maquina-b
|
|
42
48
|
* mora em `~/.local/bin`. Sem achar, o nome vai cru ao spawn, e o ENOENT continua `forja.ausente`.
|
|
43
49
|
*/
|
|
44
|
-
const executorPadrao = (cmd, args, entrada, timeoutMs) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
env: { ...process.env, GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1', GLAB_CHECK_UPDATE: 'false', NO_COLOR: '1' },
|
|
48
|
-
});
|
|
49
|
-
return { status: r.status, stdout: (r.stdout ?? '').toString(), stderr: (r.stderr ?? '').toString(), sinal: r.signal ?? null,
|
|
50
|
-
...(r.error ? { erro: r.error.code ?? r.error.message } : {}) };
|
|
51
|
-
};
|
|
50
|
+
const executorPadrao = (cmd, args, entrada, timeoutMs) => (0, executor_1.rodarCli)({ cmd, args, entrada,
|
|
51
|
+
prazoMs: timeoutMs, maxBuffer: 32 * 1024 * 1024,
|
|
52
|
+
acrescentar: { GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1', GLAB_CHECK_UPDATE: 'false', NO_COLOR: '1' } });
|
|
52
53
|
exports.executorPadrao = executorPadrao;
|
|
53
54
|
// ---------------------------------------------------------------------------
|
|
54
55
|
// Identidade
|
|
55
56
|
// ---------------------------------------------------------------------------
|
|
57
|
+
/**
|
|
58
|
+
* O tipo pelo nome do host. So vale onde nao ha manifesto nem login para resolver: a rede le os remotos de outros
|
|
59
|
+
* projetos. A CI do projeto usa a forja resolvida (`forja/resolver.ts`), que nao decide pelo nome.
|
|
60
|
+
*/
|
|
56
61
|
function tipoDoHost(host) {
|
|
57
62
|
if (host === 'github.com' || /(^|[.-])github([.-]|$)/.test(host))
|
|
58
63
|
return 'github';
|
|
@@ -75,14 +80,9 @@ function montar(tipo, host, caminho) {
|
|
|
75
80
|
* na URL nunca entra; caminho local e host que nao e hostname voltam null.
|
|
76
81
|
*/
|
|
77
82
|
function enderecoDoRemoto(url) {
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
const achado = esquema ?? scp;
|
|
82
|
-
if (!achado)
|
|
83
|
-
return null;
|
|
84
|
-
const host = achado[1].toLowerCase();
|
|
85
|
-
return HOST.test(host) ? { host, caminho: achado[2].replace(/^\/+/, '') } : null;
|
|
83
|
+
// Parser unico (forja/endereco.ts); aqui so o `HOST` com ponto e o caminho como escrito (`montar` o valida).
|
|
84
|
+
const lido = (0, endereco_1.lerHostDoRemoto)(url);
|
|
85
|
+
return lido && HOST.test(lido.host) ? { host: lido.host, caminho: lido.caminhoBruto } : null;
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* RM-037 (fatia 5, A5): o `dono/nome` de um repositorio do GitHub no host do remoto, com qualquer host: o GitHub
|
|
@@ -99,7 +99,29 @@ function repositorioGithubNoHost(url) {
|
|
|
99
99
|
function identidadeDaForja(url) {
|
|
100
100
|
const endereco = enderecoDoRemoto(url);
|
|
101
101
|
const tipo = endereco ? tipoDoHost(endereco.host) : null;
|
|
102
|
-
|
|
102
|
+
const id = endereco && tipo ? montar(tipo, endereco.host, endereco.caminho) : null;
|
|
103
|
+
const porta = id?.tipo === 'gitlab' ? portaDaApiNoRemoto(url) : null;
|
|
104
|
+
return id && porta !== null ? { ...id, porta } : id;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* A identidade de uma forja ja resolvida (o bloco `forja:`, o host conhecido), na forma que a leitura do roadmap usa. A
|
|
108
|
+
* porta, o caminho base e a CA so entram no GitLab: o GitHub le pelo `gh` com o host.
|
|
109
|
+
*/
|
|
110
|
+
function identidadeDaForjaResolvida(f) {
|
|
111
|
+
const id = montar(f.tipo, f.host, f.repo);
|
|
112
|
+
if (!id || id.tipo !== 'gitlab')
|
|
113
|
+
return id;
|
|
114
|
+
return { ...id, ...(f.porta !== null ? { porta: f.porta } : {}), ...(f.caminhoBase ? { caminhoBase: f.caminhoBase } : {}),
|
|
115
|
+
...(f.ca ? { ca: f.ca } : {}) };
|
|
116
|
+
}
|
|
117
|
+
/** A porta da API num remoto https/http, quando nao e a do esquema; a porta de ssh e do ssh e nunca entra. */
|
|
118
|
+
function portaDaApiNoRemoto(url) {
|
|
119
|
+
const lido = (0, endereco_1.lerHostDoRemoto)(url);
|
|
120
|
+
if (!lido || (lido.protocolo !== 'https' && lido.protocolo !== 'http') || lido.porta === null)
|
|
121
|
+
return null;
|
|
122
|
+
if (lido.porta < 1 || lido.porta > 65535 || lido.porta === (lido.protocolo === 'https' ? 443 : 80))
|
|
123
|
+
return null;
|
|
124
|
+
return lido.porta;
|
|
103
125
|
}
|
|
104
126
|
/** `github:dono/repo`, `gitlab:grupo/sub/repo` (com host proprio: `gitlab:host.tld/grupo/repo`) ou uma URL. */
|
|
105
127
|
function forjaDoArgumento(texto) {
|
|
@@ -115,20 +137,57 @@ function forjaDoArgumento(texto) {
|
|
|
115
137
|
return /^[a-z+]+:\/\//i.test(t) || /^[^@\s/:]+@[^:\s/]+:/.test(t) ? identidadeDaForja(t) : null;
|
|
116
138
|
}
|
|
117
139
|
/** Como a forja aparece para gente: `github.com/orkastery/orkastery`. */
|
|
118
|
-
const rotuloDaForja = (f) => `${f.host}/${f.repo}`;
|
|
140
|
+
const rotuloDaForja = (f) => `${f.host}${f.porta ? `:${f.porta}` : ''}/${f.repo}`;
|
|
119
141
|
exports.rotuloDaForja = rotuloDaForja;
|
|
142
|
+
/** O mesmo repositorio: tipo, host e repo. A porta da API nao entra, senao o mesmo repo por ssh, https e `gitlab:host/g/r` nao casaria. */
|
|
120
143
|
const mesmaForja = (a, b) => !!a && !!b && a.tipo === b.tipo && a.host === b.host && a.repo.toLowerCase() === b.repo.toLowerCase();
|
|
121
144
|
exports.mesmaForja = mesmaForja;
|
|
122
145
|
// ---------------------------------------------------------------------------
|
|
123
146
|
// Erros
|
|
124
147
|
// ---------------------------------------------------------------------------
|
|
148
|
+
/**
|
|
149
|
+
* O texto inteiro sem segredo. Os tokens do GitLab podem ter ponto (formato roteavel, `glpat-xxxx.01.yyyy`), por isso a
|
|
150
|
+
* classe inclui o ponto e nao ha `\b` no fim, que cortaria no ponto e deixaria o sufixo; o token de registro de runner
|
|
151
|
+
* legado tem o prefixo fixo `GR1348941`.
|
|
152
|
+
*/
|
|
153
|
+
function redigirDaForja(texto) {
|
|
154
|
+
return (0, hitl_1.redigirSegredos)(texto)
|
|
155
|
+
.replace(/\b(?:glpat|gldt|glrt|glptt|glcbt|gloas|glft|glimt|glsoat)-[A-Za-z0-9_.-]{16,}/g, '[redigido]')
|
|
156
|
+
.replace(/\bGR1348941[A-Za-z0-9_-]{20,}/g, '[redigido]')
|
|
157
|
+
.replace(/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g, '[redigido]');
|
|
158
|
+
}
|
|
159
|
+
const OMITIDO = '[detalhe omitido: um padrão de segredo casou]';
|
|
125
160
|
/** O fim da saida de erro, sem segredo: redigido, e descartado inteiro se ainda casar um padrao. */
|
|
126
161
|
function detalheSeguro(texto) {
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
162
|
+
const linha = redigirDaForja(texto).split('\n').map((l) => l.trim()).filter(Boolean).slice(-2).join(' ').slice(0, 240);
|
|
163
|
+
return (0, policies_1.procurarSegredos)(linha).length ? OMITIDO : linha;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* O motivo de um `git push` recusado, sem segredo. O texto inteiro e redigido antes do corte; as linhas `hint:` saem,
|
|
167
|
+
* e fica o comeco do resto (ate 400 caracteres), onde o git poe o `! [rejected]` ou `! [remote rejected]` e o
|
|
168
|
+
* `error: failed to push`. Guardar so o fim perderia o motivo: num non-fast-forward, as ultimas linhas sao hints.
|
|
169
|
+
*/
|
|
170
|
+
function detalheDoPush(texto) {
|
|
171
|
+
const linhas = redigirDaForja(texto).split('\n').map((l) => l.trim()).filter((l) => l && !/^hint:/i.test(l));
|
|
172
|
+
const detalhe = linhas.join(' ').slice(0, 400);
|
|
173
|
+
return (0, policies_1.procurarSegredos)(detalhe).length ? OMITIDO : detalhe;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* O push recusado pela protecao da branch. O GitHub diz `GH006: Protected branch update failed` e
|
|
177
|
+
* `protected branch hook declined`; o GitLab diz `You are not allowed to push code to protected branches` (ou
|
|
178
|
+
* `force push code to a protected branch`) antes do `pre-receive hook declined`. O `GH013` (regras do repositorio) e
|
|
179
|
+
* generico: tambem vem da protecao contra segredo, de regra de caminho ou de mensagem de commit. Por isso so conta com
|
|
180
|
+
* o sinal da protecao da branch na mesma saida (`Changes must be made through a pull request` ou `Cannot update this
|
|
181
|
+
* protected ref`), e nunca com `PUSH PROTECTION` / `Push cannot contain secrets`. O `pre-receive hook declined` sozinho
|
|
182
|
+
* e de qualquer gancho, e o "not allowed to push code to this project" do GitLab e falta de acesso ao projeto.
|
|
183
|
+
*/
|
|
184
|
+
function pushRecusadoPelaProtecao(texto) {
|
|
185
|
+
if (/PUSH PROTECTION|Push cannot contain secrets/i.test(texto))
|
|
186
|
+
return false;
|
|
187
|
+
if (/\bGH006\b|protected branch hook declined|not allowed to (?:force )?push code to (?:a )?protected branch/i.test(texto))
|
|
188
|
+
return true;
|
|
189
|
+
return /\bGH013\b|repository rule violations/i.test(texto)
|
|
190
|
+
&& /Changes must be made through a pull request|Cannot update this protected ref/i.test(texto);
|
|
132
191
|
}
|
|
133
192
|
function erro(codigo, detalhe) {
|
|
134
193
|
return { ok: false, erro: { codigo, detalhe } };
|
|
@@ -138,16 +197,16 @@ function classificarFalha(cmd, s) {
|
|
|
138
197
|
if (s.erro === 'ENOENT')
|
|
139
198
|
return { codigo: 'forja.ausente', detalhe: `${cmd} não está instalado nesta máquina` };
|
|
140
199
|
if (s.erro === 'ETIMEDOUT' || s.sinal === 'SIGTERM')
|
|
141
|
-
return { codigo: 'forja.
|
|
200
|
+
return { codigo: 'forja.indisponivel', detalhe: `${cmd} não respondeu em ${PRAZO_MS / 1000} s` };
|
|
142
201
|
const texto = `${s.stderr}\n${s.stdout}`;
|
|
143
202
|
const detalhe = detalheSeguro(s.stderr || s.stdout || s.erro || `${cmd} saiu com ${s.status}`);
|
|
144
203
|
if (/"type"\s*:\s*"NOT_FOUND"|Could not resolve to a Repository|404 Not Found|HTTP 404|project not found/i.test(texto)) {
|
|
145
|
-
return { codigo: 'forja.nao-
|
|
204
|
+
return { codigo: 'forja.nao-achei', detalhe };
|
|
146
205
|
}
|
|
147
206
|
if (/auth login|not logged|authentication|HTTP 401|Bad credentials|GH_TOKEN|GITLAB_TOKEN|unauthorized|no token/i.test(texto)) {
|
|
148
207
|
return { codigo: 'forja.sem-login', detalhe };
|
|
149
208
|
}
|
|
150
|
-
return { codigo: 'forja.
|
|
209
|
+
return { codigo: 'forja.indisponivel', detalhe };
|
|
151
210
|
}
|
|
152
211
|
const obj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
153
212
|
class RespostaInvalida extends Error {
|
|
@@ -170,7 +229,7 @@ function chamarJson(executor, cmd, args, corpo) {
|
|
|
170
229
|
const falha = classificarFalha(cmd, s.erro || s.status !== 0 ? s : { ...s, status: 1, stderr: JSON.stringify(json) });
|
|
171
230
|
// `gh` sai 1 com NOT_FOUND no corpo: o tipo do erro GraphQL vale mais que a frase.
|
|
172
231
|
if (erros && json.errors.some((e) => obj(e) && e.type === 'NOT_FOUND')) {
|
|
173
|
-
return { ok: false, erro: { codigo: 'forja.nao-
|
|
232
|
+
return { ok: false, erro: { codigo: 'forja.nao-achei', detalhe: falha.detalhe } };
|
|
174
233
|
}
|
|
175
234
|
return { ok: false, erro: falha };
|
|
176
235
|
}
|
|
@@ -178,10 +237,7 @@ function chamarJson(executor, cmd, args, corpo) {
|
|
|
178
237
|
return { ok: false, erro: { codigo: 'forja.resposta-invalida', detalhe: `${cmd} não devolveu JSON` } };
|
|
179
238
|
return { ok: true, json };
|
|
180
239
|
}
|
|
181
|
-
/**
|
|
182
|
-
* O host vai sempre explicito: sem ele, o `gh` usa `GH_HOST` ou o unico host com login, e o `glab`,
|
|
183
|
-
* o host do remoto do cwd; a consulta iria para outra forja.
|
|
184
|
-
*/
|
|
240
|
+
/** So o `gh`: o host vai sempre explicito, ou ele usaria `GH_HOST` ou o unico host com login e a consulta iria para outra forja. */
|
|
185
241
|
const hostnameDe = (f) => ['--hostname', f.host];
|
|
186
242
|
function arquivosDoGithub(entrada, dir) {
|
|
187
243
|
if (entrada === null)
|
|
@@ -220,19 +276,27 @@ function commitsDoHistorico(historico, onde) {
|
|
|
220
276
|
parciais: obj(h.pageInfo) && h.pageInfo.hasNextPage === true,
|
|
221
277
|
};
|
|
222
278
|
}
|
|
223
|
-
/**
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
lista = undefined;
|
|
279
|
+
/** A API do GitLab de uma forja: o host e a porta da API, e o caminho base e a CA quando vieram do bloco `forja:`. */
|
|
280
|
+
const apiDoGitlab = (forja, opcoes = {}) => (0, api_1.chamadorDaApi)({ tipo: 'gitlab', host: forja.host, porta: forja.porta ?? null, caminhoBase: forja.caminhoBase ?? '', ca: forja.ca ?? null }, opcoes);
|
|
281
|
+
exports.apiDoGitlab = apiDoGitlab;
|
|
282
|
+
/** Uma consulta GraphQL do GitLab; `errors` no corpo e erro tipado, nunca resposta. */
|
|
283
|
+
function graphqlDoGitlab(api, query, variables) {
|
|
284
|
+
const r = api({ metodo: 'POST', caminho: 'graphql', corpo: { query, variables }, prazoMs: PRAZO_MS });
|
|
285
|
+
if (!r.ok)
|
|
286
|
+
return r;
|
|
287
|
+
const json = r.valor.corpo;
|
|
288
|
+
if (obj(json) && Array.isArray(json.errors) && json.errors.length) {
|
|
289
|
+
return { ok: false, erro: { codigo: 'forja.resposta-invalida', detalhe: detalheSeguro(JSON.stringify(json.errors)) } };
|
|
235
290
|
}
|
|
291
|
+
return { ok: true, json };
|
|
292
|
+
}
|
|
293
|
+
/** Os commits da base desde `desde`, pelo REST do GitLab (GET), e se vieram 100 (pagina cheia). */
|
|
294
|
+
function commitsDoGitlab(forja, commit, desde, api) {
|
|
295
|
+
const r = api({ metodo: 'GET', caminho: `${(0, pedidos_1.projetoNaApi)(forja.repo)}/repository/commits?ref_name=${encodeURIComponent(commit)}` +
|
|
296
|
+
`&since=${encodeURIComponent(desde)}&per_page=100`, prazoMs: PRAZO_MS });
|
|
297
|
+
if (!r.ok)
|
|
298
|
+
return r;
|
|
299
|
+
const lista = r.valor.corpo;
|
|
236
300
|
exigir(Array.isArray(lista), 'commits');
|
|
237
301
|
const commits = lista.map((c) => {
|
|
238
302
|
exigir(obj(c) && typeof c.id === 'string' && typeof c.title === 'string' && typeof c.committed_date === 'string', 'commit');
|
|
@@ -289,30 +353,9 @@ function lerDoGithub(forja, pedido, executor, lidoEm) {
|
|
|
289
353
|
return { ok: true, leitura: { forja, lidoEm, chamadas: 1, base: leituraDaBase,
|
|
290
354
|
reservas: estado(repo.reservas, pedido.reservas), fabrica: estado(repo.fabrica, pedido.fabrica) } };
|
|
291
355
|
}
|
|
292
|
-
|
|
293
|
-
const CONSULTA_ARVORES_GITLAB = `query($path: ID!, $base: String!, $dirRoadmap: String!, $refReservas: String!, $dirReservas: String!,
|
|
294
|
-
$refFabrica: String!, $dirFabrica: String!) {
|
|
295
|
-
project(fullPath: $path) { repository {
|
|
296
|
-
baseTopo: tree(ref: $base) { lastCommit { sha committedDate } }
|
|
297
|
-
baseDir: tree(ref: $base, path: $dirRoadmap) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
|
|
298
|
-
reservasTopo: tree(ref: $refReservas) { lastCommit { sha committedDate } }
|
|
299
|
-
reservasDir: tree(ref: $refReservas, path: $dirReservas) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
|
|
300
|
-
fabricaTopo: tree(ref: $refFabrica) { lastCommit { sha committedDate } }
|
|
301
|
-
fabricaDir: tree(ref: $refFabrica, path: $dirFabrica) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
|
|
302
|
-
} }
|
|
303
|
-
}`;
|
|
304
|
-
/** Os blobs de cada ponta que existe; so as partes pedidas entram na consulta (texto fixo, sem interpolar o pedido). */
|
|
305
|
-
function consultaDeBlobsDoGitlab(partes) {
|
|
306
|
-
const sufixo = { base: 'Base', reservas: 'Reservas', fabrica: 'Fabrica' };
|
|
307
|
-
const declaracoes = ['$path: ID!', ...partes.flatMap((p) => [`$ref${sufixo[p]}: String!`, `$paths${sufixo[p]}: [String!]!`])];
|
|
308
|
-
const campos = partes.map((p) => `${p}: blobs(ref: $ref${sufixo[p]}, paths: $paths${sufixo[p]}, first: 100) ` +
|
|
309
|
-
'{ pageInfo { hasNextPage } nodes { path rawTextBlob } }');
|
|
310
|
-
return `query(${declaracoes.join(', ')}) { project(fullPath: $path) { repository { ${campos.join(' ')} } } }`;
|
|
311
|
-
}
|
|
312
|
-
function lerDoGitlab(forja, pedido, executor, lidoEm) {
|
|
313
|
-
const args = ['api', 'graphql', '--method', 'POST', '--input', '-', ...hostnameDe(forja)];
|
|
356
|
+
function lerDoGitlab(forja, pedido, api, lidoEm) {
|
|
314
357
|
let chamadas = 0;
|
|
315
|
-
const graphql = (query, variables) => { chamadas++; return
|
|
358
|
+
const graphql = (query, variables) => { chamadas++; return graphqlDoGitlab(api, query, variables); };
|
|
316
359
|
const repositorio = (json) => {
|
|
317
360
|
const projeto = obj(json) && obj(json.data) ? json.data.project : undefined;
|
|
318
361
|
if (projeto === null)
|
|
@@ -322,13 +365,13 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
|
|
|
322
365
|
};
|
|
323
366
|
let base = pedido.base ?? null;
|
|
324
367
|
if (!base) {
|
|
325
|
-
const r = graphql(CONSULTA_RAIZ_GITLAB, { path: forja.repo });
|
|
368
|
+
const r = graphql(consultas_1.CONSULTA_RAIZ_GITLAB, { path: forja.repo });
|
|
326
369
|
if (!r.ok)
|
|
327
370
|
return r;
|
|
328
371
|
const raiz = repositorio(r.json).rootRef;
|
|
329
372
|
base = typeof raiz === 'string' && raiz ? raiz : null;
|
|
330
373
|
}
|
|
331
|
-
const arvores = graphql(CONSULTA_ARVORES_GITLAB, { path: forja.repo, base: base ?? 'HEAD', dirRoadmap: pedido.dirRoadmap,
|
|
374
|
+
const arvores = graphql(consultas_1.CONSULTA_ARVORES_GITLAB, { path: forja.repo, base: base ?? 'HEAD', dirRoadmap: pedido.dirRoadmap,
|
|
332
375
|
refReservas: pedido.reservas.branch, dirReservas: pedido.reservas.dir, refFabrica: pedido.fabrica.branch, dirFabrica: pedido.fabrica.dir });
|
|
333
376
|
if (!arvores.ok)
|
|
334
377
|
return arvores;
|
|
@@ -373,7 +416,7 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
|
|
|
373
416
|
variaveis[`ref${sufixo[parte]}`] = ponta.commit;
|
|
374
417
|
variaveis[`paths${sufixo[parte]}`] = paths;
|
|
375
418
|
}
|
|
376
|
-
const blobs = graphql(consultaDeBlobsDoGitlab(pedidos.map(([parte]) => parte)), variaveis);
|
|
419
|
+
const blobs = graphql((0, consultas_1.consultaDeBlobsDoGitlab)(pedidos.map(([parte]) => parte)), variaveis);
|
|
377
420
|
if (!blobs.ok)
|
|
378
421
|
return blobs;
|
|
379
422
|
conteudo = repositorio(blobs.json);
|
|
@@ -394,7 +437,7 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
|
|
|
394
437
|
let commitsParciais = false;
|
|
395
438
|
if (pontaBase) {
|
|
396
439
|
chamadas++;
|
|
397
|
-
const r = commitsDoGitlab(forja, pontaBase.commit, pedido.desde,
|
|
440
|
+
const r = commitsDoGitlab(forja, pontaBase.commit, pedido.desde, api);
|
|
398
441
|
if (!r.ok)
|
|
399
442
|
return r;
|
|
400
443
|
commits = r.commits;
|
|
@@ -418,12 +461,12 @@ const CONSULTA_DE_COMMITS_GITHUB = `query($owner: String!, $name: String!, $oid:
|
|
|
418
461
|
* So os commits de um commit da base desde `desde`, quando a janela da primeira leitura ficou curta:
|
|
419
462
|
* o fuso do projeto so se conhece depois de ler o manifesto dele (achado 5 da rodada 2). So consulta.
|
|
420
463
|
*/
|
|
421
|
-
function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao) {
|
|
464
|
+
function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao, api) {
|
|
422
465
|
if (!SHA.test(pedido.commit))
|
|
423
466
|
return erro('forja.resposta-invalida', 'commit da base fora do formato');
|
|
424
467
|
try {
|
|
425
468
|
if (forja.tipo === 'gitlab')
|
|
426
|
-
return commitsDoGitlab(forja, pedido.commit, pedido.desde,
|
|
469
|
+
return commitsDoGitlab(forja, pedido.commit, pedido.desde, api ?? (0, exports.apiDoGitlab)(forja));
|
|
427
470
|
const [owner, name] = forja.repo.split('/');
|
|
428
471
|
const r = chamarJson(executor, 'gh', ['api', 'graphql', '--method', 'POST', '--input', '-', ...hostnameDe(forja)], JSON.stringify({ query: CONSULTA_DE_COMMITS_GITHUB, variables: { owner, name, oid: pedido.commit, desde: pedido.desde } }));
|
|
429
472
|
if (!r.ok)
|
|
@@ -444,14 +487,14 @@ function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao) {
|
|
|
444
487
|
* Le da forja a base (com `docs/roadmap`, o manifesto e os commits desde `desde`) e as duas branches
|
|
445
488
|
* de estado. So consulta; qualquer falha volta como erro tipado, com o detalhe redigido.
|
|
446
489
|
*/
|
|
447
|
-
function lerDaForja(forja, pedido, executor = exports.executorPadrao) {
|
|
490
|
+
function lerDaForja(forja, pedido, executor = exports.executorPadrao, api) {
|
|
448
491
|
const lidoEm = pedido.lidoEm ?? new Date().toISOString();
|
|
449
492
|
try {
|
|
450
|
-
return forja.tipo === 'github' ? lerDoGithub(forja, pedido, executor, lidoEm) : lerDoGitlab(forja, pedido,
|
|
493
|
+
return forja.tipo === 'github' ? lerDoGithub(forja, pedido, executor, lidoEm) : lerDoGitlab(forja, pedido, api ?? (0, exports.apiDoGitlab)(forja), lidoEm);
|
|
451
494
|
}
|
|
452
495
|
catch (e) {
|
|
453
496
|
if (e instanceof NaoEncontrado)
|
|
454
|
-
return erro('forja.nao-
|
|
497
|
+
return erro('forja.nao-achei', `${(0, exports.rotuloDaForja)(forja)} não existe ou não é visível para o login da forja`);
|
|
455
498
|
if (e instanceof RespostaInvalida)
|
|
456
499
|
return erro('forja.resposta-invalida', `resposta fora do formato esperado em ${e.message}`);
|
|
457
500
|
throw e;
|
package/dist/gates.js
CHANGED
|
@@ -28,35 +28,10 @@ const thread_1 = require("./thread");
|
|
|
28
28
|
const hitl_ingress_receipt_1 = require("./hitl-ingress-receipt");
|
|
29
29
|
const hitl_local_receipt_1 = require("./hitl-local-receipt");
|
|
30
30
|
const hitl_contract_1 = require("./hitl-contract");
|
|
31
|
+
const locale_pulse_1 = require("./locale-pulse");
|
|
31
32
|
/** O que cada motivo tipado significa, em uma linha, para a saida do CLI. */
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
'claims.failed': 'alegacao verificavel reprovou na reexecucao no HEAD real',
|
|
35
|
-
'claims.unverifiable': 'alegacao sem comando de verificacao declarado',
|
|
36
|
-
'policy.violation': 'policy do manifesto com severidade block foi violada',
|
|
37
|
-
'runtime.autoconferencia': 'o CHECK foi despachado no mesmo runtime que fez o GO, e a thread exige validacao cruzada',
|
|
38
|
-
'verify.regression': 'comando que passava na baseline falha agora',
|
|
39
|
-
'verify.failed': 'comando de verificacao falhou (sem baseline para separar divida pre-existente)',
|
|
40
|
-
'verify.timeout': 'comando de verificacao estourou o prazo antes de terminar: nao ha veredito sobre ele',
|
|
41
|
-
'verify.sem-veredito': 'a rodada nao produziu veredito valido: comando que nao chegou a rodar, ou produto alterado entre o preparo e o fim',
|
|
42
|
-
'ci.failed': 'CHECK independente ausente, pendente ou reprovado no commit candidato',
|
|
43
|
-
'runtime.unavailable': 'runtime adapter indisponivel para o despacho',
|
|
44
|
-
'runtime.silencio': 'fase despachada sem heartbeat dentro do limite de liveness',
|
|
45
|
-
'runtime.rate-limited': 'o runtime bateu o limite de uso da assinatura e a fase morreu antes de terminar (bloco B3: entra na fila duravel e e retomada na janela seguinte)',
|
|
46
|
-
'runtime.quota-exhausted': 'a cota ou os creditos da conta do runtime acabaram (I-33: o perfil sai do rodizio e a fase segue em outro perfil, outro runtime ou na fila)',
|
|
47
|
-
'runtime.auth-missing': 'a conta do runtime nao esta autenticada (I-33: o perfil nunca recebe despacho ate o login ser refeito pelo proprio CLI)',
|
|
48
|
-
'runtime.model-unavailable': 'o modelo pedido nao existe ou a conta nao tem acesso a ele (RM-037: o perfil segue no rodizio e a fase vai a outro perfil com o mesmo modelo ou ao fallback do bloco)',
|
|
49
|
-
'runtime.profile-invalid': 'o perfil pedido no despacho (--perfil) nao existe no store ou e de outro runtime (RM-056: o despacho nunca troca de perfil sozinho)',
|
|
50
|
-
'runtime.workspace-untrusted': 'o runtime nao confia no diretorio da worktree e recusou o despacho (RM-055: so o dono aceita a confianca no terminal; depois o ork re-despacha o mesmo prompt)',
|
|
51
|
-
'runtime.consent-pending': 'o runtime espera o dono aceitar termos novos e recusou o despacho (RM-055: so o dono aceita no terminal; depois o ork re-despacha o mesmo prompt)',
|
|
52
|
-
'cost.violation': 'o despacho seria redirecionado para provider pago (violacao de custo: e o unico motivo que NUNCA recebe retry automatico)',
|
|
53
|
-
'tree.blocked': 'a arvore de destino nao esta disponivel para o merge (branch em check-out com alteracao nao commitada, ou worktree que nao pode ser montada)',
|
|
54
|
-
'lease.busy': 'lease ocupado por outra thread',
|
|
55
|
-
'lease.resume-unavailable': 'retomada indisponivel; libere o lease explicitamente com --forcar',
|
|
56
|
-
'conducao.em-andamento': 'outra conducao ja executa na worktree da thread (I-36): o pedido foi recusado com quem conduz e as tres acoes (esperar, acompanhar, assumir)',
|
|
57
|
-
'hitl.formato': 'o pedido HITL saiu fora do formato obrigatorio (pergunta em uma frase, de 3 a 5 alternativas rotuladas com consequencia, exatamente uma com o selo Recomendacao e o porque, corpo em lista; texto livre so com dependencia tecnica tipada)',
|
|
58
|
-
'human.pending': 'gate humano do modo de conducao ainda nao autorizou',
|
|
59
|
-
};
|
|
33
|
+
// RM-061 (F2b): a fonte e o catalogo pt-BR (`locale-pulse.ts`), com o ingles ao lado; o texto nao muda.
|
|
34
|
+
exports.DESCRICAO_DO_MOTIVO = locale_pulse_1.PULSE_PT_BR.motivos;
|
|
60
35
|
/**
|
|
61
36
|
* Motivos que reprovam em QUALQUER modo, inclusive `#Auto`.
|
|
62
37
|
*
|
package/dist/handoff.js
CHANGED
|
@@ -73,6 +73,15 @@ const phase_1 = require("./phase");
|
|
|
73
73
|
const thread_1 = require("./thread");
|
|
74
74
|
const memoria_1 = require("./memoria");
|
|
75
75
|
const util_1 = require("./util");
|
|
76
|
+
const verify_1 = require("./verify");
|
|
77
|
+
const procedencia_1 = require("./procedencia");
|
|
78
|
+
const locale_1 = require("./locale");
|
|
79
|
+
/** RM-037 (defeito 1 de 19 e 20/10/2026): o rotulo de cada comando da baseline no handoff, que vai em pt-BR. */
|
|
80
|
+
const ROTULO_DA_BASELINE = {
|
|
81
|
+
passava: 'passava',
|
|
82
|
+
'ja-falhava': 'ja falhava',
|
|
83
|
+
'sem-veredito': 'sem veredito (estouro, sinal, relogio sob steal ou nao rodou: nao vale como ja falhava)',
|
|
84
|
+
};
|
|
76
85
|
/** sha256 de um arquivo em disco, a prova de proveniencia de cada item. */
|
|
77
86
|
function sha256DoArquivo(caminho) {
|
|
78
87
|
if (!fs.existsSync(caminho))
|
|
@@ -98,7 +107,8 @@ function caminhoDoArtefato(raiz, thread, arquivo) {
|
|
|
98
107
|
? [path.resolve(thread.worktree, arquivo), path.resolve(raiz, arquivo)]
|
|
99
108
|
: [path.resolve(raiz, arquivo)];
|
|
100
109
|
for (const c of candidatos) {
|
|
101
|
-
|
|
110
|
+
// RM-047 (P2): o arquivo da claim vem do estado; fora da raiz e da worktree registrada, não vira ponteiro.
|
|
111
|
+
if (fs.existsSync(c) && fs.statSync(c).isFile() && (0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, c))
|
|
102
112
|
return c;
|
|
103
113
|
}
|
|
104
114
|
return null;
|
|
@@ -215,14 +225,15 @@ function exportarHandoff(carregado, threadId, opcoes = {}) {
|
|
|
215
225
|
if (thread.baseline) {
|
|
216
226
|
const b = thread.baseline;
|
|
217
227
|
addInline('Baseline gravada antes do GO', `commit ${b.commit} em ${b.gravadaEm}\n` +
|
|
218
|
-
|
|
228
|
+
// RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito na baseline nao e divida anterior.
|
|
229
|
+
b.comandos.map((c) => ` ${c.nome}: ${ROTULO_DA_BASELINE[(0, verify_1.vereditoDaBaseline)(c)]} (${c.comando})`).join('\n'), proveniencia(raiz, caminhoThreadJson, 'json:baseline'));
|
|
219
230
|
}
|
|
220
231
|
// IMPORTANTE: os prompts ja despachados, com o pedido original do builder.
|
|
221
232
|
for (const s of thread.sessoes) {
|
|
222
233
|
if (s.origem === 'adocao')
|
|
223
234
|
continue;
|
|
224
235
|
const caminhoPrompt = path.resolve(raiz, s.promptPath);
|
|
225
|
-
if (!fs.existsSync(caminhoPrompt))
|
|
236
|
+
if (!fs.existsSync(caminhoPrompt) || !(0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, caminhoPrompt))
|
|
226
237
|
continue;
|
|
227
238
|
addPonteiro(`Prompt da sessao ${s.slug} (fase ${s.fase})`, caminhoPrompt, 'pedido-do-builder', s.fase);
|
|
228
239
|
}
|
|
@@ -261,7 +272,7 @@ function exportarHandoff(carregado, threadId, opcoes = {}) {
|
|
|
261
272
|
for (const e of anteriores) {
|
|
262
273
|
const arquivo = (0, memoria_1.arquivoDoHandoff)(e);
|
|
263
274
|
const emDisco = arquivo ? path.resolve(raiz, arquivo) : '';
|
|
264
|
-
if (!emDisco || !fs.existsSync(emDisco))
|
|
275
|
+
if (!emDisco || !fs.existsSync(emDisco) || !(0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, emDisco))
|
|
265
276
|
continue;
|
|
266
277
|
addPonteiro(`Handoff anterior desta thread (${arquivo})`, emDisco, 'tudo', proximaFase, `orkmind://handoff/${e.id}`);
|
|
267
278
|
}
|
|
@@ -270,7 +281,7 @@ function exportarHandoff(carregado, threadId, opcoes = {}) {
|
|
|
270
281
|
for (const e of (0, memoria_1.licoesDoProduto)(memoria, manifesto, threadId)) {
|
|
271
282
|
const postmortem = (0, memoria_1.postmortemDaLicao)(e);
|
|
272
283
|
const emDisco = postmortem ? path.resolve(raiz, postmortem) : '';
|
|
273
|
-
if (!emDisco || !fs.existsSync(emDisco))
|
|
284
|
+
if (!emDisco || !fs.existsSync(emDisco) || !(0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, emDisco))
|
|
274
285
|
continue;
|
|
275
286
|
addPonteiro(`Licao da thread ${(0, memoria_1.threadDaEntrada)(e) ?? '(anterior)'}`, emDisco, 'json:resumo', 'MASTER', `orkmind://learning/${e.id}`);
|
|
276
287
|
}
|
|
@@ -398,9 +409,11 @@ function recall(carregado, threadId, ponteiro) {
|
|
|
398
409
|
if (!fs.existsSync(caminho) || !fs.statSync(caminho).isFile()) {
|
|
399
410
|
throw new Error(`ponteiro nao resolve: arquivo "${bruto}" nao existe a partir de ${raiz}`);
|
|
400
411
|
}
|
|
401
|
-
|
|
412
|
+
// RM-047 (P2): o `location` vem do handoff.json (estado, talvez versionado); só lê dentro do projeto.
|
|
413
|
+
const real = (0, procedencia_1.exigirCaminhoContido)(raiz, (0, thread_1.lerThread)(raiz, threadId), caminho, bruto);
|
|
414
|
+
const conteudoBruto = fs.readFileSync(real, 'utf8');
|
|
402
415
|
const linhas = conteudoBruto.split('\n');
|
|
403
|
-
const sha = sha256DoArquivo(
|
|
416
|
+
const sha = sha256DoArquivo(real);
|
|
404
417
|
const base = { location: `${bruto}#${ancora}`, caminho, ancora, sha256: sha };
|
|
405
418
|
const registrarRecall = (r) => {
|
|
406
419
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.handoffRecuperado, {
|
|
@@ -505,33 +518,34 @@ function recall(carregado, threadId, ponteiro) {
|
|
|
505
518
|
}
|
|
506
519
|
/** Texto de `ork handoff export`. */
|
|
507
520
|
function textoDoHandoff(h, caminho) {
|
|
521
|
+
const m = (0, locale_1.msg)().operacao.restante.handoff;
|
|
508
522
|
const linhas = [];
|
|
509
|
-
linhas.push(
|
|
510
|
-
linhas.push(
|
|
511
|
-
linhas.push(
|
|
512
|
-
linhas.push(
|
|
523
|
+
linhas.push(m.exportado(h.thread, h.memory));
|
|
524
|
+
linhas.push(m.de(h.de.slug, h.de.fase));
|
|
525
|
+
linhas.push(m.para(h.para.slug, h.para.fase));
|
|
526
|
+
linhas.push(m.arquivo(caminho));
|
|
513
527
|
linhas.push('');
|
|
514
|
-
linhas.push(
|
|
528
|
+
linhas.push(m.critico(h.inline.length));
|
|
515
529
|
for (const i of h.inline) {
|
|
516
530
|
linhas.push(` ${i.id} ${i.titulo}`);
|
|
517
|
-
linhas.push(
|
|
531
|
+
linhas.push(m.proveniencia(i.proveniencia.location, i.proveniencia.sha256.slice(0, 12)));
|
|
518
532
|
}
|
|
519
533
|
linhas.push('');
|
|
520
|
-
linhas.push(
|
|
534
|
+
linhas.push(m.importante(h.pointers.length));
|
|
521
535
|
for (const p of h.pointers) {
|
|
522
536
|
linhas.push(` ${p.id} ${p.titulo}`);
|
|
523
537
|
linhas.push(` location: ${p.location} (sha256 ${p.sha256.slice(0, 12)})`);
|
|
524
538
|
if (p.orkmind)
|
|
525
539
|
linhas.push(` orkmind: ${p.orkmind}`);
|
|
526
|
-
linhas.push(
|
|
527
|
-
linhas.push(
|
|
528
|
-
linhas.push(
|
|
540
|
+
linhas.push(m.quando(p.retrieve_when));
|
|
541
|
+
linhas.push(m.recuperar(p.retrieve_via));
|
|
542
|
+
linhas.push(m.noMomento(h.thread, p.retrieve_when));
|
|
529
543
|
}
|
|
530
544
|
linhas.push('');
|
|
531
|
-
linhas.push(
|
|
545
|
+
linhas.push(m.resumivel(h.summaries.length));
|
|
532
546
|
for (const s of h.summaries) {
|
|
533
547
|
linhas.push(` ${s.id} ${s.text}`);
|
|
534
|
-
linhas.push(
|
|
548
|
+
linhas.push(m.proveniencia(s.provenance.location, s.provenance.sha256.slice(0, 12)));
|
|
535
549
|
}
|
|
536
550
|
return linhas.join('\n');
|
|
537
551
|
}
|