@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
package/dist/phase.js CHANGED
@@ -33,12 +33,13 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.REGRAS_DE_EVIDENCIA = exports.CONTRATO_DAS_FASES = void 0;
36
+ exports.REGRAS_DE_EVIDENCIA = exports.REGRA_DAS_ESPERAS = exports.CONTRATO_DAS_FASES = void 0;
37
37
  exports.escolherPerfil = escolherPerfil;
38
38
  exports.perfilPedido = perfilPedido;
39
39
  exports.perfilParaDespacho = perfilParaDespacho;
40
40
  exports.runtimeCruzadoParaDespacho = runtimeCruzadoParaDespacho;
41
41
  exports.estadoParaDespacho = estadoParaDespacho;
42
+ exports.fechoDoGo = fechoDoGo;
42
43
  exports.fasesDoCicloNoPrompt = fasesDoCicloNoPrompt;
43
44
  exports.valoresDoPrompt = valoresDoPrompt;
44
45
  exports.montarPrompt = montarPrompt;
@@ -72,6 +73,7 @@ const board_1 = require("./board");
72
73
  const verify_1 = require("./verify");
73
74
  const session_watcher_1 = require("./session-watcher");
74
75
  const session_watcher_claude_1 = require("./session-watcher-claude");
76
+ const session_watcher_grok_1 = require("./session-watcher-grok");
75
77
  const manifest_1 = require("./manifest");
76
78
  const mcp_grafo_1 = require("./mcp-grafo");
77
79
  const runtimes_1 = require("./runtimes");
@@ -83,10 +85,12 @@ const ratelimit_1 = require("./ratelimit");
83
85
  const impedimento_1 = require("./impedimento");
84
86
  const claude_bg_1 = require("./adapters/claude-bg");
85
87
  const codex_1 = require("./adapters/codex");
88
+ const grok_1 = require("./adapters/grok");
86
89
  const memoria_1 = require("./memoria");
87
90
  const prompts_1 = require("./prompts");
88
91
  const slug_1 = require("./slug");
89
92
  const locale_1 = require("./locale");
93
+ const locale_prompts_1 = require("./locale-prompts");
90
94
  const thread_1 = require("./thread");
91
95
  const types_1 = require("./types");
92
96
  const util_1 = require("./util");
@@ -96,6 +100,7 @@ const horario_1 = require("./horario");
96
100
  const runtime_profiles_1 = require("./runtime-profiles");
97
101
  const sessoes_contas_1 = require("./sessoes-contas");
98
102
  const maquina_1 = require("./maquina");
103
+ const trabalho_thread_1 = require("./trabalho-thread");
99
104
  const procedencia_1 = require("./procedencia");
100
105
  const postura_local_1 = require("./postura-local");
101
106
  const fabrica_publicar_1 = require("./fabrica-publicar");
