Claude之父AI编程技巧七:Slash命令处理重复工作流——将经验沉淀为可复用的自动化

引言

在日常开发中,我们经常重复执行相同的操作:提交代码、创建功能分支、运行测试、部署应用…这些操作虽然不复杂,但每次都需要输入相似的命令,消耗时间和精力。更重要的是,这些操作往往蕴含着团队的约定和最佳实践,如果每次都手动执行,就容易出错或遗漏。

Claude Code的Slash命令(斜杠命令)正是为解决这个问题而生。它允许你将复杂的工作流封装为简单的命令,让经验的传承变得简单,让操作的效率大幅提升。

本文将深入探讨如何创建和使用自定义的Slash命令,让你的开发工作流更加流畅。

理解Slash命令

什么是Slash命令?

Slash命令是以/开头的特殊命令,用于快速触发预定义的工作流:

/commit          # 自动提交代码
/test            # 运行测试套件
/deploy          # 部署应用到生产环境
/refactor        # 开始重构任务

与普通对话不同,Slash命令是一段预定义的行为,可以包含多个步骤、复杂的逻辑和条件判断。

Slash命令的特点

特性 描述
一致性 每次执行都遵循相同的流程
可复用 团队成员都可以使用
可配置 可以接受参数和选项
可审计 执行过程可追踪
可组合 可以调用其他命令和工具

与普通命令的区别

普通对话:
用户:帮我提交代码
Claude:好的,请输入提交信息
用户:修复登录bug
Claude:已提交

Slash命令:
用户:/commit "修复登录bug"
Claude:→ 检查变更文件
       → 运行lint
       → 运行测试
       → 创建提交
       → 显示结果

内置Slash命令

Claude Code提供了一系列内置的Slash命令:

命令 功能 使用场景
/help 显示帮助信息 了解可用命令
/status 显示当前项目状态 检查工作区状态
/init 初始化新项目 设置CLAUDE.md
/clear 清除对话历史 开始新对话
/read 读取并分析文件 理解代码结构
/search 搜索代码库 查找特定代码
/test 运行测试 验证代码正确性
/linter 运行代码检查 保证代码质量

自定义Slash命令

创建命令的基本结构

自定义Slash命令存储在.claude/commands/目录下:

.claude/
├── commands/
│   ├── commit.sh
│   ├── feature.sh
│   ├── deploy.sh
│   └── review.sh
└── settings.json

简单命令示例

创建一个自动提交命令:

#!/bin/bash
# .claude/commands/commit.sh

# 用法: /commit "<提交信息>"

COMMIT_MESSAGE="$1"

if [ -z "$COMMIT_MESSAGE" ]; then
  echo "请提供提交信息,例如:/commit \"修复bug\""
  exit 1
fi

echo "🚀 开始提交流程..."

# 1. 显示变更概览
echo ""
echo "📝 变更的文件:"
git status --short

# 2. 运行代码检查
echo ""
echo "🔍 运行代码检查..."
if command -v npm &> /dev/null; then
  npm run lint
elif command -v yarn &> /dev/null; then
  yarn lint
fi

# 3. 运行测试
echo ""
echo "🧪 运行测试..."
if command -v npm &> /dev/null; then
  npm test -- --passWithNoTests
elif command -v yarn &> /dev/null; then
  yarn test --passWithNoTests
fi

# 4. 添加变更
echo ""
echo "➕ 添加变更..."
git add -A

# 5. 创建提交
echo ""
echo "📦 创建提交..."
git commit -m "$COMMIT_MESSAGE"

echo ""
echo "✅ 提交完成!"
echo "提交信息:$COMMIT_MESSAGE"

复杂命令示例

创建一个功能开发命令:

#!/bin/bash
# .claude/commands/feature.sh

# 用法: /feature "<功能名称>"

FEATURE_NAME="$1"

if [ -z "$FEATURE_NAME" ]; then
  echo "请提供功能名称,例如:/feature \"用户认证\""
  exit 1
fi

