@orkastery/cli 0.6.0 → 0.6.2

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 (118) hide show
  1. package/adapters/claude-code/agents/ork-check.md +1 -1
  2. package/adapters/claude-code/agents/ork-go.md +1 -1
  3. package/adapters/claude-code/agents/ork-goal.md +1 -1
  4. package/adapters/claude-code/agents/ork-master.md +1 -1
  5. package/adapters/claude-code/agents/ork-plan.md +1 -1
  6. package/adapters/claude-code/agents/ork-ship.md +1 -1
  7. package/adapters/claude-code/commands/ork.md +1 -1
  8. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +2 -0
  9. package/adapters/codex/skills/ork/SKILL.md +1 -1
  10. package/adapters/openclaw/openclaw.plugin.json +1 -1
  11. package/adapters/openclaw/package.json +1 -1
  12. package/assets/adapters-en/claude-code/agents/ork-check.md +1 -1
  13. package/assets/adapters-en/claude-code/agents/ork-go.md +1 -1
  14. package/assets/adapters-en/claude-code/agents/ork-goal.md +1 -1
  15. package/assets/adapters-en/claude-code/agents/ork-master.md +1 -1
  16. package/assets/adapters-en/claude-code/agents/ork-plan.md +1 -1
  17. package/assets/adapters-en/claude-code/agents/ork-ship.md +1 -1
  18. package/assets/adapters-en/claude-code/commands/ork.md +1 -1
  19. package/assets/adapters-en/codex/skills/ork/SKILL.md +1 -1
  20. package/assets/orkmind_fixture.py +4 -1
  21. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +1 -1
  22. package/assets/skills-en/phases/check-quality/SKILL.md +1 -1
  23. package/assets/skills-en/phases/go-implementation/SKILL.md +1 -1
  24. package/dist/adapters/claude-bg.js +9 -7
  25. package/dist/adapters/grok-events.js +227 -0
  26. package/dist/adapters/grok-mcp-servidor.js +622 -0
  27. package/dist/adapters/grok-mcp.js +178 -0
  28. package/dist/adapters/grok.js +686 -0
  29. package/dist/agendador-cpu.js +92 -0
  30. package/dist/branch-de-estado.js +7 -2
  31. package/dist/changelog-check.js +217 -0
  32. package/dist/check-agil.js +289 -25
  33. package/dist/check-paralelo.js +73 -18
  34. package/dist/ci.js +3 -2
  35. package/dist/claim-lint.js +29 -0
  36. package/dist/claims.js +4 -0
  37. package/dist/conducao.js +5 -0
  38. package/dist/docs.js +16 -16
  39. package/dist/doctor-forja.js +1 -3
  40. package/dist/doctor.js +1 -1
  41. package/dist/entrega-pr.js +10 -10
  42. package/dist/fabrica-estado.js +20 -11
  43. package/dist/fila-pesada.js +121 -11
  44. package/dist/hitl-classificacao.js +1 -0
  45. package/dist/horario.js +4 -1
  46. package/dist/index.js +63 -35
  47. package/dist/integracoes-locais.js +2 -0
  48. package/dist/intelligence-graph-cli.js +27 -9
  49. package/dist/locale-accounts.js +11 -3
  50. package/dist/locale-ajuda.js +10 -6
  51. package/dist/locale-claims.js +16 -2
  52. package/dist/locale-forja.js +2 -4
  53. package/dist/locale-grafo.js +56 -1
  54. package/dist/locale-maestro.js +38 -0
  55. package/dist/locale-network.js +8 -6
  56. package/dist/locale-onboarding.js +14 -0
  57. package/dist/locale-operacao-restante.js +2 -2
  58. package/dist/locale-preflight.js +80 -0
  59. package/dist/locale-projetos.js +6 -0
  60. package/dist/locale-prompts.js +8 -8
  61. package/dist/locale-pulse.js +4 -0
  62. package/dist/locale-retry.js +56 -2
  63. package/dist/locale-security-scan.js +35 -1
  64. package/dist/locale-ship.js +10 -2
  65. package/dist/locale-verify.js +15 -0
  66. package/dist/locale.js +24 -7
  67. package/dist/maestro-cli.js +12 -17
  68. package/dist/manifest.js +6 -1
  69. package/dist/mcp-install.js +24 -13
  70. package/dist/mcp-server.js +62 -33
  71. package/dist/mcp-verify-async.js +353 -0
  72. package/dist/mcp-verify-worker.js +17 -0
  73. package/dist/mcp-verify.js +10 -1
  74. package/dist/merge-da-entrega.js +85 -0
  75. package/dist/network-roadmap.js +18 -14
  76. package/dist/noctum-aceite.js +154 -14
  77. package/dist/noctum-cli.js +69 -12
  78. package/dist/noctum-entrega.js +55 -7
  79. package/dist/noctum-envelope.js +1 -1
  80. package/dist/noctum-execucao.js +5 -1
  81. package/dist/noctum-fechamento.js +18 -7
  82. package/dist/noctum-fila.js +6 -1
  83. package/dist/noctum-guarda.js +81 -4
  84. package/dist/noctum-maquinas.js +5 -1
  85. package/dist/noctum-modo.js +35 -7
  86. package/dist/noctum-reconciliacao.js +4 -1
  87. package/dist/noctum-rede.js +102 -0
  88. package/dist/noctum-relatorio.js +44 -10
  89. package/dist/noctum-retomada-rede.js +71 -0
  90. package/dist/noctum-vigia.js +49 -9
  91. package/dist/parado-no-condutor.js +14 -15
  92. package/dist/pedido-conducao.js +51 -0
  93. package/dist/phase.js +43 -15
  94. package/dist/postura-local.js +7 -3
  95. package/dist/preflight.js +27 -27
  96. package/dist/prompts.js +4 -2
  97. package/dist/pulse.js +4 -2
  98. package/dist/ratelimit.js +1 -0
  99. package/dist/rede.js +24 -12
  100. package/dist/retry.js +115 -10
  101. package/dist/runtime-context.js +165 -45
  102. package/dist/runtime-escada.js +7 -1
  103. package/dist/runtime-profiles.js +27 -17
  104. package/dist/runtimes.js +42 -5
  105. package/dist/security-scan/agil.js +18 -7
  106. package/dist/security-scan/cli.js +2 -2
  107. package/dist/security-scan/executor.js +8 -0
  108. package/dist/security-scan/report.js +1 -1
  109. package/dist/session-watcher-grok.js +425 -0
  110. package/dist/session-watcher.js +52 -11
  111. package/dist/sessoes-contas.js +33 -5
  112. package/dist/setup.js +11 -11
  113. package/dist/varredura-acoes.js +8 -15
  114. package/dist/verify.js +191 -43
  115. package/package.json +2 -2
  116. package/skills/core/orkastery-bootstrap/SKILL.md +1 -1
  117. package/skills/phases/check-quality/SKILL.md +1 -1
  118. package/skills/phases/go-implementation/SKILL.md +1 -1
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RUNTIMES_DAS_SESSOES = void 0;
36
37
  exports.pidVivo = pidVivo;
