@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
@@ -54,6 +54,9 @@ exports.prepararDiretorioDoPerfil = prepararDiretorioDoPerfil;
54
54
  exports.adicionarPerfil = adicionarPerfil;
55
55
  exports.desativarPerfil = desativarPerfil;
56
56
  exports.reativarPerfil = reativarPerfil;
57
+ exports.expirarPerfisVencidos = expirarPerfisVencidos;
58
+ exports.classificarTipoDeLimite = classificarTipoDeLimite;
59
+ exports.tipoDeLimiteDoPerfil = tipoDeLimiteDoPerfil;
57
60
  exports.marcarFalhaDePerfil = marcarFalhaDePerfil;
58
61
  exports.registrarConferenciaInconclusiva = registrarConferenciaInconclusiva;
59
62
  exports.registrarUsoDePerfil = registrarUsoDePerfil;
@@ -65,6 +68,7 @@ exports.aplicarContasCompartilhadas = aplicarContasCompartilhadas;
65
68
  exports.lerPerfisComContas = lerPerfisComContas;
66
69
  exports.perfisDoRuntime = perfisDoRuntime;
67
70
  exports.perfilDisponivel = perfilDisponivel;
71
+ exports.perfisDisponiveis = perfisDisponiveis;
68
72
  exports.politicaDeRotacao = politicaDeRotacao;
69
73
  exports.proximoPerfilDisponivel = proximoPerfilDisponivel;
70
74
  exports.proximoPerfilPorCarga = proximoPerfilPorCarga;
@@ -93,6 +97,7 @@ const path = __importStar(require("node:path"));
93
97
  const node_crypto_1 = require("node:crypto");
94
98
  const estado_thread_1 = require("./estado-thread");
95
99
  const horario_1 = require("./horario");
100
+ const locale_1 = require("./locale");
96
101
  exports.CONTRATO_PERFIS = 'ork.runtime-profiles/v1';
97
102
  exports.ARQUIVO_PERFIS = 'runtime-profiles.json';
98
103
  /** Runtimes homologados que aceitam perfil, e a variavel que cada um le. */
@@ -110,7 +115,7 @@ const LIMITE_DETALHE = 200;
110
115
  const uid = () => {
111
116
  const atual = process.getuid?.();
112
117
  if (atual === undefined)
113
- throw new Error('runtime.profiles.invalid: uid do processo indisponivel');
118
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.uidIndisponivel);
114
119
  return atual;
115
120
  };
116
121
  function runtimeComPerfil(nome) {
@@ -120,12 +125,12 @@ function runtimeComPerfil(nome) {
120
125
  function validarDiretorioDePerfil(dir) {
121
126
  if (typeof dir !== 'string' || dir.length === 0 || dir.length > 1024 || /\p{Cc}/u.test(dir) ||
122
127
  !path.isAbsolute(dir) || path.normalize(dir) !== dir || dir === '/' || dir.endsWith('/'))
123
- throw new Error('runtime.profiles.invalid: diretorio do perfil precisa ser caminho absoluto normalizado');
128
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.diretorioNaoNormalizado);
124
129
  return dir;
125
130
  }
126
131
  function validarIdDePerfil(id) {
127
132
  if (typeof id !== 'string' || !ID_DE_PERFIL.test(id))
128
- throw new Error('runtime.profiles.invalid: id do perfil aceita letras, digitos, ponto, hifen e sublinhado (ate 63)');
133
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.idInvalido);
129
134
  return id;
130
135
  }
131
136
  /** Diretorio do perfil, pelo campo do seu runtime. */
