Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
183 commits
Select commit Hold shift + click to select a range
bd657f3
feat: 支持仪表盘数据自动刷新并完善项目架构
BingZi-233 Nov 11, 2025
01a429d
chore: 完善 .gitignore 配置并添加环境变量示例
BingZi-233 Nov 11, 2025
f1f3986
feat: 集成 Supabase 数据库替代本地文件存储
BingZi-233 Nov 11, 2025
d1b60d4
feat: 集成 Vercel Speed Insights 并优化健康检查为流式响应
BingZi-233 Nov 11, 2025
c46ff9f
perf: 优化健康检查 token 使用量
BingZi-233 Nov 11, 2025
944199a
fix: 修复数据库清理逻辑,按提供商保留最新 60 条记录
BingZi-233 Nov 12, 2025
dc0a7a8
feat: show refresh countdown
BingZi-233 Nov 12, 2025
cb47f97
fix: compute refresh countdown from server checks
BingZi-233 Nov 12, 2025
1c164f2
feat: cache ping results during poll interval
BingZi-233 Nov 12, 2025
8e628f2
chore: 为后台 ping 添加日志
BingZi-233 Nov 12, 2025
6f61988
chore: 丰富后台 ping 日志细节
BingZi-233 Nov 12, 2025
55b6e97
feat: 将 CHECK 配置从环境变量迁移到数据库
BingZi-233 Nov 12, 2025
c444726
refactor: 重构代码结构,采用分层架构设计
BingZi-233 Nov 13, 2025
413b20c
feat: use OpenAI SDK for provider health check
BingZi-233 Nov 13, 2025
8cb5687
chore: reuse OpenAI client via global cache
BingZi-233 Nov 13, 2025
9fdf850
feat: use Anthropic SDK with global client cache
BingZi-233 Nov 13, 2025
d3a2ce2
chore: auto commit
BingZi-233 Nov 13, 2025
9a90f54
feat: add endpoint ping telemetry
BingZi-233 Nov 14, 2025
ad8b4eb
fix: retry aborted provider requests
BingZi-233 Nov 14, 2025
11de674
fix: format dashboard times per timezone
BingZi-233 Nov 14, 2025
94508f8
fix: show version badge and stabilize countdown
BingZi-233 Nov 14, 2025
8a57e5b
feat: update UI
BingZi-233 Nov 14, 2025
10f80df
chore(deps): bump js-yaml from 4.1.0 to 4.1.1
dependabot[bot] Nov 16, 2025
53599e5
feat: 优化宽屏布局
BingZi-233 Nov 18, 2025
53698aa
feat: 新增官方状态监控功能
BingZi-233 Nov 18, 2025
9892f86
feat: 实现 Anthropic 官方状态检查
BingZi-233 Nov 18, 2025
4a1fb1d
refactor: 升级 Anthropic 状态检查使用 summary API
BingZi-233 Nov 18, 2025
8076739
docs: 完善代码注释与文档索引
BingZi-233 Nov 18, 2025
bdc1559
docs: 添加架构文档与数据库 schema
BingZi-233 Nov 18, 2025
9e3a18b
Merge pull request #1 from BingZi-233/dependabot/npm_and_yarn/js-yaml…
BingZi-233 Nov 18, 2025
142d332
docs: 全面重构 README 文档
BingZi-233 Nov 18, 2025
b16e992
feat: add LICENSE
BingZi-233 Nov 18, 2025
a84b60c
feat: enable analytics
BingZi-233 Nov 18, 2025
b4ab421
fix: Defect of premature delivery before retry is completed
BingZi-233 Nov 20, 2025
e091f54
feat: Version number changes
BingZi-233 Nov 20, 2025
47078da
feat: add hover card for official status
BingZi-233 Nov 20, 2025
13a081a
fix: ensure official status refreshes
BingZi-233 Nov 20, 2025
4e49e28
feat: 改进官方状态体验
BingZi-233 Nov 20, 2025
cb4352d
feat: 添加配置维护模式功能
BingZi-233 Nov 21, 2025
5d770f3
fix: 修复 OpenAI 官方状态受影响组件显示问题
BingZi-233 Nov 23, 2025
7ca16d6
refactor: 重构 Gemini 适配器使用 OpenAI 兼容接口
BingZi-233 Nov 23, 2025
e5750b3
chore: 升级版本至 v1.3.1
BingZi-233 Nov 23, 2025
7327010
fix: improve official status hover card on touch
BingZi-233 Nov 23, 2025
093955d
feat: show hover cards on timeline click
BingZi-233 Nov 23, 2025
07953ec
chore: 升级版本至 v1.3.2
BingZi-233 Nov 23, 2025
fe95884
fix: 修复 StatusTimeline 仅显示 55 条记录的问题
BingZi-233 Nov 24, 2025
42f5b88
feat: 添加自定义 User-Agent 配置功能
BingZi-233 Nov 24, 2025
9c3ab1e
feat: auto switch theme by local time
BingZi-233 Nov 25, 2025
08afb7d
feat: 添加首页分组功能
BingZi-233 Nov 25, 2025
a232ec3
fix: 修复分组面板移动端样式问题
BingZi-233 Nov 25, 2025
367d753
chore: 从 git 追踪中移除 .playwright-mcp 和 .mcp.json
BingZi-233 Nov 25, 2025
b067c40
fix: 修复 Next.js 16 中 Script beforeInteractive 策略报错
BingZi-233 Nov 25, 2025
6a5a707
feat: 添加分组详情页功能
BingZi-233 Nov 25, 2025
6c0391c
docs: 同步 README 文档至最新功能
BingZi-233 Nov 25, 2025
e9e3381
refactor: 统一健康快照服务并优化数据库查询性能
BingZi-233 Nov 27, 2025
1135a9d
fix: 修复 Supabase RPC 调用类型错误和 fallback 查询
BingZi-233 Nov 27, 2025
87afa78
feat: 添加可用性百分比统计显示
BingZi-233 Dec 2, 2025
093d710
feat: 添加可用性百分比统计显示
BingZi-233 Dec 2, 2025
764932b
fix: 优化 OpenAI 检查请求的消息结构
BingZi-233 Dec 2, 2025
f01c76b
refactor: 简化 endpoint 路径处理逻辑
BingZi-233 Dec 2, 2025
3d7d563
feat: 添加 OpenAI Responses API 支持并优化环境配置
BingZi-233 Dec 2, 2025
ed523af
fix: 禁用 SDK 客户端的 Next.js fetch 缓存
BingZi-233 Dec 2, 2025
3c9db7f
feat: 升级配置字段支持自定义请求头和请求参数
BingZi-233 Dec 2, 2025
cfb8b62
docs: 更新 README 中的仓库克隆地址
BingZi-233 Dec 2, 2025
481332e
chore: 同步数据库 schema 并简化环境配置
BingZi-233 Dec 2, 2025
56a5835
refactor: 统一客户端缓存管理并增强错误日志脱敏
BingZi-233 Dec 2, 2025
122ce58
docs: 更新 README 反映 v1.8.1 新特性
BingZi-233 Dec 2, 2025
4eac040
feat: 更新README示例
BingZi-233 Dec 3, 2025
315bae3
style: 全面重构 UI 为现代化设计风格
BingZi-233 Dec 3, 2025
d8b89c5
fix: 分离状态摘要中的延迟和异常计数
BingZi-233 Dec 3, 2025
eeb415b
chore: 升级至 v1.8.3,增加 API 超时时间至 30 秒
BingZi-233 Dec 3, 2025
f3e053f
chore: 升级至 v1.8.4,增强超时检测与动态版本号
BingZi-233 Dec 4, 2025
b02032b
feat: 添加 Vercel 和 Cloudflare Workers 部署支持
BingZi-233 Dec 4, 2025
7306f01
chore: 升级至 v1.8.5,优化响应式布局与添加 GitHub 链接
BingZi-233 Dec 4, 2025
44dfd8c
chore(deps): bump next from 16.0.1 to 16.0.7
dependabot[bot] Dec 4, 2025
ceea6f8
Merge pull request #2 from BingZi-233/dependabot/npm_and_yarn/next-16…
BingZi-233 Dec 4, 2025
90d4bd6
feat: 使用 next-themes 重构主题切换功能
BingZi-233 Dec 4, 2025
70a2525
style: 统一代码格式化风格
BingZi-233 Dec 4, 2025
826592d
feat: 添加 group_info 分组信息表
BingZi-233 Dec 4, 2025
a4693ca
feat: 添加 group_info 分组信息表及 RLS 策略
BingZi-233 Dec 4, 2025
2743785
fix: 修复状态徽章背景色类名替换逻辑
BingZi-233 Dec 5, 2025
8f3cfa1
docs: 更新 README 功能特性说明
BingZi-233 Dec 5, 2025
95b0037
feat: 添加 Supabase 管理员客户端绕过 RLS
BingZi-233 Dec 6, 2025
c693e84
fix: 统一延迟计算为首字延迟
BingZi-233 Dec 8, 2025
a11f9ad
feat: v1.12.0 - 添加分组拖拽排序及移动端优化
BingZi-233 Dec 8, 2025
7f63a4a
feat: v1.13.0 - 添加随机数学题验证防止固定回复绕过检测
BingZi-233 Dec 8, 2025
1b38d85
refactor: 重构 schema.sql 结构与格式
BingZi-233 Dec 7, 2025
ead965c
fix: v1.13.1 - 修复验证逻辑并添加对话调试日志
BingZi-233 Dec 8, 2025
b498cc8
fix: v1.13.2 - 优化 validation_failed 状态处理
BingZi-233 Dec 8, 2025
81dc02c
feat: v1.14.0 - 添加系统通知功能
BingZi-233 Dec 8, 2025
83a7601
fix: v1.14.1 - 优化验证失败消息,显示提取的数字而非原文
BingZi-233 Dec 8, 2025
03c8316
refactor: 使用 AI SDK 统一 Provider 检查实现
BingZi-233 Dec 9, 2025
a0de8d7
refactor: 简化 metadata 参数注入方式
BingZi-233 Dec 9, 2025
d717a64
refactor: v1.15.0 - 精简 AI SDK 检查模块代码
BingZi-233 Dec 9, 2025
53a25f9
fix: v1.15.1 - 使用 few-shot prompting 提升数学挑战验证成功率
BingZi-233 Dec 9, 2025
f94f7ed
feat: v1.15.2 - Dashboard 添加 validation_failed 状态统计显示
BingZi-233 Dec 9, 2025
9129110
feat: v1.15.3 - 通知横幅支持多条自动轮播
BingZi-233 Dec 9, 2025
2e52f35
feat: v1.16.0 - 新增状态查询 API 和页面加载进度条
BingZi-233 Dec 9, 2025
93b4720
docs: 更新 README 补充 v1.16.0 功能文档
BingZi-233 Dec 9, 2025
e9e4f97
feat: v1.16.1 - 新增 error 状态区分请求异常与验证失败
BingZi-233 Dec 10, 2025
aee95e6
refactor: 优化 ai-sdk-check 模块代码结构和注释
BingZi-233 Dec 10, 2025
fe9fb94
feat: v1.16.2 - 新增检查并发数控制
BingZi-233 Dec 10, 2025
9b414c0
feat: 品牌定制与文档同步更新
BingZi-233 Dec 11, 2025
7bde652
fix: 修复 favicon.png 不显示问题
BingZi-233 Dec 11, 2025
20f6abb
chore: 升级依赖包版本
BingZi-233 Dec 11, 2025
ffbce80
style: 优化页脚布局与版权信息展示
BingZi-233 Dec 11, 2025
c698f77
chore: 升级依赖包版本
BingZi-233 Dec 12, 2025
8b39630
fix: 修复自定义请求头无法覆盖 SDK 默认值的问题
BingZi-233 Dec 15, 2025
5da0dc2
style: 优化分组页面移动端响应式布局
BingZi-233 Dec 15, 2025
090dfc1
fix: 修复 OpenAI SDK chat 模型调用方式及端点处理逻辑
BingZi-233 Jan 2, 2026
89549d6
chore: 添加 Docker 构建及 compose 配置
BingZi-233 Jan 3, 2026
4cfdd8c
chore: 移除 Cloudflare 部署配置
BingZi-233 Jan 11, 2026
a90be5a
feat: 添加分组搜索功能及 OpenSpec 配置
BingZi-233 Jan 13, 2026
d81bb3f
feat: 扩展历史数据保留功能,新增可用性统计与趋势图
BingZi-233 Jan 13, 2026
de39232
fix: 删除旧版 prune_check_history 函数避免重载冲突
BingZi-233 Jan 13, 2026
46a38c9
refactor: 使用 recharts 重构趋势图组件
BingZi-233 Jan 13, 2026
a381e27
feat: 为维护模式添加专用 UI 展示样式
BingZi-233 Jan 13, 2026
f97cbb7
feat: 添加双层缓存优化 - 前端 SWR + CDN ETag
BingZi-233 Jan 14, 2026
57ac3a2
feat: 优化趋势图密度 - 智能采样保留关键点
BingZi-233 Jan 14, 2026
9e1deba
feat: 添加零停机部署脚本
BingZi-233 Jan 14, 2026
f427eb4
fix: 添加 favicon.png 到 public 目录支持直接访问
BingZi-233 Jan 14, 2026
eb6d309
fix: 修复 React 水合错误 #418 - 时区不一致问题
BingZi-233 Jan 14, 2026
3cb5f41
feat: 推迟首次检测至第一个轮询周期
BingZi-233 Jan 14, 2026
454686f
feat: 减少趋势图最大显示点数至 30
BingZi-233 Jan 14, 2026
7f44d36
fix: 修复 Recharts 图表初始渲染时宽高为 -1 的警告
BingZi-233 Jan 14, 2026
82f4d45
feat: 实现多节点轮询单主选举机制
BingZi-233 Jan 14, 2026
efdec42
feat: 为分组添加标签展示功能
BingZi-233 Jan 14, 2026
70e185a
style: 优化分组标签布局,与标题同行显示
BingZi-233 Jan 14, 2026
21af03e
chore: 从 git 中移除 openspec/changes 目录
BingZi-233 Jan 14, 2026
7c85900
fix: 修复趋势图采样算法在关键点过多时超出限制的问题
BingZi-233 Jan 14, 2026
e1601f8
docs: refresh README and docs
BingZi-233 Jan 15, 2026
e8db197
refactor: 收敛 admin client 类型并清理死代码
BingZi-233 Jan 15, 2026
6e61682
fix: show search icon
BingZi-233 Jan 15, 2026
9bc58c3
fix: 优化缓存命中与刷新并升级版本
BingZi-233 Jan 15, 2026
e375bd5
feat: 添加 GitHub Actions 自动构建 Docker 镜像
BingZi-233 Jan 15, 2026
113d63f
feat: 添加 git-bump 和 git-push 自定义命令
BingZi-233 Jan 16, 2026
9928fb4
refactor: 移除浏览器端 Supabase 客户端,统一使用服务端渲染 (v1.20.1)
BingZi-233 Jan 16, 2026
c6da46b
refactor: CI 仅在发布 tag 时构建镜像,deploy 改为拉取预构建镜像
BingZi-233 Jan 16, 2026
7b74ba6
fix: 移除 arm64 架构构建,解决 QEMU 模拟导致的构建超时问题
BingZi-233 Jan 16, 2026
da06820
style: 调整标签颜色数组顺序
rakuyoMo Jan 17, 2026
8725d41
feat: 添加分组排序功能,支持按标签/名称排序
rakuyoMo Jan 17, 2026
2b7e81d
fix: 修复全局缓存内存泄漏,添加 TTL 和 LRU 清理机制 (v1.20.2)
BingZi-233 Jan 19, 2026
49113cf
Merge pull request #15 from rakuyoMo/feature/group-tag-colors
BingZi-233 Jan 19, 2026
4bed244
Merge pull request #14 from rakuyoMo/feature/sort-providers
BingZi-233 Jan 19, 2026
3bbf708
chore: bump version to 1.20.3
BingZi-233 Jan 19, 2026
a860be7
feat: 非自定义排序模式下,禁用拖拽排序
rakuyoMo Jan 19, 2026
a5f1f46
feat: 仅在自定义模式使用自定义排序数据源
rakuyoMo Jan 19, 2026
4af557a
perf: 优化趋势数据查询性能,从39秒降至4秒 (v1.20.4)
BingZi-233 Jan 19, 2026
985d287
ci: 精简 Docker tags,只保留精确版本号 (v1.20.5)
BingZi-233 Jan 19, 2026
7d67dbd
Merge pull request #16 from rakuyoMo/fix/disable-drag-in-sort-modes
BingZi-233 Jan 20, 2026
0ba30f1
docs: 完善项目文档并重构Dashboard骨架屏 (v1.20.6)
BingZi-233 Jan 20, 2026
f0d93a6
feat: 添加标签分组筛选功能并支持本地持久化
h7ml Jan 21, 2026
c4184af
refactor: 重构Dashboard数据层与前端缓存系统 (v1.20.7)
BingZi-233 Jan 23, 2026
7aff127
refactor: 优化内部API安全性与数据库查询稳定性 (v1.20.8)
BingZi-233 Jan 23, 2026
1d4306a
perf: 优化标签筛选性能并统一标签解析方法
BingZi-233 Jan 23, 2026
ce3ac69
refactor: 移除 includeDetails 参数,简化 Dashboard 数据接口 (v1.20.9)
BingZi-233 Jan 23, 2026
104e875
Merge pull request #1 from BingZi-233/fix/pr17-improvements
h7ml Jan 23, 2026
1bd7a00
Merge branch 'master' of github.com:BingZi-233/check-cx
h7ml Jan 23, 2026
99562fc
Merge pull request #17 from h7ml/master
BingZi-233 Jan 24, 2026
b31a20a
refactor: 优化可用性百分比颜色为渐变色 (v1.20.10)
BingZi-233 Jan 26, 2026
e884794
chore(deps): bump next from 16.0.10 to 16.1.5
dependabot[bot] Jan 27, 2026
3179dd3
Merge pull request #18 from BingZi-233/dependabot/npm_and_yarn/next-1…
BingZi-233 Feb 3, 2026
4d934f5
feat: 添加原生 Gemini RPC 格式支持
BingZi-233 Feb 16, 2026
5ae6192
feat: add typed request templates for check configs
BingZi-233 Mar 4, 2026
993f612
chore: bump dependencies
BingZi-233 Mar 4, 2026
a2ee0c3
fix: tighten Gemini hostname regex and bump version to 1.21.2
BingZi-233 Mar 4, 2026
2e6c7aa
fix: 修复时间线 HoverCard 交替闪烁问题
Calderic Mar 6, 2026
f5de606
fix: 保留检查请求中的 endpoint 查询参数
BingZi-233 Mar 9, 2026
5e8add3
fix: optimize failure logging
BingZi-233 Mar 9, 2026
cc474d4
fix: repair release build
BingZi-233 Mar 9, 2026
f86c8b2
Merge pull request #22 from Calderic/master
BingZi-233 Mar 9, 2026
e88b309
feat(database): extract check models into dedicated table
BingZi-233 Mar 22, 2026
c907996
refactor(database): link templates through models
BingZi-233 Mar 22, 2026
4bb8ca2
chore(release): bump version to v1.21.6
BingZi-233 Mar 22, 2026
a1362fc
chore: upgrade dependencies and bump to v1.21.7
BingZi-233 Mar 22, 2026
3a1ac26
docs: refine README and add project links
BingZi-233 Mar 23, 2026
917a9c5
fix: add instrumentation.ts to initialize poller in Docker standalone…
cyanmst Mar 23, 2026
19192b1
Fix availability stats to include degraded checks
BingZi-233 Mar 25, 2026
1d6f07b
chore: upgrade dependencies
BingZi-233 Apr 9, 2026
7fcf6e8
feat: replace official status HoverCard with inline banner
BingZi-233 Apr 9, 2026
fbb39d1
Merge pull request #26 from cyanmst/fix/docker-standalone-poller-init
BingZi-233 Apr 9, 2026
d0aec8f
feat(ui): improve provider card layout for better model name visibility
BingZi-233 Apr 17, 2026
72b9fde
feat(ui): strengthen provider metadata visibility on card
BingZi-233 Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .claude/commands/git-bump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
name: git-bump
description: 一键版本升级并 git 提交
category: Release
tags: [version, git, release]
---

