@orkastery/cli 0.5.6 → 0.6.1

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 (396) 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 +37 -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/ork-mensageiro/.claude-plugin/plugin.json +14 -0
  16. package/adapters/claude-code/mods/ork-mensageiro/hooks/caixa.ts +215 -0
  17. package/adapters/claude-code/mods/ork-mensageiro/hooks/hooks.json +3 -0
  18. package/adapters/claude-code/mods/ork-mensageiro/hooks/painel.tsx +165 -0
  19. package/adapters/claude-code/mods/ork-mensageiro/hooks/recepcao.ts +256 -0
  20. package/adapters/claude-code/mods/ork-mensageiro/hooks/register.tsx +481 -0
  21. package/adapters/claude-code/mods/ork-mensageiro/orkastery-mod.json +5 -0
  22. package/adapters/claude-code/mods/ork-mensageiro/types/index.d.ts +85 -0
  23. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +9 -5
  24. package/adapters/claude-code/mods/ork-ritual/.claude-plugin/plugin.json +14 -0
  25. package/adapters/claude-code/mods/ork-ritual/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-ritual/hooks/nota.ts +88 -0
  27. package/adapters/claude-code/mods/ork-ritual/hooks/register.tsx +494 -0
  28. package/adapters/claude-code/mods/ork-ritual/hooks/replay.tsx +271 -0
  29. package/adapters/claude-code/mods/ork-ritual/hooks/ritual.ts +218 -0
  30. package/adapters/claude-code/mods/ork-ritual/orkastery-mod.json +5 -0
  31. package/adapters/claude-code/mods/ork-ritual/types/index.d.ts +106 -0
  32. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +1 -1
  33. package/adapters/codex/skills/ork/SKILL.md +2 -0
  34. package/adapters/hermes/README.md +64 -1
  35. package/adapters/hermes/bin/ork-conhecimento-colecoes.sh +14 -0
  36. package/adapters/hermes/bin/ork-conhecimento-listar.sh +15 -0
  37. package/adapters/hermes/bin/ork-conhecimento-mostrar.sh +16 -0
  38. package/adapters/hermes/bin/ork-conhecimento-verificar.sh +15 -0
  39. package/adapters/hermes/bin/ork-vigia-batida.py +127 -0
  40. package/adapters/hermes/hermes.plugin.json +4 -0
  41. package/adapters/hermes/hitl-ingress/__init__.py +101 -8
  42. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +2 -2
  43. package/adapters/openclaw/README.md +81 -9
  44. package/adapters/openclaw/bin/ork-vigia-batida.js +86 -0
  45. package/adapters/openclaw/dist/hitl-ingress.js +106 -9
  46. package/adapters/openclaw/dist/index.js +86 -0
  47. package/adapters/openclaw/openclaw.plugin.json +34 -4
  48. package/adapters/openclaw/package.json +2 -2
  49. package/adapters/openclaw/src/hitl-ingress.ts +103 -9
  50. package/adapters/openclaw/src/index.ts +94 -0
  51. package/assets/adapters-en/claude-code/README.md +403 -0
  52. package/assets/adapters-en/claude-code/agents/ork-check.md +33 -0
  53. package/assets/adapters-en/claude-code/agents/ork-go.md +33 -0
  54. package/assets/adapters-en/claude-code/agents/ork-goal.md +34 -0
  55. package/assets/adapters-en/claude-code/agents/ork-master.md +35 -0
  56. package/assets/adapters-en/claude-code/agents/ork-plan.md +33 -0
  57. package/assets/adapters-en/claude-code/agents/ork-ship.md +33 -0
  58. package/assets/adapters-en/claude-code/commands/check.md +46 -0
  59. package/assets/adapters-en/claude-code/commands/go.md +46 -0
  60. package/assets/adapters-en/claude-code/commands/goal.md +55 -0
  61. package/assets/adapters-en/claude-code/commands/master.md +54 -0
  62. package/assets/adapters-en/claude-code/commands/onboarding.md +22 -0
  63. package/assets/adapters-en/claude-code/commands/ork.md +126 -0
  64. package/assets/adapters-en/claude-code/commands/plan.md +47 -0
  65. package/assets/adapters-en/claude-code/commands/ship.md +45 -0
  66. package/assets/adapters-en/codex/skills/ork/SKILL.md +85 -0
  67. package/assets/adapters-en/hermes/README.md +273 -0
  68. package/assets/adapters-en/hermes/skills/orkastery-devmaster/SKILL.md +169 -0
  69. package/assets/references-en/README.md +25 -0
  70. package/assets/references-en/code-review-axes.md +82 -0
  71. package/assets/references-en/definition-of-done.md +74 -0
  72. package/assets/references-en/performance-checklist.md +53 -0
  73. package/assets/references-en/security-checklist.md +101 -0
  74. package/assets/references-en/testing-patterns.md +51 -0
  75. package/assets/security-scan/defaults/.golangci.yml +2 -0
  76. package/assets/security-scan/defaults/eslint.config.mjs +11 -0
  77. package/assets/security-scan/defaults/gitleaks.toml +3 -0
  78. package/assets/security-scan/defaults/ruff.toml +1 -0
  79. package/assets/security-scan/tools-agil.json +87 -0
  80. package/assets/security-scan/tools.json +625 -0
  81. package/assets/skills-en/core/onboarding/SKILL.md +58 -0
  82. package/assets/skills-en/core/orkastery-bootstrap/SKILL.md +119 -0
  83. package/assets/skills-en/core/thread-state/SKILL.md +88 -0
  84. package/assets/skills-en/governance/decision-triage/SKILL.md +65 -0
  85. package/assets/skills-en/governance/narrative-guardian/SKILL.md +66 -0
  86. package/assets/skills-en/governance/roadmap-keeper/SKILL.md +60 -0
  87. package/assets/skills-en/governance/scope-check-capability-map/SKILL.md +71 -0
  88. package/assets/skills-en/observability/thread-tracing/SKILL.md +63 -0
  89. package/assets/skills-en/phases/check-quality/SKILL.md +103 -0
  90. package/assets/skills-en/phases/go-implementation/SKILL.md +78 -0
  91. package/assets/skills-en/phases/goal-definition/SKILL.md +69 -0
  92. package/assets/skills-en/phases/master-metrics/SKILL.md +72 -0
  93. package/assets/skills-en/phases/plan-specification/SKILL.md +67 -0
  94. package/assets/skills-en/phases/security-remediation/SKILL.md +70 -0
  95. package/assets/skills-en/phases/ship-release/SKILL.md +71 -0
  96. package/assets/skills-en/reviewers/code-reviewer/SKILL.md +61 -0
  97. package/assets/skills-en/reviewers/security-auditor/SKILL.md +93 -0
  98. package/assets/skills-en/reviewers/test-engineer/SKILL.md +66 -0
  99. package/assets/skills-en/reviewers/web-performance-auditor/SKILL.md +63 -0
  100. package/dist/adapters/claude-bg.js +123 -9
  101. package/dist/adapters/codex-controller-worker.js +12 -5
  102. package/dist/adapters/codex-events.js +16 -4
  103. package/dist/adapters/codex.js +3 -1
  104. package/dist/adapters/grok-events.js +227 -0
  105. package/dist/adapters/grok-mcp-servidor.js +612 -0
  106. package/dist/adapters/grok-mcp.js +178 -0
  107. package/dist/adapters/grok.js +686 -0
  108. package/dist/agendador-cpu.js +92 -0
  109. package/dist/atualizar-branch.js +245 -0
  110. package/dist/auditoria.js +13 -11
  111. package/dist/auditrun.js +51 -46
  112. package/dist/autorizacao-duravel.js +327 -0
  113. package/dist/board.js +94 -40
  114. package/dist/branch-de-estado.js +23 -10
  115. package/dist/busca-semantica.js +7 -5
  116. package/dist/catalogo.js +2 -1
  117. package/dist/changelog-reconciliacao.js +290 -0
  118. package/dist/check-agil.js +528 -0
  119. package/dist/check-modo.js +41 -0
  120. package/dist/check-paralelo.js +238 -0
  121. package/dist/ci.js +248 -45
  122. package/dist/ciclos.js +8 -6
  123. package/dist/claim-lint.js +12 -8
  124. package/dist/claims-conferir.js +47 -39
  125. package/dist/claims.js +10 -9
  126. package/dist/company-brain-client.js +10 -3
  127. package/dist/company-brain-migration.js +11 -5
  128. package/dist/conducao-batida.js +759 -0
  129. package/dist/conducao-sentinela.js +25 -8
  130. package/dist/conducao.js +89 -29
  131. package/dist/conhecimento-consulta.js +270 -0
  132. package/dist/conhecimento.js +111 -87
  133. package/dist/conta-esgotada.js +127 -0
  134. package/dist/dado-privado.js +816 -0
  135. package/dist/decisao-autonoma.js +5 -4
  136. package/dist/demo.js +14 -12
  137. package/dist/dependencias-da-worktree.js +25 -0
  138. package/dist/divida.js +38 -36
  139. package/dist/docs.js +89 -89
  140. package/dist/doctor-forja.js +343 -0
  141. package/dist/doctor-pulse-cron.js +113 -1
  142. package/dist/doctor.js +164 -6
  143. package/dist/dsn-da-memoria.js +417 -0
  144. package/dist/entrega-por-mod.js +503 -0
  145. package/dist/entrega-pr.js +154 -54
  146. package/dist/esgotamentos.js +13 -11
  147. package/dist/estado-thread.js +21 -18
  148. package/dist/evalrunner.js +35 -32
  149. package/dist/fabrica-batida.js +34 -21
  150. package/dist/fabrica-estado.js +33 -21
  151. package/dist/fix.js +21 -19
  152. package/dist/forja/adaptador.js +6 -0
  153. package/dist/forja/ambiente-de-ci.js +27 -0
  154. package/dist/forja/api.js +256 -0
  155. package/dist/forja/cache.js +89 -0
  156. package/dist/forja/cli.js +60 -0
  157. package/dist/forja/contrato.js +9 -0
  158. package/dist/forja/endereco.js +43 -0
  159. package/dist/forja/estado.js +22 -0
  160. package/dist/forja/executor.js +73 -0
  161. package/dist/forja/github/ci.js +95 -0
  162. package/dist/forja/github/dono-da-rede.js +18 -0
  163. package/dist/forja/github/metadados.js +15 -0
  164. package/dist/forja/github/pedidos.js +200 -0
  165. package/dist/forja/gitlab/ci.js +141 -0
  166. package/dist/forja/gitlab/consultas.js +59 -0
  167. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  168. package/dist/forja/gitlab/metadados.js +15 -0
  169. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  170. package/dist/forja/gitlab/pedidos.js +141 -0
  171. package/dist/forja/produtor.js +32 -0
  172. package/dist/forja/registro.js +31 -0
  173. package/dist/forja/resolver.js +121 -0
  174. package/dist/forja/texto.js +13 -0
  175. package/dist/forja/versao.js +71 -0
  176. package/dist/forja.js +123 -80
  177. package/dist/handoff.js +23 -13
  178. package/dist/hitl-contract.js +46 -43
  179. package/dist/hitl-curto.js +37 -25
  180. package/dist/hitl-gates.js +13 -11
  181. package/dist/hitl-local-receipt.js +51 -0
  182. package/dist/hitl-local.js +11 -2
  183. package/dist/hitl-lock.js +5 -11
  184. package/dist/hitl-public-receipt.js +11 -0
  185. package/dist/hitl-resumo.js +44 -1
  186. package/dist/hitl-sessions.js +62 -9
  187. package/dist/hitl-texto-livre.js +7 -4
  188. package/dist/hitl.js +34 -31
  189. package/dist/horario.js +20 -1
  190. package/dist/hosts.js +104 -134
  191. package/dist/index.js +864 -554
  192. package/dist/indice-vetorial.js +14 -12
  193. package/dist/init.js +11 -2
  194. package/dist/integracoes-locais.js +4 -0
  195. package/dist/intelligence-graph-cli.js +123 -69
  196. package/dist/intelligence-graph-query.js +37 -22
  197. package/dist/leases.js +19 -18
  198. package/dist/ledger-stats.js +17 -16
  199. package/dist/ledger.js +31 -1
  200. package/dist/licoes.js +12 -11
  201. package/dist/locale-accounts.js +228 -0
  202. package/dist/locale-adapter.js +291 -0
  203. package/dist/locale-ajuda.js +86 -10
  204. package/dist/locale-audit.js +199 -0
  205. package/dist/locale-claims.js +213 -0
  206. package/dist/locale-conducao.js +138 -0
  207. package/dist/locale-conhecimento.js +181 -0
  208. package/dist/locale-decisao.js +205 -0
  209. package/dist/locale-docs.js +230 -0
  210. package/dist/locale-estado.js +101 -0
  211. package/dist/locale-forja.js +288 -0
  212. package/dist/locale-gerados.js +5 -0
  213. package/dist/locale-grafo.js +129 -0
  214. package/dist/locale-master.js +83 -0
  215. package/dist/locale-network.js +524 -0
  216. package/dist/locale-operacao-restante.js +931 -0
  217. package/dist/locale-projetos.js +100 -0
  218. package/dist/locale-prompts.js +194 -0
  219. package/dist/locale-pulse.js +140 -2
  220. package/dist/locale-reservas.js +87 -0
  221. package/dist/locale-retry.js +183 -6
  222. package/dist/locale-security-scan.js +69 -0
  223. package/dist/locale-setup.js +192 -0
  224. package/dist/locale-ship.js +177 -66
  225. package/dist/locale-thread.js +149 -5
  226. package/dist/locale-verify.js +80 -4
  227. package/dist/locale-worktree.js +246 -0
  228. package/dist/locale.js +553 -9
  229. package/dist/maestro-runtime.js +22 -3
  230. package/dist/manifest.js +293 -12
  231. package/dist/maquina-ociosa.js +211 -0
  232. package/dist/maquina.js +10 -5
  233. package/dist/master-nota-local.js +200 -0
  234. package/dist/master-nota.js +10 -2
  235. package/dist/master.js +118 -41
  236. package/dist/mcp-conhecimento.js +52 -0
  237. package/dist/mcp-experiencia.js +26 -5
  238. package/dist/mcp-install.js +90 -15
  239. package/dist/mcp-noctum.js +101 -0
  240. package/dist/mcp-server.js +116 -22
  241. package/dist/mcp-ship-transporte.js +977 -0
  242. package/dist/mcp-ship.js +68 -24
  243. package/dist/mcp-transportes.js +17 -0
  244. package/dist/memoria.js +63 -58
  245. package/dist/merge-da-entrega.js +85 -0
  246. package/dist/modos-migracao.js +8 -6
  247. package/dist/modos.js +17 -18
  248. package/dist/network-roadmap.js +94 -54
  249. package/dist/noctum-aceite.js +929 -0
  250. package/dist/noctum-arco.js +540 -33
  251. package/dist/noctum-capacidade.js +3 -3
  252. package/dist/noctum-changelog.js +399 -0
  253. package/dist/noctum-cli.js +539 -0
  254. package/dist/noctum-coordenacao.js +1225 -0
  255. package/dist/noctum-entrega.js +1217 -0
  256. package/dist/noctum-envelope.js +253 -17
  257. package/dist/noctum-execucao.js +100 -24
  258. package/dist/noctum-fechamento.js +416 -0
  259. package/dist/noctum-fila.js +49 -10
  260. package/dist/noctum-guarda.js +333 -0
  261. package/dist/noctum-integracao.js +507 -0
  262. package/dist/noctum-maquinas.js +387 -0
  263. package/dist/noctum-medicao.js +450 -0
  264. package/dist/noctum-modo.js +390 -0
  265. package/dist/noctum-pergunta-canal.js +96 -0
  266. package/dist/noctum-pergunta.js +115 -0
  267. package/dist/noctum-provas.js +838 -0
  268. package/dist/noctum-reconciliacao.js +594 -0
  269. package/dist/noctum-rede.js +102 -0
  270. package/dist/noctum-registro.js +215 -0
  271. package/dist/noctum-relatorio.js +861 -0
  272. package/dist/noctum-resposta.js +207 -0
  273. package/dist/noctum-retomada-rede.js +71 -0
  274. package/dist/noctum-sessoes-em-voo.js +93 -0
  275. package/dist/noctum-supervisao.js +649 -0
  276. package/dist/noctum-terminal.js +459 -0
  277. package/dist/noctum-transporte.js +655 -0
  278. package/dist/noctum-vigia.js +679 -0
  279. package/dist/ocupacao.js +3 -1
  280. package/dist/onboarding.js +16 -5
  281. package/dist/orkmind.js +39 -23
  282. package/dist/orquestracao.js +31 -35
  283. package/dist/parado-no-condutor.js +160 -139
  284. package/dist/phase.js +96 -42
  285. package/dist/policies.js +33 -0
  286. package/dist/postura-local.js +11 -6
  287. package/dist/preflight.js +2 -1
  288. package/dist/procedencia.js +9 -14
  289. package/dist/projeto-alvo.js +59 -20
  290. package/dist/prompts.js +136 -42
  291. package/dist/prova-minima.js +5 -6
  292. package/dist/pulse-cadencia.js +5 -4
  293. package/dist/pulse-consentimento.js +53 -1
  294. package/dist/pulse-delivery.js +143 -27
  295. package/dist/pulse-resposta.js +368 -4
  296. package/dist/pulse.js +136 -3
  297. package/dist/ratelimit.js +13 -4
  298. package/dist/recall.js +14 -13
  299. package/dist/rede-adesao.js +13 -8
  300. package/dist/rede-forja.js +108 -24
  301. package/dist/rede-status.js +63 -45
  302. package/dist/rede.js +86 -46
  303. package/dist/retomada-checkpoint.js +101 -0
  304. package/dist/retry.js +326 -78
  305. package/dist/roadmap-reservas.js +32 -32
  306. package/dist/runtime-ambiente.js +5 -0
  307. package/dist/runtime-context.js +279 -85
  308. package/dist/runtime-escada.js +429 -0
  309. package/dist/runtime-profiles.js +130 -63
  310. package/dist/runtimes.js +42 -5
  311. package/dist/saida-segura.js +3 -2
  312. package/dist/security-scan/agil.js +366 -0
  313. package/dist/security-scan/cli.js +76 -0
  314. package/dist/security-scan/compare.js +149 -0
  315. package/dist/security-scan/config.js +93 -0
  316. package/dist/security-scan/detect.js +97 -0
  317. package/dist/security-scan/executor.js +196 -0
  318. package/dist/security-scan/guard.js +180 -0
  319. package/dist/security-scan/imagem-de-lint.js +96 -0
  320. package/dist/security-scan/normalize/actionlint.js +12 -0
  321. package/dist/security-scan/normalize/eslint.js +12 -0
  322. package/dist/security-scan/normalize/gitleaks.js +13 -0
  323. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  324. package/dist/security-scan/normalize/govulncheck.js +36 -0
  325. package/dist/security-scan/normalize/index.js +25 -0
  326. package/dist/security-scan/normalize/npm-audit.js +30 -0
  327. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  328. package/dist/security-scan/normalize/oxlint.js +51 -0
  329. package/dist/security-scan/normalize/pip-audit.js +16 -0
  330. package/dist/security-scan/normalize/ruff.js +12 -0
  331. package/dist/security-scan/normalize/semgrep.js +20 -0
  332. package/dist/security-scan/normalize/trivy.js +33 -0
  333. package/dist/security-scan/normalize/util.js +204 -0
  334. package/dist/security-scan/normalize/zizmor.js +19 -0
  335. package/dist/security-scan/report.js +156 -0
  336. package/dist/security-scan/run.js +448 -0
  337. package/dist/security-scan/tools.js +62 -0
  338. package/dist/security-scan/trabalhador.js +74 -0
  339. package/dist/security-scan/types.js +15 -0
  340. package/dist/session-events.js +19 -2
  341. package/dist/session-watcher-claude.js +74 -19
  342. package/dist/session-watcher-grok.js +425 -0
  343. package/dist/session-watcher.js +174 -13
  344. package/dist/sessoes-contas.js +42 -5
  345. package/dist/sessoes-inventario.js +1 -1
  346. package/dist/sessoes.js +25 -23
  347. package/dist/setup.js +67 -66
  348. package/dist/ship-publicar.js +263 -92
  349. package/dist/ship.js +160 -17
  350. package/dist/superficie.js +14 -11
  351. package/dist/thread-close.js +9 -9
  352. package/dist/thread.js +121 -18
  353. package/dist/tokens.js +15 -11
  354. package/dist/trabalho-thread.js +297 -0
  355. package/dist/transporte-do-canal.js +189 -0
  356. package/dist/types.js +12 -1
  357. package/dist/util.js +5 -2
  358. package/dist/varredura-acoes.js +500 -0
  359. package/dist/verify.js +491 -32
  360. package/dist/worktree-local.js +12 -10
  361. package/dist/worktree.js +81 -85
  362. package/eval/casos/check-quality.json +77 -0
  363. package/eval/casos/security-auditor.json +148 -0
  364. package/eval/casos/security-remediation.json +161 -0
  365. package/eval/fixtures/security-scan/README.md +8 -0
  366. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  367. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  368. package/eval/fixtures/security-scan/go/README.md +4 -0
  369. package/eval/fixtures/security-scan/go/config.go +4 -0
  370. package/eval/fixtures/security-scan/go/go.mod +5 -0
  371. package/eval/fixtures/security-scan/go/go.sum +2 -0
  372. package/eval/fixtures/security-scan/go/main.go +31 -0
  373. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  374. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  375. package/eval/fixtures/security-scan/js/README.md +4 -0
  376. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  377. package/eval/fixtures/security-scan/js/package.json +10 -0
  378. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  379. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  380. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  381. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  382. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  383. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  384. package/eval/fixtures/security-scan/python/README.md +4 -0
  385. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  386. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  387. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  388. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  389. package/package.json +10 -5
  390. package/references/security-checklist.md +3 -3
  391. package/skills/README.md +1 -0
  392. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  393. package/skills/phases/check-quality/SKILL.md +16 -0
  394. package/skills/phases/go-implementation/SKILL.md +6 -0
  395. package/skills/phases/security-remediation/SKILL.md +70 -0
  396. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -33,9 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS = exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS = exports.MOTIVO_SEM_HOST_MCP = exports.RUNTIMES_SEM_HOST_MCP = void 0;
