@orkastery/cli 0.5.1 → 0.5.6

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.
Files changed (260) hide show
  1. package/adapters/claude-code/README.md +158 -0
  2. package/adapters/claude-code/agents/ork-master.md +2 -0
  3. package/adapters/claude-code/commands/master.md +8 -0
  4. package/adapters/claude-code/commands/ork.md +9 -0
  5. package/adapters/claude-code/mods/autoridade.json +56 -0
  6. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  7. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  8. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  9. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  10. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  11. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  12. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  13. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  14. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  15. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  16. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  17. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  18. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  19. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  20. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  21. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  22. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  23. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  24. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  25. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  27. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  28. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  29. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  30. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  31. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  32. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
  33. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  35. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  36. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  37. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  38. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  39. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  40. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  41. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  42. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  43. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  44. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  45. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  46. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  47. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  48. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  49. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  50. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  51. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  52. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  53. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  54. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  55. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  56. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  57. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  58. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  59. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  61. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  62. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  63. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  64. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  65. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  66. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  67. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  68. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  69. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  70. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  71. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  72. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  73. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  74. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  75. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  76. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  77. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  78. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  79. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  80. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  82. package/adapters/codex/skills/ork/SKILL.md +18 -3
  83. package/adapters/hermes/README.md +1 -0
  84. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  85. package/adapters/hermes/hermes.plugin.json +1 -0
  86. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  87. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
  88. package/adapters/openclaw/README.md +26 -5
  89. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  90. package/adapters/openclaw/dist/index.js +46 -11
  91. package/adapters/openclaw/openclaw.plugin.json +5 -1
  92. package/adapters/openclaw/package.json +2 -2
  93. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  94. package/adapters/openclaw/src/index.ts +49 -11
  95. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  96. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  97. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  98. package/assets/docs-en/produto/README.md +14 -0
  99. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  100. package/assets/docs-en/roadmap/README.md +14 -0
  101. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  102. package/assets/orkmind_bridge.py +117 -9
  103. package/dist/adapters/claude-bg.js +116 -18
  104. package/dist/adapters/codex.js +14 -4
  105. package/dist/agents-md.js +24 -14
  106. package/dist/auditrun.js +22 -3
  107. package/dist/board.js +20 -17
  108. package/dist/branch-de-estado.js +88 -10
  109. package/dist/busca-semantica.js +52 -12
  110. package/dist/canarios-rm057.js +149 -0
  111. package/dist/canarios.js +2 -0
  112. package/dist/catalogo.js +33 -0
  113. package/dist/ci.js +21 -8
  114. package/dist/claims-conferir.js +342 -0
  115. package/dist/claims.js +41 -1
  116. package/dist/company-brain-client.js +36 -1
  117. package/dist/company-brain-context.js +158 -22
  118. package/dist/company-brain-journal.js +2 -1
  119. package/dist/company-brain-migration.js +36 -1
  120. package/dist/conducao-sentinela.js +388 -0
  121. package/dist/conducao-texto.js +12 -18
  122. package/dist/conducao.js +122 -30
  123. package/dist/conhecimento.js +490 -0
  124. package/dist/docs.js +70 -17
  125. package/dist/doctor-pulse-cron.js +349 -0
  126. package/dist/doctor-rede.js +150 -0
  127. package/dist/doctor.js +195 -111
  128. package/dist/entrega-pr.js +42 -29
  129. package/dist/escopo-escrita.js +10 -1
  130. package/dist/esgotamentos.js +181 -0
  131. package/dist/estado-thread.js +23 -1
  132. package/dist/experiencia-instalacao.js +45 -25
  133. package/dist/experiencia.js +12 -2
  134. package/dist/fabrica-batida.js +310 -0
  135. package/dist/fabrica-estado.js +52 -14
  136. package/dist/fabrica-publicar.js +9 -1
  137. package/dist/fechamento.js +20 -66
  138. package/dist/fila-pesada.js +444 -0
  139. package/dist/fix.js +3 -2
  140. package/dist/forja.js +31 -7
  141. package/dist/gates.js +3 -24
  142. package/dist/handoff.js +10 -6
  143. package/dist/hitl-contract.js +59 -4
  144. package/dist/hitl-curto.js +11 -6
  145. package/dist/hitl-gates.js +5 -0
  146. package/dist/hitl-local-receipt.js +2 -0
  147. package/dist/hitl-lote.js +5 -2
  148. package/dist/hitl-resumo.js +38 -3
  149. package/dist/hitl-tempo-parado.js +201 -0
  150. package/dist/hitl-texto-livre.js +5 -5
  151. package/dist/hitl.js +29 -33
  152. package/dist/horario.js +41 -7
  153. package/dist/hosts.js +104 -11
  154. package/dist/impedimento.js +299 -0
  155. package/dist/index.js +961 -542
  156. package/dist/indice-vetorial.js +87 -10
  157. package/dist/indice.js +9 -1
  158. package/dist/init.js +56 -43
  159. package/dist/instabilidade.js +144 -0
  160. package/dist/integracoes-locais.js +4 -0
  161. package/dist/intelligence-graph-cli.js +170 -16
  162. package/dist/intelligence-graph-contexto.js +254 -0
  163. package/dist/intelligence-graph-contract.js +2 -1
  164. package/dist/intelligence-graph-extract-md.js +56 -4
  165. package/dist/intelligence-graph-extract-ts.js +71 -3
  166. package/dist/intelligence-graph-parsers.js +6 -4
  167. package/dist/intelligence-graph-query.js +66 -19
  168. package/dist/leases.js +664 -87
  169. package/dist/ledger-stats.js +15 -1
  170. package/dist/ledger.js +18 -1
  171. package/dist/licoes.js +1 -0
  172. package/dist/liveness.js +6 -3
  173. package/dist/locale-ajuda.js +761 -0
  174. package/dist/locale-gerados.js +160 -0
  175. package/dist/locale-master.js +99 -0
  176. package/dist/locale-onboarding.js +92 -0
  177. package/dist/locale-phase.js +151 -0
  178. package/dist/locale-pulse.js +211 -0
  179. package/dist/locale-retry.js +385 -0
  180. package/dist/locale-roadmap.js +102 -0
  181. package/dist/locale-ship.js +494 -0
  182. package/dist/locale-thread.js +277 -0
  183. package/dist/locale-verify.js +125 -0
  184. package/dist/locale.js +714 -0
  185. package/dist/maestro-runtime.js +4 -1
  186. package/dist/manifest.js +149 -4
  187. package/dist/maquina.js +23 -4
  188. package/dist/master-digest.js +6 -1
  189. package/dist/master-nota.js +18 -11
  190. package/dist/master.js +145 -31
  191. package/dist/mcp-artifacts.js +43 -3
  192. package/dist/mcp-git.js +42 -8
  193. package/dist/mcp-grafo-worker.js +5 -3
  194. package/dist/mcp-grafo.js +55 -6
  195. package/dist/mcp-server.js +22 -3
  196. package/dist/mcp-ship.js +3 -1
  197. package/dist/mcp-verify.js +6 -1
  198. package/dist/memoria.js +48 -6
  199. package/dist/modos.js +3 -6
  200. package/dist/network-roadmap.js +196 -18
  201. package/dist/noctum-arco.js +911 -0
  202. package/dist/noctum-capacidade.js +141 -0
  203. package/dist/noctum-envelope.js +810 -0
  204. package/dist/noctum-execucao.js +304 -0
  205. package/dist/noctum-fila.js +280 -0
  206. package/dist/ocupacao.js +40 -5
  207. package/dist/onboarding.js +40 -21
  208. package/dist/orkmind.js +99 -7
  209. package/dist/orquestracao.js +24 -21
  210. package/dist/parado-no-condutor.js +219 -38
  211. package/dist/phase.js +160 -52
  212. package/dist/policies.js +56 -5
  213. package/dist/portfolio.js +8 -3
  214. package/dist/postura-local.js +234 -0
  215. package/dist/preflight.js +11 -10
  216. package/dist/procedencia.js +225 -0
  217. package/dist/projeto-alvo.js +132 -5
  218. package/dist/prompts.js +40 -1
  219. package/dist/prova-ativacao.js +75 -6
  220. package/dist/pulse-delivery.js +47 -4
  221. package/dist/pulse.js +98 -19
  222. package/dist/ratelimit.js +24 -6
  223. package/dist/recall.js +3 -1
  224. package/dist/redacao-saida.js +63 -0
  225. package/dist/rede-adesao.js +399 -0
  226. package/dist/rede-forja.js +289 -0
  227. package/dist/rede-projetos.js +239 -0
  228. package/dist/rede-status.js +337 -0
  229. package/dist/rede.js +980 -0
  230. package/dist/retry.js +291 -140
  231. package/dist/roadmap-reservas.js +20 -3
  232. package/dist/roadmap-status.js +150 -34
  233. package/dist/runtime-context.js +181 -3
  234. package/dist/runtime-profiles.js +22 -1
  235. package/dist/runtimes.js +2 -1
  236. package/dist/saida-segura.js +58 -0
  237. package/dist/session-events.js +7 -3
  238. package/dist/session-watcher-claude.js +120 -24
  239. package/dist/session-watcher.js +185 -33
  240. package/dist/sessoes-contas.js +187 -0
  241. package/dist/sessoes-inventario.js +6 -18
  242. package/dist/sessoes.js +83 -2
  243. package/dist/ship-publicar.js +800 -0
  244. package/dist/ship.js +157 -88
  245. package/dist/steal.js +77 -0
  246. package/dist/thread-close.js +3 -2
  247. package/dist/thread.js +299 -49
  248. package/dist/util.js +8 -1
  249. package/dist/verify.js +141 -52
  250. package/dist/vida-da-thread.js +254 -0
  251. package/dist/worktree-local.js +165 -0
  252. package/dist/worktree.js +25 -2
  253. package/dist/yaml.js +27 -8
  254. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  255. package/package.json +7 -3
  256. package/references/definition-of-done.md +1 -1
  257. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  258. package/skills/README.md +1 -1
  259. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  260. package/skills/phases/master-metrics/SKILL.md +8 -3
