visual-explain 是个发"解释稿"的小工具。聊到一半,你说"画一张讲清楚 X",我把 X 写成一个 HTML 页面,发上去就有公网链接。一个 topic 是一个东西(比如 tools-backend),一个 scope 是这件事的一面(比如 请求路径 / Auth)。每个 scope 一个 HTML。同名再发就盖掉,新角度就开新 tab。没有 v1/v2/v3。
三块东西:你这边的发布脚本 (bash cli)、跑在 Cloudflare 上的 worker、放文件的 R2 桶。Worker 是中间那个唯一动 R2 的人 — 客户端不直接碰 R2。
理解 visual-explain 只需要这两个词。所有页面排布、所有 URL、所有 R2 路径都是它俩的组合。
topic = 你在讲的东西
scope = 这件事的一面
# R2 里长这样 adhoc/visual-explain/ ├── _topics.json # 全局 topic 列表,dashboard 拿这个渲 ├── tools-backend-arch/ │ ├── manifest.json # 这个 topic 下的 scope 列表 │ ├── request-path.html # scope 1 │ └── auth-flow.html # scope 2 └── visual-explain/ ├── manifest.json └── model-overview.html # 就是你正在看的这个
本地写一个 HTML 文件,跑 publish cli 把它推给 worker。worker 三件事:写 R2、更新两份 manifest、回 URL。
# 1. 写 HTML 到 /tmp $ vim /tmp/visual-explain-tools-backend-request-path.html # 2. 跑 publish $ ~/.smux/skills/visual-explain/bin/visual-explain-publish \ tools-backend-arch request-path \ /tmp/visual-explain-tools-backend-request-path.html \ "请求路径" "Tools Backend" "kami-paper" scope 覆盖 (topic 现有 2 scope) dashboard : https://visual-explain.fpai.io/ topic : https://visual-explain.fpai.io/tools-backend-arch/ scope : https://visual-explain.fpai.io/tools-backend-arch/request-path.html
参数 6 个,前 3 个必填:
| 位置 | 必填 | 作用 |
|---|---|---|
| 1 · topic | 是 | 这次发的属于哪个 topic(kebab-case) |
| 2 · scope | 是 | scope slug(kebab-case) |
| 3 · html 文件路径 | 是 | 本地 HTML 文件,会原样上 R2 |
| 4 · scope_title | 否 | tab 上显示的中文("请求路径") |
| 5 · topic_title | 否 | dashboard 卡片上显示的中文(只第一次发用) |
| 6 · vibe | 否 | 一个标签 ("kami-paper" / "linear-modern" 这种) |
worker 看到 POST /publish 时,根据 topic/scope 是否已存在,分三条路。
| 情况 | worker 做什么 | 响应里告诉你 |
|---|---|---|
| topic 不存在 | 开新 topic + 第一个 scope + 写 manifest + 加进 _topics.json | was_new_topic: true |
| topic 在 / scope 不在 | 追加 scope + 更新 manifest + 更新 _topics.json 里 scope_count | was_new_scope: true |
| topic 和 scope 都在 | 原地覆盖 HTML + manifest 更新 updated_at | 两个都 false · scope 标记为覆盖 |
worker 只暴露几条路 — 一条发布,剩下都是给浏览器看的。
| URL | 谁来 | 给什么 |
|---|---|---|
POST /publish | cli | 带 bearer token,body 是 JSON {topic, scope, html, ...} |
GET / | 浏览器 | dashboard 渲染所有 topic 卡片 |
GET /:topic/ | 浏览器 | topic 页 — 上方 chrome + 下方 scope HTML 嵌 iframe |
GET /:topic/:scope.html | 浏览器 | scope HTML 本体(R2 直读) |
GET /:topic/manifest.json | 调试用 | 这个 topic 的 scope 列表 |
GET /_health | 探活 | 简单 200 OK |
收到 URL 的人不需要任何 token,直接打开。 worker 根据路径决定渲染哪一层。
进档案首页(visual-explain.fpai.io/)
进 topic 页(/tools-backend-arch/)
?scope=xxx/tools-backend-arch/request-path.html,那是全屏 HTML,没有 chrome 干扰。如果想给"这个 topic 几个角度都看下",给 topic 页 /tools-backend-arch/。