@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
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");
@@ -227,11 +235,11 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
227
235
  modos Tabela dos ${modos_1.ORDEM_DOS_MODOS.length} modos de conducao vivos por #TAG
228
236
 
229
237
  setup Pauta da entrevista #setup: runtime/modelo/esforco
238
+ por bloco de cada modo (default claude-bg/opus/high; #Fast: sonnet)
230
239
  onboarding [show|set <etapa>|reset [etapa]] Pauta e respostas do projeto (9 etapas)
231
- [--conteudo JSON] [--por Q] [--json] Valores secretos somente em ~/.hermes/.env
240
+ [--conteudo JSON] [--por Q] [--json] Segredos ficam ${onboarding_1.ONDE_FICAM_OS_SEGREDOS}
232
241
  [--reset [etapa]] Reset seletivo ou total, idempotente
233
242
  onboarding sync [--json] Publicação opcional na memória, com degradação
234
- por bloco de cada modo (default claude-bg/opus/high; #Fast: sonnet)
235
243
  experiencia show [--json] Preferências efetivas; configure por onboarding set maestro --conteudo '{"owner":{"experience":true}}'
236
244
  experiencia uninstall <host> [--dry-run] [--json]
237
245
  Remove o bloco de Claude Code/Codex; sem --dry-run aplica a remoção
@@ -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
@@ -378,21 +396,27 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
378
396
  [--dry-run] [--json] com tokens e custo estimados; --dry-run nao chama o provider
379
397
 
380
398
  grafo indexar [--verificar] [--forcar] Indice do grafo de codigo do HEAD limpo (RM-031 KG3) no estado do projeto:
381
- [--json] pastas 0700, chave por revisao e extrator, idempotente; --verificar
382
- confere contrato, bytes e determinismo; precisa de typescript e micromark
399
+ [--json] pastas 0700, chave por revisao e extrator, idempotente; incremental (KG4)
400
+ a partir do indice ancestral, ou completo com o motivo; --forcar extrai
401
+ completo; --verificar confere contrato, bytes, determinismo e o incremental
402
+ contra a completa; precisa de typescript e micromark
383
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]
384
405
  grafo vizinhos <no> [--profundidade N] Vizinhanca de arquivo ou simbolo, com extrator e evidencia de cada aresta
385
406
  [--sentido entrada|saida|ambos] [--tipo T,...] [--limite N] [--json]
386
407
  grafo chamadores <simbolo> Quem chama (arestas calls que chegam) [--profundidade N] [--limite N] [--json]
387
408
  grafo importadores <arquivo|simbolo> Quem importa (arestas imports que chegam) [--profundidade N] [--limite N] [--json]
388
409
  grafo caminho <de> <para> Menor caminho pelas arestas [--sentido saida|entrada|ambos] [--tipo T,...] [--json]
410
+ [--json --teto-bytes N] Nas quatro consultas (KG5): JSON compacto de no maximo N bytes; as arestas mais
411
+ longe do alvo saem ate caber, e o caminho que nao cabe recusa
389
412
  grafo amostra [--por-estrato N] Amostra de arestas para auditoria manual; --conferir ARQ confere a auditada
390
413
  grafo limpar [--tudo] [--json] Apaga os indices que nao sao do HEAD e as sobras com mais de uma hora
391
414
 
392
415
  ship <thread-id> --para <branch> Merge --no-ff serializado por lease e push PROVADO
393
416
  ship registrar-pr <thread-id>|--todas A entrega feita por PR vira ship_done: merge ship(<thread>) na base
394
- [--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
395
418
  [--repo <dono/nome> --pr <n>] PR mesclado em repositorio externo de ci.external_repositories
419
+ [--dry-run] Ensaio: as mesmas conferencias, sem gravar ship_done, fase nem fabrica
396
420
  [--de <branch>] [--remoto origin] [--autorizar-push <quem>] [--sem-push] [--dry-run]
397
421
 
398
422
  board [--all] [--sem-remoto] Visao unica das threads (todos os perfis com --all); com a
@@ -420,15 +444,19 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
420
444
  master batch --aceitar <thread:assinatura,...> --por <humano>
421
445
  master migrar --dry-run --por Q Inspeciona correções sem alterar originais
422
446
  master digest <enviar|preview|responder> Digest semanal com recibos do host
423
- master <thread-id> --score 0-5 --justificativa "<texto>"
424
- [--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]
425
449
  Fecha a thread: POSTMORTEM + MASTER log + score (so do terminal;
426
450
  de processo de host e recusado com master.prova-de-canal)
427
451
  master pedir <thread-id> [--formato telegram|terminal|json]
428
452
  Pede a nota ao dono com codigo curto; ele responde pelo Telegram
429
453
  (<codigo> <0 a 5> <porque>) e a nota vai ao ledger com o recibo (RM-048)
430
454
  master [--todas] [--json] As entregas, com o indice derivado do ledger
431
- 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)
432
460
  master classes As classes de falha fixas do POSTMORTEM
433
461
  licoes [--json] O que volta no GOAL e no PLAN da proxima thread (POSTMORTEM e
434
462
  MASTER) e as propostas de policy por recorrencia (I-55)
@@ -464,10 +492,19 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
464
492
  depois de entrar, sai sozinho ao criar thread, despachar fase,
465
493
  entregar e fechar, e a cada batida do pulse
466
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
467
503
  network roadmap [--projeto P] [--json] Roadmap, reservas e threads de cada maquina de cada projeto, de qualquer diretorio:
468
504
  [--sem-remoto] fonte e hora de cada parte, lacuna tipada no que nao leu. P = caminho do clone,
469
505
  github:dono/repo, gitlab:grupo/repo ou nome conhecido; sem clone, le a forja (RM-054)
470
- docs verificar [--json] Documentacao de produto e roadmap contra o codigo e o git
506
+ docs verificar [--json] [--pr] Documentacao de produto e roadmap contra o codigo e o git; no PR (--pr),
507
+ o merge de outra thread e o indice que divergem da main so avisam
471
508
  (padrao do dono: frontmatter, leitura, paridade; sai != 0 com erro)
472
509
  docs sincronizar [--escrever] Fatos do ledger e do git para o roadmap (merge, fase) e indices;
473
510
  sem --escrever so mostra; nunca muda status por passagem de tempo
@@ -508,7 +545,9 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
508
545
  audit finding estado <id> <estado> Carimba o achado (aberto|adiado|resolvido|descartado)
509
546
 
510
547
  thread new <nome> --from-finding <ID> Abre a thread a partir de um achado de auditoria
511
- [--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)
512
551
 
513
552
  Regimes de memoria: files (fallback honesto) e orkmind (bloco B6, base propria por tenant
514
553
  declarada em memory.database_url_env pelo NOME da variavel de ambiente, sem fallback).
@@ -568,15 +607,23 @@ function comandoThread(args) {
568
607
  return 2;
569
608
  }
570
609
  }
