@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.
Files changed (131) hide show
  1. package/adapters/claude-code/README.md +11 -2
  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/onboarding.md +3 -2
  5. package/adapters/claude-code/commands/ork.md +9 -0
  6. package/adapters/codex/skills/ork/SKILL.md +18 -3
  7. package/adapters/hermes/README.md +1 -0
  8. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  9. package/adapters/hermes/hermes.plugin.json +1 -0
  10. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  11. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +6 -5
  12. package/adapters/openclaw/README.md +35 -4
  13. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  14. package/adapters/openclaw/dist/index.js +47 -12
  15. package/adapters/openclaw/openclaw.plugin.json +5 -1
  16. package/adapters/openclaw/package.json +2 -2
  17. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  18. package/adapters/openclaw/src/index.ts +50 -12
  19. package/assets/orkmind_bridge.py +117 -9
  20. package/dist/adapters/claude-bg.js +59 -11
  21. package/dist/adapters/codex.js +4 -3
  22. package/dist/agents-md.js +1 -0
  23. package/dist/auditrun.js +6 -2
  24. package/dist/board.js +16 -14
  25. package/dist/branch-de-estado.js +66 -10
  26. package/dist/busca-semantica.js +52 -12
  27. package/dist/canarios-rm057.js +149 -0
  28. package/dist/canarios.js +2 -0
  29. package/dist/ci.js +8 -1
  30. package/dist/claim-lint.js +3 -1
  31. package/dist/claims.js +39 -1
  32. package/dist/company-brain-context.js +158 -22
  33. package/dist/docs.js +110 -3
  34. package/dist/doctor-pulse-cron.js +194 -0
  35. package/dist/doctor-rede.js +149 -0
  36. package/dist/doctor.js +294 -37
  37. package/dist/entrega-pr.js +27 -8
  38. package/dist/esgotamentos.js +181 -0
  39. package/dist/experiencia.js +12 -2
  40. package/dist/fabrica-estado.js +35 -9
  41. package/dist/fabrica-publicar.js +6 -0
  42. package/dist/fechamento.js +20 -66
  43. package/dist/fix.js +3 -3
  44. package/dist/forja.js +31 -7
  45. package/dist/gates.js +5 -1
  46. package/dist/hitl-contract.js +59 -4
  47. package/dist/hitl-curto.js +11 -6
  48. package/dist/hitl-gates.js +5 -0
  49. package/dist/hitl-lote.js +5 -2
  50. package/dist/hitl-resumo.js +33 -1
  51. package/dist/hitl-tempo-parado.js +201 -0
  52. package/dist/hitl-texto-livre.js +5 -5
  53. package/dist/horario.js +27 -0
  54. package/dist/hosts.js +59 -13
  55. package/dist/impedimento.js +205 -0
  56. package/dist/index.js +433 -88
  57. package/dist/indice-vetorial.js +87 -10
  58. package/dist/indice.js +3 -1
  59. package/dist/init.js +28 -5
  60. package/dist/integracoes-locais.js +4 -0
  61. package/dist/intelligence-graph-cli.js +267 -30
  62. package/dist/intelligence-graph-contexto.js +215 -0
  63. package/dist/intelligence-graph-contract.js +71 -12
  64. package/dist/intelligence-graph-extract-md.js +41 -23
  65. package/dist/intelligence-graph-extract-ts.js +181 -11
  66. package/dist/intelligence-graph-extract.js +186 -9
  67. package/dist/intelligence-graph-index.js +205 -24
  68. package/dist/intelligence-graph-parsers.js +6 -4
  69. package/dist/intelligence-graph-repo.js +10 -0
  70. package/dist/leases.js +680 -87
  71. package/dist/ledger-stats.js +15 -1
  72. package/dist/ledger.js +12 -0
  73. package/dist/licoes.js +6 -4
  74. package/dist/liveness.js +2 -1
  75. package/dist/maestro-runtime.js +7 -1
  76. package/dist/manifest.js +44 -1
  77. package/dist/master-nota.js +14 -5
  78. package/dist/master.js +129 -12
  79. package/dist/mcp-artifacts.js +36 -3
  80. package/dist/mcp-git.js +80 -15
  81. package/dist/mcp-grafo-worker.js +93 -0
  82. package/dist/mcp-grafo.js +279 -0
  83. package/dist/mcp-install.js +2 -1
  84. package/dist/mcp-server.js +23 -1
  85. package/dist/mcp-ship.js +2 -0
  86. package/dist/mcp-verify.js +3 -1
  87. package/dist/memoria.js +48 -6
  88. package/dist/network-roadmap.js +195 -20
  89. package/dist/ocupacao.js +17 -5
  90. package/dist/onboarding.js +9 -4
  91. package/dist/orkmind.js +90 -5
  92. package/dist/orquestracao.js +14 -11
  93. package/dist/parado-no-condutor.js +1089 -0
  94. package/dist/phase.js +68 -15
  95. package/dist/policies.js +79 -3
  96. package/dist/portfolio.js +4 -1
  97. package/dist/projeto-alvo.js +5 -1
  98. package/dist/prompts.js +36 -1
  99. package/dist/prova-ativacao.js +414 -0
  100. package/dist/pulse-delivery.js +60 -7
  101. package/dist/pulse.js +99 -3
  102. package/dist/ratelimit.js +20 -4
  103. package/dist/recall.js +3 -1
  104. package/dist/rede-adesao.js +399 -0
  105. package/dist/rede-forja.js +289 -0
  106. package/dist/rede-projetos.js +239 -0
  107. package/dist/rede-status.js +336 -0
  108. package/dist/rede.js +980 -0
  109. package/dist/retry.js +69 -2
  110. package/dist/roadmap-status.js +162 -7
  111. package/dist/runtime-context.js +5 -1
  112. package/dist/runtime-profiles.js +22 -1
  113. package/dist/saida-segura.js +58 -0
  114. package/dist/session-watcher-claude.js +113 -23
  115. package/dist/sessoes-contas.js +187 -0
  116. package/dist/sessoes-inventario.js +6 -12
  117. package/dist/sessoes.js +87 -3
  118. package/dist/ship.js +110 -20
  119. package/dist/thread.js +212 -14
  120. package/dist/util.js +71 -4
  121. package/dist/verify.js +2 -2
  122. package/dist/worktree.js +34 -8
  123. package/eval/casos/onboarding.json +1 -1
  124. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  125. package/package.json +7 -3
  126. package/references/definition-of-done.md +1 -1
  127. package/skills/README.md +1 -1
  128. package/skills/core/onboarding/SKILL.md +3 -2
  129. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  130. package/skills/phases/master-metrics/SKILL.md +8 -3
  131. package/skills/phases/ship-release/SKILL.md +6 -3
