@orkastery/cli 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/pulse.js CHANGED
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.JANELA_DAS_DECISOES_MS = exports.CONTRATO_PULSE = void 0;
4
4
  exports.apresentacaoCurtaDoItem = apresentacaoCurtaDoItem;
5
5
  exports.comporPulse = comporPulse;
6
+ exports.comandoDaAcaoDaVarredura = comandoDaAcaoDaVarredura;
7
+ exports.textoDaAcaoDaVarredura = textoDaAcaoDaVarredura;
8
+ exports.varreduraDoPulse = varreduraDoPulse;
6
9
  exports.montarPulse = montarPulse;
10
+ exports.filaDoDono = filaDoDono;
7
11
  exports.textoDoPulse = textoDoPulse;
8
12
  const escopo_escrita_1 = require("./escopo-escrita");
9
13
  /** D4: uma fila para quem precisa de humano, com fontes e espera observada. */
@@ -14,12 +18,18 @@ const master_1 = require("./master");
14
18
  const master_batch_1 = require("./master-batch");
15
19
  const orquestracao_1 = require("./orquestracao");
16
20
  const impedimento_1 = require("./impedimento");
21
+ const runtime_escada_1 = require("./runtime-escada");
22
+ const autorizacao_duravel_1 = require("./autorizacao-duravel");
23
+ const varredura_acoes_1 = require("./varredura-acoes");
24
+ const conducao_batida_1 = require("./conducao-batida");
25
+ const maquina_ociosa_1 = require("./maquina-ociosa");
17
26
  const thread_1 = require("./thread");
18
27
  const sessoes_adopt_1 = require("./sessoes-adopt");
19
28
  const ledger_1 = require("./ledger");
20
29
  const types_1 = require("./types");
21
30
  const util_1 = require("./util");
22
31
  const horario_1 = require("./horario");
32
+ const locale_1 = require("./locale");
23
33
  const hitl_presentation_1 = require("./hitl-presentation");
24
34
  const hitl_contract_1 = require("./hitl-contract");
25
35
  const hitl_curto_1 = require("./hitl-curto");
@@ -173,21 +183,47 @@ function comporPulse(carregado, entrada) {
173
183
  fontes: ['monitor'], contextoLogs: [] };
174
184
  // RM-055: o impedimento do despacho sai no contrato curto, com o comando exato e o re-despacho depois.
175
185
  if (p.impedimento) {
186
+ item.impedimento = { motivo: p.motivo, comando: p.impedimento.comando, retry: `ork retry run ${l.thread}` };
176
187
  try {
177
188
  const curto = (0, impedimento_1.pedidoCurtoDoImpedimento)({ thread: l.thread, fase: p.fase, motivo: p.motivo, detalhe: p.detalhe,
178
189
  desdeEm: p.desdeEm, impedimento: p.impedimento }, quando);
179
190
  item.apresentacaoCurta = { telegram: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'telegram'), terminal: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'terminal') };
180
- item.opcoes = curto.alternativas.map(a => `${a.chave}. ${a.texto}`);
181
- item.comandoResposta = `ork retry run ${l.thread}`;
191
+ item.opcoes = curto.alternativas.map(a => (0, locale_1.textoDoCatalogo)((m) => `${a.chave}. ${m.pulse.alternativaDoImpedimento(a.texto)}`));
192
+ item.comandoResposta = item.impedimento.retry;
182
193
  }
183
194
  catch {
184
195
  item.evidencia.push('Pedido curto do impedimento indisponível; a correção acima vale.');
185
196
  }
186
197
  }
198
+ // RM-063 (F4): a escada de recuperacao do runtime que acabou sai como o impedimento, com o comando que confere o
199
+ // runtime, o que retoma a fase com o mesmo prompt e o pedido curto com as tres alternativas (RM-057).
200
+ if (p.escada) {
201
+ item.impedimento = { motivo: p.motivo, comando: p.escada.conferir, retry: p.escada.retomar };
202
+ item.comandoResposta = p.escada.retomar;
203
+ try {
204
+ const curto = (0, runtime_escada_1.pedidoCurtoDaEscada)({ thread: l.thread, fase: p.fase, desdeEm: p.desdeEm, escada: p.escada }, quando);
205
+ item.apresentacaoCurta = { telegram: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'telegram'), terminal: (0, hitl_curto_1.textoDoPedidoCurto)(curto, 'terminal') };
206
+ item.opcoes = curto.alternativas.map(a => (0, locale_1.textoDoCatalogo)((m) => `${a.chave}. ${m.pulse.alternativaDoImpedimento(a.texto)}`));
207
+ const recomendada = curto.alternativas.find(a => a.recomendada);
208
+ if (recomendada)
209
+ item.recomendacao = `${recomendada.chave}. ${recomendada.texto}: ${recomendada.recomendada.porque}`;
210
+ }
211
+ catch {
212
+ item.evidencia.push('Pedido curto da escada indisponível; a correção acima vale.');
213
+ }
214
+ }
187
215
  // I-45: vaga parada e sinal do escalonador (`ork board reap` devolve a vaga), nao pergunta ao dono.
188
216
  const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale'].includes(p.motivo);
189
217
  (esperaAutomatica ? automaticas : humanos).push(item);
190
218
  }