571
- const brutoWorktreeAchado = args.opcoes.worktree;
572
- 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
+ }
573
619
  const r = (0, auditrun_1.abrirThreadDoAchado)(carregado, doAchado, {
574
620
  nome: args.posicionais[2],
575
621
  modo: modoAchado ?? undefined,
576
622
  slug: texto(args.opcoes.slug),
577
623
  assunto: texto(args.opcoes.assunto),
578
- criarWorktree: criarWorktreeAchado,
579
- worktree: criarWorktreeAchado ? null : (texto(brutoWorktreeAchado) ?? null),
624
+ criarWorktree: pedidoAchado.criar,
625
+ worktree: pedidoAchado.dir,
626
+ origemDaWorktree: pedidoAchado.origem,
580
627
  dryRun: args.opcoes['dry-run'] === true,
581
628
  });
582
629
  if (!r.ok) {
@@ -601,6 +648,13 @@ function comandoThread(args) {
601
648
  console.log((0, thread_1.resumoDaThread)(r.thread));
602
649
  console.log('');
603
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);
604
658
  }
605
659
  if (r.motivo === 'claims.unverifiable') {
606
660
  console.log('');
@@ -667,16 +721,29 @@ function comandoThread(args) {
667
721
  return { criterio, comando };
668
722
  });
669
723
  const dryRun = args.opcoes['dry-run'] === true;
670
- const brutoWorktree = args.opcoes.worktree;
671
- // `--worktree auto` (ou `--worktree` sozinho) cria a worktree isolada da thread;
672
- // um caminho reusa um diretorio que ja existe.
673
- 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
+ }
674
735
  const brutoCiclo = texto(args.opcoes.ciclo) ?? texto(args.opcoes.variante);
675
736
  const variante = brutoCiclo ? (0, ciclos_1.parseVariante)(brutoCiclo) : null;