37
38
  exports.ehFantasma = ehFantasma;
38
39
  exports.encerradaNaLista = encerradaNaLista;
@@ -49,6 +50,10 @@ exports.sessoesVivasPorPerfil = sessoesVivasPorPerfil;
49
50
  * perfil do store, sem repetir diretorio, e cada sessao volta com o id do perfil dela (nunca o
50
51
  * diretorio nem nada de dentro dele).
51
52
  *
53
+ * RM-067 (F4): o `grok` entra com a pasta `sessions/` que o proprio runtime grava em cada casa (`GROK_HOME`), lida so
54
+ * pelos nomes e pelo mtime do `updates.jsonl`. A conta do processo dele so entra quando essa pasta existe: maquina sem o
55
+ * `grok` nao ganha fonte nova.
56
+ *
52
57
  * Fantasma (D5): sessao claude-bg com estado nao terminal sem pid, ou com pid sem processo. O
53
58
  * `claude agents` guarda o registro, mas nao ha quem trabalhe: ela nao ocupa vaga, e
54
59
  * `ork sessions limpar-fantasmas` solta o vinculo do `ork` sem tocar no runtime.
@@ -57,6 +62,7 @@ const fs = __importStar(require("node:fs"));
57
62
  const path = __importStar(require("node:path"));
58
63
  const claude_bg_1 = require("./adapters/claude-bg");
59
64
  const codex_1 = require("./adapters/codex");
65
+ const grok_1 = require("./adapters/grok");
60
66
  const runtime_profiles_1 = require("./runtime-profiles");
61
67
  const TERMINAIS = ['done', 'completed', 'exited', 'stopped', 'failed'];
62
68
  const estadoDe = (s) => String(s.state ?? s.status ?? '').trim().toLowerCase();
