@orkastery/cli 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/adapters/README.md +18 -0
  2. package/adapters/claude-code/.claude-plugin/plugin.json +1 -0
  3. package/adapters/claude-code/README.md +195 -5
  4. package/adapters/claude-code/agents/ork-check.md +1 -0
  5. package/adapters/claude-code/agents/ork-go.md +1 -0
  6. package/adapters/claude-code/agents/ork-goal.md +1 -0
  7. package/adapters/claude-code/agents/ork-master.md +1 -0
  8. package/adapters/claude-code/agents/ork-plan.md +1 -0
  9. package/adapters/claude-code/agents/ork-ship.md +1 -0
  10. package/adapters/claude-code/hooks/hooks.json +2 -1
  11. package/adapters/claude-code/hooks/ork-guard.js +15 -1
  12. package/adapters/claude-code/hooks/ork-resposta.js +91 -0
  13. package/adapters/claude-code/hooks/ork-sensor.js +18 -2
  14. package/adapters/claude-code/hooks/quota-signal.js +14 -0
  15. package/adapters/claude-code/mods/autoridade.json +56 -0
  16. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  17. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  18. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  19. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  20. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  21. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  23. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  24. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  25. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  26. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  27. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  28. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  29. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  30. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  31. package/adapters/claude-code/mods/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  32. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  33. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  35. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  36. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  37. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  38. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  39. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  40. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  41. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  42. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  43. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  44. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  45. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  46. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  47. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  48. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  49. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  50. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +121 -0
  51. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  52. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  53. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  54. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  55. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  56. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  57. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  58. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  59. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  61. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  62. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  63. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  64. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  65. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  66. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  67. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  68. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  69. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  70. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  71. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  72. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  73. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  74. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  75. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  76. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  77. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  78. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  79. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  80. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  82. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  83. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  84. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  85. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  86. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  87. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  88. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  89. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  90. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  91. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  92. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  93. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  94. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  95. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  96. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  97. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  98. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  99. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  100. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  101. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  102. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  103. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  104. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  105. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  106. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  107. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  108. package/adapters/codex/skills/ork/SKILL.md +2 -0
  109. package/adapters/hermes/README.md +64 -1
  110. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  111. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  112. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  113. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  114. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  115. package/adapters/hermes/hermes.plugin.json +4 -0
  116. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  117. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +3 -3
  118. package/adapters/openclaw/README.md +83 -10
  119. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  120. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  121. package/adapters/openclaw/dist/index.js +86 -0
  122. package/adapters/openclaw/openclaw.plugin.json +34 -4
  123. package/adapters/openclaw/package.json +2 -2
  124. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  125. package/adapters/openclaw/src/index.ts +94 -0
  126. package/assets/adapters-en/claude-code/README.md +403 -0
  127. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  128. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  129. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  130. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  131. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  132. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  133. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  134. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  135. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  136. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  137. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  138. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  139. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  140. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  141. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  142. package/assets/adapters-en/hermes/README.md +273 -0
  143. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  144. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  145. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  146. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  147. package/assets/docs-en/produto/README.md +14 -0
  148. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  149. package/assets/docs-en/roadmap/README.md +14 -0
  150. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  151. package/assets/references-en/README.md +25 -0
  152. package/assets/references-en/code-review-axes.md +82 -0
  153. package/assets/references-en/definition-of-done.md +74 -0
  154. package/assets/references-en/performance-checklist.md +53 -0
  155. package/assets/references-en/security-checklist.md +101 -0
  156. package/assets/references-en/testing-patterns.md +51 -0
  157. package/assets/security-scan/defaults/.golangci.yml +2 -0
  158. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  159. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  160. package/assets/security-scan/defaults/ruff.toml +1 -0
  161. package/assets/security-scan/tools-agil.json +87 -0
  162. package/assets/security-scan/tools.json +625 -0
  163. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  164. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  165. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  166. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  167. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  168. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  169. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  170. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  171. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  172. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  173. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  174. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  175. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  176. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  177. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  178. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  179. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  180. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  181. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  182. package/dist/adapters/claude-bg.js +193 -15
  183. package/dist/adapters/codex-controller-worker.js +12 -5
  184. package/dist/adapters/codex-events.js +16 -4
  185. package/dist/adapters/codex.js +13 -2
  186. package/dist/agents-md.js +24 -15
  187. package/dist/atualizar-branch.js +245 -0
  188. package/dist/auditoria.js +13 -11
  189. package/dist/auditrun.js +68 -48
  190. package/dist/autorizacao-duravel.js +327 -0
  191. package/dist/board.js +98 -43
  192. package/dist/branch-de-estado.js +39 -9
  193. package/dist/busca-semantica.js +7 -5
  194. package/dist/catalogo.js +35 -1
  195. package/dist/changelog-reconciliacao.js +290 -0
  196. package/dist/check-agil.js +500 -0
  197. package/dist/check-modo.js +41 -0
  198. package/dist/check-paralelo.js +183 -0
  199. package/dist/ci.js +255 -46
  200. package/dist/ciclos.js +8 -6
  201. package/dist/claim-lint.js +12 -8
  202. package/dist/claims-conferir.js +350 -0
  203. package/dist/claims.js +13 -10
  204. package/dist/company-brain-client.js +45 -3
  205. package/dist/company-brain-journal.js +2 -1
  206. package/dist/company-brain-migration.js +47 -6
  207. package/dist/conducao-batida.js +759 -0
  208. package/dist/conducao-sentinela.js +405 -0
  209. package/dist/conducao-texto.js +12 -18
  210. package/dist/conducao.js +206 -59
  211. package/dist/conhecimento-consulta.js +270 -0
  212. package/dist/conhecimento.js +514 -0
  213. package/dist/conta-esgotada.js +127 -0
  214. package/dist/dado-privado.js +816 -0
  215. package/dist/decisao-autonoma.js +5 -4
  216. package/dist/demo.js +14 -12
  217. package/dist/dependencias-da-worktree.js +25 -0
  218. package/dist/divida.js +38 -36
  219. package/dist/docs.js +103 -82
  220. package/dist/doctor-forja.js +345 -0
  221. package/dist/doctor-pulse-cron.js +294 -27
  222. package/dist/doctor-rede.js +18 -17
  223. package/dist/doctor.js +278 -116
  224. package/dist/dsn-da-memoria.js +417 -0
  225. package/dist/entrega-por-mod.js +503 -0
  226. package/dist/entrega-pr.js +158 -57
  227. package/dist/escopo-escrita.js +10 -1
  228. package/dist/esgotamentos.js +13 -11
  229. package/dist/estado-thread.js +42 -17
  230. package/dist/evalrunner.js +35 -32
  231. package/dist/experiencia-instalacao.js +45 -25
  232. package/dist/fabrica-batida.js +323 -0
  233. package/dist/fabrica-estado.js +49 -16
  234. package/dist/fabrica-publicar.js +3 -1
  235. package/dist/fila-pesada.js +444 -0
  236. package/dist/fix.js +24 -21
  237. package/dist/forja/adaptador.js +6 -0
  238. package/dist/forja/ambiente-de-ci.js +27 -0
  239. package/dist/forja/api.js +256 -0
  240. package/dist/forja/cache.js +89 -0
  241. package/dist/forja/cli.js +60 -0
  242. package/dist/forja/contrato.js +9 -0
  243. package/dist/forja/endereco.js +43 -0
  244. package/dist/forja/estado.js +22 -0
  245. package/dist/forja/executor.js +73 -0
  246. package/dist/forja/github/ci.js +95 -0
  247. package/dist/forja/github/dono-da-rede.js +18 -0
  248. package/dist/forja/github/metadados.js +15 -0
  249. package/dist/forja/github/pedidos.js +200 -0
  250. package/dist/forja/gitlab/ci.js +141 -0
  251. package/dist/forja/gitlab/consultas.js +59 -0
  252. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  253. package/dist/forja/gitlab/metadados.js +15 -0
  254. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  255. package/dist/forja/gitlab/pedidos.js +141 -0
  256. package/dist/forja/produtor.js +32 -0
  257. package/dist/forja/registro.js +31 -0
  258. package/dist/forja/resolver.js +121 -0
  259. package/dist/forja/texto.js +13 -0
  260. package/dist/forja/versao.js +71 -0
  261. package/dist/forja.js +124 -81
  262. package/dist/gates.js +3 -28
  263. package/dist/handoff.js +33 -19
  264. package/dist/hitl-contract.js +46 -43
  265. package/dist/hitl-curto.js +37 -25
  266. package/dist/hitl-gates.js +13 -11
  267. package/dist/hitl-local-receipt.js +53 -0
  268. package/dist/hitl-local.js +11 -2
  269. package/dist/hitl-lock.js +5 -11
  270. package/dist/hitl-public-receipt.js +11 -0
  271. package/dist/hitl-resumo.js +72 -3
  272. package/dist/hitl-sessions.js +62 -9
  273. package/dist/hitl-tempo-parado.js +4 -4
  274. package/dist/hitl-texto-livre.js +7 -4
  275. package/dist/hitl.js +63 -64
  276. package/dist/horario.js +30 -7
  277. package/dist/hosts.js +155 -134
  278. package/dist/impedimento.js +108 -14
  279. package/dist/index.js +1421 -1019
  280. package/dist/indice-vetorial.js +14 -12
  281. package/dist/indice.js +7 -1
  282. package/dist/init.js +54 -49
  283. package/dist/instabilidade.js +144 -0
  284. package/dist/integracoes-locais.js +4 -0
  285. package/dist/intelligence-graph-cli.js +213 -88
  286. package/dist/intelligence-graph-contexto.js +56 -17
  287. package/dist/intelligence-graph-contract.js +2 -1
  288. package/dist/intelligence-graph-extract-md.js +56 -4
  289. package/dist/intelligence-graph-extract-ts.js +71 -3
  290. package/dist/intelligence-graph-query.js +96 -34
  291. package/dist/leases.js +19 -18
  292. package/dist/ledger-stats.js +17 -16
  293. package/dist/ledger.js +46 -2
  294. package/dist/licoes.js +12 -11
  295. package/dist/liveness.js +6 -3
  296. package/dist/locale-accounts.js +220 -0
  297. package/dist/locale-adapter.js +291 -0
  298. package/dist/locale-ajuda.js +833 -0
  299. package/dist/locale-audit.js +199 -0
  300. package/dist/locale-claims.js +213 -0
  301. package/dist/locale-conducao.js +138 -0
  302. package/dist/locale-conhecimento.js +181 -0
  303. package/dist/locale-decisao.js +205 -0
  304. package/dist/locale-docs.js +230 -0
  305. package/dist/locale-estado.js +101 -0
  306. package/dist/locale-forja.js +290 -0
  307. package/dist/locale-gerados.js +165 -0
  308. package/dist/locale-grafo.js +129 -0
  309. package/dist/locale-master.js +182 -0
  310. package/dist/locale-network.js +524 -0
  311. package/dist/locale-onboarding.js +92 -0
  312. package/dist/locale-operacao-restante.js +931 -0
  313. package/dist/locale-phase.js +151 -0
  314. package/dist/locale-projetos.js +100 -0
  315. package/dist/locale-prompts.js +194 -0
  316. package/dist/locale-pulse.js +349 -0
  317. package/dist/locale-reservas.js +87 -0
  318. package/dist/locale-retry.js +524 -0
  319. package/dist/locale-roadmap.js +102 -0
  320. package/dist/locale-security-scan.js +69 -0
  321. package/dist/locale-setup.js +192 -0
  322. package/dist/locale-ship.js +597 -0
  323. package/dist/locale-thread.js +421 -0
  324. package/dist/locale-verify.js +201 -0
  325. package/dist/locale-worktree.js +246 -0
  326. package/dist/locale.js +1258 -0
  327. package/dist/maestro-runtime.js +22 -3
  328. package/dist/manifest.js +415 -13
  329. package/dist/maquina-ociosa.js +211 -0
  330. package/dist/maquina.js +31 -7
  331. package/dist/master-digest.js +6 -1
  332. package/dist/master-nota-local.js +200 -0
  333. package/dist/master-nota.js +14 -8
  334. package/dist/master.js +139 -65
  335. package/dist/mcp-artifacts.js +11 -2
  336. package/dist/mcp-conhecimento.js +52 -0
  337. package/dist/mcp-experiencia.js +26 -5
  338. package/dist/mcp-git.js +23 -6
  339. package/dist/mcp-grafo.js +7 -4
  340. package/dist/mcp-install.js +73 -8
  341. package/dist/mcp-noctum.js +101 -0
  342. package/dist/mcp-server.js +90 -16
  343. package/dist/mcp-ship-transporte.js +977 -0
  344. package/dist/mcp-ship.js +71 -25
  345. package/dist/mcp-transportes.js +17 -0
  346. package/dist/mcp-verify.js +6 -1
  347. package/dist/memoria.js +63 -58
  348. package/dist/modos-migracao.js +8 -6
  349. package/dist/modos.js +20 -24
  350. package/dist/network-roadmap.js +90 -51
  351. package/dist/noctum-aceite.js +789 -0
  352. package/dist/noctum-arco.js +1418 -0
  353. package/dist/noctum-capacidade.js +141 -0
  354. package/dist/noctum-changelog.js +399 -0
  355. package/dist/noctum-cli.js +482 -0
  356. package/dist/noctum-coordenacao.js +1225 -0
  357. package/dist/noctum-entrega.js +1169 -0
  358. package/dist/noctum-envelope.js +1046 -0
  359. package/dist/noctum-execucao.js +376 -0
  360. package/dist/noctum-fechamento.js +405 -0
  361. package/dist/noctum-fila.js +314 -0
  362. package/dist/noctum-guarda.js +256 -0
  363. package/dist/noctum-integracao.js +507 -0
  364. package/dist/noctum-maquinas.js +383 -0
  365. package/dist/noctum-medicao.js +450 -0
  366. package/dist/noctum-modo.js +362 -0
  367. package/dist/noctum-pergunta-canal.js +96 -0
  368. package/dist/noctum-pergunta.js +115 -0
  369. package/dist/noctum-provas.js +838 -0
  370. package/dist/noctum-reconciliacao.js +591 -0
  371. package/dist/noctum-registro.js +215 -0
  372. package/dist/noctum-relatorio.js +827 -0
  373. package/dist/noctum-resposta.js +207 -0
  374. package/dist/noctum-sessoes-em-voo.js +93 -0
  375. package/dist/noctum-supervisao.js +649 -0
  376. package/dist/noctum-terminal.js +459 -0
  377. package/dist/noctum-transporte.js +655 -0
  378. package/dist/noctum-vigia.js +639 -0
  379. package/dist/ocupacao.js +32 -3
  380. package/dist/onboarding.js +56 -26
  381. package/dist/orkmind.js +48 -25
  382. package/dist/orquestracao.js +44 -47
  383. package/dist/parado-no-condutor.js +174 -127
  384. package/dist/phase.js +144 -63
  385. package/dist/policies.js +37 -4
  386. package/dist/portfolio.js +4 -2
  387. package/dist/postura-local.js +235 -0
  388. package/dist/preflight.js +11 -10
  389. package/dist/procedencia.js +220 -0
  390. package/dist/projeto-alvo.js +186 -24
  391. package/dist/prompts.js +140 -42
  392. package/dist/prova-minima.js +5 -6
  393. package/dist/pulse-cadencia.js +5 -4
  394. package/dist/pulse-consentimento.js +53 -1
  395. package/dist/pulse-delivery.js +151 -24
  396. package/dist/pulse-resposta.js +368 -4
  397. package/dist/pulse.js +188 -22
  398. package/dist/ratelimit.js +16 -6
  399. package/dist/recall.js +14 -13
  400. package/dist/redacao-saida.js +63 -0
  401. package/dist/rede-adesao.js +13 -8
  402. package/dist/rede-forja.js +108 -24
  403. package/dist/rede-status.js +66 -47
  404. package/dist/rede.js +86 -46
  405. package/dist/retomada-checkpoint.js +101 -0
  406. package/dist/retry.js +451 -212
  407. package/dist/roadmap-reservas.js +45 -28
  408. package/dist/roadmap-status.js +129 -33
  409. package/dist/runtime-ambiente.js +5 -0
  410. package/dist/runtime-context.js +284 -32
  411. package/dist/runtime-escada.js +423 -0
  412. package/dist/runtime-profiles.js +103 -46
  413. package/dist/runtimes.js +2 -1
  414. package/dist/saida-segura.js +3 -2
  415. package/dist/security-scan/agil.js +355 -0
  416. package/dist/security-scan/cli.js +76 -0
  417. package/dist/security-scan/compare.js +149 -0
  418. package/dist/security-scan/config.js +93 -0
  419. package/dist/security-scan/detect.js +97 -0
  420. package/dist/security-scan/executor.js +188 -0
  421. package/dist/security-scan/guard.js +180 -0
  422. package/dist/security-scan/imagem-de-lint.js +96 -0
  423. package/dist/security-scan/normalize/actionlint.js +12 -0
  424. package/dist/security-scan/normalize/eslint.js +12 -0
  425. package/dist/security-scan/normalize/gitleaks.js +13 -0
  426. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  427. package/dist/security-scan/normalize/govulncheck.js +36 -0
  428. package/dist/security-scan/normalize/index.js +25 -0
  429. package/dist/security-scan/normalize/npm-audit.js +30 -0
  430. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  431. package/dist/security-scan/normalize/oxlint.js +51 -0
  432. package/dist/security-scan/normalize/pip-audit.js +16 -0
  433. package/dist/security-scan/normalize/ruff.js +12 -0
  434. package/dist/security-scan/normalize/semgrep.js +20 -0
  435. package/dist/security-scan/normalize/trivy.js +33 -0
  436. package/dist/security-scan/normalize/util.js +204 -0
  437. package/dist/security-scan/normalize/zizmor.js +19 -0
  438. package/dist/security-scan/report.js +156 -0
  439. package/dist/security-scan/run.js +448 -0
  440. package/dist/security-scan/tools.js +62 -0
  441. package/dist/security-scan/trabalhador.js +74 -0
  442. package/dist/security-scan/types.js +15 -0
  443. package/dist/session-events.js +26 -5
  444. package/dist/session-watcher-claude.js +81 -20
  445. package/dist/session-watcher.js +340 -42
  446. package/dist/sessoes-contas.js +10 -1
  447. package/dist/sessoes-inventario.js +1 -1
  448. package/dist/sessoes.js +25 -23
  449. package/dist/setup.js +59 -58
  450. package/dist/ship-publicar.js +971 -0
  451. package/dist/ship.js +243 -97
  452. package/dist/steal.js +77 -0
  453. package/dist/superficie.js +14 -11
  454. package/dist/thread-close.js +12 -11
  455. package/dist/thread.js +274 -100
  456. package/dist/tokens.js +15 -11
  457. package/dist/trabalho-thread.js +297 -0
  458. package/dist/transporte-do-canal.js +189 -0
  459. package/dist/types.js +12 -1
  460. package/dist/util.js +13 -3
  461. package/dist/varredura-acoes.js +507 -0
  462. package/dist/verify.js +608 -76
  463. package/dist/vida-da-thread.js +254 -0
  464. package/dist/worktree-local.js +167 -0
  465. package/dist/worktree.js +99 -83
  466. package/dist/yaml.js +27 -8
  467. package/eval/casos/check-quality.json +77 -0
  468. package/eval/casos/security-auditor.json +148 -0
  469. package/eval/casos/security-remediation.json +161 -0
  470. package/eval/fixtures/security-scan/README.md +8 -0
  471. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  472. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  473. package/eval/fixtures/security-scan/go/README.md +4 -0
  474. package/eval/fixtures/security-scan/go/config.go +4 -0
  475. package/eval/fixtures/security-scan/go/go.mod +5 -0
  476. package/eval/fixtures/security-scan/go/go.sum +2 -0
  477. package/eval/fixtures/security-scan/go/main.go +31 -0
  478. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  479. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  480. package/eval/fixtures/security-scan/js/README.md +4 -0
  481. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  482. package/eval/fixtures/security-scan/js/package.json +10 -0
  483. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  484. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  485. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  486. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  487. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  488. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  489. package/eval/fixtures/security-scan/python/README.md +4 -0
  490. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  491. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  492. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  493. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  494. package/package.json +9 -4
  495. package/references/security-checklist.md +3 -3
  496. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  497. package/skills/README.md +1 -0
  498. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  499. package/skills/phases/check-quality/SKILL.md +16 -0
  500. package/skills/phases/go-implementation/SKILL.md +6 -0
  501. package/skills/phases/security-remediation/SKILL.md +70 -0
  502. package/skills/reviewers/security-auditor/SKILL.md +25 -0
