Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions .github/workflows/provider-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
name: Provider Integration Check

on:
pull_request:
paths:
- 'apps/server/src/providers/**'
- 'apps/server/src/lib/telemetry*.ts'
- 'apps/server/src/services/agent-monitor.ts'
- 'apps/server/src/routes/providers/**'
push:
branches:
- main
- master
paths:
- 'apps/server/src/providers/**'
- 'apps/server/src/lib/telemetry*.ts'
- 'apps/server/src/services/agent-monitor.ts'
- 'apps/server/src/routes/providers/**'

jobs:
provider-validation:
name: Validate Provider Infrastructure
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup project
uses: ./.github/actions/setup-project
with:
check-lockfile: 'true'

- name: Build shared packages
run: npm run build:packages

- name: Build server for type checking
run: npm run build --workspace=apps/server

- name: Verify provider exports
shell: bash
run: |
# Verify provider index exports are accessible
node -e "
import('./apps/server/src/providers/index.js').then(m => {
console.log('✓ Provider module exports:', Object.keys(m));
if (!m.EngineRegistry) throw new Error('EngineRegistry not exported');
if (!m.ClaudeProvider) throw new Error('ClaudeProvider not exported');
if (!m.CursorProvider) throw new Error('CursorProvider not exported');
console.log('✓ All expected exports found');
}).catch(e => {
console.error('✗ Provider export check failed:', e.message);
process.exit(1);
});
"

- name: Verify telemetry parsers
shell: bash
run: |
# Verify telemetry modules are accessible
node -e "
import('./apps/server/src/lib/telemetry.js').then(m => {
console.log('✓ Telemetry exports:', Object.keys(m));
if (!m.calculateCost) throw new Error('calculateCost not exported');
if (!m.createTelemetryCapture) throw new Error('createTelemetryCapture not exported');
console.log('✓ Telemetry module validated');
}).catch(e => {
console.error('✗ Telemetry module check failed:', e.message);
process.exit(1);
});
"

agent-monitor-validation:
name: Validate Agent Monitor Service
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup project
uses: ./.github/actions/setup-project
with:
check-lockfile: 'true'

- name: Build shared packages
run: npm run build:packages

- name: Verify better-sqlite3 compatibility
shell: bash
run: |
# Check that better-sqlite3 is properly installed
node -e "
const Database = require('better-sqlite3');
const db = new Database(':memory:');
db.exec('CREATE TABLE test (id INTEGER)');
console.log('✓ better-sqlite3 is working correctly');
db.close();
"

- name: Verify agent monitor exports
shell: bash
run: |
node -e "
import('./apps/server/src/services/agent-monitor.js').then(m => {
console.log('✓ AgentMonitor exports:', Object.keys(m));
if (!m.AgentMonitorService) throw new Error('AgentMonitorService not exported');
if (!m.getAgentMonitor) throw new Error('getAgentMonitor not exported');
console.log('✓ Agent monitor module validated');
}).catch(e => {
console.error('✗ Agent monitor check failed:', e.message);
process.exit(1);
});
"

integration-test:
name: Provider Integration Tests
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup project
uses: ./.github/actions/setup-project
with:
check-lockfile: 'true'

- name: Build shared packages
run: npm run build:packages

- name: Run server tests
run: npm run test:server
env:
NODE_ENV: test

- name: Test provider registry operations
shell: bash
run: |
node --run << 'EOF'
import { EngineRegistry } from './apps/server/src/providers/registry.js';
import { ClaudeProvider } from './apps/server/src/providers/claude-provider.js';

// Test registration
const claude = new ClaudeProvider();
const metadata = EngineRegistry.register('test-claude', claude, {});

console.log('✓ Provider registered:', metadata.id);

// Test retrieval
const retrieved = EngineRegistry.get('test-claude');
if (!retrieved || retrieved.id !== 'test-claude') {
throw new Error('Provider retrieval failed');
}
console.log('✓ Provider retrieved successfully');

// Test getAll
const all = EngineRegistry.getAll();
console.log('✓ Total providers registered:', all.length);

// Cleanup
EngineRegistry.unregister('test-claude');
console.log('✓ Provider registry integration test passed');
EOF
Comment on lines +137 to +164
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Invalid node --run syntax will cause CI failure.

