@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,165 @@
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.COMANDO_CONFIRMAR_WORKTREE = exports.ARQUIVO_WORKTREE_LOCAL = exports.CONTRATO_WORKTREE_LOCAL = void 0;
37
+ exports.caminhoRealPrevisto = caminhoRealPrevisto;
38
+ exports.pastaDasWorktreesPedida = pastaDasWorktreesPedida;
39
+ exports.lerWorktreeLocal = lerWorktreeLocal;
40
+ exports.recusaDePastaDasWorktrees = recusaDePastaDasWorktrees;
41
+ exports.exigirPastaDasWorktrees = exigirPastaDasWorktrees;
42
+ exports.confirmarWorktreeLocal = confirmarWorktreeLocal;
43
+ exports.revogarWorktreeLocal = revogarWorktreeLocal;
44
+ /**
45
+ * RM-047 (fronteira de confiança, P3): a pasta das worktrees fora da raiz vale só com a confirmação
46
+ * desta máquina.
47
+ *
48
+ * O `worktree.dir` mora no `orkastery.yaml`, que vem com o repositório, e o `git worktree add` cria o
49
+ * checkout (e o `.gitignore` da pasta) onde ele apontar. Dentro da raiz do projeto, pelo caminho real,
50
+ * nada muda. Fora dela (`..`, caminho absoluto ou um link versionado que leva para fora), a criação
51
+ * recusa com `worktree.dir-fora-da-raiz` até a máquina confirmar a mesma pasta com
52
+ * `ork setup worktree confirmar`. A confirmação fica em `.orkastery/private/worktree-local.json`, com
53
+ * as mesmas regras da postura de sandbox (P1): pasta 0700, arquivo 0600, nunca link, nunca rastreado
54
+ * pelo git, e só para este checkout e esta pasta.
55
+ */
56
+ const fs = __importStar(require("node:fs"));
57
+ const path = __importStar(require("node:path"));
58
+ const estado_thread_1 = require("./estado-thread");
59
+ const postura_local_1 = require("./postura-local");
60
+ const util_1 = require("./util");
61
+ exports.CONTRATO_WORKTREE_LOCAL = 'ork.worktree-local/v1';
62
+ exports.ARQUIVO_WORKTREE_LOCAL = 'worktree-local.json';
63
+ /**
64
+ * Caminho real de um caminho que talvez ainda não exista: o real do ancestral mais próximo que existe,
65
+ * mais o resto. Um link no caminho (inclusive versionado no clone) é resolvido aqui.
66
+ */
67
+ function caminhoRealPrevisto(alvo) {
68
+ let atual = path.resolve(alvo);
69
+ const resto = [];
70
+ for (;;) {
71
+ try {
72
+ return path.join(fs.realpathSync(atual), ...resto.reverse());
73
+ }
74
+ catch { /* sobe */ }
75
+ const pai = path.dirname(atual);
76
+ if (pai === atual)
77
+ return path.resolve(alvo);
78
+ resto.push(path.basename(atual));
79
+ atual = pai;
80
+ }
81
+ }
82
+ /** A pasta das worktrees que o manifesto pede, pelo caminho real, e se ela fica dentro da raiz. */
83
+ function pastaDasWorktreesPedida(raiz, manifesto) {
84
+ let principal;
85
+ try {
86
+ principal = (0, estado_thread_1.raizDoEstado)(raiz);
87
+ }
88
+ catch {
89
+ principal = path.resolve(raiz);
90
+ }
91
+ const raizReal = caminhoRealPrevisto(principal);
92
+ const dir = caminhoRealPrevisto(path.resolve(principal, manifesto.worktree.dir));
93
+ const rel = path.relative(raizReal, dir);
94
+ const primeiro = rel.split(path.sep)[0];
95
+ const dentro = !rel.startsWith('..') && !path.isAbsolute(rel) && primeiro !== '.git';
96
+ return { dir, dentro };
97
+ }
98
+ /** Lê a confirmação local; `null` com o motivo quando ela não existe ou não vale. */
99
+ function lerWorktreeLocal(raiz) {
100
+ const { bruto: o, motivo } = (0, postura_local_1.lerArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL);
101
+ if (!o)
102
+ return { local: null, motivo };
103
+ if (o.contrato !== exports.CONTRATO_WORKTREE_LOCAL || typeof o.dir !== 'string' || typeof o.raiz !== 'string' ||
104
+ typeof o.confirmadoEm !== 'string' || typeof o.por !== 'string') {
105
+ return { local: null, motivo: `${exports.ARQUIVO_WORKTREE_LOCAL} fora do contrato ${exports.CONTRATO_WORKTREE_LOCAL}` };
106
+ }
107
+ if (o.raiz !== (0, postura_local_1.raizRealDoEstado)(raiz))
108
+ return { local: null, motivo: 'a confirmação local é de outro checkout' };
109
+ return { local: o, motivo: null };
110
+ }
111
+ /** Comando que confirma a pasta nesta máquina; vai em toda recusa. */
112
+ exports.COMANDO_CONFIRMAR_WORKTREE = 'ork setup worktree confirmar';
113
+ /**
114
+ * A recusa da criação de worktree: `null` quando a pasta do manifesto fica dentro da raiz, ou quando
115
+ * a máquina confirmou exatamente essa pasta; senão o erro tipado com o comando que confirma.
116
+ */
117
+ function recusaDePastaDasWorktrees(raiz, manifesto) {
118
+ const { dir, dentro } = pastaDasWorktreesPedida(raiz, manifesto);
119
+ if (dentro)
120
+ return null;
121
+ const { local, motivo } = lerWorktreeLocal(raiz);
122
+ if (local && local.dir === dir)
123
+ return null;
124
+ const porque = local ? `a máquina confirmou ${local.dir}` : motivo ?? 'sem confirmação local';
125
+ return `worktree.dir-fora-da-raiz: o orkastery.yaml pede worktree.dir: ${JSON.stringify(manifesto.worktree.dir).slice(0, 200)}, ` +
126
+ `que leva a ${dir}, fora da raiz do projeto (pelo caminho real), e esta máquina não confirmou essa pasta (${porque}). ` +
127
+ 'Nenhuma worktree foi criada. O manifesto vem com o repositório; quem decide criar checkout fora da raiz é a ' +
128
+ `máquina. Para aceitar nesta máquina: ${exports.COMANDO_CONFIRMAR_WORKTREE} (ou volte worktree.dir para dentro do projeto, ` +
129
+ 'como .claude/worktrees).';
130
+ }
131
+ /** Lança a recusa, quando houver. */
132
+ function exigirPastaDasWorktrees(raiz, manifesto) {
133
+ const recusa = recusaDePastaDasWorktrees(raiz, manifesto);
134
+ if (recusa)
135
+ throw new Error(recusa);
136
+ }
137
+ /**
138
+ * Grava a confirmação local da pasta que o manifesto pede hoje. Com `esperado`, ele precisa levar à
139
+ * mesma pasta: a máquina confirma o que leu, não o que o manifesto pode passar a dizer depois.
140
+ */
141
+ function confirmarWorktreeLocal(raiz, manifesto, por, esperado) {
142
+ const { dir, dentro } = pastaDasWorktreesPedida(raiz, manifesto);
143
+ if (esperado !== undefined) {
144
+ let principal;
145
+ try {
146
+ principal = (0, estado_thread_1.raizDoEstado)(raiz);
147
+ }
148
+ catch {
149
+ principal = path.resolve(raiz);
150
+ }
151
+ const pedido = caminhoRealPrevisto(path.resolve(principal, esperado));
152
+ if (pedido !== dir) {
153
+ throw new Error(`worktree.dir-divergente: o orkastery.yaml leva a ${dir}, não a ${pedido}; nada foi confirmado`);
154
+ }
155
+ }
156
+ if (dentro)
157
+ throw new Error(`worktree.dir-dentro-da-raiz: ${dir} fica dentro do projeto e não precisa de confirmação`);
158
+ const local = { contrato: exports.CONTRATO_WORKTREE_LOCAL, dir, raiz: (0, postura_local_1.raizRealDoEstado)(raiz), confirmadoEm: (0, util_1.agora)(), por };
159
+ (0, postura_local_1.gravarArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL, local);
160
+ return local;
161
+ }
162
+ /** Apaga a confirmação local; devolve se havia uma. */
163
+ function revogarWorktreeLocal(raiz) {
164
+ return (0, postura_local_1.revogarArquivoPrivado)(raiz, exports.ARQUIVO_WORKTREE_LOCAL);
165
+ }
package/dist/worktree.js CHANGED
@@ -64,9 +64,13 @@ const leases_1 = require("./leases");
64
64
  const thread_1 = require("./thread");
