feat: 初始化项目结构并添加核心功能模块
- 新增文档模板和导航结构 - 实现服务器基础API路由和控制器 - 添加扩展插件配置和前端框架 - 引入多租户和权限管理模块 - 集成日志和数据库配置 - 添加核心业务模型和类型定义
This commit is contained in:
249
scripts/sync-check.js
Normal file
249
scripts/sync-check.js
Normal file
@@ -0,0 +1,249 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* 🔄 代码-看板同步检查脚本 (Node.js版本)
|
||||
* 用途:自动检查服务类实现与协作看板任务的同步状态
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
// 配置参数
|
||||
const SERVICES_DIR = 'server/src/services';
|
||||
const BOARD_FILE = 'docs/08-governance/collaboration-board.md';
|
||||
const REPORT_FILE = 'docs/sync-status-report.md';
|
||||
|
||||
// 颜色定义
|
||||
const colors = {
|
||||
red: '\x1b[31m',
|
||||
green: '\x1b[32m',
|
||||
yellow: '\x1b[33m',
|
||||
blue: '\x1b[34m',
|
||||
reset: '\x1b[0m'
|
||||
};
|
||||
|
||||
function log(message, color = 'reset') {
|
||||
console.log(`${colors[color]}${message}${colors.reset}`);
|
||||
}
|
||||
|
||||
function findServiceFiles() {
|
||||
const servicesPath = path.join(__dirname, '..', SERVICES_DIR);
|
||||
const files = [];
|
||||
|
||||
function scanDirectory(dir) {
|
||||
const items = fs.readdirSync(dir);
|
||||
|
||||
for (const item of items) {
|
||||
const fullPath = path.join(dir, item);
|
||||
const stat = fs.statSync(fullPath);
|
||||
|
||||
if (stat.isDirectory()) {
|
||||
scanDirectory(fullPath);
|
||||
} else if (item.endsWith('Service.ts')) {
|
||||
files.push(fullPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
scanDirectory(servicesPath);
|
||||
return files;
|
||||
}
|
||||
|
||||
function extractServiceClasses(files) {
|
||||
const services = [];
|
||||
|
||||
for (const file of files) {
|
||||
const content = fs.readFileSync(file, 'utf8');
|
||||
const serviceMatch = content.match(/export class (\w+Service)/);
|
||||
|
||||
if (serviceMatch) {
|
||||
services.push(serviceMatch[1]);
|
||||
}
|
||||
}
|
||||
|
||||
return services.sort();
|
||||
}
|
||||
|
||||
function extractBoardTasks() {
|
||||
const boardContent = fs.readFileSync(BOARD_FILE, 'utf8');
|
||||
|
||||
// 改进的任务提取正则表达式
|
||||
// 匹配格式: [TASK_ID] 描述文字 (ServiceName)
|
||||
const taskRegex = /\[([A-Z_0-9]+)\][^\n]*\(([A-Za-z]+Service)\)/g;
|
||||
const tasks = [];
|
||||
let match;
|
||||
|
||||
while ((match = taskRegex.exec(boardContent)) !== null) {
|
||||
// 同时提取任务ID和服务名
|
||||
const taskId = match[1];
|
||||
const serviceName = match[2];
|
||||
tasks.push({ taskId, serviceName });
|
||||
}
|
||||
|
||||
// 返回服务名列表
|
||||
return [...new Set(tasks.map(t => t.serviceName))].sort();
|
||||
}
|
||||
|
||||
function generateSyncReport(services, tasks) {
|
||||
const missingTasks = services.filter(service => !tasks.includes(service));
|
||||
const extraTasks = tasks.filter(task => !services.includes(task));
|
||||
|
||||
const serviceCount = services.length;
|
||||
const taskCount = tasks.length;
|
||||
const missingCount = missingTasks.length;
|
||||
const extraCount = extraTasks.length;
|
||||
const coverage = serviceCount > 0 ? Math.round((serviceCount - missingCount) * 100 / serviceCount) : 0;
|
||||
|
||||
// 生成报告内容
|
||||
const reportContent = `# 📊 代码-看板同步状态报告
|
||||
|
||||
> **生成时间**: ${new Date().toLocaleString('zh-CN')}
|
||||
> **检查范围**: 服务类实现与协作看板任务同步状态
|
||||
|
||||
---
|
||||
|
||||
## 📋 同步概览
|
||||
|
||||
| 指标 | 数量 | 状态 |
|
||||
|------|------|------|
|
||||
| 服务类总数 | ${serviceCount} | ✅ |
|
||||
| 看板任务数 | ${taskCount} | ✅ |
|
||||
| 遗漏任务数 | ${missingCount} | ${missingCount === 0 ? '✅' : '❌'} |
|
||||
| 多余任务数 | ${extraCount} | ${extraCount === 0 ? '✅' : '❌'} |
|
||||
| 同步覆盖率 | ${coverage}% | ${missingCount === 0 ? '✅' : '⚠️'} |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 详细分析
|
||||
|
||||
${missingCount > 0 ? `### ❌ 遗漏任务 (${missingCount} 个)
|
||||
|
||||
以下服务类已实现但未在协作看板中:
|
||||
|
||||
${missingTasks.map(task => `- ${task}`).join('\n')}
|
||||
` : '### ✅ 无遗漏任务'}
|
||||
|
||||
${extraCount > 0 ? `### ⚠️ 多余任务 (${extraCount} 个)
|
||||
|
||||
以下任务在看板中存在但代码未实现:
|
||||
|
||||
${extraTasks.map(task => `- ${task}`).join('\n')}
|
||||
` : '### ✅ 无多余任务'}
|
||||
|
||||
---
|
||||
|
||||
## 🚀 同步建议
|
||||
|
||||
### 立即行动
|
||||
${missingCount > 0 ? '1. **补充遗漏任务**:将遗漏的服务类添加到协作看板\n' : ''}${extraCount > 0 ? '2. **清理多余任务**:删除或标记未实现的任务\n' : ''}
|
||||
### 长期优化
|
||||
1. **建立同步机制**:每次代码提交后自动检查同步状态
|
||||
2. **定期审查**:每周执行一次全面同步检查
|
||||
3. **自动化工具**:开发更智能的同步检查工具
|
||||
|
||||
---
|
||||
|
||||
## 📈 同步健康度
|
||||
|
||||
**总体同步状态**: ${missingCount === 0 && extraCount === 0 ? '✅ 优秀' : missingCount <= 3 && extraCount <= 3 ? '⚠️ 良好' : '❌ 需要改进'}
|
||||
|
||||
**建议优先级**: ${missingCount > 5 ? '高' : missingCount > 2 ? '中' : '低'}
|
||||
|
||||
---
|
||||
|
||||
## 🔧 使用说明
|
||||
|
||||
### 手动运行
|
||||
\`\`\`bash
|
||||
node scripts/sync-check.js
|
||||
\`\`\`
|
||||
|
||||
### 集成到 CI/CD
|
||||
\`\`\`yaml
|
||||
# 在 CI 配置中添加
|
||||
- name: 代码-看板同步检查
|
||||
run: node scripts/sync-check.js
|
||||
\`\`\`
|
||||
|
||||
### 定期检查
|
||||
建议每周运行一次,确保代码与看板保持同步。
|
||||
`;
|
||||
|
||||
return {
|
||||
serviceCount,
|
||||
taskCount,
|
||||
missingCount,
|
||||
extraCount,
|
||||
coverage,
|
||||
missingTasks,
|
||||
extraTasks,
|
||||
reportContent
|
||||
};
|
||||
}
|
||||
|
||||
function main() {
|
||||
log('🔍 开始代码-看板同步检查...', 'blue');
|
||||
log('==========================================', 'blue');
|
||||
|
||||
try {
|
||||
// 1. 扫描所有服务类
|
||||
const serviceFiles = findServiceFiles();
|
||||
const services = extractServiceClasses(serviceFiles);
|
||||
log(`✅ 发现 ${services.length} 个服务类`, 'green');
|
||||
|
||||
// 2. 从看板提取任务列表
|
||||
const tasks = extractBoardTasks();
|
||||
log(`✅ 发现 ${tasks.length} 个看板任务`, 'green');
|
||||
|
||||
// 3. 生成同步报告
|
||||
const report = generateSyncReport(services, tasks);
|
||||
|
||||
// 4. 保存报告
|
||||
fs.writeFileSync(REPORT_FILE, report.reportContent);
|
||||
|
||||
// 5. 输出结果
|
||||
log('==========================================', 'blue');
|
||||
log('✅ 同步检查完成!', 'green');
|
||||
log(`📊 报告位置: ${REPORT_FILE}`, 'blue');
|
||||
|
||||
if (report.missingCount > 0) {
|
||||
log(`❌ 发现 ${report.missingCount} 个遗漏任务:`, 'red');
|
||||
report.missingTasks.forEach(task => log(` - ${task}`, 'red'));
|
||||
} else {
|
||||
log('✅ 无遗漏任务', 'green');
|
||||
}
|
||||
|
||||
if (report.extraCount > 0) {
|
||||
log(`⚠️ 发现 ${report.extraCount} 个多余任务:`, 'yellow');
|
||||
report.extraTasks.forEach(task => log(` - ${task}`, 'yellow'));
|
||||
} else {
|
||||
log('✅ 无多余任务', 'green');
|
||||
}
|
||||
|
||||
// 6. 显示同步状态摘要
|
||||
if (report.missingCount === 0 && report.extraCount === 0) {
|
||||
log('🎉 完美同步!代码与看板完全一致', 'green');
|
||||
} else if (report.missingCount <= 3 && report.extraCount <= 3) {
|
||||
log('⚠️ 同步良好,有少量差异需要处理', 'yellow');
|
||||
} else {
|
||||
log('❌ 同步问题严重,需要立即处理', 'red');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
log(`❌ 同步检查失败: ${error.message}`, 'red');
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// 如果是直接运行此文件
|
||||
if (require.main === module) {
|
||||
main();
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
findServiceFiles,
|
||||
extractServiceClasses,
|
||||
extractBoardTasks,
|
||||
generateSyncReport
|
||||
};
|
||||
Reference in New Issue
Block a user