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,24 +1,24 @@
1
- export type RunStatus =
2
- | 'planned'
3
- | 'running'
4
- | 'paused'
5
- | 'waiting_approval'
6
- | 'failed'
7
- | 'completed'
8
- | 'replaying'
9
- | 'aborted'
10
- | 'cancelled';
11
-
12
- export type RunMode = 'completo' | 'por_onda' | 'por_tarefa';
13
- export type RunInitiator = 'user' | 'scheduler' | 'retry' | 'replay';
14
-
15
- export interface Run {
16
- run_id: string;
17
- session_id: string | null;
18
- graph_version: string;
19
- started_at: string;
20
- ended_at: string | null;
21
- status: RunStatus;
22
- initiator: RunInitiator;
23
- mode: RunMode;
24
- }
1
+ export type RunStatus =
2
+ | 'planned'
3
+ | 'running'
4
+ | 'paused'
5
+ | 'waiting_approval'
6
+ | 'failed'
7
+ | 'completed'
8
+ | 'replaying'
9
+ | 'aborted'
10
+ | 'cancelled';
11
+
12
+ export type RunMode = 'completo' | 'por_onda' | 'por_tarefa';
13
+ export type RunInitiator = 'user' | 'scheduler' | 'retry' | 'replay';
14
+
15
+ export interface Run {
16
+ run_id: string;
17
+ session_id: string | null;
18
+ graph_version: string;
19
+ started_at: string;
20
+ ended_at: string | null;
21
+ status: RunStatus;
22
+ initiator: RunInitiator;
23
+ mode: RunMode;
24
+ }
@@ -1,11 +1,11 @@
1
- export type SessionStatus = 'active' | 'archived' | 'closed';
2
-
3
- export interface Session {
4
- session_id: string;
5
- title: string;
6
- created_at: string;
7
- status: SessionStatus;
8
- repo_root: string;
9
- baseline_commit: string | null;
10
- active_run_id: string | null;
11
- }
1
+ export type SessionStatus = 'active' | 'archived' | 'closed';
2
+
3
+ export interface Session {
4
+ session_id: string;
5
+ title: string;
6
+ created_at: string;
7
+ status: SessionStatus;
8
+ repo_root: string;
9
+ baseline_commit: string | null;
10
+ active_run_id: string | null;
11
+ }
@@ -1,10 +1,10 @@
1
- export type VerificationStatus = 'pass' | 'fail' | 'skip' | 'error';
2
-
3
- export interface VerificationResult {
4
- verification_id: string;
5
- work_item_id: string;
6
- check_id: string;
7
- status: VerificationStatus;
8
- evidence_refs: string[];
9
- summary: string | null;
10
- }
1
+ export type VerificationStatus = 'pass' | 'fail' | 'skip' | 'error';
2
+
3
+ export interface VerificationResult {
4
+ verification_id: string;
5
+ work_item_id: string;
6
+ check_id: string;
7
+ status: VerificationStatus;
8
+ evidence_refs: string[];
9
+ summary: string | null;
10
+ }
@@ -1,25 +1,25 @@
1
- import type { WorkspaceStrategy } from './workspace';
2
-
3
- export type WorkItemStatus =
4
- | 'pending'
5
- | 'ready'
6
- | 'running'
7
- | 'completed'
8
- | 'failed'
9
- | 'blocked'
10
- | 'skipped';
11
-
12
- export type WorkItemType = 'task' | 'checkpoint' | 'gate' | 'verification';
13
-
14
- export interface WorkItem {
15
- work_item_id: string;
16
- run_id: string;
17
- title: string;
18
- type: WorkItemType;
19
- depends_on: string[];
20
- mutation_scope: string[];
21
- policy_ref: string | null;
22
- verify_ref: string[];
23
- status: WorkItemStatus;
24
- workspace_strategy: WorkspaceStrategy;
25
- }
1
+ import type { WorkspaceStrategy } from './workspace';
2
+
3
+ export type WorkItemStatus =
4
+ | 'pending'
5
+ | 'ready'
6
+ | 'running'
7
+ | 'completed'
8
+ | 'failed'
9
+ | 'blocked'
10
+ | 'skipped';
11
+
12
+ export type WorkItemType = 'task' | 'checkpoint' | 'gate' | 'verification';
13
+
14
+ export interface WorkItem {
15
+ work_item_id: string;
16
+ run_id: string;
17
+ title: string;
18
+ type: WorkItemType;
19
+ depends_on: string[];
20
+ mutation_scope: string[];
21
+ policy_ref: string | null;
22
+ verify_ref: string[];
23
+ status: WorkItemStatus;
24
+ workspace_strategy: WorkspaceStrategy;
25
+ }
@@ -1,28 +1,31 @@
1
- export type WorkspaceStrategy = 'inplace' | 'git_worktree' | 'ephemeral_container';
2
- export type WorkspaceStatus = 'allocating' | 'ready' | 'dirty' | 'disposed' | 'error';
3
-
4
- export interface Workspace {
5
- workspace_id: string;
6
- strategy: WorkspaceStrategy;
7
- base_commit: string | null;
8
- branch: string | null;
9
- container_ref: string | null;
10
- status: WorkspaceStatus;
11
- root_path: string;
12
- }
13
-
14
- export interface WorkspaceLease {
15
- workspace_id: string;
16
- strategy: WorkspaceStrategy;
17
- branch: string | null;
18
- base_commit: string | null;
19
- root_path: string;
20
- ttl_minutes: number;
21
- }
22
-
23
- export interface SnapshotRef {
24
- snapshot_id: string;
25
- workspace_id: string;
26
- commit: string;
27
- created_at: string;
28
- }
1
+ export type WorkspaceStrategy = 'inplace' | 'git_worktree' | 'ephemeral_container';
2
+ export type WorkspaceStatus = 'allocating' | 'ready' | 'dirty' | 'disposed' | 'error';
3
+ export type WorkspaceIsolationLevel = 'shared' | 'isolated';
4
+
5
+ export interface Workspace {
6
+ workspace_id: string;
7
+ strategy: WorkspaceStrategy;
8
+ isolation_level: WorkspaceIsolationLevel;
9
+ base_commit: string | null;
10
+ branch: string | null;
11
+ container_ref: string | null;
12
+ status: WorkspaceStatus;
13
+ root_path: string;
14
+ }
15
+
16
+ export interface WorkspaceLease {
17
+ workspace_id: string;
18
+ strategy: WorkspaceStrategy;
19
+ isolation_level: WorkspaceIsolationLevel;
20
+ branch: string | null;
21
+ base_commit: string | null;
22
+ root_path: string;
23
+ ttl_minutes: number;
24
+ }
25
+
26
+ export interface SnapshotRef {
27
+ snapshot_id: string;
28
+ workspace_id: string;
29
+ commit: string;
30
+ created_at: string;
31
+ }
@@ -0,0 +1,206 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { spawnSync } from 'child_process';
4
+ import type {
5
+ OxePlugin,
6
+ ToolProvider,
7
+ ToolInvocationInput,
8
+ ToolInvocationResult,
9
+ VerifierProvider,
10
+ VerificationInput,
11
+ } from './plugin-abi';
12
+ import type { VerificationResult } from '../models/verification-result';
13
+ import { CURRENT_ABI_VERSION } from './plugin-manifest';
14
+
15
+ interface CapabilityManifest {
16
+ id: string;
17
+ entrypoint: string | null;
18
+ sideEffects: string[];
19
+ evidenceOutputs: string[];
20
+ checkTypes: string[];
21
+ dir: string;
22
+ }
23
+
24
+ function parseFrontmatter(text: string): Record<string, string> {
25
+ const match = String(text || '').match(/^---\r?\n([\s\S]*?)\r?\n---/);
26
+ if (!match) return {};
27
+ const out: Record<string, string> = {};
28
+ for (const line of match[1].split(/\r?\n/)) {
29
+ const trimmed = line.trim();
30
+ if (!trimmed || trimmed.startsWith('#')) continue;
31
+ const idx = trimmed.indexOf(':');
32
+ if (idx === -1) continue;
33
+ out[trimmed.slice(0, idx).trim()] = trimmed.slice(idx + 1).trim();
34
+ }
35
+ return out;
36
+ }
37
+
38
+ function parseArrayField(value: string | undefined): string[] {
39
+ const raw = String(value || '').trim();
40
+ if (!raw || raw === '[]') return [];
41
+ if (/^\[.*\]$/.test(raw)) {
42
+ return raw
43
+ .slice(1, -1)
44
+ .split(',')
45
+ .map((item) => item.trim().replace(/^['"`]|['"`]$/g, ''))
46
+ .filter(Boolean);
47
+ }
48
+ return raw.split(',').map((item) => item.trim()).filter(Boolean);
49
+ }
50
+
51
+ function loadCapabilityManifests(projectRoot: string): CapabilityManifest[] {
52
+ const capabilitiesDir = path.join(projectRoot, '.oxe', 'capabilities');
53
+ if (!fs.existsSync(capabilitiesDir)) return [];
54
+ return fs
55
+ .readdirSync(capabilitiesDir, { withFileTypes: true })
56
+ .filter((entry) => entry.isDirectory())
57
+ .map((entry) => {
58
+ const dir = path.join(capabilitiesDir, entry.name);
59
+ const manifestPath = path.join(dir, 'CAPABILITY.md');
60
+ if (!fs.existsSync(manifestPath)) return null;
61
+ const raw = fs.readFileSync(manifestPath, 'utf8');
62
+ const fm = parseFrontmatter(raw);
63
+ const id = String(fm.id || '').trim();
64
+ if (!id) return null;
65
+ return {
66
+ id,
67
+ entrypoint: String(fm.entrypoint || '').trim() || null,
68
+ sideEffects: parseArrayField(fm.side_effects),
69
+ evidenceOutputs: parseArrayField(fm.evidence_outputs),
70
+ checkTypes: parseArrayField(fm.check_types || fm.supports_checks),
71
+ dir,
72
+ };
73
+ })
74
+ .filter((item): item is CapabilityManifest => Boolean(item));
75
+ }
76
+
77
+ function resolveEntrypoint(projectRoot: string, manifest: CapabilityManifest): string | null {
78
+ if (!manifest.entrypoint) return null;
79
+ if (path.isAbsolute(manifest.entrypoint)) return manifest.entrypoint;
80
+ const capabilityRelative = path.join(manifest.dir, manifest.entrypoint);
81
+ if (fs.existsSync(capabilityRelative)) return capabilityRelative;
82
+ const projectRelative = path.join(projectRoot, manifest.entrypoint);
83
+ if (fs.existsSync(projectRelative)) return projectRelative;
84
+ return capabilityRelative;
85
+ }
86
+
87
+ function resolveEvidencePaths(projectRoot: string, manifest: CapabilityManifest): string[] {
88
+ return manifest.evidenceOutputs
89
+ .map((entry) => {
90
+ const capabilityRelative = path.join(manifest.dir, entry);
91
+ if (fs.existsSync(capabilityRelative)) return path.relative(projectRoot, capabilityRelative);
92
+ const projectRelative = path.join(projectRoot, entry);
93
+ if (fs.existsSync(projectRelative)) return path.relative(projectRoot, projectRelative);
94
+ return path.relative(projectRoot, projectRelative);
95
+ })
96
+ .map((entry) => entry.replace(/\\/g, '/'));
97
+ }
98
+
99
+ function inferToolKind(sideEffects: string[]): ToolProvider['kind'] {
100
+ if (sideEffects.some((effect) => /db|infra|network|external/i.test(effect))) return 'external_operation';
101
+ if (sideEffects.some((effect) => /write|mutat|git/i.test(effect))) return 'mutation';
102
+ if (sideEffects.some((effect) => /verify|test|evidence/i.test(effect))) return 'verification';
103
+ if (sideEffects.some((effect) => /analysis|scan|read/i.test(effect))) return 'analysis';
104
+ return 'read';
105
+ }
106
+
107
+ function buildToolProvider(projectRoot: string, manifest: CapabilityManifest): ToolProvider {
108
+ return {
109
+ name: manifest.id,
110
+ kind: inferToolKind(manifest.sideEffects),
111
+ idempotent: !manifest.sideEffects.some((effect) => /write|mutat|git|db|infra/i.test(effect)),
112
+ supports(actionType: string): boolean {
113
+ return actionType === manifest.id || actionType === `capability:${manifest.id}`;
114
+ },
115
+ async invoke(input: ToolInvocationInput): Promise<ToolInvocationResult> {
116
+ const entrypoint = resolveEntrypoint(projectRoot, manifest);
117
+ if (!entrypoint) {
118
+ return {
119
+ success: false,
120
+ output: '',
121
+ evidence_paths: [],
122
+ side_effects_applied: [],
123
+ error: `Capability ${manifest.id} does not declare an entrypoint`,
124
+ };
125
+ }
126
+ const ext = path.extname(entrypoint).toLowerCase();
127
+ const env = {
128
+ ...process.env,
129
+ OXE_CAPABILITY_INPUT: JSON.stringify(input.params || {}),
130
+ OXE_CAPABILITY_RUN_ID: input.run_id,
131
+ OXE_CAPABILITY_WORK_ITEM_ID: input.work_item_id,
132
+ OXE_CAPABILITY_ATTEMPT_ID: input.attempt_id,
133
+ OXE_CAPABILITY_WORKSPACE_ROOT: input.workspace_root,
134
+ };
135
+ let program = entrypoint;
136
+ let args: string[] = [];
137
+ if (ext === '.js' || ext === '.cjs' || ext === '.mjs') {
138
+ program = process.execPath;
139
+ args = [entrypoint];
140
+ } else if (ext === '.ps1') {
141
+ program = 'powershell';
142
+ args = ['-File', entrypoint];
143
+ }
144
+ const result = spawnSync(program, args, {
145
+ cwd: projectRoot,
146
+ encoding: 'utf8',
147
+ env,
148
+ });
149
+ return {
150
+ success: result.status === 0 && !result.error,
151
+ output: [result.stdout || '', result.stderr || ''].filter(Boolean).join('\n').trim(),
152
+ evidence_paths: resolveEvidencePaths(projectRoot, manifest),
153
+ side_effects_applied: manifest.sideEffects,
154
+ error: result.error ? String(result.error) : result.status === 0 ? undefined : (result.stderr || result.stdout || `Capability exited with status ${result.status}`),
155
+ };
156
+ },
157
+ };
158
+ }
159
+
160
+ function buildVerifierProvider(projectRoot: string, manifest: CapabilityManifest): VerifierProvider | null {
161
+ if (!manifest.checkTypes.length) return null;
162
+ return {
163
+ name: `${manifest.id}-verifier`,
164
+ supports(checkType: string): boolean {
165
+ return manifest.checkTypes.includes(checkType);
166
+ },
167
+ async execute(input: VerificationInput): Promise<VerificationResult> {
168
+ const tool = await buildToolProvider(projectRoot, manifest).invoke({
169
+ action_type: `verify:${input.check_type}`,
170
+ work_item_id: input.work_item_id,
171
+ run_id: input.work_item_id,
172
+ attempt_id: `${input.work_item_id}-verify`,
173
+ params: {
174
+ check_id: input.check_id,
175
+ check_type: input.check_type,
176
+ command: input.command,
177
+ evidence_dir: input.evidence_dir,
178
+ },
179
+ workspace_root: input.workspace_root,
180
+ });
181
+ return {
182
+ verification_id: `vr-${manifest.id}-${input.check_id}`,
183
+ work_item_id: input.work_item_id,
184
+ check_id: input.check_id,
185
+ status: tool.success ? 'pass' : 'fail',
186
+ evidence_refs: tool.evidence_paths,
187
+ summary: tool.error || tool.output || null,
188
+ };
189
+ },
190
+ };
191
+ }
192
+
193
+ export function createCapabilityPlugin(projectRoot: string, manifest: CapabilityManifest): OxePlugin {
194
+ const verifierProvider = buildVerifierProvider(projectRoot, manifest);
195
+ return {
196
+ name: `capability:${manifest.id}`,
197
+ version: '0.0.0',
198
+ abi_version: CURRENT_ABI_VERSION,
199
+ toolProviders: [buildToolProvider(projectRoot, manifest)],
200
+ verifierProviders: verifierProvider ? [verifierProvider] : [],
201
+ };
202
+ }
203
+
204
+ export function loadCapabilityPlugins(projectRoot: string): OxePlugin[] {
205
+ return loadCapabilityManifests(projectRoot).map((manifest) => createCapabilityPlugin(projectRoot, manifest));
206
+ }
@@ -1,83 +1,126 @@
1
- import type { PluginRegistry } from './plugin-registry';
2
- import { CURRENT_ABI_VERSION } from './plugin-manifest';
3
-
4
- export type ApiStability = 'stable' | 'experimental' | 'deprecated';
5
-
6
- export interface ProviderCapabilityEntry {
7
- name: string;
8
- provider_type: 'tool' | 'workspace' | 'verifier' | 'context';
9
- stability: ApiStability;
10
- since_abi_version: string;
11
- deprecated_in?: string;
12
- replacement?: string;
13
- }
14
-
15
- export interface CapabilityMatrix {
16
- abi_version: string;
17
- entries: ProviderCapabilityEntry[];
18
- }
19
-
20
- export function buildMatrix(registry: PluginRegistry): CapabilityMatrix {
21
- const entries: ProviderCapabilityEntry[] = [];
22
-
23
- for (const plugin of registry.list()) {
24
- const providers = plugin.providers ?? [];
25
-
26
- for (const prov of providers) {
27
- let provider_type: ProviderCapabilityEntry['provider_type'];
28
- if (prov.startsWith('tool:')) provider_type = 'tool';
29
- else if (prov.startsWith('workspace:')) provider_type = 'workspace';
30
- else if (prov.startsWith('verifier:')) provider_type = 'verifier';
31
- else if (prov.startsWith('context:')) provider_type = 'context';
32
- else continue;
33
-
34
- const name = prov.slice(prov.indexOf(':') + 1);
35
- entries.push({
36
- name,
37
- provider_type,
38
- stability: 'stable',
39
- since_abi_version: CURRENT_ABI_VERSION,
40
- });
41
- }
42
- }
43
-
44
- return { abi_version: CURRENT_ABI_VERSION, entries };
45
- }
46
-
47
- export function getStableEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[] {
48
- return matrix.entries.filter((e) => e.stability === 'stable');
49
- }
50
-
51
- export function getExperimentalEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[] {
52
- return matrix.entries.filter((e) => e.stability === 'experimental');
53
- }
54
-
55
- export function getDeprecatedEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[] {
56
- return matrix.entries.filter((e) => e.stability === 'deprecated');
57
- }
58
-
59
- export function markDeprecated(
60
- matrix: CapabilityMatrix,
61
- name: string,
62
- deprecatedIn: string,
63
- replacement?: string
64
- ): CapabilityMatrix {
65
- return {
66
- ...matrix,
67
- entries: matrix.entries.map((e) =>
68
- e.name === name
69
- ? { ...e, stability: 'deprecated', deprecated_in: deprecatedIn, replacement }
70
- : e
71
- ),
72
- };
73
- }
74
-
75
- export function addEntry(
76
- matrix: CapabilityMatrix,
77
- entry: ProviderCapabilityEntry
78
- ): CapabilityMatrix {
79
- if (matrix.entries.some((e) => e.name === entry.name && e.provider_type === entry.provider_type)) {
80
- return matrix;
81
- }
82
- return { ...matrix, entries: [...matrix.entries, entry] };
83
- }
1
+ import type { PluginRegistry } from './plugin-registry';
2
+ import { CURRENT_ABI_VERSION } from './plugin-manifest';
3
+
4
+ export type ApiStability = 'stable' | 'experimental' | 'deprecated';
5
+
6
+ export interface ProviderCapabilityEntry {
7
+ plugin: string;
8
+ name: string;
9
+ capability: string;
10
+ provider_type: 'tool' | 'workspace' | 'verifier' | 'context';
11
+ stability: ApiStability;
12
+ abi_version: string;
13
+ since_abi_version: string;
14
+ supported: string[];
15
+ fallback_available: boolean;
16
+ deprecated_in?: string;
17
+ replacement?: string;
18
+ }
19
+
20
+ export interface CapabilityMatrix {
21
+ abi_version: string;
22
+ entries: ProviderCapabilityEntry[];
23
+ }
24
+
25
+ export function buildMatrix(registry: PluginRegistry): CapabilityMatrix {
26
+ const entries: ProviderCapabilityEntry[] = [];
27
+
28
+ for (const plugin of registry.snapshot()) {
29
+ for (const provider of plugin.toolProviders) {
30
+ entries.push({
31
+ plugin: plugin.name,
32
+ name: provider.name,
33
+ capability: provider.name,
34
+ provider_type: 'tool',
35
+ stability: 'stable',
36
+ abi_version: plugin.abi_version ?? CURRENT_ABI_VERSION,
37
+ since_abi_version: CURRENT_ABI_VERSION,
38
+ supported: ['read_code', 'generate_patch', 'run_tests', 'collect_evidence', 'custom'].filter((action) =>
39
+ registry.toolProviderFor(action)?.name === provider.name
40
+ ),
41
+ fallback_available: true,
42
+ });
43
+ }
44
+ for (const provider of plugin.workspaceProviders) {
45
+ entries.push({
46
+ plugin: plugin.name,
47
+ name: provider.name,
48
+ capability: provider.name,
49
+ provider_type: 'workspace',
50
+ stability: 'stable',
51
+ abi_version: plugin.abi_version ?? CURRENT_ABI_VERSION,
52
+ since_abi_version: CURRENT_ABI_VERSION,
53
+ supported: [provider.name],
54
+ fallback_available: true,
55
+ });
56
+ }
57
+ for (const provider of plugin.verifierProviders) {
58
+ entries.push({
59
+ plugin: plugin.name,
60
+ name: provider.name,
61
+ capability: provider.name,
62
+ provider_type: 'verifier',
63
+ stability: 'stable',
64
+ abi_version: plugin.abi_version ?? CURRENT_ABI_VERSION,
65
+ since_abi_version: CURRENT_ABI_VERSION,
66
+ supported: ['unit', 'integration', 'smoke', 'policy', 'security', 'custom'].filter((checkType) =>
67
+ registry.verifierProviderFor(checkType)?.name === provider.name
68
+ ),
69
+ fallback_available: true,
70
+ });
71
+ }
72
+ for (const provider of plugin.contextProviders) {
73
+ entries.push({
74
+ plugin: plugin.name,
75
+ name: provider.name,
76
+ capability: provider.name,
77
+ provider_type: 'context',
78
+ stability: 'stable',
79
+ abi_version: plugin.abi_version ?? CURRENT_ABI_VERSION,
80
+ since_abi_version: CURRENT_ABI_VERSION,
81
+ supported: [provider.name],
82
+ fallback_available: false,
83
+ });
84
+ }
85
+ }
86
+
87
+ return { abi_version: CURRENT_ABI_VERSION, entries };
88
+ }
89
+
90
+ export function getStableEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[] {
91
+ return matrix.entries.filter((e) => e.stability === 'stable');
92
+ }
93
+
94
+ export function getExperimentalEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[] {
95
+ return matrix.entries.filter((e) => e.stability === 'experimental');
96
+ }
97
+
98
+ export function getDeprecatedEntries(matrix: CapabilityMatrix): ProviderCapabilityEntry[] {
99
+ return matrix.entries.filter((e) => e.stability === 'deprecated');
100
+ }
101
+
102
+ export function markDeprecated(
103
+ matrix: CapabilityMatrix,
104
+ name: string,
105
+ deprecatedIn: string,
106
+ replacement?: string
107
+ ): CapabilityMatrix {
108
+ return {
109
+ ...matrix,
110
+ entries: matrix.entries.map((e) =>
111
+ e.name === name
112
+ ? { ...e, stability: 'deprecated', deprecated_in: deprecatedIn, replacement }
113
+ : e
114
+ ),
115
+ };
116
+ }
117
+
118
+ export function addEntry(
119
+ matrix: CapabilityMatrix,
120
+ entry: ProviderCapabilityEntry
121
+ ): CapabilityMatrix {
122
+ if (matrix.entries.some((e) => e.name === entry.name && e.provider_type === entry.provider_type)) {
123
+ return matrix;
124
+ }
125
+ return { ...matrix, entries: [...matrix.entries, entry] };
126
+ }
@@ -1,4 +1,5 @@
1
- export * from './plugin-abi';
2
- export * from './plugin-registry';
3
- export * from './plugin-manifest';
4
- export * from './capability-matrix';
1
+ export * from './plugin-abi';
2
+ export * from './plugin-registry';
3
+ export * from './plugin-manifest';
4
+ export * from './capability-matrix';
5
+ export * from './capability-adapter';