@fgbg/mdocs 0.8.8 → 0.8.10
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/agent-skills/changelog/SKILL.md +286 -0
- package/agent-skills/core-concepts-all-files/SKILL.md +53 -0
- package/agent-skills/core-concepts-domain/SKILL.md +106 -0
- package/agent-skills/core-concepts-invitation/SKILL.md +61 -0
- package/agent-skills/core-concepts-no-account/SKILL.md +85 -0
- package/agent-skills/deployment-config/SKILL.md +47 -0
- package/agent-skills/deployment-requirements/SKILL.md +50 -0
- package/agent-skills/deployment-reverse-proxy/SKILL.md +71 -0
- package/agent-skills/faq/SKILL.md +48 -0
- package/agent-skills/getting-started-first-kb/SKILL.md +40 -0
- package/agent-skills/getting-started-installation/SKILL.md +119 -0
- package/agent-skills/index/SKILL.md +47 -0
- package/agent-skills/index.json +184 -0
- package/agent-skills/usage-bookmarks/SKILL.md +93 -0
- package/agent-skills/usage-cli-token/SKILL.md +128 -0
- package/agent-skills/usage-comments/SKILL.md +149 -0
- package/agent-skills/usage-domain-members/SKILL.md +104 -0
- package/agent-skills/usage-drafts/SKILL.md +111 -0
- package/agent-skills/usage-flowchart/SKILL.md +88 -0
- package/agent-skills/usage-markdown/SKILL.md +105 -0
- package/agent-skills/usage-merge-conflicts/SKILL.md +42 -0
- package/agent-skills/usage-my-documents/SKILL.md +106 -0
- package/agent-skills/usage-onboarding-ai/SKILL.md +49 -0
- package/agent-skills/usage-recovery-code/SKILL.md +72 -0
- package/agent-skills/usage-search/SKILL.md +34 -0
- package/agent-skills/usage-settings/SKILL.md +118 -0
- package/agent-skills/why-mdocs/SKILL.md +13 -0
- package/dist/server/agent/Agent/run.js +222 -0
- package/dist/server/agent/Agent/run.js.map +1 -0
- package/dist/server/agent/Agent/session-manager.js +147 -0
- package/dist/server/agent/Agent/session-manager.js.map +1 -0
- package/dist/server/agent/Agent/system-prompt.js +13 -0
- package/dist/server/agent/Agent/system-prompt.js.map +1 -0
- package/dist/server/agent/Agent/tools.js +37 -0
- package/dist/server/agent/Agent/tools.js.map +1 -0
- package/dist/server/agent/Config/config.js +113 -0
- package/dist/server/agent/Config/config.js.map +1 -0
- package/dist/server/agent/Skill/skill-loader.js +46 -0
- package/dist/server/agent/Skill/skill-loader.js.map +1 -0
- package/dist/server/app.js +2 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/db/repositories/agent-model-config.repo.js +17 -0
- package/dist/server/db/repositories/agent-model-config.repo.js.map +1 -0
- package/dist/server/db/schema.js +10 -0
- package/dist/server/db/schema.js.map +1 -1
- package/dist/server/routes/agent.routes.js +135 -0
- package/dist/server/routes/agent.routes.js.map +1 -0
- package/dist/web/assets/{MergeView-BBr64bam.js → MergeView-Da6W6Mwd.js} +1 -1
- package/dist/web/assets/{_baseUniq-DPiuTO9O.js → _baseUniq-DIXaUG3P.js} +1 -1
- package/dist/web/assets/{arc-BjFiPdRI.js → arc-BdrqKgEt.js} +1 -1
- package/dist/web/assets/{architectureDiagram-Q4EWVU46-Bg5q-eAF.js → architectureDiagram-Q4EWVU46-C7DbabmE.js} +1 -1
- package/dist/web/assets/{blockDiagram-DXYQGD6D-BD2W9g1m.js → blockDiagram-DXYQGD6D-xpzHPtBf.js} +1 -1
- package/dist/web/assets/{c4Diagram-AHTNJAMY-EutGBUph.js → c4Diagram-AHTNJAMY-C55XB-0p.js} +1 -1
- package/dist/web/assets/channel-R2F1bwis.js +1 -0
- package/dist/web/assets/{chunk-4BX2VUAB-DjI4WDbc.js → chunk-4BX2VUAB-Cw9cGcvA.js} +1 -1
- package/dist/web/assets/{chunk-4TB4RGXK-STKj2CZp.js → chunk-4TB4RGXK-Bb7TaNsp.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-DjjX4E45.js → chunk-55IACEB6-ClfU0bTR.js} +1 -1
- package/dist/web/assets/{chunk-EDXVE4YY-BV5S3HvN.js → chunk-EDXVE4YY-DEYQg7so.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-BqEWdzLG.js → chunk-FMBD7UC4-l0uxylnu.js} +1 -1
- package/dist/web/assets/{chunk-OYMX7WX6-CaY5tJMJ.js → chunk-OYMX7WX6-CTuAfYj2.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-Dpnf7BSM.js → chunk-QZHKN3VN-Cd5BdpCj.js} +1 -1
- package/dist/web/assets/{chunk-YZCP3GAM-CkhOhodd.js → chunk-YZCP3GAM-C4AFz6HK.js} +1 -1
- package/dist/web/assets/classDiagram-6PBFFD2Q-D8Aoi_kK.js +1 -0
- package/dist/web/assets/classDiagram-v2-HSJHXN6E-D8Aoi_kK.js +1 -0
- package/dist/web/assets/clone-D3UTWyOI.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-TnRvn8wH.js → cose-bilkent-S5V4N54A-DPbGSIxQ.js} +1 -1
- package/dist/web/assets/{dagre-KV5264BT-sJWGoaLD.js → dagre-KV5264BT-BAqCvioS.js} +1 -1
- package/dist/web/assets/{diagram-5BDNPKRD-D-m_kU_W.js → diagram-5BDNPKRD-BVhjoylL.js} +1 -1
- package/dist/web/assets/{diagram-G4DWMVQ6-Czc0GOtJ.js → diagram-G4DWMVQ6-BgdBEUo2.js} +1 -1
- package/dist/web/assets/{diagram-MMDJMWI5-IOAJuFuD.js → diagram-MMDJMWI5-v3XiVR4L.js} +1 -1
- package/dist/web/assets/{diagram-TYMM5635-B6J_V3un.js → diagram-TYMM5635-Bnlc4JL7.js} +1 -1
- package/dist/web/assets/{erDiagram-SMLLAGMA-Dzv2Z19V.js → erDiagram-SMLLAGMA-DZNfy5XO.js} +1 -1
- package/dist/web/assets/{flowDiagram-DWJPFMVM-BEVdVQjJ.js → flowDiagram-DWJPFMVM-CyNHaoXD.js} +1 -1
- package/dist/web/assets/{ganttDiagram-T4ZO3ILL-CqDRowWZ.js → ganttDiagram-T4ZO3ILL-D9XKVK6L.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-id1A35b6.js → gitGraphDiagram-UUTBAWPF-BsoJR5By.js} +1 -1
- package/dist/web/assets/{graph-D1ZUACO1.js → graph-C6hZEMMA.js} +1 -1
- package/dist/web/assets/{index-CG_5hNy2.js → index-BiYwrQhS.js} +1245 -1196
- package/dist/web/assets/index-C4tGH1XB.css +1 -0
- package/dist/web/assets/{infoDiagram-42DDH7IO-VCo7Y_XY.js → infoDiagram-42DDH7IO-EsbSvvwg.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-2zkFwtGK.js → ishikawaDiagram-UXIWVN3A-opc9PUAq.js} +1 -1
- package/dist/web/assets/{journeyDiagram-VCZTEJTY-9xfjIDzZ.js → journeyDiagram-VCZTEJTY-CGoqXdQp.js} +1 -1
- package/dist/web/assets/{kanban-definition-6JOO6SKY-CtlIC6o7.js → kanban-definition-6JOO6SKY-BsMSOTEO.js} +1 -1
- package/dist/web/assets/{layout-BwiWnDDL.js → layout-dka4PN3u.js} +1 -1
- package/dist/web/assets/{linear-BCmqTrEt.js → linear-C7358dWt.js} +1 -1
- package/dist/web/assets/{min-HUIhyFEJ.js → min-CkhEOvqb.js} +1 -1
- package/dist/web/assets/{mindmap-definition-QFDTVHPH-CxMrCCZd.js → mindmap-definition-QFDTVHPH-Cw5Uw5sO.js} +1 -1
- package/dist/web/assets/{pieDiagram-DEJITSTG-DfotdBjp.js → pieDiagram-DEJITSTG-D_2NhEs9.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-34T5L4WZ-BQP7wk7X.js → quadrantDiagram-34T5L4WZ-CCoI5QqP.js} +1 -1
- package/dist/web/assets/{requirementDiagram-MS252O5E-B_TtEKSs.js → requirementDiagram-MS252O5E-DlRuHrpI.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-XADWPNL6-DaSKJ2JV.js → sankeyDiagram-XADWPNL6-CqeHUQiU.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-FGHM5R23-BjmdElN-.js → sequenceDiagram-FGHM5R23-bAgSxA1M.js} +1 -1
- package/dist/web/assets/{stateDiagram-FHFEXIEX-BNaY_Ekl.js → stateDiagram-FHFEXIEX-BY710eMg.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BQw6J9EK.js +1 -0
- package/dist/web/assets/{timeline-definition-GMOUNBTQ-BsVGIy02.js → timeline-definition-GMOUNBTQ-Dm1cJJzA.js} +1 -1
- package/dist/web/assets/{vennDiagram-DHZGUBPP-DvxeoAnH.js → vennDiagram-DHZGUBPP-x15pVuxW.js} +1 -1
- package/dist/web/assets/wardley-RL74JXVD-Baa2vTyp.js +162 -0
- package/dist/web/assets/{wardleyDiagram-NUSXRM2D-IHiVP54x.js → wardleyDiagram-NUSXRM2D-DD4pCNVv.js} +1 -1
- package/dist/web/assets/{xychartDiagram-5P7HB3ND-juQThxJ3.js → xychartDiagram-5P7HB3ND-Cj82t7kB.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +8 -2
- package/dist/web/assets/channel-DXrjDOYn.js +0 -1
- package/dist/web/assets/classDiagram-6PBFFD2Q-9bBkEPwQ.js +0 -1
- package/dist/web/assets/classDiagram-v2-HSJHXN6E-9bBkEPwQ.js +0 -1
- package/dist/web/assets/clone-CeG9DhNI.js +0 -1
- package/dist/web/assets/index-BUN3YDVd.css +0 -1
- package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-spf8Ruqx.js +0 -1
- package/dist/web/assets/wardley-RL74JXVD-Cefj9jwz.js +0 -162
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: deployment-requirements
|
|
3
|
+
name: "环境要求"
|
|
4
|
+
description: "- **无外部服务依赖**:不需要安装数据库、缓存、消息队列等中间件 - SQLite:内嵌在 better-sqlite3 中,零配置 - 文档存储:直接使用文件系统"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: deployment/requirements.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 环境要求
|
|
10
|
+
|
|
11
|
+
## 运行时
|
|
12
|
+
|
|
13
|
+
| 资源 | 要求 |
|
|
14
|
+
|------|------|
|
|
15
|
+
| 运行时 | Node.js 22+ |
|
|
16
|
+
| 包管理器 | pnpm(推荐) |
|
|
17
|
+
| CPU | 1 核(开发/小团队够用) |
|
|
18
|
+
| 内存 | 512 MB 以上 |
|
|
19
|
+
| 磁盘 | 视文档量而定 |
|
|
20
|
+
|
|
21
|
+
## 依赖
|
|
22
|
+
|
|
23
|
+
- **无外部服务依赖**:不需要安装数据库、缓存、消息队列等中间件
|
|
24
|
+
- SQLite:内嵌在 better-sqlite3 中,零配置
|
|
25
|
+
- 文档存储:直接使用文件系统
|
|
26
|
+
|
|
27
|
+
## 存储布局
|
|
28
|
+
|
|
29
|
+
运行时数据集中存储在 `~/.mdocs/` 目录下:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
~/.mdocs/
|
|
33
|
+
sqlite/
|
|
34
|
+
data.sqlite # 元数据(文档索引、访客、权限、审计日志)
|
|
35
|
+
files/
|
|
36
|
+
docs/
|
|
37
|
+
{domain_id}/ # 每个域独立的子目录
|
|
38
|
+
a.md # 域内文档(Lexical JSON 格式)
|
|
39
|
+
assets/ # 上传的附件
|
|
40
|
+
logs/ # 运行日志(按日期轮转)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
可通过环境变量 `MDOCS_DATA_DIR` 自定义数据目录位置。
|
|
44
|
+
|
|
45
|
+
## 网络
|
|
46
|
+
|
|
47
|
+
- 默认监听 `0.0.0.0:4000`(所有网卡,适合服务器直接暴露或通过反向代理)
|
|
48
|
+
- 本地开发若只想本机访问:`export MDOCS_HOST=127.0.0.1`
|
|
49
|
+
- 生产部署仍建议通过反向代理对外暴露(见[反向代理](./reverse-proxy.md))
|
|
50
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: deployment-reverse-proxy
|
|
3
|
+
name: "反向代理配置"
|
|
4
|
+
description: "生产部署时,推荐将 mdocs 放在反向代理之后,由代理层处理 TLS 证书、域名绑定、日志等。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: deployment/reverse-proxy.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 反向代理配置
|
|
10
|
+
|
|
11
|
+
生产部署时,推荐将 mdocs 放在反向代理之后,由代理层处理 TLS 证书、域名绑定、日志等。
|
|
12
|
+
|
|
13
|
+
## Nginx
|
|
14
|
+
|
|
15
|
+
```nginx
|
|
16
|
+
server {
|
|
17
|
+
listen 443 ssl;
|
|
18
|
+
server_name docs.yourdomain.com;
|
|
19
|
+
|
|
20
|
+
ssl_certificate /path/to/cert.pem;
|
|
21
|
+
ssl_certificate_key /path/to/key.pem;
|
|
22
|
+
|
|
23
|
+
location / {
|
|
24
|
+
proxy_pass http://127.0.0.1:4000;
|
|
25
|
+
proxy_set_header Host $host;
|
|
26
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
27
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
28
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
29
|
+
|
|
30
|
+
# WebSocket 支持(如果需要)
|
|
31
|
+
proxy_http_version 1.1;
|
|
32
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
33
|
+
proxy_set_header Connection "upgrade";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
> 同机 Nginx 反代时,`proxy_pass http://127.0.0.1:4000` 即可(mdocs 默认监听 `0.0.0.0:4000`)。若曾手动设过 `MDOCS_HOST=127.0.0.1`,需改回 `0.0.0.0` 或删掉该变量。
|
|
39
|
+
|
|
40
|
+
## Caddy
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
docs.yourdomain.com {
|
|
44
|
+
reverse_proxy localhost:4000
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Docker Compose
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
services:
|
|
52
|
+
mdocs:
|
|
53
|
+
build: .
|
|
54
|
+
ports:
|
|
55
|
+
- "127.0.0.1:4000:4000"
|
|
56
|
+
environment:
|
|
57
|
+
- MDOCS_DATA_DIR=/data
|
|
58
|
+
volumes:
|
|
59
|
+
- mdocs-data:/data
|
|
60
|
+
|
|
61
|
+
nginx:
|
|
62
|
+
image: nginx:alpine
|
|
63
|
+
ports:
|
|
64
|
+
- "80:80"
|
|
65
|
+
- "443:443"
|
|
66
|
+
volumes:
|
|
67
|
+
- ./nginx.conf:/etc/nginx/conf.d/default.conf
|
|
68
|
+
depends_on:
|
|
69
|
+
- mdocs
|
|
70
|
+
```
|
|
71
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: faq
|
|
3
|
+
name: "FAQ"
|
|
4
|
+
description: "**Notion** 是 SaaS 服务,数据在云端,隐私受制于服务商;**Obsidian** 是本地优先,但多人协作需要额外付费方案。mdocs 在这两者之间取了一个平衡:**纯私有化部署 + 无账户协作**。你控制服务器,但协作者不需要注册任何账户。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: faq.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# FAQ
|
|
10
|
+
|
|
11
|
+
### mdocs 和 Notion / Obsidian 有什么区别?
|
|
12
|
+
|
|
13
|
+
**Notion** 是 SaaS 服务,数据在云端,隐私受制于服务商;**Obsidian** 是本地优先,但多人协作需要额外付费方案。mdocs 在这两者之间取了一个平衡:**纯私有化部署 + 无账户协作**。你控制服务器,但协作者不需要注册任何账户。
|
|
14
|
+
|
|
15
|
+
### 需要安装数据库吗?
|
|
16
|
+
|
|
17
|
+
不需要。mdocs 使用 SQLite,数据存储在 `~/.mdocs/` 目录中,无需单独安装或管理任何数据库服务。
|
|
18
|
+
|
|
19
|
+
### 数据存在哪里?
|
|
20
|
+
|
|
21
|
+
- **文档内容**:以 Lexical JSON 格式存储在文件系统
|
|
22
|
+
- **元数据**(索引、权限、访客信息):存储在 SQLite 数据库中
|
|
23
|
+
- **未发布的草稿**:存储在浏览器 IndexedDB 中
|
|
24
|
+
- 备份时只需复制整个数据目录即可
|
|
25
|
+
|
|
26
|
+
### 支持多人协作吗?
|
|
27
|
+
|
|
28
|
+
支持。通过「域 + 文档级邀请」实现:
|
|
29
|
+
- public 域的文档默认可被所有人查看
|
|
30
|
+
- 文档所有者可以邀请特定访客获得编辑权限
|
|
31
|
+
- 不需要协作者注册账户
|
|
32
|
+
|
|
33
|
+
### 适合多大规模?
|
|
34
|
+
|
|
35
|
+
mdocs 主要面向**小团队**(几人到十几人)。没有用户系统、没有复杂的权限层级,这是有意为之的简化。
|
|
36
|
+
|
|
37
|
+
### 数据如何备份?
|
|
38
|
+
|
|
39
|
+
直接复制 `~/.mdocs/` 目录即可。文档存储格式为 JSON,需要搭配 SQLite 元数据才能完整恢复。
|
|
40
|
+
|
|
41
|
+
### 能不能导出数据?
|
|
42
|
+
|
|
43
|
+
目前文档以 Lexical JSON 格式存储,只能由 mdocs 加载。未来会提供 Markdown 导出功能。元数据在 SQLite 中,可以用 SQLite 工具直接读取。
|
|
44
|
+
|
|
45
|
+
### 如何升级?
|
|
46
|
+
|
|
47
|
+
拉取最新代码 → `pnpm install && pnpm build` → 重启进程。数据库和文档格式保持向后兼容。
|
|
48
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: getting-started-first-kb
|
|
3
|
+
name: "第一个文档"
|
|
4
|
+
description: "启动 mdocs 后,浏览器会弹出**访客注册**对话框——输入一个名称即可创建身份 "
|
|
5
|
+
keywords: []
|
|
6
|
+
source: getting-started/first-kb.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 第一个文档
|
|
10
|
+
|
|
11
|
+
## 创建身份
|
|
12
|
+
|
|
13
|
+
启动 mdocs 后,浏览器会弹出**访客注册**对话框——输入一个名称即可创建身份
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+
## 创建文档
|
|
17
|
+
|
|
18
|
+
1. 注册完成后,点击左侧边栏的「新建文档」
|
|
19
|
+
2. 输入文件名(如 `hello.md`),点击创建
|
|
20
|
+
3. 文档创建后自动进入编辑器
|
|
21
|
+
|
|
22
|
+
## 编辑器界面
|
|
23
|
+
|
|
24
|
+

|
|
25
|
+
|
|
26
|
+
点击`新建文档`,创建md文档。点击`创建文件夹`,创建文件夹
|
|
27
|
+
|
|
28
|
+
## 编辑与保存
|
|
29
|
+
|
|
30
|
+
- **自动保存**:编辑内容实时存入浏览器本地数据库(IndexedDB),断网不丢
|
|
31
|
+
- **发布**:点击「发布」将内容同步到服务器,持久化为 Markdown 文件
|
|
32
|
+
|
|
33
|
+
## 目录结构
|
|
34
|
+
|
|
35
|
+
文档在文件系统中以文件形式存储。后端将文档路径树映射为左侧边栏的文件夹结构,支持嵌套目录。
|
|
36
|
+
|
|
37
|
+
## 核心思路
|
|
38
|
+
|
|
39
|
+
mdocs 的设计哲学是:**编辑时用富文本,存储时用Lexical维护的Json**。编辑器内部使用 Lexical JSON 保留格式信息,发布时写入 `.md` 文件,确保数据永远可读、可迁移。
|
|
40
|
+
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: getting-started-installation
|
|
3
|
+
name: "安装"
|
|
4
|
+
description: "- **运行时**:Node.js 22+ - **无需额外安装数据库或中间件**"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: getting-started/installation.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 安装
|
|
10
|
+
|
|
11
|
+
## 环境要求
|
|
12
|
+
|
|
13
|
+
- **运行时**:Node.js 22+
|
|
14
|
+
- **无需额外安装数据库或中间件**
|
|
15
|
+
|
|
16
|
+
## 快速安装(推荐)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g @fgbg/mdocs
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
安装完成后,直接运行:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
mdocs
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
即可启动服务,访问 `http://localhost:4000`。
|
|
29
|
+
|
|
30
|
+
也可以临时体验:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx @fgbg/mdocs
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 从源码构建(开发模式)
|
|
37
|
+
|
|
38
|
+
如果你需要参与开发或自定义功能:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git clone https://github.com/xuhuafeifei/mdocs
|
|
42
|
+
cd mdocs
|
|
43
|
+
pnpm install
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 启动开发模式
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm dev
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
一条命令同时启动后端(Express,`localhost:4000`)和前端(Vite,`localhost:5173`,自动代理 `/api`)。
|
|
53
|
+
|
|
54
|
+
### 构建与运行
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pnpm build # 构建前端 + 编译后端
|
|
58
|
+
pnpm start # 生产模式,同一端口提供前端和 API
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## CLI 命令
|
|
62
|
+
|
|
63
|
+
`mdocs` 包附带管理命令:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# 列出所有访客
|
|
67
|
+
mdocs visitor list
|
|
68
|
+
|
|
69
|
+
# 访客迁移(按名称,推荐)
|
|
70
|
+
mdocs visitor migrate --from Alice --to Bob --confirm
|
|
71
|
+
|
|
72
|
+
# 访客迁移(按 UUID,精确匹配)
|
|
73
|
+
mdocs visitor migrate --from OLD_UUID --to NEW_UUID --confirm
|
|
74
|
+
|
|
75
|
+
# 试运行,查看影响范围但不实际执行
|
|
76
|
+
mdocs visitor migrate --from Alice --to Bob --dry-run
|
|
77
|
+
|
|
78
|
+
# 显式启动服务
|
|
79
|
+
mdocs start
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 运行时数据
|
|
83
|
+
|
|
84
|
+
首次启动后,数据目录自动创建在 `~/.mdocs/`:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
~/.mdocs/
|
|
88
|
+
sqlite/
|
|
89
|
+
data.sqlite # 元数据(文档索引、权限、访客、审计日志)
|
|
90
|
+
files/
|
|
91
|
+
docs/
|
|
92
|
+
{domain_id}/ # 每个域独立的子目录
|
|
93
|
+
a.md # 域内文档
|
|
94
|
+
folder/ # 域内子目录(逻辑存在于数据库)
|
|
95
|
+
b.md
|
|
96
|
+
assets/ # 上传的附件
|
|
97
|
+
logs/ # 运行日志
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
文档以 Lexical JSON 格式存储在 `files/docs/` 中,只能由 mdocs 加载编辑。
|
|
101
|
+
|
|
102
|
+
## 验证
|
|
103
|
+
|
|
104
|
+
启动后访问 `http://localhost:4000`(npm 安装)或 `http://localhost:5173`(开发模式),看到访客注册弹窗即表示运行成功。
|
|
105
|
+
|
|
106
|
+
## 升级
|
|
107
|
+
|
|
108
|
+
通过 npm 安装的版本,直接重新安装即可升级:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
npm install -g @fgbg/mdocs@latest
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
升级后重启服务即可。
|
|
115
|
+
|
|
116
|
+
## 下一步
|
|
117
|
+
|
|
118
|
+
了解 [核心设计理念](../core-concepts/domain.md),或直接[创建第一个文档](./first-kb.md)。
|
|
119
|
+
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: index
|
|
3
|
+
name: "mdocs 文档"
|
|
4
|
+
description: "欢迎阅读 mdocs 使用文档。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: index.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# mdocs 文档
|
|
10
|
+
|
|
11
|
+
欢迎阅读 mdocs 使用文档。
|
|
12
|
+
|
|
13
|
+
## 快速开始
|
|
14
|
+
|
|
15
|
+
- [安装与启动](./getting-started/installation.md)
|
|
16
|
+
- [第一个文档](./getting-started/first-kb.md)
|
|
17
|
+
|
|
18
|
+
## 核心设计
|
|
19
|
+
|
|
20
|
+
- [域隔离](./core-concepts/domain.md)——团队与个人的逻辑边界
|
|
21
|
+
- [无账户身份识别](./core-concepts/no-account.md)——打开即用,无需注册
|
|
22
|
+
- [文档级邀请](./core-concepts/invitation.md)——精细到单篇文档的权限控制
|
|
23
|
+
|
|
24
|
+
## 使用指南
|
|
25
|
+
|
|
26
|
+
- [设置页面概览](./usage/settings.md)——集中配置中心
|
|
27
|
+
- [上手助手(AI)](./usage/onboarding-ai.md)——产品向导,答疑不代写
|
|
28
|
+
- [编辑体验](./usage/markdown.md)——富文本编辑,Markdown 存储
|
|
29
|
+
- [流程图生成](./usage/flowchart.md)——拖拽绘制,嵌入文档
|
|
30
|
+
- [草稿与同步](./usage/drafts.md)——本地优先,按需发布
|
|
31
|
+
- [版本冲突与合并](./usage/merge-conflicts.md)——409 时的三栏合并
|
|
32
|
+
- [我的文章与邀请](./usage/my-documents.md)——集中管理创作内容
|
|
33
|
+
- [收藏功能](./usage/bookmarks.md)——快速标记重要文档
|
|
34
|
+
- [文档评论](./usage/comments.md)——协作讨论与反馈
|
|
35
|
+
- [受限域成员与名单模板](./usage/domain-members.md)——团队域邀人、复用成员名单
|
|
36
|
+
|
|
37
|
+
## 部署运维
|
|
38
|
+
|
|
39
|
+
- [环境要求](./deployment/requirements.md)
|
|
40
|
+
- [配置](./deployment/config.md)
|
|
41
|
+
- [反向代理](./deployment/reverse-proxy.md)
|
|
42
|
+
|
|
43
|
+
## 其他
|
|
44
|
+
|
|
45
|
+
- [FAQ](./faq.md)
|
|
46
|
+
- [更新日志](./changelog.md)
|
|
47
|
+
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "changelog",
|
|
4
|
+
"name": "更新日志",
|
|
5
|
+
"description": "- **上手助手(AI)**:左下角浮动入口;设置页「AI」配置个人 DeepSeek Key;按访客落盘会话(`tenant/<id>/agent/session`),多轮续聊;回答引用手册页面链接;思考中三点动画;跟随滚动仅在贴底时生效 - **手册**:新增 [上手助手(AI)](./usage/onboarding-ai.md)",
|
|
6
|
+
"keywords": [],
|
|
7
|
+
"source": "changelog.md"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "core-concepts-all-files",
|
|
11
|
+
"name": "所见皆文件",
|
|
12
|
+
"description": "mdocs 的存储模型将文档目录树映射为两层结构:",
|
|
13
|
+
"keywords": [],
|
|
14
|
+
"source": "core-concepts/all-files.md"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "core-concepts-domain",
|
|
18
|
+
"name": "域隔离(Domain)",
|
|
19
|
+
"description": "mdocs 中的「域」是最顶层的逻辑隔离单元。它的设计目标是:",
|
|
20
|
+
"keywords": [],
|
|
21
|
+
"source": "core-concepts/domain.md"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "core-concepts-invitation",
|
|
25
|
+
"name": "文档级邀请",
|
|
26
|
+
"description": "传统文档协作需要先注册账户、加入团队、然后才能编辑——门槛太高。mdocs 的邀请机制只针对「文档」这个最小粒度,且被邀请者不需要预先注册。",
|
|
27
|
+
"keywords": [],
|
|
28
|
+
"source": "core-concepts/invitation.md"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "core-concepts-no-account",
|
|
32
|
+
"name": "无账户身份识别",
|
|
33
|
+
"description": "不做用户系统,不设注册流程。每个访问者通过浏览器获得一个身份令牌,以此识别身份。目标是零上手成本——打开就能用。",
|
|
34
|
+
"keywords": [],
|
|
35
|
+
"source": "core-concepts/no-account.md"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "deployment-config",
|
|
39
|
+
"name": "配置",
|
|
40
|
+
"description": "mdocs **没有配置文件**。所有配置通过环境变量设置,遵循 12-Factor App 原则。",
|
|
41
|
+
"keywords": [],
|
|
42
|
+
"source": "deployment/config.md"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "deployment-requirements",
|
|
46
|
+
"name": "环境要求",
|
|
47
|
+
"description": "- **无外部服务依赖**:不需要安装数据库、缓存、消息队列等中间件 - SQLite:内嵌在 better-sqlite3 中,零配置 - 文档存储:直接使用文件系统",
|
|
48
|
+
"keywords": [],
|
|
49
|
+
"source": "deployment/requirements.md"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "deployment-reverse-proxy",
|
|
53
|
+
"name": "反向代理配置",
|
|
54
|
+
"description": "生产部署时,推荐将 mdocs 放在反向代理之后,由代理层处理 TLS 证书、域名绑定、日志等。",
|
|
55
|
+
"keywords": [],
|
|
56
|
+
"source": "deployment/reverse-proxy.md"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "faq",
|
|
60
|
+
"name": "FAQ",
|
|
61
|
+
"description": "**Notion** 是 SaaS 服务,数据在云端,隐私受制于服务商;**Obsidian** 是本地优先,但多人协作需要额外付费方案。mdocs 在这两者之间取了一个平衡:**纯私有化部署 + 无账户协作**。你控制服务器,但协作者不需要注册任何账户。",
|
|
62
|
+
"keywords": [],
|
|
63
|
+
"source": "faq.md"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "getting-started-first-kb",
|
|
67
|
+
"name": "第一个文档",
|
|
68
|
+
"description": "启动 mdocs 后,浏览器会弹出**访客注册**对话框——输入一个名称即可创建身份 ",
|
|
69
|
+
"keywords": [],
|
|
70
|
+
"source": "getting-started/first-kb.md"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "getting-started-installation",
|
|
74
|
+
"name": "安装",
|
|
75
|
+
"description": "- **运行时**:Node.js 22+ - **无需额外安装数据库或中间件**",
|
|
76
|
+
"keywords": [],
|
|
77
|
+
"source": "getting-started/installation.md"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "index",
|
|
81
|
+
"name": "mdocs 文档",
|
|
82
|
+
"description": "欢迎阅读 mdocs 使用文档。",
|
|
83
|
+
"keywords": [],
|
|
84
|
+
"source": "index.md"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "usage-bookmarks",
|
|
88
|
+
"name": "收藏功能",
|
|
89
|
+
"description": "收藏功能帮助你快速标记和访问重要文档。已收藏的文档会出现在「我的收藏」列表中,便于跨域快速访问。",
|
|
90
|
+
"keywords": [],
|
|
91
|
+
"source": "usage/bookmarks.md"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "usage-cli-token",
|
|
95
|
+
"name": "CLI Token",
|
|
96
|
+
"description": "CLI Token 是给命令行工具和 AI Agent(如 Claude Code)使用的身份令牌,继承你在 mdocs 中的所有权限。Token 与你的访客身份绑定,创建后可以通过 HTTP API 读写文档。",
|
|
97
|
+
"keywords": [],
|
|
98
|
+
"source": "usage/cli-token.md"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "usage-comments",
|
|
102
|
+
"name": "评论功能",
|
|
103
|
+
"description": "评论功能提供文档内的协作讨论能力,支持对整篇文档发表评论和回复,便于团队协作文档时的沟通与反馈。",
|
|
104
|
+
"keywords": [],
|
|
105
|
+
"source": "usage/comments.md"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "usage-domain-members",
|
|
109
|
+
"name": "受限域成员与名单模板",
|
|
110
|
+
"description": "本文说明如何在 mdocs 里维护 **restricted(受限)域** 的成员,以及如何使用 **域成员模板** 减少重复勾选。与权限模型相关的设计背景见 [域隔离](../core-concepts/domain.md)。",
|
|
111
|
+
"keywords": [],
|
|
112
|
+
"source": "usage/domain-members.md"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "usage-drafts",
|
|
116
|
+
"name": "草稿与同步",
|
|
117
|
+
"description": "编辑环境中存在一个天然矛盾:用户希望内容「随时保存,永不丢失」,但网络可能不稳定,服务器可能暂时不可用。mdocs 用**本地优先 + 按需发布**的草稿机制来解决这个问题。",
|
|
118
|
+
"keywords": [],
|
|
119
|
+
"source": "usage/drafts.md"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "usage-flowchart",
|
|
123
|
+
"name": "流程图生成",
|
|
124
|
+
"description": "mdocs 的流程图基于 **Meta2d** 绘图引擎,设计目标是让用户像使用 Visio 或 draw.io 一样拖拽绘制,同时将图表数据嵌入文档内容。",
|
|
125
|
+
"keywords": [],
|
|
126
|
+
"source": "usage/flowchart.md"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "usage-markdown",
|
|
130
|
+
"name": "编辑体验",
|
|
131
|
+
"description": "mdocs 的编辑器基于 Lexical(Meta 开源的富文本引擎),配合 `@lobehub/editor` 插件体系。核心思路是:**用富文本编辑,以 JSON 存储**。",
|
|
132
|
+
"keywords": [],
|
|
133
|
+
"source": "usage/markdown.md"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "usage-merge-conflicts",
|
|
137
|
+
"name": "版本冲突与合并",
|
|
138
|
+
"description": "当发布时服务端 head 已前进(例如他端编辑、或本机自动发布后又改稿),`PUT` 可能返回 **409 版本冲突**。mdocs 会引导你进入 **合并** 界面,而不是直接覆盖远端。",
|
|
139
|
+
"keywords": [],
|
|
140
|
+
"source": "usage/merge-conflicts.md"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": "usage-my-documents",
|
|
144
|
+
"name": "我的文章",
|
|
145
|
+
"description": "「我的文章」功能聚合展示你创建的所有文档,集中管理跨域内容,并提供快捷的文档操作入口。",
|
|
146
|
+
"keywords": [],
|
|
147
|
+
"source": "usage/my-documents.md"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "usage-onboarding-ai",
|
|
151
|
+
"name": "上手助手(AI)",
|
|
152
|
+
"description": "mdocs 内置了一个**产品上手向导**,只解答「怎么用 mdocs」(域、草稿、发布、权限等),**不会**帮你写正文或改文档。",
|
|
153
|
+
"keywords": [],
|
|
154
|
+
"source": "usage/onboarding-ai.md"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"id": "usage-recovery-code",
|
|
158
|
+
"name": "恢复码与身份找回",
|
|
159
|
+
"description": "恢复码是一串由字母和数字组成的特殊代码,格式如:",
|
|
160
|
+
"keywords": [],
|
|
161
|
+
"source": "usage/recovery-code.md"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"id": "usage-search",
|
|
165
|
+
"name": "全文搜索",
|
|
166
|
+
"description": "mdocs 内置了基于 FTS5(SQLite 全文索引引擎)的搜索功能,支持中文分词。",
|
|
167
|
+
"keywords": [],
|
|
168
|
+
"source": "usage/search.md"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"id": "usage-settings",
|
|
172
|
+
"name": "设置页面",
|
|
173
|
+
"description": "设置页面是 mdocs 的集中配置中心,提供访客身份、域管理、内容管理等各种系统级功能。",
|
|
174
|
+
"keywords": [],
|
|
175
|
+
"source": "usage/settings.md"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": "why-mdocs",
|
|
179
|
+
"name": "why-mdocs",
|
|
180
|
+
"description": "import { WhyMdocsPage } from '../../src/components/WhyMdocsPage';",
|
|
181
|
+
"keywords": [],
|
|
182
|
+
"source": "why-mdocs.mdx"
|
|
183
|
+
}
|
|
184
|
+
]
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: usage-bookmarks
|
|
3
|
+
name: "收藏功能"
|
|
4
|
+
description: "收藏功能帮助你快速标记和访问重要文档。已收藏的文档会出现在「我的收藏」列表中,便于跨域快速访问。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: usage/bookmarks.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 收藏功能
|
|
10
|
+
|
|
11
|
+
## 功能概述
|
|
12
|
+
|
|
13
|
+
收藏功能帮助你快速标记和访问重要文档。已收藏的文档会出现在「我的收藏」列表中,便于跨域快速访问。
|
|
14
|
+
|
|
15
|
+
## 收藏文档
|
|
16
|
+
|
|
17
|
+
### 入口:文档信息菜单
|
|
18
|
+
|
|
19
|
+
1. 打开任意文档
|
|
20
|
+
2. 点击编辑器工具栏最右侧的 **⋮ 更多按钮**(在删除按钮右侧)
|
|
21
|
+
3. 在下拉菜单中点击 **添加收藏**
|
|
22
|
+
4. 菜单文字自动变为 **取消收藏**,表示该文档已被收藏
|
|
23
|
+
|
|
24
|
+
再次点击即可取消收藏。
|
|
25
|
+
|
|
26
|
+
## 管理收藏
|
|
27
|
+
|
|
28
|
+
### 查看收藏列表
|
|
29
|
+
|
|
30
|
+
有两种方式查看收藏列表:
|
|
31
|
+
|
|
32
|
+
1. **左侧边栏快捷入口**:点击左侧边栏底部访客信息右侧的星标按钮(在退出按钮左侧),弹出「我的收藏」列表
|
|
33
|
+
2. **[设置页面](./settings.md)**:进入「设置」→「我的收藏」,可以看到完整的收藏表格,支持搜索筛选
|
|
34
|
+
|
|
35
|
+
收藏列表的显示规则:
|
|
36
|
+
- 正常文档:黑色文字显示,点击可直接跳转打开
|
|
37
|
+
- 已删除文档:灰色文字 + 红色「已删除」标签,不可点击
|
|
38
|
+
|
|
39
|
+
### 取消收藏
|
|
40
|
+
|
|
41
|
+
有两种方式取消收藏:
|
|
42
|
+
|
|
43
|
+
1. **在文档内**:打开文档,通过右上角 ⋮ 菜单点击「取消收藏」
|
|
44
|
+
2. **在收藏列表**:点击任意收藏项右侧的 **✕ 按钮**,即时取消收藏
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 特殊场景处理
|
|
49
|
+
|
|
50
|
+
### 已删除文档的收藏
|
|
51
|
+
|
|
52
|
+
如果收藏的文档被删除,收藏项会保留在列表中并标记为 **「已删除」**。你可以:
|
|
53
|
+
|
|
54
|
+
- 手动点击右侧 ✕ 取消收藏,从列表中移除该条目
|
|
55
|
+
- 文档内容无法再查看
|
|
56
|
+
|
|
57
|
+
这种设计避免了文档删除后收藏项"消失"导致的困惑。
|
|
58
|
+
|
|
59
|
+
### 无权限文档的收藏
|
|
60
|
+
|
|
61
|
+
即使你失去了某篇文档的访问权限(如被移出域成员),收藏项仍然保留。你可以手动取消收藏来清理。
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 权限说明
|
|
66
|
+
|
|
67
|
+
收藏功能的权限遵循文档本身的权限规则:
|
|
68
|
+
|
|
69
|
+
| 文档权限 | 能否收藏 | 能否查看内容 |
|
|
70
|
+
|---------|----------|-------------|
|
|
71
|
+
| 公开可读/可编辑 | ✅ 可以 | ✅ 可以 |
|
|
72
|
+
| 受限域成员 | ✅ 可以 | ✅ 可以 |
|
|
73
|
+
| 文档被邀请 | ✅ 可以 | ✅ 可以 |
|
|
74
|
+
| 无权限但已收藏 | ➖ 保持收藏 | ❌ 无法打开 |
|
|
75
|
+
|
|
76
|
+
> 收藏列表仅对你本人可见,其他访客无法看到你的收藏内容。
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 常见问题
|
|
81
|
+
|
|
82
|
+
### 收藏会同步到其他设备吗?
|
|
83
|
+
|
|
84
|
+
会的。收藏数据存储在服务器端,与你的访客身份绑定。在任何设备登录同一访客,都能看到相同的收藏列表。
|
|
85
|
+
|
|
86
|
+
### 可以收藏多少文档?
|
|
87
|
+
|
|
88
|
+
没有数量限制。但建议只收藏真正重要的文档,保持收藏列表的整洁。
|
|
89
|
+
|
|
90
|
+
### 为什么有些收藏项显示灰色?
|
|
91
|
+
|
|
92
|
+
表示该文档已被删除,或者你已失去访问权限。可以手动点击右侧 ✕ 按钮取消收藏来移除。
|
|
93
|
+
|