feat: init_desktop_app bash pipeline — scaffold Wails desktop app

Genera apps/{nombre}/ con Wails v2 backend (main.go con embed frontend/dist,
app.go con struct App y bindings Greet/GetVersion) + frontend Vite+React+Mantine
con alias @fn_library.

Flag --with-db anade store.go con SQLite (schema items) y bindings CRUD
(ListItems, CreateItem); app.go se regenera con campo db.

wails.json con scripts pnpm, go.mod con replace a fn-registry, app.md con
framework wails+vite+react+mantine y dir_path correcto.

Verifica con go mod tidy al final. wails build requiere CLI instalado pero
el scaffold funciona sin el.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-18 17:54:55 +02:00
parent 6d63f058de
commit 526d7f4977
2 changed files with 712 additions and 0 deletions
@@ -0,0 +1,118 @@
---
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.