@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,180 @@
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.readPortfolio = readPortfolio;
37
+ exports.findEntity = findEntity;
38
+ exports.createProduct = createProduct;
39
+ exports.createProject = createProject;
40
+ exports.createInitiative = createInitiative;
41
+ exports.createOperationEntity = createOperationEntity;
42
+ exports.listEntities = listEntities;
43
+ exports.assertCycleScope = assertCycleScope;
44
+ /** Catálogo determinístico de produto -> projeto -> iniciativa. */
45
+ const fs = __importStar(require("node:fs"));
46
+ const project_state_1 = require("./project-state");
47
+ const company_brain_journal_1 = require("./company-brain-journal");
48
+ const util_1 = require("./util");
49
+ const creation_operation_store_1 = require("./creation-operation-store");
50
+ const ID = /^(prod|proj|init)-[a-z0-9][a-z0-9-]{2,47}$/;
51
+ const PREFIX = { product: 'prod-', project: 'proj-', initiative: 'init-' };
52
+ const statuses = ['idea', 'planned', 'ready', 'in_progress', 'validating', 'delivered', 'blocked', 'cancelled'];
53
+ const unique = (values = []) => [...new Set(values.map((v) => v.trim()).filter(Boolean))];
54
+ function file(root) { return (0, project_state_1.stateFile)(root, 'portfolio.json'); }
55
+ function empty() { return { schema: 'ork.portfolio/v1', updatedAt: (0, util_1.agora)(), products: [], projects: [], initiatives: [] }; }
56
+ function readPortfolio(root) {
57
+ const target = file(root);
58
+ if (!fs.existsSync(target))
59
+ return empty();
60
+ const value = (0, util_1.lerJson)(target);
61
+ if (value.schema !== 'ork.portfolio/v1' || !Array.isArray(value.products) || !Array.isArray(value.projects) || !Array.isArray(value.initiatives)) {
62
+ throw new Error('portfolio inválido');
63
+ }
64
+ return value;
65
+ }
66
+ function persist(root, value) { value.updatedAt = (0, util_1.agora)(); (0, company_brain_journal_1.replaceWithJournal)(file(root), value); return value; }
67
+ function mutatePortfolio(root, run) {
68
+ return (0, creation_operation_store_1.withCreationLock)(root, 'portfolio', () => (0, company_brain_journal_1.portfolioMutation)(file(root), run));
69
+ }
70
+ function validateBase(kind, input) {
71
+ if (!ID.test(input.id) || !input.id.startsWith(PREFIX[kind]))
72
+ throw new Error(`${kind} exige id ${PREFIX[kind]}...`);
73
+ if (!input.title.trim() || input.title.length > 160)
74
+ throw new Error('título deve ter entre 1 e 160 caracteres');
75
+ if (input.status && !statuses.includes(input.status))
76
+ throw new Error('status de portfólio inválido');
77
+ }
78
+ function findEntity(root, id) {
79
+ const p = readPortfolio(root);
80
+ return [...p.products, ...p.projects, ...p.initiatives].find((item) => item.id === id) ?? null;
81
+ }
82
+ function createProduct(root, input) {
83
+ return mutatePortfolio(root, () => {
84
+ validateBase('product', input);
85
+ if (findEntity(root, input.id))
86
+ throw new Error(`entidade ${input.id} já existe`);
87
+ const product = { kind: 'product', id: input.id, title: input.title.trim(), description: input.description?.trim() ?? '', ownerId: input.ownerId?.trim() || null, status: input.status ?? 'idea', acceptanceCriteria: unique(input.acceptanceCriteria), version: 1 };
88
+ const p = readPortfolio(root);
89
+ p.products.push(product);
90
+ persist(root, p);
91
+ return product;
92
+ });
93
+ }
94
+ function createProject(root, input) {
95
+ return mutatePortfolio(root, () => createProjectLocked(root, input));
96
+ }
97
+ function createProjectLocked(root, input, operationId) {
98
+ validateBase('project', input);
99
+ if (findEntity(root, input.id))
100
+ throw new Error(`entidade ${input.id} já existe`);
101
+ const parent = findEntity(root, input.productId);
102
+ if (!parent || parent.kind !== 'product')
103
+ throw new Error(`produto ${input.productId} não encontrado`);
104
+ const project = { kind: 'project', id: input.id, productId: input.productId, title: input.title.trim(), description: input.description?.trim() ?? '', ownerId: input.ownerId?.trim() || null, status: input.status ?? 'idea', workspaceIds: unique(input.workspaceIds), acceptanceCriteria: unique(input.acceptanceCriteria), version: 1 };
105
+ if (operationId)
106
+ Object.assign(project, { creationOperationId: operationId });
107
+ const p = readPortfolio(root);
108
+ p.projects.push(project);
109
+ persist(root, p);
110
+ return project;
111
+ }
112
+ function createInitiative(root, input) {
113
+ return mutatePortfolio(root, () => createInitiativeLocked(root, input));
114
+ }
115
+ function createInitiativeLocked(root, input, operationId) {
116
+ validateBase('initiative', input);
117
+ if (findEntity(root, input.id))
118
+ throw new Error(`entidade ${input.id} já existe`);
119
+ const parent = findEntity(root, input.projectId);
120
+ if (!parent || parent.kind !== 'project')
121
+ throw new Error(`projeto ${input.projectId} não encontrado`);
122
+ const dependencies = unique(input.dependsOn);
123
+ for (const id of dependencies) {
124
+ const dependency = findEntity(root, id);
125
+ if (!dependency || dependency.kind !== 'initiative')
126
+ throw new Error(`dependência ${id} não encontrada`);
127
+ if (dependency.projectId !== input.projectId)
128
+ throw new Error('dependências devem pertencer ao mesmo projeto');
129
+ }
130
+ const initiative = { kind: 'initiative', id: input.id, projectId: input.projectId, title: input.title.trim(), description: input.description?.trim() ?? '', ownerId: input.ownerId?.trim() || null, status: input.status ?? 'idea', dependsOn: dependencies, acceptanceCriteria: unique(input.acceptanceCriteria), version: 1 };
131
+ if (operationId)
132
+ Object.assign(initiative, { creationOperationId: operationId });
133
+ const p = readPortfolio(root);
134
+ p.initiatives.push(initiative);
135
+ persist(root, p);
136
+ return initiative;
137
+ }
138
+ /** CAS do pai e origem do efeito são persistidos sob o mesmo lock dos escritores legados. */
139
+ function createOperationEntity(root, operationId, principal) {
140
+ return mutatePortfolio(root, () => {
141
+ const op = (0, creation_operation_store_1.readCreationOperation)(root, operationId, principal);
142
+ const input = op.request.entity;
143
+ if (!input || ['compensating', 'compensated', 'compensation_failed'].includes(op.state))
144
+ throw new Error('creation.conflict: ação não cria entidade');
145
+ const parent = findEntity(root, input.parentId);
146
+ if (!parent || parent.version !== op.request.expectedParentVersion)
147
+ throw new Error('creation.conflict: versão do pai alterada');
148
+ const existing = findEntity(root, input.id);
149
+ if (existing) {
150
+ if (existing.creationOperationId !== operationId || existing.version !== 1)
151
+ throw new Error('creation.conflict: entidade alheia ou alterada');
152
+ return existing;
153
+ }
154
+ const common = { id: input.id, title: input.title, description: input.description, acceptanceCriteria: input.acceptanceCriteria };
155
+ if (input.kind === 'project')
156
+ return createProjectLocked(root, { ...common, productId: input.parentId, workspaceIds: op.request.workspaceIds }, operationId);
157
+ return createInitiativeLocked(root, { ...common, projectId: input.parentId }, operationId);
158
+ });
159
+ }
160
+ function listEntities(root, kind, parentId) {
161
+ const p = readPortfolio(root);
162
+ const values = kind === 'product' ? p.products : kind === 'project' ? p.projects : kind === 'initiative' ? p.initiatives : [...p.products, ...p.projects, ...p.initiatives];
163
+ return parentId ? values.filter((item) => item.kind === 'project' ? item.productId === parentId : item.kind === 'initiative' ? item.projectId === parentId : false) : values;
164
+ }
165
+ function assertCycleScope(root, scope) {
166
+ const project = findEntity(root, scope.projectId);
167
+ if (!project || project.kind !== 'project')
168
+ throw new Error(`projeto ${scope.projectId} não encontrado`);
169
+ const ids = unique(scope.initiativeIds);
170
+ if (scope.delivery === 'project' && ids.length)
171
+ throw new Error('escopo de projeto não aceita iniciativas');
172
+ if (scope.delivery === 'initiatives' && !ids.length)
173
+ throw new Error('escopo de iniciativas exige ao menos uma iniciativa');
174
+ for (const id of ids) {
175
+ const initiative = findEntity(root, id);
176
+ if (!initiative || initiative.kind !== 'initiative' || initiative.projectId !== scope.projectId)
177
+ throw new Error(`iniciativa ${id} não pertence ao projeto`);
178
+ }
179
+ return { ...scope, initiativeIds: ids };
180
+ }
@@ -0,0 +1,207 @@
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.umaskDoProcesso = umaskDoProcesso;
37
+ exports.sondasDeAmbiente = sondasDeAmbiente;
38
+ exports.checkDeContas = checkDeContas;
39
+ exports.preflight = preflight;
40
+ exports.textoPreflight = textoPreflight;
41
+ /** Preflight contextual de despacho: nenhuma sessão, instalação ou configuração é alterada. */
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const manifest_1 = require("./manifest");
45
+ const estado_thread_1 = require("./estado-thread");
46
+ const claude_bg_1 = require("./adapters/claude-bg");
47
+ const codex_1 = require("./adapters/codex");
48
+ const runtime_profiles_1 = require("./runtime-profiles");
49
+ const modos_1 = require("./modos");
50
+ const setup_1 = require("./setup");
51
+ const phase_1 = require("./phase");
52
+ const runtimes_1 = require("./runtimes");
53
+ const codex_2 = require("./adapters/codex");
54
+ const runtime_ambiente_1 = require("./runtime-ambiente");
55
+ const slug_1 = require("./slug");
56
+ const util_1 = require("./util");
57
+ const horario_1 = require("./horario");
58
+ const authPadrao = (p) => p.runtime === 'claude-bg' ? (0, claude_bg_1.conferirAuth)(p) : (0, codex_1.conferirAuth)(p);
59
+ const sensoresPadrao = {
60
+ runtime: nome => !!(0, runtimes_1.resolverRuntime)(nome).disponivel(),
61
+ sandboxCodex: () => (0, codex_2.sondarSandbox)().ok,
62
+ auth: authPadrao,
63
+ };
64
+ /** umask efetivo do processo, lido de /proc (Linux) para nao usar o getter deprecado. */
65
+ function umaskDoProcesso() {
66
+ try {
67
+ const m = /^Umask:\s*([0-7]+)$/m.exec(fs.readFileSync('/proc/self/status', 'utf8'));
68
+ return m ? parseInt(m[1], 8) : null;
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ /**
75
+ * I-33 (D7): sonda de umask e das permissoes do estado, coerente com a recusa 0o022 do sensor
76
+ * (rollout e diretorio pai) e com o 0700 exato da pasta privada (HITL e perfis). Umask que deixa
77
+ * grupo ou outros escreverem afrouxa o que o runtime cria e o sensor reprova depois.
78
+ */
79
+ function sondasDeAmbiente(raiz, umask = umaskDoProcesso()) {
80
+ const checks = [];
81
+ const octal = (v) => '0' + v.toString(8).padStart(3, '0');
82
+ checks.push(umask === null ? { nome: 'umask', nivel: 'warn', detalhe: 'umask do processo nao medido nesta plataforma' }
83
+ : (umask & 0o022) === 0o022 ? { nome: 'umask', nivel: 'ok', detalhe: `umask ${octal(umask)} nega escrita de grupo e outros` }
84
+ : { nome: 'umask', nivel: 'warn', detalhe: `umask ${octal(umask)} permite escrita de grupo ou outros: o que o runtime criar sera recusado pelo sensor (bits 0o022)`,
85
+ correcao: 'umask 022 (ou 077) no shell que roda o ork e os runtimes' });
86
+ const estado = path.join((0, estado_thread_1.raizDoEstado)(raiz), '.orkastery');
87
+ let st = null;
88
+ try {
89
+ st = fs.lstatSync(estado);
90
+ }
91
+ catch { /* ausencia e do check de estado do projeto */ }
92
+ if (st)
93
+ checks.push(!st.isDirectory() || st.isSymbolicLink() ? { nome: 'permissoes do estado', nivel: 'fail', detalhe: `${estado} nao e diretorio real` }
94
+ : st.mode & 0o022 ? { nome: 'permissoes do estado', nivel: 'warn', detalhe: `${estado} com modo ${octal(st.mode & 0o777)}: grupo ou outros podem escrever no estado`, correcao: `chmod go-w ${estado}` }
95
+ : { nome: 'permissoes do estado', nivel: 'ok', detalhe: `${estado} com modo ${octal(st.mode & 0o777)}` });
96
+ const privada = path.join(estado, 'private');
97
+ let sp = null;
98
+ try {
99
+ sp = fs.lstatSync(privada);
100
+ }
101
+ catch { /* criada sob demanda */ }
102
+ checks.push(!sp ? { nome: 'pasta privada', nivel: 'ok', detalhe: `${privada} ausente: criada sob demanda com 0700` }
103
+ : !sp.isDirectory() || sp.isSymbolicLink() || sp.uid !== process.getuid?.() || (sp.mode & 0o777) !== 0o700
104
+ ? { nome: 'pasta privada', nivel: 'fail', detalhe: `${privada} precisa ser diretorio 0700 do proprio usuario (modo ${octal(sp.mode & 0o777)}): recibo HITL e perfis recusam`, correcao: `chmod 700 ${privada}` }
105
+ : { nome: 'pasta privada', nivel: 'ok', detalhe: `${privada} com modo 0700` });
106
+ return checks;
107
+ }
108
+ /**
109
+ * I-33 (D7): contas do runtime do bloco. Sem perfil, o despacho usa o ambiente do processo e
110
+ * nada e sondado (P8). Com perfis, o bloco so fica pronto com ao menos um perfil disponivel e
111
+ * com login conferido pelo proprio CLI. A sonda nao marca o store: quem marca e o despacho.
112
+ */
113
+ function checkDeContas(raiz, runtime, auth = authPadrao) {
114
+ let perfis;
115
+ try {
116
+ perfis = (0, runtime_profiles_1.perfisDoRuntime)((0, runtime_profiles_1.lerPerfisComContas)(raiz), runtime).filter(p => p.estado !== 'desativado');
117
+ }
118
+ catch (e) {
119
+ return { nome: 'contas', nivel: 'fail', detalhe: `store de perfis invalido: ${e.message}` };
120
+ }
121
+ if (!perfis.length)
122
+ return { nome: 'contas', nivel: 'ok', detalhe: `${runtime} sem perfil configurado: despacho pelo ambiente do processo` };
123
+ const estados = perfis.map(p => {
124
+ const a = auth((0, runtime_profiles_1.perfilDeDespacho)(p));
125
+ return { id: p.id, pronto: a.ok && (0, runtime_profiles_1.perfilDisponivel)(p),
126
+ texto: !a.ok ? `${a.pago ? 'provider pago, nunca despacha' : a.transitorio ? 'conferencia de login inconclusiva' : 'sem login'} (${a.detalhe})` : (0, runtime_profiles_1.perfilDisponivel)(p) ? 'pronto' : `${p.estado}${p.esgotadoAte ? ` ate ${p.esgotadoAte}` : ''}` };
127
+ });
128
+ const prontos = estados.filter(e => e.pronto).length;
129
+ return { nome: 'contas', nivel: prontos === 0 ? 'fail' : prontos < estados.length ? 'warn' : 'ok',
130
+ detalhe: `${runtime}: ${estados.map(e => `${e.id} ${e.texto}`).join('; ')}`,
131
+ ...(prontos < estados.length ? { correcao: 'ork accounts check marca os perfis; ork accounts add refaz o login pelo proprio CLI' } : {}) };
132
+ }
133
+ const limites = [
134
+ 'Sonda contextual local: não inventaria sessões, não inicia modelo e não autoriza despacho.',
135
+ 'Aceitação do modelo, instalação do adaptador/MCP, contexto da thread, gates e policies do pedido são revalidados no despacho; com perfis, o login de cada conta é conferido aqui e de novo no despacho.',
136
+ 'Trio sem override; um override posterior exige resolver e verificar novamente o despacho.',
137
+ 'VERIFY/SHIP MCP exigem executor Codex isolado próprio e transporte SHIP válido; a sonda de despacho não comprova entrega.',
138
+ ];
139
+ function preflight(raiz, modo, nomesHerdados = (0, runtime_ambiente_1.nomesDeProviderAtivos)(), sensores = sensoresPadrao) {
140
+ // I-43: a matriz tem os cinco (para LER thread antiga); quem entra aqui e ESCRITA.
141
+ if (!modos_1.ORDEM_DOS_MODOS.includes(modo))
142
+ throw Error('preflight.mode.invalid');
143
+ const checks = [];
144
+ checks.push({ nome: 'node', nivel: Number(process.versions.node.split('.')[0]) >= 20 ? 'ok' : 'fail', detalhe: 'Node 20 ou superior necessário' });
145
+ const git = !!(0, util_1.noPath)('git');
146
+ checks.push({ nome: 'git', nivel: git ? 'ok' : 'fail', detalhe: git ? 'Git disponível' : 'Git ausente' });
147
+ const repo = git ? (0, util_1.exec)('git', ['rev-parse', '--is-inside-work-tree'], raiz, 10000) : null;
148
+ checks.push({ nome: 'repositorio', nivel: repo?.ok && repo.stdout.trim() === 'true' ? 'ok' : 'fail', detalhe: 'Repositório Git local necessário' });
149
+ checks.push(...sondasDeAmbiente(raiz));
150
+ const carregado = (0, manifest_1.carregarManifesto)(raiz);
151
+ const blocos = [];
152
+ checks.push({ nome: 'manifesto', nivel: !carregado || carregado.erros.length ? 'fail' : 'ok', detalhe: !carregado ? 'Manifesto ausente' : carregado.erros.length ? 'Manifesto inválido; corrija antes do despacho' : 'Manifesto válido' });
153
+ if (carregado && !carregado.erros.length) {
154
+ const m = carregado.manifesto;
155
+ checks.push({ nome: 'modo', nivel: m.conduction.allowed_modes.includes(modo) ? 'ok' : 'fail', detalhe: `Modo solicitado: ${modo}` });
156
+ checks.push({ nome: 'abbrev', nivel: (0, slug_1.validarAbbrev)(m.project.abbrev).ok ? 'ok' : 'fail', detalhe: 'Identidade curta do projeto validada' });
157
+ const setup = (0, setup_1.lerSetup)(carregado.raiz), observados = new Map(), contas = new Map();
158
+ let sandbox;
159
+ for (const [i, bloco] of modos_1.MODOS[modo].blocos.entries()) {
160
+ const locais = [];
161
+ let trio = null;
162
+ try {
163
+ trio = (0, phase_1.resolverDespacho)(m, {}, (0, setup_1.configDoBloco)(setup, modo, bloco.fases[0]));
164
+ (0, runtimes_1.resolverRuntime)(trio.runtime);
165
+ locais.push({ nome: 'trio', nivel: 'ok', detalhe: 'Runtime/modelo/esforço resolvidos pelo mesmo contrato do despacho; aceitação nativa não comprovada' });
166
+ if (!observados.has(trio.runtime))
167
+ observados.set(trio.runtime, sensores.runtime(trio.runtime));
168
+ const presente = observados.get(trio.runtime);
169
+ locais.push({ nome: 'runtime', nivel: presente ? 'ok' : 'fail', detalhe: presente ? `${trio.runtime} disponível` : `${trio.runtime} ausente` });
170
+ if (presente) {
171
+ if (!contas.has(trio.runtime))
172
+ contas.set(trio.runtime, checkDeContas(carregado.raiz, trio.runtime, sensores.auth ?? authPadrao));
173
+ locais.push(contas.get(trio.runtime));
174
+ }
175
+ if (trio.runtime === 'codex' && presente) {
176
+ sandbox ??= sensores.sandboxCodex();
177
+ locais.push({ nome: 'sandbox de despacho', nivel: sandbox ? 'ok' : m.runtime.sandbox === 'danger-full-access' ? 'warn' : 'fail', detalhe: sandbox ? 'Sonda Codex sem modelo executou' : 'Sonda Codex falhou; não altere o sandbox para contornar a falha' });
178
+ }
179
+ const ativos = nomesHerdados.filter(n => runtime_ambiente_1.ENVS_DE_PROVIDER_PAGO.includes(n));
180
+ const relevantes = ativos.filter(n => trio.runtime === 'claude-bg' ? /^(ANTHROPIC_|CLAUDE_CODE_USE_)/.test(n) : /^(OPENAI_|OPENROUTER_)/.test(n));
181
+ locais.push({ nome: 'provider', nivel: m.runtime.provider_policy === 'subscription-only' && relevantes.length ? 'fail' : ativos.length ? 'warn' : 'ok', detalhe: relevantes.length ? `Nomes de provider incompatíveis com assinatura: ${relevantes.join(', ')}` : ativos.length ? 'Há nomes de provider alheios ao runtime; não usar credenciais pagas' : 'Nenhum nome de provider pago ativo' });
182
+ }
183
+ catch {
184
+ locais.push({ nome: 'trio', nivel: 'fail', detalhe: 'Setup/trio ou sonda inválidos; complete o modelo e confira o runtime no setup canônico' });
185
+ }
186
+ blocos.push({ numero: i + 1, fases: [...bloco.fases], trio, checks: locais, pronto: locais.every(c => c.nivel !== 'fail') });
187
+ }
188
+ }
189
+ const basePronta = checks.every(c => c.nivel !== 'fail');
190
+ return { modo, scope: 'dispatch-local', checks, blocos,
191
+ prontoPrimeiroBloco: basePronta && !!blocos[0]?.pronto,
192
+ prontoTodosBlocos: basePronta && blocos.length > 0 && blocos.every(b => b.pronto),
193
+ entrega: { verificada: false, dependencias: ['executor Codex isolado', 'transporte SHIP instalado', 'gates e HEADs correntes'] }, limites: [...limites] };
194
+ }
195
+ function textoPreflight(r) {
196
+ // I-35: o Check guarda o ISO (dado de maquina); quem imprime para o dono localiza.
197
+ let localizou = false;
198
+ const local = (t) => { const l = (0, horario_1.localizarTexto)(t); if (l !== t)
199
+ localizou = true; return l; };
200
+ const linhas = ['ork doctor contextual: ' + r.modo, ...r.checks.map(c => `${c.nivel}: ${c.nome}: ${local(c.detalhe)}`),
201
+ ...r.blocos.flatMap(b => [`bloco ${b.numero} ${b.fases.join('→')}: ${b.trio ? `${b.trio.runtime}/${b.trio.model}/${b.trio.effort}` : 'trio pendente'}`, ...b.checks.map(c => ` ${c.nivel}: ${c.nome}: ${local(c.detalhe)}`)]),
202
+ `Primeiro bloco: ${r.prontoPrimeiroBloco ? 'sonda pronta' : 'bloqueado'}; todos os blocos: ${r.prontoTodosBlocos ? 'sonda pronta' : 'dependências pendentes'}`, ...r.limites];
203
+ // O fuso sai uma vez por mensagem, depois dos limites.
204
+ if (localizou)
205
+ linhas.push((0, horario_1.legendaDoFuso)());
206
+ return linhas.join('\n');
207
+ }
@@ -0,0 +1,112 @@
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.inspecionarProcesso = inspecionarProcesso;
37
+ exports.auditarProcesso = auditarProcesso;
38
+ /** PR1..PR3 derivados do estado canônico, sem runtime de LLM. */
39
+ const fs = __importStar(require("node:fs"));
40
+ const node_crypto_1 = require("node:crypto");
41
+ const thread_1 = require("./thread");
42
+ const ledger_1 = require("./ledger");
43
+ const master_1 = require("./master");
44
+ const thread_close_1 = require("./thread-close");
45
+ const estado_thread_1 = require("./estado-thread");
46
+ const divida_1 = require("./divida");
47
+ const auditoria_1 = require("./auditoria");
48
+ function inspecionarProcesso(raiz) {
49
+ const achados = [], motivos = new Map();
50
+ const adicionar = (regra, threads, motivo) => {
51
+ threads.sort();
52
+ const chave = (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(regra === 'PR3' ? [regra, motivo] : [regra, threads, motivo])).digest('hex');
53
+ achados.push({ regra, chave, threads, motivo, evidencia: threads.map(id => `.orkastery/threads/${id}/ledger.jsonl`) });
54
+ };
55
+ for (const id of (0, thread_1.listarIds)(raiz)) {
56
+ const t = (0, thread_1.lerThread)(raiz, id), eventos = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(raiz, id));
57
+ if (!t.fechamentoAdmin && (0, thread_close_1.provaDeEntrega)(raiz, id)) {
58
+ let temLog = false;
59
+ try {
60
+ const log = JSON.parse(fs.readFileSync((0, master_1.caminhoMasterLog)(raiz, id), 'utf8'));
61
+ temLog = log.thread === id && [master_1.CONTRATO_MASTER_LOG, master_1.CONTRATO_MASTER_PENDENTE].includes(log.contrato);
62
+ }
63
+ catch { /* ausência ou JSON inválido é PR1 */ }
64
+ if (!temLog)
65
+ adicionar('PR1', [id], 'entrega sem MASTER log válido');
66
+ if (!(0, master_1.masterRatificado)(raiz, id))
67
+ adicionar('PR2', [id], 'entrega sem ratificação humana');
68
+ }
69
+ for (const e of eventos)
70
+ if (e.tipo === 'gate_blocked' && typeof e.motivo === 'string' && e.motivo.trim()) {
71
+ const ids = motivos.get(e.motivo) ?? new Set();
72
+ ids.add(id);
73
+ motivos.set(e.motivo, ids);
74
+ }
75
+ }
76
+ for (const [motivo, ids] of motivos)
77
+ if (ids.size >= 2)
78
+ adicionar('PR3', [...ids], motivo);
79
+ return achados.sort((a, b) => a.chave.localeCompare(b.chave));
80
+ }
81
+ function auditarProcesso(carregado, registrarNoBoard = false) {
82
+ const raiz = (0, estado_thread_1.raizDoEstado)(carregado.raiz), { manifesto } = carregado;
83
+ const achados = inspecionarProcesso(raiz), postura = auditoria_1.POSTURA_DO_ESTAGIO[manifesto.project.stage];
84
+ const ids = [];
85
+ if (registrarNoBoard) {
86
+ const existentes = (0, divida_1.lerBoard)(raiz);
87
+ for (const a of achados) {
88
+ const rodada = `process-${a.chave}`;
89
+ const anterior = existentes.find(e => e.rodada === rodada && e.regra === a.regra);
90
+ if (anterior) {
91
+ const descricao = `${a.threads.join(', ')}: ${a.motivo}`;
92
+ if (anterior.descricao !== descricao || anterior.arquivo !== a.evidencia[0]) {
93
+ (0, divida_1.carimbarAchado)(raiz, anterior, { descricao, arquivo: a.evidencia[0],
94
+ claim: { ...anterior.claim, arquivo: a.evidencia[0], alegacao: `${a.regra} observado em ${a.threads.join(', ')}` } });
95
+ }
96
+ ids.push(anterior.id);
97
+ continue;
98
+ }
99
+ const comando = `node core/dist/index.js audit process --exigir-achado ${a.chave}`;
100
+ const r = (0, divida_1.registrarAchado)(raiz, { rodada, pack: 'process', regra: a.regra, severidade: 'menor',
101
+ titulo: `${a.regra}: ${a.motivo}`, arquivo: a.evidencia[0], descricao: `${a.threads.join(', ')}: ${a.motivo}`,
102
+ alegacao: `${a.regra} observado em ${a.threads.join(', ')}`, verificar: [comando],
103
+ impacto: 'Entrega ou repetição de falha sem aprendizado humano confirmado',
104
+ fix: a.regra === 'PR3' ? 'Revisar o motivo recorrente e propor controle no roadmap' : 'Revisar a entrega e concluir MASTER com ratificação humana',
105
+ estimativa: '1h', irreversivel: 'nenhum', produto: manifesto.project.name, estagio: manifesto.project.stage,
106
+ postura, memory: manifesto.memory.mode });
107
+ existentes.push(r);
108
+ ids.push(r.id);
109
+ }
110
+ }
111
+ return { contrato: 'ork.process-audit/v1', postura, achados, board: ids };
112
+ }
@@ -0,0 +1,93 @@
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.projectState = projectState;
37
+ exports.stateFile = stateFile;
38
+ exports.stateFileStatus = stateFileStatus;
39
+ exports.memoryState = memoryState;
40
+ /** D3: estado da main validada; código e verificadores continuam na candidata. */
41
+ const fs = __importStar(require("node:fs"));
42
+ const path = __importStar(require("node:path"));
43
+ const estado_thread_1 = require("./estado-thread");
44
+ const manifest_1 = require("./manifest");
45
+ function projectState(root) {
46
+ try {
47
+ const codeRoot = fs.realpathSync(root);
48
+ const canonical = fs.realpathSync((0, estado_thread_1.raizDoEstado)(codeRoot));
49
+ return { root: canonical, codeRoot, linked: canonical !== codeRoot };
50
+ }
51
+ catch {
52
+ throw new Error('project-state.root.invalid');
53
+ }
54
+ }
55
+ function stateFile(root, name) {
56
+ const state = projectState(root);
57
+ const target = path.join(state.root, '.orkastery', name);
58
+ // Uma leitura da WT não pode criar uma segunda autoridade por falta da fonte.
59
+ if (state.linked && !fs.existsSync(target))
60
+ throw new Error('project-state.source.missing');
61
+ return target;
62
+ }
63
+ /** Diagnóstico separado da leitura: cópias locais nunca substituem a autoridade. */
64
+ function stateFileStatus(root, name) {
65
+ const state = projectState(root);
66
+ const source = stateFile(root, name);
67
+ const local = path.join(state.codeRoot, '.orkastery', name);
68
+ const divergent = state.linked && fs.existsSync(local) &&
69
+ !fs.readFileSync(local).equals(fs.readFileSync(source));
70
+ return { ...state, source, divergent };
71
+ }
72
+ /** Resolve somente a configuração de memória, sem trocar paths de código/build. */
73
+ function memoryState(loaded) {
74
+ const state = projectState(loaded.raiz);
75
+ if (!state.linked)
76
+ return { loaded, source: loaded.caminho, divergent: false };
77
+ try {
78
+ if (![manifest_1.NOME_MANIFESTO, manifest_1.NOME_MANIFESTO_LEGADO].some(n => fs.existsSync(path.join(state.root, n)))) {
79
+ throw new Error('missing');
80
+ }
81
+ const canonical = (0, manifest_1.exigirManifesto)(state.root);
82
+ if (canonical.raiz !== state.root)
83
+ throw new Error('invalid');
84
+ return {
85
+ loaded: { ...loaded, manifesto: { ...loaded.manifesto, memory: canonical.manifesto.memory } },
86
+ source: canonical.caminho,
87
+ divergent: JSON.stringify(loaded.manifesto.memory) !== JSON.stringify(canonical.manifesto.memory),
88
+ };
89
+ }
90
+ catch {
91
+ throw new Error('project-state.memory.unavailable');
92
+ }
93
+ }