@orkastery/cli 0.5.1 → 0.5.6

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 (260) hide show
  1. package/adapters/claude-code/README.md +158 -0
  2. package/adapters/claude-code/agents/ork-master.md +2 -0
  3. package/adapters/claude-code/commands/master.md +8 -0
  4. package/adapters/claude-code/commands/ork.md +9 -0
  5. package/adapters/claude-code/mods/autoridade.json +56 -0
  6. package/adapters/claude-code/mods/ork-clima/.claude-plugin/plugin.json +14 -0
  7. package/adapters/claude-code/mods/ork-clima/hooks/contas.ts +283 -0
  8. package/adapters/claude-code/mods/ork-clima/hooks/hooks.json +3 -0
  9. package/adapters/claude-code/mods/ork-clima/hooks/previsao.ts +393 -0
  10. package/adapters/claude-code/mods/ork-clima/hooks/register.ts +205 -0
  11. package/adapters/claude-code/mods/ork-clima/orkastery-mod.json +5 -0
  12. package/adapters/claude-code/mods/ork-clima/types/index.d.ts +80 -0
  13. package/adapters/claude-code/mods/ork-freio/.claude-plugin/plugin.json +14 -0
  14. package/adapters/claude-code/mods/ork-freio/hooks/carga.ts +160 -0
  15. package/adapters/claude-code/mods/ork-freio/hooks/conferencia.ts +309 -0
  16. package/adapters/claude-code/mods/ork-freio/hooks/hooks.json +3 -0
  17. package/adapters/claude-code/mods/ork-freio/hooks/lote.ts +270 -0
  18. package/adapters/claude-code/mods/ork-freio/hooks/register.ts +285 -0
  19. package/adapters/claude-code/mods/ork-freio/orkastery-mod.json +5 -0
  20. package/adapters/claude-code/mods/ork-freio/types/index.d.ts +127 -0
  21. package/adapters/claude-code/mods/ork-mesa/.claude-plugin/plugin.json +14 -0
  22. package/adapters/claude-code/mods/ork-mesa/hooks/cartoes.tsx +246 -0
  23. package/adapters/claude-code/mods/ork-mesa/hooks/decidir.ts +110 -0
  24. package/adapters/claude-code/mods/ork-mesa/hooks/fila.ts +253 -0
  25. package/adapters/claude-code/mods/ork-mesa/hooks/hooks.json +3 -0
  26. package/adapters/claude-code/mods/ork-mesa/hooks/obvia.ts +98 -0
  27. package/adapters/claude-code/mods/ork-mesa/hooks/register.tsx +493 -0
  28. package/adapters/claude-code/mods/ork-mesa/orkastery-mod.json +5 -0
  29. package/adapters/claude-code/mods/ork-mesa/types/index.d.ts +131 -0
  30. package/adapters/claude-code/mods/ork-pista/.claude-plugin/plugin.json +14 -0
  31. package/adapters/claude-code/mods/ork-pista/hooks/acoes.ts +71 -0
  32. package/adapters/claude-code/mods/ork-pista/hooks/ci.ts +117 -0
  33. package/adapters/claude-code/mods/ork-pista/hooks/hooks.json +3 -0
  34. package/adapters/claude-code/mods/ork-pista/hooks/pista.tsx +356 -0
  35. package/adapters/claude-code/mods/ork-pista/hooks/register.tsx +439 -0
  36. package/adapters/claude-code/mods/ork-pista/orkastery-mod.json +5 -0
  37. package/adapters/claude-code/mods/ork-pista/types/index.d.ts +85 -0
  38. package/adapters/claude-code/mods/ork-ponte/.claude-plugin/plugin.json +13 -0
  39. package/adapters/claude-code/mods/ork-ponte/hooks/faixa.tsx +57 -0
  40. package/adapters/claude-code/mods/ork-ponte/hooks/guarda.ts +410 -0
  41. package/adapters/claude-code/mods/ork-ponte/hooks/hooks.json +3 -0
  42. package/adapters/claude-code/mods/ork-ponte/hooks/mostrado.ts +55 -0
  43. package/adapters/claude-code/mods/ork-ponte/hooks/nucleo.ts +157 -0
  44. package/adapters/claude-code/mods/ork-ponte/hooks/papel.ts +42 -0
  45. package/adapters/claude-code/mods/ork-ponte/hooks/register.ts +331 -0
  46. package/adapters/claude-code/mods/ork-ponte/hooks/vigia.ts +76 -0
  47. package/adapters/claude-code/mods/ork-ponte/orkastery-mod.json +5 -0
  48. package/adapters/claude-code/mods/ork-ponte/types/index.d.ts +178 -0
  49. package/adapters/claude-code/mods/ork-portao/.claude-plugin/plugin.json +14 -0
  50. package/adapters/claude-code/mods/ork-portao/hooks/hooks.json +3 -0
  51. package/adapters/claude-code/mods/ork-portao/hooks/lease.ts +201 -0
  52. package/adapters/claude-code/mods/ork-portao/hooks/plano.ts +304 -0
  53. package/adapters/claude-code/mods/ork-portao/hooks/register.ts +339 -0
  54. package/adapters/claude-code/mods/ork-portao/hooks/verify.ts +152 -0
  55. package/adapters/claude-code/mods/ork-portao/orkastery-mod.json +5 -0
  56. package/adapters/claude-code/mods/ork-portao/types/index.d.ts +60 -0
  57. package/adapters/claude-code/mods/ork-radar/.claude-plugin/plugin.json +14 -0
  58. package/adapters/claude-code/mods/ork-radar/hooks/colisao.ts +420 -0
  59. package/adapters/claude-code/mods/ork-radar/hooks/hooks.json +3 -0
  60. package/adapters/claude-code/mods/ork-radar/hooks/mapa.tsx +322 -0
  61. package/adapters/claude-code/mods/ork-radar/hooks/register.tsx +470 -0
  62. package/adapters/claude-code/mods/ork-radar/orkastery-mod.json +5 -0
  63. package/adapters/claude-code/mods/ork-radar/types/index.d.ts +72 -0
  64. package/adapters/claude-code/mods/ork-sentinela/.claude-plugin/plugin.json +14 -0
  65. package/adapters/claude-code/mods/ork-sentinela/hooks/alertas.ts +85 -0
  66. package/adapters/claude-code/mods/ork-sentinela/hooks/despacho.ts +156 -0
  67. package/adapters/claude-code/mods/ork-sentinela/hooks/hooks.json +3 -0
  68. package/adapters/claude-code/mods/ork-sentinela/hooks/register.ts +511 -0
  69. package/adapters/claude-code/mods/ork-sentinela/hooks/vigia.ts +186 -0
  70. package/adapters/claude-code/mods/ork-sentinela/orkastery-mod.json +5 -0
  71. package/adapters/claude-code/mods/ork-sentinela/types/index.d.ts +65 -0
  72. package/adapters/claude-code/mods/ork-torre/.claude-plugin/plugin.json +14 -0
  73. package/adapters/claude-code/mods/ork-torre/hooks/agenda.ts +60 -0
  74. package/adapters/claude-code/mods/ork-torre/hooks/detalhe.tsx +236 -0
  75. package/adapters/claude-code/mods/ork-torre/hooks/frases.ts +42 -0
  76. package/adapters/claude-code/mods/ork-torre/hooks/hooks.json +3 -0
  77. package/adapters/claude-code/mods/ork-torre/hooks/painel.tsx +344 -0
  78. package/adapters/claude-code/mods/ork-torre/hooks/rede.ts +97 -0
  79. package/adapters/claude-code/mods/ork-torre/hooks/register.tsx +437 -0
  80. package/adapters/claude-code/mods/ork-torre/orkastery-mod.json +5 -0
  81. package/adapters/claude-code/mods/ork-torre/types/index.d.ts +108 -0
  82. package/adapters/codex/skills/ork/SKILL.md +18 -3
  83. package/adapters/hermes/README.md +1 -0
  84. package/adapters/hermes/bin/ork-network-status.sh +10 -0
  85. package/adapters/hermes/hermes.plugin.json +1 -0
  86. package/adapters/hermes/hitl-ingress/__init__.py +2 -2
  87. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +7 -6
  88. package/adapters/openclaw/README.md +26 -5
  89. package/adapters/openclaw/dist/hitl-ingress.js +2 -2
  90. package/adapters/openclaw/dist/index.js +46 -11
  91. package/adapters/openclaw/openclaw.plugin.json +5 -1
  92. package/adapters/openclaw/package.json +2 -2
  93. package/adapters/openclaw/src/hitl-ingress.ts +2 -2
  94. package/adapters/openclaw/src/index.ts +49 -11
  95. package/assets/docs-en/markdownlint-cli2.jsonc +22 -0
  96. package/assets/docs-en/padroes/documentacao-de-produto.md +135 -0
  97. package/assets/docs-en/padroes/roadmap-de-produto.md +100 -0
  98. package/assets/docs-en/produto/README.md +14 -0
  99. package/assets/docs-en/produto/_modelo-feature.md +62 -0
  100. package/assets/docs-en/roadmap/README.md +14 -0
  101. package/assets/docs-en/roadmap/_modelo-item.md +75 -0
  102. package/assets/orkmind_bridge.py +117 -9
  103. package/dist/adapters/claude-bg.js +116 -18
  104. package/dist/adapters/codex.js +14 -4
  105. package/dist/agents-md.js +24 -14
  106. package/dist/auditrun.js +22 -3
  107. package/dist/board.js +20 -17
  108. package/dist/branch-de-estado.js +88 -10
  109. package/dist/busca-semantica.js +52 -12
  110. package/dist/canarios-rm057.js +149 -0
  111. package/dist/canarios.js +2 -0
  112. package/dist/catalogo.js +33 -0
  113. package/dist/ci.js +21 -8
  114. package/dist/claims-conferir.js +342 -0
  115. package/dist/claims.js +41 -1
  116. package/dist/company-brain-client.js +36 -1
  117. package/dist/company-brain-context.js +158 -22
  118. package/dist/company-brain-journal.js +2 -1
  119. package/dist/company-brain-migration.js +36 -1
  120. package/dist/conducao-sentinela.js +388 -0
  121. package/dist/conducao-texto.js +12 -18
  122. package/dist/conducao.js +122 -30
  123. package/dist/conhecimento.js +490 -0
  124. package/dist/docs.js +70 -17
  125. package/dist/doctor-pulse-cron.js +349 -0
  126. package/dist/doctor-rede.js +150 -0
  127. package/dist/doctor.js +195 -111
  128. package/dist/entrega-pr.js +42 -29
  129. package/dist/escopo-escrita.js +10 -1
  130. package/dist/esgotamentos.js +181 -0
  131. package/dist/estado-thread.js +23 -1
  132. package/dist/experiencia-instalacao.js +45 -25
  133. package/dist/experiencia.js +12 -2
  134. package/dist/fabrica-batida.js +310 -0
  135. package/dist/fabrica-estado.js +52 -14
  136. package/dist/fabrica-publicar.js +9 -1
  137. package/dist/fechamento.js +20 -66
  138. package/dist/fila-pesada.js +444 -0
  139. package/dist/fix.js +3 -2
  140. package/dist/forja.js +31 -7
  141. package/dist/gates.js +3 -24
  142. package/dist/handoff.js +10 -6
  143. package/dist/hitl-contract.js +59 -4
  144. package/dist/hitl-curto.js +11 -6
  145. package/dist/hitl-gates.js +5 -0
  146. package/dist/hitl-local-receipt.js +2 -0
  147. package/dist/hitl-lote.js +5 -2
  148. package/dist/hitl-resumo.js +38 -3
  149. package/dist/hitl-tempo-parado.js +201 -0
  150. package/dist/hitl-texto-livre.js +5 -5
  151. package/dist/hitl.js +29 -33
  152. package/dist/horario.js +41 -7
  153. package/dist/hosts.js +104 -11
  154. package/dist/impedimento.js +299 -0
  155. package/dist/index.js +961 -542
  156. package/dist/indice-vetorial.js +87 -10
  157. package/dist/indice.js +9 -1
  158. package/dist/init.js +56 -43
  159. package/dist/instabilidade.js +144 -0
  160. package/dist/integracoes-locais.js +4 -0
  161. package/dist/intelligence-graph-cli.js +170 -16
  162. package/dist/intelligence-graph-contexto.js +254 -0
  163. package/dist/intelligence-graph-contract.js +2 -1
  164. package/dist/intelligence-graph-extract-md.js +56 -4
  165. package/dist/intelligence-graph-extract-ts.js +71 -3
  166. package/dist/intelligence-graph-parsers.js +6 -4
  167. package/dist/intelligence-graph-query.js +66 -19
  168. package/dist/leases.js +664 -87
  169. package/dist/ledger-stats.js +15 -1
  170. package/dist/ledger.js +18 -1
  171. package/dist/licoes.js +1 -0
  172. package/dist/liveness.js +6 -3
  173. package/dist/locale-ajuda.js +761 -0
  174. package/dist/locale-gerados.js +160 -0
  175. package/dist/locale-master.js +99 -0
  176. package/dist/locale-onboarding.js +92 -0
  177. package/dist/locale-phase.js +151 -0
  178. package/dist/locale-pulse.js +211 -0
  179. package/dist/locale-retry.js +385 -0
  180. package/dist/locale-roadmap.js +102 -0
  181. package/dist/locale-ship.js +494 -0
  182. package/dist/locale-thread.js +277 -0
  183. package/dist/locale-verify.js +125 -0
  184. package/dist/locale.js +714 -0
  185. package/dist/maestro-runtime.js +4 -1
  186. package/dist/manifest.js +149 -4
  187. package/dist/maquina.js +23 -4
  188. package/dist/master-digest.js +6 -1
  189. package/dist/master-nota.js +18 -11
  190. package/dist/master.js +145 -31
  191. package/dist/mcp-artifacts.js +43 -3
  192. package/dist/mcp-git.js +42 -8
  193. package/dist/mcp-grafo-worker.js +5 -3
  194. package/dist/mcp-grafo.js +55 -6
  195. package/dist/mcp-server.js +22 -3
  196. package/dist/mcp-ship.js +3 -1
  197. package/dist/mcp-verify.js +6 -1
  198. package/dist/memoria.js +48 -6
  199. package/dist/modos.js +3 -6
  200. package/dist/network-roadmap.js +196 -18
  201. package/dist/noctum-arco.js +911 -0
  202. package/dist/noctum-capacidade.js +141 -0
  203. package/dist/noctum-envelope.js +810 -0
  204. package/dist/noctum-execucao.js +304 -0
  205. package/dist/noctum-fila.js +280 -0
  206. package/dist/ocupacao.js +40 -5
  207. package/dist/onboarding.js +40 -21
  208. package/dist/orkmind.js +99 -7
  209. package/dist/orquestracao.js +24 -21
  210. package/dist/parado-no-condutor.js +219 -38
  211. package/dist/phase.js +160 -52
  212. package/dist/policies.js +56 -5
  213. package/dist/portfolio.js +8 -3
  214. package/dist/postura-local.js +234 -0
  215. package/dist/preflight.js +11 -10
  216. package/dist/procedencia.js +225 -0
  217. package/dist/projeto-alvo.js +132 -5
  218. package/dist/prompts.js +40 -1
  219. package/dist/prova-ativacao.js +75 -6
  220. package/dist/pulse-delivery.js +47 -4
  221. package/dist/pulse.js +98 -19
  222. package/dist/ratelimit.js +24 -6
  223. package/dist/recall.js +3 -1
  224. package/dist/redacao-saida.js +63 -0
  225. package/dist/rede-adesao.js +399 -0
  226. package/dist/rede-forja.js +289 -0
  227. package/dist/rede-projetos.js +239 -0
  228. package/dist/rede-status.js +337 -0
  229. package/dist/rede.js +980 -0
  230. package/dist/retry.js +291 -140
  231. package/dist/roadmap-reservas.js +20 -3
  232. package/dist/roadmap-status.js +150 -34
  233. package/dist/runtime-context.js +181 -3
  234. package/dist/runtime-profiles.js +22 -1
  235. package/dist/runtimes.js +2 -1
  236. package/dist/saida-segura.js +58 -0
  237. package/dist/session-events.js +7 -3
  238. package/dist/session-watcher-claude.js +120 -24
  239. package/dist/session-watcher.js +185 -33
  240. package/dist/sessoes-contas.js +187 -0
  241. package/dist/sessoes-inventario.js +6 -18
  242. package/dist/sessoes.js +83 -2
  243. package/dist/ship-publicar.js +800 -0
  244. package/dist/ship.js +157 -88
  245. package/dist/steal.js +77 -0
  246. package/dist/thread-close.js +3 -2
  247. package/dist/thread.js +299 -49
  248. package/dist/util.js +8 -1
  249. package/dist/verify.js +141 -52
  250. package/dist/vida-da-thread.js +254 -0
  251. package/dist/worktree-local.js +165 -0
  252. package/dist/worktree.js +25 -2
  253. package/dist/yaml.js +27 -8
  254. package/eval/fixtures/fx-pedido-colado/caso.json +20 -0
  255. package/package.json +7 -3
  256. package/references/definition-of-done.md +1 -1
  257. package/schemas/code-artifact-graph.v1.schema.json +2 -1
  258. package/skills/README.md +1 -1
  259. package/skills/core/orkastery-bootstrap/SKILL.md +2 -2
  260. package/skills/phases/master-metrics/SKILL.md +8 -3
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MOTIVOS_DE_IMPEDIMENTO_DO_DONO = void 0;
37
+ exports.ehImpedimentoDoDono = ehImpedimentoDoDono;
38
+ exports.ehEsperaDoDono = ehEsperaDoDono;
39
+ exports.classificarImpedimento = classificarImpedimento;
40
+ exports.impedimentoResolvido = impedimentoResolvido;
41
+ exports.correcaoDoImpedimento = correcaoDoImpedimento;
42
+ exports.registrarImpedimentoDoDono = registrarImpedimentoDoDono;
43
+ exports.impedimentoDoEvento = impedimentoDoEvento;
44
+ exports.pedidoCurtoDoImpedimento = pedidoCurtoDoImpedimento;
45
+ /**
46
+ * RM-055: impedimento que so o dono resolve vira HITL.
47
+ *
48
+ * Em 29/09/2026 tres despachos `claude --bg` morreram com "Workspace not trusted. Run `claude` in
49
+ * <worktree> once and accept the trust prompt". O ledger guardou so `phase_dispatch_failed`, as threads
50
+ * ficaram `aberta` e o board, a fabrica e o pulse disseram "espera voce: -". O dono descobriu horas
51
+ * depois, perguntando.
52
+ *
53
+ * Aqui a saida do runtime vira motivo tipado. O motivo que so o dono resolve (aceitar a confianca do
54
+ * diretorio, aceitar termos novos do CLI) abre a pausa do dono com o que trava, o comando exato que ele
55
+ * roda e o que o `ork` faz depois: `ork retry run <thread>` re-despacha a MESMA fase com o MESMO prompt
56
+ * gravado, sem o dono reescrever o pedido. Login ausente e cota esgotada continuam na rotacao de conta
57
+ * (I-33): la quem resolve primeiro e o orquestrador, trocando de perfil. Motivo desconhecido continua
58
+ * generico (`runtime.unavailable`).
59
+ */
60
+ const fs = __importStar(require("node:fs"));
61
+ const os = __importStar(require("node:os"));
62
+ const path = __importStar(require("node:path"));
63
+ const gates_1 = require("./gates");
64
+ const hitl_curto_1 = require("./hitl-curto");
65
+ exports.MOTIVOS_DE_IMPEDIMENTO_DO_DONO = Object.freeze([
66
+ 'runtime.workspace-untrusted', 'runtime.consent-pending',
67
+ ]);
68
+ function ehImpedimentoDoDono(motivo) {
69
+ return typeof motivo === 'string' && exports.MOTIVOS_DE_IMPEDIMENTO_DO_DONO.includes(motivo);
70
+ }
71
+ /**
72
+ * Um evento do ledger que espera o dono: a escalada `human.pending` ou o impedimento tipado do despacho.
73
+ * E a mesma regra para o monitor, a ocupacao de vaga, a fabrica e o pulse.
74
+ */
75
+ function ehEsperaDoDono(e, tipoGateBloqueado = 'gate_blocked') {
76
+ return e.tipo === tipoGateBloqueado && (e.motivo === 'human.pending' || ehImpedimentoDoDono(e.motivo));
77
+ }
78
+ /** Aspas de shell so quando o caminho precisa. */
79
+ function citar(caminho) {
80
+ return /^[A-Za-z0-9_./:@+-]+$/.test(caminho) ? caminho : `'${caminho.replace(/'/g, `'\\''`)}'`;
81
+ }
82
+ /**
83
+ * RM-055 (continuacao, D4): frases que dizem "Workspace not trusted" mas que aceitar a confianca NAO
84
+ * resolve. No claude 2.1.296 o veredito do `--bg` tem tres saidas: o diretorio que nao existe mais no
85
+ * disco, o diretorio home (que so confia uma sessao por vez) e a recusa de confianca de verdade. As duas
86
+ * primeiras ficam no caminho generico (`runtime.unavailable`), com o stderr gravado no despacho falho:
87
+ * mandar o dono rodar `cd <dir> && claude` ali nao destrava nada.
88
+ */
89
+ const FRASES_QUE_NAO_SAO_DO_DONO = [
90
+ /could not be resolved on disk/i,
91
+ /home directory is trusted one session at a time/i,
92
+ ];
93
+ const FRASES_DE_CONFIANCA = [
94
+ /workspace not trusted/i,
95
+ /accept the trust (?:prompt|dialog)/i,
96
+ /not inside a trusted directory/i,
97
+ /(?:folder|directory|workspace) (?:is )?not trusted/i,
98
+ ];
99
+ const FRASES_DE_CONSENTIMENTO = [
100
+ // claude 2.1.296, modo print: o aviso que bloqueia e sai com 1. O aviso de carencia ("will take effect
101
+ // ... Run `claude` to review the updated terms") nao bloqueia e nao casa aqui.
102
+ { regra: /\[ACTION REQUIRED\][^\n]*(?:terms|policy)/i, aceita: 'revisar e aceitar os termos novos',
103
+ feito: 'aceite os termos e saia' },
104
+ // claude 2.1.296: o portao do `--bg` que vem antes da confianca (gateCause "disclaimer").
105
+ { regra: /requires accepting the disclaimer first/i, aceita: 'aceitar o aviso do modo sem permissões (bypass)',
106
+ feito: 'aceite o aviso e saia' },
107
+ { regra: /requires opting in first/i, aceita: 'ativar o modo auto uma vez', feito: 'confirme o modo auto e saia' },
108
+ // Fatia 1 (02/10/2026): frases genericas de termos novos.
109
+ { regra: /accept (?:the )?(?:updated |new )?(?:terms|consumer terms|privacy policy|usage policy)/i,
110
+ aceita: 'aceitar termos novos', feito: 'aceite os termos e saia' },
111
+ { regra: /(?:terms|policy) (?:have|has) (?:been )?updated[^\n]*accept/i, aceita: 'aceitar termos novos',
112
+ feito: 'aceite os termos e saia' },
113
+ { regra: /consent (?:is )?required/i, aceita: 'aceitar termos novos', feito: 'aceite os termos e saia' },
114
+ ];
115
+ /** A forma fechada de um comando que o runtime manda rodar: o binario e opcoes `--nome` com valor simples. */
116
+ const FORMA_DO_COMANDO = /^(?:claude|codex)(?: --[a-z][a-z-]*(?: [a-z][a-z0-9-]*)?)*$/;
117
+ /**
118
+ * RM-055 (continuacao, D4): o comando que a propria frase do runtime manda rodar ("Run `claude
119
+ * --permission-mode auto` once interactively"). So na forma fechada e so do binario do runtime: a saida
120
+ * do runtime nunca chega ao dono como comando arbitrario. Fora disso, o binario puro.
121
+ */
122
+ function comandoDaFrase(trecho, bin) {
123
+ const pedido = /\brun `([^`]{1,120})`/i.exec(trecho)?.[1].replace(/\s+/g, ' ').trim();
124
+ return pedido && FORMA_DO_COMANDO.test(pedido) && pedido.split(' ')[0] === bin ? pedido : bin;
125
+ }
126
+ function trechoDa(texto, regra) {
127
+ const linha = texto.split(/\r?\n/).find(l => regra.test(l)) ?? texto;
128
+ return linha.replace(/\s+/g, ' ').trim().slice(0, 240);
129
+ }
130
+ function binarioDo(runtime) {
131
+ return runtime === 'codex' ? 'codex' : 'claude';
132
+ }
133
+ /**
134
+ * Le a saida do runtime (stderr e o erro do adapter) e devolve o impedimento do dono, ou null.
135
+ * Null quer dizer "nao e do dono": o despacho segue no caminho de antes.
136
+ */
137
+ function classificarImpedimento(saida, ctx) {
138
+ const texto = saida ?? '';
139
+ if (FRASES_QUE_NAO_SAO_DO_DONO.some(r => r.test(texto)))
140
+ return null;
141
+ const bin = binarioDo(ctx.runtime);
142
+ const depois = `depois, \`ork retry run ${ctx.thread}\` re-despacha ${ctx.fase} com o mesmo prompt gravado`;
143
+ const confianca = FRASES_DE_CONFIANCA.find(r => r.test(texto));
144
+ if (confianca) {
145
+ return {
146
+ motivo: 'runtime.workspace-untrusted',
147
+ trava: `o ${bin} não confia no diretório da worktree e recusou o despacho de ${ctx.fase}`,
148
+ comando: `cd ${citar(ctx.cwd)} && ${bin}`,
149
+ depois: `aceite a confiança no diretório e saia; ${depois}`,
150
+ trecho: trechoDa(texto, confianca),
151
+ };
152
+ }
153
+ const consentimento = FRASES_DE_CONSENTIMENTO.find(c => c.regra.test(texto));
154
+ if (consentimento) {
155
+ const trecho = trechoDa(texto, consentimento.regra);
156
+ return {
157
+ motivo: 'runtime.consent-pending',
158
+ trava: `o ${bin} espera você ${consentimento.aceita} e recusou o despacho de ${ctx.fase}`,
159
+ comando: comandoDaFrase(trecho, bin),
160
+ depois: `${consentimento.feito}; ${depois}`,
161
+ trecho,
162
+ };
163
+ }
164
+ return null;
165
+ }
166
+ /** O caminho como o claude o compara: o real, sem link; o resolvido quando ele nao existe no disco. */
167
+ function caminhoReal(caminho) {
168
+ try {
169
+ return fs.realpathSync.native(caminho);
170
+ }
171
+ catch {
172
+ return path.resolve(caminho);
173
+ }
174
+ }
175
+ /** A raiz git do diretorio: o ancestral mais proximo, ele incluido, com `.git` (arquivo ou diretorio). */
176
+ function raizGit(dir) {
177
+ for (let d = dir;; d = path.dirname(d)) {
178
+ try {
179
+ const st = fs.lstatSync(path.join(d, '.git'));
180
+ if (st.isFile() || st.isDirectory())
181
+ return d;
182
+ }
183
+ catch { /* sem `.git` aqui: sobe */ }
184
+ if (path.dirname(d) === d)
185
+ return null;
186
+ }
187
+ }
188
+ /**
189
+ * A raiz canonica de uma raiz git, conferida como o claude 2.1.296 confere: numa worktree vinculada (o
190
+ * arquivo `.git` aponta `gitdir:` para `<comum>/worktrees/<nome>`, que tem `commondir` e um `gitdir` de
191
+ * volta para `<raiz>/.git`), e o repositorio principal, o diretorio de cima do `<comum>` chamado `.git`.
192
+ * Qualquer conferencia que falha devolve a propria raiz, e um repositorio comum (`.git` diretorio) tambem.
193
+ */
194
+ function raizCanonica(raiz) {
195
+ try {
196
+ const conteudo = fs.readFileSync(path.join(raiz, '.git'), 'utf8').trim();
197
+ if (!conteudo.startsWith('gitdir:'))
198
+ return raiz;
199
+ const gitdir = path.resolve(raiz, conteudo.slice('gitdir:'.length).trim());
200
+ const comum = path.resolve(gitdir, fs.readFileSync(path.join(gitdir, 'commondir'), 'utf8').trim());
201
+ if (path.dirname(gitdir) !== path.join(comum, 'worktrees'))
202
+ return raiz;
203
+ const deVolta = path.resolve(gitdir, fs.readFileSync(path.join(gitdir, 'gitdir'), 'utf8').trim());
204
+ if (caminhoReal(deVolta) !== path.join(caminhoReal(raiz), '.git'))
205
+ return raiz;
206
+ if (path.basename(comum) !== '.git')
207
+ return fs.existsSync(path.join(comum, '.git')) ? raiz : comum;
208
+ return path.dirname(comum);
209
+ }
210
+ catch {
211
+ return raiz;
212
+ }
213
+ }
214
+ /**
215
+ * O impedimento ja foi resolvido? So o de confianca do diretorio tem prova local: o `claude` grava
216
+ * `hasTrustDialogAccepted` por projeto no `.claude.json` da conta (o do perfil, com `CLAUDE_CONFIG_DIR`).
217
+ * `null` e "nao sei": o retry despacha e o runtime decide; se recusar de novo, a mesma pausa volta.
218
+ *
219
+ * RM-055 (continuacao, D1): a regra e a que o claude 2.1.296 aplica no `--bg`, medida com worktrees git
220
+ * reais: vale a confianca do proprio diretorio e dos de cima ate a raiz git, inclusive, e a da raiz
221
+ * canonica de uma worktree vinculada (o repositorio principal), more a worktree dentro ou fora dele. Acima
222
+ * da raiz git nada vale: com so o diretorio de cima do repositorio confiado, o claude recusa a worktree.
223
+ * Fora de git, qualquer diretorio de cima vale, como no claude.
224
+ */
225
+ function impedimentoResolvido(motivo, ctx) {
226
+ if (motivo !== 'runtime.workspace-untrusted' || ctx.runtime !== 'claude-bg')
227
+ return null;
228
+ // A conta do processo segue o `CLAUDE_CONFIG_DIR` do ambiente, como o proprio `claude`.
229
+ const configDir = ctx.configDir ?? (ctx.home ? null : process.env.CLAUDE_CONFIG_DIR) ?? null;
230
+ const arquivo = configDir ? path.join(configDir, '.claude.json') : path.join(ctx.home ?? os.homedir(), '.claude.json');
231
+ let projetos;
232
+ try {
233
+ const dados = JSON.parse(fs.readFileSync(arquivo, 'utf8'));
234
+ if (!dados || typeof dados.projects !== 'object' || dados.projects === null)
235
+ return null;
236
+ projetos = dados.projects;
237
+ }
238
+ catch {
239
+ return null;
240
+ }
241
+ const confia = (dir) => projetos[dir]?.hasTrustDialogAccepted === true;
242
+ const cwd = caminhoReal(ctx.cwd);
243
+ const raiz = raizGit(cwd);
244
+ if (raiz && confia(raizCanonica(raiz)))
245
+ return true;
246
+ for (let dir = cwd;; dir = path.dirname(dir)) {
247
+ if (confia(dir))
248
+ return true;
249
+ if (dir === raiz || path.dirname(dir) === dir)
250
+ return false;
251
+ }
252
+ }
253
+ /** A frase de correcao que vai ao gate e ao monitor: o comando e o que vem depois. */
254
+ function correcaoDoImpedimento(i) {
255
+ return `rode \`${i.comando}\`; ${i.depois}`;
256
+ }
257
+ /**
258
+ * RM-055: classifica a saida de um despacho recusado e, quando so o dono resolve, grava o `gate_blocked`
259
+ * tipado que o monitor, a fabrica, o board e o pulse leem como espera do dono. Devolve null quando o
260
+ * motivo nao e do dono (o chamador segue no caminho de antes). Tambem usado pelo redespacho do retry.
261
+ */
262
+ function registrarImpedimentoDoDono(dir, thread, d) {
263
+ const impedimento = classificarImpedimento(d.saida, { thread: thread.id, fase: d.fase, runtime: d.runtime, cwd: d.cwd });
264
+ if (!impedimento)
265
+ return null;
266
+ (0, gates_1.registrarGateBloqueado)(dir, thread.id, { gate: 'phase.dispatch', motivo: impedimento.motivo, modo: thread.modo,
267
+ detalhe: impedimento.trava, correcao: correcaoDoImpedimento(impedimento), fase: d.fase, slug: d.slug,
268
+ runtime: d.runtime, cwd: d.cwd, origem: d.origem, promptPath: d.promptPath, promptSha256: d.promptSha256,
269
+ impedimento: { motivo: impedimento.motivo, comando: impedimento.comando, depois: impedimento.depois, trecho: impedimento.trecho },
270
+ ...(d.perfil ? { perfil: d.perfil } : {}), pausaQualquerModo: true,
271
+ evidencia: 'stderr real do runtime adapter no despacho, nao relato do agente' });
272
+ return impedimento;
273
+ }
274
+ /** O impedimento gravado no `gate_blocked`, lido de volta com tipos; null quando o evento nao o traz. */
275
+ function impedimentoDoEvento(e) {
276
+ const i = e.impedimento;
277
+ if (!i || typeof i.comando !== 'string' || typeof i.depois !== 'string')
278
+ return null;
279
+ return { comando: i.comando, depois: i.depois, trecho: typeof i.trecho === 'string' ? i.trecho : '' };
280
+ }
281
+ /**
282
+ * RM-055 (b): o pedido do impedimento no contrato curto da RM-048 (`ork.hitl-curto/v1`): o que trava,
283
+ * desde quando, o comando exato que o dono roda e o que o ork faz depois. A recomendada e o re-despacho
284
+ * do mesmo prompt; as outras dizem o custo de nao fazer nada e de trocar o runtime do bloco.
285
+ */
286
+ function pedidoCurtoDoImpedimento(d, quando) {
287
+ const retry = `ork retry run ${d.thread}`;
288
+ return (0, hitl_curto_1.montarPedidoCurto)({
289
+ thread: d.thread, fase: d.fase, desde: d.desdeEm,
290
+ pergunta: `Você roda \`${d.impedimento.comando}\` no terminal para destravar o despacho?`,
291
+ corpo: [`${d.motivo}: ${d.detalhe}`, `Depois: ${d.impedimento.depois}.`],
292
+ alternativas: [
293
+ { chave: 'a', texto: 'Rodei o comando', consequencia: `\`${retry}\` re-despacha ${d.fase ?? 'a fase'} com o mesmo prompt gravado`,
294
+ recomendada: { porque: 'nada rodou ainda; o pedido volta igual, sem você reescrever nada' } },
295
+ { chave: 'b', texto: 'Trocar o runtime do bloco', consequencia: 'ork setup <modo> --bloco N --runtime <outro>, e depois o mesmo retry' },
296
+ { chave: 'c', texto: 'Deixar parada', consequencia: 'nada é despachado; a thread segue esperando você' },
297
+ ],
298
+ }, { quando, responder: { tipo: 'terminal', comando: retry } });
299
+ }