@orkastery/cli 0.5.1 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/adapters/claude-code/README.md +158 -0
  2. package/adapters/claude-code/agents/ork-master.md +2 -0
  3. package/adapters/claude-code/commands/master.md +8 -0
  4. package/adapters/claude-code/commands/ork.md +9 -0
  5. package/adapters/claude-code/mods/autoridade.json +56 -0
  6. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  7. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  8. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  9. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  10. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  11. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  12. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  13. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  14. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  15. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  16. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  17. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  18. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  19. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  20. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  21. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  22. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  23. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  24. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  25. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  27. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  28. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  29. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  30. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  31. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  32. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
  33. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  35. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  36. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  37. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  38. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  39. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  40. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  41. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  42. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  43. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  44. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  45. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  46. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  47. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  48. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  49. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  50. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  51. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  52. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  53. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  54. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  55. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  56. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  57. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  58. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  59. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  61. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  62. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  63. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  64. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  65. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  66. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  67. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  68. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  69. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  70. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  71. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  72. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  73. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  74. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  75. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  76. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  77. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  78. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  79. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  80. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  82. package/adapters/codex/skills/ork/SKILL.md +18 -3
  83. package/adapters/hermes/README.md +1 -0
  84. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  85. package/adapters/hermes/hermes.plugin.json +1 -0
  86. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  87. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
  88. package/adapters/openclaw/README.md +26 -5
  89. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  90. package/adapters/openclaw/dist/index.js +46 -11
  91. package/adapters/openclaw/openclaw.plugin.json +5 -1
  92. package/adapters/openclaw/package.json +2 -2
  93. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  94. package/adapters/openclaw/src/index.ts +49 -11
  95. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  96. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  97. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  98. package/assets/docs-en/produto/README.md +14 -0
  99. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  100. package/assets/docs-en/roadmap/README.md +14 -0
  101. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  102. package/assets/orkmind_bridge.py +117 -9
  103. package/dist/adapters/claude-bg.js +116 -18
  104. package/dist/adapters/codex.js +14 -4
  105. package/dist/agents-md.js +24 -14
  106. package/dist/auditrun.js +22 -3
  107. package/dist/board.js +20 -17
  108. package/dist/branch-de-estado.js +88 -10
  109. package/dist/busca-semantica.js +52 -12
  110. package/dist/canarios-rm057.js +149 -0
  111. package/dist/canarios.js +2 -0
  112. package/dist/catalogo.js +33 -0
  113. package/dist/ci.js +21 -8
  114. package/dist/claims-conferir.js +342 -0
  115. package/dist/claims.js +41 -1
  116. package/dist/company-brain-client.js +36 -1
  117. package/dist/company-brain-context.js +158 -22
  118. package/dist/company-brain-journal.js +2 -1
  119. package/dist/company-brain-migration.js +36 -1
  120. package/dist/conducao-sentinela.js +388 -0
  121. package/dist/conducao-texto.js +12 -18
  122. package/dist/conducao.js +122 -30
  123. package/dist/conhecimento.js +490 -0
  124. package/dist/docs.js +70 -17
  125. package/dist/doctor-pulse-cron.js +349 -0
  126. package/dist/doctor-rede.js +150 -0
  127. package/dist/doctor.js +195 -111
  128. package/dist/entrega-pr.js +42 -29
  129. package/dist/escopo-escrita.js +10 -1
  130. package/dist/esgotamentos.js +181 -0
  131. package/dist/estado-thread.js +23 -1
  132. package/dist/experiencia-instalacao.js +45 -25
  133. package/dist/experiencia.js +12 -2
  134. package/dist/fabrica-batida.js +310 -0
  135. package/dist/fabrica-estado.js +52 -14
  136. package/dist/fabrica-publicar.js +9 -1
  137. package/dist/fechamento.js +20 -66
  138. package/dist/fila-pesada.js +444 -0
  139. package/dist/fix.js +3 -2
  140. package/dist/forja.js +31 -7
  141. package/dist/gates.js +3 -24
  142. package/dist/handoff.js +10 -6
  143. package/dist/hitl-contract.js +59 -4
  144. package/dist/hitl-curto.js +11 -6
  145. package/dist/hitl-gates.js +5 -0
  146. package/dist/hitl-local-receipt.js +2 -0
  147. package/dist/hitl-lote.js +5 -2
  148. package/dist/hitl-resumo.js +38 -3
  149. package/dist/hitl-tempo-parado.js +201 -0
  150. package/dist/hitl-texto-livre.js +5 -5
  151. package/dist/hitl.js +29 -33
  152. package/dist/horario.js +41 -7
  153. package/dist/hosts.js +104 -11
  154. package/dist/impedimento.js +299 -0
  155. package/dist/index.js +961 -542
  156. package/dist/indice-vetorial.js +87 -10
  157. package/dist/indice.js +9 -1
  158. package/dist/init.js +56 -43
  159. package/dist/instabilidade.js +144 -0
  160. package/dist/integracoes-locais.js +4 -0
  161. package/dist/intelligence-graph-cli.js +170 -16
  162. package/dist/intelligence-graph-contexto.js +254 -0
  163. package/dist/intelligence-graph-contract.js +2 -1
  164. package/dist/intelligence-graph-extract-md.js +56 -4
  165. package/dist/intelligence-graph-extract-ts.js +71 -3
  166. package/dist/intelligence-graph-parsers.js +6 -4
  167. package/dist/intelligence-graph-query.js +66 -19
  168. package/dist/leases.js +664 -87
  169. package/dist/ledger-stats.js +15 -1
  170. package/dist/ledger.js +18 -1
  171. package/dist/licoes.js +1 -0
  172. package/dist/liveness.js +6 -3
  173. package/dist/locale-ajuda.js +761 -0
  174. package/dist/locale-gerados.js +160 -0
  175. package/dist/locale-master.js +99 -0
  176. package/dist/locale-onboarding.js +92 -0
  177. package/dist/locale-phase.js +151 -0
  178. package/dist/locale-pulse.js +211 -0
  179. package/dist/locale-retry.js +385 -0
  180. package/dist/locale-roadmap.js +102 -0
  181. package/dist/locale-ship.js +494 -0
  182. package/dist/locale-thread.js +277 -0
  183. package/dist/locale-verify.js +125 -0
  184. package/dist/locale.js +714 -0
  185. package/dist/maestro-runtime.js +4 -1
  186. package/dist/manifest.js +149 -4
  187. package/dist/maquina.js +23 -4
  188. package/dist/master-digest.js +6 -1
  189. package/dist/master-nota.js +18 -11
  190. package/dist/master.js +145 -31
  191. package/dist/mcp-artifacts.js +43 -3
  192. package/dist/mcp-git.js +42 -8
  193. package/dist/mcp-grafo-worker.js +5 -3
  194. package/dist/mcp-grafo.js +55 -6
  195. package/dist/mcp-server.js +22 -3
  196. package/dist/mcp-ship.js +3 -1
  197. package/dist/mcp-verify.js +6 -1
  198. package/dist/memoria.js +48 -6
  199. package/dist/modos.js +3 -6
  200. package/dist/network-roadmap.js +196 -18
  201. package/dist/noctum-arco.js +911 -0
  202. package/dist/noctum-capacidade.js +141 -0
  203. package/dist/noctum-envelope.js +810 -0
  204. package/dist/noctum-execucao.js +304 -0
  205. package/dist/noctum-fila.js +280 -0
  206. package/dist/ocupacao.js +40 -5
  207. package/dist/onboarding.js +40 -21
  208. package/dist/orkmind.js +99 -7
  209. package/dist/orquestracao.js +24 -21
  210. package/dist/parado-no-condutor.js +219 -38
  211. package/dist/phase.js +160 -52
  212. package/dist/policies.js +56 -5
  213. package/dist/portfolio.js +8 -3
  214. package/dist/postura-local.js +234 -0
  215. package/dist/preflight.js +11 -10
  216. package/dist/procedencia.js +225 -0
  217. package/dist/projeto-alvo.js +132 -5
  218. package/dist/prompts.js +40 -1
  219. package/dist/prova-ativacao.js +75 -6
  220. package/dist/pulse-delivery.js +47 -4
  221. package/dist/pulse.js +98 -19
  222. package/dist/ratelimit.js +24 -6
  223. package/dist/recall.js +3 -1
  224. package/dist/redacao-saida.js +63 -0
  225. package/dist/rede-adesao.js +399 -0
  226. package/dist/rede-forja.js +289 -0
  227. package/dist/rede-projetos.js +239 -0
  228. package/dist/rede-status.js +337 -0
  229. package/dist/rede.js +980 -0
  230. package/dist/retry.js +291 -140
  231. package/dist/roadmap-reservas.js +20 -3
  232. package/dist/roadmap-status.js +150 -34
  233. package/dist/runtime-context.js +181 -3
  234. package/dist/runtime-profiles.js +22 -1
  235. package/dist/runtimes.js +2 -1
  236. package/dist/saida-segura.js +58 -0
  237. package/dist/session-events.js +7 -3
  238. package/dist/session-watcher-claude.js +120 -24
  239. package/dist/session-watcher.js +185 -33
  240. package/dist/sessoes-contas.js +187 -0
  241. package/dist/sessoes-inventario.js +6 -18
  242. package/dist/sessoes.js +83 -2
  243. package/dist/ship-publicar.js +800 -0
  244. package/dist/ship.js +157 -88
  245. package/dist/steal.js +77 -0
  246. package/dist/thread-close.js +3 -2
  247. package/dist/thread.js +299 -49
  248. package/dist/util.js +8 -1
  249. package/dist/verify.js +141 -52
  250. package/dist/vida-da-thread.js +254 -0
  251. package/dist/worktree-local.js +165 -0
  252. package/dist/worktree.js +25 -2
  253. package/dist/yaml.js +27 -8
  254. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  255. package/package.json +7 -3
  256. package/references/definition-of-done.md +1 -1
  257. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  258. package/skills/README.md +1 -1
  259. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  260. package/skills/phases/master-metrics/SKILL.md +8 -3