@@ -56,13 +56,19 @@ exports.decodificarVetor = decodificarVetor;
56
56
  exports.lerIndice = lerIndice;
57
57
  exports.serializarIndice = serializarIndice;
58
58
  exports.gravarIndice = gravarIndice;
59
- exports.universoDoTenant = universoDoTenant;
59
+ exports.conferirUniverso = conferirUniverso;
60
+ exports.universoDaBusca = universoDaBusca;
61
+ exports.codigoDaFalha = codigoDaFalha;
60
62
  exports.conteudoRecusado = conteudoRecusado;
63
+ exports.indexavel = indexavel;
61
64
  exports.tokensEstimados = tokensEstimados;
62
65
  exports.dimDoModeloLocal = dimDoModeloLocal;
63
66
  exports.codigoDeEmbedding = codigoDeEmbedding;
64
67
  exports.espacoDoAlvo = espacoDoAlvo;
65
68
  exports.indexar = indexar;
69
+ exports.avisoDeCobertura = avisoDeCobertura;
70
+ exports.textoForaDaBusca = textoForaDaBusca;
71
+ exports.textoDoIndice = textoDoIndice;
66
72
  exports.vetoresCoerentes = vetoresCoerentes;
67
73
  const fs = __importStar(require("node:fs"));
68
74
  const os = __importStar(require("node:os"));
@@ -170,18 +176,48 @@ function gravarIndice(arquivo, indice) {
170
176
  return true;
171
177
  }
