Files
2026-04-26 05:20:56 +02:00

161 lines
3.6 KiB
Bash
Executable File

#!/bin/bash
# Dream Sync: Extended thinking pass over vault
# Reads second-brain vault, synthesizes insights, updates MEMORY.md
# Can run: nightly, on-idle, or on-demand
set -e
# Load config
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/.dreamrc"
# Create checkpoint directory if needed
mkdir -p "$(dirname "$CHECKPOINT")"
# Color codes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
echo -e "${GREEN}[dream-sync]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[dream-sync]${NC} $1"
}
log_error() {
echo -e "${RED}[dream-sync]${NC} $1"
}
# Check if we should run
check_should_run() {
if [ ! -f "$CHECKPOINT" ]; then
log_info "First run, proceeding..."
return 0
fi
local last_run=$(jq -r '.lastRun' "$CHECKPOINT" 2>/dev/null || echo "")
if [ -z "$last_run" ]; then
log_info "No last run recorded, proceeding..."
return 0
fi
# Calculate time since last run (in minutes)
local last_timestamp=$(date -d "$last_run" +%s 2>/dev/null || echo 0)
local now=$(date +%s)
local minutes_since=$((($now - $last_timestamp) / 60))
if [ $minutes_since -lt $MIN_HOURS_BETWEEN_DREAMS ]; then
minutes_since=$((MIN_HOURS_BETWEEN_DREAMS * 60 - $minutes_since))
log_warn "Last dream was recent, next eligible in ${minutes_since}m. Use --force to override."
return 1
fi
return 0
}
# Main dream-sync process
run_dream_sync() {
log_info "Starting dream synthesis..."
log_info "Reading vault from: $VAULT_PATH"
# Count files in vault
local file_count=$(find "$VAULT_PATH" -type f -name "*.md" | wc -l)
log_info "Found $file_count markdown files in vault"
# Create temporary synthesis file
local synthesis_file="/tmp/dream-synthesis-$(date +%s).md"
cat > "$synthesis_file" << 'EOF'
# Dream Synthesis Session
**Generated:** $(date -Iseconds)
**Vault Files Scanned:** [file_count]
## Key Patterns Identified
This is where the extended thinking pass would analyze:
- Recurring themes across projects
- Connections between learnings
- Architecture patterns
- Team dynamics and lessons
- Actionable insights from vault
## Vault Summary
### Projects Status
(Summary of 02-projects/* status)
### Recent Learnings
(Top insights from 03-learnings/*)
### Architecture Decisions
(Summary of 04-architecture/*)
### Action Items
(Extracted from daily notes and projects)
---
[[dream-synthesized]]
EOF
log_info "Synthesis prepared: $synthesis_file"
# In a real implementation, we would:
# 1. Read all vault files
# 2. Generate extended thinking prompt
# 3. Call Claude with /dream mode
# 4. Parse results
# 5. Update MEMORY.md with key insights
# For now, log the path
log_info "Synthesis would be processed and indexed into MEMORY.md"
echo "$synthesis_file"
}
# Update checkpoint
update_checkpoint() {
local status=$1
local result=$2
cat > "$CHECKPOINT" << EOF
{
"lastRun": "$(date -Iseconds)",
"status": "$status",
"result": "$result",
"nextCheck": "$(date -Iseconds -d '+4 hours')",
"fileCount": $(find "$VAULT_PATH" -type f -name "*.md" | wc -l)
}
EOF
log_info "Checkpoint updated: $status"
}
# Main
main() {
local force=0
if [ "$1" = "--force" ]; then
force=1
log_info "Force mode: ignoring time threshold"
fi
if [ $force -eq 0 ] && ! check_should_run; then
exit 0
fi
if run_dream_sync; then
update_checkpoint "completed" "Dream synthesis completed successfully"
log_info "Dream synthesis complete ✨"
else
update_checkpoint "error" "Dream synthesis failed"
log_error "Dream synthesis failed"
exit 1
fi
}
main "$@"