@tensorix/metahub 0.1.2

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 (77) hide show
  1. package/README.md +162 -0
  2. package/dist/cli.js +20961 -0
  3. package/dist/cli.js.map +143 -0
  4. package/dist/core/blocks.d.ts +22 -0
  5. package/dist/core/blocks.d.ts.map +1 -0
  6. package/dist/core/cache.d.ts +10 -0
  7. package/dist/core/cache.d.ts.map +1 -0
  8. package/dist/core/context.d.ts +11 -0
  9. package/dist/core/context.d.ts.map +1 -0
  10. package/dist/core/crdt.d.ts +35 -0
  11. package/dist/core/crdt.d.ts.map +1 -0
  12. package/dist/core/csv.d.ts +14 -0
  13. package/dist/core/csv.d.ts.map +1 -0
  14. package/dist/core/databases.d.ts +19 -0
  15. package/dist/core/databases.d.ts.map +1 -0
  16. package/dist/core/db.d.ts +13 -0
  17. package/dist/core/db.d.ts.map +1 -0
  18. package/dist/core/documents.d.ts +50 -0
  19. package/dist/core/documents.d.ts.map +1 -0
  20. package/dist/core/fracdex.d.ts +5 -0
  21. package/dist/core/fracdex.d.ts.map +1 -0
  22. package/dist/core/hlc.d.ts +13 -0
  23. package/dist/core/hlc.d.ts.map +1 -0
  24. package/dist/core/ids.d.ts +17 -0
  25. package/dist/core/ids.d.ts.map +1 -0
  26. package/dist/core/index.d.ts +22 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/core/indexing.d.ts +16 -0
  29. package/dist/core/indexing.d.ts.map +1 -0
  30. package/dist/core/node.d.ts +4 -0
  31. package/dist/core/node.d.ts.map +1 -0
  32. package/dist/core/paths.d.ts +4 -0
  33. package/dist/core/paths.d.ts.map +1 -0
  34. package/dist/core/properties.d.ts +35 -0
  35. package/dist/core/properties.d.ts.map +1 -0
  36. package/dist/core/records.d.ts +18 -0
  37. package/dist/core/records.d.ts.map +1 -0
  38. package/dist/core/resolve.d.ts +33 -0
  39. package/dist/core/resolve.d.ts.map +1 -0
  40. package/dist/core/schema.d.ts +3 -0
  41. package/dist/core/schema.d.ts.map +1 -0
  42. package/dist/core/search.d.ts +12 -0
  43. package/dist/core/search.d.ts.map +1 -0
  44. package/dist/core/sites.d.ts +45 -0
  45. package/dist/core/sites.d.ts.map +1 -0
  46. package/dist/core/snapshot.d.ts +58 -0
  47. package/dist/core/snapshot.d.ts.map +1 -0
  48. package/dist/core/sync/auth.d.ts +39 -0
  49. package/dist/core/sync/auth.d.ts.map +1 -0
  50. package/dist/core/sync/client.d.ts +8 -0
  51. package/dist/core/sync/client.d.ts.map +1 -0
  52. package/dist/core/sync/files.d.ts +17 -0
  53. package/dist/core/sync/files.d.ts.map +1 -0
  54. package/dist/core/sync/openapi.d.ts +14 -0
  55. package/dist/core/sync/openapi.d.ts.map +1 -0
  56. package/dist/core/sync/protocol.d.ts +49 -0
  57. package/dist/core/sync/protocol.d.ts.map +1 -0
  58. package/dist/core/sync/routes.d.ts +22 -0
  59. package/dist/core/sync/routes.d.ts.map +1 -0
  60. package/dist/core/sync/server.d.ts +21 -0
  61. package/dist/core/sync/server.d.ts.map +1 -0
  62. package/dist/core/sync/sites-routes.d.ts +3 -0
  63. package/dist/core/sync/sites-routes.d.ts.map +1 -0
  64. package/dist/core/sync/sites-serve.d.ts +3 -0
  65. package/dist/core/sync/sites-serve.d.ts.map +1 -0
  66. package/dist/core/sync/token.d.ts +23 -0
  67. package/dist/core/sync/token.d.ts.map +1 -0
  68. package/dist/core/sync/webui-routes.d.ts +3 -0
  69. package/dist/core/sync/webui-routes.d.ts.map +1 -0
  70. package/dist/core/sync/webui.d.ts +4 -0
  71. package/dist/core/sync/webui.d.ts.map +1 -0
  72. package/dist/index.d.ts +2 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +17389 -0
  75. package/dist/index.js.map +114 -0
  76. package/dist/webui.js +34 -0
  77. package/package.json +41 -0
