@orkastery/cli 0.5.6 → 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 (385) 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 +37 -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/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +118 -4
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/pulse.js CHANGED
@@ -3,6 +3,9 @@ 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;
7
10
  exports.filaDoDono = filaDoDono;
8
11
  exports.textoDoPulse = textoDoPulse;
@@ -15,6 +18,11 @@ const master_1 = require("./master");
15
18
  const master_batch_1 = require("./master-batch");
16
19
  const orquestracao_1 = require("./orquestracao");
17
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");
18
26
  const thread_1 = require("./thread");
19
27
  const sessoes_adopt_1 = require("./sessoes-adopt");
20
28
  const ledger_1 = require("./ledger");
@@ -187,10 +195,35 @@ function comporPulse(carregado, entrada) {
187
195
  item.evidencia.push('Pedido curto do impedimento indisponível; a correção acima vale.');
188
196
  }
189
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
+ }
190
215
  // I-45: vaga parada e sinal do escalonador (`ork board reap` devolve a vaga), nao pergunta ao dono.
191
216
  const esperaAutomatica = ['lease.busy', 'conducao.em-andamento', 'concurrency.limite', 'runtime.rate-limited', 'vaga.stale'].includes(p.motivo);
192
217
  (esperaAutomatica ? automaticas : humanos).push(item);
193
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]));
194
227
  for (const b of batch) {
195
228
  const eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(carregado.raiz, b.thread.id));
196
229
  const desde = eventos.filter(e => e.tipo === 'ship_done').at(-1)?.ts ??
@@ -207,6 +240,18 @@ function comporPulse(carregado, entrada) {
207
240
  recomendacao: 'Aceitar por padrão com registro; a nota humana, quando vier, sobrescreve.',
208
241
  comandoResposta: 'ork master --aceitar-omissao',
209
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
+ }
210
255
  }
211
256
  for (const o of orfas) {
212
257
  if (ehRegistro(o.thread))
@@ -220,6 +265,20 @@ function comporPulse(carregado, entrada) {
220
265
  evidencia: [...o.evidencia, `retry ${o.retry.tentativas}/${o.retry.limite}`], fontes: ['liveness'], contextoLogs: [] };
221
266
  (o.retry.automatica ? automaticas : humanos).push(item);
222
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
+ }
223
282
  const unicos = (items) => [...new Map(items.map(i => [i.id, i])).values()].sort(ordenar);
224
283
  const h = unicos(humanos), a = unicos(automaticas);