@@ -180,8 +185,9 @@ function perfilParaDespacho(carregado, thread, fase, runtime, opcoes) {
180
185
  const escolha = escolherPerfil(raiz, runtime, { perfil: opcoes.perfil, excluir, politica, carga });
181
186
  if (escolha.erro || !escolha.perfil || opcoes.dryRun)
182
187
  return escolha;
188
+ // RM-067 (F3): o grok nao tem conferencia de login sem ler a credencial; o despacho prova o login (semConferencia).
183
189
  const auth = runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(escolha.perfil) : runtime === 'codex' ? (0, codex_1.conferirAuth)(escolha.perfil)
184
- : { ok: false, detalhe: `runtime ${runtime} sem conferencia de login` };
190
+ : runtime === 'grok' ? (0, grok_1.conferirAuth)(escolha.perfil) : { ok: false, detalhe: `runtime ${runtime} sem conferencia de login` };
185
191
  if (auth.ok)
186
192
  return escolha;
187
193
  let motivo, razao;
@@ -269,23 +275,31 @@ function estadoParaDespacho(raiz, thread, dryRun = false) {
269
275
  }
270
276
  /** O que cada fase canonica entrega. Vai no cabecalho do prompt de toda sessao. */
271
277
  exports.CONTRATO_DAS_FASES = {
272
- GOAL: 'GOAL (F1): objetivo verificavel, impact map, criterios de sucesso e claims com comando de verificacao. Nao implementa.',
273
- PLAN: 'PLAN (F2): plano com tarefas, touch_paths, decisoes D1..Dn com domicilio unico e verify executavel por tarefa. Nao implementa.',
274
- GO: 'GO (F3): implementacao slice por slice, um commit atomico por tarefa, dentro da worktree da thread.',
275
- CHECK: 'CHECK (F4): verificacao contra a baseline (regressao versus divida pre-existente), review de codigo, testes, seguranca e performance.',
276
- SHIP: 'SHIP (F5): merge serializado, push provado por comando, roadmap atualizado e plano de rollback.',
277
- MASTER: 'MASTER (F6): MASTER log com postmortem tipado, licoes e o score humano de 0 a 5. Uma entrega sem MASTER log nao aconteceu.',
278
+ ...locale_prompts_1.PROMPTS_PT_BR.contratoDasFases,
278
279
  };
280
+ /**
281
+ * RM-037 (ork-rm037esperas, D3): a regra das esperas, uma linha so, a mesma no prompt de toda fase e na skill e nos
282
+ * guias que o adaptador instala (`core/test/rm037-esperas.test.ts` confere os arquivos). Em 12/10/2026, sessoes de
283
+ * fase esperaram para sempre por verify ou suite mandados para segundo plano com `&`, cujo processo morreu com a
284
+ * chamada, e por lacos de espera com `pgrep -f` que acham a si mesmos, porque o proprio laco traz o texto procurado.
285
+ */
286
+ exports.REGRA_DAS_ESPERAS = locale_prompts_1.PROMPTS_PT_BR.regraDasEsperas;
279
287
  /** As regras de evidencia que valem em toda fase, em todo modo. */
280
288
  exports.REGRAS_DE_EVIDENCIA = [
281
- 'Nada de self-report: toda alegacao vem com o comando que a comprova e a saida real.',
282
- 'Trabalhe apenas no diretorio de trabalho indicado acima.',
283
- 'Passos irreversiveis (push, merge, delecao) so acontecem quando o modo autoriza.',
289
+ ...locale_prompts_1.PROMPTS_PT_BR.regrasDeEvidencia,
284
290
  // RM-058 N2 (D13 da ork-rm058n2): tres sessoes de 12/10/2026 mandaram verify ou suite para segundo plano com `&`,
285
- // perderam o processo e esperaram para sempre.
286
- 'Verify, build e suite rodam em primeiro plano, com timeout, nunca com `&` no comando: o processo em segundo plano ' +
287
- 'se perde e a sessao espera para sempre. O `ork verify` espera a vez na fila de recursos pesados.',
291
+ // perderam o processo e esperaram para sempre. RM-037 (ork-rm037esperas, D3): a linha da N2 virou a regra das
292
+ // esperas, que tambem traz a execucao em segundo plano do host e a espera por `pgrep -f`.
293
+ exports.REGRA_DAS_ESPERAS,
288
294
  ];
295
+ /**
296
+ * RM-016: o rito de saída do GO pertence ao prompt canônico, não a um adaptador. Assim Claude Code
297
+ * e Codex recebem os mesmos artefatos obrigatórios antes de a sessão encerrar. RM-061 F3c: o texto
298
+ * vem do catálogo dos prompts, e o prompt inglês leva o mesmo rito.
299
+ */
300
+ function fechoDoGo(threadId, locale = (0, locale_1.localeAtivo)()) {
301
+ return (locale === 'en' ? locale_prompts_1.PROMPTS_EN : locale_prompts_1.PROMPTS_PT_BR).fechoDoGo(threadId);
302
+ }
289
303
  /**
290
304
  * I-42 (D11): as fases que o cabecalho do prompt descreve.
291
305
  *
@@ -308,7 +322,8 @@ function fasesDoCicloNoPrompt(thread) {
308
322
  * decisao e codigo. E o que permite um projeto reescrever o texto do prompt em
309
323
  * `prompts/fase-padrao.md` sem poder mudar o que o `ork` considera verdade.
310
324
  */
311
- function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '') {
325
+ function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '', locale = (0, locale_1.localeAtivo)()) {
326
+ const mp = locale === 'en' ? locale_prompts_1.PROMPTS_EN : locale_prompts_1.PROMPTS_PT_BR;
312
327
  const def = (0, modos_1.definicaoDoModo)(thread.modo);
313
328
  const bloco = (0, thread_1.blocoDaThread)(thread, fase);
314
329
  const pausa = (0, thread_1.pausaNaThread)(thread, fase);
@@ -317,27 +332,29 @@ function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '') {
317
332
  thread: thread.id,
318
333
  bloco: bloco.fases.join('-'),
319
334
  nome: thread.nome,
320
- ciclo_canonico: fasesDoCicloNoPrompt(thread).map((f) => `${bloco.fases.includes(f) ? '>' : ' '} ${exports.CONTRATO_DAS_FASES[f]}`).join('\n'),
335
+ ciclo_canonico: fasesDoCicloNoPrompt(thread).map((f) => `${bloco.fases.includes(f) ? '>' : ' '} ${mp.contratoDasFases[f]}`).join('\n'),
321
336
  tag: def.tag,
322
337
  blocos: thread.blocos.map((b) => b.fases.join('-')).join(' / '),
323
338
  pausas: String(thread.blocos.filter((b) => b.pausa).length),
324
- linha_variante: thread.variante ? `Variante de ciclo: ${thread.variante}` : '',
339
+ linha_variante: thread.variante ? mp.variante(thread.variante) : '',
325
340
  regra_de_pausa: pausa
326
- ? `Ao fim deste bloco HA PAUSA humana sobre: ${bloco.pausaSobre}. Pare, apresente a evidencia e espere o veredito.`
327
- : 'Ao fim deste bloco NAO ha pausa humana: siga com decisao autonoma e registre no ledger quem decidiu, com que evidencia e por que.',
328
- invariantes: modos_1.INVARIANTES.map((i) => `- ${i}`).join('\n'),
341
+ ? mp.pausa(mp.pausaSobre(bloco.pausaSobre))
342
+ : mp.semPausa,
343
+ invariantes: mp.invariantes.map((i) => `- ${i}`).join('\n'),
329
344
  slug: thread.slug,
330
345
  projeto_nome: thread.projeto.name,
331
346
  projeto_abbrev: thread.projeto.abbrev,
332
347
  base_branch: thread.base.branch,
333
348
  base_commit: thread.base.commit,
334
- diretorio: thread.worktree ?? '(raiz do projeto)',
349
+ diretorio: thread.worktree ?? mp.raizDoProjeto,
350
+ trabalho: (0, trabalho_thread_1.caminhoDoTrabalho)(thread.id),
335
351
  pedido: pedido.trim(),
352
+ fecho_go: bloco.fases.includes('GO') ? mp.fechoDoGo(thread.id) : '',
336
353
  // Bloco B6: o bloco de memoria injetada deterministicamente. Vazio em toda thread sem
337
354
  // decisao fechada e sem OrkMind, e ai a linha da variavel some do prompt: o texto fica
338
355
  // byte a byte igual ao que o B4 ja despachava.
339
356
  memoria_injetada: memoriaInjetada,
340
- regras_de_evidencia: exports.REGRAS_DE_EVIDENCIA.map((r) => `- ${r}`).join('\n'),
357
+ regras_de_evidencia: [...mp.regrasDeEvidencia, mp.regraDasEsperas].map((r) => `- ${r}`).join('\n'),
341
358
  };
