@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,211 @@
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.maquinaOciosa = maquinaOciosa;
37
+ /**
38
+ * RM-063 (F6): ociosidade e alerta.
39
+ *
40
+ * Pedido do dono de 12/10/2026: "Você não pode deixar a máquina parada sem me avisar." No maquina-b, de 03 a 12/10, a
41
+ * maquina ficou dias sem sessao viva com item do roadmap reservado para ela, e nenhum canal disse nada. Aqui mora a
42
+ * leitura que faz disso um alerta: a maquina esta ociosa quando o projeto tem vaga livre (as vagas ocupadas, pela mesma
43
+ * regra do portao de vaga do despacho, abaixo de `concurrency.max_parallel_threads`) e ha trabalho reservado para ela no
44
+ * roadmap (`ork/roadmap-reservas`) que ninguem trabalha agora. O alerta leva as proximas threads sugeridas, ate o numero
45
+ * de vagas livres, cada uma com o passo do condutor do nucleo e o comando.
46
+ *
47
+ * Leitura pura: as reservas vem da ultima copia local da branch de reservas (sem rede), e quem dedupe o alerta por
48
+ * episodio e a varredura (`pulse-delivery`).
49
+ */
50
+ const fs = __importStar(require("node:fs"));
51
+ const path = __importStar(require("node:path"));
52
+ const board_1 = require("./board");
53
+ const conducao_1 = require("./conducao");
54
+ const conducao_sentinela_1 = require("./conducao-sentinela");
55
+ const estado_thread_1 = require("./estado-thread");
56
+ const ledger_1 = require("./ledger");
57
+ const locale_1 = require("./locale");
58
+ const maquina_1 = require("./maquina");
59
+ const noctum_guarda_1 = require("./noctum-guarda");
60
+ const parado_no_condutor_1 = require("./parado-no-condutor");
61
+ const roadmap_reservas_1 = require("./roadmap-reservas");
62
+ const thread_1 = require("./thread");
63
+ const ITEM = /^RM-\d{3}$/;
64
+ /** O titulo do item, do frontmatter da pagina dele em `docs/roadmap/` (`null` sem a pagina). */
65
+ function tituloDoItem(raiz, item) {
66
+ const dir = path.join(raiz, 'docs', 'roadmap');
67
+ let arquivo;
68
+ try {
69
+ arquivo = fs.readdirSync(dir).find((f) => f.startsWith(`${item}-`) && f.endsWith('.md'));
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ if (!arquivo)
75
+ return null;
76
+ let texto;
77
+ try {
78
+ texto = fs.readFileSync(path.join(dir, arquivo), 'utf8').slice(0, 8192);
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ const m = /^titulo:\s*(.+)$/m.exec(texto);
84
+ return m ? m[1].trim().replace(/^["']|["']$/g, '').replace(/\p{Cc}/gu, ' ').slice(0, 120) || null : null;
85
+ }
86
+ /** A thread que trabalha o item: a da reserva, quando existe aqui; senao a aberta mais recente do item. */
87
+ function threadDoItem(threads, r) {
88
+ const daReserva = r.thread ? threads.find((t) => t.id === r.thread) ?? null : null;
89
+ if (daReserva)
90
+ return daReserva;
91
+ return threads.filter((t) => t.roadmap === r.item && t.status !== 'fechada')
92
+ .sort((a, b) => String(b.atualizadaEm ?? '').localeCompare(String(a.atualizadaEm ?? '')))[0] ?? null;
93
+ }
94
+ /** O passo do condutor de uma thread parada, como a sugestao o diz, com o comando. */
95
+ function passoDaSugestao(t, passo) {
96
+ if (passo?.acao === 'despachar' && passo.fase) {
97
+ const fase = passo.fase;
98
+ return { passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.despachar(fase)),
99
+ comando: `ork phase run ${t.id} ${fase} --prompt "$(ork prompt render ${t.id} ${fase})"` };
100
+ }
101
+ if (passo?.acao === 'retomar')
102
+ return { passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.retomar), comando: `ork retry run ${t.id}` };
103
+ if (passo?.acao === 'avisar' && passo.proximoPasso) {
104
+ const proximo = passo.proximoPasso;
105
+ return { passo: proximo, comando: `ork thread status ${t.id}` };
106
+ }
107
+ return { passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.verAThread(t.faseAtual)), comando: `ork thread status ${t.id}` };
108
+ }
109
+ /**
110
+ * A maquina esta ociosa? `null` quando nao esta: sem vaga livre, ou sem trabalho reservado para ela que ninguem
111
+ * trabalha agora. Fica de fora do trabalho reservado o item cuja thread esta fechada (a reserva e orfa), cuja thread
112
+ * alguem conduz agora e cuja thread espera o dono (o passo e dele, e a fila do dono ja o mostra).
113
+ */
114
+ function maquinaOciosa(carregado, opcoes = {}) {
115
+ const raiz = (0, estado_thread_1.raizDoEstado)(carregado.raiz);
116
+ const doProjeto = { ...carregado, raiz };
117
+ const quando = opcoes.quando ?? new Date().toISOString();
118
+ const maquina = opcoes.maquina ?? (0, maquina_1.nomeDaMaquina)();
119
+ const limite = Math.max(1, carregado.manifesto.concurrency.max_parallel_threads);
120
+ const ocupadas = opcoes.ocupadas ? opcoes.ocupadas() : (0, board_1.sessoesQueOcupam)(doProjeto, { quando }).length;
121
+ if (ocupadas >= limite)
122
+ return null;
123
+ const remoto = carregado.manifesto.fabrica.remoto;
124
+ const reservas = (opcoes.reservas ? opcoes.reservas() : (0, roadmap_reservas_1.reservasLocais)(raiz, remoto))
125
+ .filter((r) => r.maquina === maquina && ITEM.test(r.item));
126
+ if (!reservas.length)
127
+ return null;
128
+ const threads = [];
129
+ for (const id of (0, thread_1.listarIds)(raiz)) {
130
+ try {
131
+ threads.push((0, thread_1.lerThread)(raiz, id));
132
+ }
133
+ catch { /* thread ilegivel fica de fora */ }
134
+ }
135
+ // RM-058, integracao (T1.2): o trabalho de um arco #Noctum nao e sugerido. A thread que o arco segura ou retem fica com
136
+ // ele, e o item da lista de um arco que guarda (sem thread aberta ainda) e o arco que abre.
137
+ const arcos = (0, noctum_guarda_1.lerArcosDaRaiz)(raiz, quando);
138
+ const itensDosArcos = new Set();
139
+ for (const { estado, proposta } of arcos.lidos.values()) {
140
+ const guarda = (0, noctum_guarda_1.guardaOsCaminhosManuais)({ arco: estado.arco, situacao: estado.situacao, origem: 'envelope' });
141
+ for (const w of guarda ? estado.conteudo?.trabalhos ?? [] : [])
142
+ itensDosArcos.add(w.item);
143
+ for (const w of estado.situacao === 'proposto' || guarda ? proposta?.trabalhos ?? [] : [])
144
+ itensDosArcos.add(w.item);
145
+ }
146
+ const paradas = [];
147
+ for (const r of reservas) {
148
+ const t = threadDoItem(threads, r);
149
+ if (t?.status === 'fechada')
150
+ continue;
151
+ if (!t && itensDosArcos.has(r.item))
152
+ continue;
153
+ if (t) {
154
+ let conduzida = true;
155
+ try {
156
+ conduzida = (0, conducao_1.conducaoDaThread)(raiz, t.id, { agora: new Date(quando) }) !== null;
157
+ }
158
+ catch {
159
+ conduzida = true;
160
+ }
161
+ if (conduzida)
162
+ continue;
163
+ let eventos = [];
164
+ try {
165
+ eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, t.id));
166
+ }
167
+ catch {
168
+ eventos = [];
169
+ }
170
+ let doDono = null;
171
+ try {
172
+ doDono = (0, parado_no_condutor_1.pendenciaDoDono)(t, eventos, quando);
173
+ }
174
+ catch {
175
+ doDono = null;
176
+ }
177
+ if (doDono)
178
+ continue;
179
+ if ((0, noctum_guarda_1.arcoDoPasso)(raiz, arcos, t.id, eventos))
180
+ continue;
181
+ }
182
+ paradas.push({ r, t });
183
+ }
184
+ if (!paradas.length)
185
+ return null;
186
+ // A thread que ja existe vem antes (retomar custa menos que abrir), e a reserva mais antiga primeiro.
187
+ paradas.sort((a, b) => Number(!a.t) - Number(!b.t) || a.r.desdeEm.localeCompare(b.r.desdeEm) || a.r.item.localeCompare(b.r.item));
188
+ const livres = limite - ocupadas;
189
+ const escolhidas = paradas.slice(0, livres);
190
+ let passos = [];
191
+ if (escolhidas.some((x) => x.t)) {
192
+ try {
193
+ passos = opcoes.passos ? opcoes.passos() : (0, conducao_sentinela_1.passosDoCondutor)(doProjeto, { quando });
194
+ }
195
+ catch {
196
+ passos = [];
197
+ }
198
+ }
199
+ const sugeridas = escolhidas.map(({ r, t }) => {
200
+ const titulo = tituloDoItem(raiz, r.item);
201
+ if (!t) {
202
+ const nome = (titulo ?? r.item).replace(/"/g, "'");
203
+ return { item: r.item, titulo, thread: null, fase: null, passo: (0, locale_1.textoDoCatalogo)((m) => m.pulse.ociosa.abrir),
204
+ comando: `ork thread new "${nome}" --modo auto --roadmap ${r.item}` };
205
+ }
206
+ const { passo, comando } = passoDaSugestao(t, passos.find((p) => p.thread === t.id));
207
+ return { item: r.item, titulo, thread: t.id, fase: t.faseAtual, passo, comando };
208
+ });
209
+ return { maquina, limite, ocupadas, livres, reservados: paradas.length, sugeridas,
210
+ fonte: `copia local de ${remoto}/ork/roadmap-reservas` };
211
+ }
package/dist/maquina.js CHANGED
@@ -39,6 +39,7 @@ exports.lerConfigDaMaquina = lerConfigDaMaquina;
39
39
  exports.gravarConfigDaMaquina = gravarConfigDaMaquina;
