@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.
- package/adapters/claude-code/README.md +11 -2
- package/adapters/claude-code/agents/ork-master.md +2 -0
- package/adapters/claude-code/commands/master.md +8 -0
- package/adapters/claude-code/commands/onboarding.md +3 -2
- package/adapters/claude-code/commands/ork.md +9 -0
- package/adapters/codex/skills/ork/SKILL.md +18 -3
- package/adapters/hermes/README.md +1 -0
- package/adapters/hermes/bin/ork-network-status.sh +10 -0
- package/adapters/hermes/hermes.plugin.json +1 -0
- package/adapters/hermes/hitl-ingress/__init__.py +2 -2
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +6 -5
- package/adapters/openclaw/README.md +35 -4
- package/adapters/openclaw/dist/hitl-ingress.js +2 -2
- package/adapters/openclaw/dist/index.js +47 -12
- package/adapters/openclaw/openclaw.plugin.json +5 -1
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +2 -2
- package/adapters/openclaw/src/index.ts +50 -12
- package/assets/orkmind_bridge.py +117 -9
- package/dist/adapters/claude-bg.js +59 -11
- package/dist/adapters/codex.js +4 -3
- package/dist/agents-md.js +1 -0
- package/dist/auditrun.js +6 -2
- package/dist/board.js +16 -14
- package/dist/branch-de-estado.js +66 -10
- package/dist/busca-semantica.js +52 -12
- package/dist/canarios-rm057.js +149 -0
- package/dist/canarios.js +2 -0
- package/dist/ci.js +8 -1
- package/dist/claim-lint.js +3 -1
- package/dist/claims.js +39 -1
- package/dist/company-brain-context.js +158 -22
- package/dist/docs.js +110 -3
- package/dist/doctor-pulse-cron.js +194 -0
- package/dist/doctor-rede.js +149 -0
- package/dist/doctor.js +294 -37
- package/dist/entrega-pr.js +27 -8
- package/dist/esgotamentos.js +181 -0
- package/dist/experiencia.js +12 -2
- package/dist/fabrica-estado.js +35 -9
- package/dist/fabrica-publicar.js +6 -0
- package/dist/fechamento.js +20 -66
- package/dist/fix.js +3 -3
- package/dist/forja.js +31 -7
- package/dist/gates.js +5 -1
- package/dist/hitl-contract.js +59 -4
- package/dist/hitl-curto.js +11 -6
- package/dist/hitl-gates.js +5 -0
- package/dist/hitl-lote.js +5 -2
- package/dist/hitl-resumo.js +33 -1
- package/dist/hitl-tempo-parado.js +201 -0
- package/dist/hitl-texto-livre.js +5 -5
- package/dist/horario.js +27 -0
- package/dist/hosts.js +59 -13
- package/dist/impedimento.js +205 -0
- package/dist/index.js +433 -88
- package/dist/indice-vetorial.js +87 -10
- package/dist/indice.js +3 -1
- package/dist/init.js +28 -5
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +267 -30
- package/dist/intelligence-graph-contexto.js +215 -0
- package/dist/intelligence-graph-contract.js +71 -12
- package/dist/intelligence-graph-extract-md.js +41 -23
- package/dist/intelligence-graph-extract-ts.js +181 -11
- package/dist/intelligence-graph-extract.js +186 -9
- package/dist/intelligence-graph-index.js +205 -24
- package/dist/intelligence-graph-parsers.js +6 -4
- package/dist/intelligence-graph-repo.js +10 -0
- package/dist/leases.js +680 -87
- package/dist/ledger-stats.js +15 -1
- package/dist/ledger.js +12 -0
- package/dist/licoes.js +6 -4
- package/dist/liveness.js +2 -1
- package/dist/maestro-runtime.js +7 -1
- package/dist/manifest.js +44 -1
- package/dist/master-nota.js +14 -5
- package/dist/master.js +129 -12
- package/dist/mcp-artifacts.js +36 -3
- package/dist/mcp-git.js +80 -15
- package/dist/mcp-grafo-worker.js +93 -0
- package/dist/mcp-grafo.js +279 -0
- package/dist/mcp-install.js +2 -1
- package/dist/mcp-server.js +23 -1
- package/dist/mcp-ship.js +2 -0
- package/dist/mcp-verify.js +3 -1
- package/dist/memoria.js +48 -6
- package/dist/network-roadmap.js +195 -20
- package/dist/ocupacao.js +17 -5
- package/dist/onboarding.js +9 -4
- package/dist/orkmind.js +90 -5
- package/dist/orquestracao.js +14 -11
- package/dist/parado-no-condutor.js +1089 -0
- package/dist/phase.js +68 -15
- package/dist/policies.js +79 -3
- package/dist/portfolio.js +4 -1
- package/dist/projeto-alvo.js +5 -1
- package/dist/prompts.js +36 -1
- package/dist/prova-ativacao.js +414 -0
- package/dist/pulse-delivery.js +60 -7
- package/dist/pulse.js +99 -3
- package/dist/ratelimit.js +20 -4
- package/dist/recall.js +3 -1
- package/dist/rede-adesao.js +399 -0
- package/dist/rede-forja.js +289 -0
- package/dist/rede-projetos.js +239 -0
- package/dist/rede-status.js +336 -0
- package/dist/rede.js +980 -0
- package/dist/retry.js +69 -2
- package/dist/roadmap-status.js +162 -7
- package/dist/runtime-context.js +5 -1
- package/dist/runtime-profiles.js +22 -1
- package/dist/saida-segura.js +58 -0
- package/dist/session-watcher-claude.js +113 -23
- package/dist/sessoes-contas.js +187 -0
- package/dist/sessoes-inventario.js +6 -12
- package/dist/sessoes.js +87 -3
- package/dist/ship.js +110 -20
- package/dist/thread.js +212 -14
- package/dist/util.js +71 -4
- package/dist/verify.js +2 -2
- package/dist/worktree.js +34 -8
- package/eval/casos/onboarding.json +1 -1
- package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
- package/package.json +7 -3
- package/references/definition-of-done.md +1 -1
- package/skills/README.md +1 -1
- package/skills/core/onboarding/SKILL.md +3 -2
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/master-metrics/SKILL.md +8 -3
- 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]
|
|
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
|
|
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;
|
|
382
|
-
|
|
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] [--
|
|
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
|
|
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]
|
|
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]
|
|
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
|
-
|
|
572
|
-
|
|
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:
|
|
579
|
-
worktree:
|
|
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
|
-
|
|
671
|
-
//
|
|
672
|
-
//
|
|
673
|
-
|
|
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:
|
|
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
|
-
|
|
734
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1959
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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']
|
|
2626
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 = {
|
|
3683
|
-
|
|
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
|
|
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
|
|
4058
|
+
return codigo;
|
|
3699
4059
|
}
|
|
3700
|
-
console.log(
|
|
3701
|
-
|
|
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
|
-
|
|
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}\
|
|
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,
|
|
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);
|