# 转换为小写和短横线格式
BRANCH_NAME=$(echo "$FEATURE_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')

echo "🚀 开始功能开发:$FEATURE_NAME"
echo "分支名称:feature/$BRANCH_NAME"

# 1. 确保主分支最新
echo ""
echo "🔄 同步主分支..."
git checkout main
git pull origin main

# 2. 创建功能分支
echo ""
echo "🌿 创建功能分支..."
git checkout -b "feature/$BRANCH_NAME"

# 3. 生成TODO列表
echo ""
echo "📋 生成开发计划..."

cat > "docs/TODO-$BRANCH_NAME.md" << EOF
# $FEATURE_NAME 开发计划

创建时间:$(date +"%Y-%m-%d %H:%M")

## 目标
开发$FEATURE_NAME功能

## 任务列表

- [ ] 需求分析
- [ ] 架构设计
- [ ] 数据库设计
- [ ] 后端API开发
- [ ] 前端界面开发
- [ ] 单元测试
- [ ] 集成测试
- [ ] 代码审查
- [ ] 合并到主分支

## 备注
EOF

echo "✅ 已创建开发计划文档:docs/TODO-$BRANCH_NAME.md"

# 4. 初始化开发环境
echo ""
echo "🔧 检查开发环境..."
if [ -f "package.json" ]; then
  echo "安装依赖..."
  npm install
fi

# 5. 显示下一步指导
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🎯 下一步操作:"
echo ""
echo "1. 编辑 docs/TODO-$BRANCH_NAME.md,添加详细任务"
echo "2. 开始实现功能"
echo "3. 使用 /commit 命令提交变更"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

接受参数的命令

创建一个灵活的测试命令:

#!/bin/bash
# .claude/commands/test.sh

# 用法:
# /test              # 运行所有测试
# /test unit        # 仅运行单元测试
# /test integration # 仅运行集成测试
# /test --coverage  # 运行测试并生成覆盖率报告

TEST_TYPE="$1"
COVERAGE_FLAG=""
VERBOSE_FLAG=""

# 解析参数
while [[ $# -gt 0 ]]; do
  case $1 in
    --coverage)
      COVERAGE_FLAG="--coverage"
      shift
      ;;
    --verbose)
      VERBOSE_FLAG="--verbose"
      shift
      ;;
    *)
      TEST_TYPE="$1"
      shift
      ;;
  esac
done

echo "🧪 运行测试..."

# 确定测试命令
if command -v npm &> /dev/null; then
  TEST_CMD="npm test"
elif command -v yarn &> /dev/null; then
  TEST_CMD="yarn test"
elif command -v pnpm &> /dev/null; then
  TEST_CMD="pnpm test"
else
  echo "❌ 未找到测试命令,请确保已安装npm/yarn/pnpm"
  exit 1
fi

# 根据类型执行测试
case $TEST_TYPE in
  unit)
    echo "运行单元测试..."
    $TEST_CMD -- test/unit --watchAll=false $COVERAGE_FLAG $VERBOSE_FLAG
    ;;
  integration)
    echo "运行集成测试..."
    $TEST_CMD -- test/integration --watchAll=false $COVERAGE_FLAG $VERBOSE_FLAG
    ;;
  e2e)
    echo "运行端到端测试..."
    if command -v cypress &> /dev/null; then
      cypress run
    else
      $TEST_CMD -- test/e2e --watchAll=false $COVERAGE_FLAG $VERBOSE_FLAG
    fi
    ;;
  "")
    echo "运行所有测试..."
    $TEST_CMD -- --watchAll=false $COVERAGE_FLAG $VERBOSE_FLAG
    ;;
  *)
    echo "运行指定的测试:$TEST_TYPE"
    $TEST_CMD -- "$TEST_TYPE" --watchAll=false $COVERAGE_FLAG $VERBOSE_FLAG
    ;;
esac

TEST_EXIT_CODE=$?

if [ $TEST_EXIT_CODE -eq 0 ]; then
  echo ""
  echo "✅ 所有测试通过!"
else
  echo ""
  echo "❌ 测试失败,请检查错误信息"
fi

exit $TEST_EXIT_CODE

命令脚本的组成要素

元信息头部

每个命令脚本可以包含元信息:

#!/bin/bash
# name: commit
# description: 自动提交代码变更
# usage: /commit "<提交信息>"
# author: 开发团队
# version: 1.0.0
# requires:
#   - git
#   - npm (可选,用于运行lint和test)

错误处理

#!/bin/bash
set -e  # 遇到错误立即退出

# 自定义错误处理函数
error_exit() {
  echo "❌ 错误:$1" >&2
  exit 1
}

