@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
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CRONTAB_DO_SISTEMA = exports.MARCA_DA_BATIDA = exports.ultimaRodadaDaVarredura = exports.ATRASO_DA_BATIDA_MIN = void 0;
37
+ exports.gravarCrontabDoSistema = gravarCrontabDoSistema;
38
+ exports.caminhoDaBatida = caminhoDaBatida;
39
+ exports.scriptDaBatida = scriptDaBatida;
40
+ exports.linhaDaBatida = linhaDaBatida;
41
+ exports.linhaGerenciada = linhaGerenciada;
42
+ exports.estadoDaBatida = estadoDaBatida;
43
+ exports.instalarBatida = instalarBatida;
44
+ exports.removerBatida = removerBatida;
45
+ exports.textoDoEstadoDaBatida = textoDoEstadoDaBatida;
46
+ exports.textoDoResultadoDaBatida = textoDoResultadoDaBatida;
47
+ /**
48
+ * RM-063 (F1): a batida da fabrica, instalada e vigiada pelo proprio `ork`.
49
+ *
50
+ * Incidente do maquina-b, de 03/10 a 12/10/2026 (P1 e P7 da pagina da RM-063): o cron da varredura do
51
+ * pulse nunca foi instalado, o `ork doctor` so conferia o crontab com `pulse-host.json` e, sem
52
+ * transporte, calava; a correcao (editar o crontab) foi barrada como persistencia nao autorizada. A
53
+ * maquina ficou nove dias sem batida e ninguem soube.
54
+ *
55
+ * `ork fabrica batida instalar|status|remover` e o comando que o dono autoriza uma vez: instala a linha
56
+ * do template `monitor/pulse.cron` com o checkout canonico e o PATH que acha o `node`, o `claude` e o
57
+ * transporte, preserva as outras entradas do crontab e grava o evento no ledger da maquina
58
+ * (`~/.orkastery/ledger.jsonl`). A linha e marcada (`# ork-batida`) e diz o projeto
59
+ * (`ORK_PULSE_PROJECT`): e por elas que o `remover` tira so a linha dela.
60
+ *
61
+ * O crontab nunca e gravado sem ter sido lido, e a gravacao so vale depois de relida. O executor e
62
+ * injetado: os testes usam um crontab falso e nunca tocam no da maquina.
63
+ */
64
+ const fs = __importStar(require("node:fs"));
65
+ const path = __importStar(require("node:path"));
66
+ const node_child_process_1 = require("node:child_process");
67
+ const doctor_pulse_cron_1 = require("./doctor-pulse-cron");
68
+ var doctor_pulse_cron_2 = require("./doctor-pulse-cron");
69
+ Object.defineProperty(exports, "ATRASO_DA_BATIDA_MIN", { enumerable: true, get: function () { return doctor_pulse_cron_2.ATRASO_DA_BATIDA_MIN; } });
70
+ Object.defineProperty(exports, "ultimaRodadaDaVarredura", { enumerable: true, get: function () { return doctor_pulse_cron_2.ultimaRodadaDaVarredura; } });
71
+ const estado_thread_1 = require("./estado-thread");
72
+ const ledger_1 = require("./ledger");
73
+ const maquina_1 = require("./maquina");
74
+ const horario_1 = require("./horario");
75
+ const util_1 = require("./util");
76
+ const procedencia_1 = require("./procedencia");
77
+ const autorizacao_duravel_1 = require("./autorizacao-duravel");
78
+ const locale_1 = require("./locale");
79
+ /** O comentario no fim da linha que o `ork` instalou; o `sh` do cron o ignora. */
80
+ exports.MARCA_DA_BATIDA = '# ork-batida';
81
+ /** Os binarios que a varredura chama, alem do `node`: o runtime, a forja e o git. */
82
+ const BINARIOS_DA_VARREDURA = ['claude', 'codex', 'gh', 'git'];
83
+ const PATH_DO_SISTEMA = ['/usr/local/bin', '/usr/bin', '/bin'];
84
+ /** `crontab -` com o texto no stdin, sem shell e com prazo. */
85
+ function gravarCrontabDoSistema(texto) {
86
+ const r = (0, node_child_process_1.spawnSync)('crontab', ['-'], { input: texto, encoding: 'utf8', timeout: 5000 });
87
+ if (r.status === 0)
88
+ return { ok: true };
89
+ const erro = r.error ? r.error.code ?? r.error.message : null;
90
+ if (erro === 'ENOENT')
91
+ return { ok: false, motivo: 'comando crontab ausente nesta maquina' };
92
+ const primeira = `${r.stderr ?? ''}${r.stdout ?? ''}`.trim().split('\n')[0] ?? '';
93
+ return { ok: false, motivo: primeira ? `crontab - falhou: ${primeira}` : `crontab - saiu ${r.status ?? erro ?? 'sem codigo'}` };
94
+ }
95
+ exports.CRONTAB_DO_SISTEMA = { ler: doctor_pulse_cron_1.lerCrontabDoSistema, gravar: gravarCrontabDoSistema };
96
+ /** Caminho que entra na linha do cron: absoluto, sem `%` (o cron o troca por quebra de linha) e sem controle. */
97
+ function caminhoAceito(caminho) {
98
+ return path.isAbsolute(caminho) && !/[%\p{Cc}]/u.test(caminho);
99
+ }
100
+ /** Diretorio aceito no PATH da linha: alem do caminho aceito, sem `:`, o separador do PATH. */
101
+ function diretorioAceito(dir) {
102
+ return caminhoAceito(dir) && !dir.includes(':');
103
+ }
104
+ /**
105
+ * O executavel do transporte, so do `pulse-host.json` local desta maquina (RM-047, P2): o versionado no git, ou o link,
106
+ * nao poe diretorio nenhum no PATH da batida.
107
+ */
108
+ function transporteDoProjeto(raiz, dirMonitor) {
109
+ const arquivo = path.join(dirMonitor, 'pulse-host.json');
110
+ try {
111
+ (0, procedencia_1.exigirHostLocal)(raiz, arquivo);
112
+ const config = JSON.parse(fs.readFileSync(arquivo, 'utf8'));
113
+ // RM-063 (fatia 3, H4): o outro host configurado tambem precisa estar no PATH da batida.
114
+ const todos = [config, ...(Array.isArray(config.alternativos) ? config.alternativos : [])];
115
+ return todos.map((t) => (typeof t?.executavel === 'string' ? t.executavel.trim() : '')).filter(Boolean);
116
+ }
117
+ catch {
118
+ return [];
119
+ }
120
+ }
121
+ /**
122
+ * O PATH da linha: o diretorio do `node` que roda este `ork`, os do `claude`, `codex`, `gh` e `git` achados
123
+ * agora, o do executavel do transporte (`pulse-host.json`) e o PATH minimo do sistema. O cron nao carrega o
124
+ * perfil do shell; sem isto a varredura nao acha o runtime nem o transporte (o template avisa).
125
+ */
126
+ function caminhoDaBatida(opcoes = {}) {
127
+ const achar = opcoes.achar ?? ((bin) => (0, util_1.noPath)(bin));
128
+ const dirs = [];
129
+ const somar = (arquivo) => {
130
+ if (!arquivo || !path.isAbsolute(arquivo))
131
+ return;
132
+ const dir = path.dirname(arquivo);
133
+ if (diretorioAceito(dir) && !dirs.includes(dir))
134
+ dirs.push(dir);
135
+ };
136
+ somar(opcoes.node ?? process.execPath);
137
+ for (const bin of BINARIOS_DA_VARREDURA)
138
+ somar(achar(bin));
139
+ for (const t of typeof opcoes.transporte === 'string' ? [opcoes.transporte] : opcoes.transporte ?? []) {
140
+ somar(path.isAbsolute(t) ? t : achar(t));
141
+ }
142
+ for (const dir of PATH_DO_SISTEMA)
143
+ if (!dirs.includes(dir))
144
+ dirs.push(dir);
145
+ return dirs.join(':');
146
+ }
147
+ /** O script da varredura que a linha roda: o do checkout do projeto, senao o do `ork` instalado. */
148
+ function scriptDaBatida(raiz, scriptDoOrk = (0, doctor_pulse_cron_1.scriptDaVarreduraDoOrk)()) {
149
+ const doProjeto = path.join(raiz, 'monitor', doctor_pulse_cron_1.SCRIPT_DA_VARREDURA);
150
+ return fs.existsSync(doProjeto) ? doProjeto : scriptDoOrk;
151
+ }
152
+ /**
153
+ * A linha que o `ork` instala: a batida do template (`*\/15`), o projeto alvo, o PATH e o script, com a
154
+ * marca no fim. `raiz` e a raiz canonica (o checkout principal, nunca a worktree de uma thread).
155
+ */
156
+ function linhaDaBatida(raiz, opcoes = {}) {
157
+ const script = scriptDaBatida(raiz, opcoes.scriptDoOrk === undefined ? (0, doctor_pulse_cron_1.scriptDaVarreduraDoOrk)() : opcoes.scriptDoOrk);
158
+ if (!script) {
159
+ throw new Error(`fabrica.batida.sem-script: nem ${path.join(raiz, 'monitor', doctor_pulse_cron_1.SCRIPT_DA_VARREDURA)} nem o ` +
160
+ `${doctor_pulse_cron_1.SCRIPT_DA_VARREDURA} do ork instalado existem; reinstale o ork (npm i -g @orkastery/cli)`);
161
+ }
162
+ for (const caminho of [raiz, script]) {
163
+ if (!caminhoAceito(caminho)) {
164
+ throw new Error(`fabrica.batida.caminho-invalido: ${JSON.stringify(caminho)} nao cabe numa linha do cron ` +
165
+ '(precisa ser absoluto, sem % e sem caractere de controle)');
166
+ }
167
+ }
168
+ const PATH = caminhoDaBatida({ node: opcoes.node, achar: opcoes.achar,
169
+ transporte: transporteDoProjeto(raiz, path.join(raiz, '.orkastery', 'monitor')) });
170
+ return `${doctor_pulse_cron_1.BATIDA_DO_TEMPLATE} ORK_PULSE_PROJECT=${(0, doctor_pulse_cron_1.citarNoShell)(raiz)} PATH=${(0, doctor_pulse_cron_1.citarNoShell)(PATH)} ` +
171
+ `${(0, doctor_pulse_cron_1.citarNoShell)(script)} ${exports.MARCA_DA_BATIDA}`;
172
+ }
173
+ /** A linha foi instalada pelo `ork fabrica batida instalar` (traz a marca no fim)? */
174
+ function linhaGerenciada(linha) {
175
+ return linha.trimEnd().endsWith(exports.MARCA_DA_BATIDA);
176
+ }
177
+ /**
178
+ * As entradas da varredura DESTE projeto, separadas pela marca. O projeto efetivo considera a linha de ambiente do
179
+ * crontab acima da entrada: o template abaixo de `ORK_PULSE_PROJECT=/outro` e a batida do outro, e fica.
180
+ */
181
+ function separar(texto, raiz) {
182
+ const doProjeto = (0, doctor_pulse_cron_1.entradasDaVarredura)(texto).filter((e) => (0, doctor_pulse_cron_1.entradaDoProjeto)(e, raiz)).map((e) => e.linha);
183
+ return { gerenciadas: doProjeto.filter(linhaGerenciada), manuais: doProjeto.filter((l) => !linhaGerenciada(l)) };
184
+ }
185
+ function ritmoDa(linha) {
186
+ const t = linha.trim();
187
+ const m = t.startsWith('@') ? /^(@\S+)\s/.exec(t) : /^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s/.exec(t);
188
+ return m ? (0, doctor_pulse_cron_1.intervaloEmMinutos)(m[1]) : null;
189
+ }
190
+ /** `ork fabrica batida status`: o que o crontab desta maquina diz da batida deste projeto, e a ultima rodada. */
191
+ function estadoDaBatida(raizDoProjeto, opcoes = {}) {
192
+ const raiz = (0, estado_thread_1.raizDoEstado)(raizDoProjeto);
193
+ const executor = opcoes.executor ?? exports.CRONTAB_DO_SISTEMA;
194
+ const quando = opcoes.quando ?? new Date().toISOString();
195
+ const leitura = executor.ler();
196
+ const { gerenciadas, manuais } = leitura.ok ? separar(leitura.texto, raiz) : { gerenciadas: [], manuais: [] };
197
+ const ritmos = [...gerenciadas, ...manuais].map(ritmoDa).filter((r) => r !== null);
198
+ const rodada = (0, doctor_pulse_cron_1.ultimaRodadaDaVarredura)(path.join(raiz, '.orkastery', 'monitor'));
199
+ return {
200
+ projeto: raiz, maquina: (0, maquina_1.nomeDaMaquina)(),
201
+ leitura: leitura.ok ? { ok: true } : { ok: false, motivo: leitura.motivo },
202
+ gerenciada: gerenciadas[0]?.trim() ?? null, manuais: manuais.map((l) => l.trim()),
203
+ instalada: gerenciadas.length + manuais.length > 0,
204
+ intervaloMin: ritmos.length ? Math.min(...ritmos) : null,
205
+ ultimaRodada: rodada ? { ...rodada, haMin: Math.max(0, Math.floor((Date.parse(quando) - Date.parse(rodada.em)) / 60000)) } : null,
206
+ ...(opcoes.projeto ? { autorizacao: autorizacaoDaBatida(raiz, opcoes.projeto, quando) } : {}),
207
+ };
208
+ }
209
+ function autorizacaoDaBatida(raiz, projeto, quando) {
210
+ const l = (0, autorizacao_duravel_1.lerAutorizacao)(raiz, { projeto, agora: new Date(quando) });
211
+ const a = l.valida ? l.autorizacao : null;
212
+ return { estado: l.valida ? 'valida' : l.motivo === 'autorizacao.ausente' ? 'ausente' : 'invalida', motivo: l.valida ? null : l.motivo,
213
+ por: a?.por ?? null, ate: a?.ate ?? null, pode: a ? [...a.pode] : [], linha: (0, autorizacao_duravel_1.linhaDaAutorizacao)(l, quando) };
214
+ }
215
+ function lerParaEditar(executor) {
216
+ const leitura = executor.ler();
217
+ // Nunca gravar sem ter lido: um crontab que nao foi lido seria apagado pela gravacao.
218
+ if (!leitura.ok)
219
+ throw new Error(`fabrica.batida.sem-leitura: ${leitura.motivo}; nada foi gravado`);
220
+ return leitura.texto;
221
+ }
222
+ function gravarEConferir(executor, lido, texto, confere) {
223
+ // O crontab que mudou entre a leitura e a gravacao (um `crontab -e`, outro `instalar`) nao e sobrescrito.
224
+ const antes = executor.ler();
225
+ if (!antes.ok || antes.texto !== lido) {
226
+ throw new Error('fabrica.batida.concorrencia: o crontab mudou durante a operacao; nada foi gravado, rode de novo');
227
+ }
228
+ const gravacao = executor.gravar(texto);
229
+ if (!gravacao.ok)
230
+ throw new Error(`fabrica.batida.sem-gravacao: ${gravacao.motivo}`);
231
+ const relido = executor.ler();
232
+ if (!relido.ok || !confere(relido.texto)) {
233
+ throw new Error(`fabrica.batida.nao-confirmada: o crontab relido nao traz o que foi gravado` +
234
+ (relido.ok ? '' : ` (${relido.motivo})`) + '; confira com crontab -l');
235
+ }
236
+ }
237
+ /** O texto do crontab sem as linhas pedidas, com o fim de linha que o cron exige. */
238
+ function semAsLinhas(texto, sair) {
239
+ const ficam = texto.split('\n').filter((l) => !sair.has(l));
240
+ while (ficam.length && ficam[ficam.length - 1].trim() === '')
241
+ ficam.pop();
242
+ return ficam.length ? `${ficam.join('\n')}\n` : '';
243
+ }
244
+ function noLedgerDaMaquina(tipo, dados) {
245
+ return (0, ledger_1.registrar)((0, maquina_1.pastaDoUsuario)(), 'maquina', tipo, { maquina: (0, maquina_1.nomeDaMaquina)(), ...dados }).eventId;
246
+ }
247
+ /**
248
+ * `ork fabrica batida instalar`: idempotente. A linha igual ja instalada nao muda nada; a linha antiga do
249
+ * `ork` e a linha posta a mao da varredura deste projeto saem, e a linha do template entra no lugar. As
250
+ * outras entradas do crontab ficam como estavam.
251
+ */
252
+ function instalarBatida(raizDoProjeto, opcoes = {}) {
253
+ const raiz = (0, estado_thread_1.raizDoEstado)(raizDoProjeto);
254
+ const executor = opcoes.executor ?? exports.CRONTAB_DO_SISTEMA;
255
+ const linha = linhaDaBatida(raiz, opcoes);
256
+ const texto = lerParaEditar(executor);
257
+ const { gerenciadas, manuais } = separar(texto, raiz);
258
+ if (manuais.length === 0 && gerenciadas.length === 1 && gerenciadas[0].trim() === linha) {
259
+ return { acao: 'ja-instalada', projeto: raiz, linha, retiradas: [], manuais: [], eventId: null };
260
+ }
261
+ const retiradas = [...gerenciadas, ...manuais];
262
+ const base = semAsLinhas(texto, new Set(retiradas));
263
+ gravarEConferir(executor, texto, `${base}${linha}\n`, (relido) => relido.split('\n').some((l) => l.trim() === linha));
264
+ const eventId = noLedgerDaMaquina(ledger_1.TIPOS_DE_EVENTO.batidaInstalada, {
265
+ projeto: raiz, linha, retiradas: retiradas.map((l) => l.trim()), por: opcoes.por ?? null,
266
+ evidencia: 'crontab -l relido depois da gravacao traz a linha',
267
+ });
268
+ return { acao: 'instalou', projeto: raiz, linha, retiradas: retiradas.map((l) => l.trim()), manuais: [], eventId };
269
+ }
270
+ /** `ork fabrica batida remover`: tira so a linha que o `ork` instalou para este projeto. */
271
+ function removerBatida(raizDoProjeto, opcoes = {}) {
272
+ const raiz = (0, estado_thread_1.raizDoEstado)(raizDoProjeto);
273
+ const executor = opcoes.executor ?? exports.CRONTAB_DO_SISTEMA;
274
+ const texto = lerParaEditar(executor);
275
+ const { gerenciadas, manuais } = separar(texto, raiz);
276
+ const ficam = manuais.map((l) => l.trim());
277
+ if (gerenciadas.length === 0)
278
+ return { acao: 'nao-instalada', projeto: raiz, linha: null, retiradas: [], manuais: ficam, eventId: null };
279
+ const sair = new Set(gerenciadas);
280
+ gravarEConferir(executor, texto, semAsLinhas(texto, sair), (relido) => separar(relido, raiz).gerenciadas.length === 0);
281
+ const eventId = noLedgerDaMaquina(ledger_1.TIPOS_DE_EVENTO.batidaRemovida, {
282
+ projeto: raiz, retiradas: gerenciadas.map((l) => l.trim()), manuaisQueFicaram: ficam, por: opcoes.por ?? null,
283
+ evidencia: 'crontab -l relido depois da gravacao nao traz a linha do ork',
284
+ });
285
+ return { acao: 'removeu', projeto: raiz, linha: null, retiradas: gerenciadas.map((l) => l.trim()), manuais: ficam, eventId };
286
+ }
287
+ function textoDoEstadoDaBatida(e, quando = new Date().toISOString()) {
288
+ const m = (0, locale_1.msg)().operacao.restante.fabrica.batida;
289
+ const linhas = [m.titulo(e.maquina, e.projeto)];
290
+ if (!e.leitura.ok)
291
+ linhas.push(m.naoLido(e.leitura.motivo));
292
+ else if (!e.instalada)
293
+ linhas.push(m.naoInstalada);
294
+ else {
295
+ const ritmo = e.intervaloMin === null ? m.horarioIlegivel : m.aCada(e.intervaloMin);
296
+ linhas.push(m.instalada(ritmo, !!e.gerenciada));
297
+ for (const l of [...(e.gerenciada ? [e.gerenciada] : []), ...e.manuais])
298
+ linhas.push(m.linha(l));
299
+ }
300
+ const r = e.ultimaRodada;
301
+ if (!r)
302
+ linhas.push(m.semRodada);
303
+ else {
304
+ linhas.push(m.rodada((0, horario_1.formatarHora)(r.em, { agora: quando }), r.haMin, m.codigo(r.code), r.detalhe || m.semDetalhe));
305
+ if (e.instalada && r.haMin > doctor_pulse_cron_1.ATRASO_DA_BATIDA_MIN) {
306
+ linhas.push(m.atrasada(r.haMin));
307
+ }
308
+ }
309
+ if (e.autorizacao)
310
+ linhas.push(` ${e.autorizacao.linha}`);
311
+ linhas.push((0, horario_1.legendaDoFuso)());
312
+ return linhas.join('\n');
313
+ }
314
+ function textoDoResultadoDaBatida(r) {
315
+ const m = (0, locale_1.msg)().operacao.restante.fabrica.batida;
316
+ switch (r.acao) {
317
+ case 'ja-instalada': return m.jaInstalada(r.projeto, r.linha);
318
+ case 'instalou': return [m.instalou(r.projeto, r.eventId), m.linha(r.linha),
319
+ ...r.retiradas.map(m.saiu), m.confira].join('\n');
320
+ case 'removeu': return [m.removeu(r.projeto, r.eventId), ...r.retiradas.map(m.saiu), ...r.manuais.map(m.ficou)].join('\n');
321
+ case 'nao-instalada': return [m.nenhumaInstalada(r.projeto), ...r.manuais.map(m.ficou)].join('\n');
322
+ }
323
+ }
@@ -57,8 +57,9 @@ exports.painelDaFabricaEmMarkdown = painelDaFabricaEmMarkdown;
57
57
  * GitHub. `ork board`, `ork fabrica` e o resumo do pulse leem as outras maquinas dali. Cada
