@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
@@ -7,6 +7,10 @@
7
7
  * pulse configurado (`.orkastery/monitor/pulse-host.json`), o doctor le o `crontab -l` e avisa,
8
8
  * sem bloquear, quando a linha da varredura falta ou bate mais devagar que o template
9
9
  * `monitor/pulse.cron`. O doctor nunca edita o crontab: a correcao traz a linha pronta.
10
+ *
11
+ * RM-063 (F1): com thread aberta no projeto, a falta da batida REPROVA, com ou sem `pulse-host.json`.
12
+ * Sem transporte o doctor calava, e o maquina-b ficou de 03/10 a 12/10/2026 sem varredura nenhuma. A
13
+ * correcao e o `ork fabrica batida instalar`, que instala a linha do template de forma idempotente.
10
14
  */
11
15
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
16
  if (k2 === undefined) k2 = k;
@@ -42,16 +46,32 @@ var __importStar = (this && this.__importStar) || (function () {
42
46
  };
43
47
  })();
44
48
  Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.COMANDO_DO_TEMPLATE = exports.SCRIPT_DA_VARREDURA = exports.BATIDA_DO_TEMPLATE = void 0;
49
+ exports.ARQUIVO_DO_TRANSPORTE = exports.COMANDO_DE_INSTALAR_A_BATIDA = exports.ATRASO_DA_BATIDA_MIN = exports.COMANDO_DO_TEMPLATE = exports.SCRIPT_DA_VARREDURA = exports.BATIDA_DO_TEMPLATE = void 0;
46
50
  exports.lerCrontabDoSistema = lerCrontabDoSistema;
47
51
  exports.intervaloEmMinutos = intervaloEmMinutos;
48
- exports.linhasDaVarredura = linhasDaVarredura;
52
+ exports.valorNoShell = valorNoShell;
53
+ exports.projetoDaLinha = projetoDaLinha;
54
+ exports.scriptsDaLinha = scriptsDaLinha;
55
+ exports.entradasDaVarredura = entradasDaVarredura;
56
+ exports.entradaDoProjeto = entradaDoProjeto;
57
+ exports.mesmoCaminho = mesmoCaminho;
58
+ exports.entradaNaoEDeOutro = entradaNaoEDeOutro;
59
+ exports.ultimaRodadaDaVarredura = ultimaRodadaDaVarredura;
60
+ exports.threadsAbertasNoEstado = threadsAbertasNoEstado;
61
+ exports.citarNoShell = citarNoShell;
49
62
  exports.scriptDaVarreduraDoOrk = scriptDaVarreduraDoOrk;
50
63
  exports.comandoDaVarredura = comandoDaVarredura;
51
64
  exports.checarCronDoPulse = checarCronDoPulse;
65
+ exports.batidaNoDoctor = batidaNoDoctor;
66
+ exports.ultimaEntrega = ultimaEntrega;
67
+ exports.checarTransporteDoPulse = checarTransporteDoPulse;
52
68
  const fs = __importStar(require("node:fs"));
69
+ const os = __importStar(require("node:os"));
53
70
  const path = __importStar(require("node:path"));
54
71
  const util_1 = require("./util");
72
+ const locale_1 = require("./locale");
73
+ const horario_1 = require("./horario");
74
+ const maquina_1 = require("./maquina");
55
75
  /** A batida do template `monitor/pulse.cron` (I-50): a menor cadencia das tags. */
56
76
  exports.BATIDA_DO_TEMPLATE = '*/15 * * * *';
57
77
  /** O script que o template agenda; a linha do crontab e achada por ele. */
@@ -64,9 +84,12 @@ function lerCrontabDoSistema() {
64
84
  if (r.ok)
65
85
  return { ok: true, texto: r.stdout };
66
86
  if (r.error === 'ENOENT')
67
- return { ok: false, motivo: 'comando crontab ausente nesta maquina' };
68
- const msg = (r.stderr || r.stdout).trim().split('\n')[0] ?? '';
69
- return { ok: false, motivo: msg ? `crontab -l falhou: ${msg}` : `crontab -l saiu ${r.code}` };
87
+ return { ok: false, motivo: (0, locale_1.msg)().doctor.cronSemComando };
88
+ // RM-063 (F1): o usuario sem crontab tem um crontab vazio, nao uma leitura que falhou; e o caso da maquina nova.
89
+ if (/no crontab for /i.test(`${r.stderr}${r.stdout}`))
90
+ return { ok: true, texto: '' };
91
+ const primeira = (r.stderr || r.stdout).trim().split('\n')[0] ?? '';
92
+ return { ok: false, motivo: primeira ? (0, locale_1.msg)().doctor.cronFalhou(primeira) : (0, locale_1.msg)().doctor.cronSaiu(r.code) };
70
93
  }
