Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,29 @@

ContentCloud 的重要变更记录在此文件中。

## [0.4.0] - 2026-07-27

### Added

- 打通 SubmissionRevision 内审、客户 OTP 审批、ApprovedSnapshot、三格式 DeliveryPackage、投放结果、人工评级与 Lineage 的 V2 完整业务链。
- 增加 revision 级客户 ReviewGrant 的创建、查看、撤销、过期与新 revision 自动失效机制,公开审批页继续兼容 V1 历史链接。
- 增加基于 ApprovedSnapshot 的 JSON、Markdown、XLSX 导出与不可变交付包,并支持 Web 和 CLI 下载。
- 增加 `00014`/`00015` 数据库迁移,将交付和结果切换到 ApprovedSnapshot,并以可审计、幂等方式回填 V1 影子快照。
- 增加真实 PostgreSQL、应用层和 HTTP Golden Path 测试,覆盖两阶段审批、交付、结果回流、RLS、不可变约束及脏 hash 跳过。

### Changed

- 内部批准只推进到 `internally_approved`,客户批准才原子生成 ApprovedSnapshot,避免未获客户确认的内容进入正式交付。
- Brief 强制绑定已拉取的 Strategy ApprovedSnapshot;PerformanceObservation、RatingDecision 与 Lineage 统一使用批准快照作为事实源。
- 更新 CLI `review`、`artifact`、`result` 命令和 OpenAPI 契约,使 revision、快照、交付包与结果字段保持一致。
- 重构租户控制台路由与 Editorial Studio 视觉体系,保留旧 `/workspace/*` 地址的兼容跳转,并完善审批、交付和结果操作界面。
- 本地开发改为 `make dev` 同时运行 Go API 与 Vite,默认使用隔离 Memory Store;构建后单体预览使用 `make preview`。

### Fixed

- 修复 V1 影子回填遇到非 SHA-256 历史 hash 时导致迁移失败的问题;无效记录仅计入报告,不伪造或重算历史 hash。
- 修复 CLI `review status` 仍读取 V1 ScriptVersion 的问题,改为返回 Submission、Revision 与客户授权状态。

## [0.3.0] - 2026-07-26

### Added
Expand Down
3 changes: 3 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## Design System

Always read `DESIGN.md` before making visual or UI decisions. Font choices, colors, spacing, and aesthetic direction are defined there. Do not deviate without explicit approval. During UI review, flag code that does not match `DESIGN.md`.
100 changes: 100 additions & 0 deletions DESIGN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# ContentCloud Design System

## Product Context

- **产品**:面向 AI 内容营销团队的本地优先创作与云端治理系统。
- **用户**:内容策略、编辑、审核、项目管理与平台运营人员。
- **界面类型**:高频工作台、内容生产管线、审核界面与独立系统后台。
- **设计目标**:像一张可信、克制但有创作能量的编辑制作台,而不是通用云平台控制台。

## Aesthetic Direction

- **方向**:Editorial Studio(编辑制作台)。
- **装饰强度**:克制且有意图。中性工作面承担大部分内容,颜色只标记品牌、当前动作、内容分类和状态。
- **布局**:严格网格。生产工具优先扫描效率、对齐和稳定尺寸,不采用营销页式卡片堆叠。
- **基调**:石墨、稿纸灰与荧光标记构成主界面;资料、知识、策略、制作和审核拥有稳定分类色。

### Research References

