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_custom
classDiagram
  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