71
94
  const MACROS = { '@hourly': 60, '@daily': 1440, '@midnight': 1440, '@weekly': 10080,
72
95
  '@monthly': 43200, '@yearly': 525600, '@annually': 525600 };
@@ -124,13 +147,140 @@ function dividirLinha(linha) {
124
147
  const m = /^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/.exec(t);
125
148
  return m ? { quando: m[1], comando: m[2] } : null;
126
149
  }
127
- /** Linhas ativas (nao comentario, nao variavel) que agendam a varredura do pulse. */
128
- function linhasDaVarredura(crontab) {
129
- return crontab.split('\n').map(l => l.trim())
130
- .filter(l => l && !l.startsWith('#') && !/^[A-Za-z_][A-Za-z0-9_]*\s*=/.test(l) && l.includes(exports.SCRIPT_DA_VARREDURA));
150
+ /**
151
+ * RM-063 (F1, GO-FIX): um valor como o `sh` do cron o le: aspas simples literais; aspas duplas com `$HOME`; sem aspas,
152
+ * com o `~` do comeco e `$HOME`. So o que a linha da varredura usa; o resto fica como esta.
153
+ */
154
+ function valorNoShell(bruto, home = os.homedir()) {
155
+ const comHome = (v) => v.replace(/\$\{HOME\}|\$HOME(?![A-Za-z0-9_])/g, home);
156
+ if (bruto.length >= 2 && bruto.startsWith(`'`) && bruto.endsWith(`'`))
157
+ return bruto.slice(1, -1).replace(/'\\''/g, `'`);
158
+ if (bruto.length >= 2 && bruto.startsWith('"') && bruto.endsWith('"'))
159
+ return comHome(bruto.slice(1, -1).replace(/\\(["\\$`])/g, '$1'));
160
+ return comHome(bruto === '~' ? home : bruto.startsWith('~/') ? home + bruto.slice(1) : bruto);
161
+ }
162
+ /** Um valor de atribuicao ou um caminho: entre aspas simples, entre aspas duplas, ou ate o espaco. */
163
+ const VALOR = String.raw `(?:'(?:[^']|'\\'')*'|"(?:[^"\\]|\\.)*"|[^\s;&|<>()]+)`;
164
+ /** O valor de `ORK_PULSE_PROJECT=` na linha, como o `sh` o le; `null` quando a linha nao o diz. */
165
+ function projetoDaLinha(linha, home = os.homedir()) {
166
+ const m = new RegExp(`(?:^|\\s)ORK_PULSE_PROJECT=(${VALOR})`).exec(linha);
167
+ return m ? valorNoShell(m[1], home) : null;
168
+ }
169
+ /** Os scripts da varredura citados na linha, como o `sh` os le; `varredura-pulse.sh.bak` nao e o script. */
170
+ function scriptsDaLinha(linha, home = os.homedir()) {
171
+ const nome = exports.SCRIPT_DA_VARREDURA.replace(/\./g, '\\.');
172
+ const re = new RegExp(`(?:^|[\\s=])('[^']*${nome}'|"[^"]*${nome}"|[^\\s'";&|<>()]*${nome})(?=$|[\\s;&|<>)])`, 'g');
173
+ return [...linha.matchAll(re)].map((m) => valorNoShell(m[1], home));
174
+ }
175
+ /**
176
+ * RM-063 (F1, GO-FIX): as entradas da varredura, na ordem. A linha de ambiente do crontab (`NOME=valor`) vale para as
177
+ * entradas que vem depois dela: o template sem `ORK_PULSE_PROJECT` abaixo de `ORK_PULSE_PROJECT=/outro` varre o outro.
178
+ */
179
+ function entradasDaVarredura(crontab, home = os.homedir()) {
180
+ const ambiente = {};
181
+ const entradas = [];
182
+ for (const linha of crontab.split('\n')) {
183
+ const t = linha.trim();
184
+ if (!t || t.startsWith('#'))
185
+ continue;
186
+ const env = /^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(t);
187
+ if (env) {
188
+ ambiente[env[1]] = valorNoShell(env[2].trim(), ambiente.HOME ?? home);
189
+ continue;
190
+ }
191
+ const casa = ambiente.HOME ?? home;
192
+ const scripts = scriptsDaLinha(t, casa);
193
+ if (!scripts.length)
194
+ continue;
195
+ entradas.push({ linha, projeto: projetoDaLinha(t, casa) ?? ambiente.ORK_PULSE_PROJECT ?? null, scripts });
196
+ }
197
+ return entradas;
198
+ }
199
+ /**
200
+ * RM-063 (F1): a entrada roda, com certeza, a varredura DESTE projeto: o `ORK_PULSE_PROJECT` efetivo e ele, ou nao ha
201
+ * projeto nenhum e o script e o do proprio checkout (que entao e o alvo, como no template).
202
+ */
203
+ function entradaDoProjeto(e, raiz) {
204
+ if (e.projeto !== null)
205
+ return mesmoCaminho(e.projeto, raiz);
206
+ const doCheckout = path.join(raiz, 'monitor', exports.SCRIPT_DA_VARREDURA);
207
+ return e.scripts.some((s) => mesmoCaminho(s, doCheckout));
208
+ }
209
+ /** O mesmo caminho, escrito igual ou pelo mesmo destino real. */
210
+ function mesmoCaminho(a, b) {
211
+ if (path.resolve(a) === path.resolve(b))
212
+ return true;
213
+ try {
214
+ return fs.realpathSync(a) === fs.realpathSync(b);
215
+ }
216
+ catch {
217
+ return false;
218
+ }
219
+ }
220
+ /**
221
+ * A entrada vale para o aviso de cadencia (sem thread aberta) quando nao aponta OUTRO projeto: a linha antiga do
222
+ * template, sem projeto, continua valendo como na RM-039.
223
+ */
224
+ function entradaNaoEDeOutro(e, raiz) {
225
+ return e.projeto === null || mesmoCaminho(e.projeto, raiz);
226
+ }
227
+ /** Acima disto sem rodada nova no `hitl.log`, a batida esta atrasada: duas batidas do template perdidas. */
228
+ exports.ATRASO_DA_BATIDA_MIN = 30;
229
+ function ultimaRodadaDaVarredura(dirMonitor) {
230
+ const arquivo = path.join(dirMonitor, 'hitl.log');
231
+ let texto;
232
+ try {
233
+ const fd = fs.openSync(arquivo, 'r');
234
+ try {
235
+ const tamanho = fs.fstatSync(fd).size, lido = Math.min(tamanho, 64 * 1024);
236
+ const buffer = Buffer.alloc(lido);
237
+ fs.readSync(fd, buffer, 0, lido, tamanho - lido);
238
+ texto = buffer.toString('utf8');
239
+ }
240
+ finally {
241
+ fs.closeSync(fd);
242
+ }
243
+ }
244
+ catch {
245
+ return null;
246
+ }
247
+ for (const linha of texto.split('\n').reverse()) {
248
+ try {
249
+ const e = JSON.parse(linha);
250
+ if (e.tipo !== 'pulse_scan' || typeof e.ts !== 'string' || !Number.isFinite(Date.parse(e.ts)))
251
+ continue;
252
+ return { em: e.ts, code: typeof e.code === 'number' ? e.code : null, detalhe: typeof e.detalhe === 'string' ? e.detalhe : '' };
253
+ }
254
+ catch { /* linha cortada no inicio do trecho, ou ilegivel */ }
255
+ }
256
+ return null;
257
+ }
258
+ /** RM-063 (F1): threads nao fechadas no estado do projeto (`.orkastery/threads/<id>/thread.json`). */
259
+ function threadsAbertasNoEstado(dirEstado) {
260
+ const dir = path.join(dirEstado, 'threads');
261
+ let nomes;
262
+ try {
263
+ nomes = fs.readdirSync(dir);
264
+ }
265
+ catch {
266
+ return 0;
267
+ }
268
+ let abertas = 0;
269
+ for (const nome of nomes) {
270
+ try {
271
+ const t = JSON.parse(fs.readFileSync(path.join(dir, nome, 'thread.json'), 'utf8'));
272
+ // O registro de adocao nao tem trabalho a conduzir; a thread pausada espera o dono, e a batida e quem o lembra.
273
+ if (t.status !== 'fechada' && t.origem !== 'adocao')
274
+ abertas++;
275
+ }
276
+ catch { /* pasta sem thread.json, ou ilegivel: nao e thread a vigiar */ }
277
+ }
278
+ return abertas;
131
279
  }
