Repository navigation
Releases
v0.9.1 — 供给链收紧 / 判据补强 / a11y 对比度内核
亮点
- 供给链收紧:dependabot 改成按家族分组(G0),新增依赖发布时间年龄门(
scripts/check_dependency_age.py,进 Lint 腿)——锁内 1108 个版本全部实测 ≥ 24h 才放行;本批三连合的并时刻实测 160.0h / 85.0h / 229.0h。 - 依赖现代化:eslint 10.13.0→10.14.0、better-auth 1.7.12→1.7.17、
@tiptap/*12 包 3.32.0→3.32.2、next 16.4.2→16.4.4、ai 7.0.150→7.0.163、typescript-eslint 8.72.0→8.72.1 等。跨批回退教训(#289/#288 基于 #285 之前会回退 eslint)已入 CHANGELOG。 - a11y 对比度从「读令牌」到「读渲染色」:
visual-kit/contrast.ts内核改写 +web/tests/unit/contrast-kernel.test.ts13 例 + 10 条变异全红;axe 基线 34→27 收窄,深色--p-*令牌批修复,--meta档首次进对比度矩阵。 - 判据补强:顶层页面导航覆盖门禁(33 页 vs 33 壳入口,防孤儿回退);认领表时区口径统一到 UTC;对比度矩阵「测不到」不再当「通过」。
容器镜像
docker pull ghcr.io/levango7/corps:0.9.1
本 tag 同时产出 :0.9.1、:0.9、:sha-ffafc5d59a2c4363e314a66e62a18fcccff835ad、:latest,四个 tag 同 digest sha256:96b672e5…(docker-publish 日志实测)。
其余
完整条目见 CHANGELOG.md 的 [0.9.1] - 2026-11-09。
桌面构建产物沿用桌面版本线(0.6.0,本版未改桌面代码);移动壳需要
CORPS_WEB_URL,未配置时构建期显式失败而不是指向占位域名。
v0.9.0 — 契约清偿到零 / 权限盲区收敛 / a11y 基线落地
亮点
- API 契约清偿到零:未声明路由 203 → 0(覆盖率 40.8% → 100%),
api/openapi.yaml288 条路径,scripts/api-contract-baseline.txt已清空——新增路由必须当场入契约,漏一条就判红。配套check_openapi_refs.py(悬空$ref)与 YAML 语法门禁。 - 权限门禁盲区 164 → 84:T3 154 → 54,AI 域 40 个 handler + 收敛批 A/B 接上
requirePermission;全部是「member=crud 与 choke point 逐条等价」的零运行时变化迁移。 - 零覆盖 602 → 517(90 天目标达成):9 文件清算波 + lib 域 b1–b6,全部补真用例跑出覆盖。
- 真实浏览器无障碍基线(axe):登录页 + 6 个核心页按 WCAG 2.1 A/AA 扫描,34 条违规建成只允许收缩的基线;选择器归一化抽成纯函数并配 14 例单测。
- 决策复盘可度量:新增
decision_reviewed(只在「未复盘 → 已复盘」跃迁上发)、ai_extract_started/ai_extract_failed;编辑决策会清空复盘标记。 - 中文消息搜索真正可用:
simple分词下中文整段是单 lexeme ⇒ 子串查询恒为零结果。改为「全文 ∪ 转义 ILIKE」并加pg_trgmGIN 索引;e2e 不再拿用例迁就实现。 - 旧聊天实现树收敛:删除 8 文件 / 2,145 行,并把「操作失败就地提示」迁进当前 IM 组件。
容器镜像
docker pull ghcr.io/levango7/corps:0.9.0
本 tag 同时产出 :0.9.0、:0.9、:sha-<commit>(:latest 只随 main 更新)。
其余
完整条目见 CHANGELOG.md 的 [0.9.0] - 2026-10-30。
桌面构建产物沿用桌面版本线(0.6.0,本版未改桌面代码);移动壳需要
CORPS_WEB_URL,未配置时构建期显式失败而不是指向占位域名。
v0.8.2 —— 容器镜像发布链路修复(补发 v0.8.0 / v0.8.1 缺失的镜像)
桌面产物与 v0.8.0 相同(桌面版本线独立,当前 0.6.0,本版未改动桌面代码)。
本版唯一的实质改动
web/Dockerfile 的基础镜像源改为 ARG NODE_IMAGE 可覆盖,默认回 Docker Hub 官方
node:22-alpine。这是让容器镜像真正能发出去的那一刀。
为什么连续两个版本都没有镜像
| 版本 | Build | Publish image (GHCR) | 原因 |
|---|---|---|---|
| v0.8.0 | skipped | skipped | Security Audit 判红(vite 三连公告)→ 连锁 skip |
| v0.8.1 | success | failure | 门禁已绿,但 Docker 构建失败于基础镜像源 |
| v0.8.2 | success | success | 修掉基础镜像源 |
v0.8.1 的 CI 实测是本次定位的依据:Build success 而 Publish image failure,
错误固定为——
#5 ERROR: failed to do request: Head "https://docker.m.daocloud.io/v2/library/node/manifests/22-alpine"
dial tcp: lookup docker.m.daocloud.io on 168.63.129.16:53: no such host
web/Dockerfile 三个 FROM 此前写死第三方镜像源 docker.m.daocloud.io,该源自
2026-10-20 21:41 UTC 最后一次成功拉取后失效。此后 main 上每一次 push 的
Publish image (GHCR) 全部 failure——也就是说,不只是没发版,是连 main 的镜像都断了。
实测双侧网络,结论正好相反:
| 环境 | docker.m.daocloud.io |
Docker Hub |
|---|---|---|
| 本机(国内网络) | 可达(HTTP 401) | 不可达(curl 000) |
| GitHub 托管 runner | NXDOMAIN | 可达 |
把只在一侧可用的第三方镜像源写死进 Dockerfile,等于把发布链路押在别人的可用性上。
v0.7.2 之所以有镜像,只是因为那个源当时还活着。
修复形态
ARG NODE_IMAGE=node:22-alpine
FROM ${NODE_IMAGE} AS deps
FROM ${NODE_IMAGE} AS builder
FROM ${NODE_IMAGE} AS runner- 默认回 Docker Hub 官方镜像,CI/生产开箱可用
- 国内/内网换源改为构建时覆盖,不改默认值(改默认值就等于把 CI 又押给第三方):
docker build --build-arg NODE_IMAGE=docker.m.daocloud.io/library/node:22-alpine . - 顺带把「三阶段必须同 node 版本同镜像源」从靠人记住变成结构保证:镜像源收敛成
单个 ARG,改一处即全改,版本错配不可能再发生
使用
docker pull ghcr.io/levango7/corps:0.8.2
# 国内/内网如需换源构建:
docker build --build-arg NODE_IMAGE=docker.m.daocloud.io/library/node:22-alpine ./web升级说明
- 数据库迁移:无。本版相对 v0.8.0/v0.8.1 零业务代码变更,无需备份数据。
- 需要跑迁移的是 v0.7.2 → v0.8.0 那一跳(4 条迁移,其中
20261007000000_dedup_task_conversations会删数据)。若还没升到 v0.8.0,
请先按 v0.8.0 release 的说明操作:
pg_dump -t conversations -t messages -t conversation_members -t chat_presences > backup.sql
并以 BYPASSRLS 角色执行迁移。
已知缺口(建议单独修)
CI 完全不验证 Dockerfile:PR 事件下 Publish image (GHCR) 是 skipped,
Build job 只跑 pnpm run build。本次缺陷能一路潜伏到发布阶段才暴露,根子就在这里。
已记入 CHANGELOG,建议补一条 Docker 构建冒烟检查。
corps 0.8.0
corps 0.8.0 —— Web/Server 版本
桌面与移动壳不随本版发布,其域名/版本问题见 docs/design/PRODUCT-DESIGN-2026Q4.md P0。
本版本收口
依赖大版本换代(ADR-014)
- Prisma 7.10.0 +
@prisma/adapter-pg:Rust 引擎退役;连接池参数显式化为connection_limit=10 / pool_timeout=10,withDbRetry增加 30s 总预算兜底 - Next.js 16.4、TypeScript 6
租户安全
- 写权限收敛到
getWorkspaceContext()+lib/write-policy.ts的单一 choke point(default-deny)。门禁实测 280 个写 handler 中 252 个进墙,其余 28 个逐条登记 reason 与复核截止日,由check_write_access_registry.py断言"要么进墙要么登记" db/rls-activate.sql实测 81 张表 ENABLE + FORCE + 策略db/schema.sql快照追平 73 张表缺口
协同层
- 按 ADR-017 摘除
server/collab/与 3 个零挂载组件 - ADR-016 版本回滚契约落地
国际化
- 新增「硬编码用户可见中文」门禁(P0-6)
- 清偿 UI 50 处 + 事务邮件 73 处
- 事务邮件按收件人语言渲染
可访问性
- 存量偿还 7 批,当前基线 233 条,门禁只允许收缩
其他
- 移除不属于本项目的
corps.com占位域名:桌面/移动壳改 fail-loud +REPLACE_ME.invalid哨兵值,Tauri updater 改构建期注入 - 顺带清除
tauri.conf.json里的plugins.updater.active——它是死键(Tauri v2 已删除该配置),留着只会让人误以为"更新已关闭"
从 v0.7.2 升级:必须读这一段
本版本连带 4 条数据库迁移,Prisma 会在部署时自动执行:
| 迁移 | 性质 |
|---|---|
20261001000000_relax_account_issuer |
放宽约束(accounts.issuer 改可空) |
20261001000001_add_share_access_logs_workspace_id |
加列 + 回填 |
20261003000000_widen_share_password |
加宽列(至 255) |
20261007000000_dedup_task_conversations |
去重并删除重复会话 + 建唯一索引 |
关于最后一条(会删数据)
- 它按
PARTITION BY task_id去重,保留组内created_at最早者。因为task_id是 tasks 的外键,同一task_id不可能跨工作区,不存在跨租户误删 task_id IS NULL的独立 IM 会话不参与;子表先搬后删(三条子表的 FK 均为ON DELETE CASCADE)- 不可逆,没有配套备份表。生产执行前请先备份:
pg_dump -t conversations -t messages -t conversation_members -t chat_presences - 幂等,可安全重跑;
CREATE UNIQUE INDEX非 CONCURRENTLY,大表建议低峰期执行
执行角色要求
必须以表属主 / 具备 BYPASSRLS 的连接跑(生产即 compose 里的 postgres 超级用户)。
若以 corps_app(NOBYPASSRLS)执行,FORCE RLS 会让迁移内的 DML 全部命中 0 行——该迁移会因 CREATE UNIQUE INDEX 报 must be owner of table conversations 而失败,不会静默跳过。但纯 DML 的迁移在这种角色下会"0 行生效却判成功",这是本项目所有数据迁移共同的坑,部署脚本请务必核对连接身份。
已知限制
- Mobile Build 的 android/ios 两个 job 会失败,直到配置仓库变量
CORPS_WEB_URL。这是刻意的 fail-loud:项目当前没有固定域名,移动壳若打包出去会加载到不属于本项目的站点。配好该变量即恢复;桌面端可另配CORPS_UPDATER_ENDPOINT/CORPS_UPDATER_PUBKEY(需成对) - 定时 Smoke 仍红,因为
SMOKE_TARGET_URL未配置——即当前没有线上监控。这是诚实信号而非故障
桌面产物(本版附带)
tag 触发时 Tauri Build 在三个平台各构建了一份安装包,已附在下方:
| 平台 | 文件 | 格式 |
|---|---|---|
| macOS (Apple Silicon) | Corps_0.6.0_aarch64.dmg |
dmg |
| Windows x64 | Corps_0.6.0_x64_en-US.msi |
MSI |
| Windows x64 | Corps_0.6.0_x64-setup.exe |
NSIS 安装器 |
| Linux x64 | Corps_0.6.0_amd64.deb |
deb |
| Linux x64 | Corps_0.6.0_amd64.AppImage |
AppImage |
下载前请注意三点:
- 文件名里的版本是 0.6.0,这是桌面壳自己的版本号。桌面与移动壳的版本线和 Web/Server 不同步,本版 0.8.0 的版本号只指 Web/Server(见上方「Web/Server 版本」说明)
- 这些包未做代码签名。macOS 首次打开需在「系统设置 → 隐私与安全性」放行,Windows 需在 SmartScreen 提示里选择「仍要运行」
- 移动端产物不在此 release:Android APK 与 iOS IPA 由 Mobile Build 流程产出,不随本 release 分发
v0.7.2 — 发布链路恢复与 RLS 根因修复
这一版最主要的变更是让「能发布」这件事重新成立。 本仓库 CI 自 2026-09-08 起连红约 200 次,Build、E2E、Publish image (GHCR) 三条腿因此从未真正执行过;v0.7.2 是这段之后首次 12/12 全绿的版本。
根因(三张表没有建表迁移)
ai_conversations/ai_messages/push_tokens三个 Prisma 模型在任何迁移里没有CREATE TABLE,导致db/rls-activate.sql的 DO 块原子性失败——引擎级 RLS 实际只生效 1/96。补迁移20260929000000与 5 处缺失的@map。rls-activate.sql补 24 条DROP POLICY IF EXISTS使其幂等:此前不幂等,第二次重启容器即起不来。
新增 5 条质量门禁
- schema ↔ 迁移单向漂移检查(
psql权威模式)+schema-driftjob - RLS 覆盖守卫改为真解析:分别断言
ENABLE ROW LEVEL SECURITY/FORCE/POLICY三态,并剥离 SQL 注释 - 权限五档门禁覆盖、i18n 引用键存在性、分页信封消费口径静态守卫(实测 56 个分页端点 / 22 个字面量调用点)
安全
next16.3.3 → 16.3.6:修复next/ogImageResponse的 critical RCE(受影响范围>=16.2.0 <16.3.6)。本仓库next/og零使用,不构成可达面,但它阻断了Security Audit关卡。undici5 条 high:经 pnpm overrides 收敛,并给它加上<8上界——只写下界会让 provider-utils 解析到 8.10.0(跨大版本且仍在受影响区间)。- 顺带查出:根目录
pnpm-workspace.yaml的 overrides 是死配置(CI/Docker 都在web/下安装),既存那条sharp覆盖从未进过锁文件。
产品与权限
- 国内通道缺省价 ¥59 → ¥29.9,对齐仓库里状态为 ACCEPTED 的
pricing-redesign-v2决策。 - 公开分享链接的密码与过期改为服务端强制,并新增 verify 路由。
viewer只读在 24 个 handler 落地,配合五档权限门禁。- Stripe
priceOverride改白名单;AI 用量按产品决定改为提示不阻断。 - 日历同步对账接入 cron(
entrypoint-cron.sh每周日 05:00)。
制品(2026-10-01 匿名 manifest HEAD 实测)
docker pull ghcr.io/levango7/corps:0.7.2
:0.7.2、:0.7、:main 均 HTTP 200;0.7.2 digest sha256:3870c7d754d0e…。发版提交 e41996d1 的 tag push run 36776247723 与 branch push run 36776240056 各 12/12 绿。
验证边界:鉴权类批量改动(viewer 只读、分享强制)在本机只做静态与解析层核验——Next 16 不允许多 dev server 并存,3000 端口那台是开发者自己正在跑的实例。端到端证据来自 CI 的 Test / Test (hardened RLS mode) / E2E (production build) 三腿转绿,而非本地跑过。
完整 41 条条目见仓库根 CHANGELOG.md 的 [0.7.2] - 2026-10-01。
v0.7.1 — 全栈审查修复
全栈审查修复版本:6 波次审查-修复循环覆盖 UI 响应式、后端安全、组件视觉一致性、cron 时间计算、API 行为优化,累计 40 文件 +945/−421 行。
后端安全(2 高 + 4 中 + 7 低)
documents/[id]的 PATCH/DELETE 缺权限检查(viewer 可删除任何文档)→ 补checkDocumentPermission。members/invite的 role 硬编码 → 改从请求体读取。tasks/batch附件清理、webhookdata:null、activitycode:200、descriptionmaxLength。
UI 响应式(8 高 + 16 中 + 23 低)
- 日历月/周视图手机单列 + 工具栏两行 + i18n 日期格式;Wiki/会议/工作流侧边栏移动端抽屉;核心工作区分页触摸目标与 md 断点;审批/通知/设置/计费 flex-wrap + overflow-x-auto + grid 断点。
组件视觉一致性(1 高 + 12 中 + 3 低)
Toast.tsxemoji ⏸ → lucide-reactPause图标;20+ 处图标尺寸归一size={14};30+ 处硬编码 Tailwind 间距 →var(--space-*)。
其他
- cron DST:
recycle-cleanup/weekly-digest用毫秒运算在夏令时切换日偏差 1 小时 → 改用 Date 构造器按年/月/日进位。 notificationsPATCHall=true性能保护:updateMany无take→findMany(take:500)+updateMany,返回updatedCount;openapi.yaml同步。
制品:本版本无镜像。 ghcr.io/levango7/corps:0.7.1 于 2026-10-01 匿名 manifest HEAD 返回 404。成因是 CI 自 2026-09-08 起连红,而 Publish image (GHCR) 处在 needs 依赖链末端会被跳过,因此该 tag 从未产出容器镜像。需要容器制品请直接用 v0.7.2。
完整条目见仓库根 CHANGELOG.md 的 [0.7.1] - 2026-09-24。
v0.6.0 — 编辑体验与全栈双语收口
编辑体验与全栈双语收口版本:API 报错信息完成 i18n(此前英文用户拿到中文错误提示),Markdown 编辑器补齐 Typora 式肌肉记忆与图表能力入口。
新增
- Markdown 编辑器大升级
- 图表模板下拉:mermaid 引擎此前已支持 15+ 种图却只暴露流程图一种模板,现补思维导图/流程图/时序图/甘特图/饼图/四象限六种可运行模板,决策/文档/评论三处编辑器共用。
- Typora 式快捷键层:
Ctrl/⌘+B/I/K包裹、Tab/Shift+Tab列表缩进、Enter列表自动续行(有序自动 +1 编号)、空列表项Enter/Backspace退出、引用行尾续行——纯 textarea 实现,零新依赖。 - 分屏实时预览(Obsidian 式):宽屏双栏、窄屏堆叠,与单页切换互斥。
- 字数统计与链接按钮(此前工具栏无链接入口)。
- API 路由 message 双语:新增
lib/api-messages.ts(51 键 zh/en 常量表),38 个 route 文件 97 处中文 message 全部键化;语言协商与 next-intl 同源(NEXT_LOCALEcookie >Accept-Language> 默认中文)。
修复
- 编辑器模板 i18n:表格模板硬编码「列A|列B」、三个决策模板硬编码中文——
/en用户插入的是中文模板,现改 i18n 键、zh/en 对称。 notificationsPATCH 的 zodrefine校验移入 handler(模块级 schema 无法按请求语言本地化,校验语义不变)。
制品:docker pull ghcr.io/levango7/corps:0.6.0。2026-10-01 以匿名 manifest HEAD 校验:HTTP 200,digest sha256:0694a65fd5609…。
完整条目见仓库根 CHANGELOG.md 的 [0.6.0] - 2026-09-07。
v0.5.0 — 协作体验与响应式质量
协作体验与响应式质量版本:成员治理、个人效率入口、顶栏信息架构收口、三引擎响应式基线。
新增
- 成员角色管理 + 工作区所有权转让(owner only,转让者降为 admin)
- 星标收藏 v1(localStorage
corps_favorites_v1,跨设备同步留待 v2) - AI 决策提炼(规则版 v1,不接真 LLM)
- 通知中心收件箱 tabs:All / Unread / @我 / 分配给我
- 顶栏头像统一 UserMenu 下拉,交互元素 5 → 2
scripts/layout-audit.mjs:chromium + firefox + webkit × 3 视口 × 6 页 = 54 组合横向溢出/重叠/触控目标基线全零
修复
- RBAC 三处:
runWithWorkspace内嵌事务被 Prisma 6 拒绝、成员 PATCH self/ownerImmutable 顺序致 owner 改自己被判 403、admin 改 member 未放行 - SSE 补单用户并发连接硬上限(5),超限 429
- 概览页"全部 →"触控目标 20px → 28px
invitations部分唯一索引加IF NOT EXISTS(迁移幂等化)
已知遗留:API 路由 JSON message 中文残留约百处(英文用户报错仍为中文),后续在 0.6.0 收口。
制品:docker pull ghcr.io/levango7/corps:0.5.0。2026-10-01 以匿名 manifest HEAD 校验:HTTP 200,digest sha256:7a16b018b1e60…(与 0.4.0/0.6.0 摘要互不相同)。
完整条目见仓库根 CHANGELOG.md 的 [0.5.0] - 2026-09-07。
v0.4.0 — 任务执行与知识沉淀大版本
v0.4.0:任务执行与知识沉淀大版本——子任务/阻塞标记、文档中心、Mermaid、PDF 导出、编辑器工具栏、附件预览、任务分享
v0.3.0 — 定价与功能包装再设计(v2 定价方案)
定价与功能包装再设计(v2 定价方案,2026-09-02 拍板)。这一版没有新功能面,改的是"怎么卖"和"免费档到底给什么"。
变更
- Pro 定价 ¥59 → ¥29.9/人/月、¥590 → ¥299/人/年:按国内锚点重新定价(Teambition ¥25 / 飞书 ¥50),起步期渗透优先;年付维持"付 10 个月用 12 个月"结构。
- Free 功能清单 7 → 14 项:把已建成但没列出的能力诚实纳入(任务内 IM、日历连接、通知中心、标签/里程碑、批量操作、中英双语、深色模式、移动端响应式、降级不锁数据)。
- Pro 清单 6 → 8 项:无限席位提为首位卖点;新增附件扩容与每周任务摘要两项真实功能;基础邮件通知归回 Free(遵循"绝不偷偷降级免费功能"这条红线)。
- 定价页与对比表全量 i18n 化(
pricing.features.*/pricing.matrix.*,zh/en 双语渲染;此前对比表与功能清单只有中文)。
新增
- 附件存储按套餐门控:免费版单文件 10MB / Pro 50MB(attachments 路由按 active 订阅判定,免费超限提示升级路径)。
- 每周任务摘要邮件(Pro):
/api/cron/weekly-digest每周一 02:00 UTC 执行(北京时间周一 10:00),向 Pro 工作区每位成员发送其负责任务的逾期 + 未来 7 天到期摘要;由 corps-cron 调度容器内置计划表驱动。 - 定价决策文档
docs/market/pricing-redesign-v2.md(状态 ACCEPTED,含现状诊断、锚点论证、ROI 叙事与红线校验)。
制品:docker pull ghcr.io/levango7/corps:0.3.0。2026-10-01 匿名 manifest HEAD 校验:HTTP 200,digest sha256:85373fc40d9c5…。
完整条目见仓库根 CHANGELOG.md 的 [0.3.0] - 2026-09-02。