Files
classhelper-island-refactor…/analysis/refactor-current-state.md
T
ClassIsland Prompt Kit 22c1784bab feat: ClassIsland / ClassHelper 灵动岛提示词套件
- 重构版主提示词(14 parts,面向 ClassHelper 灵动岛重构)
- ClassIsland 全量规格提示词(20 parts,含分卷与逐章版本)
- 投喂指南、分卷、逐节文件
- 调研记录、一致性基线、生成与质检脚本
2026-11-12 21:59:58 +08:00

137 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ClassHelper 灵动岛重构调研笔记(Part 02/04/05 支撑)
> 本文件是队友 `stack` 在 Round 2 的静态分析记录,供 Lead 汇总审校时核对"读了什么、依据哪一行、还剩什么没定"。
> 全程只用 read/grep/glob 与纯文本统计命令;**未构建、未安装、未运行 Electron、未截图、未冒烟/verify**;未修改 `repos/` 下任何文件。
## 1. 已读文件清单(Round 2)
### 1.1 ClassHelper(`repos/ClassHelper-master`,全部为只读)
| 文件 | 行数 | 本轮用途 |
|---|---|---|
| `docs/app/island.md` | 79 | 产品口径:fixed/custom、消息展示矩阵、编辑器、课程与课件、验证纪律 |
| `docs/dev/implementation.md` | 54 | 实现契约:方案存 `config.json.islandLayout`、单窗口、编辑页子路由 |
| `docs/dev/winisland-design-tokens.md` | 59 | 几何/度量/动画入口(已在上一轮读过,本轮复核) |
| `docs/dev/testing.md` | 79 | 验证命令与"默认无头、--visual 才做桌面验收"纪律 |
| `packages/shared/src/types.ts`(1050-1230 等片段) | 1874 总 | `IslandMode/IslandNotificationKind/IslandLessonReminder/IslandNotification/IslandAppearance/IslandState`、`ScheduleDto`、`WeekParity` |
| `packages/shared/src/island-layout.ts` | 404 | 组件枚举、`CLASSISLAND_ISLAND_METRICS`、方案/行/节点 schema、默认值、`normalizeIslandLayouts` |
| `packages/shared/src/constants.ts`(多段) | 680 总 | `DEFAULT_ISLAND_APPEARANCE`、范围、停靠、风格、`ISLAND_SIZE_DELTA`、`SHADOW_PAD`、`ISLAND_TYPE_SCALE`、`ISLAND_LIST_METRICS`、`PRIORITY_RANK/LABELS`、`CLIENT_UPDATE_IDLE_MS` |
| `packages/shared/src/class-plan.ts`(1-100) | 119 | `TIME_POINT_TYPES`、`IslandTimePointDto`、`ActiveClassPlanWeekDto` |
| `packages/shared/src/courseware.ts`(grep) | — | `COURSEWARE_ISLAND_SIZE={424,132}` |
| `src/core?: packages/desktop-client/src/island/main.ts` | 30 | 岛渲染入口、二次注入动效令牌 |
| `src/island/LayoutIslandApp.vue` | 76 | 布局选择/课件覆盖/订阅初始化 |
| `src/island/IslandApp.vue` | 683 | 经典岛全部逻辑(弹簧、圆角、胶囊、展开、命中、停靠、内容淡入) |
| `src/island/CustomIslandRuntime.vue` | 528 | 自定义常驻:测量/三页淡入/铃铛/行渲染/命中 |
| `src/island/ComponentNode.vue` | 456 | 14 类组件渲染、课程表折叠、进度/徽标、编辑手柄、样式 |
| `src/island/IslandEditorNode.vue` | 124 | 编辑器标签节点 + 拖拽落点样式(属 `renderer/components`) |
| `src/island/ClassicNotifications.vue` | 234 | 单条详情卡/多条列表卡/按钮行 |
| `src/island/LessonReminderContent.vue` | 318 | 课程提醒条、5 区斜切遮罩、进度条、徽标 |
| `src/island/CoursewareTransfer.vue` | 132 | 课件传输覆盖卡(尺寸/样式/进度) |
| `src/island/WeatherBrief.vue` | 91 | 天气简报组件与码表映射 |
| `src/island/spring.ts` / `squircle.ts` | 115 / 81 | 弹簧参数、连续圆角路径 |
| `src/island/classic-island.css` | 757 | 经典岛根变量、形状/投影、胶囊/展开/列表/按钮/状态色 |
| `src/island/custom-island.css` / `custom-runtime.css` / `lesson-ending.css` | 205 / 255 / 16 | 自定义组件样式、常驻三页样式、秒数徽标 |
| `src/main/island.ts` | 2445 | 主进程岛控制器全文(分区间阅读 + 末段 IPC/尺寸函数) |
| `src/main/lesson-reminder.ts` | 110 | 五类课程提醒计算 |
| `src/main/island-weather.ts` | 73 | Open-Meteo 抓取/缓存/退避 |
| `src/main/index.ts`(岛相关) | 347 总 | 启动装配、岛初始化、打开应用/编辑器/已读回调、退出清理 |
| `src/main/tray.ts`(岛相关) | 78 | 托盘"编辑灵动岛布局"入口 |
| `src/main/courseware.ts`(grep) | — | `island.setCoursewareTransfer(value)` |
| `src/preload/island.ts` | 123 | 岛窗口 contextBridge 白名单 |
| `src/preload/index.ts` | 101 | 主窗口桥(含 island push/class state/mark-read 订阅) |
| `src/renderer/island/bridge.ts` | 473 | 课表/上课状态/通知/作业/叫人/补弹/已读/生命周期 |
| `src/renderer/views/settings/IslandSettingsView.vue` | 512 | 设置页脚本 + 模板结构(family 入口需新增) |
| `src/renderer/views/settings/IslandEditorView.vue`(多段) | 861 | 编辑器:保存队列/上限/方案/拖拽/应用/加载 |
| `src/renderer/components/IslandComponentSettings.vue` | 307 | 内容/外观/高级三页字段 |
| `src/renderer/components/IslandEditorNode.vue` | 124 | 编辑器节点 chip/容器/落点 |
| `src/renderer/styles/island-editor.css`(选择器) | 417 | 编辑器布局/预览画布/组件库/检查器样式 |
| `src/renderer/styles/index.css`(grep 关键字) | 892 总 | 与岛相关的全局 token(未逐行引用) |
| `src/types/desktop.d.ts` | 294 | 桥接契约与配置形状(上一轮已读,本轮复核 island 部分) |
| `src/main/config.ts` | 555 | `islandLayout/island` 归一化、合并写、退出 flush(迁移接入点) |
| `src/renderer/App.vue` / `layouts/ClientLayout.vue`(岛相关) | — | 桥接生命周期、编辑页路由入口 |
| `AGENTS.md`(自动注入) | — | §4 灵动岛硬约束、验证纪律 |
### 1.2 ClassIsland(本轮仅少量回查,复用上一轮 parts)
- 上一轮产出的 `parts/03,04,05,07,10,11,14` 与 `analysis/40-baseline.md`(Lead 已整理),本轮引用其行高 40/行距 5/圆角 8/字号 14/16/18/20/进度条 3px/斜切遮罩权重等规格。
- 直接回查:`repos/ClassIsland/ClassIsland.Core/Models/Components/MainWindowLineSettings.cs`(行隐藏规则语义)、`ClassIsland.Shared/Models/Profile/TimeLayoutItem.cs:119-138`(TimeType 0-3)、`ClassIsland.Core/Models/Notification/NotificationRequest.cs:14-20`(Mask/Overlay 5s 默认)。
### 1.3 团队上下文
- `analysis/50-refactor-brief.md`(Round 2 总简报,含 8 条裁决与 §2.3 的 family/fixed 补充口径)
- 共享任务 `task-6`(已认领/完成)
- 上一轮本人产出:`parts/02-tech-stack.md`、`parts/12-plugins-ipc.md`、`parts/13-data-storage.md`、`analysis/classhelper-stack.md`(仅作技术栈与工程约定参考)
## 2. 关键行号表(本轮引用最频繁,供 Lead 复核)
| 主题 | 文件:行 | 事实 |
|---|---|---|
| 岛窗口创建 | `src/main/island.ts:480-512` | 透明/无边框/置顶/不占任务栏/独立 preload/sandbox |
| 窗口导航白名单 | `src/main/island.ts:32-50,516-522` | 生产按精确 file URL、拒绝新开窗口 |
| 默认鼠标穿透 | `src/main/island.ts:527` | `setIgnoreMouseEvents(true,{forward:true})` |
| 固定包围盒 | `src/main/island.ts:1514-1648` | `windowBox/windowBounds`,触摸贴合、自定义夹取 |
| 尺寸基线/增量 | `src/main/island.ts:72-112`、`packages/shared/src/constants.ts:344-351` | 胶囊 216×34;展开/紧急/叫人增量 |
| 收回动画 | `src/main/island.ts:1106-1164` | `CLOSE_ANIMATION_MS=360`,先切胶囊再淡出 |
| 超时表 | `src/main/island.ts:121-132` | pill 15s/展开 20s/紧急 45s/叫人 90s 等 |
| 消息分流 | `src/main/island.ts:794-867` | 紧急立即、上课暂存、普通叫人可点、预览展开 |
| 上课态迁移/课后补弹 | `src/main/island.ts:870-927` | 进入上课隐藏、下课恢复/补弹 |
| 动作状态机 | `src/main/island.ts:929-1077` | expand/collapse/expand-list/dismiss(-all)/mark-read(-all)/open-app |
| 双播合并 | `src/main/island.ts:704-724` | 同 id 合并,call/URGENT 不被降级 |
| 列表布局 | `src/main/island.ts:755-765`、`packages/shared/src/constants.ts:379-471` | 默认 3 行、hint more/app、safetyPad 6 |
| 命中轮询 | `src/main/island.ts:2049-2078` | 60ms 读光标,先换屏再命中 |
| 命中开关 | `src/main/island.ts:1795-1822` | 只由主进程关闭;触摸/编辑/自定义强制 true |
| 岛体矩形 | `src/main/island.ts:1825-1836,1973-1997` | 渲染上报 50ms 限流;兜底 expectedHitRect |
| 失焦宽限 | `src/main/island.ts:557-578,2287-2297` | 指针在岛上不收起;鼠标 500ms/触摸 1200ms |
| 触摸模式 | `src/main/island.ts:245-316,1891-1902` | 贴合岛体+始终接收输入;setShape 仅 win32 |
| 窗口自愈 | `src/main/island.ts:2106-2152` | 心跳 20s 超时、10 分钟最多 3 次 |
| 外观归一化 | `src/main/island.ts:2225-2264` | 夹取+NaN fallback;范围与 shared 一致 |
| IPC 注册 | `src/main/island.ts:2338-2438` | 全部 `island:*` handler 与发送方校验 |
| 渲染桥 | `src/preload/island.ts:14-121` | `window.island` 白名单 |
| 数据桥 | `src/renderer/island/bridge.ts:148-172,416-473` | 每秒复算上课态、课表刷新、生命周期 |
| 经典渲染 | `src/island/IslandApp.vue:188-212,266-332,346-383,420-516` | 目标尺寸/圆角、弹簧帧循环、透明度、命中上报 |
| 自定义渲染 | `src/island/CustomIslandRuntime.vue:52-124,238-323` | 测量/适配/三页淡入/命中 |
| 组件渲染 | `src/island/ComponentNode.vue:29-210,212-293,294-454` | 折叠规则/条件渲染/组件样式 |
| 消息面板 | `src/island/ClassicNotifications.vue:104-233` | 列表/详情/按钮语义 |
| 课程提醒条 | `src/island/LessonReminderContent.vue:59-123,195-317` | 5 区遮罩 360ms/错峰、文字 260/250/750ms |
| 课程提醒算法 | `src/main/lesson-reminder.ts:14-110` | 五类提醒窗口与 mask/ends 计算 |
| 天气 | `src/main/island-weather.ts:1-73` | Open-Meteo、8s、64KB、15min 缓存、退避 |
| 课件覆盖 | `src/main/island.ts:661-676,1420-1429`、`CoursewareTransfer.vue:12-65` | 最高优先级覆盖;424×132 |
| 配置读写 | `src/main/config.ts:26-84,198-233,235-346` | 默认值/归一化/合并写/flush |
| 布局 schema | `packages/shared/src/island-layout.ts:3-158,256-403` | 组件枚举/方案/行/节点/归一化上限 |
| 度量常量 | `packages/shared/src/island-layout.ts:19-36` | ClassIsland:40/12/8/0.5/14-20/5/0.05 |
| 消息常量 | `packages/shared/src/constants.ts:183-209,344-402` | 优先级、尺寸增量、排版系数、列表度量 |
| 设置页 | `src/renderer/views/settings/IslandSettingsView.vue:26-160` | 外观/布局/预览逻辑 |
| 编辑器 | `src/renderer/views/settings/IslandEditorView.vue:81-105,290-337,338-540` | 保存队列/应用/拖拽/上限 |
| 组件设置 | `src/renderer/components/IslandComponentSettings.vue:26-307` | 内容/外观/高级字段与范围 |
## 3. 与 Lead 口径的对齐(family / fixed 重新定义)
Lead 补充口径已并入 04/05:
1. `appearance.family: 'classisland' | 'winisland'` 新增,**新装默认 classisland**;**老用户升级默认 winisland**。落点:04 §4.0 第 5-6 条、§4.2 表、§4.3.1/4.3.2/4.3.3/4.3.4;05 §5.2/§5.4。
2. `fixed` 重新定义:classisland 下 fixed = ClassIsland 风格信息行(默认 1 行 = 日期 + 课程表、行高 40、圆角 8、不透明度 0.5、3px 进度条、消息行内气泡);原胶囊+详情卡只在 winisland 保留。落点:04 §4.3.2/4.3.3/4.3.4、05 §5.3 `FixedSchemeV2`。
3. 文件级改造已覆盖 `IslandApp.vue` 的大改:迁为 `family/winisland/ClassicIsland.vue`(winisland 行为不变),新增 `family/classisland/FixedInfoRow.vue` + `InlineMessageBubble.vue`,`LayoutIslandApp.vue` 四象限分发;`ClassicNotifications.vue` → `shell/MessagePanel.vue`(detail/list/inline 三形态),`LessonReminderContent.vue` → `shell/LessonBar.vue`。
4. 老 `style(black/glass/tinted)` 处理为兼容字段:新 canonical 字段 `appearance.winislandStyle`,读入优先新字段、回退旧字段,写出保留旧字段一个版本周期(05 §5.2/§5.10),避免旧配置文件解析断裂。
## 4. 未决项(需 Lead 或对应 part 拍板)
1. **fixed 信息行的默认行数与内容**:我按"1 行 = 日期 + 课程表"写入 05;03/07 若无异议需保持一致。是否允许默认再加"当前课程进度/倒计时"由 07 定。
2. **消息行内气泡的交互细节**:行内气泡点击后是"展开行内详情"还是"打开应用通知中心",以及多条气泡叠放/横向滚动规则,属 07/08 范围;04 只规定"业务状态机不变,只换表现"。
3. **classisland 的 Fluent/Classic 主题映射**:04 用 `appearance.theme: 'fluent'|'classic'` 占位;具体颜色/圆角/阴影 token 归 06/03,需确认是否与 ClassIsland XAML 资源字典逐值对应。
4. **行设置抽屉字段清单**:04/05 定义了行级 appearance/hideRules/progress 的最小集;抽屉的完整分组与控件归 09,需与 05 schema 对齐后再定稿。
5. **`style` 字段的移除时间**:建议 v3 移除;若 Lead 要求长期保留则改为永久兼容字段。
6. **smoke 断言改造归属**:现状大量断言依赖旧 DOM/几何(如"固定包围盒全程不变");本轮未改 smoke,改造清单只列"需按 family 分套",具体断言列表需 Lead 安排给验收负责人或在 11 部分细化。
7. **自定义方案在 winisland family 下的视觉**:04 §4.3.1 规定 custom 共用一套运行时、由 family 切样式变量;若希望 winisland 下有独立 custom 外观,需要再拆一套 CSS(当前判断为不必要)。
8. **classisland 信息行与"课程提醒"的叠加方式**:我规定提醒条作为行覆盖层出现、不替换常态行(02 §2.8 现状语义);07/08 若希望"提醒整行替换"需同步 05 的 fixed metrics。
9. **天气组件是否保留 Open-Meteo**:本轮只做岛重构,天气继续用现状实现(02 §2.9);ClassIsland 天气服务仅作语义参考,不引入其服务端数据模型。
10. **`schemaVersion` 与 `islandLayout.version` 的关系**:我定义为文件级 + 子结构级双版本;若 Lead 希望只保留一个版本号,需同步修改 05 §5.1 与 04 §4.3.12。
11. **编辑器 855 行拆分节奏**:04 要求先抽 composables 再改逻辑;若本轮排期紧,允许先抽 `useIslandDraft`,其余留到 M7。
12. **family 切换是否自动写 `winislandStyle`**:当前迁移会写;新装用户从 classisland 切到 winisland 时是否保留 `black` 默认由 09 的 UI 决定。
## 5. 静态分析纪律声明
- 全程只读:`read` 读文本、`grep`/`glob` 找文件、`Select-String`/`Get-Content` 做文本统计与结构梳理、`[regex]` 统计中文字符数。
- 未执行 `pnpm install/dev/build`、`electron`、`npm`、`verify:*`、截图、冒烟或任何会弹窗/占用屏幕的命令。
- 未修改 `repos/ClassIsland` 与 `repos/ClassHelper-master` 下任何文件;只写入了 `parts-r/02-current-state.md`、`parts-r/04-file-plan.md`、`parts-r/05-data-migration.md`、`analysis/refactor-current-state.md`。
- 证据标注口径:`packages/...:行号`(ClassHelper)与 `repos/ClassIsland/...:行号`;无法从源码直接确认的工程设计一律标【推断】。