676
737
  if (brutoCiclo && !variante) {
677
738
  console.error(`variante de ciclo invalida: "${brutoCiclo}". Use uma de: ${Object.keys(ciclos_1.VARIANTES).join(', ')}`);
678
739
  return 2;
679
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
+ }
680
747
  const brutoFatias = texto(args.opcoes.fatias);
681
748
  // I-47: `--roadmap RM-NNN` reserva o item ANTES de criar a thread. A reserva e o passo
682
749
  // atomico entre maquinas (o primeiro push vence); a thread e local. Se a criacao falhar,
@@ -690,8 +757,9 @@ function comandoThread(args) {
690
757
  modo,
691
758
  slug: texto(args.opcoes.slug),
692
759
  assunto: texto(args.opcoes.assunto),
693
- worktree: criarWorktree ? null : (texto(brutoWorktree) ?? null),
694
- criarWorktree,
760
+ worktree: pedido.dir,
761
+ criarWorktree: pedido.criar,
762
+ origemDaWorktree: pedido.origem,
695
763
  dryRun,
696
764
  variante,
697
765
  branch: texto(args.opcoes.branch),
@@ -725,14 +793,27 @@ function comandoThread(args) {
725
793
  console.log((0, thread_1.resumoDaThread)(thread));
726
794
  console.log('');
727
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);
801
+ const avisoSemBase = (0, thread_1.avisoDeThreadSemBase)(thread, gravada);
728
802
  if (gravada) {
729
803
  console.log(` estado: .orkastery/threads/${thread.id}/thread.json`);
730
804
  // Bloco B6: a origem da thread e as policies do projeto vao para a memoria
731
805
  // semantica quando ela esta ligada. Em regime files nada muda nesta saida.
732
806
  relatarPublicacao((0, memoria_1.publicar)(carregado, thread.id));
733
- console.log('');
734
- console.log(`Proximo passo: ork phase run ${thread.id} ${thread.faseAtual} --prompt "<pedido>"`);
807
+ // Thread sem base nao tem fase para rodar: o proximo passo e o do aviso.
808
+ if (!avisoSemBase) {
809
+ console.log('');
810
+ console.log(`Proximo passo: ork phase run ${thread.id} ${thread.faseAtual} --prompt "<pedido>"`);
811
+ }
735
812
  }
813
+ if (avisoDaWorktreeNova)
814
+ console.error(avisoDaWorktreeNova);
815
+ if (avisoSemBase)
816
+ console.error(avisoSemBase);
736
817
  return 0;
737
818
  }
