Feature Request: PostToolUse hooks should fire for Skill invocations
Problem
PostToolUse hooks with "matcher": "Skill" never fire when a skill is invoked (e.g., via /plugin:skill-name or the Skill tool). This is because the Skill tool is handled as a prompt expansion internally and doesn't dispatch hook events through the normal tool execution pipeline.
Evidence:
- A PostToolUse hook with no matcher (catchall) fires correctly — tracked 69+ tool calls in a single session
- A PostToolUse hook with
"matcher": "Skill"produces zero events in the same session, despite multiple skill invocations - The hook script works correctly when called manually with piped stdin (verified with mock Skill input)
- SessionStart hooks fire correctly (confirmed by file creation)
Impact
This makes it impossible to build automatic observability for skill usage. Specifically:
- Analytics: Cannot track which skills are invoked, how often, or by whom
- Phase sync: Cannot trigger JIRA status updates after spec/dev skill invocations
- Quality escalation: Cannot auto-escalate findings after review skills run
Workaround: Parse the transcript JSONL from a Stop hook to reconstruct skill invocations retroactively. This works but loses real-time granularity and per-invocation timing data.
Proposed Solution
One of:
- Fire PostToolUse for Skill invocations — dispatch the same hook event after the Skill tool expands and Claude begins processing. The hook input should include
tool_name: "Skill"andtool_input: { skill: "plugin:skill-name", args: "..." }.
- New hook event type:
PostSkillUse— a dedicated event that fires after a skill's SKILL.md is loaded into context. This could include richer metadata: skill name, plugin, file path, whether it was user-invoked or agent-dispatched.
- Fire PreToolUse for Skill invocations — at minimum, let PreToolUse hooks intercept skill calls before expansion, enabling logging and validation.
Option 2 (dedicated PostSkillUse) would be the most useful since it could carry skill-specific metadata that PostToolUse doesn't naturally have.
Environment
- Claude Code CLI on Windows 11
- Plugin hooks defined in
hooks.jsonwith"matcher": "Skill" - Hooks for other matchers (
Edit|Write,Bash(gh pr create*), catchall) work correctly
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