280
+ /** O comando que instala a batida; e a correcao do doctor quando ela falta (RM-063, F1). */
281
+ exports.COMANDO_DE_INSTALAR_A_BATIDA = 'ork fabrica batida instalar';
132
282
  /** Aspas de shell so quando o caminho precisa (a linha vai colada no crontab, que roda por `sh`). */
133
- function citar(caminho) {
283
+ function citarNoShell(caminho) {
134
284
  return /^[A-Za-z0-9_./:@+-]+$/.test(caminho) ? caminho : `'${caminho.replace(/'/g, `'\\''`)}'`;
135
285
  }
136
286
  /**
@@ -154,27 +304,40 @@ function scriptDaVarreduraDoOrk(dirDoDist = __dirname) {
154
304
  function comandoDaVarredura(raizDoProjeto, scriptDoOrk = scriptDaVarreduraDoOrk()) {
155
305
  const doProjeto = path.join(raizDoProjeto, 'monitor', exports.SCRIPT_DA_VARREDURA);
156
306
  if (fs.existsSync(doProjeto) || !scriptDoOrk)
157
- return citar(doProjeto);
158
- return `ORK_PULSE_PROJECT=${citar(raizDoProjeto)} ${citar(scriptDoOrk)}`;
307
+ return citarNoShell(doProjeto);
308
+ return `ORK_PULSE_PROJECT=${citarNoShell(raizDoProjeto)} ${citarNoShell(scriptDoOrk)}`;
159
309
  }
160
310
  /**
161
- * Check "cadencia do pulse no cron". `null` quando o projeto nao tem transporte do pulse: sem
162
- * `pulse-host.json` nao ha resumo para entregar, e o doctor nao fala de cron.
311
+ * Check "cadencia do pulse no cron". `null` quando o projeto nao tem transporte do pulse nem thread
312
+ * aberta: sem `pulse-host.json` e sem thread a vigiar, o doctor nao fala de cron.
313
+ *
314
+ * RM-063 (F1): com thread aberta (`abertas`, contadas no estado ao lado de `dirMonitor`), a falta da
315
+ * batida reprova, com ou sem transporte, e a correcao e o `ork fabrica batida instalar`.
163
316
  */
164
- function checarCronDoPulse(dirMonitor, raizDoCheckout, ler = lerCrontabDoSistema, scriptDoOrk = scriptDaVarreduraDoOrk()) {
165
- if (!fs.existsSync(path.join(dirMonitor, 'pulse-host.json')))
317
+ function checarCronDoPulse(dirMonitor, raizDoCheckout, ler = lerCrontabDoSistema, scriptDoOrk = scriptDaVarreduraDoOrk(), abertas = threadsAbertasNoEstado(path.dirname(dirMonitor))) {
318
+ const comHost = fs.existsSync(path.join(dirMonitor, 'pulse-host.json'));
319
+ if (!comHost && abertas === 0)
166
320
  return null;
167
321
  const nome = 'cadencia do pulse no cron';
168
322
  const comandoSugerido = comandoDaVarredura(raizDoCheckout, scriptDoOrk);
169
323
  const linhaNova = (comando) => `${exports.BATIDA_DO_TEMPLATE} ${comando}`;
170
- const ausente = (detalhe) => ({ nome, nivel: 'warn', detalhe,
171
- correcao: `adicione ao crontab (crontab -e), como no template monitor/pulse.cron: ${linhaNova(comandoSugerido)}` });
324
+ const ausente = (detalhe) => abertas > 0
325
+ ? { nome, nivel: 'fail', detalhe: (0, locale_1.msg)().doctor.batidaAusente(abertas, detalhe),
326
+ correcao: (0, locale_1.msg)().doctor.batidaInstale(exports.COMANDO_DE_INSTALAR_A_BATIDA) }
327
+ : { nome, nivel: 'warn', detalhe, correcao: (0, locale_1.msg)().doctor.cronAdicione(linhaNova(comandoSugerido)) };
328
+ // RM-063 (F1, GO-FIX): a varredura que bate por outro agendador (timer do systemd, batida do host) se prova pelo hitl.log.
329
+ const rodada = ultimaRodadaDaVarredura(dirMonitor);
330
+ const haMin = rodada ? Math.floor((Date.now() - Date.parse(rodada.em)) / 60000) : null;
331
+ const semCron = (detalhe) => haMin !== null && haMin >= 0 && haMin <= exports.ATRASO_DA_BATIDA_MIN
332
+ ? { nome, nivel: 'ok', detalhe: (0, locale_1.msg)().doctor.batidaPeloLog(haMin) } : ausente(detalhe);
172
333
  const leitura = ler();
173
334
  if (!leitura.ok)
174
- return ausente(`pulse-host.json presente, mas sem crontab para ler (${leitura.motivo}): a varredura nao bate`);
175
- const linhas = linhasDaVarredura(leitura.texto);
335
+ return semCron(comHost ? (0, locale_1.msg)().doctor.cronSemLeitura(leitura.motivo) : (0, locale_1.msg)().doctor.batidaSemLeitura(leitura.motivo));
336
+ // Com thread aberta, so a batida DESTE projeto; sem thread, o aviso de cadencia aceita a linha antiga sem projeto.
337
+ const linhas = entradasDaVarredura(leitura.texto)
338
+ .filter(e => abertas > 0 ? entradaDoProjeto(e, raizDoCheckout) : entradaNaoEDeOutro(e, raizDoCheckout)).map(e => e.linha.trim());
176
339
  if (linhas.length === 0)
177
- return ausente(`pulse-host.json presente, e nenhuma linha do crontab roda ${exports.SCRIPT_DA_VARREDURA}: o resumo nao sai`);
340
+ return semCron(comHost ? (0, locale_1.msg)().doctor.cronSemLinha(exports.SCRIPT_DA_VARREDURA) : (0, locale_1.msg)().doctor.batidaSemLinha(exports.SCRIPT_DA_VARREDURA));
178
341
  const lentas = [];
179
342
  for (const linha of linhas) {
180
343
  const partes = dividirLinha(linha);
@@ -183,12 +346,116 @@ function checarCronDoPulse(dirMonitor, raizDoCheckout, ler = lerCrontabDoSistema
183
346
  lentas.push({ linha, comando: partes?.comando ?? comandoSugerido, intervalo });
184
347
  }
185
348
  if (lentas.length < linhas.length) {
186
- return { nome, nivel: 'ok', detalhe: `varredura no cron a cada 15 minutos ou menos (${linhas.length} linha(s))` };
349
+ // RM-063 (fatia 3, H1): a linha no crontab nao prova que a batida roda (cron parado, script que cai antes do log).
350
+ // Com thread aberta, a ultima rodada mais velha que o atraso reprova; sem rodada nenhuma ainda, ou com a batida
351
+ // instalada ha menos de 30 min depois da ultima rodada, a linha recem-instalada vale.
352
+ if (abertas > 0 && haMin !== null && haMin > exports.ATRASO_DA_BATIDA_MIN && !recemInstalada(raizDoCheckout, rodada?.em ?? null)) {
353
+ return { nome, nivel: 'fail', detalhe: (0, locale_1.msg)().doctor.batidaAtrasada(haMin, linhas.length), correcao: (0, locale_1.msg)().doctor.batidaAtrasadaCorrecao };
354
+ }
355
+ return { nome, nivel: 'ok', detalhe: (0, locale_1.msg)().doctor.cronOk(linhas.length) };
187
356
  }
188
357
  const l = lentas[0];
189
- const ritmo = l.intervalo === null ? 'com horario que o doctor nao le' : l.intervalo === 60 ? 'de hora em hora'
190
- : `a cada ${l.intervalo} minutos`;
191
- return { nome, nivel: 'warn',
192
- detalhe: `a varredura do pulse bate ${ritmo} (\`${l.linha}\`): a cadencia por tag (RM-039) pede 15 minutos`,
193
- correcao: `troque a linha no crontab (crontab -e) por: ${linhaNova(l.comando)}` };
358
+ return { nome, nivel: 'warn', detalhe: (0, locale_1.msg)().doctor.cronLento((0, locale_1.msg)().doctor.cronRitmo(l.intervalo), l.linha),
359
+ correcao: (0, locale_1.msg)().doctor.cronTroque(linhaNova(l.comando)) };
360
+ }
361
+ /**
362
+ * A batida deste projeto foi instalada (`batida_instalada` no ledger da maquina) depois da ultima rodada e ha menos de
363
+ * 30 min: o `hitl.log` velho de antes da instalacao nao e atraso, a primeira rodada ainda vem.
364
+ */
365
+ function recemInstalada(raizDoCheckout, ultimaRodadaEm, agora = Date.now()) {
366
+ let eventos = [];
367
+ try {
368
+ eventos = fs.readFileSync(path.join((0, maquina_1.pastaDoUsuario)(), 'ledger.jsonl'), 'utf8').split('\n').filter(Boolean)
369
+ .map((l) => { try {
370
+ return JSON.parse(l);
371
+ }
372
+ catch {
373
+ return {};
374
+ } });
375
+ }
376
+ catch {
377
+ return false;
378
+ }
379
+ const instalada = eventos.filter((e) => e.tipo === 'batida_instalada' && typeof e.projeto === 'string' &&
380
+ mesmoCaminho(e.projeto, raizDoCheckout) && typeof e.ts === 'string').map((e) => Date.parse(e.ts)).filter(Number.isFinite).at(-1);
381
+ if (instalada === undefined)
382
+ return false;
383
+ const rodada = ultimaRodadaEm ? Date.parse(ultimaRodadaEm) : Number.NEGATIVE_INFINITY;
384
+ return instalada > rodada && agora - instalada <= exports.ATRASO_DA_BATIDA_MIN * 60000;
385
+ }
386
+ function batidaNoDoctor(dirMonitor, raizDoCheckout, opcoes) {
387
+ const abertas = opcoes.abertas ?? threadsAbertasNoEstado(path.dirname(dirMonitor));
388
+ const rodada = ultimaRodadaDaVarredura(dirMonitor);
389
+ const agora = opcoes.agora ?? Date.now();
390
+ const haMin = rodada ? Math.max(0, Math.floor((agora - Date.parse(rodada.em)) / 60000)) : null;
391
+ const leitura = (opcoes.ler ?? lerCrontabDoSistema)();
392
+ const instalada = leitura.ok ? entradasDaVarredura(leitura.texto).some((e) => entradaDoProjeto(e, raizDoCheckout)) : null;
393
+ const atrasada = abertas > 0 && (haMin !== null ? haMin > exports.ATRASO_DA_BATIDA_MIN && !recemInstalada(raizDoCheckout, rodada?.em ?? null, agora)
394
+ : instalada !== true);
395
+ const quando = rodada ? (0, horario_1.formatarDataHoraRotulada)(rodada.em, { agora: new Date(agora).toISOString() }) : null;
396
+ const aviso = !atrasada ? null : haMin !== null
397
+ ? `Orkastery: a fabrica ${opcoes.projeto} na maquina ${opcoes.maquina} esta sem batida ha ${haMin} min (ultima rodada em ${quando}` +
398
+ `${rodada?.code ? `, codigo ${rodada.code}` : ''}), com ${abertas} thread(s) aberta(s). Confira com: ork fabrica batida status`
399
+ : `Orkastery: a fabrica ${opcoes.projeto} na maquina ${opcoes.maquina} nao tem batida (nenhuma rodada da varredura e a linha nao ` +
400
+ `esta no crontab), com ${abertas} thread(s) aberta(s). Instale com: ork fabrica batida instalar`;
401
+ return { threadsAbertas: abertas, instalada, ultimaRodadaEm: rodada?.em ?? null, codigo: rodada?.code ?? null, haMin,
402
+ limiteMin: exports.ATRASO_DA_BATIDA_MIN, atrasada, aviso };
403
+ }
404
+ // ---------------------------------------------------------------------------
405
+ // RM-063 (fatia 3, H4): a falha do transporte do pulse, que a entrega grava em `transporte.log`.
406
+ // ---------------------------------------------------------------------------
407
+ exports.ARQUIVO_DO_TRANSPORTE = 'transporte.log';
408
+ /** A entrega mais velha que isto nao e mais noticia: o doctor nao acusa a falha de ontem. */
409
+ const VALIDADE_DA_FALHA_MS = 24 * 60 * 60 * 1000;
410
+ /** A ultima entrega registrada no `transporte.log` (lida do fim, com teto). */
411
+ function ultimaEntrega(dirMonitor) {
412
+ let texto;
413
+ try {
414
+ const fd = fs.openSync(path.join(dirMonitor, exports.ARQUIVO_DO_TRANSPORTE), 'r');
415
+ try {
416
+ const tamanho = fs.fstatSync(fd).size, lido = Math.min(tamanho, 64 * 1024);
417
+ const buffer = Buffer.alloc(lido);
418
+ fs.readSync(fd, buffer, 0, lido, tamanho - lido);
419
+ texto = buffer.toString('utf8');
420
+ }
421
+ finally {
422
+ fs.closeSync(fd);
423
+ }
424
+ }
425
+ catch {
426
+ return null;
427
+ }
428
+ for (const linha of texto.split('\n').reverse()) {
429
+ try {
430
+ const e = JSON.parse(linha);
431
+ if (e.tipo !== 'transporte_entrega' || typeof e.ts !== 'string' || !Array.isArray(e.tentativas))
432
+ continue;
433
+ return { ts: e.ts, oQue: String(e.oQue ?? ''), ok: e.ok === true, host: typeof e.host === 'string' ? e.host : null, tentativas: e.tentativas };
434
+ }
435
+ catch { /* linha cortada */ }
436
+ }
437
+ return null;
438
+ }
439
+ /**
440
+ * Check "transporte do pulse": a ultima entrega do resumo. Saiu pelo primeiro transporte, ok; saiu pelo outro host
441
+ * configurado, aviso; nao saiu por nenhum, falha. `null` sem `pulse-host.json`, ou sem entrega nas ultimas 24 h.
442
+ */
443
+ function checarTransporteDoPulse(dirMonitor, agora = Date.now()) {
444
+ if (!fs.existsSync(path.join(dirMonitor, 'pulse-host.json')))
445
+ return null;
446
+ const e = ultimaEntrega(dirMonitor);
447
+ if (!e || !(agora - Date.parse(e.ts) <= VALIDADE_DA_FALHA_MS))
448
+ return null;
449
+ const nome = 'transporte do pulse';
450
+ const quando = (0, horario_1.formatarDataHoraRotulada)(e.ts, { agora: new Date(agora).toISOString() });
451
+ if (!e.ok) {
452
+ const tentativas = e.tentativas.map((t) => `${t.host}: ${t.codigo ?? 'sem código'}`).join('; ');
453
+ return { nome, nivel: 'fail', detalhe: (0, locale_1.msg)().doctor.transporteFalhou(quando, tentativas), correcao: (0, locale_1.msg)().doctor.transporteCorrecao };
454
+ }
455
+ const falhas = e.tentativas.filter((t) => !t.ok);
456
+ if (falhas.length) {
457
+ return { nome, nivel: 'warn', detalhe: (0, locale_1.msg)().doctor.transporteDesvio(falhas.map((t) => t.host).join(', '), e.host ?? '?', quando),
458
+ correcao: (0, locale_1.msg)().doctor.transporteCorrecao };
459
+ }
460
+ return { nome, nivel: 'ok', detalhe: (0, locale_1.msg)().doctor.transporteOk(e.host ?? '?', quando) };
194
461
  }
@@ -41,7 +41,7 @@ exports.checarRede = checarRede;
41
41
  * RM-053 (fatia 2): o check "rede" do `ork doctor`.
42
42
  *
43
43
  * A rede pessoal publica sozinha (batida do pulse e eventos de thread) e so deixava rastro em
44
- * `~/.orkastery/rede/rede.log`: a srvjcp86 ficou de 02/10 em diante como membro herdado da fabrica,
44
+ * `~/.orkastery/rede/rede.log`: a maquina-b ficou de 02/10 em diante como membro herdado da fabrica,
45
45
  * com toda publicacao caindo em `rede.sem-repositorio`, e o doctor dizia PRONTO sem uma palavra.
46
46
  *
47
47
  * O check diz a adesao, a casa, a ultima batida publicada e a ultima falha do log. Ele so le
@@ -56,6 +56,7 @@ const rede_1 = require("./rede");
56
56
  const rede_adesao_1 = require("./rede-adesao");
57
57
  const rede_status_1 = require("./rede-status");
58
58
  const saida_segura_1 = require("./saida-segura");
59
+ const locale_1 = require("./locale");
59
60
  /** O fim do `rede.log` que o doctor le: o log so cresce, e o que importa e o mais recente. */
60
61
  exports.CAUDA_DO_LOG_BYTES = 64 * 1024;
61
62
  /** As linhas legiveis do fim do `rede.log`, da mais antiga para a mais nova. Sem log, lista vazia. */
@@ -102,16 +103,16 @@ const curto = (s, teto = 200) => {
102
103
  /** A correcao pela familia do erro da ultima falha (o prefixo tipado, como `rede.sem-repositorio`). */
103
104
  function correcaoDaFalha(erro) {
104
105
  const codigo = /^([a-z]+\.[a-z-]+):/.exec(erro)?.[1] ?? '';
105
- if (codigo === 'rede.sem-repositorio' || codigo === 'rede.repositorio-alheio') {
106
- return 'a casa da rede ainda nao existe: o dono roda ork network entrar, que cria o repositorio privado; ou ork network sair, para tirar esta maquina da rede';
107
- }
106
+ const m = (0, locale_1.msg)().doctor;
107
+ if (codigo === 'rede.sem-repositorio' || codigo === 'rede.repositorio-alheio')
108
+ return m.redeSemCasaCorrecao;
108
109
  if (codigo === 'rede.sem-forja')
109
- return 'faca login na forja (gh auth login ou glab auth login) e rode ork network publicar';
110
+ return m.redeSemForjaCorrecao;
110
111
  if (codigo === 'rede.repositorio-publico')
111
- return 'torne a casa da rede privada na forja; nada e publicado num repositorio publico';
112
+ return m.redePublicaCorrecao;
112
113
  if (codigo === 'rede.nome-em-uso')
113
- return 'escolha outro nome com ork network entrar --maquina NOME, ou tome este com --forcar';
114
- return 'ork network status mostra as lacunas; ork network publicar tenta de novo';
114
+ return m.redeNomeCorrecao;
115
+ return m.redeOutraCorrecao;
115
116
  }
116
117
  /** O check "rede". `agoraMs` e o log ficam injetaveis para o teste. */
117
118
  function checarRede(opcoes = {}) {
@@ -120,8 +121,8 @@ function checarRede(opcoes = {}) {
120
121
  const adesao = (0, rede_adesao_1.adesaoDaRede)();
121
122
  if (!adesao.membro) {
122
123
  return { nome, nivel: 'ok', detalhe: adesao.config && !adesao.config.membro
123
- ? 'fora da rede (saiu com ork network sair)'
124
- : 'fora da rede; ork network entrar poe esta maquina na rede da pessoa' };
124
+ ? (0, locale_1.msg)().doctor.redeSaiu
125
+ : (0, locale_1.msg)().doctor.foraDaRede };
125
126
  }
126
127
  const marca = (0, rede_1.lerMarcaDaRede)();
127
128
  const config = adesao.config;
@@ -131,19 +132,19 @@ function checarRede(opcoes = {}) {
131
132
  const falha = [...registros].reverse().find((r) => r.acao === 'falhou') ?? null;
132
133
  const emBatida = marca && typeof marca.em === 'string' && Number.isFinite(Date.parse(marca.em)) ? marca.em : null;
133
134
  const idade = emBatida ? agora - Date.parse(emBatida) : NaN;
135
+ const m = (0, locale_1.msg)().doctor;
134
136
  const partes = [
135
- adesao.adesao === 'fabrica' ? 'membro herdado da fabrica' : 'membro',
136
- casa ? `casa ${curto(casa, 120)}` : 'casa ainda nao gravada',
137
- emBatida ? `ultima batida ${(0, horario_1.formatarDataHora)(emBatida)} (ha ${(0, rede_status_1.duracao)(idade)})` : 'nenhuma batida publicada',
138
- falha ? `ultima falha ${(0, horario_1.formatarDataHora)(falha.ts)}${falha.origem ? ` (${curto(falha.origem, 20)})` : ''}: ${curto(falha.erro ?? 'sem detalhe')}`
139
- : 'nenhuma falha no rede.log',
137
+ adesao.adesao === 'fabrica' ? m.redeMembroHerdado : m.redeMembro,
138
+ casa ? m.redeCasa(curto(casa, 120)) : m.redeSemCasa,
139
+ emBatida ? m.redeBatida((0, horario_1.formatarDataHora)(emBatida), (0, rede_status_1.duracao)(idade)) : m.redeSemBatida,
140
+ falha ? m.redeFalha((0, horario_1.formatarDataHora)(falha.ts), falha.origem ? curto(falha.origem, 20) : null, curto(falha.erro ?? m.redeSemDetalhe))
141
+ : m.redeSemFalha,
140
142
  ];
141
143
  // A falha mais nova que a ultima batida e o estado de agora; a de antes ja passou.
142
144
  const falhaAtual = !!falha && (!emBatida || Date.parse(falha.ts) > Date.parse(emBatida));
143
145
  const parada = !emBatida || !(idade <= rede_status_1.SEM_BATIDA_MS);
144
146
  if (!falhaAtual && !parada)
145
147
  return { nome, nivel: 'ok', detalhe: partes.join('; ') };
146
- const correcao = falhaAtual ? correcaoDaFalha(falha.erro ?? '')
147
- : 'a batida sai do pulse: confira o cron do pulse e rode ork network publicar';
148
+ const correcao = falhaAtual ? correcaoDaFalha(falha.erro ?? '') : m.redeParadaCorrecao;
148
149
  return { nome, nivel: 'warn', detalhe: partes.join('; '), correcao };
149
150
  }