@@ -136,15 +141,15 @@ function diretorioDoPerfil(p) {
136
141
  /** Valida um perfil de despacho vindo do ledger, do thread.json ou do pedido da fila. */
137
142
  function validarPerfilDeDespacho(v) {
138
143
  if (!v || typeof v !== 'object' || Array.isArray(v))
139
- throw new Error('runtime.profiles.invalid: perfil de despacho ausente');
144
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.despachoAusente);
140
145
  const o = v;
141
146
  const runtime = o.runtime;
142
147
  if (typeof runtime !== 'string' || !runtimeComPerfil(runtime))
143
- throw new Error('runtime.profiles.invalid: runtime do perfil desconhecido');
148
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.runtimeDesconhecido);
144
149
  const campo = runtime === 'claude-bg' ? 'configDir' : 'codexHome';
145
150
  const outro = runtime === 'claude-bg' ? 'codexHome' : 'configDir';
146
151
  if (o[outro] !== undefined || Object.keys(o).some(k => !['id', 'runtime', campo].includes(k)))
147
- throw new Error('runtime.profiles.invalid: perfil de despacho com campo inesperado');
152
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.despachoComCampo);
148
153
  const id = validarIdDePerfil(o.id), dir = validarDiretorioDePerfil(o[campo]);
149
154
  return runtime === 'claude-bg' ? { id, runtime, configDir: dir } : { id, runtime, codexHome: dir };
150
155
  }
@@ -165,7 +170,7 @@ function diretorioEfetivo(runtime, perfil, env = process.env) {
165
170
  if (!perfil)
166
171
  return diretorioImplicito(runtime, env);
167
172
  if (perfil.runtime !== runtime)
168
- throw new Error('runtime.profiles.invalid: perfil de outro runtime');
173
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.perfilDeOutroRuntime);
169
174
  return diretorioDoPerfil(perfil);
170
175
  }
171
176
  /**
@@ -194,7 +199,7 @@ function perfilDoRegistro(eventos, sessao) {
194
199
  const perfil = validarPerfilDeDespacho(bruto);
195
200
  if (doSensor?.perfil !== undefined && doDespacho?.perfil !== undefined &&
196
201
  JSON.stringify(validarPerfilDeDespacho(doDespacho.perfil)) !== JSON.stringify(perfil))
197
- throw new Error('runtime.profiles.invalid: perfil do sensor diverge do despacho');
202
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.sensorDiverge);
198
203
  return perfil;
199
204
  }
200
205
  // ---------------------------------------------------------------------------
@@ -210,7 +215,7 @@ function validarPasta(pasta) {
210
215
  const st = fs.lstatSync(pasta);
211
216
  if (!st.isDirectory() || st.isSymbolicLink() || st.uid !== uid() || (st.mode & 0o777) !== 0o700 ||
212
217
  fs.realpathSync(pasta) !== pasta)
213
- throw new Error('runtime.profiles.invalid: pasta privada precisa ser 0700 do proprio usuario');
218
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.pastaPrivada);
214
219
  return st;
215
220
  }
216
221
  function garantirPasta(raiz) {
@@ -218,7 +223,7 @@ function garantirPasta(raiz) {
218
223
  const estado = path.dirname(pasta);
219
224
  const stEstado = fs.lstatSync(estado);
220
225
  if (!stEstado.isDirectory() || stEstado.isSymbolicLink() || fs.realpathSync(estado) !== estado)
221
- throw new Error('runtime.profiles.invalid: diretorio de estado invalido');
226
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.diretorioDeEstado);
222
227
  try {
223
228
  fs.mkdirSync(pasta, { mode: 0o700 });
224
229
  fs.chmodSync(pasta, 0o700);
@@ -234,26 +239,26 @@ function data(v, campo) {
234
239
  if (v === null)
235
240
  return null;
236
241
  if (typeof v !== 'string' || !Number.isFinite(Date.parse(v)))
237
- throw new Error(`runtime.profiles.invalid: ${campo} invalido`);
242
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.dataInvalida(campo));
238
243
  return v;
239
244
  }
240
245
  function validarPerfil(v) {
241
246
  if (!v || typeof v !== 'object' || Array.isArray(v))
242
- throw new Error('runtime.profiles.invalid: perfil invalido');
247
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.perfilInvalido);
243
248
  const o = v;
244
249
  const despacho = validarPerfilDeDespacho({ id: o.id, runtime: o.runtime,
245
250
  ...(o.configDir !== undefined ? { configDir: o.configDir } : {}), ...(o.codexHome !== undefined ? { codexHome: o.codexHome } : {}) });
246
251
  const permitidos = ['id', 'runtime', 'configDir', 'codexHome', 'estado', 'esgotadoAte', 'ultimaFalha', 'ultimoUso', 'criadoEm'];
247
252
  if (Object.keys(o).some(k => !permitidos.includes(k)))
248
- throw new Error('runtime.profiles.invalid: campo inesperado no perfil');
253
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.campoInesperado);
249
254
  if (!exports.ESTADOS_DE_PERFIL.includes(o.estado))
250
- throw new Error('runtime.profiles.invalid: estado do perfil desconhecido');
255
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.estadoDesconhecido);
251
256
  let ultimaFalha = null;
252
257
  if (o.ultimaFalha !== null) {
253
258
  const f = o.ultimaFalha;
254
259
  if (!f || typeof f !== 'object' || typeof f.motivo !== 'string' || typeof f.detalhe !== 'string' ||
255
260
  f.detalhe.length > LIMITE_DETALHE || Object.keys(f).some(k => !['motivo', 'em', 'detalhe'].includes(k)))
256
- throw new Error('runtime.profiles.invalid: ultimaFalha invalida');
261
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.ultimaFalhaInvalida);
257
262
  ultimaFalha = { motivo: f.motivo, em: data(f.em, 'ultimaFalha.em'), detalhe: f.detalhe };
258
263
  }
259
264
  return { ...despacho, estado: o.estado, esgotadoAte: data(o.esgotadoAte, 'esgotadoAte'),
@@ -262,15 +267,15 @@ function validarPerfil(v) {
262
267
  /** Conteudo validado; ids unicos e diretorio unico por runtime. */