219
+ // RM-063 (F5): o MASTER por omissao da varredura nao vira item do dono (I-45: a entrega sem nota fica na faixa
220
+ // automatica). Ele completa o item da entrega com o comando desta thread so (RM-008) e com quem o faz agora.
221
+ const v = entrada.varredura;
222
+ const recomendacaoDaVarredura = (a) => a.quemFaz === 'varredura' && v.autorizacao.por && v.autorizacao.ate
223
+ ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.daVarredura(v.autorizacao.por, (0, horario_1.formatarDataHoraRotulada)(v.autorizacao.ate, { agora: quando })))
224
+ : a.bloqueio ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comBloqueioRecomendacao(a.thread, a.comando))
225
+ : (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.doDono(a.acao));
226
+ const masterDaVarredura = new Map((v?.pendentes ?? []).filter(a => a.acao === 'master').map(a => [a.thread, a]));
191
227
  for (const b of batch) {
192
228
  const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(carregado.raiz, b.thread.id));
193
229
  const desde = eventos.filter(e => e.tipo === 'ship_done').at(-1)?.ts ??
@@ -204,19 +240,45 @@ function comporPulse(carregado, entrada) {
204
240
  recomendacao: 'Aceitar por padrão com registro; a nota humana, quando vier, sobrescreve.',
205
241
  comandoResposta: 'ork master --aceitar-omissao',
206
242
  evidencia: [`ork master; regime ${b.regime}`], fontes: ['master'], contextoLogs: [] });
243
+ const daVarredura = masterDaVarredura.get(b.thread.id);
244
+ if (daVarredura) {
245
+ const item = automaticas[automaticas.length - 1];
246
+ item.comandoResposta = comandoDaAcaoDaVarredura(daVarredura);
247
+ item.recomendacao = recomendacaoDaVarredura(daVarredura);
248
+ if (daVarredura.bloqueio || daVarredura.recusa)
249
+ item.pergunta = `${item.pergunta} ${textoDaAcaoDaVarredura(daVarredura)}`;
250
+ item.evidencia.push(daVarredura.evidencia);
251
+ if (!item.fontes.includes('varredura'))
252
+ item.fontes.push('varredura');
253
+ masterDaVarredura.delete(b.thread.id);
254
+ }
207
255
  }
208
256
  for (const o of orfas) {
209
257
  if (ehRegistro(o.thread))
210
258
  continue;
211
259
  const item = { id: `orfa:${o.thread}:${o.fase}:${o.sessionId}`, classe: o.classe, motivo: o.motivo,
212
260
  thread: o.thread, fase: o.fase, sessionId: o.sessionId, desdeEm: o.desdeEm, paradaHaMin: minutos(o.desdeEm, quando),
213
- impacto: impacto(o.fase), pergunta: `Fase ${o.fase} sem heartbeat desde ${o.ultimoHeartbeatEm}.`,
261
+ impacto: impacto(o.fase), pergunta: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semHeartbeat(o.fase, o.ultimoHeartbeatEm)),
214
262
  opcoes: [], recomendacao: o.retry.razao,
215
263
  comandoResposta: o.retry.automatica ? `ork retry run ${o.thread} --motivo runtime.silencio --fase ${o.fase}` :
216
264
  `ork retry plan ${o.thread} --motivo runtime.silencio --fase ${o.fase}`,
217
265
  evidencia: [...o.evidencia, `retry ${o.retry.tentativas}/${o.retry.limite}`], fontes: ['liveness'], contextoLogs: [] };
218
266
  (o.retry.automatica ? automaticas : humanos).push(item);
219
267
  }
268
+ // RM-063 (F5): cada acao da varredura e um item. Sem a autorizacao do dono para ela (ou com bloqueio, ou com a tentativa
269
+ // recusada), e do dono, com o comando pronto; autorizada, e acao automatica da proxima batida. O MASTER ja foi no item
270
+ // da entrega sem nota; so o que sobrou dele (sem item de entrega) entra aqui, na faixa automatica.
271
+ for (const a of v?.pendentes ?? []) {
272
+ if (a.acao === 'master' && !masterDaVarredura.has(a.thread))
273
+ continue;
274
+ const daVarredura = a.quemFaz === 'varredura' || a.acao === 'master';
275
+ const item = { id: `varredura:${a.acao}:${a.thread}${a.sessionId ? `:${a.sessionId.slice(0, 8)}` : ''}`,
276
+ classe: 'varredura', motivo: `varredura.${a.acao}`, thread: a.thread, fase: a.fase, sessionId: null, desdeEm: a.desdeEm,
277
+ paradaHaMin: minutos(a.desdeEm, quando), impacto: impacto(a.fase), pergunta: textoDaAcaoDaVarredura(a), opcoes: [],
278
+ recomendacao: recomendacaoDaVarredura(a), comandoResposta: comandoDaAcaoDaVarredura(a), evidencia: [a.evidencia],
279
+ fontes: ['varredura'], contextoLogs: [] };
280
+ (daVarredura ? automaticas : humanos).push(item);
281
+ }
220
282
  const unicos = (items) => [...new Map(items.map(i => [i.id, i])).values()].sort(ordenar);
221
283
  const h = unicos(humanos), a = unicos(automaticas);
