@orkastery/cli 0.5.3 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/claude-code/README.md +158 -0
- package/adapters/claude-code/mods/autoridade.json +56 -0
- package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
- package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
- package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
- package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
- package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
- package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
- package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
- package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
- package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
- package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
- package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
- package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
- package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
- package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
- package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
- package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
- package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
- package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
- package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
- package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
- package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
- package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
- package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
- package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
- package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
- package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
- package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
- package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
- package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
- package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
- package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
- package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
- package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
- package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
- package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
- package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
- package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
- package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
- package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
- package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
- package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
- package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +1 -1
- package/adapters/openclaw/README.md +2 -1
- package/adapters/openclaw/openclaw.plugin.json +1 -1
- package/adapters/openclaw/package.json +1 -1
- package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
- package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
- package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
- package/assets/docs-en/produto/README.md +14 -0
- package/assets/docs-en/produto/_modelo-feature.md +62 -0
- package/assets/docs-en/roadmap/README.md +14 -0
- package/assets/docs-en/roadmap/_modelo-item.md +75 -0
- package/dist/adapters/claude-bg.js +77 -13
- package/dist/adapters/codex.js +10 -1
- package/dist/agents-md.js +24 -15
- package/dist/auditrun.js +17 -2
- package/dist/board.js +4 -3
- package/dist/branch-de-estado.js +23 -1
- package/dist/catalogo.js +33 -0
- package/dist/ci.js +13 -7
- package/dist/claims-conferir.js +342 -0
- package/dist/claims.js +3 -1
- package/dist/company-brain-client.js +36 -1
- package/dist/company-brain-journal.js +2 -1
- package/dist/company-brain-migration.js +36 -1
- package/dist/conducao-sentinela.js +388 -0
- package/dist/conducao-texto.js +12 -18
- package/dist/conducao.js +122 -30
- package/dist/conhecimento.js +490 -0
- package/dist/docs.js +22 -8
- package/dist/doctor-pulse-cron.js +182 -27
- package/dist/doctor-rede.js +18 -17
- package/dist/doctor.js +115 -111
- package/dist/entrega-pr.js +22 -21
- package/dist/escopo-escrita.js +10 -1
- package/dist/estado-thread.js +23 -1
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/fabrica-batida.js +310 -0
- package/dist/fabrica-estado.js +38 -8
- package/dist/fabrica-publicar.js +3 -1
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +3 -2
- package/dist/forja.js +1 -1
- package/dist/gates.js +3 -28
- package/dist/handoff.js +10 -6
- package/dist/hitl-local-receipt.js +2 -0
- package/dist/hitl-resumo.js +29 -3
- package/dist/hitl-tempo-parado.js +4 -4
- package/dist/hitl.js +29 -33
- package/dist/horario.js +14 -7
- package/dist/hosts.js +52 -1
- package/dist/impedimento.js +108 -14
- package/dist/index.js +623 -521
- package/dist/indice.js +7 -1
- package/dist/init.js +43 -47
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +2 -0
- package/dist/intelligence-graph-cli.js +92 -21
- package/dist/intelligence-graph-contexto.js +56 -17
- package/dist/intelligence-graph-contract.js +2 -1
- package/dist/intelligence-graph-extract-md.js +56 -4
- package/dist/intelligence-graph-extract-ts.js +71 -3
- package/dist/intelligence-graph-query.js +66 -19
- package/dist/ledger.js +15 -1
- package/dist/liveness.js +6 -3
- package/dist/locale-ajuda.js +761 -0
- package/dist/locale-gerados.js +160 -0
- package/dist/locale-master.js +99 -0
- package/dist/locale-onboarding.js +92 -0
- package/dist/locale-phase.js +151 -0
- package/dist/locale-pulse.js +211 -0
- package/dist/locale-retry.js +385 -0
- package/dist/locale-roadmap.js +102 -0
- package/dist/locale-ship.js +494 -0
- package/dist/locale-thread.js +277 -0
- package/dist/locale-verify.js +125 -0
- package/dist/locale.js +714 -0
- package/dist/manifest.js +129 -3
- package/dist/maquina.js +23 -4
- package/dist/master-digest.js +6 -1
- package/dist/master-nota.js +4 -6
- package/dist/master.js +21 -24
- package/dist/mcp-artifacts.js +11 -2
- package/dist/mcp-git.js +23 -6
- package/dist/mcp-grafo.js +7 -4
- package/dist/mcp-server.js +8 -2
- package/dist/mcp-ship.js +3 -1
- package/dist/mcp-verify.js +6 -1
- package/dist/modos.js +3 -6
- package/dist/network-roadmap.js +5 -2
- package/dist/noctum-arco.js +911 -0
- package/dist/noctum-capacidade.js +141 -0
- package/dist/noctum-envelope.js +810 -0
- package/dist/noctum-execucao.js +304 -0
- package/dist/noctum-fila.js +280 -0
- package/dist/ocupacao.js +29 -2
- package/dist/onboarding.js +40 -21
- package/dist/orkmind.js +9 -2
- package/dist/orquestracao.js +13 -12
- package/dist/parado-no-condutor.js +34 -9
- package/dist/phase.js +94 -39
- package/dist/policies.js +4 -4
- package/dist/portfolio.js +4 -2
- package/dist/postura-local.js +234 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +225 -0
- package/dist/projeto-alvo.js +127 -4
- package/dist/prompts.js +6 -2
- package/dist/pulse-delivery.js +13 -2
- package/dist/pulse.js +52 -19
- package/dist/ratelimit.js +4 -2
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-status.js +3 -2
- package/dist/retry.js +232 -148
- package/dist/roadmap-reservas.js +20 -3
- package/dist/roadmap-status.js +129 -33
- package/dist/runtime-context.js +181 -3
- package/dist/runtimes.js +2 -1
- package/dist/session-events.js +7 -3
- package/dist/session-watcher-claude.js +7 -1
- package/dist/session-watcher.js +185 -33
- package/dist/sessoes-contas.js +1 -1
- package/dist/ship-publicar.js +800 -0
- package/dist/ship.js +84 -81
- package/dist/steal.js +77 -0
- package/dist/thread-close.js +3 -2
- package/dist/thread.js +153 -82
- package/dist/util.js +8 -1
- package/dist/verify.js +141 -52
- package/dist/vida-da-thread.js +254 -0
- package/dist/worktree-local.js +165 -0
- package/dist/worktree.js +20 -0
- package/dist/yaml.js +27 -8
- package/package.json +1 -1
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `ork claims conferir` (RM-059, T0.10): reexecuta so as claims pedidas, ou o verify de uma tarefa do
|
|
4
|
+
* plano da thread, no mesmo sandbox do `ork_verify`, sem gravar recibo.
|
|
5
|
+
*
|
|
6
|
+
* E por aqui que os mods de fase (Freio e Portao, no plano dos mods) conferem o que um lote do GO
|
|
7
|
+
* mexeu: o comando de claim e de verify e escrito pelo modelo, e fora do sandbox ele passaria longe do
|
|
8
|
+
* guard e daria resultado diferente do `ork verify` (D12 do plano). Por isso:
|
|
9
|
+
*
|
|
10
|
+
* - o executor e o confinado do codex (`criarExecutorSandbox`), um por comando, e nunca ha fallback:
|
|
11
|
+
* sem sandbox, a conferencia recusa (D6 da thread ork-rm059nucleo);
|
|
12
|
+
* - o julgamento de cada claim e o do `ork verify` (`verificarClaim`), sem regra paralela;
|
|
13
|
+
* - quem executa na worktree precisa da conducao da thread, como o `ork verify` (I-36): a sessao que
|
|
14
|
+
* conduz reentra pela identidade do despacho, e outra conducao recusa;
|
|
15
|
+
* - nada e gravado: nem `verify_run`, nem estado de claim, nem `gate_blocked`. Quem verifica de
|
|
16
|
+
* verdade continua sendo o `ork verify`.
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.ErroDeConferencia = exports.PRAZO_MAXIMO_MS = exports.PRAZO_PADRAO_MS = exports.FORMATO_DA_CONFERENCIA = void 0;
|
|
53
|
+
exports.idsDeClaims = idsDeClaims;
|
|
54
|
+
exports.verifyDaTarefa = verifyDaTarefa;
|
|
55
|
+
exports.conferirClaims = conferirClaims;
|
|
56
|
+
exports.textoDaConferencia = textoDaConferencia;
|
|
57
|
+
const fs = __importStar(require("node:fs"));
|
|
58
|
+
const path = __importStar(require("node:path"));
|
|
59
|
+
const node_crypto_1 = require("node:crypto");
|
|
60
|
+
const claims_1 = require("./claims");
|
|
61
|
+
const conducao_1 = require("./conducao");
|
|
62
|
+
const estado_thread_1 = require("./estado-thread");
|
|
63
|
+
const redacao_saida_1 = require("./redacao-saida");
|
|
64
|
+
const thread_1 = require("./thread");
|
|
65
|
+
const verify_1 = require("./verify");
|
|
66
|
+
const verify_sandbox_1 = require("./verify-sandbox");
|
|
67
|
+
const worktree_1 = require("./worktree");
|
|
68
|
+
exports.FORMATO_DA_CONFERENCIA = 'ork.claims-conferencia/v1';
|
|
69
|
+
/** O prazo total do `ork_verify` pelo MCP: a conferencia e pontual e nao deve demorar mais que ele. */
|
|
70
|
+
exports.PRAZO_PADRAO_MS = 180_000;
|
|
71
|
+
/** Teto: o prazo de um comando de verify. Pedir mais e pedir o `ork verify` inteiro. */
|
|
72
|
+
exports.PRAZO_MAXIMO_MS = verify_1.TIMEOUT_VERIFY_MS;
|
|
73
|
+
const PRAZO_MINIMO_MS = 10_000;
|
|
74
|
+
/** Folga para fechar o sandbox e responder dentro do prazo pedido. */
|
|
75
|
+
const RESERVA_MS = 5_000;
|
|
76
|
+
/** Erro de uso tipado: o CLI sai 2 com ele. */
|
|
77
|
+
class ErroDeConferencia extends Error {
|
|
78
|
+
}
|
|
79
|
+
exports.ErroDeConferencia = ErroDeConferencia;
|
|
80
|
+
const recusa = (motivo, detalhe) => new ErroDeConferencia(`claims.conferir.${motivo}: ${detalhe}`);
|
|
81
|
+
/** `C3,C7, c9` vira `['C3', 'C7', 'C9']`, sem repeticao e na ordem pedida. */
|
|
82
|
+
function idsDeClaims(bruto) {
|
|
83
|
+
const ids = bruto.split(',').map((s) => s.trim().toUpperCase()).filter(Boolean);
|
|
84
|
+
if (!ids.length)
|
|
85
|
+
throw recusa('uso', 'informe ao menos uma claim em --claims (ex.: C3,C7)');
|
|
86
|
+
const invalido = ids.find((id) => !/^C\d+$/.test(id));
|
|
87
|
+
if (invalido)
|
|
88
|
+
throw recusa('uso', `id de claim invalido: ${invalido}`);
|
|
89
|
+
const repetido = ids.find((id, i) => ids.indexOf(id) !== i);
|
|
90
|
+
if (repetido)
|
|
91
|
+
throw recusa('repetida', `${repetido} pedida duas vezes`);
|
|
92
|
+
return ids;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A linha de verify de uma tarefa nos formatos em uso nos planos: `- **verify:** ...`, `- **verify**: ...`,
|
|
96
|
+
* `- verify: ...`, `` - `verify`: ... `` e `Verify: ...` fora de lista. O grupo 1 e o que vem depois do rotulo.
|
|
97
|
+
*/
|
|
98
|
+
const ROTULO_DE_VERIFY = /^\s*(?:[-*]\s+)?(?:\*\*verify:\*\*|\*\*verify\*\*\s*:|`verify`\s*:|verify\s*:)\s*(.*)$/i;
|
|
99
|
+
/** Linha que abre outro item de lista, cabecalho ou cerca de codigo. */
|
|
100
|
+
const ABRE_BLOCO = /^\s*(?:[-*+]\s|\d+[.)]\s|#{1,6}\s|```|~~~)/;
|
|
101
|
+
const recuo = (linha) => /^[ \t]*/.exec(linha)[0].replace(/\t/g, ' ').length;
|
|
102
|
+
/**
|
|
103
|
+
* O item inteiro do verify da linha `k`: o texto depois do rotulo e as linhas que o Markdown junta a ele, a
|
|
104
|
+
* continuacao logo abaixo que nao abre outro item e as linhas mais recuadas que o rotulo, mesmo depois de
|
|
105
|
+
* linha em branco. Verify que quebra na linha seguinte ("e o teste da fatia 1 (`node --test ...`)") e um
|
|
106
|
+
* item so, e o pedaco da linha de baixo nao pode ficar de fora.
|
|
107
|
+
*/
|
|
108
|
+
function itemDoVerify(bloco, k, inicio) {
|
|
109
|
+
const base = recuo(bloco[k]);
|
|
110
|
+
const partes = [inicio];
|
|
111
|
+
let depoisDeBranco = false;
|
|
112
|
+
for (const linha of bloco.slice(k + 1)) {
|
|
113
|
+
if (!linha.trim()) {
|
|
114
|
+
depoisDeBranco = true;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (recuo(linha) <= base && (depoisDeBranco || ABRE_BLOCO.test(linha)))
|
|
118
|
+
break;
|
|
119
|
+
partes.push(linha.trim());
|
|
120
|
+
depoisDeBranco = false;
|
|
121
|
+
}
|
|
122
|
+
return partes.join(' ').trim();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* O comando de verify da tarefa `T<id>` no texto do plano (D7). O cabeçalho (niveis `##` a `######`)
|
|
126
|
+
* aparece uma vez so; no bloco dele, ate o proximo cabecalho de nivel igual ou maior, ha um unico
|
|
127
|
+
* item `verify`, e ele e um trecho entre crases e nada mais (ponto final aceito), contando as linhas
|
|
128
|
+
* de continuacao do item. Item com dois trechos ou com texto alem do comando ("`git status` vazio e
|
|
129
|
+
* `ork verify`") recusa: rodar so um pedaco daria "passou" a um verify que nao rodou inteiro.
|
|
130
|
+
*/
|
|
131
|
+
function verifyDaTarefa(plano, tarefaBruta) {
|
|
132
|
+
const id = tarefaBruta.trim().replace(/^T/i, '');
|
|
133
|
+
if (!/^\d+(?:\.\d+)*$/.test(id))
|
|
134
|
+
throw recusa('uso', `tarefa invalida: ${tarefaBruta} (ex.: T2.1)`);
|
|
135
|
+
const tarefa = `T${id}`;
|
|
136
|
+
const linhas = plano.replace(/\r\n/g, '\n').split('\n');
|
|
137
|
+
const cabecalho = /^(#{2,6})\s+T(\d+(?:\.\d+)*)(?=[\s.:)]|$)/;
|
|
138
|
+
const inicios = linhas.flatMap((l, i) => {
|
|
139
|
+
const m = cabecalho.exec(l);
|
|
140
|
+
return m && m[2] === id ? [{ i, nivel: m[1].length }] : [];
|
|
141
|
+
});
|
|
142
|
+
if (inicios.length === 0)
|
|
143
|
+
throw recusa('tarefa-ausente', `o plano nao tem a tarefa ${tarefa}`);
|
|
144
|
+
if (inicios.length > 1)
|
|
145
|
+
throw recusa('tarefa-repetida', `o plano tem ${inicios.length} cabecalhos da tarefa ${tarefa}`);
|
|
146
|
+
const { i, nivel } = inicios[0];
|
|
147
|
+
const fimDoBloco = linhas.findIndex((l, j) => j > i && new RegExp(`^#{1,${nivel}}\\s`).test(l));
|
|
148
|
+
const bloco = linhas.slice(i + 1, fimDoBloco < 0 ? undefined : fimDoBloco);
|
|
149
|
+
const verifies = bloco.flatMap((l, k) => {
|
|
150
|
+
const m = ROTULO_DE_VERIFY.exec(l);
|
|
151
|
+
return m ? [itemDoVerify(bloco, k, m[1].trim())] : [];
|
|
152
|
+
});
|
|
153
|
+
if (verifies.length === 0)
|
|
154
|
+
throw recusa('tarefa-sem-verify', `a tarefa ${tarefa} nao tem linha de verify`);
|
|
155
|
+
if (verifies.length > 1)
|
|
156
|
+
throw recusa('tarefa-ambigua', `a tarefa ${tarefa} tem ${verifies.length} linhas de verify`);
|
|
157
|
+
const resto = verifies[0];
|
|
158
|
+
const trechos = [...resto.matchAll(/`([^`]+)`/g)].length;
|
|
159
|
+
if (trechos === 0)
|
|
160
|
+
throw recusa('tarefa-sem-comando', `o verify da tarefa ${tarefa} nao tem comando entre crases: ${resto.slice(0, 120)}`);
|
|
161
|
+
const unico = /^`([^`]+)`\s*\.?$/.exec(resto);
|
|
162
|
+
if (!unico || !unico[1].trim()) {
|
|
163
|
+
throw recusa('tarefa-ambigua', `o verify da tarefa ${tarefa} tem ${trechos} trecho(s) entre crases e texto alem de um comando so ` +
|
|
164
|
+
`(${resto.slice(0, 120)}); a conferencia nao escolhe qual pedaco rodar`);
|
|
165
|
+
}
|
|
166
|
+
return { tarefa, comando: unico[1].trim() };
|
|
167
|
+
}
|
|
168
|
+
/** O teto dos documentos de fase (`docs/*.md` da thread). */
|
|
169
|
+
const LIMITE_DO_PLANO = 128 * 1024;
|
|
170
|
+
/**
|
|
171
|
+
* O `docs/plan.md` da thread, com o sha256 dos bytes lidos; `null` quando ele nao existe. Le pela pasta
|
|
172
|
+
* de estado da thread, que e a do checkout principal mesmo com o CLI rodando de dentro da worktree.
|
|
173
|
+
*/
|
|
174
|
+
function lerPlano(raiz, threadId) {
|
|
175
|
+
const arquivo = path.join((0, thread_1.dirThread)(raiz, threadId), 'docs', 'plan.md');
|
|
176
|
+
let fd;
|
|
177
|
+
try {
|
|
178
|
+
fd = fs.openSync(arquivo, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
if (e.code === 'ENOENT')
|
|
182
|
+
return null;
|
|
183
|
+
throw recusa('plano-inseguro', 'docs/plan.md da thread nao abre como arquivo comum');
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const st = fs.fstatSync(fd);
|
|
187
|
+
if (!st.isFile() || st.size > LIMITE_DO_PLANO)
|
|
188
|
+
throw recusa('plano-inseguro', 'docs/plan.md da thread nao e arquivo comum de ate 128 KiB');
|
|
189
|
+
const bytes = fs.readFileSync(fd);
|
|
190
|
+
return { arquivo: 'docs/plan.md', sha256: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex'), conteudo: bytes.toString('utf8') };
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
fs.closeSync(fd);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Como o `ork_verify` (`mcp-verify.ts`): so a worktree propria da thread, dentro do projeto e registrada no git
|
|
198
|
+
* dele na branch da thread, fica gravavel no sandbox. O projeto e a arvore principal, mesmo com o CLI rodando de
|
|
199
|
+
* dentro de uma worktree. Thread sem worktree seria conferida com a arvore principal gravavel, e worktree de
|
|
200
|
+
* outro repositorio numa branch de mesmo nome abriria escrita fora do projeto: as duas recusam.
|
|
201
|
+
*/
|
|
202
|
+
function worktreeConferida(raiz, thread) {
|
|
203
|
+
if (!thread.worktree)
|
|
204
|
+
throw recusa('sem-worktree', `a thread ${thread.id} nao tem worktree propria; a conferencia so roda nela`);
|
|
205
|
+
let dir;
|
|
206
|
+
try {
|
|
207
|
+
dir = fs.realpathSync(thread.worktree);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
throw recusa('worktree-ausente', `a worktree da thread ${thread.id} nao existe no disco`);
|
|
211
|
+
}
|
|
212
|
+
const projeto = fs.realpathSync((0, estado_thread_1.raizDoEstado)(raiz));
|
|
213
|
+
if (!dir.startsWith(projeto + path.sep))
|
|
214
|
+
throw recusa('worktree-fora-do-projeto', `a worktree da thread ${thread.id} fica fora do projeto`);
|
|
215
|
+
const branch = (0, worktree_1.branchDaWorktree)(thread);
|
|
216
|
+
if (!(0, worktree_1.worktreesDoGit)(projeto).some((w) => w.dir === dir && w.branch === branch))
|
|
217
|
+
throw recusa('worktree-nao-registrada', `a worktree da thread ${thread.id} nao esta registrada no git do projeto na branch ${branch}`);
|
|
218
|
+
return dir;
|
|
219
|
+
}
|
|
220
|
+
/** A fabrica padrao: o sandbox do codex, um por comando, como o `ork_verify`. */
|
|
221
|
+
const fabricaPadrao = (worktree, timeoutMs) => (0, verify_sandbox_1.criarExecutorSandbox)({ worktree, timeoutMs });
|
|
222
|
+
/** Sandbox que nao abre vira recusa tipada: a conferencia nunca roda fora dele (D6). */
|
|
223
|
+
function confinado(fabrica, worktree, timeoutMs) {
|
|
224
|
+
try {
|
|
225
|
+
return fabrica(worktree, timeoutMs);
|
|
226
|
+
}
|
|
227
|
+
catch (e) {
|
|
228
|
+
throw recusa('sandbox-indisponivel', `${e.message}; a conferencia so roda confinada, sem fallback`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function conferida(r) {
|
|
232
|
+
return {
|
|
233
|
+
nome: r.nome, comando: r.comando, ok: r.ok, code: r.code, executado: r.executado !== false,
|
|
234
|
+
...(r.causa ? { causa: r.causa } : {}),
|
|
235
|
+
...(r.prazoMs !== undefined ? { prazoMs: r.prazoMs } : {}),
|
|
236
|
+
...(r.duracaoMs !== undefined ? { duracaoMs: r.duracaoMs } : {}),
|
|
237
|
+
fim: r.resumo ? (0, redacao_saida_1.redigirSaida)(r.resumo) : '',
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/** `ork claims conferir`: so o que foi pedido, no sandbox, sob a conducao da thread, sem gravar nada. */
|
|
241
|
+
function conferirClaims(carregado, threadId, pedido) {
|
|
242
|
+
const { raiz, manifesto } = carregado;
|
|
243
|
+
if (!pedido.claims === !pedido.tarefa)
|
|
244
|
+
throw recusa('uso', 'informe --claims C1,C2 ou --tarefa T1, um dos dois');
|
|
245
|
+
const prazoTotalMs = pedido.prazoMs ?? exports.PRAZO_PADRAO_MS;
|
|
246
|
+
if (!Number.isInteger(prazoTotalMs) || prazoTotalMs < PRAZO_MINIMO_MS || prazoTotalMs > exports.PRAZO_MAXIMO_MS)
|
|
247
|
+
throw recusa('prazo', `--prazo vai de ${PRAZO_MINIMO_MS / 1000} a ${exports.PRAZO_MAXIMO_MS / 1000} segundos`);
|
|
248
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(threadId) || !fs.existsSync((0, thread_1.caminhoThread)(raiz, threadId)))
|
|
249
|
+
throw recusa('thread-ausente', `a thread ${threadId} nao existe neste projeto`);
|
|
250
|
+
const thread = (0, thread_1.lerThread)(raiz, threadId);
|
|
251
|
+
if (thread.status === 'fechada')
|
|
252
|
+
throw recusa('thread-fechada', `a thread ${threadId} esta fechada`);
|
|
253
|
+
const cwd = worktreeConferida(raiz, thread);
|
|
254
|
+
// O que vai rodar, inteiro resolvido antes de tomar a conducao: recusa de uso nao toca a worktree.
|
|
255
|
+
let alvo;
|
|
256
|
+
let selecionadas;
|
|
257
|
+
if (pedido.claims) {
|
|
258
|
+
const ids = pedido.claims;
|
|
259
|
+
const todas = (0, claims_1.lerClaims)(raiz, threadId);
|
|
260
|
+
selecionadas = ids.map((id) => {
|
|
261
|
+
const claim = todas.find((c) => c.id === id);
|
|
262
|
+
if (!claim)
|
|
263
|
+
throw recusa('desconhecida', `${id} nao existe na thread ${threadId}`);
|
|
264
|
+
if (claim.estado === 'retirada')
|
|
265
|
+
throw recusa('retirada', `${id} foi retirada (${claim.motivoDaRetirada ?? 'sem motivo'})`);
|
|
266
|
+
return claim;
|
|
267
|
+
});
|
|
268
|
+
alvo = { tipo: 'claims', ids };
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
const plano = lerPlano(raiz, threadId);
|
|
272
|
+
if (!plano)
|
|
273
|
+
throw recusa('plano-ausente', `a thread ${threadId} nao tem docs/plan.md`);
|
|
274
|
+
const { tarefa, comando } = verifyDaTarefa(plano.conteudo, pedido.tarefa);
|
|
275
|
+
selecionadas = [{ id: tarefa, thread: threadId, fase: null, arquivo: plano.arquivo, alegacao: `verify da tarefa ${tarefa} do plano`,
|
|
276
|
+
negativa: false, verificar: [comando], criadoEm: '', estado: 'pendente' }];
|
|
277
|
+
alvo = { tipo: 'tarefa', tarefa, plano: { arquivo: plano.arquivo, sha256: plano.sha256 }, comando };
|
|
278
|
+
}
|
|
279
|
+
// O sandbox e conferido antes da conducao: sem ele, nada toma o lease nem toca a worktree.
|
|
280
|
+
const fabrica = pedido.fabrica ?? fabricaPadrao;
|
|
281
|
+
confinado(fabrica, cwd, PRAZO_MINIMO_MS).fechar();
|
|
282
|
+
const pedidoDeConducao = {
|
|
283
|
+
canal: pedido.canal ?? (0, conducao_1.canalDoProcesso)(),
|
|
284
|
+
correlacao: pedido.correlacao ?? null,
|
|
285
|
+
operacao: 'verify',
|
|
286
|
+
identidade: (0, conducao_1.identidadeDoAmbiente)(threadId, process.env, raiz),
|
|
287
|
+
prazoMs: (0, conducao_1.prazoDaVerificacao)(prazoTotalMs, 1),
|
|
288
|
+
};
|
|
289
|
+
return (0, conducao_1.comConducao)(raiz, threadId, pedidoDeConducao, (tomada) => {
|
|
290
|
+
const prazoFinal = Date.now() + prazoTotalMs;
|
|
291
|
+
const executor = (nome, comando, dir) => {
|
|
292
|
+
const restante = prazoFinal - Date.now() - RESERVA_MS;
|
|
293
|
+
if (restante < 100) {
|
|
294
|
+
return { nome, comando, ok: false, code: -1, executado: false, resumo: 'nao executado: prazo total da conferencia esgotado' };
|
|
295
|
+
}
|
|
296
|
+
const prazoMs = Math.min((0, verify_1.prazoDoComando)(manifesto, nome), restante);
|
|
297
|
+
tomada.renovar(prazoMs);
|
|
298
|
+
const sandbox = confinado(fabrica, cwd, prazoMs);
|
|
299
|
+
const inicio = Date.now();
|
|
300
|
+
try {
|
|
301
|
+
const r = sandbox.executar(nome, comando, dir);
|
|
302
|
+
const estourou = !r.ok && /timeout do sandbox/.test(`${r.stderr ?? ''}${r.resumo}`);
|
|
303
|
+
return { ...r, executado: true, prazoMs, duracaoMs: Date.now() - inicio, ...(estourou ? { causa: 'timeout' } : {}) };
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
sandbox.fechar();
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
const resultados = selecionadas.map((c) => (0, verify_1.verificarClaim)(c, cwd, executor));
|
|
310
|
+
const itens = resultados.map((r) => ({
|
|
311
|
+
id: r.claim.id, alegacao: r.claim.alegacao, arquivo: r.claim.arquivo ?? null, verificado: r.verificado,
|
|
312
|
+
motivo: r.motivo, detalhe: r.detalhe, execucoes: r.execucoes.map(conferida),
|
|
313
|
+
}));
|
|
314
|
+
const motivos = [...new Set(itens.map((i) => i.motivo).filter((m) => m !== null))];
|
|
315
|
+
return {
|
|
316
|
+
formato: exports.FORMATO_DA_CONFERENCIA, thread: threadId, commit: (0, verify_1.commitReal)(cwd), cwd, executor: 'codex-sandbox',
|
|
317
|
+
reciboOficial: false, prazoTotalMs, alvo, itens, ok: itens.every((i) => i.verificado), motivos,
|
|
318
|
+
};
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
/** Texto de `ork claims conferir`, para quem roda no terminal. */
|
|
322
|
+
function textoDaConferencia(r) {
|
|
323
|
+
const linhas = [`Conferencia pontual da thread ${r.thread} (sem recibo: o ork verify continua sendo quem verifica)`];
|
|
324
|
+
linhas.push(` HEAD real ${r.commit}`);
|
|
325
|
+
linhas.push(` executor ${r.executor}, prazo total ${Math.round(r.prazoTotalMs / 1000)} s`);
|
|
326
|
+
linhas.push(r.alvo.tipo === 'claims'
|
|
327
|
+
? ` alvo claims ${r.alvo.ids.join(', ')}`
|
|
328
|
+
: ` alvo verify da tarefa ${r.alvo.tarefa} (plano sha256 ${r.alvo.plano.sha256.slice(0, 12)}): ${r.alvo.comando}`);
|
|
329
|
+
linhas.push('');
|
|
330
|
+
for (const i of r.itens) {
|
|
331
|
+
linhas.push(` ${i.id} ${i.verificado ? 'passou' : `NAO PASSOU (${i.motivo})`} ${i.alegacao}`);
|
|
332
|
+
if (!i.verificado) {
|
|
333
|
+
linhas.push(` ${i.detalhe}`);
|
|
334
|
+
const falhou = i.execucoes.find((e) => !e.ok);
|
|
335
|
+
if (falhou?.fim)
|
|
336
|
+
linhas.push(...falhou.fim.split('\n').map((l) => ` | ${l}`));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
linhas.push('');
|
|
340
|
+
linhas.push(r.ok ? 'Resultado: tudo passou.' : `Resultado: nao passou. Motivos: ${r.motivos.join(', ')}`);
|
|
341
|
+
return linhas.join('\n');
|
|
342
|
+
}
|
package/dist/claims.js
CHANGED
|
@@ -181,7 +181,9 @@ function conferirProvaLocal(raiz, thread, claim, executarProva) {
|
|
|
181
181
|
if (!carregado || claim.verificar.length === 0 || !(0, policies_1.policyDeProvaLocal)(carregado.manifesto))
|
|
182
182
|
return [];
|
|
183
183
|
const prazoMs = carregado.manifesto.verify.timeout_ms ?? verify_1.TIMEOUT_VERIFY_MS;
|
|
184
|
-
|
|
184
|
+
// RM-047 (P2): worktree apagada nao passa pela procedencia, porque nada roda nela; vira o aviso abaixo.
|
|
185
|
+
const apagada = thread.worktree && !fs.existsSync(thread.worktree) ? thread.worktree : undefined;
|
|
186
|
+
const cwd = apagada ?? (0, verify_1.cwdDaThread)(raiz, thread);
|
|
185
187
|
let reprovada;
|
|
186
188
|
// Suspeitas da revisao de 03/10: sem a worktree (apagada), nada roda e o aviso diz por que, sem culpar a claim.
|
|
187
189
|
if (!fs.existsSync(cwd))
|
|
@@ -1,8 +1,42 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.BRAIN_API = void 0;
|
|
4
37
|
exports.validateRequest = validateRequest;
|
|
5
38
|
exports.brainClient = brainClient;
|
|
39
|
+
const os = __importStar(require("node:os"));
|
|
6
40
|
const node_child_process_1 = require("node:child_process");
|
|
7
41
|
const project_state_1 = require("./project-state");
|
|
8
42
|
const company_brain_contract_1 = require("./company-brain-contract");
|
|
@@ -36,7 +70,8 @@ function brainClient(loaded, execute = node_child_process_1.spawnSync) {
|
|
|
36
70
|
const payload = request.payload;
|
|
37
71
|
if (payload?.tenant_id !== undefined && payload.tenant_id !== config.tenant)
|
|
38
72
|
return { schema: exports.BRAIN_API, state: 'forbidden', error: 'brain.tenant.mismatch' };
|
|
39
|
-
|
|
73
|
+
// RM-047: cwd fora do clone; um nome de interpretador em memory.cli não acha arquivo do repositório.
|
|
74
|
+
const result = execute(config.cli, ['brain', 'request'], { cwd: os.homedir(), encoding: 'utf8', timeout: Math.min(config.timeout_ms, 15000),
|
|
40
75
|
maxBuffer: 2 * 1024 * 1024, input: JSON.stringify(request), shell: false,
|
|
41
76
|
env: { PATH: process.env.PATH ?? '/usr/bin:/bin', PYTHONDONTWRITEBYTECODE: '1',
|
|
42
77
|
ORKMIND_DATABASE_URL: dsn ?? '', ORKMIND_BRAIN_TENANT: config.tenant } });
|
|
@@ -118,7 +118,8 @@ function withProcessLock(dir, busy, run) {
|
|
|
118
118
|
}
|
|
119
119
|
function durableAppend(file, value) {
|
|
120
120
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
121
|
-
|
|
121
|
+
// RM-047: O_NOFOLLOW; um ledger versionado como link não leva o append para fora da raiz.
|
|
122
|
+
const fd = fs.openSync(file, fs.constants.O_WRONLY | fs.constants.O_APPEND | fs.constants.O_CREAT | fs.constants.O_NOFOLLOW, 0o600);
|
|
122
123
|
try {
|
|
123
124
|
fs.writeFileSync(fd, JSON.stringify(value) + '\n');
|
|
124
125
|
fs.fsyncSync(fd);
|
|
@@ -1,8 +1,42 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.brainAdmin = brainAdmin;
|
|
4
37
|
exports.reconcileBrain = reconcileBrain;
|
|
5
38
|
exports.applyBrain = applyBrain;
|
|
39
|
+
const os = __importStar(require("node:os"));
|
|
6
40
|
const node_child_process_1 = require("node:child_process");
|
|
7
41
|
const project_state_1 = require("./project-state");
|
|
8
42
|
const portfolio_1 = require("./portfolio");
|
|
@@ -15,7 +49,8 @@ function brainAdmin(c) {
|
|
|
15
49
|
const dsn = config.database_url_env ? process.env[config.database_url_env] : undefined;
|
|
16
50
|
if (config.mode !== 'orkmind' || !dsn)
|
|
17
51
|
throw Error('brain.configuration.missing');
|
|
18
|
-
|
|
52
|
+
// RM-047: cwd fora do clone; um nome de interpretador em memory.cli não acha arquivo do repositório.
|
|
53
|
+
const r = (0, node_child_process_1.spawnSync)(config.cli, ['brain', 'migration'], { cwd: os.homedir(), shell: false, encoding: 'utf8', timeout: Math.min(config.timeout_ms, 15000), maxBuffer: 2 * 1024 * 1024,
|
|
19
54
|
input: JSON.stringify({ schema: 'orkmind.company-brain-admin/v1', operation, payload }),
|
|
20
55
|
env: { PATH: process.env.PATH ?? '/usr/bin:/bin', PYTHONDONTWRITEBYTECODE: '1', ORKMIND_DATABASE_URL: dsn, ORKMIND_BRAIN_TENANT: config.tenant } });
|
|
21
56
|
try {
|