@orkastery/cli 0.2.0 → 0.4.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 (257) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +86 -65
  3. package/adapters/README.md +30 -15
  4. package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
  5. package/adapters/claude-code/README.md +110 -8
  6. package/adapters/claude-code/commands/check.md +4 -3
  7. package/adapters/claude-code/commands/goal.md +3 -2
  8. package/adapters/claude-code/commands/master.md +3 -2
  9. package/adapters/claude-code/commands/onboarding.md +21 -0
  10. package/adapters/claude-code/commands/ork.md +99 -27
  11. package/adapters/claude-code/hooks/hooks.json +6 -1
  12. package/adapters/claude-code/hooks/ork-guard.js +1 -1
  13. package/adapters/claude-code/hooks/ork-sensor.js +66 -0
  14. package/adapters/codex/skills/ork/SKILL.md +57 -0
  15. package/adapters/hermes/README.md +161 -0
  16. package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
  17. package/adapters/hermes/bin/ork-brain.sh +4 -0
  18. package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
  19. package/adapters/hermes/bin/ork-maestro.sh +6 -0
  20. package/adapters/hermes/bin/ork-master-enviar.py +84 -0
  21. package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
  22. package/adapters/hermes/hermes.plugin.json +24 -4
  23. package/adapters/hermes/hitl-ingress/__init__.py +356 -0
  24. package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
  25. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
  26. package/adapters/openclaw/README.md +136 -27
  27. package/adapters/openclaw/bin/ork-brain.sh +4 -0
  28. package/adapters/openclaw/construir.sh +19 -0
  29. package/adapters/openclaw/dist/hitl-ingress.js +199 -0
  30. package/adapters/openclaw/dist/index.js +437 -0
  31. package/adapters/openclaw/openclaw.plugin.json +39 -134
  32. package/adapters/openclaw/package.json +26 -0
  33. package/adapters/openclaw/src/hitl-ingress.ts +180 -0
  34. package/adapters/openclaw/src/index.ts +460 -0
  35. package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
  36. package/adapters/openclaw/tsconfig.json +15 -0
  37. package/assets/docs/markdownlint-cli2.jsonc +22 -0
  38. package/assets/docs/padroes/documentacao-de-produto.md +133 -0
  39. package/assets/docs/padroes/roadmap-de-produto.md +98 -0
  40. package/assets/docs/produto/README.md +14 -0
  41. package/assets/docs/produto/_modelo-feature.md +59 -0
  42. package/assets/docs/roadmap/README.md +14 -0
  43. package/assets/docs/roadmap/_modelo-item.md +73 -0
  44. package/assets/orkmind-native-schema.json +32 -0
  45. package/assets/orkmind_bridge.py +357 -0
  46. package/assets/orkmind_fixture.py +67 -0
  47. package/assets/orkmind_prospective.py +138 -0
  48. package/assets/reference-tariffs-i07.json +23 -0
  49. package/dist/adapters/claude-bg.js +488 -39
  50. package/dist/adapters/codex-controller-sensor.js +449 -0
  51. package/dist/adapters/codex-controller-worker.js +361 -0
  52. package/dist/adapters/codex-controller.js +252 -0
  53. package/dist/adapters/codex-events.js +205 -0
  54. package/dist/adapters/codex-question.js +26 -0
  55. package/dist/adapters/codex-runner.js +133 -0
  56. package/dist/adapters/codex.js +394 -0
  57. package/dist/agents-md.js +84 -0
  58. package/dist/auditoria.js +12 -9
  59. package/dist/auditrun.js +5 -4
  60. package/dist/board.js +174 -23
  61. package/dist/branch-de-estado.js +136 -0
  62. package/dist/canarios-hitl.js +177 -0
  63. package/dist/canarios-i43.js +543 -0
  64. package/dist/canarios-pulse.js +147 -0
  65. package/dist/canarios-sensores.js +129 -0
  66. package/dist/canarios.js +111 -2
  67. package/dist/catalogo.js +9 -0
  68. package/dist/ci.js +223 -0
  69. package/dist/ciclos.js +2 -1
  70. package/dist/claim-lint.js +64 -0
  71. package/dist/claims.js +60 -0
  72. package/dist/company-brain-capture.js +195 -0
  73. package/dist/company-brain-cli.js +123 -0
  74. package/dist/company-brain-client.js +61 -0
  75. package/dist/company-brain-contract.js +166 -0
  76. package/dist/company-brain-journal.js +192 -0
  77. package/dist/company-brain-mcp.js +33 -0
  78. package/dist/company-brain-migration.js +60 -0
  79. package/dist/company-brain-source.js +177 -0
  80. package/dist/company-brain-worker.js +18 -0
  81. package/dist/conducao-texto.js +61 -0
  82. package/dist/conducao.js +876 -0
  83. package/dist/contrato-publico.js +39 -0
  84. package/dist/creation-operation-store.js +251 -0
  85. package/dist/creation-operation.js +148 -0
  86. package/dist/decisao-autonoma.js +183 -0
  87. package/dist/delegation.js +79 -0
  88. package/dist/demo.js +120 -0
  89. package/dist/docs.js +828 -0
  90. package/dist/doctor.js +184 -25
  91. package/dist/entrega-pr.js +117 -0
  92. package/dist/escopo-escrita.js +71 -0
  93. package/dist/estado-thread.js +222 -0
  94. package/dist/evalrunner.js +12 -0
  95. package/dist/fabrica-estado.js +329 -0
  96. package/dist/fabrica-publicar.js +76 -0
  97. package/dist/fix.js +22 -1
  98. package/dist/gates.js +59 -11
  99. package/dist/handoff.js +39 -23
  100. package/dist/hitl-canais.js +333 -0
  101. package/dist/hitl-classificacao.js +131 -0
  102. package/dist/hitl-contract.js +465 -0
  103. package/dist/hitl-estado.js +136 -0
  104. package/dist/hitl-gates.js +554 -0
  105. package/dist/hitl-ingress-receipt.js +382 -0
  106. package/dist/hitl-local-atestado.js +57 -0
  107. package/dist/hitl-local-receipt.js +328 -0
  108. package/dist/hitl-local.js +143 -0
  109. package/dist/hitl-lock.js +139 -0
  110. package/dist/hitl-lote.js +223 -0
  111. package/dist/hitl-native-offer.js +97 -0
  112. package/dist/hitl-native.js +65 -0
  113. package/dist/hitl-presentation.js +209 -0
  114. package/dist/hitl-public-receipt.js +176 -0
  115. package/dist/hitl-resumo.js +209 -0
  116. package/dist/hitl-sessions.js +475 -0
  117. package/dist/hitl.js +711 -0
  118. package/dist/horario.js +269 -0
  119. package/dist/hosts.js +198 -22
  120. package/dist/index.js +1741 -94
  121. package/dist/indice.js +99 -0
  122. package/dist/init.js +28 -3
  123. package/dist/integracoes-locais.js +17 -0
  124. package/dist/leases.js +65 -21
  125. package/dist/ledger-stats.js +272 -0
  126. package/dist/ledger.js +109 -2
  127. package/dist/licoes.js +221 -0
  128. package/dist/liveness.js +218 -0
  129. package/dist/maestro-actions.js +51 -0
  130. package/dist/maestro-authority.js +152 -0
  131. package/dist/maestro-cli.js +97 -0
  132. package/dist/maestro-contract.js +55 -0
  133. package/dist/maestro-discovery.js +132 -0
  134. package/dist/maestro-runtime.js +268 -0
  135. package/dist/maestro-snapshot.js +86 -0
  136. package/dist/maestro-sources.js +224 -0
  137. package/dist/manifest.js +165 -6
  138. package/dist/maquina.js +102 -0
  139. package/dist/master-audit.js +101 -0
  140. package/dist/master-batch.js +43 -0
  141. package/dist/master-digest.js +149 -0
  142. package/dist/master-migracao.js +155 -0
  143. package/dist/master.js +361 -77
  144. package/dist/mcp-artifacts.js +234 -0
  145. package/dist/mcp-git.js +433 -0
  146. package/dist/mcp-install.js +310 -0
  147. package/dist/mcp-maestro.js +25 -0
  148. package/dist/mcp-server.js +469 -0
  149. package/dist/mcp-ship.js +436 -0
  150. package/dist/mcp-verify.js +173 -0
  151. package/dist/memoria-humana.js +207 -0
  152. package/dist/memoria.js +314 -78
  153. package/dist/memory-migration.js +279 -0
  154. package/dist/memory-prospective.js +148 -0
  155. package/dist/modos-migracao.js +191 -0
  156. package/dist/modos.js +151 -15
  157. package/dist/monitor-lock.js +110 -0
  158. package/dist/objective.js +449 -0
  159. package/dist/ocupacao.js +267 -0
  160. package/dist/onboarding.js +303 -0
  161. package/dist/orkmind.js +389 -90
  162. package/dist/orquestracao.js +96 -69
  163. package/dist/phase.js +612 -151
  164. package/dist/playbook-capabilities.js +150 -0
  165. package/dist/playbook-contracts.js +188 -0
  166. package/dist/policies.js +72 -0
  167. package/dist/portfolio-context.js +61 -0
  168. package/dist/portfolio.js +180 -0
  169. package/dist/preflight.js +207 -0
  170. package/dist/process-audit.js +112 -0
  171. package/dist/project-state.js +93 -0
  172. package/dist/prompts.js +25 -5
  173. package/dist/prova-minima.js +112 -0
  174. package/dist/pulse-cadencia.js +163 -0
  175. package/dist/pulse-consentimento.js +260 -0
  176. package/dist/pulse-delivery.js +323 -0
  177. package/dist/pulse-resposta.js +542 -0
  178. package/dist/pulse.js +262 -0
  179. package/dist/ratelimit.js +35 -2
  180. package/dist/recall.js +80 -3
  181. package/dist/redacao-saida.js +45 -0
  182. package/dist/redacao-url.js +66 -0
  183. package/dist/retry.js +640 -118
  184. package/dist/roadmap-reservas.js +243 -0
  185. package/dist/runtime-ambiente.js +38 -0
  186. package/dist/runtime-context.js +215 -0
  187. package/dist/runtime-profiles.js +869 -0
  188. package/dist/runtimes.js +103 -0
  189. package/dist/sandbox.js +9 -0
  190. package/dist/session-events.js +203 -0
  191. package/dist/session-watcher-claude.js +637 -0
  192. package/dist/session-watcher.js +700 -0
  193. package/dist/sessoes-adopt.js +154 -0
  194. package/dist/sessoes-inventario.js +159 -0
  195. package/dist/sessoes.js +16 -35
  196. package/dist/setup.js +691 -0
  197. package/dist/ship.js +168 -19
  198. package/dist/slug.js +1 -1
  199. package/dist/thread-close.js +115 -0
  200. package/dist/thread.js +142 -28
  201. package/dist/tokens.js +1 -1
  202. package/dist/util.js +4 -2
  203. package/dist/verify-sandbox.js +265 -0
  204. package/dist/verify.js +270 -25
  205. package/dist/versao.js +60 -0
  206. package/dist/worktree.js +31 -2
  207. package/dist/write-activation.js +291 -0
  208. package/dist/yaml.js +5 -1
  209. package/eval/casos/master-metrics.json +1 -1
  210. package/eval/casos/onboarding.json +102 -0
  211. package/eval/casos/orkastery-bootstrap.json +37 -3
  212. package/eval/casos/scope-check-capability-map.json +45 -7
  213. package/eval/casos/ship-release.json +3 -3
  214. package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
  215. package/eval/fixtures/b2-master-log/caso.json +1 -1
  216. package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
  217. package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
  218. package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
  219. package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
  220. package/eval/fixtures/fx-codex-dry/caso.json +18 -0
  221. package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
  222. package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
  223. package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
  224. package/eval/fixtures/fx-happy/caso.json +6 -4
  225. package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
  226. package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
  227. package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
  228. package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
  229. package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
  230. package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
  231. package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
  232. package/eval/fixtures/fx-omnicanal/caso.json +17 -0
  233. package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
  234. package/monitor/company-brain.cjs +17 -0
  235. package/monitor/pulse-scope.cjs +45 -0
  236. package/monitor/pulse.cron +18 -0
  237. package/monitor/varredura-pulse.sh +27 -0
  238. package/package.json +28 -7
  239. package/references/definition-of-done.md +2 -2
  240. package/schemas/claims.schema.json +25 -0
  241. package/schemas/company-brain.schema.json +1158 -0
  242. package/schemas/creation-operation.schema.json +365 -0
  243. package/schemas/maestro-snapshot.schema.json +2716 -0
  244. package/skills/README.md +3 -3
  245. package/skills/core/onboarding/SKILL.md +50 -0
  246. package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
  247. package/skills/core/thread-state/SKILL.md +3 -1
  248. package/skills/governance/decision-triage/SKILL.md +4 -4
  249. package/skills/governance/narrative-guardian/SKILL.md +1 -1
  250. package/skills/governance/roadmap-keeper/SKILL.md +1 -1
  251. package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
  252. package/skills/observability/thread-tracing/SKILL.md +1 -1
  253. package/skills/phases/check-quality/SKILL.md +2 -2
  254. package/skills/phases/goal-definition/SKILL.md +1 -1
  255. package/skills/phases/master-metrics/SKILL.md +9 -7
  256. package/skills/phases/plan-specification/SKILL.md +1 -1
  257. package/skills/phases/ship-release/SKILL.md +1 -1
