初始化提交:contentm_agent 工作区全量快照
内容分四块: 1、产品规划产出 —— MCN 短视频整合营销工作台的①段五份(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)、②段两份(2a 功能/2b 布局)、③段界面(DESIGN.md 契约与令牌表 + mcn-workbench.html 原型 + 实测/会诊/审查三份 + 23 张闸门截图)。 2、开源竞品调研 —— 5 个内容工作台项目的取证原始件与 1b 系列分析文档。 3、参考资料 —— 竞品视频抽帧 1145 张 + 2 个源视频 + 功能点截图。 4、机制侧 —— 协作脚本与状态台账、工作区记忆日志、抽帧/OCR 脚本。 .gitignore 只排运行时日志、脚本备份副本与一次性探针输出,其余按原样入库。
This commit is contained in:
commit
df56c2c137
1773 files changed
+205840
No files matched your search
+138
@@ -0,0 +1,138 @@
|
||||
# 1b 竞品分析 · 第一棒:5 项目清单与初步定位
|
||||
|
||||
> 项目 slug:`content-workbench` | 目标:调研 5 个开源内容工作台项目并生成分析文档
|
||||
> 本棒范围:**只做「仓库骨架 + README 拉齐 ⇒ 5 项目清单与初步定位」**,不做逐个深度分析(留后续棒次)。
|
||||
> 取证时间:**2026-10-07 16:13–16:17(CST)** | 取证环境:GitHub 公开 REST API(`api.github.com`)
|
||||
> 证据落点:本目标目录 `取证/api/`(原始 JSON + README 全文 + 文件树),取证脚本 `取证/_fetch_repos.py`
|
||||
> 方法:不靠二手转述,一律源码级/官方文件级实证;查不到即写「查不到」。
|
||||
|
||||
---
|
||||
|
||||
## 一、总览矩阵
|
||||
|
||||
| # | 项目 | 一句话定位 | 语言 | 许可 | Stars | 最近推送 | 仓库是否含源码 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 1 | ZJU-REAL/**Easel** | 社媒内容工作台(Agent 贯穿 发现→策划→创作→发布→归因) | Python | Apache-2.0 | 3175 | 2026-10-05 | ✅ 完整 |
|
||||
| 2 | wendaoai/**wendao-content-workbench** | 本地优先的公众号 AI 写作/排版桌面工具 | 未标注 | 未标注 | 3 | 2026-09-17 | ⛔ **不含源码(闭源)** |
|
||||
| 3 | krillinai/**OpenCreator** | 创作者 AI 工作台(Codex 驱动,视频/图像/语音/口播) | TypeScript | Apache-2.0 | 12611 | 2026-10-05 | ✅ 完整 |
|
||||
| 4 | gitroomhq/**postiz-app** | 社媒排期工具(agentic scheduling,云 + 自托管双形态) | TypeScript | **AGPL-3.0** | 36809 | 2026-10-07 | ✅ 完整 |
|
||||
| 5 | lumizone/**postsider** | 30+ 平台社媒排期(公开 API + SDK + MCP) | TypeScript | **AGPL-3.0** | 10 | 2026-10-05 | ✅ 完整(**Postiz 的 fork**) |
|
||||
|
||||
**本棒最关键的一条发现**:**5 个项目不是 5 条独立产品线** —— 第 4、5 个是同一代码血统(详见 §三·5)。
|
||||
⇒ 「5 份单项目分析 + 1 份汇总对比」的建议节奏应改为 **4 条独立产品线 + 1 条 fork 关系说明**,否则后两棒会写出大量重复内容。
|
||||
|
||||
---
|
||||
|
||||
## 二、取证口径与证据清单
|
||||
|
||||
- 每个仓库采三样:`repos/{owner}/{repo}`(元数据)、`/readme`(README 全文)、`/git/trees/{branch}?recursive=1`(文件树)。
|
||||
- 原始证据:`取证/api/{easel,wendao,opencreator,postiz,postsider}.repo.json` / `.README.md` / `.tree.json`。
|
||||
- **已知取证缺口**:`opencreator.tree.json` 因响应过大(仓库 383 MB)网络中断 ⇒ 已改为拉**顶层树**+`docs/` 子树补齐(`opencreator.tree.top.json` / `.tree.docs.json`),并在下一棒复拉一次完整树。
|
||||
- **旁证(本工作区既有材料,只读)**:`参考资料/Easel_功能点与截图/`(2026-10-06 制作,取自 Easel 官方 `assets/readme` 截图);`参考资料/AI内容工作台_功能点梳理.md`(基于 B 站 + YouTube 视频抽帧,是**另一个**产品:Obsidian 插件形态的「AI 工作台 3.0」,属**相邻竞品**,不在本次 5 个之列)。
|
||||
|
||||
---
|
||||
|
||||
## 三、逐个初步定位
|
||||
|
||||
### 1、Easel(ZJU-REAL / 浙江大学 REAL Lab + 北大 OpenDCAI Lab)
|
||||
|
||||
- **定位**:开源社媒内容工作台,「一个 Agent 贯穿完整链路」——发现热点 → 策划选题 → 创作图文音视频 → 多平台发布 → 归因回写账号画像。
|
||||
- **形态**:Web 工作台(`easel web` → `localhost:7860`)+ 终端对话(`easel chat`)+ 单技能直跑(`easel skill <name>`)。
|
||||
- **技术栈**:Python 3.10+;`easel/`=CLI;`web/`=FastAPI 后端 + React 前端;Agent 引擎为 **OpenClaw**(独立 `easel` profile,不覆盖用户已有配置);浏览器发布用 Playwright/Chromium;媒体处理用 FFmpeg。
|
||||
- **骨架要点**(1002 个文件):`skills/openclaw/`(**716 个文件**,技能库主体)、`skills/shared/`(55)、`web/frontend/`(48)、`profiles/`(画像,每账号一目录)、`outputs/`(内容项目与成品)、`openclaw/`(隔离 profile 与同步脚本)。
|
||||
- **关键能力**:113 个 Skills(含**可运行脚本**,成品写入 `outputs/`);账号画像六维(定位/风格/受众/平台/偏好与红线/长期记忆);**7 个平台**登录+发布(小红书、抖音、快手、知乎、B 站、微信视频号、微信公众号);发布前质量门禁与敏感/版权检查。
|
||||
- **许可与风险**:Apache-2.0;README 自陈「**谨慎自动发布到小红书**」(平台可能检测自动化 ⇒ 建议预览 + 人工确认)。
|
||||
- **初步归类**:**全链路型**(内容生产 + 分发一体化),本组里唯一覆盖「发现 → 归因闭环」的开源项目。
|
||||
|
||||
### 2、文到 AI(wendaoai/wendao-content-workbench)
|
||||
|
||||
- **定位**:免费、本地优先的**公众号** AI 写作 + 智能排版 + 图片生成 + 内容管理**桌面工具**。
|
||||
- **形态**:桌面应用(基于 **Wails** 构建,面向 Windows / macOS / Linux);数据默认留在本机;AI 模型由用户自选配置。
|
||||
- **技术栈**:仓库**未提供**(README 注明基于 Wails)。
|
||||
- **骨架要点**:**全仓仅 5 个文件** —— `.gitignore` / `NOTICE.md` / `README.md` / `RELEASE_NOTES_0.0.113.md` / `assets/desktop-home.png`。
|
||||
- **关键能力**(据 README 自述):灵感与选题、AI 写作与改稿、公众号编辑(Markdown + 智能排版 + 微信样式预览)、图片生成、卡片工坊(多页图文卡)、营销创作、本地内容库、发布准备(账号/计划/交付状态)。
|
||||
- **⚠️ 硬约束**:**本仓库只用于产品介绍、版本公告与公开资料发布,不包含业务源码**(README 明示「闭源发布」);**当前尚未发布公开安装包**。
|
||||
- **初步归类**:**单平台纵深型**(只做公众号一条链路),开源面≈0 ⇒ **深度分析只能到「文档 + 桌面端体验」层,源码级取证不可得**(下一棒须先确认是否仍按原计划做深度,或降级为对照项)。
|
||||
|
||||
### 3、OpenCreator(krillinai,前身 KrillinAI)
|
||||
|
||||
- **定位**:「创作者 AI 工作台」,**Codex 原生**(不自造 Agent 循环),把 Agent 对话与可视化创作工具装在同一个本地 Runtime 上。
|
||||
- **形态**:Web 单前端实现 + Electron 桌面壳(桌面只补 OS 能力:目录选择、窗口/托盘、原生通知)。
|
||||
- **技术栈**(README 架构表):`apps/web`=React 18 + Vite + TS;`apps/daemon`=本地 Runtime,**Fastify + Runtime API + SSE**;`apps/desktop`=Electron;Agent 引擎=**Codex CLI / app-server**;媒体工具链=yt-dlp + Whisper + FFmpeg;本地数据=SQLite + 文件系统 + 系统凭据存储。
|
||||
- **骨架要点**:`apps/{web,daemon,desktop,harness}` + `packages/{protocol,skill-market}` + `docs/` + `scripts/` + `skills/` + `template/` + `runtime/`。
|
||||
- **关键能力**:Creator Tools 10 项(视频翻译 **14 源语言 / 101 目标语言**、视频下载、缩略图生成、图像生成、文章写作、小红书笔记、短视频脚本、火柴人动画、智能配音、视频生成;自动切片与数字人「开发中」);Creation Templates;Skills + MCP 可扩展;三级记忆(global/project/thread)。
|
||||
- **架构亮点(值得借鉴)**:**「工作台」与「对话」是同一状态机的两个投影** —— 两侧动作都派发给同一个状态机,当前步骤/配置/进度/版本/结果回投到两个界面,「不引入第二个事实源」;且**修订不覆盖结果,每次改稿新建版本**。
|
||||
- **许可**:Apache-2.0;界面支持简中/英/瑞典语。
|
||||
- **初步归类**:**本地 Runtime + Agent 型**(重工程架构,媒体生成能力最强)。
|
||||
|
||||
### 4、Postiz(gitroomhq/postiz-app)
|
||||
|
||||
- **定位**:「终极具身(agentic)社媒**排期**工具」—— 核心是排期/协作/分析,AI 是外挂增强。
|
||||
- **形态**:**双子形态** —— Postiz Cloud(SaaS,含平台预审应用)+ 自托管开源版;README 明确「**不对功能设门槛、不限制许可**」,差别只在基础设施、平台审批与运维责任归属。
|
||||
- **技术栈**:pnpm workspaces 单仓;NextJS(React) + NestJS + Prisma(默认 PostgreSQL) + Temporal + Resend。
|
||||
- **骨架要点**(1018 个文件,截断前):`apps/frontend`(434)、`apps/backend`(61)、`apps/orchestrator`(40,Temporal worker)、`apps/extension`(16,**浏览器扩展**)、`apps/sdk`(7)、`libraries/nestjs-libraries`(283)、`libraries/react-shared-libraries`(57)、`i18n.json`(多语言)。
|
||||
- **关键能力**:多平台排期、分析、团队协作与「交换/购买帖子」、n8n/Make/Zapier 式自动化接入;**agentic 面**含 MCP / CLI / Claude·ChatGPT·Codex·OpenClaw·Cursor 连接器;AI Copilot / AI 图 / AI 视频 / 视频切片 / Smart Agent(**均需自带 Key**)。
|
||||
- **合规姿态(README 显式声明)**:托管服务走平台官方 OAuth;**不抓取/不自动化平台内容**;不收集、不存储、不代理用户 API Key。
|
||||
- **许可**:**AGPL-3.0**(自托管若作为网络服务对外提供,须向使用者开放对应源码 ⇒ 后续若考虑二次分发需注意)。
|
||||
- **初步归类**:**排期/分发中枢型**(本组里生态位最成熟、星标最高、迭代最快)。
|
||||
|
||||
### 5、PostSider(lumizone/postsider)
|
||||
|
||||
- **定位**:30+ 平台的社媒排期,**自带公开 REST API + Node SDK + MCP server**,面向「可编排的自动化后端 + AI Agent 桥」。
|
||||
- **形态**:Docker Compose 一键自托管(镜像 `ghcr.io/lumizone/postsider-app`,默认栈含 PostgreSQL + Redis + Temporal,入口 `localhost:4007`)。
|
||||
- **🔴 溯源结论(本棒实测)**:**PostSider 是 `gitroomhq/postiz-app` 的 fork** —— 其 `ATTRIBUTION.md` 逐字写明「PostSider is a fork of `postiz-app`」,版权归 Nevo David 与 Postiz 贡献者,许可同为 AGPL-3.0;改动部分为**换牌(rebrand)** + **AI Agent Bridge 面(MCP server / public REST API / SDK)**。仓库内另有 `.rebrand-allowlist`(声明哪些上游字样是「有意保留」)与 `scripts/rebrand-check.mjs`(换牌自检)。
|
||||
- **技术栈**:NestJS 11 + Next.js 15/React 19 + PostgreSQL + Prisma 6.5 + Redis + Temporal;存储可选本地文件系统 / Cloudflare R2 / MinIO。
|
||||
- **骨架要点**:与 Postiz **同构** —— `apps/{backend,orchestrator,frontend,commands,sdk,mcp}` + `libraries/{nestjs-libraries,helpers}`,多出 `apps/mcp`(46 个文件)。
|
||||
- **相较上游的增量**:MCP server(**19 个工具**,定位「read-first / draft-first」——Agent 可准备草稿,**发布仍须人工动作**);33 个活跃连接器;团队/多组织;审批流;可选 AI(Post Checker、文案改写)。
|
||||
- **许可**:AGPL-3.0。
|
||||
- **初步归类**:**Postiz 的「Agent 桥」分化版** ⇒ 与第 4 项**共用同一份深度分析基础**,差异集中在 MCP/API/SDK 这一层。
|
||||
|
||||
---
|
||||
|
||||
## 四、格局初判(初步,待后续棒次压实)
|
||||
|
||||
按「内容生产链上覆盖到哪一段」分三层:
|
||||
|
||||
1. **全链路内容生产型** —— Easel(发现→创作→发布→归因,Agent 驱动)。开源、许可宽松,与本目标的「内容工作台」语义最贴。
|
||||
2. **本地创作工具型** —— 文到 AI(只做公众号一条线,桌面本地优先,**闭源**);OpenCreator(重工程 Runtime,媒体生成与视频本地化最强,**Codex 原生**)。
|
||||
3. **排期/分发中枢型** —— Postiz(成熟、生态最大)+ PostSider(其 fork,把 MCP/API/SDK 做成卖点)。
|
||||
|
||||
**三条可直接用于决策的初判**:
|
||||
|
||||
- 「内容工作台」这个词在本组里指两种东西:**做内容**(1/2/3)与**发内容**(4/5)。后续若做自有产品,这两段是要分开定的。
|
||||
- **许可有明显分水岭**:1/3 是 Apache-2.0(可较自由地借用),4/5 是 **AGPL-3.0**(网络服务化会触发开源义务)。
|
||||
- **「闭源但打着开源仓库」是真实存在的形态**(第 2 项)⇒ 调研前必须先验「仓库里到底有没有源码」,否则会按 5 个开源项目排期而实际只有 4 个可做源码级分析。
|
||||
|
||||
---
|
||||
|
||||
## 五、初步可借鉴点(先记,待后续棒次验证与细化)
|
||||
|
||||
- **画像/记忆驱动,而非一次性生成**(Easel):账号画像六维 + 长期记忆,输出随账号持续收敛。
|
||||
- **工作台与对话共用一个状态机**(OpenCreator):避免「界面状态」与「对话上下文」两套事实源打架;修订新建版本不覆盖。
|
||||
- **发布是「有门禁的动作」**(Easel 质量门禁 / PostSider draft-first / Postiz 平台合规 OAuth):三家都把「自动发布」收敛成「先生成 + 再确认」。
|
||||
- **技能 = 可运行脚本**(Easel 113 Skills 自带脚本、产物落盘),不是功能清单。
|
||||
- **MCP/API/SDK 作为对外面**(Postiz、PostSider):把「Agent 可调用」做成一等公民接口。
|
||||
|
||||
---
|
||||
|
||||
## 六、查不到 / 待核实(⛔ 不猜)
|
||||
|
||||
1. **各项目的真实用户量 / 商业数据**:GitHub 星标、fork、issue 数已取(见总览矩阵);**下载量、活跃用户、营收** —— 查不到。
|
||||
2. **文到 AI 的技术栈与内部实现**:仓库无源码 ⇒ 查不到。
|
||||
3. **OpenCreator 的完整文件树**:本棒因响应过大中断,只取到顶层 + `docs/` 子树 ⇒ 下一棒复拉。
|
||||
4. **PostSider 与 Postiz 的代码差异量级**(改了多少、是否只是换牌):已确认 fork 关系,但**差异行数/改动范围未量化** ⇒ 下一棒做 diff 级取证。
|
||||
5. **各项目的定价**(Postiz Cloud 各档、PostSider 托管形态):README 未列具体价格 ⇒ 查不到(Postiz Cloud 需另查官网)。
|
||||
|
||||
---
|
||||
|
||||
## 七、下一棒建议
|
||||
|
||||
1. **先做 Postiz 与 PostSider 的分叉取证**(`ATTRIBUTION.md` + 版本差异 + 增量面),把「5 份分析」的重复度压掉 —— 这两项应合成一份「同源双形态」分析。
|
||||
2. **Easel 深度分析**(`skills/openclaw/` 716 个文件的技能体系 + `docs/skill-function-mapping.md` 能力地图 + Web 前端功能面),旁证可复用 `参考资料/Easel_功能点与截图/`。
|
||||
3. **OpenCreator 深度分析**(先补拉完整文件树 + `packages/protocol` 契约 + `docs/specs`)。
|
||||
4. **文到 AI**:**在开工前先与用户确认**是否仍按「开源项目深度分析」做 —— 该仓库无源码,最多只能做「文档级 + 桌面端体验级」分析。
|
||||
5. 收口:五份分析齐后,按 1b 形态产出**跨项目汇总对比文档**(验收判据第 3 条)。
|
||||
|
||||
---
|
||||
|
||||
*本文件为第一棒产物。原始证据见同目录上级 `取证/api/`;台账见 `tmp/supervise-inbox/tasks.json`。*
|
||||
+294
@@ -0,0 +1,294 @@
|
||||
# 1b 竞品分析 · 第三棒:Easel 深度分析
|
||||
|
||||
> 项目 slug:`content-workbench` | 目标:调研 5 个开源内容工作台项目并生成分析文档
|
||||
> 本棒范围:**只做第 1 项 `ZJU-REAL/Easel`(`https://github.com/ZJU-REAL/Easel`,Apache-2.0)**。
|
||||
> ⛔ 本轮不碰 OpenCreator / 文到 AI / 跨项目汇总 —— 那是后续棒次。
|
||||
> 取证时间:**2026-10-07 17:06–17:19(CST)** | 取证环境:GitHub 公开 REST / contents / raw API(本机直连;`raw` 通道不稳,改用 `contents` API 取正文)
|
||||
> 证据落点(本目标目录内):`取证/api/easel.repo.json` · `easel.README.md` · `easel.tree.json`(**第 1 棒已拉,本棒只读复用,⛔ 未重复下载**)|`取证/easel/`(本棒新拉 17 件:官方文档 4 份 + 配置与契约 6 份 + 两个代表性 `SKILL.md` + releases/tags/languages/contributors)
|
||||
> 本棒新脚本:`取证/_easel_tree_stat.py`(文件树统计)→ `取证/easel.tree.stat.json`(可复算)
|
||||
> 旁证(只读,未写入):工作区 `参考资料/Easel_功能点与截图/`(含 4 张官方界面截图)
|
||||
> 方法:**源码级/官方文件级实证优先**;**每条结论标来源 + 取证时间**;查不到即写「查不到」,⛔ 不猜、⛔ 不编数字。
|
||||
|
||||
---
|
||||
|
||||
## 一、本棒最重要的六条结论
|
||||
|
||||
1. **这不是"又一个排期工具",而是一整套"技能即能力"的 Agent 工作台**:全仓 1002 个文件里 **771 个在 `skills/`**,其中 **`skills/openclaw/` 716 个文件、114 个技能目录、每个目录一个 `SKILL.md`**(源码级逐个数出,见 §五)。排期/发布只是 114 个技能里的 20 个。
|
||||
2. **"技能是真执行"有源码级支撑**:技能不只是提示词 —— **146 个 `.py`、179 个 `references/*.md`** 挂在技能树下;**32 个技能带 `scripts/`、54 个带 `references/`**(§5.1)。
|
||||
3. **产品化的关键设计是"三层加载"+"常驻层精简"**:`SKILL-SPEC.md` 写明 Metadata(frontmatter,常驻)/ Instructions(`SKILL.md` 主体,触发时)/ Resources(`references/`+`scripts/`,按需)三层,并**明令 `SKILL.md` 主体 ≤200 行、领域知识外置到 `references/`**(§5.2)。这是让 114 个技能能同时挂在一个 Agent 上而不炸 prompt 的机制。
|
||||
4. **能力地图口径有三个不同数字,以文件树实数为准=114**(§六):仓库徽章写 **113**、地图正文写 **114**、地图自己的分层总览表相加只有 **113**(创作层列 51,正文实列 52 条);`CHANGELOG` 亦写 0.2.0 起为 114 ⇒ **114 为准,徽章是旧的**。
|
||||
5. **发布侧带"内容安全闸门 + 人设闸门"两道治理**,且**都有确定性脚本实现**(§八):`content_guard.py` 出站内容硬拦(敏感信息 `exit 7`)+ `persona_gate.py` 人设一致性低于 80 分只告警不阻断。这是"让 Agent 真发东西"能落地的必要件。
|
||||
6. **它对"自动化发布"的态度是"能做但明示风险"**:README 直接写「谨慎自动发布到小红书」,小红书技能 `SKILL.md` 也自带风险段并内置反检测参数(§十)。**与 Postiz 的"官方 OAuth、不自动化不抓取"路线正好相反** —— 两条路线同一条产品线上不可混(同第 2 棒 §八第 4 条)。
|
||||
|
||||
---
|
||||
|
||||
## 二、仓库元数据与许可(源码级)
|
||||
|
||||
| 项 | 值 | 来源 |
|
||||
|---|---|---|
|
||||
| 全名 / 归属 | `ZJU-REAL/Easel` —— **浙江大学 REAL Lab + OpenDCAI Lab**(组织账号,`type: Organization`) | `取证/api/easel.repo.json`(2026-10-07 16:14)· README 首部校徽 |
|
||||
| 描述 | 「An open-source AI agent for social media — discover trends, create content, publish everywhere, and learn what works across Xiaohongshu, Douyin, Zhihu, Bilibili, and more.」 | 同上 |
|
||||
| 许可 | **Apache-2.0**(`license.spdx_id`;仓库根有 `LICENSE`) | 同上 + 文件树 |
|
||||
| 创建 / 最近推送 | 创建 **2026-08-28**;最近推送 **2026-10-05**;元数据更新 2026-10-07 | 同上 |
|
||||
| Stars / Forks / Watchers | **3175 / 486 / 3175**;open issues 19;subscribers 18 | 同上 |
|
||||
| 默认分支 / 根树 sha | `main`;`tree_sha = 6c049ceb73b1b74a73448664dcd4dbc7e051442a` | `取证/api/easel.tree.json`(2026-10-07 16:14) |
|
||||
| 文件规模 | **1002 个 blob + 274 个 tree,`truncated=false`(整树完整,未截断)** | `取证/easel.tree.stat.json`(本棒 17:1x) |
|
||||
| 语言构成(字节) | Python 2,320,394 / HTML 987,825 / TypeScript 643,318 / CSS 94,907 / Shell 67,915 / PowerShell 29,927 / JavaScript 6,082 | `取证/easel/api_languages.json`(17:1x) |
|
||||
| 贡献者 | **12 人**(contributors API,`per_page=100` 未翻页即到底) | `取证/easel/api_contributors.json`(17:1x) |
|
||||
| 版本 | `pyproject.toml` version **0.2.1**;releases 最新 **v0.2.1(2026-09-24)**,历史 v0.1.0(08-31) → v0.1.1(09-14) → v0.2.0(09-17) → v0.2.1(09-24) | `取证/easel/api_pyproject.toml` · `api_releases.json` · `api_tags.json` · `api_CHANGELOG.md` |
|
||||
| 项目主页 | https://zju-real.github.io/Easel/ (README 徽章指向) | `easel.README.md` |
|
||||
|
||||
**顶层目录分布(blob 数)**:`skills/` 771 | `web/` 88 | `assets/` 63 | `tests/` 24 | `easel/` 15 | 根文件 12 | `scripts/` 10 | `profiles/` 7 | `docs/` 6 | `openclaw/` 4 | `.github/` 1 | `outputs/` 1。
|
||||
来源:`取证/easel.tree.stat.json`(本棒 17:1x)。
|
||||
|
||||
> 🔴 **许可与治理要分开看**:仓根 `LICENSE` 是 Apache-2.0,但**技能树内另有两份第三方许可** —— `skills/openclaw/gzh-design/LICENSE`(`CHANGELOG` 0.1.1 逐字写 AGPL-3.0)与 `skills/openclaw/video-production/vendor/video-pipeline-sdk/LICENSE`(0.2.0 逐字写 MIT)。来源:文件树 + `api_CHANGELOG.md`(17:1x)。
|
||||
|
||||
---
|
||||
|
||||
## 三、产品定位
|
||||
|
||||
- **一句话(README 逐字)**:「你的私人、持续进化的社媒运营助手|从一个想法开始,完成发现、策划、创作、发布与复盘。」
|
||||
- **是什么(README 逐字)**:「一个面向社交媒体创作者的开源内容工作台。它把 **OpenClaw Agent、账号画像、内容技能和真实的媒体工具**接在一起,让 Agent **不只回答"应该怎么做",而是直接把内容做出来并归档**,且可实现直接/按需发布。」
|
||||
- **五个自我宣称的差异点(README「为什么是 Easel」逐条)**:
|
||||
1. 一个 Agent 贯穿完整链路(发现→评估→规划→生成→制作→发布→归因同一工作流);
|
||||
2. **画像驱动而非一次性生成**(每账号独立定位/风格/受众/平台/偏好/记忆);
|
||||
3. **技能是真执行,不是功能清单**(配可运行脚本,成品写入 `outputs/`);
|
||||
4. 一份素材多种平台形态;
|
||||
5. **项目化保存产物**(内容/素材/中间件/元数据按项目归档);
|
||||
6. 真实发布与复盘闭环(7 个平台)。
|
||||
- **目标用户**:中文社媒创作者 / 个人与团队运营(README 的 Slogan、SOUL.md 的"创作者"口径、`docs/` 全中文)。
|
||||
- **形态**:**本地自托管工作台** —— 单一仓库同时给 CLI(`easel`)与 Web(`easel web`,默认 `localhost:7860`);不需要云账号。README 明确「推荐使用 Web 前端」并解释"比单独用 CLI 更全面"。
|
||||
- **研究背景(README 自述)**:「从研究走向真实生活……将研究成果应用到真实社媒创作场景」,且定位为持续研究方向(社媒社交智能)。
|
||||
|
||||
来源:`取证/api/easel.README.md`(第 1 棒 2026-10-07 16:14 拉取,本棒只读复用);`取证/easel/api_openclaw_workspace_SOUL.md`(17:1x)。
|
||||
|
||||
---
|
||||
|
||||
## 四、五层内容工作流
|
||||
|
||||
| 层 | README 逐字职责 | 技能层数(能力地图) |
|
||||
|---|---|---|
|
||||
| **发现** | 聚合热榜、行业新闻、竞品动态和用户讨论,筛选真正适合账号的机会 | 9(+基础 6 共 15) |
|
||||
| **策划** | 把机会变成选题、标题、脚本和内容矩阵,写入内容日历 | 16 |
|
||||
| **创作** | 生成文案、卡片、海报、信息图、音频、视频、短剧和论文解读等可发布素材 | 51(正文实列 52) |
|
||||
| **发布** | 按平台适配标题、正文、画幅和媒体要求,执行发布前检查并发送到已登录账号 | 20 |
|
||||
| **归因** | 读取播放、互动、评论和内容表现,把有效结构和偏好沉淀回账号画像 | 11 |
|
||||
|
||||
来源:`取证/api/easel.README.md`(16:14)· `取证/easel/docs_skill-function-mapping.md`(17:1x)。
|
||||
|
||||
⚠️ **层次名在两份官方文件里不完全一致**:`SKILL-SPEC.md` 的 `layer` 枚举写作 `discover / plan / **produce** / publish / attribute / general`,而 README 与能力地图用「发现/策划/**创作**/发布/归因」。**同一套五层,措辞不同**(`general`=跨切面基础设施,如画像管理/产物管理/模板库)。来源:`取证/easel/docs_SKILL-SPEC.md`(17:1x)。
|
||||
|
||||
---
|
||||
|
||||
## 五、技能体系深度(本棒重点 · `skills/openclaw/`)
|
||||
|
||||
### 5.1 量化分布(源码级逐个数出)
|
||||
|
||||
- **`skills/` 共 771 个文件**:`skills/openclaw/` **716** + `skills/shared/` **55**。
|
||||
- **`skills/openclaw/` = 114 个技能目录,每目录恰好 1 个 `SKILL.md`(114/114)**;目录下**没有散落文件**(`skills/openclaw/` 根层零 blob)⇒ **"一个目录=一个技能"是硬结构**。
|
||||
- **技能树内的工程件**(口径写清):`skills/` 全域 `references/*.md` **179** 个 | `skills/` 全域 `.py` **146** 个(**`openclaw/` 98 + `shared/` 48**)| `skills/openclaw/` 下 `.md` **399** 个 | `skills/openclaw/` 下 `.json` **81** 个(配置/清单)。
|
||||
- **带子目录的技能**:**32 个带 `scripts/`**、**54 个带 `references/`**、**仅 1 个带 `tests/`**(`skill-wechat-publisher`,6 个文件)。
|
||||
- **`skills/shared/`(跨技能共享层)55 个文件**,含 **48 个 `.py`**:`social_stats.py`、`wordcount.py`、`render_card.py`、`image_ops.py`、`audio_ops.py`、`video_ops.py`、`asr.py`、`tts.py`、`ai_image.py`、`ai_video.py`、`ai_music.py`、`xhs_publish.py`、`content_guard.py`、`manifest.py`、`output_paths.py`、`persona_gate.py`、`model_registry.py` 等 + 3 份共享知识(`hotlist-apis.md` / `pillar-and-cadence.md` / `scoring-dimensions.md`)。
|
||||
- **技能体量呈长尾**(文件数):`skill-wechat-publisher` **119** > `video-production` **100** > `gzh-design` **71** > `ecom-details-image` 33 > `skill-xhs-analyzer` 30 > `short-drama` 16 > `xhs-note-creator` 14 …… 另一端大量技能**只有 1 个文件(纯 `SKILL.md`)**:`audio-mix` / `audio-visualizer` / `batch-process` / `beat-sync-video` / `doc-convert` / `green-screen` / `image-enhance` / `meme-generator` 等。
|
||||
- **重包内部构成**(源码级):
|
||||
· `video-production`(100):**97 个在 `vendor/video-pipeline-sdk/`**(上游 MIT SDK 整体内联)+ `SKILL.md` + `EASEL-META.md` + 1 个脚本。
|
||||
· `skill-wechat-publisher`(119):`assets/` 85 / `scripts/` 14 / `references/` 10 / `tests/` 6 / `SKILL.md` + `EASEL-META.md` + `brief.md.example` + `wechat-publisher.yaml.example`。
|
||||
· `gzh-design`(71):`archive/` 38 / `references/` 11 / `docs/` 9 / `scripts/` 4 / `assets/` 3 + `LICENSE` + `CONTRIBUTING.md` + `EASEL-META.md`。
|
||||
|
||||
来源:`取证/easel.tree.stat.json` + 本棒现算(2026-10-07 17:1x,脚本 `取证/_easel_tree_stat.py` 及同期查询);技能能力描述见 `取证/easel/docs_skill-function-mapping.md`。
|
||||
|
||||
### 5.2 三层加载机制(`docs/SKILL-SPEC.md` v0.3)
|
||||
|
||||
| 层 | 内容 | 加载时机 | token 开销(文档原话) |
|
||||
|---|---|---|---|
|
||||
| Metadata | frontmatter(`name`, `description`) | **常驻**,用于 SKILL 路由 | 极小 |
|
||||
| Instructions | `SKILL.md` 主体 | SKILL 被触发时 | 中等 |
|
||||
| Resources | `references/` + `scripts/` | SKILL 执行中**按需读取** | 按需 |
|
||||
|
||||
**核心原则(逐字)**:「`SKILL.md` 只写"怎么做",领域知识写在 `references/` 里」;**`SKILL.md` 主体控制在 200 行以内**;`scripts/` 里的代码**不进 prompt**。
|
||||
**目录约定**:`skill-xxx/` 下 `SKILL.md`(必须)+ `references/`(可选)+ `scripts/`(可选)+ `tests/`(可选,`test1.prompt` / `test1.expected` 关键字匹配)。
|
||||
⚠️ **实测缺口**:整棵树里 **`.prompt` / `.expected` 文件数为 0** ⇒ 规范里那套"低成本模型验证"的 `tests/` 约定**在现网未被使用**(唯一带 `tests/` 的是 `skill-wechat-publisher`,用的是标准 `pytest` 形态)。
|
||||
**frontmatter 规则(逐字 + 禁令)**:只保留 `name` / `description` / `layer` 三个常规字段;`description` **必须中文写清能力、触发场景/用户说法、相邻 SKILL 边界**(是 Agent 的主要触发依据);**明令禁止** `version`、`profile_aware`、`self_developed`、`metadata.trigger/impl/source`、`allowed-tools`、`tags`;**来源信息放 `EASEL-META.md`**,执行约束与 Profile 行为写正文。
|
||||
**实测印证**:全库 **94 个 `EASEL-META.md`**(114 个技能里 94 个写了溯源元数据)。示例 `skill-quality-gate/SKILL.md` 的 frontmatter 恰为 `name/description/layer: publish` 三项,与规范一字不差。
|
||||
|
||||
来源:`取证/easel/docs_SKILL-SPEC.md` · `api_skills_openclaw_skill-quality-gate_SKILL.md`(17:1x)· 文件树(`EASEL-META.md` 计数)。
|
||||
|
||||
### 5.3 技能是"流程说明书 + 确定性脚本"的双件结构(实读两个样本)
|
||||
|
||||
- **`skill-quality-gate`**(发布层,2525 B):输入/输出/执行步骤三段式;输出是**固定 JSON schema**(`overall_verdict` / `compliance.issues[]` / `quality.dimensions[]` / `top_fixes[]`);两道关(合规检测 + 质量审核)分别读 `references/general-rules.md`、`platform-*.md`、`review-dimensions.md`、`review-levels.md`、`rework-rules.md`;末节「Profile 感知」写明有/无画像时的不同退路。**SKILL.md 本身不含规则细节 —— 规则全在 `references/`**,正是三层加载的实证。
|
||||
- **`skill-xhs-publisher`**(发布层,5280 B):`description` 里**写明移植来源**「流程与选择器移植自成熟开源实现 `xiaohongshu-mcp`(含发布成功校验、上传完成等待、话题联想绑定、新旧发布按钮兼容、反检测)」;执行全部走确定性脚本 `../../shared/scripts/xhs_publish.py`;**明写 `SELECTORS` 单点维护**(发布页结构变更只改一处字典,不散改流程);**风险段逐字**:「小红书自动化发布存在被平台风控、限流、封号的风险……脚本已内置反检测(`--disable-blink-features=AutomationControlled` + 逐字符输入 + zh-CN + 登录态持久化),但风险不可完全消除」,并建议优先测试号、小流量、人工复核;**成功判据是脚本内置的 URL 校验**(离开 `/publish/publish` 才算成功)。
|
||||
|
||||
来源:`取证/easel/api_skills_openclaw_skill-quality-gate_SKILL.md` · `api_skills_openclaw_skill-xhs-publisher_SKILL.md`(17:1x)。
|
||||
|
||||
### 5.4 全库校验脚本(技能体系的"编译器")
|
||||
|
||||
`SKILL-SPEC.md` 给出两条全库校验,都在仓根 `scripts/`:`validate_skills.py`(检查 frontmatter、资源链接、输出与**发布安全契约**)与 `validate_skill_commands.py`(**解析 Skill 里的 Python 命令,对照脚本 argparse 定义检查路径与参数漂移**)。⇒ 把"技能文档 ↔ 实际脚本参数"的一致性做成机器可查。
|
||||
来源:`取证/easel/docs_SKILL-SPEC.md`(17:1x)· 文件树(两条脚本均在)。
|
||||
|
||||
---
|
||||
|
||||
## 六、能力地图与"三个数字"的口径差
|
||||
|
||||
`docs/skill-function-mapping.md` 是官方**能力地图**(README 徽章与「文档」节都指向它),按五层逐条列出每个技能的职责边界。**口径差必须写清**:
|
||||
|
||||
| 出处 | 数字 | 读法 |
|
||||
|---|---|---|
|
||||
| **文件树实数**(本棒逐个数) | **114** 个技能目录、114 个 `SKILL.md` | ✅ **以此为准** |
|
||||
| 能力地图**正文首段** | 「当前共 **114** 个 Skill」 | ✅ 与实数一致 |
|
||||
| 能力地图**分层总览表**逐行相加 | 6+9+16+**51**+20+11 = **113** | ⚠️ 表里创作层记 51,而**正文实列 52 条**(本棒逐条数过)⇒ 表内自相矛盾 |
|
||||
| README 徽章 | 「Skills-113」 | ⚠️ **旧值**(0.1.1 时代) |
|
||||
| `CHANGELOG` | 0.1.0 = 112 → 0.1.1 = 113(加 `gzh-design`)→ **0.2.0 = 114**(加 `video-production`) | ✅ 解释了 113 的来源,且与实数一致 |
|
||||
|
||||
**另一处口径差**:`CHANGELOG` 0.2.1 写「CI 现在跑 `pytest` 而不是 `pytest tests/`,**使 `skills/**/tests/` 下的 38 个技能自带测试真正运行**」;而本棒实测该子树只有 **6 个文件**(**全部在 `skill-wechat-publisher/tests/`**)。⇒ 38 应为**用例数**而非文件数(⚠️ **未逐条核对,标未核实**)。
|
||||
来源:`取证/easel/docs_skill-function-mapping.md` · `api_CHANGELOG.md` · `api/easel.README.md` · 文件树(17:1x)。
|
||||
|
||||
**能力地图覆盖的关键边界声明(对做产品最有用的部分)**:技能之间显式写分工(如 `xhs-publisher`=发布 / `xhs-comment-reply`=评论区 / `xhs-analyzer`=分析),并写触发语(如 `skill-quality-gate` 的「检查合规/能不能发/有没有敏感词/审核一下」)。⇒ **"技能边界"是产品级文档,不是内部注释**。
|
||||
|
||||
---
|
||||
|
||||
## 七、Web 前端功能面(组件级)
|
||||
|
||||
`web/` 共 88 个 blob:`web/app.py`(FastAPI 单文件后端)+ `web/frontend/`(React + Vite)+ `web/static/showcase/`(33 个官网素材,视频为 6 秒轻量预览)。
|
||||
|
||||
**前端源码共 36 个文件**(`web/frontend/src/`:**26 个 `.tsx` + 7 个 `.ts` + 3 个 `.css`**)。按组件反推的**页面清单(源码级,非文档转述)**:
|
||||
|
||||
| 页面组件 | 反推功能 |
|
||||
|---|---|
|
||||
| `Sidebar.tsx` | 左侧主导航(+`SubNav.tsx` 子导航),权威的页面结构来源 |
|
||||
| `DashboardPage.tsx` | 工作台总览 |
|
||||
| `ChatPage.tsx` + `MessageBubble.tsx` + `QuestionCards.tsx` | 对话页(多轮 + `ask_user` 问答卡) |
|
||||
| `SkillPage.tsx` + `SkillDrawer.tsx` + `lib/skillDisplayNames.ts` | 技能库(浏览 + 直接运行 + 中文显示名映射) |
|
||||
| `OutputsPage.tsx` + `lib/linkifyOutputs.ts` | 内容库(产物项目 + HTML 预览 + 公众号复制) |
|
||||
| `AccountsPage.tsx` | 账号(各平台登录态) |
|
||||
| `ProfilePage.tsx` | 画像(六维编辑) |
|
||||
| `TrendsPage.tsx` | 热点雷达 |
|
||||
| `IdeasPage.tsx` | 选题库 |
|
||||
| `CalendarPage.tsx` | 内容日历 |
|
||||
| `PublishPage.tsx` | 发布中心 |
|
||||
| `BreakdownPage.tsx` | 内容拆解 |
|
||||
| `SettingsPanel.tsx` + `settingsIcons.tsx` + `lib/api.ts` | 设置(模型/环境/更多;`CHANGELOG` 0.2.1 写六通道可编辑:chat/transcribe/image/video/music/speech) |
|
||||
| `EnvBoard.tsx` | 环境安装(后台安装 + 进度回写) |
|
||||
| `OnboardingWizard.tsx` | 新手引导 |
|
||||
| `BrushEntry.tsx` | 「笔」能力菜单(0.2.0:点击浏览"能做的都在这",选中即预填 prompt) |
|
||||
| `lib/capabilityMenu.ts` / `lib/store.ts` / `lib/whoami.ts` / `lib/sanitize.ts` / `ErrorBoundary.tsx` / `ThemeToggle.tsx` / `icons.tsx` | 能力菜单数据、状态、身份、净化、错误边界、主题切换、图标 |
|
||||
|
||||
**后端是一个文件**:`web/app.py`(`pyproject.toml` 依赖 `fastapi` + `uvicorn` + `sse-starlette` + `httpx`)。`CHANGELOG` 0.2.1 记录两处后端改动:对话改走**常驻网关的 OpenAI 兼容 HTTP 端点**(省约 3 s/turn,Linux 实测 7.6s → 4.5s);`/api/outputs` 移到线程池(全产物树扫描不再阻塞事件循环)。
|
||||
|
||||
**旁证(只读)**:`参考资料/Easel_功能点与截图/` 有 4 张**官方界面截图** —— `01_画像_账号画像配置.png`、`02_热点雷达_多平台热榜.png`(微博/抖音/知乎/B站/百度/头条六栏)、`03_内容日历.png`、`04_发布中心_多平台适配.png`;该目录说明**官方仅提供这 4 张工作台截图**,对话/技能库/内容库/账号页无官方截图(如需可 `easel web` 后实时截)。
|
||||
来源:`取证/easel.tree.stat.json`(17:1x)· `api_CHANGELOG.md` · `api_pyproject.toml` · `参考资料/Easel_功能点与截图/README.md`(只读)。
|
||||
|
||||
---
|
||||
|
||||
## 八、执行契约与治理(真正决定"能不能真跑"的部分)
|
||||
|
||||
### 8.1 `AGENTS.md`(Layer 2,常驻 prompt)—— 本棒最有价值的一份
|
||||
|
||||
`openclaw/workspace/AGENTS.md`(9595 B)是 Agent 的**行为总章程**,含大量可直接借用的工程约束:
|
||||
|
||||
- **先路由 SKILL**:「每轮任务……先找精确匹配的 SKILL,并按其流程、脚本、数据源和边界执行;无精确匹配时复用最接近的 SKILL,无相关 SKILL 才用通用能力。」
|
||||
- **先到项目根再跑脚本**;**禁止从 workspace 或某技能目录运行项目脚本**(防"跑了副本"—— 与 2026-10-04 本机踩过的 P0-57 是同一种病)。
|
||||
- **先查再问**(登录态/画像/历史产物/本地配置),只有关键输入确实无法推断时才问用户。
|
||||
- **付费操作先确认**:「生图、生视频、音乐等按量计费操作**先给范围、计划和可得的费用预估,等用户确认后再发请求**。」
|
||||
- **真实产物才算完成**:「不以计划、空壳文件、中途文件或仅有提示词冒充成品;交付前必须自检。」
|
||||
- **媒体模型选择**:调三方模型前用 `model_registry.py configured` 脱敏查询;**多个可用就列出并询问,不按默认值擅选**;零个则提示配置且**不发付费请求**。
|
||||
- **产物布局规约**:`outputs/<主题>/` 一个项目一目录,**成品放项目根、中间件进 `assets/`**、测试进 `outputs/_scratch/`;**禁泛名**(`xhs/test/tmp/output`);写入前过 `output_paths.py` 的 `validate_output_path()`;**系统状态目录一律 `_` 前缀**(`_login/_publish/_analytics/_profile_build/_scratch`),内容库只展示项目目录。
|
||||
- **编排**:跨两层以上才建 manifest,**只传"产物路径 + 一句结论"**,不复制内容;每个 SKILL(含**制作层**)都读 `SKILL.md`、明确要点并自检;**失败从断点续跑**,中途产物不得按成功交付。
|
||||
- **对话附件隔离**:后端按会话隔离,本轮消息里给唯一"系统附件清单",**只许用清单列出的路径,禁止扫描/枚举/猜测** `outputs/_inbox/`。
|
||||
- **画像记忆作用域**:`profiles/<画像>/memory.md` 是该会话**唯一**账号长期记忆;**工作区根全局 `MEMORY.md` 不承载画像/经验/红线**(读它、写它、为切画像改写软链都被明令禁止)⇒ **并行会话不互相覆盖**。
|
||||
|
||||
### 8.2 发布安全闸门(两级,源码级)
|
||||
|
||||
- `skills/shared/scripts/content_guard.py::guard_or_die(...)`:**任何把文本发到公开平台的脚本,真发(`--exec`)前必须过它**。**BLOCK 级**=真·敏感信息(API key / 内部 URL 域名 / 代理 IP / 内部路径 / env 名与 `.env` 真值)⇒ **fail-closed,退出码 7 阻止发布**;**WARN 级**=AI 措辞与模型名 ⇒ **只提醒不拦截**(论文解读、AI 科普里可能正常)。dry-run 全告警;硬拦放行须显式 `--allow-unsafe`。
|
||||
- `skills/shared/scripts/persona_gate.py check --score <分>`:**≥80 pass,<80 warn**;人设检查**只提醒、永不阻断发布**;发布后 `record` 留痕(供归因)。
|
||||
- **0.2.1 还封了两处真实漏洞**(`CHANGELOG` 逐字,值得单列):① **`.env` 写入的命令注入** —— 旧守卫只拒换行,而 `setup.sh` 会 `source .env`,`KEY=$(id)` 这类非换行值仍会进 bash 命令替换 ⇒ 改为**按字段实际需要的字符集白名单**;② **公众号预览页的 CSP** —— 预览 iframe 需要 `allow-scripts`,而 Web API 是 CORS 开放且无鉴权的(已在真实浏览器里复现:生成内容里嵌脚本可调本地端点并读响应)⇒ 加 `connect-src 'none'` 掐断这条外传路径、同时保留复制按钮与图片渲染。
|
||||
|
||||
### 8.3 产物与层间契约(`manifest.py`)
|
||||
|
||||
`SKILL-SPEC.md` 定义了产物元数据的**单一文件** `outputs/<主题>/.easel.json`,两部分:**① 展示头**(标题/平台/状态/封面/标签/成品清单,供内容库富展示)+ **② 层间产物契约 `steps[]`**(上游产物路径与关键结论结构化传递,下游用 `latest`/`read` 取,**不重新推导**)。`layer` 取 `discover/plan/produce/publish/attribute/general`,step `status` 取 `done/failed`(失败也登记,供断点续跑)。**有界编排约定**:manifest 只当**薄索引**,**不复制内容**;不体现在产物里的决策/意图(基调、受众、钩子、do/don't)写进 `brief.md` 并同样列入 `--outputs`。
|
||||
来源:`取证/easel/api_openclaw_workspace_AGENTS.md` · `docs_SKILL-SPEC.md` · `api_CHANGELOG.md` · `api_skills_shared_README.md`(17:1x)。
|
||||
|
||||
---
|
||||
|
||||
## 九、账号画像(六维)
|
||||
|
||||
- **一个画像 = `profiles/<名字>/` 一个目录,六维**:**定位(`identity.md`)· 风格(`style.md`)· 受众(`audience.md`)· 平台(`platforms.md`)· 偏好与红线(`preferences.md`)· 长期记忆(`memory.md`)**(+目录 `README.md`)。
|
||||
- **跨平台复用**:同一画像可跨多个已登录平台使用;README 亦给 `cp -r profiles/_template "profiles/我的账号"`。
|
||||
- **画像进 prompt 的方式**(`docs/prompt-stack.md` 逐字):**不写全局 USER.md(会有并发竞态)**,而是 CLI 与 Web 统一**把画像作为消息内联** —— 每条消息前缀「我当前使用的画像是「X」。」(`easel/persona.py:persona_prefix`);三入口画像逻辑收敛到一个模块。
|
||||
- **读取分工**:发现/策划/发布/归因读六维;**制作层不读 `platforms.md`**,只凝练制作相关维度,并**原样遵守 preferences 红线**。
|
||||
- **沉淀规则**(AGENTS.md):只在出现**真正可复用**的偏好/红线/制作技巧/效果归因时,凝练 **1–3 条**并**先问用户**再写入;一次性规格、临时参数、流水账**不沉淀**;不记 Key/token/路径。
|
||||
来源:`取证/easel/api_openclaw_workspace_AGENTS.md` · `docs_prompt-stack.md` · README · 文件树(`profiles/_template/` 7 文件,与六维+README 一致)。
|
||||
|
||||
---
|
||||
|
||||
## 十、平台支持、发布安全与"已知问题"
|
||||
|
||||
- **支持的发布平台 7 个(README 逐字)**:小红书、抖音、快手、知乎、B 站、微信视频号、微信公众号。发布技能在能力地图发布层 20 项里可一一对应(`skill-xhs-publisher` / `skill-douyin-upload` / `skill-kuaishou-upload` / `skill-zhihu-publisher` + `skill-zhihu-answer` / `skill-bilibili-upload` / `skill-channels-upload` / `skill-wechat-publisher`)。
|
||||
- **发布层还有 12 项"非发布动作"**:跨平台发布/内容复用/排期/短链 / 质量门禁/风险扫描/发布清单/人设检查/SEO 优化 / 评论运营/小红书回评/发布通知。⇒ **"发布"在本项目里被拆成"平台对接 + 治理 + 互动"三块**,不是一条 `POST`。
|
||||
- **🔴 公开的风险提示(README 逐字)**:「**谨慎自动发布到小红书**:小红书平台可能检测自动化操作,存在验证、限流或账号风控风险;建议使用预览与发布前检查,并由用户确认后手动发布,其他平台正常。」
|
||||
- **已知问题(`docs/known-issues.md`,两则,本棒实拉)**:① **CLI 终端对话「问答题」后回复重复显示** —— 根因在**上游 OpenClaw 本体的会话投影逻辑**(不在 Easel 仓库内),已在上游复现并提交 PR `openclaw#144730` / `#144892`;官方规避建议=**改用 Web 工作台**(后端自行渲染,不经该投影逻辑);`easel doctor` 已加 OpenClaw 最低版本检查 `≥ 2026.6.11`。② **第三方代理/兼容端点 LLM 一直超时(#9、#11)** —— 根因是旧版 OpenClaw 的 provider schema 要求 anthropic 配置**原子写入**、且不认 `timeoutSeconds`;已改为整块一次性写入 + 老版本降级为尽力而为。
|
||||
- **安装三条硬门槛(README)**:Python 3.10+;**Node.js 24.16+(24.x)/ 26.1+(26.x)/ 27+,25.x 与 26.0 不兼容**;FFmpeg、Playwright/Chromium。Windows 走原生 `setup.ps1`(`winget` 自动装缺件),**不需要 WSL**。
|
||||
来源:`取证/easel/docs_known-issues.md` · `api_skills_openclaw_skill-xhs-publisher_SKILL.md` · `api/easel.README.md`(17:1x / 16:14)。
|
||||
|
||||
---
|
||||
|
||||
## 十一、技术栈与配置面
|
||||
|
||||
- **栈(README + `pyproject.toml`)**:Python 3.10+ CLU `easel` + **FastAPI/uvicorn** 后端 + **React(Vite)** 前端 + **OpenClaw Agent** + Playwright Chromium。Python 依赖里媒体面很重:`opencv-python` / `Pillow` / `numpy` / `pandas` / `matplotlib` / `librosa` / **`faster-whisper`** / `edge-tts` / **`playwright`** / **`rembg`** / **`biliup`** / `jieba` / `snownlp` / `segno`。
|
||||
- **最小配置只要一个可用 LLM**:`ANTHROPIC_API_KEY` + `CLAUDE_MODEL`(或 OpenAI 兼容 `OPENAI_API_KEY/BASE_URL/MODEL`,或 Anthropic-compatible `EASEL_LLM_*`)。
|
||||
- **可选媒体模型走"provider 枚举 + 自备 key"**(`.env.example` 逐条):视频 `dashscope / ark / kling / openai-compatible / xhs-maas / agnes`;音乐 `dashscope / suno-compatible`;云端 TTS `dashscope / minimax / fish-audio / openai-compatible / gemini`;**未配置的媒体技能不影响聊天/策划/文本创作**。
|
||||
- **向量记忆**:未配独立 Embedding API 时**显式退化为关键词记忆检索**(不反复请求聊天端点的 embedding 模型)—— 一条"降级但说清"的实现。
|
||||
- **隔离**:使用独立 `easel` OpenClaw profile(`~/.openclaw/workspace-easel/`),**不覆盖用户已有的 `~/.openclaw/`**;gateway 端口**自动解析**(非默认 profile 分配哈希端口,`easel → 37289`),`OPENCLAW_PORT` 从未被读取、已移除。
|
||||
- **CI**:`.github/workflows/ci.yml`(单条工作流)。
|
||||
来源:`取证/easel/api_.env.example` · `api_pyproject.toml` · `api_openclaw_openclaw.json5` · `api/easel.README.md` · 文件树(17:1x)。
|
||||
|
||||
---
|
||||
|
||||
## 十二、可借鉴点(对 `content-workbench`,按可搬性排序)
|
||||
|
||||
1. **技能库=产品主体,不是附属**:114 个技能 vs 88 个 web 文件 ⇒ **能力密度压在技能层**,"工作台"是壳。若要复刻,**先定技能规范(三层加载 + 200 行上限 + 来源外置 `EASEL-META.md`)再堆技能**,顺序不能倒。
|
||||
2. **三层加载是"多技能共存"的唯一解**:Metadata 常驻做路由、Instructions 触发时加载、Resources 按需读 —— 直接解决"技能一多 prompt 就爆"。**配套的硬约束是 `SKILL.md` ≤200 行**(无此约束,三层形同虚设)。
|
||||
3. **"技能文档 ↔ 脚本参数"要有机器校验**:`validate_skills.py` + `validate_skill_commands.py`(**解析 Skill 里的命令、对照 argparse 检查路径与参数漂移**)—— 这一条比"写规范"有用得多,⛔ 防的是文档漂移。
|
||||
4. **发布前两道闸,且一道硬一道软**:`content_guard.py`(敏感信息 fail-closed、**AI 措辞只告警**)+ `persona_gate.py`(人设 <80 分**只提醒不阻断**)。⇒ **"不可逆的"硬拦,"可商量的"软劝**,比一刀切可用。
|
||||
5. **出站内容安全要"分级"而不是"全禁"**:把"API key/内部路径"与"AI 措辞/模型名"分开 —— 后者在论文解读、AI 科普里是正常内容。**这条区分是产品判断,不是技术细节**。
|
||||
6. **产物布局靠规约 + 校验函数兜底**:`outputs/<主题>/`(成品在根、中间件进 `assets/`)+ `output_paths.validate_output_path()` 强制 + `_` 前缀系统目录 + "内容库只展示项目目录"。⇒ 让"用户看到的东西"与"机器堆的中间件"物理隔离。
|
||||
7. **层间传递只传"路径 + 一句结论"**(`manifest.py` + `brief.md` 承载决策/意图)。⇒ 避免把中间产物复制进对话/prompt,是"有界编排"的落地写法。
|
||||
8. **画像六维 +"记忆作用域收敛到画像目录"**:明确宣布**全局 `MEMORY.md` 不承载账号知识**,并行会话各自读绑定画像 ⇒ 从设计上消除并发覆盖。
|
||||
9. **付费操作的前置协议**:先给范围/计划/费用预估再请求;多模型可用时列出让用户选、**不按默认值擅选**。⇒ 把"花钱"当红线门禁处理。
|
||||
10. **许可分层声明**:主体 Apache-2.0,但**逐个内联第三方件单独标许可**(`gzh-design` AGPL-3.0、`video-pipeline-sdk` MIT)+ `vendor/VENDOR.md` 记上游/版本/本地改动/如何重新同步。⇒ 比"整仓一个 LICENSE"诚实,也更容易过合规。
|
||||
|
||||
---
|
||||
|
||||
## 十三、风险与合规
|
||||
|
||||
1. **平台风控风险是产品自陈的**:小红书自动化发布被 README 与技能文档**双重明示**存在验证/限流/封号风险,且技能内置反检测参数。⇒ 选这条路=**接受账号风险并在产品里如实告知**;若目标产品要做"合规优先",则**不能同时抄 Easel 的自动发布与 Postiz 的"官方 OAuth、不自动化"姿态**(同第 2 棒 §八第 4 条)。
|
||||
2. **未授权抓取的边界**:`skills/shared/hotlist-apis.md` 明确「中文社媒热搜 API(60s / xxapi 聚合源,走代理);**禁止直接抓平台官网**」。⇒ 至少热搜侧走的是**第三方聚合源**而非直抓平台 —— 这是有意识的设计选择。
|
||||
3. **许可混用**:主体 Apache-2.0 与内联的 `gzh-design` **AGPL-3.0** 并存。⚠️ AGPL 的**网络服务义务**在"把含该技能的服务对外提供"时会被触发;**作本地自用工具不受此约束**。⇒ 若二开对外,需先厘清 `gzh-design` 是否在交付路径上(同第 2 棒对 Postiz/PostSider 的同款提醒)。
|
||||
4. **依赖重、安装门槛高**:Node 版本窗口窄(**25.x 与 26.0 明确不兼容**)+ FFmpeg + Chromium + 一堆媒体库(含 `faster-whisper` 需下模型)⇒ **复刻/自建的成本主要在环境,不在代码**。已知问题里两条(代理超时、CLI 重复显示)都指向**上游 OpenClaw 版本敏感**。
|
||||
5. **强弱项不对称**:**强在"技能体系与治理工程化"**(规范、校验、闸门、manifest、溯源齐备);**弱在"商业化与规模化证据"** —— 无定价页、无云服务、无用户量口径(§十五)。⇒ 作为"设计范本"价值高,作为"可依赖的上游/可对标的商业体"证据不足。
|
||||
|
||||
---
|
||||
|
||||
## 十四、查不到 / 待核实(⛔ 不猜)
|
||||
|
||||
1. **真实用户量 / 下载量 / 营收**:仓库无此口径,官网 `zju-real.github.io/Easel/` 未取(本棒未访问)⇒ **查不到**。
|
||||
2. **`CHANGELOG` 所称"38 个技能自带测试"的构成**:实测 `skills/**/tests/` 仅 6 个文件(均在 `skill-wechat-publisher`)⇒ 38 大概率是**用例数**,**未逐条核对** ⇒ **标未核实**。
|
||||
3. **114 个技能的 `layer` 分布(源码级)**:本棒**未逐份拉取 114 个 `SKILL.md` 的 frontmatter**,层分布引用的是**能力地图文档**(且该表创作层 51 与正文 52 条不自洽)⇒ **层分布的源码级核验未做**。
|
||||
4. **`tests/` 约定为何弃用**:`SKILL-SPEC.md` 的 `test1.prompt`/`test1.expected` 约定在整树中**零文件**,原因无记载 ⇒ **查不到动机**。
|
||||
5. **`.env.example` 里 `xhs-maas` / `agnes` 两个视频 provider 的来源与可用性**:只见到 provider 枚举名与 `scripts/gemini_maas_adapter.py` / `openai_maas_adapter.py` 两个适配器 ⇒ **是否内部服务、是否外部可用,未核实**。
|
||||
6. **各技能的实测可用率**:本棒只做**静态源码级取证**,**未运行任何技能**(⛔ 也不该在调研棒运行)⇒ "114 个技能都能跑通"**无实测支撑**。
|
||||
|
||||
---
|
||||
|
||||
## 十五、下一棒建议(本棒交付后)
|
||||
|
||||
1. **本棒已完成**:目标执行状态「五、下一棒该做什么」**第 1 项(Easel 深度分析)**。
|
||||
2. **验收判据现状更新**:五份单项目文档**已 3 份**(5 项目总览 + Postiz/PostSider 合并 + Easel);**余 2 份**:OpenCreator、文到 AI;跨项目汇总待四份齐。
|
||||
3. **余下棒次(延续第 1、2 棒排序)**:
|
||||
· **OpenCreator 深度分析** —— 先补拉完整文件树(第 1 棒因响应过大中断,现存 `opencreator.tree.top.json` + `opencreator.tree.docs.json`),再读 `packages/protocol` 契约与 `docs/specs`。
|
||||
· **文到 AI** —— **开工前须先与用户确认**是否仍按"开源项目深度分析"做(仓库无业务源码,README 明示闭源);⚠️ 属功能语义分叉,⛔ 不得自行降级。
|
||||
· **跨项目汇总对比文档**(收口)—— 待单项目份数齐后按 1b 形态产出。
|
||||
4. **可选补强(非必须)**:① 本棒遗留的 §十四第 3 项(**114 个技能 frontmatter 的层分布源码级核验**,可脚本批量拉取,成本中等);② 若要判断"技能体系能否复刻到本产品",可**挑 2–3 个技能做一次真实跑通**(⚠️ 需装 Node/FFmpeg/Chromium,**建议单独一棒且先问用户**)。
|
||||
|
||||
---
|
||||
|
||||
*本文件为第三棒产物。原始证据见 `取证/api/`(第 1 棒,只读复用)与 `取证/easel/`(本棒);可复算脚本 `取证/_easel_tree_stat.py` → `取证/easel.tree.stat.json`;旁证(只读)`参考资料/Easel_功能点与截图/`;台账见 `tmp/supervise-inbox/tasks.json`。*
|
||||
+367
@@ -0,0 +1,367 @@
|
||||
# 1b 竞品分析 · 第四棒:OpenCreator 深度分析
|
||||
|
||||
> 项目 slug:`content-workbench` | 目标:调研 5 个开源内容工作台项目并生成分析文档
|
||||
> 本棒范围:**只做第 3 项 `krillinai/OpenCreator`**(用户原话链接 `https://github.com/krillinai/OpenCreator/blob/master/docs/zh/README.md`,Apache-2.0,默认分支 `master`)。
|
||||
> ⛔ 本轮不碰「文到 AI」、不做跨项目汇总 —— 那两项留给后续棒次/检查会话。
|
||||
> 取证时间:**2026-10-07 17:37–17:56(CST)** | 取证环境:GitHub 公开 REST `git/trees` / `raw.githubusercontent.com` / `contents` API(本机直连)
|
||||
> 证据落点(本目标目录内):**只读复用**第 1 棒已拉的 `取证/api/opencreator.repo.json` · `opencreator.README.md` · `opencreator.tree.top.json` · `opencreator.tree.docs.json`(⛔ 未重复下载)|本棒新拉 **`取证/opencreator/` 76 件**(11 份分片文件树 + 62 份正文 + 3 份统计/日志)
|
||||
> 本棒新脚本:`取证/_opencreator_tree.py`(按顶层目录分片拉树)· `取证/_fetch_opencreator_docs.py`(正文批量拉取,raw 优先、失败回落 contents API)· `取证/_opencreator_tree_stat.py`(文件树统计 → `取证/opencreator/opencreator.tree.stat.json`,可复算)
|
||||
> 方法:**源码级 / 官方文件级实证优先**;**每条结论标来源 + 取证时间**;查不到即写「查不到」,⛔ 不猜、⛔ 不编数字。
|
||||
|
||||
---
|
||||
|
||||
## 一、本棒最重要的六条结论
|
||||
|
||||
1. **它不是"内容工具集",是"给创作者用的 Codex 外壳"**:产品自我定义(README 逐字)是「用 Codex CLI 作为执行内核,在其上提供稳定的本地 Runtime、可视化工作台和 Desktop 宿主」——**明确不重写 Agent loop / Skills runtime / MCP runtime**(`docs/2026-07-03-codex-native-agent-runtime-design.md` §1、§3)。⇒ 与本目标的另外几个项目(Easel 自建技能运行时、Postiz 自建发布域)在**架构路线**上完全不同。
|
||||
2. **规模与其他项目不在一个量级**:全仓 **2182 blob / 567 tree / 约 3.25 亿字节**;`apps/` 一项就 1264 文件(daemon 702 + web 437 + desktop 120 + harness 5);`.ts/.tsx` 合计 **1090** 个,`.go` 163 个,**测试文件 416 个**(源码级统计,§二)。
|
||||
3. **"双模同源"是它的核心产品主张,且有状态机兜底**:可视化工作台与 Agent 对话是**同一个状态机**的两个投影(README「OpenCreator System Architecture」+ `CreatorCollaborationPanel` + `CreatorPanelAdapter` 铁律)。⇒ 不是"两套界面切来切去",是**一套 workflow state + 两个渲染面**。
|
||||
4. **创作侧是真资产:108 条创作模板 + 一个 52 条目的技能市场**(源码级计数):`template/` **404 文件 / 108 个模板条目**(image-generation 79 + video-generation 28 + cover-generator 1);`packages/skill-market/src/source-skills.json` **52 条**、10 个分类、每条带**七项风险声明**(§六、§七)。
|
||||
5. **工程治理的密度罕见**:仓根 `AGENTS.md`(13,063 B)写的是**验证分级铁律**(P0/P1/P2 风险分级 + 「Web 快速验证路径」);另有「Creator 模板协作面板架构铁律」「Web/Desktop 一致性铁律门禁」「完成声明门禁」三段,**把"不许过度验证"和"不许虚假声明完成"同时钉死**(§九)。这在本目标 5 个项目里是独一份。
|
||||
6. **它已经跑过一轮"专属会话"重构**,且过程留痕完整:`Schedule ↔ Thread` 一对一绑定(`schedule_task` purpose)、旧 `parallel` 全转 `queue`、迁移/回滚演练脚本 `pnpm release:verify-scheduled-task-upgrade`、验收报告自评 **`PARTIAL / BLOCKED_ENV`**(仓库不含真实原生 Desktop Host ⇒ 页面关闭后的系统通知无法实机验收)。⇒ **这是"机制类项目"最好抄的一份参照**(§八)。
|
||||
|
||||
---
|
||||
|
||||
## 二、仓库元数据与许可(源码级)
|
||||
|
||||
| 项 | 值 | 来源 |
|
||||
|---|---|---|
|
||||
| 全名 / 归属 | `krillinai/OpenCreator` —— 归属账号 `krillinai`(`type: User`,非组织) | `取证/api/opencreator.repo.json`(第 1 棒 2026-10-07 16:14) |
|
||||
| 描述(逐字) | 「Formerly KrillinAI. Open-source AI workspace for creators, powered by Codex. Create videos, images, voice, avatars, video translation, and edits with Agents in one place.」 | 同上 |
|
||||
| 许可 | **Apache-2.0**(`license.spdx_id`;仓根 `LICENSE` 11,358 B) | 同上 + 文件树 |
|
||||
| 创建 / 最近推送 | 创建 **2024-12-17**;最近推送 **2026-10-05**;元数据更新 2026-10-07 | 同上 |
|
||||
| Stars / Forks / Watchers | **12,611 / 1,296 / 12,611**;open issues 28;subscribers 57 | 同上 |
|
||||
| 默认分支 / 根树 sha | `master`;`root_tree_sha = b674f255febad350afd64600d19c8279523c5769` | `取证/api/opencreator.tree.top.json` + `取证/opencreator/_tree_summary.json` |
|
||||
| 文件规模 | **2182 个 blob + 567 个 tree,11 份分片全部 `truncated=false`(整树完整)**;合计 325,525,063 B | `取证/opencreator/opencreator.tree.stat.json`(本棒 17:5x) |
|
||||
| 语言构成(blob 数) | `.ts` 903 | `.json` 207 | `.tsx` 187 | `.go` 163 | `.webp` 155 | `.jpg` 138 | `.md` 118 | `.png` 83 | `.mp4` 55 | `.mjs` 53 | `.svg` 42 | `.css` 23 | 同上(扩展名口径,非 GitHub `languages` 字节口径) |
|
||||
| 仓库主语言 | TypeScript(`language` 字段) | `取证/api/opencreator.repo.json` |
|
||||
| 版本 | 仓根 `package.json` 无 `version`(`name: opencreator-agent`,`private: true`,`packageManager: [email protected]`);各包自报 `0.1.0`;protocol 常量 `protocolVersion = '0.1.0'` | `取证/opencreator/oc_package.json` · `oc_packages_protocol_src_index.ts` |
|
||||
| 主页 | https://www.open-creator.ai/ | `取证/api/opencreator.repo.json` |
|
||||
| Topics | `agent-skills` `codex-cli` `desk**op**-app`(原文拼写) `dubbing` `image-generation` `localization` `skills` `tts` `video-editing` `video-generation` `video-transcription` `video-translation` | 同上 |
|
||||
|
||||
**顶层目录分布(blob 数)**:`apps/` **1264** | `template/` **404** | `runtime/` **183** | `docs/` **145** | `packages/` **91** | `assets/` **49** | `resources/` **14** | `skills/` **8** | `scripts/` **7** | `.github/` **4** | 仓根文件 **13**。
|
||||
来源:`取证/opencreator/opencreator.tree.stat.json`(本棒 17:5x,脚本 `_opencreator_tree_stat.py`)。
|
||||
|
||||
> 🔴 **许可面干净**:整仓单一 Apache-2.0,**未见内联的第三方许可文件**(与第 3 棒 Easel 的「主体 Apache-2.0 + 内联 AGPL-3.0 / MIT」形成对照)。⚠️ 但项目自带一份 `resources/stickman/*.png` 角色素材与 `packages/stickman-remotion/assets/` 音频/字体,README 声明角色为「与艺术家 Harbor Hsia 合作开发」,**素材再分发许可未在仓库内单独声明** ⇒ 见 §十三第 4 条。
|
||||
|
||||
---
|
||||
|
||||
## 三、产品定位
|
||||
|
||||
- **一句话(中文 README 逐字)**:「面向创作者的开源 AI 工作台与 Skills」;副题「将可视化创作工具、可复用 Skills 与 Agent 融合在一个工作空间内,完成脚本、视频、图像、语音、数字人、翻译与剪辑。」
|
||||
- **是什么(README 逐字)**:「OpenCreator 面向需要在本机**持续**完成创作与开发任务的个人和团队。它**不重新实现一套 Agent loop**,而是以 Codex CLI 作为执行内核,在其上提供稳定的本地 Runtime、可视化工作台和 Desktop 宿主。」
|
||||
- **两种操作方式(README 逐字)**:
|
||||
1. **内容工作台**:可视化工具 + 创作模板,做视频翻译与下载、图像与视频生成、智能配音、文章与社媒帖子写作、短视频脚本、火柴人动画。
|
||||
2. **Agent 对话**:自然语言发起任务、按项目组织会话、Run 后台执行,统一处理审批、附件、文件、技能、MCP、计划任务、通知、记忆与诊断。
|
||||
- **平台形态**:**Web 是唯一前端实现**;Desktop 直接加载同一份 Web 构建产物,只额外提供目录选择、窗口生命周期、托盘、原生通知等系统能力 —— 「相同数据和内容视口下,两端拥有一致的通用界面与 Runtime 行为」(README + `AGENTS.md` 铁律)。
|
||||
- **历史与定位**:原名 **KrillinAI**(视频翻译/字幕工具),README 明示「OpenCreator 原名 KrillinAI」,内嵌的 Go 引擎至今仍叫 `krillinai`(`runtime/krillinai/`)⇒ **产品是从"视频翻译工具"演进为"Agent 工作台"的**,旧能力以「Creator 工具」形态保留。
|
||||
- **目标用户**:中文社媒/视频创作者 + 需要本机持续跑 Agent 任务的个人与团队(README 多语言 12 种、QQ 群/B 站徽章、`docs/operations/` 里有中文模板说明文档)。
|
||||
- **自述差异化(README「项目特色」12 条摘要)**:Codex 原生执行 / 桌面端开箱即用 / 自动识别本机 Codex 配置 / 运行组件(yt-dlp)管理 / 多模态创作 / 创作模板 / 双模协同 / 版本管理 / 可复用 Skills / 记忆摘要 / 本地安全 / 多语言界面。
|
||||
- **研究/工程属性**:`docs/` 下有 **10 份实施计划**(`plans/`,单份最大 131,179 B)、**4 份最终验收报告**(`test-reports/`)、**3 份性能基线**(`performance/`)、**2 份 superpowers 设计**(`superpowers/`)⇒ 是**重度工程化项目**,不是个人 demo。
|
||||
|
||||
来源:`取证/api/opencreator.README.md`(第 1 棒 16:14,只读复用)· `取证/opencreator/oc_docs_zh_README.md`(本棒,即用户给定的中文 README)· `取证/opencreator/opencreator.tree.stat.json`。
|
||||
|
||||
---
|
||||
|
||||
## 四、功能清单
|
||||
|
||||
### 4.1 创作工具(README 逐字,「当前版本提供十项创作工具」)
|
||||
|
||||
| 工具 | 状态 | 能力(README 逐字要点) |
|
||||
|---|---|---|
|
||||
| Video Translation | ✅ 可用 | 导入本地/公开视频;云端或本地 Whisper 转写;LLM 做字幕断句/对齐/术语/翻译;双语字幕、配音或自定义音色、字幕样式、横竖屏合成;导出 SRT/音频/视频。**支持 14 种源语言、101 种目标语言** |
|
||||
| Video Downloader | ✅ 可用 | 解析 YouTube/Bilibili/X/TikTok/Instagram/Douyin/Facebook/Xiaohongshu/Pinterest 单个公开视频,比较格式并下载视频或音频(部分源需平台 cookie) |
|
||||
| Thumbnail Generator | ✅ 可用 | 由主题+视频链接+可选参考图生成并对比多个封面变体 |
|
||||
| Image Generation | ✅ 可用 | GPT Image 文生图 + 可选参考图,可配画幅和张数,单图预览下载 |
|
||||
| Article Writer | ✅ 可用 | 主题/链接/视频/文档 → 选题 → 大纲 → 成文;可插生成图,导出 Markdown/HTML/PDF |
|
||||
| Xiaohongshu Posts | ✅ 可用 | 由主题或素材生成完整小红书帖子(受众/类型/篇幅可控),复制或下载 |
|
||||
| Short Video Script | ✅ 可用 | 生成可拍摄的分段脚本(受众/平台/时长/语气可控) |
|
||||
| Stick Figure Animation | ✅ 可用 | 文本或 YouTube 内容 → 旁白/配音/一致角色分镜/字幕/可下载火柴人动画 |
|
||||
| Auto Clips | 🚧 开发中 | 分析长视频、找高光、切成可复用短视频片段 |
|
||||
| Smart Dubbing | ✅ 可用 | 脚本 → 配音,可选音色、节奏、情绪 |
|
||||
| Video Generation | ✅ 可用 | Seedance 文/图生视频,预览、重生成、逐版本下载 |
|
||||
| Digital Avatar | 🚧 开发中 | 脚本+声音+数字人形象 → 口播视频 |
|
||||
|
||||
来源:`取证/api/opencreator.README.md`(16:14)。
|
||||
|
||||
### 4.2 Agent 能力面(`CreatorRuntimeWorkspace` 与 Workspace 枚举,源码级)
|
||||
|
||||
- **Runtime 工作区枚举(`packages/protocol/src/creator.ts` 逐字 6 项)**:`video-translation` / `video-download` / `image-generation` / `video-generation` / `cover-generator` / `smart-dubbing`。
|
||||
- **Creator 作业状态机(源码级枚举)**:作业 `draft/running/needs_input/completed/failed/canceled`;阶段 `queued/running/succeeded/failed/canceled/interrupted`;产物 `draft/technical_preview/completed/stale`;**Provider 请求 8 态**(含 `unknown_remote_acceptance` / `abandoned_unknown` —— 专治"远端到底收没收"的模糊态)。
|
||||
- **Agent 侧对象**:Session(`active/interrupted/closed`)/Turn(8 态,含 `waiting_approval`、`needs_user_resolution`)/Item(7 类:`user_message` `assistant_message` `reasoning` `tool_call` `tool_result` `approval` `error`)/Approval(`pending/approved/rejected/expired/canceled`,kind 含 `command_execution`/`file_change`/`permissions`/`tool_call`)/Command Receipt(**幂等键 + 请求哈希 + 期望版本**,4 态)。
|
||||
- **乐观并发**:`CreatorActionRequest` 必带 `expectedRevision`;`CreatorCommandRequest` 再加 `idempotencyKey` ⇒ **状态机 + 版本号 + 幂等键三件套**(源码级,`creator.ts`)。
|
||||
- **`AgentContextEnvelope`**:每轮把 job 状态/选中快照/阶段进度/允许动作/焦点问题打包给 Agent(含 `stateTruncated` 显式声明截断)—— **避免把整份状态灌进 prompt**。
|
||||
- **前端功能面(`apps/web/src/features/` 逐目录计数)**:`dashboard` 60 | `settings` 33 | `files` 14 | `issues` 14 | `runs` 14 | `conversation` 13 | `projects` 13 | `plugins` 11 | `schedules` 11 | `tasks` 6 | `search` 4 | `shell` 4 | `capabilities` 3 | `connections` 3 | `approvals` 2 | `details` 2 + `connection` / `threads` 各 1(共 18 个功能目录)。
|
||||
- **后端路由面(`apps/daemon/src/api/` 源码级,30 文件)**:`routes.{approvals,attachments,cleanup,codex,creator,creator-runtime,creator-services,diagnostics,image-generation,mcp,memory,notifications,profiles,projects,runs,schedules,search,settings,skill-market,skills,smart-dubbing,tasks,threads,video-generation,video-metadata,workspace-files}.ts` + `server.ts` + `sse.ts` + `auth.ts` + `errors.ts`。
|
||||
⇒ **26 个路由族**,其中 `schedules` / `tasks` / `memory` / `notifications` / `approvals` / `skill-market` **六个在别的内容类项目里通常不存在**。
|
||||
- **国际化和本地化**:`apps/web/src/i18n/` 9 文件 ⇒ **UI 三语(zh-CN / en-US / sv)**(`LanguageProvider.tsx` 45,630 B 承载 zh/en,`swedish-inline-copy.ts` 18,264 B 单独内联瑞典语);**文档 12 语**(README 切换器 12 项 + `docs/<locale>/` 逐目录 4 文件 ×11 语 + 英文根)。
|
||||
⚠️ **口径差**:README 写「多语言界面:Web 与 Desktop 客户端支持简体中文、英文和瑞典语」,与 i18n 源码一致;但 **文档语言数(12)≠ UI 语言数(3)**,两者不要混读。
|
||||
|
||||
来源:`取证/opencreator/oc_packages_protocol_src_creator.ts` · `oc_packages_protocol_src_index.ts` · `opencreator.tree.stat.json` · `取证/api/opencreator.README.md`。
|
||||
|
||||
---
|
||||
|
||||
## 五、技术架构与协议契约
|
||||
|
||||
### 5.1 系统分层(README「OpenCreator System Architecture」逐字)
|
||||
|
||||
```text
|
||||
Browser Access Desktop Host
|
||||
\ /
|
||||
Creator Experience / apps/web (Dashboard / Creator Tools / Agent Conversation / Settings / Files)
|
||||
|
|
||||
Collaboration Core (共享 workflow state / Steps / Progress / Results / Versions)
|
||||
| Runtime API + SSE
|
||||
Local Runtime / apps/daemon (Projects / Runs / Approvals / Schedules / Memory / Notifications /
|
||||
Component status / Update checks / Verified updates / Safe fallback)
|
||||
| | |
|
||||
Local Data Codex Engine Media Toolchain
|
||||
SQLite/Files CLI/app-server FFmpeg / yt-dlp / Whisper / AI services
|
||||
```
|
||||
|
||||
**六条核心原则(README 逐字)**:① 工作台与对话是**同一 workflow state 的两个投影**,都向同一状态机派发事件;② 修订**产生新版本而非覆盖**;③ 前端**不直接启动 Codex**、**不依赖 Codex 原始 JSONL 格式**;④ daemon 拥有进程生命周期、事件归一化、持久化、审批、计划与通知 outbox;⑤ **Codex 仍是 Agent loop / Skills / MCP 的执行真相源**;⑥ Browser Bridge 与 Desktop Bridge **不各写一份通用产品逻辑**。
|
||||
|
||||
### 5.2 组件职责表(README 逐字)
|
||||
|
||||
| 组件 | 实现 |
|
||||
|---|---|
|
||||
| Creator Experience | `apps/web` · React 18 · Vite · TypeScript |
|
||||
| Collaboration Core | 共享 workflow state · `CreatorCollaborationPanel` · 版本历史 |
|
||||
| Local Runtime | `apps/daemon` · **Fastify** · Runtime API · **SSE** |
|
||||
| Runtime Components | yt-dlp nightly · 更新校验 · 可用版本回退 |
|
||||
| Codex Engine | Codex CLI · app-server |
|
||||
| Media Toolchain | yt-dlp · Whisper · FFmpeg · 已配置的 AI 服务 |
|
||||
| Local Data | SQLite · 文件系统 · 系统凭据存储 |
|
||||
| Desktop Host | `apps/desktop` · Electron · Preload Bridge |
|
||||
|
||||
### 5.3 两种执行路径(两份官方设计文档)
|
||||
|
||||
- **路径 A(`docs/2026-07-03-codex-native-agent-runtime-design.md`,28,217 B)="薄壳"路线**:`codex exec --json` 作唯一执行内核,prompt 走 **stdin**(避免命令行长度限制)、stdout 收 **JSONL**,Event Normalizer 把 Codex 原生事件映射成**自有事件协议**(`status / assistant_message / tool_use / tool_result / usage / diagnostic / error / done`),**原始 JSONL 必须保存**以便兼容 Codex 后续协议变化。Run 状态机 `queued → running → succeeded/failed/canceled`。**第一版非目标明写 10 条**(不做自研 loop/Skills runtime/MCP runtime/长期记忆/企业权限/多 Agent/云执行/不 fork Codex UI/不做 UI/不做 Electron 打包)。
|
||||
- **路径 B(`docs/runtime-api-for-ui-v1.md`,30,711 B)=实际交付面**:`protocol` 包版本 `0.1.0`;daemon 绑定 **127.0.0.1**,stdout 打一次 `{address, token}`,**除 `GET /healthz` 外全部要 `Authorization: Bearer <token>`**;错误统一 `{error:{code,message,details}}`;对 UI 的**建议映射**写死(401→回连接设置;409 `*_CONFIRMATION_REQUIRED`→弹确认后重试;422 `*_INVALID`→配置损坏;502 `MCP_COMMAND_FAILED`→展示命令失败入口)。
|
||||
- **Codex 透传策略(设计文档 §10 逐条)**:Agent loop / Skills / MCP / Profiles / Model / Reasoning / Sandbox / Images / Login / Doctor 全部交给 Codex 原生;**只有 Scheduler 是自建**("Codex 没有本地后台定时守护能力时的最小补齐层")。
|
||||
|
||||
### 5.4 `packages/protocol` 契约包(本棒逐文件读过)
|
||||
|
||||
27 个文件(`package.json` 1 + `src/` 17 + `test/` 8 + `tsconfig.json` 1),`index.ts` 逐条 `export *` 14 个模块:`creator` / `creator-visual-assets` / `creator-download` / `api` / `creator-services` / `creator-provider-catalog` / `errors` / `issues` / `events` / `media-generation` / `settings` / `smart-dubbing` / `video-metadata` / `wechat-article` / `stickman`(15 行 export,含 `protocolVersion`)。
|
||||
|
||||
- **`creator-provider-catalog.ts`(6,596 B)= 供应商白名单,纯数据无逻辑**:`kind ∈ {llm,image,video,tts,transcription}`,`protocol ∈ {openai-compatible, gemini, kling, custom, local}`,`status ∈ {supported, experimental, planned}`,凭据字段枚举 `apiKey/accessKey/secretKey/region`。**17 条条目(源码级逐条数出)**:LLM 4(OpenAI / DeepSeek / MiniMax / Custom OpenAI-compatible)、Image 5(OpenAI / 即梦 Seedream / 可灵 / Nano Banana Gemini / **`codex-native`(`protocol: local`,`credentials: []`,`status: experimental`)**)、Video 3(Seedance / Kling v2.1 Master / Veo 3.1)、TTS 4(OpenAI / MiniMax / 阿里云 / **Edge TTS(`credentials: []`)**)。
|
||||
⇒ **"本地/免密钥"是一等公民**:`codex-native` 与 `edge-tts` 两条都零凭据,是从设计上替代付费 API 的通路。
|
||||
- **`creator-services.ts`(10,737 B)= 服务配置与预检契约**:七类转写 provider(`openai / faster-whisper / whisperkit / whisper.cpp / aliyun / volcengine / funasr`)且区分 `kind: cloud|local`、`gpuAcceleration`;**默认值源码级**(`image.provider` 默认 **`codex-native`**、`tts` 默认 openai、`llm.source` 默认 `codex`);`CreatorPreflightResponse` 把启动前检查分成 **ready / warning / blocked** 三档,blocked 必带 `repair`;`creatorPreflightFailure()` 把 blocked 项**映射成稳定错误码**(`reference-image-required → creator_stage_input_missing` 等 9 条)。
|
||||
- **`creator.ts`(19,949 B)= 状态机与对象模型**(上文 §4.2 已列);另有 `readCreatorResultSnapshots()` 这类**防御式解析**(逐字段校验不合法即丢,不抛错)。
|
||||
- **`errors.ts` / `issues.ts`**:错误事实(`PublicErrorFacts`)与用户可见 issue 分离 —— **"面向用户的报错"是一等建模对象**,不是 `throw new Error(msg)`。
|
||||
- **`video-metadata.ts`(2,686 B)**:`parseBilibiliVideoSource()` 做 BV/av 号白名单式解析(多 `p` 参数直接判 `null`)、`videoSourceIdentity()` 生成稳定身份键(`youtube:<id>` / `bilibili:<id>:p<n>`)⇒ **去重与幂等落在契约层**。
|
||||
- **`stickman.ts`(1,694 B)**:`16:9 → 1280×720`、`9:16 → 720×1280`,尺寸**只此一处定义**(`stickmanCanvasForRatio`),Short 预设默认 `30 s / en-US / edge-tts`。
|
||||
- **`wechat-article.ts`(8,076 B)**:公众号文章的**版式系统** —— 7 种 layout style(知识手记/商业报告/杂志特写/行动清单/技术教程/播客访谈/热点简报)+ 6 种配图风格(editorial/minimal/documentary/illustration/three-dimensional/infographic)+ 6 个 layout 分类;每条 style 带**中文 `instructions` 全文**(写进 prompt 的版式契约)+ `features` 三元组。
|
||||
|
||||
### 5.5 内嵌 Go 引擎(`runtime/krillinai/`,183 文件)
|
||||
|
||||
- `cmd/cli` + `cmd/server` 两个入口;`internal/service` 50 / `internal/pipeline` 23 / `internal/types` 10 / `internal/handler` 4 / `internal/cli` 3 / `internal/ttsprovider` 1 等。
|
||||
- `pkg/` 是 provider 适配层:`util` 14 / `aliyun` 8 / `openai` 5 / `volcengine` 3 / `whisperkit` 3 / `fasterwhisper` 2 / `funasr` 2 / `image` 2 / `minimax` 2 / `whisper` 2 / `whispercpp` 2 / `whisperx` 2 / `localtts` 1。
|
||||
- `go.mod`:`module krillin-ai`,**Go 1.22**,直接依赖 13 个(gin / zap / go-openai / alibaba-cloud-sdk-go / OSS SDK / gse 分词 / levenshtein / toml / resty / uuid / lo / x/sync)。
|
||||
- `config/config-example.toml` + `config.go` + 两份 `config_test.go` + **3 份字幕样式 JSON**(default / example / cinematic)⇒ 样式是**配置资产**。
|
||||
|
||||
来源:`取证/opencreator/oc_docs_2026-07-03-codex-native-agent-runtime-design.md` · `oc_docs_runtime-api-for-ui-v1.md`(前 120 行)· `oc_packages_protocol_*.ts`(全部 17 个 src 文件)· `oc_runtime_krillinai_go.mod` · `opencreator.tree.stat.json` · `取证/api/opencreator.README.md`。
|
||||
|
||||
---
|
||||
|
||||
## 六、技能体系:自带 7 技能 + 52 条技能市场
|
||||
|
||||
### 6.1 仓内自带技能(`skills/`,8 个文件 / 7 个技能)
|
||||
|
||||
**7 个技能全部为 `krillinai-*` 前缀,且是"同名 Go CLI 阶段的薄封装"**(源码级逐个数出,每个 1 个 `SKILL.md`,仅 `krillinai-cli` 多 1 份 `references/cli-contract.md`):
|
||||
|
||||
| 技能 | 文件大小 | 职责(`krillinai-cli/SKILL.md` 路由表逐字) |
|
||||
|---|---|---|
|
||||
| `krillinai-cli` | 3,474 + 5,327 | 顶层路由:选命令、查配置、读进度/manifest/输出/错误 |
|
||||
| `krillinai-subtitle` | 2,449 | 生成原文/译文/双语/竖屏短字幕 → CLI `subtitle` |
|
||||
| `krillinai-tts` | 1,709 | 由字幕生成目标语配音(可产出配音视频)→ CLI `tts` |
|
||||
| `krillinai-render-horizontal` | 1,687 | 横屏成片(双语字幕或配音) → CLI `render-horizontal` |
|
||||
| `krillinai-render-vertical` | 2,122 | 竖屏成片(标题/双语字幕/配音) → CLI `render-vertical` |
|
||||
| `krillinai-cover` | 1,763 | 由完整文本 prompt 生成封面图 → CLI `cover` |
|
||||
| `krillinai-pipeline` | 1,952 | **只做 dry-run 的多阶段计划校验**;非 dry-run 返回 `unsupported_command` |
|
||||
|
||||
**技能规范的硬要求(`docs/contributing/skills-contributing.md` 逐字)**:`SKILL.md` + YAML frontmatter,**`name` 必须等于目录名**(小写连字符),**`description` 是"发现面"**(必须写成 "Use when …",含触发与结果,模糊描述直接打回);正文顺序固定 **When to use → Commands → Inputs and flags → Outputs → Failure modes**;**长者内容外置 `references/`**;`SKILL.md` 要"可扫读"。
|
||||
**Merge bar(7 条 checklist,逐字)**:目录名与 `name` 一致 / `description` 写明触发与结果 / 命令能在**干净检出**上跑(⛔ 不许绝对本地路径与凭据)/ 输入输出与失败模式有文档 / 长者内容在 `references/` / **在真实对话中验证过触发且只在应触发时触发** / 与既有技能重叠时说明为何需要独立技能。
|
||||
**Common rejection patterns(逐字 4 条)**:只改措辞的重复技能 / **"伪装成技能的功能"**(必须配合 Runtime/UI 改动才能用的,去提代码 PR)/ 未测过的命令 / **未写明的先决条件**(偷偷依赖 provider 配置、二进制或网络服务)。
|
||||
|
||||
**`SKILL.md` 与 `cli-contract.md` 的操作纪律(逐字要点)**:用专用 `--workdir`(⛔ 不散落到仓根);外部调用前先 `--dry-run` 验命令形状;stdout **按行解析 JSON**,**含 `ok` 的那行才是终态**(OpenCreator 模式下会先出进度帧);**`krillinai_manifest.json` + 实际输出文件是真相源**;失败按 `error.kind` 分类(`usage/retryable/dependency/internal`)而不是只看退出码(**内部错误当前也返回 1**);**不许声称 `cover` 用了参考图**(当前 CLI 只收完整文本 prompt 和尺寸);**不许要 Edge TTS 的音色目录**(`voices` 只支持 aliyun/openai/minimax)。
|
||||
|
||||
### 6.2 技能市场(`packages/skill-market/`,10 文件 / 52 条目)
|
||||
|
||||
- **52 条候选**(`source-skills.json`,158,838 B,源码级 `len()==52`),来自一个固定的上游提交(`catalog.ts` 里 `sourceCommit = '91302f79937b8f4e194e56554afdbb2ca939a1d5'`)。
|
||||
- **10 个中文分类**(`source-categories.json` 逐字):找选题与趋势 / 做内容策划 / 写文案与脚本 / 做图文与封面 / 做视频与字幕 / 做电商带货 / 做个人品牌 / 做营销增长 / 做发布分发 / 做效率提升。
|
||||
- **条目分布(源码级计数)**:`video-subtitle` 16 | `productivity` 16 | `image-cover` 5 | `topic-trend` 5 | `marketing-growth` 3 | `personal-brand` 3 | `copy-script` 2 | `publish-distribute` 2;listing 状态 `verified` 47 / `featured` 4 / `curated-exception` 1;**51 个不同 subcategory**。
|
||||
- **每条目的字段(`types.ts` 逐字)**:`titleZh`(中文名)/`tagline`/`summary`/`category`+`subcategory`/`platforms`/`tasks`/`businessGoals`(8 类枚举)/`creator{name,avatarUrl}`/`github{repo,url,stars,forks,license,lastPushedAt,defaultBranch,skillPath,readmeText,readmeLanguage}`/`examples[]`(每条 `type/url/title/source/relevance/approved`)/`inputs`/`outputs`/`install{agentInstruction,humanSteps,command,officialDocsUrl}`/**`risks{requiresLogin,requiresApiKey,externalWrite,readsLocalFiles,commercialLicenseReview,privateDataRisk,notes[]}`**/`relatedSkillIds`。
|
||||
⇒ **"七项风险声明"+"给 Agent 的安装指令 + 给人的安装步骤"并存** —— 这是"卖别人的技能"必须有的合规面。
|
||||
- **示例条目(源码级前三条)**:`invokeai`(`invoke-ai/InvokeAI`)/`deep-research`(`dzhng/deep-research`)/`videocaptioner`(`WEIFENG2333/VideoCaptioner`)⇒ **市场里装的是别人的开源仓库技能**,不是自家技能。
|
||||
- ⚠️ **一处源码级留白(未核实)**:`catalog.ts` 里 `skillMarketCandidateCatalog` 由 `customSkills`(**源码里是空数组**,`custom-skills.ts` 全文仅 3 行)+ 52 条过滤而成;而 `skillMarketCatalog`(面向已上架)**源码里是 `deepFreeze([])` 空数组**,`getSkillMarketEntry()` 只在空目录里查。⇒ 仓库**不含**上架态清单,疑为构建期注入或上架门禁留口 —— **本棒未进一步核实**(见 §十三第 2 条)。
|
||||
|
||||
来源:`取证/opencreator/tree_skills.json` · `oc_skills_*`(8 份全文)· `oc_docs_contributing_skills-contributing.md` · `oc_packages_skill-market_src_{types.ts,catalog.ts,source-categories.json,source-skills.json,custom-skills.ts}`。
|
||||
|
||||
---
|
||||
|
||||
## 七、创作模板体系(108 条,源码级计数)
|
||||
|
||||
- **`template/` 404 文件 / 108 个模板条目**:`image-generation` **79** | `video-generation` **28** | `cover-generator` **1**。
|
||||
- 每个模板条目通常 **3–5 个文件**(`template.json` + 预览图/视频 + 可选 `style.json` 等)。命名可读性高(如 `image-generation/wuhan-breakfast-food-map-infographic`、`video-generation/dolly-zoom-space-warp`)。
|
||||
- **另一套写作模板(`packages/writing-templates/`,35 文件)**:`templates/community` 16 + `templates/official` 8;含 **JSON Schema**(`schema/writing-template.schema.json` 4,271 B)、构建脚本(`scripts/build-catalog.mjs` 12,517 B)、生成产物(`src/generated/catalog.json` 54,438 B)、**8 个 `*.test.ts`** 之一为 `test/catalog.test.ts`。
|
||||
- 社区模板三个为例:`khazix-writer` / `research-paper-writing` / `sun-style-writing`,**各自带 `LICENSE` + `NOTICE`(其中 research-paper-writing 有 NOTICE)+ `skill/{SKILL.md,review.md,topics.md}` + `template.json`** ⇒ **第三方写作模板按"带许可的独立包"引入**。
|
||||
- **模板治理有专文**(`docs/operations/pr-338-模板规范审查.md` 9,797 B,2026-10-01):
|
||||
- 规范依据四条(`templates-contributing.md` / `creator-prompt-localization-模板提示词语言适配.md` / `apps/daemon/src/creator/presets/module-schemas.ts` / `creator-preset-registry.test.ts`)。
|
||||
- **明确拒绝 6 个"功能快捷入口"当模板**:`video-download/audio-download`、`video-download/highest-quality-video`、`video-translation/bilibili-bilingual`、`bilingual-interview`、`vertical-knowledge`、`youtube-dubbed` —— 理由逐条写明("仅设置 mediaType 属既有工作区功能"、"当前 master 已移除"、"约 61 秒第三方访谈样片不应驱动编译器放宽预览上限,授权也未核实"、"把竖屏翻译合成误述为切片能力")。
|
||||
- **15 个视觉模板逐项修正**:全部**补声明式能力 requirements**,且因"来源预览未经本模板效果复测、授权证据不完整"**一律设为 `draft` + `featured: false`**。
|
||||
- **只提取修正 15 个模板,不合并整个 PR**:"不导入 RightCodes 供应商适配、共享封面执行器和风格变更"。
|
||||
- 演练结果:「共校验/编译 **108 个模板:92 个 published、16 个 draft**,其中 15 个 draft 为本轮新增」。
|
||||
⇒ **这是"模板/素材合规"的一份可抄作业**:来源署名、`draft` 门禁、⛔ 不让模板偷偷换 provider、⛔ 不用未授权样片放宽编译上限。
|
||||
|
||||
来源:`opencreator.tree.stat.json` · `tree_template.json` · `tree_packages.json` · `oc_docs_operations_pr-338-模板规范审查.md`。
|
||||
|
||||
---
|
||||
|
||||
## 八、计划任务 ↔ 专属会话(本项目最值得单独看的一块)
|
||||
|
||||
### 8.1 模型(README 「Schedules and Dedicated Task Threads」逐字)
|
||||
|
||||
- **每个 schedule 拥有一个持久、专属的 OpenCreator 会话**。
|
||||
- 自动触发、手动运行、用户追问**复用同一个会话**,并按 `queue` 或 `skip` 策略**串行**执行。
|
||||
- 删除 schedule 会**归档**其专属会话,但保留既有 Run、结果与底层 Codex 历史。
|
||||
- **轮换/恢复底层 Codex thread 不改变 OpenCreator 的任务入口与页面路由**。
|
||||
|
||||
### 8.2 落地证据(迁移/回滚运行手册 + 验收报告)
|
||||
|
||||
- **运行手册**(`docs/operations/2026-07-15-scheduled-task-dedicated-thread-release-runbook.md`,8,506 B):迁移**只加字段/表/索引**,把旧 `parallel` 策略**转换为 `queue`**;**回滚时不得删除**新增字段、索引、任务 Thread、历史 Run、通知 outbox 或 Codex session。
|
||||
- **安全约束 6 条(逐字要点)**:先停 Web/daemon/Scheduler 再复制数据;**必须备份整个 `.runtime/`,不能只复制 `app.sqlite`**;**不得在用户唯一数据库上试跑迁移**(先用脱敏副本或内置演练);**不得用删列/删 Thread/合并 session/改历史 Run 实现降级**;Scheduler 只能在 schema 迁移+`ensureBindings()`+旧会话分类**完成后**启动;绑定修复失败的 schedule **先禁用并清空 `next_run_at`**。
|
||||
- **自动化演练**:`pnpm release:verify-scheduled-task-upgrade` —— 只建临时 SQLite、**不读 `.runtime/app.sqlite`**,验证 9 条(无损迁移 / `parallel` 全转 `queue` / 每条活动 schedule 只补一个 `schedule_task` Thread / 名称·项目·Profile·模型·推理强度·Sandbox 一致 / 两条 SQL 不变量 / **第二次 `ensureBindings()` 不再建 Thread(幂等)** / 旧列清单仍可读 / 旧孤立 Run 与已删 schedule 不被删 / 回滚后再次迁移仍幂等)。
|
||||
- **升级后不变量(SQL 逐条给出)**:缺失活动绑定 `= 0`;重复绑定**必须返回空集**;**配置偏差 `= 0`**(用一条 `LEFT JOIN` 逐字段比 `title/cwd/canonical_cwd/profile/model/reasoning/sandbox`);绑定修复失败记录表 `schedule_operations` 为空。
|
||||
- **灰度 8 项**(含「同一任务连续两次执行,第二次排队或跳过,不并行」「自动执行与用户消息进入同一 Thread」「暂停/恢复/编辑/删除同步更新'已安排'、侧栏'任务'与任务会话头部」「模拟 Codex resume 失败后 OpenCreator Thread 不变」「**页面关闭后原生 Host 仍能消费 outbox 并打开正确深链接**」)。
|
||||
- **失败面写得很硬**:「仓库本身**不包含真实原生 Desktop Host**。仅完成 outbox、Bridge 契约和 harness 验证时,**必须把第 8 项记录为 `BLOCKED_ENV`,不能写成实机通过**」。
|
||||
- **最终验收报告**(`test-reports/2026-07-15-…-final-acceptance.md`,6,060 B):24 个实现批次 `PASS`,**最终批次 P2-B7 = `BLOCKED_ENV`** ⇒ 总体状态 `PARTIAL / BLOCKED_ENV`,**"不能标记为 COMPLETE"**。
|
||||
- 门禁读数(逐字):`pnpm test` PASS(daemon **651** 项通过、14 项 gated smoke 跳过;Web **521** 项;Skill Market 6 项;harness 3 项)/`pnpm e2e` PASS(桌面+移动 **14/14**,1.9 分钟)/真实 Codex smoke **14/14**,98.13 秒(codex-cli **0.144.1**)/`perf:check` PASS。
|
||||
- **性能门禁有硬阈值**:首屏/刷新 runtime 请求 ≤12(实测 10);Thread 列表请求 ≤2(实测 2);选中任务前历史请求 0;DOM 峰值 ≤4500(实测 3868);Long Task ≤10(实测 0);任务打开延迟 ≤1500 ms(桌面 65 ms/移动 231 ms);**构建体积预算**(主入口 JS ≤600,000 B / gzip ≤180,000 B,实测 580,680 / 168,587)。
|
||||
- **一个"既有测试时序抖动"被如实记录**(重负载下 fake Codex 3 秒没写出 stderr ⇒ 夹具改同步写、断言超时放宽到 5 秒,**生产超时未改**)⇒ 不是"顺手美化",是留痕。
|
||||
|
||||
来源:`取证/api/opencreator.README.md`(16:14)· `oc_docs_operations_2026-07-15-scheduled-task-dedicated-thread-release-runbook.md` · `oc_docs_test-reports_2026-07-15-scheduled-task-dedicated-thread-final-acceptance.md`。
|
||||
|
||||
---
|
||||
|
||||
## 九、工程治理:仓根 `AGENTS.md` 的六道铁律(本棒最有复用价值的一份)
|
||||
|
||||
`AGENTS.md`(13,063 B)不是"风格指南",是**可机器判定的协作契约**。逐段要点:
|
||||
|
||||
1. **执行效率与最小充分验证铁律**:验证范围**必须与改动风险和影响范围匹配**;"不得把小型、局部、低风险修改默认升级为全量测试、完整构建、服务重启、端到端测试或桌面打包";先最小定位与修改,再跑**能证明这次改动正确的最小验证集**;**不得因仓库存在无关的历史失败/脏工作区而扩大当前任务**("与本次改动无关的问题只需记录");用户明确要求时不受默认分级限制。
|
||||
- **风险分级**:P0(文案/样式/默认值/局部展示/测试断言)默认只跑相关文件检查+最近定向测试,**⛔ 不跑全量/构建/E2E/打包/重启**;P1(共享状态/业务逻辑/持久化/跨组件/请求参数/公共组件)跑受影响模块定向测试+对应包 `typecheck`,仅涉及编译边界/懒加载/资源产物/构建配置才构建,**仅当定向测试无法覆盖真实交互才加浏览器验证**;P2(Daemon/Runtime、协议、DB 迁移、进程管理、服务配置、构建打包、发布链路、Web/Desktop 一致性)跑集成测试+构建+重启+健康检查,**只有涉及 Desktop/交付包才做打包与一致性门禁**。
|
||||
- **Web 快速验证路径**:纯 `apps/web` 改动(未触及 Host Bridge / Desktop capability / Preload-IPC / Daemon / 协议 / 持久化 / 构建资源)以 Web 定向测试 + `@opencreator/web` typecheck + 必要浏览器验证为完成标准,**"不能仅因 Desktop 复用同一份 Web 产物而升级验证"**。
|
||||
2. **服务操作铁律**:前端源码在跑着的 Vite 下能热更新时,**不得仅为使页面生效而重启服务**;只有服务端代码/启动配置/环境变量/进程依赖变化、热更新失败、服务未启动或用户明确要求才重启;重启前先确认端口与进程命令,重启后只验对应服务与直接依赖。
|
||||
3. **交付说明铁律**:完成时**只报告实际执行的验证**,"不得用未执行的全量验证暗示项目整体无回归";最小验证集已覆盖就**及时交付**,"不得为了形式上的'更完整'继续运行低收益验证"。
|
||||
4. **`opencreator-bug-fix` 使用铁律**:普通开发/修复/体验优化**不得默认启用**;**只有用户明确要求读取、处理或回写飞书 Bug 文档时**才允许用,⛔ 不许"因为看起来像 Bug"就去读文档、走闭环或自动建 commit。
|
||||
5. **Creator 模板协作面板架构铁律**:所有 Creator 模板**必须共用唯一 `CreatorCollaborationPanel`**,⛔ 禁止为单个模板复制/新建整套 Agent Panel;通用 Panel 统一负责消息、Activity 时间线、Stage 状态卡、真实进度、审批、Composer、权限、任务终止与继续;模板差异**只能**通过 `CreatorPanelAdapter`、配置、回调或局部 slot 表达;**通用 Panel 禁止读取 `krillinEventPayload` 或其它执行器私有字段**(对外统一 `phase/percent/message/completed/failed/total`);**纯 UI 状态不得写进用户可见的创作动态**(步骤索引、最远步骤、页签、草稿版本);未知模板必须走 fallback adapter 显示稳定通用文案,⛔ 不许暴露内部 Stage ID/执行器名/原始事件字段;新增模板**必须同时加** Adapter 测试、Activity 过滤去重测试、Stage 状态测试、真实进度测试。
|
||||
6. **Web/Desktop 一致性铁律门禁**(最长一段,四小节 + 分级测试 + 完成声明门禁):`apps/web` 是唯一前端实现;"一致"指通用产品能力一致(不要求模拟系统窗口/目录选择器/菜单栏/托盘/通知);**⛔ 禁止在共享 UI 里用 `hostBridge.kind` 随意分叉通用业务/页面结构/样式**,平台差异必须经明确 capability 或可选回调(如 `canSelectDirectory`)表达;**⛔ 禁止"显示按钮然后静默 return"**,也⛔ 禁止为"看起来一致"传空函数/假成功回调;平台专属能力**当前白名单只有 5 项**(选/换本机文件夹、读文件夹拖放真实路径、Electron 窗口关闭隐藏/菜单栏/托盘、原生通知及其后台生命周期、其他经确认确实无法由本地 Daemon 提供的);**内容视口铁律**(对比必须用相同前端内容区尺寸,⛔ 不拿窗口外框比);**构建产物铁律**(打包前必须重建 Web,⛔ 禁止复用来源不明的旧 `apps/web/dist`;清单必须记 commit/dirty/Web 哈希/平台/架构/时间;**不一致必须终止打包**;⛔ 不许手工复制替换 App 内资源);**完成声明门禁**(未过打包 App 验证与资源哈希校验,⛔ 不得声称 Desktop 完成/两端一致/可发布;**当前环境跑不了某项验证必须明确说明未验证内容、原因与残余风险**)。
|
||||
|
||||
来源:`取证/opencreator/oc_AGENTS.md`(本棒 17:4x,13,063 B 全文读过)。
|
||||
|
||||
---
|
||||
|
||||
## 十、数据、安全与隐私边界
|
||||
|
||||
- **数据落点(README 逐字)**:默认仓根 `.runtime/`;`app.sqlite`(项目/线程/Run/事件/计划/通知/附件元数据/审批/记忆/摘要)、`runs/`(脱敏日志、诊断、Run 元数据)、`attachments/`、`workspaces/`。**Codex 会话与配置留在 `$CODEX_HOME`,必须与 `.runtime/` 分开备份**。
|
||||
- **安全边界(README 逐字)**:daemon **只监听 `127.0.0.1`**,除健康检查外**每个 API 都要 Bearer token**;HTML 预览**默认禁脚本、禁导航、禁弹窗**,只允许受控的同工作区相对资源;敏感记忆需要**二次确认**,"永不自动永久保存未确认的建议";**诊断与 Run 日志在返回或导出前先脱敏**;Desktop 包启用 **ASAR 完整性校验与 cookie 加密**,同时**禁用 `RunAsNode`、`NODE_OPTIONS`、Node CLI Inspector**。
|
||||
- **凭据存储**:走**本地 Runtime 的系统凭据存储**,⛔ 不应提交进仓库;`codex-native` 与 `edge-tts` 不需要 API Key(§5.4)。
|
||||
- **环境变量面(README 逐字 6 个)**:`OPENCREATOR_DATA_DIR`(默认 `.runtime`)/`OPENCREATOR_CODEX_BIN`/`CODEX_HOME`(默认 `~/.codex`)/`OPENCREATOR_DEFAULT_CWD`/`OPENCREATOR_DEFAULT_PROJECT_ROOT`/`OPENCREATOR_CODEX_THREAD_ROTATION_RUN_THRESHOLD`(默认 50,`0` 关闭主动轮换)。
|
||||
- **凭据与既有 Codex 环境复用**:默认**复用用户全局 `$CODEX_HOME`**,"修改全局 Codex 配置前必须让用户明确知道影响范围";只有显式开启才用隔离 `CODEX_HOME`(设计文档 §7.4 原则 5/6)。
|
||||
- **`codex-native` 图像 provider 的安全契约**(`docs/specs/2026-09-19-codex-native-image-provider-design.md` 逐字要点):**纯订阅制**,"must not call the OpenAI Images API, any other paid image API, or silently fall back to one";只允许请求工作区内或 `CODEX_HOME/generated_images` 下的产物,校验 **PNG/JPEG/WebP 签名 + 文件大小上限**;拒绝 file URI、畸形通知、缺失产物、超时与非零退出;**永不记录 `CODEX_HOME` 凭据/token/环境内容/图像字节**;**永不传 `--dangerously-bypass-approvals-and-sandbox`**;**永不从 native provider 调远端图像端点**。
|
||||
- **依赖面(源码级)**:daemon 生产依赖 18 个(fastify / better-sqlite3 / `@modelcontextprotocol/sdk` / sharp / pdfkit / pdf-parse / yauzl / zod / cheerio / cron-parser / https-proxy-agent / `@iarna/toml` 等);devDeps 含 Remotion bundler/renderer;web 生产依赖 React 18 + Vite 6 + **CodeMirror 全家桶(11 个包)** + lucide-react + react-virtuoso + react-router-dom;仓根 `pnpm` 段有 **17 条安全 override**(undici / tar / ws / nanoid / js-yaml / brace-expansion / fast-uri 等)⇒ **主动钉安全版本**。
|
||||
- **CI(`.github/workflows/`)**:`ci.yml`(6,100 B)/`desktop-release.yml`(17,529 B)/`star-coverage.yml`(1,576 B)。
|
||||
|
||||
来源:`取证/opencreator/oc_docs_2026-07-03-codex-native-agent-runtime-design.md` · `oc_docs_specs_2026-09-19-codex-native-image-provider-design.md` · `oc_apps_{daemon,web}_package.json` · `oc_package.json` · `oc_.env.example` · `tree_.github.json` · `取证/api/opencreator.README.md`。
|
||||
|
||||
---
|
||||
|
||||
## 十一、可借鉴点(对 `content-workbench`,按可搬性排序)
|
||||
|
||||
1. **"不重写 Agent 引擎"是省掉一半工期的决定**:它把 Agent loop / Skills / MCP 全部透传给 Codex,自己只做**进程生命周期 + 事件归一化 + 持久化 + 调度 + UI**。⇒ 若我方产品不打算自建 Agent 运行时,这条路线能直接砍掉最大的一块工程量;代价是**上游版本敏感**(见 §十二风险)。
|
||||
2. **`packages/protocol` 独立成包 + `protocolVersion` 常量**:Web / Daemon / Desktop 三方共用一套契约类型,且**版本号明文可读**。⇒ 这是"三端同源"最容易落地的一步,成本极低。
|
||||
3. **状态机 + 版本号 + 幂等键三件套**(`expectedRevision` + `idempotencyKey` + `CreatorCommandReceipt`):把"重复点击/重试/并发"交给契约层解决,而不是在 UI 里做防抖。**并且专门为"远端到底收没收"建了 `unknown_remote_acceptance` / `abandoned_unknown` 两个状态** —— 这是绝大多数项目缺的那一态。
|
||||
4. **"双模同源"的落地写法**:一个 workflow state + 两个投影面(工作台 / 对话),**工作台动作与对话命令进同一个状态机**;配合"修订产生新版本而非覆盖"+ `sourceArtifactIds` 溯源 + `stale` 标记。⇒ 比"对话里给个链接跳到工具页"高一个量级。
|
||||
5. **`CreatorCollaborationPanel` 单一实现 + Adapter 只做映射**:⛔ 不许每个模板复制一套 Panel;Adapter 只许管文案/语义化/进度标准化/默认提示;**通用层禁止读执行器私有字段**(对外统一 `phase/percent/message/completed/failed/total`)。⇒ **"业务模块一多就各写一套面板"是这个行业最普遍的腐化路径,它用一条铁律封死了**。
|
||||
6. **`AGENTS.md` 的"分级验证 + ⛔ 禁止过度验证 + 只报告实际执行的验证"**:把"AI/工程师动不动跑全量测试"和"用没跑的验证暗示无回归"**两个方向的病一起治**。⇒ 可直接抄进我方工程规范,尤其适合"多会话并行、每个会话都要自证"的场景。
|
||||
7. **迁移/回滚的"演练先行 + 不变量 SQL + 幂等复验"**:`release:verify-scheduled-task-upgrade` 只建临时库、9 条验证、第二次 `ensureBindings()` 必须 `repaired=0`;手册还写明"⛔ 不得用删列/删 Thread/合并 session 实现降级"。⇒ **我方本机"OS 文件锁上生产即卡死"那类事故,缺的正是这套"演练先行 + 幂等复验"**。
|
||||
8. **`unknown` 与 `BLOCKED_ENV` 都当一等结论**:验收报告把"仓库不含真实原生 Desktop Host"如实写成 `PARTIAL / BLOCKED_ENV`,"不能标记为 COMPLETE",并规定"⚠️ 必须记录为 `BLOCKED_ENV`,不能写成实机通过"。⇒ **"环境跑不了"是结论,不是借口**——这条与我方决策方法论里"不确定就说不确定"同源,但它把它变成了**可检查的字段**。
|
||||
9. **模板/技能市场的合规面**:技能市场每条带**七项风险声明 + 给 Agent 的指令 + 给人的步骤 + 商业许可审查位**;模板治理有专文规定"来源署名、`draft` 门禁、⛔ 不让模板偷偷换 provider、⛔ 不用未授权样片放宽编译上限"。⇒ 只要产品要"聚合别人的东西",这套字段表可以照抄。
|
||||
10. **本地/免密钥 provider 作为一等公民**:`codex-native`(复用已登录 Codex 订阅)+ `edge-tts`(零密钥)在 catalog 里与付费 provider **平级**,且图像 provider **默认值就是 `codex-native`**。⇒ 对"用户不想配 key 也能跑通"这个诉求,这是把兜底做成默认路径的写法。
|
||||
11. **"可用版本回退"的运行组件管理**:第三方运行时(yt-dlp)**每 7 天检查更新但永不自动安装**,更新失败保留当前可用版本。⇒ 与"⛔ 不要静默升级依赖"是同一条纪律的具体化。
|
||||
12. **性能门禁写进 CI 且带硬阈值**(请求数 / DOM 峰值 / Long Task / 打开延迟 / 构建体积 gzip 预算):把"体验退化"变成**可失败的门禁**,而不是靠人感觉。
|
||||
|
||||
---
|
||||
|
||||
## 十二、风险与合规
|
||||
|
||||
1. **上游强耦合 = 最大的单点风险**:产品自我定位是"薄壳",**Agent loop / Skills / MCP 全在 Codex 侧**;文档多处承认版本敏感(`codex exec --json` 的 JSONL 格式、`item/completed` 通知在旧版 Codex 上**不出现**因而要走"快照目录 + 导入新产物"的兜底、`resume` 形态与 create 不同)。⇒ **Codex CLI 一次破坏性变更就可能让产品整体不可用**;这是"省工期"的对价。
|
||||
2. **安装门槛不低**:源跑要求 Node 22+ / **pnpm 9.15.0(`packageManager` 钉死)** / 可用的 Codex CLI + 登录态;媒体链路还要 FFmpeg / yt-dlp / Whisper 变体;Go 引擎 163 个文件需自行编译(`pnpm krillinai:build`)。⇒ Desktop 安装包是主推路径(README 明说"无需 Node.js 或 pnpm")。
|
||||
3. **`krillinai` 旧引擎与新产品并存**:产品已改名,但内嵌 CLI/引擎仍叫 `krillinai`(`krillinai:*` 脚本、`KRILLINAI_CLI`、`krillinai_manifest.json`、7 个技能全带 `krillinai-` 前缀)⇒ **命名双轨**是历史包袱,二开时要先决定"跟新名还是跟旧名",否则会出现两套术语。
|
||||
4. **素材与商标的再分发许可未在仓库内单独声明**:`LICENSE` 只有 Apache-2.0 一份;而火柴人角色素材 README 自述为"与艺术家 Harbor Hsia 合作开发"、`docs/images/contributors/*` 有 23 个贡献者头像 SVG、`packages/stickman-remotion/assets/audio/blossom-echo.mp3`(4,944,716 B)等音频资产**未见独立许可文件**(对比第 3 棒 Easel 明确内联 AGPL/MIT)。⇒ **若要把模板/素材打包对外分发,需先厘清每个素材的授权**(⚠️ 同族提醒见模板治理专文"在确认许可或替换素材前,不应将这份增量用于对外打包分发")。
|
||||
5. **"平台账号风险"在本项目基本不存在,但换成了"平台抓取风险"**:它**不做自动发布**(README 无发布到平台的承诺;Video Downloader 只解析单个公开视频、明示"部分源需平台 cookie"、"不自动导入浏览器 cookie")。⇒ 与第 3 棒 Easel 的"自动化发布 + 自陈风控风险"路线**正好相反**;**同一条产品线不可混抄这两条**(同第 2 棒 §八第 4 条、第 3 棒 §十三第 1 条)。
|
||||
6. **`docs/plans/` 里有多份"未完成承诺"**:10 份实施计划文档(部分单份 130 KB 级)属**内部工程文档**,"计划写明"≠"已交付";本棒**未逐份核对计划与代码的一致性**。⚠️ 引用这些内容时必须标"计划口径",⛔ 不能当"已实现能力"用(见 §十三第 3 条)。
|
||||
7. **商业证据薄弱**:主页 `open-creator.ai` **本棒未访问**;仓库无定价页、无用户量口径、未拉 releases/tags ⇒ **营收、用户量、发行节奏均查不到**(§十三第 1 条)。⚠️ Trendshift 徽章自述"单日排名第一",属第三方站点的**时点快照**,⛔ 不能当规模证据。
|
||||
|
||||
---
|
||||
|
||||
## 十三、遗留取证缺口(⛔ 不猜)
|
||||
|
||||
1. **商业与规模证据全缺**:`open-creator.ai` 主页、定价、用户量/下载量/营收、releases 与 tags(本项目**未拉** `releases`/`tags`/`contributors`/`languages` 四个 API;Easel 那棒拉了)⇒ **查不到**。
|
||||
2. **技能市场"上架态"口径未核实**:仓库里 `skillMarketCatalog` 是**空数组**、`customSkills` 也是空数组,只有 52 条**候选**(`source-skills.json`)⇒ "52 条到底有多少真正上架"**查不到**;`catalog.ts` 的 `sourceCommit` 指向一个外部快照提交,**该提交未访问**。
|
||||
3. **`docs/plans/` 10 份实施计划的落地率未核**:计划文档 vs 代码实现的一致性**本棒未逐条比对**(属"计划口径",§十二第 6 条)。
|
||||
4. **模板素材与角色资产的再分发许可未核**:⚠️ 需人工/法务判断,本棒只做文件级观察(§十二第 4 条)。
|
||||
5. **真实运行证据为零**:本棒**只做静态源码级/文档级取证,未安装、未编译、未运行任何命令**(⛔ 调研棒不应跑付费生成);⇒ "十项创作工具可用""108 个模板都能跑"**无实测支撑**(README 自述"更多创作工具在持续添加"、两项标 `In development`)。
|
||||
6. **`runtime/krillinai`(Go 引擎)只做结构与依赖级取证**:183 文件只读了 `go.mod` + 目录构成,**未读业务实现**(处理流水线、字幕样式算法、provider 适配细节)。
|
||||
7. **GitHub `languages` 字节构成未取**:本棒的"语言构成"是**按文件数**统计的扩展名口径(`.ts` 903 等),与 GitHub 官方字节口径**不是一回事**,⛔ 不可混用。
|
||||
8. **`docs/development/` 5 份开发文档、`docs/ui-prototype-runtime-review.md`、`visual-component-guidelines.md`、`docs/plans/*` 正文**:本棒只读了文件树与元数据,**未逐份读正文**(仅取了其中 5 份 `development/*.md` 的正文)。
|
||||
|
||||
---
|
||||
|
||||
## 十四、下一棒建议(本棒交付后)
|
||||
|
||||
1. **本棒已完成**:目标执行状态「六、下一棒该做什么」**第 1 项(OpenCreator 深度分析)**。
|
||||
2. **验收判据现状更新**:五份单项目文档**已 4 份**(5 项目总览 + Postiz/PostSider 合并 + Easel + OpenCreator);**余 1 份:文到 AI**;跨项目汇总待 5 份齐。
|
||||
3. **余下棒次**:
|
||||
- **文到 AI**:🔴 **属功能语义分叉,开工前须与用户确认口径**(仓库无业务源码,README 明示闭源);⛔ **不得自行降级成"就着 README 写一篇"**。见文末待拍板项。
|
||||
- **跨项目汇总对比文档**(收口):待单项目份数齐后按 1b 形态产出。
|
||||
4. **可选补强(非必须,且需先问用户)**:
|
||||
- 拉 `releases` / `tags` / `contributors` / `languages` 四个 API,补齐与 Easel 对齐的元数据面(成本低)。
|
||||
- 读 `docs/plans/` 10 份实施计划正文 + 对代码做一次"计划 vs 实现"抽样比对(成本中高)。
|
||||
- 逐份读 `docs/development/` 5 份 + `visual-component-guidelines.md`(成本中)。
|
||||
|
||||
---
|
||||
|
||||
## 十五、来源链接 + 取证时间
|
||||
|
||||
**对象仓库**:`https://github.com/krillinai/OpenCreator`(默认分支 `master`,根树 sha `b674f255febad350afd64600d19c8279523c5769`)
|
||||
**用户给定的定位链接**:`https://github.com/krillinai/OpenCreator/blob/master/docs/zh/README.md`(中文 README,已取全文 44,507 B)
|
||||
|
||||
| 编号 | 来源 | 取证时间 | 落点 |
|
||||
|---|---|---|---|
|
||||
| 1 | 仓库元数据 API `/repos/krillinai/OpenCreator` | 2026-10-07 16:14(第 1 棒) | `取证/api/opencreator.repo.json` |
|
||||
| 2 | 根 README(英文,canonical)|中文 README | 16:14(第 1 棒)|17:4x(本棒) | `取证/api/opencreator.README.md` | `取证/opencreator/oc_docs_zh_README.md` |
|
||||
| 3 | 顶层树 + `docs/` 子树 | 16:14(第 1 棒) | `取证/api/opencreator.tree.{top,docs}.json` |
|
||||
| 4 | 分片文件树 ×11(`.github` `apps` `assets` `packages` `resources` `runtime` `scripts` `skills` `template` `docs/specs` `docs`〔递归〕) | 2026-10-07 17:37–17:44 | `取证/opencreator/tree_*.json` + `_tree_summary.json` |
|
||||
| 5 | 正文 ×62(根 6 + docs 20 + protocol 17 + skill-market 5 + skills 8 + runtime 1 + apps 3 + custom-skills 1 + …) | 2026-10-07 17:45–17:56 | `取证/opencreator/oc_*` + `_content_fetch_log.json` |
|
||||
| 6 | 文件树统计(可复算) | 2026-10-07 17:5x | `取证/opencreator/opencreator.tree.stat.json`(脚本 `取证/_opencreator_tree_stat.py`) |
|
||||
|
||||
**关键逐字来源索引**(便于复核):
|
||||
- 产品定位与创作工具表 → `oc_docs_zh_README.md`(用户给定链接)+ 第 1 棒 `opencreator.README.md`
|
||||
- Runtime 架构与透传策略 → `oc_docs_2026-07-03-codex-native-agent-runtime-design.md`
|
||||
- Runtime API / 鉴权 / 错误映射 → `oc_docs_runtime-api-for-ui-v1.md`
|
||||
- provider 白名单(17 条)与服务默认值 → `oc_packages_protocol_src_creator-provider-catalog.ts` · `oc_packages_protocol_src_creator-services.ts`
|
||||
- 状态机与对象模型 → `oc_packages_protocol_src_creator.ts`
|
||||
- 技能市场 52 条与七项风险 → `oc_packages_skill-market_src_{types.ts,source-skills.json,source-categories.json,catalog.ts}`
|
||||
- 技能规范与 merge bar → `oc_docs_contributing_skills-contributing.md` + `oc_skills_*`
|
||||
- 模板治理与合规门禁 → `oc_docs_operations_pr-338-模板规范审查.md`
|
||||
- 计划任务专属会话(迁移/回滚)→ `oc_docs_operations_2026-07-15-scheduled-task-dedicated-thread-release-runbook.md` + `oc_docs_test-reports_2026-07-15-scheduled-task-dedicated-thread-final-acceptance.md`
|
||||
- 工程治理铁律 → `oc_AGENTS.md`
|
||||
- 安全边界与数据落点 → 第 1 棒 `opencreator.README.md` + `oc_docs_specs_2026-09-19-codex-native-image-provider-design.md`
|
||||
- Go 引擎构成 → `oc_runtime_krillinai_go.mod` + `tree_runtime.json`
|
||||
- 依赖与安全 override → `oc_package.json` · `oc_apps_daemon_package.json` · `oc_apps_web_package.json`
|
||||
|
||||
⚠️ **通道口径**:本机 `raw.githubusercontent.com` 本棒**实测 60/61 成功**(1 件失败经 `contents` API 补齐),与第 3 棒"raw 不稳"的结论不同 —— 该通道**随时刻波动**,⛔ 不能当作稳定条件写进脚本;本棒脚本采用 **raw 优先 + 失败回落 contents API** 的双通道写法。
|
||||
|
||||
---
|
||||
|
||||
*本文件为第四棒产物。原始证据见 `取证/api/`(第 1 棒,只读复用)与 `取证/opencreator/`(本棒 76 件);可复算脚本 `取证/_opencreator_tree.py` · `_fetch_opencreator_docs.py` · `_opencreator_tree_stat.py`;台账见 `tmp/supervise-inbox/tasks.json`。*
|
||||
+195
@@ -0,0 +1,195 @@
|
||||
# 1b 竞品分析 · 第二棒:Postiz + PostSider 同源双形态分析
|
||||
|
||||
> 项目 slug:`content-workbench` | 目标:调研 5 个开源内容工作台项目并生成分析文档
|
||||
> 本棒范围:**只做「Postiz(第 4 项)+ PostSider(第 5 项)」** —— 二者同源,**合成一份**(⛔ 不拆两份)。
|
||||
> 取证时间:**2026-10-07 16:40–17:05(CST)** | 取证环境:GitHub 公开 REST/raw API + 两个项目官网
|
||||
> 证据落点(本目标目录内):`取证/api/`(第 1 棒已拉,本棒只读复用)+ `取证/api/fork/`(本棒新拉)+ `取证/api/fork/fork-diff.json`(本棒现算)
|
||||
> 取证脚本:`取证/_fetch_fork_evidence.py`(补拉增量面)· `取证/_fork_diff.py`(差异量化,可复算)
|
||||
> 方法:源码级/官方文件级实证优先;**每条结论标来源 + 取证时间**;查不到即写「查不到」。
|
||||
|
||||
---
|
||||
|
||||
## 一、本棒最重要的四条结论
|
||||
|
||||
1. **同源已坐实,且是"自述 fork"**:PostSider 的 `ATTRIBUTION.md` 逐字写「PostSider is a fork of `postiz-app`」,版权归 Nevo David 与 Postiz 贡献者,两者同为 **AGPL-3.0**。
|
||||
⚠️ 但 GitHub 元数据里 `lumizone/postsider` 的 **`"fork": false`** ⇒ 平台上**未登记为 fork**、**无 parent 指针** ⇒ fork 点无法用 API 求(详见 §九)。
|
||||
2. **改动量远不止"换牌"** —— 文件树级量化(§三):两端共 329 条同路径文件中**只有 92 条逐字节相同**;PostSider **删掉浏览器扩展(16 文件)与共享 React 库(57 文件)**、**前端 `src/components` 从 293 降到 78**、**新增独立 MCP 包 `apps/mcp`(46 文件)**。
|
||||
3. **PostSider 的增量面确实是"Agent 桥"**,且做得比上游更工程化:MCP **独立成包**(`@postsider/mcp`)+ **19 个工具**(13 读 / 6 写,源码级双证 §四)+ **工具契约单独成文件作断言目标**;上游 Postiz 的 MCP 则**嵌在后端**(`chat/mcp.relay.service.ts`)。
|
||||
4. **定价已补齐(第 1 棒遗留缺口闭合)**:Postiz Cloud $29 / $39 / $49 / $99 每月;PostSider $20 / $35 / $45 / $90 每月。两家的 API/SDK/MCP **每个档位都含**(§六)。
|
||||
|
||||
---
|
||||
|
||||
## 二、同源关系与溯源取证
|
||||
|
||||
| 项 | Postiz | PostSider |
|
||||
|---|---|---|
|
||||
| 仓库 | `github.com/gitroomhq/postiz-app` | `github.com/lumizone/postsider` |
|
||||
| 官网 | https://postiz.com(云 + 自托管双形态) | https://postsider.com(自托管 + Agent 桥) |
|
||||
| 许可 | AGPL-3.0 | AGPL-3.0(ATTRIBUTION 逐字确认同源许可) |
|
||||
| 仓库创建 | 2023-07-08 | 2026-08-15 |
|
||||
| 最近推送 | 2026-10-07 | 2026-10-05 |
|
||||
| Stars / Forks | 36809 / 7123 | 10 / 0 |
|
||||
| 默认分支文件树 | `main`,1018 个 blob,`tree_sha=3128e870…` | `main`,913 个 blob,`tree_sha=d5ecaf01…` |
|
||||
| 版本号 | `version.txt = v1.47.0`;releases 最新 **v2.25.0**(2026-10-02) | root `package.json = 1.3.0`;releases 最新 **v1.2.0**(2026-09-09),首版 v1.0.0 与仓库创建同日 |
|
||||
| 归属 | Nevo David / Gitroom(团队) | **单人**:Lukasz Blania(Lumi Zone,波兰,官网自述) |
|
||||
|
||||
**来源**:`取证/api/postiz.repo.json` · `postsider.repo.json` · `postiz.tree.json` · `postsider.tree.json`(第 1 棒,2026-10-07 16:14–16:15);`取证/api/fork/postiz.releases.json` · `postsider.releases.json` · `postiz.version.txt` · `postsider.package.json`(本棒 2026-10-07 16:4x);官网 https://postsider.com(2026-10-07 17:0x 取)。
|
||||
|
||||
PostSider 自带的**换牌治理机制**(本棒两组新证据):
|
||||
- `.rebrand-allowlist`(11 条):显式声明哪些上游字样是**有意保留**(LICENSE / ATTRIBUTION / CHANGELOG / README / 迁移文件 / 两个库文件)。
|
||||
- `scripts/rebrand-check.mjs`:**CI 级闸门** —— 仓库里任何**未列入白名单**的文件出现 `gitroom|gitroomhq|postiz`、或 TS 文件 import `@gitroom/…`、或 `package.json` 的 `name` 含旧标识 ⇒ **exit 1**。
|
||||
- Prisma 迁移里还有一条 `20260826150000_drop_postiz_leftovers`(专为清理上游残留而建)。
|
||||
|
||||
---
|
||||
|
||||
## 三、量化 fork 改动范围(本棒现算,`fork-diff.json`)
|
||||
|
||||
**口径**:比对两侧 `main` 分支的 blob `sha`(内容哈希)。**同 sha = 逐字节相同**;不同 sha = 内容不同(**可能只是换牌字符串,也可能是真改动** —— 本脚本只给计数与清单,不做价值判断)。
|
||||
⚠️ **这是"同一时刻两个 main 分支"的路径级比对,⛔ 不等于 fork 点的 diff**(原因见 §九)。
|
||||
|
||||
**总量**:同路径 **329** 条 ⇒ 其中**逐字节相同 92**、**同路径但内容不同 237**;**仅 Postiz 有 689**、**仅 PostSider 有 584**。
|
||||
|
||||
**关键子树(P = Postiz 文件数 / S = PostSider 文件数)**:
|
||||
|
||||
| 子树 | P | S | 共有 | 同内容 | 内容不同 | 仅 P | 仅 S | 读作 |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `apps/` | 568 | 457 | 97 | 20 | 77 | 471 | 360 | 两侧 app 组成不同 |
|
||||
| `apps/extension/` | 16 | **0** | 0 | 0 | 0 | 16 | 0 | **浏览器扩展被删** |
|
||||
| `apps/frontend/` | 434 | 267 | 4 | 0 | 4 | 430 | 263 | **前端已重构/收缩** |
|
||||
| `apps/backend/` | 61 | 81 | 49 | 7 | 42 | 12 | 32 | 后端加厚 |
|
||||
| `apps/mcp/` | **0** | **46** | 0 | 0 | 0 | 0 | 46 | **净新增:独立 MCP 包** |
|
||||
| `libraries/` | 366 | 374 | 201 | 62 | 139 | 165 | 173 | 后端核心大量改写 |
|
||||
| `libraries/react-shared-libraries/` | 57 | **0** | 0 | 0 | 0 | 57 | 0 | **共享 React 库被删** |
|
||||
| `…/prisma/` | 40 | 110 | 32 | 0 | 32 | 8 | 78 | **迁移体系 + 新模型** |
|
||||
|
||||
**六条结构性信号(都能直接用于决策)**:
|
||||
|
||||
1. **后端加厚**:`apps/backend/src` 顶层 `api` 32→42、`services` 19→28;PostSider 多出 `approval` / `agency` / `evergreen` / `composer-helpers` / `report` / `publishing` / `mcp-oauth` / `meta.compliance` 等路由。
|
||||
2. **Prisma 从「schema push」升级为「迁移体系」**:Postiz **仓库内 0 个 `migrations/`**(脚本走 `prisma db push --accept-data-loss`);PostSider **26 条**(`0_init` 压平基线 + 2026-06-28 → 2026-09-25 的增量,含 `mcp_oauth`、`audit_login`、`add_totp_mfa`、`channel_assignment`、`emergency_pause`)。
|
||||
3. **测试面从 0 到 94**:默认分支文件树内 `*.spec.ts`/`*.test.ts` —— Postiz **0 条**(唯一含 "test" 的三条路径是 `testimonial` 组件,`apps/backend/package.json` 亦无 test 脚本)、PostSider **94 条**;根级 jest 配置 2 → **16**(按域拆分:approval / csv-import / evergreen / post-checker / queue-plan / smart-slots / ai-rewrite / api-generator …)。
|
||||
4. **平台连接器此消彼长**:`*.provider.ts` 文件 Postiz 36 / PostSider 34。**PostSider 新增 5 个**:blogger、ghost、mataroa、notion、write.as;**移除 7 个**:kick、mewe、reddit、skool、tiktok.business、tumblr、vk。另新增 `connector.catalog.ts`(连接器目录)、`comment.capability.ts`(首评能力)、`provider-env.helper.ts`(凭据校验)。
|
||||
5. **运维面补齐**:PostSider 多出 `deploy/`(`Caddyfile` + 3 份 nginx 配置,含 `nginx-host-mcp.conf`)、`docker-compose.production.yaml`、`ecosystem.config.js`、`DEPLOYMENT.md`、`.env.production.example`、`minio-anon-policy.json`,以及 CI 三件套 `ci.yml` / `publish-image.yml` / **`release-mcp.yml`**。
|
||||
6. **许可文件与工程约定被改写**:`LICENSE` / `README.md` / `CONTRIBUTING.md` / `SECURITY.md` / `.env.example` / `.gitignore` 均落在"内容不同"里(换牌 + 自述),而 Postiz 独有的 `CLAUDE.md` / `CCLA.md` / `ICLA.md` / `Jenkins/` / `railway.toml` / `i18n.json` 在 PostSider 侧**全部不存在**。
|
||||
|
||||
**来源**:`取证/api/fork/fork-diff.json`(本棒现算,2026-10-07 16:5x,脚本 `取证/_fork_diff.py`)· `取证/api/postiz.tree.json` / `postsider.tree.json`。
|
||||
|
||||
---
|
||||
|
||||
## 四、PostSider 的增量面(本棒重点)
|
||||
|
||||
### 4.1 `apps/mcp` —— 19 个工具(源码级双证)
|
||||
|
||||
- **证据 ①(文档)**:`apps/mcp/README.md` 明写「**19 tools, all prefixed `postsider_`**」,并逐条列出 —— **13 个只读**(list_channels / list_groups / list_posts / get_post / get_post_missing_fields / get_post_analytics / get_channel_analytics / find_slot / get_notifications / get_publishing_state / get_approval_status / get_agency_overview / get_customer_report)+ **6 个改状态**(create_post / update_post_status / request_approval / upload_media_from_url / **delete_post(不可逆:连带删同名其它渠道版本)** / **pause_publishing(组织级急停,恢复仅人可做)**)。
|
||||
- **证据 ②(源码,独立成断言目标)**:`apps/mcp/src/__tests__/tool-inventory.ts` 里 `EXPECTED_TOOL_NAMES` 恰 19 条、`EXPECTED_TOOL_COUNT = 19`,并为**每个工具**显式声明四条 MCP 注解 `readOnlyHint / destructiveHint / idempotentHint / openWorldHint`。文件开头的注释点明动机:**这份清单是独立于注册代码写的断言目标 ⇒ 工具被静默增删改名会直接测试失败**。
|
||||
- **工程面**:只依赖 `@modelcontextprotocol/sdk ^1.22.0` + `zod ^3.25.76`(`apps/mcp/package.json`);**stdio 与 http 两种传输共用同一个工具注册工厂**;有独立 `Dockerfile`、`server.json`(已登记 MCP registry `io.github.lumizone/postsider`,`toolCount: 19`)、`release-mcp.yml` 发布流水线。
|
||||
- **安全约束(README 逐条)**:API URL 必须 HTTPS(仅 loopback 允许 http);**拒绝重定向**(防鉴权请求被推到别的 origin);工具参数**本地先校验**(空 id、非法日期 `2026-02-30` 本地拒、媒体导入必须公网 HTTPS);API Key 只从环境读、**不打印不入日志**;30 s 超时、失败响应体最多读 8 KB。
|
||||
- **Claude Code 插件形态**:`.claude-plugin/plugin.json` + `.mcp.json` + `skills/` **5 个技能**(agency-operations / approval-workflow / calendar-review / content-publishing / performance-reporting)⇒ 从仓库直接 `claude plugin marketplace add` 安装。
|
||||
- **与上游的对照**:Postiz 的 MCP **不是独立包**,而在后端内(`libraries/nestjs-libraries/src/chat/mcp.relay.service.ts`、`start.mcp.ts`),路线是「**托管 MCP endpoint + 15 个 agent 连接器**」(README 图标:ChatGPT / Claude / Claude Code / Codex / Cursor / OpenClaw / Hermes / Grok Bot / Grok Build / Muse / Perplexity Computer / nanoclaw / Paperclip / MCP Server / AI Agents CLI)。
|
||||
|
||||
来源:`取证/api/fork/postsider.apps_mcp.README.md` · `postsider.mcp.tool-inventory.ts` · `postsider.apps_mcp.package.json` · `postsider.apps_mcp.server.json` · `postsider.apps_mcp.CHANGELOG.md`(MCP 1.0.0 首发 2026-09-24)· `postiz.README.md`;树证据 `postsider.tree.json` / `postiz.tree.json`。(2026-10-07 16:4x)
|
||||
|
||||
### 4.2 Public API 与 SDK
|
||||
|
||||
- **Public API**:两侧同在 `apps/backend/src/public-api/routes/v1/`,对外前缀 `/public/v1`(PostSider SDK README 明示;自托管挂在 nginx 的 `/api` 下 ⇒ 完整为 `https://<域>/api/public/v1`);官网标注限流 **60 请求/分钟**。
|
||||
- **PostSider 新增的后端件**:`public-api-idempotency.service.ts`(幂等键)、`oauth/mcp-oauth.*` + `mcp-oauth.controller.ts` + 迁移 `20260925130000_mcp_oauth`(MCP 的授权链)、`inbound-subscription.repository.ts`(入站订阅/webhook secret)、`webhooks.repository`。
|
||||
- **SDK 对比(实拉两个 `package.json` + README + 源码方法签名)**:
|
||||
- `@postsider/node` **v2.0.0**:`post(posts, idempotencyKey?)` · `postList(filters)` · `upload(file, ext)` · `integrations()` · `deletePost(id)`;新增 **幂等键** 与 **`apiBasePath` 选项**(自托管路径);错误统一抛 `PostsiderApiError(status, method, path, details)`。
|
||||
- `@postiz/node` **v1.0.8**:方法同名,但**无幂等键、无可配 basePath**,`deletePost` 返回原始 `Response`。
|
||||
- PostSider README 明示 SDK 2.0.0 是 **breaking change**(`deletePost` 返回值语义变了)。
|
||||
- **产品化边界(值得记的一条)**:MCP 的定位被写成 **read-first / draft-first** —— Agent 可以准备、排期、送审,**发布仍是人的动作**;「组织级暂停」是 kill switch 且**恢复仅人可做**。
|
||||
|
||||
来源:`取证/api/fork/postsider.sdk.README.md` · `postsider.sdk.index.ts` · `postsider.sdk.package.json` · `postiz.sdk.README.md` · `postiz.sdk.package.json` · `postsider.README.md` · https://postsider.com(2026-10-07 16:5x–17:0x)。
|
||||
|
||||
---
|
||||
|
||||
## 五、两个形态的产品定位与功能清单
|
||||
|
||||
### 5.1 Postiz(`gitroomhq/postiz-app`)
|
||||
|
||||
- **定位**:社媒管理平台 —— 排期 / 自动化 / 分析三件套,**云与自托管"同一套核心功能"**;README 逐字「**We do not "gate" features or limit the license**」,并给了一张 20 行的云/自托管对照表(差别只在基础设施、平台应用预审、运维责任)。
|
||||
- **形态**:Postiz Cloud(SaaS,含各平台**预审应用**)+ 开源自托管版。
|
||||
- **功能清单(README 对照表逐条)**:排期与日历视图 / 跨平台转发 / 重复帖 / 评论与延迟 / sets / 签名;Internal & Global Plugs、RSS 自动发、客户分组;分析;团队协作「交换或购买帖子」;Public API 与 webhooks;**AI Copilot / AI 图 / AI 视频 / 视频切片 / Smart Agent**(云侧含月度配额、key 由 Postiz 管;自托管需自带 key);**Agentic 面:MCP + CLI + 15 个 agent 连接器**。
|
||||
- **合规姿态(README 显式)**:托管服务走**平台官方 OAuth**;**不自动化、不抓取**平台内容;**不收集/不存储/不代理**用户 API Key。
|
||||
- **规模自述**:README 称「over 7M downloads and 20k views per month」(**未注明口径,未核**)。
|
||||
- **技术栈**:pnpm workspaces 单仓;NextJS(React) + NestJS + Prisma(默认 PostgreSQL) + Temporal + Resend;Node `>=22.12.0 <23.0.0`。
|
||||
|
||||
### 5.2 PostSider(`lumizone/postsider`)
|
||||
|
||||
- **定位**:README 用一张四行表把产品拆成**四种用法** —— ①社媒排期器 ②自托管平台 ③自动化后端(REST API + Node SDK)④**AI-agent 桥(MCP server)**。官网口号:「for humans, teams, and AI agents」。
|
||||
- **规模**:**33 个活跃连接器**(README 自述,注册表为 `integration.manager.ts`;官网写 "30+ networks" —— 两处口径不一,见 §九)。
|
||||
- **功能清单(README 分节)**:
|
||||
- 排期与发布:拖拽日历、发布队列与"找空位"、Smart Slot 建议、**Evergreen 内容回收**、按平台预览、**发布前按平台校验**、支持平台自动首评、**CSV 批量导入**。
|
||||
- 内容工作流:话题标签组、文案模板、可复用片段、UTM 构造器、草稿与**审批流**、共享媒体库。
|
||||
- 团队与组织:多组织工作区(品牌/客户隔离)、Admin 与 User 角色、共享发布流程。
|
||||
- 自动化:Public REST API、`@postsider/node`、`@postsider/mcp`、Webhooks。
|
||||
- 可选 AI:Post Checker、文案改写(**平台级或按组织自带 OpenAI Key;无 Key 也能跑**)。
|
||||
- 安全:可选 TOTP 双因子 + 一次性恢复码 + **组织级强制 2FA**、凭据静态加密、安全活动轨迹、httpOnly cookie、CORS/CSP、限流、服务端授权与套餐校验。
|
||||
- **Roadmap(README 勾选)**:已完成 —— GitHub Actions CI、GHCR 运行时镜像、Public REST API、Node SDK、MCP server;未完成 —— 核心流程更广的自动化覆盖、**全库启用 `strictNullChecks`**、移动 App、插件系统、高级分析面板。
|
||||
- **技术栈**:NestJS 11 + Next.js 15 / React 19 + PostgreSQL + Prisma 6.5 + Redis + Temporal;可选 OpenAI;可选 Polar.sh 计费;存储本地 / Cloudflare R2 / MinIO;Node `>=20.17.0 <23.0.0`。
|
||||
- **形态**:Docker Compose 一键自托管(镜像 `ghcr.io/lumizone/postsider-app`,入口 `localhost:4007`),默认栈含 PostgreSQL + Redis + Temporal;另附生产 compose 与 nginx/Caddy 配置。
|
||||
|
||||
来源:`取证/api/postiz.README.md` · `postsider.README.md` · `postsider.package.json` · `postiz.package.json` · `postsider.DEPLOYMENT.md` · 两端 `tree.json`。
|
||||
|
||||
---
|
||||
|
||||
## 六、商业面(本棒补齐第 1 棒缺口)
|
||||
|
||||
| 档 | Postiz Cloud(postiz.com/pricing,2026-10-07 取) | PostSider(postsider.com,2026-10-07 取) |
|
||||
|---|---|---|
|
||||
| 入门 | **Standard $29/mo** — 5 渠道、无限帖、AI copilot、**3 AI 视频/月 + 60 分钟切片** | **Standard $20/mo** — **1 席位**、5 渠道、**400 帖/月**、基础分析 |
|
||||
| 小团队 | **Team $39/mo** — 10 渠道、无限成员、100 AI 图 + 10 AI 视频/月 | **Team $35/mo** — 10 渠道、无限帖、无限成员、自动队列、审批流 |
|
||||
| 大业务 | **Pro $49/mo** — 30 渠道、300 AI 图 + 30 AI 视频/月 | **Pro $45/mo** — 30 渠道、CSV 导入、自动 plugs 与首评、审计日志 |
|
||||
| 代理/机构 | **Ultimate $99/mo** — 100 渠道、500 AI 图 + 60 AI 视频/月 | **Ultimate $90/mo** — 100 渠道、可建自定义 OAuth 应用、优先级支持 |
|
||||
|
||||
- **共同点**:两家**每个档位都包含 API / SDK / MCP / Webhooks**(这是最值得记的一条 —— 「Agent 可调用」没被当成加价项)。
|
||||
- **差异点**:Postiz 各档带 **AI 生成配额**(图/视频/切片分钟)与**托管 MCP endpoint**;PostSider **不做 AI 内容生成**(只有 checker + 改写;其博客 2026-10-05 直接题为「I Removed AI Content Generation from My Social Media Product」)。
|
||||
- 两家均 **7 天试用**;PostSider 明示「免信用卡、随时取消」。
|
||||
- ⚠️ 自托管版**两者都免费**(AGPL-3.0),付费只是买托管/平台预审/运维 —— 与 README 的「不设功能门槛」一致。
|
||||
|
||||
来源:https://postiz.com/pricing(2026-10-07 取)· https://postsider.com(2026-10-07 取)· 两端 README 的云/自托管对照表。
|
||||
|
||||
---
|
||||
|
||||
## 七、可借鉴点(对 `content-workbench`,按可搬性排序)
|
||||
|
||||
1. **工具契约独立成文件,作为断言目标**:PostSider 的 `tool-inventory.ts` 把"Agent 能看到哪些工具"写死成一份**独立于实现**的清单 ⇒ 静默增删改名直接测试报红。这是"对 AI 暴露的面"能被治理的前提。
|
||||
2. **每个工具显式声明四个风险注解**(readOnly / destructive / idempotent / openWorld,**含 false**)⇒ 客户端能区分"读一下"与"急停开关"。PostSider 把 `destructiveHint: true` 只留给两件事:**删帖**与**组织级暂停**。
|
||||
3. **read-first / draft-first 的产品边界**:Agent 能准备与排期,**发布仍是人的动作**;急停的恢复**仅人可做**。这条把"自动化"与"不可逆"分开,比"给 Agent 最高权限"稳得多。
|
||||
4. **MCP 是 public API 的薄封装**:`@postsider/mcp` 只依赖 SDK + zod、不依赖后端 ⇒ 独立发版、独立 Docker、独立 CI。**先有 `/public/v1`,再有 MCP** —— 顺序不能倒。
|
||||
5. **换牌/二开要有闸门**:`.rebrand-allowlist`(声明有意保留的上游字样)+ `rebrand-check.mjs`(CI 里 `exit 1`)。**fork 治理不是靠自觉**。
|
||||
6. **自托管的"可运维"清单**可直接抄:Prisma **迁移**(而非 db push)+ 生产 compose + nginx/Caddy 样例 + 对象存储三选(本地/R2/MinIO)+ GHCR 镜像 + 发布流水线。
|
||||
7. **安全清单**(官网 + MCP README 合并):凭据 AES-256-GCM 静态加密、拒绝重定向、SSRF/CSRF 防护、限流、审计轨迹、组织级 2FA、API Key 不入日志。
|
||||
8. **测试面是 fork 敢不敢长期维护的分水岭**:94 个 spec + 16 份按域拆分的 jest 配置(对比上游默认分支 0 条)。
|
||||
|
||||
---
|
||||
|
||||
## 八、风险与合规(两者都要看)
|
||||
|
||||
1. **AGPL-3.0 的网络服务义务**:把改过的 Postiz/PostSider 当**网络服务**对外提供 ⇒ **必须向使用者开放对应源码**(PostSider 的 `ATTRIBUTION.md` 自己逐字写了这条)。作内部自用工具不受此约束,作对外产品要先过这一关。
|
||||
2. **上游署名义务**:fork 必须保留原版权声明(PostSider 已在 `LICENSE` 保留);换牌不得抹掉署名 —— 这正是 `rebrand-check` 存在的原因。
|
||||
3. **跟上游的能力已被放弃**:PostSider 删了 `apps/extension` 与 `libraries/react-shared-libraries`、重构了前端(`src/components` 293→78),而 Postiz 仍在高速迭代(releases v2.23→v2.25,2026-08→10)⇒ **两者已不可能常规合并**,只能单向跟随或彻底自立。
|
||||
4. **平台合规路线二选一,不可混**:Postiz 明确「官方 OAuth、不自动化不抓取」;而本组另一项目 Easel 走的是"浏览器自动化发布"(第 1 棒记录,其 README 自己提示"谨慎自动发布到小红书")。同一条产品线里**不能既抄 Easel 的自动发布又抄 Postiz 的合规姿态**。
|
||||
5. **单点风险(PostSider)**:官网自述由**一个人**开发与运维(Lukasz Blania,波兰,Lumi Zone),GitHub 仅 10 stars / 0 forks,releases 停在 v1.2.0(2026-09-09)。⇒ 作为"可借鉴的设计样本"价值高,作为"可依赖的上游"风险高。
|
||||
|
||||
---
|
||||
|
||||
## 九、查不到 / 待核实(⛔ 不猜)
|
||||
|
||||
1. **真 fork 点(哪个 commit、哪一天)**:GitHub 上 `lumizone/postsider` **未标记为 fork**、无 parent 指针 ⇒ API 求不到;本棒**未**做 clone 后的 `git merge-base` ⇒ **查不到**。
|
||||
2. **改动行数**:GitHub tree API 只给 blob `sha`,**不给行数** ⇒ 本棒只做到**文件级/路径级**量化;行级 diff 未做(需 clone 两侧后 `git diff --stat`)。
|
||||
3. **PostSider「33 个活跃连接器」与仓库 provider 文件数不一致**:本棒数到 `*.provider.ts` **34 个**(README 表列 33 个;官网另写 "30+ networks")。口径可能不同(同一平台两个 provider 文件 / 已注册但停用 / 官网是营销语)⇒ **未逐条核对注册表,标"未核实"**。
|
||||
4. **两者的真实用户量 / 营收**:Postiz 自述 7M downloads(无口径);PostSider 无任何公开规模数据 ⇒ **查不到**。
|
||||
5. **PostSider 的托管(云)形态是否存在**:官网只给 `app.postsider.com/register` 试用入口与自托管文档,**未见独立的托管定价/服务条款页** ⇒ 托管形态的 SLA 与数据条款**查不到**。
|
||||
6. **上游两版之间的取舍原因**(为何删 reddit / vk / tumblr / kick,为何不做 AI 生成):仓库内**未见 RFC/公告**,博客只有一篇 2026-10-05 的立场文;**动机未取证**。
|
||||
|
||||
---
|
||||
|
||||
## 十、下一棒建议(本棒交付后)
|
||||
|
||||
1. **本棒已闭合的两项**:Postiz/PostSider 定价(§六);fork 差异的文件级量化(§三)。**第 1 棒「四、下一棒该做什么」第 1 项已完成**。
|
||||
2. **余下棒次(按 第 1 棒 第 2–5 项)**:Easel 深度分析 → OpenCreator 深度分析(先补拉完整文件树)→ 文到 AI(**开工前须与用户确认**是否仍按"开源项目深度分析"做,无源码)→ 跨项目汇总对比文档。
|
||||
3. **可选补强(非必须,若还有预算)**:把本棒的文件级 diff 升级为**行级 diff**(clone 两侧 + `git diff --stat`),以回答"到底改了多少行业务代码"。⚠️ 这会显著增加下载量与耗时 ⇒ **建议单独一棒,且先问用户是否要**。
|
||||
|
||||
---
|
||||
|
||||
*本文件为第二棒产物。原始证据见 `取证/api/`(第 1 棒)与 `取证/api/fork/`(本棒);可复算脚本 `取证/_fork_diff.py`;台账见 `tmp/supervise-inbox/tasks.json`。*
|
||||
+253
@@ -0,0 +1,253 @@
|
||||
# 1b 竞品分析 · 第五棒:文到 AI 分析
|
||||
|
||||
> 项目 slug:`content-workbench` | 目标:调研 5 个开源内容工作台项目并生成分析文档
|
||||
> 本棒范围:**只做目标说明 §二 清单第 2 项 `wendaoai/wendao-content-workbench`(文到 AI)**。
|
||||
> ⛔ 本轮不碰跨项目汇总对比文档(属下一棒)。
|
||||
> 取证时间:**2026-10-07 18:07–18:10(CST)**(第 1 棒仓库面证据为 16:14,本棒只读复用)
|
||||
> 取证环境:GitHub 公开 REST / `contents` API(脚本 `取证/_fetch_wendao.py`)+ 官网 `www.asfop.top`(curl 原始抓取)+ 官方分发仓 `gitcode.com/wendao-ai/wendao-ai-updates`(`api.gitcode.com` JSON)
|
||||
> 证据落点(本目标目录内):`取证/api/wendao.{repo.json,README.md,readme.json,tree.json}`(第 1 棒,**只读复用,⛔ 未重复下载**)|`取证/wendao/`(本棒新增 20 件,见 `取证/wendao/_取证说明.md`)
|
||||
|
||||
🔴 **覆盖边界:本仓库不含业务源码,以下结论均基于官方自述与仓库元数据,未经源码级验证。**
|
||||
(`README.md` 与 `NOTICE.md` 逐字声明闭源;GitHub 语言统计为**空对象**;`.gitignore` 明确排除 `src/ server/ web/ data/ outputs/`。来源:`取证/api/wendao.README.md`、`取证/wendao/wen_NOTICE.md`、`取证/wendao/wen_languages.json`、`取证/wendao/wen_gitignore.txt`,2026-10-07 16:14 / 18:07)
|
||||
|
||||
---
|
||||
|
||||
## 一、本棒最重要的六条结论
|
||||
|
||||
1. **这是一个"真闭源"的商业桌面软件,不是开源项目**:GitHub 仓库全仓 **5 个 blob**(`.gitignore` / `NOTICE.md` / `README.md` / `RELEASE_NOTES_0.0.113.md` / `assets/desktop-home.png`),`git/trees?recursive=1` 返回 `truncated=false`(整树完整,无隐藏源码);`NOTICE.md` 逐字写「source code is proprietary and is not distributed through this repository」。⇒ **本目标原定的"5 个开源项目"实际只有 4 个可做源码级分析**(第 1 棒已判、本棒已实证)。
|
||||
2. **它的"公开面"只有三层,且都不是源码**:① GitHub 文档仓(产品介绍 + 版本公告);② 官网 `www.asfop.top`(产品页 + 隐私政策 + 条款);③ 官方**更新分发仓** `gitcode.com/wendao-ai/wendao-ai-updates`(只有 `updates/stable.json` + `updates/versions/*.json`,**零业务代码**)。
|
||||
3. **产品定位是"单平台纵深"**:面向**公众号**创作者,把「选题 → 写作 → 排版 → 配图 → 卡片 → 发布准备 → 数据复盘」压在**一个本地桌面应用**里;与另 4 个项目的多平台分发路线**正交**。
|
||||
4. **有大量可核验的工程做法**(无需源码即可看到):独立更新仓 + `stable.json` 版本清单(含**四平台矩阵**、逐包 `sha256`、`policy`:`minimumSupportedVersion` / `allowSkip` / `remindAfterHours`)、官网**按系统架构自动选包**、**发布助手浏览器插件**(Chrome/Edge/Safari/Firefox,v0.1.0)。
|
||||
5. **技术栈只能"间接推断",有三处硬线索但无源码背书**:仓库 topics 直接写着 **`wails`**(另有 `desktop-app` / `local-first` / `wechat-editor` / `markdown-editor` / `chinese-ai` / `ai-writing`);`.gitignore` 排除 `src/ server/ web/ data/ outputs/`;官方 changelog 逐字写「恢复 **Vue** 作为唯一的 Web 与桌面前端」、「使用本地 **SQLite** 保存内容与工作记录」。⇒ **Wails(Go) + Vue + 本地 SQLite + 用户自配模型**是**有据的推断**,⛔ 但**不是源码级结论**。
|
||||
6. **README 与发行状态已经不同步**:README(2026-09-17)写「**当前尚未发布公开安装包**」,而官方更新源(`stable.json`)已是 **v0.0.123(2026-09-23 发布)**、四个平台包可下载、官网首屏已有"下载所选版本"选择器。⇒ **引用 README 的"未发布"会被带偏**,须以更新源为准。
|
||||
|
||||
---
|
||||
|
||||
## 二、仓库元数据(公开面,无许可声明)
|
||||
|
||||
| 项 | 值 | 来源 |
|
||||
|---|---|---|
|
||||
| 全名 / 归属 | `wendaoai/wendao-content-workbench`;owner 是**组织**(`type: Organization`,id 330217300,**创建于 2026-09-17**,**公开仓库仅 1 个**) | `取证/api/wendao.repo.json`(16:14)· `取证/wendao/wen_org.json` · `wen_org_repos.json`(18:07) |
|
||||
| 描述 | 「文到 AI - 免费、本地优先的公众号 AI 写作、智能排版、图片生成与内容管理桌面工具」 | `取证/api/wendao.repo.json`(16:14) |
|
||||
| 主页 | **https://www.asfop.top/** | 同上 |
|
||||
| 许可 | **`license: null`(无 LICENSE 文件)**;仓内 `NOTICE.md` 声明「proprietary…All rights reserved」 | `取证/api/wendao.repo.json` · `取证/wendao/wen_NOTICE.md`(18:07) |
|
||||
| 创建 / 最近推送 | 创建 **2026-09-16 07:35:31Z**;最近推送 **2026-09-17 01:53:50Z**(此后 GitHub 侧**无新提交**) | `取证/api/wendao.repo.json`(16:14) |
|
||||
| Stars / Forks / Watchers | **3 / 0 / 3**;open issues **0**;subscribers 0;`network_count` 0 | 同上 + `取证/wendao/wen_forks.json`(18:07) |
|
||||
| 默认分支 / 根树 sha | `main`;`tree_sha = 5505657bdd9d28169e72fee7cd2ed9de925e024f`,`truncated=false` | `取证/api/wendao.tree.json`(16:14) |
|
||||
| **文件规模** | **5 个 blob + 1 个 tree(`assets/`)** —— 逐条:`.gitignore` 179 B / `NOTICE.md` 531 B / `README.md` 5,059 B / `RELEASE_NOTES_0.0.113.md` 1,112 B / `assets/desktop-home.png` 496,282 B | `取证/api/wendao.tree.json` + `取证/wendao/wen_assets_dir.json`(18:07) |
|
||||
| **语言构成** | **`{}`(空对象)** ⇒ GitHub 判定该仓**零代码** | `取证/wendao/wen_languages.json`(18:07) |
|
||||
| 提交 | **9 条,全部 `docs:` 前缀**(2026-09-16 07:13 ~ 09-17 01:52),作者名 `gongzhe` | `取证/wendao/wen_commits.json`(18:07) |
|
||||
| 贡献者 | **1 人**(`asfop1`,9 次提交) | `取证/wendao/wen_contributors.json`(18:07) |
|
||||
| Topics | `ai-writing` `chinese-ai` `content-creation` `desktop-app` `local-first` **`wails`** `markdown-editor` `wechat-editor` `wechat-official-account` | `取证/api/wendao.repo.json`(16:14) |
|
||||
| 仓库能力开关 | `has_downloads: false`;`has_pages: false`;`has_discussions: false`;`has_wiki: true` | 同上 |
|
||||
| Gitee 镜像 | README 首行给出 `https://gitee.com/wendaoai/wendao-content-workbench`(**本棒未访问、未核同步状态**) | `取证/api/wendao.README.md`(16:14) |
|
||||
|
||||
**⚠️ 一条易误读的读数**:`wen_commits.json` 里**全部是 `docs:` 提交**、`wen_languages.json` 为 `{}` —— 这不是"项目没做",而是**产品源码从不在这个仓**。⛔ 别把"GitHub 上 3 星、9 条文档提交"读成"项目不活跃":产品侧 13 天内发了 **11 个版本**(见 §六)。
|
||||
|
||||
---
|
||||
|
||||
## 三、产品定位
|
||||
|
||||
- **一句话(README 逐字)**:「免费的本地 AI 内容创作工作台」——「从选题、写作、改稿,到配图、排版、卡片制作和发布准备,一个桌面应用完成整套内容生产流程。数据默认保存在你的电脑上,AI 服务和模型由你自己选择。」
|
||||
- **收费口径(README 逐字加粗)**:「**不收会员费,不收订阅费,不按功能分级。**」并补一句「文到 AI 软件本身免费使用。调用 AI 时,模型或中转服务是否收费、如何计费,由你选择的服务商决定。」
|
||||
- **目标用户(README 逐字)**:「公众号创作者、内容运营人员和小型内容团队。」并自陈「它不是只有一个输入框的 AI 写作工具,而是一套真正能把内容做完的桌面工作台。」
|
||||
- **形态**:桌面应用(README 逐字「**基于 Wails 构建**,面向 Windows、macOS 和 Linux」);README 配图 `assets/desktop-home.png` 标注为「文到 AI 桌面端创作首页」。
|
||||
- **四个自我宣称的差异点(README 表格逐字)**:**免费使用**(无会员/订阅/功能分级)|**本地优先**(内容与运行数据默认存本机)|**一站式创作**(从灵感到发布准备无需来回切换工具)|**模型自由**(自行配置 AI 服务,不绑定单一厂商)。
|
||||
- **官网口径补充(逐字)**:官网首屏 slogan「把灵感变成内容,让创作一步到位。」;并给出**六段式链路**:`01 发现选题 → 02 开始创作 → 03 完成正文 → 04 生成图片 → 05 制作卡片 → 06 数据复盘`,页面自述「不是把零散的 AI 按钮拼在一起……放进同一条**能回看的内容链路**」。
|
||||
- **与另 4 个项目的定位差**:**只做公众号一条平台线**(README 全文与官网全文的发布对象只有微信公众号;topics 亦为 `wechat-editor` / `wechat-official-account`)⇒ 属**单平台纵深型**,与 Easel(7 平台全链路)、Postiz/PostSider(30+ 平台排期)、OpenCreator(本地 Runtime 媒体工厂)**不在同一段**。
|
||||
|
||||
来源:`取证/api/wendao.README.md`(16:14)· `取证/wendao/wen_site_home.html`(18:08,原始 HTML 33,834 B)· `取证/api/wendao.repo.json`(16:14)。
|
||||
|
||||
---
|
||||
|
||||
## 四、功能清单
|
||||
|
||||
### 4.1 README「核心能力」表(逐字,8 项)
|
||||
|
||||
| 创作环节 | 能力(README 逐字) |
|
||||
|---|---|
|
||||
| 灵感与选题 | 汇集自建选题、平台热点和创作灵感,一键进入创作 |
|
||||
| AI 写作与改稿 | 根据主题和素材生成初稿,通过对话持续修改、扩写和重构 |
|
||||
| 公众号编辑 | Markdown 写作、版本修订、智能排版和微信样式预览 |
|
||||
| 图片生成 | 管理提示词、生成任务和图片结果,快速准备文章配图 |
|
||||
| 卡片工坊 | 把文章内容整理为适合社交媒体传播的多页图文卡片 |
|
||||
| 营销创作 | 围绕产品、受众和营销目标组织专项内容 |
|
||||
| 本地内容库 | 统一管理文章、系列、知识、产品资料、图片和其他素材 |
|
||||
| 发布准备 | 管理发布计划、账号信息和内容交付状态 |
|
||||
|
||||
### 4.2 README 的端到端链路(`mermaid` 逐字)
|
||||
|
||||
`选题与热点 → 导入资料与素材 → AI 生成初稿 → 编辑与持续改写 → 智能排版 → 生成配图与卡片 → 微信样式预览 → 导出与发布准备 → 归档为内容资产`,末环**虚线回流**到「选题与热点」(README 标注「下次继续复用」)。
|
||||
|
||||
### 4.3 官网功能面(比 README 更细,逐字)
|
||||
|
||||
除 README 的 8 项外,官网**明确列出**以下 README 未提的模块(均带真实界面截图,官网自述「只展示可以核验的产品能力和真实软件界面」):
|
||||
|
||||
1. **热点雷达 + 营销日历 + 账号定位**同屏判断面板;
|
||||
2. **三种创作入口**:写文章/参考改写/**看图写作**(官网盘点写「3 类创作入口」);
|
||||
3. **系列规划**:为长期栏目保留统一上下文;
|
||||
4. **内容资产**:文章与历史版本集中管理;
|
||||
5. **能力库**:官方能力 + 我的能力 + 提示词,可**把多个步骤编排成"创作方案"**(官网自述「把一次好用,变成每次都能复用」);
|
||||
6. **图片工作台**:对话、参考图、素材库、提示词库、结果留在**同一条任务记录**里,结果可复制/保存提示词/下载/继续作参考图;
|
||||
7. **卡片工坊多形态**:官网逐字列出 **小红书图文、知识卡片、手写卡片、封面**;
|
||||
8. **发布数据复盘**:登记已发布内容 → 采集公众号数据 → 按月份复盘并记录行动(官网盘点「下一步选题不再只靠感觉」);
|
||||
9. **发布助手浏览器插件**:把当前文章的标题/正文/封面交给浏览器,**辅助填入**微信公众号编辑器;支持 Chrome / Edge / Safari / Firefox(插件事先声明「**插件不会自动登录、保存草稿或点击发布;最终内容请在公众号后台检查并手动确认**」);
|
||||
10. **本地优先细节(官网逐字)**:「文到AI以桌面应用运行,使用**本地 SQLite** 保存内容与工作记录。AI 服务由你配置,数据可以按自己的方式备份和迁移。」
|
||||
|
||||
### 4.4 版本迭代面暴露的功能(官方 changelog,v0.0.114–v0.0.123)
|
||||
|
||||
以下为**渲染页抽取**的 changelog 摘要(⚠️ 非原始转储,仅作旁证,来源见 §十一):
|
||||
|
||||
- **智能排版**:支持**并发产出公众号 CSS 主题候选**,首个有效方案立即展示,其余后台生成;**输出可直接复制到微信公众号的内联样式**(v0.0.120)。
|
||||
- **AI 服务配置**:改为**统一服务商目录**,按**文字 / 图片 / 音频**三类能力分别管理模型,支持搜索、全选、隐藏与默认模型设置;资源目录新增**阿里云百炼 Token Plan**(v0.0.120);官方体验文字模型调整为**阿里云百炼**(v0.0.121)。
|
||||
- **营销图片**:商品、模特、场景、版式模板**可按页组合**;生成前校验模型参考图能力与数量上限;每页生成独立画面标题/副文案/提示词(v0.0.119)。
|
||||
- **前端路线反复**:v0.0.121 **启动 React 19 + shadcn/ui 迁移**(TanStack Router、中文命令面板、六套主题),v0.0.122 **移除 React 迁移前端**、恢复 Vue 为唯一前端 —— 一次**迁到一半又回退**的真实记录。
|
||||
- **商用绿色版**:changelog 提到「商用**绿色版**」(v0.0.120 修复项)⇒ 免费口径下**疑似另有商用形态**(⛔ 未核实,见 §九)。
|
||||
|
||||
来源:`取证/api/wendao.README.md`(16:14)· `取证/wendao/wen_site_home.html`(18:08)· `取证/wendao/wen_gitcode_releases.rendered.md`(18:09)。
|
||||
|
||||
---
|
||||
|
||||
## 五、技术架构线索(**间接推断**,⛔ 非源码级)
|
||||
|
||||
⚠️ 本节每条都标注**证据类型**,⛔ 不得当作源码级结论引用。
|
||||
|
||||
| 判断 | 证据 | 证据类型 |
|
||||
|---|---|---|
|
||||
| 桌面壳 = **Wails** | ① 仓库 topics 直接含 `wails`;② README 逐字「基于 Wails 构建」 | 官方自述(元数据 + 文档) |
|
||||
| 前端 = **Vue** | changelog v0.0.122 逐字「移除 React 迁移前端及临时参考实现,**恢复 Vue 作为唯一的 Web 与桌面前端**」 | 官方 changelog(渲染抽取) |
|
||||
| 本地存储 = **SQLite** | 官网逐字「使用本地 SQLite 保存内容与工作记录」 | 官方自述 |
|
||||
| 源码目录形如 `src/` `server/` `web/` `data/` `outputs/` | 仓内 `.gitignore` 逐字排除这五个目录(注释写「Keep source and local data out.」) | **仓库文件**(可复核,非源码内容) |
|
||||
| 存在本地**后端进程**(`server/`) | 同上;另 changelog 逐字「将本地素材**路径直接交给桌面后端处理**」(v0.0.119) | 仓库文件 + changelog |
|
||||
| 前端曾短暂引入 **React 19 / shadcn-ui / TanStack Router** | changelog v0.0.121 | 官方 changelog(渲染抽取) |
|
||||
| 默认体验模型 = **阿里云百炼** | changelog v0.0.120 / v0.0.121 | 官方 changelog(渲染抽取) |
|
||||
| 图片侧兼容**自定义 OpenAI 兼容服务**(`gpt-image-2`) | changelog v0.0.123 | 官方 changelog(渲染抽取) |
|
||||
|
||||
**可确证的一条**:`server/` 与 `src/` 的存在**有仓库文件支撑**(`.gitignore`),而**具体语言、框架版本、依赖清单** ⇒ **查不到**(无 `package.json` / `go.mod` / Wails 版本号;`languages` API 返回空对象)。
|
||||
|
||||
来源:`取证/wendao/wen_gitignore.txt`(18:07)· `取证/api/wendao.repo.json`(16:14)· `取证/wendao/wen_gitcode_releases.rendered.md`(18:09)· `取证/wendao/wen_site_home.html`(18:08)。
|
||||
|
||||
---
|
||||
|
||||
## 六、发布与分发机制(本棒最"可直接搬"的一块)
|
||||
|
||||
这是全篇**证据最硬**的部分 —— 更新供给了**机器可复核的 JSON**,不是文档自述。
|
||||
|
||||
### 6.1 三层发布面
|
||||
|
||||
1. **GitHub 仓**:只发布**文档**(README / NOTICE / RELEASE_NOTES / 截图);`releases` 仅 1 条 `v0.0.113`(2026-09-17 01:40:51Z),**`assets: []`(不挂安装包)**;`has_downloads: false`。
|
||||
2. **官网**:`www.asfop.top` 首屏「选择版本 → 自动识别当前系统 → 下载所选版本」;页面脚本文逐:`updateFeedURL = 'https://api.gitcode.com/api/v5/repos/wendao-ai/wendao-ai-updates/raw/updates/stable.json'`(**官网的版本与下载链接由该 JSON 驱动**)。
|
||||
3. **官方更新分发仓**:`gitcode.com/wendao-ai/wendao-ai-updates`(GitCode/AtomGit 托管,页签标注「非代码」),根目录**只有** `README.md`(正文仅一行 `# wendao-ai-updates`)+ `updates/stable.json` + `updates/versions/*.json` —— **零业务代码**。
|
||||
|
||||
### 6.2 `updates/stable.json`(逐字段,API 原始)
|
||||
|
||||
`schemaVersion: 2`|`product: "wendao-ai"`|`channel: "stable"`|**`version: "0.0.123"`**|`publishedAt: 2026-09-23T12:04:37Z`
|
||||
`policy`:`minimumSupportedVersion: ""`|**`allowSkip: true`**|**`remindAfterHours: 24`**|`reason: ""`
|
||||
`supportedPlatforms`(**四平台矩阵**):`macos/amd64`、`macos/arm64`、`windows/amd64`、`windows/arm64`
|
||||
|
||||
| 平台键 | 文件名 | 字节 | sha256(前 16 位) |
|
||||
|---|---|---|---|
|
||||
| `macos/arm64` | `ContentWorkbench-v0.0.123-mac-arm64.zip` | 21,185,733 | `c5eccc0cc24322a0…` |
|
||||
| `windows/amd64` | `ContentWorkbench-v0.0.123-win-x64.zip` | 21,940,135 | `c429c5cd7219c4dc…` |
|
||||
| `macos/amd64` | `ContentWorkbench-v0.0.123-mac-x64.zip` | 22,595,165 | `669cff8734fa880a…` |
|
||||
| `windows/arm64` | `ContentWorkbench-v0.0.123-win-arm64.zip` | 20,554,398 | `f576792a05ae1579…` |
|
||||
|
||||
`browserExtensions`:`version: "0.1.0"`|`minimumChromiumVersion: "116"`|`chrome` / `edge` 两包(各 124,890 B,**sha256 相同** ⇒ 同一份包换名)。
|
||||
|
||||
### 6.3 值得记的四个工程做法
|
||||
|
||||
1. **更新源与代码仓分离**(文档在 GitHub、二进制在 GitCode)⇒ 二进制流量不占代码仓,且**更新清单是独立可缓存的静态 JSON**。
|
||||
2. **清单自带完整性与升级策略**:逐包 `sha256`(可校验)、`minimumSupportedVersion`(可强制最低版本)、`allowSkip`(能否跳版)、`remindAfterHours`(提醒节奏)—— **不是"最新版就弹窗"的粗放做法**。
|
||||
3. **官网只做"读清单 + 选包"**:`script.js` 用 UA + `userAgentData.getHighEntropyValues(['architecture'])` 识别 `platform/arch`,并用 `fallbackArch` 兜底(Windows→amd64、macOS→arm64)——**浏览器隐藏架构时仍可用**。
|
||||
4. **发布节奏可量化**:`updates/versions/` 下 16 份版本清单(**0.0.100–0.0.115**);changelog 渲染页显示 **13 天内发了 v0.0.114–v0.0.123 共 10 个版本**(v0.0.121/0.0.122 同日)。
|
||||
|
||||
⚠️ **一处对不上**:`updates/versions/` 只到 **0.0.115**(16 份),而 `stable.json` 与 releases 页已到 **0.0.123** ⇒ 两者**不同步**,原因**查不到**(见 §九)。
|
||||
|
||||
来源:`取证/wendao/wen_gitcode_stable.json`(18:09,`api.gitcode.com`)· `wen_gitcode_tree.json`(18:09)· `wen_version_0.0.115.json`(18:09)· `wen_site_script.js`(18:08)· `取证/wendao/wen_releases.json`(18:07)· `wen_gitcode_releases.rendered.md`(18:09)。
|
||||
|
||||
---
|
||||
|
||||
## 七、可借鉴点(对 `content-workbench`,按可搬性排序)
|
||||
|
||||
1. **【工程做法 · 可直接搬】独立更新清单 + 平台矩阵 + sha256 + 升级策略**(§6.2)。我方若做桌面/本地分发,这套 `stable.json` 结构(`channel` / `publishedAt` / `supportedPlatforms` / 逐包 `sha256` / `policy.{minimumSupportedVersion, allowSkip, remindAfterHours}`)比自造一套"检查更新"接口更省事,且天然支持灰度与强制升级。
|
||||
2. **【产品设计 · 高价值】"能力库"=把稳定步骤沉淀为可复用方案**(官网逐字:官方能力 + 我的能力 + 提示词,**把多个步骤编排成完整交付**)。这与 OpenCreator 的"技能市场"是同一诉求的两条路:**一个可编排、一个可安装**,都指向"不让用户每次从零提示"。
|
||||
3. **【产品设计 · 高价值】一稿多形态的"卡片工坊"**:长文 → 小红书图文 / 知识卡片 / 手写卡片 / 封面。**把"内容资产"从"一篇文章"扩展成"一组分发素材"**,是单平台纵深产品提高复用的关键动作。
|
||||
4. **【交互设计 · 可搬】修订不覆盖 + 版本可比对可采用**:官网逐字「版本可以对比、采用和继续修改」,README 写「保留内容版本」—— 与 OpenCreator 的"每次改稿新建版本"同一条原则(**两次独立观测到同一做法,说明它是这类产品的收敛点**)。
|
||||
5. **【合规姿态 · 可搬】发布助手只"填充"不"代发"**:浏览器插件把标题/正文/封面交给公众号编辑器,且明示「**不会自动登录、保存草稿或点击发布**」。这与 Easel 的"自动发布 + 风险提示"、Postiz 的"官方 OAuth 不自动化"构成**三种姿态**,本项是最保守的一种 ⇒ **风险最低、最容易通过平台与用户信任**。
|
||||
6. **【机制设计 · 可搬】内容闭环回到选题**:README 的 mermaid 把「归档为内容资产」虚线回流到「选题与热点」;官网把「采集公众号数据 → 月度复盘 → 记录行动」做成链路第 6 段。**"发布不是结束"**这一条对内容工作台类产品是低成本高价值的补全。
|
||||
7. **【商业/传播 · 可借鉴】免费口径 + "不虚构"承诺 + 首屏自动选包**:官网逐字「官网只展示可以核验的产品能力和真实软件界面,**不虚构流量、收益或发布效果**」;首屏用四版本选择器降低下载门槛。⇒ 对**闭源商业产品**而言,"把能力说清、把边界划清"本身就是差异化。
|
||||
8. **【反面参照 · 值得记】README 与发行状态脱钩**(§一第 6 条):文档仓停在 v0.0.113 的"尚未发布",实际已发到 0.0.123。⇒ **对外文档必须有"最后校准时间",否则会长期骗人**;我方若做类似分离式发布,须在 README 顶部挂可机器刷新的版本徽章或直读更新清单。
|
||||
|
||||
---
|
||||
|
||||
## 八、风险与合规
|
||||
|
||||
1. **许可风险(最高)**:仓内**无 LICENSE**,`NOTICE.md` 声明「proprietary and is not distributed through this repository. **No license is granted to copy, modify, redistribute, reverse engineer, or create derivative works** from the product, its documentation, screenshots, or brand assets」,并称「本仓库中的文字、图片和品牌素材**保留全部权利**」。⇒ **其 README 文案、官网文案、界面截图、吉祥物/品牌素材均不可复制进我方产物**;本分析只做**事实性引用**,未转载其素材文件。
|
||||
2. **"免费"口径需加限定**:README/官网均称免费(无会员/订阅/功能分级),但官方 changelog 出现「**商用绿色版**」字样(v0.0.120 修复项)⇒ **可能同时存在商用授权形态**,免费边界**未核实**(见 §九)。⇒ 引用时必须写明"截至 2026-10-07 官网口径为免费",⛔ 不写成"该产品完全免费"。
|
||||
3. **数据边界(官网 \+ 隐私政策自述)**:本地优先,项目/草稿/素材/任务记录/生成结果默认存本地;**仅当用户主动调用 AI 或外部服务时**相关内容才发给所选服务商。隐私政策「最后更新:2026 年 8 月 25 日」,并自陈「本页面用于说明产品数据处理方式,**不构成完整法律意见**」。⇒ 属**自述**,⛔ 未经技术验证(无源码、无流量观测)。
|
||||
4. **闭源 + 静默更新**:产品通过 `stable.json` 自更新,且 `allowSkip: true`。⇒ 用户端**版本可被远端清单引导**;我方若参考其机制,须考虑**更新清单的可信与可审计**(它的做法是双列 `sha256`,这一点是正面的)。
|
||||
5. **模型费用与内容合规风险**由用户承担:官网 FAQ 逐字「调用第三方 AI 模型可能需要你自行准备 API Key」「生成内容可以商用吗?……软件不主张占有你的创作成果,但 **AI 生成内容仍需要人工审核**」。
|
||||
|
||||
来源:`取证/wendao/wen_NOTICE.md`(18:07)· `取证/wendao/wen_site_privacy.html`(18:08)· `取证/wendao/wen_gitcode_releases.rendered.md`(18:09)· `取证/api/wendao.README.md`(16:14)。
|
||||
|
||||
---
|
||||
|
||||
## 九、查不到 / 待核实(⛔ 不猜)
|
||||
|
||||
1. **源码级面 —— 全部查不到**:技术栈具体版本(Wails / Go / Vue / Node)、依赖清单、模块划分、数据表结构、AI 调用实现、公众号数据采集方式(插件抓取?官方接口?人工导入?)⇒ **无源码、无构建清单、`languages` API 返回空对象**,不可得。
|
||||
2. **用户量 / 下载量 / 营收**:GitHub 侧仅 3 star、0 fork;GitCode 更新仓页显示「项目总下载次数 **787**」(口径为该仓的 Clone / Pull / zip / Release 下载,**不是产品安装量**)。⇒ **产品级用户量、活跃度、营收 ⇒ 查不到**。
|
||||
3. **"商用绿色版"是什么**:官方 changelog 出现该词,但官网/README **均无对应售卖页或授权说明** ⇒ **查不到**(属功能语义分叉,见待拍板项)。
|
||||
4. **版本清单与发行不同步的原因**:`updates/versions/` 仅到 **0.0.115**,`stable.json` 已 **0.0.123**;是"只对部分版本留档"还是"目录已停更"⇒ **查不到**。
|
||||
5. **Gitee 镜像状态未核**:README 给出 `gitee.com/wendaoai/wendao-content-workbench`,**本棒未访问**,无法判断是否同步、是否含额外内容。
|
||||
6. **更新清单的其它信道未核**:只读到 `channel: "stable"`;是否存在 `beta` / `insider` 等清单文件 ⇒ `updates/` 目录下**只有 `stable.json` + `versions/`**,未再探测其它文件名 ⇒ **未确认**。
|
||||
7. **真实运行证据为零**:本棒**未下载安装包、未安装、未运行**(⛔ 调研棒不做安装与付费生成);⇒ 「六段链路可用」「智能排版能出公众号内联样式」「卡片工坊可用」等,**均无实测支撑**,仅为其官方陈述与 changelog。
|
||||
8. **第三方素材与合规面未核**:官网 FAQ 称"AI 生成内容需人工审核"、隐私政策自陈"不构成完整法律意见" ⇒ **其合规性未经第三方核验**(本棒只做转述)。
|
||||
|
||||
**缺口收口(对照目标口径)**:本份按「开源可得面」产出(README 全文 + 仓库元数据 + 文件清单 + 官方公开页与官方更新清单)。**如需源码级分析 ⇒ 需用户提供闭源访问,或变更目标口径(本棒未做决定,待用户裁定)。**
|
||||
|
||||
---
|
||||
|
||||
## 十、下一棒建议(本棒交付后)
|
||||
|
||||
1. **本棒已完成**:目标执行状态「七、下一棒该做什么」**第 1 项(文到 AI)**—— 按「开源可得面」产出,并在 `tmp/supervise-inbox/NEED-USER.md` 提报**覆盖边界待裁定**(属功能语义分叉,⛔ 本棒不替用户改目标)。
|
||||
2. **验收判据现状更新**:五份单项目文档**已满 5 份**(5 项目总览 + Postiz/PostSider 合并 + Easel + OpenCreator + **文到 AI**);**余 1 项:跨项目汇总对比文档**(验收判据第 3 条)。
|
||||
3. **下一棒(收口)**:**跨项目汇总对比文档** —— 按 1b 形态统一口径(产品定位 / 功能清单 / 可借鉴点 / 来源与取证时间),并**必须显式标注文到 AI 那一列是"文档级"证据**(⛔ 不得与另 4 个源码级项目同权呈现)。
|
||||
4. **可选补强(非必须,需先问用户)**:
|
||||
- 下载官方**发布助手插件包**(124,890 B,Chrome 版)做一次**源码级**核对 —— 浏览器扩展是明文 JS/HTML,是**唯一可能拿到"技术栈实证"的公开件**;⚠️ 属**扩大取证面**(超出本棒声明的"README + 元数据 + 文件清单"边界)⇒ **须用户点头**。
|
||||
- 核 Gitee 镜像与 `updates/` 其它信道(低成本)。
|
||||
|
||||
---
|
||||
|
||||
## 十一、来源链接 + 取证时间
|
||||
|
||||
**对象仓库**:`https://github.com/wendaoai/wendao-content-workbench`(默认分支 `main`,根树 sha `5505657bdd9d28169e72fee7cd2ed9de925e024f`)
|
||||
**官方主页**:`https://www.asfop.top/` | **官方更新源**:`https://api.gitcode.com/api/v5/repos/wendao-ai/wendao-ai-updates/raw/updates/stable.json`
|
||||
**Gitee 镜像(未访问)**:`https://gitee.com/wendaoai/wendao-content-workbench`
|
||||
|
||||
| 编号 | 来源 | 链接 | 取证时间 | 落点 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 仓库元数据 API | `https://api.github.com/repos/wendaoai/wendao-content-workbench` | 2026-10-07 16:14 | `取证/api/wendao.repo.json` |
|
||||
| 2 | 根 README 全文(5,059 B) | `.../contents/README.md` | 16:14(第 1 棒)/18:07(本棒复核) | `取证/api/wendao.README.md` · `取证/wendao/wen_README.md` |
|
||||
| 3 | 文件树(5 blob,`truncated=false`) | `.../git/trees/main?recursive=1` | 16:14 | `取证/api/wendao.tree.json` |
|
||||
| 4 | `NOTICE.md`(闭源声明) | `.../contents/NOTICE.md` | 18:07 | `取证/wendao/wen_NOTICE.md` |
|
||||
| 5 | `RELEASE_NOTES_0.0.113.md` | `.../contents/RELEASE_NOTES_0.0.113.md` | 18:07 | `取证/wendao/wen_RELEASE_NOTES_0.0.113.md` |
|
||||
| 6 | `.gitignore`(目录线索) | `.../contents/.gitignore` | 18:07 | `取证/wendao/wen_gitignore.txt` |
|
||||
| 7 | releases / tags / languages / contributors / branches / commits / forks | 各 `api.github.com/repos/wendaoai/wendao-content-workbench/*` | 18:07 | `取证/wendao/wen_{releases,tags,languages,contributors,branches,commits,forks}.json` |
|
||||
| 8 | 组织 `wendaoai` 主页与公开仓库 | `api.github.com/users/wendaoai[/repos]` | 18:07 | `取证/wendao/wen_org.json` · `wen_org_repos.json` |
|
||||
| 9 | 官网首页(原始 HTML 33,834 B) | `https://www.asfop.top/` | 18:08 | `取证/wendao/wen_site_home.html` |
|
||||
| 10 | 隐私政策(原始 HTML 6,151 B) | `https://www.asfop.top/privacy.html` | 18:08 | `取证/wendao/wen_site_privacy.html` |
|
||||
| 11 | sitemap(4 条 URL) | `https://www.asfop.top/sitemap.xml` | 18:08 | `取证/wendao/wen_site_sitemap.xml` |
|
||||
| 12 | 官网脚本(含更新源地址) | `https://www.asfop.top/assets/script.js?v=20260917-2` | 18:08 | `取证/wendao/wen_site_script.js` |
|
||||
| 13 | **稳定版清单**(v0.0.123 + 四平台 + sha256) | `api.gitcode.com/.../raw/updates/stable.json` | 18:09 | `取证/wendao/wen_gitcode_stable.json` |
|
||||
| 14 | 单版本清单样本(0.0.115) | `api.gitcode.com/.../raw/updates/versions/0.0.115.json` | 18:09 | `取证/wendao/wen_version_0.0.115.json` |
|
||||
| 15 | 更新仓文件树(20 条) | `api.gitcode.com/.../git/trees/main?recursive=1` | 18:09 | `取证/wendao/wen_gitcode_tree.json` |
|
||||
| 16 | 更新仓 releases 页(v0.0.113–0.0.123 changelog + 资产) | `https://gitcode.com/wendao-ai/wendao-ai-updates/releases` | 18:09 | `取证/wendao/wen_gitcode_releases.rendered.md`(⚠️ 渲染抽取) |
|
||||
| 17 | 更新仓 releases 原始 HTML(⚠️ 仅 5,793 B,SPA 空壳,无正文) | 同上 | 18:09 | `取证/wendao/wen_gitcode_releases.html` |
|
||||
| 18 | 本棒取证脚本(14/14 成功,逐件 HTTP 与字节数) | — | 18:07 | `取证/_fetch_wendao.py` · `取证/wendao/_fetch_log.json` |
|
||||
| 19 | 本棒证据清单与可靠性分级 | — | 18:10 | `取证/wendao/_取证说明.md` |
|
||||
|
||||
⚠️ **通道口径**:`raw.githubusercontent.com` 本棒**未使用**(第 3 棒实测不稳)⇒ 仓内正文一律走 **`contents` API**(返回 base64),4/4 成功;`gitcode.com` 网页为 SPA(原始 HTML 空壳),其内容分两类来源 —— **`api.gitcode.com` 的 JSON 机器可复核**,**releases 页 changelog 为渲染抽取**(已在 §4.4 / §6 逐处标注)。
|
||||
|
||||
---
|
||||
|
||||
*本文件为第五棒产物。原始证据见 `取证/api/`(第 1 棒,只读复用)与 `取证/wendao/`(本棒 20 件);取证脚本 `取证/_fetch_wendao.py`;台账见 `tmp/supervise-inbox/tasks.json`。*
|
||||
Reference in new issue
Block a user