scripts-session-startup
#!/usr/bin/env python3 """
title: "Get script directory for path resolution (works from any cwd)" component_type: script version: "1.0.0" audience: contributor status: stable summary: "Session Startup Workflow" keywords: ['git', 'session', 'startup', 'validation'] tokens: ~500 created: 2025-12-22 updated: 2025-12-22 script_name: "session-startup.py" language: python executable: true usage: "python3 scripts/session-startup.py [options]" python_version: "3.10+" dependencies: [] modifies_files: false network_access: false requires_auth: false
Session Startup Workflow
Complete session initialization following Anthropic's multi-session pattern. Orchestrates all startup steps: state loading, environment validation, component activation.
Part of Phase 5.2: Session Initialization Created: 2025-11-29 """
import os import sys import json import subprocess import argparse from pathlib import Path from datetime import datetime, timezone from typing import Dict, Any, Optional, Tuple
Get script directory for path resolution (works from any cwd)
SCRIPT_DIR = Path(file).resolve().parent CORE_ROOT = SCRIPT_DIR.parent
def print_section(title: str, emoji: str = "📋"): """Print a section header""" print() print(f"{emoji} {title}") print("=" * 60)
def get_working_directory() -> Path: """Step 1: Verify working directory (Anthropic pattern)""" print_section("Working Directory", "📂") cwd = Path.cwd() print(f"Current: {cwd}") print(f"Repository: {cwd.name}") return cwd
def load_activation_status() -> Optional[Dict[str, Any]]: """Step 2: Load component activation status (Anthropic pattern)""" print_section("Component Activation Status", "🔄")
status_file = CORE_ROOT / '.coditect' / 'component-activation-status.json'
if not status_file.exists():
print("⚠️ Activation status not found")
print(" Generating...")
# Generate activation status
try:
subprocess.run(
['python3', 'scripts/generate-activation-status.py'],
check=True,
capture_output=True
)
print("✅ Activation status generated")
except subprocess.CalledProcessError as e:
print(f"❌ Failed to generate: {e}")
return None
# Load status
with open(status_file, 'r') as f:
status = json.load(f)
summary = status['activation_summary']
print(f"Total: {summary['total_components']} components")
print(f"Activated: {summary['activated']}")
print(f"Available: {summary['deactivated']}")
print(f"Last updated: {status['last_updated']}")
return status
def read_git_history() -> Tuple[str, str]: """Step 3: Read git history for context (Anthropic pattern)""" print_section("Git Context", "📜")
# Get recent commits
result = subprocess.run(
['git', 'log', '--oneline', '--graph', '--decorate', '-10'],
capture_output=True,
text=True
)
commits = result.stdout
# Get current branch
branch = subprocess.run(
['git', 'branch', '--show-current'],
capture_output=True,
text=True
).stdout.strip()
print(f"Branch: {branch}")
print()
print("Recent commits:")
for line in commits.split('\n')[:5]:
if line.strip():
print(f" {line}")
return branch, commits
def run_init_script() -> bool: """Step 4: Run init.sh for environment validation (Anthropic pattern)""" print_section("Environment Initialization", "🔧")
if not (SCRIPT_DIR / 'init.sh').exists():
print("⚠️ init.sh not found - skipping")
return False
print("Running scripts/init.sh...")
print()
try:
result = subprocess.run(
['bash', 'scripts/init.sh'],
check=True
)
print()
print("✅ Environment initialized successfully")
return True
except subprocess.CalledProcessError as e:
print(f"❌ init.sh failed with code {e.returncode}")
return False
def verify_critical_components() -> bool: """Step 5: Verify critical components (CODITECT-specific)""" print_section("Critical Component Verification", "🔍")
if not (SCRIPT_DIR / 'verify-critical-components.py').exists():
print("⚠️ verify-critical-components.py not found - skipping")
return True
try:
result = subprocess.run(
['python3', 'scripts/verify-critical-components.py'],
capture_output=True,
text=True
)
# Show verification results
for line in result.stdout.split('\n'):
if line.strip() and ('✅' in line or '❌' in line):
print(f" {line.strip()}")
if result.returncode == 0:
print()
print("✅ All critical components verified")
return True
else:
print()
print("⚠️ Some components missing")
return False
except Exception as e:
print(f"❌ Verification failed: {e}")
return False
def activate_project_components() -> None: """Step 6: Activate project-specific components (CODITECT-specific)""" print_section("Project Component Activation", "🚀")
if not (SCRIPT_DIR / 'activate-project-components.py').exists():
print("⚠️ activate-project-components.py not found - skipping")
return
try:
result = subprocess.run(
['python3', 'scripts/activate-project-components.py'],
capture_output=True,
text=True
)
# Show activation results
for line in result.stdout.split('\n'):
if line.strip():
print(f" {line.strip()}")
except Exception as e:
print(f"❌ Activation failed: {e}")
def print_summary(status: Optional[Dict[str, Any]], git_branch: str): """Print session startup summary""" print_section("Session Ready", "✅")
print("Session initialized successfully following Anthropic multi-session pattern")
print()
if status:
summary = status['activation_summary']
print(f"Components: {summary['activated']}/{summary['total_components']} activated")
print(f"Branch: {git_branch}")
print(f"Timestamp: {datetime.now(timezone.utc).isoformat().replace('+00:00', 'Z')}")
print()
print("You can now proceed with development")
print()
def main(): """Main entry point - Full session startup workflow""" parser = argparse.ArgumentParser( description='CODITECT Session Startup (Anthropic Multi-Session Pattern)' ) parser.add_argument( '--skip-git', action='store_true', help='Skip git history checks' ) parser.add_argument( '--skip-init', action='store_true', help='Skip init.sh execution' ) parser.add_argument( '--verbose', action='store_true', help='Verbose output' )
args = parser.parse_args()
print()
print("=" * 60)
print("🚀 CODITECT Session Startup")
print("=" * 60)
# Step 1: Working directory
cwd = get_working_directory()
# Step 2: Load activation status
status = load_activation_status()
# Step 3: Git history (unless skipped)
git_branch = ""
if not args.skip_git:
git_branch, git_commits = read_git_history()
# Step 4: Run init.sh (unless skipped)
if not args.skip_init:
init_success = run_init_script()
if not init_success:
print()
print("⚠️ Warning: Environment initialization had issues")
# Step 5: Verify critical components
components_ok = verify_critical_components()
if not components_ok:
print()
print("⚠️ Warning: Some critical components unavailable")
# Step 6: Activate project components
activate_project_components()
# Summary
print_summary(status, git_branch)
# Exit code
if status and components_ok:
sys.exit(0)
else:
print("⚠️ Session started with warnings")
sys.exit(1)
if name == 'main': main()