263
268
  function validarStore(v) {
264
269
  if (!v || typeof v !== 'object' || Array.isArray(v))
265
- throw new Error('runtime.profiles.invalid: store invalido');
270
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.storeInvalido);
266
271
  const o = v;
267
272
  if (o.contrato !== exports.CONTRATO_PERFIS || !Array.isArray(o.perfis) || Object.keys(o).sort().join(',') !== 'contrato,perfis')
268
- throw new Error(`runtime.profiles.invalid: contrato ${exports.CONTRATO_PERFIS} esperado`);
273
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.contratoEsperado(exports.CONTRATO_PERFIS));
269
274
  const perfis = o.perfis.map(validarPerfil);
270
275
  if (new Set(perfis.map(p => p.id)).size !== perfis.length)
271
- throw new Error('runtime.profiles.invalid: id de perfil repetido');
276
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.idRepetido);
272
277
  if (new Set(perfis.map(p => `${p.runtime}|${diretorioDoPerfil(p)}`)).size !== perfis.length)
273
- throw new Error('runtime.profiles.invalid: dois perfis do mesmo runtime no mesmo diretorio');
278
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.mesmoDiretorio);
274
279
  return { contrato: exports.CONTRATO_PERFIS, perfis };
275
280
  }
276
281
  /** Le o store. Sem pasta privada ou sem arquivo: store vazio (nenhum perfil configurado). */
@@ -292,19 +297,19 @@ function lerPerfis(raiz) {
292
297
  catch (e) {
293
298
  if (e.code === 'ENOENT')
294
299
  return storeVazio();
295
- throw new Error('runtime.profiles.invalid: arquivo de perfis ilegivel ou link simbolico');
300
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.arquivoIlegivel);
296
301
  }
