@orkastery/cli 0.5.1 → 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/agents/ork-master.md +2 -0
- package/adapters/claude-code/commands/master.md +8 -0
- package/adapters/claude-code/commands/ork.md +9 -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/codex/skills/ork/SKILL.md +18 -3
- package/adapters/hermes/README.md +1 -0
- package/adapters/hermes/bin/ork-network-status.sh +10 -0
- package/adapters/hermes/hermes.plugin.json +1 -0
- package/adapters/hermes/hitl-ingress/__init__.py +2 -2
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
- package/adapters/openclaw/README.md +26 -5
- package/adapters/openclaw/dist/hitl-ingress.js +2 -2
- package/adapters/openclaw/dist/index.js +46 -11
- package/adapters/openclaw/openclaw.plugin.json +5 -1
- package/adapters/openclaw/package.json +2 -2
- package/adapters/openclaw/src/hitl-ingress.ts +2 -2
- package/adapters/openclaw/src/index.ts +49 -11
- 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/assets/orkmind_bridge.py +117 -9
- package/dist/adapters/claude-bg.js +116 -18
- package/dist/adapters/codex.js +14 -4
- package/dist/agents-md.js +24 -14
- package/dist/auditrun.js +22 -3
- package/dist/board.js +20 -17
- package/dist/branch-de-estado.js +88 -10
- package/dist/busca-semantica.js +52 -12
- package/dist/canarios-rm057.js +149 -0
- package/dist/canarios.js +2 -0
- package/dist/catalogo.js +33 -0
- package/dist/ci.js +21 -8
- package/dist/claims-conferir.js +342 -0
- package/dist/claims.js +41 -1
- package/dist/company-brain-client.js +36 -1
- package/dist/company-brain-context.js +158 -22
- 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 +70 -17
- package/dist/doctor-pulse-cron.js +349 -0
- package/dist/doctor-rede.js +150 -0
- package/dist/doctor.js +195 -111
- package/dist/entrega-pr.js +42 -29
- package/dist/escopo-escrita.js +10 -1
- package/dist/esgotamentos.js +181 -0
- package/dist/estado-thread.js +23 -1
- package/dist/experiencia-instalacao.js +45 -25
- package/dist/experiencia.js +12 -2
- package/dist/fabrica-batida.js +310 -0
- package/dist/fabrica-estado.js +52 -14
- package/dist/fabrica-publicar.js +9 -1
- package/dist/fechamento.js +20 -66
- package/dist/fila-pesada.js +444 -0
- package/dist/fix.js +3 -2
- package/dist/forja.js +31 -7
- package/dist/gates.js +3 -24
- package/dist/handoff.js +10 -6
- package/dist/hitl-contract.js +59 -4
- package/dist/hitl-curto.js +11 -6
- package/dist/hitl-gates.js +5 -0
- package/dist/hitl-local-receipt.js +2 -0
- package/dist/hitl-lote.js +5 -2
- package/dist/hitl-resumo.js +38 -3
- package/dist/hitl-tempo-parado.js +201 -0
- package/dist/hitl-texto-livre.js +5 -5
- package/dist/hitl.js +29 -33
- package/dist/horario.js +41 -7
- package/dist/hosts.js +104 -11
- package/dist/impedimento.js +299 -0
- package/dist/index.js +961 -542
- package/dist/indice-vetorial.js +87 -10
- package/dist/indice.js +9 -1
- package/dist/init.js +56 -43
- package/dist/instabilidade.js +144 -0
- package/dist/integracoes-locais.js +4 -0
- package/dist/intelligence-graph-cli.js +170 -16
- package/dist/intelligence-graph-contexto.js +254 -0
- 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-parsers.js +6 -4
- package/dist/intelligence-graph-query.js +66 -19
- package/dist/leases.js +664 -87
- package/dist/ledger-stats.js +15 -1
- package/dist/ledger.js +18 -1
- package/dist/licoes.js +1 -0
- 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/maestro-runtime.js +4 -1
- package/dist/manifest.js +149 -4
- package/dist/maquina.js +23 -4
- package/dist/master-digest.js +6 -1
- package/dist/master-nota.js +18 -11
- package/dist/master.js +145 -31
- package/dist/mcp-artifacts.js +43 -3
- package/dist/mcp-git.js +42 -8
- package/dist/mcp-grafo-worker.js +5 -3
- package/dist/mcp-grafo.js +55 -6
- package/dist/mcp-server.js +22 -3
- package/dist/mcp-ship.js +3 -1
- package/dist/mcp-verify.js +6 -1
- package/dist/memoria.js +48 -6
- package/dist/modos.js +3 -6
- package/dist/network-roadmap.js +196 -18
- 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 +40 -5
- package/dist/onboarding.js +40 -21
- package/dist/orkmind.js +99 -7
- package/dist/orquestracao.js +24 -21
- package/dist/parado-no-condutor.js +219 -38
- package/dist/phase.js +160 -52
- package/dist/policies.js +56 -5
- package/dist/portfolio.js +8 -3
- package/dist/postura-local.js +234 -0
- package/dist/preflight.js +11 -10
- package/dist/procedencia.js +225 -0
- package/dist/projeto-alvo.js +132 -5
- package/dist/prompts.js +40 -1
- package/dist/prova-ativacao.js +75 -6
- package/dist/pulse-delivery.js +47 -4
- package/dist/pulse.js +98 -19
- package/dist/ratelimit.js +24 -6
- package/dist/recall.js +3 -1
- package/dist/redacao-saida.js +63 -0
- package/dist/rede-adesao.js +399 -0
- package/dist/rede-forja.js +289 -0
- package/dist/rede-projetos.js +239 -0
- package/dist/rede-status.js +337 -0
- package/dist/rede.js +980 -0
- package/dist/retry.js +291 -140
- package/dist/roadmap-reservas.js +20 -3
- package/dist/roadmap-status.js +150 -34
- package/dist/runtime-context.js +181 -3
- package/dist/runtime-profiles.js +22 -1
- package/dist/runtimes.js +2 -1
- package/dist/saida-segura.js +58 -0
- package/dist/session-events.js +7 -3
- package/dist/session-watcher-claude.js +120 -24
- package/dist/session-watcher.js +185 -33
- package/dist/sessoes-contas.js +187 -0
- package/dist/sessoes-inventario.js +6 -18
- package/dist/sessoes.js +83 -2
- package/dist/ship-publicar.js +800 -0
- package/dist/ship.js +157 -88
- package/dist/steal.js +77 -0
- package/dist/thread-close.js +3 -2
- package/dist/thread.js +299 -49
- 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 +25 -2
- package/dist/yaml.js +27 -8
- package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
- package/package.json +7 -3
- package/references/definition-of-done.md +1 -1
- package/schemas/code-artifact-graph.v1.schema.json +2 -1
- package/skills/README.md +1 -1
- package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
- package/skills/phases/master-metrics/SKILL.md +8 -3
package/dist/phase.js
CHANGED
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.REGRAS_DE_EVIDENCIA = exports.CONTRATO_DAS_FASES = void 0;
|
|
37
37
|
exports.escolherPerfil = escolherPerfil;
|
|
38
|
+
exports.perfilPedido = perfilPedido;
|
|
38
39
|
exports.perfilParaDespacho = perfilParaDespacho;
|
|
39
40
|
exports.runtimeCruzadoParaDespacho = runtimeCruzadoParaDespacho;
|
|
40
41
|
exports.estadoParaDespacho = estadoParaDespacho;
|
|
@@ -71,17 +72,21 @@ const board_1 = require("./board");
|
|
|
71
72
|
const verify_1 = require("./verify");
|
|
72
73
|
const session_watcher_1 = require("./session-watcher");
|
|
73
74
|
const session_watcher_claude_1 = require("./session-watcher-claude");
|
|
75
|
+
const manifest_1 = require("./manifest");
|
|
76
|
+
const mcp_grafo_1 = require("./mcp-grafo");
|
|
74
77
|
const runtimes_1 = require("./runtimes");
|
|
75
78
|
const setup_1 = require("./setup");
|
|
76
79
|
const modos_1 = require("./modos");
|
|
77
80
|
const gates_1 = require("./gates");
|
|
78
81
|
const policies_1 = require("./policies");
|
|
79
82
|
const ratelimit_1 = require("./ratelimit");
|
|
83
|
+
const impedimento_1 = require("./impedimento");
|
|
80
84
|
const claude_bg_1 = require("./adapters/claude-bg");
|
|
81
85
|
const codex_1 = require("./adapters/codex");
|
|
82
86
|
const memoria_1 = require("./memoria");
|
|
83
87
|
const prompts_1 = require("./prompts");
|
|
84
88
|
const slug_1 = require("./slug");
|
|
89
|
+
const locale_1 = require("./locale");
|
|
85
90
|
const thread_1 = require("./thread");
|
|
86
91
|
const types_1 = require("./types");
|
|
87
92
|
const util_1 = require("./util");
|
|
@@ -89,7 +94,10 @@ const ledger_1 = require("./ledger");
|
|
|
89
94
|
const estado_thread_1 = require("./estado-thread");
|
|
90
95
|
const horario_1 = require("./horario");
|
|
91
96
|
const runtime_profiles_1 = require("./runtime-profiles");
|
|
97
|
+
const sessoes_contas_1 = require("./sessoes-contas");
|
|
92
98
|
const maquina_1 = require("./maquina");
|
|
99
|
+
const procedencia_1 = require("./procedencia");
|
|
100
|
+
const postura_local_1 = require("./postura-local");
|
|
93
101
|
const fabrica_publicar_1 = require("./fabrica-publicar");
|
|
94
102
|
const conducao_1 = require("./conducao");
|
|
95
103
|
/**
|
|
@@ -102,18 +110,14 @@ function escolherPerfil(raiz, runtime, opcoes = {}) {
|
|
|
102
110
|
// I-49: o despacho enxerga o estado que as outras fabricas viram na mesma conta.
|
|
103
111
|
const store = (0, runtime_profiles_1.lerPerfisComContas)(raiz, opcoes.agoraMs);
|
|
104
112
|
const doRuntime = (0, runtime_profiles_1.perfisDoRuntime)(store, runtime);
|
|
105
|
-
if (opcoes.perfil !== undefined)
|
|
106
|
-
|
|
107
|
-
if (!pedido)
|
|
108
|
-
return { perfil: null, configurados: doRuntime.length, erro: `perfil "${opcoes.perfil}" nao existe para o runtime ${runtime}` };
|
|
109
|
-
if (!(0, runtime_profiles_1.perfilDisponivel)(pedido, opcoes.agoraMs))
|
|
110
|
-
return { perfil: null, configurados: doRuntime.length,
|
|
111
|
-
erro: `perfil "${pedido.id}" esta ${pedido.estado}${pedido.esgotadoAte ? ` ate ${pedido.esgotadoAte}` : ''}` };
|
|
112
|
-
return { perfil: (0, runtime_profiles_1.perfilDeDespacho)(pedido), configurados: doRuntime.length };
|
|
113
|
-
}
|
|
113
|
+
if (opcoes.perfil !== undefined)
|
|
114
|
+
return perfilPedido(store, runtime, opcoes.perfil, opcoes.agoraMs);
|
|
114
115
|
if (doRuntime.length === 0)
|
|
115
116
|
return { perfil: null, configurados: 0 };
|
|
116
|
-
const
|
|
117
|
+
const politica = opcoes.politica ?? runtime_profiles_1.POLITICA_PADRAO;
|
|
118
|
+
const proximo = politica.distribuir === 'carga' && opcoes.carga
|
|
119
|
+
? (0, runtime_profiles_1.proximoPerfilPorCarga)(store, runtime, politica, opcoes.carga, opcoes)
|
|
120
|
+
: (0, runtime_profiles_1.proximoPerfilDisponivel)(store, runtime, politica, opcoes);
|
|
117
121
|
if (proximo)
|
|
118
122
|
return { perfil: (0, runtime_profiles_1.perfilDeDespacho)(proximo), configurados: doRuntime.length };
|
|
119
123
|
const agoraMs = opcoes.agoraMs ?? Date.now();
|
|
@@ -125,6 +129,41 @@ function escolherPerfil(raiz, runtime, opcoes = {}) {
|
|
|
125
129
|
return { perfil: null, configurados: doRuntime.length, motivo,
|
|
126
130
|
erro: `nenhum perfil disponivel do runtime ${runtime} (${doRuntime.map(p => `${p.id}: ${p.estado}`).join(', ')})` };
|
|
127
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* RM-056 (D1): o perfil PEDIDO (`--perfil`), validado contra o store. Recusa com motivo tipado e nunca
|
|
134
|
+
* troca de perfil: inexistente ou de outro runtime e `runtime.profile-invalid`; esgotado, a cota; sem
|
|
135
|
+
* login (ou de provider pago), o motivo do estado. Funcao propria, para o despacho da RM-055 rebasar limpo.
|
|
136
|
+
*/
|
|
137
|
+
function perfilPedido(store, runtime, id, agoraMs = Date.now()) {
|
|
138
|
+
const doRuntime = (0, runtime_profiles_1.perfisDoRuntime)(store, runtime);
|
|
139
|
+
const pedido = doRuntime.find(p => p.id === id);
|
|
140
|
+
if (!pedido) {
|
|
141
|
+
const outro = store.perfis.find(p => p.id === id);
|
|
142
|
+
return { perfil: null, configurados: doRuntime.length, motivo: 'runtime.profile-invalid',
|
|
143
|
+
erro: outro ? `perfil "${id}" e do runtime ${outro.runtime}, nao do ${runtime}`
|
|
144
|
+
: `perfil "${id}" nao existe no store (${doRuntime.length ? `perfis do ${runtime}: ${doRuntime.map(p => p.id).join(', ')}` : `nenhum perfil do ${runtime}`})` };
|
|
145
|
+
}
|
|
146
|
+
if ((0, runtime_profiles_1.perfilDisponivel)(pedido, agoraMs))
|
|
147
|
+
return { perfil: (0, runtime_profiles_1.perfilDeDespacho)(pedido), configurados: doRuntime.length };
|
|
148
|
+
const motivo = pedido.estado === 'esgotado' ? 'runtime.quota-exhausted' : pedido.estado === 'sem-auth'
|
|
149
|
+
? 'runtime.auth-missing' : pedido.estado === 'provider-pago' ? 'cost.violation' : 'runtime.profile-invalid';
|
|
150
|
+
return { perfil: null, configurados: doRuntime.length, motivo,
|
|
151
|
+
erro: `perfil "${pedido.id}" esta ${pedido.estado}${pedido.esgotadoAte ? ` ate ${pedido.esgotadoAte}` : ''}` };
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* RM-056 (D3): a carga dos perfis do runtime, so quando o manifesto pede `distribuir: carga` e o
|
|
155
|
+
* dono nao pediu um perfil. Consulta falha vale carga desconhecida (zero): decide o desempate.
|
|
156
|
+
*/
|
|
157
|
+
function cargaDoDespacho(carregado, runtime, politica, pedido) {
|
|
158
|
+
if (politica.distribuir !== 'carga' || pedido !== undefined || !(0, runtime_profiles_1.runtimeComPerfil)(runtime))
|
|
159
|
+
return undefined;
|
|
160
|
+
try {
|
|
161
|
+
return (0, sessoes_contas_1.sessoesVivasPorPerfil)(carregado.raiz, runtime, carregado.manifesto.concurrency.stale_after_min);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return new Map();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
128
167
|
/**
|
|
129
168
|
* I-33 (D7, D13): preflight de auth antes do despacho. O perfil escolhido tem o login conferido
|
|
130
169
|
* pelo proprio CLI com o env dele; reprovado, vira `sem-auth` no store (ou `provider-pago`, quando
|
|
@@ -136,8 +175,9 @@ function perfilParaDespacho(carregado, thread, fase, runtime, opcoes) {
|
|
|
136
175
|
const { raiz } = carregado;
|
|
137
176
|
const excluir = [...(opcoes.excluir ?? [])];
|
|
138
177
|
const politica = (0, runtime_profiles_1.politicaDeRotacao)(carregado.manifesto);
|
|
178
|
+
const carga = cargaDoDespacho(carregado, runtime, politica, opcoes.perfil);
|
|
139
179
|
for (;;) {
|
|
140
|
-
const escolha = escolherPerfil(raiz, runtime, { perfil: opcoes.perfil, excluir, politica });
|
|
180
|
+
const escolha = escolherPerfil(raiz, runtime, { perfil: opcoes.perfil, excluir, politica, carga });
|
|
141
181
|
if (escolha.erro || !escolha.perfil || opcoes.dryRun)
|
|
142
182
|
return escolha;
|
|
143
183
|
const auth = runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(escolha.perfil) : runtime === 'codex' ? (0, codex_1.conferirAuth)(escolha.perfil)
|
|
@@ -164,7 +204,7 @@ function perfilParaDespacho(carregado, thread, fase, runtime, opcoes) {
|
|
|
164
204
|
razao = 'o preflight de auth reprovou o perfil antes do despacho (D7): perfil sem login nunca recebe despacho';
|
|
165
205
|
}
|
|
166
206
|
excluir.push(escolha.perfil.id);
|
|
167
|
-
const proximo = opcoes.perfil === undefined ? escolherPerfil(raiz, runtime, { excluir, politica }).perfil : null;
|
|
207
|
+
const proximo = opcoes.perfil === undefined ? escolherPerfil(raiz, runtime, { excluir, politica, carga }).perfil : null;
|
|
168
208
|
(0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, thread.id), thread.id, ledger_1.TIPOS_DE_EVENTO.perfilRotacionado, {
|
|
169
209
|
fase, motivo, origem: `${opcoes.origem}.preflight`,
|
|
170
210
|
de: { runtime, perfil: escolha.perfil.id }, para: proximo ? { runtime, perfil: proximo.id } : null,
|
|
@@ -218,6 +258,8 @@ function estadoParaDespacho(raiz, thread, dryRun = false) {
|
|
|
218
258
|
if (!thread.worktree)
|
|
219
259
|
return null;
|
|
220
260
|
try {
|
|
261
|
+
// RM-047 (P2): a worktree do thread.json so vale registrada no git e com o estado local.
|
|
262
|
+
(0, procedencia_1.diretorioDaThread)(raiz, thread);
|
|
221
263
|
(0, estado_thread_1.vincularEstado)(raiz, thread.id, thread.worktree, dryRun);
|
|
222
264
|
return null;
|
|
223
265
|
}
|
|
@@ -239,6 +281,10 @@ exports.REGRAS_DE_EVIDENCIA = [
|
|
|
239
281
|
'Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.',
|
|
240
282
|
'Trabalhe apenas no diretorio de trabalho indicado acima.',
|
|
241
283
|
'Passos irreversiveis (push, merge, delecao) so acontecem quando o modo autoriza.',
|
|
284
|
+
// RM-058 N2 (D13 da ork-rm058n2): tres sessoes de 12/10/2026 mandaram verify ou suite para segundo plano com `&`,
|
|
285
|
+
// perderam o processo e esperaram para sempre.
|
|
286
|
+
'Verify, build e suite rodam em primeiro plano, com timeout, nunca com `&` no comando: o processo em segundo plano ' +
|
|
287
|
+
'se perde e a sessao espera para sempre. O `ork verify` espera a vez na fila de recursos pesados.',
|
|
242
288
|
];
|
|
243
289
|
/**
|
|
244
290
|
* I-42 (D11): as fases que o cabecalho do prompt descreve.
|
|
@@ -314,8 +360,10 @@ function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '') {
|
|
|
314
360
|
*/
|
|
315
361
|
function montarPromptComMemoria(carregado, thread, fase, pedido, memoria) {
|
|
316
362
|
const injecao = (0, memoria_1.injecaoDaFase)(carregado, memoria, thread, fase);
|
|
363
|
+
// Mesma raiz usada pelo MCP e runtime-context; o manifesto da WT nao habilita a dica.
|
|
364
|
+
const ligado = (0, mcp_grafo_1.grafoLigado)((0, manifest_1.exigirManifesto)((0, estado_thread_1.raizDoEstado)(carregado.raiz)).manifesto);
|
|
317
365
|
return {
|
|
318
|
-
prompt: montarPrompt(thread, fase, pedido, carregado.raiz, injecao.texto),
|
|
366
|
+
prompt: montarPrompt(thread, fase, (0, prompts_1.pedidoComDicaDoGrafo)(pedido, thread.id, ligado), carregado.raiz, injecao.texto),
|
|
319
367
|
injecao,
|
|
320
368
|
};
|
|
321
369
|
}
|
|
@@ -372,10 +420,10 @@ function resolverDespacho(manifesto, opcoes, doBloco) {
|
|
|
372
420
|
const origem = doBloco?.runtime ?? manifesto.runtime.adapter;
|
|
373
421
|
const runtime = opcoes.runtime ?? origem;
|
|
374
422
|
if ((0, runtimes_1.runtimeConhecido)(runtime) && runtime !== origem && !opcoes.model?.trim())
|
|
375
|
-
throw new
|
|
423
|
+
throw new locale_1.ErroDoCatalogo((m) => m.phase.modeloAoTrocarRuntime(origem, runtime));
|
|
376
424
|
const model = opcoes.model ?? doBloco?.model ?? manifesto.runtime.model;
|
|
377
425
|
if (!model.trim())
|
|
378
|
-
throw new
|
|
426
|
+
throw new locale_1.ErroDoCatalogo((m) => m.phase.modeloPendente(runtime));
|
|
379
427
|
const effort = opcoes.effort ??
|
|
380
428
|
(opcoes.model !== undefined ? 'high' : doBloco?.effort ?? manifesto.runtime.effort);
|
|
381
429
|
return { runtime, model, effort };
|
|
@@ -580,7 +628,8 @@ function garantirBaselineDoDespacho(carregado, threadId, opcoes, identidade) {
|
|
|
580
628
|
if (!baselineDoDespachoNecessaria(carregado, threadId, opcoes))
|
|
581
629
|
return;
|
|
582
630
|
try {
|
|
583
|
-
(0, verify_1.gravarBaseline)(carregado, threadId, undefined, { canal: opcoes.canal ?? (0, conducao_1.canalDoProcesso)(), correlacao: opcoes.correlacao ?? null, ...(identidade ? { identidade } : {})
|
|
631
|
+
(0, verify_1.gravarBaseline)(carregado, threadId, undefined, { canal: opcoes.canal ?? (0, conducao_1.canalDoProcesso)(), correlacao: opcoes.correlacao ?? null, ...(identidade ? { identidade } : {}),
|
|
632
|
+
filaPesada: { esperarMs: opcoes.esperarMs, ...opcoes.filaPesada } }, 'phase.run');
|
|
584
633
|
}
|
|
585
634
|
catch (e) {
|
|
586
635
|
if (!(e instanceof conducao_1.ErroDeConducao))
|
|
@@ -723,6 +772,17 @@ tomadaPrevia) {
|
|
|
723
772
|
verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
|
|
724
773
|
runtime, model, effort, bloqueado: true, motivo: 'runtime.autoconferencia', violacoes, erro: erroDeRuntime };
|
|
725
774
|
}
|
|
775
|
+
// RM-047 (P1): sandbox afrouxado pelo manifesto so despacha com a confirmacao local desta maquina.
|
|
776
|
+
const erroDePostura = (0, postura_local_1.recusaDePostura)(raiz, manifesto, runtime);
|
|
777
|
+
if (erroDePostura) {
|
|
778
|
+
const postura = (0, postura_local_1.posturaAfrouxada)(manifesto) ?? '';
|
|
779
|
+
if (!opcoes.dryRun)
|
|
780
|
+
(0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'policy.violation',
|
|
781
|
+
modo: thread.modo, detalhe: erroDePostura, correcao: (0, postura_local_1.comandoDeConfirmacao)(postura), fase, slug });
|
|
782
|
+
return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
|
|
783
|
+
verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
|
|
784
|
+
runtime, model, effort, bloqueado: true, motivo: 'policy.violation', violacoes, erro: erroDePostura };
|
|
785
|
+
}
|
|
726
786
|
const erroDeEstado = estadoParaDespacho(raiz, thread, opcoes.dryRun);
|
|
727
787
|
if (erroDeEstado) {
|
|
728
788
|
(0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'tree.blocked',
|
|
@@ -819,7 +879,17 @@ tomadaPrevia) {
|
|
|
819
879
|
return pendente;
|
|
820
880
|
}
|
|
821
881
|
}
|
|
822
|
-
const cwd =
|
|
882
|
+
const cwd = (0, procedencia_1.diretorioDaThread)(raiz, thread);
|
|
883
|
+
// RM-063 (F3): o prompt vai ao disco e ao ledger, com o sha256, ANTES do contexto do runtime e do adaptador. No
|
|
884
|
+
// incidente de 12/10/2026 a fase morreu no despacho e o `ork retry run` saiu com "nao ha despacho falho registrado
|
|
885
|
+
// em GO com prompt gravado"; daqui em diante, toda tentativa deixa o prompt que o retry redespacha sem pedir o texto.
|
|
886
|
+
(0, util_1.gravar)(promptPath, prompt);
|
|
887
|
+
const promptNoLedger = { promptPath: path.relative(raiz, promptPath), promptSha256: sha };
|
|
888
|
+
if (!opcoes.dryRun) {
|
|
889
|
+
(0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.promptGravado, { fase, slug, modo: thread.modo, runtime, model, effort, cwd,
|
|
890
|
+
...promptNoLedger, origem: 'phase.run', canal, ...(opcoes.correlacao ? { correlacao: opcoes.correlacao } : {}), identidade });
|
|
891
|
+
}
|
|
892
|
+
const correcaoDoRetry = `ork retry run ${thread.id} redespacha o mesmo prompt (sha256 ${sha.slice(0, 12)})`;
|
|
823
893
|
let contextoRuntime;
|
|
824
894
|
try {
|
|
825
895
|
contextoRuntime = (0, runtime_context_1.contextoDoProjeto)(raiz, runtime, cwd, thread.id);
|
|
@@ -827,14 +897,13 @@ tomadaPrevia) {
|
|
|
827
897
|
catch (e) {
|
|
828
898
|
const erro = `runtime.unavailable: ${e.message}`;
|
|
829
899
|
(0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable',
|
|
830
|
-
modo: thread.modo, detalhe: erro, fase, slug });
|
|
900
|
+
modo: thread.modo, detalhe: erro, fase, slug, ...(opcoes.dryRun ? {} : { ...promptNoLedger, correcao: correcaoDoRetry }) });
|
|
831
901
|
return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
|
|
832
902
|
verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
|
|
833
903
|
runtime, model, effort, bloqueado: true, motivo: 'runtime.unavailable', violacoes, erro };
|
|
834
904
|
}
|
|
835
905
|
if (contextoRuntime)
|
|
836
906
|
contextoRuntime.identidade = identidade;
|
|
837
|
-
(0, util_1.gravar)(promptPath, prompt);
|
|
838
907
|
// I-33 (D2, D4, D7): o perfil sai do store com o login conferido. Sem perfil disponivel, o
|
|
839
908
|
// despacho nao sai pela conta errada: o prompt ja gravado fica registrado para a rotacao do
|
|
840
909
|
// retry (outro runtime da ordem de fallback, ou a fila), com o motivo tipado.
|
|
@@ -895,7 +964,7 @@ tomadaPrevia) {
|
|
|
895
964
|
: undefined;
|
|
896
965
|
// I-33 (N1): lido antes de a sessao existir; depois dela, um commit rapido ja estaria no HEAD.
|
|
897
966
|
const headNoDespacho = fase === 'GO' && runtime === 'codex' && !opcoes.dryRun ? (0, session_watcher_claude_1.headDaWorktree)(cwd) : undefined;
|
|
898
|
-
const
|
|
967
|
+
const pedidoAoRuntime = {
|
|
899
968
|
prompt,
|
|
900
969
|
nome: slug,
|
|
901
970
|
cwd,
|
|
@@ -916,7 +985,7 @@ tomadaPrevia) {
|
|
|
916
985
|
...(limites ? { duracaoMaximaMs: limites.duracaoMs } : {}),
|
|
917
986
|
// I-36 (D4): a sessao filha herda a identidade do despacho e o canal; e assim que ela reentra.
|
|
918
987
|
ambienteExtra: (0, conducao_1.ambienteDaConducao)(identidade.dispatchId, thread.id, canal),
|
|
919
|
-
}
|
|
988
|
+
};
|
|
920
989
|
const ctx = {
|
|
921
990
|
identidade,
|
|
922
991
|
canal,
|
|
@@ -937,6 +1006,22 @@ tomadaPrevia) {
|
|
|
937
1006
|
...(perfil ? { perfil } : {}),
|
|
938
1007
|
...(headNoDespacho !== undefined ? { headNoDespacho } : {}),
|
|
939
1008
|
};
|
|
1009
|
+
let resultado;
|
|
1010
|
+
try {
|
|
1011
|
+
resultado = rt.despachar(pedidoAoRuntime);
|
|
1012
|
+
}
|
|
1013
|
+
catch (e) {
|
|
1014
|
+
// RM-063 (F3): o adaptador que lanca (o daemon do runtime fora do ar) deixa no ledger a falha do despacho com o
|
|
1015
|
+
// prompt e o sha256, e o gate tipado que o `ork retry run` le; o erro segue para quem chamou, como antes.
|
|
1016
|
+
if (!opcoes.dryRun) {
|
|
1017
|
+
const erro = `runtime.unavailable: o runtime adapter lancou no despacho: ${e.message}`;
|
|
1018
|
+
(0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, { ...dadosDoDespacho(ctx, []), erro });
|
|
1019
|
+
(0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
|
|
1020
|
+
detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger,
|
|
1021
|
+
evidencia: 'excecao real do runtime adapter no despacho, nao relato do agente' });
|
|
1022
|
+
}
|
|
1023
|
+
throw e;
|
|
1024
|
+
}
|
|
940
1025
|
const comum = dadosDoDespacho(ctx, resultado.comando);
|
|
941
1026
|
if (opcoes.dryRun) {
|
|
942
1027
|
return {
|
|
@@ -961,11 +1046,15 @@ tomadaPrevia) {
|
|
|
961
1046
|
}
|
|
962
1047
|
if (!resultado.ok || !resultado.sessionId) {
|
|
963
1048
|
const erro = resultado.erro ?? 'sem sessionId na saida do runtime';
|
|
1049
|
+
// RM-063 (F3, GO-FIX): o `claude --bg` que sai com erro, ou estoura o prazo, depois de dizer o id deixa a sessao
|
|
1050
|
+
// aberta; o id vai a falha e ao gate, para o retry conferir que ela morreu antes de redespachar.
|
|
1051
|
+
const daSessao = resultado.sessionId ? { sessionId: resultado.sessionId } : {};
|
|
964
1052
|
(0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, {
|
|
965
1053
|
...comum,
|
|
966
1054
|
controlador: resultado.controlador,
|
|
967
1055
|
erro,
|
|
968
1056
|
stderr: resultado.stderr.slice(0, 500),
|
|
1057
|
+
...daSessao,
|
|
969
1058
|
});
|
|
970
1059
|
// I-33 (D1, D5): a CONTA recusou o despacho. Nada rodou, entao nada foi produzido: o perfil
|
|
971
1060
|
// sai do rodizio e o gate tipado fica para a rotacao do retry, que redespacha o mesmo prompt.
|
|
@@ -1039,6 +1128,20 @@ tomadaPrevia) {
|
|
|
1039
1128
|
erro,
|
|
1040
1129
|
};
|
|
1041
1130
|
}
|
|
1131
|
+
// RM-055: o que so o dono resolve no terminal vira a pausa dele, com o comando exato e o que o ork
|
|
1132
|
+
// faz depois. O prompt ja esta gravado com o sha256 acima, e e ele que o retry re-despacha.
|
|
1133
|
+
const impedimento = (0, impedimento_1.registrarImpedimentoDoDono)(dir, thread, { fase, slug, runtime, cwd, origem: 'phase.run',
|
|
1134
|
+
promptPath, promptSha256: sha, perfil, saida: `${resultado.stderr}\n${erro}` });
|
|
1135
|
+
if (impedimento) {
|
|
1136
|
+
return { thread, slug, promptPath, promptSha256: sha, comando: resultado.comando, controlador: resultado.controlador,
|
|
1137
|
+
sessionId: null, verificada: false, pausaAoFim, dryRun: false, runtime, model, effort, bloqueado: false,
|
|
1138
|
+
motivo: impedimento.motivo, violacoes, naFila: null, erro: `${impedimento.motivo}: ${impedimento.trecho}` };
|
|
1139
|
+
}
|
|
1140
|
+
// RM-063 (F3): a falha seca do adaptador vira gate tipado, com o prompt e o sha256. Antes so o `phase_dispatch_failed`
|
|
1141
|
+
// a registrava: o `ork retry plan` nao a via e a fase ficava parada sem ninguem saber.
|
|
1142
|
+
(0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
|
|
1143
|
+
detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger, ...daSessao,
|
|
1144
|
+
evidencia: 'saida real do runtime adapter no despacho, nao relato do agente' });
|
|
1042
1145
|
return {
|
|
1043
1146
|
thread,
|
|
1044
1147
|
slug,
|
|
@@ -1091,8 +1194,11 @@ function tabelaDoLedger(raiz, threadId) {
|
|
|
1091
1194
|
// Thread inexistente e erro, nao ledger vazio: o CLI precisa reprovar o id errado.
|
|
1092
1195
|
(0, thread_1.lerThread)(raiz, threadId);
|
|
1093
1196
|
const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, threadId));
|
|
1197
|
+
// RM-061 (F2a): a moldura e os rotulos vem do catalogo; o valor de cada evento (decisao, estado,
|
|
1198
|
+
// erro, detalhe) e dado do ledger e sai como foi gravado.
|
|
1199
|
+
const m = (0, locale_1.msg)().phase;
|
|
1094
1200
|
if (eventos.length === 0) {
|
|
1095
|
-
return
|
|
1201
|
+
return m.ledgerVazio(threadId);
|
|
1096
1202
|
}
|
|
1097
1203
|
const linhas = eventos.map((e) => {
|
|
1098
1204
|
const detalhe = [];
|
|
@@ -1101,86 +1207,88 @@ function tabelaDoLedger(raiz, threadId) {
|
|
|
1101
1207
|
if (e.slug)
|
|
1102
1208
|
detalhe.push(String(e.slug));
|
|
1103
1209
|
if (e.sessionId)
|
|
1104
|
-
detalhe.push(
|
|
1210
|
+
detalhe.push(m.sessao(String(e.sessionId).slice(0, 8)));
|
|
1105
1211
|
if (e.decisao)
|
|
1106
1212
|
detalhe.push(String(e.decisao));
|
|
1107
1213
|
if (e.previstaSobre)
|
|
1108
|
-
detalhe.push(
|
|
1214
|
+
detalhe.push(m.pausaSobre((0, locale_1.msg)().thread.pausaSobre(String(e.previstaSobre))));
|
|
1109
1215
|
if (e.encontrada !== undefined)
|
|
1110
|
-
detalhe.push(
|
|
1216
|
+
detalhe.push(m.noRuntime(!!e.encontrada));
|
|
1111
1217
|
// Fato verificavel do despacho: o par modelo/esforco real, lido do proprio evento.
|
|
1112
1218
|
if (e.model)
|
|
1113
|
-
detalhe.push(
|
|
1219
|
+
detalhe.push(m.modelo(String(e.model), String(e.effort ?? '-')));
|
|
1114
1220
|
// Eventos do bloco B1: motivo tipado, veredito e as provas do ship.
|
|
1115
1221
|
if (e.motivo)
|
|
1116
|
-
detalhe.push(
|
|
1222
|
+
detalhe.push(m.motivo(String(e.motivo)));
|
|
1117
1223
|
if (e.claim)
|
|
1118
1224
|
detalhe.push(`claim ${String(e.claim)}`);
|
|
1119
1225
|
if (e.veredito)
|
|
1120
|
-
detalhe.push(
|
|
1226
|
+
detalhe.push(m.veredito(String(e.veredito)));
|
|
1121
1227
|
if (e.fonte && e.ocupacao !== undefined) {
|
|
1122
|
-
detalhe.push(
|
|
1228
|
+
detalhe.push(m.ocupacao(e.ocupacao === null ? null : String(e.ocupacao), String(e.fonte)));
|
|
1123
1229
|
}
|
|
1124
1230
|
if (e.slugSugerido)
|
|
1125
|
-
detalhe.push(
|
|
1231
|
+
detalhe.push(m.proximoSlug(String(e.slugSugerido)));
|
|
1126
1232
|
if (e.lease)
|
|
1127
1233
|
detalhe.push(`lease ${String(e.lease)}`);
|
|
1128
1234
|
// Eventos do bloco B3: acao de retry, playbook da retomada e rodada de GO-FIX.
|
|
1129
1235
|
if (e.acao)
|
|
1130
|
-
detalhe.push(
|
|
1236
|
+
detalhe.push(m.acao(String(e.acao)));
|
|
1131
1237
|
if (e.playbook)
|
|
1132
1238
|
detalhe.push(`playbook ${String(e.playbook)}`);
|
|
1133
|
-
|
|
1134
|
-
|
|
1239
|
+
// Ensaio de 03/10/2026 (RM-049): na decisao autonoma o pedido e o objeto `ork.hitl/v2`, e a tabela
|
|
1240
|
+
// mostrava "pedido [object Object]"; do objeto sai o id curto.
|
|
1241
|
+
if (typeof e.pedido === 'string' && e.pedido !== '')
|
|
1242
|
+
detalhe.push(m.pedido(e.pedido));
|
|
1243
|
+
else if (e.pedido && typeof e.pedido === 'object' && typeof e.pedido.id === 'string') {
|
|
1244
|
+
detalhe.push(m.pedido(e.pedido.id.slice(0, 8)));
|
|
1245
|
+
}
|
|
1135
1246
|
if (e.rodada !== undefined)
|
|
1136
|
-
detalhe.push(
|
|
1247
|
+
detalhe.push(m.rodada(String(e.rodada)));
|
|
1137
1248
|
if (e.cobertura)
|
|
1138
|
-
detalhe.push(
|
|
1249
|
+
detalhe.push(m.cobertura(String(e.cobertura)));
|
|
1139
1250
|
if (e.liberaEm)
|
|
1140
|
-
detalhe.push(
|
|
1251
|
+
detalhe.push(m.liberaEm((0, horario_1.formatarDataHora)(String(e.liberaEm))));
|
|
1141
1252
|
if (e.tentativa !== undefined && e.limite !== undefined) {
|
|
1142
|
-
detalhe.push(
|
|
1253
|
+
detalhe.push(m.tentativa(String(e.tentativa), String(e.limite)));
|
|
1143
1254
|
}
|
|
1144
1255
|
if (e.mergeSha)
|
|
1145
1256
|
detalhe.push(`merge ${String(e.mergeSha).slice(0, 8)}`);
|
|
1146
1257
|
if (e.shaRemoto)
|
|
1147
|
-
detalhe.push(
|
|
1258
|
+
detalhe.push(m.remoto(String(e.shaRemoto).slice(0, 8)));
|
|
1148
1259
|
if (e.pushVerificado !== undefined)
|
|
1149
|
-
detalhe.push(
|
|
1260
|
+
detalhe.push(m.pushProvado(!!e.pushVerificado));
|
|
1150
1261
|
if (e.autorizadoPor)
|
|
1151
|
-
detalhe.push(
|
|
1262
|
+
detalhe.push(m.autorizadoPor(String(e.autorizadoPor)));
|
|
1152
1263
|
if (e.sobre)
|
|
1153
|
-
detalhe.push(
|
|
1264
|
+
detalhe.push(m.sobre(String(e.sobre)));
|
|
1154
1265
|
if (e.estado)
|
|
1155
1266
|
detalhe.push(String(e.estado));
|
|
1156
1267
|
if (typeof e.de === 'string' && typeof e.para === 'string') {
|
|
1157
1268
|
detalhe.push(`${e.de} -> ${e.para}`);
|
|
1158
1269
|
}
|
|
1159
1270
|
if (e.dryRun === true)
|
|
1160
|
-
detalhe.push(
|
|
1271
|
+
detalhe.push(m.ensaio);
|
|
1161
1272
|
if (e.tipo === ledger_1.TIPOS_DE_EVENTO.worktreeCriada && e.dir) {
|
|
1162
|
-
detalhe.push(
|
|
1273
|
+
detalhe.push(m.worktreeEm(String(e.branch), String(e.dir)));
|
|
1163
1274
|
}
|
|
1164
1275
|
if (e.inline !== undefined) {
|
|
1165
|
-
detalhe.push(
|
|
1276
|
+
detalhe.push(m.triagem(String(e.inline), String(e.pointers), String(e.summaries)));
|
|
1166
1277
|
}
|
|
1167
1278
|
if (e.location)
|
|
1168
|
-
detalhe.push(
|
|
1279
|
+
detalhe.push(m.ponteiro(String(e.location)));
|
|
1169
1280
|
if (e.erro)
|
|
1170
|
-
detalhe.push(
|
|
1281
|
+
detalhe.push(m.erro(String(e.erro)));
|
|
1171
1282
|
if (e.detalhe && !e.decisao)
|
|
1172
1283
|
detalhe.push((0, horario_1.localizarTexto)(String(e.detalhe)).slice(0, 90));
|
|
1173
1284
|
if (e.modo && !e.fase)
|
|
1174
|
-
detalhe.push(
|
|
1285
|
+
detalhe.push(m.modo(String(e.modo)));
|
|
1175
1286
|
return [(0, horario_1.formatarDataHora)(e.ts, { segundos: true }), e.tipo, detalhe.join(' | ')];
|
|
1176
1287
|
});
|
|
1177
|
-
return `${(0, util_1.tabela)([
|
|
1288
|
+
return `${(0, util_1.tabela)([...m.colunas], linhas)}\n${(0, horario_1.legendaDoFuso)()}`;
|
|
1178
1289
|
}
|
|
1179
1290
|
/** Slug legivel por humano de uma sessao (usado nas mensagens do CLI). */
|
|
1180
1291
|
function descreverSlug(slug) {
|
|
1181
1292
|
const p = (0, slug_1.parseSlug)(slug);
|
|
1182
|
-
|
|
1183
|
-
return slug;
|
|
1184
|
-
const rot = p.rotacao ? `, rotacao ${p.rotacao}` : '';
|
|
1185
|
-
return `produto "${p.produto}", assunto "${p.assunto}", fases "${p.fases}"${rot}`;
|
|
1293
|
+
return p ? (0, locale_1.msg)().thread.slug(p.produto, p.assunto, p.fases, p.rotacao) : slug;
|
|
1186
1294
|
}
|
package/dist/policies.js
CHANGED
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* ela volta na lista de desconhecidas, para o `doctor` e o CLI dizerem que ela nao vale.
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.POLICIES_CONHECIDAS = void 0;
|
|
14
|
+
exports.POLICIES_DE_PROVA_LOCAL = exports.POLICIES_CONHECIDAS = void 0;
|
|
15
15
|
exports.procurarSegredos = procurarSegredos;
|
|
16
|
+
exports.policyDeProvaLocal = policyDeProvaLocal;
|
|
16
17
|
exports.policiesDesconhecidas = policiesDesconhecidas;
|
|
17
18
|
exports.avaliarPolicies = avaliarPolicies;
|
|
18
19
|
exports.avisos = avisos;
|
|
@@ -20,6 +21,7 @@ exports.bloqueantes = bloqueantes;
|
|
|
20
21
|
exports.motivoDominante = motivoDominante;
|
|
21
22
|
exports.linhasDeAviso = linhasDeAviso;
|
|
22
23
|
exports.textoDeViolacoes = textoDeViolacoes;
|
|
24
|
+
const locale_1 = require("./locale");
|
|
23
25
|
/**
|
|
24
26
|
* Variaveis que REDIRECIONAM o despacho do `claude` para um provider pago.
|
|
25
27
|
* Mesma lista do `ork doctor`: presenca delas com `subscription-only` e bloqueante.
|
|
@@ -95,7 +97,28 @@ exports.POLICIES_CONHECIDAS = {
|
|
|
95
97
|
quando: ['ship'],
|
|
96
98
|
descricao: 'avisa quando a branch da thread esta atras da base',
|
|
97
99
|
},
|
|
100
|
+
// RM-008 (B8): a licao `claims.failed` ("rode o comando da claim antes de registra-la"). Desligada por
|
|
101
|
+
// padrao; declarada, o `ork claims add` roda o comando uma vez no prazo do verify. So avisa, nunca para.
|
|
102
|
+
claim_sem_prova_local: {
|
|
103
|
+
quando: ['claims.add'],
|
|
104
|
+
descricao: 'avisa quando o comando da claim reprova (ou estoura o prazo do verify) no registro',
|
|
105
|
+
},
|
|
106
|
+
claims_failed: {
|
|
107
|
+
quando: ['claims.add'],
|
|
108
|
+
descricao: 'a mesma conferencia de claim_sem_prova_local, com o nome que o ork licoes propoe',
|
|
109
|
+
},
|
|
98
110
|
};
|
|
111
|
+
/** RM-008 (B8): as policies que conferem a claim no registro (um aviso so, como verify_regression e verify_failed). */
|
|
112
|
+
exports.POLICIES_DE_PROVA_LOCAL = ['claim_sem_prova_local', 'claims_failed'];
|
|
113
|
+
/** A primeira policy de prova local declarada fora de `off`, ou `null` (o `claims add` nao roda nada). */
|
|
114
|
+
function policyDeProvaLocal(manifesto) {
|
|
115
|
+
const declaradas = manifesto.policies ?? {};
|
|
116
|
+
for (const [nome, bruta] of Object.entries(declaradas)) {
|
|
117
|
+
if (exports.POLICIES_DE_PROVA_LOCAL.includes(nome) && severidade(bruta) !== 'off')
|
|
118
|
+
return nome;
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
99
122
|
/**
|
|
100
123
|
* Ensaio da 0.5.0: a thread criada sem `--worktree auto` entrega a base para a base, e a correcao
|
|
101
124
|
* repetia o proprio `ork ship`. A thread que ainda nao passou do GO ganha a branch com
|
|
@@ -122,6 +145,8 @@ function avaliarPolicies(manifesto, ctx) {
|
|
|
122
145
|
const violacoes = [];
|
|
123
146
|
// verify_regression e verify_failed conferem a mesma coisa: um aviso so, com o nome da primeira declarada.
|
|
124
147
|
let baselineJaAvaliada = false;
|
|
148
|
+
// claim_sem_prova_local e claims_failed idem.
|
|
149
|
+
let provaLocalJaAvaliada = false;
|
|
125
150
|
for (const [nome, bruta] of Object.entries(declaradas)) {
|
|
126
151
|
const conhecida = exports.POLICIES_CONHECIDAS[nome];
|
|
127
152
|
if (!conhecida || !conhecida.quando.includes(ctx.gate))
|
|
@@ -224,6 +249,33 @@ function avaliarPolicies(manifesto, ctx) {
|
|
|
224
249
|
}
|
|
225
250
|
continue;
|
|
226
251
|
}
|
|
252
|
+
if (exports.POLICIES_DE_PROVA_LOCAL.includes(nome)) {
|
|
253
|
+
if (provaLocalJaAvaliada)
|
|
254
|
+
continue;
|
|
255
|
+
provaLocalJaAvaliada = true;
|
|
256
|
+
const r = ctx.provaLocalReprovada;
|
|
257
|
+
if (r) {
|
|
258
|
+
const id = ctx.threadId ?? '<thread>';
|
|
259
|
+
violacoes.push({
|
|
260
|
+
policy: nome,
|
|
261
|
+
// O registro de claim nunca para: `block` declarado avisa como `warn`.
|
|
262
|
+
severidade: 'warn',
|
|
263
|
+
motivo: r.estourou ? 'verify.timeout' : 'claims.failed',
|
|
264
|
+
detalhe: r.semDiretorio
|
|
265
|
+
? `a worktree da thread (${r.semDiretorio}) nao existe; o comando da claim ${r.claim} nao rodou e a claim entrou sem prova local`
|
|
266
|
+
: r.estourou
|
|
267
|
+
? `o comando da claim ${r.claim} estourou o prazo do verify (${Math.round(r.prazoMs / 1000)} s) no registro; a claim entrou sem prova local`
|
|
268
|
+
: `o comando da claim ${r.claim} saiu ${r.code} no registro; a claim entrou sem prova local e reprova no verify`,
|
|
269
|
+
correcao: r.semDiretorio
|
|
270
|
+
? `recrie a worktree da thread (ou feche a thread que perdeu a worktree); depois, ork verify ${id}`
|
|
271
|
+
: r.estourou
|
|
272
|
+
? `divida o comando ou suba verify.timeout_ms; depois, ork verify ${id}`
|
|
273
|
+
: `corrija o produto ou o comando e anexe o certo com ork claims verificar ${id} ${r.claim} --comando "<comando>"; ` +
|
|
274
|
+
`se a alegacao nao vale, ork claims retirar ${id} ${r.claim} --motivo "<motivo>"`,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
227
279
|
if (nome === 'tree_blocked') {
|
|
228
280
|
if (ctx.branchAtrasDaBase === true) {
|
|
229
281
|
violacoes.push({
|
|
@@ -262,10 +314,9 @@ function motivoDominante(violacoes) {
|
|
|
262
314
|
}
|
|
263
315
|
/** RM-008 (fatia 3): as linhas de aviso (policies em warn) para a saida do CLI. Nada quando nao ha aviso. */
|
|
264
316
|
function linhasDeAviso(violacoes, recuo = ' ') {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
]);
|
|
317
|
+
// RM-061 (F2a): a moldura segue o locale do comando; detalhe e correcao sao dado da policy avaliada.
|
|
318
|
+
const m = (0, locale_1.msg)().phase;
|
|
319
|
+
return avisos(violacoes).flatMap((v) => [m.avisoDaPolicy(recuo, v.policy, v.detalhe), m.avisoCorrecao(recuo, v.correcao)]);
|
|
269
320
|
}
|
|
270
321
|
/** Texto das violacoes para a saida do CLI. */
|
|
271
322
|
function textoDeViolacoes(violacoes) {
|
package/dist/portfolio.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ID_DE_ENTIDADE = void 0;
|
|
36
37
|
exports.readPortfolio = readPortfolio;
|
|
37
38
|
exports.findEntity = findEntity;
|
|
38
39
|
exports.createProduct = createProduct;
|
|
@@ -44,10 +45,12 @@ exports.assertCycleScope = assertCycleScope;
|
|
|
44
45
|
/** Catálogo determinístico de produto -> projeto -> iniciativa. */
|
|
45
46
|
const fs = __importStar(require("node:fs"));
|
|
46
47
|
const project_state_1 = require("./project-state");
|
|
48
|
+
const estado_thread_1 = require("./estado-thread");
|
|
47
49
|
const company_brain_journal_1 = require("./company-brain-journal");
|
|
48
50
|
const util_1 = require("./util");
|
|
49
51
|
const creation_operation_store_1 = require("./creation-operation-store");
|
|
50
|
-
|
|
52
|
+
/** Id de produto, projeto ou iniciativa: o mesmo que o Brain recebe e o conhecimento cita (RM-026 K7, D3). */
|
|
53
|
+
exports.ID_DE_ENTIDADE = /^(prod|proj|init)-[a-z0-9][a-z0-9-]{2,47}$/;
|
|
51
54
|
const PREFIX = { product: 'prod-', project: 'proj-', initiative: 'init-' };
|
|
52
55
|
const statuses = ['idea', 'planned', 'ready', 'in_progress', 'validating', 'delivered', 'blocked', 'cancelled'];
|
|
53
56
|
const unique = (values = []) => [...new Set(values.map((v) => v.trim()).filter(Boolean))];
|
|
@@ -65,10 +68,12 @@ function readPortfolio(root) {
|
|
|
65
68
|
}
|
|
66
69
|
function persist(root, value) { value.updatedAt = (0, util_1.agora)(); (0, company_brain_journal_1.replaceWithJournal)(file(root), value); return value; }
|
|
67
70
|
function mutatePortfolio(root, run) {
|
|
68
|
-
|
|
71
|
+
// RM-036 (D5): o portfolio.json e canonico, e o lock de espera tambem: chamado da raiz ou de uma worktree,
|
|
72
|
+
// quem chega depois espera a vez, em vez de recusar com brain.journal.busy no lock interno.
|
|
73
|
+
return (0, creation_operation_store_1.withCreationLock)((0, estado_thread_1.raizDoEstado)(root), 'portfolio', () => (0, company_brain_journal_1.portfolioMutation)(file(root), run));
|
|
69
74
|
}
|
|
70
75
|
function validateBase(kind, input) {
|
|
71
|
-
if (!
|
|
76
|
+
if (!exports.ID_DE_ENTIDADE.test(input.id) || !input.id.startsWith(PREFIX[kind]))
|
|
72
77
|
throw new Error(`${kind} exige id ${PREFIX[kind]}...`);
|
|
73
78
|
if (!input.title.trim() || input.title.length > 160)
|
|
74
79
|
throw new Error('título deve ter entre 1 e 160 caracteres');
|