172
178
  /**
173
- * Universo do tenant: o export governado das colecoes do ork (filtro de injecao e visibilidade
174
- * da biblioteca), com checagem EXPLICITA do tenant antes de qualquer texto ir ao embed.
179
+ * RM-038 (D6): a fronteira do universo no `ork`, num lugar so. Entrada de outro tenant, de colecao
180
+ * fora do ork ou com id repetido e violacao tipada, nunca descarte silencioso: nada disso vai ao embed.
175
181
  */
176
- function universoDoTenant(fonte, tenant, colecoes = orkmind_1.COLECOES_DO_ORK) {
177
- return colecoes.flatMap(c => fonte.buscar({ collection: c, tags: { project: [tenant] } })
178
- .filter(e => e.collection === c && (e.tags.project ?? []).includes(tenant)))
179
- .sort((a, b) => a.collection.localeCompare(b.collection) || a.id.localeCompare(b.id));
182
+ function conferirUniverso(entradas, tenant, lidoEm = Date.now()) {
183
+ const vistos = new Set();
184
+ for (const e of entradas) {
185
+ if (!(0, orkmind_1.pertenceAoUniverso)(e, tenant, lidoEm) || vistos.has(e.id))
186
+ throw new Error('memory.query.scope-violation');
187
+ vistos.add(e.id);
188
+ }
189
+ }
190
+ /**
191
+ * RM-038 (D4): o universo da busca e do indice, o domicilio unico. A fonte le uma vez (a ponte
192
+ * filtra o tenant na origem e aplica a governanca da biblioteca); aqui a fronteira e conferida de
193
+ * novo, a ordem fica estavel e a contagem por colecao sai pronta para o status e o index.
194
+ */
195
+ function universoDaBusca(fonte, tenant) {
196
+ const lidoEm = Date.now();
197
+ const lido = fonte.universo(tenant);
198
+ conferirUniverso(lido.entradas, tenant, lidoEm);
199
+ const entradas = [...lido.entradas].sort((a, b) => a.collection.localeCompare(b.collection) || a.id.localeCompare(b.id));
200
+ const porColecao = Object.fromEntries(orkmind_1.COLECOES_DO_ORK.map(c => [c, 0]));
201
+ for (const e of entradas)
202
+ porColecao[e.collection] += 1;
203
+ return { tenant, lidoEm, entradas, porColecao, foraDaBusca: lido.foraDaBusca,
204
+ ...(lido.latenciaMs === undefined ? {} : { latenciaMs: lido.latenciaMs }) };
205
+ }
206
+ /** Codigo tipado de uma falha (`memory.query.window-saturated`), ou o padrao quando nao ha. */
207
+ function codigoDaFalha(erro, padrao = 'memory.universo.indisponivel') {
208
+ return /^[a-z]+(?:\.[a-z-]+)+/.exec(erro instanceof Error ? erro.message : '')?.[0] ?? padrao;
180
209
  }
181
210
  /** Conteudo que nunca vai ao provider: padrao de segredo da policy ou URL com credencial. */
182
211
  function conteudoRecusado(conteudo) {
183
212
  return (0, policies_1.procurarSegredos)(conteudo).length > 0 || URL_COM_CREDENCIAL.test(conteudo);
184
213
  }
214
+ /**
215
+ * RM-038: o indice embeda a entrada? Nao embeda texto vazio, acima do limite nem com padrao de
216
+ * segredo. Domicilio unico para o `indexar` e para o aviso de cobertura do status.
217
+ */
218
+ function indexavel(e) {
219
+ return e.content.trim() !== '' && e.content.length <= orkmind_1.EMBED_MAX_CARACTERES && !conteudoRecusado(e.content);
220
+ }
185
221
  function tokensEstimados(conteudo) {
186
222
  return Math.ceil(conteudo.length / exports.CARACTERES_POR_TOKEN);
187
223
  }
@@ -236,13 +272,20 @@ function espacoDoAlvo(config, alvo, env = process.env) {
236
272
  * que ja voltaram, porque cada vetor gravado e coerente por si.
237
273
  */
238
274
  function indexar(o) {
275
+ // RM-038 (D6): conferir de novo antes de qualquer coisa; nada de outro tenant vai ao embed, nem de
276
+ // um chamador que montou o universo a mao. Violacao falha alto, nunca vira descarte silencioso.
277
+ if (o.universo.tenant !== o.tenant)
278
+ throw new Error('memory.query.scope-violation');
279
+ conferirUniverso(o.universo.entradas, o.tenant, o.universo.lidoEm);
239
280
  const espaco = espacoDoAlvo(o.config, o.alvo, o.env);
240
- const universo = o.universo.filter(e => (e.tags.project ?? []).includes(o.tenant));
281
+ const universo = o.universo.entradas;
241
282
  const foraDoLimite = universo.filter(e => e.content.length > orkmind_1.EMBED_MAX_CARACTERES);
242
283
  const recusados = universo.filter(e => e.content.length <= orkmind_1.EMBED_MAX_CARACTERES && conteudoRecusado(e.content));
243
- const indexaveis = universo.filter(e => e.content.length <= orkmind_1.EMBED_MAX_CARACTERES && !conteudoRecusado(e.content) && e.content.trim());
284
+ const indexaveis = universo.filter(indexavel);
244
285
  const base = { alvo: o.alvo, modelo: null, dim: null, arquivo: null, dryRun: o.dryRun,
245
- universo: universo.length, coerentes: 0, embedados: 0, reescritos: 0, removidos: 0, recusados: recusados.length,
286
+ universo: universo.length, porColecao: { ...o.universo.porColecao }, foraDaBusca: o.universo.foraDaBusca,
287
+ latenciaUniversoMs: o.universo.latenciaMs ?? null,
288
+ coerentes: 0, embedados: 0, reescritos: 0, removidos: 0, recusados: recusados.length,
246
289
  foraDoLimite: foraDoLimite.length, truncados: 0, tokensEstimados: 0, custoEstimadoUsd: 0, chamadasAoProvider: 0, motivo: null, detalhe: '' };
247
290
  if ('motivo' in espaco) {
248
291
  const tokens = indexaveis.reduce((t, e) => t + tokensEstimados(e.content), 0);
@@ -302,6 +345,40 @@ function indexar(o) {
302
345
  return { ...r, motivo, detalhe: `indexacao interrompida depois de ${r.embedados} vetor(es); os lotes concluidos ficaram gravados` };
303
346
  return r;
304
347
  }
348
+ /**
349
+ * RM-038 (D7): o aviso de cobertura, o mesmo no status e na busca. Reindexar so e sugerido quando
350
+ * resolve; o que o indice nunca embeda (vazio, acima do limite, padrao de segredo) e dito a parte.
351
+ */
352
+ function avisoDeCobertura(coerentes, entradas, alvo, onde = '') {
353
+ if (coerentes >= entradas.length)
354
+ return null;
355
+ const foraPorDesenho = entradas.filter(e => !indexavel(e)).length;
356
+ const base = `o indice cobre ${coerentes} de ${entradas.length} entrada(s) que a busca enxerga${onde}`;
357
+ if (coerentes < entradas.length - foraPorDesenho)
358
+ return `${base}: rode ork memory index${alvo === 'fallback' ? ' --modelo fallback' : ''}`;
359
+ return `${base}; ${foraPorDesenho} fica(m) fora do indice por desenho (vazia, acima de ${orkmind_1.EMBED_MAX_CARACTERES} caracteres ou com padrao de segredo)`;
360
+ }
361
+ /** RM-038: a linha do que fica fora da busca, a mesma no `ork memory index` e no `ork memory status`. */
362
+ function textoForaDaBusca(f) {
363
+ return f ? `${f.injecao} com injection_risk e ${f.expiradas} expirada(s) (governanca da biblioteca), ` +
364
+ `${f.outrasColecoes} em outras colecoes (fora da busca do ork); nada disso vai ao embed` : 'nao medido nesta base';
365
+ }
366
+ /** Texto de `ork memory index`: de que universo, o que foi (ou seria) embedado e quanto custa estimado. */
367
+ function textoDoIndice(r) {
368
+ const custo = r.custoEstimadoUsd === null ? 'nao estimado' : `US$ ${r.custoEstimadoUsd.toFixed(8)}`;
369
+ const colecoes = Object.entries(r.porColecao).map(([c, n]) => `${c} ${n}`).join(', ');
370
+ return [
371
+ `Indice vetorial (${r.alvo}${r.dryRun ? ', --dry-run' : ''}): ${r.modelo ?? '(sem modelo)'}${r.dim ? ` / ${r.dim} dim` : ''}`,
372
+ ` universo da busca ${r.universo} entrada(s): ${colecoes}; coerentes ${r.coerentes}`,
373
+ ` fora da busca ${textoForaDaBusca(r.foraDaBusca)}`,
374
+ ` embedados ${r.embedados} (reescritos ${r.reescritos}); removidos ${r.removidos}`,
375
+ ` fora do indice ${r.recusados} recusada(s) por padrao de segredo, ${r.foraDoLimite} acima do limite`,
376
+ ...(r.truncados ? [` truncados ${r.truncados} acima do contexto do modelo local, embedados pelo comeco`] : []),
377
+ ` estimativa ${r.tokensEstimados} token(s), ${custo}; chamadas ao provider ${r.chamadasAoProvider}`,
378
+ ...(r.arquivo ? [` arquivo ${r.arquivo}`] : []),
379
+ ...(r.motivo ? [` motivo ${r.motivo}: ${r.detalhe}`] : r.detalhe ? [` ${r.detalhe}`] : []),
380
+ ].join('\n');
381
+ }
305
382
  /** Vetores coerentes de um indice para o universo informado: a base da busca e da cobertura. */
306
383
  function vetoresCoerentes(indice, universo) {
307
384
  const saida = new Map();
package/dist/indice.js CHANGED
@@ -63,7 +63,9 @@ function calcularIndice(eventos) {
63
63
  const parcelas = [];
64
64
  let valor = exports.INDICE_BASE;
65
65
  for (const insumo of exports.INSUMOS_DO_INDICE) {
66
- const ocorrencias = eventos.filter((e) => e.tipo === insumo.evento).length;
66
+ // Ensaio de 03/10/2026 (RM-049): o `ork ship --dry-run` barrado grava `ship_blocked` com `dryRun: true`;
67
+ // ensaio nao e tropeco da entrega, como ja nao e pausa no board (fatia 2 do ensaio da 0.5.0, P2).
68
+ const ocorrencias = eventos.filter((e) => e.tipo === insumo.evento && e.dryRun !== true).length;
67
69
  if (ocorrencias === 0)
68
70
  continue;
69
71
  const bruto = insumo.peso * ocorrencias;
package/dist/init.js CHANGED
@@ -46,6 +46,7 @@ exports.baseBranchDetectada = baseBranchDetectada;
46
46
  exports.verifyDetectado = verifyDetectado;
47
47
  exports.detectar = detectar;
48
48
  exports.manifestoYaml = manifestoYaml;
49
+ exports.exigirRepositorioParaInit = exigirRepositorioParaInit;
49
50
  exports.init = init;
50
51
  const fs = __importStar(require("node:fs"));
51
52
  const path = __importStar(require("node:path"));
@@ -68,7 +69,12 @@ function nomeDetectado(dirInicial) {
68
69
  : path.basename(raizDoRepo(dirInicial));
69
70
  return base.replace(/-(novo|new|old|repo|main)$/i, '').toLowerCase();
70
71
  }
71
- /** Branch base do repositorio: origin/HEAD, senao main, senao master, senao a atual. */
72
+ /**
73
+ * Branch base do repositorio: origin/HEAD, senao main, senao master, senao a do HEAD.
74
+ * A do HEAD vem de `symbolic-ref`, que responde tambem no repositorio ainda sem commit (ensaio
75
+ * da 0.5.0: o `git init` sem `init.defaultBranch` nasce em `master`, e o `rev-parse` falhava e
76
+ * caia em `main`). HEAD destacado nao e branch: vale `main`.
77
+ */
72
78
  function baseBranchDetectada(raiz) {
73
79
  const origem = (0, util_1.exec)('git', ['symbolic-ref', '--quiet', 'refs/remotes/origin/HEAD'], raiz);
74
80
  if (origem.ok && origem.stdout.trim()) {
@@ -79,8 +85,7 @@ function baseBranchDetectada(raiz) {
79
85
  return candidata;
80
86
  }
81
87
  }
82
- const atual = (0, util_1.exec)('git', ['rev-parse', '--abbrev-ref', 'HEAD'], raiz);
83
- return atual.ok ? atual.stdout.trim() : 'main';
88
+ return (0, util_1.branchDoHead)(raiz) ?? 'main';
84
89
  }
85
90
  function gerenciadorDetectado(dir) {
86
91
  if (fs.existsSync(path.join(dir, 'pnpm-lock.yaml')))
@@ -188,6 +193,8 @@ conduction:
188
193
  worktree:
189
194
  base_branch: "${d.baseBranch}"
190
195
  dir: ".claude/worktrees"
196
+ # true: o ork thread new cria a worktree e a branch da thread sem flag (--sem-worktree cria sem);
197
+ # false ou ausente: só com --worktree auto
191
198
  por_thread: true
192
199
 
193
200
  verify:
@@ -255,6 +262,20 @@ policies:
255
262
  push_direto_na_base: block
256
263
  `;
257
264
  }
265
+ /**
266
+ * Ensaio de 03/10/2026 (RM-049): o `ork init` rodado por engano fora de um repositorio (no HOME, por
267
+ * exemplo) gravava manifesto, `AGENTS.md` e `.orkastery/` ali e saia 0; um repositorio criado depois
268
+ * dentro dessa pasta herdava o manifesto de fora, com outro nome e outra abbrev, e o doctor dizia PRONTO.
269
+ * A CLI recusa antes de gravar qualquer coisa. A funcao `init` segue aceitando qualquer pasta (demo e
270
+ * canarios montam o projeto por ela).
271
+ */
272
+ function exigirRepositorioParaInit(dir) {
273
+ const r = (0, util_1.exec)('git', ['rev-parse', '--is-inside-work-tree'], dir);
274
+ if (r.ok && r.stdout.trim() === 'true')
275
+ return;
276
+ throw new Error(`init.fora-do-repositorio: ${path.resolve(dir)} não está num repositório git; nada foi criado. ` +
277
+ 'Entre no repositório do projeto (ou crie um com git init e o primeiro commit) e rode ork init de novo.');
278
+ }
258
279
  /** Gera o manifesto e o esqueleto de `.orkastery/`. Nao sobrescreve sem `force`. */
259
280
  function init(dirInicial, opcoes = {}) {
260
281
  const deteccao = detectar(dirInicial, opcoes.nome, opcoes.abbrev);
@@ -264,6 +285,8 @@ function init(dirInicial, opcoes = {}) {
264
285
  return { caminho, criado: false, deteccao };
265
286
  }
266
287
  (0, util_1.gravar)(caminho, manifestoYaml(deteccao));
267
- fs.mkdirSync(path.join(deteccao.raiz, manifest_1.DIR_ESTADO, 'threads'), { recursive: true });
268
- return { caminho, criado: true, deteccao };
288
+ const estado = path.join(deteccao.raiz, manifest_1.DIR_ESTADO);
289
+ fs.mkdirSync(path.join(estado, 'threads'), { recursive: true });
290
+ // Fatia 2 do ensaio da 0.5.0 (P3): o estado e da maquina; fica fora do git sem mexer no `.gitignore` do usuario.
291
+ return { caminho, criado: true, deteccao, estadoIgnorado: (0, util_1.ignorarPastaNoGit)(estado, deteccao.raiz) };
269
292
  }
@@ -14,4 +14,8 @@ exports.TESTES_DE_INTEGRACAO_LOCAL = new Set([
14
14
  'mcp-git.test.js', 'mcp-server.test.js', 'mcp-ship.test.js', 'mcp-verify.test.js',
15
15
  'memory-native-preparation.test.js', 'memory-native-schema.test.js', 'memory-prospective.test.js',
16
16
  'memory-publication-profile.test.js', 'native-fixture.test.js', 'orkmind-transport.test.js', 'verify-sandbox.test.js',
17
+ // RM-037 (fatia 3): o worker do ork_git_commit e o sandbox do verify de verdade, como no mcp-git.test.js.
18
+ 'rm037-fatia3-hard-link-mcp-git.test.js', 'rm037-fatia3-lease-mcp-git.test.js',
19
+ // RM-038 (fatia de correcao): a ponte com o GovernedStore real da biblioteca instalada.
20
+ 'rm038-universo-ponte.test.js',
17
21
  ]);