@orkastery/cli 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/README.md +18 -0
- package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
- package/adapters/claude-code/README.md +195 -5
- package/adapters/claude-code/agents/ork-check.md +1 -0
- package/adapters/claude-code/agents/ork-go.md +1 -0
- package/adapters/claude-code/agents/ork-goal.md +1 -0
- package/adapters/claude-code/agents/ork-master.md +1 -0
- package/adapters/claude-code/agents/ork-plan.md +1 -0
- package/adapters/claude-code/agents/ork-ship.md +1 -0
- package/adapters/claude-code/hooks/hooks.json +2 -1
- package/adapters/claude-code/hooks/ork-guard.js +15 -1
- package/adapters/claude-code/hooks/ork-resposta.js +91 -0
- package/adapters/claude-code/hooks/ork-sensor.js +18 -2
- package/adapters/claude-code/hooks/quota-signal.js +14 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
- package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
- package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
- package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
- package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/codex/skills/ork/SKILL.md +2 -0
- package/adapters/hermes/README.md +64 -1
- package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
- package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
- package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
- package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
- package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
- package/adapters/hermes/hermes.plugin.json +4 -0
- package/adapters/hermes/hitl-ingress/__init__.py +101 -8
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
- package/adapters/openclaw/README.md +83 -10
- package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
- package/adapters/openclaw/dist/hitl-ingress.js +106 -9
- package/adapters/openclaw/dist/index.js +86 -0
- package/adapters/openclaw/openclaw.plugin.json +34 -4
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +103 -9
- package/adapters/openclaw/src/index.ts +94 -0
- package/assets/adapters-en/claude-code/README.md +403 -0
- package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
- package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
- package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
- package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
- package/assets/adapters-en/claude-code/commands/check.md +46 -0
- package/assets/adapters-en/claude-code/commands/go.md +46 -0
- package/assets/adapters-en/claude-code/commands/goal.md +55 -0
- package/assets/adapters-en/claude-code/commands/master.md +54 -0
- package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
- package/assets/adapters-en/claude-code/commands/ork.md +126 -0
- package/assets/adapters-en/claude-code/commands/plan.md +47 -0
- package/assets/adapters-en/claude-code/commands/ship.md +45 -0
- package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
- package/assets/adapters-en/hermes/README.md +273 -0
- package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/assets/references-en/README.md +25 -0
- package/assets/references-en/code-review-axes.md +82 -0
- package/assets/references-en/definition-of-done.md +74 -0
- package/assets/references-en/performance-checklist.md +53 -0
- package/assets/references-en/security-checklist.md +101 -0
- package/assets/references-en/testing-patterns.md +51 -0
- package/assets/security-scan/defaults/.golangci.yml +2 -0
- package/assets/security-scan/defaults/eslint.config.mjs +11 -0
- package/assets/security-scan/defaults/gitleaks.toml +3 -0
- package/assets/security-scan/defaults/ruff.toml +1 -0
- package/assets/security-scan/tools-agil.json +87 -0
- package/assets/security-scan/tools.json +625 -0
- package/assets/skills-en/core/onboarding/SKILL.md +58 -0
- package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
- package/assets/skills-en/core/thread-state/SKILL.md +88 -0
- package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
- package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
- package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
- package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
- package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
- package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
- package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
- package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
- package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
- package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
- package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
- package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
- package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
- package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
- package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
- package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
- package/dist/adapters/claude-bg.js +193 -15
- package/dist/adapters/codex-controller-worker.js +12 -5
- package/dist/adapters/codex-events.js +16 -4
- package/dist/adapters/codex.js +13 -2
- package/dist/agents-md.js +24 -15
- package/dist/atualizar-branch.js +245 -0
- package/dist/auditoria.js +13 -11
- package/dist/auditrun.js +68 -48
- package/dist/autorizacao-duravel.js +327 -0
- package/dist/board.js +98 -43
- package/dist/branch-de-estado.js +39 -9
- package/dist/busca-semantica.js +7 -5
- package/dist/catalogo.js +35 -1
- package/dist/changelog-reconciliacao.js +290 -0
- package/dist/check-agil.js +500 -0
- package/dist/check-modo.js +41 -0
- package/dist/check-paralelo.js +183 -0
- package/dist/ci.js +255 -46
- package/dist/ciclos.js +8 -6
- package/dist/claim-lint.js +12 -8
- package/dist/claims-conferir.js +350 -0
- package/dist/claims.js +13 -10
- package/dist/company-brain-client.js +45 -3
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +47 -6
- package/dist/conducao-batida.js +759 -0
- package/dist/conducao-sentinela.js +405 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +206 -59
- package/dist/conhecimento-consulta.js +270 -0
- package/dist/conhecimento.js +514 -0
- package/dist/conta-esgotada.js +127 -0
- package/dist/dado-privado.js +816 -0
- package/dist/decisao-autonoma.js +5 -4
- package/dist/demo.js +14 -12
- package/dist/dependencias-da-worktree.js +25 -0
- package/dist/divida.js +38 -36
- package/dist/docs.js +103 -82
- package/dist/doctor-forja.js +345 -0
- package/dist/doctor-pulse-cron.js +294 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +278 -116
- package/dist/dsn-da-memoria.js +417 -0
- package/dist/entrega-por-mod.js +503 -0
- package/dist/entrega-pr.js +158 -57
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +13 -11
- package/dist/estado-thread.js +42 -17
- package/dist/evalrunner.js +35 -32
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +323 -0
- package/dist/fabrica-estado.js +49 -16
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +24 -21
- package/dist/forja/adaptador.js +6 -0
- package/dist/forja/ambiente-de-ci.js +27 -0
- package/dist/forja/api.js +256 -0
- package/dist/forja/cache.js +89 -0
- package/dist/forja/cli.js +60 -0
- package/dist/forja/contrato.js +9 -0
- package/dist/forja/endereco.js +43 -0
- package/dist/forja/estado.js +22 -0
- package/dist/forja/executor.js +73 -0
- package/dist/forja/github/ci.js +95 -0
- package/dist/forja/github/dono-da-rede.js +18 -0
- package/dist/forja/github/metadados.js +15 -0
- package/dist/forja/github/pedidos.js +200 -0
- package/dist/forja/gitlab/ci.js +141 -0
- package/dist/forja/gitlab/consultas.js +59 -0
- package/dist/forja/gitlab/dono-da-rede.js +43 -0
- package/dist/forja/gitlab/metadados.js +15 -0
- package/dist/forja/gitlab/pedidos-abertos.js +158 -0
- package/dist/forja/gitlab/pedidos.js +141 -0
- package/dist/forja/produtor.js +32 -0
- package/dist/forja/registro.js +31 -0
- package/dist/forja/resolver.js +121 -0
- package/dist/forja/texto.js +13 -0
- package/dist/forja/versao.js +71 -0
- package/dist/forja.js +124 -81
- package/dist/gates.js +3 -28
- package/dist/handoff.js +33 -19
- package/dist/hitl-contract.js +46 -43
- package/dist/hitl-curto.js +37 -25
- package/dist/hitl-gates.js +13 -11
- package/dist/hitl-local-receipt.js +53 -0
- package/dist/hitl-local.js +11 -2
- package/dist/hitl-lock.js +5 -11
- package/dist/hitl-public-receipt.js +11 -0
- package/dist/hitl-resumo.js +72 -3
- package/dist/hitl-sessions.js +62 -9
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl-texto-livre.js +7 -4
- package/dist/hitl.js +63 -64
- package/dist/horario.js +30 -7
- package/dist/hosts.js +155 -134
- package/dist/impedimento.js +108 -14
- package/dist/index.js +1421 -1019
- package/dist/indice-vetorial.js +14 -12
- package/dist/indice.js +7 -1
- package/dist/init.js +54 -49
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +213 -88
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +96 -34
- package/dist/leases.js +19 -18
- package/dist/ledger-stats.js +17 -16
- package/dist/ledger.js +46 -2
- package/dist/licoes.js +12 -11
- package/dist/liveness.js +6 -3
- package/dist/locale-accounts.js +220 -0
- package/dist/locale-adapter.js +291 -0
- package/dist/locale-ajuda.js +833 -0
- package/dist/locale-audit.js +199 -0
- package/dist/locale-claims.js +213 -0
- package/dist/locale-conducao.js +138 -0
- package/dist/locale-conhecimento.js +181 -0
- package/dist/locale-decisao.js +205 -0
- package/dist/locale-docs.js +230 -0
- package/dist/locale-estado.js +101 -0
- package/dist/locale-forja.js +290 -0
- package/dist/locale-gerados.js +165 -0
- package/dist/locale-grafo.js +129 -0
- package/dist/locale-master.js +182 -0
- package/dist/locale-network.js +524 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-operacao-restante.js +931 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-projetos.js +100 -0
- package/dist/locale-prompts.js +194 -0
- package/dist/locale-pulse.js +349 -0
- package/dist/locale-reservas.js +87 -0
- package/dist/locale-retry.js +524 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-security-scan.js +69 -0
- package/dist/locale-setup.js +192 -0
- package/dist/locale-ship.js +597 -0
- package/dist/locale-thread.js +421 -0
- package/dist/locale-verify.js +201 -0
- package/dist/locale-worktree.js +246 -0
- package/dist/locale.js +1258 -0
- package/dist/maestro-runtime.js +22 -3
- package/dist/manifest.js +415 -13
- package/dist/maquina-ociosa.js +211 -0
- package/dist/maquina.js +31 -7
- package/dist/master-digest.js +6 -1
- package/dist/master-nota-local.js +200 -0
- package/dist/master-nota.js +14 -8
- package/dist/master.js +139 -65
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-conhecimento.js +52 -0
- package/dist/mcp-experiencia.js +26 -5
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-install.js +73 -8
- package/dist/mcp-noctum.js +101 -0
- package/dist/mcp-server.js +90 -16
- package/dist/mcp-ship-transporte.js +977 -0
- package/dist/mcp-ship.js +71 -25
- package/dist/mcp-transportes.js +17 -0
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +63 -58
- package/dist/modos-migracao.js +8 -6
- package/dist/modos.js +20 -24
- package/dist/network-roadmap.js +90 -51
- package/dist/noctum-aceite.js +789 -0
- package/dist/noctum-arco.js +1418 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-changelog.js +399 -0
- package/dist/noctum-cli.js +482 -0
- package/dist/noctum-coordenacao.js +1225 -0
- package/dist/noctum-entrega.js +1169 -0
- package/dist/noctum-envelope.js +1046 -0
- package/dist/noctum-execucao.js +376 -0
- package/dist/noctum-fechamento.js +405 -0
- package/dist/noctum-fila.js +314 -0
- package/dist/noctum-guarda.js +256 -0
- package/dist/noctum-integracao.js +507 -0
- package/dist/noctum-maquinas.js +383 -0
- package/dist/noctum-medicao.js +450 -0
- package/dist/noctum-modo.js +362 -0
- package/dist/noctum-pergunta-canal.js +96 -0
- package/dist/noctum-pergunta.js +115 -0
- package/dist/noctum-provas.js +838 -0
- package/dist/noctum-reconciliacao.js +591 -0
- package/dist/noctum-registro.js +215 -0
- package/dist/noctum-relatorio.js +827 -0
- package/dist/noctum-resposta.js +207 -0
- package/dist/noctum-sessoes-em-voo.js +93 -0
- package/dist/noctum-supervisao.js +649 -0
- package/dist/noctum-terminal.js +459 -0
- package/dist/noctum-transporte.js +655 -0
- package/dist/noctum-vigia.js +639 -0
- package/dist/ocupacao.js +32 -3
- package/dist/onboarding.js +56 -26
- package/dist/orkmind.js +48 -25
- package/dist/orquestracao.js +44 -47
- package/dist/parado-no-condutor.js +174 -127
- package/dist/phase.js +144 -63
- package/dist/policies.js +37 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +235 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +220 -0
- package/dist/projeto-alvo.js +186 -24
- package/dist/prompts.js +140 -42
- package/dist/prova-minima.js +5 -6
- package/dist/pulse-cadencia.js +5 -4
- package/dist/pulse-consentimento.js +53 -1
- package/dist/pulse-delivery.js +151 -24
- package/dist/pulse-resposta.js +368 -4
- package/dist/pulse.js +188 -22
- package/dist/ratelimit.js +16 -6
- package/dist/recall.js +14 -13
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +13 -8
- package/dist/rede-forja.js +108 -24
- package/dist/rede-status.js +66 -47
- package/dist/rede.js +86 -46
- package/dist/retomada-checkpoint.js +101 -0
- package/dist/retry.js +451 -212
- package/dist/roadmap-reservas.js +45 -28
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-ambiente.js +5 -0
- package/dist/runtime-context.js +284 -32
- package/dist/runtime-escada.js +423 -0
- package/dist/runtime-profiles.js +103 -46
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +3 -2
- package/dist/security-scan/agil.js +355 -0
- package/dist/security-scan/cli.js +76 -0
- package/dist/security-scan/compare.js +149 -0
- package/dist/security-scan/config.js +93 -0
- package/dist/security-scan/detect.js +97 -0
- package/dist/security-scan/executor.js +188 -0
- package/dist/security-scan/guard.js +180 -0
- package/dist/security-scan/imagem-de-lint.js +96 -0
- package/dist/security-scan/normalize/actionlint.js +12 -0
- package/dist/security-scan/normalize/eslint.js +12 -0
- package/dist/security-scan/normalize/gitleaks.js +13 -0
- package/dist/security-scan/normalize/golangci-lint.js +13 -0
- package/dist/security-scan/normalize/govulncheck.js +36 -0
- package/dist/security-scan/normalize/index.js +25 -0
- package/dist/security-scan/normalize/npm-audit.js +30 -0
- package/dist/security-scan/normalize/osv-scanner.js +32 -0
- package/dist/security-scan/normalize/oxlint.js +51 -0
- package/dist/security-scan/normalize/pip-audit.js +16 -0
- package/dist/security-scan/normalize/ruff.js +12 -0
- package/dist/security-scan/normalize/semgrep.js +20 -0
- package/dist/security-scan/normalize/trivy.js +33 -0
- package/dist/security-scan/normalize/util.js +204 -0
- package/dist/security-scan/normalize/zizmor.js +19 -0
- package/dist/security-scan/report.js +156 -0
- package/dist/security-scan/run.js +448 -0
- package/dist/security-scan/tools.js +62 -0
- package/dist/security-scan/trabalhador.js +74 -0
- package/dist/security-scan/types.js +15 -0
- package/dist/session-events.js +26 -5
- package/dist/session-watcher-claude.js +81 -20
- package/dist/session-watcher.js +340 -42
- package/dist/sessoes-contas.js +10 -1
- package/dist/sessoes-inventario.js +1 -1
- package/dist/sessoes.js +25 -23
- package/dist/setup.js +59 -58
- package/dist/ship-publicar.js +971 -0
- package/dist/ship.js +243 -97
- package/dist/steal.js +77 -0
- package/dist/superficie.js +14 -11
- package/dist/thread-close.js +12 -11
- package/dist/thread.js +274 -100
- package/dist/tokens.js +15 -11
- package/dist/trabalho-thread.js +297 -0
- package/dist/transporte-do-canal.js +189 -0
- package/dist/types.js +12 -1
- package/dist/util.js +13 -3
- package/dist/varredura-acoes.js +507 -0
- package/dist/verify.js +608 -76
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +167 -0
- package/dist/worktree.js +99 -83
- package/dist/yaml.js +27 -8
- package/eval/casos/check-quality.json +77 -0
- package/eval/casos/security-auditor.json +148 -0
- package/eval/casos/security-remediation.json +161 -0
- package/eval/fixtures/security-scan/README.md +8 -0
- package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/go/Dockerfile +4 -0
- package/eval/fixtures/security-scan/go/README.md +4 -0
- package/eval/fixtures/security-scan/go/config.go +4 -0
- package/eval/fixtures/security-scan/go/go.mod +5 -0
- package/eval/fixtures/security-scan/go/go.sum +2 -0
- package/eval/fixtures/security-scan/go/main.go +31 -0
- package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/js/Dockerfile +3 -0
- package/eval/fixtures/security-scan/js/README.md +4 -0
- package/eval/fixtures/security-scan/js/package-lock.json +844 -0
- package/eval/fixtures/security-scan/js/package.json +10 -0
- package/eval/fixtures/security-scan/js/src/config.js +4 -0
- package/eval/fixtures/security-scan/js/src/server.js +17 -0
- package/eval/fixtures/security-scan/js/src/util.ts +4 -0
- package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
- package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
- package/eval/fixtures/security-scan/python/Dockerfile +3 -0
- package/eval/fixtures/security-scan/python/README.md +4 -0
- package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
- package/eval/fixtures/security-scan/python/app/config.py +2 -0
- package/eval/fixtures/security-scan/python/app/main.py +19 -0
- package/eval/fixtures/security-scan/python/requirements.txt +1 -0
- package/package.json +9 -4
- package/references/security-checklist.md +3 -3
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/check-quality/SKILL.md +16 -0
- package/skills/phases/go-implementation/SKILL.md +6 -0
- package/skills/phases/security-remediation/SKILL.md +70 -0
- package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/adapters/README.md
CHANGED
|
@@ -42,7 +42,25 @@ nos perfis `coding` e `messaging` (`toolMetadata`): sem isso, no perfil `coding`
|
|
|
42
42
|
plugin chega ao modelo. `ork_network_status` espera a RM-053 na `main`. `network-roadmap-hosts.test.ts` prova a rota de cada host e o aceite do incidente de 29/09
|
|
43
43
|
pela extensão do OpenClaw com o `ork` real.
|
|
44
44
|
|
|
45
|
+
## Paridade do conhecimento escrito
|
|
46
|
+
|
|
47
|
+
O conhecimento escrito ([RM-026](../docs/roadmap/RM-026-workspace-empresarial.md) K7) chega aos quatro hosts pelas
|
|
48
|
+
mesmas quatro tools `ork_conhecimento_*`: tools do MCP no Claude Code e no Codex, tool argv no OpenClaw (só no
|
|
49
|
+
perfil `coding`) e wrapper no Hermes, cada uma uma chamada de `ork conhecimento <consulta> --json`. A descrição
|
|
50
|
+
das tools do OpenClaw e a skill do Hermes dizem a mesma regra: a lacuna tipada é lacuna, nunca resposta.
|
|
51
|
+
`conhecimento-hosts.test.ts` confere os nomes, o schema e a frase e, com o `ork` real, o mesmo JSON nas três
|
|
52
|
+
superfícies.
|
|
53
|
+
|
|
45
54
|
Usabilidade HITL é prioridade máxima: recomendação, opções claras e canal disponível
|
|
46
55
|
associado ao pedido. MCP local conserva elicitation; Telegram segue disponível
|
|
47
56
|
quando configurado. Ingresso nativo Hermes/Discord e OpenClaw depende de callback
|
|
48
57
|
autenticado e binding privado; terminal Hermes/ACP não está homologado.
|
|
58
|
+
|
|
59
|
+
## Batida do host e canal (RM-063)
|
|
60
|
+
|
|
61
|
+
Os dois hosts de canal ganham a mesma segunda linha da fábrica: `bin/ork-vigia-batida.js` numa
|
|
62
|
+
automação de comando do OpenClaw e `bin/ork-vigia-batida.py` no cron do Hermes leem o
|
|
63
|
+
`ork doctor --json` a cada 30 min e avisam o dono quando a batida passou de 30 min, sem chamada de
|
|
64
|
+
modelo. `#OrkRetomar` e `#OrkFabrica` entram pelo mesmo ingresso assinado do pulse nos dois, e o
|
|
65
|
+
`ork onboarding` grava o `pulse-host.json` do host escolhido. `conducao-canal.test.mjs` e
|
|
66
|
+
`conducao_canal_test.py` provam os dois lados com `ork` e host SIMULADOS.
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"./skills/phases/goal-definition",
|
|
21
21
|
"./skills/phases/master-metrics",
|
|
22
22
|
"./skills/phases/plan-specification",
|
|
23
|
+
"./skills/phases/security-remediation",
|
|
23
24
|
"./skills/phases/ship-release",
|
|
24
25
|
"./skills/reviewers/code-reviewer",
|
|
25
26
|
"./skills/reviewers/security-auditor",
|
|
@@ -72,11 +72,11 @@ descartável; o recibo traz o sha256 dos arquivos globais antes e depois. Modelo
|
|
|
72
72
|
| `/ork` | Painel: doctor, board, escalonador, modos, fila de score |
|
|
73
73
|
|
|
74
74
|
Mais seis subagentes (`ork-goal`, `ork-plan`, `ork-go`, `ork-check`, `ork-ship`, `ork-master`) para
|
|
75
|
-
isolar o contexto de cada fase, e o
|
|
75
|
+
isolar o contexto de cada fase, o guard `PreToolUse` e o hook `UserPromptSubmit` da resposta curta do dono.
|
|
76
76
|
|
|
77
77
|
## O guard PreToolUse
|
|
78
78
|
|
|
79
|
-
Um hook, em `Bash`, chamando `hooks/ork-guard.js`. Ele bloqueia
|
|
79
|
+
Um hook, em `Bash`, chamando `hooks/ork-guard.js`. Ele bloqueia sete classes de comando:
|
|
80
80
|
|
|
81
81
|
| Bloqueio | Por que |
|
|
82
82
|
|---|---|
|
|
@@ -86,12 +86,44 @@ Um hook, em `Bash`, chamando `hooks/ork-guard.js`. Ele bloqueia seis classes de
|
|
|
86
86
|
| `git push` | Push na mao nao e provado: a entrega passa por `ork ship` |
|
|
87
87
|
| `git reset --hard`, `git clean -fd`, `git checkout -- .` | Descarte em massa sem rastro |
|
|
88
88
|
| `rm -rf` com alvo amplo ou variavel | Apaga o que ninguem pediu |
|
|
89
|
+
| `ork noctum terminal` e o hook da resposta chamados pela ferramenta | A resposta do dono no terminal vem do hook da sessão dele; o agente que chama esse ingresso se passa pelo dono (RM-057) |
|
|
89
90
|
|
|
90
91
|
**O guard nao tem regra de negocio.** Ele nao le ledger, nao sabe quem autorizou o que e nao
|
|
91
92
|
conhece thread nenhuma: ele reconhece a forma do comando e manda o agente pelo caminho que o `ork`
|
|
92
93
|
verifica. Comando que comeca com `ork` passa direto, porque quem prova o push e serializa o merge e
|
|
93
|
-
o nucleo
|
|
94
|
-
|
|
94
|
+
o nucleo; a exceção é o ingresso da resposta do dono (`ork noctum terminal`), barrado antes dessa
|
|
95
|
+
passagem. E se o proprio guard quebrar, ele **libera**: um hook que derruba a sessao por bug proprio
|
|
96
|
+
e pior que nenhum hook. A barreira do ingresso da resposta é lombada, não prova: quem roda como o
|
|
97
|
+
mesmo usuário do sistema a contorna, e o limite está dito abaixo.
|
|
98
|
+
|
|
99
|
+
## A resposta curta do dono no terminal (RM-057)
|
|
100
|
+
|
|
101
|
+
**Desligada.** Desde o GO-FIX 2 da RM-057, o núcleo não grava nada pelo terminal. Numa sessão interativa do
|
|
102
|
+
Claude Code, quando o dono digita a resposta curta a uma pergunta que espera por ele (`sim`, `a` ou
|
|
103
|
+
`<código> a`), o hook `UserPromptSubmit` (`hooks/ork-resposta.js`) leva o evento ao núcleo pelo
|
|
104
|
+
`ork noctum terminal --hook-stdin`, e o núcleo só devolve a recusa `noctum.terminal.desligado`: com alguém
|
|
105
|
+
presente, o dono vê um aviso (`systemMessage`) para responder pelo Telegram, em reply à mensagem da
|
|
106
|
+
pergunta ou com o código e a letra, ou pela janela de confirmação do Claude Code (o diálogo nativo, um
|
|
107
|
+
clique). O prompt segue ao modelo, e nada é gravado nem encaminhado, nem a resposta a um gate. Conversa
|
|
108
|
+
comum nem chama o núcleo, e o prompt que a máquina escreveu (o campo `source` do evento diferente de
|
|
109
|
+
`user`) também não.
|
|
110
|
+
|
|
111
|
+
**Por que desligada:** o Claude Code instalado (2.1.306) ainda não manda o `source` do evento, e sem ele
|
|
112
|
+
nada do dono gravaria. E o agente da própria sessão do dono, pela ferramenta Bash, troca o shell pelo
|
|
113
|
+
núcleo com `exec`, tira a marca `AI_AGENT` e forja o evento com `source` igual a `user`: a cadeia de
|
|
114
|
+
processos e o guard são lombadas, não prova. Ligado, o ingresso não serviria ao dono e serviria a quem
|
|
115
|
+
forja o evento.
|
|
116
|
+
|
|
117
|
+
**O que falta para voltar**, numa fatia própria: o Claude Code mandar a origem humana do evento
|
|
118
|
+
(`source`); uma prova de que o evento veio do hook do harness, e não de um processo do mesmo usuário; e,
|
|
119
|
+
para a palavra solta, a pergunta mostrada exigida como a linha que o núcleo monta para ela, ou só o código
|
|
120
|
+
com a letra. O código do ingresso segue no núcleo atrás da chave `TERMINAL_LIGADO`, desligada; só os
|
|
121
|
+
testes a ligam, e o CLI e o hook nunca.
|
|
122
|
+
|
|
123
|
+
**Limite:** a fronteira é a conta do sistema. No diálogo nativo, qualquer cliente MCP do mesmo usuário que
|
|
124
|
+
declare o formulário passa, sem chave. Para separar o núcleo dos agentes, rode os agentes em outra conta
|
|
125
|
+
ou sandbox. O aviso só aparece depois de reinstalar o plugin (`ork adapter install claude-code`) e do
|
|
126
|
+
`ork` com o `noctum terminal`.
|
|
95
127
|
|
|
96
128
|
## Sensores de sessão
|
|
97
129
|
|
|
@@ -151,6 +183,164 @@ Sem `tool_use_id`, cada invocação do hook recebe uma identidade de ocorrência
|
|
|
151
183
|
do transcript não identifica uma ocorrência; eventos de um novo episódio de permissão
|
|
152
184
|
podem chegar sem alteração do arquivo. Replays com `tool_use_id` continuam idempotentes.
|
|
153
185
|
|
|
186
|
+
## Mods nas sessões de fase (RM-059)
|
|
187
|
+
|
|
188
|
+
Mod é plugin de *function hooks* do Claude Code 2.1.287 ou mais novo. Cada mod do Orkastery mora
|
|
189
|
+
em `adapters/claude-code/mods/<mod>/`, com o próprio `.claude-plugin/plugin.json`, e declara o
|
|
190
|
+
papel em `orkastery-mod.json`:
|
|
191
|
+
|
|
192
|
+
```json
|
|
193
|
+
{"formato":"ork.mod/v1","papeis":["fase"],"claudeCodeMinimo":"2.1.287"}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
O papel `dono` roda na sessão de quem conduz; o papel `fase`, nas sessões de fase que o `ork`
|
|
197
|
+
despacha. O `ork adapter install claude-code` copia os mods com o resto do adaptador e grava cada
|
|
198
|
+
arquivo deles no `INSTALADO.json`. No despacho `claude-bg`, cada mod de papel `fase` entra com o
|
|
199
|
+
próprio `--plugin-dir`, logo depois do plugin do Orkastery, quando:
|
|
200
|
+
|
|
201
|
+
- a pasta instalada do mod tem exatamente os arquivos do recibo, com os mesmos bytes e sem link;
|
|
202
|
+
os tipos que o próprio Claude Code escreve em `.claude-plugin/types/` (`*.d.ts` e
|
|
203
|
+
`tsconfig.json`) ficam fora da conta;
|
|
204
|
+
- o `claude --version` atende o `claudeCodeMinimo` do mod e o 2.1.287 da API de mods.
|
|
205
|
+
|
|
206
|
+
Mod que pede versão mais nova fica fora do comando, e o despacho segue: o núcleo não depende de
|
|
207
|
+
mod. Mod cuja dependência ficou de fora (pela versão, ou por ser só de papel `dono`) também fica.
|
|
208
|
+
Declaração inválida, manifesto fora do recibo ou arquivo a mais na pasta recusa o despacho com
|
|
209
|
+
`runtime.context.installation`, como um byte divergente. Arquivo de mod que saiu do catálogo sai da
|
|
210
|
+
cópia na reinstalação: o `ork adapter install claude-code` tira o que ele mesmo instalou e ninguém
|
|
211
|
+
editou. Arquivo editado ou acrescentado à mão fica, e a recusa diz o caminho para apagar. A dependência (`dependencies` do
|
|
212
|
+
`plugin.json` do mod) entra antes de quem depende; o resto segue o nome. Os mods que foram ficam no
|
|
213
|
+
comando gravado no evento `phase_dispatch` do ledger da thread.
|
|
214
|
+
|
|
215
|
+
O arquivo comum da raiz de `mods/`, como a lista de autoridade que a ponte lê em `../autoridade.json`
|
|
216
|
+
antes da própria pasta, segue a mesma regra quando há mod de fase no despacho: fora do recibo, link
|
|
217
|
+
ou arquivo especial recusam, e o que saiu do catálogo sai da cópia na reinstalação.
|
|
218
|
+
|
|
219
|
+
Para tirar um mod das sessões de fase, mude o papel no `orkastery-mod.json` do catálogo, ou tire o
|
|
220
|
+
mod, e rode `ork adapter install claude-code` de novo.
|
|
221
|
+
|
|
222
|
+
O mod de papel `dono` não vai ao despacho: ele roda na sessão de quem conduz. Num projeto com o
|
|
223
|
+
adaptador instalado, a cópia dele já está em `.claude/plugins/orkastery/mods/<mod>`, com cada
|
|
224
|
+
arquivo registrado no `INSTALADO.json` e os arquivos comuns da raiz de `mods/` ao lado. Nesse
|
|
225
|
+
carregamento ninguém confere os bytes: a conferência contra o recibo roda no despacho, para mod de
|
|
226
|
+
fase. Carregue-a na sessão com:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
claude --plugin-dir .claude/plugins/orkastery/mods/<mod>
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Sem o adaptador local, cada mod tem uma entrada no marketplace próprio do repositório
|
|
233
|
+
(`.claude-plugin/marketplace.json`, gerado por `node core/scripts/gerar-marketplaces.cjs`), que aponta
|
|
234
|
+
para uma cópia gerada em `marketplaces/claude-code/mods/<mod>/`. Instalado pelo marketplace, o plugin
|
|
235
|
+
é só a própria pasta, então o arquivo comum da raiz de `adapters/claude-code/mods/` (a lista de
|
|
236
|
+
autoridade da ponte, por exemplo) vai dentro de cada cópia. A instalação é no escopo do projeto:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
claude plugin marketplace add orkastery/orkastery
|
|
240
|
+
claude plugin install <mod>@orkastery --scope project
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Os dois marketplaces se chamam `orkastery`, e o local, registrado na instalação acima a partir de
|
|
244
|
+
`.claude/plugins/orkastery`, não lista os mods. Não troque um pelo outro num projeto que usa o
|
|
245
|
+
plugin do adaptador: remover um marketplace desinstala os plugins que vieram dele (medido no
|
|
246
|
+
Claude Code 2.1.296), e o plugin do marketplace do repositório não traz o guard `PreToolUse` nem o
|
|
247
|
+
MCP do adaptador.
|
|
248
|
+
|
|
249
|
+
### Freio de Lote (`ork-freio`)
|
|
250
|
+
|
|
251
|
+
O primeiro mod de papel `fase`. Na sessão de fase, depois de cada lote de ferramentas, ele:
|
|
252
|
+
|
|
253
|
+
- acha os arquivos que o lote mexeu: os caminhos de `Edit`, `Write`, `MultiEdit` e `NotebookEdit` e a
|
|
254
|
+
diferença do `git status` entre um lote e outro, que pega também a edição feita por `Bash`;
|
|
255
|
+
- acha as claims da thread que citam esses arquivos, pelo `arquivo` ou pelo texto do comando, e avisa
|
|
256
|
+
quando o lote mexeu fora dos `touch_paths` do plano;
|
|
257
|
+
- pede ao núcleo, em segundo plano, a conferência dessas claims com
|
|
258
|
+
`ork claims conferir <thread> --claims ... --json`, no sandbox do verify, uma rodada por vez;
|
|
259
|
+
- devolve ao modelo, no lote seguinte do laço principal, o que quebrou: o id da claim, o comando e o
|
|
260
|
+
fim da saída. Lote sem claim afetada passa sem texto, e a linha de status mostra as claims em risco.
|
|
261
|
+
O lote de um subagente conta os arquivos tocados, mas não leva a entrega nem o aviso.
|
|
262
|
+
|
|
263
|
+
O Freio nunca roda o comando de uma claim, nunca grava estado de claim e nunca para o laço: quem
|
|
264
|
+
verifica de verdade continua sendo o `ork verify`. Ele lê o papel e a thread pelo `$.ork` da ponte, e
|
|
265
|
+
as claims e o plano pelas ferramentas de leitura `ork_claims_list` e `ork_artifact_read`, nunca do
|
|
266
|
+
disco em `.orkastery/`. Precisa de um `ork` com `ork claims conferir` no `PATH` da sessão; sem ele, ou
|
|
267
|
+
sem o sandbox do verify, avisa uma vez que a conferência está indisponível e segue. Teste que cria
|
|
268
|
+
processo pode reprovar no sandbox e passar no `ork verify`, e o aviso diz isso junto da falha. O
|
|
269
|
+
resultado chega no lote seguinte: se a sessão terminar antes dele, a última conferência fica sem
|
|
270
|
+
entrega. Falha de claim cujo arquivo foi tocado de novo durante a conferência não é entregue, porque
|
|
271
|
+
uma conferência nova já foi pedida. Um `Edit` que falhou também conta como toque e pode pedir uma
|
|
272
|
+
conferência a mais.
|
|
273
|
+
|
|
274
|
+
### Portão de Tarefas (`ork-portao`)
|
|
275
|
+
|
|
276
|
+
O segundo mod de papel `fase`. Os portões do quadro agem só na sessão de fase cujo bloco atual tem o GO
|
|
277
|
+
(pelo slug do bloco no retrato do núcleo) e cuja thread tem plano com ao menos uma tarefa `T<n>` que
|
|
278
|
+
serve ao quadro: com `touch_paths` (caminhos entre crases, com barra, ponto ou curinga) e um verify com um
|
|
279
|
+
comando só entre crases, a regra do `ork claims conferir --tarefa`. Plano sem nenhuma tarefa assim não
|
|
280
|
+
ganha portão, para não travar o quadro do GO. Com o portão ligado:
|
|
281
|
+
|
|
282
|
+
- **criação:** `TaskCreated` recusa a tarefa cujo assunto não traz o id de uma tarefa do plano
|
|
283
|
+
(`T2.1 ...`), ou cuja tarefa do plano não serve ao quadro. A recusa volta ao modelo com o motivo e as
|
|
284
|
+
tarefas do plano que servem;
|
|
285
|
+
- **conclusão:** `TaskCompleted` da tarefa registrada na criação, ou da que cita no assunto uma tarefa do
|
|
286
|
+
plano que serve, pede ao núcleo `ork claims conferir <thread> --tarefa T2.1 --prazo 540 --json`, no
|
|
287
|
+
sandbox do verify, e só deixa a tarefa fechar com o item aprovado. Reprovação volta com o comando, o
|
|
288
|
+
código e o fim da saída; sem veredito, recusa tipada, outra condução na thread, conferência que não roda
|
|
289
|
+
ou falha do próprio Portão também bloqueiam, sempre com a saída: corrigir e concluir de novo, ou devolver
|
|
290
|
+
a tarefa para `pending` e seguir. A tarefa registrada continua conferida mesmo com o plano ilegível na
|
|
291
|
+
hora, porque o núcleo lê o plano por conta própria. Uma conferência por vez: a conclusão que chega no
|
|
292
|
+
meio de outra é recusada na hora. Da terceira reprovação igual em diante, o texto manda deixar a tarefa
|
|
293
|
+
aberta;
|
|
294
|
+
- **teammate ocioso:** com agent teams no piloto (abaixo), `TeammateIdle` entrega ao teammate a próxima
|
|
295
|
+
tarefa do plano que serve, não fechou nesta sessão e cuja região está livre: nenhum lease `path:` ativo,
|
|
296
|
+
de nenhuma thread, cruza os `touch_paths` dela e ela não cruza as tarefas dos outros teammates. Os leases
|
|
297
|
+
vêm do retrato de todas as threads pela consulta `maestro` da ponte
|
|
298
|
+
(`ork maestro --json --section leases --offset N`), seguindo o `nextOffset` das páginas que o teto de
|
|
299
|
+
bytes do retrato corta, até 10 páginas, porque o servidor MCP da sessão de fase só mostra os da própria
|
|
300
|
+
thread. O Portão não toma nem solta lease: o `ork_git_commit` toma o `path:` de cada arquivo na hora do
|
|
301
|
+
commit e recusa o commit com qualquer lease no caminho. Quem fica ocioso sem concluir devolve a tarefa,
|
|
302
|
+
que sai da distribuição automática desta sessão. Sem a lista de leases inteira (seção indisponível,
|
|
303
|
+
lacuna, retrato em conflito ou mais de 10 páginas), no teto de custo ou sem tarefa livre, o teammate
|
|
304
|
+
fica ocioso.
|
|
305
|
+
|
|
306
|
+
O Portão nunca roda o verify por conta própria: quem verifica de verdade continua sendo o `ork verify`.
|
|
307
|
+
Ele lê o papel pelo `$.ork.contexto` da ponte, o estado e o bloco pelo `$.ork.retrato`, os leases pela
|
|
308
|
+
consulta `maestro` da ponte e o plano pelo `ork_artifact_read`, nunca do disco em `.orkastery/`. Teste que
|
|
309
|
+
cria processo pode reprovar no sandbox e passar no `ork verify`, e o bloqueio diz isso.
|
|
310
|
+
|
|
311
|
+
Agent teams na sessão de fase só rodam no piloto, desligado por padrão. Quem conduz liga no manifesto da
|
|
312
|
+
raiz:
|
|
313
|
+
|
|
314
|
+
```yaml
|
|
315
|
+
runtime:
|
|
316
|
+
agent_teams:
|
|
317
|
+
ligado: true
|
|
318
|
+
teammates: 2 # teto de teammates vivos, de 1 a 8
|
|
319
|
+
custo_usd: 10 # teto do custo da sessão, como o /cost soma, até 500
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
Com a chave ligada, o GO no bloco da fase atual e o Portão entre os mods que vão à sessão, o despacho
|
|
323
|
+
`claude-bg` acrescenta ao `--settings` a variável `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS`, os dois tetos
|
|
324
|
+
(`ORK_AGENT_TEAMS_TEAMMATES` e `ORK_AGENT_TEAMS_CUSTO_USD`) e `teammateMode` `in-process`, porque a sessão
|
|
325
|
+
de fundo não tem `tmux`. Teto inválido vira aviso do manifesto e deixa desligado. Em toda sessão de fase,
|
|
326
|
+
com ou sem o portão do quadro, o Portão recusa o nascimento de teammate sem os tetos, no teto de teammates
|
|
327
|
+
vivos ou com o custo da sessão no teto, e no teto de custo não entrega tarefa nova.
|
|
328
|
+
|
|
329
|
+
Limites conhecidos:
|
|
330
|
+
|
|
331
|
+
- o quadro do Portão vale para a sessão: numa sessão de GO redespachada, tarefa fechada na anterior pode
|
|
332
|
+
ser entregue de novo ao teammate, que a encontra pronta no quadro e no git;
|
|
333
|
+
- o líder não recebe aviso quando um teammate devolve uma tarefa; ele a vê aberta no quadro;
|
|
334
|
+
- a conferência do Freio, em segundo plano, e a do Portão, na conclusão, podem rodar ao mesmo tempo na
|
|
335
|
+
mesma worktree; cada mod só serializa as próprias;
|
|
336
|
+
- os tetos dependem de o Portão carregar de verdade: o despacho decide pelo `--plugin-dir`, e se o mod não
|
|
337
|
+
registrar na sessão, agent teams fica ligado sem ninguém aplicando os tetos;
|
|
338
|
+
- se o turno for interrompido no meio da conferência, o Claude Code segue sem a resposta do gancho;
|
|
339
|
+
- nome de lease que o retrato redige (caminho absoluto ou texto com cara de segredo) chega irreconhecível e
|
|
340
|
+
não cruza nenhuma região;
|
|
341
|
+
- o comportamento desses eventos numa sessão `claude --bg` real com agent teams ainda não foi medido; os
|
|
342
|
+
testes do kit e do núcleo cobrem o mod e o despacho.
|
|
343
|
+
|
|
154
344
|
## A #TAG de conducao
|
|
155
345
|
|
|
156
346
|
O comando `/goal` extrai o modo do proprio pedido, sem reimplementar nada:
|
|
@@ -174,7 +364,7 @@ tres e o `--dry-run` mostra o que ele vai fazer sobre cada um.
|
|
|
174
364
|
(`core/`, `phases/`, `reviewers/`, ...) que este catalogo usa. Por isso `plugin.json` declara os
|
|
175
365
|
caminhos um a um. O teste compara esses caminhos com o catálogo fonte e exige
|
|
176
366
|
`onboarding`, acrescentada por I15. Neste catálogo, `claude plugin details orkastery`
|
|
177
|
-
deve reportar
|
|
367
|
+
deve reportar 29 entradas: 21 skills e 8 comandos (a linha `Skills (29)`). O startup registra
|
|
178
368
|
separadamente skills e comandos. As provas anteriores, com 17 e 18 skills, são históricas.
|
|
179
369
|
Confira também os seis agentes e seis eventos de hooks, sem erros de carregamento.
|
|
180
370
|
|
|
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
27
27
|
|
|
28
28
|
- O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
|
|
29
29
|
- Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
|
|
30
|
+
- Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
|
|
30
31
|
- Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
|
|
31
32
|
fica registrada no ledger.
|
|
32
33
|
- Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
|
|
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
27
27
|
|
|
28
28
|
- O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
|
|
29
29
|
- Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
|
|
30
|
+
- Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
|
|
30
31
|
- Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
|
|
31
32
|
fica registrada no ledger.
|
|
32
33
|
- Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
|
|
@@ -28,6 +28,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
28
28
|
|
|
29
29
|
- O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
|
|
30
30
|
- Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
|
|
31
|
+
- Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
|
|
31
32
|
- Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
|
|
32
33
|
fica registrada no ledger.
|
|
33
34
|
- Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
|
|
@@ -29,6 +29,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
29
29
|
|
|
30
30
|
- O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
|
|
31
31
|
- Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
|
|
32
|
+
- Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
|
|
32
33
|
- Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
|
|
33
34
|
fica registrada no ledger.
|
|
34
35
|
- Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
|
|
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
27
27
|
|
|
28
28
|
- O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
|
|
29
29
|
- Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
|
|
30
|
+
- Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
|
|
30
31
|
- Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
|
|
31
32
|
fica registrada no ledger.
|
|
32
33
|
- Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
|
|
@@ -27,6 +27,7 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
27
27
|
|
|
28
28
|
- O modo de conducao afrouxa a PAUSA, nunca a VERIFICACAO.
|
|
29
29
|
- Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.
|
|
30
|
+
- Esperas: nunca dispare verify, build ou suite com `&` dentro do comando, porque o processo se perde e a sessao espera um aviso que nunca vem; rode o `ork verify` em primeiro plano, com `timeout` (ele espera a vez na fila de recursos pesados), ou use a execucao em segundo plano do host, que avisa quando termina; nunca espere com `pgrep -f` cujo padrao aparece no proprio comando, porque o laco acha a si mesmo e nao termina: espere pelo arquivo de saida com prazo, ou pelo PID guardado.
|
|
30
31
|
- Passo irreversivel (push, merge, delecao) so acontece quando o modo autoriza, e a autorizacao
|
|
31
32
|
fica registrada no ledger.
|
|
32
33
|
- Termine dizendo, em uma linha, em que ponto a thread esta e o que acontece agora.
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"Notification": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
|
|
18
18
|
"Stop": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
|
|
19
19
|
"SubagentStop": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
|
|
20
|
-
"PostToolUse": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }]
|
|
20
|
+
"PostToolUse": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-sensor.js\"", "timeout": 5 }] }],
|
|
21
|
+
"UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ork-resposta.js\"", "timeout": 10 }] }]
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -62,11 +62,25 @@ const BLOQUEIOS = [
|
|
|
62
62
|
},
|
|
63
63
|
];
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* RM-057 (resposta curta, D11 da ork-rm057respost): a resposta do dono no terminal vem do hook `UserPromptSubmit` da
|
|
67
|
+
* sessao dele. Um agente que chama esse ingresso pela ferramenta se passa pelo dono, e por isso esta regra roda ANTES da
|
|
68
|
+
* passagem livre do `ork`. E lombada, nao prova: quem roda como o mesmo usuario contorna (o limite dito na RM-058), ate
|
|
69
|
+
* com o subcomando entre aspas. Desde o GO-FIX 2 (D22) o ingresso do terminal esta desligado e nao grava nada.
|
|
70
|
+
*/
|
|
71
|
+
const RESPOSTA_DO_DONO = {
|
|
72
|
+
nome: 'resposta-do-dono-por-ferramenta',
|
|
73
|
+
regex: /\bnoctum\s+terminal\b|ork-resposta\.js/,
|
|
74
|
+
motivo: 'a resposta do dono no terminal vem do hook UserPromptSubmit da sessao dele; o agente que chama esse ingresso se passa pelo dono',
|
|
75
|
+
caminho: 'mostre a pergunta ao dono e espere a resposta dele no Telegram ou pela janela de confirmacao do host; nunca responda por ele',
|
|
76
|
+
};
|
|
77
|
+
|
|
65
78
|
function decidir(entrada) {
|
|
66
79
|
const nome = entrada && entrada.tool_name;
|
|
67
80
|
if (nome !== 'Bash') return null;
|
|
68
81
|
const comando = String((entrada.tool_input && entrada.tool_input.command) || '');
|
|
69
82
|
if (comando.trim() === '') return null;
|
|
83
|
+
if (RESPOSTA_DO_DONO.regex.test(comando)) return RESPOSTA_DO_DONO;
|
|
70
84
|
// Comando do proprio `ork` passa: quem verifica o push provado e o merge serializado e ele.
|
|
71
85
|
if (/^\s*(?:[A-Za-z0-9_]+=\S*\s+)*(?:\S*\/)?ork\s/.test(comando)) return null;
|
|
72
86
|
for (const b of BLOQUEIOS) {
|
|
@@ -127,4 +141,4 @@ process.stdin.on('end', () => {
|
|
|
127
141
|
process.exitCode = codigo;
|
|
128
142
|
});
|
|
129
143
|
|
|
130
|
-
module.exports = { BLOQUEIOS, decidir };
|
|
144
|
+
module.exports = { BLOQUEIOS, RESPOSTA_DO_DONO, decidir };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
/**
|
|
4
|
+
* Hook `UserPromptSubmit` do adaptador Claude Code: a resposta curta do dono no terminal (RM-057, ork-rm057respost).
|
|
5
|
+
*
|
|
6
|
+
* GO-FIX 2 (D22): o ingresso do terminal esta DESLIGADO no nucleo. Quando o dono digita a resposta curta a uma pergunta
|
|
7
|
+
* que espera por ele, o nucleo nao grava nada e devolve so a recusa `noctum.terminal.desligado`, que este hook mostra ao
|
|
8
|
+
* dono (`systemMessage`): responda pelo Telegram (em reply a mensagem da pergunta, ou com o codigo) ou pela janela de
|
|
9
|
+
* confirmacao do Claude Code (o dialogo nativo). O transporte abaixo continua o mesmo, para quando uma fatia propria
|
|
10
|
+
* religar o ingresso.
|
|
11
|
+
*
|
|
12
|
+
* O dono aprova onde estiver. Numa sessao interativa, ele responde a pergunta do arco #Noctum com "sim", "a" ou
|
|
13
|
+
* "<codigo> a"; este hook leva o evento ao nucleo (`ork noctum terminal --hook-stdin`) e transporta a decisao dele:
|
|
14
|
+
*
|
|
15
|
+
* - gravada (ou sem efeito, detalhe, ou a pergunta de volta): a frase do nucleo substitui o prompt (`decision: block`),
|
|
16
|
+
* e o "sim" nao chega ao modelo;
|
|
17
|
+
* - resposta a um gate: o contexto vai ao modelo (`additionalContext`), para o condutor abrir o dialogo nativo;
|
|
18
|
+
* - recusa pela origem com alguem presente: um aviso ao dono (`systemMessage`), e o prompt segue ao modelo;
|
|
19
|
+
* - o resto: nada, e o prompt segue como sempre.
|
|
20
|
+
*
|
|
21
|
+
* Ele NAO tem regra de negocio: nao le ledger, nao conhece pergunta e nao prova nada; quem confere a origem da sessao e o
|
|
22
|
+
* nucleo. So texto curto de uma linha chama o nucleo. Erro do hook ou do nucleo nunca bloqueia nem quebra a sessao.
|
|
23
|
+
*
|
|
24
|
+
* GO-FIX 1 (achado 1): o prompt que a maquina injeta na sessao do dono (a tarefa agendada, a volta do /loop, a mensagem
|
|
25
|
+
* de canal ou de outra sessao, o SDK) nunca chega ao nucleo: o evento diz quem o escreveu (`source`), e so `user`, o
|
|
26
|
+
* compositor interativo, passa. Sem o campo (versao do Claude Code que ainda nao o manda), o nucleo recebe o evento,
|
|
27
|
+
* recusa e diz ao dono por que; ele tambem exige `user`, para quem chamar o nucleo sem este hook.
|
|
28
|
+
*/
|
|
29
|
+
const fs = require('node:fs');
|
|
30
|
+
const path = require('node:path');
|
|
31
|
+
const { spawnSync } = require('node:child_process');
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A forma da resposta curta, larga o bastante para o nucleo decidir e estreita o bastante para conversa comum nem chamar o
|
|
35
|
+
* nucleo: o codigo com a resposta ("NX4K a"), o numero com a letra ("1a") ou uma palavra solta de ate duas palavras e 20
|
|
36
|
+
* caracteres ("sim", "pode seguir"). Tudo numa linha so, ate 64 caracteres.
|
|
37
|
+
*/
|
|
38
|
+
const TETO_DO_PROMPT = 64;
|
|
39
|
+
const CODIGO_E_RESPOSTA = /^[A-HJKMNP-TV-Z](?=[2-9A-HJKMNP-TV-Z]{0,2}[2-9])[2-9A-HJKMNP-TV-Z]{3}\s+\S/i;
|
|
40
|
+
const NUMERO_E_LETRA = /^[0-9]{1,2}\s*[a-e][.!]?$/i;
|
|
41
|
+
const PALAVRA_SOLTA = /^\S+(?:\s\S+)?$/;
|
|
42
|
+
const TETO_DA_ENTRADA = 1024 * 1024;
|
|
43
|
+
|
|
44
|
+
function pareceRespostaCurta(t) {
|
|
45
|
+
if (!t || t.length > TETO_DO_PROMPT || /[\r\n]/.test(t)) return false;
|
|
46
|
+
return CODIGO_E_RESPOSTA.test(t) || NUMERO_E_LETRA.test(t) || (t.length <= 20 && PALAVRA_SOLTA.test(t));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function lerEntrada() {
|
|
50
|
+
const buffer = Buffer.alloc(TETO_DA_ENTRADA + 1);
|
|
51
|
+
let bytes = 0;
|
|
52
|
+
while (bytes <= TETO_DA_ENTRADA) {
|
|
53
|
+
const n = fs.readSync(0, buffer, bytes, buffer.length - bytes, null);
|
|
54
|
+
if (!n) break;
|
|
55
|
+
bytes += n;
|
|
56
|
+
}
|
|
57
|
+
if (bytes > TETO_DA_ENTRADA) return null;
|
|
58
|
+
return JSON.parse(buffer.subarray(0, bytes).toString('utf8'));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** O texto que o nucleo montou, com teto: o hook transporta, nunca reescreve. */
|
|
62
|
+
const texto = (v, teto) => (typeof v === 'string' && v.trim() ? v.slice(0, teto) : '');
|
|
63
|
+
|
|
64
|
+
function executar() {
|
|
65
|
+
const h = lerEntrada();
|
|
66
|
+
if (!h || h.hook_event_name !== 'UserPromptSubmit' || typeof h.prompt !== 'string' ||
|
|
67
|
+
typeof h.cwd !== 'string' || !path.isAbsolute(h.cwd)) return;
|
|
68
|
+
// O prompt que a maquina escreveu nao e do dono: nao chega ao nucleo, e segue ao modelo como sempre.
|
|
69
|
+
if (h.source !== undefined && h.source !== 'user') return;
|
|
70
|
+
if (!pareceRespostaCurta(h.prompt.trim())) return;
|
|
71
|
+
const r = spawnSync(process.env.ORK_SENSOR_CLI || 'ork', ['noctum', 'terminal', '--hook-stdin'], {
|
|
72
|
+
cwd: h.cwd, input: JSON.stringify(h), encoding: 'utf8', timeout: 8000, maxBuffer: 256 * 1024, windowsHide: true,
|
|
73
|
+
});
|
|
74
|
+
if (r.status !== 0 || typeof r.stdout !== 'string' || !r.stdout.trim()) return;
|
|
75
|
+
let d;
|
|
76
|
+
try { d = JSON.parse(r.stdout); } catch { return; }
|
|
77
|
+
if (!d || d.contrato !== 'ork.noctum-terminal/v1') return;
|
|
78
|
+
let saida = null;
|
|
79
|
+
if (['registrada', 'sem-efeito', 'detalhe', 'pergunta'].includes(d.acao) && texto(d.mensagem, 8000)) {
|
|
80
|
+
saida = { decision: 'block', reason: texto(d.mensagem, 8000) };
|
|
81
|
+
} else if (d.acao === 'encaminhar' && texto(d.contexto, 2000)) {
|
|
82
|
+
saida = { hookSpecificOutput: { hookEventName: 'UserPromptSubmit', additionalContext: texto(d.contexto, 2000) } };
|
|
83
|
+
} else if (d.acao === 'recusada' && d.presenca === true && texto(d.mensagem, 2000)) {
|
|
84
|
+
saida = { systemMessage: texto(d.mensagem, 2000) };
|
|
85
|
+
}
|
|
86
|
+
if (saida) process.stdout.write(JSON.stringify(saida) + '\n');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
try { executar(); }
|
|
90
|
+
catch { process.stderr.write('ork resposta: entrada invalida ou nucleo indisponivel; o prompt segue sem mudanca.\n'); }
|
|
91
|
+
process.exitCode = 0;
|
|
@@ -5,6 +5,7 @@ const fs = require('node:fs');
|
|
|
5
5
|
const path = require('node:path');
|
|
6
6
|
const { spawnSync } = require('node:child_process');
|
|
7
7
|
const { createHash, randomUUID } = require('node:crypto');
|
|
8
|
+
const { accountFailure } = require('./quota-signal');
|
|
8
9
|
|
|
9
10
|
function executar() {
|
|
10
11
|
const limite = 1024 * 1024;
|
|
@@ -25,6 +26,15 @@ function executar() {
|
|
|
25
26
|
if (!tipo) return;
|
|
26
27
|
const payload = { observedAt: new Date().toISOString() };
|
|
27
28
|
if (h.hook_event_name === 'Notification') payload.notificationType = h.notification_type;
|
|
29
|
+
// RM-037 (CHECK 3 da ork-rm037defeit2): o Stop conta o trabalho que ainda vai acordar a sessão. Com despertar agendado
|
|
30
|
+
// (CronCreate, ScheduleWakeup, /loop) ou tarefa MCP, o Claude Code mostra a sessão `idle`; só a entrada do Stop separa
|
|
31
|
+
// a sessão encerrada da que vai voltar a escrever. Runtime sem os campos não manda nada, e o ork não supõe zero.
|
|
32
|
+
if (h.hook_event_name === 'Stop') {
|
|
33
|
+
if (Array.isArray(h.background_tasks)) payload.backgroundTasks = h.background_tasks.length;
|
|
34
|
+
if (Array.isArray(h.session_crons)) payload.sessionCrons = h.session_crons.length;
|
|
35
|
+
}
|
|
36
|
+
const falhaDaConta = accountFailure(h);
|
|
37
|
+
if (falhaDaConta && (tipo === 'notification' || tipo === 'stop')) payload.accountFailure = falhaDaConta;
|
|
28
38
|
// tool_use_id identifica replay da mesma ferramenta. Sem id do protocolo,
|
|
29
39
|
// cada invocação é uma ocorrência; stat do transcript não identifica eventos.
|
|
30
40
|
payload.eventId = typeof h.tool_use_id === 'string'
|
|
@@ -47,11 +57,17 @@ function executar() {
|
|
|
47
57
|
}
|
|
48
58
|
}
|
|
49
59
|
}
|
|
50
|
-
const
|
|
60
|
+
const enviar = (p) => spawnSync(process.env.ORK_SENSOR_CLI || 'ork',
|
|
51
61
|
['sessions', 'event', '--tipo', tipo, '--sessao', h.session_id], {
|
|
52
|
-
cwd: h.cwd, input: JSON.stringify(
|
|
62
|
+
cwd: h.cwd, input: JSON.stringify(p), encoding: 'utf8', timeout: 3000,
|
|
53
63
|
maxBuffer: 32768, windowsHide: true,
|
|
54
64
|
});
|
|
65
|
+
let r = enviar(payload);
|
|
66
|
+
// O `ork` de antes das contagens recusa o campo novo antes de gravar qualquer coisa: o Stop vai de novo sem elas, como ia.
|
|
67
|
+
if (r.status === 1 && /^evento recusado: campo de payload inválido: (?:backgroundTasks|sessionCrons)$/m.test(r.stderr || '')) {
|
|
68
|
+
const { backgroundTasks: _tarefas, sessionCrons: _despertares, ...semContagens } = payload;
|
|
69
|
+
r = enviar(semContagens);
|
|
70
|
+
}
|
|
55
71
|
if (r.status !== 0) {
|
|
56
72
|
// Recusa conhecida não identifica o papel da sessão nem comprova ingestão.
|
|
57
73
|
const semVinculo = r.status === 1 && !r.error && !r.stdout?.trim() &&
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RM-064 T1: reconhece apenas o fato de a conta ter esgotado. O chamador persiste
|
|
5
|
+
* o código devolvido, nunca os textos que serviram de entrada.
|
|
6
|
+
*/
|
|
7
|
+
function accountFailure(h) {
|
|
8
|
+
const partes = [h?.message, h?.reason, h?.stop_reason, h?.error?.message, h?.error?.code]
|
|
9
|
+
.filter((v) => typeof v === 'string').join('\n');
|
|
10
|
+
return /(?:you(?:'|’)ve hit your (?:weekly|session|individual spend|usage) limit|seu limite de uso foi atingido|usage_limit_(?:exceeded|reached)|insufficient_quota|out of credits|spend (?:cap|limit))/i.test(partes)
|
|
11
|
+
? 'runtime.quota-exhausted' : null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
module.exports = { accountFailure };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"formato": "ork.mods-autoridade/v1",
|
|
3
|
+
"regra": "Nenhum mod aprova gate, permissão, nota do MASTER, push ou tag pelo dono, nem fala como o dono (D5 do plano dos mods, com o nome que o dono deu a ela). A decisão autônoma registrada pelo núcleo não entra nesta lista: está em permitidos.",
|
|
4
|
+
"leitores": [
|
|
5
|
+
"core/scripts/checar-mods.cjs",
|
|
6
|
+
"adapters/claude-code/mods/ork-ponte/hooks/register.ts"
|
|
7
|
+
],
|
|
8
|
+
"ganchosProibidos": [
|
|
9
|
+
{ "id": "elicitation", "evento": "classic.Elicitation", "porque": "responderia o diálogo nativo do MCP no lugar do dono" },
|
|
10
|
+
{ "id": "elicitation-result", "evento": "classic.ElicitationResult", "porque": "trocaria a resposta que o dono deu no diálogo nativo" },
|
|
11
|
+
{ "id": "permission-request", "evento": "classic.PermissionRequest", "porque": "aprovaria permissão pelo dono" },
|
|
12
|
+
{ "id": "ask-user-question", "evento": "ui.render", "componente": "AskUserQuestion", "porque": "redesenharia a pergunta feita ao dono" }
|
|
13
|
+
],
|
|
14
|
+
"decisoesProibidas": [
|
|
15
|
+
{ "id": "tool-check-allow", "evento": "tool.check", "decisao": "allow", "porque": "aprovaria uma chamada de ferramenta pelo dono" }
|
|
16
|
+
],
|
|
17
|
+
"chamadasProibidas": [
|
|
18
|
+
{ "id": "prompt-submit", "chamada": "prompt.submit", "porque": "manda texto como se fosse o dono" },
|
|
19
|
+
{ "id": "session-append-usuario", "chamada": "session.append", "tipo": "user", "porque": "grava linha de usuário que o modelo lê como palavra do dono" }
|
|
20
|
+
],
|
|
21
|
+
"argvProibido": [
|
|
22
|
+
{ "id": "gate-answer", "sequencia": ["gate", "answer"], "porque": "responde gate pelo dono" },
|
|
23
|
+
{ "id": "sessions-answer", "sequencia": ["sessions", "answer"], "porque": "entrega resposta a uma sessão como se fosse do dono" },
|
|
24
|
+
{ "id": "pulse-responder", "sequencia": ["pulse", "responder"], "porque": "responde o resumo pelo dono" },
|
|
25
|
+
{ "id": "master-nota", "sequencia": ["master"], "opcao": "--score", "porque": "dá ou propõe a nota do MASTER" },
|
|
26
|
+
{ "id": "master-batch", "sequencia": ["master", "batch"], "porque": "aceita MASTER em lote pelo dono" },
|
|
27
|
+
{ "id": "master-digest-responder", "sequencia": ["master", "digest", "responder"], "porque": "responde o digest pelo dono" },
|
|
28
|
+
{ "id": "retry-run-por", "sequencia": ["retry", "run"], "opcao": "--por", "porque": "autoriza o retry quando o modo pausa" },
|
|
29
|
+
{ "id": "ship-autorizar-push", "sequencia": ["ship"], "opcao": "--autorizar-push", "porque": "autoriza push pelo dono" },
|
|
30
|
+
{ "id": "git-push", "programa": "git", "subcomando": "push", "porque": "publica sem a prova do núcleo" },
|
|
31
|
+
{ "id": "git-tag", "programa": "git", "subcomando": "tag", "porque": "tag é ato do dono; listar tags sai por outro comando de leitura" },
|
|
32
|
+
{ "id": "gh", "programa": "gh", "porque": "PR, merge e release ficam com o núcleo e o dono" }
|
|
33
|
+
],
|
|
34
|
+
"ambienteProibido": [
|
|
35
|
+
{ "id": "hitl-env", "prefixo": "ORK_HITL_", "porque": "credenciais e verificadores do ingresso humano" }
|
|
36
|
+
],
|
|
37
|
+
"caminhosProibidos": [
|
|
38
|
+
{ "id": "hermes-env", "trecho": ".hermes/.env", "porque": "segredos do canal do dono" }
|
|
39
|
+
],
|
|
40
|
+
"reservadosAPonte": [
|
|
41
|
+
{ "id": "processos", "evento": "process.*", "porque": "a guarda da ponte vigia os processos" },
|
|
42
|
+
{ "id": "ambiente", "evento": "env.*", "porque": "a guarda vigia o ambiente, e o papel da sessão sai dele" },
|
|
43
|
+
{ "id": "arquivos", "evento": "fs.*", "porque": "a guarda vigia leituras, e a lista de autoridade sai do disco" },
|
|
44
|
+
{ "id": "mcp", "evento": "mcp.*", "porque": "o retrato do núcleo sai do MCP" },
|
|
45
|
+
{ "id": "store", "evento": "store.*", "porque": "o registro do que foi mostrado ao dono fica no store da ponte" },
|
|
46
|
+
{ "id": "estado", "evento": "state.*", "porque": "a faixa, os caminhos vigiados e o cache ficam no estado da ponte" },
|
|
47
|
+
{ "id": "ferramentas", "evento": "tool.list", "porque": "o papel dono sai da lista de ferramentas" },
|
|
48
|
+
{ "id": "raiz", "evento": "session.root", "porque": "o papel e a raiz do estado saem da raiz da sessão" },
|
|
49
|
+
{ "id": "registro", "evento": "plugin.register", "porque": "só a ponte confere os mods que carregam" },
|
|
50
|
+
{ "id": "prompt", "evento": "prompt.submit", "porque": "só a ponte decide sobre texto enviado por mod" },
|
|
51
|
+
{ "id": "transcript", "evento": "session.append", "porque": "só a ponte decide sobre linha anexada por mod" }
|
|
52
|
+
],
|
|
53
|
+
"permitidos": [
|
|
54
|
+
{ "id": "decisao-autonoma", "sequencia": ["decisao", "registrar"], "porque": "decisão autônoma registrada pelo núcleo, com critério e evidência, que vai ao dono no lote seguinte com o custo de reverter (M4)" }
|
|
55
|
+
]
|
|
56
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ork-clima",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Clima de Cota do Orkastery no Claude Code: prevê quando a cota da conta acaba no ritmo atual, avisa na faixa antes de a fase morrer no meio e diz qual retomada não cabe. Só lê e avisa.",
|
|
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
|
+
}
|