25 KiB
Task Orchestrator Hooks - Working Examples
This document provides complete working examples of hooks that integrate with Task Orchestrator's workflow cascade event system. All examples follow the opinionated approach (auto-apply by default) with clear guidance on when to use conservative alternatives.
Overview
Three example hooks are provided:
- cascade-auto-progress.sh - Opinionated auto-apply with audit trail (RECOMMENDED)
- flow-aware-gate.sh - Adaptive quality gates based on workflow flow
- cascade-logger.sh - Non-blocking analytics for learning patterns (SAFE for production)
All examples are located in: src/main/resources/claude/skills/task-orchestrator-hooks-builder/example-hooks/
Quick Start
Installation Steps
-
Copy hook to your project's hooks directory:
# Create hooks directory if it doesn't exist mkdir -p .claude/hooks # Copy desired example hook cp src/main/resources/claude/skills/task-orchestrator-hooks-builder/example-hooks/cascade-auto-progress.sh \ .claude/hooks/cascade-auto-progress.sh # Make executable chmod +x .claude/hooks/cascade-auto-progress.sh -
Register hook in Claude Code settings: Edit
.claude/settings.local.json(create if doesn't exist):{ "hooks": { "postToolUse": [ { "hook": ".claude/hooks/cascade-auto-progress.sh", "tools": ["mcp__task-orchestrator__manage_container"] } ] } } -
Test the hook (see Testing section below)
Example 1: Cascade Auto-Progress (Opinionated)
Purpose
Automatically logs cascade events for auto-application when automatic=true. This is the RECOMMENDED opinionated approach for most projects.
Use Cases
✅ Use this when:
- Normal development workflows
- You trust the Task Orchestrator's cascade event logic
- You want automatic progression (Task complete → Feature progresses → Project progresses)
- You need an audit trail of all cascade events
⚠️ Consider alternatives when:
- Critical production deployments requiring manual approval
- Security/compliance workflows needing sign-off
- Learning/training environments where you want to see every step
- You need full control over every status transition
Installation
# Copy to hooks directory
cp src/main/resources/claude/skills/task-orchestrator-hooks-builder/example-hooks/cascade-auto-progress.sh \
.claude/hooks/cascade-auto-progress.sh
# Make executable
chmod +x .claude/hooks/cascade-auto-progress.sh
Register in .claude/settings.local.json:
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-auto-progress.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Expected Behavior
When a cascade event occurs (e.g., all tasks in a feature complete):
════════════════════════════════════════════
🔄 CASCADE EVENT PROCESSING (Opinionated Mode)
════════════════════════════════════════════
Event #1: all_tasks_complete
Target: User Authentication (feature)
Status: in-development → testing
Flow: default_flow
Reason: All tasks completed, ready for testing phase
✅ AUTO-APPLY: Logging for orchestrator to apply status
Cascade event logged - orchestrator will apply status automatically
════════════════════════════════════════════
✓ Cascade event processing complete
Log: .claude/metrics/cascade-events.csv
════════════════════════════════════════════
Audit Trail (~/.claude/metrics/cascade-events.csv):
2025-10-27T14:30:45Z,all_tasks_complete,feature,abc-123-def,"User Authentication",in-development,testing,default_flow,auto
2025-10-27T14:32:10Z,first_task_started,feature,abc-123-def,"User Authentication",planning,in-development,default_flow,auto
Sample Test Input
You can test this hook by simulating a manage_container response with cascade events:
# Create test input file
cat > test-cascade-input.json << 'EOF'
{
"tool": "mcp__task-orchestrator__manage_container",
"tool_input": {
"operation": "setStatus",
"containerType": "task",
"id": "task-uuid-123",
"status": "completed"
},
"tool_output": {
"success": true,
"data": {
"cascadeEvents": [
{
"event": "all_tasks_complete",
"targetType": "feature",
"targetId": "feature-uuid-456",
"targetName": "User Authentication",
"currentStatus": "in-development",
"suggestedStatus": "testing",
"flow": "default_flow",
"automatic": true,
"reason": "All tasks completed, ready for testing phase"
}
]
}
}
}
EOF
# Test the hook
cat test-cascade-input.json | .claude/hooks/cascade-auto-progress.sh
Customization
To make MORE conservative (require manual confirmation):
Change line 52 from:
if [ "$AUTOMATIC" == "true" ]; then
To:
if [ "$AUTOMATIC" == "true" ] && [ "$FLOW" != "with_review_flow" ]; then
This will require manual confirmation for security/compliance workflows.
To disable auto-apply entirely:
Use the Progressive Disclosure example instead (see Template 16 in hook-templates.md).
Example 2: Flow-Aware Quality Gate
Purpose
Adapts quality gate behavior based on workflow flow. Skips tests for prototypes, enforces strict validation for security features, runs standard tests for normal development.
Use Cases
✅ Use this when:
- You have different types of features (prototypes, production, security)
- You want fast iteration on experimental work
- You need strict validation for compliance features
- You tag your features consistently (prototype, security, etc.)
⚠️ Consider alternatives when:
- All features should have the same quality standards
- You don't use feature tags for workflow classification
- You prefer consistent behavior across all work
Installation
# Copy to hooks directory
cp src/main/resources/claude/skills/task-orchestrator-hooks-builder/example-hooks/flow-aware-gate.sh \
.claude/hooks/flow-aware-gate.sh
# Make executable
chmod +x .claude/hooks/flow-aware-gate.sh
Register in .claude/settings.local.json:
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/flow-aware-gate.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Expected Behavior
For a feature tagged with "prototype":
════════════════════════════════════════════
🔍 FLOW-AWARE QUALITY GATE
════════════════════════════════════════════
Detected Flow: rapid_prototype_flow
Feature Tags: prototype, spike, frontend
Target Status: testing
⚡ RAPID PROTOTYPE FLOW
Skipping all quality gates for fast iteration
Rationale: Prototypes prioritize speed over validation
✅ Quality gate skipped (by design)
════════════════════════════════════════════
For a feature tagged with "security":
════════════════════════════════════════════
🔍 FLOW-AWARE QUALITY GATE
════════════════════════════════════════════
Detected Flow: with_review_flow
Feature Tags: security, authentication, api
Target Status: testing
🔒 SECURITY/COMPLIANCE FLOW
Enforcing strict quality gates
[1/2] Running full test suite...
✅ Tests passed (235 tests, 0 failures)
[2/2] Running security vulnerability scan...
✅ Security scan passed (0 vulnerabilities)
✅ All strict quality gates passed
════════════════════════════════════════════
For a normal feature (default flow):
════════════════════════════════════════════
🔍 FLOW-AWARE QUALITY GATE
════════════════════════════════════════════
Detected Flow: default_flow
Feature Tags: backend, api, enhancement
Target Status: testing
✓ DEFAULT FLOW
Running standard quality gates
[1/1] Running standard test suite...
✅ Tests passed (187 tests, 0 failures)
✅ Standard quality gates passed
════════════════════════════════════════════
Flow Detection
The hook detects workflow flow from feature tags:
| Flow | Detected Tags | Behavior |
|---|---|---|
| rapid_prototype_flow | prototype, spike, experiment | Skip all tests |
| with_review_flow | security, compliance, audit | Strict validation + security scan |
| default_flow | (anything else) | Standard test suite |
Sample Test Input
# Create test input for security feature
cat > test-flow-gate-input.json << 'EOF'
{
"tool": "mcp__task-orchestrator__manage_container",
"tool_input": {
"operation": "setStatus",
"containerType": "feature",
"id": "feature-uuid-789",
"status": "testing"
},
"tool_output": {
"success": true,
"data": {
"id": "feature-uuid-789",
"tags": "security,authentication,api"
}
}
}
EOF
# Test the hook (will attempt to run gradlew test)
cat test-flow-gate-input.json | .claude/hooks/flow-aware-gate.sh
Customization
To add a new flow (e.g., "experimental_flow"):
Add to flow detection (around line 42):
if echo "$TAGS" | grep -qE "prototype|spike|experiment"; then
FLOW="rapid_prototype_flow"
elif echo "$TAGS" | grep -qE "experimental|research"; then
FLOW="experimental_flow"
elif echo "$TAGS" | grep -qE "security|compliance|audit"; then
FLOW="with_review_flow"
fi
Then add case handling (around line 58):
case "$FLOW" in
"experimental_flow")
echo "🔬 EXPERIMENTAL FLOW"
echo " Running fast tests only, skipping integration tests"
./gradlew test -x integrationTest || {
# Block on failure
}
;;
To make prototype flow less permissive:
Change line 60-67 to run minimal tests instead of skipping entirely:
"rapid_prototype_flow")
echo "⚡ RAPID PROTOTYPE FLOW"
echo " Running smoke tests only (skipping full suite)"
./gradlew smokeTest || {
cat << EOF
{
"decision": "block",
"reason": "Even prototypes must pass smoke tests. Fix failing tests before proceeding."
}
EOF
exit 0
}
;;
Example 3: Cascade Logger (Analytics)
Purpose
Non-blocking analytics hook that logs all cascade events to CSV for understanding workflow patterns. SAFE to add to production - observation only, never blocks or modifies behavior.
Use Cases
✅ Use this when:
- Learning how cascade events work
- Analyzing workflow patterns in your project
- Collecting metrics on automation effectiveness
- Need audit trail without affecting behavior
- Want to understand which events are automatic vs manual
✅ Safe for:
- Production environments (observation only)
- Learning environments
- Any project (zero risk)
Installation
# Copy to hooks directory
cp src/main/resources/claude/skills/task-orchestrator-hooks-builder/example-hooks/cascade-logger.sh \
.claude/hooks/cascade-logger.sh
# Make executable
chmod +x .claude/hooks/cascade-logger.sh
Register in .claude/settings.local.json:
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Expected Behavior
When cascade events occur:
📊 Cascade Event Logger - Recording events for analytics
✓ Event #1: all_tasks_complete (feature) - auto=true, flow=default_flow
✓ Event #2: first_task_started (feature) - auto=true, flow=rapid_prototype_flow
📈 Summary Statistics:
Total Events: 47
Auto-Apply: 42 (89%)
Manual Confirm: 5
By Event Type:
first_task_started: 15
all_tasks_complete: 28
all_features_complete: 4
By Workflow Flow:
default_flow: 32
rapid_prototype_flow: 10
with_review_flow: 5
✓ Cascade events logged successfully
CSV Log: .claude/metrics/cascade-events.csv
Summary: .claude/metrics/cascade-summary.json
Analytics Queries:
tail -10 .claude/metrics/cascade-events.csv # Recent events
cat .claude/metrics/cascade-summary.json # Summary stats
CSV Output Format
File: .claude/metrics/cascade-events.csv
timestamp,event,target_type,target_id,target_name,current_status,suggested_status,flow,automatic,reason
2025-10-27T14:30:45Z,all_tasks_complete,feature,abc-123,"User Auth",in-development,testing,default_flow,true,"All tasks completed"
2025-10-27T14:32:10Z,first_task_started,feature,abc-123,"User Auth",planning,in-development,default_flow,true,"First task started"
JSON Summary Output
File: .claude/metrics/cascade-summary.json
{
"total_cascade_events": 47,
"automatic_events": 42,
"manual_events": 5,
"by_event_type": {
"first_task_started": 15,
"all_tasks_complete": 28,
"all_features_complete": 4
},
"by_flow": {
"default_flow": 32,
"rapid_prototype_flow": 10,
"with_review_flow": 5
},
"auto_percentage": 89,
"last_updated": "2025-10-27T14:35:22Z"
}
Analytics Queries
View recent events:
tail -10 .claude/metrics/cascade-events.csv
Count auto vs manual:
tail -n +2 .claude/metrics/cascade-events.csv | grep ",true," | wc -l # Auto
tail -n +2 .claude/metrics/cascade-events.csv | grep ",false," | wc -l # Manual
Find all security flow events:
tail -n +2 .claude/metrics/cascade-events.csv | grep ",with_review_flow,"
View summary statistics:
cat .claude/metrics/cascade-summary.json | jq .
Sample Test Input
# Create test input with multiple cascade events
cat > test-logger-input.json << 'EOF'
{
"tool": "mcp__task-orchestrator__manage_container",
"tool_input": {
"operation": "setStatus",
"containerType": "task",
"id": "task-uuid-123",
"status": "completed"
},
"tool_output": {
"success": true,
"data": {
"cascadeEvents": [
{
"event": "all_tasks_complete",
"targetType": "feature",
"targetId": "feature-uuid-456",
"targetName": "API Authentication",
"currentStatus": "in-development",
"suggestedStatus": "testing",
"flow": "default_flow",
"automatic": true,
"reason": "All 8 tasks completed successfully"
},
{
"event": "all_features_complete",
"targetType": "project",
"targetId": "project-uuid-789",
"targetName": "User Management System",
"currentStatus": "in-progress",
"suggestedStatus": "completed",
"flow": "with_review_flow",
"automatic": false,
"reason": "All features complete, requires final approval"
}
]
}
}
}
EOF
# Test the hook
cat test-logger-input.json | .claude/hooks/cascade-logger.sh
Customization
This hook is safe as-is, but you can customize:
Change CSV location:
# Line 28 - change log directory
LOG_DIR="$CLAUDE_PROJECT_DIR/metrics" # Instead of .claude/metrics
Add email alerts for manual confirmations:
# After line 73, add:
if [ "$AUTOMATIC" == "false" ]; then
echo "Manual confirmation required for $TARGET_NAME" | \
mail -s "Task Orchestrator: Manual Approval Needed" admin@example.com
fi
Export to external analytics:
# After line 116, add:
curl -X POST https://analytics.example.com/api/cascade-events \
-H "Content-Type: application/json" \
-d @"$SUMMARY_LOG"
Testing Your Hooks
Testing with Real Operations
-
Create a test task and complete it:
# Your hooks will trigger on real manage_container operations # Watch for hook output in Claude Code -
Check logs:
ls -la .claude/metrics/ cat .claude/metrics/cascade-events.csv cat .claude/metrics/cascade-summary.json
Testing with Simulated Input
Create a test script to simulate cascade events:
#!/bin/bash
# test-cascade-hooks.sh - Simulate cascade events for testing
cat << 'EOF' | .claude/hooks/cascade-auto-progress.sh
{
"tool": "mcp__task-orchestrator__manage_container",
"tool_input": {
"operation": "setStatus",
"containerType": "task",
"id": "test-task-123",
"status": "completed"
},
"tool_output": {
"success": true,
"data": {
"cascadeEvents": [
{
"event": "all_tasks_complete",
"targetType": "feature",
"targetId": "test-feature-456",
"targetName": "Test Feature",
"currentStatus": "in-development",
"suggestedStatus": "testing",
"flow": "default_flow",
"automatic": true,
"reason": "All tasks completed for testing"
}
]
}
}
}
EOF
echo ""
echo "✓ Test completed. Check output above."
Debugging Hooks
Enable verbose output:
# Add to top of hook (after #!/bin/bash)
set -x # Print each command
Check hook execution:
# Claude Code logs hook execution
# Look for "Running hook: .claude/hooks/..."
Test JSON parsing:
# Verify jq is working
echo '{"test": "value"}' | jq -r '.test'
# Should output: value
Combining Multiple Hooks
You can use multiple hooks together. They run in the order listed in settings.local.json:
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"],
"comment": "Always log first (observation only)"
},
{
"hook": ".claude/hooks/flow-aware-gate.sh",
"tools": ["mcp__task-orchestrator__manage_container"],
"comment": "Then run quality gates (may block)"
},
{
"hook": ".claude/hooks/cascade-auto-progress.sh",
"tools": ["mcp__task-orchestrator__manage_container"],
"comment": "Finally handle cascade progression"
}
]
}
}
Recommended Order:
- Logger (observation only, always safe)
- Quality gates (may block if tests fail)
- Auto-progress (applies status changes)
Migration from Conservative to Opinionated
Starting Conservative
If you're new to cascade events, start with the logger:
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Goal: Understand cascade event patterns in your project.
When to progress: After 1-2 weeks, review .claude/metrics/cascade-summary.json. If auto_percentage > 80%, you're ready for opinionated approach.
Adopting Opinionated Approach
Add cascade-auto-progress.sh:
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
},
{
"hook": ".claude/hooks/cascade-auto-progress.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Goal: Automatic progression with full audit trail.
When to progress: Once comfortable with automatic behavior, consider flow-aware gates.
Adding Flow-Aware Gates
Enable adaptive quality gates:
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
},
{
"hook": ".claude/hooks/flow-aware-gate.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
},
{
"hook": ".claude/hooks/cascade-auto-progress.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Goal: Prototype features skip tests, security features enforce strict validation.
Requirement: Consistent feature tagging (prototype, security, etc.).
Troubleshooting
Hook Not Executing
Check registration:
cat .claude/settings.local.json
# Verify hook is listed under postToolUse
Check executable permission:
ls -la .claude/hooks/
# Should show -rwxr-xr-x (executable)
Check tool name:
{
"tools": ["mcp__task-orchestrator__manage_container"]
// Note: Double underscores, correct tool name
}
Cascade Events Not Appearing
Verify operation triggers cascade:
# Cascade events only occur on certain operations:
# - Completing a task (when all tasks in feature complete)
# - Starting first task in a feature
# - Completing all features in a project
Check feature/project has children:
# Feature must have tasks
# Project must have features
# Otherwise no cascade occurs
JSON Parsing Errors
Install jq if missing:
# Ubuntu/Debian
sudo apt-get install jq
# macOS
brew install jq
# Windows (via scoop)
scoop install jq
Test jq installation:
echo '{"test": "value"}' | jq -r '.test'
# Should output: value
Gradlew Not Found (flow-aware-gate.sh)
Verify project structure:
ls -la ./gradlew
# Should exist and be executable
Adjust path in hook:
# Line 76, 120, 146 - change to absolute path
cd "$CLAUDE_PROJECT_DIR"
./gradlew test
Best Practices
General Guidelines
- Start with logger - Always begin with cascade-logger.sh to learn patterns
- Test in isolation - Test each hook individually before combining
- Keep hooks simple - Each hook should do one thing well
- Exit cleanly - Always exit 0 unless blocking (exit 1 requires JSON)
- Log everything - Create audit trails for debugging
Security Considerations
- Review hook source - Always review hook code before installation
- Limit permissions - Hooks run with user permissions, no sudo required
- Validate input - Check for null/empty values from JSON
- Handle errors - Use
|| truefor non-critical operations - Don't store secrets - Never hardcode credentials in hooks
Performance Tips
- Use lightweight operations - Hooks add overhead to every operation
- Filter early - Exit early if operation doesn't match
- Batch operations - Update metrics once, not per event
- Avoid network calls - Local operations are faster
- Cache database queries - SQLite queries can be slow for large databases
Additional Resources
Hook Templates
See hook-templates.md for 16 copy-paste templates covering:
- Templates 1-11: Core hook patterns (git, testing, metrics, notifications)
- Templates 12-16: Cascade event integration (NEW in v2.0)
Documentation
- SKILL.md - Complete hook builder skill with interactive interview
- docs/hooks-guide.md - Comprehensive hook system documentation
- WorkflowConfig.kt - Source code for cascade event system
Getting Help
- Use the Task Orchestrator Hooks Builder skill in Claude Code
- Read the interactive interview questions (handles 95% of use cases)
- Review these examples for working patterns
- Check
docs/hooks-guide.mdfor advanced scenarios
Summary
Recommended Setup (Most projects):
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
},
{
"hook": ".claude/hooks/cascade-auto-progress.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Full Setup (With flow-aware quality gates):
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
},
{
"hook": ".claude/hooks/flow-aware-gate.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
},
{
"hook": ".claude/hooks/cascade-auto-progress.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
Conservative Setup (Learning mode):
{
"hooks": {
"postToolUse": [
{
"hook": ".claude/hooks/cascade-logger.sh",
"tools": ["mcp__task-orchestrator__manage_container"]
}
]
}
}
All examples follow the opinionated approach - auto-apply by default with clear guidance on when to use conservative alternatives. Start with the logger to learn, then adopt auto-progress when comfortable.