feat(BetterGI): 一条龙配置区文案统一为配置组并新增录制标签页 - #653
Conversation
审查者指南本 PR 将 BetterGI 一条龙配置区统一为“配置组”口径,并通过后端新增录制键鼠脚本扫描/API、扩展 keymouse 队列类型,配合前端录制标签页、选择交互、目录入口、黄色来源标识及多语言文案,使 KeyMouseScript 能像其他来源一样加入执行队列。 将 BetterGI 录制脚本添加到队列的时序图sequenceDiagram
participant User
participant BetterGIUserEdit
participant BetterGiService
participant API as get_bettergi_key_mouse_scripts_api
participant OneDragon as list_key_mouse_scripts
User->>BetterGIUserEdit: 打开添加配置组对话框
BetterGIUserEdit->>BetterGiService: getBettergiKeyMouseScriptsApiApiScriptsBettergiKeyMouseScriptsGet(scriptId)
BetterGiService->>API: GET /bettergi/key-mouse-scripts
API->>OneDragon: list_key_mouse_scripts(root)
OneDragon-->>API: KeyMouseScript JSON 文件名
API-->>BetterGiService: ComboBoxOut 候选项
BetterGiService-->>BetterGIUserEdit: 录制候选项
User->>BetterGIUserEdit: 点击或使用 Shift 选择录制脚本
BetterGIUserEdit-->>BetterGIUserEdit: 将 keymouse 项添加到队列
文件级变更
可能关联的 issue
提示和命令与 Sourcery 交互
自定义使用体验访问你的控制面板以:
获取帮助Original review guide in EnglishReviewer's Guide本 PR 将 BetterGI 一条龙配置区统一为“配置组”口径,并通过后端新增录制键鼠脚本扫描/API、扩展 keymouse 队列类型,配合前端录制标签页、选择交互、目录入口、黄色来源标识及多语言文案,使 KeyMouseScript 能像其他来源一样加入执行队列。 Sequence diagram for adding BetterGI recording scripts to the queuesequenceDiagram
participant User
participant BetterGIUserEdit
participant BetterGiService
participant API as get_bettergi_key_mouse_scripts_api
participant OneDragon as list_key_mouse_scripts
User->>BetterGIUserEdit: Open add config group dialog
BetterGIUserEdit->>BetterGiService: getBettergiKeyMouseScriptsApiApiScriptsBettergiKeyMouseScriptsGet(scriptId)
BetterGiService->>API: GET /bettergi/key-mouse-scripts
API->>OneDragon: list_key_mouse_scripts(root)
OneDragon-->>API: KeyMouseScript JSON filenames
API-->>BetterGiService: ComboBoxOut candidates
BetterGiService-->>BetterGIUserEdit: Recording candidates
User->>BetterGIUserEdit: Click or Shift-select recording scripts
BetterGIUserEdit-->>BetterGIUserEdit: Add keymouse items to queue
File-Level Changes
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
您好——我发现了 2 个问题
面向 AI Agent 的提示
请处理本次代码审查中的评论:
## 单独评论
### 评论 1
<location path="frontend/src/views/EditView/User/BetterGIUserEdit.vue" line_range="3173-3175" />
<code_context>
+const loadKeyMouseScripts = async () => {
+ try {
+ const resp =
+ await BetterGiService.getBettergiKeyMouseScriptsApiApiScriptsBettergiKeyMouseScriptsGet(
+ scriptId
+ )
+ keyMouseOptions.value = (resp.data || [])
+ .filter((item): item is ComboBoxItem & { label: string; value: string } =>
</code_context>
<issue_to_address>
**issue (bug_risk):** 前端引用了新添加的 `getBettergiKeyMouseScriptsApiApiScriptsBettergiKeyMouseScriptsGet` 服务方法和 `keyMouseScriptDir` 响应属性,但已提交的生成文件 `BetterGiService` 和 `BetterGIScriptDirsOut` 中都没有定义这两项,因此 TypeScript 构建会失败。
**建议修复:** 重新生成并提交前端 OpenAPI 服务和模型文件,或者手动添加该端点和响应属性。
</issue_to_address>
### 评论 2
<location path="frontend/src/views/EditView/User/BetterGIUserEdit.vue" line_range="3194-3196" />
<code_context>
const buildCandidates = () => {
+ // 录制 标签页候选:KeyMouseScript 目录下的键鼠脚本(与其他标签页一样可加入队列)
+ addModal.keyMouseCandidates = keyMouseOptions.value.map(opt => ({
+ kind: 'keymouse' as const,
+ key: opt.value,
+ }))
// addToGroupMode(配置组内添加脚本)只允许可执行的 JS 脚本目录与地图追踪路径;
// 原有自定义组(custom)不写入配置组 projects,故 JS脚本 标签仅列 js 候选。
</code_context>
<issue_to_address>
**issue (broader_impact):** 新添加的录制行会以 `keymouse` 类型持久化,但 `readStoredQueue` 只保留 `js`、`pathing` 和 `scriptgroup`;重新打开编辑器后,它会进入 `resolveStoredRowKind`,并被恢复为 `custom`,从而丢失录制源的身份信息,导致后续保存队列时写入错误的类型。
**触发条件:** 用户重新加载或重新打开包含队列录制脚本的编辑器时。
**建议修复:** 在 `readStoredQueue` 中保留 `rec.kind === 'keymouse'`,并在其他已存储行类型推断和序列化路径中加入对 keymouse 的支持。
</issue_to_address>Sourcery 评估
需要人工审查。 请先处理 2 个发现的问题;此外,新的录制条目可以被添加到单条龙队列并持久化,而错误的类型或名称可能导致自动化运行错误的脚本,或无法运行。回滚会移除该功能,但已保存的队列条目可能仍然存在,需要修正或重新生成。
阻塞性发现:frontend/src/views/EditView/User/BetterGIUserEdit.vue:3175、frontend/src/views/EditView/User/BetterGIUserEdit.vue:3196
Original comment in English
Hey - I've found 2 issues
Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments
### Comment 1
<location path="frontend/src/views/EditView/User/BetterGIUserEdit.vue" line_range="3173-3175" />
<code_context>
+const loadKeyMouseScripts = async () => {
+ try {
+ const resp =
+ await BetterGiService.getBettergiKeyMouseScriptsApiApiScriptsBettergiKeyMouseScriptsGet(
+ scriptId
+ )
+ keyMouseOptions.value = (resp.data || [])
+ .filter((item): item is ComboBoxItem & { label: string; value: string } =>
</code_context>
<issue_to_address>
**issue (bug_risk):** The frontend references the newly added `getBettergiKeyMouseScriptsApiApiScriptsBettergiKeyMouseScriptsGet` service method and `keyMouseScriptDir` response property, but the committed generated `BetterGiService` and `BetterGIScriptDirsOut` files do not define either one, so the TypeScript build fails.
**Suggested fix:** Regenerate and commit the frontend OpenAPI service and model files, or add the endpoint and response property manually.
</issue_to_address>
### Comment 2
<location path="frontend/src/views/EditView/User/BetterGIUserEdit.vue" line_range="3194-3196" />
<code_context>
const buildCandidates = () => {
+ // 录制 标签页候选:KeyMouseScript 目录下的键鼠脚本(与其他标签页一样可加入队列)
+ addModal.keyMouseCandidates = keyMouseOptions.value.map(opt => ({
+ kind: 'keymouse' as const,
+ key: opt.value,
+ }))
// addToGroupMode(配置组内添加脚本)只允许可执行的 JS 脚本目录与地图追踪路径;
// 原有自定义组(custom)不写入配置组 projects,故 JS脚本 标签仅列 js 候选。
</code_context>
<issue_to_address>
**issue (broader_impact):** A newly added recording row is persisted with kind `keymouse`, but `readStoredQueue` only preserves `js`, `pathing`, and `scriptgroup`; after reopening the editor it falls through to `resolveStoredRowKind` and is restored as `custom`, losing the recording source identity and causing a later queue save to write the wrong kind.
**Triggers:** When a user reloads or reopens an editor containing a recording script in the queue.
**Suggested fix:** Preserve `rec.kind === 'keymouse'` in `readStoredQueue`, and include keymouse in any other stored-row kind inference and serialization paths.
</issue_to_address>Sourcery assessment
Needs a human reviewer. 2 findings to address first, and the new recording entries can be added to and persisted in a one-dragon queue, and an incorrect kind or name could make the automation run the wrong script or fail to run. Reverting removes the feature, but already-saved queue entries may remain and would need to be corrected or regenerated.
Blocking findings: frontend/src/views/EditView/User/BetterGIUserEdit.vue:3175, frontend/src/views/EditView/User/BetterGIUserEdit.vue:3196
- 四类自定义项(配置组/录制/脚本/路径)统一物化为 MAS-{短id}-自定义配置组{N},前后名彻底解耦
- 新增自定义项执行层:经 --startGroups 逐个直连执行物化组,并从原生槽位剔除避免重复执行
- 修复含路径分隔符的路线名触发「配置组名非法」导致任务异常中断
- 修复 Pathing 项目 name/folderName 重复拼接导致路线文件找不到(DirectoryNotFoundException)
- 引用 BGI 已有配置组时以实配为底稿物化,四类行为一致
- 自定义组多实例:按「组名-{行uid}」区分,开关与设置各自独立(对齐战斗组实例机制)
- 物化改为逐 uid 进行(不再按名去重),同名多实例各自生成独立配置组
- 内置组不写实例名:BGI 只认内置基名,写实例名会导致任务不可识别与重复执行
- 右栏设置按实例名存 per-user 副本,非首实例未编辑时继承基名内容
- 修复含路径分隔符的路线名触发「配置组名非法」导致任务异常中断
- 修复 Pathing 项目 name/folderName 均填完整路径导致路线文件找不到
- 修复 settings.json 含 // 与 /* *\/ 注释时解析失败致设置项全空(JSONC 容错)
- 修复多选项以全角逗号存储时已存值无法回显;复选框字符串值误判为已勾选
- 控件类型改为按结构推断(有 options 出下拉、default 为布尔出开关),不再只认字面量
新用户无持久化队列时 initDragonList 走 else 分支从内置组重建行,但未回显 Plan 启用态,导致战斗项恒为默认开启、关闭后刷新即回弹;手动加一项使队列 非空后走 if 分支才会正确显示(即此 bug 的表象)。 在 else 分支补充与 readStoredQueue 一致的回显:战斗组按步骤名查 Plan 启用态, 自定义组缺省按管理表回退。
- 直控模式(非用户独立配置)下禁用执行层与自定义项执行层,只按所选实配名裸跑 BGI 一条龙,避免残留配置触发路径 B 执行层。 - 一条龙名称输入框的 @change 未同步回 formData,导致直控模式下名称改不动。 - 切换账号脚本本地缺失(首次使用/误删)时临时开启「命令行运行前同步更新」,修复首次启动切号失败。 - 单日代理次数的跨日重置从 main_task 前移到 check 入口,修复昨日跑满上限的用户次日被永久跳过(对齐 ZzzOd)。
|
下面按功能把 BetterGI 模块现状与项目专项适配规范( 1. 一条龙编排(Plan / 队列 / CustomGroups / 右栏字段映射)
2. 路径 B 自编排执行层
3. 配置组构造
4. per-user 物化与命名
5. 右栏任务设置面板
6. 队列来源与周期语义(本 PR 改动集中处)
7. 上游私有数据的读写
|
…t' into feat/bettergi-onedragon-queue-opt
BetterGI 一条龙「添加配置组」弹窗的「JS脚本」标签页按真实来源归类, 仅 custom 来源配置组入列,已加入一条龙的路径与录制项不再误显示。
打开「添加配置组」弹窗会把路径/录制名误写入 OneDragon.CustomGroups, 并被 appendCustomRows 监听器当成自定义配置组自动补进一条龙队列; addToDragon 不再把路径/录制写入 CustomGroups,initDragonList 与 appendCustomRows 仅镜像真实 custom 来源。
打开弹窗时 loadCustomGroupsFromBettergi() 会把 BetterGI 现有自定义组直接合并进管理表,触发监听器把整批组自动塞进一条龙队列。现改为仅作弹窗候选展示(JS脚本 标签页),用户显式确认才写入管理表并入队。 loadUser / 首次开启总开关 仍按需合并,属有意加载行为,保持不变。
one_dragon_plan.py 第 49 行用 Literal[...] 定义类型别名 StepKind,但仅从 typing 导入了 Any,未导入 Literal。该赋值在模块加载时即求值,导致导入模块时抛 NameError,编辑页点击配置组(如默认配置组)触发的 API 请求失败。 补充 `from typing import Literal` 并登记 CHANGELOG。
仅对 kind=scriptgroup 的配置组落地(用户确认先做 A): - 右侧栏项目编辑器工具栏新增「清空」按钮,带二次确认,一键移除当前配置组全部脚本项目并落库(复用 persistProjects)。 - 「添加脚本」此前已复用「添加配置组」弹窗:addToGroupMode 冻结「配置组」标签、仅 JS脚本/地图追踪/录制 三标签可加入、所选项依次追加到脚本队列末尾,本次无需改动。 - clearProjects 经 BettergiGroupProjectBody / BettergiGroupProjectEditor 两级 defineExpose 透出。 - 补充中/英/日 i18n 文案,登记 CHANGELOG。
将「添加脚本 / 移除脚本 / 清空」工具栏从仅 scriptgroup 扩展到录制(keymouse) 类真实配置组: - BettergiGroupProjectBody 放宽 isKeyMouse 只读限制(selectable、工具栏 v-if、行点击多选均放开),keymouse 与 scriptgroup 同样可编辑增删清空。 - openAddScriptToGroup 允许 sel.kind==='keymouse' 打开复用弹窗(冻结配置组标签、仅 JS脚本/地图追踪/录制 可加入)。 - js/路径 为独立单脚本、无对应 ScriptGroup json,维持原只读单项目展示,不开放工具栏(避免写入不存在的配置组破坏数据)。 - 登记 CHANGELOG。
js/路径 以 per-user ScriptGroup 副本充当可编辑配置组,复用既有的「添加脚本 / 移除脚本 / 清空」: - BettergiGroupProjectBody 的 isScriptGroup 扩展含 js/pathing(与 scriptgroup/keymouse 同视为可编辑配置组)。 - reload() 对 js/pathing 改调详情 API;无 per-user 副本时合成一个带 type/status/schedule 的可保存单项目(pathing 按相对路径解析 folderName/name,与 toScriptGroupProjectRow 一致)。 - openAddScriptToGroup 放行 js/pathing(弹窗冻结配置组标签、JS脚本/地图追踪/录制 三标签可加入)。 - 后端 get/save script-group 走 per-user 副本、运行时 materialize_user_script_groups 对四类一视同仁,故无需改后端、无需切换队列 kind:未编辑的 js/路径 仍按独立单脚本执行,编辑后即落盘多项目配置组由运行时物化。 - 登记 CHANGELOG。
未编辑的独立 JS 脚本或地图追踪路线误点「清空脚本」会被清空为不执行任何内容的空组;现这类独立项在加入其它脚本(成为真正配置组)前禁用清空与移除,仅「添加脚本」可将其纳入配置组。
- 撤回 CHANGELOG.md 与 res/version.json 的改动:普通 PR 不得改这两个生成物,它们只由发版 PR 更新;顺带消除合并 dev 时撞出的重复「### 修复」小节 - 新增 changelog.d/653.feat.md:把本 PR 的用户可见改动概括为一句
## 概述 BetterGI 专项新增「队伍配置」:可在「任务配置」下方为不同战斗场景分别指定队伍与战斗策略,战斗任务运行时按当前场景自动选用对应队伍。 ## 主要改动 - 新增「队伍配置」区域,可按自动秘境 / 自动地脉花 / 自动首领讨伐三类场景分别指派队伍与战斗策略 - 队伍条目支持排序、启用与停用、复制与删除,并可为每条填写备注 - 队伍与策略候选取自脚本自身的配置,战斗时按当前场景自动选用;留空则沿用原有取值链(右栏 per-任务 → 顶部通用队伍) ## 说明 本分支 stacked 在 #653 之上(一条龙配置区文案统一为配置组、新增录制标签页)。#653 合并后本 PR 会自动收窄为「队伍配置」,当前 diff 中的其余部分即 #653 的内容。 ## Sourcery 摘要 为 BetterGI 增加可按战斗场景自动选择队伍与战斗策略的配置能力。 新功能: - 为 BetterGI 增加按自动秘境、自动地脉花和自动首领讨伐场景配置队伍及战斗策略的功能。 - 提供队伍配置管理界面,支持启停、排序、复制、删除、备注和场景条件编辑。 - 在战斗运行时根据实际场景自动匹配队伍,并在多个队伍命中时随机选择且保持本次运行结果稳定。 增强功能: - 将场景选中的队伍和策略提升为高于任务及每周配置的运行时优先级,同时保留原有配置作为未命中时的回退链。 - 增加 BetterGI 自动战斗策略目录的路径解析和打开入口,并完善相关多语言文案。 测试: - 新增队伍场景解析、精确匹配、周配置还原、禁用过滤、随机选择和运行时覆盖等测试。 <details> <summary>Original summary in English</summary> ## Summary by Sourcery 为 BetterGI 增加可按战斗场景自动选择队伍与战斗策略的配置能力。 New Features: - 为 BetterGI 增加按自动秘境、自动地脉花和自动首领讨伐场景配置队伍及战斗策略的功能。 - 提供队伍配置管理界面,支持启停、排序、复制、删除、备注和场景条件编辑。 - 在战斗运行时根据实际场景自动匹配队伍,并在多个队伍命中时随机选择且保持本次运行结果稳定。 Enhancements: - 将场景选中的队伍和策略提升为高于任务及每周配置的运行时优先级,同时保留原有配置作为未命中时的回退链。 - 增加 BetterGI 自动战斗策略目录的路径解析和打开入口,并完善相关多语言文案。 Tests: - 新增队伍场景解析、精确匹配、周配置还原、禁用过滤、随机选择和运行时覆盖等测试。 </details>
概述
把 BetterGI 一条龙配置区的口径统一到「配置组」,并新增「录制」标签页,让 BetterGI 的键鼠脚本(KeyMouseScript)能像其他来源一样加入队列。
主要改动
Sourcery 摘要
通过支持可加入队列的键盘鼠标录制脚本,并统一相关术语,扩展 BetterGI 配置组管理功能。
新功能:
增强:
杂项:
Original summary in English
Sourcery 摘要
扩展 BetterGI 配置组管理功能,支持可加入队列的键鼠录制,并统一相关术语。
新功能:
Bug 修复:
改进:
文档:
杂项:
Original summary in English
Sourcery 摘要
统一 BetterGI 配置组术语,并在队列管理和执行过程中全面添加录制支持。
新功能:
错误修复:
改进:
文档:
日常维护:
Original summary in English
Sourcery 摘要
扩展 BetterGI 配置组队列管理,新增一流的键盘和鼠标录制支持,并统一相关术语。
新功能:
错误修复:
增强功能:
文档:
杂项:
Original summary in English
Sourcery 摘要
扩展 BetterGI 队列管理功能,支持可执行的键盘和鼠标录制,并统一配置组术语。
新功能:
错误修复:
改进:
文档:
杂项:
Original summary in English
Sourcery 摘要
扩展 BetterGI 配置组队列管理,新增一流的键盘和鼠标录制支持,并统一相关术语。
新功能:
错误修复:
改进:
文档:
杂项:
Original summary in English
Summary by Sourcery
Extend BetterGI configuration-group queue management with first-class keyboard-and-mouse recording support and unified terminology.
New Features:
Bug Fixes:
Enhancements:
Documentation:
Chores: