- 重构版主提示词(14 parts,面向 ClassHelper 灵动岛重构) - ClassIsland 全量规格提示词(20 parts,含分卷与逐章版本) - 投喂指南、分卷、逐节文件 - 调研记录、一致性基线、生成与质检脚本
14 KiB
14 KiB
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:
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。fixed重新定义:classisland 下 fixed = ClassIsland 风格信息行(默认 1 行 = 日期 + 课程表、行高 40、圆角 8、不透明度 0.5、3px 进度条、消息行内气泡);原胶囊+详情卡只在 winisland 保留。落点:04 §4.3.2/4.3.3/4.3.4、05 §5.3FixedSchemeV2。- 文件级改造已覆盖
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。 - 老
style(black/glass/tinted)处理为兼容字段:新 canonical 字段appearance.winislandStyle,读入优先新字段、回退旧字段,写出保留旧字段一个版本周期(05 §5.2/§5.10),避免旧配置文件解析断裂。
4. 未决项(需 Lead 或对应 part 拍板)
- fixed 信息行的默认行数与内容:我按"1 行 = 日期 + 课程表"写入 05;03/07 若无异议需保持一致。是否允许默认再加"当前课程进度/倒计时"由 07 定。
- 消息行内气泡的交互细节:行内气泡点击后是"展开行内详情"还是"打开应用通知中心",以及多条气泡叠放/横向滚动规则,属 07/08 范围;04 只规定"业务状态机不变,只换表现"。
- classisland 的 Fluent/Classic 主题映射:04 用
appearance.theme: 'fluent'|'classic'占位;具体颜色/圆角/阴影 token 归 06/03,需确认是否与 ClassIsland XAML 资源字典逐值对应。 - 行设置抽屉字段清单:04/05 定义了行级 appearance/hideRules/progress 的最小集;抽屉的完整分组与控件归 09,需与 05 schema 对齐后再定稿。
style字段的移除时间:建议 v3 移除;若 Lead 要求长期保留则改为永久兼容字段。- smoke 断言改造归属:现状大量断言依赖旧 DOM/几何(如"固定包围盒全程不变");本轮未改 smoke,改造清单只列"需按 family 分套",具体断言列表需 Lead 安排给验收负责人或在 11 部分细化。
- 自定义方案在 winisland family 下的视觉:04 §4.3.1 规定 custom 共用一套运行时、由 family 切样式变量;若希望 winisland 下有独立 custom 外观,需要再拆一套 CSS(当前判断为不必要)。
- classisland 信息行与"课程提醒"的叠加方式:我规定提醒条作为行覆盖层出现、不替换常态行(02 §2.8 现状语义);07/08 若希望"提醒整行替换"需同步 05 的 fixed metrics。
- 天气组件是否保留 Open-Meteo:本轮只做岛重构,天气继续用现状实现(02 §2.9);ClassIsland 天气服务仅作语义参考,不引入其服务端数据模型。
schemaVersion与islandLayout.version的关系:我定义为文件级 + 子结构级双版本;若 Lead 希望只保留一个版本号,需同步修改 05 §5.1 与 04 §4.3.12。- 编辑器 855 行拆分节奏:04 要求先抽 composables 再改逻辑;若本轮排期紧,允许先抽
useIslandDraft,其余留到 M7。 - 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/...:行号;无法从源码直接确认的工程设计一律标【推断】。