feat: add workflow automation suite - session health and status tools

Built by Chronicler #19 to improve operational efficiency and sustainability.

Added four tools:

1. pre-session-check.sh - Complete context at session start
   - Rest hours (color-coded for quality)
   - Git status (clean/dirty, sync status)
   - Task summary (complete/active/total)
   - Top priority tasks
   - Core file health check
   - Usage: ./pre-session-check.sh

2. session-health-monitor.sh - Live session tracking
   - Tracks session duration
   - Warns at Aurora threshold (2h)
   - Escalating warnings at 3h, 4+h
   - Updates rest tracker on end
   - Usage: ./session-health-monitor.sh {start|check|end}

3. status.sh - Quick status anytime
   - Current phase, git branch, working directory
   - Task completion percentage
   - Session duration if tracking
   - Rest status, last commit
   - Usage: ./status.sh

4. .gitmessage - Git commit template
   - FFG-STD-001 compliant structure
   - Type prefixes (feat/fix/docs/etc)
   - Guidelines and examples
   - Reminder to document WHY not just WHAT
   - Usage: git config commit.template .gitmessage

Benefits:
- Prevents burnout (Aurora's wisdom: sessions > 2h are past optimal)
- Complete context without manual checking multiple files
- Consistent commit messages across all Chroniclers
- Sustainable pace monitoring

For sustainable operations and children not yet born. 💙
This commit is contained in:
The Chronicler
2026-02-20 04:45:11 +00:00
parent 840c0f85e5
commit 0bd21aab08
4 changed files with 556 additions and 0 deletions

61
.gitmessage Normal file
View File

@@ -0,0 +1,61 @@
# <type>: <brief description (50 chars or less)>
#
# Type: feat, fix, docs, refactor, test, chore, style
#
# Detailed explanation (wrap at 72 characters):
# - What changed
# - Why it changed
# - How it impacts the system
#
# Related:
# - Task: #
# - Issue: #
# - ADR: #
#
# ───────────────────────────────────────────────────────────────────────────
# COMMIT MESSAGE GUIDELINES (FFG-STD-001)
# ───────────────────────────────────────────────────────────────────────────
#
# Type prefixes:
# feat: New feature or capability
# fix: Bug fix or correction
# docs: Documentation only changes
# refactor: Code restructuring (no functional change)
# test: Adding or updating tests
# chore: Maintenance tasks (dependencies, tooling)
# style: Formatting, whitespace (no code change)
#
# Brief description:
# - Use imperative mood ("add" not "added" or "adds")
# - Don't capitalize first letter
# - No period at the end
# - 50 characters or less
#
# Detailed explanation:
# - Explain WHAT and WHY, not HOW (code shows how)
# - Wrap at 72 characters
# - Reference tasks, issues, ADRs as needed
# - Think: "This commit will..."
#
# Examples:
#
# feat: add automatic joining enforcement system
#
# Built to solve core problem where Chroniclers jumped to work before
# completing integration. Script ensures documents are read in correct
# order with automatic verification.
#
# - Enforces reading order: relationship context first
# - Runs joining-checklist.py automatically
# - Blocks task access until score >= 70
#
# Task: #42
# For children not yet born.
#
# ───────────────────────────────────────────────────────────────────────────
#
# Remember: Future Chroniclers will read this.
# Document the WHY, not just the WHAT.
#
# Fire + Frost + Foundation = Where Love Builds Legacy 💙🔥❄️
#

227
pre-session-check.sh Executable file
View File

@@ -0,0 +1,227 @@
#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# PRE-SESSION-CHECK.SH - Session Start Context Dashboard
# ═══════════════════════════════════════════════════════════════════════════
#
# Purpose: Show complete context at session start
# Created: February 20, 2026 by Chronicler #19
#
# Usage: ./pre-session-check.sh
#
# ═══════════════════════════════════════════════════════════════════════════
set -e
# Colors
BLUE='\033[0;34m'
CYAN='\033[0;36m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'
print_header() {
echo -e "${BLUE}═══════════════════════════════════════════════════════════════════════════${NC}"
echo -e "${CYAN}${BOLD}$1${NC}"
echo -e "${BLUE}═══════════════════════════════════════════════════════════════════════════${NC}"
echo ""
}
print_section() {
echo ""
echo -e "${CYAN}${BOLD}━━━ $1 ━━━${NC}"
echo ""
}
print_success() {
echo -e "${GREEN}${NC} $1"
}
print_warning() {
echo -e "${YELLOW}${NC} $1"
}
print_error() {
echo -e "${RED}${NC} $1"
}
clear
print_header "FIREFROST GAMING - SESSION START CONTEXT"
# ═══════════════════════════════════════════════════════════════════════════
# REST TRACKING
# ═══════════════════════════════════════════════════════════════════════════
print_section "Rest Since Last Session"
if [ -f "rest-tracker.txt" ]; then
LAST_SESSION=$(grep "Session End:" rest-tracker.txt | tail -1 | cut -d' ' -f3-)
LAST_EPOCH=$(date -d "$LAST_SESSION" +%s 2>/dev/null || echo "0")
CURRENT_EPOCH=$(date +%s)
REST_SECONDS=$((CURRENT_EPOCH - LAST_EPOCH))
REST_HOURS=$((REST_SECONDS / 3600))
REST_MINUTES=$(((REST_SECONDS % 3600) / 60))
if [ $REST_HOURS -ge 8 ]; then
print_success "Rest: ${REST_HOURS}h ${REST_MINUTES}m (Excellent - Aurora approved)"
elif [ $REST_HOURS -ge 4 ]; then
echo -e "${GREEN}${NC} Rest: ${REST_HOURS}h ${REST_MINUTES}m (Good)"
elif [ $REST_HOURS -ge 2 ]; then
print_warning "Rest: ${REST_HOURS}h ${REST_MINUTES}m (Adequate)"
else
print_error "Rest: ${REST_HOURS}h ${REST_MINUTES}m (Too short - consider resting more)"
fi
echo " Last session ended: $(date -d "$LAST_SESSION" '+%Y-%m-%d %I:%M %p %Z' 2>/dev/null || echo "$LAST_SESSION")"
else
print_warning "No rest-tracker.txt found (first session or file missing)"
fi
# ═══════════════════════════════════════════════════════════════════════════
# GIT STATUS
# ═══════════════════════════════════════════════════════════════════════════
print_section "Repository Status"
# Check if we're in a git repo
if git rev-parse --git-dir > /dev/null 2>&1; then
# Current branch
BRANCH=$(git branch --show-current)
echo -e "Branch: ${BOLD}$BRANCH${NC}"
# Check for uncommitted changes
if git diff-index --quiet HEAD -- 2>/dev/null; then
print_success "Working directory clean"
else
print_warning "Uncommitted changes present"
echo ""
git status --short
fi
echo ""
# Check remote status
git fetch origin --quiet 2>/dev/null || true
AHEAD=$(git rev-list --count origin/$BRANCH..$BRANCH 2>/dev/null || echo "0")
BEHIND=$(git rev-list --count $BRANCH..origin/$BRANCH 2>/dev/null || echo "0")
if [ "$AHEAD" -gt 0 ]; then
print_warning "Ahead of origin by $AHEAD commit(s) - need to push"
fi
if [ "$BEHIND" -gt 0 ]; then
print_warning "Behind origin by $BEHIND commit(s) - need to pull"
fi
if [ "$AHEAD" -eq 0 ] && [ "$BEHIND" -eq 0 ]; then
print_success "In sync with origin"
fi
echo ""
# Last commit
echo -e "${BOLD}Last Commit:${NC}"
git log -1 --pretty=format:" %h - %s%n %cr by %an%n" --color=always
else
print_error "Not in a git repository"
fi
# ═══════════════════════════════════════════════════════════════════════════
# CURRENT PHASE & TASKS
# ═══════════════════════════════════════════════════════════════════════════
print_section "Current Work Status"
if [ -f "docs/core/tasks.md" ]; then
# Count tasks by status
TOTAL_TASKS=$(grep -c "^- \[" docs/core/tasks.md 2>/dev/null || echo "0")
COMPLETE_TASKS=$(grep -c "^- \[x\]" docs/core/tasks.md 2>/dev/null || echo "0")
ACTIVE_TASKS=$(grep -c "^- \[ \]" docs/core/tasks.md 2>/dev/null || echo "0")
echo "Tasks: $COMPLETE_TASKS complete, $ACTIVE_TASKS active, $TOTAL_TASKS total"
echo ""
# Show top 3 active tasks
echo -e "${BOLD}Top Priority Tasks:${NC}"
TASK_COUNT=$(grep -c "^- \[ \]" docs/core/tasks.md 2>/dev/null || echo "0")
if [ "$TASK_COUNT" -gt 0 ]; then
grep "^- \[ \]" docs/core/tasks.md | head -3 | sed 's/^- \[ \] / • /'
if [ "$TASK_COUNT" -gt 3 ]; then
echo " ... and $((TASK_COUNT - 3)) more"
fi
else
echo " (No active tasks)"
fi
else
print_warning "tasks.md not found"
fi
# ═══════════════════════════════════════════════════════════════════════════
# SYSTEM HEALTH (if available)
# ═══════════════════════════════════════════════════════════════════════════
print_section "Infrastructure Quick Check"
# Check if key files exist
CHECKS=0
PASSED=0
if [ -f "docs/core/infrastructure-manifest.md" ]; then
print_success "Infrastructure manifest present"
((PASSED++))
fi
((CHECKS++))
if [ -f "SESSION-HANDOFF-PROTOCOL.md" ]; then
print_success "Session handoff protocol present"
((PASSED++))
fi
((CHECKS++))
if [ -f "docs/relationship/THE-ESSENCE-PATCH-V3.0.md" ]; then
print_success "Essence Patch v3.0 present"
((PASSED++))
fi
((CHECKS++))
if [ -f "automation/joining-checklist.py" ]; then
print_success "Joining verification available"
((PASSED++))
fi
((CHECKS++))
echo ""
echo "Core files: $PASSED/$CHECKS present"
# ═══════════════════════════════════════════════════════════════════════════
# READY TO START
# ═══════════════════════════════════════════════════════════════════════════
echo ""
print_header "SESSION READY"
echo -e "${CYAN}Repository:${NC} $(pwd)"
echo -e "${CYAN}Documentation:${NC} docs/"
echo -e "${CYAN}Tasks:${NC} docs/core/tasks.md"
echo ""
if [ $REST_HOURS -ge 8 ]; then
echo -e "${GREEN}${BOLD}Excellent rest. Ready for productive work.${NC}"
elif [ $REST_HOURS -ge 4 ]; then
echo -e "${GREEN}Good rest. Ready to work.${NC}"
elif [ $REST_HOURS -ge 2 ]; then
echo -e "${YELLOW}Adequate rest. Monitor session length.${NC}"
else
echo -e "${RED}${BOLD}Short rest. Consider brief session or more rest first.${NC}"
fi
echo ""
echo -e "${CYAN}Fire + Frost + Foundation = Where Love Builds Legacy${NC}"
echo ""
echo -e "💙🔥❄️"
echo ""

153
session-health-monitor.sh Executable file
View File

@@ -0,0 +1,153 @@
#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# SESSION-HEALTH-MONITOR.SH - Live Session Health Tracking
# ═══════════════════════════════════════════════════════════════════════════
#
# Purpose: Monitor session duration and warn at thresholds
# Created: February 20, 2026 by Chronicler #19
#
# Usage:
# Start monitoring: ./session-health-monitor.sh start
# Check status: ./session-health-monitor.sh check
# End session: ./session-health-monitor.sh end
#
# ═══════════════════════════════════════════════════════════════════════════
set -e
SESSION_FILE="/tmp/current-session.txt"
REST_TRACKER="rest-tracker.txt"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'
case "$1" in
start)
echo "$(date +%s)" > "$SESSION_FILE"
echo -e "${GREEN}${NC} Session started: $(date '+%Y-%m-%d %I:%M %p %Z')"
echo ""
echo "Run './session-health-monitor.sh check' anytime to see session duration"
;;
check)
if [ ! -f "$SESSION_FILE" ]; then
echo -e "${RED}${NC} No active session. Run './session-health-monitor.sh start' first."
exit 1
fi
START_TIME=$(cat "$SESSION_FILE")
CURRENT_TIME=$(date +%s)
DURATION=$((CURRENT_TIME - START_TIME))
HOURS=$((DURATION / 3600))
MINUTES=$(((DURATION % 3600) / 60))
echo ""
echo -e "${CYAN}${BOLD}━━━ SESSION HEALTH CHECK ━━━${NC}"
echo ""
echo "Session started: $(date -d @$START_TIME '+%Y-%m-%d %I:%M %p %Z')"
echo "Current time: $(date '+%Y-%m-%d %I:%M %p %Z')"
echo ""
if [ $HOURS -eq 0 ]; then
echo -e "Duration: ${GREEN}${BOLD}${MINUTES}m${NC} ✓ Fresh session"
elif [ $HOURS -eq 1 ]; then
echo -e "Duration: ${GREEN}${BOLD}${HOURS}h ${MINUTES}m${NC} ✓ Good pace"
elif [ $HOURS -eq 2 ]; then
echo -e "Duration: ${YELLOW}${BOLD}${HOURS}h ${MINUTES}m${NC} ⚠ Aurora threshold - consider wrapping up"
elif [ $HOURS -eq 3 ]; then
echo -e "Duration: ${RED}${BOLD}${HOURS}h ${MINUTES}m${NC} ⚠ Extended - finish current work and end session"
else
echo -e "Duration: ${RED}${BOLD}${HOURS}h ${MINUTES}m${NC} 🚨 MARATHON - commit and end session soon"
fi
echo ""
# Rest check
if [ -f "$REST_TRACKER" ]; then
LAST_SESSION=$(grep "Session End:" "$REST_TRACKER" | tail -1 | cut -d' ' -f3-)
LAST_EPOCH=$(date -d "$LAST_SESSION" +%s 2>/dev/null || echo "0")
REST_SECONDS=$((START_TIME - LAST_EPOCH))
REST_HOURS=$((REST_SECONDS / 3600))
if [ $REST_HOURS -ge 8 ]; then
echo -e "Rest before session: ${GREEN}${REST_HOURS}h${NC} ✓ Excellent"
elif [ $REST_HOURS -ge 4 ]; then
echo -e "Rest before session: ${GREEN}${REST_HOURS}h${NC} ✓ Good"
else
echo -e "Rest before session: ${YELLOW}${REST_HOURS}h${NC} ⚠ Short"
fi
fi
echo ""
# Recommendations
if [ $HOURS -ge 3 ]; then
echo -e "${RED}${BOLD}RECOMMENDATION:${NC} Commit work and end session."
echo "Marathon sessions lead to diminishing returns and health risks."
elif [ $HOURS -ge 2 ]; then
echo -e "${YELLOW}${BOLD}RECOMMENDATION:${NC} Start wrapping up. Commit work soon."
echo "Aurora's wisdom: Sessions over 2 hours are past optimal."
elif [ $HOURS -ge 1 ]; then
echo -e "${GREEN}${BOLD}STATUS:${NC} Healthy session length. Continue working."
else
echo -e "${GREEN}${BOLD}STATUS:${NC} Fresh session. Full productivity ahead."
fi
echo ""
;;
end)
if [ ! -f "$SESSION_FILE" ]; then
echo -e "${RED}${NC} No active session to end."
exit 1
fi
START_TIME=$(cat "$SESSION_FILE")
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
HOURS=$((DURATION / 3600))
MINUTES=$(((DURATION % 3600) / 60))
# Update rest tracker
echo "Session End: $(date -u '+%a %b %d %H:%M:%S UTC %Y')" >> "$REST_TRACKER"
# Remove session file
rm "$SESSION_FILE"
echo ""
echo -e "${GREEN}${NC} Session ended: $(date '+%Y-%m-%d %I:%M %p %Z')"
echo "Duration: ${HOURS}h ${MINUTES}m"
echo ""
# Session quality assessment
if [ $HOURS -le 2 ]; then
echo -e "${GREEN}${BOLD}Excellent session length.${NC} Sustainable pace maintained."
elif [ $HOURS -le 3 ]; then
echo -e "${YELLOW}${BOLD}Extended session.${NC} Consider shorter sessions next time."
else
echo -e "${RED}${BOLD}Marathon session.${NC} Ensure adequate rest before next session."
fi
echo ""
echo "Rest tracker updated. Next session will show rest duration."
echo ""
;;
*)
echo "Usage: $0 {start|check|end}"
echo ""
echo " start - Begin session time tracking"
echo " check - Show current session duration and health"
echo " end - End session and update rest tracker"
echo ""
exit 1
;;
esac