package/dist/pulse.js CHANGED
@@ -4,6 +4,7 @@ exports.JANELA_DAS_DECISOES_MS = exports.CONTRATO_PULSE = void 0;
4
4
  exports.apresentacaoCurtaDoItem = apresentacaoCurtaDoItem;
5
5
  exports.comporPulse = comporPulse;
6
6
  exports.montarPulse = montarPulse;
7
+ exports.filaDoDono = filaDoDono;
7
8
  exports.textoDoPulse = textoDoPulse;
8
9
  const escopo_escrita_1 = require("./escopo-escrita");
9
10
  /** D4: uma fila para quem precisa de humano, com fontes e espera observada. */
@@ -13,12 +14,14 @@ const liveness_1 = require("./liveness");
13
14
  const master_1 = require("./master");
14
15
  const master_batch_1 = require("./master-batch");
15
16
  const orquestracao_1 = require("./orquestracao");
17
+ const impedimento_1 = require("./impedimento");
16
18
  const thread_1 = require("./thread");
17
19
  const sessoes_adopt_1 = require("./sessoes-adopt");
18
20
  const ledger_1 = require("./ledger");
19
21
  const types_1 = require("./types");
20
22
  const util_1 = require("./util");
21
23
  const horario_1 = require("./horario");
24
+ const locale_1 = require("./locale");
22
25
  const hitl_presentation_1 = require("./hitl-presentation");
