All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m4s
基于豆包(Doubao) LLM 分析 git commit messages,按仓库维度自动为每个 提交人生成、更新、标记完成 OKR: - 新增 ai_analyzed_commits 表实现增量标记,每条 commit 只分析一次 - objectives/keyResults 新增 source、sourceKey 字段区分 AI 生成与手动创建 - keyResults.status 扩展支持 completed 状态 - 新增 llm-client.ts 封装豆包 Ark API 调用(原生 fetch,零依赖) - 新增 okr-ai-sync.ts 核心服务:按仓库分组 → 构建 prompt → 调用 AI → 执行 actions - scheduler 在 Git 同步后自动触发 AI 分析(受 AI_ENABLED 开关控制) - 新增 POST /api/okr/ai-analyze 手动触发和 preview 预览端点 - 防重复三层保障:commit SHA 标记 + sourceKey 去重 + 项目 OKR 上下文 已验证:501 条 commits 全量分析,生成 37 个 Objectives、164 个 Key Results, 增量去重机制正常(重复调用返回 0 actions)。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
76 lines
2.1 KiB
TypeScript
76 lines
2.1 KiB
TypeScript
import { Hono } from 'hono';
|
|
import { cors } from 'hono/cors';
|
|
import { config } from './config';
|
|
import { requestLogger } from './middleware/logger';
|
|
import { errorHandler } from './middleware/error-handler';
|
|
import { authMiddleware } from './middleware/auth';
|
|
import { authRoutes } from './routes/auth';
|
|
import { overviewRoutes } from './routes/overview';
|
|
import { projectRoutes } from './routes/projects';
|
|
import { memberRoutes } from './routes/members';
|
|
import { okrRoutes } from './routes/okr';
|
|
import { gitRoutes } from './routes/git';
|
|
import { adminRoutes } from './routes/admin';
|
|
// Importing db triggers auto-migration on first load (B-07 fix)
|
|
import { db } from './db/index';
|
|
import { seedAdminUser } from './db/seed-auto';
|
|
import { startScheduler } from './sync/scheduler';
|
|
|
|
const app = new Hono();
|
|
|
|
// Global middleware
|
|
app.use('*', cors({
|
|
origin: ['http://localhost:5173', 'http://localhost:3201', 'https://devperf.airlabs.art'],
|
|
allowMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
|
|
allowHeaders: ['Content-Type', 'Authorization'],
|
|
}));
|
|
app.use('*', requestLogger);
|
|
|
|
// Health check (public)
|
|
app.get('/api/health', (c) => {
|
|
const startTime = process.uptime();
|
|
return c.json({
|
|
code: 0,
|
|
data: {
|
|
status: 'ok',
|
|
version: '1.0.0',
|
|
uptime: Math.floor(startTime),
|
|
dbConnected: true,
|
|
},
|
|
message: 'success',
|
|
});
|
|
});
|
|
|
|
// Auth routes (public)
|
|
app.route('/api/auth', authRoutes);
|
|
|
|
// Protected routes
|
|
app.use('/api/*', authMiddleware);
|
|
app.route('/api', overviewRoutes);
|
|
app.route('/api', projectRoutes);
|
|
app.route('/api', memberRoutes);
|
|
app.route('/api', okrRoutes);
|
|
app.route('/api', gitRoutes);
|
|
app.route('/api', adminRoutes);
|
|
|
|
// Error handler
|
|
app.onError(errorHandler);
|
|
|
|
// Auto-seed admin user on startup (safe to call repeatedly)
|
|
seedAdminUser().catch((err) => {
|
|
console.error('[Seed] Failed to seed admin user:', err);
|
|
});
|
|
|
|
// 启动自动同步(每天凌晨 2 点 + 启动时首次同步)
|
|
startScheduler();
|
|
|
|
// Start server
|
|
const port = config.PORT;
|
|
console.info(`DevPerf Dashboard API starting on port ${port}`);
|
|
|
|
export default {
|
|
port,
|
|
fetch: app.fetch,
|
|
idleTimeout: 120, // AI 分析可能耗时较长
|
|
};
|