**一键版本升级**

自动递增 patch 版本并提交。

**立即执行以下操作,无需确认**:

1. 读取 `package.json` 中的 `version` 字段
2. 递增 patch 版本 (例: 1.20.0 → 1.20.1)
3. 使用 Edit 工具更新 `package.json`
4. 执行 `git add -A` 暂存所有变更
5. 执行 `git diff --cached --stat` 查看暂存区的变更文件
6. 根据变更内容生成 commit 消息:
- 如果只有 `package.json` 变更: `chore: bump version to <新版本>`
- 如果有其他文件变更: 分析变更内容,生成符合 Conventional Commits 规范的消息,并在末尾附加 `(v<新版本>)`
7. 执行 `git commit -m "<生成的消息>"`
8. 创建 tag: `git tag v<新版本>`
9. 输出: `✓ 版本升级完成: <旧版本> → <新版本>,本地 tag v<新版本> 已创建`
16 changes: 16 additions & 0 deletions .claude/commands/git-push.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: git-push
description: 推送 commit 和 tag 到远程仓库
category: Release
tags: [git, push, release]
---

**推送到远程仓库**

推送当前分支的 commit 和所有本地 tag 到远程。

**立即执行以下操作,无需确认**:

1. 执行: `git push`
2. 执行: `git push --tags`
3. 输出: `✓ 已推送 commit 和 tags 到远程仓库`
23 changes: 23 additions & 0 deletions .claude/commands/openspec/apply.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
name: OpenSpec: Apply
description: Implement an approved OpenSpec change and keep tasks in sync.
category: OpenSpec
tags: [openspec, apply]
---
<!-- OPENSPEC:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

