@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
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* pulse configurado (`.orkastery/monitor/pulse-host.json`), o doctor le o `crontab -l` e avisa,
|
|
8
8
|
* sem bloquear, quando a linha da varredura falta ou bate mais devagar que o template
|
|
9
9
|
* `monitor/pulse.cron`. O doctor nunca edita o crontab: a correcao traz a linha pronta.
|
|
10
|
+
*
|
|
11
|
+
* RM-063 (F1): com thread aberta no projeto, a falta da batida REPROVA, com ou sem `pulse-host.json`.
|
|
12
|
+
* Sem transporte o doctor calava, e o maquina-b ficou de 03/10 a 12/10/2026 sem varredura nenhuma. A
|
|
13
|
+
* correcao e o `ork fabrica batida instalar`, que instala a linha do template de forma idempotente.
|
|
10
14
|
*/
|
|
11
15
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
16
|
if (k2 === undefined) k2 = k;
|
|
@@ -42,16 +46,32 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
42
46
|
};
|
|
43
47
|
})();
|
|
44
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.COMANDO_DO_TEMPLATE = exports.SCRIPT_DA_VARREDURA = exports.BATIDA_DO_TEMPLATE = void 0;
|
|
49
|
+
exports.ARQUIVO_DO_TRANSPORTE = exports.COMANDO_DE_INSTALAR_A_BATIDA = exports.ATRASO_DA_BATIDA_MIN = exports.COMANDO_DO_TEMPLATE = exports.SCRIPT_DA_VARREDURA = exports.BATIDA_DO_TEMPLATE = void 0;
|
|
46
50
|
exports.lerCrontabDoSistema = lerCrontabDoSistema;
|
|
47
51
|
exports.intervaloEmMinutos = intervaloEmMinutos;
|
|
48
|
-
exports.
|
|
52
|
+
exports.valorNoShell = valorNoShell;
|
|
53
|
+
exports.projetoDaLinha = projetoDaLinha;
|
|
54
|
+
exports.scriptsDaLinha = scriptsDaLinha;
|
|
55
|
+
exports.entradasDaVarredura = entradasDaVarredura;
|
|
56
|
+
exports.entradaDoProjeto = entradaDoProjeto;
|
|
57
|
+
exports.mesmoCaminho = mesmoCaminho;
|
|
58
|
+
exports.entradaNaoEDeOutro = entradaNaoEDeOutro;
|
|
59
|
+
exports.ultimaRodadaDaVarredura = ultimaRodadaDaVarredura;
|
|
60
|
+
exports.threadsAbertasNoEstado = threadsAbertasNoEstado;
|
|
61
|
+
exports.citarNoShell = citarNoShell;
|
|
49
62
|
exports.scriptDaVarreduraDoOrk = scriptDaVarreduraDoOrk;
|
|
50
63
|
exports.comandoDaVarredura = comandoDaVarredura;
|
|
51
64
|
exports.checarCronDoPulse = checarCronDoPulse;
|
|
65
|
+
exports.batidaNoDoctor = batidaNoDoctor;
|
|
66
|
+
exports.ultimaEntrega = ultimaEntrega;
|
|
67
|
+
exports.checarTransporteDoPulse = checarTransporteDoPulse;
|
|
52
68
|
const fs = __importStar(require("node:fs"));
|
|
69
|
+
const os = __importStar(require("node:os"));
|
|
53
70
|
const path = __importStar(require("node:path"));
|
|
54
71
|
const util_1 = require("./util");
|
|
72
|
+
const locale_1 = require("./locale");
|
|
73
|
+
const horario_1 = require("./horario");
|
|
74
|
+
const maquina_1 = require("./maquina");
|
|
55
75
|
/** A batida do template `monitor/pulse.cron` (I-50): a menor cadencia das tags. */
|
|
56
76
|
exports.BATIDA_DO_TEMPLATE = '*/15 * * * *';
|
|
57
77
|
/** O script que o template agenda; a linha do crontab e achada por ele. */
|
|
@@ -64,9 +84,12 @@ function lerCrontabDoSistema() {
|
|
|
64
84
|
if (r.ok)
|
|
65
85
|
return { ok: true, texto: r.stdout };
|
|
66
86
|
if (r.error === 'ENOENT')
|
|
67
|
-
return { ok: false, motivo:
|
|
68
|
-
|
|
69
|
-
|
|
87
|
+
return { ok: false, motivo: (0, locale_1.msg)().doctor.cronSemComando };
|
|
88
|
+
// RM-063 (F1): o usuario sem crontab tem um crontab vazio, nao uma leitura que falhou; e o caso da maquina nova.
|
|
89
|
+
if (/no crontab for /i.test(`${r.stderr}${r.stdout}`))
|
|
90
|
+
return { ok: true, texto: '' };
|
|
91
|
+
const primeira = (r.stderr || r.stdout).trim().split('\n')[0] ?? '';
|
|
92
|
+
return { ok: false, motivo: primeira ? (0, locale_1.msg)().doctor.cronFalhou(primeira) : (0, locale_1.msg)().doctor.cronSaiu(r.code) };
|
|
70
93
|
}
|
|
71
94
|
const MACROS = { '@hourly': 60, '@daily': 1440, '@midnight': 1440, '@weekly': 10080,
|
|
72
95
|
'@monthly': 43200, '@yearly': 525600, '@annually': 525600 };
|
|
@@ -124,13 +147,140 @@ function dividirLinha(linha) {
|
|
|
124
147
|
const m = /^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/.exec(t);
|
|
125
148
|
return m ? { quando: m[1], comando: m[2] } : null;
|
|
126
149
|
}
|
|
127
|
-
/**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
150
|
+
/**
|
|
151
|
+
* RM-063 (F1, GO-FIX): um valor como o `sh` do cron o le: aspas simples literais; aspas duplas com `$HOME`; sem aspas,
|
|
152
|
+
* com o `~` do comeco e `$HOME`. So o que a linha da varredura usa; o resto fica como esta.
|
|
153
|
+
*/
|
|
154
|
+
function valorNoShell(bruto, home = os.homedir()) {
|
|
155
|
+
const comHome = (v) => v.replace(/\$\{HOME\}|\$HOME(?![A-Za-z0-9_])/g, home);
|
|
156
|
+
if (bruto.length >= 2 && bruto.startsWith(`'`) && bruto.endsWith(`'`))
|
|
157
|
+
return bruto.slice(1, -1).replace(/'\\''/g, `'`);
|
|
158
|
+
if (bruto.length >= 2 && bruto.startsWith('"') && bruto.endsWith('"'))
|
|
159
|
+
return comHome(bruto.slice(1, -1).replace(/\\(["\\$`])/g, '$1'));
|
|
160
|
+
return comHome(bruto === '~' ? home : bruto.startsWith('~/') ? home + bruto.slice(1) : bruto);
|
|
161
|
+
}
|
|
162
|
+
/** Um valor de atribuicao ou um caminho: entre aspas simples, entre aspas duplas, ou ate o espaco. */
|
|
163
|
+
const VALOR = String.raw `(?:'(?:[^']|'\\'')*'|"(?:[^"\\]|\\.)*"|[^\s;&|<>()]+)`;
|
|
164
|
+
/** O valor de `ORK_PULSE_PROJECT=` na linha, como o `sh` o le; `null` quando a linha nao o diz. */
|
|
165
|
+
function projetoDaLinha(linha, home = os.homedir()) {
|
|
166
|
+
const m = new RegExp(`(?:^|\\s)ORK_PULSE_PROJECT=(${VALOR})`).exec(linha);
|
|
167
|
+
return m ? valorNoShell(m[1], home) : null;
|
|
168
|
+
}
|
|
169
|
+
/** Os scripts da varredura citados na linha, como o `sh` os le; `varredura-pulse.sh.bak` nao e o script. */
|
|
170
|
+
function scriptsDaLinha(linha, home = os.homedir()) {
|
|
171
|
+
const nome = exports.SCRIPT_DA_VARREDURA.replace(/\./g, '\\.');
|
|
172
|
+
const re = new RegExp(`(?:^|[\\s=])('[^']*${nome}'|"[^"]*${nome}"|[^\\s'";&|<>()]*${nome})(?=$|[\\s;&|<>)])`, 'g');
|
|
173
|
+
return [...linha.matchAll(re)].map((m) => valorNoShell(m[1], home));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* RM-063 (F1, GO-FIX): as entradas da varredura, na ordem. A linha de ambiente do crontab (`NOME=valor`) vale para as
|
|
177
|
+
* entradas que vem depois dela: o template sem `ORK_PULSE_PROJECT` abaixo de `ORK_PULSE_PROJECT=/outro` varre o outro.
|
|
178
|
+
*/
|
|
179
|
+
function entradasDaVarredura(crontab, home = os.homedir()) {
|
|
180
|
+
const ambiente = {};
|
|
181
|
+
const entradas = [];
|
|
182
|
+
for (const linha of crontab.split('\n')) {
|
|
183
|
+
const t = linha.trim();
|
|
184
|
+
if (!t || t.startsWith('#'))
|
|
185
|
+
continue;
|
|
186
|
+
const env = /^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(t);
|
|
187
|
+
if (env) {
|
|
188
|
+
ambiente[env[1]] = valorNoShell(env[2].trim(), ambiente.HOME ?? home);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const casa = ambiente.HOME ?? home;
|
|
192
|
+
const scripts = scriptsDaLinha(t, casa);
|
|
193
|
+
if (!scripts.length)
|
|
194
|
+
continue;
|
|
195
|
+
entradas.push({ linha, projeto: projetoDaLinha(t, casa) ?? ambiente.ORK_PULSE_PROJECT ?? null, scripts });
|
|
196
|
+
}
|
|
197
|
+
return entradas;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* RM-063 (F1): a entrada roda, com certeza, a varredura DESTE projeto: o `ORK_PULSE_PROJECT` efetivo e ele, ou nao ha
|
|
201
|
+
* projeto nenhum e o script e o do proprio checkout (que entao e o alvo, como no template).
|
|
202
|
+
*/
|
|
203
|
+
function entradaDoProjeto(e, raiz) {
|
|
204
|
+
if (e.projeto !== null)
|
|
205
|
+
return mesmoCaminho(e.projeto, raiz);
|
|
206
|
+
const doCheckout = path.join(raiz, 'monitor', exports.SCRIPT_DA_VARREDURA);
|
|
207
|
+
return e.scripts.some((s) => mesmoCaminho(s, doCheckout));
|
|
208
|
+
}
|
|
209
|
+
/** O mesmo caminho, escrito igual ou pelo mesmo destino real. */
|
|
210
|
+
function mesmoCaminho(a, b) {
|
|
211
|
+
if (path.resolve(a) === path.resolve(b))
|
|
212
|
+
return true;
|
|
213
|
+
try {
|
|
214
|
+
return fs.realpathSync(a) === fs.realpathSync(b);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* A entrada vale para o aviso de cadencia (sem thread aberta) quando nao aponta OUTRO projeto: a linha antiga do
|
|
222
|
+
* template, sem projeto, continua valendo como na RM-039.
|
|
223
|
+
*/
|
|
224
|
+
function entradaNaoEDeOutro(e, raiz) {
|
|
225
|
+
return e.projeto === null || mesmoCaminho(e.projeto, raiz);
|
|
226
|
+
}
|
|
227
|
+
/** Acima disto sem rodada nova no `hitl.log`, a batida esta atrasada: duas batidas do template perdidas. */
|
|
228
|
+
exports.ATRASO_DA_BATIDA_MIN = 30;
|
|
229
|
+
function ultimaRodadaDaVarredura(dirMonitor) {
|
|
230
|
+
const arquivo = path.join(dirMonitor, 'hitl.log');
|
|
231
|
+
let texto;
|
|
232
|
+
try {
|
|
233
|
+
const fd = fs.openSync(arquivo, 'r');
|
|
234
|
+
try {
|
|
235
|
+
const tamanho = fs.fstatSync(fd).size, lido = Math.min(tamanho, 64 * 1024);
|
|
236
|
+
const buffer = Buffer.alloc(lido);
|
|
237
|
+
fs.readSync(fd, buffer, 0, lido, tamanho - lido);
|
|
238
|
+
texto = buffer.toString('utf8');
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
fs.closeSync(fd);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
for (const linha of texto.split('\n').reverse()) {
|
|
248
|
+
try {
|
|
249
|
+
const e = JSON.parse(linha);
|
|
250
|
+
if (e.tipo !== 'pulse_scan' || typeof e.ts !== 'string' || !Number.isFinite(Date.parse(e.ts)))
|
|
251
|
+
continue;
|
|
252
|
+
return { em: e.ts, code: typeof e.code === 'number' ? e.code : null, detalhe: typeof e.detalhe === 'string' ? e.detalhe : '' };
|
|
253
|
+
}
|
|
254
|
+
catch { /* linha cortada no inicio do trecho, ou ilegivel */ }
|
|
255
|
+
}
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
/** RM-063 (F1): threads nao fechadas no estado do projeto (`.orkastery/threads/<id>/thread.json`). */
|
|
259
|
+
function threadsAbertasNoEstado(dirEstado) {
|
|
260
|
+
const dir = path.join(dirEstado, 'threads');
|
|
261
|
+
let nomes;
|
|
262
|
+
try {
|
|
263
|
+
nomes = fs.readdirSync(dir);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return 0;
|
|
267
|
+
}
|
|
268
|
+
let abertas = 0;
|
|
269
|
+
for (const nome of nomes) {
|
|
270
|
+
try {
|
|
271
|
+
const t = JSON.parse(fs.readFileSync(path.join(dir, nome, 'thread.json'), 'utf8'));
|
|
272
|
+
// O registro de adocao nao tem trabalho a conduzir; a thread pausada espera o dono, e a batida e quem o lembra.
|
|
273
|
+
if (t.status !== 'fechada' && t.origem !== 'adocao')
|
|
274
|
+
abertas++;
|
|
275
|
+
}
|
|
276
|
+
catch { /* pasta sem thread.json, ou ilegivel: nao e thread a vigiar */ }
|
|
277
|
+
}
|
|
278
|
+
return abertas;
|
|
131
279
|
}
|
|
280
|
+
/** O comando que instala a batida; e a correcao do doctor quando ela falta (RM-063, F1). */
|
|
281
|
+
exports.COMANDO_DE_INSTALAR_A_BATIDA = 'ork fabrica batida instalar';
|
|
132
282
|
/** Aspas de shell so quando o caminho precisa (a linha vai colada no crontab, que roda por `sh`). */
|
|
133
|
-
function
|
|
283
|
+
function citarNoShell(caminho) {
|
|
134
284
|
return /^[A-Za-z0-9_./:@+-]+$/.test(caminho) ? caminho : `'${caminho.replace(/'/g, `'\\''`)}'`;
|
|
135
285
|
}
|
|
136
286
|
/**
|
|
@@ -154,27 +304,40 @@ function scriptDaVarreduraDoOrk(dirDoDist = __dirname) {
|
|
|
154
304
|
function comandoDaVarredura(raizDoProjeto, scriptDoOrk = scriptDaVarreduraDoOrk()) {
|
|
155
305
|
const doProjeto = path.join(raizDoProjeto, 'monitor', exports.SCRIPT_DA_VARREDURA);
|
|
156
306
|
if (fs.existsSync(doProjeto) || !scriptDoOrk)
|
|
157
|
-
return
|
|
158
|
-
return `ORK_PULSE_PROJECT=${
|
|
307
|
+
return citarNoShell(doProjeto);
|
|
308
|
+
return `ORK_PULSE_PROJECT=${citarNoShell(raizDoProjeto)} ${citarNoShell(scriptDoOrk)}`;
|
|
159
309
|
}
|
|
160
310
|
/**
|
|
161
|
-
* Check "cadencia do pulse no cron". `null` quando o projeto nao tem transporte do pulse
|
|
162
|
-
* `pulse-host.json`
|
|
311
|
+
* Check "cadencia do pulse no cron". `null` quando o projeto nao tem transporte do pulse nem thread
|
|
312
|
+
* aberta: sem `pulse-host.json` e sem thread a vigiar, o doctor nao fala de cron.
|
|
313
|
+
*
|
|
314
|
+
* RM-063 (F1): com thread aberta (`abertas`, contadas no estado ao lado de `dirMonitor`), a falta da
|
|
315
|
+
* batida reprova, com ou sem transporte, e a correcao e o `ork fabrica batida instalar`.
|
|
163
316
|
*/
|
|
164
|
-
function checarCronDoPulse(dirMonitor, raizDoCheckout, ler = lerCrontabDoSistema, scriptDoOrk = scriptDaVarreduraDoOrk()) {
|
|
165
|
-
|
|
317
|
+
function checarCronDoPulse(dirMonitor, raizDoCheckout, ler = lerCrontabDoSistema, scriptDoOrk = scriptDaVarreduraDoOrk(), abertas = threadsAbertasNoEstado(path.dirname(dirMonitor))) {
|
|
318
|
+
const comHost = fs.existsSync(path.join(dirMonitor, 'pulse-host.json'));
|
|
319
|
+
if (!comHost && abertas === 0)
|
|
166
320
|
return null;
|
|
167
321
|
const nome = 'cadencia do pulse no cron';
|
|
168
322
|
const comandoSugerido = comandoDaVarredura(raizDoCheckout, scriptDoOrk);
|
|
169
323
|
const linhaNova = (comando) => `${exports.BATIDA_DO_TEMPLATE} ${comando}`;
|
|
170
|
-
const ausente = (detalhe) =>
|
|
171
|
-
|
|
324
|
+
const ausente = (detalhe) => abertas > 0
|
|
325
|
+
? { nome, nivel: 'fail', detalhe: (0, locale_1.msg)().doctor.batidaAusente(abertas, detalhe),
|
|
326
|
+
correcao: (0, locale_1.msg)().doctor.batidaInstale(exports.COMANDO_DE_INSTALAR_A_BATIDA) }
|
|
327
|
+
: { nome, nivel: 'warn', detalhe, correcao: (0, locale_1.msg)().doctor.cronAdicione(linhaNova(comandoSugerido)) };
|
|
328
|
+
// RM-063 (F1, GO-FIX): a varredura que bate por outro agendador (timer do systemd, batida do host) se prova pelo hitl.log.
|
|
329
|
+
const rodada = ultimaRodadaDaVarredura(dirMonitor);
|
|
330
|
+
const haMin = rodada ? Math.floor((Date.now() - Date.parse(rodada.em)) / 60000) : null;
|
|
331
|
+
const semCron = (detalhe) => haMin !== null && haMin >= 0 && haMin <= exports.ATRASO_DA_BATIDA_MIN
|
|
332
|
+
? { nome, nivel: 'ok', detalhe: (0, locale_1.msg)().doctor.batidaPeloLog(haMin) } : ausente(detalhe);
|
|
172
333
|
const leitura = ler();
|
|
173
334
|
if (!leitura.ok)
|
|
174
|
-
return
|
|
175
|
-
|
|
335
|
+
return semCron(comHost ? (0, locale_1.msg)().doctor.cronSemLeitura(leitura.motivo) : (0, locale_1.msg)().doctor.batidaSemLeitura(leitura.motivo));
|
|
336
|
+
// Com thread aberta, so a batida DESTE projeto; sem thread, o aviso de cadencia aceita a linha antiga sem projeto.
|
|
337
|
+
const linhas = entradasDaVarredura(leitura.texto)
|
|
338
|
+
.filter(e => abertas > 0 ? entradaDoProjeto(e, raizDoCheckout) : entradaNaoEDeOutro(e, raizDoCheckout)).map(e => e.linha.trim());
|
|
176
339
|
if (linhas.length === 0)
|
|
177
|
-
return
|
|
340
|
+
return semCron(comHost ? (0, locale_1.msg)().doctor.cronSemLinha(exports.SCRIPT_DA_VARREDURA) : (0, locale_1.msg)().doctor.batidaSemLinha(exports.SCRIPT_DA_VARREDURA));
|
|
178
341
|
const lentas = [];
|
|
179
342
|
for (const linha of linhas) {
|
|
180
343
|
const partes = dividirLinha(linha);
|
|
@@ -183,12 +346,116 @@ function checarCronDoPulse(dirMonitor, raizDoCheckout, ler = lerCrontabDoSistema
|
|
|
183
346
|
lentas.push({ linha, comando: partes?.comando ?? comandoSugerido, intervalo });
|
|
184
347
|
}
|
|
185
348
|
if (lentas.length < linhas.length) {
|
|
186
|
-
|
|
349
|
+
// RM-063 (fatia 3, H1): a linha no crontab nao prova que a batida roda (cron parado, script que cai antes do log).
|
|
350
|
+
// Com thread aberta, a ultima rodada mais velha que o atraso reprova; sem rodada nenhuma ainda, ou com a batida
|
|
351
|
+
// instalada ha menos de 30 min depois da ultima rodada, a linha recem-instalada vale.
|
|
352
|
+
if (abertas > 0 && haMin !== null && haMin > exports.ATRASO_DA_BATIDA_MIN && !recemInstalada(raizDoCheckout, rodada?.em ?? null)) {
|
|
353
|
+
return { nome, nivel: 'fail', detalhe: (0, locale_1.msg)().doctor.batidaAtrasada(haMin, linhas.length), correcao: (0, locale_1.msg)().doctor.batidaAtrasadaCorrecao };
|
|
354
|
+
}
|
|
355
|
+
return { nome, nivel: 'ok', detalhe: (0, locale_1.msg)().doctor.cronOk(linhas.length) };
|
|
187
356
|
}
|
|
188
357
|
const l = lentas[0];
|
|
189
|
-
|
|
190
|
-
:
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
358
|
+
return { nome, nivel: 'warn', detalhe: (0, locale_1.msg)().doctor.cronLento((0, locale_1.msg)().doctor.cronRitmo(l.intervalo), l.linha),
|
|
359
|
+
correcao: (0, locale_1.msg)().doctor.cronTroque(linhaNova(l.comando)) };
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* A batida deste projeto foi instalada (`batida_instalada` no ledger da maquina) depois da ultima rodada e ha menos de
|
|
363
|
+
* 30 min: o `hitl.log` velho de antes da instalacao nao e atraso, a primeira rodada ainda vem.
|
|
364
|
+
*/
|
|
365
|
+
function recemInstalada(raizDoCheckout, ultimaRodadaEm, agora = Date.now()) {
|
|
366
|
+
let eventos = [];
|
|
367
|
+
try {
|
|
368
|
+
eventos = fs.readFileSync(path.join((0, maquina_1.pastaDoUsuario)(), 'ledger.jsonl'), 'utf8').split('\n').filter(Boolean)
|
|
369
|
+
.map((l) => { try {
|
|
370
|
+
return JSON.parse(l);
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return {};
|
|
374
|
+
} });
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
const instalada = eventos.filter((e) => e.tipo === 'batida_instalada' && typeof e.projeto === 'string' &&
|
|
380
|
+
mesmoCaminho(e.projeto, raizDoCheckout) && typeof e.ts === 'string').map((e) => Date.parse(e.ts)).filter(Number.isFinite).at(-1);
|
|
381
|
+
if (instalada === undefined)
|
|
382
|
+
return false;
|
|
383
|
+
const rodada = ultimaRodadaEm ? Date.parse(ultimaRodadaEm) : Number.NEGATIVE_INFINITY;
|
|
384
|
+
return instalada > rodada && agora - instalada <= exports.ATRASO_DA_BATIDA_MIN * 60000;
|
|
385
|
+
}
|
|
386
|
+
function batidaNoDoctor(dirMonitor, raizDoCheckout, opcoes) {
|
|
387
|
+
const abertas = opcoes.abertas ?? threadsAbertasNoEstado(path.dirname(dirMonitor));
|
|
388
|
+
const rodada = ultimaRodadaDaVarredura(dirMonitor);
|
|
389
|
+
const agora = opcoes.agora ?? Date.now();
|
|
390
|
+
const haMin = rodada ? Math.max(0, Math.floor((agora - Date.parse(rodada.em)) / 60000)) : null;
|
|
391
|
+
const leitura = (opcoes.ler ?? lerCrontabDoSistema)();
|
|
392
|
+
const instalada = leitura.ok ? entradasDaVarredura(leitura.texto).some((e) => entradaDoProjeto(e, raizDoCheckout)) : null;
|
|
393
|
+
const atrasada = abertas > 0 && (haMin !== null ? haMin > exports.ATRASO_DA_BATIDA_MIN && !recemInstalada(raizDoCheckout, rodada?.em ?? null, agora)
|
|
394
|
+
: instalada !== true);
|
|
395
|
+
const quando = rodada ? (0, horario_1.formatarDataHoraRotulada)(rodada.em, { agora: new Date(agora).toISOString() }) : null;
|
|
396
|
+
const aviso = !atrasada ? null : haMin !== null
|
|
397
|
+
? `Orkastery: a fabrica ${opcoes.projeto} na maquina ${opcoes.maquina} esta sem batida ha ${haMin} min (ultima rodada em ${quando}` +
|
|
398
|
+
`${rodada?.code ? `, codigo ${rodada.code}` : ''}), com ${abertas} thread(s) aberta(s). Confira com: ork fabrica batida status`
|
|
399
|
+
: `Orkastery: a fabrica ${opcoes.projeto} na maquina ${opcoes.maquina} nao tem batida (nenhuma rodada da varredura e a linha nao ` +
|
|
400
|
+
`esta no crontab), com ${abertas} thread(s) aberta(s). Instale com: ork fabrica batida instalar`;
|
|
401
|
+
return { threadsAbertas: abertas, instalada, ultimaRodadaEm: rodada?.em ?? null, codigo: rodada?.code ?? null, haMin,
|
|
402
|
+
limiteMin: exports.ATRASO_DA_BATIDA_MIN, atrasada, aviso };
|
|
403
|
+
}
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
// RM-063 (fatia 3, H4): a falha do transporte do pulse, que a entrega grava em `transporte.log`.
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
exports.ARQUIVO_DO_TRANSPORTE = 'transporte.log';
|
|
408
|
+
/** A entrega mais velha que isto nao e mais noticia: o doctor nao acusa a falha de ontem. */
|
|
409
|
+
const VALIDADE_DA_FALHA_MS = 24 * 60 * 60 * 1000;
|
|
410
|
+
/** A ultima entrega registrada no `transporte.log` (lida do fim, com teto). */
|
|
411
|
+
function ultimaEntrega(dirMonitor) {
|
|
412
|
+
let texto;
|
|
413
|
+
try {
|
|
414
|
+
const fd = fs.openSync(path.join(dirMonitor, exports.ARQUIVO_DO_TRANSPORTE), 'r');
|
|
415
|
+
try {
|
|
416
|
+
const tamanho = fs.fstatSync(fd).size, lido = Math.min(tamanho, 64 * 1024);
|
|
417
|
+
const buffer = Buffer.alloc(lido);
|
|
418
|
+
fs.readSync(fd, buffer, 0, lido, tamanho - lido);
|
|
419
|
+
texto = buffer.toString('utf8');
|
|
420
|
+
}
|
|
421
|
+
finally {
|
|
422
|
+
fs.closeSync(fd);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
return null;
|
|
427
|
+
}
|
|
428
|
+
for (const linha of texto.split('\n').reverse()) {
|
|
429
|
+
try {
|
|
430
|
+
const e = JSON.parse(linha);
|
|
431
|
+
if (e.tipo !== 'transporte_entrega' || typeof e.ts !== 'string' || !Array.isArray(e.tentativas))
|
|
432
|
+
continue;
|
|
433
|
+
return { ts: e.ts, oQue: String(e.oQue ?? ''), ok: e.ok === true, host: typeof e.host === 'string' ? e.host : null, tentativas: e.tentativas };
|
|
434
|
+
}
|
|
435
|
+
catch { /* linha cortada */ }
|
|
436
|
+
}
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Check "transporte do pulse": a ultima entrega do resumo. Saiu pelo primeiro transporte, ok; saiu pelo outro host
|
|
441
|
+
* configurado, aviso; nao saiu por nenhum, falha. `null` sem `pulse-host.json`, ou sem entrega nas ultimas 24 h.
|
|
442
|
+
*/
|
|
443
|
+
function checarTransporteDoPulse(dirMonitor, agora = Date.now()) {
|
|
444
|
+
if (!fs.existsSync(path.join(dirMonitor, 'pulse-host.json')))
|
|
445
|
+
return null;
|
|
446
|
+
const e = ultimaEntrega(dirMonitor);
|
|
447
|
+
if (!e || !(agora - Date.parse(e.ts) <= VALIDADE_DA_FALHA_MS))
|
|
448
|
+
return null;
|
|
449
|
+
const nome = 'transporte do pulse';
|
|
450
|
+
const quando = (0, horario_1.formatarDataHoraRotulada)(e.ts, { agora: new Date(agora).toISOString() });
|
|
451
|
+
if (!e.ok) {
|
|
452
|
+
const tentativas = e.tentativas.map((t) => `${t.host}: ${t.codigo ?? 'sem código'}`).join('; ');
|
|
453
|
+
return { nome, nivel: 'fail', detalhe: (0, locale_1.msg)().doctor.transporteFalhou(quando, tentativas), correcao: (0, locale_1.msg)().doctor.transporteCorrecao };
|
|
454
|
+
}
|
|
455
|
+
const falhas = e.tentativas.filter((t) => !t.ok);
|
|
456
|
+
if (falhas.length) {
|
|
457
|
+
return { nome, nivel: 'warn', detalhe: (0, locale_1.msg)().doctor.transporteDesvio(falhas.map((t) => t.host).join(', '), e.host ?? '?', quando),
|
|
458
|
+
correcao: (0, locale_1.msg)().doctor.transporteCorrecao };
|
|
459
|
+
}
|
|
460
|
+
return { nome, nivel: 'ok', detalhe: (0, locale_1.msg)().doctor.transporteOk(e.host ?? '?', quando) };
|
|
194
461
|
}
|
package/dist/doctor-rede.js
CHANGED
|
@@ -41,7 +41,7 @@ exports.checarRede = checarRede;
|
|
|
41
41
|
* RM-053 (fatia 2): o check "rede" do `ork doctor`.
|
|
42
42
|
*
|
|
43
43
|
* A rede pessoal publica sozinha (batida do pulse e eventos de thread) e so deixava rastro em
|
|
44
|
-
* `~/.orkastery/rede/rede.log`: a
|
|
44
|
+
* `~/.orkastery/rede/rede.log`: a maquina-b ficou de 02/10 em diante como membro herdado da fabrica,
|
|
45
45
|
* com toda publicacao caindo em `rede.sem-repositorio`, e o doctor dizia PRONTO sem uma palavra.
|
|
46
46
|
*
|
|
47
47
|
* O check diz a adesao, a casa, a ultima batida publicada e a ultima falha do log. Ele so le
|
|
@@ -56,6 +56,7 @@ const rede_1 = require("./rede");
|
|
|
56
56
|
const rede_adesao_1 = require("./rede-adesao");
|
|
57
57
|
const rede_status_1 = require("./rede-status");
|
|
58
58
|
const saida_segura_1 = require("./saida-segura");
|
|
59
|
+
const locale_1 = require("./locale");
|
|
59
60
|
/** O fim do `rede.log` que o doctor le: o log so cresce, e o que importa e o mais recente. */
|
|
60
61
|
exports.CAUDA_DO_LOG_BYTES = 64 * 1024;
|
|
61
62
|
/** As linhas legiveis do fim do `rede.log`, da mais antiga para a mais nova. Sem log, lista vazia. */
|
|
@@ -102,16 +103,16 @@ const curto = (s, teto = 200) => {
|
|
|
102
103
|
/** A correcao pela familia do erro da ultima falha (o prefixo tipado, como `rede.sem-repositorio`). */
|
|
103
104
|
function correcaoDaFalha(erro) {
|
|
104
105
|
const codigo = /^([a-z]+\.[a-z-]+):/.exec(erro)?.[1] ?? '';
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
const m = (0, locale_1.msg)().doctor;
|
|
107
|
+
if (codigo === 'rede.sem-repositorio' || codigo === 'rede.repositorio-alheio')
|
|
108
|
+
return m.redeSemCasaCorrecao;
|
|
108
109
|
if (codigo === 'rede.sem-forja')
|
|
109
|
-
return
|
|
110
|
+
return m.redeSemForjaCorrecao;
|
|
110
111
|
if (codigo === 'rede.repositorio-publico')
|
|
111
|
-
return
|
|
112
|
+
return m.redePublicaCorrecao;
|
|
112
113
|
if (codigo === 'rede.nome-em-uso')
|
|
113
|
-
return
|
|
114
|
-
return
|
|
114
|
+
return m.redeNomeCorrecao;
|
|
115
|
+
return m.redeOutraCorrecao;
|
|
115
116
|
}
|
|
116
117
|
/** O check "rede". `agoraMs` e o log ficam injetaveis para o teste. */
|
|
117
118
|
function checarRede(opcoes = {}) {
|
|
@@ -120,8 +121,8 @@ function checarRede(opcoes = {}) {
|
|
|
120
121
|
const adesao = (0, rede_adesao_1.adesaoDaRede)();
|
|
121
122
|
if (!adesao.membro) {
|
|
122
123
|
return { nome, nivel: 'ok', detalhe: adesao.config && !adesao.config.membro
|
|
123
|
-
?
|
|
124
|
-
:
|
|
124
|
+
? (0, locale_1.msg)().doctor.redeSaiu
|
|
125
|
+
: (0, locale_1.msg)().doctor.foraDaRede };
|
|
125
126
|
}
|
|
126
127
|
const marca = (0, rede_1.lerMarcaDaRede)();
|
|
127
128
|
const config = adesao.config;
|
|
@@ -131,19 +132,19 @@ function checarRede(opcoes = {}) {
|
|
|
131
132
|
const falha = [...registros].reverse().find((r) => r.acao === 'falhou') ?? null;
|
|
132
133
|
const emBatida = marca && typeof marca.em === 'string' && Number.isFinite(Date.parse(marca.em)) ? marca.em : null;
|
|
133
134
|
const idade = emBatida ? agora - Date.parse(emBatida) : NaN;
|
|
135
|
+
const m = (0, locale_1.msg)().doctor;
|
|
134
136
|
const partes = [
|
|
135
|
-
adesao.adesao === 'fabrica' ?
|
|
136
|
-
casa ?
|
|
137
|
-
emBatida ?
|
|
138
|
-
falha ?
|
|
139
|
-
:
|
|
137
|
+
adesao.adesao === 'fabrica' ? m.redeMembroHerdado : m.redeMembro,
|
|
138
|
+
casa ? m.redeCasa(curto(casa, 120)) : m.redeSemCasa,
|
|
139
|
+
emBatida ? m.redeBatida((0, horario_1.formatarDataHora)(emBatida), (0, rede_status_1.duracao)(idade)) : m.redeSemBatida,
|
|
140
|
+
falha ? m.redeFalha((0, horario_1.formatarDataHora)(falha.ts), falha.origem ? curto(falha.origem, 20) : null, curto(falha.erro ?? m.redeSemDetalhe))
|
|
141
|
+
: m.redeSemFalha,
|
|
140
142
|
];
|
|
141
143
|
// A falha mais nova que a ultima batida e o estado de agora; a de antes ja passou.
|
|
142
144
|
const falhaAtual = !!falha && (!emBatida || Date.parse(falha.ts) > Date.parse(emBatida));
|
|
143
145
|
const parada = !emBatida || !(idade <= rede_status_1.SEM_BATIDA_MS);
|
|
144
146
|
if (!falhaAtual && !parada)
|
|
145
147
|
return { nome, nivel: 'ok', detalhe: partes.join('; ') };
|
|
146
|
-
const correcao = falhaAtual ? correcaoDaFalha(falha.erro ?? '')
|
|
147
|
-
: 'a batida sai do pulse: confira o cron do pulse e rode ork network publicar';
|
|
148
|
+
const correcao = falhaAtual ? correcaoDaFalha(falha.erro ?? '') : m.redeParadaCorrecao;
|
|
148
149
|
return { nome, nivel: 'warn', detalhe: partes.join('; '), correcao };
|
|
149
150
|
}
|