738
819
  if (sub === 'list' || sub === undefined) {
@@ -968,7 +1049,20 @@ function comandoAccounts(args) {
968
1049
  imprimir();
969
1050
  return falhas > 0 ? 1 : 0;
970
1051
  }
971
- 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)`);
972
1066
  return 2;
973
1067
  }
974
1068
  function comandoSetup(args) {
@@ -1073,6 +1167,7 @@ function comandoPhase(args) {
1073
1167
  runtime: texto(args.opcoes.runtime),
1074
1168
  model: texto(args.opcoes.model),
1075
1169
  effort: texto(args.opcoes.effort),
1170
+ perfil: texto(args.opcoes.perfil),
1076
1171
  dryRun: args.opcoes['dry-run'] === true,
1077
1172
  canal: conducao.canal,
1078
1173
  ...(conducao.correlacao ? { correlacao: conducao.correlacao } : {}),
@@ -1269,6 +1364,15 @@ function comandoSessions(args) {
1269
1364
  console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : (0, sessoes_1.textoDoInventario)(r));
1270
1365
  return !r.ok || (args.opcoes['exigir-limpo'] === true && r.semThread > 0) ? 1 : 0;
1271
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
+ }
1272
1376
  if (sub === 'hitl') {
1273
1377
  return comandoSessionsHitl(args, carregado ? raiz : '');
1274
1378
  }
@@ -1455,6 +1559,13 @@ function comandoClaims(args) {
1455
1559
  console.log('');
1456
1560
  console.log('AVISO: alegacao negativa sem comando de verificacao reprova em `ork verify`.');
1457
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
+ }
1458
1569
  // I-53 (RM-037, P6): o lint avisa aqui; a suite inteira e recusada no `ci prepare`.
1459
1570
  for (const a of claim.lint ?? []) {
1460
1571
  console.log('');
@@ -1533,8 +1644,14 @@ function comandoVerify(args) {
1533
1644
  for (const c of b.comandos) {
1534
1645
  console.log(` ${c.nome.padEnd(10)} ${c.ok ? 'passava' : `ja falhava (codigo ${c.code})`} ${c.comando}`);
1535
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
+ }
1536
1652
  if (b.comandos.length === 0) {
1537
- console.log(' (nenhum comando em verify: no manifesto; sem baseline nao ha como separar regressao)');
1653
+ // Fatia 2 do ensaio da 0.5.0 (R5): a baseline foi gravada; o que falta e comando, nao baseline.
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)');
1538
1655
  }
1539
1656
  return 0;
1540
1657
  }
@@ -1952,23 +2069,50 @@ function comandoShip(args) {
1952
2069
  // RM-037 (defeito 5): PR mesclado em repositorio externo declarado em ci.external_repositories.
1953
2070
  const repo = texto(args.opcoes.repo), numeroDoPr = texto(args.opcoes.pr);
1954
2071
  if ((!alvo && args.opcoes.todas !== true) || (!!repo !== !!numeroDoPr) || (repo && !alvo)) {
1955
- console.error('uso: ork ship registrar-pr <thread-id> [--repo <dono/nome> --pr <n>] | --todas [--remoto R] [--json]');
2072
+ console.error('uso: ork ship registrar-pr <thread-id> [--repo <dono/nome> --pr <n>] | --todas [--remoto R] [--json] [--dry-run]');
1956
2073
  return 2;
1957
2074
  }
1958
- const r = alvo && repo ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr) })]
1959
- : alvo ? [(0, entrega_pr_1.registrarEntregaPorPr)(carregado, alvo, { remoto })] : (0, entrega_pr_1.registrarEntregasPorPr)(carregado, { remoto });
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');
2078
+ // RM-037 (fatia 3, defeito 6): o `--dry-run` era ignorado, e o ensaio gravava o ship_done de verdade.
2079
+ const dryRun = args.opcoes['dry-run'] === true;
2080
+ const r = alvo && repo ? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun })]
2081
+ : alvo ? [(0, entrega_pr_1.registrarEntregaPorPr)(carregado, alvo, { remoto, dryRun })] : (0, entrega_pr_1.registrarEntregasPorPr)(carregado, { remoto, dryRun });
1960
2082
  if (args.opcoes.json === true) {
1961
2083
  console.log(JSON.stringify(r, null, 2));
1962
2084
  return r.some((x) => x.acao === 'recusada') ? 1 : 0;
1963
2085
  }
2086
+ if (dryRun)
2087
+ console.log('Ensaio (--dry-run): nada foi gravado.');
1964
2088
  if (r.length === 0)
1965
2089
  console.log('Nenhuma thread aberta com merge ship(<thread>) na base.');
1966
2090
  for (const x of r)
1967
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
+ }
1968
2103
  const registradas = r.filter((x) => x.acao === 'registrou').length;
2104
+ const registrariam = r.filter((x) => x.acao === 'registraria').length;
1969
2105
  if (registradas) {
1970
2106
  console.log('');
1971
- 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`);
2112
+ }
2113
+ if (registrariam) {
2114
+ console.log('');
2115
+ console.log(`${registrariam} entrega(s) seria(m) registrada(s). Para gravar, rode o mesmo comando sem --dry-run.`);
1972
2116
  }
1973
2117
  return r.some((x) => x.acao === 'recusada') ? 1 : 0;
1974
2118
  }