The node --run flag is used to execute scripts defined in package.json, not to run inline JavaScript code. This integration test step will fail.

🔎 Proposed fix using proper ESM execution
      - name: Test provider registry operations
        shell: bash
        run: |
-          node --run << 'EOF'
-          import { EngineRegistry } from './apps/server/src/providers/registry.js';
-          import { ClaudeProvider } from './apps/server/src/providers/claude-provider.js';
-
-          // Test registration
-          const claude = new ClaudeProvider();
-          const metadata = EngineRegistry.register('test-claude', claude, {});
-
-          console.log('✓ Provider registered:', metadata.id);
-
-          // Test retrieval
-          const retrieved = EngineRegistry.get('test-claude');
-          if (!retrieved || retrieved.id !== 'test-claude') {
-            throw new Error('Provider retrieval failed');
-          }
-          console.log('✓ Provider retrieved successfully');
-
-          // Test getAll
-          const all = EngineRegistry.getAll();
-          console.log('✓ Total providers registered:', all.length);
-
-          // Cleanup
-          EngineRegistry.unregister('test-claude');
-          console.log('✓ Provider registry integration test passed');
-          EOF
+          node --input-type=module -e "
+          import { EngineRegistry } from './apps/server/src/providers/registry.js';
+          import { ClaudeProvider } from './apps/server/src/providers/claude-provider.js';
+
+          // Test registration
+          const claude = new ClaudeProvider();
+          const metadata = EngineRegistry.register('test-claude', claude, {});
+
+          console.log('✓ Provider registered:', metadata.id);
+
+          // Test retrieval
+          const retrieved = EngineRegistry.get('test-claude');
+          if (!retrieved || retrieved.id !== 'test-claude') {
+            throw new Error('Provider retrieval failed');
+          }
+          console.log('✓ Provider retrieved successfully');
+
+          // Test getAll
+          const all = EngineRegistry.getAll();
+          console.log('✓ Total providers registered:', all.length);
+
+          // Cleanup
+          EngineRegistry.unregister('test-claude');
+          console.log('✓ Provider registry integration test passed');
+          "
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Test provider registry operations
shell: bash
run: |
node --run << 'EOF'
import { EngineRegistry } from './apps/server/src/providers/registry.js';
import { ClaudeProvider } from './apps/server/src/providers/claude-provider.js';
// Test registration
const claude = new ClaudeProvider();
const metadata = EngineRegistry.register('test-claude', claude, {});
console.log('✓ Provider registered:', metadata.id);
// Test retrieval
const retrieved = EngineRegistry.get('test-claude');
if (!retrieved || retrieved.id !== 'test-claude') {
throw new Error('Provider retrieval failed');
}
console.log('✓ Provider retrieved successfully');
// Test getAll
const all = EngineRegistry.getAll();
console.log('✓ Total providers registered:', all.length);
// Cleanup
EngineRegistry.unregister('test-claude');
console.log('✓ Provider registry integration test passed');
EOF
- name: Test provider registry operations
shell: bash
run: |
node --input-type=module -e "
import { EngineRegistry } from './apps/server/src/providers/registry.js';
import { ClaudeProvider } from './apps/server/src/providers/claude-provider.js';
// Test registration
const claude = new ClaudeProvider();
const metadata = EngineRegistry.register('test-claude', claude, {});
console.log('✓ Provider registered:', metadata.id);
// Test retrieval
const retrieved = EngineRegistry.get('test-claude');
if (!retrieved || retrieved.id !== 'test-claude') {
throw new Error('Provider retrieval failed');
}
console.log('✓ Provider retrieved successfully');
// Test getAll
const all = EngineRegistry.getAll();
console.log('✓ Total providers registered:', all.length);
// Cleanup
EngineRegistry.unregister('test-claude');
console.log('✓ Provider registry integration test passed');
"
🤖 Prompt for AI Agents
.github/workflows/provider-check.yml around lines 137 to 164: the step uses the
invalid `node --run` flag which will fail; replace `node --run << 'EOF'` with
`node --input-type=module << 'EOF'` so the heredoc is executed as ESM (allowing
top-level import), keep the existing inline script and EOF markers unchanged,
and ensure the imported paths are valid ESM module paths.

Loading