58
58
  * maquina so escreve o proprio arquivo: push recusado se resolve relendo a ponta.
59
59
  *
60
- * Publicar e empurrar para o remoto do projeto, entao so acontece sozinho com
61
- * `fabrica.compartilhada: true` no manifesto; `ork fabrica publicar` e o caminho explicito. Nada de
60
+ * Publicar e empurrar para o remoto do projeto, entao so acontece sozinho com a adesao da maquina
61
+ * (`ork fabrica entrar`); o `fabrica.compartilhada` do manifesto so pede (RM-047, P5), e
62
+ * `ork fabrica publicar` e o caminho explicito. Nada de
62
63
  * credencial, prompt, log ou caminho local sai daqui: so identificadores, fase, status e o assunto
63
64
  * da pausa que espera o dono.
64
65
  *
@@ -82,6 +83,8 @@ const thread_1 = require("./thread");
82
83
  const util_1 = require("./util");
83
84
  const versao_1 = require("./versao");
84
85
  const saida_segura_1 = require("./saida-segura");
86
+ const vida_da_thread_1 = require("./vida-da-thread");
87
+ const locale_1 = require("./locale");
85
88
  exports.CONTRATO_MAQUINA = 'ork.fabrica-maquina/v1';
86
89
  exports.BRANCH_DA_FABRICA = 'ork/fabrica-estado';
