skill-forge-hub 0.5.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
SkillForge(技能锻造坊)npm 包 `skill-forge-hub`(命令名 `skill-forge`)版本变更记录。
|
|
4
4
|
|
|
5
|
+
## 0.5.3(2026-11-11)
|
|
6
|
+
|
|
7
|
+
**锦囊数据目录正名:cache/ → data/**
|
|
8
|
+
|
|
9
|
+
- DATA_DIR 默认值 `cache` → `data`(语义正名:目录放的是全量数据不是缓存,缓存语义留给将来真正的过程性缓存);CONFIG_VERSION v3 → v4
|
|
10
|
+
- 页面读侧三级兜底:`data/prompts.json` → 旧默认 `cache/prompts.json` → 根目录旧平铺文件;写侧一律写 `data/`;页面文案全部同步
|
|
11
|
+
- 升级迁移:AI 发现 v3 旧默认 cache/ 目录 → 备份后改名迁移为 data/ 并告知用户(用户显式自定义目录名则尊重不动)
|
|
12
|
+
|
|
13
|
+
## 0.5.2(2026-11-11)
|
|
14
|
+
|
|
15
|
+
**锦囊 mono 主题换装 JetBrains Darcula**
|
|
16
|
+
|
|
17
|
+
- 从「Linear 式纯黑」改为 Darcula 官方色板:背景 `#2b2b2b` / 面板 `#3c3f41` / 卡片渐变 `#313335` / 正文蓝灰 `#a9b7c6` / 边框 `#4e5254`——深灰底 + 蓝灰字 + 灰阶面板,与 JetBrains IDE 观感一致,久看不累
|
|
18
|
+
- 组件适配全面蓝灰化:魔法棒/图标滤镜、标签、星标、弹层、输入区、卡片内描边与 hover 描边、换肤坞色点
|
|
19
|
+
- 主题名同步:「极简黑白」→「Darcula 深灰蓝」(SKILL.md / user-config.md / usage-guide.md / 换肤坞 title)
|
|
20
|
+
|
|
5
21
|
## 0.5.1(2026-11-11)
|
|
6
22
|
|
|
7
23
|
**自检闭环补全**(交付前硬门禁,四技能全覆盖)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skill-forge-hub",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"description": "SkillForge (技能锻造坊) — a curated collection of AI craft skills. Install once, then pick skills interactively: daily/weekly/annual reports, article-to-HTML, magic-deck slides, deck-stage PPTX, prompt-pouch manager, Pandoc doc converters, meta-forge.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"skill-forge": "cli.js"
|
package/prompt-pouch/SKILL.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
name: prompt-pouch
|
|
3
3
|
description: >
|
|
4
4
|
锦囊(prompt-pouch)提示词管理 Skill:生成并维护一个本地 HTML 提示词管理页面(锦囊管理台),
|
|
5
|
-
|
|
5
|
+
暖棕金/深蓝科技/Darcula 深灰蓝/薄荷绿四套主题(右下角换肤坞随时切换,THEME 配置可设默认),功能为分组侧栏(带计数徽章)+ 搜索(关键词高亮)+ 卡片网格 + 四种排序(最新添加默认/最近使用/使用频率/手动,
|
|
6
6
|
拖拽与 ▲▼ 自动切手动)+ 使用统计 + 收藏星标 + {变量} 插值填充面板 + 一键复制 + 卡片「👁 详情」弹窗
|
|
7
|
-
(全文滚动查看 / 复制 / 修改 / 创建修改时间线);数据存 <DIR>/
|
|
7
|
+
(全文滚动查看 / 复制 / 修改 / 创建修改时间线);数据存 <DIR>/data/prompts.json(DATA_DIR 可配),
|
|
8
8
|
页面与数据严格分离,双笔协作(页面经授权目录直写,AI 代笔维护)。三类任务:①初始化——目标目录无页面时确认目录(默认用户配置 DIR)
|
|
9
|
-
并生成 prompt-pouch.html(样式真相源为 resources/reference.html,原样复制)与
|
|
9
|
+
并生成 prompt-pouch.html(样式真相源为 resources/reference.html,原样复制)与 data/prompts.json
|
|
10
10
|
(默认示例五组:写作输出/沟通协作/规划执行/复盘成长/提问艺术,每条带 createdAt;页面另内置同款示例种子 DEFAULT_POUCH,prompts.json 读不到时兜底展示);②维护——按用户口述增删改提示词与分组、调整排序、
|
|
11
11
|
切换收藏,读写 prompts.json(UTF-8、2 空格缩进),用户刷新页面即见;③打开——用户说「打开锦囊」时
|
|
12
12
|
起本地服务并按平台打开浏览器访问管理页面。
|
|
@@ -62,14 +62,14 @@ disable-model-invocation: false
|
|
|
62
62
|
|
|
63
63
|
**执行本 skill 前必须先 Read 同目录 `user-config.md`**:目录(DIR/DIR_WIN)、端口(PORT)、初始化数据(INIT_DATA)、确认开关(CONFIRM)、主题(THEME)等默认配置都在该文件中,以它为准。升级技能时 user-config.md 不会被覆盖,你的修改永久保留。
|
|
64
64
|
|
|
65
|
-
**THEME 主题机制**:页面内置四套主题——gold 暖棕金(默认)/ tech 深蓝科技 / mono
|
|
65
|
+
**THEME 主题机制**:页面内置四套主题——gold 暖棕金(默认)/ tech 深蓝科技 / mono Darcula 深灰蓝(JetBrains IDE 同款观感)/ mint 薄荷绿。初始化复制 reference.html 后,将 html 根标签 `data-theme` 属性值设为配置 `THEME`(仅此一处修改);页面右下角「换肤坞」色点可随时切换主题,选择经浏览器 localStorage 持久(key: sf-pouch-theme),刷新后保持;localStorage 优先级高于根标签 data-theme。已初始化的页面改配置 THEME 不追溯——用户手动换过主题即以其选择为准。
|
|
66
66
|
|
|
67
|
-
**配置版本机制(升级保护)**:user-config.md 头部 `CONFIG_VERSION` 标识结构版本。升级 skill 后若发现新版本结构(如 v2 新增 THEME 字段)而用户配置是旧版:先备份旧配置为 `user-config.md.bak-时间戳`,将旧值迁移进新结构(保留用户已有 DIR/PORT/INIT_DATA/CONFIRM,缺失字段补默认值),更新 CONFIG_VERSION,最后用一句话告知用户配置已升级、旧文件备份在哪。 **无法迁移项处理**(值域失效 / 语义漂移 / 数据不兼容):三绝不——绝不静默(无法迁移项停下问,不猜值)、绝不丢失(旧值永远在备份)、一次说清(升级报告三段式:⚠️ 版本与备份路径 / ✅ 已自动迁移 / 🟡 无法迁移项逐条附原因+影响+建议替代);随后 AskUserQuestion 三选项(A 用建议值 / B 用户给新值 / C 保持旧配置——不更新 CONFIG_VERSION,每次执行再提醒);报告必附回滚一句话;数据文件(prompts.json)迁移前先复制 .bak-时间戳,能映射则映射、不能则写兼容层(旧 id 兼容保留即范例)或留备份提示手动整理
|
|
67
|
+
**配置版本机制(升级保护)**:user-config.md 头部 `CONFIG_VERSION` 标识结构版本。升级 skill 后若发现新版本结构(如 v2 新增 THEME 字段)而用户配置是旧版:先备份旧配置为 `user-config.md.bak-时间戳`,将旧值迁移进新结构(保留用户已有 DIR/PORT/INIT_DATA/CONFIRM,缺失字段补默认值),更新 CONFIG_VERSION,最后用一句话告知用户配置已升级、旧文件备份在哪。v4 特例:用户配置 DATA_DIR: cache(v3 旧默认、非用户显式自定义)→ 目录改名 cache→data(先复制 .bak-时间戳)并同步更新配置值;用户显式自定义过其它目录名则尊重其选择不动。 **无法迁移项处理**(值域失效 / 语义漂移 / 数据不兼容):三绝不——绝不静默(无法迁移项停下问,不猜值)、绝不丢失(旧值永远在备份)、一次说清(升级报告三段式:⚠️ 版本与备份路径 / ✅ 已自动迁移 / 🟡 无法迁移项逐条附原因+影响+建议替代);随后 AskUserQuestion 三选项(A 用建议值 / B 用户给新值 / C 保持旧配置——不更新 CONFIG_VERSION,每次执行再提醒);报告必附回滚一句话;数据文件(prompts.json)迁移前先复制 .bak-时间戳,能映射则映射、不能则写兼容层(旧 id 兼容保留即范例)或留备份提示手动整理
|
|
68
68
|
|
|
69
69
|
## 核心约束
|
|
70
70
|
|
|
71
71
|
- **页面与数据分离**:HTML 不内嵌用户数据——一切用户数据只进 <DATA_DIR>/prompts.json;HTML 内置只读示例种子(DEFAULT_POUCH 五组 15 条),仅当 prompts.json 读不到且浏览器无缓存快照时兜底展示(file:// 直开也能看到示范数据),一旦读到 prompts.json 即以文件为准;样式升级只改仓库 reference.html 后重新复制到目标目录(用户数据不受影响)
|
|
72
|
-
- **目录结构(
|
|
72
|
+
- **目录结构(v4)**:数据文件默认 `<DIR>/<DATA_DIR>/prompts.json`(默认 data/,v4 起语义正名——目录放的是全量数据不是缓存),自动备份默认 `<DIR>/<BACKUP_DIR>/`(默认 backup/,pouch-backup.json + .prev.json 滚动双备份);页面读侧三级兜底(data/ → 旧默认 cache/ → 根目录旧平铺文件),写侧一律写新路径;AI 初始化/维护时发现旧结构(v3 默认 cache/ 目录、或根目录平铺 prompts.json / pouch-backup*.json)→ 迁移为 data/ 结构(迁移前先复制 .bak-时间戳),一句话告知用户
|
|
73
73
|
- **双笔协作**:页面(授权目录时)与 AI 都可写 prompts.json——页面上有「+ 新增提示词 / ✎ / 🗑 / 分组管理」表单直写;AI 落盘前必须重读最新文件再合并写回(见「页面双笔纪律」)
|
|
74
74
|
- **prompts.json 结构必须合法**:写回前自查 schema(version/groups[]/prompts[] 各字段齐全、group 引用存在、order 连续)
|
|
75
75
|
- **排序四模式**:页面顶栏切换「最新添加(默认,按 createdAt 倒序)/ 最近使用 / 使用频率 / 手动顺序」;最近使用与使用频率由页面在复制时自动统计(浏览器本地态,AI 不落盘);用户在非手动模式下拖动卡片或点 ▲▼ 会自动切回手动顺序、点卡片 ⇄ 可把提示词移到其它分组——用户随后粘贴「复制变更指令」,AI 必须按指令落盘:先执行「分组调整」节(改各条 group),再按「各组顺序」节每组列出的顺序重写各条 `order`,写回后提醒用户刷新并点页面「✓ 已落盘」清除标记
|
|
@@ -30,34 +30,34 @@
|
|
|
30
30
|
--btn-ink:#041018;
|
|
31
31
|
--bar-hi:rgba(10,25,41,.96); --bar-lo:rgba(10,25,41,.88);
|
|
32
32
|
}
|
|
33
|
-
/* ═══ mono
|
|
33
|
+
/* ═══ mono 深灰蓝:JetBrains Darcula 色系(深灰底 + 蓝灰文字 + 灰阶面板,IDE 同款观感) ═══ */
|
|
34
34
|
[data-theme="mono"]{
|
|
35
|
-
--bg:#
|
|
36
|
-
--panel:#
|
|
37
|
-
--text:#
|
|
38
|
-
--gold:#
|
|
39
|
-
--border
|
|
40
|
-
--tag-bg
|
|
41
|
-
--star:#
|
|
42
|
-
--glow:rgba(
|
|
43
|
-
--btn-ink:#
|
|
44
|
-
--bar-hi:rgba(
|
|
35
|
+
--bg:#2b2b2b; --bg2:#313335;
|
|
36
|
+
--panel:#3c3f41; --panel2:#313335;
|
|
37
|
+
--text:#a9b7c6; --muted:#808080;
|
|
38
|
+
--gold:#a9b7c6; --gold2:#6b7280; --gold-dim:rgba(169,183,198,.12);
|
|
39
|
+
--border:#4e5254;
|
|
40
|
+
--tag-bg:#3c3f41;
|
|
41
|
+
--star:#d7dce3;
|
|
42
|
+
--glow:rgba(169,183,198,.18);
|
|
43
|
+
--btn-ink:#2b2b2b;
|
|
44
|
+
--bar-hi:rgba(43,43,43,.96); --bar-lo:rgba(43,43,43,.88);
|
|
45
45
|
}
|
|
46
|
-
/* mono
|
|
47
|
-
[data-theme="mono"] .lg{ filter:grayscale(1) brightness(.
|
|
46
|
+
/* mono 深灰蓝组件适配:魔法棒灰化、蓝灰标签、浅蓝灰星标、深灰弹层、输入区微亮蓝灰、色点蓝灰描边 */
|
|
47
|
+
[data-theme="mono"] .lg{ filter:grayscale(1) brightness(.45); }
|
|
48
48
|
[data-theme="mono"] .nav-item .icon,
|
|
49
|
-
[data-theme="mono"] .search .kw{ filter:grayscale(1) brightness(1.
|
|
50
|
-
[data-theme="mono"] .tpl-badge{ color:#
|
|
51
|
-
[data-theme="mono"] .op.star-on{ color:#
|
|
52
|
-
[data-theme="mono"] .gpop{ background:#
|
|
49
|
+
[data-theme="mono"] .search .kw{ filter:grayscale(1) brightness(1.15); }
|
|
50
|
+
[data-theme="mono"] .tpl-badge{ color:#a9b7c6; background:rgba(169,183,198,.14); }
|
|
51
|
+
[data-theme="mono"] .op.star-on{ color:#d7dce3; border-color:rgba(169,183,198,.45); background:rgba(169,183,198,.16); }
|
|
52
|
+
[data-theme="mono"] .gpop{ background:#3c3f41; border-color:#4e5254; box-shadow:0 12px 32px rgba(0,0,0,.6); }
|
|
53
53
|
[data-theme="mono"] .fp-preview,
|
|
54
54
|
[data-theme="mono"] .fp-field input,
|
|
55
55
|
[data-theme="mono"] .fp-field textarea,
|
|
56
56
|
[data-theme="mono"] .fp-field select,
|
|
57
57
|
[data-theme="mono"] .fp-live textarea,
|
|
58
58
|
[data-theme="mono"] .bk-item,
|
|
59
|
-
[data-theme="mono"] .detail-content{ background:rgba(
|
|
60
|
-
[data-theme="mono"] .theme-dock .th-dot[data-theme="mono"]{ border:1.5px solid rgba(
|
|
59
|
+
[data-theme="mono"] .detail-content{ background:rgba(169,183,198,.07); }
|
|
60
|
+
[data-theme="mono"] .theme-dock .th-dot[data-theme="mono"]{ border:1.5px solid rgba(169,183,198,.55); }
|
|
61
61
|
[data-theme="mint"]{ /* 薄荷绿 */
|
|
62
62
|
--bg:#0d1a12; --bg2:#12241a;
|
|
63
63
|
--panel:#182f22; --panel2:#1e3a2a;
|
|
@@ -197,8 +197,8 @@ main{ flex:1; min-width:0; }
|
|
|
197
197
|
cursor:grab; display:flex; flex-direction:column; gap:8px;
|
|
198
198
|
}
|
|
199
199
|
.card:hover{ transform:translateY(-3px); box-shadow:0 8px 24px rgba(0,0,0,.35); border-color:var(--glow); }
|
|
200
|
-
[data-theme="mono"] .card{ box-shadow:0 1px 0 rgba(
|
|
201
|
-
[data-theme="mono"] .card:hover{ box-shadow:0 10px 30px rgba(0,0,0,.55),0 0 0 1px rgba(
|
|
200
|
+
[data-theme="mono"] .card{ box-shadow:0 1px 0 rgba(169,183,198,.07) inset; }
|
|
201
|
+
[data-theme="mono"] .card:hover{ box-shadow:0 10px 30px rgba(0,0,0,.55),0 0 0 1px rgba(169,183,198,.14); }
|
|
202
202
|
.card.dragging{ opacity:.35; cursor:grabbing; }
|
|
203
203
|
.card.drop-target{ border-color:var(--gold); box-shadow:0 0 0 2px var(--gold-dim); }
|
|
204
204
|
.card-top{ display:flex; align-items:center; gap:8px; }
|
|
@@ -473,7 +473,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
473
473
|
.theme-dock .th-dot.on{ border-color:var(--text); }
|
|
474
474
|
.theme-dock .th-dot[data-theme="gold"]{ background:#e8b04b; }
|
|
475
475
|
.theme-dock .th-dot[data-theme="tech"]{ background:#0ea5e9; }
|
|
476
|
-
.theme-dock .th-dot[data-theme="mono"]{ background:#
|
|
476
|
+
.theme-dock .th-dot[data-theme="mono"]{ background:#2b2b2b; }
|
|
477
477
|
.theme-dock .th-dot[data-theme="mint"]{ background:#4ade80; }
|
|
478
478
|
@media print{ .theme-dock{ display:none; } }
|
|
479
479
|
</style>
|
|
@@ -517,7 +517,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
517
517
|
<button class="btn" id="btnMarkSaved" style="display:none" title="把指令交给 AI 落盘后点此清除未保存标记">✓ 已落盘</button>
|
|
518
518
|
</div>
|
|
519
519
|
<div class="bk-wrap" id="bkWrap">
|
|
520
|
-
<span class="cache-badge" id="cacheBadge" style="display:none">⚠️
|
|
520
|
+
<span class="cache-badge" id="cacheBadge" style="display:none">⚠️ 快照模式:data/prompts.json 读取失败,当前显示上次快照</span>
|
|
521
521
|
<button class="btn" id="btnBkEnable" style="display:none">💾 授权目录备份</button>
|
|
522
522
|
<span class="bk-status" id="bkStatus">本地快照备份中</span>
|
|
523
523
|
<button class="btn" id="btnBkChange" style="display:none">📂 换目录</button>
|
|
@@ -570,7 +570,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
570
570
|
<div class="fill-panel">
|
|
571
571
|
<div class="fp-head">
|
|
572
572
|
<div class="fp-title" id="itemTitle">新增提示词</div>
|
|
573
|
-
<span class="fp-count">落盘
|
|
573
|
+
<span class="fp-count">落盘 data/prompts.json · 刷新即见</span>
|
|
574
574
|
</div>
|
|
575
575
|
<div class="fp-fields">
|
|
576
576
|
<div class="fp-field"><label for="itemName">标题</label><input id="itemName" placeholder="如:日报速写" /></div>
|
|
@@ -590,7 +590,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
590
590
|
<div class="fill-panel" style="width:460px;">
|
|
591
591
|
<div class="fp-head">
|
|
592
592
|
<div class="fp-title" id="groupTitle">新建分组</div>
|
|
593
|
-
<span class="fp-count">落盘
|
|
593
|
+
<span class="fp-count">落盘 data/prompts.json · 刷新即见</span>
|
|
594
594
|
</div>
|
|
595
595
|
<div class="fp-fields">
|
|
596
596
|
<div class="fp-field"><label for="groupName">分组名</label><input id="groupName" placeholder="如:灵感" /></div>
|
|
@@ -635,7 +635,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
635
635
|
<div class="hp-grid">
|
|
636
636
|
<div class="hp-item">
|
|
637
637
|
<div class="hp-t">① 添加与修改</div>
|
|
638
|
-
<div class="hp-d">页面点 <b>「+ 新增提示词」/「👁 详情」/「✎」/「🗑」</b>(授权目录即写即存),或对 AI 说 <b>「把 XX 加到锦囊的写作输出分组」</b>,AI 写入
|
|
638
|
+
<div class="hp-d">页面点 <b>「+ 新增提示词」/「👁 详情」/「✎」/「🗑」</b>(授权目录即写即存),或对 AI 说 <b>「把 XX 加到锦囊的写作输出分组」</b>,AI 写入 data/prompts.json,刷新即见。</div>
|
|
639
639
|
</div>
|
|
640
640
|
<div class="hp-item">
|
|
641
641
|
<div class="hp-t">② 排序与移动</div>
|
|
@@ -643,7 +643,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
643
643
|
</div>
|
|
644
644
|
<div class="hp-item">
|
|
645
645
|
<div class="hp-t">③ 打开方式</div>
|
|
646
|
-
<div class="hp-d">HTTP 访问读
|
|
646
|
+
<div class="hp-d">HTTP 访问读 data/prompts.json;file:// 直开则回退到本地缓存快照。</div>
|
|
647
647
|
</div>
|
|
648
648
|
<div class="hp-item">
|
|
649
649
|
<div class="hp-t">④ 数据安全</div>
|
|
@@ -1232,17 +1232,20 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1232
1232
|
return writeBackupNow().then(function(){
|
|
1233
1233
|
return readPouch().then(function(text){
|
|
1234
1234
|
if (text) return JSON.parse(text);
|
|
1235
|
-
return fetch('
|
|
1235
|
+
return fetch('data/prompts.json', { cache: 'no-store' })
|
|
1236
1236
|
.then(function(r){ if (!r.ok) throw new Error('nf'); return r.json(); })
|
|
1237
1237
|
.catch(function(){
|
|
1238
|
-
return fetch('prompts.json', { cache: 'no-store' }).then(function(r2){ return r2.json(); });
|
|
1238
|
+
return fetch('cache/prompts.json', { cache: 'no-store' }).then(function(r2){ if (!r2.ok) throw new Error('nf'); return r2.json(); });
|
|
1239
|
+
})
|
|
1240
|
+
.catch(function(){
|
|
1241
|
+
return fetch('prompts.json', { cache: 'no-store' }).then(function(r3){ return r3.json(); });
|
|
1239
1242
|
})
|
|
1240
1243
|
.catch(function(){ return state.data; });
|
|
1241
1244
|
});
|
|
1242
1245
|
}).then(function(latest){
|
|
1243
1246
|
var next = op.apply(latest);
|
|
1244
1247
|
if (next === null) return false;
|
|
1245
|
-
return bkWrite('prompts.json', '
|
|
1248
|
+
return bkWrite('prompts.json', 'data', JSON.stringify(next, null, 2)).then(function(){
|
|
1246
1249
|
state.data = next;
|
|
1247
1250
|
applyUserState();
|
|
1248
1251
|
state.dirty = false; state.moves = [];
|
|
@@ -1251,7 +1254,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1251
1254
|
return true;
|
|
1252
1255
|
});
|
|
1253
1256
|
}).catch(function(){
|
|
1254
|
-
toast('写入
|
|
1257
|
+
toast('写入 data/prompts.json 失败,请检查目录授权', true);
|
|
1255
1258
|
return false;
|
|
1256
1259
|
});
|
|
1257
1260
|
});
|
|
@@ -1261,10 +1264,13 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1261
1264
|
if (!state.dirty || !bkDirHandle) return Promise.resolve();
|
|
1262
1265
|
return readPouch().then(function(text){
|
|
1263
1266
|
if (text) return JSON.parse(text);
|
|
1264
|
-
return fetch('
|
|
1267
|
+
return fetch('data/prompts.json', { cache: 'no-store' })
|
|
1265
1268
|
.then(function(r){ if (!r.ok) throw new Error('nf'); return r.json(); })
|
|
1266
1269
|
.catch(function(){
|
|
1267
|
-
return fetch('prompts.json', { cache: 'no-store' }).then(function(r2){ return r2.json(); });
|
|
1270
|
+
return fetch('cache/prompts.json', { cache: 'no-store' }).then(function(r2){ if (!r2.ok) throw new Error('nf'); return r2.json(); });
|
|
1271
|
+
})
|
|
1272
|
+
.catch(function(){
|
|
1273
|
+
return fetch('prompts.json', { cache: 'no-store' }).then(function(r3){ return r3.json(); });
|
|
1268
1274
|
})
|
|
1269
1275
|
.catch(function(){ return state.data; });
|
|
1270
1276
|
})
|
|
@@ -1275,7 +1281,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1275
1281
|
var m = byId[p.id];
|
|
1276
1282
|
if (m){ p.order = m.order; p.group = m.group; }
|
|
1277
1283
|
});
|
|
1278
|
-
return bkWrite('prompts.json', '
|
|
1284
|
+
return bkWrite('prompts.json', 'data', JSON.stringify(latest, null, 2)).then(function(){
|
|
1279
1285
|
state.data = latest;
|
|
1280
1286
|
applyUserState();
|
|
1281
1287
|
state.dirty = false; state.moves = [];
|
|
@@ -1674,11 +1680,14 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1674
1680
|
return h;
|
|
1675
1681
|
});
|
|
1676
1682
|
}
|
|
1677
|
-
/* 数据文件读:
|
|
1683
|
+
/* 数据文件读:data/prompts.json 优先,读不到回退旧默认 cache/,再回退根目录旧文件(结构兼容) */
|
|
1678
1684
|
function readPouch(){
|
|
1679
|
-
return bkRead('prompts.json', '
|
|
1685
|
+
return bkRead('prompts.json', 'data').then(function(text){
|
|
1680
1686
|
if (text !== null) return text;
|
|
1681
|
-
return bkRead('prompts.json')
|
|
1687
|
+
return bkRead('prompts.json', 'cache').then(function(text2){
|
|
1688
|
+
if (text2 !== null) return text2;
|
|
1689
|
+
return bkRead('prompts.json');
|
|
1690
|
+
});
|
|
1682
1691
|
});
|
|
1683
1692
|
}
|
|
1684
1693
|
/* 备份文件读:backup/ 优先,读不到回退根目录旧文件(旧目录结构兼容) */
|
|
@@ -1954,15 +1963,18 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1954
1963
|
render();
|
|
1955
1964
|
if (bootMode === 'cache') cacheBadge.style.display = '';
|
|
1956
1965
|
if (bootMode === 'demo'){
|
|
1957
|
-
cacheBadge.textContent = '📌 示例模式:未读到
|
|
1966
|
+
cacheBadge.textContent = '📌 示例模式:未读到 data/prompts.json,当前展示系统自带示例提示词(file:// 直开或数据文件尚未生成)。经 HTTP 打开页面并生成数据文件后即为你的提示词,示例可随时删除。';
|
|
1958
1967
|
cacheBadge.style.display = '';
|
|
1959
1968
|
}
|
|
1960
1969
|
}
|
|
1961
1970
|
// 数据优先:fetch 主链不依赖本地存储,页面尽快可见
|
|
1962
|
-
fetch('
|
|
1971
|
+
fetch('data/prompts.json', { cache: 'no-store' })
|
|
1963
1972
|
.then(function(r){ if (!r.ok) throw new Error('nf'); return r.json(); })
|
|
1964
1973
|
.catch(function(){
|
|
1965
|
-
return fetch('prompts.json', { cache: 'no-store' }).then(function(r2){ return r2.json(); });
|
|
1974
|
+
return fetch('cache/prompts.json', { cache: 'no-store' }).then(function(r2){ if (!r2.ok) throw new Error('nf'); return r2.json(); });
|
|
1975
|
+
})
|
|
1976
|
+
.catch(function(){
|
|
1977
|
+
return fetch('prompts.json', { cache: 'no-store' }).then(function(r3){ return r3.json(); });
|
|
1966
1978
|
})
|
|
1967
1979
|
.then(function(data){
|
|
1968
1980
|
state.data = data;
|
|
@@ -2031,7 +2043,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
2031
2043
|
<div class="theme-dock" id="themeDock">
|
|
2032
2044
|
<button class="th-dot" type="button" data-theme="gold" title="gold 暖棕金"></button>
|
|
2033
2045
|
<button class="th-dot" type="button" data-theme="tech" title="tech 深蓝科技"></button>
|
|
2034
|
-
<button class="th-dot" type="button" data-theme="mono" title="mono
|
|
2046
|
+
<button class="th-dot" type="button" data-theme="mono" title="mono Darcula 深灰蓝"></button>
|
|
2035
2047
|
<button class="th-dot" type="button" data-theme="mint" title="mint 薄荷绿"></button>
|
|
2036
2048
|
</div>
|
|
2037
2049
|
</body>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# 锦囊使用指南
|
|
2
2
|
|
|
3
|
-
锦囊(prompt-pouch)是一个本地 HTML
|
|
3
|
+
锦囊(prompt-pouch)是一个本地 HTML 提示词管理台:暖棕金默认配色,内置四套主题(暖棕金/深蓝科技/Darcula 深灰蓝/薄荷绿,右下角换肤坞随时切换),分组侧栏 + 搜索 + 卡片网格,妙计入囊、随取随用。页面与数据分离——页面可直写、AI 可代笔(双笔协作),你只管说,刷新即见。
|
|
4
4
|
|
|
5
5
|
## 怎么用
|
|
6
6
|
|
|
7
|
-
1. **打开页面**:对 AI 说「打开锦囊」即可(自动起服务并打开浏览器);手动方式:`cd <目录> && python3 -m http.server 8933`(Windows 用 `py -m http.server`),浏览器访问 `http://localhost:8933/prompt-pouch.html`(HTTP 方式才能读
|
|
7
|
+
1. **打开页面**:对 AI 说「打开锦囊」即可(自动起服务并打开浏览器);手动方式:`cd <目录> && python3 -m http.server 8933`(Windows 用 `py -m http.server`),浏览器访问 `http://localhost:8933/prompt-pouch.html`(HTTP 方式才能读 data/prompts.json;file:// 直开时回退浏览器缓存快照,无快照则展示内置示例提示词(仅作示范),不推荐日常使用)
|
|
8
8
|
2. **添加提示词**:页面点「+ 新增提示词」填表保存(已授权目录即写即存);或对 AI 说「把 XX 加到锦囊的写作输出分组」(不说分组也行,AI 会列出现有分组让你选;分组不存在时会问你是否新建)
|
|
9
9
|
3. **查看与修改**:卡片正文超长只显示前三行,点「👁 详情」弹窗看全文(超长限高滚动),弹窗内可直接「⧉ 复制」或「✎ 修改」,并附时间线——创建时间、上次修改时间(修改过才显示)、最近使用时间(用过才显示);卡片上也能直接点「✎」改完保存;或对 AI 说「修改锦囊里『日报速写』的内容」,改后刷新
|
|
10
10
|
4. **删除**:页面点卡片「🗑」;或对 AI 说「删掉锦囊里『XX』这条」
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
- **{变量} 插值**:内容含花括号占位(如「{功能名}」)的提示词,点复制会自动弹出填充面板,填入变量后实时预览再复制
|
|
19
19
|
- **自动备份(默认开启)**:数据一有变更 2 秒内自动备份——首次变更会请求授权写入 prompt-pouch.html 所在目录(弹窗选同目录即可,选一次后浏览器记住),写 backup/pouch-backup.json 并滚动保留上一版 .prev.json;未授权或浏览器不支持时自动降级为本地快照(浏览器内保留最近 5 份),页内「↩ 恢复」均可一键回滚;顶栏「📂 换目录」可随时重新配置备份目录
|
|
20
20
|
- **详情弹窗**:点卡片「👁 详情」弹出全文查看(超长内容限高 52vh 内滚动),带复制与修改入口,附时间线(创建 / 上次修改 / 最近使用);含 {变量} 的模板会在弹窗里标出变量清单,复制时自动进入填充面板
|
|
21
|
-
- **页面直写(双笔)**:页面增删改直接写入
|
|
21
|
+
- **页面直写(双笔)**:页面增删改直接写入 data/prompts.json(与自动备份共用同一目录授权);未授权时自动降级——生成操作指令复制到剪贴板,粘贴给 AI 落盘
|
|
22
22
|
- **侧栏局部滚动**:分组较多时,左侧「收藏 + 分组列表」区域独立滚动(窄滚动条),「全部」「+ 新建分组」「锦囊用法」固定不滚;窄屏下自动恢复平铺排列
|
|
23
23
|
- **批量整理入囊**:把一堆文字/文件交给 AI,或说「把最近对话框内容整理进锦囊」,AI 按现有分组归档、装不下的推荐新分组,你调整确认后一次性写入
|
|
24
24
|
- **四种排序**:最新添加(按添加时间倒序,全时间范围)/ 最近使用 / 使用频率 / 手动顺序;排序选择会自动记住,下次打开不变
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
|
|
29
29
|
## 提醒
|
|
30
30
|
|
|
31
|
-
- 数据在
|
|
31
|
+
- 数据在 data/prompts.json(备份在 backup/ 目录);迁移/备份复制 data/ 与 backup/ 两个目录即可
|
|
32
32
|
- 页面样式与脚本升级由仓库 reference.html 重新复制完成,不影响你的数据
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
CONFIG_VERSION:
|
|
1
|
+
CONFIG_VERSION: 4
|
|
2
2
|
|
|
3
3
|
# 页面与数据目录(prompt-pouch.html 与 prompts.json 的落盘处)
|
|
4
4
|
DIR: /Users/luzhaosheng/MyWork/prompt-pouch
|
|
5
5
|
DIR_WIN: %USERPROFILE%\prompt-pouch
|
|
6
6
|
|
|
7
|
-
# 本地预览端口(HTTP 方式访问
|
|
7
|
+
# 本地预览端口(HTTP 方式访问 data/prompts.json)
|
|
8
8
|
PORT: 8933
|
|
9
9
|
|
|
10
|
-
# 数据与备份子目录(相对 DIR;空串 = 平铺在 DIR
|
|
11
|
-
DATA_DIR:
|
|
10
|
+
# 数据与备份子目录(相对 DIR;空串 = 平铺在 DIR 根下,旧行为)。v4 起 DATA_DIR 默认 data(语义正名:目录放的是全量数据不是缓存;v3 及以前默认 cache)
|
|
11
|
+
DATA_DIR: data
|
|
12
12
|
BACKUP_DIR: backup
|
|
13
13
|
|
|
14
14
|
# 首次初始化数据:example = 示例五组(写作输出/沟通协作/规划执行/复盘成长/提问艺术,各职业通用);empty = 空结构
|
|
15
15
|
INIT_DATA: example
|
|
16
16
|
|
|
17
17
|
# 页面主题(初始化时写入页面根标签 data-theme;页面右下角换肤坞可随时切换)
|
|
18
|
-
# 可选:gold 暖棕金(默认)/ tech 深蓝科技 / mono
|
|
18
|
+
# 可选:gold 暖棕金(默认)/ tech 深蓝科技 / mono Darcula 深灰蓝 / mint 薄荷绿
|
|
19
19
|
THEME: gold
|
|
20
20
|
|
|
21
21
|
# 初始化/落盘前是否先确认目标目录
|