@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/auditrun.js
CHANGED
|
@@ -51,6 +51,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
51
51
|
exports.PACK_DA_SUPERFICIE = exports.VERSAO_DA_RODADA = void 0;
|
|
52
52
|
exports.dirAuditorias = dirAuditorias;
|
|
53
53
|
exports.dirRodada = dirRodada;
|
|
54
|
+
exports.exigirIdDeRodada = exigirIdDeRodada;
|
|
54
55
|
exports.caminhoRodada = caminhoRodada;
|
|
55
56
|
exports.listarRodadas = listarRodadas;
|
|
56
57
|
exports.lerRodada = lerRodada;
|
|
@@ -76,6 +77,7 @@ const adapter = __importStar(require("./adapters/claude-bg"));
|
|
|
76
77
|
const auditoria_1 = require("./auditoria");
|
|
77
78
|
const phase_1 = require("./phase");
|
|
78
79
|
const policies_1 = require("./policies");
|
|
80
|
+
const projeto_alvo_1 = require("./projeto-alvo");
|
|
79
81
|
const manifest_1 = require("./manifest");
|
|
80
82
|
const ledger_1 = require("./ledger");
|
|
81
83
|
const divida_1 = require("./divida");
|
|
@@ -85,6 +87,7 @@ const thread_1 = require("./thread");
|
|
|
85
87
|
const util_1 = require("./util");
|
|
86
88
|
const verify_1 = require("./verify");
|
|
87
89
|
const horario_1 = require("./horario");
|
|
90
|
+
const locale_1 = require("./locale");
|
|
88
91
|
/** Versao do formato de `run.json`. */
|
|
89
92
|
exports.VERSAO_DA_RODADA = 1;
|
|
90
93
|
/** Diretorio das rodadas de auditoria do projeto. */
|
|
@@ -93,7 +96,17 @@ function dirAuditorias(raiz) {
|
|
|
93
96
|
}
|
|
94
97
|
/** Diretorio de uma rodada. */
|
|
95
98
|
function dirRodada(raiz, id) {
|
|
96
|
-
return path.join(dirAuditorias(raiz), id);
|
|
99
|
+
return path.join(dirAuditorias(raiz), exigirIdDeRodada(id));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* RM-047 (fronteira de confiança): o id da rodada vira nome de pasta e de relatório, e o `run.json` que o
|
|
103
|
+
* traz pode ter vindo do clone. Um segmento só, como o que `novoIdDeRodada` gera, sem `/` nem `..`.
|
|
104
|
+
*/
|
|
105
|
+
function exigirIdDeRodada(id) {
|
|
106
|
+
if (typeof id !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(id) || id.includes('..')) {
|
|
107
|
+
throw new Error(`audit.rodada-invalida: id de rodada ${JSON.stringify(String(id)).slice(0, 60)} não é um nome simples`);
|
|
108
|
+
}
|
|
109
|
+
return id;
|
|
97
110
|
}
|
|
98
111
|
/** Caminho do `run.json` da rodada. */
|
|
99
112
|
function caminhoRodada(raiz, id) {
|
|
@@ -372,6 +385,9 @@ function rodarAuditoria(carregado, pack, opcoes = {}) {
|
|
|
372
385
|
cwd: raiz,
|
|
373
386
|
model: base.custo.model,
|
|
374
387
|
effort,
|
|
388
|
+
// RM-052 (fatia 2, D2, aviso A1 do CHECK): a sessao da auditoria roda na raiz do projeto e le o
|
|
389
|
+
// projeto pelo proprio cwd; o `ORK_PROJETO` e o modo host de quem chamou (ou do daemon) nao a seguem.
|
|
390
|
+
ambienteExtra: { ...projeto_alvo_1.AMBIENTE_SEM_PROJETO_HERDADO },
|
|
375
391
|
});
|
|
376
392
|
if (!resultado.ok || !resultado.sessionId) {
|
|
377
393
|
const rodada = {
|
|
@@ -724,7 +740,7 @@ function relatorioDaRodada(carregado, rodadaId, opcoes = {}) {
|
|
|
724
740
|
(0, util_1.gravar)(caminho, texto);
|
|
725
741
|
let publicado = null;
|
|
726
742
|
if (opcoes.publicar) {
|
|
727
|
-
publicado = path.join(raiz, 'docs', 'audit', `${rodada.id}.md`);
|
|
743
|
+
publicado = path.join(raiz, 'docs', 'audit', `${exigirIdDeRodada(rodada.id)}.md`);
|
|
728
744
|
(0, util_1.gravar)(publicado, texto);
|
|
729
745
|
}
|
|
730
746
|
rodada.status = 'relatada';
|
|
@@ -744,9 +760,10 @@ function relatorioDaRodada(carregado, rodadaId, opcoes = {}) {
|
|
|
744
760
|
// ---------------------------------------------------------------------------
|
|
745
761
|
/** Tabela de `ork audit list`. */
|
|
746
762
|
function tabelaDeRodadas(raiz) {
|
|
763
|
+
const m = (0, locale_1.msg)().audit.rodadas;
|
|
747
764
|
const ids = listarRodadas(raiz);
|
|
748
765
|
if (ids.length === 0) {
|
|
749
|
-
return
|
|
766
|
+
return m.vazia;
|
|
750
767
|
}
|
|
751
768
|
const linhas = ids.map((id) => {
|
|
752
769
|
const r = lerRodada(raiz, id);
|
|
@@ -758,92 +775,93 @@ function tabelaDeRodadas(raiz) {
|
|
|
758
775
|
r.status,
|
|
759
776
|
r.motivo ?? '-',
|
|
760
777
|
String(r.achados.length),
|
|
761
|
-
r.veredito ? (r.veredito.ok ?
|
|
778
|
+
r.veredito ? (r.veredito.ok ? m.sustentado : m.reprovado) : m.naoVerificado,
|
|
762
779
|
r.escopo.since ?? 'total',
|
|
763
780
|
];
|
|
764
781
|
});
|
|
765
|
-
return (0, util_1.tabela)([
|
|
782
|
+
return (0, util_1.tabela)([...m.cabecalho], linhas);
|
|
766
783
|
}
|
|
767
784
|
/** Texto de `ork audit show`. */
|
|
768
785
|
function textoDaRodada(raiz, id) {
|
|
769
786
|
const r = lerRodada(raiz, id);
|
|
770
787
|
const achados = (0, divida_1.achadosDaRodada)(raiz, id);
|
|
771
788
|
const L = [];
|
|
772
|
-
|
|
773
|
-
L.push(
|
|
774
|
-
L.push(
|
|
775
|
-
L.push(
|
|
776
|
-
L.push(
|
|
777
|
-
L.push(
|
|
778
|
-
L.push(
|
|
779
|
-
L.push(
|
|
789
|
+
const m = (0, locale_1.msg)().audit.rodadas;
|
|
790
|
+
L.push(m.titulo(r.id));
|
|
791
|
+
L.push(m.campo(m.campos.pack, `${r.pack} (${auditoria_1.PACKS[r.pack].titulo})`));
|
|
792
|
+
L.push(m.campo(m.campos.produto, `${r.produto} ${m.perfil(r.perfil)}`));
|
|
793
|
+
L.push(m.campo(m.campos.estagio, `${r.estagio}, ${m.postura(r.postura)}`));
|
|
794
|
+
L.push(m.campo(m.campos.escopo, r.escopo.detalhe));
|
|
795
|
+
L.push(m.campo(m.campos.graphify, r.escopo.graphify));
|
|
796
|
+
L.push(m.campo(m.campos.custo, m.custo(r.custo.effort, r.custo.model)));
|
|
797
|
+
L.push(m.campo(m.campos.janela, r.custo.janela.detalhe));
|
|
780
798
|
if (r.custo.autorizadaPor)
|
|
781
|
-
L.push(
|
|
782
|
-
L.push(
|
|
783
|
-
L.push(
|
|
784
|
-
L.push(
|
|
799
|
+
L.push(m.campo(m.campos.autorizada, m.autorizada(r.custo.autorizadaPor)));
|
|
800
|
+
L.push(m.campo(m.campos.runtime, `${r.runtime}, ${m.detalhes.sessao(r.sessionId ?? m.sessaoAusente)}`));
|
|
801
|
+
L.push(m.campo(m.campos.prompt, `${r.promptPath} (sha256 ${r.promptSha256 || m.promptAusente})`));
|
|
802
|
+
L.push(m.campo(m.campos.status, `${r.status}${r.motivo ? ` ${m.motivo(r.motivo)}` : ''}`));
|
|
785
803
|
if (r.superficie) {
|
|
786
|
-
L.push(
|
|
787
|
-
L.push(`
|
|
788
|
-
`frameworks: ${r.superficie.frameworks.join(', ') || '(nenhum reconhecido)'}`);
|
|
804
|
+
L.push(m.campo(m.campos.superficie, r.superficie.detalhe));
|
|
805
|
+
L.push(` ${m.superficieResumo(r.superficie.registrados, r.superficie.aConfirmar, r.superficie.frameworks.join(', ') || m.nenhumFramework)}`);
|
|
789
806
|
}
|
|
790
807
|
if (r.detalhe)
|
|
791
|
-
L.push(
|
|
808
|
+
L.push(m.campo(m.campos.detalhe, r.detalhe));
|
|
792
809
|
L.push('');
|
|
793
|
-
L.push(
|
|
810
|
+
L.push(m.achados(achados.length));
|
|
794
811
|
if (achados.length === 0)
|
|
795
|
-
L.push(
|
|
812
|
+
L.push(m.nenhumAchado);
|
|
796
813
|
for (const a of achados)
|
|
797
814
|
L.push((0, divida_1.textoDoAchado)(a));
|
|
798
815
|
L.push('');
|
|
799
816
|
if (r.veredito) {
|
|
800
|
-
L.push(
|
|
801
|
-
`(motivos: ${r.veredito.motivos.join(', ') || 'nenhum'}) no HEAD ${(0, util_1.shaCurto)(r.veredito.commit)}`);
|
|
817
|
+
L.push(m.claims(r.veredito.ok, r.veredito.motivos.join(', '), (0, util_1.shaCurto)(r.veredito.commit)));
|
|
802
818
|
}
|
|
803
819
|
else {
|
|
804
|
-
L.push(
|
|
820
|
+
L.push(m.claimsPendentes(r.id));
|
|
805
821
|
}
|
|
806
822
|
L.push('');
|
|
807
|
-
L.push(
|
|
823
|
+
L.push(m.relatorio(r.id));
|
|
808
824
|
return L.join('\n');
|
|
809
825
|
}
|
|
810
826
|
/** Ledger de uma rodada, para `ork audit show --ledger`. */
|
|
811
827
|
function tabelaDoLedgerDaRodada(raiz, id) {
|
|
828
|
+
const m = (0, locale_1.msg)().audit.rodadas;
|
|
812
829
|
lerRodada(raiz, id);
|
|
813
830
|
const eventos = (0, ledger_1.lerLedger)(dirRodada(raiz, id));
|
|
814
831
|
if (eventos.length === 0)
|
|
815
|
-
return
|
|
832
|
+
return m.ledgerVazio(id);
|
|
816
833
|
const linhas = eventos.map((e) => {
|
|
817
834
|
const detalhe = [];
|
|
818
835
|
if (e.pack)
|
|
819
836
|
detalhe.push(String(e.pack));
|
|
820
837
|
if (e.achado)
|
|
821
|
-
detalhe.push(
|
|
838
|
+
detalhe.push(m.detalhes.achado(String(e.achado)));
|
|
822
839
|
if (e.motivo)
|
|
823
|
-
detalhe.push(
|
|
840
|
+
detalhe.push(m.detalhes.motivo(String(e.motivo)));
|
|
824
841
|
if (e.sessionId)
|
|
825
|
-
detalhe.push(
|
|
842
|
+
detalhe.push(m.detalhes.sessao(String(e.sessionId).slice(0, 8)));
|
|
826
843
|
if (e.veredito)
|
|
827
|
-
detalhe.push(
|
|
844
|
+
detalhe.push(m.detalhes.veredito(String(e.veredito)));
|
|
828
845
|
if (e.destino)
|
|
829
|
-
detalhe.push(
|
|
846
|
+
detalhe.push(m.detalhes.destino(String(e.destino)));
|
|
830
847
|
// `e.thread` e o dono do evento, que aqui e a propria rodada: so vale imprimir quando
|
|
831
848
|
// for OUTRO id, que e o caso do evento finding_to_thread.
|
|
832
849
|
if (e.thread && e.thread !== id)
|
|
833
|
-
detalhe.push(
|
|
850
|
+
detalhe.push(m.detalhes.thread(String(e.thread)));
|
|
834
851
|
if (e.detalhe)
|
|
835
852
|
detalhe.push((0, horario_1.localizarTexto)(String(e.detalhe)).slice(0, 90));
|
|
836
853
|
return [(0, horario_1.formatarDataHora)(e.ts, { segundos: true }), e.tipo, detalhe.join(' | ')];
|
|
837
854
|
});
|
|
838
|
-
return `${(0, util_1.tabela)([
|
|
855
|
+
return `${(0, util_1.tabela)([...m.ledgerCabecalho], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
|
|
839
856
|
}
|
|
840
857
|
/** Quantos achados abertos existem por pack, para o resumo do CLI. */
|
|
841
858
|
function resumoDoBoard(raiz) {
|
|
859
|
+
const m = (0, locale_1.msg)().audit.rodadas;
|
|
842
860
|
const board = (0, divida_1.lerBoard)(raiz);
|
|
843
861
|
if (board.length === 0)
|
|
844
|
-
return
|
|
862
|
+
return m.boardVazio;
|
|
845
863
|
const abertos = board.filter((a) => a.estado === 'aberto').length;
|
|
846
|
-
return
|
|
864
|
+
return m.board(board.length, abertos);
|
|
847
865
|
}
|
|
848
866
|
/**
|
|
849
867
|
* Abre a thread que nasce de um achado de auditoria.
|
|
@@ -857,7 +875,10 @@ function resumoDoBoard(raiz) {
|
|
|
857
875
|
function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
|
|
858
876
|
const { raiz, manifesto } = carregado;
|
|
859
877
|
const achado = (0, divida_1.exigirAchado)(raiz, achadoId);
|
|
860
|
-
|
|
878
|
+
// RM-061 F3c: o pedido vai a arquivo (pedido-goal.md e achado.json) e vira o --prompt do GOAL: e dado, na lingua
|
|
879
|
+
// declarada do dono, nunca na de quem roda nem conforme o --json. So o resultado impresso segue o locale ativo.
|
|
880
|
+
const pedido = (0, locale_1.comLocale)((0, locale_1.linguaDeclaradaDoDono)(manifesto.owner?.language), () => (0, divida_1.pedidoDoAchado)(achado));
|
|
881
|
+
const m = (0, locale_1.msg)().thread.fromFinding;
|
|
861
882
|
if (achado.estado === 'virou-thread' && achado.thread) {
|
|
862
883
|
return {
|
|
863
884
|
ok: false,
|
|
@@ -865,8 +886,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
|
|
|
865
886
|
thread: null,
|
|
866
887
|
pedido,
|
|
867
888
|
motivo: 'achado.ja-virou-thread',
|
|
868
|
-
detalhe:
|
|
869
|
-
correcao:
|
|
889
|
+
detalhe: m.jaVirouThread(achado.id, achado.thread),
|
|
890
|
+
correcao: m.continueNaThread(achado.thread),
|
|
870
891
|
};
|
|
871
892
|
}
|
|
872
893
|
if (achado.claim.estado === 'pendente') {
|
|
@@ -876,9 +897,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
|
|
|
876
897
|
thread: null,
|
|
877
898
|
pedido,
|
|
878
899
|
motivo: 'claims.failed',
|
|
879
|
-
detalhe:
|
|
880
|
-
|
|
881
|
-
correcao: `prove o achado antes de abrir trabalho: ork audit verify ${achado.rodada}`,
|
|
900
|
+
detalhe: m.claimPendente(achado.claim.id),
|
|
901
|
+
correcao: m.proveOAchado(achado.rodada),
|
|
882
902
|
};
|
|
883
903
|
}
|
|
884
904
|
if (achado.claim.estado === 'reprovado') {
|
|
@@ -888,8 +908,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
|
|
|
888
908
|
thread: null,
|
|
889
909
|
pedido,
|
|
890
910
|
motivo: 'claims.failed',
|
|
891
|
-
detalhe:
|
|
892
|
-
correcao:
|
|
911
|
+
detalhe: m.claimReprovada(achado.claim.id),
|
|
912
|
+
correcao: m.descarteOAchado,
|
|
893
913
|
};
|
|
894
914
|
}
|
|
895
915
|
const modo = opcoes.modo ?? manifesto.conduction.default_mode;
|
|
@@ -913,7 +933,7 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
|
|
|
913
933
|
worktreePor,
|
|
914
934
|
worktreeFalharia,
|
|
915
935
|
motivo: null,
|
|
916
|
-
detalhe:
|
|
936
|
+
detalhe: m.simulacaoDetalhe,
|
|
917
937
|
correcao: '',
|
|
918
938
|
};
|
|
919
939
|
}
|
|
@@ -974,8 +994,8 @@ function abrirThreadDoAchado(carregado, achadoId, opcoes = {}) {
|
|
|
974
994
|
worktreePor,
|
|
975
995
|
motivo: achado.claim.estado === 'nao-verificavel' ? 'claims.unverifiable' : null,
|
|
976
996
|
detalhe: achado.claim.estado === 'nao-verificavel'
|
|
977
|
-
?
|
|
978
|
-
:
|
|
997
|
+
? m.claimSemComando(achado.claim.id)
|
|
998
|
+
: m.achadoAberto(achado.id, thread.id),
|
|
979
999
|
correcao: '',
|
|
980
1000
|
};
|
|
981
1001
|
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PRAZO_MAXIMO_DIAS = exports.ACOES_DA_AUTORIZACAO = exports.ARQUIVO_DA_AUTORIZACAO = exports.CONTRATO_DA_AUTORIZACAO = void 0;
|
|
37
|
+
exports.caminhoDaAutorizacao = caminhoDaAutorizacao;
|
|
38
|
+
exports.lerAutorizacao = lerAutorizacao;
|
|
39
|
+
exports.autorizada = autorizada;
|
|
40
|
+
exports.referenciaDaAutorizacao = referenciaDaAutorizacao;
|
|
41
|
+
exports.linhaDaAutorizacao = linhaDaAutorizacao;
|
|
42
|
+
exports.prazoDoPedido = prazoDoPedido;
|
|
43
|
+
exports.gravarAutorizacao = gravarAutorizacao;
|
|
44
|
+
exports.textoDaAutorizacao = textoDaAutorizacao;
|
|
45
|
+
/**
|
|
46
|
+
* RM-063 (F5): a autorizacao duravel do dono para a varredura agir sozinha nesta maquina.
|
|
47
|
+
*
|
|
48
|
+
* Incidente de 03 a 12/10/2026 (P4 e P5 da pagina da RM-063): o PR #112 foi mesclado e ficou dois dias sem
|
|
49
|
+
* `ork ship registrar-pr`, e as sessoes fantasmas de threads fechadas ficaram registradas, porque nada roda esses
|
|
50
|
+
* comandos sem um condutor. Agora a batida da varredura (`pulse-delivery`) faz isso sozinha, mas SO com a autorizacao
|
|
51
|
+
* do dono gravada nesta maquina, com prazo e com a lista do que ela pode. Sem autorizacao (ou com ela vencida,
|
|
52
|
+
* ilegivel, de outra maquina ou de outro projeto), cada acao vira um item da fila do pulse com o comando pronto.
|
|
53
|
+
*
|
|
54
|
+
* O arquivo e desta maquina e fica fora do git, como o `pulse-host.json` (RM-047):
|
|
55
|
+
* `.orkastery/monitor/autorizacao.json` no checkout canonico. O contrato e `ork.autorizacao-duravel/v1`; a referencia
|
|
56
|
+
* esta em `docs/referencia/contratos/autorizacao-duravel-rm063.md`. A leitura (`lerAutorizacao`) nunca grava; a F7
|
|
57
|
+
* grava pelo `ork conducao autorizar` (`gravarAutorizacao`), ato do dono, na mesma forma que a leitura confere.
|
|
58
|
+
*/
|
|
59
|
+
const fs = __importStar(require("node:fs"));
|
|
60
|
+
const path = __importStar(require("node:path"));
|
|
61
|
+
const node_crypto_1 = require("node:crypto");
|
|
62
|
+
const estado_thread_1 = require("./estado-thread");
|
|
63
|
+
const horario_1 = require("./horario");
|
|
64
|
+
const ledger_1 = require("./ledger");
|
|
65
|
+
const master_1 = require("./master");
|
|
66
|
+
const master_nota_1 = require("./master-nota");
|
|
67
|
+
const maquina_1 = require("./maquina");
|
|
68
|
+
const procedencia_1 = require("./procedencia");
|
|
69
|
+
const runtime_ambiente_1 = require("./runtime-ambiente");
|
|
70
|
+
const util_1 = require("./util");
|
|
71
|
+
const locale_1 = require("./locale");
|
|
72
|
+
exports.CONTRATO_DA_AUTORIZACAO = 'ork.autorizacao-duravel/v1';
|
|
73
|
+
exports.ARQUIVO_DA_AUTORIZACAO = 'autorizacao.json';
|
|
74
|
+
/** Um arquivo de autorizacao tem poucas linhas; acima disto, nao e o que o dono gravou. */
|
|
75
|
+
const TETO_DO_ARQUIVO = 64 * 1024;
|
|
76
|
+
/**
|
|
77
|
+
* As acoes do contrato. A varredura da F5 faz `limpar` (sessoes fantasmas), `registrar` (a entrega de PR ja mesclado)
|
|
78
|
+
* e `master` (o MASTER por omissao); a batida da conducao da F7 (`ork conducao batida`) faz tambem `merge` (o PR verde de
|
|
79
|
+
* branch `ork/*`) e `despachar` (a fase seguinte com o prompt gravado). Tag e publicacao nunca entram.
|
|
80
|
+
*/
|
|
81
|
+
exports.ACOES_DA_AUTORIZACAO = ['limpar', 'registrar', 'master', 'merge', 'despachar'];
|
|
82
|
+
/** O arquivo da autorizacao desta maquina, no checkout canonico (de dentro de uma worktree, o da raiz). */
|
|
83
|
+
function caminhoDaAutorizacao(raiz) {
|
|
84
|
+
return path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery', 'monitor', exports.ARQUIVO_DA_AUTORIZACAO);
|
|
85
|
+
}
|
|
86
|
+
/** A data e a hora existem no calendario (o `Date.parse` aceitaria 30/02 e o levaria a marco, calado). */
|
|
87
|
+
const noCalendario = (v) => {
|
|
88
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/.exec(v);
|
|
89
|
+
if (!m)
|
|
90
|
+
return false;
|
|
91
|
+
const [ano, mes, dia, hora, minuto] = m.slice(1).map(Number);
|
|
92
|
+
const d = new Date(Date.UTC(ano, mes - 1, dia));
|
|
93
|
+
return d.getUTCFullYear() === ano && d.getUTCMonth() === mes - 1 && d.getUTCDate() === dia && hora <= 23 && minuto <= 59;
|
|
94
|
+
};
|
|
95
|
+
/** O instante com o fuso explicito (`Z` ou `-03:00`): sem ele, o prazo dependeria do fuso de quem le. */
|
|
96
|
+
const instante = (v) => typeof v === 'string' &&
|
|
97
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?(Z|[+-]\d{2}:\d{2})$/.test(v) && noCalendario(v) &&
|
|
98
|
+
Number.isFinite(Date.parse(v));
|
|
99
|
+
const textoCurto = (v, teto) => typeof v === 'string' && v.trim() !== '' && v.length <= teto &&
|
|
100
|
+
!/\p{Cc}/u.test(v);
|
|
101
|
+
/**
|
|
102
|
+
* Le e confere a autorizacao desta maquina. Cada recusa tem motivo tipado e detalhe; so a valida, no prazo, desta
|
|
103
|
+
* maquina e deste projeto, autoriza alguma coisa.
|
|
104
|
+
*/
|
|
105
|
+
function lerAutorizacao(raiz, opcoes) {
|
|
106
|
+
const arquivo = caminhoDaAutorizacao(raiz);
|
|
107
|
+
const recusa = (motivo, detalhe, autorizacao) => ({ valida: false, arquivo, motivo, detalhe, ...(autorizacao ? { autorizacao } : {}) });
|
|
108
|
+
const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
|
|
109
|
+
if (!st)
|
|
110
|
+
return recusa('autorizacao.ausente', 'nenhuma autorizacao duravel gravada nesta maquina');
|
|
111
|
+
// RM-047: como o transporte do pulse, a autorizacao so vale do arquivo local desta maquina.
|
|
112
|
+
if (!st.isFile())
|
|
113
|
+
return recusa('autorizacao.rastreada', 'a autorizacao precisa ser um arquivo comum desta maquina, nao link nem diretorio');
|
|
114
|
+
if ((0, procedencia_1.rastreadoPeloGit)(raiz, arquivo))
|
|
115
|
+
return recusa('autorizacao.rastreada', 'a autorizacao esta versionada no git; ela so vale do arquivo local desta maquina');
|
|
116
|
+
if (st.size > TETO_DO_ARQUIVO)
|
|
117
|
+
return recusa('autorizacao.ilegivel', `o arquivo passa de ${TETO_DO_ARQUIVO} bytes`);
|
|
118
|
+
let bruto, dado;
|
|
119
|
+
try {
|
|
120
|
+
bruto = fs.readFileSync(arquivo, 'utf8');
|
|
121
|
+
const lido = JSON.parse(bruto);
|
|
122
|
+
if (!lido || typeof lido !== 'object' || Array.isArray(lido))
|
|
123
|
+
throw new Error('nao e um objeto JSON');
|
|
124
|
+
dado = lido;
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
return recusa('autorizacao.ilegivel', `o arquivo nao e JSON valido (${e.message.slice(0, 120)})`);
|
|
128
|
+
}
|
|
129
|
+
if (dado.contrato !== exports.CONTRATO_DA_AUTORIZACAO)
|
|
130
|
+
return recusa('autorizacao.contrato', `o contrato precisa ser ${exports.CONTRATO_DA_AUTORIZACAO}`);
|
|
131
|
+
for (const [campo, teto] of [['maquina', 80], ['projeto', 80], ['por', 120]]) {
|
|
132
|
+
if (!textoCurto(dado[campo], teto))
|
|
133
|
+
return recusa('autorizacao.campo', `o campo ${campo} precisa ser texto de ate ${teto} caracteres`);
|
|
134
|
+
}
|
|
135
|
+
// A autoria e a mesma regra da nota do MASTER: nome de agente, de runtime ou generico nao autoriza nada.
|
|
136
|
+
if (!(0, master_1.autoriaHumana)(dado.por)) {
|
|
137
|
+
return recusa('autorizacao.campo', 'o campo por precisa nomear a pessoa que autorizou; agente, runtime ou nome generico nao autoriza');
|
|
138
|
+
}
|
|
139
|
+
for (const campo of ['concedidaEm', 'ate']) {
|
|
140
|
+
if (!instante(dado[campo])) {
|
|
141
|
+
return recusa('autorizacao.campo', `o campo ${campo} precisa ser um instante ISO com fuso (Z ou -03:00), como 2026-10-18T23:59:00-03:00`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (dado.nota !== undefined && !textoCurto(dado.nota, 300))
|
|
145
|
+
return recusa('autorizacao.campo', 'a nota precisa ser texto de ate 300 caracteres');
|
|
146
|
+
const pode = dado.pode;
|
|
147
|
+
if (!Array.isArray(pode) || pode.length === 0 || pode.some((a) => typeof a !== 'string') || new Set(pode).size !== pode.length) {
|
|
148
|
+
return recusa('autorizacao.campo', 'o campo pode precisa ser uma lista de acoes, sem repeticao');
|
|
149
|
+
}
|
|
150
|
+
const desconhecida = pode.find((a) => !exports.ACOES_DA_AUTORIZACAO.includes(a));
|
|
151
|
+
if (desconhecida !== undefined) {
|
|
152
|
+
return recusa('autorizacao.acao-desconhecida', `a acao ${JSON.stringify(desconhecida)} nao e do contrato (${exports.ACOES_DA_AUTORIZACAO.join(', ')})`);
|
|
153
|
+
}
|
|
154
|
+
const autorizacao = {
|
|
155
|
+
contrato: exports.CONTRATO_DA_AUTORIZACAO, maquina: dado.maquina, projeto: dado.projeto, por: dado.por,
|
|
156
|
+
concedidaEm: dado.concedidaEm, ate: dado.ate, pode: pode,
|
|
157
|
+
...(typeof dado.nota === 'string' ? { nota: dado.nota } : {}),
|
|
158
|
+
};
|
|
159
|
+
const maquina = opcoes.maquina ?? (0, maquina_1.nomeDaMaquina)();
|
|
160
|
+
if (autorizacao.maquina !== maquina) {
|
|
161
|
+
return recusa('autorizacao.outra-maquina', `a autorizacao e da maquina ${autorizacao.maquina}, e esta e ${maquina}`, autorizacao);
|
|
162
|
+
}
|
|
163
|
+
if (autorizacao.projeto !== opcoes.projeto) {
|
|
164
|
+
return recusa('autorizacao.outro-projeto', `a autorizacao e do projeto ${autorizacao.projeto}, e este e ${opcoes.projeto}`, autorizacao);
|
|
165
|
+
}
|
|
166
|
+
const agora = opcoes.agora ?? new Date();
|
|
167
|
+
if (Date.parse(autorizacao.ate) <= agora.getTime()) {
|
|
168
|
+
return recusa('autorizacao.expirada', `o prazo acabou em ${(0, horario_1.formatarDataHoraRotulada)(autorizacao.ate, { agora: agora.toISOString() })}`, autorizacao);
|
|
169
|
+
}
|
|
170
|
+
return { valida: true, arquivo, autorizacao, sha256: (0, node_crypto_1.createHash)('sha256').update(bruto, 'utf8').digest('hex') };
|
|
171
|
+
}
|
|
172
|
+
/** A acao esta autorizada agora? */
|
|
173
|
+
function autorizada(leitura, acao) {
|
|
174
|
+
return leitura.valida && leitura.autorizacao.pode.includes(acao);
|
|
175
|
+
}
|
|
176
|
+
/** A referencia que vai ao ledger com cada acao feita: quem autorizou, ate quando e qual arquivo. */
|
|
177
|
+
function referenciaDaAutorizacao(leitura) {
|
|
178
|
+
if (!leitura.valida)
|
|
179
|
+
return null;
|
|
180
|
+
const a = leitura.autorizacao;
|
|
181
|
+
return { contrato: a.contrato, por: a.por, ate: a.ate, pode: a.pode, sha256: leitura.sha256, ...(a.nota ? { nota: a.nota } : {}) };
|
|
182
|
+
}
|
|
183
|
+
/** Uma linha para o `ork fabrica batida status` e para o pulse. */
|
|
184
|
+
function linhaDaAutorizacao(leitura, agora = new Date().toISOString()) {
|
|
185
|
+
const m = (0, locale_1.msg)().conducao.autorizacao;
|
|
186
|
+
if (leitura.valida) {
|
|
187
|
+
const a = leitura.autorizacao;
|
|
188
|
+
return m.linhaValida(a.por, (0, horario_1.formatarDataHoraRotulada)(a.ate, { agora }), a.pode.join(', '));
|
|
189
|
+
}
|
|
190
|
+
if (leitura.motivo === 'autorizacao.ausente') {
|
|
191
|
+
return m.linhaAusente;
|
|
192
|
+
}
|
|
193
|
+
return m.linhaInvalida(leitura.motivo, leitura.detalhe);
|
|
194
|
+
}
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// RM-063 (F7): a gravacao, pelo `ork conducao autorizar`.
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
/** O que nunca entra na autorizacao duravel, nem com o nome que o dono der: fica sempre com ele. */
|
|
199
|
+
const ACOES_PROIBIDAS = ['tag', 'tags', 'publicar', 'publicacao', 'publicação', 'release', 'publish', 'npm', 'versao', 'versão'];
|
|
200
|
+
/**
|
|
201
|
+
* O prazo mais longo que uma autorizacao pode ter: o dono renova quando quiser, e a permissao esquecida nao vale para
|
|
202
|
+
* sempre.
|
|
203
|
+
*/
|
|
204
|
+
exports.PRAZO_MAXIMO_DIAS = 31;
|
|
205
|
+
/**
|
|
206
|
+
* O prazo do `--ate`, sempre com o fuso escrito. Instante com fuso vale como veio; so a data vale ate 23:59 dela no fuso
|
|
207
|
+
* do dono; data e hora sem fuso, no fuso do dono. O resto e recusado: o prazo nao e adivinhado.
|
|
208
|
+
*/
|
|
209
|
+
function prazoDoPedido(bruto, fuso) {
|
|
210
|
+
const v = bruto.trim();
|
|
211
|
+
if (instante(v))
|
|
212
|
+
return v;
|
|
213
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2}))?$/.exec(v);
|
|
214
|
+
const nome = (0, horario_1.normalizarFuso)(fuso);
|
|
215
|
+
if (!m || !nome)
|
|
216
|
+
return null;
|
|
217
|
+
const hora = m[4] ? Number(m[4]) : 23, minuto = m[5] ? Number(m[5]) : 59;
|
|
218
|
+
if (hora > 23 || minuto > 59)
|
|
219
|
+
return null;
|
|
220
|
+
const ms = (0, horario_1.instanteNoFuso)(Number(m[1]), Number(m[2]), Number(m[3]), hora, minuto, nome);
|
|
221
|
+
return Number.isFinite(ms) ? (0, horario_1.isoComFuso)(ms, nome) : null;
|
|
222
|
+
}
|
|
223
|
+
/** O `user.name` do git do checkout, quando nomeia uma pessoa. */
|
|
224
|
+
function autorDoGit(raiz) {
|
|
225
|
+
const r = (0, util_1.exec)('git', ['config', 'user.name'], (0, estado_thread_1.raizDoEstado)(raiz), 10000);
|
|
226
|
+
const nome = r.ok ? r.stdout.trim() : '';
|
|
227
|
+
return nome && textoCurto(nome, 120) && (0, master_1.autoriaHumana)(nome) ? nome : null;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* RM-063 (F7): grava a autorizacao duravel do dono nesta maquina, na forma que `lerAutorizacao` confere. E ato do dono:
|
|
231
|
+
* a sessao despachada pelo `ork` (com a identidade de despacho no ambiente) nunca concede autorizacao a si mesma. O
|
|
232
|
+
* arquivo novo substitui o anterior inteiro, e cada concessao vai ao ledger do projeto (`autorizacao_concedida`), com a
|
|
233
|
+
* que ela substituiu. Tag e publicacao nunca entram, nem com outro nome.
|
|
234
|
+
*/
|
|
235
|
+
function gravarAutorizacao(raiz, pedido) {
|
|
236
|
+
const recusa = (motivo, detalhe) => ({ ok: false, motivo, detalhe });
|
|
237
|
+
const ambiente = pedido.ambiente ?? process.env;
|
|
238
|
+
if ((ambiente[runtime_ambiente_1.ENV_IDENTIDADE_DE_DESPACHO] ?? '').trim() || (ambiente[runtime_ambiente_1.ENV_THREAD_DO_DESPACHO] ?? '').trim()) {
|
|
239
|
+
return recusa('autorizacao.sessao-despachada', 'a autorização durável é ato do dono: uma sessão despachada pelo ork não a concede ' +
|
|
240
|
+
'(rode no terminal do dono, fora da sessão da fase)');
|
|
241
|
+
}
|
|
242
|
+
// A mesma regra da nota do MASTER em nome de pessoa (D8): de dentro de um host de agente (Claude Code, Codex, Hermes,
|
|
243
|
+
// OpenClaw), quem escreve o --por e o agente. O dono autoriza no proprio terminal.
|
|
244
|
+
const host = (0, master_nota_1.marcaDeHost)(ambiente);
|
|
245
|
+
if (host) {
|
|
246
|
+
return recusa('autorizacao.host', `a autorização durável é ato do dono no terminal dele: vinda de ${host}, ela não vale ` +
|
|
247
|
+
'(o agente não autoriza a si mesmo)');
|
|
248
|
+
}
|
|
249
|
+
const agora = pedido.agora ?? new Date();
|
|
250
|
+
const ate = prazoDoPedido(pedido.ate, pedido.fuso);
|
|
251
|
+
if (!ate) {
|
|
252
|
+
return recusa('autorizacao.ate-invalido', `--ate ${JSON.stringify(pedido.ate)} não é um prazo: use 2026-10-18 (até 23:59 no fuso ` +
|
|
253
|
+
`${pedido.fuso}), 2026-10-18T18:00 ou um instante com fuso, como 2026-10-18T23:59:00-03:00`);
|
|
254
|
+
}
|
|
255
|
+
if (Date.parse(ate) <= agora.getTime()) {
|
|
256
|
+
return recusa('autorizacao.ate-passado', `o prazo ${(0, horario_1.formatarDataHoraRotulada)(ate, { agora: agora.toISOString() })} já passou`);
|
|
257
|
+
}
|
|
258
|
+
if (Date.parse(ate) - agora.getTime() > exports.PRAZO_MAXIMO_DIAS * 24 * 60 * 60 * 1000) {
|
|
259
|
+
return recusa('autorizacao.ate-longe', `o prazo vai além de ${exports.PRAZO_MAXIMO_DIAS} dias: autorize por menos e renove quando quiser`);
|
|
260
|
+
}
|
|
261
|
+
const pode = pedido.pode.split(',').map((a) => a.trim().toLowerCase()).filter(Boolean);
|
|
262
|
+
if (!pode.length)
|
|
263
|
+
return recusa('autorizacao.pode-vazio', `--pode precisa de pelo menos uma ação (${exports.ACOES_DA_AUTORIZACAO.join(', ')})`);
|
|
264
|
+
if (new Set(pode).size !== pode.length)
|
|
265
|
+
return recusa('autorizacao.pode-repetido', '--pode repete uma ação');
|
|
266
|
+
const proibida = pode.find((a) => ACOES_PROIBIDAS.includes(a));
|
|
267
|
+
if (proibida) {
|
|
268
|
+
return recusa('autorizacao.acao-proibida', `${JSON.stringify(proibida)}: tag e publicação nunca entram na autorização durável; ` +
|
|
269
|
+
'ficam sempre com o dono');
|
|
270
|
+
}
|
|
271
|
+
const desconhecida = pode.find((a) => !exports.ACOES_DA_AUTORIZACAO.includes(a));
|
|
272
|
+
if (desconhecida !== undefined) {
|
|
273
|
+
return recusa('autorizacao.acao-desconhecida', `a ação ${JSON.stringify(desconhecida)} não é do contrato (${exports.ACOES_DA_AUTORIZACAO.join(', ')})`);
|
|
274
|
+
}
|
|
275
|
+
const por = (pedido.por ?? '').trim() || autorDoGit(raiz);
|
|
276
|
+
if (!por || !textoCurto(por, 120) || !(0, master_1.autoriaHumana)(por)) {
|
|
277
|
+
return recusa('autorizacao.por', por ? `--por ${JSON.stringify(por)} não nomeia uma pessoa (agente, runtime ou nome genérico não autoriza)`
|
|
278
|
+
: 'informe --por <seu nome>: o git deste checkout não tem user.name de uma pessoa');
|
|
279
|
+
}
|
|
280
|
+
const nota = (pedido.nota ?? '').trim();
|
|
281
|
+
if (nota && !textoCurto(nota, 300))
|
|
282
|
+
return recusa('autorizacao.nota', 'a nota precisa ser texto de até 300 caracteres, sem controle');
|
|
283
|
+
const arquivo = caminhoDaAutorizacao(raiz);
|
|
284
|
+
const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
|
|
285
|
+
if ((st && !st.isFile()) || (0, procedencia_1.rastreadoPeloGit)(raiz, arquivo)) {
|
|
286
|
+
return recusa('autorizacao.rastreada', `${arquivo} está no git, ou é link ou diretório: a autorização só vale do arquivo local desta máquina`);
|
|
287
|
+
}
|
|
288
|
+
const lida = lerAutorizacao(raiz, { projeto: pedido.projeto, agora, maquina: pedido.maquina });
|
|
289
|
+
const anterior = lida.valida ? lida.autorizacao : null;
|
|
290
|
+
const autorizacao = {
|
|
291
|
+
contrato: exports.CONTRATO_DA_AUTORIZACAO, maquina: pedido.maquina ?? (0, maquina_1.nomeDaMaquina)(), projeto: pedido.projeto, por,
|
|
292
|
+
concedidaEm: (0, horario_1.isoComFuso)(agora.getTime(), (0, horario_1.normalizarFuso)(pedido.fuso) ?? 'UTC'), ate, pode: pode,
|
|
293
|
+
...(nota ? { nota } : {}),
|
|
294
|
+
};
|
|
295
|
+
fs.mkdirSync(path.dirname(arquivo), { recursive: true });
|
|
296
|
+
const temporario = `${arquivo}.${process.pid}.${(0, node_crypto_1.randomUUID)().slice(0, 8)}.tmp`;
|
|
297
|
+
try {
|
|
298
|
+
fs.writeFileSync(temporario, JSON.stringify(autorizacao, null, 2) + '\n', { encoding: 'utf8', mode: 0o600, flag: 'wx' });
|
|
299
|
+
fs.renameSync(temporario, arquivo);
|
|
300
|
+
}
|
|
301
|
+
finally {
|
|
302
|
+
fs.rmSync(temporario, { force: true });
|
|
303
|
+
}
|
|
304
|
+
const leitura = lerAutorizacao(raiz, { projeto: pedido.projeto, agora, maquina: pedido.maquina });
|
|
305
|
+
if (!leitura.valida)
|
|
306
|
+
throw new Error(`a autorização gravada não foi aceita na releitura (${leitura.motivo}: ${leitura.detalhe})`);
|
|
307
|
+
try {
|
|
308
|
+
(0, ledger_1.registrar)(path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery'), 'projeto', ledger_1.TIPOS_DE_EVENTO.autorizacaoConcedida, {
|
|
309
|
+
maquina: autorizacao.maquina, por, concedidaEm: autorizacao.concedidaEm, ate, pode, ...(nota ? { nota } : {}),
|
|
310
|
+
sha256: leitura.sha256, canal: pedido.canal ?? null,
|
|
311
|
+
substituiu: anterior ? { por: anterior.por, ate: anterior.ate, pode: anterior.pode } : null,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
catch { /* o arquivo e a autorizacao; o ledger do projeto e o rastro, e a releitura ja provou o arquivo */ }
|
|
315
|
+
return { ok: true, leitura, anterior };
|
|
316
|
+
}
|
|
317
|
+
/** O texto do `ork conducao autorizacao`: a vigente, ou por que nao ha, e o que isso quer dizer para a batida. */
|
|
318
|
+
function textoDaAutorizacao(leitura, agora = new Date().toISOString()) {
|
|
319
|
+
const m = (0, locale_1.msg)().conducao.autorizacao;
|
|
320
|
+
if (!leitura.valida) {
|
|
321
|
+
return [m.sem(leitura.motivo, leitura.detalhe), m.semEfeito, m.autorizar].join('\n');
|
|
322
|
+
}
|
|
323
|
+
const a = leitura.autorizacao;
|
|
324
|
+
return [m.valida(a.por, (0, horario_1.formatarDataHoraRotulada)(a.ate, { agora }), a.pode.join(', ')),
|
|
325
|
+
m.concedida((0, horario_1.formatarDataHoraRotulada)(a.concedidaEm, { agora }), a.maquina, a.projeto, a.nota ?? ''),
|
|
326
|
+
m.arquivo(leitura.arquivo, leitura.sha256.slice(0, 12)), m.limite].join('\n');
|
|
327
|
+
}
|