--- name: require-dev-command-system overview: 设计 /require 和 /dev 双阶段指令系统及对应技能,实现从需求规格说明书到前后端代码生成的完整开发流程 todos: - id: create-cmd content: 创建 .workbuddy/CMD.md 指令规范文件,定义 /require 和 /dev 指令语法、参数、流程、示例 status: completed - id: create-require-skill content: 创建 require 技能:SKILL.md + 迁移 requirements-template.md status: completed dependencies: - create-cmd - id: update-backend-skill content: 增强 ruoyi-backend 技能:新增需求规格说明书驱动代码生成章节 status: completed dependencies: - create-require-skill - id: update-frontend-skill content: 增强 ykt-web-dev 技能:新增需求规格说明书驱动代码生成章节 status: completed dependencies: - create-require-skill - id: update-memory content: 更新 MEMORY.md,记录指令规范和技能体系 status: completed dependencies: - update-backend-skill - update-frontend-skill --- ## 产品概述 设计一套双阶段指令驱动的工作流,用于在 RuoYi-Cloud-Plus 项目中自动化生成业务功能的前后端代码。 ## 核心特性 - **`/require` 指令**:输入简要需求,调用 require 技能生成结构化需求规格说明书(Markdown),支持反复沟通迭代 - **`/dev` 指令**:基于已确认的需求规格说明书,调用后端技能 + 前端技能生成完整前后端代码 - **指令规范文件**:`CMD.md` 统一定义指令语法、参数、流程、示例 - **require 技能**:独立的技能,负责需求分析和文档生成 - **dev 技能升级**:在现有 ruoyi-backend 和 ykt-web-dev 技能基础上,增加按需求规格说明书驱动代码生成的能力 ## 工作流程 ``` 用户输入 /require ecs 课程 [简要需求] ↓ require 技能 → 分析需求 → 加载需求模板 → 生成需求规格说明书 ↓ 用户反复沟通/人工调整 → 最终确认 doc/ecs-course-requirements.md ↓ 用户输入 /dev ecs 课程 ↓ dev 技能 → 读取需求规格说明书 → 后端生成 + 前端生成 → 输出代码文件 ``` ## 路径约定 - 需求文档:`d:/dt_ykt/ykt_server/doc/[模块]-[功能名]-requirements.md` - 后端代码:`d:/dt_ykt/ykt_server/ruoyi-modules/ruoyi-[模块]/` - 前端代码:`d:/dt_ykt/ykt_web/src/` - 可通过参数手工指定前后端项目位置 ## 技术方案 ### 整体架构 ``` 指令层(CMD.md) ← 统一指令入口定义 │ ├── /require → require-skill ← 需求分析技能(新建) │ ├── SKILL.md │ └── references/requirements-template.md(从 ruoyi-backend 迁移) │ └── /dev → ruoyi-backend + ykt-web-dev ← 开发技能(现有,需增强) ├── 读取需求规格说明书 ├── ruoyi-backend:生成后端代码 └── ykt-web-dev:生成前端代码 ``` ### 1. 指令设计(CMD.md) **`/require` 指令**: ``` /require [模块] [功能名] [简要需求描述] ``` 参数说明: | 参数 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | | 模块 | 是 | 模块名(不含 ruoyi- 前缀) | ecs, backstage, system | | 功能名 | 是 | 功能简写(英文) | course, student | | 简要需求 | 否 | 自然语言描述,可多行 | 课程名称、课程类型(字典course_type)、学分、讲师(多对多) | 可选参数(通过标记指定): | 标记 | 说明 | 示例 | | --- | --- | --- | | `--table=表名` | 指定主表名 | `--table=t_ecs_course` | | `--sub-table=表名` | 指定从表名 | `--sub-table=t_ecs_course_teacher` | | `--no-tenant` | 非多租户 | `--no-tenant` | | `--no-import` | 不需要导入导出 | `--no-import` | 示例: ``` /require ecs 课程 课程名称、课程编码、课程类型(字典course_type)、学分、学时、讲师(多对多关联) --sub-table=t_ecs_course_teacher ``` **`/dev` 指令**: ``` /dev [模块] [功能名] [选项] ``` 参数说明: | 参数 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | | 模块 | 是 | 模块名 | ecs | | 功能名 | 是 | 功能简写 | course | | --backend=路径 | 否 | 后端项目路径,默认 d:/dt_ykt/ykt_server | --backend=d:/other/server | | --frontend=路径 | 否 | 前端项目路径,默认 d:/dt_ykt/ykt_web | --frontend=d:/other/web | | --backend-only | 否 | 仅生成后端 | --backend-only | | --frontend-only | 否 | 仅生成前端 | --frontend-only | 示例: ``` /dev ecs 课程 /dev ecs 课程 --frontend=d:/other/web /dev ecs 课程 --backend-only ``` ### 2. require 技能设计 **位置**:`d:/dt_ykt/ykt_server/.workbuddy/skills/require/` **职责**: 1. 接收用户的简要需求描述 2. 加载需求规格说明书模板(`references/requirements-template.md`) 3. 分析简要需求,自动推断: - 字段类型、查询方式、表单组件 - 字典字段识别(用户描述中带"字典"、"下拉"的) - 关联字段识别(用户描述中带"关联"、"选择XX"的) - 主从表关系(用户描述中带"多对多"、"一对多"的) 4. 生成结构化的需求规格说明书 5. 输出到 `doc/[模块]-[功能名]-requirements.md` **SKILL.md 核心流程**: ``` 1. 解析指令参数(模块、功能名、简要需求) 2. 加载 requirements-template.md 模板 3. 分析简要需求,填充模板: a. 基础信息:模块路径、表名推断(t_{模块}_{功能名}) b. 接口清单:默认 CRUD + 导入导出 c. 字段清单:逐字段解析,推断属性 d. VO 结构:根据 inTable/inForm 字段自动组装 e. 特殊需求:根据标记推断 4. 输出需求规格说明书到 doc/ 目录 5. 提示用户确认或修改 ``` **需求分析推断规则**: | 用户描述 | 推断结果 | | --- | --- | | "名称" | fieldType=String, component=input, inQuery=true, queryType=like | | "类型(字典xxx)" | fieldType=Integer, dictType=xxx, component=select | | "编码" | fieldType=String, component=input, inQuery=true, queryType=like, required=true | | "学分/分数" | fieldType=BigDecimal, component=inputNumber | | "数量/人数" | fieldType=Integer, component=inputNumber | | "时间/日期" | fieldType=LocalDateTime, component=datetime | | "备注/描述" | fieldType=String, component=textarea | | "状态" | fieldType=Integer, dictType=status, component=select | | "讲师/教师(多对多)" | 生成从表,relation 配置 | | "排序" | fieldType=Integer, component=inputNumber | | "来源" | fieldType=Integer, dictType=data_source, component=select | ### 3. dev 技能增强设计 **后端技能增强**(ruoyi-backend): - 新增「从需求规格说明书生成代码」的工作流程 - 读取 `doc/[模块]-[功能名]-requirements.md` - 按需求文档的字段清单生成 Domain/Bo/Vo/Mapper/Service/ServiceImpl/Controller - 按需求文档的特殊需求决定是否生成 ImportVo/ImportListener/Dubbo 接口 **前端技能增强**(ykt-web-dev): - 新增「从需求规格说明书生成代码」的工作流程 - 读取同一份需求规格说明书 - 按 inTable 字段生成列表页(index.vue) - 按 inForm 字段生成表单页(form.vue / detail.vue) - 按 dictType 生成字典引用代码 - 按 relation 生成关联选择组件 - 生成 API 接口(index.ts)和类型定义(types.ts) ### 4. 文件清单 #### 新建文件 | 文件路径 | 说明 | | --- | --- | | `d:/dt_ykt/ykt_server/.workbuddy/skills/require/SKILL.md` | require 技能主文件 | | `d:/dt_ykt/ykt_server/.workbuddy/skills/require/references/requirements-template.md` | 需求模板(从 ruoyi-backend/references/ 迁移) | | `d:/dt_ykt/ykt_server/.workbuddy/CMD.md` | 指令规范文件(全局,位于 .workbuddy 根目录) | #### 修改文件 | 文件路径 | 修改内容 | | --- | --- | | `d:/dt_ykt/ykt_server/.workbuddy/skills/ruoyi-backend/SKILL.md` | 新增「从需求规格说明书驱动代码生成」章节 | | `d:/dt_ykt/ykt_web/.workbuddy/skills/ykt-web-dev/SKILL.md` | 新增「从需求规格说明书驱动代码生成」章节 | ### 5. 需求规格说明书与代码生成的映射关系 ``` 需求规格说明书 → 后端生成文件 ───────────────────────────────────────────────── 基础信息.模块 → 包路径 org.dromara.{module} 基础信息.主表名 → @TableName, Domain 类 基础信息.从表名 → 从表 Domain/Bo/Vo/Mapper/Service 基础信息.是否多租户 → extends TenantEntity / BaseEntity 字段清单(inDb=true) → Domain 字段 字段清单(必填) → Bo 校验注解 @NotNull/@NotBlank 字段清单(inTable=true) → Vo @ExcelProperty + 列表展示 字段清单(dictType) → Vo @ExcelDictFormat, 前端字典下拉 字段清单(relation) → 前端关联选择组件 字段清单(inDb=false) → Vo 纯计算字段(如 teacherNames) 接口清单 → Controller 方法 特殊需求.excelImport → ImportVo + ImportListener 特殊需求.dubboExpose → RemoteService + RemoteServiceImpl 需求规格说明书 → 前端生成文件 ───────────────────────────────────────────────── 基础信息.功能简写 → api/{module}/{name}/, views/{module}/{name}/ 字段清单(inTable=true) → index.vue 表格列 字段清单(inQuery=true) → index.vue 搜索栏 字段清单(inForm=true) → form.vue 表单项 字段清单(dictType) → useDict() + el-select 字段清单(relation) → 关联选择弹窗 字段清单(component) → 对应 Element Plus 组件 接口清单 → api/index.ts 接口函数 VO 结构 → api/types.ts 类型定义 ```