Appearance
Claude Code 技巧
相关资源
- Claude Code in Action 官方教程,内容涉及 MCP、Commands、Hooks 和 SDK 等
skills
小点但重要
- 使用 AskUserQuestion 确保 Claude Code 理解你的要求,举例:
使用 AskUserQuestion 工具,像苏格拉底一样帮助我完善需求 - 使用 cc-switch 管理 Claude Code 的 API KEY 和 API_URL
- 使用
/config命令设置语言为简体中文
自定义命令
.claude/commands/[cmd].md- 携带参数
$ARGUMENTS
MCP
bash
# 智谱 MCP
claude mcp add -s user zai-mcp-server --env Z_AI_API_KEY=fc59f780888d41b1aa65a37e13f5c9c6.9YqlEQHnp6o35Rft -- npx -y "@z_ai/mcp-server"
claude mcp add -s user -t http web-search-prime https://open.bigmodel.cn/api/mcp/web_search_prime/mcp --header "Authorization: Bearer fc59f780888d41b1aa65a37e13f5c9c6.9YqlEQHnp6o35Rft"
claude mcp add -s user -t http web-reader https://open.bigmodel.cn/api/mcp/web_reader/mcp --header "Authorization: Bearer fc59f780888d41b1aa65a37e13f5c9c6.9YqlEQHnp6o35Rft"
claude mcp add -s user -t http zread https://open.bigmodel.cn/api/mcp/zread/mcp --header "Authorization: Bearer fc59f780888d41b1aa65a37e13f5c9c6.9YqlEQHnp6o35Rft"
# 社区 MCP
claude mcp add -s user context7 -- npx -y @upstash/context7-mcp --api-key ctx7sk-6ecb06ca-0409-4389-9058-a526ff441b5c
claude mcp add -s user playwright npx @playwright/mcp@latestCLAUDE.md / AGENT.md
~/.claude/CLAUDE.md和.claude/CLAUDE.md- 创建 CLAUDE.md
/init - 修改 CLAUDE.md,不要手动修改 CLAUDE.md 文件,使用
# ...让 Claude Code 帮你改,例如:
# Use comments sparingly. Only comment complex code.- 指定文件
@file.ext
推荐使用
md
## 特别注意
- 请优先使用 Mermaid 绘制文档里的图片
- 每次调整代码,需要确保编译通过
- 每次调整代码,需要修改相关的文档,包括但不限于 `README.md` 和 `CLAUDE.md` 等
- 每次调整代码,需要添加或修改相关的测试用例
- 每次调整代码,检查是否需要维护 MakefileControlling Context
- Escape
- Double-tap Escape
- Rewinding Conversations
- /compact
- /clear
命令行启动 Claude Code
快速参考
| 操作 | 命令 |
|---|---|
| 启动后台任务 | nohup claude ... & echo $! > claude.pid |
| 查看状态 | ps -p $(cat claude.pid) |
| 实时日志 | tail -f output.log |
| 等待完成 | wait $(cat claude.pid); echo $? |
| 终止任务 | kill $(cat claude.pid) |
| 强制终止 | kill -9 $(cat claude.pid) |
直接启动任务
bash
mkdir -p ./logs/claude && TIMESTAMP=$(date +%Y%m%d_%H%M%S) && claude -p "@workspace.md 执行完整的阅读任务" --dangerously-skip-permissions --verbose --debug-file ./logs/claude/DEBUG_${TIMESTAMP}.log --output-format stream-json > ./logs/claude/MESSAGE_${TIMESTAMP}.log 2>&1启动后台任务
bash
mkdir -p ./logs/claude && TIMESTAMP=$(date +%Y%m%d_%H%M%S) && nohup claude -p "@workspace.md 执行完整的阅读任务" --dangerously-skip-permissions --verbose --debug-file ./logs/claude/DEBUG_${TIMESTAMP}.log --output-format stream-json > ./logs/claude/MESSAGE_${TIMESTAMP}.log 2>&1 </dev/null &
echo $! > ./logs/claude/claude_${TIMESTAMP}.pid
echo "✅ PID: $(cat ./logs/claude/claude_${TIMESTAMP}.pid)"查看进程状态
bash
# 查看进程是否还在运行
ps -p $(cat claude.pid) -o pid,ppid,%cpu,%mem,stat,start,time,command
# 或者简化版
ps -p $(cat claude.pid) 2>/dev/null && echo "运行中" || echo "已结束"
# 实时查看输出
tail -f output.log
# 查看调试日志
tail -f debug.log查看退出状态
bash
# 如果进程已结束,获取退出码
wait $(cat claude.pid) 2>/dev/null; echo "Exit code: $?"
# 或者用这个(不需要 wait)
if ps -p $(cat claude.pid) > /dev/null 2>&1; then
echo "进程仍在运行"
else
echo "进程已结束"
# 检查是否正常退出
cat /proc/$(cat claude.pid)/status 2>/dev/null || echo "无法获取详细状态"
fi终止进程
bash
# 温和终止
kill $(cat claude.pid)
# 强制终止
kill -9 $(cat claude.pid)
# 清理 PID 文件
rm claude.pid使用 Python 管理 Claude Code
- 参考项目:BookAgentSwarm-SummaryAgent
- 确认进程的状态:
bash
=> ps -p 51770 -o pid,ppid,stat,comm
PID PPID STAT COMM
51770 51769 Ss claudeLinux 上创建 Claude 子用户
因为 Linux 上不允许 root 用户携带 --dangerously-skip-permissions 执行 Claude Code,因此需要创建专门的小号来搞事
bash
# 创建普通用户
useradd -m -s /bin/bash claudeuser
# 设置密码
passwd claudeuser
# 切换到普通用户
su - claudeuser
# 然后运行 claude
claude使用 Hooks 实现任务结束通知
json
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "afplay ~/bin/OpenTheCan.mp3"
}
]
}
]
}
}使用 Hooks 实现任务结束通知2
其它
notify.sh
bash
#!/bin/bash
# Agent Team 通知脚本
# Claude Code hooks 通过 stdin 传递 JSON 数据
# 设置代理
export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897
export all_proxy=socks5://127.0.0.1:7897
# Telegram 配置
BOT_TOKEN="8755654566:AAEn_xZr1rSFMMm5JWlsWz4YZ2coglJg_90"
CHAT_ID="2080736214"
# 从 stdin 读取 JSON 数据
HOOK_TYPE="$1"
STDIN_DATA=$(cat)
# 解析 JSON 提取信息
if command -v jq &> /dev/null; then
AGENT_ID=$(echo "$STDIN_DATA" | jq -r '.agent_id // empty' 2>/dev/null)
AGENT_TYPE=$(echo "$STDIN_DATA" | jq -r '.agent_type // empty' 2>/dev/null)
AGENT_TRANSCRIPT=$(echo "$STDIN_DATA" | jq -r '.agent_transcript_path // empty' 2>/dev/null)
LAST_MESSAGE=$(echo "$STDIN_DATA" | jq -r '.last_assistant_message // empty' 2>/dev/null)
fi
# 从 transcript 文件中提取初始任务描述
TASK_INFO=""
if [ -n "$AGENT_TRANSCRIPT" ] && [ -f "$AGENT_TRANSCRIPT" ]; then
# 读取第一条用户消息
FIRST_MSG=$(head -1 "$AGENT_TRANSCRIPT" 2>/dev/null | jq -r '.message.content // empty' 2>/dev/null)
if [ -n "$FIRST_MSG" ]; then
# 提取纯文本内容(去掉 teammate-message 标签等)
TASK_INFO=$(echo "$FIRST_MSG" | sed 's/<[^>]*>//g' | head -c 150 | tr '\n' ' ')
fi
fi
# 设置 Agent 名称
if [ -n "$AGENT_ID" ]; then
AGENT_NAME="Agent #${AGENT_ID:0:8}"
else
AGENT_NAME="Agent ($AGENT_TYPE)"
fi
# 设置任务摘要
if [ -n "$TASK_INFO" ]; then
TASK="$TASK_INFO"
elif [ -n "$LAST_MESSAGE" ]; then
TASK=$(echo "$LAST_MESSAGE" | head -c 100 | tr '\n' ' ')
else
TASK="已完成"
fi
case "$HOOK_TYPE" in
"SubagentStop")
TEXT="🤖 Agent Team 成员完成
👤 成员: ${AGENT_NAME}
📝 任务: ${TASK}"
;;
"Stop")
TEXT="🛑 主会话停止
📊 会话已完成"
;;
"TaskCompleted")
TEXT="✅ 任务完成
👤 执行者: ${AGENT_NAME}"
;;
*)
TEXT="📢 Hook: ${HOOK_TYPE}"
;;
esac
# 发送消息
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
--data-urlencode "text=${TEXT}"settings.json
json
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "bash -lc '.claude/notify.sh Stop \"$ARGUMENTS\"'"
}
]
}
],
"SubagentStop": [
{
"hooks": [
{
"type": "command",
"command": "bash -lc '.claude/notify.sh SubagentStop \"$ARGUMENTS\"'"
}
]
}
],
"TaskCompleted": [
{
"hooks": [
{
"type": "command",
"command": "bash -lc '.claude/notify.sh TaskCompleted \"$ARGUMENTS\"'"
}
]
}
]
}
}