@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
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CRONTAB_DO_SISTEMA = exports.MARCA_DA_BATIDA = exports.ultimaRodadaDaVarredura = exports.ATRASO_DA_BATIDA_MIN = void 0;
|
|
37
|
+
exports.gravarCrontabDoSistema = gravarCrontabDoSistema;
|
|
38
|
+
exports.caminhoDaBatida = caminhoDaBatida;
|
|
39
|
+
exports.scriptDaBatida = scriptDaBatida;
|
|
40
|
+
exports.linhaDaBatida = linhaDaBatida;
|
|
41
|
+
exports.linhaGerenciada = linhaGerenciada;
|
|
42
|
+
exports.estadoDaBatida = estadoDaBatida;
|
|
43
|
+
exports.instalarBatida = instalarBatida;
|
|
44
|
+
exports.removerBatida = removerBatida;
|
|
45
|
+
exports.textoDoEstadoDaBatida = textoDoEstadoDaBatida;
|
|
46
|
+
exports.textoDoResultadoDaBatida = textoDoResultadoDaBatida;
|
|
47
|
+
/**
|
|
48
|
+
* RM-063 (F1): a batida da fabrica, instalada e vigiada pelo proprio `ork`.
|
|
49
|
+
*
|
|
50
|
+
* Incidente do maquina-b, de 03/10 a 12/10/2026 (P1 e P7 da pagina da RM-063): o cron da varredura do
|
|
51
|
+
* pulse nunca foi instalado, o `ork doctor` so conferia o crontab com `pulse-host.json` e, sem
|
|
52
|
+
* transporte, calava; a correcao (editar o crontab) foi barrada como persistencia nao autorizada. A
|
|
53
|
+
* maquina ficou nove dias sem batida e ninguem soube.
|
|
54
|
+
*
|
|
55
|
+
* `ork fabrica batida instalar|status|remover` e o comando que o dono autoriza uma vez: instala a linha
|
|
56
|
+
* do template `monitor/pulse.cron` com o checkout canonico e o PATH que acha o `node`, o `claude` e o
|
|
57
|
+
* transporte, preserva as outras entradas do crontab e grava o evento no ledger da maquina
|
|
58
|
+
* (`~/.orkastery/ledger.jsonl`). A linha e marcada (`# ork-batida`) e diz o projeto
|
|
59
|
+
* (`ORK_PULSE_PROJECT`): e por elas que o `remover` tira so a linha dela.
|
|
60
|
+
*
|
|
61
|
+
* O crontab nunca e gravado sem ter sido lido, e a gravacao so vale depois de relida. O executor e
|
|
62
|
+
* injetado: os testes usam um crontab falso e nunca tocam no da maquina.
|
|
63
|
+
*/
|
|
64
|
+
const fs = __importStar(require("node:fs"));
|
|
65
|
+
const path = __importStar(require("node:path"));
|
|
66
|
+
const node_child_process_1 = require("node:child_process");
|
|
67
|
+
const doctor_pulse_cron_1 = require("./doctor-pulse-cron");
|
|
68
|
+
var doctor_pulse_cron_2 = require("./doctor-pulse-cron");
|
|
69
|
+
Object.defineProperty(exports, "ATRASO_DA_BATIDA_MIN", { enumerable: true, get: function () { return doctor_pulse_cron_2.ATRASO_DA_BATIDA_MIN; } });
|
|
70
|
+
Object.defineProperty(exports, "ultimaRodadaDaVarredura", { enumerable: true, get: function () { return doctor_pulse_cron_2.ultimaRodadaDaVarredura; } });
|
|
71
|
+
const estado_thread_1 = require("./estado-thread");
|
|
72
|
+
const ledger_1 = require("./ledger");
|
|
73
|
+
const maquina_1 = require("./maquina");
|
|
74
|
+
const horario_1 = require("./horario");
|
|
75
|
+
const util_1 = require("./util");
|
|
76
|
+
const procedencia_1 = require("./procedencia");
|
|
77
|
+
const autorizacao_duravel_1 = require("./autorizacao-duravel");
|
|
78
|
+
const locale_1 = require("./locale");
|
|
79
|
+
/** O comentario no fim da linha que o `ork` instalou; o `sh` do cron o ignora. */
|
|
80
|
+
exports.MARCA_DA_BATIDA = '# ork-batida';
|
|
81
|
+
/** Os binarios que a varredura chama, alem do `node`: o runtime, a forja e o git. */
|
|
82
|
+
const BINARIOS_DA_VARREDURA = ['claude', 'codex', 'gh', 'git'];
|
|
83
|
+
const PATH_DO_SISTEMA = ['/usr/local/bin', '/usr/bin', '/bin'];
|
|
84
|
+
/** `crontab -` com o texto no stdin, sem shell e com prazo. */
|
|
85
|
+
function gravarCrontabDoSistema(texto) {
|
|
86
|
+
const r = (0, node_child_process_1.spawnSync)('crontab', ['-'], { input: texto, encoding: 'utf8', timeout: 5000 });
|
|
87
|
+
if (r.status === 0)
|
|
88
|
+
return { ok: true };
|
|
89
|
+
const erro = r.error ? r.error.code ?? r.error.message : null;
|
|
90
|
+
if (erro === 'ENOENT')
|
|
91
|
+
return { ok: false, motivo: 'comando crontab ausente nesta maquina' };
|
|
92
|
+
const primeira = `${r.stderr ?? ''}${r.stdout ?? ''}`.trim().split('\n')[0] ?? '';
|
|
93
|
+
return { ok: false, motivo: primeira ? `crontab - falhou: ${primeira}` : `crontab - saiu ${r.status ?? erro ?? 'sem codigo'}` };
|
|
94
|
+
}
|
|
95
|
+
exports.CRONTAB_DO_SISTEMA = { ler: doctor_pulse_cron_1.lerCrontabDoSistema, gravar: gravarCrontabDoSistema };
|
|
96
|
+
/** Caminho que entra na linha do cron: absoluto, sem `%` (o cron o troca por quebra de linha) e sem controle. */
|
|
97
|
+
function caminhoAceito(caminho) {
|
|
98
|
+
return path.isAbsolute(caminho) && !/[%\p{Cc}]/u.test(caminho);
|
|
99
|
+
}
|
|
100
|
+
/** Diretorio aceito no PATH da linha: alem do caminho aceito, sem `:`, o separador do PATH. */
|
|
101
|
+
function diretorioAceito(dir) {
|
|
102
|
+
return caminhoAceito(dir) && !dir.includes(':');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* O executavel do transporte, so do `pulse-host.json` local desta maquina (RM-047, P2): o versionado no git, ou o link,
|
|
106
|
+
* nao poe diretorio nenhum no PATH da batida.
|
|
107
|
+
*/
|
|
108
|
+
function transporteDoProjeto(raiz, dirMonitor) {
|
|
109
|
+
const arquivo = path.join(dirMonitor, 'pulse-host.json');
|
|
110
|
+
try {
|
|
111
|
+
(0, procedencia_1.exigirHostLocal)(raiz, arquivo);
|
|
112
|
+
const config = JSON.parse(fs.readFileSync(arquivo, 'utf8'));
|
|
113
|
+
// RM-063 (fatia 3, H4): o outro host configurado tambem precisa estar no PATH da batida.
|
|
114
|
+
const todos = [config, ...(Array.isArray(config.alternativos) ? config.alternativos : [])];
|
|
115
|
+
return todos.map((t) => (typeof t?.executavel === 'string' ? t.executavel.trim() : '')).filter(Boolean);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* O PATH da linha: o diretorio do `node` que roda este `ork`, os do `claude`, `codex`, `gh` e `git` achados
|
|
123
|
+
* agora, o do executavel do transporte (`pulse-host.json`) e o PATH minimo do sistema. O cron nao carrega o
|
|
124
|
+
* perfil do shell; sem isto a varredura nao acha o runtime nem o transporte (o template avisa).
|
|
125
|
+
*/
|
|
126
|
+
function caminhoDaBatida(opcoes = {}) {
|
|
127
|
+
const achar = opcoes.achar ?? ((bin) => (0, util_1.noPath)(bin));
|
|
128
|
+
const dirs = [];
|
|
129
|
+
const somar = (arquivo) => {
|
|
130
|
+
if (!arquivo || !path.isAbsolute(arquivo))
|
|
131
|
+
return;
|
|
132
|
+
const dir = path.dirname(arquivo);
|
|
133
|
+
if (diretorioAceito(dir) && !dirs.includes(dir))
|
|
134
|
+
dirs.push(dir);
|
|
135
|
+
};
|
|
136
|
+
somar(opcoes.node ?? process.execPath);
|
|
137
|
+
for (const bin of BINARIOS_DA_VARREDURA)
|
|
138
|
+
somar(achar(bin));
|
|
139
|
+
for (const t of typeof opcoes.transporte === 'string' ? [opcoes.transporte] : opcoes.transporte ?? []) {
|
|
140
|
+
somar(path.isAbsolute(t) ? t : achar(t));
|
|
141
|
+
}
|
|
142
|
+
for (const dir of PATH_DO_SISTEMA)
|
|
143
|
+
if (!dirs.includes(dir))
|
|
144
|
+
dirs.push(dir);
|
|
145
|
+
return dirs.join(':');
|
|
146
|
+
}
|
|
147
|
+
/** O script da varredura que a linha roda: o do checkout do projeto, senao o do `ork` instalado. */
|
|
148
|
+
function scriptDaBatida(raiz, scriptDoOrk = (0, doctor_pulse_cron_1.scriptDaVarreduraDoOrk)()) {
|
|
149
|
+
const doProjeto = path.join(raiz, 'monitor', doctor_pulse_cron_1.SCRIPT_DA_VARREDURA);
|
|
150
|
+
return fs.existsSync(doProjeto) ? doProjeto : scriptDoOrk;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* A linha que o `ork` instala: a batida do template (`*\/15`), o projeto alvo, o PATH e o script, com a
|
|
154
|
+
* marca no fim. `raiz` e a raiz canonica (o checkout principal, nunca a worktree de uma thread).
|
|
155
|
+
*/
|
|
156
|
+
function linhaDaBatida(raiz, opcoes = {}) {
|
|
157
|
+
const script = scriptDaBatida(raiz, opcoes.scriptDoOrk === undefined ? (0, doctor_pulse_cron_1.scriptDaVarreduraDoOrk)() : opcoes.scriptDoOrk);
|
|
158
|
+
if (!script) {
|
|
159
|
+
throw new Error(`fabrica.batida.sem-script: nem ${path.join(raiz, 'monitor', doctor_pulse_cron_1.SCRIPT_DA_VARREDURA)} nem o ` +
|
|
160
|
+
`${doctor_pulse_cron_1.SCRIPT_DA_VARREDURA} do ork instalado existem; reinstale o ork (npm i -g @orkastery/cli)`);
|
|
161
|
+
}
|
|
162
|
+
for (const caminho of [raiz, script]) {
|
|
163
|
+
if (!caminhoAceito(caminho)) {
|
|
164
|
+
throw new Error(`fabrica.batida.caminho-invalido: ${JSON.stringify(caminho)} nao cabe numa linha do cron ` +
|
|
165
|
+
'(precisa ser absoluto, sem % e sem caractere de controle)');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const PATH = caminhoDaBatida({ node: opcoes.node, achar: opcoes.achar,
|
|
169
|
+
transporte: transporteDoProjeto(raiz, path.join(raiz, '.orkastery', 'monitor')) });
|
|
170
|
+
return `${doctor_pulse_cron_1.BATIDA_DO_TEMPLATE} ORK_PULSE_PROJECT=${(0, doctor_pulse_cron_1.citarNoShell)(raiz)} PATH=${(0, doctor_pulse_cron_1.citarNoShell)(PATH)} ` +
|
|
171
|
+
`${(0, doctor_pulse_cron_1.citarNoShell)(script)} ${exports.MARCA_DA_BATIDA}`;
|
|
172
|
+
}
|
|
173
|
+
/** A linha foi instalada pelo `ork fabrica batida instalar` (traz a marca no fim)? */
|
|
174
|
+
function linhaGerenciada(linha) {
|
|
175
|
+
return linha.trimEnd().endsWith(exports.MARCA_DA_BATIDA);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* As entradas da varredura DESTE projeto, separadas pela marca. O projeto efetivo considera a linha de ambiente do
|
|
179
|
+
* crontab acima da entrada: o template abaixo de `ORK_PULSE_PROJECT=/outro` e a batida do outro, e fica.
|
|
180
|
+
*/
|
|
181
|
+
function separar(texto, raiz) {
|
|
182
|
+
const doProjeto = (0, doctor_pulse_cron_1.entradasDaVarredura)(texto).filter((e) => (0, doctor_pulse_cron_1.entradaDoProjeto)(e, raiz)).map((e) => e.linha);
|
|
183
|
+
return { gerenciadas: doProjeto.filter(linhaGerenciada), manuais: doProjeto.filter((l) => !linhaGerenciada(l)) };
|
|
184
|
+
}
|
|
185
|
+
function ritmoDa(linha) {
|
|
186
|
+
const t = linha.trim();
|
|
187
|
+
const m = t.startsWith('@') ? /^(@\S+)\s/.exec(t) : /^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s/.exec(t);
|
|
188
|
+
return m ? (0, doctor_pulse_cron_1.intervaloEmMinutos)(m[1]) : null;
|
|
189
|
+
}
|
|
190
|
+
/** `ork fabrica batida status`: o que o crontab desta maquina diz da batida deste projeto, e a ultima rodada. */
|
|
191
|
+
function estadoDaBatida(raizDoProjeto, opcoes = {}) {
|
|
192
|
+
const raiz = (0, estado_thread_1.raizDoEstado)(raizDoProjeto);
|
|
193
|
+
const executor = opcoes.executor ?? exports.CRONTAB_DO_SISTEMA;
|
|
194
|
+
const quando = opcoes.quando ?? new Date().toISOString();
|
|
195
|
+
const leitura = executor.ler();
|
|
196
|
+
const { gerenciadas, manuais } = leitura.ok ? separar(leitura.texto, raiz) : { gerenciadas: [], manuais: [] };
|
|
197
|
+
const ritmos = [...gerenciadas, ...manuais].map(ritmoDa).filter((r) => r !== null);
|
|
198
|
+
const rodada = (0, doctor_pulse_cron_1.ultimaRodadaDaVarredura)(path.join(raiz, '.orkastery', 'monitor'));
|
|
199
|
+
return {
|
|
200
|
+
projeto: raiz, maquina: (0, maquina_1.nomeDaMaquina)(),
|
|
201
|
+
leitura: leitura.ok ? { ok: true } : { ok: false, motivo: leitura.motivo },
|
|
202
|
+
gerenciada: gerenciadas[0]?.trim() ?? null, manuais: manuais.map((l) => l.trim()),
|
|
203
|
+
instalada: gerenciadas.length + manuais.length > 0,
|
|
204
|
+
intervaloMin: ritmos.length ? Math.min(...ritmos) : null,
|
|
205
|
+
ultimaRodada: rodada ? { ...rodada, haMin: Math.max(0, Math.floor((Date.parse(quando) - Date.parse(rodada.em)) / 60000)) } : null,
|
|
206
|
+
...(opcoes.projeto ? { autorizacao: autorizacaoDaBatida(raiz, opcoes.projeto, quando) } : {}),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function autorizacaoDaBatida(raiz, projeto, quando) {
|
|
210
|
+
const l = (0, autorizacao_duravel_1.lerAutorizacao)(raiz, { projeto, agora: new Date(quando) });
|
|
211
|
+
const a = l.valida ? l.autorizacao : null;
|
|
212
|
+
return { estado: l.valida ? 'valida' : l.motivo === 'autorizacao.ausente' ? 'ausente' : 'invalida', motivo: l.valida ? null : l.motivo,
|
|
213
|
+
por: a?.por ?? null, ate: a?.ate ?? null, pode: a ? [...a.pode] : [], linha: (0, autorizacao_duravel_1.linhaDaAutorizacao)(l, quando) };
|
|
214
|
+
}
|
|
215
|
+
function lerParaEditar(executor) {
|
|
216
|
+
const leitura = executor.ler();
|
|
217
|
+
// Nunca gravar sem ter lido: um crontab que nao foi lido seria apagado pela gravacao.
|
|
218
|
+
if (!leitura.ok)
|
|
219
|
+
throw new Error(`fabrica.batida.sem-leitura: ${leitura.motivo}; nada foi gravado`);
|
|
220
|
+
return leitura.texto;
|
|
221
|
+
}
|
|
222
|
+
function gravarEConferir(executor, lido, texto, confere) {
|
|
223
|
+
// O crontab que mudou entre a leitura e a gravacao (um `crontab -e`, outro `instalar`) nao e sobrescrito.
|
|
224
|
+
const antes = executor.ler();
|
|
225
|
+
if (!antes.ok || antes.texto !== lido) {
|
|
226
|
+
throw new Error('fabrica.batida.concorrencia: o crontab mudou durante a operacao; nada foi gravado, rode de novo');
|
|
227
|
+
}
|
|
228
|
+
const gravacao = executor.gravar(texto);
|
|
229
|
+
if (!gravacao.ok)
|
|
230
|
+
throw new Error(`fabrica.batida.sem-gravacao: ${gravacao.motivo}`);
|
|
231
|
+
const relido = executor.ler();
|
|
232
|
+
if (!relido.ok || !confere(relido.texto)) {
|
|
233
|
+
throw new Error(`fabrica.batida.nao-confirmada: o crontab relido nao traz o que foi gravado` +
|
|
234
|
+
(relido.ok ? '' : ` (${relido.motivo})`) + '; confira com crontab -l');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** O texto do crontab sem as linhas pedidas, com o fim de linha que o cron exige. */
|
|
238
|
+
function semAsLinhas(texto, sair) {
|
|
239
|
+
const ficam = texto.split('\n').filter((l) => !sair.has(l));
|
|
240
|
+
while (ficam.length && ficam[ficam.length - 1].trim() === '')
|
|
241
|
+
ficam.pop();
|
|
242
|
+
return ficam.length ? `${ficam.join('\n')}\n` : '';
|
|
243
|
+
}
|
|
244
|
+
function noLedgerDaMaquina(tipo, dados) {
|
|
245
|
+
return (0, ledger_1.registrar)((0, maquina_1.pastaDoUsuario)(), 'maquina', tipo, { maquina: (0, maquina_1.nomeDaMaquina)(), ...dados }).eventId;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* `ork fabrica batida instalar`: idempotente. A linha igual ja instalada nao muda nada; a linha antiga do
|
|
249
|
+
* `ork` e a linha posta a mao da varredura deste projeto saem, e a linha do template entra no lugar. As
|
|
250
|
+
* outras entradas do crontab ficam como estavam.
|
|
251
|
+
*/
|
|
252
|
+
function instalarBatida(raizDoProjeto, opcoes = {}) {
|
|
253
|
+
const raiz = (0, estado_thread_1.raizDoEstado)(raizDoProjeto);
|
|
254
|
+
const executor = opcoes.executor ?? exports.CRONTAB_DO_SISTEMA;
|
|
255
|
+
const linha = linhaDaBatida(raiz, opcoes);
|
|
256
|
+
const texto = lerParaEditar(executor);
|
|
257
|
+
const { gerenciadas, manuais } = separar(texto, raiz);
|
|
258
|
+
if (manuais.length === 0 && gerenciadas.length === 1 && gerenciadas[0].trim() === linha) {
|
|
259
|
+
return { acao: 'ja-instalada', projeto: raiz, linha, retiradas: [], manuais: [], eventId: null };
|
|
260
|
+
}
|
|
261
|
+
const retiradas = [...gerenciadas, ...manuais];
|
|
262
|
+
const base = semAsLinhas(texto, new Set(retiradas));
|
|
263
|
+
gravarEConferir(executor, texto, `${base}${linha}\n`, (relido) => relido.split('\n').some((l) => l.trim() === linha));
|
|
264
|
+
const eventId = noLedgerDaMaquina(ledger_1.TIPOS_DE_EVENTO.batidaInstalada, {
|
|
265
|
+
projeto: raiz, linha, retiradas: retiradas.map((l) => l.trim()), por: opcoes.por ?? null,
|
|
266
|
+
evidencia: 'crontab -l relido depois da gravacao traz a linha',
|
|
267
|
+
});
|
|
268
|
+
return { acao: 'instalou', projeto: raiz, linha, retiradas: retiradas.map((l) => l.trim()), manuais: [], eventId };
|
|
269
|
+
}
|
|
270
|
+
/** `ork fabrica batida remover`: tira so a linha que o `ork` instalou para este projeto. */
|
|
271
|
+
function removerBatida(raizDoProjeto, opcoes = {}) {
|
|
272
|
+
const raiz = (0, estado_thread_1.raizDoEstado)(raizDoProjeto);
|
|
273
|
+
const executor = opcoes.executor ?? exports.CRONTAB_DO_SISTEMA;
|
|
274
|
+
const texto = lerParaEditar(executor);
|
|
275
|
+
const { gerenciadas, manuais } = separar(texto, raiz);
|
|
276
|
+
const ficam = manuais.map((l) => l.trim());
|
|
277
|
+
if (gerenciadas.length === 0)
|
|
278
|
+
return { acao: 'nao-instalada', projeto: raiz, linha: null, retiradas: [], manuais: ficam, eventId: null };
|
|
279
|
+
const sair = new Set(gerenciadas);
|
|
280
|
+
gravarEConferir(executor, texto, semAsLinhas(texto, sair), (relido) => separar(relido, raiz).gerenciadas.length === 0);
|
|
281
|
+
const eventId = noLedgerDaMaquina(ledger_1.TIPOS_DE_EVENTO.batidaRemovida, {
|
|
282
|
+
projeto: raiz, retiradas: gerenciadas.map((l) => l.trim()), manuaisQueFicaram: ficam, por: opcoes.por ?? null,
|
|
283
|
+
evidencia: 'crontab -l relido depois da gravacao nao traz a linha do ork',
|
|
284
|
+
});
|
|
285
|
+
return { acao: 'removeu', projeto: raiz, linha: null, retiradas: gerenciadas.map((l) => l.trim()), manuais: ficam, eventId };
|
|
286
|
+
}
|
|
287
|
+
function textoDoEstadoDaBatida(e, quando = new Date().toISOString()) {
|
|
288
|
+
const m = (0, locale_1.msg)().operacao.restante.fabrica.batida;
|
|
289
|
+
const linhas = [m.titulo(e.maquina, e.projeto)];
|
|
290
|
+
if (!e.leitura.ok)
|
|
291
|
+
linhas.push(m.naoLido(e.leitura.motivo));
|
|
292
|
+
else if (!e.instalada)
|
|
293
|
+
linhas.push(m.naoInstalada);
|
|
294
|
+
else {
|
|
295
|
+
const ritmo = e.intervaloMin === null ? m.horarioIlegivel : m.aCada(e.intervaloMin);
|
|
296
|
+
linhas.push(m.instalada(ritmo, !!e.gerenciada));
|
|
297
|
+
for (const l of [...(e.gerenciada ? [e.gerenciada] : []), ...e.manuais])
|
|
298
|
+
linhas.push(m.linha(l));
|
|
299
|
+
}
|
|
300
|
+
const r = e.ultimaRodada;
|
|
301
|
+
if (!r)
|
|
302
|
+
linhas.push(m.semRodada);
|
|
303
|
+
else {
|
|
304
|
+
linhas.push(m.rodada((0, horario_1.formatarHora)(r.em, { agora: quando }), r.haMin, m.codigo(r.code), r.detalhe || m.semDetalhe));
|
|
305
|
+
if (e.instalada && r.haMin > doctor_pulse_cron_1.ATRASO_DA_BATIDA_MIN) {
|
|
306
|
+
linhas.push(m.atrasada(r.haMin));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (e.autorizacao)
|
|
310
|
+
linhas.push(` ${e.autorizacao.linha}`);
|
|
311
|
+
linhas.push((0, horario_1.legendaDoFuso)());
|
|
312
|
+
return linhas.join('\n');
|
|
313
|
+
}
|
|
314
|
+
function textoDoResultadoDaBatida(r) {
|
|
315
|
+
const m = (0, locale_1.msg)().operacao.restante.fabrica.batida;
|
|
316
|
+
switch (r.acao) {
|
|
317
|
+
case 'ja-instalada': return m.jaInstalada(r.projeto, r.linha);
|
|
318
|
+
case 'instalou': return [m.instalou(r.projeto, r.eventId), m.linha(r.linha),
|
|
319
|
+
...r.retiradas.map(m.saiu), m.confira].join('\n');
|
|
320
|
+
case 'removeu': return [m.removeu(r.projeto, r.eventId), ...r.retiradas.map(m.saiu), ...r.manuais.map(m.ficou)].join('\n');
|
|
321
|
+
case 'nao-instalada': return [m.nenhumaInstalada(r.projeto), ...r.manuais.map(m.ficou)].join('\n');
|
|
322
|
+
}
|
|
323
|
+
}
|
package/dist/fabrica-estado.js
CHANGED
|
@@ -57,8 +57,9 @@ exports.painelDaFabricaEmMarkdown = painelDaFabricaEmMarkdown;
|
|
|
57
57
|
* GitHub. `ork board`, `ork fabrica` e o resumo do pulse leem as outras maquinas dali. Cada
|
|
58
58
|
* maquina so escreve o proprio arquivo: push recusado se resolve relendo a ponta.
|
|
59
59
|
*
|
|
60
|
-
* Publicar e empurrar para o remoto do projeto, entao so acontece sozinho com
|
|
61
|
-
* `fabrica
|
|
60
|
+
* Publicar e empurrar para o remoto do projeto, entao so acontece sozinho com a adesao da maquina
|
|
61
|
+
* (`ork fabrica entrar`); o `fabrica.compartilhada` do manifesto so pede (RM-047, P5), e
|
|
62
|
+
* `ork fabrica publicar` e o caminho explicito. Nada de
|
|
62
63
|
* credencial, prompt, log ou caminho local sai daqui: so identificadores, fase, status e o assunto
|
|
63
64
|
* da pausa que espera o dono.
|
|
64
65
|
*
|
|
@@ -82,6 +83,8 @@ const thread_1 = require("./thread");
|
|
|
82
83
|
const util_1 = require("./util");
|
|
83
84
|
const versao_1 = require("./versao");
|
|
84
85
|
const saida_segura_1 = require("./saida-segura");
|
|
86
|
+
const vida_da_thread_1 = require("./vida-da-thread");
|
|
87
|
+
const locale_1 = require("./locale");
|
|
85
88
|
exports.CONTRATO_MAQUINA = 'ork.fabrica-maquina/v1';
|
|
86
89
|
exports.BRANCH_DA_FABRICA = 'ork/fabrica-estado';
|
|
87
90
|
/** O diretorio dos retratos na branch; a leitura sem clone (RM-054) le o mesmo. */
|
|
@@ -162,17 +165,37 @@ function retratoDaMaquina(carregado, opcoes = {}) {
|
|
|
162
165
|
const linhas = new Map(monitor.linhas.map((l) => [l.thread, l]));
|
|
163
166
|
const entregas = entregasNaBase(raiz, carregado.manifesto.worktree.base_branch, remoto);
|
|
164
167
|
const itemDaThread = new Map((0, roadmap_reservas_1.reservasLocais)(raiz, remoto).filter((r) => r.thread).map((r) => [r.thread, r.item]));
|
|
168
|
+
let leitura;
|
|
169
|
+
const lerUmaVez = () => (leitura ??= (opcoes.runtime ?? (() => (0, vida_da_thread_1.lerRuntime)(raiz)))());
|
|
165
170
|
const threads = itens.map(({ thread: t, raiz: raizDoPerfil }) => {
|
|
166
171
|
const entregue = entregas.get(t.id) ?? null;
|
|
167
172
|
// RM-037 (fatia 4): o fim de turno sem pergunta e do condutor, e as outras maquinas nao o leem como espera
|
|
168
173
|
// do dono. Sai so a pausa que o observador abriu nele; outra pausa da thread continua contando.
|
|
169
174
|
let espera = null;
|
|
175
|
+
let eventos = [];
|
|
170
176
|
try {
|
|
171
|
-
|
|
177
|
+
eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raizDoPerfil, t.id));
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
eventos = [];
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
espera = (0, parado_no_condutor_1.esperaDoCondutor)(t, eventos, quando);
|
|
172
184
|
}
|
|
173
185
|
catch {
|
|
174
186
|
espera = null;
|
|
175
187
|
}
|
|
188
|
+
// RM-063 (F2): a fabrica so mostra a thread como andando com a sessao viva verificada no runtime.
|
|
189
|
+
let sessao = null;
|
|
190
|
+
if (!entregue) {
|
|
191
|
+
try {
|
|
192
|
+
const v = (0, vida_da_thread_1.vidaDaThread)(t, eventos, lerUmaVez, Date.parse(quando));
|
|
193
|
+
sessao = { viva: v.viva, desdeEm: v.desdeEm, motivo: v.motivo };
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
sessao = null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
176
199
|
const pausas = (linhas.get(t.id)?.pausas ?? []).filter((p) => !(espera && p.motivo === 'human.pending' && p.fonte === 'ledger' &&
|
|
177
200
|
p.fase === (espera.fase ?? t.faseAtual)));
|
|
178
201
|
const pausa = pausas[0];
|
|
@@ -184,6 +207,7 @@ function retratoDaMaquina(carregado, opcoes = {}) {
|
|
|
184
207
|
esperaVoce, pergunta: esperaVoce && pausa ? curto(pausa.pausaSobre || pausa.detalhe) : null,
|
|
185
208
|
paradaDesde: esperaVoce && pausa ? pausa.desdeEm : null,
|
|
186
209
|
...despachoDaThread((0, thread_1.dirThread)(raizDoPerfil, t.id)),
|
|
210
|
+
sessao,
|
|
187
211
|
};
|
|
188
212
|
}).sort((a, b) => a.id.localeCompare(b.id));
|
|
189
213
|
const eu = (0, roadmap_reservas_1.quemSouEu)(raiz, { por: opcoes.por, maquina: opcoes.maquina });
|
|
@@ -323,14 +347,20 @@ function tabela(cabecalho, linhas) {
|
|
|
323
347
|
const linha = (l) => ' ' + l.map((c, i) => c.padEnd(largura[i])).join(' ').trimEnd();
|
|
324
348
|
return [linha(cabecalho), linha(largura.map((n) => '-'.repeat(n))), ...linhas.map(linha)];
|
|
325
349
|
}
|
|
350
|
+
/** RM-063 (F2): a coluna da sessao: `viva`, `parada desde HH:MM: <motivo>`, ou `-` no retrato que nao a traz. */
|
|
351
|
+
function sessaoNaFabrica(t, teto) {
|
|
352
|
+
const v = (0, vida_da_thread_1.vidaDoRetrato)(t.sessao);
|
|
353
|
+
return v.viva ? 'viva' : v.motivo === null ? '-' : curto((0, vida_da_thread_1.paradaDesde)(v), teto);
|
|
354
|
+
}
|
|
326
355
|
function blocoDaMaquina(m, eu) {
|
|
356
|
+
const t = (0, locale_1.msg)().operacao.restante.fabrica;
|
|
327
357
|
const vivas = ativas(m), entregues = m.threads.length - vivas.length;
|
|
328
|
-
const cabeca =
|
|
329
|
-
`${vivas.length} thread(s) ativa(s)` + (entregues ? `, ${entregues} entregue(s) sem MASTER` : '');
|
|
358
|
+
const cabeca = t.maquina(m.maquina, m.maquina === eu ? t.estaMaquina : '', m.por, (0, horario_1.formatarDataHora)(m.publicadoEm), vivas.length, entregues);
|
|
330
359
|
if (vivas.length === 0)
|
|
331
360
|
return [cabeca];
|
|
332
|
-
return [cabeca, ...tabela([
|
|
333
|
-
|
|
361
|
+
return [cabeca, ...tabela([...t.colunas], vivas.map((thread) => [
|
|
362
|
+
thread.id, thread.modo, thread.fase, runtimeDaThread(thread), thread.roadmap ?? '-',
|
|
363
|
+
thread.esperaVoce ? t.espera(curto(thread.pergunta ?? t.veredito, 40)) : '-', sessaoNaFabrica(thread, 70),
|
|
334
364
|
]))];
|
|
335
365
|
}
|
|
336
366
|
/**
|
|
@@ -339,12 +369,13 @@ function blocoDaMaquina(m, eu) {
|
|
|
339
369
|
* que o terminal execute.
|
|
340
370
|
*/
|
|
341
371
|
function textoDaFabrica(painel, eu) {
|
|
372
|
+
const t = (0, locale_1.msg)().operacao.restante.fabrica;
|
|
342
373
|
const p = (0, saida_segura_1.valoresEmUmaLinha)(painel);
|
|
343
374
|
const linhas = [];
|
|
344
375
|
if (!p.atualizado)
|
|
345
|
-
linhas.push(
|
|
376
|
+
linhas.push(t.copia, '');
|
|
346
377
|
if (p.maquinas.length === 0) {
|
|
347
|
-
linhas.push(
|
|
378
|
+
linhas.push(t.nenhuma(exports.BRANCH_DA_FABRICA));
|
|
348
379
|
return linhas.join('\n');
|
|
349
380
|
}
|
|
350
381
|
for (const m of p.maquinas)
|
|
@@ -354,12 +385,13 @@ function textoDaFabrica(painel, eu) {
|
|
|
354
385
|
}
|
|
355
386
|
/** A secao de `ork board` com as outras maquinas, saneada como o `ork fabrica`. */
|
|
356
387
|
function textoDasOutrasMaquinas(painel, eu) {
|
|
388
|
+
const t = (0, locale_1.msg)().operacao.restante.fabrica;
|
|
357
389
|
const p = (0, saida_segura_1.valoresEmUmaLinha)(painel);
|
|
358
390
|
const outras = p.maquinas.filter((m) => m.maquina !== eu);
|
|
359
|
-
const origem = p.atualizado ?
|
|
391
|
+
const origem = p.atualizado ? t.origens.atual : t.origens.copia;
|
|
360
392
|
if (outras.length === 0)
|
|
361
|
-
return
|
|
362
|
-
const linhas = [
|
|
393
|
+
return t.outrasNenhuma(exports.BRANCH_DA_FABRICA, origem);
|
|
394
|
+
const linhas = [t.outras(exports.BRANCH_DA_FABRICA, origem)];
|
|
363
395
|
for (const m of outras)
|
|
364
396
|
linhas.push(...blocoDaMaquina(m, eu).map((l, i) => (i === 0 ? ` ${l}` : l)));
|
|
365
397
|
return linhas.join('\n');
|
|
@@ -372,17 +404,18 @@ function painelDaFabricaEmMarkdown(maquinas) {
|
|
|
372
404
|
'O que cada máquina está conduzindo agora. Gerado pelo `ork fabrica publicar`; não edite à mão.',
|
|
373
405
|
'Antes de pegar um item do roadmap: `ork roadmap reservas`.',
|
|
374
406
|
'',
|
|
375
|
-
'| Máquina | Thread | Modo | Fase | Runtime | Item | Espera você | Publicado |',
|
|
376
|
-
'| --- | --- | --- | --- | --- | --- | --- | --- |',
|
|
407
|
+
'| Máquina | Thread | Modo | Fase | Runtime | Item | Espera você | Publicado | Sessão |',
|
|
408
|
+
'| --- | --- | --- | --- | --- | --- | --- | --- | --- |',
|
|
377
409
|
];
|
|
378
410
|
const vivas = maquinas.flatMap((m) => ativas(m).map((t) => ({ m, t })));
|
|
379
411
|
if (vivas.length === 0)
|
|
380
|
-
linhas.push('| — | nenhuma thread ativa | — | — | | — | — | — |');
|
|
412
|
+
linhas.push('| — | nenhuma thread ativa | — | — | | — | — | — | — |');
|
|
381
413
|
for (const { m, t } of vivas) {
|
|
382
414
|
const pergunta = t.esperaVoce ? `sim: ${curto(t.pergunta ?? 'veredito', 60).replace(/\|/g, '/')}` : '—';
|
|
383
415
|
// RM-037 (sugestao 6 do CHECK 1): a celula sem despacho diz isso, sem travessao novo.
|
|
384
416
|
const runtime = t.runtime || t.modelo ? runtimeDaThread(t).replace(/\|/g, '/') : 'sem despacho';
|
|
385
|
-
|
|
417
|
+
const sessao = sessaoNaFabrica(t, 80).replace(/\|/g, '/').replace(/^-$/, '—');
|
|
418
|
+
linhas.push(`| ${m.maquina} | ${t.id} | ${t.modo} | ${t.fase} | ${runtime} | ${t.roadmap ?? '—'} | ${pergunta} | ${(0, horario_1.formatarDataHora)(m.publicadoEm)} | ${sessao} |`);
|
|
386
419
|
}
|
|
387
420
|
return [...linhas, '', (0, horario_1.legendaDoFuso)(), ''].join('\n');
|
|
388
421
|
}
|
package/dist/fabrica-publicar.js
CHANGED
|
@@ -48,6 +48,7 @@ const fs = __importStar(require("node:fs"));
|
|
|
48
48
|
const path = __importStar(require("node:path"));
|
|
49
49
|
const maquina_1 = require("./maquina");
|
|
50
50
|
const manifest_1 = require("./manifest");
|
|
51
|
+
const projeto_alvo_1 = require("./projeto-alvo");
|
|
51
52
|
const rede_adesao_1 = require("./rede-adesao");
|
|
52
53
|
/**
|
|
53
54
|
* Publica sem segurar quem chamou (thread nova, despacho de fase, entrega). So com a fabrica
|
|
@@ -72,7 +73,8 @@ function publicarEmSegundoPlano(raiz) {
|
|
|
72
73
|
if (!fs.existsSync(cli))
|
|
73
74
|
return false;
|
|
74
75
|
try {
|
|
75
|
-
|
|
76
|
+
// RM-052 (fatia 2, D2): o filho publica o projeto do proprio cwd; o modo host de quem chamou nao o segue.
|
|
77
|
+
const filho = (0, node_child_process_1.spawn)(process.execPath, [cli, 'fabrica', 'publicar', '--silencioso'], { cwd: carregado.raiz, detached: true, stdio: 'ignore', env: { ...process.env, ...projeto_alvo_1.AMBIENTE_SEM_PROJETO_HERDADO } });
|
|
76
78
|
filho.unref();
|
|
77
79
|
return true;
|
|
78
80
|
}
|