---
name: init_desktop_app
kind: pipeline
lang: bash
domain: pipelines
version: "1.0.0"
purity: impure
signature: "init_desktop_app(nombre: string, [--with-db]) -> void"
description: "Scaffold de Wails desktop app: Go backend + React frontend con Mantine y @fn_library. Genera main.go (Wails con embed frontend), app.go (bindings Greet/GetVersion), wails.json, go.mod con replace a fn-registry y frontend/ con vite + react + mantine."
tags: [init, scaffold, desktop, wails, pipeline, bash, launcher]
uses_functions:
  - assert_command_exists_bash_shell
  - scaffold_wails_app_go_infra
  - install_wails_bash_infra
  - wails_bind_crud_go_infra
  - wails_build_go_infra
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: []
params:
  - name: nombre
    desc: "nombre de la app Wails (apps/{nombre}/)"
  - name: "--with-db"
    desc: "anade store.go con SQLite + bindings CRUD (Item, ListItems, CreateItem)"
output: "app Wails en apps/{nombre}/ con main.go + app.go + wails.json + frontend/ Vite+React. Ejecutar 'wails dev' o 'wails build' dentro del directorio."
tested: false
tests: []
test_file_path: ""
example: "fn run init_desktop_app my_tool"
file_path: "bash/functions/pipelines/init_desktop_app.sh"
---

## Sinopsis

```bash
fn run init_desktop_app <nombre> [--with-db]
```

## Ejemplo rapido

```bash
fn run init_desktop_app data_explorer --with-db
cd apps/data_explorer/frontend && pnpm install && cd ..
wails dev                       # dev con hot reload
# o bien:
wails build && ./build/bin/data_explorer
```

## Archivos generados

| Archivo | Descripcion |
|---------|-------------|
| `main.go` | Entry Wails con embed de frontend/dist, options.App, Bind: []interface{}{app} |
| `app.go` | Struct App con bindings `Greet(name)`, `GetVersion()` (y con `--with-db`: `ListItems`, `CreateItem`) |
| `wails.json` | Config Wails: name, outputfilename, scripts frontend (pnpm) |
| `go.mod` | Modulo Go con `github.com/wailsapp/wails/v2` + replace `fn-registry` |
| `frontend/package.json` | pnpm + vite + react + @mantine/core + @tabler/icons-react |
| `frontend/vite.config.ts` | Alias `@fn_library`, outDir `dist` para embed |
| `frontend/tsconfig.json` | TS strict con paths `@fn_library/*` |
| `frontend/src/main.tsx` | Root con `MantineProvider` (defaultColorScheme: dark) |
| `frontend/src/App.tsx` | Componente que llama bindings `Greet` y `GetVersion` via wailsjs |
| `frontend/postcss.config.cjs` | postcss-preset-mantine |
| `app.md` | Framework: `wails + vite + react + mantine` |

Con `--with-db` anade ademas:
- `store.go` — `openDB`, tipo `Item`, bindings CRUD `ListItems`, `CreateItem`

## Flags

| Flag | Efecto |
|------|--------|
| `--with-db` | SQLite con schema `items` + bindings CRUD como ejemplo |

## Post-setup

```bash
# 1. Instalar deps del frontend (una vez)
cd apps/{nombre}/frontend && pnpm install && cd ..

# 2. Desarrollo
wails dev       # Ventana desktop con hot reload del frontend

# 3. Produccion
wails build     # binario en build/bin/{nombre}
./build/bin/{nombre}
```

## Requisitos

El scaffold funciona sin Wails CLI, pero `wails dev`/`wails build` requiere:

- **Wails CLI:** `go install github.com/wailsapp/wails/v2/cmd/wails@latest`
- **Deps del sistema (Linux):** GTK3 + WebKit2GTK — usa
  `install_wails_bash_infra` para instalarlas:
  ```bash
  source bash/functions/infra/install_wails.sh && install_wails
  ```

## Notas

Pipeline impuro: genera archivos via heredocs, ejecuta `go mod tidy` al
final como verificacion. Si Wails CLI no esta disponible, reporta el warning
y continua — el scaffold es valido, solo `wails build` falla hasta instalar
el CLI.

El frontend importa `@fn_library` via alias en vite.config.ts apuntando a
`../../../frontend/functions/ui/` (los componentes del registry sin
duplicarlos).

Los bindings de Wails (funciones del struct App) se regeneran en
`frontend/wailsjs/go/main/App.ts` automaticamente cuando corres `wails dev`
o `wails build`.

Abort si `apps/{nombre}/` ya existe.

El tag `launcher` permite que aparezca en el Pipeline Launcher TUI.
