#!/bin/bash # garden-session.sh: Automate daily note → session log draft # Usage: ./garden-session.sh [YYYY-MM-DD] # Outputs to content/sessions/YYYY-MM-DD-session.md set -euo pipefail SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" DATE=${1:-$(date +%Y-%m-%d)} DAILY_FILE_PATH="$HOME/.napkin/daily/${DATE}.md" DRAFT_PATH="content/sessions/${DATE}-session.md" echo "Generating session draft for ${DATE}..." # Check if daily note exists if [ ! -f "$DAILY_FILE_PATH" ]; then echo "No daily note for ${DATE} at ${DAILY_FILE_PATH}" exit 1 fi # Use the python parser to get structured data JSON_DATA=$("$SCRIPT_DIR/parse_daily.py" "$DAILY_FILE_PATH") if [[ -z "$JSON_DATA" || "$JSON_DATA" == "{}" ]]; then echo "Failed to parse data from daily note." exit 1 fi # Extract data using jq for safety SUMMARY=$(echo "$JSON_DATA" | jq -r '.summary // ""') KEYWORDS=$(echo "$JSON_DATA" | jq -r '.keywords | join(", ") // ""') WORK=$(echo "$JSON_DATA" | jq -r '.work // ""') # Determine fragment types from keywords (simple mapping) FRAGMENTS=() RAW_KEYWORDS=$(echo "$JSON_DATA" | jq -r '.keywords[]? // ""') for keyword in $RAW_KEYWORDS; do case "$keyword" in operational|fix|debug) FRAGMENTS+=("fix") ;; build|protocol|create|implement) FRAGMENTS+=("build") ;; analysis|forensics) FRAGMENTS+=("analysis") ;; reflection|philosophy) FRAGMENTS+=("reflection") ;; esac done # Deduplicate fragments FRAGMENTS=($(echo "${FRAGMENTS[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) # Generate draft MD cat > "${DRAFT_PATH}" << EOF --- title: "Vigilio Session Log: ${DATE}" date: ${DATE}T00:00:00Z tags: [session, ${KEYWORDS}] draft: true --- # Session ${DATE} ## Summary {{% fragment type="summary" %}} ${SUMMARY} {{% /fragment %}} ## Work Highlights {{% fragment type="work" %}} ${WORK} {{% /fragment %}} ## Fragments EOF # Add dynamic fragments for type in "${FRAGMENTS[@]}"; do echo " {{% fragment type=\"${type}\" %}} [Details for ${type}] {{% /fragment %}}" >> "${DRAFT_PATH}" done echo "Draft generated: ${DRAFT_PATH}" echo "Review, edit voice, set draft: false, hugo, commit."