36
37
  exports.novaIdentidadeDeDespacho = novaIdentidadeDeDespacho;
38
+ exports.capacidadeDoRuntimeNoProjeto = capacidadeDoRuntimeNoProjeto;
39
+ exports.capacidadeDaRotacao = capacidadeDaRotacao;
37
40
  exports.contextoDoProjeto = contextoDoProjeto;
38
41
  exports.validarContextoRuntime = validarContextoRuntime;
42
+ exports.validarContextoDoGrok = validarContextoDoGrok;
39
43
  exports.lerDeclaracaoDeMod = lerDeclaracaoDeMod;
40
44
  exports.modsDeFaseInstalados = modsDeFaseInstalados;
41
45
  /** Contexto interno opt-in: configuracao M4 existente + catalogo instalado, nunca args do modelo. */
@@ -49,6 +53,7 @@ const hosts_1 = require("./hosts");
49
53
  const worktree_1 = require("./worktree");
50
54
  const mcp_install_1 = require("./mcp-install");
51
55
  const mcp_grafo_1 = require("./mcp-grafo");
56
+ const mcp_transportes_1 = require("./mcp-transportes");
52
57
  const hitl_public_receipt_1 = require("./hitl-public-receipt");
53
58
  /** Correlação interna; nenhuma identidade de despacho concede poder de gate. */