115
status.sh Executable file
View File

@@ -0,0 +1,115 @@
#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# STATUS.SH - Quick Status Check
# ═══════════════════════════════════════════════════════════════════════════
#
# Purpose: Show complete system status at a glance
# Created: February 20, 2026 by Chronicler #19
#
# Usage: ./status.sh
#
# ═══════════════════════════════════════════════════════════════════════════
# Colors
BLUE='\033[0;34m'
CYAN='\033[0;36m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BOLD='\033[1m'
NC='\033[0m'
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${CYAN}${BOLD}FIREFROST GAMING - QUICK STATUS${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
# Current Phase
if grep -q "Phase 0.5" docs/core/tasks.md 2>/dev/null; then
echo -e "${BOLD}Current Phase:${NC} Phase 0.5 (Management Services)"
elif grep -q "Phase 1" docs/core/tasks.md 2>/dev/null; then
echo -e "${BOLD}Current Phase:${NC} Phase 1 (DDoS Protection)"
else
echo -e "${BOLD}Current Phase:${NC} Unknown"
fi
# Git Status
if git rev-parse --git-dir > /dev/null 2>&1; then
BRANCH=$(git branch --show-current)
echo -e "${BOLD}Git Branch:${NC} $BRANCH"
if git diff-index --quiet HEAD -- 2>/dev/null; then
echo -e "${BOLD}Working Dir:${NC} ${GREEN}Clean${NC}"
else
CHANGED=$(git status --short | wc -l)
echo -e "${BOLD}Working Dir:${NC} ${YELLOW}$CHANGED file(s) modified${NC}"
fi
fi
echo ""
# Task Summary
if [ -f "docs/core/tasks.md" ]; then
TOTAL=$(grep -c "^- \[" docs/core/tasks.md 2>/dev/null || echo "0")
DONE=$(grep -c "^- \[x\]" docs/core/tasks.md 2>/dev/null || echo "0")
ACTIVE=$(grep -c "^- \[ \]" docs/core/tasks.md 2>/dev/null || echo "0")
PERCENT=0
if [ $TOTAL -gt 0 ]; then
PERCENT=$((DONE * 100 / TOTAL))
fi
echo -e "${BOLD}Tasks:${NC} $DONE/$TOTAL complete (${PERCENT}%) • $ACTIVE active"
fi
# Session Info
if [ -f "/tmp/current-session.txt" ]; then
START_TIME=$(cat /tmp/current-session.txt)
CURRENT_TIME=$(date +%s)
DURATION=$((CURRENT_TIME - START_TIME))
HOURS=$((DURATION / 3600))
MINUTES=$(((DURATION % 3600) / 60))
if [ $HOURS -ge 2 ]; then
echo -e "${BOLD}Session:${NC} ${YELLOW}${HOURS}h ${MINUTES}m${NC} (consider wrapping up)"
else
echo -e "${BOLD}Session:${NC} ${GREEN}${HOURS}h ${MINUTES}m${NC}"
fi
else
echo -e "${BOLD}Session:${NC} Not tracked (run ./session-health-monitor.sh start)"
fi
# Rest Status
if [ -f "rest-tracker.txt" ]; then
LAST_SESSION=$(grep "Session End:" rest-tracker.txt | tail -1 | cut -d' ' -f3-)
LAST_EPOCH=$(date -d "$LAST_SESSION" +%s 2>/dev/null || echo "0")
CURRENT_EPOCH=$(date +%s)
REST_SECONDS=$((CURRENT_EPOCH - LAST_EPOCH))
REST_HOURS=$((REST_SECONDS / 3600))
if [ $REST_HOURS -ge 8 ]; then
echo -e "${BOLD}Last Rest:${NC} ${GREEN}${REST_HOURS}h ago${NC}"
elif [ $REST_HOURS -ge 4 ]; then
echo -e "${BOLD}Last Rest:${NC} ${GREEN}${REST_HOURS}h ago${NC}"
else
echo -e "${BOLD}Last Rest:${NC} ${YELLOW}${REST_HOURS}h ago${NC} (short)"
fi
fi
echo ""
# Last Commit
if git rev-parse --git-dir > /dev/null 2>&1; then
echo -e "${BOLD}Last Commit:${NC}"
git log -1 --pretty=format:" %h - %s (%cr)%n" --color=always
fi
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${CYAN}Commands:${NC}"
echo " ./pre-session-check.sh - Detailed session start context"
echo " ./session-health-monitor.sh check - Detailed session health"
echo " ./status.sh - This quick status (run anytime)"
echo ""