342
359
  }
343
360
  /**
@@ -347,8 +364,10 @@ function valoresDoPrompt(thread, fase, pedido, memoriaInjetada = '') {
347
364
  * `prompts/fase-padrao.md` (ou `prompts/fase-goal.md` e companhia) versionado no repositorio,
348
365
  * vale o do projeto, e `ork prompt lint` e quem garante que ele nao perdeu o contrato.
349
366
  */
350
- function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '') {
351
- return (0, prompts_1.renderizar)((0, prompts_1.templateDaFase)(fase, raiz), valoresDoPrompt(thread, fase, pedido, memoriaInjetada));
367
+ function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '', locale = (0, locale_1.localeAtivo)()) {
368
+ // RM-061 F3c: os valores falam a lingua do template escolhido; o do projeto sem par `.en` sai inteiro em pt-BR.
369
+ const template = (0, prompts_1.templateDaFase)(fase, raiz, locale);
370
+ return (0, prompts_1.renderizar)(template, valoresDoPrompt(thread, fase, pedido, memoriaInjetada, (0, prompts_1.idiomaDoTemplate)(template)));
352
371
  }
353
372
  /**
354
373
  * Monta o prompt da fase JA com a memoria injetada (bloco B6).
@@ -359,11 +378,15 @@ function montarPrompt(thread, fase, pedido, raiz, memoriaInjetada = '') {
359
378
  * com as decisoes fechadas lidas do `thread.json`: a garantia nao depende do OrkMind.
360
379
  */
361
380
  function montarPromptComMemoria(carregado, thread, fase, pedido, memoria) {
362
- const injecao = (0, memoria_1.injecaoDaFase)(carregado, memoria, thread, fase);
381
+ // RM-061 F3c: o prompt despachado e dado (arquivo com sha256 no ledger). Segue a lingua declarada do dono
382
+ // (`owner.language`), nunca o locale de quem despacha: sem ela, pt-BR, com qualquer LANG (contrato da F2a). A
383
+ // dica do grafo fala a lingua do template que conduz a fase, como os valores.
384
+ const locale = (0, prompts_1.idiomaDoTemplate)((0, prompts_1.templateDaFase)(fase, carregado.raiz, (0, locale_1.linguaDeclaradaDoDono)(carregado.manifesto.owner?.language)));
385
+ const injecao = (0, memoria_1.injecaoDaFase)(carregado, memoria, thread, fase, locale);
363
386
  // Mesma raiz usada pelo MCP e runtime-context; o manifesto da WT nao habilita a dica.
364
387
  const ligado = (0, mcp_grafo_1.grafoLigado)((0, manifest_1.exigirManifesto)((0, estado_thread_1.raizDoEstado)(carregado.raiz)).manifesto);
365
388
  return {
366
- prompt: montarPrompt(thread, fase, (0, prompts_1.pedidoComDicaDoGrafo)(pedido, thread.id, ligado), carregado.raiz, injecao.texto),
389
+ prompt: montarPrompt(thread, fase, (0, prompts_1.pedidoComDicaDoGrafo)(pedido, thread.id, ligado, locale), carregado.raiz, injecao.texto, locale),
367
390
  injecao,
368
391
  };
369
392
  }
@@ -448,6 +471,8 @@ function dadosDoDespacho(ctx, comando) {
448
471
  cwd: ctx.cwd,
449
472
  promptPath: path.relative(ctx.raiz, ctx.promptPath),
450
473
  promptSha256: ctx.promptSha256,
474
+ ...(ctx.promptOriginal ? { promptOriginalPath: path.relative(ctx.raiz, ctx.promptOriginal.path),
475
+ promptOriginalSha256: ctx.promptOriginal.sha256 } : {}),
451
476
  origem: ctx.origem,
452
477
  // I-36 (T10): a porta por onde o dono chegou. `runtime` e o motor; `canal` e a porta.
453
478
  ...(ctx.canal ? { canal: ctx.canal } : {}),
@@ -455,6 +480,7 @@ function dadosDoDespacho(ctx, comando) {
455
480
  ...(ctx.identidade ? { identidade: ctx.identidade } : {}),
456
481
  // I-33 (D4): so identidade e diretorio do perfil; o store guarda o resto e nada e segredo.
457
482
  ...(ctx.perfil ? { perfil: ctx.perfil } : {}),
483
+ ...(ctx.perfilPedido ? { perfilPedido: ctx.perfilPedido } : {}),
458
484
  comando: comandoMascarado(comando, ctx.promptSha256),
459
485
  };
460
486
  }
@@ -532,7 +558,7 @@ sensores) {
532
558
  vincularConducaoDaSessao(ctx, sessionId);
533
559
  // I-51 (RM-047): as outras maquinas veem a fase nova; so com a fabrica compartilhada.
534
560
  (0, fabrica_publicar_1.publicarEmSegundoPlano)(ctx.raiz);
535
- if (ctx.runtime === 'codex' || ctx.runtime === 'claude-bg')
561
+ if (ctx.runtime === 'codex' || ctx.runtime === 'claude-bg' || ctx.runtime === 'grok')
536
562
  registrarObservacao(ctx, sessao, dir, controlador, sensores);
537
563
  return sessao;
538
564
  }