87
90
  /** O diretorio dos retratos na branch; a leitura sem clone (RM-054) le o mesmo. */
@@ -162,17 +165,37 @@ function retratoDaMaquina(carregado, opcoes = {}) {
162
165
  const linhas = new Map(monitor.linhas.map((l) => [l.thread, l]));
163
166
  const entregas = entregasNaBase(raiz, carregado.manifesto.worktree.base_branch, remoto);
164
167
  const itemDaThread = new Map((0, roadmap_reservas_1.reservasLocais)(raiz, remoto).filter((r) => r.thread).map((r) => [r.thread, r.item]));
168
+ let leitura;
169
+ const lerUmaVez = () => (leitura ??= (opcoes.runtime ?? (() => (0, vida_da_thread_1.lerRuntime)(raiz)))());
165
170
  const threads = itens.map(({ thread: t, raiz: raizDoPerfil }) => {
166
171
  const entregue = entregas.get(t.id) ?? null;
167
172
  // RM-037 (fatia 4): o fim de turno sem pergunta e do condutor, e as outras maquinas nao o leem como espera
168
173
  // do dono. Sai so a pausa que o observador abriu nele; outra pausa da thread continua contando.
169
174
  let espera = null;
175
+ let eventos = [];
170
176
  try {
171
- espera = (0, parado_no_condutor_1.esperaDoCondutor)(t, (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raizDoPerfil, t.id)), quando);
177
+ eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raizDoPerfil, t.id));
178
+ }
179
+ catch {
180
+ eventos = [];
181
+ }
182
+ try {
183
+ espera = (0, parado_no_condutor_1.esperaDoCondutor)(t, eventos, quando);
172
184
  }
