2026-01-21 18:21:10 +08:00
|
|
|
|
# 仓库协作指南(AGENTS)
|
|
|
|
|
|
|
2026-04-18 05:43:49 +08:00
|
|
|
|
## 当前主线
|
2026-01-11 12:35:53 +08:00
|
|
|
|
|
2026-04-18 05:43:49 +08:00
|
|
|
|
- 当前长期方向以 `tree-first graph kernel` 为准,不以 `BlockNote-first` 或 `Mindmap-first` 为准。
|
|
|
|
|
|
- `Convex` 继续保留为本地自托管的存储、实时、文件协作底座,不因为推进 Rust 主线而先拆掉。
|
|
|
|
|
|
- `Rust kernel` 持有树、子树、边、projection、query、command 的语义主导权;新增树规则不要继续散落到前端、Next route 或临时 compat 层。
|
2026-04-23 07:38:34 +08:00
|
|
|
|
- `mnote-web` 是当前 Rust Web 承载层,负责 transport、projection 分发、兼容切流;`compat` 与 `fixture` 只用于过渡和测试,不应继续承载长期业务语义。`3000` 是唯一前端公开入口;`3104` 已退役为仅显式 debug/internal 使用的边界。`/tree`、`/document-debug` 等 debug 壳默认关闭,仅在显式 debug/runtime 验证时启用。
|
2026-04-18 05:43:49 +08:00
|
|
|
|
- 前端主路径应消费稳定 projection,不应在 UI 层重新拼出第二份对象真相。
|
2026-05-16 22:03:14 +08:00
|
|
|
|
- Next `documents/page` 读取主链已优先消费 Rust `mnote.page_aggregate.v1` 快照;TS `page-aggregate-builder` 仅保留为历史 adapter / test helper,不再作为 runtime fallback,也不再把“前端手工拼 `meta + content`”描述为当前主路径。
|
2026-05-17 15:57:40 +08:00
|
|
|
|
- `3000` 当前主壳已接入 Rust Web WebSocket push 主链(`/api/realtime/ws`)+ SSE fallback(`/api/tree/events`)的 snapshot / delta / resync consumer,并已有 browser smoke 验证(2026-05-17 WS 迁移 `57ec8322`);后续收口重点是统一 live cache 与减少补偿链,而不是把它描述成“还没接 live stream”。
|
2026-05-10 08:46:43 +08:00
|
|
|
|
- 文档页默认主编辑器已切到页面内 `leptos-tiptap` island;`BlockNote` 已退出文档页默认主路径,只保留为历史参考实现 / 对照材料。
|
2026-05-16 23:48:41 +08:00
|
|
|
|
- Page Aggregate 当前已输出 `blockDocument / blockProjectionVersion / projectionSource`(`projectionSource=documents.content`),标题/正文/页面设置写入后 smoke 已通过(`task110`、`task-page-aggregate-body-sync-smoke`、`task-page-aggregate-options-sync-smoke`);页面/块 AI 最小工具链已通过 Rust Hermes tools 读取和写入块投影;但这仍是从 `documents.content` / local markdown content 投影出来的过渡态,不是 EditorBlockDocument 原生落库完成态。客户端 `PageAggregateClientState` reducer 仍在,页面域单一真源未完全闭环。
|
2026-05-17 15:57:40 +08:00
|
|
|
|
- 当前最优先的架构收口不是继续扩编辑器 UI,而是 `Page Aggregate` 单一真源收口(标题/正文/页面设置 smoke 已通过)、`tree command cutover` 收尾、`tree realtime event stream` live cache 统一(WS push 主链 2026-05-17 上线,SSE 降级为 fallback)三条主线;AI 侧当前只做 Phase A(`mnote.doc.markdown_edit` + `mnote.doc.fetch` 增强,search/replace + `format: "markdown"` + local source),退役 `local_rule` planner 作为 Phase B;`review session`/流式 apply 属于 Phase C(设计冻结,当前不实施),不扩新 AI 功能,不把粗粒度 `mnote.page.save` 当成精确块编辑主入口。
|
2026-01-11 12:35:53 +08:00
|
|
|
|
|
2026-04-18 05:43:49 +08:00
|
|
|
|
## 组件定位
|
|
|
|
|
|
|
2026-04-23 07:38:34 +08:00
|
|
|
|
- `leptos-tiptap` island 是当前文档页默认主编辑区 runtime,但不是系统事实源。
|
2026-05-10 08:46:43 +08:00
|
|
|
|
- `BlockNote` 是历史参考实现 / 对照材料,不再是运行时系统组件、默认回退编辑器或系统事实源。
|
2026-04-18 05:43:49 +08:00
|
|
|
|
- `Mindmap` 是 `tree-first graph` 的一种视图和编辑挂件,不是对象真相层。
|
|
|
|
|
|
- `OnlyOffice` 是独立页面型编辑器,不直接嵌入 `BlockNote` 画布;正文中通常通过附件块跳转进入。
|
2026-05-16 23:48:41 +08:00
|
|
|
|
- `page-ai/block-edit-workflow` route 是当前简单编辑的 fast-path 入口(`local_rule` planner 为过渡实现);长期方向是将 AI 编辑主路径收敛到 `mnote.doc.markdown_edit`(markdown 级 search/replace,见 7-14),`mnote.block.*` 保留为结构性辅助。复杂任务仍走 Hermes agent。
|
|
|
|
|
|
- 树域三层模型:`Resource Tree`(kernel 对象组织真源)→ `File Tree`(主组织投影,`{title}.md` 为页面正文行)→ `Page Tree`(导航投影,不持有结构真相)。涉及资源归属优先走 Rust kernel 的 `KernelObjectIdentity` / `KernelProjectionResourceKind`。
|
2026-04-18 05:43:49 +08:00
|
|
|
|
|
|
|
|
|
|
## 目录优先级
|
2026-01-11 12:35:53 +08:00
|
|
|
|
|
2026-04-13 19:21:42 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/wolai-frontend/src/`
|
2026-04-18 05:43:49 +08:00
|
|
|
|
页面、编辑器、Sidebar、树视图、阅读态、交互壳默认先看这里。
|
2026-04-13 19:21:42 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/wolai-frontend/convex/`
|
2026-04-18 05:43:49 +08:00
|
|
|
|
仍在使用的 Convex functions 与数据侧逻辑先看这里。
|
|
|
|
|
|
- `/mnt/Data1T/mnote/rust/crates/core-protocol/`
|
|
|
|
|
|
Kernel 类型、projection 协议、树/图核心术语先看这里。
|
|
|
|
|
|
- `/mnt/Data1T/mnote/rust/crates/bridge-runtime/`
|
|
|
|
|
|
Kernel query / command / subtree / graph traversal 入口先看这里。
|
|
|
|
|
|
- `/mnt/Data1T/mnote/rust/crates/mnote-web/`
|
|
|
|
|
|
Rust Web route、transport、compat、tree shell、projection 分发先看这里。
|
2026-04-13 19:21:42 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/wolai-backend/app/`
|
2026-04-18 05:43:49 +08:00
|
|
|
|
辅助后端、异步处理、接口配合先看这里。
|
|
|
|
|
|
- `/mnt/Data1T/mnote/infra/convex/`
|
|
|
|
|
|
Convex 自托管部署与本地基础设施先看这里。
|
2026-04-13 19:21:42 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/src/components/onlyoffice/`
|
2026-04-18 05:43:49 +08:00
|
|
|
|
只在处理 OnlyOffice 静态资源、插件或兼容问题时进入。
|
2026-04-13 19:21:42 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/recycle/`
|
2026-04-18 05:43:49 +08:00
|
|
|
|
默认视为历史回收区,不作为当前实现依据,除非任务明确要求。
|
2026-01-11 12:35:53 +08:00
|
|
|
|
|
2026-04-18 05:43:49 +08:00
|
|
|
|
## 架构约束
|
2026-01-11 12:35:53 +08:00
|
|
|
|
|
2026-04-18 05:43:49 +08:00
|
|
|
|
- 涉及树、页面结构、文件树、Sidebar、阅读投影、搜索投影、引用边语义时,优先判断是否应落到 Rust kernel,而不是直接改前端拼装逻辑。
|
|
|
|
|
|
- 前端可以做展示、交互和局部适配,但不要新增第二套树真相、排序真相或 projection 契约。
|
|
|
|
|
|
- `mnote-web` 的 `compat route` 可以承接过渡流量,但不要把新的长期业务逻辑继续堆进 compat。
|
2026-04-23 07:38:34 +08:00
|
|
|
|
- 涉及文档页标题、页面设置、正文保存、页头与树一致性时,优先判断是否应收口到 `Page Aggregate`,不要继续在页面壳或 island 外侧拼第二份页面真相。
|
|
|
|
|
|
- 涉及页面新建、重命名、移动、归档、恢复、嵌入时,优先沿 `tree.*` 正式命名推进;`documents.*` 只视为兼容层,不应继续扩写为长期命令面。
|
2026-05-16 22:03:14 +08:00
|
|
|
|
- 涉及 AI 读取、定位或精确编辑页面块时,优先沿 `mnote.doc.*` / `mnote.block.*` Hermes tools 与 Rust `EditorCommand` 推进;`mnote.page.save` 只作为页面级兜底写入工具。
|
2026-05-16 23:48:41 +08:00
|
|
|
|
- 涉及资源归属(哪个页面拥有哪个 mindmap/附件)、object identity 和资源生命周期时,优先沿 Resource Tree → File Tree projection → `tree.resource.*` 命令面推进;`tree.*` 是正式命令面,`documents.*` 只视为兼容层。
|
|
|
|
|
|
- 页面 AI 编辑长期主路径为 `mnote.doc.markdown_edit`(search/replace 或 full_content,markdown 文本级),在线文档和本地 `.md` 文件共用。当前过渡实现为 `POST /api/page-ai/block-edit-workflow` fast-path(`local_rule` planner,Phase B 退役)。`mnote.block.*` 保留为结构性辅助(拖拽排序等)。两层操作模型已获 CLI Main(Lark Doc)参考实现验证。流式 apply + suggest/review(参考 BlockNote AI)作为 Phase C 设计冻结,当前不实施。复杂任务进入 `/api/hermes/client/runs`。模型不直接产出 unified diff 或 blockId 操作;最终定位、校验和写入由 Rust runtime 负责。
|
2026-04-18 05:43:49 +08:00
|
|
|
|
- 需要架构判断时,优先参考:
|
|
|
|
|
|
- `/mnt/Data1T/mnote/ARCHITECTURE.md`
|
2026-04-23 07:38:34 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`
|
2026-04-21 06:26:35 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-tree-first-graph-kernel-v1.md`
|
|
|
|
|
|
- `/mnt/Data1T/mnote/design/02-convex-rust-long-term-architecture/process/2-tree-first-graph-convex-rust-long-term-architecture-v1.md`
|
2026-04-23 07:38:34 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md`
|
|
|
|
|
|
- `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
2026-05-16 22:03:14 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/design/07-ai/process/7-10-page-block-ai-tooling-execution-checklist-v1.md`
|
2026-05-09 20:51:43 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/design/04-tree-domain/done/4-6-tree-command-protocol-cutover-stage2-v1.md`
|
2026-05-17 15:57:40 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md
|
|
|
|
|
|
- `design/03-rust-web/process/3-14-rust-web-tree-realtime-ws-push-v1.md`
|
2026-05-16 23:48:41 +08:00
|
|
|
|
- `/mnt/Data1T/mnote/design/10-review/process/08-kernel-architecture-next-priority-review-and-checklist.md`
|
|
|
|
|
|
- `/mnt/Data1T/mnote/design/10-review/process/09-page-ai-fast-block-edit-runtime-review.md`
|
|
|
|
|
|
- `/mnt/Data1T/mnote/design/07-ai/process/7-14-online-local-ai-markdown-editing-convergence-v1.md`
|
|
|
|
|
|
- `/mnt/Data1T/mnote/design/04-tree-domain/done/4-24-resource-tree-filetree-pagetree-source-contract-checklist-v1.md`
|
|
|
|
|
|
- `/mnt/Data1T/mnote/design/05-editor-mainline/done/5-12-main-editor-object-tab-resource-alignment-checklist-v1.md`
|
2026-04-21 06:26:35 +08:00
|
|
|
|
|
|
|
|
|
|
## 设计稿目录规则
|
|
|
|
|
|
|
|
|
|
|
|
- `design/01-*` 到 `design/07-*` 主线大类统一按 `process/` 与 `done/` 分层。
|
|
|
|
|
|
- 主线设计稿在推进中时放到对应大类的 `process/`。
|
|
|
|
|
|
- 主线设计稿在当前真实代码中已完成后,必须移动到对应大类的 `done/`。
|
2026-04-23 07:38:34 +08:00
|
|
|
|
- 已被后续实现或更新稿明确覆盖、但又不属于 `done` 的旧主线稿,必须移动到 `design/old/` 并标记为 `[recycle]`,不要继续占用活跃 `process/`。
|
2026-04-21 06:26:35 +08:00
|
|
|
|
- `design/old/` 下的历史废弃稿也统一按 `process/` 与 `done/` 分层,但标题继续标记 `[recycle]`。
|
|
|
|
|
|
- `design/90-reference/` 只放参考资料,不参与 `process/done` 状态迁移。
|
2026-04-13 19:21:42 +08:00
|
|
|
|
|
2026-05-13 22:43:16 +08:00
|
|
|
|
## Bugs 目录规则
|
|
|
|
|
|
|
|
|
|
|
|
- `bugs/` 默认镜像 `design/` 的主线分类方式,按对应大类放置缺陷。
|
|
|
|
|
|
- 每个大类继续按 `process/` 与 `done/` 分层:
|
|
|
|
|
|
- `process/`:缺陷已确认存在,仍在修复或验证中
|
|
|
|
|
|
- `done/`:缺陷已修复,且已有真实代码与验证证据
|
|
|
|
|
|
- 新确认的缺陷先放 `process/`;修复完成后必须移动到同类目的 `done/`,不要在两个目录同时保留同一条缺陷。
|
|
|
|
|
|
- 缺陷归类以真正 owner 和长期主线为准,不以表面症状命名:
|
|
|
|
|
|
- `sidebar/topbar/breadcrumb/文档页壳/Wolai 体验对齐` 优先归到 `05-editor-mainline/`
|
|
|
|
|
|
- `projection/row model/selection/focus/keyboard/DnD/tree command` 优先归到 `04-tree-domain/`
|
|
|
|
|
|
|
2026-04-13 19:21:42 +08:00
|
|
|
|
## 协作边界
|
|
|
|
|
|
|
|
|
|
|
|
- 仅修改与当前任务直接相关的文件。
|
|
|
|
|
|
- 不要擅自恢复、覆盖、删除用户已有改动。
|
2026-04-18 05:43:49 +08:00
|
|
|
|
- 若发现与当前任务无关的脏改动,保持不动;若怀疑会影响当前任务,先确认再处理。
|
|
|
|
|
|
- 若当前问题只是 UI 表现异常,先确认是否是实验性 tree shell、compat 路径、轮询或 fallback 混入首屏主链,而不是直接怀疑 Convex 本身。
|
2026-04-13 19:21:42 +08:00
|
|
|
|
|
2026-04-18 05:43:49 +08:00
|
|
|
|
## 常用命令
|
2026-04-13 19:21:42 +08:00
|
|
|
|
|
|
|
|
|
|
- 根目录热启动:`npm run desktop:hot`
|
|
|
|
|
|
- 前端开发:`cd /mnt/Data1T/mnote/wolai-frontend && pnpm dev`
|
|
|
|
|
|
- 前端检查:`cd /mnt/Data1T/mnote/wolai-frontend && pnpm lint && pnpm test`
|
|
|
|
|
|
- 后端开发:`cd /mnt/Data1T/mnote/wolai-backend && uvicorn app.main:app --reload --port 8000`
|
|
|
|
|
|
- Convex 自托管:参考 `/mnt/Data1T/mnote/infra/convex/README.md`
|
|
|
|
|
|
|
2026-05-06 21:44:20 +08:00
|
|
|
|
## 默认测试账号
|
|
|
|
|
|
|
|
|
|
|
|
- 后续网页测试、浏览和 smoke 默认使用当前 Convex Auth 测试账号:邮箱 `mnote.e2e@example.com`,密码 `MnoteE2E123!`,用户名 `mnote-e2e`。
|
|
|
|
|
|
- 优先从 `http://localhost:3000/auth` 点击“测试账号快速登录”进入;若需手动注册,也必须注册同一组账号,不要改用 `MNOTE_DEV_AUTH=1` 跳过真实 auth。
|
|
|
|
|
|
- 需要核验登录是否真实生效时,优先检查当前 auth cookie/JWT 是否能读取到 Convex `users.currentUser`,避免把 `devFallback` 当成真实登录。
|
|
|
|
|
|
|
2026-04-18 05:43:49 +08:00
|
|
|
|
## 前端测试方法
|
|
|
|
|
|
|
|
|
|
|
|
- 看页面当前真实渲染结果、登录态下实际内容、JS 渲染后的 `localhost` 页面时,优先用 `/doko`;它适合读取真实 Chrome 中已经渲染完成的页面。
|
|
|
|
|
|
- 做交互测试、文件创建/删除/移动、上传、快速登录、侧边栏展开、回归断言时,优先用浏览器自动化测试工具;这类任务不要只靠 `/doko`。
|
|
|
|
|
|
- 推荐顺序是:先用 `/doko` 快速确认页面是否正常渲染,再用浏览器自动化测试工具验证关键交互链路。
|
|
|
|
|
|
- 影响主页入口、Sidebar、tree shell、文档页首屏时,优先补或复用 `scripts/task*-smoke.js` 这类 smoke 脚本。
|
|
|
|
|
|
- 排查高 CPU / 高内存 / 卡顿时,先看是否存在首屏误走实验性 tree shell、compat fallback、重复请求、轮询或回链面板持续刷新,再看数据底座。
|
|
|
|
|
|
|
2026-05-13 22:43:16 +08:00
|
|
|
|
## mnote-tester 调用
|
|
|
|
|
|
|
|
|
|
|
|
- 当前固定网页测试员 profile 为 `mnote-tester`,Hermes profile 路径:`/home/lix/.hermes/profiles/mnote-tester`。
|
|
|
|
|
|
- 默认优先通过别名调用:`/home/lix/.local/bin/mnote-tester`;等价命令是 `hermes -p mnote-tester`。
|
|
|
|
|
|
- 需要让后续 agent 调它做真实浏览器测试时,优先使用 one-shot:
|
|
|
|
|
|
- `mnote-tester --yolo -z "<测试任务>"`
|
|
|
|
|
|
- 或 `hermes -p mnote-tester --yolo -z "<测试任务>"`
|
|
|
|
|
|
- 交给 `mnote-tester` 的任务描述必须明确写出:
|
|
|
|
|
|
- 测试目标页面或 URL
|
|
|
|
|
|
- 是否要求真实登录
|
|
|
|
|
|
- 是否要求新建 / 修改 / 删除页面或块
|
|
|
|
|
|
- 测试数据前缀,例如 `TEST-HERMES-<timestamp>`
|
|
|
|
|
|
- 是否要求发现 bug 后直接写入 `bugs/<category>/process/`
|
|
|
|
|
|
- `mnote-tester` 允许在 `3000` 主页面做最小写入型测试,包括新建、重命名、编辑、移动、归档、恢复、删除页面,以及新建、修改、删除块/模块;但默认只能操作“本轮新建的测试数据”或用户明确指定的测试区域,不能动既有用户内容。
|
|
|
|
|
|
- `mnote-tester` 的默认证据目录是 `/mnt/Data1T/mnote/tmp/hermes-tester/<run-id>/`;若发现 bug,应按 `/mnt/Data1T/mnote/bugs/README.md` 与本文件规则归类,并把缺陷记录写到对应 `bugs/<category>/process/`。
|
|
|
|
|
|
- 若 `/auth`、快速登录、首屏路由或上游服务本身已阻塞,`mnote-tester` 应立即停止后续写入动作,先输出阻塞证据并按规则记录 blocker bug,不要伪造“新建/修改/删除已验证通过”。
|
2026-04-30 16:18:54 +08:00
|
|
|
|
|
|
|
|
|
|
## Wolai-aline 对标流程
|
|
|
|
|
|
|
|
|
|
|
|
- 凡任务涉及 `wolai-aline`、Wolai 对标、复刻 Wolai 体验或把 `3000` 行为与 Wolai 页面比对,必须启用 `/home/lix/.codex/skills/wolai-aline` skill,并参考 `/mnt/Data1T/mnote/design/08-wolai-aline-test-flow/process/wolai-aline-test-flow-v1.md`。
|
|
|
|
|
|
- Wolai-aline 任务默认采用“Wolai 基线取证(默认只读,编辑器任务可用 Hermes editable-test mode)-> 本地 RED smoke -> 小范围实现 -> 本地验证 -> subagent 浏览器对标复测 -> 主线程截图复核 -> 汇报剩余差异”的流程。
|
|
|
|
|
|
- 浏览器对标测试必须使用 subagent 执行;subagent 只做浏览器验证和截图,不修改源码、不还原文件、不清理证据;编辑器任务可在明确声明的 Hermes editable-test mode 下做最小编辑验证。
|
|
|
|
|
|
- Wolai 默认优先只读;当前 Hermes 测试页 `https://www.wolai.com/liaibo/ikFSSM1a4GgvmHBYFCNfVd` 已授权用于 Wolai-aline 编辑器对标,可做最小范围编辑测试。其他 Wolai 页面写入仍需沙盒页 URL 和明确授权。
|
|
|
|
|
|
- 即使在 Hermes 测试页,也禁止未经确认地删除、移动、归档、发布、评论、改权限或批量修改既有非测试内容;编辑测试必须记录前后截图、动作链、输入内容和清理状态。
|
|
|
|
|
|
- 对标验收不能只看文案或 DOM 是否存在;必须检查截图中的控件形态、开启/关闭状态、hover/active 状态、快捷键行为、URL 是否跳转等真实体验差异。
|
|
|
|
|
|
- 发现截图或实测行为与本地实现不一致时,先把差异补进 smoke 形成可复现失败,再修改实现并复测。
|
|
|
|
|
|
- Wolai owner 登录态优先复用 `/mnt/Data1T/mnote/tmp/wolai-playwright-profile`;遇到登录或滑块验证,不绕过,记录阻塞并让用户介入。
|
|
|
|
|
|
|
2026-04-13 19:21:42 +08:00
|
|
|
|
## 文件编码与风格
|
|
|
|
|
|
|
|
|
|
|
|
- 所有新增或修改文件统一使用 UTF-8。
|
|
|
|
|
|
- TS/TSX 默认 2 空格缩进,Python 默认 4 空格缩进。
|
|
|
|
|
|
- 注释使用简体中文。
|
2026-05-17 15:57:40 +08:00
|
|
|
|
-当使用deepseek模型编程时,遇到疑难问题可以使用MCP求助codex,但需要注意codex回复比较慢,可能需要等待长一点的时间>3min。
|