Unified Agent + reusable Go agent core.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

add docs

Lyric 8fe41179 172b7525

+303
+303
docs/feat/feat_20260421_open_source_notices.md
··· 1 + --- 2 + date: 2026-04-21 3 + title: Open Source Notices in CLI and Console 4 + status: in_progress 5 + --- 6 + 7 + # Open Source Notices in CLI and Console 8 + 9 + ## 1) 目标 10 + 11 + 这次需求只做一件简单的事: 12 + 13 + - 把当前产品里实际用到的一组主要开源项目,整理成一份可读、可查、可复用的清单 14 + 15 + 这份清单要同时服务两处入口: 16 + 17 + - 新增一个 CLI 命令,展示项目名、链接、协议名、以及一句话用途 18 + - 在 Console 的 Settings 下新增一个子页面,用合适的页面结构展示同一份内容 19 + 20 + 这里的重点不是“自动扫描一切依赖”,而是先把对用户和开发者最有信息量的一批项目说明白。 21 + 22 + ## 2) 非目标 23 + 24 + 这版不做下面这些事: 25 + 26 + - 不做全量 SBOM 27 + - 不做所有传递依赖的枚举 28 + - 不在 CLI 或 Web 里展示完整 LICENSE 正文 29 + - 不做运行时动态扫描 `go.mod`、`pnpm-lock.yaml` 或 `node_modules` 30 + - 不把文档站、构建链、部署链工具都塞进首版清单 31 + - 不在这期里解释各协议的法律义务;这里只展示事实信息 32 + - 不做多语言开源项目描述;首版只保留一套固定展示文案 33 + 34 + ## 3) 首版纳入范围 35 + 36 + ### 3.1 纳入原则 37 + 38 + 首版只纳入三类项目: 39 + 40 + - `go.mod` 里直接依赖,且确实参与 CLI、runtime、channel、desktop 等主路径 41 + - `web/console` 直接依赖 42 + - `web/markdown-renderer` 直接依赖,且产物会被复制进 Console 使用 43 + 44 + 首版明确不纳入: 45 + 46 + - `vite`、`vitepress`、`wrangler`、`esbuild` 这类构建、文档、发布工具 47 + - 只在测试里出现、但不进入产品能力面的库 48 + - 价值很低的通用小依赖 49 + 50 + ### 3.2 当前 Go / Desktop 清单 51 + 52 + | 项目 | 链接 | 协议 | 当前用途 | 53 + | --- | --- | --- | --- | 54 + | Cobra | https://github.com/spf13/cobra | Apache-2.0 | 构建 CLI 命令树、参数解析和帮助输出。 | 55 + | Viper | https://github.com/spf13/viper | MIT | 读取配置文件、环境变量和运行时设置。 | 56 + | Gorilla WebSocket | https://github.com/gorilla/websocket | BSD-2-Clause | 处理 Slack 等通道里的 WebSocket 连接。 | 57 + | Google UUID | https://github.com/google/uuid | BSD-3-Clause | 生成 task、session、message 等稳定 ID。 | 58 + | MCP Go SDK | https://github.com/modelcontextprotocol/go-sdk | Apache-2.0 | 提供 MCP host 接入和 tool adapter 能力。 | 59 + | UniAI | https://github.com/quailyquaily/uniai | Apache-2.0 | 统一对接多个 LLM 提供方,并承接请求与计费模型。 | 60 + | Goldmark | https://github.com/yuin/goldmark | MIT | 把 Telegram 等场景里的 Markdown 转成受控 HTML。 | 61 + | Wails | https://github.com/wailsapp/wails | MIT | 支撑可选的桌面壳和桌面端应用入口。 | 62 + 63 + ### 3.3 当前 Console 前端清单 64 + 65 + #### `web/console` 66 + 67 + | 项目 | 链接 | 协议 | 当前用途 | 68 + | --- | --- | --- | --- | 69 + | Vue | https://github.com/vuejs/core/tree/main/packages/vue | MIT | 搭建 Console SPA 的组件、状态和渲染模型。 | 70 + | Vue Router | https://github.com/vuejs/router | MIT | 负责 Console 页面路由和 Settings 子页面切换。 | 71 + | Quail UI | https://quailyquaily.github.io/quail-ui/ | AGPL-3.0 | 提供 Console 当前使用的组件、样式和图标体系。 | 72 + | OverType | https://github.com/panphora/overtype | MIT | 提供 Markdown 编辑器能力。 | 73 + 74 + #### `web/markdown-renderer` 75 + 76 + | 项目 | 链接 | 协议 | 当前用途 | 77 + | --- | --- | --- | --- | 78 + | unified | https://github.com/unifiedjs/unified | MIT | 组织整个 Markdown 到 HTML 的处理流水线。 | 79 + | remark-parse | https://github.com/remarkjs/remark/tree/main/packages/remark-parse | MIT | 解析 Markdown 源文本。 | 80 + | remark-gfm | https://github.com/remarkjs/remark-gfm | MIT | 支持 GFM 表格、任务列表等扩展语法。 | 81 + | remark-math | https://github.com/remarkjs/remark-math/tree/main/packages/remark-math | MIT | 解析数学公式块和行内公式。 | 82 + | remark-rehype | https://github.com/remarkjs/remark-rehype | MIT | 把 remark AST 转成 rehype AST。 | 83 + | rehype-raw | https://github.com/rehypejs/rehype-raw | MIT | 把 Markdown 里的原始 HTML 纳入统一处理链。 | 84 + | rehype-stringify | https://github.com/rehypejs/rehype/tree/main/packages/rehype-stringify | MIT | 把处理后的 rehype AST 输出成 HTML。 | 85 + | rehype-katex | https://github.com/remarkjs/remark-math/tree/main/packages/rehype-katex | MIT | 把数学公式节点转成 KaTeX HTML。 | 86 + | DOMPurify | https://github.com/cure53/DOMPurify | MPL-2.0 OR Apache-2.0 | 对最终 HTML 做净化,降低注入风险。 | 87 + | Mermaid | https://github.com/mermaid-js/mermaid | MIT | 渲染 Mermaid 图表块。 | 88 + | KaTeX | https://github.com/KaTeX/KaTeX | MIT | 渲染数学公式。 | 89 + | Shiki | https://github.com/shikijs/shiki | MIT | 提供代码高亮。 | 90 + | Shiki Stream | https://github.com/antfu/shiki-stream | MIT | 处理流式代码高亮分词。 | 91 + | Viz.js | https://github.com/mdaines/viz-js | MIT | 渲染 Graphviz / DOT 图。 | 92 + | AntV Infographic | https://github.com/antvis/Infographic | MIT | 渲染 infographic 自定义块。 | 93 + 94 + ### 3.4 说明事项 95 + 96 + 有三点需要在文档里提前说清楚: 97 + 98 + - `modelcontextprotocol/go-sdk` 的 LICENSE 里写了项目正从 MIT 迁移到 Apache-2.0;首版展示值按当前 LICENSE 事实写 `Apache-2.0`,不额外展开法律解释 99 + - `DOMPurify` 是双协议,首版按包元数据原样展示 `MPL-2.0 OR Apache-2.0` 100 + - `quail-ui` 的本地包元数据没有公开仓库字段;首版链接先使用 README 里的项目主页 101 + 102 + ## 4) 单一数据源 103 + 104 + 这类信息不能在 CLI、Console API、Console 页面里各写一份。 105 + 106 + 首版应该只有一份结构化清单,建议放在: 107 + 108 + - `assets/open_source/projects.json` 109 + 110 + 数据模型保持最小: 111 + 112 + ```json 113 + [ 114 + { 115 + "id": "cobra", 116 + "surface": "go", 117 + "name": "Cobra", 118 + "link": "https://github.com/spf13/cobra", 119 + "license": "Apache-2.0", 120 + "usage": "Builds the CLI command tree and help output." 121 + } 122 + ] 123 + ``` 124 + 125 + 字段只保留当前展示真正需要的内容: 126 + 127 + - `id`:稳定主键,用于测试和前端渲染 key 128 + - `surface`:分组字段,首版可取 `go`、`desktop`、`console`、`console_markdown` 129 + - `name` 130 + - `link` 131 + - `license` 132 + - `usage` 133 + 134 + 这里不要再包一层没有价值的 wrapper,也不要再做一份前端专用 JSON。 135 + 136 + 实现上只需要做到: 137 + 138 + - Go 端从这份 JSON 读取成 `[]OpenSourceProject` 139 + - CLI 命令直接用它 140 + - Console 后端接口直接用它 141 + - Console 页面通过接口读出来展示 142 + 143 + 数组顺序就是最终展示顺序,不再额外引入排序规则。 144 + 145 + ## 5) CLI 命令 146 + 147 + ### 5.1 命令名 148 + 149 + 建议新增: 150 + 151 + - `mistermorph licenses` 152 + 153 + 原因很直接: 154 + 155 + - 这是一个静态信息命令 156 + - 用户心智简单,和展示内容一致 157 + - 不依赖当前 runtime、endpoint、API key 或 topic 状态 158 + 159 + ### 5.2 输出要求 160 + 161 + 输出内容必须至少包含四列: 162 + 163 + - 项目名 164 + - 协议名 165 + - 链接 166 + - 一句话用途 167 + 168 + 展示要求如下: 169 + 170 + - 按 `surface` 分组输出,不要把 Go、Desktop、Console 全混在一起 171 + - 分组内按清单文件顺序输出 172 + - 宽度不够时允许换行,不做截断省略 173 + - 命令在未配置任何 provider 时也能正常运行 174 + 175 + 示意: 176 + 177 + ```text 178 + Go / Runtime 179 + NAME LICENSE LINK USED FOR 180 + Cobra Apache-2.0 https://github.com/spf13/cobra Builds the CLI command tree and help output. 181 + Viper MIT https://github.com/spf13/viper Loads config files and environment overrides. 182 + ... 183 + ``` 184 + 185 + 如果现有 `NameDetailTable` 不适合四列展示,就直接为这个命令写最小可读的表格输出,不要硬套两列表头。 186 + 187 + ## 6) Console Settings 子页面 188 + 189 + ### 6.1 路由形态 190 + 191 + 这块不应该继续塞回现在的大型 `SettingsView` 里当一个 section。 192 + 193 + 建议新增一个明确的子路由: 194 + 195 + - `/settings/open-source` 196 + 197 + 这样做有两个好处: 198 + 199 + - URL 语义清楚,能直接分享和刷新 200 + - 后续如果 Settings 再拆页,不会继续把一个大文件堆得更重 201 + 202 + ### 6.2 页面位置 203 + 204 + 页面挂在 Settings 之下,但不是顶层导航的新入口。 205 + 206 + 首版可以这样处理: 207 + 208 + - Settings 主页面保留现状 209 + - 在 Settings 内部增加一个二级入口,进入 `Open Source` 子页 210 + 211 + ### 6.3 页面内容 212 + 213 + 页面展示和 CLI 保持同一份内容,但表达方式更适合 Web: 214 + 215 + - 按 `surface` 分组 216 + - 每个项目一行,至少展示名字、协议、链接、用途 217 + - 链接可直接打开上游项目页 218 + - 页面顶部明确说明“这是首版纳入的主要开源项目,不是全量依赖清单” 219 + 220 + 首版不需要: 221 + 222 + - 搜索 223 + - 排序 224 + - 筛选 225 + - 下载 CSV 226 + - 展示完整 LICENSE 正文 227 + 228 + ### 6.4 现有路由约束 229 + 230 + 当前 router 只把 `/settings` 本身当作 setup-free 路径。 231 + 232 + 如果新增 `/settings/open-source`,实现时要一起更新这条规则,否则在 setup 未完成时,子页行为会和主设置页不一致。 233 + 234 + ## 7) Console API 235 + 236 + 这份数据是 Console 自己的静态产品信息,不属于 runtime proxy 的动态数据面。 237 + 238 + 所以首版直接在 Console backend 增一个只读接口即可: 239 + 240 + - `GET /api/settings/open-source` 241 + 242 + 返回体保持最小: 243 + 244 + ```json 245 + { 246 + "items": [ 247 + { 248 + "id": "cobra", 249 + "surface": "go", 250 + "name": "Cobra", 251 + "link": "https://github.com/spf13/cobra", 252 + "license": "Apache-2.0", 253 + "usage": "Builds the CLI command tree and help output." 254 + } 255 + ] 256 + } 257 + ``` 258 + 259 + 这里只读,不做增删改。 260 + 261 + 这样有两个直接收益: 262 + 263 + - Console 页面不需要自己维护第二份静态数据 264 + - CLI 和 Web 的事实来源保持一致 265 + 266 + ## 8) 建议落点 267 + 268 + 首版实现落点建议如下: 269 + 270 + - `assets/open_source/projects.json`:唯一数据源 271 + - `cmd/mistermorph/licenses.go`:CLI 命令 272 + - `cmd/mistermorph/consolecmd/open_source.go`:Console backend 只读接口 273 + - `web/console/src/views/SettingsOpenSourceView.js`:Settings 子页 274 + - `web/console/src/router/index.js`:新增 `/settings/open-source` 路由,并修正 setup-free 规则 275 + 276 + 这里不建议: 277 + 278 + - 把清单复制到 `web/console/src` 再读一遍 279 + - 让前端直接读仓库文件 280 + - 为这点静态数据引入新的存储或后台任务 281 + 282 + ## 9) 验收标准 283 + 284 + 首版完成后,至少满足下面这些条件: 285 + 286 + - `mistermorph licenses` 可直接输出首版清单 287 + - CLI 输出里每条记录都有项目名、链接、协议名、用途说明 288 + - Console 可从 Settings 进入 `Open Source` 子页 289 + - `/settings/open-source` 可直接访问和刷新 290 + - Console 页面展示的记录集合、顺序、字段值与 CLI 一致 291 + - Console 页面数据来自 `GET /api/settings/open-source` 292 + - 新增或修改项目时,只需要改一份 `assets/open_source/projects.json` 293 + 294 + ## 10) Checklist 295 + 296 + - [x] 扫描当前 Go 主要直接依赖 297 + - [x] 扫描当前 Console 直接依赖 298 + - [x] 扫描当前 shipped markdown renderer 依赖 299 + - [x] 记录每个纳入项目的链接、协议、用途 300 + - [x] 明确首版不做全量 SBOM 301 + - [x] 明确 CLI 和 Console 共享同一份数据源 302 + - [x] 明确 Console 走 Settings 子页面,不新开顶层导航 303 + - [x] 明确 Console backend 只增加一个只读接口