@orkastery/cli 0.5.6 → 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 (385) 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 +118 -4
  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/atualizar-branch.js +245 -0
  105. package/dist/auditoria.js +13 -11
  106. package/dist/auditrun.js +51 -46
  107. package/dist/autorizacao-duravel.js +327 -0
  108. package/dist/board.js +94 -40
  109. package/dist/branch-de-estado.js +16 -8
  110. package/dist/busca-semantica.js +7 -5
  111. package/dist/catalogo.js +2 -1
  112. package/dist/changelog-reconciliacao.js +290 -0
  113. package/dist/check-agil.js +500 -0
  114. package/dist/check-modo.js +41 -0
  115. package/dist/check-paralelo.js +183 -0
  116. package/dist/ci.js +248 -45
  117. package/dist/ciclos.js +8 -6
  118. package/dist/claim-lint.js +12 -8
  119. package/dist/claims-conferir.js +47 -39
  120. package/dist/claims.js +10 -9
  121. package/dist/company-brain-client.js +10 -3
  122. package/dist/company-brain-migration.js +11 -5
  123. package/dist/conducao-batida.js +759 -0
  124. package/dist/conducao-sentinela.js +25 -8
  125. package/dist/conducao.js +84 -29
  126. package/dist/conhecimento-consulta.js +270 -0
  127. package/dist/conhecimento.js +111 -87
  128. package/dist/conta-esgotada.js +127 -0
  129. package/dist/dado-privado.js +816 -0
  130. package/dist/decisao-autonoma.js +5 -4
  131. package/dist/demo.js +14 -12
  132. package/dist/dependencias-da-worktree.js +25 -0
  133. package/dist/divida.js +38 -36
  134. package/dist/docs.js +81 -74
  135. package/dist/doctor-forja.js +345 -0
  136. package/dist/doctor-pulse-cron.js +113 -1
  137. package/dist/doctor.js +164 -6
  138. package/dist/dsn-da-memoria.js +417 -0
  139. package/dist/entrega-por-mod.js +503 -0
  140. package/dist/entrega-pr.js +143 -43
  141. package/dist/esgotamentos.js +13 -11
  142. package/dist/estado-thread.js +21 -18
  143. package/dist/evalrunner.js +35 -32
  144. package/dist/fabrica-batida.js +34 -21
  145. package/dist/fabrica-estado.js +13 -10
  146. package/dist/fix.js +21 -19
  147. package/dist/forja/adaptador.js +6 -0
  148. package/dist/forja/ambiente-de-ci.js +27 -0
  149. package/dist/forja/api.js +256 -0
  150. package/dist/forja/cache.js +89 -0
  151. package/dist/forja/cli.js +60 -0
  152. package/dist/forja/contrato.js +9 -0
  153. package/dist/forja/endereco.js +43 -0
  154. package/dist/forja/estado.js +22 -0
  155. package/dist/forja/executor.js +73 -0
  156. package/dist/forja/github/ci.js +95 -0
  157. package/dist/forja/github/dono-da-rede.js +18 -0
  158. package/dist/forja/github/metadados.js +15 -0
  159. package/dist/forja/github/pedidos.js +200 -0
  160. package/dist/forja/gitlab/ci.js +141 -0
  161. package/dist/forja/gitlab/consultas.js +59 -0
  162. package/dist/forja/gitlab/dono-da-rede.js +43 -0
  163. package/dist/forja/gitlab/metadados.js +15 -0
  164. package/dist/forja/gitlab/pedidos-abertos.js +158 -0
  165. package/dist/forja/gitlab/pedidos.js +141 -0
  166. package/dist/forja/produtor.js +32 -0
  167. package/dist/forja/registro.js +31 -0
  168. package/dist/forja/resolver.js +121 -0
  169. package/dist/forja/texto.js +13 -0
  170. package/dist/forja/versao.js +71 -0
  171. package/dist/forja.js +123 -80
  172. package/dist/handoff.js +23 -13
  173. package/dist/hitl-contract.js +46 -43
  174. package/dist/hitl-curto.js +37 -25
  175. package/dist/hitl-gates.js +13 -11
  176. package/dist/hitl-local-receipt.js +51 -0
  177. package/dist/hitl-local.js +11 -2
  178. package/dist/hitl-lock.js +5 -11
  179. package/dist/hitl-public-receipt.js +11 -0
  180. package/dist/hitl-resumo.js +44 -1
  181. package/dist/hitl-sessions.js +62 -9
  182. package/dist/hitl-texto-livre.js +7 -4
  183. package/dist/hitl.js +34 -31
  184. package/dist/horario.js +16 -0
  185. package/dist/hosts.js +104 -134
  186. package/dist/index.js +848 -548
  187. package/dist/indice-vetorial.js +14 -12
  188. package/dist/init.js +11 -2
  189. package/dist/integracoes-locais.js +2 -0
  190. package/dist/intelligence-graph-cli.js +123 -69
  191. package/dist/intelligence-graph-query.js +37 -22
  192. package/dist/leases.js +19 -18
  193. package/dist/ledger-stats.js +17 -16
  194. package/dist/ledger.js +31 -1
  195. package/dist/licoes.js +12 -11
  196. package/dist/locale-accounts.js +220 -0
  197. package/dist/locale-adapter.js +291 -0
  198. package/dist/locale-ajuda.js +76 -4
  199. package/dist/locale-audit.js +199 -0
  200. package/dist/locale-claims.js +213 -0
  201. package/dist/locale-conducao.js +138 -0
  202. package/dist/locale-conhecimento.js +181 -0
  203. package/dist/locale-decisao.js +205 -0
  204. package/dist/locale-docs.js +230 -0
  205. package/dist/locale-estado.js +101 -0
  206. package/dist/locale-forja.js +290 -0
  207. package/dist/locale-gerados.js +5 -0
  208. package/dist/locale-grafo.js +129 -0
  209. package/dist/locale-master.js +83 -0
  210. package/dist/locale-network.js +524 -0
  211. package/dist/locale-operacao-restante.js +931 -0
  212. package/dist/locale-projetos.js +100 -0
  213. package/dist/locale-prompts.js +194 -0
  214. package/dist/locale-pulse.js +140 -2
  215. package/dist/locale-reservas.js +87 -0
  216. package/dist/locale-retry.js +145 -6
  217. package/dist/locale-security-scan.js +69 -0
  218. package/dist/locale-setup.js +192 -0
  219. package/dist/locale-ship.js +169 -66
  220. package/dist/locale-thread.js +149 -5
  221. package/dist/locale-verify.js +80 -4
  222. package/dist/locale-worktree.js +246 -0
  223. package/dist/locale.js +553 -9
  224. package/dist/maestro-runtime.js +22 -3
  225. package/dist/manifest.js +287 -11
  226. package/dist/maquina-ociosa.js +211 -0
  227. package/dist/maquina.js +10 -5
  228. package/dist/master-nota-local.js +200 -0
  229. package/dist/master-nota.js +10 -2
  230. package/dist/master.js +118 -41
  231. package/dist/mcp-conhecimento.js +52 -0
  232. package/dist/mcp-experiencia.js +26 -5
  233. package/dist/mcp-install.js +73 -8
  234. package/dist/mcp-noctum.js +101 -0
  235. package/dist/mcp-server.js +82 -14
  236. package/dist/mcp-ship-transporte.js +977 -0
  237. package/dist/mcp-ship.js +68 -24
  238. package/dist/mcp-transportes.js +17 -0
  239. package/dist/memoria.js +63 -58
  240. package/dist/modos-migracao.js +8 -6
  241. package/dist/modos.js +17 -18
  242. package/dist/network-roadmap.js +85 -49
  243. package/dist/noctum-aceite.js +789 -0
  244. package/dist/noctum-arco.js +540 -33
  245. package/dist/noctum-capacidade.js +3 -3
  246. package/dist/noctum-changelog.js +399 -0
  247. package/dist/noctum-cli.js +482 -0
  248. package/dist/noctum-coordenacao.js +1225 -0
  249. package/dist/noctum-entrega.js +1169 -0
  250. package/dist/noctum-envelope.js +252 -16
  251. package/dist/noctum-execucao.js +95 -23
  252. package/dist/noctum-fechamento.js +405 -0
  253. package/dist/noctum-fila.js +43 -9
  254. package/dist/noctum-guarda.js +256 -0
  255. package/dist/noctum-integracao.js +507 -0
  256. package/dist/noctum-maquinas.js +383 -0
  257. package/dist/noctum-medicao.js +450 -0
  258. package/dist/noctum-modo.js +362 -0
  259. package/dist/noctum-pergunta-canal.js +96 -0
  260. package/dist/noctum-pergunta.js +115 -0
  261. package/dist/noctum-provas.js +838 -0
  262. package/dist/noctum-reconciliacao.js +591 -0
  263. package/dist/noctum-registro.js +215 -0
  264. package/dist/noctum-relatorio.js +827 -0
  265. package/dist/noctum-resposta.js +207 -0
  266. package/dist/noctum-sessoes-em-voo.js +93 -0
  267. package/dist/noctum-supervisao.js +649 -0
  268. package/dist/noctum-terminal.js +459 -0
  269. package/dist/noctum-transporte.js +655 -0
  270. package/dist/noctum-vigia.js +639 -0
  271. package/dist/ocupacao.js +3 -1
  272. package/dist/onboarding.js +16 -5
  273. package/dist/orkmind.js +39 -23
  274. package/dist/orquestracao.js +31 -35
  275. package/dist/parado-no-condutor.js +146 -124
  276. package/dist/phase.js +53 -27
  277. package/dist/policies.js +33 -0
  278. package/dist/postura-local.js +4 -3
  279. package/dist/procedencia.js +9 -14
  280. package/dist/projeto-alvo.js +59 -20
  281. package/dist/prompts.js +136 -42
  282. package/dist/prova-minima.js +5 -6
  283. package/dist/pulse-cadencia.js +5 -4
  284. package/dist/pulse-consentimento.js +53 -1
  285. package/dist/pulse-delivery.js +143 -27
  286. package/dist/pulse-resposta.js +368 -4
  287. package/dist/pulse.js +136 -3
  288. package/dist/ratelimit.js +12 -4
  289. package/dist/recall.js +14 -13
  290. package/dist/rede-adesao.js +13 -8
  291. package/dist/rede-forja.js +108 -24
  292. package/dist/rede-status.js +63 -45
  293. package/dist/rede.js +86 -46
  294. package/dist/retomada-checkpoint.js +101 -0
  295. package/dist/retry.js +228 -73
  296. package/dist/roadmap-reservas.js +32 -32
  297. package/dist/runtime-ambiente.js +5 -0
  298. package/dist/runtime-context.js +117 -43
  299. package/dist/runtime-escada.js +423 -0
  300. package/dist/runtime-profiles.js +103 -46
  301. package/dist/saida-segura.js +3 -2
  302. package/dist/security-scan/agil.js +355 -0
  303. package/dist/security-scan/cli.js +76 -0
  304. package/dist/security-scan/compare.js +149 -0
  305. package/dist/security-scan/config.js +93 -0
  306. package/dist/security-scan/detect.js +97 -0
  307. package/dist/security-scan/executor.js +188 -0
  308. package/dist/security-scan/guard.js +180 -0
  309. package/dist/security-scan/imagem-de-lint.js +96 -0
  310. package/dist/security-scan/normalize/actionlint.js +12 -0
  311. package/dist/security-scan/normalize/eslint.js +12 -0
  312. package/dist/security-scan/normalize/gitleaks.js +13 -0
  313. package/dist/security-scan/normalize/golangci-lint.js +13 -0
  314. package/dist/security-scan/normalize/govulncheck.js +36 -0
  315. package/dist/security-scan/normalize/index.js +25 -0
  316. package/dist/security-scan/normalize/npm-audit.js +30 -0
  317. package/dist/security-scan/normalize/osv-scanner.js +32 -0
  318. package/dist/security-scan/normalize/oxlint.js +51 -0
  319. package/dist/security-scan/normalize/pip-audit.js +16 -0
  320. package/dist/security-scan/normalize/ruff.js +12 -0
  321. package/dist/security-scan/normalize/semgrep.js +20 -0
  322. package/dist/security-scan/normalize/trivy.js +33 -0
  323. package/dist/security-scan/normalize/util.js +204 -0
  324. package/dist/security-scan/normalize/zizmor.js +19 -0
  325. package/dist/security-scan/report.js +156 -0
  326. package/dist/security-scan/run.js +448 -0
  327. package/dist/security-scan/tools.js +62 -0
  328. package/dist/security-scan/trabalhador.js +74 -0
  329. package/dist/security-scan/types.js +15 -0
  330. package/dist/session-events.js +19 -2
  331. package/dist/session-watcher-claude.js +74 -19
  332. package/dist/session-watcher.js +156 -10
  333. package/dist/sessoes-contas.js +9 -0
  334. package/dist/sessoes-inventario.js +1 -1
  335. package/dist/sessoes.js +25 -23
  336. package/dist/setup.js +59 -58
  337. package/dist/ship-publicar.js +263 -92
  338. package/dist/ship.js +160 -17
  339. package/dist/superficie.js +14 -11
  340. package/dist/thread-close.js +9 -9
  341. package/dist/thread.js +121 -18
  342. package/dist/tokens.js +15 -11
  343. package/dist/trabalho-thread.js +297 -0
  344. package/dist/transporte-do-canal.js +189 -0
  345. package/dist/types.js +12 -1
  346. package/dist/util.js +5 -2
  347. package/dist/varredura-acoes.js +507 -0
  348. package/dist/verify.js +472 -29
  349. package/dist/worktree-local.js +12 -10
  350. package/dist/worktree.js +81 -85
  351. package/eval/casos/check-quality.json +77 -0
  352. package/eval/casos/security-auditor.json +148 -0
  353. package/eval/casos/security-remediation.json +161 -0
  354. package/eval/fixtures/security-scan/README.md +8 -0
  355. package/eval/fixtures/security-scan/go/.github/workflows/ci.yml +12 -0
  356. package/eval/fixtures/security-scan/go/Dockerfile +4 -0
  357. package/eval/fixtures/security-scan/go/README.md +4 -0
  358. package/eval/fixtures/security-scan/go/config.go +4 -0
  359. package/eval/fixtures/security-scan/go/go.mod +5 -0
  360. package/eval/fixtures/security-scan/go/go.sum +2 -0
  361. package/eval/fixtures/security-scan/go/main.go +31 -0
  362. package/eval/fixtures/security-scan/js/.github/workflows/ci.yml +12 -0
  363. package/eval/fixtures/security-scan/js/Dockerfile +3 -0
  364. package/eval/fixtures/security-scan/js/README.md +4 -0
  365. package/eval/fixtures/security-scan/js/package-lock.json +844 -0
  366. package/eval/fixtures/security-scan/js/package.json +10 -0
  367. package/eval/fixtures/security-scan/js/src/config.js +4 -0
  368. package/eval/fixtures/security-scan/js/src/server.js +17 -0
  369. package/eval/fixtures/security-scan/js/src/util.ts +4 -0
  370. package/eval/fixtures/security-scan/js/tsconfig.json +4 -0
  371. package/eval/fixtures/security-scan/python/.github/workflows/ci.yml +12 -0
  372. package/eval/fixtures/security-scan/python/Dockerfile +3 -0
  373. package/eval/fixtures/security-scan/python/README.md +4 -0
  374. package/eval/fixtures/security-scan/python/app/__init__.py +0 -0
  375. package/eval/fixtures/security-scan/python/app/config.py +2 -0
  376. package/eval/fixtures/security-scan/python/app/main.py +19 -0
  377. package/eval/fixtures/security-scan/python/requirements.txt +1 -0
  378. package/package.json +9 -4
  379. package/references/security-checklist.md +3 -3
  380. package/skills/README.md +1 -0
  381. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  382. package/skills/phases/check-quality/SKILL.md +16 -0
  383. package/skills/phases/go-implementation/SKILL.md +6 -0
  384. package/skills/phases/security-remediation/SKILL.md +70 -0
  385. package/skills/reviewers/security-auditor/SKILL.md +25 -0
