@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,339 @@
|
|
|
1
|
+
// O Portão de Tarefas (RM-059, fatia F10). Na sessão de fase do GO, o quadro de tarefas do Claude Code é o do
|
|
2
|
+
// plano: a tarefa nativa só entra apontando uma tarefa do plano com `touch_paths` e verify que o núcleo confere
|
|
3
|
+
// (T10.1), só fecha com essa conferência aprovada (T10.2) e, com agent teams no piloto do núcleo, vai ao teammate
|
|
4
|
+
// ocioso quando a região dela está livre (T10.3). O Portão lê o núcleo pelo `$.ork` da ponte e pela ferramenta de
|
|
5
|
+
// leitura do plano, nunca o estado interno do disco; age só por comando do `ork`; nunca roda o verify por conta
|
|
6
|
+
// própria, nunca toma lease e nunca fala pelo dono. A lógica fica nos módulos puros ao lado; aqui só as chamadas ao
|
|
7
|
+
// `$`, sempre escritas como `x.noun.metodo(...)`, como o validador exige.
|
|
8
|
+
import type { EngineInterface, Register } from 'claude-code'
|
|
9
|
+
import type { PortaoQuadro, PortaoTarefa } from '../types'
|
|
10
|
+
import {
|
|
11
|
+
argsDoPlano, decidirCriacao, escopoDoPlano, escopoDoRetrato, FERRAMENTA_DO_PLANO, IDADE_DO_PLANO_MS, IDADE_SEM_PLANO_MS,
|
|
12
|
+
idsNoAssunto, jsonDoMcp, SERVIDOR, serveAoQuadro, tarefasDoPlano, textoDaRecusa, textoDoPlano, threadNoRetrato,
|
|
13
|
+
} from './plano'
|
|
14
|
+
import {
|
|
15
|
+
argvDaConferencia, assinatura, contarRepeticao, lerConferencia, textoDeOutraConferencia, textoDoBloqueio, textoDoStatus,
|
|
16
|
+
VIGIA_DA_CONFERENCIA_MS,
|
|
17
|
+
} from './verify'
|
|
18
|
+
import type { Leitura } from './verify'
|
|
19
|
+
import {
|
|
20
|
+
escolherTarefa, nomeDoTeammate, paginaDosLeases, recusaDoTeammate, TETO_DE_PAGINAS_DE_LEASES, tetosDoAmbiente,
|
|
21
|
+
textoDaEntrega, VIVOS,
|
|
22
|
+
} from './lease'
|
|
23
|
+
import type { LeaseAtivo } from './lease'
|
|
24
|
+
|
|
25
|
+
const QUADRO = { plugin: 'ork-portao', key: 'quadro' } as const
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* O quadro desta carga do módulo (D9 do plano da thread): lido do `$.state` uma vez por thread e mudado só por
|
|
29
|
+
* `mudarQuadro`, que aplica a mudança na versão mais nova sem esperar nada no meio e então grava sem versão. Um gancho
|
|
30
|
+
* que espera uma chamada de `$` deixa outro gancho rodar: mudança feita sobre uma cópia lida antes apagaria a dele.
|
|
31
|
+
*/
|
|
32
|
+
let quadro: PortaoQuadro | null = null
|
|
33
|
+
/** O plano lido e quando, por thread; relido depois da idade (D3). */
|
|
34
|
+
let plano: { thread: string; em: number; tarefas: PortaoTarefa[] | null } | null = null
|
|
35
|
+
/**
|
|
36
|
+
* A tarefa do plano que o Portão está conferindo no núcleo agora (D5): uma conferência por vez. Fica no módulo, não no
|
|
37
|
+
* `$.state`: uma troca do worker mata o processo junto com a marca.
|
|
38
|
+
*/
|
|
39
|
+
let conferindo: string | null = null
|
|
40
|
+
|
|
41
|
+
/** A sessão de fase com thread, pelo contexto da ponte; qualquer outra sessão fica sem Portão (D1). */
|
|
42
|
+
type ContextoDeFase = { thread: string; raiz: string }
|
|
43
|
+
/**
|
|
44
|
+
* A sessão em que o Portão age (D1): o contexto e as tarefas do plano, ou `null` nelas quando o plano não serve ao quadro
|
|
45
|
+
* (ausente, sem tarefa que sirva ou com a leitura falhando). Sem elas, a criação e o teammate passam, mas a tarefa
|
|
46
|
+
* registrada na criação continua conferida na conclusão: o núcleo lê o plano por conta própria.
|
|
47
|
+
*/
|
|
48
|
+
type Sessao = { ctx: ContextoDeFase; tarefas: PortaoTarefa[] | null }
|
|
49
|
+
|
|
50
|
+
const mensagem = (erro: unknown) => (erro instanceof Error ? erro.message : String(erro)).slice(0, 300)
|
|
51
|
+
|
|
52
|
+
function quadroVazio(thread: string): PortaoQuadro {
|
|
53
|
+
return { thread, tarefas: {}, concluidas: [], repeticoes: {}, atribuicoes: {}, devolvidas: [], ultimaFalha: null }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function contextoDeFase($: EngineInterface): Promise<ContextoDeFase | null> {
|
|
57
|
+
const ctx = await $.ork.contexto()
|
|
58
|
+
return ctx.papel === 'fase' && ctx.thread ? { thread: ctx.thread, raiz: ctx.raiz } : null
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** O quadro da thread: o do módulo, ou o do `$.state` na primeira leitura (a que chegar primeiro vale). */
|
|
62
|
+
async function lerQuadro($: EngineInterface, thread: string): Promise<PortaoQuadro> {
|
|
63
|
+
if (quadro && quadro.thread === thread) return quadro
|
|
64
|
+
const lido = (await $.state.get(QUADRO)).value
|
|
65
|
+
if (quadro && quadro.thread === thread) return quadro
|
|
66
|
+
quadro = lido && lido.thread === thread ? { ...quadroVazio(thread), ...lido } : quadroVazio(thread)
|
|
67
|
+
return quadro
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Aplica `mudar` ao quadro mais novo, sem esperar nada entre ler e trocar, e grava (D9). `mudar` que devolve o mesmo
|
|
72
|
+
* quadro não grava nada.
|
|
73
|
+
*/
|
|
74
|
+
async function mudarQuadro($: EngineInterface, thread: string, mudar: (q: PortaoQuadro) => PortaoQuadro): Promise<PortaoQuadro> {
|
|
75
|
+
await lerQuadro($, thread)
|
|
76
|
+
const atual = quadro as PortaoQuadro
|
|
77
|
+
const novo = mudar(atual)
|
|
78
|
+
if (novo === atual) return atual
|
|
79
|
+
quadro = novo
|
|
80
|
+
await $.state.set(QUADRO, novo)
|
|
81
|
+
return novo
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** As tarefas do plano pela ferramenta de leitura do núcleo, com a idade da D3; erro sobe para quem chamou. */
|
|
85
|
+
async function lerTarefas($: EngineInterface, ctx: ContextoDeFase): Promise<PortaoTarefa[] | null> {
|
|
86
|
+
const agora = await $.clock.now()
|
|
87
|
+
if (plano && plano.thread === ctx.thread) {
|
|
88
|
+
const idade = agora - plano.em
|
|
89
|
+
const teto = plano.tarefas && plano.tarefas.length > 0 ? IDADE_DO_PLANO_MS : IDADE_SEM_PLANO_MS
|
|
90
|
+
if (idade >= 0 && idade < teto) return plano.tarefas
|
|
91
|
+
}
|
|
92
|
+
const r = await $.mcp.call(SERVIDOR, FERRAMENTA_DO_PLANO, argsDoPlano(ctx.thread))
|
|
93
|
+
const tarefas = tarefasDoPlano(textoDoPlano(jsonDoMcp(r, FERRAMENTA_DO_PLANO)))
|
|
94
|
+
plano = { thread: ctx.thread, em: agora, tarefas }
|
|
95
|
+
return tarefas
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A sessão em que o Portão age (D1): papel `fase` com thread, thread não fechada e GO no bloco pelo retrato da ponte. O
|
|
100
|
+
* retrato que falha conta como GO e aberta, e fica na linha de status. As tarefas vêm do plano legível com ao menos uma
|
|
101
|
+
* tarefa que serve ao quadro; sem ele, `null`.
|
|
102
|
+
*/
|
|
103
|
+
async function sessaoDoPortao($: EngineInterface): Promise<Sessao | null> {
|
|
104
|
+
const ctx = await contextoDeFase($)
|
|
105
|
+
if (!ctx) return null
|
|
106
|
+
let retrato: { status: string | null; bloco: string | null } | null
|
|
107
|
+
try {
|
|
108
|
+
retrato = threadNoRetrato((await $.ork.retrato({ thread: ctx.thread })).retrato, ctx.thread)
|
|
109
|
+
} catch {
|
|
110
|
+
retrato = null
|
|
111
|
+
}
|
|
112
|
+
const doRetrato = escopoDoRetrato(retrato)
|
|
113
|
+
if (!doRetrato.ativo) return null
|
|
114
|
+
if (doRetrato.avisos.length > 0) $.ui.status(`portão: ${doRetrato.avisos.join('; ')}`)
|
|
115
|
+
let tarefas: PortaoTarefa[] | null
|
|
116
|
+
try {
|
|
117
|
+
tarefas = await lerTarefas($, ctx)
|
|
118
|
+
} catch (erro) {
|
|
119
|
+
await anotarFalha($, 'leitura do plano', erro, ctx.thread)
|
|
120
|
+
return { ctx, tarefas: null }
|
|
121
|
+
}
|
|
122
|
+
return { ctx, tarefas: escopoDoPlano(tarefas).ativo ? tarefas : null }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Guarda a falha do próprio Portão no quadro e a diz uma vez no transcript (não vai ao modelo) e na linha de
|
|
127
|
+
* status: nenhuma captura fica muda.
|
|
128
|
+
*/
|
|
129
|
+
async function anotarFalha($: EngineInterface, onde: string, erro: unknown, thread?: string): Promise<void> {
|
|
130
|
+
const motivo = mensagem(erro)
|
|
131
|
+
$.ui.status(`portão: falhou em ${onde}`)
|
|
132
|
+
const alvo = thread ?? quadro?.thread
|
|
133
|
+
if (!alvo) {
|
|
134
|
+
$.ui.log(`Portão de Tarefas: falhou em ${onde}: ${motivo}`)
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
const em = await $.clock.now()
|
|
138
|
+
let nova = false
|
|
139
|
+
await mudarQuadro($, alvo, q => {
|
|
140
|
+
if (q.ultimaFalha?.onde === onde && q.ultimaFalha.motivo === motivo) return q
|
|
141
|
+
nova = true
|
|
142
|
+
return { ...q, ultimaFalha: { onde, motivo, em } }
|
|
143
|
+
})
|
|
144
|
+
if (nova) $.ui.log(`Portão de Tarefas: falhou em ${onde}: ${motivo}`)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* A tarefa do plano de uma tarefa nativa (D2): a registrada na criação vence (renomear não tira a tarefa do portão);
|
|
149
|
+
* sem registro, o assunto que cita uma tarefa do plano que serve ao quadro, e uma só. Fora disso, a tarefa não é do
|
|
150
|
+
* plano: a que o núcleo não confere nunca prende a conclusão.
|
|
151
|
+
*/
|
|
152
|
+
function tarefaDoEvento(assunto: unknown, taskId: string, q: PortaoQuadro, tarefas: readonly PortaoTarefa[]): string | null {
|
|
153
|
+
const registrada = q.tarefas[taskId]
|
|
154
|
+
if (registrada) return registrada
|
|
155
|
+
const ids = idsNoAssunto(assunto).filter(id => tarefas.some(t => t.id === id && serveAoQuadro(t)))
|
|
156
|
+
return ids.length === 1 ? (ids[0] as string) : null
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* A conferência do verify da tarefa no núcleo (D4, D5): `ork claims conferir --tarefa` por `$.process.run`, na raiz
|
|
161
|
+
* da sessão, com o vigia do mod. A espera é chamada de `$` e não conta no orçamento do gancho.
|
|
162
|
+
*/
|
|
163
|
+
async function rodarConferencia($: EngineInterface, ctx: ContextoDeFase, tarefa: string): Promise<Leitura> {
|
|
164
|
+
try {
|
|
165
|
+
const r = await $.process.run(argvDaConferencia(ctx.thread, tarefa), { cwd: ctx.raiz, timeoutMs: VIGIA_DA_CONFERENCIA_MS })
|
|
166
|
+
return lerConferencia(tarefa, r.stdout, r.exitCode, r.stderr)
|
|
167
|
+
} catch (erro) {
|
|
168
|
+
return { tipo: 'indisponivel', motivo: `ork claims conferir não rodou: ${mensagem(erro)}` }
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Os tetos do piloto de agent teams que o núcleo passou no ambiente da sessão (D10); `null` sem eles. */
|
|
173
|
+
async function lerTetos($: EngineInterface): Promise<{ teammates: number; custoUsd: number } | null> {
|
|
174
|
+
// O validador pede o nome literal; o teste do núcleo confere que ele é o de ENV_TEAMMATES e ENV_CUSTO.
|
|
175
|
+
return tetosDoAmbiente(await $.env.get('ORK_AGENT_TEAMS_TEAMMATES'), await $.env.get('ORK_AGENT_TEAMS_CUSTO_USD'))
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** O custo da sessão como o `/cost` soma; `null` quando ele não vem. */
|
|
179
|
+
async function custoDaSessao($: EngineInterface): Promise<number | null> {
|
|
180
|
+
const uso = await $.session.usage()
|
|
181
|
+
return typeof uso.cost?.usd === 'number' ? uso.cost.usd : null
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Os leases ativos de todas as threads (D8 revista), página a página pelo `nextOffset`. O servidor MCP da sessão de fase
|
|
186
|
+
* é fixado na thread e o retrato dele só traz os leases dela; por isso a leitura vai pela consulta `maestro` da lista
|
|
187
|
+
* fechada da ponte (`ork maestro --json --section leases --offset N`), que vê o projeto inteiro. Lança se uma página não
|
|
188
|
+
* vem ou se a leitura fica incompleta (lacuna de verdade, retrato em conflito, mais páginas que o teto): lista parcial
|
|
189
|
+
* nunca vira região livre.
|
|
190
|
+
*/
|
|
191
|
+
async function lerLeases($: EngineInterface): Promise<LeaseAtivo[]> {
|
|
192
|
+
const leases: LeaseAtivo[] = []
|
|
193
|
+
let offset = 0
|
|
194
|
+
for (let pagina = 0; pagina < TETO_DE_PAGINAS_DE_LEASES; pagina++) {
|
|
195
|
+
const pedido = { consulta: 'maestro' as const, secao: 'leases' as const, offset }
|
|
196
|
+
const p = paginaDosLeases(await $.ork.ler(pedido))
|
|
197
|
+
if (p.lacuna) throw new Error(`ork-portao: ${p.lacuna}`)
|
|
198
|
+
leases.push(...p.leases)
|
|
199
|
+
if (p.proximo === null) return leases
|
|
200
|
+
offset = p.proximo
|
|
201
|
+
}
|
|
202
|
+
throw new Error(`ork-portao: a seção leases tem mais de ${TETO_DE_PAGINAS_DE_LEASES} páginas; o resto não foi lido`)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export const register: Register = on => {
|
|
206
|
+
// A criação (T10.1): a tarefa nativa só entra apontando uma tarefa do plano que serve ao quadro (D2, D3). A recusa
|
|
207
|
+
// volta ao modelo pelo `block`, com o motivo e as tarefas que servem; a que passa fica registrada pelo id nativo.
|
|
208
|
+
on('classic.TaskCreated', async ($, e, next) => {
|
|
209
|
+
const sessao = await sessaoDoPortao($)
|
|
210
|
+
if (!sessao || !sessao.tarefas) return next(e)
|
|
211
|
+
const veredito = decidirCriacao(e.task_subject, sessao.tarefas)
|
|
212
|
+
if (veredito.tipo === 'recusa') return { block: textoDaRecusa(veredito, e.task_subject, sessao.tarefas) }
|
|
213
|
+
await mudarQuadro($, sessao.ctx.thread, q => ({ ...q, tarefas: { ...q.tarefas, [String(e.task_id)]: veredito.tarefa } }))
|
|
214
|
+
return next(e)
|
|
215
|
+
}).catch(async ($, e, next) => {
|
|
216
|
+
// Na reentrada o gancho nem rodou e as chamadas de `$` recusam: só a falha de verdade é anotada.
|
|
217
|
+
if (next.error && next.error.kind !== 're-entry') await anotarFalha($, 'criação de tarefa', next.error.message ?? next.error.kind)
|
|
218
|
+
return next(e)
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
// A conclusão (T10.2): a tarefa do plano só fecha com a conferência do núcleo aprovada (D4), uma por vez (D5).
|
|
222
|
+
// Todo bloqueio volta ao modelo com o motivo e a saída (corrigir, ou devolver a tarefa para pending), e a terceira
|
|
223
|
+
// vez seguida com o mesmo resultado manda deixar a tarefa aberta (D6). Tarefa que não é do plano passa.
|
|
224
|
+
on('classic.TaskCompleted', async ($, e, next) => {
|
|
225
|
+
const sessao = await sessaoDoPortao($)
|
|
226
|
+
if (!sessao) return next(e)
|
|
227
|
+
const { ctx } = sessao
|
|
228
|
+
const tarefa = tarefaDoEvento(e.task_subject, String(e.task_id), await lerQuadro($, ctx.thread), sessao.tarefas ?? [])
|
|
229
|
+
if (!tarefa) return next(e)
|
|
230
|
+
if (conferindo) return { block: textoDeOutraConferencia(tarefa, conferindo) }
|
|
231
|
+
conferindo = tarefa
|
|
232
|
+
let leitura: Leitura
|
|
233
|
+
try {
|
|
234
|
+
$.ui.status(`portão: conferindo ${tarefa} no núcleo`)
|
|
235
|
+
leitura = await rodarConferencia($, ctx, tarefa)
|
|
236
|
+
} finally {
|
|
237
|
+
conferindo = null
|
|
238
|
+
}
|
|
239
|
+
if (leitura.tipo === 'aprovada') {
|
|
240
|
+
const resultado = await next(e)
|
|
241
|
+
if (!resultado.block) {
|
|
242
|
+
await mudarQuadro($, ctx.thread, q => {
|
|
243
|
+
const repeticoes = { ...q.repeticoes }
|
|
244
|
+
delete repeticoes[tarefa]
|
|
245
|
+
return { ...q, concluidas: q.concluidas.includes(tarefa) ? q.concluidas : [...q.concluidas, tarefa], repeticoes }
|
|
246
|
+
})
|
|
247
|
+
}
|
|
248
|
+
$.ui.status(textoDoStatus(tarefa, leitura))
|
|
249
|
+
return resultado
|
|
250
|
+
}
|
|
251
|
+
const marca = assinatura(leitura)
|
|
252
|
+
let vezes = 1
|
|
253
|
+
await mudarQuadro($, ctx.thread, q => {
|
|
254
|
+
const repeticao = contarRepeticao(q.repeticoes[tarefa], marca)
|
|
255
|
+
vezes = repeticao.vezes
|
|
256
|
+
return { ...q, repeticoes: { ...q.repeticoes, [tarefa]: repeticao } }
|
|
257
|
+
})
|
|
258
|
+
$.ui.status(textoDoStatus(tarefa, leitura))
|
|
259
|
+
return { block: textoDoBloqueio(tarefa, leitura, vezes) }
|
|
260
|
+
}).catch(async ($, e, next) => {
|
|
261
|
+
// A conclusão fecha só aprovada (D4): se o próprio Portão falhou no meio, a tarefa registrada, ou a que cita um id
|
|
262
|
+
// de tarefa do plano no assunto, não fecha. A anotação é melhor esforço: o bloqueio não depende dela.
|
|
263
|
+
if (!next.error || next.error.kind === 're-entry') return next(e)
|
|
264
|
+
const motivo = next.error.message ?? next.error.kind
|
|
265
|
+
try { await anotarFalha($, 'conclusão de tarefa', motivo) } catch { $.ui.status('portão: falhou na conclusão de tarefa') }
|
|
266
|
+
const ids = idsNoAssunto(e.task_subject)
|
|
267
|
+
const tarefa = quadro?.tarefas[String(e.task_id)] ?? (ids.length === 1 ? ids[0] : undefined)
|
|
268
|
+
if (!tarefa) return next(e)
|
|
269
|
+
return { block: textoDoBloqueio(tarefa, { tipo: 'indisponivel', motivo: `o Portão falhou ao conferir: ${motivo}` }) }
|
|
270
|
+
})
|
|
271
|
+
|
|
272
|
+
// O teammate ocioso (T10.3): com os tetos do piloto na sessão, quem ficou ocioso sem concluir devolve a tarefa, e a
|
|
273
|
+
// próxima tarefa livre do plano (D7) vai a ele pelo `block`. Livre é sem lease `path:` ativo de nenhuma thread na
|
|
274
|
+
// região e sem cruzar as tarefas dos outros teammates (D8 revista); a escolha e a atribuição acontecem juntas sobre o
|
|
275
|
+
// quadro mais novo. No teto de custo, sem os leases legíveis ou sem tarefa livre, o teammate fica ocioso.
|
|
276
|
+
on('classic.TeammateIdle', async ($, e, next) => {
|
|
277
|
+
const sessao = await sessaoDoPortao($)
|
|
278
|
+
if (!sessao || !sessao.tarefas) return next(e)
|
|
279
|
+
const tetos = await lerTetos($)
|
|
280
|
+
const teammate = nomeDoTeammate(e.teammate_name)
|
|
281
|
+
if (!tetos || !teammate) return next(e)
|
|
282
|
+
const { ctx, tarefas } = sessao
|
|
283
|
+
await mudarQuadro($, ctx.thread, q => {
|
|
284
|
+
const tinha = q.atribuicoes[teammate]
|
|
285
|
+
if (!tinha) return q
|
|
286
|
+
const atribuicoes = { ...q.atribuicoes }
|
|
287
|
+
delete atribuicoes[teammate]
|
|
288
|
+
const devolvida = !q.concluidas.includes(tinha) && !q.devolvidas.includes(tinha)
|
|
289
|
+
return { ...q, atribuicoes, devolvidas: devolvida ? [...q.devolvidas, tinha] : q.devolvidas }
|
|
290
|
+
})
|
|
291
|
+
const custo = await custoDaSessao($)
|
|
292
|
+
if (custo === null || custo >= tetos.custoUsd) {
|
|
293
|
+
$.ui.status(custo === null ? 'portão: custo da sessão ilegível; nenhuma tarefa nova ao time' : `portão: teto de custo do piloto (US$ ${tetos.custoUsd}) atingido`)
|
|
294
|
+
return next(e)
|
|
295
|
+
}
|
|
296
|
+
let leases: LeaseAtivo[]
|
|
297
|
+
try {
|
|
298
|
+
leases = await lerLeases($)
|
|
299
|
+
} catch (erro) {
|
|
300
|
+
await anotarFalha($, 'leitura dos leases', erro, ctx.thread)
|
|
301
|
+
return next(e)
|
|
302
|
+
}
|
|
303
|
+
let entregue: PortaoTarefa | null = null
|
|
304
|
+
await mudarQuadro($, ctx.thread, q => {
|
|
305
|
+
const escolha = escolherTarefa({ tarefas, quadro: q, teammate, leases })
|
|
306
|
+
if (!escolha) return q
|
|
307
|
+
entregue = escolha
|
|
308
|
+
return { ...q, atribuicoes: { ...q.atribuicoes, [teammate]: escolha.id } }
|
|
309
|
+
})
|
|
310
|
+
const tarefa = entregue as PortaoTarefa | null
|
|
311
|
+
if (!tarefa) return next(e)
|
|
312
|
+
$.ui.status(`portão: ${tarefa.id} com ${teammate}`)
|
|
313
|
+
return { block: textoDaEntrega(tarefa, teammate) }
|
|
314
|
+
}).catch(async ($, e, next) => {
|
|
315
|
+
if (next.error && next.error.kind !== 're-entry') await anotarFalha($, 'teammate ocioso', next.error.message ?? next.error.kind)
|
|
316
|
+
return next(e)
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
// Os tetos do piloto (D10): em toda sessão de fase, o teammate só nasce com os tetos do núcleo, abaixo do teto de
|
|
320
|
+
// teammates vivos e do teto de custo. Subagente que não é teammate passa.
|
|
321
|
+
on('agent.spawn', async ($, e, next) => {
|
|
322
|
+
if (!e.isTeammate) return next(e)
|
|
323
|
+
const ctx = await contextoDeFase($)
|
|
324
|
+
if (!ctx) return next(e)
|
|
325
|
+
const tetos = await lerTetos($)
|
|
326
|
+
const vivos = (await $.agent.list()).filter(a => a.teammateId && VIVOS.includes(a.status)).length
|
|
327
|
+
const recusa = recusaDoTeammate(tetos, vivos, tetos ? await custoDaSessao($) : null)
|
|
328
|
+
if (recusa) {
|
|
329
|
+
$.ui.status('portão: teammate recusado pelo teto do piloto')
|
|
330
|
+
return { deny: recusa }
|
|
331
|
+
}
|
|
332
|
+
return next(e)
|
|
333
|
+
}).catch(async ($, e, next) => {
|
|
334
|
+
if (!next.error || next.error.kind === 're-entry' || !e.isTeammate || next.called) return next(e)
|
|
335
|
+
const motivo = next.error.message ?? next.error.kind
|
|
336
|
+
try { await anotarFalha($, 'teto de teammates', motivo) } catch { $.ui.status('portão: falhou no teto de teammates') }
|
|
337
|
+
return { deny: `Portão de Tarefas: teammate recusado. O Portão não conseguiu conferir os tetos do piloto (${motivo}).` }
|
|
338
|
+
})
|
|
339
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// A conclusão pela conferência do núcleo (RM-059, fatia F10, T10.2). Módulo puro: monta o argv do
|
|
2
|
+
// `ork claims conferir --tarefa`, lê o JSON `ork.claims-conferencia/v1`, conta a repetição e escreve o texto do
|
|
3
|
+
// bloqueio. O Portão nunca roda o verify da tarefa: quem roda é o núcleo, no sandbox do verify (D12 do plano dos
|
|
4
|
+
// mods), e quem verifica de verdade continua sendo o `ork verify`.
|
|
5
|
+
import type { PortaoRepeticao } from '../types'
|
|
6
|
+
|
|
7
|
+
export const FORMATO_DA_CONFERENCIA = 'ork.claims-conferencia/v1'
|
|
8
|
+
/** O prazo total pedido ao núcleo, em segundos (D5 corrigida: cabe no teto de dez minutos do `$.process.run`). */
|
|
9
|
+
export const PRAZO_DA_CONFERENCIA_S = 540
|
|
10
|
+
/** O vigia do mod: o `$.process.run` mata o processo depois disto, e a conferência fica indisponível. */
|
|
11
|
+
export const VIGIA_DA_CONFERENCIA_MS = 600000
|
|
12
|
+
/** Da terceira conclusão seguida bloqueada pelo mesmo resultado em diante, o texto manda deixar a tarefa aberta (D6). */
|
|
13
|
+
export const REPETICOES_PARA_DEIXAR = 3
|
|
14
|
+
/** Tetos do fim da saída que vai ao modelo. */
|
|
15
|
+
export const TETO_DE_LINHAS_DA_SAIDA = 15
|
|
16
|
+
export const TETO_DE_CARACTERES_DA_SAIDA = 1500
|
|
17
|
+
|
|
18
|
+
const ID_DE_THREAD = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/
|
|
19
|
+
const ID_DE_TAREFA = /^T\d+(?:\.\d+)*$/
|
|
20
|
+
/** A saída do CLI quando outra condução segura a thread. */
|
|
21
|
+
const SAIDA_DE_CONDUCAO = 3
|
|
22
|
+
|
|
23
|
+
/** O argv do `ork claims conferir` do verify de uma tarefa; o comando da tarefa fica com o núcleo. */
|
|
24
|
+
export function argvDaConferencia(thread: string, tarefa: string): string[] {
|
|
25
|
+
if (!ID_DE_THREAD.test(thread)) throw new Error('ork-portao: id de thread inválido')
|
|
26
|
+
if (!ID_DE_TAREFA.test(tarefa)) throw new Error('ork-portao: id de tarefa inválido')
|
|
27
|
+
return ['ork', 'claims', 'conferir', thread, '--tarefa', tarefa, '--prazo', String(PRAZO_DA_CONFERENCIA_S), '--json']
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* O que a conferência disse da tarefa: aprovada; reprovada (`claims.failed`); sem veredito (prazo, comando que não
|
|
32
|
+
* rodou); recusada pelo núcleo (`claims.conferir.*`); com outra condução na thread; ou indisponível.
|
|
33
|
+
*/
|
|
34
|
+
export type Leitura =
|
|
35
|
+
| { tipo: 'aprovada'; comando: string }
|
|
36
|
+
| { tipo: 'reprovada'; comando: string; codigo: number | null; fim: string }
|
|
37
|
+
| { tipo: 'sem-veredito'; motivo: string; comando: string; detalhe: string }
|
|
38
|
+
| { tipo: 'recusada'; motivo: string }
|
|
39
|
+
| { tipo: 'ocupada'; motivo: string }
|
|
40
|
+
| { tipo: 'indisponivel'; motivo: string }
|
|
41
|
+
|
|
42
|
+
const ultimaLinha = (texto: string) => texto.trim().split('\n').filter(l => l.trim() !== '').slice(-1)[0]?.trim().slice(0, 300) ?? ''
|
|
43
|
+
|
|
44
|
+
type Execucao = { comando?: unknown; ok?: unknown; code?: unknown; fim?: unknown }
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* A saída do `ork claims conferir --tarefa --json` (D4): o resultado só com o formato certo, o item da tarefa pedida
|
|
48
|
+
* e a saída 0 ou 1; a recusa tipada é a saída 2 com `claims.conferir.*`; a saída 3 é outra condução; o resto (texto
|
|
49
|
+
* solto de um `ork` antigo, JSON sem o item) é indisponível.
|
|
50
|
+
*/
|
|
51
|
+
export function lerConferencia(tarefa: string, stdout: string, codigo: number | null, stderr: string): Leitura {
|
|
52
|
+
let j: { formato?: unknown; itens?: unknown; erro?: unknown; texto?: unknown } | null = null
|
|
53
|
+
try { j = JSON.parse(stdout) } catch { j = null }
|
|
54
|
+
if (j && j.formato === FORMATO_DA_CONFERENCIA && Array.isArray(j.itens) && (codigo === 0 || codigo === 1)) {
|
|
55
|
+
const item = (j.itens as Array<{ id?: unknown; verificado?: unknown; motivo?: unknown; detalhe?: unknown; execucoes?: unknown } | null>)
|
|
56
|
+
.find(i => i?.id === tarefa)
|
|
57
|
+
if (!item) return { tipo: 'indisponivel', motivo: `a conferência não devolveu a tarefa ${tarefa}` }
|
|
58
|
+
const execucoes = Array.isArray(item.execucoes) ? item.execucoes as Execucao[] : []
|
|
59
|
+
const chave = execucoes.find(x => x && x.ok === false) ?? execucoes[0]
|
|
60
|
+
const comando = typeof chave?.comando === 'string' ? chave.comando : ''
|
|
61
|
+
if (item.verificado === true && codigo === 0) return { tipo: 'aprovada', comando }
|
|
62
|
+
if (item.motivo === 'claims.failed') {
|
|
63
|
+
return { tipo: 'reprovada', comando, codigo: typeof chave?.code === 'number' ? chave.code : null, fim: typeof chave?.fim === 'string' ? chave.fim : '' }
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
tipo: 'sem-veredito', comando,
|
|
67
|
+
motivo: typeof item.motivo === 'string' ? item.motivo : 'sem motivo',
|
|
68
|
+
detalhe: typeof item.detalhe === 'string' ? item.detalhe.slice(0, 300) : '',
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const erro = j && typeof j.erro === 'string' ? j.erro.trim().slice(0, 300) : ''
|
|
72
|
+
if (codigo === SAIDA_DE_CONDUCAO) {
|
|
73
|
+
// Com `--json`, a recusa de condução sai no stdout (`ork.conducao-recusa/v1`), com o texto para quem lê.
|
|
74
|
+
const texto = j && typeof j.texto === 'string' ? (j.texto.trim().split('\n')[0] ?? '').slice(0, 300) : ''
|
|
75
|
+
return { tipo: 'ocupada', motivo: texto || erro || ultimaLinha(stderr) || 'outra condução segura a thread' }
|
|
76
|
+
}
|
|
77
|
+
if (erro.startsWith('claims.conferir.')) return { tipo: 'recusada', motivo: erro }
|
|
78
|
+
const motivo = erro || ultimaLinha(stderr) || (j === null ? ultimaLinha(stdout) : '') || `saiu com código ${codigo ?? 'desconhecido'}`
|
|
79
|
+
return { tipo: 'indisponivel', motivo: `ork claims conferir sem resultado: ${motivo}` }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** O fim da saída de um comando: as últimas linhas e o último trecho, dentro dos tetos. */
|
|
83
|
+
export function fimDaSaida(fim: string): string[] {
|
|
84
|
+
let texto = fim.replace(/\s+$/, '')
|
|
85
|
+
if (texto.length > TETO_DE_CARACTERES_DA_SAIDA) texto = texto.slice(-TETO_DE_CARACTERES_DA_SAIDA)
|
|
86
|
+
return texto === '' ? [] : texto.split('\n').slice(-TETO_DE_LINHAS_DA_SAIDA)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** O que torna dois bloqueios "o mesmo resultado" para a contagem da D6. */
|
|
90
|
+
export function assinatura(l: Leitura): string {
|
|
91
|
+
switch (l.tipo) {
|
|
92
|
+
case 'aprovada': return 'aprovada'
|
|
93
|
+
case 'reprovada': return JSON.stringify(['reprovada', l.comando, l.codigo, fimDaSaida(l.fim).slice(-3)])
|
|
94
|
+
case 'sem-veredito': return JSON.stringify(['sem-veredito', l.motivo, l.comando])
|
|
95
|
+
default: return JSON.stringify([l.tipo, l.motivo])
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** A repetição da tarefa depois deste bloqueio: a mesma assinatura soma, outra recomeça em 1. */
|
|
100
|
+
export function contarRepeticao(anterior: PortaoRepeticao | undefined, nova: string): PortaoRepeticao {
|
|
101
|
+
return anterior && anterior.assinatura === nova ? { assinatura: nova, vezes: anterior.vezes + 1 } : { assinatura: nova, vezes: 1 }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const SAIDA = 'Se não der para corrigir agora, devolva a tarefa para pending (TaskUpdate) e siga: o ork verify continua sendo quem verifica.'
|
|
105
|
+
|
|
106
|
+
/** O texto do `block` da conclusão recusada (D4 e D6), com a saída sempre dita. */
|
|
107
|
+
export function textoDoBloqueio(tarefa: string, l: Exclude<Leitura, { tipo: 'aprovada' }>, vezes = 1): string {
|
|
108
|
+
const partes: string[] = []
|
|
109
|
+
switch (l.tipo) {
|
|
110
|
+
case 'reprovada':
|
|
111
|
+
partes.push(`Portão de Tarefas: a tarefa ${tarefa} não fecha: o verify do plano reprovou na conferência do núcleo (ork claims conferir, no sandbox do verify, sem recibo).`)
|
|
112
|
+
if (l.comando) partes.push(` comando: ${l.comando}`)
|
|
113
|
+
partes.push(` saiu com código ${l.codigo ?? 'desconhecido'}${l.fim.trim() ? '; fim da saída:' : ', sem saída'}`)
|
|
114
|
+
for (const linha of fimDaSaida(l.fim)) partes.push(` | ${linha}`)
|
|
115
|
+
partes.push('Corrija e conclua de novo. Teste que cria processo pode reprovar no sandbox e passar no ork verify.')
|
|
116
|
+
break
|
|
117
|
+
case 'sem-veredito':
|
|
118
|
+
partes.push(`Portão de Tarefas: a tarefa ${tarefa} não fecha: a conferência do núcleo terminou sem veredito (${l.motivo}${l.detalhe ? `: ${l.detalhe}` : ''}).`)
|
|
119
|
+
if (l.comando) partes.push(` comando: ${l.comando}`)
|
|
120
|
+
partes.push('Conclua de novo para conferir outra vez.')
|
|
121
|
+
break
|
|
122
|
+
case 'recusada':
|
|
123
|
+
partes.push(`Portão de Tarefas: a tarefa ${tarefa} não fecha: o núcleo recusou a conferência (${l.motivo}).`)
|
|
124
|
+
break
|
|
125
|
+
case 'ocupada':
|
|
126
|
+
partes.push(`Portão de Tarefas: a tarefa ${tarefa} não fecha agora: outra condução segura a thread (${l.motivo}). Conclua de novo em instantes.`)
|
|
127
|
+
break
|
|
128
|
+
case 'indisponivel':
|
|
129
|
+
partes.push(`Portão de Tarefas: a tarefa ${tarefa} não fecha: a conferência do núcleo não deu resultado (${l.motivo}).`)
|
|
130
|
+
break
|
|
131
|
+
}
|
|
132
|
+
partes.push(SAIDA)
|
|
133
|
+
if (vezes >= REPETICOES_PARA_DEIXAR) {
|
|
134
|
+
partes.push(`É a ${vezes}ª vez seguida com o mesmo resultado: deixe a tarefa aberta (pending) e siga para a próxima; o ork verify do CHECK decide.`)
|
|
135
|
+
}
|
|
136
|
+
return partes.join('\n')
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** O texto do `block` quando outra conferência do Portão está em curso (D5). */
|
|
140
|
+
export function textoDeOutraConferencia(tarefa: string, emCurso: string): string {
|
|
141
|
+
return `Portão de Tarefas: a tarefa ${tarefa} não fecha agora: o Portão está conferindo a tarefa ${emCurso} no núcleo, uma conferência por vez. ` +
|
|
142
|
+
`Conclua de novo quando ela terminar. ${SAIDA}`
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** A linha de status depois de uma conferência; `undefined` limpa a linha. */
|
|
146
|
+
export function textoDoStatus(tarefa: string, l: Leitura): string | undefined {
|
|
147
|
+
if (l.tipo === 'aprovada') return undefined
|
|
148
|
+
const nome: Record<Exclude<Leitura['tipo'], 'aprovada'>, string> = {
|
|
149
|
+
reprovada: 'reprovou', 'sem-veredito': 'sem veredito', recusada: 'recusada pelo núcleo', ocupada: 'outra condução', indisponivel: 'conferência indisponível',
|
|
150
|
+
}
|
|
151
|
+
return `portão: ${tarefa} não fechou (${nome[l.tipo]})`
|
|
152
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Contrato de tipos do Portão de Tarefas (RM-059, fatia F10). O Portão não acrescenta noun ao `$`: este arquivo
|
|
2
|
+
// declara o estado dele (`PluginState['ork-portao']`) e os tipos que os módulos puros e os testes usam.
|
|
3
|
+
// Sem import nem referência, como o motor exige de um contrato.
|
|
4
|
+
|
|
5
|
+
/** Uma tarefa do plano como o Portão a usa: o id, o título, os `touch_paths` e o verify pela regra do núcleo. */
|
|
6
|
+
export type PortaoTarefa = {
|
|
7
|
+
/** `T2.1`, como o cabeçalho do plano escreve. */
|
|
8
|
+
id: string
|
|
9
|
+
/** O resto da linha do cabeçalho. */
|
|
10
|
+
titulo: string
|
|
11
|
+
/** Os trechos entre crases do item `touch_paths`, normalizados. */
|
|
12
|
+
touchPaths: string[]
|
|
13
|
+
/** O comando do verify, quando o núcleo o aceita (`ork claims conferir --tarefa`). */
|
|
14
|
+
verify: string | null
|
|
15
|
+
/** Por que o núcleo recusaria a conferência dessa tarefa, ou `null`. */
|
|
16
|
+
problema: null | 'tarefa-sem-verify' | 'tarefa-ambigua' | 'tarefa-sem-comando' | 'tarefa-repetida'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** A repetição de bloqueios da conclusão de uma tarefa (D6): a assinatura do último resultado e quantas vezes seguidas. */
|
|
20
|
+
export type PortaoRepeticao = {
|
|
21
|
+
assinatura: string
|
|
22
|
+
vezes: number
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Uma falha do próprio Portão: onde, o motivo e quando (ms desde a época). */
|
|
26
|
+
export type PortaoFalha = {
|
|
27
|
+
onde: string
|
|
28
|
+
motivo: string
|
|
29
|
+
em: number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* O quadro que o Portão guarda da sessão de fase (D9 do plano da thread). Ele vale para esta sessão: numa sessão de GO
|
|
34
|
+
* redespachada, o que fechou na anterior não está aqui.
|
|
35
|
+
*/
|
|
36
|
+
export type PortaoQuadro = {
|
|
37
|
+
/** A thread do despacho, do contexto da ponte. */
|
|
38
|
+
thread: string
|
|
39
|
+
/** A tarefa nativa (`task_id`) para a tarefa do plano, gravada quando a criação passou. */
|
|
40
|
+
tarefas: Record<string, string>
|
|
41
|
+
/** As tarefas do plano que fecharam com a conferência do núcleo aprovada nesta sessão. */
|
|
42
|
+
concluidas: string[]
|
|
43
|
+
/** A repetição de bloqueios da conclusão, por tarefa do plano. */
|
|
44
|
+
repeticoes: Record<string, PortaoRepeticao>
|
|
45
|
+
/** A tarefa do plano que o Portão entregou a cada teammate ocioso (T10.3), pelo nome do teammate. */
|
|
46
|
+
atribuicoes: Record<string, string>
|
|
47
|
+
/** As tarefas que um teammate devolveu ao ficar ocioso sem concluí-las: saem da distribuição automática. */
|
|
48
|
+
devolvidas: string[]
|
|
49
|
+
/** A última falha do Portão, para a linha de status e o log. */
|
|
50
|
+
ultimaFalha: PortaoFalha | null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
declare module 'claude-code' {
|
|
54
|
+
interface PluginState {
|
|
55
|
+
'ork-portao': {
|
|
56
|
+
/** O quadro do Portão nesta sessão de fase. */
|
|
57
|
+
quadro: PortaoQuadro
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ork-radar",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Radar de Colisão do Orkastery no Claude Code: o merge de cada thread aberta contra a origin/main e entre as threads, calculado sem worktree e sem gravar objeto no repositório, com os arquivos em conflito, os leases que os cobrem e o comando que resolve. Só lê.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Orkastery contributors",
|
|
7
|
+
"url": "https://github.com/orkastery"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://orkastery.com/",
|
|
10
|
+
"repository": "https://github.com/orkastery/orkastery",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"types": "./types/index.d.ts",
|
|
13
|
+
"dependencies": ["ork-ponte"]
|
|
14
|
+
}
|