225
284
  for (const item of h) {
@@ -256,7 +315,30 @@ function comporPulse(carregado, entrada) {
256
315
  }
257
316
  return { contrato: exports.CONTRATO_PULSE, consultadoEm: quando, runtime: { ok: radar.runtimeConsultado, detalhe: radar.runtimeDetalhe },
258
317
  precisaDeHumanoAgora: h, acoesAutomaticas: a, resumo: { humanos: h.length, automaticas: a.length, scores: batch.length, fasesOrfas: orfas.length },
259
- ...(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
+ };
260
342
  }
261
343
  function montarPulse(carregado, opcoes = {}) {
262
344
  if (opcoes.registrar)
@@ -289,7 +371,8 @@ function montarPulse(carregado, opcoes = {}) {
289
371
  let entregas;
290
372
  try {
291
373
  entregas = (0, parado_no_condutor_1.entregasDoProjeto)(carregado, { quando, sessoes: radar.sessoes, lerPrs: opcoes.semForja ? () => null : (candidatas) => {
292
- const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas });
374
+ const leitura = (0, parado_no_condutor_1.lerPrsDaForja)(carregado, { quando, executor: opcoes.executorDoGh, candidatas, rodar: opcoes.rodarDaForja,
375
+ sondas: opcoes.sondasDaForja });
293
376
  if (leitura.ok) {
294
377
  try {
295
378
  (0, parado_no_condutor_1.gravarRetratoDePrs)(carregado.raiz, leitura.retrato);
@@ -319,7 +402,31 @@ function montarPulse(carregado, opcoes = {}) {
319
402
  catch (e) {
320
403
  diagnosticos.push(`entregas.indisponiveis: ${e.message.slice(0, 120)}`);
321
404
  }
322
- const pulse = comporPulse(carregado, { radar, monitor, orfas, batch: (0, master_1.pendentesDeScore)(carregado.raiz), ...(entregas ? { entregas } : {}) });
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 } : {}) });
323
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.
324
431
  const conducoes = monitor.linhas.filter((l) => l.conducao)
325
432
  .map((l) => ({ thread: l.thread, linha: (0, locale_1.textoDoCatalogo)(() => (0, conducao_texto_1.linhaDeConducao)(l.conducao, { agora: quando })) }));
@@ -343,6 +450,15 @@ function montarPulse(carregado, opcoes = {}) {
343
450
  catch (e) {
344
451
  diagnosticos.push(`hitl-conducao.indisponivel: ${e.message.slice(0, 120)}`);
345
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
+ }
346
462
  if (diagnosticos.length)
347
463
  pulse.runtime.detalhe = [pulse.runtime.detalhe, ...diagnosticos].filter(Boolean).join('; ');
348
464
  return pulse;
@@ -408,5 +524,22 @@ function textoDoPulse(p) {
408
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.
409
525
  for (const i of p.acoesAutomaticas)
410
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
+ }
411
544
  return linhas.join('\n');
412
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;
@@ -104,6 +105,11 @@ function lerFilaDeRetomada(raiz) {
104
105
  function janelaPadraoMs(manifesto) {
105
106
  return manifesto.retry.janela_padrao_min * 60 * 1000;
106
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
+ }
107
113
  /**
108
114
  * Enfileira a fase morta por rate limit.
109
115
  *
@@ -137,6 +143,7 @@ function enfileirar(carregado, novo, agoraMs = Date.now()) {
137
143
  ...(novo.runtime !== undefined ? { runtime: novo.runtime } : {}),
138
144
  ...(novo.perfil !== undefined ? { perfil: novo.perfil } : {}),
139
145
  ...(novo.motivo !== undefined ? { motivo: novo.motivo } : {}),
146
+ ...(novo.correlacao ? { correlacao: novo.correlacao } : {}),
140
147
  };
141
148
  (0, util_1.anexarJsonl)(caminhoDaFila(raiz), pedido);
142
149
  return pedido;
@@ -214,18 +221,19 @@ function faltaPara(pedido, quando = (0, util_1.agora)()) {
214
221
  /** Tabela de `ork retry list`. */
215
222
  function tabelaDaFila(raiz, quando = (0, util_1.agora)()) {
216
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;
217
225
  if (fila.length === 0) {
218
- return 'Fila de rate limit vazia: nenhuma fase morreu por limite de uso neste projeto.';
226
+ return m.filaVazia;
219
227
  }
220
228
  const linhas = fila.map((p) => [
221
229
  p.id,
222
230
  p.thread,
223
231
  p.fase,
224
- p.estado,
232
+ m.estados[p.estado] ?? p.estado,
225
233
  (0, horario_1.formatarDataHora)(p.liberaEm, { agora: quando }),
226
- 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),
227
235
  p.estado === 'aguardando' ? faltaPara(p, quando) : '',
228
236
  String(p.tentativas),
229
237
  ]);
230
- 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)}`;
231
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');
@@ -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.
@@ -33,11 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ORDEM_DAS_FORJAS = void 0;
36
+ exports.helperDeCredencialDaCli = exports.ORDEM_DAS_FORJAS = void 0;
37
37
  exports.pastasDeBinarios = pastasDeBinarios;
38
38
  exports.acharBinario = acharBinario;
39
39
  exports.versaoDoBinario = versaoDoBinario;
40
40
  exports.comGitIsolado = comGitIsolado;
41
+ exports.gitlabSemSuporteNaRede = gitlabSemSuporteNaRede;
41
42
  exports.forjaPorNome = forjaPorNome;
42
43
  exports.forjasDaMaquina = forjasDaMaquina;
43
44
  exports.ehNomeDeForja = ehNomeDeForja;
@@ -58,7 +59,12 @@ const node_child_process_1 = require("node:child_process");
58
59
  const fs = __importStar(require("node:fs"));
59
60
  const os = __importStar(require("node:os"));
60
61
  const path = __importStar(require("node:path"));
62
+ const api_1 = require("./forja/api");
63
+ const executor_1 = require("./forja/executor");
64
+ const pedidos_1 = require("./forja/gitlab/pedidos");
65
+ const texto_1 = require("./forja/texto");
61
66
  const redacao_url_1 = require("./redacao-url");
67
+ const locale_1 = require("./locale");
62
68
  exports.ORDEM_DAS_FORJAS = ['github', 'gitlab'];
63
69
  const LOGIN = /^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,254})$/;
64
70
  const HOST = /^[A-Za-z0-9.-]+(?::\d+)?$/;
@@ -170,7 +176,8 @@ function comGitIsolado(f, identidade, opcoes = {}) {
170
176
  const naoEncontrado = (s) => /HTTP 404|404 Not Found|"status"\s*:\s*"?404/i.test(`${s.stdout}\n${s.stderr}`);
171
177
  function falhou(cli, rota, s) {
172
178
  const linha = (0, redacao_url_1.redigirCredenciaisUrl)(s.stderr.trim().split('\n').pop() ?? '').slice(0, 200);
173
- return new Error(`rede.forja: ${cli} api ${rota} falhou${linha ? `: ${linha}` : ''}`);
179
+ const montarLinha = (0, locale_1.montadorDe)(linha);
180
+ return new locale_1.ErroDoCatalogo((m) => m.network.apiFalhou(cli, rota, montarLinha(m)));
174
181
  }
175
182
  /** A resposta de quem nao tem login (ou tem credencial recusada), no `gh` e no `glab`. */
176
183
  const SEM_LOGIN = /auth login|not logged|not authenticated|authentication|HTTP 401|401 Unauthorized|Bad credentials|no token/i;
@@ -178,13 +185,17 @@ const SEM_LOGIN = /auth login|not logged|not authenticated|authentication|HTTP 4
178
185
  function falhaDoLogin(cli, s) {
179
186
  if (!s.ok && SEM_LOGIN.test(`${s.stderr}\n${s.stdout}`))
180
187
  return {};
188
+ // RM-061 (F3b): a falha entra no detalhe da lacuna da casa, que a impressao remonta no locale do comando.
181
189
  if (s.ok)
182
- return { falha: `${cli} api user devolveu uma resposta sem login legivel` };
183
- return { falha: falhou(cli, 'user', s.stderr.trim() ? s : { ...s, stderr: 'sem resposta da forja no prazo' }).message.replace(/^rede\.forja: /, '') };
190
+ return { falha: (0, locale_1.textoDoCatalogo)((m) => m.network.respostaSemLogin(cli)) };
191
+ const erro = falhou(cli, 'user', s.stderr.trim() ? s : { ...s, stderr: (0, locale_1.textoDoCatalogo)((m) => m.network.semRespostaNoPrazo) });
192
+ return { falha: (0, locale_1.textoDoCatalogo)((m) => erro.montar(m).replace(/^rede\.forja: /, '')) };
184
193
  }
185
194
  /** Caminho seguro para o shell que o git usa no helper: aspas simples, com `'` escapada (B10). */
186
195
  const citar = (caminho) => /^[A-Za-z0-9_./+-]+$/.test(caminho) ? caminho : `'${caminho.replace(/'/g, `'\\''`)}'`;
187
196
  const helper = (binario) => `!${citar(binario)} auth git-credential`;
197
+ /** O mesmo helper do cache da rede, para o transporte `forja-https` do SHIP. */
198
+ exports.helperDeCredencialDaCli = helper;
188
199
  /**
189
200
  * Privado de verdade (B1): no GitHub, `internal` vem com `private: true`, e a empresa inteira le.
190
201
  * Quando a forja diz a visibilidade, so `private` conta; sem ela, o booleano.
@@ -198,7 +209,7 @@ function github(binario, amb, host = 'github.com') {
198
209
  // B2: a casa vai sempre por HTTPS, com o helper da propria CLI; SSH pediria agente, que o cron nao tem.
199
210
  const repositorioDe = (v) => {
200
211
  if (!v)
201
- throw new Error('rede.forja: gh devolveu um repositorio ilegivel');
212
+ throw new locale_1.ErroDoCatalogo((m) => m.network.repositorioIlegivel);
202
213
  return { existe: true, privado: privadoDe(v), url: typeof v.clone_url === 'string' ? v.clone_url : null };
203
214
  };
204
215
  // B9: o host da casa vai em toda chamada; o cron nao tem o ambiente do terminal.
@@ -235,38 +246,111 @@ function hostDoGitlab(amb) {
235
246
  const bruto = (ambienteDe(amb).GITLAB_HOST ?? '').trim().replace(/^https?:\/\//, '').replace(/\/.*$/, '');
236
247
  return HOST.test(bruto) ? bruto : 'gitlab.com';
237
248
  }
249
+ /**
250
+ * O que a casa da rede ainda nao suporta no GitLab da maquina: o `rede.json` guarda so `host[:porta]`, entao um GitLab em
251
+ * subcaminho (`https://host/gitlab`) ou com CA propria (`GLAB_CA_CERT`) nao teria como ser lembrado em outra maquina.
252
+ */
253
+ function gitlabSemSuporteNaRede(amb, host = hostDoGitlab(amb)) {
254
+ const env = ambienteDe(amb);
255
+ const bruto = (env.GITLAB_HOST ?? '').trim().replace(/^https?:\/\//, '');
256
+ // So o subcaminho do proprio host da casa conta: o `GITLAB_HOST` do terminal pode ser de outra instancia.
257
+ const subcaminho = /^([^/]+)\/+[^/]/.exec(bruto);
258
+ if (subcaminho && subcaminho[1].toLowerCase() === host.toLowerCase())
259
+ return 'subcaminho';
260
+ if ((env.GLAB_CA_CERT ?? '').trim() && host !== 'gitlab.com')
261
+ return 'ca';
262
+ return null;
263
+ }
264
+ /** O `rodarCli` com o ambiente e o PATH da maquina da rede (o cron tem outro ambiente que o terminal). */
265
+ const rodarNaMaquina = (amb) => (c) => {
266
+ if (!amb.env)
267
+ return (0, executor_1.rodarCli)(c);
268
+ // O ambiente da maquina da rede no lugar do do `ork`, e reduzido como o do `ork` seria: so o que a CLI le chega a ela.
269
+ return (0, executor_1.rodarCli)({ ...c, base: c.reduzido ? (0, executor_1.ambienteReduzido)(amb.env) : amb.env });
270
+ };
271
+ /** `host` ou `host:porta` da casa como alvo da API; a rede nao guarda caminho base nem CA. */
272
+ function alvoDoGitlab(host) {
273
+ const m = /^(.+?)(?::(\d+))?$/.exec(host);
274
+ return { tipo: 'gitlab', host: m[1].toLowerCase(), porta: m[2] ? Number(m[2]) : null, caminhoBase: '', ca: null };
275
+ }
276
+ const objeto = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : null);
277
+ /** A falha da API com o motivo tipado da forja (`forja.*`) no lugar da ultima linha do stderr. */
278
+ const falhouNaApi = (rota, erro) => new locale_1.ErroDoCatalogo((m) => m.network.apiFalhou('glab', rota, m.forja.motivo(erro, 'gitlab')));
279
+ /** `usuario: null` so e falta de login quando a forja disse isso (`forja.sem-login`); o resto e falha da leitura. */
280
+ function falhaDaApi(r) {
281
+ if (r.ok)
282
+ return { falha: (0, locale_1.textoDoCatalogo)((m) => m.network.respostaSemLogin('glab')) };
283
+ if (r.erro.codigo === 'forja.sem-login')
284
+ return {};
285
+ const erro = r.erro;
286
+ return { falha: (0, locale_1.textoDoCatalogo)((m) => m.network.apiFalhou('glab', 'user', m.forja.motivo(erro, 'gitlab')).replace(/^rede\.forja: /, '')) };
287
+ }
288
+ /**
289
+ * O GitLab da casa pela API da CLI logada (`chamarApi`): o host (com porta) vai por GITLAB_HOST, nunca por
290
+ * `--hostname` (o glab recusa a porta); o login e conferido antes da primeira chamada (sem ele o glab faria o pedido
291
+ * anonimo); o corpo vai pelo stdin com o Content-Type; o erro sai tipado pelo status HTTP.
292
+ */
238
293
  function gitlab(binario, amb, hostPedido) {
239
294
  const host = hostPedido ?? hostDoGitlab(amb);
295
+ const alvo = alvoDoGitlab(host);
296
+ const opcoes = { rodar: rodarNaMaquina(amb), logins: new Map() };
297
+ const pedir = (metodo, caminho, corpo, prazoMs = 15000) => (0, api_1.chamarApi)(alvo, { metodo, caminho, prazoMs, ...(corpo !== undefined ? { corpo } : {}) }, opcoes);
240
298
  const repositorioDe = (v) => {
241
299
  if (!v)
242
- throw new Error('rede.forja: glab devolveu um projeto ilegivel');
300
+ throw new locale_1.ErroDoCatalogo((m) => m.network.projetoIlegivel);
243
301
  return { existe: true, privado: privadoDe(v), url: typeof v.http_url_to_repo === 'string' ? v.http_url_to_repo : null };
244
302
  };
245
- const api = (args, timeoutMs) => rodar(binario, ['api', '--hostname', host, ...args], amb, timeoutMs);
303
+ const repositorio = (dono, nome) => {
304
+ const rota = (0, pedidos_1.projetoNaApi)(`${dono}/${nome}`);
305
+ const r = pedir('GET', rota);
306
+ if (r.ok)
307
+ return repositorioDe(objeto(r.valor.corpo));
308
+ if (r.erro.codigo === 'forja.nao-achei')
309
+ return { existe: false, privado: null, url: null };
310
+ throw falhouNaApi(rota, r.erro);
311
+ };
246
312
  return {
247
313
  nome: 'gitlab', host, cli: 'glab', binario,
248
314
  identidade() {
249
- const r = api(['user'], 15000);
250
- const login = r.ok ? json(r.stdout)?.username : null;
315
+ const r = pedir('GET', 'user');
316
+ const login = r.ok ? objeto(r.valor.corpo)?.username : null;
251
317
  const usuario = typeof login === 'string' && LOGIN.test(login) ? login : null;
252
- return { forja: 'gitlab', host, cli: 'glab', versao: versaoDoBinario(binario, amb), usuario, ...(usuario ? {} : falhaDoLogin('glab', r)) };
318
+ return { forja: 'gitlab', host, cli: 'glab', versao: versaoDoBinario(binario, amb), usuario, ...(usuario ? {} : falhaDaApi(r)) };
253
319
  },
254
- repositorio(dono, nome) {
255
- const rota = `projects/${encodeURIComponent(`${dono}/${nome}`)}`;
256
- const r = api([rota], 15000);
257
- if (!r.ok) {
258
- if (naoEncontrado(r))
259
- return { existe: false, privado: null, url: null };
260
- throw falhou('glab', rota, r);
320
+ repositorio,
321
+ criarPrivado(nome, descricao, dono, namespaceId) {
322
+ const r = pedir('POST', 'projects', { name: nome, path: nome, visibility: 'private', description: descricao,
323
+ ...(namespaceId ? { namespace_id: namespaceId } : {}) }, 30000);
324
+ if (r.ok) {
325
+ const criado = objeto(r.valor.corpo), pedido = `${dono ?? ''}${dono ? '/' : ''}${nome}`;
326
+ // O projeto tem de nascer no caminho pedido: outro namespace seria uma casa que a rede nunca acharia.
327
+ const caminho = typeof criado?.path_with_namespace === 'string' ? criado.path_with_namespace : null;
328
+ if (dono && caminho !== null && caminho.toLowerCase() !== pedido.toLowerCase()) {
329
+ const visto = (0, texto_1.deFora)(caminho, 200);
330
+ throw new locale_1.ErroDoCatalogo((m) => m.network.projetoEmOutroCaminho(pedido, visto));
331
+ }
332
+ return repositorioDe(criado);
261
333
  }
262
- return repositorioDe(json(r.stdout));
334
+ // Escrita nunca se repete sozinha: relida a casa, o projeto que a forja criou antes de a resposta se perder vale. A
335
+ // releitura que falha nao apaga o motivo do POST.
336
+ if (dono) {
337
+ let relido = null;
338
+ try {
339
+ relido = repositorio(dono, nome);
340
+ }
341
+ catch {
342
+ relido = null;
343
+ }
344
+ if (relido?.existe)
345
+ return relido;
346
+ }
347
+ throw falhouNaApi('projects', r.erro);
263
348
  },
264
- criarPrivado(nome, descricao) {
265
- const r = api(['-X', 'POST', 'projects', '-f', `name=${nome}`, '-f', 'visibility=private',
266
- '-f', `description=${descricao}`], 30000);
267
- if (!r.ok)
268
- throw falhou('glab', 'projects', r);
269
- return repositorioDe(json(r.stdout));
349
+ donoDaRede(dono) {
350
+ // Carga tardia: o registro chega a este modulo pelo executor da forja; importar no topo fecharia um ciclo de carga.
351
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
352
+ const { adaptadorDaForja, exigirCapacidade } = require('./forja/registro');
353
+ return exigirCapacidade(adaptadorDaForja('gitlab'), 'donoDaRede')({ api: (p) => (0, api_1.chamarApi)(alvo, p, opcoes), dono });
270
354
  },
271
355
  helperDeCredencial: () => helper(binario),
272
356
  };