@orkastery/cli 0.5.1 → 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 (110) hide show
  1. package/adapters/claude-code/agents/ork-master.md +2 -0
  2. package/adapters/claude-code/commands/master.md +8 -0
  3. package/adapters/claude-code/commands/ork.md +9 -0
  4. package/adapters/codex/skills/ork/SKILL.md +18 -3
  5. package/adapters/hermes/README.md +1 -0
  6. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  7. package/adapters/hermes/hermes.plugin.json +1 -0
  8. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  9. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +6 -5
  10. package/adapters/openclaw/README.md +24 -4
  11. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  12. package/adapters/openclaw/dist/index.js +46 -11
  13. package/adapters/openclaw/openclaw.plugin.json +5 -1
  14. package/adapters/openclaw/package.json +2 -2
  15. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  16. package/adapters/openclaw/src/index.ts +49 -11
  17. package/assets/orkmind_bridge.py +117 -9
  18. package/dist/adapters/claude-bg.js +39 -5
  19. package/dist/adapters/codex.js +4 -3
  20. package/dist/agents-md.js +1 -0
  21. package/dist/auditrun.js +5 -1
  22. package/dist/board.js +16 -14
  23. package/dist/branch-de-estado.js +66 -10
  24. package/dist/busca-semantica.js +52 -12
  25. package/dist/canarios-rm057.js +149 -0
  26. package/dist/canarios.js +2 -0
  27. package/dist/ci.js +8 -1
  28. package/dist/claims.js +39 -1
  29. package/dist/company-brain-context.js +158 -22
  30. package/dist/docs.js +48 -9
  31. package/dist/doctor-pulse-cron.js +194 -0
  32. package/dist/doctor-rede.js +149 -0
  33. package/dist/doctor.js +89 -9
  34. package/dist/entrega-pr.js +20 -8
  35. package/dist/esgotamentos.js +181 -0
  36. package/dist/experiencia.js +12 -2
  37. package/dist/fabrica-estado.js +14 -6
  38. package/dist/fabrica-publicar.js +6 -0
  39. package/dist/fechamento.js +20 -66
  40. package/dist/forja.js +31 -7
  41. package/dist/gates.js +5 -1
  42. package/dist/hitl-contract.js +59 -4
  43. package/dist/hitl-curto.js +11 -6
  44. package/dist/hitl-gates.js +5 -0
  45. package/dist/hitl-lote.js +5 -2
  46. package/dist/hitl-resumo.js +9 -0
  47. package/dist/hitl-tempo-parado.js +201 -0
  48. package/dist/hitl-texto-livre.js +5 -5
  49. package/dist/horario.js +27 -0
  50. package/dist/hosts.js +52 -10
  51. package/dist/impedimento.js +205 -0
  52. package/dist/index.js +391 -74
  53. package/dist/indice-vetorial.js +87 -10
  54. package/dist/indice.js +3 -1
  55. package/dist/init.js +17 -0
  56. package/dist/integracoes-locais.js +2 -0
  57. package/dist/intelligence-graph-cli.js +91 -8
  58. package/dist/intelligence-graph-contexto.js +215 -0
  59. package/dist/intelligence-graph-parsers.js +6 -4
  60. package/dist/leases.js +664 -87
  61. package/dist/ledger-stats.js +15 -1
  62. package/dist/ledger.js +3 -0
  63. package/dist/licoes.js +1 -0
  64. package/dist/maestro-runtime.js +4 -1
  65. package/dist/manifest.js +20 -1
  66. package/dist/master-nota.js +14 -5
  67. package/dist/master.js +129 -12
  68. package/dist/mcp-artifacts.js +34 -3
  69. package/dist/mcp-git.js +20 -3
  70. package/dist/mcp-grafo-worker.js +5 -3
  71. package/dist/mcp-grafo.js +50 -4
  72. package/dist/mcp-server.js +14 -1
  73. package/dist/memoria.js +48 -6
  74. package/dist/network-roadmap.js +191 -16
  75. package/dist/ocupacao.js +11 -3
  76. package/dist/orkmind.js +90 -5
  77. package/dist/orquestracao.js +12 -10
  78. package/dist/parado-no-condutor.js +188 -32
  79. package/dist/phase.js +68 -15
  80. package/dist/policies.js +52 -1
  81. package/dist/portfolio.js +4 -1
  82. package/dist/projeto-alvo.js +5 -1
  83. package/dist/prompts.js +36 -1
  84. package/dist/prova-ativacao.js +75 -6
  85. package/dist/pulse-delivery.js +34 -2
  86. package/dist/pulse.js +49 -3
  87. package/dist/ratelimit.js +20 -4
  88. package/dist/recall.js +3 -1
  89. package/dist/rede-adesao.js +399 -0
  90. package/dist/rede-forja.js +289 -0
  91. package/dist/rede-projetos.js +239 -0
  92. package/dist/rede-status.js +336 -0
  93. package/dist/rede.js +980 -0
  94. package/dist/retry.js +69 -2
  95. package/dist/roadmap-status.js +23 -3
  96. package/dist/runtime-profiles.js +22 -1
  97. package/dist/saida-segura.js +58 -0
  98. package/dist/session-watcher-claude.js +113 -23
  99. package/dist/sessoes-contas.js +187 -0
  100. package/dist/sessoes-inventario.js +6 -18
  101. package/dist/sessoes.js +83 -2
  102. package/dist/ship.js +85 -19
  103. package/dist/thread.js +192 -13
  104. package/dist/worktree.js +5 -2
  105. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  106. package/package.json +7 -3
  107. package/references/definition-of-done.md +1 -1
  108. package/skills/README.md +1 -1
  109. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  110. package/skills/phases/master-metrics/SKILL.md +8 -3
package/dist/index.js CHANGED
@@ -42,6 +42,7 @@ exports.main = main;
42
42
  const company_brain_cli_1 = require("./company-brain-cli");
43
43
  const estado_thread_1 = require("./estado-thread");
44
44
  const intelligence_graph_cli_1 = require("./intelligence-graph-cli");
45
+ const mcp_grafo_1 = require("./mcp-grafo");
45
46
  const maestro_cli_1 = require("./maestro-cli");
46
47
  const hitl_public_receipt_1 = require("./hitl-public-receipt");
47
48
  const hitl_presentation_1 = require("./hitl-presentation");
@@ -106,6 +107,7 @@ const agents_md_1 = require("./agents-md");
106
107
  const leases_1 = require("./leases");
107
108
  const sessoes_inventario_1 = require("./sessoes-inventario");
108
109
  const ledger_stats_1 = require("./ledger-stats");
110
+ const esgotamentos_1 = require("./esgotamentos");
109
111
  const sessoes_adopt_1 = require("./sessoes-adopt");
110
112
  const sessoes_1 = require("./sessoes");
111
113
  const runtime_ambiente_1 = require("./runtime-ambiente");
@@ -145,9 +147,15 @@ const thread_1 = require("./thread");
145
147
  const docs_1 = require("./docs");
146
148
  const roadmap_reservas_1 = require("./roadmap-reservas");
147
149
  const fabrica_estado_1 = require("./fabrica-estado");
150
+ const branch_de_estado_1 = require("./branch-de-estado");
148
151
  const network_roadmap_1 = require("./network-roadmap");
149
152
  const fabrica_publicar_1 = require("./fabrica-publicar");
150
153
  const maquina_1 = require("./maquina");
154
+ const rede_1 = require("./rede");
155
+ const rede_adesao_1 = require("./rede-adesao");
156
+ const saida_segura_1 = require("./saida-segura");
157
+ const rede_forja_1 = require("./rede-forja");
158
+ const rede_status_1 = require("./rede-status");
151
159
  const ledger_1 = require("./ledger");
152
160
  const tokens_1 = require("./tokens");
153
161
  const types_1 = require("./types");
@@ -244,6 +252,9 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
244
252
  [--sem-login] do perfil (nunca copia credencial)
245
253
  accounts remove <id> Desativa o perfil (diretorio e login ficam onde estao)
246
254
  accounts check [<id>] Confere o login de cada perfil e marca o store
255
+ accounts esgotamentos [--desde 7d] [--json]
256
+ Despachos numa conta que outro projeto desta maquina viu esgotada
257
+ (RM-040), so leitura: conta opaca, perfil pelo id, sem diretorio
247
258
  setup [<modo>] --reset Volta o modo (ou tudo) ao default