23
26
  const hitl_contract_1 = require("./hitl-contract");
24
27
  const hitl_curto_1 = require("./hitl-curto");
@@ -27,6 +30,7 @@ const docs_1 = require("./docs");
27
30
  const conducao_1 = require("./conducao");
28
31
  const conducao_texto_1 = require("./conducao-texto");
29
32
  const hitl_resumo_1 = require("./hitl-resumo");
33
+ const hitl_tempo_parado_1 = require("./hitl-tempo-parado");
30
34
  const parado_no_condutor_1 = require("./parado-no-condutor");
31
35
  exports.CONTRATO_PULSE = 'ork.pulse/v1';
32
36
  /** Uma semana: o resumo cita a decisao uma vez, e ela continua lida ate sair da janela. */
@@ -169,6 +173,20 @@ function comporPulse(carregado, entrada) {
169
173
  thread: l.thread, fase: p.fase, sessionId: null, desdeEm: p.desdeEm, paradaHaMin: p.paradaHaMin, impacto: impacto(p.fase),
170
174
  pergunta: p.detalhe, opcoes: [], recomendacao: p.correcao, comandoResposta: p.correcao, evidencia: [p.evidencia],
171
175
  fontes: ['monitor'], contextoLogs: [] };
176
+ // RM-055: o impedimento do despacho sai no contrato curto, com o comando exato e o re-despacho depois.
177
+ if (p.impedimento) {
178
+ item.impedimento = { motivo: p.motivo, comando: p.impedimento.comando, retry: `ork retry run ${l.thread}` };
179
+ try {
180
+ const curto = (0, impedimento_1.pedidoCurtoDoImpedimento)({ thread: l.thread, fase: p.fase, motivo: p.motivo, detalhe: p.detalhe,
181
+ desdeEm: p.desdeEm, impedimento: p.impedimento }, quando);
182
+ item.apresentacaoCurta = { telegram: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'telegram'), terminal: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'terminal') };
183
+ item.opcoes = curto.alternativas.map(a => (0, locale_1.textoDoCatalogo)((m) => `${a.chave}. ${m.pulse.alternativaDoImpedimento(a.texto)}`));
184
+ item.comandoResposta = item.impedimento.retry;
185
+ }
186
+ catch {
187
+ item.evidencia.push('Pedido curto do impedimento indisponível; a correção acima vale.');
188
+ }
189
+ }
172
190
  // I-45: vaga parada e sinal do escalonador (`ork board reap` devolve a vaga), nao pergunta ao dono.
173
191
  const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale'].includes(p.motivo);
174
192
  (esperaAutomatica ? automaticas : humanos).push(item);