@@ -108,17 +114,26 @@ function contasDeSessoes(raiz, env = process.env) {
108
114
  try {
109
115
  for (const p of (0, runtime_profiles_1.lerPerfis)(raiz).perfis) {
110
116
  const d = (0, runtime_profiles_1.perfilDeDespacho)(p);
111
- incluir(d.runtime, d, (d.configDir ?? d.codexHome));
117
+ if (exports.RUNTIMES_DAS_SESSOES.includes(d.runtime))
118
+ incluir(d.runtime, d, (0, runtime_profiles_1.diretorioDoPerfil)(d));
112
119
  }
113
120
  }
114
121
  catch (e) {
115
122
  fontes.push({ origem: 'perfis de conta (ork accounts)', ok: false, detalhe: e.message });
116
123
  }
117
124
  }
118
- for (const runtime of runtime_profiles_1.RUNTIMES_COM_PERFIL)
125
+ for (const runtime of runtime_profiles_1.RUNTIMES_COM_INVENTARIO)
119
126
  incluir(runtime, null, (0, runtime_profiles_1.diretorioImplicito)(runtime, env));
127
+ const casaGrok = (0, runtime_profiles_1.diretorioImplicito)('grok', env);
128
+ if (fs.existsSync(path.join(casaGrok, 'sessions')))
129
+ incluir('grok', null, casaGrok);
120
130
  return { contas, fontes };
121
131
  }
132
+ /**
133
+ * RM-067 (F4): os runtimes cujas sessoes o `ork sessions` lista por conta. O grok entra aqui, e nao em
134
+ * `RUNTIMES_COM_INVENTARIO`, que tambem diz os runtimes de assinatura do #Noctum (a medicao dele segue sem o grok).
135
+ */
136
+ exports.RUNTIMES_DAS_SESSOES = [...runtime_profiles_1.RUNTIMES_COM_INVENTARIO, 'grok'];
122
137
  const rotulo = (c) => c.perfil ? `perfil ${c.perfil.id}` : 'conta do processo';
