在 Manus 中运行任何 Skill
一键导入
一键导入
一键在 Manus 中运行任何 Skill
开始使用$pwd:
$ git log --oneline --stat
stars:69
forks:10
updated:2026年3月25日 05:51
SKILL.md
| name | hook-template |
| description | Generate hook script from template |
| user-invocable | true |
Generate a hook script and configuration based on requirements.
Usage: /hook-template [hook-type] [purpose]
| Type | When it Runs | Use Case |
|---|---|---|
PreToolUse | Before a tool runs | Block, validate, add context |
PostToolUse | After a tool completes | Log, notify, react |
UserPromptSubmit | User submits a prompt | Context injection, validation |
Stop | Main agent stopping | Completeness check, continue loops |
SubagentStop | Subagent finishes | Task validation |
SessionStart | Session begins | Context loading, env setup |
SessionEnd | Session ends | Cleanup, logging |
PreCompact | Before context compaction | Preserve critical context |
PostCompact | After compaction completes | Context recovery |
Notification | User is notified | External alerts (Slack, etc.) |
Elicitation | MCP server requests input | Override elicitation |
ElicitationResult | Elicitation result available | Post-process |
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
type | String | Yes | - | "command" or "prompt" |
command | String | If type=command | - | Shell command to execute |
prompt | String | If type=prompt | - | Natural language prompt for LLM |
timeout | Integer | No | 60s (command), 30s (prompt) | Seconds |
once | Boolean | No | false | Run hook only once per session |
All hooks receive JSON on stdin with these fields:
{
"session_id": "abc123",
"transcript_path": "/path/to/transcript.txt",
"cwd": "/current/working/dir",
"permission_mode": "ask",
"hook_event_name": "PreToolUse",
"tool_name": "Write",
"tool_input": { "file_path": "/path/to/file" }
}
Gather Requirements
*)Generate Script at .claude/hooks/[name].sh
Update settings.json with hook config
Make Executable: chmod +x
Validate with /hooks-check
#!/bin/bash
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
# Block edits to specific files
if [[ "$FILE" == *"package-lock.json"* ]]; then
echo "BLOCKED: Do not edit lockfiles directly" >&2
exit 2
fi
exit 0 # Allow (no output needed)
#!/bin/bash
cat > /dev/null # Consume stdin
INFO="This file requires careful review"
jq -n --arg ctx "$INFO" '{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"additionalContext": $ctx
}
}'
exit 0
#!/bin/bash
INPUT=$(cat)
# Process and log... (no stdout needed)
exit 0
#!/bin/bash
CHECKPOINT=".auto-loop/checkpoint.json"
if [[ ! -f "$CHECKPOINT" ]]; then
exit 0 # Allow stop
fi
# Block stop to continue loop
jq -n --arg reason "Continuing iteration" \
'{"decision": "block", "reason": $reason}'
exit 0
#!/bin/bash
cat > /dev/null
echo "Loading project context..." >&2
exit 0
Instead of a bash script, use type: "prompt" in settings.json:
{
"hooks": {
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "Review the work done. Return 'approve' if complete, or 'block' with reason.",
"timeout": 30
}
]
}
]
}
}
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/validate.sh",
"timeout": 60
}
]
}
],
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/load-context.sh",
"once": true
}
]
}
]
}
}
/hook-template PreToolUse "block edits to package-lock.json"
Creates:
- .claude/hooks/protect-lockfile.sh
- Updates .claude/settings.json
Validate custom agent file format and structure
Generate custom agent from template
Verify development environment is ready
Guided 5-minute onboarding for Director Mode Lite
Delegate tasks to Gemini CLI to save Claude context
Validate hooks configuration and scripts