Commit ceb1dc3ba2d41162c394bf3e154a089a051661ac
1 parent
5a5546ed
coding阶段直接生成代码,选择项自动取默认。
Showing
5 changed files
with
78 additions
and
21 deletions
skills/coding/fe-feature-brainstorm/SKILL.md
| @@ -20,8 +20,15 @@ allowed-tools: Read Write Skill AskUserQuestion Glob Grep | @@ -20,8 +20,15 @@ allowed-tools: Read Write Skill AskUserQuestion Glob Grep | ||
| 20 | 本 skill 写的 spec 是 CC 内部推理产物,不是用户审阅文档。**不允许** `【人工填写:...】` 占位符——A 阶段标记。需要具体值时: | 20 | 本 skill 写的 spec 是 CC 内部推理产物,不是用户审阅文档。**不允许** `【人工填写:...】` 占位符——A 阶段标记。需要具体值时: |
| 21 | 21 | ||
| 22 | 1. **先查** `.env.local` / `docs/07-环境配置.md` / `docs/04-技术规范.md` / `docs/06-UI交互规范.md` / `CLAUDE.md` / 现有代码 / 关联 prototype。值已落地某处 → 在 spec 中引用源 | 22 | 1. **先查** `.env.local` / `docs/07-环境配置.md` / `docs/04-技术规范.md` / `docs/06-UI交互规范.md` / `CLAUDE.md` / 现有代码 / 关联 prototype。值已落地某处 → 在 spec 中引用源 |
| 23 | -2. **再问**:查不到 → `AskUserQuestion` 问用户,记录答案到 spec | ||
| 24 | -3. **绝不**留 `【人工填写:】` 占位符 | 23 | +2. **再自决**:查不到 → 按"自主决策优先级"自行选定值,在 spec 中以 `自动选用 X(来源: <docs/06 Token / Ant Design 默认 / prototype 复刻 / ...>)` 注明 |
| 24 | +3. **最后才问**:上述两步均无合理推荐项时(如组件库未定型、跨页面交互重大歧义) → 才 `AskUserQuestion` | ||
| 25 | +4. **绝不**留 `【人工填写:】` 占位符 | ||
| 26 | + | ||
| 27 | +**自主决策优先级**(由高到低): | ||
| 28 | +1. `docs/06-UI交互规范.md` Design Tokens / `docs/04-技术规范.md § 一前端架构` 明文规定 | ||
| 29 | +2. 关联 prototype 中已落地的视觉/交互模式(保持复刻) | ||
| 30 | +3. 项目所选 UI 库(如 Ant Design / Element Plus)的官方默认与最佳实践 | ||
| 31 | +4. 最简、最少依赖、最易回滚的实现 | ||
| 25 | 32 | ||
| 26 | ## 执行步骤 | 33 | ## 执行步骤 |
| 27 | 34 | ||
| @@ -32,11 +39,12 @@ allowed-tools: Read Write Skill AskUserQuestion Glob Grep | @@ -32,11 +39,12 @@ allowed-tools: Read Write Skill AskUserQuestion Glob Grep | ||
| 32 | - **Design Tokens**:Read `docs/06-UI交互规范.md § 二`,作为色值/状态色的引用源 | 39 | - **Design Tokens**:Read `docs/06-UI交互规范.md § 二`,作为色值/状态色的引用源 |
| 33 | - **前端组件库**:Read `docs/04-技术规范.md § 零` 找 `frontend.ui_lib`(如 Ant Design / Element Plus),决定组件选型 | 40 | - **前端组件库**:Read `docs/04-技术规范.md § 零` 找 `frontend.ui_lib`(如 Ant Design / Element Plus),决定组件选型 |
| 34 | 41 | ||
| 35 | -2. **交互式 Q&A**(参考下方"Q&A 原则",本次为**前端阶段**头脑风暴): | 42 | +2. **自主决策为主,Q&A 为辅**(参考下方"Q&A 原则",本次为**前端阶段**头脑风暴): |
| 36 | - 关注:组件树、页面状态机、交互流程、API 调用一致性、Design Tokens 引用、业务校验前端复刻 | 43 | - 关注:组件树、页面状态机、交互流程、API 调用一致性、Design Tokens 引用、业务校验前端复刻 |
| 37 | - **不要**讨论 SQL / migration / controller / service / DTO(后端阶段已定) | 44 | - **不要**讨论 SQL / migration / controller / service / DTO(后端阶段已定) |
| 38 | - - **一次一问** `AskUserQuestion`,仅对真模糊点;多选题优先 | ||
| 39 | - - trade-off 直接内嵌 spec,**不设确认 gate** | 45 | + - **默认自动决策**:按"自主决策优先级"自行选定 approach,trade-off 内嵌 spec 并注明来源,**不弹问** |
| 46 | + - **仅在真硬阻塞时** `AskUserQuestion`:四级优先级都给不出合理推荐 + 决策影响重大(组件库未定型、跨页面状态同步选型、可访问性硬约束) → 一次一问、多选题优先 | ||
| 47 | + - **不设确认 gate** | ||
| 40 | 48 | ||
| 41 | 3. **写 spec 到 `docs/superpowers/specs/<YYYY-MM-DD>-<fe_id>.md`**: | 49 | 3. **写 spec 到 `docs/superpowers/specs/<YYYY-MM-DD>-<fe_id>.md`**: |
| 42 | - 按 `${CLAUDE_SKILL_DIR}/templates/fe-feature-spec-template.md` 渲染 | 50 | - 按 `${CLAUDE_SKILL_DIR}/templates/fe-feature-spec-template.md` 渲染 |
| @@ -60,11 +68,11 @@ allowed-tools: Read Write Skill AskUserQuestion Glob Grep | @@ -60,11 +68,11 @@ allowed-tools: Read Write Skill AskUserQuestion Glob Grep | ||
| 60 | 68 | ||
| 61 | ## Q&A 原则 | 69 | ## Q&A 原则 |
| 62 | 70 | ||
| 63 | -- **一次一问** — 不堆问题 | ||
| 64 | -- **多选题优先** — 答更快 | ||
| 65 | -- **仅对真模糊点问** — 不造确认问题 | 71 | +- **自主决策优先** — 默认按规范/惯例自行选推荐项写入 spec,不弹问;只有"真硬阻塞"才问 |
| 72 | +- **真硬阻塞 = 四级优先级都给不出合理推荐 + 决策影响重大**(组件库选型 / 跨页面状态同步 / 可访问性硬约束 / 不可逆 UX 选型) | ||
| 73 | +- **一次一问** — 真要问就不堆问题 | ||
| 74 | +- **多选题优先 + 标记推荐项** — 选项里把推荐项放第一并标注 `(Recommended)` | ||
| 66 | - **YAGNI** — 删不必要的功能 | 75 | - **YAGNI** — 删不必要的功能 |
| 67 | -- **渐进理解** — 不明白就问 | ||
| 68 | - **无审批 gate** — 写 spec 即 commit | 76 | - **无审批 gate** — 写 spec 即 commit |
| 69 | 77 | ||
| 70 | ## 参考 | 78 | ## 参考 |
skills/coding/fe-feature-plan/SKILL.md
| @@ -26,7 +26,10 @@ allowed-tools: Read Write Grep Skill AskUserQuestion | @@ -26,7 +26,10 @@ allowed-tools: Read Write Grep Skill AskUserQuestion | ||
| 26 | 每个 step 必须写实际内容。以下绝不出现: | 26 | 每个 step 必须写实际内容。以下绝不出现: |
| 27 | 27 | ||
| 28 | - `TBD` / `TODO` / `implement later` / `fill in details` | 28 | - `TBD` / `TODO` / `implement later` / `fill in details` |
| 29 | -- **`【人工填写:】`** — A 阶段标记。需要具体值时:先查 `.env.local` / `docs/07` / `docs/04` / `docs/09` / 现有代码并引用源;否则 `AskUserQuestion` | 29 | +- **`【人工填写:】`** — A 阶段标记。需要具体值时: |
| 30 | + 1. 先查 `.env.local` / `docs/07` / `docs/04` / `docs/06` / `docs/09` / 关联 prototype / 现有代码并引用源 | ||
| 31 | + 2. 查不到 → 按 `docs/06 Token` / prototype 复刻 / UI 库官方默认 / 最简实现 的优先级自主选定,在 plan 中以 `自动选用 X(来源: ...)` 注明 | ||
| 32 | + 3. 仅在四级都给不出合理推荐 + 决策影响重大时(组件库选型 / 跨页面状态同步 / 不可逆 UX)才 `AskUserQuestion` | ||
| 30 | - 涉及后端文件(`backend/` / `sql/` / `scripts/`)的任务——**硬护栏** | 33 | - 涉及后端文件(`backend/` / `sql/` / `scripts/`)的任务——**硬护栏** |
| 31 | - 未在任何 task 定义的组件 / hook / API client 函数 | 34 | - 未在任何 task 定义的组件 / hook / API client 函数 |
| 32 | 35 |
skills/coding/feature-brainstorm/SKILL.md
| @@ -18,8 +18,15 @@ allowed-tools: Read Write Skill AskUserQuestion Bash(mysql *) | @@ -18,8 +18,15 @@ allowed-tools: Read Write Skill AskUserQuestion Bash(mysql *) | ||
| 18 | 本 skill 写的 spec 是 CC 内部推理产物,不是用户审阅文档。**不允许** `【人工填写:...】` 占位符——A 阶段 `docs/01~10` / `CLAUDE.md` / `.env.local` 才用那个标记。需要具体值时: | 18 | 本 skill 写的 spec 是 CC 内部推理产物,不是用户审阅文档。**不允许** `【人工填写:...】` 占位符——A 阶段 `docs/01~10` / `CLAUDE.md` / `.env.local` 才用那个标记。需要具体值时: |
| 19 | 19 | ||
| 20 | 1. **先查** `.env.local` / `docs/07-环境配置.md` / `CLAUDE.md` / 现有代码。值已落地某处 → 在 spec 中引用源(例 "JWT_SECRET 从 `.env.local` 读取,`application.yml` 用 `${JWT_SECRET}` 注入") | 20 | 1. **先查** `.env.local` / `docs/07-环境配置.md` / `CLAUDE.md` / 现有代码。值已落地某处 → 在 spec 中引用源(例 "JWT_SECRET 从 `.env.local` 读取,`application.yml` 用 `${JWT_SECRET}` 注入") |
| 21 | -2. **再问**:查不到 → `AskUserQuestion` 问用户,记录答案到 spec | ||
| 22 | -3. **绝不**留 `【人工填写:】` 占位符;若 1 + 2 都解决不了,spec 必须写出具体阻塞点(不是泛化的人工填写标记),Q&A 继续直到解决 | 21 | +2. **再自决**:查不到 → 按"自主决策优先级"自行选定值,在 spec 中以 `自动选用 X(来源: <规范/惯例/现有代码>)` 注明 |
| 22 | +3. **最后才问**:上述两步均无合理推荐项时(如跨子系统的重大 trade-off、规范明确要求人工拍板的字段),才 `AskUserQuestion`,并记录答案到 spec | ||
| 23 | +4. **绝不**留 `【人工填写:】` 占位符;若 1~3 都解决不了,spec 写出具体阻塞点,Q&A 继续直到解决 | ||
| 24 | + | ||
| 25 | +**自主决策优先级**(由高到低): | ||
| 26 | +1. `docs/04-技术规范.md` / `docs/06-UI交互规范.md` / `CLAUDE.md` 明文规定 | ||
| 27 | +2. 现有代码已落地的同类模式(保持一致) | ||
| 28 | +3. 主流框架/库的官方推荐默认值 | ||
| 29 | +4. 最简、最少依赖、最易回滚的实现 | ||
| 23 | 30 | ||
| 24 | ## 执行步骤 | 31 | ## 执行步骤 |
| 25 | 32 | ||
| @@ -27,10 +34,11 @@ allowed-tools: Read Write Skill AskUserQuestion Bash(mysql *) | @@ -27,10 +34,11 @@ allowed-tools: Read Write Skill AskUserQuestion Bash(mysql *) | ||
| 27 | - REQ 卡片 `docs/01-需求清单/<module>/<req_id>.md` | 34 | - REQ 卡片 `docs/01-需求清单/<module>/<req_id>.md` |
| 28 | - 涉及的数据表定义(取自 docs/03 或实时 mysql 查询) | 35 | - 涉及的数据表定义(取自 docs/03 或实时 mysql 查询) |
| 29 | 36 | ||
| 30 | -2. **交互式 Q&A**(参考下方"Q&A 原则"): | 37 | +2. **自主决策为主,Q&A 为辅**(参考下方"Q&A 原则"): |
| 31 | - **先评估 scope**:单 spec 容纳得下吗?跨多个独立子系统(如"含登录 + 文件存储 + 计费 + 分析")→ 先提示分解,每个子项目独立 brainstorm | 38 | - **先评估 scope**:单 spec 容纳得下吗?跨多个独立子系统(如"含登录 + 文件存储 + 计费 + 分析")→ 先提示分解,每个子项目独立 brainstorm |
| 32 | - - **一次一问** `AskUserQuestion`,仅对真模糊点;多选题优先 | ||
| 33 | - - 决策完成后挑一种 approach;trade-off 直接内嵌 spec,**不设确认 gate** | 39 | + - **默认自动决策**:按"自主决策优先级"自行选定 approach,trade-off 直接内嵌 spec 并注明来源,**不弹问** |
| 40 | + - **仅在真硬阻塞时** `AskUserQuestion`:四级优先级都给不出合理推荐 + 决策影响重大(如核心契约、跨模块兼容、安全/合规) → 才一次一问、多选题优先 | ||
| 41 | + - **不设确认 gate** | ||
| 34 | 42 | ||
| 35 | 3. **写 spec 到 `docs/superpowers/specs/<YYYY-MM-DD>-<REQ-id>.md`**: | 43 | 3. **写 spec 到 `docs/superpowers/specs/<YYYY-MM-DD>-<REQ-id>.md`**: |
| 36 | - 按 `${CLAUDE_SKILL_DIR}/templates/feature-spec-template.md` 渲染 | 44 | - 按 `${CLAUDE_SKILL_DIR}/templates/feature-spec-template.md` 渲染 |
| @@ -51,12 +59,12 @@ allowed-tools: Read Write Skill AskUserQuestion Bash(mysql *) | @@ -51,12 +59,12 @@ allowed-tools: Read Write Skill AskUserQuestion Bash(mysql *) | ||
| 51 | 59 | ||
| 52 | ## Q&A 原则 | 60 | ## Q&A 原则 |
| 53 | 61 | ||
| 54 | -- **一次一问** — 不堆问题 | ||
| 55 | -- **多选题优先** — 答更快 | ||
| 56 | -- **仅对真模糊点问** — 不造确认问题 | 62 | +- **自主决策优先** — 默认按规范/惯例自行选推荐项写入 spec,不弹问;只有"真硬阻塞"才问 |
| 63 | +- **真硬阻塞 = 四级优先级都给不出合理推荐 + 决策影响重大**(核心契约 / 跨模块兼容 / 安全合规 / 不可逆架构选型) | ||
| 64 | +- **一次一问** — 真要问就不堆问题 | ||
| 65 | +- **多选题优先 + 标记推荐项** — 选项里把推荐项放第一并标注 `(Recommended)`,便于用户秒选 | ||
| 57 | - **YAGNI** — 删 spec 中不必要的功能 | 66 | - **YAGNI** — 删 spec 中不必要的功能 |
| 58 | -- **渐进理解** — 不明白就问 | ||
| 59 | -- **无审批 gate** — 写 spec 即 commit;分歧落地为具体 Q&A 项,不靠"等用户确认" | 67 | +- **无审批 gate** — 写 spec 即 commit;分歧落地为具体决策记录,不靠"等用户确认" |
| 60 | 68 | ||
| 61 | ## 参考 | 69 | ## 参考 |
| 62 | 70 |
skills/coding/feature-plan/SKILL.md
| @@ -27,7 +27,8 @@ allowed-tools: Read Write Grep Skill AskUserQuestion | @@ -27,7 +27,8 @@ allowed-tools: Read Write Grep Skill AskUserQuestion | ||
| 27 | - `TBD` / `TODO` / `implement later` / `fill in details` | 27 | - `TBD` / `TODO` / `implement later` / `fill in details` |
| 28 | - **`【人工填写:】`** — 这是 A 阶段标记(`docs/01~10` / `CLAUDE.md` / `.env.local`),B 阶段 plan **绝不能出现**。需要具体值时: | 28 | - **`【人工填写:】`** — 这是 A 阶段标记(`docs/01~10` / `CLAUDE.md` / `.env.local`),B 阶段 plan **绝不能出现**。需要具体值时: |
| 29 | 1. 先查 `.env.local` / `docs/07-环境配置.md` / `CLAUDE.md` / 现有代码并在 plan 中引用源 | 29 | 1. 先查 `.env.local` / `docs/07-环境配置.md` / `CLAUDE.md` / 现有代码并在 plan 中引用源 |
| 30 | - 2. 否则 `AskUserQuestion` 问用户并记录答案 | 30 | + 2. 查不到 → 按 `docs/04-技术规范.md` / 现有代码模式 / 框架官方推荐 / 最简实现 的优先级自主选定,在 plan 中以 `自动选用 X(来源: ...)` 注明 |
| 31 | + 3. 仅在四级都给不出合理推荐 + 决策影响重大时(核心契约 / 安全合规 / 不可逆架构)才 `AskUserQuestion` 并记录答案 | ||
| 31 | - "Add appropriate error handling" / "add validation"(要具体到哪些错误码 / 哪些字段) | 32 | - "Add appropriate error handling" / "add validation"(要具体到哪些错误码 / 哪些字段) |
| 32 | - "Similar to Task N"(相似任务各自写清楚测试意图 + 完成判据,不互相链接) | 33 | - "Similar to Task N"(相似任务各自写清楚测试意图 + 完成判据,不互相链接) |
| 33 | - 未在任何 task 定义的 types / functions / methods(类/方法首次出现的 task 必须给出 API 签名) | 34 | - 未在任何 task 定义的 types / functions / methods(类/方法首次出现的 task 必须给出 API 签名) |
skills/plan/skeleton-gen/templates/CorsConfig.java.template
0 → 100644
| 1 | +package com.xly.erp.config; | ||
| 2 | + | ||
| 3 | +import org.springframework.beans.factory.annotation.Value; | ||
| 4 | +import org.springframework.context.annotation.Bean; | ||
| 5 | +import org.springframework.context.annotation.Configuration; | ||
| 6 | +import org.springframework.web.cors.CorsConfiguration; | ||
| 7 | +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; | ||
| 8 | + | ||
| 9 | +import java.util.Arrays; | ||
| 10 | +import java.util.List; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * 全局 CORS 配置 —— 规则源见 docs/04 § 1.8。 | ||
| 14 | + * Spring Security 项目需在 SecurityFilterChain 启用: | ||
| 15 | + * http.cors(c -> c.configurationSource(corsConfigurationSource())); | ||
| 16 | + */ | ||
| 17 | +@Configuration | ||
| 18 | +public class CorsConfig { | ||
| 19 | + | ||
| 20 | + @Value("${app.cors.allowed-origins:*}") | ||
| 21 | + private String allowedOrigins; | ||
| 22 | + | ||
| 23 | + @Bean | ||
| 24 | + public UrlBasedCorsConfigurationSource corsConfigurationSource() { | ||
| 25 | + CorsConfiguration config = new CorsConfiguration(); | ||
| 26 | + config.setAllowedOriginPatterns(Arrays.asList(allowedOrigins.split(","))); | ||
| 27 | + config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); | ||
| 28 | + config.setAllowedHeaders(List.of("*")); | ||
| 29 | + config.setExposedHeaders(List.of("Authorization", "Content-Disposition")); | ||
| 30 | + config.setAllowCredentials(true); | ||
| 31 | + config.setMaxAge(3600L); | ||
| 32 | + | ||
| 33 | + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); | ||
| 34 | + source.registerCorsConfiguration("/**", config); | ||
| 35 | + return source; | ||
| 36 | + } | ||
| 37 | +} |