name: plugin-settings description: 当用户询问“插件设置”、“存储插件配置”、“用户可配置插件”、“.local.md文件”、“插件状态文件”、“读取YAML frontmatter”、“每个项目的插件设置”,或希望使插件行为可配置时使用此技能。记录.claude/插件名称.local.md模式,用于通过YAML frontmatter和markdown内容存储插件特定配置。 version: 0.1.0
Claude代码插件的插件设置模式
概述
插件可以在项目目录内的.claude/插件名称.local.md文件中存储用户可配置的设置和状态。此模式使用YAML frontmatter进行结构化配置,并使用markdown内容作为提示或附加上下文。
关键特性:
- 文件位置: 项目根目录下的
.claude/插件名称.local.md - 结构: YAML frontmatter + markdown正文
- 目的: 每个项目的插件配置和状态
- 使用: 从钩子、命令和代理中读取
- 生命周期: 用户管理(不在git中,应放在
.gitignore中)
文件结构
基本模板
---
enabled: true
setting1: value1
setting2: value2
numeric_setting: 42
list_setting: ["item1", "item2"]
---
# 附加上下文
此markdown正文可以包含:
- 任务描述
- 附加指令
- 反馈给Claude的提示
- 文档或笔记
示例: 插件状态文件
.claude/my-plugin.local.md:
---
enabled: true
strict_mode: false
max_retries: 3
notification_level: info
coordinator_session: team-leader
---
# 插件配置
此插件为标准验证模式配置。
如有问题请联系@team-lead。
读取设置文件
从钩子(Bash脚本)
模式: 检查存在性并解析frontmatter
#!/bin/bash
set -euo pipefail
# 定义状态文件路径
STATE_FILE=".claude/my-plugin.local.md"
# 如果文件不存在则快速退出
if [[ ! -f "$STATE_FILE" ]]; then
exit 0 # 插件未配置,跳过
fi
# 解析YAML frontmatter(在---标记之间)
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$STATE_FILE")
# 提取单个字段
ENABLED=$(echo "$FRONTMATTER" | grep '^enabled:' | sed 's/enabled: *//' | sed 's/^"\(.*\)"$/\1/')
STRICT_MODE=$(echo "$FRONTMATTER" | grep '^strict_mode:' | sed 's/strict_mode: *//' | sed 's/^"\(.*\)"$/\1/')
# 检查是否启用
if [[ "$ENABLED" != "true" ]]; then
exit 0 # 已禁用
fi
# 在钩子逻辑中使用配置
if [[ "$STRICT_MODE" == "true" ]]; then
# 应用严格验证
# ...
fi
完整工作示例请参见examples/read-settings-hook.sh。
从命令
命令可以读取设置文件以自定义行为:
---
description: 使用插件处理数据
allowed-tools: ["Read", "Bash"]
---
# 处理命令
步骤:
1. 检查设置是否存在于`.claude/my-plugin.local.md`
2. 使用Read工具读取配置
3. 解析YAML frontmatter以提取设置
4. 将设置应用于处理逻辑
5. 使用配置的行为执行
从代理
代理可以在其指令中引用设置:
---
name: configured-agent
description: 适应项目设置的代理
---
检查`.claude/my-plugin.local.md`处的插件设置。
如果存在,解析YAML frontmatter并根据以下内容调整行为:
- enabled: 插件是否激活
- mode: 处理模式(严格、标准、宽松)
- 附加配置字段
解析技术
提取Frontmatter
# 提取---标记之间的所有内容
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$FILE")
读取单个字段
字符串字段:
VALUE=$(echo "$FRONTMATTER" | grep '^field_name:' | sed 's/field_name: *//' | sed 's/^"\(.*\)"$/\1/')
布尔字段:
ENABLED=$(echo "$FRONTMATTER" | grep '^enabled:' | sed 's/enabled: *//')
# 比较: if [[ "$ENABLED" == "true" ]]; then
数字字段:
MAX=$(echo "$FRONTMATTER" | grep '^max_value:' | sed 's/max_value: *//')
# 使用: if [[ $MAX -gt 100 ]]; then
读取Markdown正文
提取第二个---之后的内容:
# 获取结束---之后的所有内容
BODY=$(awk '/^---$/{i++; next} i>=2' "$FILE")
常见模式
模式1: 临时激活钩子
使用设置文件控制钩子激活:
#!/bin/bash
STATE_FILE=".claude/security-scan.local.md"
# 如果未配置则快速退出
if [[ ! -f "$STATE_FILE" ]]; then
exit 0
fi
# 读取启用标志
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$STATE_FILE")
ENABLED=$(echo "$FRONTMATTER" | grep '^enabled:' | sed 's/enabled: *//')
if [[ "$ENABLED" != "true" ]]; then
exit 0 # 已禁用
fi
# 运行钩子逻辑
# ...
使用场景: 无需编辑hooks.json即可启用/禁用钩子(需要重启)。
模式2: 代理状态管理
存储代理特定状态和配置:
.claude/multi-agent-swarm.local.md:
---
agent_name: auth-agent
task_number: 3.5
pr_number: 1234
coordinator_session: team-leader
enabled: true
dependencies: ["Task 3.4"]
---
# 任务分配
为API实现JWT身份验证。
**成功标准:**
- 创建身份验证端点
- 测试通过
- 创建PR且CI通过
从钩子读取以协调代理:
AGENT_NAME=$(echo "$FRONTMATTER" | grep '^agent_name:' | sed 's/agent_name: *//')
COORDINATOR=$(echo "$FRONTMATTER" | grep '^coordinator_session:' | sed 's/coordinator_session: *//')
# 向协调者发送通知
tmux send-keys -t "$COORDINATOR" "Agent $AGENT_NAME completed task" Enter
模式3: 配置驱动行为
.claude/my-plugin.local.md:
---
validation_level: strict
max_file_size: 1000000
allowed_extensions: [".js", ".ts", ".tsx"]
enable_logging: true
---
# 验证配置
此项目启用严格模式。
所有写入都根据安全策略进行验证。
在钩子或命令中使用:
LEVEL=$(echo "$FRONTMATTER" | grep '^validation_level:' | sed 's/validation_level: *//')
case "$LEVEL" in
strict)
# 应用严格验证
;;
standard)
# 应用标准验证
;;
lenient)
# 应用宽松验证
;;
esac
创建设置文件
从命令
命令可以创建设置文件:
# 设置命令
步骤:
1. 询问用户配置偏好
2. 使用YAML frontmatter创建`.claude/my-plugin.local.md`
3. 根据用户输入设置适当的值
4. 通知用户设置已保存
5. 提醒用户重启Claude Code以使钩子识别更改
模板生成
在插件README中提供模板:
## 配置
在您的项目中创建`.claude/my-plugin.local.md`:
\`\`\`markdown
---
enabled: true
mode: standard
max_retries: 3
---
# 插件配置
您的设置已激活。
\`\`\`
创建或编辑后,重启Claude Code以使更改生效。
最佳实践
文件命名
✅ 应做:
- 使用
.claude/插件名称.local.md格式 - 与插件名称完全匹配
- 对用户本地文件使用
.local.md后缀
❌ 不应做:
- 使用不同的目录(非
.claude/) - 使用不一致的命名
- 使用没有
.local的.md(可能会被提交)
Gitignore
始终添加到.gitignore:
.claude/*.local.md
.claude/*.local.json
在插件README中记录此内容。
默认值
当设置文件不存在时提供合理的默认值:
if [[ ! -f "$STATE_FILE" ]]; then
# 使用默认值
ENABLED=true
MODE=standard
else
# 从文件读取
# ...
fi
验证
验证设置值:
MAX=$(echo "$FRONTMATTER" | grep '^max_value:' | sed 's/max_value: *//')
# 验证数字范围
if ! [[ "$MAX" =~ ^[0-9]+$ ]] || [[ $MAX -lt 1 ]] || [[ $MAX -gt 100 ]]; then
echo "⚠️ 设置中的max_value无效(必须为1-100)" >&2
MAX=10 # 使用默认值
fi
重启要求
重要: 设置更改需要重启Claude Code。
在您的README中记录:
## 更改设置
编辑`.claude/my-plugin.local.md`后:
1. 保存文件
2. 退出Claude Code
3. 重启: `claude` 或 `cc`
4. 新设置将被加载
钩子不能在会话内热交换。
安全考虑
清理用户输入
从用户输入写入设置文件时:
# 转义用户输入中的引号
SAFE_VALUE=$(echo "$USER_INPUT" | sed 's/"/\\"/g')
# 写入文件
cat > "$STATE_FILE" <<EOF
---
user_setting: "$SAFE_VALUE"
---
EOF
验证文件路径
如果设置包含文件路径:
FILE_PATH=$(echo "$FRONTMATTER" | grep '^data_file:' | sed 's/data_file: *//')
# 检查路径遍历
if [[ "$FILE_PATH" == *".."* ]]; then
echo "⚠️ 设置中的路径无效(路径遍历)" >&2
exit 2
fi
权限
设置文件应:
- 仅用户可读(
chmod 600) - 不提交到git
- 不在用户之间共享
实际示例
multi-agent-swarm插件
.claude/multi-agent-swarm.local.md:
---
agent_name: auth-implementation
task_number: 3.5
pr_number: 1234
coordinator_session: team-leader
enabled: true
dependencies: ["Task 3.4"]
additional_instructions: 使用JWT令牌,而非会话
---
# 任务: 实现身份验证
为REST API构建基于JWT的身份验证。
与auth-agent协调共享类型。
钩子使用(agent-stop-notification.sh):
- 检查文件是否存在(第15-18行: 如果不存在则快速退出)
- 解析frontmatter以获取coordinator_session、agent_name、enabled
- 如果启用则向协调者发送通知
- 允许通过
enabled: true/false快速激活/停用
ralph-loop插件
.claude/ralph-loop.local.md:
---
iteration: 1
max_iterations: 10
completion_promise: "所有测试通过且构建成功"
---
修复项目中的所有linting错误。
确保每次修复后测试通过。
钩子使用(stop-hook.sh):
- 检查文件是否存在(第15-18行: 如果不活动则快速退出)
- 读取迭代计数和max_iterations
- 提取completion_promise用于循环终止
- 读取正文作为反馈的提示
- 每次循环更新迭代计数
快速参考
文件位置
项目根目录/
└── .claude/
└── 插件名称.local.md
Frontmatter解析
# 提取frontmatter
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$FILE")
# 读取字段
VALUE=$(echo "$FRONTMATTER" | grep '^field:' | sed 's/field: *//' | sed 's/^"\(.*\)"$/\1/')
正文解析
# 提取正文(第二个---之后)
BODY=$(awk '/^---$/{i++; next} i>=2' "$FILE")
快速退出模式
if [[ ! -f ".claude/my-plugin.local.md" ]]; then
exit 0 # 未配置
fi
附加资源
参考文件
有关详细实现模式:
references/parsing-techniques.md- 解析YAML frontmatter和markdown正文的完整指南references/real-world-examples.md- multi-agent-swarm和ralph-loop实现的深入探讨
示例文件
examples/中的工作示例:
read-settings-hook.sh- 读取并使用设置的钩子create-settings-command.md- 创建设置文件的命令example-settings.md- 模板设置文件
实用脚本
scripts/中的开发工具:
validate-settings.sh- 验证设置文件结构parse-frontmatter.sh- 提取frontmatter字段
实现工作流
向插件添加设置:
- 设计设置模式(哪些字段、类型、默认值)
- 在插件文档中创建模板文件
- 为
.claude/*.local.md添加gitignore条目 - 在钩子/命令中实现设置解析
- 使用快速退出模式(检查文件是否存在,检查启用字段)
- 在插件README中记录设置并附带模板
- 提醒用户更改需要重启Claude Code
专注于保持设置简单,并在设置文件不存在时提供良好的默认值。