@orkastery/cli 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/adapters/claude-code/agents/ork-check.md +1 -1
  2. package/adapters/claude-code/agents/ork-go.md +1 -1
  3. package/adapters/claude-code/agents/ork-goal.md +1 -1
  4. package/adapters/claude-code/agents/ork-master.md +1 -1
  5. package/adapters/claude-code/agents/ork-plan.md +1 -1
  6. package/adapters/claude-code/agents/ork-ship.md +1 -1
  7. package/adapters/claude-code/commands/ork.md +1 -1
  8. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +2 -0
  9. package/adapters/codex/skills/ork/SKILL.md +1 -1
  10. package/adapters/openclaw/openclaw.plugin.json +1 -1
  11. package/adapters/openclaw/package.json +1 -1
  12. package/assets/adapters-en/claude-code/agents/ork-check.md +1 -1
  13. package/assets/adapters-en/claude-code/agents/ork-go.md +1 -1
  14. package/assets/adapters-en/claude-code/agents/ork-goal.md +1 -1
  15. package/assets/adapters-en/claude-code/agents/ork-master.md +1 -1
  16. package/assets/adapters-en/claude-code/agents/ork-plan.md +1 -1
  17. package/assets/adapters-en/claude-code/agents/ork-ship.md +1 -1
  18. package/assets/adapters-en/claude-code/commands/ork.md +1 -1
  19. package/assets/adapters-en/codex/skills/ork/SKILL.md +1 -1
  20. package/assets/orkmind_fixture.py +4 -1
  21. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +1 -1
  22. package/assets/skills-en/phases/check-quality/SKILL.md +1 -1
  23. package/assets/skills-en/phases/go-implementation/SKILL.md +1 -1
  24. package/dist/adapters/claude-bg.js +9 -7
  25. package/dist/adapters/grok-events.js +227 -0
  26. package/dist/adapters/grok-mcp-servidor.js +622 -0
  27. package/dist/adapters/grok-mcp.js +178 -0
  28. package/dist/adapters/grok.js +686 -0
  29. package/dist/agendador-cpu.js +92 -0
  30. package/dist/branch-de-estado.js +7 -2
  31. package/dist/changelog-check.js +217 -0
  32. package/dist/check-agil.js +289 -25
  33. package/dist/check-paralelo.js +73 -18
  34. package/dist/ci.js +3 -2
  35. package/dist/claim-lint.js +29 -0
  36. package/dist/claims.js +4 -0
  37. package/dist/conducao.js +5 -0
  38. package/dist/docs.js +16 -16
  39. package/dist/doctor-forja.js +1 -3
  40. package/dist/doctor.js +1 -1
  41. package/dist/entrega-pr.js +10 -10
  42. package/dist/fabrica-estado.js +20 -11
  43. package/dist/fila-pesada.js +121 -11
  44. package/dist/hitl-classificacao.js +1 -0
  45. package/dist/horario.js +4 -1
  46. package/dist/index.js +63 -35
  47. package/dist/integracoes-locais.js +2 -0
  48. package/dist/intelligence-graph-cli.js +27 -9
  49. package/dist/locale-accounts.js +11 -3
  50. package/dist/locale-ajuda.js +10 -6
  51. package/dist/locale-claims.js +16 -2
  52. package/dist/locale-forja.js +2 -4
  53. package/dist/locale-grafo.js +56 -1
  54. package/dist/locale-maestro.js +38 -0
  55. package/dist/locale-network.js +8 -6
  56. package/dist/locale-onboarding.js +14 -0
  57. package/dist/locale-operacao-restante.js +2 -2
  58. package/dist/locale-preflight.js +80 -0
  59. package/dist/locale-projetos.js +6 -0
  60. package/dist/locale-prompts.js +8 -8
  61. package/dist/locale-pulse.js +4 -0
  62. package/dist/locale-retry.js +56 -2
  63. package/dist/locale-security-scan.js +35 -1
  64. package/dist/locale-ship.js +10 -2
  65. package/dist/locale-verify.js +15 -0
  66. package/dist/locale.js +24 -7
  67. package/dist/maestro-cli.js +12 -17
  68. package/dist/manifest.js +6 -1
  69. package/dist/mcp-install.js +24 -13
  70. package/dist/mcp-server.js +62 -33
  71. package/dist/mcp-verify-async.js +353 -0
  72. package/dist/mcp-verify-worker.js +17 -0
  73. package/dist/mcp-verify.js +10 -1
  74. package/dist/merge-da-entrega.js +85 -0
  75. package/dist/network-roadmap.js +18 -14
  76. package/dist/noctum-aceite.js +154 -14
  77. package/dist/noctum-cli.js +69 -12
  78. package/dist/noctum-entrega.js +55 -7
  79. package/dist/noctum-envelope.js +1 -1
  80. package/dist/noctum-execucao.js +5 -1
  81. package/dist/noctum-fechamento.js +18 -7
  82. package/dist/noctum-fila.js +6 -1
  83. package/dist/noctum-guarda.js +81 -4
  84. package/dist/noctum-maquinas.js +5 -1
  85. package/dist/noctum-modo.js +35 -7
  86. package/dist/noctum-reconciliacao.js +4 -1
  87. package/dist/noctum-rede.js +102 -0
  88. package/dist/noctum-relatorio.js +44 -10
  89. package/dist/noctum-retomada-rede.js +71 -0
  90. package/dist/noctum-vigia.js +49 -9
  91. package/dist/parado-no-condutor.js +14 -15
  92. package/dist/pedido-conducao.js +51 -0
  93. package/dist/phase.js +43 -15
  94. package/dist/postura-local.js +7 -3
  95. package/dist/preflight.js +27 -27
  96. package/dist/prompts.js +4 -2
  97. package/dist/pulse.js +4 -2
  98. package/dist/ratelimit.js +1 -0
  99. package/dist/rede.js +24 -12
  100. package/dist/retry.js +115 -10
  101. package/dist/runtime-context.js +165 -45
  102. package/dist/runtime-escada.js +7 -1
  103. package/dist/runtime-profiles.js +27 -17
  104. package/dist/runtimes.js +42 -5
  105. package/dist/security-scan/agil.js +18 -7
  106. package/dist/security-scan/cli.js +2 -2
  107. package/dist/security-scan/executor.js +8 -0
  108. package/dist/security-scan/report.js +1 -1
  109. package/dist/session-watcher-grok.js +425 -0
  110. package/dist/session-watcher.js +52 -11
  111. package/dist/sessoes-contas.js +33 -5
  112. package/dist/setup.js +11 -11
  113. package/dist/varredura-acoes.js +8 -15
  114. package/dist/verify.js +191 -43
  115. package/package.json +2 -2
  116. package/skills/core/orkastery-bootstrap/SKILL.md +1 -1
  117. package/skills/phases/check-quality/SKILL.md +1 -1
  118. package/skills/phases/go-implementation/SKILL.md +1 -1
package/dist/index.js CHANGED
@@ -146,6 +146,7 @@ const setup_1 = require("./setup");
146
146
  const runtime_profiles_1 = require("./runtime-profiles");
147
147
  const claude_bg_1 = require("./adapters/claude-bg");
148
148
  const codex_1 = require("./adapters/codex");
149
+ const grok_1 = require("./adapters/grok");
149
150
  const conducao_1 = require("./conducao");
150
151
  const conducao_sentinela_1 = require("./conducao-sentinela");
151
152
  const autorizacao_duravel_1 = require("./autorizacao-duravel");