**Steps**
Track these steps as TODOs and complete them one by one.
1. Read `changes/<id>/proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria.
2. Work through tasks sequentially, keeping edits minimal and focused on the requested change.
3. Confirm completion before updating statuses—make sure every item in `tasks.md` is finished.
4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality.
5. Reference `openspec list` or `openspec show <item>` when additional context is required.

**Reference**
- Use `openspec show <id> --json --deltas-only` if you need additional context from the proposal while implementing.
<!-- OPENSPEC:END -->
27 changes: 27 additions & 0 deletions .claude/commands/openspec/archive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
name: OpenSpec: Archive
description: Archive a deployed OpenSpec change and update specs.
category: OpenSpec
tags: [openspec, archive]
---
<!-- OPENSPEC:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.

**Steps**
1. Determine the change ID to archive:
- If this prompt already includes a specific change ID (for example inside a `<ChangeId>` block populated by slash-command arguments), use that value after trimming whitespace.
- If the conversation references a change loosely (for example by title or summary), run `openspec list` to surface likely IDs, share the relevant candidates, and confirm which one the user intends.
- Otherwise, review the conversation, run `openspec list`, and ask the user which change to archive; wait for a confirmed change ID before proceeding.
- If you still cannot identify a single change ID, stop and tell the user you cannot archive anything yet.
2. Validate the change ID by running `openspec list` (or `openspec show <id>`) and stop if the change is missing, already archived, or otherwise not ready to archive.
3. Run `openspec archive <id> --yes` so the CLI moves the change and applies spec updates without prompts (use `--skip-specs` only for tooling-only work).
4. Review the command output to confirm the target specs were updated and the change landed in `changes/archive/`.
5. Validate with `openspec validate --strict` and inspect with `openspec show <id>` if anything looks off.

**Reference**
- Use `openspec list` to confirm change IDs before archiving.
- Inspect refreshed specs with `openspec list --specs` and address any validation issues before handing off.
<!-- OPENSPEC:END -->
28 changes: 28 additions & 0 deletions .claude/commands/openspec/proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
name: OpenSpec: Proposal
description: Scaffold a new OpenSpec change and validate strictly.
category: OpenSpec
tags: [openspec, change]
---
<!-- OPENSPEC:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files.
- Do not write any code during the proposal stage. Only create design documents (proposal.md, tasks.md, design.md, and spec deltas). Implementation happens in the apply stage after approval.

**Steps**
1. Review `openspec/project.md`, run `openspec list` and `openspec list --specs`, and inspect related code or docs (e.g., via `rg`/`ls`) to ground the proposal in current behaviour; note any gaps that require clarification.
2. Choose a unique verb-led `change-id` and scaffold `proposal.md`, `tasks.md`, and `design.md` (when needed) under `openspec/changes/<id>/`.
3. Map the change into concrete capabilities or requirements, breaking multi-scope efforts into distinct spec deltas with clear relationships and sequencing.
4. Capture architectural reasoning in `design.md` when the solution spans multiple systems, introduces new patterns, or demands trade-off discussion before committing to specs.
5. Draft spec deltas in `changes/<id>/specs/<capability>/spec.md` (one folder per capability) using `## ADDED|MODIFIED|REMOVED Requirements` with at least one `#### Scenario:` per requirement and cross-reference related capabilities when relevant.
6. Draft `tasks.md` as an ordered list of small, verifiable work items that deliver user-visible progress, include validation (tests, tooling), and highlight dependencies or parallelizable work.
7. Validate with `openspec validate <id> --strict` and resolve every issue before sharing the proposal.

