Skip to content

Releases

v0.9.1 — 供给链收紧 / 判据补强 / a11y 对比度内核

Choose a tag to compare

@Levango7 Levango7 released this 09 Nov 16:07
ffafc5d

亮点

  • 供给链收紧: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.ts 13 例 + 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 基线落地

Choose a tag to compare

@Levango7 Levango7 released this 30 Oct 18:59
d56c6a5

亮点

  • API 契约清偿到零:未声明路由 203 → 0(覆盖率 40.8% → 100%),api/openapi.yaml 288 条路径,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_trgm GIN 索引;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 缺失的镜像)

Choose a tag to compare

@Levango7 Levango7 released this 21 Oct 23:02
616edb3

桌面产物与 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

Choose a tag to compare

@Levango7 Levango7 released this 21 Oct 03:46
5f5972a

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

下载前请注意三点:

  1. 文件名里的版本是 0.6.0,这是桌面壳自己的版本号。桌面与移动壳的版本线和 Web/Server 不同步,本版 0.8.0 的版本号只指 Web/Server(见上方「Web/Server 版本」说明)
  2. 这些包未做代码签名。macOS 首次打开需在「系统设置 → 隐私与安全性」放行,Windows 需在 SmartScreen 提示里选择「仍要运行」
  3. 移动端产物不在此 release:Android APK 与 iOS IPA 由 Mobile Build 流程产出,不随本 release 分发

v0.7.2 — 发布链路恢复与 RLS 根因修复

Choose a tag to compare

@Levango7 Levango7 released this 30 Sep 21:24

这一版最主要的变更是让「能发布」这件事重新成立。 本仓库 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-drift job
  • RLS 覆盖守卫改为真解析:分别断言 ENABLE ROW LEVEL SECURITY / FORCE / POLICY 三态,并剥离 SQL 注释
  • 权限五档门禁覆盖、i18n 引用键存在性、分页信封消费口径静态守卫(实测 56 个分页端点 / 22 个字面量调用点)

安全

  • next 16.3.3 → 16.3.6:修复 next/og ImageResponse 的 critical RCE(受影响范围 >=16.2.0 <16.3.6)。本仓库 next/og 零使用,不构成可达面,但它阻断了 Security Audit 关卡。
  • undici 5 条 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 — 全栈审查修复

Choose a tag to compare

@Levango7 Levango7 released this 30 Sep 21:24

全栈审查修复版本:6 波次审查-修复循环覆盖 UI 响应式、后端安全、组件视觉一致性、cron 时间计算、API 行为优化,累计 40 文件 +945/−421 行。

后端安全(2 高 + 4 中 + 7 低)

  • documents/[id] 的 PATCH/DELETE 缺权限检查(viewer 可删除任何文档)→ 补 checkDocumentPermission。
  • members/invite 的 role 硬编码 → 改从请求体读取。
  • tasks/batch 附件清理、webhook data:null、activity code:200、description maxLength。

UI 响应式(8 高 + 16 中 + 23 低)

  • 日历月/周视图手机单列 + 工具栏两行 + i18n 日期格式;Wiki/会议/工作流侧边栏移动端抽屉;核心工作区分页触摸目标与 md 断点;审批/通知/设置/计费 flex-wrap + overflow-x-auto + grid 断点。

组件视觉一致性(1 高 + 12 中 + 3 低)

  • Toast.tsx emoji ⏸ → lucide-react Pause 图标;20+ 处图标尺寸归一 size={14};30+ 处硬编码 Tailwind 间距 → var(--space-*)。

其他

  • cron DST:recycle-cleanup / weekly-digest 用毫秒运算在夏令时切换日偏差 1 小时 → 改用 Date 构造器按年/月/日进位。
  • notifications PATCH all=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 — 编辑体验与全栈双语收口

Choose a tag to compare

@Levango7 Levango7 released this 30 Sep 21:24

编辑体验与全栈双语收口版本: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_LOCALE cookie > Accept-Language > 默认中文)。

修复

  • 编辑器模板 i18n:表格模板硬编码「列A|列B」、三个决策模板硬编码中文——/en 用户插入的是中文模板,现改 i18n 键、zh/en 对称。
  • notifications PATCH 的 zod refine 校验移入 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 — 协作体验与响应式质量

Choose a tag to compare

@Levango7 Levango7 released this 30 Sep 21:23

协作体验与响应式质量版本:成员治理、个人效率入口、顶栏信息架构收口、三引擎响应式基线。

新增

  • 成员角色管理 + 工作区所有权转让(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 — 任务执行与知识沉淀大版本

Choose a tag to compare

@Levango7 Levango7 released this 05 Sep 01:34
v0.4.0:任务执行与知识沉淀大版本——子任务/阻塞标记、文档中心、Mermaid、PDF 导出、编辑器工具栏、附件预览、任务分享

v0.3.0 — 定价与功能包装再设计(v2 定价方案)

Choose a tag to compare

@Levango7 Levango7 released this 01 Oct 00:00

定价与功能包装再设计(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。