@morodomi/ait3
Version:
AIT³ Development Platform - AI + Ticket + Test + Tool driven development methodology
189 lines (188 loc) • 6.66 kB
JavaScript
import { readFile, access } from 'fs/promises';
/**
* Analyze project to detect language, framework, and configuration
*/
export async function analyzeProject() {
const analysis = {
language: 'Unknown',
framework: 'Unknown',
buildSystem: 'Unknown',
testFramework: 'Unknown',
commands: {
install: 'echo "No install command detected"',
test: 'echo "No test command detected"',
build: 'echo "No build command detected"',
dev: 'echo "No dev command detected"'
},
docker: {
hasDockerfile: false,
hasCompose: false
},
architecture: 'Unknown',
projectName: 'my-project'
};
// Check for Node.js/TypeScript
try {
await access('package.json');
const packageContent = await readFile('package.json', 'utf-8');
try {
const pkg = JSON.parse(packageContent);
analysis.projectName = pkg.name || 'my-project';
analysis.language = 'Node.js';
analysis.buildSystem = 'npm';
// Check for TypeScript
if (pkg.devDependencies?.typescript || pkg.dependencies?.typescript) {
analysis.language = 'Node.js TypeScript';
analysis.framework = 'TypeScript';
}
// Detect test framework
if (pkg.devDependencies?.vitest || pkg.dependencies?.vitest) {
analysis.testFramework = 'Vitest';
}
else if (pkg.devDependencies?.jest || pkg.dependencies?.jest) {
analysis.testFramework = 'Jest';
}
// Extract commands
if (pkg.scripts) {
analysis.commands.install = 'npm install';
analysis.commands.test = pkg.scripts.test ? 'npm test' : 'echo "No test script"';
analysis.commands.build = pkg.scripts.build ? 'npm run build' : 'echo "No build script"';
analysis.commands.dev = pkg.scripts.dev ? 'npm run dev' : pkg.scripts.start ? 'npm start' : 'echo "No dev script"';
}
}
catch {
// Malformed package.json, continue with defaults
}
}
catch {
// No package.json, check other project types
await checkPythonProject(analysis);
await checkGoProject(analysis);
await checkLaravelProject(analysis);
}
// Check for Docker
await checkDockerFiles(analysis);
return analysis;
}
async function checkPythonProject(analysis) {
try {
await access('requirements.txt');
analysis.language = 'Python';
// Check if it's Flask
try {
const requirements = await readFile('requirements.txt', 'utf-8');
if (requirements.toLowerCase().includes('flask')) {
analysis.framework = 'Flask';
}
else {
analysis.framework = 'pip';
}
}
catch {
analysis.framework = 'pip';
}
analysis.buildSystem = 'pip';
analysis.commands.install = 'pip install -r requirements.txt';
analysis.commands.test = 'pytest';
analysis.commands.build = 'python -m build';
analysis.commands.dev = 'python app.py';
}
catch {
// Not a pip project, check for poetry
try {
await access('pyproject.toml');
analysis.language = 'Python';
// Check if it's Flask with poetry
try {
const pyproject = await readFile('pyproject.toml', 'utf-8');
if (pyproject.toLowerCase().includes('flask')) {
analysis.framework = 'Flask';
}
else {
analysis.framework = 'poetry';
}
}
catch {
analysis.framework = 'poetry';
}
analysis.buildSystem = 'poetry';
analysis.commands.install = 'poetry install';
analysis.commands.test = 'poetry run pytest';
analysis.commands.build = 'poetry build';
analysis.commands.dev = 'poetry run python app.py';
}
catch {
// Not a Python project
}
}
}
async function checkGoProject(analysis) {
try {
await access('go.mod');
analysis.language = 'Go';
analysis.framework = 'Go modules';
analysis.buildSystem = 'go';
analysis.commands.install = 'go mod tidy';
analysis.commands.test = 'go test ./...';
analysis.commands.build = 'go build';
analysis.commands.dev = 'go run main.go';
}
catch {
// Not a Go project
}
}
async function checkLaravelProject(analysis) {
try {
// Check for artisan file first (Laravel signature)
await access('artisan');
analysis.language = 'PHP';
analysis.framework = 'Laravel';
analysis.buildSystem = 'composer';
analysis.commands.install = 'composer install';
analysis.commands.test = 'php artisan test';
analysis.commands.build = 'npm run build';
analysis.commands.dev = 'php artisan serve';
}
catch {
// No artisan, check composer.json for Laravel
try {
const composerContent = await readFile('composer.json', 'utf-8');
const composer = JSON.parse(composerContent);
if (composer.require?.['laravel/framework']) {
analysis.language = 'PHP';
analysis.framework = 'Laravel';
analysis.buildSystem = 'composer';
analysis.projectName = composer.name || 'laravel-project';
analysis.commands.install = 'composer install';
analysis.commands.test = 'php artisan test';
analysis.commands.build = 'npm run build';
analysis.commands.dev = 'php artisan serve';
}
}
catch {
// Not a Laravel project
}
}
}
async function checkDockerFiles(analysis) {
try {
await access('Dockerfile');
analysis.docker.hasDockerfile = true;
}
catch {
// No Dockerfile
}
// Check for Docker Compose files
const composeFiles = ['compose.yml', 'compose.yaml', 'docker-compose.yml', 'docker-compose.yaml'];
for (const file of composeFiles) {
try {
await access(file);
analysis.docker.hasCompose = true;
analysis.docker.composeFile = file;
break;
}
catch {
// Continue checking
}
}
}