54
59
  function novaIdentidadeDeDespacho(threadId, fase) {
@@ -81,48 +86,89 @@ function ler(raiz, file, limite) {
81
86
  fs.closeSync(fd);
82
87
  }
83
88
  }
84
- function preparado(raiz) {
85
- let encontrado;
86
- for (const host of ['claude-code', 'codex']) {
87
- const file = path.join(raiz, host === 'codex' ? '.codex/config.toml' : '.mcp.json');
88
- if (!fs.existsSync(file))
89
- continue;
89
+ /** A entrada `orkastery` de um host, conferida contra o perfil ja achado nos hosts anteriores; sem entrada, o perfil fica. */
90
+ function perfilDoHost(raiz, host, encontrado) {
91
+ const file = (0, mcp_install_1.arquivoDoHostMcp)(raiz, host), toml = host !== 'claude-code';
92
+ if (!fs.existsSync(file))
93
+ return encontrado;
94
+ let config;
95
+ try {
90
96
  const text = ler(raiz, file, 262144).toString('utf8');
91
- const config = objeto(host === 'codex' ? (0, smol_toml_1.parse)(text) : JSON.parse(text));
92
- const chave = host === 'codex' ? 'mcp_servers' : 'mcpServers';
93
- if (config[chave] === undefined)
94
- continue;
95
- const servidores = objeto(config[chave]);
96
- if (!Object.hasOwn(servidores, 'orkastery'))
97
- continue;
98
- const entrada = objeto(servidores.orkastery), padrao = (0, mcp_install_1.configuracaoServidorMcp)(raiz, host);
99
- const legado = padrao.args.slice(0, -2);
100
- let transporte = 'github-ssh';
101
- let argv = entrada.args;
102
- let permissoesFilho = 'interactive';
103
- if (Array.isArray(argv) && argv[argv.length - 2] === '--child-permissions') {
104
- if (!['interactive', 'worktree'].includes(argv[argv.length - 1]))
105
- throw Error('runtime.context.conflict: perfil de filho invalido');
106
- permissoesFilho = argv[argv.length - 1];
107
- argv = argv.slice(0, -2);
97
+ config = objeto(toml ? (0, smol_toml_1.parse)(text) : JSON.parse(text));
98
+ }
99
+ catch (erro) {
100
+ // RM-067 (F4b, GO-FIX A4 e N2): o motivo tipado do grok leva o codigo do erro de sistema ou a primeira linha do parser,
101
+ // sem o trecho do arquivo do time nem o caminho da maquina.
102
+ if (host !== 'grok')
103
+ throw erro;
104
+ const causa = erro.code ?? erro.message.split('\n')[0];
105
+ throw Error(`runtime.context.conflict: .grok/config.toml do projeto ilegivel (${causa}); conserte o arquivo ou tire dele a entrada orkastery`);
106
+ }
107
+ const chave = toml ? 'mcp_servers' : 'mcpServers';
108
+ if (config[chave] === undefined)
109
+ return encontrado;
110
+ const servidores = objeto(config[chave]);
111
+ if (!Object.hasOwn(servidores, 'orkastery'))
112
+ return encontrado;
113
+ const entrada = objeto(servidores.orkastery), padrao = (0, mcp_install_1.configuracaoServidorMcp)(raiz, host);
114
+ const legado = padrao.args.slice(0, -2);
115
+ let transporte = 'github-ssh';
116
+ let argv = entrada.args;
117
+ let permissoesFilho = 'interactive';
118
+ if (Array.isArray(argv) && argv[argv.length - 2] === '--child-permissions') {
119
+ if (!['interactive', 'worktree'].includes(argv[argv.length - 1]))
120
+ throw Error('runtime.context.conflict: perfil de filho invalido');
121
+ permissoesFilho = argv[argv.length - 1];
122
+ argv = argv.slice(0, -2);
123
+ }
124
+ if (JSON.stringify(argv) !== JSON.stringify(legado)) {
125
+ if (!Array.isArray(argv) || argv.length !== padrao.args.length ||
126
+ argv[argv.length - 2] !== '--ship-transport' || !(0, mcp_transportes_1.ehTransporteShipMcp)(argv[argv.length - 1]))
127
+ throw Error('runtime.context.conflict: MCP Orkastery divergente; transporte invalido ou argumentos extras');
128
+ transporte = argv[argv.length - 1];
129
+ }
130
+ const esperado = (0, mcp_install_1.configuracaoServidorMcp)(raiz, host, undefined, transporte);
131
+ if (entrada.command !== esperado.command || (JSON.stringify(argv) !== JSON.stringify(esperado.args) && JSON.stringify(argv) !== JSON.stringify(legado)))
132
+ throw Error('runtime.context.conflict: MCP Orkastery divergente; repare a instalacao do projeto');
133
+ if (encontrado !== undefined && encontrado.transporteShip !== transporte)
134
+ throw Error('runtime.context.conflict: transportes SHIP divergentes entre hosts');
135
+ if (encontrado !== undefined && encontrado.permissoesFilho !== permissoesFilho)
136
+ throw Error('runtime.context.conflict: perfis de filho divergentes entre hosts');
137
+ return { ...encontrado, transporteShip: transporte, permissoesFilho, ...(host === 'codex' ? { politicasCodex: entrada } : {}) };
138
+ }
139
+ /**
140
+ * O perfil da instalacao MCP do projeto. RM-067 (F4b, GO-FIX A4): o `.grok/config.toml` tambem prepara, em TOML como o do
141
+ * codex, mas ele e a config do proprio grok, que o time pode manter: para quem nao e o grok (`quem`), a falha de leitura,
142
+ * de parse ou de conferencia dele nao derruba a preparacao dos outros hosts, e a entrada dele fica de fora. GO-FIX N1: sem
143
+ * outro host preparado, a entrada `orkastery` do grok e a preparacao do projeto, e engolir a falha dela faria o claude-bg
144
+ * e o codex despacharem como num projeto legado, sem o MCP; a falha volta, e so a config do time sem a entrada fica de fora.
145
+ */
146
+ function preparado(raiz, quem) {
147
+ let encontrado;
148
+ let falhaDoGrok = null;
149
+ for (const host of mcp_install_1.HOSTS_MCP) {
150
+ try {
151
+ encontrado = perfilDoHost(raiz, host, encontrado);
108
152
  }
109
- if (JSON.stringify(argv) !== JSON.stringify(legado)) {
110
- if (!Array.isArray(argv) || argv.length !== padrao.args.length ||
111
- argv[argv.length - 2] !== '--ship-transport' || !['github-ssh', 'bare-local'].includes(argv[argv.length - 1]))
112
- throw Error('runtime.context.conflict: MCP Orkastery divergente; transporte invalido ou argumentos extras');
113
- transporte = argv[argv.length - 1];
153
+ catch (erro) {
154
+ if (host !== 'grok' || quem === undefined || quem === 'grok')
155
+ throw erro;
156
+ falhaDoGrok = erro;
114
157
  }
115
- const esperado = (0, mcp_install_1.configuracaoServidorMcp)(raiz, host, undefined, transporte);
116
- if (entrada.command !== esperado.command || (JSON.stringify(argv) !== JSON.stringify(esperado.args) && JSON.stringify(argv) !== JSON.stringify(legado)))
117
- throw Error('runtime.context.conflict: MCP Orkastery divergente; repare a instalacao do projeto');
118
- if (encontrado !== undefined && encontrado.transporteShip !== transporte)
119
- throw Error('runtime.context.conflict: transportes SHIP divergentes entre hosts');
120
- if (encontrado !== undefined && encontrado.permissoesFilho !== permissoesFilho)
121
- throw Error('runtime.context.conflict: perfis de filho divergentes entre hosts');
122
- encontrado = { ...encontrado, transporteShip: transporte, permissoesFilho, ...(host === 'codex' ? { politicasCodex: entrada } : {}) };
123
158
  }
159
+ if (falhaDoGrok !== null && encontrado === undefined && podeTerEntradaDoOrk(raiz))
160
+ throw falhaDoGrok;
124
161
  return encontrado;
125
162
  }
163
+ /** O `.grok/config.toml` do projeto tem, ou pode ter, a entrada `orkastery`; o que nao se le conta como se tivesse. */
164
+ function podeTerEntradaDoOrk(raiz) {
165
+ try {
166
+ return ler(raiz, (0, mcp_install_1.arquivoDoHostMcp)(raiz, 'grok'), 262144).toString('utf8').includes('orkastery');
167
+ }
168
+ catch {
169
+ return true;
170
+ }
171
+ }
126
172
  function raizCanonica(projeto) {
127
173
  if (!path.isAbsolute(projeto))
128
174
  throw Error('runtime.context.invalid: projeto absoluto obrigatorio');
@@ -133,30 +179,141 @@ function raizCanonica(projeto) {
133
179
  dentro(raiz, path.join(raiz, '.orkastery'));
134
180
  return raiz;
135
181
  }
182
+ function hostDoRuntime(runtime) {
183
+ if (runtime === 'claude-bg')
184
+ return 'claude-code';
185
+ if (runtime === 'codex')
186
+ return 'codex';
187
+ if (runtime === 'grok')
188
+ return 'grok';
189
+ throw Error('runtime.context.invalid: runtime desconhecido');
190
+ }
191
+ /** Confere o recibo e todos os bytes do adaptador antes de considerar o runtime um destino. */
192
+ function conferirInstalacaoDoHost(raiz, host) {
193
+ const def = hosts_1.HOSTS[host];
194
+ const instalacao = path.join(raiz, def.destinoPadrao, def.subdir ?? '');
195
+ let recibo;
196
+ try {
197
+ recibo = objeto(JSON.parse(ler(raiz, path.join(instalacao, 'INSTALADO.json'), 1048576).toString('utf8')));
198
+ }
199
+ catch {
200
+ throw Error('runtime.context.installation: instale/verifique o adaptador do runtime neste projeto');
201
+ }
202
+ if (recibo.contrato !== 'ork.adapter-install/v1' || recibo.host !== host || !Array.isArray(recibo.arquivos) || recibo.arquivos.length > 512)
203
+ throw Error('runtime.context.installation: recibo instalado invalido');
204
+ const arquivos = new Map();
205
+ // RM-059 (T0.7): os bytes ja conferidos da declaracao e do manifesto de cada mod, lidos uma vez so.
206
+ const conferidos = new Map();
207
+ for (const item of recibo.arquivos) {
208
+ const a = objeto(item);
209
+ if (typeof a.arquivo !== 'string' || path.isAbsolute(a.arquivo) || a.arquivo.split(/[\\/]/).includes('..') ||
210
+ typeof a.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(a.sha256) || arquivos.has(a.arquivo))
211
+ throw Error('runtime.context.installation: arquivo do recibo invalido');
212
+ const file = path.join(instalacao, a.arquivo);
213
+ if (!dentro(raiz, file).startsWith(instalacao + path.sep))
214
+ throw Error('runtime.context.installation: bytes instalados divergentes');
215
+ const bytes = ler(raiz, file, 1048576);
216
+ if ((0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex') !== a.sha256)
217
+ throw Error('runtime.context.installation: bytes instalados divergentes');
218
+ arquivos.set(a.arquivo, file);
219
+ if (DECLARACAO_OU_MANIFESTO_DE_MOD.test(a.arquivo))
220
+ conferidos.set(a.arquivo, bytes);
221
+ }
222
+ const bootstrap = arquivos.get('skills/core/orkastery-bootstrap/SKILL.md');
223
+ if (!bootstrap || (host === 'claude-code' && !arquivos.has('.claude-plugin/plugin.json')))
224
+ throw Error('runtime.context.installation: catalogo ou plugin incompleto');
225
+ return { instalacao, arquivos, conferidos, bootstrap };
226
+ }
227
+ /**
228
+ * Um projeto preparado so pode escolher runtimes cujo adaptador esteja instalado e integro.
229
+ * Projeto legado, sem entrada MCP do Orkastery, conserva a selecao anterior.
230
+ */
231
+ function capacidadeDoRuntimeNoProjeto(projeto, runtime) {
232
+ let host = null;
233
+ try {
234
+ const raiz = raizCanonica(projeto);
235
+ const perfil = preparado(raiz, runtime);
236
+ if (!perfil)
237
+ return { runtime, host: null, preparado: false, capaz: true, motivo: null };
238
+ if (exports.RUNTIMES_SEM_HOST_MCP.includes(runtime))
239
+ return { runtime, host: null, preparado: true, capaz: false, motivo: exports.MOTIVO_SEM_HOST_MCP };
240
+ host = hostDoRuntime(runtime);
241
+ // RM-067 (F4b, G6): o grok nao tem adaptador instalavel (plugin, skills, mods); o contexto dele e so o MCP.
242
+ if (host !== 'grok')
243
+ conferirInstalacaoDoHost(raiz, host);
244
+ if (exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS.includes(runtime))
245
+ return { runtime, host, preparado: true, capaz: false, motivo: exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS };
246
+ return { runtime, host, preparado: true, capaz: true, motivo: null };
247
+ }
248
+ catch (erro) {
249
+ return { runtime, host, preparado: true, capaz: false, motivo: erro.message };
250
+ }
251
+ }
252
+ /**
253
+ * RM-067 (D15 da ork-grokbuild): runtimes homologados que ainda nao tem host MCP do Orkastery. A sessao filha deles
254
+ * despacha sem contexto, como num projeto sem entrada MCP, ate o host existir. A capacidade de rotacao
255
+ * (`capacidadeDoRuntimeNoProjeto`) nao muda: num projeto preparado, eles seguem fora dos destinos automaticos.
256
+ * RM-067 (F4b, G6): o grok saiu daqui com o host `grok`; a lista fica para o proximo runtime sem host.
257
+ */
258
+ exports.RUNTIMES_SEM_HOST_MCP = [];
259
+ /** RM-067 (F4): o motivo tipado de um runtime sem host MCP num projeto preparado. */
260
+ exports.MOTIVO_SEM_HOST_MCP = 'runtime.context.no-host: runtime sem host MCP do Orkastery; a sessao despacha sem o contexto do projeto';
261
+ /**
262
+ * RM-067 (F4b, GO-FIX A5; F4c, D9): runtimes com o host MCP que, num projeto preparado, ficam fora dos destinos
263
+ * automaticos (o fallback do retry e a escada), porque o servidor MCP do ork nao grava o estado na sessao deles e a fase
264
+ * que chega por fallback pararia sem prova. O grok ficou aqui da F4b a F4c: o sandbox dele vale para o processo inteiro e
265
+ * os filhos (G17 da RM-067), e o servidor stdio era filho dele. Desde a F4c o servidor e um processo do ork, fora do
266
+ * sandbox (`adapters/grok-mcp.ts`), e a fase do grok no piso `workspace` fecha com prova; a lista fica vazia, para o
267
+ * proximo runtime cujo MCP nao grave o estado, como `RUNTIMES_SEM_HOST_MCP`.
268
+ */
269
+ exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS = [];
270
+ exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS = 'runtime.context.sandbox: o sandbox do runtime vale tambem para o servidor MCP do ' +
271
+ 'ork, que nao grava o estado; como destino automatico num projeto preparado, o runtime fica fora';
272
+ /**
273
+ * RM-067 (F4): a capacidade de um runtime para a rotacao do retry. A troca de perfil DENTRO do runtime em que a thread ja
274
+ * despachou (`mesmoRuntime`) vale para o runtime sem host MCP e para o que fica fora dos destinos automaticos: a sessao
275
+ * dele ja roda como rodava, e a outra conta nao muda isso, entao o `ork retry` troca o perfil dele como troca o dos outros
276
+ * runtimes. Como alvo de fallback num projeto preparado, ele segue incapaz. Desde a F4c, nenhum runtime homologado esta
277
+ * nas duas listas, e o grok e capaz nos dois papeis.
278
+ */
279
+ function capacidadeDaRotacao(projeto, runtime, mesmoRuntime) {
280
+ const capacidade = capacidadeDoRuntimeNoProjeto(projeto, runtime);
281
+ if (capacidade.capaz || !mesmoRuntime)
282
+ return capacidade;
283
+ const soComoDestino = (exports.RUNTIMES_SEM_HOST_MCP.includes(runtime) && capacidade.motivo === exports.MOTIVO_SEM_HOST_MCP) ||
284
+ (exports.RUNTIMES_FORA_DOS_DESTINOS_AUTOMATICOS.includes(runtime) && capacidade.motivo === exports.MOTIVO_FORA_DOS_DESTINOS_AUTOMATICOS);
285
+ return soComoDestino ? { ...capacidade, capaz: true } : capacidade;
286
+ }
136
287
  /** Projeto sem entrada MCP Orkastery continua com o contrato legado. Nao instala nem altera arquivos. */
137
288
  function contextoDoProjeto(projeto, runtime, cwd, threadId) {
138
289
  const raiz = raizCanonica(projeto);
139
- const perfil = preparado(raiz);
290
+ const perfil = preparado(raiz, runtime);
140
291
  if (!perfil)
141
292
  return undefined;
142
- if (!['claude-bg', 'codex'].includes(runtime))
143
- throw Error('runtime.context.invalid: runtime desconhecido');
293
+ if (exports.RUNTIMES_SEM_HOST_MCP.includes(runtime))
294
+ return undefined;
295
+ const host = hostDoRuntime(runtime);
144
296
  if (!threadId)
145
297
  throw Error('runtime.context.invalid: thread obrigatoria para sessao filha');
146
- const contexto = { projeto: raiz, host: runtime === 'codex' ? 'codex' : 'claude-code', threadId, transporteShip: perfil.transporteShip, permissoesFilho: perfil.permissoesFilho };
147
- validarContextoRuntime(contexto, cwd);
298
+ const contexto = { projeto: raiz, host, threadId, transporteShip: perfil.transporteShip, permissoesFilho: perfil.permissoesFilho };
299
+ if (host === 'grok')
300
+ validarContextoDoGrok(contexto, cwd);
301
+ else
302
+ validarContextoRuntime(contexto, cwd);
148
303
  return contexto;
149
304
  }
150
- /** Revalida no receptor do despacho, incluindo bytes instalados e escopo real do cwd. */
151
- function validarContextoRuntime(contexto, cwd) {
152
- if (!contexto || !['claude-code', 'codex'].includes(contexto.host))
153
- throw Error('runtime.context.invalid: host desconhecido');
154
- if (contexto.transporteShip !== undefined && !['github-ssh', 'bare-local'].includes(contexto.transporteShip))
305
+ /**
306
+ * A conferencia do vinculo, comum a todo host: projeto preparado, perfil e transporte iguais aos da instalacao, cwd e
307
+ * thread da sessao filha, identidade do despacho e, no perfil worktree, a worktree propria da thread. RM-067 (F4b, D2):
308
+ * saiu de `validarContextoRuntime` sem mudar a ordem das conferencias, para o contexto do grok usar a mesma.
309
+ */
310
+ function conferirVinculo(contexto, cwd) {
311
+ if (contexto.transporteShip !== undefined && !(0, mcp_transportes_1.ehTransporteShipMcp)(contexto.transporteShip))
155
312
  throw Error('runtime.context.invalid: transporte desconhecido');
156
313
  const raiz = raizCanonica(contexto.projeto);
157
314
  if (contexto.permissoesFilho !== undefined && !['interactive', 'worktree'].includes(contexto.permissoesFilho))
158
315
  throw Error('runtime.context.invalid: perfil de filho desconhecido');
159
- const perfil = preparado(raiz);
316
+ const perfil = preparado(raiz, contexto.host);
160
317
  if (!perfil)
161
318
  throw Error('runtime.context.missing: projeto nao preparado pelo instalador MCP');
162
319
  const { transporteShip, permissoesFilho } = perfil;
@@ -183,38 +340,14 @@ function validarContextoRuntime(contexto, cwd) {
183
340
  if (!(0, worktree_1.worktreesDoGit)(raiz).some(w => w.dir === cwd && w.branch === (0, worktree_1.branchDaWorktree)(thread)))
184
341
  throw Error('runtime.context.worktree: worktree nao registrada na branch da thread');
185
342
  }
186
- const def = hosts_1.HOSTS[contexto.host];
187
- const instalacao = path.join(raiz, def.destinoPadrao, def.subdir ?? '');
188
- let recibo;
189
- try {
190
- recibo = objeto(JSON.parse(ler(raiz, path.join(instalacao, 'INSTALADO.json'), 1048576).toString('utf8')));
191
- }
192
- catch {
193
- throw Error('runtime.context.installation: instale/verifique o adaptador do runtime neste projeto');
194
- }
195
- if (recibo.contrato !== 'ork.adapter-install/v1' || recibo.host !== contexto.host || !Array.isArray(recibo.arquivos) || recibo.arquivos.length > 512)
196
- throw Error('runtime.context.installation: recibo instalado invalido');
197
- const arquivos = new Map();
198
- // RM-059 (T0.7): os bytes ja conferidos da declaracao e do manifesto de cada mod, lidos uma vez so.
199
- const conferidos = new Map();
200
- for (const item of recibo.arquivos) {
201
- const a = objeto(item);
202
- if (typeof a.arquivo !== 'string' || path.isAbsolute(a.arquivo) || a.arquivo.split(/[\\/]/).includes('..') ||
203
- typeof a.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(a.sha256) || arquivos.has(a.arquivo))
204
- throw Error('runtime.context.installation: arquivo do recibo invalido');
205
- const file = path.join(instalacao, a.arquivo);
206
- if (!dentro(raiz, file).startsWith(instalacao + path.sep))
207
- throw Error('runtime.context.installation: bytes instalados divergentes');
208
- const bytes = ler(raiz, file, 1048576);
209
- if ((0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex') !== a.sha256)
210
- throw Error('runtime.context.installation: bytes instalados divergentes');
211
- arquivos.set(a.arquivo, file);
212
- if (DECLARACAO_OU_MANIFESTO_DE_MOD.test(a.arquivo))
213
- conferidos.set(a.arquivo, bytes);
214
- }
215
- const bootstrap = arquivos.get('skills/core/orkastery-bootstrap/SKILL.md');
216
- if (!bootstrap || (contexto.host === 'claude-code' && !arquivos.has('.claude-plugin/plugin.json')))
217
- throw Error('runtime.context.installation: catalogo ou plugin incompleto');
343
+ return { raiz, perfil, transporteShip, permissoesFilho, thread };
344
+ }
345
+ /** Revalida no receptor do despacho, incluindo bytes instalados e escopo real do cwd. */
346
+ function validarContextoRuntime(contexto, cwd) {
347
+ if (!contexto || (contexto.host !== 'claude-code' && contexto.host !== 'codex'))
348
+ throw Error('runtime.context.invalid: host desconhecido');
349
+ const { raiz, perfil, transporteShip, permissoesFilho, thread } = conferirVinculo(contexto, cwd);
350
+ const { instalacao, arquivos, conferidos, bootstrap } = conferirInstalacaoDoHost(raiz, contexto.host);
218
351
  const modsDeFase = contexto.host === 'claude-code' ? modsDeFaseInstalados(raiz, instalacao, arquivos, conferidos) : [];
219
352
  // Capacidade derivada do bloco atual, nunca aceita como entrada do modelo.
220
353
  const permiteEditarProduto = permissoesFilho === 'worktree' && (0, thread_1.blocoDaThread)(thread, thread.faseAtual).fases.includes('GO');
@@ -233,6 +366,25 @@ function validarContextoRuntime(contexto, cwd) {
233
366
  ...(contexto.host === 'codex' && permissoesFilho === 'worktree' ? (0, mcp_install_1.politicasFilhoCodex)(perfil.politicasCodex ?? {}) : {}) };
234
367
  return { projeto: raiz, instalacao, bootstrap, permissoesFilho, permiteEditarProduto, grafoMcp, servidor, modsDeFase, agentTeams };
235
368
  }
369
+ /**
370
+ * RM-067 (F4b, D2): o contexto do grok, revalidado no despacho. O vinculo e o mesmo dos outros hosts; nao ha adaptador
371
+ * instalado a conferir (o grok nao tem plugin, skills nem mods do Orkastery). Devolve o que o comando e o despacho usam:
372
+ * o perfil filho, a flag do grafo da raiz e, desde a F4c, a especificacao do servidor externo vinculado a thread e ao despacho.
373
+ */
374
+ function validarContextoDoGrok(contexto, cwd) {
375
+ if (!contexto || contexto.host !== 'grok')
376
+ throw Error('runtime.context.invalid: host grok esperado');
377
+ const { raiz, transporteShip, permissoesFilho, thread } = conferirVinculo(contexto, cwd);
378
+ // RM-067 (F4b, GO-FIX B1): a config da sessao vai no cwd; na raiz do projeto ela viraria a entrada do host grok.
379
+ if (!thread.worktree || thread.worktree === raiz || cwd === raiz)
380
+ throw Error('runtime.context.worktree: o grok com o MCP do ork exige a worktree propria da thread; a config da sessao nunca vai a raiz do projeto');
381
+ const grafoMcp = (0, mcp_grafo_1.grafoLigado)((0, manifest_1.exigirManifesto)(raiz).manifesto);
382
+ const publicVerifiers = (0, hitl_public_receipt_1.publicHitlVerifiers)();
383
+ const servidor = { projeto: raiz, threadId: contexto.threadId,
384
+ dispatchId: contexto.identidade?.dispatchId ?? null, permissoesFilho, transporteShip,
385
+ ...(publicVerifiers ? { env: { [hitl_public_receipt_1.ENV_HITL_VERIFIERS]: publicVerifiers } } : {}) };
386
+ return { projeto: raiz, threadId: contexto.threadId, permissoesFilho, grafoMcp, servidor };
387
+ }
236
388
  const DECLARACAO_OU_MANIFESTO_DE_MOD = /^mods\/[^/]+\/(?:orkastery-mod\.json|\.claude-plugin\/plugin\.json)$/;
237
389
  const DECLARACAO_DE_MOD = /^mods\/([^/]+)\/orkastery-mod\.json$/;
238
390
  const NOME_DE_MOD = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
@@ -279,14 +431,52 @@ function dependenciasDoManifesto(texto) {
279
431
  return typeof nome === 'string' && nome ? [nome.split('@')[0]] : [];
280
432
  });
281
433
  }
282
- /** Os tipos que o proprio Claude Code escreve na pasta do mod que ele carrega: declaracoes, nunca codigo. */
283
- function tipoDoMotor(relativo) {
284
- return relativo.startsWith('.claude-plugin/types/') && (relativo.endsWith('.d.ts') || path.posix.basename(relativo) === 'tsconfig.json');
434
+ /** Os arquivos comuns que o proprio Claude Code escreve na pasta do mod que ele carrega: declaracoes, nunca codigo. */
435
+ function arquivoDoMotor(raiz, arquivo, relativo) {
436
+ if (relativo === '.claude-plugin/types/.gitignore')
437
+ return true;
438
+ if (relativo.startsWith('.claude-plugin/types/') &&
439
+ (relativo.endsWith('.d.ts') || path.posix.basename(relativo) === 'tsconfig.json'))
440
+ return true;
441
+ if (relativo !== 'tsconfig.json')
442
+ return false;
443
+ try {
444
+ const config = objeto(JSON.parse(ler(raiz, arquivo, 4096).toString('utf8')));
445
+ return Object.keys(config).length === 1 && config.extends === './.claude-plugin/types/tsconfig.json';
446
+ }
447
+ catch {
448
+ return false;
449
+ }
450
+ }
451
+ /** Link de tipos gerado pelo Claude Code: o alvo real continua preso a um .d.ts comprovado pelo recibo. */
452
+ function linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos) {
453
+ if (!relativo.startsWith('.claude-plugin/types/') || !relativo.endsWith('.d.ts'))
454
+ return false;
455
+ let alvo;
456
+ try {
457
+ alvo = fs.realpathSync(arquivo);
458
+ }
459
+ catch {
460
+ return false;
461
+ }
462
+ const relativoAoRecibo = path.relative(instalacao, alvo).split(path.sep).join('/');
463
+ if (!/^mods\/[^/]+\/types\/[^/]+\.d\.ts$/.test(relativoAoRecibo))
464
+ return false;
465
+ const comprovado = arquivos.get(relativoAoRecibo);
466
+ if (!comprovado)
467
+ return false;
468
+ try {
469
+ return fs.realpathSync(comprovado) === alvo && fs.statSync(alvo).isFile();
470
+ }
471
+ catch {
472
+ return false;
473
+ }
285
474
  }
286
475
  /**
287
476
  * RM-059 (T0.7, D1): a pasta instalada de um mod de fase tem exatamente os arquivos do recibo. O
288
477
  * `--plugin-dir` carrega o que estiver nela (comandos, agentes e skills sao descobertos), entao arquivo
289
- * fora do recibo entraria na sessao de fase sem prova. Link e arquivo especial recusam sempre.
478
+ * fora do recibo entraria na sessao de fase sem prova. So o link de tipos gerado pelo motor conserva
479
+ * a prova pelo alvo real; outro link e arquivo especial recusam sempre.
290
480
  */
291
481
  function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
292
482
  const dir = path.join(instalacao, 'mods', nome);
@@ -296,15 +486,19 @@ function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
296
486
  const visitar = (atual, prefixo) => {
297
487
  for (const entrada of fs.readdirSync(atual, { withFileTypes: true })) {
298
488
  const relativo = prefixo ? `${prefixo}/${entrada.name}` : entrada.name;
299
- if (entrada.isSymbolicLink())
489
+ const arquivo = path.join(atual, entrada.name);
490
+ if (entrada.isSymbolicLink()) {
491
+ if (linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos))
492
+ continue;
300
493
  throw recusa(`link em ${relativo}`);
494
+ }
301
495
  if (entrada.isDirectory()) {
302
496
  visitar(path.join(atual, entrada.name), relativo);
303
497
  continue;
304
498
  }
305
499
  if (!entrada.isFile())
306
500
  throw recusa(`arquivo especial em ${relativo}`);
307
- if (!arquivos.has(`mods/${nome}/${relativo}`) && !tipoDoMotor(relativo)) {
501
+ if (!arquivos.has(`mods/${nome}/${relativo}`) && !arquivoDoMotor(raiz, arquivo, relativo)) {
308
502
  throw recusa(`arquivo fora do INSTALADO.json (${relativo})`, 'se ele saiu do catalogo, ork adapter install claude-code o tira da copia; ' +
309
503
  `se foi editado ou acrescentado a mao, apague ${path.join(dir, relativo)}`);
310
504
  }