@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
package/dist/index.js
CHANGED
|
@@ -93,6 +93,7 @@ const orquestracao_1 = require("./orquestracao");
|
|
|
93
93
|
const divida_1 = require("./divida");
|
|
94
94
|
const ciclos_1 = require("./ciclos");
|
|
95
95
|
const claims_1 = require("./claims");
|
|
96
|
+
const claims_conferir_1 = require("./claims-conferir");
|
|
96
97
|
const catalogo_1 = require("./catalogo");
|
|
97
98
|
const doctor_1 = require("./doctor");
|
|
98
99
|
const preflight_1 = require("./preflight");
|
|
@@ -118,7 +119,7 @@ const horario_1 = require("./horario");
|
|
|
118
119
|
const onboarding_1 = require("./onboarding");
|
|
119
120
|
const experiencia_1 = require("./experiencia");
|
|
120
121
|
const hosts_2 = require("./hosts");
|
|
121
|
-
const
|
|
122
|
+
const locale_1 = require("./locale");
|
|
122
123
|
const memoria_1 = require("./memoria");
|
|
123
124
|
const orkmind_1 = require("./orkmind");
|
|
124
125
|
const indice_vetorial_1 = require("./indice-vetorial");
|
|
@@ -137,6 +138,7 @@ const runtime_profiles_1 = require("./runtime-profiles");
|
|
|
137
138
|
const claude_bg_1 = require("./adapters/claude-bg");
|
|
138
139
|
const codex_1 = require("./adapters/codex");
|
|
139
140
|
const conducao_1 = require("./conducao");
|
|
141
|
+
const conducao_sentinela_1 = require("./conducao-sentinela");
|
|
140
142
|
const phase_1 = require("./phase");
|
|
141
143
|
const prompts_1 = require("./prompts");
|
|
142
144
|
const sessoes_2 = require("./sessoes");
|
|
@@ -150,6 +152,7 @@ const fabrica_estado_1 = require("./fabrica-estado");
|
|
|
150
152
|
const branch_de_estado_1 = require("./branch-de-estado");
|
|
151
153
|
const network_roadmap_1 = require("./network-roadmap");
|
|
152
154
|
const fabrica_publicar_1 = require("./fabrica-publicar");
|
|
155
|
+
const fabrica_batida_1 = require("./fabrica-batida");
|
|
153
156
|
const maquina_1 = require("./maquina");
|
|
154
157
|
const rede_1 = require("./rede");
|
|
155
158
|
const rede_adesao_1 = require("./rede-adesao");
|
|
@@ -160,12 +163,16 @@ const ledger_1 = require("./ledger");
|
|
|
160
163
|
const tokens_1 = require("./tokens");
|
|
161
164
|
const types_1 = require("./types");
|
|
162
165
|
const verify_1 = require("./verify");
|
|
166
|
+
const fila_pesada_1 = require("./fila-pesada");
|
|
163
167
|
const worktree_1 = require("./worktree");
|
|
164
168
|
const claim_lint_1 = require("./claim-lint");
|
|
165
169
|
const licoes_1 = require("./licoes");
|
|
166
170
|
const demo_1 = require("./demo");
|
|
167
171
|
const entrega_pr_1 = require("./entrega-pr");
|
|
172
|
+
const ship_publicar_1 = require("./ship-publicar");
|
|
168
173
|
const projeto_alvo_1 = require("./projeto-alvo");
|
|
174
|
+
const worktree_local_1 = require("./worktree-local");
|
|
175
|
+
const postura_local_1 = require("./postura-local");
|
|
169
176
|
/** A versao publicada em `@orkastery/cli`, lida do package.json (`versao.ts`). */
|
|
170
177
|
// Antes de qualquer arquivo ou despacho: sem escrita de grupo nem de outros, que o sensor recusaria.
|
|
171
178
|
(0, preflight_1.endurecerUmask)();
|
|
@@ -201,13 +208,22 @@ function parseArgs(argv) {
|
|
|
201
208
|
function texto(v) {
|
|
202
209
|
return typeof v === 'string' ? v : undefined;
|
|
203
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* RM-058 N2 (A1 da rodada 2 do CHECK): a fila de recursos pesados de um comando que verifica por dentro, pelo `--esperar`
|
|
213
|
+
* dele, com o aviso no stderr e o comando que a recusa sugere. Sem `--esperar`, vale o padrão curto do verify.
|
|
214
|
+
*/
|
|
215
|
+
function filaPesadaDoCli(args, operacao, comandoDeEsperar) {
|
|
216
|
+
const m = (0, locale_1.msg)().verify;
|
|
217
|
+
return { esperarMs: conducaoDoCli(args).esperarMs, comandoDeEsperar,
|
|
218
|
+
aoEsperar: (ocupantes) => console.error(m.filaPesadaEsperando(operacao, ocupantes.map((o) => m.filaPesadaOcupante(o.operacao, o.thread, (0, horario_1.formatarDataHora)(o.desde))).join('; '))) };
|
|
219
|
+
}
|
|
204
220
|
/**
|
|
205
221
|
* I-36 (D2, D6): o que o CLI declara sobre a conducao. `--canal` (sem ele, o que a borda exporta),
|
|
206
222
|
* `--correlacao` (conversa ou mensagem de origem) e `--esperar [minutos]` (sem valor, 30).
|
|
207
223
|
*/
|
|
208
224
|
function conducaoDoCli(args) {
|
|
209
225
|
if (args.opcoes.canal === true)
|
|
210
|
-
throw new Error(
|
|
226
|
+
throw new Error((0, locale_1.msg)().phase.canalUso);
|
|
211
227
|
const bruto = args.opcoes.esperar;
|
|
212
228
|
let esperarMs;
|
|
213
229
|
if (bruto === true)
|
|
@@ -215,368 +231,38 @@ function conducaoDoCli(args) {
|
|
|
215
231
|
else if (typeof bruto === 'string') {
|
|
216
232
|
const minutos = Number(bruto);
|
|
217
233
|
if (!Number.isFinite(minutos) || minutos <= 0 || minutos > 24 * 60)
|
|
218
|
-
throw new Error(
|
|
234
|
+
throw new Error((0, locale_1.msg)().phase.esperarUso);
|
|
219
235
|
esperarMs = Math.round(minutos * 60_000);
|
|
220
236
|
}
|
|
221
237
|
return { canal: (0, conducao_1.canalDoProcesso)(texto(args.opcoes.canal)), correlacao: texto(args.opcoes.correlacao) ?? null, esperarMs };
|
|
222
238
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
accounts list [--json] Perfis de conta por runtime, sem segredo (I-33)
|
|
251
|
-
accounts add <id> --runtime R --dir D Cria o perfil e roda o login do proprio CLI com o env
|
|
252
|
-
[--sem-login] do perfil (nunca copia credencial)
|
|
253
|
-
accounts remove <id> Desativa o perfil (diretorio e login ficam onde estao)
|
|
254
|
-
accounts check [<id>] Confere o login de cada perfil e marca o store
|
|
255
|
-
accounts esgotamentos [--desde 7d] [--json]
|
|
256
|
-
Despachos numa conta que outro projeto desta maquina viu esgotada
|
|
257
|
-
(RM-040), so leitura: conta opaca, perfil pelo id, sem diretorio
|
|
258
|
-
setup [<modo>] --reset Volta o modo (ou tudo) ao default
|
|
259
|
-
setup versionar Leva o setup que vale para orkastery.setup.json: por PR, vale em
|
|
260
|
-
todas as maquinas e passa a ser o arquivo editado (I-52)
|
|
261
|
-
|
|
262
|
-
thread new <nome> --modo <MODO> Cria a thread, o slug de 3 partes e o ledger
|
|
263
|
-
[--exige-runtime-diferente] o CHECK precisa de runtime que o GO nao usou
|
|
264
|
-
[--done "<criterio> :: <comando>"] criterio de pronto EXECUTAVEL (use ;; para varios)
|
|
265
|
-
[--slug S] [--assunto A] [--worktree auto|DIR] [--dry-run]
|
|
266
|
-
[--sem-worktree] cria sem worktree (na branch base, o ship barra a entrega com
|
|
267
|
-
push_direto_na_base: block, o padrão do ork init); com
|
|
268
|
-
worktree.por_thread: true, a worktree nasce sem flag
|
|
269
|
-
[--roadmap RM-NNN] reserva o item do roadmap antes de criar (I-47)
|
|
270
|
-
thread list [--todas] [--json] Threads NAO fechadas do projeto (--todas inclui as fechadas)
|
|
271
|
-
thread close <id> --motivo orfa|engano|superada --por Q --justificativa J
|
|
272
|
-
thread entrega <id> --arquivo A --sha256 H --por Q
|
|
273
|
-
thread status <thread-id> [--json] Estado da thread, cruzado com o runtime
|
|
274
|
-
|
|
275
|
-
portfolio inspect <id> --json Entidade, origem e ciclos com lacunas explícitas
|
|
276
|
-
creation start --input-file F --json Criação durável com identidade do processo local
|
|
277
|
-
creation show|list|events [id] --json Consulta journal e recuperação
|
|
278
|
-
creation resume|compensate <id> --expected-version N --json
|
|
279
|
-
portfolio create <product|project|initiative> <id> --title T [--parent ID]
|
|
280
|
-
portfolio list [product|project|initiative] [--parent ID] [--json]
|
|
281
|
-
portfolio show <id> [--json] Catálogo prod -> proj -> init
|
|
282
|
-
[--constraints A;B] [--outcomes A;B] [--threads N]
|
|
283
|
-
[--execution-runtime R] [--validation-runtimes R1,R2]
|
|
284
|
-
objective ... Aposentado na I-43: as duas vigas viraram
|
|
285
|
-
--exige-runtime-diferente e --done de thread
|
|
286
|
-
|
|
287
|
-
phase run <thread-id> <FASE> --prompt "<texto>"
|
|
288
|
-
[--runtime R] [--model M] Despacha a fase como background agent
|
|
289
|
-
[--effort E] [--dry-run] (runtime: CLI > setup do bloco > manifesto;
|
|
290
|
-
so --model assume --effort high; o trio
|
|
291
|
-
efetivo vai ao ledger como fato verificavel)
|
|
292
|
-
[--canal C] [--correlacao ID] Canal de origem (sem ele, o que o host declara)
|
|
293
|
-
[--esperar [min]] Com a thread ja conduzida, espera a vez (sem: recusa na hora)
|
|
294
|
-
[--perfil ID] Conta do despacho (ork accounts list); inexistente, de outro
|
|
295
|
-
runtime, esgotado ou sem login recusa com motivo tipado
|
|
296
|
-
phase list <thread-id> Historico do ledger da thread
|
|
297
|
-
(mostra o modelo/esforco reais de cada fase)
|
|
298
|
-
ledger stats --desde 7d [--ate ISO] Telemetria economica do ledger (intervalo [desde,ate))
|
|
299
|
-
[--thread T] [--modo M] [--runtime R] [--json]
|
|
300
|
-
ledger estimate <thread-id> --sem-ia H --ia-sem-ork H --por Q --metodo M --premissas P
|
|
301
|
-
[--incerteza I] Registra estimativas explicitas da fase PLAN
|
|
302
|
-
|
|
303
|
-
sessions [--all] [--global] [--json] Inventário Claude e Codex da conta do processo e de cada perfil
|
|
304
|
-
[--exigir-limpo] Sai != 0 com fonte inválida ou sessão sem thread
|
|
305
|
-
sessions adopt <id> [--json] Adota identidade real sem executar prompt
|
|
306
|
-
sessions event --tipo T --sessao ID Ingere JSON limitado no stdin; observa sem aprovar gates
|
|
307
|
-
sessions watch --thread T [--sessao ID] Observa somente a sessão selecionada; --once faz uma varredura
|
|
308
|
-
sessions limpar-fantasmas [--dry-run] Solta do ork (sessao_morta no ledger) a sessao sem pid e sem processo;
|
|
309
|
-
[--json] nunca toca no runtime (RM-056)
|
|
310
|
-
sessions logs <sessao> [--linhas N] Logs de uma sessao
|
|
311
|
-
sessions supersede <thread> <UUID> --fase F --runtime R Confirma encerramento de sessão superada
|
|
312
|
-
sessions request <thread> <UUID> --fase F --runtime R --pergunta P Abre pedido vinculado ao prompt nativo
|
|
313
|
-
sessions answer <thread> <pedido> --stdin --origem telegram --canal C --por ID --mensagem REF [--conta ID] Confirma entrega autenticada
|
|
314
|
-
sessions reconcile <thread> <pedido> Fecha envio pendente so com thread e pedido; consulta recibo, nunca reenvia
|
|
315
|
-
sessions stop <sessao> Para uma sessao
|
|
316
|
-
sessions attach <sessao> Imprime o comando de attach (precisa de TTY)
|
|
317
|
-
pulse [--json] [--registrar] Fila unificada de atenção humana e retry de órfãs
|
|
318
|
-
pulse responder --resposta-stdin --origem telegram --canal C --por ID --mensagem REF [--conta ID]
|
|
319
|
-
Recebe o que o dono digitou no canal do resumo (P4EJ a, 1a 2c)
|
|
320
|
-
pulse cadencia [<tag>] [--por P] [--json] Mostra ou troca a cadencia do resumo: OrkPulseOn, OrkPulseOn-15m,
|
|
321
|
-
-30m, -60m ou OrkPulseOff; pergunta nova sai na hora (I-50)
|
|
322
|
-
sessions hitl [--json] [--so-paradas] Radar de sessoes que exigem acao humana AGORA:
|
|
323
|
-
[--atencao N] [--sem-logs] classifica o estado de cada sessao do runtime,
|
|
324
|
-
[--so-da-raiz] [--exigir-limpo] le a pergunta que a sessao trava e diz o que
|
|
325
|
-
destrava (pega HITL de sessao SEM thread)
|
|
326
|
-
|
|
327
|
-
claims add <thread-id> <arquivo> --claim "<alegacao>" [--verificar "<comando>"] [--fase F]
|
|
328
|
-
Registra alegacao verificavel da thread
|
|
329
|
-
claims list <thread-id> Claims da thread e o estado de cada uma
|
|
330
|
-
decisao registrar <thread-id> --decidido D --porque P --como-mudar C --custo-agora A --custo-depois B
|
|
331
|
-
--criterio manifesto:CHAVE|ledger:REF|medicao:COMANDO --quem Q --evidencia E [--razao R] [--reverte ID]
|
|
332
|
-
Decisao tomada sem perguntar: chega ao dono no resumo
|
|
333
|
-
decisao placar <thread-id> [--json] Decididas contra perguntas por fase, reversoes e o limiar
|
|
334
|
-
claims verificar <thread-id> <claim-id> --comando "<comando>"
|
|
335
|
-
Anexa o comando que comprova uma claim ja feita
|
|
336
|
-
claims retirar <thread-id> <claim-id> --motivo "<motivo>"
|
|
337
|
-
Retira a alegacao (o historico fica no claims.jsonl)
|
|
338
|
-
claims ausente <thread-id> --paths A,B --motivo "<motivo>" [--commit SHA]
|
|
339
|
-
Ciclo sem CHECK: declara no ledger o que ficou sem prova
|
|
340
|
-
verify <thread-id> [--baseline] Reexecuta claims e verify do manifesto no HEAD real
|
|
341
|
-
[--so-claims] --baseline grava o estado do mundo antes do GO
|
|
342
|
-
[--canal C] [--esperar [min]] So executa com a conducao da thread (sai 3 se outra conduz)
|
|
343
|
-
ci prepare <thread-id> Exporta claims/comandos para a candidata (.ork-ci/<thread>.json)
|
|
344
|
-
ci run [<thread-id>] [--bundle ARQ] Executa o CHECK no runner independente
|
|
345
|
-
[--branch B] acha o bundle da thread pelo nome da branch (o CI usa)
|
|
346
|
-
ci status [--sha SHA] [--remoto origin] Consulta o check exato publicado no GitHub
|
|
347
|
-
|
|
348
|
-
gate next <thread-id> [--proximo FASE] Gate de tokens: mesma sessao ou nova sessao
|
|
349
|
-
[--ocupacao 0..1] [--fonte F] [--transcript ARQ] [--janela N] [--refazer]
|
|
350
|
-
gate request <thread-id> [--motivo M] Apresenta pedido HITL correlacionado à pausa
|
|
351
|
-
[--formato telegram|terminal] no contrato curto, com o codigo estavel para responder
|
|
352
|
-
gate answer <thread-id> <pedido> Recebe envelope do ingresso humano autenticado
|
|
353
|
-
--resposta-stdin --por Q --mensagem ID --origem telegram [--canal hermes|openclaw]
|
|
354
|
-
[--conta ID] conta homologada do canal; obrigatoria no canal openclaw
|
|
355
|
-
gate approve Aposentado: aprovação sem pedido é recusada
|
|
356
|
-
|
|
357
|
-
retry policy [--motivo M] [--json] Politica de retry por motivo tipado de gate
|
|
358
|
-
retry plan <thread-id> [--motivo M] O que o ork faria pelo ultimo gate reprovado
|
|
359
|
-
[--fase F] [--json] (calcula, nao executa, nao gasta tentativa)
|
|
360
|
-
retry run <thread-id> [--reverify] Executa a acao tipada do ultimo gate reprovado
|
|
361
|
-
[--por Q] [--dry-run] (--por autoriza quando o bloco do modo pausa)
|
|
362
|
-
retry list [--json] Fila DURAVEL de rate limit do projeto
|
|
363
|
-
retry resume [--id R1] [--agora ISO] Retoma a fase morta por rate limit na janela seguinte
|
|
364
|
-
[--ocupacao 0..1] [--forcar] [--dry-run] (playbooks: mesma-sessao, nova-sessao, escalada)
|
|
365
|
-
retry cancel <id> --motivo M Tira um pedido da fila, com motivo registrado
|
|
366
|
-
retry parse --stderr "<texto>" Le o horario de reset do stderr do adapter
|
|
367
|
-
|
|
368
|
-
fix open <thread-id> [--so-claims] GO-FIX: deriva a spec exata do CHECK reprovado
|
|
369
|
-
[--reverify] [--json] (uma correcao por motivo tipado, tipo A ou B)
|
|
370
|
-
fix list <thread-id> [--rodada N] Correcoes da rodada e o veredito de cada uma
|
|
371
|
-
fix reverify <thread-id> [--rodada N] CHECK-REVERIFY com veredito POR correcao
|
|
372
|
-
[--parcial] [--json] (--parcial e RECUSADO se houver tipo B)
|
|
373
|
-
|
|
374
|
-
handoff export <thread-id> Handoff triado CRITICO/IMPORTANTE/RESUMIVEL
|
|
375
|
-
[--proxima-fase FASE] [--slug S]
|
|
376
|
-
handoff recall <thread-id> <ponteiro> Resolve um ponteiro path#ancora de volta ao conteudo
|
|
377
|
-
|
|
378
|
-
recall <thread-id> --fase FASE Recuperacao TARDIA: resolve so os ponteiros do
|
|
379
|
-
[--id ptr-N] [--todos] [--forcar] momento (retrieve_when), nunca a janela inteira
|
|
380
|
-
[--sem-conteudo] [--json] (orkmind por tag, files por path#ancora)
|
|
381
|
-
|
|
382
|
-
brain status|inventory|get|query|receipts|context|dossie|sync|reconcile|apply|rollback|bind
|
|
383
|
-
brain dossie --thread T [--decisao ID] Dossie de decisao: vinculo, contexto citavel, alternativas,
|
|
384
|
-
quem decidiu e evidencia, com os ids do Brain (so leitura)
|
|
385
|
-
memory status [--json] [--sondar] Regime efetivo (files|orkmind), tenant, degradacao e embeddings
|
|
386
|
-
(--sondar: uma chamada real de embedding, com a latencia)
|
|
387
|
-
memory sync [<thread-id>] [--json] Publica decisoes, policies, handoff, licao e roadmap
|
|
388
|
-
memory inventory --escopo <threads> [--json] Inventaria fontes canonicas e tenants excluidos, sem gravar
|
|
389
|
-
memory migrate --operadora <thread> --escopo <threads> [--dry-run] [--json] Migra handoffs por G3, com pacote integral e readback
|
|
390
|
-
memory search --tags '<json>' [--colecao C] Busca deterministica por tag (mandatory sempre volta)
|
|
391
|
-
[--thread ID] [--restrito] [--janela N] [--limite N] [--json]
|
|
392
|
-
memory search --texto "<frase>" Busca por significado (I-38): vetor + FTS por RRF no tenant,
|
|
393
|
-
[--modo hibrido|vetor|fts] NAO deterministica; nao combina com --tags nem --thread
|
|
394
|
-
[--colecao C] [--limite N] [--json]
|
|
395
|
-
memory index [--modelo primario|fallback|todos] Indice vetorial local do tenant (I-38), idempotente,
|
|
396
|
-
[--dry-run] [--json] com tokens e custo estimados; --dry-run nao chama o provider
|
|
397
|
-
|
|
398
|
-
grafo indexar [--verificar] [--forcar] Indice do grafo de codigo do HEAD limpo (RM-031 KG3) no estado do projeto:
|
|
399
|
-
[--json] pastas 0700, chave por revisao e extrator, idempotente; incremental (KG4)
|
|
400
|
-
a partir do indice ancestral, ou completo com o motivo; --forcar extrai
|
|
401
|
-
completo; --verificar confere contrato, bytes, determinismo e o incremental
|
|
402
|
-
contra a completa; precisa de typescript e micromark
|
|
403
|
-
grafo status [--json] Indices guardados, o do HEAD, os analisadores e o tamanho
|
|
404
|
-
grafo contexto <thread> [--json] Pacote da thread com evidencias e medida em bytes [--teto-bytes N]
|
|
405
|
-
grafo vizinhos <no> [--profundidade N] Vizinhanca de arquivo ou simbolo, com extrator e evidencia de cada aresta
|
|
406
|
-
[--sentido entrada|saida|ambos] [--tipo T,...] [--limite N] [--json]
|
|
407
|
-
grafo chamadores <simbolo> Quem chama (arestas calls que chegam) [--profundidade N] [--limite N] [--json]
|
|
408
|
-
grafo importadores <arquivo|simbolo> Quem importa (arestas imports que chegam) [--profundidade N] [--limite N] [--json]
|
|
409
|
-
grafo caminho <de> <para> Menor caminho pelas arestas [--sentido saida|entrada|ambos] [--tipo T,...] [--json]
|
|
410
|
-
[--json --teto-bytes N] Nas quatro consultas (KG5): JSON compacto de no maximo N bytes; as arestas mais
|
|
411
|
-
longe do alvo saem ate caber, e o caminho que nao cabe recusa
|
|
412
|
-
grafo amostra [--por-estrato N] Amostra de arestas para auditoria manual; --conferir ARQ confere a auditada
|
|
413
|
-
grafo limpar [--tudo] [--json] Apaga os indices que nao sao do HEAD e as sobras com mais de uma hora
|
|
414
|
-
|
|
415
|
-
ship <thread-id> --para <branch> Merge --no-ff serializado por lease e push PROVADO
|
|
416
|
-
ship registrar-pr <thread-id>|--todas A entrega feita por PR vira ship_done: merge ship(<thread>) na base
|
|
417
|
-
[--remoto R] [--json] remota e CI verde no head do PR; depois, ork master <thread> --aceitar-omissao
|
|
418
|
-
[--repo <dono/nome> --pr <n>] PR mesclado em repositorio externo de ci.external_repositories
|
|
419
|
-
[--dry-run] Ensaio: as mesmas conferencias, sem gravar ship_done, fase nem fabrica
|
|
420
|
-
[--de <branch>] [--remoto origin] [--autorizar-push <quem>] [--sem-push] [--dry-run]
|
|
421
|
-
|
|
422
|
-
board [--all] [--sem-remoto] Visao unica das threads (todos os perfis com --all); com a
|
|
423
|
-
fabrica compartilhada, tambem as outras maquinas (I-51)
|
|
424
|
-
board plan Escalonador: quem avanca agora, quem espera e por que
|
|
425
|
-
|
|
426
|
-
orquestracao status [--all] [--json] Monitor PROATIVO de pausas e impedimentos: quem esta
|
|
427
|
-
[--atencao N] [--so-paradas] parado, esperando o que, ha quanto tempo e o que
|
|
428
|
-
[--sem-runtime] [--exigir-limpo] destrava (alias curto: ork monitor)
|
|
429
|
-
|
|
430
|
-
worktree ensure <thread-id> Garante a worktree da thread (base resolvida pelo ork)
|
|
431
|
-
worktree sync <thread-id> [--dry-run] Rebasa a branch da thread quando a base avancou
|
|
432
|
-
worktree audit <thread-id> Confere a worktree no proprio git (sai != 0 se divergir)
|
|
433
|
-
worktree release <thread-id> [--forcar] Remove a worktree e limpa o registro
|
|
434
|
-
|
|
435
|
-
activation plan|status|enable|disable Escrita escopada com aceite, hash, leases e recibo
|
|
436
|
-
lease list Leases, familias e as filas (merge e colisao de regiao)
|
|
437
|
-
lease acquire <nome> --thread T --motivo M Toma um lease tipado (entra na fila se colidir)
|
|
438
|
-
lease release <nome> [--thread T] [--forcar]
|
|
439
|
-
conducao status <thread-id> [--json] Quem conduz a thread agora (canal, sessao, fase, desde)
|
|
440
|
-
conducao assumir <thread-id> --por Q --motivo M
|
|
441
|
-
Handoff: encerra a conducao atual pelo runtime e registra quem assumiu
|
|
442
|
-
|
|
443
|
-
master propor <id> --score N --justificativa J --por <agente>
|
|
444
|
-
master batch --aceitar <thread:assinatura,...> --por <humano>
|
|
445
|
-
master migrar --dry-run --por Q Inspeciona correções sem alterar originais
|
|
446
|
-
master digest <enviar|preview|responder> Digest semanal com recibos do host
|
|
447
|
-
master <thread-id> --score 0-5 --justificativa "<texto>" --por <seu-nome>
|
|
448
|
-
[--classe C[,C]] [--resumo R] [--refazer]
|
|
449
|
-
Fecha a thread: POSTMORTEM + MASTER log + score (so do terminal;
|
|
450
|
-
de processo de host e recusado com master.prova-de-canal)
|
|
451
|
-
master pedir <thread-id> [--formato telegram|terminal|json]
|
|
452
|
-
Pede a nota ao dono com codigo curto; ele responde pelo Telegram
|
|
453
|
-
(<codigo> <0 a 5> <porque>) e a nota vai ao ledger com o recibo (RM-048)
|
|
454
|
-
master [--todas] [--json] As entregas, com o indice derivado do ledger
|
|
455
|
-
master <thread-id> --aceitar-omissao Aceita por omissao SO a entrega desta thread, com registro (ou --thread T)
|
|
456
|
-
[--dry-run] [--json] --dry-run lista o que seria fechado, sem gravar
|
|
457
|
-
master --aceitar-omissao [--dry-run] [--json]
|
|
458
|
-
Aceita TODAS as entregues por omissao, listando cada uma
|
|
459
|
-
(de processo de agente com mais de uma, avisa em stderr)
|
|
460
|
-
master classes As classes de falha fixas do POSTMORTEM
|
|
461
|
-
licoes [--json] O que volta no GOAL e no PLAN da proxima thread (POSTMORTEM e
|
|
462
|
-
MASTER) e as propostas de policy por recorrencia (I-55)
|
|
463
|
-
|
|
464
|
-
demo [--manter] [--dir D] A promessa em 30 s: uma afirmacao falsa reprovada e a corrigida aceita,
|
|
465
|
-
offline, num repositorio temporario (I-56)
|
|
466
|
-
ciclos Variantes de ciclo de "ork thread new --ciclo"
|
|
467
|
-
modos --do-pedido "<texto>" [--json] Le a #TAG do pedido do builder (usado pelos adaptadores)
|
|
468
|
-
modos migrar [--dry-run] [--por Q] Tira modo aposentado do orkastery.yaml e do setup.json
|
|
469
|
-
[--json] (idempotente, com backup; nao toca em historico)
|
|
470
|
-
|
|
471
|
-
prompt list Templates de prompt (embutidos e os do projeto)
|
|
472
|
-
prompt lint [--template ID] Reprova template quebrado antes de ele virar despacho
|
|
473
|
-
prompt render <thread-id> --fase F Mostra o prompt exato, com o sha256 que vai ao ledger
|
|
474
|
-
[--pedido "<texto>"] [--template ID]
|
|
475
|
-
prompt render --exemplo --fase F --modo M Renderiza sem thread nenhuma, para revisar o texto
|
|
476
|
-
|
|
477
|
-
roadmap status [--json] Status report unico do roadmap: grupos com icones, #HITL no que espera
|
|
478
|
-
voce e o fecho com o que precisa de voce e o que vem a seguir (RM-048)
|
|
479
|
-
roadmap reservas [--json] [--remoto R] Quem esta com cada item do roadmap, lido da branch ork/roadmap-reservas
|
|
480
|
-
[--soltar-orfas] marca a reserva de thread ja fechada (orfa) e, com a opcao, solta
|
|
481
|
-
ou passa para outra thread aberta do mesmo item, com registro
|
|
482
|
-
roadmap pegar <RM-NNN> [--thread T] Reserva o item para esta maquina (push atomico: o primeiro vence)
|
|
483
|
-
[--nota N] [--por Q] [--maquina M] maquina = --maquina, ORK_MAQUINA ou o hostname
|
|
484
|
-
[--forcar --motivo M] tomar a reserva de outra maquina fica registrado
|
|
485
|
-
roadmap soltar <RM-NNN> [--forcar --motivo M] Devolve o item
|
|
486
|
-
roadmap feat [--thread T] [--nota N] Reserva o proximo numero de FEAT na mesma branch (push atomico: duas
|
|
487
|
-
maquinas nunca levam o mesmo numero; numero reservado nao volta)
|
|
488
|
-
fabrica [--json] [--sem-remoto] O que cada maquina conduz, lido da branch ork/fabrica-estado (I-51)
|
|
489
|
-
fabrica entrar [--maquina NOME] Esta maquina entra na fabrica compartilhada deste usuario, com
|
|
490
|
-
este nome (~/.orkastery/maquina.json), e publica o primeiro retrato
|
|
491
|
-
fabrica publicar [--forcar] [--json] Grava o retrato desta maquina na branch (push atomico, sem forca);
|
|
492
|
-
depois de entrar, sai sozinho ao criar thread, despachar fase,
|
|
493
|
-
entregar e fechar, e a cada batida do pulse
|
|
494
|
-
fabrica sair Para de publicar daqui e tira o retrato desta maquina da branch
|
|
495
|
-
network status [--json] [--sem-remoto] A Orkastery Network desta pessoa: as maquinas, de qualquer diretorio,
|
|
496
|
-
com a fonte, as lacunas e o que nao foi lido (RM-053)
|
|
497
|
-
network entrar [--maquina NOME] Esta maquina entra na rede: repositorio privado <usuario>/orkastery-network
|
|
498
|
-
[--forja github|gitlab] [--repositorio [DONO/]NOME] na forja (criado se falta) e o primeiro retrato;
|
|
499
|
-
[--forcar] --forcar toma um nome que outra instalacao usa (fica no commit)
|
|
500
|
-
network publicar [--forcar] [--json] Grava o retrato desta maquina na casa da rede (push sem forca); depois de
|
|
501
|
-
entrar, sai sozinho na batida do pulse e nos eventos de thread
|
|
502
|
-
network sair Para de publicar daqui e tira o retrato desta maquina da casa
|
|
503
|
-
network roadmap [--projeto P] [--json] Roadmap, reservas e threads de cada maquina de cada projeto, de qualquer diretorio:
|
|
504
|
-
[--sem-remoto] fonte e hora de cada parte, lacuna tipada no que nao leu. P = caminho do clone,
|
|
505
|
-
github:dono/repo, gitlab:grupo/repo ou nome conhecido; sem clone, le a forja (RM-054)
|
|
506
|
-
docs verificar [--json] [--pr] Documentacao de produto e roadmap contra o codigo e o git; no PR (--pr),
|
|
507
|
-
o merge de outra thread e o indice que divergem da main so avisam
|
|
508
|
-
(padrao do dono: frontmatter, leitura, paridade; sai != 0 com erro)
|
|
509
|
-
docs sincronizar [--escrever] Fatos do ledger e do git para o roadmap (merge, fase) e indices;
|
|
510
|
-
sem --escrever so mostra; nunca muda status por passagem de tempo
|
|
511
|
-
[--so RM-NNN[,RM-MMM]] [--todos] so esses itens (e os indices); na worktree de uma thread com item,
|
|
512
|
-
o padrao e o item dela; --todos volta a todo item (RM-037)
|
|
513
|
-
docs init Cria padroes, modelos, indices e o lint de Markdown no projeto
|
|
514
|
-
|
|
515
|
-
mcp serve --project RAIZ --host HOST Servidor MCP stdio deste projeto (codex|claude-code)
|
|
516
|
-
mcp install --project RAIZ --host HOST Prepara MCP; aceita --dry-run, --ship-transport, --child-permissions e --owner-permissions (Codex)
|
|
517
|
-
|
|
518
|
-
adapter list Adaptadores de host (Camada 1) e o destino de cada um
|
|
519
|
-
adapter show <host> Os 3 pitfalls de instalacao do host
|
|
520
|
-
adapter install <host> [--dir D] Instala o adaptador (claude-code|codex|hermes|openclaw)
|
|
521
|
-
[--dry-run] [--force] divergencia segura resolve sozinha; o resto pergunta
|
|
522
|
-
[--aceitar-catalogo <arquivo>] sobrescreve a copia com o catalogo, arquivo a arquivo
|
|
523
|
-
[--manter-copia <arquivo>] deixa a copia como esta, arquivo a arquivo
|
|
524
|
-
|
|
525
|
-
eval [--skill S] [--canario C] Canarios de comportamento + corpus das skills finas
|
|
526
|
-
[--so-canarios] [--so-skills] [--json] (sai != 0 em qualquer falha)
|
|
527
|
-
|
|
528
|
-
audit packs [--estagio E] [--pack P] Os 7 packs, o estagio que os ativa e a postura
|
|
529
|
-
audit run <pack> [--profile P] Monta o prompt do pack e despacha pelo runtime adapter
|
|
530
|
-
[--since Nd] [--tudo] [--effort E] [--model M] [--agora "<quem>"] [--forcar] [--dry-run]
|
|
531
|
-
audit list Rodadas de auditoria do projeto
|
|
532
|
-
audit show <rodada> [--ledger] Contexto, achados e propostas de uma rodada
|
|
533
|
-
audit prompt <pack> [--since Nd] O prompt exato do pack, com o sha256 que vai ao ledger
|
|
534
|
-
audit lint Reprova template de auditoria quebrado (auditors/)
|
|
535
|
-
audit ingest <rodada> --arquivo J Registra em lote os achados que o auditor escreveu
|
|
536
|
-
audit finding add <rodada> --regra R Registra um achado com evidencia, claim e proposta
|
|
537
|
-
--titulo T --arquivo caminho:linha --impacto I --fix F --estimativa E
|
|
538
|
-
[--severidade critico|maior|menor] [--irreversivel "<passo>"] [--verificar "<comando>"]
|
|
539
|
-
audit verify <rodada> Reexecuta as claims dos achados (auditor sem self-report)
|
|
540
|
-
audit report <rodada> [--publicar] Relatorio com o bloco OBRIGATORIO de propostas
|
|
541
|
-
audit divida [--pack P] [--todos] Board de divida: propostas abertas e recorrencia
|
|
542
|
-
audit surface [<dir>] [--regra SPn] Varredura DETERMINISTICA da superficie de ataque de rede
|
|
543
|
-
[--limite N] [--json] (SP8..SP12; sai != 0 quando ha achado)
|
|
544
|
-
audit surface --registrar <rodada> Grava os achados da varredura no board da rodada
|
|
545
|
-
audit finding estado <id> <estado> Carimba o achado (aberto|adiado|resolvido|descartado)
|
|
546
|
-
|
|
547
|
-
thread new <nome> --from-finding <ID> Abre a thread a partir de um achado de auditoria
|
|
548
|
-
[--modo M] [--worktree auto] [--sem-worktree] [--dry-run]
|
|
549
|
-
(evidencia, claim e proposta viajam junto; a worktree segue
|
|
550
|
-
worktree.por_thread como no thread new)
|
|
551
|
-
|
|
552
|
-
Regimes de memoria: files (fallback honesto) e orkmind (bloco B6, base propria por tenant
|
|
553
|
-
declarada em memory.database_url_env pelo NOME da variavel de ambiente, sem fallback).
|
|
554
|
-
Colecoes gravadas no OrkMind: decision, handoff, rule, learning, roadmap (source=agent,
|
|
555
|
-
nunca mandatory: regra critica so nasce de humano autenticado).
|
|
556
|
-
|
|
557
|
-
Retry tipado (bloco B3): reexecutar, corrigir-dirigido, sincronizar-worktree,
|
|
558
|
-
escalar-esforco, esperar-janela, escalar-humano, sem-retry. Violacao de custo
|
|
559
|
-
(cost.violation) NUNCA recebe retry automatico. O limite de escalacao do manifesto
|
|
560
|
-
(retry.max_tentativas) pausa QUALQUER modo, inclusive #Auto.
|
|
561
|
-
|
|
562
|
-
Monitor de orquestracao (ork orquestracao status / ork monitor): duas naturezas de parada.
|
|
563
|
-
pausa-humana e a parada PREVISTA pelo modo (o bloco fechou e espera veredito, com o
|
|
564
|
-
pausaSobre do bloco dizendo o que o humano decide); impedimento e a nao prevista
|
|
565
|
-
(lease.busy, runtime.rate-limited, concurrency.limite e os demais gates tipados). Tudo e
|
|
566
|
-
DERIVADO de thread.json, ledger.jsonl e das filas em disco: o monitor le, nunca grava.
|
|
567
|
-
--exigir-limpo sai != 0 enquanto houver thread parada, para virar watchdog do orquestrador.
|
|
568
|
-
|
|
569
|
-
Fases: GOAL PLAN GO CHECK SHIP MASTER. Modos: ${modos_1.ORDEM_DOS_MODOS.map((m) => modos_1.MODOS[m].tag).join(' ')}.
|
|
570
|
-
Familias de lease: main-tree, worktree-write:<thread>, path:<glob>, board:<card>, service:<porta>.
|
|
571
|
-
Ciclos: greenfield, merge-branch, goal-plan, gap, feature-xl-faseada.
|
|
572
|
-
Fontes de medida do gate de tokens: runtime_reported, estimated, informada, unavailable.
|
|
573
|
-
Hosts de Camada 1: claude-code, codex, hermes, openclaw. Canarios: fx-happy, fx-hallucination,
|
|
574
|
-
fx-stale-base, fx-wiki-destroy, fx-schema-drift, fx-concurrency.
|
|
575
|
-
Packs de auditoria: clean-code, reuse, architecture, data-model, ux, security-privacy, process.
|
|
576
|
-
Superficie de ataque de rede (SP8..SP12, varredura deterministica): rota sem auth, endpoint de
|
|
577
|
-
administracao exposto, rota sem rate limit, CORS permissivo, rota sem esquema de payload.
|
|
578
|
-
Estagios do produto: nascente, crescendo, maduro (hardening gradual, visao secao 5.2).
|
|
579
|
-
`;
|
|
239
|
+
/** RM-061 (F2a): o que a ajuda interpola; a redacao mora no catalogo (`msg().ajuda`, D10). */
|
|
240
|
+
function dadosDaAjuda(locale = (0, locale_1.localeAtivo)()) {
|
|
241
|
+
return { versao: VERSAO, modos: modos_1.ORDEM_DOS_MODOS.length, segredos: (0, locale_1.msg)(locale).onboarding.segredos,
|
|
242
|
+
tags: modos_1.ORDEM_DOS_MODOS.map((m) => modos_1.MODOS[m].tag).join(' ') };
|
|
243
|
+
}
|
|
244
|
+
/** A ajuda em pt-BR, o texto de sempre: o `docs verificar` a compara com a referencia do CLI. */
|
|
245
|
+
const AJUDA = (0, locale_1.msg)('pt-BR').ajuda.texto(dadosDaAjuda('pt-BR'));
|
|
246
|
+
/**
|
|
247
|
+
* RM-061 (F2a): a ajuda segue o locale como os comandos cobertos: `owner.language` do projeto de
|
|
248
|
+
* `--projeto` ou do diretorio, senao `LC_ALL`, `LC_MESSAGES` e `LANG`. Manifesto ilegivel nao derruba a ajuda.
|
|
249
|
+
*/
|
|
250
|
+
function localeDaAjuda(projeto) {
|
|
251
|
+
// A ajuda sai antes de o projeto-alvo ser fixado: com `--projeto`, vale o manifesto dele (D14).
|
|
252
|
+
let raiz;
|
|
253
|
+
if (projeto !== undefined) {
|
|
254
|
+
try {
|
|
255
|
+
raiz = (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto })?.raiz;
|
|
256
|
+
}
|
|
257
|
+
catch { /* nome ambiguo ou desconhecido: o cwd */ }
|
|
258
|
+
}
|
|
259
|
+
let ownerLanguage;
|
|
260
|
+
try {
|
|
261
|
+
ownerLanguage = (0, manifest_1.carregarManifesto)(raiz)?.manifesto.owner?.language;
|
|
262
|
+
}
|
|
263
|
+
catch { /* vale o ambiente */ }
|
|
264
|
+
return (0, locale_1.resolverLocale)(ownerLanguage).locale;
|
|
265
|
+
}
|
|
580
266
|
function comandoThread(args) {
|
|
581
267
|
if (args.posicionais[1] === 'close' || args.posicionais[1] === 'entrega') {
|
|
582
268
|
const raiz = (0, manifest_1.exigirManifesto)().raiz, id = args.posicionais[2];
|
|
@@ -683,8 +369,9 @@ function comandoThread(args) {
|
|
|
683
369
|
return 0;
|
|
684
370
|
}
|
|
685
371
|
const nome = args.posicionais[2];
|
|
372
|
+
const mt = (0, locale_1.msg)().thread;
|
|
686
373
|
if (!nome) {
|
|
687
|
-
console.error(
|
|
374
|
+
console.error(mt.usoNew);
|
|
688
375
|
return 2;
|
|
689
376
|
}
|
|
690
377
|
const avisoRoadmap = avisoRoadmapSemAssociacao(nome, texto(args.opcoes.roadmap));
|
|
@@ -710,17 +397,31 @@ function comandoThread(args) {
|
|
|
710
397
|
const doneWhen = (texto(args.opcoes.done) ?? '').split(';;').map((p) => p.trim()).filter(Boolean)
|
|
711
398
|
.map((entrada) => {
|
|
712
399
|
const corte = entrada.indexOf('::');
|
|
713
|
-
if (corte < 0)
|
|
714
|
-
throw new Error(
|
|
715
|
-
+ 'Use --done "<criterio> :: <comando que o prova>"; criterio sem comando e prosa, nao criterio de pronto.');
|
|
716
|
-
}
|
|
400
|
+
if (corte < 0)
|
|
401
|
+
throw new Error(mt.doneSemComando(entrada));
|
|
717
402
|
const criterio = entrada.slice(0, corte).trim();
|
|
718
403
|
const comando = entrada.slice(corte + 2).trim();
|
|
719
404
|
if (!criterio || !comando)
|
|
720
|
-
throw new Error(
|
|
405
|
+
throw new Error(mt.doneIncompleto(entrada));
|
|
721
406
|
return { criterio, comando };
|
|
722
407
|
});
|
|
723
408
|
const dryRun = args.opcoes['dry-run'] === true;
|
|
409
|
+
// RM-059 (T6.0): o pedido do builder, guardado para o render da fase quando falta `--pedido`.
|
|
410
|
+
if (args.opcoes.pedido === true) {
|
|
411
|
+
console.error(mt.usoPedido);
|
|
412
|
+
return 2;
|
|
413
|
+
}
|
|
414
|
+
const pedidoDoBuilder = texto(args.opcoes.pedido);
|
|
415
|
+
// A4 do CHECK: pedido invalido e erro de uso, e sai antes da reserva do roadmap, que vai ao remoto.
|
|
416
|
+
if (pedidoDoBuilder !== undefined) {
|
|
417
|
+
try {
|
|
418
|
+
(0, thread_1.prepararPedido)(pedidoDoBuilder);
|
|
419
|
+
}
|
|
420
|
+
catch (e) {
|
|
421
|
+
console.error(mt.usoComMotivo((0, locale_1.mensagemDoErro)(e)));
|
|
422
|
+
return 2;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
724
425
|
// `--worktree auto` (ou `--worktree` sozinho) cria a worktree isolada da thread; um caminho reusa um
|
|
725
426
|
// diretorio que ja existe. P4 do ensaio da 0.5.0: sem flag, `worktree.por_thread: true` cria como o
|
|
726
427
|
// `--worktree auto`, e `--sem-worktree` cria sem ela. Uso invalido sai antes da reserva do roadmap.
|
|
@@ -735,13 +436,13 @@ function comandoThread(args) {
|
|
|
735
436
|
const brutoCiclo = texto(args.opcoes.ciclo) ?? texto(args.opcoes.variante);
|
|
736
437
|
const variante = brutoCiclo ? (0, ciclos_1.parseVariante)(brutoCiclo) : null;
|
|
737
438
|
if (brutoCiclo && !variante) {
|
|
738
|
-
console.error(
|
|
439
|
+
console.error(mt.varianteInvalida(brutoCiclo, Object.keys(ciclos_1.VARIANTES).join(', ')));
|
|
739
440
|
return 2;
|
|
740
441
|
}
|
|
741
442
|
// P4 do ensaio da 0.5.0 (D4, CHECK): a recusa do ciclo sai antes da reserva do roadmap, como os outros erros de
|
|
742
443
|
// uso; a do `novaThread` fica como defesa de quem o chama direto.
|
|
743
444
|
if (variante && (0, ciclos_1.definicaoDaVariante)(variante).exigeWorktree && pedido.origem === 'sem-worktree') {
|
|
744
|
-
console.error(
|
|
445
|
+
console.error(mt.cicloExigeWorktree(variante));
|
|
745
446
|
return 2;
|
|
746
447
|
}
|
|
747
448
|
const brutoFatias = texto(args.opcoes.fatias);
|
|
@@ -749,10 +450,11 @@ function comandoThread(args) {
|
|
|
749
450
|
// atomico entre maquinas (o primeiro push vence); a thread e local. Se a criacao falhar,
|
|
750
451
|
// a reserva e devolvida; se der certo, ela passa a apontar para a thread.
|
|
751
452
|
const itemDoRoadmap = dryRun ? undefined : texto(args.opcoes.roadmap);
|
|
752
|
-
|
|
453
|
+
// RM-061 (F2a, D6): o que grava estado (reserva, thread, ledger, worktree, registro, publicacoes) roda em pt-BR.
|
|
454
|
+
const itemReservado = itemDoRoadmap ? (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap).item) : undefined;
|
|
753
455
|
let criada;
|
|
754
456
|
try {
|
|
755
|
-
criada = (0, thread_1.novaThread)(carregado, {
|
|
457
|
+
criada = (0, locale_1.comLocale)('pt-BR', () => (0, thread_1.novaThread)(carregado, {
|
|
756
458
|
nome,
|
|
757
459
|
modo,
|
|
758
460
|
slug: texto(args.opcoes.slug),
|
|
@@ -767,47 +469,52 @@ function comandoThread(args) {
|
|
|
767
469
|
exigeRuntimeDiferente,
|
|
768
470
|
doneWhen,
|
|
769
471
|
roadmap: itemReservado,
|
|
770
|
-
|
|
472
|
+
...(pedidoDoBuilder !== undefined ? { pedido: pedidoDoBuilder } : {}),
|
|
473
|
+
}));
|
|
771
474
|
}
|
|
772
475
|
catch (e) {
|
|
773
476
|
if (itemDoRoadmap) {
|
|
774
477
|
try {
|
|
775
|
-
(0, roadmap_reservas_1.soltarItem)(carregado.raiz, itemDoRoadmap);
|
|
478
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.soltarItem)(carregado.raiz, itemDoRoadmap));
|
|
776
479
|
}
|
|
777
480
|
catch { /* fica reservado; `ork roadmap soltar` resolve */ }
|
|
778
481
|
}
|
|
779
482
|
throw e;
|
|
780
483
|
}
|
|
781
484
|
const { thread, gravada } = criada;
|
|
782
|
-
const reservaDoItem = itemDoRoadmap && gravada
|
|
485
|
+
const reservaDoItem = itemDoRoadmap && gravada
|
|
486
|
+
? (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_reservas_1.pegarItem)(carregado.raiz, itemDoRoadmap, { thread: thread.id })) : null;
|
|
783
487
|
// I-51 (RM-047): com a fabrica compartilhada, as outras maquinas veem a thread nova.
|
|
784
488
|
if (gravada)
|
|
785
|
-
(0, fabrica_publicar_1.publicarEmSegundoPlano)(carregado.raiz);
|
|
489
|
+
(0, locale_1.comLocale)('pt-BR', () => (0, fabrica_publicar_1.publicarEmSegundoPlano)(carregado.raiz));
|
|
786
490
|
// RM-052 (D7): quem abre thread aqui conhece este projeto; o aviso nunca derruba a criacao.
|
|
787
|
-
const avisoDoRegistro = gravada ? (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'thread new') : null;
|
|
491
|
+
const avisoDoRegistro = gravada ? (0, locale_1.comLocale)('pt-BR', () => (0, projeto_alvo_1.registrarProjetoEmSilencio)(carregado.raiz, 'thread new')) : null;
|
|
788
492
|
if (avisoDoRegistro)
|
|
789
493
|
console.error(avisoDoRegistro);
|
|
790
|
-
console.log(gravada ?
|
|
494
|
+
console.log(gravada ? mt.criada : mt.simulacao);
|
|
791
495
|
if (reservaDoItem)
|
|
792
|
-
console.log(
|
|
496
|
+
console.log(mt.roadmapReservado(reservaDoItem.item, reservaDoItem.reserva?.maquina));
|
|
793
497
|
console.log((0, thread_1.resumoDaThread)(thread));
|
|
794
498
|
console.log('');
|
|
795
|
-
console.log(
|
|
499
|
+
console.log(mt.slugEm3Partes((0, phase_1.descreverSlug)(thread.slug)));
|
|
796
500
|
const linhaDaWorktreeNova = (0, thread_1.linhaDaWorktree)(criada.worktreePor, gravada, variante);
|
|
797
501
|
if (linhaDaWorktreeNova)
|
|
798
502
|
console.log(linhaDaWorktreeNova);
|
|
799
503
|
const avisoDaWorktreeNova = criada.worktreeFalharia ? (0, thread_1.avisoDeWorktreeQueFalharia)(criada.worktreeFalharia)
|
|
800
504
|
: (0, thread_1.avisoDaWorktree)(pedido.origem, criada, carregado.manifesto);
|
|
801
505
|
const avisoSemBase = (0, thread_1.avisoDeThreadSemBase)(thread, gravada);
|
|
506
|
+
if (thread.pedido) {
|
|
507
|
+
console.log(mt.pedidoGuardado(gravada, `.orkastery/threads/${thread.id}/${thread.pedido.arquivo}`, (0, util_1.shaCurto)(thread.pedido.sha256), thread.pedido.bytes));
|
|
508
|
+
}
|
|
802
509
|
if (gravada) {
|
|
803
|
-
console.log(
|
|
510
|
+
console.log(mt.estado(thread.id));
|
|
804
511
|
// Bloco B6: a origem da thread e as policies do projeto vao para a memoria
|
|
805
512
|
// semantica quando ela esta ligada. Em regime files nada muda nesta saida.
|
|
806
|
-
relatarPublicacao((0, memoria_1.publicar)(carregado, thread.id));
|
|
513
|
+
relatarPublicacao((0, locale_1.comLocale)('pt-BR', () => (0, memoria_1.publicar)(carregado, thread.id)));
|
|
807
514
|
// Thread sem base nao tem fase para rodar: o proximo passo e o do aviso.
|
|
808
515
|
if (!avisoSemBase) {
|
|
809
516
|
console.log('');
|
|
810
|
-
console.log(
|
|
517
|
+
console.log(mt.proximoPasso(thread.id, thread.faseAtual));
|
|
811
518
|
}
|
|
812
519
|
}
|
|
813
520
|
if (avisoDaWorktreeNova)
|
|
@@ -833,8 +540,9 @@ function comandoThread(args) {
|
|
|
833
540
|
if (sub === 'status') {
|
|
834
541
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
835
542
|
const id = args.posicionais[2];
|
|
543
|
+
const mt = (0, locale_1.msg)().thread;
|
|
836
544
|
if (!id) {
|
|
837
|
-
console.error(
|
|
545
|
+
console.error(mt.usoStatus);
|
|
838
546
|
return 2;
|
|
839
547
|
}
|
|
840
548
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
@@ -848,20 +556,19 @@ function comandoThread(args) {
|
|
|
848
556
|
console.log((0, thread_1.resumoDaThread)(thread, (0, conducao_1.conducaoDaThread)(carregado.raiz, thread.id)));
|
|
849
557
|
console.log('');
|
|
850
558
|
if (thread.sessoes.length === 0) {
|
|
851
|
-
console.log(
|
|
559
|
+
console.log(mt.nenhumaSessao);
|
|
852
560
|
}
|
|
853
561
|
else {
|
|
854
|
-
console.log(
|
|
562
|
+
console.log(mt.sessoesDespachadas);
|
|
855
563
|
for (const s of thread.sessoes) {
|
|
856
|
-
console.log(` ${s.slug.padEnd(24)} ${s.fase.padEnd(6)} ${s.sessionId.slice(0, 8)} ` +
|
|
857
|
-
`verificada no runtime: ${s.verificada ? 'sim' : 'nao'} canal: ${(0, thread_1.canalDaSessao)(s)}`);
|
|
564
|
+
console.log(` ${s.slug.padEnd(24)} ${s.fase.padEnd(6)} ${s.sessionId.slice(0, 8)} ` + mt.sessao(s.verificada, (0, thread_1.canalDaSessao)(s)));
|
|
858
565
|
}
|
|
859
566
|
}
|
|
860
567
|
console.log('');
|
|
861
|
-
console.log(
|
|
568
|
+
console.log(mt.pausasDoModo((0, modos_1.pausasDoModo)(thread.modo)));
|
|
862
569
|
return 0;
|
|
863
570
|
}
|
|
864
|
-
console.error(
|
|
571
|
+
console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('thread', sub));
|
|
865
572
|
return 2;
|
|
866
573
|
}
|
|
867
574
|
/**
|
|
@@ -873,7 +580,7 @@ function comandoThread(args) {
|
|
|
873
580
|
* Toda edicao vira evento `setup_configured` no ledger do projeto.
|
|
874
581
|
*/
|
|
875
582
|
function comandoOnboarding(args) {
|
|
876
|
-
const invalido = () => { throw new Error(
|
|
583
|
+
const invalido = () => { throw new Error((0, locale_1.msg)().onboarding.usoInvalido); };
|
|
877
584
|
if (Object.keys(args.opcoes).some(k => !['conteudo', 'por', 'json', 'reset'].includes(k)))
|
|
878
585
|
invalido();
|
|
879
586
|
if ('json' in args.opcoes && args.opcoes.json !== true)
|
|
@@ -902,6 +609,7 @@ function comandoOnboarding(args) {
|
|
|
902
609
|
return 0;
|
|
903
610
|
}
|
|
904
611
|
let estado;
|
|
612
|
+
// RM-061 (F2a, D6): a recusa de uso sai no locale do comando; a gravacao roda em pt-BR (o dado nao muda).
|
|
905
613
|
if (sub === 'set') {
|
|
906
614
|
let conteudo;
|
|
907
615
|
try {
|
|
@@ -910,10 +618,13 @@ function comandoOnboarding(args) {
|
|
|
910
618
|
catch {
|
|
911
619
|
return invalido();
|
|
912
620
|
}
|
|
913
|
-
|
|
621
|
+
(0, onboarding_1.validarPedidoDeEtapa)(etapa, conteudo, por);
|
|
622
|
+
estado = (0, locale_1.comLocale)('pt-BR', () => (0, onboarding_1.gravarEtapa)(raiz, etapa, conteudo, por));
|
|
623
|
+
}
|
|
624
|
+
else if (sub === 'reset') {
|
|
625
|
+
(0, onboarding_1.validarPedidoDeEtapa)(etapa, undefined, por);
|
|
626
|
+
estado = (0, locale_1.comLocale)('pt-BR', () => (0, onboarding_1.resetarOnboarding)(raiz, etapa, por));
|
|
914
627
|
}
|
|
915
|
-
else if (sub === 'reset')
|
|
916
|
-
estado = (0, onboarding_1.resetarOnboarding)(raiz, etapa, por);
|
|
917
628
|
else
|
|
918
629
|
estado = (0, onboarding_1.lerOnboarding)(raiz);
|
|
919
630
|
console.log(args.opcoes.json === true ? JSON.stringify(estado, null, 2) : (0, onboarding_1.textoDaPauta)(estado, (0, manifest_1.exigirManifesto)(raiz).manifesto.owner));
|
|
@@ -935,7 +646,7 @@ function aspasDeShell(valor) {
|
|
|
935
646
|
function avisarChavesDePerfis(carregado) {
|
|
936
647
|
for (const a of carregado.avisos)
|
|
937
648
|
if (a.startsWith('runtime_profiles.'))
|
|
938
|
-
console.error(
|
|
649
|
+
console.error((0, locale_1.msg)().phase.aviso(a));
|
|
939
650
|
}
|
|
940
651
|
function comandoAccounts(args) {
|
|
941
652
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
@@ -1081,6 +792,91 @@ function comandoSetup(args) {
|
|
|
1081
792
|
console.log(' Leve para o repositorio por PR: dali em diante ele vale em todas as maquinas, e ork setup <modo> --bloco N passa a editar este arquivo.');
|
|
1082
793
|
return 0;
|
|
1083
794
|
}
|
|
795
|
+
if (modoBruto === 'worktree') {
|
|
796
|
+
// RM-047 (P3): worktree.dir fora da raiz so cria checkout com a confirmacao desta maquina, fora do git.
|
|
797
|
+
const acao = args.posicionais[2];
|
|
798
|
+
const json = args.opcoes.json === true;
|
|
799
|
+
if (acao === 'confirmar') {
|
|
800
|
+
const local = (0, worktree_local_1.confirmarWorktreeLocal)(raiz, carregado.manifesto, por, args.posicionais[3]);
|
|
801
|
+
if (json) {
|
|
802
|
+
console.log(JSON.stringify(local, null, 2));
|
|
803
|
+
return 0;
|
|
804
|
+
}
|
|
805
|
+
console.log(`Pasta das worktrees "${local.dir}" confirmada nesta maquina para ${local.raiz}.`);
|
|
806
|
+
console.log(` Gravada em .orkastery/private/${worktree_local_1.ARQUIVO_WORKTREE_LOCAL} (local, fora do git). Para desfazer: ork setup worktree revogar.`);
|
|
807
|
+
return 0;
|
|
808
|
+
}
|
|
809
|
+
if (acao === 'revogar') {
|
|
810
|
+
const havia = (0, worktree_local_1.revogarWorktreeLocal)(raiz);
|
|
811
|
+
if (json) {
|
|
812
|
+
console.log(JSON.stringify({ revogada: havia }, null, 2));
|
|
813
|
+
return 0;
|
|
814
|
+
}
|
|
815
|
+
console.log(havia ? 'Confirmacao local da pasta das worktrees revogada.' : 'Nao havia confirmacao local da pasta das worktrees.');
|
|
816
|
+
return 0;
|
|
817
|
+
}
|
|
818
|
+
if (acao !== undefined) {
|
|
819
|
+
console.error(`subcomando desconhecido: setup worktree ${acao} (use confirmar [<dir>] ou revogar)`);
|
|
820
|
+
return 2;
|
|
821
|
+
}
|
|
822
|
+
const pedida = (0, worktree_local_1.pastaDasWorktreesPedida)(raiz, carregado.manifesto);
|
|
823
|
+
const local = (0, worktree_local_1.lerWorktreeLocal)(raiz);
|
|
824
|
+
const recusa = (0, worktree_local_1.recusaDePastaDasWorktrees)(raiz, carregado.manifesto);
|
|
825
|
+
if (json) {
|
|
826
|
+
console.log(JSON.stringify({ manifesto: carregado.manifesto.worktree.dir, dir: pedida.dir, dentroDaRaiz: pedida.dentro,
|
|
827
|
+
confirmadaNestaMaquina: local.local?.dir ?? null, criacao: recusa === null ? 'permitida' : 'recusada' }, null, 2));
|
|
828
|
+
return 0;
|
|
829
|
+
}
|
|
830
|
+
console.log(`worktree.dir no orkastery.yaml: ${carregado.manifesto.worktree.dir} (${pedida.dir}, ${pedida.dentro ? 'dentro' : 'fora'} da raiz)`);
|
|
831
|
+
console.log(`confirmacao local desta maquina: ${local.local ? local.local.dir : `nenhuma (${local.motivo})`}`);
|
|
832
|
+
console.log(recusa === null ? 'criacao de worktree: permitida' : `criacao de worktree: recusada. ${worktree_local_1.COMANDO_CONFIRMAR_WORKTREE}`);
|
|
833
|
+
return 0;
|
|
834
|
+
}
|
|
835
|
+
if (modoBruto === 'sandbox') {
|
|
836
|
+
// RM-047 (P1): a postura de sandbox que afrouxa so vale com a confirmacao desta maquina, fora do git.
|
|
837
|
+
const acao = args.posicionais[2];
|
|
838
|
+
const json = args.opcoes.json === true;
|
|
839
|
+
if (acao === 'confirmar') {
|
|
840
|
+
const postura = args.posicionais[3];
|
|
841
|
+
if (!postura) {
|
|
842
|
+
console.error('uso: ork setup sandbox confirmar <read-only|workspace-write|danger-full-access> [--por Q]');
|
|
843
|
+
return 2;
|
|
844
|
+
}
|
|
845
|
+
const p = (0, postura_local_1.confirmarPosturaLocal)(raiz, postura, por);
|
|
846
|
+
if (json) {
|
|
847
|
+
console.log(JSON.stringify(p, null, 2));
|
|
848
|
+
return 0;
|
|
849
|
+
}
|
|
850
|
+
console.log(`Postura de sandbox "${p.sandbox}" confirmada nesta maquina para ${p.raiz}.`);
|
|
851
|
+
console.log(` Gravada em ${(0, postura_local_1.caminhoDaPosturaLocal)(raiz)} (local, fora do git). Para desfazer: ork setup sandbox revogar.`);
|
|
852
|
+
return 0;
|
|
853
|
+
}
|
|
854
|
+
if (acao === 'revogar') {
|
|
855
|
+
const havia = (0, postura_local_1.revogarPosturaLocal)(raiz);
|
|
856
|
+
if (json) {
|
|
857
|
+
console.log(JSON.stringify({ revogada: havia }, null, 2));
|
|
858
|
+
return 0;
|
|
859
|
+
}
|
|
860
|
+
console.log(havia ? 'Confirmacao local da postura de sandbox revogada.' : 'Nao havia confirmacao local de postura de sandbox.');
|
|
861
|
+
return 0;
|
|
862
|
+
}
|
|
863
|
+
if (acao !== undefined) {
|
|
864
|
+
console.error(`subcomando desconhecido: setup sandbox ${acao} (use confirmar <postura> ou revogar)`);
|
|
865
|
+
return 2;
|
|
866
|
+
}
|
|
867
|
+
const pedida = carregado.manifesto.runtime.sandbox;
|
|
868
|
+
const local = (0, postura_local_1.lerPosturaLocal)(raiz);
|
|
869
|
+
const recusa = (0, postura_local_1.recusaDePostura)(raiz, carregado.manifesto, 'codex');
|
|
870
|
+
if (json) {
|
|
871
|
+
console.log(JSON.stringify({ manifesto: pedida, afrouxa: (0, postura_local_1.posturaAfrouxada)(carregado.manifesto) !== null,
|
|
872
|
+
confirmadaNestaMaquina: local.postura?.sandbox ?? null, despachoCodex: recusa === null ? 'permitido' : 'recusado' }, null, 2));
|
|
873
|
+
return 0;
|
|
874
|
+
}
|
|
875
|
+
console.log(`runtime.sandbox no orkastery.yaml: ${pedida}`);
|
|
876
|
+
console.log(`confirmacao local desta maquina: ${local.postura ? local.postura.sandbox : `nenhuma (${local.motivo})`}`);
|
|
877
|
+
console.log(recusa === null ? 'despacho pelo codex: permitido' : `despacho pelo codex: recusado. ${(0, postura_local_1.comandoDeConfirmacao)(pedida)}`);
|
|
878
|
+
return 0;
|
|
879
|
+
}
|
|
1084
880
|
if (!modoBruto) {
|
|
1085
881
|
if (args.opcoes.reset === true) {
|
|
1086
882
|
(0, setup_1.resetarSetup)(raiz, undefined, por);
|
|
@@ -1149,19 +945,21 @@ function comandoSetup(args) {
|
|
|
1149
945
|
function comandoPhase(args) {
|
|
1150
946
|
const sub = args.posicionais[1];
|
|
1151
947
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
948
|
+
const m = (0, locale_1.msg)().phase;
|
|
1152
949
|
if (sub === 'run') {
|
|
1153
950
|
avisarChavesDePerfis(carregado);
|
|
1154
951
|
const id = args.posicionais[2];
|
|
1155
952
|
const faseBruta = args.posicionais[3];
|
|
1156
953
|
const prompt = texto(args.opcoes.prompt);
|
|
1157
954
|
if (!id || !faseBruta || !prompt) {
|
|
1158
|
-
console.error(
|
|
955
|
+
console.error(m.usoRun);
|
|
1159
956
|
return 2;
|
|
1160
957
|
}
|
|
1161
958
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
1162
959
|
const fase = (0, thread_1.exigirFase)(thread, faseBruta);
|
|
1163
960
|
const conducao = conducaoDoCli(args);
|
|
1164
|
-
|
|
961
|
+
// RM-061 (F2a, D6): o despacho grava prompt, ledger, lease e pedidos em pt-BR; so a impressao segue o locale.
|
|
962
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, phase_1.rodarFase)(carregado, id, {
|
|
1165
963
|
fase,
|
|
1166
964
|
prompt,
|
|
1167
965
|
runtime: texto(args.opcoes.runtime),
|
|
@@ -1172,7 +970,9 @@ function comandoPhase(args) {
|
|
|
1172
970
|
canal: conducao.canal,
|
|
1173
971
|
...(conducao.correlacao ? { correlacao: conducao.correlacao } : {}),
|
|
1174
972
|
...(conducao.esperarMs ? { esperarMs: conducao.esperarMs } : {}),
|
|
1175
|
-
|
|
973
|
+
// A baseline que o despacho grava espera a fila pesada com aviso; a recusa sugere gravá-la antes, com mais espera.
|
|
974
|
+
filaPesada: filaPesadaDoCli(args, 'baseline', `ork verify ${id} --baseline --esperar 120`),
|
|
975
|
+
}));
|
|
1176
976
|
// I-36 (T12, T14): pedido repetido e segundo pedido tem resposta propria, antes dos outros gates.
|
|
1177
977
|
if (r.idempotente && r.conducao) {
|
|
1178
978
|
console.log((0, conducao_1.textoDoPedidoRepetido)(id, r.conducao));
|
|
@@ -1188,14 +988,13 @@ function comandoPhase(args) {
|
|
|
1188
988
|
console.log(JSON.stringify({ motivo: r.motivo, ...r.vaga }, null, 2));
|
|
1189
989
|
return 3;
|
|
1190
990
|
}
|
|
1191
|
-
console.log(
|
|
1192
|
-
`em outras threads e o limite e ${r.vaga.limite} (concurrency.max_parallel_threads).`);
|
|
991
|
+
console.log(m.vagaRecusada(r.vaga.ocupam.length, r.vaga.limite));
|
|
1193
992
|
for (const o of r.vaga.ocupam) {
|
|
1194
993
|
console.log(` ${o.thread.padEnd(20)} ${(o.fase ?? '-').padEnd(6)} ` +
|
|
1195
|
-
`${o.sessao ? `${o.runtime} ${o.sessao.slice(0, 8)}` :
|
|
994
|
+
`${o.sessao ? `${o.runtime} ${o.sessao.slice(0, 8)}` : m.despachoEmCurso}, ${m.desde((0, horario_1.localizarTextoRotulado)(o.desde))}`);
|
|
1196
995
|
}
|
|
1197
|
-
console.log(
|
|
1198
|
-
console.log(r.dryRun ?
|
|
996
|
+
console.log(m.correcao(r.vaga.correcao));
|
|
997
|
+
console.log(r.dryRun ? m.vagaEnsaio : m.vagaLedger(id));
|
|
1199
998
|
return 3;
|
|
1200
999
|
}
|
|
1201
1000
|
// RM-037 (S-4 do CHECK 3): a baseline que o despacho nao conseguiu gravar nao e gate reprovado.
|
|
@@ -1204,69 +1003,71 @@ function comandoPhase(args) {
|
|
|
1204
1003
|
console.log(JSON.stringify({ motivo: r.motivo, detalhe: r.erro }, null, 2));
|
|
1205
1004
|
return 1;
|
|
1206
1005
|
}
|
|
1207
|
-
console.error(
|
|
1208
|
-
console.error(
|
|
1006
|
+
console.error(m.recusado(`${r.erro}`));
|
|
1007
|
+
console.error(m.baselinePendente);
|
|
1209
1008
|
return 1;
|
|
1210
1009
|
}
|
|
1010
|
+
// RM-061 (F2a): o resumo do despacho sai pelo catalogo; o rotulo tem largura 14, como antes.
|
|
1011
|
+
const campo = (rotulo, valor) => ` ${rotulo.padEnd(14)} : ${valor}`, rt = m.rotulos;
|
|
1211
1012
|
if (r.dryRun && !r.bloqueado) {
|
|
1212
|
-
console.log(
|
|
1213
|
-
console.log(
|
|
1214
|
-
console.log(
|
|
1215
|
-
console.log(
|
|
1216
|
-
console.log(
|
|
1217
|
-
console.log(
|
|
1218
|
-
console.log(
|
|
1013
|
+
console.log(m.simulacao);
|
|
1014
|
+
console.log(campo(rt.slug, r.slug));
|
|
1015
|
+
console.log(campo(rt.prompt, `${r.promptPath}`));
|
|
1016
|
+
console.log(campo(rt.sha256, `${r.promptSha256}`));
|
|
1017
|
+
console.log(campo(rt.pausaAoFim, m.simNao(!!r.pausaAoFim)));
|
|
1018
|
+
console.log(campo(rt.runtime, `${r.runtime}`));
|
|
1019
|
+
console.log(campo(rt.modelo, `${r.model}/${r.effort}`));
|
|
1219
1020
|
// O prompt inteiro nao cabe na tela: o argumento longo aparece mascarado.
|
|
1220
|
-
console.log(
|
|
1021
|
+
console.log(campo(rt.comando, r.comando.map((c) => (c.length > 80 ? '"<prompt>"' : c)).join(' ')));
|
|
1221
1022
|
for (const l of (0, policies_1.linhasDeAviso)(r.violacoes ?? []))
|
|
1222
1023
|
console.log(l);
|
|
1223
1024
|
return 0;
|
|
1224
1025
|
}
|
|
1225
1026
|
if (r.bloqueado) {
|
|
1226
|
-
console.error(
|
|
1027
|
+
console.error(m.bloqueado(`${r.motivo}`));
|
|
1227
1028
|
for (const v of r.violacoes) {
|
|
1228
1029
|
console.error(` [${v.severidade}] policy ${v.policy}: ${v.detalhe}`);
|
|
1229
|
-
console.error(
|
|
1030
|
+
console.error(m.violacaoCorrecao(v.correcao));
|
|
1230
1031
|
}
|
|
1231
|
-
console.error(
|
|
1032
|
+
console.error(m.promptNaoGravado(id));
|
|
1232
1033
|
return 1;
|
|
1233
1034
|
}
|
|
1234
1035
|
if (!r.sessionId) {
|
|
1235
1036
|
// I-35: o erro vai ao ledger com o ISO; o dono le no fuso dele, com o fuso dito uma vez.
|
|
1236
|
-
console.error(
|
|
1237
|
-
console.error(
|
|
1037
|
+
console.error(m.falhou(`${r.erro ? (0, horario_1.localizarTextoRotulado)(r.erro) : r.erro}`));
|
|
1038
|
+
console.error(m.falhouLedger(id));
|
|
1238
1039
|
return 1;
|
|
1239
1040
|
}
|
|
1240
|
-
console.log(
|
|
1041
|
+
console.log(m.despachada(fase));
|
|
1241
1042
|
for (const l of (0, policies_1.linhasDeAviso)(r.violacoes ?? []))
|
|
1242
1043
|
console.log(l);
|
|
1243
|
-
console.log(
|
|
1244
|
-
console.log(
|
|
1245
|
-
console.log(
|
|
1246
|
-
console.log(
|
|
1247
|
-
console.log(
|
|
1248
|
-
console.log(
|
|
1249
|
-
console.log(
|
|
1250
|
-
console.log(
|
|
1044
|
+
console.log(campo(rt.sessionId, r.sessionId));
|
|
1045
|
+
console.log(campo(rt.slug, `${r.slug} (${(0, phase_1.descreverSlug)(r.slug)})`));
|
|
1046
|
+
console.log(campo(rt.prompt, `${r.promptPath}`));
|
|
1047
|
+
console.log(campo(rt.sha256, `${r.promptSha256}`));
|
|
1048
|
+
console.log(campo(rt.runtime, `${r.runtime}`));
|
|
1049
|
+
console.log(campo(rt.modelo, m.modeloGravado(`${r.model}`, `${r.effort}`)));
|
|
1050
|
+
console.log(m.verificada(!!r.verificada));
|
|
1051
|
+
console.log(m.pausaNoFim(!!r.pausaAoFim));
|
|
1251
1052
|
console.log('');
|
|
1252
1053
|
if (r.runtime === 'claude-bg') {
|
|
1253
|
-
console.log(
|
|
1054
|
+
console.log(m.acompanheClaude(r.sessionId, id));
|
|
1254
1055
|
}
|
|
1255
1056
|
else {
|
|
1256
|
-
console.log(
|
|
1057
|
+
console.log(m.acompanhe(id));
|
|
1257
1058
|
}
|
|
1258
1059
|
return r.verificada ? 0 : 1;
|
|
1259
1060
|
}
|
|
1260
1061
|
if (sub === 'list') {
|
|
1261
1062
|
const id = args.posicionais[2];
|
|
1262
1063
|
if (!id) {
|
|
1263
|
-
console.error(
|
|
1064
|
+
console.error(m.usoList);
|
|
1264
1065
|
return 2;
|
|
1265
1066
|
}
|
|
1266
1067
|
console.log((0, phase_1.tabelaDoLedger)(carregado.raiz, id));
|
|
1267
1068
|
return 0;
|
|
1268
1069
|
}
|
|
1269
|
-
console.error(
|
|
1070
|
+
console.error((0, locale_1.msg)().cli.subcomandoDesconhecido('phase', sub));
|
|
1270
1071
|
return 2;
|
|
1271
1072
|
}
|
|
1272
1073
|
function comandoLedger(args) {
|
|
@@ -1573,6 +1374,40 @@ function comandoClaims(args) {
|
|
|
1573
1374
|
}
|
|
1574
1375
|
return 0;
|
|
1575
1376
|
}
|
|
1377
|
+
if (sub === 'conferir') {
|
|
1378
|
+
// RM-059 (T0.10): so o que foi pedido, no sandbox do verify, sob a conducao da thread, sem recibo.
|
|
1379
|
+
const id = args.posicionais[2];
|
|
1380
|
+
const json = args.opcoes.json === true;
|
|
1381
|
+
const claims = texto(args.opcoes.claims);
|
|
1382
|
+
const tarefa = texto(args.opcoes.tarefa);
|
|
1383
|
+
const prazo = texto(args.opcoes.prazo);
|
|
1384
|
+
const semValor = ['claims', 'tarefa', 'prazo'].some((o) => args.opcoes[o] === true);
|
|
1385
|
+
if (!id || semValor || (claims === undefined) === (tarefa === undefined)) {
|
|
1386
|
+
console.error('uso: ork claims conferir <thread-id> --claims C1,C2 | --tarefa T1 [--prazo S] [--json]');
|
|
1387
|
+
return 2;
|
|
1388
|
+
}
|
|
1389
|
+
const conducao = conducaoDoCli(args);
|
|
1390
|
+
try {
|
|
1391
|
+
const r = (0, claims_conferir_1.conferirClaims)(carregado, id, {
|
|
1392
|
+
claims: claims !== undefined ? (0, claims_conferir_1.idsDeClaims)(claims) : undefined,
|
|
1393
|
+
tarefa,
|
|
1394
|
+
prazoMs: prazo !== undefined ? Number(prazo) * 1000 : undefined,
|
|
1395
|
+
canal: conducao.canal,
|
|
1396
|
+
correlacao: conducao.correlacao,
|
|
1397
|
+
});
|
|
1398
|
+
console.log(json ? JSON.stringify(r, null, 2) : (0, claims_conferir_1.textoDaConferencia)(r));
|
|
1399
|
+
return r.ok ? 0 : 1;
|
|
1400
|
+
}
|
|
1401
|
+
catch (e) {
|
|
1402
|
+
if (!(e instanceof claims_conferir_1.ErroDeConferencia))
|
|
1403
|
+
throw e;
|
|
1404
|
+
if (json)
|
|
1405
|
+
console.log(JSON.stringify({ formato: claims_conferir_1.FORMATO_DA_CONFERENCIA, thread: id, ok: false, erro: e.message }, null, 2));
|
|
1406
|
+
else
|
|
1407
|
+
console.error(e.message);
|
|
1408
|
+
return 2;
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1576
1411
|
if (sub === 'verificar') {
|
|
1577
1412
|
const id = args.posicionais[2];
|
|
1578
1413
|
const claimId = args.posicionais[3];
|
|
@@ -1632,30 +1467,36 @@ function comandoClaims(args) {
|
|
|
1632
1467
|
function comandoVerify(args) {
|
|
1633
1468
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1634
1469
|
const id = args.posicionais[1];
|
|
1470
|
+
const m = (0, locale_1.msg)().verify;
|
|
1635
1471
|
if (!id) {
|
|
1636
|
-
console.error(
|
|
1472
|
+
console.error(m.uso);
|
|
1637
1473
|
return 2;
|
|
1638
1474
|
}
|
|
1639
|
-
|
|
1475
|
+
// RM-058 N2 (D10): enquanto a fila de recursos pesados nao da a vez, o CLI diz uma vez por quem espera.
|
|
1476
|
+
const aoEsperar = (ocupantes) => console.error(m.filaPesadaEsperando(args.opcoes.baseline === true ? 'baseline' : 'verify', ocupantes.map((o) => m.filaPesadaOcupante(o.operacao, o.thread, (0, horario_1.formatarDataHora)(o.desde))).join('; ')));
|
|
1477
|
+
const doCli = conducaoDoCli(args);
|
|
1478
|
+
// O `ork verify` do CLI espera a fila em primeiro plano ate `--esperar` ou 60 min; a recusa sugere o dobro.
|
|
1479
|
+
const conducao = { ...doCli, filaPesada: { aoEsperar, esperarMs: doCli.esperarMs ?? verify_1.ESPERA_DA_FILA_PESADA_MS,
|
|
1480
|
+
comandoDeEsperar: `ork verify ${id}${args.opcoes.baseline === true ? ' --baseline' : ''} --esperar 120` } };
|
|
1640
1481
|
if (args.opcoes.baseline === true) {
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
console.log(
|
|
1482
|
+
// RM-061 (F2b, G2): a baseline e o ledger sao gravados em pt-BR; so a impressao segue o locale.
|
|
1483
|
+
const b = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.gravarBaseline)(carregado, id, undefined, conducao));
|
|
1484
|
+
console.log(m.baselineGravada(id));
|
|
1485
|
+
console.log(m.baselineCommit(b.commit));
|
|
1644
1486
|
for (const c of b.comandos) {
|
|
1645
|
-
console.log(
|
|
1487
|
+
console.log(m.baselineComando(c.nome, c.ok, c.code, c.comando));
|
|
1646
1488
|
}
|
|
1647
1489
|
if (b.comandos.some((c) => !c.ok)) {
|
|
1648
1490
|
// Ensaio de 03/10 (R7): "ja falhava" sem dizer onde ver a saida do comando.
|
|
1649
|
-
console.log(
|
|
1650
|
-
`(resumo e trecho); o evento baseline_recorded esta em ork phase list ${id}`);
|
|
1491
|
+
console.log(m.baselineSaida((0, thread_1.caminhoThread)(carregado.raiz, id), id));
|
|
1651
1492
|
}
|
|
1652
1493
|
if (b.comandos.length === 0) {
|
|
1653
1494
|
// Fatia 2 do ensaio da 0.5.0 (R5): a baseline foi gravada; o que falta e comando, nao baseline.
|
|
1654
|
-
console.log(
|
|
1495
|
+
console.log(m.baselineSemComandos);
|
|
1655
1496
|
}
|
|
1656
1497
|
return 0;
|
|
1657
1498
|
}
|
|
1658
|
-
const r = (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao });
|
|
1499
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, verify_1.verificar)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao }));
|
|
1659
1500
|
console.log((0, verify_1.textoDoVerify)(r));
|
|
1660
1501
|
return r.ok ? 0 : 1;
|
|
1661
1502
|
}
|
|
@@ -1663,10 +1504,45 @@ function comandoVerify(args) {
|
|
|
1663
1504
|
* `ork conducao status|assumir` (I-36, T15): quem conduz a thread agora, e o handoff explicito. O
|
|
1664
1505
|
* status tambem libera, com prova no ledger, a conducao que ficou sem dono (T16).
|
|
1665
1506
|
*/
|
|
1507
|
+
/**
|
|
1508
|
+
* RM-059 (F6, T6.4; DD5 do plano dos mods): `ork conducao sentinela status|bater|desligar`. A presenca da
|
|
1509
|
+
* Sentinela do Condutor nesta maquina e o passo do condutor em cada thread aberta; o condutor externo le o
|
|
1510
|
+
* `status --json` para ceder o despacho enquanto a presenca vale. Nada aqui despacha.
|
|
1511
|
+
*/
|
|
1512
|
+
function comandoSentinela(carregado, args) {
|
|
1513
|
+
const acao = args.posicionais[2] ?? 'status';
|
|
1514
|
+
const json = args.opcoes.json === true;
|
|
1515
|
+
if (acao === 'status') {
|
|
1516
|
+
const s = (0, conducao_sentinela_1.statusDaSentinela)(carregado);
|
|
1517
|
+
console.log(json ? JSON.stringify(s, null, 2) : (0, conducao_sentinela_1.textoDoStatusDaSentinela)(s));
|
|
1518
|
+
return 0;
|
|
1519
|
+
}
|
|
1520
|
+
if (acao !== 'bater' && acao !== 'desligar')
|
|
1521
|
+
throw new Error('uso: ork conducao sentinela status|bater|desligar [--sessao <id>] [--json]');
|
|
1522
|
+
const sessao = texto(args.opcoes.sessao);
|
|
1523
|
+
if (!sessao)
|
|
1524
|
+
throw new Error(`uso: ork conducao sentinela ${acao} --sessao <id> [--json]`);
|
|
1525
|
+
if (acao === 'bater') {
|
|
1526
|
+
const r = (0, conducao_sentinela_1.baterSentinela)(carregado.raiz, { sessao });
|
|
1527
|
+
const curta = r.presenca.sessao.slice(0, 8);
|
|
1528
|
+
console.log(json ? JSON.stringify(r, null, 2) : r.ok
|
|
1529
|
+
? `Sentinela ${r.ligou ? 'ligada' : 'renovada'} na maquina ${r.presenca.maquina} pela sessao ${curta}; vale 3 min sem batida.`
|
|
1530
|
+
: `Outra sessao (${curta}) conduz pela Sentinela na maquina ${r.presenca.maquina}; esta fica so olhando.`);
|
|
1531
|
+
return r.ok ? 0 : 3;
|
|
1532
|
+
}
|
|
1533
|
+
const motivo = texto(args.opcoes.motivo);
|
|
1534
|
+
const r = (0, conducao_sentinela_1.desligarSentinela)(carregado.raiz, { sessao, ...(motivo ? { motivo } : {}) });
|
|
1535
|
+
console.log(json ? JSON.stringify(r, null, 2) : r.desligada
|
|
1536
|
+
? 'Sentinela desligada nesta maquina; o condutor externo volta a conduzir.'
|
|
1537
|
+
: 'Nada a desligar: a presenca nesta maquina nao e desta sessao.');
|
|
1538
|
+
return 0;
|
|
1539
|
+
}
|
|
1666
1540
|
function comandoConducao(args) {
|
|
1667
1541
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
1668
1542
|
const sub = args.posicionais[1];
|
|
1669
1543
|
const id = args.posicionais[2];
|
|
1544
|
+
if (sub === 'sentinela')
|
|
1545
|
+
return comandoSentinela(carregado, args);
|
|
1670
1546
|
if (sub === 'status') {
|
|
1671
1547
|
if (!id)
|
|
1672
1548
|
throw new Error('uso: ork conducao status <thread-id> [--json]');
|
|
@@ -1684,7 +1560,7 @@ function comandoConducao(args) {
|
|
|
1684
1560
|
console.log(args.opcoes.json === true ? JSON.stringify(r, null, 2) : `${r.ok ? 'Conducao assumida.' : 'Handoff recusado.'} ${r.detalhe}`);
|
|
1685
1561
|
return r.ok ? 0 : 3;
|
|
1686
1562
|
}
|
|
1687
|
-
throw new Error('uso: ork conducao status|assumir <thread-id>');
|
|
1563
|
+
throw new Error('uso: ork conducao status|assumir <thread-id> | ork conducao sentinela status|bater|desligar');
|
|
1688
1564
|
}
|
|
1689
1565
|
/** RM-048 (D1): o gate aberto no contrato curto, com o codigo estavel e o "desde" do ledger. */
|
|
1690
1566
|
function textoDoGateCurto(raiz, pedido, canal) {
|
|
@@ -1845,7 +1721,7 @@ function comandoRetry(args) {
|
|
|
1845
1721
|
if (sub === 'plan' || sub === 'run') {
|
|
1846
1722
|
const id = args.posicionais[2];
|
|
1847
1723
|
if (!id) {
|
|
1848
|
-
console.error(
|
|
1724
|
+
console.error((0, locale_1.msg)().retry.usoPlanRun(sub));
|
|
1849
1725
|
return 2;
|
|
1850
1726
|
}
|
|
1851
1727
|
const thread = (0, thread_1.lerThread)(carregado.raiz, id);
|
|
@@ -1856,7 +1732,8 @@ function comandoRetry(args) {
|
|
|
1856
1732
|
autorizadoPor: texto(args.opcoes.por) ?? texto(args.opcoes.quem),
|
|
1857
1733
|
};
|
|
1858
1734
|
if (sub === 'plan') {
|
|
1859
|
-
|
|
1735
|
+
// RM-061 (F2b, G2): a razao nasce em pt-BR, como o --json e o ledger a guardam; so a impressao segue o locale.
|
|
1736
|
+
const plano = (0, locale_1.comLocale)('pt-BR', () => (0, retry_1.planejarRetry)(carregado, id, opcoes));
|
|
1860
1737
|
if (args.opcoes.json === true) {
|
|
1861
1738
|
console.log(JSON.stringify(plano, null, 2));
|
|
1862
1739
|
return 0;
|
|
@@ -1868,11 +1745,11 @@ function comandoRetry(args) {
|
|
|
1868
1745
|
const conducao = conducaoDoCli(args);
|
|
1869
1746
|
if (conducao.esperarMs && args.opcoes['dry-run'] !== true)
|
|
1870
1747
|
(0, conducao_1.esperarConducaoLivre)(carregado.raiz, id, conducao.esperarMs);
|
|
1871
|
-
const r = (0, retry_1.executarRetry)(carregado, id, {
|
|
1748
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, retry_1.executarRetry)(carregado, id, {
|
|
1872
1749
|
...opcoes,
|
|
1873
1750
|
dryRun: args.opcoes['dry-run'] === true,
|
|
1874
1751
|
reverify: args.opcoes.reverify === true,
|
|
1875
|
-
});
|
|
1752
|
+
}));
|
|
1876
1753
|
if (args.opcoes.json === true) {
|
|
1877
1754
|
console.log(JSON.stringify(r, null, 2));
|
|
1878
1755
|
}
|
|
@@ -1952,7 +1829,7 @@ function comandoFix(args) {
|
|
|
1952
1829
|
console.error('uso: ork fix open <thread-id> [--so-claims] [--reverify]');
|
|
1953
1830
|
return 2;
|
|
1954
1831
|
}
|
|
1955
|
-
const conducao = conducaoDoCli(args);
|
|
1832
|
+
const conducao = { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix open ${id} --esperar 30`) };
|
|
1956
1833
|
const rodada = (0, fix_1.abrirRodada)(carregado, id, { soClaims: args.opcoes['so-claims'] === true, conducao });
|
|
1957
1834
|
const reverify = args.opcoes.reverify === true && rodada.correcoes.length > 0
|
|
1958
1835
|
? (0, fix_1.reverificar)(carregado, id, { rodada: rodada.rodada, conducao })
|
|
@@ -2007,7 +1884,7 @@ function comandoFix(args) {
|
|
|
2007
1884
|
}
|
|
2008
1885
|
const rodadaBruta = texto(args.opcoes.rodada);
|
|
2009
1886
|
const r = (0, fix_1.reverificar)(carregado, id, {
|
|
2010
|
-
conducao: conducaoDoCli(args),
|
|
1887
|
+
conducao: { ...conducaoDoCli(args), filaPesada: filaPesadaDoCli(args, 'verify', `ork fix reverify ${id} --esperar 30`) },
|
|
2011
1888
|
rodada: rodadaBruta ? Number(rodadaBruta) : undefined,
|
|
2012
1889
|
parcial: args.opcoes.parcial === true,
|
|
2013
1890
|
});
|
|
@@ -2060,8 +1937,76 @@ function comandoHandoff(args) {
|
|
|
2060
1937
|
console.error(`subcomando desconhecido: handoff ${sub}`);
|
|
2061
1938
|
return 2;
|
|
2062
1939
|
}
|
|
1940
|
+
/**
|
|
1941
|
+
* RM-059 (F7, T7.1; DD4 do plano dos mods): `ork ship publicar <thread>`. So publica no modo que ja autoriza push
|
|
1942
|
+
* (#Auto e #Maestro); a autorizacao humana na linha nao vale aqui (D1 da ork-rm059pista), e o push do modo que pausa
|
|
1943
|
+
* e do dono, no terminal dele.
|
|
1944
|
+
*/
|
|
1945
|
+
function comandoShipPublicar(carregado, args) {
|
|
1946
|
+
const m = (0, locale_1.msg)().ship;
|
|
1947
|
+
const p = m.publicar;
|
|
1948
|
+
if (args.opcoes['autorizar-push'] !== undefined) {
|
|
1949
|
+
console.error(p.semAutorizarPush);
|
|
1950
|
+
return 2;
|
|
1951
|
+
}
|
|
1952
|
+
const alvo = args.posicionais[2];
|
|
1953
|
+
if (!alvo || args.posicionais.length > 3) {
|
|
1954
|
+
console.error(p.uso);
|
|
1955
|
+
return 2;
|
|
1956
|
+
}
|
|
1957
|
+
if (args.opcoes.remoto !== undefined)
|
|
1958
|
+
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
1959
|
+
// Como o ship: o que o publicar grava (ledger, detalhe e correcao do --json) nasce em pt-BR.
|
|
1960
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_publicar_1.publicarEntrega)(carregado, alvo, {
|
|
1961
|
+
remoto: texto(args.opcoes.remoto), dryRun: args.opcoes['dry-run'] === true,
|
|
1962
|
+
}));
|
|
1963
|
+
if (args.opcoes.json === true) {
|
|
1964
|
+
console.log(JSON.stringify(r, null, 2));
|
|
1965
|
+
return r.acao === 'recusada' ? 1 : 0;
|
|
1966
|
+
}
|
|
1967
|
+
for (const linha of (0, ship_publicar_1.linhasDaPublicacao)(r))
|
|
1968
|
+
console.log(linha);
|
|
1969
|
+
return r.acao === 'recusada' ? 1 : 0;
|
|
1970
|
+
}
|
|
1971
|
+
/** RM-059 (F7, T7.1): `ork ship pista [<thread>]`, as etapas da entrega e o proximo passo que o nucleo declara. */
|
|
1972
|
+
function comandoShipPista(carregado, args) {
|
|
1973
|
+
const p = (0, locale_1.msg)().ship.publicar;
|
|
1974
|
+
if (args.posicionais.length > 3) {
|
|
1975
|
+
console.error(p.usoPista);
|
|
1976
|
+
return 2;
|
|
1977
|
+
}
|
|
1978
|
+
if (args.opcoes.remoto !== undefined)
|
|
1979
|
+
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
1980
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_publicar_1.pistaDeEntrega)(carregado, { remoto: texto(args.opcoes.remoto), thread: args.posicionais[2] }));
|
|
1981
|
+
if (args.opcoes.json === true) {
|
|
1982
|
+
console.log(JSON.stringify(r, null, 2));
|
|
1983
|
+
return 0;
|
|
1984
|
+
}
|
|
1985
|
+
console.log(p.cabecalhoPista((0, horario_1.formatarDataHora)(r.lidoEm), r.remoto, r.base));
|
|
1986
|
+
if (!r.remotoLido)
|
|
1987
|
+
console.log(p.remotoNaoRespondeu(r.remoto));
|
|
1988
|
+
if (!r.prsLidos)
|
|
1989
|
+
console.log(p.prsNaoResponderam((0, locale_1.remontar)(r.prsNaoLidos ?? '-')));
|
|
1990
|
+
if (!r.pistas.length)
|
|
1991
|
+
console.log(p.semPistas);
|
|
1992
|
+
for (const pista of r.pistas) {
|
|
1993
|
+
console.log('');
|
|
1994
|
+
console.log(p.linhaDaThread(pista.thread, pista.tag, pista.branch));
|
|
1995
|
+
console.log(` ${pista.etapas.map((e) => `${p.nomeDaEtapa(e.id)} ${p.marcaDaEtapa(e.estado)}`).join(' | ')}`);
|
|
1996
|
+
for (const e of pista.etapas.filter((x) => x.estado !== 'feita' && x.estado !== 'nao-se-aplica')) {
|
|
1997
|
+
console.log(` ${p.nomeDaEtapa(e.id)}: ${(0, locale_1.remontar)(e.texto)}`);
|
|
1998
|
+
}
|
|
1999
|
+
console.log(p.linhaDoProximo((0, locale_1.remontar)(pista.proximo.texto), pista.proximo.comando));
|
|
2000
|
+
}
|
|
2001
|
+
return 0;
|
|
2002
|
+
}
|
|
2063
2003
|
function comandoShip(args) {
|
|
2064
2004
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2005
|
+
const m = (0, locale_1.msg)().ship;
|
|
2006
|
+
if (args.posicionais[1] === 'publicar')
|
|
2007
|
+
return comandoShipPublicar(carregado, args);
|
|
2008
|
+
if (args.posicionais[1] === 'pista')
|
|
2009
|
+
return comandoShipPista(carregado, args);
|
|
2065
2010
|
if (args.posicionais[1] === 'registrar-pr') {
|
|
2066
2011
|
// I-57 (RM-008): a entrega feita por PR vira ship_done, provada no remoto e no CI.
|
|
2067
2012
|
const alvo = args.posicionais[2];
|
|
@@ -2069,7 +2014,7 @@ function comandoShip(args) {
|
|
|
2069
2014
|
// RM-037 (defeito 5): PR mesclado em repositorio externo declarado em ci.external_repositories.
|
|
2070
2015
|
const repo = texto(args.opcoes.repo), numeroDoPr = texto(args.opcoes.pr);
|
|
2071
2016
|
if ((!alvo && args.opcoes.todas !== true) || (!!repo !== !!numeroDoPr) || (repo && !alvo)) {
|
|
2072
|
-
console.error(
|
|
2017
|
+
console.error(m.usoRegistrarPr);
|
|
2073
2018
|
return 2;
|
|
2074
2019
|
}
|
|
2075
2020
|
// RM-047: o `--remoto` da linha de comando so chega ao git como nome de remoto (ship.remoto-invalido).
|
|
@@ -2077,27 +2022,29 @@ function comandoShip(args) {
|
|
|
2077
2022
|
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
2078
2023
|
// RM-037 (fatia 3, defeito 6): o `--dry-run` era ignorado, e o ensaio gravava o ship_done de verdade.
|
|
2079
2024
|
const dryRun = args.opcoes['dry-run'] === true;
|
|
2080
|
-
|
|
2081
|
-
|
|
2025
|
+
// RM-061 (F2b, G2): o ship_done e o motivo nascem em pt-BR; so a impressao segue o locale.
|
|
2026
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => alvo && repo
|
|
2027
|
+
? [(0, entrega_pr_1.registrarEntregaExternaPorPr)(carregado, alvo, { repositorio: repo, pr: Number(numeroDoPr), dryRun })]
|
|
2028
|
+
: alvo ? [(0, entrega_pr_1.registrarEntregaPorPr)(carregado, alvo, { remoto, dryRun })] : (0, entrega_pr_1.registrarEntregasPorPr)(carregado, { remoto, dryRun }));
|
|
2082
2029
|
if (args.opcoes.json === true) {
|
|
2083
2030
|
console.log(JSON.stringify(r, null, 2));
|
|
2084
2031
|
return r.some((x) => x.acao === 'recusada') ? 1 : 0;
|
|
2085
2032
|
}
|
|
2086
2033
|
if (dryRun)
|
|
2087
|
-
console.log(
|
|
2034
|
+
console.log(m.ensaio);
|
|
2088
2035
|
if (r.length === 0)
|
|
2089
|
-
console.log(
|
|
2036
|
+
console.log(m.nenhumaComMerge);
|
|
2090
2037
|
for (const x of r)
|
|
2091
|
-
console.log(
|
|
2038
|
+
console.log(m.linhaDoRegistro(x.thread, m.acoes[x.acao] ?? x.acao, (0, locale_1.remontar)(x.motivo)));
|
|
2092
2039
|
// RM-044 (A3): a pagina que o push da base vai reprovar em docs.paridade.merge, com o comando que corrige.
|
|
2093
2040
|
// So aviso: nada e gravado e o codigo de saida nao muda.
|
|
2094
2041
|
const pendentes = r.flatMap((x) => x.docsPendentes.map((d) => ({ thread: x.thread, ...d })));
|
|
2095
2042
|
if (pendentes.length) {
|
|
2096
2043
|
console.log('');
|
|
2097
|
-
console.log(
|
|
2044
|
+
console.log(m.avisoDeDocs(pendentes.length));
|
|
2098
2045
|
for (const d of pendentes) {
|
|
2099
|
-
console.log(
|
|
2100
|
-
console.log(
|
|
2046
|
+
console.log(m.docPendente(d.id, d.arquivo, d.merge.slice(0, 7), d.thread, d.codigo));
|
|
2047
|
+
console.log(m.docPendenteComando(d.comando));
|
|
2101
2048
|
}
|
|
2102
2049
|
}
|
|
2103
2050
|
const registradas = r.filter((x) => x.acao === 'registrou').length;
|
|
@@ -2106,20 +2053,20 @@ function comandoShip(args) {
|
|
|
2106
2053
|
console.log('');
|
|
2107
2054
|
// RM-008 (03/10): o texto ensina a forma COM a thread. A forma sem thread fechava tambem as
|
|
2108
2055
|
// entregues de outras frentes paralelas, e era ela que os condutores copiavam daqui.
|
|
2109
|
-
console.log(
|
|
2056
|
+
console.log(m.registradas(registradas));
|
|
2110
2057
|
for (const x of r.filter((y) => y.acao === 'registrou'))
|
|
2111
2058
|
console.log(` ork master ${x.thread} --aceitar-omissao`);
|
|
2112
2059
|
}
|
|
2113
2060
|
if (registrariam) {
|
|
2114
2061
|
console.log('');
|
|
2115
|
-
console.log(
|
|
2062
|
+
console.log(m.registrariam(registrariam));
|
|
2116
2063
|
}
|
|
2117
2064
|
return r.some((x) => x.acao === 'recusada') ? 1 : 0;
|
|
2118
2065
|
}
|
|
2119
2066
|
const id = args.posicionais[1];
|
|
2120
2067
|
const para = texto(args.opcoes.para) ?? texto(args.opcoes.to);
|
|
2121
2068
|
if (!id || !para) {
|
|
2122
|
-
console.error(
|
|
2069
|
+
console.error(m.uso);
|
|
2123
2070
|
return 2;
|
|
2124
2071
|
}
|
|
2125
2072
|
// RM-047: como no registrar-pr, o `--remoto` so chega ao git como nome de remoto (ship.remoto-invalido),
|
|
@@ -2127,7 +2074,8 @@ function comandoShip(args) {
|
|
|
2127
2074
|
if (args.opcoes.remoto !== undefined)
|
|
2128
2075
|
(0, branch_de_estado_1.exigirRemoto)(args.opcoes.remoto, 'ship');
|
|
2129
2076
|
const autorizar = args.opcoes['autorizar-push'];
|
|
2130
|
-
|
|
2077
|
+
// RM-061 (F2b, G2): o que o ship grava (ledger, verificacao, mensagem do merge) nasce em pt-BR.
|
|
2078
|
+
const r = (0, locale_1.comLocale)('pt-BR', () => (0, ship_1.ship)(carregado, id, {
|
|
2131
2079
|
para,
|
|
2132
2080
|
de: texto(args.opcoes.de),
|
|
2133
2081
|
remoto: texto(args.opcoes.remoto),
|
|
@@ -2135,10 +2083,28 @@ function comandoShip(args) {
|
|
|
2135
2083
|
dryRun: args.opcoes['dry-run'] === true,
|
|
2136
2084
|
autorizarPush: typeof autorizar === 'string' ? autorizar : undefined,
|
|
2137
2085
|
semPush: args.opcoes['sem-push'] === true,
|
|
2138
|
-
|
|
2086
|
+
// RM-058 N2 (A1 da rodada 2 do CHECK): o `--esperar` chega à fila pesada da verificação do ship, com aviso.
|
|
2087
|
+
...((f) => ({ esperarFilaPesadaMs: f.esperarMs, avisoDaFilaPesada: { aoEsperar: f.aoEsperar, comandoDeEsperar: f.comandoDeEsperar } }))(filaPesadaDoCli(args, 'verify', `ork ship ${id} --para ${para} --esperar 30`)),
|
|
2088
|
+
}));
|
|
2139
2089
|
console.log((0, ship_1.textoDoShip)(r));
|
|
2140
2090
|
return r.ok ? 0 : 1;
|
|
2141
2091
|
}
|
|
2092
|
+
/**
|
|
2093
|
+
* RM-043 (sobra achada na RM-044): opcoes que o `portfolio show` herdou do `objective`,
|
|
2094
|
+
* aposentado na I-43. A ajuda as listava e o `parseArgs` as aceitava, mas o `show` nunca as
|
|
2095
|
+
* leu: eram ignoradas em silencio. A recusa e tipada e diz para onde ir, como a do
|
|
2096
|
+
* `objective.aposentado`.
|
|
2097
|
+
*/
|
|
2098
|
+
const SOBRAS_DO_OBJECTIVE = ['constraints', 'outcomes', 'threads', 'execution-runtime', 'validation-runtimes'];
|
|
2099
|
+
function recusarSobraDoObjective(opcao) {
|
|
2100
|
+
console.error(`portfolio.opcao-aposentada: --${opcao} era do Objective Envelope, aposentado na I-43, e o\n` +
|
|
2101
|
+
' portfolio show nunca a leu. As duas vigas do envelope viraram propriedade de thread comum:\n' +
|
|
2102
|
+
' ork thread new "<nome>" --modo <MODO> --exige-runtime-diferente\n' +
|
|
2103
|
+
' o CHECK precisa de runtime que o GO nao usou\n' +
|
|
2104
|
+
' ork thread new "<nome>" --modo <MODO> --done "<criterio> :: <comando>"\n' +
|
|
2105
|
+
' criterio de pronto EXECUTAVEL, que vira claim e roda no ork verify');
|
|
2106
|
+
return 2;
|
|
2107
|
+
}
|
|
2142
2108
|
function comandoPortfolio(args) {
|
|
2143
2109
|
const root = (0, manifest_1.exigirManifesto)().raiz;
|
|
2144
2110
|
const sub = args.posicionais[1] ?? 'list';
|
|
@@ -2166,6 +2132,9 @@ function comandoPortfolio(args) {
|
|
|
2166
2132
|
return 0;
|
|
2167
2133
|
}
|
|
2168
2134
|
if (sub === 'show') {
|
|
2135
|
+
const sobra = SOBRAS_DO_OBJECTIVE.find((opcao) => args.opcoes[opcao] !== undefined);
|
|
2136
|
+
if (sobra)
|
|
2137
|
+
return recusarSobraDoObjective(sobra);
|
|
2169
2138
|
const id = args.posicionais[2];
|
|
2170
2139
|
if (!id) {
|
|
2171
2140
|
console.error('uso: ork portfolio show <id>');
|
|
@@ -2455,6 +2424,9 @@ const CONTRATO_DO_BOARD = 'ork.board/v1';
|
|
|
2455
2424
|
function comandoFabrica(args) {
|
|
2456
2425
|
const carregado = (0, manifest_1.exigirManifesto)();
|
|
2457
2426
|
const sub = args.posicionais[1];
|
|
2427
|
+
// RM-063 (F1): a batida e do crontab desta maquina; nao le nem escreve o remoto.
|
|
2428
|
+
if (sub === 'batida')
|
|
2429
|
+
return comandoDaBatida(carregado, args);
|
|
2458
2430
|
// RM-047: o remoto vem do manifesto de quem fez o repositorio; fora do formato, recusa antes do git.
|
|
2459
2431
|
// O `publicar` recusa dentro do try (publicarMaquina), para o silencioso deixar a recusa no log.
|
|
2460
2432
|
const remoto = texto(args.opcoes.remoto) ?? carregado.manifesto.fabrica.remoto;
|
|
@@ -2478,6 +2450,9 @@ function comandoFabrica(args) {
|
|
|
2478
2450
|
: `Fabrica: retrato de ${r.maquina} igual ao ultimo publicado; nada a enviar (use --forcar para publicar mesmo assim).`);
|
|
2479
2451
|
if (!(0, maquina_1.fabricaCompartilhada)(carregado.manifesto) && !silencioso) {
|
|
2480
2452
|
console.log(' esta maquina nao entrou na fabrica compartilhada: so publica quando voce pede (ork fabrica entrar liga).');
|
|
2453
|
+
// RM-047 (P5): o manifesto que pede a fabrica nao liga a publicacao desta maquina.
|
|
2454
|
+
if (carregado.manifesto.fabrica.compartilhada)
|
|
2455
|
+
console.log(' o orkastery.yaml pede a fabrica compartilhada; quem liga e a maquina, com ork fabrica entrar.');
|
|
2481
2456
|
}
|
|
2482
2457
|
return 0;
|
|
2483
2458
|
}
|
|
@@ -2511,13 +2486,14 @@ function comandoFabrica(args) {
|
|
|
2511
2486
|
console.log(`Fabrica: ${(0, maquina_1.nomeDaMaquina)()} saiu; nada mais e publicado daqui.` +
|
|
2512
2487
|
(r ? ` Retrato removido de ork/fabrica-estado (${r.slice(0, 7)}).` : ' Nao havia retrato desta maquina na branch.'));
|
|
2513
2488
|
if ((0, maquina_1.fabricaCompartilhada)(carregado.manifesto))
|
|
2514
|
-
console.log(' AVISO:
|
|
2489
|
+
console.log(' AVISO: ORK_FABRICA_COMPARTILHADA=1 neste shell ainda liga a fabrica aqui.');
|
|
2515
2490
|
void config;
|
|
2516
2491
|
return 0;
|
|
2517
2492
|
}
|
|
2518
2493
|
if (sub !== undefined && sub !== 'list') {
|
|
2519
2494
|
console.error(`subcomando desconhecido: fabrica ${sub}`);
|
|
2520
|
-
console.error('uso: ork fabrica [--json] [--sem-remoto] | fabrica publicar [--forcar] [--json] | fabrica entrar [--maquina NOME] | fabrica sair'
|
|
2495
|
+
console.error('uso: ork fabrica [--json] [--sem-remoto] | fabrica publicar [--forcar] [--json] | fabrica entrar [--maquina NOME] | fabrica sair' +
|
|
2496
|
+
' | fabrica batida [status|instalar|remover] [--por Q] [--json]');
|
|
2521
2497
|
return 2;
|
|
2522
2498
|
}
|
|
2523
2499
|
// RM-052: a fabrica le a branch de UM projeto, no remoto dele; o cabecalho diz qual e o que ficou de fora.
|
|
@@ -2538,8 +2514,34 @@ function comandoFabrica(args) {
|
|
|
2538
2514
|
console.log(url === null
|
|
2539
2515
|
? `Fabrica: o projeto ${carregado.manifesto.project.name} nao tem o remoto ${remoto}; nada foi lido de ork/fabrica-estado.`
|
|
2540
2516
|
: (0, fabrica_estado_1.textoDaFabrica)(painel, (0, maquina_1.nomeDaMaquina)()));
|
|
2517
|
+
// RM-047 (P5): o manifesto pede a fabrica, mas quem liga a publicacao e a maquina.
|
|
2518
|
+
const pedida = (0, maquina_1.avisoDaFabricaPedida)(carregado.manifesto);
|
|
2519
|
+
if (pedida)
|
|
2520
|
+
console.log(`\n${pedida}`);
|
|
2541
2521
|
return 0;
|
|
2542
2522
|
}
|
|
2523
|
+
/**
|
|
2524
|
+
* RM-063 (F1): `ork fabrica batida` instala, mostra e remove a batida da varredura do pulse no crontab desta
|
|
2525
|
+
* maquina. `status` sai 0 com a batida instalada e 1 sem ela (ou sem crontab legivel); `instalar` e
|
|
2526
|
+
* `remover` gravam o evento no ledger da maquina quando o crontab muda.
|
|
2527
|
+
*/
|
|
2528
|
+
function comandoDaBatida(carregado, args) {
|
|
2529
|
+
const acao = args.posicionais[2] ?? 'status';
|
|
2530
|
+
const json = args.opcoes.json === true;
|
|
2531
|
+
if (acao === 'status') {
|
|
2532
|
+
const estado = (0, fabrica_batida_1.estadoDaBatida)(carregado.raiz);
|
|
2533
|
+
console.log(json ? JSON.stringify(estado, null, 2) : (0, fabrica_batida_1.textoDoEstadoDaBatida)(estado));
|
|
2534
|
+
return estado.leitura.ok && estado.instalada ? 0 : 1;
|
|
2535
|
+
}
|
|
2536
|
+
if ((acao === 'instalar' || acao === 'remover') && args.posicionais.length === 3) {
|
|
2537
|
+
const por = texto(args.opcoes.por);
|
|
2538
|
+
const r = acao === 'instalar' ? (0, fabrica_batida_1.instalarBatida)(carregado.raiz, { por }) : (0, fabrica_batida_1.removerBatida)(carregado.raiz, { por });
|
|
2539
|
+
console.log(json ? JSON.stringify(r, null, 2) : (0, fabrica_batida_1.textoDoResultadoDaBatida)(r));
|
|
2540
|
+
return 0;
|
|
2541
|
+
}
|
|
2542
|
+
console.error('uso: ork fabrica batida [status|instalar|remover] [--por Q] [--json]');
|
|
2543
|
+
return 2;
|
|
2544
|
+
}
|
|
2543
2545
|
/**
|
|
2544
2546
|
* RM-053: `ork network` e a Orkastery Network, as maquinas de uma pessoa em rede. Roda de qualquer
|
|
2545
2547
|
* diretorio, com ou sem projeto: a rede e da pessoa, nao de um repositorio. O projeto do diretorio
|
|
@@ -2805,8 +2807,9 @@ function comandoMaster(args) {
|
|
|
2805
2807
|
const id = args.posicionais[2];
|
|
2806
2808
|
const formato = texto(args.opcoes.formato) ?? 'telegram';
|
|
2807
2809
|
if (!id || !['telegram', 'terminal', 'json'].includes(formato))
|
|
2808
|
-
throw new Error(
|
|
2809
|
-
|
|
2810
|
+
throw new Error((0, locale_1.msg)().master.usoPedir);
|
|
2811
|
+
// RM-061 (F2b, G2): o pedido de nota e gravado no escopo pt-BR; o erro da entrega volta no locale do comando.
|
|
2812
|
+
const pedido = (0, locale_1.comLocale)('pt-BR', () => (0, master_nota_1.pedirNota)(carregado.raiz, id, { codigosEmUso: (0, pulse_resposta_1.codigosEmUso)(carregado.raiz) }));
|
|
2810
2813
|
console.log(formato === 'json' ? JSON.stringify(pedido, null, 2) : (0, master_nota_1.textoDoPedidoDeNota)(carregado.raiz, pedido, formato));
|
|
2811
2814
|
return 0;
|
|
2812
2815
|
}
|
|
@@ -2952,7 +2955,7 @@ function comandoAceitarOmissao(args, raiz, posicional) {
|
|
|
2952
2955
|
const candidatos = [posicional, texto(args.opcoes.thread), typeof bruto === 'string' ? bruto : undefined]
|
|
2953
2956
|
.filter((v) => typeof v === 'string' && v.trim() !== '').map((v) => v.trim());
|
|
2954
2957
|
if (args.opcoes.thread === true || new Set(candidatos).size > 1) {
|
|
2955
|
-
console.error(
|
|
2958
|
+
console.error((0, locale_1.msg)().master.usoOmissao);
|
|
2956
2959
|
return 2;
|
|
2957
2960
|
}
|
|
2958
2961
|
const alvo = candidatos[0];
|
|
@@ -2974,32 +2977,35 @@ function comandoAceitarOmissao(args, raiz, posicional) {
|
|
|
2974
2977
|
console.log(JSON.stringify({ dryRun: true, fecharia }, null, 2));
|
|
2975
2978
|
return 0;
|
|
2976
2979
|
}
|
|
2977
|
-
|
|
2980
|
+
const m = (0, locale_1.msg)().master;
|
|
2981
|
+
console.log(m.ensaio);
|
|
2978
2982
|
if (fecharia.length === 0) {
|
|
2979
|
-
console.log(
|
|
2983
|
+
console.log(m.nadaEsperando);
|
|
2980
2984
|
return 0;
|
|
2981
2985
|
}
|
|
2982
|
-
console.log(
|
|
2986
|
+
console.log(m.fecharia(fecharia.length));
|
|
2983
2987
|
for (const f of fecharia)
|
|
2984
|
-
console.log(
|
|
2988
|
+
console.log(m.linhaDoIndice(f.thread, f.indice.valor, f.indice.base));
|
|
2985
2989
|
avisoDeOmissaoSemAlvo(alvo, fecharia.length, true);
|
|
2986
2990
|
return 0;
|
|
2987
2991
|
}
|
|
2988
|
-
|
|
2992
|
+
// RM-061 (F2b, G2): o MASTER log, o POSTMORTEM e o registro da omissao nascem em pt-BR.
|
|
2993
|
+
const aceitos = (0, locale_1.comLocale)('pt-BR', () => (0, master_2.aceitarPendentesPorOmissao)(raiz, { thread: alvo }));
|
|
2989
2994
|
avisoDeOmissaoSemAlvo(alvo, aceitos.length, false);
|
|
2990
2995
|
if (json) {
|
|
2991
2996
|
console.log(JSON.stringify(aceitos, null, 2));
|
|
2992
2997
|
return 0;
|
|
2993
2998
|
}
|
|
2999
|
+
const m = (0, locale_1.msg)().master;
|
|
2994
3000
|
if (aceitos.length === 0) {
|
|
2995
|
-
console.log(
|
|
3001
|
+
console.log(m.nadaEsperando);
|
|
2996
3002
|
return 0;
|
|
2997
3003
|
}
|
|
2998
|
-
console.log(
|
|
3004
|
+
console.log(m.aceitas(aceitos.length));
|
|
2999
3005
|
for (const a of aceitos)
|
|
3000
|
-
console.log(
|
|
3006
|
+
console.log(m.linhaDoIndice(a.thread, a.indice.valor, a.indice.base));
|
|
3001
3007
|
console.log('');
|
|
3002
|
-
console.log(
|
|
3008
|
+
console.log(m.discordou);
|
|
3003
3009
|
return 0;
|
|
3004
3010
|
}
|
|
3005
3011
|
/**
|
|
@@ -3015,10 +3021,8 @@ function avisoDeOmissaoSemAlvo(alvo, quantas, ensaio) {
|
|
|
3015
3021
|
return;
|
|
3016
3022
|
const propria = (process.env[runtime_ambiente_1.ENV_THREAD_DO_DESPACHO] ?? '').trim();
|
|
3017
3023
|
console.error('');
|
|
3018
|
-
console.error(
|
|
3019
|
-
|
|
3020
|
-
console.error(` Para fechar so a sua: ork master ${propria || '<thread-id>'} --aceitar-omissao` +
|
|
3021
|
-
(ensaio ? '' : ' (a nota humana sobrescreve o aceite de quem nao era seu)'));
|
|
3024
|
+
console.error((0, locale_1.msg)().master.avisoSemThread(marca, ensaio, quantas));
|
|
3025
|
+
console.error((0, locale_1.msg)().master.avisoSoASua(propria || '<thread-id>', ensaio));
|
|
3022
3026
|
}
|
|
3023
3027
|
/** I-55 (RM-008): `ork licoes` mostra o que volta no proximo GOAL e PLAN, e as propostas de policy. */
|
|
3024
3028
|
function comandoLicoes(args) {
|
|
@@ -3057,9 +3061,26 @@ function comandoRoadmap(args) {
|
|
|
3057
3061
|
: soltas.map((s) => `${s.item}: ${s.detalhe} (thread fechada ${s.thread})`).join('\n'));
|
|
3058
3062
|
return 0;
|
|
3059
3063
|
}
|
|
3060
|
-
|
|
3064
|
+
// RM-052 (fatia 2, D4): as reservas moram no remoto do projeto. Sem ele, nada e lido; com ele mudo e
|
|
3065
|
+
// sem copia, tambem nao. A resposta diz qual projeto leu e o que ficou de fora, nunca "nenhum item".
|
|
3066
|
+
// RM-047: nome fora do formato de remoto recusa antes do git, como sempre.
|
|
3067
|
+
const nomeDoRemoto = (0, branch_de_estado_1.exigirRemoto)(remoto ?? roadmap_reservas_1.REMOTO_PADRAO, 'roadmap');
|
|
3068
|
+
const url = (0, projeto_alvo_1.remotoDoProjeto)(carregado.raiz, nomeDoRemoto);
|
|
3069
|
+
const painel = url === null ? { reservas: [], feats: [], atualizado: false, ponta: null }
|
|
3070
|
+
: (0, roadmap_reservas_1.listarReservas)(carregado.raiz, { remoto });
|
|
3071
|
+
const leitura = (0, roadmap_reservas_1.leituraDasReservas)(painel, url !== null);
|
|
3061
3072
|
const orfas = (0, roadmap_reservas_1.reservasOrfas)(carregado.raiz, painel.reservas);
|
|
3062
|
-
|
|
3073
|
+
const lido = leitura === 'lido-agora' || leitura === 'copia-local';
|
|
3074
|
+
const consulta = (0, projeto_alvo_1.consultaDoProjeto)(carregado, {
|
|
3075
|
+
remoto: url,
|
|
3076
|
+
lido: lido ? [`reservas do roadmap (${roadmap_reservas_1.BRANCH_DE_RESERVAS} em ${nomeDoRemoto}, ${leitura === 'lido-agora' ? 'lido agora' : 'última cópia local'})`] : [],
|
|
3077
|
+
naoLido: [projeto_alvo_1.FORA_DA_CONSULTA.roadmap,
|
|
3078
|
+
...(leitura === 'sem-remoto' ? [`reservas do roadmap: o projeto não tem o remoto ${nomeDoRemoto}, nada foi lido de ${roadmap_reservas_1.BRANCH_DE_RESERVAS}`]
|
|
3079
|
+
: leitura === 'sem-copia' ? [`reservas do roadmap: o remoto ${nomeDoRemoto} não respondeu e não há cópia local de ${roadmap_reservas_1.BRANCH_DE_RESERVAS}`]
|
|
3080
|
+
: [])],
|
|
3081
|
+
});
|
|
3082
|
+
console.log(args.opcoes.json === true ? JSON.stringify({ ...painel, orfas, leitura, consulta }, null, 2)
|
|
3083
|
+
: [...(0, projeto_alvo_1.linhasDaConsulta)(consulta), '', (0, roadmap_reservas_1.textoDasReservas)(painel, orfas, { remoto: nomeDoRemoto, projeto: carregado.manifesto.project.name, temRemoto: url !== null })].join('\n'));
|
|
3063
3084
|
return 0;
|
|
3064
3085
|
}
|
|
3065
3086
|
if (sub === 'status') {
|
|
@@ -3067,7 +3088,11 @@ function comandoRoadmap(args) {
|
|
|
3067
3088
|
// RM-052: com o projeto consultado e o que ficou de fora (as outras maquinas nao sao lidas aqui).
|
|
3068
3089
|
const consulta = (0, projeto_alvo_1.consultaDoProjeto)(carregado, { lido: ['roadmap (docs/roadmap)', projeto_alvo_1.FORA_DA_CONSULTA.threadsDaMaquina],
|
|
3069
3090
|
naoLido: [projeto_alvo_1.FORA_DA_CONSULTA.reservas, 'threads de outras máquinas (ork network roadmap)'] });
|
|
3070
|
-
|
|
3091
|
+
// RM-061 (F2b, G2): o status e montado em pt-BR, como o --json; so o texto segue o locale. Os canais (Hermes,
|
|
3092
|
+
// OpenClaw) transportam o texto: com owner.language ou LANG en no host, o dono o recebe em ingles.
|
|
3093
|
+
// RM-063 (F2): o fecho le a mesma fila do `ork pulse`, sem forja e sem registrar.
|
|
3094
|
+
const status = (0, locale_1.comLocale)('pt-BR', () => (0, roadmap_status_1.montarStatusDoRoadmap)(carregado.raiz, { projeto: carregado.manifesto.project.name, consulta,
|
|
3095
|
+
fila: (quando) => (0, pulse_1.filaDoDono)(carregado, { quando }) }));
|
|
3071
3096
|
console.log(args.opcoes.json === true ? JSON.stringify(status, null, 2) : (0, roadmap_status_1.textoDoStatusDoRoadmap)(status));
|
|
3072
3097
|
return 0;
|
|
3073
3098
|
}
|
|
@@ -3190,11 +3215,13 @@ function comandoDocs(args) {
|
|
|
3190
3215
|
return 0;
|
|
3191
3216
|
}
|
|
3192
3217
|
if (sub === 'init') {
|
|
3193
|
-
|
|
3218
|
+
// RM-061 (F3a, D1 e D5): os sete arquivos nascem na lingua do dono, resolvida pelo manifesto (tambem com `--json`,
|
|
3219
|
+
// que tira so o texto impresso do locale); o texto segue o locale do comando coberto.
|
|
3220
|
+
const criados = (0, docs_1.iniciarDocs)(raiz, (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale);
|
|
3221
|
+
const m = (0, locale_1.msg)().gerados.docsInit;
|
|
3194
3222
|
console.log(criados.length === 0
|
|
3195
|
-
?
|
|
3196
|
-
: [
|
|
3197
|
-
'Proximo passo: copie docs/produto/_modelo-feature.md e docs/roadmap/_modelo-item.md, e rode ork docs verificar'].join('\n'));
|
|
3223
|
+
? m.jaEstava
|
|
3224
|
+
: [m.criado, ...criados.map((c) => ` ${c}`), '', m.proximoPasso].join('\n'));
|
|
3198
3225
|
return 0;
|
|
3199
3226
|
}
|
|
3200
3227
|
console.error(`uso: ork docs verificar [--json] [--pr] | sincronizar [--escrever] [--so RM-NNN] [--todos] | init`);
|
|
@@ -3250,12 +3277,18 @@ function comandoPrompt(args) {
|
|
|
3250
3277
|
return 2;
|
|
3251
3278
|
}
|
|
3252
3279
|
const thread = (0, thread_1.lerThread)(obrigatorio.raiz, threadId);
|
|
3280
|
+
// RM-059 (T6.0): sem --pedido, o pedido guardado na criacao, conferido pelo sha256; thread sem pedido
|
|
3281
|
+
// guardado segue com o texto de exemplo, como antes.
|
|
3282
|
+
const guardado = texto(args.opcoes.pedido) === undefined ? (0, thread_1.pedidoDaThread)(obrigatorio.raiz, thread) : null;
|
|
3283
|
+
const pedidoDaFase = guardado?.texto ?? pedido;
|
|
3253
3284
|
const template = idTemplate ? (0, prompts_1.exigirTemplate)(idTemplate, obrigatorio.raiz) : (0, prompts_1.templateDaFase)(fase, obrigatorio.raiz);
|
|
3254
3285
|
const prompt = idTemplate
|
|
3255
|
-
? (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(thread, fase,
|
|
3256
|
-
: (0, phase_1.montarPrompt)(thread, fase,
|
|
3286
|
+
? (0, prompts_1.renderizar)(template, (0, phase_1.valoresDoPrompt)(thread, fase, pedidoDaFase))
|
|
3287
|
+
: (0, phase_1.montarPrompt)(thread, fase, pedidoDaFase, obrigatorio.raiz);
|
|
3257
3288
|
console.log(`# template ${template.id} v${template.versao} (origem: ${template.origem})`);
|
|
3258
3289
|
console.log(`# thread ${thread.id}, fase ${fase}, sha256 ${(0, phase_1.hashDoPrompt)(prompt)}`);
|
|
3290
|
+
if (guardado)
|
|
3291
|
+
console.log(`# pedido guardado na criacao da thread (sha256 ${(0, util_1.shaCurto)(guardado.sha256)})`);
|
|
3259
3292
|
console.log('');
|
|
3260
3293
|
console.log(prompt);
|
|
3261
3294
|
return 0;
|
|
@@ -3327,6 +3360,8 @@ function comandoAdapter(args) {
|
|
|
3327
3360
|
// unico caminho de saida. `;` separa varios, como o resto do CLI ja faz.
|
|
3328
3361
|
aceitarCatalogo: (texto(args.opcoes['aceitar-catalogo']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
|
|
3329
3362
|
manterCopia: (texto(args.opcoes['manter-copia']) ?? '').split(';').map(x => x.trim()).filter(Boolean),
|
|
3363
|
+
// RM-061 (F3a, D1 e D9): o bloco da experiência nasce na língua do dono; o texto impresso segue em pt-BR (F3b).
|
|
3364
|
+
locale: (0, locale_1.resolverLocale)(carregado?.manifesto.owner?.language).locale,
|
|
3330
3365
|
});
|
|
3331
3366
|
console.log((0, hosts_1.textoDaInstalacao)(r));
|
|
3332
3367
|
return r.ok ? 0 : 2;
|
|
@@ -3341,7 +3376,8 @@ function comandoAdapter(args) {
|
|
|
3341
3376
|
* de zero em qualquer falha, para o CI do kit poder barrar merge sem eval.
|
|
3342
3377
|
*/
|
|
3343
3378
|
function comandoEval(args) {
|
|
3344
|
-
|
|
3379
|
+
// RM-047 (P4): o eval so executa o catalogo do proprio pacote, nunca o achado a partir do cwd.
|
|
3380
|
+
const catalogo = (0, catalogo_1.exigirCatalogoDoPacote)((0, manifest_1.carregarManifesto)()?.raiz ?? (0, manifest_1.diretorioDoProjeto)());
|
|
3345
3381
|
const lista = (v) => {
|
|
3346
3382
|
const t = texto(v);
|
|
3347
3383
|
return t ? t.split(',').map((x) => x.trim()).filter(Boolean) : undefined;
|
|
@@ -3492,6 +3528,9 @@ function comandoAudit(args) {
|
|
|
3492
3528
|
return 0;
|
|
3493
3529
|
}
|
|
3494
3530
|
if (sub === 'show') {
|
|
3531
|
+
const sobra = SOBRAS_DO_OBJECTIVE.find((opcao) => args.opcoes[opcao] !== undefined);
|
|
3532
|
+
if (sobra)
|
|
3533
|
+
return recusarSobraDoObjective(sobra);
|
|
3495
3534
|
const id = args.posicionais[2];
|
|
3496
3535
|
if (!id) {
|
|
3497
3536
|
console.error('uso: ork audit show <rodada> [--ledger]');
|
|
@@ -3740,8 +3779,9 @@ function comandoAudit(args) {
|
|
|
3740
3779
|
* que sempre teve. E o que garante que ligar o B6 nao muda o que o builder ja conhece.
|
|
3741
3780
|
*/
|
|
3742
3781
|
function relatarPublicacao(r) {
|
|
3782
|
+
const m = (0, locale_1.msg)().thread;
|
|
3743
3783
|
if (r.publicacao?.estado === 'pendente') {
|
|
3744
|
-
console.log(
|
|
3784
|
+
console.log(m.publicacaoPendente(`${r.publicacao.motivo}`));
|
|
3745
3785
|
return;
|
|
3746
3786
|
}
|
|
3747
3787
|
if (r.regime !== 'orkmind')
|
|
@@ -3754,9 +3794,9 @@ function relatarPublicacao(r) {
|
|
|
3754
3794
|
r.roadmap?.ok ? '1 roadmap' : '',
|
|
3755
3795
|
].filter((t) => t !== '');
|
|
3756
3796
|
console.log('');
|
|
3757
|
-
console.log(
|
|
3797
|
+
console.log(m.memoriaGravada(`${r.estado.tenant}`, gravados.join(', ') || m.nadaAGravar));
|
|
3758
3798
|
if (r.falhas > 0)
|
|
3759
|
-
console.log(
|
|
3799
|
+
console.log(m.gravacoesFalhas(r.falhas));
|
|
3760
3800
|
}
|
|
3761
3801
|
/** Janela de origem e corte de apresentação são inteiros positivos explícitos. */
|
|
3762
3802
|
function limiteDeLeitura(valor) {
|
|
@@ -3996,7 +4036,7 @@ function avisoRoadmapSemAssociacao(nome, roadmap) {
|
|
|
3996
4036
|
const item = /\bRM-\d{3}\b/i.exec(nome)?.[0].toUpperCase();
|
|
3997
4037
|
if (!item || roadmap)
|
|
3998
4038
|
return null;
|
|
3999
|
-
return
|
|
4039
|
+
return (0, locale_1.msg)().thread.roadmapNoNome(item);
|
|
4000
4040
|
}
|
|
4001
4041
|
/**
|
|
4002
4042
|
* `ork memory search --texto` (I-38 D7): busca por significado, separada da busca por tag.
|
|
@@ -4088,24 +4128,58 @@ function extrairOpcaoDeProjeto(argv) {
|
|
|
4088
4128
|
}
|
|
4089
4129
|
/** Comandos que nao leem projeto: o alvo nao e resolvido (nem recusado) para eles. */
|
|
4090
4130
|
const COMANDOS_SEM_PROJETO = new Set(['demo', 'ciclos', 'mcp', 'init', 'projetos']);
|
|
4131
|
+
/**
|
|
4132
|
+
* Fatia 2 (D3): os comandos que leem projeto e nao terminam com a linha `Projeto consultado`. Hoje so
|
|
4133
|
+
* o `sessions event`, o sensor dos hooks do Claude Code: maquina falando com maquina, e o sensor compara
|
|
4134
|
+
* o stderr da recusa. O `maestro` declara no snapshot e nao passa por aqui.
|
|
4135
|
+
*/
|
|
4136
|
+
const SEM_DECLARACAO_DO_PROJETO = new Set(['sessions event']);
|
|
4091
4137
|
/**
|
|
4092
4138
|
* Comandos cujo `--projeto` e DELES (RM-054: `ork network roadmap --projeto github:dono/repo`, que
|
|
4093
4139
|
* le varios projetos). A opcao volta intacta ao argv do subcomando e o alvo global nao e resolvido:
|
|
4094
4140
|
* nem `--projeto`, nem `ORK_PROJETO`, nem o modo host escolhem um projeto por eles.
|
|
4095
4141
|
*/
|
|
4096
4142
|
exports.COMANDOS_COM_PROJETO_PROPRIO = new Set(['network']);
|
|
4097
|
-
/**
|
|
4098
|
-
|
|
4143
|
+
/**
|
|
4144
|
+
* Resolve e fixa o projeto-alvo do processo (D2, D3). `null`: vale o cwd de sempre. Fatia 2 (D3): com
|
|
4145
|
+
* `declarar`, o comando termina dizendo qual projeto leu, quando o leitor nao tem como saber.
|
|
4146
|
+
*/
|
|
4147
|
+
function fixarAlvoDoProcesso(projeto, declarar = true) {
|
|
4099
4148
|
const alvo = (0, projeto_alvo_1.resolverProjetoAlvo)({ opcao: projeto ?? null });
|
|
4100
4149
|
(0, projeto_alvo_1.fixarProjetoAlvo)(alvo);
|
|
4150
|
+
if (declarar)
|
|
4151
|
+
(0, projeto_alvo_1.pedirDeclaracaoDoProjeto)(alvo);
|
|
4101
4152
|
return alvo;
|
|
4102
4153
|
}
|
|
4154
|
+
/**
|
|
4155
|
+
* RM-052 (fatia 2, D3): o comando que leu um projeto que o leitor nao tem como adivinhar (no host, ou
|
|
4156
|
+
* fora do diretorio dele) escreve no fim a linha `Projeto consultado: ...` no stderr, salvo se ja montou
|
|
4157
|
+
* o proprio cabecalho. Quando ele falha, a linha sai antes da mensagem de erro, que a entrada imprime.
|
|
4158
|
+
*/
|
|
4103
4159
|
function main(argvBruto) {
|
|
4104
4160
|
// I-35: todo horário para pessoa sai no fuso do dono deste projeto (lido só se for preciso, e já
|
|
4105
4161
|
// depois de o projeto-alvo abaixo estar fixado: a fonte é preguiçosa).
|
|
4106
4162
|
(0, horario_1.registrarFonteDoFuso)(() => (0, horario_1.fusoDoManifesto)((0, manifest_1.carregarManifesto)()));
|
|
4107
4163
|
// RM-052: sem alvo herdado de uma chamada anterior no mesmo processo (os testes chamam `main` em serie).
|
|
4108
4164
|
(0, projeto_alvo_1.fixarProjetoAlvo)(null);
|
|
4165
|
+
// Prova de conceito do CLI por locale: cada chamada comeca em pt-BR; so os comandos cobertos trocam.
|
|
4166
|
+
(0, locale_1.ativarLocale)(undefined);
|
|
4167
|
+
// RM-061 (F2b, D1): e sem o registro dos textos remontaveis, que so os comandos cobertos ligam.
|
|
4168
|
+
(0, locale_1.ligarRemontagem)(false);
|
|
4169
|
+
(0, projeto_alvo_1.iniciarDeclaracaoDoProjeto)();
|
|
4170
|
+
try {
|
|
4171
|
+
return executarComando(argvBruto);
|
|
4172
|
+
}
|
|
4173
|
+
finally {
|
|
4174
|
+
// RM-061 (F2b): o registro dos textos remontaveis nao sobrevive a chamada (o locale sim: a entrada do CLI
|
|
4175
|
+
// ainda imprime o erro no locale do comando).
|
|
4176
|
+
(0, locale_1.ligarRemontagem)(false);
|
|
4177
|
+
const linha = (0, projeto_alvo_1.declaracaoQueFaltou)();
|
|
4178
|
+
if (linha)
|
|
4179
|
+
console.error(linha);
|
|
4180
|
+
}
|
|
4181
|
+
}
|
|
4182
|
+
function executarComando(argvBruto) {
|
|
4109
4183
|
const extraida = extrairOpcaoDeProjeto(argvBruto);
|
|
4110
4184
|
const proprio = exports.COMANDOS_COM_PROJETO_PROPRIO.has(parseArgs(extraida.argv).posicionais[0] ?? '');
|
|
4111
4185
|
const argv = proprio && extraida.projeto !== undefined
|
|
@@ -4132,8 +4206,9 @@ function main(argvBruto) {
|
|
|
4132
4206
|
if (argv[0] === 'maestro') {
|
|
4133
4207
|
if (argv.length === 2 && argv[1] === '--help')
|
|
4134
4208
|
return (0, maestro_cli_1.runMaestroCli)(argv.slice(1));
|
|
4135
|
-
// RM-052: o alvo explicito vira SELECAO entre as raizes permitidas; sem ele, o cwd de sempre.
|
|
4136
|
-
|
|
4209
|
+
// RM-052: o alvo explicito vira SELECAO entre as raizes permitidas; sem ele, o cwd de sempre. O
|
|
4210
|
+
// snapshot ja declara o projeto consultado (project.root, notConsulted): sem a linha da fatia 2.
|
|
4211
|
+
const alvo = fixarAlvoDoProcesso(projeto, false);
|
|
4137
4212
|
return alvo ? (0, maestro_cli_1.runMaestroCli)(argv.slice(1), alvo.raiz, { allowedRoots: [alvo.raiz], selected: alvo.raiz })
|
|
4138
4213
|
: (0, maestro_cli_1.runMaestroCli)(argv.slice(1));
|
|
4139
4214
|
}
|
|
@@ -4145,11 +4220,13 @@ function main(argvBruto) {
|
|
|
4145
4220
|
return 0;
|
|
4146
4221
|
}
|
|
4147
4222
|
if (!comando || args.opcoes.help === true || comando === 'help') {
|
|
4148
|
-
|
|
4223
|
+
(0, locale_1.ativarLocale)(localeDaAjuda(projeto));
|
|
4224
|
+
console.log((0, locale_1.msg)().ajuda.texto(dadosDaAjuda()));
|
|
4149
4225
|
return 0;
|
|
4150
4226
|
}
|
|
4151
|
-
if (!COMANDOS_SEM_PROJETO.has(comando) && !proprio)
|
|
4152
|
-
fixarAlvoDoProcesso(projeto);
|
|
4227
|
+
if (!COMANDOS_SEM_PROJETO.has(comando) && !proprio) {
|
|
4228
|
+
fixarAlvoDoProcesso(projeto, !SEM_DECLARACAO_DO_PROJETO.has(`${comando} ${args.posicionais[1] ?? ''}`.trim()));
|
|
4229
|
+
}
|
|
4153
4230
|
else if (projeto !== undefined && comando !== 'projetos') {
|
|
4154
4231
|
throw new Error(comando === 'init'
|
|
4155
4232
|
? 'uso: ork init cria o projeto no diretório atual; entre nele e rode ork init, sem --projeto'
|
|
@@ -4167,6 +4244,13 @@ function main(argvBruto) {
|
|
|
4167
4244
|
for (const nome of runtime_ambiente_1.ENVS_DE_PROVIDER_PAGO)
|
|
4168
4245
|
delete process.env[nome];
|
|
4169
4246
|
}
|
|
4247
|
+
// CLI por locale (RM-061, EN1 e EN7): a escolha do onboarding (owner.language) ou o LC_ALL/LC_MESSAGES/LANG
|
|
4248
|
+
// decidem a lingua do TEXTO dos comandos cobertos (`cobreLocale`); `--json` e contrato, e os recortes da D2
|
|
4249
|
+
// da F2a (`doctor --modo`, `thread new --from-finding` e os subcomandos fora da lista) ficam em pt-BR.
|
|
4250
|
+
if ((0, locale_1.cobreLocale)(args.posicionais, args.opcoes)) {
|
|
4251
|
+
(0, locale_1.ativarLocale)((0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale);
|
|
4252
|
+
(0, locale_1.ligarRemontagem)(true);
|
|
4253
|
+
}
|
|
4170
4254
|
switch (comando) {
|
|
4171
4255
|
case 'mcp': {
|
|
4172
4256
|
const projeto = texto(args.opcoes.project), host = texto(args.opcoes.host), threadId = texto(args.opcoes.thread);
|
|
@@ -4210,40 +4294,47 @@ function main(argvBruto) {
|
|
|
4210
4294
|
return r.prontoPrimeiroBloco ? 0 : 1;
|
|
4211
4295
|
}
|
|
4212
4296
|
// RM-031: o check dos analisadores do grafo entra por aqui, a porta da familia do grafo (fronteira do KG1).
|
|
4213
|
-
|
|
4297
|
+
// RM-061 (F2a): a redacao do check vem do catalogo, no locale do comando (a familia do grafo nao o importa).
|
|
4298
|
+
const r = (0, doctor_1.doctor)((0, manifest_1.diretorioDoProjeto)(), nomesHerdados, () => (0, intelligence_graph_cli_1.checarAnalisadoresDoGrafo)(versao_1.VERSAO_DO_ORK, undefined, undefined, (0, locale_1.msg)().doctor.grafo));
|
|
4214
4299
|
console.log(r.texto);
|
|
4215
4300
|
return r.codigo;
|
|
4216
4301
|
}
|
|
4217
4302
|
case 'init': {
|
|
4218
4303
|
(0, init_1.exigirRepositorioParaInit)(process.cwd());
|
|
4304
|
+
// RM-061 (F3a, D1 e D2): os arquivos nascem na lingua do dono no momento da geracao, resolvida pelo manifesto lido
|
|
4305
|
+
// antes do `--force` regrava-lo (o YAML e o AGENTS.md saem na mesma lingua) e independente do texto impresso, que
|
|
4306
|
+
// nao segue o locale com `--json` (GO-FIX do CHECK, W3).
|
|
4307
|
+
const localeDosArquivos = (0, locale_1.resolverLocale)(ambienteManifesto?.manifesto.owner?.language).locale;
|
|
4219
4308
|
const r = (0, init_1.init)(process.cwd(), {
|
|
4220
4309
|
force: args.opcoes.force === true,
|
|
4221
4310
|
nome: texto(args.opcoes.name) ?? texto(args.opcoes.nome),
|
|
4222
4311
|
abbrev: texto(args.opcoes.abbrev),
|
|
4312
|
+
locale: localeDosArquivos,
|
|
4223
4313
|
});
|
|
4224
4314
|
const carregado = (0, manifest_1.exigirManifesto)(r.deteccao.raiz);
|
|
4225
|
-
const agents = (0, agents_md_1.atualizarAgentsMd)(r.deteccao.raiz, carregado.manifesto);
|
|
4315
|
+
const agents = (0, agents_md_1.atualizarAgentsMd)(r.deteccao.raiz, carregado.manifesto, localeDosArquivos);
|
|
4226
4316
|
// RM-052 (D7): o projeto entra no registro desta maquina; falha vira aviso, nunca derruba o init.
|
|
4227
4317
|
const avisoDoRegistro = (0, projeto_alvo_1.registrarProjetoEmSilencio)(r.deteccao.raiz, 'init');
|
|
4228
4318
|
if (avisoDoRegistro)
|
|
4229
4319
|
console.error(avisoDoRegistro);
|
|
4320
|
+
const m = (0, locale_1.msg)().init, estadoAgents = m.estadosAgents[agents.estado] ?? agents.estado;
|
|
4230
4321
|
if (!r.criado) {
|
|
4231
|
-
console.log(
|
|
4232
|
-
console.log(
|
|
4233
|
-
console.log(
|
|
4322
|
+
console.log(m.jaExiste(r.caminho));
|
|
4323
|
+
console.log(m.nadaSobrescrito);
|
|
4324
|
+
console.log(m.agentsMd(estadoAgents, agents.caminho));
|
|
4234
4325
|
return 0;
|
|
4235
4326
|
}
|
|
4236
|
-
console.log(
|
|
4237
|
-
console.log(
|
|
4238
|
-
console.log(
|
|
4239
|
-
console.log(
|
|
4240
|
-
console.log(
|
|
4241
|
-
console.log(
|
|
4327
|
+
console.log(m.criado(r.caminho));
|
|
4328
|
+
console.log(m.projeto(r.deteccao.nome, r.deteccao.abbrev));
|
|
4329
|
+
console.log(m.branchBase(r.deteccao.baseBranch));
|
|
4330
|
+
console.log(m.gerenciador(r.deteccao.gerenciador));
|
|
4331
|
+
console.log(m.verify(Object.entries(r.deteccao.verify).map(([k, v]) => `${k}="${v}"`).join(', ') || m.semScript));
|
|
4332
|
+
console.log(m.agentsMdLinha(estadoAgents, agents.caminho));
|
|
4242
4333
|
// Fatia 2 do ensaio da 0.5.0 (P3): o estado fica fora do git por um `.gitignore` proprio.
|
|
4243
4334
|
if (r.estadoIgnorado)
|
|
4244
|
-
console.log(
|
|
4335
|
+
console.log(m.estado(manifest_1.DIR_ESTADO));
|
|
4245
4336
|
console.log('');
|
|
4246
|
-
console.log(
|
|
4337
|
+
console.log(m.proximoPasso);
|
|
4247
4338
|
return 0;
|
|
4248
4339
|
}
|
|
4249
4340
|
case 'modos': {
|
|
@@ -4311,16 +4402,17 @@ function main(argvBruto) {
|
|
|
4311
4402
|
}
|
|
4312
4403
|
if ((args.posicionais[1] ?? 'show') !== 'show' || args.posicionais.length > 2 ||
|
|
4313
4404
|
Object.keys(args.opcoes).some(k => k !== 'json') || ('json' in args.opcoes && args.opcoes.json !== true)) {
|
|
4314
|
-
throw Error(
|
|
4405
|
+
throw Error((0, locale_1.msg)().onboarding.experienciaUso);
|
|
4315
4406
|
}
|
|
4316
4407
|
const manifesto = (0, manifest_1.exigirManifesto)(), p = (0, experiencia_1.resolverExperiencia)(manifesto.manifesto.owner);
|
|
4317
4408
|
// Preferência inválida vale o padrão e faz o adapter install pular o pacote: a consulta avisa.
|
|
4318
4409
|
const avisos = manifesto.avisos.filter(a => a.startsWith('experiencia.config.invalid'));
|
|
4410
|
+
const m = (0, locale_1.msg)().onboarding;
|
|
4319
4411
|
console.log(args.opcoes.json ? JSON.stringify({ ...p, avisos }, null, 2) :
|
|
4320
|
-
|
|
4412
|
+
`${m.experiencia(p.experience, p.language, p.timezone, p.depth)}\nSkill: ${p.skill}\n` +
|
|
4321
4413
|
// Fatia 2 do ensaio da 0.5.0 (R2): as origens em texto, e nao o JSON cru.
|
|
4322
|
-
|
|
4323
|
-
avisos.map(a => `\
|
|
4414
|
+
m.experienciaOrigens(Object.entries(p.origem).map(([chave, origem]) => `${chave} ${m.origemDaPreferencia(origem)}`).join(', ')) +
|
|
4415
|
+
avisos.map(a => `\n${m.experienciaAviso(m.avisoDaPreferencia(a))}`).join(''));
|
|
4324
4416
|
return 0;
|
|
4325
4417
|
}
|
|
4326
4418
|
case 'thread':
|
|
@@ -4355,10 +4447,12 @@ function main(argvBruto) {
|
|
|
4355
4447
|
}
|
|
4356
4448
|
if (args.posicionais[1] === 'cadencia')
|
|
4357
4449
|
return comandoCadenciaDoPulse(args);
|
|
4358
|
-
|
|
4450
|
+
// RM-061 (F2b, G2): o pulse grava (sensores, condução) e monta o --json em pt-BR; so o texto segue o locale.
|
|
4451
|
+
const carregadoDoPulse = (0, manifest_1.exigirManifesto)();
|
|
4452
|
+
const p = (0, locale_1.comLocale)('pt-BR', () => (0, pulse_1.montarPulse)(carregadoDoPulse, { registrar: args.opcoes.registrar === true,
|
|
4359
4453
|
escopo: texto(args.opcoes.escopo)?.split(',').map(s => s.trim()),
|
|
4360
4454
|
semRuntime: args.opcoes['sem-runtime'] === true,
|
|
4361
|
-
linhasLogs: texto(args.opcoes.linhas) === undefined ? undefined : Number(texto(args.opcoes.linhas)) });
|
|
4455
|
+
linhasLogs: texto(args.opcoes.linhas) === undefined ? undefined : Number(texto(args.opcoes.linhas)) }));
|
|
4362
4456
|
console.log(args.opcoes.json === true ? JSON.stringify(p, null, 2) : (0, pulse_1.textoDoPulse)(p));
|
|
4363
4457
|
return p.runtime.ok || args.opcoes['sem-runtime'] === true ? 0 : 1;
|
|
4364
4458
|
}
|
|
@@ -4440,8 +4534,9 @@ function main(argvBruto) {
|
|
|
4440
4534
|
console.log((0, ciclos_1.tabelaDeVariantes)());
|
|
4441
4535
|
return 0;
|
|
4442
4536
|
default:
|
|
4443
|
-
|
|
4444
|
-
console.
|
|
4537
|
+
(0, locale_1.ativarLocale)(localeDaAjuda());
|
|
4538
|
+
console.error((0, locale_1.msg)().ajuda.comandoDesconhecido(comando));
|
|
4539
|
+
console.log((0, locale_1.msg)().ajuda.texto(dadosDaAjuda()));
|
|
4445
4540
|
return 2;
|
|
4446
4541
|
}
|
|
4447
4542
|
}
|
|
@@ -4455,13 +4550,20 @@ if (require.main === module) {
|
|
|
4455
4550
|
console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.recusa.texto);
|
|
4456
4551
|
process.exitCode = 3;
|
|
4457
4552
|
}
|
|
4553
|
+
else if (e instanceof fila_pesada_1.ErroDaFilaPesada) {
|
|
4554
|
+
// RM-058 N2 (D10): a fila pesada que nao deu a vez no prazo responde como a conducao: o texto ou o JSON, e 3.
|
|
4555
|
+
console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.recusa.texto);
|
|
4556
|
+
process.exitCode = 3;
|
|
4557
|
+
}
|
|
4458
4558
|
else if (e instanceof projeto_alvo_1.ErroDeProjeto) {
|
|
4459
4559
|
// RM-052 (D3): a recusa de projeto-alvo e a resposta (a escolha, os candidatos), nao um stack trace.
|
|
4460
4560
|
console.log(process.argv.includes('--json') ? JSON.stringify(e.recusa, null, 2) : e.texto);
|
|
4461
4561
|
process.exitCode = projeto_alvo_1.SAIDA_DE_PROJETO;
|
|
4462
4562
|
}
|
|
4463
4563
|
else {
|
|
4464
|
-
|
|
4564
|
+
// RM-061 (F2a, D11): o prefixo segue o locale do comando coberto; a mensagem sai como veio, salvo o
|
|
4565
|
+
// erro do catalogo, remontado no locale do comando (D14).
|
|
4566
|
+
console.error((0, locale_1.msg)().cli.erro((0, locale_1.mensagemDoErro)(e)));
|
|
4465
4567
|
process.exitCode = 1;
|
|
4466
4568
|
}
|
|
4467
4569
|
}
|