Dev GardenGreenhouse Notes
查看 Markdown 原件 打开原型
Project Recordnotes/refactor-handoff.md

结构改造交接 · 2026-09-11

本轮补充:交互归属与操作结果

发布补记:本节实现已随beta48-50发布,源码49bee0b。 正式入口仍是原开局;教程实验仅通过参数进入。游戏线上文件一致性、 桌面/手机的正常开局与弹窗操作已补测。下文“本地/未部署”保留为实施时记录。

白露复测后的补记

白露确认本批游戏无阻断问题,但发现浏览器测试可能误点上一步高亮。 已修正scripts/test-browser.cjs:每次转场等待具体目标,不再等待任意高亮。 入库分支明确等待花材库存;买盆、打开种子库、买种等转换也采用同一约束。 修复后重新跑完1440×900、1024×768、390×844、320×740的卖出/入库/跳过、 嵌套弹层和暂停刷新,以及file入口,全部通过,脚本错误为0。 src/README.md补充跨架构依赖隔离及测试等待约定。本次仅测试和记录更新, 不改变已发布的游戏源码49bee0b。

两项非阻断问题仍待处理,未声称修复:

  • 白露观察到打开任务窗后,引导文字可能晚约200–300ms隐藏;高亮已先清除。
  • 谜之花瓣由引导临时插入库存DOM,会被订单重绘覆盖;应改为订单渲染根据

已保存的教程状态绘制,并与未来蝴蝶结算入口一并核验,避免两处持有同一节点。

以上留在game-framework-options第7楼,暂不扩成本次发布的玩法修改。 返回温室自动对准目标是否过于晃动仍待真人反馈;不是已证实的逻辑错误。

本节为最新本地改动,覆盖下文涉及旧弹层栈、欢迎页滚动锁、侧面板交互未接入的历史状态。 尚未部署;正式版本仍以原发布记录为准。本轮不迁移引擎,不改开局实验数值, 也不实施另一帖的机器玩法。

  • src/ui/screen-ownership.ts 统一登记种子/设备、土壤面板、四类自定义模态层,

自动发现原生 dialog。共同提供工作区、交互归属、焦点循环与恢复、关闭顺序和滚动锁。 prototype/screen-ownership.js 是面板适配,overlay-shell.js 保留内容包装与原业务关闭回调。

  • 原生宿主与内部自定义窗口同帧打开时,先登记宿主;Escape 不再顺带关闭背景面板。

自定义模态层会拦截背景点击,面板保留公共导航可用。

  • 删除旧 overlay-stack.js 源码、生成物、引用和被新集成测试覆盖的旧单测;

删除 welcome-accessibility 中独立枚举弹窗的滚动锁。不是保留两套栈再加包装。

  • src/domain/action-result.ts 用可辨识联合类型规定播种/买种成功与失败结果。

plantSeed 与 buyStarterSeed 保留原扣料、定价和存档入口,新增占盆、 无效花盆、未知种子与存档冲突检查。失败不得推进或扣资源。 成功结果的 saved:false 表示已在内存生效但未持久化,不能当失败自动重试。 储存读取失败不让内存试玩崩溃;写入失败后仍检查其他页面的存档竞争。 有钱时再次买种仍是一次合法购买,不声称实现了全局请求去重。

  • src/domain/guided-progress.ts 接管买种后完成、普通种植后结束的进度恢复,

同时由操作入口与旧档归一化调用。通知不是存档,晚订阅或刷新仍读取权威状态。

  • 引导移除250ms业务轮询、散落的弹窗选择器和买种后1秒猜测;

由操作结果、实际渲染、交互归属变化与布局观察触发刷新。位置变化合并到一帧处理。 暂不修改1.2秒蝴蝶展示后的结算时机,三分支防重复发钱仍保留。

验证与边界

本轮实测:npm run verify 的类型、构建、104项审计及prototype smoke通过; npm run check:generated、文档构建(44篇)和diff格式检查通过。 npm run test:browser 在四种视口各完成卖出/入库/跳过, 嵌套弹层与暂停刷新检查通过,页面脚本错误为0;file入口启动和播种也通过。 已人工查看桌面/手机截图;这不是全部页面的逐像素基线,也不是自然游玩测试。

新增三个TS模块编译后合计10061字节(未压缩,不含适配层,也未扣除被删除代码); 这是模块构建测量,不是整包净增长或启动性能基准。Playwright只用于开发测试。

复现命令、测试视口、截图输出见src/README。 scripts/test-browser.cjs 使用锁定的 Playwright 开发依赖,实际操作页面, 覆盖此前未知的新弹窗、原生/自定义/面板三层嵌套、返回焦点和背景滚动; 不把源码匹配算成浏览器验收。花期用QA检查点,只验证交互和恢复,不据此判断乐趣。

这批完成的是公共交互约束及两个操作的真实接入,不是全项目TypeScript化: 其他购买/收获/自动化动作仍未全部迁入结果协议,legacy、完整存档与tick仍有共享状态。 侧面板的内容和CSS未在本轮全部重写。Safari/iOS真机触摸、自动像素差异、 性能基准和外部引导库对照尚未做,不宣称帧率或整体架构已经最优。 后续是否采用UI框架或引导库,应另有具体场景与证据,不因本轮收尾而永久排除。