- [Adobe Spectrum color system](https://spectrum.adobe.com/page/color-system/):用颜色关系与语义角色建立可扩展系统。
- [Sanity UI theme](https://www.sanity.io/ui/docs/theme):中性表面配合多组 hue token,而非单色覆盖全部功能。
- [Contentful Forma 36 colors](https://f36.contentful.com/tokens/colors/):内容后台以清晰中性层级和独立交互色为基础。
- [Frame.io](https://frame.io/):深色制作台、媒体内容优先、颜色稀疏且用于状态与选择。
- [Descript](https://www.descript.com/):高对比编辑气质与鲜明的制作信号色。
- [Craft](https://www.craft.do/) 与 [Airtable](https://www.airtable.com/):中性工作面承载多种内容分类色。

## Color

### Brand And Commands

- **Brand marker** `#d5f34a`:荧光稿纸标记,只用于品牌、当前导航和生产管线基线。
- **Brand ink** `#202810`:品牌亮色上的文字与图形。
- **Command** `#1c1f1b`:主要按钮和高权重命令。
- **Command hover** `#30342e`。
- **Link** `#4c6500`:白色和稿纸灰表面上的可访问文本链接。

### Surfaces

- **Page** `#f2f3ef`
- **Panel** `#ffffff`
- **Raised** `#eef0ea`
- **Neutral** `#e7eae3`
- **Ink** `#1b1d1a`
- **Muted** `#5b6258`
- **Border** `#d9dcd3`

### Content Categories

- **Sources** `#3567d8` / `#e9f0ff`
- **Knowledge** `#117a61` / `#e5f5ef`
- **Strategy** `#a46200` / `#fbf0db`
- **Production** `#c74632` / `#fbeae6`
- **Review** `#b33c62` / `#f8e9ef`

分类色表达对象类型和生产阶段,不表达成功或失败。

### Semantic States

- **Info** `#3567d8`
- **Success** `#117a61`
- **Warning** `#a46200`
- **Danger** `#b8273d`

语义色只表达系统状态,不承担品牌装饰。

## Typography

- **UI / Body**:平台原生 humanist sans 栈,优先 Avenir Next、Segoe UI Variable、苹方与微软雅黑。
- **Data / Code**:系统等宽字体栈;数字列启用 tabular nums。
- **策略**:不加载远程字体,保证本地优先环境、离线开发和隐私边界。
- **正文尺度**:`11 / 11.5 / 12 / 13 / 14px`,页面标题按容器使用 `21-27px`。
- **字距**:统一为 `0`。

## Spacing And Layout

- **基础单位**:4px。
- **密度**:紧凑但可扫描;表格和管线保持固定节奏,表单保留 8-16px 组间距。
- **内容宽度**:工作台最大 1440px,页面使用响应式网格。
- **圆角**:小元素 6px、控件与卡片 8px、弹层 12px、状态 pill 使用完全圆角。
- **阴影**:卡片仅使用 1px 级轻阴影,弹层使用独立高程;边框负责主要分层。

## Motion

- **方向**:minimal-functional。
- **时长**:微交互 150-200ms。
- **属性**:仅过渡颜色、透明度和 transform,不使用 `transition: all`。
- **无障碍**:必须尊重 `prefers-reduced-motion`,所有键盘交互保留 `focus-visible`。

## Safe Choices And Risks

- **安全选择**:中性表面、严格网格、可预测导航和高对比命令符合内容后台的高频操作预期。
- **设计风险**:荧光品牌色比传统 SaaS 蓝更醒目,但限定在小面积标记中,避免娱乐化。
- **设计风险**:生产阶段采用分类色,提升定位速度;代价是必须严格区分分类色与语义状态色。

## Decisions Log

| Date | Decision | Rationale |
| --- | --- | --- |
| 2026-07-26 | 从 Rubik 蓝平台主题改为 Editorial Studio | 单一蓝色更像基础设施控制台,无法表达内容生产阶段。 |
| 2026-07-26 | 品牌、命令、链接、语义和分类 token 分离 | 防止一个 accent 同时承担多个互相冲突的职责。 |
| 2026-07-26 | 使用本地系统字体栈 | 保持本地优先、离线可用和零第三方字体请求。 |
9 changes: 6 additions & 3 deletions IMPLEMENTATION_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,19 @@
- 新 revision 出现后旧 grant 自动失效
- 客户批准生成 ApprovedSnapshot,hash 等于 revision content_hash
**Tests**: internal→client 正常路径、跳过 internal 被拒、grant 失效、OTP 错误、重复决定。
**Status**: Not Started
**Status**: Complete
**Notes**: `ApprovalDecision.decision_stage` 区分 internal/client/legacy;script 内审仅进入 `internally_approved`,客户 OTP 批准后原子创建当前 ApprovedSnapshot;新 revision 自动撤销旧未决 grant;公开审批同时兼容 V1 历史链接和 V2 revision 链接。Web 与 CLI 的新授权入口只接受 SubmissionRevision。

## Stage 3: 导出改由 ApprovedSnapshot 驱动
**Goal**: JSON/Markdown/XLSX 从批准快照的 canonical 内容生成,不再要求 V1 ScriptVersion。
**Success Criteria**: 三种格式由同一快照生成,manifest 记录 snapshot ID 与 revision hash。
**Tests**: 三格式导出内容一致性、未批准快照拒绝导出。
**Status**: Not Started
**Status**: Complete
**Notes**: 服务端和本地 CLI 共用 `localworkspace.RenderScriptPackageV2`;`artifact export/package` 与 Web 均从 `origin=current` 的 script ApprovedSnapshot 生成 JSON/Markdown/XLSX,并在 Artifact metadata 中保存 snapshot ID、revision hash 和 script hash。

## Stage 4: 交付、结果与影子快照回填
**Goal**: DeliveryPackage 引用 ApprovedSnapshot;PerformanceObservation 绑定快照;V1 已批准 ScriptVersion 回填 `origin=v1_import` 只读影子快照。
**Success Criteria**: 回填后历史导出内容与 hash 不变;dry-run 报告数量与不可映射项。
**Tests**: 回填幂等、hash 不变、跨租户负测。
**Status**: Not Started
**Status**: Complete
**Notes**: DeliveryPackage/Artifact/PerformanceObservation/Rating/Lineage 已接到 ApprovedSnapshot。`00014_v2_single_track_delivery.sql` 完成结构迁移,`00015_v1_shadow_backfill_report.sql` 提供幂等回填与 inserted/skipped_invalid_hash 报告;真实 PostgreSQL 测试覆盖 hash 保持、重复回填为 0、RLS 和不可变约束。
7 changes: 5 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
.PHONY: dev server web worker cli build test check install-cli migrate-up
.PHONY: dev preview server web worker cli build test check install-cli migrate-up

CONTENTCLOUD_ADDR ?= :8080
CONTENTCLOUD_WEB_DIST ?= web/dist

dev: build
dev:
./scripts/dev.sh

preview: build
CONTENTCLOUD_ADDR=$(CONTENTCLOUD_ADDR) CONTENTCLOUD_WEB_DIST=$(CONTENTCLOUD_WEB_DIST) ./bin/contentcloud-server

server:
Expand Down
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,14 @@ docs/roadmap/v2/ V2 产品、架构、流程、安全、计划与实现

```bash
pnpm install
make build
CONTENTCLOUD_DEV_MODE=1 ./bin/contentcloud-server
make dev
```

打开 `http://localhost:8080` 使用租户工作台,或打开 `http://localhost:8080/admin/dashboard` 使用独立系统后台。开发模式使用 Memory Store、本地 Blob,演示账号默认具备平台管理员权限,并自动创建金陵古法线香演示项目;来源由内置确定性 Worker 处理。
开发脚本会同时启动 Go API(`http://localhost:8080`)和 Vite(`http://localhost:5173`),自动加载根目录 `.env`,并在退出时清理自己启动的子进程。打开 `http://localhost:5173` 使用租户工作台,或打开 `http://localhost:5173/admin/dashboard` 使用独立系统后台。

默认使用隔离的 Memory Store 和 `var/dev-data` 本地 Blob,不会连接 `.env` 中的数据库或 S3。运行 `./scripts/dev.sh --help` 可查看端口覆盖、真实数据库联调和显式清理占用端口等选项。需要验证构建后的前后端单体服务时使用 `make preview`。

开发模式下,演示账号默认具备平台管理员权限,并自动创建金陵古法线香演示项目;来源由内置确定性 Worker 处理。

CLI 示例:

Expand Down Expand Up @@ -97,7 +100,7 @@ CONTENTCLOUD_REQUIRE_MALWARE_SCAN=1 ./bin/contentcloud-worker
2. 项目总览生成 10 分钟有效、单次使用的 `cck_`,并拼成不含登录态的 Agent Prompt:

```text
Fetch https://content.example.com/api/bootstrap and initialize this ContentCloud project.
Fetch https://content.example.com/api/bootstrap and help me initialize this ContentCloud project on this machine.

server-url: https://content.example.com
connect-key: cck_xxx
Expand Down
74 changes: 74 additions & 0 deletions REDESIGN_PLAN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# 页面视觉重构(Editorial Studio 内容生产体系)

> 独立于 `IMPLEMENTATION_PLAN.md`(后端 V2 审批收敛,进行中),本文件只覆盖 `web/src/styles.css` 的视觉层。

基础密度参考:`/Users/coso/Documents/dev/js/loopany-platform/packages/server/src/styles/app.css`

第二轮色彩研究参考 Adobe Spectrum、Sanity UI、Contentful Forma 36、Frame.io、Descript、Craft
与 Airtable。完整设计决策见 `DESIGN.md`。

## 问题诊断

在 `web/src/styles.css`(83KB 压缩单体)实测:

- **无色彩体系**:130+ 种硬编码 hex,几乎全是暖绿调灰(`#6f7774` / `#dfe3e1` / `#f6f8f7`)
- **红色语义错位**:`--accent:#d84b3e` 砖红同时承担品牌色、交互色和装饰性 eyebrow,
而错误态另用一套红(`#a93d35` / `#fdebea`)——「红」因此不传达任何信息
- **字号失控**:21 个不同字号,其中 9px×79、8px×40、7px×4,正文级文字落在 8-10px
- **圆角失控**:4/5/6/7/8/9/14/16px 共 8 种规格混用

## 目标体系

| 维度 | 现状 | 目标(Editorial Studio) |
| --- | --- | --- |
| 页面底色 | `#f7f8f8` 暖灰 | `#f2f3ef` 稿纸灰 |
| 品牌标记 | 品牌色兼作按钮与状态 | `#d5f34a` 荧光稿纸标记 |
| 高权重命令 | 与品牌色共用 | `#1c1f1b` 石墨黑 |
| 内容分类 | 无稳定分类色 | 资料蓝 / 知识青绿 / 策略琥珀 / 制作珊瑚 / 审核玫红 |
| 错误态 | 散落 5 种红 | `#b8273d` 危险红 |
| 成功态 | `#17855f` | `#117a61` 成功青绿 |
| 警告态 | `#a6650b` | `#a46200` 警告琥珀 |
| 字号 | 7~13px 无级 | 11 / 11.5 / 12 / 13 / 14 五档 |
| 圆角 | 8 种 | 6 / 8 / 12 三档角色层级 |

## Stage 1: 色彩体系
**Goal**: 将品牌、命令、链接、语义状态和内容分类拆分为独立 token,建立编辑制作台配色
**Success Criteria**: 无单一 accent 跨职责复用;分类色与成功/错误等语义色严格分离
**Tests**: `pnpm test` + `pnpm typecheck` + 逐页截图回归
**Status**: Completed (2026-07-26)

## Stage 2: 字号体系
**Goal**: 21 档字号收敛到 5 档 token,最小字号从 7px 提到 11px
**Success Criteria**: 无 <11px 文字;固定宽度容器无溢出/截断
**Tests**: 逐页截图检查溢出,重点查 grid 固定列宽处
**Status**: Completed (2026-07-26)

## Stage 3: 圆角与描边
**Goal**: 圆角收敛到 3 档角色层级;卡片使用 1px 级轻阴影,弹层使用独立高程
**Success Criteria**: 卡片边界统一,视觉层次清晰
**Tests**: 截图回归
**Status**: Completed (2026-07-26)

## Stage 4: 关键组件精修
**Goal**: sidebar / topbar / eyebrow / button / stat 卡片对齐参考项目质感
**Success Criteria**: 全页面截图通过人工审阅
**Tests**: dashboard、项目总览、团队、登录、admin 全覆盖截图
**Status**: Completed (2026-07-26)

## 完成记录

- 色彩已集中到根 token:稿纸灰页面、石墨命令、荧光品牌标记,以及资料、知识、策略、制作、
审核五组内容分类色;品牌色不再兼任按钮、链接和状态色。
- 正文字号已收敛为 `11 / 11.5 / 12 / 13 / 14px` 五档,样式中无小于 `11px` 的文字。
- 组件圆角按编辑工具密度调整为 `6 / 8 / 12px` 角色层级,卡片使用 1px 级轻阴影,
弹层使用独立的浮层阴影 token。
- sidebar、生产管线、eyebrow、按钮、统计卡片和登录页已统一到 Editorial Studio;导航与生产阶段
使用分类色定位,清除了登录页废弃装饰规则,并保留统一 `focus-visible` 与减弱动效支持。
- 移动端精修覆盖后台紧凑租户表和团队成员表,关键字段与操作在 `390px` 视口内完整显示。

## 验收结果

- 人工截图:工作台、项目总览、团队、登录、系统后台,均覆盖 `1440px` 桌面与 `390px` 移动端。
- 浏览器检查:上述关键路由在 `390px` 下均无页面级横向溢出,无 console error 或 page error。
- 自动验证:`pnpm --dir web test`(16 tests)、`pnpm --dir web typecheck`、
`pnpm --dir web build`、`go test ./...`、`git diff --check` 全部通过。
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.0
0.4.0
Loading
Loading