Files
gh-tstomtimes-orchestra/hooks/after_task_complete.sh
2025-11-30 09:03:11 +08:00

126 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# hooks/after_task_complete.sh
# Automatic task completion recording hook
set -euo pipefail
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RECORD_MILESTONE_SCRIPT="${SCRIPT_DIR}/../.orchestra/scripts/record-milestone.sh"
LOG_DIR="${SCRIPT_DIR}/../.orchestra/logs"
LOG_FILE="${LOG_DIR}/after-task-complete.log"
MEMORY_BANK_PROJECT="orchestra"
PROGRESS_FILE="progress.md"
# Ensure log directory exists
mkdir -p "$LOG_DIR"
# Logging function (non-blocking)
log() {
local timestamp
timestamp=$(date -u +"%Y-%m-%d %H:%M:%S UTC")
echo "[$timestamp] $*" >> "$LOG_FILE" 2>/dev/null || true
}
# Non-blocking execution wrapper
safe_execute() {
"$@" 2>> "$LOG_FILE" || log "WARNING: Command failed but continuing: $*"
}
log "=== Task Completion Hook Triggered ==="
# Get language setting from environment
LANG="${ORCHESTRA_LANGUAGE:-en}"
# Try to detect completed task information from environment or recent activity
# Environment variables that might be set by TodoWrite or task systems
TASK_NAME="${COMPLETED_TASK_NAME:-}"
TASK_DESCRIPTION="${COMPLETED_TASK_DESCRIPTION:-}"
TASK_TAG="${COMPLETED_TASK_TAG:-chore}"
# If no task information is available, try to infer from git recent activity
if [ -z "$TASK_NAME" ]; then
# Check for recent git commits
RECENT_COMMIT=$(git log -1 --pretty=format:"%s" 2>/dev/null || echo "")
if [ -n "$RECENT_COMMIT" ]; then
TASK_NAME="Task: $RECENT_COMMIT"
TASK_DESCRIPTION="Completed via git commit"
# Infer tag from commit message prefix
if echo "$RECENT_COMMIT" | grep -qE "^feat:"; then
TASK_TAG="feature"
elif echo "$RECENT_COMMIT" | grep -qE "^fix:"; then
TASK_TAG="bugfix"
elif echo "$RECENT_COMMIT" | grep -qE "^refactor:"; then
TASK_TAG="refactor"
elif echo "$RECENT_COMMIT" | grep -qE "^docs:"; then
TASK_TAG="docs"
elif echo "$RECENT_COMMIT" | grep -qE "^test:"; then
TASK_TAG="test"
elif echo "$RECENT_COMMIT" | grep -qE "^perf:"; then
TASK_TAG="perf"
else
TASK_TAG="chore"
fi
else
log "No task information available, skipping automatic recording"
exit 0
fi
fi
log "Task Name: $TASK_NAME"
log "Task Description: $TASK_DESCRIPTION"
log "Task Tag: $TASK_TAG"
# Record milestone using the record-milestone.sh script
if [ -f "$RECORD_MILESTONE_SCRIPT" ] && [ -x "$RECORD_MILESTONE_SCRIPT" ]; then
log "Recording task completion as milestone..."
safe_execute "$RECORD_MILESTONE_SCRIPT" \
"$TASK_NAME" \
"$TASK_DESCRIPTION" \
"$TASK_TAG"
log "✅ Task completion recorded"
else
log "ERROR: record-milestone.sh not found or not executable at $RECORD_MILESTONE_SCRIPT"
exit 0 # Non-blocking - don't fail the hook
fi
# Update progress metrics in Memory Bank
log "Updating progress metrics..."
# Direct file access to Memory Bank
MEMORY_BANK_PATH="$HOME/.memory-bank/$MEMORY_BANK_PROJECT/$PROGRESS_FILE"
if [ -f "$MEMORY_BANK_PATH" ]; then
# Read current metrics
CURRENT_COMPLETED=$(grep "Total Tasks Completed" "$MEMORY_BANK_PATH" | grep -oE "[0-9]+" || echo "0")
NEW_COMPLETED=$((CURRENT_COMPLETED + 1))
# Update the count
safe_execute sed -i.bak "s/\*\*Total Tasks Completed\*\*: [0-9]*/\*\*Total Tasks Completed\*\*: $NEW_COMPLETED/" "$MEMORY_BANK_PATH"
# Update last updated timestamp
CURRENT_DATE=$(date -u +"%Y-%m-%d %H:%M:%S UTC")
safe_execute sed -i.bak "s/\*\*Last Updated\*\*: .*/\*\*Last Updated\*\*: $CURRENT_DATE/" "$MEMORY_BANK_PATH"
# Clean up backup file
rm -f "${MEMORY_BANK_PATH}.bak" 2>/dev/null || true
log "✅ Progress metrics updated: $NEW_COMPLETED tasks completed"
else
log "WARNING: progress.md not found in Memory Bank, skipping metrics update"
fi
# Display completion message
if [ "$LANG" = "ja" ]; then
echo "[after_task_complete] タスク完了を記録しました: $TASK_NAME" >&2 || true
else
echo "[after_task_complete] Task completion recorded: $TASK_NAME" >&2 || true
fi
log "=== Task Completion Hook Completed ==="
# Always exit successfully (non-blocking)
exit 0