init: Sprout desktop app launcher
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
92
CLAUDE.md
Normal file
92
CLAUDE.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
**Sprout Launcher (萌芽桌面启动器)** is a Windows desktop application launcher built with **Tauri 2 + React 18 + TypeScript**. Users add apps to a categorized grid, launch them from a single window, and manage shortcuts/icons.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
npm install # Install JS dependencies
|
||||
npm run tauri dev # Start Vite dev server + Tauri (hot reload)
|
||||
npm run lint # ESLint — must pass with zero warnings
|
||||
npm run tauri build # tsc && vite build && Tauri bundler → src-tauri/target/release/bundle/
|
||||
```
|
||||
|
||||
No automated test framework is configured. Manual smoke testing: add/edit/delete apps, category CRUD, config persistence across restart, icon extraction, window controls.
|
||||
|
||||
## Architecture
|
||||
|
||||
The app uses Tauri 2's two-process model:
|
||||
|
||||
```
|
||||
Renderer (React UI in src/)
|
||||
↕ invoke() / listen() via @tauri-apps/api
|
||||
Rust backend (src-tauri/src/lib.rs)
|
||||
↕ Native APIs
|
||||
Windows OS (filesystem, registry, shell, PowerShell)
|
||||
```
|
||||
|
||||
**Key source files:**
|
||||
|
||||
| File | Role |
|
||||
|------|------|
|
||||
| `src/App.tsx` | Master state container — config, drag-drop, dialog orchestration |
|
||||
| `src/types.ts` | Shared TypeScript interfaces (`App`, `Config`, `Category`) |
|
||||
| `src/components/AppCard.tsx` | Memoized app tile |
|
||||
| `src/components/AddAppDialog.tsx` | Add/edit app modal — calls `invoke()` for file pickers |
|
||||
| `src/components/GridWithFill.tsx` | Responsive grid using ResizeObserver |
|
||||
| `src-tauri/src/lib.rs` | All Tauri commands + tray + protocol + setup |
|
||||
| `src-tauri/tauri.conf.json` | Window config, bundle targets, CSP |
|
||||
| `src-tauri/capabilities/default.json` | Plugin permission grants |
|
||||
|
||||
## IPC Communication
|
||||
|
||||
The frontend calls Rust via `invoke(command_name, args)` from `@tauri-apps/api/core`. Events from Rust to frontend use `listen()` from `@tauri-apps/api/event`.
|
||||
|
||||
Key commands in `src-tauri/src/lib.rs`:
|
||||
|
||||
| Command | Purpose |
|
||||
|---------|---------|
|
||||
| `launch_app` | Execute app via `cmd /C start` |
|
||||
| `select_target` / `select_folder` / `select_single_executable` | Native file/folder dialogs |
|
||||
| `select_executables` | Multi-select executables |
|
||||
| `create_shortcut` | Create Windows `.lnk` via PowerShell COM |
|
||||
| `ensure_icon` | Extract icon from EXE/folder via PowerShell + .NET, cache as PNG |
|
||||
| `delete_app_artifacts` | Clean up shortcut + cached icon |
|
||||
| `show_app_context_menu` | Show native right-click menu; emits `app-context-action` event |
|
||||
| `load_config` / `save_config` | Read/write `%APPDATA%/com.smyhub.sprout-launcher/launcher-config.json` |
|
||||
| `export_config` / `import_config` | File dialog + JSON backup/restore |
|
||||
| `get_auto_launch` / `set_auto_launch` | Windows boot startup via `tauri-plugin-autostart` |
|
||||
| `minimize_window` / `maximize_window` / `close_window` | Window controls (close → hide to tray) |
|
||||
| `refresh_icons` | Re-extract all icons to disk; returns `sprout-icon://` URLs |
|
||||
|
||||
## Data & File Locations
|
||||
|
||||
- **Config:** `%APPDATA%/com.smyhub.sprout-launcher/launcher-config.json`
|
||||
- **Cached icons:** `%APPDATA%/com.smyhub.sprout-launcher/data/icons/` (PNG files)
|
||||
- **Shortcuts:** `%APPDATA%/com.smyhub.sprout-launcher/data/shortcuts/` (`.lnk` files)
|
||||
- Icons are served via a custom `sprout-icon://` URI scheme registered in `lib.rs`
|
||||
|
||||
If you change the config schema, add a migration path in `src/App.tsx` inside `migrateAndMaybeSaveConfig()` (existing `exePath → targetPath` migration is the pattern to follow).
|
||||
|
||||
## Tauri Plugins Used
|
||||
|
||||
| Plugin | Purpose |
|
||||
|--------|---------|
|
||||
| `tauri-plugin-dialog` | File open/save dialogs (Rust side) |
|
||||
| `tauri-plugin-autostart` | Windows login-item / startup registry |
|
||||
| `tauri-plugin-single-instance` | Prevent duplicate instances; focus existing window |
|
||||
| `tauri-plugin-log` | Structured logging |
|
||||
|
||||
## Coding Conventions
|
||||
|
||||
- TypeScript strict mode; all changes must be type-safe
|
||||
- ESM (`"type": "module"`) throughout
|
||||
- 2-space indentation
|
||||
- React components: `PascalCase.tsx` in `src/components/`; shared types in `src/types.ts`
|
||||
- Rust: standard `snake_case`, all commands registered in `invoke_handler!` at bottom of `lib.rs`
|
||||
- Commits: Conventional Commits (`feat:`, `fix:`, `chore:`, etc.)
|
||||
- `dist/`, `src-tauri/target/` are build artifacts — do not edit
|
||||
Reference in New Issue
Block a user