command-design
3
总安装量
2
周安装量
#61552
全站排名
安装命令
npx skills add https://github.com/forever19735/garbage --skill command-design
Agent 安装分布
opencode
2
claude-code
2
github-copilot
2
codex
2
kimi-cli
2
gemini-cli
2
Skill 文档
When to use this skill
Use this skill when you need to:
- Design new bot commands and syntax
- Implement command parsing and validation
- Create help and documentation systems
- Handle command errors gracefully
- Design multi-parameter command formats
- Implement command aliases and shortcuts
- Build hierarchical help menus
How to use it
Command Design Principles
- Prefix Convention: Use
@to distinguish bot commands - Simple Syntax: Keep commands short and memorable
- Clear Feedback: Always respond with success/error messages
- Help System: Provide comprehensive, contextual help
- Validation: Validate inputs before processing
Command Categories
1. Query Commands (Read-Only)
Commands that display information without modifying state:
@schedule # View broadcast schedule
@members # View member rotation table
@help # Show help menu
@help schedule # Show specific help topic
Implementation Pattern:
if command == 'schedule':
schedule_info = get_group_schedule_for_display(group_id)
reply_text = format_schedule_display(schedule_info)
elif command == 'members':
reply_text = get_member_schedule_summary(group_id)
elif command == 'help':
topic = args[0] if args else None
reply_text = get_help_message(topic)
2. Configuration Commands (Settings)
Commands that modify group settings:
@time 18:00 # Set broadcast time
@day mon,wed,fri # Set broadcast days
@cron mon,thu 20 15 # Set days and time together
Implementation Pattern:
elif command == 'time':
if not args:
reply_text = "â è«æå®æéï¼ä¾å¦ï¼@time 18:00"
else:
try:
time_str = args[0]
hour, minute = parse_time(time_str)
# Update schedule
if group_id not in group_schedules:
group_schedules[group_id] = {}
group_schedules[group_id]['hour'] = hour
group_schedules[group_id]['minute'] = minute
save_group_schedules(group_schedules)
reply_text = f"â
æ¨ææéå·²è¨çº {hour:02d}:{minute:02d}"
except ValueError as e:
reply_text = f"â æéæ ¼å¼é¯èª¤ï¼{e}"
def parse_time(time_str):
"""Parse time string HH:MM"""
parts = time_str.split(':')
if len(parts) != 2:
raise ValueError("è«ä½¿ç¨ HH:MM æ ¼å¼ï¼ä¾å¦ 18:00")
hour = int(parts[0])
minute = int(parts[1])
if not (0 <= hour <= 23):
raise ValueError("å°æå¿
é å¨ 0-23 ä¹é")
if not (0 <= minute <= 59):
raise ValueError("åéå¿
é å¨ 0-59 ä¹é")
return hour, minute
3. Data Management Commands
Commands that modify member data:
@week 1 Alice,Bob # Set week 1 members
@addmember 1 Charlie # Add member to week 1
@removemember 1 Alice # Remove member from week 1
@clearweek 1 # Clear week 1
@reset # Reset all data (dangerous!)
Implementation Pattern:
elif command == 'week':
if len(args) < 2:
reply_text = "â æ ¼å¼ï¼@week 鱿¸ æå¡1,æå¡2\nä¾å¦ï¼@week 1 å°æ,å°è¯"
else:
try:
week_num = int(args[0])
members_str = args[1]
members = [m.strip() for m in members_str.split(',')]
result = update_member_schedule(week_num, members, group_id)
if result['success']:
reply_text = f"â
{result['message']}"
else:
reply_text = f"â {result['message']}"
except ValueError:
reply_text = "â 鱿¸å¿
é æ¯æ¸å"
Help System Design
1. Main Help Menu
def get_help_message(topic=None):
"""
Get help message for specific topic or general help
Args:
topic: Help topic (schedule, members, groups) or None for main menu
"""
if topic is None:
return """
ð åå¾è¼ªå¼æé Bot ä½¿ç¨æå
ð æ¥è©¢æä»¤ï¼
@schedule - æ¥çæ¬ç¾¤çµæ¨ææç¨
@members - æ¥çæ¬ç¾¤çµå®æ´è¼ªå¼è¡¨
âï¸ æç¨è¨å®ï¼
@time 18:30 - è¨å®æ¬ç¾¤çµæ¨ææé
@day mon,thu - è¨å®æ¬ç¾¤çµæ¨æææ
@cron tue,fri 20 15 - åæè¨å®ææåæé
ð¥ æå¡ç®¡çï¼
@week 1 Alice,Bob - è¨å®ç¬¬1鱿å¡
@addmember 1 Charlie - æ·»å æå¡å°ç¬¬1é±
@removemember 1 Alice - å¾ç¬¬1é±ç§»é¤æå¡
ð¡ 詳細說æï¼
@help schedule - æç¨ç®¡çæä»¤èªªæ
@help members - æå¡ç®¡çæä»¤èªªæ
@help groups - 群çµç®¡çæä»¤èªªæ
"""
elif topic == 'schedule':
return """
âï¸ æç¨ç®¡çæä»¤è©³ç´°èªªæ
ð
æ¥çæç¨ï¼
@schedule
顯示æ¬ç¾¤çµçæ¨ææéãææå䏿¬¡å·è¡æé
â° è¨å®æ¨ææéï¼
@time 18:00
è¨å®æ¯å¤©æ¨æçæéï¼24å°æå¶ï¼
ð è¨å®æ¨æææï¼
@day mon,wed,fri
è¨å®ä¸é±ä¸åªå¹¾å¤©è¦æ¨æ
å¯ç¨çææï¼mon, tue, wed, thu, fri, sat, sun
ð§ 䏿¬¡è¨å®æéåææï¼
@cron mon,thu 20 15
çåæ¼ï¼@day mon,thu + @time 20:15
ð¡ ç¯ä¾ï¼
@time 09:00 â è¨å®æ¯å¤© 09:00 æ¨æ
@day mon,wed,fri â è¨å®é±ä¸ä¸äºæ¨æ
@cron tue,thu 17 30 â è¨å®é±äºå 17:30 æ¨æ
"""
elif topic == 'members':
return """
ð¥ æå¡ç®¡çæä»¤è©³ç´°èªªæ
ð æ¥çæå¡ï¼
@members
顯示ææé±æ¬¡çæå¡å®æåç®åæ¯ç¬¬å¹¾é±
â è¨å®é±æ¬¡æå¡ï¼
@week 1 å°æ,å°è¯
è¨å®ç¬¬1é±ç±å°æåå°è¯è² 責
å¦æè©²é±å·²ææå¡ï¼æè¢«æ°æå¡å代
âï¸ æ·»å æå¡å°é±æ¬¡ï¼
@addmember 2 å°å¼·
å°å°å¼·å å
¥ç¬¬2é±ï¼ä¸æè¦èåææå¡ï¼
â ç§»é¤é±æ¬¡æå¡ï¼
@removemember 1 å°æ
å°å°æå¾ç¬¬1é±ç§»é¤
ðï¸ æ¸
ç©ºé±æ¬¡ï¼
@clearweek 2
æ¸
空第2é±çæææå¡
ð¡ ç¯ä¾ï¼
@week 1 Alice,Bob â 第1é±ï¼Alice, Bob
@week 2 Charlie â 第2é±ï¼Charlie
@addmember 1 David â 第1é±ï¼Alice, Bob, David
@removemember 1 Bob â 第1é±ï¼Alice, David
"""
elif topic == 'groups':
return """
ð¢ å¤ç¾¤çµåè½èªªæ
æ¬ Bot æ¯æ´åæç®¡çå¤å群çµï¼æ¯å群çµé½æç¨ç«çï¼
⢠æå¡è¼ªå¼è¡¨
â¢ æ¨ææéè¨å®
â¢ æ¨æææè¨å®
ð¤ èªå群çµç®¡çï¼
⢠Bot å å
¥ç¾¤çµææèªåè¨é
⢠Bot é¢éç¾¤çµææèªåæ¸
çè³æ
⢠æ¯å群çµçæç¨å®å
¨ç¨ç«éä½
ð 群çµè³æéé¢ï¼
⢠A群çµçæå¡è¨å®ä¸æå½±é¿B群çµ
⢠A群çµè¨å®é±ä¸æ¨æï¼B群çµå¯è¨å®é±äºæ¨æ
â¢ æææä»¤é½åªå½±é¿ç¶å群çµ
ð¡ æä½³å¯¦è¸ï¼
1. 卿¯å群çµä¸åå¥è¨å®æ¨ææé
2. ä½¿ç¨ @schedule 確èªè¨å®æ£ç¢º
3. ä½¿ç¨ @members æ¥çç¶å群çµè¼ªå¼è¡¨
"""
else:
return f"â æªç¥ç說æä¸»é¡ï¼{topic}\n\nä½¿ç¨ @help æ¥çå¯ç¨ä¸»é¡"
2. Contextual Help
Provide help when users make mistakes:
# Missing arguments
if len(args) < 2:
reply_text = (
"â 忏ä¸è¶³\n\n"
"æ£ç¢ºæ ¼å¼ï¼@week 鱿¸ æå¡1,æå¡2\n"
"ç¯ä¾ï¼@week 1 å°æ,å°è¯\n\n"
"ä½¿ç¨ @help members æ¥ç詳細說æ"
)
# Invalid format
except ValueError:
reply_text = (
"â æ ¼å¼é¯èª¤\n\n"
"æéæ ¼å¼ï¼HH:MM (24å°æå¶)\n"
"ç¯ä¾ï¼@time 18:00\n\n"
"ä½¿ç¨ @help schedule æ¥ç詳細說æ"
)
Input Validation
1. Number Validation
def validate_week_number(week_str):
"""Validate week number input"""
try:
week_num = int(week_str)
if week_num < 1:
raise ValueError("鱿¸å¿
é å¤§æ¼ 0")
return week_num
except ValueError as e:
raise ValueError(f"鱿¸å¿
é æ¯æ£æ´æ¸ï¼{e}")
2. Time Validation
def validate_time(time_str):
"""Validate time string HH:MM"""
if ':' not in time_str:
raise ValueError("è«ä½¿ç¨ HH:MM æ ¼å¼")
parts = time_str.split(':')
if len(parts) != 2:
raise ValueError("è«ä½¿ç¨ HH:MM æ ¼å¼")
hour, minute = int(parts[0]), int(parts[1])
if not (0 <= hour <= 23):
raise ValueError("å°æå¿
é å¨ 0-23 ä¹é")
if not (0 <= minute <= 59):
raise ValueError("åéå¿
é å¨ 0-59 ä¹é")
return hour, minute
3. Day Validation
def validate_days(days_str):
"""Validate days string"""
valid_days = {'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'}
days = [d.strip().lower() for d in days_str.split(',')]
invalid = [d for d in days if d not in valid_days]
if invalid:
raise ValueError(
f"ç¡æçææï¼{', '.join(invalid)}\n"
f"å¯ç¨çææï¼{', '.join(sorted(valid_days))}"
)
return days
Best Practices
-
Consistent Prefix
- Always use
@for commands - Makes it clear what’s a command vs normal chat
- Always use
-
Short Memorable Names
@schedulenot@show_schedule_information@timenot@set_broadcast_time
-
Progressive Disclosure
- Main help shows overview
- Topic help shows details
- Error messages show examples
-
Emoji Usage
- â for success
- â for errors
- ð , ðï¸, ð¥ for visual categorization
- Helps scanning/readability
-
Multi-Language Support (Optional)
LANG = os.getenv('BOT_LANGUAGE', 'zh-TW') MESSAGES = { 'zh-TW': { 'help_title': 'ð ä½¿ç¨æå', 'success': 'â è¨å®æå', # ... }, 'en-US': { 'help_title': 'ð Help Guide', 'success': 'â Success', # ... } }
Testing Commands
# Test command parsing
test_inputs = [
("@time 18:00", "time", ["18:00"]),
("@week 1 Alice,Bob", "week", ["1", "Alice,Bob"]),
("@help schedule", "help", ["schedule"]),
]
for input_text, expected_cmd, expected_args in test_inputs:
parts = input_text[1:].split()
command = parts[0].lower()
args = parts[1:] if len(parts) > 1 else []
assert command == expected_cmd
assert args == expected_args
Reference Links
- See
main.pyfor full command implementations - See
README.mdfor user-facing command documentation