@@ -566,14 +592,19 @@ function registrarObservacao(ctx, sessao, dir, controlador, sensores) {
566
592
  const mesmoDespacho = (e) => e.sessionId === sessao.sessionId && e.despachoEm === sessao.despachadaEm;
567
593
  try {
568
594
  // I-34: claude-bg observa pela fonte nativa; no PLAN o registro guarda o sha de base do artefato.
569
- // I-33 (N1): o GO codex registra o HEAD do despacho, como a fonte claude-bg; sem ele a D11c nao ve commit pelo shell.
595
+ // I-33 (N1): o GO codex registra o HEAD do despacho, como a fonte claude-bg; ele revela commit pelo shell no checkpoint.
570
596
  const head = ctx.runtime === 'codex' && ctx.fase === 'GO' ? { head: ctx.headNoDespacho ?? null } : {};
571
- const fonte = ctx.runtime === 'claude-bg' ? (0, session_watcher_claude_1.fonteClaudeDoDespacho)(ctx.raiz, ctx.thread.id, ctx.fase, ctx.cwd)
572
- : sensores?.logPath ? { logPath: sensores.logPath, processoPath: sensores.processoPath, reciboPath: sensores.reciboPath, ...head }
573
- : controlador ? { controlador, cwd: ctx.cwd, ...head } : null;
597
+ // RM-067 (F2, D8): o grok observa o stream e os recibos do supervisor; o HEAD do GO vem de antes do despacho.
598
+ // RM-067 (F3): a pasta da sessao mora na casa do perfil do despacho; sem perfil, na do processo.
599
+ const fonte = ctx.runtime === 'grok' ? (sensores?.logPath && sensores.processoPath && sensores.reciboPath
600
+ ? (0, session_watcher_grok_1.fonteGrokDoDespacho)(ctx.raiz, ctx.thread.id, ctx.fase, ctx.cwd, { logPath: sensores.logPath, processoPath: sensores.processoPath, reciboPath: sensores.reciboPath }, ctx.perfil ? (0, runtime_profiles_1.diretorioDoPerfil)(ctx.perfil) : (0, grok_1.casaDoGrok)(), { head: ctx.headNoDespacho, ...(ctx.artefatoNoDespacho !== undefined ? { artefato: ctx.artefatoNoDespacho } : {}) })
601
+ : null)
602
+ : ctx.runtime === 'claude-bg' ? (0, session_watcher_claude_1.fonteClaudeDoDespacho)(ctx.raiz, ctx.thread.id, ctx.fase, ctx.cwd)
603
+ : sensores?.logPath ? { logPath: sensores.logPath, processoPath: sensores.processoPath, reciboPath: sensores.reciboPath, ...head }
604
+ : controlador ? { controlador, cwd: ctx.cwd, ...head } : null;
574
605
  if (!fonte)
575
606
  return;
576
- (0, session_watcher_1.validarFonteWatcher)(ctx.raiz, sessao.sessionId, fonte);
607
+ (0, session_watcher_1.prepararFonteWatcher)(ctx.raiz, sessao.sessionId, fonte);
577
608
  const eventos = (0, ledger_1.lerLedger)(dir);
578
609
  if (!eventos.some(e => e.tipo === 'session_sensor_registered' && mesmoDespacho(e))) {
579
610
  (0, ledger_1.registrar)(dir, ctx.thread.id, 'session_sensor_registered', { fase: ctx.fase,
@@ -687,6 +718,8 @@ tomadaPrevia) {
687
718
  const thread = (0, thread_1.lerThread)(raiz, threadId);
688
719
  const fase = opcoes.fase;
689
720
  const dir = (0, thread_1.dirThread)(raiz, thread.id);
721
+ if (!opcoes.dryRun)
722
+ (0, trabalho_thread_1.garantirDiretorioDoTrabalho)(raiz, thread.id);
690
723
  const slug = slugDaSessao(thread, fase);
691
724
  // Resolve UMA vez o trio runtime/modelo/esforco: o mesmo objeto vai ao runtime adapter,
692
725
  // ao ledger e a resposta do CLI. Resolver duas vezes e o caminho curto para o ledger
@@ -880,6 +913,9 @@ tomadaPrevia) {
880
913
  }
881
914
  }
882
915
  const cwd = (0, procedencia_1.diretorioDaThread)(raiz, thread);
916
+ // O pedido explicito precisa sobreviver mesmo quando o despacho para antes de escolher ou abrir a conta.
917
+ // `perfil` continua sendo o destino efetivo; misturar os dois quebraria a rotacao por falha da propria conta.
918
+ const perfilPedido = opcoes.perfil !== undefined ? { id: opcoes.perfil, runtime } : undefined;
883
919
  // RM-063 (F3): o prompt vai ao disco e ao ledger, com o sha256, ANTES do contexto do runtime e do adaptador. No
884
920
  // incidente de 12/10/2026 a fase morreu no despacho e o `ork retry run` saiu com "nao ha despacho falho registrado
885
921
  // em GO com prompt gravado"; daqui em diante, toda tentativa deixa o prompt que o retry redespacha sem pedir o texto.
@@ -887,7 +923,8 @@ tomadaPrevia) {
887
923
  const promptNoLedger = { promptPath: path.relative(raiz, promptPath), promptSha256: sha };
888
924
  if (!opcoes.dryRun) {
889
925
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.promptGravado, { fase, slug, modo: thread.modo, runtime, model, effort, cwd,
890
- ...promptNoLedger, origem: 'phase.run', canal, ...(opcoes.correlacao ? { correlacao: opcoes.correlacao } : {}), identidade });
926
+ ...promptNoLedger, origem: 'phase.run', canal, ...(opcoes.correlacao ? { correlacao: opcoes.correlacao } : {}), identidade,
927
+ ...(perfilPedido ? { perfilPedido } : {}) });
891
928
  }
