- name
- generate-pi-task
- description
- 根据 MaaFramework Pipeline 定义生成或更新 Project Interface 任务 JSON。用于创建、编辑或扩展 assets/tasks/ 下的任务文件,将 Pipeline 节点映射为用户可配置选项(switch/select/checkbox/input)并绑定 pipeline_override。
- license
- MIT
- compatibility
- Designed for Claude Code
# MaaFramework Project Interface 任务生成
## 功能说明
- 读取 Pipeline JSON 文件,识别可切换节点(通常是含 `enabled` 字段的节点)。
- 分析节点关系,确定选项类型:`switch`、`select`、`checkbox`、`input`。
- 生成或更新 `assets/tasks/*.json`,遵循 `tools/schema/interface_import.schema.json`。
- 更新 `assets/interface.json` 的 `import[]`。
- 补充 `assets/locales/interface/` 下项目实际支持语言的 i18n 键。
## 使用场景
- 为 Pipeline 创建新的 Project Interface 任务文件。
- 向已有任务文件添加选项。
- 把 Pipeline 的可配置节点暴露为用户可选配置。
- 用户提到“生成任务”、“PI 任务”、“pipeline 选项”、“interface 任务”、“pipeline_override”。
## 工作流程
### 1. 读取规范文件
从当前项目读取:
1. `tools/schema/interface_import.schema.json` — 任务文件 schema。
2. `tools/schema/interface.schema.json` — 主 PI schema。
3. `tools/schema/pipeline.schema.json` — Pipeline 节点 schema。
如果 schema 路径不同,先按当前项目实际结构查找,不要硬编码。
### 2. 读取 Interface 上下文
1. 读取 `assets/interface.json`。
2. 读取 `import[]` 中已有任务文件,收集已有任务名和 option key,避免冲突。
3. 记录 `group[]` 定义,确认新任务应归属哪个分组。
4. 检查 `assets/locales/interface/` 实际有哪些语言文件;只维护项目已经存在的语言。
### 3. 确定目标文件
1. 当前活动文件在 `assets/tasks/` 且已被 `interface.json` import → 编辑该文件。
2. 当前活动文件是 Pipeline JSON → 从 `assets/resource/pipeline/{PipelineName}/` 推导 pipeline 名称,检查 `assets/tasks/{PipelineName}.json` 是否存在。
3. 无上下文 → 询问用户要为哪个 pipeline 生成。
4. 新建任务文件时,同步在 `assets/interface.json` 的 `import[]` 中添加相对路径,例如 `tasks/MyTask.json`。
### 4. 读取 Pipeline 文件
1. 读取 `assets/resource/pipeline/{PipelineName}/` 下相关 `.json` 文件。
2. 提取每个节点的:节点名、`enabled`、`next[]`、`desc`、`recognition`、`action`。
3. 构建节点图:通过 `next[]` 建立父→子映射,识别兄弟节点和嵌套选项。
4. 如果 Pipeline 跨目录引用公共节点,只把当前任务应由用户配置的业务节点纳入选项。
### 5. 确定选项类型
详见 [选项类型决策参考](references/option-types.md)。快速规则:
- 单个含 `enabled` 的独立节点 → `switch`。
- 同一父节点下互斥的 `enabled` 子节点 → `select`。
- 多个可同时启用的独立项目 → `checkbox`。
- 选择某个 case 后才显示的子选项 → 嵌套 `case.option[]`。
- 可配置数值/文本参数 → `input`,配合 `pipeline_type` 和 `「FieldName」` 引用。
### 6. 生成任务 JSON
严格遵循 `interface_import.schema.json`。典型结构:
```json
{
"task": [
{
"name": "PipelineName",
"label": "$task.PipelineName.label",
"entry": "PipelineName",
"description": "$task.PipelineName.description",
"option": ["OptionKey"],
"group": ["daily"]
}
],
"option": {
"OptionKey": {
"type": "switch",
"label": "$option.OptionKey.label",
"cases": [
{
"name": "Yes",
"pipeline_override": {
"TargetNode": {"enabled": true}
}
},
{
"name": "No",
"pipeline_override": {
"TargetNode": {"enabled": false}
}
}
]
}
}
}
```
## Locale 规则
向 `assets/locales/interface/` 下项目实际存在的语言文件补充键:
- `task.{Name}.label`
- `task.{Name}.description`
- `option.{OptionKey}.label`
- `option.{OptionKey}.{CaseName}` 或项目 schema 要求的 case label key
原则:
- 用户可见字符串使用 `$` i18n key,不在任务文件中硬编码显示文案。
- 中文描述可优先参考 Pipeline 节点的 `desc`。
- 其它语言无法确定官方译名时,给出合理占位并在回复中请用户确认。
- 只维护当前项目已有 locale 文件,不要凭空新增语言文件,除非用户明确要求。
## 注意事项
- `interface_import.schema.json` 才是任务文件 schema,不是 `interface.schema.json`。
- `entry` 必须与 Pipeline 入口节点名完全一致,区分大小写。
- `interface.json` 中的 import 路径通常相对 `assets/interface.json`,例如 `tasks/MyTask.json`。
- `enabled: false` 表示节点默认关闭,选项通常让用户将其开启。
- `enabled: true` 表示节点默认开启,选项通常让用户将其关闭。
- `switch` 的 cases 通常为 `Yes` 和 `No` 两个。
- `select` 的每个 case 需要启用自身节点,同时禁用同组互斥兄弟节点。
- `checkbox` 的每个 case 通常只启用自身节点,不禁用兄弟节点。
- 若项目已有同类任务采用不同顺序或 default_case,优先保持项目一致性。
## 验证清单
- [ ] JSON 语法合法。
- [ ] `task[].option[]` 的 key 都在 `option` 对象中存在。
- [ ] `case.option[]` 的嵌套引用都能解析。
- [ ] 所有 `pipeline_override` 目标节点在 Pipeline 文件中存在。
- [ ] 新任务文件已加入 `assets/interface.json` 的 `import[]`。
- [ ] 所有 `$...` locale key 在项目已有 interface locale 文件中存在。
- [ ] 选项默认值与 Pipeline `enabled` 默认状态一致。
GitHubで見る