已合并
fix(ops-direct-invoke): 对齐 DSL Skill 正式目录引用 #135
fix(ops-direct-invoke): 对齐 DSL Skill 正式目录引用 #135
已合并
xutianze创建于 14 天前
共 5 个文件变更+18-11
@@ -2,10 +2,15 @@
2 2 
3## 新特性3## 新特性
4 4 
5+### 【2026-10-13】
6+ 
7+- 对齐 [cannbot-skills PR1360](https://gitcode.com/cann/cannbot-skills/merge_requests/1360):六个 `cannbot-dsl-*` Skill 从公共仓的 `ops/` 安装,名称与工作流入口不变;`ops-design-paradigms` 已由 [PR1359](https://gitcode.com/cann/cannbot-skills/merge_requests/1359) 迁入同一正式目录。
8+- 方案设计节点显式向设计 Skill 提供规格文件路径、调用与导出契约及范式资料。所选 skills 版本需包含上述迁移;统一 init 默认自动更新,指定 SHA 或本地 skills 仓时由调用方选择兼容版本。
9+ 
5### 【2026-09-30】10### 【2026-09-30】
6 11 
7- 新增 **CANNBot-DSL 算子开发支持**:按开发语言选择 DSL 工作流,支持设计、动态实现子图生成、开发与验收。12- 新增 **CANNBot-DSL 算子开发支持**:按开发语言选择 DSL 工作流,支持设计、动态实现子图生成、开发与验收。
8-- DSL 的环境节点检查环境后生成对应 wheel 的 API 参考;性能优化完成后再生成最终版本的文档。13+- DSL 的环境节点记录环境证据,并使用本轮 `cannbot-dsl/docs` 作为 API 参考;性能优化完成后再生成最终版本的文档。
9- 提供 `ops-direct-invoke-maintain`,按模块记录工作流设计与维护约定。14- 提供 `ops-direct-invoke-maintain`,按模块记录工作流设计与维护约定。
10- 回归测试随维护 Skill 分发,修改工作流后运行完整测试;检查自身脚本和 harness 调用衔接,不重复验证框架内部调度。15- 回归测试随维护 Skill 分发,修改工作流后运行完整测试;检查自身脚本和 harness 调用衔接,不重复验证框架内部调度。
11- 安装与使用统一见 [QUICKSTART.md](QUICKSTART.md)。16- 安装与使用统一见 [QUICKSTART.md](QUICKSTART.md)。
@@ -21,12 +21,12 @@
21 "vendor/cannbot-skills/ops/ascendc-ut-develop",21 "vendor/cannbot-skills/ops/ascendc-ut-develop",
22 "vendor/cannbot-skills/ops/ascendc-whitebox-design",22 "vendor/cannbot-skills/ops/ascendc-whitebox-design",
23 "vendor/cannbot-skills/ops/cann-env-setup",23 "vendor/cannbot-skills/ops/cann-env-setup",
24- "vendor/cannbot-skills/community/ops/cannbot-dsl-env-check",24+ "vendor/cannbot-skills/ops/cannbot-dsl-env-check",
25- "vendor/cannbot-skills/community/ops/cannbot-dsl-op-design",25+ "vendor/cannbot-skills/ops/cannbot-dsl-op-design",
26- "vendor/cannbot-skills/community/ops/cannbot-dsl-unit-planner",26+ "vendor/cannbot-skills/ops/cannbot-dsl-unit-planner",
27- "vendor/cannbot-skills/community/ops/cannbot-dsl-test-generator",27+ "vendor/cannbot-skills/ops/cannbot-dsl-test-generator",
28- "vendor/cannbot-skills/community/ops/cannbot-dsl-best-practice",28+ "vendor/cannbot-skills/ops/cannbot-dsl-best-practice",
29- "vendor/cannbot-skills/community/ops/cannbot-dsl-code-reviewer",29+ "vendor/cannbot-skills/ops/cannbot-dsl-code-reviewer",
30 "vendor/cannbot-skills/ops/npu-arch",30 "vendor/cannbot-skills/ops/npu-arch",
31 "vendor/cannbot-skills/ops/ops-precision-standard",31 "vendor/cannbot-skills/ops/ops-precision-standard",
32 "vendor/cannbot-skills/ops/ops-profiling",32 "vendor/cannbot-skills/ops/ops-profiling",
@@ -100,7 +100,7 @@ AscendC 过程报告写入 `$WORK_DIR/`;CANNBotDSL 执行与验收过程报告
100 100 
101## cannbot-dsl 内容引用模板101## cannbot-dsl 内容引用模板
102 102 
103-Skill 源路径统一在插件的 [plugin-sources.json](../../plugin-sources.json) 的 `skills` 列表维护;DSL 能力从 `vendor/cannbot-skills/community/ops/` 与 `vendor/cannbot-skills/ops/`(ops-design-paradigms)导入。安装器按目录名注册 Skill,task 与动态实现子图只引用其 `SKILL.md` 中的名称。迁移 Skill 时同步源路径和调用名称,并确认依赖仓版本已包含这些目录。103+Skill 源路径统一在插件的 [plugin-sources.json](../../plugin-sources.json) 的 `skills` 列表维护;六个 `cannbot-dsl-*` Skill 与 `ops-design-paradigms` 均从 `vendor/cannbot-skills/ops/` 导入。安装器按目录名注册 Skill,task 与动态实现子图只引用其 `SKILL.md` 中的名称。迁移 Skill 时同步源路径,并在名称变化时更新调用名称;确认依赖仓版本已包含这些目录。
104 104 
105[op-dev](workflows/cannbot-dsl/op-dev.yaml) 是完整工作流模板:节点 id、depends_on、executor、verifier、max_retries、on_exhaust、rollback_to 和 subgraph 节点全部留在模板中,语义 id 不参与重新编号;normal 节点通过 `yaml` 键引用 `tasks/cannbot-dsl/` 下的内容 task,task 只含 title、goal、approach、procedure(可选)、acceptance、out_of_scope 六个内容字段,不包含任何调度字段。组装时按模板文件位置解析 task 路径,将内容字段合并进节点后剥离 `yaml` 键;模板与 task 同时定义同一字段、task 缺字段或合并后出现未知字段都会拒绝组装。内容字段为空列表的节点在组装时输出 warning 列出待补字段,不阻断生成。105[op-dev](workflows/cannbot-dsl/op-dev.yaml) 是完整工作流模板:节点 id、depends_on、executor、verifier、max_retries、on_exhaust、rollback_to 和 subgraph 节点全部留在模板中,语义 id 不参与重新编号;normal 节点通过 `yaml` 键引用 `tasks/cannbot-dsl/` 下的内容 task,task 只含 title、goal、approach、procedure(可选)、acceptance、out_of_scope 六个内容字段,不包含任何调度字段。组装时按模板文件位置解析 task 路径,将内容字段合并进节点后剥离 `yaml` 键;模板与 task 同时定义同一字段、task 缺字段或合并后出现未知字段都会拒绝组装。内容字段为空列表的节点在组装时输出 warning 列出待补字段,不阻断生成。
106- 所有组装输出都使用新文件,拒绝覆盖。恢复使用原完整 YAML 和 work_dir;新一轮使用新目录,保留前轮状态与证据。106- 所有组装输出都使用新文件,拒绝覆盖。恢复使用原完整 YAML 和 work_dir;新一轮使用新目录,保留前轮状态与证据。
@@ -5,9 +5,9 @@ approach:
5- 读取 `$WORK_DIR/design/doc/spec.yaml`、`$WORK_DIR/environment/environment.yaml` 和 `$WORK_DIR/environment/env_selected_soc.yaml`。环境为 `FAIL/blocked` 时按工作流政策停止。5- 读取 `$WORK_DIR/design/doc/spec.yaml`、`$WORK_DIR/environment/environment.yaml` 和 `$WORK_DIR/environment/env_selected_soc.yaml`。环境为 `FAIL/blocked` 时按工作流政策停止。
6- '`PASS/full` 时,读取选定 SoC 并结合 `npu-arch` 与运行时证据形成 `$WORK_DIR/environment/soc-info.yaml`;SKU 相关的核数、容量和带宽以实际证据为准。'6- '`PASS/full` 时,读取选定 SoC 并结合 `npu-arch` 与运行时证据形成 `$WORK_DIR/environment/soc-info.yaml`;SKU 相关的核数、容量和带宽以实际证据为准。'
7- '`WARNING/compile_only` 时,在设计中说明可设计和编译、不可执行 NPU 验证;按本工作流政策在设计后停止,不编造 SoC 或实测数据。'7- '`WARNING/compile_only` 时,在设计中说明可设计和编译、不可执行 NPU 验证;按本工作流政策在设计后停止,不编造 SoC 或实测数据。'
8-- 消费冻结的 `spec.yaml` 分类和语义,将环境、`$WORK_DIR/cannbot-dsl/docs` 文档目录、SoC 信息作为设计输入提供给 `cannbot-dsl-op-design`;不要求 Skill 接收固定路径、证据 schema 或调用其他 Skill。
9- 加载 `cannbot-dsl-best-practice` 的整体实现参考,提取公开调用与导出契约、共享构建依赖、资源存续范围及产物识别的验收条件,纳入 HostLaunch、API、Validation 和 DevView;具体接口示例注明版本与适用前提,支持的导出变体、Native 收集与产物命中转为后续实现和验证的明确义务。影响正确性、接口或实现可行性的依赖必须在本节点确认;无法确认时记录证据并终止。8- 加载 `cannbot-dsl-best-practice` 的整体实现参考,提取公开调用与导出契约、共享构建依赖、资源存续范围及产物识别的验收条件,纳入 HostLaunch、API、Validation 和 DevView;具体接口示例注明版本与适用前提,支持的导出变体、Native 收集与产物命中转为后续实现和验证的明确义务。影响正确性、接口或实现可行性的依赖必须在本节点确认;无法确认时记录证据并终止。
10- 加载 `ops-design-paradigms` Skill,提供冻结的 `op.paradigms` 与路由所需的 `dsl`,按 Skill 当前的组合优先、语言适配和按需展开规则获取设计知识;语言声明与匹配记录写入节点报告,资料的算法、能力与约束用于核对方案及其适用前提,沿用规格中的范式。9- 加载 `ops-design-paradigms` Skill,提供冻结的 `op.paradigms` 与路由所需的 `dsl`,按 Skill 当前的组合优先、语言适配和按需展开规则获取设计知识;语言声明与匹配记录写入节点报告,资料的算法、能力与约束用于核对方案及其适用前提,沿用规格中的范式。
10+- 加载 `cannbot-dsl-op-design`,提供规格文件 `$WORK_DIR/design/doc/spec.yaml`、环境、`$WORK_DIR/cannbot-dsl/docs` 文档目录、SoC 信息,以及本节点获取的调用与导出契约和范式资料,按其要求执行。规格文件路径由本工作流约定,范式资料由本节点提供;不要求设计 Skill 自行调用其他 Skill 或产出范式文档。
11- 设计正文以数学表达式、任务坐标、数据流、资源模型及算法伪代码描述方案;目标语言与 API 资料用于确认执行能力、接口与产物契约,参考代码保留适用范围、来源和抽象占位说明。11- 设计正文以数学表达式、任务坐标、数据流、资源模型及算法伪代码描述方案;目标语言与 API 资料用于确认执行能力、接口与产物契约,参考代码保留适用范围、来源和抽象占位说明。
12- 指定 `$WORK_DIR/design/doc/` 为设计输出目录,生成 `INDEX.md`、索引列出的主题文件及 `branches/DESIGN-BRANCH-*.md`。设计内容覆盖算法、接口、执行路径、资源、并行与同步、API、精度和边界验证。12- 指定 `$WORK_DIR/design/doc/` 为设计输出目录,生成 `INDEX.md`、索引列出的主题文件及 `branches/DESIGN-BRANCH-*.md`。设计内容覆盖算法、接口、执行路径、资源、并行与同步、API、精度和边界验证。
13- 在 Kernel 定义阶段调用次数、计算量、各层搬运量及重复次数,推导共用资源负载、串行依赖和预计瓶颈;在 TemplatePartition 代入代表规模比较可行候选,在 LaunchData 核对物理资源,在 Validation 给确认或推翻成本假设的观测。耗时估算与实测分别注明依据。13- 在 Kernel 定义阶段调用次数、计算量、各层搬运量及重复次数,推导共用资源负载、串行依赖和预计瓶颈;在 TemplatePartition 代入代表规模比较可行候选,在 LaunchData 核对物理资源,在 Validation 给确认或推翻成本假设的观测。耗时估算与实测分别注明依据。
@@ -324,8 +324,10 @@ for (const source of sources) {
324 const localSkills = readdirSync(join(repositoryRoot, "plugins-official", "ops-direct-invoke", "skills"))324 const localSkills = readdirSync(join(repositoryRoot, "plugins-official", "ops-direct-invoke", "skills"))
325 .filter((name) => existsSync(join(repositoryRoot, "plugins-official", "ops-direct-invoke", "skills", name, "SKILL.md")));325 .filter((name) => existsSync(join(repositoryRoot, "plugins-official", "ops-direct-invoke", "skills", name, "SKILL.md")));
326 assert.equal(record.skills.length, configured.skills.length + localSkills.length);326 assert.equal(record.skills.length, configured.skills.length + localSkills.length);
327- for (const name of ["cannbot-dsl-env-check", "cannbot-dsl-op-design", "cannbot-dsl-unit-planner", "cannbot-dsl-test-generator", "cannbot-dsl-best-practice", "cannbot-dsl-code-reviewer"]) {327+ for (const name of ["cannbot-dsl-env-check", "cannbot-dsl-op-design", "cannbot-dsl-unit-planner", "cannbot-dsl-test-generator", "cannbot-dsl-best-practice", "cannbot-dsl-code-reviewer", "ops-design-paradigms"]) {
328- assert.equal(existsSync(join(skillRoot(target, tool), name, "SKILL.md")), true, name);328+ const installedSkill = join(skillRoot(target, tool), name);
329+ assert.equal(existsSync(join(installedSkill, "SKILL.md")), true, name);
330+ assertSkillInstallation(installedSkill, source, "ops-direct-invoke", name);
329 }331 }
330 assert.equal(record.agents.length, 3);332 assert.equal(record.agents.length, 3);
331 assert.equal(record.sourcePackage, sourcePackage);333 assert.equal(record.sourcePackage, sourcePackage);