一键导入
file-storage
Tauri 文件操作技能,覆盖 Rust std::fs 和 Tauri FS Plugin 的文件读写。 触发场景: - 需要读写本地文件 - 需要选择文件/目录(对话框) - 需要管理应用数据目录 - 需要处理文件拖放 触发词: 文件、读写、保存、打开、目录、文件系统、fs、拖放、导入、导出
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Tauri 文件操作技能,覆盖 Rust std::fs 和 Tauri FS Plugin 的文件读写。 触发场景: - 需要读写本地文件 - 需要选择文件/目录(对话框) - 需要管理应用数据目录 - 需要处理文件拖放 触发词: 文件、读写、保存、打开、目录、文件系统、fs、拖放、导入、导出
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Git 工作流与版本管理技能,规范分支策略、提交信息和发布流程。 触发场景: - 用户需要创建分支或合并代码 - 用户需要规范提交信息格式 - 用户需要管理版本发布流程 触发词:Git、分支、提交、合并、版本发布
发布 Tauri 桌面应用新版本,处理版本号同步、Git tag、GitHub Actions 构建、Release 仓库产物同步、Cloudflare R2 上传、update.json 生成、自动更新发布和文档站重建。 触发场景: - 需要发布新版本或 release - 需要打 tag、推送发布分支或触发 CI 构建 - 需要生成或更新 update.json - 需要处理 Tauri updater 签名产物 - 需要同步 R2 CDN、GitHub/Gitee release 仓库或发布安装包 触发词:发布、release、版本发布、推送、打Tag、update.json、签名构建、安装包、自动更新、R2、CDN
Git 工作流与版本管理技能,规范分支策略、提交信息和发布流程。 触发场景: - 用户需要创建分支或合并代码 - 用户需要规范提交信息格式 - 用户需要管理版本发布流程 触发词:Git、分支、提交、合并、版本发布
自主连续开发方法论(Codex 版)。把一个项目按「每轮一个最小可提交单元」的方式推进到完成: 每轮读真相源 → 选下一个未做项 → 做一个最小单元 → 过验证门 → 记录勾选 → 最小提交 → 报进度。 适用于"按需求/台账建功能、还原原型、修一批 bug、补测试、重构、迁移、清理"等需要反复同构推进的任务。 与 Claude Code 的关系:Claude Code 有内置 `/loop` 自动续期(`/loop /dev-loop`),Codex 没有—— 所以 Codex 端由你(或脚本 / cron)反复触发"继续下一轮",方法论本身一致。 触发场景: - 想让 Codex 把某个项目/某个意图"一轮轮推进到完成" - 还原原型图、修一批 warning、补单测、重构模块等同构重复任务 - 需要"每步可编译、可回退、可恢复"的稳健推进方式 触发词:自主开发、连续开发、循环开发、一轮一提交、还原原型、批量修复、autonomous dev、continuous dev
Tauri 打包与分发技能,指导桌面端(Windows/macOS/Linux)与移动端(Android/iOS)的构建、签名和分发。 触发场景: - 需要构建生产安装包(exe/dmg/deb/apk/aab/ipa) - 需要配置各平台打包参数 - 需要代码签名(Windows 证书 / Android keystore / iOS 描述文件) - 需要减小安装包体积 - 需要设置应用图标和元数据 - 需要打包 Android / iOS App 触发词: 打包、构建、build、发布、安装包、exe、dmg、deb、apk、aab、ipa、签名、分发、release、android build、ios build、移动端打包
排查已发生的问题、定位 Bug 原因。 触发场景: - 代码运行报错,需要定位原因 - 功能不正常,需要排查 - Tauri Command 返回错误,需要分析 - 日志分析、调试代码 触发词:Bug、报错、不工作、调试、排查、为什么、出问题、失败、不生效、无效、找不到原因、定位问题
| name | file-storage |
| description | Tauri 文件操作技能,覆盖 Rust std::fs 和 Tauri FS Plugin 的文件读写。 触发场景: - 需要读写本地文件 - 需要选择文件/目录(对话框) - 需要管理应用数据目录 - 需要处理文件拖放 触发词: 文件、读写、保存、打开、目录、文件系统、fs、拖放、导入、导出 |
| 方式 | 技术 | 适用场景 |
|---|---|---|
| Rust std::fs | Rust 标准库 | Rust Command 中操作文件 |
| Tauri FS Plugin | @tauri-apps/plugin-fs | 前端直接操作文件(需权限) |
use std::fs;
use std::path::PathBuf;
#[tauri::command]
fn read_text_file(path: String) -> Result<String, String> {
fs::read_to_string(&path).map_err(|e| format!("读取失败: {}", e))
}
#[tauri::command]
fn write_text_file(path: String, content: String) -> Result<(), String> {
fs::write(&path, &content).map_err(|e| format!("写入失败: {}", e))
}
#[tauri::command]
fn read_json_file<T: serde::de::DeserializeOwned>(path: String) -> Result<T, String> {
let content = fs::read_to_string(&path).map_err(|e| e.to_string())?;
serde_json::from_str(&content).map_err(|e| e.to_string())
}
#[tauri::command]
fn list_directory(path: String) -> Result<Vec<String>, String> {
let entries = fs::read_dir(&path).map_err(|e| e.to_string())?;
let names: Vec<String> = entries
.filter_map(|entry| entry.ok())
.map(|entry| entry.file_name().to_string_lossy().into())
.collect();
Ok(names)
}
#[tauri::command]
fn get_app_data_dir(app: tauri::AppHandle) -> Result<String, String> {
app.path()
.app_data_dir()
.map(|p| p.to_string_lossy().into())
.map_err(|e| e.to_string())
}
# Cargo.toml
tauri-plugin-fs = "2"
# package.json
pnpm add @tauri-apps/plugin-fs
{
"permissions": [
"fs:default",
"fs:allow-read-text-file",
"fs:allow-write-text-file",
"fs:allow-exists",
"fs:allow-mkdir"
]
}
import { readTextFile, writeTextFile, exists, mkdir } from "@tauri-apps/plugin-fs";
import { appDataDir, join } from "@tauri-apps/api/path";
// 读取文件
const content = await readTextFile("config.json", { baseDir: BaseDirectory.AppData });
// 写入文件
await writeTextFile("output.txt", "Hello World", { baseDir: BaseDirectory.AppData });
// 检查文件存在
const fileExists = await exists("config.json", { baseDir: BaseDirectory.AppData });
tauri-plugin-dialog = "2"
pnpm add @tauri-apps/plugin-dialog
import { open, save } from "@tauri-apps/plugin-dialog";
// 选择文件
const selected = await open({
multiple: false,
filters: [{ name: "Text", extensions: ["txt", "md"] }],
});
if (selected) {
const content = await invoke<string>("read_text_file", { path: selected });
}
// 保存文件
const savePath = await save({
defaultPath: "output.txt",
filters: [{ name: "Text", extensions: ["txt"] }],
});
if (savePath) {
await invoke("write_text_file", { path: savePath, content: "data" });
}
import { appDataDir, appConfigDir, homeDir, desktopDir } from "@tauri-apps/api/path";
const dataDir = await appDataDir(); // 应用数据目录
const configDir = await appConfigDir(); // 应用配置目录
const home = await homeDir(); // 用户主目录
const desktop = await desktopDir(); // 桌面目录
| 错误做法 | 正确做法 |
|---|---|
硬编码路径 "C:\\Users\\..." | 使用 Tauri path API |
| 前端直接用 fs 不声明权限 | 在 capabilities 中声明 fs 权限 |
| 不处理文件不存在 | 先 exists() 检查或 catch 错误 |
| 路径拼接用字符串 | 使用 std::path::PathBuf (Rust) 或 join() (TS) |