# 检查必要条件
check_requirements() {
  if ! command -v git &> /dev/null; then
    error_exit "未安装git"
  fi

  # 检查是否是git仓库
  if ! git rev-parse --git-dir > /dev/null 2>&1; then
    error_exit "当前目录不是git仓库"
  fi
}

# 执行检查
check_requirements

交互式输入

#!/bin/bash

# 获取用户确认
confirm() {
  read -p "$1 [y/N] " -n 1 -r
  echo
  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "已取消"
    exit 0
  fi
}

# 使用示例
confirm "确定要删除这个分支吗?"

彩色输出

#!/bin/bash

# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${GREEN}✅ 成功${NC}"
echo -e "${YELLOW}⚠️  警告${NC}"
echo -e "${RED}❌ 错误${NC}"
echo -e "${BLUE}ℹ️  信息${NC}"

团队命令库

创建命令库结构

.claude/
├── commands/
│   ├── git/
│   │   ├── start-day.sh      # 每日开始工作
│   │   ├── end-day.sh        # 每日结束工作
│   │   ├── sync.sh           # 同步远程变更
│   │   └── cleanup.sh        # 清理分支
│   ├── pr/
│   │   ├── create.sh         # 创建PR
│   │   ├── review.sh         # 审查PR
│   │   └── merge.sh          # 合并PR
│   ├── deploy/
│   │   ├── staging.sh        # 部署到预发布
│   │   ├── production.sh     # 部署到生产
│   │   └── rollback.sh       # 回滚
│   └── dev/
│       ├── new-component.sh  # 创建新组件
│       ├── new-api.sh        # 创建新API
│       └── generate-doc.sh   # 生成文档
└── settings.json

每日开始工作命令

#!/bin/bash
# .claude/commands/git/start-day.sh

echo "🌅 每日开始工作"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# 1. 显示今日日期
echo ""
echo "📅 日期:$(date +"%Y年%m月%d日 %A")"

# 2. 显示当前分支
echo ""
echo "🌿 当前分支:$(git branch --show-current)"

# 3. 显示待处理的工作
echo ""
echo "📋 待处理的工作:"

# 检查本地变更
if ! git diff --quiet; then
  echo "  ⚠️  有未提交的变更"
  git status --short
fi

# 检查远程同步状态
echo ""
echo "🔄 同步状态:"
git fetch origin
UPSTREAM=$(git rev-parse --abbrev-ref @{u})
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")

if [ "$LOCAL" = "$REMOTE" ]; then
  echo "  ✅ 本地与远程同步"
else
  echo "  ⚠️  远程有新的提交"
  git log --oneline "$LOCAL".."$UPSTREAM"
fi

# 4. 显示待审查的PR
echo ""
echo "👀 待审查的PR:"
gh pr list --state "pending_review" --limit 3 --json number,title,author

# 5. 显示提醒事项
echo ""
echo "📌 提醒:"
echo "  - 记得在开始工作前运行 /test 确保测试通过"
echo "  - 提交前使用 /commit 命令遵循提交规范"

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✨ 准备开始工作吧!"

部署命令(带安全检查)

#!/bin/bash
# .claude/commands/deploy/production.sh

set -e

echo "🚀 生产环境部署"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 确认部署
confirm() {
  read -p "$1 [y/N] " -n 1 -r
  echo
  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "已取消部署"
    exit 0
  fi
}

warn() {
  echo -e "${YELLOW}⚠️  $1${NC}"
}

success() {
  echo -e "${GREEN}$1${NC}"
}

error() {
  echo -e "${RED}$1${NC}"
  exit 1
}

# 1. 安全检查
echo ""
echo "🔒 安全检查..."

# 检查是否在主分支
CURRENT_BRANCH=$(git branch --show-current)
if [ "$CURRENT_BRANCH" != "main" ]; then
  warn "当前不在main分支(当前:$CURRENT_BRANCH)"
  confirm "确定要在非main分支部署到生产环境吗?"
fi

# 检查未提交的变更
if ! git diff --quiet; then
  error "存在未提交的变更,请先提交或暂存"
fi

# 检查测试状态
echo ""
echo "🧪 检查测试状态..."
if ! npm test -- --watchAll=false --passWithNoTests 2>/dev/null; then
  error "测试未通过,无法部署"
fi
success "测试通过"

# 2. 构建应用
echo ""
echo "🔨 构建应用..."
npm run build