248
259
  setup versionar Leva o setup que vale para orkastery.setup.json: por PR, vale em
249
260
  todas as maquinas e passa a ser o arquivo editado (I-52)
@@ -252,6 +263,9 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
252
263
  [--exige-runtime-diferente] o CHECK precisa de runtime que o GO nao usou
253
264
  [--done "<criterio> :: <comando>"] criterio de pronto EXECUTAVEL (use ;; para varios)
254
265
  [--slug S] [--assunto A] [--worktree auto|DIR] [--dry-run]
266
+ [--sem-worktree] cria sem worktree (na branch base, o ship barra a entrega com
267
+ push_direto_na_base: block, o padrão do ork init); com
268
+ worktree.por_thread: true, a worktree nasce sem flag
255
269
  [--roadmap RM-NNN] reserva o item do roadmap antes de criar (I-47)
256
270
  thread list [--todas] [--json] Threads NAO fechadas do projeto (--todas inclui as fechadas)
257
271
  thread close <id> --motivo orfa|engano|superada --por Q --justificativa J
@@ -277,6 +291,8 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
277
291
  efetivo vai ao ledger como fato verificavel)
278
292
  [--canal C] [--correlacao ID] Canal de origem (sem ele, o que o host declara)
279
293
  [--esperar [min]] Com a thread ja conduzida, espera a vez (sem: recusa na hora)
294
+ [--perfil ID] Conta do despacho (ork accounts list); inexistente, de outro
295
+ runtime, esgotado ou sem login recusa com motivo tipado
280
296
  phase list <thread-id> Historico do ledger da thread
281
297
  (mostra o modelo/esforco reais de cada fase)
282
298
  ledger stats --desde 7d [--ate ISO] Telemetria economica do ledger (intervalo [desde,ate))
@@ -284,11 +300,13 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
284
300
  ledger estimate <thread-id> --sem-ia H --ia-sem-ork H --por Q --metodo M --premissas P
285
301
  [--incerteza I] Registra estimativas explicitas da fase PLAN
286
302
 
287
- sessions [--all] [--global] [--json] Inventário Claude e Codex da conta atual
303
+ sessions [--all] [--global] [--json] Inventário Claude e Codex da conta do processo e de cada perfil
288
304
  [--exigir-limpo] Sai != 0 com fonte inválida ou sessão sem thread
289
305
  sessions adopt <id> [--json] Adota identidade real sem executar prompt
290
306
  sessions event --tipo T --sessao ID Ingere JSON limitado no stdin; observa sem aprovar gates
291
307
  sessions watch --thread T [--sessao ID] Observa somente a sessão selecionada; --once faz uma varredura
308
+ sessions limpar-fantasmas [--dry-run] Solta do ork (sessao_morta no ledger) a sessao sem pid e sem processo;
309
+ [--json] nunca toca no runtime (RM-056)
292
310
  sessions logs <sessao> [--linhas N] Logs de uma sessao
293
311
  sessions supersede <thread> <UUID> --fase F --runtime R Confirma encerramento de sessão superada
294
312
  sessions request <thread> <UUID> --fase F --runtime R --pergunta P Abre pedido vinculado ao prompt nativo
@@ -383,6 +401,7 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
383
401
  completo; --verificar confere contrato, bytes, determinismo e o incremental
384
402
  contra a completa; precisa de typescript e micromark
385
403
  grafo status [--json] Indices guardados, o do HEAD, os analisadores e o tamanho
404
+ grafo contexto <thread> [--json] Pacote da thread com evidencias e medida em bytes [--teto-bytes N]
386
405
  grafo vizinhos <no> [--profundidade N] Vizinhanca de arquivo ou simbolo, com extrator e evidencia de cada aresta
387
406
  [--sentido entrada|saida|ambos] [--tipo T,...] [--limite N] [--json]
388
407
  grafo chamadores <simbolo> Quem chama (arestas calls que chegam) [--profundidade N] [--limite N] [--json]
@@ -395,7 +414,7 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
395
414
 
396
415
  ship <thread-id> --para <branch> Merge --no-ff serializado por lease e push PROVADO
397
416
  ship registrar-pr <thread-id>|--todas A entrega feita por PR vira ship_done: merge ship(<thread>) na base
398
- [--remoto R] [--json] remota e CI verde no head do PR; depois, ork master --aceitar-omissao
417
+ [--remoto R] [--json] remota e CI verde no head do PR; depois, ork master <thread> --aceitar-omissao
399
418
  [--repo <dono/nome> --pr <n>] PR mesclado em repositorio externo de ci.external_repositories
400
419
  [--dry-run] Ensaio: as mesmas conferencias, sem gravar ship_done, fase nem fabrica
401
420
  [--de <branch>] [--remoto origin] [--autorizar-push <quem>] [--sem-push] [--dry-run]
@@ -425,15 +444,19 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
425
444
  master batch --aceitar <thread:assinatura,...> --por <humano>
426
445
  master migrar --dry-run --por Q Inspeciona correções sem alterar originais
427
446
  master digest <enviar|preview|responder> Digest semanal com recibos do host
428
- master <thread-id> --score 0-5 --justificativa "<texto>"
429
- [--classe C[,C]] [--resumo R] [--por Q] [--refazer]
447
+ master <thread-id> --score 0-5 --justificativa "<texto>" --por <seu-nome>
448
+ [--classe C[,C]] [--resumo R] [--refazer]
430
449
  Fecha a thread: POSTMORTEM + MASTER log + score (so do terminal;
431
450
  de processo de host e recusado com master.prova-de-canal)
432
451
  master pedir <thread-id> [--formato telegram|terminal|json]
433
452
  Pede a nota ao dono com codigo curto; ele responde pelo Telegram
434
453
  (<codigo> <0 a 5> <porque>) e a nota vai ao ledger com o recibo (RM-048)
435
454
  master [--todas] [--json] As entregas, com o indice derivado do ledger
436
- master --aceitar-omissao [--json] Aceita as entregues por omissao, com registro
455
+ master <thread-id> --aceitar-omissao Aceita por omissao SO a entrega desta thread, com registro (ou --thread T)
456
+ [--dry-run] [--json] --dry-run lista o que seria fechado, sem gravar
457
+ master --aceitar-omissao [--dry-run] [--json]
458
+ Aceita TODAS as entregues por omissao, listando cada uma
459
+ (de processo de agente com mais de uma, avisa em stderr)
437
460
  master classes As classes de falha fixas do POSTMORTEM
438
461
  licoes [--json] O que volta no GOAL e no PLAN da proxima thread (POSTMORTEM e
439
462
  MASTER) e as propostas de policy por recorrencia (I-55)
@@ -469,6 +492,14 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
469
492
  depois de entrar, sai sozinho ao criar thread, despachar fase,
470
493
  entregar e fechar, e a cada batida do pulse
471
494
  fabrica sair Para de publicar daqui e tira o retrato desta maquina da branch
495
+ network status [--json] [--sem-remoto] A Orkastery Network desta pessoa: as maquinas, de qualquer diretorio,
496
+ com a fonte, as lacunas e o que nao foi lido (RM-053)
497
+ network entrar [--maquina NOME] Esta maquina entra na rede: repositorio privado <usuario>/orkastery-network
498
+ [--forja github|gitlab] [--repositorio [DONO/]NOME] na forja (criado se falta) e o primeiro retrato;
499
+ [--forcar] --forcar toma um nome que outra instalacao usa (fica no commit)
500
+ network publicar [--forcar] [--json] Grava o retrato desta maquina na casa da rede (push sem forca); depois de
501
+ entrar, sai sozinho na batida do pulse e nos eventos de thread
502
+ network sair Para de publicar daqui e tira o retrato desta maquina da casa
472
503
  network roadmap [--projeto P] [--json] Roadmap, reservas e threads de cada maquina de cada projeto, de qualquer diretorio:
473
504
  [--sem-remoto] fonte e hora de cada parte, lacuna tipada no que nao leu. P = caminho do clone,
474
505
  github:dono/repo, gitlab:grupo/repo ou nome conhecido; sem clone, le a forja (RM-054)