@@ -195,11 +195,11 @@ function reservarFeat(raiz, opcoes = {}) {
195
195
  for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
196
196
  const { ponta, atualizado } = buscar(raiz, remoto);
197
197
  if (!atualizado)
198
- throw new Error(`roadmap.sem-remoto: nao consegui ler ${exports.BRANCH_DE_RESERVAS} em ${remoto}; reservar exige rede`);
198
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaReservar(exports.BRANCH_DE_RESERVAS, remoto));
199
199
  const feats = featsDaPonta(raiz, ponta);
200
200
  const proximo = Math.max(maiorFeatConhecida(raiz, remoto), ...feats.map((r) => numeroDaFeat(r.feat))) + 1;
201
201
  if (proximo > 999)
202
- throw new Error('roadmap.feat: os numeros de FEAT de tres digitos acabaram');
202
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.featsAcabaram);
203
203
  const feat = `FEAT-${String(proximo).padStart(3, '0')}`;
204
204
  const reserva = { contrato: exports.CONTRATO_FEAT, feat, por: eu.por, maquina: eu.maquina,
205
205
  thread: opcoes.thread ?? null, nota: opcoes.nota ?? null, em: opcoes.agora ?? (0, util_1.agora)() };
@@ -210,7 +210,7 @@ function reservarFeat(raiz, opcoes = {}) {
210
210
  if (commit)
211
211
  return { feat, reserva, commit, tentativas: tentativa };
212
212
  }
