skill-forge-hub 0.5.4 → 1.0.0
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 +39 -0
- package/README.md +5 -4
- package/annual-report/SKILL.md +4 -3
- package/annual-report/resources/disk-and-html.md +1 -1
- package/annual-report/resources/reference.html +30 -17
- package/annual-report/user-config.md +1 -1
- package/article-to-html/SKILL.md +1 -39
- package/article-to-html/resources/usage-guide.md +41 -0
- package/cli.js +40 -7
- package/daily-report/SKILL.md +4 -3
- package/daily-report/resources/disk-and-html.md +1 -1
- package/daily-report/resources/reference.html +36 -17
- package/daily-report/user-config.md +1 -1
- package/deck-stage/SKILL.md +24 -4
- package/deck-stage/resources/cover-template.html +3 -2
- package/deck-stage/resources/data-schema.md +1 -1
- package/deck-stage/resources/pptx-builder.js +1 -1
- package/deck-stage/resources/usage-guide.md +2 -2
- package/deck-stage/user-config.md +2 -2
- package/magic-deck/SKILL.md +8 -3
- package/magic-deck/resources/deck-spec.md +15 -8
- package/magic-deck/resources/reference.html +18 -10
- package/magic-deck/resources/usage-guide.md +2 -2
- package/magic-deck/user-config.md +2 -2
- package/package.json +1 -1
- package/prompt-pouch/SKILL.md +12 -11
- package/prompt-pouch/resources/data-format.md +2 -1
- package/prompt-pouch/resources/reference.html +292 -30
- package/prompt-pouch/resources/usage-guide.md +11 -4
- package/prompt-pouch/user-config.md +1 -1
- package/spec-doc2spec/SKILL.md +1 -0
- package/spec-spec2doc/SKILL.md +1 -0
- package/weekly-report/SKILL.md +4 -3
- package/weekly-report/resources/disk-and-html.md +1 -1
- package/weekly-report/resources/reference.html +37 -18
- package/weekly-report/user-config.md +1 -1
|
@@ -30,34 +30,65 @@
|
|
|
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 IDEA 黑亮:JetBrains New UI Dark 官方色系(编辑区 #1e1f22 + 面板/弹框 #2b2d30 + 描边 #3c3f41,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(
|
|
45
|
-
}
|
|
46
|
-
/* mono
|
|
47
|
-
[data-theme="mono"] .lg{ filter:grayscale(1) brightness(.
|
|
35
|
+
--bg:#1e1f22; --bg2:#2b2d30;
|
|
36
|
+
--panel:#2b2d30; --panel2:#313438;
|
|
37
|
+
--text:#dfe1e5; --muted:#9aa0a6;
|
|
38
|
+
--gold:#3574f0; --gold2:#5e9aff; --gold-dim:rgba(53,116,240,.14);
|
|
39
|
+
--border:#3c3f41;
|
|
40
|
+
--tag-bg:rgba(53,116,240,.1);
|
|
41
|
+
--star:#dfe1e5;
|
|
42
|
+
--glow:rgba(53,116,240,.22);
|
|
43
|
+
--btn-ink:#1e1f22;
|
|
44
|
+
--bar-hi:rgba(30,31,34,.96); --bar-lo:rgba(30,31,34,.88);
|
|
45
|
+
}
|
|
46
|
+
/* mono IDEA 黑亮组件适配:魔法棒提亮、图标灰白提亮、蓝标签、白星标、深灰弹层、输入区微亮、色点蓝描边 */
|
|
47
|
+
[data-theme="mono"] .lg{ filter:grayscale(1) brightness(.5); }
|
|
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.25); }
|
|
50
|
+
[data-theme="mono"] .tpl-badge{ color:#dfe1e5; background:rgba(223,225,229,.12); }
|
|
51
|
+
[data-theme="mono"] .op.star-on{ color:#dfe1e5; border-color:rgba(223,225,229,.5); background:rgba(223,225,229,.16); }
|
|
52
|
+
[data-theme="mono"] .gpop{ background:#2b2d30; border-color:#3c3f41; box-shadow:0 12px 32px rgba(0,0,0,.55); }
|
|
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(223,225,229,.06); }
|
|
60
|
+
[data-theme="mono"] .theme-dock .th-dot[data-theme="mono"]{ border:1.5px solid rgba(94,154,255,.6); }
|
|
61
|
+
[data-theme="mono"] body{ background:var(--bg); } /* 主体纯 #1e1f22:去掉顶部光晕/网格线/160° 渐变,消除上灰下黑断层(JetBrains New UI Dark 编辑区同色) */
|
|
62
|
+
|
|
63
|
+
/* ═══ light IDEA 白亮:IntelliJ Light 官方色系(白编辑区 + 浅灰面板 #f2f2f2 + IDEA 蓝强调) ═══ */
|
|
64
|
+
[data-theme="light"]{
|
|
65
|
+
--bg:#ffffff; --bg2:#f2f2f2;
|
|
66
|
+
--panel:#f2f2f2; --panel2:#ffffff;
|
|
67
|
+
--text:#1e1f22; --muted:#6e7781;
|
|
68
|
+
--gold:#2675bf; --gold2:#4a9be0; --gold-dim:rgba(38,117,191,.12);
|
|
69
|
+
--border:#d1d1d1;
|
|
70
|
+
--tag-bg:rgba(38,117,191,.08);
|
|
71
|
+
--star:#e5a33c;
|
|
72
|
+
--glow:rgba(38,117,191,.16);
|
|
73
|
+
--btn-ink:#ffffff;
|
|
74
|
+
--bar-hi:rgba(255,255,255,.96); --bar-lo:rgba(255,255,255,.88);
|
|
75
|
+
}
|
|
76
|
+
/* light IDEA 白亮组件适配:魔法棒灰黑、图标灰化、蓝标签、暖金星标、白弹层、输入区浅灰、色点蓝描边 */
|
|
77
|
+
[data-theme="light"] .lg{ filter:grayscale(1) brightness(.7); }
|
|
78
|
+
[data-theme="light"] .nav-item .icon,
|
|
79
|
+
[data-theme="light"] .search .kw{ filter:grayscale(1) brightness(.85); }
|
|
80
|
+
[data-theme="light"] .tpl-badge{ color:#2675bf; background:rgba(38,117,191,.1); }
|
|
81
|
+
[data-theme="light"] .op.star-on{ color:#e5a33c; border-color:rgba(229,163,60,.5); background:rgba(229,163,60,.14); }
|
|
82
|
+
[data-theme="light"] .gpop{ background:#ffffff; border-color:#d1d1d1; box-shadow:0 12px 32px rgba(30,31,34,.14); }
|
|
83
|
+
[data-theme="light"] .fp-preview,
|
|
84
|
+
[data-theme="light"] .fp-field input,
|
|
85
|
+
[data-theme="light"] .fp-field textarea,
|
|
86
|
+
[data-theme="light"] .fp-field select,
|
|
87
|
+
[data-theme="light"] .fp-live textarea,
|
|
88
|
+
[data-theme="light"] .bk-item,
|
|
89
|
+
[data-theme="light"] .detail-content{ background:#f7f9fb; }
|
|
90
|
+
[data-theme="light"] .theme-dock .th-dot[data-theme="light"]{ border:1.5px solid rgba(38,117,191,.5); }
|
|
91
|
+
[data-theme="light"] body{ background:var(--bg); } /* 主体纯白 #ffffff:去掉顶部光晕/网格线/160° 渐变,对齐 IntelliJ Light 编辑区 */
|
|
61
92
|
[data-theme="mint"]{ /* 薄荷绿 */
|
|
62
93
|
--bg:#0d1a12; --bg2:#12241a;
|
|
63
94
|
--panel:#182f22; --panel2:#1e3a2a;
|
|
@@ -211,7 +242,7 @@ main{ flex:1; min-width:0; }
|
|
|
211
242
|
overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
|
|
212
243
|
}
|
|
213
244
|
|
|
214
|
-
/*
|
|
245
|
+
/* 搜索命中高亮(五主题令牌适配) */
|
|
215
246
|
mark.hl{ background:var(--gold-dim); color:var(--gold); border-radius:3px; padding:0 2px; font-weight:700; }
|
|
216
247
|
.hl-note{ font-size:10px; color:var(--gold); background:var(--gold-dim); border:1px solid var(--border); border-radius:4px; padding:0 5px; line-height:16px; margin-left:6px; vertical-align:middle; }
|
|
217
248
|
.gbadge{
|
|
@@ -238,9 +269,49 @@ mark.hl{ background:var(--gold-dim); color:var(--gold); border-radius:3px; paddi
|
|
|
238
269
|
.card-time .ct-ico{ color:var(--gold); flex:0 0 auto; }
|
|
239
270
|
.card-foot{ display:flex; align-items:center; gap:8px; margin-top:2px; }
|
|
240
271
|
.tag{
|
|
272
|
+
display:inline-flex; align-items:center; gap:2px;
|
|
241
273
|
font-size:10px; color:var(--muted); background:var(--panel2);
|
|
242
274
|
border:1px solid var(--border); border-radius:999px; padding:2px 8px; letter-spacing:.5px;
|
|
275
|
+
cursor:pointer; transition:color .15s ease, border-color .15s ease, background .15s ease;
|
|
276
|
+
}
|
|
277
|
+
.tag:hover{ color:var(--gold); border-color:var(--gold2); }
|
|
278
|
+
.tag.on{ color:var(--btn-ink); background:var(--gold); border-color:var(--gold); }
|
|
279
|
+
.tag .tag-x{
|
|
280
|
+
display:none; border:none; background:none; color:inherit; cursor:pointer;
|
|
281
|
+
font-size:11px; line-height:1; padding:0 2px; margin-right:-3px;
|
|
282
|
+
}
|
|
283
|
+
.tag:hover .tag-x{ display:inline-block; }
|
|
284
|
+
.tag .tag-x:hover{ color:var(--gold); }
|
|
285
|
+
.tag-add{
|
|
286
|
+
display:none; border:1px dashed var(--border); background:none; color:var(--muted);
|
|
287
|
+
border-radius:999px; font-size:10px; line-height:1; padding:3px 7px; cursor:pointer;
|
|
288
|
+
}
|
|
289
|
+
.tags-wrap:hover .tag-add{ display:inline-block; }
|
|
290
|
+
.tag-add:hover{ color:var(--gold); border-color:var(--gold2); }
|
|
291
|
+
.emoji-pick{
|
|
292
|
+
display:grid; grid-template-columns:repeat(9,1fr); gap:6px;
|
|
293
|
+
max-height:200px; overflow-y:auto; padding:4px 4px 4px 0;
|
|
294
|
+
}
|
|
295
|
+
.emoji-pick button{
|
|
296
|
+
font-size:28px; line-height:1.4; padding:5px 0; text-align:center;
|
|
297
|
+
background:none; border:1px solid transparent; border-radius:8px; cursor:pointer;
|
|
243
298
|
}
|
|
299
|
+
.emoji-pick button:hover{ background:var(--tag-bg); border-color:var(--border); transform:scale(1.12); }
|
|
300
|
+
.emoji-pick button.sel{ background:var(--gold-dim); border-color:var(--gold); }
|
|
301
|
+
.tag-filter{
|
|
302
|
+
display:inline-flex; align-items:center; gap:6px;
|
|
303
|
+
font-size:11px; color:var(--gold); background:var(--gold-dim);
|
|
304
|
+
border:1px solid var(--border); border-radius:999px; padding:3px 6px 3px 10px;
|
|
305
|
+
}
|
|
306
|
+
.tag-filter b{ font-weight:600; max-width:140px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
307
|
+
.tag-filter .tf-x{
|
|
308
|
+
border:none; background:var(--border); color:var(--text); width:16px; height:16px;
|
|
309
|
+
border-radius:50%; cursor:pointer; font-size:10px; line-height:1; padding:0;
|
|
310
|
+
display:inline-flex; align-items:center; justify-content:center;
|
|
311
|
+
}
|
|
312
|
+
.tag-filter .tf-x:hover{ background:var(--gold); color:var(--btn-ink); }
|
|
313
|
+
.nav-item.drag-over{ opacity:.35; }
|
|
314
|
+
.nav-item.drop-target{ box-shadow:inset 0 2px 0 var(--gold); }
|
|
244
315
|
.card-ops{ margin-left:auto; display:flex; gap:6px; opacity:0; transition:opacity .18s ease; }
|
|
245
316
|
.card:hover .card-ops{ opacity:1; }
|
|
246
317
|
.op{
|
|
@@ -463,7 +534,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
463
534
|
.list{ grid-template-columns:1fr; }
|
|
464
535
|
.card-ops{ opacity:1; }
|
|
465
536
|
}
|
|
466
|
-
/*
|
|
537
|
+
/* 主题换肤坞:右下角五色点随点随换,记忆上次选择;打印隐藏 */
|
|
467
538
|
.theme-dock{ position:fixed; right:18px; bottom:18px; z-index:1001; display:flex; gap:8px;
|
|
468
539
|
padding:8px 10px; border-radius:999px; background:var(--panel2); border:1px solid var(--border);
|
|
469
540
|
box-shadow:0 4px 18px rgba(0,0,0,.3); }
|
|
@@ -473,7 +544,8 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
473
544
|
.theme-dock .th-dot.on{ border-color:var(--text); }
|
|
474
545
|
.theme-dock .th-dot[data-theme="gold"]{ background:#e8b04b; }
|
|
475
546
|
.theme-dock .th-dot[data-theme="tech"]{ background:#0ea5e9; }
|
|
476
|
-
.theme-dock .th-dot[data-theme="mono"]{ background:#
|
|
547
|
+
.theme-dock .th-dot[data-theme="mono"]{ background:#1e1f22; }
|
|
548
|
+
.theme-dock .th-dot[data-theme="light"]{ background:#ffffff; }
|
|
477
549
|
.theme-dock .th-dot[data-theme="mint"]{ background:#4ade80; }
|
|
478
550
|
@media print{ .theme-dock{ display:none; } }
|
|
479
551
|
</style>
|
|
@@ -502,6 +574,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
502
574
|
<div class="bar">
|
|
503
575
|
<h2 id="curTitle">全部提示词</h2>
|
|
504
576
|
<span class="total" id="curTotal"></span>
|
|
577
|
+
<span class="tag-filter" id="tagFilterChip" style="display:none"><span class="tf-ico">🏷</span><b id="tagFilterName"></b><button class="tf-x" id="tagFilterClear" title="清除标签过滤">✕</button></span>
|
|
505
578
|
<button class="btn primary" id="btnAddItem">+ 新增提示词</button>
|
|
506
579
|
<div class="sort-box">
|
|
507
580
|
<label for="sortSel">排序</label>
|
|
@@ -522,6 +595,9 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
522
595
|
<span class="bk-status" id="bkStatus">本地快照备份中</span>
|
|
523
596
|
<button class="btn" id="btnBkChange" style="display:none">📂 换目录</button>
|
|
524
597
|
<button class="btn" id="btnBkRestore" style="display:none">↩ 恢复备份</button>
|
|
598
|
+
<button class="btn" id="btnBkExport" title="把当前全部数据导出为 JSON 文件">⤓ 导出</button>
|
|
599
|
+
<button class="btn" id="btnBkImport" title="从 JSON 文件导入(覆盖现有数据,导入前自动备份)">⤒ 导入</button>
|
|
600
|
+
<input type="file" id="importFile" accept=".json,application/json" style="display:none" />
|
|
525
601
|
</div>
|
|
526
602
|
</div>
|
|
527
603
|
<div class="list" id="cardList"></div>
|
|
@@ -587,7 +663,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
587
663
|
|
|
588
664
|
<!-- 新建/编辑分组 -->
|
|
589
665
|
<div class="modal-mask" id="groupMask">
|
|
590
|
-
<div class="fill-panel" style="width:
|
|
666
|
+
<div class="fill-panel" style="width:640px;">
|
|
591
667
|
<div class="fp-head">
|
|
592
668
|
<div class="fp-title" id="groupTitle">新建分组</div>
|
|
593
669
|
<span class="fp-count">落盘 data/prompts.json · 刷新即见</span>
|
|
@@ -595,6 +671,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
595
671
|
<div class="fp-fields">
|
|
596
672
|
<div class="fp-field"><label for="groupName">分组名</label><input id="groupName" placeholder="如:灵感" /></div>
|
|
597
673
|
<div class="fp-field"><label for="groupIcon">图标(一个 emoji)</label><input id="groupIcon" placeholder="如:✨" maxlength="4" /></div>
|
|
674
|
+
<div class="fp-field"><label>快捷选择(点击填入,输入框仍可手输/粘贴任意字符)</label><div class="emoji-pick" id="emojiPick"></div></div>
|
|
598
675
|
</div>
|
|
599
676
|
<div class="fp-ops">
|
|
600
677
|
<button class="btn" id="groupCancel">取消</button>
|
|
@@ -664,6 +741,7 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
664
741
|
sortMode: 'added', // 'added' 最新添加 | 'recent' 最近使用 | 'freq' 使用频率 | 'manual' 手动顺序
|
|
665
742
|
usage: {}, // id -> { lastUsed: ts, useCount: n }(复制时统计,存浏览器本地态)
|
|
666
743
|
moves: [], // 跨组移动待办 [{title, from, to}](随变更指令交给 AI 落盘)
|
|
744
|
+
tagFilter: '', // 标签过滤(点卡片标签设置,再点取消;切分组自动清除)
|
|
667
745
|
};
|
|
668
746
|
|
|
669
747
|
/* ---------- 数据加载 ---------- */
|
|
@@ -723,10 +801,25 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
723
801
|
function showErr(msg){
|
|
724
802
|
listEl.innerHTML = '<div class="empty">' + msg + '</div>';
|
|
725
803
|
}
|
|
804
|
+
function applyTagFilter(t){
|
|
805
|
+
state.tagFilter = (state.tagFilter === t) ? '' : t;
|
|
806
|
+
syncTagFilterUI();
|
|
807
|
+
render();
|
|
808
|
+
}
|
|
809
|
+
function syncTagFilterUI(){
|
|
810
|
+
var chip = document.getElementById('tagFilterChip');
|
|
811
|
+
var nameEl = document.getElementById('tagFilterName');
|
|
812
|
+
if (!chip) return;
|
|
813
|
+
if (!state.tagFilter){ chip.style.display = 'none'; }
|
|
814
|
+
else { chip.style.display = ''; nameEl.textContent = state.tagFilter; }
|
|
815
|
+
}
|
|
726
816
|
function visiblePrompts(){
|
|
727
817
|
var ps = state.data.prompts.slice();
|
|
728
818
|
if (state.curGroup === 'fav') ps = ps.filter(function(p){ return p.favorite; });
|
|
729
819
|
else if (state.curGroup !== 'all') ps = ps.filter(function(p){ return p.group === state.curGroup; });
|
|
820
|
+
if (state.tagFilter){
|
|
821
|
+
ps = ps.filter(function(p){ return (p.tags || []).indexOf(state.tagFilter) > -1; });
|
|
822
|
+
}
|
|
730
823
|
if (state.query){
|
|
731
824
|
var q = state.query.toLowerCase();
|
|
732
825
|
ps = ps.filter(function(p){
|
|
@@ -797,16 +890,17 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
797
890
|
html += '<div class="nav-item' + (state.curGroup==='fav'?' on':'') + '" data-g="fav"><span class="icon">⭐</span>收藏<span class="cnt">' + favN + '</span></div>';
|
|
798
891
|
state.data.groups.forEach(function(g){
|
|
799
892
|
var n = state.data.prompts.filter(function(p){ return p.group === g.id; }).length;
|
|
800
|
-
html += '<div class="nav-item' + (state.curGroup===g.id?' on':'') + '" data-g="' + g.id + '"><span class="icon">' + g.icon + '</span><span class="g-name">' + escapeHtml(g.name) + '</span><span class="cnt">' + n + '</span><span class="g-ops"><button class="g-edit" title="编辑分组">✎</button><button class="g-del" title="删除分组">🗑</button></span></div>';
|
|
893
|
+
html += '<div class="nav-item' + (state.curGroup===g.id?' on':'') + '" data-g="' + g.id + '" draggable="true" title="拖拽调整分组顺序"><span class="icon">' + g.icon + '</span><span class="g-name">' + escapeHtml(g.name) + '</span><span class="cnt">' + n + '</span><span class="g-ops"><button class="g-edit" title="编辑分组">✎</button><button class="g-del" title="删除分组">🗑</button></span></div>';
|
|
801
894
|
});
|
|
802
895
|
html += '</div>';
|
|
803
896
|
html += '<div class="nav-add" id="navAdd">+ 新建分组</div>';
|
|
804
|
-
html += '<div class="side-tip"><b>锦囊用法</b><br>· 页面直接增删改:+ 新建分组 / + 新增提示词 / ✎ 编辑 / 🗑 删除(授权目录即写即存)<br>· 也可对 AI 说「把 XX 加到写作输出分组」<br>· 顶栏切换排序;⇄
|
|
897
|
+
html += '<div class="side-tip"><b>锦囊用法</b><br>· 页面直接增删改:+ 新建分组 / + 新增提示词 / ✎ 编辑 / 🗑 删除(授权目录即写即存)<br>· 也可对 AI 说「把 XX 加到写作输出分组」<br>· 顶栏切换排序;⇄ 移组、拖卡片排序自动保存;拖分组条调整分组顺序<br>· 点卡片标签按标签筛选(再点取消);标签悬停 ✕ 删 / + 加;⤓ 导出 / ⤒ 导入 JSON 备份<br>· ⭐ 收藏常用 · 复制次数在卡片右上角</div>';
|
|
805
898
|
sideNav.innerHTML = html;
|
|
806
899
|
sideNav.querySelectorAll('.nav-item').forEach(function(el){
|
|
807
900
|
el.addEventListener('click', function(){
|
|
808
901
|
var gv = el.getAttribute('data-g');
|
|
809
902
|
state.curGroup = (gv === 'all' || gv === 'fav') ? gv : Number(gv);
|
|
903
|
+
state.tagFilter = ''; syncTagFilterUI();
|
|
810
904
|
renderNav(); render();
|
|
811
905
|
});
|
|
812
906
|
});
|
|
@@ -824,6 +918,29 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
824
918
|
delGroup(groupOf(gid));
|
|
825
919
|
});
|
|
826
920
|
});
|
|
921
|
+
var dragGid = null;
|
|
922
|
+
sideNav.querySelectorAll('.nav-item[draggable="true"]').forEach(function(el){
|
|
923
|
+
el.addEventListener('dragstart', function(e){
|
|
924
|
+
dragGid = Number(el.getAttribute('data-g'));
|
|
925
|
+
el.classList.add('drag-over');
|
|
926
|
+
try { e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('text/plain', String(dragGid)); } catch(err){}
|
|
927
|
+
});
|
|
928
|
+
el.addEventListener('dragover', function(e){ e.preventDefault(); });
|
|
929
|
+
el.addEventListener('dragenter', function(e){
|
|
930
|
+
if (el.getAttribute('data-g') !== String(dragGid)) el.classList.add('drop-target');
|
|
931
|
+
});
|
|
932
|
+
el.addEventListener('dragleave', function(){ el.classList.remove('drop-target'); });
|
|
933
|
+
el.addEventListener('drop', function(e){
|
|
934
|
+
e.preventDefault();
|
|
935
|
+
el.classList.remove('drop-target');
|
|
936
|
+
if (dragGid === null || el.getAttribute('data-g') === String(dragGid)) return;
|
|
937
|
+
reorderGroups(dragGid, Number(el.getAttribute('data-g')));
|
|
938
|
+
});
|
|
939
|
+
el.addEventListener('dragend', function(){
|
|
940
|
+
sideNav.querySelectorAll('.nav-item').forEach(function(x){ x.classList.remove('drag-over','drop-target'); });
|
|
941
|
+
dragGid = null;
|
|
942
|
+
});
|
|
943
|
+
});
|
|
827
944
|
var addBtn = sideNav.querySelector('#navAdd');
|
|
828
945
|
if (addBtn) addBtn.addEventListener('click', function(){ openGroupForm(null); });
|
|
829
946
|
}
|
|
@@ -877,7 +994,32 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
877
994
|
card.querySelector('.card-top').appendChild(note);
|
|
878
995
|
}
|
|
879
996
|
var tw = card.querySelector('.tags-wrap');
|
|
880
|
-
(p.tags || []).forEach(function(t){
|
|
997
|
+
(p.tags || []).forEach(function(t){
|
|
998
|
+
var tg = document.createElement('span');
|
|
999
|
+
tg.className = 'tag' + (state.tagFilter === t ? ' on' : '');
|
|
1000
|
+
var lb = document.createElement('span');
|
|
1001
|
+
lb.innerHTML = hlHtml(t, state.query);
|
|
1002
|
+
var x = document.createElement('button');
|
|
1003
|
+
x.type = 'button';
|
|
1004
|
+
x.className = 'tag-x';
|
|
1005
|
+
x.textContent = '✕';
|
|
1006
|
+
x.title = '删除标签「' + t + '」';
|
|
1007
|
+
x.addEventListener('click', function(e){ e.stopPropagation(); removeTag(p, t); });
|
|
1008
|
+
tg.appendChild(lb);
|
|
1009
|
+
tg.appendChild(x);
|
|
1010
|
+
tg.title = '点击筛选该标签(再点取消)';
|
|
1011
|
+
tg.addEventListener('click', function(){ applyTagFilter(t); });
|
|
1012
|
+
tw.appendChild(tg);
|
|
1013
|
+
});
|
|
1014
|
+
if ((p.tags || []).length < 3){
|
|
1015
|
+
var ta = document.createElement('button');
|
|
1016
|
+
ta.type = 'button';
|
|
1017
|
+
ta.className = 'tag-add';
|
|
1018
|
+
ta.textContent = '+';
|
|
1019
|
+
ta.title = '添加标签(多个用逗号分隔,最多 3 个)';
|
|
1020
|
+
ta.addEventListener('click', function(e){ e.stopPropagation(); quickAddTag(p); });
|
|
1021
|
+
tw.appendChild(ta);
|
|
1022
|
+
}
|
|
881
1023
|
|
|
882
1024
|
/* 详情弹窗 */
|
|
883
1025
|
card.querySelector('.card-expand').addEventListener('click', function(){ openDetail(p); });
|
|
@@ -1421,6 +1563,42 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1421
1563
|
cmd: '请删除锦囊里「' + p.title + '」这条'
|
|
1422
1564
|
}).then(function(ok){ if (ok) toast('已删除「' + p.title + '」'); });
|
|
1423
1565
|
}
|
|
1566
|
+
/* 标签快捷操作:卡片标签悬停 ✕ 删 / + 加(授权目录即写即存,未授权生成指令) */
|
|
1567
|
+
function removeTag(p, t){
|
|
1568
|
+
writePromptsJson({
|
|
1569
|
+
apply: function(data){
|
|
1570
|
+
var item = data.prompts.find(function(x){ return x.id === p.id; });
|
|
1571
|
+
if (!item){ toast('该提示词已不存在,请刷新后重试', true); return null; }
|
|
1572
|
+
item.tags = (item.tags || []).filter(function(x){ return x !== t; });
|
|
1573
|
+
item.updatedAt = nowStamp();
|
|
1574
|
+
return data;
|
|
1575
|
+
},
|
|
1576
|
+
cmd: '请删除锦囊里「' + p.title + '」的标签「' + t + '」(tags 中移除该项,同时把 updatedAt 更新为当前时间 YYYY-MM-DD HH:mm:ss)'
|
|
1577
|
+
}).then(function(ok){
|
|
1578
|
+
if (ok){
|
|
1579
|
+
if (state.tagFilter === t) applyTagFilter(t);
|
|
1580
|
+
toast('已删除标签「' + t + '」');
|
|
1581
|
+
}
|
|
1582
|
+
});
|
|
1583
|
+
}
|
|
1584
|
+
function quickAddTag(p){
|
|
1585
|
+
var cur = (p.tags || []).slice(0, 3);
|
|
1586
|
+
var input = window.prompt('为「' + p.title + '」添加标签(多个用逗号分隔,最多 3 个):', cur.join(', '));
|
|
1587
|
+
if (input === null) return;
|
|
1588
|
+
var adds = input.split(/[,,]/).map(function(s){ return s.trim(); }).filter(Boolean);
|
|
1589
|
+
if (!adds.length) return;
|
|
1590
|
+
var merged = cur.concat(adds).slice(0, 3);
|
|
1591
|
+
writePromptsJson({
|
|
1592
|
+
apply: function(data){
|
|
1593
|
+
var item = data.prompts.find(function(x){ return x.id === p.id; });
|
|
1594
|
+
if (!item){ toast('该提示词已不存在,请刷新后重试', true); return null; }
|
|
1595
|
+
item.tags = merged;
|
|
1596
|
+
item.updatedAt = nowStamp();
|
|
1597
|
+
return data;
|
|
1598
|
+
},
|
|
1599
|
+
cmd: '请把锦囊里「' + p.title + '」的标签更新为:' + merged.join(', ') + '(同时把 updatedAt 更新为当前时间 YYYY-MM-DD HH:mm:ss)'
|
|
1600
|
+
}).then(function(ok){ if (ok) toast('标签已更新'); });
|
|
1601
|
+
}
|
|
1424
1602
|
document.getElementById('itemCancel').addEventListener('click', closeItemForm);
|
|
1425
1603
|
document.getElementById('itemSave').addEventListener('click', saveItem);
|
|
1426
1604
|
itemName.addEventListener('keydown', function(e){ if (e.key === 'Enter'){ e.preventDefault(); saveItem(); } });
|
|
@@ -1432,11 +1610,28 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1432
1610
|
var groupName = document.getElementById('groupName');
|
|
1433
1611
|
var groupIcon = document.getElementById('groupIcon');
|
|
1434
1612
|
var editingGroupId = null;
|
|
1613
|
+
/* 分组图标快捷面板:预置 emoji 点击填入,输入框仍可手输/粘贴任意字符 */
|
|
1614
|
+
var EMOJI_PRESETS = ['✨','✍️','🖋','✏️','📝','📄','📋','🗒','📚','📖','📎','🔗','🧾','📊','📈','📉','🗂','📁','📦','🗃','🧰','💬','🗣','📣','☎️','📧','✉️','🤝','🔄','👥','🎙','🎧','📌','🗓','📅','⏰','⏱','⚙️','🔧','🛠','🧭','🗺','🚀','🏁','🎯','📍','🧠','💡','🔍','🧩','🔬','🧪','🏆','🥇','⭐','🌟','🔥','✅','✔️','⚠️','🚨','🔒','🛡','💎','🎨','🖌','🎬','🎵','📷','🌈','🍀','🌱','🌸','⚡','❄️','☀️','🌙','🍎','☕','🍵','🎂','🎁','🎉','🎊','🧸','🐣','🦄','💻','🖥','⌨️','🖱','📱','🔋','💾','📡'];
|
|
1615
|
+
var emojiPickEl = document.getElementById('emojiPick');
|
|
1616
|
+
EMOJI_PRESETS.forEach(function(e){
|
|
1617
|
+
var b = document.createElement('button');
|
|
1618
|
+
b.type = 'button';
|
|
1619
|
+
b.textContent = e;
|
|
1620
|
+
b.title = e;
|
|
1621
|
+
b.addEventListener('click', function(){ groupIcon.value = e; syncEmojiSel(); });
|
|
1622
|
+
emojiPickEl.appendChild(b);
|
|
1623
|
+
});
|
|
1624
|
+
function syncEmojiSel(){
|
|
1625
|
+
var v = groupIcon.value.trim();
|
|
1626
|
+
Array.prototype.forEach.call(emojiPickEl.children, function(b){ b.classList.toggle('sel', b.textContent === v); });
|
|
1627
|
+
}
|
|
1628
|
+
groupIcon.addEventListener('input', syncEmojiSel);
|
|
1435
1629
|
function openGroupForm(g){
|
|
1436
1630
|
editingGroupId = g ? g.id : null;
|
|
1437
1631
|
groupTitleEl.textContent = g ? '编辑分组' : '新建分组';
|
|
1438
1632
|
groupName.value = g ? g.name : '';
|
|
1439
1633
|
groupIcon.value = g ? g.icon : '✨';
|
|
1634
|
+
syncEmojiSel();
|
|
1440
1635
|
groupMask.classList.add('open');
|
|
1441
1636
|
setTimeout(function(){ groupName.focus(); }, 60);
|
|
1442
1637
|
}
|
|
@@ -1482,6 +1677,22 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1482
1677
|
cmd: '请删除锦囊分组「' + g.name + '」'
|
|
1483
1678
|
}).then(function(ok){ if (ok) toast('分组「' + g.name + '」已删除'); });
|
|
1484
1679
|
}
|
|
1680
|
+
function reorderGroups(moveId, beforeId){
|
|
1681
|
+
var ids = state.data.groups.map(function(g){ return g.id; });
|
|
1682
|
+
var mi = ids.indexOf(moveId), bi = ids.indexOf(beforeId);
|
|
1683
|
+
if (mi < 0 || bi < 0 || mi === bi) return;
|
|
1684
|
+
ids.splice(mi, 1);
|
|
1685
|
+
ids.splice(ids.indexOf(beforeId), 0, moveId);
|
|
1686
|
+
writePromptsJson({
|
|
1687
|
+
apply: function(data){
|
|
1688
|
+
var byId = {};
|
|
1689
|
+
data.groups.forEach(function(g){ byId[g.id] = g; });
|
|
1690
|
+
data.groups = ids.map(function(id){ return byId[id]; });
|
|
1691
|
+
return data;
|
|
1692
|
+
},
|
|
1693
|
+
cmd: '请把锦囊分组顺序调整为:' + ids.map(function(id){ var g = groupOf(id); return g ? g.name : id; }).join('、')
|
|
1694
|
+
}).then(function(ok){ if (ok) toast('分组顺序已保存'); });
|
|
1695
|
+
}
|
|
1485
1696
|
document.getElementById('groupCancel').addEventListener('click', closeGroupForm);
|
|
1486
1697
|
document.getElementById('groupSave').addEventListener('click', saveGroup);
|
|
1487
1698
|
groupName.addEventListener('keydown', function(e){ if (e.key === 'Enter'){ e.preventDefault(); saveGroup(); } });
|
|
@@ -1489,6 +1700,56 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
1489
1700
|
var btnAddItem = document.getElementById('btnAddItem');
|
|
1490
1701
|
if (btnAddItem) btnAddItem.addEventListener('click', function(){ openItemForm(null); });
|
|
1491
1702
|
|
|
1703
|
+
/* ---------- 导入 / 导出 ---------- */
|
|
1704
|
+
var btnBkExport = document.getElementById('btnBkExport');
|
|
1705
|
+
var btnBkImport = document.getElementById('btnBkImport');
|
|
1706
|
+
var importFile = document.getElementById('importFile');
|
|
1707
|
+
function doExport(){
|
|
1708
|
+
if (!state.data){ toast('暂无数据可导出', true); return; }
|
|
1709
|
+
var blob = new Blob([JSON.stringify(state.data, null, 2)], { type: 'application/json' });
|
|
1710
|
+
var url = URL.createObjectURL(blob);
|
|
1711
|
+
var a = document.createElement('a');
|
|
1712
|
+
function p(n){ return (n < 10 ? '0' : '') + n; }
|
|
1713
|
+
var d = new Date();
|
|
1714
|
+
a.href = url;
|
|
1715
|
+
a.download = 'prompts-backup-' + d.getFullYear() + p(d.getMonth()+1) + p(d.getDate()) + '-' + p(d.getHours()) + p(d.getMinutes()) + p(d.getSeconds()) + '.json';
|
|
1716
|
+
document.body.appendChild(a);
|
|
1717
|
+
a.click();
|
|
1718
|
+
document.body.removeChild(a);
|
|
1719
|
+
setTimeout(function(){ URL.revokeObjectURL(url); }, 1500);
|
|
1720
|
+
toast('已导出 ' + state.data.prompts.length + ' 条提示词');
|
|
1721
|
+
}
|
|
1722
|
+
function doImport(){
|
|
1723
|
+
if (!bkDirHandle){ toast('请先授权目录(页面顶部「💾 授权目录备份」)', true); return; }
|
|
1724
|
+
importFile.value = '';
|
|
1725
|
+
importFile.click();
|
|
1726
|
+
}
|
|
1727
|
+
importFile.addEventListener('change', function(){
|
|
1728
|
+
var f = importFile.files[0];
|
|
1729
|
+
if (!f) return;
|
|
1730
|
+
var reader = new FileReader();
|
|
1731
|
+
reader.onload = function(){
|
|
1732
|
+
var d = null;
|
|
1733
|
+
try {
|
|
1734
|
+
d = JSON.parse(String(reader.result));
|
|
1735
|
+
if (!d || !Array.isArray(d.groups) || !Array.isArray(d.prompts)){
|
|
1736
|
+
toast('文件格式不对:需要含 groups 与 prompts 的锦囊数据', true);
|
|
1737
|
+
return;
|
|
1738
|
+
}
|
|
1739
|
+
} catch(err){ toast('JSON 解析失败,请确认文件内容', true); return; }
|
|
1740
|
+
var cur = (state.data && state.data.prompts) ? state.data.prompts.length : 0;
|
|
1741
|
+
if (!window.confirm('导入将覆盖现有 ' + cur + ' 条数据为 ' + d.prompts.length + ' 条(导入前自动备份,可从 ↩ 恢复)。确定继续?')) return;
|
|
1742
|
+
writePromptsJson({ apply: function(){ return d; }, cmd: '' }).then(function(ok){
|
|
1743
|
+
if (ok) toast('已导入 ' + d.prompts.length + ' 条提示词');
|
|
1744
|
+
});
|
|
1745
|
+
};
|
|
1746
|
+
reader.readAsText(f, 'utf-8');
|
|
1747
|
+
});
|
|
1748
|
+
btnBkExport.addEventListener('click', doExport);
|
|
1749
|
+
btnBkImport.addEventListener('click', doImport);
|
|
1750
|
+
var tagFilterClear = document.getElementById('tagFilterClear');
|
|
1751
|
+
if (tagFilterClear) tagFilterClear.addEventListener('click', function(){ applyTagFilter(''); });
|
|
1752
|
+
|
|
1492
1753
|
/* ---------- 排序指令 ---------- */
|
|
1493
1754
|
function buildSortCmd(){
|
|
1494
1755
|
var lines = ['请帮我调整 prompt-pouch 锦囊(按以下内容落盘 prompts.json):'];
|
|
@@ -2009,9 +2270,9 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
2009
2270
|
});
|
|
2010
2271
|
})();
|
|
2011
2272
|
|
|
2012
|
-
/*
|
|
2273
|
+
/* 主题换肤:五套配色随点随换;记忆上次选择(localStorage,失败静默) */
|
|
2013
2274
|
(function(){
|
|
2014
|
-
var THEMES = ['gold','tech','mono','mint'];
|
|
2275
|
+
var THEMES = ['gold','tech','mono','light','mint'];
|
|
2015
2276
|
function init(){
|
|
2016
2277
|
var dock = document.getElementById('themeDock');
|
|
2017
2278
|
if (!dock) return;
|
|
@@ -2043,7 +2304,8 @@ footer.open .ht-arrow{ transform:rotate(180deg); }
|
|
|
2043
2304
|
<div class="theme-dock" id="themeDock">
|
|
2044
2305
|
<button class="th-dot" type="button" data-theme="gold" title="gold 暖棕金"></button>
|
|
2045
2306
|
<button class="th-dot" type="button" data-theme="tech" title="tech 深蓝科技"></button>
|
|
2046
|
-
<button class="th-dot" type="button" data-theme="mono" title="mono
|
|
2307
|
+
<button class="th-dot" type="button" data-theme="mono" title="mono IDEA 黑亮"></button>
|
|
2308
|
+
<button class="th-dot" type="button" data-theme="light" title="light IDEA 白亮"></button>
|
|
2047
2309
|
<button class="th-dot" type="button" data-theme="mint" title="mint 薄荷绿"></button>
|
|
2048
2310
|
</div>
|
|
2049
2311
|
</body>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 锦囊使用指南
|
|
2
2
|
|
|
3
|
-
锦囊(prompt-pouch)是一个本地 HTML
|
|
3
|
+
锦囊(prompt-pouch)是一个本地 HTML 提示词管理台:暖棕金默认配色,内置五套主题(暖棕金/深蓝科技/IDEA 黑亮/IDEA 白亮/薄荷绿,右下角换肤坞随时切换),分组侧栏 + 搜索 + 卡片网格,妙计入囊、随取随用。页面与数据分离——页面可直写、AI 可代笔(双笔协作),你只管说,刷新即见。
|
|
4
4
|
|
|
5
5
|
## 怎么用
|
|
6
6
|
|
|
@@ -10,17 +10,23 @@
|
|
|
10
10
|
4. **删除**:页面点卡片「🗑」;或对 AI 说「删掉锦囊里『XX』这条」
|
|
11
11
|
5. **排序与移组**:顶栏「排序」切换四种方式——最新添加(默认)/ 最近使用 / 使用频率 / 手动顺序;想手动排时拖动卡片或点 ▲▼(自动切回手动),点卡片 ⇄ 可把提示词移到其它分组;已授权目录时排序/移组 2 秒内自动保存,未授权时点「📋 复制变更指令」把指令发给 AI 落盘;复制过提示词后卡片右上角会显示「⧉ N 次 · 最近时间」(最近使用/使用频率排序即按复制统计);AI 落盘后回页面点「✓ 已落盘」清除未保存标记
|
|
12
12
|
6. **收藏**:卡片右上角星标,收藏/取消收藏指令由 AI 同步到数据文件
|
|
13
|
-
7. **分组管理**:侧栏底部「+ 新建分组」;悬停分组名出现「✎ 改名 / 🗑
|
|
13
|
+
7. **分组管理**:侧栏底部「+ 新建分组」;悬停分组名出现「✎ 改名 / 🗑 删除」(组内还有提示词时不允许删,先移出或删条目);重名分组会提示;新建/编辑分组时图标输入框下方有快捷 emoji 面板(点击即填入、选中高亮,输入框仍可手输/粘贴任意 emoji)
|
|
14
|
+
8. **标签全交互**:点卡片标签立即按标签筛选(顶栏出现「🏷 标签」胶囊,点 ✕ 或再点同标签取消,切分组自动清除,与搜索叠加);标签悬停出「✕」点它直接删除该标签;标签不满 3 个时悬停出「+」快速加标签(多个用逗号分隔)——已授权目录即写即存,未授权时操作指令复制给 AI 落盘
|
|
15
|
+
9. **分组排序**:左侧分组条可直接拖拽调整顺序(已授权目录即写即存,未授权时指令自动复制给 AI 落盘)
|
|
16
|
+
10. **导入 / 导出**:顶栏「⤓ 导出」把当前全部数据下载为 JSON 备份文件(文件名带时间戳);「⤒ 导入」选择 JSON 文件整库覆盖现有数据(导入前自动备份,可从「↩ 恢复」回滚;未授权目录时导出仍可用、导入需先授权)
|
|
14
17
|
|
|
15
18
|
## 特色功能
|
|
16
19
|
|
|
17
|
-
-
|
|
20
|
+
- **搜索高亮**:搜索框输入关键词,命中卡片的标题/正文/标签中匹配词以主题色徽标高亮(五主题自适应);命中落在正文三行折叠区之外时,卡片顶部提示「正文命中,详见详情」,点开详情弹窗全文同样高亮
|
|
18
21
|
- **{变量} 插值**:内容含花括号占位(如「{功能名}」)的提示词,点复制会自动弹出填充面板,填入变量后实时预览再复制
|
|
19
22
|
- **自动备份(默认开启)**:数据一有变更 2 秒内自动备份——首次变更会请求授权写入 prompt-pouch.html 所在目录(弹窗选同目录即可,选一次后浏览器记住),写 backup/pouch-backup.json 并滚动保留上一版 .prev.json;未授权或浏览器不支持时自动降级为本地快照(浏览器内保留最近 5 份),页内「↩ 恢复」均可一键回滚;顶栏「📂 换目录」可随时重新配置备份目录
|
|
20
23
|
- **详情弹窗**:点卡片「👁 详情」弹出全文查看(超长内容限高 52vh 内滚动),带复制与修改入口,附时间线(创建 / 上次修改 / 最近使用);含 {变量} 的模板会在弹窗里标出变量清单,复制时自动进入填充面板
|
|
21
24
|
- **页面直写(双笔)**:页面增删改直接写入 data/prompts.json(与自动备份共用同一目录授权);未授权时自动降级——生成操作指令复制到剪贴板,粘贴给 AI 落盘
|
|
22
25
|
- **侧栏局部滚动**:分组较多时,左侧「收藏 + 分组列表」区域独立滚动(窄滚动条),「全部」「+ 新建分组」「锦囊用法」固定不滚;窄屏下自动恢复平铺排列
|
|
23
|
-
- **批量整理入囊**:把一堆文字/文件交给 AI
|
|
26
|
+
- **批量整理入囊**:把一堆文字/文件交给 AI,或说「把最近对话框内容整理进锦囊」——两段确认:先定条目(AI 默认智能打标——每条自动配 1-3 个语义标签,可改可删;含具体词的可泛化为 {变量} 插值,附改写示例)→ 再定分组(归组理由 + 装不下的推荐新分组名),都确认后一次性写入;条目少(≤3 条)两段合一
|
|
27
|
+
- **标签全交互**:点标签即筛选(顶栏胶囊一键清除,再点取消,切分组自动清除,与搜索叠加);标签悬停「✕」删、「+」加(最多 3 个),授权目录即写即存,未授权指令交 AI
|
|
28
|
+
- **导入 / 导出 JSON**:顶栏「⤓ 导出」一键下载全量数据为 JSON 备份文件(文件名带时间戳);「⤒ 导入」选择 JSON 文件整库覆盖(导入前自动备份、可恢复);未授权目录时导出仍可用、导入需先授权
|
|
29
|
+
- **分组拖拽排序**:左侧分组条拖拽即可重排分组顺序(授权目录即写即存;未授权时生成「请把锦囊分组顺序调整为…」指令复制给 AI 落盘)
|
|
24
30
|
- **四种排序**:最新添加(按添加时间倒序,全时间范围)/ 最近使用 / 使用频率 / 手动顺序;排序选择会自动记住,下次打开不变
|
|
25
31
|
- **使用统计**:每次点复制,页面自动记录该提示词的最近使用时间与累计次数(存浏览器本地),供「最近使用」「使用频率」排序使用,数据文件不写这些字段
|
|
26
32
|
- **修改时间**:每次修改提示词(页面直写或 AI 代笔),数据文件会记下 updatedAt 修改时间,详情弹窗时间线可见;新增不写、仅排序不写
|
|
@@ -29,4 +35,5 @@
|
|
|
29
35
|
## 提醒
|
|
30
36
|
|
|
31
37
|
- 数据在 data/prompts.json(备份在 backup/ 目录);迁移/备份复制 data/ 与 backup/ 两个目录即可
|
|
38
|
+
- 「⤓ 导出」的 JSON 文件可直接在另一台电脑「⤒ 导入」整库恢复(含分组与标签)
|
|
32
39
|
- 页面样式与脚本升级由仓库 reference.html 重新复制完成,不影响你的数据
|
|
@@ -15,7 +15,7 @@ BACKUP_DIR: backup
|
|
|
15
15
|
INIT_DATA: example
|
|
16
16
|
|
|
17
17
|
# 页面主题(初始化时写入页面根标签 data-theme;页面右下角换肤坞可随时切换)
|
|
18
|
-
# 可选:gold 暖棕金(默认)/ tech 深蓝科技 / mono
|
|
18
|
+
# 可选:gold 暖棕金(默认)/ tech 深蓝科技 / mono IDEA 黑亮 / light IDEA 白亮 / mint 薄荷绿
|
|
19
19
|
THEME: gold
|
|
20
20
|
|
|
21
21
|
# 初始化/落盘前是否先确认目标目录
|
package/spec-doc2spec/SKILL.md
CHANGED
|
@@ -10,6 +10,7 @@ description: >
|
|
|
10
10
|
跨系统适配 macOS / Windows / Linux(Pandoc 安装、EMF 转换工具链探测、路径引用)。
|
|
11
11
|
支持 .docx(Pandoc 转换)/ .md(直接读取);.pdf 走 pdftotext 文本提取(无图)或提示先转 Word。
|
|
12
12
|
不处理一般性的文档内容讨论(如「帮我看看这份文档讲了什么」),只处理「文档 → 需求规格」的转换任务。
|
|
13
|
+
用户询问用法(doc2spec 怎么用/使用说明/能干什么)时走使用说明应答:读 resources/usage-guide.md 原样输出(首行标题改为「doc2spec 使用指南」),不执行任何转换命令。
|
|
13
14
|
allowed-tools: ["Bash", "Read", "Write", "Edit"]
|
|
14
15
|
disable-model-invocation: false
|
|
15
16
|
---
|
package/spec-spec2doc/SKILL.md
CHANGED
|
@@ -9,6 +9,7 @@ description: >
|
|
|
9
9
|
引擎可配置 PDF_ENGINE。输出目录默认与源文档同目录,可配置 OUTPUT_DIR。
|
|
10
10
|
跨系统适配 macOS / Windows / Linux(Pandoc/LaTeX 安装、中文字体探测、Chrome 路径探测)。
|
|
11
11
|
不处理一般性的文档格式转换(如「把这个 txt 转成 Word」),只处理「规格 → 交付文档」的转换任务。
|
|
12
|
+
用户询问用法(spec2doc 怎么用/使用说明/能干什么)时走使用说明应答:读 resources/usage-guide.md 原样输出(首行标题改为「spec2doc 使用指南」),不执行任何转换命令。
|
|
12
13
|
allowed-tools: ["Bash", "Read", "Write", "Edit"]
|
|
13
14
|
disable-model-invocation: false
|
|
14
15
|
---
|
package/weekly-report/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: weekly-report
|
|
3
|
-
description: 生成工作周报(默认本周结论+本周任务进度/下周计划/风险阻塞点结构,中文顿号序号,1D=8H),适配各行业(内置 12 行业职业词典,可指定角色身份)。数据来源灵活:直接口述、给一段文字、发文件(Word/PDF/Excel/PPT 等)或图片,都能整理成周报。支持自定义模板(可永久或临时指定)、周结束日可配置(默认周五,可改周日等)。支持自然语言定位周(本周/上周/10月第2周/10月20号所在周等)。当用户请求写周报、本周周报、上周周报、生成周报、/weekly-report
|
|
3
|
+
description: 生成工作周报(默认本周结论+本周任务进度/下周计划/风险阻塞点结构,中文顿号序号,1D=8H),适配各行业(内置 12 行业职业词典,可指定角色身份)。数据来源灵活:直接口述、给一段文字、发文件(Word/PDF/Excel/PPT 等)或图片,都能整理成周报。支持自定义模板(可永久或临时指定)、周结束日可配置(默认周五,可改周日等)。支持自然语言定位周(本周/上周/10月第2周/10月20号所在周等)。当用户请求写周报、本周周报、上周周报、生成周报、/weekly-report,或询问周报用法(周报怎么用/周报使用说明/周报有哪些使用方式)时使用。用户说「写总结/工作总结/写个汇报」等未言明周期的词时,先 AskUserQuestion 分流(日报/周报/年报)再执行,不擅自默认。
|
|
4
4
|
allowed-tools: Bash, Read, Write
|
|
5
5
|
disable-model-invocation: false
|
|
6
6
|
---
|
|
@@ -11,6 +11,7 @@ disable-model-invocation: false
|
|
|
11
11
|
|
|
12
12
|
## 生成流程
|
|
13
13
|
|
|
14
|
+
0.5 **周期歧义分流**:用户说「写总结/工作总结/写个汇报/做一份总结」等未言明周期的词 → AskUserQuestion 三选一(日报/周报/年报)确认周期再继续,不擅自默认
|
|
14
15
|
0. **读用户配置**(DISK/FORMATS/DIR/OPEN_HTML/THEME/TEMPLATE/ROLE/CONFIRM/CONFIG_VERSION、自定义模板)→ 先 Read 同目录 `user-config.md`
|
|
15
16
|
1. **解析周**(自然语言 → 目标周:周一起点、WEEK_END 结束日)→ 读 `resources/date-parsing.md`
|
|
16
17
|
2. **收集数据**(多源:会话口述 / 文字 / 文件 / 图片 / 代码提交记录,合并去重;同取上周数据供概览环比)→ 读 `resources/data-collection.md`
|
|
@@ -23,7 +24,7 @@ disable-model-invocation: false
|
|
|
23
24
|
|
|
24
25
|
**执行本 skill 前必须先 Read 同目录 `user-config.md`**:默认配置(DISK/FORMATS/DIR/OPEN_HTML/THEME/TEMPLATE/ROLE/CONFIRM/CONFIG_VERSION)与自定义模板都在该文件中,以它为准。升级技能时 user-config.md 不会被覆盖,你的修改永久保留;官方更新配置时另存 `user-config.md.upstream` 对照文件,可按需手动合并新配置点。
|
|
25
26
|
|
|
26
|
-
- **THEME**:html 页面主题,tech 深蓝科技(默认)/ biz 浅色商务 / mono
|
|
27
|
+
- **THEME**:html 页面主题,tech 深蓝科技(默认)/ biz 浅色商务 / mono IDEA 黑亮 / light IDEA 白亮 / warm 温暖渐变;生成时写 `<html data-theme="THEME值">` 定默认,页面右下角换肤坞随点随换(localStorage 记忆、?shot 截图模式与打印隐藏)
|
|
27
28
|
|
|
28
29
|
## 配置版本机制(升级保护)
|
|
29
30
|
|
|
@@ -50,5 +51,5 @@ disable-model-invocation: false
|
|
|
50
51
|
- 本周结论三句先行(最重要的结果/值得处理的变化/下周优先的动作,与 TL;DR 呼应不重复);四段兜底写「暂无」;计划点带进度百分比与预估用时+完成标准(口述有时必写);风险阻塞点四环(问题+影响+建议+责任与时间,第四环口述有时必写)
|
|
51
52
|
- 用时单位 X.XD(天,1D=8H),估算值注明「约」;落盘子目录名 = 当周最后一天(WEEK_END)日期
|
|
52
53
|
- 数字凡有对比基准必带;业务结果指标优先于提交统计;流水无主语、结论判断归因处允许「我」;落笔前五问自检(结论/基准/闭环/可验证/归属)
|
|
53
|
-
-
|
|
54
|
+
- 页面主题五选一(tech 深蓝科技默认 / biz 浅色商务 / mono IDEA 黑亮 / light IDEA 白亮 / warm 温暖渐变):THEME 配置定默认,右下角换肤坞随点随换
|
|
54
55
|
- 完整规则(聚合来源 / 纯文字模式 / 写作风格约束 / 使用提示)见 `resources/content-rules.md`
|