aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
110 lines (95 loc) • 3.01 kB
JavaScript
/**
* Build Configuration Check
*
* Verifies build configuration is valid.
*
* @module aios-core/health-check/checks/deployment/build-config
* @version 1.0.0
* @story HCS-2 - Health Check System Implementation
*/
const fs = require('fs').promises;
const path = require('path');
const { BaseCheck, CheckSeverity, CheckDomain } = require('../../base-check');
/**
* Build configuration check
*
* @class BuildConfigCheck
* @extends BaseCheck
*/
class BuildConfigCheck extends BaseCheck {
constructor() {
super({
id: 'deployment.build-config',
name: 'Build Configuration',
description: 'Verifies build configuration',
domain: CheckDomain.DEPLOYMENT,
severity: CheckSeverity.MEDIUM,
timeout: 3000,
cacheable: true,
healingTier: 0,
tags: ['build', 'config'],
});
}
/**
* Execute the check
* @param {Object} context - Execution context
* @returns {Promise<Object>} Check result
*/
async execute(context) {
const projectRoot = context.projectRoot || process.cwd();
const issues = [];
const found = [];
// Check package.json scripts
try {
const packagePath = path.join(projectRoot, 'package.json');
const content = await fs.readFile(packagePath, 'utf8');
const packageJson = JSON.parse(content);
const scripts = packageJson.scripts || {};
// Check for essential scripts
if (scripts.build) found.push('build script');
if (scripts.start) found.push('start script');
if (scripts.test) found.push('test script');
if (scripts.lint) found.push('lint script');
if (!scripts.build && !scripts.start) {
issues.push('No build or start script defined');
}
} catch {
issues.push('Could not read package.json');
}
// Check for build tool configs
const buildConfigs = [
{ file: 'tsconfig.json', name: 'TypeScript' },
{ file: 'webpack.config.js', name: 'Webpack' },
{ file: 'vite.config.js', name: 'Vite' },
{ file: 'rollup.config.js', name: 'Rollup' },
{ file: 'esbuild.config.js', name: 'esbuild' },
{ file: 'babel.config.js', name: 'Babel' },
{ file: '.babelrc', name: 'Babel' },
];
for (const config of buildConfigs) {
try {
await fs.access(path.join(projectRoot, config.file));
found.push(config.name);
} catch {
// Not found
}
}
const details = {
found,
issues: issues.length,
};
if (issues.length > 0) {
return this.warning(`Build configuration issues: ${issues.join(', ')}`, {
recommendation: 'Add missing build scripts to package.json',
details: { ...details, issues },
});
}
if (found.length === 0) {
return this.pass('No build configuration found (may be a simple project)', {
details,
});
}
return this.pass(`Build configuration OK (${found.join(', ')})`, { details });
}
}
module.exports = BuildConfigCheck;