Skip to content

fix: 持久化数据改用 Host 统一目录 (ctx.paths.data_dir) - #19

Open
riesaexe wants to merge 1 commit into
xuqian13:mainfrom
riesaexe:fix/unified-plugin-data-dir
Open

riesaexe wants to merge 1 commit into
xuqian13:mainfrom
riesaexe:fix/unified-plugin-data-dir

Conversation

@riesaexe

Copy link
Copy Markdown

问题

MaiBot 1.2 起 Host 会为插件分配统一持久化目录,并在插件源码目录存在 data/ 时于每次启动打印:

[扩展插件] 插件 xuqian13.autonomous-planning-plugin-v4 检测到旧式数据目录
  <Maibot>/plugins/xuqian13_autonomous-planning-plugin-v4/data,
  建议迁移到统一持久化目录 <Maibot>/data/plugins/xuqian13.autonomous-planning-plugin-v4

Host 只警告、不迁移src/plugin_runtime/runner/runner_main.py:793),规范做法是插件读取 self.ctx.paths.data_dir(由 plugin_paths.py:46 分配)。但本插件全仓库未引用过 ctx.paths,路径写死在:

# plugin.py:191
data_dir = self._plugin_root / "data"   # = plugins/<插件目录>/data

结果:

  1. 统一目录 data/plugins/<plugin_id>/ 虽然被 Host 建出来了,但始终为空,警告每次启动必现;
  2. 更实质的风险是数据安全:数据写在插件源码树内,一次 git pull、重装或重新 clone 就会连带丢失。本机实测旧库已有 16 条 goals
  3. 注意只搬目录并不能修复,反而会丢数据——插件会立刻在源码目录重建一个空 goals.db 并继续使用它。

goals.db 外,还有 4 处数据/产物同样挂在源码目录:llm_logs/(3 处调用点)、next_day_prompt.jsonimages/schedule_today.jpg

改动

  • plugin.pyon_load 改为解析 ctx.paths.data_dir 并缓存到 self._data_dir__init__ 先给源码目录兜底,保证单测/standalone 行为不变)。新增一次性迁移 _migrate_legacy_data():旧 data/ 存在目标尚无 goals.db 时整体复制过去——用复制而非移动,旧文件保留作回退,迁移失败只告警、不阻断加载。
  • plugin.py:用统一目录初始化 GoalManager 单例。这一步必须做——各 service 都经 get_goal_manager() 取单例,若不在 on_load 固定其数据位置,仍会写回旧目录。
  • planner/goal_manager.pyget_goal_manager() 增加可选 data_dir 参数,仅在首次创建单例时生效。
  • schedule_generator.py / cleanup_service.py / tools_service.pyllm_logs 目录改从 _data_dir 取。
  • planner/auto_scheduler.pynext_day_prompt.json 缓存改从 _data_dir 取。
  • utils/schedule_image_generator.pygenerate_schedule_image() 增加 output_dir 参数,由 command_service 传入 _data_dir/images

ctx(单测 / standalone)时全部回退源码目录 data/,现有用法不受影响。

验证

  • 插件自带 20 项冒烟测试全通过(tests/run_smoke.py,20/20)。
  • 另用真实加载器语义(spec_from_file_location + submodule_search_locations)导入插件、注入真实 PluginContext,做了两层验证:_resolve_data_dir 的优先级与回退、迁移的复制语义与幂等性(目标已存在则不覆盖)、以及 on_loadgoals.db 确实落在统一目录、GoalManager 单例绑定正确。
  • 迁移实机数据后校验:pragma integrity_check = ok,16 条 goals 与目标名逐一比对一致,llm_logs 19 个文件全部到位。

备注

本 PR 只含上述改动,不含仓库既有工作区里那份 model=task_name= 的本地修复(对应 #18)。

合并后首次启动会自动把旧 data/ 复制到统一目录;确认无误后即可手动删除源码目录下的 data/,警告随之消失。

MaiBot 1.2 起 Host 会为插件分配统一持久化目录
(data/plugins/<plugin_id>/),并对源码目录下的 data/ 打印旧式用法警告。
本插件此前无视 ctx.paths,把数据写死在 plugins/<dir>/data/,导致:

- 每次启动触发 "检测到旧式数据目录" 警告;
- 数据落在插件源码树内,git pull / 重装 / 重新 clone 会连带丢失
  (实测本机已有 16 条 goals)。

改动:
- plugin.py: on_load 解析 ctx.paths.data_dir 并缓存到 _data_dir;
  另加一次性迁移——旧 data/ 存在且目标无 goals.db 时整体复制过去
  (复制而非移动,旧文件保留作回退;失败不阻断加载)。
  同时用统一目录初始化 GoalManager 单例,否则各 service 经
  get_goal_manager() 会写回旧目录。
- get_goal_manager() 增加可选 data_dir 参数(仅在首次创建单例时生效)。
- schedule_generator / cleanup_service / tools_service: llm_logs 目录
  改从 _data_dir 取。
- auto_scheduler: next_day_prompt.json 缓存改从 _data_dir 取。
- schedule_image_generator: generate_schedule_image 增加 output_dir 参数,
  由 command_service 传入 _data_dir/images。

无 ctx(单测/standalone) 时全部回退源码 data/,行为不变。
插件自带 20 项冒烟测试全通过。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant