98fe3a396a
fix(overview): 本周关键结果 / 异常事项·显示项目中文名替代 identifier
...
Build and Deploy / build-and-deploy (push) Successful in 1m1s
之前显示 aircore-sw-002 这种内部技术 ID 不易识别,改成 projectName
(如"RTC底软件框架"),跟其他列表风格保持一致。后端字段早已返回,仅
前端模板切换。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 16:12:59 +08:00
7b5a2a823c
fix(roi): 关闭 mock 营收 + 修 zod envBool 把 "false" 当 true 的 bug
...
Build and Deploy / build-and-deploy (push) Successful in 1m6s
变更:
- scheduler 加判断: MOCK_REVENUE_API=false 且 URL 仍指 /mock 时跳过 revenue cron,
避免对未挂载的端点 404 写错误日志
- config.ts 新增 envBool() preprocess: 替代 z.coerce.boolean(),
正确把 "false"/"0"/"no" 识别为 false (zod 默认所有非空串都是 true)
- 影响:AI_ENABLED 和 MOCK_REVENUE_API 两个 boolean env 现在按字面值生效
副作用:
- 数据库 1997 条 mock revenue + 5 条 unmapped 已清空 (mysql DELETE 手动执行)
- 项目级 ROI 现在显示真实状态: 成本来自 commit 估算, 产出 ¥0 (待业务方接入)
- 真实营收 API 就绪后只需改 REVENUE_API_BASE_URL 即可恢复 cron
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:41:00 +08:00
4a2ed8d414
feat(ui+perf): Editorial Data Console 重设计 + 接口性能 + ROI 权限锁
...
UI 重设计 (Editorial Data Console 风):
- 设计令牌系统: OKLCH 色彩 + Newsreader/Geist/JetBrains Mono 字体 + exp easing
- 全局表格基线 (.n-data-table 统一 editorial 风 + .table-shell 卡片容器)
- DataCard / Naive UI 主题对齐新 token (深墨青主色 + 暖琥珀强调)
- RoiDashboard: 3 KPI 卡片同字号 + chip 多色筛选 + section editorial 节奏
- ProjectRoiBoard: hero 卡 highlight + ytd-strip 节奏化 (10/13/15px 三层字号)
- ProjectList: 自适应卡片 + 产品线 NSelect 筛选 + 拆出独立"类型"列 + 文本链接操作
- RevenuePieChart 重设计: donut + 中心总额 + 底部水平图例 (替代外部 callout 截断)
- 全部页面 width:100% + clamp() 流体 padding,断点驱动 auto-fit 网格
- AppSidebar 项目子菜单按产品线分组 + 可折叠 + localStorage 持久化
接口性能优化 (N+1 → 批量 + Map 索引):
- /api/overview: 8.5s → 0.5s (17×) - 消除 3 处循环 SQL 查询
- /api/okr: 11.3s → 0.3s (37×) - getOKRByPeriod 一次性 inArray 批量
- ROI 三处时间窗 (aggregate/timeseries/events) launchedAt 截断对齐
ROI 权限锁:
- 全部 ROI 端点统一 admin (roiRoutes 全局 requireRole)
- 路由 /roi + /projects/:id/roi meta.roles=['admin']
- 侧边栏 ROI 入口 + 项目详情打标按钮/分类标签全部 v-if isAdmin
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:28:48 +08:00
5af612e3fd
feat(roi): ROI 动态规则引擎 v1 + 业务体系归属
...
后端:
- 事件流模型(project_cost_events / project_revenue_events)+ launchedAt 截断
- 3 大业务体系归属(airhubs/airflow/aircore) + 项目类型(hw/sw) + identifier 自动生成
- AI 三件套推荐(category + bizSystem + projectType)
- 营收 mock API + 外部对接规范 + 资产摊销 cron
- 5 个 migration(0003 ROI 引擎 / 0004 driver factors / 0005 biz system)
- 单测 11/11 过
前端:
- 项目级 ROI 看板:4 KPI 卡片 + 折线图(周/月/年)+ 成本/产出事件流并排
- 全公司决策罗盘:3 大 ROI 指标 + 业务线堆叠 + 分类筛选 chip
- 项目列表 + 侧边栏:按产品线分组(可折叠 + localStorage 持久化)
- Admin: ROI 策略配置 + 项目映射 + 未映射收容
数据:
- 23 项目全部 AI 自动分类 + 自动 identifier(airhubs-hw-001 这种)
- launchedAt 按各项目首次 commit 时间设置
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 13:20:22 +08:00
ad66228edc
fix: bcrypt 替换为 bcryptjs 修复 pod CrashLoopBackOff
...
Build and Deploy / build-and-deploy (push) Successful in 1m31s
oven/bun:1 镜像最近升到 bun 1.3.12,bcrypt 这个 native 模块的
prebuilt napi-v3/.node 二进制没装上,新 pod 启动时直接抛
"Cannot find module 'bcrypt_lib.node'" 死循环重启,旧 pod 一直没
被替换,env 变量、AI 同步代码都进不了线上。
bcryptjs 是纯 JS 实现,API 和哈希格式 (\$2a\$/\$2b\$) 与 bcrypt
完全兼容,可以直接读已有的密码 hash,避免 native binding 问题
反复踩坑。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 15:09:25 +08:00
08ec749cd8
feat(scheduler): 启动 + 跳过 AI 时写诊断日志到 sync_logs
...
Build and Deploy / build-and-deploy (push) Successful in 1m2s
加入两条诊断写入:
1. 服务启动时立刻写 [BOOT] 日志,包含 AI_ENABLED / AI_API_KEY 长度
/ AI_MODEL / AI_BASE_URL,可在 sync_logs UI 直接确认 pod 拿到
的环境变量
2. 每次 cron/手动触发若因 AI_ENABLED=false 或 AI_API_KEY 空被跳过,
写一条 status=error 的 ai_okr 日志说明跳过原因
这样不需要 kubectl logs 就能定位"为什么 AI 没跑"。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 14:35:10 +08:00
33b3a2208e
feat(okr-ai): AI 分析失败/空跑也写入 sync_logs
...
Build and Deploy / build-and-deploy (push) Successful in 1m30s
之前 AI 分析只在「有 commits 且全部成功」时写 success 日志,
出错走 .catch 只打 stdout、空跑直接 return 不写。导致 UI 同步日志页
看不出 AI 是否真的跑过、为什么没产出。
改为:
- 空跑写 success(带 "No unanalyzed commits")
- 单仓库失败累计后写入 message 末尾
- 全仓库失败或外层异常写 status=error 并附 stack
- message 截断到 1000 字符避免超长
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 13:40:04 +08:00
8561f6190d
fix(admin): 手动触发同步同时跑 AI OKR 分析
...
Build and Deploy / build-and-deploy (push) Successful in 1m5s
之前 /admin/sync/trigger 只调用 syncGitea,导致 UI 上点"触发同步"
按钮无论多少次,OKR 都不会被更新。改为同步完成后立即跑 AI 分析,
逻辑与 scheduler.ts 的定时任务保持一致。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 13:35:24 +08:00
0dcb9c02d3
fix(deploy): k8s backend 注入 AI 相关环境变量
...
Build and Deploy / build-and-deploy (push) Successful in 59m58s
生产环境 deployment 缺 AI_ENABLED/AI_API_KEY 等变量,导致 scheduler
里的 AI OKR 分析分支被跳过,cron 只跑了 gitea 同步而没触发 OKR 更新。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 11:19:52 +08:00
e1396b1479
feat(okr): 接入豆包AI自动分析Git提交生成OKR
...
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>
2026-04-27 13:29:36 +08:00
7cd8bc1b9b
feat: 同步全部分支的 Git 提交,不再仅限默认分支
...
Build and Deploy / build-and-deploy (push) Successful in 46m54s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-21 10:57:04 +08:00
4fa69ca2bc
fix: 项目明细 OKR 任务描述过长撑破栅格布局
...
Build and Deploy / build-and-deploy (push) Successful in 1m8s
grid-template-columns 默认 1fr 的 min-content 下限会被超长不换行中文撑开,
改为 minmax(0,1fr) 让列可正常收缩;kr-name 改为 2 行 line-clamp,
避免单行省略把描述几乎全部隐藏。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 17:21:55 +08:00
512d3baca2
feat: 开发者可编辑项目、侧边栏项目列表优化、筛选器UI改进
...
Build and Deploy / build-and-deploy (push) Successful in 1m1s
- 新增 PATCH /api/projects/:id 开发者有权限可编辑项目
- 侧边栏项目列表改用项目API直接拉取,路由切换时自动刷新
- 项目筛选器和权限分配下拉框只显示项目名称,标签自动折叠
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:02:42 +08:00
18e3ee18da
fix: 删除项目时先清理关联数据,避免外键约束报错
...
Build and Deploy / build-and-deploy (push) Successful in 1m2s
- 删除项目前清理 userProjectPermissions、projectRepos、OKR 数据
- 修复 admin 和普通路由两处删除逻辑
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 13:46:31 +08:00
17696f9049
perf: Nginx 开启 gzip 压缩和静态资源缓存,加速首次加载
...
Build and Deploy / build-and-deploy (push) Successful in 1m2s
- gzip 压缩 JS/CSS/JSON 等资源(676KB→226KB)
- /assets/ 静态文件设置 1 年缓存(文件名含 hash)
- index.html 设置 no-cache 确保更新及时
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 11:43:15 +08:00
feb305c454
feat(权限): 开发者也支持项目级权限,创建项目自动获得权限
...
Build and Deploy / build-and-deploy (push) Successful in 1m31s
- 开发者与观察者统一逻辑:未分配项目则无法查看数据
- 开发者创建项目时自动获得该项目的查看权限
- 管理员可在用户管理页面为开发者分配项目
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 11:33:01 +08:00
10ed4f090d
feat: 项目编辑、成员编辑、性能优化及UI改进
...
Build and Deploy / build-and-deploy (push) Successful in 1m2s
- 新增项目编辑功能(修改名称、标识)
- 团队成员页面增加编辑按钮(管理员可修改姓名、邮箱、角色)
- 项目详情接口性能优化:批量查询替代N+1,Git数据按仓库名过滤(8s→0.2s)
- 侧边栏和图表改为显示项目名称而非标识
- 同步日志按时间倒序排列
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 11:21:48 +08:00
4283824533
feat(权限): 观察者角色支持项目级查看权限
...
Build and Deploy / build-and-deploy (push) Successful in 1m37s
- 新增 user_project_permissions 表,管理观察者可查看的项目
- 管理员可在用户管理页面为观察者分配项目权限
- 所有数据接口(总览、项目、OKR、Git活动)按分配的项目过滤
- 未分配项目的观察者看到空数据
- 同步日志按时间倒序排列
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 10:33:11 +08:00
d6dc0a882e
fix: keep docker build cache, remove builder prune -a
Build and Deploy / build-and-deploy (push) Successful in 1m19s
2026-04-13 19:39:55 +08:00
becc3b34d1
ci: test kubectl mount after runner restart
Build and Deploy / build-and-deploy (push) Successful in 1m8s
2026-04-13 19:30:52 +08:00
7601ca5443
fix: detect mounted kubectl first, skip download
Build and Deploy / build-and-deploy (push) Successful in 5s
2026-04-13 19:27:25 +08:00
c6d5a1c935
fix: use mounted kubectl, fallback to official dl.k8s.io
Build and Deploy / build-and-deploy (push) Has been cancelled
2026-04-13 19:23:46 +08:00
b8ecaf44d0
fix: add production domain to CORS whitelist
Build and Deploy / build-and-deploy (push) Has been cancelled
2026-04-13 18:52:54 +08:00
7b8f4331f6
debug: add kubeconfig diagnostics to CI
Build and Deploy / build-and-deploy (push) Successful in 1m20s
2026-04-13 17:54:48 +08:00
8e2b1c04e7
fix: kubeconfig use base64 decode
Build and Deploy / build-and-deploy (push) Failing after 3m13s
2026-04-13 17:49:14 +08:00
88f6614fd3
ci: trigger redeploy with updated kubeconfig
Build and Deploy / build-and-deploy (push) Has been cancelled
2026-04-13 17:38:00 +08:00
d8204c8572
feat: HTTP→HTTPS 自动跳转
...
Build and Deploy / build-and-deploy (push) Successful in 1m8s
- 新增 redirect-https-middleware.yaml(Traefik Middleware)
- Ingress 加 traefik.ingress.kubernetes.io/router.middlewares annotation
- CI 流水线在 Ingress 之前 apply middleware
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:50:06 +08:00
43f885e22a
feat: MySQL 远程数据库 + CI/CD 流水线 + K8s 部署配置
...
数据库迁移:
- SQLite → MySQL (mysql-8351f937d637-public.rds.volces.com)
- Schema 从 drizzle-orm/sqlite-core 改为 drizzle-orm/mysql-core
- 全量数据迁移完成(13 张表 525 条记录)
CI/CD 流水线:
- .gitea/workflows/deploy.yaml(airlabs 分支触发)
- 前后端分别构建镜像推到火山引擎 CR internal 命名空间
- 自动部署到内部 K3s 集群
K8s 配置:
- backend-deployment.yaml(Bun 3200 端口 + MySQL 私网连接)
- web-deployment.yaml(Nginx 80 端口 + SPA fallback)
- backend-ingress.yaml(devperf-api.airlabs.art + TLS)
- web-ingress.yaml(devperf.airlabs.art + TLS)
- cert-manager-issuer.yaml(Let's Encrypt)
其他:
- 前端 Dockerfile 支持 VITE_API_BASE_URL 构建参数
- 后端 Dockerfile 改为直接运行源码(兼容 mysql2)
- 侧边栏/全局样式优化 + Git 图表修复
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 13:48:54 +08:00
58fe2b1ea8
feat: OKR看板重设计 + 周切换 + 恢复选日期 + 项目列表优化
...
- OKR看板:按项目分组大卡片 + 目标/任务折叠展开 + 统计栏 + 按项目筛选
- KR状态文本标签(已取消/已暂停/已延期)替代emoji
- 本周关键结果支持前后周切换(‹ 本周 ›)+ 日期范围显示
- 恢复暂停任务时必须选择新截止日期
- 项目列表仓库名只显示短名不显示完整URL
- 项目详情标题合并到进度条卡片内
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 15:07:37 +08:00
f88e2d9ab0
feat: KR 状态管理(延期/暂停/恢复/取消)+ 操作日志 + 异常事项面板
...
- KR 新增 status 字段(active/paused/cancelled)+ kr_logs 操作日志表
- 每个 KR 支持延期(选新日期+原因)、暂停、恢复、取消操作
- 延期过的 KR 显示蓝色「已延期」标签
- 暂停/取消的 KR 不计入目标进度
- 操作日志弹窗:时间线展示所有变更记录
- 团队总览「异常事项」面板:展示逾期/暂停/取消的 KR 及原因
- 本周关键结果面板正确显示取消/暂停状态
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 14:15:55 +08:00
246410e12c
feat: 自动同步每天两次(02:00+19:00) + 启动时首次同步
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 10:54:46 +08:00
690766528a
feat: 团队总览改版 + OKR 创建简化 + 时区修复
...
- 总览页6面板:项目OKR进度/KR状态/本周关键结果/代码活动/历史逾期/最近提交
- 去掉PR合入时间和产品线进度(重复),新增历史逾期未完成和最近提交动态
- OKR创建简化:目标只需标题+负责人,时间自动从任务推算
- KR创建简化:只需任务内容+起止时间,去掉目标值/单位/权重
- 修复时区问题:日期选择器UTC偏移导致少1天
- 今天截止显示橙色标签,已逾期红色,进行中蓝色
- DataCard支持自定义header slot
- 目标时间范围自动取任务最早开始~最晚截止
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 10:45:08 +08:00
44464dd334
feat: DevPerf Dashboard 研发人效看板 v1.0
...
- 后端:Bun + Hono + Drizzle ORM + SQLite
- 前端:Vue 3 + Naive UI + ECharts
- 项目管理:创建项目 + 绑定 Git 仓库
- OKR 系统:目标/关键结果 CRUD + 进度追踪
- Git 同步:Gitea API 自动同步 commit/PR + 作者关联
- 数据看板:项目 OKR 进度 + KR 状态分布 + 代码活动
- 权限体系:admin/manager/developer/viewer 四级
- Docker 部署:docker-compose + nginx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 17:57:14 +08:00