222
284
  for (const item of h) {
@@ -253,7 +315,30 @@ function comporPulse(carregado, entrada) {
253
315
  }
254
316
  return { contrato: exports.CONTRATO_PULSE, consultadoEm: quando, runtime: { ok: radar.runtimeConsultado, detalhe: radar.runtimeDetalhe },
255
317
  precisaDeHumanoAgora: h, acoesAutomaticas: a, resumo: { humanos: h.length, automaticas: a.length, scores: batch.length, fasesOrfas: orfas.length },
256
- ...(entregas?.parados.length ? { paradoNoCondutor: entregas.parados } : {}) };
318
+ ...(entregas?.parados.length ? { paradoNoCondutor: entregas.parados } : {}),
319
+ ...(v && (v.pendentes.length || v.feitas.length || v.autorizacao.estado !== 'ausente') ? { varredura: v } : {}) };
320
+ }
321
+ /** RM-063 (F5): com bloqueio, o comando do dono e olhar a thread: a acao iria por cima do trabalho que esta nela. */
322
+ function comandoDaAcaoDaVarredura(a) {
323
+ return a.bloqueio ? `ork thread status ${a.thread}` : a.comando;
324
+ }
325
+ /** RM-063 (F5): o que a acao faz, com o motivo da ultima recusa ou do bloqueio quando ha. */
326
+ function textoDaAcaoDaVarredura(a) {
327
+ return a.recusa ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comRecusa(a.oQue, a.recusa.detalhe))
328
+ : a.bloqueio ? (0, locale_1.textoDoCatalogo)((m) => m.pulse.varredura.comBloqueio(a.oQue, a.bloqueio)) : a.oQue;
329
+ }
330
+ /** RM-063 (F5): os estados em que a sessao da consulta ja nao trabalha na worktree. */
331
+ const TERMINAIS_DA_CONSULTA = ['failed', 'done', 'stopped', 'completed', 'exited'];
332
+ /** RM-063 (F5): a autorizacao e as acoes como o pulse as leva: cada acao com quem a faz agora. */
333
+ function varreduraDoPulse(leitura, pendentes, feitas) {
334
+ const a = leitura.valida ? leitura.autorizacao : null;
335
+ return {
336
+ autorizacao: { estado: leitura.valida ? 'valida' : leitura.motivo === 'autorizacao.ausente' ? 'ausente' : 'invalida',
337
+ motivo: leitura.valida ? null : leitura.motivo, detalhe: leitura.valida ? null : leitura.detalhe,
338
+ por: a?.por ?? null, ate: a?.ate ?? null, pode: a ? [...a.pode] : [] },
339
+ pendentes: pendentes.map((p) => ({ ...p, quemFaz: (0, autorizacao_duravel_1.autorizada)(leitura, p.acao) && !p.bloqueio && !p.recusa ? 'varredura' : 'dono' })),
340
+ feitas: feitas.map((f) => ({ acao: f.acao, thread: f.thread, detalhe: f.detalhe, em: f.em, eventId: f.eventId })),
341
+ };
257
342
  }