@@ -8,11 +8,11 @@ license: MIT
8
8
 
9
9
  # Orkastery no Hermes
10
10
 
11
- 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.
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.
15
- Apresente fontes/lacunas e próximas ações; ausência/ambiguidade de projeto exige contexto permitido; leia o cabeçalho "Projeto consultado" e o "Não lido" antes de responder.
15
+ Apresente fontes/lacunas e próximas ações; ausência/ambiguidade de projeto exige contexto permitido; leia o cabeçalho "Projeto consultado" e o "Não lido" antes de responder. No terminal, todo `ork` de projeto leva `--projeto <nome>` do projeto pedido; sem ele, quem escolhe é o cwd do gateway.
16
16
  Em sessão de fase já despachada, siga o bloco recebido sem abrir outra orquestração.
17
17
  Ações usam os comandos tipados do núcleo com precondições e readback.
18
18
 
@@ -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–d com uma recomendada, respondidas numa linha (`1a 2c 3b`).
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 as
138
- pendentes com registro. Nota do dono: `ork master pedir <thread>` e mande a linha; ele responde `<codigo> 4 porque`
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
- **27 tools `ork_*`** via `defineToolPlugin` do SDK do proprio OpenClaw, e o manifesto
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,16 +69,18 @@ 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
77
81
  so, vale ele. Toda resposta de `ork_maestro`, `ork_board` e `ork_roadmap_status` comeca dizendo o