**Reference**
- Use `openspec show <id> --json --deltas-only` or `openspec show <spec> --type spec` to inspect details when validation fails.
- Search existing requirements with `rg -n "Requirement:|Scenario:" openspec/specs` before writing new ones.
- Explore the codebase with `rg <keyword>`, `ls`, or direct file reads so proposals align with current implementation realities.
<!-- OPENSPEC:END -->
38 changes: 38 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Dependencies
node_modules
.pnpm-store

# Build outputs
.next
out
dist

# Git
.git
.gitignore

# IDE
.idea
.vscode
*.swp
*.swo

# Environment (不应打包进镜像)
.env
.env.local
.env.*.local

# Misc
*.log
npm-debug.log*
pnpm-debug.log*
.DS_Store
Thumbs.db

# Test
coverage
.nyc_output

# Cloudflare (与 Docker 无关)
.wrangler
.open-next
19 changes: 19 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Supabase 数据库配置
SUPABASE_URL=https://your-project.supabase.co
# Supabase 匿名访问Key
SUPABASE_PUBLISHABLE_OR_ANON_KEY=your-public-or-anon-key
# Service Role Key (服务端使用,绕过 RLS,切勿暴露到客户端)
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key

# 数据库空间
NODE_ENV=dev
# 轮询间隔(秒)
CHECK_POLL_INTERVAL_SECONDS=60
# 节点身份(多节点部署时标识实例)
CHECK_NODE_ID=local
# 历史数据保留天数(范围 7-365)
HISTORY_RETENTION_DAYS=30
# 官方状态检查间隔
OFFICIAL_STATUS_CHECK_INTERVAL_SECONDS=60
# 最大请求并发数
CHECK_CONCURRENCY=8
49 changes: 49 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Build and Push Docker Image