258
343
  function montarPulse(carregado, opcoes = {}) {
259
344
  if (opcoes.registrar)
@@ -261,11 +346,12 @@ function montarPulse(carregado, opcoes = {}) {
261
346
  const diagnosticos = [];
262
347
  const quando = opcoes.quando ?? (0, util_1.agora)();
263
348
  const consulta = opcoes.consulta ?? (opcoes.semRuntime
264
- ? { ok: false, sessoes: [], detalhe: 'runtime não consultado por --sem-runtime' } : (0, claude_bg_1.consultarSessoes)(undefined, true));
349
+ ? { ok: false, sessoes: [], detalhe: (0, locale_1.textoDoCatalogo)((m) => m.pulse.semRuntime) } : (0, claude_bg_1.consultarSessoes)(undefined, true));
265
350
  const estados = consulta.ok ? new Map(consulta.sessoes.map(s => [s.sessionId ?? '', (0, hitl_1.estadoBruto)(s)])) : null;
266
351
  const radar = (0, hitl_1.varrerSessoes)({ raiz: carregado.raiz, consulta, agora: quando, registrar: opcoes.registrar, escopo: opcoes.escopo, linhasLogs: opcoes.linhasLogs });
267
- if (radar.telasAdiadas)
268
- diagnosticos.push(`radar.orcamento: ${radar.telasAdiadas} tela(s) de sessão ficaram para a próxima varredura`);
352
+ const telasAdiadas = radar.telasAdiadas;
353
+ if (telasAdiadas)
354
+ diagnosticos.push((0, locale_1.textoDoCatalogo)((m) => m.pulse.telasAdiadas(telasAdiadas)));
269
355
  // Falha de observação não prova silêncio: Claude indisponível preserva sua guarda de HITL e Codex mantém sua coleta independente.
270
356
  const orfas = (0, liveness_1.detectarFasesOrfas)(carregado, { quando, registrar: opcoes.registrar, escopo: opcoes.escopo, diagnosticos,
271
357
  fontes: opcoes.fontes, estados: estados ?? undefined, runtimes: consulta.ok ? undefined : ['codex'] });
@@ -284,8 +370,9 @@ function montarPulse(carregado, opcoes = {}) {
284
370
  // retrato que o status do roadmap le sem rede. Falha de leitura e diagnostico, nunca "sem PR".
285
371
  let entregas;
286
372
  try {
287
- entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: (candidatas) => {
288
- const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas });
373
+ entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: opcoes.semForja ? () => null : (candidatas) => {
374
+ const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas, rodar: opcoes.rodarDaForja,
375
+ sondas: opcoes.sondasDaForja });
289
376
  if (leitura.ok) {
290
377
  try {
291
378
  (0, parado_no_condutor_1.gravarRetratoDePrs)(carregado.raiz, leitura.retrato);
@@ -315,8 +402,34 @@ function montarPulse(carregado, opcoes = {}) {
315
402
  catch (e) {
316
403
  diagnosticos.push(`entregas.indisponiveis: ${e.message.slice(0, 120)}`);
317
404
  }
318
- const pulse = comporPulse(carregado, { radar, monitor, orfas, batch: (0, master_1.pendentesDeScore)(carregado.raiz), ...(entregas ? { entregas } : {}) });
319
- const conducoes = monitor.linhas.filter((l) => l.conducao).map((l) => ({ thread: l.thread, linha: (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando }) }));
405
+ // RM-063 (F5): o que a varredura faria sozinha, com a autorizacao duravel desta maquina. Leitura; falhar aqui nunca
406
+ // derruba a fila de atencao.
407
+ let varredura;
408
+ try {
409
+ const leitura = (0, autorizacao_duravel_1.lerAutorizacao)(carregado.raiz, { projeto: carregado.manifesto.project.name, agora: new Date(quando) });
410
+ // Com a consulta injetada (os testes) ou sem o runtime, as sessoes vem dela: sem a leitura, nada se afirma, e o
411
+ // registro e o MASTER ficam com o dono (`sessoes-sem-leitura`).
412
+ const injetada = opcoes.fantasmas || opcoes.consulta || opcoes.semRuntime;
413
+ const consultada = consulta;
414
+ const pendentes = (0, varredura_acoes_1.acoesPendentes)(carregado, { quando, ...(injetada ? {
415
+ fantasmas: opcoes.fantasmas ?? (() => null),
416
+ vivas: () => consultada.ok ? consultada.sessoes.filter((s) => typeof s.cwd === 'string' && !TERMINAIS_DA_CONSULTA.includes((0, hitl_1.estadoBruto)(s)))
417
+ .map((s) => ({ sessionId: s.sessionId, cwd: s.cwd })) : null,
418
+ } : {}) });
419
+ // RM-063 (F7): o merge e o despacho que a ultima batida da conducao deixou pendentes (check pendente, sem autorizacao,
420
+ // conflito em codigo, PR em rascunho, fase sem prompt gravado), do retrato dela, enquanto ele vale.
421
+ pendentes.push(...(0, conducao_batida_1.pendentesDaUltimaBatida)(carregado.raiz, quando));
422
+ const feitas = (0, varredura_acoes_1.acoesFeitasDesde)(carregado.raiz, new Date(Date.parse(quando) - exports.JANELA_DAS_DECISOES_MS).toISOString());
423
+ varredura = varreduraDoPulse(leitura, pendentes, feitas);
424
+ }
425
+ catch (e) {
426
+ diagnosticos.push(`varredura.indisponivel: ${e.message.slice(0, 120)}`);
427
+ }
428
+ const pulse = comporPulse(carregado, { radar, monitor, orfas, batch: (0, master_1.pendentesDeScore)(carregado.raiz), ...(entregas ? { entregas } : {}),
429
+ ...(varredura ? { varredura } : {}) });
430
+ // RM-061 (F2b, G2): a linha de conducao e da familia `thread` e segue o locale ativo; o JSON a guarda em pt-BR.
431
+ const conducoes = monitor.linhas.filter((l) => l.conducao)
432
+ .map((l) => ({ thread: l.thread, linha: (0, locale_1.textoDoCatalogo)(() => (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando })) }));
320
433
  if (conducoes.length > 0)
321
434
  pulse.conducoes = conducoes;
322
435
  // B4: a metade que presta contas. Leitura pura; falhar aqui nunca derruba a fila de atencao.
@@ -337,43 +450,96 @@ function montarPulse(carregado, opcoes = {}) {
337
450
  catch (e) {
338
451
  diagnosticos.push(`hitl-conducao.indisponivel: ${e.message.slice(0, 120)}`);
339
452
  }
453
+ // RM-063 (F6): a maquina ociosa, leitura pura das vagas, das reservas locais e do passo do condutor.
454
+ try {
455
+ const ociosa = (0, maquina_ociosa_1.maquinaOciosa)(carregado, { quando });
456
+ if (ociosa)
457
+ pulse.maquinaOciosa = ociosa;
458
+ }
459
+ catch (e) {
460
+ diagnosticos.push(`ociosidade.indisponivel: ${e.message.slice(0, 120)}`);
461
+ }
340
462
  if (diagnosticos.length)
341
463
  pulse.runtime.detalhe = [pulse.runtime.detalhe, ...diagnosticos].filter(Boolean).join('; ');
342
464
  return pulse;
343
465
  }
466
+ /**
467
+ * RM-063 (F2): a fila do dono que o `ork roadmap status` le, a MESMA do `ork pulse` (`precisaDeHumanoAgora`). Em 12/10/2026
468
+ * o status disse "Nada agora" com o pulse contando 3: as duas superficies montavam a fila cada uma do seu jeito. Sem
469
+ * forja e sem registrar; o texto de cada item sai numa linha, redigido.
470
+ */
471
+ function filaDoDono(carregado, opcoes = {}) {
472
+ const linha = (texto, teto) => {
473
+ const limpo = (0, hitl_1.redigirSegredos)(texto).replace(/[\p{Cc}\s]+/gu, ' ').trim();
474
+ return limpo.length > teto ? `${limpo.slice(0, teto - 3)}...` : limpo;
475
+ };
476
+ try {
477
+ const p = montarPulse(carregado, { quando: opcoes.quando, semForja: true });
478
+ // Sem o `claude` nesta maquina nao ha sessao dele a perder: a fila do monitor e do ledger esta inteira.
479
+ const lida = p.runtime.ok || !(0, util_1.noPath)('claude');
480
+ return { lida, detalhe: lida ? null : linha(p.runtime.detalhe, 160),
481
+ itens: p.precisaDeHumanoAgora.map(i => ({ id: i.id, thread: i.thread, sessionId: i.sessionId, fase: i.fase, classe: i.classe,
482
+ motivo: i.motivo, pergunta: linha(i.pergunta || i.motivo, 200), comando: linha(i.comandoResposta, 160), paradaHaMin: i.paradaHaMin })) };
483
+ }
484
+ catch (e) {
485
+ return { lida: false, detalhe: linha(e.message, 160), itens: [] };
486
+ }
487
+ }
344
488
  function textoDoPulse(p) {
489
+ const m = (0, locale_1.msg)().pulse;
345
490
  // I-35: o pulse guarda ISO; o texto ao dono sai no fuso dele, rotulado no cabeçalho.
346
- const local = (texto) => (0, horario_1.localizarTexto)(texto, { agora: p.consultadoEm });
347
- 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`];
491
+ // RM-061 (F2b, G2): o que o pulse montou pelo catalogo sai remontado; o resto (pedido HITL, ledger) como veio.
492
+ const local = (texto) => (0, horario_1.localizarTexto)((0, locale_1.remontar)(texto), { agora: p.consultadoEm });
493
+ // O detalhe do runtime junta partes separadas por "; ": cada uma e remontada.
494
+ const detalhe = (texto) => (0, horario_1.localizarTexto)(texto.split('; ').map(locale_1.remontar).join('; '), { agora: p.consultadoEm });
495
+ 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)];
348
496
  // RM-037 (fatia 4): PR nao lido tambem e dito, para a falta de linha do condutor nao parecer "nada parado".
349
497
  if (p.runtime.ok && ['liveness.snapshot.invalid', 'prs.nao-lidos', 'prs.sem-leitura', 'entregas.indisponiveis'].some(d => p.runtime.detalhe.includes(d))) {
350
- linhas.push(`[diagnostico] ${local(p.runtime.detalhe)}`);
498
+ linhas.push(m.diagnostico(detalhe(p.runtime.detalhe)));
351
499
  }
352
500
  if (!p.runtime.ok)
353
- linhas.push(`[consulta incompleta] ${local(p.runtime.detalhe)}`);
501
+ linhas.push(m.consultaIncompleta(detalhe(p.runtime.detalhe)));
354
502
  for (const i of p.precisaDeHumanoAgora) {
355
- 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}`));
503
+ 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)));
356
504
  }