@@ -1978,6 +2122,10 @@ function comandoShip(args) {
1978
2122
  console.error('uso: ork ship <thread-id> --para <branch> [--de <branch>] [--dry-run]');
1979
2123
  return 2;
1980
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');
1981
2129
  const autorizar = args.opcoes['autorizar-push'];
1982
2130
  const r = (0, ship_1.ship)(carregado, id, {
1983
2131
  para,
@@ -2172,10 +2320,15 @@ function comandoCi(args) {
2172
2320
  if (sub === 'status') {
2173
2321
  const sha = texto(args.opcoes.sha) ?? args.posicionais[2] ?? (0, util_1.exec)('git', ['rev-parse', 'HEAD'], carregado.raiz).stdout.trim();
2174
2322
  if (!/^[0-9a-f]{40}$/.test(sha)) {
2175
- 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]');
2176
2327
  return 2;
2177
2328
  }
2178
- 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);
2179
2332
  console.log(args.opcoes.json === true ? JSON.stringify(result, null, 2) : `${result.ok ? 'CI VERDE' : 'CI NÃO LIBEROU'}: ${result.detail}`);
2180
2333
  return result.ok ? 0 : 1;
2181
2334
  }
@@ -2302,7 +2455,11 @@ const CONTRATO_DO_BOARD = 'ork.board/v1';
2302
2455
  function comandoFabrica(args) {
2303
2456
  const carregado = (0, manifest_1.exigirManifesto)();
2304
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.
2305
2460
  const remoto = texto(args.opcoes.remoto) ?? carregado.manifesto.fabrica.remoto;
2461
+ if (sub !== 'publicar')
2462
+ (0, branch_de_estado_1.exigirRemoto)(remoto, 'fabrica');
2306
2463
  if (sub === 'publicar') {
2307
2464
  const silencioso = args.opcoes.silencioso === true;
2308
2465
  try {
@@ -2373,7 +2530,8 @@ function comandoFabrica(args) {
2373
2530
  naoLido: [projeto_alvo_1.FORA_DA_CONSULTA.roadmap, projeto_alvo_1.FORA_DA_CONSULTA.reservas, ...(url === null ? [(0, projeto_alvo_1.semRemoto)(remoto)] : [])],
2374
2531
  });
2375
2532
  if (args.opcoes.json === true) {
2376
- 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 }));
2377
2535
  return 0;
2378
2536
  }
2379
2537
  console.log([...(0, projeto_alvo_1.linhasDaConsulta)(consulta), ''].join('\n'));
@@ -2382,6 +2540,94 @@ function comandoFabrica(args) {
2382
2540
  : (0, fabrica_estado_1.textoDaFabrica)(painel, (0, maquina_1.nomeDaMaquina)()));
2383
2541
  return 0;
2384
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
+ }
2385
2631
  /**
2386
2632
  * RM-052: `ork projetos` lista o registro desta maquina (`~/.orkastery/projetos.json`); `registrar`
2387
2633
  * poe uma copia que ja existia antes do registro (init, thread new e fabrica entrar ja registram) e
@@ -2618,26 +2864,13 @@ function comandoMaster(args) {
2618
2864
  console.error('master.fila-aposentada: a fila de ratificacao de score saiu na I-43. ' +
2619
2865
  'Entregue e aceito, a menos que voce diga o contrario.\n' +
2620
2866
  ' ork master as entregas, com o indice ja derivado do ledger\n' +
2621
- ' 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' +
2622
2869
  ' ork master <id> --score <0-5> --justificativa "<por que>" --por <humano> para reclamar');
2623
2870
  return 2;
2624
2871
  }
2625
- if (args.opcoes['aceitar-omissao'] === true) {
2626
- const aceitos = (0, master_2.aceitarPendentesPorOmissao)(carregado.raiz);
2627
- if (args.opcoes.json === true) {
2628
- console.log(JSON.stringify(aceitos, null, 2));
2629
- return 0;
2630
- }
2631
- if (aceitos.length === 0) {
2632
- console.log('Nenhuma entrega esperando decisao.');
2633
- return 0;
2634
- }
2635
- console.log(`Aceitas por omissao: ${aceitos.length}. O indice e os insumos foram ao ledger.`);
2636
- for (const a of aceitos)
2637
- console.log(` ${a.thread.padEnd(20)} indice ${a.indice.valor}/${a.indice.base}`);
2638
- console.log('');
2639
- console.log('Discordou? A nota humana sobrescreve, e o registro da omissao permanece.');
2640
- return 0;
2872
+ if (args.opcoes['aceitar-omissao'] !== undefined) {
2873
+ return comandoAceitarOmissao(args, carregado.raiz, primeiro);
2641
2874
  }
2642
2875
  if (primeiro === undefined) {
2643
2876
  console.log(args.opcoes.json
@@ -2653,7 +2886,7 @@ function comandoMaster(args) {
2653
2886
  const brutoScore = texto(args.opcoes.score);
2654
2887
  const justificativa = texto(args.opcoes.justificativa) ?? texto(args.opcoes.porque);
2655
2888
  if (brutoScore === undefined) {
2656
- 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>');
2657
2890
  console.error(' o score do MASTER e humano, de 0 a 5, e a justificativa e obrigatoria.');
2658
2891
  return 2;
2659
2892
  }
@@ -2705,6 +2938,88 @@ function comandoMaster(args) {
2705
2938
  console.log(`Proximo passo: ork board --all | entregas e indice: ork master`);
2706
2939
  return 0;
2707
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
+ }
2708
3023
  /** I-55 (RM-008): `ork licoes` mostra o que volta no proximo GOAL e PLAN, e as propostas de policy. */
