在 ComfyUI 里抽到一张满意的图之后,真正有价值的东西往往不是那张 PNG,而是那串提示词——画风用哪个 LoRA 触发词、人物怎么描述、动作和环境怎么写的、构图权重给了多少。但现实是:提示词散落在各个工作流里、随图片一起淹没在输出文件夹里,隔两周再想复现某个效果,只能靠翻相册碰运气。
ComfyUI 提示词归档助手就是为这件事做的:一个纯前端的本地档案库,把提示词连同成品预览图一起结构化存下来,并且按 画风 / 人物 / 动作 / 环境 / 构图 五大类分开中英对照记录,支持关键词检索,也支持用 Excel(带图)批量导出备份和回灌。
它刻意保持极简:
- 无后端、无数据库服务、无账号体系。 前端静态部署即可运行,所有数据存在浏览器的 IndexedDB 里。
- 无 AI 调用。 它不生成提示词、也不调用任何大模型 API——它只负责「存、找、导」。提示词从哪来由你自己决定(手写、从 ComfyUI PNG 元数据提取、或由外部反推流程产出)。
- 导出即备份。 一条「导出 XLSX」就能把全部记录(含缩略图)落成一个自包含文件,换台电脑「导入 XLSX」即可恢复。
提示:仓库名
ComfyUI-是发布时的历史遗留,项目内部名称统一为「ComfyUI 提示词归档助手」。
| 特性 | 说明 |
|---|---|
| 🗂️ 五大分类结构化记录 | 每条记录按 画风 / 人物 / 动作 / 环境 / 构图 五个维度分别保存,每个维度都有英文原文与中文翻译两个字段,共 10 个文本域 |
| 🖼️ 图文绑定 | 上传成品预览图(FileReader → dataURL 存 IndexedDB),列表里直接看图对照,不用再回去翻输出目录 |
| 🔍 全字段关键词检索 | 输入即筛(useMemo 内存过滤),命中范围覆盖 5 类英文 + 5 类中文 + 历史遗留翻译字段,大小写不敏感 |
| 📤 带图导出 XLSX | 用 ExcelJS 生成真表格,图片按 ExcelJS 原生图片锚点嵌进单元格,行高 100、缩略图 90×90,可直接在 Excel 里浏览翻查 |
| 📥 按 ID 合并导入 XLSX | 复用导出的文件做「改完再导回」,按主键 ID (勿改) 更新记录;无 ID 的行会被跳过,已有记录的时间戳保持不变 |
| 🧩 列表折叠 | 默认只展示「画风 + 人物」两栏,其余三类收在「展开」里,长列表浏览时信息密度可控 |
| 🗑️ 行内二次确认删除 | 删除按钮点开变成「确定删除? 是 / 否」,不弹窗、不误删 |
| 🪶 零后端静态部署 | 只有静态产物,Vercel / 任意静态托管都能跑;exceljs 与 file-saver 走动态 import() 按需加载,不拖累首屏 |
| 🔒 数据不出本机 | 不发起任何业务网络请求,没有埋点、没有分析脚本;断网可用 |
┌──────────────────────────────────────────────────────────────────────────────┐
│ ✨ ComfyUI 提示词归档 [ 导入 XLSX ] [ 导出 XLSX ] [ + 新增归档 ] │
├──────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────────┐ │
│ │ 🔍 搜索分类提示词或中文翻译... │ │
│ └──────────────────────────────────────┘ │
│ │
│ ┌────────────┬──────────────────────────────────────────────────────────┐ │
│ │ │ 分类详情 (Categorized Breakdown) [收起/展开] [编辑] [删除]│ │
│ │ 预览图 │ ┌────────────────────┐ ┌────────────────────┐ │ │
│ │ │ │ 画风 (Style) │ │ 人物 (Character) │ │ │
│ │ (点击可 │ │ <英文原文> │ │ <英文原文> │ │ │
│ │ 上传 / │ │ ───────────── │ │ ───────────── │ │ │
│ │ 悬停更换) │ │ 翻译:<中文> │ │ 翻译:<中文> │ │ │
│ │ │ └────────────────────┘ └────────────────────┘ │ │
│ │ │ ┌────────────────────┐ ┌────────────────────┐ ← 展开后 │ │
│ │ │ │ 动作 (Action) │ │ 环境 (Environment) │ 才显示 │ │
│ │ │ ├────────────────────┤ ├────────────────────┤ │ │
│ │ │ │ 构图 (Composition) │ │ │ │ │
│ │ │ └────────────────────┘ └────────────────────┘ │ │
│ └────────────┴──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────┘
新增 / 编辑归档(模态框,宽屏三栏)
┌──────────────────────────────────────────────────────────────────────────────┐
│ 新增提示词归档 [ ✕ ] │
├─────────────────────┬──────────────────────────┬─────────────────────────────┤
│ 预览图 │ 分类提示词 (EN) │ 分类中文翻译 (CN) │
│ │ ┌────────────────────┐ │ ┌────────────────────┐ │
│ ┌───────────────┐ │ │ 画风 (Style) │ │ │ 画风 (Style) 翻译 │ │
│ │ │ │ ├────────────────────┤ │ ├────────────────────┤ │
│ │ 点击上传图片 │ │ │ 人物 (Character) │ │ │ 人物 (Character) │ │
│ │ │ │ ├────────────────────┤ │ ├────────────────────┤ │
│ │ (悬停可更换) │ │ │ 动作 (Action) │ │ │ 动作 (Action) │ │
│ │ │ │ ├────────────────────┤ │ ├────────────────────┤ │
│ └───────────────┘ │ │ 环境 (Environment) │ │ │ 环境 (Environment) │ │
│ │ ├────────────────────┤ │ ├────────────────────┤ │
│ │ │ 构图 (Composition) │ │ │ 构图 (Composition) │ │
│ │ └────────────────────┘ │ └────────────────────┘ │
├─────────────────────┴──────────────────────────┴─────────────────────────────┤
│ [ 取消 ] [ 保存记录 ] │
└──────────────────────────────────────────────────────────────────────────────┘
实现细节:模态框里的「保存记录」按钮在
<form id="prompt-form">外面,通过 HTML5 的form="prompt-form"属性关联提交。这是刻意的布局选择(按钮固定在弹窗底栏、不跟随表单滚动),写自动化脚本时注意别去找#prompt-form button[type=submit]。
分类维度固定为五种,中英文标签一一对应,是归档的主干结构:
| 字段 key | 中文标签 | 典型内容 |
|---|---|---|
style |
画风 (Style) | 模型 / LoRA 触发词、画风描述、质感与光线风格(如 anime style、watercolor、cinematic lighting) |
character |
人物 (Character) | 身份、外貌、体型、服装、配饰、表情 |
action |
动作 (Action) | 姿态、朝向、交互动作(如 sitting、looking at viewer、holding cup) |
environment |
环境 (Environment) | 场景、背景、场景光(如 indoors、bedroom、candlelight) |
composition |
构图 (Composition) | 景别、机位、画幅权重(如 (full body:2)、upper body、from below) |
每条记录同时保存 prompts(英文原文)与 translations(中文翻译)两组同结构对象。
关于「标签分类」:这里的「分类」指上述五个固定维度,属于结构化字段,不是可自由增删的标签系统——没有自定义标签、也没有按标签筛选的 UI。检索走的是全文关键词匹配。
| 层面 | 选型 | 说明 |
|---|---|---|
| 框架 | React 19 | 函数组件 + Hooks,StrictMode 挂载 |
| 语言 | TypeScript 5.8 | target ES2022、moduleResolution: bundler、jsx: react-jsx;路径别名 @/* → 项目根 |
| 构建 | Vite 6 | @vitejs/plugin-react;开发端口 3000、--host=0.0.0.0 |
| 样式 | Tailwind CSS 4 | 走 @tailwindcss/vite 插件(CSS-first,无 tailwind.config.js),入口仅 @import "tailwindcss"; |
| 存储 | localforage 1.10 | 对 IndexedDB 的 Promise 化封装,自动降级 |
| 表格 | ExcelJS 4.4 | 读写 .xlsx,生成图片锚点;浏览器端动态加载 |
| 下载 | file-saver 2.0 | 触发浏览器「另存为」 |
| 图标 | lucide-react | 全部 UI 图标 |
| 其他 | uuid 14、clsx + tailwind-merge | 记录 ID 生成;cn() 类名合并工具 |
依赖说明:package.json 里还声明了 @google/genai、express、dotenv、motion,但这四个包在 src/ 中零引用——它们来自项目最初的 Google AI Studio 模板脚手架,属于历史残留(详见已知限制)。本项目的运行时依赖只有上表所列。
| 项目 | 要求 |
|---|---|
| Node.js | 18+(推荐 20 / 22 LTS;@types/node 按 22 声明) |
| 包管理器 | npm(仓库含 package-lock.json) |
| 浏览器 | 任意支持 IndexedDB 的现代浏览器(Chrome / Edge / Firefox / Safari) |
# 1. 克隆
git clone https://github.com/kuroshio4396/ComfyUI-.git
cd ComfyUI-
# 2. 安装依赖
npm install
# 3. 启动开发服务器(默认 http://localhost:3000)
npm run dev| 命令 | 作用 |
|---|---|
npm run dev |
启动 Vite 开发服务器,端口 3000,监听 0.0.0.0(局域网可访问) |
npm run build |
生产构建,产物输出到 dist/ |
npm run preview |
本地预览构建产物 |
npm run lint |
类型检查(tsc --noEmit,只查不产出) |
npm run clean |
清理 dist(rm -rf,Windows cmd 下不可用,请用 Git Bash / WSL 或手动删除) |
不需要任何环境变量。 项目不调用任何外部 API。
仓库里的 .env.example 是 AI Studio 模板遗留,里面的 GEMINI_API_KEY / APP_URL 对本项目无效,无需配置(.gitignore 已忽略 .env*,仅保留 .env.example)。
所有记录存在浏览器的 IndexedDB 里,由 localforage 挂载:
| 项 | 值 |
|---|---|
| 数据库名 | ComfyUI_Archive |
| 对象仓库 | items |
| 主键 | id(uuid v4 字符串) |
| 读取顺序 | getAll() 后按 createdAt 倒序排列(最新在最前) |
单条记录结构(定义见 src/types.ts):
interface ComfyItem {
id: string;
image?: string; // dataURL,形如 data:image/png;base64,...
prompts: { // 五大类英文原文
style: string; character: string; action: string;
environment: string; composition: string;
};
translations: { // 五大类中文翻译(同结构)
style: string; character: string; action: string;
environment: string; composition: string;
};
translation?: string; // 历史遗留:旧的单字段翻译,仅作兼容读取
createdAt: number; // 毫秒时间戳
updatedAt: number;
}-
数据跟着「域名 + 浏览器配置」走,不跟着代码走。
http://localhost:3000、https://comfy-ui-indol.vercel.app、以及任何预览域名,各自是互相隔离的存储。在线演示站里新增的记录,本地开发环境看不到;换浏览器、换浏览器用户配置同样看不到。 -
清浏览器数据 = 数据全没。 「清除浏览数据 → Cookie 及其他网站数据」会连同 IndexedDB 一起清掉。无痕 / 隐私模式下关闭窗口即丢失。这个项目没有云端、没有账号、没有服务端备份——唯一可靠的备份手段就是「导出 XLSX」,建议养成定期导出、并把文件放到别处(网盘 / 移动硬盘)的习惯。
-
图片以 base64 存在数据库里,体积会膨胀。 base64 编码相对原始二进制约有 33% 的体积膨胀,浏览器对单站点 IndexedDB 通常给到「可用磁盘空间的一定比例」的配额。图片多、图大时可能触达配额(表现为保存静默失败或报错)。建议:归档用压缩后的预览图,原始大图仍留在输出目录里。
这是本项目最重要的数据出入口——它既是备份格式,也是批量编辑格式。
点右上角「导出 XLSX」,产物文件名固定为 ComfyUI_Prompts_Archive.xlsx,工作表名 Prompts Archive。
列结构(共 12 列):
| 列 | 表头 | 内容 |
|---|---|---|
| A | ID (勿改) |
记录主键,宽 36 |
| B | 图片 (Image) |
图片锚点列(无文本值),缩略图以 90×90 嵌入此列 |
| C / D | 画风 (Style) / 画风翻译 (Style CN) |
|
| E / F | 人物 (Character) / 人物翻译 (Character CN) |
|
| G / H | 动作 (Action) / 动作翻译 (Action CN) |
|
| I / J | 环境 (Environment) / 环境翻译 (Environment CN) |
|
| K / L | 构图 (Composition) / 构图翻译 (Composition CN) |
实现要点:
- 每个数据行行高设为
100,为缩略图留出空间; - 图片用
worksheet.addImage()+editAs: 'oneCell'锚定,随单元格移动缩放; - 图片扩展名从 dataURL 的 MIME 自动识别(
png/jpeg/webp等); exceljs与file-saver通过await import()动态加载(首次导出会有一次加载耗时,属正常)。
点右上角「导入 XLSX」选择文件,处理逻辑:
- 读第一个工作表;
- 先扫描所有嵌入图片,按「图片左上角所在行」建立
行号 → base64映射(ExcelJS 的行号是 0 基,与数据行号之间差 1,代码里已做折算); - 读第 1 行表头,建立「表头文本 → 列号」映射;
- 校验
ID (勿改)列是否存在,缺失直接报错:未找到 "ID (勿改)" 列,请确保导入的Excel格式正确。; - 从第 2 行开始遍历:
- ID 为空的行直接跳过(
if (!id) continue;); - 按 ID 查库:命中则更新,未命中则新建;
- 图片:优先用本次导入文件里的图,没有则保留库里原有的图;
createdAt沿用原记录的,updatedAt刷成当前时间(保证排序稳定);- 中文翻译列兼容历史表头
中文翻译(作为画风翻译的兜底);
- ID 为空的行直接跳过(
- 完成后
alert('导入成功!')并刷新列表;文件输入框会被重置,因此同一个文件可以连续导入两次。
这一点最容易踩坑:
- 导入只做 upsert,不删除。Excel 里删掉的行,库里依然存在——要删记录请在界面上点「删除」。
- 导入不会自动创建新记录,除非你在 Excel 里手工填一个不重复的 ID。所以正确的新增姿势仍然是:在界面上点「新增归档」,让应用生成 uuid。
- 表头文字是精确匹配的(
cell.text.trim()),改列名会导致该列读成空字符串,请勿改动第 1 行。 translation(历史遗留的单字段翻译)不参与导出,因此老的记录在「导出 → 导入」往返后,该字段会丢失。由于现在的界面已完全改用分栏翻译,实际影响可忽略。
① 应用内新增记录(生成 ID)
↓
② 导出 XLSX ← 这就是完整备份
↓
③ 在 Excel 里批量修改文本 / 调整翻译(不要改 A 列表头和 ID)
↓
④ 导入 XLSX → 按 ID 覆盖更新,图片与创建时间保留
ComfyUI-/
├── index.html # 入口 HTML(Vite 挂载点)
├── metadata.json # AI Studio 描述文件(模板遗留)
├── package.json # 依赖与脚本
├── package-lock.json
├── tsconfig.json # TS 配置(含 @/* 路径别名)
├── vite.config.ts # Vite 配置(react + tailwindcss 插件)
├── .env.example # 模板遗留,本项目无需环境变量
├── .gitignore
├── assets/
│ └── .aistudio/ # AI Studio 产物占位目录
└── src/
├── main.tsx # 应用入口,createRoot + StrictMode
├── App.tsx # 主体:顶栏 / 搜索 / 列表 / 模态框编排 + Excel 导入导出
├── types.ts # Prompts 与 ComfyItem 类型定义
├── index.css # Tailwind 入口 + 自定义滚动条样式
├── lib/
│ ├── db.ts # localforage 实例与 CRUD 封装
│ └── utils.ts # cn() 类名合并、fileToBase64()
└── components/
├── PromptRow.tsx # 单条记录卡片(图片 + 分类详情 + 折叠/编辑/删除)
└── PromptModal.tsx # 新增/编辑弹窗(图片 | EN | CN 三栏)
分层约定
lib/db.ts是唯一的数据访问层,组件不直接碰 localforage;换存储后端(比如接云同步)只需要改这一个文件。- Excel 逻辑集中在
App.tsx的handleExportExcel/handleImportExcel两个函数里,没有拆出去——因为它是「读全量列表 + 写库」的应用级操作,不是某个组件的能力。 db.items.clear()已实现但未接线:目前没有任何 UI 按钮会调用它(没有「清空全部」功能)。
本项目构建产物是纯静态文件,可以直接丢给任何静态托管。
- 在 Vercel 新建项目并导入本仓库;
- Framework Preset 选 Vite(Vercel 一般会自动识别),构建命令
npm run build,输出目录dist; - 无需配置环境变量,直接 Deploy。
仓库中没有 vercel.json——完全依赖 Vercel 对 Vite 的自动识别,不需要重写规则(应用是单页且没有前端路由)。
Netlify / Cloudflare Pages / GitHub Pages / 任意对象存储,配置同上:构建 npm run build、发布 dist/。
⚠️ 用 GitHub Pages 之类的子路径部署时,需要在vite.config.ts里额外设置base: '/<仓库名>/',否则静态资源 404。
- 界面默认只看两类:列表行默认折叠,只显示「画风」和「人物」。要核对动作 / 环境 / 构图,点该行的「展开」。搜索命中时并不自动展开——命中在折叠区里时记得点一下。
- 空分类会自动隐藏:某个分类的中英文都为空时,那一格根本不渲染,卡片会自动变紧凑。
- 搜索是「全字段模糊匹配」:5 类英文 + 5 类中文 + 历史翻译字段拼成一个长字符串做子串匹配,所以搜
indoor会命中环境里含indoors的记录,搜中文同理。没有按分类限定搜索、没有 AND / OR 逻辑。 - 图片建议用压缩后的预览图:归档的价值在提示词与视觉对照,不在像素级复现。用压缩图能显著减小导出的 XLSX 体积和 IndexedDB 占用。
- 弹窗里可以先只填画风:保存没有必填校验,允许留空(列表会显示「无提示词记录」)。建议至少填画风 + 人物,否则这张图在检索里几乎没有辨识度。
- 同一张图的多版本记得分开存:比如同一张图在「短标签」和「自然语言长句」两种风格下各有一版提示词,它们是两条独立记录——分别新增即可,ID 不同,互不覆盖。
- 定期导出 XLSX:这是唯一的持久化备份手段(见数据存储)。
新增的记录刷新页面就没了?
先确认三件事:
- 是不是换了地址?
localhost:3000与线上域名是两个独立的存储空间,互不可见。 - 是不是无痕 / 隐私模式? 关闭窗口即清空,属于浏览器行为,非应用问题。
- 是不是清了浏览数据? 清除「Cookie 及其他网站数据」会一并删掉 IndexedDB。
如果三者都不是,打开 DevTools → Application → IndexedDB,看 ComfyUI_Archive → items 里有没有数据。若数据在、列表却不显示,检查 App.tsx 的 loadData() 是否报错(控制台会打印 Failed to load data)。
导入 XLSX 报「未找到 "ID (勿改)" 列」
导入用的是第 1 行表头文本的精确匹配。常见原因:
- 表头被手动改过(比如把
ID (勿改)改成了ID)——改回去即可; - 文件是别的工具导出的、字段名不同;
- 数据不在第一个工作表里。
请始终基于本应用「导出 XLSX」产出的文件做修改,切勿改第 1 行。
导入后 Excel 里删掉的行还在?
符合预期。导入是按 ID 合并(upsert),不做删除。要删除记录请在界面上用每行的「删除」按钮(需二次确认)。详见导入语义。
导入后图片没了 / 图片串行了?
图片是按「嵌入图片左上角所在行」映射到数据行的。如果:
- 图片是从别的表格复制粘贴进来的,锚点可能落在非数据行(比如表头行或空白行);
- 手动拖拽过图片、或把图片设成了「随单元格移动并调整大小」以外的锚定方式;
- 数据行被整体上移 / 下移(插行、删行)而图片锚点没跟着走。
图片缺失时应用会保留库中原有图片,所以最坏情况是「图片没更新」而不是「图片被清空」。稳妥做法:只在导出的原文件上改文本单元格,不要动图片和数据行的相对位置。
图片上传后没反应 / 提示「图片加载失败」
handleImageUpload 用 FileReader.readAsDataURL() 读文件,失败会 alert("图片加载失败")。可能原因:
- 文件不是浏览器能解码的图片格式;
- 文件过大或位于异常的存储位置,读取被中断。
先用系统看图器确认图片能正常打开,再试一次。考虑到 IndexedDB 配额,不建议上传几 MB 以上的原图。
保存记录后列表没更新?
保存链路是:PromptModal 提交 → App.handleSaveItem → db.items.set() → loadData() 重新读全量并刷新。因为是写入后重读,正常情况下一定会刷新。
如果确实没变,看控制台是否有 IndexedDB 写入异常——配额超限是最常见的原因(典型场景:库里已经存了大量大图)。此时先「导出 XLSX」把数据保出来,再删掉部分记录或换用压缩图。
导出的 XLSX 打不开 / 图片显示不全?
- 文件是标准
.xlsx(OOXML),Excel、WPS、LibreOffice、Numbers 均可打开; - 行高固定 100 px、图片固定 90×90,图片不会随缩放自适应;
- 若某些记录的图片本身缺失(
image为空),那一行就只没有图,属正常。
可以把数据同步到多台设备吗?
当前版本不支持自动同步(没有云端、没有账号)。可行的方式是手动搬运:
- 在 A 设备「导出 XLSX」;
- 把文件传到 B 设备;
- 在 B 设备打开同一地址,「导入 XLSX」。
注意导入是合并更新,两边都新增过记录时会双向合并不了——导入只会覆盖同 ID 的记录,不会把 A 的独有记录删掉,但也不会因为 B 有而消失。稳妥做法是固定用一台设备做「主库」,只在主库上编辑。
为什么包里有 express / @google/genai 这些没用的依赖?
来自项目最初的 Google AI Studio 模板脚手架,src/ 中零引用。属历史残留,可以安全移除(见已知限制与待办)。
构建时提示 Node 版本过低?
Vite 6 需要 Node 18+,推荐 20 / 22 LTS。用 node -v 确认版本,必要时用 nvm / fnm 切换。
这是本项目的一个卖点,值得单独说清:
- 没有服务端。 数据不经过任何服务器,不存在「上传到我们这里」这一步。
- 没有任何业务网络请求。 应用代码不调用外部 API(连 AI 调用都没有),没有统计分析、没有遥测。
- 数据落在本机浏览器的 IndexedDB 里,路径由浏览器管理(例如 Chrome / Edge 在用户配置目录下的
IndexedDB/中)。 - 唯一的对外数据出口是你主动触发的「导出 XLSX」,写入的是浏览器下载目录。
因此:
- 断网也能完整使用;
- 敏感提示词不会外泄,但也意味着没有团队共享能力——要分享请导出发文件;
- 反面提醒:本机浏览器配置目录里会存在明文提示词与图片。如果这台机器是共享的,或使用了会同步浏览器数据的账号(如 Edge 同步),请自行评估。
若部署到公网域名,任何访问该域名的人都会拿到同一份前端代码,但各自看到的是自己浏览器里的数据库——前一个访客的记录不会出现在后一个访客的页面上。
以下是当前版本真实存在的问题,如实记录:
- 无云端同步 / 无账号:仅本机浏览器可用,换设备靠 XLSX 搬运。
- 无「清空全部」按钮:
db.items.clear()已在lib/db.ts中实现,但没有任何 UI 调用它。 - 无批量操作:不支持多选删除、批量导出选中项、批量改分类。
- 无排序与筛选控件:列表恒按
createdAt倒序;不能按分类筛、不能按时间范围筛。 - 无自定义标签:只有五个固定分类字段,不支持自由标签。
- 无必填校验:可以保存完全为空的记录。
- 无撤销:删除后不可恢复(除从 XLSX 备份导入)。
- 搜索无高级语法:纯子串匹配,不支持多关键词 AND/OR 或按字段限定。
| 位置 | 问题 | 建议 |
|---|---|---|
index.html |
<title> 仍是 My Google AI Studio App,lang="en" 而界面是中文 |
改为 ComfyUI 提示词归档助手、lang="zh-CN";这也会改变浏览器标签页标题与线上站点标题 |
package.json |
name: "react-example"、version: "0.0.0" |
改成真实项目名与初始版本号 |
package.json |
@google/genai、express、dotenv、motion 零引用 |
移除;@types/express 同步移除。注意 @types/exceljs@^0.5.3 版本远低于 exceljs@^4.4.0,也建议一并复查 |
package.json |
lint 仅 tsc --noEmit,无 ESLint / Prettier |
如需可补 |
package.json |
clean: "rm -rf dist server.js" |
引用的 server.js 并不存在;且 rm -rf 在 Windows cmd 下不可用,建议换 rimraf |
.env.example |
声明 GEMINI_API_KEY / APP_URL,本项目完全用不到 |
删除该文件或改写为说明「无需环境变量」 |
metadata.json |
含 MAJOR_CAPABILITY_SERVER_SIDE_GEMINI_API,与实际能力不符 |
删除该字段 |
assets/.aistudio/ |
模板占位空目录 | 可删 |
src/components/PromptRow.tsx |
PromptRowProps 里声明了 key?: React.Key,属无用字段(key 由 React 自身处理,不应出现在 props 类型里) |
移除 |
- 仓库没有 LICENSE 文件(见下)。
当前仓库未包含 LICENSE 文件,因此按默认版权规则处理:保留所有权利(All rights reserved)。
如果你希望以开源许可证分发,推荐在仓库根目录直接添加文件:
- 进入仓库页 → Add file → Create new file;
- 文件名填
LICENSE(GitHub 会识别并提供右侧模板选择); - 选择协议(如 MIT、Apache-2.0)→ 提交;
- 顺手把本 README 顶部与本节更新为对应协议。
在此之前,请勿将本项目代码用于再分发。
- 感谢 ComfyUI —— 让提示词值得被归档;
- 感谢 localforage、ExcelJS、lucide 等开源项目;
- 项目脚手架最初由 Google AI Studio 生成,后经改造为纯本地归档工具。
图会忘,提示词不会——只要你把它存下来。