oxe-cc 0.9.3 → 1.0.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 (151) hide show
  1. package/README.md +1 -1
  2. package/bin/banner.txt +1 -1
  3. package/bin/lib/oxe-dashboard.cjs +9 -7
  4. package/bin/lib/oxe-operational.cjs +569 -4
  5. package/bin/oxe-cc.js +141 -57
  6. package/lib/runtime/compiler/graph-compiler.d.ts +83 -0
  7. package/lib/runtime/compiler/graph-compiler.js +135 -0
  8. package/lib/runtime/compiler/index.d.ts +1 -0
  9. package/lib/runtime/compiler/index.js +17 -0
  10. package/lib/runtime/context/context-pack-builder.d.ts +36 -0
  11. package/lib/runtime/context/context-pack-builder.js +136 -0
  12. package/lib/runtime/context/index.d.ts +1 -0
  13. package/lib/runtime/context/index.js +17 -0
  14. package/lib/runtime/delivery/branch-manager.d.ts +19 -0
  15. package/lib/runtime/delivery/branch-manager.js +78 -0
  16. package/lib/runtime/delivery/ci-checks.d.ts +34 -0
  17. package/lib/runtime/delivery/ci-checks.js +209 -0
  18. package/lib/runtime/delivery/index.d.ts +3 -0
  19. package/lib/runtime/delivery/index.js +19 -0
  20. package/lib/runtime/delivery/pr-manager.d.ts +30 -0
  21. package/lib/runtime/delivery/pr-manager.js +82 -0
  22. package/lib/runtime/events/bus.d.ts +9 -0
  23. package/lib/runtime/events/bus.js +63 -0
  24. package/lib/runtime/events/catalog.d.ts +3 -0
  25. package/lib/runtime/events/catalog.js +30 -0
  26. package/lib/runtime/events/envelope.d.ts +13 -0
  27. package/lib/runtime/events/envelope.js +2 -0
  28. package/lib/runtime/events/index.d.ts +3 -0
  29. package/lib/runtime/events/index.js +19 -0
  30. package/lib/runtime/evidence/evidence-store.d.ts +22 -0
  31. package/lib/runtime/evidence/evidence-store.js +106 -0
  32. package/lib/runtime/evidence/index.d.ts +1 -0
  33. package/lib/runtime/evidence/index.js +17 -0
  34. package/lib/runtime/gate/gate-manager.d.ts +39 -0
  35. package/lib/runtime/gate/gate-manager.js +104 -0
  36. package/lib/runtime/gate/index.d.ts +1 -0
  37. package/lib/runtime/gate/index.js +17 -0
  38. package/lib/runtime/index.d.ts +16 -0
  39. package/lib/runtime/index.js +40 -0
  40. package/lib/runtime/models/attempt.d.ts +12 -0
  41. package/lib/runtime/models/attempt.js +2 -0
  42. package/lib/runtime/models/evidence.d.ts +9 -0
  43. package/lib/runtime/models/evidence.js +2 -0
  44. package/lib/runtime/models/gate-decision.d.ts +10 -0
  45. package/lib/runtime/models/gate-decision.js +2 -0
  46. package/lib/runtime/models/index.d.ts +8 -0
  47. package/lib/runtime/models/index.js +24 -0
  48. package/lib/runtime/models/run.d.ts +13 -0
  49. package/lib/runtime/models/run.js +2 -0
  50. package/lib/runtime/models/session.d.ts +10 -0
  51. package/lib/runtime/models/session.js +2 -0
  52. package/lib/runtime/models/verification-result.d.ts +9 -0
  53. package/lib/runtime/models/verification-result.js +2 -0
  54. package/lib/runtime/models/work-item.d.ts +15 -0
  55. package/lib/runtime/models/work-item.js +2 -0
  56. package/lib/runtime/models/workspace.d.ts +25 -0
  57. package/lib/runtime/models/workspace.js +2 -0
  58. package/lib/runtime/plugins/index.d.ts +2 -0
  59. package/lib/runtime/plugins/index.js +18 -0
  60. package/lib/runtime/plugins/plugin-abi.d.ts +76 -0
  61. package/lib/runtime/plugins/plugin-abi.js +2 -0
  62. package/lib/runtime/plugins/plugin-registry.d.ts +21 -0
  63. package/lib/runtime/plugins/plugin-registry.js +114 -0
  64. package/lib/runtime/policy/index.d.ts +1 -0
  65. package/lib/runtime/policy/index.js +17 -0
  66. package/lib/runtime/policy/policy-engine.d.ts +40 -0
  67. package/lib/runtime/policy/policy-engine.js +80 -0
  68. package/lib/runtime/projection/index.d.ts +1 -0
  69. package/lib/runtime/projection/index.js +17 -0
  70. package/lib/runtime/projection/projection-engine.d.ts +11 -0
  71. package/lib/runtime/projection/projection-engine.js +218 -0
  72. package/lib/runtime/reducers/debug-reducer.d.ts +10 -0
  73. package/lib/runtime/reducers/debug-reducer.js +30 -0
  74. package/lib/runtime/reducers/index.d.ts +2 -0
  75. package/lib/runtime/reducers/index.js +18 -0
  76. package/lib/runtime/reducers/run-state-reducer.d.ts +20 -0
  77. package/lib/runtime/reducers/run-state-reducer.js +110 -0
  78. package/lib/runtime/scheduler/index.d.ts +1 -0
  79. package/lib/runtime/scheduler/index.js +17 -0
  80. package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +34 -0
  81. package/lib/runtime/scheduler/multi-agent-coordinator.js +166 -0
  82. package/lib/runtime/scheduler/scheduler.d.ts +39 -0
  83. package/lib/runtime/scheduler/scheduler.js +196 -0
  84. package/lib/runtime/verification/index.d.ts +1 -0
  85. package/lib/runtime/verification/index.js +17 -0
  86. package/lib/runtime/verification/verification-compiler.d.ts +56 -0
  87. package/lib/runtime/verification/verification-compiler.js +147 -0
  88. package/lib/runtime/workspace/index.d.ts +5 -0
  89. package/lib/runtime/workspace/index.js +24 -0
  90. package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +22 -0
  91. package/lib/runtime/workspace/strategies/ephemeral-container.js +109 -0
  92. package/lib/runtime/workspace/strategies/git-worktree.d.ts +12 -0
  93. package/lib/runtime/workspace/strategies/git-worktree.js +79 -0
  94. package/lib/runtime/workspace/strategies/inplace.d.ts +10 -0
  95. package/lib/runtime/workspace/strategies/inplace.js +37 -0
  96. package/lib/runtime/workspace/workspace-manager.d.ts +13 -0
  97. package/lib/runtime/workspace/workspace-manager.js +2 -0
  98. package/lib/sdk/index.cjs +24 -7
  99. package/lib/sdk/index.d.ts +17 -7
  100. package/package.json +9 -3
  101. package/packages/runtime/package.json +17 -0
  102. package/packages/runtime/src/compiler/graph-compiler.ts +245 -0
  103. package/packages/runtime/src/compiler/index.ts +1 -0
  104. package/packages/runtime/src/context/context-pack-builder.ts +193 -0
  105. package/packages/runtime/src/context/index.ts +1 -0
  106. package/packages/runtime/src/delivery/branch-manager.ts +84 -0
  107. package/packages/runtime/src/delivery/ci-checks.ts +252 -0
  108. package/packages/runtime/src/delivery/index.ts +3 -0
  109. package/packages/runtime/src/delivery/pr-manager.ts +112 -0
  110. package/packages/runtime/src/events/bus.ts +92 -0
  111. package/packages/runtime/src/events/catalog.ts +29 -0
  112. package/packages/runtime/src/events/envelope.ts +14 -0
  113. package/packages/runtime/src/events/index.ts +3 -0
  114. package/packages/runtime/src/evidence/evidence-store.ts +130 -0
  115. package/packages/runtime/src/evidence/index.ts +1 -0
  116. package/packages/runtime/src/gate/gate-manager.ts +137 -0
  117. package/packages/runtime/src/gate/index.ts +1 -0
  118. package/packages/runtime/src/index.ts +32 -0
  119. package/packages/runtime/src/models/attempt.ts +19 -0
  120. package/packages/runtime/src/models/evidence.ts +21 -0
  121. package/packages/runtime/src/models/gate-decision.ts +21 -0
  122. package/packages/runtime/src/models/index.ts +8 -0
  123. package/packages/runtime/src/models/run.ts +24 -0
  124. package/packages/runtime/src/models/session.ts +11 -0
  125. package/packages/runtime/src/models/verification-result.ts +10 -0
  126. package/packages/runtime/src/models/work-item.ts +25 -0
  127. package/packages/runtime/src/models/workspace.ts +28 -0
  128. package/packages/runtime/src/plugins/index.ts +2 -0
  129. package/packages/runtime/src/plugins/plugin-abi.ts +95 -0
  130. package/packages/runtime/src/plugins/plugin-registry.ts +119 -0
  131. package/packages/runtime/src/policy/index.ts +1 -0
  132. package/packages/runtime/src/policy/policy-engine.ts +113 -0
  133. package/packages/runtime/src/projection/index.ts +1 -0
  134. package/packages/runtime/src/projection/projection-engine.ts +249 -0
  135. package/packages/runtime/src/reducers/debug-reducer.ts +36 -0
  136. package/packages/runtime/src/reducers/index.ts +2 -0
  137. package/packages/runtime/src/reducers/run-state-reducer.ts +127 -0
  138. package/packages/runtime/src/scheduler/index.ts +1 -0
  139. package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +231 -0
  140. package/packages/runtime/src/scheduler/scheduler.ts +281 -0
  141. package/packages/runtime/src/verification/index.ts +1 -0
  142. package/packages/runtime/src/verification/verification-compiler.ts +225 -0
  143. package/packages/runtime/src/workspace/index.ts +5 -0
  144. package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +121 -0
  145. package/packages/runtime/src/workspace/strategies/git-worktree.ts +77 -0
  146. package/packages/runtime/src/workspace/strategies/inplace.ts +35 -0
  147. package/packages/runtime/src/workspace/workspace-manager.ts +15 -0
  148. package/packages/runtime/tsconfig.json +17 -0
  149. package/vscode-extension/oxe-agents-0.9.2.vsix +0 -0
  150. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  151. package/vscode-extension/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./context-pack-builder"), exports);
