Commit ceb1dc3ba2d41162c394bf3e154a089a051661ac

Authored by yanghl
1 parent 5a5546ed

coding阶段直接生成代码,选择项自动取默认。

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 +}