892
929
  const correcaoDoRetry = `ork retry run ${thread.id} redespacha o mesmo prompt (sha256 ${sha.slice(0, 12)})`;
893
930
  let contextoRuntime;
@@ -897,7 +934,8 @@ tomadaPrevia) {
897
934
  catch (e) {
898
935
  const erro = `runtime.unavailable: ${e.message}`;
899
936
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable',
900
- modo: thread.modo, detalhe: erro, fase, slug, ...(opcoes.dryRun ? {} : { ...promptNoLedger, correcao: correcaoDoRetry }) });
937
+ modo: thread.modo, detalhe: erro, fase, slug, ...(opcoes.dryRun ? {} : { ...promptNoLedger, correcao: correcaoDoRetry }),
938
+ ...(perfilPedido ? { perfilPedido } : {}) });
901
939
  return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
902
940
  verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
903
941
  runtime, model, effort, bloqueado: true, motivo: 'runtime.unavailable', violacoes, erro };
@@ -916,16 +954,20 @@ tomadaPrevia) {
916
954
  }
917
955
  if (escolha.erro) {
918
956
  const motivo = escolha.motivo ?? 'runtime.unavailable';
919
- const erro = `${motivo}: ${escolha.erro}`;
957
+ const erro = perfilPedido
958
+ ? (0, locale_1.textoDoCatalogo)((m) => m.retry.perfilPedidoRecusado(perfilPedido.id, perfilPedido.runtime, motivo, escolha.erro))
959
+ : `${motivo}: ${escolha.erro}`;
920
960
  if (!opcoes.dryRun) {
921
961
  const semPerfil = { identidade, raiz, thread, fase, slug, promptPath, promptSha256: sha, runtime, cwd, model, effort,
922
- origem: 'phase.run', canal, correlacao: opcoes.correlacao ?? null };
962
+ origem: 'phase.run', canal, correlacao: opcoes.correlacao ?? null, ...(perfilPedido ? { perfilPedido } : {}) };
923
963
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, { ...dadosDoDespacho(semPerfil, []), erro });
924
964
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo, modo: thread.modo, detalhe: erro,
925
- correcao: motivo === 'cost.violation'
926
- ? 'refaca o login do perfil pela assinatura (claude auth login --claudeai ou codex login com ChatGPT) e rode ork accounts check; perfil de provider pago nunca despacha'
927
- : 'ork accounts list mostra o estado de cada perfil; ork retry run segue pela ordem de fallback ou pela fila',
928
- fase, slug, runtime, origem: 'phase.run' });
965
+ correcao: perfilPedido
966
+ ? (0, locale_1.textoDoCatalogo)((m) => m.retry.correcaoDoPerfilPedido(perfilPedido.id, perfilPedido.runtime, motivo, thread.id))
967
+ : motivo === 'cost.violation'
968
+ ? 'refaca o login do perfil pela assinatura (claude auth login --claudeai ou codex login com ChatGPT) e rode ork accounts check; perfil de provider pago nunca despacha'
969
+ : 'ork accounts list mostra o estado de cada perfil; ork retry run segue pela ordem de fallback ou pela fila',
970
+ fase, slug, runtime, origem: 'phase.run', ...promptNoLedger, ...(perfilPedido ? { perfilPedido } : {}) });
929
971
  }
930
972
  return { thread, slug, promptPath, promptSha256: sha, comando: [], sessionId: null,
931
973
  verificada: false, pausaAoFim: (0, thread_1.pausaNaThread)(thread, fase), dryRun: opcoes.dryRun === true,
@@ -962,8 +1004,10 @@ tomadaPrevia) {
962
1004
  const claimsSchema = fase === 'GO' && runtime === 'codex'
963
1005
  ? schemaDeClaimsDoPacote()
964
1006
  : undefined;
965
- // I-33 (N1): lido antes de a sessao existir; depois dela, um commit rapido ja estaria no HEAD.
966
- const headNoDespacho = fase === 'GO' && runtime === 'codex' && !opcoes.dryRun ? (0, session_watcher_claude_1.headDaWorktree)(cwd) : undefined;
1007
+ // I-33 (N1): lido antes de a sessao existir; depois dela, um commit rapido ja estaria no HEAD. RM-067: o grok tambem.
1008
+ const headNoDespacho = fase === 'GO' && (runtime === 'codex' || runtime === 'grok') && !opcoes.dryRun ? (0, session_watcher_claude_1.headDaWorktree)(cwd) : undefined;
1009
+ // RM-067 (D8): a base do artefato do grok tambem sai antes do despacho, que espera a pasta da sessao.
1010
+ const artefatoNoDespacho = runtime === 'grok' && !opcoes.dryRun ? (0, session_watcher_grok_1.baseDoArtefato)(raiz, thread.id, fase) : undefined;
967
1011
  const pedidoAoRuntime = {
968
1012
  prompt,
969
1013
  nome: slug,
@@ -1004,7 +1048,9 @@ tomadaPrevia) {
1004
1048
  effort,
1005
1049
  origem: 'phase.run',
1006
1050
  ...(perfil ? { perfil } : {}),
1051
+ ...(perfilPedido ? { perfilPedido } : {}),
1007
1052
  ...(headNoDespacho !== undefined ? { headNoDespacho } : {}),
1053
+ ...(artefatoNoDespacho !== undefined ? { artefatoNoDespacho } : {}),
1008
1054
  };
1009
1055
  let resultado;
1010
1056
  try {
@@ -1018,6 +1064,7 @@ tomadaPrevia) {
1018
1064
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.despachoFalhou, { ...dadosDoDespacho(ctx, []), erro });
1019
1065
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
1020
1066
  detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger,
1067
+ ...(perfilPedido ? { perfilPedido } : {}),
1021
1068
  evidencia: 'excecao real do runtime adapter no despacho, nao relato do agente' });
