@orkastery/cli 0.2.0 → 0.3.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 (242) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +86 -65
  3. package/adapters/README.md +30 -15
  4. package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
  5. package/adapters/claude-code/README.md +110 -8
  6. package/adapters/claude-code/commands/onboarding.md +21 -0
  7. package/adapters/claude-code/commands/ork.md +99 -27
  8. package/adapters/claude-code/hooks/hooks.json +6 -1
  9. package/adapters/claude-code/hooks/ork-sensor.js +66 -0
  10. package/adapters/codex/skills/ork/SKILL.md +57 -0
  11. package/adapters/hermes/README.md +163 -0
  12. package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
  13. package/adapters/hermes/bin/ork-brain.sh +4 -0
  14. package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
  15. package/adapters/hermes/bin/ork-maestro.sh +6 -0
  16. package/adapters/hermes/bin/ork-master-enviar.py +84 -0
  17. package/adapters/hermes/bin/ork-objective-message.sh +17 -0
  18. package/adapters/hermes/bin/ork-objective-status.sh +12 -0
  19. package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
  20. package/adapters/hermes/hermes.plugin.json +26 -4
  21. package/adapters/hermes/hitl-ingress/__init__.py +356 -0
  22. package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
  23. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
  24. package/adapters/openclaw/README.md +135 -26
  25. package/adapters/openclaw/bin/ork-brain.sh +4 -0
  26. package/adapters/openclaw/construir.sh +19 -0
  27. package/adapters/openclaw/dist/hitl-ingress.js +199 -0
  28. package/adapters/openclaw/dist/index.js +437 -0
  29. package/adapters/openclaw/openclaw.plugin.json +39 -134
  30. package/adapters/openclaw/package.json +26 -0
  31. package/adapters/openclaw/src/hitl-ingress.ts +180 -0
  32. package/adapters/openclaw/src/index.ts +458 -0
  33. package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
  34. package/adapters/openclaw/tsconfig.json +15 -0
  35. package/assets/docs/markdownlint-cli2.jsonc +22 -0
  36. package/assets/docs/padroes/documentacao-de-produto.md +133 -0
  37. package/assets/docs/padroes/roadmap-de-produto.md +98 -0
  38. package/assets/docs/produto/README.md +14 -0
  39. package/assets/docs/produto/_modelo-feature.md +59 -0
  40. package/assets/docs/roadmap/README.md +14 -0
  41. package/assets/docs/roadmap/_modelo-item.md +73 -0
  42. package/assets/orkmind-native-schema.json +32 -0
  43. package/assets/orkmind_bridge.py +357 -0
  44. package/assets/orkmind_fixture.py +67 -0
  45. package/assets/orkmind_prospective.py +138 -0
  46. package/assets/reference-tariffs-i07.json +23 -0
  47. package/dist/adapters/claude-bg.js +488 -39
  48. package/dist/adapters/codex-controller-sensor.js +449 -0
  49. package/dist/adapters/codex-controller-worker.js +361 -0
  50. package/dist/adapters/codex-controller.js +252 -0
  51. package/dist/adapters/codex-events.js +205 -0
  52. package/dist/adapters/codex-question.js +26 -0
  53. package/dist/adapters/codex-runner.js +133 -0
  54. package/dist/adapters/codex.js +394 -0
  55. package/dist/agents-md.js +84 -0
  56. package/dist/auditoria.js +11 -8
  57. package/dist/auditrun.js +5 -4
  58. package/dist/board.js +173 -22
  59. package/dist/branch-de-estado.js +136 -0
  60. package/dist/canarios-hitl.js +177 -0
  61. package/dist/canarios-i43.js +543 -0
  62. package/dist/canarios-pulse.js +147 -0
  63. package/dist/canarios-sensores.js +129 -0
  64. package/dist/canarios.js +111 -2
  65. package/dist/catalogo.js +9 -0
  66. package/dist/ci.js +216 -0
  67. package/dist/ciclos.js +2 -1
  68. package/dist/claim-lint.js +64 -0
  69. package/dist/claims.js +60 -0
  70. package/dist/company-brain-capture.js +195 -0
  71. package/dist/company-brain-cli.js +123 -0
  72. package/dist/company-brain-client.js +61 -0
  73. package/dist/company-brain-contract.js +166 -0
  74. package/dist/company-brain-journal.js +192 -0
  75. package/dist/company-brain-mcp.js +33 -0
  76. package/dist/company-brain-migration.js +60 -0
  77. package/dist/company-brain-source.js +177 -0
  78. package/dist/company-brain-worker.js +18 -0
  79. package/dist/conducao-texto.js +61 -0
  80. package/dist/conducao.js +876 -0
  81. package/dist/contrato-publico.js +39 -0
  82. package/dist/creation-operation-store.js +251 -0
  83. package/dist/creation-operation.js +148 -0
  84. package/dist/decisao-autonoma.js +183 -0
  85. package/dist/delegation.js +79 -0
  86. package/dist/demo.js +120 -0
  87. package/dist/docs.js +828 -0
  88. package/dist/doctor.js +183 -24
  89. package/dist/entrega-pr.js +117 -0
  90. package/dist/escopo-escrita.js +71 -0
  91. package/dist/estado-thread.js +222 -0
  92. package/dist/evalrunner.js +12 -0
  93. package/dist/fabrica-estado.js +329 -0
  94. package/dist/fabrica-publicar.js +76 -0
  95. package/dist/fix.js +21 -0
  96. package/dist/gates.js +55 -9
  97. package/dist/handoff.js +39 -23
  98. package/dist/hitl-canais.js +333 -0
  99. package/dist/hitl-classificacao.js +131 -0
  100. package/dist/hitl-contract.js +465 -0
  101. package/dist/hitl-estado.js +136 -0
  102. package/dist/hitl-gates.js +554 -0
  103. package/dist/hitl-ingress-receipt.js +382 -0
  104. package/dist/hitl-local-atestado.js +57 -0
  105. package/dist/hitl-local-receipt.js +328 -0
  106. package/dist/hitl-local.js +143 -0
  107. package/dist/hitl-lock.js +139 -0
  108. package/dist/hitl-lote.js +223 -0
  109. package/dist/hitl-native-offer.js +97 -0
  110. package/dist/hitl-native.js +65 -0
  111. package/dist/hitl-presentation.js +209 -0
  112. package/dist/hitl-public-receipt.js +176 -0
  113. package/dist/hitl-resumo.js +209 -0
  114. package/dist/hitl-sessions.js +475 -0
  115. package/dist/hitl.js +711 -0
  116. package/dist/horario.js +269 -0
  117. package/dist/hosts.js +198 -22
  118. package/dist/index.js +1736 -93
  119. package/dist/indice.js +99 -0
  120. package/dist/init.js +28 -3
  121. package/dist/integracoes-locais.js +17 -0
  122. package/dist/leases.js +65 -21
  123. package/dist/ledger-stats.js +272 -0
  124. package/dist/ledger.js +107 -2
  125. package/dist/licoes.js +215 -0
  126. package/dist/liveness.js +218 -0
  127. package/dist/maestro-actions.js +51 -0
  128. package/dist/maestro-authority.js +152 -0
  129. package/dist/maestro-cli.js +97 -0
  130. package/dist/maestro-contract.js +55 -0
  131. package/dist/maestro-discovery.js +132 -0
  132. package/dist/maestro-runtime.js +268 -0
  133. package/dist/maestro-snapshot.js +86 -0
  134. package/dist/maestro-sources.js +224 -0
  135. package/dist/manifest.js +165 -6
  136. package/dist/maquina.js +102 -0
  137. package/dist/master-audit.js +101 -0
  138. package/dist/master-batch.js +43 -0
  139. package/dist/master-digest.js +149 -0
  140. package/dist/master-migracao.js +155 -0
  141. package/dist/master.js +361 -77
  142. package/dist/mcp-artifacts.js +234 -0
  143. package/dist/mcp-git.js +433 -0
  144. package/dist/mcp-install.js +310 -0
  145. package/dist/mcp-maestro.js +25 -0
  146. package/dist/mcp-server.js +469 -0
  147. package/dist/mcp-ship.js +436 -0
  148. package/dist/mcp-verify.js +173 -0
  149. package/dist/memoria-humana.js +207 -0
  150. package/dist/memoria.js +314 -78
  151. package/dist/memory-migration.js +279 -0
  152. package/dist/memory-prospective.js +148 -0
  153. package/dist/modos-migracao.js +191 -0
  154. package/dist/modos.js +151 -15
  155. package/dist/monitor-lock.js +110 -0
  156. package/dist/objective.js +449 -0
  157. package/dist/ocupacao.js +267 -0
  158. package/dist/onboarding.js +303 -0
  159. package/dist/orkmind.js +389 -90
  160. package/dist/orquestracao.js +96 -69
  161. package/dist/phase.js +596 -150
  162. package/dist/playbook-capabilities.js +150 -0
  163. package/dist/playbook-contracts.js +188 -0
  164. package/dist/portfolio-context.js +61 -0
  165. package/dist/portfolio.js +180 -0
  166. package/dist/preflight.js +207 -0
  167. package/dist/process-audit.js +112 -0
  168. package/dist/project-state.js +93 -0
  169. package/dist/prompts.js +25 -5
  170. package/dist/prova-minima.js +112 -0
  171. package/dist/pulse-cadencia.js +163 -0
  172. package/dist/pulse-consentimento.js +260 -0
  173. package/dist/pulse-delivery.js +323 -0
  174. package/dist/pulse-resposta.js +542 -0
  175. package/dist/pulse.js +262 -0
  176. package/dist/ratelimit.js +35 -2
  177. package/dist/recall.js +80 -3
  178. package/dist/redacao-saida.js +45 -0
  179. package/dist/redacao-url.js +66 -0
  180. package/dist/retry.js +637 -115
  181. package/dist/roadmap-reservas.js +243 -0
  182. package/dist/runtime-ambiente.js +38 -0
  183. package/dist/runtime-context.js +215 -0
  184. package/dist/runtime-profiles.js +869 -0
  185. package/dist/runtimes.js +103 -0
  186. package/dist/sandbox.js +9 -0
  187. package/dist/session-events.js +203 -0
  188. package/dist/session-watcher-claude.js +637 -0
  189. package/dist/session-watcher.js +683 -0
  190. package/dist/sessoes-adopt.js +154 -0
  191. package/dist/sessoes-inventario.js +159 -0
  192. package/dist/sessoes.js +16 -35
  193. package/dist/setup.js +691 -0
  194. package/dist/ship.js +150 -15
  195. package/dist/slug.js +1 -1
  196. package/dist/thread-close.js +115 -0
  197. package/dist/thread.js +142 -28
  198. package/dist/tokens.js +1 -1
  199. package/dist/util.js +4 -2
  200. package/dist/verify-sandbox.js +265 -0
  201. package/dist/verify.js +270 -25
  202. package/dist/versao.js +60 -0
  203. package/dist/worktree.js +31 -2
  204. package/dist/write-activation.js +291 -0
  205. package/dist/yaml.js +2 -0
  206. package/eval/casos/onboarding.json +102 -0
  207. package/eval/casos/orkastery-bootstrap.json +35 -1
  208. package/eval/casos/scope-check-capability-map.json +45 -7
  209. package/eval/casos/ship-release.json +2 -2
  210. package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
  211. package/eval/fixtures/b2-master-log/caso.json +1 -1
  212. package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
  213. package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
  214. package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
  215. package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
  216. package/eval/fixtures/fx-codex-dry/caso.json +18 -0
  217. package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
  218. package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
  219. package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
  220. package/eval/fixtures/fx-happy/caso.json +6 -4
  221. package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
  222. package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
  223. package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
  224. package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
  225. package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
  226. package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
  227. package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
  228. package/eval/fixtures/fx-omnicanal/caso.json +17 -0
  229. package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
  230. package/monitor/company-brain.cjs +17 -0
  231. package/monitor/pulse-scope.cjs +45 -0
  232. package/monitor/pulse.cron +18 -0
  233. package/monitor/varredura-pulse.sh +27 -0
  234. package/package.json +25 -4
  235. package/schemas/claims.schema.json +25 -0
  236. package/schemas/company-brain.schema.json +1158 -0
  237. package/schemas/creation-operation.schema.json +365 -0
  238. package/schemas/maestro-snapshot.schema.json +2716 -0
  239. package/skills/core/onboarding/SKILL.md +50 -0
  240. package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
  241. package/skills/core/thread-state/SKILL.md +3 -1
  242. package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