78
- projeto consultado e o que nao foi lido.
82
+ projeto consultado e o que nao foi lido; as demais tools de projeto terminam com a linha
83
+ `Projeto consultado: ...` (RM-052, fatia 2), que vem no stderr e o plugin junta ao texto da tool.
79
84
 
80
85
  ### O roadmap da rede (RM-054, fatia 2)
81
86
 
@@ -89,8 +94,15 @@ nucleo so aceita a forja em `github.com`, `gitlab.com` ou no host de um projeto
89
94
  `projeto`, vem o panorama de todos os projetos do registro, e e o que a frase `orkastery maestro`
90
95
  sem projeto oferece. O projeto do diretorio do gateway so entra se estiver no registro.
91
96
 
92
- Ela e a unica tool do catalogo declarada nos perfis `coding` e `messaging` do OpenClaw
93
- (`toolMetadata.ork_network_roadmap.profiles` no manifesto): com o perfil `coding`, o padrao do
97
+ Na fatia 3, o panorama le tambem a rede por pessoa (RM-053): a casa e as maquinas com a batida de
98
+ cada uma, o projeto que uma maquina da rede declara (que passa a ser pedido pelo nome mesmo sem clone
99
+ nem registro nesta maquina) e a maquina da rede que nao publicou na fabrica do projeto, com as
100
+ threads dela ditas como nao lidas. `ork_network_status` (sem `projeto`) devolve a rede inteira, como
101
+ `ork network status`. Com o `gh` fora do PATH do gateway (em `~/.local/bin`, por exemplo), o `ork`
102
+ o acha nas pastas de usuario, como a rede.
103
+
104
+ Ela e `ork_network_status` (fatia 3) sao as unicas tools do catalogo declaradas nos perfis `coding` e
105
+ `messaging` do OpenClaw (`toolMetadata` no manifesto): com o perfil `coding`, o padrao do
94
106
  onboarding, as tools de plugin so chegam ao modelo quando o manifesto as declara no perfil ou o