1022
1069
  }
1023
1070
  throw e;
@@ -1067,6 +1114,7 @@ tomadaPrevia) {
1067
1114
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: falha.motivo, modo: thread.modo, detalhe: erro,
1068
1115
  correcao: 'ork retry run rotaciona para o proximo perfil, para o runtime de fallback ou para a fila', fase, slug,
1069
1116
  runtime, origem: 'phase.run', falhaDeConta: falha, ...(perfil ? { perfil } : {}),
1117
+ ...(perfilPedido ? { perfilPedido } : {}),
1070
1118
  evidencia: 'saida real do runtime adapter no despacho, nao relato do agente' });
1071
1119
  return { thread, slug, promptPath, promptSha256: sha, comando: resultado.comando, controlador: resultado.controlador,
1072
1120
  sessionId: null, verificada: false, pausaAoFim, dryRun: false, runtime, model, effort, bloqueado: false,
@@ -1096,6 +1144,11 @@ tomadaPrevia) {
1096
1144
  effort,
1097
1145
  sinal,
1098
1146
  detalhe: erro,
1147
+ // RM-058 N4 (D17 da ork-rm058n4): o pedido do despacho do arco é do vigia do arco, e o `ork retry resume` não o retoma.
1148
+ ...(opcoes.correlacao ? { correlacao: opcoes.correlacao } : {}),
1149
+ // RM-067 (GO-FIX 1, A1): o pedido do grok volta pelo grok, com o modelo dele; o dos outros runtimes segue como antes.
1150
+ ...(runtime === 'grok' ? { runtime } : {}),
1151
+ ...(perfilPedido ? { runtime, perfil: perfilPedido.id, perfilPedido } : {}),
1099
1152
  });
