plugin-settings
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePlugin Settings Pattern for Claude Code Plugins
Claude Code Plugins的插件设置模式
Overview
概述
Plugins can store user-configurable settings and state in files within the project directory. This pattern uses YAML frontmatter for structured configuration and markdown content for prompts or additional context.
.claude/plugin-name.local.mdKey characteristics:
- File location: in project root
.claude/plugin-name.local.md - Structure: YAML frontmatter + markdown body
- Purpose: Per-project plugin configuration and state
- Usage: Read from hooks, commands, and agents
- Lifecycle: User-managed (not in git, should be in )
.gitignore
插件可以在项目目录内的文件中存储用户可配置的设置和状态。该模式使用YAML frontmatter用于结构化配置,markdown内容用于提示或额外上下文。
.claude/plugin-name.local.md核心特性:
- 文件位置:项目根目录下的
.claude/plugin-name.local.md - 结构:YAML frontmatter + markdown正文
- 用途:每个项目的插件配置和状态
- 使用场景:从钩子、命令和Agent中读取
- 生命周期:用户管理(不纳入git,应添加到中)
.gitignore
File Structure
文件结构
Basic Template
基础模板
markdown
---
enabled: true
setting1: value1
setting2: value2
numeric_setting: 42
list_setting: ["item1", "item2"]
---markdown
---
enabled: true
setting1: value1
setting2: value2
numeric_setting: 42
list_setting: ["item1", "item2"]
---Additional Context
额外上下文
This markdown body can contain:
- Task descriptions
- Additional instructions
- Prompts to feed back to Claude
- Documentation or notes
undefined该markdown正文可包含:
- 任务描述
- 额外说明
- 反馈给Claude的提示词
- 文档或备注
undefinedExample: Plugin State File
示例:插件状态文件
.claude/my-plugin.local.md:
markdown
---
enabled: true
strict_mode: false
max_retries: 3
notification_level: info
coordinator_session: team-leader
---.claude/my-plugin.local.md:
markdown
---
enabled: true
strict_mode: false
max_retries: 3
notification_level: info
coordinator_session: team-leader
---Plugin Configuration
插件配置
This plugin is configured for standard validation mode.
Contact @team-lead with questions.
undefined本插件已配置为标准验证模式。
如有问题请联系@team-lead。
undefinedReading Settings Files
读取设置文件
From Hooks (Bash Scripts)
从钩子(Bash脚本)读取
Pattern: Check existence and parse frontmatter
bash
#!/bin/bash
set -euo pipefail模式:检查文件是否存在并解析frontmatter
bash
#!/bin/bash
set -euo pipefailDefine state file path
定义状态文件路径
STATE_FILE=".claude/my-plugin.local.md"
STATE_FILE=".claude/my-plugin.local.md"
Quick exit if file doesn't exist
如果文件不存在则快速退出
if [[ ! -f "$STATE_FILE" ]]; then
exit 0 # Plugin not configured, skip
fi
if [[ ! -f "$STATE_FILE" ]]; then
exit 0 # 插件未配置,跳过
fi
Parse YAML frontmatter (between --- markers)
解析YAML frontmatter(---标记之间的内容)
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$STATE_FILE")
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$STATE_FILE")
Extract individual fields
提取单个字段
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/')
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/')
Check if enabled
检查是否启用
if [[ "$ENABLED" != "true" ]]; then
exit 0 # Disabled
fi
if [[ "$ENABLED" != "true" ]]; then
exit 0 # 已禁用
fi
Use configuration in hook logic
在钩子逻辑中应用配置
if [[ "$STRICT_MODE" == "true" ]]; then
Apply strict validation
...
fi
See `examples/read-settings-hook.sh` for complete working example.if [[ "$STRICT_MODE" == "true" ]]; then
应用严格验证
...
fi
完整工作示例请查看`examples/read-settings-hook.sh`。From Commands
从命令读取
Commands can read settings files to customize behavior:
markdown
---
description: Process data with plugin
allowed-tools: ["Read", "Bash"]
---命令可以读取设置文件来自定义行为:
markdown
---
description: Process data with plugin
allowed-tools: ["Read", "Bash"]
---Process Command
处理命令
Steps:
- Check if settings exist at
.claude/my-plugin.local.md - Read configuration using Read tool
- Parse YAML frontmatter to extract settings
- Apply settings to processing logic
- Execute with configured behavior
undefined步骤:
- 检查是否存在设置
.claude/my-plugin.local.md - 使用Read工具读取配置
- 解析YAML frontmatter以提取设置
- 将设置应用到处理逻辑
- 按照配置的行为执行
undefinedFrom Agents
从Agent读取
Agents can reference settings in their instructions:
markdown
---
name: configured-agent
description: Agent that adapts to project settings
---
Check for plugin settings at `.claude/my-plugin.local.md`.
If present, parse YAML frontmatter and adapt behavior according to:
- enabled: Whether plugin is active
- mode: Processing mode (strict, standard, lenient)
- Additional configuration fieldsAgent可以在其指令中引用设置:
markdown
---
name: configured-agent
description: Agent that adapts to project settings
---
检查`.claude/my-plugin.local.md`中的插件设置。
如果存在,解析YAML frontmatter并根据以下内容调整行为:
- enabled:插件是否激活
- mode:处理模式(strict、standard、lenient)
- 其他配置字段Parsing Techniques
解析技巧
Extract Frontmatter
提取Frontmatter
bash
undefinedbash
undefinedExtract everything between --- markers
提取---标记之间的所有内容
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$FILE")
undefinedFRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$FILE")
undefinedRead Individual Fields
读取单个字段
String fields:
bash
VALUE=$(echo "$FRONTMATTER" | grep '^field_name:' | sed 's/field_name: *//' | sed 's/^"\(.*\)"$/\1/')Boolean fields:
bash
ENABLED=$(echo "$FRONTMATTER" | grep '^enabled:' | sed 's/enabled: *//')字符串字段:
bash
VALUE=$(echo "$FRONTMATTER" | grep '^field_name:' | sed 's/field_name: *//' | sed 's/^"\(.*\)"$/\1/')布尔字段:
bash
ENABLED=$(echo "$FRONTMATTER" | grep '^enabled:' | sed 's/enabled: *//')Compare: if [[ "$ENABLED" == "true" ]]; then
比较:if [[ "$ENABLED" == "true" ]]; then
**Numeric fields:**
```bash
MAX=$(echo "$FRONTMATTER" | grep '^max_value:' | sed 's/max_value: *//')
**数值字段:**
```bash
MAX=$(echo "$FRONTMATTER" | grep '^max_value:' | sed 's/max_value: *//')Use: if [[ $MAX -gt 100 ]]; then
使用:if [[ $MAX -gt 100 ]]; then
undefinedundefinedRead Markdown Body
读取Markdown正文
Extract content after second :
---bash
undefined提取第二个之后的内容:
---bash
undefinedGet everything after closing ---
获取结束---之后的所有内容
BODY=$(awk '/^---$/{i++; next} i>=2' "$FILE")
undefinedBODY=$(awk '/^---$/{i++; next} i>=2' "$FILE")
undefinedCommon Patterns
常见模式
Pattern 1: Temporarily Active Hooks
模式1:临时激活钩子
Use settings file to control hook activation:
bash
#!/bin/bash
STATE_FILE=".claude/security-scan.local.md"使用设置文件控制钩子的激活:
bash
#!/bin/bash
STATE_FILE=".claude/security-scan.local.md"Quick exit if not configured
如果未配置则快速退出
if [[ ! -f "$STATE_FILE" ]]; then
exit 0
fi
if [[ ! -f "$STATE_FILE" ]]; then
exit 0
fi
Read enabled flag
读取启用标志
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$STATE_FILE")
ENABLED=$(echo "$FRONTMATTER" | grep '^enabled:' | sed 's/enabled: *//')
if [[ "$ENABLED" != "true" ]]; then
exit 0 # Disabled
fi
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$STATE_FILE")
ENABLED=$(echo "$FRONTMATTER" | grep '^enabled:' | sed 's/enabled: *//')
if [[ "$ENABLED" != "true" ]]; then
exit 0 # 已禁用
fi
Run hook logic
运行钩子逻辑
...
...
**Use case:** Enable/disable hooks without editing hooks.json (requires restart).
**使用场景:**无需编辑hooks.json即可启用/禁用钩子(需要重启)。Pattern 2: Agent State Management
模式2:Agent状态管理
Store agent-specific state and configuration:
.claude/multi-agent-swarm.local.md:
markdown
---
agent_name: auth-agent
task_number: 3.5
pr_number: 1234
coordinator_session: team-leader
enabled: true
dependencies: ["Task 3.4"]
---存储Agent特定的状态和配置:
.claude/multi-agent-swarm.local.md:
markdown
---
agent_name: auth-agent
task_number: 3.5
pr_number: 1234
coordinator_session: team-leader
enabled: true
dependencies: ["Task 3.4"]
---Task Assignment
任务分配
Implement JWT authentication for the API.
Success Criteria:
- Authentication endpoints created
- Tests passing
- PR created and CI green
Read from hooks to coordinate agents:
```bash
AGENT_NAME=$(echo "$FRONTMATTER" | grep '^agent_name:' | sed 's/agent_name: *//')
COORDINATOR=$(echo "$FRONTMATTER" | grep '^coordinator_session:' | sed 's/coordinator_session: *//')为API实现JWT认证。
成功标准:
- 已创建认证端点
- 测试通过
- 已创建PR且CI检测通过
从钩子读取以协调Agent:
```bash
AGENT_NAME=$(echo "$FRONTMATTER" | grep '^agent_name:' | sed 's/agent_name: *//')
COORDINATOR=$(echo "$FRONTMATTER" | grep '^coordinator_session:' | sed 's/coordinator_session: *//')Send notification to coordinator
向协调者发送通知
tmux send-keys -t "$COORDINATOR" "Agent $AGENT_NAME completed task" Enter
undefinedtmux send-keys -t "$COORDINATOR" "Agent $AGENT_NAME completed task" Enter
undefinedPattern 3: Configuration-Driven Behavior
模式3:配置驱动的行为
.claude/my-plugin.local.md:
markdown
---
validation_level: strict
max_file_size: 1000000
allowed_extensions: [".js", ".ts", ".tsx"]
enable_logging: true
---.claude/my-plugin.local.md:
markdown
---
validation_level: strict
max_file_size: 1000000
allowed_extensions: [".js", ".ts", ".tsx"]
enable_logging: true
---Validation Configuration
验证配置
Strict mode enabled for this project.
All writes validated against security policies.
Use in hooks or commands:
```bash
LEVEL=$(echo "$FRONTMATTER" | grep '^validation_level:' | sed 's/validation_level: *//')
case "$LEVEL" in
strict)
# Apply strict validation
;;
standard)
# Apply standard validation
;;
lenient)
# Apply lenient validation
;;
esac本项目已启用严格模式。
所有写入操作均需符合安全策略验证。
在钩子或命令中使用:
```bash
LEVEL=$(echo "$FRONTMATTER" | grep '^validation_level:' | sed 's/validation_level: *//')
case "$LEVEL" in
strict)
# 应用严格验证
;;
standard)
# 应用标准验证
;;
lenient)
# 应用宽松验证
;;
esacCreating Settings Files
创建设置文件
From Commands
从命令创建
Commands can create settings files:
markdown
undefined命令可以创建设置文件:
markdown
undefinedSetup Command
设置命令
Steps:
- Ask user for configuration preferences
- Create with YAML frontmatter
.claude/my-plugin.local.md - Set appropriate values based on user input
- Inform user that settings are saved
- Remind user to restart Claude Code for hooks to recognize changes
undefined步骤:
- 询问用户的配置偏好
- 创建包含YAML frontmatter的.claude/my-plugin.local.md文件
- 根据用户输入设置相应的值
- 告知用户设置已保存
- 提醒用户重启Claude Code以使钩子识别更改
undefinedTemplate Generation
模板生成
Provide template in plugin README:
markdown
undefined在插件README中提供模板:
markdown
undefinedConfiguration
配置
Create in your project:
.claude/my-plugin.local.md```markdown
enabled: true mode: standard max_retries: 3
在你的项目中创建.claude/my-plugin.local.md:
```markdown
enabled: true mode: standard max_retries: 3
Plugin Configuration
插件配置
Your settings are active.
```
After creating or editing, restart Claude Code for changes to take effect.
undefined你的设置已生效。
```
创建或编辑后,请重启Claude Code以使更改生效。
undefinedBest Practices
最佳实践
File Naming
文件命名
✅ DO:
- Use format
.claude/plugin-name.local.md - Match plugin name exactly
- Use suffix for user-local files
.local.md
❌ DON'T:
- Use different directory (not )
.claude/ - Use inconsistent naming
- Use without
.md(might be committed).local
✅ 推荐做法:
- 使用格式
.claude/plugin-name.local.md - 与插件名称完全匹配
- 使用后缀表示用户本地文件
.local.md
❌ 不推荐:
- 使用不同目录(非.claude/)
- 使用不一致的命名
- 使用不带的
.local文件(可能会被提交到git).md
Gitignore
Gitignore
Always add to :
.gitignoregitignore
.claude/*.local.md
.claude/*.local.jsonDocument this in plugin README.
务必添加到.gitignore中:
gitignore
.claude/*.local.md
.claude/*.local.json在插件README中记录此配置。
Defaults
默认值
Provide sensible defaults when settings file doesn't exist:
bash
if [[ ! -f "$STATE_FILE" ]]; then
# Use defaults
ENABLED=true
MODE=standard
else
# Read from file
# ...
fi当设置文件不存在时提供合理的默认值:
bash
if [[ ! -f "$STATE_FILE" ]]; then
# 使用默认值
ENABLED=true
MODE=standard
else
# 从文件读取
# ...
fiValidation
验证
Validate settings values:
bash
MAX=$(echo "$FRONTMATTER" | grep '^max_value:' | sed 's/max_value: *//')验证设置值的有效性:
bash
MAX=$(echo "$FRONTMATTER" | grep '^max_value:' | sed 's/max_value: *//')Validate numeric range
验证数值范围
if ! [[ "$MAX" =~ ^[0-9]+$ ]] || [[ $MAX -lt 1 ]] || [[ $MAX -gt 100 ]]; then
echo "⚠️ Invalid max_value in settings (must be 1-100)" >&2
MAX=10 # Use default
fi
undefinedif ! [[ "$MAX" =~ ^[0-9]+$ ]] || [[ $MAX -lt 1 ]] || [[ $MAX -gt 100 ]]; then
echo "⚠️ 设置中的max_value无效(必须为1-100)" >&2
MAX=10 # 使用默认值
fi
undefinedRestart Requirement
重启要求
Important: Settings changes require Claude Code restart.
Document in your README:
markdown
undefined**重要提示:**更改设置后需要重启Claude Code。
在README中记录:
markdown
undefinedChanging Settings
更改设置
After editing :
.claude/my-plugin.local.md- Save the file
- Exit Claude Code
- Restart: or
claudecc - New settings will be loaded
Hooks cannot be hot-swapped within a session.编辑.claude/my-plugin.local.md后:
- 保存文件
- 退出Claude Code
- 重启:或
claudecc - 新设置将生效
钩子无法在会话中热替换。Security Considerations
安全注意事项
Sanitize User Input
清理用户输入
When writing settings files from user input:
bash
undefined当从用户输入写入设置文件时:
bash
undefinedEscape quotes in user input
转义用户输入中的引号
SAFE_VALUE=$(echo "$USER_INPUT" | sed 's/"/\"/g')
SAFE_VALUE=$(echo "$USER_INPUT" | sed 's/"/\"/g')
Write to file
写入文件
cat > "$STATE_FILE" <<EOF
user_setting: "$SAFE_VALUE"
EOF
undefinedcat > "$STATE_FILE" <<EOF
user_setting: "$SAFE_VALUE"
EOF
undefinedValidate File Paths
验证文件路径
If settings contain file paths:
bash
FILE_PATH=$(echo "$FRONTMATTER" | grep '^data_file:' | sed 's/data_file: *//')如果设置中包含文件路径:
bash
FILE_PATH=$(echo "$FRONTMATTER" | grep '^data_file:' | sed 's/data_file: *//')Check for path traversal
检查路径遍历
if [[ "$FILE_PATH" == ".." ]]; then
echo "⚠️ Invalid path in settings (path traversal)" >&2
exit 2
fi
undefinedif [[ "$FILE_PATH" == ".." ]]; then
echo "⚠️ 设置中的路径无效(存在路径遍历风险)" >&2
exit 2
fi
undefinedPermissions
权限
Settings files should be:
- Readable by user only ()
chmod 600 - Not committed to git
- Not shared between users
设置文件应:
- 仅对用户可读()
chmod 600 - 不提交到git
- 不在用户之间共享
Real-World Examples
真实世界示例
multi-agent-swarm Plugin
multi-agent-swarm插件
.claude/multi-agent-swarm.local.md:
markdown
---
agent_name: auth-implementation
task_number: 3.5
pr_number: 1234
coordinator_session: team-leader
enabled: true
dependencies: ["Task 3.4"]
additional_instructions: Use JWT tokens, not sessions
---.claude/multi-agent-swarm.local.md:
markdown
---
agent_name: auth-implementation
task_number: 3.5
pr_number: 1234
coordinator_session: team-leader
enabled: true
dependencies: ["Task 3.4"]
additional_instructions: Use JWT tokens, not sessions
---Task: Implement Authentication
任务:实现认证
Build JWT-based authentication for the REST API.
Coordinate with auth-agent on shared types.
**Hook usage (agent-stop-notification.sh):**
- Checks if file exists (line 15-18: quick exit if not)
- Parses frontmatter to get coordinator_session, agent_name, enabled
- Sends notifications to coordinator if enabled
- Allows quick activation/deactivation via `enabled: true/false`为REST API构建基于JWT的认证。
与auth-agent协调共享类型定义。
**钩子用法(agent-stop-notification.sh):**
- 检查文件是否存在(第15-18行:如果不存在则快速退出)
- 解析frontmatter以获取coordinator_session、agent_name和enabled字段
- 如果启用则向协调者发送通知
- 允许通过`enabled: true/false`快速激活/停用ralph-wiggum Plugin
ralph-wiggum插件
.claude/ralph-loop.local.md:
markdown
---
iteration: 1
max_iterations: 10
completion_promise: "All tests passing and build successful"
---
Fix all the linting errors in the project.
Make sure tests pass after each fix.Hook usage (stop-hook.sh):
- Checks if file exists (line 15-18: quick exit if not active)
- Reads iteration count and max_iterations
- Extracts completion_promise for loop termination
- Reads body as the prompt to feed back
- Updates iteration count on each loop
.claude/ralph-loop.local.md:
markdown
---
iteration: 1
max_iterations: 10
completion_promise: "All tests passing and build successful"
---
修复项目中的所有linting错误。
确保每次修复后测试都能通过。钩子用法(stop-hook.sh):
- 检查文件是否存在(第15-18行:如果未激活则快速退出)
- 读取迭代次数和最大迭代次数
- 提取completion_promise用于循环终止
- 读取正文作为反馈提示词
- 每次循环更新迭代次数
Quick Reference
快速参考
File Location
文件位置
project-root/
└── .claude/
└── plugin-name.local.mdproject-root/
└── .claude/
└── plugin-name.local.mdFrontmatter Parsing
Frontmatter解析
bash
undefinedbash
undefinedExtract frontmatter
提取frontmatter
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$FILE")
FRONTMATTER=$(sed -n '/^---$/,/^---$/{ /^---$/d; p; }' "$FILE")
Read field
读取字段
VALUE=$(echo "$FRONTMATTER" | grep '^field:' | sed 's/field: //' | sed 's/^"(.)"$/\1/')
undefinedVALUE=$(echo "$FRONTMATTER" | grep '^field:' | sed 's/field: //' | sed 's/^"(.)"$/\1/')
undefinedBody Parsing
正文解析
bash
undefinedbash
undefinedExtract body (after second ---)
提取正文(第二个---之后的内容)
BODY=$(awk '/^---$/{i++; next} i>=2' "$FILE")
undefinedBODY=$(awk '/^---$/{i++; next} i>=2' "$FILE")
undefinedQuick Exit Pattern
快速退出模式
bash
if [[ ! -f ".claude/my-plugin.local.md" ]]; then
exit 0 # Not configured
fibash
if [[ ! -f ".claude/my-plugin.local.md" ]]; then
exit 0 # 未配置
fiAdditional Resources
额外资源
Reference Files
参考文件
For detailed implementation patterns:
- - Complete guide to parsing YAML frontmatter and markdown bodies
references/parsing-techniques.md - - Deep dive into multi-agent-swarm and ralph-wiggum implementations
references/real-world-examples.md
如需详细的实现模式:
- - 解析YAML frontmatter和markdown正文的完整指南
references/parsing-techniques.md - - 深入分析multi-agent-swarm和ralph-wiggum的实现
references/real-world-examples.md
Example Files
示例文件
Working examples in :
examples/- - Hook that reads and uses settings
read-settings-hook.sh - - Command that creates settings file
create-settings-command.md - - Template settings file
example-settings.md
examples/- - 读取并使用设置的钩子
read-settings-hook.sh - - 创建设置文件的命令
create-settings-command.md - - 模板设置文件
example-settings.md
Utility Scripts
实用脚本
Development tools in :
scripts/- - Validate settings file structure
validate-settings.sh - - Extract frontmatter fields
parse-frontmatter.sh
scripts/- - 验证设置文件结构
validate-settings.sh - - 提取frontmatter字段
parse-frontmatter.sh
Implementation Workflow
实现工作流
To add settings to a plugin:
- Design settings schema (which fields, types, defaults)
- Create template file in plugin documentation
- Add gitignore entry for
.claude/*.local.md - Implement settings parsing in hooks/commands
- Use quick-exit pattern (check file exists, check enabled field)
- Document settings in plugin README with template
- Remind users that changes require Claude Code restart
Focus on keeping settings simple and providing good defaults when settings file doesn't exist.
为插件添加设置的步骤:
- 设计设置 schema(包含哪些字段、类型、默认值)
- 在插件文档中创建模板文件
- 添加.gitignore条目
.claude/*.local.md - 在钩子/命令中实现设置解析
- 使用快速退出模式(检查文件是否存在,检查enabled字段)
- 在插件README中记录设置并提供模板
- 提醒用户更改设置后需要重启Claude Code
重点在于保持设置简洁,并在设置文件不存在时提供良好的默认值。