oxe-cc 0.9.3 → 1.2.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 (319) hide show
  1. package/.cursor/commands/oxe-ask.md +1 -1
  2. package/.cursor/commands/oxe-capabilities.md +1 -1
  3. package/.cursor/commands/oxe-checkpoint.md +1 -1
  4. package/.cursor/commands/oxe-compact.md +1 -1
  5. package/.cursor/commands/oxe-dashboard.md +1 -1
  6. package/.cursor/commands/oxe-debug.md +1 -1
  7. package/.cursor/commands/oxe-discuss.md +1 -1
  8. package/.cursor/commands/oxe-execute.md +2 -2
  9. package/.cursor/commands/oxe-forensics.md +1 -1
  10. package/.cursor/commands/oxe-help.md +1 -1
  11. package/.cursor/commands/oxe-loop.md +1 -1
  12. package/.cursor/commands/oxe-milestone.md +1 -1
  13. package/.cursor/commands/oxe-next.md +1 -1
  14. package/.cursor/commands/oxe-obs.md +1 -1
  15. package/.cursor/commands/oxe-plan-agent.md +1 -1
  16. package/.cursor/commands/oxe-plan.md +1 -1
  17. package/.cursor/commands/oxe-project.md +1 -1
  18. package/.cursor/commands/oxe-quick.md +1 -1
  19. package/.cursor/commands/oxe-research.md +1 -1
  20. package/.cursor/commands/oxe-retro.md +1 -1
  21. package/.cursor/commands/oxe-review-pr.md +1 -1
  22. package/.cursor/commands/oxe-route.md +1 -1
  23. package/.cursor/commands/oxe-scan.md +1 -1
  24. package/.cursor/commands/oxe-security.md +1 -1
  25. package/.cursor/commands/oxe-session.md +2 -2
  26. package/.cursor/commands/oxe-ship.md +45 -0
  27. package/.cursor/commands/oxe-skill.md +1 -1
  28. package/.cursor/commands/oxe-spec.md +1 -1
  29. package/.cursor/commands/oxe-ui-review.md +1 -1
  30. package/.cursor/commands/oxe-ui-spec.md +1 -1
  31. package/.cursor/commands/oxe-update.md +1 -1
  32. package/.cursor/commands/oxe-validate-gaps.md +1 -1
  33. package/.cursor/commands/oxe-verify.md +1 -1
  34. package/.cursor/commands/oxe-workstream.md +1 -1
  35. package/.cursor/commands/oxe.md +4 -4
  36. package/.github/copilot-instructions.md +91 -1
  37. package/.github/prompts/oxe-ask.prompt.md +1 -1
  38. package/.github/prompts/oxe-capabilities.prompt.md +1 -1
  39. package/.github/prompts/oxe-checkpoint.prompt.md +1 -1
  40. package/.github/prompts/oxe-compact.prompt.md +1 -1
  41. package/.github/prompts/oxe-dashboard.prompt.md +1 -1
  42. package/.github/prompts/oxe-debug.prompt.md +1 -1
  43. package/.github/prompts/oxe-discuss.prompt.md +1 -1
  44. package/.github/prompts/oxe-execute.prompt.md +2 -2
  45. package/.github/prompts/oxe-forensics.prompt.md +1 -1
  46. package/.github/prompts/oxe-help.prompt.md +1 -1
  47. package/.github/prompts/oxe-loop.prompt.md +1 -1
  48. package/.github/prompts/oxe-milestone.prompt.md +1 -1
  49. package/.github/prompts/oxe-next.prompt.md +1 -1
  50. package/.github/prompts/oxe-obs.prompt.md +1 -1
  51. package/.github/prompts/oxe-plan-agent.prompt.md +1 -1
  52. package/.github/prompts/oxe-plan.prompt.md +1 -1
  53. package/.github/prompts/oxe-project.prompt.md +1 -1
  54. package/.github/prompts/oxe-quick.prompt.md +1 -1
  55. package/.github/prompts/oxe-research.prompt.md +1 -1
  56. package/.github/prompts/oxe-retro.prompt.md +1 -1
  57. package/.github/prompts/oxe-review-pr.prompt.md +1 -1
  58. package/.github/prompts/oxe-route.prompt.md +1 -1
  59. package/.github/prompts/oxe-scan.prompt.md +1 -1
  60. package/.github/prompts/oxe-security.prompt.md +1 -1
  61. package/.github/prompts/oxe-session.prompt.md +2 -2
  62. package/.github/prompts/oxe-ship.prompt.md +45 -0
  63. package/.github/prompts/oxe-skill.prompt.md +1 -1
  64. package/.github/prompts/oxe-spec.prompt.md +1 -1
  65. package/.github/prompts/oxe-ui-review.prompt.md +1 -1
  66. package/.github/prompts/oxe-ui-spec.prompt.md +1 -1
  67. package/.github/prompts/oxe-update.prompt.md +1 -1
  68. package/.github/prompts/oxe-validate-gaps.prompt.md +1 -1
  69. package/.github/prompts/oxe-verify.prompt.md +1 -1
  70. package/.github/prompts/oxe-workstream.prompt.md +1 -1
  71. package/.github/prompts/oxe.prompt.md +3 -3
  72. package/AGENTS.md +43 -28
  73. package/CHANGELOG.md +158 -0
  74. package/README.md +72 -50
  75. package/bin/banner.txt +1 -1
  76. package/bin/lib/oxe-dashboard.cjs +9 -7
  77. package/bin/lib/oxe-operational.cjs +569 -4
  78. package/bin/lib/oxe-project-health.cjs +1 -1
  79. package/bin/oxe-cc.js +141 -57
  80. package/commands/oxe/ask.md +5 -1
  81. package/commands/oxe/checkpoint.md +1 -1
  82. package/commands/oxe/compact.md +1 -1
  83. package/commands/oxe/debug.md +1 -1
  84. package/commands/oxe/execute.md +2 -2
  85. package/commands/oxe/forensics.md +1 -1
  86. package/commands/oxe/loop.md +1 -1
  87. package/commands/oxe/milestone.md +1 -1
  88. package/commands/oxe/next.md +1 -1
  89. package/commands/oxe/obs.md +1 -1
  90. package/commands/oxe/oxe.md +3 -3
  91. package/commands/oxe/project.md +1 -1
  92. package/commands/oxe/research.md +1 -1
  93. package/commands/oxe/retro.md +1 -1
  94. package/commands/oxe/review-pr.md +1 -1
  95. package/commands/oxe/route.md +1 -1
  96. package/commands/oxe/scan.md +1 -1
  97. package/commands/oxe/security.md +1 -1
  98. package/commands/oxe/session.md +2 -2
  99. package/commands/oxe/ship.md +49 -0
  100. package/commands/oxe/spec.md +2 -2
  101. package/commands/oxe/ui-review.md +1 -1
  102. package/commands/oxe/ui-spec.md +1 -1
  103. package/commands/oxe/validate-gaps.md +1 -1
  104. package/commands/oxe/verify.md +2 -2
  105. package/commands/oxe/workstream.md +1 -1
  106. package/lib/runtime/audit/audit-trail.d.ts +71 -0
  107. package/lib/runtime/audit/audit-trail.js +154 -0
  108. package/lib/runtime/audit/index.d.ts +2 -0
  109. package/lib/runtime/audit/index.js +18 -0
  110. package/lib/runtime/audit/policy-pack.d.ts +15 -0
  111. package/lib/runtime/audit/policy-pack.js +57 -0
  112. package/lib/runtime/compiler/graph-compiler.d.ts +83 -0
  113. package/lib/runtime/compiler/graph-compiler.js +135 -0
  114. package/lib/runtime/compiler/index.d.ts +1 -0
  115. package/lib/runtime/compiler/index.js +17 -0
  116. package/lib/runtime/context/context-pack-builder.d.ts +51 -0
  117. package/lib/runtime/context/context-pack-builder.js +178 -0
  118. package/lib/runtime/context/context-pack-store.d.ts +38 -0
  119. package/lib/runtime/context/context-pack-store.js +142 -0
  120. package/lib/runtime/context/context-profiles.d.ts +11 -0
  121. package/lib/runtime/context/context-profiles.js +51 -0
  122. package/lib/runtime/context/index.d.ts +3 -0
  123. package/lib/runtime/context/index.js +19 -0
  124. package/lib/runtime/decision/decision-engine.d.ts +43 -0
  125. package/lib/runtime/decision/decision-engine.js +127 -0
  126. package/lib/runtime/decision/decision-memo.d.ts +53 -0
  127. package/lib/runtime/decision/decision-memo.js +173 -0
  128. package/lib/runtime/decision/index.d.ts +2 -0
  129. package/lib/runtime/decision/index.js +18 -0
  130. package/lib/runtime/delivery/branch-manager.d.ts +19 -0
  131. package/lib/runtime/delivery/branch-manager.js +78 -0
  132. package/lib/runtime/delivery/ci-checks.d.ts +34 -0
  133. package/lib/runtime/delivery/ci-checks.js +209 -0
  134. package/lib/runtime/delivery/index.d.ts +4 -0
  135. package/lib/runtime/delivery/index.js +20 -0
  136. package/lib/runtime/delivery/pr-manager.d.ts +30 -0
  137. package/lib/runtime/delivery/pr-manager.js +82 -0
  138. package/lib/runtime/delivery/promotion-pipeline.d.ts +39 -0
  139. package/lib/runtime/delivery/promotion-pipeline.js +127 -0
  140. package/lib/runtime/events/bus.d.ts +9 -0
  141. package/lib/runtime/events/bus.js +63 -0
  142. package/lib/runtime/events/catalog.d.ts +3 -0
  143. package/lib/runtime/events/catalog.js +30 -0
  144. package/lib/runtime/events/envelope.d.ts +13 -0
  145. package/lib/runtime/events/envelope.js +2 -0
  146. package/lib/runtime/events/index.d.ts +3 -0
  147. package/lib/runtime/events/index.js +19 -0
  148. package/lib/runtime/evidence/evidence-store.d.ts +22 -0
  149. package/lib/runtime/evidence/evidence-store.js +106 -0
  150. package/lib/runtime/evidence/index.d.ts +1 -0
  151. package/lib/runtime/evidence/index.js +17 -0
  152. package/lib/runtime/gate/gate-manager.d.ts +39 -0
  153. package/lib/runtime/gate/gate-manager.js +104 -0
  154. package/lib/runtime/gate/index.d.ts +1 -0
  155. package/lib/runtime/gate/index.js +17 -0
  156. package/lib/runtime/index.d.ts +19 -0
  157. package/lib/runtime/index.js +44 -0
  158. package/lib/runtime/models/attempt.d.ts +12 -0
  159. package/lib/runtime/models/attempt.js +2 -0
  160. package/lib/runtime/models/evidence.d.ts +9 -0
  161. package/lib/runtime/models/evidence.js +2 -0
  162. package/lib/runtime/models/gate-decision.d.ts +10 -0
  163. package/lib/runtime/models/gate-decision.js +2 -0
  164. package/lib/runtime/models/index.d.ts +8 -0
  165. package/lib/runtime/models/index.js +24 -0
  166. package/lib/runtime/models/run.d.ts +13 -0
  167. package/lib/runtime/models/run.js +2 -0
  168. package/lib/runtime/models/session.d.ts +10 -0
  169. package/lib/runtime/models/session.js +2 -0
  170. package/lib/runtime/models/verification-result.d.ts +9 -0
  171. package/lib/runtime/models/verification-result.js +2 -0
  172. package/lib/runtime/models/work-item.d.ts +15 -0
  173. package/lib/runtime/models/work-item.js +2 -0
  174. package/lib/runtime/models/workspace.d.ts +25 -0
  175. package/lib/runtime/models/workspace.js +2 -0
  176. package/lib/runtime/plugins/capability-matrix.d.ts +20 -0
  177. package/lib/runtime/plugins/capability-matrix.js +59 -0
  178. package/lib/runtime/plugins/index.d.ts +4 -0
  179. package/lib/runtime/plugins/index.js +20 -0
  180. package/lib/runtime/plugins/plugin-abi.d.ts +76 -0
  181. package/lib/runtime/plugins/plugin-abi.js +2 -0
  182. package/lib/runtime/plugins/plugin-manifest.d.ts +22 -0
  183. package/lib/runtime/plugins/plugin-manifest.js +91 -0
  184. package/lib/runtime/plugins/plugin-registry.d.ts +21 -0
  185. package/lib/runtime/plugins/plugin-registry.js +119 -0
  186. package/lib/runtime/policy/index.d.ts +1 -0
  187. package/lib/runtime/policy/index.js +17 -0
  188. package/lib/runtime/policy/policy-engine.d.ts +67 -0
  189. package/lib/runtime/policy/policy-engine.js +171 -0
  190. package/lib/runtime/projection/index.d.ts +1 -0
  191. package/lib/runtime/projection/index.js +17 -0
  192. package/lib/runtime/projection/projection-engine.d.ts +11 -0
  193. package/lib/runtime/projection/projection-engine.js +218 -0
  194. package/lib/runtime/reducers/debug-reducer.d.ts +10 -0
  195. package/lib/runtime/reducers/debug-reducer.js +30 -0
  196. package/lib/runtime/reducers/index.d.ts +2 -0
  197. package/lib/runtime/reducers/index.js +18 -0
  198. package/lib/runtime/reducers/run-state-reducer.d.ts +46 -0
  199. package/lib/runtime/reducers/run-state-reducer.js +226 -0
  200. package/lib/runtime/scheduler/agent-registry.d.ts +44 -0
  201. package/lib/runtime/scheduler/agent-registry.js +96 -0
  202. package/lib/runtime/scheduler/agent-roles.d.ts +54 -0
  203. package/lib/runtime/scheduler/agent-roles.js +62 -0
  204. package/lib/runtime/scheduler/index.d.ts +4 -0
  205. package/lib/runtime/scheduler/index.js +20 -0
  206. package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +36 -0
  207. package/lib/runtime/scheduler/multi-agent-coordinator.js +253 -0
  208. package/lib/runtime/scheduler/run-journal.d.ts +18 -0
  209. package/lib/runtime/scheduler/run-journal.js +54 -0
  210. package/lib/runtime/scheduler/scheduler.d.ts +49 -0
  211. package/lib/runtime/scheduler/scheduler.js +324 -0
  212. package/lib/runtime/verification/index.d.ts +2 -0
  213. package/lib/runtime/verification/index.js +18 -0
  214. package/lib/runtime/verification/verification-compiler.d.ts +56 -0
  215. package/lib/runtime/verification/verification-compiler.js +147 -0
  216. package/lib/runtime/verification/verification-manifest.d.ts +58 -0
  217. package/lib/runtime/verification/verification-manifest.js +129 -0
  218. package/lib/runtime/workspace/index.d.ts +5 -0
  219. package/lib/runtime/workspace/index.js +24 -0
  220. package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +22 -0
  221. package/lib/runtime/workspace/strategies/ephemeral-container.js +109 -0
  222. package/lib/runtime/workspace/strategies/git-worktree.d.ts +12 -0
  223. package/lib/runtime/workspace/strategies/git-worktree.js +79 -0
  224. package/lib/runtime/workspace/strategies/inplace.d.ts +10 -0
  225. package/lib/runtime/workspace/strategies/inplace.js +37 -0
  226. package/lib/runtime/workspace/workspace-manager.d.ts +13 -0
  227. package/lib/runtime/workspace/workspace-manager.js +2 -0
  228. package/lib/sdk/index.cjs +24 -7
  229. package/lib/sdk/index.d.ts +17 -7
  230. package/oxe/workflows/ask.md +4 -0
  231. package/oxe/workflows/checkpoint.md +14 -10
  232. package/oxe/workflows/debug.md +19 -15
  233. package/oxe/workflows/execute.md +30 -2
  234. package/oxe/workflows/forensics.md +13 -9
  235. package/oxe/workflows/help.md +97 -49
  236. package/oxe/workflows/loop.md +17 -13
  237. package/oxe/workflows/obs.md +4 -0
  238. package/oxe/workflows/oxe.md +64 -31
  239. package/oxe/workflows/project.md +6 -1
  240. package/oxe/workflows/references/workflow-runtime-contracts.json +23 -0
  241. package/oxe/workflows/research.md +32 -28
  242. package/oxe/workflows/retro.md +4 -0
  243. package/oxe/workflows/review-pr.md +15 -11
  244. package/oxe/workflows/scan.md +4 -0
  245. package/oxe/workflows/security.md +14 -10
  246. package/oxe/workflows/session.md +17 -1
  247. package/oxe/workflows/ship.md +142 -0
  248. package/oxe/workflows/spec.md +15 -0
  249. package/oxe/workflows/ui-review.md +20 -16
  250. package/oxe/workflows/ui-spec.md +7 -3
  251. package/oxe/workflows/validate-gaps.md +13 -9
  252. package/oxe/workflows/verify.md +42 -3
  253. package/package.json +9 -3
  254. package/packages/runtime/package.json +17 -0
  255. package/packages/runtime/src/audit/audit-trail.ts +243 -0
  256. package/packages/runtime/src/audit/index.ts +2 -0
  257. package/packages/runtime/src/audit/policy-pack.ts +62 -0
  258. package/packages/runtime/src/compiler/graph-compiler.ts +245 -0
  259. package/packages/runtime/src/compiler/index.ts +1 -0
  260. package/packages/runtime/src/context/context-pack-builder.ts +259 -0
  261. package/packages/runtime/src/context/context-pack-store.ts +197 -0
  262. package/packages/runtime/src/context/context-profiles.ts +60 -0
  263. package/packages/runtime/src/context/index.ts +3 -0
  264. package/packages/runtime/src/decision/decision-engine.ts +174 -0
  265. package/packages/runtime/src/decision/decision-memo.ts +211 -0
  266. package/packages/runtime/src/decision/index.ts +2 -0
  267. package/packages/runtime/src/delivery/branch-manager.ts +84 -0
  268. package/packages/runtime/src/delivery/ci-checks.ts +252 -0
  269. package/packages/runtime/src/delivery/index.ts +4 -0
  270. package/packages/runtime/src/delivery/pr-manager.ts +112 -0
  271. package/packages/runtime/src/delivery/promotion-pipeline.ts +180 -0
  272. package/packages/runtime/src/events/bus.ts +92 -0
  273. package/packages/runtime/src/events/catalog.ts +29 -0
  274. package/packages/runtime/src/events/envelope.ts +14 -0
  275. package/packages/runtime/src/events/index.ts +3 -0
  276. package/packages/runtime/src/evidence/evidence-store.ts +130 -0
  277. package/packages/runtime/src/evidence/index.ts +1 -0
  278. package/packages/runtime/src/gate/gate-manager.ts +137 -0
  279. package/packages/runtime/src/gate/index.ts +1 -0
  280. package/packages/runtime/src/index.ts +37 -0
  281. package/packages/runtime/src/models/attempt.ts +19 -0
  282. package/packages/runtime/src/models/evidence.ts +21 -0
  283. package/packages/runtime/src/models/gate-decision.ts +21 -0
  284. package/packages/runtime/src/models/index.ts +8 -0
  285. package/packages/runtime/src/models/run.ts +24 -0
  286. package/packages/runtime/src/models/session.ts +11 -0
  287. package/packages/runtime/src/models/verification-result.ts +10 -0
  288. package/packages/runtime/src/models/work-item.ts +25 -0
  289. package/packages/runtime/src/models/workspace.ts +28 -0
  290. package/packages/runtime/src/plugins/capability-matrix.ts +83 -0
  291. package/packages/runtime/src/plugins/index.ts +4 -0
  292. package/packages/runtime/src/plugins/plugin-abi.ts +95 -0
  293. package/packages/runtime/src/plugins/plugin-manifest.ts +113 -0
  294. package/packages/runtime/src/plugins/plugin-registry.ts +124 -0
  295. package/packages/runtime/src/policy/index.ts +1 -0
  296. package/packages/runtime/src/policy/policy-engine.ts +244 -0
  297. package/packages/runtime/src/projection/index.ts +1 -0
  298. package/packages/runtime/src/projection/projection-engine.ts +249 -0
  299. package/packages/runtime/src/reducers/debug-reducer.ts +36 -0
  300. package/packages/runtime/src/reducers/index.ts +2 -0
  301. package/packages/runtime/src/reducers/run-state-reducer.ts +269 -0
  302. package/packages/runtime/src/scheduler/agent-registry.ts +132 -0
  303. package/packages/runtime/src/scheduler/agent-roles.ts +109 -0
  304. package/packages/runtime/src/scheduler/index.ts +4 -0
  305. package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +333 -0
  306. package/packages/runtime/src/scheduler/run-journal.ts +62 -0
  307. package/packages/runtime/src/scheduler/scheduler.ts +441 -0
  308. package/packages/runtime/src/verification/index.ts +2 -0
  309. package/packages/runtime/src/verification/verification-compiler.ts +225 -0
  310. package/packages/runtime/src/verification/verification-manifest.ts +192 -0
  311. package/packages/runtime/src/workspace/index.ts +5 -0
  312. package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +121 -0
  313. package/packages/runtime/src/workspace/strategies/git-worktree.ts +77 -0
  314. package/packages/runtime/src/workspace/strategies/inplace.ts +35 -0
  315. package/packages/runtime/src/workspace/workspace-manager.ts +15 -0
  316. package/packages/runtime/tsconfig.json +17 -0
  317. package/vscode-extension/oxe-agents-0.9.2.vsix +0 -0
  318. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  319. package/vscode-extension/package.json +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oxe-cc",
