opencode-wiki-historian 0.2.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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +381 -0
  3. package/dist/chronology.d.ts +36 -0
  4. package/dist/chronology.js +67 -0
  5. package/dist/config.d.ts +112 -0
  6. package/dist/config.js +158 -0
  7. package/dist/index.d.ts +31 -0
  8. package/dist/index.js +136 -0
  9. package/dist/jsonc.d.ts +17 -0
  10. package/dist/jsonc.js +131 -0
  11. package/dist/map.d.ts +58 -0
  12. package/dist/map.js +196 -0
  13. package/dist/migrate-apply.d.ts +40 -0
  14. package/dist/migrate-apply.js +144 -0
  15. package/dist/migrate-score.d.ts +29 -0
  16. package/dist/migrate-score.js +267 -0
  17. package/dist/migrate-store.d.ts +52 -0
  18. package/dist/migrate-store.js +77 -0
  19. package/dist/migrate.d.ts +65 -0
  20. package/dist/migrate.js +111 -0
  21. package/dist/templates/genres.d.ts +65 -0
  22. package/dist/templates/genres.js +228 -0
  23. package/dist/templates/skeletons.d.ts +48 -0
  24. package/dist/templates/skeletons.js +558 -0
  25. package/dist/tools/create.d.ts +9 -0
  26. package/dist/tools/create.js +77 -0
  27. package/dist/tools/local.d.ts +10 -0
  28. package/dist/tools/local.js +107 -0
  29. package/dist/tools/mutate.d.ts +11 -0
  30. package/dist/tools/mutate.js +157 -0
  31. package/dist/tools/read.d.ts +9 -0
  32. package/dist/tools/read.js +104 -0
  33. package/dist/tools/shared.d.ts +52 -0
  34. package/dist/tools/shared.js +87 -0
  35. package/dist/tools/write.d.ts +10 -0
  36. package/dist/tools/write.js +148 -0
  37. package/dist/tools.d.ts +23 -0
  38. package/dist/tools.js +43 -0
  39. package/dist/translate.d.ts +44 -0
  40. package/dist/translate.js +207 -0
  41. package/dist/wiki/assets.d.ts +42 -0
  42. package/dist/wiki/assets.js +91 -0
  43. package/dist/wiki/client.d.ts +67 -0
  44. package/dist/wiki/client.js +221 -0
  45. package/dist/wiki/locale.d.ts +66 -0
  46. package/dist/wiki/locale.js +154 -0
  47. package/dist/wiki/pages.d.ts +7 -0
  48. package/dist/wiki/pages.js +7 -0
  49. package/dist/wiki/pages.read.d.ts +114 -0
  50. package/dist/wiki/pages.read.js +114 -0
  51. package/dist/wiki/pages.write.d.ts +109 -0
  52. package/dist/wiki/pages.write.js +201 -0
  53. package/package.json +36 -0
  54. package/skills/historian/SKILL.md +294 -0
  55. package/skills/historian/references/adapting-your-own-wiki.md +53 -0
  56. package/skills/historian/references/genres.md +160 -0
  57. package/skills/historian/references/rules.md +30 -0
  58. package/skills/historian/references/style.md +84 -0
  59. package/skills/historian/references/wikijs-guide.md +87 -0