2709
3024
  function comandoLicoes(args) {
2710
3025
  const carregado = (0, manifest_1.exigirManifesto)();
@@ -2802,7 +3117,7 @@ function comandoRoadmap(args) {
2802
3117
  * RM-054 (fatia 1): `ork network roadmap`, o roadmap da rede de qualquer diretorio. Pedido de projeto
2803
3118
  * ambiguo ou desconhecido e resposta, nao erro: a recusa com os candidatos, e o codigo da RM-052.
2804
3119
  */
2805
- function comandoNetwork(args) {
3120
+ function comandoNetworkRoadmap(args) {
2806
3121
  const pedido = texto(args.opcoes.projeto);
2807
3122
  if (args.posicionais[1] !== 'roadmap' || args.posicionais.length > 2 || (args.opcoes.projeto !== undefined && !pedido)) {
2808
3123
  console.error('uso: ork network roadmap [--projeto <caminho|github:dono/repo|gitlab:grupo/repo|nome>] [--json] [--sem-remoto]');
@@ -2829,7 +3144,8 @@ function comandoDocs(args) {
2829
3144
  const raiz = carregado?.raiz ?? (0, manifest_1.diretorioDoProjeto)();
2830
3145
  const baseBranch = carregado?.manifesto.worktree?.base_branch ?? 'main';
2831
3146
  if (sub === 'verificar') {
2832
- const { docs, achados } = (0, docs_1.verificarDocs)(raiz, { baseBranch, ajudaDoCli: AJUDA });
3147
+ // RM-037 (fatia 3, GO-FIX 2): o CI passa --pr no pull_request; no push da main as duas regras novas reprovam.
3148
+ const { docs, achados } = (0, docs_1.verificarDocs)(raiz, { baseBranch, ajudaDoCli: AJUDA, pr: args.opcoes.pr === true });
2833
3149
  if (args.opcoes.json === true) {
2834
3150
  console.log(JSON.stringify({ paginas: docs.length, erros: achados.filter((a) => a.gravidade === 'erro').length,
2835
3151
  achados }, null, 2));
@@ -2881,7 +3197,7 @@ function comandoDocs(args) {
2881
3197
  'Proximo passo: copie docs/produto/_modelo-feature.md e docs/roadmap/_modelo-item.md, e rode ork docs verificar'].join('\n'));
2882
3198
  return 0;
2883
3199
  }
2884
- console.error(`uso: ork docs verificar [--json] | sincronizar [--escrever] [--so RM-NNN] [--todos] | init`);
3200
+ console.error(`uso: ork docs verificar [--json] [--pr] | sincronizar [--escrever] [--so RM-NNN] [--todos] | init`);
2885
3201
  return 2;
2886
3202
  }
2887
3203
  function comandoPrompt(args) {
@@ -2958,6 +3274,19 @@ function exigirFaseCanonica(bruto) {
2958
3274
  /**
2959
3275
  * `ork adapter list|show|install <host>`: instalacao dos adaptadores de Camada 1 (bloco B4).
2960
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
+ }
2961
3290
  function comandoAdapter(args) {
2962
3291
  const sub = args.posicionais[1] ?? 'list';
2963
3292
  if (sub === 'list') {
@@ -2991,6 +3320,8 @@ function comandoAdapter(args) {
2991
3320
  dryRun: args.opcoes['dry-run'] === true,
2992
3321
  force: args.opcoes.force === true || args.opcoes.forcar === true,
2993
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(),
2994
3325
  versao: VERSAO,
2995
3326
  // I-43 (D5): a decisao por ARQUIVO, que e o que faz `--force` deixar de ser o
2996
3327
  // unico caminho de saida. `;` separa varios, como o resto do CLI ja faz.
@@ -3627,7 +3958,20 @@ function comandoMemory(args) {
3627
3958
  const config = (0, manifest_1.configDeEmbedding)(carregado.manifesto);
3628
3959
  const driver = (0, orkmind_1.configDoManifesto)(carregado.manifesto);
3629
3960
  const embedder = new orkmind_1.DriverCliOrkMind(driver);
3630
- 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
+ }
3631
3975
  const alvos = modelo === 'todos' ? ['primario', 'fallback'] : [modelo];
3632
3976
  const resultados = alvos.map(alvo => (0, indice_vetorial_1.indexar)({ raiz: carregado.raiz, tenant: memoria.estado.tenant,
3633
3977
  dsn: driver.dsn, config, alvo, universo, dryRun: args.opcoes['dry-run'] === true,
@@ -3640,7 +3984,7 @@ function comandoMemory(args) {
3640
3984
  }
3641
3985
  else {
3642
3986
  for (const r of resultados)
3643
- console.log(textoDoIndice(r));
3987
+ console.log((0, indice_vetorial_1.textoDoIndice)(r));
3644
3988
  }
3645
3989
  return resultados.some(r => !r.dryRun && r.motivo) ? 1 : 0;
3646
3990
  }
@@ -3678,51 +4022,43 @@ function buscaPorTexto(args, carregado) {
3678
4022
  const memoria = (0, memoria_1.abrirMemoria)(carregado);
3679
4023
  const config = (0, manifest_1.configDeEmbedding)(carregado.manifesto);
3680
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
+ }
3681
4037
  if (!memoria.ativo) {
3682
- r = { texto: frase, modo, origem: 'nenhum', modeloUsado: null, deterministico: false, motivo: memoria.estado.motivo,
3683
- 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' };
3684
4043
  }
3685
4044
  else {
3686
4045
  const driver = (0, orkmind_1.configDoManifesto)(carregado.manifesto);
3687
4046
  const transporte = new orkmind_1.DriverCliOrkMind(driver);
3688
4047
  const fallback = memoria.estado.embeddings?.fallback;
3689
4048
  r = (0, busca_semantica_1.buscarPorSignificado)({ raiz: carregado.raiz, tenant: memoria.estado.tenant, dsn: driver.dsn, config,
3690
- universo: (0, indice_vetorial_1.universoDoTenant)(memoria, memoria.estado.tenant, colecao ? [colecao] : orkmind_1.COLECOES_DO_ORK),
4049
+ universo, colecao: colecao,
3691
4050
  texto: frase, modo, limite, timeoutMs: driver.timeoutMs,
3692
4051
  chavePresente: memoria.estado.embeddings?.chavePresente === true,
3693
4052
  fallbackUsavel: memoria.estado.embeddings?.sondado === true && fallback?.dependencias === true,
3694
4053
  embeddar: (p, o) => transporte.embeddar(p, o), buscarTexto: (t, q) => transporte.buscarTexto(t, q) });
3695
4054
  }
4055
+ const codigo = universo ? 0 : 1;
3696
4056
  if (args.opcoes.json === true) {
3697
4057
  console.log(JSON.stringify(r, null, 2));
3698
- return 0;
4058
+ return codigo;
3699
4059
  }
3700
- console.log(`Busca por significado (NAO deterministica; modo ${r.modo}, origem ${r.origem}${r.modeloUsado ? ` ${r.modeloUsado}` : ''})`);
3701
- if (r.motivo)
3702
- console.log(` motivo: ${r.motivo}${r.detalhe ? `; ${r.detalhe}` : ''}`);
3703
- console.log('');
3704
- r.resultados.forEach((e, i) => {
3705
- const sim = e.similaridade === null ? '' : ` similaridade ${e.similaridade}`;
3706
- console.log(` ${i + 1}. [${e.collection}] ${e.id} score ${e.score} ${e.fontes.join('+')}${sim}`);
3707
- console.log(` ${e.resumo}`);
3708
- });
3709
- console.log('');
3710
- console.log(` ${r.resultados.length} resultado(s); busca por tag continua em ork memory search --tags`);
3711
- return 0;
3712
- }
3713
- /** Texto de `ork memory index`: o que foi (ou seria) embedado e quanto custa estimado. */
3714
- function textoDoIndice(r) {
3715
- const custo = r.custoEstimadoUsd === null ? 'nao estimado' : `US$ ${r.custoEstimadoUsd.toFixed(8)}`;
3716
- return [
3717
- `Indice vetorial (${r.alvo}${r.dryRun ? ', --dry-run' : ''}): ${r.modelo ?? '(sem modelo)'}${r.dim ? ` / ${r.dim} dim` : ''}`,
3718
- ` universo do tenant ${r.universo} entrada(s); coerentes ${r.coerentes}`,
3719
- ` embedados ${r.embedados} (reescritos ${r.reescritos}); removidos ${r.removidos}`,
3720
- ` fora do indice ${r.recusados} recusada(s) por padrao de segredo, ${r.foraDoLimite} acima do limite`,
3721
- ...(r.truncados ? [` truncados ${r.truncados} acima do contexto do modelo local, embedados pelo comeco`] : []),
3722
- ` estimativa ${r.tokensEstimados} token(s), ${custo}; chamadas ao provider ${r.chamadasAoProvider}`,
3723
- ...(r.arquivo ? [` arquivo ${r.arquivo}`] : []),
3724
- ...(r.motivo ? [` motivo ${r.motivo}: ${r.detalhe}`] : r.detalhe ? [` ${r.detalhe}`] : []),
3725
- ].join('\n');
4060
+ console.log((0, busca_semantica_1.textoDaBuscaPorSignificado)(r));
4061
+ return codigo;
3726
4062
  }
3727
4063
  /**
3728
4064
  * RM-052: `--projeto <nome|caminho>` e opcao GLOBAL. Sai do argv em qualquer posicao, antes de
@@ -3873,11 +4209,13 @@ function main(argvBruto) {
3873
4209
  console.log((0, preflight_1.textoPreflight)(r));
3874
4210
  return r.prontoPrimeiroBloco ? 0 : 1;
3875
4211
  }
3876
- 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));
3877
4214
  console.log(r.texto);
3878
4215
  return r.codigo;
3879
4216
  }
3880
4217
  case 'init': {
4218
+ (0, init_1.exigirRepositorioParaInit)(process.cwd());
3881
4219
  const r = (0, init_1.init)(process.cwd(), {
3882
4220
  force: args.opcoes.force === true,
3883
4221
  nome: texto(args.opcoes.name) ?? texto(args.opcoes.nome),
@@ -3901,6 +4239,9 @@ function main(argvBruto) {
3901
4239
  console.log(` gerenciador ${r.deteccao.gerenciador}`);
3902
4240
  console.log(` verify ${Object.entries(r.deteccao.verify).map(([k, v]) => `${k}="${v}"`).join(', ') || '(nenhum script detectado)'}`);
3903
4241
  console.log(` AGENTS.md ${agents.estado}: ${agents.caminho}`);
4242
+ // Fatia 2 do ensaio da 0.5.0 (P3): o estado fica fora do git por um `.gitignore` proprio.
4243
+ if (r.estadoIgnorado)
4244
+ console.log(` estado ${manifest_1.DIR_ESTADO}/ fora do git (${manifest_1.DIR_ESTADO}/.gitignore com *; o seu .gitignore fica como está)`);
3904
4245
  console.log('');
3905
4246
  console.log(init_2.PROXIMO_PASSO_INIT);
3906
4247
  return 0;
@@ -3976,7 +4317,9 @@ function main(argvBruto) {
3976
4317
  // Preferência inválida vale o padrão e faz o adapter install pular o pacote: a consulta avisa.
3977
4318
  const avisos = manifesto.avisos.filter(a => a.startsWith('experiencia.config.invalid'));
3978
4319
  console.log(args.opcoes.json ? JSON.stringify({ ...p, avisos }, null, 2) :
3979
- `Experiência ${p.experience ? 'ativa' : 'desativada'}: ${p.language}, ${p.timezone}, profundidade ${p.depth}.\nSkill: ${p.skill}\nOrigens: ${JSON.stringify(p.origem)}` +
4320
+ `Experiência ${p.experience ? 'ativa' : 'desativada'}: ${p.language}, ${p.timezone}, profundidade ${p.depth}.\nSkill: ${p.skill}\n` +
4321
+ // Fatia 2 do ensaio da 0.5.0 (R2): as origens em texto, e nao o JSON cru.
4322
+ `Origens: ${Object.entries(p.origem).map(([chave, origem]) => `${chave} ${origem}`).join(', ')}` +
3980
4323
  avisos.map(a => `\nAviso: ${a}; o adapter install pula o pacote até ork onboarding set maestro corrigir.`).join(''));
3981
4324
  return 0;
3982
4325
  }
@@ -4047,7 +4390,9 @@ function main(argvBruto) {
4047
4390
  case 'grafo': {
4048
4391
  // RM-031 KG3 (D7): o argv cru depois do comando; o parser do grafo e estrito.
4049
4392
  const carregado = (0, manifest_1.exigirManifesto)();
4050
- 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) });
4051
4396
  }
4052
4397
  case 'ship':
4053
4398
  return comandoShip(args);