Optimized the root .gitignore to exclude virtual environments, node modules, and temp folders to ensure clean and lightweight version tracking. Co-authored-by: Cursor <cursoragent@cursor.com>
154 lines
3.8 KiB
JavaScript
154 lines
3.8 KiB
JavaScript
#!/usr/bin/env node
|
||
|
||
/**
|
||
* 代码检查命令行工具
|
||
*
|
||
* 使用方法:
|
||
* node scripts/code-review.js prototypes/landing-page
|
||
* node scripts/code-review.js components/button
|
||
*
|
||
* 或者在 package.json 中添加脚本:
|
||
* "review": "node scripts/code-review.js"
|
||
*/
|
||
|
||
import http from 'http';
|
||
|
||
// 从命令行参数获取要检查的路径
|
||
const targetPath = process.argv[2];
|
||
|
||
if (!targetPath) {
|
||
console.error('❌ 错误:缺少路径参数');
|
||
console.log('\n使用方法:');
|
||
console.log(' node scripts/code-review.js prototypes/landing-page');
|
||
console.log(' node scripts/code-review.js components/button');
|
||
process.exit(1);
|
||
}
|
||
|
||
// 配置
|
||
const HOST = 'localhost';
|
||
const PORT = 51720;
|
||
|
||
// 发送检查请求
|
||
function reviewCode(targetPath) {
|
||
return new Promise((resolve, reject) => {
|
||
const postData = JSON.stringify({ path: targetPath });
|
||
|
||
const options = {
|
||
hostname: HOST,
|
||
port: PORT,
|
||
path: '/api/code-review',
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'Content-Length': Buffer.byteLength(postData)
|
||
}
|
||
};
|
||
|
||
const req = http.request(options, (res) => {
|
||
let data = '';
|
||
|
||
res.on('data', (chunk) => {
|
||
data += chunk;
|
||
});
|
||
|
||
res.on('end', () => {
|
||
try {
|
||
const result = JSON.parse(data);
|
||
resolve(result);
|
||
} catch (error) {
|
||
reject(new Error(`解析响应失败: ${error.message}`));
|
||
}
|
||
});
|
||
});
|
||
|
||
req.on('error', (error) => {
|
||
reject(new Error(`请求失败: ${error.message}\n请确保开发服务器正在运行 (npm run dev)`));
|
||
});
|
||
|
||
req.write(postData);
|
||
req.end();
|
||
});
|
||
}
|
||
|
||
// 格式化输出
|
||
function formatResult(result) {
|
||
console.log('\n' + '='.repeat(60));
|
||
console.log(`📋 检查文件: ${result.file}`);
|
||
console.log('='.repeat(60));
|
||
|
||
if (result.issues.length === 0) {
|
||
console.log('\n✅ 太棒了!代码完全符合规范,没有发现任何问题。\n');
|
||
return;
|
||
}
|
||
|
||
// 统计问题数量
|
||
const errors = result.issues.filter(issue => issue.type === 'error');
|
||
const warnings = result.issues.filter(issue => issue.type === 'warning');
|
||
|
||
console.log(`\n发现 ${errors.length} 个错误,${warnings.length} 个警告\n`);
|
||
|
||
// 输出错误
|
||
if (errors.length > 0) {
|
||
console.log('❌ 错误 (必须修复):');
|
||
console.log('-'.repeat(60));
|
||
errors.forEach((issue, index) => {
|
||
console.log(`\n${index + 1}. [${issue.rule}]`);
|
||
console.log(` ${issue.message}`);
|
||
if (issue.suggestion) {
|
||
console.log(` 💡 建议: ${issue.suggestion}`);
|
||
}
|
||
});
|
||
console.log();
|
||
}
|
||
|
||
// 输出警告
|
||
if (warnings.length > 0) {
|
||
console.log('⚠️ 警告 (建议修复):');
|
||
console.log('-'.repeat(60));
|
||
warnings.forEach((issue, index) => {
|
||
console.log(`\n${index + 1}. [${issue.rule}]`);
|
||
console.log(` ${issue.message}`);
|
||
if (issue.suggestion) {
|
||
console.log(` 💡 建议: ${issue.suggestion}`);
|
||
}
|
||
});
|
||
console.log();
|
||
}
|
||
|
||
// 总结
|
||
console.log('='.repeat(60));
|
||
if (result.passed) {
|
||
console.log('✅ 检查通过 (仅有警告,不影响使用)');
|
||
} else {
|
||
console.log('❌ 检查未通过 (存在错误,需要修复)');
|
||
}
|
||
console.log('='.repeat(60) + '\n');
|
||
}
|
||
|
||
// 主函数
|
||
async function main() {
|
||
console.log(`\n🔍 正在检查: ${targetPath}...\n`);
|
||
|
||
try {
|
||
const result = await reviewCode(targetPath);
|
||
|
||
if (result.error) {
|
||
console.error(`❌ 检查失败: ${result.error}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
formatResult(result);
|
||
|
||
// 如果有错误,退出码为 1
|
||
if (!result.passed) {
|
||
process.exit(1);
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error(`\n❌ ${error.message}\n`);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
main();
|