on:
push:
tags:
- 'v*'
workflow_dispatch:

env:
REGISTRY: docker.io
IMAGE_NAME: bingzi233/check-cx

jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=semver,pattern={{version}}

- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64
95 changes: 54 additions & 41 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,41 +1,54 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*
!.env.example

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts

# IDEA
.idea

combined.log
error.log

.playwright-mcp
.mcp.json

# openspec
openspec/changes/
44 changes: 44 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<!-- OPENSPEC:START -->
# OpenSpec Instructions

These instructions are for AI assistants working in this project.

Always open `@/openspec/AGENTS.md` when the request:
- Mentions planning or proposals (words like proposal, spec, change, plan)
- Introduces new capabilities, breaking changes, architecture shifts, or big performance/security work
- Sounds ambiguous and you need the authoritative spec before coding

Use `@/openspec/AGENTS.md` to learn:
- How to create and apply change proposals
- Spec format and conventions
- Project structure and guidelines

Keep this managed block so 'openspec update' can refresh the instructions.

<!-- OPENSPEC:END -->

# Repository Guidelines

## Project Structure & Module Organization
- `app/` hosts the App Router surface; `page.tsx` hydrates dashboard data and `app/api/dashboard/route.ts` exposes the refresh endpoint.
- `components/` contains interactive widgets such as `dashboard-view.tsx`, `status-timeline.tsx`, and shared primitives inside `components/ui/`.
- `lib/` carries domain logic: `core/` for polling and state, `providers/` for OpenAI/Anthropic/Gemini adapters, `database/` plus `supabase/` for persistence helpers, `types/` for DTOs, and `utils/` for helpers like `cn`.
- Keep assets in `public/`, and store schema or seed changes exclusively in `supabase/migrations/` so Supabase stays reproducible.

