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