357
505
  if (p.conducoes?.length) {
358
- linhas.push('', `Conduzidas agora: ${p.conducoes.length}`);
506
+ linhas.push('', m.conduzidas(p.conducoes.length));
359
507
  for (const c of p.conducoes)
360
- linhas.push(`${c.thread}: ${c.linha}`);
508
+ linhas.push(m.conducao(c.thread, (0, locale_1.remontar)(c.linha)));
361
509
  }
362
510
  // RM-037 (fatia 4): o que espera o condutor, uma linha por thread; nao e pergunta ao dono.
363
511
  if (p.paradoNoCondutor?.length) {
364
- linhas.push('', `Parado no condutor: ${p.paradoNoCondutor.length}`);
512
+ linhas.push('', m.paradoNoCondutor(p.paradoNoCondutor.length));
365
513
  for (const x of p.paradoNoCondutor)
366
514
  linhas.push((0, hitl_resumo_1.linhaDoParadoNoCondutor)(x, { agora: p.consultadoEm }));
367
515
  }
368
516
  // RM-057 (fatia 3): quanto tempo cada pergunta de conducao aberta ja parou a thread, e a mediana da semana.
369
517
  if (p.hitlDeConducao) {
370
518
  const h = p.hitlDeConducao;
371
- linhas.push('', `HITL de condução: ${h.abertas.length} aberta(s); ${(0, hitl_tempo_parado_1.textoDaMediana)(h)}`);
519
+ linhas.push('', m.hitlDeConducao(h.abertas.length, (0, hitl_tempo_parado_1.textoDaMediana)(h)));
372
520
  for (const a of h.abertas)
373
521
  linhas.push((0, hitl_tempo_parado_1.linhaDaPerguntaParada)(a, { agora: p.consultadoEm }));
374
522
  }