package/README.md ADDED
@@ -0,0 +1,162 @@
1
+ # metahub
2
+
3
+ 给 AI 用的本地知识库 CLI:在 `~/.metahub/` 下用 SQLite 管理 notion 风格的**类型化数据库(表 + 行)**和 **markdown 文档**,单机可用,也能通过简单的 C-S 服务端在多机之间用 **CRDT 最终一致**同步。库 + CLI + 独立二进制三合一。
4
+
5
+ > 运行时依赖 **Bun**(使用 `bun:sqlite` / `Bun.serve`)。用 `bunx`、全局安装后的 `metahub`,或下载独立二进制。
6
+
7
+ ## 数据存储
8
+
9
+ ```text
10
+ ~/.metahub/
11
+ metahub.db # SQLite:数据库/属性/记录/文档 + CRDT oplog
12
+ cache/ # 内容寻址 blob(附件)
13
+ ```
14
+
15
+ 可用 `METAHUB_HOME` 环境变量覆盖目录(便于多实例 / 测试)。
16
+
17
+ ## 快速开始
18
+
19
+ ```bash
20
+ bunx @tensorix/metahub init # 创建 ~/.metahub
21
+ mh db create "Tasks" # 建一张表 -> 返回 id 如 db_tasks-k3f9c1
22
+ mh use tasks # 设为「当前库」,之后 record/prop 免带库参数
23
+ mh prop add Title --type text # 作用于当前库
24
+ mh prop add Status --type select --options "todo,doing,done"
25
+ mh record create --data '{"Title":"写设计稿","Status":"todo"}'
26
+ mh record update fix-login --data '{"Status":"doing"}' # 用唯一前缀/名字,不必粘完整 id
27
+ mh doc create --title "架构说明" --body @arch.md # @file / @- / 直接字符串
28
+ mh search "架构"
29
+ mh get tasks # 通用查找:按 id/前缀/名字,自动判类型
30
+ mh edit <ref> # 在 $EDITOR 里改文档正文 / 记录字段(给人用)
31
+
32
+ # 给 AI 用的非交互增量编辑(对标 Read / Edit / Write):
33
+ mh doc read <ref> # 读正文 + version(改前先读)
34
+ mh doc edit <ref> --old "旧文本" --new "新文本" # 锚定查找替换,只传增量
35
+ mh doc append <ref> --body "追加段落" # 也有 prepend
36
+ ```
37
+
38
+ 输出按受众自动切换:终端(人)显示表格 / markdown,被管道或子进程调用(AI)输出 **JSON**;`--json` / `--pretty` 可强制。
39
+
40
+ ### ID 与引用
41
+
42
+ 每个实体 id = `类型_名字slug-随机后缀`(如 `db_tasks-k3f9c1`、`rec_fix-login-bug-7j02an`)。类型前缀让 id 自解释(一眼区分 db/rec/doc/prop),随机后缀保证多机离线创建几乎不撞。
43
+
44
+ 凡接受 id 的地方(`get`/`update`/`delete`/`--db`/`--parent`/`--target` 等)都接受**引用**,按以下顺序解析,省去粘贴完整 id:
45
+
46
+ - **完整 id**(永远可用,跨库亦可)
47
+ - **唯一前缀**(git 短 SHA 风格,`rec_fix-log` 或裸 slug `fix-log`)
48
+ - **名字/标题**(db 名、doc 标题、prop 名,大小写不敏感)
49
+
50
+ 歧义时报错并列出候选;用 `mh use <db>` 设当前库后,record/prop 的引用与列举自动限定在该库内。Tab 补全见 `mh completion`。
51
+
52
+ ### 属性类型
53
+
54
+ `text · number · checkbox · select · multi_select · date · relation · url`
55
+ (select/multi_select 用 `--options a,b,c`;relation 用 `--target <db引用>`)
56
+
57
+ relation 字段的**值**也接受引用:`--data '{"assignee":"Alice Chen"}'` 会在目标库里按名字/前缀解析成记录 id(数组逐个解析);歧义或找不到会报错,完整 `rec_…` id 始终直通。
58
+
59
+ ## 多机同步(CRDT)
60
+
61
+ 每次写入都进 oplog(Hybrid Logical Clock + 按字段 Last-Write-Wins),合并可交换、幂等、最终一致。
62
+
63
+ 文档正文按**块(block)**切分(段落级,fenced code 整块),每块是独立 register、用分数索引(fractional index)排序。所以两台机器改同一篇文档的**不同段落**能干净合并、互不覆盖;`mh doc edit` 的锚定替换通常只改命中那一块。`documents.body` 是由块重算的物化缓存。
64
+
65
+ ```bash
66
+ # A 机:启动同步服务端(服务端也是一个 metahub 节点)
67
+ mh --server --port 7777
68
+
69
+ # B 机:与服务端推/拉一轮
70
+ mh sync http://a-host:7777
71
+
72
+ # 同一条 sync 命令也能在「单个文档/数据表」与「本地文件」间导出/导入,
73
+ # 方向按参数自动判别:哪一侧能解析成库内实体,另一侧就是文件路径。
74
+ # 格式按实体类型固定——文档↔markdown、数据表↔CSV。
75
+ mh sync architecture arch.md # 导出:文档 → markdown
76
+ mh sync tasks tasks.csv # 导出:数据表 → CSV(表头=属性名,CSV 含 id 列)
77
+ mh sync arch.md architecture # 导入:markdown → 文档(更新已存在的文档)
78
+ mh sync tasks.csv tasks # 导入:CSV → 数据表(有 id 列则按 id upsert)
79
+ ```
80
+
81
+ 服务端在根路径 `/` 还内置一个**浏览器 WebUI**(Preact):左侧列出数据库与文档,可浏览/行内编辑数据表、用块级所见即所得编辑 markdown 文档(含嵌套列表、代码语言名与常用 Markdown 快捷输入)、全文搜索;编辑走与 CLI 同一套 core 写入路径,进 CRDT oplog 后随 `mh sync` 复制。同时暴露一组 `/api/*` REST 接口与自动生成的 OpenAPI 文档(`/docs`)。WebUI 资源(含 Preact)单独打包为 `dist/webui.js`,仅在浏览器首次访问 `/` 时懒加载,**不进入 CLI 启动路径,对命令行性能零影响**。设计见 [docs/impl-context/07-webui/design.md](docs/impl-context/07-webui/design.md)。
82
+
83
+ ## Agent 托管静态站点
84
+
85
+ AI agent 用 CLI 把生成好的 HTML/CSS/JS **发布**成一个命名「站点」,`mh --server` 把它在 `/sites/<name>/` serve 出去;页面同源调用上面的 `/api/*` 即可读取本库的数据表与文档——等于一个本地 mini-Supabase(静态托管 + 数据 API)。
86
+
87
+ ```bash
88
+ # agent 把生成的文件写到一个目录,再整目录发布(站点不存在则自动创建)
89
+ mh site publish blog ./dist
90
+ mh site files blog # 查看清单
91
+ mh site put blog index.html --content @- # 也可单文件上传(--from <file> / --content @file|@-)
92
+
93
+ # serve 出去
94
+ mh --server --port 7777 # 浏览器打开 http://localhost:7777/sites/blog/
95
+ ```
96
+
97
+ 站点与文件**和其它数据一样进 CRDT oplog**,随 `mh sync` 跨机复制:文本与小二进制内联存储;超过阈值的大二进制走内容寻址 blob(`cache/`,其字节暂为本机、不随 oplog 复制,清单照常同步)。
98
+
99
+ **鉴权**:`--debug` 全开(无鉴权);否则单 token 守护**每个请求**。token **默认持久化在 `~/.metahub`**(重启复用,`mh token` 查看),带有效期(默认 30 天),**到期或 `mh token refresh` 时才轮换**;轮换后旧 token 在宽限期内(默认 7 天)仍可换到新 token,浏览器**无感续期**。`--token` / `METAHUB_TOKEN` 则固定一个不持久化、不过期的 token(脚本/CI 用)。浏览器首次访问会弹**解锁页**输入 token,存入 `localStorage`+cookie 后刷新;之后注入的 fetch 套壳自动给同源 `/api/*` 调用带上 `Authorization: Bearer`,并在轮换后透明地用 `GET /auth/token` 换新 token 重试,所以 agent 写的页面无需把 token 写进源码。token 可经 `Authorization: Bearer`、Cookie `mh_token` 或 `?token=` 任一方式携带;有效期/宽限期可经 `METAHUB_TOKEN_TTL` / `METAHUB_TOKEN_GRACE` 调整。服务端默认只绑 `127.0.0.1`,`--host 0.0.0.0` 才对外。设计见 [docs/impl-context/08-agent-sites/design.md](docs/impl-context/08-agent-sites/design.md)、[docs/impl-context/10-persistent-token/design.md](docs/impl-context/10-persistent-token/design.md)。
100
+
101
+ ## 三种用法
102
+
103
+ ```bash
104
+ # 1) 作为库(Bun)
105
+ import { openMetahub, createDatabase, createRecord, search } from "@tensorix/metahub";
106
+
107
+ # 2) 作为 CLI
108
+ npm i -g @tensorix/metahub # 然后用 metahub / mh
109
+ bunx @tensorix/metahub <cmd> # 免安装
110
+
111
+ # 3) 独立二进制(免运行时)
112
+ chmod +x metahub-darwin-arm64 && ./metahub-darwin-arm64 init
113
+ ```
114
+
115
+ 支持平台:`darwin-arm64` / `darwin-x64` / `linux-x64` / `linux-arm64` / `windows-x64`。
116
+
117
+ ## 命令
118
+
119
+ | 命令 | 说明 |
120
+ |------|------|
121
+ | `mh init` | 创建 `~/.metahub` |
122
+ | `mh db create\|list\|get\|delete` | 管理数据库(表) |
123
+ | `mh use [<db>] [--clear]` | 设置/显示「当前库」(record/prop 默认作用于它) |
124
+ | `mh get <ref>` | 通用查找:按 id/前缀/名字解析,自动判别类型 |
125
+ | `mh prop add\|list\|update\|remove` | 管理属性(列);`add` 用 `--db` 指定库(默认当前库) |
126
+ | `mh record create\|list\|get\|update\|delete` | 管理记录(行) |
127
+ | `mh doc create\|list\|get\|update\|delete` | 管理 markdown 文档 |
128
+ | `mh doc read <id>` | 读正文 + version token(AI 改前先读) |
129
+ | `mh doc edit <id> --old --new` | 锚定查找替换(`--replace-all` / `--if-match`) |
130
+ | `mh doc append\|prepend <id> --body` | 在文档首/尾追加块 |
131
+ | `mh edit <id>` | 在 `$EDITOR` 中交互式编辑文档/记录(给人用) |
132
+ | `mh search <query>` | 全文检索(文档 + 记录) |
133
+ | `mh site create\|put\|publish\|list\|files\|rm\|delete` | 托管 agent 生成的静态站点(HTML/CSS/JS),由 `--server` 在 `/sites/<name>/` serve 出去 |
134
+ | `mh token [show\|refresh]` | 查看 / 轮换持久化的服务器鉴权 token(存于 `~/.metahub`,默认 30 天到期轮换) |
135
+ | `mh completion <bash\|zsh\|fish>` | 打印补全脚本:`eval "$(mh completion zsh)"` |
136
+ | `mh sync <url>` | 与服务端同步一轮(CRDT 推/拉) |
137
+ | `mh sync <src> <dst>` | 单个文档/数据表与文件互导:文档↔markdown、数据表↔CSV;方向按参数判别(哪侧是库内实体),格式按实体类型固定 |
138
+ | `mh --server [--port] [--host] [--debug] [--token]` | 启动服务端:`/sync` + 根路径 WebUI + `/api/*` REST + `/docs`(OpenAPI)+ 静态站点 `/sites/<name>/` + token 交换 `/auth/token`;非 `--debug` 时每个请求需带 token |
139
+
140
+ ## 开发
141
+
142
+ ```bash
143
+ bun install
144
+ bun run dev init # 热重载运行 CLI
145
+ bun test # 跑测试(含 CRDT 收敛测试)
146
+ bun run build # 产出 dist/(库 + CLI + 类型声明)
147
+ bun run build:binaries # 产出 binaries/ 五平台二进制
148
+ ```
149
+
150
+ ## 目录结构
151
+
152
+ ```text
153
+ src/
154
+ core/ # 业务逻辑(库和 CLI 共享);含 sites.ts(静态站点模型,进 CRDT)、csv.ts(文件导入导出用)
155
+ sync/ # CRDT 同步协议 + 服务端 + 客户端 + WebUI/REST 路由 + 静态站点托管与鉴权
156
+ # (routes/webui-routes/openapi/webui/sites-routes/sites-serve/auth)
157
+ # files.ts:单文档/数据表与文件互导(markdown/CSV)
158
+ cli/ # citty 子命令(含 site)
159
+ webui/ # 浏览器 WebUI(Preact,独立打包为 dist/webui.js)
160
+ index.ts # 库入口
161
+ scripts/ # 构建脚本(含 webui 打包入口)
162
+ ```