Scaffolding für ein neues Feature in der Tauri v2 App. Erstellt Rust-Command in commands/, typisierte API-Funktion in tauri-api.ts und React-View in src/views/. Nutze diesen Skill wenn ein komplett neues Feature von Grund auf implementiert werden soll (Backend + Frontend). Aufruf mit /new-feature [feature-name] [beschreibung].
Du erstellst das Grundgerüst für ein neues Feature in der Speicher Analyse Tauri-App.
$ARGUMENTS[0] = Feature-Name (kebab-case, z.B. disk-health)$ARGUMENTS[1] = Kurzbeschreibung des Features (optional)src-tauri/src/commands/ - Wie Commands definiert werden (8 Module)src-tauri/src/lib.rs - Wie Commands registriert werdensrc/api/tauri-api.ts - Wie API-Funktionen typisiert werdensrc/App.tsx - App Shellsrc/components/TabRouter.tsx - Wie Views lazy-loaded werdensrc/components/Sidebar.tsx - Wie Sidebar-Tabs definiert sindsrc-tauri/src/commands/cmd_*.rs#[tauri::command]
pub async fn feature_action(param: String) -> Result<serde_json::Value, String> {
let safe_param = param.replace("'", "''");
let script = format!(r#"
$result = Get-Something '{}'
$result | ConvertTo-Json -Depth 3
"#, safe_param);
crate::ps::run_ps_json(&script).await
}
src-tauri/src/lib.rs + commands/mod.rssrc/api/tauri-api.tsexport const featureAction = (param: string) =>
invoke<ReturnType>('feature_action', { param });
src/views/FeatureNameView.tsximport { useState, useCallback, useEffect } from 'react';
import * as api from '../api/tauri-api';
import { useAppContext } from '../context/AppContext';
export default function FeatureNameView() {
const { showToast } = useAppContext();
const [data, setData] = useState<any>(null);
const [loading, setLoading] = useState(false);
const [loaded, setLoaded] = useState(false);
const loadData = useCallback(async () => {
if (loading) return;
setLoading(true);
try {
const result = await api.featureAction();
setData(result);
setLoaded(true);
} catch (err: any) {
showToast('Fehler: ' + err.message, 'error');
} finally {
setLoading(false);
}
}, [loading, showToast]);
useEffect(() => {
if (!loaded) loadData();
}, []); // eslint-disable-line react-hooks/exhaustive-deps
return (
<div className="feature-page">
<div className="feature-header"><h2>Feature-Titel</h2></div>
{loading && <div className="loading-state">Lade Daten...</div>}
{!loading && loaded && data && (
<div className="feature-content">{/* Inhalt */}</div>
)}
{!loading && !loaded && (
<div className="tool-placeholder">Noch keine Daten geladen.</div>
)}
</div>
);
}
React-Konventionen:
export defaultuseState, Side-Effects via useEffect mit Cleanup-Returnimport * as api from '../api/tauri-api'useAppContext() (showToast, scanId, drives)dangerouslySetInnerHTMLsrc/components/TabRouter.tsxconst FeatureNameView = lazy(() => import('../views/FeatureNameView'));
src/components/Sidebar.tsxButton in die passende Gruppe einfügen.
Ein Feature ist NICHT fertig wenn es technisch funktioniert. Es ist fertig wenn ein Mensch es intuitiv bedienen kann.
Vor dem Commit MUSS jeder Punkt geprüft und umgesetzt werden:
"Wenn ich dieses Feature als normaler Windows-User zum ersten Mal öffne — was erwarte ich? Was würde mich frustrieren wenn es fehlt?"
dangerouslySetInnerHTML?useEffect Cleanup für Timer/Listener/Observer?/add-tauri-command - Nur Command ohne View/add-sidebar-tab - Nur Sidebar-Tab ohne Backend/powershell-cmd - PowerShell-Befehle/changelog - Nach Fertigstellung