40
40
  exports.nomeDaMaquina = nomeDaMaquina;
41
41
  exports.fabricaCompartilhada = fabricaCompartilhada;
42
+ exports.avisoDaFabricaPedida = avisoDaFabricaPedida;
42
43
  /**
43
44
  * I-51 (RM-047): esta maquina na fabrica.
44
45
  *
@@ -49,17 +50,26 @@ exports.fabricaCompartilhada = fabricaCompartilhada;
49
50
  * nao carregam o perfil do shell, e a mesma maquina apareceria com dois nomes.
50
51
  *
51
52
  * Precedencia do nome: `--maquina`, `ORK_MAQUINA`, o arquivo, o hostname.
52
- * Precedencia da adesao: `ORK_FABRICA_COMPARTILHADA` (1 liga, 0 desliga), senao o manifesto do
53
- * projeto (`fabrica.compartilhada`, para o time que quer em todas as maquinas) ou o arquivo.
53
+ * Precedencia da adesao: `ORK_FABRICA_COMPARTILHADA` (1 liga, 0 desliga), senao o arquivo.
54
+ *
55
+ * RM-047 (fronteira de confianca, P5): o `fabrica.compartilhada` do manifesto vem com o repositorio e
56
+ * nao liga a publicacao desta maquina. Ele so diz que o time pede a fabrica compartilhada; o `ork`
57
+ * avisa, e quem liga e a maquina, com `ork fabrica entrar` (ou a variavel de ambiente).
54
58
  */
