@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,127 @@
1
+ // Contrato de tipos do Freio de Lote (RM-059, fatia F2). O Freio nao acrescenta noun ao `$`: este arquivo
2
+ // declara o estado dele (`PluginState['ork-freio']`) e os tipos que os modulos puros e os testes usam.
3
+ // Sem import nem referencia, como o motor exige de um contrato.
4
+
5
+ /** Uma claim ativa da thread, como o Freio a usa: o id, o arquivo e os comandos de verificacao. */
6
+ export type FreioClaim = {
7
+ id: string
8
+ arquivo: string | null
9
+ comandos: string[]
10
+ }
11
+
12
+ /** O que a carga leu do nucleo (T2.1). */
13
+ export type FreioCarga = {
14
+ /** A thread do despacho, do contexto da ponte. */
15
+ thread: string
16
+ /** O status da thread no retrato do nucleo; `fechada` deixa o Freio dormente. */
17
+ statusDaThread: string | null
18
+ /** As claims nao retiradas; `null` enquanto o nucleo nao respondeu. */
19
+ claims: FreioClaim[] | null
20
+ /** Quando as claims foram lidas, em ms desde a epoca. */
21
+ claimsEm: number
22
+ /** O maior numero de claim da thread na leitura, retiradas incluidas (falta na carga gravada antes dele). */
23
+ maiorClaim?: number
24
+ /** A uniao dos `touch_paths` das tarefas do plano; `null` sem plano ou sem nenhum. */
25
+ touchPaths: string[] | null
26
+ /** O plano ja foi lido (com ou sem `touch_paths`). */
27
+ planoLido: boolean
28
+ /** Quando o plano foi lido, em ms desde a epoca. */
29
+ planoEm: number
30
+ /** O que falhou na ultima carga, para a linha de status e o teste. */
31
+ erros: string[]
32
+ }
33
+
34
+ /** A foto do `git status` da worktree: o HEAD e a assinatura de cada caminho sujo. */
35
+ export type FreioFoto = {
36
+ head: string | null
37
+ /** Caminho relativo a raiz da sessao para `XY|tamanho|mtimeMs` (ou `XY|ausente`). */
38
+ caminhos: Record<string, string>
39
+ }
40
+
41
+ /** Uma claim afetada pelo lote, na fila da conferencia (T2.2). */
42
+ export type FreioPedido = {
43
+ id: string
44
+ /** 3 pelo `arquivo`, 2 pelo caminho citado no comando, 1 pelo nome-base citado (D5). */
45
+ forca: number
46
+ /** Os caminhos tocados que a afetaram. */
47
+ caminhos: string[]
48
+ }
49
+
50
+ /** O que o Freio vigia entre os lotes. */
51
+ export type FreioVigia = {
52
+ thread: string
53
+ /** A ultima foto do `git status`; `null` antes da primeira. */
54
+ foto: FreioFoto | null
55
+ /** O numero do lote, que marca quando cada caminho foi tocado. */
56
+ seq: number
57
+ /** O ultimo lote que tocou cada caminho. */
58
+ toques: Record<string, number>
59
+ /** As claims afetadas que esperam conferencia. */
60
+ fila: FreioPedido[]
61
+ /** Os caminhos fora dos `touch_paths` ja avisados nesta sessao. */
62
+ avisadosFora: string[]
63
+ // Os campos da conferencia (T2.3) faltam na vigia gravada antes deles; `comConferencia` os preenche.
64
+ /** A rodada em curso no nucleo, ou `null`. */
65
+ rodada?: FreioRodada | null
66
+ /** O que o lote seguinte devolve ao modelo. */
67
+ entrega?: FreioEntrega
68
+ /** As claims cuja ultima conferencia reprovou. */
69
+ emRisco?: string[]
70
+ /** Ate quando o Freio nao pede conferencia (depois de uma indisponivel), em ms desde a epoca. */
71
+ pausaAte?: number
72
+ /** Por que a ultima conferencia ficou indisponivel, ou `null`. */
73
+ indisponivel?: string | null
74
+ /** O modelo ja foi avisado da conferencia indisponivel nesta sessao. */
75
+ avisouIndisponivel?: boolean
76
+ /** Caminhos fora dos `touch_paths` que o laco principal ainda nao recebeu (lote de subagente nao recebe aviso). */
77
+ foraPendentes?: string[]
78
+ /** As claims cuja falha o modelo ja recebeu: so elas voltam como recuperadas quando passam. */
79
+ avisadas?: string[]
80
+ }
81
+
82
+ /** Uma rodada de conferencia: as claims, os caminhos que afetaram cada uma e o lote em que ela comecou (T2.3). */
83
+ export type FreioRodada = {
84
+ ids: string[]
85
+ caminhos: Record<string, string[]>
86
+ /** A forca de cada claim, para ela voltar a fila no mesmo lugar (recusa por claim, conducao alheia). */
87
+ forcas?: Record<string, number>
88
+ /** O numero do lote no inicio; toque mais novo deixa o resultado da claim velho (D6). */
89
+ inicio: number
90
+ }
91
+
92
+ /** Uma claim que a conferencia reprovou (`claims.failed`), como volta ao modelo. */
93
+ export type FreioFalha = {
94
+ id: string
95
+ alegacao: string
96
+ arquivo: string | null
97
+ comando: string
98
+ codigo: number | null
99
+ /** O fim da saida, ja redigido pelo nucleo. */
100
+ fim: string
101
+ }
102
+
103
+ /** Uma claim cuja conferencia terminou sem veredito (prazo, comando que nao rodou). */
104
+ export type FreioSemVeredito = {
105
+ id: string
106
+ motivo: string
107
+ }
108
+
109
+ /** O que o lote seguinte devolve ao modelo. */
110
+ export type FreioEntrega = {
111
+ falhas: FreioFalha[]
112
+ semVeredito: FreioSemVeredito[]
113
+ recuperadas: string[]
114
+ /** O motivo da conferencia indisponivel, so na primeira vez da sessao. */
115
+ indisponivel: string | null
116
+ }
117
+
118
+ declare module 'claude-code' {
119
+ interface PluginState {
120
+ 'ork-freio': {
121
+ /** O que a carga leu do nucleo. */
122
+ carga: FreioCarga
123
+ /** O que o Freio vigia entre os lotes. */
124
+ vigia: FreioVigia
125
+ }
126
+ }
127
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "ork-mensageiro",
3
+ "version": "0.1.0",
4
+ "description": "Mensageiro de Sessões do Orkastery no Claude Code: leva a resposta que o dono deu pelo diálogo nativo à sessão de fase claude-bg que parou esperando por ele, como mensagem entre sessões, e na sessão de fase só deixa chegar ao modelo a mensagem que o núcleo confirmou como aquela resposta. Nunca responde nem aprova pelo dono.",
5
+ "author": {
6
+ "name": "Orkastery contributors",
7
+ "url": "https://github.com/orkastery"
8
+ },
9
+ "homepage": "https://orkastery.com/",
10
+ "repository": "https://github.com/orkastery/orkastery",
11
+ "license": "MIT",
12
+ "types": "./types/index.d.ts",
13
+ "dependencies": ["ork-ponte"]
14
+ }
@@ -0,0 +1,215 @@
1
+ // O lado do dono do Mensageiro de Sessoes (RM-059, fatia F9, T9.2), em funcoes puras. A sessao do dono que recebeu a
2
+ // resposta pelo dialogo nativo tem a mensagem na caixa de saida do servidor MCP dela (`ork_session_outbox`), so na
3
+ // memoria; o Mensageiro a leva a sessao de fase por `$.session.send`, sem mexer no texto, e anota o envio no nucleo.
4
+ // O que segue incerto noutra sessao do dono sai do retrato da ponte (secao `hitl`). Nada daqui guarda o texto da
5
+ // resposta no estado (D12 da thread ork-rm059mensag). So importa tipos.
6
+ import type { MensageiroDono, MensageiroEntrega, MensageiroEstadoDaEntrega, MensageiroIncerta } from '../types'
7
+
8
+ export const SERVIDOR = 'orkastery'
9
+ /** A ferramenta da caixa de saida, so no servidor do dono do Claude Code (T9.1). */
10
+ export const FERRAMENTA_DA_CAIXA = 'ork_session_outbox'
11
+ /** O contrato da entrega no nucleo (`core/src/entrega-por-mod.ts`), conferido pelo teste do nucleo. */
12
+ export const CONTRATO_DA_ENTREGA = 'ork.session-delivery/v1'
13
+ /** D10: o envio que nao entrou na fila volta depois do recuo; o que entrou e nao foi reservado, depois da espera. */
14
+ export const RECUO_DO_ENVIO_MS = 30000
15
+ export const ESPERA_DA_RESERVA_MS = 60000
16
+ export const MAXIMO_DE_ENVIOS = 10
17
+ /** D21: a reserva sem recibo por este tempo deixa de ser "confirmando" e pede o dono. */
18
+ export const ESPERA_DO_RECIBO_MS = 5 * 60000
19
+ /** A faixa diz "entregue" por este tempo; o painel guarda o que terminou por este outro. */
20
+ export const FAIXA_DA_ENTREGA_MS = 10 * 60000
21
+ export const GUARDA_DO_TERMINADO_MS = 30 * 60000
22
+ export const MAXIMO_DE_ENTREGAS = 50
23
+ export const DONO_VAZIO: MensageiroDono = { entregas: [], incertas: [], lidoEm: null, erro: null }
24
+
25
+ const UUID = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/
26
+ const ID_DE_THREAD = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/
27
+ const VIVOS: readonly MensageiroEstadoDaEntrega[] = ['na-fila', 'a-caminho', 'reservada', 'nao-chegou']
28
+
29
+ /** Uma entrega da caixa de saida como o nucleo a lista, com o ultimo envio em ms. */
30
+ export type EntradaDaCaixa = {
31
+ thread: string; pedidoId: string; envioId: string; sessionId: string
32
+ /** A mensagem inteira, com o cabecalho do nucleo: vai ao `$.session.send` como esta e nunca ao estado. */
33
+ mensagem: string
34
+ tentativas: number
35
+ ultimoEnvio: { em: number; entregue: boolean; motivo: string | null } | null
36
+ reservada: boolean
37
+ /** Quando a entrega entrou na caixa (ms desde a epoca); conta o sem-recibo quando o envio nao foi anotado. */
38
+ criadaEm: number | null
39
+ }
40
+
41
+ const objeto = (v: unknown): v is Record<string, any> => !!v && typeof v === 'object' && !Array.isArray(v)
42
+ const uuid = (v: unknown): v is string => typeof v === 'string' && UUID.test(v)
43
+
44
+ /** Uma linha so, sem caractere de controle e com teto: o que vem do nucleo ou de um erro nunca quebra a tela. */
45
+ export function umaLinha(v: unknown, teto = 200): string {
46
+ const s = typeof v === 'string' ? v : v instanceof Error ? v.message : String(v)
47
+ return Array.from(s.replace(/\p{Cc}/gu, ' ').replace(/\s+/g, ' ').trim()).slice(0, teto).join('')
48
+ }
49
+
50
+ /** O JSON que uma ferramenta do nucleo devolveu; a recusa vira erro com o motivo dela. */
51
+ export function jsonDoMcp(r: unknown, ferramenta: string): unknown {
52
+ const o = objeto(r) ? r : {}
53
+ const conteudo = Array.isArray(o.content) ? o.content : []
54
+ const texto = conteudo.filter(c => objeto(c) && c.type === 'text' && typeof c.text === 'string').map(c => c.text).join('')
55
+ let dados: unknown
56
+ try { dados = JSON.parse(texto) } catch { throw new Error(`${ferramenta} respondeu fora do JSON`) }
57
+ if (o.isError === true) throw new Error(`${ferramenta} recusou: ${umaLinha(objeto(dados) && typeof dados.erro === 'string' ? dados.erro : texto)}`)
58
+ return dados
59
+ }
60
+
61
+ function lerEntrada(e: unknown): EntradaDaCaixa[] {
62
+ if (!objeto(e) || typeof e.thread !== 'string' || !ID_DE_THREAD.test(e.thread) || !uuid(e.pedidoId) || !uuid(e.envioId) ||
63
+ !uuid(e.sessionId) || typeof e.mensagem !== 'string' ||
64
+ !e.mensagem.startsWith(`[${CONTRATO_DA_ENTREGA} pedido=${e.pedidoId} entrega=${e.envioId}] `)) return []
65
+ const u = objeto(e.ultimoEnvio) ? e.ultimoEnvio : null
66
+ const em = u && typeof u.em === 'string' ? Date.parse(u.em) : NaN
67
+ const criadaEm = typeof e.criadaEm === 'string' ? Date.parse(e.criadaEm) : NaN
68
+ return [{ thread: e.thread, pedidoId: e.pedidoId, envioId: e.envioId, sessionId: e.sessionId, mensagem: e.mensagem,
69
+ tentativas: Number.isSafeInteger(e.tentativas) && e.tentativas > 0 ? e.tentativas : 0,
70
+ ultimoEnvio: u && Number.isFinite(em) ? { em, entregue: u.entregue === true, motivo: typeof u.motivo === 'string' ? umaLinha(u.motivo) : null } : null,
71
+ reservada: e.reservada === true, criadaEm: Number.isFinite(criadaEm) ? criadaEm : null }]
72
+ }
73
+
74
+ /** A caixa de saida do `listar`; o que nao bate com o contrato fica de fora, e a resposta fora do contrato e erro. */
75
+ export function lerCaixa(dados: unknown): EntradaDaCaixa[] {
76
+ if (!objeto(dados) || dados.contrato !== CONTRATO_DA_ENTREGA || !Array.isArray(dados.entregas)) {
77
+ throw new Error('a caixa de saída respondeu fora do contrato ork.session-delivery/v1')
78
+ }
79
+ return dados.entregas.flatMap(lerEntrada)
80
+ }
81
+
82
+ /** A entrega que o `enviada` devolveu, com a reserva que ela tinha na lista (o nucleo so a le no `listar`). */
83
+ export function entradaAnotada(dados: unknown, reservada: boolean): EntradaDaCaixa | null {
84
+ const lida = objeto(dados) && dados.contrato === CONTRATO_DA_ENTREGA ? lerEntrada({ ...(objeto(dados.entrega) ? dados.entrega : {}), reservada }) : []
85
+ return lida[0] ?? null
86
+ }
87
+
88
+ /** D10: envia o que nunca foi, o que nao entrou na fila depois do recuo e o que entrou e ninguem reservou depois da espera. */
89
+ export function deveEnviar(e: EntradaDaCaixa, agora: number): boolean {
90
+ if (e.reservada || e.tentativas >= MAXIMO_DE_ENVIOS) return false
91
+ if (!e.ultimoEnvio) return true
92
+ return agora - e.ultimoEnvio.em >= (e.ultimoEnvio.entregue ? ESPERA_DA_RESERVA_MS : RECUO_DO_ENVIO_MS)
93
+ }
94
+
95
+ /** O argumento do `$.session.send`: a sessao do pedido e a mensagem do nucleo, sem mexer em nada. */
96
+ export function argsDoEnvio(e: EntradaDaCaixa): { to: { sessionId: string }; text: string } {
97
+ return { to: { sessionId: e.sessionId }, text: e.mensagem }
98
+ }
99
+
100
+ /** O resultado do `$.session.send` como o nucleo o anota. */
101
+ export function resultadoDoEnvio(r: unknown): { entregue: boolean; motivo: string | null } {
102
+ if (objeto(r) && r.isDelivered === true) return { entregue: true, motivo: null }
103
+ return { entregue: false, motivo: umaLinha(objeto(r) && typeof r.reason === 'string' && r.reason ? r.reason : 'a sessão não recebeu a mensagem') }
104
+ }
105
+
106
+ export function argsDaAnotacao(e: EntradaDaCaixa, r: { entregue: boolean; motivo: string | null }): Record<string, unknown> {
107
+ return { operacao: 'enviada', threadId: e.thread, envioId: e.envioId, entregue: r.entregue, ...(r.motivo ? { motivo: r.motivo } : {}) }
108
+ }
109
+
110
+ /** A secao `hitl` do retrato, quando ela veio lida (disponivel ou vazia); `null` quando nao da para concluir nada. */
111
+ function secaoHitl(retrato: unknown): Record<string, any>[] | null {
112
+ const secoes = objeto(retrato) && objeto(retrato.sections) ? retrato.sections : {}
113
+ const hitl = objeto(secoes.hitl) ? secoes.hitl : null
114
+ if (!hitl || (hitl.state !== 'available' && hitl.state !== 'empty')) return null
115
+ return Array.isArray(hitl.items) ? hitl.items.filter(objeto) : []
116
+ }
117
+
118
+ const threadDoItem = (i: Record<string, any>): string | null => {
119
+ const ref = Array.isArray(i.refs) ? i.refs.find((r: unknown) => objeto(r) && r.kind === 'thread' && typeof r.id === 'string') : null
120
+ return ref && ID_DE_THREAD.test(ref.id) ? ref.id : null
121
+ }
122
+
123
+ /** Os pedidos abertos que o retrato mostra (respondido sai da secao); `null` quando a secao nao veio lida. */
124
+ export function pedidosNoRetrato(retrato: unknown): Set<string> | null {
125
+ const itens = secaoHitl(retrato)
126
+ return itens === null ? null : new Set(itens.flatMap(i => (typeof i.id === 'string' ? [i.id] : [])))
127
+ }
128
+
129
+ /** Os pedidos de sessao com a entrega incerta no retrato (`delivery.uncertain`): a entrega segue em alguma sessao do dono. */
130
+ export function incertasDoRetrato(retrato: unknown): MensageiroIncerta[] {
131
+ return (secaoHitl(retrato) ?? []).flatMap(i => {
132
+ const thread = threadDoItem(i)
133
+ return i.status === 'delivery.uncertain' && objeto(i.facts) && i.facts.target === 'session' && uuid(i.id) && thread
134
+ ? [{ thread, pedidoId: i.id }] : []
135
+ })
136
+ }
137
+
138
+ /** O estado de uma entrega que esta na caixa, agora. */
139
+ export function estadoDaEntrada(e: EntradaDaCaixa, agora: number): MensageiroEstadoDaEntrega {
140
+ if (e.reservada) {
141
+ const desde = e.ultimoEnvio?.em ?? e.criadaEm
142
+ return typeof desde === 'number' && agora - desde >= ESPERA_DO_RECIBO_MS ? 'sem-recibo' : 'reservada'
143
+ }
144
+ if (!e.ultimoEnvio) return 'na-fila'
145
+ if (e.tentativas >= MAXIMO_DE_ENVIOS) return 'desistiu'
146
+ return e.ultimoEnvio.entregue ? 'a-caminho' : 'nao-chegou'
147
+ }
148
+
149
+ function motivoDaEntrada(e: EntradaDaCaixa, estado: MensageiroEstadoDaEntrega): string | null {
150
+ if (estado === 'sem-recibo') return 'a sessão de fase reservou a entrega e não gravou o recibo em 5 min'
151
+ if (estado === 'desistiu') {
152
+ return e.ultimoEnvio?.entregue
153
+ ? `a sessão de fase não confirmou a entrega depois de ${e.tentativas} envios`
154
+ : e.ultimoEnvio?.motivo ?? `a mensagem não entrou na fila da sessão em ${e.tentativas} envios`
155
+ }
156
+ return estado === 'nao-chegou' ? e.ultimoEnvio?.motivo ?? null : null
157
+ }
158
+
159
+ /**
160
+ * As entregas desta sessao depois de uma leitura da caixa. A que saiu da caixa terminou: entregue, quando o retrato
161
+ * nao mostra mais o pedido (respondido); "saiu da caixa", quando o pedido segue aberto. Sem o retrato, nada se conclui.
162
+ */
163
+ export function atualizarEntregas(anteriores: readonly MensageiroEntrega[], caixa: readonly EntradaDaCaixa[],
164
+ noRetrato: Set<string> | null, agora: number): MensageiroEntrega[] {
165
+ const restantes = new Map(anteriores.map(e => [e.envioId, e]))
166
+ const saida: MensageiroEntrega[] = []
167
+ for (const c of caixa) {
168
+ const estado = estadoDaEntrada(c, agora)
169
+ const antes = restantes.get(c.envioId)
170
+ restantes.delete(c.envioId)
171
+ saida.push({ thread: c.thread, pedidoId: c.pedidoId, envioId: c.envioId, sessionId: c.sessionId, estado, tentativas: c.tentativas,
172
+ motivo: motivoDaEntrada(c, estado), em: antes && antes.estado === estado ? antes.em : agora })
173
+ }
174
+ for (const e of restantes.values()) {
175
+ if (!VIVOS.includes(e.estado) && e.estado !== 'desistiu' && e.estado !== 'sem-recibo') {
176
+ if (agora - e.em <= GUARDA_DO_TERMINADO_MS) saida.push(e)
177
+ continue
178
+ }
179
+ if (noRetrato === null) { saida.push(e); continue }
180
+ const aberto = noRetrato.has(e.pedidoId)
181
+ saida.push({ ...e, estado: aberto ? 'saiu-da-caixa' : 'entregue', em: agora,
182
+ motivo: aberto ? 'a caixa de saída soltou a entrega sem recibo; responda pelo claude attach' : null })
183
+ }
184
+ return saida.slice(-MAXIMO_DE_ENTREGAS)
185
+ }
186
+
187
+ /** A thread do ledger que mudou, pelos caminhos que a ponte vigia (`.orkastery/threads/<thread>/ledger.jsonl`). */
188
+ export function threadDoLedger(caminho: unknown): string | null {
189
+ if (typeof caminho !== 'string') return null
190
+ const m = /\.orkastery\/threads\/([^/]+)\/ledger\.jsonl$/.exec(caminho)
191
+ return m && ID_DE_THREAD.test(m[1]) ? m[1] : null
192
+ }
193
+
194
+ function daThread(entregas: readonly MensageiroEntrega[], um: string, varios: (n: number) => string): string {
195
+ return entregas.length === 1 ? `${um} ${entregas[0].thread}` : varios(entregas.length)
196
+ }
197
+
198
+ /**
199
+ * A linha da faixa (D7 do plano dos mods): o que nao chegou e precisa do dono vem primeiro; depois o que esta a caminho;
200
+ * depois o que acabou de ser entregue. Sem nada disso, a linha sai da faixa.
201
+ */
202
+ export function textoDaFaixa(dono: MensageiroDono, agora: number): string | undefined {
203
+ const falhas = dono.entregas.filter(e => e.estado === 'desistiu' || e.estado === 'saiu-da-caixa')
204
+ if (falhas.length) return falhas.length === 1
205
+ ? `a resposta para a ${falhas[0].thread} não chegou; responda pelo claude attach` : `${falhas.length} respostas não chegaram; abra /mensageiro`
206
+ // Sem recibo, a resposta pode ter entrado na conversa: o dono confere antes de responder de novo.
207
+ const semRecibo = dono.entregas.filter(e => e.estado === 'sem-recibo')
208
+ if (semRecibo.length) return semRecibo.length === 1
209
+ ? `a resposta para a ${semRecibo[0].thread} ficou sem recibo; confira pelo claude attach` : `${semRecibo.length} respostas sem recibo; abra /mensageiro`
210
+ const vivas = dono.entregas.filter(e => VIVOS.includes(e.estado))
211
+ if (vivas.length) return daThread(vivas, 'resposta a caminho da', n => `${n} respostas a caminho das sessões de fase`)
212
+ const entregues = dono.entregas.filter(e => e.estado === 'entregue' && agora - e.em <= FAIXA_DA_ENTREGA_MS)
213
+ if (entregues.length) return daThread(entregues, 'resposta entregue à', n => `${n} respostas entregues às sessões de fase`)
214
+ return undefined
215
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "modules": ["./register.tsx"]
3
+ }
@@ -0,0 +1,165 @@
1
+ // O painel do Mensageiro de Sessoes (RM-059, fatia F9), em funcoes puras: o estado vira linhas da tela, uma por
2
+ // elemento, e as linhas viram a arvore do painel com os elementos que a superficie resolveu (so `Box`, `Text` e
3
+ // `Button`, os mesmos no terminal e no desktop). Todo estado tem rotulo e glifo, nunca so cor (regra da Partitura).
4
+ // O texto da resposta do dono nunca aparece aqui: so a thread, o pedido e o estado da entrega. So importa tipos e
5
+ // modulos puros do Mensageiro.
6
+ import type { MensageiroDono, MensageiroEntrega, MensageiroEstadoDaEntrega, MensageiroEstadoDaRecebida, MensageiroFase, MensageiroMostrado,
7
+ MensageiroRecebida } from '../types'
8
+ import { umaLinha } from './caixa'
9
+ import { codigoDoMotivo, motivoLegivel } from './recepcao'
10
+
11
+ export type LinhaDoMensageiro = {
12
+ tipo: 'titulo' | 'secao' | 'texto' | 'dim' | 'falha' | 'feito'
13
+ chave: string
14
+ texto: string
15
+ /** O que vai ao registro do mostrado da ponte quando a linha esta na janela de rolagem do painel a vista. */
16
+ mostrado?: MensageiroMostrado
17
+ }
18
+
19
+ export const ROTULO_DO_ESTADO: Record<MensageiroEstadoDaEntrega, string> = {
20
+ 'na-fila': 'na fila do núcleo',
21
+ 'a-caminho': 'a caminho: na fila da sessão, esperando a conferência',
22
+ 'reservada': 'recebida pela sessão, confirmando',
23
+ 'sem-recibo': 'recebida pela sessão, sem recibo em 5 min: confira pelo claude attach',
24
+ 'nao-chegou': 'não entrou na fila da sessão; nova tentativa em breve',
25
+ 'desistiu': 'não chegou: responda pelo claude attach',
26
+ 'entregue': 'entregue, com o recibo da sessão',
27
+ 'saiu-da-caixa': 'saiu da caixa sem recibo: responda pelo claude attach',
28
+ }
29
+
30
+ const GLIFO: Record<MensageiroEstadoDaEntrega, string> = {
31
+ 'na-fila': '·', 'a-caminho': '●', 'reservada': '●', 'sem-recibo': '?', 'nao-chegou': '×', 'desistiu': '×', 'entregue': '✓', 'saiu-da-caixa': '?',
32
+ }
33
+
34
+ const TIPO: Record<MensageiroEstadoDaEntrega, LinhaDoMensageiro['tipo']> = {
35
+ 'na-fila': 'texto', 'a-caminho': 'texto', 'reservada': 'texto', 'sem-recibo': 'falha', 'nao-chegou': 'falha', 'desistiu': 'falha', 'entregue': 'feito', 'saiu-da-caixa': 'falha',
36
+ }
37
+
38
+ /** Quanto tempo faz, como o dono le. */
39
+ export function idade(ms: number): string {
40
+ if (!(ms >= 60000)) return 'agora'
41
+ const min = Math.floor(ms / 60000)
42
+ return min < 60 ? `há ${min} min` : `há ${Math.floor(min / 60)} h`
43
+ }
44
+
45
+ const curto = (id: string) => id.slice(0, 8)
46
+
47
+ function linhasDaEntrega(e: MensageiroEntrega, agora: number): LinhaDoMensageiro[] {
48
+ const k = (s: string) => `${e.envioId}:${s}`
49
+ const envios = e.tentativas > 1 ? ` · ${e.tentativas} envios` : ''
50
+ const texto = `${GLIFO[e.estado]} ${e.thread} · pedido ${curto(e.pedidoId)} · ${ROTULO_DO_ESTADO[e.estado]}${envios} · ${idade(agora - e.em)}`
51
+ const linhas: LinhaDoMensageiro[] = [{ tipo: TIPO[e.estado], chave: k('estado'), texto: umaLinha(texto, 300),
52
+ mostrado: { chave: `hitl:${e.pedidoId}`, thread: e.thread, texto: `${e.thread}: resposta do dono ${ROTULO_DO_ESTADO[e.estado]}` } }]
53
+ if (e.motivo) linhas.push({ tipo: 'dim', chave: k('motivo'), texto: ` ${umaLinha(e.motivo, 200)}` })
54
+ return linhas
55
+ }
56
+
57
+ /** As linhas do painel na sessao do dono. */
58
+ export function linhasDoDono(dono: MensageiroDono, agora: number): LinhaDoMensageiro[] {
59
+ const linhas: LinhaDoMensageiro[] = [
60
+ { tipo: 'titulo', chave: 'titulo', texto: 'Mensageiro de Sessões' },
61
+ { tipo: 'dim', chave: 'o-que-faz', texto: 'Leva a resposta que você deu pelo diálogo à sessão de fase que parou esperando por ela.' },
62
+ ]
63
+ if (dono.erro) linhas.push({ tipo: 'falha', chave: 'erro', texto: `× ${umaLinha(dono.erro, 200)}` })
64
+ linhas.push({ tipo: 'secao', chave: 'secao-entregas', texto: 'Respostas desta sessão' })
65
+ if (!dono.entregas.length) linhas.push({ tipo: 'dim', chave: 'sem-entregas', texto: ' nenhuma resposta a caminho agora' })
66
+ for (const e of [...dono.entregas].reverse()) linhas.push(...linhasDaEntrega(e, agora))
67
+ if (dono.incertas.length) {
68
+ // O retrato so diz que a entrega esta incerta (sem o runtime): ela pode seguir noutra sessao do dono ou noutro canal
69
+ // (um envio nativo pendente), ou ter se perdido com uma sessao que fechou. O painel nao sabe qual, e diz isso.
70
+ linhas.push({ tipo: 'secao', chave: 'secao-incertas', texto: 'Fora desta sessão' })
71
+ for (const i of dono.incertas) {
72
+ linhas.push({ tipo: 'texto', chave: `incerta:${i.pedidoId}`,
73
+ texto: `· ${i.thread} · pedido ${curto(i.pedidoId)} · entrega incerta fora desta sessão: noutra sessão do dono, noutro canal ou perdida` })
74
+ }
75
+ linhas.push({ tipo: 'dim', chave: 'incertas-limite', texto: ' sem retorno, responda pelo claude attach' })
76
+ }
77
+ linhas.push({ tipo: 'dim', chave: 'limite', texto: 'A resposta chega como mensagem de outra sessão: informa a sessão de fase, não autoriza ação que só você aprova. Para isso, claude attach.' })
78
+ if (dono.lidoEm === null) linhas.push({ tipo: 'dim', chave: 'lido', texto: 'a caixa de saída ainda não foi lida' })
79
+ else linhas.push({ tipo: 'dim', chave: 'lido', texto: `caixa de saída lida ${idade(agora - dono.lidoEm)}` })
80
+ return linhas
81
+ }
82
+
83
+ export const ROTULO_DA_RECEBIDA: Record<MensageiroEstadoDaRecebida, string> = {
84
+ 'consumida': 'consumida antes do modelo',
85
+ 'confirmando': 'entrou na conversa; gravando o recibo no núcleo',
86
+ 'entregue': 'entrou na conversa, com o recibo no núcleo',
87
+ 'sem-recibo': 'entrou na conversa, mas o recibo não foi gravado',
88
+ 'nao-entrou': 'conferida, mas não entrou na conversa',
89
+ }
90
+
91
+ const GLIFO_DA_RECEBIDA: Record<MensageiroEstadoDaRecebida, string> = {
92
+ 'consumida': '○', 'confirmando': '●', 'entregue': '✓', 'sem-recibo': '?', 'nao-entrou': '×',
93
+ }
94
+
95
+ const TIPO_DA_RECEBIDA: Record<MensageiroEstadoDaRecebida, LinhaDoMensageiro['tipo']> = {
96
+ 'consumida': 'texto', 'confirmando': 'texto', 'entregue': 'feito', 'sem-recibo': 'falha', 'nao-entrou': 'falha',
97
+ }
98
+
99
+ function linhasDaRecebida(r: MensageiroRecebida, i: number, agora: number): LinhaDoMensageiro[] {
100
+ const k = (s: string) => `recebida:${i}:${s}`
101
+ const quem = r.estado === 'consumida'
102
+ ? `mensagem de outra sessão (${umaLinha(r.origem, 80)})${r.pedidoId ? ` com a marca do pedido ${curto(r.pedidoId)}` : ''}`
103
+ : `resposta do dono ao pedido ${r.pedidoId ? curto(r.pedidoId) : '?'}`
104
+ const linhas: LinhaDoMensageiro[] = [{ tipo: TIPO_DA_RECEBIDA[r.estado], chave: k('estado'),
105
+ texto: umaLinha(`${GLIFO_DA_RECEBIDA[r.estado]} ${quem} · ${ROTULO_DA_RECEBIDA[r.estado]} · ${idade(agora - r.em)}`, 300) }]
106
+ if (r.motivo) {
107
+ const motivo = r.estado === 'consumida' ? `${motivoLegivel(r.motivo)} · ${codigoDoMotivo(r.motivo)}` : r.motivo
108
+ linhas.push({ tipo: 'dim', chave: k('motivo'), texto: ` ${umaLinha(motivo, 200)}` })
109
+ }
110
+ return linhas
111
+ }
112
+
113
+ /**
114
+ * As linhas do painel na sessao de fase: o que chegou de outras sessoes, o mais novo primeiro. Sem botao: o estado so
115
+ * muda quando algo chega, e o painel se redesenha sozinho. O texto de nenhuma mensagem aparece aqui.
116
+ */
117
+ export function linhasDaFase(fase: MensageiroFase, agora: number): LinhaDoMensageiro[] {
118
+ const linhas: LinhaDoMensageiro[] = [
119
+ { tipo: 'secao', chave: 'titulo', texto: 'Mensageiro de Sessões' },
120
+ { tipo: 'dim', chave: 'o-que-faz', texto: `Nesta sessão de fase${fase.thread ? ` da ${fase.thread}` : ''}, só entra na conversa a resposta do dono que o núcleo conferiu; o resto que chega de outra sessão é consumido.` },
121
+ ]
122
+ if (fase.erro) linhas.push({ tipo: 'falha', chave: 'erro', texto: `× ${umaLinha(fase.erro, 200)}` })
123
+ linhas.push({ tipo: 'secao', chave: 'secao-recebidas', texto: 'O que chegou de outras sessões' })
124
+ if (!fase.recebidas.length) linhas.push({ tipo: 'dim', chave: 'sem-recebidas', texto: ' nada chegou de outra sessão' })
125
+ const recebidas = fase.recebidas.map((r, i) => ({ r, i })).reverse()
126
+ for (const { r, i } of recebidas) linhas.push(...linhasDaRecebida(r, i, agora))
127
+ linhas.push({ tipo: 'dim', chave: 'limite', texto: 'A resposta do dono informa esta sessão; ação que só o dono aprova continua pedindo o dono.' })
128
+ return linhas
129
+ }
130
+
131
+ /**
132
+ * O que esta inteiro dentro da janela de rolagem do painel: so isso conta como mostrado ao dono (M5). Toda linha do
133
+ * painel trunca numa linha da tela, e a do titulo divide a linha com o botao.
134
+ */
135
+ export function mostradosVisiveis(linhas: readonly LinhaDoMensageiro[], janela: { offset: number; bodyRows: number } | undefined): MensageiroMostrado[] {
136
+ if (!janela || !(janela.bodyRows > 0)) return []
137
+ const fim = janela.offset + janela.bodyRows
138
+ return linhas.flatMap((l, i) => (l.mostrado && i >= janela.offset && i < fim ? [l.mostrado] : []))
139
+ }
140
+
141
+ export type Gestos = { atualizar?: () => void }
142
+
143
+ /** A arvore do painel com os elementos que a superficie resolveu. */
144
+ export function desenharPainel(el: { Box: any; Text: any; Button: any }, linhas: readonly LinhaDoMensageiro[], gestos: Gestos) {
145
+ const { Box, Text, Button } = el
146
+ return (
147
+ <Box flexDirection="column">
148
+ {linhas.map(l => {
149
+ if (l.tipo === 'titulo') {
150
+ return (
151
+ <Box key="titulo" flexDirection="row">
152
+ <Text key="titulo-texto" bold wrap="truncate">{l.texto}</Text>
153
+ <Button key="atualizar" label="Atualizar" onPress={() => gestos.atualizar?.()} />
154
+ </Box>
155
+ )
156
+ }
157
+ if (l.tipo === 'secao') return <Text key={l.chave} bold wrap="truncate">{l.texto}</Text>
158
+ if (l.tipo === 'falha') return <Text key={l.chave} color="error" wrap="truncate">{l.texto}</Text>
159
+ if (l.tipo === 'feito') return <Text key={l.chave} color="success" wrap="truncate">{l.texto}</Text>
160
+ if (l.tipo === 'dim') return <Text key={l.chave} dimColor wrap="truncate">{l.texto}</Text>
161
+ return <Text key={l.chave} wrap="truncate">{l.texto}</Text>
162
+ })}
163
+ </Box>
164
+ )
165
+ }