@@ -514,7 +545,9 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
514
545
  audit finding estado <id> <estado> Carimba o achado (aberto|adiado|resolvido|descartado)
515
546
 
516
547
  thread new <nome> --from-finding <ID> Abre a thread a partir de um achado de auditoria
517
- [--modo M] [--worktree auto] [--dry-run] (evidencia, claim e proposta viajam junto)
548
+ [--modo M] [--worktree auto] [--sem-worktree] [--dry-run]
549
+ (evidencia, claim e proposta viajam junto; a worktree segue
550
+ worktree.por_thread como no thread new)
518
551
 
519
552
  Regimes de memoria: files (fallback honesto) e orkmind (bloco B6, base propria por tenant
520
553
  declarada em memory.database_url_env pelo NOME da variavel de ambiente, sem fallback).
@@ -574,15 +607,23 @@ function comandoThread(args) {
574
607
  return 2;
575
608
  }
576
609
  }
577
- const brutoWorktreeAchado = args.opcoes.worktree;
578
- const criarWorktreeAchado = brutoWorktreeAchado === true || brutoWorktreeAchado === 'auto';
610
+ // P4 do ensaio da 0.5.0 (D2): a thread do achado segue a mesma regra de worktree do `thread new`.
611
+ let pedidoAchado;
612
+ try {
613
+ pedidoAchado = (0, thread_1.pedidoDeWorktree)({ worktree: args.opcoes.worktree, semWorktree: args.opcoes['sem-worktree'] }, carregado.manifesto.worktree.por_thread);
614
+ }
615
+ catch (e) {
616
+ console.error(e.message);
617
+ return 2;
618
+ }
579
619
  const r = (0, auditrun_1.abrirThreadDoAchado)(carregado, doAchado, {
580
620
  nome: args.posicionais[2],
581
621
  modo: modoAchado ?? undefined,
582
622
  slug: texto(args.opcoes.slug),
583
623
  assunto: texto(args.opcoes.assunto),
584
- criarWorktree: criarWorktreeAchado,
585
- worktree: criarWorktreeAchado ? null : (texto(brutoWorktreeAchado) ?? null),
624
+ criarWorktree: pedidoAchado.criar,
625
+ worktree: pedidoAchado.dir,
626
+ origemDaWorktree: pedidoAchado.origem,
586
627
  dryRun: args.opcoes['dry-run'] === true,
587
628
  });
588
629
  if (!r.ok) {
@@ -607,6 +648,13 @@ function comandoThread(args) {
607
648
  console.log((0, thread_1.resumoDaThread)(r.thread));
608
649
  console.log('');
609
650
  console.log(` slug em 3 partes: ${(0, phase_1.descreverSlug)(r.thread.slug)}`);
651
+ const linhaDaWorktreeDoAchado = (0, thread_1.linhaDaWorktree)(r.worktreePor, gravadaDoAchado);
652
+ if (linhaDaWorktreeDoAchado)
653
+ console.log(linhaDaWorktreeDoAchado);
654
+ const avisoDaWorktreeDoAchado = r.worktreeFalharia ? (0, thread_1.avisoDeWorktreeQueFalharia)(r.worktreeFalharia)
655
+ : (0, thread_1.avisoDaWorktree)(pedidoAchado.origem, { thread: r.thread, gravada: gravadaDoAchado, worktreePor: r.worktreePor }, carregado.manifesto);
656
+ if (avisoDaWorktreeDoAchado)
657
+ console.error(avisoDaWorktreeDoAchado);
610
658
  }
611
659
  if (r.motivo === 'claims.unverifiable') {
612
660
  console.log('');
@@ -673,16 +721,29 @@ function comandoThread(args) {
673
721
  return { criterio, comando };
674
722
  });
675
723
  const dryRun = args.opcoes['dry-run'] === true;
676
- const brutoWorktree = args.opcoes.worktree;
677
- // `--worktree auto` (ou `--worktree` sozinho) cria a worktree isolada da thread;
678
- // um caminho reusa um diretorio que ja existe.
679
- const criarWorktree = brutoWorktree === true || brutoWorktree === 'auto';
724
+ // `--worktree auto` (ou `--worktree` sozinho) cria a worktree isolada da thread; um caminho reusa um
725
+ // diretorio que ja existe. P4 do ensaio da 0.5.0: sem flag, `worktree.por_thread: true` cria como o
726
+ // `--worktree auto`, e `--sem-worktree` cria sem ela. Uso invalido sai antes da reserva do roadmap.
727
+ let pedido;
728
+ try {
729
+ pedido = (0, thread_1.pedidoDeWorktree)({ worktree: args.opcoes.worktree, semWorktree: args.opcoes['sem-worktree'] }, carregado.manifesto.worktree.por_thread);
730
+ }
731
+ catch (e) {
732
+ console.error(e.message);
733
+ return 2;
734
+ }
680
735
  const brutoCiclo = texto(args.opcoes.ciclo) ?? texto(args.opcoes.variante);
681
736
  const variante = brutoCiclo ? (0, ciclos_1.parseVariante)(brutoCiclo) : null;
682
737
  if (brutoCiclo && !variante) {
683
738
  console.error(`variante de ciclo invalida: "${brutoCiclo}". Use uma de: ${Object.keys(ciclos_1.VARIANTES).join(', ')}`);
684
739
  return 2;
685
740
  }
741
+ // P4 do ensaio da 0.5.0 (D4, CHECK): a recusa do ciclo sai antes da reserva do roadmap, como os outros erros de
742
+ // uso; a do `novaThread` fica como defesa de quem o chama direto.
743
+ if (variante && (0, ciclos_1.definicaoDaVariante)(variante).exigeWorktree && pedido.origem === 'sem-worktree') {
744
+ console.error(`uso: o ciclo ${variante} exige worktree isolada: crie a thread sem --sem-worktree ou escolha outro ciclo`);
745
+ return 2;
746
+ }
686
747
  const brutoFatias = texto(args.opcoes.fatias);
687
748
  // I-47: `--roadmap RM-NNN` reserva o item ANTES de criar a thread. A reserva e o passo
688
749
  // atomico entre maquinas (o primeiro push vence); a thread e local. Se a criacao falhar,
@@ -696,8 +757,9 @@ function comandoThread(args) {
696
757
  modo,
697
758
  slug: texto(args.opcoes.slug),
698
759
  assunto: texto(args.opcoes.assunto),
699
- worktree: criarWorktree ? null : (texto(brutoWorktree) ?? null),
700
- criarWorktree,
760
+ worktree: pedido.dir,
761
+ criarWorktree: pedido.criar,
762
+ origemDaWorktree: pedido.origem,
701
763
  dryRun,
702
764
  variante,
703
765
  branch: texto(args.opcoes.branch),
@@ -731,6 +793,11 @@ function comandoThread(args) {
731
793
  console.log((0, thread_1.resumoDaThread)(thread));
732
794
  console.log('');
733
795
  console.log(` slug em 3 partes: ${(0, phase_1.descreverSlug)(thread.slug)}`);
796
+ const linhaDaWorktreeNova = (0, thread_1.linhaDaWorktree)(criada.worktreePor, gravada, variante);
797
+ if (linhaDaWorktreeNova)
798
+ console.log(linhaDaWorktreeNova);
799
+ const avisoDaWorktreeNova = criada.worktreeFalharia ? (0, thread_1.avisoDeWorktreeQueFalharia)(criada.worktreeFalharia)
800
+ : (0, thread_1.avisoDaWorktree)(pedido.origem, criada, carregado.manifesto);
734
801
  const avisoSemBase = (0, thread_1.avisoDeThreadSemBase)(thread, gravada);
735
802
  if (gravada) {
736
803
  console.log(` estado: .orkastery/threads/${thread.id}/thread.json`);
@@ -743,6 +810,8 @@ function comandoThread(args) {
743
810
  console.log(`Proximo passo: ork phase run ${thread.id} ${thread.faseAtual} --prompt "<pedido>"`);
744
811
  }
745
812
  }
813
+ if (avisoDaWorktreeNova)
814
+ console.error(avisoDaWorktreeNova);
746
815
  if (avisoSemBase)
747
816
  console.error(avisoSemBase);
748
817
  return 0;
@@ -980,7 +1049,20 @@ function comandoAccounts(args) {
980
1049
  imprimir();
981
1050
  return falhas > 0 ? 1 : 0;
982
1051
  }
983
- console.error(`subcomando desconhecido: accounts ${sub} (use list, add, remove ou check)`);
1052
+ if (sub === 'esgotamentos') {
1053
+ // RM-040 (B7): so leitura do registro de contas e dos ledgers dos projetos registrados.
1054
+ let relatorio;
1055
+ try {
1056
+ relatorio = (0, esgotamentos_1.relatorioDeEsgotamentos)({ desde: texto(args.opcoes.desde) ?? '7d' });
1057
+ }
1058
+ catch (e) {
1059
+ console.error(`${e.message} (use --desde 7d, 24h, 30m ou uma data ISO)`);
1060
+ return 2;
1061
+ }
1062
+ console.log(args.opcoes.json === true ? JSON.stringify(relatorio, null, 2) : (0, esgotamentos_1.textoDosEsgotamentos)(relatorio));
1063
+ return 0;
1064
+ }
1065
+ console.error(`subcomando desconhecido: accounts ${sub} (use list, add, remove, check ou esgotamentos)`);
984
1066
  return 2;
985
1067
  }
986
1068
  function comandoSetup(args) {
@@ -1085,6 +1167,7 @@ function comandoPhase(args) {
1085
1167
  runtime: texto(args.opcoes.runtime),
1086
1168
  model: texto(args.opcoes.model),
1087
1169
  effort: texto(args.opcoes.effort),
1170
+ perfil: texto(args.opcoes.perfil),
1088
1171
  dryRun: args.opcoes['dry-run'] === true,
1089
1172
  canal: conducao.canal,
1090
1173
  ...(conducao.correlacao ? { correlacao: conducao.correlacao } : {}),
@@ -1281,6 +1364,15 @@ function comandoSessions(args) {
1281
1364
  console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, sessoes_1.textoDoInventario)(r));
1282
1365
  return !r.ok || (args.opcoes['exigir-limpo'] === true && r.semThread > 0) ? 1 : 0;
1283
1366
  }
1367
+ if (sub === 'limpar-fantasmas') {
1368
+ if (!carregado) {
1369
+ console.error('ork sessions limpar-fantasmas precisa de um projeto (orkastery.yaml)');
1370
+ return 2;
1371
+ }
1372
+ const r = (0, sessoes_2.limparFantasmas)(raiz, { dryRun: args.opcoes['dry-run'] === true });
1373
+ console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, sessoes_2.textoDaLimpeza)(r));
1374
+ return r.ok ? 0 : 1;
1375
+ }
1284
1376
  if (sub === 'hitl') {
1285
1377
  return comandoSessionsHitl(args, carregado ? raiz : '');
1286
1378
  }