@@ -195,7 +213,7 @@ function comporPulse(carregado, entrada) {
195
213
  continue;
196
214
  const item = { id: `orfa:${o.thread}:${o.fase}:${o.sessionId}`, classe: o.classe, motivo: o.motivo,
197
215
  thread: o.thread, fase: o.fase, sessionId: o.sessionId, desdeEm: o.desdeEm, paradaHaMin: minutos(o.desdeEm, quando),
198
- impacto: impacto(o.fase), pergunta: `Fase ${o.fase} sem heartbeat desde ${o.ultimoHeartbeatEm}.`,
216
+ impacto: impacto(o.fase), pergunta: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semHeartbeat(o.fase, o.ultimoHeartbeatEm)),
199
217
  opcoes: [], recomendacao: o.retry.razao,
200
218
  comandoResposta: o.retry.automatica ? `ork retry run ${o.thread} --motivo runtime.silencio --fase ${o.fase}` :
201
219
  `ork retry plan ${o.thread} --motivo runtime.silencio --fase ${o.fase}`,
@@ -246,11 +264,12 @@ function montarPulse(carregado, opcoes = {}) {
246
264
  const diagnosticos = [];
247
265
  const quando = opcoes.quando ?? (0, util_1.agora)();
248
266
  const consulta = opcoes.consulta ?? (opcoes.semRuntime
249
- ? { ok: false, sessoes: [], detalhe: 'runtime não consultado por --sem-runtime' } : (0, claude_bg_1.consultarSessoes)(undefined, true));
267
+ ? { ok: false, sessoes: [], detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semRuntime) } : (0, claude_bg_1.consultarSessoes)(undefined, true));
250
268
  const estados = consulta.ok ? new Map(consulta.sessoes.map(s => [s.sessionId ?? '', (0, hitl_1.estadoBruto)(s)])) : null;
251
269
  const radar = (0, hitl_1.varrerSessoes)({ raiz: carregado.raiz, consulta, agora: quando, registrar: opcoes.registrar, escopo: opcoes.escopo, linhasLogs: opcoes.linhasLogs });
252
- if (radar.telasAdiadas)
253
- diagnosticos.push(`radar.orcamento: ${radar.telasAdiadas} tela(s) de sessão ficaram para a próxima varredura`);
270
+ const telasAdiadas = radar.telasAdiadas;
271
+ if (telasAdiadas)
272
+ diagnosticos.push((0, locale_1.textoDoCatalogo)((m) => m.pulse.telasAdiadas(telasAdiadas)));
254
273
  // Falha de observação não prova silêncio: Claude indisponível preserva sua guarda de HITL e Codex mantém sua coleta independente.
255
274
  const orfas = (0, liveness_1.detectarFasesOrfas)(carregado, { quando, registrar: opcoes.registrar, escopo: opcoes.escopo, diagnosticos,
256
275
  fontes: opcoes.fontes, estados: estados ?? undefined, runtimes: consulta.ok ? undefined : ['codex'] });
@@ -269,24 +288,41 @@ function montarPulse(carregado, opcoes = {}) {
269
288
  // retrato que o status do roadmap le sem rede. Falha de leitura e diagnostico, nunca "sem PR".
270
289
  let entregas;
271
290
  try {
272
- entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: (candidatas) => {
291
+ entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: opcoes.semForja ? () => null : (candidatas) => {
273
292
  const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas });
274
293
  if (leitura.ok) {
275
294
  try {
276
295
  (0, parado_no_condutor_1.gravarRetratoDePrs)(carregado.raiz, leitura.retrato);
277
296
  }
278
297
  catch { /* o retrato e economia do status */ }
298
+ try {
299
+ (0, parado_no_condutor_1.esquecerForjaSemLeitura)(carregado.raiz);
300
+ }
301
+ catch { /* sem a marca, a proxima perda de leitura e dita de novo */ }
279
302
  }
280
303
  return leitura;
281
304
  } });
282
- if (entregas.prs && !entregas.prs.ok)
283
- diagnosticos.push(`prs.nao-lidos: ${entregas.prs.erro.slice(0, 160)}`);
305
+ const leitura = entregas.prs;
306
+ if (leitura && !leitura.ok && leitura.semLeitura) {
307
+ // RM-037 (fatia 5, A5): a forja sem leitura de PR e dita uma vez por remoto e host; as batidas seguintes nao repetem.
308
+ let novidade = true;
309
+ try {
310
+ novidade = (0, parado_no_condutor_1.avisarForjaSemLeitura)(carregado.raiz, leitura.semLeitura, leitura.erro, quando);
311
+ }
312
+ catch { /* sem marca, diz de novo */ }
313
+ if (novidade)
314
+ diagnosticos.push(`prs.sem-leitura: ${leitura.erro.slice(0, 160)}`);
315
+ }
316
+ else if (leitura && !leitura.ok)
317
+ diagnosticos.push(`prs.nao-lidos: ${leitura.erro.slice(0, 160)}`);
284
318
  }
285
319
  catch (e) {
286
320
  diagnosticos.push(`entregas.indisponiveis: ${e.message.slice(0, 120)}`);
287
321
  }
288
322
  const pulse = comporPulse(carregado, { radar, monitor, orfas, batch: (0, master_1.pendentesDeScore)(carregado.raiz), ...(entregas ? { entregas } : {}) });
289
- const conducoes = monitor.linhas.filter((l) => l.conducao).map((l) => ({ thread: l.thread, linha: (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando }) }));
323
+ // RM-061 (F2b, G2): a linha de conducao e da familia `thread` e segue o locale ativo; o JSON a guarda em pt-BR.
324
+ const conducoes = monitor.linhas.filter((l) => l.conducao)
325
+ .map((l) => ({ thread: l.thread, linha: (0, locale_1.textoDoCatalogo)(() => (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando })) }));
290
326
  if (conducoes.length > 0)