package/dist/forja.js CHANGED
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mesmaForja = exports.rotuloDaForja = exports.executorPadrao = void 0;
3
+ exports.apiDoGitlab = exports.mesmaForja = exports.rotuloDaForja = exports.executorPadrao = void 0;
4
4
  exports.enderecoDoRemoto = enderecoDoRemoto;
5
5
  exports.repositorioGithubNoHost = repositorioGithubNoHost;
6
6
  exports.identidadeDaForja = identidadeDaForja;
7
+ exports.identidadeDaForjaResolvida = identidadeDaForjaResolvida;
7
8
  exports.forjaDoArgumento = forjaDoArgumento;
8
9
  exports.detalheSeguro = detalheSeguro;
10
+ exports.detalheDoPush = detalheDoPush;
11
+ exports.pushRecusadoPelaProtecao = pushRecusadoPelaProtecao;
9
12
  exports.classificarFalha = classificarFalha;
10
13
  exports.lerCommitsDaForja = lerCommitsDaForja;
11
14
  exports.lerDaForja = lerDaForja;
@@ -20,16 +23,19 @@ exports.lerDaForja = lerDaForja;
20
23
  *
21
24
  * GitHub responde tudo em UMA consulta: a base com `docs/roadmap`, o manifesto e os commits desde
