@oh-story/dsh 0.1.14 → 0.1.15
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/README.md +4 -4
- package/lib/oh-story/manifest.json +72 -72
- package/lib/oh-story/skills/story/SKILL.md +1 -1
- package/lib/oh-story/skills/story/VERSION +1 -1
- package/lib/oh-story/skills/story/references/author-memory-maintenance.md +2 -2
- package/lib/oh-story/skills/story/references/author-memory.md +4 -4
- package/lib/oh-story/skills/story/scripts/author_memory_commit.py +61 -58
- package/lib/oh-story/skills/story-deslop/SKILL.md +1 -1
- package/lib/oh-story/skills/story-deslop/references/agent-calls.md +1 -1
- package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +2 -2
- package/lib/oh-story/skills/story-deslop/references/author-memory.md +4 -4
- package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +61 -58
- package/lib/oh-story/skills/story-long-scan/SKILL.md +2 -7
- package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +11 -1
- package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +12 -2
- package/lib/oh-story/skills/story-long-write/SKILL.md +1 -1
- package/lib/oh-story/skills/story-long-write/references/agent-calls.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +2 -2
- package/lib/oh-story/skills/story-long-write/references/author-memory.md +4 -4
- package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +1 -0
- package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +2 -1
- package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +1 -1
- package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +61 -58
- package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +87 -20
- package/lib/oh-story/skills/story-review/SKILL.md +1 -1
- package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +2 -2
- package/lib/oh-story/skills/story-review/references/author-memory.md +4 -4
- package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +61 -58
- package/lib/oh-story/skills/story-short-write/SKILL.md +1 -1
- package/lib/oh-story/skills/story-short-write/references/agent-calls.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +2 -2
- package/lib/oh-story/skills/story-short-write/references/author-memory.md +4 -4
- package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +61 -58
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
`oh-story-dsh` 是基于 DeepSeek Harness(DSH)构建的社区小说、短剧、互动游戏与视频解说创作插件,提供:
|
|
8
8
|
|
|
9
|
-
- 13 个 Oh Story 0.8.
|
|
9
|
+
- 13 个 Oh Story 0.8.5 小说 Skills 与 7 个专业 Roles;
|
|
10
10
|
- 11 个 Drama Skills 0.8.1 短剧流程,每集按请求维护最多五份 creator-first Markdown,成片装配另写《剪辑单.md》;
|
|
11
11
|
- 7 个 NovelToGame 0.5.0 Skills、`game-adaptations/<project>` 产物协议与《金瓶梅 · 风月总账》ADV 可玩构建;
|
|
12
12
|
- 7 个 video-recap-skills 0.6.2 Skills(3 个用户入口)、`video-recaps/<project>` 项目约定与轻量视频预览工作台;
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
安装命令会临时提供 pnpm;只安装 Node.js 的机器也能执行。DSH 的 `plugin add` 内部需要 pnpm,单独运行 `npx @deepseek-ai/dsh ... plugin add` 不会自动补上它。
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
npx -y --package pnpm@11.7.0 --package @deepseek-ai/dsh@0.2.0-rc.2 dsh plugin --profile web add @oh-story/dsh@0.1.
|
|
26
|
+
npx -y --package pnpm@11.7.0 --package @deepseek-ai/dsh@0.2.0-rc.2 dsh plugin --profile web add @oh-story/dsh@0.1.15 &&
|
|
27
27
|
npx -y @deepseek-ai/dsh@0.2.0-rc.2 web
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
也可以直接安装 GitHub Release 中的预构建包:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
npx -y --package pnpm@11.7.0 --package @deepseek-ai/dsh@0.2.0-rc.2 dsh plugin --profile web add https://github.com/zenstory-ai/oh-story-dsh/releases/download/v0.1.
|
|
33
|
+
npx -y --package pnpm@11.7.0 --package @deepseek-ai/dsh@0.2.0-rc.2 dsh plugin --profile web add https://github.com/zenstory-ai/oh-story-dsh/releases/download/v0.1.15/oh-story-dsh-0.1.15.tgz &&
|
|
34
34
|
npx -y @deepseek-ai/dsh@0.2.0-rc.2 web
|
|
35
35
|
```
|
|
36
36
|
|
|
@@ -88,7 +88,7 @@ Drama Skills 0.6.0 不支持把 v0.5 结构化项目原地升级为 creator-firs
|
|
|
88
88
|
插件装进哪个 profile,那个 profile 的每个 Session 就都会加载创作 Skills;工作台只在有创作项目时显示。想让原版 `web` 保持干净、只在创作时打开工作台,就装进独立 profile:
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
|
-
npx -y --package pnpm@11.7.0 --package @deepseek-ai/dsh@0.2.0-rc.2 dsh plugin --profile story add @oh-story/dsh@0.1.
|
|
91
|
+
npx -y --package pnpm@11.7.0 --package @deepseek-ai/dsh@0.2.0-rc.2 dsh plugin --profile story add @oh-story/dsh@0.1.15
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
新 profile 默认没有界面。编辑 `~/.dsh/profiles/story/package.json`,把 `dsh.profile.bundles` 改成 `["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "@oh-story/dsh"]`。
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"upstream": {
|
|
4
4
|
"repository": "git@github.com:zenstory-ai/oh-story-claudecode.git",
|
|
5
|
-
"commit": "
|
|
6
|
-
"releaseVersion": "0.8.
|
|
5
|
+
"commit": "2cf7be61b139f3852c82f981a7ff4eed2aaf5926",
|
|
6
|
+
"releaseVersion": "0.8.5",
|
|
7
7
|
"agentsVersion": 34
|
|
8
8
|
},
|
|
9
|
-
"generatedAt": "2026-
|
|
9
|
+
"generatedAt": "2026-10-10T12:00:01.414Z",
|
|
10
10
|
"skills": [
|
|
11
11
|
"browser-cdp",
|
|
12
12
|
"story",
|
|
@@ -89,13 +89,13 @@
|
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
91
|
"path": "skills/story-deslop/SKILL.md",
|
|
92
|
-
"sha256": "
|
|
93
|
-
"bytes":
|
|
92
|
+
"sha256": "2b5173dec3f21de13057c85f1d4e421506409657d56289667d3ba14f9802355c",
|
|
93
|
+
"bytes": 20402
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
96
|
"path": "skills/story-deslop/references/agent-calls.md",
|
|
97
|
-
"sha256": "
|
|
98
|
-
"bytes":
|
|
97
|
+
"sha256": "a85729f92fe36713376a7ea67b7612bff244fcef632450432e6cef821c5fd8a1",
|
|
98
|
+
"bytes": 1669
|
|
99
99
|
},
|
|
100
100
|
{
|
|
101
101
|
"path": "skills/story-deslop/references/anti-ai-writing.md",
|
|
@@ -104,13 +104,13 @@
|
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
"path": "skills/story-deslop/references/author-memory-maintenance.md",
|
|
107
|
-
"sha256": "
|
|
108
|
-
"bytes":
|
|
107
|
+
"sha256": "9ea57cc93f70ec7f1df6df03e4c3605e0937d4a95c89c01d230b391082eaacda",
|
|
108
|
+
"bytes": 9177
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
"path": "skills/story-deslop/references/author-memory.md",
|
|
112
|
-
"sha256": "
|
|
113
|
-
"bytes":
|
|
112
|
+
"sha256": "832171fac5265e613ea55eac028c1ba90da2e907eb60bb8cc6c7c70a7e2a7ba1",
|
|
113
|
+
"bytes": 11655
|
|
114
114
|
},
|
|
115
115
|
{
|
|
116
116
|
"path": "skills/story-deslop/references/banned-words.md",
|
|
@@ -129,8 +129,8 @@
|
|
|
129
129
|
},
|
|
130
130
|
{
|
|
131
131
|
"path": "skills/story-deslop/scripts/author_memory_commit.py",
|
|
132
|
-
"sha256": "
|
|
133
|
-
"bytes":
|
|
132
|
+
"sha256": "cc1e0d957f3eea9e04d679423ecb511b5eb7d8dc5bfcaa87196cfe258e2103d5",
|
|
133
|
+
"bytes": 80004
|
|
134
134
|
},
|
|
135
135
|
{
|
|
136
136
|
"path": "skills/story-deslop/scripts/check-ai-patterns.js",
|
|
@@ -354,8 +354,8 @@
|
|
|
354
354
|
},
|
|
355
355
|
{
|
|
356
356
|
"path": "skills/story-long-scan/SKILL.md",
|
|
357
|
-
"sha256": "
|
|
358
|
-
"bytes":
|
|
357
|
+
"sha256": "ef2c3b3ae4484b470cf96cf37ffb1c9e89c9f29977903aae7216151575e7ca36",
|
|
358
|
+
"bytes": 10396
|
|
359
359
|
},
|
|
360
360
|
{
|
|
361
361
|
"path": "skills/story-long-scan/references/genre-trends.md",
|
|
@@ -379,13 +379,13 @@
|
|
|
379
379
|
},
|
|
380
380
|
{
|
|
381
381
|
"path": "skills/story-long-scan/references/platform-qidian.md",
|
|
382
|
-
"sha256": "
|
|
383
|
-
"bytes":
|
|
382
|
+
"sha256": "ed651d5db0aeee1707ddc995cd123493d470aabf6eade284d99041af90988889",
|
|
383
|
+
"bytes": 3214
|
|
384
384
|
},
|
|
385
385
|
{
|
|
386
386
|
"path": "skills/story-long-scan/references/platform-qimao.md",
|
|
387
|
-
"sha256": "
|
|
388
|
-
"bytes":
|
|
387
|
+
"sha256": "79cd399e169817b7b78ff51a4639f5e86e0172f0ef5b940728ea84bf75600908",
|
|
388
|
+
"bytes": 2436
|
|
389
389
|
},
|
|
390
390
|
{
|
|
391
391
|
"path": "skills/story-long-scan/references/publishing-guide.md",
|
|
@@ -404,8 +404,8 @@
|
|
|
404
404
|
},
|
|
405
405
|
{
|
|
406
406
|
"path": "skills/story-long-scan/scripts/aggregate-rank.js",
|
|
407
|
-
"sha256": "
|
|
408
|
-
"bytes":
|
|
407
|
+
"sha256": "e4276059de456262aee30e5ce43777a9e702534b3712f684495ac75177cfa124",
|
|
408
|
+
"bytes": 28225
|
|
409
409
|
},
|
|
410
410
|
{
|
|
411
411
|
"path": "skills/story-long-scan/scripts/cdp-utils.js",
|
|
@@ -429,23 +429,23 @@
|
|
|
429
429
|
},
|
|
430
430
|
{
|
|
431
431
|
"path": "skills/story-long-scan/scripts/qidian-rank-scraper.js",
|
|
432
|
-
"sha256": "
|
|
433
|
-
"bytes":
|
|
432
|
+
"sha256": "6e0a6cee1446a13876abddb4e048de5a31941095f8f0ee1f410aefa91e4a6e00",
|
|
433
|
+
"bytes": 48445
|
|
434
434
|
},
|
|
435
435
|
{
|
|
436
436
|
"path": "skills/story-long-scan/scripts/qimao-rank-scraper.js",
|
|
437
|
-
"sha256": "
|
|
438
|
-
"bytes":
|
|
437
|
+
"sha256": "ae276405cf3d85c451cd9da4ee4dba9097f4710f5dc4dfd88fcf9c9cddb850be",
|
|
438
|
+
"bytes": 35541
|
|
439
439
|
},
|
|
440
440
|
{
|
|
441
441
|
"path": "skills/story-long-write/SKILL.md",
|
|
442
|
-
"sha256": "
|
|
443
|
-
"bytes":
|
|
442
|
+
"sha256": "de63533d8150367b2fce4bb1209158fde64b4e1739e0e9082160f81716b8dcdc",
|
|
443
|
+
"bytes": 14551
|
|
444
444
|
},
|
|
445
445
|
{
|
|
446
446
|
"path": "skills/story-long-write/references/agent-calls.md",
|
|
447
|
-
"sha256": "
|
|
448
|
-
"bytes":
|
|
447
|
+
"sha256": "31e54e0b5f1cff9ccea509a3acb9b1f1429e766b18704e7783e49c5eec4831b0",
|
|
448
|
+
"bytes": 7524
|
|
449
449
|
},
|
|
450
450
|
{
|
|
451
451
|
"path": "skills/story-long-write/references/anti-ai-writing.md",
|
|
@@ -459,13 +459,13 @@
|
|
|
459
459
|
},
|
|
460
460
|
{
|
|
461
461
|
"path": "skills/story-long-write/references/author-memory-maintenance.md",
|
|
462
|
-
"sha256": "
|
|
463
|
-
"bytes":
|
|
462
|
+
"sha256": "9ea57cc93f70ec7f1df6df03e4c3605e0937d4a95c89c01d230b391082eaacda",
|
|
463
|
+
"bytes": 9177
|
|
464
464
|
},
|
|
465
465
|
{
|
|
466
466
|
"path": "skills/story-long-write/references/author-memory.md",
|
|
467
|
-
"sha256": "
|
|
468
|
-
"bytes":
|
|
467
|
+
"sha256": "832171fac5265e613ea55eac028c1ba90da2e907eb60bb8cc6c7c70a7e2a7ba1",
|
|
468
|
+
"bytes": 11655
|
|
469
469
|
},
|
|
470
470
|
{
|
|
471
471
|
"path": "skills/story-long-write/references/banned-words.md",
|
|
@@ -834,13 +834,13 @@
|
|
|
834
834
|
},
|
|
835
835
|
{
|
|
836
836
|
"path": "skills/story-long-write/references/workflow-chapter.md",
|
|
837
|
-
"sha256": "
|
|
838
|
-
"bytes":
|
|
837
|
+
"sha256": "3dc19a1f5f77d80ce3a353f9bc91af0ae054d90ad6b01ecc8a45b019a9f3e866",
|
|
838
|
+
"bytes": 14839
|
|
839
839
|
},
|
|
840
840
|
{
|
|
841
841
|
"path": "skills/story-long-write/references/workflow-daily.md",
|
|
842
|
-
"sha256": "
|
|
843
|
-
"bytes":
|
|
842
|
+
"sha256": "7df54479d7ed0897b12f0cf3e209f372b9c48abfab3d4cb9c2e5463936648855",
|
|
843
|
+
"bytes": 7761
|
|
844
844
|
},
|
|
845
845
|
{
|
|
846
846
|
"path": "skills/story-long-write/references/workflow-outline.md",
|
|
@@ -864,8 +864,8 @@
|
|
|
864
864
|
},
|
|
865
865
|
{
|
|
866
866
|
"path": "skills/story-long-write/references/writer-prompt-fallback.md",
|
|
867
|
-
"sha256": "
|
|
868
|
-
"bytes":
|
|
867
|
+
"sha256": "06836efcca3d8de8b6b6bd53f6e65b2b5154d5d697af6e081a0d5c11e3da1632",
|
|
868
|
+
"bytes": 3888
|
|
869
869
|
},
|
|
870
870
|
{
|
|
871
871
|
"path": "skills/story-long-write/references/writing-craft.md",
|
|
@@ -874,8 +874,8 @@
|
|
|
874
874
|
},
|
|
875
875
|
{
|
|
876
876
|
"path": "skills/story-long-write/scripts/author_memory_commit.py",
|
|
877
|
-
"sha256": "
|
|
878
|
-
"bytes":
|
|
877
|
+
"sha256": "cc1e0d957f3eea9e04d679423ecb511b5eb7d8dc5bfcaa87196cfe258e2103d5",
|
|
878
|
+
"bytes": 80004
|
|
879
879
|
},
|
|
880
880
|
{
|
|
881
881
|
"path": "skills/story-long-write/scripts/build_architect_brief.py",
|
|
@@ -884,8 +884,8 @@
|
|
|
884
884
|
},
|
|
885
885
|
{
|
|
886
886
|
"path": "skills/story-long-write/scripts/build_writer_prompt.py",
|
|
887
|
-
"sha256": "
|
|
888
|
-
"bytes":
|
|
887
|
+
"sha256": "2bbe62ea381ec87c740e6870565cf0bd2ccfabac4e1b5b9850eca30533e543dc",
|
|
888
|
+
"bytes": 37169
|
|
889
889
|
},
|
|
890
890
|
{
|
|
891
891
|
"path": "skills/story-long-write/scripts/check-ai-patterns.js",
|
|
@@ -939,8 +939,8 @@
|
|
|
939
939
|
},
|
|
940
940
|
{
|
|
941
941
|
"path": "skills/story-review/SKILL.md",
|
|
942
|
-
"sha256": "
|
|
943
|
-
"bytes":
|
|
942
|
+
"sha256": "bef847a7d56192aaab3817cc139dc5e0826ea8b7dd24cd4469bf595a0d6843ff",
|
|
943
|
+
"bytes": 21741
|
|
944
944
|
},
|
|
945
945
|
{
|
|
946
946
|
"path": "skills/story-review/references/agent-prompts.md",
|
|
@@ -954,13 +954,13 @@
|
|
|
954
954
|
},
|
|
955
955
|
{
|
|
956
956
|
"path": "skills/story-review/references/author-memory-maintenance.md",
|
|
957
|
-
"sha256": "
|
|
958
|
-
"bytes":
|
|
957
|
+
"sha256": "9ea57cc93f70ec7f1df6df03e4c3605e0937d4a95c89c01d230b391082eaacda",
|
|
958
|
+
"bytes": 9177
|
|
959
959
|
},
|
|
960
960
|
{
|
|
961
961
|
"path": "skills/story-review/references/author-memory.md",
|
|
962
|
-
"sha256": "
|
|
963
|
-
"bytes":
|
|
962
|
+
"sha256": "832171fac5265e613ea55eac028c1ba90da2e907eb60bb8cc6c7c70a7e2a7ba1",
|
|
963
|
+
"bytes": 11655
|
|
964
964
|
},
|
|
965
965
|
{
|
|
966
966
|
"path": "skills/story-review/references/banned-words.md",
|
|
@@ -1039,8 +1039,8 @@
|
|
|
1039
1039
|
},
|
|
1040
1040
|
{
|
|
1041
1041
|
"path": "skills/story-review/scripts/author_memory_commit.py",
|
|
1042
|
-
"sha256": "
|
|
1043
|
-
"bytes":
|
|
1042
|
+
"sha256": "cc1e0d957f3eea9e04d679423ecb511b5eb7d8dc5bfcaa87196cfe258e2103d5",
|
|
1043
|
+
"bytes": 80004
|
|
1044
1044
|
},
|
|
1045
1045
|
{
|
|
1046
1046
|
"path": "skills/story-review/scripts/check-ai-patterns.js",
|
|
@@ -1579,8 +1579,8 @@
|
|
|
1579
1579
|
},
|
|
1580
1580
|
{
|
|
1581
1581
|
"path": "skills/story-short-scan/scripts/aggregate-rank.js",
|
|
1582
|
-
"sha256": "
|
|
1583
|
-
"bytes":
|
|
1582
|
+
"sha256": "e4276059de456262aee30e5ce43777a9e702534b3712f684495ac75177cfa124",
|
|
1583
|
+
"bytes": 28225
|
|
1584
1584
|
},
|
|
1585
1585
|
{
|
|
1586
1586
|
"path": "skills/story-short-scan/scripts/cdp-utils.js",
|
|
@@ -1599,23 +1599,23 @@
|
|
|
1599
1599
|
},
|
|
1600
1600
|
{
|
|
1601
1601
|
"path": "skills/story-short-write/SKILL.md",
|
|
1602
|
-
"sha256": "
|
|
1603
|
-
"bytes":
|
|
1602
|
+
"sha256": "8160ca32701f21f5922c22cb7e32c095d6aadd86b7bf28da4ecb347835bdfaef",
|
|
1603
|
+
"bytes": 11154
|
|
1604
1604
|
},
|
|
1605
1605
|
{
|
|
1606
1606
|
"path": "skills/story-short-write/references/agent-calls.md",
|
|
1607
|
-
"sha256": "
|
|
1608
|
-
"bytes":
|
|
1607
|
+
"sha256": "10486caa8d4d1cd28031364fa22b84d5e354c73db738db01467c11801d304567",
|
|
1608
|
+
"bytes": 2261
|
|
1609
1609
|
},
|
|
1610
1610
|
{
|
|
1611
1611
|
"path": "skills/story-short-write/references/author-memory-maintenance.md",
|
|
1612
|
-
"sha256": "
|
|
1613
|
-
"bytes":
|
|
1612
|
+
"sha256": "9ea57cc93f70ec7f1df6df03e4c3605e0937d4a95c89c01d230b391082eaacda",
|
|
1613
|
+
"bytes": 9177
|
|
1614
1614
|
},
|
|
1615
1615
|
{
|
|
1616
1616
|
"path": "skills/story-short-write/references/author-memory.md",
|
|
1617
|
-
"sha256": "
|
|
1618
|
-
"bytes":
|
|
1617
|
+
"sha256": "832171fac5265e613ea55eac028c1ba90da2e907eb60bb8cc6c7c70a7e2a7ba1",
|
|
1618
|
+
"bytes": 11655
|
|
1619
1619
|
},
|
|
1620
1620
|
{
|
|
1621
1621
|
"path": "skills/story-short-write/references/banned-words.md",
|
|
@@ -1794,8 +1794,8 @@
|
|
|
1794
1794
|
},
|
|
1795
1795
|
{
|
|
1796
1796
|
"path": "skills/story-short-write/scripts/author_memory_commit.py",
|
|
1797
|
-
"sha256": "
|
|
1798
|
-
"bytes":
|
|
1797
|
+
"sha256": "cc1e0d957f3eea9e04d679423ecb511b5eb7d8dc5bfcaa87196cfe258e2103d5",
|
|
1798
|
+
"bytes": 80004
|
|
1799
1799
|
},
|
|
1800
1800
|
{
|
|
1801
1801
|
"path": "skills/story-short-write/scripts/check-ai-patterns.js",
|
|
@@ -1834,28 +1834,28 @@
|
|
|
1834
1834
|
},
|
|
1835
1835
|
{
|
|
1836
1836
|
"path": "skills/story/SKILL.md",
|
|
1837
|
-
"sha256": "
|
|
1838
|
-
"bytes":
|
|
1837
|
+
"sha256": "e12c2c6dd896f1981767f9e52b0ed244db736d819e9dddde3f5fcc110c8f41f6",
|
|
1838
|
+
"bytes": 12423
|
|
1839
1839
|
},
|
|
1840
1840
|
{
|
|
1841
1841
|
"path": "skills/story/VERSION",
|
|
1842
|
-
"sha256": "
|
|
1842
|
+
"sha256": "a92b0248b8baacfaf54e8d59caaca7d5e6b9a0a25ee140c81ea973b4ae25142f",
|
|
1843
1843
|
"bytes": 6
|
|
1844
1844
|
},
|
|
1845
1845
|
{
|
|
1846
1846
|
"path": "skills/story/references/author-memory-maintenance.md",
|
|
1847
|
-
"sha256": "
|
|
1848
|
-
"bytes":
|
|
1847
|
+
"sha256": "9ea57cc93f70ec7f1df6df03e4c3605e0937d4a95c89c01d230b391082eaacda",
|
|
1848
|
+
"bytes": 9177
|
|
1849
1849
|
},
|
|
1850
1850
|
{
|
|
1851
1851
|
"path": "skills/story/references/author-memory.md",
|
|
1852
|
-
"sha256": "
|
|
1853
|
-
"bytes":
|
|
1852
|
+
"sha256": "832171fac5265e613ea55eac028c1ba90da2e907eb60bb8cc6c7c70a7e2a7ba1",
|
|
1853
|
+
"bytes": 11655
|
|
1854
1854
|
},
|
|
1855
1855
|
{
|
|
1856
1856
|
"path": "skills/story/scripts/author_memory_commit.py",
|
|
1857
|
-
"sha256": "
|
|
1858
|
-
"bytes":
|
|
1857
|
+
"sha256": "cc1e0d957f3eea9e04d679423ecb511b5eb7d8dc5bfcaa87196cfe258e2103d5",
|
|
1858
|
+
"bytes": 80004
|
|
1859
1859
|
}
|
|
1860
1860
|
]
|
|
1861
1861
|
}
|
|
@@ -17,7 +17,7 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
|
|
|
17
17
|
| 写短篇 | 短篇、盐言、一万字 | `/story-short-write` |
|
|
18
18
|
| 长篇拆文 | 拆文、分析这本书、黄金三章、灵感库、跨书灵感聚合 | `/story-long-analyze` |
|
|
19
19
|
| 短篇拆文 | 拆短篇、分析这个故事 | `/story-short-analyze` |
|
|
20
|
-
| 长篇扫榜 |
|
|
20
|
+
| 长篇扫榜 | 长篇排行、什么火、新书在冒什么、起点/番茄/晋江/七猫长篇 | `/story-long-scan` |
|
|
21
21
|
| 选题决策 | 写什么能爆、帮我选题、选题方向 | `/story-long-scan` |
|
|
22
22
|
| 短篇扫榜 | 短篇排行、知乎盐言排行 | `/story-short-scan` |
|
|
23
23
|
| 去 AI 味 | 去 AI 味、太 AI、去味 | `/story-deslop` |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.8.
|
|
1
|
+
0.8.5
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
|
|
33
33
|
## 注入预算与容量
|
|
34
34
|
|
|
35
|
-
- **写入不因注入预算失败**:`record` / `commit` 照常成功、给回执;工具按上表四类任务组合估算最坏查询情形(全局条目+各 scope
|
|
35
|
+
- **写入不因注入预算失败**:`record` / `commit` 照常成功、给回执;工具按上表四类任务组合估算最坏查询情形(全局条目+各 scope 维度最重的单一切片,切片按大小写无关归并、轻重按执行者真正读到的行算,与真实查询同一把尺),装不进 2048 字节的组合在返回的 `warnings` 里点名将被略过的条目及其断言首句。2048 字节量的是交给执行者的 `lines`(每条一行「- 断言(编号)」,含换行),不是 JSON 外壳:`items` 里的编号、类型、范围只给主会话和脚本判断用,不进执行者 prompt。
|
|
36
36
|
- 写入落盘后另一级 store 读不出来(书目录不存在、`--book` 与书级记录不符等)也照常给回执,`warnings` 注明本次提醒没算上它。写书级条目时「本书+全局」按实际条目精确计算;写项目级条目时只看得到项目级 store,顺手传 `--book-root` 就把当前这本书也算进提醒。
|
|
37
|
-
- 查询按 **重要度 → 本书例外 → 最近更新** 排序装填(同一范围的条目必在同一 store,「最近」按该 store 的修订号比,不跨 store 比较),先丢的恒是重要度较低的条目——`importance` 决定超编时谁留在 prompt 里。装不下的条目跳过而不中断(一条长的不挡后面的短条),漏下的 ID
|
|
37
|
+
- 查询按 **重要度 → 本书例外 → 最近更新** 排序装填(同一范围的条目必在同一 store,「最近」按该 store 的修订号比,不跨 store 比较),先丢的恒是重要度较低的条目——`importance` 决定超编时谁留在 prompt 里。装不下的条目跳过而不中断(一条长的不挡后面的短条),漏下的 ID 按同一优先级全数报进 `omitted_ids`,断言首句报进 `omitted_summaries`、重要度报进 `omitted_importance`,供主会话用原话告诉作者哪几条没带上;长篇写章由组装脚本把这句话拼好写进核对报告,章末汇报照模板原样说。
|
|
38
38
|
- 注入预算之外还有一道硬上限:`作者画像.md` 超过 12288 字节时写入会直接失败并要求先整理。active 条目攒到几十上百条才会碰到(远在注入预算之后),碰到就走「整理作者记忆」;`forget` 这类减量操作在满编时照常可用。
|
|
39
39
|
|
|
40
40
|
## 整理作者记忆
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
按表达维度取最窄适用要求:低优先级只补缺项,不与高优先级要求并列执行。通用 references 自称“必须/禁用”不改变此顺序;审稿不因作者有意采用的表达本身扣分,真实可读性与因果问题仍照常评价。
|
|
17
17
|
|
|
18
|
-
作者记忆不能把本书事实写进 `.story
|
|
18
|
+
作者记忆不能把本书事实写进 `.story/作者记忆/`,不能降低审稿 rubric,也不能让去 AI 味改动剧情意图。小说事实继续由各书的 `追踪/` 和 `设定/` 管理。
|
|
19
19
|
|
|
20
20
|
## 存放与路由
|
|
21
21
|
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
|
|
29
29
|
## 查询
|
|
30
30
|
|
|
31
|
-
各 skill 入口已写好本任务的 `query` 命令(长篇正文由组装脚本代查);没写命令的长篇设定、大纲等任务查 `story_design` + `workflow` + `interaction`,结果只给主会话、不传正文 agent。四类任务的映射表见维护文件。state 存在才查(两级都不存在时返回空结果、零写入);结果合并项目级与 `--book-root` 所指书级(不传就拿不到本书条目),`--kind`
|
|
31
|
+
各 skill 入口已写好本任务的 `query` 命令(长篇正文由组装脚本代查);没写命令的长篇设定、大纲等任务查 `story_design` + `workflow` + `interaction`,结果只给主会话、不传正文 agent。四类任务的映射表见维护文件。state 存在才查(两级都不存在时返回空结果、零写入);结果合并项目级与 `--book-root` 所指书级(不传就拿不到本书条目),`--kind` 必传;交给执行者的只有 `lines`(每条一行原话+编号,单次查询 ≤2048 字节)。
|
|
32
32
|
|
|
33
|
-
普通创作只做一次本地 `query`,完整画像、证据、候选和 journal 不进 prompt。查询项是低优先级倾向,不是逐条打卡清单:自然吸收,不复述画像、不刻意提高词面命中率,不为命中牺牲连贯、节奏、字数或本书既定笔调。**`omitted_ids`
|
|
33
|
+
普通创作只做一次本地 `query`,完整画像、证据、候选和 journal 不进 prompt。查询项是低优先级倾向,不是逐条打卡清单:自然吸收,不复述画像、不刻意提高词面命中率,不为命中牺牲连贯、节奏、字数或本书既定笔调。**`omitted_ids` 非空=记忆超编**,不是「没有更多了」:照 `omitted_summaries` 转告作者并建议「整理作者记忆」,不得改读完整画像规避预算。待确认项不进 prompt,也不为确认它们中断任务;只在作者主动查看、候选积累到适合回顾的节点,或新偏好与 active 条目冲突时集中呈现。
|
|
34
34
|
|
|
35
35
|
## 记不记、记成什么
|
|
36
36
|
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
回复就两行纯文本,不加代码块或引用格式:第一行用一句人话说记住了什么、管哪本书或哪类场合,如「记住了:《{书名}》的对话一律用「」,以后写这本书都照这个来;想改随时说。」;第二行是机器回执作凭证,如「技术备注:Author Memory Receipt: r1 · BP001」。
|
|
67
67
|
|
|
68
68
|
- 确认、替换、忘掉同理:「好,这条生效了:……」「换成了:……,原来的「……」不再用」「忘掉了:……」。只进待确认时说「这条先记在待确认里,你说"确认"才生效」;有冲突时用原话说明跟哪条旧习惯冲突。
|
|
69
|
-
- `warnings` / `omitted_ids`
|
|
69
|
+
- `warnings` / `omitted_ids` 不原样贴:说「你的习惯攒得有点多,写正文时这几条会带不上:「……」」(`warnings` 是最坏估算,改说「可能带不上」),并建议说「整理作者记忆」。不提字节、prompt、kind、scope;编号只能跟着原话出现。
|
|
70
70
|
|
|
71
71
|
## 运行工具
|
|
72
72
|
|
|
@@ -34,21 +34,22 @@ PENDING_MAX_BYTES = 12288
|
|
|
34
34
|
JOURNAL_MAX_BYTES = 24576
|
|
35
35
|
QUERY_MAX_BYTES = 2048
|
|
36
36
|
ASSERTION_MAX_BYTES = 120 # 新建条目的断言限一句话;解释进 reason(不进 query 载荷)。
|
|
37
|
-
OMITTED_IDS_MAX = 20 # omitted_ids 封顶,omitted 保留真实总数——漏项列表不许把载荷本身挤炸。
|
|
38
37
|
LEGACY_ASSERTION_MAX_BYTES = 768 # 存量条目的读取上限;强化老条目不受新上限约束。
|
|
39
38
|
|
|
40
|
-
# query
|
|
41
|
-
# 是它在 prompt
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
#
|
|
39
|
+
# query 输出里的 lines(每条一行「- 断言(编号)」)是交给执行 agent 的注入
|
|
40
|
+
# 载荷,QUERY_MAX_BYTES 是它在 prompt 里的注意力预算,不该放大;量的是执行者
|
|
41
|
+
# 真正读到的这几行,不是 JSON 外壳(编号、kind、scope 只给主会话和脚本看)。
|
|
42
|
+
# 防「作者以为载入了、实际被静默挤掉」靠三层:①新建条目的断言限
|
|
43
|
+
# ASSERTION_MAX_BYTES,从源头短(强化已有条目不受限,否则存量长断言再也无法
|
|
44
|
+
# 被确认,只会派生重复条目);②写入端按下列任务组合(与
|
|
45
|
+
# references/author-memory-maintenance.md 的映射表同包跟版)估算最坏查询情形——
|
|
46
|
+
# 全局条目+各 scope 维度上最重的单一切片(一次查询只带一个 book/genre/workflow,
|
|
47
|
+
# 不同书的条目不会同现;切片按 casefold 归并,与 same_scope_value 同一口径,
|
|
48
|
+
# 轻重按渲染后的行字节算,与真实载荷同一把尺),装不下时在返回的 warnings 里
|
|
49
|
+
# 点名将被略过的条目、指向「整理作者记忆」,写入本身永不因注入预算失败;
|
|
50
|
+
# ③查询按 重要度→本书例外→最近更新 排序装填,被略过的恒是重要度较低的条目,
|
|
51
|
+
# 漏下的 ID 按同一优先级全数报进 omitted_ids,首句报进 omitted_summaries,
|
|
52
|
+
# 供主会话用原话告诉作者哪几条没带上。
|
|
52
53
|
QUERY_COMBOS: dict[str, tuple[str, ...]] = {
|
|
53
54
|
"正文初稿/续写": ("prose_style", "story_design"),
|
|
54
55
|
"去AI味/改写": ("prose_style",),
|
|
@@ -1086,12 +1087,19 @@ def summarize_assertion(assertion: str, *, limit: int = 14) -> str:
|
|
|
1086
1087
|
|
|
1087
1088
|
|
|
1088
1089
|
def compact_item(item: dict[str, Any]) -> dict[str, Any]:
|
|
1089
|
-
"""query
|
|
1090
|
+
"""query 的 items 只带这四个字段,给主会话和脚本按 kind/scope 判断用;
|
|
1091
|
+
reason、evidence 等一律不出 store。"""
|
|
1090
1092
|
return {"id": item["id"], "kind": item["kind"], "scope": item["scope"], "assertion": item["assertion"]}
|
|
1091
1093
|
|
|
1092
1094
|
|
|
1093
|
-
def
|
|
1094
|
-
|
|
1095
|
+
def render_line(item: dict[str, Any]) -> str:
|
|
1096
|
+
"""执行者读到的一行:断言原文+编号。注入预算量的就是这几行。"""
|
|
1097
|
+
return f"- {item['assertion']}({item['id']})"
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
def line_bytes(item: dict[str, Any]) -> int:
|
|
1101
|
+
"""一行在注入载荷里的占位,含行尾换行——估算与真实装填只用这一把尺。"""
|
|
1102
|
+
return len((render_line(item) + "\n").encode("utf-8"))
|
|
1095
1103
|
|
|
1096
1104
|
|
|
1097
1105
|
SCOPE_RANK = {"book": 0, "genre": 1, "workflow": 2, "global": 3}
|
|
@@ -1121,48 +1129,38 @@ def fit_items(
|
|
|
1121
1129
|
*,
|
|
1122
1130
|
extra: dict[str, Any] | None = None,
|
|
1123
1131
|
) -> tuple[dict[str, Any], list[str]]:
|
|
1124
|
-
"""
|
|
1125
|
-
|
|
1126
|
-
OMITTED_IDS_MAX 条,omitted 保留真实总数)。返回 (结果文档, 全部漏下 ID)。
|
|
1132
|
+
"""按渲染后的行把条目装进 QUERY_MAX_BYTES:装不下的跳过而不中断(一条长的
|
|
1133
|
+
不挡后面的短条)。返回 (结果文档, 全部漏下 ID)。
|
|
1127
1134
|
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1135
|
+
只有 lines 计入预算;items、漏项清单和 `extra`(book_revision 等)是给主会话
|
|
1136
|
+
和脚本看的,不进执行者 prompt,所以漏项全数列出、不封顶,并按候选优先级
|
|
1137
|
+
排序——排在前面的就是作者最该知道没带上的那几条。
|
|
1131
1138
|
"""
|
|
1139
|
+
kept: list[dict[str, Any]] = []
|
|
1140
|
+
dropped: list[dict[str, Any]] = []
|
|
1141
|
+
used = 0
|
|
1142
|
+
for item in sorted_items:
|
|
1143
|
+
size = line_bytes(item)
|
|
1144
|
+
if used + size > QUERY_MAX_BYTES:
|
|
1145
|
+
dropped.append(item)
|
|
1146
|
+
continue
|
|
1147
|
+
kept.append(item)
|
|
1148
|
+
used += size
|
|
1132
1149
|
result: dict[str, Any] = {
|
|
1133
1150
|
"ok": True,
|
|
1134
1151
|
"command": "query",
|
|
1135
1152
|
"initialized": True,
|
|
1136
1153
|
"revision": revision,
|
|
1137
|
-
"items": [],
|
|
1138
|
-
"
|
|
1139
|
-
"
|
|
1154
|
+
"items": [compact_item(item) for item in kept],
|
|
1155
|
+
"lines": [render_line(item) for item in kept],
|
|
1156
|
+
"omitted": len(dropped),
|
|
1157
|
+
"omitted_ids": [item["id"] for item in dropped],
|
|
1158
|
+
"omitted_summaries": {item["id"]: summarize_assertion(item["assertion"]) for item in dropped},
|
|
1159
|
+
# 组装脚本按题材×流程查好几次再合并,合并后只能按重要度重排漏项,所以把它带出来。
|
|
1160
|
+
"omitted_importance": {item["id"]: item["importance"] for item in dropped},
|
|
1140
1161
|
}
|
|
1141
1162
|
result.update(extra or {})
|
|
1142
|
-
|
|
1143
|
-
kept: list[dict[str, Any]] = []
|
|
1144
|
-
dropped: set[str] = set()
|
|
1145
|
-
|
|
1146
|
-
def ordered_omitted() -> list[str]:
|
|
1147
|
-
return sorted(dropped, key=order.__getitem__)
|
|
1148
|
-
|
|
1149
|
-
def envelope_bytes() -> int:
|
|
1150
|
-
omitted = ordered_omitted()
|
|
1151
|
-
result["items"] = [compact_item(item) for item in kept]
|
|
1152
|
-
result["omitted"] = len(omitted)
|
|
1153
|
-
result["omitted_ids"] = omitted[:OMITTED_IDS_MAX]
|
|
1154
|
-
return len((json.dumps(result, ensure_ascii=False, sort_keys=True) + "\n").encode("utf-8"))
|
|
1155
|
-
|
|
1156
|
-
for item in sorted_items:
|
|
1157
|
-
kept.append(item)
|
|
1158
|
-
if envelope_bytes() > QUERY_MAX_BYTES:
|
|
1159
|
-
kept.pop()
|
|
1160
|
-
dropped.add(item["id"])
|
|
1161
|
-
# omitted 计数落定后包可能恰好贴边超出一两个字节,回吐条目直到装下。
|
|
1162
|
-
while kept and envelope_bytes() > QUERY_MAX_BYTES:
|
|
1163
|
-
dropped.add(kept.pop()["id"])
|
|
1164
|
-
envelope_bytes()
|
|
1165
|
-
return result, ordered_omitted()
|
|
1163
|
+
return result, result["omitted_ids"]
|
|
1166
1164
|
|
|
1167
1165
|
|
|
1168
1166
|
def build_query_result(
|
|
@@ -1170,8 +1168,8 @@ def build_query_result(
|
|
|
1170
1168
|
project_state: dict[str, Any] | None,
|
|
1171
1169
|
book_state: dict[str, Any] | None,
|
|
1172
1170
|
) -> tuple[dict[str, Any], list[str]]:
|
|
1173
|
-
"""
|
|
1174
|
-
book_revision
|
|
1171
|
+
"""真实查询与写入端估算共用的唯一装填入口:候选已按优先级排好,这里补上
|
|
1172
|
+
book_revision 等附加字段再装填。两处装填口径一旦分叉就是假阴性——回执
|
|
1175
1173
|
说没事、query 照样丢条。"""
|
|
1176
1174
|
extra: dict[str, Any] = {}
|
|
1177
1175
|
if book_state is not None:
|
|
@@ -1208,12 +1206,13 @@ def merged_query(
|
|
|
1208
1206
|
|
|
1209
1207
|
|
|
1210
1208
|
def slice_weight(items: list[dict[str, Any]]) -> int:
|
|
1211
|
-
"""
|
|
1209
|
+
"""切片在真实载荷里的占位:按渲染后的行(含换行)计。
|
|
1212
1210
|
|
|
1213
|
-
|
|
1214
|
-
|
|
1211
|
+
必须与 fit_items 同一把尺。按 JSON 字节挑会挑错切片——scope 取值长、断言
|
|
1212
|
+
短的切片 JSON 更重,渲染出的行却更轻,于是估算判「装得下」而真实查询溢出
|
|
1213
|
+
(warnings 假阴性)。
|
|
1215
1214
|
"""
|
|
1216
|
-
return sum(
|
|
1215
|
+
return sum(line_bytes(item) for item in items)
|
|
1217
1216
|
|
|
1218
1217
|
|
|
1219
1218
|
def active_of_kinds(state: dict[str, Any] | None, kinds: tuple[str, ...]) -> list[dict[str, Any]]:
|
|
@@ -1419,16 +1418,20 @@ def command_query(
|
|
|
1419
1418
|
project_state = load_state(project_store(workspace))
|
|
1420
1419
|
book_state = load_state(book_store(workspace, book_root, book)) if book_root is not None else None
|
|
1421
1420
|
if project_state is None and book_state is None:
|
|
1422
|
-
return {"ok": True, "command": "query", "initialized": False, "revision": 0, "items": [], "
|
|
1421
|
+
return {"ok": True, "command": "query", "initialized": False, "revision": 0, "items": [], "lines": [],
|
|
1422
|
+
"omitted": 0, "omitted_ids": [], "omitted_summaries": {}, "omitted_importance": {}}
|
|
1423
1423
|
requested_scopes = {
|
|
1424
1424
|
"genre": optional_text(genre, "query.genre", max_bytes=180),
|
|
1425
1425
|
"workflow": optional_text(workflow, "query.workflow", max_bytes=180),
|
|
1426
1426
|
}
|
|
1427
1427
|
# 装不下的**跳过而不中断**(一条长的不挡后面的短条),漏下的 ID 报进
|
|
1428
1428
|
# omitted_ids:非空=记忆超编该整理了,不是「没有更多了」。写入端的
|
|
1429
|
-
# warnings 与这里共用 build_query_result
|
|
1429
|
+
# warnings 与这里共用 build_query_result 同一把尺,估算即实况。
|
|
1430
1430
|
result, _ = merged_query(project_state, book_state, set(kinds), requested_scopes)
|
|
1431
|
-
require(
|
|
1431
|
+
require(
|
|
1432
|
+
sum(len((line + "\n").encode("utf-8")) for line in result["lines"]) <= QUERY_MAX_BYTES,
|
|
1433
|
+
"query lines exceed their fixed byte budget",
|
|
1434
|
+
)
|
|
1432
1435
|
return result
|
|
1433
1436
|
|
|
1434
1437
|
|
|
@@ -50,7 +50,7 @@ AI味不按语法错误处理,也不需要"修正"。它属于风格问题:
|
|
|
50
50
|
|
|
51
51
|
### 作者习惯
|
|
52
52
|
|
|
53
|
-
若作者记忆 state 已存在,改写前用 `scripts/author_memory_commit.py query --workspace {工作区} --book-root {书目录} --kind prose_style [--genre {题材}] [--workflow 去AI味]` 获取匹配的 active 文风条目(`--workspace` 必传;`--genre`
|
|
53
|
+
若作者记忆 state 已存在,改写前用 `scripts/author_memory_commit.py query --workspace {工作区} --book-root {书目录} --kind prose_style [--genre {题材}] [--workflow 去AI味]` 获取匹配的 active 文风条目(`--workspace` 必传;`--genre` 填本书题材类型),把输出的 `lines`(≤2KB)交给 inline/spawn 执行者作为自然倾向,不逐条展示或最大化命中,不牺牲连贯、节奏和字数;当前请求、原文剧情功能和本 skill 保护规则优先。用户明确声明长期文风习惯时,改写后按 [references/author-memory.md](references/author-memory.md) 用 `record` 写入并按其「回执怎么告诉作者」转告;只记作者明确说的,一次性要求、反复修改、检测器 findings 和助手自己的结果不记录。
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|