@cloud411716/fancy-webnovel 2.2.0 → 3.0.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.
Files changed (212) hide show
  1. package/README.md +65 -0
  2. package/client.js +201 -15
  3. package/cordis.patch.yml +5 -1
  4. package/docs/douyin-plugin.md +118 -0
  5. package/docs/material-library/README.md +404 -0
  6. package/docs/material-library/import.js +437 -0
  7. package/docs/material-library/prompt.md +370 -0
  8. package/docs/material-library/queries.surql +94 -0
  9. package/docs/material-library/sample.jsonl +14 -0
  10. package/docs/material-library/schema.surql +46 -0
  11. package/docs/mcp-profile.example.yml +24 -0
  12. package/docs/story-graph-design.md +602 -0
  13. package/docs/story-graph-validation.md +81 -0
  14. package/docs/workspace-mcp.md +284 -0
  15. package/index.js +12 -7
  16. package/lib/atomic-write.js +109 -0
  17. package/lib/chapter-order.js +100 -0
  18. package/lib/confirmation.js +80 -0
  19. package/lib/db-init.js +123 -0
  20. package/lib/deployed-state.js +11 -11
  21. package/lib/direction-labels.js +265 -0
  22. package/lib/error-codes.js +31 -31
  23. package/lib/infra.js +29 -4
  24. package/lib/material-db.js +149 -0
  25. package/lib/path-guard.js +150 -0
  26. package/lib/projects.js +400 -0
  27. package/lib/scraper-utils.js +140 -0
  28. package/lib/surreal-server.js +338 -0
  29. package/lib/topic-decision.js +860 -0
  30. package/lib/topic-fields.js +251 -0
  31. package/lib/topic-schema.js +225 -0
  32. package/lib/workspace.js +501 -0
  33. package/package.json +31 -7
  34. package/plugins/fancy-analyze/analyze-definitions.md +519 -0
  35. package/plugins/fancy-analyze/index.js +1128 -77
  36. package/plugins/fancy-analyze/ingest-coverage.js +107 -0
  37. package/plugins/fancy-analyze/schema-analyze.md +355 -107
  38. package/plugins/fancy-analyze/scripts/append-summary-chapter.js +612 -0
  39. package/plugins/fancy-analyze/summary-progress.js +71 -7
  40. package/plugins/fancy-analyze/templates.js +437 -139
  41. package/plugins/fancy-bootstrap/index.js +276 -131
  42. package/plugins/fancy-bootstrap/scripts/init.js +59 -25
  43. package/plugins/fancy-bootstrap/templates.js +35 -18
  44. package/plugins/fancy-db/index.js +172 -0
  45. package/plugins/fancy-douyin/deploy.js +134 -0
  46. package/plugins/fancy-douyin/index.js +551 -0
  47. package/plugins/fancy-douyin/prompts/01-analysis-prompt.md +84 -0
  48. package/plugins/fancy-douyin/scripts/crawl-note.cjs +194 -0
  49. package/plugins/fancy-douyin/scripts/lib.cjs +197 -0
  50. package/plugins/fancy-douyin/scripts/scan-account.cjs +128 -0
  51. package/plugins/fancy-douyin/scripts/start-chrome.cjs +203 -0
  52. package/plugins/fancy-douyin/state.js +197 -0
  53. package/plugins/fancy-douyin/templates.js +127 -0
  54. package/plugins/fancy-export/exporter.js +805 -0
  55. package/plugins/fancy-export/index.js +63 -0
  56. package/plugins/fancy-import/import-driver.js +29 -6
  57. package/plugins/fancy-import/index.js +13 -5
  58. package/plugins/fancy-import/prompts/01-import-prompt.md +39 -14
  59. package/plugins/fancy-import/templates.js +17 -8
  60. package/plugins/fancy-material/exporter.js +153 -0
  61. package/plugins/fancy-material/genres.js +256 -0
  62. package/plugins/fancy-material/index.js +835 -0
  63. package/plugins/fancy-material/inventory.js +145 -0
  64. package/plugins/fancy-material/kinds.js +313 -0
  65. package/plugins/fancy-material/queue.js +55 -0
  66. package/plugins/fancy-material/scripts/query.js +254 -0
  67. package/plugins/fancy-material/templates.js +258 -0
  68. package/plugins/fancy-material/tool-deploy.js +138 -0
  69. package/plugins/fancy-material/validate.js +149 -0
  70. package/plugins/fancy-project/index.js +133 -0
  71. package/plugins/fancy-scan/existing-block.js +100 -0
  72. package/plugins/fancy-scan/index.js +410 -21
  73. package/plugins/fancy-scan/prompts/01-analysis-prompt.md +302 -0
  74. package/plugins/fancy-scan/scripts/append-block.js +725 -0
  75. package/plugins/fancy-scan/scripts/report-validate.js +824 -0
  76. package/plugins/fancy-scan/scripts/run-scan.js +169 -22
  77. package/plugins/fancy-scan/scripts/scrapers/fanqie-rank-scraper.js +145 -16
  78. package/plugins/fancy-scan/scripts/scrapers/jjwxc-rank-scraper.js +179 -49
  79. package/plugins/fancy-scan/scripts/scrapers/qimao-rank-scraper.js +38 -20
  80. package/plugins/fancy-scan/templates/blocks.js +155 -0
  81. package/plugins/fancy-scan/templates/platforms.js +372 -0
  82. package/plugins/fancy-scan/templates/report-schema.js +90 -0
  83. package/plugins/fancy-scan/templates.js +545 -146
  84. package/plugins/fancy-scan/tool-deploy.js +335 -0
  85. package/plugins/fancy-scan/wait-turn.js +46 -0
  86. package/plugins/fancy-story-builder/db/README.md +106 -0
  87. package/plugins/fancy-story-builder/db/client.js +228 -0
  88. package/plugins/fancy-story-builder/db/commands.js +145 -0
  89. package/plugins/fancy-story-builder/db/ids.js +39 -0
  90. package/plugins/fancy-story-builder/db/import.js +798 -0
  91. package/plugins/fancy-story-builder/db/project.js +299 -0
  92. package/plugins/fancy-story-builder/db/query.js +361 -0
  93. package/plugins/fancy-story-builder/db/schema.js +417 -0
  94. package/plugins/fancy-story-builder/db/stage-sync.js +238 -0
  95. package/plugins/fancy-story-builder/flesh-output.js +19 -6
  96. package/plugins/fancy-story-builder/index.js +4105 -396
  97. package/plugins/fancy-story-builder/patch-driver.js +390 -0
  98. package/plugins/fancy-story-builder/prompts/01-skeleton-prompt.md +29 -19
  99. package/plugins/fancy-story-builder/prompts/02-flesh-prompt.md +72 -10
  100. package/plugins/fancy-story-builder/prompts/03-rhythm-prompt.md +40 -5
  101. package/plugins/fancy-story-builder/prompts/04-writing-prompt.md +37 -0
  102. package/plugins/fancy-story-builder/purpose-template.md +42 -66
  103. package/plugins/fancy-story-builder/references/formulas-skeleton.json +229 -56
  104. package/plugins/fancy-story-builder/references/genre-profiles.json +3514 -0
  105. package/plugins/fancy-story-builder/references/glossary.md +15 -6
  106. package/plugins/fancy-story-builder/references/index.md +97 -6
  107. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/00-index.md +1 -1
  108. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/07-audit.md +25 -7
  109. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/01-character.md +5 -1
  110. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/03-relations.md +6 -2
  111. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/05-audit.md +15 -5
  112. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/00-index.md +1 -1
  113. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/01-positioning.md +2 -1
  114. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/03-entities.md +1 -1
  115. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/06-audit.md +19 -1
  116. package/plugins/fancy-story-builder/schema-setting.json +1100 -0
  117. package/plugins/fancy-story-builder/schema-setting.md +201 -293
  118. package/plugins/fancy-story-builder/scripts/brief-validate.js +164 -0
  119. package/plugins/fancy-story-builder/scripts/content-quality.js +4 -1
  120. package/plugins/fancy-story-builder/scripts/flesh-validate.js +135 -12
  121. package/plugins/fancy-story-builder/scripts/graph-utils.js +146 -47
  122. package/plugins/fancy-story-builder/scripts/reference-log.js +110 -0
  123. package/plugins/fancy-story-builder/scripts/rhythm-validate.js +100 -4
  124. package/plugins/fancy-story-builder/scripts/schema-pages.js +2668 -0
  125. package/plugins/fancy-story-builder/scripts/semantic-lint.js +5 -1
  126. package/plugins/fancy-story-builder/scripts/skeleton-validate.js +158 -17
  127. package/plugins/fancy-story-builder/scripts/stage-batches.js +36 -2
  128. package/plugins/fancy-story-builder/scripts/stage-contract.js +12 -0
  129. package/plugins/fancy-story-builder/scripts/story-artifacts.js +933 -0
  130. package/plugins/fancy-story-builder/scripts/upstream-query.js +1 -1
  131. package/plugins/fancy-story-builder/scripts/v2/baseline.js +112 -0
  132. package/plugins/fancy-story-builder/scripts/v2/cast.js +517 -0
  133. package/plugins/fancy-story-builder/scripts/v2/context.js +434 -0
  134. package/plugins/fancy-story-builder/scripts/v2/contracts.js +493 -0
  135. package/plugins/fancy-story-builder/scripts/v2/core.js +419 -0
  136. package/plugins/fancy-story-builder/scripts/v2/engine.js +1068 -0
  137. package/plugins/fancy-story-builder/scripts/v2/export-markdown.js +794 -0
  138. package/plugins/fancy-story-builder/scripts/v2/genre.js +195 -0
  139. package/plugins/fancy-story-builder/scripts/v2/knowledge.js +321 -0
  140. package/plugins/fancy-story-builder/scripts/v2/macro.js +409 -0
  141. package/plugins/fancy-story-builder/scripts/v2/manifest.js +538 -0
  142. package/plugins/fancy-story-builder/scripts/v2/migrate.js +137 -0
  143. package/plugins/fancy-story-builder/scripts/v2/prompts.js +1335 -0
  144. package/plugins/fancy-story-builder/scripts/v2/rhythm.js +618 -0
  145. package/plugins/fancy-story-builder/scripts/v2/scale.js +843 -0
  146. package/plugins/fancy-story-builder/scripts/v2/snapshot.js +121 -0
  147. package/plugins/fancy-story-builder/scripts/v2/stages.js +273 -0
  148. package/plugins/fancy-story-builder/scripts/v2/writing.js +216 -0
  149. package/plugins/fancy-story-builder/storydb/README.md +271 -0
  150. package/plugins/fancy-story-builder/storydb/cli.js +458 -0
  151. package/plugins/fancy-story-builder/storydb/client.js +351 -0
  152. package/plugins/fancy-story-builder/storydb/compile.js +452 -0
  153. package/plugins/fancy-story-builder/storydb/context.js +288 -0
  154. package/plugins/fancy-story-builder/storydb/definitions.js +699 -0
  155. package/plugins/fancy-story-builder/storydb/driver.js +106 -0
  156. package/plugins/fancy-story-builder/storydb/dsh-tools.js +313 -0
  157. package/plugins/fancy-story-builder/storydb/export.js +175 -0
  158. package/plugins/fancy-story-builder/storydb/ids.js +31 -0
  159. package/plugins/fancy-story-builder/storydb/impact.js +170 -0
  160. package/plugins/fancy-story-builder/storydb/import.js +559 -0
  161. package/plugins/fancy-story-builder/storydb/mcp.js +99 -0
  162. package/plugins/fancy-story-builder/storydb/prompts.js +952 -0
  163. package/plugins/fancy-story-builder/storydb/stage-command.js +379 -0
  164. package/plugins/fancy-story-builder/storydb/stage.js +426 -0
  165. package/plugins/fancy-story-builder/storydb/store.js +891 -0
  166. package/plugins/fancy-story-builder/storydb/tools.js +592 -0
  167. package/plugins/fancy-story-builder/storydb/validation.js +183 -0
  168. package/plugins/fancy-story-builder/templates/v2/10-scale/scale-template.json +144 -0
  169. package/plugins/fancy-story-builder/templates/v2/20-macro/emotion-template.json +15 -0
  170. package/plugins/fancy-story-builder/templates/v2/20-macro/endings-template.json +16 -0
  171. package/plugins/fancy-story-builder/templates/v2/20-macro/lines-template.json +28 -0
  172. package/plugins/fancy-story-builder/templates/v2/20-macro/roles-template.json +10 -0
  173. package/plugins/fancy-story-builder/templates/v2/20-macro/story-template.json +19 -0
  174. package/plugins/fancy-story-builder/templates/v2/20-macro/volumes-template.json +24 -0
  175. package/plugins/fancy-story-builder/templates/v2/20-macro/world-template.json +24 -0
  176. package/plugins/fancy-story-builder/templates/v2/30-cast/characters-template.json +49 -0
  177. package/plugins/fancy-story-builder/templates/v2/30-cast/climaxes-template.json +14 -0
  178. package/plugins/fancy-story-builder/templates/v2/30-cast/conflicts-template.json +30 -0
  179. package/plugins/fancy-story-builder/templates/v2/30-cast/factions-template.json +18 -0
  180. package/plugins/fancy-story-builder/templates/v2/30-cast/foreshadows-template.json +29 -0
  181. package/plugins/fancy-story-builder/templates/v2/30-cast/information-template.json +29 -0
  182. package/plugins/fancy-story-builder/templates/v2/30-cast/items-template.json +13 -0
  183. package/plugins/fancy-story-builder/templates/v2/30-cast/locations-template.json +12 -0
  184. package/plugins/fancy-story-builder/templates/v2/30-cast/payoffs-template.json +16 -0
  185. package/plugins/fancy-story-builder/templates/v2/30-cast/relations-template.json +44 -0
  186. package/plugins/fancy-story-builder/templates/v2/40-rhythm/chapter-map-template.json +81 -0
  187. package/plugins/fancy-story-builder/templates/v2/40-rhythm/outline-template.json +162 -0
  188. package/plugins/fancy-story-builder/templates/v2/50-writing/ledger-template.json +46 -0
  189. package/plugins/fancy-story-builder/templates/v2/60-deslop/report-template.json +10 -0
  190. package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//346/227/266/345/272/217/346/230/240/345/260/204/346/250/241/346/235/277.json +267 -44
  191. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//344/270/226/347/225/214/350/247/202/350/247/204/345/210/231/346/250/241/346/235/277.json +121 -19
  192. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/205/263/351/224/256/351/201/223/345/205/267/346/250/241/346/235/277.json +129 -21
  193. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/205/266/344/273/226/345/256/236/344/275/223/346/250/241/346/235/277.json +62 -0
  194. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/206/262/347/252/201/346/250/241/346/235/277.json +76 -17
  195. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/211/247/346/203/205/346/250/241/346/235/277.json +56 -8
  196. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/212/277/345/212/233/346/250/241/346/235/277.json +63 -13
  197. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/234/260/347/202/271/346/250/241/346/235/277.json +34 -6
  198. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//347/273/223/345/261/200/346/250/241/346/235/277.json +81 -18
  199. package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//350/247/222/350/211/262/346/250/241/346/235/277.json +202 -42
  200. package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/205/263/347/263/273/346/250/241/346/235/277.json +160 -27
  201. package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/256/236/344/275/223/346/250/241/346/235/277.json +217 -41
  202. package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//346/241/206/346/236/266/346/250/241/346/235/277.json +215 -41
  203. package/plugins/fancy-story-builder/templates.js +272 -74
  204. package/plugins/fancy-story-builder/wiki-references.js +429 -93
  205. package/plugins/fancy-story-builder/writing-driver.js +336 -9
  206. package/plugins/fancy-topic/index.js +414 -61
  207. package/plugins/fancy-topic/prompts/01-exploration-prompt.md +115 -0
  208. package/plugins/fancy-topic/scripts/save-suggestion.js +219 -0
  209. package/plugins/fancy-topic/scripts/select-topic.js +106 -63
  210. package/plugins/fancy-topic/templates.js +225 -122
  211. package/plugins/fancy-topic/tool-deploy.js +200 -0
  212. package/lib/safe-rm.js +0 -94