@@ -632,11 +633,12 @@ function comandoOnboarding(args) {
632
633
  if (sub === 'reset' && (args.posicionais.length > 3 || 'conteudo' in args.opcoes))
633
634
  invalido();
634
635
  if (sub === 'sync' && 'por' in args.opcoes)
635
- throw new Error('onboarding.input.invalid: sync não aceita --por; informe autoria em set ou reset.');
636
+ throw new Error((0, locale_1.msg)().onboarding.syncPor);
636
637
  const carregado = (0, manifest_1.exigirManifesto)(), raiz = carregado.raiz, por = texto(args.opcoes.por) ?? 'owner';
637
638
  if (sub === 'sync') {
638
- const r = (0, memoria_1.sincronizarOnboarding)(carregado);
639
- console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : `${r.regime}${r.motivo ? ` (${r.motivo})` : ''}: ${r.detalhe}`);
639
+ const r = (0, locale_1.comLocale)('pt-BR', () => (0, memoria_1.sincronizarOnboarding)(carregado));
640
+ console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2)
641
+ : (0, locale_1.msg)().onboarding.syncResultado(r.regime, r.motivo, r.respondidas, r.gravadas, r.duplicadas, r.falhas));
640
642
  return 0;
641
643
  }
642
644
  let estado;
@@ -663,8 +665,9 @@ function comandoOnboarding(args) {
663
665
  }
664
666
  /**
665
667
  * I-33 (D8): `ork accounts list|add|remove|check`. O login e sempre do proprio CLI com o env do
666
- * perfil (`claude auth login`, `codex login`); o `ork` so guarda identidade, diretorio e estado,
667
- * nunca le, copia ou migra o que o CLI grava. A lista nao tem segredo porque o store nao tem.
668
+ * perfil (`claude auth login`, `codex login`, `grok login [--device-auth]`); o `ork` so guarda identidade,
669
+ * diretorio e estado, nunca le, copia ou migra o que o CLI grava (o `auth.json` do grok inclusive). A lista
670
+ * nao tem segredo porque o store nao tem.
668
671
  */
669
672
  /** A8: valor citado para colar no shell: aspas simples, e a aspa simples do proprio valor fechada e reaberta. */
670
673
  function aspasDeShell(valor) {
@@ -685,7 +688,8 @@ function comandoAccounts(args) {
685
688
  const raiz = carregado.raiz;
686
689
  const sub = args.posicionais[1] ?? 'list';
687
690
  // RM-061 (F3b, GO-FIX 1): a conferencia roda no escopo pt-BR (o detalhe vai ao store), e a impressao o traduz.
688
- const conferir = (p) => (0, locale_1.comLocale)('pt-BR', () => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p));
691
+ const conferir = (p) => (0, locale_1.comLocale)('pt-BR', () => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p)
692
+ : p.runtime === 'grok' ? (0, grok_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p));
689
693
  const detalhe = (auth) => ma.detalheDoLogin((0, locale_1.remontar)(auth.detalhe));
690
694
  // RM-061 (F3b, D3): o texto pelo catalogo; o que se grava (store de perfis, registro de contas) roda no escopo pt-BR,
691
695
  // e o id, o runtime, o diretorio, o motivo tipado e o detalhe que o CLI do runtime devolve saem como vieram.
@@ -709,7 +713,9 @@ function comandoAccounts(args) {
709
713
  }
