@orkastery/cli 0.5.0 → 0.5.3
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/claude-code/README.md +11 -2
- package/adapters/claude-code/agents/ork-master.md +2 -0
- package/adapters/claude-code/commands/master.md +8 -0
- package/adapters/claude-code/commands/onboarding.md +3 -2
- package/adapters/claude-code/commands/ork.md +9 -0
- package/adapters/codex/skills/ork/SKILL.md +18 -3
- package/adapters/hermes/README.md +1 -0
- package/adapters/hermes/bin/ork-network-status.sh +10 -0
- package/adapters/hermes/hermes.plugin.json +1 -0
- package/adapters/hermes/hitl-ingress/__init__.py +2 -2
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +6 -5
- package/adapters/openclaw/README.md +35 -4
- package/adapters/openclaw/dist/hitl-ingress.js +2 -2
- package/adapters/openclaw/dist/index.js +47 -12
- package/adapters/openclaw/openclaw.plugin.json +5 -1
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +2 -2
- package/adapters/openclaw/src/index.ts +50 -12
- package/assets/orkmind_bridge.py +117 -9
- package/dist/adapters/claude-bg.js +59 -11
- package/dist/adapters/codex.js +4 -3
- package/dist/agents-md.js +1 -0
- package/dist/auditrun.js +6 -2
- package/dist/board.js +16 -14
- package/dist/branch-de-estado.js +66 -10
- package/dist/busca-semantica.js +52 -12
- package/dist/canarios-rm057.js +149 -0
- package/dist/canarios.js +2 -0
- package/dist/ci.js +8 -1
- package/dist/claim-lint.js +3 -1
- package/dist/claims.js +39 -1
- package/dist/company-brain-context.js +158 -22
- package/dist/docs.js +110 -3
- package/dist/doctor-pulse-cron.js +194 -0
- package/dist/doctor-rede.js +149 -0
- package/dist/doctor.js +294 -37
- package/dist/entrega-pr.js +27 -8
- package/dist/esgotamentos.js +181 -0
- package/dist/experiencia.js +12 -2
- package/dist/fabrica-estado.js +35 -9
- package/dist/fabrica-publicar.js +6 -0
- package/dist/fechamento.js +20 -66
- package/dist/fix.js +3 -3
- package/dist/forja.js +31 -7
- package/dist/gates.js +5 -1
- package/dist/hitl-contract.js +59 -4
- package/dist/hitl-curto.js +11 -6
- package/dist/hitl-gates.js +5 -0
- package/dist/hitl-lote.js +5 -2
- package/dist/hitl-resumo.js +33 -1
- package/dist/hitl-tempo-parado.js +201 -0
- package/dist/hitl-texto-livre.js +5 -5
- package/dist/horario.js +27 -0
- package/dist/hosts.js +59 -13
- package/dist/impedimento.js +205 -0
- package/dist/index.js +433 -88
- package/dist/indice-vetorial.js +87 -10
- package/dist/indice.js +3 -1
- package/dist/init.js +28 -5
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +267 -30
- package/dist/intelligence-graph-contexto.js +215 -0
- package/dist/intelligence-graph-contract.js +71 -12
- package/dist/intelligence-graph-extract-md.js +41 -23
- package/dist/intelligence-graph-extract-ts.js +181 -11
- package/dist/intelligence-graph-extract.js +186 -9
- package/dist/intelligence-graph-index.js +205 -24
- package/dist/intelligence-graph-parsers.js +6 -4
- package/dist/intelligence-graph-repo.js +10 -0
- package/dist/leases.js +680 -87
- package/dist/ledger-stats.js +15 -1
- package/dist/ledger.js +12 -0
- package/dist/licoes.js +6 -4
- package/dist/liveness.js +2 -1
- package/dist/maestro-runtime.js +7 -1
- package/dist/manifest.js +44 -1
- package/dist/master-nota.js +14 -5
- package/dist/master.js +129 -12
- package/dist/mcp-artifacts.js +36 -3
- package/dist/mcp-git.js +80 -15
- package/dist/mcp-grafo-worker.js +93 -0
- package/dist/mcp-grafo.js +279 -0
- package/dist/mcp-install.js +2 -1
- package/dist/mcp-server.js +23 -1
- package/dist/mcp-ship.js +2 -0
- package/dist/mcp-verify.js +3 -1
- package/dist/memoria.js +48 -6
- package/dist/network-roadmap.js +195 -20
- package/dist/ocupacao.js +17 -5
- package/dist/onboarding.js +9 -4
- package/dist/orkmind.js +90 -5
- package/dist/orquestracao.js +14 -11
- package/dist/parado-no-condutor.js +1089 -0
- package/dist/phase.js +68 -15
- package/dist/policies.js +79 -3
- package/dist/portfolio.js +4 -1
- package/dist/projeto-alvo.js +5 -1
- package/dist/prompts.js +36 -1
- package/dist/prova-ativacao.js +414 -0
- package/dist/pulse-delivery.js +60 -7
- package/dist/pulse.js +99 -3
- package/dist/ratelimit.js +20 -4
- package/dist/recall.js +3 -1
- package/dist/rede-adesao.js +399 -0
- package/dist/rede-forja.js +289 -0
- package/dist/rede-projetos.js +239 -0
- package/dist/rede-status.js +336 -0
- package/dist/rede.js +980 -0
- package/dist/retry.js +69 -2
- package/dist/roadmap-status.js +162 -7
- package/dist/runtime-context.js +5 -1
- package/dist/runtime-profiles.js +22 -1
- package/dist/saida-segura.js +58 -0
- package/dist/session-watcher-claude.js +113 -23
- package/dist/sessoes-contas.js +187 -0
- package/dist/sessoes-inventario.js +6 -12
- package/dist/sessoes.js +87 -3
- package/dist/ship.js +110 -20
- package/dist/thread.js +212 -14
- package/dist/util.js +71 -4
- package/dist/verify.js +2 -2
- package/dist/worktree.js +34 -8
- package/eval/casos/onboarding.json +1 -1
- package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
- package/package.json +7 -3
- package/references/definition-of-done.md +1 -1
- package/skills/README.md +1 -1
- package/skills/core/onboarding/SKILL.md +3 -2
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/master-metrics/SKILL.md +8 -3
- package/skills/phases/ship-release/SKILL.md +6 -3
|
@@ -50,6 +50,15 @@ exige Linux, Python 3/pexpect e OAuth de assinatura em `ANTHROPIC_TOKEN` no arqu
|
|
|
50
50
|
permanece fora da fixture. As sessões e os ledgers temporários são descartados;
|
|
51
51
|
guarde a saída JSON como recibo antes de declarar a prova concluída.
|
|
52
52
|
|
|
53
|
+
**Prova de ativação do Maestro (RM-032).** `node core/scripts/prova-ativacao.cjs claude-code`
|
|
54
|
+
instala o plugin e o `.mcp.json` desta cópia num projeto descartável e abre uma sessão nova
|
|
55
|
+
`claude -p "orkastery maestro"` com `--plugin-dir`, `--mcp-config --strict-mcp-config`,
|
|
56
|
+
`--setting-sources project` e `--no-session-persistence`. Usa o login nativo do CLI, sem copiar
|
|
57
|
+
credencial e sem gravar no registro global de plugins. Aprova só quando o modelo chama
|
|
58
|
+
`mcp__orkastery__ork_maestro` (o `ork maestro` pelo Bash é desvio) e o snapshot é do projeto
|
|
59
|
+
descartável; o recibo traz o sha256 dos arquivos globais antes e depois. Modelo padrão: `sonnet`
|
|
60
|
+
(`--modelo` troca). Detalhes no [contrato do snapshot](../../docs/referencia/contratos/maestro-i32.md).
|
|
61
|
+
|
|
53
62
|
## O que voce ganha
|
|
54
63
|
|
|
55
64
|
| Voce digita | Voce recebe |
|
|
@@ -165,8 +174,8 @@ tres e o `--dry-run` mostra o que ele vai fazer sobre cada um.
|
|
|
165
174
|
(`core/`, `phases/`, `reviewers/`, ...) que este catalogo usa. Por isso `plugin.json` declara os
|
|
166
175
|
caminhos um a um. O teste compara esses caminhos com o catálogo fonte e exige
|
|
167
176
|
`onboarding`, acrescentada por I15. Neste catálogo, `claude plugin details orkastery`
|
|
168
|
-
deve reportar
|
|
169
|
-
separadamente skills e comandos.
|
|
177
|
+
deve reportar 28 entradas: 20 skills e 8 comandos (a linha `Skills (28)`). O startup registra
|
|
178
|
+
separadamente skills e comandos. As provas anteriores, com 17 e 18 skills, são históricas.
|
|
170
179
|
Confira também os seis agentes e seis eventos de hooks, sem erros de carregamento.
|
|
171
180
|
|
|
172
181
|
2. **Duas copias do catalogo divergem, e a divergencia so aparece quando ja custou uma entrega.**
|
|
@@ -22,6 +22,8 @@ ork phase list <thread> # o que ja aconteceu, com evidencia
|
|
|
22
22
|
- Classe de falha vem do catalogo fixo (`ork master classes`).
|
|
23
23
|
- Justificativa vazia e recusada pelo comando, e a recusa nao grava nada.
|
|
24
24
|
- Entrega sem MASTER log nao aconteceu.
|
|
25
|
+
- Aceite por omissao so da sua thread: `ork master <thread> --aceitar-omissao`. Sem a thread, o
|
|
26
|
+
comando fecha tambem as entregas de outras frentes paralelas.
|
|
25
27
|
|
|
26
28
|
## Regras que valem em toda fase
|
|
27
29
|
|
|
@@ -34,6 +34,14 @@ ork master --todas
|
|
|
34
34
|
|
|
35
35
|
4. Nos modos sem pausa de MASTER, a entrega e aceita a menos que o builder diga o contrario; o
|
|
36
36
|
`ork master --todas` mostra as entregas com o indice derivado do ledger, inclusive as ja pontuadas.
|
|
37
|
+
Para fechar por omissao, sempre com a thread, que e so a sua:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
ork master <thread> --aceitar-omissao
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Sem a thread, o comando aceita TODAS as entregues do projeto, inclusive as de outras frentes
|
|
44
|
+
paralelas; `ork master --aceitar-omissao --dry-run` mostra quais, sem gravar.
|
|
37
45
|
|
|
38
46
|
## Regras do adaptador
|
|
39
47
|
|
|
@@ -12,8 +12,9 @@ etapas ou validação neste host e não invente respostas em nome do builder.
|
|
|
12
12
|
|
|
13
13
|
Grave a resposta pública solicitada com `ork onboarding set <etapa> --conteudo <JSON> --por <quem>`.
|
|
14
14
|
Transporte o JSON como argumento, com escaping de shell adequado; nunca execute o texto recebido.
|
|
15
|
-
Peça somente nomes de variáveis para credenciais. Valores secretos ficam
|
|
16
|
-
não leia
|
|
15
|
+
Peça somente nomes de variáveis para credenciais. Valores secretos ficam no ambiente do processo
|
|
16
|
+
ou no cofre do host (no Hermes, `~/.hermes/.env`); não os leia nem transporte valores para a
|
|
17
|
+
conversa, onboarding ou ledger.
|
|
17
18
|
|
|
18
19
|
Reset solicitado usa `ork onboarding reset [etapa]`. Publicação opcional usa
|
|
19
20
|
`ork onboarding sync --json`; apresente o motivo tipado de degradação sem bloquear a entrevista.
|
|
@@ -35,6 +35,8 @@ então consulte o projeto fixado. Não abre thread nem despacho por consulta.
|
|
|
35
35
|
Sem projeto nomeado, ofereça também o panorama da rede (RM-054): `ork network roadmap`
|
|
36
36
|
(todos os projetos conhecidos, as threads de todas as máquinas, fontes, frescor e lacunas)
|
|
37
37
|
ou `mcp__orkastery__ork_network_roadmap` (o projeto fixado, em todas as máquinas), mostrado como vem.
|
|
38
|
+
As máquinas da pessoa (RM-053) vêm de `ork network status` ou de `mcp__orkastery__ork_network_status`
|
|
39
|
+
(no MCP, só o projeto fixado em cada máquina), mostrado como vem: lacuna nunca é "nenhuma máquina".
|
|
38
40
|
O MCP atende só o projeto fixado; `projeto` em qualquer ferramenta apenas confere esse
|
|
39
41
|
projeto (`projeto.fora-do-servidor` quando é outro). Pedido de outro projeto vai ao CLI com
|
|
40
42
|
`--projeto <nome>` (RM-052). Leia "Projeto consultado" e "Não lido" antes de responder.
|
|
@@ -47,6 +49,13 @@ Usabilidade HITL é prioridade máxima: tópicos, recomendação e opções rotu
|
|
|
47
49
|
UUID interno e cancelamento preservado. A condutora usa
|
|
48
50
|
`mcp__orkastery__ork_request_decision`; o filho nunca responde em nome do dono.
|
|
49
51
|
|
|
52
|
+
HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo
|
|
53
|
+
"Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido
|
|
54
|
+
que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização.
|
|
55
|
+
Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a
|
|
56
|
+
fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o
|
|
57
|
+
comando exato.
|
|
58
|
+
|
|
50
59
|
| Pedido do dono | Acao do agente |
|
|
51
60
|
|---|---|
|
|
52
61
|
| Demanda nova | Resolva o modo pelo nucleo, confira o preflight e abra/despache a thread correspondente. |
|
|
@@ -6,14 +6,20 @@ license: MIT
|
|
|
6
6
|
|
|
7
7
|
# Orkastery no Codex
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Ao receber literalmente `orkastery maestro`, a primeira ação é a ferramenta `ork_maestro` do
|
|
10
|
+
servidor MCP `orkastery`, descoberta no namespace efetivamente exposto: ela consulta o projeto
|
|
11
|
+
fixado. Com a ferramenta exposta, não rode `ork maestro`, `ork doctor`, `ork onboarding` nem
|
|
12
|
+
`ork experiencia show` no shell antes nem no lugar dela: o CLI resolve o projeto pelo diretório da sessão, e é essa a
|
|
13
|
+
classe de erro que a frase evita (prova de ativação do Codex, RM-032).
|
|
14
|
+
|
|
15
|
+
Só depois da `ork_maestro` (ou, sem MCP, do `ork maestro --json`), consulte `ork experiencia show --json`
|
|
16
|
+
no projeto da sessão. Quando `experience` for true,
|
|
10
17
|
leia `../core/<skill>/SKILL.md`, usando o nome devolvido em `skill` pelo núcleo:
|
|
11
18
|
`orchestration-experience-pt-br` ou `orchestration-experience`. Idioma, fuso e profundidade
|
|
12
19
|
vêm da mesma consulta. Se false, não ative o pacote. O bloco próprio de AGENTS.md também
|
|
13
20
|
aponta para esse catálogo; instalação não altera permissões nativas.
|
|
14
21
|
|
|
15
|
-
|
|
16
|
-
efetivamente exposto e consulte o projeto fixado pelo MCP. A frase pede panorama,
|
|
22
|
+
Depois de `ork_maestro`, a frase `orkastery maestro` continua pedindo só panorama,
|
|
17
23
|
sem abrir trabalho. Sem projeto nomeado, ofereça também o panorama da rede
|
|
18
24
|
(`ork_network_roadmap`, ou `ork network roadmap` no CLI), com fontes, frescor e lacunas.
|
|
19
25
|
Siga a seleção de contexto e os limites do bootstrap comum.
|
|
@@ -26,6 +32,13 @@ com rótulos claros; UUID interno. Use `ork_request_decision` na condutora e pre
|
|
|
26
32
|
a resposta literal/cancelamento da elicitation. Não use pergunta genérica do agente
|
|
27
33
|
como aprovação de gate nem texto em toolargs como identidade humana.
|
|
28
34
|
|
|
35
|
+
HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo
|
|
36
|
+
"Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido
|
|
37
|
+
que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização.
|
|
38
|
+
Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a
|
|
39
|
+
fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o
|
|
40
|
+
comando exato.
|
|
41
|
+
|
|
29
42
|
Use a skill `orkastery-bootstrap` do mesmo catalogo instalado para conduzir o pedido.
|
|
30
43
|
O dono conversa sobre o objetivo; voce opera o nucleo `ork` e apresenta o resultado e o proximo
|
|
31
44
|
passo. Preserve o modo e as autorizacoes da thread. Se ja recebeu uma fase do Orkastery,
|
|
@@ -42,6 +55,8 @@ e `ork_request_decision(threadId, pedidoId)`. Use o namespace efetivamente expos
|
|
|
42
55
|
- Status do roadmap: use `ork_network_roadmap` (ou `ork network roadmap --projeto <nome>`) e mostre o
|
|
43
56
|
texto como vem, com as threads de todas as maquinas, as fontes e as lacunas; `ork_roadmap_status` e
|
|
44
57
|
so desta maquina. Nao escreva relatorio proprio de roadmap: lacuna nunca e roadmap vazio.
|
|
58
|
+
- Maquinas da pessoa (RM-053): use `ork_network_status` (ou `ork network status`) e mostre o texto como
|
|
59
|
+
vem, com a batida de cada maquina, a fonte e as lacunas; lacuna nunca e "nenhuma maquina".
|
|
45
60
|
- Status: apresente a evidencia da thread; `ork pulse --json` mostra quem precisa agir.
|
|
46
61
|
As pausas dos blocos do modo sao previstas: so diga "aguardando voce" com pendencia
|
|
47
62
|
humana atual comprovada no estado/ultimo resultado, identificando gate, pedido ou evento.
|
|
@@ -47,6 +47,7 @@ ork adapter install hermes --dry-run # lista o que seria escrito
|
|
|
47
47
|
| `bin/ork-maestro.sh` | `ork_maestro`: o panorama Maestro do projeto pedido (`ork maestro --json`) |
|
|
48
48
|
| `bin/ork-roadmap-status.sh` | `ork_roadmap_status`: o status report do roadmap so desta maquina (`ork roadmap status`) |
|
|
49
49
|
| `bin/ork-network-roadmap.sh` | `ork_network_roadmap`: o roadmap da rede (`ork network roadmap`), com as threads de todas as maquinas, fonte, hora e lacunas; a fonte do status do roadmap e o panorama da frase `orkastery maestro` sem projeto (RM-054) |
|
|
50
|
+
| `bin/ork-network-status.sh` | `ork_network_status`: as maquinas da pessoa na Orkastery Network (`ork network status`), com a batida, as forjas, os runtimes, os hosts, a fonte e as lacunas; sem projeto (RM-054, fatia 3) |
|
|
50
51
|
|
|
51
52
|
## Tickets `obj-*` aposentados
|
|
52
53
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# RM-054 (fatia 3): as maquinas da pessoa na Orkastery Network (RM-053), montadas pelo nucleo
|
|
3
|
+
# (`ork network status`): a casa, a batida de cada maquina, forjas, runtimes, hosts e projetos, a
|
|
4
|
+
# fonte e as lacunas. Somente leitura; o Hermes transporta o texto como vem. Argumentos continuam dados.
|
|
5
|
+
set -eu
|
|
6
|
+
export ORK_CANAL="${ORK_CANAL:-hermes}"
|
|
7
|
+
# RM-052 (D3): o cwd do gateway nao e projeto. Com ORK_PROJETO_EXPLICITO=1 o nucleo nao le o projeto
|
|
8
|
+
# do diretorio do gateway; a rede vem da casa, do registro e dos retratos. ORK_PROJETO_EXPLICITO=0 desliga.
|
|
9
|
+
export ORK_PROJETO_EXPLICITO="${ORK_PROJETO_EXPLICITO:-1}"
|
|
10
|
+
exec "${ORK_BIN:-{{ork_bin}}}" network status "$@"
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"ork_maestro": "./bin/ork-maestro.sh",
|
|
13
13
|
"ork_roadmap_status": "./bin/ork-roadmap-status.sh",
|
|
14
14
|
"ork_network_roadmap": "./bin/ork-network-roadmap.sh",
|
|
15
|
+
"ork_network_status": "./bin/ork-network-status.sh",
|
|
15
16
|
"ork-abrir-thread": "./bin/ork-abrir-thread.sh",
|
|
16
17
|
"ork_brain": "./bin/ork-brain.sh",
|
|
17
18
|
"ork_gate_answer": "./bin/ork-hitl-answer.py",
|
|
@@ -32,8 +32,8 @@ PULSE_CADENCIA = re.compile(r'^[ \t]*#OrkPulse(?:On(?:-(?:15|30|60)m)?|Off)[ \t]
|
|
|
32
32
|
# ("1. B, 2. aprovo") e interceptada sempre; `livre` ("sim", "aprovo", "a") so enquanto a janela
|
|
33
33
|
# de escuta do nucleo estiver aberta: fora dela, a palavra vai ao assistente, como sempre foi. A
|
|
34
34
|
# janela e dica de rota, nao prova: a mensagem ainda passa pela assinatura e pela regra do nucleo.
|
|
35
|
-
PULSE_LISTA = re.compile(r'^[ \t]*[0-9]{1,2}(?:[ \t]*[.):-])?[ \t]*(?:[a-
|
|
36
|
-
PULSE_LIVRE = re.compile(r'^[ \t]*(?:[1-
|
|
35
|
+
PULSE_LISTA = re.compile(r'^[ \t]*[0-9]{1,2}(?:[ \t]*[.):-])?[ \t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \t\r\n,;]*[0-9]{1,2}(?:[ \t]*[.):-])?[ \t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \t]*(?:[.!][ \t]*)?$', re.IGNORECASE)
|
|
36
|
+
PULSE_LIVRE = re.compile(r'^[ \t]*(?:[1-5]|(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \t]*(?:[.!]+[ \t]*)?$', re.IGNORECASE)
|
|
37
37
|
# RM-048 (item 8): a linha do teclado do digest ("ratificar <thread> <assinatura> <classe>") vai ao
|
|
38
38
|
# nucleo pelo mesmo endereco assinado; o agente nao escreve mais `--por` em nome do dono.
|
|
39
39
|
PULSE_RATIFICACAO = re.compile(r'^[ \t]*ratificar(?:-lote)?(?:[ \t]+[A-Za-z0-9._-]{1,80}){2,3}[ \t]*$', re.IGNORECASE)
|
|
@@ -8,7 +8,7 @@ license: MIT
|
|
|
8
8
|
|
|
9
9
|
# Orkastery no Hermes
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Mensagem literal `orkastery maestro`: a primeira ação é a `ork_maestro`; só depois dela consulte `ork experiencia show --json --projeto <nome>`. Se `experience` for true, leia `../<skill>/SKILL.md` conforme `skill`: `orchestration-experience-pt-br` ou `orchestration-experience`, ambas instaladas. Use idioma, fuso e profundidade efetivos; se false, não ative o pacote. Preferências não alteram permissões nem HMAC.
|
|
12
12
|
|
|
13
13
|
Mensagem literal `orkastery maestro`: use `ork_maestro` (wrapper de `ork maestro --json`) para o panorama do projeto pedido; o nome dito pelo dono ("do orkastery") vai como `--projeto <nome>` (RM-052). Sem projeto nomeado, ofereça o panorama da rede: `ork_network_roadmap` (wrapper de `ork network roadmap`), com cada projeto conhecido, as threads de todas as máquinas, fontes, frescor e lacunas, transportado como vem (RM-054).
|
|
14
14
|
Não abra thread por essa consulta. O gateway não tem diretório de projeto: `projeto.escolha` traz os candidatos; apresente-os e pergunte, nunca escolha pelo cwd.
|
|
@@ -21,9 +21,10 @@ interno. Telegram é opcional. Só anuncie ingresso humano disponível quando o
|
|
|
21
21
|
do host estiver homologado e configurado; texto de tool não é identidade humana.
|
|
22
22
|
Sem ingresso no canal escolhido, conserve o pedido pendente e explique o motivo.
|
|
23
23
|
Não altere runtime, provider, perfil filho ou sandbox para contornar falha.
|
|
24
|
+
HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo "Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização. Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o comando exato.
|
|
24
25
|
Horário para o dono sai no fuso dele (`owner.timezone`): use `prazoLocal` e os fatos
|
|
25
26
|
`*Local` do JSON (ex.: `19/09 15:16 (horário de Brasília)`), nunca o ISO em UTC.
|
|
26
|
-
Status do roadmap: `ork_network_roadmap` (`ork network roadmap --projeto <nome>`, ou `--projeto github:dono/repo` sem clone), com as threads de todas as máquinas, reservas, fonte e hora de cada parte e lacunas, texto como vem; `ork_roadmap_status` (`ork roadmap status --projeto <nome>`) é só desta máquina. Nunca relatório próprio nem dedução pelo board ou panorama: zero threads nunca é roadmap vazio, e lacuna ou "Não consultado" nunca vira "roadmap vazio" nem "nenhuma máquina publicou".
|
|
27
|
+
Status do roadmap: `ork_network_roadmap` (`ork network roadmap --projeto <nome>`, ou `--projeto github:dono/repo` sem clone), com as threads de todas as máquinas, reservas, fonte e hora de cada parte e lacunas, texto como vem; `ork_roadmap_status` (`ork roadmap status --projeto <nome>`) é só desta máquina. Nunca relatório próprio nem dedução pelo board ou panorama: zero threads nunca é roadmap vazio, e lacuna ou "Não consultado" nunca vira "roadmap vazio" nem "nenhuma máquina publicou". As máquinas da pessoa (RM-053): `ork_network_status` (`ork network status`, sem projeto), texto como vem; lacuna nunca vira "nenhuma máquina".
|
|
27
28
|
|
|
28
29
|
## O que esta skill e
|
|
29
30
|
|
|
@@ -121,7 +122,7 @@ python3 adapters/hermes/bin/ork-hitl-answer.py ork_session_answer <thread> <pedi
|
|
|
121
122
|
|
|
122
123
|
O nucleo monta e o Hermes so transporta: (1) UM resumo recorrente com as contagens e
|
|
123
124
|
`Posso te mandar as perguntas agora?`; (2) o dono responde com o codigo e a letra (`K7QX a`);
|
|
124
|
-
(3) com o sim, ate cinco objetivas a–
|
|
125
|
+
(3) com o sim, ate cinco objetivas, cada uma com de 3 a 5 alternativas a–e e uma "Recomendação", respondidas numa linha (`1a 2c 3b`).
|
|
125
126
|
Decisao obvia chega tomada e informada no resumo (`ork decisao registrar`). Cadencia (I-50): so a tag na mensagem (`#OrkPulseOff` 8h, `#OrkPulseOn` 2h, `#OrkPulseOn-15m`, `-30m`, `-60m`); pedida no meio da frase, devolva a tag exata para o dono mandar sozinha.
|
|
126
127
|
|
|
127
128
|
O plugin `orkastery-hitl` registra essas formas, a resposta numerada em prosa curta (`1. B, 2. A`,
|
|
@@ -134,8 +135,8 @@ Quando o bloco nao pausa (`#Maestro`, `#Auto`, `#Fast`), o `ork` registra a deci
|
|
|
134
135
|
|
|
135
136
|
## Passo 5: a entrega e o MASTER
|
|
136
137
|
|
|
137
|
-
O MASTER fecha com POSTMORTEM tipado e indice derivado do ledger; `ork master --aceitar-omissao` aceita
|
|
138
|
-
|
|
138
|
+
O MASTER fecha com POSTMORTEM tipado e indice derivado do ledger; `ork master <thread> --aceitar-omissao` aceita a
|
|
139
|
+
entrega da sua thread com registro (sem a thread, aceita tambem as de outras frentes). Nota do dono: `ork master pedir <thread>` e mande a linha; ele responde `<codigo> 4 porque`
|
|
139
140
|
e o ingresso prova a origem. Nunca `--por` em nome dele: daqui da `master.prova-de-canal` (RM-048).
|
|
140
141
|
|
|
141
142
|
Memoria "degradada" tem dois portoes: a variavel da DSN no ambiente do processo
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
O OpenClaw recebe o Orkastery como uma **extensao** no formato 2026.7.1: um pacote com
|
|
4
4
|
`package.json` (`openclaw.extensions: ["./dist/index.js"]`), um entry JS que registra as
|
|
5
|
-
**
|
|
5
|
+
**28 tools `ork_*`** via `defineToolPlugin` do SDK do proprio OpenClaw, e o manifesto
|
|
6
6
|
`openclaw.plugin.json` gerado (`id`, `activation`, `contracts.tools`). Cada tool e uma
|
|
7
7
|
chamada de CLI do `ork`, sem regra de negocio no host.
|
|
8
8
|
|
|
@@ -41,6 +41,9 @@ openclaw plugins install ~/.openclaw/extensions/orkastery # registra explicita
|
|
|
41
41
|
# ou aponte plugins.load.paths para o diretorio instalado na config do OpenClaw
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
O instalador grava o `ork` que roda o install (o caminho real do CLI), nao o primeiro `ork` do
|
|
45
|
+
PATH; com outro `ork` no PATH, a saida avisa com as duas versoes. `--ork <caminho>` escolhe outro.
|
|
46
|
+
|
|
44
47
|
Se a copia nao passou pelo instalador (placeholder nao renderizado), o entry cai no
|
|
45
48
|
fallback: usa `ORK_BIN` do ambiente ou o `ork` do PATH.
|
|
46
49
|
|
|
@@ -66,11 +69,12 @@ fallback: usa `ORK_BIN` do ambiente ou o `ork` do PATH.
|
|
|
66
69
|
| `ork_board` | As threads DESTE projeto e o escalonador; nao le o roadmap (zero threads nao e roadmap vazio) |
|
|
67
70
|
| `ork_roadmap_status` | Status report do roadmap so desta maquina (`ork roadmap status`), transportado como vem |
|
|
68
71
|
| `ork_network_roadmap` | Roadmap da rede (`ork network roadmap`): o status report com as threads de todas as maquinas, reservas, fonte e hora de cada parte e lacunas; a fonte do status do roadmap |
|
|
72
|
+
| `ork_network_status` | As maquinas da pessoa na Orkastery Network (`ork network status`): a batida de cada uma, forjas, runtimes, hosts e projetos, a fonte e as lacunas; sem `projeto` (RM-054, fatia 3) |
|
|
69
73
|
| `ork_master_batch` | Todas as entregas, com o indice do ledger (`ork master --todas`; a fila de score saiu na I-43) |
|
|
70
74
|
|
|
71
75
|
### O projeto de cada chamada (RM-052)
|
|
72
76
|
|
|
73
|
-
Toda tool aceita `projeto`, o **nome** de um projeto registrado nesta maquina (`ork projetos`),
|
|
77
|
+
Toda tool de projeto aceita `projeto`, o **nome** de um projeto registrado nesta maquina (`ork projetos`),
|
|
74
78
|
nunca um caminho. Ele vai ao `ork` como `--projeto <nome>`. O adaptador declara
|
|
75
79
|
`ORK_PROJETO_EXPLICITO=1`: o diretorio do gateway nao escolhe projeto. Sem `projeto` e com mais de
|
|
76
80
|
um projeto conhecido, a resposta e a escolha tipada `projeto.escolha`, com os candidatos; com um
|
|
@@ -89,14 +93,32 @@ nucleo so aceita a forja em `github.com`, `gitlab.com` ou no host de um projeto
|
|
|
89
93
|
`projeto`, vem o panorama de todos os projetos do registro, e e o que a frase `orkastery maestro`
|
|
90
94
|
sem projeto oferece. O projeto do diretorio do gateway so entra se estiver no registro.
|
|
91
95
|
|
|
92
|
-
|
|
93
|
-
(
|
|
96
|
+
Na fatia 3, o panorama le tambem a rede por pessoa (RM-053): a casa e as maquinas com a batida de
|
|
97
|
+
cada uma, o projeto que uma maquina da rede declara (que passa a ser pedido pelo nome mesmo sem clone
|
|
98
|
+
nem registro nesta maquina) e a maquina da rede que nao publicou na fabrica do projeto, com as
|
|
99
|
+
threads dela ditas como nao lidas. `ork_network_status` (sem `projeto`) devolve a rede inteira, como
|
|
100
|
+
`ork network status`. Com o `gh` fora do PATH do gateway (em `~/.local/bin`, por exemplo), o `ork`
|
|
101
|
+
o acha nas pastas de usuario, como a rede.
|
|
102
|
+
|
|
103
|
+
Ela e `ork_network_status` (fatia 3) sao as unicas tools do catalogo declaradas nos perfis `coding` e
|
|
104
|
+
`messaging` do OpenClaw (`toolMetadata` no manifesto): com o perfil `coding`, o padrao do
|
|
94
105
|
onboarding, as tools de plugin so chegam ao modelo quando o manifesto as declara no perfil ou o
|
|
95
106
|
operador as libera. Sem isso o modelo nao ve tool `ork_*` nenhuma e vai ao `ork` pelo shell, como
|
|
96
107
|
no incidente de 29/09. As outras tools continuam sob escolha do operador:
|
|
97
108
|
`tools.alsoAllow: ["orkastery"]` no `openclaw.json` libera todas; allowlist e deny do operador
|
|
98
109
|
sempre valem.
|
|
99
110
|
|
|
111
|
+
## Prova de ativação do Maestro (RM-032)
|
|
112
|
+
|
|
113
|
+
`node core/scripts/prova-ativacao.cjs openclaw` instala esta extensão por
|
|
114
|
+
`ork adapter install openclaw --dir <estado temporário>`, a raiz global de uma cópia descartável
|
|
115
|
+
(`OPENCLAW_STATE_DIR` e `OPENCLAW_CONFIG_PATH` temporários, segredo do provedor só por SecretRef,
|
|
116
|
+
nada em `~/.openclaw`), e roda `openclaw agent --local` com `orkastery maestro` num workspace sem
|
|
117
|
+
manifesto, o cenário do incidente de 29/09. Aprova quando o modelo chama `ork_network_roadmap`
|
|
118
|
+
(ou `ork_maestro` com projeto) e o resultado é o do projeto descartável. A prova não roda
|
|
119
|
+
`openclaw plugins install --force` nem mexe em `plugins.allow`: o aviso de procedência vai ao
|
|
120
|
+
recibo, e a revisão fica com o dono.
|
|
121
|
+
|
|
100
122
|
## A #TAG de conducao
|
|
101
123
|
|
|
102
124
|
O manifesto novo do OpenClaw nao tem campo proprio para isso, entao a regra vive aqui e
|
|
@@ -189,6 +211,15 @@ recomendação e opções rotuladas, sem UUID exposto. Telegram é opcional; ing
|
|
|
189
211
|
nativo adicional só fica disponível após prova do callback e configuração do host.
|
|
190
212
|
Instalação fixture/SDK simulado não comprova ativação em uma sessão real.
|
|
191
213
|
|
|
214
|
+
HITL de condução é seleção (RM-057, nas descrições de `ork_modo_do_pedido`,
|
|
215
|
+
`ork_maestro`, `ork_phase_run`, `ork_network_roadmap` e `ork_network_status`; as duas de rede são as
|
|
216
|
+
únicas que o perfil `coding` expõe, e com elas a regra chega ao modelo sem `tools.alsoAllow`): de 3 a 5 alternativas, exatamente uma com o selo
|
|
217
|
+
"Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido
|
|
218
|
+
que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização.
|
|
219
|
+
Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a
|
|
220
|
+
fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o
|
|
221
|
+
comando exato.
|
|
222
|
+
|
|
192
223
|
Na callback autenticada, `/ork offer <thread> <pedido>` consulta a pergunta e a
|
|
193
224
|
oferta nativa sem responder ao pedido. O gateway assina uma prova efêmera da
|
|
194
225
|
mensagem e chama `gate context --native-offer-stdin`; só uma prova válida para
|
|
@@ -23,8 +23,8 @@ const PULSE_ALVO = 'pulse', PULSE_ENDERECO = 'resposta';
|
|
|
23
23
|
* listening window is open: outside it, the word goes to the assistant, as it always did. The
|
|
24
24
|
* window is a routing hint, not proof: the message still goes through the signature and the core rule.
|
|
25
25
|
*/
|
|
26
|
-
const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-
|
|
27
|
-
const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-
|
|
26
|
+
const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \\t\\r\\n,;]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \\t]*(?:[.!][ \\t]*)?$", 'i');
|
|
27
|
+
const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-5]|(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \\t]*(?:[.!]+[ \\t]*)?$", 'i');
|
|
28
28
|
/** RM-048 (item 8): the digest keyboard line goes to the core at the same signed address. */
|
|
29
29
|
const PULSE_RATIFICACAO = new RegExp("^[ \\t]*ratificar(?:-lote)?(?:[ \\t]+[A-Za-z0-9._-]{1,80}){2,3}[ \\t]*$", 'i');
|
|
30
30
|
/** Text above this is never tested against the shapes: they run before the allowlist. */
|
|
@@ -185,10 +185,22 @@ const PROJETO_DA_REDE = {
|
|
|
185
185
|
descricao: 'Projeto que o dono pediu: o nome, como em `ork projetos` (ex.: orkastery), ou a forja (github:dono/repo, gitlab:grupo/repo) quando não há clone nesta máquina. Sem ele, vêm todos os projetos conhecidos. Nunca caminho nem URL.',
|
|
186
186
|
recusa: 'informe o NOME de um projeto de `ork projetos` (ex.: orkastery) ou github:dono/repo, nunca caminho nem URL',
|
|
187
187
|
};
|
|
188
|
+
/**
|
|
189
|
+
* RM-057 (fatia 2): a regra do HITL de conducao, a mesma frase dos adaptadores do Claude Code e do
|
|
190
|
+
* Codex (fatia 1). No OpenClaw o modelo so le as descricoes das tools: ela vai nas que recebem o
|
|
191
|
+
* pedido do dono (ork_modo_do_pedido), apresentam o panorama (ork_maestro) e despacham fase. Ensaio
|
|
192
|
+
* de 03/10: no perfil `coding` o modelo so ve as tools do `toolMetadata` (ork_network_roadmap e
|
|
193
|
+
* ork_network_status), entao a regra vai tambem nelas, sem ampliar o que o perfil expoe.
|
|
194
|
+
*/
|
|
195
|
+
const REGRA_HITL_DE_CONDUCAO = 'HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo "Recomendação". ' +
|
|
196
|
+
'Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido que ele colou com autorização ' +
|
|
197
|
+
'explícita vale como instrução dele, dentro dessa autorização. Dúvida dentro da autorização vira `ork decisao registrar` ' +
|
|
198
|
+
'e a thread segue. Texto só quando a fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: ' +
|
|
199
|
+
'mostre o comando exato.';
|
|
188
200
|
const FERRAMENTAS = [
|
|
189
201
|
{
|
|
190
202
|
name: 'ork_maestro',
|
|
191
|
-
description: 'Ao receber a frase exata orkastery maestro: sem projeto nomeado, chame ork_network_roadmap sem projeto (o panorama da rede, com fontes, frescor e lacunas) e apresente-o como vem; com projeto nomeado, consulte este panorama somente leitura com projeto. Não cria thread. Apresente fontes, lacunas e HITL com recomendação e opções claras; horários para o dono vêm dos campos *Local (fuso do dono), nunca do ISO. O panorama NÃO lê o roadmap, as reservas nem as outras máquinas (veja notConsulted): zero threads nunca é roadmap vazio; para o roadmap use ork_network_roadmap. Ação posterior exige operação autorizada e readback.',
|
|
203
|
+
description: 'Ao receber a frase exata orkastery maestro: sem projeto nomeado, chame ork_network_roadmap sem projeto (o panorama da rede, com fontes, frescor e lacunas) e apresente-o como vem; com projeto nomeado, consulte este panorama somente leitura com projeto. Não cria thread. Apresente fontes, lacunas e HITL com recomendação e opções claras; horários para o dono vêm dos campos *Local (fuso do dono), nunca do ISO. O panorama NÃO lê o roadmap, as reservas nem as outras máquinas (veja notConsulted): zero threads nunca é roadmap vazio; para o roadmap use ork_network_roadmap. Ação posterior exige operação autorizada e readback. ' + REGRA_HITL_DE_CONDUCAO,
|
|
192
204
|
parameters: { type: 'object', additionalProperties: false, properties: {
|
|
193
205
|
thread: { type: 'string' }, section: { type: 'string', enum: ['portfolio', 'demands', 'threads', 'sessions', 'blockers', 'leases', 'retries', 'hitl', 'ship', 'master', 'nextActions'] },
|
|
194
206
|
offset: { type: 'integer', minimum: 0, maximum: 100000 },
|
|
@@ -205,7 +217,7 @@ const FERRAMENTAS = [
|
|
|
205
217
|
},
|
|
206
218
|
{
|
|
207
219
|
name: 'ork_onboarding',
|
|
208
|
-
description: 'Consulta a pauta do núcleo e registra respostas públicas. Credenciais somente como nomes de variáveis; valores ficam
|
|
220
|
+
description: 'Consulta a pauta do núcleo e registra respostas públicas. Credenciais somente como nomes de variáveis; valores ficam no ambiente do processo ou no cofre do host (no Hermes, ~/.hermes/.env). Sync publica opcionalmente e relata degradação.',
|
|
209
221
|
parameters: {
|
|
210
222
|
type: 'object', additionalProperties: false, required: ['acao'],
|
|
211
223
|
properties: {
|
|
@@ -228,7 +240,7 @@ const FERRAMENTAS = [
|
|
|
228
240
|
},
|
|
229
241
|
{
|
|
230
242
|
name: 'ork_modo_do_pedido',
|
|
231
|
-
description: 'Le a #TAG de conducao do pedido do builder (#Classic, #Maestro, #Auto, #Fast) e devolve o modo. #TAG aposentada (#Look, #Ork) recebe recusa tipada modo.aposentado, com saida != 0, em vez de virar o default em silencio. Sem tag, devolve o conduction.default_mode do manifesto. Use SEMPRE este tool em vez de reconhecer a tag no host.',
|
|
243
|
+
description: 'Le a #TAG de conducao do pedido do builder (#Classic, #Maestro, #Auto, #Fast) e devolve o modo. #TAG aposentada (#Look, #Ork) recebe recusa tipada modo.aposentado, com saida != 0, em vez de virar o default em silencio. Sem tag, devolve o conduction.default_mode do manifesto. Use SEMPRE este tool em vez de reconhecer a tag no host. ' + REGRA_HITL_DE_CONDUCAO,
|
|
232
244
|
parameters: schema({
|
|
233
245
|
pedido: { type: 'string', description: 'O texto inteiro do pedido do builder' },
|
|
234
246
|
}),
|
|
@@ -262,12 +274,18 @@ const FERRAMENTAS = [
|
|
|
262
274
|
},
|
|
263
275
|
{
|
|
264
276
|
name: 'ork_phase_run',
|
|
265
|
-
description: 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger.'
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
277
|
+
description: 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger. ' +
|
|
278
|
+
REGRA_HITL_DE_CONDUCAO,
|
|
279
|
+
parameters: {
|
|
280
|
+
type: 'object', additionalProperties: false, required: ['thread', 'fase', 'prompt'],
|
|
281
|
+
properties: {
|
|
282
|
+
thread: { type: 'string' },
|
|
283
|
+
fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
|
|
284
|
+
prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
|
|
285
|
+
// RM-056: a conta do despacho; o nucleo recusa perfil inexistente, de outro runtime, esgotado ou sem login.
|
|
286
|
+
perfil: { type: 'string', description: 'id do perfil de conta (ork accounts list); omita para o rodizio do nucleo' },
|
|
287
|
+
},
|
|
288
|
+
},
|
|
271
289
|
argv: (p) => [
|
|
272
290
|
'phase',
|
|
273
291
|
'run',
|
|
@@ -275,6 +293,7 @@ const FERRAMENTAS = [
|
|
|
275
293
|
texto(p, 'fase'),
|
|
276
294
|
'--prompt',
|
|
277
295
|
texto(p, 'prompt'),
|
|
296
|
+
...(p.perfil === undefined ? [] : ['--perfil', texto(p, 'perfil')]),
|
|
278
297
|
],
|
|
279
298
|
},
|
|
280
299
|
{
|
|
@@ -428,12 +447,20 @@ const FERRAMENTAS = [
|
|
|
428
447
|
},
|
|
429
448
|
{
|
|
430
449
|
name: 'ork_network_roadmap',
|
|
431
|
-
description: 'Roadmap da rede, somente leitura: para cada projeto, o status report do roadmap (RM-048) com as threads de TODAS as máquinas, as reservas, as threads por máquina com a idade da batida, a fonte e a hora de cada parte e as lacunas. É a fonte para qualquer pergunta sobre o roadmap ou o status report: transporte o texto como vem, sem reescrever nem resumir. Passe projeto com o nome que o dono pediu (ex.: orkastery) ou github:dono/repo; sem projeto, vêm todos os projetos conhecidos, e esse é o panorama da frase orkastery maestro sem projeto. Lacuna, "não lido" e "Não consultado" são fontes que ficaram sem leitura: nunca conclua "roadmap vazio" nem "nenhuma máquina publicou" a partir delas.',
|
|
450
|
+
description: 'Roadmap da rede, somente leitura: para cada projeto, o status report do roadmap (RM-048) com as threads de TODAS as máquinas, as reservas, as threads por máquina com a idade da batida, a fonte e a hora de cada parte e as lacunas. É a fonte para qualquer pergunta sobre o roadmap ou o status report: transporte o texto como vem, sem reescrever nem resumir. Passe projeto com o nome que o dono pediu (ex.: orkastery) ou github:dono/repo; sem projeto, vêm todos os projetos conhecidos, e esse é o panorama da frase orkastery maestro sem projeto. Lacuna, "não lido" e "Não consultado" são fontes que ficaram sem leitura: nunca conclua "roadmap vazio" nem "nenhuma máquina publicou" a partir delas. ' + REGRA_HITL_DE_CONDUCAO,
|
|
432
451
|
parameters: schema({}),
|
|
433
452
|
projeto: PROJETO_DA_REDE,
|
|
434
453
|
// RM-054 (fatia 2): uma chamada de CLI; o `--projeto` vai no inicio e o nucleo o devolve ao `network`.
|
|
435
454
|
argv: () => ['network', 'roadmap'],
|
|
436
455
|
},
|
|
456
|
+
{
|
|
457
|
+
name: 'ork_network_status',
|
|
458
|
+
description: 'Status da Orkastery Network, somente leitura: as máquinas da pessoa (a casa privada na forja), com a batida de cada uma, a forja e o login, os runtimes e hosts com versão e os projetos que cada uma declara, mais a fonte e as lacunas. É a fonte para "quais máquinas eu tenho" e "qual máquina está parada": transporte o texto como vem. Lacuna e "Não consultado" são o que não foi lido: nunca conclua "nenhuma máquina" nem "rede vazia" a partir delas. Não lê roadmap nem threads: para isso, ork_network_roadmap. ' + REGRA_HITL_DE_CONDUCAO,
|
|
459
|
+
parameters: schema({}),
|
|
460
|
+
semProjeto: true,
|
|
461
|
+
// RM-054 (fatia 3): uma chamada de CLI; a rede e da pessoa e nao recebe `--projeto`.
|
|
462
|
+
argv: () => ['network', 'status'],
|
|
463
|
+
},
|
|
437
464
|
{
|
|
438
465
|
name: 'ork_master_batch',
|
|
439
466
|
description: 'Todas as entregas em JSON, com o indice derivado do ledger, as ja pontuadas e as aceitas por omissao. Roda ork master --todas; o nome e da antiga fila de score (ork master --batch), aposentada na I-43.',
|
|
@@ -443,6 +470,8 @@ const FERRAMENTAS = [
|
|
|
443
470
|
];
|
|
444
471
|
/** RM-052: toda tool aceita `projeto` opcional, sem mudar o que ela ja exigia. */
|
|
445
472
|
function comProjeto(f) {
|
|
473
|
+
if (f.semProjeto)
|
|
474
|
+
return f.parameters;
|
|
446
475
|
const propriedades = (f.parameters.properties ?? {});
|
|
447
476
|
const p = f.projeto;
|
|
448
477
|
const projeto = p ? { type: 'string', pattern: p.padrao.source, description: p.descricao } : PARAMETRO_PROJETO;
|
|
@@ -451,6 +480,12 @@ function comProjeto(f) {
|
|
|
451
480
|
/** `--projeto <nome>` vai no inicio do argv; o resto dos parametros segue para a tool como antes. */
|
|
452
481
|
function argvComProjeto(f, params) {
|
|
453
482
|
const { projeto, ...resto } = params;
|
|
483
|
+
if (f.semProjeto) {
|
|
484
|
+
// A tool sem `projeto` recusa o parametro em vez de ignora-lo: o modelo saberia que a rede veio filtrada.
|
|
485
|
+
if (projeto !== undefined)
|
|
486
|
+
throw new Error('projeto.invalido');
|
|
487
|
+
return { argv: f.argv(resto), resto };
|
|
488
|
+
}
|
|
454
489
|
if (projeto !== undefined && (typeof projeto !== 'string' || !(f.projeto ?? PROJETO_DA_RM052).padrao.test(projeto))) {
|
|
455
490
|
throw new Error('projeto.invalido');
|
|
456
491
|
}
|
|
@@ -459,7 +494,7 @@ function argvComProjeto(f, params) {
|
|
|
459
494
|
const plugin = defineToolPlugin({
|
|
460
495
|
id: 'orkastery',
|
|
461
496
|
name: 'Orkastery',
|
|
462
|
-
description: 'Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI. Toda tool aceita projeto (nome do projeto pedido); o cwd do gateway nunca escolhe o projeto. O status do roadmap vem de ork_network_roadmap.',
|
|
497
|
+
description: 'Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI. Toda tool de projeto aceita projeto (nome do projeto pedido); o cwd do gateway nunca escolhe o projeto. O status do roadmap vem de ork_network_roadmap; as maquinas da pessoa, de ork_network_status (sem projeto).',
|
|
463
498
|
tools: (tool) => FERRAMENTAS.map((f) => tool({
|
|
464
499
|
name: f.name,
|
|
465
500
|
description: f.description,
|
|
@@ -471,7 +506,7 @@ const plugin = defineToolPlugin({
|
|
|
471
506
|
}
|
|
472
507
|
catch (e) {
|
|
473
508
|
if (e.message === 'projeto.invalido') {
|
|
474
|
-
return `[ork recusou] projeto.invalido: ${(f.projeto ?? PROJETO_DA_RM052).recusa}`;
|
|
509
|
+
return `[ork recusou] projeto.invalido: ${f.semProjeto ? 'esta tool é da rede da pessoa e não recebe projeto; chame sem projeto' : (f.projeto ?? PROJETO_DA_RM052).recusa}`;
|
|
475
510
|
}
|
|
476
511
|
return '[ork recusou] resposta humana não confirmada; confira origem e correlação do pedido';
|
|
477
512
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "orkastery",
|
|
3
3
|
"name": "Orkastery",
|
|
4
4
|
"description": "Conducao de looping threads em 6 fases pelo nucleo `ork`, exposta ao OpenClaw como tools `ork_*`. Zero regra de negocio no host: cada tool e uma chamada de CLI.",
|
|
5
|
-
"version": "0.5.
|
|
5
|
+
"version": "0.5.3",
|
|
6
6
|
"configSchema": {
|
|
7
7
|
"type": "object",
|
|
8
8
|
"properties": {},
|
|
@@ -39,12 +39,16 @@
|
|
|
39
39
|
"ork_board",
|
|
40
40
|
"ork_roadmap_status",
|
|
41
41
|
"ork_network_roadmap",
|
|
42
|
+
"ork_network_status",
|
|
42
43
|
"ork_master_batch"
|
|
43
44
|
]
|
|
44
45
|
},
|
|
45
46
|
"toolMetadata": {
|
|
46
47
|
"ork_network_roadmap": {
|
|
47
48
|
"profiles": ["coding", "messaging"]
|
|
49
|
+
},
|
|
50
|
+
"ork_network_status": {
|
|
51
|
+
"profiles": ["coding", "messaging"]
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orkastery/openclaw-plugin",
|
|
3
|
-
"version": "0.5.
|
|
4
|
-
"description": "Plugin Orkastery para OpenClaw:
|
|
3
|
+
"version": "0.5.3",
|
|
4
|
+
"description": "Plugin Orkastery para OpenClaw: 28 tools ork_* que traduzem intencao em chamada de CLI do nucleo `ork`. Zero regra de negocio no host.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": true,
|
|
7
7
|
"license": "MIT",
|
|
@@ -32,8 +32,8 @@ const PULSE_ALVO = 'pulse', PULSE_ENDERECO = 'resposta';
|
|
|
32
32
|
* listening window is open: outside it, the word goes to the assistant, as it always did. The
|
|
33
33
|
* window is a routing hint, not proof: the message still goes through the signature and the core rule.
|
|
34
34
|
*/
|
|
35
|
-
const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-
|
|
36
|
-
const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-
|
|
35
|
+
const PULSE_LISTA = new RegExp("^[ \\t]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?)(?:[ \\t\\r\\n,;]*[0-9]{1,2}(?:[ \\t]*[.):-])?[ \\t]*(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))*[ \\t]*(?:[.!][ \\t]*)?$", 'i');
|
|
36
|
+
const PULSE_LIVRE = new RegExp("^[ \\t]*(?:[1-5]|(?:[a-e]|pode seguir|pode ir|pode|sim|s|ok|aprovo|aprovado|aprovada|aprovar|aprova|segue|siga|seguir|manda|confirmo|confirmado|de acordo|agora n[aã]o|n[aã]o|n|recuso|recusado|recusar|reprovo|reprovado|revisar|revis[aã]o|refazer|volta|voltar|esperar|espera|aguardar|aguarda|aguarde|depois|mais tarde|detalhes?|evid[eê]ncias?))[ \\t]*(?:[.!]+[ \\t]*)?$", 'i');
|
|
37
37
|
/** RM-048 (item 8): the digest keyboard line goes to the core at the same signed address. */
|
|
38
38
|
const PULSE_RATIFICACAO = new RegExp("^[ \\t]*ratificar(?:-lote)?(?:[ \\t]+[A-Za-z0-9._-]{1,80}){2,3}[ \\t]*$", 'i');
|
|
39
39
|
/** Text above this is never tested against the shapes: they run before the allowlist. */
|