#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=./common.sh source "$SCRIPT_DIR/common.sh" ensure_repo_root load_repo_hooks if git rev-parse --is-inside-work-tree >/dev/null 2>&1 && has_remote; then if git diff --quiet && git diff --cached --quiet; then run_step "Pull latest changes" git pull --rebase else echo "[agent-framework] Skip pull: working tree has local changes" fi fi # ─── Mission state detection (ORCHESTRATOR-PROTOCOL) ──────────────────────── ORCH_DIR=".mosaic/orchestrator" MISSION_JSON="$ORCH_DIR/mission.json" COORD_LIB="$HOME/.config/mosaic/tools/orchestrator/_lib.sh" if [[ -f "$MISSION_JSON" ]] && command -v jq &>/dev/null; then mission_status="$(jq -r '.status // "inactive"' "$MISSION_JSON")" if [[ "$mission_status" == "active" || "$mission_status" == "paused" ]]; then mission_name="$(jq -r '.name // "unnamed"' "$MISSION_JSON")" echo "" echo "=========================================" echo "ACTIVE MISSION DETECTED" echo "=========================================" echo " Mission: $mission_name" # Extract key fields from manifest if present manifest="docs/MISSION-MANIFEST.md" if [[ -f "$manifest" ]]; then phase="$(grep -m1 '^\*\*Phase:\*\*' "$manifest" 2>/dev/null | sed 's/.*\*\*Phase:\*\* //' || true)" milestone="$(grep -m1 '^\*\*Current Milestone:\*\*' "$manifest" 2>/dev/null | sed 's/.*\*\*Current Milestone:\*\* //' || true)" progress="$(grep -m1 '^\*\*Progress:\*\*' "$manifest" 2>/dev/null | sed 's/.*\*\*Progress:\*\* //' || true)" [[ -n "$phase" ]] && echo " Phase: $phase" [[ -n "$milestone" ]] && echo " Milestone: $milestone" [[ -n "$progress" ]] && echo " Progress: $progress" fi # Task counts if [[ -f "docs/TASKS.md" ]]; then total="$(grep -c '^|' "docs/TASKS.md" 2>/dev/null || true)" total="${total:-0}" done_count="$(grep -ci '| done \|| completed ' "docs/TASKS.md" 2>/dev/null || true)" done_count="${done_count:-0}" approx_total=$(( total > 2 ? total - 2 : 0 )) echo " Tasks: ~${done_count} done of ~${approx_total} total" fi # Scratchpad if [[ -d "docs/scratchpads" ]]; then latest_sp="$(ls -t docs/scratchpads/*.md 2>/dev/null | head -1 || true)" [[ -n "$latest_sp" ]] && echo " Scratchpad: $latest_sp" fi echo "" echo " Resume: Read manifest + scratchpad before taking action." echo " Protocol: ~/.config/mosaic/guides/ORCHESTRATOR-PROTOCOL.md" echo "=========================================" echo "" # Register session if coordinator lib is available if [[ -f "$COORD_LIB" ]]; then # shellcheck source=/dev/null source "$COORD_LIB" sess_id="$(next_session_id ".")" runtime="${MOSAIC_RUNTIME:-unknown}" session_lock_write "." "$sess_id" "$runtime" "$$" # Append session to mission.json updated="$(jq \ --arg sid "$sess_id" \ --arg rt "$runtime" \ --arg ts "$(iso_now)" \ '.sessions += [{"session_id":$sid,"runtime":$rt,"started_at":$ts,"ended_at":"","ended_reason":"","milestone_at_end":"","tasks_completed":[],"last_task_id":""}]' \ "$MISSION_JSON")" echo "$updated" > "$MISSION_JSON.tmp" && mv "$MISSION_JSON.tmp" "$MISSION_JSON" fi fi fi if declare -F mosaic_hook_session_start >/dev/null 2>&1; then run_step "Run repo start hook" mosaic_hook_session_start else echo "[agent-framework] No repo start hook configured (.mosaic/repo-hooks.sh)" fi