291
327
  pulse.conducoes = conducoes;
292
328
  // B4: a metade que presta contas. Leitura pura; falhar aqui nunca derruba a fila de atencao.
@@ -298,36 +334,79 @@ function montarPulse(carregado, opcoes = {}) {
298
334
  catch (e) {
299
335
  diagnosticos.push(`decisoes.indisponiveis: ${e.message.slice(0, 120)}`);
300
336
  }
337
+ // RM-057 (fatia 3): leitura pura do ledger; falhar aqui nunca derruba a fila de atencao.
338
+ try {
339
+ const hitl = (0, hitl_tempo_parado_1.lerHitlDeConducaoAgora)(carregado.raiz, quando);
340
+ if (hitl.abertas.length || hitl.seteDias.pedidos || hitl.seteDias.respondidos)
341
+ pulse.hitlDeConducao = hitl;
342
+ }
343
+ catch (e) {
344
+ diagnosticos.push(`hitl-conducao.indisponivel: ${e.message.slice(0, 120)}`);
345
+ }
301
346
  if (diagnosticos.length)
302
347
  pulse.runtime.detalhe = [pulse.runtime.detalhe, ...diagnosticos].filter(Boolean).join('; ');
303
348
  return pulse;
304
349
  }
350
+ /**
351
+ * RM-063 (F2): a fila do dono que o `ork roadmap status` le, a MESMA do `ork pulse` (`precisaDeHumanoAgora`). Em 12/10/2026
352
+ * o status disse "Nada agora" com o pulse contando 3: as duas superficies montavam a fila cada uma do seu jeito. Sem
353
+ * forja e sem registrar; o texto de cada item sai numa linha, redigido.
354
+ */
355
+ function filaDoDono(carregado, opcoes = {}) {
356
+ const linha = (texto, teto) => {
357
+ const limpo = (0, hitl_1.redigirSegredos)(texto).replace(/[\p{Cc}\s]+/gu, ' ').trim();
358
+ return limpo.length > teto ? `${limpo.slice(0, teto - 3)}...` : limpo;
359
+ };
360
+ try {
361
+ const p = montarPulse(carregado, { quando: opcoes.quando, semForja: true });
362
+ // Sem o `claude` nesta maquina nao ha sessao dele a perder: a fila do monitor e do ledger esta inteira.
363
+ const lida = p.runtime.ok || !(0, util_1.noPath)('claude');
364
+ return { lida, detalhe: lida ? null : linha(p.runtime.detalhe, 160),
365
+ itens: p.precisaDeHumanoAgora.map(i => ({ id: i.id, thread: i.thread, sessionId: i.sessionId, fase: i.fase, classe: i.classe,
366
+ motivo: i.motivo, pergunta: linha(i.pergunta || i.motivo, 200), comando: linha(i.comandoResposta, 160), paradaHaMin: i.paradaHaMin })) };
367
+ }
368
+ catch (e) {
369
+ return { lida: false, detalhe: linha(e.message, 160), itens: [] };
370
+ }
371
+ }
305
372
  function textoDoPulse(p) {
373
+ const m = (0, locale_1.msg)().pulse;
306
374
  // I-35: o pulse guarda ISO; o texto ao dono sai no fuso dele, rotulado no cabeçalho.
307
- const local = (texto) => (0, horario_1.localizarTexto)(texto, { agora: p.consultadoEm });
308
- const linhas = [`Pulse (${p.contrato}) ${(0, horario_1.formatarDataHoraRotulada)(p.consultadoEm, { agora: p.consultadoEm })}`, `Precisa de humano agora: ${p.resumo.humanos}`, `${p.resumo.scores} entrega(s) sem nota, aceitas por padrão com registro`];
375
+ // RM-061 (F2b, G2): o que o pulse montou pelo catalogo sai remontado; o resto (pedido HITL, ledger) como veio.
376
+ const local = (texto) => (0, horario_1.localizarTexto)((0, locale_1.remontar)(texto), { agora: p.consultadoEm });
377
+ // O detalhe do runtime junta partes separadas por "; ": cada uma e remontada.
378
+ const detalhe = (texto) => (0, horario_1.localizarTexto)(texto.split('; ').map(locale_1.remontar).join('; '), { agora: p.consultadoEm });
379
+ const linhas = [m.cabecalho(p.contrato, (0, horario_1.formatarDataHoraRotulada)(p.consultadoEm, { agora: p.consultadoEm })), m.precisaDeHumano(p.resumo.humanos), m.semNota(p.resumo.scores)];
309
380
  // RM-037 (fatia 4): PR nao lido tambem e dito, para a falta de linha do condutor nao parecer "nada parado".
310
- if (p.runtime.ok && ['liveness.snapshot.invalid', 'prs.nao-lidos', 'entregas.indisponiveis'].some(d => p.runtime.detalhe.includes(d))) {
311
- linhas.push(`[diagnostico] ${local(p.runtime.detalhe)}`);
381
+ if (p.runtime.ok && ['liveness.snapshot.invalid', 'prs.nao-lidos', 'prs.sem-leitura', 'entregas.indisponiveis'].some(d => p.runtime.detalhe.includes(d))) {
382
+ linhas.push(m.diagnostico(detalhe(p.runtime.detalhe)));
312
383
  }
313
384
  if (!p.runtime.ok)
314
- linhas.push(`[consulta incompleta] ${local(p.runtime.detalhe)}`);
385
+ linhas.push(m.consultaIncompleta(detalhe(p.runtime.detalhe)));
315
386
  for (const i of p.precisaDeHumanoAgora) {
316
- linhas.push('', `${i.thread ?? i.sessionId} [${i.classe}] ${i.paradaHaMin == null ? 'desconhecido' : i.paradaHaMin < 1 ? 'menos de 1' : i.paradaHaMin} min`, local(i.pergunta), ...i.opcoes.map(o => ` opção: ${o}`), `Recomendação: ${i.recomendacao}`, `Responder: ${i.comandoResposta}`, ...i.contextoLogs.map(l => ` log: ${l}`));
387
+ linhas.push('', m.item(String(i.thread ?? i.sessionId), m.classe(i.classe), i.paradaHaMin == null ? m.desconhecido : i.paradaHaMin < 1 ? m.menosDeUm : String(i.paradaHaMin)), local(i.pergunta), ...i.opcoes.map(o => m.opcao((0, locale_1.remontar)(o))), m.recomendacao((0, locale_1.remontar)(i.recomendacao)), m.responder((0, locale_1.remontar)(i.comandoResposta)), ...i.contextoLogs.map(l => m.log(l)));
317
388
  }
318
389
  if (p.conducoes?.length) {
319
- linhas.push('', `Conduzidas agora: ${p.conducoes.length}`);
390
+ linhas.push('', m.conduzidas(p.conducoes.length));
320
391
  for (const c of p.conducoes)
321
- linhas.push(`${c.thread}: ${c.linha}`);
392
+ linhas.push(m.conducao(c.thread, (0, locale_1.remontar)(c.linha)));
322
393
  }
323
394
  // RM-037 (fatia 4): o que espera o condutor, uma linha por thread; nao e pergunta ao dono.
324
395
  if (p.paradoNoCondutor?.length) {
325
- linhas.push('', `Parado no condutor: ${p.paradoNoCondutor.length}`);
396
+ linhas.push('', m.paradoNoCondutor(p.paradoNoCondutor.length));
326
397
  for (const x of p.paradoNoCondutor)
327
398
  linhas.push((0, hitl_resumo_1.linhaDoParadoNoCondutor)(x, { agora: p.consultadoEm }));
328
399
  }
329
- linhas.push('', `Ações automáticas pendentes: ${p.resumo.automaticas}`);
400
+ // RM-057 (fatia 3): quanto tempo cada pergunta de conducao aberta ja parou a thread, e a mediana da semana.
401
+ if (p.hitlDeConducao) {
402
+ const h = p.hitlDeConducao;
403
+ linhas.push('', m.hitlDeConducao(h.abertas.length, (0, hitl_tempo_parado_1.textoDaMediana)(h)));
404
+ for (const a of h.abertas)
405
+ linhas.push((0, hitl_tempo_parado_1.linhaDaPerguntaParada)(a, { agora: p.consultadoEm }));
406
+ }
407
+ linhas.push('', m.automaticas(p.resumo.automaticas));
408
+ // RM-061 (F2b, D4): o item do radar sem tipo de HITL usa a classe como motivo; ela sai pelo id, o motivo tipado fica.
330
409
  for (const i of p.acoesAutomaticas)
331
- linhas.push(`${i.thread}: ${i.motivo}; ${i.comandoResposta}`);
410
+ linhas.push(m.automatica(String(i.thread), i.motivo === i.classe ? m.classe(i.motivo) : i.motivo, (0, locale_1.remontar)(i.comandoResposta)));
332
411
  return linhas.join('\n');
333
412
  }
package/dist/ratelimit.js CHANGED
@@ -61,6 +61,7 @@ exports.lerFilaDeRetomada = lerFilaDeRetomada;
61
61
  exports.janelaPadraoMs = janelaPadraoMs;
62
62
  exports.enfileirar = enfileirar;
63
63
  exports.prazoDaConta = prazoDaConta;
64
+ exports.prazoDaCotaVista = prazoDaCotaVista;
64
65
  exports.marcarContaDaFalha = marcarContaDaFalha;
65
66
  exports.gravarPedido = gravarPedido;
66
67
  exports.exigirPedido = exigirPedido;
@@ -72,6 +73,7 @@ const path = __importStar(require("node:path"));
72
73
  const manifest_1 = require("./manifest");
73
74
  const util_1 = require("./util");
74
75
  const horario_1 = require("./horario");
76
+ const locale_1 = require("./locale");
75
77
  const runtime_profiles_1 = require("./runtime-profiles");
76
78
  var claude_bg_1 = require("./adapters/claude-bg");
77
79
  Object.defineProperty(exports, "parseRateLimit", { enumerable: true, get: function () { return claude_bg_1.parseRateLimit; } });
@@ -151,15 +153,30 @@ function prazoDaConta(manifesto, falha, agoraMs = Date.now()) {
151
153
  return falha.resetEm;
152
154
  return new Date(agoraMs + janelaPadraoMs(manifesto)).toISOString();
153
155
  }
154
- /** Marca no store o perfil que falhou pela conta. Sem perfil (ambiente do processo), nada a marcar. */
155
- function marcarContaDaFalha(carregado, perfil, falha, agoraMs = Date.now()) {
156
+ /**
157
+ * RM-037 (fatia 5): ate quando a conta sai do rodizio pela cota que o observador viu na transcricao, com a
158
+ * sessao viva. Vale a hora dita (ja ancorada no instante da mensagem) ou a janela padrao contada da mensagem,
159
+ * nunca do relogio de quem leu. Prazo que ja venceu volta `null`: a conta ja voltou, e marcar agora tiraria do
160
+ * rodizio uma conta boa (a regra A10 do despacho recusado nao vale aqui, porque ninguem acabou de recusar nada).
161
+ */
162
+ function prazoDaCotaVista(manifesto, falha, mensagemMs, agoraMs = Date.now()) {
163
+ if (falha.motivo !== 'runtime.quota-exhausted' || !Number.isFinite(mensagemMs))
164
+ return null;
165
+ const prazo = falha.resetEm ?? new Date(mensagemMs + janelaPadraoMs(manifesto)).toISOString();
166
+ return Date.parse(prazo) > agoraMs ? prazo : null;
167
+ }
168
+ /**
169
+ * Marca no store o perfil que falhou pela conta. Sem perfil (ambiente do processo), nada a marcar. `prazo`,
170
+ * quando vem, e o ja calculado por quem viu a falha (`prazoDaCotaVista`); sem ele, vale `prazoDaConta`.
171
+ */
172
+ function marcarContaDaFalha(carregado, perfil, falha, agoraMs = Date.now(), prazo) {
156
173
  // RM-037 (defeitosdeco D-6): modelo inacessivel nao e falha da conta inteira; o perfil fica no rodizio.
157
174
  if (!perfil || falha.motivo === 'runtime.model-unavailable')
158
175
  return null;
159
176
  const esgotado = falha.motivo === 'runtime.quota-exhausted';
160
177
  return (0, runtime_profiles_1.marcarFalhaDePerfil)(carregado.raiz, perfil.id, { estado: esgotado ? 'esgotado' : 'sem-auth',
161
- esgotadoAte: prazoDaConta(carregado.manifesto, falha, agoraMs), motivo: falha.motivo, detalhe: falha.trecho,
162
- em: new Date(agoraMs).toISOString() });
178
+ esgotadoAte: esgotado && prazo ? prazo : prazoDaConta(carregado.manifesto, falha, agoraMs), motivo: falha.motivo,
179
+ detalhe: falha.trecho, em: new Date(agoraMs).toISOString() });
163
180
  }