@@ -0,0 +1,149 @@
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.dirDigest = void 0;
37
+ exports.sextaLocal = sextaLocal;
38
+ exports.montarDigest = montarDigest;
39
+ exports.lerDigest = lerDigest;
40
+ exports.responderLoteDigest = responderLoteDigest;
41
+ exports.enviarDigest = enviarDigest;
42
+ /** Uma fotografia semanal, páginas limitadas e recibos antes de marcar entrega. */
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const node_crypto_1 = require("node:crypto");
46
+ const master_batch_1 = require("./master-batch");
47
+ const master_1 = require("./master");
48
+ const estado_thread_1 = require("./estado-thread");
49
+ const hitl_1 = require("./hitl");
50
+ const pulse_delivery_1 = require("./pulse-delivery");
51
+ const util_1 = require("./util");
52
+ const horario_1 = require("./horario");
53
+ const dirDigest = (raiz) => path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery', 'monitor', 'master-digest');
54
+ exports.dirDigest = dirDigest;
55
+ const hash = (v) => (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(v)).digest('hex');
56
+ /**
57
+ * I-35: a sexta-feira é a do fuso do dono (`owner.timezone`; sem ele, o fuso do sistema).
58
+ * Com o dono em Brasília o dia é o mesmo de antes em qualquer `TZ` do processo.
59
+ */
60
+ function sextaLocal(quando, fuso = (0, horario_1.fusoDoDono)().fuso) {
61
+ const data = new Date(quando);
62
+ if (!Number.isFinite(data.getTime()))
63
+ throw new Error('data inválida');
64
+ const dia = (0, horario_1.dataLocal)(data, fuso);
65
+ return new Date(`${dia}T12:00:00Z`).getUTCDay() === 5 ? dia : null;
66
+ }
67
+ function pagina(texto, opcoes) {
68
+ if (texto.length > 3900 || opcoes.length > 12 || opcoes.some(o => o.length > 200))
69
+ throw new Error('página excede limite do host');
70
+ return { contrato: 'ork.master-digest-page/v1', texto, opcoes };
71
+ }
72
+ function montarDigest(raiz, quando) {
73
+ const semana = sextaLocal(quando);
74
+ if (!semana)
75
+ throw new Error(`digest semanal exige sexta-feira no fuso do dono (${(0, horario_1.fusoDoDono)().fuso})`);
76
+ const itens = (0, master_batch_1.listarBatch)(raiz);
77
+ const selecao = itens.filter(i => i.proposta && i.entregue).map(i => ({ thread: i.thread, assinatura: i.assinatura }));
78
+ const assinatura = hash(selecao);
79
+ const paginas = [pagina(`Orkastery: ${itens.length} scores esperando você. Semana de ${semana.split('-').reverse().join('/')}.\nRevise as propostas nas páginas seguintes antes de aceitar o lote.\nO lote contém ${selecao.length} propostas com entrega comprovada.`, selecao.length ? [`ratificar-lote ${semana} ${assinatura}`] : [])];
80
+ for (const i of itens) {
81
+ const campo = (s, n) => (0, hitl_1.redigirSegredos)(s).slice(0, n);
82
+ const texto = `Thread ${i.thread}: ${campo(i.nome, 180)}\n` + (i.proposta
83
+ ? `Proposta: ${i.proposta.valor}/5 por ${campo(i.proposta.propostoPor, 100)}\nJustificativa: ${campo(i.proposta.justificativa, 1800)}\nClasses propostas: ${i.proposta.classes.join(', ')}\nProposta ${i.assinatura}\nEscolha a classe para ratificar este score e esta justificativa.`
84
+ : 'Sem proposta. Registre score e justificativa após revisar a entrega.') + (!i.entregue ? '\nFalta prova de entrega; ratificação indisponível.' : '');
85
+ paginas.push(pagina(texto, i.proposta && i.entregue ? master_1.ORDEM_DAS_CLASSES.map(c => `ratificar ${i.thread} ${i.assinatura} ${c}`) : []));
86
+ }
87
+ return { contrato: 'ork.master-digest/v1', semana, criadoEm: quando, assinatura, selecao, paginas, recibos: [], concluidoEm: null };
88
+ }
89
+ function salvar(file, job) {
90
+ const tmp = `${file}.${process.pid}.tmp`;
91
+ fs.writeFileSync(tmp, JSON.stringify(job, null, 2) + '\n', { mode: 0o600 });
92
+ fs.renameSync(tmp, file);
93
+ }
94
+ function lerDigest(raiz, semana) {
95
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(semana))
96
+ throw new Error('semana inválida');
97
+ const job = (0, util_1.lerJson)(path.join((0, exports.dirDigest)(raiz), `${semana}.json`));
98
+ if (job.contrato !== 'ork.master-digest/v1' || job.semana !== semana || hash(job.selecao) !== job.assinatura ||
99
+ !Array.isArray(job.paginas) || !Array.isArray(job.recibos))
100
+ throw new Error('digest inválido');
101
+ return job;
102
+ }
103
+ function responderLoteDigest(raiz, resposta, por) {
104
+ const partes = resposta.trim().split(/\s+/);
105
+ if (partes.length !== 3 || partes[0] !== 'ratificar-lote')
106
+ throw new Error('resposta de lote inválida');
107
+ const job = lerDigest(raiz, partes[1]);
108
+ if (!job.concluidoEm || partes[2] !== job.assinatura)
109
+ throw new Error('lote não entregue ou assinatura divergente');
110
+ return (0, master_batch_1.ratificarBatch)(raiz, job.selecao, por);
111
+ }
112
+ function enviarDigest(opcoes) {
113
+ const quando = opcoes.quando ?? new Date().toISOString(), semana = sextaLocal(quando);
114
+ if (!semana)
115
+ return { code: 0, detalhe: `fora da sexta-feira no fuso do dono (${(0, horario_1.fusoDoDono)().fuso})`, enviadas: 0, semana };
116
+ const raiz = (0, estado_thread_1.raizDoEstado)(opcoes.raiz), dir = (0, exports.dirDigest)(raiz);
117
+ fs.mkdirSync(dir, { recursive: true });
118
+ const lock = path.join(dir, 'envio.lock'), file = path.join(dir, `${semana}.json`);
119
+ const trava = (0, pulse_delivery_1.adquirirLockMonitor)(lock);
120
+ if (!trava.ok)
121
+ return { code: 1, detalhe: trava.detalhe, enviadas: 0, semana };
122
+ let enviadas = 0;
123
+ try {
124
+ const job = fs.existsSync(file) ? lerDigest(raiz, semana) : montarDigest(raiz, quando);
125
+ if (job.concluidoEm)
126
+ return { code: 0, detalhe: 'semana já confirmada', enviadas, semana };
127
+ salvar(file, job);
128
+ const config = opcoes.transporte ?? (!opcoes.enviar ? (0, util_1.lerJson)(path.join(raiz, '.orkastery/monitor/master-host.json')) : undefined);
129
+ for (const [indice, p] of job.paginas.entries()) {
130
+ if (job.recibos.some(r => r.pagina === indice && r.sha256 === hash(p)))
131
+ continue;
132
+ const recibo = opcoes.enviar ? opcoes.enviar(p) : (0, pulse_delivery_1.enviarPayloadHost)(raiz, config, p);
133
+ if (recibo.success !== true || !Number.isInteger(recibo.message_id) || recibo.message_id <= 0 || !recibo.platform)
134
+ throw new Error('recibo inválido');
135
+ job.recibos.push({ pagina: indice, sha256: hash(p), confirmadoEm: quando, host: recibo });
136
+ enviadas++;
137
+ salvar(file, job);
138
+ }
139
+ job.concluidoEm = quando;
140
+ salvar(file, job);
141
+ return { code: 0, detalhe: 'digest confirmado pelo host', enviadas, semana };
142
+ }
143
+ catch (e) {
144
+ return { code: 1, detalhe: e.message, enviadas, semana };
145
+ }
146
+ finally {
147
+ trava.liberar();
148
+ }
149
+ }
@@ -0,0 +1,155 @@
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.planejarMigracaoMaster = planejarMigracaoMaster;
37
+ exports.migrarMaster = migrarMaster;
38
+ /** Correções append-only. Backups não recebem autoria humana retroativa. */
39
+ const fs = __importStar(require("node:fs"));
40
+ const path = __importStar(require("node:path"));
41
+ const node_crypto_1 = require("node:crypto");
42
+ const thread_1 = require("./thread");
43
+ const ledger_1 = require("./ledger");
44
+ const master_1 = require("./master");
45
+ const thread_close_1 = require("./thread-close");
46
+ const estado_thread_1 = require("./estado-thread");
47
+ const util_1 = require("./util");
48
+ const ARQUIVOS = ['thread.json', 'ledger.jsonl', 'POSTMORTEM.json', 'master-log.json'];
49
+ function snapshot(dir) {
50
+ return Object.fromEntries(ARQUIVOS.filter(f => fs.existsSync(path.join(dir, f))).map(f => [f, fs.readFileSync(path.join(dir, f), 'utf8')]));
51
+ }
52
+ function hash(dados) { return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(dados)).digest('hex'); }
53
+ function motivoLegado(justificativa) {
54
+ const s = justificativa.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase();
55
+ if (/orfa/.test(s))
56
+ return 'orfa';
57
+ if (/engano|recriar|recriando/.test(s))
58
+ return 'engano';
59
+ if (/superad|substituid/.test(s))
60
+ return 'superada';
61
+ return undefined;
62
+ }
63
+ function planejarMigracaoMaster(raiz) {
64
+ return (0, thread_1.listarIds)(raiz).flatMap(id => {
65
+ const t = (0, thread_1.lerThread)(raiz, id);
66
+ if (!t.score || t.fechamentoAdmin || (0, master_1.masterRatificado)(raiz, id))
67
+ return [];
68
+ if (t.status !== 'fechada' && t.faseAtual !== 'MASTER')
69
+ return [];
70
+ if ((0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, id)).some(e => e.tipo === ledger_1.TIPOS_DE_EVENTO.masterMigrado && e.versao === 1))
71
+ return [];
72
+ const motivo = t.score.valor === 0 && !(0, thread_close_1.provaDeEntrega)(raiz, id) ? motivoLegado(t.score.justificativa) : undefined;
73
+ return [{ thread: id, acao: motivo ? 'administrativo' : 'batch', ...(motivo ? { motivo } : {}), origem: hash(snapshot((0, thread_1.dirThread)(raiz, id))) }];
74
+ });
75
+ }
76
+ function migrarMaster(raiz, opcoes) {
77
+ if (!opcoes.por.trim())
78
+ throw new Error('migração exige autoria explícita');
79
+ const correcoes = planejarMigracaoMaster(raiz);
80
+ const adiadas = (0, thread_1.listarIds)(raiz).filter(id => {
81
+ const t = (0, thread_1.lerThread)(raiz, id);
82
+ return !!t.score && !(0, master_1.masterRatificado)(raiz, id) && t.status !== 'fechada' && t.faseAtual !== 'MASTER';
83
+ });
84
+ // O ensaio e a aplicação validam todos os documentos antes de criar backups.
85
+ for (const c of correcoes) {
86
+ const dir = (0, thread_1.dirThread)(raiz, c.thread), score = (0, thread_1.lerThread)(raiz, c.thread).score;
87
+ (0, master_1.exigirScoreValido)(score.valor, score.justificativa);
88
+ for (const nome of ['master-log.json', 'POSTMORTEM.json']) {
89
+ const file = path.join(dir, nome);
90
+ if (fs.existsSync(file)) {
91
+ const documento = (0, util_1.lerJson)(file);
92
+ if (!documento || typeof documento !== 'object' || Array.isArray(documento))
93
+ throw new Error(`documento legado inválido: ${file}`);
94
+ }
95
+ }
96
+ }
97
+ if (opcoes.dryRun)
98
+ return { dryRun: true, correcoes, adiadas };
99
+ const lock = path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery', 'master-migracao.lock');
100
+ fs.mkdirSync(lock);
101
+ try {
102
+ // Preflight do conjunto antes da primeira mutação.
103
+ for (const c of correcoes) {
104
+ const dir = (0, thread_1.dirThread)(raiz, c.thread);
105
+ if (hash(snapshot(dir)) !== c.origem)
106
+ throw new Error(`estado mudou durante preflight: ${c.thread}`);
107
+ if (fs.existsSync(path.join(dir, 'migracao-master-v1')))
108
+ throw new Error(`backup anterior exige inspeção: ${c.thread}`);
109
+ }
110
+ for (const c of correcoes) {
111
+ const dir = (0, thread_1.dirThread)(raiz, c.thread), antes = snapshot(dir), t = (0, thread_1.lerThread)(raiz, c.thread);
112
+ if (hash(antes) !== c.origem)
113
+ throw new Error(`estado mudou antes da correção: ${c.thread}`);
114
+ const backup = path.join(dir, 'migracao-master-v1');
115
+ fs.mkdirSync(backup);
116
+ for (const [file, conteudo] of Object.entries(antes))
117
+ fs.writeFileSync(path.join(backup, file), conteudo, { flag: 'wx' });
118
+ const hashes = Object.fromEntries(Object.entries(antes).map(([f, v]) => [f, (0, node_crypto_1.createHash)('sha256').update(v).digest('hex')]));
119
+ (0, util_1.gravarJson)(path.join(backup, 'snapshot.json'), { origem: c.origem, hashes, correcao: c });
120
+ const score = t.score;
121
+ t.score = null;
122
+ if (c.acao === 'administrativo') {
123
+ t.status = 'fechada';
124
+ t.score_proposto = null;
125
+ t.fechamentoAdmin = { motivo: c.motivo, por: opcoes.por.trim(), justificativa: score.justificativa, fechadoEm: (0, util_1.agora)() };
126
+ (0, ledger_1.registrar)(dir, t.id, 'thread_closed_admin', { ...t.fechamentoAdmin, migracao: true, backup });
127
+ // Os logs legados ficam preservados; o leitor exige ratificação e os ignora.
128
+ }
129
+ else {
130
+ const log = antes['master-log.json'] ? (0, util_1.lerJson)(path.join(backup, 'master-log.json')) : {};
131
+ const classes = Array.isArray(log.classesDeFalha) ? log.classesDeFalha.map((c) => typeof c === 'string' ? (0, master_1.parseClasse)(c) : null).filter((c) => c !== null) : [];
132
+ const proposta = { valor: score.valor, justificativa: score.justificativa,
133
+ classes: classes.length ? classes : ['outra'], propostoPor: opcoes.por.trim(), propostoEm: (0, util_1.agora)(),
134
+ resumo: 'Score legado sem prova de ratificação humana; revisar entrega e autoria.' };
135
+ t.score_proposto = proposta;
136
+ t.status = 'aberta';
137
+ t.faseAtual = 'MASTER';
138
+ // Mantém toda a origem no backup e remove atribuição presumida da versão corrente.
139
+ const { avaliadoPor: _por, avaliadoEm: _em, ...base } = log;
140
+ (0, util_1.gravarJson)(path.join(dir, 'master-log.json'), { ...base, contrato: master_1.CONTRATO_MASTER_PENDENTE, versao: 1,
141
+ thread: t.id, score: null, estado: 'ratificacao-pendente', score_proposto: proposta });
142
+ const post = antes['POSTMORTEM.json'] ? (0, util_1.lerJson)(path.join(backup, 'POSTMORTEM.json')) : { thread: t.id };
143
+ (0, util_1.gravarJson)(path.join(dir, 'POSTMORTEM.json'), { ...post, score: null, score_proposto: proposta });
144
+ (0, ledger_1.registrar)(dir, t.id, ledger_1.TIPOS_DE_EVENTO.scoreProposto, { fase: 'MASTER', ...proposta, migracao: true, backup });
145
+ }
146
+ (0, thread_1.gravarThread)(raiz, t);
147
+ (0, ledger_1.registrar)(dir, t.id, ledger_1.TIPOS_DE_EVENTO.masterMigrado, { versao: 1, por: opcoes.por.trim(), acao: c.acao, origem: c.origem, backup, hashes,
148
+ razao: 'Separar encerramento administrativo e score sem autoria humana comprovada, preservando os originais' });
149
+ }
150
+ return { dryRun: false, correcoes, adiadas };
151
+ }
152
+ finally {
153
+ fs.rmdirSync(lock);
154
+ }
155
+ }