173
185
  catch {
174
186
  espera = null;
175
187
  }
188
+ // RM-063 (F2): a fabrica so mostra a thread como andando com a sessao viva verificada no runtime.
189
+ let sessao = null;
190
+ if (!entregue) {
191
+ try {
192
+ const v = (0, vida_da_thread_1.vidaDaThread)(t, eventos, lerUmaVez, Date.parse(quando));
193
+ sessao = { viva: v.viva, desdeEm: v.desdeEm, motivo: v.motivo };
194
+ }
195
+ catch {
196
+ sessao = null;
197
+ }
198
+ }
176
199
  const pausas = (linhas.get(t.id)?.pausas ?? []).filter((p) => !(espera && p.motivo === 'human.pending' && p.fonte === 'ledger' &&
177
200
  p.fase === (espera.fase ?? t.faseAtual)));
178
201
  const pausa = pausas[0];
@@ -184,6 +207,7 @@ function retratoDaMaquina(carregado, opcoes = {}) {
184
207
  esperaVoce, pergunta: esperaVoce && pausa ? curto(pausa.pausaSobre || pausa.detalhe) : null,
185
208
  paradaDesde: esperaVoce && pausa ? pausa.desdeEm : null,
186
209
  ...despachoDaThread((0, thread_1.dirThread)(raizDoPerfil, t.id)),
210
+ sessao,
187
211
  };
