# 个人工具箱 (Personal ToolBox) - 补充需求文档
**特性模块：** 一键多开 / 工具组合 (Batch Execution / Tool Groups)
**文档版本：** V1.1 增量补充包

## 一、 需求分析与交互设计
1. **核心概念提取**：引入“**组合卡片 (Group Card)**”的概念。它在 UI 上的表现形式与普通应用卡片一致（同属一个网格布局，可被搜索、可绑定快捷键），但它的动作不是启动单一路径，而是批量触发其他已有工具的启动事件。
2. **UI/UX 变更**：
   * **主界面**：在原本的“添加工具”按钮旁，新增“**添加组合**”按钮。
   * **卡片视觉区分**：如果是组合卡片，UI 上需有视觉提示（例如：图标右下角有一个叠层的小角标，或者副标题显示“包含 3 个应用”）。
   * **组合编辑弹窗**：新增一个弹窗，用户可输入组合名称、选择图标，并通过**复选框列表 (Checkboxes)** 勾选当前工具箱中已存在的其他工具。

## 二、 数据模型与架构变更 (SDD)
为了最小化对现有代码的破坏，我们**不创建新的主模型**，而是直接扩展现有的 `ToolItem` 模型。

### 2.1 数据模型扩展 (`ToolItem.cs`)
在原有属性基础上，增加两个字段：
* `IsGroup` (bool): 标记该卡片是否为组合卡片。默认为 `false`。
* `SubToolIds` (List<string>): 当 `IsGroup` 为 `true` 时，存储需要批量启动的子工具的 `Id` 列表。

**变更后的 `config.json` 示例：**
```json
{
  "Tools": [
    {
      "Id": "uuid-001",
      "Name": "VS Code",
      "Path": "C:\\vscode.exe",
      "IsGroup": false
    },
    {
      "Id": "uuid-002",
      "Name": "晨间工作流 (一键多开)",
      "IconCode": "f0e8",
      "IsGroup": true,
      "SubToolIds": ["uuid-001", "uuid-another-id"],
      "CategoryId": "1",
      "HotKey": "Ctrl+Shift+W"
    }
  ]
}
```

### 2.2 执行逻辑演进 (`ProcessExecutionService.cs`)
执行服务需要加入递归或循环逻辑：
1. 接收到 `ToolItem` 后，判断 `IsGroup`。
2. 若为 `false`，走原有的单进程启动逻辑。
3. 若为 `true`，遍历 `SubToolIds`，从全局数据中查找到对应的 `ToolItem`。
4. **防卡顿机制**：通过 `async/await` 和 `Task.Delay(500)`，在每次启动应用之间加入 500 毫秒的延迟，防止瞬间拉起大量进程导致系统假死。
5. **孤儿数据容错**：如果子工具被删除了（通过 ID 找不到），直接跳过并打印一条日志，不中断整个多开流程。

---

> "我们现在要补充一个非常关键的需求：**Phase 6: 一键多开 (工具组合) 功能**。
> 用户希望创建一个特殊的卡片，点击它时可以同时打开多个已配置的工具。为了保证与之前架构兼容，请帮我按以下步骤修改：
> 
> **1. 更新数据模型 (`ToolItem.cs`)：**
> - 新增属性 `public bool IsGroup { get; set; }`
> - 新增属性 `public ObservableCollection<string> SubToolIds { get; set; } = new();`
> 
> **2. 更新执行逻辑 (`ProcessExecutionService.cs`)：**
> - 将 `Execute` 方法改为异步方法 `public async Task ExecuteAsync(ToolItem item)`。
> - 在方法内部增加逻辑：如果 `item.IsGroup == true`，则遍历 `item.SubToolIds`，通过 `IDataService` 获取对应的子 `ToolItem`。
> - 使用 `foreach` 循环执行子工具。为了防止系统卡顿，每次拉起进程后加入 `await Task.Delay(500)`。
> - 如果通过 ID 找不到子工具（可能被删除了），调用 `ILogService` 打印警告：“组合启动跳过：找不到 ID 为 xxx 的工具”，并继续执行下一个。
> 
> **3. UI 与交互更新 (`MainWindow.xaml` & `MainViewModel.cs`)：**
> - 在主界面“添加工具”按钮旁边，新增一个“添加组合 (Add Group)”按钮。
> - 为组合卡片在 UI 上增加视觉区分：在 `ItemsControl` 的卡片 DataTemplate 中，利用 `DataTrigger` 绑定 `IsGroup` 属性。如果为 true，显示一个形如“📦 组合”的 Badge 或角标文字。
> 
> **4. 新增组合编辑弹窗 (`GroupEditWindow.xaml`)：**
> - 创建一个新的弹窗用于编辑组合。
> - 包含：组合名称、图标、所属分类、快捷键。
> - 核心：一个包含当前所有非组合工具（`IsGroup == false`）的列表，每项前面带有一个 `CheckBox`。用户勾选后，保存时将选中的工具 ID 存入 `SubToolIds`。