55
59
  const fs = __importStar(require("node:fs"));
56
60
  const os = __importStar(require("node:os"));
57
61
  const path = __importStar(require("node:path"));
62
+ const locale_1 = require("./locale");
58
63
  exports.CONTRATO_CONFIG_DA_MAQUINA = 'ork.maquina/v1';
59
64
  const ARQUIVO = 'maquina.json';
60
- /** A pasta do usuario (`~/.orkastery`). `ORK_USUARIO_DIR` isola testes e `ork eval`. */
61
- function pastaDoUsuario() {
62
- return (process.env.ORK_USUARIO_DIR ?? '').trim() || path.join(os.homedir(), '.orkastery');
65
+ /**
66
+ * A pasta do usuario (`~/.orkastery`). `ORK_USUARIO_DIR` isola testes e `ork eval`; `ORKASTERY_HOME` e a casa do ork
67
+ * que o registro das sessoes (`hitl-estado.ts`) ja seguia. RM-063 (fatia 3, achado b): a suite inteira roda com
68
+ * `ORKASTERY_HOME` temporario, e o registro de projetos, a maquina e a rede passam a segui-lo tambem.
69
+ */
70
+ function pastaDoUsuario(env = process.env) {
71
+ return (env.ORK_USUARIO_DIR ?? '').trim() || (env.ORKASTERY_HOME ?? '').trim() ||
72
+ path.join(os.homedir(), '.orkastery');
63
73
  }
64
74
  function lerConfigDaMaquina() {
65
75
  try {
@@ -91,12 +101,26 @@ function gravarConfigDaMaquina(mudanca) {
91
101
  function nomeDaMaquina(explicito) {
92
102
  return (explicito ?? '').trim() || (process.env.ORK_MAQUINA ?? '').trim() || lerConfigDaMaquina()?.nome || os.hostname();
93
103
  }
94
- /** Esta maquina publica o estado da fabrica deste projeto? */
104
+ /**
105
+ * Esta maquina publica o estado da fabrica deste projeto (e le o das outras)? Decide a maquina: a
106
+ * variavel de ambiente ou o `~/.orkastery/maquina.json`. O manifesto nao entra (RM-047, P5); o
107
+ * parametro fica para quem chama dizer de que projeto se trata.
108
+ */
95
109
  function fabricaCompartilhada(manifesto) {
110
+ void manifesto;
96
111
  const env = (process.env.ORK_FABRICA_COMPARTILHADA ?? '').trim();
97
112
  if (env === '1')
98
113
  return true;
99
114
  if (env === '0')
100
115
  return false;
101
- return manifesto.fabrica?.compartilhada === true || lerConfigDaMaquina()?.fabricaCompartilhada === true;
116
+ return lerConfigDaMaquina()?.fabricaCompartilhada === true;
117
+ }
118
+ /**
119
+ * RM-047 (P5): o manifesto pede a fabrica compartilhada e esta maquina nao entrou. Devolve o aviso,
120
+ * com o comando que liga, ou `null`.
121
+ */
122
+ function avisoDaFabricaPedida(manifesto) {
123
+ if (manifesto.fabrica?.compartilhada !== true || fabricaCompartilhada(manifesto))
124
+ return null;
125
+ return (0, locale_1.msg)().operacao.restante.fabrica.pedida;
102
126
  }
@@ -46,6 +46,7 @@ const node_crypto_1 = require("node:crypto");
46
46
  const master_batch_1 = require("./master-batch");
47
47
  const master_1 = require("./master");
48
48
  const estado_thread_1 = require("./estado-thread");
49
+ const procedencia_1 = require("./procedencia");
49
50
  const hitl_1 = require("./hitl");
50
51
  const pulse_delivery_1 = require("./pulse-delivery");
51
52
  const util_1 = require("./util");
@@ -125,7 +126,11 @@ function enviarDigest(opcoes) {
125
126
  if (job.concluidoEm)
126
127
  return { code: 0, detalhe: 'semana já confirmada', enviadas, semana };
127
128
  salvar(file, job);
128
- const config = opcoes.transporte ?? (!opcoes.enviar ? (0, util_1.lerJson)(path.join(raiz, '.orkastery/monitor/master-host.json')) : undefined);
129
+ // RM-047 (P2): o executavel do transporte so sai do arquivo local, nunca de um versionado no git.
130
+ const hostLocal = path.join(raiz, '.orkastery/monitor/master-host.json');
131
+ if (!opcoes.transporte && !opcoes.enviar)
132
+ (0, procedencia_1.exigirHostLocal)(raiz, hostLocal);
133
+ const config = opcoes.transporte ?? (!opcoes.enviar ? (0, util_1.lerJson)(hostLocal) : undefined);
129
134
  for (const [indice, p] of job.paginas.entries()) {
130
135
  if (job.recibos.some(r => r.pagina === indice && r.sha256 === hash(p)))
131
136
  continue;
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ESPERA_DA_TRAVA_MS = exports.PRAZO_DO_DIALOGO_MS = exports.PORQUE_MAXIMO = exports.PORQUE_MINIMO = exports.NOTAS_DO_FORMULARIO = exports.ERRO_SEM_DIALOGO = void 0;
4
+ exports.esquemaDaNota = esquemaDaNota;
5
+ exports.apresentarPedidoDaNota = apresentarPedidoDaNota;
6
+ exports.lerRespostaDaNota = lerRespostaDaNota;
7
+ exports.criarIngressoDaNota = criarIngressoDaNota;
8
+ /**
9
+ * RM-059 (fatia F8, T8.1; DD2 do plano dos mods): a nota do MASTER pelo dialogo nativo do host.
10
+ *
11
+ * O caminho com prova da nota era o Telegram (`ork master pedir` + o codigo assinado pelo ingresso) e o terminal do
12
+ * dono. A sessao do Claude Code nao tinha como pedir a nota com recibo: o `--por` de processo de host e recusado por
13
+ * `exigirNotaSemHost`. Aqui a nota entra pelo MESMO ingresso local que o gate ja aceita: o servidor MCP pede ao
14
+ * cliente um formulario (elicitation), o dono escolhe de 0 a 5 e escreve o porque, e o nucleo grava o MASTER com
15
+ * `avaliadoPor` `dono (dialogo nativo)` (D12: uma identidade que o `autoriaHumana` de qualquer versao aceita), o host
16
+ * no `canal` e o recibo assinado em `hitl-ingress-local/`.
17
+ *
18
+ * Quem chama passa so o `threadId`. A nota e o porque nunca chegam por argumento de ferramenta: chegam pela resposta
19
+ * do formulario, que o callback do servidor recebe da propria conexao. O mod Ritual do MASTER (`ork-ritual`) so
20
+ * aperta o botao que chama a ferramenta.
21
+ *
22
+ * Ordem das conferencias (D4 da thread ork-rm059ritual): nota humana ja registrada devolve `repetida` sem dialogo;
23
+ * sem entrega, a recusa do nucleo; sem formulario no cliente, `master.nota.sem-dialogo` ANTES de qualquer escrita
24
+ * (nem o pedido de nota nasce); so entao o pedido de nota do `ork master pedir` (o mesmo codigo do Telegram) e o
25
+ * dialogo. A gravacao roda sob a trava da thread, como a resposta do Telegram (`responderNota`) e o aceite por omissao:
26
+ * a nota humana que chegou no meio, por qualquer caminho, vence, e a omissao nunca troca a nota gravada aqui. A trava
27
+ * ocupada e esperada por ate um minuto (D17), e a soltura do que a thread segurava roda depois dela.
28
+ *
29
+ * LIMITE DITO: o recibo prova o caminho (esta conexao MCP, esta solicitacao, esta nota), nao a pessoa. A chave local e
30
+ * legivel pelo mesmo usuario do sistema, entao quem ja roda como ele forja o recibo; e a mesma fronteira do gate pelo
31
+ * ingresso local (`core/src/hitl-local.ts`).
32
+ */
33
+ const node_crypto_1 = require("node:crypto");
34
+ const thread_1 = require("./thread");
35
+ const hitl_gates_1 = require("./hitl-gates");
36
+ const thread_close_1 = require("./thread-close");
37
+ const claims_1 = require("./claims");
38
+ const horario_1 = require("./horario");
39
+ const master_1 = require("./master");
40
+ const fechamento_1 = require("./fechamento");
41
+ const master_nota_1 = require("./master-nota");
42
+ const pulse_resposta_1 = require("./pulse-resposta");
43
+ const hitl_local_receipt_1 = require("./hitl-local-receipt");
44
+ exports.ERRO_SEM_DIALOGO = 'master.nota.sem-dialogo';
45
+ /** As notas que o formulario oferece, da melhor para a pior. */
46
+ exports.NOTAS_DO_FORMULARIO = ['5', '4', '3', '2', '1', '0'];
47
+ exports.PORQUE_MINIMO = 3;
48
+ exports.PORQUE_MAXIMO = 1000;
49
+ /** O mesmo teto do dialogo do gate pelo ingresso local. */
50
+ exports.PRAZO_DO_DIALOGO_MS = 300000;
51
+ /**
52
+ * D17: com a nota respondida, a gravacao espera ate isto pela trava da thread (um aceite por omissao, uma resposta pelo
53
+ * Telegram ou um despacho a seguram por pouco), para o porque que o dono escreveu nao se perder num instante ocupado.
54
+ */
55
+ exports.ESPERA_DA_TRAVA_MS = 60000;
56
+ const PASSO_DA_TRAVA_MS = 250;
57
+ const ID = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/;
58
+ const sha = (v) => (0, node_crypto_1.createHash)('sha256').update(v).digest('hex');
59
+ function esquemaDaNota() {
60
+ const rotulo = { '5': '5 · a melhor', '0': '0 · a pior' };
61
+ return {
62
+ type: 'object',
63
+ properties: {
64
+ nota: { type: 'string', title: 'Nota de 0 a 5', oneOf: exports.NOTAS_DO_FORMULARIO.map((n) => ({ const: n, title: rotulo[n] ?? n })) },
65
+ porque: { type: 'string', title: 'Por quê (vira lição do próximo GOAL)', minLength: exports.PORQUE_MINIMO, maxLength: exports.PORQUE_MAXIMO },
66
+ },
67
+ required: ['nota', 'porque'],
68
+ };
69
+ }
70
+ /** A mensagem do formulario: a entrega, o que vale agora, o indice derivado do ledger e as claims por estado. */
71
+ function apresentarPedidoDaNota(raiz, threadId) {
72
+ const t = (0, thread_1.lerThread)(raiz, threadId);
73
+ const entrega = (0, thread_close_1.provaDeEntrega)(raiz, threadId);
74
+ const indice = (0, master_1.indiceDaThread)(raiz, threadId);
75
+ const ultimas = new Map();
76
+ for (const c of (0, claims_1.lerClaims)(raiz, threadId))
77
+ ultimas.set(c.id, c.estado);
78
+ const contar = (estado) => [...ultimas.values()].filter((e) => e === estado).length;
79
+ const parcelas = indice.parcelas.length
80
+ ? indice.parcelas.map((p) => `${p.evento} x${p.ocorrencias}`).join(', ')
81
+ : 'sem desconto';
82
+ const agora = t.score?.regime === 'omissao' ? `aceita por omissão com ${t.score.valor}/5`
83
+ : t.score_proposto ? `proposta de ${t.score_proposto.valor}/5 esperando você` : 'sem nota';
84
+ const quando = entrega?.tipo === 'ship'
85
+ ? `Entregue em ${(0, horario_1.formatarDataHoraRotulada)(entrega.ts)}${entrega.mergeSha ? ` (merge ${entrega.mergeSha.slice(0, 8)})` : ''}.`
86
+ : entrega ? `Entregue pelo artefato ${entrega.arquivo}.` : 'Sem entrega registrada.';
87
+ return {
88
+ thread: threadId,
89
+ mensagem: [
90
+ `Nota do MASTER da ${t.id} (${t.nome.slice(0, 80)})`,
91
+ `${quando} Agora: ${agora}.`,
92
+ `Índice derivado do ledger: ${indice.valor} de ${indice.base} (${parcelas}).`,
93
+ `Claims: ${contar('verificado')} verificadas, ${contar('reprovado')} reprovadas, ${contar('pendente')} pendentes.`,
94
+ 'Dê de 0 a 5 e diga por quê. A sua nota sobrescreve a aceita por omissão.',
95
+ ].join('\n'),
96
+ esquema: esquemaDaNota(),
97
+ };
98
+ }
99
+ /** A resposta aceita, conferida campo a campo: so `nota` e `porque`, nos limites do formulario. */
100
+ function lerRespostaDaNota(content) {
101
+ const c = content;
102
+ if (!c || typeof c !== 'object' || Array.isArray(c) || Object.keys(c).sort().join(',') !== 'nota,porque' ||
103
+ typeof c.nota !== 'string' || !exports.NOTAS_DO_FORMULARIO.includes(c.nota) ||
104
+ typeof c.porque !== 'string' || c.porque.trim().length < exports.PORQUE_MINIMO || c.porque.length > exports.PORQUE_MAXIMO) {
105
+ throw new Error('master.nota.resposta-invalida: a resposta do formulário não é uma nota de 0 a 5 com o porquê');
106
+ }
107
+ return { score: Number(c.nota), justificativa: c.porque.trim() };
108
+ }
109
+ /**
110
+ * O ingresso da nota numa conexao MCP. O `elicitar` e o `temFormulario` vem do servidor, nunca dos argumentos da
111
+ * ferramenta; o `connectionId` e o mesmo do ingresso local do gate nesta conexao.
112
+ */
113
+ function criarIngressoDaNota(raiz, origem, elicitar, temFormulario, opcoes = {}) {
114
+ if (!['claude-code', 'codex'].includes(origem.host) || !ID.test(origem.connectionId))
115
+ throw new Error('master.nota.origem-invalida');
116
+ const conexao = { ...origem }, ativos = new Map();
117
+ let fechada = false;
118
+ const pendente = (threadId) => ({ ok: false, threadId, estado: 'pendente', repetida: false });
119
+ const esperaDaTrava = opcoes.esperaDaTravaMs ?? exports.ESPERA_DA_TRAVA_MS;
120
+ /** A trava da thread, esperada em passos curtos: ocupada alem da espera, a recusa diz que a nota nao foi gravada. */
121
+ const comTrava = async (threadId, executar) => {
122
+ const ate = Date.now() + esperaDaTrava;
123
+ for (;;) {
124
+ try {
125
+ return (0, hitl_gates_1.comLockHitl)(raiz, threadId, executar);
126
+ }
127
+ catch (e) {
128
+ if (!/^HITL ocupado/.test(e.message))
129
+ throw e;
130
+ if (Date.now() >= ate) {
131
+ throw new Error(`master.nota.trava-ocupada: a thread ${threadId} seguiu ocupada por ${Math.round(esperaDaTrava / 1000)} s; ` +
132
+ 'a nota não foi gravada, dê de novo');
133
+ }
134
+ }
135
+ await new Promise((r) => setTimeout(r, PASSO_DA_TRAVA_MS));
136
+ }
137
+ };
138
+ return {
139
+ fechar() { fechada = true; for (const c of ativos.values())
140
+ c.abort(); },
141
+ async solicitar(threadId, signal) {
142
+ if (fechada)
143
+ throw new Error('master.nota.conexao-fechada');
144
+ if (!ID.test(threadId))
145
+ throw new Error('master.nota.identificador-invalido');
146
+ if (signal?.aborted)
147
+ return pendente(threadId);
148
+ const t = (0, thread_1.lerThread)(raiz, threadId);
149
+ if ((0, master_1.notaHumanaRegistrada)(t))
150
+ return { ok: true, threadId, estado: 'registrada', repetida: true, score: t.score.valor };
151
+ (0, thread_close_1.exigirEntrega)(raiz, threadId);
152
+ if (!temFormulario()) {
153
+ throw new Error(`${exports.ERRO_SEM_DIALOGO}: este cliente MCP não abre formulário; peça a nota pelo Telegram com ork master pedir ${threadId}`);
154
+ }
155
+ if (ativos.has(threadId))
156
+ throw new Error('master.nota.em-curso: o diálogo da nota desta thread já está aberto nesta sessão');
157
+ const controller = new AbortController();
158
+ ativos.set(threadId, controller);
159
+ const abortar = () => controller.abort();
160
+ signal?.addEventListener('abort', abortar, { once: true });
161
+ const timer = setTimeout(abortar, exports.PRAZO_DO_DIALOGO_MS);
162
+ try {
163
+ const pedido = (0, master_nota_1.pedirNota)(raiz, threadId, { codigosEmUso: (0, pulse_resposta_1.codigosEmUso)(raiz) });
164
+ const apresentacao = apresentarPedidoDaNota(raiz, threadId);
165
+ const requestId = (0, node_crypto_1.randomUUID)();
166
+ const cancelar = new Promise((resolve) => controller.signal.addEventListener('abort', () => resolve({ action: 'cancel' }), { once: true }));
167
+ const resposta = await Promise.race([elicitar(apresentacao, controller.signal), cancelar]);
168
+ if (fechada || controller.signal.aborted || resposta?.action !== 'accept')
169
+ return pendente(threadId);
170
+ const nota = lerRespostaDaNota(resposta.content);
171
+ const recebidoEm = new Date().toISOString();
172
+ const gravada = await comTrava(threadId, () => {
173
+ const atual = (0, thread_1.lerThread)(raiz, threadId);
174
+ if ((0, master_1.notaHumanaRegistrada)(atual))
175
+ return { ok: true, threadId, estado: 'registrada', repetida: true, score: atual.score.valor };
176
+ const recibo = (0, hitl_local_receipt_1.gravarEvidenciaLocalNota)(raiz, { thread: threadId, pedidoId: pedido.pedidoId, host: conexao.host,
177
+ connectionId: conexao.connectionId, requestId, recebidoEm, score: nota.score, justificativaSha256: sha(nota.justificativa) });
178
+ (0, master_1.gravarMaster)(raiz, threadId, {
179
+ score: nota.score, justificativa: nota.justificativa, por: master_1.AUTOR_DA_NOTA_NATIVA, refazer: !!atual.score,
180
+ prova: {
181
+ origem: 'mcp-local', canal: conexao.host, contratoResposta: hitl_local_receipt_1.CONTRATO_RECIBO_DA_NOTA, conexao: conexao.connectionId,
182
+ solicitacao: requestId, recebidoEm, recibo: recibo.recibo, evidencia: recibo.arquivo, evidenciaSha256: recibo.sha256,
183
+ notaPedida: { contrato: master_nota_1.CONTRATO_PEDIDO_DE_NOTA, pedidoId: pedido.pedidoId, codigo: pedido.codigo },
184
+ },
185
+ });
186
+ return { ok: true, threadId, estado: 'registrada', repetida: false, score: nota.score };
187
+ });
188
+ // D17: a thread fechada solta o que segurava depois da trava, como no `registrarMaster`.
189
+ if (!gravada.repetida)
190
+ (0, fechamento_1.liberarAoFechar)(raiz, threadId);
191
+ return gravada;
192
+ }
193
+ finally {
194
+ clearTimeout(timer);
195
+ signal?.removeEventListener('abort', abortar);
196
+ ativos.delete(threadId);
197
+ }
198
+ },
199
+ };
200
+ }
@@ -68,8 +68,16 @@ exports.mensagemJaUsadaEmNota = mensagemJaUsadaEmNota;
68
68
  *
69
69
  * LIMITE DITO: o canal do processo e declarado pelo ambiente (`canalDoProcesso`). Ele serve para
70
70
  * RECUSAR, nunca para autorizar, e um agente que apague as variaveis do proprio host de proposito
71
- * passa como terminal. Essa e a mesma fronteira do `humano-no-cli` do SHIP; fecha-la de vez exige o
72
- * dialogo nativo do host para a nota, que fica fora desta entrega.
71
+ * passa como terminal. Essa e a mesma fronteira do `humano-no-cli` do SHIP.
72
+ *
73
+ * RM-059 (fatia F8, T8.1): a sessao de host ganhou o caminho com recibo que faltava, o dialogo
74
+ * nativo (`ork_request_master_note`, em `master-nota-local.ts`): so o `threadId` entra pela
75
+ * ferramenta, a nota e o porque vem do formulario do host, e o MASTER grava `dono (dialogo nativo)`
76
+ * com o host no canal e o recibo assinado do ingresso local; essa identidade nao se digita no `--por`.
77
+ * O que fica: o `--por` do terminal continua sem prova, a recusa pelo ambiente continua sendo so
78
+ * recusa, e um `ork` anterior a esta versao aceita aquela identidade no `--por` como qualquer nome.
79
+ * O recibo local prova o caminho, nao a pessoa: quem ja
80
+ * roda como o mesmo usuario do sistema le a chave local e forja o recibo.
73
81
  */
74
82
  const fs = __importStar(require("node:fs"));
75
83
  const path = __importStar(require("node:path"));
@@ -81,6 +89,7 @@ const thread_close_1 = require("./thread-close");
81
89
  const conducao_1 = require("./conducao");
82
90
  const pulse_consentimento_1 = require("./pulse-consentimento");
83
91
  const monitor_lock_1 = require("./monitor-lock");
92
+ const locale_1 = require("./locale");
84
93
  exports.CONTRATO_PEDIDO_DE_NOTA = 'ork.master-nota/v1';
85
94
  exports.ERRO_PROVA_DE_CANAL = 'master.prova-de-canal';
86
95
  const sha = (s) => (0, node_crypto_1.createHash)('sha256').update(s).digest('hex');
@@ -101,7 +110,7 @@ function marcaDeHost(ambiente = process.env) {
101
110
  // thread e conduzida do terminal, e o Claude Code e o Codex marcam os proprios processos. Qualquer
102
111
  // marca de host ou de despacho conta, mesmo com o canal declarado como terminal.
103
112
  return canal !== 'cli' ? canal
104
- : ambiente.ORK_DISPATCH_ID ? 'sessão despachada (ORK_DISPATCH_ID)'
113
+ : ambiente.ORK_DISPATCH_ID ? (0, locale_1.msg)().master.marcaDespachada
105
114
  : ambiente.CLAUDECODE === '1' ? 'claude-code (CLAUDECODE)'
106
115
  : ambiente.CODEX_SANDBOX || ambiente.CODEX_SANDBOX_NETWORK_DISABLED ? 'codex (CODEX_SANDBOX)'
107
116
  : (ambiente.HERMES_HOME ?? '').trim() ? 'hermes (HERMES_HOME)' : undefined;
@@ -177,11 +186,8 @@ function pedidoDeNotaDoCodigo(raiz, codigo, estadoDir) {
177
186
  function textoDoPedidoDeNota(raiz, p, canal) {
178
187
  const t = (0, thread_1.lerThread)(raiz, p.thread);
179
188
  const tg = canal === 'telegram';
180
- return [
181
- `${tg ? '🧾 ' : ''}Nota da entrega ${p.thread} (${t.nome.slice(0, 80)})`,
182
- `${tg ? '• ' : '- '}Sem nota, vale a aceita por omissão, com o índice derivado do ledger ao lado.`,
183
- `${tg ? '↩️ ' : ''}Responda: ${p.codigo} <0 a 5> <porquê>, por exemplo: ${p.codigo} 4 entregou o que pedi.`,
184
- ].join('\n');
189
+ const m = (0, locale_1.msg)().master;
190
+ return [m.notaTitulo(tg, p.thread, t.nome.slice(0, 80)), m.notaSemNota(tg), m.notaResponda(tg, p.codigo)].join('\n');
185
191
  }
186
192
  /** "4 entregou o que pedi" vira nota e justificativa; o resto e devolvido como pergunta. */
187
193
  function lerNota(resto) {