@orkastery/cli 0.4.2 → 0.5.0

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 (128) hide show
  1. package/adapters/README.md +11 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +3 -1
  3. package/adapters/claude-code/agents/ork-check.md +1 -1
  4. package/adapters/claude-code/agents/ork-go.md +2 -2
  5. package/adapters/claude-code/agents/ork-goal.md +1 -1
  6. package/adapters/claude-code/agents/ork-master.md +1 -1
  7. package/adapters/claude-code/agents/ork-plan.md +1 -1
  8. package/adapters/claude-code/agents/ork-ship.md +1 -1
  9. package/adapters/claude-code/commands/master.md +11 -8
  10. package/adapters/claude-code/commands/ork.md +8 -0
  11. package/adapters/claude-code/commands/ship.md +2 -2
  12. package/adapters/codex/skills/ork/SKILL.md +12 -1
  13. package/adapters/hermes/README.md +3 -0
  14. package/adapters/hermes/bin/ork-abrir-thread.sh +17 -2
  15. package/adapters/hermes/bin/ork-brain.sh +3 -0
  16. package/adapters/hermes/bin/ork-maestro.sh +4 -1
  17. package/adapters/hermes/bin/ork-network-roadmap.sh +11 -0
  18. package/adapters/hermes/bin/ork-roadmap-status.sh +9 -0
  19. package/adapters/hermes/hermes.plugin.json +2 -0
  20. package/adapters/hermes/hitl-ingress/__init__.py +36 -3
  21. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +19 -20
  22. package/adapters/openclaw/README.md +34 -3
  23. package/adapters/openclaw/dist/hitl-ingress.js +37 -3
  24. package/adapters/openclaw/dist/index.js +92 -39
  25. package/adapters/openclaw/openclaw.plugin.json +10 -3
  26. package/adapters/openclaw/package.json +2 -2
  27. package/adapters/openclaw/src/hitl-ingress.ts +32 -3
  28. package/adapters/openclaw/src/index.ts +108 -41
  29. package/assets/docs/padroes/documentacao-de-produto.md +2 -2
  30. package/assets/docs/padroes/roadmap-de-produto.md +1 -1
  31. package/assets/docs/produto/_modelo-feature.md +2 -0
  32. package/assets/orkmind_bridge.py +214 -1
  33. package/dist/adapters/claude-bg.js +88 -9
  34. package/dist/adapters/codex-events.js +3 -1
  35. package/dist/board.js +74 -0
  36. package/dist/branch-de-estado.js +5 -4
  37. package/dist/busca-semantica.js +161 -0
  38. package/dist/ci.js +141 -10
  39. package/dist/company-brain-cli.js +27 -2
  40. package/dist/company-brain-context.js +132 -0
  41. package/dist/company-brain-dossie.js +376 -0
  42. package/dist/company-brain-mcp.js +4 -1
  43. package/dist/conducao.js +117 -31
  44. package/dist/decisao-autonoma.js +42 -0
  45. package/dist/docs.js +64 -22
  46. package/dist/doctor.js +33 -0
  47. package/dist/entrega-pr.js +109 -5
  48. package/dist/experiencia-instalacao.js +256 -0
  49. package/dist/experiencia.js +72 -0
  50. package/dist/fabrica-estado.js +43 -10
  51. package/dist/fechamento.js +105 -0
  52. package/dist/fix.js +1 -1
  53. package/dist/forja.js +435 -0
  54. package/dist/gates.js +10 -1
  55. package/dist/hitl-classificacao.js +11 -1
  56. package/dist/hitl-contract.js +50 -7
  57. package/dist/hitl-curto.js +158 -0
  58. package/dist/hitl-gates.js +67 -1
  59. package/dist/hitl-lote.js +30 -15
  60. package/dist/hitl-presentation.js +10 -7
  61. package/dist/hitl-resumo.js +33 -12
  62. package/dist/hitl-texto-livre.js +150 -0
  63. package/dist/hosts.js +86 -1
  64. package/dist/index.js +605 -41
  65. package/dist/indice-vetorial.js +317 -0
  66. package/dist/init.js +13 -0
  67. package/dist/integracoes-locais.js +1 -1
  68. package/dist/intelligence-benchmark-contract.js +570 -0
  69. package/dist/intelligence-graph-cli.js +430 -0
  70. package/dist/intelligence-graph-contract.js +577 -0
  71. package/dist/intelligence-graph-extract-md.js +469 -0
  72. package/dist/intelligence-graph-extract-ts.js +810 -0
  73. package/dist/intelligence-graph-extract.js +369 -0
  74. package/dist/intelligence-graph-index.js +512 -0
  75. package/dist/intelligence-graph-parsers.js +327 -0
  76. package/dist/intelligence-graph-query.js +344 -0
  77. package/dist/intelligence-graph-repo.js +187 -0
  78. package/dist/leases.js +84 -0
  79. package/dist/ledger.js +14 -0
  80. package/dist/maestro-cli.js +10 -1
  81. package/dist/maestro-contract.js +5 -1
  82. package/dist/maestro-discovery.js +16 -2
  83. package/dist/maestro-snapshot.js +6 -2
  84. package/dist/manifest.js +142 -5
  85. package/dist/master-batch.js +3 -2
  86. package/dist/master-digest.js +2 -2
  87. package/dist/master-nota.js +203 -0
  88. package/dist/master.js +4 -0
  89. package/dist/mcp-experiencia.js +164 -0
  90. package/dist/mcp-git.js +36 -10
  91. package/dist/mcp-install.js +3 -1
  92. package/dist/mcp-maestro.js +3 -2
  93. package/dist/mcp-server.js +84 -5
  94. package/dist/memoria.js +147 -1
  95. package/dist/network-roadmap.js +907 -0
  96. package/dist/ocupacao.js +38 -2
  97. package/dist/onboarding.js +113 -7
  98. package/dist/orkmind.js +165 -9
  99. package/dist/phase.js +166 -13
  100. package/dist/policies.js +2 -0
  101. package/dist/projeto-alvo.js +551 -0
  102. package/dist/prompts.js +1 -1
  103. package/dist/pulse-consentimento.js +4 -2
  104. package/dist/pulse-delivery.js +5 -0
  105. package/dist/pulse-resposta.js +674 -49
  106. package/dist/pulse.js +21 -0
  107. package/dist/ratelimit.js +3 -2
  108. package/dist/retry.js +230 -9
  109. package/dist/roadmap-reservas.js +262 -20
  110. package/dist/roadmap-status.js +213 -0
  111. package/dist/runtime-ambiente.js +12 -1
  112. package/dist/session-watcher-claude.js +26 -0
  113. package/dist/sessoes.js +49 -15
  114. package/dist/thread-close.js +3 -0
  115. package/dist/verify.js +5 -4
  116. package/dist/worktree.js +77 -0
  117. package/eval/casos/orchestration-experience-pt-br.json +48 -0
  118. package/eval/casos/orchestration-experience.json +48 -0
  119. package/package.json +1 -1
  120. package/schemas/code-artifact-graph.v1.schema.json +581 -0
  121. package/schemas/graph-benchmark.v1.schema.json +2240 -0
  122. package/schemas/maestro-snapshot.schema.json +23 -0
  123. package/skills/README.md +7 -5
  124. package/skills/core/onboarding/SKILL.md +7 -0
  125. package/skills/core/orchestration-experience/SKILL.md +113 -0
  126. package/skills/core/orchestration-experience-pt-br/SKILL.md +112 -0
  127. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  128. package/skills/phases/go-implementation/SKILL.md +2 -0
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizarIdioma = normalizarIdioma;
4
+ exports.validarPreferencias = validarPreferencias;
5
+ exports.idiomaDoSistema = idiomaDoSistema;
6
+ exports.resolverExperiencia = resolverExperiencia;
7
+ /** Preferências públicas da experiência. Consulta não grava respostas nem autoria. */
8
+ const horario_1 = require("./horario");
9
+ function normalizarIdioma(valor) {
10
+ if (typeof valor !== 'string' || !valor.trim())
11
+ return undefined;
12
+ try {
13
+ return Intl.getCanonicalLocales(valor.trim())[0];
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ function validarPreferencias(valor) {
20
+ if (!valor || typeof valor !== 'object' || Array.isArray(valor))
21
+ throw Error('experiencia.config.invalid: owner deve ser um objeto');
22
+ const v = valor, resultado = {};
23
+ if (v.language !== undefined) {
24
+ const idioma = normalizarIdioma(v.language);
25
+ if (!idioma)
26
+ throw Error('experiencia.config.invalid: owner.language exige locale BCP-47');
27
+ resultado.language = idioma;
28
+ }
29
+ if (v.timezone !== undefined) {
30
+ const fuso = (0, horario_1.normalizarFuso)(v.timezone);
31
+ if (!fuso)
32
+ throw Error('experiencia.config.invalid: owner.timezone exige fuso IANA');
33
+ resultado.timezone = fuso;
34
+ }
35
+ if (v.depth !== undefined) {
36
+ if (v.depth !== 'curta' && v.depth !== 'detalhada')
37
+ throw Error('experiencia.config.invalid: owner.depth exige curta ou detalhada');
38
+ resultado.depth = v.depth;
39
+ }
40
+ if (v.experience !== undefined) {
41
+ if (typeof v.experience !== 'boolean')
42
+ throw Error('experiencia.config.invalid: owner.experience exige booleano');
43
+ resultado.experience = v.experience;
44
+ }
45
+ return resultado;
46
+ }
47
+ /** C, POSIX e und (raiz do ICU) dizem que o sistema não escolheu idioma: vale o padrão. */
48
+ const SEM_IDIOMA = new Set(['c', 'posix', 'und']);
49
+ function idiomaEscolhido(valor) {
50
+ const idioma = normalizarIdioma(valor);
51
+ return idioma && !SEM_IDIOMA.has(idioma.toLowerCase().split('-')[0]) ? idioma : undefined;
52
+ }
53
+ function idiomaDoSistema(env = process.env, doIntl = () => Intl.DateTimeFormat().resolvedOptions().locale) {
54
+ const locale = env.LC_ALL || env.LC_MESSAGES || env.LANG;
55
+ return idiomaEscolhido(locale?.split(/[.@]/)[0].replace(/_/g, '-')) ?? idiomaEscolhido(doIntl()) ?? 'en-US';
56
+ }
57
+ function resolverExperiencia(owner = {}, sistema = { language: idiomaDoSistema(), timezone: (0, horario_1.fusoDoSistema)() }) {
58
+ const p = validarPreferencias(owner);
59
+ const language = p.language ?? normalizarIdioma(sistema.language) ?? 'en-US';
60
+ return {
61
+ language, timezone: p.timezone ?? (0, horario_1.normalizarFuso)(sistema.timezone) ?? 'UTC',
62
+ depth: p.depth ?? 'curta', experience: p.experience ?? true,
63
+ skill: language.toLowerCase().startsWith('pt-') || language === 'pt'
64
+ ? 'orchestration-experience-pt-br' : 'orchestration-experience',
65
+ origem: {
66
+ language: p.language === undefined ? 'sistema' : 'manifesto',
67
+ timezone: p.timezone === undefined ? 'sistema' : 'manifesto',
68
+ depth: p.depth === undefined ? 'padrao' : 'manifesto',
69
+ experience: p.experience === undefined ? 'padrao' : 'manifesto',
70
+ },
71
+ };
72
+ }
@@ -33,11 +33,14 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.PULSACAO_MS = exports.BRANCH_DA_FABRICA = exports.CONTRATO_MAQUINA = void 0;
36
+ exports.PULSACAO_MS = exports.DIR_DA_FABRICA = exports.BRANCH_DA_FABRICA = exports.CONTRATO_MAQUINA = void 0;
37
+ exports.despachoDaThread = despachoDaThread;
38
+ exports.runtimeDaThread = runtimeDaThread;
37
39
  exports.arquivoDaMaquina = arquivoDaMaquina;
38
40
  exports.entregasNaBase = entregasNaBase;
39
41
  exports.retratoDaMaquina = retratoDaMaquina;
40
42
  exports.assinaturaDoRetrato = assinaturaDoRetrato;
43
+ exports.estadoValido = estadoValido;
41
44
  exports.lerFabrica = lerFabrica;
42
45
  exports.publicarMaquina = publicarMaquina;
43
46
  exports.removerMaquina = removerMaquina;
@@ -70,14 +73,18 @@ const monitor_lock_1 = require("./monitor-lock");
70
73
  const board_1 = require("./board");
71
74
  const estado_thread_1 = require("./estado-thread");
72
75
  const horario_1 = require("./horario");
76
+ const ledger_1 = require("./ledger");
73
77
  const modos_1 = require("./modos");
74
78
  const orquestracao_1 = require("./orquestracao");
75
79
  const roadmap_reservas_1 = require("./roadmap-reservas");
80
+ const thread_1 = require("./thread");
76
81
  const util_1 = require("./util");
77
82
  const versao_1 = require("./versao");
78
83
  exports.CONTRATO_MAQUINA = 'ork.fabrica-maquina/v1';
79
84
  exports.BRANCH_DA_FABRICA = 'ork/fabrica-estado';
80
- const DIR = 'maquinas';
85
+ /** O diretorio dos retratos na branch; a leitura sem clone (RM-054) le o mesmo. */
86
+ exports.DIR_DA_FABRICA = 'maquinas';
87
+ const DIR = exports.DIR_DA_FABRICA;
81
88
  const PAINEL = 'FABRICA.md';
82
89
  const PREFIXO = 'fabrica';
83
90
  const TENTATIVAS = 5;
@@ -85,6 +92,24 @@ const TENTATIVAS = 5;
85
92
  exports.PULSACAO_MS = 60 * 60 * 1000;
86
93
  const ARQUIVO_DA_MARCA = 'fabrica-publicada.json';
87
94
  const ARQUIVO_DO_LOG = 'fabrica.log';
95
+ /** O trio do ultimo `phase_dispatch` do ledger da thread; tudo `null` quando nao ha despacho legivel. */
96
+ function despachoDaThread(dir) {
97
+ let ultimo;
98
+ try {
99
+ ultimo = [...(0, ledger_1.lerLedger)(dir)].reverse().find((e) => e.tipo === ledger_1.TIPOS_DE_EVENTO.faseDespachada);
100
+ }
101
+ catch {
102
+ ultimo = undefined;
103
+ }
104
+ const campo = (v) => (typeof v === 'string' && v.trim() ? curto(v, 40) : null);
105
+ return { runtime: campo(ultimo?.runtime), modelo: campo(ultimo?.model), esforco: campo(ultimo?.effort) };
106
+ }
107
+ /** `claude-bg opus/xhigh`: o runtime com o modelo e o esforco, para as colunas do texto. */
108
+ function runtimeDaThread(t) {
109
+ if (!t.runtime && !t.modelo)
110
+ return '-';
111
+ return [t.runtime ?? '?', [t.modelo, t.esforco].filter(Boolean).join('/')].filter(Boolean).join(' ');
112
+ }
88
113
  const curto = (texto, teto = 120) => {
89
114
  const limpo = String(texto ?? '').replace(/\s+/g, ' ').trim();
90
115
  return limpo.length > teto ? `${limpo.slice(0, teto - 3)}...` : limpo;
@@ -101,7 +126,11 @@ function arquivoDaMaquina(maquina) {
101
126
  * entrega usa, o mesmo fato que o `ork docs sincronizar` le. Um `git log` so, para todas.
102
127
  */
103
128
  function entregasNaBase(raiz, base, remoto = 'origin') {
104
- const ref = (0, branch_de_estado_1.git)(raiz, ['rev-parse', '--verify', '--quiet', `refs/remotes/${remoto}/${base}`]).ok ? `${remoto}/${base}` : base;
129
+ // A base vem do manifesto: a ref vai sempre qualificada (`refs/...`), e um valor como
130
+ // `--output=<arquivo>` nunca vira opcao do `git log`, em qualquer versao do git (RM-054, CHECK).
131
+ // Na ordem: a copia remota da base, a branch local, e a base escrita como remota (`origin/main`).
132
+ const candidatas = [`refs/remotes/${remoto}/${base}`, `refs/heads/${base}`, `refs/remotes/${base}`];
133
+ const ref = candidatas.find((c) => (0, branch_de_estado_1.git)(raiz, ['rev-parse', '--verify', '--quiet', c]).ok) ?? candidatas[1];
105
134
  // Regex basica do git: o `(` e literal.
106
135
  const r = (0, branch_de_estado_1.git)(raiz, ['log', ref, '--format=%h%x09%s', '--grep=^ship(']);
107
136
  const entregas = new Map();
@@ -125,7 +154,7 @@ function retratoDaMaquina(carregado, opcoes = {}) {
125
154
  const linhas = new Map(monitor.linhas.map((l) => [l.thread, l]));
126
155
  const entregas = entregasNaBase(raiz, carregado.manifesto.worktree.base_branch, remoto);
127
156
  const itemDaThread = new Map((0, roadmap_reservas_1.reservasLocais)(raiz, remoto).filter((r) => r.thread).map((r) => [r.thread, r.item]));
128
- const threads = itens.map(({ thread: t }) => {
157
+ const threads = itens.map(({ thread: t, raiz: raizDoPerfil }) => {
129
158
  const pausa = linhas.get(t.id)?.pausas[0];
130
159
  const entregue = entregas.get(t.id) ?? null;
131
160
  const esperaVoce = !entregue && linhas.get(t.id)?.precisaDeHumano === true;
@@ -135,6 +164,7 @@ function retratoDaMaquina(carregado, opcoes = {}) {
135
164
  atualizadaEm: t.atualizadaEm ?? null, entregue,
136
165
  esperaVoce, pergunta: esperaVoce && pausa ? curto(pausa.pausaSobre || pausa.detalhe) : null,
137
166
  paradaDesde: esperaVoce && pausa ? pausa.desdeEm : null,
167
+ ...despachoDaThread((0, thread_1.dirThread)(raizDoPerfil, t.id)),
138
168
  };
139
169
  }).sort((a, b) => a.id.localeCompare(b.id));
140
170
  const eu = (0, roadmap_reservas_1.quemSouEu)(raiz, { por: opcoes.por, maquina: opcoes.maquina });
@@ -146,6 +176,7 @@ function assinaturaDoRetrato(e) {
146
176
  const { publicadoEm: _publicadoEm, ...resto } = e;
147
177
  return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(resto)).digest('hex');
148
178
  }
179
+ /** O retrato so vale inteiro: e o filtro da leitura pelo clone e pela forja (RM-054). */
149
180
  function estadoValido(bruto) {
150
181
  const e = bruto;
151
182
  return !!e && e.contrato === exports.CONTRATO_MAQUINA && typeof e.maquina === 'string' && !!e.maquina.trim() &&
@@ -278,8 +309,8 @@ function blocoDaMaquina(m, eu) {
278
309
  `${vivas.length} thread(s) ativa(s)` + (entregues ? `, ${entregues} entregue(s) sem MASTER` : '');
279
310
  if (vivas.length === 0)
280
311
  return [cabeca];
281
- return [cabeca, ...tabela(['THREAD', 'MODO', 'FASE', 'ITEM', 'ESPERA VOCE'], vivas.map((t) => [
282
- t.id, t.modo, t.fase, t.roadmap ?? '-', t.esperaVoce ? `sim: ${curto(t.pergunta ?? 'veredito', 40)}` : '-',
312
+ return [cabeca, ...tabela(['THREAD', 'MODO', 'FASE', 'RUNTIME', 'ITEM', 'ESPERA VOCE'], vivas.map((t) => [
313
+ t.id, t.modo, t.fase, runtimeDaThread(t), t.roadmap ?? '-', t.esperaVoce ? `sim: ${curto(t.pergunta ?? 'veredito', 40)}` : '-',
283
314
  ]))];
284
315
  }
285
316
  /** `ork fabrica`: todas as maquinas. */
@@ -315,15 +346,17 @@ function painelDaFabricaEmMarkdown(maquinas) {
315
346
  'O que cada máquina está conduzindo agora. Gerado pelo `ork fabrica publicar`; não edite à mão.',
316
347
  'Antes de pegar um item do roadmap: `ork roadmap reservas`.',
317
348
  '',
318
- '| Máquina | Thread | Modo | Fase | Item | Espera você | Publicado |',
319
- '| --- | --- | --- | --- | --- | --- | --- |',
349
+ '| Máquina | Thread | Modo | Fase | Runtime | Item | Espera você | Publicado |',
350
+ '| --- | --- | --- | --- | --- | --- | --- | --- |',
320
351
  ];
321
352
  const vivas = maquinas.flatMap((m) => ativas(m).map((t) => ({ m, t })));
322
353
  if (vivas.length === 0)
323
- linhas.push('| — | nenhuma thread ativa | — | — | — | — | — |');
354
+ linhas.push('| — | nenhuma thread ativa | — | — | | — | — | — |');
324
355
  for (const { m, t } of vivas) {
325
356
  const pergunta = t.esperaVoce ? `sim: ${curto(t.pergunta ?? 'veredito', 60).replace(/\|/g, '/')}` : '—';
326
- linhas.push(`| ${m.maquina} | ${t.id} | ${t.modo} | ${t.fase} | ${t.roadmap ?? '—'} | ${pergunta} | ${(0, horario_1.formatarDataHora)(m.publicadoEm)} |`);
357
+ // RM-037 (sugestao 6 do CHECK 1): a celula sem despacho diz isso, sem travessao novo.
358
+ const runtime = t.runtime || t.modelo ? runtimeDaThread(t).replace(/\|/g, '/') : 'sem despacho';
359
+ linhas.push(`| ${m.maquina} | ${t.id} | ${t.modo} | ${t.fase} | ${runtime} | ${t.roadmap ?? '—'} | ${pergunta} | ${(0, horario_1.formatarDataHora)(m.publicadoEm)} |`);
327
360
  }
328
361
  return [...linhas, '', (0, horario_1.legendaDoFuso)(), ''].join('\n');
329
362
  }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.liberarAoFechar = liberarAoFechar;
37
+ /**
38
+ * RM-037 (rm037noite): o que sai quando a thread fecha, pelo MASTER ou pelo `ork thread close`.
39
+ *
40
+ * Domicilio unico do "ao fechar". Antes, as duas saidas gravavam `status: fechada` e paravam ali:
41
+ * a thread fechada seguia na frente da fila de regiao (defeito 2) e com o item do roadmap reservado
42
+ * (defeito 3). Tudo aqui e de melhor esforco: o fechamento ja aconteceu, e nada daqui o desfaz nem o
43
+ * derruba. Cada parte roda isolada (achado A1 do CHECK 1): erro de E/S numa nao impede a outra, e o
44
+ * que nao saiu agora sai na poda do proximo pedido de regiao ou no `ork roadmap reservas --soltar-orfas`.
45
+ */
46
+ const fs = __importStar(require("node:fs"));
47
+ const path = __importStar(require("node:path"));
48
+ const estado_thread_1 = require("./estado-thread");
49
+ const ledger_1 = require("./ledger");
50
+ const leases_1 = require("./leases");
51
+ const roadmap_reservas_1 = require("./roadmap-reservas");
52
+ const thread_1 = require("./thread");
53
+ function liberarAoFechar(raiz, threadId) {
54
+ const saida = { leases: [], fila: [], reservas: [], falhas: [] };
55
+ const falhou = (parte, e) => saida.falhas.push(`${parte}: ${e?.message ?? String(e)}`);
56
+ // Os leases de regiao sao por checkout: o de quem fecha, a raiz do projeto e, quando a thread tem
57
+ // worktree, os pegos de la (sugestao 6 do CHECK 2: fechar da worktree tambem solta os da raiz).
58
+ const real = (p) => { try {
59
+ return fs.realpathSync(p);
60
+ }
61
+ catch {
62
+ return path.resolve(p);
63
+ } };
64
+ const candidatos = [raiz];
65
+ try {
66
+ candidatos.push((0, estado_thread_1.raizDoEstado)(raiz));
67
+ }
68
+ catch (e) {
69
+ falhou('raiz', e);
70
+ }
71
+ try {
72
+ const wt = (0, thread_1.lerThread)(raiz, threadId).worktree;
73
+ if (wt && fs.existsSync(wt))
74
+ candidatos.push(wt);
75
+ }
76
+ catch (e) {
77
+ falhou('thread', e);
78
+ }
79
+ const checkouts = candidatos.filter((c, i) => candidatos.findIndex((x) => real(x) === real(c)) === i);
80
+ for (const checkout of checkouts) {
81
+ try {
82
+ const solto = (0, leases_1.soltarThreadFechada)(checkout, threadId, 'fechamento');
83
+ saida.leases.push(...solto.leases);
84
+ saida.fila.push(...solto.fila);
85
+ }
86
+ catch (e) {
87
+ falhou(`leases em ${checkout}`, e);
88
+ }
89
+ }
90
+ try {
91
+ saida.reservas = (0, roadmap_reservas_1.soltarReservaDaThread)(raiz, threadId);
92
+ }
93
+ catch (e) {
94
+ falhou('reserva', e);
95
+ }
96
+ // Sugestao 2 do CHECK 2: a falha tambem vai ao ledger da thread, de melhor esforco.
97
+ if (saida.falhas.length > 0) {
98
+ try {
99
+ (0, ledger_1.registrarSeExiste)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.solturaFalhou, { falhas: saida.falhas,
100
+ correcao: 'a poda do proximo pedido de regiao solta o que ficou; reserva: ork roadmap reservas --soltar-orfas' });
101
+ }
102
+ catch { /* o ledger que nao grava ja esta nas falhas */ }
103
+ }
104
+ return saida;
105
+ }
package/dist/fix.js CHANGED
@@ -196,7 +196,7 @@ function sobConducao(carregado, threadId, operacao, conducao, executar) {
196
196
  canal: conducao.canal ?? (0, conducao_1.canalDoProcesso)(),
197
197
  correlacao: conducao.correlacao ?? null,
198
198
  operacao,
199
- identidade: conducao.identidade ?? (0, conducao_1.identidadeDoAmbiente)(threadId),
199
+ identidade: conducao.identidade ?? (0, conducao_1.identidadeDoAmbiente)(threadId, process.env, carregado.raiz),
200
200
  prazoMs: (0, conducao_1.prazoDaVerificacao)(carregado.manifesto.verify.timeout_ms ?? 10 * 60 * 1000, 8),
201
201
  esperarMs: conducao.esperarMs,
202
202
  }, executar);