Source code for neurocore.cli.init_cmd
"""neurocore init — scaffold a new project.
Creates a new NeuroCore project with:
- neurocore.yaml (configuration)
- .env.example (environment template)
- blueprints/ directory with example blueprint
- skills/ directory
- data/ directory
- logs/ directory
Usage:
neurocore init my-agent
neurocore init my-agent --dir /path/to/projects
"""
from __future__ import annotations
from pathlib import Path
import typer
from rich.console import Console
console = Console()
# Template directory relative to this file
_TEMPLATES_DIR = Path(__file__).parent.parent / "scaffold" / "templates"
def _render_template(template_path: Path, context: dict[str, str]) -> str:
"""Simple Jinja2-style template rendering ({{ var }} only).
Args:
template_path: Path to the template file.
context: Mapping of variable names to values.
Returns:
Rendered template string.
"""
content = template_path.read_text()
for key, value in context.items():
content = content.replace(f"{{{{ {key} }}}}", value)
return content
[docs]
def init_project(
name: str = typer.Argument(
help="Project name (used for directory and config).",
),
directory: Path = typer.Option(
Path("."),
"--dir",
"-d",
help="Parent directory to create the project in.",
),
) -> None:
"""Scaffold a new NeuroCore project."""
project_dir = directory.resolve() / name
# Check if directory already exists
if project_dir.exists():
console.print(
f"[red]Error:[/red] Directory '{project_dir}' already exists."
)
raise typer.Exit(code=1)
context = {"project_name": name}
try:
# Create directory structure
project_dir.mkdir(parents=True)
(project_dir / "skills").mkdir()
(project_dir / "blueprints").mkdir()
(project_dir / "data").mkdir()
(project_dir / "logs").mkdir()
# Render and write config file
config_content = _render_template(
_TEMPLATES_DIR / "neurocore.yaml", context
)
(project_dir / "neurocore.yaml").write_text(config_content)
# Render and write .env.example
env_content = _render_template(
_TEMPLATES_DIR / ".env.example", context
)
(project_dir / ".env.example").write_text(env_content)
# Render and write example blueprint
blueprint_content = _render_template(
_TEMPLATES_DIR / "agent.flow.yaml", context
)
(project_dir / "blueprints" / "agent.flow.yaml").write_text(
blueprint_content
)
except OSError as e:
console.print(f"[red]Error:[/red] Failed to create project: {e}")
raise typer.Exit(code=1) from None
# Success output
console.print()
console.print(f"[green]Created NeuroCore project:[/green] {name}")
console.print()
console.print(f" [dim]{project_dir}/[/dim]")
console.print(f" ├── neurocore.yaml")
console.print(f" ├── .env.example")
console.print(f" ├── blueprints/")
console.print(f" │ └── agent.flow.yaml")
console.print(f" ├── skills/")
console.print(f" ├── data/")
console.print(f" └── logs/")
console.print()
console.print("[dim]Next steps:[/dim]")
console.print(f" cd {name}")
console.print(f" cp .env.example .env")
console.print(f" neurocore run blueprints/agent.flow.yaml")