65
65
  const util_1 = require("./util");
66
66
  const estado_thread_1 = require("./estado-thread");
67
- /** Diretorio canonico da worktree de uma thread, resolvido pelo `ork`. */
67
+ const procedencia_1 = require("./procedencia");
68
+ /**
69
+ * Diretorio canonico da worktree de uma thread, resolvido pelo `ork` na arvore principal: o mesmo que a criacao usa,
70
+ * tambem quando o comando roda de dentro de outra worktree (P4 do ensaio da 0.5.0).
71
+ */
68
72
  function dirDaWorktree(carregado, id) {
69
- return path.resolve(carregado.raiz, carregado.manifesto.worktree.dir, id);
73
+ return (0, thread_1.pastaDaWorktree)(carregado, id);
70
74
  }
71
75
  /** Branch canonica da worktree de uma thread. */
72
76
  function branchDaWorktree(thread) {
@@ -517,7 +521,18 @@ function auditarWorktree(carregado, id) {
517
521
  correcao: `git -C ${dir} switch ${branchEsperada}`,
518
522
  });
519
523
  }
524
+ // RM-047 (P2): git so roda na worktree registrada e com o thread.json local.
525
+ let procedencia = null;
520
526
  if (existe) {
527
+ try {
528
+ (0, procedencia_1.exigirCwdLocal)(raiz, id, dir, 'thread');
529
+ }
530
+ catch (e) {
531
+ procedencia = e.message;
532
+ checks.push({ nome: 'procedencia', nivel: 'fail', detalhe: procedencia, correcao: `ork worktree ensure ${id}` });
533
+ }
534
+ }
535
+ if (existe && procedencia === null) {
521
536
  const limpa = arvoreLimpa(dir);
522
537
  checks.push(limpa === true
523
538
  ? { nome: 'arvore', nivel: 'ok', detalhe: 'sem alteracao nao commitada' }
@@ -638,6 +653,14 @@ function liberarWorktree(carregado, id, opcoes = {}) {
638
653
  correcao: '',
639
654
  };
640
655
  }
656
+ // RM-047 (P2): nada de git num diretorio que o thread.json escolheu e o git nao registra.
657
+ try {
658
+ (0, procedencia_1.exigirCwdLocal)(raiz, id, dir, 'thread');
659
+ }
660
+ catch (e) {
661
+ return { ok: false, removida: false, dir, branch, leasesLiberados: [], motivo: 'tree.blocked',
662
+ detalhe: e.message, correcao: `confira o diretorio e o thread.json da thread ${id}` };
663
+ }
641
664
  const limpa = arvoreLimpa(dir);
642
665
  if (limpa === false && !opcoes.forcar) {
643
666
  return {
package/dist/yaml.js CHANGED
@@ -55,10 +55,16 @@ function escalar(bruto) {
55
55
  }
56
56
  return t;
57
57
  }
58
- function preparar(texto) {
58
+ function preparar(texto, estrito) {
59
59
  const linhas = [];
60
60
  texto.split('\n').forEach((original, i) => {
61
- const semComentario = tirarComentario(original).replace(/\s+$/, '');
61
+ const cortada = tirarComentario(original);
62
+ // D9: no modo estrito, o `#` depois do valor nao corta o valor calado (`titulo: Decisao #42`); com o `#`
63
+ // no texto, o valor vai entre aspas. Comentario na linha inteira segue valendo.
64
+ if (estrito && cortada !== original && cortada.trim() !== '') {
65
+ throw new Error(`YAML invalido na linha ${i + 1}: comentario depois do valor (com # no texto, use aspas)`);
66
+ }
67
+ const semComentario = cortada.replace(/\s+$/, '');
62
68
  if (semComentario.trim() === '')
63
69
  return;
64
70
  if (semComentario.trim() === '---')
@@ -68,7 +74,7 @@ function preparar(texto) {
68
74
  });
69
75
  return linhas;
70
76
  }
71
- function parseBloco(linhas, inicio, indent) {
77
+ function parseBloco(linhas, inicio, indent, estrito) {
72
78
  let i = inicio;
73
79
  if (i >= linhas.length)
74
80
  return [null, i];
@@ -89,6 +95,9 @@ function parseBloco(linhas, inicio, indent) {
89
95
  throw new Error(`YAML invalido na linha ${linha.numero}: esperado "chave: valor"`);
90
96
  }
91
97
  const chave = linha.conteudo.slice(0, sep).trim().replace(/^["']|["']$/g, '');
98
+ if (estrito && (chave === '__proto__' || Object.hasOwn(mapa, chave))) {
99
+ throw new Error(`YAML invalido na linha ${linha.numero}: chave ${chave === '__proto__' ? 'reservada' : 'repetida'}`);
100
+ }
92
101
  const resto = linha.conteudo.slice(sep + 1).trim();
93
102
  i++;
94
103
  if (resto !== '') {
@@ -96,7 +105,7 @@ function parseBloco(linhas, inicio, indent) {
96
105
  continue;
97
106
  }
98
107
  if (i < linhas.length && linhas[i].indent > indent) {
99
- const [filho, proximo] = parseBloco(linhas, i, linhas[i].indent);
108
+ const [filho, proximo] = parseBloco(linhas, i, linhas[i].indent, estrito);
100
109
  mapa[chave] = filho;
101
110
  i = proximo;
102
111
  }
@@ -106,11 +115,21 @@ function parseBloco(linhas, inicio, indent) {
106
115
  }
107
116
  return [mapa, i];
108
117
  }
109
- /** Le um documento YAML do subconjunto suportado. */
110
- function lerYaml(texto) {
111
- const linhas = preparar(texto);
118
+ /**
119
+ * Le um documento YAML do subconjunto suportado.
120
+ *
121
+ * RM-026 K7 (D9): `estrito` serve a quem le texto que nao e do `ork` (o frontmatter do conhecimento). Chave
122
+ * repetida no mesmo mapa, `__proto__`, comentario depois do valor e linha que sobra (indentacao fora do bloco)
123
+ * recusam, em vez de sumir calados como no modo padrao, que o `orkastery.yaml` e as paginas de docs seguem usando.
124
+ */
125
+ function lerYaml(texto, opcoes = {}) {
126
+ const estrito = opcoes.estrito === true;
127
+ const linhas = preparar(texto, estrito);
112
128
  if (linhas.length === 0)
113
129
  return {};
114
- const [valor] = parseBloco(linhas, 0, linhas[0].indent);
130
+ const [valor, proximo] = parseBloco(linhas, 0, linhas[0].indent, estrito);
131
+ if (estrito && proximo < linhas.length) {
132
+ throw new Error(`YAML invalido na linha ${linhas[proximo].numero}: indentacao fora do bloco`);
133
+ }
115
134
  return valor;
116
135
  }
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "fx-pedido-colado",
3
+ "sobre": "Incidente de 01/10/2026 (RM-057): o pedido colado com autorização explícita segue sem parar",
4
+ "precisa": [
5
+ "git"
6
+ ],
7
+ "esperado": {
8
+ "simulado": true,
9
+ "modoDoPedido": "auto",
10
+ "semPausaDoModo": true,
11
+ "decisaoInformada": true,
12
+ "confirmoRecusado": "hitl.selecao.texto-livre",
13
+ "nadaGravadoNaRecusa": true,
14
+ "humanosNoPulse": 0,
15
+ "perguntasDeConducao": 0,
16
+ "tempoParadoMs": 0,
17
+ "adaptadoresComARegra": 4
18
+ },
19
+ "porque": "Na noite de 01 para 02/10 o condutor parou mais de 10 h pedindo um confirmo em texto livre a um pedido colado que já trazia a autorização. O canário prova, contra o código real, que o #Auto não pausa, a dúvida vira decisão informada, o confirmo em texto é recusado sem gravar nada, ninguém aparece esperando no pulse, o tempo parado é zero e os quatro adaptadores dizem a regra."
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orkastery/cli",
3
- "version": "0.5.1",
3
+ "version": "0.5.6",
4
4
  "description": "A software factory of AI agents that proves its work: parallel threads, verified results, and short decisions only when they matter.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/orkastery/orkastery#readme",
@@ -65,12 +65,16 @@
65
65
  },
66
66
  "devDependencies": {
67
67
  "@types/node": "^22.10.2",
68
- "markdownlint-cli2": "^0.23.3",
69
- "typescript": "^5.9.2"
68
+ "markdownlint-cli2": "^0.22.1"
70
69
  },
71
70
  "dependencies": {
72
71
  "@modelcontextprotocol/sdk": "1.29.0",
72
+ "decode-named-character-reference": "1.3.0",
73
+ "micromark": "4.0.2",
74
+ "micromark-extension-gfm-table": "2.1.1",
75
+ "micromark-util-decode-numeric-character-reference": "2.0.2",
73
76
  "smol-toml": "1.8.0",
77
+ "typescript": "5.9.3",
74
78
  "zod": "3.25.76",
75
79
  "zod-to-json-schema": "3.25.2"
76
80
  }
@@ -54,7 +54,7 @@ flowchart LR
54
54
 
55
55
  | # | Verificacao | Como se comprova |
56
56
  |---|---|---|
57
- | 16 | Existe MASTER log valido contra o contrato congelado `ork.master-log/v1`, com POSTMORTEM tipado, classes de falha do catalogo fixo, score inteiro de 0 a 5 e justificativa nao vazia. Uma entrega sem MASTER log nao aconteceu. | `ork master <thread> --score N --justificativa "<texto>"`. O comando recusa score fora da escala, score sem justificativa e classe fora do catalogo, e nao grava nada quando recusa. |
57
+ | 16 | Existe MASTER log valido contra o contrato congelado `ork.master-log/v1`, com POSTMORTEM tipado, classes de falha do catalogo fixo, score inteiro de 0 a 5 e justificativa nao vazia. Uma entrega sem MASTER log nao aconteceu. | `ork master <thread> --score N --justificativa "<texto>" --por <quem>`. O comando recusa score fora da escala, score sem justificativa, score sem autoria humana em `--por` e classe fora do catalogo, e nao grava nada quando recusa. |
58
58
 
59
59
  ## Toda thread, no seu inicio
60
60
 
@@ -258,7 +258,8 @@
258
258
  "imports",
259
259
  "calls",
260
260
  "references",
261
- "derived_from"
261
+ "derived_from",
262
+ "cites"
262
263
  ]
263
264
  },
264
265
  "snapshot_id": {
package/skills/README.md CHANGED
@@ -18,7 +18,7 @@ faz, o nucleo vence, e a divergencia e defeito da skill.
18
18
  | phases | [go-implementation](phases/go-implementation/SKILL.md) | `ork worktree ensure`, `ork verify --baseline` |
19
19
  | phases | [check-quality](phases/check-quality/SKILL.md) | `ork verify`, `ork gate request` |
20
20
  | phases | [ship-release](phases/ship-release/SKILL.md) | `ork ship` |
21
- | phases | [master-metrics](phases/master-metrics/SKILL.md) | `ork master`, `ork master --aceitar-omissao` |
21
+ | phases | [master-metrics](phases/master-metrics/SKILL.md) | `ork master`, `ork master <thread> --aceitar-omissao` |
22
22
  | reviewers | [code-reviewer](reviewers/code-reviewer/SKILL.md) | `references/code-review-axes.md` |
23
23
  | reviewers | [security-auditor](reviewers/security-auditor/SKILL.md) | `references/security-checklist.md` |
24
24
  | reviewers | [test-engineer](reviewers/test-engineer/SKILL.md) | `references/testing-patterns.md` |
@@ -56,6 +56,7 @@ Prefira MCP no projeto fixado pelo servidor, sem outro root/cwd. No Claude com s
56
56
  | Demanda nova | `ork_thread_new(nome, modo)` | `ork thread new "<nome>" --mode <modo> --worktree auto` |
57
57
  | Despacho | `ork_phase_run(threadId, fase, prompt, runtime?, model?, effort?, dryRun?)` | `ork phase run <thread> GOAL --prompt "<pedido>"` |
58
58
  | Progresso nativo | `ork_observe(threadId)` | `ork thread status <thread>` |
59
+ | Contexto do grafo (somente com `grafo.mcp: true`) | `ork_grafo_contexto(threadId, tetoBytes?)`; aprofundar com `ork_grafo_vizinhos`, `ork_grafo_chamadores`, `ork_grafo_importadores`, `ork_grafo_caminho` | `ork grafo contexto <thread> --json` |
59
60
  | Pendencia/decisao | `ork_hitl_pending`, `ork_request_decision(threadId, pedidoId)` | Consulte o ingresso suportado; nao fabrique resposta. |
60
61
 
61
62
  Prefira `ork_git_commit` (HEAD atual, paths com claims), `ork_verify` e `ork_ship` (HEADs fonte/destino reais) para registrar, verificar e entregar. Autoria/commit nao e SHIP; retorno incomplete exige reconciliacao antes de repetir. Para demandas novas, use `ork modos --do-pedido "<pedido do dono>"` e `ork_preflight({modo})` (CLI: `ork doctor --modo <modo>`). A sonda por bloco não comprova autenticação, gates ou entrega.
@@ -71,8 +72,7 @@ Dry-run nao inicia modelo, mas pode gravar prompt/eventos. Confira o trio efetiv
71
72
 
72
73
  ## Conducao durante o trabalho
73
74
 
74
- O modo afrouxa a pausa, NUNCA a verificacao. Claims, verify, policies e gates tipados
75
- rodam identicos em `#Classic` e em `#Auto`; o modo decide se o veredito espera o humano.
75
+ O modo afrouxa a pausa, NUNCA a verificacao. Claims, verify, policies e gates tipados rodam identicos em `#Classic` e em `#Auto`; o modo decide se o veredito espera o humano.
76
76
 
77
77
  Depois de uma acao, use o resultado do nucleo para executar o proximo passo autorizado.
78
78
  Em #Auto/#Maestro, nao termine um bloco apenas oferecendo continuar quando ainda ha trabalho
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: master-metrics
3
- description: "Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado ork.master-log/v1 e o score humano de 0 a 5 com justificativa. Roteia para ork master e ork master --aceitar-omissao."
3
+ description: "Fase MASTER (F6): POSTMORTEM tipado, MASTER log no contrato congelado ork.master-log/v1 e o score humano de 0 a 5 com justificativa. Roteia para ork master e ork master <thread> --aceitar-omissao."
4
4
  bucket: phases
5
- roteia: "ork master <thread> --score N --justificativa \"...\" | ork master --aceitar-omissao"
5
+ roteia: "ork master <thread> --score N --justificativa \"...\" | ork master <thread> --aceitar-omissao"
6
6
  license: MIT
7
7
  ---
8
8
 
@@ -21,9 +21,14 @@ ork master classes # as classes de falha do catalogo
21
21
  ork master <thread> --score 4 --justificativa "<texto>" --classe base-avancou --por <quem>
22
22
  ork master # as entregas, com o indice derivado do ledger
23
23
  ork master --todas # inclusive as ja pontuadas
24
- ork master --aceitar-omissao # aceita as entregues, com indice e insumos no ledger
24
+ ork master <thread> --aceitar-omissao # aceita so a entrega desta thread, com indice e insumos no ledger
25
+ ork master --aceitar-omissao --dry-run # lista o que a forma sem thread fecharia, sem gravar
25
26
  ```
26
27
 
28
+ Agente fecha so a propria thread: `ork master <thread> --aceitar-omissao`. Sem a thread, o comando
29
+ aceita TODAS as entregues do projeto, inclusive as de outras frentes paralelas (o que aconteceu tres
30
+ vezes em 03/10/2026); de processo de agente com mais de uma, o `ork` avisa em stderr.
31
+
27
32
  ## O que o MASTER entrega
28
33
 
29
34
  1. **POSTMORTEM tipado**, com as fases percorridas, o que falhou e a classe de falha vinda de um