当前状态:本轮候选验收通过,未全量迁移

发布更新:本轮游戏已作为beta48-49发布(e94a2a8),笔记站同步本记录。 下文“未发布”为此前验收阶段记录;重构边界不变。

白露在2026-09-11的tech-stack第23楼确认本轮可以收尾。 通过范围、未测项与四项非阻断遗留见白露验收清单。 当前未发布;完整存档、生产副作用和侧面板迁移仍非完成状态。 以下保留迭代过程中的历史描述;旧“待验收”表述以最新验收清单为准。

新增 numeric-control.ts 统一配花与补货输入的限值、取整、禁用与步进; growth-step.ts 实际接入 tickGarden,独立计算生长与压力,不持有全局状态、 时钟或随机数。原浇水/扣肥/访客/开花奖励与收播顺序保留。 完整生产 tick 仍未迁出,不将纯公式抽出称为整个模拟层完成。

文档入口收拢:根README和src/README按现有构建/模块边界更新,删除过时的九段运行时及旧赛事开放状态陈述。dev/README说明网页与源码的区别;dev/docs/README.md由文档生成器从同一清单输出,供GitHub直接阅读,README.html继续作为浏览器产物。修复未注册Markdown链接生成后相对路径错误,加入入口格式与链接存在性审计。这轮没有宣称生产tick或全部存档迁移完成。

存档边界继续迁移扩建分期:SaveBoundary.expansionFinance明确输入/输出类型,归一化总额、已付款、比例和去重完成项;legacy保留薄入口。正常分期行为不变,异常Infinity/NaN和非字符串完成项不进入状态。新增超额还款、已结清、异常输入测试。

植物几何后续:花苞悬空来自画布加高后茎仍固定65/88/62px,花头保持y=9。改为茎高=画布高度-底部6px-花冠锚点9px;删除手机和图鉴的独立茎高。plant-geometry.ts统一花头位置,新增86/94/124px画布锚点契约检查及CSS同步断言。未改变生长/产量规则;几何检查不等于真实截图验收。

图鉴页签后续:删除.tabs写死两列的布局,改为可见页签同一行等分,隐藏项不占格。src/ui/tabs.ts统一选中类、aria-selected、键盘焦点和左右/Home/End切换;图鉴三个页签共用状态更新,键盘跳过未解锁访客。新增tabs-unit覆盖这些行为及不再写死两列。真实多屏视觉仍待复测。

订单组件后续

林阿姨卡片贴边的根因是旧整行布局仍有padding:16px 0,覆盖了普通order-card的14px内边距。删除原lin-story/archived几何规则,而非再叠加一个更高优先级补丁。删除无人使用的lin-story-heading、lin-story-footer样式。

src/ui/order-parts.ts提供共享材料行和交付区,普通订单与人物委托实际调用。保留各自材料/奖励/禁用条件/业务事件,不改变故事或经济规则。林阿姨内容采用StableContent更新及去重绑定,保留展开中的来信节点。新的单元测试覆盖转义、材料不足/齐备、按钮禁用、两处真实接入及旧几何规则不再出现。

这批是订单相关组件收拢,不意味着购买行、步进器、全量tick迁移完成。真实多屏截图仍未验收。

以下为最新状态;后文保留迭代历史。

  • 运行时现在为10段:10-startup.js最后执行首次渲染和游戏/存档定时启动。02-bootstrap不再中途首次渲染,避免后续模块变量尚未初始化。
  • scripts/modules.json统一列出独立模块,build统一编译到ES2020,校验重复全局名与启动段顺序;生成目录自动创建。
  • src/domain/save-boundary.ts接管库存旧字段迁移、速度合法值、水务归一化。legacy入口为薄适配,原存档键不变。异常水务数值归零,防止NaN/Infinity污染界面。
  • 已撤回的plant-help/disclosure模块、绑定、偏好缓存、维护区和帮助样式已删除,不再编入游戏。旧测试替换为当前操作深度约束,不为被否定的设计保留产物。
  • 操作区保持平铺,继续使用稳定节点更新,不重新引入折叠。

尚未完成的明确边界

项目状态与下一步
完整存档模型只迁出部分边界,normalizeState/plot/event仍在legacy;需要逐字段兼容测试
生产与tick共享全局状态仍在,需把时钟、随机数、资源副作用作为显式依赖后逐段迁移
购买行与步进器还不是全站共用组件;迁移不得改变标签、尺寸和点击深度
种子/土壤侧面板未全量接入共享弹层;需要多屏开关、焦点与滚动验收
类型覆盖独立模块受严格检查(以scripts/modules.json为准),不是整个运行时TypeScript化
真实视觉本轮四种浏览器视口补测通过;真机触摸及讨论板实际渲染未测,范围见验收清单

当前改动仅本地,未发布。继续工作的依据是上述表,不以新增文件数量作为重构完成标准。