if [ $? -ne 0 ]; then
  error "构建失败"
fi
success "构建成功"

# 3. 收集用户确认
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "⚠️  即将部署到生产环境!"
echo ""
echo "分支:$CURRENT_BRANCH"
echo "提交:$(git rev-parse HEAD)"
echo "时间:$(date '+%Y-%m-%d %H:%M:%S')"
echo ""
confirm "确认部署到生产环境?"

# 4. 执行部署
echo ""
echo "📦 开始部署..."
# 实际的部署命令取决于你的基础设施
# 以下是示例:
# docker build -t myapp:latest .
# docker push myregistry/myapp:latest
# kubectl rollout restart deployment/myapp

success "部署完成!"

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📝 下一步:"
echo "  1. 监控应用日志"
echo "  2. 检查健康检查端点"
echo "  3. 验证关键功能"
echo ""
echo "如有问题,使用 /deploy/rollback.sh 回滚"

命令文档化

创建命令目录

<!-- .claude/commands/README.md -->

# Slash 命令文档

## 概述

本目录包含团队常用的Slash命令,用于标准化开发流程。

## Git命令

### `/git start-day`
每日开始工作,同步代码并查看待办事项。

```bash
/git start-day

/git end-day

每日结束工作,检查变更并准备次日工作。

/git end-day

/commit <message>

自动提交代码,包含lint和测试。

/commit "修复登录页面验证码bug"

Pull Request命令

/pr create

创建Pull Request。

/pr create

/pr review

审查待处理的Pull Request。

/pr review

部署命令

/deploy staging

部署到预发布环境。

/deploy staging

/deploy production

部署到生产环境(需要确认)。

/deploy production

开发命令

/dev new-component <name>

创建新的React/Vue组件。

/dev new-component Button

/dev new-api <name>

创建新的API端点。

/dev new-api user/login

添加新命令

  1. .claude/commands/目录下创建.sh文件
  2. 添加正确的文件头(名称、描述、用法)
  3. 设置可执行权限:chmod +x .claude/commands/your-command.sh
  4. 更新本文档

## 权限与安全

### 设置命令权限

在`settings.json`中配置命令的执行策略:

```json
{
  "commands": {
    "permissions": {
      "commit": "auto",      // 自动执行
      "deploy": "confirm",   // 需要确认
      "cleanup": "confirm",  // 需要确认
      "destructive": "prompt" // 每次询问
    },
    "allowed_commands": [
      "commit",
      "test",
      "status",
      "help"
    ],
    "blocked_commands": [
      "delete_all",
      "force_push"
    ]
  }
}

敏感操作处理

#!/bin/bash
# .claude/commands/sensitive.sh

# 检查是否是危险操作
if [[ "$1" == "--force" ]]; then
  echo "⚠️  检测到强制操作请求"
  echo ""
  echo "此操作可能造成数据丢失,请联系管理员执行。"
  exit 1
fi

# 记录敏感操作
log_sensitive_action() {
  local action="$1"
  local user="$USER"
  local time=$(date +"%Y-%m-%d %H:%M:%S")
  local ip=$(who am i | awk '{print $NF}' || echo "unknown")

  echo "[$time] 用户=$user IP=$ip 操作=$action" >> /var/log/claude-commands.log
}

log_sensitive_action "sensitive_command"

最佳实践

1. 命令设计原则

  • 单一职责:每个命令只做一件事
  • 幂等性:多次执行结果相同
  • 清晰的反馈:让用户知道发生了什么
  • 错误处理:失败时有明确的错误信息

2. 命名规范

# ✅ 好的命名
commit.sh
create-pr.sh
run-tests.sh

# ❌ 不好的命名
do_stuff.sh
myscript.sh
test123.sh

3. 文档完善

  • 每个命令都有清晰的描述
  • 提供使用示例
  • 说明前置条件

4. 版本控制

  • 将命令纳入版本控制
  • 记录命令的变更历史
  • 定期审查和优化

结语

Slash命令是将团队最佳实践固化的最佳方式。当你创建一个命令时,你不仅在节省自己的时间,也在为整个团队创造可复用的知识资产。

从今天开始,观察你的日常工作中哪些操作是重复的,然后把它们变成Slash命令。随着命令库的丰富,你会发现开发工作变得越来越流畅,而团队的规范也越来越统一。


参考资源

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