oxe-cc 1.2.1 → 1.4.0

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 (281) hide show
  1. package/.cursor/commands/oxe-ask.md +2 -2
  2. package/.cursor/commands/oxe-capabilities.md +2 -2
  3. package/.cursor/commands/oxe-checkpoint.md +2 -2
  4. package/.cursor/commands/oxe-compact.md +2 -2
  5. package/.cursor/commands/oxe-dashboard.md +2 -2
  6. package/.cursor/commands/oxe-debug.md +2 -2
  7. package/.cursor/commands/oxe-discuss.md +2 -2
  8. package/.cursor/commands/oxe-execute.md +5 -2
  9. package/.cursor/commands/oxe-forensics.md +2 -2
  10. package/.cursor/commands/oxe-help.md +2 -2
  11. package/.cursor/commands/oxe-loop.md +2 -2
  12. package/.cursor/commands/oxe-milestone.md +2 -2
  13. package/.cursor/commands/oxe-next.md +2 -2
  14. package/.cursor/commands/oxe-obs.md +2 -2
  15. package/.cursor/commands/oxe-plan-agent.md +2 -2
  16. package/.cursor/commands/oxe-plan.md +2 -2
  17. package/.cursor/commands/oxe-project.md +2 -2
  18. package/.cursor/commands/oxe-quick.md +2 -2
  19. package/.cursor/commands/oxe-research.md +2 -2
  20. package/.cursor/commands/oxe-retro.md +2 -2
  21. package/.cursor/commands/oxe-review-pr.md +2 -2
  22. package/.cursor/commands/oxe-route.md +2 -2
  23. package/.cursor/commands/oxe-scan.md +2 -2
  24. package/.cursor/commands/oxe-security.md +2 -2
  25. package/.cursor/commands/oxe-session.md +2 -2
  26. package/.cursor/commands/oxe-ship.md +2 -2
  27. package/.cursor/commands/oxe-skill.md +2 -2
  28. package/.cursor/commands/oxe-spec.md +2 -2
  29. package/.cursor/commands/oxe-ui-review.md +2 -2
  30. package/.cursor/commands/oxe-ui-spec.md +2 -2
  31. package/.cursor/commands/oxe-update.md +2 -2
  32. package/.cursor/commands/oxe-validate-gaps.md +2 -2
  33. package/.cursor/commands/oxe-verify.md +5 -2
  34. package/.cursor/commands/oxe-workstream.md +2 -2
  35. package/.cursor/commands/oxe.md +2 -2
  36. package/.github/copilot-instructions.md +13 -13
  37. package/.github/prompts/oxe-ask.prompt.md +2 -2
  38. package/.github/prompts/oxe-capabilities.prompt.md +2 -2
  39. package/.github/prompts/oxe-checkpoint.prompt.md +2 -2
  40. package/.github/prompts/oxe-compact.prompt.md +2 -2
  41. package/.github/prompts/oxe-dashboard.prompt.md +2 -2
  42. package/.github/prompts/oxe-debug.prompt.md +2 -2
  43. package/.github/prompts/oxe-discuss.prompt.md +2 -2
  44. package/.github/prompts/oxe-execute.prompt.md +5 -2
  45. package/.github/prompts/oxe-forensics.prompt.md +2 -2
  46. package/.github/prompts/oxe-help.prompt.md +2 -2
  47. package/.github/prompts/oxe-loop.prompt.md +2 -2
  48. package/.github/prompts/oxe-milestone.prompt.md +2 -2
  49. package/.github/prompts/oxe-next.prompt.md +2 -2
  50. package/.github/prompts/oxe-obs.prompt.md +2 -2
  51. package/.github/prompts/oxe-plan-agent.prompt.md +2 -2
  52. package/.github/prompts/oxe-plan.prompt.md +2 -2
  53. package/.github/prompts/oxe-project.prompt.md +2 -2
  54. package/.github/prompts/oxe-quick.prompt.md +2 -2
  55. package/.github/prompts/oxe-research.prompt.md +2 -2
  56. package/.github/prompts/oxe-retro.prompt.md +2 -2
  57. package/.github/prompts/oxe-review-pr.prompt.md +2 -2
  58. package/.github/prompts/oxe-route.prompt.md +2 -2
  59. package/.github/prompts/oxe-scan.prompt.md +2 -2
  60. package/.github/prompts/oxe-security.prompt.md +2 -2
  61. package/.github/prompts/oxe-session.prompt.md +2 -2
  62. package/.github/prompts/oxe-ship.prompt.md +2 -2
  63. package/.github/prompts/oxe-skill.prompt.md +2 -2
  64. package/.github/prompts/oxe-spec.prompt.md +2 -2
  65. package/.github/prompts/oxe-ui-review.prompt.md +2 -2
  66. package/.github/prompts/oxe-ui-spec.prompt.md +2 -2
  67. package/.github/prompts/oxe-update.prompt.md +2 -2
  68. package/.github/prompts/oxe-validate-gaps.prompt.md +2 -2
  69. package/.github/prompts/oxe-verify.prompt.md +5 -2
  70. package/.github/prompts/oxe-workstream.prompt.md +2 -2
  71. package/.github/prompts/oxe.prompt.md +2 -2
  72. package/AGENTS.md +5 -3
  73. package/CHANGELOG.md +72 -10
  74. package/LICENSE +21 -674
  75. package/README.md +631 -535
  76. package/bin/banner.txt +6 -6
  77. package/bin/lib/oxe-agent-install.cjs +69 -69
  78. package/bin/lib/oxe-azure.cjs +1445 -1445
  79. package/bin/lib/oxe-context-engine.cjs +867 -867
  80. package/bin/lib/oxe-dashboard.cjs +76 -28
  81. package/bin/lib/oxe-operational.cjs +2144 -1340
  82. package/bin/lib/oxe-project-health.cjs +483 -1
  83. package/bin/lib/oxe-runtime-semantics.cjs +12 -0
  84. package/bin/oxe-cc.js +554 -152
  85. package/commands/oxe/ask.md +2 -2
  86. package/commands/oxe/capabilities.md +2 -2
  87. package/commands/oxe/checkpoint.md +2 -2
  88. package/commands/oxe/compact.md +2 -2
  89. package/commands/oxe/dashboard.md +2 -2
  90. package/commands/oxe/debug.md +2 -2
  91. package/commands/oxe/discuss.md +2 -2
  92. package/commands/oxe/execute.md +5 -2
  93. package/commands/oxe/forensics.md +2 -2
  94. package/commands/oxe/help.md +2 -2
  95. package/commands/oxe/loop.md +2 -2
  96. package/commands/oxe/milestone.md +2 -2
  97. package/commands/oxe/next.md +2 -2
  98. package/commands/oxe/obs.md +2 -2
  99. package/commands/oxe/oxe.md +2 -2
  100. package/commands/oxe/plan-agent.md +2 -2
  101. package/commands/oxe/plan.md +2 -2
  102. package/commands/oxe/project.md +2 -2
  103. package/commands/oxe/quick.md +2 -2
  104. package/commands/oxe/research.md +2 -2
  105. package/commands/oxe/retro.md +2 -2
  106. package/commands/oxe/review-pr.md +2 -2
  107. package/commands/oxe/route.md +2 -2
  108. package/commands/oxe/scan.md +2 -2
  109. package/commands/oxe/security.md +2 -2
  110. package/commands/oxe/session.md +2 -2
  111. package/commands/oxe/ship.md +2 -2
  112. package/commands/oxe/skill.md +2 -2
  113. package/commands/oxe/spec.md +2 -2
  114. package/commands/oxe/ui-review.md +2 -2
  115. package/commands/oxe/ui-spec.md +2 -2
  116. package/commands/oxe/update.md +2 -2
  117. package/commands/oxe/validate-gaps.md +2 -2
  118. package/commands/oxe/verify.md +5 -2
  119. package/commands/oxe/workstream.md +2 -2
  120. package/lib/runtime/delivery/branch-manager.d.ts +1 -0
  121. package/lib/runtime/delivery/branch-manager.js +7 -0
  122. package/lib/runtime/delivery/ci-checks.js +34 -1
  123. package/lib/runtime/delivery/delivery-records.d.ts +34 -0
  124. package/lib/runtime/delivery/delivery-records.js +48 -0
  125. package/lib/runtime/delivery/index.d.ts +1 -0
  126. package/lib/runtime/delivery/index.js +1 -0
  127. package/lib/runtime/delivery/promotion-pipeline.d.ts +26 -2
  128. package/lib/runtime/delivery/promotion-pipeline.js +111 -14
  129. package/lib/runtime/gate/gate-manager.d.ts +41 -0
  130. package/lib/runtime/gate/gate-manager.js +108 -1
  131. package/lib/runtime/index.d.ts +2 -2
  132. package/lib/runtime/index.js +3 -1
  133. package/lib/runtime/models/gate-decision.d.ts +4 -1
  134. package/lib/runtime/models/workspace.d.ts +3 -0
  135. package/lib/runtime/plugins/capability-adapter.d.ts +12 -0
  136. package/lib/runtime/plugins/capability-adapter.js +204 -0
  137. package/lib/runtime/plugins/capability-matrix.d.ts +5 -0
  138. package/lib/runtime/plugins/capability-matrix.js +48 -17
  139. package/lib/runtime/plugins/index.d.ts +1 -0
  140. package/lib/runtime/plugins/index.js +1 -0
  141. package/lib/runtime/plugins/plugin-abi.d.ts +2 -0
  142. package/lib/runtime/plugins/plugin-manifest.d.ts +1 -1
  143. package/lib/runtime/plugins/plugin-manifest.js +6 -2
  144. package/lib/runtime/plugins/plugin-registry.d.ts +46 -0
  145. package/lib/runtime/plugins/plugin-registry.js +79 -2
  146. package/lib/runtime/policy/policy-engine.d.ts +19 -0
  147. package/lib/runtime/policy/policy-engine.js +76 -4
  148. package/lib/runtime/projection/projection-engine.d.ts +9 -1
  149. package/lib/runtime/projection/projection-engine.js +73 -3
  150. package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +43 -1
  151. package/lib/runtime/scheduler/multi-agent-coordinator.js +151 -39
  152. package/lib/runtime/scheduler/run-journal.d.ts +1 -1
  153. package/lib/runtime/scheduler/scheduler.d.ts +19 -1
  154. package/lib/runtime/scheduler/scheduler.js +258 -13
  155. package/lib/runtime/verification/verification-compiler.d.ts +43 -0
  156. package/lib/runtime/verification/verification-compiler.js +137 -0
  157. package/lib/runtime/verification/verification-manifest.d.ts +9 -0
  158. package/lib/runtime/verification/verification-manifest.js +56 -6
  159. package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +1 -0
  160. package/lib/runtime/workspace/strategies/ephemeral-container.js +4 -0
  161. package/lib/runtime/workspace/strategies/git-worktree.d.ts +1 -0
  162. package/lib/runtime/workspace/strategies/git-worktree.js +2 -0
  163. package/lib/runtime/workspace/strategies/inplace.d.ts +1 -0
  164. package/lib/runtime/workspace/strategies/inplace.js +2 -0
  165. package/lib/runtime/workspace/workspace-manager.d.ts +2 -1
  166. package/lib/sdk/README.md +20 -8
  167. package/lib/sdk/index.cjs +33 -24
  168. package/lib/sdk/index.d.ts +149 -14
  169. package/oxe/templates/ACTIVE-RUN.template.json +32 -32
  170. package/oxe/templates/CAPABILITIES.template.md +7 -7
  171. package/oxe/templates/CAPABILITY.template.md +45 -45
  172. package/oxe/templates/CHECKPOINTS.template.md +7 -7
  173. package/oxe/templates/EXECUTION-RUNTIME.template.md +68 -68
  174. package/oxe/templates/HYPOTHESES.template.md +33 -33
  175. package/oxe/templates/LESSONS-METRICS.template.json +13 -13
  176. package/oxe/templates/NOTES.template.md +16 -16
  177. package/oxe/templates/PLAN-REVIEW.template.md +31 -31
  178. package/oxe/templates/SESSION.template.md +34 -34
  179. package/oxe/templates/SKILL.template.md +26 -26
  180. package/oxe/templates/STATE.md +55 -55
  181. package/oxe/templates/WORKFLOW_AUTHORING.md +18 -18
  182. package/oxe/workflows/ask.md +96 -96
  183. package/oxe/workflows/capabilities.md +25 -25
  184. package/oxe/workflows/dashboard.md +33 -33
  185. package/oxe/workflows/discuss.md +12 -12
  186. package/oxe/workflows/execute.md +14 -0
  187. package/oxe/workflows/help.md +352 -352
  188. package/oxe/workflows/next.md +22 -22
  189. package/oxe/workflows/oxe.md +6 -6
  190. package/oxe/workflows/plan-agent.md +9 -9
  191. package/oxe/workflows/plan.md +51 -20
  192. package/oxe/workflows/quick.md +10 -10
  193. package/oxe/workflows/references/reasoning-discovery.md +28 -28
  194. package/oxe/workflows/references/reasoning-execution.md +29 -29
  195. package/oxe/workflows/references/reasoning-planning.md +32 -32
  196. package/oxe/workflows/references/reasoning-review.md +29 -29
  197. package/oxe/workflows/references/reasoning-status.md +24 -24
  198. package/oxe/workflows/references/robustness-elevation.md +295 -295
  199. package/oxe/workflows/references/workflow-runtime-contracts.json +952 -930
  200. package/oxe/workflows/route.md +16 -16
  201. package/oxe/workflows/session.md +213 -213
  202. package/oxe/workflows/ship.md +142 -142
  203. package/oxe/workflows/skill.md +44 -44
  204. package/oxe/workflows/ui-review.md +36 -36
  205. package/oxe/workflows/verify-audit.md +73 -73
  206. package/oxe/workflows/verify.md +10 -0
  207. package/package.json +92 -92
  208. package/packages/runtime/package.json +16 -15
  209. package/packages/runtime/src/audit/audit-trail.ts +243 -243
  210. package/packages/runtime/src/audit/index.ts +2 -2
  211. package/packages/runtime/src/audit/policy-pack.ts +62 -62
  212. package/packages/runtime/src/compiler/graph-compiler.ts +245 -245
  213. package/packages/runtime/src/compiler/index.ts +1 -1
  214. package/packages/runtime/src/context/context-pack-builder.ts +259 -259
  215. package/packages/runtime/src/context/context-pack-store.ts +197 -197
  216. package/packages/runtime/src/context/context-profiles.ts +60 -60
  217. package/packages/runtime/src/context/index.ts +3 -3
  218. package/packages/runtime/src/decision/decision-engine.ts +174 -174
  219. package/packages/runtime/src/decision/decision-memo.ts +211 -211
  220. package/packages/runtime/src/decision/index.ts +2 -2
  221. package/packages/runtime/src/delivery/branch-manager.ts +91 -84
  222. package/packages/runtime/src/delivery/ci-checks.ts +285 -252
  223. package/packages/runtime/src/delivery/delivery-records.ts +75 -0
  224. package/packages/runtime/src/delivery/index.ts +5 -4
  225. package/packages/runtime/src/delivery/pr-manager.ts +112 -112
  226. package/packages/runtime/src/delivery/promotion-pipeline.ts +334 -180
  227. package/packages/runtime/src/events/bus.ts +92 -92
  228. package/packages/runtime/src/events/catalog.ts +29 -29
  229. package/packages/runtime/src/events/envelope.ts +14 -14
  230. package/packages/runtime/src/events/index.ts +3 -3
  231. package/packages/runtime/src/evidence/evidence-store.ts +130 -130
  232. package/packages/runtime/src/evidence/index.ts +1 -1
  233. package/packages/runtime/src/gate/gate-manager.ts +289 -137
  234. package/packages/runtime/src/gate/index.ts +1 -1
  235. package/packages/runtime/src/index.ts +41 -37
  236. package/packages/runtime/src/models/attempt.ts +19 -19
  237. package/packages/runtime/src/models/evidence.ts +21 -21
  238. package/packages/runtime/src/models/gate-decision.ts +25 -21
  239. package/packages/runtime/src/models/index.ts +8 -8
  240. package/packages/runtime/src/models/run.ts +24 -24
  241. package/packages/runtime/src/models/session.ts +11 -11
  242. package/packages/runtime/src/models/verification-result.ts +10 -10
  243. package/packages/runtime/src/models/work-item.ts +25 -25
  244. package/packages/runtime/src/models/workspace.ts +31 -28
  245. package/packages/runtime/src/plugins/capability-adapter.ts +206 -0
  246. package/packages/runtime/src/plugins/capability-matrix.ts +126 -83
  247. package/packages/runtime/src/plugins/index.ts +5 -4
  248. package/packages/runtime/src/plugins/plugin-abi.ts +97 -95
  249. package/packages/runtime/src/plugins/plugin-manifest.ts +118 -113
  250. package/packages/runtime/src/plugins/plugin-registry.ts +232 -124
  251. package/packages/runtime/src/policy/index.ts +1 -1
  252. package/packages/runtime/src/policy/policy-engine.ts +330 -244
  253. package/packages/runtime/src/projection/index.ts +1 -1
  254. package/packages/runtime/src/projection/projection-engine.ts +328 -249
  255. package/packages/runtime/src/reducers/debug-reducer.ts +36 -36
  256. package/packages/runtime/src/reducers/index.ts +2 -2
  257. package/packages/runtime/src/reducers/run-state-reducer.ts +269 -269
  258. package/packages/runtime/src/scheduler/agent-registry.ts +132 -132
  259. package/packages/runtime/src/scheduler/agent-roles.ts +109 -109
  260. package/packages/runtime/src/scheduler/index.ts +4 -4
  261. package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +521 -333
  262. package/packages/runtime/src/scheduler/run-journal.ts +62 -62
  263. package/packages/runtime/src/scheduler/scheduler.ts +722 -441
  264. package/packages/runtime/src/verification/index.ts +2 -2
  265. package/packages/runtime/src/verification/verification-compiler.ts +436 -225
  266. package/packages/runtime/src/verification/verification-manifest.ts +252 -192
  267. package/packages/runtime/src/workspace/index.ts +5 -5
  268. package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +126 -121
  269. package/packages/runtime/src/workspace/strategies/git-worktree.ts +79 -77
  270. package/packages/runtime/src/workspace/strategies/inplace.ts +38 -35
  271. package/packages/runtime/src/workspace/workspace-manager.ts +16 -15
  272. package/packages/runtime/tsconfig.json +17 -17
  273. package/vscode-extension/.vscodeignore +7 -7
  274. package/vscode-extension/LICENSE +21 -0
  275. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  276. package/vscode-extension/oxe-agents-1.4.0.vsix +0 -0
  277. package/vscode-extension/package.json +184 -184
  278. package/vscode-extension/src/extension.js +310 -310
  279. package/vscode-extension/src/shared/contextLoader.js +137 -137
  280. package/vscode-extension/src/shared/contractBuilder.js +159 -159
  281. package/vscode-extension/src/shared/stateReader.js +101 -101