188
212
  }).sort((a, b) => a.id.localeCompare(b.id));
189
213
  const eu = (0, roadmap_reservas_1.quemSouEu)(raiz, { por: opcoes.por, maquina: opcoes.maquina });
@@ -323,14 +347,20 @@ function tabela(cabecalho, linhas) {
323
347
  const linha = (l) => ' ' + l.map((c, i) => c.padEnd(largura[i])).join(' ').trimEnd();
324
348
  return [linha(cabecalho), linha(largura.map((n) => '-'.repeat(n))), ...linhas.map(linha)];
325
349
  }
350
+ /** RM-063 (F2): a coluna da sessao: `viva`, `parada desde HH:MM: <motivo>`, ou `-` no retrato que nao a traz. */
351
+ function sessaoNaFabrica(t, teto) {
352
+ const v = (0, vida_da_thread_1.vidaDoRetrato)(t.sessao);
353
+ return v.viva ? 'viva' : v.motivo === null ? '-' : curto((0, vida_da_thread_1.paradaDesde)(v), teto);
354
+ }
326
355
  function blocoDaMaquina(m, eu) {
356
+ const t = (0, locale_1.msg)().operacao.restante.fabrica;
327
357
  const vivas = ativas(m), entregues = m.threads.length - vivas.length;
328
- const cabeca = `${m.maquina}${m.maquina === eu ? ' (esta maquina)' : ''}, ${m.por}, publicado ${(0, horario_1.formatarDataHora)(m.publicadoEm)}: ` +
329
- `${vivas.length} thread(s) ativa(s)` + (entregues ? `, ${entregues} entregue(s) sem MASTER` : '');
358
+ const cabeca = t.maquina(m.maquina, m.maquina === eu ? t.estaMaquina : '', m.por, (0, horario_1.formatarDataHora)(m.publicadoEm), vivas.length, entregues);
330
359
  if (vivas.length === 0)
331
360
  return [cabeca];
332
- return [cabeca, ...tabela(['THREAD', 'MODO', 'FASE', 'RUNTIME', 'ITEM', 'ESPERA VOCE'], vivas.map((t) => [
333
- t.id, t.modo, t.fase, runtimeDaThread(t), t.roadmap ?? '-', t.esperaVoce ? `sim: ${curto(t.pergunta ?? 'veredito', 40)}` : '-',
361
+ return [cabeca, ...tabela([...t.colunas], vivas.map((thread) => [
362
+ thread.id, thread.modo, thread.fase, runtimeDaThread(thread), thread.roadmap ?? '-',
363
+ thread.esperaVoce ? t.espera(curto(thread.pergunta ?? t.veredito, 40)) : '-', sessaoNaFabrica(thread, 70),
334
364
  ]))];
335
365
  }
336
366
  /**
@@ -339,12 +369,13 @@ function blocoDaMaquina(m, eu) {
339
369
  * que o terminal execute.
340
370
  */
341
371
  function textoDaFabrica(painel, eu) {
372
+ const t = (0, locale_1.msg)().operacao.restante.fabrica;
342
373
  const p = (0, saida_segura_1.valoresEmUmaLinha)(painel);
343
374
  const linhas = [];
344
375
  if (!p.atualizado)
345
- linhas.push('AVISO: sem leitura nova do remoto; esta e a ultima copia lida nesta maquina.', '');
376
+ linhas.push(t.copia, '');
346
377
  if (p.maquinas.length === 0) {
347
- linhas.push(`Nenhuma maquina publicou ainda em ${exports.BRANCH_DA_FABRICA}. Publique esta com: ork fabrica publicar`);
378
+ linhas.push(t.nenhuma(exports.BRANCH_DA_FABRICA));
348
379
  return linhas.join('\n');
349
380
  }
350
381
  for (const m of p.maquinas)
@@ -354,12 +385,13 @@ function textoDaFabrica(painel, eu) {
354
385
  }
355
386
  /** A secao de `ork board` com as outras maquinas, saneada como o `ork fabrica`. */
356
387
  function textoDasOutrasMaquinas(painel, eu) {
388
+ const t = (0, locale_1.msg)().operacao.restante.fabrica;
357
389
  const p = (0, saida_segura_1.valoresEmUmaLinha)(painel);
358
390
  const outras = p.maquinas.filter((m) => m.maquina !== eu);
359
- const origem = p.atualizado ? 'lido agora' : 'ultima copia local';
391
+ const origem = p.atualizado ? t.origens.atual : t.origens.copia;
360
392
  if (outras.length === 0)
361
- return `Outras maquinas (${exports.BRANCH_DA_FABRICA}, ${origem}): nenhuma publicou ainda.`;
362
- const linhas = [`Outras maquinas (${exports.BRANCH_DA_FABRICA}, ${origem}):`];
393
+ return t.outrasNenhuma(exports.BRANCH_DA_FABRICA, origem);
394
+ const linhas = [t.outras(exports.BRANCH_DA_FABRICA, origem)];
363
395
  for (const m of outras)
364
396
  linhas.push(...blocoDaMaquina(m, eu).map((l, i) => (i === 0 ? ` ${l}` : l)));
365
397
  return linhas.join('\n');
@@ -372,17 +404,18 @@ function painelDaFabricaEmMarkdown(maquinas) {
372
404
  'O que cada máquina está conduzindo agora. Gerado pelo `ork fabrica publicar`; não edite à mão.',
373
405
  'Antes de pegar um item do roadmap: `ork roadmap reservas`.',
374
406
  '',
375
- '| Máquina | Thread | Modo | Fase | Runtime | Item | Espera você | Publicado |',
376
- '| --- | --- | --- | --- | --- | --- | --- | --- |',
407
+ '| Máquina | Thread | Modo | Fase | Runtime | Item | Espera você | Publicado | Sessão |',
408
+ '| --- | --- | --- | --- | --- | --- | --- | --- | --- |',
377
409
  ];
378
410
  const vivas = maquinas.flatMap((m) => ativas(m).map((t) => ({ m, t })));
379
411
  if (vivas.length === 0)
380
- linhas.push('| — | nenhuma thread ativa | — | — | | — | — | — |');
412
+ linhas.push('| — | nenhuma thread ativa | — | — | | — | — | — | — |');
381
413
  for (const { m, t } of vivas) {
382
414
  const pergunta = t.esperaVoce ? `sim: ${curto(t.pergunta ?? 'veredito', 60).replace(/\|/g, '/')}` : '—';
383
415
  // RM-037 (sugestao 6 do CHECK 1): a celula sem despacho diz isso, sem travessao novo.
384
416
  const runtime = t.runtime || t.modelo ? runtimeDaThread(t).replace(/\|/g, '/') : 'sem despacho';
385
- linhas.push(`| ${m.maquina} | ${t.id} | ${t.modo} | ${t.fase} | ${runtime} | ${t.roadmap ?? '—'} | ${pergunta} | ${(0, horario_1.formatarDataHora)(m.publicadoEm)} |`);
417
+ const sessao = sessaoNaFabrica(t, 80).replace(/\|/g, '/').replace(/^-$/, '—');
418
+ linhas.push(`| ${m.maquina} | ${t.id} | ${t.modo} | ${t.fase} | ${runtime} | ${t.roadmap ?? '—'} | ${pergunta} | ${(0, horario_1.formatarDataHora)(m.publicadoEm)} | ${sessao} |`);
386
419
  }
387
420
  return [...linhas, '', (0, horario_1.legendaDoFuso)(), ''].join('\n');
388
421
  }
@@ -48,6 +48,7 @@ const fs = __importStar(require("node:fs"));
48
48
  const path = __importStar(require("node:path"));
49
49
  const maquina_1 = require("./maquina");
50
50
  const manifest_1 = require("./manifest");
51
+ const projeto_alvo_1 = require("./projeto-alvo");
51
52
  const rede_adesao_1 = require("./rede-adesao");
52
53
  /**
53
54
  * Publica sem segurar quem chamou (thread nova, despacho de fase, entrega). So com a fabrica
@@ -72,7 +73,8 @@ function publicarEmSegundoPlano(raiz) {
72
73
  if (!fs.existsSync(cli))
73
74
  return false;
74
75
  try {
75
- const filho = (0, node_child_process_1.spawn)(process.execPath, [cli, 'fabrica', 'publicar', '--silencioso'], { cwd: carregado.raiz, detached: true, stdio: 'ignore', env: process.env });
76
+ // RM-052 (fatia 2, D2): o filho publica o projeto do proprio cwd; o modo host de quem chamou nao o segue.
77
+ const filho = (0, node_child_process_1.spawn)(process.execPath, [cli, 'fabrica', 'publicar', '--silencioso'], { cwd: carregado.raiz, detached: true, stdio: 'ignore', env: { ...process.env, ...projeto_alvo_1.AMBIENTE_SEM_PROJETO_HERDADO } });
76
78
  filho.unref();
77
79
  return true;
78
80
  }