375
- linhas.push('', `Ações automáticas pendentes: ${p.resumo.automaticas}`);
523
+ linhas.push('', m.automaticas(p.resumo.automaticas));
524
+ // 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.
376
525
  for (const i of p.acoesAutomaticas)
377
- linhas.push(`${i.thread}: ${i.motivo}; ${i.comandoResposta}`);
526
+ linhas.push(m.automatica(String(i.thread), i.motivo === i.classe ? m.classe(i.motivo) : i.motivo, (0, locale_1.remontar)(i.comandoResposta)));
527
+ // RM-063 (F5): a autorizacao da varredura e o que ela fez sozinha na semana.
528
+ if (p.varredura) {
529
+ const v = p.varredura, a = v.autorizacao;
530
+ linhas.push('', a.estado === 'valida' ? m.varredura.autorizacaoValida(String(a.por), (0, horario_1.formatarDataHoraRotulada)(String(a.ate), { agora: p.consultadoEm }), a.pode.join(', ')) : a.estado === 'ausente' ? m.varredura.autorizacaoAusente : m.varredura.autorizacaoInvalida(String(a.motivo), String(a.detalhe)));
531
+ if (v.feitas.length) {
532
+ linhas.push(m.varredura.feitas(v.feitas.length));
533
+ for (const f of v.feitas)
534
+ linhas.push(m.varredura.feita(f.thread, f.acao, f.detalhe));
535
+ }
536
+ }
537
+ // RM-063 (F6): a maquina ociosa e as proximas threads sugeridas.
538
+ if (p.maquinaOciosa) {
539
+ const o = p.maquinaOciosa;
540
+ linhas.push('', m.ociosa.linha(o.maquina, o.livres, o.limite, o.reservados));
541
+ for (const s of o.sugeridas)
542
+ linhas.push(m.ociosa.sugerida(s.item, s.thread ? `${s.thread}, ${s.fase}` : m.ociosa.semThread, (0, locale_1.remontar)(s.passo), s.comando));
543
+ }
378
544
  return linhas.join('\n');
379
545
  }
package/dist/ratelimit.js CHANGED
@@ -59,6 +59,7 @@ exports.dirRetry = dirRetry;
59
59
  exports.caminhoDaFila = caminhoDaFila;
60
60
  exports.lerFilaDeRetomada = lerFilaDeRetomada;
61
61
  exports.janelaPadraoMs = janelaPadraoMs;
62
+ exports.arcoDoPedido = arcoDoPedido;
62
63
  exports.enfileirar = enfileirar;
63
64
  exports.prazoDaConta = prazoDaConta;
64
65
  exports.prazoDaCotaVista = prazoDaCotaVista;
@@ -73,6 +74,7 @@ const path = __importStar(require("node:path"));
73
74
  const manifest_1 = require("./manifest");
74
75
  const util_1 = require("./util");
75
76
  const horario_1 = require("./horario");
77
+ const locale_1 = require("./locale");
76
78
  const runtime_profiles_1 = require("./runtime-profiles");
77
79
  var claude_bg_1 = require("./adapters/claude-bg");
78
80
  Object.defineProperty(exports, "parseRateLimit", { enumerable: true, get: function () { return claude_bg_1.parseRateLimit; } });
