diff --git a/.claude/commands/project-scan.md b/.claude/commands/project-scan.md index 6e20abf..79d10d1 100644 --- a/.claude/commands/project-scan.md +++ b/.claude/commands/project-scan.md @@ -1,97 +1,131 @@ --- -description: 扫描已有项目并生成 CLAUDE.md 配置 -allowed-tools: Read, Glob, Grep, Bash(ls:*), Bash(cat:*), Bash(head:*) +description: 扫描项目生成配置(CLAUDE.md/restart.sh/ignore/Docker) --- -扫描当前项目,自动识别技术栈并生成 `.claude/CLAUDE.md` 配置。 +扫描当前项目,自动识别技术栈并生成全套配置文件。 -## 扫描步骤 +## ⚠️ 必须生成以下所有文件 -### 1. 识别项目类型 +| 序号 | 文件 | 用途 | 模板位置 | +|------|------|------|---------| +| 1 | `.claude/CLAUDE.md` | 项目配置 | 直接生成 | +| 2 | `restart.sh` | 前后端打包+启动脚本 | `templates/restart-*.sh.tmpl` | +| 3 | `.claudeignore` | Claude Code 忽略 | `templates/claudeignore.tmpl` | +| 4 | `.gitignore` | Git 忽略 | `templates/gitignore-*.tmpl` | +| 5 | `.dockerignore` | Docker 忽略 | `templates/dockerignore.tmpl` | +| 6 | `Dockerfile` | 容器构建 | `templates/Dockerfile-*.tmpl` | +| 7 | `docker-compose.yml` | 容器编排 | `templates/docker-compose-*.yml.tmpl` | -检查以下文件确定技术栈: +--- -| 文件 | 技术栈 | -|------|--------| +## 执行步骤 + +### 步骤 1:扫描项目类型 + +检测文件确定技术栈: + +| 检测文件 | 项目类型 | +|---------|---------| | `go.mod` | Go | | `pom.xml` | Java + Maven | | `build.gradle` | Java + Gradle | | `package.json` | Node.js / 前端 | -| `requirements.txt` | Python | -| `Cargo.toml` | Rust | +| `web/` 或 `frontend/` 目录 | 前后端分离 | -### 2. 识别框架 +检测数据库依赖(在 go.mod 或代码中搜索): -**Go 项目**: -- 检查 `go.mod` 中的依赖:`gin`、`echo`、`fiber`、`gorm` 等 +| 关键词 | 依赖 | +|--------|------| +| `sqlite` | SQLite | +| `mysql` | MySQL | +| `postgres` | PostgreSQL | +| `redis`, `go-redis` | Redis | -**Java 项目**: -- 检查 `pom.xml` 或 `build.gradle` 中的依赖:`spring-boot`、`mybatis` 等 +### 步骤 2:显示扫描结果并确认 -**前端项目**: -- 检查 `package.json` 中的依赖:`vue`、`react`、`element-plus`、`ant-design` 等 +``` +## 项目扫描结果 -### 3. 识别目录结构 +**项目类型**: [检测结果] +**数据库**: [检测结果] +**前后端分离**: [是/否] -扫描项目根目录,识别: -- 源码目录:`src/`、`internal/`、`pkg/`、`web/` -- 配置文件:`config/`、`.env`、`application.yml` -- 测试目录:`test/`、`tests/`、`__tests__/` -- 脚本文件:`restart.sh`、`Makefile`、`docker-compose.yml` - -### 4. 识别启动方式 - -按优先级检查: -1. `restart.sh` → `./restart.sh` -2. `docker-compose.yml` → `docker-compose up` -3. `Makefile` → 检查 `run` 或 `dev` 目标 -4. `package.json` scripts → `npm run dev` -5. `go.mod` → `go run main.go` -6. `pom.xml` → `mvn spring-boot:run` - -### 5. 生成配置 - -基于扫描结果,生成 `.claude/CLAUDE.md`: - -```markdown -# [项目名] 项目配置 - -作者:wwj - -## 项目概述 - -[根据 README.md 或目录结构推断] - -## 技术栈 - -| 层级 | 技术 | 版本 | -|------|------|------| -| [识别到的技术栈] | - -## 目录结构 - -[扫描到的目录结构] - -## 项目定制 - -| 约定 | 说明 | -|------|------| -| 启动方式 | [识别到的启动方式] | -| [其他识别到的约定] | - -## 与 Claude Code 协作 - -[标准模板] +即将生成 7 个文件,是否继续?[Y/n] ``` -## 输出 +### 步骤 3:逐个生成文件 -1. 显示扫描结果摘要 -2. 生成 `.claude/CLAUDE.md` 文件 -3. 提示用户检查并调整 +对于每个文件: -## 注意 +1. **检查是否存在** +2. **如已存在** → 询问用户: + ``` + 文件 [filename] 已存在,请选择: + 1. 覆盖 + 2. 跳过 + ``` +3. **如不存在** → 读取对应模板,根据项目类型调整后生成 -- 如果已存在 `.claude/CLAUDE.md`,先询问是否覆盖 -- 无法识别的部分用 `[待补充]` 标记 -- 生成后提示用户检查技术栈版本是否正确 +**模板选择规则**: + +| 项目类型 | restart.sh | Dockerfile | docker-compose.yml | +|---------|------------|------------|-------------------| +| Go | `restart-go.sh.tmpl` | `Dockerfile-go.tmpl` | 根据数据库选择 | +| Go + 前端 | `restart-go.sh.tmpl` | `Dockerfile-go-frontend.tmpl` | 根据数据库选择 | +| Java | `restart-java.sh.tmpl` | 自行生成 | 根据数据库选择 | + +| 数据库 | docker-compose 模板 | +|--------|-------------------| +| SQLite | `docker-compose-sqlite.yml.tmpl` | +| MySQL | `docker-compose-mysql.yml.tmpl` | +| Redis | `docker-compose-redis.yml.tmpl` | +| MySQL + Redis | 合并两个模板 | + +### 步骤 4:设置执行权限 + +```bash +chmod +x restart.sh +``` + +### 步骤 5:输出摘要 + +``` +## 生成完成 + +已生成文件: +✅ .claude/CLAUDE.md +✅ restart.sh +✅ .claudeignore +✅ .gitignore +✅ .dockerignore +✅ Dockerfile +✅ docker-compose.yml + +跳过文件: +⏭️ [用户选择跳过的文件] + +下一步: +1. 检查生成的文件是否符合项目实际情况 +2. 修改 docker-compose.yml 中的默认密码 +3. 测试 ./restart.sh 是否正常工作 +``` + +--- + +## restart.sh 使用说明 + +```bash +# 默认管理员账密 +./restart.sh + +# 自定义管理员账密 +ADMIN_USER=myuser ADMIN_PASS=mypass ./restart.sh +``` + +--- + +## 注意事项 + +- 生成后务必检查文件内容是否符合项目实际 +- `docker-compose.yml` 中的密码应在生产环境修改 +- 如项目结构特殊,可能需要手动调整模板 diff --git a/.claude/templates/Dockerfile-go-frontend.tmpl b/.claude/templates/Dockerfile-go-frontend.tmpl new file mode 100644 index 0000000..f86541b --- /dev/null +++ b/.claude/templates/Dockerfile-go-frontend.tmpl @@ -0,0 +1,25 @@ +# 前端构建阶段 +FROM node:20-alpine AS frontend +WORKDIR /app/web +COPY web/package*.json ./ +RUN npm install +COPY web/ . +RUN npm run build + +# 后端构建阶段 +FROM golang:1.21-alpine AS backend +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux go build -o server ./cmd/server + +# 运行阶段 +FROM alpine:latest +RUN apk --no-cache add ca-certificates tzdata +ENV TZ=Asia/Shanghai +WORKDIR /app +COPY --from=backend /app/server . +COPY --from=frontend /app/web/dist ./web/dist +EXPOSE 8080 +CMD ["./server"] diff --git a/.claude/templates/Dockerfile-go.tmpl b/.claude/templates/Dockerfile-go.tmpl new file mode 100644 index 0000000..95d4aed --- /dev/null +++ b/.claude/templates/Dockerfile-go.tmpl @@ -0,0 +1,16 @@ +# 构建阶段 +FROM golang:1.21-alpine AS builder +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux go build -o server ./cmd/server + +# 运行阶段 +FROM alpine:latest +RUN apk --no-cache add ca-certificates tzdata +ENV TZ=Asia/Shanghai +WORKDIR /app +COPY --from=builder /app/server . +EXPOSE 8080 +CMD ["./server"] diff --git a/.claude/templates/claudeignore.tmpl b/.claude/templates/claudeignore.tmpl new file mode 100644 index 0000000..b1293d0 --- /dev/null +++ b/.claude/templates/claudeignore.tmpl @@ -0,0 +1,74 @@ +# .claudeignore - Claude Code 分析时忽略的文件 + +# 第三方依赖 +node_modules/ +vendor/ + +# 构建产物 +build/ +dist/ +bin/ +*.app + +# 锁文件(无分析价值) +package-lock.json +go.sum + +# 数据库文件 +*.db +*.sqlite +*.sqlite3 +data/*.db +data/*.sqlite + +# 日志文件 +*.log +server.log +logs/ + +# 环境配置(敏感) +.env +.env.local +.env.*.local + +# Git 内部目录 +.git/ + +# 压缩/混淆文件 +*.min.js +*.min.css + +# 二进制文件 +*.exe +*.dll +*.so +*.dylib +*.test + +# 静态资源 +*.png +*.jpg +*.jpeg +*.gif +*.ico +*.svg +*.woff +*.woff2 +*.ttf +*.eot + +# IDE 和编辑器 +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# 系统文件 +.DS_Store +Thumbs.db + +# 临时文件 +tmp/ +temp/ +*.tmp diff --git a/.claude/templates/docker-compose-mysql.yml.tmpl b/.claude/templates/docker-compose-mysql.yml.tmpl new file mode 100644 index 0000000..2579780 --- /dev/null +++ b/.claude/templates/docker-compose-mysql.yml.tmpl @@ -0,0 +1,32 @@ +version: '3.8' + +services: + app: + build: . + ports: + - "8080:8080" + depends_on: + - mysql + environment: + - DB_HOST=mysql + - DB_PORT=3306 + - DB_USER=app + - DB_PASS=app123 + - DB_NAME=appdb + - ADMIN_USER=${ADMIN_USER:-admin} + - ADMIN_PASS=${ADMIN_PASS:-admin123} + restart: unless-stopped + + mysql: + image: mysql:8.0 + environment: + - MYSQL_ROOT_PASSWORD=root123 + - MYSQL_DATABASE=appdb + - MYSQL_USER=app + - MYSQL_PASSWORD=app123 + volumes: + - mysql_data:/var/lib/mysql + restart: unless-stopped + +volumes: + mysql_data: diff --git a/.claude/templates/docker-compose-redis.yml.tmpl b/.claude/templates/docker-compose-redis.yml.tmpl new file mode 100644 index 0000000..f5f9f09 --- /dev/null +++ b/.claude/templates/docker-compose-redis.yml.tmpl @@ -0,0 +1,24 @@ +version: '3.8' + +services: + app: + build: . + ports: + - "8080:8080" + depends_on: + - redis + environment: + - REDIS_HOST=redis + - REDIS_PORT=6379 + - ADMIN_USER=${ADMIN_USER:-admin} + - ADMIN_PASS=${ADMIN_PASS:-admin123} + restart: unless-stopped + + redis: + image: redis:7-alpine + volumes: + - redis_data:/data + restart: unless-stopped + +volumes: + redis_data: diff --git a/.claude/templates/docker-compose-sqlite.yml.tmpl b/.claude/templates/docker-compose-sqlite.yml.tmpl new file mode 100644 index 0000000..77ffe8d --- /dev/null +++ b/.claude/templates/docker-compose-sqlite.yml.tmpl @@ -0,0 +1,13 @@ +version: '3.8' + +services: + app: + build: . + ports: + - "8080:8080" + volumes: + - ./data:/app/data + environment: + - ADMIN_USER=${ADMIN_USER:-admin} + - ADMIN_PASS=${ADMIN_PASS:-admin123} + restart: unless-stopped diff --git a/.claude/templates/dockerignore.tmpl b/.claude/templates/dockerignore.tmpl new file mode 100644 index 0000000..95efd2b --- /dev/null +++ b/.claude/templates/dockerignore.tmpl @@ -0,0 +1,55 @@ +# Git +.git +.gitignore + +# Build artifacts +build/ +dist/ +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary +*.test + +# Output of go coverage tool +*.out + +# Data directory (will be mounted as volume) +data/ + +# Environment files +.env +.env.local +.env.*.local + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log + +# Documentation +README.md +docs/ + +# CI/CD +.github/ + +# Docker (avoid recursion) +docker-compose.yml +Dockerfile +.dockerignore + +# Node modules (if any) +node_modules/ diff --git a/.claude/templates/gitignore-go.tmpl b/.claude/templates/gitignore-go.tmpl new file mode 100644 index 0000000..c8d8d7b --- /dev/null +++ b/.claude/templates/gitignore-go.tmpl @@ -0,0 +1,80 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool +*.out + +# Go workspace file +go.work + +# Build artifacts +build/ +dist/ +bin/ +*.app + +# Dependency directories +vendor/ + +# Go build cache +.cache/ + +# Environment files +.env +.env.local +.env.*.local + +# Database files +*.db +*.sqlite +*.sqlite3 +data/*.db +data/*.sqlite + +# Log files +*.log +server.log +logs/ + +# IDE and editor directories +.idea/ +.vscode/ +*.swp +*.swo +*~ +.DS_Store + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Temporary files +tmp/ +temp/ +*.tmp + +# Node modules (for frontend) +node_modules/ +package-lock.json + +# Compiled binaries +server +cmd/server/server + +# Admin config (may contain sensitive data) +data/admin_config.json + +# Scripts runtime artifacts +*.pid diff --git a/.claude/templates/restart-go.sh.tmpl b/.claude/templates/restart-go.sh.tmpl new file mode 100644 index 0000000..efdfc0d --- /dev/null +++ b/.claude/templates/restart-go.sh.tmpl @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -euo pipefail + +# 管理员配置(通过环境变量设置) +ADMIN_USER="${ADMIN_USER:-admin}" +ADMIN_PASS="${ADMIN_PASS:-admin123}" + +# 1. 拉取最新代码 +echo "==> 拉取最新代码..." +git pull origin main || true + +# 2. 前端打包(如有 web/ 目录) +if [[ -d "web" ]]; then + echo "==> 构建前端..." + cd web + npm install + npm run build + cd .. +fi + +# 3. 后端编译 +echo "==> 编译后端..." +go build -o ./bin/server ./cmd/server + +# 4. 停止旧进程 +echo "==> 停止旧进程..." +pkill -f "./bin/server" || true +sleep 1 + +# 5. 启动新进程 +echo "==> 启动服务..." +ADMIN_USER="$ADMIN_USER" ADMIN_PASS="$ADMIN_PASS" \ + nohup ./bin/server > server.log 2>&1 & + +echo "==> 服务已启动" +echo " 管理员账号: $ADMIN_USER" +echo " 日志文件: server.log" +echo "" +echo "使用方式:" +echo " 默认账密: ./restart.sh" +echo " 自定义: ADMIN_USER=xxx ADMIN_PASS=xxx ./restart.sh" diff --git a/.claude/templates/restart-java.sh.tmpl b/.claude/templates/restart-java.sh.tmpl new file mode 100644 index 0000000..189e275 --- /dev/null +++ b/.claude/templates/restart-java.sh.tmpl @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail + +# 管理员配置(通过环境变量设置) +ADMIN_USER="${ADMIN_USER:-admin}" +ADMIN_PASS="${ADMIN_PASS:-admin123}" + +# 1. 拉取最新代码 +echo "==> 拉取最新代码..." +git pull origin main || true + +# 2. 前端打包(如有 web/ 目录) +if [[ -d "web" ]]; then + echo "==> 构建前端..." + cd web + npm install + npm run build + cd .. +fi + +# 3. 后端编译 +echo "==> 编译后端..." +mvn clean package -DskipTests + +# 4. 停止旧进程 +echo "==> 停止旧进程..." +pkill -f "java.*jar" || true +sleep 2 + +# 5. 启动新进程 +echo "==> 启动服务..." +ADMIN_USER="$ADMIN_USER" ADMIN_PASS="$ADMIN_PASS" \ + nohup java -jar target/*.jar > server.log 2>&1 & + +echo "==> 服务已启动" +echo " 管理员账号: $ADMIN_USER" +echo " 日志文件: server.log" diff --git a/README.md b/README.md index b5cc2a8..283fc52 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ | `/requirement-interrogate` | 需求极刑审问,挖掘逻辑漏洞 | `/requirement-interrogate 用户要导出数据` | | `/design-checklist` | 生成设计质量检查清单 | `/design-checklist` | | `/project-init` | 为新项目初始化 Claude Code 配置 | `/project-init` | -| `/project-scan` | 扫描已有项目生成 CLAUDE.md | `/project-scan` | +| `/project-scan` | 扫描项目生成配置(CLAUDE.md/restart.sh/ignore/Docker) | `/project-scan` | | `/style-extract` | 从代码或设计图提取样式变量 | `/style-extract` | | `/status` | 显示当前配置状态(Rules/Skills/LSP) | `/status` |