@@ -1,249 +1,328 @@
1
- import type { RunState } from '../reducers/run-state-reducer';
2
- import type { ExecutionGraph } from '../compiler/graph-compiler';
3
- import type { VerificationResult } from '../models/verification-result';
4
- import type { CheckResult } from '../verification/verification-compiler';
5
-
6
- function isoToDate(iso: string | null | undefined): string {
7
- if (!iso) return '—';
8
- return iso.slice(0, 10);
9
- }
10
-
11
- function statusIcon(status: string): string {
12
- switch (status) {
13
- case 'completed': return '✓';
14
- case 'failed': return '';
15
- case 'blocked': return '';
16
- case 'running': return '';
17
- default: return '';
18
- }
19
- }
20
-
21
- function verifyIcon(status: string): string {
22
- switch (status) {
23
- case 'pass': return '✓ PASS';
24
- case 'fail': return ' FAIL';
25
- case 'skip': return ' SKIP';
26
- case 'error': return '! ERROR';
27
- default: return status;
28
- }
29
- }
30
-
31
- export class ProjectionEngine {
32
- projectPlan(state: RunState, graph: ExecutionGraph): string {
33
- const run = state.run;
34
- const lines: string[] = [
35
- '# OXE Plano de Execução',
36
- '',
37
- '<!-- Gerado automaticamente pelo Projection Engine — não editar diretamente -->',
38
- '',
39
- '## Resumo',
40
- '',
41
- `- **Run:** ${run?.run_id ?? ''}`,
42
- `- **Status:** ${run?.status ?? 'sem run'}`,
43
- `- **Iniciado em:** ${isoToDate(run?.started_at)}`,
44
- `- **Nós:** ${graph.metadata.node_count} tarefas em ${graph.metadata.wave_count} onda(s)`,
45
- '',
46
- '## Ondas e tarefas',
47
- '',
48
- ];
49
-
50
- for (const wave of graph.waves) {
51
- lines.push(`### Onda ${wave.wave_number}`);
52
- lines.push('');
53
- lines.push('| ID | Título | Status | Dependências |');
54
- lines.push('|----|--------|--------|--------------|');
55
- for (const nodeId of wave.node_ids) {
56
- const node = graph.nodes.get(nodeId);
57
- const wItem = state.workItems.get(nodeId);
58
- const status = wItem?.status ?? 'pending';
59
- const deps = node?.depends_on.join(', ') || '';
60
- lines.push(`| ${nodeId} | ${node?.title ?? nodeId} | ${statusIcon(status)} ${status} | ${deps} |`);
61
- }
62
- lines.push('');
63
- }
64
-
65
- if (state.completedWorkItems.size > 0 || state.failedWorkItems.size > 0) {
66
- lines.push('## Progresso');
67
- lines.push('');
68
- lines.push(`- **Concluídos:** ${[...state.completedWorkItems].join(', ') || '—'}`);
69
- lines.push(`- **Falhos:** ${[...state.failedWorkItems].join(', ') || '—'}`);
70
- lines.push(`- **Bloqueados:** ${[...state.blockedWorkItems].join(', ') || '—'}`);
71
- lines.push('');
72
- }
73
-
74
- return lines.join('\n');
75
- }
76
-
77
- projectVerify(
78
- state: RunState,
79
- results: VerificationResult[],
80
- checkResults?: CheckResult[]
81
- ): string {
82
- const run = state.run;
83
- const lines: string[] = [
84
- '# OXE Verificação',
85
- '',
86
- '<!-- Gerado automaticamente pelo Projection Engine — não editar diretamente -->',
87
- '',
88
- '## Auditoria de pré-execução',
89
- '',
90
- `- **Run:** ${run?.run_id ?? '—'}`,
91
- `- **Iniciado em:** ${isoToDate(run?.started_at)}`,
92
- `- **Concluído em:** ${isoToDate(run?.ended_at)}`,
93
- `- **Status:** ${run?.status ?? ''}`,
94
- '',
95
- ];
96
-
97
- if (results.length > 0) {
98
- lines.push('## Critérios de aceite');
99
- lines.push('');
100
- lines.push('| ID | Check | Status | Evidências |');
101
- lines.push('|----|-------|--------|------------|');
102
- for (const r of results) {
103
- const evidenceList = r.evidence_refs.join(', ') || '—';
104
- lines.push(`| ${r.check_id} | ${r.summary ?? r.check_id} | ${verifyIcon(r.status)} | ${evidenceList} |`);
105
- }
106
- lines.push('');
107
- }
108
-
109
- if (checkResults && checkResults.length > 0) {
110
- lines.push('## Resultados dos checks executados');
111
- lines.push('');
112
- lines.push('| Check | Aceite | Status | Duração |');
113
- lines.push('|-------|--------|--------|---------|');
114
- for (const cr of checkResults) {
115
- lines.push(`| ${cr.check_id} | ${cr.acceptance_ref ?? ''} | ${verifyIcon(cr.status)} | ${cr.duration_ms}ms |`);
116
- }
117
- lines.push('');
118
- }
119
-
120
- const passed = results.filter((r) => r.status === 'pass').length;
121
- const failed = results.filter((r) => r.status === 'fail').length;
122
- const allPass = failed === 0 && results.length > 0;
123
-
124
- lines.push('## Conclusão');
125
- lines.push('');
126
- lines.push(`- **Total de critérios:** ${results.length}`);
127
- lines.push(`- **Aprovados:** ${passed}`);
128
- lines.push(`- **Reprovados:** ${failed}`);
129
- lines.push('');
130
- lines.push(allPass
131
- ? '> ✓ **Verificação concluída com sucesso.** Todos os critérios foram atendidos.'
132
- : `> ✗ **Verificação com falhas.** ${failed} critério(s) não atendido(s).`);
133
- lines.push('');
134
-
135
- return lines.join('\n');
136
- }
137
-
138
- projectState(state: RunState): string {
139
- const run = state.run;
140
- const completed = [...state.completedWorkItems];
141
- const failed = [...state.failedWorkItems];
142
- const blocked = [...state.blockedWorkItems];
143
-
144
- const lines: string[] = [
145
- '# OXE — Estado',
146
- '',
147
- '<!-- Gerado automaticamente pelo Projection Engine — não editar diretamente -->',
148
- '',
149
- '## Fase atual',
150
- '',
151
- `- **Status da run:** ${run?.status ?? 'sem run ativa'}`,
152
- `- **Run ID:** ${run?.run_id ?? '—'}`,
153
- `- **Modo:** ${run?.mode ?? '—'}`,
154
- '',
155
- '## Runtime operacional',
156
- '',
157
- `- **runtime_status:** ${run?.status ?? '—'}`,
158
- `- **active_run_ref:** ${run?.run_id ?? '—'}`,
159
- '',
160
- '## Progresso',
161
- '',
162
- `- **Concluídos (${completed.length}):** ${completed.join(', ') || '—'}`,
163
- `- **Falhos (${failed.length}):** ${failed.join(', ') || '—'}`,
164
- `- **Bloqueados (${blocked.length}):** ${blocked.join(', ') || '—'}`,
165
- '',
166
- `- **lifecycleStatus:** ${run?.status === 'completed' ? 'closed' : run?.status === 'running' ? 'executing' : 'pending_execute'}`,
167
- '',
168
- ];
169
-
170
- return lines.join('\n');
171
- }
172
-
173
- projectRunSummary(state: RunState): string {
174
- const run = state.run;
175
- const completed = [...state.completedWorkItems];
176
- const failed = [...state.failedWorkItems];
177
- const blocked = [...state.blockedWorkItems];
178
- const totalAttempts = [...state.attempts.values()].reduce((s, a) => s + a.length, 0);
179
-
180
- const lines: string[] = [
181
- `## Run Summary${run?.run_id ?? 'unknown'}`,
182
- '',
183
- `**Status:** ${run?.status ?? '—'} `,
184
- `**Mode:** ${run?.mode ?? ''} `,
185
- `**Started:** ${isoToDate(run?.started_at)} `,
186
- `**Ended:** ${isoToDate(run?.ended_at)} `,
187
- '',
188
- `**Completed:** ${completed.length} tasks `,
189
- `**Failed:** ${failed.length} tasks `,
190
- `**Blocked:** ${blocked.length} tasks `,
191
- `**Total attempts:** ${totalAttempts} `,
192
- '',
193
- ];
194
-
195
- if (completed.length > 0) {
196
- lines.push(`**✓ Completed:** ${completed.join(', ')}`);
197
- }
198
- if (failed.length > 0) {
199
- lines.push(`**✗ Failed:** ${failed.join(', ')}`);
200
- }
201
- if (blocked.length > 0) {
202
- lines.push(`**⊘ Blocked:** ${blocked.join(', ')}`);
203
- }
204
-
205
- return lines.join('\n');
206
- }
207
-
208
- projectPRSummary(state: RunState, graph: ExecutionGraph): string {
209
- const run = state.run;
210
- const completed = [...state.completedWorkItems];
211
- const failed = [...state.failedWorkItems];
212
-
213
- const lines: string[] = [
214
- '## Summary',
215
- '',
216
- ];
217
-
218
- if (completed.length > 0) {
219
- for (const id of completed) {
220
- const node = graph.nodes.get(id);
221
- lines.push(`- ✓ ${node?.title ?? id} (\`${id}\`)`);
222
- }
223
- }
224
-
225
- if (failed.length > 0) {
226
- lines.push('');
227
- lines.push('**⚠️ Incomplete tasks:**');
228
- for (const id of failed) {
229
- const node = graph.nodes.get(id);
230
- lines.push(`- ${node?.title ?? id} (\`${id}\`)`);
231
- }
232
- }
233
-
234
- lines.push('');
235
- lines.push('## Test plan');
236
- lines.push('');
237
-
238
- for (const wave of graph.waves) {
239
- lines.push(`- [ ] Wave ${wave.wave_number}: ${wave.node_ids.join(', ')}`);
240
- }
241
-
242
- lines.push('');
243
- lines.push(`**Run:** \`${run?.run_id ?? '—'}\` | **Status:** ${run?.status ?? '—'}`);
244
- lines.push('');
245
- lines.push('🤖 Generated with [OXE Runtime](https://github.com/propagno/oxe-build)');
246
-
247
- return lines.join('\n');
248
- }
249
- }
1
+ import type { RunState } from '../reducers/run-state-reducer';
2
+ import type { ExecutionGraph } from '../compiler/graph-compiler';
3
+ import type { VerificationResult } from '../models/verification-result';
4
+ import type { CheckResult } from '../verification/verification-compiler';
5
+ import type { VerificationManifest, ResidualRiskLedger } from '../verification/verification-manifest';
6
+
7
+ function isoToDate(iso: string | null | undefined): string {
8
+ if (!iso) return '—';
9
+ return iso.slice(0, 10);
10
+ }
11
+
12
+ function statusIcon(status: string): string {
13
+ switch (status) {
14
+ case 'completed': return '';
15
+ case 'failed': return '';
16
+ case 'blocked': return '';
17
+ case 'running': return '';
18
+ default: return '○';
19
+ }
20
+ }
21
+
22
+ function verifyIcon(status: string): string {
23
+ switch (status) {
24
+ case 'pass': return ' PASS';
25
+ case 'fail': return ' FAIL';
26
+ case 'skip': return ' SKIP';
27
+ case 'error': return '! ERROR';
28
+ default: return status;
29
+ }
30
+ }
31
+
32
+ export class ProjectionEngine {
33
+ projectPlan(state: RunState, graph: ExecutionGraph): string {
34
+ const run = state.run;
35
+ const lines: string[] = [
36
+ '# OXE — Plano de Execução',
37
+ '',
38
+ '<!-- Gerado automaticamente pelo Projection Engine — não editar diretamente -->',
39
+ '',
40
+ '## Resumo',
41
+ '',
42
+ `- **Run:** ${run?.run_id ?? ''}`,
43
+ `- **Status:** ${run?.status ?? 'sem run'}`,
44
+ `- **Iniciado em:** ${isoToDate(run?.started_at)}`,
45
+ `- **Nós:** ${graph.metadata.node_count} tarefas em ${graph.metadata.wave_count} onda(s)`,
46
+ '',
47
+ '## Ondas e tarefas',
48
+ '',
49
+ ];
50
+
51
+ for (const wave of graph.waves) {
52
+ lines.push(`### Onda ${wave.wave_number}`);
53
+ lines.push('');
54
+ lines.push('| ID | Título | Status | Dependências |');
55
+ lines.push('|----|--------|--------|--------------|');
56
+ for (const nodeId of wave.node_ids) {
57
+ const node = graph.nodes.get(nodeId);
58
+ const wItem = state.workItems.get(nodeId);
59
+ const status = wItem?.status ?? 'pending';
60
+ const deps = node?.depends_on.join(', ') || '—';
61
+ lines.push(`| ${nodeId} | ${node?.title ?? nodeId} | ${statusIcon(status)} ${status} | ${deps} |`);
62
+ }
63
+ lines.push('');
64
+ }
65
+
66
+ if (state.completedWorkItems.size > 0 || state.failedWorkItems.size > 0) {
67
+ lines.push('## Progresso');
68
+ lines.push('');
69
+ lines.push(`- **Concluídos:** ${[...state.completedWorkItems].join(', ') || '—'}`);
70
+ lines.push(`- **Falhos:** ${[...state.failedWorkItems].join(', ') || '—'}`);
71
+ lines.push(`- **Bloqueados:** ${[...state.blockedWorkItems].join(', ') || '—'}`);
72
+ lines.push('');
73
+ }
74
+
75
+ return lines.join('\n');
76
+ }
77
+
78
+ projectVerify(
79
+ state: RunState,
80
+ results: VerificationResult[],
81
+ checkResults?: CheckResult[],
82
+ manifest?: VerificationManifest | null,
83
+ riskLedger?: ResidualRiskLedger | null,
84
+ evidenceCoverage?: { total_checks: number; checks_with_evidence: number; total_evidence_refs: number; coverage_percent: number } | null
85
+ ): string {
86
+ const run = state.run;
87
+ const lines: string[] = [
88
+ '# OXE Verificação',
89
+ '',
90
+ '<!-- Gerado automaticamente pelo Projection Engine não editar diretamente -->',
91
+ '',
92
+ '## Auditoria de pré-execução',
93
+ '',
94
+ `- **Run:** ${run?.run_id ?? ''}`,
95
+ `- **Iniciado em:** ${isoToDate(run?.started_at)}`,
96
+ `- **Concluído em:** ${isoToDate(run?.ended_at)}`,
97
+ `- **Status:** ${run?.status ?? '—'}`,
98
+ '',
99
+ ];
100
+
101
+ if (results.length > 0) {
102
+ lines.push('## Critérios de aceite');
103
+ lines.push('');
104
+ lines.push('| ID | Check | Status | Evidências |');
105
+ lines.push('|----|-------|--------|------------|');
106
+ for (const r of results) {
107
+ const evidenceList = r.evidence_refs.join(', ') || '—';
108
+ lines.push(`| ${r.check_id} | ${r.summary ?? r.check_id} | ${verifyIcon(r.status)} | ${evidenceList} |`);
109
+ }
110
+ lines.push('');
111
+ }
112
+
113
+ if (manifest) {
114
+ lines.push('## Verification Manifest');
115
+ lines.push('');
116
+ lines.push(`- **Checks:** ${manifest.summary.total}`);
117
+ lines.push(`- **Pass:** ${manifest.summary.pass}`);
118
+ lines.push(`- **Fail:** ${manifest.summary.fail}`);
119
+ lines.push(`- **Skip:** ${manifest.summary.skip}`);
120
+ lines.push(`- **Errors:** ${manifest.summary.error}`);
121
+ lines.push(`- **All passed:** ${manifest.summary.all_passed ? 'sim' : 'não'}`);
122
+ lines.push('');
123
+ }
124
+
125
+ if (evidenceCoverage) {
126
+ lines.push('## Evidence Coverage');
127
+ lines.push('');
128
+ lines.push(`- **Checks com evidência:** ${evidenceCoverage.checks_with_evidence}/${evidenceCoverage.total_checks}`);
129
+ lines.push(`- **Refs totais:** ${evidenceCoverage.total_evidence_refs}`);
130
+ lines.push(`- **Cobertura:** ${evidenceCoverage.coverage_percent}%`);
131
+ lines.push('');
132
+ }
133
+
134
+ if (riskLedger && riskLedger.risks.length > 0) {
135
+ lines.push('## Residual Risks');
136
+ lines.push('');
137
+ for (const risk of riskLedger.risks) {
138
+ lines.push(`- [${risk.severity.toUpperCase()}] ${risk.description}`);
139
+ }
140
+ lines.push('');
141
+ }
142
+
143
+ if (checkResults && checkResults.length > 0) {
144
+ lines.push('## Resultados dos checks executados');
145
+ lines.push('');
146
+ lines.push('| Check | Aceite | Status | Duração |');
147
+ lines.push('|-------|--------|--------|---------|');
148
+ for (const cr of checkResults) {
149
+ lines.push(`| ${cr.check_id} | ${cr.acceptance_ref ?? '—'} | ${verifyIcon(cr.status)} | ${cr.duration_ms}ms |`);
150
+ }
151
+ lines.push('');
152
+ }
153
+
154
+ const passed = results.filter((r) => r.status === 'pass').length;
155
+ const failed = results.filter((r) => r.status === 'fail').length;
156
+ const allPass = failed === 0 && results.length > 0;
157
+
158
+ lines.push('## Conclusão');
159
+ lines.push('');
160
+ lines.push(`- **Total de critérios:** ${results.length}`);
161
+ lines.push(`- **Aprovados:** ${passed}`);
162
+ lines.push(`- **Reprovados:** ${failed}`);
163
+ lines.push('');
164
+ lines.push(allPass
165
+ ? '> ✓ **Verificação concluída com sucesso.** Todos os critérios foram atendidos.'
166
+ : `> **Verificação com falhas.** ${failed} critério(s) não atendido(s).`);
167
+ lines.push('');
168
+
169
+ return lines.join('\n');
170
+ }
171
+
172
+ projectState(state: RunState): string {
173
+ const run = state.run;
174
+ const completed = [...state.completedWorkItems];
175
+ const failed = [...state.failedWorkItems];
176
+ const blocked = [...state.blockedWorkItems];
177
+
178
+ const lines: string[] = [
179
+ '# OXE — Estado',
180
+ '',
181
+ '<!-- Gerado automaticamente pelo Projection Engine não editar diretamente -->',
182
+ '',
183
+ '## Fase atual',
184
+ '',
185
+ `- **Status da run:** ${run?.status ?? 'sem run ativa'}`,
186
+ `- **Run ID:** ${run?.run_id ?? '—'}`,
187
+ `- **Modo:** ${run?.mode ?? ''}`,
188
+ '',
189
+ '## Runtime operacional',
190
+ '',
191
+ `- **runtime_status:** ${run?.status ?? '—'}`,
192
+ `- **active_run_ref:** ${run?.run_id ?? ''}`,
193
+ '',
194
+ '## Progresso',
195
+ '',
196
+ `- **Concluídos (${completed.length}):** ${completed.join(', ') || '—'}`,
197
+ `- **Falhos (${failed.length}):** ${failed.join(', ') || '—'}`,
198
+ `- **Bloqueados (${blocked.length}):** ${blocked.join(', ') || '—'}`,
199
+ '',
200
+ `- **lifecycleStatus:** ${run?.status === 'completed' ? 'closed' : run?.status === 'running' ? 'executing' : 'pending_execute'}`,
201
+ '',
202
+ ];
203
+
204
+ return lines.join('\n');
205
+ }
206
+
207
+ projectRunSummary(state: RunState): string {
208
+ const run = state.run;
209
+ const completed = [...state.completedWorkItems];
210
+ const failed = [...state.failedWorkItems];
211
+ const blocked = [...state.blockedWorkItems];
212
+ const totalAttempts = [...state.attempts.values()].reduce((s, a) => s + a.length, 0);
213
+
214
+ const lines: string[] = [
215
+ `## Run Summary — ${run?.run_id ?? 'unknown'}`,
216
+ '',
217
+ `**Status:** ${run?.status ?? '—'} `,
218
+ `**Mode:** ${run?.mode ?? '—'} `,
219
+ `**Started:** ${isoToDate(run?.started_at)} `,
220
+ `**Ended:** ${isoToDate(run?.ended_at)} `,
221
+ '',
222
+ `**Completed:** ${completed.length} tasks `,
223
+ `**Failed:** ${failed.length} tasks `,
224
+ `**Blocked:** ${blocked.length} tasks `,
225
+ `**Total attempts:** ${totalAttempts} `,
226
+ '',
227
+ ];
228
+
229
+ if (completed.length > 0) {
230
+ lines.push(`**✓ Completed:** ${completed.join(', ')}`);
231
+ }
232
+ if (failed.length > 0) {
233
+ lines.push(`**✗ Failed:** ${failed.join(', ')}`);
234
+ }
235
+ if (blocked.length > 0) {
236
+ lines.push(`**⊘ Blocked:** ${blocked.join(', ')}`);
237
+ }
238
+
239
+ return lines.join('\n');
240
+ }
241
+
242
+ projectPRSummary(state: RunState, graph: ExecutionGraph): string {
243
+ return this.projectPromotionSummary(state, graph);
244
+ }
245
+
246
+ projectCommitSummary(state: RunState, graph: ExecutionGraph): string {
247
+ const run = state.run;
248
+ const completed = [...state.completedWorkItems];
249
+ const failed = [...state.failedWorkItems];
250
+ const blocked = [...state.blockedWorkItems];
251
+ const lines: string[] = [
252
+ '## Commit Summary',
253
+ '',
254
+ `**Run:** \`${run?.run_id ?? '—'}\``,
255
+ `**Status:** ${run?.status ?? '—'}`,
256
+ '',
257
+ '### Included work items',
258
+ '',
259
+ ];
260
+ for (const id of completed) {
261
+ const node = graph.nodes.get(id);
262
+ lines.push(`- ✓ ${node?.title ?? id} (\`${id}\`)`);
263
+ }
264
+ if (failed.length || blocked.length) {
265
+ lines.push('');
266
+ lines.push('### Attention points');
267
+ lines.push('');
268
+ for (const id of failed) {
269
+ const node = graph.nodes.get(id);
270
+ lines.push(`- ✗ ${node?.title ?? id} (\`${id}\`)`);
271
+ }
272
+ for (const id of blocked) {
273
+ const node = graph.nodes.get(id);
274
+ lines.push(`- ⊘ ${node?.title ?? id} (\`${id}\`)`);
275
+ }
276
+ }
277
+ lines.push('');
278
+ lines.push('Generated by OXE Runtime.');
279
+ return lines.join('\n');
280
+ }
281
+
282
+ projectPromotionSummary(state: RunState, graph: ExecutionGraph): string {
283
+ const run = state.run;
284
+ const completed = [...state.completedWorkItems];
285
+ const failed = [...state.failedWorkItems];
286
+ const blocked = [...state.blockedWorkItems];
287
+
288
+ const lines: string[] = [
289
+ '## Promotion Summary',
290
+ '',
291
+ ];
292
+
293
+ if (completed.length > 0) {
294
+ for (const id of completed) {
295
+ const node = graph.nodes.get(id);
296
+ lines.push(`- ✓ ${node?.title ?? id} (\`${id}\`)`);
297
+ }
298
+ }
299
+
300
+ if (failed.length > 0 || blocked.length > 0) {
301
+ lines.push('');
302
+ lines.push('**⚠️ Incomplete tasks:**');
303
+ for (const id of failed) {
304
+ const node = graph.nodes.get(id);
305
+ lines.push(`- ✗ ${node?.title ?? id} (\`${id}\`)`);
306
+ }
307
+ for (const id of blocked) {
308
+ const node = graph.nodes.get(id);
309
+ lines.push(`- ⊘ ${node?.title ?? id} (\`${id}\`)`);
310
+ }
311
+ }
312
+
313
+ lines.push('');
314
+ lines.push('## Test plan');
315
+ lines.push('');
316
+
317
+ for (const wave of graph.waves) {
318
+ lines.push(`- [ ] Wave ${wave.wave_number}: ${wave.node_ids.join(', ')}`);
319
+ }
320
+
321
+ lines.push('');
322
+ lines.push(`**Run:** \`${run?.run_id ?? '—'}\` | **Status:** ${run?.status ?? '—'}`);
323
+ lines.push('');
324
+ lines.push('🤖 Generated with [OXE Runtime](https://github.com/propagno/oxe-build)');
325
+
326
+ return lines.join('\n');
327
+ }
328
+ }