@@ -0,0 +1,19 @@
1
+ export interface BranchInfo {
2
+ name: string;
3
+ current: boolean;
4
+ commit: string;
5
+ }
6
+ export declare class BranchManager {
7
+ private readonly projectRoot;
8
+ constructor(projectRoot: string);
9
+ currentBranch(): string;
10
+ currentCommit(): string;
11
+ createSessionBranch(sessionId: string): string;
12
+ createOxeBranch(name: string, base?: string): string;
13
+ switchTo(branchName: string): void;
14
+ deleteBranch(name: string, force?: boolean): void;
15
+ listOxeBranches(): BranchInfo[];
16
+ mergeWorktreeBranch(worktreeBranch: string, targetBranch: string): void;
17
+ branchExists(name: string): boolean;
18
+ private git;
19
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BranchManager = void 0;
4
+ const child_process_1 = require("child_process");
5
+ class BranchManager {
6
+ constructor(projectRoot) {
7
+ this.projectRoot = projectRoot;
8
+ }
9
+ currentBranch() {
10
+ return this.git(['rev-parse', '--abbrev-ref', 'HEAD']).trim();
11
+ }
12
+ currentCommit() {
13
+ return this.git(['rev-parse', 'HEAD']).trim();
14
+ }
15
+ createSessionBranch(sessionId) {
16
+ const name = `oxe/${sessionId}`;
17
+ this.git(['checkout', '-b', name]);
18
+ return name;
19
+ }
20
+ createOxeBranch(name, base) {
21
+ const fullName = name.startsWith('oxe/') ? name : `oxe/${name}`;
22
+ if (base) {
23
+ this.git(['checkout', '-b', fullName, base]);
24
+ }
25
+ else {
26
+ this.git(['checkout', '-b', fullName]);
27
+ }
28
+ return fullName;
29
+ }
30
+ switchTo(branchName) {
31
+ this.git(['checkout', branchName]);
32
+ }
33
+ deleteBranch(name, force = false) {
34
+ const flag = force ? '-D' : '-d';
35
+ this.git(['branch', flag, name]);
36
+ }
37
+ listOxeBranches() {
38
+ const raw = this.git(['branch', '--list', 'oxe/*', '--format=%(refname:short) %(objectname:short) %(HEAD)']);
39
+ return raw
40
+ .split('\n')
41
+ .filter(Boolean)
42
+ .map((line) => {
43
+ const parts = line.trim().split(/\s+/);
44
+ return {
45
+ name: parts[0],
46
+ commit: parts[1] ?? '',
47
+ current: parts[2] === '*',
48
+ };
49
+ });
50
+ }
51
+ mergeWorktreeBranch(worktreeBranch, targetBranch) {
52
+ const saved = this.currentBranch();
53
+ try {
54
+ this.git(['checkout', targetBranch]);
55
+ this.git(['merge', '--no-ff', worktreeBranch, '-m', `oxe: merge ${worktreeBranch}`]);
56
+ }
57
+ finally {
58
+ try {
59
+ this.git(['checkout', saved]);
60
+ }
61
+ catch { /* best effort */ }
62
+ }
63
+ }
64
+ branchExists(name) {
65
+ const result = (0, child_process_1.spawnSync)('git', ['rev-parse', '--verify', name], {
66
+ cwd: this.projectRoot,
67
+ encoding: 'utf8',
68
+ });
69
+ return result.status === 0;
70
+ }
71
+ git(args) {
72
+ return (0, child_process_1.execFileSync)('git', args, {
73
+ cwd: this.projectRoot,
74
+ encoding: 'utf8',
75
+ });
76
+ }
77
+ }
78
+ exports.BranchManager = BranchManager;
@@ -0,0 +1,34 @@
1
+ import type { EvidenceStore } from '../evidence/evidence-store';
2
+ export type CICheckStatus = 'pass' | 'fail' | 'skip' | 'error';
3
+ export interface CICheckContext {
4
+ projectRoot: string;
5
+ sessionId: string | null;
6
+ runId?: string;
7
+ evidenceStore?: EvidenceStore;
8
+ }
9
+ export interface CICheckResult {
10
+ check: string;
11
+ status: CICheckStatus;
12
+ message: string;
13
+ details?: unknown;
14
+ }
15
+ export interface CICheck {
16
+ name: string;
17
+ description: string;
18
+ run(ctx: CICheckContext): Promise<CICheckResult>;
19
+ }
20
+ export declare const planConsistencyCheck: CICheck;
21
+ export declare const verifyAcceptanceCheck: CICheck;
22
+ export declare const policyCheck: CICheck;
23
+ export declare const securityBaselineCheck: CICheck;
24
+ export declare const runtimeEvidenceIntegrityCheck: CICheck;
25
+ export declare const OXE_CI_CHECKS: CICheck[];
26
+ export declare function runCIChecks(ctx: CICheckContext, checks?: CICheck[]): Promise<CICheckResult[]>;
27
+ export declare function summarizeCIResults(results: CICheckResult[]): {
28
+ total: number;
29
+ pass: number;
30
+ fail: number;
31
+ skip: number;
32
+ error: number;
33
+ allPassed: boolean;
34
+ };
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OXE_CI_CHECKS = exports.runtimeEvidenceIntegrityCheck = exports.securityBaselineCheck = exports.policyCheck = exports.verifyAcceptanceCheck = exports.planConsistencyCheck = void 0;
7
+ exports.runCIChecks = runCIChecks;
8
+ exports.summarizeCIResults = summarizeCIResults;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ // ─── Check: plan-consistency ─────────────────────────────────────────────────
12
+ exports.planConsistencyCheck = {
13
+ name: 'oxe-plan-consistency',
14
+ description: 'Verifies ACTIVE-RUN.json exists and has a compiled ExecutionGraph',
15
+ async run(ctx) {
16
+ const activeRunPath = ctx.sessionId
17
+ ? path_1.default.join(ctx.projectRoot, '.oxe', ctx.sessionId, 'execution', 'ACTIVE-RUN.json')
18
+ : path_1.default.join(ctx.projectRoot, '.oxe', 'ACTIVE-RUN.json');
19
+ if (!fs_1.default.existsSync(activeRunPath)) {
20
+ return { check: this.name, status: 'skip', message: 'No ACTIVE-RUN.json found' };
21
+ }
22
+ try {
23
+ const raw = JSON.parse(fs_1.default.readFileSync(activeRunPath, 'utf8'));
24
+ const hasGraph = raw.compiled_graph && typeof raw.compiled_graph === 'object';
25
+ const hasRunId = typeof raw.run_id === 'string';
26
+ if (!hasRunId) {
27
+ return { check: this.name, status: 'fail', message: 'ACTIVE-RUN.json missing run_id', details: raw };
28
+ }
29
+ if (!hasGraph) {
30
+ return { check: this.name, status: 'fail', message: 'No compiled ExecutionGraph found in ACTIVE-RUN.json', details: { run_id: raw.run_id } };
31
+ }
32
+ return { check: this.name, status: 'pass', message: `Run ${String(raw.run_id)} has compiled graph` };
33
+ }
34
+ catch (err) {
35
+ return { check: this.name, status: 'error', message: `Failed to parse ACTIVE-RUN.json: ${String(err)}` };
36
+ }
37
+ },
38
+ };
39
+ // ─── Check: verify-acceptance ────────────────────────────────────────────────
40
+ exports.verifyAcceptanceCheck = {
41
+ name: 'oxe-verify-acceptance',
42
+ description: 'Checks that VERIFY.md exists and contains no failed criteria',
43
+ async run(ctx) {
44
+ const verifyPath = ctx.sessionId
45
+ ? path_1.default.join(ctx.projectRoot, '.oxe', ctx.sessionId, 'verification', 'VERIFY.md')
46
+ : path_1.default.join(ctx.projectRoot, '.oxe', 'VERIFY.md');
47
+ if (!fs_1.default.existsSync(verifyPath)) {
48
+ return { check: this.name, status: 'skip', message: 'No VERIFY.md found — run /oxe-verify first' };
49
+ }
50
+ const content = fs_1.default.readFileSync(verifyPath, 'utf8');
51
+ const failLines = content.split('\n').filter((l) => l.includes('✗ FAIL'));
52
+ const passLines = content.split('\n').filter((l) => l.includes('✓ PASS'));
53
+ if (failLines.length > 0) {
54
+ return {
55
+ check: this.name,
56
+ status: 'fail',
57
+ message: `${failLines.length} acceptance criteria failed`,
58
+ details: { failed: failLines, passed: passLines.length },
59
+ };
60
+ }
61
+ if (passLines.length === 0) {
62
+ return { check: this.name, status: 'skip', message: 'VERIFY.md has no pass/fail markers' };
63
+ }
64
+ return { check: this.name, status: 'pass', message: `${passLines.length} acceptance criteria passed` };
65
+ },
66
+ };
67
+ // ─── Check: policy ───────────────────────────────────────────────────────────
68
+ exports.policyCheck = {
69
+ name: 'oxe-policy',
70
+ description: 'Checks that no gates are pending (unresolved human approval)',
71
+ async run(ctx) {
72
+ const gatesPath = ctx.sessionId
73
+ ? path_1.default.join(ctx.projectRoot, '.oxe', ctx.sessionId, 'execution', 'GATES.json')
74
+ : path_1.default.join(ctx.projectRoot, '.oxe', 'execution', 'GATES.json');
75
+ if (!fs_1.default.existsSync(gatesPath)) {
76
+ return { check: this.name, status: 'pass', message: 'No pending gates' };
77
+ }
78
+ try {
79
+ const gates = JSON.parse(fs_1.default.readFileSync(gatesPath, 'utf8'));
80
+ const pending = gates.filter((g) => g.status === 'pending');
81
+ if (pending.length > 0) {
82
+ return {
83
+ check: this.name,
84
+ status: 'fail',
85
+ message: `${pending.length} unresolved gate(s)`,
86
+ details: pending.map((g) => ({ gate_id: g.gate_id, scope: g.scope })),
87
+ };
88
+ }
89
+ return { check: this.name, status: 'pass', message: 'All gates resolved' };
90
+ }
91
+ catch (err) {
92
+ return { check: this.name, status: 'error', message: `Failed to read GATES.json: ${String(err)}` };
93
+ }
94
+ },
95
+ };
96
+ // ─── Check: security-baseline ────────────────────────────────────────────────
97
+ const SECRET_PATTERNS = [
98
+ /(?:password|passwd|secret|api[_-]?key|auth[_-]?token)\s*[:=]\s*['"]?\S{8,}/i,
99
+ /(?:AKIA|ASIA)[A-Z0-9]{16}/,
100
+ /-----BEGIN (?:RSA|EC|OPENSSH) PRIVATE KEY-----/,
101
+ ];
102
+ exports.securityBaselineCheck = {
103
+ name: 'oxe-security-baseline',
104
+ description: 'Scans evidence artifacts for common secret patterns',
105
+ async run(ctx) {
106
+ if (!ctx.evidenceStore || !ctx.runId) {
107
+ return { check: this.name, status: 'skip', message: 'No evidence store or run ID provided' };
108
+ }
109
+ const evidenceDir = path_1.default.join(ctx.projectRoot, '.oxe', 'evidence', 'runs', ctx.runId);
110
+ if (!fs_1.default.existsSync(evidenceDir)) {
111
+ return { check: this.name, status: 'skip', message: 'No evidence found for this run' };
112
+ }
113
+ const findings = [];
114
+ walkDir(evidenceDir, (filePath) => {
115
+ if (filePath.endsWith('.json') || filePath.endsWith('.patch') || filePath.endsWith('.txt')) {
116
+ try {
117
+ const content = fs_1.default.readFileSync(filePath, 'utf8');
118
+ for (const pattern of SECRET_PATTERNS) {
119
+ if (pattern.test(content)) {
120
+ findings.push(`${path_1.default.basename(filePath)}: matches pattern ${pattern.source.slice(0, 40)}`);
121
+ break;
122
+ }
123
+ }
124
+ }
125
+ catch { /* skip unreadable */ }
126
+ }
127
+ });
128
+ if (findings.length > 0) {
129
+ return { check: this.name, status: 'fail', message: `Secret patterns detected in ${findings.length} evidence file(s)`, details: findings };
130
+ }
131
+ return { check: this.name, status: 'pass', message: 'No secret patterns detected in evidence' };
132
+ },
133
+ };
134
+ // ─── Check: runtime-evidence-integrity ───────────────────────────────────────
135
+ exports.runtimeEvidenceIntegrityCheck = {
136
+ name: 'oxe-runtime-evidence-integrity',
137
+ description: 'Validates that all evidence index files are valid JSON and files exist on disk',
138
+ async run(ctx) {
139
+ if (!ctx.runId) {
140
+ return { check: this.name, status: 'skip', message: 'No run ID provided' };
141
+ }
142
+ const runEvidenceDir = path_1.default.join(ctx.projectRoot, '.oxe', 'evidence', 'runs', ctx.runId);
143
+ if (!fs_1.default.existsSync(runEvidenceDir)) {
144
+ return { check: this.name, status: 'skip', message: 'No evidence directory for this run' };
145
+ }
146
+ const errors = [];
147
+ let indexCount = 0;
148
+ let evidenceCount = 0;
149
+ walkDir(runEvidenceDir, (filePath) => {
150
+ if (path_1.default.basename(filePath) !== 'index.json')
151
+ return;
152
+ indexCount++;
153
+ try {
154
+ const items = JSON.parse(fs_1.default.readFileSync(filePath, 'utf8'));
155
+ for (const item of items) {
156
+ evidenceCount++;
157
+ const absPath = path_1.default.join(ctx.projectRoot, item.path);
158
+ if (!fs_1.default.existsSync(absPath)) {
159
+ errors.push(`Missing file for ${item.evidence_id}: ${item.path}`);
160
+ }
161
+ }
162
+ }
163
+ catch (err) {
164
+ errors.push(`Corrupt index at ${filePath}: ${String(err)}`);
165
+ }
166
+ });
167
+ if (errors.length > 0) {
168
+ return { check: this.name, status: 'fail', message: `${errors.length} integrity error(s)`, details: errors };
169
+ }
170
+ return {
171
+ check: this.name,
172
+ status: indexCount === 0 ? 'skip' : 'pass',
173
+ message: `${evidenceCount} evidence artifact(s) across ${indexCount} index(es) — all valid`,
174
+ };
175
+ },
176
+ };
177
+ // ─── Suite ───────────────────────────────────────────────────────────────────
178
+ exports.OXE_CI_CHECKS = [
179
+ exports.planConsistencyCheck,
180
+ exports.verifyAcceptanceCheck,
181
+ exports.policyCheck,
182
+ exports.securityBaselineCheck,
183
+ exports.runtimeEvidenceIntegrityCheck,
184
+ ];
185
+ async function runCIChecks(ctx, checks = exports.OXE_CI_CHECKS) {
186
+ const results = [];
187
+ for (const check of checks) {
188
+ results.push(await check.run(ctx));
189
+ }
190
+ return results;
191
+ }
192
+ function summarizeCIResults(results) {
193
+ const counts = { total: results.length, pass: 0, fail: 0, skip: 0, error: 0 };
194
+ for (const r of results)
195
+ counts[r.status]++;
196
+ return { ...counts, allPassed: counts.fail === 0 && counts.error === 0 };
197
+ }
198
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
199
+ function walkDir(dir, visitor) {
200
+ if (!fs_1.default.existsSync(dir))
201
+ return;
202
+ for (const entry of fs_1.default.readdirSync(dir, { withFileTypes: true })) {
203
+ const full = path_1.default.join(dir, entry.name);
204
+ if (entry.isDirectory())
205
+ walkDir(full, visitor);
206
+ else
207
+ visitor(full);
208
+ }
209
+ }
@@ -0,0 +1,3 @@
1
+ export * from './branch-manager';
2
+ export * from './pr-manager';
3
+ export * from './ci-checks';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./branch-manager"), exports);
18
+ __exportStar(require("./pr-manager"), exports);
19
+ __exportStar(require("./ci-checks"), exports);
@@ -0,0 +1,30 @@
1
+ export interface PRDraftOptions {
2
+ title: string;
3
+ body: string;
4
+ base?: string;
5
+ head?: string;
6
+ draft?: boolean;
7
+ }
8
+ export interface PRInfo {
9
+ number: number;
10
+ title: string;
11
+ url: string;
12
+ state: string;
13
+ draft: boolean;
14
+ head: string;
15
+ base: string;
16
+ }
17
+ export interface PRResult {
18
+ success: boolean;
19
+ url?: string;
20
+ error?: string;
21
+ pr?: PRInfo;
22
+ }
23
+ export declare class PRManager {
24
+ private readonly projectRoot;
25
+ constructor(projectRoot: string);
26
+ isAvailable(): boolean;
27
+ createDraft(opts: PRDraftOptions): PRResult;
28
+ view(prNumberOrUrl: string | number): PRResult;
29
+ mergePR(prNumber: number, method?: 'merge' | 'squash' | 'rebase'): PRResult;
30
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PRManager = void 0;
4
+ const child_process_1 = require("child_process");
5
+ function isGhAvailable(cwd) {
6
+ const result = (0, child_process_1.spawnSync)('gh', ['--version'], { cwd, encoding: 'utf8' });
7
+ return result.status === 0;
8
+ }
9
+ class PRManager {
10
+ constructor(projectRoot) {
11
+ this.projectRoot = projectRoot;
12
+ }
13
+ isAvailable() {
14
+ return isGhAvailable(this.projectRoot);
15
+ }
16
+ createDraft(opts) {
17
+ if (!this.isAvailable()) {
18
+ return { success: false, error: 'gh CLI not available — install from https://cli.github.com' };
19
+ }
20
+ const args = [
21
+ 'pr', 'create',
22
+ '--title', opts.title,
23
+ '--body', opts.body,
24
+ ];
25
+ if (opts.draft !== false)
26
+ args.push('--draft');
27
+ if (opts.base)
28
+ args.push('--base', opts.base);
29
+ if (opts.head)
30
+ args.push('--head', opts.head);
31
+ const result = (0, child_process_1.spawnSync)('gh', args, {
32
+ cwd: this.projectRoot,
33
+ encoding: 'utf8',
34
+ });
35
+ if (result.status !== 0) {
36
+ return { success: false, error: result.stderr?.trim() ?? 'gh pr create failed' };
37
+ }
38
+ const url = result.stdout?.trim();
39
+ return { success: true, url };
40
+ }
41
+ view(prNumberOrUrl) {
42
+ if (!this.isAvailable()) {
43
+ return { success: false, error: 'gh CLI not available' };
44
+ }
45
+ const result = (0, child_process_1.spawnSync)('gh', ['pr', 'view', String(prNumberOrUrl), '--json', 'number,title,url,state,isDraft,headRefName,baseRefName'], { cwd: this.projectRoot, encoding: 'utf8' });
46
+ if (result.status !== 0) {
47
+ return { success: false, error: result.stderr?.trim() };
48
+ }
49
+ try {
50
+ const raw = JSON.parse(result.stdout);
51
+ return {
52
+ success: true,
53
+ url: raw.url,
54
+ pr: {
55
+ number: raw.number,
56
+ title: raw.title,
57
+ url: raw.url,
58
+ state: raw.state.toLowerCase(),
59
+ draft: raw.isDraft,
60
+ head: raw.headRefName,
61
+ base: raw.baseRefName,
62
+ },
63
+ };
64
+ }
65
+ catch {
66
+ return { success: false, error: 'Failed to parse gh output' };
67
+ }
68
+ }
69
+ mergePR(prNumber, method = 'merge') {
70
+ if (!this.isAvailable()) {
71
+ return { success: false, error: 'gh CLI not available' };
72
+ }
73
+ const result = (0, child_process_1.spawnSync)('gh', ['pr', 'merge', String(prNumber), `--${method}`, '--delete-branch'], {
74
+ cwd: this.projectRoot,
75
+ encoding: 'utf8',
76
+ });
77
+ return result.status === 0
78
+ ? { success: true }
79
+ : { success: false, error: result.stderr?.trim() };
80
+ }
81
+ }
82
+ exports.PRManager = PRManager;
@@ -0,0 +1,9 @@
1
+ import type { OxeEvent } from './envelope';
2
+ import type { EventType } from './catalog';
3
+ export type EventInput = Partial<Omit<OxeEvent, 'type'>> & {
4
+ type: EventType;
5
+ };
6
+ export declare function appendEvent(projectRoot: string, sessionId: string | null, input: EventInput, causationId?: string): OxeEvent;
7
+ export declare function readEvents(projectRoot: string, sessionId: string | null): OxeEvent[];
8
+ export declare function filterByRun(events: OxeEvent[], runId: string): OxeEvent[];
9
+ export declare function filterByWorkItem(events: OxeEvent[], workItemId: string): OxeEvent[];
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.appendEvent = appendEvent;
7
+ exports.readEvents = readEvents;
8
+ exports.filterByRun = filterByRun;
9
+ exports.filterByWorkItem = filterByWorkItem;
10
+ const path_1 = __importDefault(require("path"));
11
+ const fs_1 = __importDefault(require("fs"));
12
+ function loadOperationalModule() {
13
+ const candidates = [
14
+ path_1.default.resolve(__dirname, '../../../bin/lib/oxe-operational.cjs'),
15
+ path_1.default.resolve(__dirname, '../../../../bin/lib/oxe-operational.cjs'),
16
+ path_1.default.resolve(__dirname, '../../../../../bin/lib/oxe-operational.cjs'),
17
+ ];
18
+ for (const candidate of candidates) {
19
+ if (!fs_1.default.existsSync(candidate))
20
+ continue;
21
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
22
+ return require(candidate);
23
+ }
24
+ throw new Error(`Unable to locate oxe-operational.cjs from ${__dirname}`);
25
+ }
26
+ const operational = loadOperationalModule();
27
+ function fromOperationalEvent(raw) {
28
+ return {
29
+ id: String(raw.event_id || ''),
30
+ type: String(raw.type || 'RunStarted'),
31
+ timestamp: String(raw.timestamp || new Date().toISOString()),
32
+ session_id: raw.session_id ?? null,
33
+ run_id: raw.run_id ?? null,
34
+ work_item_id: raw.work_item_id ?? raw.task_id ?? null,
35
+ attempt_id: raw.attempt_id ?? null,
36
+ causation_id: raw.causation_id ?? null,
37
+ correlation_id: raw.correlation_id ?? null,
38
+ payload: raw.payload && typeof raw.payload === 'object' ? raw.payload : {},
39
+ };
40
+ }
41
+ function appendEvent(projectRoot, sessionId, input, causationId) {
42
+ const event = operational.appendEvent(projectRoot, sessionId, {
43
+ event_id: input.id,
44
+ type: input.type,
45
+ timestamp: input.timestamp,
46
+ run_id: input.run_id ?? null,
47
+ work_item_id: input.work_item_id ?? null,
48
+ attempt_id: input.attempt_id ?? null,
49
+ causation_id: input.causation_id ?? causationId ?? null,
50
+ correlation_id: input.correlation_id ?? null,
51
+ payload: input.payload && typeof input.payload === 'object' ? input.payload : {},
52
+ });
53
+ return fromOperationalEvent(event);
54
+ }
55
+ function readEvents(projectRoot, sessionId) {
56
+ return operational.readEvents(projectRoot, sessionId).map(fromOperationalEvent);
57
+ }
58
+ function filterByRun(events, runId) {
59
+ return events.filter((e) => e.run_id === runId);
60
+ }
61
+ function filterByWorkItem(events, workItemId) {
62
+ return events.filter((e) => e.work_item_id === workItemId);
63
+ }
@@ -0,0 +1,3 @@
1
+ export declare const EVENT_TYPES: readonly ["SessionCreated", "RunStarted", "GraphCompiled", "WorkItemReady", "WorkspaceAllocated", "AttemptStarted", "ToolInvoked", "ToolCompleted", "ToolFailed", "EvidenceCollected", "PolicyEvaluated", "GateRequested", "GateResolved", "VerificationStarted", "VerificationCompleted", "RetryScheduled", "WorkItemCompleted", "WorkItemBlocked", "RunCompleted", "RetroPublished", "LessonPromoted"];
2
+ export type EventType = (typeof EVENT_TYPES)[number];
3
+ export declare function isValidEventType(type: string): type is EventType;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVENT_TYPES = void 0;
4
+ exports.isValidEventType = isValidEventType;
5
+ exports.EVENT_TYPES = [
6
+ 'SessionCreated',
7
+ 'RunStarted',
8
+ 'GraphCompiled',
9
+ 'WorkItemReady',
10
+ 'WorkspaceAllocated',
11
+ 'AttemptStarted',
12
+ 'ToolInvoked',
13
+ 'ToolCompleted',
14
+ 'ToolFailed',
15
+ 'EvidenceCollected',
16
+ 'PolicyEvaluated',
17
+ 'GateRequested',
18
+ 'GateResolved',
19
+ 'VerificationStarted',
20
+ 'VerificationCompleted',
21
+ 'RetryScheduled',
22
+ 'WorkItemCompleted',
23
+ 'WorkItemBlocked',
24
+ 'RunCompleted',
25
+ 'RetroPublished',
26
+ 'LessonPromoted',
27
+ ];
28
+ function isValidEventType(type) {
29
+ return exports.EVENT_TYPES.includes(type);
30
+ }
@@ -0,0 +1,13 @@
1
+ import type { EventType } from './catalog';
2
+ export interface OxeEvent {
3
+ id: string;
4
+ type: EventType;
5
+ timestamp: string;
6
+ session_id: string | null;
7
+ run_id: string | null;
8
+ work_item_id: string | null;
9
+ attempt_id: string | null;
10
+ causation_id: string | null;
11
+ correlation_id: string | null;
12
+ payload: Record<string, unknown>;
13
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export * from './catalog';
2
+ export * from './envelope';
3
+ export * from './bus';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./catalog"), exports);
18
+ __exportStar(require("./envelope"), exports);
19
+ __exportStar(require("./bus"), exports);