@@ -1467,6 +1559,13 @@ function comandoClaims(args) {
1467
1559
  console.log('');
1468
1560
  console.log('AVISO: alegacao negativa sem comando de verificacao reprova em `ork verify`.');
1469
1561
  }
1562
+ // RM-008 (B8): a conferencia local da policy claim_sem_prova_local avisa e segue.
1563
+ const linhasDePolicy = (0, policies_1.linhasDeAviso)(claim.avisosDePolicy ?? []);
1564
+ if (linhasDePolicy.length) {
1565
+ console.log('');
1566
+ for (const l of linhasDePolicy)
1567
+ console.log(l);
1568
+ }
1470
1569
  // I-53 (RM-037, P6): o lint avisa aqui; a suite inteira e recusada no `ci prepare`.
1471
1570
  for (const a of claim.lint ?? []) {
1472
1571
  console.log('');
@@ -1545,6 +1644,11 @@ function comandoVerify(args) {
1545
1644
  for (const c of b.comandos) {
1546
1645
  console.log(` ${c.nome.padEnd(10)} ${c.ok ? 'passava' : `ja falhava (codigo ${c.code})`} ${c.comando}`);
1547
1646
  }
1647
+ if (b.comandos.some((c) => !c.ok)) {
1648
+ // Ensaio de 03/10 (R7): "ja falhava" sem dizer onde ver a saida do comando.
1649
+ console.log(` saida de quem falhou: as ultimas linhas em ${(0, thread_1.caminhoThread)(carregado.raiz, id)}, campo baseline.comandos ` +
1650
+ `(resumo e trecho); o evento baseline_recorded esta em ork phase list ${id}`);
1651
+ }
1548
1652
  if (b.comandos.length === 0) {
1549
1653
  // Fatia 2 do ensaio da 0.5.0 (R5): a baseline foi gravada; o que falta e comando, nao baseline.
1550
1654
  console.log(' (nenhum comando em verify: no manifesto: a baseline guarda so o commit, e o verify nao tem como separar regressao de divida)');
@@ -1968,6 +2072,9 @@ function comandoShip(args) {
1968
2072
  console.error('uso: ork ship registrar-pr <thread-id> [--repo <dono/nome> --pr <n>] | --todas [--remoto R] [--json] [--dry-run]');
1969
2073
  return 2;
1970
2074
  }
2075
+ // RM-047: o `--remoto` da linha de comando so chega ao git como nome de remoto (ship.remoto-invalido).
2076
+ if (args.opcoes.remoto !== undefined)
2077
+ (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
1971
2078
  // RM-037 (fatia 3, defeito 6): o `--dry-run` era ignorado, e o ensaio gravava o ship_done de verdade.
1972
2079
  const dryRun = args.opcoes['dry-run'] === true;
1973
2080
  const r = alvo && repo ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun })]
@@ -1982,11 +2089,26 @@ function comandoShip(args) {
1982
2089
  console.log('Nenhuma thread aberta com merge ship(<thread>) na base.');
1983
2090
  for (const x of r)
1984
2091
  console.log(` ${x.thread.padEnd(20)} ${x.acao.padEnd(13)} ${x.motivo}`);
2092
+ // RM-044 (A3): a pagina que o push da base vai reprovar em docs.paridade.merge, com o comando que corrige.
2093
+ // So aviso: nada e gravado e o codigo de saida nao muda.
2094
+ const pendentes = r.flatMap((x) => x.docsPendentes.map((d) => ({ thread: x.thread, ...d })));
2095
+ if (pendentes.length) {
2096
+ console.log('');
2097
+ console.log(`Aviso: ${pendentes.length} pagina(s) do roadmap com estado.codigo fora de "Mesclado" depois do merge; o push da base reprova em docs.paridade.merge:`);
2098
+ for (const d of pendentes) {
2099
+ console.log(` ${d.id} (${d.arquivo}): merge ${d.merge.slice(0, 7)} de ship(${d.thread}), estado.codigo "${d.codigo || 'vazio'}"`);
2100
+ console.log(` ${d.comando} (num PR de docs sobre a base atualizada)`);
2101
+ }
2102
+ }
1985
2103
  const registradas = r.filter((x) => x.acao === 'registrou').length;
1986
2104
  const registrariam = r.filter((x) => x.acao === 'registraria').length;
1987
2105
  if (registradas) {
1988
2106
  console.log('');
1989
- console.log(`${registradas} entrega(s) registrada(s). Fechar pelo MASTER: ork master --aceitar-omissao (a nota humana sobrescreve).`);
2107
+ // RM-008 (03/10): o texto ensina a forma COM a thread. A forma sem thread fechava tambem as
2108
+ // entregues de outras frentes paralelas, e era ela que os condutores copiavam daqui.
2109
+ console.log(`${registradas} entrega(s) registrada(s). Fechar pelo MASTER so a(s) desta entrega (a nota humana sobrescreve):`);
2110
+ for (const x of r.filter((y) => y.acao === 'registrou'))
2111
+ console.log(` ork master ${x.thread} --aceitar-omissao`);
1990
2112
  }
1991
2113
  if (registrariam) {
1992
2114
  console.log('');
@@ -2000,6 +2122,10 @@ function comandoShip(args) {
2000
2122
  console.error('uso: ork ship <thread-id> --para <branch> [--de <branch>] [--dry-run]');
2001
2123
  return 2;
2002
2124
  }
2125
+ // RM-047: como no registrar-pr, o `--remoto` so chega ao git como nome de remoto (ship.remoto-invalido),
2126
+ // e `--remoto` sem valor nao vira `origin` em silencio.
2127
+ if (args.opcoes.remoto !== undefined)
2128
+ (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
2003
2129
  const autorizar = args.opcoes['autorizar-push'];
2004
2130
  const r = (0, ship_1.ship)(carregado, id, {
2005
2131
  para,
@@ -2194,10 +2320,15 @@ function comandoCi(args) {
2194
2320
  if (sub === 'status') {
2195
2321
  const sha = texto(args.opcoes.sha) ?? args.posicionais[2] ?? (0, util_1.exec)('git', ['rev-parse', 'HEAD'], carregado.raiz).stdout.trim();
2196
2322
  if (!/^[0-9a-f]{40}$/.test(sha)) {
2197
- console.error('uso: ork ci status --sha <commit> [--remoto origin]');
2323
+ // Ensaio de 03/10 (R4): `--sha HEAD` ou um sha curto respondiam so a linha de uso, sem dizer por que.
2324
+ console.error('erro: ci status: --sha exige o sha completo, de 40 caracteres hexadecimais minusculos ' +
2325
+ '(git rev-parse HEAD); o check e consultado no commit exato, nunca por ref nem prefixo');
2326
+ console.error('uso: ork ci status --sha <sha de 40 caracteres> [--remoto origin]');
2198
2327
  return 2;
2199
2328
  }
2200
- const result = (0, ci_1.consultarCi)(carregado, sha, texto(args.opcoes.remoto) ?? 'origin');
2329
+ // RM-047: recusa o `--remoto` que nao e nome de remoto mesmo com o gate de CI desligado.
2330
+ const remoto = (0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto === undefined ? 'origin' : args.opcoes.remoto, 'ci');
2331
+ const result = (0, ci_1.consultarCi)(carregado, sha, remoto);
2201
2332
  console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : `${result.ok ? 'CI VERDE' : 'CI NÃO LIBEROU'}: ${result.detail}`);
2202
2333
  return result.ok ? 0 : 1;
2203
2334
  }
@@ -2324,7 +2455,11 @@ const CONTRATO_DO_BOARD = 'ork.board/v1';
2324
2455
  function comandoFabrica(args) {
2325
2456
  const carregado = (0, manifest_1.exigirManifesto)();
2326
2457
  const sub = args.posicionais[1];
2458
+ // RM-047: o remoto vem do manifesto de quem fez o repositorio; fora do formato, recusa antes do git.
2459
+ // O `publicar` recusa dentro do try (publicarMaquina), para o silencioso deixar a recusa no log.
2327
2460
  const remoto = texto(args.opcoes.remoto) ?? carregado.manifesto.fabrica.remoto;
2461
+ if (sub !== 'publicar')
2462
+ (0, branch_de_estado_1.exigirRemoto)(remoto, 'fabrica');
2328
2463
  if (sub === 'publicar') {
2329
2464
  const silencioso = args.opcoes.silencioso === true;
2330
2465
  try {
@@ -2395,7 +2530,8 @@ function comandoFabrica(args) {
2395
2530
  naoLido: [projeto_alvo_1.FORA_DA_CONSULTA.roadmap, projeto_alvo_1.FORA_DA_CONSULTA.reservas, ...(url === null ? [(0, projeto_alvo_1.semRemoto)(remoto)] : [])],
2396
2531
  });
2397
2532
  if (args.opcoes.json === true) {
2398
- console.log(JSON.stringify({ ...painel, consulta }, null, 2));
2533
+ // RM-053 (fatia 2): o mesmo JSON, com o invisivel do remoto escrito como \uXXXX.
2534
+ console.log((0, saida_segura_1.jsonSemInvisivel)({ ...painel, consulta }));
2399
2535
  return 0;
2400
2536
  }
2401
2537
  console.log([...(0, projeto_alvo_1.linhasDaConsulta)(consulta), ''].join('\n'));
@@ -2404,6 +2540,94 @@ function comandoFabrica(args) {
2404
2540
  : (0, fabrica_estado_1.textoDaFabrica)(painel, (0, maquina_1.nomeDaMaquina)()));
2405
2541
  return 0;
2406
2542
  }
2543
+ /**
2544
+ * RM-053: `ork network` e a Orkastery Network, as maquinas de uma pessoa em rede. Roda de qualquer
2545
+ * diretorio, com ou sem projeto: a rede e da pessoa, nao de um repositorio. O projeto do diretorio
2546
+ * atual, quando ha, so entra no retrato e na leitura da fabrica legada.
2547
+ */
2548
+ function comandoNetwork(args) {
2549
+ const sub = args.posicionais[1];
2550
+ // RM-054: `network roadmap` tem o proprio --projeto e o proprio uso.
2551
+ if (sub === 'roadmap')
2552
+ return comandoNetworkRoadmap(args);
2553
+ const diretorio = process.cwd();
2554
+ const uso = 'uso: ork network [status] [--json] [--sem-remoto] | network entrar [--maquina NOME] [--forja github|gitlab] ' +
2555
+ '[--repositorio [DONO/]NOME] [--forcar] | network publicar [--forcar] [--json] | network sair | ' +
2556
+ 'network roadmap [--projeto P] [--json] [--sem-remoto]';
2557
+ const forja = texto(args.opcoes.forja), repositorio = texto(args.opcoes.repositorio);
2558
+ if ((args.opcoes.forja !== undefined && !(0, rede_forja_1.ehNomeDeForja)(forja)) || args.opcoes.repositorio === true ||
2559
+ (repositorio !== undefined && !/^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,99}\/)?[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/.test(repositorio))) {
2560
+ console.error(uso);
2561
+ return 2;
2562
+ }
2563
+ if (sub === 'entrar') {
2564
+ const r = (0, rede_1.entrarNaRede)({ maquina: texto(args.opcoes.maquina), forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio, diretorio,
2565
+ tomarNome: args.opcoes.forcar === true });
2566
+ console.log(`Rede: ${r.publicacao.maquina} entrou na Orkastery Network de ${r.casa.dono} (${r.casa.forja}: ${(0, rede_1.refDaCasa)(r.casa)}, ` +
2567
+ `privado${r.criado ? ', criado agora' : ''}).`);
2568
+ console.log(` Primeiro retrato publicado (${r.publicacao.commit?.slice(0, 7)}). Depois, esta maquina publica sozinha na batida do pulse`);
2569
+ if (r.publicacao.tomouNome)
2570
+ console.log(` Tomou o nome "${r.publicacao.maquina}" de outra instalacao; o commit registra.`);
2571
+ console.log(' e ao criar thread, despachar fase, entregar e fechar. De qualquer maquina desta pessoa: ork network status');
2572
+ for (const d of r.publicacao.descartados) {
2573
+ console.log(` AVISO: um projeto ficou fora do retrato: padrao "${d.padrao}" em ${d.campo} (valor omitido de proposito).`);
2574
+ }
2575
+ if (process.env.ORK_MAQUINA && process.env.ORK_MAQUINA.trim() !== r.publicacao.maquina) {
2576
+ console.log(` AVISO: ORK_MAQUINA=${process.env.ORK_MAQUINA} neste shell vence o nome gravado; alinhe os dois.`);
2577
+ }
2578
+ return 0;
2579
+ }
2580
+ if (sub === 'sair') {
2581
+ const r = (0, rede_1.sairDaRede)({ forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio });
2582
+ console.log(`Rede: ${r.maquina} saiu; nada mais e publicado daqui.` + (r.commit
2583
+ ? ` Retrato removido de ${r.casa} (${r.commit.slice(0, 7)}).`
2584
+ : r.alheio
2585
+ ? ` O retrato "${r.maquina}" em ${r.casa} e de outra instalacao com o mesmo nome; nada foi removido.` +
2586
+ (r.mesmoHostname ? ' Ele tem o hostname desta maquina: se ~/.orkastery foi apagada, retome o nome com ork network entrar --forcar.' : '')
2587
+ : ` Nao havia retrato desta maquina${r.casa ? ` em ${r.casa}` : ' numa casa alcancavel'}.`));
2588
+ if ((0, maquina_1.lerConfigDaMaquina)()?.fabricaCompartilhada) {
2589
+ console.log(' A fabrica compartilhada dos projetos continua publicando daqui (ork/fabrica-estado); ork fabrica sair em cada um para parar.');
2590
+ }
2591
+ return 0;
2592
+ }
2593
+ if (sub === 'publicar') {
2594
+ if (args.opcoes.silencioso === true) {
2595
+ // O filho do evento de thread: quem disparou ja tomou a vez (teto de 14 min) e nao espera.
2596
+ try {
2597
+ (0, rede_adesao_1.registrarNaRede)({ ...(0, rede_1.publicarRede)({ diretorio }), origem: 'evento' });
2598
+ return 0;
2599
+ }
2600
+ catch (e) {
2601
+ (0, rede_adesao_1.registrarNaRede)({ acao: 'falhou', origem: 'evento', erro: e.message });
2602
+ return 1;
2603
+ }
2604
+ }
2605
+ const r = (0, rede_1.publicarRede)({ diretorio, forcar: args.opcoes.forcar === true, forja: (0, rede_forja_1.ehNomeDeForja)(forja) ? forja : undefined, repositorio });
2606
+ if (args.opcoes.json === true)
2607
+ console.log(JSON.stringify(r, null, 2));
2608
+ else
2609
+ console.log(r.acao === 'publicou'
2610
+ ? `Rede: ${r.maquina} publicou o retrato em ${r.casa} (${r.commit?.slice(0, 7)}, ${r.tentativas} tentativa(s)).`
2611
+ : r.acao === 'ocupado'
2612
+ ? 'Rede: outra publicacao desta maquina esta em andamento; tente de novo em instantes.'
2613
+ : `Rede: retrato de ${r.maquina} igual ao ultimo publicado em ${r.casa}; nada a enviar (use --forcar para publicar mesmo assim).`);
2614
+ if (args.opcoes.json !== true) {
2615
+ for (const d of r.descartados)
2616
+ console.log(` AVISO: um projeto ficou fora do retrato: padrao "${d.padrao}" em ${d.campo} (valor omitido de proposito).`);
2617
+ }
2618
+ return 0;
2619
+ }
2620
+ if (sub !== undefined && sub !== 'status') {
2621
+ console.error(`subcomando desconhecido: network ${sub}`);
2622
+ console.error(uso);
2623
+ return 2;
2624
+ }
2625
+ // RM-054 (fatia 3): o host sem cwd de projeto (RM-052, D3) nao faz do diretorio do gateway um projeto lido.
2626
+ const doHost = (process.env[projeto_alvo_1.ENV_PROJETO_EXPLICITO] ?? '').trim() === '1';
2627
+ const status = (0, rede_status_1.lerRede)({ semRemoto: args.opcoes['sem-remoto'] === true, diretorio: doHost ? null : diretorio });
2628
+ console.log(args.opcoes.json === true ? (0, rede_status_1.jsonDaRede)(status) : (0, rede_status_1.textoDaRede)(status));
2629
+ return 0;
2630
+ }
2407
2631
  /**
2408
2632
  * RM-052: `ork projetos` lista o registro desta maquina (`~/.orkastery/projetos.json`); `registrar`
2409
2633
  * poe uma copia que ja existia antes do registro (init, thread new e fabrica entrar ja registram) e
@@ -2640,26 +2864,13 @@ function comandoMaster(args) {
2640
2864
  console.error('master.fila-aposentada: a fila de ratificacao de score saiu na I-43. ' +
2641
2865
  'Entregue e aceito, a menos que voce diga o contrario.\n' +
2642
2866
  ' ork master as entregas, com o indice ja derivado do ledger\n' +
2643
- ' ork master --aceitar-omissao aceita as entregues, com indice e insumos no ledger\n' +
2867
+ ' ork master <id> --aceitar-omissao aceita so esta entrega, com indice e insumos no ledger\n' +
2868
+ ' ork master --aceitar-omissao aceita todas as entregues (--dry-run mostra quais)\n' +
2644
2869
  ' ork master <id> --score <0-5> --justificativa "<por que>" --por <humano> para reclamar');
2645
2870
  return 2;
2646
2871
  }
2647
- if (args.opcoes['aceitar-omissao'] === true) {
2648
- const aceitos = (0, master_2.aceitarPendentesPorOmissao)(carregado.raiz);
2649
- if (args.opcoes.json === true) {
2650
- console.log(JSON.stringify(aceitos, null, 2));
2651
- return 0;
2652
- }
2653
- if (aceitos.length === 0) {
2654
- console.log('Nenhuma entrega esperando decisao.');
2655
- return 0;
2656
- }
2657
- console.log(`Aceitas por omissao: ${aceitos.length}. O indice e os insumos foram ao ledger.`);
2658
- for (const a of aceitos)
2659
- console.log(` ${a.thread.padEnd(20)} indice ${a.indice.valor}/${a.indice.base}`);
2660
- console.log('');
2661
- console.log('Discordou? A nota humana sobrescreve, e o registro da omissao permanece.');
2662
- return 0;
2872
+ if (args.opcoes['aceitar-omissao'] !== undefined) {
2873
+ return comandoAceitarOmissao(args, carregado.raiz, primeiro);
2663
2874
  }
2664
2875
  if (primeiro === undefined) {
2665
2876
  console.log(args.opcoes.json
@@ -2675,7 +2886,7 @@ function comandoMaster(args) {
2675
2886
  const brutoScore = texto(args.opcoes.score);
2676
2887
  const justificativa = texto(args.opcoes.justificativa) ?? texto(args.opcoes.porque);
2677
2888
  if (brutoScore === undefined) {
2678
- console.error('uso: ork master <thread-id> --score 0-5 --justificativa "<texto>"');
2889
+ console.error('uso: ork master <thread-id> --score 0-5 --justificativa "<texto>" --por <seu-nome>');
2679
2890
  console.error(' o score do MASTER e humano, de 0 a 5, e a justificativa e obrigatoria.');
2680
2891
  return 2;
2681
2892
  }
@@ -2727,6 +2938,88 @@ function comandoMaster(args) {
2727
2938
  console.log(`Proximo passo: ork board --all | entregas e indice: ork master`);
2728
2939
  return 0;
2729
2940
  }
2941
+ /**
2942
+ * RM-008 (03/10/2026): `ork master [<thread>] --aceitar-omissao [--thread T] [--dry-run] [--json]`.
2943
+ *
2944
+ * Tres vezes na madrugada de 03/10, um condutor rodou `ork master --aceitar-omissao` para fechar a
2945
+ * propria thread, e o comando fechou tambem as entregues de outras frentes (ork-rm057fatia3t,
2946
+ * ork-rm025modocon). A thread indicada (posicional, `--thread T` ou `--aceitar-omissao=T`) limita o
2947
+ * aceite a ela. Sem thread, o padrao continua o mesmo, por decisao registrada: drenar todas, agora
2948
+ * listando cada uma e avisando em stderr quando quem roda e processo de agente.
2949
+ */
2950
+ function comandoAceitarOmissao(args, raiz, posicional) {
2951
+ const bruto = args.opcoes['aceitar-omissao'];
2952
+ const candidatos = [posicional, texto(args.opcoes.thread), typeof bruto === 'string' ? bruto : undefined]
2953
+ .filter((v) => typeof v === 'string' && v.trim() !== '').map((v) => v.trim());
2954
+ if (args.opcoes.thread === true || new Set(candidatos).size > 1) {
2955
+ console.error('uso: ork master <thread-id> --aceitar-omissao [--dry-run] [--json] (ou --thread <thread-id>, uma thread so)');
2956
+ return 2;
2957
+ }
2958
+ const alvo = candidatos[0];
2959
+ const dryRun = args.opcoes['dry-run'] === true;
2960
+ const json = args.opcoes.json === true;
2961
+ if (alvo) {
2962
+ const fora = (0, master_2.motivoForaDaOmissao)(raiz, alvo);
2963
+ if (fora) {
2964
+ if (json)
2965
+ console.log(JSON.stringify(dryRun ? { dryRun: true, fecharia: [], motivo: fora.motivo } : [], null, 2));
2966
+ else
2967
+ (fora.motivo === 'ja-fechada' ? console.log : console.error)(fora.texto);
2968
+ return fora.motivo === 'ja-fechada' ? 0 : 1;
2969
+ }
2970
+ }
2971
+ if (dryRun) {
2972
+ const fecharia = (0, master_2.entregasParaOmissao)(raiz, alvo).map((p) => ({ thread: p.thread.id, indice: (0, master_2.indiceDaThread)(raiz, p.thread.id) }));
2973
+ if (json) {
2974
+ console.log(JSON.stringify({ dryRun: true, fecharia }, null, 2));
2975
+ return 0;
2976
+ }
2977
+ console.log('Ensaio (--dry-run): nada foi gravado.');
2978
+ if (fecharia.length === 0) {
2979
+ console.log('Nenhuma entrega esperando decisao.');
2980
+ return 0;
2981
+ }
2982
+ console.log(`Fecharia por omissao: ${fecharia.length}.`);
2983
+ for (const f of fecharia)
2984
+ console.log(` ${f.thread.padEnd(20)} indice ${f.indice.valor}/${f.indice.base}`);
2985
+ avisoDeOmissaoSemAlvo(alvo, fecharia.length, true);
2986
+ return 0;
2987
+ }
2988
+ const aceitos = (0, master_2.aceitarPendentesPorOmissao)(raiz, { thread: alvo });
2989
+ avisoDeOmissaoSemAlvo(alvo, aceitos.length, false);
2990
+ if (json) {
2991
+ console.log(JSON.stringify(aceitos, null, 2));
2992
+ return 0;
2993
+ }
2994
+ if (aceitos.length === 0) {
2995
+ console.log('Nenhuma entrega esperando decisao.');
2996
+ return 0;
2997
+ }
2998
+ console.log(`Aceitas por omissao: ${aceitos.length}. O indice e os insumos foram ao ledger.`);
2999
+ for (const a of aceitos)
3000
+ console.log(` ${a.thread.padEnd(20)} indice ${a.indice.valor}/${a.indice.base}`);
3001
+ console.log('');
3002
+ console.log('Discordou? A nota humana sobrescreve, e o registro da omissao permanece.');
3003
+ return 0;
3004
+ }
3005
+ /**
3006
+ * O aviso do aceite SEM thread vindo de processo de agente que alcanca mais de uma entrega. A marca
3007
+ * e a mesma do `master.prova-de-canal` (ambiente do host ou do despacho). Vai para stderr: o stdout,
3008
+ * inclusive o `--json`, fica como era.
3009
+ */
3010
+ function avisoDeOmissaoSemAlvo(alvo, quantas, ensaio) {
3011
+ if (alvo || quantas <= 1)
3012
+ return;
3013
+ const marca = (0, master_nota_1.marcaDeHost)(process.env);
3014
+ if (!marca)
3015
+ return;
3016
+ const propria = (process.env[runtime_ambiente_1.ENV_THREAD_DO_DESPACHO] ?? '').trim();
3017
+ console.error('');
3018
+ console.error(`aviso: master.omissao-sem-thread: processo de agente (${marca}) ${ensaio ? 'fecharia' : 'fechou'} ${quantas} threads, ` +
3019
+ 'inclusive as de outras frentes paralelas.');
3020
+ console.error(` Para fechar so a sua: ork master ${propria || '<thread-id>'} --aceitar-omissao` +
3021
+ (ensaio ? '' : ' (a nota humana sobrescreve o aceite de quem nao era seu)'));
3022
+ }
2730
3023
  /** I-55 (RM-008): `ork licoes` mostra o que volta no proximo GOAL e PLAN, e as propostas de policy. */
2731
3024
  function comandoLicoes(args) {
2732
3025
  const carregado = (0, manifest_1.exigirManifesto)();
@@ -2824,7 +3117,7 @@ function comandoRoadmap(args) {
2824
3117
  * RM-054 (fatia 1): `ork network roadmap`, o roadmap da rede de qualquer diretorio. Pedido de projeto
2825
3118
  * ambiguo ou desconhecido e resposta, nao erro: a recusa com os candidatos, e o codigo da RM-052.
2826
3119
  */
2827
- function comandoNetwork(args) {
3120
+ function comandoNetworkRoadmap(args) {
2828
3121
  const pedido = texto(args.opcoes.projeto);
2829
3122
  if (args.posicionais[1] !== 'roadmap' || args.posicionais.length > 2 || (args.opcoes.projeto !== undefined && !pedido)) {
2830
3123
  console.error('uso: ork network roadmap [--projeto <caminho|github:dono/repo|gitlab:grupo/repo|nome>] [--json] [--sem-remoto]');
@@ -2981,6 +3274,19 @@ function exigirFaseCanonica(bruto) {
2981
3274
  /**
2982
3275
  * `ork adapter list|show|install <host>`: instalacao dos adaptadores de Camada 1 (bloco B4).
2983
3276
  */
3277
+ /**
3278
+ * O caminho real do `ork` em execução, quando o processo é este CLI (argv[1] resolve para este arquivo).
3279
+ * Importado por outro script, devolve undefined e o install volta à ordem antiga (PATH, catálogo).
3280
+ */
3281
+ function orkEmExecucao() {
3282
+ try {
3283
+ const proprio = fs.realpathSync(__filename);
3284
+ return process.argv[1] && fs.realpathSync(process.argv[1]) === proprio ? proprio : undefined;
3285
+ }
3286
+ catch {
3287
+ return undefined;
3288
+ }
3289
+ }
2984
3290
  function comandoAdapter(args) {
2985
3291
  const sub = args.posicionais[1] ?? 'list';
2986
3292
  if (sub === 'list') {
@@ -3014,6 +3320,8 @@ function comandoAdapter(args) {
3014
3320
  dryRun: args.opcoes['dry-run'] === true,
3015
3321
  force: args.opcoes.force === true || args.opcoes.forcar === true,
3016
3322
  orkBin: texto(args.opcoes.ork),
3323
+ // Ensaio de 03/10: a extensão chama o ork que a instalou, não o primeiro do PATH.
3324
+ orkEmExecucao: orkEmExecucao(),
3017
3325
  versao: VERSAO,
3018
3326
  // I-43 (D5): a decisao por ARQUIVO, que e o que faz `--force` deixar de ser o
3019
3327
  // unico caminho de saida. `;` separa varios, como o resto do CLI ja faz.
@@ -3650,7 +3958,20 @@ function comandoMemory(args) {
3650
3958
  const config = (0, manifest_1.configDeEmbedding)(carregado.manifesto);
3651
3959
  const driver = (0, orkmind_1.configDoManifesto)(carregado.manifesto);
3652
3960
  const embedder = new orkmind_1.DriverCliOrkMind(driver);
3653
- const universo = (0, indice_vetorial_1.universoDoTenant)(memoria, memoria.estado.tenant);
3961
+ // RM-038: o universo da busca inteiro, numa leitura; sem ele, nada e embedado (nunca um pedaco).
3962
+ let universo;
3963
+ try {
3964
+ universo = (0, indice_vetorial_1.universoDaBusca)(memoria, memoria.estado.tenant);
3965
+ }
3966
+ catch (erro) {
3967
+ const motivo = (0, indice_vetorial_1.codigoDaFalha)(erro);
3968
+ const detalhe = 'o universo da busca nao foi lido inteiro; nada foi embedado';
3969
+ if (args.opcoes.json === true)
3970
+ console.log(JSON.stringify({ motivo, detalhe }, null, 2));
3971
+ else
3972
+ console.error(`memory.index: ${motivo}; ${detalhe}`);
3973
+ return 1;
3974
+ }
3654
3975
  const alvos = modelo === 'todos' ? ['primario', 'fallback'] : [modelo];
3655
3976
  const resultados = alvos.map(alvo => (0, indice_vetorial_1.indexar)({ raiz: carregado.raiz, tenant: memoria.estado.tenant,
3656
3977
  dsn: driver.dsn, config, alvo, universo, dryRun: args.opcoes['dry-run'] === true,
@@ -3663,7 +3984,7 @@ function comandoMemory(args) {
3663
3984
  }
3664
3985
  else {
3665
3986
  for (const r of resultados)
3666
- console.log(textoDoIndice(r));
3987
+ console.log((0, indice_vetorial_1.textoDoIndice)(r));
3667
3988
  }
3668
3989
  return resultados.some(r => !r.dryRun && r.motivo) ? 1 : 0;
3669
3990
  }
@@ -3701,51 +4022,43 @@ function buscaPorTexto(args, carregado) {
3701
4022
  const memoria = (0, memoria_1.abrirMemoria)(carregado);
3702
4023
  const config = (0, manifest_1.configDeEmbedding)(carregado.manifesto);
3703
4024
  let r;
4025
+ const vazio = { texto: frase, modo, origem: 'nenhum', modeloUsado: null, deterministico: false,
4026
+ resultados: [], listas: { vetor: [], fts: [] }, ftsForaDoUniverso: 0, coberturaDoIndice: null };
4027
+ let universo = null;
4028
+ let falhaDoUniverso = '';
4029
+ if (memoria.ativo) {
4030
+ try {
4031
+ universo = (0, indice_vetorial_1.universoDaBusca)(memoria, memoria.estado.tenant);
4032
+ }
4033
+ catch (erro) {
4034
+ falhaDoUniverso = (0, indice_vetorial_1.codigoDaFalha)(erro);
4035
+ }
4036
+ }
3704
4037
  if (!memoria.ativo) {
3705
- r = { texto: frase, modo, origem: 'nenhum', modeloUsado: null, deterministico: false, motivo: memoria.estado.motivo,
3706
- detalhe: `${memoria.estado.detalhe}; correcao: ${memoria.estado.correcao}`, resultados: [], listas: { vetor: [], fts: [] } };
4038
+ r = { ...vazio, motivo: memoria.estado.motivo, detalhe: `${memoria.estado.detalhe}; correcao: ${memoria.estado.correcao}` };
4039
+ }
4040
+ else if (!universo) {
4041
+ // RM-038: sem o universo inteiro nao ha busca; o motivo tipado sai, nunca um resultado parcial.
4042
+ r = { ...vazio, motivo: falhaDoUniverso, detalhe: 'o universo da busca nao foi lido inteiro; nada foi buscado' };
3707
4043
  }
3708
4044
  else {
3709
4045
  const driver = (0, orkmind_1.configDoManifesto)(carregado.manifesto);
3710
4046
  const transporte = new orkmind_1.DriverCliOrkMind(driver);
3711
4047
  const fallback = memoria.estado.embeddings?.fallback;
3712
4048
  r = (0, busca_semantica_1.buscarPorSignificado)({ raiz: carregado.raiz, tenant: memoria.estado.tenant, dsn: driver.dsn, config,
3713
- universo: (0, indice_vetorial_1.universoDoTenant)(memoria, memoria.estado.tenant, colecao ? [colecao] : orkmind_1.COLECOES_DO_ORK),
4049
+ universo, colecao: colecao,
3714
4050
  texto: frase, modo, limite, timeoutMs: driver.timeoutMs,
3715
4051
  chavePresente: memoria.estado.embeddings?.chavePresente === true,
3716
4052
  fallbackUsavel: memoria.estado.embeddings?.sondado === true && fallback?.dependencias === true,
3717
4053
  embeddar: (p, o) => transporte.embeddar(p, o), buscarTexto: (t, q) => transporte.buscarTexto(t, q) });
3718
4054
  }
4055
+ const codigo = universo ? 0 : 1;
3719
4056
  if (args.opcoes.json === true) {
3720
4057
  console.log(JSON.stringify(r, null, 2));
3721
- return 0;
4058
+ return codigo;
3722
4059
  }
3723
- console.log(`Busca por significado (NAO deterministica; modo ${r.modo}, origem ${r.origem}${r.modeloUsado ? ` ${r.modeloUsado}` : ''})`);
3724
- if (r.motivo)
3725
- console.log(` motivo: ${r.motivo}${r.detalhe ? `; ${r.detalhe}` : ''}`);
3726
- console.log('');
3727
- r.resultados.forEach((e, i) => {
3728
- const sim = e.similaridade === null ? '' : ` similaridade ${e.similaridade}`;
3729
- console.log(` ${i + 1}. [${e.collection}] ${e.id} score ${e.score} ${e.fontes.join('+')}${sim}`);
3730
- console.log(` ${e.resumo}`);
3731
- });
3732
- console.log('');
3733
- console.log(` ${r.resultados.length} resultado(s); busca por tag continua em ork memory search --tags`);
3734
- return 0;
3735
- }
3736
- /** Texto de `ork memory index`: o que foi (ou seria) embedado e quanto custa estimado. */
3737
- function textoDoIndice(r) {
3738
- const custo = r.custoEstimadoUsd === null ? 'nao estimado' : `US$ ${r.custoEstimadoUsd.toFixed(8)}`;
3739
- return [
3740
- `Indice vetorial (${r.alvo}${r.dryRun ? ', --dry-run' : ''}): ${r.modelo ?? '(sem modelo)'}${r.dim ? ` / ${r.dim} dim` : ''}`,
3741
- ` universo do tenant ${r.universo} entrada(s); coerentes ${r.coerentes}`,
3742
- ` embedados ${r.embedados} (reescritos ${r.reescritos}); removidos ${r.removidos}`,
3743
- ` fora do indice ${r.recusados} recusada(s) por padrao de segredo, ${r.foraDoLimite} acima do limite`,
3744
- ...(r.truncados ? [` truncados ${r.truncados} acima do contexto do modelo local, embedados pelo comeco`] : []),
3745
- ` estimativa ${r.tokensEstimados} token(s), ${custo}; chamadas ao provider ${r.chamadasAoProvider}`,
3746
- ...(r.arquivo ? [` arquivo ${r.arquivo}`] : []),
3747
- ...(r.motivo ? [` motivo ${r.motivo}: ${r.detalhe}`] : r.detalhe ? [` ${r.detalhe}`] : []),
3748
- ].join('\n');
4060
+ console.log((0, busca_semantica_1.textoDaBuscaPorSignificado)(r));
4061
+ return codigo;
3749
4062
  }
3750
4063
  /**
3751
4064
  * RM-052: `--projeto <nome|caminho>` e opcao GLOBAL. Sai do argv em qualquer posicao, antes de
@@ -3896,11 +4209,13 @@ function main(argvBruto) {
3896
4209
  console.log((0, preflight_1.textoPreflight)(r));
3897
4210
  return r.prontoPrimeiroBloco ? 0 : 1;
3898
4211
  }
3899
- const r = (0, doctor_1.doctor)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados);
4212
+ // RM-031: o check dos analisadores do grafo entra por aqui, a porta da familia do grafo (fronteira do KG1).
4213
+ const r = (0, doctor_1.doctor)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, () => (0, intelligence_graph_cli_1.checarAnalisadoresDoGrafo)(versao_1.VERSAO_DO_ORK));
3900
4214
  console.log(r.texto);
3901
4215
  return r.codigo;
3902
4216
  }
3903
4217
  case 'init': {
4218
+ (0, init_1.exigirRepositorioParaInit)(process.cwd());
3904
4219
  const r = (0, init_1.init)(process.cwd(), {
3905
4220
  force: args.opcoes.force === true,
3906
4221
  nome: texto(args.opcoes.name) ?? texto(args.opcoes.nome),
@@ -4075,7 +4390,9 @@ function main(argvBruto) {
4075
4390
  case 'grafo': {
4076
4391
  // RM-031 KG3 (D7): o argv cru depois do comando; o parser do grafo e estrito.
4077
4392
  const carregado = (0, manifest_1.exigirManifesto)();
4078
- return (0, intelligence_graph_cli_1.executarGrafo)(argv.slice(argv.indexOf('grafo') + 1), { raiz: carregado.raiz, estado: (0, estado_thread_1.raizDoEstado)(carregado.raiz), repositorio: carregado.manifesto.project.name, escrever: (texto) => console.log(texto) });
4393
+ return (0, intelligence_graph_cli_1.executarGrafo)(argv.slice(argv.indexOf('grafo') + 1), { raiz: carregado.raiz, estado: (0, estado_thread_1.raizDoEstado)(carregado.raiz), repositorio: carregado.manifesto.project.name, versao: versao_1.VERSAO_DO_ORK,
4394
+ contextoDaThread: (id) => (0, mcp_grafo_1.lerEntradaDaThread)(carregado.raiz, id),
4395
+ escrever: (texto) => console.log(texto) });
4079
4396
  }
4080
4397
  case 'ship':
4081
4398
  return comandoShip(args);