@@ -0,0 +1,310 @@
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.ENV_VARS_CODEX_MCP = exports.BRAIN_WRITE_TOOLS = exports.BRAIN_READ_TOOLS = exports.TOOLS_FILHO_CODEX = exports.TOOLS_DONO_CODEX = void 0;
37
+ exports.validarGrantsCodex = validarGrantsCodex;
38
+ exports.politicasFilhoCodex = politicasFilhoCodex;
39
+ exports.configuracaoServidorMcp = configuracaoServidorMcp;
40
+ exports.instalarMcp = instalarMcp;
41
+ exports.textoInstalacaoMcp = textoInstalacaoMcp;
42
+ /** Configuracao MCP local ao projeto. Copiar configuracao nao concede confianca ao cliente. */
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const node_crypto_1 = require("node:crypto");
46
+ const node_util_1 = require("node:util");
47
+ const smol_toml_1 = require("smol-toml");
48
+ const manifest_1 = require("./manifest");
49
+ exports.TOOLS_DONO_CODEX = ['ork_thread_new', 'ork_phase_run', 'ork_request_decision'];
50
+ exports.TOOLS_FILHO_CODEX = ['ork_artifact_write', 'ork_claim_add', 'ork_git_commit', 'ork_verify', 'ork_ship'];
51
+ // Brain mutation tools are deliberately excluded from the existing opt-in bundle.
52
+ // A native integration must request exact startup grants plus scoped activation.
53
+ var company_brain_mcp_1 = require("./company-brain-mcp");
54
+ Object.defineProperty(exports, "BRAIN_READ_TOOLS", { enumerable: true, get: function () { return company_brain_mcp_1.BRAIN_READ_TOOLS; } });
55
+ Object.defineProperty(exports, "BRAIN_WRITE_TOOLS", { enumerable: true, get: function () { return company_brain_mcp_1.BRAIN_WRITE_TOOLS; } });
56
+ /** Caminho de sessao, nunca credencial. O cliente resolve o valor no ambiente ao iniciar o MCP. */
57
+ exports.ENV_VARS_CODEX_MCP = ['CODEX_HOME'];
58
+ function objeto(v) {
59
+ if (!v || typeof v !== 'object' || Array.isArray(v))
60
+ throw Error('mcp.install.config.invalid: objeto esperado');
61
+ return v;
62
+ }
63
+ /** Consentimento de invocacao somente: nao responde gates nem altera sandbox. */
64
+ function validarGrantsCodex(entrada, nomes) {
65
+ const conflito = () => { throw Error('mcp.permissions.conflict: politica existente restringe ferramentas; configuracao preservada'); };
66
+ if (entrada.enabled !== undefined && entrada.enabled !== true)
67
+ conflito();
68
+ for (const chave of ['enabled_tools', 'disabled_tools']) {
69
+ const lista = entrada[chave];
70
+ if (lista !== undefined && (!Array.isArray(lista) || lista.some(x => typeof x !== 'string')))
71
+ conflito();
72
+ }
73
+ const tools = entrada.tools === undefined ? {} : objeto(entrada.tools), resultado = {};
74
+ for (const nome of nomes) {
75
+ if ((Array.isArray(entrada.enabled_tools) && !entrada.enabled_tools.includes(nome)) ||
76
+ (Array.isArray(entrada.disabled_tools) && entrada.disabled_tools.includes(nome)))
77
+ conflito();
78
+ const tool = tools[nome] === undefined ? {} : objeto(tools[nome]);
79
+ const mode = tool.approval_mode ?? entrada.default_tools_approval_mode;
80
+ if (mode !== undefined && mode !== 'approve')
81
+ conflito();
82
+ resultado[nome] = { ...tool, approval_mode: 'approve' };
83
+ }
84
+ return resultado;
85
+ }
86
+ /** Renderer filho recebe apenas uma instalacao ja validada e nunca herda grants do dono. */
87
+ function politicasFilhoCodex(entrada) {
88
+ if (entrada.default_tools_approval_mode !== undefined && entrada.default_tools_approval_mode !== 'approve')
89
+ throw Error('mcp.permissions.conflict: default restritivo nao pode ser removido no filho');
90
+ const grants = validarGrantsCodex(entrada, exports.TOOLS_FILHO_CODEX);
91
+ const tools = {};
92
+ if (entrada.tools !== undefined)
93
+ for (const [nome, raw] of Object.entries(objeto(entrada.tools))) {
94
+ const tool = objeto(raw);
95
+ if (tool.approval_mode !== undefined && !['auto', 'prompt', 'writes', 'approve'].includes(String(tool.approval_mode)))
96
+ throw Error('mcp.permissions.conflict: politica de ferramenta invalida');
97
+ if (tool.approval_mode !== 'approve')
98
+ tools[nome] = { ...tool };
99
+ }
100
+ return {
101
+ ...(entrada.enabled_tools !== undefined ? { enabled_tools: entrada.enabled_tools } : {}),
102
+ ...(entrada.disabled_tools !== undefined ? { disabled_tools: entrada.disabled_tools } : {}),
103
+ tools: { ...tools, ...grants },
104
+ };
105
+ }
106
+ function ler(file) {
107
+ let fd;
108
+ try {
109
+ fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
110
+ }
111
+ catch (e) {
112
+ if (e.code === 'ENOENT')
113
+ return null;
114
+ throw Error('mcp.install.config.unsafe');
115
+ }
116
+ try {
117
+ const st = fs.fstatSync(fd);
118
+ if (!st.isFile() || st.size > 262144)
119
+ throw Error('mcp.install.config.unsafe');
120
+ const bytes = fs.readFileSync(fd);
121
+ if (bytes.length > 262144)
122
+ throw Error('mcp.install.config.unsafe');
123
+ return { bytes, modo: st.mode & 0o777 };
124
+ }
125
+ finally {
126
+ fs.closeSync(fd);
127
+ }
128
+ }
129
+ /** Renderer de startup interno: a raiz vem do manifesto, nunca de argumentos de ferramentas. */
130
+ function configuracaoServidorMcp(raiz, host, threadId, transporteShip = 'github-ssh', permissoesFilho = 'interactive',
131
+ /** I-36 (D4): identidade do despacho da sessao filha; so existe junto com a thread vinculada. */
132
+ dispatchId) {
133
+ if (!['github-ssh', 'bare-local'].includes(transporteShip))
134
+ throw Error('mcp.install.transport.invalid');
135
+ if (!['interactive', 'worktree'].includes(permissoesFilho))
136
+ throw Error('mcp.install.child-permissions.invalid');
137
+ if (dispatchId !== undefined && (!threadId || !/^[a-f0-9-]{36}$/.test(dispatchId)))
138
+ throw Error('mcp.install.dispatch.invalid');
139
+ return { command: process.execPath, args: [path.resolve(__dirname, 'index.js'), 'mcp', 'serve', '--project', raiz, '--host', host, '--ship-transport', transporteShip,
140
+ ...(permissoesFilho === 'worktree' ? ['--child-permissions', permissoesFilho] : []),
141
+ ...(threadId ? ['--thread', threadId] : []),
142
+ ...(dispatchId ? ['--dispatch', dispatchId] : [])],
143
+ ...(host === 'codex' ? { env_vars: [...exports.ENV_VARS_CODEX_MCP] } : {}) };
144
+ }
145
+ function migrarEnvVarsCodex(bruto, entrada) {
146
+ const atual = entrada.env_vars;
147
+ if (atual !== undefined && (!Array.isArray(atual) || atual.some(v => typeof v !== 'string')))
148
+ throw Error('mcp.install.conflict: env_vars existente invalido; configuracao preservada');
149
+ const nomes = atual;
150
+ if (nomes?.includes('CODEX_HOME'))
151
+ return bruto;
152
+ const inicio = /^[ \t]*\[mcp_servers\.orkastery\][ \t]*(?:#[^\r\n]*)?$/m.exec(bruto);
153
+ if (!inicio)
154
+ throw Error('mcp.install.conflict: tabela TOML nao pode receber env_vars; configuracao preservada');
155
+ const corpoInicio = inicio.index + inicio[0].length;
156
+ const proxima = /^[ \t]*\[/m.exec(bruto.slice(corpoInicio));
157
+ const corpoFim = proxima ? corpoInicio + proxima.index : bruto.length;
158
+ const corpo = bruto.slice(corpoInicio, corpoFim);
159
+ const linha = /^[ \t]*env_vars[ \t]*=[^\r\n]*$/m.exec(corpo);
160
+ const valor = JSON.stringify([...(nomes ?? []), 'CODEX_HOME']);
161
+ if (nomes !== undefined) {
162
+ if (!linha)
163
+ throw Error('mcp.install.conflict: env_vars TOML complexo nao pode ser migrado; configuracao preservada');
164
+ const original = linha[0], igual = original.indexOf('='), prefixo = original.slice(0, igual + 1);
165
+ let aspas = '', escape = false, comentario = -1;
166
+ for (let i = igual + 1; i < original.length; i++) {
167
+ const c = original[i];
168
+ if (aspas === '"' && escape) {
169
+ escape = false;
170
+ continue;
171
+ }
172
+ if (aspas === '"' && c === '\\') {
173
+ escape = true;
174
+ continue;
175
+ }
176
+ if (aspas) {
177
+ if (c === aspas)
178
+ aspas = '';
179
+ continue;
180
+ }
181
+ if (c === '"' || c === "'") {
182
+ aspas = c;
183
+ continue;
184
+ }
185
+ if (c === '#') {
186
+ comentario = i;
187
+ break;
188
+ }
189
+ }
190
+ let antesComentario = comentario < 0 ? original.length : comentario;
191
+ while (antesComentario > igual + 1 && /[ \t]/.test(original[antesComentario - 1]))
192
+ antesComentario--;
193
+ const espacos = original.slice(igual + 1, antesComentario).match(/^[ \t]*/)?.[0] ?? ' ';
194
+ const sufixo = comentario < 0 ? '' : original.slice(antesComentario);
195
+ const substituta = `${prefixo}${espacos}${valor}${sufixo}`;
196
+ return bruto.slice(0, corpoInicio) + corpo.slice(0, linha.index) + substituta + corpo.slice(linha.index + linha[0].length) + bruto.slice(corpoFim);
197
+ }
198
+ return bruto.slice(0, corpoFim) + (corpo.endsWith('\n') ? '' : '\n') + `env_vars = ${valor}\n` + bruto.slice(corpoFim);
199
+ }
200
+ function instalarMcp(opcoes) {
201
+ if (!path.isAbsolute(opcoes.projeto))
202
+ throw Error('mcp.install.project.invalid: raiz absoluta obrigatoria');
203
+ if (!['claude-code', 'codex'].includes(opcoes.host))
204
+ throw Error('mcp.install.host.invalid');
205
+ if (opcoes.transporteShip !== undefined && !['github-ssh', 'bare-local'].includes(opcoes.transporteShip))
206
+ throw Error('mcp.install.transport.invalid');
207
+ if (opcoes.permissoesFilho !== undefined && !['interactive', 'worktree'].includes(opcoes.permissoesFilho))
208
+ throw Error('mcp.install.child-permissions.invalid');
209
+ if (opcoes.permissoesDono !== undefined && (opcoes.host !== 'codex' || !['interactive', 'orchestrate'].includes(opcoes.permissoesDono)))
210
+ throw Error('mcp.install.owner-permissions.invalid: opt-in exclusivo Codex');
211
+ const raiz = fs.realpathSync(opcoes.projeto);
212
+ if (fs.realpathSync((0, manifest_1.exigirManifesto)(raiz).raiz) !== raiz)
213
+ throw Error('mcp.install.project.invalid');
214
+ const pasta = opcoes.host === 'codex' ? path.join(raiz, '.codex') : raiz;
215
+ const validarPasta = () => {
216
+ try {
217
+ const st = fs.lstatSync(pasta);
218
+ if (!st.isDirectory() || st.isSymbolicLink() || fs.realpathSync(pasta) !== pasta)
219
+ throw Error('mcp.install.directory.unsafe');
220
+ }
221
+ catch (e) {
222
+ if (e.code !== 'ENOENT')
223
+ throw e;
224
+ }
225
+ };
226
+ validarPasta();
227
+ const arquivo = path.join(pasta, opcoes.host === 'codex' ? 'config.toml' : '.mcp.json');
228
+ const anterior = ler(arquivo), bruto = anterior?.bytes.toString('utf8') ?? '';
229
+ const { command: comando, args } = configuracaoServidorMcp(raiz, opcoes.host, undefined, opcoes.transporteShip, opcoes.permissoesFilho);
230
+ let dados;
231
+ try {
232
+ dados = anterior ? objeto(opcoes.host === 'codex' ? (0, smol_toml_1.parse)(bruto) : JSON.parse(bruto)) : {};
233
+ }
234
+ catch {
235
+ throw Error('mcp.install.config.invalid: configuracao existente nao foi alterada');
236
+ }
237
+ const chave = opcoes.host === 'codex' ? 'mcp_servers' : 'mcpServers';
238
+ const servidores = dados[chave] === undefined ? {} : objeto(dados[chave]);
239
+ const existente = Object.hasOwn(servidores, 'orkastery') ? objeto(servidores.orkastery) : undefined;
240
+ const faltaEnvCodex = opcoes.host === 'codex' && existente !== undefined &&
241
+ (!Array.isArray(existente.env_vars) || !existente.env_vars.includes('CODEX_HOME'));
242
+ let faltantes = [];
243
+ if (opcoes.permissoesDono === 'orchestrate') {
244
+ validarGrantsCodex(existente ?? {}, exports.TOOLS_DONO_CODEX);
245
+ const tools = existente?.tools === undefined ? {} : objeto(existente.tools);
246
+ faltantes = exports.TOOLS_DONO_CODEX.filter(nome => tools[nome] === undefined);
247
+ for (const nome of exports.TOOLS_DONO_CODEX)
248
+ if (tools[nome] !== undefined && objeto(tools[nome]).approval_mode === undefined)
249
+ throw Error('mcp.permissions.conflict: tabela existente sem consentimento explicito; configuracao preservada');
250
+ }
251
+ if (existente) {
252
+ const legadoSSH = (opcoes.permissoesFilho ?? 'interactive') === 'interactive' && (opcoes.transporteShip ?? 'github-ssh') === 'github-ssh' && JSON.stringify(existente.args) === JSON.stringify(args.slice(0, -2));
253
+ if (existente.command !== comando || (JSON.stringify(existente.args) !== JSON.stringify(args) && !legadoSSH))
254
+ throw Error('mcp.install.conflict: entrada orkastery divergente; configuracao preservada');
255
+ if (faltantes.length === 0 && !faltaEnvCodex)
256
+ return { arquivo, estado: 'igual', dryRun: !!opcoes.dryRun, ativacao: 'pendente-no-cliente' };
257
+ }
258
+ let proximo;
259
+ if (opcoes.host === 'codex') {
260
+ // Append preserva comentarios e escolhas do usuario. TOML inline fechado pode impedir a extensao.
261
+ proximo = bruto + (bruto.endsWith('\n') || !bruto ? '' : '\n') + (existente ? '' : '\n[mcp_servers.orkastery]\ncommand = ' + JSON.stringify(comando) + '\nargs = ' + JSON.stringify(args) + '\nenv_vars = ' + JSON.stringify([...exports.ENV_VARS_CODEX_MCP]) + '\n');
262
+ if (existente && faltaEnvCodex) {
263
+ proximo = migrarEnvVarsCodex(proximo, existente);
264
+ try {
265
+ const migrado = objeto((0, smol_toml_1.parse)(proximo)), migradoServidores = objeto(migrado.mcp_servers), migradoEntrada = objeto(migradoServidores.orkastery);
266
+ const sem = (valor, chave) => Object.fromEntries(Object.entries(valor).filter(([k]) => k !== chave));
267
+ if (!(0, node_util_1.isDeepStrictEqual)(sem(migrado, 'mcp_servers'), sem(dados, 'mcp_servers')) ||
268
+ !(0, node_util_1.isDeepStrictEqual)(sem(migradoServidores, 'orkastery'), sem(servidores, 'orkastery')) ||
269
+ !(0, node_util_1.isDeepStrictEqual)(migradoEntrada, { ...existente, env_vars: [...(existente.env_vars ?? []), 'CODEX_HOME'] }))
270
+ throw Error('semantic mismatch');
271
+ }
272
+ catch {
273
+ throw Error('mcp.install.conflict: env_vars nao pode ser migrado com seguranca; configuracao preservada');
274
+ }
275
+ }
276
+ for (const nome of faltantes)
277
+ proximo += '\n[mcp_servers.orkastery.tools.' + nome + ']\napproval_mode = "approve"\n';
278
+ try {
279
+ (0, smol_toml_1.parse)(proximo);
280
+ }
281
+ catch {
282
+ throw Error('mcp.install.conflict: tabela TOML nao pode ser estendida; configuracao preservada');
283
+ }
284
+ }
285
+ else {
286
+ dados[chave] = { ...servidores, orkastery: { command: comando, args } };
287
+ proximo = JSON.stringify(dados, null, 2) + '\n';
288
+ }
289
+ if (!opcoes.dryRun) {
290
+ validarPasta();
291
+ fs.mkdirSync(pasta, { recursive: true });
292
+ validarPasta();
293
+ const temp = path.join(pasta, '.ork-mcp-' + (0, node_crypto_1.randomUUID)() + '.tmp');
294
+ try {
295
+ fs.writeFileSync(temp, proximo, { flag: 'wx', mode: anterior?.modo ?? 0o600 });
296
+ const atual = ler(arquivo);
297
+ if ((atual === null) !== (anterior === null) || (atual && anterior && !atual.bytes.equals(anterior.bytes)))
298
+ throw Error('mcp.install.concurrent-change: configuracao alterada durante instalacao');
299
+ validarPasta();
300
+ fs.renameSync(temp, arquivo);
301
+ }
302
+ finally {
303
+ fs.rmSync(temp, { force: true });
304
+ }
305
+ }
306
+ return { arquivo, estado: anterior ? 'atualizado' : 'novo', dryRun: !!opcoes.dryRun, ativacao: 'pendente-no-cliente' };
307
+ }
308
+ function textoInstalacaoMcp(r) {
309
+ return `${r.dryRun ? 'Simulacao: nenhuma escrita.' : 'Configuracao MCP preparada.'} ${r.arquivo} (${r.estado}).\nAbra uma nova sessao neste projeto, conclua o consentimento nativo solicitado pelo cliente e confira a descoberta das ferramentas ork_*.\nAtivacao e uso ainda pendentes de verificacao no cliente. Respostas automaticas de elicitation nao devem estar habilitadas para decisoes do dono.`;
310
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maestroInputSchema = void 0;
4
+ exports.registerMaestro = registerMaestro;
5
+ const zod_1 = require("zod");
6
+ const maestro_contract_1 = require("./maestro-contract");
7
+ const maestro_discovery_1 = require("./maestro-discovery");
8
+ const maestro_cli_1 = require("./maestro-cli");
9
+ exports.maestroInputSchema = zod_1.z.object({ threadId: zod_1.z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/).optional(),
10
+ section: zod_1.z.enum(maestro_contract_1.SECTION_NAMES).optional(), offset: zod_1.z.number().int().min(0).max(100000).optional() }).strict();
11
+ function registerMaestro(register, options) {
12
+ register('ork_maestro', { description: 'Panorama Maestro somente leitura, fixado ao projeto e ao escopo da sessão; cobertura, lacunas e próximas ações pelos endpoints existentes.',
13
+ inputSchema: exports.maestroInputSchema, annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false } }, async (args) => {
14
+ options.load();
15
+ if ((args.section === undefined) !== (args.offset === undefined))
16
+ throw Error('maestro.page.invalid');
17
+ const threadId = args.threadId ?? options.threadId;
18
+ if (threadId)
19
+ options.checkThread(threadId);
20
+ const context = (0, maestro_discovery_1.discoverMaestro)({ cwd: options.root, pinned: options.root });
21
+ const result = (0, maestro_cli_1.readMaestro)(context, { threadId, native: true, offsets: args.section ? { [args.section]: args.offset } : undefined,
22
+ host: { tools: options.tools(), child: !!options.threadId } });
23
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
24
+ });
25
+ }