--- 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 [--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.