## Build, Test, and Development Commands
- `pnpm install` syncs dependencies; re-run whenever `pnpm-lock.yaml` changes.
- `pnpm dev` launches the Next.js dev server configured via `.env`.
- `pnpm build` compiles the production bundle, while `pnpm start` serves that output for local smoke tests.
- `pnpm lint` runs the Next.js Core Web Vitals rule set (`eslint.config.mjs`); fix findings before pushing.

## Coding Style & Naming Conventions
Default to server components and add `"use client"` only when hooks or browser APIs are required. TypeScript files use two-space indentation, `const` bindings, and descriptive PascalCase component names (`DashboardView`). Sort imports Node → packages → `@/` aliases, avoiding long relative paths. Compose styling through Tailwind utility classes plus `clsx`/`tailwind-merge`, and move repeated variants into `components/ui/`.

## Testing Guidelines
Automated tests are not wired up yet, but new logic should ship with either Vitest/Jest specs named `*.spec.ts` or clearly documented manual steps. Target ≥80 % coverage on `lib/core` and provider modules; explain any exception in the PR description. Until a runner is introduced, validate by running `pnpm dev`, exercising dashboard refreshes, and replaying Supabase migrations against a staging project before promoting to production.

## Commit & Pull Request Guidelines
History follows Conventional Commits (`feat:`, `fix:`, `chore:`, `refactor:`). Keep each commit scoped to a single concern and include related SQL migrations or config edits together. Pull requests must describe the change, link issues, attach UI screenshots/GIFs when visuals move, list the commands executed (build/lint/test), and mention any Supabase migration IDs applied. Request review early for provider updates so credentials and rate limits get a second set of eyes.

## Security & Configuration Tips
Copy `.env.example`, fill in `SUPABASE_*` plus `CHECK_POLL_INTERVAL_SECONDS`, and never commit real keys. Provider credentials belong in the `check_configs` table—seed them with the SQL snippets in `.env.example` instead of plaintext env vars. Use the mock endpoint in `lib/providers/stream-check.ts` for latency tests and scrub client logs before sharing.
Loading