weflow-cli 1.16.0 → 1.19.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.
- package/CHANGELOG.md +72 -0
- package/README.md +19 -4
- package/bin/weflow-cli.ts +515 -6
- package/dist/bin/weflow-cli.js +580 -8
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/src/core/ntCore.d.ts +47 -0
- package/dist/src/core/ntCore.d.ts.map +1 -1
- package/dist/src/core/ntCore.js +24 -0
- package/dist/src/core/ntCore.js.map +1 -1
- package/dist/src/services/assistantService.d.ts +8 -1
- package/dist/src/services/assistantService.d.ts.map +1 -1
- package/dist/src/services/assistantService.js +47 -8
- package/dist/src/services/assistantService.js.map +1 -1
- package/dist/src/services/assistantTools.d.ts +8 -0
- package/dist/src/services/assistantTools.d.ts.map +1 -1
- package/dist/src/services/assistantTools.js +67 -11
- package/dist/src/services/assistantTools.js.map +1 -1
- package/dist/src/services/configService.d.ts.map +1 -1
- package/dist/src/services/configService.js +3 -2
- package/dist/src/services/configService.js.map +1 -1
- package/dist/src/services/cursorProbe.d.ts +44 -0
- package/dist/src/services/cursorProbe.d.ts.map +1 -0
- package/dist/src/services/cursorProbe.js +183 -0
- package/dist/src/services/cursorProbe.js.map +1 -0
- package/dist/src/services/diagnosticReport.d.ts +6 -0
- package/dist/src/services/diagnosticReport.d.ts.map +1 -1
- package/dist/src/services/diagnosticReport.js +16 -0
- package/dist/src/services/diagnosticReport.js.map +1 -1
- package/dist/src/services/qchatImport.d.ts +89 -0
- package/dist/src/services/qchatImport.d.ts.map +1 -0
- package/dist/src/services/qchatImport.js +273 -0
- package/dist/src/services/qchatImport.js.map +1 -0
- package/dist/src/services/setupVenv.d.ts +43 -0
- package/dist/src/services/setupVenv.d.ts.map +1 -0
- package/dist/src/services/setupVenv.js +198 -0
- package/dist/src/services/setupVenv.js.map +1 -0
- package/dist/src/services/wechatCompat.d.ts +29 -0
- package/dist/src/services/wechatCompat.d.ts.map +1 -0
- package/dist/src/services/wechatCompat.js +65 -0
- package/dist/src/services/wechatCompat.js.map +1 -0
- package/dist/src/utils/python.d.ts +10 -0
- package/dist/src/utils/python.d.ts.map +1 -1
- package/dist/src/utils/python.js +27 -4
- package/dist/src/utils/python.js.map +1 -1
- package/docs/DATA_CONTRACT.md +25 -0
- package/docs/DECISIONS.md +118 -30
- package/docs/NT_DATABASES.md +47 -0
- package/docs/PROJECT_STATE.md +7 -3
- package/docs/RELEASING.md +4 -0
- package/docs/REPLAY.md +169 -0
- package/docs/SYNC_CONTRACT.md +197 -180
- package/package.json +89 -88
- package/resources/js/graph3d/viewer2d.js +550 -448
- package/scripts/annual_report.py +3 -1
- package/scripts/chat_notes.py +86 -3
- package/scripts/check_readme_commands.py +427 -426
- package/scripts/extract_todos.py +3 -1
- package/scripts/graph_2d.py +156 -151
- package/scripts/graph_3d.py +672 -646
- package/scripts/imported_chats.py +68 -0
- package/scripts/mcp_bridge.py +3 -1
- package/scripts/media_index.py +150 -0
- package/scripts/nt_common.py +32 -0
- package/scripts/nt_decrypt.py +154 -16
- package/scripts/on_this_day.py +178 -178
- package/scripts/promises.py +185 -185
- package/scripts/replay.py +803 -0
- package/scripts/run_hidden.vbs +25 -0
- package/scripts/semantic_search.py +78 -6
- package/scripts/wechat_avatar.py +185 -0
- package/scripts/wechat_ledger.py +190 -0
- package/src/core/ntCore.ts +59 -0
- package/src/services/assistantService.ts +48 -8
- package/src/services/assistantTools.ts +73 -10
- package/src/services/configService.ts +3 -2
- package/src/services/cursorProbe.ts +222 -0
- package/src/services/diagnosticReport.ts +22 -0
- package/src/services/qchatImport.ts +327 -0
- package/src/services/setupVenv.ts +238 -0
- package/src/services/wechatCompat.ts +67 -0
- package/src/utils/python.ts +33 -4
package/CHANGELOG.md
CHANGED
|
@@ -17,6 +17,78 @@ purpose** - a hand-written "latest is X" is exactly the claim that goes stale he
|
|
|
17
17
|
|
|
18
18
|
All notable user-facing changes are recorded here. This project follows [Semantic Versioning](https://semver.org/).
|
|
19
19
|
|
|
20
|
+
## 1.19.0
|
|
21
|
+
|
|
22
|
+
- **修复 issue #12:`local_type == 1` 的压缩正文导出为空,普通文本被截断到 200 字。**
|
|
23
|
+
`message_content` 若是 zstd 压缩的 BLOB,旧代码只认 `str`,正文被置空后落进
|
|
24
|
+
`non_text_display()`,最终输出 `[未识别的消息类型 1]`——**消息还在、正文没了**,
|
|
25
|
+
下游按 `parsedContent` 做的关键词 / `@所有人` 筛选于是漏掉这些通知。
|
|
26
|
+
现在类型 1 一律走已有的 `_decode_content()`(str / zstd frame / 普通 bytes 三种都处理),
|
|
27
|
+
且 `parsedContent` 对文本**不再截断**:末尾关键词正是筛选要用的,截掉等于静默漏消息。
|
|
28
|
+
非文本仍保留 200 字展示上限——那是标签与标题,不是正文。
|
|
29
|
+
- **`media` — md5 直接对到本地文件(读 `hardlink.db`,本地只读)。** 图片、文件、视频三张表各记
|
|
30
|
+
`md5 → (dir1, dir2, file_name)`,`dir2id` 把 id 映射成目录名,路径是**确定的**,不用再扫整个
|
|
31
|
+
`msg/` 目录去猜。每一行都标 `✓/✗`:`✗` 是"库里有记录但文件已被微信清理",不是路径算错。
|
|
32
|
+
**图片的 dir1/dir2 顺序与另两张表相反**:实测 image 行是 `dir1=会话hash, dir2=月份`
|
|
33
|
+
(`attach/<会话>/<月份>/Img/`),file/video 行是 `dir1=月份`。按统一顺序拼,4647 条图片会全指到
|
|
34
|
+
一个空目录,而文件/视频那条仍然正确——只看某一类能打开就会漏掉这个错。
|
|
35
|
+
|
|
36
|
+
## 1.18.0
|
|
37
|
+
|
|
38
|
+
- **`ledger` — 红包与转账流水(读 `general.db`,本地只读)。** 把两张表归一成一条按时间排的
|
|
39
|
+
流水:`kind`(红包/转账)、方向(我付/我收/我发/对方发/未知)、对方、`messageServerId`。
|
|
40
|
+
方向判定用前缀容忍的自己 id 比对,双方都是自己时如实给「未知」而不是猜一个。
|
|
41
|
+
**两处已知的"不猜"**:红包表**没有时间列也没有金额列**——真实时间与金额在消息正文的
|
|
42
|
+
`wcpayinfo` 里,这一步没做,所以红包按 `messageServerId` 排先后并标注"无时间列";
|
|
43
|
+
`hb_status`/`receive_status`/`pay_sub_type` 的枚举语义**未逐值验证**,原样输出(本机观测
|
|
44
|
+
`hb_status ∈ {1,4}`、`receive_status ∈ {0,1,2}`),不给"已领取/已过期"这类翻译。
|
|
45
|
+
- **测试隔离了两处会读真实数据的路径。** `qchat_import_test` 的 `build_index` 用例只把
|
|
46
|
+
`INDEX_DIR` 指到临时目录,`OUTPUT_ROOT` 仍是真实值,于是它扫到本机 10,981 篇日报文章,
|
|
47
|
+
`new` 断言 5 变成 10981;`wechat_ledger_test` 的红包 fixture 按 9 列建表却只给 7 个值,
|
|
48
|
+
`hb_status` 整体左移两格落进 `send_id`。两处都改成显式隔离/对齐,不是调期望值。
|
|
49
|
+
|
|
50
|
+
## 1.17.0
|
|
51
|
+
|
|
52
|
+
- **`sync cursor-probe`:稳定游标从"一句 false"变成一条看得见的路径(D-027)。**
|
|
53
|
+
`capabilities --json` 新增 `cursorReadiness`(五条判据 × 四个消息后端的代码事实),
|
|
54
|
+
`sync cursor-probe --json` 实测 NT 数据侧——schema 全量检查、身份有界采样(自带
|
|
55
|
+
`exhaustive: false`)。本机实测:211 张表 0 缺列、采样 5,398 行全部带非零 server_id 且
|
|
56
|
+
0 重复;`stableCursor` 仍为 false,差的在哪、下一块是什么,逐条摊开给下游看。
|
|
57
|
+
|
|
58
|
+
- **`weflow-cli setup`:一条命令装好 Python 环境(自管 venv)。** 在 `~/.weflow-cli/venv`
|
|
59
|
+
建虚拟环境并安装依赖,之后所有 Python 工作流优先用它——PATH 上只有商店占位 python
|
|
60
|
+
(exit 9009)的那类 issue 从根上消掉。Windows 上自动用 `sqlcipher3-wheels` 预编译轮
|
|
61
|
+
(`sqlcipher3-binary` 根本没有 Windows 发行版);两段式(`--dry-run` 计划 / `--yes` 执行),
|
|
62
|
+
pip 瞬时网络失败重试一次,装完验证 `import sqlcipher3` 与运行时确实优先 venv。
|
|
63
|
+
|
|
64
|
+
- **2D 概念图谱:点一条边看它凭什么连着。** 每条边算出两页 `## 来源` 的交集(共同来源卡片),
|
|
65
|
+
点边高亮并列出;没有共同来源的边如实说明"来自页面正文里的 [[链接]]"。每边最多带 2 个名字
|
|
66
|
+
(页面体积有界),证据只进页面载荷——布局缓存键不变,旧坐标不作废。3D 不带。
|
|
67
|
+
|
|
68
|
+
- **助手能看对方发来的图片了(D-128,决策先行)。** 开了 `wechatMediaDownload` 的来信图片
|
|
69
|
+
从"整条忽略"变成一轮:模型可用 `look_at_image` 的 `#信1` 直接看落盘文件。门与看聊天图片
|
|
70
|
+
同构(strict 双层拦截、每轮两张上限、审计照记);超过 4 MB 不缩放直接说明(证据形态);
|
|
71
|
+
语音/视频/文件不在本轮。未开下载或没落盘的图片消息行为不变。
|
|
72
|
+
|
|
73
|
+
- **修了主分支上四处红的回归测试**(`npm test` 在 master 上本来就挂着 4 条,stash 验证过与
|
|
74
|
+
新特性无关):`today` / `promises` 曾把 `--talker` 放进子进程 argv(进程列表可见),改走
|
|
75
|
+
`WEFLOW_TALKER` 环境变量(D-020,`test/privacy-paths` 转绿);`dailyMailTo` 补齐默认值三处
|
|
76
|
+
登记(`test/config-keys` 三条转绿);`scripts/**/*.vbs` 进 npm 包——`run_hidden.vbs` 之前被
|
|
77
|
+
files allowlist 漏掉(`test/pack-contents` 转绿)。
|
|
78
|
+
|
|
79
|
+
- **`weflow-cli import qchat`:QQ 聊天进知识库与搜索(qchat-cli 一行不用改,D-129)。**
|
|
80
|
+
读 `qce export --format json` 的导出(单文件或目录),按全局唯一的 messageId 去重合并、
|
|
81
|
+
重复导入安全;两段式命令面。落盘后两条管道各开一个显式开关:`chat-notes --source qq|all`
|
|
82
|
+
产 QQ 知识卡(`QQ-` 前缀,与微信卡同形状、同下游),`search-index --include-imports` 把
|
|
83
|
+
QQ 会话收进语义与短语索引(id 带 `chat:qq:` 段)。没有微信库的机器也能用(纯 QQ 场景,
|
|
84
|
+
端到端有测试)。字段映射表见 `docs/DATA_CONTRACT.md`。
|
|
85
|
+
|
|
86
|
+
- **`replay`:关系网络的时间重放。** `weflow-cli replay` 出按月文本回放(哪些边断了、
|
|
87
|
+
哪些新长出来、哪些最持久),`--out out.html` 出可播放的单文件动画:按天推进、边用 30 天
|
|
88
|
+
滚动窗口、节点标签自动避让、播放速度可调;守恒校验内建,稀薄月份显式标注而非假装数据
|
|
89
|
+
完整;另带静态总结页(断了哪些 / 最持久 / 新出现 + 月度柱状图)。数据全部来自本地库,
|
|
90
|
+
不联网、不调模型。
|
|
91
|
+
|
|
20
92
|
## 1.16.0
|
|
21
93
|
|
|
22
94
|
- **`leads` - the offers and asks buried in chat, with the sentence that said them.** Scans recent
|
package/README.md
CHANGED
|
@@ -107,7 +107,7 @@ Linux 的自动初始化能力取决于微信发行版、Python 依赖和当前
|
|
|
107
107
|
| --- | --- |
|
|
108
108
|
| 聊天记录 | 查询会话、联系人和消息;导出 **Markdown / JSON / TXT / HTML / Excel**。Markdown 导出把图片**落盘**到 `<会话>_assets/`、正文用相对路径引用(喂给编辑器或别的工具时这才是能用的形态);**文档本体**(微信里的 Word/Excel/PDF/PPT 等)按原名与扩展名拷进 `<会话>_assets/files/`,正文里按原名链接到 `files/` 下;HTML 导出内嵌图片并给出一份媒体覆盖报告(哪些没嵌上、为什么)。**匹配只做一遍**:Markdown 导出写下清单,之后 JSON/TXT/Excel 导出(或 `--media`)会自动带上同样的图片与文档路径。 |
|
|
109
109
|
| 公众号日报 | 抓取文章、AI 摘要与分类、生成本地阅读页,保留收藏和已读状态。 |
|
|
110
|
-
| 个人知识库 | 同步微信读书笔记、构建 Obsidian Vault、语义搜索、RAG 问答和概念 Wiki,以及**双击就能打开**的概念图谱页面(`weflow-cli wiki graph --open` 出 3D、加 `--flat` 出 2D;自包含、不联网、不需要服务器;`--min-degree N` 只看枢纽、`--line wiki\|chat`
|
|
110
|
+
| 个人知识库 | 同步微信读书笔记、构建 Obsidian Vault、语义搜索、RAG 问答和概念 Wiki,以及**双击就能打开**的概念图谱页面(`weflow-cli wiki graph --open` 出 3D、加 `--flat` 出 2D;自包含、不联网、不需要服务器;`--min-degree N` 只看枢纽、`--line wiki\|chat` 只看一条线;**2D 页里点一条边能看到它凭什么连着**——两页的共同来源卡片,没有共同来源的边也会如实说来自正文链接)。 |
|
|
111
111
|
| AI 协作 | 通过 MCP 把文章、知识库、日报和受控的本地数据能力交给兼容客户端;工具清单以 `weflow-cli mcp-config` 和 `docs/MCP.md` 为准。 |
|
|
112
112
|
| 个人回顾 | 聊天月报、年度报告、待办提取与朋友圈本地缓存查询。 |
|
|
113
113
|
| 微信收藏 | 读取微信"收藏"内容(公众号文章、文字、图片、视频、聊天记录),支持类型过滤、关键词搜索与 Markdown/JSON 导出。 |
|
|
@@ -137,7 +137,15 @@ weflow-cli check
|
|
|
137
137
|
> - 马上能用:换成 `weflow-cli.cmd check`(`.cmd` 那份包装不走 PowerShell 策略);
|
|
138
138
|
> - 一次性解决:`Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`,然后重开终端。
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
一条命令装好 Python 依赖(推荐)——它会在 `~/.weflow-cli/venv` 建一个本工具**自管**的虚拟环境
|
|
141
|
+
并安装依赖,之后的 Python 工作流会优先用它,不用再管 PATH 上哪个 Python 可用
|
|
142
|
+
(Windows 上自动改用 `sqlcipher3-wheels` 预编译轮,省去装编译器的麻烦):
|
|
143
|
+
|
|
144
|
+
```powershell
|
|
145
|
+
weflow-cli setup
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
也可以手动安装(效果相同;从源码运行时在仓库根目录执行):
|
|
141
149
|
|
|
142
150
|
```powershell
|
|
143
151
|
python -m pip install -r requirements.txt
|
|
@@ -278,6 +286,8 @@ weflow-cli panel # 打开本机面板窗口 (不扫码也能用)
|
|
|
278
286
|
- 「知识库里怎么讲 RAG 的?」— 概念 Wiki 检索
|
|
279
287
|
- 「帮我回老王那句话」— 起草回复:先判断对方要什么、风险和该不该给实质内容,再给几条候选。
|
|
280
288
|
**只产出文本,不会替你发送**;涉钱或风险很高时不给草稿,只说明该先确认什么
|
|
289
|
+
- 「(对方直接发来一张图片)」— 开了 `wechatMediaDownload` 后图片会落盘,助手能直接看图回答
|
|
290
|
+
(隐私模式 strict 下不出境,见下段与 D-128)
|
|
281
291
|
- 「记住:我的项目叫 weflow-cli」— 写入长期记忆
|
|
282
292
|
|
|
283
293
|
运行机制:守护进程通过微信官方 Bot 通道(iLink)长轮询收发消息,Agent 循环、三层记忆(工作窗口 / 滚动摘要 / 长期事实)、数据库查询全部在本机执行;仅最终提问与回复文本会发送给所配置的 LLM,新装默认就是 `assistantPrivacy=strict`:工具输出中的电话/邮箱/链接等 PII 自动脱敏,且第三方聊天正文不出境(`balanced` 放宽到正文可出境、只对 PII 打码,`open` 全不打码;`ollama` 本地引擎则完全不出网)。会话 24 小时未活跃需重新扫码,单窗口内主动回复有官方条数限制。
|
|
@@ -303,7 +313,7 @@ weflow-cli config set assistantGroupRequireMention true
|
|
|
303
313
|
|
|
304
314
|
| 目标 | 命令 |
|
|
305
315
|
| --- | --- |
|
|
306
|
-
| 检查环境与配置 | `weflow-cli check` · `weflow-cli config show` |
|
|
316
|
+
| 检查环境与配置 | `weflow-cli check` · `weflow-cli setup`(自管 Python venv,一条命令装依赖) · `weflow-cli config show` |
|
|
307
317
|
| 初始化或手动指定路径 | `weflow-cli init [--path <目录>]` |
|
|
308
318
|
| 浏览聊天数据 | `weflow-cli sessions` · `weflow-cli messages <联系人>` · `weflow-cli contacts` |
|
|
309
319
|
| 谁在等我回话 | `weflow-cli awaiting --dry-run` · `weflow-cli awaiting --yes` |
|
|
@@ -314,11 +324,16 @@ weflow-cli config set assistantGroupRequireMention true
|
|
|
314
324
|
| 那年今日 | `weflow-cli today --years 1,3,5`(几年前的今天在聊什么)|
|
|
315
325
|
| 人脉图谱 | `weflow-cli network --groups` · `--with <名字>`(共同群)· `--intro <名字>`(谁能引荐;只读 contact.db)|
|
|
316
326
|
| 某号观点演变 | `weflow-cli timeline --list` · `--source <公众号名>`(按时间看它说法的变化)|
|
|
327
|
+
| 关系网络时间重放 | `weflow-cli replay`(按月展开,生成可播放的单文件 HTML;看哪条边断了,不只是图变大)|
|
|
328
|
+
| 红包与转账流水 | `weflow-cli ledger --days 365`(读 `general.db`;红包表无时间/金额列,只给先后与原始状态,不翻译语义)|
|
|
329
|
+
| 媒体精确定位 | `weflow-cli media --md5 <前缀>` · `--type image\|file\|video`(读 `hardlink.db`,md5 直接对到本地路径,不扫目录)|
|
|
317
330
|
| 本机判断层 | `weflow-cli decide --request <file> --dry-run` · `--yes` |
|
|
318
331
|
| 导出聊天记录 | `weflow-cli export <联系人> <json\|txt\|html\|excel>` |
|
|
319
|
-
| 同步检查点 | `weflow-cli sync run <联系人> --since <日期>` · `sync status` · `sync verify`
|
|
332
|
+
| 同步检查点 | `weflow-cli sync run <联系人> --since <日期>` · `sync status` · `sync verify` · `sync cursor-probe`(离稳定增量游标还差什么,实测当前后端)|
|
|
333
|
+
| QQ 聊天导入 | `weflow-cli import qchat <qchat导出>` · `import list` · `import show <会话>` (读 qchat-cli 的 JSON 导出;之后 `chat-notes --source qq` 产知识卡、`search-index --include-imports` 进搜索)|
|
|
320
334
|
| 公众号日报与阅读器 | `weflow-cli daily` · `weflow-cli daily-server` · `weflow-cli review` |
|
|
321
335
|
| 朋友圈缓存 | `weflow-cli sns timeline` · `weflow-cli sns users` · `weflow-cli sns stats` |
|
|
336
|
+
| 联系人头像 | `weflow-cli avatar <联系人>` · `avatar --list` · `avatar --all`(读 head_image.db,头像本体在库里,缓存清理不丢) |
|
|
322
337
|
| 微信收藏 | `weflow-cli fav list` · `weflow-cli fav export markdown` · `weflow-cli fav set-key` |
|
|
323
338
|
| 微信读书 | `weflow-cli weread shelf` · `notes` · `search` · `stats`(key 从 https://weread.qq.com/r/weread-skills 拿,见 [OPERATIONS.md](./OPERATIONS.md)) |
|
|
324
339
|
| 知识库 | `weflow-cli vault` · `weflow-cli wiki` · `weflow-cli search <query>` · `weflow-cli chat`(语义检索需先 `config set dashscopeApiKey`;`search --phrase <词> --line all` 连语音转写一起搜)|
|