1100
1153
  (0, ledger_1.registrar)(dir, thread.id, ledger_1.TIPOS_DE_EVENTO.rateLimitEnfileirado, {
1101
1154
  fase,
@@ -1141,6 +1194,7 @@ tomadaPrevia) {
1141
1194
  // a registrava: o `ork retry plan` nao a via e a fase ficava parada sem ninguem saber.
1142
1195
  (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: 'runtime.unavailable', modo: thread.modo,
1143
1196
  detalhe: erro, correcao: correcaoDoRetry, fase, slug, runtime, origem: 'phase.run', ...promptNoLedger, ...daSessao,
1197
+ ...(perfilPedido ? { perfilPedido } : {}),
1144
1198
  evidencia: 'saida real do runtime adapter no despacho, nao relato do agente' });
1145
1199
  return {
1146
1200
  thread,
package/dist/policies.js CHANGED
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.POLICIES_DE_PROVA_LOCAL = exports.POLICIES_CONHECIDAS = void 0;
15
15
  exports.procurarSegredos = procurarSegredos;
16
16
  exports.policyDeProvaLocal = policyDeProvaLocal;
17
+ exports.severidadeDeclarada = severidadeDeclarada;
17
18
  exports.policiesDesconhecidas = policiesDesconhecidas;
18
19
  exports.avaliarPolicies = avaliarPolicies;
19
20
  exports.avisos = avisos;
@@ -107,6 +108,13 @@ exports.POLICIES_CONHECIDAS = {
107
108
  quando: ['claims.add'],
108
109
  descricao: 'a mesma conferencia de claim_sem_prova_local, com o nome que o ork licoes propoe',
109
110
  },
111
+ // RM-062 (F2): a barreira de dado privado. Declarada, o `ork verify` varre o diff da thread e o `ork ci prepare`, o
112
+ // diff e o bundle; fora do manifesto, nenhum dos dois varre nada (projeto privado nao paga pelo que nao pediu).
113
+ dado_privado: {
114
+ quando: ['verify', 'ci.prepare'],
115
+ descricao: 'reprova (ou avisa) quando o diff da thread ou o bundle de CI leva caminho de home, e-mail fora da lista, ' +
116
+ 'hostname de maquina ou termo da lista local',
117
+ },
110
118
  };
111
119
  /** RM-008 (B8): as policies que conferem a claim no registro (um aviso so, como verify_regression e verify_failed). */
112
120
  exports.POLICIES_DE_PROVA_LOCAL = ['claim_sem_prova_local', 'claims_failed'];
@@ -135,6 +143,11 @@ function severidade(bruta) {
135
143
  return bruta;
136
144
  return 'warn';
137
145
  }
146
+ /** RM-062 (F2): a severidade da policy como o manifesto a declara, ou `null` quando ele nao a declara. */
147
+ function severidadeDeclarada(manifesto, nome) {
148
+ const bruta = manifesto.policies?.[nome];
149
+ return bruta === undefined ? null : severidade(bruta);
150
+ }
138
151
  /** Policies declaradas no manifesto que o `ork` nao sabe executar. */
139
152
  function policiesDesconhecidas(manifesto) {
140
153
  return Object.keys(manifesto.policies ?? {}).filter((p) => !(p in exports.POLICIES_CONHECIDAS));
@@ -276,6 +289,26 @@ function avaliarPolicies(manifesto, ctx) {
276
289
  }
277
290
  continue;
278
291
  }
292
+ if (nome === 'dado_privado') {
293
+ const f = ctx.dadoPrivado;
294
+ if (!f || (f.achados === 0 && !f.erro))
295
+ continue;
296
+ const lista = f.listaLocal ? 'com a lista local' : 'lista local ausente: so os padroes genericos';
297
+ violacoes.push({
298
+ policy: nome,
299
+ severidade: sev,
300
+ motivo: 'policy.violation',
301
+ detalhe: f.erro
302
+ ? `a varredura de dado privado nao rodou: ${f.erro}`
303
+ : `${f.achados} achado(s) de dado privado (${f.padroes.join(', ')}) no ${f.escopo}, ${lista}: ` +
304
+ `${f.onde.join(', ')}${f.achados > f.onde.length ? ', ...' : ''} (o valor casado nunca e impresso)`,
305
+ correcao: f.erro
306
+ ? 'corrija o orkastery.privado.json (ou tire a lista local do git) e rode de novo'
307
+ : 'troque o dado pelo generico (maquina-a, /home/usuario, pessoa@exemplo.invalid) ou, se for exemplo inventado, ' +
308
+ 'ponha a excecao com motivo em orkastery.privado.json, revisada em PR; confira com ork privado varrer --base <base>',
309
+ });
310
+ continue;
311
+ }
279
312
  if (nome === 'tree_blocked') {
280
313
  if (ctx.branchAtrasDaBase === true) {
281
314
  violacoes.push({
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.POSTURAS_QUE_AFROUXAM = exports.ARQUIVO_POSTURA_LOCAL = exports.CONTRATO_POSTURA_LOCAL = void 0;
36
+ exports.RUNTIMES_COM_POSTURA = exports.POSTURAS_QUE_AFROUXAM = exports.ARQUIVO_POSTURA_LOCAL = exports.CONTRATO_POSTURA_LOCAL = void 0;
37
37
  exports.pastaPrivadaDaPostura = pastaPrivadaDaPostura;
38
38
  exports.caminhoDaPosturaLocal = caminhoDaPosturaLocal;
39
39
  exports.posturaAfrouxada = posturaAfrouxada;
@@ -66,6 +66,7 @@ const node_crypto_1 = require("node:crypto");
66
66
  const codex_1 = require("./adapters/codex");
67
67
  const estado_thread_1 = require("./estado-thread");
68
68
  const procedencia_1 = require("./procedencia");
69
+ const locale_1 = require("./locale");
69
70
  const util_1 = require("./util");
70
71
  exports.CONTRATO_POSTURA_LOCAL = 'ork.postura-local/v1';
71
72
  exports.ARQUIVO_POSTURA_LOCAL = 'postura-local.json';
@@ -153,13 +154,17 @@ function lerPosturaLocal(raiz) {
153
154
  return { postura: null, motivo: 'a confirmação local é de outro checkout' };
154
155
  return { postura: o, motivo: null };
155
156
  }
157
+ /**
158
+ * Os runtimes que recebem a postura de sandbox do manifesto: o Codex e, desde a F4 da RM-067, o `grok`, em que a postura
159
+ * mais frouxa vira o perfil `off` (sem sandbox). O `claude-bg` não recebe a postura.
160
+ */
161
+ exports.RUNTIMES_COM_POSTURA = ['codex', 'grok'];
156
162
  /**
157
163
  * A recusa do despacho: `null` quando a postura do manifesto vale nesta máquina (não afrouxa, ou
158
164
  * foi confirmada localmente com o mesmo valor); senão o erro tipado com o comando que confirma.
159
- * Só o Codex recebe a postura de sandbox do manifesto.
160
165
  */
161
166
  function recusaDePostura(raiz, manifesto, runtime) {
162
- if (runtime !== 'codex')
167
+ if (!exports.RUNTIMES_COM_POSTURA.includes(runtime))
163
168
  return null;
164
169
  const postura = posturaAfrouxada(manifesto);
165
170
  if (!postura)
@@ -182,7 +187,7 @@ function gravarArquivoPrivado(raiz, nome, objeto) {
182
187
  const estado = path.dirname(pasta);
183
188
  const stEstado = fs.lstatSync(estado, { throwIfNoEntry: false });
184
189
  if (stEstado && (!stEstado.isDirectory() || stEstado.isSymbolicLink()))
185
- throw new Error('estado.link: .orkastery precisa ser pasta de verdade');
190
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.posturaEstadoLink);
186
191
  fs.mkdirSync(estado, { recursive: true });
187
192
  try {
188
193
  fs.mkdirSync(pasta, { mode: 0o700 });
@@ -193,10 +198,10 @@ function gravarArquivoPrivado(raiz, nome, objeto) {
193
198
  }
194
199
  const stPasta = fs.lstatSync(pasta);
195
200
  if (!stPasta.isDirectory() || stPasta.isSymbolicLink())
196
- throw new Error('estado.link: .orkastery/private precisa ser pasta de verdade');
201
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.posturaPrivadaLink);
197
202
  fs.chmodSync(pasta, 0o700);
198
203
  if ((0, procedencia_1.rastreadoPeloGit)(raiz, arquivo)) {
199
- throw new Error(`estado.rastreado: ${nome} está versionado no git; tire-o do índice (git rm --cached) antes de confirmar`);
204
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.posturaRastreada(nome));
200
205
  }
201
206
  const temp = path.join(pasta, `.${nome}.${(0, node_crypto_1.randomUUID)()}.tmp`);
202
207
  const fd = fs.openSync(temp, fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_NOFOLLOW, 0o600);
package/dist/preflight.js CHANGED
@@ -46,6 +46,7 @@ const manifest_1 = require("./manifest");
46
46
  const estado_thread_1 = require("./estado-thread");
47
47
  const claude_bg_1 = require("./adapters/claude-bg");
48
48
  const codex_1 = require("./adapters/codex");
49
+ const grok_1 = require("./adapters/grok");
49
50
  const runtime_profiles_1 = require("./runtime-profiles");
50
51
  const modos_1 = require("./modos");
51
52
  const setup_1 = require("./setup");
@@ -57,7 +58,7 @@ const runtime_ambiente_1 = require("./runtime-ambiente");
57
58
  const slug_1 = require("./slug");
58
59
  const util_1 = require("./util");
59
60
  const horario_1 = require("./horario");
60
- const authPadrao = (p) => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p);
61
+ const authPadrao = (p) => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : p.runtime === 'grok' ? (0, grok_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p);
61
62
  const sensoresPadrao = {
62
63
  runtime: nome => !!(0, runtimes_1.resolverRuntime)(nome).disponivel(),
63
64
  sandboxCodex: () => (0, codex_2.sondarSandbox)().ok,
@@ -60,6 +60,7 @@ exports.exigirCaminhoContido = exigirCaminhoContido;
60
60
  const fs = __importStar(require("node:fs"));
61
61
  const path = __importStar(require("node:path"));
62
62
  const estado_thread_1 = require("./estado-thread");
63
+ const locale_1 = require("./locale");
63
64
  const util_1 = require("./util");
64
65
  /** Caminho relativo à árvore principal, com `/` (o formato do `git ls-files`). */
65
66
  function relativoAoRepositorio(principal, arquivo) {
@@ -134,14 +135,12 @@ function exigirCwdLocal(raiz, threadId, dir, origem) {
134
135
  return dir;
135
136
  const arquivo = path.join(principal, ARQUIVO_DA_ORIGEM[origem](threadId));
136
137
  if (rastreadoPeloGit(principal, arquivo)) {
137
- throw new Error(`estado.rastreado: ${path.relative(principal, arquivo)} está versionado no git, e estado versionado ` +
138
- 'não escolhe onde o ork roda (ele pode ter vindo de outro repositório). Tire o estado do índice ' +
139
- '(git rm -r --cached .orkastery e .orkastery/ no .gitignore) e rode o comando de novo.');
138
+ const rel = path.relative(principal, arquivo);
139
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.rastreado(rel));
140
140
  }
141
141
  if (!path.isAbsolute(dir) || !fs.existsSync(dir) || !worktreesRegistradas(principal).includes(alvo)) {
142
- throw new Error(`estado.worktree-nao-registrada: ${JSON.stringify(String(dir)).slice(0, 200)} não aparece em ` +
143
- `git worktree list deste repositório, e o ork só roda git e agente na raiz do projeto ou numa worktree ` +
144
- `registrada. Recrie a worktree da thread com ork worktree ensure ${threadId}.`);
142
+ const citado = JSON.stringify(String(dir)).slice(0, 200);
143
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.worktreeNaoRegistrada(citado, threadId));
145
144
  }
146
145
  return dir;
147
146
  }
@@ -167,14 +166,11 @@ function diretorioDaThread(raiz, thread) {
167
166
  */
168
167
  function exigirHostLocal(raiz, arquivo) {
169
168
  if (rastreadoPeloGit(raiz, arquivo)) {
170
- throw new Error(`transporte.rastreado: ${path.basename(arquivo)} está versionado no git, e o transporte do ` +
171
- 'pulse e do digest só vale do arquivo local desta máquina. Tire-o do índice (git rm --cached) e grave-o ' +
172
- 'de novo nesta máquina.');
169
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.transporteRastreado(path.basename(arquivo)));
173
170
  }
174
171
  const st = fs.lstatSync(arquivo, { throwIfNoEntry: false });
175
172
  if (st && !st.isFile()) {
176
- throw new Error(`transporte.rastreado: ${path.basename(arquivo)} precisa ser um arquivo comum desta máquina, ` +
177
- 'não link nem diretório.');
173
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.transporteNaoComum(path.basename(arquivo)));
178
174
  }
179
175
  }
180
176
  /** `filho` está dentro de `pai` (ou é o próprio `pai`), pelos caminhos reais? */
@@ -219,7 +215,6 @@ function exigirCaminhoContido(raiz, thread, caminho, origem) {
219
215
  const contido = caminhoContidoOuNulo(raiz, thread, caminho);
220
216
  if (contido)
221
217
  return contido;
222
- throw new Error(`ponteiro.fora-da-raiz: ${JSON.stringify(String(origem)).slice(0, 200)} aponta para fora da raiz do ` +
223
- 'projeto e da worktree registrada da thread (também por link simbólico). Um ponteiro guardado no estado só lê ' +
224
- 'arquivo de dentro do projeto. Exporte o handoff de novo (ork handoff export) ou copie o arquivo para dentro do projeto.');
218
+ const citado = JSON.stringify(String(origem)).slice(0, 200);
219
+ throw new locale_1.ErroDoCatalogo((m) => m.estado.ponteiroForaDaRaiz(citado));
225
220
  }