710
714
  if (sub === 'add') {
711
715
  const id = args.posicionais[2], runtime = texto(args.opcoes.runtime), dirBruto = texto(args.opcoes.dir);
712
- if (!id || !runtime || !dirBruto) {
716
+ // RM-067 (F3): o codigo de dispositivo e do login do grok; nos outros runtimes, a opcao e recusada.
717
+ const dispositivo = args.opcoes['device-auth'] === true;
718
+ if (!id || !runtime || !dirBruto || (dispositivo && runtime !== 'grok')) {
713
719
  console.error(ma.usoAdd);
714
720
  return 2;
715
721
  }
@@ -730,10 +736,13 @@ function comandoAccounts(args) {
730
736
  const despacho = (0, runtime_profiles_1.perfilDeDespacho)(perfil);
731
737
  const variavel = runtime_profiles_1.VARIAVEL_DO_PERFIL[perfil.runtime];
732
738
  // D13: o login do claude e fixado na assinatura (`--claudeai`), nunca no Console de API.
733
- const comando = perfil.runtime === 'claude-bg' ? ['claude', 'auth', 'login', '--claudeai'] : ['codex', 'login'];
739
+ // RM-067 (F3, D1 b): o grok entra pela assinatura, no login do proprio CLI (navegador ou codigo de dispositivo).
740
+ const comando = perfil.runtime === 'claude-bg' ? ['claude', 'auth', 'login', '--claudeai']
741
+ : perfil.runtime === 'grok' ? (0, grok_1.comandoDeLogin)(dispositivo) : ['codex', 'login'];
734
742
  if (args.opcoes['sem-login'] !== true && process.stdin.isTTY && process.stdout.isTTY) {
735
743
  // Login interativo do proprio CLI, com o env do perfil sobre a assinatura higienizada.
736
- const env = perfil.runtime === 'claude-bg' ? (0, claude_bg_1.ambienteDoPerfil)(despacho) : (0, codex_1.ambienteDoDespacho)(process.env, despacho);
744
+ const env = perfil.runtime === 'claude-bg' ? (0, claude_bg_1.ambienteDoPerfil)(despacho)
745
+ : perfil.runtime === 'grok' ? (0, grok_1.ambienteDoFilho)({ perfil: despacho }) : (0, codex_1.ambienteDoDespacho)(process.env, despacho);
737
746
  (0, node_child_process_1.spawnSync)(comando[0], comando.slice(1), { stdio: 'inherit', env });
738
747
  }
739
748
  else {
@@ -745,7 +754,7 @@ function comandoAccounts(args) {
745
754
  (0, locale_1.comLocale)('pt-BR', () => (0, runtime_profiles_1.marcarFalhaDePerfil)(raiz, id, auth.pago
746
755
  ? { estado: 'provider-pago', esgotadoAte: null, motivo: 'cost.violation', detalhe: auth.detalhe }
747
756
  : { estado: 'sem-auth', esgotadoAte: null, motivo: 'runtime.auth-missing', detalhe: auth.detalhe }));
748
- console.log(ma.resultadoAdd(id, perfil.runtime, dir, auth.ok ? ma.conferido
757
+ console.log(ma.resultadoAdd(id, perfil.runtime, dir, auth.semConferencia ? ma.semConferenciaAdd(detalhe(auth)) : auth.ok ? ma.conferido
749
758
  : auth.transitorio ? ma.inconclusivaAdd(detalhe(auth))
750
759
  : auth.pago ? ma.pagoAdd(detalhe(auth)) : ma.semLoginAdd(detalhe(auth))));
751
760
  return 0;
@@ -779,7 +788,8 @@ function comandoAccounts(args) {
779
788
  for (const p of perfis) {
780
789
  const auth = conferir((0, runtime_profiles_1.perfilDeDespacho)(p));
781
790
  (0, locale_1.comLocale)('pt-BR', () => {
782
- if (auth.ok && (p.estado === 'sem-auth' || p.estado === 'provider-pago'))
791
+ // RM-067 (F3): sem conferencia (grok), o estado fica: so o login que o proprio CLI confere devolve o perfil.
792
+ if (auth.ok && !auth.semConferencia && (p.estado === 'sem-auth' || p.estado === 'provider-pago'))
783
793
  (0, runtime_profiles_1.reativarPerfil)(raiz, p.id);
784
794
  if (!auth.ok && auth.transitorio)
785
795
  (0, runtime_profiles_1.registrarConferenciaInconclusiva)(raiz, p.id, auth.detalhe);
@@ -804,7 +814,7 @@ function comandoAccounts(args) {
804
814
  volta ? ma.voltaEm((0, horario_1.formatarDataHoraRotulada)(volta)) : ma.voltaSemMedida,
805
815
  ...(expirados.has(p.id) ? [ma.marcaExpirada] : []),
806
816
  ].join('; ');
807
- console.log(`${ma.resultadoCheck(p.id, p.runtime, auth.ok ? ma.conferido
817
+ console.log(`${ma.resultadoCheck(p.id, p.runtime, auth.semConferencia ? ma.semConferenciaCheck(detalhe(auth)) : auth.ok ? ma.conferido
808
818
  : auth.transitorio ? ma.inconclusivaCheck(detalhe(auth))
809
819
  : auth.pago ? ma.pagoCheck(detalhe(auth)) : ma.semLoginCheck(detalhe(auth)))}; ${operacional}`);
810
820
  }
@@ -3033,7 +3043,7 @@ function comandoMaster(args) {
3033
3043
  return 0;
3034
3044
  }
3035
3045
  if (sub !== 'enviar')
3036
- throw new Error('uso: ork master digest <enviar|preview|responder>');
3046
+ throw new Error((0, locale_1.msg)().cli.masterDigestUso);
3037
3047
  const r = (0, master_digest_1.enviarDigest)({ raiz: carregado.raiz });
3038
3048
  console.log(JSON.stringify(r, null, 2));
3039
3049
  return r.code;
@@ -3053,14 +3063,14 @@ function comandoMaster(args) {
3053
3063
  const partes = (texto(args.opcoes.resposta) ?? '').trim().split(/\s+/);
3054
3064
  const classe = (0, master_2.parseClasse)(partes[3]);
3055
3065
  if (partes.length !== 4 || partes[0] !== 'ratificar' || !classe)
3056
- throw new Error('resposta deve ser ratificar <thread> <assinatura> <classe>');
3066
+ throw new Error((0, locale_1.msg)().cli.masterRatificarUso);
3057
3067
  selecao = [{ thread: partes[1], assinatura: partes[2], classe }];
3058
3068
  }
3059
3069
  else {
3060
3070
  selecao = (texto(args.opcoes.aceitar) ?? '').split(',').map(v => {
3061
3071
  const partes = v.trim().split(':');
3062
3072
  if (partes.length !== 2 || !/^[a-f0-9]{64}$/.test(partes[1]))
3063
- throw new Error('seleção deve ser thread:assinatura');
3073
+ throw new Error((0, locale_1.msg)().cli.masterSelecaoUso);
3064
3074
  return { thread: partes[0], assinatura: partes[1] };
3065
3075
  });
3066
3076
  }
@@ -3402,7 +3412,9 @@ function comandoDocs(args) {
3402
3412
  if (sub === 'verificar') {
3403
3413
  // RM-037 (fatia 3, GO-FIX 2): o CI passa --pr no pull_request; no push da main as duas regras novas reprovam.
3404
3414
  // RM-061 (F3b, G4): verifica no escopo pt-BR, como o `--json` leva os achados; o texto os remonta no locale do comando.
3405
- const { docs, achados } = (0, locale_1.comLocale)('pt-BR', () => (0, docs_1.verificarDocs)(raiz, { baseBranch, ajudaDoCli: AJUDA, pr: args.opcoes.pr === true }));
3415
+ const threadDaWorktree = (0, docs_1.escopoPadraoDoSync)(raiz).thread;
3416
+ const baseCarimbada = threadDaWorktree ? (0, thread_1.lerThread)(raiz, threadDaWorktree).base?.commit : undefined;
3417
+ const { docs, achados } = (0, locale_1.comLocale)('pt-BR', () => (0, docs_1.verificarDocs)(raiz, { baseBranch, baseCarimbada, ajudaDoCli: AJUDA, pr: args.opcoes.pr === true }));
3406
3418
  if (args.opcoes.json === true) {
3407
3419
  console.log(JSON.stringify({ paginas: docs.length, erros: achados.filter((a) => a.gravidade === 'erro').length,
3408
3420
  achados }, null, 2));
@@ -4426,8 +4438,10 @@ function executarComando(argvBruto) {
4426
4438
  const projeto = proprio ? undefined : extraida.projeto;
4427
4439
  // Helper fixo do host confiável: o projeto vem da instalação, nunca de toolargs.
4428
4440
  if (argv[0] === 'receipt-verifiers') {
4429
- if (argv.length !== 2 || argv[1] !== '--json' || projeto !== undefined)
4430
- throw Error('uso: ork receipt-verifiers --json');
4441
+ if (argv.length !== 2 || argv[1] !== '--json' || projeto !== undefined) {
4442
+ (0, locale_1.ativarLocale)(localeDaAjuda());
4443
+ throw new locale_1.ErroDoCatalogo((m) => m.cli.receiptVerifiersUso);
4444
+ }
4431
4445
  const root = process.env.ORK_HITL_ROOT;
4432
4446
  const privateKey = Object.keys(process.env).some(name => /^ORK_HITL_(?:INGRESS_KEY|NATIVE_KEY)/.test(name));
4433
4447
  if (root !== undefined || privateKey) {
@@ -4443,13 +4457,14 @@ function executarComando(argvBruto) {
4443
4457
  return 0;
4444
4458
  }
4445
4459
  if (argv[0] === 'maestro') {
4460
+ const textos = (0, locale_1.msg)(localeDaAjuda(projeto)).maestro;
4446
4461
  if (argv.length === 2 && argv[1] === '--help')
4447
- return (0, maestro_cli_1.runMaestroCli)(argv.slice(1));
4462
+ return (0, maestro_cli_1.runMaestroCli)(argv.slice(1), process.cwd(), {}, undefined, textos);
4448
4463
  // RM-052: o alvo explicito vira SELECAO entre as raizes permitidas; sem ele, o cwd de sempre. O
4449
4464
  // snapshot ja declara o projeto consultado (project.root, notConsulted): sem a linha da fatia 2.
4450
4465
  const alvo = fixarAlvoDoProcesso(projeto, false);
4451
- return alvo ? (0, maestro_cli_1.runMaestroCli)(argv.slice(1), alvo.raiz, { allowedRoots: [alvo.raiz], selected: alvo.raiz })
4452
- : (0, maestro_cli_1.runMaestroCli)(argv.slice(1));
4466
+ return alvo ? (0, maestro_cli_1.runMaestroCli)(argv.slice(1), alvo.raiz, { allowedRoots: [alvo.raiz], selected: alvo.raiz }, undefined, textos)
4467
+ : (0, maestro_cli_1.runMaestroCli)(argv.slice(1), process.cwd(), {}, undefined, textos);
4453
4468
  }
4454
4469
  const args = parseArgs(argv);
4455
4470
  const comando = args.posicionais[0];
@@ -4463,14 +4478,21 @@ function executarComando(argvBruto) {
4463
4478
  console.log((0, locale_1.msg)().ajuda.texto(dadosDaAjuda()));
4464
4479
  return 0;
4465
4480
  }
4481
+ // F3e (D2): a recusa do projeto-alvo e os usos das rotas cobertas acontecem antes do manifesto efetivo.
4482
+ // Resolva a lingua aqui; `--json` continua fora e um `mcp serve` valido desliga o locale antes de servir.
4483
+ if ((0, locale_1.cobreLocale)(args.posicionais, args.opcoes)) {
4484
+ (0, locale_1.ativarLocale)(localeDaAjuda(projeto));
4485
+ (0, locale_1.ligarRemontagem)(true);
4486
+ }
4466
4487
  if (!COMANDOS_SEM_PROJETO.has(comando) && !proprio) {
4467
4488
  fixarAlvoDoProcesso(projeto, !SEM_DECLARACAO_DO_PROJETO.has(`${comando} ${args.posicionais[1] ?? ''}`.trim()));
4468
4489
  }
4469
4490
  else if (projeto !== undefined && comando !== 'projetos') {
4491
+ const mp = (0, locale_1.msg)().projetos;
4470
4492
  throw new Error(comando === 'init'
4471
- ? 'uso: ork init cria o projeto no diretório atual; entre nele e rode ork init, sem --projeto'
4472
- : comando === 'mcp' ? 'uso: o servidor MCP recebe a raiz por --project <raiz absoluta>, não por --projeto'
4473
- : `uso: ork ${comando} não lê projeto; tire --projeto`);
4493
+ ? mp.initNaoLeProjeto
4494
+ : comando === 'mcp' ? mp.mcpNaoLeProjeto
4495
+ : mp.comandoNaoLeProjeto(comando));
4474
4496
  }
4475
4497
  const nomesHerdados = (0, runtime_ambiente_1.nomesDeProviderAtivos)();
4476
4498
  const ambienteManifesto = (0, manifest_1.carregarManifesto)();
@@ -4486,10 +4508,6 @@ function executarComando(argvBruto) {
4486
4508
  // CLI por locale (RM-061, EN1 e EN7): a escolha do onboarding (owner.language) ou o LC_ALL/LC_MESSAGES/LANG
4487
4509
  // decidem a lingua do TEXTO dos comandos cobertos (`cobreLocale`); `--json` e contrato, e os recortes ainda
4488
4510
  // fora do catalogo (`doctor --modo` e os subcomandos fora da lista) ficam em pt-BR.
4489
- if ((0, locale_1.cobreLocale)(args.posicionais, args.opcoes)) {
4490
- (0, locale_1.ativarLocale)((0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale);
4491
- (0, locale_1.ligarRemontagem)(true);
4492
- }
4493
4511
  switch (comando) {
4494
4512
  case 'mcp': {
4495
4513
  const projeto = texto(args.opcoes.project), host = texto(args.opcoes.host), threadId = texto(args.opcoes.thread);
@@ -4501,8 +4519,9 @@ function executarComando(argvBruto) {
4501
4519
  const permissoesFilho = texto(args.opcoes['child-permissions']) ?? 'interactive';
4502
4520
  const permissoesDono = texto(args.opcoes['owner-permissions']);
4503
4521
  const acao = args.posicionais[1];
4522
+ // RM-067 (F4b): o grok e host do install e do serve; o servidor dele recusa sem --thread (so a sessao filha).
4504
4523
  if (args.posicionais.length !== 2 || !['serve', 'install'].includes(acao) || !projeto ||
4505
- (host !== 'codex' && host !== 'claude-code') ||
4524
+ (host !== 'codex' && host !== 'claude-code' && host !== 'grok') ||
4506
4525
  Object.keys(args.opcoes).some(k => !['project', 'host', 'ship-transport', 'child-permissions', ...(acao === 'install' ? ['dry-run', 'owner-permissions', 'ssh-fingerprint'] : ['thread', 'dispatch'])].includes(k)) ||
4507
4526
  (args.opcoes.dispatch !== undefined && (!threadId || !dispatchId || !/^[a-f0-9-]{36}$/.test(dispatchId))) ||
4508
4527
  argv.filter(a => a === '--ship-transport' || a.startsWith('--ship-transport=')).length > 1 ||
@@ -4525,6 +4544,9 @@ function executarComando(argvBruto) {
4525
4544
  .catch(e => { console.error((0, locale_1.msg)().operacao.restante.mcp.erro(e.message)); process.exitCode = 1; });
4526
4545
  return 0;
4527
4546
  }
4547
+ // O servidor e contrato com hosts e nao ganha uma moldura inglesa por herdar o locale do erro de uso.
4548
+ (0, locale_1.ativarLocale)(undefined);
4549
+ (0, locale_1.ligarRemontagem)(false);
4528
4550
  void Promise.resolve().then(() => __importStar(require('./mcp-server'))).then(({ servirMcp }) => servirMcp({ projeto, host, threadId, dispatchId, nomesProviderHerdados: nomesHerdados, transporteShip: transporteShip, permissoesFilho: permissoesFilho })).catch(e => { console.error(`mcp: ${e.message}`); process.exitCode = 1; });
4529
4551
  return 0;
4530
4552
  }
@@ -4533,7 +4555,7 @@ function executarComando(argvBruto) {
4533
4555
  const bruto = texto(args.opcoes.modo);
4534
4556
  if (args.posicionais.length !== 1 || !bruto ||
4535
4557
  Object.keys(args.opcoes).some(k => k !== 'modo') || argv.filter(a => a === '--modo' || a.startsWith('--modo=')).length !== 1)
4536
- throw Error(`uso: ork doctor --modo ${modos_1.ORDEM_DOS_MODOS.join('|')}`);
4558
+ throw Error((0, locale_1.msg)().doctor.modoUso(modos_1.ORDEM_DOS_MODOS.join('|')));
4537
4559
  const r = (0, preflight_1.preflight)((0, manifest_1.diretorioDoProjeto)(), (0, modos_1.exigirModoVivo)(bruto), nomesHerdados);
4538
4560
  console.log((0, preflight_1.textoPreflight)(r));
4539
4561
  return r.prontoPrimeiroBloco ? 0 : 1;
@@ -4669,10 +4691,9 @@ function executarComando(argvBruto) {
4669
4691
  if (!host || !['claude-code', 'codex'].includes(host) || args.posicionais.length !== 3 ||
4670
4692
  Object.keys(args.opcoes).some(k => !['dry-run', 'json'].includes(k)) ||
4671
4693
  Object.values(args.opcoes).some(v => v !== true))
4672
- throw Error('uso: ork experiencia uninstall claude-code|codex [--dry-run] [--json]');
4694
+ throw Error((0, locale_1.msg)().onboarding.experienciaUninstallUso);
4673
4695
  const r = (0, hosts_2.desinstalarExperiencia)((0, manifest_1.exigirManifesto)().raiz, host, args.opcoes['dry-run'] === true);
4674
- console.log(args.opcoes.json ? JSON.stringify(r, null, 2) :
4675
- `${r.dryRun ? 'Simulação de remoção' : 'Remoção concluída'}: ${r.arquivos.length} arquivo(s). O adaptador permanece instalado. Para manter o pacote desativado, configure owner.experience:false no onboarding.`);
4696
+ console.log(args.opcoes.json ? JSON.stringify(r, null, 2) : (0, locale_1.msg)().onboarding.experienciaUninstall(r.dryRun, r.arquivos.length));
4676
4697
  return 0;
4677
4698
  }
4678
4699
  if ((args.posicionais[1] ?? 'show') !== 'show' || args.posicionais.length > 2 ||
@@ -4763,7 +4784,7 @@ function executarComando(argvBruto) {
4763
4784
  case 'recall':
4764
4785
  return comandoRecall(args);
4765
4786
  case 'brain': {
4766
- const result = (0, company_brain_cli_1.runBrain)((0, manifest_1.exigirManifesto)(), args.posicionais[1] ?? 'status', args.opcoes, args.posicionais.slice(2));
4787
+ const result = (0, locale_1.comLocale)('pt-BR', () => (0, company_brain_cli_1.runBrain)((0, manifest_1.exigirManifesto)(), args.posicionais[1] ?? 'status', args.opcoes, args.posicionais.slice(2)));
4767
4788
  console.log(JSON.stringify(result, null, 2));
4768
4789
  return ['ok', 'empty', 'unknown', 'withheld', 'applied', 'rolled-back'].includes(result.state) ? 0 : 1;
4769
4790
  }
@@ -4791,7 +4812,14 @@ function executarComando(argvBruto) {
4791
4812
  case 'ship':
4792
4813
  return comandoShip(args);
4793
4814
  case 'activation':
4794
- return (0, write_activation_1.comandoAtivacao)((0, manifest_1.exigirManifesto)(), args);
4815
+ try {
4816
+ return (0, locale_1.comLocale)('pt-BR', () => (0, write_activation_1.comandoAtivacao)((0, manifest_1.exigirManifesto)(), args));
4817
+ }
4818
+ catch (e) {
4819
+ if (e.message === 'uso: ork activation plan|status|enable|disable')
4820
+ throw new locale_1.ErroDoCatalogo((m) => m.cli.activationUso);
4821
+ throw e;
4822
+ }
4795
4823
  case 'lease':
4796
4824
  return comandoLease(args);
4797
4825
  case 'conducao':
@@ -22,4 +22,6 @@ exports.TESTES_DE_INTEGRACAO_LOCAL = new Set([
22
22
  'claims-conferir-sandbox.test.js',
23
23
  // Security scan (Task 13a): o scanner com o Docker real e as imagens do catalogo.
24
24
  'security-scan-integracao.test.js',
25
+ // RM-067 (F4c, D11): o grok falso confinado pelo Landlock do kernel, com o lancador em python3.
26
+ 'rm067-grok-landlock.test.js',
25
27
  ]);
@@ -38,6 +38,7 @@ exports.descreverVersoes = descreverVersoes;
38
38
  exports.correcaoDosAnalisadores = correcaoDosAnalisadores;
39
39
  exports.checarAnalisadoresDoGrafo = checarAnalisadoresDoGrafo;
40
40
  exports.lerPedido = lerPedido;
41
+ exports.linhasDaExtracao = linhasDaExtracao;
41
42
  exports.situacaoNaArvore = situacaoNaArvore;
42
43
  exports.executarGrafo = executarGrafo;
43
44
  /**
@@ -128,6 +129,7 @@ exports.USO_DO_GRAFO = [
128
129
  exports.TEXTOS_DO_GRAFO = {
129
130
  uso: exports.USO_DO_GRAFO.split('\n'),
130
131
  erroUso: (motivo) => `grafo.uso: ${motivo}`,
132
+ erroTipado: (mensagem) => mensagem,
131
133
  motivos: {
132
134
  semSub: 'falta o subcomando', desconhecido: (sub) => `subcomando desconhecido: ${sub}`,
133
135
  repetida: (nome) => `--${nome} repetida`, semValor: (nome) => `--${nome} nao leva valor`,
@@ -149,6 +151,15 @@ exports.TEXTOS_DO_GRAFO = {
149
151
  naoConferido: (motivo) => ` incremental nao conferido: ${motivo}`,
150
152
  aprovado: 'aprovado',
151
153
  semBase: 'sem base',
154
+ extracao: {
155
+ lista: (itens) => itens.length ? ` (${itens.slice(0, 5).join(', ')}${itens.length > 5 ? ` e mais ${itens.length - 5}` : ''})` : '',
156
+ incremental: (base, alterados, novos, removidos) => ` extracao incremental a partir do indice de ${base}: ${alterados} alterado(s), ${novos} novo(s), ${removidos} removido(s)`,
157
+ tsInteiro: (motivo) => `TypeScript inteiro (${motivo ?? ''})`,
158
+ tsParcial: (reextraidos, lista, programa, reaproveitados) => `TypeScript parcial, ${reextraidos} reextraido(s)${lista} num programa de ${programa}, ${reaproveitados} da base`,
159
+ tsBase: (reaproveitados) => `TypeScript todo da base (${reaproveitados})`,
160
+ markdown: (reextraidos, lista, reaproveitados) => ` Markdown: ${reextraidos} reextraido(s)${lista}, ${reaproveitados} da base`,
161
+ completa: (motivo) => ` extracao completa${motivo ? `: ${motivo}` : ''}`,
162
+ },
152
163
  },
153
164
  status: {
154
165
  titulo: (head, arvore) => `grafo: HEAD ${head}, arvore ${arvore}`,
@@ -282,23 +293,24 @@ const contagem = (o) => Object.entries(o).map(([k, v]) => `${k}=${v}`).join(' ')
282
293
  /** Ate cinco caminhos e quantos ficaram de fora. */
283
294
  const alguns = (lista) => (lista.length ? ` (${lista.slice(0, 5).join(', ')}${lista.length > 5 ? ` e mais ${lista.length - 5}` : ''})` : '');
284
295
  /** KG4: como a extracao rodou, a base e o que veio dela, ou por que foi completa. */
285
- function linhasDaExtracao(r) {
296
+ function linhasDaExtracao(r, mi) {
286
297
  if (r.modo === null)
287
298
  return [];
288
299
  const a = r.reaproveitamento;
300
+ const me = mi.extracao;
289
301
  if (r.modo === 'incremental' && r.base && a) {
290
302
  // Desestruturado: o lint de horario le o campo de nome curto do TypeScript como instante.
291
303
  const { ts: doTs, md: doMd, mudanca } = a;
292
- const ts = doTs.modo === 'inteiro' ? `TypeScript inteiro (${doTs.motivo})`
293
- : doTs.modo === 'parcial' ? `TypeScript parcial, ${doTs.reextraidos.length} reextraido(s)${alguns(doTs.reextraidos)} num programa de ${doTs.programa}, ${doTs.reaproveitados} da base`
294
- : `TypeScript todo da base (${doTs.reaproveitados})`;
304
+ const ts = doTs.modo === 'inteiro' ? me.tsInteiro(doTs.motivo)
305
+ : doTs.modo === 'parcial' ? me.tsParcial(doTs.reextraidos.length, me.lista(doTs.reextraidos), doTs.programa, doTs.reaproveitados)
306
+ : me.tsBase(doTs.reaproveitados);
295
307
  return [
296
- ` extracao incremental a partir do indice de ${r.base.revision.slice(0, 12)}: ${mudanca.alterados} alterado(s), ${mudanca.novos} novo(s), ${mudanca.removidos} removido(s)`,
308
+ me.incremental(r.base.revision.slice(0, 12), mudanca.alterados, mudanca.novos, mudanca.removidos),
297
309
  ` ${ts}`,
298
- ` Markdown: ${doMd.reextraidos.length} reextraido(s)${alguns(doMd.reextraidos)}, ${doMd.reaproveitados} da base`,
310
+ me.markdown(doMd.reextraidos.length, me.lista(doMd.reextraidos), doMd.reaproveitados),
299
311
  ];
300
312
  }
301
- return [` extracao completa${r.motivo_completo ? `: ${r.motivo_completo}` : ''}`];
313
+ return [me.completa(r.motivo_completo)];
302
314
  }
303
315
  function indexar(ctx, p) {
304
316
  const r = (0, intelligence_graph_index_1.construirIndice)(ctx, { verificar: p.bandeiras.has('verificar'), forcar: p.bandeiras.has('forcar') });
@@ -314,7 +326,7 @@ function indexar(ctx, p) {
314
326
  mi.campo(mi.campos.conferencia, mi.conferencia(m.conferencia.fontes, m.conferencia.evidencias)),
315
327
  mi.campo(mi.campos.nos, contagem(m.contagens.nos)), mi.campo(mi.campos.arestas, contagem(m.contagens.arestas)),
316
328
  mi.campo(mi.campos.lugar, `${r.dir} (${mb(m.graph_bytes + m.report_bytes + m.units_bytes)})`),
317
- ...linhasDaExtracao(r),
329
+ ...linhasDaExtracao(r, mi),
318
330
  ];
319
331
  if (r.motivo)
320
332
  linhas.push(mi.campo(mi.campos.motivo, r.motivo));
@@ -757,6 +769,12 @@ const erroEmJson = (ctx, e, compacto, schema = intelligence_graph_query_1.CONSUL
757
769
  ctx.escrever(compacto ? JSON.stringify(r) : JSON.stringify(r, null, 2));
758
770
  return 1;
759
771
  };
772
+ /** Traduz a mensagem sem apagar a classe, os candidatos ou o stack do erro tipado. */
773
+ const erroHumano = (ctx, e) => {
774
+ const erro = e instanceof Error ? e : new Error(String(e));
775
+ erro.message = textosDe(ctx).erroTipado(erro.message);
776
+ return erro;
777
+ };
760
778
  /** `ork grafo <subcomando> ...`: devolve o codigo de saida; sem `--json`, o erro de uso ou tipado e lancado. */
761
779
  function executarGrafo(argv, ctx) {
762
780
  const schema = argv[0] === 'contexto' ? intelligence_graph_contexto_1.CONTEXTO_SCHEMA : intelligence_graph_query_1.CONSULTA_SCHEMA;
@@ -786,7 +804,7 @@ function executarGrafo(argv, ctx) {
786
804
  }
787
805
  catch (e) {
788
806
  if (!p.bandeiras.has('json'))
789
- throw e;
807
+ throw erroHumano(ctx, e);
790
808
  return erroEmJson(ctx, e, compacto, schema);
791
809
  }
792
810
  }
@@ -12,7 +12,7 @@
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.ACCOUNTS_EN = exports.ACCOUNTS_PT_BR = void 0;
14
14
  /**
15
- * O detalhe da conferencia de login que o proprio ork escreve (`conferirAuth` do claude e do codex) e dado: vai ao store
15
+ * O detalhe da conferencia de login que o proprio ork escreve (`conferirAuth` do claude, do codex e do grok) e dado: vai ao store
16
16
  * em pt-BR e so a impressao o traduz, pela frase exata. A saida do CLI que vem dentro dele (o trecho do `codex`) segue
17
17
  * como veio.
18
18
  */
@@ -29,6 +29,10 @@ const DETALHES_DO_LOGIN_EN = [
29
29
  [/^codex login status: login por API key \(provider pago\)$/, () => 'codex login status: API key login (paid provider)'],
30
30
  [/^codex login status: login sem assinatura ChatGPT comprovada \(tratado como provider pago\)$/,
31
31
  () => 'codex login status: login without a proven ChatGPT subscription (treated as a paid provider)'],
32
+ [/^o grok nao documenta conferencia de login; o despacho prova o login \(erro de login do runtime vira runtime\.auth-missing\)$/,
33
+ () => 'grok documents no login check; the dispatch proves the login (a runtime login error becomes runtime.auth-missing)'],
34
+ [/^runtime\.profiles\.invalid: perfil sem grokHome no despacho grok$/,
35
+ () => 'runtime.profiles.invalid: profile without grokHome in the grok dispatch'],
32
36
  ];
33
37
  const ESTADOS_EN = {
34
38
  ativo: 'active', esgotado: 'exhausted', 'sem-auth': 'no-auth', 'provider-pago': 'paid-provider', desativado: 'disabled',
@@ -39,7 +43,7 @@ exports.ACCOUNTS_PT_BR = {
39
43
  /** O estado gravado no store, como o texto o mostra. */
40
44
  estado: (estado) => estado,
41
45
  falhaEm: (motivo, quando) => `${motivo} em ${quando}`,
42
- usoAdd: 'uso: ork accounts add <id> --runtime claude-bg|codex --dir <diretorio> [--sem-login]',
46
+ usoAdd: 'uso: ork accounts add <id> --runtime claude-bg|codex|grok --dir <diretorio> [--sem-login] [--device-auth (so grok)]',
43
47
  reativado: (id) => `Perfil ${id} reativado: mesmo id, runtime e diretorio do perfil desativado.`,
44
48
  recusado: (erro) => `perfil recusado: ${erro}`,
45
49
  loginPendente: (variavel, dir, comando, id) => `Login pendente: rode ${variavel}=${dir} ${comando} e depois ork accounts check ${id}`,
@@ -48,6 +52,7 @@ exports.ACCOUNTS_PT_BR = {
48
52
  /** O detalhe da conferencia de login (dado do store), como a impressao o mostra. */
49
53
  detalheDoLogin: (detalhe) => detalhe,
50
54
  inconclusivaAdd: (detalhe) => `conferencia de login inconclusiva (${detalhe}); o proximo despacho confere de novo`,
55
+ semConferenciaAdd: (detalhe) => `login sem conferencia previa (${detalhe}); o perfil entra no rodizio`,
51
56
  pagoAdd: (detalhe) => `provider pago (${detalhe}); nunca recebe despacho`,
52
57
  semLoginAdd: (detalhe) => `sem login (${detalhe}); fora do rodizio`,
53
58
  usoRemove: 'uso: ork accounts remove <id>',
@@ -55,6 +60,7 @@ exports.ACCOUNTS_PT_BR = {
55
60
  perfilAtivoNaoExiste: (alvo) => `perfil ativo "${alvo}" nao existe (veja: ork accounts list)`,
56
61
  resultadoCheck: (id, runtime, situacao) => `${id} (${runtime}): ${situacao}`,
57
62
  inconclusivaCheck: (detalhe) => `conferencia de login inconclusiva, estado mantido (${detalhe})`,
63
+ semConferenciaCheck: (detalhe) => `login sem conferencia previa, estado mantido (${detalhe})`,
58
64
  pagoCheck: (detalhe) => `provider pago, nunca despacha (${detalhe})`,
59
65
  semLoginCheck: (detalhe) => `sem login (${detalhe})`,
60
66
  tipoDeLimite: (tipo) => ({ sessao: 'sessao', semanal: 'semanal', 'gasto-admin': 'gasto definido pelo admin',
@@ -132,7 +138,7 @@ exports.ACCOUNTS_EN = {
132
138
  colunas: ['PROFILE', 'RUNTIME', 'DIRECTORY', 'STATE', 'EXHAUSTED UNTIL', 'LAST USE', 'LAST FAILURE'],
133
139
  estado: (estado) => ESTADOS_EN[estado] ?? estado,
134
140
  falhaEm: (motivo, quando) => `${motivo} at ${quando}`,
135
- usoAdd: 'usage: ork accounts add <id> --runtime claude-bg|codex --dir <directory> [--sem-login]',
141
+ usoAdd: 'usage: ork accounts add <id> --runtime claude-bg|codex|grok --dir <directory> [--sem-login] [--device-auth (grok only)]',
136
142
  reativado: (id) => `Profile ${id} reactivated: same id, runtime and directory as the disabled profile.`,
137
143
  recusado: (erro) => `profile refused: ${erro}`,
138
144
  loginPendente: (variavel, dir, comando, id) => `Login pending: run \`${variavel}=${dir} ${comando}\`, then \`ork accounts check ${id}\``,
@@ -143,6 +149,7 @@ exports.ACCOUNTS_EN = {
143
149
  return regra ? regra[1](...(regra[0].exec(detalhe) ?? []).slice(1)) : detalhe;
144
150
  },
145
151
  inconclusivaAdd: (detalhe) => `login check inconclusive (${detalhe}); the next dispatch checks again`,
152
+ semConferenciaAdd: (detalhe) => `login without a prior check (${detalhe}); the profile joins the rotation`,
146
153
  pagoAdd: (detalhe) => `paid provider (${detalhe}); never receives a dispatch`,
147
154
  semLoginAdd: (detalhe) => `no login (${detalhe}); out of the rotation`,
148
155
  usoRemove: 'usage: ork accounts remove <id>',
@@ -150,6 +157,7 @@ exports.ACCOUNTS_EN = {
150
157
  perfilAtivoNaoExiste: (alvo) => `active profile "${alvo}" does not exist (see: \`ork accounts list\`)`,
151
158
  resultadoCheck: (id, runtime, situacao) => `${id} (${runtime}): ${situacao}`,
152
159
  inconclusivaCheck: (detalhe) => `login check inconclusive, state kept (${detalhe})`,
160
+ semConferenciaCheck: (detalhe) => `login without a prior check, state kept (${detalhe})`,
153
161
  pagoCheck: (detalhe) => `paid provider, never dispatches (${detalhe})`,
154
162
  semLoginCheck: (detalhe) => `no login (${detalhe})`,
155
163
  tipoDeLimite: (tipo) => ({ sessao: 'session', semanal: 'weekly', 'gasto-admin': 'admin-defined spend',
@@ -33,12 +33,12 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
33
33
  experiencia uninstall <host> [--dry-run] [--json]
34
34
  Remove o bloco de Claude Code/Codex; sem --dry-run aplica a remoção
35
35
  setup <modo> Config atual de cada bloco do modo
36
- setup <modo> --bloco N [--runtime R] Edita o bloco (runtimes: claude-bg, codex);
36
+ setup <modo> --bloco N [--runtime R] Edita o bloco (runtimes: claude-bg, codex, grok);
37
37
  [--model M] [--effort E] [--por Q] evento setup_configured no ledger do projeto
38
38
  [--fallback R:M[:E],...] ordem de fallback de runtime do bloco (I-33)
39
39
  accounts list [--json] Perfis de conta por runtime, sem segredo (I-33)
40
40
  accounts add <id> --runtime R --dir D Cria o perfil e roda o login do proprio CLI com o env
41
- [--sem-login] do perfil (nunca copia credencial)
41
+ [--sem-login] [--device-auth] do perfil (nunca copia credencial; codigo de dispositivo so no grok)
42
42
  accounts remove <id> Desativa o perfil (diretorio e login ficam onde estao)
43
43
  accounts check [<id>] Confere o login de cada perfil e marca o store
44
44
  accounts esgotamentos [--desde 7d] [--json]
@@ -120,6 +120,8 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
120
120
  destrava (pega HITL de sessao SEM thread)
121
121
  noctum propor --arquivo <envelope.json> Propõe o envelope de um arco #Noctum (RM-058) e pergunta ao dono, com código
122
122
  curto e alternativas, também no canal dele; não autoriza nada
123
+ noctum maquina [--json] A entrada desta máquina em maquinas do envelope v3 (RM-058): o nome, a chave
124
+ pública e a impressão dela; a chave privada não sai desta raiz
123
125
  noctum revogar <arco> [--json] Pergunta ao dono se revoga o arco (RM-057); quem revoga é a resposta dele,
124
126
  no Telegram ou pelo diálogo do host
125
127
  noctum responder <arco> --resposta-stdin --origem telegram --canal C --por ID --mensagem REF [--conta ID]
@@ -352,7 +354,7 @@ Uso: ork [--projeto <nome|caminho>] <comando> [argumentos]
352
354
  o padrao e o item dela; --todos volta a todo item (RM-037)
353
355
  docs init Cria padroes, modelos, indices e o lint de Markdown no projeto
354
356
 
355
- mcp serve --project RAIZ --host HOST Servidor MCP stdio deste projeto (codex|claude-code)
357
+ mcp serve --project RAIZ --host HOST Servidor MCP stdio deste projeto (codex|claude-code; grok so na sessao filha, com --thread)
356
358
  mcp install --project RAIZ --host HOST Prepara MCP; aceita --dry-run, --ship-transport, --child-permissions e --owner-permissions (Codex)
357
359
 
358
360
  adapter list Adaptadores de host (Camada 1) e o destino de cada um
@@ -445,12 +447,12 @@ Usage: ork [--projeto <name|path>] <command> [arguments]
445
447
  experiencia uninstall <host> [--dry-run] [--json]
446
448
  Removes the Claude Code/Codex block; without --dry-run it applies the removal
447
449
  setup <mode> Current config of each block of the mode
448
- setup <mode> --bloco N [--runtime R] Edits the block (runtimes: claude-bg, codex);
450
+ setup <mode> --bloco N [--runtime R] Edits the block (runtimes: claude-bg, codex, grok);
449
451
  [--model M] [--effort E] [--por Q] setup_configured event in the project ledger
450
452
  [--fallback R:M[:E],...] runtime fallback order of the block (I-33)
451
453
  accounts list [--json] Account profiles per runtime, without secrets (I-33)
452
454
  accounts add <id> --runtime R --dir D Creates the profile and runs the CLI's own login with the profile
453
- [--sem-login] env (never copies a credential)
455
+ [--sem-login] [--device-auth] env (never copies a credential; device code only for grok)
454
456
  accounts remove <id> Deactivates the profile (directory and login stay where they are)
455
457
  accounts check [<id>] Checks the login of each profile and marks the store
456
458
  accounts esgotamentos [--desde 7d] [--json]
@@ -532,6 +534,8 @@ Usage: ork [--projeto <name|path>] <command> [arguments]
532
534
  unblocks it (catches HITL of sessions WITHOUT a thread)
533
535
  noctum propor --arquivo <envelope.json> Proposes the envelope of a #Noctum arc (RM-058) and asks the owner, with a short
534
536
  code and choices, also on the owner's channel; it authorizes nothing
537
+ noctum maquina [--json] This machine's entry in maquinas of the v3 envelope (RM-058): its name, public key
538
+ and fingerprint; the private key never leaves this root
535
539
  noctum revogar <arc> [--json] Asks the owner whether to revoke the arc (RM-057); the owner's answer revokes,
536
540
  on Telegram or through the host dialog
537
541
  noctum responder <arc> --resposta-stdin --origem telegram --canal C --por ID --mensagem REF [--conta ID]
@@ -764,7 +768,7 @@ Usage: ork [--projeto <name|path>] <command> [arguments]
764
768
  the default is its item; --todos goes back to every item (RM-037)
765
769
  docs init Creates standards, templates, indexes and the Markdown lint in the project
766
770
 
767
- mcp serve --project ROOT --host HOST stdio MCP server of this project (codex|claude-code)
771
+ mcp serve --project ROOT --host HOST stdio MCP server of this project (codex|claude-code; grok only in the child session, with --thread)
768
772
  mcp install --project ROOT --host HOST Prepares MCP; accepts --dry-run, --ship-transport, --child-permissions and --owner-permissions (Codex)
769
773
 
770
774
  adapter list Host adapters (Layer 1) and the target of each one
@@ -49,14 +49,21 @@ exports.CLAIMS_PT_BR = {
49
49
  avisoNegativa: 'AVISO: alegacao negativa sem comando de verificacao reprova em `ork verify`.',
50
50
  /** A linha do lint no `claims add` (no `ci prepare` o lint sai em pt-BR, como antes). */
51
51
  avisoDoLint: (linha, suiteInteira) => `AVISO: ${linha}${suiteInteira ? '. O `ci prepare` recusa esta claim.' : ''}`,
52
+ lintRecusado: (linhas) => `claim recusada antes de ser registrada:\n ${linhas}`,
52
53
  linhaDoLint: (claim, nome, trecho, correcao) => `${claim} ${nome} (${trecho}); ${correcao}`,
53
54
  nomesDoLint: { 'suite-inteira': 'roda a suite inteira', 'sha-intermediario': 'fixa um SHA intermediario',
54
- 'contagem-de-commits': 'compara contagem de commits' },
55
+ 'contagem-de-commits': 'compara contagem de commits', 'binario-rg': 'usa o binario rg ausente no runner',
56
+ 'ork-fora-do-path': 'chama ork fora do PATH do runner', 'estado-local': 'le estado local fora do checkout',
57
+ 'aspas-escapadas': 'leva aspas escapadas literalmente' },
55
58
  correcoesDoLint: {
56
59
  'suite-inteira': 'rode só o teste da claim (`node --test` no arquivo do teste, ou o comando do projeto que roda um arquivo) ' +
57
60
  'ou um script hermético do projeto',
58
61
  'sha-intermediario': 'ancore na base (`git diff "$(git merge-base origin/main HEAD)" HEAD`) ou prove ancestralidade com `git merge-base --is-ancestor <sha> HEAD`',
59
62
  'contagem-de-commits': 'use `git merge-base --is-ancestor <commit> HEAD`: contagem de commits quebra com rebase e merge',
63
+ 'binario-rg': 'use `grep` (ou Node) com a mesma prova; o runner nao instala `rg`',
64
+ 'ork-fora-do-path': 'use `node core/dist/index.js ...`; o runner nao instala `ork` no PATH',
65
+ 'estado-local': 'prove somente arquivos versionados do checkout; `.orkastery/` e estado local e nao vai ao CI',
66
+ 'aspas-escapadas': 'use aspas reais do shell; nao serialize `\\x22` ou `\\x27` dentro do comando',
60
67
  },
61
68
  // ork claims conferir
62
69
  usoConferir: 'uso: ork claims conferir <thread-id> --claims C1,C2 | --tarefa T1 [--prazo S] [--json]',
@@ -138,14 +145,21 @@ exports.CLAIMS_EN = {
138
145
  estado: (estado) => ESTADOS_EN[estado] ?? estado,
139
146
  avisoNegativa: 'WARNING: a negative statement without a verification command fails in `ork verify`.',
140
147
  avisoDoLint: (linha, suiteInteira) => `WARNING: ${linha}${suiteInteira ? '. `ci prepare` refuses this claim.' : ''}`,
148
+ lintRecusado: (linhas) => `claim refused before it was recorded:\n ${linhas}`,
141
149
  linhaDoLint: (claim, nome, trecho, correcao) => `${claim} ${nome} (${trecho}); ${correcao}`,
142
150
  nomesDoLint: { 'suite-inteira': 'runs the whole suite', 'sha-intermediario': 'pins an intermediate SHA',
143
- 'contagem-de-commits': 'compares a commit count' },
151
+ 'contagem-de-commits': 'compares a commit count', 'binario-rg': 'uses the rg binary missing from the runner',
152
+ 'ork-fora-do-path': 'calls ork outside the runner PATH', 'estado-local': 'reads local state outside the checkout',
153
+ 'aspas-escapadas': 'passes escaped quotes literally' },
144
154
  correcoesDoLint: {
145
155
  'suite-inteira': 'run only the claim test (`node --test` on the test file, or the project command that runs one file) ' +
146
156
  'or a hermetic project script',
147
157
  'sha-intermediario': 'anchor on the base (`git diff "$(git merge-base origin/main HEAD)" HEAD`) or prove ancestry with `git merge-base --is-ancestor <sha> HEAD`',
148
158
  'contagem-de-commits': 'use `git merge-base --is-ancestor <commit> HEAD`: a commit count breaks with rebase and merge',
159
+ 'binario-rg': 'use `grep` (or Node) for the same proof; the runner does not install `rg`',
160
+ 'ork-fora-do-path': 'use `node core/dist/index.js ...`; the runner does not install `ork` in PATH',
161
+ 'estado-local': 'prove only versioned checkout files; `.orkastery/` is local state and is not sent to CI',
162
+ 'aspas-escapadas': 'use real shell quotes; do not serialize `\\x22` or `\\x27` inside the command',
149
163
  },
150
164
  usoConferir: 'usage: ork claims conferir <thread-id> --claims C1,C2 | --tarefa T1 [--prazo S] [--json]',
151
165
  conferencia: (thread) => `Spot check of thread ${thread} (no receipt: \`ork verify\` is still what verifies)`,
@@ -95,10 +95,9 @@ exports.FORJA_PT_BR = {
95
95
  projetoGitlab: (metodo, squash, mergedResults, mergeTrain) => `merge ${metodo}; squash ${squash}; merged results ${mergedResults}; merge train ${mergeTrain}`,
96
96
  projetoGithub: (merge, squash, rebase) => `merge commit ${merge}; squash ${squash}; rebase ${rebase}`,
97
97
  avisoFf: 'com fast-forward não há commit de merge: o assunto ship(<thread>) não chega à base',
98
- avisoMensagemPadrao: 'a mensagem de merge padrão (Merge branch …) não começa por ship(<thread>)',
99
98
  avisoSquash: (opcao) => `squash ${opcao}: a entrega por squash não se liga ao head verificado (entrega.sem-vinculo)`,
100
99
  avisoSemMergeCommit: 'sem merge commit, a entrega por PR não se liga ao head verificado (entrega.sem-vinculo)',
101
- projetoGitlabCorrecao: 'em Settings > Merge requests, use merge commit e um modelo de mensagem de merge que comece por %{title}',
100
+ projetoGitlabCorrecao: 'em Settings > Merge requests, use merge commit e deixe squash desativado',
102
101
  projetoGithubCorrecao: 'em Settings > General > Pull Requests, permita merge commits',
103
102
  capacidades: (ligadas) => `ligadas: ${ligadas}`,
104
103
  capacidadesDesligadas: (ligadas, desligadas) => `ligadas: ${ligadas}; desligadas (o adaptador não implementa): ${desligadas}`,
@@ -236,10 +235,9 @@ exports.FORJA_EN = {
236
235
  projetoGitlab: (metodo, squash, mergedResults, mergeTrain) => `merge ${metodo}; squash ${squash}; merged results ${mergedResults}; merge train ${mergeTrain}`,
237
236
  projetoGithub: (merge, squash, rebase) => `merge commit ${merge}; squash ${squash}; rebase ${rebase}`,
238
237
  avisoFf: 'with fast-forward there is no merge commit: the ship(<thread>) subject does not reach the base',
239
- avisoMensagemPadrao: 'the default merge message (Merge branch …) does not start with ship(<thread>)',
240
238
  avisoSquash: (opcao) => `squash ${opcao}: a squash delivery is not linked to the verified head (entrega.sem-vinculo)`,
241
239
  avisoSemMergeCommit: 'without merge commits, a PR delivery is not linked to the verified head (entrega.sem-vinculo)',
242
- projetoGitlabCorrecao: 'in Settings > Merge requests, use merge commit and a merge message template that starts with %{title}',
240
+ projetoGitlabCorrecao: 'in Settings > Merge requests, use merge commits and leave squash disabled',
243
241
  projetoGithubCorrecao: 'in Settings > General > Pull Requests, allow merge commits',
244
242
  capacidades: (ligadas) => `on: ${ligadas}`,
245
243
  capacidadesDesligadas: (ligadas, desligadas) => `on: ${ligadas}; off (the adapter does not implement them): ${desligadas}`,