@@ -24,13 +24,14 @@
24
24
  * 所以**头部要记章节清单**,而且它就是唯一事实源:
25
25
  *
26
26
  * ---
27
- * 标题: 节奏韵律-总结
28
- * 标签: [总结, 节奏韵律]
29
27
  * 已总结章节:
30
28
  * - 全球高武-节奏韵律-第1章
31
29
  * - 全球高武-节奏韵律-第2章
32
30
  * ---
33
31
  *
32
+ * 头部**只有这一个键** —— 早先还写过「标题:」「标签:」,但整个插件里
33
+ * 没有任何代码读它们,是死字段(详见 append-summary-chapter.js)。
34
+ *
34
35
  * 由此:
35
36
  * · 待总结章节 = 源文件清单 − 头部已总结章节
36
37
  * · 派活时**只给目录**,章节由模型自己去目录里比对(几千章时列名字会撑爆提示词)
@@ -59,6 +60,39 @@ export const SUMMARY_FRONTMATTER_KEY = '已总结章节';
59
60
  /** llm_wiki 的摄入产物目录,不是技法目录。 */
60
61
  export const EXCLUDED_WIKI_DIRS = ['来源', '来源摘要'];
61
62
 
63
+ /**
64
+ * 跨章节实体页目录:这些目录也要做 summary,但总结单位是“实体页”,
65
+ * 不是“章节”。提示词会读取每个实体页的 `## 可复用设计规则` 和
66
+ * `## 风险与反例`,提炼跨实体、跨章节的设计原则。
67
+ */
68
+ export const ENTITY_SCOPED_DIRS = [
69
+ '人物关系设计',
70
+ '势力结构',
71
+ '世界观设计',
72
+ '冲突设计',
73
+ '主线支线结构',
74
+ '分卷节奏',
75
+ '伏笔布局',
76
+ '角色弧光设计',
77
+ ];
78
+
79
+ /**
80
+ * 旧版按章结构页目录。它们与新版实体页**不是同一种东西**:
81
+ * · 伏笔回收(按章)→ 伏笔布局(按伏笔实体)
82
+ * · 世界观构建 / 世界观规则设计(按章)→ 世界观设计(按规则/体系实体)
83
+ * · 角色弧光(按章)→ 角色弧光设计(按角色实体)
84
+ *
85
+ * 不能自动迁移,也不能把它们当实体页检查 —— 否则每章一个页面会被误判成
86
+ * “同一个实体有多个页面”。这里只负责让它们不参与 summary 派发,并在
87
+ * status / summary-status 里提示重新 ingest。
88
+ */
89
+ export const LEGACY_STRUCTURE_DIRS = [
90
+ '伏笔回收',
91
+ '世界观构建',
92
+ '世界观规则设计',
93
+ '角色弧光',
94
+ ];
95
+
62
96
  /** 进度状态。 */