123
138
  /**
124
139
  * D4: as sessoes de todas as contas. Consulta que falha vira fonte `ok: false`, nunca "zero
@@ -154,7 +169,7 @@ function consultarContas(raiz, opcoes = {}) {
154
169
  sessoes.push({ ...s, runtime: 'claude-bg', perfil, fantasma, viva: !fantasma && !TERMINAIS.includes(estadoDe(s)) });
155
170
  }
156
171
  }
157
- else {
172
+ else if (conta.runtime === 'codex') {
158
173
  const r = (0, codex_1.consultarRollouts)(opcoes.todas, conta.dir);
159
174
  // A conta do processo segue com o caminho de antes; a do perfil vai pelo id, nunca pela pasta.
160
175
  fontes.push(...(conta.perfil ? r.resultadosFontes.map(f => ({ ...f,
@@ -164,6 +179,17 @@ function consultarContas(raiz, opcoes = {}) {
164
179
  sessoes.push({ ...s, runtime: 'codex', perfil, fantasma: false, viva: estadoDe(s) !== 'completed' && recente });
165
180
  }
166
181
  }
182
+ else if (conta.runtime === 'grok') {
183
+ // RM-067 (F4): a pasta da sessao que o runtime grava; viva e a escrita recente no updates.jsonl, como no codex.
184
+ const r = (0, grok_1.consultarSessoesGrok)(conta.dir);
185
+ const origem = `grok sessions (${rotulo(conta)})`;
186
+ fontes.push(r.ausente ? { origem, ok: true, ausente: true, detalhe: 'nenhuma sessao grok nesta conta ainda' }
187
+ : { origem, ok: r.ok, detalhe: r.detalhe });
188
+ for (const s of r.sessoes) {
189
+ const recente = typeof s.atividadeEm === 'number' && agoraMs - s.atividadeEm <= janelaMs;
190
+ sessoes.push({ ...s, runtime: 'grok', perfil, fantasma: false, viva: recente });
191
+ }
192
+ }
167
193
  }
168
194
  return { sessoes, fontes, contas: base.contas };
169
195
  }
@@ -176,10 +202,12 @@ function consultarContas(raiz, opcoes = {}) {
176
202
  function estadosNasContas(raiz, opcoes = {}) {
177
203
  const r = consultarContas(raiz, opcoes);
178
204
  const claude = r.fontes.filter(f => f.origem.startsWith('claude agents'));
179
- if (claude.length > 0 && !claude.some(f => f.ok) && !r.sessoes.some(s => s.runtime === 'codex'))
205
+ if (claude.length > 0 && !claude.some(f => f.ok) && !r.sessoes.some(s => s.runtime === 'codex' || s.runtime === 'grok'))
180
206
  return null;
207
+ // RM-067 (F4): a sessao grok sem escrita recente fica `idle`; o runtime nao grava estado terminal que o ork leia sem o conteudo.
181
208
  return new Map(r.sessoes.map(s => [s.sessionId,
182
- s.fantasma ? 'fantasma' : s.runtime === 'codex' ? (s.viva ? 'working' : estadoDe(s)) : estadoDe(s)]));
209
+ s.fantasma ? 'fantasma' : s.runtime === 'codex' ? (s.viva ? 'working' : estadoDe(s))
210
+ : s.runtime === 'grok' ? (s.viva ? 'working' : 'idle') : estadoDe(s)]));
183
211
  }
184
212
  /**
185
213
  * RM-056 (D3): sessoes vivas de cada perfil do runtime nesta maquina, a carga do rodizio por
package/dist/setup.js CHANGED
@@ -118,8 +118,9 @@ function validarFallback(lista, principal) {
118
118
  const m = ENTRADA_DE_FALLBACK.exec(item.trim());
119
119
  if (!m)
120
120
  throw new Error((0, locale_1.msg)().setup.fallbackInvalido(item));
121
- if (!(0, runtimes_1.runtimeConhecido)(m[1]))
122
- throw new Error((0, locale_1.msg)().setup.fallbackDesconhecido(m[1], runtimes_1.ORDEM_DOS_RUNTIMES.join(', ')));
121
+ // RM-067 (F4b, G9): desde a F4 todo runtime do registro e de bloco; a recusa lista os que o fallback aceita.
122
+ if (!(0, runtimes_1.runtimeDeBloco)(m[1]))
123
+ throw new Error((0, locale_1.msg)().setup.fallbackDesconhecido(m[1], runtimes_1.RUNTIMES_DE_BLOCO.join(', ')));
123
124
  if (vistos.has(m[1]))
124
125
  throw new Error((0, locale_1.msg)().setup.fallbackRepetido(m[1]));
125
126
  vistos.add(m[1]);
@@ -134,7 +135,7 @@ function normalizarFallback(valor, principal) {
134
135
  const saida = [];
135
136
  for (const item of valor) {
136
137
  const m = typeof item === 'string' ? ENTRADA_DE_FALLBACK.exec(item) : null;
137
- if (!m || !(0, runtimes_1.runtimeConhecido)(m[1]) || vistos.has(m[1]))
138
+ if (!m || !(0, runtimes_1.runtimeDeBloco)(m[1]) || vistos.has(m[1]))
138
139
  continue;
139
140
  vistos.add(m[1]);
140
141
  saida.push(item);
@@ -177,7 +178,7 @@ function validarConfigComLimites(config) {
177
178
  if (!Object.hasOwn(config, 'limites'))
178
179
  return;
179
180
  validarLimitesDeBloco(config.limites);
180
- if (typeof config.runtime !== 'string' || !(0, runtimes_1.runtimeConhecido)(config.runtime) ||
181
+ if (typeof config.runtime !== 'string' || !(0, runtimes_1.runtimeDeBloco)(config.runtime) ||
181
182
  typeof config.model !== 'string' || config.model.trim() === '' ||
182
183
  typeof config.effort !== 'string' || config.effort.trim() === '') {
183
184
  throw new Error((0, locale_1.msg)().setup.blocoComLimites);
@@ -288,7 +289,7 @@ function lerSetup(raiz) {
288
289
  if (doArquivo[i] === undefined)
289
290
  return blocoPadraoDoModo(modo);
290
291
  const b = doArquivo[i];
291
- const runtime = typeof b.runtime === 'string' && (0, runtimes_1.runtimeConhecido)(b.runtime)
292
+ const runtime = typeof b.runtime === 'string' && (0, runtimes_1.runtimeDeBloco)(b.runtime)
292
293
  ? b.runtime
293
294
  : doModo.runtime;
294
295
  return {
@@ -529,11 +530,9 @@ function editarBloco(raiz, modo, bloco, edicao, por = 'owner') {
529
530
  erro: (0, locale_1.msg)().setup.blocoInexistente(bloco, def.tag, def.blocos.length),
530
531
  };
531
532
  }
532
- if (edicao.runtime !== undefined && !(0, runtimes_1.runtimeConhecido)(edicao.runtime)) {
533
- return {
534
- ...base,
535
- erro: (0, locale_1.msg)().setup.runtimeDesconhecido(edicao.runtime, runtimes_1.ORDEM_DOS_RUNTIMES.join(', ')),
536
- };
533
+ if (edicao.runtime !== undefined && !(0, runtimes_1.runtimeDeBloco)(edicao.runtime)) {
534
+ // RM-067 (F4b, G9): a recusa lista os runtimes que o bloco aceita, o grok entre eles desde a F4.
535
+ return { ...base, erro: (0, locale_1.msg)().setup.runtimeDesconhecido(edicao.runtime, runtimes_1.RUNTIMES_DE_BLOCO.join(', ')) };
537
536
  }
538
537
  const atual = setup.modos[modo].blocos[bloco - 1];
539
538
  if (edicao.runtime !== undefined && edicao.runtime !== atual.runtime && !edicao.model?.trim())
@@ -646,7 +645,8 @@ function textoDoSetup(raiz, modo) {
646
645
  saida.push(m.fallback(modo));
647
646
  const padrao = blocoPadraoDoModo(modo);
648
647
  saida.push(m.resetar(modo, `${padrao.runtime}/${padrao.model}/${padrao.effort}`));
649
- saida.push(m.runtimes(runtimes_1.ORDEM_DOS_RUNTIMES.join(', ')));
648
+ // RM-067 (F4b, G9): a tela lista os runtimes de bloco, os que o `--runtime` e o `--fallback` do setup aceitam.
649
+ saida.push(m.runtimes(runtimes_1.RUNTIMES_DE_BLOCO.join(', ')));
650
650
  saida.push('');
651
651
  saida.push(linhaDaOrigemDoSetup(raiz));
652
652
  return saida.join('\n');
@@ -69,6 +69,7 @@ const path = __importStar(require("node:path"));
69
69
  const autorizacao_duravel_1 = require("./autorizacao-duravel");
70
70
  const conducao_1 = require("./conducao");
71
71
  const entrega_pr_1 = require("./entrega-pr");
72
+ const merge_da_entrega_1 = require("./merge-da-entrega");
72
73
  const estado_thread_1 = require("./estado-thread");
73
74
  const ledger_1 = require("./ledger");
74
75
  const locale_1 = require("./locale");
@@ -181,21 +182,13 @@ function commitsDepois(raiz, t, sha) {
181
182
  * novo de cada thread, com o head do PR (o segundo pai) e o instante do commit. E a mesma busca do `ork ship
182
183
  * registrar-pr` (`mergeDaEntrega`).
183
184
  */