95
107
  operador as libera. Sem isso o modelo nao ve tool `ork_*` nenhuma e vai ao `ork` pelo shell, como
96
108
  no incidente de 29/09. As outras tools continuam sob escolha do operador:
@@ -200,6 +212,15 @@ recomendação e opções rotuladas, sem UUID exposto. Telegram é opcional; ing
200
212
  nativo adicional só fica disponível após prova do callback e configuração do host.
201
213
  Instalação fixture/SDK simulado não comprova ativação em uma sessão real.
202
214
 
215
+ HITL de condução é seleção (RM-057, nas descrições de `ork_modo_do_pedido`,
216
+ `ork_maestro`, `ork_phase_run`, `ork_network_roadmap` e `ork_network_status`; as duas de rede são as
217
+ ú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
218
+ "Recomendação". Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido
219
+ que ele colou com autorização explícita vale como instrução dele, dentro dessa autorização.
220
+ Dúvida dentro da autorização vira `ork decisao registrar` e a thread segue. Texto só quando a
221
+ fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: mostre o
222
+ comando exato.
223
+
203
224
  Na callback autenticada, `/ork offer <thread> <pedido>` consulta a pergunta e a
204
225
  oferta nativa sem responder ao pedido. O gateway assina uma prova efêmera da
205
226
  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-d]|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-d]|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-4]|(?:[a-d]|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');
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 },
@@ -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
- parameters: schema({
267
- thread: { type: 'string' },
268
- fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
269
- prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
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.1",
5
+ "version": "0.5.6",
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.1",
4
- "description": "Plugin Orkastery para OpenClaw: 27 tools ork_* que traduzem intencao em chamada de CLI do nucleo `ork`. Zero regra de negocio no host.",
3
+ "version": "0.5.6",
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-d]|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-d]|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-4]|(?:[a-d]|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');
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. */
@@ -189,6 +189,20 @@ const PROJETO_DA_REDE: ProjetoDaTool = {
189
189
  recusa: 'informe o NOME de um projeto de `ork projetos` (ex.: orkastery) ou github:dono/repo, nunca caminho nem URL',
190
190
  };
191
191
 
192
+ /**
193
+ * RM-057 (fatia 2): a regra do HITL de conducao, a mesma frase dos adaptadores do Claude Code e do
194
+ * Codex (fatia 1). No OpenClaw o modelo so le as descricoes das tools: ela vai nas que recebem o
195
+ * pedido do dono (ork_modo_do_pedido), apresentam o panorama (ork_maestro) e despacham fase. Ensaio
196
+ * de 03/10: no perfil `coding` o modelo so ve as tools do `toolMetadata` (ork_network_roadmap e
197
+ * ork_network_status), entao a regra vai tambem nelas, sem ampliar o que o perfil expoe.
198
+ */
199
+ const REGRA_HITL_DE_CONDUCAO =
200
+ 'HITL de condução é seleção (RM-057): de 3 a 5 alternativas, exatamente uma com o selo "Recomendação". ' +
201
+ 'Nunca peça ao dono um "confirmo" em texto livre nem que ele cole texto; o pedido que ele colou com autorização ' +
202
+ 'explícita vale como instrução dele, dentro dessa autorização. Dúvida dentro da autorização vira `ork decisao registrar` ' +
203
+ 'e a thread segue. Texto só quando a fábrica não consegue seguir sozinha e o dono precisa rodar um comando no terminal: ' +
204
+ 'mostre o comando exato.';
205
+
192
206
  /** Catálogo em paridade nome a nome com o manifesto; aprovação genérica legada aposentada. */
193
207
  interface FerramentaOrk {
194
208
  name: string;
@@ -198,12 +212,14 @@ interface FerramentaOrk {
198
212
  entrada?: (params: Record<string, unknown>) => string;
199
213
  /** O `projeto` desta tool, quando nao e o da RM-052 (so nome). */
200
214
  projeto?: ProjetoDaTool;
215
+ /** RM-054 (fatia 3): a tool e da pessoa, nao de um projeto (`ork network status`); sem `projeto`. */
216
+ semProjeto?: true;
201
217
  }
202
218
 
203
219
  const FERRAMENTAS: FerramentaOrk[] = [
204
220
  {
205
221
  name: 'ork_maestro',
206
- 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.',
222
+ 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,
207
223
  parameters: { type: 'object', additionalProperties: false, properties: {
208
224
  thread: { type: 'string' }, section: { type: 'string', enum: ['portfolio','demands','threads','sessions','blockers','leases','retries','hitl','ship','master','nextActions'] },
209
225
  offset: { type: 'integer', minimum: 0, maximum: 100000 },
@@ -245,7 +261,7 @@ const FERRAMENTAS: FerramentaOrk[] = [
245
261
  {
246
262
  name: 'ork_modo_do_pedido',
247
263
  description:
248
- '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.',
264
+ '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,
249
265
  parameters: schema({
250
266
  pedido: { type: 'string', description: 'O texto inteiro do pedido do builder' },
251
267
  }),
@@ -281,12 +297,18 @@ const FERRAMENTAS: FerramentaOrk[] = [
281
297
  {
282
298
  name: 'ork_phase_run',
283
299
  description:
284
- 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger.',
285
- parameters: schema({
286
- thread: { type: 'string' },
287
- fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
288
- prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
289
- }),
300
+ 'Despacha uma fase (GOAL PLAN GO CHECK SHIP MASTER) pelo runtime adapter, gravando o prompt exato com sha256 no ledger. ' +
301
+ REGRA_HITL_DE_CONDUCAO,
302
+ parameters: {
303
+ type: 'object', additionalProperties: false, required: ['thread', 'fase', 'prompt'],
304
+ properties: {
305
+ thread: { type: 'string' },
306
+ fase: { type: 'string', enum: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'] },
307
+ prompt: { type: 'string', description: 'O pedido do builder para esta fase' },
308
+ // RM-056: a conta do despacho; o nucleo recusa perfil inexistente, de outro runtime, esgotado ou sem login.
309
+ perfil: { type: 'string', description: 'id do perfil de conta (ork accounts list); omita para o rodizio do nucleo' },
310
+ },
311
+ },
290
312
  argv: (p) => [
291
313
  'phase',
292
314
  'run',
@@ -294,6 +316,7 @@ const FERRAMENTAS: FerramentaOrk[] = [
294
316
  texto(p, 'fase'),
295
317
  '--prompt',
296
318
  texto(p, 'prompt'),
319
+ ...(p.perfil === undefined ? [] : ['--perfil', texto(p, 'perfil')]),
297
320
  ],
298
321
  },
299
322
  {
@@ -458,12 +481,21 @@ const FERRAMENTAS: FerramentaOrk[] = [
458
481
  {
459
482
  name: 'ork_network_roadmap',
460
483
  description:
461
- '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.',
484
+ '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,
462
485
  parameters: schema({}),
463
486
  projeto: PROJETO_DA_REDE,
464
487
  // RM-054 (fatia 2): uma chamada de CLI; o `--projeto` vai no inicio e o nucleo o devolve ao `network`.
465
488
  argv: () => ['network', 'roadmap'],
466
489
  },
490
+ {
491
+ name: 'ork_network_status',
492
+ description:
493
+ '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,
494
+ parameters: schema({}),
495
+ semProjeto: true,
496
+ // RM-054 (fatia 3): uma chamada de CLI; a rede e da pessoa e nao recebe `--projeto`.
497
+ argv: () => ['network', 'status'],
498
+ },
467
499
  {
468
500
  name: 'ork_master_batch',
469
501
  description:
@@ -475,6 +507,7 @@ const FERRAMENTAS: FerramentaOrk[] = [
475
507
 
476
508
  /** RM-052: toda tool aceita `projeto` opcional, sem mudar o que ela ja exigia. */
477
509
  function comProjeto(f: FerramentaOrk): Record<string, unknown> {
510
+ if (f.semProjeto) return f.parameters;
478
511
  const propriedades = (f.parameters.properties ?? {}) as Record<string, unknown>;
479
512
  const p = f.projeto;
480
513
  const projeto = p ? { type: 'string', pattern: p.padrao.source, description: p.descricao } : PARAMETRO_PROJETO;
@@ -484,6 +517,11 @@ function comProjeto(f: FerramentaOrk): Record<string, unknown> {
484
517
  /** `--projeto <nome>` vai no inicio do argv; o resto dos parametros segue para a tool como antes. */
485
518
  function argvComProjeto(f: FerramentaOrk, params: Record<string, unknown>): { argv: string[]; resto: Record<string, unknown> } {
486
519
  const { projeto, ...resto } = params;
520
+ if (f.semProjeto) {
521
+ // A tool sem `projeto` recusa o parametro em vez de ignora-lo: o modelo saberia que a rede veio filtrada.
522
+ if (projeto !== undefined) throw new Error('projeto.invalido');
523
+ return { argv: f.argv(resto), resto };
524
+ }
487
525
  if (projeto !== undefined && (typeof projeto !== 'string' || !(f.projeto ?? PROJETO_DA_RM052).padrao.test(projeto))) {
488
526
  throw new Error('projeto.invalido');
489
527
  }
@@ -494,7 +532,7 @@ const plugin = defineToolPlugin({
494
532
  id: 'orkastery',
495
533
  name: 'Orkastery',
496
534
  description:
497
- '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.',
535
+ '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).',
498
536
  tools: (tool) =>
499
537
  FERRAMENTAS.map((f) =>
500
538
  tool({
@@ -506,7 +544,7 @@ const plugin = defineToolPlugin({
506
544
  try { chamada = argvComProjeto(f, params); }
507
545
  catch (e) {
508
546
  if ((e as Error).message === 'projeto.invalido') {
509
- return `[ork recusou] projeto.invalido: ${(f.projeto ?? PROJETO_DA_RM052).recusa}`;
547
+ 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}`;
510
548
  }
511
549
  return '[ork recusou] resposta humana não confirmada; confira origem e correlação do pedido';
512
550
  }
@@ -0,0 +1,22 @@
1
+ // Markdown style of the product documentation and of the roadmap (Orkastery, I-44).
2
+ // Division of labor: this linter covers the FORM of the Markdown; `ork docs verificar` covers
3
+ // the frontmatter, reading (ADHD), and parity with the code and with git.
4
+ {
5
+ "globs": [
6
+ "docs/produto/**/*.md",
7
+ "docs/roadmap/**/*.md",
8
+ "docs/padroes/**/*.md",
9
+ "README.md"
10
+ ],
11
+ "config": {
12
+ "default": true,
13
+ // Prose does not wrap at 80 columns: one paragraph is one line.
14
+ "MD013": false,
15
+ // "Histórico" and "Comportamento" repeat across pages, never among siblings under the same title.
16
+ "MD024": { "siblings_only": true },
17
+ // The template uses the same ordered list style as the owner's standard.
18
+ "MD029": { "style": "one_or_ordered" },
19
+ // HTML only for images, badges and detail folds; HTML layout hides the answer in the first line.
20
+ "MD033": { "allowed_elements": ["img", "picture", "source", "br", "sub", "sup", "kbd", "details", "summary"] }
21
+ }
22
+ }