164
181
  /** Regrava um pedido (append-only: a versao nova vence, o historico fica). */
165
182
  function gravarPedido(raiz, pedido) {
@@ -188,10 +205,11 @@ function vencidos(raiz, quando = (0, util_1.agora)()) {
188
205
  /** Quanto falta para a janela de um pedido, em texto curto para o CLI. */
189
206
  function faltaPara(pedido, quando = (0, util_1.agora)()) {
190
207
  const ms = new Date(pedido.liberaEm).getTime() - new Date(quando).getTime();
208
+ const m = (0, locale_1.msg)().horario;
191
209
  if (ms <= 0)
192
- return 'ja liberou';
210
+ return m.jaLiberou;
193
211
  const min = Math.ceil(ms / 60000);
194
- return min < 60 ? `em ${min} min` : `em ${Math.floor(min / 60)}h${String(min % 60).padStart(2, '0')}`;
212
+ return min < 60 ? m.emMinutos(min) : m.emHoras(Math.floor(min / 60), String(min % 60).padStart(2, '0'));
195
213
  }
196
214
  /** Tabela de `ork retry list`. */
197
215
  function tabelaDaFila(raiz, quando = (0, util_1.agora)()) {
package/dist/recall.js CHANGED
@@ -257,7 +257,9 @@ function recallDaThread(carregado, memoria, threadId, opcoes = {}) {
257
257
  falhas.push({ id: 'memoria-busca', titulo: 'Descoberta de handoffs da fase', location: '',
258
258
  orkmind: null, retrieve_when: fase, resolvido: false, motivo: 'orkmind-indisponivel', via: null,
259
259
  conteudo: '', metodo: '', sha256: '', intervalo: null,
260
- detalhe: `${memoria.leituraRestrita ? falhaDeConsulta(erro) : 'memory.transport.export'}: busca semantica falhou; resultado nao comprova colecao vazia` });
260
+ // RM-038: a janela cheia do export tem codigo proprio; o resto segue como falha de transporte.
261
+ detalhe: `${memoria.leituraRestrita ? falhaDeConsulta(erro) : erro instanceof Error && erro.message === 'memory.query.window-saturated'
262
+ ? erro.message : 'memory.transport.export'}: busca semantica falhou; resultado nao comprova colecao vazia` });
261
263
  }
262
264
  }