297
302
  try {
298
303
  const st = fs.fstatSync(fd), atual = fs.lstatSync(pasta);
299
304
  if (!st.isFile() || st.nlink !== 1 || st.uid !== uid() || (st.mode & 0o777) !== 0o600 || st.size > LIMITE_STORE_BYTES ||
300
305
  atual.dev !== pastaSt.dev || atual.ino !== pastaSt.ino)
301
- throw new Error('runtime.profiles.invalid: arquivo de perfis precisa ser 0600 do proprio usuario');
306
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.arquivoSemPermissao);
302
307
  let bruto;
303
308
  try {
304
309
  bruto = JSON.parse(fs.readFileSync(fd, 'utf8'));
305
310
  }
306
311
  catch {
307
- throw new Error('runtime.profiles.invalid: arquivo de perfis com JSON invalido');
312
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.arquivoJson);
308
313
  }
309
314
  return validarStore(bruto);
310
315
  }
@@ -331,7 +336,7 @@ function gravarArquivoPrivado(pasta, pastaSt, arquivo, conteudo) {
331
336
  const atual = fs.lstatSync(pasta);
332
337
  if (atual.dev !== pastaSt.dev || atual.ino !== pastaSt.ino) {
333
338
  fs.rmSync(temp, { force: true });
334
- throw new Error('runtime.profiles.invalid: pasta privada trocada durante a gravacao');
339
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.pastaTrocada);
335
340
  }
336
341
  fs.renameSync(temp, path.join(pasta, arquivo));
337
342
  const dfd = fs.openSync(pasta, fs.constants.O_RDONLY | fs.constants.O_DIRECTORY);
@@ -429,7 +434,7 @@ function comLockDoStore(pasta, executar, arquivo = exports.ARQUIVO_PERFIS) {
429
434
  continue;
430
435
  }
431
436
  if (Date.now() >= prazo)
432
- throw new Error('runtime.profiles.busy: store de perfis ocupado; tente novamente');
437
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.storeOcupado);
433
438
  Atomics.wait(pausa, 0, 0, 2 + Math.floor(Math.random() * 18));
434
439
  }
