flowchart TD
Entry["CLI: turbine init --demo or LSP: turbine/scaffoldProject"] --> Resolve["Resolve variant and database"]
Resolve --> VariantCheck{"variant == demo?"}
VariantCheck -->|yes| LoadDemo["importlib.resources.files turbine.onboarding.templates.demo"]
VariantCheck -->|no| DbCheck{"database is None?"}
DbCheck -->|yes| Err["raise ValueError"]
DbCheck -->|no| LoadBare["importlib.resources.files turbine.onboarding.templates.bare"]
LoadDemo --> CopyTree["shutil.copytree to layout.root (skip existing files)"]
LoadBare --> ReadContract["read example-contract.yml"]
ReadContract --> ReadDs["read datasources/database.yml"]
ReadDs --> WriteFiles["write to layout.root (skip existing files)"]
CopyTree --> Result["return ScaffoldProjectResult with created_files"]
WriteFiles --> Result
Err --> ErrResult["caller maps to LSP error or CLI failure"]sequenceDiagram
participant User
participant CLI as turbine init
participant LSP as ScaffoldProject handler
participant Service as ProjectScaffoldService
participant Resources as importlib.resources
participant FS as filesystem
User->>CLI: turbine init --demo
CLI->>Service: scaffold(variant=DEMO, database=None)
Service->>Resources: files("turbine.onboarding.templates.demo")
Resources-->>Service: traversable tree
Service->>FS: copytree to layout.root
FS-->>Service: created paths
Service-->>CLI: ScaffoldProjectResult
CLI-->>User: rendered summary
Note over User,FS: parallel LSP path
User->>LSP: turbine/scaffoldProject (variant=bare, database=postgres)
LSP->>LSP: parse_scaffold_variant + DatabaseChoiceId
LSP->>Service: scaffold(variant=BARE, database=POSTGRES)
Service->>Resources: files("turbine.onboarding.templates.bare")
Resources-->>Service: traversable tree
Service->>FS: write contracts/example-contract.yml and datasources/postgres.yml
FS-->>Service: created paths
Service-->>LSP: ScaffoldProjectResult
LSP-->>User: respond_customclassDiagram
class ProjectScaffoldService {
+layout: ProjectLayout
+scaffold(variant: ScaffoldVariant, database: DatabaseChoiceId) ScaffoldProjectResult
}
class ScaffoldVariant {
<<StrEnum>>
+DEMO
+BARE
}
class DatabaseChoiceId {
<<StrEnum>>
+POSTGRES
+SNOWFLAKE
+DUCKDB
+LSP_ONLY
}
class ScaffoldProjectParams {
<<dataclass>>
+variant: str
+database: str
}
class ScaffoldProjectResult {
<<dataclass>>
+created_files: tuple~str~
}
class ScaffoldProject {
+method: str
+run_with_snapshot(snapshot, client, request_id, params) None
}
class ProjectLayout {
+root: Path
+contracts_dir: Path
+datasources_dir: Path
+quality_dir: Path
}
ProjectScaffoldService --> ProjectLayout
ProjectScaffoldService --> ScaffoldVariant
ProjectScaffoldService --> DatabaseChoiceId
ProjectScaffoldService --> ScaffoldProjectResult
ScaffoldProject --> ProjectScaffoldService
ScaffoldProject --> ScaffoldProjectParams
ScaffoldProject --> ScaffoldProjectResult