263
265
  if (opcoes.id !== undefined && resolvidos.length === 0 && falhas.length === 0 && adiados.length === 0) {
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LIMITE_DE_TESTES = exports.LIMITE_DO_TRECHO = void 0;
4
4
  exports.redigirSaida = redigirSaida;
5
5
  exports.testesQueCairam = testesQueCairam;
6
+ exports.falhasDeTeste = falhasDeTeste;
6
7
  /**
7
8
  * I-37 (D9): a saida de um comando que falhou, pronta para ir ao ledger.
8
9
  *
@@ -41,5 +42,67 @@ function testesQueCairam(saida) {
41
42
  if (nomes.length === exports.LIMITE_DE_TESTES)
42
43
  break;
43
44
  }
45
+ // RM-037 (fatia 6): o reporter `spec`, o padrao do `node --test` 24 fora de TTY, nao imprime `not ok`;
46
+ // os nomes moram na secao "failing tests" do fim da saida.
47
+ if (nomes.length === 0)
48
+ return falhasDeTeste(saida).map((f) => f.nome).slice(0, exports.LIMITE_DE_TESTES);
44
49
  return nomes;
45
50
  }
51
+ /** As frases do `node --test` para a falha que e do relogio, e nao da asercao. */
52
+ const ASSINATURA_DE_RELOGIO = /test timed out after \d+ms|test did not finish before its parent and was cancelled/;
53
+ const TIPO_DE_RELOGIO = /failureType:\s*'(?:testTimeoutFailure|cancelledByParent)'/;
54
+ /** O teste que so agrega os filhos (subtestes ou arquivo) nao e uma falha por si. */
55
+ const TIPO_DE_AGREGADO = /failureType:\s*'subtestsFailed'/;
56
+ /**
57
+ * RM-037 (fatia 6): os testes reprovados, folha a folha, com a natureza da falha, para o verify saber
58
+ * se a reprovacao e so de relogio. Le o TAP do `node --test` (o bloco YAML depois do `not ok`, pulando
59
+ * o agregado `subtestsFailed`) e a secao "failing tests" do reporter `spec`. Outros runners (jest,
60
+ * vitest) nao dizem a natureza: os nomes saem com `relogio: false`, e nada e atenuado.
61
+ */
62
+ function falhasDeTeste(saida) {
63
+ const linhas = saida.split('\n');
64
+ const falhas = [];
65
+ const somar = (nome, relogio) => {
66
+ const limpo = nome.trim().slice(0, LIMITE_DO_NOME);
67
+ if (!limpo)
68
+ return;
69
+ const ja = falhas.find((f) => f.nome === limpo);
70
+ if (ja)
71
+ ja.relogio = ja.relogio && relogio;
72
+ else
73
+ falhas.push({ nome: limpo, relogio });
74
+ };
75
+ for (let i = 0; i < linhas.length; i++) {
76
+ const tap = /^\s*not ok \d+ - (.+?)\s*(?:#.*)?$/.exec(linhas[i]);
77
+ if (!tap)
78
+ continue;
79
+ const bloco = [];
80
+ for (let j = i + 1; j < linhas.length && !/^\s*(?:not )?ok \d+ /.test(linhas[j]); j++)
81
+ bloco.push(linhas[j]);
82
+ const texto = bloco.join('\n');
83
+ if (TIPO_DE_AGREGADO.test(texto))
84
+ continue;
85
+ somar(tap[1], TIPO_DE_RELOGIO.test(texto) || ASSINATURA_DE_RELOGIO.test(texto));
86
+ }
87
+ const inicio = linhas.findIndex((l) => /^\s*✖ failing tests:\s*$/.test(l));
88
+ if (inicio >= 0) {
89
+ for (let i = inicio + 1; i < linhas.length; i++) {
90
+ const cabeca = /^✖ (.+?)(?: \([\d.]+m?s\))?\s*$/.exec(linhas[i]);
91
+ if (!cabeca)
92
+ continue;
93
+ const corpo = [];
94
+ for (let j = i + 1; j < linhas.length && !/^(?:✖ |test at )/.test(linhas[j]); j++)
95
+ corpo.push(linhas[j]);
96
+ const primeira = corpo.find((l) => l.trim() !== '') ?? '';
97
+ somar(cabeca[1], ASSINATURA_DE_RELOGIO.test(primeira));
98
+ }
99
+ }
100
+ if (falhas.length === 0) {
101
+ for (const linha of linhas) {
102
+ const fail = /^\s*(?:FAIL|✕|×)\s+(\S.*?)\s*$/.exec(linha);
103
+ if (fail)
104
+ somar(fail[1], false);
105
+ }
106
+ }
107
+ return falhas;
108
+ }