@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/indice-vetorial.js
CHANGED
|
@@ -77,6 +77,7 @@ const node_crypto_1 = require("node:crypto");
|
|
|
77
77
|
const estado_thread_1 = require("./estado-thread");
|
|
78
78
|
const orkmind_1 = require("./orkmind");
|
|
79
79
|
const policies_1 = require("./policies");
|
|
80
|
+
const locale_1 = require("./locale");
|
|
80
81
|
exports.CONTRATO_INDICE = 'ork.indice-vetorial/v1';
|
|
81
82
|
/** D11: lote por chamada da ponte na indexacao. */
|
|
82
83
|
exports.TAMANHO_DO_LOTE = 16;
|
|
@@ -360,23 +361,24 @@ function avisoDeCobertura(coerentes, entradas, alvo, onde = '') {
|
|
|
360
361
|
}
|
|
361
362
|
/** RM-038: a linha do que fica fora da busca, a mesma no `ork memory index` e no `ork memory status`. */
|
|
362
363
|
function textoForaDaBusca(f) {
|
|
363
|
-
|
|
364
|
-
|
|
364
|
+
const m = (0, locale_1.msg)().operacao.restante.memory.indice;
|
|
365
|
+
return f ? m.foraMedido(f.injecao, f.expiradas, f.outrasColecoes) : m.foraNaoMedido;
|
|
365
366
|
}
|
|
366
367
|
/** Texto de `ork memory index`: de que universo, o que foi (ou seria) embedado e quanto custa estimado. */
|
|
367
368
|
function textoDoIndice(r) {
|
|
368
|
-
const
|
|
369
|
+
const m = (0, locale_1.msg)().operacao.restante.memory.indice;
|
|
370
|
+
const custo = r.custoEstimadoUsd === null ? m.custoNaoEstimado : `US$ ${r.custoEstimadoUsd.toFixed(8)}`;
|
|
369
371
|
const colecoes = Object.entries(r.porColecao).map(([c, n]) => `${c} ${n}`).join(', ');
|
|
370
372
|
return [
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
...(r.truncados ? [
|
|
377
|
-
|
|
378
|
-
...(r.arquivo ? [
|
|
379
|
-
...(r.motivo ? [
|
|
373
|
+
m.titulo(r.alvo, r.dryRun, r.modelo ?? m.semModelo, r.dim),
|
|
374
|
+
m.universo(r.universo, colecoes, r.coerentes),
|
|
375
|
+
m.fora(textoForaDaBusca(r.foraDaBusca)),
|
|
376
|
+
m.embedados(r.embedados, r.reescritos, r.removidos),
|
|
377
|
+
m.recusados(r.recusados, r.foraDoLimite),
|
|
378
|
+
...(r.truncados ? [m.truncados(r.truncados)] : []),
|
|
379
|
+
m.estimativa(r.tokensEstimados, custo, r.chamadasAoProvider),
|
|
380
|
+
...(r.arquivo ? [m.arquivo(r.arquivo)] : []),
|
|
381
|
+
...(r.motivo ? [m.motivo(r.motivo, r.detalhe)] : r.detalhe ? [` ${r.detalhe}`] : []),
|
|
380
382
|
].join('\n');
|
|
381
383
|
}
|
|
382
384
|
/** Vetores coerentes de um indice para o universo informado: a base da busca e da cobertura. */
|
package/dist/indice.js
CHANGED
|
@@ -59,13 +59,19 @@ exports.INSUMOS_DO_INDICE = [
|
|
|
59
59
|
* reversao e `ship.ts`, que e quem sabe de merge e de base; aqui so se conta o evento
|
|
60
60
|
* que ele gravou.
|
|
61
61
|
*/
|
|
62
|
+
function pausaPrevistaDoFast(e) {
|
|
63
|
+
return e.tipo === ledger_1.TIPOS_DE_EVENTO.shipBloqueado && e.modo === 'fast' && e.motivo === 'human.pending';
|
|
64
|
+
}
|
|
62
65
|
function calcularIndice(eventos) {
|
|
63
66
|
const parcelas = [];
|
|
64
67
|
let valor = exports.INDICE_BASE;
|
|
65
68
|
for (const insumo of exports.INSUMOS_DO_INDICE) {
|
|
66
69
|
// Ensaio de 03/10/2026 (RM-049): o `ork ship --dry-run` barrado grava `ship_blocked` com `dryRun: true`;
|
|
67
70
|
// ensaio nao e tropeco da entrega, como ja nao e pausa no board (fatia 2 do ensaio da 0.5.0, P2).
|
|
68
|
-
|
|
71
|
+
// EN8 (a), decisao do dono de 11/10/2026: no #Fast, o ship sem autorizacao de push e a pausa prevista
|
|
72
|
+
// do modo, e o `ship_blocked` com `human.pending` tambem nao conta.
|
|
73
|
+
const ocorrencias = eventos.filter((e) => e.tipo === insumo.evento && e.dryRun !== true &&
|
|
74
|
+
!pausaPrevistaDoFast(e)).length;
|
|
69
75
|
if (ocorrencias === 0)
|
|
70
76
|
continue;
|
|
71
77
|
const bruto = insumo.peso * ocorrencias;
|
package/dist/init.js
CHANGED
|
@@ -48,6 +48,7 @@ exports.detectar = detectar;
|
|
|
48
48
|
exports.manifestoYaml = manifestoYaml;
|
|
49
49
|
exports.exigirRepositorioParaInit = exigirRepositorioParaInit;
|
|
50
50
|
exports.init = init;
|
|
51
|
+
const locale_1 = require("./locale");
|
|
51
52
|
const fs = __importStar(require("node:fs"));
|
|
52
53
|
const path = __importStar(require("node:path"));
|
|
53
54
|
const manifest_1 = require("./manifest");
|
|
@@ -55,7 +56,9 @@ const slug_1 = require("./slug");
|
|
|
55
56
|
const util_1 = require("./util");
|
|
56
57
|
const horario_1 = require("./horario");
|
|
57
58
|
const modos_1 = require("./modos");
|
|
58
|
-
|
|
59
|
+
const detect_1 = require("./security-scan/detect");
|
|
60
|
+
/** O proximo passo do `ork init` em pt-BR; o texto do CLI sai pelo catalogo (`msg().init.proximoPasso`). */
|
|
61
|
+
exports.PROXIMO_PASSO_INIT = (0, locale_1.msg)('pt-BR').init.proximoPasso;
|
|
59
62
|
/** Raiz do repositorio git, resolvendo tambem o caso de worktree. */
|
|
60
63
|
function raizDoRepo(dirInicial) {
|
|
61
64
|
const r = (0, util_1.exec)('git', ['rev-parse', '--show-toplevel'], dirInicial);
|
|
@@ -142,115 +145,112 @@ function detectar(dirInicial, nomeForcado, abbrevForcada) {
|
|
|
142
145
|
baseBranch: baseBranchDetectada(raiz),
|
|
143
146
|
gerenciador: gerenciadorDetectado(raiz),
|
|
144
147
|
verify: verifyDetectado(raiz),
|
|
148
|
+
stacks: [...new Set((0, detect_1.detectStacks)(raiz).map((e) => e.stack))],
|
|
145
149
|
};
|
|
146
150
|
}
|
|
147
|
-
/**
|
|
148
|
-
function
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
/** Cada linha do texto vira comentario do YAML, com o recuo da chave em que ele fica. */
|
|
152
|
+
function comentario(texto, recuo = ' ') {
|
|
153
|
+
return texto.split('\n').map((linha) => `${recuo}# ${linha}`).join('\n');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Serializa o manifesto v1 a partir da deteccao. RM-061 (F3a, D1 a D3): os comentarios saem na lingua pedida, pela
|
|
157
|
+
* familia `gerados` do catalogo; chaves, valores e exemplos comentados sao este esqueleto, o mesmo nas duas linguas.
|
|
158
|
+
* Sem locale, pt-BR: so o `ork init` passa a lingua do dono (D2).
|
|
159
|
+
*/
|
|
160
|
+
function manifestoYaml(d, locale = locale_1.LOCALE_PADRAO) {
|
|
161
|
+
const c = (0, locale_1.msg)(locale).gerados.manifesto;
|
|
162
|
+
const linhaVerify = (chave, valor) => valor ? ` ${chave}: "${valor}"` : ` # ${chave}: ${c.naoDetectado}`;
|
|
163
|
+
return `${comentario(c.cabecalho, '')}
|
|
153
164
|
|
|
154
165
|
project:
|
|
155
166
|
name: "${d.nome}"
|
|
156
|
-
|
|
167
|
+
${comentario(c.abbrev)}
|
|
157
168
|
abbrev: "${d.abbrev}"
|
|
158
169
|
stage: nascente
|
|
159
170
|
|
|
160
171
|
owner:
|
|
161
|
-
|
|
162
|
-
# Ausente: fuso do sistema. Exemplo:
|
|
172
|
+
${comentario(c.fuso)}
|
|
163
173
|
# timezone: "${horario_1.FUSO_DE_BRASILIA}"
|
|
164
|
-
|
|
165
|
-
# language:
|
|
174
|
+
${comentario(c.preferencias(`ork onboarding set maestro --conteudo '{"owner":{"experience":true}}'`))}
|
|
175
|
+
# language: ${c.exemploDeIdioma} # ${c.idiomaAusente}
|
|
166
176
|
# depth: curta # curta | detalhada
|
|
167
|
-
# experience: true #
|
|
177
|
+
# experience: true # ${c.experienciaFalse}
|
|
168
178
|
|
|
169
179
|
board:
|
|
170
180
|
adapter: hermes-kanban
|
|
171
181
|
default: default
|
|
172
182
|
|
|
173
183
|
runtime:
|
|
174
|
-
|
|
175
|
-
# claude-bg (padrao, mais maduro): despacha \`claude --bg\`, sessao visivel no app
|
|
176
|
-
# e em \`claude agents --json\`
|
|
177
|
-
# codex: despacha \`codex exec\` headless na sessao autenticada do Codex CLI,
|
|
178
|
-
# verificado no rollout de $CODEX_HOME/sessions (requer \`codex login\`)
|
|
184
|
+
${comentario(c.runtimes)}
|
|
179
185
|
adapter: claude-bg
|
|
180
186
|
model: opus
|
|
181
187
|
effort: high
|
|
182
|
-
|
|
188
|
+
${comentario(c.providerPolicy)}
|
|
183
189
|
provider_policy: subscription-only
|
|
184
|
-
|
|
185
|
-
# (danger-full-access SO onde o bubblewrap nao roda; \`ork doctor\` tem a sonda)
|
|
190
|
+
${comentario(c.sandbox)}
|
|
186
191
|
sandbox: workspace-write
|
|
187
192
|
|
|
188
193
|
conduction:
|
|
189
|
-
|
|
194
|
+
${comentario(c.modoPadrao)}
|
|
190
195
|
default_mode: classic
|
|
191
196
|
allowed_modes: [${modos_1.ORDEM_DOS_MODOS.join(', ')}]
|
|
192
197
|
|
|
193
198
|
worktree:
|
|
194
199
|
base_branch: "${d.baseBranch}"
|
|
195
200
|
dir: ".claude/worktrees"
|
|
196
|
-
|
|
197
|
-
# false ou ausente: só com --worktree auto
|
|
201
|
+
${comentario(c.porThread)}
|
|
198
202
|
por_thread: true
|
|
199
203
|
|
|
200
204
|
verify:
|
|
201
205
|
${linhaVerify('build', d.verify.build)}
|
|
202
206
|
${linhaVerify('test', d.verify.test)}
|
|
203
207
|
${linhaVerify('typecheck', d.verify.typecheck)}
|
|
208
|
+
${comentario(c.securityScan)}
|
|
209
|
+
${d.stacks.length > 0 ? '' : '# '}security_scan: "ork security-scan"
|
|
210
|
+
${d.stacks.length > 0 ? '' : '# '}timeout_ms_por_comando:
|
|
211
|
+
${d.stacks.length > 0 ? '' : '# '} security_scan: 900000
|
|
204
212
|
|
|
205
213
|
ci:
|
|
206
|
-
|
|
214
|
+
${comentario(c.ci)}
|
|
207
215
|
required_for_ship: false
|
|
208
216
|
context: ork-verify
|
|
209
|
-
# command: "npm test" #
|
|
217
|
+
# command: "npm test" # ${c.ciComando}
|
|
210
218
|
|
|
211
219
|
concurrency:
|
|
212
220
|
max_parallel_threads: 3
|
|
213
|
-
|
|
214
|
-
# isto NAO ocupa vaga do escalonador: a vaga volta para quem esta pronto para rodar
|
|
221
|
+
${comentario(c.staleAfter)}
|
|
215
222
|
stale_after_min: 240
|
|
216
223
|
|
|
217
224
|
handoff:
|
|
218
|
-
|
|
225
|
+
${comentario(c.handoff)}
|
|
219
226
|
rotate_above: 0.70
|
|
220
227
|
force_rotate_above: 0.85
|
|
221
228
|
|
|
222
229
|
retry:
|
|
223
|
-
|
|
224
|
-
# max_tentativas e o LIMITE DE ESCALACAO: estourado, pausa qualquer modo, ate #Auto
|
|
230
|
+
${comentario(c.retry)}
|
|
225
231
|
max_tentativas: 3
|
|
226
|
-
|
|
227
|
-
# (fica marcada como estimativa na fila; o ork nunca inventa horario medido)
|
|
232
|
+
${comentario(c.janelaPadrao)}
|
|
228
233
|
janela_padrao_min: 60
|
|
229
234
|
escalar_esforco: true
|
|
230
235
|
|
|
231
236
|
memory:
|
|
232
|
-
|
|
233
|
-
# orkmind = camada semantica do bloco B6 por cima, com degradacao honesta para files
|
|
237
|
+
${comentario(c.memoriaModo)}
|
|
234
238
|
mode: files
|
|
235
|
-
|
|
236
|
-
# Vazio = o regime orkmind nao liga (o ork nao adivinha base: base alheia e pior que
|
|
237
|
-
# base nenhuma, precedente do incidente memory-orkmind).
|
|
239
|
+
${comentario(c.databaseUrl)}
|
|
238
240
|
database_url_env: ""
|
|
239
241
|
cli: orkmind
|
|
240
242
|
timeout_ms: 15000
|
|
241
|
-
|
|
242
|
-
# api_key_env recebe o NOME da variavel com a chave dedicada, nunca o valor.
|
|
243
|
+
${comentario(c.embedding)}
|
|
243
244
|
# embedding:
|
|
244
245
|
# provider: "none" # none | openrouter
|
|
245
246
|
# model: "qwen/qwen3-embedding-8b"
|
|
246
247
|
# dim: 1024
|
|
247
248
|
# api_key_env: "ORKASTERY_EMBEDDING_API_KEY"
|
|
248
|
-
# fallback_model: "" #
|
|
249
|
+
# fallback_model: "" # ${c.modeloOffline}
|
|
249
250
|
# max_tokens_por_execucao: 1000000
|
|
250
251
|
|
|
251
252
|
audit:
|
|
252
|
-
|
|
253
|
-
# janela ociosa da assinatura: fora dela a rodada so anda com --agora <quem>
|
|
253
|
+
${comentario(c.audit)}
|
|
254
254
|
janela_ociosa: "22:00-06:00"
|
|
255
255
|
effort: eco
|
|
256
256
|
since_padrao: 7d
|
|
@@ -273,10 +273,12 @@ function exigirRepositorioParaInit(dir) {
|
|
|
273
273
|
const r = (0, util_1.exec)('git', ['rev-parse', '--is-inside-work-tree'], dir);
|
|
274
274
|
if (r.ok && r.stdout.trim() === 'true')
|
|
275
275
|
return;
|
|
276
|
-
throw new Error(
|
|
277
|
-
'Entre no repositório do projeto (ou crie um com git init e o primeiro commit) e rode ork init de novo.');
|
|
276
|
+
throw new Error((0, locale_1.msg)().init.foraDoRepositorio(path.resolve(dir)));
|
|
278
277
|
}
|
|
279
|
-
/**
|
|
278
|
+
/**
|
|
279
|
+
* Gera o manifesto e o esqueleto de `.orkastery/`. Nao sobrescreve sem `force`. Os comentarios do manifesto saem
|
|
280
|
+
* no `locale` pedido (RM-061, F3a), pt-BR por omissao.
|
|
281
|
+
*/
|
|
280
282
|
function init(dirInicial, opcoes = {}) {
|
|
281
283
|
const deteccao = detectar(dirInicial, opcoes.nome, opcoes.abbrev);
|
|
282
284
|
const caminho = path.join(deteccao.raiz, manifest_1.NOME_MANIFESTO);
|
|
@@ -284,9 +286,12 @@ function init(dirInicial, opcoes = {}) {
|
|
|
284
286
|
if (existe && !opcoes.force) {
|
|
285
287
|
return { caminho, criado: false, deteccao };
|
|
286
288
|
}
|
|
287
|
-
(0, util_1.gravar)(caminho, manifestoYaml(deteccao));
|
|
289
|
+
(0, util_1.gravar)(caminho, manifestoYaml(deteccao, opcoes.locale));
|
|
288
290
|
const estado = path.join(deteccao.raiz, manifest_1.DIR_ESTADO);
|
|
289
291
|
fs.mkdirSync(path.join(estado, 'threads'), { recursive: true });
|
|
290
|
-
//
|
|
291
|
-
|
|
292
|
+
// RM-061 F3c: so o arquivo do estado criado pelo `init` segue a lingua pedida. O `*` e a protecao
|
|
293
|
+
// contra sobrescrita continuam no util; a pasta de worktrees preserva o default historico.
|
|
294
|
+
const locale = opcoes.locale ?? locale_1.LOCALE_PADRAO;
|
|
295
|
+
const gitignore = `# ${(0, locale_1.msg)(locale).gerados.gitignoreDaMaquina}\n*\n`;
|
|
296
|
+
return { caminho, criado: true, deteccao, estadoIgnorado: (0, util_1.ignorarPastaNoGit)(estado, deteccao.raiz, gitignore) };
|
|
292
297
|
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RM-037 (fatia 6, P6/T15): o registro de instabilidade, contrato `ork.instabilidade/v1`.
|
|
4
|
+
*
|
|
5
|
+
* Arquivo `core/instabilidade.json` na arvore verificada. Nasce vazio. Uma entrada diz que um teste
|
|
6
|
+
* depende do relogio e por isso reprova sob steal alto; ela so entra com a taxa MEDIDA (falhas em
|
|
7
|
+
* rodadas, com o comando que mediu e a data) e com revalidacao em ate 30 dias da medida. Vencida a
|
|
8
|
+
* revalidacao, a entrada deixa de valer ate alguem medir de novo.
|
|
9
|
+
*
|
|
10
|
+
* O registro nunca atenua uma falha sozinho: ele so diz ao verify que aquele teste e de relogio, e
|
|
11
|
+
* a reprovacao so vira `verify.timeout` com o steal medido acima de 40% na janela do comando. Sem
|
|
12
|
+
* steal, o teste registrado reprova como qualquer outro.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CAUSAS_DE_INSTABILIDADE = exports.REVALIDACAO_MAXIMA_DIAS = exports.ARQUIVO_INSTABILIDADE = exports.CONTRATO_INSTABILIDADE = void 0;
|
|
16
|
+
exports.validarRegistro = validarRegistro;
|
|
17
|
+
exports.vigente = vigente;
|
|
18
|
+
exports.lerRegistroDeInstabilidade = lerRegistroDeInstabilidade;
|
|
19
|
+
exports.testesDeRelogioVigentes = testesDeRelogioVigentes;
|
|
20
|
+
const node_fs_1 = require("node:fs");
|
|
21
|
+
const node_path_1 = require("node:path");
|
|
22
|
+
exports.CONTRATO_INSTABILIDADE = 'ork.instabilidade/v1';
|
|
23
|
+
exports.ARQUIVO_INSTABILIDADE = 'core/instabilidade.json';
|
|
24
|
+
/** Prazo maximo entre a medida e a revalidacao. */
|
|
25
|
+
exports.REVALIDACAO_MAXIMA_DIAS = 30;
|
|
26
|
+
exports.CAUSAS_DE_INSTABILIDADE = ['relogio'];
|
|
27
|
+
const DIA_MS = 24 * 60 * 60 * 1000;
|
|
28
|
+
const CHAVES_DA_ENTRADA = new Set(['teste', 'arquivo', 'causa', 'taxa', 'revalidarAte', 'nota']);
|
|
29
|
+
const CHAVES_DA_TAXA = new Set(['falhas', 'rodadas', 'comando', 'medidaEm']);
|
|
30
|
+
function data(valor) {
|
|
31
|
+
if (typeof valor !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(valor))
|
|
32
|
+
return null;
|
|
33
|
+
const ms = Date.parse(`${valor}T00:00:00Z`);
|
|
34
|
+
return Number.isFinite(ms) && new Date(ms).toISOString().slice(0, 10) === valor ? ms : null;
|
|
35
|
+
}
|
|
36
|
+
const texto = (v) => typeof v === 'string' && v.trim() !== '';
|
|
37
|
+
const inteiro = (v) => typeof v === 'number' && Number.isInteger(v);
|
|
38
|
+
/** Os erros de contrato de um registro ja desserializado. Lista vazia: o registro vale. */
|
|
39
|
+
function validarRegistro(bruto) {
|
|
40
|
+
const erros = [];
|
|
41
|
+
if (!bruto || typeof bruto !== 'object' || Array.isArray(bruto))
|
|
42
|
+
return ['o registro precisa ser um objeto JSON'];
|
|
43
|
+
const r = bruto;
|
|
44
|
+
if (r.contrato !== exports.CONTRATO_INSTABILIDADE)
|
|
45
|
+
erros.push(`contrato precisa ser "${exports.CONTRATO_INSTABILIDADE}"`);
|
|
46
|
+
for (const chave of Object.keys(r)) {
|
|
47
|
+
if (chave !== 'contrato' && chave !== 'entradas')
|
|
48
|
+
erros.push(`chave desconhecida no registro: ${chave}`);
|
|
49
|
+
}
|
|
50
|
+
if (!Array.isArray(r.entradas))
|
|
51
|
+
return [...erros, 'entradas precisa ser uma lista (vazia no nascimento)'];
|
|
52
|
+
const vistos = new Set();
|
|
53
|
+
r.entradas.forEach((e, i) => {
|
|
54
|
+
const onde = `entradas[${i}]`;
|
|
55
|
+
if (!e || typeof e !== 'object' || Array.isArray(e)) {
|
|
56
|
+
erros.push(`${onde}: precisa ser um objeto`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const entrada = e;
|
|
60
|
+
for (const chave of Object.keys(entrada)) {
|
|
61
|
+
if (!CHAVES_DA_ENTRADA.has(chave))
|
|
62
|
+
erros.push(`${onde}: chave desconhecida ${chave}`);
|
|
63
|
+
}
|
|
64
|
+
if (!texto(entrada.teste))
|
|
65
|
+
erros.push(`${onde}.teste: nome do teste como o runner reporta`);
|
|
66
|
+
else if (vistos.has(entrada.teste))
|
|
67
|
+
erros.push(`${onde}.teste: "${entrada.teste}" repetido`);
|
|
68
|
+
else
|
|
69
|
+
vistos.add(entrada.teste);
|
|
70
|
+
if (!texto(entrada.arquivo))
|
|
71
|
+
erros.push(`${onde}.arquivo: caminho do teste`);
|
|
72
|
+
if (!exports.CAUSAS_DE_INSTABILIDADE.includes(entrada.causa)) {
|
|
73
|
+
erros.push(`${onde}.causa: ${exports.CAUSAS_DE_INSTABILIDADE.join(' ou ')}`);
|
|
74
|
+
}
|
|
75
|
+
if (entrada.nota !== undefined && typeof entrada.nota !== 'string')
|
|
76
|
+
erros.push(`${onde}.nota: texto`);
|
|
77
|
+
const taxa = entrada.taxa;
|
|
78
|
+
let medida = null;
|
|
79
|
+
if (!taxa || typeof taxa !== 'object' || Array.isArray(taxa)) {
|
|
80
|
+
erros.push(`${onde}.taxa: sem taxa medida a entrada nao entra (falhas, rodadas, comando, medidaEm)`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
for (const chave of Object.keys(taxa)) {
|
|
84
|
+
if (!CHAVES_DA_TAXA.has(chave))
|
|
85
|
+
erros.push(`${onde}.taxa: chave desconhecida ${chave}`);
|
|
86
|
+
}
|
|
87
|
+
if (!inteiro(taxa.rodadas) || taxa.rodadas < 1)
|
|
88
|
+
erros.push(`${onde}.taxa.rodadas: inteiro de rodadas medidas, 1 ou mais`);
|
|
89
|
+
if (!inteiro(taxa.falhas) || taxa.falhas < 1)
|
|
90
|
+
erros.push(`${onde}.taxa.falhas: inteiro de reprovacoes medidas, 1 ou mais`);
|
|
91
|
+
else if (inteiro(taxa.rodadas) && taxa.falhas > taxa.rodadas)
|
|
92
|
+
erros.push(`${onde}.taxa.falhas: maior que rodadas`);
|
|
93
|
+
if (!texto(taxa.comando))
|
|
94
|
+
erros.push(`${onde}.taxa.comando: o comando que mediu, reproduzivel`);
|
|
95
|
+
medida = data(taxa.medidaEm);
|
|
96
|
+
if (medida === null)
|
|
97
|
+
erros.push(`${onde}.taxa.medidaEm: data AAAA-MM-DD valida`);
|
|
98
|
+
}
|
|
99
|
+
const revalidar = data(entrada.revalidarAte);
|
|
100
|
+
if (revalidar === null)
|
|
101
|
+
erros.push(`${onde}.revalidarAte: data AAAA-MM-DD valida`);
|
|
102
|
+
else if (medida !== null) {
|
|
103
|
+
if (revalidar < medida)
|
|
104
|
+
erros.push(`${onde}.revalidarAte: antes da medida`);
|
|
105
|
+
else if (revalidar - medida > exports.REVALIDACAO_MAXIMA_DIAS * DIA_MS) {
|
|
106
|
+
erros.push(`${onde}.revalidarAte: no maximo ${exports.REVALIDACAO_MAXIMA_DIAS} dias depois de taxa.medidaEm`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
return erros;
|
|
111
|
+
}
|
|
112
|
+
/** A entrada vale hoje? Vale ate o fim do dia de `revalidarAte`, em UTC. */
|
|
113
|
+
function vigente(entrada, agoraMs = Date.now()) {
|
|
114
|
+
const ate = data(entrada.revalidarAte);
|
|
115
|
+
return ate !== null && agoraMs < ate + DIA_MS;
|
|
116
|
+
}
|
|
117
|
+
/** Le o registro da arvore `cwd`. Ausente: vazio. Ilegivel ou fora do contrato: erros e nada vale. */
|
|
118
|
+
function lerRegistroDeInstabilidade(cwd, agoraMs = Date.now()) {
|
|
119
|
+
const arquivo = (0, node_path_1.join)(cwd, exports.ARQUIVO_INSTABILIDADE);
|
|
120
|
+
if (!(0, node_fs_1.existsSync)(arquivo))
|
|
121
|
+
return { arquivo: exports.ARQUIVO_INSTABILIDADE, presente: false, erros: [], vigentes: [], vencidas: [] };
|
|
122
|
+
let bruto;
|
|
123
|
+
try {
|
|
124
|
+
bruto = JSON.parse((0, node_fs_1.readFileSync)(arquivo, 'utf8'));
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
return { arquivo: exports.ARQUIVO_INSTABILIDADE, presente: true, erros: [`JSON ilegivel: ${e.message}`], vigentes: [], vencidas: [] };
|
|
128
|
+
}
|
|
129
|
+
const erros = validarRegistro(bruto);
|
|
130
|
+
if (erros.length > 0)
|
|
131
|
+
return { arquivo: exports.ARQUIVO_INSTABILIDADE, presente: true, erros, vigentes: [], vencidas: [] };
|
|
132
|
+
const entradas = bruto.entradas;
|
|
133
|
+
return {
|
|
134
|
+
arquivo: exports.ARQUIVO_INSTABILIDADE,
|
|
135
|
+
presente: true,
|
|
136
|
+
erros: [],
|
|
137
|
+
vigentes: entradas.filter((e) => vigente(e, agoraMs)),
|
|
138
|
+
vencidas: entradas.filter((e) => !vigente(e, agoraMs)),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** Os nomes dos testes de relogio que o verify pode considerar nesta rodada. */
|
|
142
|
+
function testesDeRelogioVigentes(registro) {
|
|
143
|
+
return new Set(registro.vigentes.filter((e) => e.causa === 'relogio').map((e) => e.teste));
|
|
144
|
+
}
|
|
@@ -18,4 +18,8 @@ exports.TESTES_DE_INTEGRACAO_LOCAL = new Set([
|
|
|
18
18
|
'rm037-fatia3-hard-link-mcp-git.test.js', 'rm037-fatia3-lease-mcp-git.test.js',
|
|
19
19
|
// RM-038 (fatia de correcao): a ponte com o GovernedStore real da biblioteca instalada.
|
|
20
20
|
'rm038-universo-ponte.test.js',
|
|
21
|
+
// RM-059 (T0.10): a conferencia pontual com o sandbox real do codex, como o mcp-verify.test.js.
|
|
22
|
+
'claims-conferir-sandbox.test.js',
|
|
23
|
+
// Security scan (Task 13a): o scanner com o Docker real e as imagens do catalogo.
|
|
24
|
+
'security-scan-integracao.test.js',
|
|
21
25
|
]);
|