File size: 5,386 Bytes
df55394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37b748e
 
df55394
37b748e
df55394
 
 
 
37b748e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df55394
 
37b748e
 
 
df55394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37b748e
 
 
 
df55394
37b748e
 
df55394
 
 
 
 
 
 
 
 
37b748e
df55394
37b748e
 
df55394
 
 
 
 
37b748e
 
df55394
37b748e
df55394
37b748e
 
 
df55394
37b748e
df55394
 
 
 
 
 
37b748e
 
df55394
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""ever-brain init — Interactive project initialization wizard."""

from pathlib import Path
import typer
from rich.console import Console
from rich.panel import Panel
from rich.text import Text

from brain.paths import get_global_projects_dir, get_brains_dir, get_global_brains_dir
from brain.utils.display import success, info, error
from brain.commands.create import create as create_brain
from brain.commands.persona import set_persona

console = Console()

def init() -> None:
    """Initialize Ever Brain for the current project."""
    console.print(Panel(
        Text("Ever Brain Initialization Wizard", style="bold cyan"),
        subtitle="A Cognition Operating System for AI Agents"
    ))

    # 1. Storage Mode
    console.print("\n[bold]1. Project Storage Mode[/bold]")
    console.print("Choose where to store this project's memory (docs, logs, tasks):")
    console.print("  [1] Local (.brain/ folder in this project) - Best for portability & Git")
    console.print("  [2] Global (~/.ever-brain/workspaces/...)   - Best for a clean project folder")
    
    choice = typer.prompt("Select option", default="1")
    is_local = choice == "1"
    
    # 2. Core Brain Location
    console.print("\n[bold]2. Core Brain Location[/bold]")
    console.print("Choose where the 'Core Brain' (personas, global history) should live:")
    console.print("  [1] Global (~/.ever-brain/brains/) - Shared across all your projects")
    console.print("  [2] Local (.brains/ folder)        - Isolated strictly to this project")
    
    brain_loc_choice = typer.prompt("Select option", default="1")
    is_brain_local = brain_loc_choice == "2"

    if is_brain_local:
        brains_dir = Path.cwd() / ".brains"
        brains_dir.mkdir(exist_ok=True)
    else:
        brains_dir = get_global_brains_dir()

    # 3. Brain Selection
    console.print("\n[bold]3. Core Brain Selection[/bold]")
    console.print(f"Which brain in [cyan]{brains_dir}[/cyan] should handle this project?")
    
    # List existing brains
    existing_brains = []
    if brains_dir.exists():
        existing_brains = [d.name for d in brains_dir.iterdir() if d.is_dir()]
    
    options = []
    if "work-brain" not in existing_brains:
        options.append("Create 'work-brain'")
    else:
        options.append("Use existing 'work-brain'")
        
    if "personal-brain" not in existing_brains:
        options.append("Create 'personal-brain'")
    else:
        options.append("Use existing 'personal-brain'")
        
    options.append("Create custom brain")
    
    for i, opt in enumerate(options, 1):
        console.print(f"  [{i}] {opt}")
        
    brain_choice = typer.prompt("Select option", default="1")
    
    selected_brain = ""
    idx = int(brain_choice) - 1
    if idx < len(options):
        opt_text = options[idx]
        if "work-brain" in opt_text:
            selected_brain = "work-brain"
        elif "personal-brain" in opt_text:
            selected_brain = "personal-brain"
        else:
            selected_brain = typer.prompt("Enter name for custom brain")
    
    # Create brain if it doesn't exist
    brain_path = brains_dir / selected_brain
    if not brain_path.exists():
        info(f"Creating new core brain: {selected_brain}")
        # Pass the specific directory to create to ensure it respects our choice
        from brain.templates.brain_instance import scaffold_brain_instance
        scaffold_brain_instance(brain_path)
        success(f"Ever Brain instance '{selected_brain}' created at {brain_path}")
    
    # 4. Persona Selection
    console.print("\n[bold]4. Persona Selection[/bold]")
    console.print("Choose an initial persona (you can change this later):")
    console.print("  [1] Architect (Software Engineering specialist)")
    console.print("  [2] Researcher (Data & Synthesis specialist)")
    console.print("  [3] General (Standard Assistant)")
    
    persona_choice = typer.prompt("Select option", default="1")
    persona_map = {"1": "architect", "2": "researcher", "3": "general"}
    selected_persona = persona_map.get(persona_choice, "general")

    # 5. Finalizing
    project_name = Path.cwd().name
    from brain.config import set_active_brain, set_storage_mode
    
    if is_local:
        workspace_dir = Path.cwd() / ".brain"
        workspace_dir.mkdir(exist_ok=True)
        # Store current project link
        (workspace_dir / "current_project").write_text(project_name, encoding="utf-8")
        set_storage_mode("local")
        success(f"Initialized Local storage in [cyan]{workspace_dir}[/cyan]")
    else:
        # Create global project marker locally
        (Path.cwd() / ".ever-brain").write_text(f"project: {project_name}\nmode: global", encoding="utf-8")
        set_storage_mode("global")
        # Workspace dir will be resolved by get_workspace_dir() later
        success(f"Initialized Global storage (Local folder stays clean)")

    # Set the brain as active for this project
    set_active_brain(brain_path)
    
    # Apply persona
    set_persona(selected_persona)

    console.print("\n[bold green]SUCCESS![/bold green] Ever Brain is ready.")
    info(f"Active Brain: {selected_brain} ({'Local' if is_brain_local else 'Global'})")
    info(f"Storage Mode: {'Local' if is_local else 'Global'}")
    info(f"Persona:      {selected_persona}")
    info("Next step:    Run 'ever-brain status'")