3
- "version": "0.9.3",
3
+ "version": "1.2.1",
4
4
  "description": "OXE — spec-driven workflows in .oxe/; integrates with Cursor, GitHub Copilot, Claude, OpenCode, Gemini, Codex, Windsurf, Antigravity (npx)",
5
5
  "license": "GPL-3.0",
6
6
  "author": "",
@@ -49,14 +49,20 @@
49
49
  ".github",
50
50
  "commands",
51
51
  "vscode-extension",
52
+ "packages/runtime/src",
53
+ "packages/runtime/package.json",
54
+ "packages/runtime/tsconfig.json",
52
55
  "AGENTS.md",
53
56
  "README.md",
54
57
  "CHANGELOG.md"
55
58
  ],
56
59
  "scripts": {
60
+ "build:runtime": "cd packages/runtime && npm run build",
57
61
  "sync:runtime-metadata": "node scripts/sync-runtime-metadata.cjs",
58
62
  "sync:cursor": "node scripts/sync-cursor-from-prompts.cjs",
59
- "test": "node --test tests/install.test.cjs tests/oxe-project-health.test.cjs tests/oxe-dashboard.test.cjs tests/oxe-operational.test.cjs tests/oxe-azure.test.cjs tests/oxe-sdk.test.cjs tests/oxe-manifest.test.cjs tests/oxe-agent-install.test.cjs tests/oxe-install-resolve-full.test.cjs tests/oxe-health-extended.test.cjs tests/oxe-workflows-edge.test.cjs tests/oxe-sdk-edge.test.cjs tests/oxe-cli-edge.test.cjs tests/oxe-npm-version.test.cjs tests/oxe-scripts.test.cjs tests/oxe-retro-health.test.cjs tests/oxe-security-permissions.test.cjs tests/oxe-runtime-semantics.test.cjs",
63
+ "test:root": "node --test tests/install.test.cjs tests/oxe-project-health.test.cjs tests/oxe-dashboard.test.cjs tests/oxe-operational.test.cjs tests/oxe-azure.test.cjs tests/oxe-sdk.test.cjs tests/oxe-manifest.test.cjs tests/oxe-agent-install.test.cjs tests/oxe-install-resolve-full.test.cjs tests/oxe-health-extended.test.cjs tests/oxe-workflows-edge.test.cjs tests/oxe-sdk-edge.test.cjs tests/oxe-cli-edge.test.cjs tests/oxe-npm-version.test.cjs tests/oxe-scripts.test.cjs tests/oxe-retro-health.test.cjs tests/oxe-security-permissions.test.cjs tests/oxe-runtime-semantics.test.cjs",
64
+ "test:runtime": "cd packages/runtime && npm test",
65
+ "test": "npm run build:runtime && npm run test:root && npm run test:runtime",
60
66
  "test:coverage": "c8 --check-coverage --lines 82 --functions 85 --branches 58 --statements 82 npm test",
61
67
  "scan:assets": "node scripts/oxe-assets-scan.cjs",
62
68
  "build:vscode-ext": "cd vscode-extension && npx @vscode/vsce package --no-yarn --allow-missing-repository",
@@ -83,4 +89,4 @@
83
89
  "dependencies": {
84
90
  "semver": "^7.7.4"
85
91
  }
86
- }
92
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@oxe/runtime",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "description": "OXE agentic execution engine — Runtime Foundation (R1)",
6
+ "main": "../../lib/runtime/index.js",
7
+ "types": "../../lib/runtime/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "test": "tsc --project tsconfig.test.json && node --test dist-tests/tests/*.test.js",
11
+ "clean": "node -e \"const fs=require('fs');['../../lib/runtime','dist-tests'].forEach(d=>{try{fs.rmSync(d,{recursive:true})}catch{}});\""
12
+ },
13
+ "devDependencies": {
14
+ "@types/node": "^25.6.0",
15
+ "typescript": "^5.4.5"
16
+ }
17
+ }
@@ -0,0 +1,243 @@
1
+ import crypto from 'crypto';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+
5
+ // ─── RemoteAuditSink ─────────────────────────────────────────────────────────
6
+
7
+ export interface AuditQueryFilter {
8
+ action?: AuditAction;
9
+ severity?: AuditSeverity;
10
+ runId?: string;
11
+ since?: string;
12
+ }
13
+
14
+ export interface RemoteAuditSink {
15
+ write(entry: AuditEntry): Promise<void>;
16
+ query(filter: AuditQueryFilter): Promise<AuditEntry[]>;
17
+ }
18
+
19
+ // ─── AuditMetrics ────────────────────────────────────────────────────────────
20
+
21
+ export interface AuditMetrics {
22
+ total_entries: number;
23
+ critical_count: number;
24
+ warn_count: number;
25
+ by_action: Partial<Record<AuditAction, number>>;
26
+ actors: string[];
27
+ oldest: string | null;
28
+ newest: string | null;
29
+ }
30
+
31
+ export type AuditAction =
32
+ | 'run_started'
33
+ | 'run_completed'
34
+ | 'run_paused'
35
+ | 'run_recovered'
36
+ | 'gate_requested'
37
+ | 'gate_resolved'
38
+ | 'policy_denied'
39
+ | 'plugin_registered'
40
+ | 'plugin_invoked'
41
+ | 'secret_accessed'
42
+ | 'infra_mutation'
43
+ | 'pr_created'
44
+ | 'merge_approved'
45
+ | 'merge_blocked';
46
+
47
+ export type AuditSeverity = 'info' | 'warn' | 'critical';
48
+
49
+ export interface AuditEntry {
50
+ audit_id: string;
51
+ action: AuditAction;
52
+ severity: AuditSeverity;
53
+ run_id: string | null;
54
+ work_item_id: string | null;
55
+ actor: string;
56
+ resource: string | null;
57
+ detail: Record<string, unknown>;
58
+ timestamp: string;
59
+ }
60
+
61
+ export interface RunQuota {
62
+ run_id: string;
63
+ max_work_items: number;
64
+ max_mutations: number;
65
+ max_retries_total: number;
66
+ consumed_work_items: number;
67
+ consumed_mutations: number;
68
+ consumed_retries: number;
69
+ }
70
+
71
+ export interface QuotaViolation {
72
+ quota_type: 'work_items' | 'mutations' | 'retries';
73
+ limit: number;
74
+ consumed: number;
75
+ }
76
+
77
+ const ACTION_SEVERITY: Record<AuditAction, AuditSeverity> = {
78
+ run_started: 'info',
79
+ run_completed: 'info',
80
+ run_paused: 'info',
81
+ run_recovered: 'warn',
82
+ gate_requested: 'warn',
83
+ gate_resolved: 'info',
84
+ policy_denied: 'warn',
85
+ plugin_registered: 'info',
86
+ plugin_invoked: 'info',
87
+ secret_accessed: 'critical',
88
+ infra_mutation: 'critical',
89
+ pr_created: 'info',
90
+ merge_approved: 'warn',
91
+ merge_blocked: 'warn',
92
+ };
93
+
94
+ export class AuditTrail {
95
+ constructor(
96
+ private readonly projectRoot: string,
97
+ private readonly remoteSink?: RemoteAuditSink
98
+ ) {}
99
+
100
+ record(
101
+ action: AuditAction,
102
+ actor: string,
103
+ options: {
104
+ runId?: string;
105
+ workItemId?: string;
106
+ resource?: string;
107
+ detail?: Record<string, unknown>;
108
+ } = {}
109
+ ): AuditEntry {
110
+ const entry: AuditEntry = {
111
+ audit_id: `aud-${crypto.randomBytes(4).toString('hex')}`,
112
+ action,
113
+ severity: ACTION_SEVERITY[action],
114
+ run_id: options.runId ?? null,
115
+ work_item_id: options.workItemId ?? null,
116
+ actor,
117
+ resource: options.resource ?? null,
118
+ detail: options.detail ?? {},
119
+ timestamp: new Date().toISOString(),
120
+ };
121
+
122
+ this.append(entry);
123
+ return entry;
124
+ }
125
+
126
+ query(filter: {
127
+ action?: AuditAction;
128
+ severity?: AuditSeverity;
129
+ runId?: string;
130
+ since?: string;
131
+ } = {}): AuditEntry[] {
132
+ return this.load().filter((e) => {
133
+ if (filter.action && e.action !== filter.action) return false;
134
+ if (filter.severity && e.severity !== filter.severity) return false;
135
+ if (filter.runId && e.run_id !== filter.runId) return false;
136
+ if (filter.since && e.timestamp < filter.since) return false;
137
+ return true;
138
+ });
139
+ }
140
+
141
+ critical(): AuditEntry[] {
142
+ return this.query({ severity: 'critical' });
143
+ }
144
+
145
+ metrics(): AuditMetrics {
146
+ const entries = this.load();
147
+ const by_action: Partial<Record<AuditAction, number>> = {};
148
+ const actorSet = new Set<string>();
149
+ let oldest: string | null = null;
150
+ let newest: string | null = null;
151
+ let critical_count = 0;
152
+ let warn_count = 0;
153
+
154
+ for (const e of entries) {
155
+ by_action[e.action] = (by_action[e.action] ?? 0) + 1;
156
+ actorSet.add(e.actor);
157
+ if (e.severity === 'critical') critical_count++;
158
+ if (e.severity === 'warn') warn_count++;
159
+ if (!oldest || e.timestamp < oldest) oldest = e.timestamp;
160
+ if (!newest || e.timestamp > newest) newest = e.timestamp;
161
+ }
162
+
163
+ return {
164
+ total_entries: entries.length,
165
+ critical_count,
166
+ warn_count,
167
+ by_action,
168
+ actors: [...actorSet],
169
+ oldest,
170
+ newest,
171
+ };
172
+ }
173
+
174
+ private append(entry: AuditEntry): void {
175
+ const p = this.trailPath();
176
+ fs.mkdirSync(path.dirname(p), { recursive: true });
177
+ fs.appendFileSync(p, JSON.stringify(entry) + '\n', 'utf8');
178
+ // Fire-and-forget remote sink (failures are non-fatal)
179
+ if (this.remoteSink) {
180
+ this.remoteSink.write(entry).catch(() => {});
181
+ }
182
+ }
183
+
184
+ private load(): AuditEntry[] {
185
+ const p = this.trailPath();
186
+ if (!fs.existsSync(p)) return [];
187
+ try {
188
+ return fs
189
+ .readFileSync(p, 'utf8')
190
+ .split('\n')
191
+ .filter(Boolean)
192
+ .map((line) => JSON.parse(line) as AuditEntry);
193
+ } catch {
194
+ return [];
195
+ }
196
+ }
197
+
198
+ private trailPath(): string {
199
+ return path.join(this.projectRoot, '.oxe', 'AUDIT-TRAIL.ndjson');
200
+ }
201
+ }
202
+
203
+ // ─── RunQuota ─────────────────────────────────────────────────────────────────
204
+
205
+ export function createQuota(
206
+ runId: string,
207
+ limits: Partial<Omit<RunQuota, 'run_id' | 'consumed_work_items' | 'consumed_mutations' | 'consumed_retries'>> = {}
208
+ ): RunQuota {
209
+ return {
210
+ run_id: runId,
211
+ max_work_items: limits.max_work_items ?? Infinity,
212
+ max_mutations: limits.max_mutations ?? Infinity,
213
+ max_retries_total: limits.max_retries_total ?? Infinity,
214
+ consumed_work_items: 0,
215
+ consumed_mutations: 0,
216
+ consumed_retries: 0,
217
+ };
218
+ }
219
+
220
+ export function checkQuota(quota: RunQuota): QuotaViolation | null {
221
+ if (quota.consumed_work_items > quota.max_work_items) {
222
+ return { quota_type: 'work_items', limit: quota.max_work_items, consumed: quota.consumed_work_items };
223
+ }
224
+ if (quota.consumed_mutations > quota.max_mutations) {
225
+ return { quota_type: 'mutations', limit: quota.max_mutations, consumed: quota.consumed_mutations };
226
+ }
227
+ if (quota.consumed_retries > quota.max_retries_total) {
228
+ return { quota_type: 'retries', limit: quota.max_retries_total, consumed: quota.consumed_retries };
229
+ }
230
+ return null;
231
+ }
232
+
233
+ export function consumeQuota(
234
+ quota: RunQuota,
235
+ type: QuotaViolation['quota_type'],
236
+ amount = 1
237
+ ): RunQuota {
238
+ switch (type) {
239
+ case 'work_items': return { ...quota, consumed_work_items: quota.consumed_work_items + amount };
240
+ case 'mutations': return { ...quota, consumed_mutations: quota.consumed_mutations + amount };
241
+ case 'retries': return { ...quota, consumed_retries: quota.consumed_retries + amount };
242
+ }
243
+ }
@@ -0,0 +1,2 @@
1
+ export * from './audit-trail';
2
+ export * from './policy-pack';
@@ -0,0 +1,62 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+ import type { PolicyRule, EnvironmentGuardrail } from '../policy/policy-engine';
4
+ import { PolicyEngine } from '../policy/policy-engine';
5
+
6
+ export interface PolicyPack {
7
+ pack_id: string;
8
+ org_id: string;
9
+ name: string;
10
+ version: string;
11
+ policies: PolicyRule[];
12
+ guardrail: EnvironmentGuardrail;
13
+ created_at: string;
14
+ }
15
+
16
+ function packDir(projectRoot: string): string {
17
+ return path.join(projectRoot, '.oxe', 'policy-packs');
18
+ }
19
+
20
+ function packFilePath(projectRoot: string, packId: string): string {
21
+ return path.join(packDir(projectRoot), `${packId}.json`);
22
+ }
23
+
24
+ export function savePolicyPack(projectRoot: string, pack: PolicyPack): void {
25
+ const dir = packDir(projectRoot);
26
+ fs.mkdirSync(dir, { recursive: true });
27
+ fs.writeFileSync(packFilePath(projectRoot, pack.pack_id), JSON.stringify(pack, null, 2), 'utf8');
28
+ }
29
+
30
+ export function loadPolicyPack(projectRoot: string, packId: string): PolicyPack | null {
31
+ const p = packFilePath(projectRoot, packId);
32
+ if (!fs.existsSync(p)) return null;
33
+ try {
34
+ return JSON.parse(fs.readFileSync(p, 'utf8')) as PolicyPack;
35
+ } catch {
36
+ return null;
37
+ }
38
+ }
39
+
40
+ export function listPolicyPacks(projectRoot: string): PolicyPack[] {
41
+ const dir = packDir(projectRoot);
42
+ if (!fs.existsSync(dir)) return [];
43
+ return fs
44
+ .readdirSync(dir)
45
+ .filter((f) => f.endsWith('.json'))
46
+ .map((f) => {
47
+ try {
48
+ return JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8')) as PolicyPack;
49
+ } catch {
50
+ return null;
51
+ }
52
+ })
53
+ .filter((p): p is PolicyPack => p !== null);
54
+ }
55
+
56
+ export function applyPolicyPack(engine: PolicyEngine, pack: PolicyPack): PolicyEngine {
57
+ let result = engine.withGuardrail(pack.guardrail);
58
+ for (const rule of pack.policies) {
59
+ result = result.withRule(rule);
60
+ }
61
+ return result;
62
+ }
@@ -0,0 +1,245 @@
1
+ import crypto from 'crypto';
2
+ import type { WorkspaceStrategy } from '../models/workspace';
3
+
4
+ // Mirror of SDK ParsedTask / ParsedSpec / ParsedPlan interfaces
5
+ // (avoids a hard dependency on the CJS SDK from TypeScript source)
6
+ export interface ParsedTask {
7
+ id: string;
8
+ title: string;
9
+ wave: number | null;
10
+ dependsOn: string[];
11
+ files: string[];
12
+ verifyCommand: string | null;
13
+ aceite: string[];
14
+ done: boolean;
15
+ meta?: Record<string, unknown> | null;
16
+ }
17
+
18
+ export interface ParsedSpecCriterion {
19
+ id: string;
20
+ criterion: string;
21
+ howToVerify: string;
22
+ }
23
+
24
+ export interface ParsedSpec {
25
+ objective: string | null;
26
+ criteria: ParsedSpecCriterion[];
27
+ }
28
+
29
+ export interface ParsedPlan {
30
+ tasks: ParsedTask[];
31
+ waves: Record<number, string[]>;
32
+ totalTasks: number;
33
+ }
34
+
35
+ export interface Action {
36
+ type: 'read_code' | 'generate_patch' | 'run_tests' | 'run_lint' | 'collect_evidence' | 'custom';
37
+ command?: string;
38
+ targets?: string[];
39
+ }
40
+
41
+ export interface VerifyContract {
42
+ must_pass: string[];
43
+ acceptance_refs: string[];
44
+ command: string | null;
45
+ }
46
+
47
+ export interface NodePolicy {
48
+ requires_human_approval: boolean;
49
+ max_retries: number;
50
+ }
51
+
52
+ export interface GraphNode {
53
+ id: string;
54
+ title: string;
55
+ wave: number;
56
+ depends_on: string[];
57
+ workspace_strategy: WorkspaceStrategy;
58
+ mutation_scope: string[];
59
+ actions: Action[];
60
+ verify: VerifyContract;
61
+ policy: NodePolicy;
62
+ }
63
+
64
+ export interface GraphEdge {
65
+ from: string;
66
+ to: string;
67
+ type: 'dependency' | 'wave_sequence';
68
+ }
69
+
70
+ export interface Wave {
71
+ wave_number: number;
72
+ node_ids: string[];
73
+ }
74
+
75
+ export interface ExecutionGraphMetadata {
76
+ compiled_at: string;
77
+ plan_hash: string;
78
+ spec_hash: string;
79
+ node_count: number;
80
+ wave_count: number;
81
+ }
82
+
83
+ export interface ExecutionGraph {
84
+ nodes: Map<string, GraphNode>;
85
+ edges: GraphEdge[];
86
+ waves: Wave[];
87
+ metadata: ExecutionGraphMetadata;
88
+ }
89
+
90
+ export interface CompilerOptions {
91
+ default_workspace_strategy?: WorkspaceStrategy;
92
+ default_max_retries?: number;
93
+ require_approval_for_all?: boolean;
94
+ skip_done_tasks?: boolean;
95
+ }
96
+
97
+ export function compile(
98
+ plan: ParsedPlan,
99
+ spec: ParsedSpec,
100
+ options: CompilerOptions = {}
101
+ ): ExecutionGraph {
102
+ const {
103
+ default_workspace_strategy = 'git_worktree',
104
+ default_max_retries = 2,
105
+ require_approval_for_all = false,
106
+ skip_done_tasks = false,
107
+ } = options;
108
+
109
+ const nodes = new Map<string, GraphNode>();
110
+ const edges: GraphEdge[] = [];
111
+ const waveMap = new Map<number, string[]>();
112
+
113
+ for (const task of plan.tasks) {
114
+ if (skip_done_tasks && task.done) continue;
115
+
116
+ const waveNumber = task.wave ?? 1;
117
+ const node: GraphNode = {
118
+ id: task.id,
119
+ title: task.title,
120
+ wave: waveNumber,
121
+ depends_on: task.dependsOn,
122
+ workspace_strategy: default_workspace_strategy,
123
+ mutation_scope: task.files,
124
+ actions: buildActions(task),
125
+ verify: {
126
+ must_pass: task.verifyCommand ? ['tests'] : [],
127
+ acceptance_refs: task.aceite,
128
+ command: task.verifyCommand,
129
+ },
130
+ policy: {
131
+ requires_human_approval: require_approval_for_all,
132
+ max_retries: default_max_retries,
133
+ },
134
+ };
135
+
136
+ nodes.set(task.id, node);
137
+
138
+ for (const dep of task.dependsOn) {
139
+ edges.push({ from: dep, to: task.id, type: 'dependency' });
140
+ }
141
+
142
+ if (!waveMap.has(waveNumber)) waveMap.set(waveNumber, []);
143
+ waveMap.get(waveNumber)!.push(task.id);
144
+ }
145
+
146
+ const waves: Wave[] = Array.from(waveMap.entries())
147
+ .sort(([a], [b]) => a - b)
148
+ .map(([wave_number, node_ids]) => ({ wave_number, node_ids }));
149
+
150
+ return {
151
+ nodes,
152
+ edges,
153
+ waves,
154
+ metadata: {
155
+ compiled_at: new Date().toISOString(),
156
+ plan_hash: hashObject(plan),
157
+ spec_hash: hashObject(spec),
158
+ node_count: nodes.size,
159
+ wave_count: waves.length,
160
+ },
161
+ };
162
+ }
163
+
164
+ export function validateGraph(graph: ExecutionGraph): string[] {
165
+ const errors: string[] = [];
166
+ const nodeIds = new Set(graph.nodes.keys());
167
+
168
+ for (const [id, node] of graph.nodes) {
169
+ for (const dep of node.depends_on) {
170
+ if (!nodeIds.has(dep)) {
171
+ errors.push(`Node ${id} depends on unknown node ${dep}`);
172
+ }
173
+ }
174
+ }
175
+
176
+ // Detect cycles using DFS
177
+ const visited = new Set<string>();
178
+ const inStack = new Set<string>();
179
+
180
+ function hasCycle(nodeId: string): boolean {
181
+ if (inStack.has(nodeId)) return true;
182
+ if (visited.has(nodeId)) return false;
183
+ visited.add(nodeId);
184
+ inStack.add(nodeId);
185
+ const node = graph.nodes.get(nodeId);
186
+ if (node) {
187
+ for (const dep of node.depends_on) {
188
+ if (hasCycle(dep)) return true;
189
+ }
190
+ }
191
+ inStack.delete(nodeId);
192
+ return false;
193
+ }
194
+
195
+ for (const id of nodeIds) {
196
+ if (hasCycle(id)) {
197
+ errors.push(`Cycle detected involving node ${id}`);
198
+ break;
199
+ }
200
+ }
201
+
202
+ return errors;
203
+ }
204
+
205
+ export function toSerializable(graph: ExecutionGraph): Record<string, unknown> {
206
+ return {
207
+ nodes: Object.fromEntries(graph.nodes),
208
+ edges: graph.edges,
209
+ waves: graph.waves,
210
+ metadata: graph.metadata,
211
+ };
212
+ }
213
+
214
+ export function fromSerializable(raw: Record<string, unknown>): ExecutionGraph {
215
+ const nodes = new Map<string, GraphNode>(
216
+ Object.entries(raw.nodes as Record<string, GraphNode>)
217
+ );
218
+ return {
219
+ nodes,
220
+ edges: raw.edges as GraphEdge[],
221
+ waves: raw.waves as Wave[],
222
+ metadata: raw.metadata as ExecutionGraphMetadata,
223
+ };
224
+ }
225
+
226
+ function buildActions(task: ParsedTask): Action[] {
227
+ const actions: Action[] = [];
228
+ if (task.files.length > 0) {
229
+ actions.push({ type: 'read_code', targets: task.files });
230
+ }
231
+ actions.push({ type: 'generate_patch' });
232
+ if (task.verifyCommand) {
233
+ actions.push({ type: 'run_tests', command: task.verifyCommand });
234
+ }
235
+ actions.push({ type: 'collect_evidence' });
236
+ return actions;
237
+ }
238
+
239
+ function hashObject(obj: unknown): string {
240
+ return crypto
241
+ .createHash('sha256')
242
+ .update(JSON.stringify(obj))
243
+ .digest('hex')
244
+ .slice(0, 12);
245
+ }
@@ -0,0 +1 @@
1
+ export * from './graph-compiler';