@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,42 @@
1
+ // O papel da sessao (RM-059, D4 do plano dos mods). Modulo puro: so dados entram e saem, para o
2
+ // teste do nucleo transpila-lo sem o Claude Code. Nenhum `$` passa por aqui.
3
+ import type { OrkPapel } from '../types'
4
+
5
+ /** So o servidor MCP sem thread registra esta ferramenta (core/src/mcp-server.ts). */
6
+ export const FERRAMENTA_DO_DONO = 'mcp__orkastery__ork_request_decision'
7
+ export const MANIFESTO_DO_PROJETO = 'orkastery.yaml'
8
+ const ID_DE_THREAD = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/
9
+
10
+ export type EntradaDoPapel = {
11
+ /** O `ORK_DISPATCH_ID` que o despacho passa pelo `--settings`. */
12
+ dispatchId: string | undefined
13
+ /** A raiz da sessao tem `orkastery.yaml`. */
14
+ temManifesto: boolean
15
+ /** Os nomes das ferramentas que o modelo tem agora (`$.tool.list()`). */
16
+ ferramentas: readonly string[]
17
+ }
18
+
19
+ /**
20
+ * `fase` com `ORK_DISPATCH_ID`; `dono` sem ele, com `orkastery.yaml` na raiz e o servidor `orkastery`
21
+ * sem thread conectado; `dormente` no resto, quando nenhum gancho da ponte age alem do inicio.
22
+ */
23
+ export function decidirPapel(e: EntradaDoPapel): OrkPapel {
24
+ if (typeof e.dispatchId === 'string' && e.dispatchId.trim() !== '') return 'fase'
25
+ if (e.temManifesto && e.ferramentas.includes(FERRAMENTA_DO_DONO)) return 'dono'
26
+ return 'dormente'
27
+ }
28
+
29
+ /** A thread do despacho na sessao de fase, so com id valido; `null` fora dela. */
30
+ export function threadDoDespacho(papel: OrkPapel, thread: string | undefined): string | null {
31
+ if (papel !== 'fase' || typeof thread !== 'string') return null
32
+ return ID_DE_THREAD.test(thread) ? thread : null
33
+ }
34
+
35
+ export function idDeThreadValido(thread: unknown): thread is string {
36
+ return typeof thread === 'string' && ID_DE_THREAD.test(thread)
37
+ }
38
+
39
+ /** Junta pasta e nome com uma barra so, sem depender de `node:path` (o mod nao tem Node). */
40
+ export function juntar(pasta: string, nome: string): string {
41
+ return pasta.replace(/\/+$/, '') + '/' + nome.replace(/^\/+/, '')
42
+ }
@@ -0,0 +1,331 @@
1
+ // A ponte dos mods do Orkastery (RM-059, onda 0). Acrescenta ao `$` o noun `$.ork`, que os outros mods
2
+ // do Orkastery usam para saber em que sessao estao, ler o nucleo, publicar na faixa e pedir caminhos
3
+ // vigiados, e guarda a regra de autoridade (T0.6): nenhum mod aprova gate, permissao, nota do MASTER,
4
+ // push ou tag pelo dono, nem fala como o dono. A logica fica nos modulos puros ao lado; aqui so as
5
+ // chamadas ao `$`, sempre escritas como `x.noun.metodo(...)`, como o validador exige.
6
+ import type { Register } from 'claude-code'
7
+ import type { Ork, OrkAssinatura, OrkContexto, OrkMaestro, OrkMostrado, OrkRetratoGuardado } from '../types'
8
+ import { comporFaixa, desenharFaixa, nomeDeModValido, trocarLinha } from './faixa'
9
+ import type { Achado, Autoridade } from './guarda'
10
+ import {
11
+ avaliarAmbiente, avaliarArgv, avaliarCaminho, avaliarUses, ehModDoOrkastery, lerAutoridade, MARCA_DE_MOD, NOME_DA_PONTE,
12
+ } from './guarda'
13
+ import { CHAVE_NO_STORE, conferirMostrado, lerRegistro, registrarMostrado } from './mostrado'
14
+ import {
15
+ argsDoMaestro, argvDaConsulta, cacheValido, caminhosCobertos, chaveDoPedido, conferirPedidoDeRetrato, FERRAMENTA_DO_RETRATO,
16
+ guardar, interpretarCli, interpretarMcp, raizPeloGit, SERVIDOR, subirAteOEstado, TETO_DO_CLI_MS,
17
+ } from './nucleo'
18
+ import { decidirPapel, juntar, MANIFESTO_DO_PROJETO, threadDoDespacho } from './papel'
19
+ import { caminhosPadrao, fundirCaminhos, idsDeThread, ledgerDaThread, ledgersRecentes, pastaDasThreads, registrarPedido } from './vigia'
20
+
21
+ const RETRATOS = { plugin: 'ork-ponte', key: 'retratos' } as const
22
+ const FAIXA = { plugin: 'ork-ponte', key: 'faixa' } as const
23
+ const VIGIAS = { plugin: 'ork-ponte', key: 'vigias' } as const
24
+ const TENTATIVAS_DE_ESCRITA = 5
25
+
26
+ /** O que os ganchos da ponte usam do noun, montado no `engine.create` de cada carga. */
27
+ type Interno = {
28
+ contexto: () => Promise<OrkContexto>
29
+ raizDoEstado: () => Promise<string | null>
30
+ ledgersRecentes: (raiz: string) => Promise<string[]>
31
+ }
32
+ let interno: Interno | undefined
33
+ /** O `classic.SessionStart` desta carga ja respondeu os `watchPaths`. */
34
+ let inicioRespondido = false
35
+
36
+ // A guarda (T0.6). A lista de autoridade e lida do disco uma vez por carga (D6 da thread): `null` quando
37
+ // falta ou nao tem o formato, e entao tudo que a guarda cobre fecha para os mods do Orkastery.
38
+ let autoridade: Autoridade | null | undefined
39
+ let motivoSemLista = ''
40
+ let raizDaPonte = ''
41
+ /** Mods do Orkastery sem prefixo `ork-`, conhecidos pelo `orkastery-mod.json` no `plugin.register`. */
42
+ const conhecidos = new Set<string>()
43
+
44
+ function pai(dir: string): string {
45
+ const sem = dir.replace(/\/+$/, '')
46
+ const i = sem.lastIndexOf('/')
47
+ return i <= 0 ? '/' : sem.slice(0, i)
48
+ }
49
+
50
+ /** A lista ao lado dos mods e, na falta dela, dentro da pasta da ponte (contrato para a distribuicao). */
51
+ async function obterAutoridade(ler: (caminho: string) => Promise<unknown>): Promise<Autoridade | null> {
52
+ if (autoridade !== undefined) return autoridade
53
+ const candidatos = [juntar(pai(raizDaPonte), 'autoridade.json'), juntar(raizDaPonte, 'autoridade.json')]
54
+ const motivos: string[] = []
55
+ for (const caminho of candidatos) {
56
+ try {
57
+ autoridade = lerAutoridade(String(await ler(caminho)))
58
+ return autoridade
59
+ } catch (erro) {
60
+ motivos.push(`${caminho}: ${erro instanceof Error ? erro.message : String(erro)}`)
61
+ }
62
+ }
63
+ motivoSemLista = motivos.join('; ').slice(0, 400)
64
+ autoridade = null
65
+ return null
66
+ }
67
+
68
+ const recusa = (a: Achado) => `ork-ponte: ${a.regra}: ${a.porque}. Mod do Orkastery nao age pelo dono; ` +
69
+ 'registre uma decisao autonoma pelo nucleo ou leve a pergunta ao dono pelo dialogo nativo'
70
+ const semLista = () => `ork-ponte: lista de autoridade ausente ou invalida (${motivoSemLista || 'nao lida'}); ` +
71
+ 'a guarda fecha para os mods do Orkastery'
72
+ const ehMod = (nome: unknown) => ehModDoOrkastery(nome, conhecidos)
73
+
74
+ export const register: Register = on => {
75
+ on('engine.create', async ($, e, next) => {
76
+ const built = await next(e)
77
+
78
+ const lerContexto = async (): Promise<OrkContexto> => {
79
+ const dispatchId = await built.env.get('ORK_DISPATCH_ID')
80
+ const raiz = await built.session.root()
81
+ let temManifesto = false
82
+ let ferramentas: string[] = []
83
+ if (dispatchId === undefined || dispatchId.trim() === '') {
84
+ temManifesto = await built.fs.exists(juntar(raiz, MANIFESTO_DO_PROJETO))
85
+ if (temManifesto) ferramentas = (await built.tool.list()).map(t => t.name)
86
+ }
87
+ const papel = decidirPapel({ dispatchId, temManifesto, ferramentas })
88
+ const thread = threadDoDespacho(papel, await built.env.get('ORK_DISPATCH_THREAD'))
89
+ return { papel, thread, raiz }
90
+ }
91
+
92
+ // A raiz do estado (a pasta com `orkastery.yaml` e `.orkastery/`), achada uma vez por carga.
93
+ let raizDoEstado: string | null | undefined
94
+ const acharRaizDoEstado = async (): Promise<string | null> => {
95
+ if (raizDoEstado !== undefined) return raizDoEstado
96
+ const raiz = await built.session.root()
97
+ let achada = await subirAteOEstado(raiz, caminho => built.fs.exists(caminho))
98
+ if (achada === null) {
99
+ const git = await built.process.run(['git', 'rev-parse', '--path-format=absolute', '--git-common-dir'],
100
+ { cwd: raiz, timeoutMs: 5000 }).catch(() => undefined)
101
+ const candidata = git && git.exitCode === 0 ? raizPeloGit(git.stdout) : null
102
+ if (candidata !== null && await built.fs.exists(juntar(candidata, '.orkastery'))) achada = candidata
103
+ }
104
+ raizDoEstado = achada
105
+ return achada
106
+ }
107
+
108
+ const assinar = async (caminhos: readonly string[]): Promise<OrkAssinatura> => {
109
+ const assinatura: OrkAssinatura = []
110
+ for (const caminho of caminhos) {
111
+ const s = await built.fs.stat(caminho).catch(() => undefined)
112
+ assinatura.push(s ? { caminho, tamanho: s.size, mtimeMs: s.mtimeMs } : { caminho, ausente: true })
113
+ }
114
+ return assinatura
115
+ }
116
+
117
+ const lerLedgersRecentes = async (raiz: string): Promise<string[]> => {
118
+ const entradas = await built.fs.list(pastaDasThreads(raiz)).catch(() => [])
119
+ const ledgers: Array<{ caminho: string; mtimeMs?: number }> = []
120
+ for (const id of idsDeThread(entradas).slice(0, 400)) {
121
+ const caminho = ledgerDaThread(raiz, id)
122
+ const s = await built.fs.stat(caminho).catch(() => undefined)
123
+ ledgers.push(s ? { caminho, mtimeMs: s.mtimeMs } : { caminho })
124
+ }
125
+ return ledgersRecentes(ledgers)
126
+ }
127
+
128
+ const registrar = async (m: OrkMostrado): Promise<void> => {
129
+ const agora = new Date(await built.clock.now()).toISOString()
130
+ await built.store.set(CHAVE_NO_STORE, registrarMostrado(await built.store.get(CHAVE_NO_STORE), m, agora))
131
+ }
132
+
133
+ const ork: Ork = {
134
+ papel: async () => (await lerContexto()).papel,
135
+ contexto: async () => lerContexto(),
136
+ retrato: async bruto => {
137
+ const pedido = conferirPedidoDeRetrato(bruto)
138
+ const chave = chaveDoPedido(pedido)
139
+ const guardados = await built.state.get(RETRATOS)
140
+ const anterior = guardados.value?.[chave]
141
+ if (anterior !== undefined) {
142
+ const agora = await built.clock.now()
143
+ if (cacheValido(anterior, await assinar(anterior.caminhos), agora)) {
144
+ return { fonte: 'cache', lidoEm: anterior.lidoEm, retrato: anterior.retrato as OrkMaestro }
145
+ }
146
+ }
147
+ let retrato: unknown
148
+ let fonte: 'mcp' | 'cli'
149
+ try {
150
+ retrato = interpretarMcp(await built.mcp.call(SERVIDOR, FERRAMENTA_DO_RETRATO, argsDoMaestro(pedido)))
151
+ fonte = 'mcp'
152
+ } catch {
153
+ const argv = argvDaConsulta({ consulta: 'maestro', ...pedido })
154
+ retrato = interpretarCli(argv, await built.process.run(argv, { timeoutMs: TETO_DO_CLI_MS }))
155
+ fonte = 'cli'
156
+ }
157
+ const lidoEm = await built.clock.now()
158
+ // O `stat` sai depois da leitura: uma mudanca no meio fica no cache ate o teto de 60 s.
159
+ const caminhos = caminhosCobertos(await acharRaizDoEstado(), pedido, retrato)
160
+ if (caminhos.length > 0) {
161
+ const entrada: OrkRetratoGuardado = { fonte, lidoEm, retrato, caminhos, assinatura: await assinar(caminhos) }
162
+ // Escrita recusada (por exemplo, dentro de um desenho) so deixa de guardar.
163
+ await built.state.set(RETRATOS, guardar(guardados.value, chave, entrada), { ifVersion: guardados.version })
164
+ .catch(() => undefined)
165
+ }
166
+ return { fonte, lidoEm, retrato: retrato as OrkMaestro }
167
+ },
168
+ ler: async pedido => {
169
+ const argv = argvDaConsulta(pedido)
170
+ return interpretarCli(argv, await built.process.run(argv, { timeoutMs: TETO_DO_CLI_MS }))
171
+ },
172
+ faixa: async ({ mod, texto }) => {
173
+ if (!nomeDeModValido(mod)) throw new Error('ork-ponte: nome de mod invalido')
174
+ if (texto !== undefined && typeof texto !== 'string') throw new Error('ork-ponte: texto da faixa precisa ser texto')
175
+ let publicada = false
176
+ for (let i = 0; i < TENTATIVAS_DE_ESCRITA; i++) {
177
+ const atual = await built.state.get(FAIXA)
178
+ const linhas = trocarLinha(atual.value, mod, texto, await built.clock.now())
179
+ const escrita = await built.state.set(FAIXA, linhas, { ifVersion: atual.version })
180
+ if (escrita.isSet) { publicada = linhas.some(l => l.mod === mod); break }
181
+ }
182
+ if (publicada && texto !== undefined && (await lerContexto()).papel === 'dono') {
183
+ await registrar({ mod, canal: 'faixa', texto })
184
+ }
185
+ return { publicada }
186
+ },
187
+ vigiar: async ({ mod, caminhos }) => {
188
+ for (let i = 0; i < TENTATIVAS_DE_ESCRITA; i++) {
189
+ const atual = await built.state.get(VIGIAS)
190
+ const pedidos = registrarPedido(atual.value, mod, caminhos)
191
+ const escrita = await built.state.set(VIGIAS, pedidos, { ifVersion: atual.version })
192
+ if (escrita.isSet) return { caminhos: pedidos[mod] ?? [], valeNoProximoInicio: inicioRespondido }
193
+ }
194
+ throw new Error('ork-ponte: o pedido de caminhos nao foi guardado')
195
+ },
196
+ mostrado: async pedido => registrar(conferirMostrado(pedido)),
197
+ mostrados: async () => lerRegistro(await built.store.get(CHAVE_NO_STORE)),
198
+ }
199
+
200
+ interno = { contexto: lerContexto, raizDoEstado: acharRaizDoEstado, ledgersRecentes: lerLedgersRecentes }
201
+ raizDaPonte = built.plugin.root
202
+ return { ...built, ork }
203
+ })
204
+
205
+ // So a ponte responde `watchPaths` entre os mods do Orkastery: o que veio de baixo, os padroes e os pedidos.
206
+ on('classic.SessionStart', async ($, e, next) => {
207
+ const resultado = await next(e)
208
+ if (interno === undefined) return resultado
209
+ const contexto = await interno.contexto()
210
+ if (contexto.papel === 'dormente') return resultado
211
+ const raiz = await interno.raizDoEstado()
212
+ const recentes = contexto.papel === 'dono' && raiz !== null ? await interno.ledgersRecentes(raiz) : []
213
+ const pedidos = (await $.state.get(VIGIAS)).value
214
+ inicioRespondido = true
215
+ return { ...resultado, watchPaths: fundirCaminhos(resultado.watchPaths, caminhosPadrao(contexto.papel, raiz, contexto.thread, recentes), pedidos) }
216
+ }).catch(($, e, next) => next(e))
217
+
218
+ // A faixa acima do prompt: uma linha por mod; sem linha, a faixa fica com quem esta abaixo.
219
+ on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
220
+ if (e.props.hasSurvey) return next(e)
221
+ const linhas = comporFaixa((await $.state.get(FAIXA)).value, e.props.bodyColumns, e.props.maxRows)
222
+ if (linhas.length === 0) return next(e)
223
+ const { Box, Text } = $.ui.resolve(e)
224
+ return desenharFaixa({ Box, Text }, linhas)
225
+ })
226
+
227
+ // A guarda em tempo de execucao (T0.6). Cada chamada de `$` e um evento que passa por todos os ganchos,
228
+ // de qualquer camada, menos o de quem chamou: a ponte ve a chamada do mod onde quer que ele esteja na
229
+ // cadeia. So um gancho mais externo que respondesse sem `next` a contornaria, e por isso esses eventos
230
+ // ficam reservados a ponte (o `plugin.register` abaixo recusa o mod que os registra). Cada gancho tem
231
+ // `.catch` que fecha: sem poder chamar o `$`, o `.catch` decide so com o evento e a lista ja lida.
232
+
233
+ // A lista tambem e lida no inicio, para a sessao saber logo quando a guarda esta fechada.
234
+ on('session.start', async ($, e, next) => {
235
+ const lida = await obterAutoridade(caminho => $.fs.read(caminho))
236
+ if (lida === null) $.ui.status(semLista())
237
+ return next(e)
238
+ })
239
+
240
+ on('process.run', async ($, e, next) => {
241
+ if (!ehMod(next.origin.plugin)) return next(e)
242
+ const a = await obterAutoridade(caminho => $.fs.read(caminho))
243
+ if (a === null) return { deny: semLista() }
244
+ const achado = avaliarArgv(a, e.argv, e.init?.stdin)
245
+ return achado ? { deny: recusa(achado) } : next(e)
246
+ }).catch(($, e, next) => {
247
+ if (next.called || !ehMod(next.origin.plugin)) return next(e)
248
+ if (!autoridade) return { deny: semLista() }
249
+ const achado = avaliarArgv(autoridade, e.argv, e.init?.stdin)
250
+ return achado ? { deny: recusa(achado) } : next(e)
251
+ })
252
+
253
+ on('process.spawn', async function* ($, e, next) {
254
+ if (ehMod(next.origin.plugin)) {
255
+ const a = await obterAutoridade(caminho => $.fs.read(caminho))
256
+ if (a === null) return { deny: semLista() }
257
+ const achado = avaliarArgv(a, e.argv, e.input)
258
+ if (achado) return { deny: recusa(achado) }
259
+ }
260
+ return yield* next(e)
261
+ }).catch(async function* ($, e, next) {
262
+ if (next.called || !ehMod(next.origin.plugin)) return yield* next(e)
263
+ if (!autoridade) return { deny: semLista() }
264
+ const achado = avaliarArgv(autoridade, e.argv, e.input)
265
+ if (achado) return { deny: recusa(achado) }
266
+ return yield* next(e)
267
+ })
268
+
269
+ // Mod do Orkastery que hooka evento proibido ou reservado, chama `$.prompt.submit` ou le `ORK_HITL_*`
270
+ // nem carrega. O nome `ork-ponte` fica reservado a esta pasta.
271
+ on('plugin.register', async ($, e, next) => {
272
+ if (e.root === raizDaPonte) return next(e)
273
+ if (e.name === NOME_DA_PONTE) return { refuse: `ork-ponte: o nome ${NOME_DA_PONTE} e reservado a ponte do Orkastery` }
274
+ const marcado = e.name.startsWith('ork-') || await $.fs.exists(juntar(e.root, MARCA_DE_MOD)).catch(() => false)
275
+ if (!marcado) return next(e)
276
+ conhecidos.add(e.name)
277
+ const a = await obterAutoridade(caminho => $.fs.read(caminho))
278
+ if (a === null) return { refuse: semLista() }
279
+ const achado = avaliarUses(a, e.uses)
280
+ return achado ? { refuse: recusa(achado) } : next(e)
281
+ }).catch(($, e, next) => (e.root !== raizDaPonte && (e.name.startsWith('ork-') || conhecidos.has(e.name))
282
+ ? { refuse: 'ork-ponte: a guarda falhou ao conferir o mod do Orkastery' } : next(e)))
283
+
284
+ // Texto enviado como se fosse do dono, vindo de mod do Orkastery, nao entra.
285
+ on('prompt.submit', ($, e, next) => {
286
+ const mod = e.origin.kind === 'plugin' && 'name' in e.origin ? e.origin.name : undefined
287
+ if (ehMod(mod)) {
288
+ return { drop: `ork-ponte: o mod ${String(mod)} nao fala pelo dono; use a faixa, uma notificacao ou a decisao autonoma do nucleo` }
289
+ }
290
+ return next(e)
291
+ }).catch(($, e, next) => (next.called ? next(e)
292
+ : ehMod(e.origin.kind === 'plugin' && 'name' in e.origin ? e.origin.name : undefined)
293
+ ? { drop: 'ork-ponte: a guarda falhou; texto de mod nao entra' } : next(e)))
294
+
295
+ on('session.append', ($, e, next) => {
296
+ const mod = e.origin.kind === 'plugin' && 'name' in e.origin ? e.origin.name : undefined
297
+ if (ehMod(mod) && e.message.type === 'user') {
298
+ return { deny: `ork-ponte: o mod ${String(mod)} nao grava linha de usuario; o modelo a leria como palavra do dono` }
299
+ }
300
+ return next(e)
301
+ }).catch(($, e, next) => (next.called ? next(e)
302
+ : ehMod(e.origin.kind === 'plugin' && 'name' in e.origin ? e.origin.name : undefined) && e.message.type === 'user'
303
+ ? { deny: 'ork-ponte: a guarda falhou; linha de usuario de mod nao entra' } : next(e)))
304
+
305
+ // A propria ponte le o ambiente e a lista do disco: so os outros mods do Orkastery passam por aqui.
306
+ on('env.get', async ($, e, next) => {
307
+ const origem = next.origin.plugin
308
+ if (origem === NOME_DA_PONTE || !ehMod(origem)) return next(e)
309
+ const a = await obterAutoridade(caminho => $.fs.read(caminho))
310
+ if (a === null) return { deny: semLista() }
311
+ const achado = avaliarAmbiente(a, e.name)
312
+ return achado ? { deny: recusa(achado) } : next(e)
313
+ }).catch(($, e, next) => {
314
+ if (next.called || next.origin.plugin === NOME_DA_PONTE || !ehMod(next.origin.plugin)) return next(e)
315
+ const achado = autoridade ? avaliarAmbiente(autoridade, e.name) : null
316
+ return autoridade && !achado ? next(e) : { deny: achado ? recusa(achado) : semLista() }
317
+ })
318
+
319
+ on('fs.read', async ($, e, next) => {
320
+ const origem = next.origin.plugin
321
+ if (origem === NOME_DA_PONTE || !ehMod(origem)) return next(e)
322
+ const a = await obterAutoridade(caminho => $.fs.read(caminho))
323
+ if (a === null) return { deny: semLista() }
324
+ const achado = avaliarCaminho(a, e.path)
325
+ return achado ? { deny: recusa(achado) } : next(e)
326
+ }).catch(($, e, next) => {
327
+ if (next.called || next.origin.plugin === NOME_DA_PONTE || !ehMod(next.origin.plugin)) return next(e)
328
+ const achado = autoridade ? avaliarCaminho(autoridade, e.path) : null
329
+ return autoridade && !achado ? next(e) : { deny: achado ? recusa(achado) : semLista() }
330
+ })
331
+ }
@@ -0,0 +1,76 @@
1
+ // Os caminhos vigiados dos mods do Orkastery (RM-059, T0.4; D7 do plano dos mods e D12 da thread). Os
2
+ // `watchPaths` de varios ganchos de `classic.SessionStart` se fundem e a ultima escrita vence: por isso so
3
+ // a ponte responde, juntando o que veio de baixo, os padroes do papel e os pedidos dos mods. Modulo puro.
4
+ import type { OrkPapel } from '../types'
5
+
6
+ export const TETO_DE_CAMINHOS = 64
7
+ export const TETO_DE_LEDGERS_DO_DONO = 48
8
+ export const TETO_POR_MOD = 16
9
+ const ID_DE_THREAD = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/
10
+ const NOME_DE_MOD = /^[a-z0-9][a-z0-9-]{0,63}$/
11
+
12
+ function juntar(pasta: string, nome: string): string {
13
+ return pasta.replace(/\/+$/, '') + '/' + nome
14
+ }
15
+
16
+ export function pastaDasThreads(raizDoEstado: string): string {
17
+ return juntar(raizDoEstado, '.orkastery/threads')
18
+ }
19
+
20
+ export function ledgerDaThread(raizDoEstado: string, thread: string): string {
21
+ return juntar(pastaDasThreads(raizDoEstado), `${thread}/ledger.jsonl`)
22
+ }
23
+
24
+ /** Ids de thread validos entre as entradas da pasta das threads (so pastas). */
25
+ export function idsDeThread(entradas: ReadonlyArray<{ name: string; kind: string }>): string[] {
26
+ return entradas.filter(e => e.kind === 'dir' && ID_DE_THREAD.test(e.name)).map(e => e.name).sort()
27
+ }
28
+
29
+ /** Os ledgers mais recentes por `mtimeMs`, com teto; ausente (sem `mtimeMs`) fica de fora. */
30
+ export function ledgersRecentes(ledgers: ReadonlyArray<{ caminho: string; mtimeMs?: number }>, teto = TETO_DE_LEDGERS_DO_DONO): string[] {
31
+ return ledgers.filter(l => typeof l.mtimeMs === 'number')
32
+ .sort((a, b) => (b.mtimeMs as number) - (a.mtimeMs as number) || (a.caminho < b.caminho ? -1 : 1))
33
+ .slice(0, teto).map(l => l.caminho)
34
+ }
35
+
36
+ /** O que a ponte vigia por padrao: o ledger da thread na fase; a pasta e os ledgers recentes no dono. */
37
+ export function caminhosPadrao(papel: OrkPapel, raizDoEstado: string | null, thread: string | null, recentes: readonly string[]): string[] {
38
+ if (raizDoEstado === null) return []
39
+ if (papel === 'fase') return thread !== null && ID_DE_THREAD.test(thread) ? [ledgerDaThread(raizDoEstado, thread)] : []
40
+ if (papel === 'dono') return [pastaDasThreads(raizDoEstado), ...recentes]
41
+ return []
42
+ }
43
+
44
+ /** Confere e guarda o pedido de um mod: caminhos absolutos, sem `..`, com teto por mod. */
45
+ export function registrarPedido(pedidos: Readonly<Record<string, string[]>> | undefined, mod: unknown,
46
+ caminhos: unknown): Record<string, string[]> {
47
+ if (typeof mod !== 'string' || !NOME_DE_MOD.test(mod)) throw new Error('ork-ponte: nome de mod invalido')
48
+ if (!Array.isArray(caminhos)) throw new Error('ork-ponte: caminhos precisa ser uma lista')
49
+ const validos: string[] = []
50
+ for (const c of caminhos) {
51
+ if (typeof c !== 'string' || !c.startsWith('/') || c.split('/').includes('..')) throw new Error('ork-ponte: caminho vigiado precisa ser absoluto e sem ..')
52
+ if (!validos.includes(c)) validos.push(c)
53
+ }
54
+ if (validos.length > TETO_POR_MOD) throw new Error(`ork-ponte: no maximo ${TETO_POR_MOD} caminhos por mod`)
55
+ const todos = { ...(pedidos ?? {}) }
56
+ if (validos.length === 0) delete todos[mod]
57
+ else todos[mod] = validos
58
+ return todos
59
+ }
60
+
61
+ /**
62
+ * O `watchPaths` final: primeiro o que veio de baixo (nunca cortado, nao e da ponte), depois os padroes e
63
+ * os pedidos dos mods em ordem de nome, sem duplicata, ate o teto.
64
+ */
65
+ export function fundirCaminhos(deBaixo: readonly string[] | undefined, padrao: readonly string[],
66
+ pedidos: Readonly<Record<string, readonly string[]>> | undefined, teto = TETO_DE_CAMINHOS): string[] {
67
+ const saida: string[] = []
68
+ for (const c of deBaixo ?? []) if (!saida.includes(c)) saida.push(c)
69
+ const limite = Math.max(teto, saida.length)
70
+ const nossos = [...padrao, ...Object.keys(pedidos ?? {}).sort().flatMap(m => (pedidos ?? {})[m] ?? [])]
71
+ for (const c of nossos) {
72
+ if (saida.length >= limite) break
73
+ if (!saida.includes(c)) saida.push(c)
74
+ }
75
+ return saida
76
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "formato": "ork.mod/v1",
3
+ "papeis": ["dono", "fase"],
4
+ "claudeCodeMinimo": "2.1.287"
5
+ }
@@ -0,0 +1,178 @@
1
+ // Contrato do noun `$.ork`, que a ponte acrescenta ao `$` no `engine.create` (RM-059, onda 0).
2
+ // Um mod do Orkastery lista `ork-ponte` em `dependencies` no proprio plugin.json e recebe estes tipos
3
+ // em `.claude-plugin/types/ork-ponte/`. Todo metodo recebe um objeto so: o host recusa noun com mais
4
+ // de um argumento. Sem import nem referencia, como o motor exige de um contrato. O noun e servico aberto
5
+ // a qualquer plugin carregado: o campo `mod` e o nome que quem chama declara, nao uma identidade; a
6
+ // autoridade de cada mod fica com a guarda da ponte, que olha a origem real de cada chamada de `$`.
7
+
8
+ /**
9
+ * O papel da sessao: `dono` na sessao interativa do dono (servidor `orkastery` sem thread),
10
+ * `fase` na sessao despachada pelo nucleo (`ORK_DISPATCH_ID`), `dormente` fora do Orkastery.
11
+ */
12
+ export type OrkPapel = 'dono' | 'fase' | 'dormente'
13
+
14
+ /** O que a ponte sabe da sessao, calculado a cada chamada (o MCP pode conectar depois do inicio). */
15
+ export type OrkContexto = {
16
+ papel: OrkPapel
17
+ /** A thread do despacho, so na sessao de fase e com id valido. */
18
+ thread: string | null
19
+ /** A raiz da sessao, absoluta. */
20
+ raiz: string
21
+ }
22
+
23
+ /** As secoes do retrato `ork.maestro-snapshot/v1` do nucleo. */
24
+ export type OrkSecao = 'portfolio' | 'demands' | 'threads' | 'sessions' | 'blockers' | 'leases' | 'retries' | 'hitl'
25
+ | 'ship' | 'master' | 'nextActions'
26
+
27
+ /** A lista fechada de consultas de leitura do CLI, todas com `--json` (D10). */
28
+ export type OrkConsulta = 'maestro' | 'thread.status' | 'thread.list' | 'conducao.status' | 'retry.plan' | 'retry.list'
29
+ | 'pulse' | 'orquestracao.status' | 'sessions.hitl' | 'roadmap.status' | 'accounts.esgotamentos' | 'decisao.placar'
30
+
31
+ /** O retrato inteiro, uma secao (com `offset`, padrao 0) ou o recorte de uma thread. */
32
+ export type OrkPedidoDeRetrato = {
33
+ secao?: OrkSecao
34
+ thread?: string
35
+ offset?: number
36
+ }
37
+
38
+ export type OrkPedidoDeLeitura = {
39
+ consulta: OrkConsulta
40
+ /** Obrigatoria em `thread.status`, `conducao.status`, `retry.plan` e `decisao.placar`. */
41
+ thread?: string
42
+ }
43
+
44
+ /** A acao que o nucleo declara para um item, quando declara (projecao de `ork.maestro-snapshot/v1`). */
45
+ export type OrkAcaoDoMaestro = {
46
+ operation: string
47
+ available: boolean
48
+ reason: string
49
+ preconditions: string[]
50
+ readback: string
51
+ }
52
+
53
+ export type OrkItemDoMaestro = {
54
+ id: string
55
+ title: string
56
+ status: string
57
+ refs: Array<{ kind: string; id: string }>
58
+ facts: Record<string, string | number | boolean | null>
59
+ action?: OrkAcaoDoMaestro
60
+ }
61
+
62
+ export type OrkSecaoDoMaestro = {
63
+ state: 'available' | 'empty' | 'unavailable' | 'stale' | 'conflict'
64
+ source: string
65
+ observedAt: string
66
+ items: OrkItemDoMaestro[]
67
+ gaps: string[]
68
+ }
69
+
70
+ /** Projecao minima do `ork.maestro-snapshot/v1`; o resto do objeto chega como o nucleo mandou. */
71
+ export type OrkMaestro = {
72
+ schema: 'ork.maestro-snapshot/v1'
73
+ observedAt: string
74
+ sections: Partial<Record<OrkSecao, OrkSecaoDoMaestro>>
75
+ gaps: string[]
76
+ }
77
+
78
+ export type OrkRetrato = {
79
+ /** De onde veio: o MCP do nucleo, a reserva pelo CLI ou o cache da ponte. */
80
+ fonte: 'mcp' | 'cli' | 'cache'
81
+ /** Quando a ponte leu, em ms desde a epoca (relogio do `$.clock`). */
82
+ lidoEm: number
83
+ retrato: OrkMaestro
84
+ }
85
+
86
+ /** O `stat` dos ledgers cobertos por um retrato guardado. */
87
+ export type OrkAssinatura = Array<{ caminho: string; tamanho: number; mtimeMs: number } | { caminho: string; ausente: true }>
88
+
89
+ export type OrkRetratoGuardado = {
90
+ fonte: 'mcp' | 'cli'
91
+ lidoEm: number
92
+ retrato: unknown
93
+ caminhos: string[]
94
+ assinatura: OrkAssinatura
95
+ }
96
+
97
+ /** A linha que um mod publica na faixa. */
98
+ export type OrkLinhaDaFaixa = {
99
+ mod: string
100
+ texto: string
101
+ /** Quando foi publicada, em ms desde a epoca. */
102
+ em: number
103
+ }
104
+
105
+ /** Onde um mod mostrou algo ao dono. */
106
+ export type OrkCanal = 'faixa' | 'painel' | 'notificacao' | 'toast' | 'status' | 'transcript'
107
+
108
+ /** O que um mod diz ter mostrado ao dono: `chave` agrupa o que e a mesma coisa (por exemplo, `hitl:<pedido>`). */
109
+ export type OrkMostrado = {
110
+ mod: string
111
+ canal: OrkCanal
112
+ texto: string
113
+ chave?: string
114
+ thread?: string
115
+ }
116
+
117
+ /** O registro `ork.mod-mostrado/v1` no `$.store` da ponte, para o nucleo deduplicar o Telegram depois. */
118
+ export type OrkRegistroDeMostrados = {
119
+ formato: 'ork.mod-mostrado/v1'
120
+ itens: Array<{
121
+ mod: string
122
+ canal: OrkCanal
123
+ chave: string | null
124
+ thread: string | null
125
+ texto: string
126
+ primeiraVez: string
127
+ ultimaVez: string
128
+ vezes: number
129
+ }>
130
+ }
131
+
132
+ export type OrkVigia = {
133
+ /** Os caminhos que este mod pediu, como ficaram guardados. */
134
+ caminhos: string[]
135
+ /** O `SessionStart` desta sessao ja respondeu: o pedido so vale no proximo (`/clear`, retomada). */
136
+ valeNoProximoInicio: boolean
137
+ }
138
+
139
+ export type Ork = {
140
+ /** O papel desta sessao. */
141
+ papel: () => Promise<OrkPapel>
142
+ /** Papel, thread do despacho e raiz da sessao. */
143
+ contexto: () => Promise<OrkContexto>
144
+ /**
145
+ * O retrato do nucleo pelo `ork_maestro`, com reserva na consulta `maestro` do CLI (teto de 10 s).
146
+ * Volta do cache enquanto o `stat` dos ledgers cobertos nao muda, por no maximo 60 s.
147
+ */
148
+ retrato: (pedido?: OrkPedidoDeRetrato) => Promise<OrkRetrato>
149
+ /** Uma consulta da lista fechada pelo CLI, com teto de 10 s; recusa o que estiver fora dela. */
150
+ ler: (pedido: OrkPedidoDeLeitura) => Promise<unknown>
151
+ /**
152
+ * Publica (ou tira, sem `texto`) a linha deste mod na faixa acima do prompt, que so a ponte desenha.
153
+ * Na sessao do dono, a linha publicada entra no registro do que foi mostrado.
154
+ */
155
+ faixa: (pedido: { mod: string; texto?: string }) => Promise<{ publicada: boolean }>
156
+ /** Pede caminhos absolutos para o `watchPaths`, que so a ponte responde; sem caminhos, tira o pedido. */
157
+ vigiar: (pedido: { mod: string; caminhos: string[] }) => Promise<OrkVigia>
158
+ /** Registra o que o mod mostrou ao dono fora da faixa (painel, notificacao, toast, status). */
159
+ mostrado: (pedido: OrkMostrado) => Promise<void>
160
+ /** O registro do que os mods mostraram ao dono. */
161
+ mostrados: () => Promise<OrkRegistroDeMostrados>
162
+ }
163
+
164
+ declare module 'claude-code' {
165
+ interface EngineInterface {
166
+ ork: Ork
167
+ }
168
+ interface PluginState {
169
+ 'ork-ponte': {
170
+ /** Os retratos guardados, por pedido. */
171
+ retratos: Record<string, OrkRetratoGuardado>
172
+ /** As linhas da faixa, uma por mod. */
173
+ faixa: OrkLinhaDaFaixa[]
174
+ /** Os caminhos que cada mod pediu para vigiar. */
175
+ vigias: Record<string, string[]>
176
+ }
177
+ }
178
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "ork-portao",
3
+ "version": "0.1.0",
4
+ "description": "Portão de Tarefas do Orkastery no Claude Code: na sessão de fase do GO, cada tarefa do quadro é uma tarefa do plano com touch_paths e verify, só fecha com a conferência do núcleo aprovada e, com agent teams no piloto, vai ao teammate ocioso com lease livre.",
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,3 @@
1
+ {
2
+ "modules": ["./register.ts"]
3
+ }