@@ -0,0 +1,53 @@
1
+ # 接入你自己的 wiki.js / Adapting Historian to Your Own Wiki
2
+
3
+ 把史官插件搬到另一台机器、指向你自己的 Wiki.js 实例的六步自助上手指南。所有示例均为占位值(example.com / localhost / team-notes/ / 8000),不含任何真实部署。
4
+
5
+ Six-step self-onboarding for pointing the historian plugin at your own Wiki.js instance on another machine. Every value below is a placeholder.
6
+
7
+ ## 1. 指向你的 wiki.js 实例 / Point at your instance
8
+
9
+ - `baseUrl` 选项:默认 `http://localhost:3000`,一般无需改。
10
+ - API token:在 wiki.js 管理端 Settings → API Tokens 生成读写 token。两种放置方式,读取优先级为**密钥文件在前、env 在后**:
11
+ - `apiKeyPath` 指向的单行文件(默认 `~/.wikijs-api-key`,内容一行 token,读取时 trim);
12
+ - 或环境变量 `WIKIJS_API_KEY`。
13
+ - 配置写在 `opencode.jsonc` 的 `plugin` 二元组第二参数:
14
+
15
+ ```jsonc
16
+ "plugin": [
17
+ ["opencode-historian", { "baseUrl": "http://example.com:3000" }]
18
+ ]
19
+ ```
20
+
21
+ ## 2. 章节白名单 / sections 白名单
22
+
23
+ - 选项 `sections` 默认空数组 = 插件端**不限制**路径前缀;真正的写权限由你的 wiki.js token 的 page rules 决定。
24
+ - 想把 AI 写入约束在特定区:`"sections": ["team-notes/", "scratch/"]`——越界写入直接报 ConfigError 类错误。
25
+ - 不要复用别人的章节表;接入后先 `historian_map action=show` 看你自己的布局。
26
+
27
+ ## 3. 翻译腿是可选项 / The translate leg is optional
28
+
29
+ - 发布包**不内置**任何翻译端点。解析链:`translate.endpoint` 选项 → 环境变量 `HISTORIAN_TRANSLATE_ENDPOINT` → 未配置。
30
+ - 翻译 key 链:`translate.apiKey` → `DASHSCOPE_API_KEY` → `translate.providerKey` 指定的本地 jsonc provider(三段都缺 = 翻译腿关闭)。
31
+ - 端点未配置时的行为:页面照常创建,zh 孪生页返回 `zh_status: 'pending'`;随后手工双语补全——创建/追加时直接给 `sectionZh` 参数,或配好翻译腿后用 `historian_translate_snippet` + `historian_page_update`。
32
+
33
+ ## 4. 认清 wiki.js 的 9 个 API 陷阱 / Know the 9 pitfalls
34
+
35
+ `references/wikijs-guide.md` 汇总了 wiki.js 2.x 实测的 9 条 API 行为(搜索通配、locale 路径、孪生解析、assets 上传等)。史官工具已全部内化;若你绕过工具直接调 GraphQL,先读那一节。
36
+
37
+ ## 5. 隐私红线与发布门 / Privacy red-lines & the pre-publish gate
38
+
39
+ - 任何进入包/文档的内容不得包含:真实主机名、真实用户路径(`/home/...`)、token、真实私有部署的页面标题与章节表。
40
+ - 硬门:`node tools/privacy-audit.mjs` 扫描 `npm pack` 全部文件(含 `dist/` 与 `skills/`)。改过任何随包文本后必须跑到 exit 0 再发布。
41
+
42
+ ## 6. 机构记忆层开关 / reading-loop & capture switches
43
+
44
+ - `readingLoop` 默认 `true`:插件向每次请求的 system 注入"先查 wiki"提示。严格 OpenAI 兼容后端(如 vLLM)会拒绝多条 system 消息——此类部署设 `"readingLoop": false`。
45
+ - `capture.enabled` 默认 `false`:置 `true` 后会话空闲时弹一条 toast 提醒;**只提醒、绝不自动写页**。`/historian-capture` 命令始终注册,与此开关无关。
46
+
47
+ ```jsonc
48
+ ["opencode-historian", { "readingLoop": false, "capture": { "enabled": true } }]
49
+ ```
50
+
51
+ ---
52
+
53
+ 配完六步,你的史官即就位:consult(reading loop 自动引路)、notice(capture 提醒留痕)、record(G1-G5 骨架 + map/timeline 归档)。
@@ -0,0 +1,160 @@
1
+ # 页型模板 G1-G5
2
+
3
+ > 五种页型覆盖 wiki 中所有知识形态。选定页型后用对应骨架写作。骨架实现见 `src/templates/skeletons.ts`,本文件是操作指南。
4
+
5
+ ## Phase 1.5 页型分类
6
+
7
+ 在开始写作前,必须声明页型。分类关键词:
8
+
9
+ | 页型 | 关键词信号 | 何时选 |
10
+ |------|-----------|--------|
11
+ | G1 事件复盘 | 故障/复盘/事故/incident/postmortem/outage | 记录已发生的事件:症状→根因→修复→预防 |
12
+ | G2 对比选型 | 对比/选型/vs/versus/compare/benchmark/alternatives | 比较两个或以上方案,给出选型建议 |
13
+ | G3 清单索引 | 清单/列表/inventory/checklist/catalog/命令速查 | 罗列同类对象(端口、模型、命令、配置项) |
14
+ | G4 概念原理 | 原理/为什么/how it works/概念/机制 | 解释一个概念或机制的工作原理 |
15
+ | G5 现状账本 | 端口/版本/已部署/当前状态/上次核实/last verified + 组件表 | 记录此刻部署/运行态,每行可复核、可追漂移 |
16
+
17
+ 声明格式:`页型: G<N> <类型名>`(如 `页型: G1 事件复盘`)
18
+
19
+ 若关键词冲突,按页面核心目的选择;仍有歧义则选 G4。
20
+
21
+ ---
22
+
23
+ ## G1 事件复盘 (Incident Postmortem)
24
+
25
+ 记录一次已发生的事件。
26
+
27
+ **固定节序**:
28
+
29
+ 1. 摘要 (Summary) — 3-5 句概括事件全貌
30
+ 2. 元数据 (Metadata) — 日期、影响范围、严重级别
31
+ 3. 背景 (Background) — 事件前的系统状态
32
+ 4. 时间线 (Timeline) — **三列表**:时间 | 事件 | 来源
33
+ 5. 量化影响 (Impact) — 数字说话:持续时长、影响用户数、损失
34
+ 6. 根因 (Root Cause) — 区分直接原因 vs 根本原因;5 Whys
35
+ 7. 处置 (Remediation) — 止血 vs 根治
36
+ 8. 行动项 (Action Items) — **六列(含五要素)**:措施(行内容) | 类型 | 负责人 | 期限 | 验证 | 状态
37
+ 9. 教训 (Lessons Learned) — 做得好 / 做错 / 侥幸
38
+ 10. 附录 (Appendix) — 原始日志片段、截图
39
+ 11. 相关页面 (Related Pages)
40
+
41
+ **状态块示例**:
42
+ ```markdown
43
+ > **Status**: Active | **Updated**: 2026-09-01 | **Scope**: 2026-08-05 Solar Ray V2 ERC 电源网失明事件复盘
44
+ ```
45
+
46
+ ---
47
+
48
+ ## G2 对比选型 (Comparison & Selection)
49
+
50
+ 比较方案并给出选型建议。
51
+
52
+ **固定节序**:
53
+
54
+ 1. 结论先行 (Bottom Line) — 首段给选型结论
55
+ 2. 维度定义 (Dimension Definitions) — 明确比较维度及权重
56
+ 3. 对象概览 (Object Overview) — 被比较对象的简要介绍
57
+ 4. 对比表 (Comparison Table) — 含**来源列**,禁止合并单元格
58
+ 5. 基准 (Methodology/Benchmark) — 测试方法、数据来源
59
+ 6. 选型建议 (Recommendation) — 场景化推荐
60
+ 7. 相关页面 (Related Pages)
61
+
62
+ **对比表格式**:
63
+
64
+ | 维度 | A | B | C | 来源 |
65
+ |------|---|---|---|------|
66
+ | 性能 | 120 tok/s | 85 tok/s | 95 tok/s | bench-2026-08 |
67
+
68
+ ---
69
+
70
+ ## G3 清单索引 (Inventory & Reference)
71
+
72
+ 罗列同类对象,便于查阅。
73
+
74
+ **固定节序**:
75
+
76
+ 1. 范围声明 (Scope Statement) — 本清单收录什么、不收录什么
77
+ 2. 内容 (Contents) — 可选的目录概览
78
+ 3. 条目表 (Entry Table) — 按主题分组的结构化表格
79
+ 4. 维护说明 (Maintenance Note) — 如何添加/删除条目
80
+ 5. 相关页面 (Related Pages)
81
+
82
+ **条目表示例**:
83
+
84
+ | 名称 | 端口 | 协议 | 状态 | 备注 |
85
+ |------|------|------|------|------|
86
+ | Wiki.js | 3000 | HTTP | Active | 知识库 |
87
+
88
+ ---
89
+
90
+ ## G4 概念原理 (Concept & Explanation)
91
+
92
+ 解释一个概念、机制或原理。
93
+
94
+ **固定节序**:
95
+
96
+ 1. 定义 + 收录理由 (Definition + Rationale) — 是什么、为什么值得记录
97
+ 2. 重要性排序小节 (Aspects by Importance) — 按重要性从高到低展开各方面
98
+ 3. 工作原理 (How It Works) — 机制详解,可含代码/图示
99
+ 4. 归因 (Attribution) — 观点来源、不同立场
100
+ 5. 相关页面 (Related Pages)
101
+
102
+ ---
103
+
104
+ ## G5 现状账本 (Current-State Ledger)
105
+
106
+ 记录机器"此刻部署/运行着什么"的权威快照,供人和 agent 索引现状、追踪漂移。是状态卡,不是叙事页。
107
+
108
+ **固定节序**:
109
+
110
+ 1. 状态块 — 机读单行取值:`Active` | `Superseded-by: <path>` | `Deprecated`
111
+ 2. 部署物清单 (Component Table) — 每行必填:组件 | 版本 | 端口/路径 | 端点 | 依赖 | **上次核实于**
112
+ 3. 依赖与集成 (Dependencies & Integration) — 外部依赖与被依赖方
113
+ 4. 失效策略 (Invalidation Policy) — 什么事件作废本卡 + 复核周期
114
+ 5. 验证方法 (Verification) — 每组件一条可执行命令,agent 可直接复跑核实
115
+ 6. 变更记录 (Change Log) — 仅追加小表(日期 | 变更 | 依据);完整历史写 G1 事件页并交叉引用
116
+ 7. 相关页面 (Related Pages)
117
+
118
+ **部署物清单示例**(占位值,勿用真实部署):
119
+
120
+ | 组件 | 版本 | 端口/路径 | 端点 | 依赖 | 上次核实于 |
121
+ |------|------|-----------|------|------|------------|
122
+ | example-svc | 1.2.3 | 8000 | http://example.com/api | postgres | 2026-09-01 |
123
+
124
+ **禁止**:叙事正文;行缺「上次核实于」;验证方法写成散文。**Supersede**:现状大改时新建卡,旧卡状态行改 `Superseded-by: <新卡路径>` 并保留,不删除。自检门第 4-6 项对 G5 换用账本变体判据(见 `src/migrate-score.ts` 的 `scoreG5Item*`)。
125
+
126
+ ---
127
+
128
+ ## 通用元素(所有页型共享)
129
+
130
+ ### 状态块(H1 后紧跟)
131
+
132
+ ```markdown
133
+ > **Status**: Active | **Updated**: 2026-09-01 | **Scope**: 一句话回答本页解决什么问题
134
+ ```
135
+
136
+ 状态取值:`Active`(当前事实)| `Historical`(保留上下文,已非当前)| `Superseded`(被取代,附 banner + 链接)
137
+
138
+ 中文页:`> **状态**: 活跃 | **更新**: … | **范围**: …`
139
+
140
+ ### 表达件速查
141
+
142
+ | 元素 | 语法 | 用途 |
143
+ |------|------|------|
144
+ | 提示块 | `> 内容\n{.is-info}` | 重要提示(可选 `is-warning` / `is-danger` / `is-success`) |
145
+ | 紧凑表 | 表格后 `{.dense}` | 减少表格行距 |
146
+ | 脚注 | `[^1]` 定义 `[^1]: 内容` | 补充说明 |
147
+ | 标签页 | `[Tab A](#tab-a)` + `## Tab A` | 多选项展示 |
148
+
149
+ ### 禁止使用
150
+
151
+ - ❌ `{{toc}}` — wiki.js 不处理,会原样输出
152
+ - ❌ `:::` container — wiki.js 不识别,会破坏渲染
153
+ - ❌ YAML frontmatter (`---\ntitle: ...\n---`) — wiki.js 会把它当正文显示
154
+ - ❌ `[[path|label]]` 旧链接语法 — 用 `[Label](/path)`
155
+
156
+ ## 来源
157
+
158
+ 骨架实现:`src/templates/skeletons.ts`(G1_ZH/G1_EN/G2_ZH/G2_EN/G3_ZH/G3_EN/G4_ZH/G4_EN/G5_ZH/G5_EN)。
159
+ 分类规则:`src/templates/genres.ts`(`classifyGenre` 函数);G5 门控判据:`src/migrate-score.ts`(`scoreG5Item4/5/6`)。
160
+ 调研依据:`docs/research/cross-cultural-wiki-writing.md` Genre templates 节。
@@ -0,0 +1,30 @@
1
+ # 写作规则 20 条 (SYN-1..20)
2
+
3
+ > 跨文化 wiki 写作的通用合成规则。每条规则可在 `docs/research/cross-cultural-wiki-writing.md` 找到原始调研证据。
4
+
5
+ | # | 规则 | 要点 |
6
+ |---|------|------|
7
+ | SYN-1 | **结论先行** | 首段给出结论或行动建议,不要让读者猜。技术文档不是悬疑小说。 |
8
+ | SYN-2 | **一页一问** | 一个页面回答一个问题。回答了两个就拆;两个页面答同一个就合并或 supersede。 |
9
+ | SYN-3 | **导言密度** | 导言占全文 10-15%,概括全文核心结论。超出则裁剪,不足则补全。 |
10
+ | SYN-4 | **句长约束** | 中文句 ≤20 字,英文句 ≤25 词。超过就拆句。 |
11
+ | SYN-5 | **表格判据** | ≥3 个字段的结构化数据用表格;≤2 字段用描述列表或行内文本。 |
12
+ | SYN-6 | **来源列** | 对比表与时间线表必须含「来源」列。无来源的断言不可信。 |
13
+ | SYN-7 | **时间线三列** | 事件时间线表固定三列:时间 | 事件 | 来源。缺来源列=不合格。 |
14
+ | SYN-8 | **行动项五要素** | 行动项表六列(含五要素):措施(行内容) | 类型 | 负责人 | 期限 | 验证 | 状态。五要素=类型、负责人、期限、验证、状态。 |
15
+ | SYN-9 | **固定尾部** | 每页尾部必须有 `## Related Pages` / `## 相关页面` 节,挂至少一个真实链接到现存页面。 |
16
+ | SYN-10 | **状态块** | H1 后紧跟状态块:`> **Status**: Active | **Updated**: YYYY-MM-DD | **Scope**: 一行回答本页回答什么问题`。状态取值 `Active` / `Historical` / `Superseded`。中文页用 `状态`/`更新`/`范围`。 |
17
+ | SYN-11 | **无杂项筐** | 禁止「其他」「杂项」「Miscellaneous」节。归不进去的内容放别的页面或不放。 |
18
+ | SYN-12 | **无溢美词** | 禁止「robust」「streamline」「leverage」「utilize」「world-class」「cutting-edge」及其等价中文(「强大的」「领先的」「赋能」)。用事实和数据说话。 |
19
+ | SYN-13 | **无占位债** | 禁止 TODO、TBD、待补充。不知道就不写那个节。 |
20
+ | SYN-14 | **原始数据精度** | 数字按需保留精度。`65.38461538461539/100` 写 `65.4/100`,除非精度本身是要点。 |
21
+ | SYN-15 | **禁止空节** | `### 优点` 下写 `(无)`→ 删掉整个节。空节占空间不传递信息。 |
22
+ | SYN-16 | **禁止原始转储** | shell 输出、聊天日志、超过 5-10 行的堆栈跟踪不直接入页。提取发现,只引用决定性行。 |
23
+ | SYN-17 | **时间 vs 主题** | 参考页按主题组织,不按天记日记。时间线结构只用于事件/事故页(G1)。 |
24
+ | SYN-18 | **链接规范** | 内部链接用 `[Label](/path)` 格式。禁止 `[[path|label]]` 旧语法。每条链接必须指向 cache map 中现存的路径。 |
25
+ | SYN-19 | **双语孪生** | 每个 en 页有 zh 孪生页,路径相同、语言不同。孪生标题各用本语言(如 `Architecture` / `建筑`)。正文节对节镜像。 |
26
+ | SYN-20 | **Supersede 协议** | 新页取代旧页时:(1) 新页达标准 (2) 旧页状态块改 `Superseded` + 链接新页 (3) 更新 wiki-index (4) 不允许两页同时声称是某主题的权威。 |
27
+
28
+ ## 来源
29
+
30
+ 提炼自 `docs/research/cross-cultural-wiki-writing.md` 的 SYN-1..20 综合规则集,结合 5 文化维度(EN/ZH/DE/FR/RU)的交叉验证。
@@ -0,0 +1,84 @@
1
+ # 写作风格与信息密度
2
+
3
+ > 控制 wiki 页面的信息密度、语言规范、双语写作惯例。
4
+
5
+ ## 信息密度规则
6
+
7
+ | 规则 | 阈值 | 违反时的修正 |
8
+ |------|------|-------------|
9
+ | 导言占比 | 全文 10-15% | 超过则裁剪到核心结论;不足则补充概括 |
10
+ | 中文句长 | ≤20 字 | 拆为两句或用逗号分隔 |
11
+ | 英文句长 | ≤25 词 | 拆为两句或改为列表 |
12
+ | 结构化入表 | ≥3 字段 | 用表格呈现;≤2 字段用描述列表 |
13
+ | 来源列 | 对比表/时间线必含 | 补充来源列 |
14
+ | 无溢美词 | 零容忍 | 删除修饰词,用数据替代 |
15
+ | 无杂项筐 | 禁止「其他」「Miscellaneous」 | 归入具体主题或移出本页 |
16
+ | 固定尾部 | `## Related Pages` 必须存在且含真实链接 | 补链接或删除空节 |
17
+
18
+ ## 双语写作惯例
19
+
20
+ wiki 页面是 **en/zh 孪生体**:同一路径、两种语言、节对节镜像。
21
+
22
+ ### 标题
23
+
24
+ 每种语言用自然标题:
25
+
26
+ | en | zh |
27
+ |----|----|
28
+ | Architecture | 建筑 |
29
+ | Incident Postmortem | 事件复盘 |
30
+ | KV Cache Tuning | KV 缓存调优 |
31
+ | Model Comparison | 模型对比 |
32
+
33
+ 不混合语言。英文标题不出现在中文页,反之亦然。
34
+
35
+ ### 正文结构
36
+
37
+ - **节序一致**:en 页的 `## Background` 对应 zh 页的 `## 背景`,顺序相同
38
+ - **表格结构一致**:列数和含义一致,列标题各用本语言
39
+ - **代码块不翻译**:命令、配置、代码保持原样
40
+ - **链接路径不翻译**:`[标签](/path)` 中 path 不变,label 翻译
41
+
42
+ ### 状态块双语
43
+
44
+ 英文页:
45
+ ```markdown
46
+ > **Status**: Active | **Updated**: 2026-09-01 | **Scope**: How KV cache sizing affects throughput
47
+ ```
48
+
49
+ 中文页:
50
+ ```markdown
51
+ > **状态**: 活跃 | **更新**: 2026-09-01 | **范围**: KV 缓存大小如何影响吞吐量
52
+ ```
53
+
54
+ ### 翻译行为
55
+
56
+ - `historian_page_create(twin:true)` 自动创建另一语言的孪生页
57
+ - `historian_translate_snippet` 手动翻译片段
58
+ - 代码块、表格行、URL 在翻译时被保护(不替换)
59
+ - 翻译失败时 en 页正常落库,zh 状态标 `pending`
60
+
61
+ ## 中文写作细则
62
+
63
+ 1. **用简体字**,不用繁体
64
+ 2. **数字与单位**:数字用阿拉伯数字(`3 个`,不 `三个`),单位用国际符号(`ms`、`GB`、`tok/s`)
65
+ 3. **中英混排**:中文与英文/数字之间加半角空格(`使用 Docker 部署`)
66
+ 4. **标点**:中文语境用全角标点;引号用「」(不 "")
67
+ 5. **术语**:首次出现给中英对照(`KV 缓存 (KV Cache)`),后续用中文
68
+
69
+ ## 禁止词汇
70
+
71
+ | 英文 | 中文等价 | 替代 |
72
+ |------|---------|------|
73
+ | robust | 强大的 | 用具体指标 |
74
+ | leverage / utilize | 利用 / 赋能 | 用「使用」 |
75
+ | streamline | 优化 | 写具体改了什么 |
76
+ | world-class | 领先的 | 给排名或基准 |
77
+ | cutting-edge | 先进的 | 给版本号 |
78
+ | in order to | — | 用「to」 |
79
+ | please don't hesitate | — | 删除 |
80
+ | delve | 深入 | 用「分析」或「调查」 |
81
+
82
+ ## 来源
83
+
84
+ 提炼自 `docs/research/cross-cultural-wiki-writing.md` 信息密度节(SYN-3/4/5/11/12/14/15)与双语写作惯例(EN/ZH 对照样本)。
@@ -0,0 +1,87 @@
1
+ # wiki.js 2.x 能力指南
2
+
3
+ > wiki.js 2.x 的写作表面、管理配置、API 陷阱。面向两类读者:(1) 史官工具使用者("中文页面在哪看");(2) skill 开发者(API 陷阱→工具行为解释)。
4
+
5
+ ## 中文页面在哪看
6
+
7
+ wiki.js 的多语言靠 **namespacing**(路径前缀)实现,不是浏览器翻译。
8
+
9
+ | 场景 | URL | 说明 |
10
+ |------|-----|------|
11
+ | 英文页 | `http://<your-wiki>:3000/ops/wiki` | 默认 locale 无路径前缀 |
12
+ | 中文页 | `http://<your-wiki>:3000/zh/ops/wiki` | 加 `zh/` 前缀 |
13
+ | 语言切换 | 页面右上角 language switcher | 仅在 Admin > Locales 开启了多 locale + namespacing 后才显示 |
14
+
15
+ **前置条件**(缺一不可):
16
+ 1. Admin > Locales > 勾选 Active Namespaces 包含 `zh`
17
+ 2. Admin > Locales > 启用 namespacing
18
+ 3. 该页面确实有 zh locale 的内容(工具自动创建孪生页时完成)
19
+
20
+ **目录 (TOC)**:wiki.js 的 TOC 不在页面内容里,而是由 Admin > Theme > TOC 配置自动从 H2/H3 生成。页面内不要手写目录。
21
+
22
+ ---
23
+
24
+ ## 写作表达件速查
25
+
26
+ wiki.js 使用 markdown-it 11.0.1 渲染。以下是可用的增强语法:
27
+
28
+ | 元素 | 语法 | 渲染效果 |
29
+ |------|------|----------|
30
+ | 提示块(信息) | `> 内容\n{.is-info}` | 蓝色信息提示框 |
31
+ | 提示块(警告) | `> 内容\n{.is-warning}` | 黄色警告框 |
32
+ | 提示块(危险) | `> 内容\n{.is-danger}` | 红色危险框 |
33
+ | 提示块(成功) | `> 内容\n{.is-success}` | 绿色成功框 |
34
+ | 紧凑表格 | 表格 markdown 后加 `{.dense}` | 减少行距 |
35
+ | 脚注 | `[^1]` 引用 + `[^1]: 脚注内容` 定义 | 底部脚注 |
36
+ | KaTeX 数学 | `$E=mc^2$`(行内)/ `$$...$$`(块) | 数学公式 |
37
+ | Mermaid 图 | ` ```mermaid ` 代码块 | 流程图/时序图 |
38
+ | 标签页 | `[Tab A](#tab-a)\n[Tab B](#tab-b)` + `## Tab A` | 切换标签 |
39
+ | 定义列表 | `Term\n: Definition` | 术语定义 |
40
+
41
+ ## 禁止使用
42
+
43
+ | 语法 | 为什么不行 |
44
+ |------|-----------|
45
+ | `{{toc}}` | wiki.js 不处理 mustache 模板标签,原样输出为文本 |
46
+ | `:::` container | wiki.js 的 markdown-it 插件不识别 container 语法,破坏渲染 |
47
+ | YAML frontmatter (`---\ntitle: …\n---`) | wiki.js 的标题/描述由数据库字段管理,frontmatter 会被当作正文显示 |
48
+ | `[[path\|label]]` 链接 | wiki.js 用标准 markdown 链接 `[Label](/path)`,旧语法不解析 |
49
+
50
+ ---
51
+
52
+ ## API 陷阱(9 项)→ 工具行为解释
53
+
54
+ 这些陷阱是工具设计决策的直接原因。遇到工具返回错误时可对照此表。
55
+
56
+ | # | 陷阱 | 工具如何应对 |
57
+ |---|------|-------------|
58
+ | 1 | `pages.update` 必须发送**全部字段**,只发变更字段会清空其余字段 | `historian_page_update` 内部先 read 全量再合并,写回完整字段集 |
59
+ | 2 | 创建页面后无法直接从响应取 id;必须按 (path, locale) 回查 | `historian_page_create` 自动完成回查,返回 `page_id` |
60
+ | 3 | `responseResult.succeeded===false` 时错误码在 payload 内,不在 HTTP 状态码 | 工具将 payload 错误解析为结构化错误返回 |
61
+ | 4 | 空 content 创建会被拒绝(`Page content cannot be empty`) | `historian_page_create` 不传 content 时返回本地骨架模板,不发写请求 |
62
+ | 5 | `pages.move` 是独立 mutation,不是 update 的 path 字段 | `historian_move` 专用 move mutation |
63
+ | 6 | GraphQL 单页查询必须用 `singleByPath` + 显式 locale;默认 locale 查询可能命中错误页 | `historian_read` 始终传 locale 参数 |
64
+ | 7 | 上传文件端点 `/u` 的字段名固定为 `mediaUpload`,文件名需净化 | `historian_page_create` 不涉及上传;资产上传为独立能力 |
65
+ | 8 | `isPublished: false` 的页面匿名访问 404,所有 URL-200 检查会静默失败 | `historian_page_create` 默认 `isPublished: true`,仅 `_sandbox/` 显式传 false |
66
+ | 9 | 路径首段匹配 locale 模式(`zh`/`en`/`a`)会被保留路径冲突,长度 1 也被拒 | `historian_page_create` 的路径校验拒 `zh/foo`、`home` 等保留路径 |
67
+
68
+ ## 路径校验规则
69
+
70
+ 合法路径:`lowercase-hyphen`,每段 ≥2 字符,不含 `.`、空格、`\`、`//`。
71
+ 保留路径(首段禁):`home`、`login`、`register`、`graphql`、`healthz`、`_assets`、`favicon`。
72
+ 首段匹配 `^[A-Za-z]{2}(-[A-Za-z]{2})?$`(大小写不敏感)也被拒(防 locale 冲突)。
73
+
74
+ ## 管理配置入口
75
+
76
+ | 功能 | 路径 |
77
+ |------|------|
78
+ | 多语言开关 | Admin > Locales > Active Namespaces + namespacing |
79
+ | API Token 管理 | Admin > API Access |
80
+ | Token 权限范围 | Admin > Groups > page-rules(path glob 匹配) |
81
+ | 主题与 TOC | Admin > Theme |
82
+ | 评论开关 | Admin > Comments |
83
+ | 用户管理 | Admin > Users |
84
+
85
+ ## 来源
86
+
87
+ 调研文件:`docs/research/wikijs-2x-report.md`(API 陷阱实测)、`docs/research/wikijs-2x-capabilities-digest.md`(能力摘要)。