213
- throw new Error(`roadmap.concorrencia: ${TENTATIVAS} pushes recusados seguidos; tente de novo em instantes`);
213
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
214
214
  }
215
215
  /** O `RESERVAS.md` da branch: a mesma lista, para quem abre o GitHub. */
216
216
  function painelEmMarkdown(reservas, feats = []) {
@@ -243,14 +243,14 @@ function gravar(raiz, remoto, ponta, mudanca, todas, mensagem, rede = {}) {
243
243
  function ehMinha(r, eu) {
244
244
  return r.por === eu.por && r.maquina === eu.maquina;
245
245
  }
246
- function descrever(r) {
247
- return `${r.item} esta com ${r.por} em ${r.maquina} desde ${(0, horario_1.formatarDataHora)(r.desdeEm)}` +
248
- (r.thread ? ` (thread ${r.thread})` : '');
246
+ /** RM-061 (F3b): a descricao no locale de quem a monta; o erro e o ledger a montam pelo catalogo. */
247
+ function descrever(r, m = (0, locale_1.msg)().reservas) {
248
+ return m.descricao(r.item, r.por, r.maquina, (0, horario_1.formatarDataHora)(r.desdeEm), r.thread ?? null);
249
249
  }
250
250
  function exigirMotivo(opcoes) {
251
251
  const motivo = (opcoes.motivo ?? '').trim();
252
252
  if (!motivo)
253
- throw new Error('roadmap.forcar: --forcar exige --motivo (tomar a reserva de outra maquina e decisao registrada)');
253
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.forcarSemMotivo);
254
254
  return motivo;
255
255
  }
256
256
  /**
@@ -264,7 +264,7 @@ function pegarItem(raiz, item, opcoes = {}) {
264
264
  for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
265
265
  const { ponta, atualizado } = buscar(raiz, remoto, opcoes.rede);
266
266
  if (!atualizado)
267
- throw new Error(`roadmap.sem-remoto: nao consegui ler ${exports.BRANCH_DE_RESERVAS} em ${remoto}; reservar exige rede`);
267
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaReservar(exports.BRANCH_DE_RESERVAS, remoto));
268
268
  const todas = lerDaPonta(raiz, ponta);
269
269
  const atual = todas.find((r) => r.item === id) ?? null;
270
270
  if (opcoes.threadEsperada !== undefined && (atual?.thread ?? null) !== opcoes.threadEsperada) {
@@ -277,7 +277,7 @@ function pegarItem(raiz, item, opcoes = {}) {
277
277
  acao = 'renovou';
278
278
  else if (atual) {
279
279
  if (!opcoes.forcar)
280
- throw new Error(`roadmap.reservado: ${descrever(atual)}. Escolha outro item ou combine com quem esta nele`);
280
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.reservadoAoPegar(descrever(atual, m.reservas)));
281
281
  tomadaDe = { por: atual.por, maquina: atual.maquina, motivo: exigirMotivo(opcoes) };
282
282
  acao = 'tomou';
283
283
  }
@@ -297,7 +297,7 @@ function pegarItem(raiz, item, opcoes = {}) {
297
297
  if (commit)
298
298
  return { acao, item: id, reserva, commit, tentativas: tentativa };
299
299
  }
300
- throw new Error(`roadmap.concorrencia: ${TENTATIVAS} pushes recusados seguidos; tente de novo em instantes`);
300
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
301
301
  }
302
302
  /** `ork roadmap soltar`: devolve o item. Soltar a reserva de outra maquina exige `--forcar --motivo`. */
303
303
  function soltarItem(raiz, item, opcoes = {}) {
@@ -307,7 +307,7 @@ function soltarItem(raiz, item, opcoes = {}) {
307
307
  for (let tentativa = 1; tentativa <= TENTATIVAS; tentativa++) {
308
308
  const { ponta, atualizado } = buscar(raiz, remoto, opcoes.rede);
309
309
  if (!atualizado)
310
- throw new Error(`roadmap.sem-remoto: nao consegui ler ${exports.BRANCH_DE_RESERVAS} em ${remoto}; soltar exige rede`);
310
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaSoltar(exports.BRANCH_DE_RESERVAS, remoto));
311
311
  const todas = lerDaPonta(raiz, ponta);
312
312
  const atual = todas.find((r) => r.item === id);
313
313
  if (!atual)
@@ -318,7 +318,7 @@ function soltarItem(raiz, item, opcoes = {}) {
318
318
  let motivo = '';
319
319
  if (!ehMinha(atual, eu)) {
320
320
  if (!opcoes.forcar)
321
- throw new Error(`roadmap.reservado: ${descrever(atual)}; so quem pegou solta, ou --forcar --motivo`);
321
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.reservadoAoSoltar(descrever(atual, m.reservas)));
322
322
  motivo = `: ${exigirMotivo(opcoes)}`;
323
323
  }
324
324
  const restantes = todas.filter((r) => r.item !== id);
@@ -327,7 +327,7 @@ function soltarItem(raiz, item, opcoes = {}) {
327
327
  if (commit)
328
328
  return { acao: 'soltou', item: id, reserva: atual, commit, tentativas: tentativa };
329
329
  }
330
- throw new Error(`roadmap.concorrencia: ${TENTATIVAS} pushes recusados seguidos; tente de novo em instantes`);
330
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.concorrencia(TENTATIVAS));
331
331
  }
332
332
  function threadsLocais(raiz) {
333
333
  const threads = [];
@@ -367,10 +367,12 @@ function soltarOrfa(raiz, orfa, origem, opcoes) {
367
367
  // A reserva mudou de dono no meio (ou ja tinha saido): nada foi gravado e nada vai ao ledger como soltura.
368
368
  if (r.acao === 'nada') {
369
369
  return { item, thread, acao: 'intocada', para: null, commit: null,
370
- detalhe: `${item} mudou de dono entre a leitura e a gravacao; ficou como estava` };
370
+ detalhe: (0, locale_1.textoDoCatalogo)((m) => m.reservas.mudouDeDono(item)) };
371
371
  }
372
372
  const acao = orfa.sucessora ? 'reapontada' : 'solta';
373
- const detalhe = orfa.sucessora ? `${item} passou para a thread ${orfa.sucessora}, aberta no mesmo item` : `${item} devolvido`;
373
+ // RM-061 (F3b, G4): o detalhe vai ao ledger e ao --json em pt-BR; a impressao o remonta.
374
+ const sucessora = orfa.sucessora;
375
+ const detalhe = (0, locale_1.textoDoCatalogo)((m) => sucessora ? m.reservas.passouPara(item, sucessora) : m.reservas.devolvido(item));
374
376
  // Sugestao 3 do CHECK 2: a soltura ja foi ao remoto; erro so no registro nao a transforma em pendencia.
375
377
  try {
376
378
  (0, ledger_1.registrarSeExiste)((0, thread_1.dirThread)(raiz, thread), thread, ledger_1.TIPOS_DE_EVENTO.reservaLiberada, { item, acao, para: orfa.sucessora, commit: r.commit, origem, detalhe });
@@ -418,7 +420,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
418
420
  return [pendenteDaThread(raiz, threadId, oItem, primeiraLinha(e))];
419
421
  }
420
422
  if (!painel.atualizado) {
421
- return [pendenteDaThread(raiz, threadId, oItem, `sem leitura de ${exports.BRANCH_DE_RESERVAS} em ${remoto}; a reserva fica para depois`)];
423
+ return [pendenteDaThread(raiz, threadId, oItem, (0, locale_1.textoDoCatalogo)((m) => m.reservas.semLeituraPendente(exports.BRANCH_DE_RESERVAS, remoto)))];
422
424
  }
423
425
  const dela = painel.reservas.filter((r) => r.thread === threadId);
424
426
  let orfas;
@@ -432,7 +434,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
432
434
  const saida = [];
433
435
  // Sugestao 1 do CHECK 1: toda reserva da thread, nao so a primeira; a de outra maquina fica pendente.
434
436
  for (const r of dela.filter((x) => !orfas.some((o) => o.reserva.item === x.item))) {
435
- saida.push(pendenteDaThread(raiz, threadId, r.item, `${descrever(r)}; so quem pegou solta, ou --forcar --motivo`));
437
+ saida.push(pendenteDaThread(raiz, threadId, r.item, (0, locale_1.textoDoCatalogo)((m) => m.reservas.soQuemPegou(descrever(r, m.reservas)))));
436
438
  }
437
439
  for (const orfa of orfas) {
438
440
  try {
@@ -451,7 +453,7 @@ function soltarReservaDaThread(raiz, threadId, opcoes = {}) {
451
453
  function soltarReservasOrfas(raiz, opcoes = {}) {
452
454
  const painel = listarReservas(raiz, { remoto: opcoes.remoto, rede: opcoes.rede });
453
455
  if (!painel.atualizado)
454
- throw new Error(`roadmap.sem-remoto: nao consegui ler ${exports.BRANCH_DE_RESERVAS}; soltar exige rede`);
456
+ throw new locale_1.ErroDoCatalogo((m) => m.reservas.semRemotoParaOrfas(exports.BRANCH_DE_RESERVAS));
455
457
  return reservasOrfas(raiz, painel.reservas, opcoes).map((orfa) => {
456
458
  try {
457
459
  return soltarOrfa(raiz, orfa, 'orfas', opcoes);
@@ -470,33 +472,31 @@ function leituraDasReservas(p, temRemoto) {
470
472
  function textoDasReservas(p, orfas = [], lida = {}) {
471
473
  const remoto = lida.remoto ?? exports.REMOTO_PADRAO;
472
474
  const leitura = leituraDasReservas(p, lida.temRemoto !== false);
473
- if (leitura === 'sem-remoto') {
474
- const projeto = lida.projeto ? `o projeto ${lida.projeto}` : 'o projeto';
475
- return `Reservas do roadmap: ${projeto} não tem o remoto ${remoto}; nada foi lido de ${exports.BRANCH_DE_RESERVAS}.`;
476
- }
477
- if (leitura === 'sem-copia') {
478
- return `Reservas do roadmap: o remoto ${remoto} não respondeu e esta máquina não tem cópia de ${exports.BRANCH_DE_RESERVAS}; nada foi lido.`;
479
- }
475
+ // RM-061 (F3b): o painel no terminal pelo catalogo; item, pessoa, maquina, thread e nota sao dado.
476
+ const m = (0, locale_1.msg)().reservas;
477
+ if (leitura === 'sem-remoto')
478
+ return m.semRemoto(lida.projeto ?? null, remoto, exports.BRANCH_DE_RESERVAS);
479
+ if (leitura === 'sem-copia')
480
+ return m.semCopia(remoto, exports.BRANCH_DE_RESERVAS);
480
481
  const linhas = [];
481
482
  if (!p.atualizado)
482
- linhas.push('AVISO: sem acesso ao remoto; esta e a ultima copia lida nesta maquina.', '');
483
+ linhas.push(m.copiaLocal, '');
483
484
  const feats = p.feats ?? [];
484
- const numeros = feats.length === 0 ? [] : ['', `Números de FEAT reservados (${feats.length}), os últimos: ` +
485
- feats.slice(-5).map((f) => `${f.feat} (${f.thread ?? f.maquina})`).join(', ') + '. O próximo sai de: ork roadmap feat'];
485
+ const numeros = feats.length === 0 ? [] : ['', m.numerosDeFeat(feats.length, feats.slice(-5).map((f) => `${f.feat} (${f.thread ?? f.maquina})`).join(', '))];
486
486
  if (p.reservas.length === 0) {
487
- linhas.push('Nenhum item do roadmap reservado.', ...numeros);
487
+ linhas.push(m.nenhuma, ...numeros);
488
488
  return linhas.join('\n');
489
489
  }
490
- linhas.push('ITEM COM QUEM MAQUINA THREAD DESDE');
490
+ linhas.push(m.cabecalho);
491
491
  const orfaDoItem = new Map(orfas.map((o) => [o.reserva.item, o]));
492
492
  for (const r of p.reservas) {
493
493
  const orfa = orfaDoItem.get(r.item);
494
- const marca = orfa ? ` ÓRFÃ: thread fechada${orfa.sucessora ? `, passa para ${orfa.sucessora}` : ''}` : '';
494
+ const marca = orfa ? m.orfa(orfa.sucessora) : '';
495
495
  linhas.push(`${r.item.padEnd(8)} ${r.por.slice(0, 19).padEnd(19)} ${r.maquina.slice(0, 15).padEnd(15)} ` +
496
496
  `${(r.thread ?? '-').slice(0, 18).padEnd(18)} ${(0, horario_1.formatarDataHora)(r.desdeEm)}` + (r.nota ? ` ${r.nota}` : '') + marca);
497
497
  }
498
498
  if (orfas.length > 0)
499
- linhas.push('', `${orfas.length} reserva(s) órfã(s) desta máquina. Para soltar: ork roadmap reservas --soltar-orfas`);
499
+ linhas.push('', m.orfas(orfas.length));
500
500
  linhas.push(...numeros, '', (0, horario_1.legendaDoFuso)());
501
501
  return linhas.join('\n');
502
502
  }
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ENV_THREAD_DO_DESPACHO = exports.ENV_IDENTIDADE_DE_DESPACHO = exports.ENVS_DE_PROVIDER_PAGO = void 0;
4
4
  exports.nomesDeProviderAtivos = nomesDeProviderAtivos;
5
+ exports.sessaoDespachada = sessaoDespachada;
5
6
  exports.ambienteDeAssinatura = ambienteDeAssinatura;
6
7
  const hitl_public_receipt_1 = require("./hitl-public-receipt");
7
8
  /**
@@ -27,6 +28,10 @@ function nomesDeProviderAtivos(base = process.env) {
27
28
  */
28
29
  exports.ENV_IDENTIDADE_DE_DESPACHO = 'ORK_DISPATCH_ID';
29
30
  exports.ENV_THREAD_DO_DESPACHO = 'ORK_DISPATCH_THREAD';
31
+ /** O processo roda numa sessao despachada pelo `ork`: a identidade ou a thread do despacho estao no ambiente. */
32
+ function sessaoDespachada(env = process.env) {
33
+ return (env[exports.ENV_IDENTIDADE_DE_DESPACHO] ?? '').trim() !== '' || (env[exports.ENV_THREAD_DO_DESPACHO] ?? '').trim() !== '';
34
+ }
30
35
  /** Copia, sem alterar o ambiente em que as policies ainda precisam ser avaliadas. */
31
36
  function ambienteDeAssinatura(base = process.env) {
32
37
  const env = { ...base };
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.novaIdentidadeDeDespacho = novaIdentidadeDeDespacho;
37
+ exports.capacidadeDoRuntimeNoProjeto = capacidadeDoRuntimeNoProjeto;
37
38
  exports.contextoDoProjeto = contextoDoProjeto;
38
39
  exports.validarContextoRuntime = validarContextoRuntime;
39
40
  exports.lerDeclaracaoDeMod = lerDeclaracaoDeMod;
@@ -49,6 +50,7 @@ const hosts_1 = require("./hosts");
49
50
  const worktree_1 = require("./worktree");
50
51
  const mcp_install_1 = require("./mcp-install");
51
52
  const mcp_grafo_1 = require("./mcp-grafo");
53
+ const mcp_transportes_1 = require("./mcp-transportes");
52
54
  const hitl_public_receipt_1 = require("./hitl-public-receipt");
53
55
  /** Correlação interna; nenhuma identidade de despacho concede poder de gate. */
54
56
  function novaIdentidadeDeDespacho(threadId, fase) {
@@ -108,7 +110,7 @@ function preparado(raiz) {
108
110
  }
109
111
  if (JSON.stringify(argv) !== JSON.stringify(legado)) {
110
112
  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]))
113
+ argv[argv.length - 2] !== '--ship-transport' || !(0, mcp_transportes_1.ehTransporteShipMcp)(argv[argv.length - 1]))
112
114
  throw Error('runtime.context.conflict: MCP Orkastery divergente; transporte invalido ou argumentos extras');
113
115
  transporte = argv[argv.length - 1];
114
116
  }
@@ -133,17 +135,78 @@ function raizCanonica(projeto) {
133
135
  dentro(raiz, path.join(raiz, '.orkastery'));
134
136
  return raiz;
135
137
  }
138
+ function hostDoRuntime(runtime) {
139
+ if (runtime === 'claude-bg')
140
+ return 'claude-code';
141
+ if (runtime === 'codex')
142
+ return 'codex';
143
+ throw Error('runtime.context.invalid: runtime desconhecido');
144
+ }
145
+ /** Confere o recibo e todos os bytes do adaptador antes de considerar o runtime um destino. */
146
+ function conferirInstalacaoDoHost(raiz, host) {
147
+ const def = hosts_1.HOSTS[host];
148
+ const instalacao = path.join(raiz, def.destinoPadrao, def.subdir ?? '');
149
+ let recibo;
150
+ try {
151
+ recibo = objeto(JSON.parse(ler(raiz, path.join(instalacao, 'INSTALADO.json'), 1048576).toString('utf8')));
152
+ }
153
+ catch {
154
+ throw Error('runtime.context.installation: instale/verifique o adaptador do runtime neste projeto');
155
+ }
156
+ if (recibo.contrato !== 'ork.adapter-install/v1' || recibo.host !== host || !Array.isArray(recibo.arquivos) || recibo.arquivos.length > 512)
157
+ throw Error('runtime.context.installation: recibo instalado invalido');
158
+ const arquivos = new Map();
159
+ // RM-059 (T0.7): os bytes ja conferidos da declaracao e do manifesto de cada mod, lidos uma vez so.
160
+ const conferidos = new Map();
161
+ for (const item of recibo.arquivos) {
162
+ const a = objeto(item);
163
+ if (typeof a.arquivo !== 'string' || path.isAbsolute(a.arquivo) || a.arquivo.split(/[\\/]/).includes('..') ||
164
+ typeof a.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(a.sha256) || arquivos.has(a.arquivo))
165
+ throw Error('runtime.context.installation: arquivo do recibo invalido');
166
+ const file = path.join(instalacao, a.arquivo);
167
+ if (!dentro(raiz, file).startsWith(instalacao + path.sep))
168
+ throw Error('runtime.context.installation: bytes instalados divergentes');
169
+ const bytes = ler(raiz, file, 1048576);
170
+ if ((0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex') !== a.sha256)
171
+ throw Error('runtime.context.installation: bytes instalados divergentes');
172
+ arquivos.set(a.arquivo, file);
173
+ if (DECLARACAO_OU_MANIFESTO_DE_MOD.test(a.arquivo))
174
+ conferidos.set(a.arquivo, bytes);
175
+ }
176
+ const bootstrap = arquivos.get('skills/core/orkastery-bootstrap/SKILL.md');
177
+ if (!bootstrap || (host === 'claude-code' && !arquivos.has('.claude-plugin/plugin.json')))
178
+ throw Error('runtime.context.installation: catalogo ou plugin incompleto');
179
+ return { instalacao, arquivos, conferidos, bootstrap };
180
+ }
181
+ /**
182
+ * Um projeto preparado so pode escolher runtimes cujo adaptador esteja instalado e integro.
183
+ * Projeto legado, sem entrada MCP do Orkastery, conserva a selecao anterior.
184
+ */
185
+ function capacidadeDoRuntimeNoProjeto(projeto, runtime) {
186
+ let host = null;
187
+ try {
188
+ const raiz = raizCanonica(projeto);
189
+ const perfil = preparado(raiz);
190
+ if (!perfil)
191
+ return { runtime, host: null, preparado: false, capaz: true, motivo: null };
192
+ host = hostDoRuntime(runtime);
193
+ conferirInstalacaoDoHost(raiz, host);
194
+ return { runtime, host, preparado: true, capaz: true, motivo: null };
195
+ }
196
+ catch (erro) {
197
+ return { runtime, host, preparado: true, capaz: false, motivo: erro.message };
198
+ }
199
+ }
136
200
  /** Projeto sem entrada MCP Orkastery continua com o contrato legado. Nao instala nem altera arquivos. */
137
201
  function contextoDoProjeto(projeto, runtime, cwd, threadId) {
138
202
  const raiz = raizCanonica(projeto);
139
203
  const perfil = preparado(raiz);
140
204
  if (!perfil)
141
205
  return undefined;
142
- if (!['claude-bg', 'codex'].includes(runtime))
143
- throw Error('runtime.context.invalid: runtime desconhecido');
206
+ const host = hostDoRuntime(runtime);
144
207
  if (!threadId)
145
208
  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 };
209
+ const contexto = { projeto: raiz, host, threadId, transporteShip: perfil.transporteShip, permissoesFilho: perfil.permissoesFilho };
147
210
  validarContextoRuntime(contexto, cwd);
148
211
  return contexto;
149
212
  }
@@ -151,7 +214,7 @@ function contextoDoProjeto(projeto, runtime, cwd, threadId) {
151
214
  function validarContextoRuntime(contexto, cwd) {
152
215
  if (!contexto || !['claude-code', 'codex'].includes(contexto.host))
153
216
  throw Error('runtime.context.invalid: host desconhecido');
154
- if (contexto.transporteShip !== undefined && !['github-ssh', 'bare-local'].includes(contexto.transporteShip))
217
+ if (contexto.transporteShip !== undefined && !(0, mcp_transportes_1.ehTransporteShipMcp)(contexto.transporteShip))
155
218
  throw Error('runtime.context.invalid: transporte desconhecido');
156
219
  const raiz = raizCanonica(contexto.projeto);
157
220
  if (contexto.permissoesFilho !== undefined && !['interactive', 'worktree'].includes(contexto.permissoesFilho))
@@ -183,38 +246,7 @@ function validarContextoRuntime(contexto, cwd) {
183
246
  if (!(0, worktree_1.worktreesDoGit)(raiz).some(w => w.dir === cwd && w.branch === (0, worktree_1.branchDaWorktree)(thread)))
184
247
  throw Error('runtime.context.worktree: worktree nao registrada na branch da thread');
185
248
  }
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');
249
+ const { instalacao, arquivos, conferidos, bootstrap } = conferirInstalacaoDoHost(raiz, contexto.host);
218
250
  const modsDeFase = contexto.host === 'claude-code' ? modsDeFaseInstalados(raiz, instalacao, arquivos, conferidos) : [];
219
251
  // Capacidade derivada do bloco atual, nunca aceita como entrada do modelo.
220
252
  const permiteEditarProduto = permissoesFilho === 'worktree' && (0, thread_1.blocoDaThread)(thread, thread.faseAtual).fases.includes('GO');
@@ -279,14 +311,52 @@ function dependenciasDoManifesto(texto) {
279
311
  return typeof nome === 'string' && nome ? [nome.split('@')[0]] : [];
280
312
  });
281
313
  }
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');
314
+ /** Os arquivos comuns que o proprio Claude Code escreve na pasta do mod que ele carrega: declaracoes, nunca codigo. */
315
+ function arquivoDoMotor(raiz, arquivo, relativo) {
316
+ if (relativo === '.claude-plugin/types/.gitignore')
317
+ return true;
318
+ if (relativo.startsWith('.claude-plugin/types/') &&
319
+ (relativo.endsWith('.d.ts') || path.posix.basename(relativo) === 'tsconfig.json'))
320
+ return true;
321
+ if (relativo !== 'tsconfig.json')
322
+ return false;
323
+ try {
324
+ const config = objeto(JSON.parse(ler(raiz, arquivo, 4096).toString('utf8')));
325
+ return Object.keys(config).length === 1 && config.extends === './.claude-plugin/types/tsconfig.json';
326
+ }
327
+ catch {
328
+ return false;
329
+ }
330
+ }
331
+ /** Link de tipos gerado pelo Claude Code: o alvo real continua preso a um .d.ts comprovado pelo recibo. */
332
+ function linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos) {
333
+ if (!relativo.startsWith('.claude-plugin/types/') || !relativo.endsWith('.d.ts'))
334
+ return false;
335
+ let alvo;
336
+ try {
337
+ alvo = fs.realpathSync(arquivo);
338
+ }
339
+ catch {
340
+ return false;
341
+ }
342
+ const relativoAoRecibo = path.relative(instalacao, alvo).split(path.sep).join('/');
343
+ if (!/^mods\/[^/]+\/types\/[^/]+\.d\.ts$/.test(relativoAoRecibo))
344
+ return false;
345
+ const comprovado = arquivos.get(relativoAoRecibo);
346
+ if (!comprovado)
347
+ return false;
348
+ try {
349
+ return fs.realpathSync(comprovado) === alvo && fs.statSync(alvo).isFile();
350
+ }
351
+ catch {
352
+ return false;
353
+ }
285
354
  }
286
355
  /**
287
356
  * RM-059 (T0.7, D1): a pasta instalada de um mod de fase tem exatamente os arquivos do recibo. O
288
357
  * `--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.
358
+ * fora do recibo entraria na sessao de fase sem prova. So o link de tipos gerado pelo motor conserva
359
+ * a prova pelo alvo real; outro link e arquivo especial recusam sempre.
290
360
  */
291
361
  function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
292
362
  const dir = path.join(instalacao, 'mods', nome);
@@ -296,15 +366,19 @@ function conferirPastaDoMod(raiz, instalacao, nome, arquivos) {
296
366
  const visitar = (atual, prefixo) => {
297
367
  for (const entrada of fs.readdirSync(atual, { withFileTypes: true })) {
298
368
  const relativo = prefixo ? `${prefixo}/${entrada.name}` : entrada.name;
299
- if (entrada.isSymbolicLink())
369
+ const arquivo = path.join(atual, entrada.name);
370
+ if (entrada.isSymbolicLink()) {
371
+ if (linkDeTipoDoMotor(instalacao, arquivo, relativo, arquivos))
372
+ continue;
300
373
  throw recusa(`link em ${relativo}`);
374
+ }
301
375
  if (entrada.isDirectory()) {
302
376
  visitar(path.join(atual, entrada.name), relativo);
303
377
  continue;
304
378
  }
305
379
  if (!entrada.isFile())
306
380
  throw recusa(`arquivo especial em ${relativo}`);
307
- if (!arquivos.has(`mods/${nome}/${relativo}`) && !tipoDoMotor(relativo)) {
381
+ if (!arquivos.has(`mods/${nome}/${relativo}`) && !arquivoDoMotor(raiz, arquivo, relativo)) {
308
382
  throw recusa(`arquivo fora do INSTALADO.json (${relativo})`, 'se ele saiu do catalogo, ork adapter install claude-code o tira da copia; ' +
309
383
  `se foi editado ou acrescentado a mao, apague ${path.join(dir, relativo)}`);
310
384
  }