From fbc5af8685d0c19fa95a40d09d5a7a81ee21fe3d Mon Sep 17 00:00:00 2001 From: wwj Date: Wed, 25 Feb 2026 11:14:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=20=20=E6=96=B0=E5=A2=9E=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=A1=8C=E6=95=B0=E9=99=90=E5=88=B6=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=92=8C=E6=89=B9=E9=87=8F=E6=9F=A5=E8=AF=A2=E8=A7=84=E8=8C=83?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E5=90=8C=E6=AD=A5=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增文件行数限制规则(Java 300/Go 400/Vue 200/TS 300/Python 300) - Java 开发规范新增批量查询规范(IN 子句 ≤ 500,分批查询工具方法) - 优化同步配置脚本,改为删除旧目录+整体复制策略 --- .claude/rules/file-size-limit.md | 36 ++++++++ .claude/skills/java-dev/SKILL.md | 29 ++++++ sync-config.bat | 151 ++++++++++--------------------- sync-config.sh | 138 +++++++++------------------- 4 files changed, 156 insertions(+), 198 deletions(-) create mode 100644 .claude/rules/file-size-limit.md diff --git a/.claude/rules/file-size-limit.md b/.claude/rules/file-size-limit.md new file mode 100644 index 0000000..dafb5c0 --- /dev/null +++ b/.claude/rules/file-size-limit.md @@ -0,0 +1,36 @@ +--- +paths: "**/*.{go,java,vue,tsx,jsx,ts,js,py}" +--- +# 文件行数限制 + +> 控制单文件复杂度,减少 token 消耗,提升可维护性。 + +--- + +## 行数上限 + +| 语言 | 上限 | 说明 | +|------|------|------| +| Java | 300 行 | Spring 分层清晰,超过说明职责过多 | +| Go | 400 行 | 错误处理导致偏长,但超过 400 应拆分 | +| Vue | 200 行 | 样式已抽到 assets/styles,模板+逻辑 200 行足够 | +| TSX/JSX | 200 行 | 同 Vue | +| TypeScript/JS | 300 行 | 工具类、服务类 | +| Python | 300 行 | 模块化拆分 | + +## 超限时的处理 + +**新建文件时**:预估超限则提前拆分,不要写完再拆 + +**修改现有文件时**: +- 不强制重构现有大文件 +- 新增功能如果会导致超限,拆到新文件 + +## 拆分指引 + +| 语言 | 拆分方式 | +|------|---------| +| Java | Service 拆分职责、提取 Helper/Converter 类 | +| Go | 按功能拆分同包文件(如 `user_query.go`、`user_update.go`) | +| Vue | 提取子组件、composables、样式到 assets/styles | +| TS/JS | 提取工具函数、常量、类型到独立文件 | diff --git a/.claude/skills/java-dev/SKILL.md b/.claude/skills/java-dev/SKILL.md index 321a1c0..d27f83f 100644 --- a/.claude/skills/java-dev/SKILL.md +++ b/.claude/skills/java-dev/SKILL.md @@ -101,6 +101,35 @@ public class UserDTO { --- +## 批量查询规范 + +| 规则 | 说明 | +|------|------| +| ❌ 禁止 IN 子句超过 500 个参数 | SQL 解析开销大,执行计划不稳定 | +| ✅ 超过时分批查询 | 每批 500,合并结果 | +| ✅ 封装通用工具方法 | 避免每处手写分批逻辑 | + +```java +// ❌ 1700 个 ID 一次查询 +List users = userRepository.findByIdIn(allIds); // IN 子句过长 + +// ✅ 分批查询工具方法 +public static List batchQuery(List params, int batchSize, + Function, List> queryFn) { + List result = new ArrayList<>(); + for (int i = 0; i < params.size(); i += batchSize) { + List batch = params.subList(i, Math.min(i + batchSize, params.size())); + result.addAll(queryFn.apply(batch)); + } + return result; +} + +// 使用 +List users = batchQuery(allIds, 500, ids -> userRepository.findByIdIn(ids)); +``` + +--- + ## 异常处理 ```java diff --git a/sync-config.bat b/sync-config.bat index 3cec8d1..ccdd230 100644 --- a/sync-config.bat +++ b/sync-config.bat @@ -3,119 +3,66 @@ setlocal enabledelayedexpansion REM 同步 .claude 和 .gemini 配置到用户根目录 -REM 获取用户根目录 set "HOME_DIR=%USERPROFILE%" - -REM 当前脚本所在目录 set "SCRIPT_DIR=%~dp0" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" -REM 需要同步的目录 -set "SYNC_DIRS=.claude .gemini" - -REM 全局覆盖策略(空表示每次询问,yes表示全部覆盖,no表示全部跳过) -set "OVERWRITE_ALL=" - echo === 配置同步工具 === echo 源目录: %SCRIPT_DIR% echo 目标目录: %HOME_DIR% echo. -for %%d in (%SYNC_DIRS%) do ( - call :sync_directory "%%d" +REM --- Claude Code --- +if exist "%SCRIPT_DIR%\.claude" ( + echo [Claude Code] 开始同步 + + REM 确保目标目录存在 + if not exist "%HOME_DIR%\.claude" mkdir "%HOME_DIR%\.claude" + + REM 删除旧配置目录(保留历史记录、projects 等) + if exist "%HOME_DIR%\.claude\rules" rmdir /s /q "%HOME_DIR%\.claude\rules" + if exist "%HOME_DIR%\.claude\skills" rmdir /s /q "%HOME_DIR%\.claude\skills" + if exist "%HOME_DIR%\.claude\commands" rmdir /s /q "%HOME_DIR%\.claude\commands" + if exist "%HOME_DIR%\.claude\templates" rmdir /s /q "%HOME_DIR%\.claude\templates" + if exist "%HOME_DIR%\.claude\tasks" rmdir /s /q "%HOME_DIR%\.claude\tasks" + echo 已清理旧配置目录 + + REM 复制配置目录 + xcopy /e /i /q "%SCRIPT_DIR%\.claude\rules" "%HOME_DIR%\.claude\rules" + xcopy /e /i /q "%SCRIPT_DIR%\.claude\skills" "%HOME_DIR%\.claude\skills" + xcopy /e /i /q "%SCRIPT_DIR%\.claude\commands" "%HOME_DIR%\.claude\commands" + xcopy /e /i /q "%SCRIPT_DIR%\.claude\templates" "%HOME_DIR%\.claude\templates" + xcopy /e /i /q "%SCRIPT_DIR%\.claude\tasks" "%HOME_DIR%\.claude\tasks" + copy /y "%SCRIPT_DIR%\.claude\CLAUDE.md" "%HOME_DIR%\.claude\CLAUDE.md" >nul + + echo [√] rules/ skills/ commands/ templates/ tasks/ CLAUDE.md +) else ( + echo [Claude Code] 源目录不存在,跳过 +) + +echo. + +REM --- Gemini CLI --- +if exist "%SCRIPT_DIR%\.gemini" ( + echo [Gemini CLI] 开始同步 + + REM 确保目标目录存在 + if not exist "%HOME_DIR%\.gemini" mkdir "%HOME_DIR%\.gemini" + + REM 删除旧配置目录(保留认证信息) + if exist "%HOME_DIR%\.gemini\commands" rmdir /s /q "%HOME_DIR%\.gemini\commands" + echo 已清理旧配置目录 + + REM 复制配置 + xcopy /e /i /q "%SCRIPT_DIR%\.gemini\commands" "%HOME_DIR%\.gemini\commands" + copy /y "%SCRIPT_DIR%\.gemini\GEMINI.md" "%HOME_DIR%\.gemini\GEMINI.md" >nul + copy /y "%SCRIPT_DIR%\.gemini\settings.json" "%HOME_DIR%\.gemini\settings.json" >nul + + echo [√] commands/ GEMINI.md settings.json +) else ( + echo [Gemini CLI] 源目录不存在,跳过 ) echo. echo === 同步完成 === pause -goto :eof - -:sync_directory - set "dir_name=%~1" - set "src_dir=%SCRIPT_DIR%\%dir_name%" - set "dest_dir=%HOME_DIR%\%dir_name%" - - if not exist "%src_dir%" ( - echo [警告] 源目录不存在,跳过: %src_dir% - goto :eof - ) - - echo. - echo [开始同步] %dir_name% - - REM 创建目标目录 - if not exist "%dest_dir%" ( - mkdir "%dest_dir%" - ) - - REM 复制所有文件(使用 xcopy) - for /r "%src_dir%" %%f in (*) do ( - set "file=%%f" - set "rel_path=!file:%src_dir%\=!" - set "dest_file=%dest_dir%\!rel_path!" - - REM 创建目标子目录 - for %%p in ("!dest_file!") do ( - set "dest_subdir=%%~dpp" - if not exist "!dest_subdir!" ( - mkdir "!dest_subdir!" - ) - ) - - REM 检查文件是否存在 - if exist "!dest_file!" ( - REM 先检查全局策略 - if "!OVERWRITE_ALL!"=="yes" ( - copy /y "%%f" "!dest_file!" >nul - echo [√] 已覆盖: !dest_file! - ) else if "!OVERWRITE_ALL!"=="no" ( - echo [×] 已跳过: !dest_file! - ) else ( - call :confirm_overwrite "!dest_file!" "%%f" - if errorlevel 1 ( - echo [×] 已跳过: !dest_file! - ) else ( - copy /y "%%f" "!dest_file!" >nul - echo [√] 已覆盖: !dest_file! - ) - ) - ) else ( - copy "%%f" "!dest_file!" >nul - echo [√] 已复制: !dest_file! - ) - ) - goto :eof - -:confirm_overwrite - set "dest=%~1" - set "src=%~2" - - REM 如果已设置全局策略,直接返回 - if "!OVERWRITE_ALL!"=="yes" ( - exit /b 0 - ) - if "!OVERWRITE_ALL!"=="no" ( - exit /b 1 - ) - - REM 询问用户 - echo [!] 文件已存在: %dest% - set /p "response=是否覆盖? [y/N/a(全部覆盖)/s(全部跳过)]: " - - REM 处理用户输入 - if /i "!response!"=="a" ( - set "OVERWRITE_ALL=yes" - echo [√] 后续文件将全部覆盖 - exit /b 0 - ) - if /i "!response!"=="s" ( - set "OVERWRITE_ALL=no" - echo [√] 后续文件将全部跳过 - exit /b 1 - ) - if /i "!response!"=="y" ( - exit /b 0 - ) - - REM 默认不覆盖(空输入或其他输入) - exit /b 1 diff --git a/sync-config.sh b/sync-config.sh index 8ba4074..06e4c77 100755 --- a/sync-config.sh +++ b/sync-config.sh @@ -9,113 +9,59 @@ GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' -# 获取用户根目录 -HOME_DIR="${HOME}" - -# 当前脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -# 需要同步的目录 -SYNC_DIRS=(".claude" ".gemini") +echo -e "${GREEN}=== 配置同步工具 ===${NC}" +echo -e "源目录: ${SCRIPT_DIR}" +echo -e "目标目录: ${HOME}" +echo "" -# 全局覆盖策略(空表示每次询问,yes表示全部覆盖,no表示全部跳过) -OVERWRITE_ALL="" +# --- Claude Code --- +if [[ -d "${SCRIPT_DIR}/.claude" ]]; then + echo -e "${GREEN}[Claude Code] 开始同步${NC}" -# 确认覆盖函数 -confirm_overwrite() { - local file="${1}" + # 确保目标目录存在 + mkdir -p ~/.claude - # 如果已设置全局策略,直接返回 - if [[ "${OVERWRITE_ALL}" == "yes" ]]; then - return 0 - elif [[ "${OVERWRITE_ALL}" == "no" ]]; then - return 1 - fi + # 删除旧配置目录(保留历史记录、projects 等) + rm -rf ~/.claude/rules ~/.claude/skills ~/.claude/commands ~/.claude/templates ~/.claude/tasks + echo -e "${YELLOW} 已清理旧配置目录${NC}" - # 询问用户 - echo -e "${YELLOW}文件已存在: ${file}${NC}" - echo -ne "是否覆盖? [y/N/a(全部覆盖)/s(全部跳过)]: " - read -r response < /dev/tty + # 复制配置目录 + cp -r "${SCRIPT_DIR}/.claude/rules" ~/.claude/ + cp -r "${SCRIPT_DIR}/.claude/skills" ~/.claude/ + cp -r "${SCRIPT_DIR}/.claude/commands" ~/.claude/ + cp -r "${SCRIPT_DIR}/.claude/templates" ~/.claude/ + cp -r "${SCRIPT_DIR}/.claude/tasks" ~/.claude/ + cp "${SCRIPT_DIR}/.claude/CLAUDE.md" ~/.claude/ - case "${response}" in - [aA]) - OVERWRITE_ALL="yes" - echo -e "${GREEN}后续文件将全部覆盖${NC}" - return 0 - ;; - [sS]) - OVERWRITE_ALL="no" - echo -e "${GREEN}后续文件将全部跳过${NC}" - return 1 - ;; - [yY]) - return 0 - ;; - *) - return 1 - ;; - esac -} + echo -e "${GREEN} ✓ rules/ skills/ commands/ templates/ tasks/ CLAUDE.md${NC}" +else + echo -e "${YELLOW}[Claude Code] 源目录不存在,跳过${NC}" +fi -# 复制文件函数 -copy_file() { - local src="${1}" - local dest="${2}" +echo "" - if [[ -f "${dest}" ]]; then - if confirm_overwrite "${dest}"; then - cp -f "${src}" "${dest}" - echo -e "${GREEN}✓ 已覆盖: ${dest}${NC}" - else - echo -e "${YELLOW}✗ 已跳过: ${dest}${NC}" - fi - else - cp "${src}" "${dest}" - echo -e "${GREEN}✓ 已复制: ${dest}${NC}" - fi -} +# --- Gemini CLI --- +if [[ -d "${SCRIPT_DIR}/.gemini" ]]; then + echo -e "${GREEN}[Gemini CLI] 开始同步${NC}" -# 同步目录函数 -sync_directory() { - local dir_name="${1}" - local src_dir="${SCRIPT_DIR}/${dir_name}" - local dest_dir="${HOME_DIR}/${dir_name}" + # 确保目标目录存在 + mkdir -p ~/.gemini - if [[ ! -d "${src_dir}" ]]; then - echo -e "${YELLOW}源目录不存在,跳过: ${src_dir}${NC}" - return - fi + # 删除旧配置目录(保留认证信息) + rm -rf ~/.gemini/commands + echo -e "${YELLOW} 已清理旧配置目录${NC}" - echo -e "\n${GREEN}开始同步: ${dir_name}${NC}" + # 复制配置 + cp -r "${SCRIPT_DIR}/.gemini/commands" ~/.gemini/ + cp "${SCRIPT_DIR}/.gemini/GEMINI.md" ~/.gemini/ + cp "${SCRIPT_DIR}/.gemini/settings.json" ~/.gemini/ - # 创建目标目录(如果不存在) - mkdir -p "${dest_dir}" + echo -e "${GREEN} ✓ commands/ GEMINI.md settings.json${NC}" +else + echo -e "${YELLOW}[Gemini CLI] 源目录不存在,跳过${NC}" +fi - # 递归处理所有文件 - while IFS= read -r -d '' file; do - local rel_path="${file#${src_dir}/}" - local dest_file="${dest_dir}/${rel_path}" - local dest_subdir="$(dirname "${dest_file}")" - - # 创建子目录 - mkdir -p "${dest_subdir}" - - # 复制文件 - copy_file "${file}" "${dest_file}" - done < <(find "${src_dir}" -type f -print0) -} - -# 主流程 -main() { - echo -e "${GREEN}=== 配置同步工具 ===${NC}" - echo -e "源目录: ${SCRIPT_DIR}" - echo -e "目标目录: ${HOME_DIR}" - - for dir in "${SYNC_DIRS[@]}"; do - sync_directory "${dir}" - done - - echo -e "\n${GREEN}=== 同步完成 ===${NC}" -} - -main +echo "" +echo -e "${GREEN}=== 同步完成 ===${NC}"