@@ -103,6 +105,11 @@ function lerFilaDeRetomada(raiz) {
103
105
  function janelaPadraoMs(manifesto) {
104
106
  return manifesto.retry.janela_padrao_min * 60 * 1000;
105
107
  }
108
+ /** RM-058 N4 (D17): o arco #Noctum do pedido, quando o despacho que caiu no limite de uso era dele. */
109
+ function arcoDoPedido(pedido) {
110
+ const c = pedido.correlacao;
111
+ return typeof c === 'string' && c.startsWith('noctum:') && c.length > 'noctum:'.length ? c.slice('noctum:'.length) : null;
112
+ }
106
113
  /**
107
114
  * Enfileira a fase morta por rate limit.
108
115
  *
@@ -136,6 +143,7 @@ function enfileirar(carregado, novo, agoraMs = Date.now()) {
136
143
  ...(novo.runtime !== undefined ? { runtime: novo.runtime } : {}),
137
144
  ...(novo.perfil !== undefined ? { perfil: novo.perfil } : {}),
138
145
  ...(novo.motivo !== undefined ? { motivo: novo.motivo } : {}),
146
+ ...(novo.correlacao ? { correlacao: novo.correlacao } : {}),
139
147
  };
140
148
  (0, util_1.anexarJsonl)(caminhoDaFila(raiz), pedido);
141
149
  return pedido;
@@ -204,26 +212,28 @@ function vencidos(raiz, quando = (0, util_1.agora)()) {
204
212
  /** Quanto falta para a janela de um pedido, em texto curto para o CLI. */
205
213
  function faltaPara(pedido, quando = (0, util_1.agora)()) {
206
214
  const ms = new Date(pedido.liberaEm).getTime() - new Date(quando).getTime();
215
+ const m = (0, locale_1.msg)().horario;
207
216
  if (ms <= 0)
208
- return 'ja liberou';
217
+ return m.jaLiberou;
209
218
  const min = Math.ceil(ms / 60000);
210
- return min < 60 ? `em ${min} min` : `em ${Math.floor(min / 60)}h${String(min % 60).padStart(2, '0')}`;
219
+ return min < 60 ? m.emMinutos(min) : m.emHoras(Math.floor(min / 60), String(min % 60).padStart(2, '0'));
211
220
  }
212
221
  /** Tabela de `ork retry list`. */
213
222
  function tabelaDaFila(raiz, quando = (0, util_1.agora)()) {
214
223
  const fila = lerFilaDeRetomada(raiz).sort((a, b) => a.id.localeCompare(b.id, 'en', { numeric: true }));
224
+ const m = (0, locale_1.msg)().retry.complementar;
215
225
  if (fila.length === 0) {
216
- return 'Fila de rate limit vazia: nenhuma fase morreu por limite de uso neste projeto.';
226
+ return m.filaVazia;
217
227
  }
218
228
  const linhas = fila.map((p) => [
219
229
  p.id,
220
230
  p.thread,
221
231
  p.fase,
222
- p.estado,
232
+ m.estados[p.estado] ?? p.estado,
223
233
  (0, horario_1.formatarDataHora)(p.liberaEm, { agora: quando }),
224
- p.janelaEstimada ? `estimada (${p.sinal.fonte})` : `dita pelo runtime (${p.sinal.fonte})`,
234
+ p.janelaEstimada ? m.horaEstimada(p.sinal.fonte) : m.horaRuntime(p.sinal.fonte),
225
235
  p.estado === 'aguardando' ? faltaPara(p, quando) : '',
226
236
  String(p.tentativas),
227
237
  ]);
228
- return (0, util_1.tabela)(['ID', 'THREAD', 'FASE', 'ESTADO', 'LIBERA EM', 'ORIGEM DA HORA', 'FALTA', 'TENT'], linhas) + `\n${(0, horario_1.legendaDoFuso)(undefined, quando)}`;
238
+ return (0, util_1.tabela)([...m.colunasFila], linhas) + `\n${(0, horario_1.legendaDoFuso)(undefined, quando)}`;
229
239
  }
package/dist/recall.js CHANGED
@@ -65,6 +65,7 @@ const memoria_1 = require("./memoria");
65
65
  const orkmind_1 = require("./orkmind");
66
66
  const thread_1 = require("./thread");
67
67
  const util_1 = require("./util");
68
+ const locale_1 = require("./locale");
68
69
  /** Momento do ponteiro e momento pedido casam? Comparacao exata, sem case. */
69
70
  function momentoCasa(ponteiro, momento) {
70
71
  return ponteiro.retrieve_when.trim().toLowerCase() === momento.trim().toLowerCase();
@@ -291,18 +292,18 @@ function recallDaThread(carregado, memoria, threadId, opcoes = {}) {
291
292
  }
292
293
  /** Texto de `ork recall`. */
293
294
  function textoDoRecall(r, comConteudo = true) {
295
+ const m = (0, locale_1.msg)().operacao.restante.recall;
294
296
  const linhas = [];
295
- linhas.push(`Recall da thread ${r.thread} no momento ${r.momento ?? '(todos)'} ` +
296
- `(regime efetivo ${r.regime}, handoff escrito em regime ${r.regimeDoHandoff})`);
297
+ linhas.push(m.titulo(r.thread, r.momento ?? m.todos, r.regime, r.regimeDoHandoff));
297
298
  linhas.push('');
298
- linhas.push(`RESOLVIDOS (${r.resolvidos.length}, entram no contexto agora):`);
299
+ linhas.push(m.resolvidos(r.resolvidos.length));
299
300
  for (const p of r.resolvidos) {
300
301
  linhas.push(` ${p.id} ${p.titulo}`);
301
- linhas.push(` via ${p.via} (${p.metodo})`);
302
- linhas.push(` location ${p.location}`);
302
+ linhas.push(m.via(p.via, p.metodo));
303
+ linhas.push(m.location(p.location));
303
304
  if (p.orkmind)
304
305
  linhas.push(` orkmind ${p.orkmind}`);
305
- linhas.push(` quando ${p.retrieve_when}`);
306
+ linhas.push(m.quando(p.retrieve_when));
306
307
  if (comConteudo) {
307
308
  linhas.push('');
308
309
  for (const l of p.conteudo.split('\n'))
@@ -311,20 +312,20 @@ function textoDoRecall(r, comConteudo = true) {
311
312
  }
312
313
  }
313
314
  linhas.push('');
314
- linhas.push(`ADIADOS (${r.adiados.length}, existem e NAO entram agora):`);
315
+ linhas.push(m.adiados(r.adiados.length));
315
316
  for (const p of r.adiados) {
316
317
  linhas.push(` ${p.id} ${p.titulo}`);
317
- linhas.push(` quando ${p.retrieve_when}`);
318
- linhas.push(` onde ${p.location}`);
319
- linhas.push(` recuperar ork recall ${r.thread} --fase ${p.retrieve_when}`);
318
+ linhas.push(m.quando(p.retrieve_when));
319
+ linhas.push(m.onde(p.location));
320
+ linhas.push(m.recuperar(r.thread, p.retrieve_when));
320
321
  }
321
322
  if (r.falhas.length > 0) {
322
323
  linhas.push('');
323
- linhas.push(`FALHAS (${r.falhas.length}):`);
324
+ linhas.push(m.falhas(r.falhas.length));
324
325
  for (const p of r.falhas) {
325
326
  linhas.push(` ${p.id} ${p.titulo}`);
326
- linhas.push(` motivo ${p.motivo}`);
327
- linhas.push(` detalhe ${p.detalhe}`);
327
+ linhas.push(m.motivo(p.motivo));
328
+ linhas.push(m.detalhe(p.detalhe));
328
329
  }
329
330
  }
330
331
  return linhas.join('\n');
@@ -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
+ }
@@ -64,6 +64,7 @@ const path = __importStar(require("node:path"));
64
64
  const maquina_1 = require("./maquina");
65
65
  const monitor_lock_1 = require("./monitor-lock");
66
66
  const util_1 = require("./util");
67
+ const locale_1 = require("./locale");
67
68
  exports.CONTRATO_DA_ADESAO = 'ork.rede/v1';
68
69
  exports.REPOSITORIO_PADRAO = 'orkastery-network';
69
70
  /**
@@ -78,6 +79,8 @@ exports.pastaDaRede = pastaDaRede;
78
79
  const arquivoDaConfig = () => path.join((0, maquina_1.pastaDoUsuario)(), 'rede.json');
79
80
  const arquivoDaTentativa = () => path.join((0, exports.pastaDaRede)(), 'tentativa.json');
80
81
  const IDENTIFICADOR = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
82
+ /** O dono da casa: o login, ou o caminho de um grupo com subgrupos (`time/sub`). */
83
+ const DONO = /^[A-Za-z0-9][A-Za-z0-9._-]{0,99}(?:\/[A-Za-z0-9][A-Za-z0-9._-]{0,99}){0,19}$/;
81
84
  const HOST = /^[A-Za-z0-9.-]+(?::\d+)?$/;
82
85
  const texto = (v, padrao) => typeof v === 'string' && padrao.test(v) ? v : null;
83
86
  function lerConfigDaRede() {
@@ -88,7 +91,7 @@ function lerConfigDaRede() {
88
91
  return {
89
92
  contrato: exports.CONTRATO_DA_ADESAO, membro: bruto.membro,
90
93
  forja: bruto.forja === 'github' || bruto.forja === 'gitlab' ? bruto.forja : null,
91
- host: texto(bruto.host, HOST), dono: texto(bruto.dono, IDENTIFICADOR), repositorio: texto(bruto.repositorio, IDENTIFICADOR),
94
+ host: texto(bruto.host, HOST), dono: texto(bruto.dono, DONO), repositorio: texto(bruto.repositorio, IDENTIFICADOR),
92
95
  atualizadoEm: typeof bruto.atualizadoEm === 'string' ? bruto.atualizadoEm : '',
93
96
  };
94
97
  }
@@ -108,11 +111,13 @@ function gravarConfigDaRede(mudanca) {
108
111
  repositorio: mudanca.repositorio !== undefined ? mudanca.repositorio : atual?.repositorio ?? null,
109
112
  atualizadoEm: new Date().toISOString(),
110
113
  };
111
- if (config.host !== null && !HOST.test(config.host))
112
- throw new Error(`rede.config: host invalido ("${config.host}")`);
113
- for (const [campo, valor] of [['dono', config.dono], ['repositorio', config.repositorio]]) {
114
- if (valor !== null && !IDENTIFICADOR.test(valor))
115
- throw new Error(`rede.config: ${campo} invalido ("${valor}")`);
114
+ if (config.host !== null && !HOST.test(config.host)) {
115
+ const host = config.host;
116
+ throw new locale_1.ErroDoCatalogo((m) => m.network.hostInvalido(host));
117
+ }
118
+ for (const [campo, valor, padrao] of [['dono', config.dono, DONO], ['repositorio', config.repositorio, IDENTIFICADOR]]) {
119
+ if (valor !== null && !padrao.test(valor))
120
+ throw new locale_1.ErroDoCatalogo((m) => m.network.campoInvalido(campo, valor));
116
121
  }
117
122
  const dir = (0, maquina_1.pastaDoUsuario)();
118
123
  fs.mkdirSync(dir, { recursive: true });
@@ -180,7 +185,7 @@ function idDaMaquina() {
180
185
  }
181
186
  const persistido = lerId(arquivo);
182
187
  if (!persistido)
183
- throw new Error(`rede.id: nao consegui gravar nem ler ${arquivo}`);
188
+ throw new locale_1.ErroDoCatalogo((m) => m.network.idNaoGravou(arquivo));
184
189
  return persistido;
185
190
  }
186
191
  function gravarTemporario(conteudo) {
@@ -290,7 +295,7 @@ function trocarIdInvalido(arquivo, st) {
290
295
  return;
291
296
  }
292
297
  else {
293
- throw new Error(`rede.id: ${arquivo} nao e um arquivo; apague-o e rode de novo`);
298
+ throw new locale_1.ErroDoCatalogo((m) => m.network.idNaoArquivo(arquivo));
294
299
  }
295
300
  // X6 do CHECK 6: a reserva da troca e chaveada pelo que todo host ve igual do arquivo ruim (conteudo,
296
301
  // tamanho e hora); `dev` e local a cada host e fica so no id derivado, o caminho de quando a reserva falha.