Skip to content

Commit 7164041

Browse files
committed
docs(v0.15): 交付记录与豁免登记更新
1 parent 6e1c2c4 commit 7164041

3 files changed

Lines changed: 67 additions & 7 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,19 @@
33
本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与 [SemVer](https://semver.org/lang/zh-CN/)。
44
各版本的深度版本文档在 [docs/versions/](docs/versions/)。
55

6-
## [0.13.9] - 2026-08-27
6+
## [0.15.0] - 2026-08-30
7+
8+
> **笔记体验打磨**(v0.14 交付后用户实测 6 项,设计规格见 [docs/superpowers/specs/2026-08-30-v0.15-notes-polish-design.md](docs/superpowers/specs/2026-08-30-v0.15-notes-polish-design.md),交付记录见 [docs/versions/v0.15.md](docs/versions/v0.15.md))
9+
10+
- **① 标题切换语义**:`computeHeadingChanges`/`headingLines` 由"已是标题跳过"改 set-or-toggle——同级别再点 → 剥除还原普通段;其他级别/普通段 → 置为该级(CM 与 textarea 降级双路径同步 + 4 单测改造,"点 H1 无取消"修复,按钮高亮闭环)
11+
- **② 全站列自适应**:`useColumnLayout`(宽度记忆 + min/max 夹取 + 窄窗阈值自动折叠:<1100 大纲/<860 侧栏/<700 列表;手动状态优先,窗口回宽恢复)+ `ColumnResizer`(拖拽手柄,双击恢复默认)+ `ColumnBar`(折叠窄条)——迁移笔记页 3 列/会话页/知识页 2 列/课堂页 1 列(7 处固定宽列);`NoteImage` 脱离 240×160 固定缩略,按原始比例自适应(maxWidth 100% / maxHeight 60vh)
12+
- **③ 分组树 + 整列折叠**:中部列表改分组树——组头 chevron 收起/展开(折叠记忆 localStorage)、组名点击=过滤(v0.12.2 决策 1 不变)、搜索/标签/排序激活退化平铺、空组不渲染;三列均可折叠为窄条(大纲悬浮按钮并入统一体系);行渲染拆 `NoteListRow`
13+
- **④ 图片落盘三入口**:`import_note_image_b64`(剪贴板,`image::guess_format` 字节嗅探定格式——不信任 MIME)+ `import_note_image_url`(ureq 下载:超时 10s/限流 10MB/重定向 ≤3/Content-Type 白名单,失败降级插原 URL + 提示)复用 `write_image_bytes` 落盘核心(大小上限/唯一命名);删除笔记顺带清理 `notes-images/{nid}/`(尽力而为,失败不阻断);用户插入图片全部留副本,防源文件/源站删除丢资源
14+
- **⑤ 编辑态剪贴板导入图片**:`useClipboardImagePaste` + `utils/clipboardImage`——`event.clipboardData` 同步提取(无权限弹窗)→ base64 → 落盘 → 插入引用;CM `domEventHandlers.paste` 与 textarea `onPaste` 双入口;图片即时内联显示(decoration 自动重算);超 10MB 前置拦截
15+
- **⑥ 换行一致**:`NoteMarkdown` 启用 remark-breaks——单换行(软换行)渲染 `<br>`,编辑/阅读所见一致;存量笔记零数据变更自动修复;`\`/两空格强断行保留;不设开关(YAGNI)
16+
- 验证:`cargo test` 1840 passed(3 failed 为预存基线:ai_client 默认 Provider + note_filter 两条黄金用例,v0.13.8 已登记);clippy 零新增警告;vitest **53 文件 431 用例全绿**(新增 27);`tsc --noEmit` 零错误;`vite build` 通过;真机走查待用户验收批执行
17+
18+
### v0.13.9 聚合发布(2026-08-27,重构区首次正式发布)
719

820
> **聚合发布**:本版为重构区首次正式发布(Tauri 桌面端),自 v0.8.0 后的全部交付(v0.9.0 视频档案框架 → v0.13.9 知识体系深化)随本版一并发布。各小版本交付详情见下方记录与 [docs/versions/](docs/versions/)。
921

‎docs/standards/line-limit-exemptions.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,19 @@
6767

6868
| 文件 | 行数 | 豁免理由 | 拆分计划 |
6969
|------|------|---------|---------|
70-
| app/src/pages/ClassroomPage.tsx | 547 | 装配层页面:左栏配置区(就绪清单/窗口选择/实时捕获/视频导入/OCR 设备/词表/素材)+ 右栏内容区;审查硬拆已拆出 ClassroomRightPane 与 MaterialInputPanel 回归 547 | 若再增长:将实时捕获卡片拆出 LiveCaptureCard(状态与事件监听下沉) |
70+
| app/src/pages/ClassroomPage.tsx | 607 | 装配层页面:左栏配置区(就绪清单/窗口选择/实时捕获/视频导入/OCR 设备/词表/素材)+ 右栏内容区;v0.15 左栏列状态(useColumnLayout 折叠/拖拽)再增——**注意:超 600 硬限为预存债务(v0.14 前已越线,登记值 547 为过期快照),本版据实测 607 纠偏并承接拆分计划** | 若再增长:将实时捕获卡片拆出 LiveCaptureCard(状态与事件监听下沉)——超硬限必须拆 |
7171
| app/src/components/LiveActivityPanel.tsx | 510 | 实时活动面板:会话状态/转录流/OCR 预览/控制区多状态面板内聚(前端审查登记) | 若再增长:转录流与 OCR 预览拆至 LiveTranscriptStream.tsx / LiveOcrPreview.tsx |
72-
| app/src/components/SessionListPanel.tsx | 501 | v0.7.1 拆分产物:列表域 UI(双模式搜索/筛选排序/课程分组折叠/批量操作栏/内联转化)内聚——筛选/排序/选择为面板本地状态 | 若再增长:批量操作栏与列表项拆至 SessionListRow.tsx |
72+
| app/src/components/SessionListPanel.tsx | 491 | v0.7.1 拆分产物:列表域 UI(双模式搜索/筛选排序/课程分组折叠/批量操作栏/内联转化)内聚——筛选/排序/选择为面板本地状态;v0.15 宽度 prop 适配(实测较登记值 501 回落) | 若再增长:批量操作栏与列表项拆至 SessionListRow.tsx |
7373
| app/src/components/AiServicePanel.tsx | 390 | v0.8.0 M1(REQ-138/139/140)AI 服务设置面板:全局开关/密钥管理(掩码+DPAPI 保存)/端点模型/测试连接/余额卡片/授权确认卡/审计列表——配置面板 UI 内聚 | 若再增长:余额卡片与审计列表拆至 AiBalanceCard.tsx / AiAuditList.tsx |
7474
| app/src/components/SessionDetailPanel.tsx | 371 | 会话详情面板:质量报告/段列表/OCR 概览/操作区单一面板完整交互流内聚(前端审查登记) | 若再增长:质量报告区拆至 SessionQualityReport.tsx |
7575
| app/src/components/ProfileDetector.tsx | 373 | 档案检测组件:投票/确认流/记忆偏好 UI + v0.11.5 Task 5 冲突提示内聚 + v0.13.6(REQ-219~222)形态 10 下拉/领域 20 下拉/细目多选 chips/分区映射形态优先 + 审查轮(onProfileChange ref/独立 try/fine_ids 同步,实测 2026-08-24) | 若再增长:确认流与细目 chips 拆至 ProfileConfirmFlow.tsx |
76-
| app/src/components/NoteEditView.tsx | 306 | v0.13.6(审查 H1 修复)重新越线:forwardRef 命令式 flushSave 出口(ESC 先保存后刷新)+ flushLatest 最终保存——编辑视图保存/快捷键/工具栏内聚 | 若再增长:工具栏与 MarkdownEdit 快捷键拆至 NoteToolbar.tsx |
77-
| app/src/components/GroupSidebar.tsx | 445 | v0.13.7(触点①)体系引用聚合/徽标渲染 + v0.14 C1 Obsidian 式(分区/过滤/最近/拖拽)+ v0.14.1 新建组弹窗与行内重命名接线(+31 行)+ 审查修复(成功反馈 notice 区 +4 行)——组行筛选与体系徽标混合在同一 load 域 | 若再增长:体系引用拉取与徽标聚合拆至 useGroupSystemLinks.ts hook;新建/重命名编排拆至 useGroupCrud.ts |
76+
| app/src/components/NoteEditView.tsx | 340 | v0.13.6(审查 H1 修复):forwardRef 命令式 flushSave 出口(ESC 先保存后刷新)+ flushLatest 最终保存;v0.15 剪贴板图片 paste(useClipboardImagePaste+插入)+ 外链图下载导入——编辑视图保存/快捷键/工具栏/图片入口内聚(textarea 降级路径与 CM 版同步) | 若再增长:工具栏与 MarkdownEdit 快捷键拆至 NoteToolbar.tsx |
77+
| app/src/components/GroupSidebar.tsx | 413 | v0.13.7(触点①)体系引用聚合/徽标渲染 + v0.14 C1 Obsidian 式(分区/过滤/最近/拖拽)+ v0.14.1 新建组弹窗与行内重命名接线 + v0.15 宽度 prop/折叠按钮(实测较登记值 445 回落)——组行筛选与体系徽标混合在同一 load 域 | 若再增长:体系引用拉取与徽标聚合拆至 useGroupSystemLinks.ts hook;新建/重命名编排拆至 useGroupCrud.ts |
7878
| app/src/components/RouteInfoPopover.tsx | 360 | v0.13.7(触点③)体系简报 + v0.14.1 删除组第五区(+16 行)——弹层内四区交互流内聚 | 若再增长:简报拉取与渲染拆至 SystemBriefSection.tsx |
7979
| app/src/components/NoteEditView.tsx | —— | v0.12.2 行数修正:实测 299 行(登记值 315 过期),本版新增 autoFocus 一行后仍 300 行以内——登记移除,见"已拆分/登记移除记录" | —— |
80-
| app/src/pages/NotesPage.tsx | 359 | v0.12.2 三栏编排(GroupSidebar/FeedFragmentList/NoteListView 插槽 + 收件箱动线 onPromoted 接线 + 新建零对话框)——编排层内聚(数据获取/选中态/快捷键/辅助面板插槽),组件已全部下沉拆件;2026-08-23 审查修复(onPromoted 同步清搜索态/onOpenInbox 清组过滤)+6 行;v0.12.8 列表级批量删除(runBatchDelete 确认+逐条 invoke+刷新,confirm 导入,+27 行);v0.13.6(REQ-223)编辑退出统一刷新回调 + 审查轮(ESC flush 出口) | 若再增长:键盘监听与收件箱动线回调拆至 useNotesPageShortcuts.ts / useInboxFlow.ts |
80+
| app/src/pages/NotesPage.tsx | 478 | v0.12.2 三栏编排(GroupSidebar/FeedFragmentList/NoteListView 插槽 + 收件箱动线 onPromoted 接线 + 新建零对话框)——编排层内聚(数据获取/选中态/快捷键/辅助面板插槽),组件已全部下沉拆件;后续修复(onPromoted 同步清搜索态/onOpenInbox 清组过滤/编辑退出统一刷新/ESC flush 出口)续增;v0.15 三栏列状态编排(useColumnLayout×3 + ColumnResizer/ColumnBar + 分组树组数据传递)再增——**登记值 359 为过期快照,本版实测 478 纠偏** | 若再增长:键盘监听与收件箱动线回调拆至 useNotesPageShortcuts.ts / useInboxFlow.ts |
8181
| app/src/components/AiProviderSettings.tsx | 329 | v0.11.6 M1 code-review 修复(2026-08-22):删除/清钥加 window.confirm、window.prompt 改卡片内联 password 输入(+2 state + 内联表单)、模型列表 input 改 textarea、fallbackOrder 透传 initial、run 置"处理中"反馈、预设双源 presetOptions 后端拉取——修复净增约 13 行越线(实测 329,含 4 行豁免头注释) | 若再增长:内联密钥表单拆至 AiProviderKeyInput.tsx |
82-
| app/src/pages/KnowledgePage.tsx | 322 | v0.13.8 画布接线越线(原 296):中栏新增「画布」标签 + 树/画布双入口(树视图浮钮 + 标签栏)+ 中栏 display 切换(树常驻/画布激活挂载)+ 审查修复(applyCanvasPositions 位置合并回传)——页面编排层内聚(数据获取/选中态/标签态为页面本地状态),子组件已全部下沉(Tree/Canvas/DetailPanel/Wizard/ConceptCardRow/Sample) | 若再增长:中栏视图块(树/画布/概念/模型 + 标签栏)拆至 KnowledgeMiddlePane.tsx,SystemCard 拆至 SystemSidebarCard.tsx |
82+
| app/src/pages/KnowledgePage.tsx | 391 | v0.13.8 画布接线越线(原 296):中栏「画布」标签 + 树/画布双入口 + v0.15 左列/详情列状态迁移(useColumnLayout + 折叠窄条 + 宽度 prop)——页面编排层内聚(数据获取/选中态/标签态为页面本地状态),子组件已全部下沉(Tree/Canvas/DetailPanel/Wizard/ConceptCardRow/Sample) | 若再增长:中栏视图块(树/画布/概念/模型 + 标签栏)拆至 KnowledgeMiddlePane.tsx,SystemCard 拆至 SystemSidebarCard.tsx |
8383
| app/src/components/KnowledgeCanvasView.tsx | 466 | v0.13.8 画布主视图(RF 装配/拖拽防抖保存/视口持久化/自动排列);v0.13.9 根卡 + 接线方向动态化;v0.14.1 布局/连线下拉 + 偏好读写(+72 行)+ 审查修复(布局 effect 原子化拆分建边 effect/prefsLoaded 控件门控/hasCore 统一 +31 行)——RF 状态与持久化编排内聚(元素构建已拆至 canvasElements/layout* 纯函数) | 若再增长:偏好读写与下拉拆至 useCanvasPrefs.ts;位置持久化拆至 useCanvasPositions.ts |
8484
| app/src/utils/canvasElements.ts | 301 | v0.13.8 实体 → RF 元素纯转换域;v0.13.9 根卡/接线方向;v0.14.1 连线样式/箭头入参(+20 行)——单测共用纯函数域(零 React 依赖),拆分破坏转换一致性 | 若再增长:节点构建与边构建拆至 canvasNodes.ts / canvasEdges.ts |
8585
| app/src/types/knowledge.ts | 557 | 知识体系类型域(体系/节点/概念/模型/引用/审计/决策 + v0.13.8 画布契约 + v0.14.1 画布偏好枚举与下拉文案常量)——类型与文案常量同域防漂移(前端类型域拆分任务待执行) | 若再增长:画布偏好类型与文案拆至 types/canvas.ts |

‎docs/versions/v0.15.md‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# v0.15 — 笔记体验打磨(标题切换 / 全站自适应 / 折叠 / 图片落盘 / 剪贴板导入 / 换行一致)
2+
3+
> 设计规格:[2026-08-30-v0.15-notes-polish-design.md](../superpowers/specs/2026-08-30-v0.15-notes-polish-design.md)
4+
> 交付日期:2026-08-30(设计定稿 → 当日实施交付)
5+
6+
## 背景与目标
7+
8+
v0.14(编辑器 CM6 / 视觉系统 / 知识体系 / 采集质量)交付后,用户实测反馈 6 项(4 缺陷 + 2 体验增强),全部纳入 v0.15:
9+
10+
| # | 反馈 | 根因 | 交付方案 |
11+
|---|------|------|---------|
12+
| 1 | 加 H1 后再点按钮无取消 | `headingCommand.ts`/`headingLines` 对已是标题的行**跳过**(no-op),按钮高亮却暗示可切换 | **set-or-toggle 切换语义**:同级别 → 剥除还原;其他 → 置为该级(CM + textarea 双路径) |
13+
| 2 | 组件大小不自适应 | 全站固定宽列硬编码(720px 固定 = 默认 960 窗宽下正文区 ~220px) | **全站列自适应**:useColumnLayout(拖拽 + 记忆 + min/max)+ ColumnResizer + ColumnBar(窄窗阈值自动折叠,<1100 大纲 / <860 侧栏 / <700 列表);迁移笔记/会话/知识/课堂 4 页 7 列;NoteImage 自适应 |
14+
| 3 | 笔记组、笔记不可收起 | 组侧栏已按 kind 分区折叠,但中部列表平铺、列不可折叠 | **分组树 + 整列折叠**:组头 chevron 收起(记忆 localStorage);组名点击=过滤(决策 1 保持);搜索/标签/排序激活树退化平铺;空组不渲染;三列均可折叠为 26px 窄条(大纲悬浮按钮并入统一体系) |
15+
| 4 | 用户插入图片需留副本 | 仅 🖼 文件选择复制;🌐 链接图只存 URL;剪贴板未落盘 | **图片落盘三入口**:import_note_image_b64(剪贴板,字节嗅探定格式)+ import_note_image_url(ureq 下载限流 10MB/超时 10s/Content-Type+嗅探双保险,失败降级插原 URL)+ 现有文件入口不变;删除笔记顺带清理 notes-images/{nid}/ |
16+
| 5 | 编辑模式不支持剪贴板导入图片 | CM/textarea 均无 paste 处理 | **useClipboardImagePaste**:`event.clipboardData` 同步提取(无权限弹窗)→ base64 → 落盘 → 插入引用(CM transaction / textarea 受控 + rAF 选区恢复);图片即时内联显示 |
17+
| 6 | 编辑态换行、阅读态连上 | CommonMark 软换行=空格(语义不一致,非 bug) | **remark-breaks**:单换行渲染 `<br>`;零数据变更(存量自动修复);`\`/两空格强断行保留;不设开关(YAGNI) |
18+
19+
## 方案要点与裁决
20+
21+
- **不做巡检**(用户裁决):入口全落盘后,粘贴/手写绝对路径仅剩一条漏网路径——登记为已知边界(§6),将来观察到高频再在 paste 钩子转换;保存管线不被改写(零惊喜)
22+
- **知识页详情面板**保留既有内部折叠(34px 窄栏),仅加宽度 prop——统一列折叠体系仅接管笔记页三列与其他页面左列
23+
- **删除清理尽力而为**:remove_dir_all 失败仅 eprintln(残留无害,不阻断删除;历史孤儿留垃圾回收后续任务)
24+
25+
## 验证
26+
27+
- `cargo test --test app_lib_tests`:**1840 passed / 3 failed**——3 failed 为预存基线(`ai_client` 默认 Provider 断言旧 SiliconFlow、`note_filter` 两条黄金用例,CHANGELOG v0.13.8 已登记,与本版无关);本版新增 note_image 用例 5 个(嗅探定格式/垃圾拒绝/唯一命名/非 http 拒绝等)
28+
- `cargo clippy`:零新增警告
29+
- vitest:**53 文件 431 用例全绿**(新增:heading 切换 4 + markdownEdit 3 / NoteMarkdown 换行 4 / clipboardImage 5 / useColumnLayout 6 / 分组树 4 / tree 回归 5)
30+
- `tsc --noEmit` 零错误;`vite build` 通过(chunk 体积告警为存量)
31+
32+
## 状态
33+
34+
| 项 | 状态 |
35+
|---|---|
36+
| ① 标题切换 | ✅ 交付(CM/textarea 双路径 + 4 单测改造) |
37+
| ② 全站自适应 | ✅ 交付(4 页 7 列迁移;窄窗阈值折叠;宽度/折叠记忆) |
38+
| ③ 分组树 + 整列折叠 | ✅ 交付(组折叠记忆;树退化规则;空组不渲染) |
39+
| ④ 图片落盘三入口 | ✅ 交付(b64/url 命令 + 删除清理;12 用例全绿) |
40+
| ⑤ 剪贴板导入 | ✅ 交付(双编辑器入口 + 尺寸预检 + status 降级提示) |
41+
| ⑥ 换行一致 | ✅ 交付(remark-breaks;4 渲染断言用例) |
42+
43+
## 遗留 / 已知边界
44+
45+
- 正文手写/粘贴绝对路径图片引用:不改写(观察再议)
46+
- 历史孤儿图片目录:垃圾回收后续任务
47+
- ClassroomPage 607 行:超 600 硬限为预存债务(登记值 547 为过期快照已纠偏),拆分计划见豁免登记
48+
- 真机走查:待用户验收批执行(布局拖拽/折叠恢复/剪贴板粘贴/外链下载四项核心动线)

0 commit comments

Comments
 (0)