maestro/skills/debug-hooks/SKILL.md
Systematic hook debugging workflow. Use when hooks aren't firing, producing wrong output, or behaving unexpectedly.
npx skillsauth add scooter-lacroix/maestro debug-hooksInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Systematic workflow for debugging Maestro hooks.
# Check project cache
ls -la $CLAUDE_PROJECT_DIR/.maestro/cache/
# Check specific outputs
ls -la $CLAUDE_PROJECT_DIR/.maestro/cache/learnings/
# Check for debug logs
tail $CLAUDE_PROJECT_DIR/.maestro/cache/*.log 2>/dev/null
# Also check global (common mistake: wrong path)
ls -la ~/.maestro/cache/ 2>/dev/null
# Project settings
cat $CLAUDE_PROJECT_DIR/.maestro/settings.json | grep -A 20 '"SessionEnd"\|"PostToolUse"\|"UserPromptSubmit"'
# Global settings (hooks merge from both)
cat ~/.maestro/settings.json | grep -A 20 '"SessionEnd"\|"PostToolUse"\|"UserPromptSubmit"'
# Shell wrappers
ls -la $CLAUDE_PROJECT_DIR/.maestro/hooks/*.sh
# Compiled bundles (if using TypeScript)
ls -la $CLAUDE_PROJECT_DIR/.maestro/hooks/dist/*.mjs
# SessionEnd hook
echo '{"session_id": "test-123", "reason": "clear", "transcript_path": "/tmp/test"}' | \
$CLAUDE_PROJECT_DIR/.maestro/hooks/session-end-cleanup.sh
# PostToolUse hook (Write tool example)
echo '{"tool_name": "Write", "tool_input": {"file_path": "test.md"}, "session_id": "test-123"}' | \
$CLAUDE_PROJECT_DIR/.maestro/hooks/handoff-index.sh
If using detached spawn with stdio: 'ignore':
// This pattern hides errors!
spawn(cmd, args, { detached: true, stdio: 'ignore' })
Fix: Add temporary logging:
const logFile = fs.openSync('.maestro/cache/debug.log', 'a');
spawn(cmd, args, {
detached: true,
stdio: ['ignore', logFile, logFile] // capture stdout/stderr
});
If you edited TypeScript source, you MUST rebuild:
cd $CLAUDE_PROJECT_DIR/.maestro/hooks
npx esbuild src/session-end-cleanup.ts \
--bundle --platform=node --format=esm \
--outfile=dist/session-end-cleanup.mjs
Source edits alone don't take effect - the shell wrapper runs the bundled .mjs.
| Symptom | Likely Cause | Fix | |---------|--------------|-----| | Hook never runs | Not registered in settings.json | Add to correct event in settings | | Hook runs but no output | Detached spawn hiding errors | Add logging, check manually | | Wrong session ID | Using "most recent" query | Pass ID explicitly | | Works locally, not in CI | Missing dependencies | Check npx/node availability | | Runs twice | Registered in both global + project | Remove duplicate |
ls -la .maestro/cache/)grep -A10 '"hooks"' .maestro/settings.json)ls .maestro/hooks/*.sh)ls -la .maestro/hooks/dist/)echo '{}' | ./hook.sh)stdio: 'ignore')Derived from 10 sessions (83% of all learnings):
tools
Wiring Verification
tools
Create and configure Maestro sub-agents with custom prompts, tools, and models
data-ai
Create and use Maestro slash commands - quick prompts, bash execution, file references
development
Upgrade any skill to v5 Hybrid format using decision theory + modal logic