22
25
  * `desde`, e as duas branches de estado, cada parte no commit que a propria consulta devolve.
23
- * GitLab devolve a mesma leitura por consultas GraphQL e pelo REST de commits; sem `glab` na
24
- * maquina que construiu, o esquema dele esta provado so com resposta simulada (D4 do PLAN).
26
+ * GitLab devolve a mesma leitura por consultas GraphQL e pelo REST de commits, pela API da CLI
27
+ * logada (`forja/api.ts`); o esquema esta provado com as respostas gravadas de um GitLab de verdade.
25
28
  *
26
29
  * Resposta fora do formato vira erro tipado, nunca lista vazia: quem le nao confunde "nao li" com
27
30
  * "nao tem".
28
31
  */
29
- const node_child_process_1 = require("node:child_process");
32
+ const endereco_1 = require("./forja/endereco");
30
33
  const hitl_1 = require("./hitl");
31
34
  const policies_1 = require("./policies");
32
- const rede_forja_1 = require("./rede-forja");
35
+ const executor_1 = require("./forja/executor");
36
+ const api_1 = require("./forja/api");
37
+ const consultas_1 = require("./forja/gitlab/consultas");
38
+ const pedidos_1 = require("./forja/gitlab/pedidos");
33
39
  const PRAZO_MS = 30000;
34
40
  const SHA = /^[0-9a-f]{40}$/;
35
41
  const SEGMENTO = /^[A-Za-z0-9_.-]+$/;