已落实

不换引擎、不引入界面框架。新增固定依赖的构建与类型检查入口,保留直接打开 HTML、现有全局适配器与存档格式。

原九千余行运行时拆入 src/legacy 九个有序源码段。首次迁移逐字节保持一致;随后将收成经济纯逻辑抽出为独立模块。prototype/game.js 由构建生成,不能再手工改它。

真正独立并严格检查类型的模块:导航状态、滚动锁、收成经济。纯单元测试不需要运行整个游戏。导航与欢迎适配层仍有集成测试。

构建包含语法检查;npm run check:generated 检查全部游戏和 UI 产物与源码一致,避免出现改了源码而用户仍在运行旧输出的问题。合作者规则已补入 AGENTS.md。

验证方式

npm ci 后执行 npm run verify。服务型讨论板测试单独执行,浏览器真机验收也单独记录。公式测试覆盖 2424 组鲜度与枝数;存档、自动化、开摊等仍沿用完整集成回归。

不夸大的部分

机械分段不是全部模块化。legacy 内部还共享全局状态,尚未变成全量类型化的 ES modules。存档与 tick 的拆离需要独立迁移测试,不能为了“重构完成”一次改掉这些高风险契约。

样式仍有历史覆盖,不宣称 CSS 所有权已完全整顿。真实设备视觉与触摸验证因当前工具对本地页面访问的限制仍未完成。下一次以园主与白露的实际测试核对,不拿源码断言替代截图。

本轮交付边界是:可维护源码入口、可重复构建、关键共享行为集中、回归测试保持通过。所有源文件与构建结果均在本地;本轮没有重新发布。

共享组件收拢

林阿姨链路继续迁移:src/domain/lin-correspondence.ts 是实际 TypeScript 源文件,包含人物进度类型、四种阶段联合类型、旧档输入校验/归一化、下一次来访及可读信件计算。legacy只保留状态适配与交付副作用,build将TS模块编译进既有classic runtime。独立TS测试直接验证回信时刻边界和旧档不能跳过后续委托,DOM适配测试验证等待置后/激活置前与不重复移动。不是全游戏已TypeScript化,也没有引入新的UI框架。

测试工具后续建议(尚未安装):优先补 Playwright 真实浏览器交互与截图基线,固定隔离存档、时间、随机种子及渲染环境;基线必须人工审核,不把当前错误画面批准为正确。axe检查可访问性作为补充,不代替真机触摸。TypeScript已有小范围checkJs,后续优先给状态、研究标识、订单和存档建立类型;JSON仍需运行时验证,类型不能证明CSS不重叠。参考:https://playwright.dev/docs/test-snapshots 、https://playwright.dev/docs/accessibility-testing 、https://www.typescriptlang.org/tsconfig/checkJs.html 。

说明、反馈、社区、任务四类弹层已接入 prototype/overlay-shell.js 与 ui-components.css:共用外壳、独立内容滚动区、关闭事件、键盘焦点循环、最上层 Escape 和返回焦点。业务关闭回调仍调用原函数,不改存档或任务处理。

src/ui/overlay-stack.js 独立维护实际打开顺序。修复原 Escape 同时关闭多层并清掉花盆选择的问题;花摊 native dialog 内打开其他面板时,把面板放到可交互的顶层宿主内,宿主关闭则一并正确退出,避免留下隐藏但锁滚动的面板。

清除约 50 个旧几何选择器,不保留四套弹层尺寸再用新样式覆盖。花摊的通用 header/button/input/select 等选择器限制在 .stall-header 和 .stall-workspace,不再污染公共导航或嵌套反馈。新组件拥有标题与滚动几何;业务样式只能管理内容。

归属表

职责唯一入口保留业务差异
弹层层级、关闭、焦点overlay-shell.js / overlay-stack.js原业务关闭函数
弹层大小、标题、内容滚动ui-components.css宽度变量与内容样式
背景滚动锁scroll-lock.js / welcome-accessibility.jsnative 与自定义显示状态
主导航与商店子导航workspace-shell.js / workspace-state.js工作区访问条件
收成经济harvest-economy.js原状态适配与植物数据

剩余购买行、步进器、进度展示和种子/土壤侧面板未全部迁入统一组件,不宣称全站组件收拢已经完成。这轮先验证共享弹层交互后继续迁移,以免失去视觉回归的归因。性能方面减少重复规则与关闭处理分支,但没有浏览器性能测量,不宣称帧率改善。

Flower-Stall Quantity Limits

The shared TypeScript domain module src/domain/production-capacity.ts calculates the minimum of material availability, vacant shelf slots and the existing five-bundle batch limit. Both stocking and restocking validate against this limit before consuming materials. The composer clamps numeric input and disables the increment control at the limit; stock or capacity changes refresh the controls without repainting bouquet art.

The independent market lab bundles the same module with its shelf adapter. Regression coverage includes material shortages, full shelves, recipe changes, inventory recovery and atomic rejection. DOM-stub tests are not visual or touch-device acceptance. These changes are local, not published.