184
- function mergesDaBase(raiz, remoto, base) {
185
+ function mergesDaBase(raiz, remoto, base, threads) {
185
186
  const mapa = new Map();
186
- const r = (0, util_1.exec)('git', ['log', `refs/remotes/${remoto}/${base}`, '--first-parent', '--format=%H%x09%P%x09%cI%x09%s', '--grep=^ship(',
187
- '--'], raiz, 60000);
188
- if (!r.ok)
189
- return mapa;
190
- for (const linha of r.stdout.split('\n')) {
191
- const [sha, pais, em, assunto] = linha.split('\t');
192
- const m = /^ship\(([A-Za-z0-9._-]+)\)/.exec(assunto ?? '');
193
- if (!m || !sha || !SHA.test(sha) || mapa.has(m[1]))
194
- continue;
195
- const segundo = (pais ?? '').split(' ')[1] ?? null;
196
- const ms = Date.parse(em ?? '');
197
- mapa.set(m[1], { mergeSha: sha, headSha: segundo && SHA.test(segundo) ? segundo : null,
198
- em: Number.isFinite(ms) ? new Date(ms).toISOString() : null });
187
+ const reconhecidos = (0, merge_da_entrega_1.mergesDasEntregasNaBase)(raiz, `refs/remotes/${remoto}/${base}`, base, threads.map((t) => ({ thread: t.id, branch: (0, merge_da_entrega_1.branchRegistradaDaEntrega)(raiz, t.id) ?? (0, worktree_1.branchDaWorktree)(t) })));
188
+ for (const t of threads) {
189
+ const merge = reconhecidos.get(t.id)?.[0];
190
+ if (merge)
191
+ mapa.set(t.id, merge);
199
192
  }
200
193
  return mapa;
201
194
  }
@@ -229,7 +222,7 @@ function pendentesDeRegistrar(carregado, threads, quando, vivas) {
229
222
  const remoto = manifesto.fabrica.remoto, base = manifesto.worktree.base_branch;
230
223
  const saida = [];
231
224
  const abertas = threads.filter((t) => t.status !== 'fechada' && (0, worktree_1.branchDaWorktree)(t).startsWith('ork/'));
232
- const merges = abertas.length ? mergesDaBase(raiz, remoto, base)
225
+ const merges = abertas.length ? mergesDaBase(raiz, remoto, base, abertas)
233
226
  : new Map();
234
227
  for (const t of abertas) {
235
228
  const merge = merges.get(t.id);