63
97
  export const SUMMARY_STATE = {
64
98
  DONE: 'done',
@@ -140,7 +174,7 @@ export function parseSummarizedChapters(frontmatter) {
140
174
  * 把「已总结章节」的名字对齐到源文件标识。
141
175
  *
142
176
  * 模型写章节名的格式很不统一(实测):
143
- * - `全球高武-伏笔回收-第3章` 精确
177
+ * - `全球高武-场景转换-第3章` 精确
144
178
  * - `[全球高武-世界观构建-第2章, 第3章]` 带方括号 + 简写
145
179
  * - `第7章` 裸章号
146
180
  *
@@ -219,7 +253,7 @@ export function alignChapterIds(names, sourceFiles) {
219
253
  export function inferSummarizedChapters(text, knownIds) {
220
254
  if (typeof text !== 'string' || text.length === 0) return { chapters: [], unmatched: [] };
221
255
  const raw = [];
222
- for (const match of text.matchAll(/^\s*-\s*来源章节\s*[::]\s*(.+)$/gm)) {
256
+ for (const match of text.matchAll(/^\s*-\s*来源(?:章节|实体|页面)\s*[::]\s*(.+)$/gm)) {
223
257
  // "来源章节:甲-第1章、甲-第2章" → 拆开
224
258
  for (const part of String(match[1]).split(/[、,,;;]/)) {
225
259
  const v = part.trim();
@@ -232,7 +266,7 @@ export function inferSummarizedChapters(text, knownIds) {
232
266
  /**
233
267
  * 取出章节标识里的章号。
234
268
  *
235
- * 章节标识长这样:`全球高武-伏笔回收-第10章`。
269
+ * 章节标识长这样:`全球高武-场景转换-第10章`。
236
270
  * 章号是稳定语义(技法名可能被打错字,章号不会),所以排序靠它。
237
271
  *
238
272
  * @param {string} id - 章节标识
@@ -286,6 +320,28 @@ export function listTechDirs(wikiRoot) {
286
320
  return dirs.sort((a, b) => a.localeCompare(b, 'zh-Hans-CN'));
287
321
  }
288
322
 
323
+ /**
324
+ * 返回需要做 summary 的目录:按章技法目录 + 跨章节实体目录。
325
+ * 旧版按章结构目录仍排除(它们等待迁移,不参与新 summary)。
326
+ */
327
+ export function listSummaryDirs(wikiRoot) {
328
+ return listTechDirs(wikiRoot).filter(
329
+ (name) => !LEGACY_STRUCTURE_DIRS.includes(name));
330
+ }
331
+
332
+ function countEntityPages(wikiRoot, dirName) {
333
+ try {
334
+ const files = fs.readdirSync(path.join(wikiRoot, dirName), { withFileTypes: true });
335
+ return files.filter((file) =>
336
+ file.isFile() &&
337
+ file.name.endsWith('.md') &&
338
+ !file.name.endsWith('-总结.md')
339
+ ).length;
340
+ } catch {
341
+ return 0;
342
+ }
343
+ }
344
+
289
345
  /**
290
346
  * 读一个技法目录的进度。
291
347
  *
@@ -323,6 +379,8 @@ export function readDirProgress(wikiRoot, dirName) {
323
379
 
324
380
  const progress = {
325
381
  name: dirName,
382
+ /** chapter = 按章技法;entity = 跨章节实体页。 */
383
+ scope: ENTITY_SCOPED_DIRS.includes(dirName) ? 'entity' : 'chapter',
326
384
  summaryPath,
327
385
  sourceFiles,
328
386
  sourceCount: sourceFiles.length,
@@ -398,15 +456,21 @@ export function readDirProgress(wikiRoot, dirName) {
398
456
  * 扫描全部技法目录的进度。
399
457
  *
400
458
  * @param {string} wikiRoot - 对标/wiki 的绝对路径
401
- * @returns {{dirs: object[], done: object[], running: object[], pending: object[], noInput: object[], total: number}}
459
+ * @returns {{dirs: object[], legacyDirs: object[], done: object[], running: object[], pending: object[], noInput: object[], total: number}}
402
460
  */
403
461
  export function scanSummaryProgress(wikiRoot) {
404
- const dirs = listTechDirs(wikiRoot)
462
+ const allDirs = listTechDirs(wikiRoot);
463
+ const legacyDirs = allDirs
464
+ .filter((name) => LEGACY_STRUCTURE_DIRS.includes(name))
465
+ .map((name) => ({ name, pageCount: countEntityPages(wikiRoot, name) }));
466
+ const dirs = allDirs
467
+ .filter((name) => !LEGACY_STRUCTURE_DIRS.includes(name))
405
468
  .map((name) => readDirProgress(wikiRoot, name))
406
469
  .filter((p) => p !== null);
407
470
 
408
471
  return {
409
472
  dirs,
473
+ legacyDirs,
410
474
  done: dirs.filter((p) => p.state === SUMMARY_STATE.DONE),
411
475
  running: dirs.filter((p) => p.state === SUMMARY_STATE.RUNNING),
412
476
  pending: dirs.filter((p) => p.state === SUMMARY_STATE.PENDING),