435
440
  try {
@@ -470,7 +475,7 @@ function atualizarPerfis(raiz, mutar) {
470
475
  function exigirPerfil(store, id) {
471
476
  const p = store.perfis.find(x => x.id === id);
472
477
  if (!p)
473
- throw new Error(`runtime.profiles.unknown: perfil "${id}" nao existe (veja: ork accounts list)`);
478
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.perfilNaoExiste(id));
474
479
  return p;
475
480
  }
476
481
  /**
@@ -507,29 +512,31 @@ function prepararDiretorioDoPerfil(dir) {
507
512
  fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
508
513
  }
509
514
  catch (e) {
510
- throw new Error(`runtime.profiles.invalid: diretorio do perfil inacessivel (${e.code ?? 'erro'})`);
515
+ const codigo = e.code ?? 'erro';
516
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.diretorioInacessivel(codigo));
511
517
  }
512
518
  let st;
513
519
  try {
514
520
  st = fs.statSync(dir);
515
521
  }
516
522
  catch (e) {
517
- throw new Error(`runtime.profiles.invalid: diretorio do perfil inacessivel (${e.code ?? 'erro'})`);
523
+ const codigo = e.code ?? 'erro';
524
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.diretorioInacessivel(codigo));
518
525
  }
519
526
  if (!st.isDirectory())
520
- throw new Error('runtime.profiles.invalid: o caminho do perfil nao e diretorio');
527
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.naoEDiretorio);
521
528
  if (st.uid !== uid())
522
- throw new Error('runtime.profiles.invalid: diretorio do perfil pertence a outro usuario');
529
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.outroUsuario);
523
530
  try {
524
531
  fs.accessSync(dir, fs.constants.R_OK | fs.constants.W_OK | fs.constants.X_OK);
525
532
  }
526
533
  catch {
527
- throw new Error('runtime.profiles.invalid: diretorio do perfil sem leitura e escrita para este usuario');
534
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.semLeituraEscrita);
528
535
  }
529
536
  }
530
537
  function adicionarPerfil(raiz, novo, agoraIso = new Date().toISOString()) {
531
538
  if (!runtimeComPerfil(novo.runtime))
532
- throw new Error(`runtime.profiles.invalid: runtime "${novo.runtime}" nao aceita perfil`);
539
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.runtimeSemPerfil(novo.runtime));
533
540
  const runtime = novo.runtime;
534
541
  const dir = validarDiretorioDePerfil(novo.dir);
535
542
  const perfil = { id: validarIdDePerfil(novo.id), runtime,
@@ -544,16 +551,16 @@ function adicionarPerfil(raiz, novo, agoraIso = new Date().toISOString()) {
544
551
  existente.esgotadoAte = null;
545
552
  return { ...existente };
546
553
  }
547
- throw new Error(`runtime.profiles.invalid: perfil "${perfil.id}" ja existe` +
548
- (existente.estado === 'desativado' ? ` (desativado em ${diretorioDoPerfil(existente)}; reative com o mesmo --runtime e --dir)` : ''));
554
+ const desativadoEm = existente.estado === 'desativado' ? diretorioDoPerfil(existente) : null;
555
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.jaExiste(perfil.id, desativadoEm));
549
556
  }
550
557
  if (store.perfis.some(p => p.runtime === runtime && diretorioDoPerfil(p) === dir))
551
- throw new Error(`runtime.profiles.invalid: ja ha perfil ${runtime} em ${dir}`);
558
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.jaHaPerfil(runtime, dir));
552
559
  // A7: o mesmo diretorio por outro caminho (link simbolico) e a mesma conta, nao outro perfil.
553
560
  const real = caminhoRealDoPerfil(dir);
554
561
  const mesmo = store.perfis.find(p => p.runtime === runtime && caminhoRealDoPerfil(diretorioDoPerfil(p)) === real);
555
562
  if (mesmo)
556
- throw new Error(`runtime.profiles.invalid: ${dir} e o mesmo diretorio do perfil "${mesmo.id}" (${real})`);
563
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.mesmoDiretorioDoPerfil(dir, mesmo.id, real));
557
564
  store.perfis.push(perfil);
558
565
  return perfil;
559
566
  });
@@ -571,7 +578,7 @@ function reativarPerfil(raiz, id) {
571
578
  const p = atualizarPerfis(raiz, store => {
572
579
  const p = exigirPerfil(store, id);
573
580
  if (p.estado === 'desativado')
574
- throw new Error(`runtime.profiles.invalid: perfil "${id}" esta desativado`);
581
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.estaDesativado(id));
575
582
  p.estado = 'ativo';
576
583
  p.esgotadoAte = null;
577
584
  return { ...p };
@@ -580,13 +587,56 @@ function reativarPerfil(raiz, id) {
580
587
  publicarEstadoDaConta(p, (0, estado_thread_1.raizDoEstado)(raiz));
581
588
  return p;
582
589
  }
590
+ /** RM-064 T7: `accounts check` materializa a disponibilidade que antes existia só na leitura pura. */
591
+ function expirarPerfisVencidos(raiz, agoraMs = Date.now()) {
592
+ const temVencido = lerPerfis(raiz).perfis.some(p => p.estado === 'esgotado' && p.esgotadoAte !== null &&
593
+ Date.parse(p.esgotadoAte) <= agoraMs);
594
+ if (!temVencido)
595
+ return [];
596
+ const expirados = atualizarPerfis(raiz, store => {
597
+ const saida = [];
598
+ for (const p of store.perfis) {
599
+ if (p.estado !== 'esgotado' || p.esgotadoAte === null || Date.parse(p.esgotadoAte) > agoraMs)
600
+ continue;
601
+ p.estado = 'ativo';
602
+ p.esgotadoAte = null;
603
+ saida.push({ ...p });
604
+ }
605
+ return saida;
606
+ });
607
+ for (const p of expirados)
608
+ publicarEstadoDaConta(p, (0, estado_thread_1.raizDoEstado)(raiz), agoraMs);
609
+ return expirados;
610
+ }
611
+ /**
612
+ * Classificação conservadora da evidência curta guardada; texto desconhecido continua desconhecido. O limite de gasto
613
+ * dito por extenso vence o semanal: a fala real "individual spend limit ... your weekly limit resets" é de gasto, e
614
+ * a semana ali é só o prazo de volta.
615
+ */
616
+ function classificarTipoDeLimite(detalhe) {
617
+ const texto = detalhe ?? '';
618
+ if (!texto)
619
+ return 'nenhum';
620
+ if (/spend(?:ing)?\s+(?:cap|limit)|limite\s+de\s+gasto/iu.test(texto))
621
+ return 'gasto-admin';
622
+ if (/weekly|semana(?:l)?/iu.test(texto))
623
+ return 'semanal';
624
+ if (/admin(?:istrator|istrador)?/iu.test(texto))
625
+ return 'gasto-admin';
626
+ if (/session|sess[aã]o|\b\d+(?:[.,]\d+)?\s*(?:hours?|horas?|h)\b/iu.test(texto))
627
+ return 'sessao';
628
+ return 'outro';
629
+ }
630
+ function tipoDeLimiteDoPerfil(p) {
631
+ return p.ultimaFalha?.motivo === 'runtime.quota-exhausted' ? classificarTipoDeLimite(p.ultimaFalha.detalhe) : 'nenhum';
632
+ }
583
633
  /**
584
634
  * D5: marca a falha de conta. Cota esgotada sai do rodizio ate `esgotadoAte`; auth ausente
585
635
  * sai sem prazo, ate o login ser refeito e conferido.
586
636
  */
587
637
  function marcarFalhaDePerfil(raiz, id, falha) {
588
638
  if (falha.estado === 'esgotado' && (falha.esgotadoAte === null || !Number.isFinite(Date.parse(falha.esgotadoAte))))
589
- throw new Error('runtime.profiles.invalid: cota esgotada exige esgotadoAte');
639
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.cotaExigePrazo);
590
640
  const marcado = atualizarPerfis(raiz, store => {
591
641
  const p = exigirPerfil(store, id);
592
642
  if (p.estado !== 'desativado')
@@ -609,7 +659,7 @@ const detalheCurto = (detalhe) => Array.from(detalhe.replace(/\p{Cc}/gu, ' ')).s
609
659
  function registrarConferenciaInconclusiva(raiz, id, detalhe, em = new Date().toISOString()) {
610
660
  return atualizarPerfis(raiz, store => {
611
661
  const p = exigirPerfil(store, id);
612
- p.ultimaFalha = { motivo: 'runtime.unavailable', em, detalhe: detalheCurto(`conferencia de login inconclusiva: ${detalhe}`) };
662
+ p.ultimaFalha = { motivo: 'runtime.unavailable', em, detalhe: detalheCurto((0, locale_1.msg)('pt-BR').accounts.inconclusiva(detalhe)) };
613
663
  return { ...p };
614
664
  });
615
665
  }
@@ -674,12 +724,12 @@ function chaveDaConta(p) {
674
724
  function validarRegistroDeContas(v) {
675
725
  if (!v || typeof v !== 'object' || v.contrato !== exports.CONTRATO_CONTAS ||
676
726
  !Array.isArray(v.contas))
677
- throw new Error('runtime.profiles.invalid: registro de contas invalido');
727
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.registroInvalido);
678
728
  const contas = v.contas.map((c) => {
679
729
  const o = c;
680
730
  if (!o || typeof o.chave !== 'string' || !ESTADOS_COMPARTILHADOS.includes(String(o.estado)) ||
681
731
  typeof o.motivo !== 'string' || typeof o.detalhe !== 'string' || typeof o.projeto !== 'string' || typeof o.em !== 'string')
682
- throw new Error('runtime.profiles.invalid: conta compartilhada invalida');
732
+ throw new locale_1.ErroDoCatalogo((m) => m.accounts.contaInvalida);
683
733
  return { chave: o.chave, estado: o.estado, esgotadoAte: data(o.esgotadoAte ?? null, 'esgotadoAte'),
684
734
  motivo: o.motivo, detalhe: detalheCurto(o.detalhe), em: data(o.em, 'em'), projeto: o.projeto };
685
735
  });
@@ -760,7 +810,7 @@ function aplicarContasCompartilhadas(store, contas, agoraMs = Date.now()) {
760
810
  }
761
811
  if (!c)
762
812
  return p;
763
- const falha = { motivo: c.motivo, em: c.em, detalhe: detalheCurto(`visto em outro projeto: ${c.detalhe}`) };
813
+ const falha = { motivo: c.motivo, em: c.em, detalhe: detalheCurto((0, locale_1.msg)('pt-BR').accounts.vistoEmOutroProjeto(c.detalhe)) };
764
814
  if (c.estado === 'esgotado') {
765
815
  const ate = c.esgotadoAte === null ? NaN : Date.parse(c.esgotadoAte);
766
816
  if (!(ate > agoraMs))
@@ -790,6 +840,10 @@ function perfilDisponivel(p, agoraMs = Date.now()) {
790
840
  return true;
791
841
  return p.estado === 'esgotado' && p.esgotadoAte !== null && Date.parse(p.esgotadoAte) <= agoraMs;
792
842
  }
843
+ /** Única lista de candidatos automáticos: estado configurado continua existindo, mas nunca vira destino. */
844
+ function perfisDisponiveis(store, runtime, agoraMs = Date.now()) {
845
+ return perfisDoRuntime(store, runtime).filter((p) => perfilDisponivel(p, agoraMs));
846
+ }
793
847
  /** Defaults da D16: por cota ligada (decisao do dono em 19/09/2026) e por login perdido ligada. */
794
848
  exports.POLITICA_PADRAO = { mesmoRuntimePorCota: true, mesmoRuntimePorAuth: true };
795
849
  function politicaDeRotacao(manifesto) {
@@ -833,9 +887,9 @@ function proximoPerfilPorCarga(store, runtime, politica, carga, opcoes = {}) {
833
887
  if (!daVez)
834
888
  return null;
835
889
  const agoraMs = opcoes.agoraMs ?? Date.now();
836
- const candidatos = perfisDoRuntime(store, runtime)
890
+ const candidatos = perfisDisponiveis(store, runtime, agoraMs)
837
891
  .map((p, i) => ({ p, i }))
838
- .filter(({ p }) => !(opcoes.excluir ?? []).includes(p.id) && perfilDisponivel(p, agoraMs));
892
+ .filter(({ p }) => !(opcoes.excluir ?? []).includes(p.id));
839
893
  const uso = (p) => p.ultimoUso === null ? -Infinity : Date.parse(p.ultimoUso);
840
894
  candidatos.sort((x, y) => (carga.get(x.p.id) ?? 0) - (carga.get(y.p.id) ?? 0) || uso(x.p) - uso(y.p) || x.i - y.i);
841
895
  return candidatos[0]?.p ?? daVez;
@@ -879,12 +933,15 @@ function menorEsgotadoAte(store, runtimes, agoraMs = Date.now()) {
879
933
  * vez, pela `legendaDoFuso()`, quando `perfisComHorario` acusa alguma coluna preenchida.
880
934
  */
881
935
  function linhasDePerfis(store) {
882
- return store.perfis.map(p => [p.id, p.runtime, diretorioDoPerfil(p), p.estado,
936
+ // RM-061 (F3b): o estado (dado do store e do `--json`) so se traduz aqui, pelo id; o motivo tipado sai igual.
937
+ const m = (0, locale_1.msg)().accounts;
938
+ return store.perfis.map(p => [p.id, p.runtime, diretorioDoPerfil(p), m.estado(p.estado),
883
939
  p.esgotadoAte ? (0, horario_1.formatarDataHora)(p.esgotadoAte) : '-', p.ultimoUso ? (0, horario_1.formatarDataHora)(p.ultimoUso) : '-',
884
- p.ultimaFalha ? `${p.ultimaFalha.motivo} em ${(0, horario_1.formatarDataHora)(p.ultimaFalha.em)}` : '-']);
940
+ p.ultimaFalha ? m.falhaEm(p.ultimaFalha.motivo, (0, horario_1.formatarDataHora)(p.ultimaFalha.em)) : '-']);
885
941
  }
886
942
  /** True quando a tabela mostra algum horario, e a mensagem precisa dizer o fuso uma vez. */
887
943
  function perfisComHorario(store) {
888
944
  return store.perfis.some(p => p.esgotadoAte !== null || p.ultimoUso !== null || p.ultimaFalha !== null);
889
945
  }
890
- exports.COLUNAS_DE_PERFIS = ['PERFIL', 'RUNTIME', 'DIRETORIO', 'ESTADO', 'ESGOTADO ATE', 'ULTIMO USO', 'ULTIMA FALHA'];
946
+ /** As colunas da tabela em pt-BR; o CLI usa as do catalogo, no locale do comando (`msg().accounts.colunas`). */
947
+ exports.COLUNAS_DE_PERFIS = [...(0, locale_1.msg)('pt-BR').accounts.colunas];
package/dist/runtimes.js CHANGED
@@ -55,6 +55,7 @@ exports.resolverRuntime = resolverRuntime;
55
55
  const claudeBg = __importStar(require("./adapters/claude-bg"));
56
56
  const codex = __importStar(require("./adapters/codex"));
57
57
  const hitl_ingress_receipt_1 = require("./hitl-ingress-receipt");
58
+ const locale_1 = require("./locale");
58
59
  exports.RUNTIME_PADRAO = 'claude-bg';
59
60
  /** Phase e retry atravessam o mesmo preparo, antes de retirar segredos do filho. */
60
61
  function comRecibosPublicos(p, dispatch) {
@@ -97,7 +98,7 @@ function runtimeConhecido(nome) {
97
98
  function resolverRuntime(nome) {
98
99
  const adapter = exports.RUNTIMES[nome];
99
100
  if (!adapter) {
100
- throw new Error(`runtime de despacho desconhecido: "${nome}" (homologados: ${exports.ORDEM_DOS_RUNTIMES.join(', ')})`);
101
+ throw new locale_1.ErroDoCatalogo((m) => m.phase.runtimeDesconhecido(nome, exports.ORDEM_DOS_RUNTIMES.join(', ')));
101
102
  }
102
103
  return adapter;
103
104
  }
@@ -51,8 +51,9 @@ function valoresEmUmaLinha(valor) {
51
51
  /**
52
52
  * O JSON para a tela: o mesmo valor, com os caracteres invisiveis escritos como `\uXXXX` (quem le o
53
53
  * JSON recebe o mesmo texto; so o terminal deixa de executa-lo). A quebra de linha da indentacao fica.
54
+ * Com `indentacao` 0, o JSON sai compacto (a resposta de uma tool MCP, RM-026 K7).
54
55
  */
55
- function jsonSemInvisivel(valor) {
56
- return JSON.stringify(valor, null, 2).replace(INVISIVEIS, (c) => c === '\n' ? c
56
+ function jsonSemInvisivel(valor, indentacao = 2) {
57
+ return JSON.stringify(valor, null, indentacao).replace(INVISIVEIS, (c) => c === '\n' ? c
57
58
  : Array.from({ length: c.length }, (_, i) => `\\u${c.charCodeAt(i).toString(16).padStart(4, '0')}`).join(''));
58
59
  }