@@ -38,21 +44,20 @@ const HOST = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9]
38
44
  /**
39
45
  * Sem shell, sem token: a CLI usa a autenticacao que ja tem; prompt e aviso de versao desligados.
40
46
  * RM-054 (fatia 3): o binario e procurado como na rede (D11 da RM-053), no PATH e depois nas pastas de
41
- * usuario (`~/.local/bin` e as outras): o gateway e o cron rodam com PATH curto, e o `gh` da srvjcp86
47
+ * usuario (`~/.local/bin` e as outras): o gateway e o cron rodam com PATH curto, e o `gh` da maquina-b
42
48
  * mora em `~/.local/bin`. Sem achar, o nome vai cru ao spawn, e o ENOENT continua `forja.ausente`.
43
49
  */
44
- const executorPadrao = (cmd, args, entrada, timeoutMs) => {
45
- const r = (0, node_child_process_1.spawnSync)((0, rede_forja_1.acharBinario)(cmd) ?? cmd, [...args], {
46
- input: entrada, encoding: 'utf8', timeout: timeoutMs, maxBuffer: 32 * 1024 * 1024,
47
- env: { ...process.env, GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1', GLAB_CHECK_UPDATE: 'false', NO_COLOR: '1' },
48
- });
49
- return { status: r.status, stdout: (r.stdout ?? '').toString(), stderr: (r.stderr ?? '').toString(), sinal: r.signal ?? null,
50
- ...(r.error ? { erro: r.error.code ?? r.error.message } : {}) };
51
- };
50
+ const executorPadrao = (cmd, args, entrada, timeoutMs) => (0, executor_1.rodarCli)({ cmd, args, entrada,
51
+ prazoMs: timeoutMs, maxBuffer: 32 * 1024 * 1024,
52
+ acrescentar: { GH_PROMPT_DISABLED: '1', GH_NO_UPDATE_NOTIFIER: '1', GLAB_CHECK_UPDATE: 'false', NO_COLOR: '1' } });
52
53
  exports.executorPadrao = executorPadrao;
53
54
  // ---------------------------------------------------------------------------
54
55
  // Identidade
55
56
  // ---------------------------------------------------------------------------
57
+ /**
58
+ * O tipo pelo nome do host. So vale onde nao ha manifesto nem login para resolver: a rede le os remotos de outros
59
+ * projetos. A CI do projeto usa a forja resolvida (`forja/resolver.ts`), que nao decide pelo nome.
60
+ */
56
61
  function tipoDoHost(host) {
57
62
  if (host === 'github.com' || /(^|[.-])github([.-]|$)/.test(host))
58
63
  return 'github';
@@ -75,14 +80,9 @@ function montar(tipo, host, caminho) {
75
80
  * na URL nunca entra; caminho local e host que nao e hostname voltam null.
76
81
  */
77
82
  function enderecoDoRemoto(url) {
78
- const t = url.trim();
79
- const esquema = /^(?:https?|ssh|git|git\+ssh|ssh\+git):\/\/(?:[^@/]*@)?([^/:?#@]+)(?::\d+)?\/([^?#\s]+)$/i.exec(t);
80
- const scp = esquema ? null : /^(?:[^@\s/:]+@)?([^:\s/@]+):(?!\/\/)([^\s]+)$/.exec(t);
81
- const achado = esquema ?? scp;
82
- if (!achado)
83
- return null;
84
- const host = achado[1].toLowerCase();
85
- return HOST.test(host) ? { host, caminho: achado[2].replace(/^\/+/, '') } : null;
83
+ // Parser unico (forja/endereco.ts); aqui so o `HOST` com ponto e o caminho como escrito (`montar` o valida).
84
+ const lido = (0, endereco_1.lerHostDoRemoto)(url);
85
+ return lido && HOST.test(lido.host) ? { host: lido.host, caminho: lido.caminhoBruto } : null;
86
86
  }
87
87
  /**
88
88
  * RM-037 (fatia 5, A5): o `dono/nome` de um repositorio do GitHub no host do remoto, com qualquer host: o GitHub
@@ -99,7 +99,29 @@ function repositorioGithubNoHost(url) {
99
99
  function identidadeDaForja(url) {
100
100
  const endereco = enderecoDoRemoto(url);
101
101
  const tipo = endereco ? tipoDoHost(endereco.host) : null;
102
- return endereco && tipo ? montar(tipo, endereco.host, endereco.caminho) : null;
102
+ const id = endereco && tipo ? montar(tipo, endereco.host, endereco.caminho) : null;
103
+ const porta = id?.tipo === 'gitlab' ? portaDaApiNoRemoto(url) : null;
104
+ return id && porta !== null ? { ...id, porta } : id;
105
+ }
106
+ /**
107
+ * A identidade de uma forja ja resolvida (o bloco `forja:`, o host conhecido), na forma que a leitura do roadmap usa. A
108
+ * porta, o caminho base e a CA so entram no GitLab: o GitHub le pelo `gh` com o host.
109
+ */
110
+ function identidadeDaForjaResolvida(f) {
111
+ const id = montar(f.tipo, f.host, f.repo);
112
+ if (!id || id.tipo !== 'gitlab')
113
+ return id;
114
+ return { ...id, ...(f.porta !== null ? { porta: f.porta } : {}), ...(f.caminhoBase ? { caminhoBase: f.caminhoBase } : {}),
115
+ ...(f.ca ? { ca: f.ca } : {}) };
116
+ }
117
+ /** A porta da API num remoto https/http, quando nao e a do esquema; a porta de ssh e do ssh e nunca entra. */
118
+ function portaDaApiNoRemoto(url) {
119
+ const lido = (0, endereco_1.lerHostDoRemoto)(url);
120
+ if (!lido || (lido.protocolo !== 'https' && lido.protocolo !== 'http') || lido.porta === null)
121
+ return null;
122
+ if (lido.porta < 1 || lido.porta > 65535 || lido.porta === (lido.protocolo === 'https' ? 443 : 80))
123
+ return null;
124
+ return lido.porta;
103
125
  }
104
126
  /** `github:dono/repo`, `gitlab:grupo/sub/repo` (com host proprio: `gitlab:host.tld/grupo/repo`) ou uma URL. */
105
127
  function forjaDoArgumento(texto) {
@@ -115,20 +137,57 @@ function forjaDoArgumento(texto) {
115
137
  return /^[a-z+]+:\/\//i.test(t) || /^[^@\s/:]+@[^:\s/]+:/.test(t) ? identidadeDaForja(t) : null;
116
138
  }
117
139
  /** Como a forja aparece para gente: `github.com/orkastery/orkastery`. */
118
- const rotuloDaForja = (f) => `${f.host}/${f.repo}`;
140
+ const rotuloDaForja = (f) => `${f.host}${f.porta ? `:${f.porta}` : ''}/${f.repo}`;
119
141
  exports.rotuloDaForja = rotuloDaForja;
142
+ /** O mesmo repositorio: tipo, host e repo. A porta da API nao entra, senao o mesmo repo por ssh, https e `gitlab:host/g/r` nao casaria. */
120
143
  const mesmaForja = (a, b) => !!a && !!b && a.tipo === b.tipo && a.host === b.host && a.repo.toLowerCase() === b.repo.toLowerCase();
121
144
  exports.mesmaForja = mesmaForja;
122
145
  // ---------------------------------------------------------------------------
123
146
  // Erros
124
147
  // ---------------------------------------------------------------------------
148
+ /**
149
+ * O texto inteiro sem segredo. Os tokens do GitLab podem ter ponto (formato roteavel, `glpat-xxxx.01.yyyy`), por isso a
150
+ * classe inclui o ponto e nao ha `\b` no fim, que cortaria no ponto e deixaria o sufixo; o token de registro de runner
151
+ * legado tem o prefixo fixo `GR1348941`.
152
+ */
153
+ function redigirDaForja(texto) {
154
+ return (0, hitl_1.redigirSegredos)(texto)
155
+ .replace(/\b(?:glpat|gldt|glrt|glptt|glcbt|gloas|glft|glimt|glsoat)-[A-Za-z0-9_.-]{16,}/g, '[redigido]')
156
+ .replace(/\bGR1348941[A-Za-z0-9_-]{20,}/g, '[redigido]')
157
+ .replace(/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g, '[redigido]');
158
+ }
159
+ const OMITIDO = '[detalhe omitido: um padrão de segredo casou]';
125
160
  /** O fim da saida de erro, sem segredo: redigido, e descartado inteiro se ainda casar um padrao. */
126
161
  function detalheSeguro(texto) {
127
- const redigido = (0, hitl_1.redigirSegredos)(texto)
128
- .replace(/\b(?:glpat|gldt|glrt|glptt|glcbt)-[A-Za-z0-9_-]{16,}\b/g, '[redigido]')
129
- .replace(/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g, '[redigido]');
130
- const linha = redigido.split('\n').map((l) => l.trim()).filter(Boolean).slice(-2).join(' ').slice(0, 240);
131
- return (0, policies_1.procurarSegredos)(linha).length ? '[detalhe omitido: um padrão de segredo casou]' : linha;
162
+ const linha = redigirDaForja(texto).split('\n').map((l) => l.trim()).filter(Boolean).slice(-2).join(' ').slice(0, 240);
163
+ return (0, policies_1.procurarSegredos)(linha).length ? OMITIDO : linha;
164
+ }
165
+ /**
166
+ * O motivo de um `git push` recusado, sem segredo. O texto inteiro e redigido antes do corte; as linhas `hint:` saem,
167
+ * e fica o comeco do resto (ate 400 caracteres), onde o git poe o `! [rejected]` ou `! [remote rejected]` e o
168
+ * `error: failed to push`. Guardar so o fim perderia o motivo: num non-fast-forward, as ultimas linhas sao hints.
169
+ */
170
+ function detalheDoPush(texto) {
171
+ const linhas = redigirDaForja(texto).split('\n').map((l) => l.trim()).filter((l) => l && !/^hint:/i.test(l));
172
+ const detalhe = linhas.join(' ').slice(0, 400);
173
+ return (0, policies_1.procurarSegredos)(detalhe).length ? OMITIDO : detalhe;
174
+ }
175
+ /**
176
+ * O push recusado pela protecao da branch. O GitHub diz `GH006: Protected branch update failed` e
177
+ * `protected branch hook declined`; o GitLab diz `You are not allowed to push code to protected branches` (ou
178
+ * `force push code to a protected branch`) antes do `pre-receive hook declined`. O `GH013` (regras do repositorio) e
179
+ * generico: tambem vem da protecao contra segredo, de regra de caminho ou de mensagem de commit. Por isso so conta com
180
+ * o sinal da protecao da branch na mesma saida (`Changes must be made through a pull request` ou `Cannot update this
181
+ * protected ref`), e nunca com `PUSH PROTECTION` / `Push cannot contain secrets`. O `pre-receive hook declined` sozinho
182
+ * e de qualquer gancho, e o "not allowed to push code to this project" do GitLab e falta de acesso ao projeto.
183
+ */
184
+ function pushRecusadoPelaProtecao(texto) {
185
+ if (/PUSH PROTECTION|Push cannot contain secrets/i.test(texto))
186
+ return false;
187
+ if (/\bGH006\b|protected branch hook declined|not allowed to (?:force )?push code to (?:a )?protected branch/i.test(texto))
188
+ return true;
189
+ return /\bGH013\b|repository rule violations/i.test(texto)
190
+ && /Changes must be made through a pull request|Cannot update this protected ref/i.test(texto);
132
191
  }
133
192
  function erro(codigo, detalhe) {
134
193
  return { ok: false, erro: { codigo, detalhe } };
@@ -138,16 +197,16 @@ function classificarFalha(cmd, s) {
138
197
  if (s.erro === 'ENOENT')
139
198
  return { codigo: 'forja.ausente', detalhe: `${cmd} não está instalado nesta máquina` };
140
199
  if (s.erro === 'ETIMEDOUT' || s.sinal === 'SIGTERM')
141
- return { codigo: 'forja.tempo-esgotado', detalhe: `${cmd} não respondeu em ${PRAZO_MS / 1000} s` };
200
+ return { codigo: 'forja.indisponivel', detalhe: `${cmd} não respondeu em ${PRAZO_MS / 1000} s` };
142
201
  const texto = `${s.stderr}\n${s.stdout}`;
143
202
  const detalhe = detalheSeguro(s.stderr || s.stdout || s.erro || `${cmd} saiu com ${s.status}`);
144
203
  if (/"type"\s*:\s*"NOT_FOUND"|Could not resolve to a Repository|404 Not Found|HTTP 404|project not found/i.test(texto)) {
145
- return { codigo: 'forja.nao-encontrado', detalhe };
204
+ return { codigo: 'forja.nao-achei', detalhe };
146
205
  }
147
206
  if (/auth login|not logged|authentication|HTTP 401|Bad credentials|GH_TOKEN|GITLAB_TOKEN|unauthorized|no token/i.test(texto)) {
148
207
  return { codigo: 'forja.sem-login', detalhe };
149
208
  }
150
- return { codigo: 'forja.inacessivel', detalhe };
209
+ return { codigo: 'forja.indisponivel', detalhe };
151
210
  }
152
211
  const obj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
153
212
  class RespostaInvalida extends Error {
@@ -170,7 +229,7 @@ function chamarJson(executor, cmd, args, corpo) {
170
229
  const falha = classificarFalha(cmd, s.erro || s.status !== 0 ? s : { ...s, status: 1, stderr: JSON.stringify(json) });
171
230
  // `gh` sai 1 com NOT_FOUND no corpo: o tipo do erro GraphQL vale mais que a frase.
172
231
  if (erros && json.errors.some((e) => obj(e) && e.type === 'NOT_FOUND')) {
173
- return { ok: false, erro: { codigo: 'forja.nao-encontrado', detalhe: falha.detalhe } };
232
+ return { ok: false, erro: { codigo: 'forja.nao-achei', detalhe: falha.detalhe } };
174
233
  }
175
234
  return { ok: false, erro: falha };
176
235
  }
@@ -178,10 +237,7 @@ function chamarJson(executor, cmd, args, corpo) {
178
237
  return { ok: false, erro: { codigo: 'forja.resposta-invalida', detalhe: `${cmd} não devolveu JSON` } };
179
238
  return { ok: true, json };
180
239
  }
181
- /**
182
- * O host vai sempre explicito: sem ele, o `gh` usa `GH_HOST` ou o unico host com login, e o `glab`,
183
- * o host do remoto do cwd; a consulta iria para outra forja.
184
- */
240
+ /** So o `gh`: o host vai sempre explicito, ou ele usaria `GH_HOST` ou o unico host com login e a consulta iria para outra forja. */
185
241
  const hostnameDe = (f) => ['--hostname', f.host];
186
242
  function arquivosDoGithub(entrada, dir) {
187
243
  if (entrada === null)
@@ -220,19 +276,27 @@ function commitsDoHistorico(historico, onde) {
220
276
  parciais: obj(h.pageInfo) && h.pageInfo.hasNextPage === true,
221
277
  };
222
278
  }
223
- /** Os commits da base desde `desde`, pelo REST do GitLab (GET), e se vieram 100 (pagina cheia). */
224
- function commitsDoGitlab(forja, commit, desde, executor) {
225
- const rest = executor('glab', ['api', `projects/${encodeURIComponent(forja.repo)}/repository/commits?ref_name=${encodeURIComponent(commit)}` +
226
- `&since=${encodeURIComponent(desde)}&per_page=100`, ...hostnameDe(forja)], '', PRAZO_MS);
227
- if (rest.erro || rest.status !== 0)
228
- return { ok: false, erro: classificarFalha('glab', rest) };
229
- let lista;
230
- try {
231
- lista = JSON.parse(rest.stdout);
232
- }
233
- catch {
234
- lista = undefined;
279
+ /** A API do GitLab de uma forja: o host e a porta da API, e o caminho base e a CA quando vieram do bloco `forja:`. */
280
+ const apiDoGitlab = (forja, opcoes = {}) => (0, api_1.chamadorDaApi)({ tipo: 'gitlab', host: forja.host, porta: forja.porta ?? null, caminhoBase: forja.caminhoBase ?? '', ca: forja.ca ?? null }, opcoes);
281
+ exports.apiDoGitlab = apiDoGitlab;
282
+ /** Uma consulta GraphQL do GitLab; `errors` no corpo e erro tipado, nunca resposta. */
283
+ function graphqlDoGitlab(api, query, variables) {
284
+ const r = api({ metodo: 'POST', caminho: 'graphql', corpo: { query, variables }, prazoMs: PRAZO_MS });
285
+ if (!r.ok)
286
+ return r;
287
+ const json = r.valor.corpo;
288
+ if (obj(json) && Array.isArray(json.errors) && json.errors.length) {
289
+ return { ok: false, erro: { codigo: 'forja.resposta-invalida', detalhe: detalheSeguro(JSON.stringify(json.errors)) } };
235
290
  }
291
+ return { ok: true, json };
292
+ }
293
+ /** Os commits da base desde `desde`, pelo REST do GitLab (GET), e se vieram 100 (pagina cheia). */
294
+ function commitsDoGitlab(forja, commit, desde, api) {
295
+ const r = api({ metodo: 'GET', caminho: `${(0, pedidos_1.projetoNaApi)(forja.repo)}/repository/commits?ref_name=${encodeURIComponent(commit)}` +
296
+ `&since=${encodeURIComponent(desde)}&per_page=100`, prazoMs: PRAZO_MS });
297
+ if (!r.ok)
298
+ return r;
299
+ const lista = r.valor.corpo;
236
300
  exigir(Array.isArray(lista), 'commits');
237
301
  const commits = lista.map((c) => {
238
302
  exigir(obj(c) && typeof c.id === 'string' && typeof c.title === 'string' && typeof c.committed_date === 'string', 'commit');
@@ -289,30 +353,9 @@ function lerDoGithub(forja, pedido, executor, lidoEm) {
289
353
  return { ok: true, leitura: { forja, lidoEm, chamadas: 1, base: leituraDaBase,
290
354
  reservas: estado(repo.reservas, pedido.reservas), fabrica: estado(repo.fabrica, pedido.fabrica) } };
291
355
  }
292
- const CONSULTA_RAIZ_GITLAB = 'query($path: ID!) { project(fullPath: $path) { repository { rootRef } } }';
293
- const CONSULTA_ARVORES_GITLAB = `query($path: ID!, $base: String!, $dirRoadmap: String!, $refReservas: String!, $dirReservas: String!,
294
- $refFabrica: String!, $dirFabrica: String!) {
295
- project(fullPath: $path) { repository {
296
- baseTopo: tree(ref: $base) { lastCommit { sha committedDate } }
297
- baseDir: tree(ref: $base, path: $dirRoadmap) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
298
- reservasTopo: tree(ref: $refReservas) { lastCommit { sha committedDate } }
299
- reservasDir: tree(ref: $refReservas, path: $dirReservas) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
300
- fabricaTopo: tree(ref: $refFabrica) { lastCommit { sha committedDate } }
301
- fabricaDir: tree(ref: $refFabrica, path: $dirFabrica) { blobs(first: 100) { pageInfo { hasNextPage } nodes { name path } } }
302
- } }
303
- }`;
304
- /** Os blobs de cada ponta que existe; so as partes pedidas entram na consulta (texto fixo, sem interpolar o pedido). */
305
- function consultaDeBlobsDoGitlab(partes) {
306
- const sufixo = { base: 'Base', reservas: 'Reservas', fabrica: 'Fabrica' };
307
- const declaracoes = ['$path: ID!', ...partes.flatMap((p) => [`$ref${sufixo[p]}: String!`, `$paths${sufixo[p]}: [String!]!`])];
308
- const campos = partes.map((p) => `${p}: blobs(ref: $ref${sufixo[p]}, paths: $paths${sufixo[p]}, first: 100) ` +
309
- '{ pageInfo { hasNextPage } nodes { path rawTextBlob } }');
310
- return `query(${declaracoes.join(', ')}) { project(fullPath: $path) { repository { ${campos.join(' ')} } } }`;
311
- }
312
- function lerDoGitlab(forja, pedido, executor, lidoEm) {
313
- const args = ['api', 'graphql', '--method', 'POST', '--input', '-', ...hostnameDe(forja)];
356
+ function lerDoGitlab(forja, pedido, api, lidoEm) {
314
357
  let chamadas = 0;
315
- const graphql = (query, variables) => { chamadas++; return chamarJson(executor, 'glab', args, JSON.stringify({ query, variables })); };
358
+ const graphql = (query, variables) => { chamadas++; return graphqlDoGitlab(api, query, variables); };
316
359
  const repositorio = (json) => {
317
360
  const projeto = obj(json) && obj(json.data) ? json.data.project : undefined;
318
361
  if (projeto === null)
@@ -322,13 +365,13 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
322
365
  };
323
366
  let base = pedido.base ?? null;
324
367
  if (!base) {
325
- const r = graphql(CONSULTA_RAIZ_GITLAB, { path: forja.repo });
368
+ const r = graphql(consultas_1.CONSULTA_RAIZ_GITLAB, { path: forja.repo });
326
369
  if (!r.ok)
327
370
  return r;
328
371
  const raiz = repositorio(r.json).rootRef;
329
372
  base = typeof raiz === 'string' && raiz ? raiz : null;
330
373
  }
331
- const arvores = graphql(CONSULTA_ARVORES_GITLAB, { path: forja.repo, base: base ?? 'HEAD', dirRoadmap: pedido.dirRoadmap,
374
+ const arvores = graphql(consultas_1.CONSULTA_ARVORES_GITLAB, { path: forja.repo, base: base ?? 'HEAD', dirRoadmap: pedido.dirRoadmap,
332
375
  refReservas: pedido.reservas.branch, dirReservas: pedido.reservas.dir, refFabrica: pedido.fabrica.branch, dirFabrica: pedido.fabrica.dir });
333
376
  if (!arvores.ok)
334
377
  return arvores;
@@ -373,7 +416,7 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
373
416
  variaveis[`ref${sufixo[parte]}`] = ponta.commit;
374
417
  variaveis[`paths${sufixo[parte]}`] = paths;
375
418
  }
376
- const blobs = graphql(consultaDeBlobsDoGitlab(pedidos.map(([parte]) => parte)), variaveis);
419
+ const blobs = graphql((0, consultas_1.consultaDeBlobsDoGitlab)(pedidos.map(([parte]) => parte)), variaveis);
377
420
  if (!blobs.ok)
378
421
  return blobs;
379
422
  conteudo = repositorio(blobs.json);
@@ -394,7 +437,7 @@ function lerDoGitlab(forja, pedido, executor, lidoEm) {
394
437
  let commitsParciais = false;
395
438
  if (pontaBase) {
396
439
  chamadas++;
397
- const r = commitsDoGitlab(forja, pontaBase.commit, pedido.desde, executor);
440
+ const r = commitsDoGitlab(forja, pontaBase.commit, pedido.desde, api);
398
441
  if (!r.ok)
399
442
  return r;
400
443
  commits = r.commits;
@@ -418,12 +461,12 @@ const CONSULTA_DE_COMMITS_GITHUB = `query($owner: String!, $name: String!, $oid:
418
461
  * So os commits de um commit da base desde `desde`, quando a janela da primeira leitura ficou curta:
419
462
  * o fuso do projeto so se conhece depois de ler o manifesto dele (achado 5 da rodada 2). So consulta.
420
463
  */
421
- function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao) {
464
+ function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao, api) {
422
465
  if (!SHA.test(pedido.commit))
423
466
  return erro('forja.resposta-invalida', 'commit da base fora do formato');
424
467
  try {
425
468
  if (forja.tipo === 'gitlab')
426
- return commitsDoGitlab(forja, pedido.commit, pedido.desde, executor);
469
+ return commitsDoGitlab(forja, pedido.commit, pedido.desde, api ?? (0, exports.apiDoGitlab)(forja));
427
470
  const [owner, name] = forja.repo.split('/');
428
471
  const r = chamarJson(executor, 'gh', ['api', 'graphql', '--method', 'POST', '--input', '-', ...hostnameDe(forja)], JSON.stringify({ query: CONSULTA_DE_COMMITS_GITHUB, variables: { owner, name, oid: pedido.commit, desde: pedido.desde } }));
429
472
  if (!r.ok)
@@ -444,14 +487,14 @@ function lerCommitsDaForja(forja, pedido, executor = exports.executorPadrao) {
444
487
  * Le da forja a base (com `docs/roadmap`, o manifesto e os commits desde `desde`) e as duas branches
445
488
  * de estado. So consulta; qualquer falha volta como erro tipado, com o detalhe redigido.
446
489
  */
447
- function lerDaForja(forja, pedido, executor = exports.executorPadrao) {
490
+ function lerDaForja(forja, pedido, executor = exports.executorPadrao, api) {
448
491
  const lidoEm = pedido.lidoEm ?? new Date().toISOString();
449
492
  try {
450
- return forja.tipo === 'github' ? lerDoGithub(forja, pedido, executor, lidoEm) : lerDoGitlab(forja, pedido, executor, lidoEm);
493
+ return forja.tipo === 'github' ? lerDoGithub(forja, pedido, executor, lidoEm) : lerDoGitlab(forja, pedido, api ?? (0, exports.apiDoGitlab)(forja), lidoEm);
451
494
  }
452
495
  catch (e) {
453
496
  if (e instanceof NaoEncontrado)
454
- return erro('forja.nao-encontrado', `${(0, exports.rotuloDaForja)(forja)} não existe ou não é visível para o login da forja`);
497
+ return erro('forja.nao-achei', `${(0, exports.rotuloDaForja)(forja)} não existe ou não é visível para o login da forja`);
455
498
  if (e instanceof RespostaInvalida)
456
499
  return erro('forja.resposta-invalida', `resposta fora do formato esperado em ${e.message}`);
457
500
  throw e;
package/dist/gates.js CHANGED
@@ -28,35 +28,10 @@ const thread_1 = require("./thread");
28
28
  const hitl_ingress_receipt_1 = require("./hitl-ingress-receipt");
29
29
  const hitl_local_receipt_1 = require("./hitl-local-receipt");
30
30
  const hitl_contract_1 = require("./hitl-contract");
31
+ const locale_pulse_1 = require("./locale-pulse");
31
32
  /** O que cada motivo tipado significa, em uma linha, para a saida do CLI. */
32
- exports.DESCRICAO_DO_MOTIVO = {
33
- 'artifact.missing': 'artefato exigido pela fase nao existe no disco',
34
- 'claims.failed': 'alegacao verificavel reprovou na reexecucao no HEAD real',
35
- 'claims.unverifiable': 'alegacao sem comando de verificacao declarado',
36
- 'policy.violation': 'policy do manifesto com severidade block foi violada',
37
- 'runtime.autoconferencia': 'o CHECK foi despachado no mesmo runtime que fez o GO, e a thread exige validacao cruzada',
38
- 'verify.regression': 'comando que passava na baseline falha agora',
39
- 'verify.failed': 'comando de verificacao falhou (sem baseline para separar divida pre-existente)',
40
- 'verify.timeout': 'comando de verificacao estourou o prazo antes de terminar: nao ha veredito sobre ele',
41
- 'verify.sem-veredito': 'a rodada nao produziu veredito valido: comando que nao chegou a rodar, ou produto alterado entre o preparo e o fim',
42
- 'ci.failed': 'CHECK independente ausente, pendente ou reprovado no commit candidato',
43
- 'runtime.unavailable': 'runtime adapter indisponivel para o despacho',
44
- 'runtime.silencio': 'fase despachada sem heartbeat dentro do limite de liveness',
45
- 'runtime.rate-limited': 'o runtime bateu o limite de uso da assinatura e a fase morreu antes de terminar (bloco B3: entra na fila duravel e e retomada na janela seguinte)',
46
- 'runtime.quota-exhausted': 'a cota ou os creditos da conta do runtime acabaram (I-33: o perfil sai do rodizio e a fase segue em outro perfil, outro runtime ou na fila)',
47
- 'runtime.auth-missing': 'a conta do runtime nao esta autenticada (I-33: o perfil nunca recebe despacho ate o login ser refeito pelo proprio CLI)',
48
- 'runtime.model-unavailable': 'o modelo pedido nao existe ou a conta nao tem acesso a ele (RM-037: o perfil segue no rodizio e a fase vai a outro perfil com o mesmo modelo ou ao fallback do bloco)',
49
- 'runtime.profile-invalid': 'o perfil pedido no despacho (--perfil) nao existe no store ou e de outro runtime (RM-056: o despacho nunca troca de perfil sozinho)',
50
- 'runtime.workspace-untrusted': 'o runtime nao confia no diretorio da worktree e recusou o despacho (RM-055: so o dono aceita a confianca no terminal; depois o ork re-despacha o mesmo prompt)',
51
- 'runtime.consent-pending': 'o runtime espera o dono aceitar termos novos e recusou o despacho (RM-055: so o dono aceita no terminal; depois o ork re-despacha o mesmo prompt)',
52
- 'cost.violation': 'o despacho seria redirecionado para provider pago (violacao de custo: e o unico motivo que NUNCA recebe retry automatico)',
53
- 'tree.blocked': 'a arvore de destino nao esta disponivel para o merge (branch em check-out com alteracao nao commitada, ou worktree que nao pode ser montada)',
54
- 'lease.busy': 'lease ocupado por outra thread',
55
- 'lease.resume-unavailable': 'retomada indisponivel; libere o lease explicitamente com --forcar',
56
- 'conducao.em-andamento': 'outra conducao ja executa na worktree da thread (I-36): o pedido foi recusado com quem conduz e as tres acoes (esperar, acompanhar, assumir)',
57
- 'hitl.formato': 'o pedido HITL saiu fora do formato obrigatorio (pergunta em uma frase, de 3 a 5 alternativas rotuladas com consequencia, exatamente uma com o selo Recomendacao e o porque, corpo em lista; texto livre so com dependencia tecnica tipada)',
58
- 'human.pending': 'gate humano do modo de conducao ainda nao autorizou',
59
- };
33
+ // RM-061 (F2b): a fonte e o catalogo pt-BR (`locale-pulse.ts`), com o ingles ao lado; o texto nao muda.
34
+ exports.DESCRICAO_DO_MOTIVO = locale_pulse_1.PULSE_PT_BR.motivos;
60
35
  /**
61
36
  * Motivos que reprovam em QUALQUER modo, inclusive `#Auto`.
62
37
  *
package/dist/handoff.js CHANGED
@@ -73,6 +73,15 @@ const phase_1 = require("./phase");
73
73
  const thread_1 = require("./thread");
74
74
  const memoria_1 = require("./memoria");
75
75
  const util_1 = require("./util");
76
+ const verify_1 = require("./verify");
77
+ const procedencia_1 = require("./procedencia");
78
+ const locale_1 = require("./locale");
79
+ /** RM-037 (defeito 1 de 19 e 20/10/2026): o rotulo de cada comando da baseline no handoff, que vai em pt-BR. */
80
+ const ROTULO_DA_BASELINE = {
81
+ passava: 'passava',
82
+ 'ja-falhava': 'ja falhava',
83
+ 'sem-veredito': 'sem veredito (estouro, sinal, relogio sob steal ou nao rodou: nao vale como ja falhava)',
84
+ };
76
85
  /** sha256 de um arquivo em disco, a prova de proveniencia de cada item. */
77
86
  function sha256DoArquivo(caminho) {
78
87
  if (!fs.existsSync(caminho))
@@ -98,7 +107,8 @@ function caminhoDoArtefato(raiz, thread, arquivo) {
98
107
  ? [path.resolve(thread.worktree, arquivo), path.resolve(raiz, arquivo)]
99
108
  : [path.resolve(raiz, arquivo)];
100
109
  for (const c of candidatos) {
101
- if (fs.existsSync(c) && fs.statSync(c).isFile())
110
+ // RM-047 (P2): o arquivo da claim vem do estado; fora da raiz e da worktree registrada, não vira ponteiro.
111
+ if (fs.existsSync(c) && fs.statSync(c).isFile() && (0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, c))
102
112
  return c;
103
113
  }
104
114
  return null;
@@ -215,14 +225,15 @@ function exportarHandoff(carregado, threadId, opcoes = {}) {
215
225
  if (thread.baseline) {
216
226
  const b = thread.baseline;
217
227
  addInline('Baseline gravada antes do GO', `commit ${b.commit} em ${b.gravadaEm}\n` +
218
- b.comandos.map((c) => ` ${c.nome}: ${c.ok ? 'passava' : 'ja falhava'} (${c.comando})`).join('\n'), proveniencia(raiz, caminhoThreadJson, 'json:baseline'));
228
+ // RM-037 (defeito 1 de 19 e 20/10/2026): o comando sem veredito na baseline nao e divida anterior.
229
+ b.comandos.map((c) => ` ${c.nome}: ${ROTULO_DA_BASELINE[(0, verify_1.vereditoDaBaseline)(c)]} (${c.comando})`).join('\n'), proveniencia(raiz, caminhoThreadJson, 'json:baseline'));
219
230
  }
220
231
  // IMPORTANTE: os prompts ja despachados, com o pedido original do builder.
221
232
  for (const s of thread.sessoes) {
222
233
  if (s.origem === 'adocao')
223
234
  continue;
224
235
  const caminhoPrompt = path.resolve(raiz, s.promptPath);
225
- if (!fs.existsSync(caminhoPrompt))
236
+ if (!fs.existsSync(caminhoPrompt) || !(0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, caminhoPrompt))
226
237
  continue;
227
238
  addPonteiro(`Prompt da sessao ${s.slug} (fase ${s.fase})`, caminhoPrompt, 'pedido-do-builder', s.fase);
228
239
  }
@@ -261,7 +272,7 @@ function exportarHandoff(carregado, threadId, opcoes = {}) {
261
272
  for (const e of anteriores) {
262
273
  const arquivo = (0, memoria_1.arquivoDoHandoff)(e);
263
274
  const emDisco = arquivo ? path.resolve(raiz, arquivo) : '';
264
- if (!emDisco || !fs.existsSync(emDisco))
275
+ if (!emDisco || !fs.existsSync(emDisco) || !(0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, emDisco))
265
276
  continue;
266
277
  addPonteiro(`Handoff anterior desta thread (${arquivo})`, emDisco, 'tudo', proximaFase, `orkmind://handoff/${e.id}`);
267
278
  }
@@ -270,7 +281,7 @@ function exportarHandoff(carregado, threadId, opcoes = {}) {
270
281
  for (const e of (0, memoria_1.licoesDoProduto)(memoria, manifesto, threadId)) {
271
282
  const postmortem = (0, memoria_1.postmortemDaLicao)(e);
272
283
  const emDisco = postmortem ? path.resolve(raiz, postmortem) : '';
273
- if (!emDisco || !fs.existsSync(emDisco))
284
+ if (!emDisco || !fs.existsSync(emDisco) || !(0, procedencia_1.caminhoContidoOuNulo)(raiz, thread, emDisco))
274
285
  continue;
275
286
  addPonteiro(`Licao da thread ${(0, memoria_1.threadDaEntrada)(e) ?? '(anterior)'}`, emDisco, 'json:resumo', 'MASTER', `orkmind://learning/${e.id}`);
276
287
  }
@@ -398,9 +409,11 @@ function recall(carregado, threadId, ponteiro) {
398
409
  if (!fs.existsSync(caminho) || !fs.statSync(caminho).isFile()) {
399
410
  throw new Error(`ponteiro nao resolve: arquivo "${bruto}" nao existe a partir de ${raiz}`);
400
411
  }
401
- const conteudoBruto = fs.readFileSync(caminho, 'utf8');
412
+ // RM-047 (P2): o `location` vem do handoff.json (estado, talvez versionado); só lê dentro do projeto.
413
+ const real = (0, procedencia_1.exigirCaminhoContido)(raiz, (0, thread_1.lerThread)(raiz, threadId), caminho, bruto);
414
+ const conteudoBruto = fs.readFileSync(real, 'utf8');
402
415
  const linhas = conteudoBruto.split('\n');
403
- const sha = sha256DoArquivo(caminho);
416
+ const sha = sha256DoArquivo(real);
404
417
  const base = { location: `${bruto}#${ancora}`, caminho, ancora, sha256: sha };
405
418
  const registrarRecall = (r) => {
406
419
  (0, ledger_1.registrar)((0, thread_1.dirThread)(raiz, threadId), threadId, ledger_1.TIPOS_DE_EVENTO.handoffRecuperado, {
@@ -505,33 +518,34 @@ function recall(carregado, threadId, ponteiro) {
505
518
  }
506
519
  /** Texto de `ork handoff export`. */
507
520
  function textoDoHandoff(h, caminho) {
521
+ const m = (0, locale_1.msg)().operacao.restante.handoff;
508
522
  const linhas = [];
509
- linhas.push(`Handoff exportado da thread ${h.thread} (regime memory: ${h.memory})`);
510
- linhas.push(` de ${h.de.slug} (fase ${h.de.fase})`);
511
- linhas.push(` para ${h.para.slug} (fase ${h.para.fase})`);
512
- linhas.push(` arquivo ${caminho}`);
523
+ linhas.push(m.exportado(h.thread, h.memory));
524
+ linhas.push(m.de(h.de.slug, h.de.fase));
525
+ linhas.push(m.para(h.para.slug, h.para.fase));
526
+ linhas.push(m.arquivo(caminho));
513
527
  linhas.push('');
514
- linhas.push(`CRITICO (${h.inline.length} item(ns), vao inline no prompt da nova sessao):`);
528
+ linhas.push(m.critico(h.inline.length));
515
529
  for (const i of h.inline) {
516
530
  linhas.push(` ${i.id} ${i.titulo}`);
517
- linhas.push(` proveniencia: ${i.proveniencia.location} (sha256 ${i.proveniencia.sha256.slice(0, 12)})`);
531
+ linhas.push(m.proveniencia(i.proveniencia.location, i.proveniencia.sha256.slice(0, 12)));
518
532
  }
519
533
  linhas.push('');
520
- linhas.push(`IMPORTANTE (${h.pointers.length} ponteiro(s), recuperados sob demanda):`);
534
+ linhas.push(m.importante(h.pointers.length));
521
535
  for (const p of h.pointers) {
522
536
  linhas.push(` ${p.id} ${p.titulo}`);
523
537
  linhas.push(` location: ${p.location} (sha256 ${p.sha256.slice(0, 12)})`);
524
538
  if (p.orkmind)
525
539
  linhas.push(` orkmind: ${p.orkmind}`);
526
- linhas.push(` quando: ${p.retrieve_when}`);
527
- linhas.push(` recuperar: ${p.retrieve_via}`);
528
- linhas.push(` no momento: ork recall ${h.thread} --fase ${p.retrieve_when}`);
540
+ linhas.push(m.quando(p.retrieve_when));
541
+ linhas.push(m.recuperar(p.retrieve_via));
542
+ linhas.push(m.noMomento(h.thread, p.retrieve_when));
529
543
  }
530
544
  linhas.push('');
531
- linhas.push(`RESUMIVEL (${h.summaries.length} resumo(s), com proveniencia declarada):`);
545
+ linhas.push(m.resumivel(h.summaries.length));
532
546
  for (const s of h.summaries) {
533
547
  linhas.push(` ${s.id} ${s.text}`);
534
- linhas.push(` proveniencia: ${s.provenance.location} (sha256 ${s.provenance.sha256.slice(0, 12)})`);
548
+ linhas.push(m.proveniencia(s.provenance.location, s.provenance.sha256.slice(0, 12)));
535
549
  }
536
550
  return linhas.join('\n');
537
551
  }