126 lines
4.1 KiB
Bash
Executable File
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
|